From c6fb0e57cae8d20ed35d1f367f790d05f0daa3e2 Mon Sep 17 00:00:00 2001 From: woai3c <411020382@qq.com> Date: Fri, 28 Aug 2026 22:15:55 +0800 Subject: [PATCH 1/8] feat: add secure Windows peer messaging --- .github/workflows/pr-check.yml | 10 +- .github/workflows/release.yml | 31 +- .prettierignore | 1 + CHANGELOG.md | 1 + README.md | 2 +- README.zh-CN.md | 2 +- WINDOWS_PEER_MESSAGING_IMPLEMENTATION_PLAN.md | 1196 ++++++++++++++++ docs/peer-messaging.en.md | 10 +- docs/peer-messaging.md | 10 +- .../cli/tests/package/install-smoke.test.ts | 24 +- .../cli/tests/pty/tui-peer-messaging.test.ts | 24 +- .../prebuilt/windows/arm64/xc-peer-broker.exe | Bin 0 -> 279552 bytes .../native/prebuilt/windows/manifest.json | 31 +- .../prebuilt/windows/x64/xc-peer-broker.exe | Bin 0 -> 300544 bytes .../native/windows-peer-broker/.gitignore | 1 + .../native/windows-peer-broker/Cargo.lock | 109 ++ .../native/windows-peer-broker/Cargo.toml | 25 + .../windows-peer-broker/src/lifecycle.rs | 723 ++++++++++ .../native/windows-peer-broker/src/main.rs | 235 ++++ .../native/windows-peer-broker/src/pipe.rs | 1207 +++++++++++++++++ .../windows-peer-broker/src/process_peer.rs | 134 ++ .../windows-peer-broker/src/protocol.rs | 537 ++++++++ .../windows-peer-broker/src/runtime_acl.rs | 277 ++++ .../windows-peer-broker/src/security.rs | 686 ++++++++++ packages/core/scripts/build-native.mjs | 59 +- packages/core/scripts/copy-native.mjs | 23 +- packages/core/scripts/native-artifacts.mjs | 116 +- packages/core/src/peers/index.ts | 15 +- packages/core/src/peers/platform-transport.ts | 38 + packages/core/src/peers/registry.ts | 138 +- packages/core/src/peers/service.ts | 119 +- packages/core/src/peers/transport.ts | 6 + packages/core/src/peers/types.ts | 4 +- .../core/src/peers/unix-socket-transport.ts | 53 +- .../src/peers/windows-named-pipe-transport.ts | 598 ++++++++ .../src/peers/windows-peer-broker-artifact.ts | 133 ++ .../src/peers/windows-peer-broker-protocol.ts | 259 ++++ .../peers/windows-peer-runtime-security.ts | 205 +++ .../shell-session/providers/windows-job.ts | 47 +- .../__snapshots__/api-exports.test.ts.snap | 2 + packages/core/tests/peer-registry.test.ts | 79 +- .../core/tests/peer-service-sanitize.test.ts | 9 +- packages/core/tests/peer-service.test.ts | 68 +- .../tests/windows-native-artifacts.test.ts | 93 ++ .../windows-peer-broker-protocol.test.ts | 117 ++ .../core/tests/windows-peer-transport.test.ts | 317 +++++ scripts/check-package-size.mjs | 20 +- 47 files changed, 7558 insertions(+), 236 deletions(-) create mode 100644 WINDOWS_PEER_MESSAGING_IMPLEMENTATION_PLAN.md create mode 100644 packages/core/native/prebuilt/windows/arm64/xc-peer-broker.exe create mode 100644 packages/core/native/prebuilt/windows/x64/xc-peer-broker.exe create mode 100644 packages/core/native/windows-peer-broker/.gitignore create mode 100644 packages/core/native/windows-peer-broker/Cargo.lock create mode 100644 packages/core/native/windows-peer-broker/Cargo.toml create mode 100644 packages/core/native/windows-peer-broker/src/lifecycle.rs create mode 100644 packages/core/native/windows-peer-broker/src/main.rs create mode 100644 packages/core/native/windows-peer-broker/src/pipe.rs create mode 100644 packages/core/native/windows-peer-broker/src/process_peer.rs create mode 100644 packages/core/native/windows-peer-broker/src/protocol.rs create mode 100644 packages/core/native/windows-peer-broker/src/runtime_acl.rs create mode 100644 packages/core/native/windows-peer-broker/src/security.rs create mode 100644 packages/core/src/peers/platform-transport.ts create mode 100644 packages/core/src/peers/windows-named-pipe-transport.ts create mode 100644 packages/core/src/peers/windows-peer-broker-artifact.ts create mode 100644 packages/core/src/peers/windows-peer-broker-protocol.ts create mode 100644 packages/core/src/peers/windows-peer-runtime-security.ts create mode 100644 packages/core/tests/windows-native-artifacts.test.ts create mode 100644 packages/core/tests/windows-peer-broker-protocol.test.ts create mode 100644 packages/core/tests/windows-peer-transport.test.ts diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml index b2b62a2..78c4d1e 100644 --- a/.github/workflows/pr-check.yml +++ b/.github/workflows/pr-check.yml @@ -95,7 +95,7 @@ jobs: - uses: dtolnay/rust-toolchain@stable with: - components: rustfmt + components: rustfmt, clippy - run: pnpm install --frozen-lockfile @@ -103,12 +103,16 @@ jobs: run: | cargo fmt --manifest-path packages/core/native/windows-job-supervisor/Cargo.toml --check cargo test --locked --manifest-path packages/core/native/windows-job-supervisor/Cargo.toml + cargo fmt --manifest-path packages/core/native/windows-peer-broker/Cargo.toml --check + cargo test --locked --manifest-path packages/core/native/windows-peer-broker/Cargo.toml + cargo clippy --locked --all-targets --manifest-path packages/core/native/windows-peer-broker/Cargo.toml -- -D warnings - - name: Exercise a freshly built x64 helper + - name: Exercise freshly built x64 helpers run: | pnpm build pnpm build:native - pnpm exec vitest run packages/core/tests/windows-job-provider.test.ts packages/core/tests/windows-supervisor-protocol.test.ts packages/core/tests/pty-provider.test.ts + & packages/core/dist/native/windows/x64/xc-peer-broker.exe self-test --protocol 1 + pnpm exec vitest run packages/core/tests/windows-job-provider.test.ts packages/core/tests/windows-supervisor-protocol.test.ts packages/core/tests/pty-provider.test.ts packages/core/tests/windows-peer-broker-protocol.test.ts packages/core/tests/windows-peer-transport.test.ts packages/core/tests/windows-native-artifacts.test.ts package: name: Package Check diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 787fcfc..a32ddbd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -37,16 +37,18 @@ jobs: with: tool: cargo-xwin - - name: Build strict Windows Job Object supervisor - run: >- - cargo xwin build --release --locked - --target ${{ matrix.target }} - --manifest-path packages/core/native/windows-job-supervisor/Cargo.toml + - name: Build Windows native helpers + run: | + cargo xwin build --release --locked --target ${{ matrix.target }} --manifest-path packages/core/native/windows-job-supervisor/Cargo.toml + cargo xwin build --release --locked --target ${{ matrix.target }} --manifest-path packages/core/native/windows-peer-broker/Cargo.toml + mkdir -p native-output/${{ matrix.arch }} + cp packages/core/native/windows-job-supervisor/target/${{ matrix.target }}/release/xc-shell-supervisor.exe native-output/${{ matrix.arch }}/ + cp packages/core/native/windows-peer-broker/target/${{ matrix.target }}/release/xc-peer-broker.exe native-output/${{ matrix.arch }}/ - uses: actions/upload-artifact@v7 with: - name: windows-shell-supervisor-${{ matrix.arch }} - path: packages/core/native/windows-job-supervisor/target/${{ matrix.target }}/release/xc-shell-supervisor.exe + name: windows-native-${{ matrix.arch }} + path: native-output/${{ matrix.arch }}/*.exe if-no-files-found: error verify-windows-runtime: @@ -67,12 +69,12 @@ jobs: - uses: actions/download-artifact@v8 with: - name: windows-shell-supervisor-x64 + name: windows-native-x64 path: packages/core/native/prebuilt/windows/x64 - uses: actions/download-artifact@v8 with: - name: windows-shell-supervisor-arm64 + name: windows-native-arm64 path: packages/core/native/prebuilt/windows/arm64 - name: Generate native artifact hash manifest @@ -80,10 +82,11 @@ jobs: - run: pnpm install --frozen-lockfile - - name: Exercise release x64 Job and ConPTY helpers + - name: Exercise release x64 native helpers run: | + & packages/core/native/prebuilt/windows/x64/xc-peer-broker.exe self-test --protocol 1 pnpm build - pnpm exec vitest run packages/core/tests/windows-job-provider.test.ts packages/core/tests/windows-supervisor-protocol.test.ts packages/core/tests/pty-provider.test.ts + pnpm exec vitest run packages/core/tests/windows-job-provider.test.ts packages/core/tests/windows-supervisor-protocol.test.ts packages/core/tests/pty-provider.test.ts packages/core/tests/windows-peer-broker-protocol.test.ts packages/core/tests/windows-peer-transport.test.ts packages/core/tests/windows-native-artifacts.test.ts - name: Check packaged Windows runtime run: pnpm check:package @@ -109,12 +112,12 @@ jobs: - uses: actions/download-artifact@v8 with: - name: windows-shell-supervisor-x64 + name: windows-native-x64 path: packages/core/native/prebuilt/windows/x64 - uses: actions/download-artifact@v8 with: - name: windows-shell-supervisor-arm64 + name: windows-native-arm64 path: packages/core/native/prebuilt/windows/arm64 - name: Generate native artifact hash manifest @@ -153,6 +156,8 @@ jobs: grep -q 'package/dist/native/windows/manifest.json' <<< "$listing" grep -q 'package/dist/native/windows/x64/xc-shell-supervisor.exe' <<< "$listing" grep -q 'package/dist/native/windows/arm64/xc-shell-supervisor.exe' <<< "$listing" + grep -q 'package/dist/native/windows/x64/xc-peer-broker.exe' <<< "$listing" + grep -q 'package/dist/native/windows/arm64/xc-peer-broker.exe' <<< "$listing" done smoke_dir="$(mktemp -d)" trap 'rm -rf "$smoke_dir"' EXIT diff --git a/.prettierignore b/.prettierignore index 00f1e2e..0f6c262 100644 --- a/.prettierignore +++ b/.prettierignore @@ -5,3 +5,4 @@ dist coverage pnpm-lock.yaml packages/core/native/windows-job-supervisor/target +packages/core/native/windows-peer-broker/target diff --git a/CHANGELOG.md b/CHANGELOG.md index d3ce534..39b9b9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,6 +56,7 @@ ### Features +- support secure same-account peer messaging on Windows x64 and arm64 through a bundled Named Pipe broker - support ChatGPT subscription sign-in for OpenAI models with browser/device OAuth, automatic token refresh, and strict API-key mutual exclusion - unify foreground and background shell execution into managed sessions with automatic 10-second yielding, `/ps`, and `/stop` - use a bundled, hash-verified Windows Job Object supervisor for reliable process-tree cleanup on Windows x64 and arm64; normal Node.js builds do not require Rust diff --git a/README.md b/README.md index ec725eb..a68d041 100644 --- a/README.md +++ b/README.md @@ -170,7 +170,7 @@ xc -m sonnet "Refactor the formatDate function" # Specify a model - **Plan mode** — `--plan` or `/plan` enters read-only exploration; the agent designs a plan, then executes after approval - **Durable goal loops** — `/goal` runs execute → verify → repair cycles until passing or hitting a stop condition - **Model-directed Git worktrees** — when repository state and verification risk warrant it, the agent can use ordinary Git commands to create and clean up a temporary worktree instead of risking the active checkout -- **Cross-session messaging** — named local sessions can discover one another and exchange peer-authorized work (macOS / Linux; see [docs](./docs/peer-messaging.en.md)) +- **Cross-session messaging** — named local sessions can discover one another and exchange peer-authorized work (macOS / Linux / Windows x64 and arm64; see [docs](./docs/peer-messaging.en.md)) - **File attachments** — `@path` or bare absolute paths auto-ingest text / code / PDF / Office docs (docx / xlsx / pptx / odt / ods / odp) / images / audio - **Local PDF processing** — selectable text is extracted page by page; scanned or visual pages become images for the active vision model or local OCR for a text model. Large visual PDFs are loaded progressively with `readFile` page ranges. Original PDF bytes are never uploaded - **Local audio transcription** — MP3 / WAV / FLAC / OGG Vorbis attachments (up to 25 MiB and 20 minutes) are always transcribed locally via Whisper (whisper.cpp) in an isolated process; only timestamped text reaches the model. Before any model download, the native runtime is probed and a streaming decoder enforces the limit against actual decoded PCM frames. Queue wait and transcription share a hard timeout. First-use model downloads are revision-pinned and SHA-256 verified before being cached under `~/.x-code/whisper-models/` (default `tiny`; set `X_CODE_WHISPER_MODEL` to pick another, e.g. `base`) diff --git a/README.zh-CN.md b/README.zh-CN.md index 14b6b66..2c2a521 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -170,7 +170,7 @@ xc -m sonnet "重构 formatDate 函数" # 指定模型 - **Plan 模式** — `--plan` 或 `/plan` 进入只读探索,Agent 先制定方案、批准后再执行 - **持续目标循环** — `/goal` 自动执行→验证→修复,直到验证通过或触发停止条件 - **模型自主 Git worktree** — 当仓库状态和验证风险确有需要时,Agent 可自主使用普通 Git 命令创建并清理临时 worktree,避免冒险改动当前工作区 -- **跨会话消息** — 命名后的本机 Session 可以互相发现,并在权限边界内移交工作(macOS / Linux;详见[文档](./docs/peer-messaging.md)) +- **跨会话消息** — 命名后的本机 Session 可以互相发现,并在权限边界内移交工作(macOS / Linux / Windows x64 与 arm64;详见[文档](./docs/peer-messaging.md)) - **文件附件** — `@path` 或裸绝对路径引用文件,自动识别 text / code / PDF / Office 文档(docx / xlsx / pptx / odt / ods / odp)/ 图片 / 音频 - **本地 PDF 处理** — 按页提取可选文本;扫描页或视觉页交给当前视觉模型,纯文本模型则使用本地 OCR。大型视觉 PDF 通过 `readFile` 页范围渐进读取,原始 PDF 字节不会上传 - **本地音频转写** — MP3 / WAV / FLAC / OGG Vorbis 附件(最大 25 MiB、20 分钟)始终由隔离进程中的 Whisper(whisper.cpp)在本地转写,只有带时间戳的文字会交给模型。模型下载前会探测 native runtime,并由隔离进程中的流式解码器按实际 PCM 帧执行硬上限;排队等待与转写共用总超时。首次模型下载固定 revision 并通过 SHA-256 校验后才缓存于 `~/.x-code/whisper-models/`(默认 `tiny`,可通过 `X_CODE_WHISPER_MODEL` 换成其他型号,如 `base`) diff --git a/WINDOWS_PEER_MESSAGING_IMPLEMENTATION_PLAN.md b/WINDOWS_PEER_MESSAGING_IMPLEMENTATION_PLAN.md new file mode 100644 index 0000000..2e53951 --- /dev/null +++ b/WINDOWS_PEER_MESSAGING_IMPLEMENTATION_PLAN.md @@ -0,0 +1,1196 @@ +# Windows 跨会话消息实施方案 + +> 状态:已实现;待发布前 Windows arm64 实机与双机远程拒绝验收 +> +> 目标:在 Windows x64 / arm64 上为命名的交互式根 Session 提供与 macOS/Linux 一致的本机 Peer Messaging 能力,同时保持当前权限、provenance、taint、队列和投递语义,并以 Windows 原生安全机制实现同账户隔离和远程连接拒绝。 +> +> 核心决策:使用随 npm 包分发的预编译 Rust helper `xc-peer-broker.exe` 实现 Windows Named Pipe、SID/DACL 校验和本机连接约束;普通安装、TypeScript 开发、构建和测试不得要求本机安装 Rust。 + +## 1. 摘要 + +当前 Peer Messaging 已在 macOS/Linux 上通过 Unix Domain Socket 工作,但 Windows 会在 `PeerService.start()` 中以 `PEER_UNSUPPORTED_PLATFORM` 明确关闭。Windows 支持不能通过简单移除平台判断完成,因为现有实现依赖 POSIX UID、`0700`/`0600`、socket 文件、inode 和 `unlink` 语义,而 Node.js 的 Windows Named Pipe API不允许应用设置严格的 DACL、`PIPE_REJECT_REMOTE_CLIENTS` 或验证对端 Windows SID。 + +本方案采用以下结构: + +```text +Named xc Session A +┌──────────────────────────────────────┐ +│ Node.js │ +│ PeerService │ +│ └─ WindowsNamedPipeTransport │ +└──────────────────┬───────────────────┘ + │ bounded binary protocol over inherited stdio +┌──────────────────▼───────────────────┐ +│ xc-peer-broker.exe A │ +│ - secure runtime directory check │ +│ - Named Pipe server/client │ +│ - current-account SID verification │ +│ - protected DACL │ +│ - remote-client rejection │ +└──────────────────┬───────────────────┘ + │ Windows Named Pipe +┌──────────────────▼───────────────────┐ +│ xc-peer-broker.exe B │ +└──────────────────┬───────────────────┘ + │ inherited stdio +┌──────────────────▼───────────────────┐ +│ Node.js PeerService B │ +└──────────────────────────────────────┘ +``` + +每个命名的交互式根 Session 启动一个 broker。未命名 Session、print mode 和 sub-agent 不启动 broker。Windows broker 同时处理入站和出站连接,使两端都由原生代码验证对端 SID,并避免 Node 默认 Named Pipe 安全描述符成为安全边界。 + +业务层保持不变: + +- `/list-agents`、`listAgents`、`sendMessage` 的用户语义不变。 +- 消息只传纯文本和现有摘要/投递元数据。 +- Peer 消息不等于用户授权,不能批准权限或执行 slash command。 +- peer-influenced taint、authority evaluator、hook 隔离、held/accepted 队列、去重、限流、重试和 delivery update 语义不变。 +- 不监听 TCP/UDP 端口,不接入远程 relay。 + +## 2. 已确认的设计决策 + +以下决策在实施前视为已定,不在编码阶段重新发散: + +| 主题 | 决策 | +| ---------------------- | ---------------------------------------------------------------------------------------------------------------------- | +| Windows IPC | Windows Named Pipe | +| 原生实现 | 独立 Rust broker executable,不使用 N-API addon | +| 进程模型 | 每个命名根 Session 一个 broker | +| OS 身份边界 | 同一 Windows Account SID,且处于兼容的 Windows integrity level | +| 多登录 Session | 同一账户、兼容 integrity level 时允许互通 | +| 提权/AppContainer | 首版不保证 elevated ↔ non-elevated 或 AppContainer ↔ desktop Session 互通,不降低 mandatory integrity label 规避限制 | +| 远程访问 | 使用 `PIPE_REJECT_REMOTE_CLIENTS` 明确拒绝 | +| 应用认证 | 保留每 Session 随机 `inboxToken`,作为 SID 验证后的第二层认证 | +| 本机管理员 | Administrator/System 不属于可防御攻击者,与现有同 UID 威胁模型一致 | +| 不安全目录/远程 volume | fail closed;Windows Peer registry 只允许支持 persistent ACL 的本机 volume,仅禁用 Peer Messaging,不影响 CLI 其他功能 | +| 纯 Node fallback | 不提供;helper 缺失、损坏或不兼容时明确不可用 | +| Windows 架构 | x64、arm64;不支持 ia32 | +| 普通开发 | 使用 checked-in 预编译 helper,不要求 Rust | +| 原生开发/发布 | Rust stable;Release CI 构建并验证 x64/arm64 | +| 网络协议 | 保持 `PeerFrameV1` 业务语义;Windows transport 使用独立的有界 broker/pipe framing | +| Registry 版本 | 首选保留 `version: 1`,将 transport 扩展为判别联合;旧版本安全地拒绝未知 kind | + +如果实施中必须改变上述任一决定,应先更新本方案并单独评审,而不是在代码中隐式改变边界。 + +## 3. 功能目标 + +### 3.1 用户功能 + +在受支持的 Windows 环境中,以下命令应正常工作: + +```powershell +xc --name frontend +xc --name backend +``` + +任一 Session 中执行: + +```text +/list-agents +``` + +应列出可达的其他命名 Session,不再显示 `Peer messaging is not supported on Windows in this release.`。 + +模型工具保持现有 schema: + +```text +listAgents() +sendMessage({ to, message, summary? }) +``` + +要求: + +1. 两个同账户 Windows Session 可以相互发现。 +2. 可以按唯一名称或完整 `peer:` 地址发送消息。 +3. 同名歧义、自发消息、空目标、广播和超限消息继续拒绝。 +4. 空闲接收方可自动启动新 turn。 +5. 忙碌接收方在安全工具边界注入消息。 +6. goal/maintenance lease 期间继续延迟处理。 +7. `auto`、`accept`、`hold`、`refuse` inbound policy 与现有平台一致。 +8. sender 能收到 `delivered`、`held`、`refused`、`duplicate` 和最终 delivery update。 +9. 正常退出和崩溃后不遗留 Named Pipe 内核对象。 +10. 失效 registration 能在现有 grace period 和 PID 复核规则下被安全回收。 + +### 3.2 平台行为 + +| 平台 | Transport | 行为 | +| ------------- | ------------------------ | --------------------------- | +| macOS | Unix Domain Socket | 保持现状 | +| Linux | Unix Domain Socket | 保持现状 | +| Windows x64 | Secure Named Pipe broker | 新增支持 | +| Windows arm64 | Secure Named Pipe broker | 新增支持 | +| Windows ia32 | 无 | fail closed,显示不支持架构 | +| 其他平台 | 无 | 保持显式 unsupported | + +### 3.3 开发体验 + +以下命令不得要求 Rust: + +```powershell +pnpm install +pnpm build +pnpm dev +pnpm typecheck +pnpm test +pnpm run ci +``` + +仅以下场景需要 Rust: + +- 修改 `packages/core/native/windows-peer-broker/`。 +- 执行 Windows broker 的 Rust unit/integration test。 +- 重新生成预编译 helper。 +- Release CI 构建 x64/arm64 原生产物。 + +## 4. 非目标与明确边界 + +首版 Windows 支持不包含: + +- 跨机器消息、SMB Named Pipe 远程访问、TCP listener 或云 relay。 +- Agent Teams、共享 task list、共享文件或共享完整对话历史。 +- sub-agent 注册为独立 peer。 +- `xc -p` / print mode inbox。 +- 广播消息。 +- 跨 Windows 账户通信。 +- elevated 与 non-elevated、AppContainer 与普通 desktop Session 之间的保证互通;首版要求兼容的 integrity level。 +- Windows/macOS/Linux 跨操作系统通信。 +- 对 Administrator、System、拥有调试/接管权限的进程进行隔离。 +- 消息持久化;broker 或 receiver 崩溃后不承诺恢复进程内未完成消息。 +- 将 Named Pipe 地址、SID、token 或动态 peer 列表写入模型 system prompt。 +- 将不安全 `X_CODE_HOME` 静默迁移到其他目录。 +- helper 缺失时退化为默认 Node Named Pipe 或 loopback TCP。 + +## 5. 安全模型 + +### 5.1 需要防御的对象 + +必须防御: + +- 同机其他普通 Windows 账户读取或伪造 registration/token。 +- 同机其他普通账户连接 receiver pipe。 +- 远程 SMB 客户端连接 Named Pipe。 +- 伪造 registration 将 sender 引向其他账户创建的 Pipe。 +- Pipe name squatting 和地址替换。 +- 恶意或损坏 frame 导致无界内存、阻塞、崩溃或 request 混淆。 +- broker/Node 一端退出后另一端成为孤儿进程。 +- peer 输入尝试继承本地用户授权、绕过 authority 或触发 plugin hook。 + +### 5.2 不承诺防御的对象 + +不承诺防御: + +- 本地 Administrator/System。 +- 与当前进程使用相同 Windows Account SID、且能读取当前账户文件或调试当前进程的恶意程序。 +- 用户主动把敏感信息发送给另一个可信 Session。 +- 用户显式以 `--trust` 启动 receiver 后授予的本地工具能力。 + +即使两个 peer 属于同一 Windows 账户,模型输入仍视为互不可信的数据域。现有 peer-influenced taint 和 authority evaluator 不能因 OS 身份验证而弱化。 + +首版“兼容 integrity level”定义为:两端 `TokenUser` 完全相同、`TokenIntegrityLevel` RID 完全相同,且 `TokenIsAppContainer` 均为 false。不要为了让 high/medium 或 AppContainer/desktop 互通而降低 Pipe mandatory integrity label;不满足时双方按不可达处理。 + +### 5.3 分层认证 + +连接必须依次通过: + +```text +1. Pipe DACL +2. PIPE_REJECT_REMOTE_CLIENTS +3. client/server Account SID 与 integrity level 双向验证 +4. target inboxToken 常量时间验证 +5. transport frame schema/size/version 验证 +6. PeerFrameV1 严格解析 +7. 现有 inbound policy 和 authority evaluator +``` + +任一层失败都必须关闭连接,不向未认证连接发送业务数据。 + +### 5.4 Windows Pipe 创建要求 + +broker 使用 `CreateNamedPipeW`,至少包含: + +```text +PIPE_ACCESS_DUPLEX +FILE_FLAG_OVERLAPPED +FILE_FLAG_FIRST_PIPE_INSTANCE(仅第一个 server instance) +PIPE_TYPE_BYTE +PIPE_READMODE_BYTE +PIPE_WAIT +PIPE_REJECT_REMOTE_CLIENTS(每个 server instance) +``` + +Pipe 名称由 broker 生成,不由模型、用户输入或 Session 名称拼接: + +```text +\\.\pipe\x-code-peer-v1--<192-bit-random> +``` + +要求: + +- 使用 Win32 `CreateNamedPipeW` 文档规定的本机形式 `\\.\pipe\`。 +- Pipe namespace 是平面的;名称只允许固定前缀、十六进制 namespace ID 和 base64url 随机段,不接受用户提供的反斜杠、点段或其他分隔符。 +- 随机部分至少 192 bit,使用系统 CSPRNG。 +- `namespace-id` 只用于隔离不同 `X_CODE_HOME`,不作为认证因子。 +- `secure-runtime` 通过目录 handle 调用 `GetFinalPathNameByHandleW(FILE_NAME_NORMALIZED | VOLUME_NAME_GUID)` 获取稳定目录标识,以规范化 UTF-16LE bytes 的 SHA-256 前 12 个小写十六进制字符作为 `namespace-id`,并将该 ID 返回给 Node;TypeScript 不独立重复 Windows 路径 canonicalization。 +- Registry 初始化后在实例内部保存该 `namespace-id`,parser 只接受完全匹配的 ID;broker 启动时接收同一 ID 并按固定格式生成地址。 +- 注册表 parser 对总长度、固定前缀、namespace ID 和随机部分做精确验证。 +- 不在 debug log 输出 inbox token、SID 原始值、canonical runtime path 或完整敏感 broker payload。 + +`FILE_FLAG_FIRST_PIPE_INSTANCE` 只用于同一地址的第一个 server instance。后续用于并发 accept 的 instance 不得重复该 flag,但每个 instance 都必须使用同一个 protected DACL 和 `PIPE_REJECT_REMOTE_CLIENTS`。 + +### 5.5 Pipe DACL + +创建 Pipe 时原子传入 protected security descriptor,不允许先用默认 DACL 创建后再修补。 + +DACL 必须采用显式 allowlist: + +- 当前 Windows Account SID:连接所需读写权限。 +- 可选 LocalSystem:只有实现和测试确实需要时才能加入。 +- 不允许 Everyone、Anonymous、Authenticated Users、BUILTIN\\Users、INTERACTIVE 或其他普通用户/宽泛组出现允许 ACE。 +- 禁止从父对象继承不受控 ACE。 +- 不得把普通 Administrators 组作为功能依赖。 +- 自动化测试必须枚举 DACL 中全部 ACE,并验证每个允许 ACE 都属于批准 allowlist;不能只检查 Everyone/Anonymous 缺失。 + +Server 收到首段有界数据后必须: + +1. `ImpersonateNamedPipeClient`。 +2. `OpenThreadToken(TOKEN_QUERY)`。 +3. 读取 `TokenUser` 和 `TokenIntegrityLevel`。 +4. 与 broker 启动时记录的 Account SID 和兼容 integrity policy 比较。 +5. 无论成功失败都执行 `RevertToSelf`。 +6. 失败时不继续以 server 身份处理请求。 + +Client 连接后必须: + +1. `GetNamedPipeServerProcessId`。 +2. 以最小权限打开 server process。 +3. 查询 server process token 的 `TokenUser` 和 `TokenIntegrityLevel`。 +4. 与当前 Account SID 和兼容 integrity policy 比较。 +5. 无法证明时 fail closed。 + +### 5.6 Runtime/Registry ACL + +Windows 上不能把 Node 的 `mode: 0o700` / `0o600` 当作安全控制。原生 helper 必须创建或验证: + +```text +\runtime +\runtime\peers +``` + +要求: + +- 所在 volume 支持 persistent ACL;不支持时禁用 Peer Messaging。 +- 通过 `GetVolumePathNameW` / `GetDriveTypeW` 和 UNC 检查确认路径位于本机 volume;拒绝 UNC、mapped network drive 和 `DRIVE_REMOTE`。这是必须条件,因为 registry 使用本机 PID 判活,不能在多台机器之间共享。 +- 拒绝不安全的 reparse point/junction/symlink 路径。 +- 验证 `userXcodeDir()` 根和相关父目录不会允许其他普通账户替换或删除受保护 runtime。 +- `runtime` 和 `peers` 使用 protected DACL,仅当前 Account SID 可读写枚举。 +- registration 临时文件和最终文件继承受保护 DACL。 +- 原子写入继续使用同目录 `wx` 临时文件、flush 和 rename。 +- Windows 无法目录 fsync 的现有处理保持不变。 +- 无法证明目录安全时返回稳定错误码,不尝试“尽量运行”。 + +由同一个 `xc-peer-broker.exe` 提供一次性 `secure-runtime` 子命令,避免引入第二个原生可执行文件。该子命令必须先完成并退出,之后才能启动长生命周期 `broker` 模式: + +```text +xc-peer-broker.exe secure-runtime --protocol +xc-peer-broker.exe broker --protocol +``` + +runtime path 通过有界 stdin frame 传入,避免命令行泄漏和 quoting 差异。 + +## 6. 总体架构改造 + +### 6.1 平台 Transport 工厂 + +新增: + +```text +packages/core/src/peers/platform-transport.ts +``` + +职责: + +```ts +createPlatformPeerTransport(): PeerTransport +``` + +平台选择: + +```text +win32 → createWindowsNamedPipeTransport() +darwin/linux → createUnixSocketTransport() +其他平台 → explicit unsupported +``` + +不得让 `PeerService` 直接 import `createUnixSocketTransport()`。 + +### 6.2 Transport 描述符 + +将 registration transport 改为判别联合: + +```ts +export type PeerTransportDescriptor = { kind: 'unix'; address: string } | { kind: 'windows-pipe'; address: string } +``` + +`PeerTransport` 增加: + +```ts +export interface PeerTransport { + readonly kind: PeerTransportDescriptor['kind'] + createAddressHint(instanceId: string): string + validateAddress(address: string): boolean + listen(...): Promise + request(...): Promise + cleanupConfirmedDeadEndpoint?(address: string): Promise +} + +export interface PeerTransportServer { + address: string + closed: Promise<{ expected: boolean; reason?: string }> + close(options?: { deadlineMs?: number }): Promise +} +``` + +`closed` 允许 Service 发现 broker 意外退出,立即停止 heartbeat、移除自己的 registration 并设置 unavailable reason。 + +### 6.3 移除 Service 中的 Unix 文件操作 + +以下职责从 `PeerService.start()` 移出: + +- deterministic `.sock` hint 的 `lstat`。 +- `isSocket()` / symlink 检查。 +- stale socket owner scan。 +- socket path unlink。 + +Unix transport 或 Unix endpoint lifecycle 继续保留现有 inode/sentinel/ownership 防护。Windows transport 不执行文件 socket 清理。 + +Service 只处理: + +```text +initialize secure registry +→ transport.listen +→ write registration +→ watch server.closed +→ heartbeat/status updates +``` + +### 6.4 Registry 的平台职责 + +Windows runtime 安全必须是 Registry 自身的不变量,而不是依赖 `PeerService` 的隐藏调用顺序: + +- `createPeerRegistry()` 接受可注入的 platform runtime security dependency;生产默认在 Windows 调用已验证的 `secure-runtime` helper。 +- `registry.initialize()` 只有在 runtime ACL、本机 volume、reparse 检查和 `namespace-id` 获取全部成功后才完成。 +- direct registry callers 和测试不能绕过该步骤写入 Windows registration。 +- 测试可注入明确标记的 fake security provider;生产代码不接受调用方伪造“已安全”布尔值。 + +`parseRegistration()` 必须: + +- 精确接受 `unix` 和 `windows-pipe` 两种 descriptor。 +- 对每种 kind 调用对应纯函数 validator。 +- 当前平台扫描到不支持的 kind 时安全拒绝或忽略,不把任意地址传给当前 transport。 +- 保持 candidate 数量、文件大小、exact keys、UUID、日期和字符串限制。 + +`cleanupConfirmedDead()` 必须: + +```text +通用部分: + PID 两次确认死亡 + grace period + registration mtime/pid/updatedAt 再确认 + 删除 registration + +Unix: + 保留 inode、shared address、replacement 防误删逻辑 + +Windows Pipe: + 不删除 endpoint;内核已随进程回收 +``` + +### 6.5 Protocol 版本关系 + +需要区分三个版本: + +| 版本 | 作用 | +| ----------------------- | ----------------------------------------- | +| `PeerFrameV1.v` | agent 业务消息 schema | +| registration `version` | 磁盘发现记录 schema | +| broker protocol version | Node↔broker 与 broker↔broker 原生 framing | + +新增 Windows transport 不应无理由修改 `PeerFrameV1.v`。broker protocol 独立从 `1` 开始,manifest 记录可执行文件协议版本。 + +## 7. Rust Broker 设计 + +### 7.1 新增目录 + +```text +packages/core/native/windows-peer-broker/ + Cargo.toml + Cargo.lock + src/ + main.rs + protocol.rs + pipe.rs + security.rs + runtime_acl.rs + process_peer.rs +``` + +允许实际实现按规模合并文件,但模块边界必须覆盖:协议、Pipe、SID/DACL、runtime ACL 和生命周期。 + +建议依赖保持最小: + +```toml +windows-sys = { version = "0.61", features = [ ... ] } +``` + +所有依赖锁定在 `Cargo.lock`。协议使用固定二进制布局,不引入 serde/JSON parser;`namespace-id` 的 SHA-256 优先使用 Windows CNG `BCrypt`,如引入纯 Rust hash crate 则必须锁定并单独说明供应链增量。 + +### 7.2 Broker 进程生命周期 + +- Node 使用 `spawn()` 启动 helper,`stdio` 仅包含受控 anonymous pipes。 +- `windowsHide: true`,不创建可见控制台。 +- 长生命周期 `broker` 模式必须监控父通道 EOF;Node 崩溃或退出后立即停止 listener、关闭连接并退出。 +- 一次性 `secure-runtime` 模式只接收一个有界请求,返回验证结果后退出;它不创建 listener,也不与长生命周期 broker 复用 stdin 会话。 +- Node 必须监控 child `error`/`exit`;意外退出后 PeerService fail closed。 +- 正常 shutdown:停止接收新请求,给已接受请求有限 drain deadline,然后强制关闭。 +- broker 不写普通日志到 stdout;stdout 只用于协议。 +- stderr 仅输出去敏错误,Node 在 `DEBUG_STDOUT=1` 时写入 debug log。 +- broker 不启动子进程,不访问模型、项目文件或网络。 + +### 7.3 Node↔Broker framing + +采用有界二进制 header: + +```text +magic 4 bytes "XCPB" +version u8 +kind u8 +flags u16 LE +operationId u32 LE +payloadLength u32 LE +payload payloadLength bytes +``` + +约束: + +- 最大 control payload 由同一常量定义为 `MAX_FRAME_BYTES + 8 KiB`,初始上限 139,264 bytes;Node 和 Rust 边界测试必须锁定同一数值。 +- `operationId = 0` 只用于 lifecycle event;请求使用非零 ID。 +- Node 和 broker 各自维护 active operation map,上限固定,建议 256。 +- ID 回绕时不得复用仍 active 的 ID。 +- 未知 version/kind/flags、未取消 operation 的重复完成、从未分配的 ID 和超限长度视为 protocol violation。 +- parser 必须支持 chunk 拆分和多 frame 合并,不假设一次 read 对应一个 frame。 +- 所有 pending outbound operation 都有 deadline 和取消路径。 +- `CANCEL_OPERATION` 必须有 `CANCEL_ACK`,结果至少区分 `canceled` 和 `too-late`。调用方收到 abort 后可以立即结束本地等待,但 operation ID 必须保留为有界、短期 tombstone:`canceled` ack 可结束 tombstone;`too-late` ack 不能结束 tombstone,必须继续保留到 terminal response 或 TTL。协议还必须固定 terminal-response/ack 顺序,合法的 late response 被丢弃而不是误判为未知 ID。 +- receiver broker 已经把完整业务 frame 交给 Node 后,sender 断开或取消不撤销入站投递。receiver 允许 `onRequest` 在既有 deadline 内完成,并丢弃无法返回给 sender 的 response;首版不向当前不接受 `AbortSignal` 的 inbound callback 伪造取消。 +- tombstone map 有固定容量和 TTL;容量耗尽时拒绝新 operation,不能无界增长。 + +建议 frame kind: + +```text +Node → broker + START_SERVER + OUTBOUND_REQUEST + INBOUND_RESPONSE + CANCEL_OPERATION + SHUTDOWN + +broker → Node + SERVER_READY + INBOUND_REQUEST + OUTBOUND_RESPONSE + CANCEL_ACK + OPERATION_ERROR + SERVER_FATAL + SHUTDOWN_COMPLETE +``` + +控制 payload 使用按 frame kind 固定的二进制字段布局:固定宽度整数、长度前缀 UTF-8 字段,以及末尾原始 `PeerFrameV1` bytes。不得把 frame base64 后塞入 JSON,也不得让 JSON escaping 改变上限。每个变长字段必须在切片/分配前检查长度;未知字段在协议升级时通过 version/kind 处理。 + +`PeerFrameV1` 使用现有 encoder 产生的原始、受限 UTF-8 bytes 传递,最终仍由 TypeScript `parsePeerFrame()` 验证;Rust 不重新定义业务 frame union。broker control payload 的上限按 `MAX_FRAME_BYTES + 8 KiB` 固定计算,即初始不超过 139,264 bytes;如果固定 envelope 实际需要更多空间,必须通过常量推导和边界测试调整,不能使用模糊的“约 160 KiB”。 + +### 7.4 Broker↔Broker Pipe 请求 + +每个 Pipe connection 只允许一个请求,并采用分阶段握手,业务 frame 不得出现在 auth envelope 中: + +```text +connect +→ client broker 验证 server Account SID/integrity level +→ client 只发送 bounded auth envelope +→ server 读取有界 auth envelope 后验证 client Account SID/integrity level +→ server 验证 inboxToken +→ server 返回 auth-ok +→ client 才发送 one PeerFrameV1 payload +→ server 转交 Node 并返回 one PeerFrameV1 response +→ close +``` + +transport-auth envelope 只包含: + +```text +transportVersion +senderInstanceId +receiver inboxToken +client nonce +``` + +auth-ok 必须绑定 client nonce 和 server nonce,避免把其他连接的确认误关联。业务 frame 的长度和 bytes 位于 auth-ok 之后的独立、受限 frame 中。 + +要求: + +- token 使用常量时间比较。 +- sender instance UUID 由 broker 做基本格式/长度验证,TypeScript 再做完整验证。 +- 不允许第二个请求或第二次 auth。 +- client broker 必须在发送 token 或业务 frame 前完成 server SID/integrity 验证。 +- 未认证前不返回详细失败原因;对端只收到通用 authentication/connection failure。 +- 本地 Node 可通过稳定内部错误码区分 timeout、abort、protocol mismatch、broker crash 和 target unavailable。 +- 对 `sendMessage` 而言,transport request 一旦进入现有 outbound ledger,任何未获得匹配 acknowledgement 的错误(包括 broker crash、timeout、SID 验证失败和取消)都继续由 `PeerService.sendPrepared()` 映射为公开的 `PEER_DELIVERY_UNKNOWN`,并要求使用同一 message ID 重试。内部 broker 错误只作为去敏 cause/debug 信息,不能破坏现有 delivery-unknown 保证。ping/list 等非消息请求可保留更具体的内部错误。 + +### 7.5 并发与背压 + +- server connection 并发上限与现有候选扫描/队列规模协调,建议初始 64。 +- 超出上限立即拒绝,不创建无界 task/thread。 +- 每个连接有 auth deadline、request deadline 和 idle deadline。 +- Node↔broker stdout 写入使用异步背压,不在 CLI UI 线程执行同步重 I/O。 +- broker 不为每个永远阻塞的连接创建不可回收线程;优先 overlapped I/O 或受限 worker 模型。 +- shutdown deadline 到期后取消/关闭所有 handle。 + +### 7.6 错误码 + +新增错误码至少覆盖: + +```text +PEER_WINDOWS_HELPER_MISSING +PEER_WINDOWS_HELPER_HASH_MISMATCH +PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH +PEER_WINDOWS_UNSUPPORTED_ARCH +PEER_WINDOWS_RUNTIME_UNSAFE +PEER_WINDOWS_PIPE_CREATE_FAILED +PEER_WINDOWS_PEER_IDENTITY_UNVERIFIED +PEER_WINDOWS_BROKER_EXITED +``` + +面向用户的 reason 必须去除 terminal control;debug log 可记录 Win32 error code,但不得记录 token 或完整敏感 payload。 + +## 8. TypeScript Windows Transport + +### 8.1 新增文件 + +```text +packages/core/src/peers/windows-named-pipe-transport.ts +packages/core/src/peers/windows-peer-broker-protocol.ts +packages/core/src/peers/windows-peer-broker-artifact.ts +packages/core/src/peers/windows-peer-runtime-security.ts +packages/core/src/peers/platform-transport.ts +``` + +职责: + +- artifact 路径、架构和 hash 验证。 +- broker spawn 和 lifecycle。 +- binary frame encode/decode。 +- operation ID、timeout、AbortSignal 和 pending map。 +- 将 `PeerTransport.listen()` 映射到 broker `START_SERVER`。 +- 将 `PeerTransport.request()` 映射到 broker `OUTBOUND_REQUEST`。 +- 将 broker `INBOUND_REQUEST` 交给现有 `onRequest()`,回写 `INBOUND_RESPONSE`。 +- 在 abort/shutdown 时向 broker 发送 cancel,等待/处理 cancel ack,并按协议保留有界 late-response tombstone 后再清理 operation ID。 + +所有 tool execution 路径必须继续传递调用方的 `AbortSignal`,避免产生孤立 request/tool result。 + +### 8.2 Artifact 查找与验证 + +沿用现有 Windows shell supervisor 模式: + +```text +packages/core/dist/native/windows//xc-peer-broker.exe +``` + +启动前验证: + +- 当前架构为 x64/arm64。 +- manifest protocol version。 +- 文件相对路径未逃逸 native directory。 +- PE machine 与架构一致。 +- SHA-256 与 manifest 一致。 + +验证失败不得尝试 PATH 中的同名可执行文件,也不得下载二进制。 + +### 8.3 启动顺序 + +Windows `PeerService.start()` 推荐顺序: + +```text +1. registry.initialize() + └─ 默认 Windows runtime security provider 验证 helper artifact + └─ 运行一次性 secure-runtime 子命令并等待退出 + └─ 验证 ACL、本机 volume、reparse safety,取得 namespace-id +2. 启动长生命周期 broker 模式 +3. broker START_SERVER(namespace-id) +4. broker 返回最终随机 pipe address +5. 写入 registration { kind: 'windows-pipe' } +6. 启动 heartbeat +7. 标记 service started +``` + +这样 direct registry callers 与 `PeerService` 走同一个安全不变量,不依赖 Service 先调用隐藏的加固步骤。 + +任一步失败: + +- 禁止后续 registration write。 +- 等待已排队 registration write 收敛。 +- 删除仅属于当前 instance 的 registration。 +- 关闭 broker。 +- 设置稳定 unavailable code/reason。 + +### 8.4 意外退出 + +broker 意外退出时: + +1. `PeerTransportServer.closed` resolve 为 unexpected。 +2. `PeerService` 递增 lifecycle generation,停止新请求。 +3. 停止 heartbeat,关闭 registration write generation,并等待现有 `registrationWriteTail` 收敛,防止已通过 generation check 的 rename 在清理后重新写回 registration。 +4. 在 write tail 收敛后删除当前 registration;对 Windows 短暂文件占用执行有界异步重试。若最终仍失败,registration 因 ping 失败对其他 peer 不可见,并在 owner shutdown 或 PID 死亡后的既有 grace cleanup 中继续回收。 +5. pending transport request 以 `PEER_WINDOWS_BROKER_EXITED` 作为内部 cause 结束;已进入 outbound ledger 的 `sendMessage` 必须继续公开返回 `PEER_DELIVERY_UNKNOWN`。 +6. `/list-agents` 和后续工具调用显示明确 unavailable reason。 +7. 首版不自动无限重启,避免 crash loop;是否允许一次有界重启另行评审。 + +## 9. Native 构建与分发 + +### 9.1 Artifact 布局 + +目标布局: + +```text +packages/core/native/prebuilt/windows/ + manifest.json + x64/ + xc-shell-supervisor.exe + xc-peer-broker.exe + arm64/ + xc-shell-supervisor.exe + xc-peer-broker.exe +``` + +`dist/native/windows/` 保持相同结构。 + +### 9.2 Manifest + +将单 artifact manifest 扩展为多 artifact: + +```json +{ + "manifestVersion": 2, + "artifacts": { + "x64": { + "shellSupervisor": { + "file": "x64/xc-shell-supervisor.exe", + "protocolVersion": 2, + "sha256": "...", + "sourceSha256": "..." + }, + "peerBroker": { + "file": "x64/xc-peer-broker.exe", + "protocolVersion": 1, + "sha256": "...", + "sourceSha256": "..." + } + }, + "arm64": {} + } +} +``` + +每个 artifact 独立 source hash,修改一个 helper 不应无理由要求另一个 helper 重建。 + +这是 manifest breaking change。必须同步修改现有 shell supervisor loader `packages/core/src/tools/shell-session/providers/windows-job.ts` 及其 artifact-boundary tests,使其读取 `artifacts[arch].shellSupervisor`;在新旧 loader/manifest 不匹配时明确报 protocol/manifest error。迁移完成前不得提交只有新 manifest、仍使用旧 loader 的中间状态,否则 Windows shell session 会全部失效。 + +### 9.3 脚本修改 + +需要修改: + +```text +packages/core/scripts/native-artifacts.mjs +packages/core/scripts/build-native.mjs +packages/core/scripts/copy-native.mjs +packages/core/scripts/write-native-manifest.mjs +``` + +要求: + +- 普通 `pnpm build` 只验证并复制 checked-in artifacts。 +- `pnpm build:native` 在 Windows 上构建当前架构的两个 helper,或支持显式 artifact 参数。 +- Release CI 使用 `cargo xwin` 分别构建 x64/arm64。 +- source hash 只覆盖对应 crate 的 `Cargo.toml`、`Cargo.lock` 和 `.rs` 文件。 +- package smoke test 验证两个架构的两个 exe 都存在。 +- 更新现有 shell supervisor artifact loader 和测试以适配 manifest v2。 + +### 9.4 普通开发无 Rust 保证 + +PR CI 保持分层: + +```text +普通 lint/typecheck/test/package jobs + → 不安装 Rust + → 使用 checked-in prebuilt helper + +native-windows job + → 安装 Rust + → cargo fmt/test/clippy + → 构建 fresh x64 helper + → 运行 Windows transport/E2E tests +``` + +如果 Rust source 改变但 prebuilt/manifest 未更新,普通 build 必须明确失败,防止源码与发布二进制漂移。 + +### 9.5 Package size 预算 + +新增两份 broker executable 很可能超过当前 package size 余量。实施阶段必须: + +- 保持 Rust release 的 LTO、单 codegen unit、panic abort 和 strip。 +- 在 x64/arm64 产物生成后记录每个 helper 和 npm tarball 的实际增量。 +- 修改 `scripts/check-package-size.mjs` 时以实测增量加有限余量调整阈值,并在测试中为单个 native artifact 设置独立上限;不能删除 package size gate 或改成无界。 +- `pnpm check:package` 是阶段 2 和最终发布门禁,不允许等到 release 才发现超限。 + +## 10. 兼容性 + +### 10.1 旧版本 + +- 旧 Windows 版本继续看不到新 Session 的前提是旧 parser 拒绝 `windows-pipe`;这是安全行为。 +- 新版本在 macOS/Linux 扫描到 `windows-pipe` registration 时忽略,不尝试连接。 +- 新版本 Windows 扫描到 `unix` registration 时忽略。 +- `PeerFrameV1` 不变,因此业务层不需要平台转换。 + +### 10.2 `X_CODE_HOME` + +继续尊重 `userXcodeDir()` 和 `X_CODE_HOME`。测试可以把 `X_CODE_HOME` 指向 NTFS 临时目录。Windows Peer runtime 必须位于支持 persistent ACL 的本机 volume;UNC、mapped network drive 和 `DRIVE_REMOTE` 明确不支持,避免两台机器共享 registration 后用本机 PID 误判和清理对方记录。 + +若路径所在文件系统无法提供要求的 ACL、本机 volume 或路径安全性: + +```text +Peer Messaging unavailable +``` + +但以下功能必须继续工作: + +- 普通聊天。 +- shell、文件和其他工具。 +- session resume/fork。 +- 未命名 Session。 + +### 10.3 Windows 版本 + +支持范围跟随项目 Node.js 22 的 Windows 支持范围和现有原生 helper 支持范围。不得额外声称支持已被 Node 22 放弃的平台。Named Pipe API 缺失或安全调用失败时 fail closed。 + +## 11. 实施阶段 + +### 阶段 0:基线与测试固定 + +目标:确认改造前行为,避免把已有 Peer 语义变化混入 Windows transport。 + +工作: + +- 运行现有 peer registry/transport/service/tools/authority/inbox tests。 +- 记录 Windows 当前 `PEER_UNSUPPORTED_PLATFORM` 行为。 +- 为平台 transport factory、descriptor parser 和 unsupported arch 增加预期测试。 + +门禁: + +- 当前 Unix Peer 测试全部通过。 +- Windows 普通 CI 不回退。 +- 没有产品行为变更。 + +### 阶段 1:平台无关重构 + +目标:把 Unix endpoint 假设移出通用 Service/Registry。 + +工作: + +- 新增 `PeerTransportDescriptor`。 +- 新增 platform transport factory。 +- 将 Unix startup/stale endpoint 逻辑移动到 Unix transport/lifecycle。 +- 将 dead endpoint cleanup 委托给 transport。 +- 增加 `PeerTransportServer.closed`。 +- Service 仍在 Windows 返回 unsupported。 + +门禁: + +- macOS/Linux 用户可见行为和 wire behavior 不变。 +- 所有现有 Unix ownership replacement、abort、timeout 和 shutdown 测试通过。 +- 注入 fake transport 的 service tests 无平台耦合。 +- Windows 仍 fail closed。 + +### 阶段 2:多 Native Artifact 基础设施 + +目标:支持第二个 Windows helper,同时保持普通开发不需要 Rust。 + +工作: + +- 扩展 manifest schema。 +- 重构 copy/build/write/verify scripts。 +- 更新现有 shell supervisor loader,原子迁移 manifest schema。 +- 新增 artifact 单元测试、package size gate 和 package smoke assertions。 +- 更新 PR/Release workflows。 + +门禁: + +- 普通 `pnpm build/test` 不调用 Cargo。 +- source hash 漂移、PE 架构错误、hash 错误和路径逃逸均被拒绝。 +- x64/arm64 shell supervisor 现有运行行为不变。 +- `pnpm check:package` 在有明确、实测的新预算下通过。 + +### 阶段 3:Rust Broker 与安全 Runtime + +目标:完成可独立审计的 Windows 原生安全层。 + +工作: + +- 实现 framing parser/encoder。 +- 实现 secure runtime ACL 创建/验证。 +- 实现 secure Named Pipe server/client。 +- 实现 Account SID 与 integrity level 双向验证。 +- 实现分阶段 token auth,auth-ok 前不发送业务 frame。 +- 实现 cancel ack、late-response tombstone、超时、并发上限和 shutdown。 +- 实现 parent stdio EOF 自动退出。 +- 加入 Rust unit/integration tests。 + +门禁: + +- DACL 的全部允许 ACE 都属于当前 Account SID 和经批准的可选 LocalSystem allowlist。 +- remote client flag 在每个 server instance 创建路径中被锁定和测试。 +- 只有首个 server instance 使用 `FILE_FLAG_FIRST_PIPE_INSTANCE`,后续 instance 可正常建立。 +- 不同 Account SID 或不兼容 integrity level 被拒绝。 +- server/client SID 无法验证时拒绝。 +- 错误 token 不向 Node 派发请求。 +- malformed/oversized/truncated frame 不崩溃、不无界分配。 +- parent 退出后 broker 和 Pipe 自动消失。 +- `cargo fmt --check`、`cargo clippy -D warnings`、`cargo test --locked` 通过。 + +### 阶段 4:TypeScript Windows Transport 集成 + +目标:让 `PeerService` 在 Windows 通过 broker 工作。 + +工作: + +- 实现 broker artifact loader 和协议 codec。 +- 实现 `createWindowsNamedPipeTransport()`。 +- 接通 runtime security、listen、request、abort、shutdown 和 fatal exit。 +- 扩展 registry parser/cleanup。 +- 移除 `PeerService.start()` 的 Windows unconditional gate。 +- 保持 helper 缺失/unsafe runtime 的显式 unavailable 行为。 + +门禁: + +- Windows 两个 Core PeerService 可以 list/send/ping。 +- 错误 token、错误 SID、stale registration、broker crash 和 abort 在 transport 层均产生稳定内部错误;已进入 outbound ledger 的消息仍按现有语义公开返回 `PEER_DELIVERY_UNKNOWN`。 +- Unix 测试无回退。 +- API export snapshot 按预期更新。 + +### 阶段 5:CLI E2E、文档和发布 + +目标:完成用户可见功能和发布门禁。 + +工作: + +- 在 Windows 启用或改写 `tui-peer-messaging.test.ts`。 +- 更新中英文 Peer Messaging 文档和 README 平台说明。 +- 更新 CHANGELOG。 +- 生成并校验 x64/arm64 broker artifacts。 +- 执行完整跨平台 CI 和 package smoke test。 + +门禁: + +- Windows TUI 两个真实进程完成发现和双向消息。 +- npm tarball 包含并验证两个架构的 broker。 +- 未安装 Rust 的干净 Windows 环境可安装、构建测试并运行该功能。 +- macOS/Linux 包和功能无回退。 + +## 12. 文件变更清单 + +### 12.1 预计新增 + +```text +WINDOWS_PEER_MESSAGING_IMPLEMENTATION_PLAN.md +packages/core/src/peers/platform-transport.ts +packages/core/src/peers/windows-named-pipe-transport.ts +packages/core/src/peers/windows-peer-broker-protocol.ts +packages/core/src/peers/windows-peer-broker-artifact.ts +packages/core/native/windows-peer-broker/Cargo.toml +packages/core/native/windows-peer-broker/Cargo.lock +packages/core/native/windows-peer-broker/src/*.rs +packages/core/tests/windows-peer-broker-protocol.test.ts +packages/core/tests/windows-peer-transport.test.ts +packages/core/tests/windows-native-artifacts.test.ts +``` + +测试文件名称可按现有组织合并,但必须覆盖相同职责。 + +### 12.2 预计修改 + +```text +packages/core/src/peers/transport.ts +packages/core/src/peers/types.ts +packages/core/src/peers/paths.ts +packages/core/src/peers/registry.ts +packages/core/src/peers/service.ts +packages/core/src/peers/unix-socket-transport.ts +packages/core/src/peers/index.ts +packages/core/src/index.ts +packages/core/src/tools/shell-session/providers/windows-job.ts +packages/core/scripts/native-artifacts.mjs +packages/core/scripts/build-native.mjs +packages/core/scripts/copy-native.mjs +packages/core/scripts/write-native-manifest.mjs +scripts/check-package-size.mjs +packages/core/tests/peer-registry.test.ts +packages/core/tests/peer-service.test.ts +packages/core/tests/peer-transport.test.ts +packages/core/tests/api-exports.test.ts +packages/core/tests/windows-job-provider.test.ts +packages/cli/tests/pty/tui-peer-messaging.test.ts +.github/workflows/pr-check.yml +.github/workflows/release.yml +docs/peer-messaging.md +docs/peer-messaging.en.md +README.md +README.zh-CN.md +CHANGELOG.md +``` + +不要顺便重构无关 shell supervisor、TUI renderer 或 agent loop。 + +## 13. 验证计划 + +### 13.1 TypeScript/Core + +最低验证命令: + +```powershell +pnpm typecheck +pnpm lint:check +pnpm format:check +pnpm build +pnpm test packages/core/tests/peer-registry.test.ts +pnpm test packages/core/tests/peer-transport.test.ts +pnpm test packages/core/tests/peer-service.test.ts +pnpm test packages/core/tests/windows-peer-broker-protocol.test.ts +pnpm test packages/core/tests/windows-peer-transport.test.ts +``` + +最终执行: + +```powershell +pnpm run ci +pnpm check:package +``` + +注意项目 `pnpm test ` 会先 build,core 源码改动后必须生成最新 `packages/core/dist/`。 + +### 13.2 Rust + +```powershell +cargo fmt --manifest-path packages/core/native/windows-peer-broker/Cargo.toml --check +cargo clippy --locked --all-targets --manifest-path packages/core/native/windows-peer-broker/Cargo.toml -- -D warnings +cargo test --locked --manifest-path packages/core/native/windows-peer-broker/Cargo.toml +pnpm build:native +``` + +### 13.3 功能测试矩阵 + +| 场景 | 预期 | +| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| 两个同账户命名 Session | 相互发现并发送 | +| 未命名 Session | 不注册、不启动 broker | +| print mode | 不注册 | +| 同名 Session | list 显示两个,按名称发送报歧义 | +| 完整 peer UUID | 精确发送 | +| receiver idle | 自动新 turn | +| receiver busy | 安全边界注入 | +| receiver goal/maintenance | 延迟,不抢 lease | +| policy hold | 显示 Accept/Refuse | +| wrong token | 拒绝且不调用 onRequest | +| wrong SID | 原生层拒绝 | +| same SID、不同/不兼容 integrity level | 按首版 policy 拒绝 | +| remote client | 原生层拒绝 | +| broker crash | registration 立即有界重试清理;失败时隐藏,并在 shutdown/PID-dead cleanup 回收;service unavailable | +| Node crash | broker 退出、Pipe 消失 | +| sender abort | pending request 取消,无 orphan | +| oversized frame | 连接关闭,进程继续 | +| unsafe X_CODE_HOME | 仅 Peer unavailable | +| x64 package | helper hash/PE/运行通过 | +| arm64 package | helper hash/PE 通过;功能首次发布,以及 arm64 binary hash、Rust source、toolchain/build flags、loader、broker protocol 或 package path 任一变化后,必须在真实 Windows arm64 环境执行 broker self-test 和双 Session smoke | + +### 13.4 安全验证 + +必须有自动化或可复现的审计证据证明: + +1. Pipe security descriptor 的全部允许 ACE 都属于批准 allowlist。 +2. `PIPE_REJECT_REMOTE_CLIENTS` 实际传入所有 server instance。 +3. `FILE_FLAG_FIRST_PIPE_INSTANCE` 只用于首实例,后续 instance 可正常建立。 +4. client 和 server 都验证 Account SID 与 integrity policy。 +5. token 比较为常量时间。 +6. 未认证连接收不到业务 response。 +7. Registry DACL 不依赖 Node mode bits。 +8. 不安全 ACL、filesystem 或 reparse path fail closed。 +9. 所有 frame 长度在分配前检查。 +10. 所有请求、连接和 operation map 有固定上限与 deadline。 +11. debug/user error 不泄漏 token。 +12. helper hash/path/PE machine/protocol mismatch 均拒绝启动。 + +不同用户测试优先在 Windows CI 中通过临时本地账户执行;如果 hosted runner 无法稳定创建账户,则必须提供仓库内可重复运行的 Windows integration harness,并在发布前的受控 Windows 环境执行,结果记录在 PR 验证说明中。仅检查代码中存在 SID 比较调用不能替代运行验证。 + +远程拒绝分两层验收:自动化 native test 必须验证每个 `CreateNamedPipeW` server-instance 路径都包含 `PIPE_REJECT_REMOTE_CLIENTS`;功能首次发布前还必须在两台受控 Windows 主机上执行对照测试。测试 harness 先创建一个仅用于测试、DACL/认证条件相同但不带 reject flag 的 control pipe,证明 SMB、凭据、Server service 和 firewall 路径可达;同一远程客户端随后连接带 `PIPE_REJECT_REMOTE_CLIENTS` 的目标 pipe 必须被拒绝。没有 control pipe 成功证据的“连接失败”不能作为远程拒绝证据。后续未修改 Pipe 创建路径的版本可复用该集成证据,创建路径变化后必须重跑。 + +### 13.5 手工验收 + +在无 Rust 工具链、仅安装 Node 22 和 pnpm 的干净 Windows x64 环境: + +```powershell +pnpm install --frozen-lockfile +pnpm build +``` + +终端 A: + +```powershell +pnpm dev -- --name alpha +``` + +终端 B: + +```powershell +pnpm dev -- --name beta +``` + +验收: + +1. 两边 `/list-agents` 能看到对方。 +2. alpha 发送消息给 beta,beta 空闲时启动新 turn。 +3. beta 忙碌时消息不打断当前工具,在安全边界进入。 +4. hold 模式显示本地确认,peer 消息不能代替确认。 +5. 关闭 beta 后 alpha 不再列出 beta;无 broker 残留进程。 +6. 断掉 alpha 进程后对应 Pipe 自动消失。 +7. `DEBUG_STDOUT=1` 日志中无 inbox token。 + +## 14. 性能与资源边界 + +- 未命名 Session 不产生 broker 进程或 Pipe 开销。 +- broker 不轮询 registry;发现仍由显式 list/send 和现有 heartbeat 驱动。 +- 一个命名 Session 最多一个 broker child。 +- inbound connection、active operation、frame 和 queue 均有固定上限。 +- 当前 CLI 会在 `startApp()` 前 await peer startup;因此 helper 校验、`secure-runtime` 和 broker ready 必须全部使用异步 I/O、具有总 deadline,并建立 Windows 启动延迟基线。若实测延迟影响首屏,应在独立改动中把 Peer lifecycle 移到 render 后启动,不能在本功能中无证据宣称已经是 post-render。 +- helper hash 验证可缓存于当前进程,但不能跨 artifact 变更错误复用。 +- `listAgents` 继续使用有界并发和总 deadline。 +- Windows Named Pipe busy 等待必须受 request deadline 控制;Node abort 后本地 promise 和 broker operation 都要终止。 + +不以牺牲安全验证换取启动性能。性能基线和阈值应在实现 PR 中根据真实 Windows CI 数据固定。 + +## 15. 可观测性与用户错误 + +用户错误应简短、可操作: + +```text +Peer messaging unavailable: Windows peer broker is missing; reinstall x-code-cli. +Peer messaging unavailable: Windows peer runtime directory is not private. +Peer messaging unavailable: Windows arm32 is not supported. +Peer messaging unavailable: Windows peer broker exited unexpectedly. +``` + +Debug events建议: + +```text +peer.windows.broker-start +peer.windows.runtime-secured +peer.windows.server-ready +peer.windows.request-failed +peer.windows.broker-exit +``` + +允许记录: + +- error code。 +- operation kind。 +- elapsed time。 +- architecture。 +- instance short ID。 + +禁止记录: + +- inbox token。 +- 完整 SID。 +- 原始消息正文。 +- 完整 auth envelope。 + +## 16. 发布与回滚 + +### 16.1 发布门禁 + +发布前必须满足: + +- x64/arm64 helper 来自锁定源码和锁定依赖。 +- manifest source hash、binary hash 和 PE machine 全部匹配。 +- Release CI 在 Windows x64 运行 freshly built broker E2E。 +- arm64 完成交叉构建和 PE/hash 校验;功能首次发布,以及 arm64 binary hash、Rust source、toolchain/build flags、loader、broker protocol 或 package path 任一变化后,必须在真实 Windows arm64 设备或 VM 上执行 `xc-peer-broker.exe` self-test 与两个命名 Session 的 list/send smoke,并把命令、版本和结果附在发布验证记录中。 +- npm tarball smoke test验证两个 helper 均存在。 +- 无 Rust 工具链的安装/运行验证通过。 +- 中英文文档明确 Windows 支持和 `X_CODE_HOME` 安全要求。 + +### 16.2 回滚策略 + +如果发布后发现 Windows native transport 安全或稳定问题: + +- 保留 Unix transport,不回滚整个 Peer Messaging。 +- 在平台 factory 中恢复 Windows fail-closed gate。 +- 不回退到纯 Node Named Pipe 或 TCP。 +- 发布 patch 版本,明确错误原因。 +- 已存在 registration 由 PID/grace cleanup 回收;Named Pipe 随 broker 退出自动消失。 + +## 17. Definition of Done + +只有同时满足以下条件,Windows Peer Messaging 才可标记完成: + +### 功能 + +- [ ] Windows x64 两个命名 Session 可发现、发送、接收和返回 delivery update。 +- [ ] Windows arm64 artifact 可验证,并在真实 Windows arm64 上完成规定的 self-test 和双 Session smoke。 +- [ ] `/list-agents`、`listAgents`、`sendMessage` 与 Unix 用户语义一致。 +- [ ] idle/busy/held/goal/maintenance 路径通过测试。 +- [ ] 未命名 Session、print mode 和 sub-agent 边界保持不变。 + +### 安全 + +- [ ] Pipe 使用原子 protected DACL。 +- [ ] Pipe 拒绝 remote clients。 +- [ ] client/server Account SID 与 integrity policy 双向验证。 +- [ ] inboxToken 第二层认证保留。 +- [ ] runtime/registry ACL 经原生代码创建并验证。 +- [ ] unsafe `X_CODE_HOME` fail closed。 +- [ ] 不同用户、错误 token、伪造 registration 和 pipe squatting 测试通过。 +- [ ] peer taint、authority 和 hook 隔离测试无回退。 + +### 生命周期 + +- [ ] Node 正常退出后 broker/Pipe 被清理。 +- [ ] Node 崩溃后 broker/Pipe 被清理。 +- [ ] broker 崩溃后 Node service fail closed;registration 立即有界重试清理,失败时对其他 peer 隐藏,并能在 owner shutdown 或 PID-dead grace cleanup 中回收。 +- [ ] timeout/abort/shutdown 不遗留 pending operation。 + +### 构建与发布 + +- [ ] 普通本地开发不需要 Rust。 +- [ ] Rust source job通过 fmt/clippy/test。 +- [ ] x64/arm64 预构建产物和 manifest 更新。 +- [ ] package smoke test覆盖两个 helper。 +- [ ] `pnpm run ci` 通过 Linux/macOS/Windows。 +- [ ] 中英文文档和 CHANGELOG 更新。 + +## 18. 实施原则 + +1. 先重构边界,再加入 Windows;不要在同一步同时重写 Unix transport。 +2. 不删除现有 Unix socket ownership、inode 和 replacement 防护。 +3. 不因 Windows transport 改变 PeerFrame、authority、taint 或队列语义。 +4. 所有原生输入先检查长度、版本和枚举,再分配或解析。 +5. 所有异步请求必须有 timeout、AbortSignal/cancel 和 shutdown 收敛路径。 +6. 原生安全条件无法证明时 fail closed。 +7. 不添加未经审计的纯 Node fallback。 +8. 普通开发和最终用户不承担 Rust 工具链依赖。 +9. 原生二进制、源码和 manifest 必须可追溯且 hash 一致。 +10. 每个阶段独立验证,避免以“最终 E2E 能跑”替代安全不变量测试。 diff --git a/docs/peer-messaging.en.md b/docs/peer-messaging.en.md index 8862973..4ee5e1a 100644 --- a/docs/peer-messaging.en.md +++ b/docs/peer-messaging.en.md @@ -2,7 +2,7 @@ Cross-session messaging lets interactive X-Code sessions on the same machine discover one another and exchange plain-text work requests. Each participating root session keeps its own model, conversation, working directory, and local permission boundary. -> This release supports peer messaging on macOS and Linux. Windows sessions remain usable, but peer messaging reports `PEER_UNSUPPORTED_PLATFORM` until a Windows transport is available. Print mode (`--print`) does not register a peer. +> This release supports macOS, Linux, and Windows x64/arm64. Print mode (`--print`) does not register a peer; Windows ia32 is unsupported. ## Start named sessions @@ -79,7 +79,9 @@ A peer message is data, not user authority: - Peer-influenced events do not invoke plugin hooks. This isolation remains in effect even when the receiving session uses `--trust`. - `/clear-peer-context` can delete the first peer-influenced message and every derived response after it, then restore normal authority. It refuses to run while peer messages are still queued. -Peer transport is local-only: it uses a runtime registry and Unix-domain sockets under the X-Code user directory, not a network listener. Authentication tokens and delivery ledgers are implementation details and are never model-visible. +Peer transport is local-only: macOS/Linux use Unix-domain sockets, while Windows uses a hash- and PE-verified Rust Named Pipe broker bundled with the npm package. Windows authenticates in layers with the current account SID, an exact integrity-level match, a protected DACL, `PIPE_REJECT_REMOTE_CLIENTS`, and a random per-session token. It does not listen on TCP or UDP. Authentication tokens, SIDs, and delivery ledgers are never model-visible. + +On Windows, `X_CODE_HOME` must be on a local volume with persistent ACLs. UNC paths, mapped network drives, reparse/junction/symlink paths, and directories replaceable by another ordinary account are rejected. If security cannot be proven, the helper is missing or damaged, or the architecture is unsupported, only peer messaging fails closed; normal chat and other tools remain available. Normal installation, builds, and use do not require a Rust toolchain. ## Delivery results @@ -95,7 +97,9 @@ Messages arriving while the receiver is busy are queued and processed without in ## Troubleshooting - **This session is not a named agent** — restart it with `xc --name `. -- **No other reachable sessions** — verify that both sessions are named, run on macOS/Linux, and share the same `X_CODE_HOME`. +- **No other reachable sessions** — verify that both sessions are named and share the same `X_CODE_HOME`; on Windows they must also use the same account and a compatible integrity level. +- **Windows peer runtime directory is not private** — move `X_CODE_HOME` to a current-account-controlled directory on local NTFS/ReFS; do not use UNC paths, mapped network drives, or junctions/symlinks. +- **Windows peer broker is missing/hash mismatch** — reinstall x-code-cli. X-Code will not search `PATH` or download a fallback helper. - **Name is ambiguous** — copy the exact `peer:` address from `/list-agents`. - **A message stays held** — accept or refuse it in the receiving terminal before `dialogExpiryMs` elapses. - **Need diagnostics** — launch with `DEBUG_STDOUT=1`; details go to `~/.x-code/logs/debug.log`. diff --git a/docs/peer-messaging.md b/docs/peer-messaging.md index 72a23aa..6a2406e 100644 --- a/docs/peer-messaging.md +++ b/docs/peer-messaging.md @@ -2,7 +2,7 @@ 跨会话消息允许同一台机器上的多个交互式 X-Code Session 互相发现并交换纯文本工作请求。每个参与通信的根 Session 仍拥有独立的模型、对话、工作目录和本地权限边界。 -> 当前版本仅在 macOS 和 Linux 上支持 Peer 消息。Windows 下 CLI 其他功能可正常使用,但 Peer 消息会返回 `PEER_UNSUPPORTED_PLATFORM`,直到 Windows 原生传输实现完成。非交互模式(`--print`)不会注册为 Peer。 +> 当前版本支持 macOS、Linux,以及 Windows x64 / arm64。非交互模式(`--print`)不会注册为 Peer;Windows ia32 不受支持。 ## 启动命名 Session @@ -79,7 +79,9 @@ Peer 消息只是数据,不会自动获得本地用户权限: - 受 Peer 影响的事件不会触发插件 Hook;即使接收 Session 使用 `--trust`,这一隔离仍然生效。 - `/clear-peer-context` 经确认后可删除第一条受 Peer 影响的消息以及其后的所有派生回复,并恢复普通权限;还有 Peer 消息排队时不会执行。 -Peer 传输仅限本机:使用 X-Code 用户目录下的运行时注册表和 Unix Domain Socket,不会监听网络端口。认证 token 和投递账本属于内部实现,不会暴露给模型。 +Peer 传输仅限本机:macOS/Linux 使用 Unix Domain Socket;Windows 使用随 npm 包分发并经过 hash/PE 校验的 Rust Named Pipe broker。Windows Pipe 通过当前账户 SID、完全相同的 integrity level、受保护 DACL、`PIPE_REJECT_REMOTE_CLIENTS` 和每 Session 随机 token 分层认证,不监听 TCP/UDP 端口。认证 token、SID 和投递账本不会暴露给模型。 + +Windows 的 `X_CODE_HOME` 必须位于支持 persistent ACL 的本机 volume,不能是 UNC、映射网络驱动器、reparse/junction/symlink 路径或可被其他普通账户替换的不安全目录。安全条件无法证明、helper 缺失/损坏或架构不受支持时,仅 Peer Messaging fail closed;普通聊天和其他工具仍可使用。普通安装、构建和运行不需要 Rust 工具链。 ## 投递结果 @@ -95,7 +97,9 @@ Peer 传输仅限本机:使用 X-Code 用户目录下的运行时注册表和 ## 故障排查 - **This session is not a named agent**:使用 `xc --name <名称>` 重启。 -- **No other reachable sessions**:确认两端均已命名、运行于 macOS/Linux,并使用相同的 `X_CODE_HOME`。 +- **No other reachable sessions**:确认两端均已命名、使用相同的 `X_CODE_HOME`;Windows 上还需使用同一账户和兼容的 integrity level。 +- **Windows peer runtime directory is not private**:将 `X_CODE_HOME` 移到本机 NTFS/ReFS 上仅当前账户可控制的目录;不要使用 UNC、映射网络驱动器或 junction/symlink。 +- **Windows peer broker is missing/hash mismatch**:重新安装 x-code-cli;不会从 PATH 查找或自动下载替代 helper。 - **Name is ambiguous**:从 `/list-agents` 复制精确的 `peer:` 地址。 - **消息一直处于 held**:在 `dialogExpiryMs` 到期前到接收终端选择 Accept 或 Refuse。 - **需要诊断日志**:设置 `DEBUG_STDOUT=1` 启动;日志写入 `~/.x-code/logs/debug.log`。 diff --git a/packages/cli/tests/package/install-smoke.test.ts b/packages/cli/tests/package/install-smoke.test.ts index 0ac7840..a43bce4 100644 --- a/packages/cli/tests/package/install-smoke.test.ts +++ b/packages/cli/tests/package/install-smoke.test.ts @@ -462,16 +462,26 @@ describe('published CLI tarball', () => { const manifestBytes = byName.get('package/dist/native/windows/manifest.json') expect(manifestBytes).toBeDefined() const manifest = JSON.parse(manifestBytes!.toString('utf-8')) as { - protocolVersion: number - artifacts: Record + manifestVersion: number + artifacts: Record< + string, + Record + > } - expect(manifest.protocolVersion).toBe(2) + expect(manifest.manifestVersion).toBe(2) for (const arch of ['x64', 'arm64']) { - const artifact = manifest.artifacts[arch]! - const bytes = byName.get(`package/dist/native/windows/${artifact.file}`) - expect(bytes, `missing ${arch} Windows helper`).toBeDefined() - expect(createHash('sha256').update(bytes!).digest('hex')).toBe(artifact.sha256) + for (const [artifactName, protocolVersion] of [ + ['shellSupervisor', 2], + ['peerBroker', 1], + ] as const) { + const artifact = manifest.artifacts[arch]![artifactName]! + const bytes = byName.get(`package/dist/native/windows/${artifact.file}`) + expect(bytes, `missing ${arch} Windows ${artifactName}`).toBeDefined() + expect(artifact.protocolVersion).toBe(protocolVersion) + expect(artifact.sourceSha256).toMatch(/^[a-f0-9]{64}$/) + expect(createHash('sha256').update(bytes!).digest('hex')).toBe(artifact.sha256) + } } }) diff --git a/packages/cli/tests/pty/tui-peer-messaging.test.ts b/packages/cli/tests/pty/tui-peer-messaging.test.ts index 25858cb..eec1046 100644 --- a/packages/cli/tests/pty/tui-peer-messaging.test.ts +++ b/packages/cli/tests/pty/tui-peer-messaging.test.ts @@ -1,6 +1,8 @@ import { describe, expect, it } from 'vitest' +import { randomUUID } from 'node:crypto' import fs from 'node:fs/promises' +import os from 'node:os' import path from 'node:path' import { GLYPH_SELECT_POINTER } from '../../src/ui/render/terminal-glyphs.js' @@ -9,7 +11,21 @@ import { startFakeProvider } from '../fixtures/fake-provider-server.js' import { createTuiHarness } from './harness.js' import { exitTui, submitInput } from './test-context.js' -describe.runIf(process.platform !== 'win32')('TUI cross-session messaging', () => { +async function createPeerTestWorkspace(prefix: string): Promise>> { + const workspace = await createTestWorkspace(prefix) + if (process.platform !== 'win32') return workspace + const xcodeHome = path.join(os.homedir(), '.x-code', 'peer-test-runtime', randomUUID()) + await fs.mkdir(xcodeHome, { recursive: true }) + return { + ...workspace, + xcodeHome, + async cleanup() { + await Promise.all([workspace.cleanup(), fs.rm(xcodeHome, { recursive: true, force: true })]) + }, + } +} + +describe('TUI cross-session messaging', () => { it('registers named agents and lets two locally trusted sessions exchange without authority dialogs', async () => { const alphaProvider = await startFakeProvider([ { @@ -27,7 +43,7 @@ describe.runIf(process.platform !== 'win32')('TUI cross-session messaging', () = finalText: 'receiver processed handoff', }, ]) - const workspace = await createTestWorkspace('xc-pty-peer-double-') + const workspace = await createPeerTestWorkspace('xc-pty-peer-double-') const alpha = await createTuiHarness({ workspace, provider: alphaProvider }) const beta = await createTuiHarness({ workspace, provider: betaProvider }) try { @@ -83,7 +99,7 @@ describe.runIf(process.platform !== 'win32')('TUI cross-session messaging', () = finalText: 'authority injection safely denied', }, ]) - const workspace = await createTestWorkspace('xc-pty-peer-authority-injection-') + const workspace = await createPeerTestWorkspace('xc-pty-peer-authority-injection-') const alpha = await createTuiHarness({ workspace, provider: alphaProvider, columns: 160 }) const beta = await createTuiHarness({ workspace, provider: betaProvider, columns: 160 }) const sideEffectPath = path.join(workspace.cwd, 'authority-pwned.txt') @@ -135,7 +151,7 @@ describe.runIf(process.platform !== 'win32')('TUI cross-session messaging', () = }, ]) const betaProvider = await startFakeProvider([{ type: 'completion', text: 'accepted held payload' }]) - const workspace = await createTestWorkspace(`xc-pty-peer-held-${decision.toLowerCase()}-`) + const workspace = await createPeerTestWorkspace(`xc-pty-peer-held-${decision.toLowerCase()}-`) const alpha = await createTuiHarness({ workspace, provider: alphaProvider }) const beta = await createTuiHarness({ workspace, provider: betaProvider }) try { diff --git a/packages/core/native/prebuilt/windows/arm64/xc-peer-broker.exe b/packages/core/native/prebuilt/windows/arm64/xc-peer-broker.exe new file mode 100644 index 0000000000000000000000000000000000000000..7cf479c1d1fd1654497a6641164e5a5eb2a8f00b GIT binary patch literal 279552 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

WB$eqnnTG9VrK(ZDE~ zfk`zo;L#rE_Z%8B!*CE2X2ztTX!Rf`pV)T!EweWk#dj!Zk0#w&&6xJST>z|G^Mh*v zNgUYX%b~-2b7@U%$I##sC1$aWr@$t48S3y~YWyRqOQ+)Qe^xX#yUbY!Z4O1!PgtQ# z!@{jA0-!|Dspy#p(Kh3(Rd5RFoR8FtXl0ksbd1f&C zs4l#{7&>Q~mHZPu4YrKJ%IbF-j$rF$#hixzCGQbVmGtmM1d4Dq&v5z#ob>o@t|G=c zdySz@O>3+KcM;?41=ZVI8-(Re)48vBjPv801_*aG^9j8U42IoNySQJB#(jfGP~NN( zzlC_xMq5u=nX}Xi20^uJPtBCAA%tH$`$Xz?cb65}}d*Er{mP}K0P90ecA7(&(#VLjxIf*+zR zV~CC9uYLysa14C8cig+fKkglvac}QVUgVR0*jm75%RRlk4cpv6g@W|M- zLUm}W+q`6xjj#dCbRY&DqvUpzJhWO20<^n6c9v8?^5ljf`I#XHwm7fM;}eF$N`4?p zqeP;-)c6YLRJ!DMJ1GGlhsvCfmD%e)P^%9DB%z7EB(%RgV9xpu?^o7}QLCM>z=d7C zH}bxgR$%5n^@N~RHuXg1u06-}wV6&El5h<2L-xOO#EGhB`omuRufPk7)a`5M(o$lB zW*5d!k@-UBTO49zCuv!jeCe?QoUX3J+TmT0s)-1!z_&Zh=s#GN9Yo6pYZUiZoI zfeSVj3;X3A_a)_PHuHNo>th)71ea7&16gZL*6z%qq}45mReje-AUd+Pl044Q^F+lZ zswAZm#A^6uf5AaDRlK6Gv=29`;_jUI-AckqOT!MW=CZcKD-4GA{Y7PXLtvf>7@X+cz8--`_)RqZ+E?-xTEQb_)~; z71{Df5yMhrfD0abcct+?_iHHjr;QB7;cnye6l7H^Z3LHV7`%fMdd-&a!yIs=gwaBt z>=rr9Xe!?%8R@@d_?EWXscp3Xu74WC4~#=HH?*LgoXr<%j!U37>Wl zpDjO;C?6~JM`{M^pNx($Gld^492!QlOUH0he@R0KFP)n|vaW1sQdGy}dTV`Wz17wE zI*vjw-7tvA_1(Na-!VoG%;Vn^JT0QeBO99ICo7=UbY#QX@o?RdGtP-0oAcGy4}-YN zW@#n4oyje%ZE@@_Ai~Va+^{lE11nj@1tV}|N8t$MwzJF@R{Xy`(!apmFI!&BY zv#WVH4;;Uh76-WWXd|vL&R6&^>7uG44TqtNHZ=*=dbk{(MJT>DB zdFJS(sbB!nN#Hvp`Ircm6sfvQh{2RYpjiPGVtlMb7>=nh@3VS$1OD6%MXaQ16Dv6t zRLo9a^CrlqikztSICp>LB& zbJZf}v8f1U-A2G9SrU|+zPFQTn%BmQ*&L>tvJyrtY^VfLX&R;uJ*mVcxfIJ}S8K8h zs-;J&+Z00G4!MHaNfm`vLs&7)ce-0Dc{CvYu>0*7YVRQ4nJ&q4LA#&y+O6hl&QyWW zfSE%wwkw|S5|fU;JP(j&e71&4j~WF=f{SqT>q>W=`%feu89DuOxi z8-`;Vz7+^n>IsOMCo=4F4KyefBQPMCQES!?vzG56oTWYF{MTI`$ZFmMU)=XgROS#; z8GO~111eDn?L?>`77683ES;EGH7m1@_^*;biGsn| z1oe?0oN5xy;Ao@6;^FZ>=GGuc^F4*=vw+J8nEvP|tG_FWWS=HV_u(Oax~4F-!=&En zm0(6qc`hi-Mh4W3qrntN!P8JsphS!J&#GF$#f zMJ4fQ?Q#!XNytgP%q#rlq(Z8|x&CTTPPDXEL7SkW2aiy9atRN%J5YZxB=HI~IWp$qWkMiNIw#h1 zNPm1&>9#{ejC(S#(?V2;bvb8ZkNBzEOPjx;H=sKuQVnOglNU`tD5k_%g9oieS1Vv8 zQK4Nm-q=G{>79`yz)`F8!B?2Om)E`X) zQpt9cY6edNh)6gCNtgYVM5G$*qZ*9ZP{id$%e?{Yay^x8gbhhYl$J){f@aX+^7*%vxD3vxaYs97R^O z5slvC59s{g;x)E|z1)y>0Y1forqZ5W?aZnb8@`$)St+*T)T7j*C43-1n49Sw{P zR4%ErI)kOFxLCb7zFWQ8_dJ6UoV&T`pqk=o+wm1oFq8LopKxSo(<^nDho8Ty^`&nf z%N2Xy4omy=OwkhI+wiDPKD*DLUL7=Cz?&P)%;r@!$fpSF-b%j2i&cI2y>yU;`!vG) zOqWI{*+FooWckT7Vb^hSwj9smMSyFnzL6a9Z}*1C^$NLqD|q=6FF~t%L+=g*=DC3n zV5hC>&%G~V@Yyf?E)Pu_=xq6BVz_5(KzwW=zPL_{**N*Cq*5A<(hqMwL~4w#?JVuo zfE@xW{V-T3xMV+4dK>F(g9PlGt~Fo(PK%w5shvmWdKs}6m4PyVh2>N#Llq+xEVkxv zM=#-f)wp!|XQsrx`3UBG)SFTYEw|UYHyy-}38gLvS5D9I-!ds)&4oAx{I~RGbCHU0 zUi4P4yDY+N`B2I)>||gt!_*fk8ZO)*#ev2V@~fEtnqgSQx0z=N1tB+GT;R?F9+#Nb zj3%6^e1Xwo{PzY!NR+V~QJdVTYNGs!jLl&NPQ0y2_uEV zKfou z-LLyi$k)skei-|2+@aa5qydcm1Ja_~%Z&i#az3X$+42sm%v@wb4+w(Xz0Y7e=g#Sp zNY$gFo!ul!)HMO6mk%i{bc$POo!Jnz`(Y?G2X3Epvbh6;#tsx|c)@wWEzX~Qr5XMD zZ@n4iLWXSlQ3`qZOr{*w24(I}6C)|py38>wN!snaa+Puh-kzJ=zY?`F0S~8i#<~9{ zmN?3gr1vh;OxT|z2QaYDGu=)U9Ak6@KlPQ?;z=Vh|G2zMHC81r0UpyA^SSbiR=95;^p3!dfWB_*hkop zln5$&faONNGTNFdCR3k%lTz@oXlj;w^tH|<*NBoilM3rMcwDx~norn)b+&H9WF>3= zkPWsqx19of4+ZJW@z7Cw3-I=)vd>`VV@9vDMuBRv->^+G_XwR%~q80Vc{Wsxx{w5r6 zHJdQ4_8Maf5W{psy9UcQFMmLxRs&~6N}cVenqzvuCKOFy>>jIwkQ&dqItD;ccx zc09i}ku_e2vRCFSIgGK?Z4C7i5GQ`a9tL&;n$}v0^R&Tq&BH3Xs5o3`mOPI3Yqxry zhSX&JWDb z%N+S~@~*NmjY_^uye{BC8*qkh;V=$VIZ12~1GjKoE(3ZVvLy}~TjJth=Vk`Hun(bZ z`MWoJafWELh-;Z0DzXyuDLo@qO}6}Dvak;!vkxJ&_d6LsDP;R=9}lkVH*>&F1y_ND zq^p}lBfL9^);YuQV8MA#zeYov-$W=6M7b_niM>EdYKobsQ)cJq=?DP>Lubyl-b)LS zd8d~!;Ko+MHItZsA>)X4|CsNKcrfgqRc)9*=)GhQAMrH2A&MZejM9*w5j-<^R`9!L zE>A_L*inR+QPx4U+WKqsqRDpjaBFe&k_FN4MC{p>3+fMp609UgsdFb+7IA*Iv1Wbm z_axN5aXtf@3jFShT#FMy_6?_Go<^~@Wm9qHP{L-PsJ+pczT{hPC61=snIJ!a!PDUA zoPd8Kgpdev7n9RhD{cvCkG_De=Fod=JI+aHfL$6H;{o9TF~L>{?O1DF+Z{F6uK@sTMxm(vMwl6oroPXNdj}IFn?S_R zlouRKAkx_lI*0R5^wb~)vn4Gg6t&-RDWN+1UXemzrTK<|DdfLo|LF2xrJ1(eF{TP) zowKfFji6U3|MXXqWw%myFOtfd$lOGN(~@uv*&iSS>sc&Wab}Up z{Xh$a-dDvgn@jRW{IybB9{3fs(7=b^(4O<0${ zC4Y{A;}@@nImLi3Il#K$s>z>r)U1k*+Qg->R^7_PsyeIgt*BK8iR&`rsap6VOvCK@ zO6sW4z7=Aht<=lNkbOo~WgWsqWc3{6GO~IaqwSV$?8D$9tVAy=jRNR@X+RD-y9pBJ zaixE8;cPf=;nga)((pBYk-;Uk`dGJRZgDOJ?&)STq!Hb%pUR4xMGY_k^T?E%bXi@h z{)##~c_$(JI>|zr6PE~oKx8zd)y`u4XSn-WYSL8OkSBIpz{cL@f|-4t z@`mk?y2@;kG+*~lYuPd&{wAJ6<{;X;|Ckhgp08)+pHcn-*x z*Z6sXA2jDD63qO76t!twrD>TcFpmr~GYHlqGeU-R3spNWpPGj`D-Ux@b78K2YADAF z12wXCik5-*fEpy|k@R^SJ~|f@6#Uib+6~AzcCoF2W}pD(M|D2HyhHh00}SQ5(8#q4 zsEH`EKdiVK8(`%Fr~VkhilJ1X>mU&A`dYyZPYh4%J-F$iqEz&<)TAry>kQPS4b-Hf zi2Krl9J*4=tAU;r@&emT_X5M+^q%u?f={LvQs3qAk8%Dds#y@QVS8$!#GQ z8}2_rL)r4PevzAg90axy%DhH`DcnU&bNu2Fra99Hj4rW~TPWg71~k-fk{~st7jkJ1 zRWH~GdOcu`2b{m*tJz)LkD6p}uqM?4J&jJqBnH2g%{f+{Ex+UEUXz8zke4gy^-2JJ zm7i<~zPl81A$@v20czwr_p=3RjY^&5r@F8`!vsIzz7C)EOmne!A+Fvt-ME`M`Vhbiju5q@_e3F zvxoan>c6z0{`#+4zbk$3d;V$3l1d=_SL5l{aO8ft2oqYU_Ro9`TkNqo3k{p%>gteg zFovG0RYxBP>rY5ymR?eU%PuvSU?x9+EcP633_XZA{Md_7P6a~KbHr700A=%Ol|Ho= z2eu<$DD5g25KL97vJYyWaZYcdk!dN)Qu}WCnK;ogdta-lp=+k{1?PlYL)u&ahS7FX zyq~!sWFoX?c<$%L6l1j>ugcL0wioG%k_r#%LPg&|lc$T0OuX(W!%5k9`B0in?JiOe zib)Q^UUt5L+`2bZ+{=wMVp=W@wLa1lO~)&9=XJ0#>2dkRsS}NN2YW&pRyqxiH4NJm z+3Th~H!jsO@f{H%*yNmS21fh$eblVK7Ot_2PgC)@FokgYtS5eJ@7T$0k>MZ3jzX*+ zAiA`7`!@}8gM+Pju> zQ$ql)p7>v-^B-c4rw%T{KU!qZvEh3aL79VKI z1o*`vF)sRR3AL_etTcm~P&IaBL1SmAQ#7`z=t{QXGpd?<4=?yM2NwPND7A6FKK`?< zu#bDtB6ZE@Q{THJzp~cREKbk{?!IWCVTlba({L9@bMF_o3y>vSep{a+A5$m=8c_2` zIDZcp89QX5iazFcFt{5a&fP_-BXA!&Z86R=jhizdx9Yz`)m$?ux;Z`cTLhdjKUC>~ zhI~5{pNrc5-7N1WjjGH>!esyS!hy8yMHGk9Nt#Am$#G!!%vt<6F+NBjRs05luE3LI zF3#-8ySvp2OF27FL+O}TFHRDwpP~`9pA4rt+nMA(R#sqa0zUJ=8teHcoEjxrzBxQc z&?-Z=i>f@DYHuMJO)XM8f*V(m9SJTa#j2)oStZ99+~X9Pg9odS;oB+%WEm2)pl!5H z>5ztASVhlvo-)+y;HkfGYC(&6w6v+Y$(3m5L6b{_8VV7_6Zr4kkth(9@*DJ`ZD^`a z{X-&MSXFD_Gjj#GqN(BG)TyQ5q98{lT?><~o1}6~m(?DDhyHv$8IB(o3{ic7dCaA+ zBa^fCns<@z)D~+(eoK&}EAH)-vg}I@oki~RLR;TX8BT?~+bMUe<&bLc&f1?_y$dRr zJ67UjD*vJjD!=G%N{bS37j`ScP=jE(NR9L7kM_W6g`rvrlikjy5XrH9Mwko`HAS(rid_Dr$p z4-jFFJ2jQcLZgvUvWC@iU1cS=WRMnYnKh+|^9O8wtg+H6YZ_s3c2o$^!a!z; zdAb&+)-d-dvb!r|;Hz(S5%R}Ci@E&aXoN5k`_0@1jdz@;v1DR&0SE8brr z(#jZJT#{Dsa0PAeou7wMA zdx+9P=^IU(Bi@|iHg+17%D8m@VD@ijWf}W|V0OjU=qh=FaJYX}O!R;SlF@}zZP)XN zq<3o>pPKkWr7nu8K|K~eszr)ctMwJ?)kQJb73dn;1ucZFq_m)!{ZM+i_6*U1Z7M9} zUm$Z80ds*2rV8PKEhbGD$XI|p*TuP)9dd!piu&a1c(qYQ?sbQa>CooZEv3^A&0lwD z?O9vY|BA!@;V-@NkV%Jx>O*gN7o$99xQ{wUVXsxufo44VbTd(hNx|0by;4K)-)!%g zFKF++etX?pYqy@_#O~zCoR1EvuRRNW;QAR|=4b}|MP85!=dYhR)f@KF`C;!jUj0YB zZ}?w~|3%c-ue|Ka_$Qf3#B+BHWWM&`xu2UmY4#1<|I{)PGwtlN7i$XVAp=HnrJ)FO z`z@>WT(mC2yNEPcvl6L=f-SR45u#mK)r<(#O3E@lnmVv5++AXL7|a?X+)em3ho~X~KNf*(D<8Xaz`xE0>^>47zjLh^4U<{&NcNy~}y%ayOgyox*ks z-@zOD7}h;+o^S4}&VDo(nf4Hl#~gkfW%-xTykah)F=uDDMMK>H+f#496@2>rVC!34 z0h{Ft*Z`BEA#XNUz@~SO6LxQa4cgC5ZsQJEt5wy(6|a z*!l=}#M1A?KAIMQQ5(Kt5#$1Z8)8F)*TyTC_CWs`@wRjM@8v7N%*S%gXW~sTo#A$G zW;DVu9$bIfvmxvw(8STC`!{KMx4ueB;-QuQ>UxX~YIDbnJ76UsE9k~Ozw?9(`_nvZ z(`!0Rr-b+oksYs$au|H;?j&m%r_2vDNXVhEzwB+z?Tj#eLy_8h%lD&bXXLS%uj@hv>hAGjJJMCTA>112 zsxA)C?I@zXnH$KJ7bds_RgN|o?ot9<(fChUi3b@WeWyY^8s9S5><;Qq`n_8=pdUwZ|FMmdb9oMaeeDQSDGA?Gpx!pn1J(fBy!kFlD)8*E<0K-6I}m z#GsX{rf`p+nX>D}3(>_El{Fx28|!_&t9qe7w?aDBP9XS@1bLZ9fIL$QrCG@E- zsUdI+SeM-J!~Fvp_Qs6(I#<7=rQqy&u2x*9^X>(?84G;SoFje`7hsX3e;xl*%%=PThpAHf9y9PU}a)x*u{Uj1~{6k?DXt!NOcG*>hy z$D(wAM9k5ULgLO}kVkEszDrhaq}#74)A$)=$`gOssO#JCs3&4S^a)w*6^3%nF$$hI z3LYJtd{tEkU#J%=d5RQYZJw@Ox6*qQHu4CMyfxMe9nRMnM`%KfW>G}G$t~jaBBLL= z|NC}0`JbF84fE;n^Xf;NiqZaYETfkv#6^H7r7Abf3V@+~!1F`aGJ$AN)ku_L+ZAzOXp9uS-IgK?!r*q|6$&9g@>2OmrVX1I@{<&@==V-hfSHHB~sf&@|^#O@%O_ z*v?W~73`|zc9ze%U)Y&Mnxq&e?NVa8f+S5*(vc+Tiyl-hUE_#-o);>4fzq9u1Xt<6 z&42>4EDtL?eoy+zcdtYi-lCz%nMT~AP z3=hn6_^ce9CU+zX1GdEthIihTP|KB5*go%I6uKIwa7w+Qf>Dp1ib-;r%ak4lubd4o z(@;lJ2Q8DLbEo|Ngc`9TI_mRS^>L{oN8$U9iwn=Lh-Z#VmEdbCRED>_VD;#1oHOX1 z)xqp@z4#}bfvBee&tDBAC{lAAYYwGLYNP4VI5FDybXD-RynM5@%alJRoZ18VW~qDi z`0*7w!g;)3d`yQ!cZjc%Ano!f_Bb4MRdvsr=w-ccQK19`u@mW*Cj#i(tv9Zq)*;9P z{*(SRQG7G~Y2H?UQY!g>(4RXZ+vtxkf4lgM{M72c5BRU`Mh}R^F?X*mPzNlRal^O2 zFAxnJmH#C1Asd$SD`4BTH1NP8ks(^5rV+IZkavQq9{QyK(Zy8Xd`S>H^d3QMn#JIv zsW*UHD(P1*-YTzx#B;tw6Oma4D-v%jijcr(aG@s>_OT@=-cziS1ZCt%_y}Jqkv;X;@E}_nGv#gTZtxXB`#hj zN}MrqWmzc8p)~TQW;BtjIb1Mjrwaxn=>xfm^q}XF8uspJ=(!N^7a8?lY;+`bG^c9? ze~>y8fWI)_uRQPu{)B|q$iU*$mq1IVGb6GyI;jZq4pz(IN7JAh+>;-49>dv(-w36S)q=H>7t!-b>hiJ;!OtgD z#~k3ex_5`kZHtOGU?_D+?0M{}tFu9~annqw$KZWTLN@z1Y&2r)v^1Z^%Ba-2ybg|C zrk669FMr}P0Zn1M5>xmnlB)Kb_FHoF?wDJz#?&U)sI_#<8MU)4t5(;n8ud0d23!F? z%CUa>uvPaom#-%48$khw--^Duh5%5}RK-!b2*g}pnr*-z)g*Lzt8)O48M znM)dR(B$@P>PW5`IsX|M6o)$B{&uK%^|bxYe@5ppu!0``bP(sAk>ZYNUo*pi_G4OL ziN+&ncWUekN6L(mYhsiw*F7DXUC0>Xf>V53arxMH>4Pj^tfT}E7*ExDIM}k1Hyce$ z;E|^M#Q&bCn)TM=aRvw9WipK8?8nTC$2G-FLoalR1H{G@Qj5 zWv3Gvbq?@-VnzH-nQ*i!<@of@bAbQVkyI5n+g!Zc`f!Eu@3lHoydfuOOpSq{$UYgd zXI2=q+;YAIUh%8LiHujA!$P{w#8^`eE@=C0YP)wyz;>qPtjj`*B0^B|kWFUqK{X+< zK4v1vAr?bOYz-TWnQrO@=R< z7Z*QhJ{}|Qw&&v^QvSX9`1Gj0^O5Asg88_$AvYhFp}q4ZzlV^^pO24BC%<4mUN?zf zG#>`&?6IZb?f2TP zDeh4dtE}XS%puhLpy_MtIUe`7bVC;RNYf^!8#Z&?Xxhj;@0=@dYmT{Z%$M-bU4yIy zhf}k1#5~C7mpyqH2X?d0qO;s>Xr64&-Mid)gC=!$X%?Cb>^UhnvWe4>XgF8$g}uDx zqhfEhCQdXqSy(zPI0I@p9f+bE?mgXzI&VQ6m3hb2JxwOs={!wvxW&2eyQc7mC*}*k zP8;uD{R>ZnoRnO z_o*F$_s|Er6!OQXx)f=i9__oIS8G3Sa`$uX<+v$A?S)c-{k#G=|F7=ngILV}>3)8| zvD@0uD?R!5iMcsVZfidu@df+&#nZg~{5o3J7r+0X-p}tC4P@l@^Up37ERHK^SO5Kd z4LQDiKR zjrX_43$-=o$Sm-q0RPL#tpBt7`2mOZosWL|`Ljpo=Hs^U`9^=ier{%?|9rf{C~P$! z${Dh;Hux7i`Ob_Ze0^_?uup-!dF%bWsbD{k{IA;2drtnM{k%cDR4Onbnj2YnKfjAF zzH~pIoyzU!&j3LFe*SZ!oexeFAmTsr6jS(zk$mCTvV%G&^e_A>?W^c;d}3kkk5z!X zpFjJg+0QS!rq6zU^F&hx_Kd3B+s~ioGbcvn&ij+LwV$u^V*BsstMuJyH99>suJ;kV zoBe#;Rk{8A*NrB9=-p;N--B%KeqKdhap-;a^SSRxG6=(sm`NHcEWa__G1eur0%2cA z43em7A(Q@6f%h!XMdrLTvvfOL=(I(|lASZ80P?V)!EjI}1Wq2H~uUkTcehf-D~ zb&WAdN&P~6RXDo}WhNJ29xz{8*QmXcON9dCQ#%icq)#o5j#^_SIr2re&d5>Mw2))k z(9m8hLjz6ju>G*~pGc>6MSl+(>ZAKKTnPHZ*nCe*agwJsJR+|(wDxSF^#7^8c6aE| zKI_e+Pvwit;GgiQN4YDEij0yul$x(vL#bbAAj0|O+oepXuC|C{>RKe7b3)jkp69=?CrO3q>^>$tzGIym>A zMpL^7_LkCYRytPQm zZj>|Zd@l*X*HmGh0>!K?Ts(#bUSrH5zzOKSPAlcwEo1p*B>DFCp}EG*v@qyjjXl#^ zOkXc8>uM-14&BfA=&uDCY_%)<$5~Wq2qn+l6~Z}vm{L9|>V0e*^24u;pT>{-H}F#i z0sdFVPZQE5Hg+cuSLU!&C;j+0uoHXMw%2vc_SWU?`(_Tko7IZo^O@9)bk zZyov<_6+|&e)`{tpJa6O1^DUjpQD~H#81Eee*-@qL8bo!KfQKn0e;#zd~5vl>bDB; z)9(-`d=>n3FKeqGewwBVg`ZGSgP?@5`yeRXBuXFcn&4SwwWSuSV;5J2DhrU+_Oh#6 z0{fsp%;cBHJ)Gr7^-_|j0Jj?|{$2d_&^GW_>pMtF*M#Njwfv}<*rgZ3$@!ueVnh3gSEU!p$s^+5lK{UG zh1;uVd$NeZ$VA(6qWhyMATMg)raqx^8~Oy4Zj#|*dH-DRnn()lXKFd<3To*cG`X#> zen2+k&e#80+)qEylh+T(ZL5wWRZ2(T=?B(sk!$|1svoG#{Gy_cw^0ncMEfNe2@u~#gmWzK{pt5@z?W;};ltOHrGhF$bB0q^*j+D$ zVD@kbE6T3|W*7Qkb~#c|qr$ocS!-T@{NIANAyoGT@OB&E(^nt$FW_y;rvJ_Gb|O9f zVtA7jWGi?(<>3Da-kjeWcnhPUci}C2tbw;iBAhk6_kp*q?GfsP%Tj^+#^e}h<5@dz zk1)w(a4ir{`63I1BN1Qs4)f`q|3qK^rS=Ew5vl)A^!1+}=*x=>?GIY7tiZDYnwo}@ z=)nU*KO>6p0p!LQMO*vm{J{JxZT`9A82VJ;qWmXDVdgwu-(Q=52P{_~ZT{I; z@Ts_WP(}1XP3h1#uhb)_&EFLr@HVyi51!6UpHCGC@V2GR_v8iUoMY=dO(An5r6)Yy z-b%Xn1O=8HmG9@SOu3|Vu0hJaE&w22BN21~low~a3JI}}!^ zdqY;XnoV9@+ZSp@Q zrfZMP_fPh^o>j(dFnp71m4V*~*<@h7;M~Ayvb8gpzsY}=$S`S2{ft#bswcBDgOphB zPbfMlS!dk#!~A^CUS{TV7gl7!e2yFI&u6}VY%?}MWH~obgJ$y-b}XY4lf5pgoqZ_P z)A?L}v?~h|#bV?^-u#Z_R=JV-R*qQvSRSo4^B8z)RDK|Oh{~^Yd5vY#`8u{E3&KiB zgJ|T)o&}QYBqcTUPKwypSsrXLJo}`QT6}5b>|@c1SA??5!>t{TmC)J!uX>(mdzlVp z%b!JpC@ACvqSbnX>5i;QcE(IZnsv_ccrX-V?l$$&tk>*O07G=`OumLT^^DZkSF251 z+d!RBU;}jum3#Us&NqHV`zOlZ+WzU^!atQG^V5ZwBp+_48_FbiW2J0~-V{Kk0`Gq( z_d%i(sC32$`(vM7Jz%YtEfEVZu+ywOv_56Dh(o6c)WANTQuCL`_|Q5sw_1SKv4~xr zcWYf}J==#?DRzO@Gf_+<_|U1qCs3pdQr$nnt9wUpZO|a1I%^RklZWXZ9XL4OfuuRV zxDk*p7D($Tn5&kIn91i7nWHW%jr{=MpIlr!WX^cIWaV*~6qO#=UAMA~%vis6hwRHL z;$I83Ugl!>GY)J3!AOQ1ju>8^^a)Xw9mhVX9;FgsT3&ThoyDftsbY{?g4AloV z-%)%sy#j9Hs1SXmr_rTEOt$i*Xv z_b=4YLH9Q~M_wiadd}h^mwP!6NUX8AYd)vV`(or_u@Ufuf1;F&)Fyl=3dIWE0hpIh;oa<}3I%|&=R zgt{_PyfStS7%;3`@o+cf--;J1Ueothyfvot9A=D{_wHY_UN1v>_wXa-_~BHwywl@w9Dmfj_!VK*8n0OUdcUZ^o zj?ge-_c}CU9}%&y1fMjN^)g{woO|$pj^Eppgs&bPR^}- z_>1Gv7)_qLLJP&?RfVdY?O5xswY&z<`QR`=sBv*#%>^qITthI21Wp#45Q0#|9^^Js z2gHxpqa=P=s@U$t3tng?HekP8t~ol|x$+`R#yCw_6dK+cD(>O(tD}tz2}91hCVRqa zI89%b`7PN}gO?(`0aOAd9PAF-tJ=_^1UaB;Kic}L1<(%|yI^9;=y19*+q%W7vscZ0 zx%cS&M}L4)=A%OW=)e3P%Hwk+P9hIxBDkr89GDc|&cj+PY4At~E!)68 z%vW`_#S7|&d^?m~wM6xVhOZ12zXHS_svgh{gctr$KYh0lv$F}CS0lezu9lkC!CU+U zEn^#MI`H>uF7&FmpANRZVsVemkiiWLA|;1JF`x{#d}7U9Uod7hy+`K?sHW*({QY6u z{Qd}2dt^9EpkT~zpMs9-1q*Tpgqtn*WErcaM*%Iv2lZawFlkgAznU z4N5JkT8UC6ikb;CxJPFY6ciPdwi>ln!DNPu3QU+pGfani+Ul|A^kR>_*vmPhZ2_^u zOrlA+s0patDg;p6!yp7y2p2Q&_gQ<-B}jYT)6?JQ_x|zHn%R5pbzjeV)^lGpR;h=% z2S<3dlC%FTg=L$_U3Fq}-bfc2M1^cxtT|NgO3B&%Cpi(w;8=+eROSi{XDsl`Y~)|5 zs7%GumTV)V1h%L&>m{RcJGsO(5r&1DLrq6E7Op$eWcTG2wk5`@@g1pTHHPS6Svu+0 zy=qW0y@|n@)Q_G_4VB(srhp{cnY2dp61cZ|0z6GX3CrjPr;VFG(d@W z;3)w08w;S8V($n*J$D*_dJ78rRDgQ;e-2RJQ-pXnKn+uEY7HVC?FCSGq+7HAs>cMV zA2;;wKLGV%8lZF{Oos<~)LrSZ_}w#YS+u^afZ$JVTZ8~gqmd#uSXw{!&%q}i>7s?h z1)m&or4S&-%ll_aC!rzJ%2gi5stwLVB`~EZk!hti+f1Q9P$EMhfH2#{7K7(Wa@etF zV#ay@VTU>QpCvF_DTlWZ6a*J20Q6=;`9|{pgn&=>6kB9K0ncFkt?I`)^0HM|(UfuH z<=Om@^lwu3aeIS#+&->{i=^3c#;RL6Um5KO!(C`c5pG03cHVGFm zyYV>y&>dQ9+B1aO)mckS@4VD`d$pXmP_X!ct)06gfnP(a_Z;u<@17yv%8nb^YJ7P{L(j=sV zV8w-K1(H5+{oP>QtN^X2i_ZFOJSHu(ID#cL$Xn}#p(d0~0JLCVbs^vc|J|_9&N9`# zA;W;B&c;|KZwy4p^^&xD2hb>y^zevQLmizO9KN3b9%DB`1k_h5scpu2fBIjH;1_!K z2%6>XbR*Chfq)ntk1s@Sq~I+*3UhrXeQA9f1r(X<@Adzi>k|u^>(fS7$4aw+TAyi@ zk@cDMz5m7NnnggH4rcX{yq#`zYJKEBc3B@8MtWrCd18*QON|Ejo6Mr%@ZeY}6u8jw zf9Ur&$G59dt&=f-!T(|yCs8A1hH>8C8pav2NOf;WKV_ZX=fZm#koBGgaO!-tBH;!1 zmkMEkBJ5h>XSIgK6bEXT2ABt8|L_+EZ`FSVNG4u~Fu6EfJt?Y9p+A1dd;HrfQ*x<| zvs!B~6$noT_@alGN=E!=^rCgbCq65w{)2jhsz9s%1FuqDF(swCKk*(PY*xp8;>w=xm*g$7w2(Rz912S-rSgBXDmVM>yH5|Uex7uj zkNf{tKgUzD=7>bT{wzoULZo#V!Oru8-RJu@BJ&L3 z!P8o3Teyv9Jes0VVABc{t4-)fKE!!d3ay4eZ#aL^g@^*wRVn^qrr69UCt)e4kNl;t z=OWDpmls$4}x&!=x38lSyt6O?T=G2jD`m`Q5!kYwHr|?eQ;#*8a8Xrm|^f z`rCL*mi!=-mRbY`^aoN?eV1P~AD9OO<`>%3oP76!^qh#CQQSXMbE5F3nwA3OwZ_XA zi|o|DO{DyZcdbfI`5RNFhwGjOiqwev>uergjD=?ih%9|kpw^5HJ(xx3yc%U*z&biv zvR&yGQbYMd35F+BN;STln8Io5iCgKPd@fb{nbasRdidGr`7zEe=9!H)8R-HgN>vxG zX3{wrMZgzt+#_>7vC>#1IjuVVe;{d^F`0)uju=J0Vg`zwOi41Vm9x745?#Je-%dEP5P+Cul zSVSr|1E-S^wGu=^yi{J8oHl-plPZeXA!Cdno7CjY&6=F=?pBk7{7O?fREz$l2k;GLkTI zvXW0J%wnzNK&!K*cgNRYvaT>mh6FL;S-{T?^>N#1WBV~VwGJ8M|3)2;_pZY%AFQzX z*rtyba-W%!0h{guvS|e?+)tX-Zb}<4N>>yQyZw%0k=pU{2hB}@J_t3sJ$ z!N1b)mq?d>n+a;(Q~ag!t}0c7s9Od$mzDB)1d>uO(*(|}7r*Ric`^12JVlm1AkWX6 zQ(S1F)G8KgCi}yGXS{*67g&*8zY}B4OuhaW`5=uLhx)4zsWyB+N&K350GGBYF?(u$ z_Q{)Bvk%HR?=6Yat_M52M4%izc2Lf(h12x1R_?#+Rq$nb%ig22dwu?as&}=*BoZV~ zwu>JAnQT)D_EG;N51#Pyr}^QIvsndP%(}VLar9kpWMOe)XzILjAPq@6M|3(chGp5O zRAZ*>zc|BxNKv`db#te?uEoY4z~G=5Ghr34dpFe)H~TLeV!OETu}eo%7S_92iX#7S zF}tgblSlmY9j zyUi++C3o~H{GTo-ySUr|y)9nslMu>4HluMXlC%956xByCEJ3m~q zL7aiRx)V`_Q@)Zc`4P3JU_kA7bByYW2}b!VKAV^zD_sym=6n+zI8-_g{g+i)vgAQ| zQ>f;A;WoMdEc03BlOvWE#;027%^%AAnLHxM<{d$?DU5kB;d=1i$d&mRl%5YHo2blv z0|^ImM8Nl;gy7w$2d}sJX!*acPLEPrRum-)1e$+?FEYSXQtFUNwLS{Rk8A8&;F|)X zg1Q}yRR`I8N}7bHve@)>l{PuTFSMs&Je z-h{>k{9f4xoMqi)|ASr?|4H5ePVyJ}N>V4k9C8aeWs?4{ChnxYp~i4Ia#M7{Zjwrk zwS|(TviT5WPaI2}c(WfGH=2egjxw&IBNQ4fm7}i?PaLg4PEMWpIdn@F!a8#@`^Tc2 z|3A;K?IVoCY56rfPVBnyYu&`D>&36#u=OA1*FLx^4Iu(A@^&h}wr`7B`QPE!{ZSDS@^Yb(&5+cs@uC2v-V~dzRlnxE=g7JB_O98BZYp=g7#ltnLTkW z@}^LfU@#CxL$A-jF+Yzs5ghPb-RpCsyoD!BQq939PMjq03*(TaQ3cBxoR*@W1e(W+ z^Z}$6;SLip*&wQ6ny%(2F(5rZVDrn^ydq1gJRsY~iF6Evvls7`*=LCgpFl%6#6j+$ zxn>d*8_JL95CcKXc~j?93Y#IHj^tnZtYtqbspZkkH<`xXZ{!cPX~p?_Z$rv6$j-;p zzZX!Y_1#jfm>Q_s$3&FQEMT3|saDBapKy6NfAZi{onOK$rzzZ(^nG2zl~=U-XTk)_ zJ(2alD{ z`=5OFC-e|uucdz9^OkYo#Qy#ndg!`VoPneV(uBX7H(rpNDYY}q?S%etw*!}n;)UgH zHojjfVAIkceu4W;uVCHwAO`;}3Rbk47krOtzKHTh;W=cBOzdx5b{-GCTk-uHB@QyZ z#(xYGPW!goEjl6mXz?29OWpARe`|)XK};lfUDBl*jbEGHwg&o{_ICm`c6V79i|(mt zom(Qx3A0q~wT{NYwzx>xMHx^k^`-93SRZ;%8TEG?Zd^D*`vk_qip?%ra}pyQfjwkhABgQcBe1SZy60+~E?=kEawJQxZa<0{6Ss}2GXQF%H$_s)z1L)g{LZH^ZJX567@>QsxR> zM&%cnFksyjzNa|xX9caY9@e=dKBsy(2fG{iwWx299=QpAbQfF%(&1RKP**)kuGP_# z6AS$l^x%o2l>$AwHXg~0^a^Gprm<=Dh8VZ{1y87Z&P4ikHVP7p^pagG6bM-K3Q`4k z$ZOUVWbj*XezA#L>Ol^cnJ*>_GB3^$9I6G4%oxeujr1KY=Z4PHV zqtm0ynxHdMt@fIr3_tHErh-C6aTFVG-YUcnwPr^0AE(qRlfIfXHRxy6Up&?dY!J!4_3h{4 z*6mmcS9)4~`%AK6Ol4w;jhvRgU7a7MzI_0JfH}f0>I5*YjKh3_Zk1BZ%4mE%^?#~w z|LlJ0m!Q~eeY;)l$1vPbjA1U5R1#GP?vR z5{rr>6O{g6Ia(R>{wjRxNxN@;TuwPXd>*`DAv(gl9!b>$wss_M8ybp975mc?)P66_xnmu9m7gI=~jO+Fm!lN+@9 z$07V)w!dii?^ly^k=2!yjledle%X#Z`7Qb{7vfZHPbL$$sF@I*VHp~0@rs^A|E(!7 zUAV*y*o-AqObOAvaKAf*ZOYWdY9LZlLC0tWD8HW!7J|(1qcgGAkuw2>`7}@Xaxo|o z0~x03#+zmMFh-mvVyhz>O5?!2Z2Z$%{$N+IEMMP`M9c5JKSV?F>n^B4; zT+BweA&eqvvk|TS-}qYC79R|}iq(bI@UnnOq~zlJq+w`jt6^qmDRB&xNl>I@(`@-F zGy|iOaVyX4^yg3S%~~}1Jc&_bBR@3OnG21wogR9^d4R%zp_Axrcrcu}s@kee40hss zr6Z82x)`)*4R-}#YP_i#_Ix{Q3T45yhJI30dXA^fk_@uA)}-yn+9~sSc6NCw{g(O+ z&C4x4o^T%zgoM%e8xX$D@mJI*z9@U4_1}_;voY07A^ycU@^8=OI?#zVJOyu)yfT-5 zEVN4YQeXDSzhQnl7v{$7Ok}_XQ)J(QM2vZ3q@1tMAMNqs(yK^G4|bi|#gBMYpL-Bn zrU;GHezK%H4}ds>6?Xp}VMiWIeF^jjQVM04lHUk&lJ!RgDPMS+#`f9h0)%*;Nqc^g zR>(q0hjinrvjyyAqjUEV(L4bivGSPD37q79x@;}soo)e(+{m%nn47&?E0#2lEt>H(1>oF zY-je1(rgLy@v1szWl>>GMEq-!e4V}gXLPqSko0yIh3`RTo(V}%oOCA`2nDf3Zic>v@RUG<8lR7e@VHU@v?C=y;zKs1eeXsSAKYYqe(Rpzy<_7@ zK=lj|!ayivuG37t%9N2msqU&2sk3r}yZgj;pW%pg^6ewO zz3C`=&q2sn+aQ}(e>W{6Le5K+@i&L^&Z3RnLXhBcv)0_$?*5LVc30@lUhzyE!7obj zmUcxNW-_miVE0ak_QR;7uw84oiUhTps6RlrYtDO3)?Hc?CKfFQ&Dw3RnOy94rVM1F z_}Igqie~Mpe=##lQEl+2|~`$HnC^ z#ksmd``}#rlT$IJXThg-IvWR*(^G7h>^X4>%bsRoW1mpjTV1j)&c-Q{#Z#Ok`Euh^ z1ec%6KU(Am&M$_I8@GvcBIn;&2|HRzqh{}iP%?h4fTZ9e;$uM^3i%a+dzH*)z%0EN zMPI5|Wk3Gm8rg8?vu5mXxm3PiE}b)tOGaOq zjV*8CP3Xu|k)=03jVzghUi+_Z|4J(MNbn~vpx+R#SNAUI;qNKYh6H~Xy%ugW&+(%z zU%Uf&1~raySeKPBSJz)A27bDwIcsThSpr4_A;>AjL{NAckk}xUHGsmpe|53Dz z66IMilbEK7UGr!hGUVSX8^jj5-yg4L2#-IN8&-c;z!P~nKo-_^p59s~kMfU4VBUO; z)CG8ynVVNl4wbA&>KavIy}ARA?D8uAczl{i5h_$`2cz5xT=$&hY^{6IO6E~Crt+_) zPOy!gYNINJYTJ0wnVSHg$tkb$k4Hf?Qms_EMRK*)8CDXHT~@}Hx^ABAq}bTTlE`Br zk81z6))n(8`&$qFcqqSoL^_tr7f3xaJo(6&xvW_|OHD0xPm>CU|5a3Ki2SsTpEXil z<#K!Cf-HHS#BazODgJ5_Yzw`KR{sVM4katYgDdvBj6kBj?!lvr(9>f^`e$Rh^F|Wb zGfj8qxynD$mN&#GW}Lf9eDQIR*y@z{2vOsq!emlv7p6?^*8C2A0Qvf#qK-hi4z1qD zW;S**d?C|>KWI@E+T(ZeEa8d9bLLaVlP=?HG+rXVBlM;t@VPzyn3*qGvJatP{0iPy zi?C3(WvP%Y1h~Gm@0ENSDf1P6W)j2lgrAwlk9(#6zS`OMJv^({UEZ$0`tYoKANgj@ ztb0A>9s0^|*4+2VefQ6QNG}IfpK!lQmGUpoTeMYQRePUr{Y_BK5h z8$e)cPkBs_H5KdSP3~Bx-8 zVJu!ztv$ju*E6Gswb@a2&+MqvRlc!Wo3j@05q-pFuGt+twpyFDjXSZoh_ZdV3oZ25 zM792@Ztu}YyssbKp-0BdabEL87k<4RwC0G^Caawzb~r+x`rmhRqoS`wN;bJblwbMO zrTr!9ws*Tnv{Pk=eAwt}*r+u`r6e$ioFSJkcf-iO>Y>Nv-38Z0xlRxB(6trp$ zb_QiaJrHpoh_Tl-TGL&U1mY^1QIVkYm1)#R}UM zAj;||*OH9Y>T>|E_?hfs)ZksHH2H5*x87RWMI)fv+1Z?L-?`Mm@WaZn-Ja zztS0cqRrq`ZL=EmwLxn$veZ=cJDHh^4-mv>5Wow(>A^+CT*Ab7nJBgFb0MQSQa$iR zp6~<6eiP?q(@TM4mud~085%dSp&J~2SxFpk-DPdOJSWSF6>V%cJs&g36S>Lm zt~i8oU6|Wh|^#+BzxN z#J=0zX&YR3_-8U<$&%)?E%<;kO_qElZ_r7NjMSKix>;TV^736?xFZH z6sC7$(^1>&>oe*rMiq$o7x8s!<|{SL<&8_ZFu)ditru160ux=t`3QgiHE+l;9{NDY z$1QryfSjFr!-K}8mv5lUQv$+0wR5c$TW-nmW7+EIk49ZlpvR8sGxb$aE z^hmIN--J*sxGPtTx$CKzn&X`7#@ypQy^$ij<2t198A7mxeyZJ382NwBcO1+DjAK9N$&a27Rm;8Im$FMdp}3M|M2(kJK9PnDlS*D> z&|n>8k;qxVI{57gcS2Oe#{)<#*+6~S1=bv1aqP=;cqYVtW)9OBrqC1vnsa}m`^)84 zLHcLPWf9^3MUMo1Pf`#rS%%U z9*HQzBcez(<3e0T;&8s%P)b0-WTv~kD??^_%GT3H zlu{H<6)cZQSqe%a%31}@QXT({{8p#T?% zsWeOh)lI+@VBh3HnHn>IDP)lD)4-HBGOeo|IGeM!Jn0>=PC*sqp~a`brog3q9dp=E zJ@)rKBi`o1S9feL#Qsii*-^(eXZbD@9%aN1IFxNEdm;;-4s#GGcPF>~xH|~zC!mC( zaF-Y;U@Oc<&?C2Xd1zF?ghn%v)25O}rva(j@fx7x(q7-{2!0CetV_YpMwfk?<7I&z zoa{~5c^TO0KN>@iVheUEyHk1!6JDk&|4>fbNqVcR3$iB}&L7p4b4nEN@YBlNr(vTX zHDb#2r{ka!C~;&ysz)Z-#pkNzb<)J%XOJE$`7O^#sQMDuqI_+#qzcc;R+nL$1SX7l zjbzCoBpAt(euIRP&L4h2WtO{2I4B&LcSHts&Fx7V7vC#g`ur2I`t)ncOl8uHW}}`U zl3KqO*FjEG*Finx>V(Gl{+&`<3C0FAQvyNu@CW6`)mgsLcoe1}v08R}7QHPpy<(XJ zOx3?L$@moZY{TFAzDd4k|HCj9zGpJpq8#)H&{Q!`Xk+~SVJS8JDf;`LUYPn|RWdat za75W+E&_+498*N4;eNZfE046=ef@ATaCaPt{}NoJEk9H4(GpUd$p~$gi|vPH?60)t z8{PKzA<4DngX%Z>?&prq`i=AB#6NT#+488Stw3BLpP}b+62xUWLdck?voIn54GHNzCDGZFFBwV0R7;dF*Sc$zzWte&7!F6m!{EeVcDK z9TGF@;U<5431>9qn7>3FfzU<92VHiXkachzM?4{J3Y4`Iz~CR?@PG^O6VU`tE zq(dm%j1`t?UOfYGYL?yAJmluAgtEIzH*_jIn(fise}Y-uXk`{B78nG$a)|wxQuTFV zU+GlQtxmCoYZrj~ziJ7WnzxL<_=(ZbjMpKz$=>}NHcZV3%*AjGMX9-qZRRd!;x~I6 z*r(oh-%wK+G3-*cBeeP(p$;LK69wiS=z3_z7EkED^j>Ijb%EQ4-@~mP?3C1b;yBV` z_w{vzK2Ho${ua9M(|=_k@tKefV2(0aD^qwTo7mZVU8eK`p>nxqE`f2dU7Ef6>*UHZIBMuvzIY1p zk-YYUp3nk=*^WQM^6{G(z#l!dGm-CDZV$DvBrqVV0$9bIIX62)hK$7#`=r1T_~?2R zSpiS@zRvM2dE-90q4A+{_VJC*aXF&RlZxZlQ>)-Mggnw_SAu;=c2AgZVjN`6l z4)u9~k@&Gz4ALw18noSR1(pI$Sg{?I%gBtB@_U=HfMOfc{uvg2gDP~Sy|6(?-*0n#Cg>HvU5Ng7hX!+w&2|tR~Miho6R6Kh;~QKr9J;q)DN4|3Kvr ziN-IbZb#-)ii&KN2y>I0EPJav!e=qtU08Aeqef+4*+$D&RAfMtEu$Wm4IF zrHN5|KItxt5)E<`_bkfSEW5D2nFeJ3GN(j(IH%$Z)QMu16?)qX=Nx*clHIK}h_MbL z-Mo=-ru7f;qKBp$C(c+4Kqd`glVpC8t~v;zikQXADMtblym1b|sL;B|pOC zO0-pAJh48D{uvkWor~Hu%5eR}{ZPaxr?IV+U?uVANOfr|sM1ZSkX-5`9-&nkc!kP7 z7T8w4qOVE`E?w^LKsmZaPc7<@xs_ zczm(YS4a}hIAkdH>o1o22Jjw*Fb1tT3jh_>v5?nR9h#a~?F_jJ^w0uC=j@4)7x4ok z<;c{o>Op<(d$F{m^>}M_lBB0;fLozZ%xGLCDc>5*Tw{bCkLS@yO@b`YR>N1ffA4X zz|mHM%G-Qgo$SRrb(kY?byWLl)QtqqH=ul@Bk-7=ceF3M1l8^yBSh3T;XLM%6{(_{L*FS?Iw4h)u$6vAYrSc|#q>TaaI-Vb$#bj~h{uOr9Q| z%2$Kg>xF}uJx}<-VvyojY_`sy4;alXpnCU&N3cjBPRul=0VTIPZZ+^wx`87Mz)^O@ zk!;C^?`j7Q8G|XJLiHtYFGatch{N(g!R(TLc*3r()E+J3I`?UEom6&KzF!997R>?R4ew`2{b z0sNlZs(ud=;m1~`tr$~;G-fXkzM>qS4peLR?nXBAA>!s=&Cjqm|lETio_T?qsvKVw-=T z2zBe9l_h=^d7J!Oq>tz*KjH|CD^z)dL}z%M&EW_U^eY3Bc6 z=MgK+8n84EP0V%K@C~!XrYzg$4DAel42J#GGh)3SJ5Y#tLClo2mk#kZnijC>&>9v( z9Es2X)nwkO|X-{g+eR00Vfa<=euBu!7CF}n?0h*^(x znsSkcKH&ERS-PvW+Rc6Vv#Fq3OY8&$wz8yuC2Ms%e-?ICYY)Fi-u>0uLkD^O80p-s z+eXW$Qh6MRL}Qjn${uQ!Cs7L@+=76tc2ghu+g?CwqM6j~lIh(R3eG9!>EU;%w1+GY z9p}%(he?{Xkv|99rJAksq^jAds-ZHic4GlK6C0)44pr@XdMirf?Q5mE zd#W^WUAtL5G5GCqhDyr237(Hp@4M;`Q!)#%rzhI19sF*Qw$&8LpLb=R*f_QC%fqLX z+(iu^@q38hqk8Z_fK&9O))3+(Bjq!;$@{WR-mliRh3`uwnffR~bdP;=)_KmfoXLN8 zfeB_&`9WDGdUepCq4!j?ssqv_D<@N-C1k&{SWJQT?j~BYg zkD1BEj^HjWm3G`r>z|!=!b~g7PCIF)Z!^RYGb&CAA(0kW*{yN8|J=4T% zkG!6TDKtUFqu2h|+mg8+d5aveU4^cq z4(gfzmv}BE5!hIbv@@@nMm`2ht46w2BU|K%IJFV^4fQBwt}BP4d|#UtT7Se3MA?EGBIi z^~I>KeL^_z2Q&$xyVg+w1^1(vcTh)FIB!YJC~>SzviD%V&YwGQLf9#F870D(IUTEn zTbOX+lqDy{7Un3j?k3;G&aw`7vW=RAr^1X7de{|O2fN+B*k$iivG2e6@E8%%9fjHLKy=p6@nEbN2}o#N zS<{0}k5e#aoay{-`@POGp!M9HrHp9>5WOOAywbQjv^Vl@wL{P>tSnwxEGu4jY|*pN z(T3WOtG;;qoAra{Zuotw4LQMw>8t*A#8UsG=L~=mlcqcNJ=i3TI?7@+Z#7DrjYG7Af@a|nXS6p^ss!Z;-5o-d@aYo^>F9_Z_%79ogz)mA@_qD)%@5lz%MX?zcC~+0HKB0Z>p{f3Ymsm+XTJ>>5K zJunuzBq6jwuAzV0Yme(?-CF%v$ru^j2iswen~c7O-u1sMGPy2r{1-JB29I6fJ1=-_ zy6F68Adjm+$<|N zjjxq~p1PX;;i>JCo}Aj97{WZYxXZRcJ6y~;rP8hZqsVU}F021FrKTGauVVaOGe{no z0MoC~9o&L6(LiK)nt>a_cf1NfKn<$G+T!;l$*SO0h+~lWR$F`xscw7B%XP_5iHJxv zFJV8{689Oti@X)c2^ZLE$1v1Y$B;UZXA0*>(rg9 z*X@ro96j=fkpX@grzhlEhRE+l(5Q&HYtKX)HwuyRXwxuS$ifF5D_IIT&lr+@&7#Yz z0#DeJYZjd&zddUf4VB+7)+`$04n|Mz6V8=U)w)9RuD{&cH-&xe&E4gNvg5zt|78rP~YybtmI^c^s zow2QCB3WhE^T;UKSo!NQI^(gEB;@lb!6W%Y5oPiSTj?UVtDB_H=?RZ4yNjiDL0siG znMuWOkkN^&VEega`npgFb}x4bJ_U_McaS&=k1J=2_2B+bn?E22475vW?)8K9>s zDxxB4SVp?kFf3gIAQut=z3QpdCOs8#xLJd$t&nHBI3S4er|Q;go3fx;;@^N(GV$L* z0*Z`E|FQTZT`}B3QHjE*=+w(a7APvK{Rnn?LM-VL>HHKb>yP$R=&Umg<*lw_<;Bqs z+EU@pe+&Ntxdlph3f=Xkc;)$r-DbS=V&a|G67M`!P#XI)HFlHDCQB5{RGGptWEex2}%i#bBo;z2VB;!Zfx2J$>qDr zi#316Hs1{#uQ{&z==^PtKzCqUEB*1{m-*hi6gB#xPiEwm-rIUMrzEGYdZes33H{yM~kC2gMwlY4Jd z%HUE&_fh`LI(N1Dvb~wF| zL0UoZiPR&1wj-_-)xo=O;UuEfFSM!?b3IjE-+#Qi{#yNIR(1VT)eZc|t1H&(J6UHL zBjQ%GcW3kxaaKDzGbv^@JFU8AxPs$ z)tN)XcHi(`7BLrMv|{2;`@B0u*I3rwCj@0^b$`wNe z)(-T9r{@%U`VG%BM2o^J+! zbA4s}hU7ASNPs6|ecs9oG~t-b^|}+CJo_AV zCqCiVKgAK~`T4@?`0Ko+bN`-~RPHXxeL>v`;nP&^?=PGl|2{8{z}`*@KkqAx2h?lJ zY+gs#T$k`UBaff&2qgR06bAP61Wp|Ae~T~C1=DGOIQlKM6ID;OrORLd6E_B$wZMs- zx!0*YoKMqo@ZPWeT43C;HH$8#NUjuta36PhRQuiniu^G*ah6=7=s_3Had3_h`~@hv zbN-kkj_}ULJBl0c7z8&8420~m=_HJaMPaS%E1eCsrDRK@Ip&Hq$I3g-TG8P}595v* zmpUvN2*!OZ>VwT$f+bhkCgcxKVmHao<=(*+c~#({XthW~?zC5H3#$rNVgg_@SC3i>&V3P9;`aGW%t_2Cx%{yWmg*XnbGb*S`TUcR3+DA}DT)?8 z>{Pj7hbcF#`oP@OmAwd_sp>*Lv&WFnr(VK0^@wpCraE&6pHR&xbxv)=yo1l!LF5=g z9F=#a$g1A*PPubvYLD@oFICxdnkvn1hpj42ai^N!Nix5aM1U18vV@;)Y2oLG!10%b zpLoI;2tSpm?r#V`clSHJ@KampI@w$HDe@Bizn6VRd&xed8Q4{VNEq7{@?US+Cyl{h zoksL2*h^n^s_0XO^}iH-(&A^QlYIU}(7|aXpV3n#pIJjQC7)_XWyU6ZeZ1^-SC=XH zT$vGk#Kf#+*03MeF>XklePd&hKlK6>* z6f*cAbw64Dg9t@3@<4T8Vn;NdeP5!T`x5g{qV-5-?n|^-z@F3IclZZ5%M^>lb~kRb zy48EHOP5a5pO+c@Ke<1{Pw7v~meb*$-u(#|nK9gu5!`@i!4X;~=RK?t;bihejcBP_ zZ4(-u1CDqj4)Y4nj=6uum`FI}GFG=+UBT%A8>UwboEd?!%$}aBGTq6{hqeM98tFTP z(0~@C5hgtd?*#XTytX~|r7JD-kINF7?lzmV*z}XC8c$j8J1GlK>BK9WPd6u-{y0_+ zQk}^czgTw&GF<3WnGbU=P_^WV+FH%W0htf;inR{8Uo$-+T}otd>V!Oj2WIw!Ty)yL z^j@EIf9i;@^iS^3e%v*)`}6Gkr<)t;PnuVdP?s^NWl7BXcMAVLO&t|D=@i40bV^~7 zX{p-;kxGRSbw{d11hu6+>0a}>_0Ro!+K6R!ik5|IRy44yJE3RGC&mY!xH{PvADWvY zgZp~R5I%W38)0X>$g&X`W1Bc>s5i8$KI#n}bca4i{0V;FL7X}`aIxjr8bo8^uIR2U zafeQN!c%Q=QLUx-qogE;Wb_}N(8t~ig#GuB2|1@;b_~eBT2_AU7;4e#ui*m}UW%TE z4jkH7tH%g}kXX&0imm=n;vyDGeb*zCa0A%gt(P_VZ}o)MV>{S|<{D#1xBVFM32%7H zpl)w?_#iKrl9%^*?FYP~5837|Kkl{f^A>IMjyNoqI}L~ZPE-KU?oD&nC!oJ9evGd4 zqR&--d^1&Fw)qcPElR1d<urrOhQM;BMqb8XQsV!R{gr#6#UteV; zxYd6s;dEoW7TP*7GV*+P5=GBWLNsf^7RX?8CK_JjQOxW@2fU##SXG(O(8q~OEPFU~ zIEe!OP)9l!@_CgDXOLEO3qIIMS7%_XjX*~x=Okvxk&?Iu^TUcG#BFEQnZtJJFqWYs zycO?g4dU@!9*u9}#~j!jYH^=|CO0jPdl}PO1bEt>y;LB%R0Y)wb7%S;g#n@g;G3Rb zL$g*tF#Qn;D8@@eQ82-_4p5fNDGU4HaR3$f?eV3eq{y~m%4{H+ZVt#u$scp^cbV9c z9lK3(oqm6X-e!*EiYni5XXBj0mI*~{G*NW)9+C$^RrulA1Xw*Xo^X}RClvV~b%)+% zT4CFw?qHV$zMP9gAnm`yPkmI^Tu^z$P8naQgqHs2tv6A6g}TkO?^$V-`WdBq$v7pz zgjg(xwh@#f{wjdQdR$HcPxvO0lApv1%NuGjxn!lmY;q(g4^^s{E(RrH)H3R5arGfU zX0BG|Vsc!4Ol&ePrs?m16v7e9tVFS`RCr<4l2%nRpB?QwyOrbjl_QU#H?` z%1pyhaJfualc1Iiycq9GM1p4RDkirza9p#tnC=l;gCYV&CV+Kxdwi)mdzWP@xtcRg zRRTugOc2;JXD?HU|1QkK%-Eu?C{rhz3q<-i$kZ`J(gZO_^2giN)UlCxRbmL5q|158 zZ$uH<$&|=0JCl6rDQTRL1#2@E>)MOE0ba#{M3=d#RQ492=EAggpqIS+l^y?>y!+o+ z+kZ^nJr)b8{{!;wpTlgY4pVGK4EHafoNV;;{BqfCtXQuVX=p zD%`~f*gF9wp+m$Ap%rB0`#A#3ksHNFAx$^6gyq{!;TT74s_n$oUijXfM7>LV zjkUVwT<_6b>k*qXhc`zC7rHAB*NjR`?0r7S=Ol;ko9;3kCsO%pN8K3dU#M3c(t>-X zaf}KEjvw29NKL!%XJ||*VK$%G;CM|y8@9t##$(f?W`Y?>lq&kvj!6(Q%XOZz-F!sF zImlh{sTS;DqvBsSShcY@tBv#KZt#E2oosSfZ1iASp*h>UnhW872PBnMx~3)m1BzSp z-UjM7BUt@hkKC3_DQyX*wcU)uM(3n2_4G3}k9-3=x^Yae*k|61byFnoe7&Npc7bTJ zG1(0r@|0~A2R@mDL#zafHcuI@aZz$Npo7M)5Y`xurN(e+Y7CGvTU5@kk>ZWqni<2KGXN9Ff+n$>DZ_I* znHVAc=TJw1(k+Jr_Xjv*fEA8T&^OzNz2s&z>8>>R83f`sb^)H9Od+wwKOtrz1yx|s zTzBvboYZFEEwTV(Oi_y|jy3)fPhv8P%0)mvGhQh8{zLdPWr*FQ{l1O=U|pAchUCbb zddih2NUJ>5>VCz#4)@p(Q>}sz^iicK+MK+mr%nvt2z&|KNP1 z_;bXhe;a-0dF>eX0H7PIpC-%jVkyP6dnz{i4@w+1Y1R{3q~irR$rGA84Nt(CdTSrq zX`ayi(Bn53dqT4y@NX#9TW=UeGT?d7Xiwi;Ym@>{J}zxmp(USS;%8{Z~HowITjMM{q3%b_!r ze#E!$>2(74!l!ln8>Oph(+i242`1eFbRc`cq2OzGfphGh+H*r&aAj(ofj`R0z}$D@ z9|86m_|oMb)}16lVfA4*w_^{HFUC*R$_|3mn~{~HZ#dprb2Tp*LF_UO9o8y!;~4Cs zEE5R%u>1O=bwy1CTT=0BpOQT%@oUev?4Fz$M>Hk+S$0oFG0-BU4f0G3op!gg|A{e9 zWFeO=F-|PAr~979*YJSM!pma*?CQo+-5u`Z#=-#c(G7*w4s015;Tv#xcJ-B%fs!&1 zC(I~4zc1z-3oEo0xKYFG=0RJ27GHL|>OY(}m|+rS?5lGgk4I_2jfoo?v1qP{&wDz9($LV{WIjz@gjDkdb}Xs1DaQlkHkMsJ=Vkx9@A6k2yIZ+FX!)c ze?OIbdi+hY$gPAdz?}Zh&@SUg?+U@`KU<#LpxTA_cZTlU|FYP}OR#nsxHt{;GLUCh zT3wi7IYYZ+`^0D9E!=3uY$m61s$C@(2X|{$0YqtKB}PJFCLvEHU$f`G1OUmk44}qMym`%T^k~L#fCPS!yc(eQqN3fSOp`t?pM-j6Rx-^@LSQ`L3kd z{-K%46p^Ab0BgR{3FP#fZ&+I8g{;pwt0S z7>c~L*updqa0-8@c(=(GN6+Si@`2K5uQ}U=+z5MH%sj;+tgKC2+{R?NLtJ77e;p&J z5vI%Qu)jn!ItXj3z}0>A$Sq0#LG0-g3*4`!Wh1Yprc6&y5-XOu{|Q&viuO6>dZen0 zSY3noGkp-0NRPMtZLfU?6NWpzOsIXQUbNFQ;;4Rfv)*vj*NO;W?$=mF&W{pLy3 z#6JdavvEQ=Nxb){m>U-z4|OC4@L~pk-{=f=L?*Wcj~^l8docED@Ypelv4eo@evXjD zC9+qCcqY|wM>sC?U^{-J> zRj<|mn4(hSJ@-(jirVW5eHssvO5LD#E5L>H#XmxoON?>^7Uag#+3UYU0XHewk4!ih| z=pYV@ocoMml4<3AV&|N@S+8lPmG>S__Dy2q{VfXQNv^cn=N=(?oJHG;nz(H(;b9=0 zHkQc*1IZ_dWMDzw8twaHMF0eS7p6Wwhqt(yecc-}*Y1*)r9d8d=V2|PpHBZdKB+I zj5mryq6TpgWnmNn&fa0Ch!7E>90(ip+6G{RU@8#B#En@#b#rVtZn7&}?{TjL5e!S6 zVQ+`GD8{+A#f^8FyGV$R+G$lw^6YtQ#to~Th%Bz{uvT128yrkJ|5X-iXY$%wS;{)w zS}RA%563R8Pqtb|*pq4fAzn;DxND0jTrYr0oFm357?}@Yw|oGLX2n@pXN-Q)Zu28b zih0X8)S{p_yxgh4oSi_$*R_V>yxtheD{}nt>&Q#YEuL&*BX3X42TTLI@#8qo`rVS= zl8~nIW>|;DRJ_2d)!SFlbC^~_yk4fH(3js7;Ug8}7 z3SuwX>D)itbOTmMLYFD2StdqWvi~GkWs`k;HKiK*oT;7A56jXr6T2x8xw!6xaRrlwZpjH ze7%KNeW`Dtf=r#4b$aIGy3BeKxx|mkHrGnFZ#u zR@})%65}X3B=~7Md7QS~)ak6mGMx}2ZFrhs@R=A-*k$G&S$w<9vo~aShjLA^YT_~F z$x`&GE3}n^JZtoTYg|I0%R%lcf<)Tr8-Q6LNX1bsB3*}Bf#SGufez5)8gZEh2Sc#J z2gof#P_9I96naL-YfB=RhPaAP=0t-1gpdWD;@{-8$1v#xD~SEtt-}SGtWEUg`7-sa zOimBuq(+L0s~$wbD40r+i^PQVy$Q~`07TwMh|b5AI;fr1W?pi{ktjCzs7}y@vC_ac2{ZjLsgUG zwfc?f!OdlgvJRm`=zEQKSXrxlKMLUS=p#0y+4wLT%2QJzt7(+bl+42(L2FrAJ|hZ+ ziJy(bZ<|@73iBN@JZF$qX8Z!0j{lC-VD~iN^}+5tw0fl{%$oGss+wYH>GxD)b!v{( z)C!rv4w+DBi{C5n5tu~L&mMLxt2GutHwUh_`)^n>gYZhK=cd|-1@K@y32Q_Y`T--T zp7HeMr#|XNMI0}Zc{XR^R)$W4@n>m97Uev-A}FhGgEB+ZGJV^|v`Fro$Zd7Em88H4 zukRbF(lUqd9!|L|8Xa$$6ZCVlC?wECs6v_5h@@oA>IKI+O+zUQekS956VlVWF|c{k96bF z4d!fKuL|A99wO>do66>m8qWbL@mJDa5+O1HO~F9|OUADRw1U^u*I)7>t2@i+&huRF zXx8?aS=;l*jnrmMM!TwM0vUkyJ0t^}wtf;1oP`0~g?h2pP$kJ>4gqx;WS}dxX_P$z z>#wSy4Ma&7Z>}|5aI<7aSGFTnipjdIwh+jgv@+3OHjC54exg*=e3lQNY2Z#r28bBCdtW(Xr6Ff2A zcW&^+t^PFdyUF;D%E)SCl9Z|dNngn_m5$WJX8eT;5+%?%)*Q>l-Co1^$U-Kyoc0O; zq%4g-tS<5Tsp+&06fI>Jn=0=Jb){7eM^!hWkN4{tKTqg3UvaK&%UiY}p| z_!4;*9^yx4Vo9dX zsR{lj6XQORf-viFoe{rvt=Ty_=Pp}<)lnqBFS*G4DNb4nErJs`YfP+ZTu6Q^>gAwJ zC+OIq0?sA#$ez(`hA$c|jHiloY@XeJ0j?LE_Z(k@UnD;BJdQlE zL^^MY>rmqaJH{G)^;VEO|4`^~#m^g~#l?;_=Tc0<;1#Lz6ABZ%S|$*V`<-6#Z4gI8 zUqdigAxH139pVn>2xaH@_g6ans$#Y%k=By(vDOOPlYx(O@llSm-QTH`YF9M=QP2Q`YXb zZ$x3>Vb%rLod=YALYRNJ!J?A^O~=r9iEOS&{%xujct($y#T_=DqzWp(y?5opzCFa3 zQ)TZDsFUpvBLj3EBOGoLWCK5s%Q@+snmgyfI1)4zDT8^{jOPSTr( zD9_F%W8LBYBPFSjPE!JAm5dF~^P|xuK zbB8f+c;iXEm)u7E=Lqb(M(rWkGzZl!#q`{-fau12ISR!$IM^&;Lu zS_7;Ir@l(~hD5sN6hD~6VeVj3TP#MT1eRK)J+(=4Ve(P2Y0luPu=A%ssR}t|Vb;4V z*3UhV7=Z6cfGk?@2Q+L|7jj0PX9iG%Jg?PXM>=XV;`to?vrM*Ip6QtEWqZtBcT5s% zE|E1`t?he$p!{EraxdEp7ma*w4;e|e+pl9_q1fC#Vqz*#3VY#NaveU04YY3qRXc*w zi!hsT9PQFpba@B>8B{Bsr+6@HsWFR*e?=Wl>Utzkc(kHJ1e78rWA@8QQABNuIBQ9^ zJN^vE19ugi|s!#@@Hb%gtb8dS2-k;jcFVp6Vaq~Tu> z2{@0ygT$IhJj2QM>%Dev(_v7?x*vjHls)$~j>1~*#~viwYIUeMfJYHq4&v&vQgo{$ zr6~|h;+#NJg9OY89N#P6o2y9W-yoQ-st&!V{mX~m{8Dgjsbm5@%_rUxT_PgU!qW6{ z7Rmo1!!(0+Lc3n~6je;dcebKdF*u zlktO(B%@-b22S zb*nSg*%L1b(;QtB>>i>$CI0f97yXc7;{sdY7-{?I#ru2m+^S2Hm%_yIeg&B zRsif4aefC$ffEkyOt<m+sqONJpK2~@4l_V;Vb-@J#%VQUk`>z56sS7cZvP>A*w^6 zkO!pKpUVT`MajkV1VL0_4R2_9R+3@|EyBd);LL%l2>{k`c!JS?e&mYUn&E8930xz@W zrQckS>Z|F)mHGB|%C>+m>^UyKMcgb&aBvY+?xSJ$c8JN-N*3G>QwvAu8yS~LnvIOC z0@EcxK@197zH~^6;`~ZBmG5X-GhH&22j3DnGoS2#=zsv}M$@`DcQ^s6p8gFV!|q(< zp*_&1H+BOfRdnRQeX`_F_}<@+8hmIA%U@C;>@|UgN;KtK8+3c6>`I5K`EZCf_C!{$ypzJ-Vor<6#JMOr>_q^^7TVWxl-3iv{#DaCfZ|Gt=57vvHbkKzwc}Q9K6; zjajPa=Wy-K9eX{9IQW^g3Q#(l%xf_5Z51;~DsLdRN z+@2~)9$I~i&i_?BF;6$*w z`8C!s27Uz9J8V&3#R%roENwJub1lFV}Bn;Ejg{(T@M4d8MbRC4G6D$O|li z4qSUBL_ED-xknyA=K--CfJSNa0BDUQVy2r+S8!pzBH4JriXQED4c-vMCJyTFdPGl8 zA{yG)2O>fDL!p9nhWEknIIVA_FZ?kNk5y8#AJm@L`W0%w=*#t}#0H*!tB0Q?B=ITwkye&eu(G69d-N4f2OYsVl9&g^AGT(BJ~z) zy-Fr8XB2u8vfy*j$lMu7toJgzSx)?7y_eg~+#cd#rrj)OC3!?!CEP9HyOr*Hkp0ba zX7O=ldP@H6<{y|oFVs9dGxS`fl=MC19z2FM`HZRS`0TAUiILJD*!6w6YWs3clw1IN zmEm@odk0s3V_&f$eZ|bS(vWK*0zclG$L!ai&Ue9VEBB;YST+JqbSN#)%XmB-5RN{# zujEfDDS(!y znNJ=h|7|hyA3r(yFEP32N|Lz`Tx?8E;g~k@7!;p2QXAuhVk3&iiLCZ6Mh zE6DjocMg#y=k_OcAZ(hXmj&%pOA0)2>2(CdpV7bKuh9&hLj9R{`o~m&#pw72J}1_J zUbg{*=~^ND?JUj=hNZqg_Ai^d#WeT`IeRhtk(?hR)wmrQ_wZqQD(RW3lJ51+LCSzj zIDVE4?5k?Sid`r>?eCH-JVkuYazOzETPQHHo3}^;tw~egF+!c1cjggwg=X-r=<8=c z=_LK!9|T|XE8t}CHA+qfb}c`L;cM#KE9Y@1H36Z^VbEhclikK0W{UeJjdS@Yj$FkQ~X+;R^mKGpSVlKM0|SkD1zcpW6rcKx)EEd>!KA6 z?z)DWw)t43wnm1rTeVv6u0WNiW@9r-GDo!6iQ=3&6!>|Hb8zFGzc3zgc$zx%K2?_J zUDl@E%Osy?tSz@TxtrKQE@2kPZ|qX3RwrZA+Tf= zvSVA2P+HuWNoKw#HuSL_Vp@3>I%I4{8+)<(<<(J3Nx4rF#5hBIhn_*|C7v322WsRU z*qCis!{FfXw&3t}LANWXN8W)Rc?*t)awe8Lu*~QTCT2X3ntGcPYby;VLg=o0F<6_r z4iU0^L6vG1iH*he8bWSxgRfo&Y3a>yP9)GC$x(ap%i*m&`F*CXyMdzbA6V zi2F*kwVXRfTsk3!nAmX%k!wf=Bw&-hd^?b@TU} zYw=^Zh@Z!B{N4)n>phWt^>Mqt-%NW5geMq!wTNCF&s9I_|0?xQ_v)YS)qfy0S?bq{ zn-3^Twrgv4^C5$2Cq~ES>OYY#>7+#3)6eGcaGc=bsi4sC$XEDV8YR4l;9y4H42qrb zZ=u-KA1jJ25)`}b5k;|E{~n4F#N!{L*bRbWDbAzb;O@Ja3ZH9T5~L39RpG^weeeR@ej##zEu8Lx!!`2-~>xR9U2`TQ^Pbs%bL z9gD9k@m9frj;zW}@(Hv9Sn#60mCBEUlI4``OZKa>{d**#Y)?IVGC5N-7xnRv*zO8h z7!^jJ6q(BcA&6(<*yHFLCiirj&CSIn3x*OnEEuV)kG*Hj$4br&{z#)h5;n5uSBe1~ zOCDf5dg}Z7RvL;AgRexN$&^0_?iFM>(1y=lTrP1!Wl>jn^f#~l7|@xk2!M+!D{MIH|H`9YGV*qX zXx~cEzI~1Ss(q`;iSZRV?b}z19d-6FxcGk5p1#hMLve)k1M{k!-%4E1G8 z2D34HNo*7PtK_dX<)%tGHDgQNqfHVFbEV?eQT>Es;<OG*gtz-6G*NQVUu2_|MCcf5_< zv8vQb)T!Lz*i*57wC(#XlWB_OB<4LI+qo^)j%+eZ^91avZ(^)oZpY9#6tr$Ha!OX+ zK8^bW_!)(z*OAy>SIGRs9*HwAqw@frz@-Z@ctyBh3K41)`?B}>j3hRyAdT?i#nEj1 zh_hssR*XGr<44=)PcX`IwdXH4iZ7mf?N~jL0L2QKi!PW$T#z{9Nc>U^ng1>G)P5-J4i9nB0nT zH+Be!NJsg8RW^`V0Ni#0xAsz`<=97O1GPi3EC3PItZUs_B-a0nCvkV+5Nc9sH0%;y z?Um@a(t=dTBTpbaAk;Q=8;>YsjD71<6t{)^-aZr?W-D_8j&(gt1|x+|-nLMT7UY6Y z-hKUK?)Q+p2+#Gj~5HY<@l)c`e^*2b9k5TmtxN|Az>Ut+v znOkE$6OySR;Y8h`cI-j8%N(de8|%26a2dyK=CbU1t6)01?!e;9tA?B8a-?cIm&Ubn z$x5`ZzO*Au8qvP`(ngpxu1fW#mGL}7fY%jegDs7yj`IhZnz$-uw%m>;2lR($6~9Yw}W*{ zMMTRa!SAqQLVp`gukyE|Vuzj&I74w?3CI0moFeOvPJry&0SL`v!#olH1HFrb1?@rZ zcyI)LHBNgM(glcquN+r}iOIqdqf%nLU-YCNK{HXGeJQ#Vw?d1!772I4k}Gfe_^tkR zFJ*Lnnh>)Wjl7ge!HC03iH2}W!4V3E`J2*DeqWH@;@HA|cE`B+qxd_13AWdNLR3g! z@jLVgCF$q?NAx+~0CT4Z+@IaRHH+NoT52B(%*J!9Xo*^&m1I6spT#&l*c%qBuK2}R zhI{7+6U5RxQzWLx9$lrsxfsnjCcqL-wEvtqWOgsp-mgWgT_=9L73Q^VsDW?Z}z^ z7(wo6HF6wtJCTBUkuDGW^cN|4xVFRNLbtLLVDi!S$oZKdh*qM?_)i|oHHnKCv}?zv z*MKOshaz0K$ckuU7+F6lX+0&74ZoM2RxQFf%Xm-fc8(=+K*FwUwZ?{)9Z5gbNXJpf z=Bg6a-&eE)vJ_HxYjxavfjCQ5bI2N~Sy-L+lVGe9=ZJJSMsI%J@*M0L(=Y#6u-55?-%mN?^`OuCQY!5`FstY6r$y%FSVYFu z!Z-A}pTPLczauaXBrpc-*AB$*)h`?Tj`qWEF;l;7l>%iBKZoP@(jR%qX1DYR=H!*o znE^N+rtqiW_@$KgXVc52q&E}u^O!A;^qGudI&q5GpXqBX#z%wQM^Lq3_q4x<-S0lC zkh{D;cK;xq$L`EIfrV?B7eyE(TLr{9q$?gD4Six>j zEdP}mpgEAaX~2ODm#la5HP(Bv-TZTXxHLMQRycva_pLl^Wm}o+nXI=wD{Xv$5eT-qF&8|;?zkDnx^1WMI{)az`8l_uFO4@n_2XL_AOz?y64PD(wfrIaRk zI=}RfC_T`q=-ONf*>%=y2|d(}n=CLHmR@jO|8*-~pc923tWZ7-`5=4tW#s$R=?24;2A^BNbguMbNZl=0{#e?+Qc0 z*Vvi|(4Q!feuJEz5r`ZE-z2n4ShbT^!QE(xm^a5`6oc4$oqGp0VRQ&Vxq+?M=ezXv z%-Q^iLFm8@n4F5E-syMA$Ln{(cL4=b6SePl%g+_(_M}8(GkJ*J{E)oIkJ7{BSIwj; zcG)q}hhjf4&pXI6I}RKTjmbggq}=xSVCKkN+EHe4%0BhE9|(kSCm=28uJ3Vb#0QX^ zCyd%8)LHj++erO;`?@dSrYiO9W>e8F(>>h}(~isv-sVzQc+yBpjO@jk*B^0OPzZL&vEh>gc<=EVM)a|1hOV8+#K_*1VVwm?>I6ypyp zds|w=IKmTOqJJfJnoOMCGLy;A1p96K23cZVPdy-em>+N3cfVE|8D{qH15V?N{l~z) zp0^Xs>=?`s(cq#txF?U+5iX8eu>)mvlx}V<(gLd^clX_{c#AOd@~1bp_&mkzGh}p^VtOO z`FUA+U9Ztcsyoz?`CTsi>4xq4C_%wPfBrPKd#ctEDWRqG0_kjdZ~*Jgre_acnoYae zc~awVsv70jT`ziZQKDh%&Z@Z#!5X)pwOtF2gl5d-=u~W8rj|<#H$0o|lP`Y0To^r> zeF?UlQ@J|Owcsj|;HO3}HRcv%*QsW`KS94U-{h*E-MoYb#FdND{s`TDfRB!NBjNtf ze*rI}l9!u>*a}9^HP>bn(H=k~v}zfbZ1DKWH@o>GD&xSfSGBWeN{QH_612AB6pz-T z4~OFmP~Gl}RM5`J+76Nyi)&Bn!2iiNbuziR9g>hpUW|oZg?k5AJnvu|;Z*Qj9a?c6 zrR0B7Cbm11thpUd9qU9XnjG{Vq9fAIQDUnk{cKA;OanqCgh{hxdQe(FVf=Qx*}b8k zv!YaSg}<}|DRd(Ywl#7=y}Mc_hL?Sjw{hR&tzT+P_`dTeTAZS_M$eZccx~}nno~Ei zsnqBAMzs*{pJ&jBXCsxAx{6Xca&{n9sKr5*HC(N)sT50_Cw+!w@>t0R9oXlQO!(aGN7 zcHQE;N^rH~RUypz5z2Z(z^e~>KoA3B0gE{cms5?y`y(e&uTVDilN$~{i87XdjdwT& z5jl_BD!`HL-IqC$#I;5Is%kk+A>NSvU#;QzO%>tV3@&g=l6K2d$(oopk?-h7?wJ%= z5;^Y+xUOxe5w|_3;ELbA4PT3LA~`BB33osfFvk-Yig+Gu!#ey(6#IgVuW`nnDb_<_ir;aQ1!PT6+=e9xDI9}{W_y}<$>n%Rw zE_Hk6HPjX};0#8aC7u!wrXIdt^d51`Ue1WiPQ#-|I9`0_#`C`RUBW1;vtrHLwPtpuUxz+asiZ6#b&>JiY+RKH$22+ zIB}EZED`^DTe;p}-hh`b{Gz&DK~YYj2J6XO6mVBHzKsu#y}VvC%*q{-p2X|j!-k-s z!dKGpZR%O@Sj|!x+c_+`^GKX)kaze;nL=*C4}UXLoZLAA-)f1;!(#2?Nn^oh#92VI zO)r8=0>dn7;C|HzUb#}mvPs_#9mlOec|#5EkBPB~rEW%jWXedv%n|}w1l(Re&p0pO{Cf&HW*OfF;zen%_%1k) zv^o@zxsz|vOX}G;C)-X_uV{Ad=D(n-gB=z@kg>ZI{|0zIkaO^nyrYVgbMW;+x0~Z{ zRI58sFDLWrW{$$QFom}LtxK49T+<6Vt<2vH%O3z7`Lx9;(paIpwKRvnCb-x)wl6$- zZqxbKRYl9q(C0EzJU^f}LRbvB9|^kxISXUGRpz#PtoPLDL|nT<;opSl_iKkYpyu1j zVU*X7xYbJcLaVu~buyC+hY-(e&HqJu*xe9VBK~N_3n%Ja$I5UqO}z4nQNcgBm`2>c z)5%^Wx$#Kp_L6aJwW4&186c9+*K%)2GHbDzpoOK9764vC&_m6Y?`|$G2*m( zLhc@c95s?z5s$lsos-)Twfh%5lCC9B|IVT~rL))?aKdwp-Ez;M&qPh;GoFD2Gme*! zH6Mnoz3FK%vn3Z=jRzRUc?=8nU-Meq70XU@d2s3w!DO6v*x!m#x4rx_QJR|zgl*g( zwC@wsDtq~bMJ8;l=-hXlKb)Yk>3jIFWawm;+7tm;;*KHg8}K2ykmIy-NS#A!2>JuD z!mv}u$H`3OWFX9iRxUqt8#vLHgXL^DdhKHn#rJVtw5P zZjv%ZQcnJZq`-eAKJde1c5F=YvGxC^dWIs?X{cS#JrsYFpy(dc% zySbUPSTB6&E*|`AC!dV@a(&JE5O5OrZ?RQ?q(RI##_=6e0#aj{GGb&PaS0UhEe@O7 zN)t|3?0_6LwdoO^pPV3Mku$tiEc0vEM_)|KD&ThN@GjG>%d6zFz*wPar{xJ{`ge#N z*^ROs%Bh0oTsWWQ45mHs6jN6pTSGjwRYP#sXUwIrazvZpm3Wf|So-7*N#5*>vNOi_ zxcgrEzqu=6dJf$OZk(Bk8=QYQjPeEF95{s498e9i=AM6H*li6Zw^w9}^^62ZHnjob zTywa99r$M>r-YuNnSv&vZ&s&V7LD~*&S!_&u#7E1>WXixFy1_Z?tu>Z8^!oGSIW?g zuo>mtqG7w;`~l)UHyuvG4;tG4hGq6BOKxOK_5N1wNQd1oi~lvwl`rOk0N2x75rRc- z=r5Eb1Q&lF^e{#Y;#YGQ{e~W=&iRtX<=HO(zQ%*4b&apEi>zDDkyg-l7Eh#5QNB>3 zY$OiY$cIeQ zCAIS^1;(p=A3@B5%ySf2kW0&Tv^Voxk|Vj~TvKcv*QI_$JvqbBkZA1c)Ex2skc+Jr zrXYI0_Te%S*UM;tg)WC^A@}sfQ%l;X4wnfD{EeY#Q1^sy4T~ois%1+(yW9UkkG15& zk|k4zyKVb6m8_GC*F`0rnX@>+>e*L^IV+bv(Kx7^k=EZxX&ngqxLm5EsjOLPy~<*P zA!cP9CgcN=dI3nA4mOf$!4ZpRdJ#x7x4T_c=Z|QVtMSAcg-jv>_6sx`%mo^q(HCfR zqXZglV$~EB+;+6n*e}v(Fc)d`1Sc11bk~uM>w0J|A8It{`OOU1I3m34 zfaeGXA4RE1sHWWDW`4|==^%AE>J4*Ir)y+(knQCc~cB zousVpT)+U&{1tD3_>{?x-3g^iw&H|4nM{uKCy7`aCbmrS-9pFzVjzAgZhzOsZ?3Rk zbbnJ-LXB=ZnH=Z1DJR)F((!kaFW_Gjh?mBv6xp3p2Oo(SsUIP1E>yL-YAgklX>ukV zo2}XdY8M-yQbps|TD$?vY_{4##L8r{EGV7mYHDD z*e`|LKUc~A+`*tS*~TC~a+0gaw^COV2JMIT`5Gbv4+^!|3;a>8JfRM@{@T25e(Z#;+~cnZ?0OcP+P?)#?g%1o@}SoCWc^Q{DMb>c*+4) z!2GaO25>|1W}U=P94K1c&Xe)?fjdlAVeCPj3J?^~QuCYoo}t>kA!2GUy>rMEia({( zXT9lI_>g-i;OZb2HeO7nS!t&?ADiK|@b}1~Rz^1osFBw8WRys*( z2Cy+u*sRzR|BabRD;2cpGl4Rt$1HNf6hesnY)#ifiJ(`SB7>(dN$a4jve#)0MI6M0 zdAr>#u#t|nkv!PFQVT=VebnAf?R1uPC(}Di z{!~FE9rvYxyG5((&R4fZKpls}2i-J-9;f|P%B=Jc!joIld8)@u&oP)`JGf$()e3kw z2mBk{4p|-hgVx)D!bcRMW}z&jLkdct#Yi_1McHh zkC9dLFsk(eTO~mPTtCEl2XpFY#a_dTg*49)Fk4%|yi?pxFwRN7&w{0xfb}KEze-VH zOQ7)2x=I6ucUR2`SO=io+i6CN$i!Fa#0#YmQV#e)!nPdtJYX=j@PR6sLU2e3|B8HZ zca;XBrK~`v%zx041xP)*%7i}1stQEkoUW9S8PCjr@ zHkxI|I%W#1tq%h62X$ft)+SbmaQ(&5t$^vgt}nm%CZaw6I;L+@0O}&xAFz6@l+{La zA4_Lx4H6;kz;PfX%v@^#oSCeZ^^y$JfohJEB?*0je+^1^Em?>{Q^K;#km{14{OU1k0$9sLF%_5w?jC z3Jgw0i6^U#0c!_nHHp5vDWQc>(Ardr(;LQ20F16^;ctVc`X>J;JIi6|f$Y zacgD~AcaQ>UGaF7;rv448S!Iu*C8a6h&)Q-i?qvhmO%?$XSBeSW@H_l5&&Z$LFBx= z>TU!R9U0_ON5;A}_`m>__b4rHuIi-?NHy!)19y+W$jpnI4)P%76}P0b0)Ioso2&jN zMZ1^_88hyOn^oF&;xozxp5s|c0q|W6T?Bu9VCY8dF_Xz*Kn7tx7!Qqc+h9$B%1!8t zgcY_iEp?2M&l7m$pr*iTv(|}>RKas%M0r#4;V&$iLbY<#XSICzC#5jZF2LVFCY(c}WU4;A2iA z>}+B}dDE)z1kSpZ%t8Mar;;dSTUccQM6Zxm2I~?bcDxWzp9+54oMgu^$G<-$5(7{O zSRK<76KdnPa^_@&EyOgZY1K;~wLa~*uLu3BgO&1E8W)+*dc`c@@s9PkfLAS2=^GAx zbo?L2hfn9c%(2kSxBmRKr_*FXVyq4rUgAeqZx0kcr8D6qMx4}? z6!=U{jIo>AWJuE!lTUG)I;3k-^}{lvZ6XlP<0)XhW*~_VtuH#25MAME;{~+Jz;>qWl{^WEz9;jT)leNVxX`m)7$OoM?33P!~B~X6+zVp8ukiFk= zG(n!xj(@$rv&JdCS6j;j-M=}Ne+&9wXXoKqe_=9Z%P5U+l385ne8nB|5_k< zT4hpzHl8{QI`JYv2 zb*v5%l?9MvJ`=2j)dLc!3u^>9`&HT#;E^!Q-^(~;$X3#6N|&-S&Zw^J5z@+pbt$kwGk3pE*sB5eU8;8c z1OO8dL5GGlwMAw>$9+kdW~u*u8OQ)gIo9ex;p2*JGEukd?7W)WuQ=@Z_V~AeB_~uS z{aa*`bjbp6f-}T?jxTwds;NDJV+{!fTk0tSPY2TU5-zdo-f+ zoopQ~=-HHv?D-*x17J)2J@Ta|;NKpoOexB(b}Xi1zra$+-;utFk1R57t ze^;QA*#p;EFf~zBUD+nHBKw5#)-IRbkC_xnFq0ziLQZOGYkyQW zY96g)w)kM?WN*;_cCeCZF@)}KEKw0%RW)F}B$fNuL#Iy&RzkjC(TRanA{H<)uLa!A zw8Tz8^b^Mk4HeKa_G6loFZ^T#0=?``O8p-~*J(50-xsLdsRVCd(0Vfn%|nv#C#NLN z@I!JuVnc#ZHeXOMTh~y)504RrLm%0bk4?#2PDy{>kUO%#7zSh5yN>lqPB-9Kt3bBf z1FTslh&4O8rm~lZ0HT%(dd!jR1mPD(ZPNz7*vba5_}9&m3s@&CogBL$i%CGfV+%F_ zh5!(pgFDL38nFQVg}-MS+#(410eM^$DBy#r8;pQ~a3D!c*arrVL8}YIc>Pz)uE{T0 z^Mx5B^PmO0Pf+mdRaK1C-ReIGo=>a|cpdtc}kQ>20r9gu*kA(}!ss&`7{$4@9${v5O zhksVL0&M`hGfWp$DegS6a9N(X8Dq1xw7)0 z!Q=7%4|Il5C*-Gy1uJ5S3J-7V6iql9Hoo_W?J&T%l5M3-5t48w070*WEFhVnfkYwu zifn&nJBun2$ju2@YutknF}UjKm0N|Hu`M>d)hHBMMQj6v*|LgQV{J`s)4%h}myLdj zWhCf1T68W-kXc4ugAfn!fp|iSRBK^n-7WqD%+yJhd;B1wl5s&ksmL@YN!pkK5$r30 z7hQ7wx}l1Fqx}b<-edtI*g1gEI|7wyWfO=caEjGnp{N$D-{?+9=(xWdfSyp<>qo2D zE4y__M6V&^o$?CO%TC2&wSKjxW{ffl5D?ZnTBI3vYNgUvIsk>N+@avy0O~>a1ic~P z6Jg+Bw^3n@S4oe_H?QCWqS)G|WJ~EEPc-5&b&JSHmb|#kf_gguN+?%#R5lJ;vWy;RfP<4Nk2zJBwII7ti2*bZ zrIDZ@=za=v9TAP&5RWSZm0SI7)-Dx|S-J?uD$~K#k?8~@KK{lj4LP78;f)sltw2K{ zdY?T`pz<9Bnru+OK}IF2HS3Wo+1grgv2LNPV@?ZHBH$VB#6)@0BcdGaYM5-9L}0dh zibt1Cy3ELTULp#@!-P6nwN>`H+lJ+ip?f3fv&B0of6bw?L%zIy!yV;W66d ztOHHSQ`fdNDG*0{n+_e^I|H{Cu!)ytt1g-uv}Nu~;0X|{soXD6gI{bD3EOAADpJlc z*_#OTkZ+XISqGciT27h&T~CsGgI&vDM)5IARP+anX#id>H1H*rfjf9Wx$DV6-XeO< zyt0U1Lkd2pY1L0s&;K;U=~XDtCj{dRqOoDv(g~5q8T%J4#P$fpJiLKRCYM%-bI54T~$37n)pJBfKsBAgE-5g z7wK)Q?n%xP)rLq7mB_;8xCyQ#+WIO~X@x-WZdJ+$PJd99t44*d$~n;zsj3ugQk|rQ zrS?;*&lP>-ILDl#)EOX)l1wfU&y(uL8QM(RTJ&=Wx?|Bz&Z4J`4qFmHD5Ms$%|Vvf z9L$r|^gdrZXiN0XrW;a?i0yh#MBsaqimIJ7(V6q}KG?C1LZWp;LM5=6B8BD{C!#*u z|2M4;0aA~}l!#WA`wuF@+R7nR8Ob)@oG?<|ddKokMbSDUd!p$UTA;doD=qMRLVGA0 zbXz1X$)I0FB`DfXetLC$t>RkBXi+7jE&AIscGVj=3-q^#1(h`4dNk3Z>$KjKO^q$2 zpv=EYG>xVHEgS>fjdCb=Y9RDSJ_0Z~*F@D@7qDIpG4nFbvR58Y+ALAq_}C)wK1?|| zS{z{}<5J({aF-0ae;Vz5Dpf|zDMtWGF8e5zDhkyXs1youHZ#M) zR|D{^c2oXN*bQo?E~#BqqlE!vA<^LaWKT`XFws5kVy9qr7FP}ZKAy8Q2b~=)J39KV zJsPx2eIZczm8yx@yNJSLoYcb-0E?wkSrr_u3SG@F4(niu0|fyw%k*eHZh`z*DCeOz zbhny5`FDlk$8!*(PYkd|b^$w**V1XD4P!6LAb9trm{G8?mNQ5GO%(hyjJ`l+!qGWx zfsTyBk$@@-990$s3L~OoNA0!|ec{B)jXXdi7zLtI7o>q!T2+e^K$~wwvU!i)T%OzU z?(sw=kV8eK9RYtjpu`Y+4R*YuuX;>opNiKaFr8Eh9a)P+qE;C>iHUQNR@#E{b~}kv zN}ARjm3(|$$VK*1h(maV@}c)&z%m1fZBXE#e|u0B1!!u~@W~X+f)}f5-r~}cob_5; zBy`6lw4$S>4W!h>gj19ObRiEI<)0z@43wEi83;JnO-YX!Y&F!5%?ev&Ax-T0yLGRk+m|$S0@Bak z{C#$S>{ccevYB}L&&$s6ByA4=g8p9E-XLzn7TG}4=>8D><&+zh58&CXtuRpx7EnU4 zgs&VYJ4e~EOoOwci+*y%gxZ`AYrT-TL3)`D1~Hk#I>m8xADzsA9?639aw46CvC9hL zG!M~7L>HC*FJ~vs<0&eXpoc)1^tjA{(DzWG5lSi%gL3fFuNc+&<>W4;42uVuRx(q z2;9Z%9{G~04Eykz+Mz5AhS~?=vuY3pDP*1}TA0M~gBcEWBLRru#Qe&^A#x1*20b~U zVNo3-R$wLplT0F3Y!qpuDY^HSQxPSU*?UR}l{h59Y~FVDS0kc+MS9XXPBF*+px|*z zC7R8k5nx0#7hRQ@7wgt{FM5l@ruO&l`_G7&A=McGGSa<#M|xpVcp_8xpsluS6pf)n z{>XWi6~9$=1mJGQC)mg|3h`@cCYigq#&%zV-3bRLA9m^GFoYW*Zwh;Ns%~;hV$3Kr4J;faS9DRSpr`GUb6!p_nFbElM5zP) z+@wlKWXLvT$dVx)4~PsoFOSWXKzcXiYY;ZSj50Sd<_kelcd>FNpvk367^TU&22bBW z_}8OlLn2@Fjtz1f0Qf4}(6)ow=ax#7Ocx7*hF(M$H5j%3BBZ)b^r%Qo-m>oU)^wQV z3-LfDfhO#f6DoJ{V3yN(4&j+ch6`Df^~G@M7yC^#q%5z@*JnJQr_<(xSy+Qe3o`3I zVal{Ex&TN@tDX&aAkKsW=qXsp-4JJXSE~Po{z)Ifd851H;7>3aGR-!U4G5ZN#cW5< zGx~3;bSElhhoObjoe`Rw9^E*}u}?u$`~IIDc+NXT_{a~q52pcNL2iXq^#Q6i4=AX? z7EzAM;Vk!H5X0rfma}cgp9U{M|J-3734%mIlH_n^hn$@opSqLi$Q- zI(Is_k&m^1bKqsMjD0|l+&?9IdIZh)GmjPbOQC>W6NZ}GHG!%MyXNjHg4>-@wb#DI z;{W>cx%Rw`$IK1b^ICsD*S=-lT*p3pWM>ZvXWMNhq@24J?_A_OjsI^h=g)ss@aO7@ zbL~k5`}tn{4BzM4huV4G=-89icTr>O$hkp#Ugt3Z-rFSS`;zm=Cg+;IT>0$16X-GRJ<3rX5K6xTBjImaM1yIWjP$`Br*AWmcuP;DJ@Ham0>4K z_S*Lj=YOZ%u0Es6u4Xv}>}pmPe_3T>&%dhQ0<3pCSFofdvYWfb{%QDr^tD(jgo+$D zRN}ZZM)c22ImyrU#($9iA6yicYos`{;Qm5GE4Nv(h6;A~gtEo&R1PVyza1!IOJ4jD z&o^)%`LnZVr9NKN+PI>TCoYBE%y%T#aN@Ds-h zArZ2A?BADtUuxC(26aoGmO4VQa~~kBAbLDEaay?&(V3mWeeez(x#QZPyN>wASJo{r z%v|5^GdE|p*SlQMp1}o)V0XP+SMDsHHP%@?Z(Jx|b{^G*;>G9l!!2-XOZ`S1#;Nx> zeDXJ+K$lZ%N#dqVeQa`-b=$DiI$m9T5iDBK5MRjsj)v{r$#$}@u$F?`=h~6t;nQRV zzS?@O+={SU#M$c2C0B_HgE)g?tFaAZAXp*WSG2m$BC zyTUG3O+8#wdzB%8@~^@hrEdAQ<|60Xo3qY!;rQo&dY)ClwUayD&d*8}_^mt6{vPM)jbLgkx7=v3)v>?V z8fb2d9(^vII^X_on*>cSsB^gVLUP2HxWsZh!Fk`$j|1nMN3a$$pEY@##UqbYI)9$K zu4$bVGgYvdXtzkkbX+2sFTzV7d}Iwf7vzPjtR?qwfScctcy+^hAD9a!%PQg0FU zKGC#RTN8le8sT6A0v$Gm*_UIzR%B?_w}pYn%k~2PWtIV--LjYQ-TdfP?m7WtH=hED zDfy4D@UaD%zRhl4&m#em5@lC#5fW!OD-3=VzrWqfbB-0&f4@gr72DnS-d)JgCf8%M5H%C`#DE^ zTH$`of=9UqHYe|EO75&(T4LkSVN|dc|1{;04jg4Rw1(Y=F0K}S`y%m^(!hn4;C5!| z{Hx^^-<@)0SFY;W7{+M6Nm;Ve2Rj!n6puQ#!1fRt_q z4M=^98qK_?cAp`hn}k$1uZ`dpr8TmEN@vVo#SQfxh1{-<5KhXZgc2d)MB8yzA-^fE z#X(eq2-fN$Mx6YovfSyAFQmq9FDW40FlMBwKb}rMe3e)^b3c^GxAEZitZxdheN~s; zb+01k3;aC$TbY{ED!JKwgqaEkRS`nAp>lzOh+V^QNkc4jr?!o9# zDs}6%bXWb^Cqw(U+&c8h!aoejT*f74Add6=*nuKkg)>9ZV;aw!7(MFA!n!{W`NI&V zFgiAKO4E6BqhJ4eq~S@+pVfeyGPOr#eUF^&!ART*_@3jKDrH&U_Pb;`f%qt?X<(>_?9a#fvZDA+&M3K<6X^9V{=almx{;P-8SNspEv)#*0tP=Zw6P zS^}P*!A;Dv501`d&o##H0K(O@yAyhq_l?!jQpc-;oUnqvP@LPFQ#9(v>5!RYBJm!VP282ZkzP(f=#|%;Iif`kyIP4kgZw;R#j)8p@57J>f(Dp2> zyFl(%hvT*3_^sSv|1!>MZj#0r+oOWAkbRAN%LA@g60JhJO>E?>?;ei0saLq%1@YpL z^kSeywOIOq6OkxRS+zevY0ptZ1pK{t(-OyXpb(pQxU7wMNF&sqZfCnf8F2fiIxlad~@1^evWHiz;&IhwyIr3q*9IbUEL)p&! z_y&*Kzyg4^3b)CRdZhu30hQ2`oTqzeN+|xc07FR2y^xm0XL=*YRZ7cQ zieN&^uT5P$7Afwk3PJd?AK(xL^w02P82lyUgu&0%e}njQ-z{)2SdvO>-t5v9F?h|G#W6wo*u3L1YA!L!MI4?KeW~ zK=HdD`@{KzVcjrX@lU}0=HhgDp3hETLuySP5)m;&xU~5}256ZmFxrs%{CN4@!+!N; zH1}5KrT+YM#S=%52 z><4%4GH2Vz7u47E)Yts2p?14{|9_Hk1rw63uU+$;{@PPMguqIJI9d(4d&BXkrJZ_r zzke<30B1DV4B!_w>pS;U1icOBP zS_+48D0p8JE<1#UpuZ5`wWn1HxqDPzp?aPC*ySx<@>A0?k%FPvN(DF$i7`S#;+~P- zM$1`Wl5HZ_o{~E&La_})a@mOY{U<)lzs68}rA$!P_ajxjvjtH~->Pp?m)-Or`P?2@ zZC@#vZuA~p9153BNeANkD1+cp7;cX~=2?$?5r(Uiz`E7XpCZbR?dt_H_}RQ=eMPx6 zD62G<^_@UUW~5!Mg9ipn8G*gr!@#l9GTfA@7YyKyjGALqONo4ow+PPWJ$d-u1UC58DL!`4?KhUSF@23Q)2*+27TWb)W^|w+wVPCnA zHNv>P{TgAv)Sq6WyH||< zHu8uFw^%;AiKYBBu9THrU_aPeAN%+Q`+LdePJDb(QG3e}9achrDXR#WFbf}R&s>qWNk)ZyWtF_=h2|!==m?^g98`9Aq=88#>;SlT9Eq<8qS>JdWn#i5b3PxU#eFbD% z#^B{2k1Kdo+5+|RQrlaG>Fnf*&x!&DnkPY07(}~t4E4sJmh#X=DSJU;#6oAqA$H_^ zPQQ=qwJ9CV3*}uXaJy6zb~R@xer}--B&!2?b-0fIcpb(MQi?^)j^ zr|3YSejLSSUsajCR3~#!*7qQ#fcD~_q8oPEbhQi4+p#K zyLkMfd2DSDZl{52a2+Z4YtI}{hwbAVrQaw3D(w63ms;Bz-?CBvO$;P1I16W1;^q*q zY{`H*jP=d$#!l29yp=-dLj zcRrQJ^xXS>Fw^9Nj(Xb0i_INSyV} zp=kPXDb_cKtW%jM04aco5Tj`5sk!g8&A3o{)@Clr&2=In*;9||q?)2;Za=MHbo`)V zbNg^%ZpXAC=j7S4paosgA6Hp7Oh;OR;0m_^qe~efJ{lDfHVjil_{!G=qt|}ULxiE6 zP#BDUlkZtyNI<1aZKM)6tttBo6k4ieYFlAQ!nHYXV9m^K4b^VLlP_w()XLEml@x*n z&h03=M|yB>qqK^{>CdpH!lnnmxLJBI-Si+b)}Y}mZGD|AG+ECdWM38U^kcHVUkb{~ z64TAYTHe}=KNva${lEL$Y6cs2e_o+KD^m&&rIGPRg+K-3zrCBEtZxC;3MG!8X=!)% zMXI0^pHK@ltXGObE~1&>V0k`X_I=5d@Qu?hKloX?0utY10QR(eix)2+SPg+3%C0x1 zKCh*&l~Va;BBwEB+N4{2H`&68ui`~B8@2=Qs9SGw*>^ce6tLcRYCo~>3kd4vka6>g z%64?1hUJ9gX7q7|MdL~({n3SuD}}xnM7{z2o+#t%P`a;+F8 zNzxpNgp`q`!zN$8rZzz?7Aw1?FIr*NffGl@r?*o{Zv8i|REBD|tQRsFe_FVhSHITV z5p31pxU#?y^{Z)DC}GeQGcWX95E@GHToIx}lca!uEdm^_+p@kPRlt(XtW+%Y|37Fb zT-%E~a2y1NYPChXrJ0xXbUqE5PYz&45vshQ<=qHAkB%+l86=BdgKxQb+3$*UrmwqE zkn`7~>yict9Lkx&8ljW&J$`Jr{7^`E#NDPy>Z?-Zwp@{mD5CDRihsj*SUyezIS4Uu zmf?UwGu@U)0C5f=p9YCAev&FQV4G9`BW*ytuvrQ7b_i5_rBsmZ0LNv9(l3xkZi6=S zN2NP?cd}~)hnoK^&nx~0T=8lS`}lQQnlA5RQt5$euljnIo0baGbF5W7B*?x(rOTu+o1>ibeW%4^RvwSJZ65Dnx97VGtd0YF+VfRPo4RhXnrcp zPr3OiFh5FzMnyQfVPzz*!S;YQruOU;y+17aPkRY zCjVg9-V-&h;L#p6v7_ZN9;(e(fGq#`Dv5%Zf}=uZ6-U*NvQCf~#jVXgBum>-|B(W% zFUAv6f2gBP_9&uw;4QD;o$JKzo*`IwsTJMpJR_{b!F@ORQSHLbrIoO&QbfpoNa%dP zO?2|(CSKq#`wxK!@?e*|xsP`1Ps?`mO_yonA*m#FDccp{Rp~USz%D})HNkHA0qVf? zuS6&4?NJa%<&B*Hm8b9G*<06}s>;#9RoHGeAkvxKaf1 zf+&Gk21)e0P^3631oKp)kN!ep7bH|t-?(E1$*i%pk;myo0X;?DK0#<`jtQ*h&F#&! zptPyIg@YJ8+2PWqoAY>f9hc?VXW88ARco_|pJ&HYXX>tDWH=4^^8%JE`kc{}Hj(GP zEMLZw^n_%tln!(xWzJF$@x?yk@9JA-d8cu94W^$m1_6Hm?UN`$dNdIw$j#%Z()Sl| zQ%95EFMS~AMb%P6Z1t=GFocBtL;cdg_G61$3*e|Q;H>YPxmJ{MF6GTY#`^Sz*sp(@ zK51b6=yPN!*}AcxUdcb#hYhOFld=w?X8XG}{_Ep!T&co!^s_k>m#AYZMQ452(L^5# zHOX6!t=|2QTK~7;4{K+An1d8;+o12;$M8q-aZ|! zqNh@Qk_6})=;A*V$K2&s4!>tU!O=@}OygY@1<{cbFqVjx1X>t^uz-rEf$bIHqa}#! zzDT5Rw|?h!vbGT`bGvmpCZG;Z0kHi5>V+)8QDh3a4a<1EVxsWNh83Lfw(^}wjKNMH z*|5QxfzeCxzH4QzHY`hha+Gnr+ejwecZ3obB0Xv)J3i-Ck}vjpu2{P%)>7|vBRW;P zAYnvGWT>1}N+s_hRxndWvMU6wPvUncmDF0bt}( z$1a~qW_mQPC2Z`&9fECC8_`N36$kfu;19e%~!{4aYX|YITGUE=cxEv=epUeoY;9o z;=y_LL&=KH$rh(scFS6rO+0wJ8!VCOkKzwWrv51E@<9KkQxBi|{-FQp8gJ@{m`=F^ zI`vn+nxG<{T1ZrTL>&Q0MA?at27#9$#I68LL$O)F1nZ)53=}W~s}LoU=<*DlL3PE1 z2S`#($iw-&xehdqF%ejbyh4&g&6XnC2{1yi-Gq^nu{Xbn=}fvCsiU7l*o0iF%liT* zfLHv^a`(Xg4sfI(GC_U|N}?mxmS#Acy)j1?WQOXSC4Uclf}ztIdj-;M2tw2SEm0Tmb+#$|R(lXNwHM@XXz zp$_2XsygJ59z>vkN~0PZpf|M%8;IDV9!LbbUQ`}8^b)OLQ2~FxVddhfNwA(?pq+XM ztdR*knyk*g4qWPv;;F&f9j<-Hz7O3k-s0a5*Sr(`ak`fdU~hGygknlKCHtqbacBhl z2p&r$VLrm-HQzY4em+Z`FR0NqzIqmoOd54Odv2- z2u8a*Fwv4YG zAnW_;QASxbm3gq6PvkGIhZ9A|hlMmucw#y}tI1 z=rKBrM7+QTIXc0u`;>1_JKIFng(cRI9iSC#g${$*-N4GJK z3hLcgbLH=(Jh6D#T3jss8$NeR?C$x8&WRi!KIe-BVPX!J4*{4A1qEHv{By8f#r~5) z#fOG#dI&~z+m)#D=I5##C)HUv(7m=?$tzPP<|_Tnxe~=M&+40ww6 z!9#%h2-z<8KhKZ=Rv(C1T+HO|m^PZDc7VspgdiLuHV_D#nZ`I+S2b+P1T{=M9=nZJ;{KPt&^B$5xL z{>V8YAO4iSPZAQoFFSo-r3t?MxIH)w4nv?JR|0?qInEGMnCaza&8f{<7if(~2dZSP zCw$+d4HjLOX(x55HiEuf$a%u|QJsEGd0+nq9}ohAd6|4Yb5OV4Rq643=?9;t-QC(* zW~r8kq<7S2#p5kA8_j zb&!`)gn(fi30qp&ikVK>4wEg9v)>lS1)XSjXH}5su%>w=_6}@+IYm=EfEkSkW7F zqS6m(>FdaKo8*FwWAT|f!pp^?jL&2((;FK7p9{1s{NS%rDxdoeh?T^Jwp%iyGKtTo zM6^7;QLFANehbCf5Q|oI2odMv4G=zJE0hPZMQj*rm(Q#oAUR1$uj=43yBbNV8i{HY z`9_g%)Jy;hWp{&B}LWF43n?cv?hM zmyh-BW8ThfsBN`ln;{7#f27GDg%cOr;o1%JPs&^yovy(E;b7gVU9X5jjSyVz>3EUm zKjh_H@I}apM*>%CF1z^#vJkB)M3nE^y$iRYy-CkBr9R2kk4t;vbS!V3Yk!mf=d^yn z9Sl@9^Lh|Ql7ka_0~+vr5sNX}3R-m{b5`&_)Mx7Xq1qnSYPB81;(&pC?cRn&)uj5^ z>WMHHm4Eh5v2Q6lfA2K=mam*&EG_7;Qwkei1PX-hQdo^r~G-J`%bUz=Fh8Z=E_HzrpPPuXPbQ4DqmLV zmun@lUH-fzUpnPWQomdSGyFn*tfP)mEVxr+Og2E%GPgiQSHJ*KcBLkNi~#1gXTDXR zxDvY4u!8&2sS`;Il;EzeJ+qkfid?!_wt4AGNS~NX-%s2_lishz`QKI+%%E6d%ffiM zpce}y_T)DSC38H9)!{_duyEoVEBf&>51xQcA;cxHK~OrH3K1yIk=j1X;L52nvNkh5 zEObtXbQ8Uy>t3e$uZ2#IGJ>MBL}2EoS>UW52v9XoBP^Ms!7bR$sPv&!?L9I)Jx$w_ z^5sXEPRSC(2Z=&OWw0J01wT7mDC7#n-*;GGq4=U673ktYG*YuzzXK(0X0w@6C~y~?&o;i^LYGTT57769#6{LLd-*9}oPPExr$ycf*X#&edqPJ0(XL)p$Ca$$4E{9C;m^!@{84JkuaZ}OmEOWhgbojo0Zl|@i9cB^%jy?^bArY3 z=VlFdg$shr)#8VMNN~hPidZJR-ofqj&miOFmWi(?vEDv#B*5N@q+Vm?Bf&Wu3hwRm zgTprmhi}Q0J0_T3W*84d(c8#KBswXaJ*(W&X*$rzG|WFvxhHQ0oZrsJ#H3hT{MbjgjnpdFvz-`MA`Vxyh1GcW(>HY5W>V<>HW-Z^bB%0 zqPrnp$8I~Af?+twD}G32J!rOnD{@Ou*mm&$o=gc0LmPLB?uyDIBj!9vP) zAnV)8n@ZC&z9bf6YVW6=fPmaQL&~L)_4F=9h2)T4_WdKwmG*%SgwGjnS{9(CMff9I ze|s`?fMbPpdHkOvlBJ*_lfWeoT{<4nvUO>TjN8Deab6+J)183dK3{MkdS!4`QA zVHTps&4;A1RB#wcE&C9in~9}3SNMH=Awxi`VVVzdBuYlK@tXez z5E{5Ws)LCqv>)-7a&jPvYzF<7-fI;!Tt8xI1FnSP+D5(0#Sk5+!*#h>vM6%~H)Q0p zfe7tk^2L%RnTlsbE1DU1*ry?xVzoh|n);e`_I+&G3POcC2<~78+}9c~fgeNb1(Ux( zoVUr>)FJQGm26;>4};XM0Rpio!vX+Y=O-b2!mdel$y-fJD?i?7J&FEapkgn7=)Mpp>p*neP$eaa1tT0%0g3I+y0VNhb!e`LQAVaG)5 zDwGy3F?OS@pGAoFicgG1rht`IfgnGT$(5;KE!8a!UVySVRKU%}r@zAhe?Np{(r`Q> zvlxy)DsxKEzo8L-&fX-hFalJzR9LN0v8z28nN~2Jpr!`*&9JNVxxsxg>?RhI7F_&l zVDUps1(0#AAmmOvUhE=Bp%T-_i^}a$L*31b9}?v+{xSoLTLep;#V;&QJR?Q9trJQ- z)W~D%QH-^Ce+*0P^3+m!i3dyQT!nP5JlM_lCdKxq*RFX;M$BYt8>WZk?P5Z!`4DoQ ziR6Eb{L9GSYLB`ENY&F5t8r0xDIE1NyIJ5fxzzmT&_3~y6i=<;aPa@*?p?s6s;8v5LdTXdCOur-q5?oeYvvGJIqGwA1Tqq4|#3 zv{RzBi+PagFlvL4mBd{_=LZ?JaOMI~L0-;g*Y}*2zyjpqvtz1sv{v?A+LAi!YH#6h z_+Wui^9xml7qbivJ2qO`XN@6o5eynbYGp0NRN-jtsgkr_6|Sot&kKrHnL^A-gkDwE zZ4xL~)@>5lRMp*s>4>B5_gKZG*N=52@RH;DXpS>!P_h#pIT|KT(J;2ljgnte1T;`# z-r!fk-P#4}1Jq}Q_@>F_l_#haMS)Bw-X~4$j>!{zNVTw>4H(`=&qfF{Mi#7`7jcLa zd)gXVTll*t^i7oysj=jfs;~p##S^~K`QOXWr}};# z+@u86Ta))@TB~XmOM{Bt9%EfYfJopfi((sAvx`s*9~#vM+2|A3us?7L^OZFit1ppp zRD5BqMO?zcb-O2Z@d#X@k=HEcxVG^yA|;X#y@wXU!}k+ISPdBpk-=E=iER1tlH)M_ zm5Xmhc-3L;vS?Rm`}^1%`4|A>yI zHddQZr`#(^q0;Itvhn3JTrRcGfH`4CX~v5_xl{`4?G2yiQ81iX^r&w-3-(vi$9Pel z5}4N(%Ufo)ZB5qw)FQ?dl(WhYb*B<@WqXa6+>b;UT(Ulf`%jjU@LLiT;qA0`Nt&Cq zJ1bQG^<}zNBgy}V{s%qaF{@uscw9$HZ%h0vJ0X`DX89k){AmA#oQWv8!;+;0sbNyZ z&2g>>@Ehp%?^v?477nWpIJe0S!UUd4y_4P`r?QXiWP{w?dxPxpDZP*AONfote-_X? zyVyqxxp8@G(4692ex&RskPfY$PEDCou(X*A z-p}#liu`}tIkV!k2H6exM0xKTuhgh+I*LNXuG0NVPG>kXiag=2@m|CGDj)lY2+hUE zLPAB}Ig*Qa*&AfvBg4xabBf8oziQyiRmNj4llgQq8#Ne|Ie0l&N?uL1{fsqFKn}u_ z#|MXpZ*q!Fj@AX7J9PEjt3WKXC@}jTto$|oIZOqcM%=9?uhFs3;AK2>W+F{`*9CK%$ zH_ukHKAakI9XLg2y;%6}4IMm7(mYuMqlR(6JOO3l;hzSQO%$bHCp zEb*jJ3=W3&_@ZABEp@`{%}#V6 zQo$Ui%{PLnD^2+H7WyKrobq}_NO$LM;XO)rk@UFi+1N^15uLV0(qu_V+V!O6(0X~y zJ0C_qo+Jm~a&U4|_+Y=_DM0I{3jWM+F(l@@AAu{HaN;e`Io_~>`-O%zI|qSFlk&D$ zGq$AEj87}{*1blUy$iUGdO%fl?q2Gd`g zC4TnGC7e*AO+D~$(!u4wfFlfEWUPNZa!}YX2G=}wQh~Q-kD**39~S)Vx8z^^EegKC zU)WLZWtFS4gW$B3k&Vpr1b-aib50NaJ#jXVT3@a1(?&Ee-WyP~eoIf!Z=cEPKQDNh zF9iqH6#6VVPJPbW^B{N`rt#}6gB%3`$;MpI2rs9Q&Bhc?g!! zlX?#cmqQU_&F;xo@gjIx5FF)s1e9lsIF0@Sp)2=3F_6wft=~-^ZLB|zq(#o~7pHr| zdr$Wizk#S6266Aefbg0)L$e@hK2X+XtPU_Vzmt9a41aWLvFD*d4|C0YlP7$LbHm+W zR^m?Tr5~MQ_%{Q%Iv;i>*7AXdjoMpzP;Gf4hai~zooCekP!j8g&|9PCT&jn5DMKRF zLbG!~;$5VdQj?z>jyWOBS~%*Vfb&I9>Rn%SbJEY3eu+(FN!KA7q#kwjPyDyaFeY&) zzn+cijEzV5Tw=ax);U?o8@^(jjkT*O?~fn5gr?44IOSo#^X=4!9Hnp}R~AdjBa~Dt ziF2(Ni{mC=S<{k*;<_CLAHRnbc4|3muGDZ%9b&jBliySC~Rp&Nj@t+S}C2}4!<}0?=ZW0v>2lV7zu)b*dEbpY&kXaRly({uu59_+H zFzk0Wq}nrOPgO=B6c_t2YVfKWLc{#A>81X&rj>@!OI|d>jLjO6{G&2cC>3rAahY@S zRHrobu^Lhy{ULq;ea*KFsPe zx!td9d+1K2LiR{KVX?zm&$lW4W#vyPB972A-Wn8g>l*y%QhjkB)4$bcRBdIvPGjv^ zESj#Q)|nNbi+7-#9;epW*L$(hT;xS8E`riPsc))i5kFXjIQJ~*&IAozJyLR z)>jR1PMIgdFC<`yiX`XoIWoCbgm1$m93&?DhIP!#ALlKo@~!|_}qEHZ}XW?vbBajO-{|5FJt{^VQ!BS-uB3xd>aiU<;Dj-&I6ZW#ZW}f%URW7v7$94plm7Xf z6WRGbW9MrGZzc{*7Ss>&Iotfv{&g5yVNYj9p+uU~RR^|DXDB)>=ka;F6jYzdrpzEE z1HR|7@l=GmOk&oY%g^L#GBS>pP#zcFYzHBk&gIu5_hR{N_QweGFo(6$!1`9F0ggA?d0M5b;uo zHe8&K6Yy4!=UdN5VaCUT(Ijo_HpwC7=0jBXvF6a~xiR7WeEFnTp zEXH5Ehx)?iKQGi+TCTWHu~cDMpp@Vs^8x`~Fhs%_=_*&Cf>XhM2WR(u|gd*jW$5?LhqSUvUe-=4$yU0q= zHNaM`SDrHM$f3tM_VRWo*?X^{qeUCDl?c>xif6GW&0pI^D`k9@>G5GW)Z*O>4mhe0 zg!#L4P~F_UiYZNA7i}AR?%*&{#uNRk4~X_{sVls-p)Rnu&ikdDT^-38;oawkw}w?5 zduwp@0SPX+-0caswzIG8tqXiv=iT>&2>+6$o^boQdbMX)=c_>Mt9Z+dz72@Gkznr?bHei<6)~w#5Gm>FgoaGodeZbP zPiV-;=sbQV(j)SeVv#W&gvNo|SdJ0=^2{?9!8*py{`03K$4+~WpX3Q9Qs+jiG}3v3 zQTq~en6tkKoANYCsxMkDN2E_{EIq;swlvyCi~zW`HGXGDsy%#@>xAHQ2@#N_^&_=A zjT&XyC9+ly1V87S$wd|@o&OxZ$v6R~kj5oI409Tr%I<_=QEaMhf2V}vb~G%E5%>b5 zph5^>qbbp_iUQoYjR24e(Xa-H$)5UG`VAWZi`T>?=3~N6X{NU&q}~q#D64mmf*V9vPHyb8pBV3@bPMD`3&MyAWm% z3@N=rVMz5Jg&}|ACwXiZLqeN#+Y{d80Z1RT?K4wqfR#L^3RN!FE&Shz#cf0IBN0|7 z2g~}?dW8&XziPcsuRx@e`#_{WCoW{>^2dh&)u@pZo5=2g27&<=msQBI7gks}mz{a= zm=+slAkA9hRuE}Ktg%z1J{Gqs^QhpmMQSVCZq)on9yAnU157#EJwZxY8?jQI7Z)dn z&>6v4qjr!=Z#g#L39Z>`< zfWbk|1$zKkD_TrrYKw6(I!=6pF(oOND;LHolPYRb2W3!;_%RIfZ1fq9&?wS3O5v1y z7>U@Vs&u2~B(}=hh85rAj6=-0M^Zj~=AEb%P5; z*xlVwH?@$nG;p7?NwgW=Y&O0Fd$p}V!3u6( zz$=@bHWsZ;Ie-T-clgW6yoJLG`{L);lLcZHW;sJ9lt~t+HXruk@Vr(uo8*Ii{oMMc z%ICrn!jM$PL;lj_(alo}9lFK1d)yRAXD#2vw5$`DSbrdIVli-mBW##bWJLZ)O^HF|4Zj z7~}z1KcEL<{2QNZS(8C{Wf@vhIhpyzM9r*t!H5t-HRY+p8g^QtGx4ZiK92!oN_X(H zF+>lom!DV5=VYowSmIF@N60xJKmyOIT1-CMA+*!_Eoo@RM}R;8t7r<}(ryl6cvG_f zl^-m7wH>{mUeVO=C7aUI&uz2r*iKq>WqXU4wh<CxCu8L_yE z5czWL{i#$YaApsBnBiwMOKaM`qb%R{l=}l#fUHYp|E~~3?KfoIFsYPQe)>lMU6zUU z#8v}aEfSXMZYPMd^ky^eeMAjUIYg7B9HKYEAY#%;7?0n-r{p*_jm(&TVaM50%82}q zx0c#RMw5$w%85Wd#OFVPu2Rx5qh*P5jY7(OfvO^SK~-#%dVhHoiP@q8?`%X2r+BkkwIJP+p?sr{kQvnaC8qd>~N9`zWkj~xn0HKJ_@mST$M~a4?z+fJ0ID05;?b6CV29zC)K1!zCweJc% zLPRG%i>9SYSW~GoS>%PBtzyI8mpmqCzZUIDq^ZEHc+sdKmT<~=>tqXsa4R4b?C z4OG9HItXTeZf!xU&vtPg$)M{``OzE8liL*ju9I|S`fTkYC41sX<5N$6Pwl4=_Y{M~ z?fw`MD$uROR*V4A??HZ`of=WmD_(7-LpgcOsGDEh>>cQ2S=B;F?PcYTlAnbkzD>HA zHDEA+S|1R@&VkX*`*s#@BNm!bb33CiZcQLsafpA2QF{*wG&t-yX%H|m1Zj|?^g1(! zexCzd+&x-#=Lo*qE`Q5p#xkGZ0NphF?avqU8NZOfQUEcS&`fzOG-_i!3KtYTVBHIS zN<1R($bt7&N?(MB&N_D1WNJ+)VPM?d4?3IQNuyS%T(kEZPMkX-Hw`StZzysZTLnQ~ ziNq|>fWQnIQMB$zff1Z@+&v4?f@gz_$67T&JDvPRa3Jm;LZebf568OP{*n*S8=6CwB&Vv-Y98<@d?bv_VU{lpEID)P{cXtpQ_-Iwu@oWA?AWJ zQbwN$y@_ti`WF_6f8jrU%D=FSjeKjKe_?%}{)Ok#86lI}#}EfY>y7SI5`SaWiD&6V z@|*G^o5UvG#0}@?NYWvZoH!KBX2MWpCK+FxrF_;nuK9DDF_a%{@4V3YKX;P z#=hf^U4^vZma&4`$3yz{?g8MyG=jsPO1)l}bj{##|@1!?^)UwW!L~3*2I5<75bP=QWdeFDon-cb-)gQeQ zYa_30G`nnHCoqU`<=W4%lHxpqUvt}O$(pU2F={0artB{Ok8kcFnO5u-!s--sn*&wV zNTOQ@t`ZhAOFQIAdEXiu zLCyw9-OVcJ`l?DNF`*8asjZ4om}RXdmq11u4+<3;C;qIZ>9Op1$O%7at$wXr8Oc_P zmci*!y@P@t12*Q+_W-t*1fFWJ3bi@4fl7Mtz-e{iiB^1mMVzbT&s+`WC$j}%V7Y2b)|@?UYWR!ox^Kj-SdkmQRu>JQPj2~R&97FF3P ziMR-56IR{J_>@&XDg0LUO~~(1bEgGykpumL#hm79IgmJFMZQhW9^s!O8-&4fgnVXP zJ>|g5Y=LUa@|&&#Tc4>UCp^dSmJ#7VY;XZr+!Yj)PpTjWT?7ZPtsv%Vj1R4|Iqc%r zsYH~eW^B1D<^Ii^497N4Pr09zH%`B)1~Hs9Tc)d?@avKXen&{PW^_QT=x0y%?02kg zfqWEg_=#pbtX^6iB0j{U&DSCBCXF3Hs~l)0&LCO9EH6!&{lKK)K|nDe2-JHv9Lb=p6^QRmIZ$1BuYe z4Vjq8&}Iqy9(PD>Dgu1GSUpxE_NpDB9uI!J(J9d z@A0RnUvxY!P!c}+brz5Bz~VN@s2fPySO<#sxFry z{3odxsY@I+OzhjFd}NcF0)I@+5nj(ozV`3BVRkZ@a{mk6TeQV&{IJxFydbe&Ro38l z&8GmK{0rN~2(u)eNxA<{2^&pzrQFY}H>q#&Ntj7XdmdxRG?y>>ZC~_OG&Gw8Z5*Lf zl9lO-GRWhL_K$YzVC+Gh*>p}Zi#5|tfOQIc-HS-M0~y7ARHhl6`L>)QKAnY7D-quy zY4WJCf4VFLg_5z%LXa;ioUG2GKlfM&ax=o#U6~OQPBzI~%Kd0MjV?)JDff$#Vt3l8 zot~aqc!vs0Fo9V(>^ZhLL884K0kg7T;^R3rk3KRQmafH4u8J626s3s@whDICbkt0SM9-3 z=>FlczaTU>yMAbx%|;!t{<6U)d}11bTq?)uo$w0;duZ80n~14a62@&$a+sRGMOD#n zt`Iv8&TpRRm-xl*2_8cQXRWkC?%|)1nHWx;A4`|#y z)YJHW|HwP%Rt@}UAeY?!%Tvw42ee)zM)=7y$X9^tUe!RZzIYJL-ub@eViv(cJbW*NPuNv};jB zf+HX+bu5akDB!VOKNj-%Fa6k`N5mPDK`um)Gdhohczi@Z4(3r<0 zLlE6**+zJ~+O9L7oM{eA`A<$tv&R``DmKtM{#~`;f+wqmrM12QKCSibw0`z$nSId~ za{EtI{KvGJ{G>kkN!ZD8N{^nCANndBe*V9{?(Y%3`5`7Ztv5fSZtfv{%tjK?%UZQQvPOJqPhpfVP zve4lWu5{uZS?F|FOYcX&1v**!qUm$aeLx)P?Gk;$C!_y9-!1y@tv&VM z@VsbPmLV3yRSe)}&-Vt(gdx-(Wwr#JVYOiFv-U2QoYM9A^Af=axv)#)LyQYbrWW7l z3}I|XVaTrf7Zx!E)*~!>j|)yb=nvTmOh7E97REq2>+RdLtNTs43+E%zt_YkqRd?CGRt=1O0oO|jAn~5Zxqejn?Iuoi5+#BOUW^ml@fhZ8?g-6c8(A|-OFfj zq)gYN>gZ#}E^{RxnVa7p2DPrIrJOc7S~BWsS@zn*Xo zXj$%-MQR%=o$IL^MnoD)_UZ@M&C(A{Hae{v=m$5li=Q9C`m)8Bz`gA7K!iQYerczt z@uRenli>+(Yw%LJx6bcyCjGczkZT)OPA_^IlW8lbVV>}_?cTaktL;jXA}cZ81xqC8v&$Ad;Z;u9^LA({C-fp?AIB2U0Af#kB22^H*BEb4}6VzpACv zhOOb*k<2ZeUat*meSl##Qizy(;}znwEWJgkGl6H=9R zH)1d&9O6;B_y~#@XN${ypVls@y%`q{zCV&`Ya}&9PQYFF=0fY(pQTcAC2q?4E~#Sn zNSsj*J;cfpTi{fCv)AHSC>>*g75x*I#O~M|2yf|Ahjo*xU3?my)>Cvec@bsgrdhkp zP1!Oc@Kt4|<&?Qi${f!m-9=yJt9_H~@i}=GDFBo_eV>zyI8)Xu?EOO7go(?9cu3pj z!m7nf*4a7#VdoUqOz}c}>N{9r*hS(lBSG4(0)*~Y*^yY1* zt+J57ex!Bq4r;0hi*bs|4zKD)ZDD;=Rc_RZZWYF+olOpQ$vr>Qgsrpi$l+ywGXfJw z=qzEfbj-w?oYHThS#~}NwycgDpId(<6?H;wf0EcF3I0%=yhim?zx3=bRl4X~Zg=1M z-0m)2rB-XEUFE~-V3XRFGKj_wqc*ps@*j$j({=m>lB+kne1rVI%WQ>J0k$$Oicw|LRE&lF4mlc*oNtk>Qb z^axheb1FRK49(IJF+<KOMddO`aSI>BWm1`0^W z(f8y&5VVG517tQe3GIa$yfZ*w&YGl8IsRp zuF^s*+~np(ci>`Z678+BZhnO?`U3Gjt&g?~#ju@1#vu%$>v9t`0l1?&e` zO8m(v`HoTZLuNHGjW)gU&_Tw}*yb`efQ?ZjAf+1|Ntcwu2EyaCCaEp`H%cwz2_7H#FetMi)&BQ@<0OJs9JQHG-C~1d`fQgAVy?5qp{{e zNjy%81GDGpobNxAdemzB$a?=dL4vmk{f1}Id%({|f>3ciQ}~6T0bzus!r98@A*UK~ z*-1VoGh{|SaT=?4P+C?>ay|^l^PH__EF8Rn$YkP2ga-JtGum7ro>Yn9T@)_x) z2;k`79bi4;^vN)~VwbziT7W$c2@j%gwS}n4)Y_+$50pth%3#%Gok^Np;1@4BsFJ1l z7@cn?#mOZE%+M+K<(547mn?G%J(R2A7eIbionGBFiW8tu$na*vgcj||cGmNTr z)wim>aG_gy@oxU=Qeq+eS+uuLW-_BhDKIZca15P?6Q$k z9ce}lGESanj+W;Kc~+i))m`sEKvrE}-8EY}UxTuiOc$^QjhdhEoV+q#{W4TNLMQ`j z-E*eH5nP^}UEOs#%?7Wl?z&cWMI@TlUCVe5O{_1a8`X?Jo9S0~4gUsNr&f1eK{tYv zlSkE$A;Y^g8$7MLOKwmLo>*T-lEDar$5wYeBELhE$?C4-OL;1;?n<0U#jn>7Z>m4K zslKSG{)ndf!API%!AJbIt zYN{XIR6nGt{>Y~Ku}$?xQ~hyG^+U7gksjyET;H8nqR%S5jWxZU)h4E`w=qy+7jkH} zx4grvv*L;|I#=)fJEa6WrqUlTG#OUoTkUUA_W+Uf+Sb)blg9BXY)wYW(Mx`p z21==tamL;IO6e?%+bRJ7xka^njqzx61Y6!J5<>Qrm@MMH?;bxX@9y!dL;!D_4A3tG zu1JnWA0|yH@oUDuBVT@2t|(3)R^|6RqHQkng&C}0Ezh_Y<(rmgK=ZESMXBHfDKdz` zv;52Bf6_5flz}<60+-@qxKGwUr1W6FCFl5I@==KRM|69lxT@~%;4{8;cZbHRhg(J* z-V+*$8U=+{WVhjod~j~#Zh{$pFvv4-JGT`?QruF{0fERKgaYWKS_tk<1ZeD{s&H4m zQTrZg!lj`5kZ=Em7@l@ft2P~$@Z6rp4^hs%cdkD^9f1so&qlNCRbNG`u~rPJJ=GtI z8rVDVL+`---uPo8EAdA6dKy0-%AQG3k-w8kqI?iHxY$b+9MSwVwvV9JL6mhk&ZTUN zr}2|QPxS}9@YX#&UO3TH-Ov#ZhpVE6Bk2g7!w+0$q~$QuAZ+1{HR#rQi&==W1M`Tu zr_&nr7dgazE{!4=bS3_W{NY!6)T}>}*W_s(IQ7)f3A|ZANu3+t;KCL+2_?k_Om#8nB&|e}pny z*+5r(&W|UcGF>ORlCDK}RMt%__B-L7Hc3u@#k)q0h+Vm+rNDUXDC4outKV_3@{lC% zV$->tyVYK&7i;A{8GprYqo#|@m{3pf#DD52<;!DR2`Y**$5{QgT0KpL)gNdLrTW2C z{Ad=q%QtYJDZ4RCjvd6g-5=d&Hh$ttR(PWO2@m=8;_Uy%%+M=_^-HaQXeuI^Ue zlSg`#pcB2XeBkPVXAxzXjfqm>c0Ees=|kcv-(za5X4wJGj6Sr`Yh@!>!9^UvqcZ%# zxs~DVtk%yPKN{|%dTgARjznx(H>|j_E?DeLya_I3?57Z5BEKZOBC6C;!~y2sj?$2= zY$`0SyRg_Pg$fe)2}0U_n!d(Qj`xJOcT@puZpJKjlC40p^-IWIbt)<<5gR+L7w!V` zF+Fv$xS9|>Q>wdj$eZxf=al;#h*h-qIho>kt)LbYuI8OMt1lrDx2HcIS6QN}DiSSK z!2KhHMgF)hz}=Yw4~$QwyjF0Sv3LhBi~Sh2C^Qn9bFWNieAroL{LHJ-mnT?U5J!b= z4!O%{ljKaf?-$(9SV?V{H(gt=jxIq;nCYndmTaG_UH8gnRlP-)r!WB-?ihmB!2gBi zo;J&~uYsfE@$@QBpRWx45qr}KqGvocHAOJ(6-VRKm-5EV{SrcE$s5UF_B_F^VRl2` z8djdjUrWaAgPS)l|Ax%~%XlWe5S;0`! zI$404^nChjh?*==u^RaDS1?_iNqXOJ4?FZX8E`JTJgU)UC3XO5PABF5Z{8G(lQ--6 z^ZWJn%Sg~=rQBoF75lkuRbl4TJ}W1xlNm2Ma7pctMXWfIP z&Etav1{}zhN$6zXMVwF9PW_aLjuN`0hIiq%+d!E@Wz$b+B4y9N zSL}HsT}Bn=yl*GZ$(C*5{6g7W`N6*}4+oI8mEQNb>O&bmyE(Sb}>0*&UOeDyOIl?kG^P=puRq~id;aoD_jAq3Szk#!daLK7k zmv~5?EU{8-C4Zg?#7~!t=$UV1_D2a6lVbwGc7HoMdTR!YKn@#vetPlax)tGrPyitB z%+q(nuS?}9-LbFGS+YY{Pyhe7mw*kkC*$UvnE;&T2vGl!wGp=CKbZ}zhqJSR4xzWn zg#*taW&`B|k!^Bj!xSY+-*?3Z@P_Oe_+P&-eg}nJ+>I=yZw;`E=BP$M*@Mx?AsOWj&?nDM)#o z++iE(Oohg#+%q3wzt8yDC6aJo=2QG}h`m7K4W3%OZ9GCSLdd-n9D-Bs8>o(Yu3#fu z+CNay?I(Ud2END#aU9(&3|xF6!ZEoCRfIiL;e&Aw)c&xVmquIciw~PfkPd4KUyb$W z^{*V)QFk7-?Kjo}Y2k|#^Qj7(l+U~PLF~Rk#^S4Jp{*WXzqg2^N02+qqKT~6?-LA7 zd;Ja}UE2$~k0UYWZ9992!vX)>NJF**@bR?8BCMMUlrV)N1lzvEn>!>IY zJ?ty{(ib_5UvP}_2)6-{eUHQ3HVtO2)X*w-Yc*9%)O_V;Ch=S%!sIHi@FQr!c3?(~ zam845eJ$KJ5cIYwk4?6bjbRc}?jum6)5F?Vc|-2?6Bx<_LPW;|;v4Qu5GNPM>c9U@ z|ML?mX#YFrj*m?EYnPB!+nsn@wxi0!*m|FGc<~>h`<>wM>7b1E2EAVD6zBB~q^7%B z6;;r_MQ(`e)yJ#YV(6njP%dmsR8vqKpU?d#HD%46qm9b&!-&0!LQjgy!(@j z6|hmigIGjp`!o>!1lvNC@q$TmrBLT$!KA}WkJDI${o(mG7VYDUU{Te$4sm~A&iqcP z9XU4f()J|{8~x+%3l9s(Oef|B*pwnak$_6Fp7K}&c#_|eQMaRno7VU55H|K7?W{3u z>-j7HnrlCnC+6cv@P;Plhn zd&xqTCi6ww2c+fNGv(XwnQ8t9o}TJc?gv3x3DtA){6KxAf!(qiK= z=OWpy7DWpd$qp(J#k3k18METU0;ojFURZim0%02c(yzwqqj(EcG#YEse*+x0r085g z8XySR*crySqKjE>vUFSUlvZGp3puXC+2zA3e*=BqO@d6r+NJM%8mB&vQc01bOscx4;rSQFS3`JAGZAMXXpowlvo}6-@PXBs% z>?d7>;jnAwu41AZ0Pw5xum|qy8L-D6CCqW7bv)t~*xs{Pu*7k;=BQ~d`Ux4Z53{Dq z4D&B-s`eu>4}lLUH(LZ`EWmxii5rD02OUm+7L)=U;}?lR7xqZF3t`H|N3}esakJI5 zarPF(#xkF}KM)f}oytp9;%>GqUefyM)DqHK#jILyfIesnjCy}WPX;5wu2<;k()SZ5q&1=J;e6VE?S}JD-7wgPXzHp4S-=9k=q};FYhSG1Aw95GI zgH6J5s*yVO;6!f69;6-mBHp#~3qwX6r^oGXWG+G5XUU|{<|B7&E>mWZ-Cmq}VtDh! zDofMjgu@j5qUNtM#uy9otlN&v>t;D`vJ5lE88W|W{n`GgIXhh2s7E zWu07VV?K;$ABYi1L#{NO z=!;d2EuAV3{DVTLAfK|vrZev&pY%xO<FIk>E5`vq3ze>!ywAwlfLz{S- zV!pV4EC)%sOv1VXEkqs{m&Z`Ej-_Y6++4iPs1Zik@5FZqFwm_Ls%72m()sonK|!S= zfBqVpaqbI9L=e=Ov%!{!AX3(sKcP9|%46#Q)))py(W9u=inA=lDMb1z-Fov*1(VQG z3A{x?;q(}uAzgJKRW(+aJ*7;Tr+s3+>O7efuS)afnom?(0lTQZ{(H*zq0W$kV(V$~ zdKL-|K6mtWo;c@PGUTxQz)VFRw@s?67|j2T=YwK(5cs3q`D8r`AV)ii8ETyk zw=7nFV_x-Fd}bQn1NS-ki~l=UPB&MMK*su+Q3F>doN3Ly{3?$yDCk-)SWC5sSGlk* z^>zk-l4#%~^e?g=-%2xt~g#`U# z=U+w4ub0w-JQedxztOW@yh@`=G$p|^Ph7!Itms4`9C6ZVJ$((;6FJC zO)Hk4=4pdb32C1Ken&`dnA1|8$La6o$PWoXpsFbt%SF3K> zcE&3NPZwwDrnZDD8pS~snp4jQWdIf{dU9nir}kf8B8_1KHQJ07P2@XfLZMl)q6s`A z|1fHP560s!&+(v6WsMb0#Me9$?e zp~I*zX(z#`T`2jZ$F}gYfk#KQXp3Zw7daf&Jz?(ng@crram| z3SKo9YQ=Q&c$oiC8SKi*yIF(rq80pX#01=7y|tQ6=M8C~!*=97O_;7gr-(s^<%>a$ znzzU(RowvOS7<&rKFy}x>KBSKO=viTDnr99q2YF*6-C4GX@~4Q@=HP6<9-i5AZgZw zr#yFdp3JS;Z6?qg9?_=&&0$C$u@HKZZ66+0 zVK)68P7~5!YRK)Zoqu+k3DU=&m=imKW`~2I$VTmDESF~Qe!^-Tzd~Iaug*i^mHSy$ zIK`0u+Ks)2q?axFEm`3YEte(P7z)IS9^g@}-xui*D;)0Y4ts@PK`m;2)c5xUBv>@a z`Y!SDN!B+W97R{^%7PC+q}R850SQJeP+(?Drt@O2?<&cd7LvAjchOaOZ|8^cSp2^S z8EQga&B)oulACINA#W{3gLwm6F*YnI;n6bXqs!Zd9c{ZYq+}pz#*m`Vm(fD1=v{tN zCI8|tELLR8Z1L?W+Q_T?L*r5O6wgx%Lhn-B!;;tSWdcMJ+pWz`r=&d|!O;5aJ6VE7nF5rkJ`&rKY zRJO5M_{I@Z1I)KIe=lYjBI-cY#Y*o8o?=ES97YZ67&<1mf1U;O)Cy-86(AxWpz^so zm2g8;gA7B$frz<3B7?7IfyKWTG|jTXDfg>##>}X+5Av3B%lR@*SK#M9P_Lh6N|WXDfP#BX)3-&{Tv|u)K_i1v-lxYLtu$qN4>{EtQ&gsKiy<<=tZpsVs>F z4n@sTD0?{lP^_g=a}Skp50!8am1*vQ$W5T?l21X^bvN5gOrC$0Z7^SQ*SiAKYL=UD zEv1NQmyiN{Q|^~^B3sKDwB<)}m&B2v=tOym7QMU_R8p=0f}cRiXR8@AR4wa2_4o?P zq})dVjt$OAVzVfWmi|@?l`5uJ%z;fNC2U z@*#ZYO#}UjQo3@7AVS&(u(cI=@j9i+Da1nS{8-VAy1~JAgN2P|EKOiT-^^0b@1fo}A<DC3jE|EPFB=MO~RCC;MUkd5oi;NPc14 zAwGVbFGc#s&2zW%a$-GIaRhsnpQOu<&&`eHrM}d53ADSa(-A}>HadH-mXmbyO%*|k z$N@K`d!i|sFg=;`r`Uh;S$dY2-lX{N>W}MWobmg|s`0kiQeu`@tU?J4z`C`_&@x_i zS>K)syF?KJM#kdi!ZtBy?CjWwW04oMa^_?W;8^@AIx#ZG&Cg5yv4KJN@2!^i=C*o0ol-p3hm z(RCC`$Fck_*+9#BzM(K+tmG4uVUs+`!g>xx8fK(%QtCc|ANncK{j` zA`6i2h({8UIr6f%ZIb~B1+)iL!skk3J)wY0{^^i2IV&?>@&z_Cn6u-}h@wMzG^NK+ z(Zr>BRsQv5sZx$?naPj_bn8p=pnbP$J!dj*mtkf6>dsd+b>(3P$WCe18Ke^zNq7E6ckunf)=YtsrpG@ar7}PWUEb`)C`@^O zwcFGT-r0SQP*xS)Q~+Xa#UzS)Ci3MnH3W%!DzLB~&|i*bgZaxwDKod7#$SD1Ig8Z{ zqoLT`Hw1UANB@;d;lmVJ*`Ph=A<_@sP6!TICCr8PFVh>De$q4_8`QBCTXT|FCE2 z@2bxrKYFeh0U2f%TZM@25`SXGv&9-W^Z?T+iuDbq=XRz6p}=%8u1wO6r056Y?gWRa z957YbU!UiztU@#Yg z6%~L@PeRMGJz4rpkB9U38wiO`7SXhP44ppA78p^pS2M@vlvlAwj08Cz?AJ#W4*{gyzN#C zvLPw`hJ44Kko26=KD+c&eATlCLzaVQty^+{k+`03eIwbmZRu)Nmp?~nBaN=njn+_0 zPNOf`U$0hO)~F5%f7I@=+wQSX7ybk3Ifd_}aAF;B5qIKdZ@o=p8^}`6xk^|>U>Imn zXRLV9)lyoHS#kH9FQie-y1?$i2L}{T-fL1#G}xqfqW!g1zQ$}EV+Gio<%23YymCJ>cDBU4zg$6dGiR<4*P?u8C7{A7_xWt3SrZTC z7N9jhD!ys#; z>Pw^~;mO5p)Q2W3I8$8FU`nkP?|o9R*?T`r$9>Oxp2jQ?C!94#>8(FM{({9*~YRCKl|z+*+HE0AzrznG)w&fqa}DWhDeNdwjlEF-v@ z&JjE_(J3WkC8gXzBxW=!sxy6g;T=J4*@;wvk#+&2mhBoa5SSx2w;t@_Y)8kAu9p>v zSqSnJ!eB0DMqAS&7#5nUB`r=-za6$%g>#-dzuVUdi6n)xyOd_psQE|=ro}4D(2>q> zPq}YhBOORDp1XNVj^+#8)O$QL@Gp_nlR@q>K+ersi}16e&$A05dbw8KutJd-N)oVw z2{uB-Y%SJ=zp{GV$7FNEmYvO8i?_isn?ejW<({WLOJIOkiJQQ6MsmkxS{+)ZI=qwt zg*uYdDFc!Sn79a~dqADCt8lol-V$bra%dB!3Byaw5w1w<8?*6}(nnIulF;_*sA-qU zp*K1HhIW2$2Lme(A&o#PcJX~$+^kF!L^RY>{@1&FAUhX9Asb8$mRu5ohnLJiX_4dX0uzZjPgEgdj4Ap|qXbj9$W8K2+J0USeRO z#;+#!lK&A5RrUiG=-X}wxnP7D{8L&HLOzH#K(r#vU3(9?LP2`eD0J`_;4S6;B$Az2 zn@V!>F6LXl{x_H2W7Ip3uOP0u1`buXy~Si@0BAS*eQC zd=%-#X&!9f=_NwK7v(OXsRYUBU=g%S01-mhvzZi*6@ryn(Du3@9z=WaH)?Gdk(&j{ z=|titc|h!`#TM!^l#G5ScaWu8+n!!y5H%h_MuilIZ$!$Z;*lLidb^r)p_jX?qZob$ zT{7l4_WsfXU&I>6WFLfIP|C7O;^0Ul8T9CB_#gx5fgbNxXHWt3C|WI0M^y?q1b%w& zh3PR%ts89!^az6er)&k_pxSZ4r6)<1VWkQjN1xul4BkeA#4LlQXY=PkBf-G*{fSI8X z6@;T@9Y)Qaf}PwGrZ&0w3MR36ggS60&&Z=6DfeyZ)`&TPznHv5nwfn_lK6eMq?WR! z@*;tVV$)dQ@E`;x;u#{{dlu(s!Nn|+ZDm{VpL(PDg&F&PXELt9Cf*__YGdUo_rPoi zWMUR*^2^+m@S!4HN$h>n+aCZEV~Pa^N^JN}{AE67?BZeOA&$_$A$3Sth2n!EU7ji2!q_Pn2> z_A}z&iyBMs@yz#=@)l{4`Q}z}=DS(XcPn$e0mjOn@0E;r`hPIr6j|BOd%hVZDv?t3 zzv;#WwE^AY%w&IyFEU4V3X{$3OHY-3P7`<}tSWT0Gg@f-1I5ms88v}*HB$C0|cA%p+E|4azI9aN1 z${pG3Q$eywJHu6UE%%2CF=BP&2G2RiSYIIbUN_1O*j#>XMvpUz_>K;(9lddf1c5h( z%q*od;M~mex@p8;nnwI3AZ>!A>R#jNB1RHJ*-oqGGOa+%(??W)-02iBrRDy$BIRWx zz@->}=oV&mgfbbEg9(Q(?X-E@?*OGN-7zJgqU2)iD!^mqxsq*@D1`jcP3kZa-NXS6 z_laWuI=r_9&qbaQckx1o1?orj?t>NL?c6=S5+4zM=NaoZb9&h%8HxYU;*b5KR5Hiz zDdz{#@k#r6TR6Dd=iKU#)k;O4)NWrqP?)?$Z5n1&B|gpvy4Y#mdrqcjayJ60@`b+2 zuiZP(WBsvc#>eJ-(!_L`JJR3dj`ZjJ>Y|zA3&weni{}Vg>CC9i3d&`wMYIb`tR# z**g`Y)LD(0rPLQFG%LD-Qew|D>gD+J-wKCZ( zvf3{h-NIpa_???m@2CYv#KK++Y^0tYaj?!`dj;lMacRR?yK|sAXhmxsQhz)yh?>)f z%b%bR<7y?<7#CN0V%#G*gt)~+@Rr&lYemR^#^Huh_T$z_sYN3p6lOMj$0b#DD;Gf8 zn8yI~>Ajpey_#rpP}*9VP?A>oqxXa4-2(eKY#{U?E zt(PqP<8cE&#rm;*6omJ|W-=sQ~W3l4mh=5v@OVB!LAK zSZug{AC{!D-&gXlwefQveVSOxU;jiGe+wu2QqKT;35Y)l21Zn4T%s-lHRlUj)9Q2~RX`jdzhVr}>VeTZFInOx0SCecqR3P4QAOaqV2wIXDtw}f}g z!ha}tBC=h~1_=Zi7K6zrf6*7%)ynUMwOo+aGp(4dLTCXiY5@&q@Y;?1)<^I%jRHdN zezjCx@u>g`#7ZT1OaU9>dEMs@$4pH;p_&{)3KO%7r2F43pcb~BNauLFiQwNOo%4eC zB765ozc6ZAMVc*QH$7anfYJa{NdPxCU)qWbjiqG=$<2k%d9Z5KkO(Vrc#j2Iocs^g zuAhOc-SHT`J0=Mm`(1(!=I@a>xtY;;C5>jVZb)3=*bohb=`GYaZ67*fWeNt83ShnN-hHIwFa9vc&^|ZxAQ1=%P0RxN2 zn6Zn-i`=vvA5!NA>V<9H1rL&kF(NeLz66LL+ufD3iFiqvxx?i3N82&pJLm}?>W^lN zvc^{wQZBaQ-%x--DS6yydy`x6I0mB zjw&VDr2@5k#50p94wB%Pn_fr20c3DGF34`JyBs~B*TmfuUWd^#CZLLLndHM6xn?8Z2!rt*U!Hmlqh z4X|&!raSpFYY2ZX9s{kLD`YPqRL?7pwZmBa?QE#-tpMw4xEaiPPY%SVF@xRxxfZEO zoQYU_o=>@TRL3SJ_tOmsjoMjjcQYKbVx5dy8|X708FzD`i=~5^x608+eV=`jTi^8! zy1uzcGQBPdh&Y$~k=m1|=tWA4*R>+{IYw(Wcs++#LGK*=h{vTD)`eWP>WNP~z(sy$ ziU3aC{XxNJB|45#^9*xT&n8RQ*(YVXxI?oFr@**-IlajQ>GMUl6edp>t4r`xq8R#| z&yiM~JlgZ5P%(*x(&Jl!1hrk)kdQ!&89I|kVC>$VbSVvKuqAd#=E%x&6}IEL#e9&% zB8-Jhcgh`;6t0SiJ-UE*CI3z5QRZ#e^2SDT2R&jVxm$k9)aDPJ@8B(w*iZfO8H{2l zqu53yN8x~yrM=R)L0$78nxTi@!3+6gacS3B`!_);E;WxA4csIAjO}vCDhEnJ8~>|k zJFR>x5GdueEosGy%|N^1PMl5|W$%$JQWgm63s*%)s_8jA=U^u>yNp_SQ@|Dn+B!NS z_JDv6XwEq?&liSQK=O z>F_i1rua9j>_VU>j_O7&tAXk0Ow>_JxQjc0SM{pyn7r!x>+1fQQ{8Ldr8+baG*hxn z()EGn;R{H9RwrL3$(qe1K8f{f`BbkzRpozLDW60WY11w0JU&0i_sNl5M*5&^Thk@& zzw*JbP^2pvFdTkffnnd4EEtZb-^tU|5ri&V!)L?E7t^xhu&e>RCPh`>Bt`f>hU~@> zci8fSi#-?habHy$%hz5fWpc6n9!ZI8x`X;vG^Iy{dZgSxNM}^29_CGt+sP?0-wrHa zKHbY`O=}S%E0Ge6KulJda`(%t`b6I3kl(XXy4k0{l&UYhN%2jg6Y053m+rajVk!4u zPzcykAEX}5y!BOm<=56vwH=viJ5{xTylSuSv)Vj~fI2U0nZOE>U@nHORYzoz3dAOh z3K1oj#AHjH1j_qkOQ5|sxqOk7vHVo!sJn@VCuHL9a9_4uRCI%^o>Zf+;)T$j#Ba&r zi{qIQY47xxb%ct2@mU@0PopPnmHV|NzendcD_TQ)8rNi-EFd0|TEWv_zn6M_}NNz?fHk`*#Ft8_@#E{YVw9%kViqV3utTjtayJ z`%5RexOZMeNTFJt$`TZoF0b7sM zPA=X>XdGSHfK76Bh@&x8H>X!Q;yK+JZrGO z{LqH1TDi@4oX+8s{LlKp7r1-`syF`bvT0JdD_v;5F*%Bs{3EAw#Tf6k2`qHA2cg7 zPd=Aki&e^<(H|?hXgcB1Yqw&X7k!qGvgX;AaF=q=yHbZNna$XV=H2O!mXzttXl{)f zaW(J}d2rir&RRZrgZxa`>Dm98SXWoY!;WuXxn;sm!etbAjGs4F8Rs=1Ou`Z<$bnQag%F(QP zv$Oy0##5!_PD22FSaNzkid5J+g=(?7@!u=yuX7qTdn65m zhJmf(tsET0GvPr%kpA+p|1xdt=N%^uJQ3<~xe(Nds&%xXtupQ4}(y;xznyHd2)K40= z%Y+V1PPs4YUG|8ave)aft(`QrQE-}LWY{Q@OX+h0$oaY+vuy> zR%tqCFv4mK8DO{y4A%^f;umlfpTqw?jJy<*APoA zu)~Y_5jnv)!~~c+YyVvwbc>7S`^62SH%P33+5tdo^u_$f`mtg=&6a*-P=hy6+z=-{ zDw$$OKmx@Fs@;rYvyB!c_BMOA+_J`)C8yYwNczL=A{+V8grkK$}0)1R~M6qneng%r60%u{_~rK_?0 zz*n(7#L^Va@!U4Kdqks#Ty?3Y-X*Om4qh&VAWHZjSsLi=unU;m21IrxBVKj0@`SAj zw4}qjZ^^-`2{LN%+zJqmB(^dATIOQ@ug;SxBdXj*huic~p^{pxH_npP?K_5q~$^{5Jhk(gd|@1hOCl|E>x__ zibI2#?eh7F=$pDzC`1?8=e@LkQ#c|>OAmeMC3XSyp{hM-CWO-(BFOP0{`BmRrf#vK zjw#|{8xl8CTwg`0`0fkN7fNyo3r|>S79ZA-vFYP@?`3d9 zinhhV%m`ML<&?F_3J`Gw|3@VCYPVpMNV)Hjx0dN6=qC$xx=YcVKk!mn`c|+I^_$p) znIq(?BGbj)W}b0VQZh-6<5KRu^D<>JWDXi;Ni1z&x=Fsah8KEK-sjIc_}tdA^DHrqNhOL1#e()HfwkJ;86U;ka9xmX$l zzFcc4rosBVbOhRA739($yGxaQxA#@!`xM8F%<@%LdLd9nN3XQj!C(n`@UT*(=G5;-o_u2s4CBx^`(~^ z=N)Lnq%?ui{4E~LEEut<0e-VUKURz~se!q5NLtq54vf*(iyguIDDomn1+wQLR0vpmjN06}x$|sUsh6;VE=*h;!>MxP$hboNr5ucwM zhQ8~?n}(>>h#*FS5S~<{H#$?@t&@)BaTB%V$gh>Z>MK%9d@<|Wc<{_i$sqo!6Lgiq zf2dd<9;1HdU|cN7>5G2b1BWE^%=5VX^+j%#NNvB8$Cha-KASH-a|Akd!nU^;a_r-< zT*Fu4avFl?2>Tk@%#p33L%^RDj>C*yfDER=I))0NR>V)c2&1aaGMqs4B9|w%RR$6| zF*!tH3+5&b^=Ync!dB0knS;aJQGFqpQm)oGF8&+6RH$y%E0KFXtU;AFzrLeh$am3< z2RWOaMAxixzR>T%u#Mc8Zq0#@z-A7%Cozb93Wexk;g-ax9!9$#kQZrI^z-D;dhz>d zX$3paHG%`6Gpjd}u?xz9zorK{_D|$zL#(=2Z+clvB76NP)*%}@jg3tOC&KE6&^9V2 zo-f`lp@n`7r-*BUbsL%qplsBJ86$k2uVSCEmT&}&ebz`78w({YQXy;1b#gakZqT_M zKE>_#r=TDE_H~Vc=zc#zvuYZ+u;M^XYjDK|nSKJ@Cg=HM%awC32a@TG7_OJUK;Y59nJ!uT&|{Cc>{E@iX+;%VWT;X|eNd(WcRbU4%e zl4|AFuA08fC;fam8O0#=7%|KzU2 zQYqT-(wV(zLnhA8v1%dzKkWT?U{qE5KaS6xk{%`?B_QApMopw8B&1PHAb}Z}kN`nY zqsb(hz-W?*Qz$k90VR&3tn2REwd|_vs_Pcneeb%6Z4#7X!2lL4tHITEViZwUDVBU+ z&neRqTzB#F{{8d2aB}9JdwO}=dCqfodghlviJPr=(pSO7a4?kFSB}#!42XCQwa9~H z9L7x+d=J|9F(a7S_u<*Np9qHsHxYjC7%$-gg9KP@0psQz`XZnKK`67?cSS161OO4R zRS*ATJ@)Fr7Q#GfkUpN%J~LM1F_NqoGFMBX--8<`_L~a#88;rqTr*|v^TcNRd)Lx$ zI&`CeN}BGti~4X@@j)8Z^M0|6yvbegV3Q5>Aug&ote5Z^yKtNGk-C)dDT#I4JHhSv z-Twq^#!k_jfxBqWopiLizv@)nYuxk^W^(VBG@Xen>t*x$ z3sdL&dW&xkT~q;fig;Z*U(?0Jd!hEt^Nux^XTIee!CKe}t83jB2#o`{4F*41JD2lz z8aKU28S_SZjSxQ@Zz5@2W@m@dq|A@&YiL_*JQv1`VCj`HoZRRJ04X!NF#xv_aV?P% z&@FVFHJ0!C<>7dU5PRr!ypfuYJ2u)+p6eM2`RjJnfe?&wGtLgsE7V^1@4o;GZ z`;J}xBQC{e6sBG8O1}6ehO)blvP(sF>v?TXP;KT@ZGK+BS;%6fl=NC8zgNt;71^Pr zIL@$p;CFPt-G~uOsZh4#L`OXG@VXVfk`d7>Vdpmn@TbThG^ntg9+B#F^5TK@3k1IV z)nNQwkXXVGe*Pnp*nkxSub~|~k}$IoZuKHaY(Nh?mWYix0QC%B+=ou<_jh1YmWIH| zP~?C{LuQIODrk#uvj9u_KwIz}+|LL*VHHW9HKvaI-SZh$LCVtTzUz;AW`ZB#_FjDz zsexzzfN>=*QOv%fQM1oof<9*F(*n<79$;jD1Ho$`m5nCe-g|^in-#y6(`Giln0ysU z0UH1=GtU*AHs@B-2p;YG!(ja#)bGyo+9a~|APK{?w-@pUn1+s zCBtxV<&^(qylxwGyxy5S$arBZU96v{@%eP)bxGKGF-zf|qk(%tM$-5YtRAphE(#x* zp8|qni9GciHWbqzl0$L!^oXIDNh^k3oYsf6EkNvXh`?zC9&42RVr2hg3Ape6H~m>l zJR3=FnNUa=-1Lt28cxBEbHpmJaIS}rTmca2V9pt~&E|4IL~0ZOM04Z%mWI~A7UUrL z4^H2}Rw?iY`qTn`$BxgQkLV5`mYMs11x#89cIPAp$&kE%A2O-3?oE54=tLxfpCUqVO2aUzZ-hMF>7EGMRs;{k zq!X)7U0VEhUt+kqr_@N!XVBHD3GL0{1WonEd>& z*|5)kP!4-~4z+1vQeYvLV(&?gwf}}W3$z=z6|w$++67v&*$S5P;4_l&0@cpLB9-*k z0RE@TyvhrqH;mF?@P&*Om+mi7k^FIg@5}gz3z<#6OQ3W2GOT4`pWuW!bB{^+ z9D;QSCI2~u$|jzObX*VIMHXj0Lrl1nZQ}zh?Hkbh>Nso)mTXGv4(Iq_VBBxsU6zWt z*hRWtHFsQ}0j(}l%149U3$cky8Vuiu;f0m1$$&J;!yNPtIQ-NL5ac|PQinWzc8Jw>ucY{;Vae>i^x zLs4-U28>q`luP1hLj~;JjtNK)dY79T+KPdJ+VzQY-=sY3*pS`l3Isv1V~DxqCD@jS zRbSlNVkr!u=ezg?OrVF$6_~v0La1>QnT4lotf7iJjLSjFHXT^^E^ajIaXyE?pL%jw zysuHL#kW9PUf65gbObNP$LA=^$5kZ7~0-*PG?UHu1{0C4Rm=!V@Fv`dBgqlr_I!%^gfLr<&X@TaZ0-6E7%M-Zl+PeEH`fYIewHG|F(D> z^jt4F2e;Ctl*J!3cm6{y^O{GO$G=(b8xHnuSKn|Ps>9$Ogk6t zcbb)BZC@XC{uX-2g$L=h4+8q`M$Ii9bU+YCyW4RB7(zsI=V82;VK0o((=zarAd`KD z*8ryFuEn1im6d#od1Z&VR>5_X34(|CQw}fLrE8#YuB-&GKEzd7z{XrOk8+cn%T~M* z2+d*_kx2l`{KlZX4}*hF8lGhXmiQTxt=Ag~u9eZ91jlhh9u91x; zxcc&Fx$kbxQOx9BItuk*;{s{DNQ;6}aE7~>hFe9;uG)#Zcmdp$ueua>!VZE`fg2!m zFnMvk8Q}j;5tm6Q0|^QETyKCysXc*Q`n`~T9}29%Zx*8?HQ+~TsD`)#F2G&Do=4yX zF2m{yOyCLk$J5reX9;@`SP=-pK@wtqN0I)3uYs`$42+^bA0rHf^--u60m#`9_!+&? zo!No;EH&F~LS5PIH-U)=L;sC@4^a zKPK;qzy{{023+th-rXkeL0koK$23@;I}|txIEqBea00_)2waXBIS2lv1g4-i-kp7; z5#tRWV@4b9)4{p3z(t6I8G|WSY{K;(CUkCAjTn!+5qB#enyvWheKGK9EJEP-k2nda3s@v_p>Je8j>GNdx(+KQD{=&uhY=6w{17?%_F*eZ#o!qzNECk4)nO zy-n#mF4AIPVs{xv;Hwg7K$Zcze-&U?Kh57aJn(1!5}&g-@GyS%eGK(-nkjO9w9R@a z4c+H`)3Xvoz2?fm)0oPrNyg^4J?R+UUHBTPXSKuafWG8?^uCnWb_zkU6c1XG9Mm+yo>*YI@njQ#FZ?}8-Dj812QcTSwH(=x+Pmr!?Q^u3pJ0I-|)Qu{UOn(L{* z640+P@U^U)Q+IM0a`T&khf&#_1L&8;O>cW*O*f7BCCD{&B-+8_w9Wb{5pXxZ>DF&L z;7JM;(aVd09C)(97%u^n+Gn*OGT5y*J+Xmd=x_+rya&;{D-ay`T9gF}?x4xr#Y+)u z9S7<9p%#0#|M(#sM_~g=>pFFr$@>YdYLnOSAXE!XPfmN_y~)1-4m8c!33-XHJOx|` z0Z{BK|C9tCIK@CnyMM%|#Tb3RDVu)p=f8dBsr-E%V&b44l9Mb}HRa%U4lsRAr|Ah) z1P^jL7cV)X(okziL=EGq7Fa5krsLgst)N$|7i@ax_;(o5TvoiBCa2cY+6gu_^^@EN>Axu*8G^uRy)4?38O37z9FG+Z|h{M#LVitiEW zY~*|QzMP3-Ug}+sBx2p<;Jz$B$rv!IMNjaV7w5?`)thE+n5nRtcJ2;7)2b9~Ww$@2 zY(oDHS)GhuC-6%Hf=kR4T2E*L04=p)0&4?X?x&>r#*Vn z;AwlWX2rAeF@KuUA*Kfur<$bX_;dCeAK37Di`&+;;R}0<&78R38(<^7;n;jzizo3Q zkdhzPB&>ynvKLZ9iB@qtqB3)|B%k~0F=8L3I7-naW= z%Dnqayq{xvO-DVUPX66)gAu<_ec-it{LXal*RTS??a8z7w-^!M-fftOpHy2UnTel$xYx^&gCE8n{~YB? zG8uOq#SAc{A*95(!Ka2O5@J^YIaKY9yGDTrMXSw3xP2Yx3s7ZBt2G)v~ zG=zYU3oyM?YB(G?iU?SpwB&~ACcyNdlyfT*|s zyx&9I)qma%?C&G&??(3bCHD7^?C&=A_Y3xy$N!4`_Orh{zMK7C#Qs*Yzhl_nZ&+FT z*zY#>m&d<@{r)-o+k-f~At8D>+Mf1+@8?~};E?P9(lk(wkC#CFrMP2Bi7}D%4+)E? zR{$#P3p_fNZj65%=9|1DO&u}2uyK#8u@%n*;>~cb{Q$)22_7u|{ej!!iRr@@tVoV{ zS`TfI%wA8-pP>d@YCAG8aRSTEq1p3!zz5@HeX=g(Gs$-WHlqX6P%f#3Vyj>`C=0v* zg5@)21g8VzaQqY3lfrC(N_)1yIrMEm>M;c336$UdTtUqhy$WhW`~`jk^d}#<1m!+G zUUr!%G*n&}1Oq>~yw_eESl&L_BS#4yaLf znvTEOx?D7NE{?q}Of{w~&0vkDbtOz7$RjX#ID=%hLGO>J5dEZW!dlhG#)<;{@^C6SzwV#`-Z&RSKYk++Y@fSuN?1xSb57pf&B+ zrDrMbvj~=9C{eeL*(kw89Rcmx0+Y8Yy*RL7ba0@4Sb40N0p;C?!hcYCZ-E&OUmyRr zeTY9u`-o%tLFHW;Dleo-2XWy6^s5CoFt$?ntTp?RVqwppUBY|Fl(xrw9Fn5l#;yL) z+OcGwG!?#L{GZOaPOc2>j^9pwfqToUa3I8;2ECmA5!Xoe6O^rdGjRm@l*u^%6pkzqLw!dVCgsoA+$ns+WSn=3%&fDk+%34zU1igT z-KBOi@H%)!-m_x{nK@AHP8~&s1Se2DUipAB^&h4VvWyn`3X6AfDk%>1gWXT0)di)O z4j6f{$CdlaASI&Be2D2FL-@xDQ|5~}T#qWf3E}I@FquO)As2S9p2SYBb)w3E`zMXA zMIC$Ed*YxR0e4bg@)R}6Vw~I4y8%C#ftx)bQOw>#3#_a_+X2UP+YjS(46Y2JBl|!u z#?5~~jO@L=pTi?`(ixcLaX^pMr6YBXhrLe=k}6>Fm|g^&!Tm_a5JG z-u)a=jpl=&n6{&<=rNiLpIbA@-2Ys8$3M-T|J0j(*FibGqaQbR8gIuGg3ySb^*AEP z<`0fv`I2|o8Q$uLx1$i14?K;TY9VTjh9ryhfldW_tJpj-Zn^+85vkED$I6j8jQaGT z-a2#p2au{i2cdQxgjU!mYJjAmng?)eqRU6Y zNyj#p8sF$CISx@hsiP32AgkAy98Y*`u2x&K!)40uH0@}1G_+Wqjs{D1m-z{+)7D~J zxvt5KFVs6-$);=ou})U=O0!Q7!Fp-B2_J@6JzU`=D$ z<_|m>A^9GvGavAAcM7YM8J5dRHUMhkEa``+;IR_pQ=eFrzneM&q^4sbsAkUem!Wan zDK|X&a$l0BJiD9bZDqMH7u|_T09BprqZS=1WbwfaZl`|)-pjK;FYnl8&VJq8=~vAg zj-nLE&p$USeskxpi z+}T@L?rS|-p7!0mElIk0TP!&#rsJ=fIzQB#k9U*0qXp|W13l@`XC9klT(8%az#I%| z(6nMI_hpqlL!iily~pr^$wnCp_q6wYh#}H7qAtfuQH{P$1O|#t6A6N#%d@~b;+Q8E zu?gySpBgtU#|pFX;lhd~{^Y1xc^>QhGvlTiwEF1IT3qai`(6OgL(OEF@RTygqE z@|JnKTqI(Jn6aJ87YWu!3SW;=>*Fmth4fYLa{!ghUS5e;pKg}4n|_gRY@8*#djY1k z31@CPpHDGme`&(B&VcYKlPIa|*AY4bQwfvyOK?A>gO@5|4wPoIDRN^%GKNf`TtJUoPErk-Dl3mL7;#o?GVlCSWF~< zoaeDuzUG+mDO~V=#FBQTZDzj4*wI1DvEy@dCL}vwnlhh9gDh#En%cijF>c(9Z`j-; zHjdQwloQ|}lJd=+eT61p3uf-8rCY}4mu{(^ngYrU3WIkeK27;p6dH#g>x~c-YI^DZ ztdb{azM~Enh4QCbO{H3y+dETeRoF1+`u-uo6whjQN{EZE*TyY%_} zb9R*)Q~E_^*K7LzL^u%$@$a;5vn(LkR7>VTbH^nqCMM=U<=a3Ythns*kVe~1)+Rz8 z7aOsEKn?6IgwokdFMS_=9umaQCg5kB92tn8(ffp-VLK!YKW9YY=LHe?IY_PcIT>y~ zjK%!@xEXsZgqueIuS?v#`iJ9Y)9&2_CQJuEgN5@a80AQZ`VY5G1MUR!Ke`5HoOgm8 z_{UL;Z)Hk($A@O+?@=iF!yFtpq4ggRz zPRN^;cP%~#cvZR#S7&Pf2(-;^F^&*~Tt}t|KmT(-Y`Fvue}<$0oEa7`WCL zvkNHt3yz{;dZr6#5-1wvBcW)5cHQO53kU>?_LpaaAR!bDMBW7yeTMNvc~h?C9l)YM z{J{TM=-J(%FR=J&z3O9Vy!Mpg9T*a!nQtrGcwl@*6`_{zkq%M zbDNas0Re!yNl0wY#4&@HAZ}quo1M@)g16o!w0z(0Ev0M*BJIntJrJhvcgFZTk@5@2 z-)IjOr*Y%4LGbsDpP=<(ErBEkk$Z;tyC9mr75Mvue~Z6yX4XuInB(t)MM3$D zBk{K-h`(7fhE65^E>{SDQ^N8f{yxL_A=)4Uf0r}-4e~o2f1@d+N_0CW3E^;ya>OKY z_-_!#ak#nTOLOM)Xp}kaQ$RxC@cU^}aU4!^51)Q_5Q$rW#1W5>_`DDjf08ou8ZF+` z@{V&X9nhP>i45-woWH4oj*f}mVcC2IKza=*Ia5mS`XG8o70VSW8We97emB!Hc|Quj zn-Ca*-%Szt-7N6?VvgSlrGpY7aOa!3o4p-kZ-lYSed(ROUjq3Ok~c>nc~)UmG=%IQ zWC&Iud!U5>1lfNau*XVdpTv+oSn_CmZz2QTV9c@@M?M16l#ZeNryO~9B*rJQIpYVg z<-Z`P@x5&M4Fo&(_P#){L$KxUACCG5Vav}UwmchbIcVk&K??zl{qv~g&CTD(n~%Sg zA^v)J9Py{cQ{9NDT3#m5{b2*ubEoM);K)D!NZ@x@I8TPppWj7;|I*% zk>$jGZx6BG-KHl(?0084`@P?!>;c~m_M4C)FgK(!X5a95+SCD-?;L6hvfp6bDbz&z zJ0L&7s~rb^KX6+98^`8}|2`%8?*oL@z9?7TUEmx3CHfL`=cqZeyUc4k0oz6V(OZ-k zEIAf1+Qgg#_gbL)2S8`Ze%_+95OUXNa83gReOGx0uqYVmP9XQs3Asa(WmbBDV3W<@ z;fcWk1}9cV0b}eRYEnK1;-&Pa?AIvS8OIOH8@XB_bYcZ|nX*5&WWNCOW8ktG&|nNW zL+%!a+)<9RR*L!f>%i*^yu-g* z&@ueQvW_k?cd&T_Ve#yz35lDPKx8qd_U8$Sdw$mU0VW3L{i)PFeLo9gZy+!d=tS|` zIaoRieELrzkz*)3$ZQiY&G_umX*6l2medTq^?rv52$X#U-XJLZk#mU|-NeTCjPdnl z$Se|H8#j`UNHnYc_6LBNUf8~Zh&;Fsh)fMz2m4JsLL4?*1T@3NI`HWeEKHU~G~pAH z&;@BoC%V4s-3ibKeaU&=>i!evpzx@|H(Up<88G`SO9xnCnztWXbk*qvG;hm0-Z5um zgu&4Q|6)c%o@L%}j1#5ro0UFu=W`%RU!`Sn)h&PGW%FWFa~c96~6a~KnW)K+Vh8jFE*z>jwzo2wW6*1U!BF~GM zi@f^di@d|%ThuZ9_@WN|d%eFR{LADgDBhw_zMQ=#d7~MJ+fXIrW;&|acUU4|Kh?0O z_ezF;p6QznIf}f5} z>1TCAo%*^28^+k_4AVrYKKxK#8mf4LmtFz%8nT=~m&j-AgzA^(s~#QIvM{g+h8%yg}F(f0Uz|sJ7~)( zfbBe3MGGiyh~-K56(8At4zoD}vHS*<0`>8uFkx~c;HDyj=XW6AZ=yZCeSG5rR<+gz z_bwJ&a5xv+7n9lc#mTWj_`tU>DzQ}t?$(Xlw?bPJePj79#=_YQ7vlc%-PpNB{kXg= zYU3hkb|S2Ee90|y7>ezN$E{C2gA7>zRdR({9}cZ`PzRu`*#3fD7P=A3@V9i@2cCn* zFGzt;lJtL-pp(~A^2jH=zgbtyU9?~y^IbIbF?I0Em^-Y4v12x%gM&RwA{$W*wTD+0 zCy-aeeju45LrPY2+{55AB(TcD3=L}q8QviU=47V{or)F#0|s`Z+bo4$Yc8VQMwSOu zWW)2=buQC(j?N<{EDu`7NEKcBErX~0+5AxHW~2;uT4;RCnAN`ITTleo#088-w9t2K zCM~1!4uC9*Owap+?50qK&=v5x=5OQfvH+AX=>DFipu7LgP$!`LmnKll7htI8V5k?+ zQ2(L=h2A086Z$`kCJV4(Sr$>YYT!i1cXD{b>dV{nmqlm~s>Sj1rS$7P4iGbFkO0XS*_cqgVg@Z({n`DL0nDlfGn)~Z zB+2hz!YUC6w1uW+#CY=bQRC5rOn!AC%LMr)-^(-U3CxJhgvzg_@@skj@-ZbXZfI~L zA-$LTk-<`ySNR?UVT!|)Bl=?|We>AKzU0<B zJ3hlGHWpYmuohL$x*Wed*y?iQon{wiRu2_{Gdm}7yeG=O5;9duTRc<-UI7jR*UNsE z9Tut&YW-0)gHL;C&Saq6z<1b+k}pH&wc&A1SbDVeh)$T2ZtN(=xV=q2pOV?|7^eau|c`{S`_O&RSsTd0U!F!1C zM?C{-<;4(Y{1-dELBxU`>p>AqC7lQbV#zoehFH$Vi|mCk`#>42OXaRQyD?$akG7}Y zFp|cZ5v?34JxKur_SB!w=h)~6?WwcV&diLAYz^k4G>wr(tpPyUXM9|lsdz>`aWAGy z|eVIxp#ERh8m07XSpDDvJLYS-M3N4Do zYfdpKU9g-$TmP_nsdt^%cTMoTg;z6oM(NORjGLaqjBCW^dE-HUV@aCd{S0la?6LU9 zCM@*n$6%}Q8*|}K7o@BE=zw$3{z8d&#*EpXU0_W0IFO=89Oox}kA}X7Wog_*N9woX z+7}#_xdJ~~36L?3O(-iG?RgD#gYk2)@?@;PIzcHbxQ0=@elWg(%6#hD9yfn6ucT9h{O> za>FReIMn_7DM`_v!jut!`SC7P>muW3l0$ZM!-{iy_5ot-+Kw9kG}JTVXnzT&OedVM z(sUS{cSjeLpfwu5dld7FJ(WC7F{Qz6IVB|4D5hNeESGGPuSCys!rJQSggr}Sg4G+A z3b*je5^loBt^AGj&W>8y^cY%)>5+~s1CPOadidhSZ$92XZ2cA>k1(w-zJ9NQv}Q00 zHgf&0I7V|Th-sIDDLEr&a@Upj96u zB2K}%5cFpykc2w*?Fcn$(DRSLR9#-zxNg=D52iR;Vl5I0JyNKbeQ(r`+kjVU>f)iKhaDeSy44yA5r!RNIlRUC;Kl} z$@m5Mtecca^rZFv%OQNAO@Ij@t0FM@au|HE#pgk*&btzEVD{ywXk4EW%^(v59eY?~ z?kwr>m$dir##GenZz@+#Q2Y9O(2|sr_PwGZrN%$Sdk&U%l#6D-t||-$$!5GNn(-Po zXiL3`$Q)UgcD#TNG9yomasqc#_>v#J0@H69S_G3StpN)(8eR&6ul#&nNNP+}t)iDHNUi}3`Bh4$U z4^btocxHY9I1Yy=J53W8rI=v?9XiBNef>O;0|^4r2cTPVX7nxCPgP3ZV9`0h(wC`$CMW&kWqMFvArWL%VM+1-V zr`S{??eVzzhtzE zS3QK40$S<`jZyrxfsNu3 zD7E%I9)b@48N5?576ahjwZM}99^S1wA|P!9K9w8>-M^lL=@wze0c1BJAr15bqwin; z8&bhs>u7-N#&h3!i4Q$FgaB2uCjljGe<1F7=?h% z64$WbvyZWCSjaFE@ZKxm^|RxDFK6P6EZeW*>z8TqsL-5c0>!(k5J&~cVB11O*8Cx zVmZE%y^(~VdO;f+(u1n^1cv^STD41FPVm4)ykfzXdXwk#g5^c-P`>tc6jNc5R~FD! z11UKoMg>-?VeZ+DS*qMpfzK#&S65}DED8S|k^hZ3z zf)7X==n{0WZf5o&O?-f86aOCM=QaEsC@8Fhb30ADZ>+@^q8v@$TUke;(=Igmel9vK z7b%#%8S1ZP!TuVD;DP-WU_*TvCS{C|C%?6Y@=Sga(oWP=bHfai?^Y@ca0)7P5W)j+s5mgD*WGzaG6ibHT?S~ z;ol|v9m4Mxevj}^2tV~&o-SATRl>hvEf3FI$NehdKPbL05b0kR?*ZZ0iFhqCorpJ5 zKTP;1L_Z!9{#PRYHt~L+@NX8rQ~1@wpCkNS;g1yl2{GD;)uk&YtR?;8wfwy{%9rt5*YNN1y{aYhU54M%%)?7h z^S$R)Eh|^X|Dk@hCh}h;68^R0>w?jnx?ZeqI=8viW^+znojqCRS6w}&y4Bult6n>~ z-qBzSh7(;*&u9@*$b2+o#e1yq&lWz3{o6kIhPJlb!X3!L^_PFuzkb}Q{`HVFtk=P;cWjJ7 zpO_FIXB?88bm!EY=lrBJ|LRx1_W$)aZ~wLTvaX8@KOg$}B@b@A==RsH82h_BAB{bv zT-HA9na$bhJFib#=Dz$H=XZa4x9#DWckXt7es^c5{q7HLod3*cyYB5YzI1<5x?@uB zTIEWxJ(+Oj>M47>Hf)~cy#4;bvkxq69P>!4cVXAB7dP!5 z9k_jeddx3g-#mTDzgq9RGG%1vgQMe`^2b}&m@fG1Q`>U?H)(9)f=3T6s(9g^%Z@pw ztU9vsHn*exH*1Hl-Lol9yZe??{m*ReYpQ(k_^(es^Tpb$cQs%B;_H(t`|8)0Jhc4k zv%ODzed7GTHpN)#PR@V!s-d?}s*~f1K4k#M>1lD>n{70WT=mu#M~l7Q+N6q5wbklg zr8e1GR>HHpRC~*6Ym>b}esww=ZnfFta;tSV)mrCrG%WsByj)|Ljf!M567Zwux` zaa}63B~(v~%hTHGaJp@g84V}~Rn%x!{xkl{&3|0^r1MzI%%U$VezShbkj1yGGTi;U zH`~t{{c_J`J5`Owj>+nGDr|kFvQ+#|WBQrZ#=}$Ab6;cU{u-yl+e9_8i9FOgPyWtf$aLl*KZ1BG#V#v>N@= zY@`08k5)C8TP>Muamnc6DCM+;)CwmEq>*cwC(x8o{X zi|inbHS%gjIl=F(PDj1Xh56Bd{Os;^e6G|xno&D@U6U;$o5)CPLY1_(&gFHqIn_ER zN^@dhQ09OcGia4*$ZQQRn-eux2dj&x#kv}Ctf-2Jb=nqvPcHVBP>Uk68Kgx~*@(Fn z-gROvsf#dER2m_tqe*RaTAOXn)}}^>v)R_5I?xRm$$BfgdXR{;Xk~Yy<84mFvSI?e zF{xZ`B*OeW-MVP~HD3p(`(7!&%XqC%^7-F(y+|kgR^iL=t>T?668urc4~aiCH}mwT z`@Zc)@m<6VM3sBrzbV({Zm?sjHaT4Aj5-@S5}*l_`f8{$VpdcChPpJO+g-MLkJC0; zt{iK9y{#1>%eK~9?`~SBI$CTzIRS@eEGL2r8co+zyk8PUgVw;OU6o18?JW(CH7=}M z43f;0l|c)newD5MDh6w84MnQouc<66TT-*!yr{Hd`O=yt%NA9c%gbt(Em~SKuWZnq z08Ic$t&O%6HA6ekD^A)s|N4x+aIUAq<4Ct)I*&2hjtQoi-}~)*$VP(+#?yHrrYb1k}lsvFL!6FoCnh>ZR{g9CbWkQbUR?kbg&$l?06pBYI_W z69aBGr}S0#Dyo!PkG~8s@l_uD>~cF=Rlq6$u&5}Mof_=v2AiwiX>SEkjE)ykJUXHU zAPo>O^h;gia1tnr%0E>mlx?xM)Hysrd44T#7tIi=1kI2-tIL*`>v1-z)~41~);b&D ztxH{2HE(hOdR3$O;F-wz;{;aDKzPZVxus?E=9|n57Fx;|Ra7osva|}a!xfiYYOSkp zur;n+Wxw*Orsft$>(x$|+p~Jj+I81tWlzh=ot~FpP&m1UO*_^TVeR2v$U1(f*P_+qlcQ7 z2MZg#|DuLNHf695A|eVS5}s)A^-NQN zwS)nL=;8#dw^^M{>jvh3KJth9poS$KGvCRXQZAX&sBu+|d@2Bovo)=Xe8YD9uHj9x6PYLal06xyJxBC-+n ztE^4b&hUlj9~9kiz{3F(8>mu{r~tuDjg#FB?eZCNI=CDi5q-j_Ar~jiNOKLMm&V{&Cx93Com&lQ)))1s%fhw`T-bBVo*-!JoJ2I zc{9Ls5ic1XJ`>?MpgJIY7QzXyMaQS`X$Z$ubF2YpQ>HF8mxeVx6dt~s!h4?5xYq%u zp_79Ak4iI;zPRkygii$u3ISPQ0T=LuY6qRi;#*`#5tMI4jhgK)toxP7+ihD3Xt$24 z7x5Ba*Va}DT^O$gh{ah9ARAzx@Vc)7dY#OPDQfCKNJ2*n++j@tnniZVf)jjT;OIMB zVl*Xq4Mpfm3@sW1Hm?atgMkUBedQ_yfzbtf4@^re5?C2~tFY`{^@6uJ#GCb*Q9V%Y&Zaw;b(T#}Wc3;`~vTO$aifwAhXAQ%J}Zd<#`3IUC+ z0ZWWMk`I%9Rvlm0#VfdfRPa~ZYWaIlJ@+fCxu0d@zRZtH6+?f!_eOq~@uVNomrKeP zFDqMGRYS~9#j>i1Zx!g}k}7k>qMErSi{_SD%1R?XSCuT8UseSUspR4kv!!H?r7Yqz zdoh=mfsd-X1hFnITVkGPj>@BCS(S-m%;n|GLq<_C!Yff(G8cJ8lrm>Y#X`)5vK8j4 zsDzc~%CZ`BMGeo>(-P#BBti(md5IMuxv|+-WA3h51#yOCw6I8s(`m(Yk%TRTB27fj ztW&|6A_eQ(Z7$9?_XxqN9A9-S4_9yFenkCQE$1#NE2%0IHCwUe(E%+0h8%{5 zuMYE~ITgzmm7@AfD=QW)EgPgljKm4`B$LRoUJS0^Ak8f3?qEeE+b3gkYKcp$LgW-9 z9wBpRA^wK*7@UoCTb(Px{c+GUpf4Ictxd!MAtkF$7;|Cg%#`53LhT)Nopb(eaB>n$ zO!g03cY}0KDEC1@RcTSR%hBjw0~7=SsmopMb~u_qCqf`t4T%%vYm?U&!wl)@+C?*}PA$wGZdzT77EySNlFwBMzh+MttAKKL@}2Mfzfq|MsZws@OkUvJ7-vxp`3y2!Oc@t!k;=1(pLlKg4zt z-@yfAPMh1~YynXNe8@3Mh!$#E_y4F<8I8;l3X>qvtV({B_v4kKJ&lPlYL4G8JKnu~ zc+-b(jjr9fJ!O4;`@QjxzH-F{x0T&?_b>kX!X58*i0DBN%Yr@Kf=-tECo~7?k^S7= z&ii?rgZnA`bMU+B72_bnqrbP^^8MdiMS2-8h=&u z*dppD`~PCdU z7TVD>3z62c7Af2e5{4K)YD*StdFR~4Ka-CKFhOdKG;irlivfkT7xcU%}m-R6B z8G%_pHP@PJYs@XovE^8^a|;UU^K3cOvZv=~P0K0BD#)$NDJaY>Xv}MzbO?wjg0D>X-5+uWzMzr}<@|->n$>$xye^;-6wl%o>rR*kZLYTCJi# zR~diyWr;=c@k***iC1)rVWMtE{DrBCnvVqfIK85aP0)^0iYU204p9=cV-&5nP|<7k zTCGl}jMwUvM0z(Mf-+n?GDe};$U9Dn)g@@hD>INb2`Mv>J#y6pmC}yZ z>UAmlWc-X#jC5&$eynbscD%M&tHj1B+QfKeGV=3iCn&3RdTqQCqk9__Ky70wM{Qh8 zf>z0zqD>mE&q~ni&W}&hs(Niq0X`v_p&(AHy;G+oE3s6ZPP?mEqwGx6=zL18s)>O{ zie5=jwUt^8+NoDYYYoc(XvYjoR?d$bov0|2bXjN{DygI^bJ6!&Z4z2GRmnjIXtf5k z{6cM`IHr5lvE*-DZ&Hy*vF*D5tStsWht+^gu~MzG%HBQYdaXPB#?lW0Qd^l01=?Xoy( zXyNjG9<`Hn-EU0Ix8zHJ8N22PF8N# z^sKzB{H%hk!tAW4?WRvy61Hcm$$vi zef2HjUz?y_t4^7sUVqt?DN`;VQfFHUIsVL95I!}i8Gb$e^rvJ(Ch z)~`tl1=~#0?~hY67?q*=V=`4o<6v2hr1+pX z=rhX(Z!)5$YM8#5a8re7YGaH>gR|8G!tXdu_|HxgPS=-Z43ZCp6HY$kiMs|wR*1dQ z6uight;A=zqfA3IMhZ3%Xj6?gs2N7{Pmq1Vzd)mgjf0IkMToKdnvpa#axfqXa$?89 z>Q?>9Y8^Tfx$#$^OO`#0@gEg%#_eYntcG?~{i-lFQ&Z5x`$6K#`_KpRaM9tL5Jr3# z6!x$KtJYSulCnZkk*8&i)7qMmSqlXr)vDGmf}T*V3WC66W9lGCf~#m?+(55teqyNA zTz=Mlnqi~VbCT5Bb3U6?JMqG-o{5f!?wh22M4deTYjuj|yV|^8_TQKHt&*0nBv|v) zlhX=*H{|}psi|p2$Hu2EEY7`u>3Hkms-st0msL0pFT3|C>&2Q^tjlft?_aKYD{Y0Q z=l)Cn_)JQ8Zz(;7!`go;AL#?y zBkEE83GFGv*Gkd_GiEQUxb2s}{MEJIpZ@%TKkvBlPcgCad9!9;e5`xFet2qL{>97J zKl;bVo}S(_?52)ef2mI%GIUsGc5YGGJoAD@6%DqVZ}Hvsc<0XNcD?v|_2Yj#du(i6 zLgMgId4)xf{PxhB@%dYS@+UI2FUVMS z?|t|G`oV`E`NNKVTx+jifAfQnKDN!@{l~{z9J~Mi?oY3naIHb7pR8-t zDO0DkZ5*e|HjdS&$B#EmG?eOxT-f$#Ou9Z@pAnavxJZ|qv>`u!WI|l(jIu&qeO!Fj zNJE08%h8&|Z zE@p^6Zo@4d`l}4dy7<_X+iKgs)ou7o%qZhfS9+G|Wy@S|{tq=(QV)&ly@|P&Ra5*!KEFz0&5-Lud809nZAr z6ZG2lp{15tZCx{C6#X*8*}2*cLni4Pk}ghY`(wel)PIm zNzyCEBz*xIpAk1nuN@M9!G;xa<8+C-8T#=Urnav)89=WY3^6g<*qFH3_@N176GtbF zPEHw;WYnkVh7CI_exx!=pQ?=3jlu0#W3}guRCN=zlM|;XS^8}4H08J2NA2yZeErRosTWmWUi1DY->pBn{kMPG@#OQn_P+4$ z2Or{oD7GZ>i)PF+FSvZut@!wt9Z&9hVc#nse5eU7m>INUu4u4r`pMn*?%nrF^3cqp z8D-|>mt9fQVDtUtw@C5)-uFKE@M!YTGO)#MoBsUNGta*E#?jB)H+vs^=$U7q-~Gy4 zZ=3FX`sH2wUNJAKSboVBH66F!_NT}H_H5^_-ERyXIqI_Nua1A$-`0HfyYCG-r^PXL zT+Q`2{PD4O-z$Iesga|`pEGa%q6%6xH?05b^RK@4&e6}mbh>VHd(NLS_2I|<_U!Ig z-gxgWP4WNSnRVMa`}!AETzXk-oH6BssYgC*apcdsXinMEm7YC&yZ0Y@^P}(jHEPX- zjqm9CFu>i#297B2*aY-vtyTo!b?r6)X&v{pw|zLF(wu1$DLQBHtVlEuWgTE<2K!x zn2q1+E{Po(pBhh7?n*3_F)^3KPBhF*n54&~&}Ao1(vOKr)V2K{pDe@M{uMVR&DjKMbGvTR~JrkZ(m$o?$95MA-RsPKv{i5lv z-ym%IAmJpxo&~qW);JdmBf%}-ItK)0Ye0eEF)p5q!+5UOpc#M49xQ2S@bie>-lhUuvwVuA7wy`3f7jZK9k- zR0tj^m&jrT@e0#EVg2L=D8jd_#Ev3rJ!M)R%Vl+zoWY|%j;t?k+SFttzv%E>gwsAx zba*zx>FiP=Df2j6Ai%Ma1hNRUDp#cUv|x`NtOWKnp$FDrE5bg!v#6*M^2!oxWA9}vC6vIre;IM+v=Re=9+&fdvU32uz#&K5@#}?KGmoXt+hJ7p$eT| zr@g?QooCOPX3xvDXHP4zlPZ&^09tUKoM|5D6eA2uiPzW~bEY-s<)+nue;U}%n~`Vo zAnkt^<&g|Ax?jdau0?cibojXlC;lKhJRRXQS1!B!TB&;GS_fdW_WEm~(BNUpa9nE- zN=fKXTf_Ai72&y-)Hb1S5A~SlqI0jG3F1MWJxM(u`fzUbLTrLSacG8`F)6cQU5lzt zRB7qXTQDYRj0>xEf`Jp`XUvhmbEsz z9iQrXx>_*!MMX^LTT8mmQjCXv4F^=gXf~{|yAez$d3fY`IIKb7(OEl4eQrYkkZkn= z@J%ykgVCL(UZcgwBG zw$fV9HygKn%GVpF7<(G=m)34{IKeE4ItGLnohF=c3&o$()U>*J$`1kp5|khn=IRk% zFX{(+>flHg9vyB+81>VC3(tZAAO|3-g!B>^A>TGp56MS9gfPNKAvpn%yN0)>c{%3^X>_aj?+YAXLzz$7LxRK=7v3)3T1h?6qZ}GS->- zLBmq}O1rz#;i?eYn2T&H<I3Ask8)2m99vyxI!Uik%F9<(>kobQ^*kJV`I8XWs(fNB3MsR+x zaDpk(;rAkp=#gSLdZNE?MA)Q3!bv_tcpy6dO(Hy6ZuT<9o%9R%X*GF1O5k8|^oJjh zIBE*20+e9F882pRQz9=$P}S6V8fiU?ve^NNW^8DaOp*5Fq2mNH z53|}10T{t=5Wv{2{BNruH%fVNLhC6Eo^*e~;hKaev|b5rN1x}7KJSZejd%{K*thD@>D7EYZ7+SN4*BemNX)sPMxf3c*L1P!)|sbDTQnN|2628O`S5O8vpBXjKS@M zaxx?68tPWAvNg3*!$b5p*G4a58)vhDtf@gy9^?IS1-;-|i#8Em6CJ(_;l&8I(9zoJ zC7>kd$O6l8I(aSR@9aSo_C%-u5}}l@tXKmO_0o0C^KEV}@pIAJ(ug;63yu=wT=X@z zZ)`FY|$?&shpFYzGJJ=|?)-~5Tr~^VQ z#fC5Wcs1~D)~v+1&_JGP@mR4!18?AbVfzMjm}CmAWjlrivpM+QXeY^SxmZ_AMZHF# zUL@}Y`^L#Q+F!u@q+Nr5r^>?iB#4m&L61XW>nJJccAK>sJTg0ShK#@B{Xnppo-JBV z4_5j)K2BkwA-xez4-ele{B4K%`|09WCiDDzgs(C3_tV9173EfT@_e^-eSiLb4bRW7 zhW@pHh>(sCKa>rta1oV2 zr*FjhpN06z2!Od*>kcdzaB<+_NdKKcH{-T&PLCY{APiz_!SO!;baC1fL`|ayXN4m| zz%Q(Vwm!x+$OE?6+@!`E9u$^@VI*6Fz!j9Wt-*@*$qvOsSJ?%1ZT`l#sN`XEnJJy5 zWa_;w?3|mZzSQ!zt%a(mE2NpbhVvxAj?jQ6HY9ki0z6XKTQHb)1W9k!p*anc9W6M{ zjMZQhr-5ig2ghUSEEUeE**(o+->FvB)w(K6&t8f^ISu9}vM_*A2U^LF-u%j-lU`NZ! z&|tB7?eu^g4nHmyQi5YUZP-bp8VR8l_NZXN0px}}I>}G%u$j$`0jzX50c;z%$l^zU zs6kaN{6I0ZPM3Vm*Y85MXf>LD0B#Zgbe357Or*$QrGuY)7V)Cf`M_5*_}Z`<3S5-H zj$x(ELYG=+Tj#(&BOs{VDYg;^z{^WxI6k%p)0-Vj*{yHbhF8hY}2l3DJ5G_x1LNt6|f%>Wlj)sqfCOCA&xY2~Cw0Hs{-!%Rjgp+65 z7^hHP%J`PoyG-QogHQE7)BLHkB2@KpGK(F)ayVVk>ksOtZxQ87I)Hd1;zv$H_uJH^ z{D`7B=Y&-#iEsc>waT)TiC^d(m@F-fA3(l31%JYxMVcy2sm6kTQ-qKCSg}-PD1)ST z8C-l*&QFsr&&b5G7doqK#W8ydKSpn1YOxHfBj(lP-|_KTF6z7y{s_3RI!^q)I!bs% z76r2NGBwfp5r0X1%!I@39E5F z4VWE!C;;dVb-BHzq|z)mK|m=n{uyT}Nj^f)YodN6OQ1*Un^ylgL+M^6XKGC=C_MXG z$y%prdA~?Fj%mc!M|5}*!ih(yAVU*4-sC3rV>VTh-)cMS0U$6aCBc*ubcSsWK{`Pk z;38U!EIeI>+1;WpSp$yrsvo0qGzitsHIy?1kzi?A)4mh!T7f##a~mAN`GH)L-Bsgh zq13j93^dDa%cS_x>4yN065hr@GBY+rB9H)tWFav01yT`YxH`Z}6;82F=Aa01LF~-{ zeS@=c!9A5$D_Mhq2`rH5D^a#)n~sl14OIdU!9IF^l%66DbU6>i1jx|y@~U_-3|8gh zH`EXRfBJ~(oPkGLq^EzdYaa3F=?N<>e4HKsew>L)Ct^;HcL9@zf!T(NJDt$f+-czb zTp`Mk;~L%n+wpxS++g7(r(G60ItyV)9Zs*4Rvt;-h+#)XgTRT|)L~n7%($7@sEE$@ zdgMv-Iy(Fggb{v<4*&US!nY!v_Aa91FUPu>Fi7}fgp>RutUa8(z>+HWG`a0_(55QK za_p?n#m3=)d|yG@!Rp0%3ZDHwdven2KoV0E#X z>cEx*SgT27VT)6Swd`cl92`ojS^{eivl=0)#TGv1ij}PY)WI-Vs2WoeYHDb=xds}F zHQ4NPx@&?}6knJ^YVJV5A_;Nzl#-Ob&_+q1b=6tv%B& z<~UmBNr#!Q57?I%7EdpIk!(P`%6J}6`h%5|EfWt?jwY3-&k}xg`d=Xp(QYHSv?Sav1`vdQ zh{O@>@RtNOh);X6^q||>)7{14OpoxhcJg=W7mIhz^E|wEHTO9@IxW=6t_9(<+74Qo z35Ql&opvU$V(L@;q@*@{%wF6S;Rsc$fKcUbP z)W1m3M8d=~ooiyx%FYhLhu8#Zb_@bKJIDaYbr=b3E-g~)z|=7-WGn%S}nPgoma~)#$GTHfj}tsjVY z0r%!O*3Kjqtdf>>vq#H~cl0)9Eo}Qyi^7|eG@y++Qr;8%!p+-2woMCf5CRo!AGiWbM9`>guT)w)t@9@>78(Y8mSMH2B ze@in^&}jVeyi*)L{Dt(<@2n2E%)Volzz`S9RG`CK~LiCqj&Rk0GRAN&Jvpo zTvYUVoEEjV%n3at2FHVW(2wYSSO3dAzth#X)z0e^#$iX~7yY6Ip25TaMt?m0`wxpR zJ7JJ~zUR{*vH$a+<+S-YhX~sLcGZPWScjileqlr;94$=b`@(WOh>xU4&X1s7>eHMH zuZ*%^oi&o@FX=k%)m;n!EDd;C#o3^Sc|6Z zXVtF|OU|C?{jgF9T?mduhcD3$9$s^r@Jmh;UU8amva?F%E^@f%kpgmMa7(#8hs+2{v8l*k=$kq=p4 zm_wGdTFClC2{&(6#`e7_cBwRLZ+3-#2Llm`yPH?P*aU zeKE1UX*1u@HIuYb{4T}zTosupuJE{*lQl$AHWVb`Jctue;8L*zy_hzi%b1m4Xg(s- zDu=^DJI{beZ0C6nHkr$U8_yJjLQ2K9^IY0?wz*2#zOxHy%dyc6-JPpkqAHYtD3=nk z&1}KW8Wn*(W+*;lwy~Y%WuYq-Lh_|DM$qwXSKRbN6^*pf{#$qga+|4=f!~ruEy^7;hOhT|qTVYp|8wv=8h=Cmjp?66%PHdNKP3YehtFL4iZi>F5;)6;}acB?ThZeeW&Ta-KPnEO7!39@Ia-Y zk0s)iGHvN2IeVgg5gbI&AlKLpacj?RgCiZc9Llu6y z@GlmAhVYjPU*>m_crOzEqNwj#;=NS(dBR^H{7Z!|^OOE$5ndwvCE^_XWl`~S#QS{V zUm|?juSp_9pm+92KiHoK`uk(xhQW=4%YdVZ67S1(Lb7^#jNA+QL_57+07m+56W^1Ey=>Eh5M z^OL^JSH8>k$o`k#Pv8P|4K4{yflGtSg1ZQAF~~o|8BgXbeOXT_bCu&xItKK}cru@nJUF;dD%&B$WqvYT`m!A#zTV&eC0xuK{r#zM z8E^$~3*jz@yAp0KoDc37a1X*g0k;qC?{Ix^-@&CH>hG_H^T6E#cPHHaaKD3l67B$8 z58M&Bui=bu_VV~ z%YKmKBKs-&U8a}$$^7Lw$bOdbWWKV#a{Ohu^ksQ6o%Ch?GQBKEewXc(<0tczzRXv? z%l1UC_c&auoC2r9Wy2N2Rlr%{oNzb5-30ePa1X%!9?tXy#vcAIxC3zifcp|ohkI8? z!<`401y=x90%w6+4%YzJ3U?jct#Chwdk}6L+_P{8;QkI5fcyX2I~VY%s&ntJnFI*; zLBdVcMg_$xI7LvjRKrb!1)O5QXtfz2fuMnmA!wkeBZW3qs}X4%5$g~F2@oXp*p^yt zqqUWDyfkg8hfir8DOPN4PioO(E9CqA_gb4wh9KIW^PKNI-&xP|&;MQTUYB=W_nw`- z)_NBh=9M0xFYxQZZ#Tak{Ce=&uQ&g?UtfOx`|;E3#jh{Fo_xO_-%rm^-*1oqsqG%3 z4F`h};9{UQy#_1<%fXkyec%zW6+8|i9J2Q`{1SKt`~e&WJ=r_%bTAT(1G!)-$Ona> z6jXv$;2Ypupb_i@&w*FK8=w^&2I`Y1fkEI;w|&qy>q{TB1@HKvZFKyDw)<}XpzX(1 zhuijj<#5|`j;G#txNYtUFt7S>+j!uIyEaAkb^k0c>Lks}(f!ND!)>pD{XlZ{5AmM> z4?lIdZF5SPZ>Pv7iu+NoKh#N@2hkn*&Ed8iUq9S7Zr|ayRgQ0UEZy-?^V;Dy;dc&7 z=iy{~__ImlGrv3Bb}AV3=Ha&KK>VI#$tS`&Zyavh3Z8dqJaM2s&Rq1mE>=3e>~p4z zlX@*RKR?`erXFegI~aZCk+w_0-SH!B_k&G9awBL4uY$ZgkF?DIbAjZA;5M)pRD9(~ z+j4L(ko{lRaPDde-exVhwnYob~BiEpOxQtauEL%unMej@*4OqumgM( zJnZCca2>d(`bgU@(Cz+?^4bTEv~2+EfaFI(J-7&5^^GHKw}1zLc#n+I|k+0FvJZ=Gh}{gTQ@1 zJ<_%joc5fRcOt(C_JZ-~=7Xs~@*_@O4ObEOYv6hy`C+gIJP4-mvRL%5N7`NkVqrsy z?CX5J;z)kpg?Z^XVN>IM9J%fvOwYIL>y88LJcAO~uLn(QlsE&3M zc8v>vT}r&;a-uNl*Y7<+n(5)?Ukz4*wIBwhs{;2sS^m3I`^_3%S<*zd5!b9L2liWwZ*w>kt;V1STX?qLI{w?9) zm95;L-Z|3ti9a*ng1fu5wcQUk0m+S^8N3Yskk!_9QFos8f#j><67Uu9Bk&@a)x*kf zBA<*rAN&P*IDD~_d%&x}UEo_z-UL4jLOqEOuI}B|wg5=J41Nau6g&)GKB=wk_dxP9 z@SnjM{rN2c#1oy|2c8Ok*Nf**!u|(IMz6zd)8xnTbVnP&f)_Kl%`O~2pt4ka`u z(}ad~yr$oHVP3Ef8S#wx?h4gK+VJkUEBE!Tf`ly9kj5lno(qrs+@ApQ9!}I1ZFlHxyy^k0*X=eVgf=Lq; zra4U~<*tr8Z)r(O2i;UJ?w&NAl*u&RByb&$?JLsl)>CtCW?3*@`sK$J!gU*Ya z)j=2W;)Xivyl{g%=<>aAIq1{}Y#ro#;lk)z_>g{7xm(CcKN+Dgo_|=r%urudyE$FC zbj$@NuU*Hv=M{^J@M}C*Fg{(_<;$0|`vUrci!yEb$}8p#n>xX>C)z=Goo7!;sxIG# zi*?Z1aEv{hUPb8=k~eYuad;H|VN#51zdr0b8z&3h`iluuY0Fx7GaE|>@Y{YvPcx>0 zLwl=Xr@KJ9aZ537Zs)C;X1w~ajeDVVraIFUC_Pt|8mC@edfk$*y>W4LQH7c7 zj!{i8E>FfEbCDG2A9U*9{~a#SC(HC1-6PyRk`?O~?b@7~47LXP_b~kfpEA9|JtIA0 z-J@B}U0XbT?{22|-0tD_kjxuBGEI+nGQz=FAj%%>rrTpy9&&!))#sO-5*$%^YVh=o zA?yQAYOx;C?#5EC=a1yM zZ){;*xBb4~vHd>O-Gt_*j|TD{+RF?r(O4ODY#eV44Lw%hoh|z3b_r+3GNQpGY4qx5 zdevryyG6RjxS)AcV8#=_RTVV%X@}9 zjA?~kd2HAry}A_l%3w6df>D30P9D!#4P}~MqrDj*qJE|NFGcS=wO0jxx{K#@U3J?U z=a~>lZieN48F%&GqpRsLvun6Z#MVkc<(-*Q-Y!AYWhV0r6MiOl*MQ0~Gp!t&$7ZI@ zW2(n}DfOs)MyKSXvQIp=?6zIQwClWM+HXkTZe#mqc-F=;qZvuRZi+bQAke?7={wrl zmF#-7e(vF#?^Hi)@sDr{zkbYHe4}~5*2k-`+@G93pz@EV{9b=M4ZAKo)~*5FRu9PN z{SKw;VApwf<`+p9iadybLS7OqWJ)So*-Ylgzl1Av|xMY|gG4YEG>=g}V6kv2}5A|J4_l zWSh~I1I)Qq1I?K=gUrwjcSnmIdk>0UMjd%+XOVU{;&e5`Yr2@hf&M1_ZuC*Zsm@gH zD$@3yq#FF=R5+YpXVFswUip%6Yga2@sKYl1a~&)fgS|Q!(!&g4@9XqlYv-?TxOqqViB8|IyXhAgXgZEa z!YjZi7o`cau5ODVJFl4nxp64lenw0iRDw3B-Qi}2d*?_%0h<(sV@ z8MAt1P*V3i^yGw0Go(*Y^I=5KN1gfozO|pQ>KzAR-9N(NjHF=~@s_ z58nN-nrGiU{Gp8jk8_cI7k0W(t?hriV9%jfx{4!>!ifVtGKN#0(JD`%SC=W=L(2Vo zNT6@G;mnc|MH=p|Re9C;fmutRLx%cCj{c^IwvujhpR683V zsk1hJ2iCP;JAW6#$RFsLIlN~EJ(oKj_8)DJAp?5M8j#`jjt;Yi?7Myv_6_N7224z! zA$UG<_r+C&@tx+md+<{&p7ZT&-4Za7dTYl@WVt5Tv#XPPO<+KeDcGbtb_bi#cWP^3 zOn)<`gl{D)1LhnyJv*Z&!whZ6G}$}5nBLE%_21rIhxg9#Mu&ITr(UK|FDt!z8PKDc zd^MAF%(q9zSlWB0*WRJb)uD{6z+gi?_U<}`v{o|GY+3_)j3xfuPU24?etC!f5>}41 zWhg`Gz2nJ!yA{(<9!u>ffuTKDYhL%B*g9B6+%Aj>_moAO7L&(gN+*51oifFZx6yXI z$?uP^$;fJvd{`~H0#5H|YA>~w*msH}ln_4GSHi99?0by_tT?a1atEAW*S)x|T;9`T zdbtL5Up*+JFJdEtj@EatE@K&cGmnlvm*#ZM_~~i(?>@GFhWGRo z%ZheuKAL8~tg-zvdd*GEiKDHI_gim3mYz45;oDn;KDd-N-j|+3pp$14?^%wIJD4Ln zJZJiC>dm6*cDge3@3ahh4j+5${Y>|mmE^-%9l|&mz&Hpo4tg*Sq#yDjX?o-Q3i`k) zosaY5>HYq*inzYZLRgEx+9}k|>I3CVH4_`N2|g(n^mIRhngS^XjrG@*)bSd z?lf5S80eQZoW43SwXgbZdu=EEMYhDJe*CsQUYmbhy~?e6Z@>oM={I@{{$^XWqvcM< zZ5fT@nB(d@tUd=0FSqjhU$l`IuFyek#+1XVpTgUM-m`WIEPtQdIkt}LUxih_YhdXQ z!Ezy&_K*?1SC1%J7SKDKcZ2C8+rGoe{w(!)dQWqD3GZ)ekG&uMPr0Tx=|sTUOaHUxw8N z)7Y$Dam!%&$9>iMzX;1eltVAocZR|8C+`k=?^D`f`5W)EZJk$b)4d;-dlXi>yPSWY zyZ$#=@dEDN(m(Cq!gElk&m0;X$W(xk7JUj^06sxUvsTE4#`t zc{+9v?q>SU?H%qF>lyXmOZszHDc60cxvK(yi&OaJN<0!Yp@*$qOTK08?2S%#24)Uj zJ+q{znO@n;+wPGLP||#?H6ynMwA(Eqm>I zny_YB-_GnA9ql{?|1ooZJ+=YaHB~b1bI$M2r;|FdL;1!??|Ac|Z$nL*4GH`qo6XTa zkl4XI@ABNzU@umq^XjTsm*L!BM*H^{|9N3ZCpHZ^&U1}y9efqG4$3n9NB0f)iS>^5 zYPPNF+nLLC->FUW@Q-i`zfD6=2Mzo9dUm}6%l+2*$$JXVROS5s?eI*cyw{!}?W<%bs{PXxNj( z%kL~?x%1!?<-hhL4nD?1;{ zv3(P@XOGx-iX#}p=Zc*Ry&UxBf#hym zhLT^|GF8ATlddbCKmNbo$yk$(J4yF=>vQ>6BzhdpL ze%0EabR32glu2Q7{@s@Kdwc9X^Bm$xb3d&1|B*}M!`=mykoSqkR5f9Ir*v!Z^Z4sI z-`=Lz7}IRo%}pUkL9=cT>UauUAHLDPM)I=rR8JtGre_$%E-?rnj~$Y zbT5*O%XR+r=k;;K?<}7vdf%x$CHQll!p|rEdeE?cx|h!^WVtWEt~|3SPpw~`#BuW3 zm6lHn{`7iF?Bm`Fl{EEuT%vS9SaX{`9hk-k^?My1QYy z{eC{ZyUyaBK&}5yK>eoIZ1U>IyC47mMf!zR-PZRu6L%`AZvEvPrvV)cWr*TaQL8=e+(n9F-DEVs`2dG|4#cOMhee<2Myz2|EEcItPW-%d};9=%_f+sW^y zQ%C-_Hor?Z+Whli zFaNanikd?rq;b4Cq%tkPIR0o_eyu&I`|dXVsmOBI!d`wK^348%^8Ju!_Jb*T>v#MI z_|xZ(oZk9=&E~ZbmaB07UCuwfm%aWZEcb!)r;m&L&tp#~^Y#k#zEcXT@TZT3ChXwM z5U-1iUrKg3Rd4EDOA z-5%wTjXzfz;f~tVKf^R(i}L%1Hpj%RhrRrJcU{VTbYJRybQNi&kAaWtmwmFVF~vUb zy$Jr8XFZ1AoBb7m^@^qRRGJ@IGjGFP<#1^eWy4=DdBT{C7i@w{g#cxvhAm^+#cuGb;V16 zm;Hk5NPCy<`(>+AIY=1a>3-O&@Yweok&|tHtzHb?*WqVxOIuIql=ro;Z2J|g`h4B_ zkG^a1{-b4|Ba6r*^_!Sf*{{QU2;)0R>pQWlWvI0)4kxfl`TxM#dKx;}H4K)1$VpvR zpOnE@cPVxxWk>(^-;Byzak8TAc`Jty{`7A)TG?zi=Tw{a!`gTjw-NU8>fdd3|BRme zzsc|Yw%qxo6UgrTIdVlxo@$3x_~S|xC!3UR?m5g$pRjq%LQ}dHD03!tcZJFk_XnD(}mY z<)*>%cUI17<(blFQ)Pdy*qM^AEZBuVy?)JTn^)pfj3Jj_HnQxR2g{Yfo*kY1-(2M% zR)j4d@i*Bt!un3BUyr}QDg3&~y};&M4d-H?@_q%@^`!G3@3(l<$FOBjnk@(Lm!#R! zGS=D>hQnj5E&m3~mKNtvzXuL0rasc{FMgX$k1Zebf6gB_yvnAsj36)HX-|hd{H-z?CsH{Qm)o-C!qUa2 zSbrsb{(t4H1?}Zi4k7%xu$*7M*cSRM8-yvJJY>1g!}1U5m$j7t z741uXo2xcjOFDelVERq$_#XM6(fMuiWQxst9^8vR{dq7l)!LbWWoN77+$+&vVRgUG zvvu2zYbxs~7iTQ2*wb8`A!*<0sC;AiUvB#Itn5=d*K^HxN~Z{au2USX(`gx|8e3%B zMaXi6u>9$5*Py&o+AdZ0$6!lJp2|JhNuHq@HvKT1aCtp2-RAu>ShoEY_G~!L_e?5# z(?aYy&hP5~F1_kOePIu_`7R3~>&9b$Unf6j%UlhstjU?SA0%L1i8_A{9J|Vf=^e54 zGaQzSznyF0s`J~YQZ`|G1FZJi59g^cIDc%k%(msL zcAN{VuH|&4X;w$SYEN~pFi(=6+FjpldcUcOTY^6q_%6rk!uhs7SHntUJn71YiLmO~ z5KieTyg2>+#+Xvdk}@v+_Pidw?__Tg{;*T{Wi$mDCVq|0=X9w{FE{Em+CM;L){QRG8IM0lu)1MhX?0>2?i?I7Y zX}(Y$%c5q|^quxd+JisWDf~K)MXl{&Sh^NAsg1C~tjhJH8?5euFWA2HAT0fG!gzfE zmWw$5Tv*p1asKC>pXbH47@u#wkXG@PHZv7Jm#Yhjn?G2g{%uFH-cn`gQW>3+ZOjVG?}G>7Hm zPk-L8USRFWbsU1j*eRRdfi+isalWmuJ7MWxg{A+C^V7GE`F5p2c87S6F_R~*ly6sB z(ECm~@4=tv6lxQt-(1T5>?WJn*O2AD1MAw+?@hb%t<>mXxO-pL#1wTmeaCofiDLIs zXR__V#Tn*XWf|T&W$`b-{uF<}#*cK@cco_-qj<`{|IHcZVesr$%Yk6P1eu@%y)#Yk zF+EIgzUTMWN{;c?AjJaNSth%vo5{}aYO=?4G1(`Dyhl8xB`40irM=AKZ{s_ef5|Wf z745n!(dB%b`{vSiT>-iS=*FeQU5?HWcSMS=8eQvS8K&me_PFcOMIR^bl6Kw7JCK|B zO_P%Eh4Dm+(4IJ*!fR!e2HVf z9K%-F{C2zW`<>svUUjFv{x`?IzC6u;qpK(XdX4j6;=)aKe4W$Z?l|o9XE@&L^amUt zar}hi1{dyG$Jvha-1VgM|H<)tPVd{*)#+;-`}!Vf_40dHAO7|CT>b8L^T>Y3qg?+w z%kfE$54n2WUgP*i$I~2N>NxB;=-98%Z@KYQ?YP;M&%e%( z`{Ihr7cQPt8sYf38Ei>Eahcsfp9R;tHf_!lyPvya;Agve9q^J@Jjc7gh%e`qHC>&= zxlk3wNB8en0y^sVv);kJSIxb#cpm%fbL7v$ie(C2%8`9GtD|wXExyZF;?%{Q@3)9E zk&$D#jTD*0g+`H=uCj-NAZm-;`T8*vPZZ`t!Zxti15IF07bW zl3&)Yxn|By)Q1i?pvYHqOiif@>hg({FJ6ETYi5^~a#*}yfnM5ZCzmh0r8s|C%rB7* zl~N{GQom08!;s6$uex<{vA46v)Frd$lrAi~dSQ|5n{xBgIi*e}{bS=zo-?nMaM#RP z$YBuW-tm(h@M~+{+i_x&PP;9gS~jIp>5;}&9GzG?Cl)I%vIniS$F`-lai!J%@@f-g z9mwEB*XHUsMLOcaEBnMr<;!9fR}?Rv$w>@li)>C4=9Q)t-Pd{j20Nw|FJ4el;>tFu zEVj&wDka5VI(Nd-3QlpP<4n>Ke>Qg76_n1JYl=%tKf9QtCtP}+))i-1RFs#gx>OHd zpXq4dR1U@BxV44LIpaXV=mitJ!wx2tmX_Vh*%$MQy=rU^cWi?wb$a2k7hFqqdaa{n z#~D4u^g6O~aK~{RZ3O8iFI+Ou9{rK3p1Mc}dzLL`m>yM6;*24$N>j#F`v}muvOa%U z%`B$RP+?aWm(EvC)ZWpwt}ZU;q8lGm)oD}4B|i1cs}{TQgkQ7AOwI-2+!=h7$!5ig z9`kOxV(Aa|FF=u}JWXrHcQASaL+y|}b^&XQtJ;rS~{ zXH<}L#ZnIJm|V8RJJW&-veCD&!+d~J@oc&(nN9-K`6A_0D!p+)c{->S`s&i+VojVJ zg5po5M^8Q6x}i>w(x?{&KFxaa?z5JoGm|6$6Af_j_Mv+`l*qlM}}>Px$`vI zV&w}tGL;EuNvhV$iz`Ujib2&)*`h@ZOpYUAxNeYUdRfuZQg3vtC9yqQy?r+GHCYzv z7?haiU^`itn@hY@>L06{Uv~7YT|USnovSN~{9DU#TW0TcYYNJYb54qeqf|H`W)i=w&dfZTM#_1;g}yPs;!bHl0&=!H0rDENNmp!59=(CK1ek}pflcT3F=v5lc5|j?&!fqi+Voh| z#LCRiEiEoz#!)`r?T;y&JFIsA^D=YiG1t5qk=w;*r_7u&Wt!h_>Vq@v88_ZUJs4m6 ztUcavxaPbVZE&fiCB;mreN18Dq{_<6%jp2Fo!Rf`(_Y9$blA^GTEwYmye%YT;gVSK zyoK`@&MPeOPTS#bH55HJcb$q@SnPKh&KBuJTgcSp^^Vz-X3mqHz( zMaZ|d&R^v9vrH_F6&A`8rnfHbKI|HZ#WwB$BpdrPrm(zt0Ve@b@(S;%L?_J7DOEKT zGG&uPA>L9QWvrcNT$yc9FJ!UORc-0`D$j_3&6U%%txaP()CcF=D^YLe;(cyP{_e_r zH)hRgpX|*I%c$W+ny4o%(ddw5)@7vJ$8{PL(|(cJ+2!hD zj>ocnynP}h7UkD;{=d%EK!*i(|3Iz$vu|e7>g&cweQ!Zv-!poS$l(NKd?rHferW17m&sCz}v{$H%xnj^}3k!;bFX3J`Y*@i+ux3 zL)M;SU9aUk9%StwRs`-r*4|<-gGOZSQ#SHC(nk)%S6*G?8=QWz6K0 zk>hYLb}x-0hv45aBUd7~!mpIsFiE)lX8yOS@bGm^8S9aw@cW<<+3>q8z#T;T5d0hP zBytj7wUn|USHrhf^1oB$IJ|s0Pfy4(_G%2qsq^u~h4+ITd@lT5 zpgL)W2fks`&w+0`KzQ{BxDAXWy!OC4ALJuP;qM-#T*%rtYUq2UgRFg|=76`6wYSuB z-~(jsH+9BeY2!=j5Aa-Y3UUm7l|7XnM^3_TOQu}fXXys^TiT0W`!DSQq00yZ7jS6a zIOHfCIWu5(B8z`;LBO;iH^a*>40vrCho@f}Fb5O{KJ{`d=fF=~$*hn|czF3$R*u8J z`CP#3pGkN|zLg_z-fWv@1U`q&C$Ng(Ge z448L8gVMZ_IsrS8o8hnD6fn;sC*b*|0ka!92G=YOnElej2S6k3)e6^@QJ?gUCis0I zy@>_PD?sH+!eh#yMfWo)J3vRP*(F*sy!|Frunel)*M3^xAAkh4ffX}+q zmN5)h0i{z7{|u-sE$|g9ZI}rBAdo%*zwG2BJp4;mABO9J(rJPJWtDBmW_Zh&Dena8 z6aMp8111OA+!Zjt2Vvx#y91^SC~geC<(`1aMW29AzK^(!iyU}RwF?igdYJHpsfK_4 zNWhdLC*dBovY?9$&U_G+-gPIH)k+ly~SN2+}nn)OU2B<^kEJ4!%dQHM+ zxZh^_H~Jj-{CX>EZ=^Tb4`~=-v{%w4TS*r=7j6Iw-vsXks<)(c+en`%`3_IqKeIj78CzH+(0_G(!3_16Q%oR^lKgdaV z^Rv_satoaO9AgkU2cGqOz{HTFaQFqrHnRAfmu$U7e-lauh)|KsWb9{7qadoKLr zSFOGU{_Wm?X(Ihrxb4^09`hUKp5NMXMc_aEj`6NA@Y8PwOcJ>Te(QiuQ{3$@^oJ?z z5eM&h&(@px;={BHdhsWYkT0^h8YGd$#XQNW{>4AZ44PK-*+(#G zU+5V$!;r-{^$MDC$l}*e3VQuPysN(rBR+Y6mBnTtdk&DMcs)?Q;`asxO)lw(pJMg3 z`jU9>DM6EuUcB(spx1xIN1QC)^9j}`l8*T4GlHg+@Zwcx22C9KCAeakwc*?F*~6`! zSHVx6W%c6qX9rCc;l<~Vuz88sonym@mz`^E7QZ;s<}1!V-^LZkM+Z#}>4?970c#nt z?Jf9%%Yx={^y0UG`mp%>xvUFE&Y2K2V@jzX!sNo=DWffrwO^6;FUqJ=>m!r}-V0VB zYhQ-Z&*MkdJ`FMO0kZgeFJc3GCUC~QS=VCgKLNkAPhO9jav>!ng zviP&C`%fTi{r~3IXh+uZYd?U$fr!@hCxhl1(1fh@`*(t8k+r^l>FYr=n04`5Z@&SY zhn$4lfOo&xXV=GTyl9>LLm*BVt()Hm)*@@ode8lgM`W#Kp8+ywVGn#a$VS#W^PX=| z&&XPLemST{j>0WK_gwLxerM(In?bW2cy$7QAIOGgxW&ohq?5&3Tdpu-tu^0I`r@yF z4`c&8>kqcQqVR-2+VK*BXTQT-$sDdV;eP}9v#GatX$KHP)_UZ=h zf-thyJAWIDN7kC-cY}PNjLfTVa~gOYIR~Bqnvt~@_@-{G(YO{F-UjlJo8al)Nt3)H z@KZqJT5DetbiEJ#_--fnms6yV(fFBWvws@Ba7|1}+6JAjjb6fciiS z{Do|5v(_v=JTSwYcLV(pejZFl*80X%2C@DWS!*6AgCbYj#Yc1f7;8|p?xx0h)bz=%iAO1Hm z4O#2*`kun~O2{Gj9^lOn@H;@|GOV4``Z@JmvDVW)NqF&RK9ON|Bj>_e@1}kw{`5Jt zR}?*b8<>o&HECCWk~&1z8nrvXv(m$Ff+T%gYrM4fYw#TO@HQ|8S?j;v0F#kh;Yp*Y zLu9QRD+NW!T06ECR46>0cRp<~moV@;Fbp{X-xlVZH)O4E`ZdU$ht2TApUN;%WUV`T z7gQo^Et1yztU?x#zaYaLkPNQ|nML$}c=#B;NkrCqoO4*0Qz04t38+Tanw>ru(q70~ zKQkSeVr+x&0NKb|W3v{Vf}DU~2Wsn9_{EE`4O#0^%BEzP6@<|`l>;DwthFkixt#Vw z&V|>57NrCK1sp)ux{2viX_p1$3)g_j$Xa9Zdr*L^brz$qq)w5w*5Yd*j;yr~i>6VZ zCFBdQ1;dcF4x!5o>_OK01g%Y|MixiFdSvm7K=;-bc)?Y)7kx?J=705b)Wbs3hkprj zkoA3k_DsIhL)JI^1t5Z~@A_*%333A74dMz9XJ5@Vg@?ZY@@^zNd>^kF^m35czvV(KG=n<@5qOOy~z5O{L|nNaxQ!i$mW}Mee3=+FalZM zzn^>!eFZrOz8QGWUGV!LyOcEfUi$(t0$JZ~zsvX8E2O^;dq54czV9vo4aiaWv)3~& z7Ezz@3x(7*vc8EvFG~F&>pSVWpafapPS=4rvc5h3#T@clOkKhHE;$!jdzm-sU^lY96W#;%BkLR8BSnn6GU67K9*809yV&jvs4HZBCwm##kF0NJ^&Ra& zWbsar8Dl<&=P$H#MGT(DH?8{Jp>JEiTgq5d82Auaj~rS=n}SwkodI+=ID~u;JaMs= zC&T$b@4m!~oE(GSE~CshXL@`DSz)qb+>e0d$?)w?j>A1~wrTc)>p(7X#k-td{AVX0 zgh!Rz@L~80pfvN~zk(9tj#-jnt^(4pfM0TQ68>}ra|L0>!<9}JKknow;cITC9SM_L zNqIpHaul8q639A>=v|=q17;ax3yjZ25ASwz625skbu^Clh5LMwF+!LSyd8M&so;}W z(5KPoz;`*h8vdJ;&21UxX`pvXE%4`Wx8bAkk=5KsCt$;uGt3{pX607+%CB2lJP&BB ziEndq9Bu`g6U58DL7gDS;f+Ay#ruHX6|}-ve$$4Jz=Lb7J_o)GD15Hi$x--Tpt#}} zo!kPy1-v;H?)#vPE3N`{%(vo3pfFAF>p=I%R`{%SRt}4Segjs++W%NKh~EN-6dule zhtZ$R6=3pzzi32hvkUt#N(@RL-Sba2u#bHmqA53smP? z!#IBn&ye%62mS`wjhujW?v{Sbi1m&7IL3u|FNh-lulxV32AY`bC~~~6s;;`OrY=#} zRM%X$r!HA{sIH(P)==3HZ`j!o+g7!$dRxP`rfoa7HE-Lst!3MuZOLt>F{g1vW4Li# zV{T(!W2CX5v86GwJ+#9#^DL@rtc}*@ZQ8l1Wz&I8W^?tHnk|Vf4O^PF?A+44CAp==ZHa2W*-dI_;tFEQ)KwWEH)}|4g@-{^_6>N%bD%lj z>CmQ@`aSi@`UCZ?^@r+BLsmnmA>1&oA<|IL5T$%2TUr_qG#=V+9?g2R`O!U(wmzD* zBWFj|4(v(tTm;FMs`>=+^BT;S!IZ^p&D$E?TDdiATaA71Ed;xw1iX#?-;kEU`OSSnjMK94NAL}aSWM6EK!w6Bz7iR5(g4y!{80! z4S5@)8!9(cZ)n=EYeRCwp$#K8j;o8%LI*a*H@9xis?Vt(Q6H`!S0AY_sE^i{)W_?q z>Z|K(>YM6!);Cj5)6hT*CQ3GB)y8XUY6~{j zYz)=K$-!(Myg9bHYI9=q&dn{G4{RP$pGz(=>MztVf_kf_6`Qy0+0wctYwL)uW?S6r z9qJbcwzY0Mw9WR3>c*PJL}No^6E-wAW<45vv|4$GxIaKGiO_}-lylsM0!mu4A?B5~ zW1BkJo#C0JLvIgW+Zn`^Mr)`#k% zq+WKFY>jWN+1j*q*Vg3LLt96<{3dm MD;8`(_#fi_FIU~S!vFvP literal 0 HcmV?d00001 diff --git a/packages/core/native/windows-peer-broker/.gitignore b/packages/core/native/windows-peer-broker/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/packages/core/native/windows-peer-broker/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/packages/core/native/windows-peer-broker/Cargo.lock b/packages/core/native/windows-peer-broker/Cargo.lock new file mode 100644 index 0000000..092c61a --- /dev/null +++ b/packages/core/native/windows-peer-broker/Cargo.lock @@ -0,0 +1,109 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "xc-peer-broker" +version = "0.1.0" +dependencies = [ + "sha2", + "windows-sys", +] diff --git a/packages/core/native/windows-peer-broker/Cargo.toml b/packages/core/native/windows-peer-broker/Cargo.toml new file mode 100644 index 0000000..b3d0e76 --- /dev/null +++ b/packages/core/native/windows-peer-broker/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "xc-peer-broker" +version = "0.1.0" +edition = "2024" +publish = false + +[dependencies] +sha2 = "0.10" +windows-sys = { version = "0.61", features = [ + "Win32_Foundation", + "Win32_Security", + "Win32_Security_Authorization", + "Win32_Security_Cryptography", + "Win32_Storage_FileSystem", + "Win32_System_IO", + "Win32_System_Memory", + "Win32_System_Pipes", + "Win32_System_Threading", +] } + +[profile.release] +lto = true +codegen-units = 1 +panic = "abort" +strip = true diff --git a/packages/core/native/windows-peer-broker/src/lifecycle.rs b/packages/core/native/windows-peer-broker/src/lifecycle.rs new file mode 100644 index 0000000..9939440 --- /dev/null +++ b/packages/core/native/windows-peer-broker/src/lifecycle.rs @@ -0,0 +1,723 @@ +use std::collections::{HashMap, VecDeque}; +use std::io::{self, Write}; +use std::sync::atomic::{AtomicBool, AtomicU32, AtomicUsize, Ordering}; +use std::sync::{Arc, Mutex, mpsc}; +use std::thread; +use std::time::{Duration, Instant}; + +use crate::pipe::{ + InboundHandler, OutboundPipeRequest, PipeError, PipeErrorCode, PipeServer, ServerConfig, + outbound_request, +}; +use crate::process_peer::current_process_identity; +use crate::protocol::{ + CANCEL_ACK, CANCEL_OPERATION, Frame, INBOUND_REQUEST, INBOUND_RESPONSE, INBOX_TOKEN_BYTES, + MAX_ACTIVE_OPERATIONS, OPERATION_ERROR, OUTBOUND_REQUEST, OUTBOUND_RESPONSE, SERVER_FATAL, + SERVER_READY, SHUTDOWN, SHUTDOWN_COMPLETE, START_SERVER, encode_error, encode_inbound_request, + encode_one_string, encode_peer_frame, parse_outbound_request, parse_peer_frame_payload, + parse_start_server, valid_pipe_name_shape, +}; +use crate::security::{Event, ProcessIdentity}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum RegisterError { + Duplicate, + Capacity, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum CancelDecision { + Canceled, + TooLate, + Unknown, +} + +#[derive(Debug)] +struct ActiveOperation { + cancel_acknowledged: bool, +} + +#[derive(Debug)] +pub struct OperationBook { + active: HashMap, + tombstones: VecDeque<(u32, Instant)>, + capacity: usize, + tombstone_ttl: Duration, +} + +impl OperationBook { + pub fn new(capacity: usize, tombstone_ttl: Duration) -> Self { + Self { + active: HashMap::new(), + tombstones: VecDeque::new(), + capacity, + tombstone_ttl, + } + } + + pub fn register(&mut self, operation_id: u32, now: Instant) -> Result<(), RegisterError> { + self.purge(now); + if self.active.contains_key(&operation_id) + || self + .tombstones + .iter() + .any(|(existing, _)| *existing == operation_id) + { + return Err(RegisterError::Duplicate); + } + if operation_id == 0 || self.active.len() + self.tombstones.len() >= self.capacity { + return Err(RegisterError::Capacity); + } + self.active.insert( + operation_id, + ActiveOperation { + cancel_acknowledged: false, + }, + ); + Ok(()) + } + + pub fn cancel(&mut self, operation_id: u32, now: Instant) -> CancelDecision { + self.purge(now); + if let Some(operation) = self.active.get_mut(&operation_id) { + operation.cancel_acknowledged = true; + CancelDecision::Canceled + } else if self + .tombstones + .iter() + .any(|(existing, _)| *existing == operation_id) + { + CancelDecision::TooLate + } else { + CancelDecision::Unknown + } + } + + pub fn complete(&mut self, operation_id: u32, now: Instant) -> bool { + self.purge(now); + if self.active.remove(&operation_id).is_none() { + return false; + } + self.tombstones.push_back((operation_id, now)); + true + } + + #[cfg(test)] + pub fn is_cancel_acknowledged(&self, operation_id: u32) -> bool { + self.active + .get(&operation_id) + .is_some_and(|operation| operation.cancel_acknowledged) + } + + pub fn is_tombstone(&mut self, operation_id: u32, now: Instant) -> bool { + self.purge(now); + self.tombstones + .iter() + .any(|(existing, _)| *existing == operation_id) + } + + #[cfg(test)] + pub fn active_len(&self) -> usize { + self.active.len() + } + + fn purge(&mut self, now: Instant) { + while self.tombstones.front().is_some_and(|(_, completed)| { + now.saturating_duration_since(*completed) >= self.tombstone_ttl + }) { + self.tombstones.pop_front(); + } + } +} + +pub struct ControlOutput { + writer: Mutex>, +} + +impl ControlOutput { + pub fn new(writer: W) -> Self { + Self { + writer: Mutex::new(Box::new(writer)), + } + } + + pub fn send(&self, kind: u8, operation_id: u32, payload: Vec) -> io::Result<()> { + let bytes = Frame { + kind, + operation_id, + payload, + } + .encode() + .map_err(|error| io::Error::new(io::ErrorKind::InvalidData, error))?; + let mut writer = self + .writer + .lock() + .unwrap_or_else(|poisoned| poisoned.into_inner()); + writer.write_all(&bytes)?; + writer.flush() + } +} + +struct OutboundState { + book: OperationBook, + cancel_events: HashMap, +} + +struct InboundState { + book: OperationBook, + responders: HashMap>>, +} + +struct BrokerInner { + output: Arc, + identity: ProcessIdentity, + force_shutdown: Event, + stopping: AtomicBool, + fatal: AtomicBool, + server: Mutex>, + namespace_id: Mutex>, + outbound: Mutex, + inbound: Mutex, + completion_order: Mutex<()>, + next_inbound_id: AtomicU32, + worker_count: AtomicUsize, +} + +#[derive(Clone)] +pub struct Broker { + inner: Arc, +} + +impl Broker { + pub fn new(output: Arc) -> io::Result { + let identity = current_process_identity()?; + let force_shutdown = Event::manual_reset()?; + Ok(Self { + inner: Arc::new(BrokerInner { + output, + identity, + force_shutdown, + stopping: AtomicBool::new(false), + fatal: AtomicBool::new(false), + server: Mutex::new(None), + namespace_id: Mutex::new(None), + outbound: Mutex::new(OutboundState { + book: OperationBook::new(MAX_ACTIVE_OPERATIONS, Duration::from_secs(5)), + cancel_events: HashMap::new(), + }), + inbound: Mutex::new(InboundState { + book: OperationBook::new(MAX_ACTIVE_OPERATIONS, Duration::from_secs(5)), + responders: HashMap::new(), + }), + completion_order: Mutex::new(()), + next_inbound_id: AtomicU32::new(0x8000_0000), + worker_count: AtomicUsize::new(0), + }), + }) + } + + pub fn handle_frame(&self, frame: Frame) -> Result { + if self.inner.stopping.load(Ordering::Acquire) && frame.kind != SHUTDOWN { + return Err("request received while broker is stopping"); + } + match frame.kind { + START_SERVER => { + self.start_server(frame.operation_id, &frame.payload)?; + Ok(false) + } + OUTBOUND_REQUEST => { + self.start_outbound(frame.operation_id, &frame.payload)?; + Ok(false) + } + INBOUND_RESPONSE => { + self.finish_inbound(frame.operation_id, &frame.payload)?; + Ok(false) + } + CANCEL_OPERATION => { + self.cancel_outbound(frame.operation_id)?; + Ok(false) + } + SHUTDOWN => { + self.shutdown(true); + let _ = self.inner.output.send(SHUTDOWN_COMPLETE, 0, Vec::new()); + Ok(true) + } + _ => Err("unexpected control frame kind"), + } + } + + pub fn is_fatal(&self) -> bool { + self.inner.fatal.load(Ordering::Acquire) + } + + pub fn protocol_fatal(&self, message: &'static str) { + self.inner + .report_fatal("PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH", message); + } + + pub fn force_shutdown(&self) { + self.shutdown(false); + } + + fn start_server(&self, operation_id: u32, payload: &[u8]) -> Result<(), &'static str> { + let request = parse_start_server(payload).map_err(|_| "START_SERVER payload is invalid")?; + let mut server_slot = self + .inner + .server + .lock() + .unwrap_or_else(|poisoned| poisoned.into_inner()); + if server_slot.is_some() { + return Err("server is already active"); + } + let inbox_token: [u8; INBOX_TOKEN_BYTES] = request + .inbox_token + .as_bytes() + .try_into() + .map_err(|_| "inbox token length is invalid")?; + let config = ServerConfig { + namespace_id: request.namespace_id.clone(), + inbox_token, + identity: self.inner.identity.clone(), + force_shutdown: self.inner.force_shutdown.clone(), + }; + let handler: Arc = self.inner.clone(); + match PipeServer::start(config, handler) { + Ok(server) => { + let address = server.address.clone(); + *self + .inner + .namespace_id + .lock() + .unwrap_or_else(|poisoned| poisoned.into_inner()) = Some(request.namespace_id); + *server_slot = Some(server); + let payload = + encode_one_string(&address).map_err(|_| "SERVER_READY encoding failed")?; + self.inner + .output + .send(SERVER_READY, 0, payload) + .map_err(|_| "control output failed")?; + } + Err(error) => { + self.send_operation_error( + operation_id, + "PEER_WINDOWS_PIPE_CREATE_FAILED", + &error.sanitized_message(), + )?; + } + } + Ok(()) + } + + fn start_outbound(&self, operation_id: u32, payload: &[u8]) -> Result<(), &'static str> { + let request = + parse_outbound_request(payload).map_err(|_| "OUTBOUND_REQUEST payload is invalid")?; + let namespace = self + .inner + .namespace_id + .lock() + .unwrap_or_else(|poisoned| poisoned.into_inner()) + .clone(); + let Some(namespace) = namespace else { + self.send_operation_error( + operation_id, + "PEER_WINDOWS_PIPE_CREATE_FAILED", + "peer server is not active", + )?; + return Ok(()); + }; + if !valid_pipe_name_shape(&request.address, Some(&namespace)) { + return Err("outbound pipe namespace is invalid"); + } + + let cancel = Event::manual_reset().map_err(|_| "cancel event creation failed")?; + { + let mut outbound = self + .inner + .outbound + .lock() + .unwrap_or_else(|poisoned| poisoned.into_inner()); + match outbound.book.register(operation_id, Instant::now()) { + Ok(()) => {} + Err(RegisterError::Duplicate) => return Err("duplicate active operation id"), + Err(RegisterError::Capacity) => { + drop(outbound); + self.send_operation_error( + operation_id, + "PEER_WINDOWS_OPERATION_CAPACITY", + "peer broker operation capacity is exhausted", + )?; + return Ok(()); + } + } + outbound.cancel_events.insert(operation_id, cancel.clone()); + } + + let target_token: [u8; INBOX_TOKEN_BYTES] = request + .target_token + .as_bytes() + .try_into() + .map_err(|_| "target token length is invalid")?; + let inner = self.inner.clone(); + inner.worker_count.fetch_add(1, Ordering::AcqRel); + let spawn_result = thread::Builder::new() + .name("xc-peer-outbound".to_owned()) + .spawn(move || { + let _guard = WorkerGuard(inner.clone()); + let deadline = Instant::now() + Duration::from_millis(request.timeout_ms as u64); + let result = outbound_request(OutboundPipeRequest { + address: &request.address, + target_token: &target_token, + sender_instance_id: &request.sender_instance_id, + peer_frame: &request.peer_frame, + identity: &inner.identity, + deadline, + cancel: &cancel, + force_shutdown: &inner.force_shutdown, + }); + inner.finish_outbound(operation_id, result); + }); + if spawn_result.is_err() { + self.inner.worker_count.fetch_sub(1, Ordering::AcqRel); + let mut outbound = self + .inner + .outbound + .lock() + .unwrap_or_else(|poisoned| poisoned.into_inner()); + outbound.cancel_events.remove(&operation_id); + outbound.book.complete(operation_id, Instant::now()); + drop(outbound); + self.send_operation_error( + operation_id, + "PEER_WINDOWS_OPERATION_CAPACITY", + "peer broker could not create an outbound worker", + )?; + } + Ok(()) + } + + fn cancel_outbound(&self, operation_id: u32) -> Result<(), &'static str> { + let _order = self + .inner + .completion_order + .lock() + .unwrap_or_else(|poisoned| poisoned.into_inner()); + let decision = { + let mut outbound = self + .inner + .outbound + .lock() + .unwrap_or_else(|poisoned| poisoned.into_inner()); + let decision = outbound.book.cancel(operation_id, Instant::now()); + if decision == CancelDecision::Canceled + && let Some(cancel) = outbound.cancel_events.get(&operation_id) + { + let _ = cancel.signal(); + } + decision + }; + let status = match decision { + CancelDecision::Canceled => 0, + CancelDecision::TooLate | CancelDecision::Unknown => 1, + }; + self.inner + .output + .send(CANCEL_ACK, operation_id, vec![status]) + .map_err(|_| "control output failed") + } + + fn finish_inbound(&self, operation_id: u32, payload: &[u8]) -> Result<(), &'static str> { + let peer_frame = + parse_peer_frame_payload(payload).map_err(|_| "INBOUND_RESPONSE payload is invalid")?; + let responder = { + let mut inbound = self + .inner + .inbound + .lock() + .unwrap_or_else(|poisoned| poisoned.into_inner()); + if let Some(responder) = inbound.responders.remove(&operation_id) { + if !inbound.book.complete(operation_id, Instant::now()) { + return Err("inbound operation ownership is invalid"); + } + Some(responder) + } else if inbound.book.is_tombstone(operation_id, Instant::now()) { + None + } else { + return Err("response references an unknown operation id"); + } + }; + if let Some(responder) = responder { + let _ = responder.send(peer_frame); + } + Ok(()) + } + + fn send_operation_error( + &self, + operation_id: u32, + code: &str, + message: &str, + ) -> Result<(), &'static str> { + let payload = encode_error(code, &sanitize_message(message)) + .map_err(|_| "operation error encoding failed")?; + self.inner + .output + .send(OPERATION_ERROR, operation_id, payload) + .map_err(|_| "control output failed") + } + + fn shutdown(&self, graceful: bool) { + if self.inner.stopping.swap(true, Ordering::AcqRel) && graceful { + return; + } + let mut server = self + .inner + .server + .lock() + .unwrap_or_else(|poisoned| poisoned.into_inner()); + if let Some(server) = server.as_mut() { + server.stop_accepting(); + server.release_listener(); + } + if graceful { + let deadline = Instant::now() + Duration::from_millis(500); + while Instant::now() < deadline + && (self.inner.worker_count.load(Ordering::Acquire) != 0 + || server + .as_ref() + .is_some_and(|server| server.active_connections() != 0)) + { + thread::sleep(Duration::from_millis(10)); + } + } + let _ = self.inner.force_shutdown.signal(); + drop(server); + let deadline = Instant::now() + Duration::from_secs(2); + while graceful + && Instant::now() < deadline + && self.inner.worker_count.load(Ordering::Acquire) != 0 + { + thread::sleep(Duration::from_millis(10)); + } + } +} + +impl BrokerInner { + fn finish_outbound(&self, operation_id: u32, result: Result, PipeError>) { + let _order = self + .completion_order + .lock() + .unwrap_or_else(|poisoned| poisoned.into_inner()); + let send_result = match result { + Ok(peer_frame) => encode_peer_frame(&peer_frame) + .map_err(|_| io::Error::other("response encoding failed")) + .and_then(|payload| self.output.send(OUTBOUND_RESPONSE, operation_id, payload)), + Err(error) => { + let (code, message) = pipe_operation_error(&error); + encode_error(code, &sanitize_message(&message)) + .map_err(|_| io::Error::other("error encoding failed")) + .and_then(|payload| self.output.send(OPERATION_ERROR, operation_id, payload)) + } + }; + let mut outbound = self + .outbound + .lock() + .unwrap_or_else(|poisoned| poisoned.into_inner()); + outbound.cancel_events.remove(&operation_id); + if !outbound.book.complete(operation_id, Instant::now()) { + drop(outbound); + self.report_fatal( + "PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH", + "outbound operation ownership was lost", + ); + return; + } + drop(outbound); + if send_result.is_err() { + self.fatal.store(true, Ordering::Release); + let _ = self.force_shutdown.signal(); + } + } + + fn report_fatal(&self, code: &str, message: &str) { + if self.fatal.swap(true, Ordering::AcqRel) { + return; + } + self.stopping.store(true, Ordering::Release); + let payload = encode_error(code, &sanitize_message(message)).unwrap_or_default(); + let _ = self.output.send(SERVER_FATAL, 0, payload); + let _ = self.force_shutdown.signal(); + } + + fn allocate_inbound(&self, responder: mpsc::SyncSender>) -> Result { + for _ in 0..MAX_ACTIVE_OPERATIONS * 2 { + let operation_id = self.next_inbound_id.fetch_add(1, Ordering::Relaxed); + if operation_id == 0 { + continue; + } + let mut inbound = self + .inbound + .lock() + .unwrap_or_else(|poisoned| poisoned.into_inner()); + match inbound.book.register(operation_id, Instant::now()) { + Ok(()) => { + inbound.responders.insert(operation_id, responder); + return Ok(operation_id); + } + Err(RegisterError::Duplicate) => continue, + Err(RegisterError::Capacity) => { + return Err(PipeError::new( + PipeErrorCode::Capacity, + "inbound operation capacity is exhausted", + )); + } + } + } + Err(PipeError::new( + PipeErrorCode::Capacity, + "inbound operation id allocation failed", + )) + } + + fn expire_inbound(&self, operation_id: u32) { + let mut inbound = self + .inbound + .lock() + .unwrap_or_else(|poisoned| poisoned.into_inner()); + inbound.responders.remove(&operation_id); + inbound.book.complete(operation_id, Instant::now()); + } +} + +impl InboundHandler for BrokerInner { + fn handle_inbound( + &self, + sender_instance_id: String, + peer_frame: Vec, + deadline: Instant, + ) -> Result, PipeError> { + if self.stopping.load(Ordering::Acquire) { + return Err(PipeError::new( + PipeErrorCode::ShuttingDown, + "peer broker is shutting down", + )); + } + let (response_sender, response_receiver) = mpsc::sync_channel(1); + let operation_id = self.allocate_inbound(response_sender)?; + let payload = encode_inbound_request(&sender_instance_id, &peer_frame).map_err(|_| { + PipeError::new( + PipeErrorCode::ProtocolMismatch, + "inbound request encoding failed", + ) + })?; + if self + .output + .send(INBOUND_REQUEST, operation_id, payload) + .is_err() + { + self.expire_inbound(operation_id); + return Err(PipeError::new(PipeErrorCode::Io, "control output failed")); + } + + loop { + if self.force_shutdown.is_signaled() { + self.expire_inbound(operation_id); + return Err(PipeError::new( + PipeErrorCode::ShuttingDown, + "peer broker is shutting down", + )); + } + let remaining = deadline.saturating_duration_since(Instant::now()); + if remaining.is_zero() { + self.expire_inbound(operation_id); + return Err(PipeError::new( + PipeErrorCode::Timeout, + "inbound peer request timed out", + )); + } + match response_receiver.recv_timeout(remaining.min(Duration::from_millis(50))) { + Ok(response) => return Ok(response), + Err(mpsc::RecvTimeoutError::Timeout) => {} + Err(mpsc::RecvTimeoutError::Disconnected) => { + self.expire_inbound(operation_id); + return Err(PipeError::new( + PipeErrorCode::Io, + "inbound response channel closed", + )); + } + } + } + } + + fn server_fatal(&self, error: PipeError) { + self.report_fatal( + "PEER_WINDOWS_PIPE_CREATE_FAILED", + &error.sanitized_message(), + ); + } +} + +struct WorkerGuard(Arc); + +impl Drop for WorkerGuard { + fn drop(&mut self) { + self.0.worker_count.fetch_sub(1, Ordering::AcqRel); + } +} + +fn pipe_operation_error(error: &PipeError) -> (&'static str, String) { + let code = match error.code { + PipeErrorCode::Timeout => "PEER_WINDOWS_REQUEST_TIMEOUT", + PipeErrorCode::Canceled => "PEER_WINDOWS_OPERATION_CANCELED", + PipeErrorCode::TargetUnavailable => "PEER_WINDOWS_TARGET_UNAVAILABLE", + PipeErrorCode::IdentityUnverified => "PEER_WINDOWS_PEER_IDENTITY_UNVERIFIED", + PipeErrorCode::AuthenticationFailed => "PEER_WINDOWS_AUTHENTICATION_FAILED", + PipeErrorCode::ProtocolMismatch => "PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH", + PipeErrorCode::Capacity => "PEER_WINDOWS_OPERATION_CAPACITY", + PipeErrorCode::ShuttingDown => "PEER_WINDOWS_BROKER_EXITED", + PipeErrorCode::Io => "PEER_WINDOWS_PIPE_IO_FAILED", + }; + (code, error.sanitized_message()) +} + +pub fn sanitize_message(message: &str) -> String { + message + .chars() + .filter(|character| !character.is_control()) + .take(512) + .collect() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn cancel_ack_precedes_terminal_ownership_release() { + let now = Instant::now(); + let mut book = OperationBook::new(4, Duration::from_secs(30)); + book.register(7, now).unwrap(); + assert_eq!(book.cancel(7, now), CancelDecision::Canceled); + assert!(book.is_cancel_acknowledged(7)); + assert_eq!(book.active_len(), 1); + assert!(book.complete(7, now)); + assert_eq!(book.active_len(), 0); + assert_eq!(book.cancel(7, now), CancelDecision::TooLate); + } + + #[test] + fn duplicate_capacity_unknown_and_ttl_are_bounded() { + let now = Instant::now(); + let mut book = OperationBook::new(2, Duration::from_secs(1)); + book.register(1, now).unwrap(); + assert_eq!(book.register(1, now), Err(RegisterError::Duplicate)); + book.register(2, now).unwrap(); + assert_eq!(book.register(3, now), Err(RegisterError::Capacity)); + assert!(book.complete(1, now)); + assert_eq!(book.register(3, now), Err(RegisterError::Capacity)); + assert_eq!(book.cancel(99, now), CancelDecision::Unknown); + + let later = now + Duration::from_secs(2); + book.register(3, later).unwrap(); + assert_eq!(book.cancel(1, later), CancelDecision::Unknown); + } +} diff --git a/packages/core/native/windows-peer-broker/src/main.rs b/packages/core/native/windows-peer-broker/src/main.rs new file mode 100644 index 0000000..bd5d341 --- /dev/null +++ b/packages/core/native/windows-peer-broker/src/main.rs @@ -0,0 +1,235 @@ +#![cfg_attr(not(windows), allow(dead_code, unused_imports))] + +#[cfg(windows)] +mod lifecycle; +#[cfg(windows)] +mod pipe; +#[cfg(windows)] +mod process_peer; +#[cfg(windows)] +mod protocol; +#[cfg(windows)] +mod runtime_acl; +#[cfg(windows)] +mod security; + +#[cfg(not(windows))] +fn main() { + eprintln!("xc-peer-broker is only supported on Windows"); + std::process::exit(1); +} + +#[cfg(windows)] +mod windows_broker { + use std::io::{self, Read}; + use std::sync::{Arc, mpsc}; + use std::thread; + use std::time::Duration; + + use crate::lifecycle::{Broker, ControlOutput, sanitize_message}; + use crate::process_peer::current_process_identity; + use crate::protocol::{ + Frame, FrameDecoder, OPERATION_ERROR, SECURE_RUNTIME_RESULT, encode_error, + encode_one_string, parse_secure_runtime, validate_node_frame, + }; + use crate::runtime_acl::secure_runtime; + + pub fn run() -> io::Result<()> { + let mut arguments = std::env::args().skip(1); + let mode = arguments.next().ok_or_else(|| { + io::Error::new(io::ErrorKind::InvalidInput, "broker mode is required") + })?; + if arguments.next().as_deref() != Some("--protocol") + || arguments.next().as_deref() != Some("1") + || arguments.next().is_some() + { + return Err(io::Error::new( + io::ErrorKind::InvalidInput, + "expected --protocol 1", + )); + } + match mode.as_str() { + "secure-runtime" => run_secure_runtime(), + "broker" => run_broker(), + "self-test" => run_self_test(), + _ => Err(io::Error::new( + io::ErrorKind::InvalidInput, + "unknown broker mode", + )), + } + } + + fn run_secure_runtime() -> io::Result<()> { + let frame = read_one_frame()?; + validate_node_frame(&frame, true) + .map_err(|error| io::Error::new(io::ErrorKind::InvalidData, error))?; + let output = ControlOutput::new(io::stdout()); + let result = parse_secure_runtime(&frame.payload) + .map_err(|_| { + io::Error::new( + io::ErrorKind::InvalidData, + "secure-runtime payload is invalid", + ) + }) + .and_then(|request| { + let identity = current_process_identity()?; + secure_runtime(&request.root, &identity) + }); + match result { + Ok(namespace_id) => { + let payload = encode_one_string(&namespace_id) + .map_err(|error| io::Error::new(io::ErrorKind::InvalidData, error))?; + output.send(SECURE_RUNTIME_RESULT, frame.operation_id, payload) + } + Err(error) => { + let message = sanitize_message(&format!( + "Windows peer runtime security check failed: {error}{}", + error + .raw_os_error() + .map(|code| format!(" (Windows error {code})")) + .unwrap_or_default() + )); + let payload = encode_error("PEER_WINDOWS_RUNTIME_UNSAFE", &message) + .map_err(|codec| io::Error::new(io::ErrorKind::InvalidData, codec))?; + output.send(OPERATION_ERROR, frame.operation_id, payload)?; + Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "Windows peer runtime is unsafe", + )) + } + } + } + + fn read_one_frame() -> io::Result { + let mut decoder = FrameDecoder::new(); + let mut input = io::stdin().lock(); + let mut buffer = [0u8; 8192]; + loop { + let read = input.read(&mut buffer)?; + if read == 0 { + decoder + .finish() + .map_err(|error| io::Error::new(io::ErrorKind::UnexpectedEof, error))?; + return Err(io::Error::new( + io::ErrorKind::UnexpectedEof, + "stdin closed before a request frame", + )); + } + let frames = decoder + .push(&buffer[..read]) + .map_err(|error| io::Error::new(io::ErrorKind::InvalidData, error))?; + if frames.len() > 1 { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "secure-runtime accepts exactly one frame", + )); + } + if let Some(frame) = frames.into_iter().next() { + decoder + .finish() + .map_err(|error| io::Error::new(io::ErrorKind::InvalidData, error))?; + return Ok(frame); + } + } + } + + enum InputEvent { + Frame(Frame), + Eof, + ProtocolError, + } + + fn spawn_control_reader() -> io::Result> { + let (sender, receiver) = mpsc::sync_channel(32); + thread::Builder::new() + .name("xc-peer-control-reader".to_owned()) + .spawn(move || { + let mut decoder = FrameDecoder::new(); + let mut input = io::stdin().lock(); + let mut buffer = [0u8; 8192]; + loop { + match input.read(&mut buffer) { + Ok(0) => { + let event = if decoder.finish().is_ok() { + InputEvent::Eof + } else { + InputEvent::ProtocolError + }; + let _ = sender.send(event); + return; + } + Ok(read) => match decoder.push(&buffer[..read]) { + Ok(frames) => { + for frame in frames { + if sender.send(InputEvent::Frame(frame)).is_err() { + return; + } + } + } + Err(_) => { + let _ = sender.send(InputEvent::ProtocolError); + return; + } + }, + Err(_) => { + let _ = sender.send(InputEvent::Eof); + return; + } + } + } + }) + .map(|_| receiver) + } + + fn run_self_test() -> io::Result<()> { + let identity = current_process_identity()?; + crate::pipe::self_test(&identity).map_err(io::Error::other) + } + + fn run_broker() -> io::Result<()> { + let output = Arc::new(ControlOutput::new(io::stdout())); + let broker = Broker::new(output)?; + let input = spawn_control_reader()?; + loop { + if broker.is_fatal() { + broker.force_shutdown(); + return Err(io::Error::other("peer broker entered a fatal state")); + } + match input.recv_timeout(Duration::from_millis(50)) { + Ok(InputEvent::Frame(frame)) => { + if validate_node_frame(&frame, false).is_err() { + broker.protocol_fatal("invalid Node control frame"); + continue; + } + match broker.handle_frame(frame) { + Ok(true) => return Ok(()), + Ok(false) => {} + Err(message) => broker.protocol_fatal(message), + } + } + Ok(InputEvent::Eof) | Err(mpsc::RecvTimeoutError::Disconnected) => { + broker.force_shutdown(); + return Ok(()); + } + Ok(InputEvent::ProtocolError) => { + broker.protocol_fatal("malformed or truncated Node control frame"); + } + Err(mpsc::RecvTimeoutError::Timeout) => {} + } + } + } +} + +#[cfg(windows)] +fn main() { + if let Err(error) = windows_broker::run() { + let message: String = error + .to_string() + .chars() + .filter(|character| !character.is_control()) + .take(512) + .collect(); + eprintln!("xc-peer-broker: {message}"); + std::process::exit(1); + } +} diff --git a/packages/core/native/windows-peer-broker/src/pipe.rs b/packages/core/native/windows-peer-broker/src/pipe.rs new file mode 100644 index 0000000..ef2a52f --- /dev/null +++ b/packages/core/native/windows-peer-broker/src/pipe.rs @@ -0,0 +1,1207 @@ +use std::fmt; +use std::io; +use std::mem::zeroed; +use std::ptr::{null, null_mut}; +use std::sync::Arc; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::thread; +use std::time::{Duration, Instant}; + +use windows_sys::Win32::Foundation::{ + ERROR_BROKEN_PIPE, ERROR_FILE_NOT_FOUND, ERROR_IO_PENDING, ERROR_NOT_FOUND, + ERROR_OPERATION_ABORTED, ERROR_PIPE_BUSY, ERROR_PIPE_CONNECTED, GENERIC_READ, GENERIC_WRITE, + GetLastError, HANDLE, INVALID_HANDLE_VALUE, WAIT_FAILED, WAIT_OBJECT_0, WAIT_TIMEOUT, +}; +use windows_sys::Win32::Storage::FileSystem::{ + CreateFileW, FILE_FLAG_FIRST_PIPE_INSTANCE, FILE_FLAG_OVERLAPPED, OPEN_EXISTING, + PIPE_ACCESS_DUPLEX, ReadFile, SECURITY_IDENTIFICATION, SECURITY_SQOS_PRESENT, WriteFile, +}; +use windows_sys::Win32::System::IO::{CancelIoEx, GetOverlappedResult, OVERLAPPED}; +use windows_sys::Win32::System::Pipes::{ + ConnectNamedPipe, CreateNamedPipeW, DisconnectNamedPipe, PIPE_READMODE_BYTE, + PIPE_REJECT_REMOTE_CLIENTS, PIPE_TYPE_BYTE, PIPE_UNLIMITED_INSTANCES, PIPE_WAIT, +}; +use windows_sys::Win32::System::Threading::WaitForMultipleObjects; + +use crate::process_peer::{verify_named_pipe_client, verify_named_pipe_server}; +use crate::protocol::{ + INBOX_TOKEN_BYTES, MAX_PEER_FRAME_BYTES, PROTOCOL_VERSION, valid_inbox_token, + valid_instance_id, valid_namespace_id, valid_pipe_name_shape, +}; +use crate::security::{ + Event, OwnedHandle, PrivateSecurityDescriptor, ProcessIdentity, constant_time_eq_43, + random_bytes, wide, +}; + +const PIPE_MAGIC: &[u8; 4] = b"XCPP"; +const PIPE_HEADER_BYTES: usize = 12; +const AUTH: u8 = 0x01; +const AUTH_OK: u8 = 0x02; +const BUSINESS_REQUEST: u8 = 0x03; +const BUSINESS_RESPONSE: u8 = 0x04; +const BUSINESS_ACK: u8 = 0x05; +const AUTH_PAYLOAD_BYTES: usize = 1 + 2 + 36 + INBOX_TOKEN_BYTES + 32; +const AUTH_OK_PAYLOAD_BYTES: usize = 64; +const MAX_PIPE_PAYLOAD: usize = MAX_PEER_FRAME_BYTES + 36; +const AUTH_DEADLINE: Duration = Duration::from_secs(5); +const INBOUND_REQUEST_DEADLINE: Duration = Duration::from_secs(30); +const MAX_CONNECTIONS: usize = 64; +const PIPE_BUFFER_BYTES: u32 = 16 * 1024; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum PipeErrorCode { + Timeout, + Canceled, + TargetUnavailable, + IdentityUnverified, + AuthenticationFailed, + ProtocolMismatch, + Capacity, + ShuttingDown, + Io, +} + +#[derive(Debug, Clone)] +pub struct PipeError { + pub code: PipeErrorCode, + message: &'static str, + os_code: Option, +} + +impl PipeError { + pub(crate) fn new(code: PipeErrorCode, message: &'static str) -> Self { + Self { + code, + message, + os_code: None, + } + } + + fn os(code: PipeErrorCode, message: &'static str, error: io::Error) -> Self { + Self { + code, + message, + os_code: error.raw_os_error(), + } + } + + pub fn sanitized_message(&self) -> String { + match self.os_code { + Some(code) => format!("{} (Windows error {code})", self.message), + None => self.message.to_owned(), + } + } +} + +impl fmt::Display for PipeError { + fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { + formatter.write_str(&self.sanitized_message()) + } +} + +impl std::error::Error for PipeError {} + +pub trait InboundHandler: Send + Sync + 'static { + fn handle_inbound( + &self, + sender_instance_id: String, + peer_frame: Vec, + deadline: Instant, + ) -> Result, PipeError>; + + fn server_fatal(&self, error: PipeError); +} + +#[derive(Clone)] +pub struct ServerConfig { + pub namespace_id: String, + pub inbox_token: [u8; INBOX_TOKEN_BYTES], + pub identity: ProcessIdentity, + pub force_shutdown: Event, +} + +pub struct PipeServer { + pub address: String, + stop_accepting: Event, + active_connections: Arc, + listener: Option>, +} + +impl PipeServer { + pub fn start( + config: ServerConfig, + handler: Arc, + ) -> Result { + let address = generate_pipe_name(&config.namespace_id)?; + let descriptor = Arc::new( + PrivateSecurityDescriptor::new(&config.identity.account_sid, false).map_err( + |error| { + PipeError::os( + PipeErrorCode::Io, + "pipe security descriptor creation failed", + error, + ) + }, + )?, + ); + let first = create_server_instance(&address, true, &descriptor)?; + let stop_accepting = Event::manual_reset().map_err(|error| { + PipeError::os( + PipeErrorCode::Io, + "listener stop event creation failed", + error, + ) + })?; + let active_connections = Arc::new(AtomicUsize::new(0)); + let listener_stop = stop_accepting.clone(); + let listener_active = active_connections.clone(); + let listener_address = address.clone(); + let listener_config = config.clone(); + let listener = thread::Builder::new() + .name("xc-peer-pipe-listener".to_owned()) + .spawn(move || { + run_listener( + first, + &listener_address, + descriptor, + listener_config, + listener_stop, + listener_active, + handler, + ); + }) + .map_err(|error| { + PipeError::os(PipeErrorCode::Io, "listener thread creation failed", error) + })?; + Ok(Self { + address, + stop_accepting, + active_connections, + listener: Some(listener), + }) + } + + pub fn stop_accepting(&self) { + let _ = self.stop_accepting.signal(); + } + + pub fn active_connections(&self) -> usize { + self.active_connections.load(Ordering::Acquire) + } + + pub fn release_listener(&mut self) { + self.listener.take(); + } +} + +impl Drop for PipeServer { + fn drop(&mut self) { + self.stop_accepting(); + self.release_listener(); + } +} + +fn run_listener( + first: OwnedHandle, + address: &str, + descriptor: Arc, + config: ServerConfig, + stop_accepting: Event, + active_connections: Arc, + handler: Arc, +) { + let mut pending = Some(first); + loop { + if stop_accepting.is_signaled() || config.force_shutdown.is_signaled() { + return; + } + let instance = match pending.take() { + Some(instance) => instance, + None => match create_server_instance(address, false, &descriptor) { + Ok(instance) => instance, + Err(error) => { + handler.server_fatal(error); + return; + } + }, + }; + match connect_server_instance(&instance, &stop_accepting, &config.force_shutdown) { + Ok(()) => {} + Err(error) + if matches!( + error.code, + PipeErrorCode::Canceled | PipeErrorCode::ShuttingDown + ) => + { + return; + } + Err(error) => { + handler.server_fatal(error); + return; + } + } + + if active_connections + .fetch_update(Ordering::AcqRel, Ordering::Acquire, |active| { + (active < MAX_CONNECTIONS).then_some(active + 1) + }) + .is_err() + { + unsafe { + DisconnectNamedPipe(instance.raw()); + } + continue; + } + let connection_config = config.clone(); + let connection_active = active_connections.clone(); + let connection_handler = handler.clone(); + if thread::Builder::new() + .name("xc-peer-pipe-connection".to_owned()) + .spawn(move || { + let _guard = ActiveConnectionGuard(connection_active); + if let Err(error) = handle_server_connection( + instance, + &connection_config, + connection_handler.as_ref(), + ) { + eprintln!("xc-peer-broker: inbound {:?}: {error}", error.code); + } + }) + .is_err() + { + active_connections.fetch_sub(1, Ordering::AcqRel); + handler.server_fatal(PipeError::new( + PipeErrorCode::Capacity, + "connection worker creation failed", + )); + return; + } + } +} + +struct ActiveConnectionGuard(Arc); + +impl Drop for ActiveConnectionGuard { + fn drop(&mut self) { + self.0.fetch_sub(1, Ordering::AcqRel); + } +} + +fn create_server_instance( + address: &str, + first_instance: bool, + descriptor: &PrivateSecurityDescriptor, +) -> Result { + let address_wide = wide(address).map_err(|error| { + PipeError::os( + PipeErrorCode::ProtocolMismatch, + "pipe name is invalid", + error, + ) + })?; + let attributes = descriptor.attributes(); + let handle = unsafe { + CreateNamedPipeW( + address_wide.as_ptr(), + server_open_mode(first_instance), + server_pipe_mode(), + PIPE_UNLIMITED_INSTANCES, + PIPE_BUFFER_BYTES, + PIPE_BUFFER_BYTES, + 0, + &attributes, + ) + }; + OwnedHandle::new(handle).map_err(|error| { + PipeError::os( + PipeErrorCode::Io, + "secure named pipe creation failed", + error, + ) + }) +} + +fn server_open_mode(first_instance: bool) -> u32 { + PIPE_ACCESS_DUPLEX + | FILE_FLAG_OVERLAPPED + | if first_instance { + FILE_FLAG_FIRST_PIPE_INSTANCE + } else { + 0 + } +} + +fn server_pipe_mode() -> u32 { + PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT | PIPE_REJECT_REMOTE_CLIENTS +} + +fn connect_server_instance( + pipe: &OwnedHandle, + stop_accepting: &Event, + force_shutdown: &Event, +) -> Result<(), PipeError> { + let event = Event::manual_reset().map_err(|error| { + PipeError::os(PipeErrorCode::Io, "connect event creation failed", error) + })?; + let mut overlapped: OVERLAPPED = unsafe { zeroed() }; + overlapped.hEvent = event.raw(); + let connected = unsafe { ConnectNamedPipe(pipe.raw(), &mut overlapped) }; + if connected != 0 { + return Ok(()); + } + let error = unsafe { GetLastError() }; + if error == ERROR_PIPE_CONNECTED { + return Ok(()); + } + if error != ERROR_IO_PENDING { + return Err(PipeError::os( + PipeErrorCode::Io, + "named pipe accept failed", + io::Error::from_raw_os_error(error as i32), + )); + } + wait_overlapped( + pipe.raw(), + &mut overlapped, + event.raw(), + &[stop_accepting.raw(), force_shutdown.raw()], + None, + ) + .map(|_| ()) +} + +fn handle_server_connection( + pipe: OwnedHandle, + config: &ServerConfig, + handler: &dyn InboundHandler, +) -> Result<(), PipeError> { + let auth_deadline = Instant::now() + AUTH_DEADLINE; + let auth_frame = read_pipe_frame( + pipe.raw(), + AUTH_PAYLOAD_BYTES, + auth_deadline, + &[], + &config.force_shutdown, + )?; + if auth_frame.kind != AUTH { + return Err(PipeError::new( + PipeErrorCode::AuthenticationFailed, + "peer authentication failed", + )); + } + let auth = parse_auth_payload(&auth_frame.payload).map_err(|_| { + PipeError::new( + PipeErrorCode::AuthenticationFailed, + "peer authentication failed", + ) + })?; + + verify_named_pipe_client(pipe.raw(), &config.identity).map_err(|_| { + PipeError::new( + PipeErrorCode::IdentityUnverified, + "peer client identity could not be verified", + ) + })?; + if !constant_time_eq_43(&config.inbox_token, &auth.inbox_token) { + return Err(PipeError::new( + PipeErrorCode::AuthenticationFailed, + "peer authentication failed", + )); + } + + let mut server_nonce = [0u8; 32]; + random_bytes(&mut server_nonce) + .map_err(|error| PipeError::os(PipeErrorCode::Io, "nonce generation failed", error))?; + let mut auth_ok = Vec::with_capacity(AUTH_OK_PAYLOAD_BYTES); + auth_ok.extend_from_slice(&auth.client_nonce); + auth_ok.extend_from_slice(&server_nonce); + write_pipe_frame( + pipe.raw(), + AUTH_OK, + &auth_ok, + auth_deadline, + &[], + &config.force_shutdown, + )?; + + let request_deadline = Instant::now() + INBOUND_REQUEST_DEADLINE; + let request = read_pipe_frame( + pipe.raw(), + MAX_PIPE_PAYLOAD, + request_deadline, + &[], + &config.force_shutdown, + )?; + if request.kind != BUSINESS_REQUEST { + return Err(PipeError::new( + PipeErrorCode::ProtocolMismatch, + "peer business phase is invalid", + )); + } + let peer_frame = parse_business_request_payload(&request.payload, &server_nonce)?; + let response = handler.handle_inbound(auth.sender_instance_id, peer_frame, request_deadline)?; + let response_payload = encode_business_payload(&response)?; + write_pipe_frame( + pipe.raw(), + BUSINESS_RESPONSE, + &response_payload, + request_deadline, + &[], + &config.force_shutdown, + )?; + let acknowledgement = + read_pipe_frame(pipe.raw(), 0, request_deadline, &[], &config.force_shutdown)?; + if acknowledgement.kind != BUSINESS_ACK || !acknowledgement.payload.is_empty() { + return Err(PipeError::new( + PipeErrorCode::ProtocolMismatch, + "peer response acknowledgement is invalid", + )); + } + unsafe { + DisconnectNamedPipe(pipe.raw()); + } + Ok(()) +} + +pub struct OutboundPipeRequest<'a> { + pub address: &'a str, + pub target_token: &'a [u8; INBOX_TOKEN_BYTES], + pub sender_instance_id: &'a str, + pub peer_frame: &'a [u8], + pub identity: &'a ProcessIdentity, + pub deadline: Instant, + pub cancel: &'a Event, + pub force_shutdown: &'a Event, +} + +pub fn self_test(identity: &ProcessIdentity) -> Result<(), PipeError> { + let descriptor = + PrivateSecurityDescriptor::new(&identity.account_sid, false).map_err(|error| { + PipeError::os( + PipeErrorCode::Io, + "pipe security descriptor self-test failed", + error, + ) + })?; + let address = generate_pipe_name("012345abcdef")?; + let first = create_server_instance(&address, true, &descriptor)?; + let second = create_server_instance(&address, false, &descriptor)?; + crate::security::verify_private_handle(first.raw(), &identity.account_sid) + .and_then(|()| crate::security::verify_private_handle(second.raw(), &identity.account_sid)) + .map_err(|error| PipeError::os(PipeErrorCode::Io, "pipe DACL self-test failed", error)) +} + +pub fn outbound_request(request: OutboundPipeRequest<'_>) -> Result, PipeError> { + let OutboundPipeRequest { + address, + target_token, + sender_instance_id, + peer_frame, + identity, + deadline, + cancel, + force_shutdown, + } = request; + if !valid_pipe_name_shape(address, None) + || !valid_instance_id(sender_instance_id) + || peer_frame.is_empty() + || peer_frame.len() > MAX_PEER_FRAME_BYTES + { + return Err(PipeError::new( + PipeErrorCode::ProtocolMismatch, + "outbound request is invalid", + )); + } + let pipe = connect_client(address, deadline, cancel, force_shutdown)?; + verify_named_pipe_server(pipe.raw(), identity).map_err(|_| { + PipeError::new( + PipeErrorCode::IdentityUnverified, + "peer server identity could not be verified", + ) + })?; + + let mut client_nonce = [0u8; 32]; + random_bytes(&mut client_nonce) + .map_err(|error| PipeError::os(PipeErrorCode::Io, "nonce generation failed", error))?; + let auth_payload = encode_auth_payload(sender_instance_id, target_token, &client_nonce)?; + let auth_deadline = deadline.min(Instant::now() + AUTH_DEADLINE); + write_pipe_frame( + pipe.raw(), + AUTH, + &auth_payload, + auth_deadline, + &[cancel.raw()], + force_shutdown, + )?; + let auth_ok = read_pipe_frame( + pipe.raw(), + AUTH_OK_PAYLOAD_BYTES, + auth_deadline, + &[cancel.raw()], + force_shutdown, + )?; + if auth_ok.kind != AUTH_OK || auth_ok.payload.len() != AUTH_OK_PAYLOAD_BYTES { + return Err(PipeError::new( + PipeErrorCode::AuthenticationFailed, + "peer authentication failed", + )); + } + if !constant_time_equal(&auth_ok.payload[..32], &client_nonce) { + return Err(PipeError::new( + PipeErrorCode::AuthenticationFailed, + "peer authentication failed", + )); + } + + let server_nonce: [u8; 32] = auth_ok.payload[32..] + .try_into() + .expect("fixed server nonce"); + let request_payload = encode_business_request_payload(&server_nonce, peer_frame)?; + write_pipe_frame( + pipe.raw(), + BUSINESS_REQUEST, + &request_payload, + deadline, + &[cancel.raw()], + force_shutdown, + )?; + let response = read_pipe_frame( + pipe.raw(), + MAX_PIPE_PAYLOAD, + deadline, + &[cancel.raw()], + force_shutdown, + )?; + if response.kind != BUSINESS_RESPONSE { + return Err(PipeError::new( + PipeErrorCode::ProtocolMismatch, + "peer response phase is invalid", + )); + } + write_pipe_frame( + pipe.raw(), + BUSINESS_ACK, + &[], + deadline, + &[cancel.raw()], + force_shutdown, + )?; + parse_business_payload(&response.payload) +} + +fn connect_client( + address: &str, + deadline: Instant, + cancel: &Event, + force_shutdown: &Event, +) -> Result { + let address_wide = wide(address).map_err(|error| { + PipeError::os( + PipeErrorCode::ProtocolMismatch, + "pipe name is invalid", + error, + ) + })?; + loop { + check_deadline_and_cancel(deadline, &[cancel.raw()], force_shutdown)?; + let handle = unsafe { + CreateFileW( + address_wide.as_ptr(), + GENERIC_READ | GENERIC_WRITE, + 0, + null(), + OPEN_EXISTING, + FILE_FLAG_OVERLAPPED | SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION, + null_mut(), + ) + }; + if handle != INVALID_HANDLE_VALUE { + return OwnedHandle::new(handle).map_err(|error| { + PipeError::os( + PipeErrorCode::TargetUnavailable, + "peer pipe connection failed", + error, + ) + }); + } + let error = unsafe { GetLastError() }; + if !matches!(error, ERROR_PIPE_BUSY | ERROR_FILE_NOT_FOUND) { + return Err(PipeError::os( + PipeErrorCode::TargetUnavailable, + "peer pipe connection failed", + io::Error::from_raw_os_error(error as i32), + )); + } + wait_cancelable_delay(Duration::from_millis(20), deadline, cancel, force_shutdown)?; + } +} + +fn wait_cancelable_delay( + delay: Duration, + deadline: Instant, + cancel: &Event, + force_shutdown: &Event, +) -> Result<(), PipeError> { + let remaining = deadline.saturating_duration_since(Instant::now()); + if remaining.is_zero() { + return Err(PipeError::new( + PipeErrorCode::Timeout, + "peer request timed out", + )); + } + let timeout = duration_millis(delay.min(remaining)); + let handles = [cancel.raw(), force_shutdown.raw()]; + match unsafe { WaitForMultipleObjects(handles.len() as u32, handles.as_ptr(), 0, timeout) } { + WAIT_OBJECT_0 => Err(PipeError::new( + PipeErrorCode::Canceled, + "peer request was canceled", + )), + value if value == WAIT_OBJECT_0 + 1 => Err(PipeError::new( + PipeErrorCode::ShuttingDown, + "peer broker is shutting down", + )), + WAIT_TIMEOUT => Ok(()), + _ => Err(PipeError::os( + PipeErrorCode::Io, + "peer wait failed", + io::Error::last_os_error(), + )), + } +} + +#[derive(Debug, PartialEq, Eq)] +struct PipeFrame { + kind: u8, + payload: Vec, +} + +fn encode_pipe_frame(kind: u8, payload: &[u8]) -> Result, PipeError> { + if !matches!( + kind, + AUTH | AUTH_OK | BUSINESS_REQUEST | BUSINESS_RESPONSE | BUSINESS_ACK + ) || payload.len() > MAX_PIPE_PAYLOAD + { + return Err(PipeError::new( + PipeErrorCode::ProtocolMismatch, + "peer pipe frame is invalid", + )); + } + let mut bytes = Vec::with_capacity(PIPE_HEADER_BYTES + payload.len()); + bytes.extend_from_slice(PIPE_MAGIC); + bytes.push(PROTOCOL_VERSION); + bytes.push(kind); + bytes.extend_from_slice(&0u16.to_le_bytes()); + bytes.extend_from_slice(&(payload.len() as u32).to_le_bytes()); + bytes.extend_from_slice(payload); + Ok(bytes) +} + +fn decode_pipe_header(header: &[u8], maximum: usize) -> Result<(u8, usize), PipeError> { + if header.len() != PIPE_HEADER_BYTES + || &header[..4] != PIPE_MAGIC + || header[4] != PROTOCOL_VERSION + || u16::from_le_bytes(header[6..8].try_into().expect("fixed pipe header")) != 0 + { + return Err(PipeError::new( + PipeErrorCode::ProtocolMismatch, + "peer pipe header is invalid", + )); + } + let kind = header[5]; + if !matches!( + kind, + AUTH | AUTH_OK | BUSINESS_REQUEST | BUSINESS_RESPONSE | BUSINESS_ACK + ) { + return Err(PipeError::new( + PipeErrorCode::ProtocolMismatch, + "peer pipe kind is invalid", + )); + } + let length = u32::from_le_bytes(header[8..12].try_into().expect("fixed pipe header")) as usize; + if length > maximum || length > MAX_PIPE_PAYLOAD { + return Err(PipeError::new( + PipeErrorCode::ProtocolMismatch, + "peer pipe payload exceeds limit", + )); + } + Ok((kind, length)) +} + +fn read_pipe_frame( + pipe: HANDLE, + maximum: usize, + deadline: Instant, + cancel_handles: &[HANDLE], + force_shutdown: &Event, +) -> Result { + let mut header = [0u8; PIPE_HEADER_BYTES]; + read_exact_overlapped(pipe, &mut header, deadline, cancel_handles, force_shutdown)?; + let (kind, length) = decode_pipe_header(&header, maximum)?; + let mut payload = vec![0u8; length]; + read_exact_overlapped(pipe, &mut payload, deadline, cancel_handles, force_shutdown)?; + Ok(PipeFrame { kind, payload }) +} + +fn write_pipe_frame( + pipe: HANDLE, + kind: u8, + payload: &[u8], + deadline: Instant, + cancel_handles: &[HANDLE], + force_shutdown: &Event, +) -> Result<(), PipeError> { + let bytes = encode_pipe_frame(kind, payload)?; + write_all_overlapped(pipe, &bytes, deadline, cancel_handles, force_shutdown) +} + +fn read_exact_overlapped( + pipe: HANDLE, + mut buffer: &mut [u8], + deadline: Instant, + cancel_handles: &[HANDLE], + force_shutdown: &Event, +) -> Result<(), PipeError> { + while !buffer.is_empty() { + check_deadline_and_cancel(deadline, cancel_handles, force_shutdown)?; + let event = Event::manual_reset().map_err(|error| { + PipeError::os(PipeErrorCode::Io, "read event creation failed", error) + })?; + let mut overlapped: OVERLAPPED = unsafe { zeroed() }; + overlapped.hEvent = event.raw(); + let requested = buffer.len().min(u32::MAX as usize) as u32; + let started = unsafe { + ReadFile( + pipe, + buffer.as_mut_ptr(), + requested, + null_mut(), + &mut overlapped, + ) + }; + let transferred = if started != 0 { + overlapped_result(pipe, &mut overlapped)? + } else { + let error = unsafe { GetLastError() }; + if error == ERROR_BROKEN_PIPE { + return Err(PipeError::new(PipeErrorCode::Io, "peer pipe closed early")); + } + if error != ERROR_IO_PENDING { + return Err(PipeError::os( + PipeErrorCode::Io, + "peer pipe read failed", + io::Error::from_raw_os_error(error as i32), + )); + } + wait_overlapped( + pipe, + &mut overlapped, + event.raw(), + cancel_handles, + Some((deadline, force_shutdown)), + )? + }; + if transferred == 0 { + return Err(PipeError::new(PipeErrorCode::Io, "peer pipe closed early")); + } + buffer = &mut buffer[transferred as usize..]; + } + Ok(()) +} + +fn write_all_overlapped( + pipe: HANDLE, + mut buffer: &[u8], + deadline: Instant, + cancel_handles: &[HANDLE], + force_shutdown: &Event, +) -> Result<(), PipeError> { + while !buffer.is_empty() { + check_deadline_and_cancel(deadline, cancel_handles, force_shutdown)?; + let event = Event::manual_reset().map_err(|error| { + PipeError::os(PipeErrorCode::Io, "write event creation failed", error) + })?; + let mut overlapped: OVERLAPPED = unsafe { zeroed() }; + overlapped.hEvent = event.raw(); + let requested = buffer.len().min(u32::MAX as usize) as u32; + let started = unsafe { + WriteFile( + pipe, + buffer.as_ptr(), + requested, + null_mut(), + &mut overlapped, + ) + }; + let transferred = if started != 0 { + overlapped_result(pipe, &mut overlapped)? + } else { + let error = unsafe { GetLastError() }; + if error != ERROR_IO_PENDING { + return Err(PipeError::os( + PipeErrorCode::Io, + "peer pipe write failed", + io::Error::from_raw_os_error(error as i32), + )); + } + wait_overlapped( + pipe, + &mut overlapped, + event.raw(), + cancel_handles, + Some((deadline, force_shutdown)), + )? + }; + if transferred == 0 { + return Err(PipeError::new( + PipeErrorCode::Io, + "peer pipe write made no progress", + )); + } + buffer = &buffer[transferred as usize..]; + } + Ok(()) +} + +fn wait_overlapped( + pipe: HANDLE, + overlapped: &mut OVERLAPPED, + io_event: HANDLE, + cancel_handles: &[HANDLE], + timed: Option<(Instant, &Event)>, +) -> Result { + let mut handles = Vec::with_capacity(2 + cancel_handles.len()); + handles.push(io_event); + handles.extend_from_slice(cancel_handles); + if let Some((_, force_shutdown)) = timed { + handles.push(force_shutdown.raw()); + } + let timeout = timed + .map(|(deadline, _)| duration_millis(deadline.saturating_duration_since(Instant::now()))) + .unwrap_or(u32::MAX); + let wait = + unsafe { WaitForMultipleObjects(handles.len() as u32, handles.as_ptr(), 0, timeout) }; + if wait == WAIT_OBJECT_0 { + return overlapped_result(pipe, overlapped); + } + + if unsafe { CancelIoEx(pipe, overlapped) } == 0 { + let error = unsafe { GetLastError() }; + if error != ERROR_NOT_FOUND { + return Err(PipeError::os( + PipeErrorCode::Io, + "peer I/O cancellation failed", + io::Error::from_raw_os_error(error as i32), + )); + } + } + let _ = overlapped_result(pipe, overlapped); + if wait == WAIT_TIMEOUT { + return Err(PipeError::new( + PipeErrorCode::Timeout, + "peer request timed out", + )); + } + if wait == WAIT_FAILED { + return Err(PipeError::os( + PipeErrorCode::Io, + "peer wait failed", + io::Error::last_os_error(), + )); + } + let selected = (wait - WAIT_OBJECT_0) as usize; + if selected > 0 && selected <= cancel_handles.len() { + return Err(PipeError::new( + PipeErrorCode::Canceled, + "peer request was canceled", + )); + } + Err(PipeError::new( + PipeErrorCode::ShuttingDown, + "peer broker is shutting down", + )) +} + +fn overlapped_result(pipe: HANDLE, overlapped: &mut OVERLAPPED) -> Result { + let mut transferred = 0u32; + if unsafe { GetOverlappedResult(pipe, overlapped, &mut transferred, 1) } == 0 { + let error = unsafe { GetLastError() }; + let code = if error == ERROR_OPERATION_ABORTED { + PipeErrorCode::Canceled + } else { + PipeErrorCode::Io + }; + Err(PipeError::os( + code, + "peer overlapped operation failed", + io::Error::from_raw_os_error(error as i32), + )) + } else { + Ok(transferred) + } +} + +fn check_deadline_and_cancel( + deadline: Instant, + cancel_handles: &[HANDLE], + force_shutdown: &Event, +) -> Result<(), PipeError> { + if Instant::now() >= deadline { + return Err(PipeError::new( + PipeErrorCode::Timeout, + "peer request timed out", + )); + } + for handle in cancel_handles { + let handles = [*handle]; + if unsafe { WaitForMultipleObjects(1, handles.as_ptr(), 0, 0) } == WAIT_OBJECT_0 { + return Err(PipeError::new( + PipeErrorCode::Canceled, + "peer request was canceled", + )); + } + } + if force_shutdown.is_signaled() { + return Err(PipeError::new( + PipeErrorCode::ShuttingDown, + "peer broker is shutting down", + )); + } + Ok(()) +} + +fn duration_millis(duration: Duration) -> u32 { + duration.as_millis().min((u32::MAX - 1) as u128) as u32 +} + +struct AuthPayload { + sender_instance_id: String, + inbox_token: [u8; INBOX_TOKEN_BYTES], + client_nonce: [u8; 32], +} + +fn encode_auth_payload( + sender_instance_id: &str, + inbox_token: &[u8; INBOX_TOKEN_BYTES], + client_nonce: &[u8; 32], +) -> Result, PipeError> { + if !valid_instance_id(sender_instance_id) + || !valid_inbox_token(std::str::from_utf8(inbox_token).unwrap_or("")) + { + return Err(PipeError::new( + PipeErrorCode::ProtocolMismatch, + "peer authentication payload is invalid", + )); + } + let mut payload = Vec::with_capacity(AUTH_PAYLOAD_BYTES); + payload.push(PROTOCOL_VERSION); + payload.extend_from_slice(&(sender_instance_id.len() as u16).to_le_bytes()); + payload.extend_from_slice(sender_instance_id.as_bytes()); + payload.extend_from_slice(inbox_token); + payload.extend_from_slice(client_nonce); + Ok(payload) +} + +fn parse_auth_payload(payload: &[u8]) -> Result { + if payload.len() != AUTH_PAYLOAD_BYTES || payload[0] != PROTOCOL_VERSION { + return Err(PipeError::new( + PipeErrorCode::ProtocolMismatch, + "peer authentication payload is invalid", + )); + } + let sender_length = u16::from_le_bytes(payload[1..3].try_into().expect("auth prefix")) as usize; + if sender_length != 36 { + return Err(PipeError::new( + PipeErrorCode::ProtocolMismatch, + "peer sender identity is invalid", + )); + } + let sender_instance_id = std::str::from_utf8(&payload[3..39]) + .map_err(|_| { + PipeError::new( + PipeErrorCode::ProtocolMismatch, + "peer sender identity is invalid", + ) + })? + .to_owned(); + if !valid_instance_id(&sender_instance_id) { + return Err(PipeError::new( + PipeErrorCode::ProtocolMismatch, + "peer sender identity is invalid", + )); + } + let inbox_token = payload[39..82].try_into().expect("fixed auth token"); + let client_nonce = payload[82..114].try_into().expect("fixed auth nonce"); + Ok(AuthPayload { + sender_instance_id, + inbox_token, + client_nonce, + }) +} + +fn encode_business_request_payload( + server_nonce: &[u8; 32], + peer_frame: &[u8], +) -> Result, PipeError> { + let business = encode_business_payload(peer_frame)?; + let mut payload = Vec::with_capacity(server_nonce.len() + business.len()); + payload.extend_from_slice(server_nonce); + payload.extend_from_slice(&business); + Ok(payload) +} + +fn parse_business_request_payload( + payload: &[u8], + expected_server_nonce: &[u8; 32], +) -> Result, PipeError> { + if payload.len() < 36 || !constant_time_equal(&payload[..32], expected_server_nonce) { + return Err(PipeError::new( + PipeErrorCode::AuthenticationFailed, + "peer business challenge is invalid", + )); + } + parse_business_payload(&payload[32..]) +} + +fn encode_business_payload(peer_frame: &[u8]) -> Result, PipeError> { + if peer_frame.is_empty() || peer_frame.len() > MAX_PEER_FRAME_BYTES { + return Err(PipeError::new( + PipeErrorCode::ProtocolMismatch, + "peer business frame length is invalid", + )); + } + let mut payload = Vec::with_capacity(4 + peer_frame.len()); + payload.extend_from_slice(&(peer_frame.len() as u32).to_le_bytes()); + payload.extend_from_slice(peer_frame); + Ok(payload) +} + +fn parse_business_payload(payload: &[u8]) -> Result, PipeError> { + if payload.len() < 4 { + return Err(PipeError::new( + PipeErrorCode::ProtocolMismatch, + "peer business frame is truncated", + )); + } + let length = u32::from_le_bytes(payload[..4].try_into().expect("business prefix")) as usize; + if length == 0 || length > MAX_PEER_FRAME_BYTES || payload.len() != length + 4 { + return Err(PipeError::new( + PipeErrorCode::ProtocolMismatch, + "peer business frame length is invalid", + )); + } + Ok(payload[4..].to_vec()) +} + +fn constant_time_equal(left: &[u8], right: &[u8]) -> bool { + if left.len() != right.len() { + return false; + } + let mut difference = 0u8; + for (&left_byte, &right_byte) in left.iter().zip(right) { + difference |= left_byte ^ right_byte; + } + difference == 0 +} + +pub fn generate_pipe_name(namespace_id: &str) -> Result { + if !valid_namespace_id(namespace_id) { + return Err(PipeError::new( + PipeErrorCode::ProtocolMismatch, + "namespace id is invalid", + )); + } + let mut random = [0u8; 24]; + random_bytes(&mut random) + .map_err(|error| PipeError::os(PipeErrorCode::Io, "pipe name generation failed", error))?; + let encoded = base64url_192(&random); + let address = format!(r"\\.\pipe\x-code-peer-v1-{namespace_id}-{encoded}"); + if !valid_pipe_name_shape(&address, Some(namespace_id)) { + return Err(PipeError::new( + PipeErrorCode::ProtocolMismatch, + "generated pipe name is invalid", + )); + } + Ok(address) +} + +fn base64url_192(bytes: &[u8; 24]) -> String { + const ALPHABET: &[u8; 64] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; + let mut output = [0u8; 32]; + for (chunk_index, chunk) in bytes.chunks_exact(3).enumerate() { + let value = ((chunk[0] as u32) << 16) | ((chunk[1] as u32) << 8) | chunk[2] as u32; + let offset = chunk_index * 4; + output[offset] = ALPHABET[((value >> 18) & 0x3f) as usize]; + output[offset + 1] = ALPHABET[((value >> 12) & 0x3f) as usize]; + output[offset + 2] = ALPHABET[((value >> 6) & 0x3f) as usize]; + output[offset + 3] = ALPHABET[(value & 0x3f) as usize]; + } + String::from_utf8(output.to_vec()).expect("base64url alphabet is UTF-8") +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn pipe_name_has_192_bit_random_shape() { + let first = generate_pipe_name("012345abcdef").unwrap(); + let second = generate_pipe_name("012345abcdef").unwrap(); + assert!(valid_pipe_name_shape(&first, Some("012345abcdef"))); + assert_eq!(first.len(), r"\\.\pipe\x-code-peer-v1-".len() + 12 + 1 + 32); + assert_ne!(first, second); + } + + #[test] + fn every_server_instance_rejects_remote_and_only_first_has_first_flag() { + assert_ne!(server_pipe_mode() & PIPE_REJECT_REMOTE_CLIENTS, 0); + assert_ne!(server_open_mode(true) & FILE_FLAG_FIRST_PIPE_INSTANCE, 0); + assert_eq!(server_open_mode(false) & FILE_FLAG_FIRST_PIPE_INSTANCE, 0); + assert_ne!(server_open_mode(true) & FILE_FLAG_OVERLAPPED, 0); + assert_eq!(server_pipe_mode() & PIPE_TYPE_BYTE, PIPE_TYPE_BYTE); + + let identity = crate::process_peer::current_process_identity().unwrap(); + self_test(&identity).unwrap(); + } + + #[test] + fn pipe_codec_rejects_bad_flags_kind_length_and_business_bounds() { + let encoded = encode_pipe_frame(BUSINESS_REQUEST, b"test").unwrap(); + assert_eq!( + decode_pipe_header(&encoded[..PIPE_HEADER_BYTES], 4).unwrap(), + (BUSINESS_REQUEST, 4) + ); + + let mut flags = encoded.clone(); + flags[6] = 1; + assert!(decode_pipe_header(&flags[..PIPE_HEADER_BYTES], 4).is_err()); + let mut kind = encoded.clone(); + kind[5] = 99; + assert!(decode_pipe_header(&kind[..PIPE_HEADER_BYTES], 4).is_err()); + assert!(decode_pipe_header(&encoded[..PIPE_HEADER_BYTES], 3).is_err()); + + assert!(encode_business_payload(&vec![0; MAX_PEER_FRAME_BYTES]).is_ok()); + assert!(encode_business_payload(&vec![0; MAX_PEER_FRAME_BYTES + 1]).is_err()); + } + + #[test] + fn auth_and_nonce_codecs_are_fixed_and_nonce_bound() { + let token: [u8; INBOX_TOKEN_BYTES] = [b'A'; INBOX_TOKEN_BYTES]; + let nonce = [7u8; 32]; + let sender = "550e8400-e29b-41d4-a716-446655440000"; + let encoded = encode_auth_payload(sender, &token, &nonce).unwrap(); + assert_eq!(encoded.len(), AUTH_PAYLOAD_BYTES); + let decoded = parse_auth_payload(&encoded).unwrap(); + assert_eq!(decoded.sender_instance_id, sender); + assert_eq!(decoded.inbox_token, token); + assert_eq!(decoded.client_nonce, nonce); + assert!(constant_time_equal(&nonce, &nonce)); + assert!(!constant_time_equal(&nonce, &[8u8; 32])); + + let request = encode_business_request_payload(&nonce, b"frame").unwrap(); + assert_eq!( + parse_business_request_payload(&request, &nonce).unwrap(), + b"frame" + ); + assert!(parse_business_request_payload(&request, &[8u8; 32]).is_err()); + } +} diff --git a/packages/core/native/windows-peer-broker/src/process_peer.rs b/packages/core/native/windows-peer-broker/src/process_peer.rs new file mode 100644 index 0000000..4c2f54b --- /dev/null +++ b/packages/core/native/windows-peer-broker/src/process_peer.rs @@ -0,0 +1,134 @@ +use std::io; +use std::ptr::null_mut; + +use windows_sys::Win32::Foundation::HANDLE; +use windows_sys::Win32::Security::{RevertToSelf, TOKEN_QUERY}; +use windows_sys::Win32::System::Pipes::{GetNamedPipeServerProcessId, ImpersonateNamedPipeClient}; +use windows_sys::Win32::System::Threading::{ + GetCurrentProcess, GetCurrentThread, OpenProcess, OpenProcessToken, OpenThreadToken, + PROCESS_QUERY_LIMITED_INFORMATION, +}; + +use crate::security::{OwnedHandle, ProcessIdentity, identities_match, token_identity}; + +pub fn current_process_identity() -> io::Result { + let mut token = null_mut(); + if unsafe { OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &mut token) } == 0 { + return Err(io::Error::last_os_error()); + } + let token = OwnedHandle::new(token)?; + let identity = token_identity(token.raw())?; + if identity.is_app_container { + return Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "AppContainer broker tokens are unsupported", + )); + } + Ok(identity) +} + +pub fn verify_named_pipe_server(pipe: HANDLE, current: &ProcessIdentity) -> io::Result<()> { + let mut process_id = 0u32; + if unsafe { GetNamedPipeServerProcessId(pipe, &mut process_id) } == 0 || process_id == 0 { + return Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "server process identity is unavailable", + )); + } + let process = + OwnedHandle::new(unsafe { OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, 0, process_id) }) + .map_err(|_| { + io::Error::new( + io::ErrorKind::PermissionDenied, + "server process cannot be inspected", + ) + })?; + let mut token = null_mut(); + if unsafe { OpenProcessToken(process.raw(), TOKEN_QUERY, &mut token) } == 0 { + return Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "server token cannot be inspected", + )); + } + let token = OwnedHandle::new(token)?; + let peer = token_identity(token.raw()).map_err(|_| { + io::Error::new( + io::ErrorKind::PermissionDenied, + "server token identity is invalid", + ) + })?; + if identities_match(current, &peer) { + Ok(()) + } else { + Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "server process identity is incompatible", + )) + } +} + +pub fn verify_named_pipe_client(pipe: HANDLE, current: &ProcessIdentity) -> io::Result<()> { + if unsafe { ImpersonateNamedPipeClient(pipe) } == 0 { + return Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "client impersonation failed", + )); + } + let guard = ImpersonationGuard { active: true }; + let result = inspect_thread_identity(current); + let revert_result = guard.revert(); + result.and(revert_result) +} + +fn inspect_thread_identity(current: &ProcessIdentity) -> io::Result<()> { + let mut token = null_mut(); + if unsafe { OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, 1, &mut token) } == 0 { + return Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "client token cannot be inspected", + )); + } + let token = OwnedHandle::new(token)?; + let peer = token_identity(token.raw()).map_err(|_| { + io::Error::new( + io::ErrorKind::PermissionDenied, + "client token identity is invalid", + ) + })?; + if identities_match(current, &peer) { + Ok(()) + } else { + Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "client process identity is incompatible", + )) + } +} + +struct ImpersonationGuard { + active: bool, +} + +impl ImpersonationGuard { + fn revert(mut self) -> io::Result<()> { + self.active = false; + if unsafe { RevertToSelf() } == 0 { + Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "client impersonation revert failed", + )) + } else { + Ok(()) + } + } +} + +impl Drop for ImpersonationGuard { + fn drop(&mut self) { + if self.active { + unsafe { + RevertToSelf(); + } + } + } +} diff --git a/packages/core/native/windows-peer-broker/src/protocol.rs b/packages/core/native/windows-peer-broker/src/protocol.rs new file mode 100644 index 0000000..ccaca1f --- /dev/null +++ b/packages/core/native/windows-peer-broker/src/protocol.rs @@ -0,0 +1,537 @@ +use std::fmt; + +pub const PROTOCOL_VERSION: u8 = 1; +pub const HEADER_BYTES: usize = 16; +pub const MAX_CONTROL_PAYLOAD: usize = 139_264; +pub const MAX_PEER_FRAME_BYTES: usize = 131_072; +pub const MAX_ACTIVE_OPERATIONS: usize = 256; +pub const MAX_RUNTIME_ROOT_BYTES: usize = u16::MAX as usize; +pub const MAX_TIMEOUT_MS: u32 = 120_000; +pub const INBOX_TOKEN_BYTES: usize = 43; + +const MAGIC: &[u8; 4] = b"XCPB"; + +pub const SECURE_RUNTIME: u8 = 0x01; +pub const START_SERVER: u8 = 0x02; +pub const OUTBOUND_REQUEST: u8 = 0x03; +pub const INBOUND_RESPONSE: u8 = 0x04; +pub const CANCEL_OPERATION: u8 = 0x05; +pub const SHUTDOWN: u8 = 0x06; + +pub const SECURE_RUNTIME_RESULT: u8 = 0x81; +pub const SERVER_READY: u8 = 0x82; +pub const INBOUND_REQUEST: u8 = 0x83; +pub const OUTBOUND_RESPONSE: u8 = 0x84; +pub const CANCEL_ACK: u8 = 0x85; +pub const OPERATION_ERROR: u8 = 0x86; +pub const SERVER_FATAL: u8 = 0x87; +pub const SHUTDOWN_COMPLETE: u8 = 0x88; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ProtocolError(&'static str); + +impl ProtocolError { + pub const fn new(message: &'static str) -> Self { + Self(message) + } +} + +impl fmt::Display for ProtocolError { + fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { + formatter.write_str(self.0) + } +} + +impl std::error::Error for ProtocolError {} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct Frame { + pub kind: u8, + pub operation_id: u32, + pub payload: Vec, +} + +impl Frame { + pub fn encode(&self) -> Result, ProtocolError> { + if !is_known_kind(self.kind) { + return Err(ProtocolError::new("unknown frame kind")); + } + if self.payload.len() > MAX_CONTROL_PAYLOAD { + return Err(ProtocolError::new("control payload exceeds limit")); + } + let mut bytes = Vec::with_capacity(HEADER_BYTES + self.payload.len()); + bytes.extend_from_slice(MAGIC); + bytes.push(PROTOCOL_VERSION); + bytes.push(self.kind); + bytes.extend_from_slice(&0u16.to_le_bytes()); + bytes.extend_from_slice(&self.operation_id.to_le_bytes()); + bytes.extend_from_slice(&(self.payload.len() as u32).to_le_bytes()); + bytes.extend_from_slice(&self.payload); + Ok(bytes) + } +} + +pub struct FrameDecoder { + buffer: Vec, + expected: Option, +} + +impl FrameDecoder { + pub fn new() -> Self { + Self { + buffer: Vec::with_capacity(HEADER_BYTES), + expected: None, + } + } + + pub fn push(&mut self, chunk: &[u8]) -> Result, ProtocolError> { + let mut frames = Vec::new(); + for &byte in chunk { + self.buffer.push(byte); + if self.buffer.len() == HEADER_BYTES { + self.expected = Some(parse_header(&self.buffer)?); + } + if self.expected == Some(self.buffer.len()) { + frames.push(decode_complete_frame(&self.buffer)?); + self.buffer.clear(); + self.expected = None; + } + } + Ok(frames) + } + + pub fn finish(&self) -> Result<(), ProtocolError> { + if self.buffer.is_empty() { + Ok(()) + } else { + Err(ProtocolError::new("truncated control frame")) + } + } +} + +fn parse_header(header: &[u8]) -> Result { + if header.len() != HEADER_BYTES || &header[0..4] != MAGIC { + return Err(ProtocolError::new("invalid control magic")); + } + if header[4] != PROTOCOL_VERSION { + return Err(ProtocolError::new("unsupported control version")); + } + if !is_known_kind(header[5]) { + return Err(ProtocolError::new("unknown frame kind")); + } + if u16::from_le_bytes(header[6..8].try_into().expect("fixed header")) != 0 { + return Err(ProtocolError::new("unsupported control flags")); + } + let payload_length = + u32::from_le_bytes(header[12..16].try_into().expect("fixed header")) as usize; + if payload_length > MAX_CONTROL_PAYLOAD { + return Err(ProtocolError::new("control payload exceeds limit")); + } + Ok(HEADER_BYTES + payload_length) +} + +fn decode_complete_frame(bytes: &[u8]) -> Result { + let expected = parse_header(&bytes[..HEADER_BYTES])?; + if expected != bytes.len() { + return Err(ProtocolError::new("invalid complete frame length")); + } + Ok(Frame { + kind: bytes[5], + operation_id: u32::from_le_bytes(bytes[8..12].try_into().expect("fixed header")), + payload: bytes[HEADER_BYTES..].to_vec(), + }) +} + +fn is_known_kind(kind: u8) -> bool { + matches!( + kind, + SECURE_RUNTIME + | START_SERVER + | OUTBOUND_REQUEST + | INBOUND_RESPONSE + | CANCEL_OPERATION + | SHUTDOWN + | SECURE_RUNTIME_RESULT + | SERVER_READY + | INBOUND_REQUEST + | OUTBOUND_RESPONSE + | CANCEL_ACK + | OPERATION_ERROR + | SERVER_FATAL + | SHUTDOWN_COMPLETE + ) +} + +pub fn validate_node_frame(frame: &Frame, secure_runtime_mode: bool) -> Result<(), ProtocolError> { + if frame.operation_id == 0 { + return Err(ProtocolError::new("request operation id must be nonzero")); + } + let allowed = if secure_runtime_mode { + frame.kind == SECURE_RUNTIME + } else { + matches!( + frame.kind, + START_SERVER | OUTBOUND_REQUEST | INBOUND_RESPONSE | CANCEL_OPERATION | SHUTDOWN + ) + }; + if !allowed { + return Err(ProtocolError::new("frame kind is invalid in this mode")); + } + if matches!(frame.kind, CANCEL_OPERATION | SHUTDOWN) && !frame.payload.is_empty() { + return Err(ProtocolError::new("control request payload must be empty")); + } + Ok(()) +} + +struct PayloadCursor<'a> { + bytes: &'a [u8], + offset: usize, +} + +impl<'a> PayloadCursor<'a> { + fn new(bytes: &'a [u8]) -> Self { + Self { bytes, offset: 0 } + } + + fn take(&mut self, length: usize) -> Result<&'a [u8], ProtocolError> { + let end = self + .offset + .checked_add(length) + .ok_or_else(|| ProtocolError::new("payload length overflow"))?; + if end > self.bytes.len() { + return Err(ProtocolError::new("truncated control payload")); + } + let value = &self.bytes[self.offset..end]; + self.offset = end; + Ok(value) + } + + fn string(&mut self) -> Result { + let length = u16::from_le_bytes( + self.take(2)? + .try_into() + .expect("u16 prefix has fixed length"), + ) as usize; + let bytes = self.take(length)?; + std::str::from_utf8(bytes) + .map(str::to_owned) + .map_err(|_| ProtocolError::new("control string is not UTF-8")) + } + + fn bytes(&mut self, maximum: usize) -> Result, ProtocolError> { + let length = u32::from_le_bytes( + self.take(4)? + .try_into() + .expect("u32 prefix has fixed length"), + ) as usize; + if length > maximum { + return Err(ProtocolError::new("control byte array exceeds limit")); + } + Ok(self.take(length)?.to_vec()) + } + + fn u32(&mut self) -> Result { + Ok(u32::from_le_bytes( + self.take(4)?.try_into().expect("u32 has fixed length"), + )) + } + + fn finish(self) -> Result<(), ProtocolError> { + if self.offset == self.bytes.len() { + Ok(()) + } else { + Err(ProtocolError::new("unexpected control payload suffix")) + } + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct SecureRuntimeRequest { + pub root: String, +} + +pub fn parse_secure_runtime(payload: &[u8]) -> Result { + let mut cursor = PayloadCursor::new(payload); + let root = cursor.string()?; + if root.is_empty() || root.len() > MAX_RUNTIME_ROOT_BYTES { + return Err(ProtocolError::new("runtime root length is invalid")); + } + cursor.finish()?; + Ok(SecureRuntimeRequest { root }) +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct StartServerRequest { + pub namespace_id: String, + pub instance_id: String, + pub inbox_token: String, +} + +pub fn parse_start_server(payload: &[u8]) -> Result { + let mut cursor = PayloadCursor::new(payload); + let request = StartServerRequest { + namespace_id: cursor.string()?, + instance_id: cursor.string()?, + inbox_token: cursor.string()?, + }; + cursor.finish()?; + if !valid_namespace_id(&request.namespace_id) { + return Err(ProtocolError::new("namespace id is invalid")); + } + if !valid_instance_id(&request.instance_id) { + return Err(ProtocolError::new("instance id is invalid")); + } + if !valid_inbox_token(&request.inbox_token) { + return Err(ProtocolError::new("inbox token is invalid")); + } + Ok(request) +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct OutboundRequest { + pub address: String, + pub target_token: String, + pub sender_instance_id: String, + pub timeout_ms: u32, + pub peer_frame: Vec, +} + +pub fn parse_outbound_request(payload: &[u8]) -> Result { + let mut cursor = PayloadCursor::new(payload); + let request = OutboundRequest { + address: cursor.string()?, + target_token: cursor.string()?, + sender_instance_id: cursor.string()?, + timeout_ms: cursor.u32()?, + peer_frame: cursor.bytes(MAX_PEER_FRAME_BYTES)?, + }; + cursor.finish()?; + if !valid_pipe_name_shape(&request.address, None) { + return Err(ProtocolError::new("pipe address is invalid")); + } + if !valid_inbox_token(&request.target_token) { + return Err(ProtocolError::new("target token is invalid")); + } + if !valid_instance_id(&request.sender_instance_id) { + return Err(ProtocolError::new("sender instance id is invalid")); + } + if request.timeout_ms == 0 || request.timeout_ms > MAX_TIMEOUT_MS { + return Err(ProtocolError::new("outbound timeout is invalid")); + } + if request.peer_frame.is_empty() { + return Err(ProtocolError::new("peer frame is empty")); + } + Ok(request) +} + +pub fn parse_peer_frame_payload(payload: &[u8]) -> Result, ProtocolError> { + let mut cursor = PayloadCursor::new(payload); + let frame = cursor.bytes(MAX_PEER_FRAME_BYTES)?; + cursor.finish()?; + if frame.is_empty() { + return Err(ProtocolError::new("peer frame is empty")); + } + Ok(frame) +} + +fn push_string(output: &mut Vec, value: &str) -> Result<(), ProtocolError> { + let length = u16::try_from(value.len()) + .map_err(|_| ProtocolError::new("control string exceeds u16 limit"))?; + output.extend_from_slice(&length.to_le_bytes()); + output.extend_from_slice(value.as_bytes()); + Ok(()) +} + +fn push_bytes(output: &mut Vec, value: &[u8]) -> Result<(), ProtocolError> { + if value.len() > MAX_PEER_FRAME_BYTES { + return Err(ProtocolError::new("peer frame exceeds limit")); + } + output.extend_from_slice(&(value.len() as u32).to_le_bytes()); + output.extend_from_slice(value); + Ok(()) +} + +pub fn encode_one_string(value: &str) -> Result, ProtocolError> { + let mut output = Vec::with_capacity(2 + value.len()); + push_string(&mut output, value)?; + Ok(output) +} + +pub fn encode_peer_frame(value: &[u8]) -> Result, ProtocolError> { + let mut output = Vec::with_capacity(4 + value.len()); + push_bytes(&mut output, value)?; + Ok(output) +} + +pub fn encode_inbound_request( + sender_instance_id: &str, + peer_frame: &[u8], +) -> Result, ProtocolError> { + if !valid_instance_id(sender_instance_id) { + return Err(ProtocolError::new("sender instance id is invalid")); + } + let mut output = Vec::with_capacity(2 + sender_instance_id.len() + 4 + peer_frame.len()); + push_string(&mut output, sender_instance_id)?; + push_bytes(&mut output, peer_frame)?; + Ok(output) +} + +pub fn encode_error(code: &str, message: &str) -> Result, ProtocolError> { + if code.is_empty() + || code.len() > 64 + || !code + .bytes() + .all(|byte| byte.is_ascii_uppercase() || byte == b'_') + { + return Err(ProtocolError::new("error code is invalid")); + } + if message.len() > 512 { + return Err(ProtocolError::new("error message exceeds limit")); + } + let mut output = Vec::with_capacity(4 + code.len() + message.len()); + push_string(&mut output, code)?; + push_string(&mut output, message)?; + Ok(output) +} + +pub fn valid_namespace_id(value: &str) -> bool { + value.len() == 12 + && value + .bytes() + .all(|byte| byte.is_ascii_digit() || (b'a'..=b'f').contains(&byte)) +} + +pub fn valid_instance_id(value: &str) -> bool { + if value.len() != 36 { + return false; + } + value.bytes().enumerate().all(|(index, byte)| { + if matches!(index, 8 | 13 | 18 | 23) { + byte == b'-' + } else { + byte.is_ascii_hexdigit() + } + }) +} + +pub fn valid_inbox_token(value: &str) -> bool { + value.len() == INBOX_TOKEN_BYTES + && value + .bytes() + .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'-' | b'_')) +} + +pub fn valid_pipe_name_shape(value: &str, expected_namespace: Option<&str>) -> bool { + const PREFIX: &str = r"\\.\pipe\x-code-peer-v1-"; + let Some(suffix) = value.strip_prefix(PREFIX) else { + return false; + }; + let Some((namespace, random)) = suffix.split_once('-') else { + return false; + }; + valid_namespace_id(namespace) + && expected_namespace.is_none_or(|expected| expected == namespace) + && random.len() == 32 + && random + .bytes() + .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'-' | b'_')) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn frame(kind: u8, operation_id: u32, payload: &[u8]) -> Vec { + Frame { + kind, + operation_id, + payload: payload.to_vec(), + } + .encode() + .unwrap() + } + + #[test] + fn decoder_handles_every_chunk_boundary_and_merged_frames() { + let first = frame(START_SERVER, 7, b"alpha"); + let second = frame(SHUTDOWN, 9, &[]); + let joined = [first.as_slice(), second.as_slice()].concat(); + + for split in 0..=joined.len() { + let mut decoder = FrameDecoder::new(); + let mut decoded = decoder.push(&joined[..split]).unwrap(); + decoded.extend(decoder.push(&joined[split..]).unwrap()); + decoder.finish().unwrap(); + assert_eq!(decoded.len(), 2); + assert_eq!(decoded[0].operation_id, 7); + assert_eq!(decoded[1].kind, SHUTDOWN); + } + } + + #[test] + fn decoder_rejects_truncation_unknown_flags_and_oversize_before_payload() { + let bytes = frame(SHUTDOWN, 1, &[]); + let mut truncated = FrameDecoder::new(); + truncated.push(&bytes[..HEADER_BYTES - 1]).unwrap(); + assert_eq!( + truncated.finish().unwrap_err().to_string(), + "truncated control frame" + ); + + let mut flags = bytes.clone(); + flags[6] = 1; + assert!(FrameDecoder::new().push(&flags).is_err()); + + let mut oversized = bytes; + oversized[12..16].copy_from_slice(&((MAX_CONTROL_PAYLOAD + 1) as u32).to_le_bytes()); + assert!(FrameDecoder::new().push(&oversized).is_err()); + } + + #[test] + fn payload_cursor_rejects_bad_utf8_truncation_suffix_and_peer_bounds() { + assert!(parse_secure_runtime(&[1, 0, 0xff]).is_err()); + assert!(parse_secure_runtime(&[4, 0, b'a']).is_err()); + assert!(parse_secure_runtime(&[1, 0, b'a', 0]).is_err()); + + let mut oversized = Vec::new(); + oversized.extend_from_slice(&((MAX_PEER_FRAME_BYTES + 1) as u32).to_le_bytes()); + assert!(parse_peer_frame_payload(&oversized).is_err()); + } + + #[test] + fn validators_lock_pipe_token_and_instance_shapes() { + let namespace = "012345abcdef"; + let random = "AbCdEfGhIjKlMnOpQrStUvWxYz012345"; + let name = format!(r"\\.\pipe\x-code-peer-v1-{namespace}-{random}"); + assert!(valid_pipe_name_shape(&name, Some(namespace))); + assert!(!valid_pipe_name_shape(&name, Some("fedcba543210"))); + assert!(!valid_pipe_name_shape( + r"\\.\pipe\x-code-peer-v1-012345abcdef-../../bad", + None + )); + assert!(valid_inbox_token(&"A".repeat(INBOX_TOKEN_BYTES))); + assert!(!valid_inbox_token(&"A".repeat(INBOX_TOKEN_BYTES - 1))); + assert!(valid_instance_id("550e8400-e29b-41d4-a716-446655440000")); + assert!(!valid_instance_id("550e8400/e29b/41d4/a716/446655440000")); + } + + #[test] + fn control_payload_maximum_is_exact() { + assert_eq!(MAX_CONTROL_PAYLOAD, 139_264); + assert_eq!(MAX_PEER_FRAME_BYTES, 131_072); + let maximum = Frame { + kind: OPERATION_ERROR, + operation_id: 1, + payload: vec![0; MAX_CONTROL_PAYLOAD], + }; + assert_eq!( + maximum.encode().unwrap().len(), + HEADER_BYTES + MAX_CONTROL_PAYLOAD + ); + let too_large = Frame { + payload: vec![0; MAX_CONTROL_PAYLOAD + 1], + ..maximum + }; + assert!(too_large.encode().is_err()); + } +} diff --git a/packages/core/native/windows-peer-broker/src/runtime_acl.rs b/packages/core/native/windows-peer-broker/src/runtime_acl.rs new file mode 100644 index 0000000..53b7523 --- /dev/null +++ b/packages/core/native/windows-peer-broker/src/runtime_acl.rs @@ -0,0 +1,277 @@ +use std::io; +use std::mem::zeroed; +use std::path::{Component, Path, Prefix}; +use std::ptr::{null, null_mut}; + +use sha2::{Digest, Sha256}; +use windows_sys::Win32::Foundation::{ERROR_ALREADY_EXISTS, GetLastError}; +use windows_sys::Win32::Storage::FileSystem::{ + BY_HANDLE_FILE_INFORMATION, CreateDirectoryW, CreateFileW, FILE_ATTRIBUTE_DIRECTORY, + FILE_ATTRIBUTE_REPARSE_POINT, FILE_FLAG_BACKUP_SEMANTICS, FILE_FLAG_OPEN_REPARSE_POINT, + FILE_NAME_NORMALIZED, FILE_READ_ATTRIBUTES, FILE_SHARE_DELETE, FILE_SHARE_READ, + FILE_SHARE_WRITE, GetDriveTypeW, GetFileInformationByHandle, GetFinalPathNameByHandleW, + GetVolumeInformationW, GetVolumePathNameW, OPEN_EXISTING, READ_CONTROL, VOLUME_NAME_GUID, + WRITE_DAC, +}; + +use crate::security::{ + OwnedHandle, PrivateSecurityDescriptor, ProcessIdentity, audit_parent_handle, + verify_private_handle, wide, +}; + +const DRIVE_REMOTE: u32 = 4; +const DRIVE_UNKNOWN: u32 = 0; +const DRIVE_NO_ROOT_DIR: u32 = 1; +const FILE_PERSISTENT_ACLS: u32 = 0x0000_0008; +const MAX_WINDOWS_PATH_UNITS: usize = 32_767; + +pub fn secure_runtime(root: &str, identity: &ProcessIdentity) -> io::Result { + let root_path = validate_root_shape(root)?; + validate_local_acl_volume(root)?; + + let mut retained_handles = Vec::new(); + for (index, ancestor) in root_path + .ancestors() + .filter(|path| !path.as_os_str().is_empty()) + .enumerate() + { + let handle = open_directory(ancestor, false)?; + audit_parent_handle(handle.raw(), &identity.account_sid, index == 0)?; + retained_handles.push(handle); + } + + let descriptor = PrivateSecurityDescriptor::new(&identity.account_sid, true)?; + let runtime_path = root_path.join("runtime"); + let runtime = ensure_private_directory(&runtime_path, &descriptor, identity)?; + let peers_path = runtime_path.join("peers"); + let peers = ensure_private_directory(&peers_path, &descriptor, identity)?; + + verify_private_handle(runtime.raw(), &identity.account_sid)?; + verify_private_handle(peers.raw(), &identity.account_sid)?; + let canonical = final_guid_path(peers.raw())?; + drop(retained_handles); + Ok(namespace_id_from_utf16(&canonical)) +} + +fn validate_root_shape(root: &str) -> io::Result<&Path> { + if root.is_empty() + || root.encode_utf16().count() > MAX_WINDOWS_PATH_UNITS + || root.contains('\0') + { + return Err(io::Error::new( + io::ErrorKind::InvalidInput, + "runtime root length is invalid", + )); + } + let path = Path::new(root); + if !path.is_absolute() { + return Err(io::Error::new( + io::ErrorKind::InvalidInput, + "runtime root must be absolute", + )); + } + match path.components().next() { + Some(Component::Prefix(prefix)) + if matches!(prefix.kind(), Prefix::Disk(_) | Prefix::VerbatimDisk(_)) => {} + _ => { + return Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "UNC and device runtime roots are unsupported", + )); + } + } + Ok(path) +} + +fn validate_local_acl_volume(root: &str) -> io::Result<()> { + let root_wide = wide(root)?; + let mut volume_path = vec![0u16; MAX_WINDOWS_PATH_UNITS + 1]; + if unsafe { + GetVolumePathNameW( + root_wide.as_ptr(), + volume_path.as_mut_ptr(), + volume_path.len() as u32, + ) + } == 0 + { + return Err(io::Error::last_os_error()); + } + let drive_type = unsafe { GetDriveTypeW(volume_path.as_ptr()) }; + if matches!(drive_type, DRIVE_UNKNOWN | DRIVE_NO_ROOT_DIR | DRIVE_REMOTE) { + return Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "runtime volume is not a supported local volume", + )); + } + let mut filesystem_flags = 0u32; + if unsafe { + GetVolumeInformationW( + volume_path.as_ptr(), + null_mut(), + 0, + null_mut(), + null_mut(), + &mut filesystem_flags, + null_mut(), + 0, + ) + } == 0 + { + return Err(io::Error::last_os_error()); + } + if filesystem_flags & FILE_PERSISTENT_ACLS == 0 { + return Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "runtime volume does not support persistent ACLs", + )); + } + Ok(()) +} + +fn ensure_private_directory( + path: &Path, + descriptor: &PrivateSecurityDescriptor, + identity: &ProcessIdentity, +) -> io::Result { + let path_text = path.to_str().ok_or_else(|| { + io::Error::new(io::ErrorKind::InvalidInput, "runtime path is not Unicode") + })?; + let path_wide = wide(path_text)?; + let attributes = descriptor.attributes(); + if unsafe { CreateDirectoryW(path_wide.as_ptr(), &attributes) } == 0 { + let error = unsafe { GetLastError() }; + if error != ERROR_ALREADY_EXISTS { + return Err(io::Error::from_raw_os_error(error as i32)); + } + } + let handle = open_directory_with_access(path, READ_CONTROL | WRITE_DAC | FILE_READ_ATTRIBUTES)?; + descriptor.apply_to_handle(handle.raw())?; + verify_private_handle(handle.raw(), &identity.account_sid)?; + Ok(handle) +} + +fn open_directory(path: &Path, writable_dacl: bool) -> io::Result { + let mut access = READ_CONTROL | FILE_READ_ATTRIBUTES; + if writable_dacl { + access |= WRITE_DAC; + } + open_directory_with_access(path, access) +} + +fn open_directory_with_access(path: &Path, access: u32) -> io::Result { + let path_text = path.to_str().ok_or_else(|| { + io::Error::new(io::ErrorKind::InvalidInput, "runtime path is not Unicode") + })?; + let path_wide = wide(path_text)?; + let handle = OwnedHandle::new(unsafe { + CreateFileW( + path_wide.as_ptr(), + access, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + null(), + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, + null_mut(), + ) + })?; + let mut information: BY_HANDLE_FILE_INFORMATION = unsafe { zeroed() }; + if unsafe { GetFileInformationByHandle(handle.raw(), &mut information) } == 0 { + return Err(io::Error::last_os_error()); + } + if information.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY == 0 { + return Err(io::Error::new( + io::ErrorKind::InvalidInput, + "runtime path is not a directory", + )); + } + if information.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT != 0 { + return Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "runtime path contains a reparse point", + )); + } + Ok(handle) +} + +fn final_guid_path(handle: windows_sys::Win32::Foundation::HANDLE) -> io::Result> { + let flags = FILE_NAME_NORMALIZED | VOLUME_NAME_GUID; + let required = unsafe { GetFinalPathNameByHandleW(handle, null_mut(), 0, flags) } as usize; + if required == 0 || required > MAX_WINDOWS_PATH_UNITS { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "canonical runtime path length is invalid", + )); + } + let mut buffer = vec![0u16; required + 1]; + let written = unsafe { + GetFinalPathNameByHandleW(handle, buffer.as_mut_ptr(), buffer.len() as u32, flags) + } as usize; + if written == 0 || written > required { + return Err(io::Error::last_os_error()); + } + buffer.truncate(written); + Ok(buffer) +} + +fn namespace_id_from_utf16(canonical_path: &[u16]) -> String { + let mut hasher = Sha256::new(); + for unit in canonical_path { + hasher.update(unit.to_le_bytes()); + } + let digest = hasher.finalize(); + let mut namespace = String::with_capacity(12); + for byte in &digest[..6] { + use std::fmt::Write as _; + write!(namespace, "{byte:02x}").expect("writing to String cannot fail"); + } + namespace +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn namespace_hash_uses_normalized_utf16le_bytes() { + let path: Vec = r"\\?\Volume{01234567-89ab-cdef-0123-456789abcdef}\x\runtime\peers" + .encode_utf16() + .collect(); + assert_eq!(namespace_id_from_utf16(&path), "b7ba38534afc"); + assert_eq!(namespace_id_from_utf16(&path).len(), 12); + } + + #[test] + fn runtime_root_shape_rejects_relative_and_unc_paths() { + assert!(validate_root_shape(r"relative\x").is_err()); + assert!(validate_root_shape(r"\\server\share\x").is_err()); + assert!(validate_root_shape(r"C:\x-code").is_ok()); + } + + #[test] + fn secures_and_verifies_a_real_local_runtime_tree() { + let identity = crate::process_peer::current_process_identity().unwrap(); + let descriptor = PrivateSecurityDescriptor::new(&identity.account_sid, true).unwrap(); + let mut random = [0u8; 8]; + crate::security::random_bytes(&mut random).unwrap(); + let suffix = random + .iter() + .map(|byte| format!("{byte:02x}")) + .collect::(); + let root = Path::new(&std::env::var("USERPROFILE").unwrap()) + .join(format!(".x-code-peer-native-test-{suffix}")); + let result = (|| { + let handle = ensure_private_directory(&root, &descriptor, &identity)?; + drop(handle); + let namespace = secure_runtime(root.to_str().unwrap(), &identity)?; + if namespace.len() != 12 { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "namespace length mismatch", + )); + } + Ok(()) + })(); + let _ = std::fs::remove_dir_all(&root); + result.unwrap(); + } +} diff --git a/packages/core/native/windows-peer-broker/src/security.rs b/packages/core/native/windows-peer-broker/src/security.rs new file mode 100644 index 0000000..ce1afba --- /dev/null +++ b/packages/core/native/windows-peer-broker/src/security.rs @@ -0,0 +1,686 @@ +use std::ffi::c_void; +use std::io; +use std::mem::{size_of, zeroed}; +use std::ptr::{null, null_mut}; +use std::sync::Arc; + +use windows_sys::Win32::Foundation::{CloseHandle, GENERIC_ALL, HANDLE, INVALID_HANDLE_VALUE}; +use windows_sys::Win32::Security::Cryptography::{ + BCRYPT_USE_SYSTEM_PREFERRED_RNG, BCryptGenRandom, +}; +use windows_sys::Win32::Security::{ + ACCESS_ALLOWED_ACE, ACL, ACL_REVISION, ACL_SIZE_INFORMATION, AddAccessAllowedAceEx, CopySid, + CreateWellKnownSid, DACL_SECURITY_INFORMATION, EqualSid, GetAce, GetAclInformation, + GetKernelObjectSecurity, GetLengthSid, GetSecurityDescriptorControl, GetSecurityDescriptorDacl, + GetSecurityDescriptorOwner, GetSidSubAuthority, GetSidSubAuthorityCount, GetTokenInformation, + INHERIT_ONLY_ACE, InitializeAcl, InitializeSecurityDescriptor, IsValidSid, OBJECT_INHERIT_ACE, + OWNER_SECURITY_INFORMATION, PROTECTED_DACL_SECURITY_INFORMATION, PSECURITY_DESCRIPTOR, PSID, + SE_DACL_PROTECTED, SECURITY_ATTRIBUTES, SetKernelObjectSecurity, SetSecurityDescriptorControl, + SetSecurityDescriptorDacl, TOKEN_MANDATORY_LABEL, TOKEN_USER, TokenIntegrityLevel, + TokenIsAppContainer, TokenUser, WELL_KNOWN_SID_TYPE, +}; +use windows_sys::Win32::System::Threading::{CreateEventW, SetEvent, WaitForSingleObject}; + +const ACCESS_ALLOWED_ACE_TYPE: u8 = 0; +const ACCESS_DENIED_ACE_TYPE: u8 = 1; +const CONTAINER_INHERIT_ACE: u32 = 0x02; +const SECURITY_DESCRIPTOR_REVISION: u32 = 1; + +#[derive(Debug)] +pub struct OwnedHandle(usize); + +impl OwnedHandle { + pub fn new(handle: HANDLE) -> io::Result { + if handle.is_null() || handle == INVALID_HANDLE_VALUE { + Err(io::Error::last_os_error()) + } else { + Ok(Self(handle as usize)) + } + } + + pub fn raw(&self) -> HANDLE { + self.0 as HANDLE + } +} + +unsafe impl Send for OwnedHandle {} +unsafe impl Sync for OwnedHandle {} + +impl Drop for OwnedHandle { + fn drop(&mut self) { + if self.0 != 0 { + unsafe { + CloseHandle(self.raw()); + } + } + } +} + +#[derive(Clone, Debug)] +pub struct Event(Arc); + +impl Event { + pub fn manual_reset() -> io::Result { + let handle = unsafe { CreateEventW(null(), 1, 0, null()) }; + Ok(Self(Arc::new(OwnedHandle::new(handle)?))) + } + + pub fn signal(&self) -> io::Result<()> { + if unsafe { SetEvent(self.raw()) } == 0 { + Err(io::Error::last_os_error()) + } else { + Ok(()) + } + } + + pub fn is_signaled(&self) -> bool { + (unsafe { WaitForSingleObject(self.raw(), 0) }) == 0 + } + + pub fn raw(&self) -> HANDLE { + self.0.raw() + } +} + +#[derive(Clone, Debug)] +pub struct Sid { + storage: Arc>, + length: usize, +} + +impl Sid { + unsafe fn copy_from(raw: PSID) -> io::Result { + if raw.is_null() { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "missing token SID", + )); + } + let length = unsafe { GetLengthSid(raw) } as usize; + if length == 0 || length > 68 { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "token SID length is invalid", + )); + } + let mut storage = vec![0usize; length.div_ceil(size_of::())]; + if unsafe { CopySid(length as u32, storage.as_mut_ptr().cast(), raw) } == 0 { + return Err(io::Error::last_os_error()); + } + Ok(Self { + storage: Arc::new(storage), + length, + }) + } + + pub fn raw(&self) -> PSID { + self.storage.as_ptr() as PSID + } + + pub fn length(&self) -> usize { + self.length + } + + pub fn equals_raw(&self, other: PSID) -> bool { + !other.is_null() && unsafe { EqualSid(self.raw(), other) } != 0 + } + + pub fn equals(&self, other: &Self) -> bool { + self.equals_raw(other.raw()) + } + + fn from_subauthorities( + identifier_authority: [u8; 6], + subauthorities: &[u32], + ) -> io::Result { + if subauthorities.len() > 15 { + return Err(io::Error::new( + io::ErrorKind::InvalidInput, + "SID has too many subauthorities", + )); + } + let length = 8 + std::mem::size_of_val(subauthorities); + let mut storage = vec![0usize; length.div_ceil(size_of::())]; + let bytes = + unsafe { std::slice::from_raw_parts_mut(storage.as_mut_ptr().cast::(), length) }; + bytes[0] = 1; + bytes[1] = subauthorities.len() as u8; + bytes[2..8].copy_from_slice(&identifier_authority); + for (index, value) in subauthorities.iter().enumerate() { + let offset = 8 + index * size_of::(); + bytes[offset..offset + size_of::()].copy_from_slice(&value.to_le_bytes()); + } + if unsafe { IsValidSid(storage.as_ptr() as PSID) } == 0 { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "constructed SID is invalid", + )); + } + Ok(Self { + storage: Arc::new(storage), + length, + }) + } +} + +#[derive(Clone, Debug)] +pub struct ProcessIdentity { + pub account_sid: Sid, + pub integrity_rid: u32, + pub is_app_container: bool, +} + +pub fn token_identity(token: HANDLE) -> io::Result { + let user = query_token_information(token, TokenUser)?; + let token_user = unsafe { &*(user.as_ptr().cast::()) }; + let account_sid = unsafe { Sid::copy_from(token_user.User.Sid) }?; + + let integrity = query_token_information(token, TokenIntegrityLevel)?; + let label = unsafe { &*(integrity.as_ptr().cast::()) }; + let integrity_sid = label.Label.Sid; + if integrity_sid.is_null() { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "missing integrity SID", + )); + } + let count = unsafe { *GetSidSubAuthorityCount(integrity_sid) } as u32; + if count == 0 { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "integrity SID is invalid", + )); + } + let integrity_rid = unsafe { *GetSidSubAuthority(integrity_sid, count - 1) }; + + let app_container = query_token_information(token, TokenIsAppContainer)?; + if app_container.len() * size_of::() < size_of::() { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "app-container token field is truncated", + )); + } + let is_app_container = unsafe { app_container.as_ptr().cast::().read_unaligned() != 0 }; + + Ok(ProcessIdentity { + account_sid, + integrity_rid, + is_app_container, + }) +} + +pub fn identities_match(current: &ProcessIdentity, peer: &ProcessIdentity) -> bool { + !current.is_app_container + && !peer.is_app_container + && current.integrity_rid == peer.integrity_rid + && current.account_sid.equals(&peer.account_sid) +} + +fn query_token_information(token: HANDLE, class: i32) -> io::Result> { + let mut needed = 0u32; + unsafe { + GetTokenInformation(token, class, null_mut(), 0, &mut needed); + } + if needed == 0 || needed > 64 * 1024 { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "token field length is invalid", + )); + } + let mut buffer = vec![0usize; (needed as usize).div_ceil(size_of::())]; + if unsafe { + GetTokenInformation( + token, + class, + buffer.as_mut_ptr().cast(), + needed, + &mut needed, + ) + } == 0 + { + return Err(io::Error::last_os_error()); + } + Ok(buffer) +} + +pub fn random_bytes(bytes: &mut [u8]) -> io::Result<()> { + let length = u32::try_from(bytes.len()) + .map_err(|_| io::Error::new(io::ErrorKind::InvalidInput, "random request is too large"))?; + let status = unsafe { + BCryptGenRandom( + null_mut(), + bytes.as_mut_ptr(), + length, + BCRYPT_USE_SYSTEM_PREFERRED_RNG, + ) + }; + if status < 0 { + Err(io::Error::other(format!( + "system random generator failed ({status:#x})" + ))) + } else { + Ok(()) + } +} + +pub fn constant_time_eq_43(left: &[u8], right: &[u8]) -> bool { + if left.len() != 43 || right.len() != 43 { + return false; + } + let mut difference = 0u8; + for index in 0..43 { + difference |= left[index] ^ right[index]; + } + difference == 0 +} + +pub struct PrivateSecurityDescriptor { + descriptor: Vec, + _acl: Vec, +} + +impl PrivateSecurityDescriptor { + pub fn new(account_sid: &Sid, inheritable: bool) -> io::Result { + let ace_bytes = size_of::() - size_of::() + account_sid.length(); + let acl_bytes = size_of::() + ace_bytes; + let mut acl = vec![0usize; acl_bytes.div_ceil(size_of::())]; + let acl_pointer = acl.as_mut_ptr().cast::(); + if unsafe { InitializeAcl(acl_pointer, acl_bytes as u32, ACL_REVISION) } == 0 { + return Err(io::Error::last_os_error()); + } + let flags = if inheritable { + OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE + } else { + 0 + }; + if unsafe { + AddAccessAllowedAceEx( + acl_pointer, + ACL_REVISION, + flags, + GENERIC_ALL, + account_sid.raw(), + ) + } == 0 + { + return Err(io::Error::last_os_error()); + } + + let descriptor_bytes = 64usize; + let mut descriptor = vec![0usize; descriptor_bytes.div_ceil(size_of::())]; + let descriptor_pointer = descriptor.as_mut_ptr().cast::(); + if unsafe { InitializeSecurityDescriptor(descriptor_pointer, SECURITY_DESCRIPTOR_REVISION) } + == 0 + { + return Err(io::Error::last_os_error()); + } + if unsafe { SetSecurityDescriptorDacl(descriptor_pointer, 1, acl_pointer, 0) } == 0 { + return Err(io::Error::last_os_error()); + } + if unsafe { + SetSecurityDescriptorControl(descriptor_pointer, SE_DACL_PROTECTED, SE_DACL_PROTECTED) + } == 0 + { + return Err(io::Error::last_os_error()); + } + Ok(Self { + descriptor, + _acl: acl, + }) + } + + pub fn attributes(&self) -> SECURITY_ATTRIBUTES { + SECURITY_ATTRIBUTES { + nLength: size_of::() as u32, + lpSecurityDescriptor: self.descriptor.as_ptr() as *mut c_void, + bInheritHandle: 0, + } + } + + pub fn apply_to_handle(&self, handle: HANDLE) -> io::Result<()> { + if unsafe { + SetKernelObjectSecurity( + handle, + DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION, + self.descriptor.as_ptr() as PSECURITY_DESCRIPTOR, + ) + } == 0 + { + Err(io::Error::last_os_error()) + } else { + Ok(()) + } + } +} + +pub fn verify_private_handle(handle: HANDLE, account_sid: &Sid) -> io::Result<()> { + let descriptor = object_security_descriptor(handle)?; + let descriptor_pointer = descriptor.as_ptr() as PSECURITY_DESCRIPTOR; + + let mut control = 0u16; + let mut revision = 0u32; + if unsafe { GetSecurityDescriptorControl(descriptor_pointer, &mut control, &mut revision) } == 0 + { + return Err(io::Error::last_os_error()); + } + if control & SE_DACL_PROTECTED == 0 { + return Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "directory DACL is inherited", + )); + } + + let mut owner = null_mut(); + let mut owner_defaulted = 0; + if unsafe { GetSecurityDescriptorOwner(descriptor_pointer, &mut owner, &mut owner_defaulted) } + == 0 + { + return Err(io::Error::last_os_error()); + } + if !account_sid.equals_raw(owner) { + return Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "directory owner is unsafe", + )); + } + + let mut present = 0; + let mut defaulted = 0; + let mut acl = null_mut(); + if unsafe { + GetSecurityDescriptorDacl(descriptor_pointer, &mut present, &mut acl, &mut defaulted) + } == 0 + { + return Err(io::Error::last_os_error()); + } + if present == 0 || acl.is_null() { + return Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "directory DACL is missing", + )); + } + let information = acl_information(acl)?; + if information.AceCount != 1 { + return Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "directory DACL is not private", + )); + } + let DaclAce::Allow { mask, sid, .. } = parse_dacl_ace(acl, 0)? else { + return Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "directory DACL allowlist is unsafe", + )); + }; + const FILE_ALL_ACCESS_MASK: u32 = 0x001f_01ff; + if (mask & GENERIC_ALL == 0 && mask & FILE_ALL_ACCESS_MASK != FILE_ALL_ACCESS_MASK) + || !account_sid.equals_raw(sid) + { + return Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "directory DACL allowlist is unsafe", + )); + } + Ok(()) +} + +pub fn audit_parent_handle( + handle: HANDLE, + current_sid: &Sid, + protects_runtime_contents: bool, +) -> io::Result<()> { + let descriptor = object_security_descriptor(handle)?; + let descriptor_pointer = descriptor.as_ptr() as PSECURITY_DESCRIPTOR; + let mut owner = null_mut(); + let mut owner_defaulted = 0; + if unsafe { GetSecurityDescriptorOwner(descriptor_pointer, &mut owner, &mut owner_defaulted) } + == 0 + { + return Err(io::Error::last_os_error()); + } + + let system = well_known_sid(22)?; + let administrators = well_known_sid(26)?; + let creator_owner = well_known_sid(3)?; + let trusted_installer = trusted_installer_sid()?; + if owner.is_null() + || !(current_sid.equals_raw(owner) + || system.equals_raw(owner) + || administrators.equals_raw(owner) + || trusted_installer.equals_raw(owner)) + { + return Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "parent directory owner is unsafe", + )); + } + let mut present = 0; + let mut defaulted = 0; + let mut acl = null_mut(); + if unsafe { + GetSecurityDescriptorDacl(descriptor_pointer, &mut present, &mut acl, &mut defaulted) + } == 0 + { + return Err(io::Error::last_os_error()); + } + if present == 0 || acl.is_null() { + return Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "parent DACL is missing", + )); + } + let information = acl_information(acl)?; + const REPLACEMENT_RIGHTS: u32 = + 0x0000_0040 | 0x0001_0000 | 0x0004_0000 | 0x0008_0000 | 0x1000_0000; + const CONTENT_WRITE_RIGHTS: u32 = 0x0000_0002 | 0x0000_0004 | 0x4000_0000; + let dangerous = REPLACEMENT_RIGHTS + | if protects_runtime_contents { + CONTENT_WRITE_RIGHTS + } else { + 0 + }; + for index in 0..information.AceCount { + let DaclAce::Allow { flags, mask, sid } = parse_dacl_ace(acl, index)? else { + continue; + }; + if flags & INHERIT_ONLY_ACE as u8 != 0 || mask & dangerous == 0 { + continue; + } + let allowed = current_sid.equals_raw(sid) + || system.equals_raw(sid) + || administrators.equals_raw(sid) + || (creator_owner.equals_raw(sid) && current_sid.equals_raw(owner)); + if !allowed { + return Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "parent grants replacement rights to another principal", + )); + } + } + Ok(()) +} + +fn object_security_descriptor(handle: HANDLE) -> io::Result> { + let requested = DACL_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION; + let mut needed = 0u32; + unsafe { + GetKernelObjectSecurity(handle, requested, null_mut(), 0, &mut needed); + } + if needed == 0 || needed > 64 * 1024 { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "security descriptor length is invalid", + )); + } + let mut descriptor = vec![0usize; (needed as usize).div_ceil(size_of::())]; + if unsafe { + GetKernelObjectSecurity( + handle, + requested, + descriptor.as_mut_ptr().cast(), + needed, + &mut needed, + ) + } == 0 + { + return Err(io::Error::last_os_error()); + } + Ok(descriptor) +} + +fn acl_information(acl: *mut ACL) -> io::Result { + let mut information: ACL_SIZE_INFORMATION = unsafe { zeroed() }; + if unsafe { + GetAclInformation( + acl, + (&mut information as *mut ACL_SIZE_INFORMATION).cast(), + size_of::() as u32, + 2, + ) + } == 0 + { + Err(io::Error::last_os_error()) + } else { + Ok(information) + } +} + +enum DaclAce { + Allow { flags: u8, mask: u32, sid: PSID }, + Deny, +} + +fn parse_dacl_ace(acl: *mut ACL, index: u32) -> io::Result { + let information = acl_information(acl)?; + let mut raw_ace = null_mut(); + if unsafe { GetAce(acl, index, &mut raw_ace) } == 0 || raw_ace.is_null() { + return Err(io::Error::last_os_error()); + } + let acl_start = acl as usize; + let acl_end = acl_start + .checked_add(information.AclBytesInUse as usize) + .ok_or_else(|| io::Error::new(io::ErrorKind::InvalidData, "ACL length overflow"))?; + let ace_start = raw_ace as usize; + if ace_start < acl_start || ace_start.checked_add(4).is_none_or(|end| end > acl_end) { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "ACE header is outside its ACL", + )); + } + let bytes = unsafe { std::slice::from_raw_parts(raw_ace.cast::(), acl_end - ace_start) }; + let kind = bytes[0]; + let flags = bytes[1]; + let ace_size = u16::from_le_bytes([bytes[2], bytes[3]]) as usize; + if ace_size < 4 || ace_size > bytes.len() { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "ACE size is invalid", + )); + } + if kind == ACCESS_DENIED_ACE_TYPE { + return Ok(DaclAce::Deny); + } + if kind != ACCESS_ALLOWED_ACE_TYPE { + return Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "unsupported ACE type in directory DACL", + )); + } + if ace_size < 16 { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "allow ACE is truncated", + )); + } + let mask = u32::from_le_bytes(bytes[4..8].try_into().expect("checked allow ACE mask")); + let sid_bytes = &bytes[8..ace_size]; + let subauthority_count = sid_bytes[1] as usize; + let sid_length = + 8usize + .checked_add(subauthority_count.checked_mul(4).ok_or_else(|| { + io::Error::new(io::ErrorKind::InvalidData, "ACE SID length overflow") + })?) + .ok_or_else(|| io::Error::new(io::ErrorKind::InvalidData, "ACE SID length overflow"))?; + if sid_bytes[0] != 1 || sid_length > sid_bytes.len() { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "allow ACE SID is invalid", + )); + } + let sid = sid_bytes.as_ptr().cast_mut().cast(); + if unsafe { IsValidSid(sid) } == 0 || unsafe { GetLengthSid(sid) } as usize != sid_length { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "allow ACE SID is invalid", + )); + } + Ok(DaclAce::Allow { flags, mask, sid }) +} + +fn trusted_installer_sid() -> io::Result { + Sid::from_subauthorities( + [0, 0, 0, 0, 0, 5], + &[ + 80, 956008885, 3418522649, 1831038044, 1853292631, 2271478464, + ], + ) +} + +fn well_known_sid(kind: WELL_KNOWN_SID_TYPE) -> io::Result { + let mut needed = 0u32; + unsafe { + CreateWellKnownSid(kind, null_mut(), null_mut(), &mut needed); + } + if needed == 0 || needed > 68 { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "well-known SID length is invalid", + )); + } + let mut storage = vec![0usize; (needed as usize).div_ceil(size_of::())]; + if unsafe { CreateWellKnownSid(kind, null_mut(), storage.as_mut_ptr().cast(), &mut needed) } + == 0 + { + return Err(io::Error::last_os_error()); + } + Ok(Sid { + storage: Arc::new(storage), + length: needed as usize, + }) +} + +pub fn wide(value: &str) -> io::Result> { + if value.encode_utf16().any(|unit| unit == 0) { + return Err(io::Error::new( + io::ErrorKind::InvalidInput, + "string contains NUL", + )); + } + Ok(value.encode_utf16().chain(std::iter::once(0)).collect()) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn token_comparison_requires_exact_fixed_length_and_checks_all_bytes() { + let token = b"abcdefghijklmnopqrstuvwxyzABCDEFGH012345678"; + assert_eq!(token.len(), 43); + assert!(constant_time_eq_43(token, token)); + let mut first_changed = *token; + first_changed[0] ^= 1; + assert!(!constant_time_eq_43(token, &first_changed)); + let mut last_changed = *token; + last_changed[42] ^= 1; + assert!(!constant_time_eq_43(token, &last_changed)); + assert!(!constant_time_eq_43(token, &token[..42])); + } + + #[test] + fn random_generator_fills_requested_bytes() { + let mut bytes = [0u8; 32]; + random_bytes(&mut bytes).unwrap(); + assert_ne!(bytes, [0u8; 32]); + } +} diff --git a/packages/core/scripts/build-native.mjs b/packages/core/scripts/build-native.mjs index 17504e3..f9e152b 100644 --- a/packages/core/scripts/build-native.mjs +++ b/packages/core/scripts/build-native.mjs @@ -1,10 +1,9 @@ import { spawn } from 'node:child_process' -import { createHash } from 'node:crypto' import fs from 'node:fs/promises' import path from 'node:path' import { fileURLToPath } from 'node:url' -import { nativeSourceSha256 } from './native-artifacts.mjs' +import { WINDOWS_NATIVE_ARTIFACTS, writeWindowsNativeManifest } from './native-artifacts.mjs' const coreDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..') @@ -19,35 +18,45 @@ function run(command, args) { }) } +function requestedArtifacts() { + const optionIndex = process.argv.indexOf('--artifact') + if (optionIndex < 0) return Object.keys(WINDOWS_NATIVE_ARTIFACTS) + const value = process.argv[optionIndex + 1] + if (value === 'all') return Object.keys(WINDOWS_NATIVE_ARTIFACTS) + if (!value || !WINDOWS_NATIVE_ARTIFACTS[value]) { + throw new Error(`Unknown Windows native artifact ${value ?? '(missing)'}`) + } + return [value] +} + +async function ensureCompleteDistNativeRoot(destinationRoot) { + const prebuiltRoot = path.join(coreDir, 'native', 'prebuilt', 'windows') + try { + await fs.access(path.join(destinationRoot, 'manifest.json')) + } catch { + await fs.mkdir(path.dirname(destinationRoot), { recursive: true }) + await fs.cp(prebuiltRoot, destinationRoot, { recursive: true }) + } +} + async function main() { if (process.platform !== 'win32') return if (process.arch !== 'x64' && process.arch !== 'arm64') { - throw new Error(`Windows shell supervisor does not support architecture ${process.arch}`) + throw new Error(`Windows native helpers do not support architecture ${process.arch}`) } - const nativeDir = path.join(coreDir, 'native', 'windows-job-supervisor') - await run('cargo', ['build', '--release', '--locked', '--manifest-path', path.join(nativeDir, 'Cargo.toml')]) - - const source = path.join(nativeDir, 'target', 'release', 'xc-shell-supervisor.exe') - const destinationDir = path.join(coreDir, 'dist', 'native', 'windows', process.arch) - const destination = path.join(destinationDir, 'xc-shell-supervisor.exe') - await fs.mkdir(destinationDir, { recursive: true }) - await fs.copyFile(source, destination) - const bytes = await fs.readFile(destination) - const sha256 = createHash('sha256').update(bytes).digest('hex') - - const manifestPath = path.join(coreDir, 'dist', 'native', 'windows', 'manifest.json') - let manifest = { protocolVersion: 2, artifacts: {} } - try { - manifest = JSON.parse(await fs.readFile(manifestPath, 'utf8')) - } catch {} - manifest.protocolVersion = 2 - manifest.sourceSha256 = await nativeSourceSha256(coreDir) - manifest.artifacts[process.arch] = { - file: `${process.arch}/xc-shell-supervisor.exe`, - sha256, + const destinationRoot = path.join(coreDir, 'dist', 'native', 'windows') + await ensureCompleteDistNativeRoot(destinationRoot) + for (const artifactName of requestedArtifacts()) { + const definition = WINDOWS_NATIVE_ARTIFACTS[artifactName] + const nativeDir = path.join(coreDir, 'native', definition.sourceDirectory) + await run('cargo', ['build', '--release', '--locked', '--manifest-path', path.join(nativeDir, 'Cargo.toml')]) + const source = path.join(nativeDir, 'target', 'release', definition.file) + const destinationDir = path.join(destinationRoot, process.arch) + await fs.mkdir(destinationDir, { recursive: true }) + await fs.copyFile(source, path.join(destinationDir, definition.file)) } - await fs.writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`, 'utf8') + await writeWindowsNativeManifest(coreDir, destinationRoot) } await main() diff --git a/packages/core/scripts/copy-native.mjs b/packages/core/scripts/copy-native.mjs index 2584a35..1d1afff 100644 --- a/packages/core/scripts/copy-native.mjs +++ b/packages/core/scripts/copy-native.mjs @@ -21,8 +21,25 @@ try { // A missing, stale, or partial destination is replaced below. } +async function copyIfChanged(relativeFile) { + const sourcePath = path.join(sourceDir, relativeFile) + const destinationPath = path.join(destinationDir, relativeFile) + const sourceBytes = await fs.readFile(sourcePath) + const destinationBytes = await fs.readFile(destinationPath).catch(() => null) + if (destinationBytes?.equals(sourceBytes)) return + await fs.mkdir(path.dirname(destinationPath), { recursive: true }) + const temporaryPath = `${destinationPath}.${process.pid}.tmp` + await fs.writeFile(temporaryPath, sourceBytes) + await fs.rename(temporaryPath, destinationPath) +} + if (!destinationIsCurrent) { - await fs.rm(destinationDir, { recursive: true, force: true }) - await fs.mkdir(path.dirname(destinationDir), { recursive: true }) - await fs.cp(sourceDir, destinationDir, { recursive: true }) + await fs.mkdir(destinationDir, { recursive: true }) + for (const architecture of Object.values(sourceManifest.artifacts)) { + for (const artifact of Object.values(architecture)) await copyIfChanged(artifact.file) + } + const manifestPath = path.join(destinationDir, 'manifest.json') + const temporaryManifestPath = `${manifestPath}.${process.pid}.tmp` + await fs.writeFile(temporaryManifestPath, `${JSON.stringify(sourceManifest, null, 2)}\n`, 'utf8') + await fs.rename(temporaryManifestPath, manifestPath) } diff --git a/packages/core/scripts/native-artifacts.mjs b/packages/core/scripts/native-artifacts.mjs index 8fbbcc8..fa7b0ac 100644 --- a/packages/core/scripts/native-artifacts.mjs +++ b/packages/core/scripts/native-artifacts.mjs @@ -3,26 +3,40 @@ import fs from 'node:fs/promises' import path from 'node:path' export const WINDOWS_NATIVE_ARCHES = ['x64', 'arm64'] -export const WINDOWS_NATIVE_PROTOCOL_VERSION = 2 -export const WINDOWS_SUPERVISOR_FILE = 'xc-shell-supervisor.exe' +export const WINDOWS_NATIVE_MANIFEST_VERSION = 2 +export const WINDOWS_SUPERVISOR_PROTOCOL_VERSION = 2 +export const WINDOWS_PEER_BROKER_PROTOCOL_VERSION = 1 + +export const WINDOWS_NATIVE_ARTIFACTS = { + shellSupervisor: { + file: 'xc-shell-supervisor.exe', + protocolVersion: WINDOWS_SUPERVISOR_PROTOCOL_VERSION, + sourceDirectory: 'windows-job-supervisor', + }, + peerBroker: { + file: 'xc-peer-broker.exe', + protocolVersion: WINDOWS_PEER_BROKER_PROTOCOL_VERSION, + sourceDirectory: 'windows-peer-broker', + }, +} const WINDOWS_PE_MACHINES = { x64: 0x8664, arm64: 0xaa64, } -function verifyPeArchitecture(bytes, arch) { +export function verifyPeArchitecture(bytes, arch, artifactName = 'helper') { if (bytes.length < 0x40 || bytes.readUInt16LE(0) !== 0x5a4d) { - throw new Error(`Windows prebuilt helper is not a PE executable for ${arch}`) + throw new Error(`Windows prebuilt ${artifactName} is not a PE executable for ${arch}`) } const peOffset = bytes.readUInt32LE(0x3c) if (peOffset + 6 > bytes.length || bytes.readUInt32LE(peOffset) !== 0x00004550) { - throw new Error(`Windows prebuilt helper has an invalid PE header for ${arch}`) + throw new Error(`Windows prebuilt ${artifactName} has an invalid PE header for ${arch}`) } const actualMachine = bytes.readUInt16LE(peOffset + 4) if (actualMachine !== WINDOWS_PE_MACHINES[arch]) { throw new Error( - `Windows prebuilt helper architecture mismatch for ${arch}: received PE machine 0x${actualMachine.toString(16)}`, + `Windows prebuilt ${artifactName} architecture mismatch for ${arch}: received PE machine 0x${actualMachine.toString(16)}`, ) } } @@ -39,8 +53,10 @@ async function sourceFiles(root, relative = '') { return files } -export async function nativeSourceSha256(coreDir) { - const sourceDir = path.join(coreDir, 'native', 'windows-job-supervisor') +export async function nativeSourceSha256(coreDir, artifactName = 'shellSupervisor') { + const definition = WINDOWS_NATIVE_ARTIFACTS[artifactName] + if (!definition) throw new Error(`Unknown Windows native artifact: ${artifactName}`) + const sourceDir = path.join(coreDir, 'native', definition.sourceDirectory) const relativeFiles = (await sourceFiles(sourceDir)) .filter((file) => file === 'Cargo.toml' || file === 'Cargo.lock' || file.endsWith('.rs')) .sort((left, right) => left.localeCompare(right, 'en')) @@ -55,54 +71,82 @@ export async function nativeSourceSha256(coreDir) { return hash.digest('hex') } +async function artifactSourceHashes(coreDir) { + return Object.fromEntries( + await Promise.all( + Object.keys(WINDOWS_NATIVE_ARTIFACTS).map(async (artifactName) => [ + artifactName, + await nativeSourceSha256(coreDir, artifactName), + ]), + ), + ) +} + export async function writeWindowsNativeManifest(coreDir, windowsDir) { + const sourceHashes = await artifactSourceHashes(coreDir) const artifacts = {} for (const arch of WINDOWS_NATIVE_ARCHES) { - const file = `${arch}/${WINDOWS_SUPERVISOR_FILE}` - const bytes = await fs.readFile(path.join(windowsDir, file)) - verifyPeArchitecture(bytes, arch) - artifacts[arch] = { - file, - sha256: createHash('sha256').update(bytes).digest('hex'), + artifacts[arch] = {} + for (const [artifactName, definition] of Object.entries(WINDOWS_NATIVE_ARTIFACTS)) { + const file = `${arch}/${definition.file}` + const bytes = await fs.readFile(path.join(windowsDir, file)) + verifyPeArchitecture(bytes, arch, artifactName) + artifacts[arch][artifactName] = { + file, + protocolVersion: definition.protocolVersion, + sha256: createHash('sha256').update(bytes).digest('hex'), + sourceSha256: sourceHashes[artifactName], + } } } const manifest = { - protocolVersion: WINDOWS_NATIVE_PROTOCOL_VERSION, - sourceSha256: await nativeSourceSha256(coreDir), + manifestVersion: WINDOWS_NATIVE_MANIFEST_VERSION, artifacts, } await fs.mkdir(windowsDir, { recursive: true }) - await fs.writeFile(path.join(windowsDir, 'manifest.json'), `${JSON.stringify(manifest, null, 2)}\n`, 'utf8') + const manifestPath = path.join(windowsDir, 'manifest.json') + const temporaryPath = `${manifestPath}.${process.pid}.tmp` + await fs.writeFile(temporaryPath, `${JSON.stringify(manifest, null, 2)}\n`, 'utf8') + await fs.rename(temporaryPath, manifestPath) return manifest } export async function verifyWindowsNativeArtifacts(coreDir, windowsDir) { const manifestPath = path.join(windowsDir, 'manifest.json') const manifest = JSON.parse(await fs.readFile(manifestPath, 'utf8')) - if (manifest.protocolVersion !== WINDOWS_NATIVE_PROTOCOL_VERSION) { + if (manifest.manifestVersion !== WINDOWS_NATIVE_MANIFEST_VERSION) { throw new Error( - `Windows native protocol mismatch: expected ${WINDOWS_NATIVE_PROTOCOL_VERSION}, received ${String(manifest.protocolVersion)}`, + `Windows native manifest mismatch: expected ${WINDOWS_NATIVE_MANIFEST_VERSION}, received ${String(manifest.manifestVersion)}`, ) } - const currentSourceHash = await nativeSourceSha256(coreDir) - if (manifest.sourceSha256 !== currentSourceHash) { - throw new Error('Windows prebuilt helper is stale; a maintainer must rebuild both architectures') - } + const sourceHashes = await artifactSourceHashes(coreDir) for (const arch of WINDOWS_NATIVE_ARCHES) { - const artifact = manifest.artifacts?.[arch] - const expectedFile = `${arch}/${WINDOWS_SUPERVISOR_FILE}` - if (artifact?.file !== expectedFile || !/^[a-f0-9]{64}$/.test(artifact.sha256 ?? '')) { - throw new Error(`Windows prebuilt manifest has an invalid ${arch} artifact`) - } - const filePath = path.resolve(windowsDir, artifact.file) - const relative = path.relative(windowsDir, filePath) - if (relative.startsWith('..') || path.isAbsolute(relative)) { - throw new Error(`Windows prebuilt manifest ${arch} artifact escapes its directory`) + for (const [artifactName, definition] of Object.entries(WINDOWS_NATIVE_ARTIFACTS)) { + const artifact = manifest.artifacts?.[arch]?.[artifactName] + const expectedFile = `${arch}/${definition.file}` + if ( + artifact?.file !== expectedFile || + artifact.protocolVersion !== definition.protocolVersion || + !/^[a-f0-9]{64}$/.test(artifact.sha256 ?? '') || + !/^[a-f0-9]{64}$/.test(artifact.sourceSha256 ?? '') + ) { + throw new Error(`Windows prebuilt manifest has an invalid ${arch} ${artifactName} artifact`) + } + if (artifact.sourceSha256 !== sourceHashes[artifactName]) { + throw new Error(`Windows prebuilt ${artifactName} is stale; a maintainer must rebuild both architectures`) + } + const filePath = path.resolve(windowsDir, artifact.file) + const relative = path.relative(windowsDir, filePath) + if (relative.startsWith('..') || path.isAbsolute(relative)) { + throw new Error(`Windows prebuilt manifest ${arch} ${artifactName} artifact escapes its directory`) + } + const bytes = await fs.readFile(filePath) + verifyPeArchitecture(bytes, arch, artifactName) + const actualHash = createHash('sha256').update(bytes).digest('hex') + if (actualHash !== artifact.sha256) { + throw new Error(`Windows prebuilt ${artifactName} hash mismatch for ${arch}`) + } } - const bytes = await fs.readFile(filePath) - verifyPeArchitecture(bytes, arch) - const actualHash = createHash('sha256').update(bytes).digest('hex') - if (actualHash !== artifact.sha256) throw new Error(`Windows prebuilt helper hash mismatch for ${arch}`) } return manifest } diff --git a/packages/core/src/peers/index.ts b/packages/core/src/peers/index.ts index 65e8bda..dbd5c57 100644 --- a/packages/core/src/peers/index.ts +++ b/packages/core/src/peers/index.ts @@ -7,7 +7,7 @@ export { peerSocketPath, } from './paths.js' export { createPeerRegistry } from './registry.js' -export type { PeerRegistry } from './registry.js' +export type { PeerRegistry, PeerRegistryOptions } from './registry.js' export { decideInboundDisposition } from './inbound-policy.js' export type { InboundPolicyInput } from './inbound-policy.js' export { createPeerRateLimiter } from './rate-limit.js' @@ -23,8 +23,19 @@ export type { export { listAgentsTool, sendMessageTool } from './tools.js' export { MAX_FRAME_BYTES, MAX_MESSAGE_BYTES, NdjsonFrameDecoder, encodePeerFrame, parsePeerFrame } from './protocol.js' export type { PeerFrameV1 } from './protocol.js' +export { createPlatformPeerTransport } from './platform-transport.js' +export type { PlatformPeerTransportOptions } from './platform-transport.js' export { createUnixSocketTransport } from './unix-socket-transport.js' +export type { UnixSocketTransportOptions } from './unix-socket-transport.js' +export { createWindowsNamedPipeTransport } from './windows-named-pipe-transport.js' +export type { WindowsNamedPipeTransportOptions } from './windows-named-pipe-transport.js' export type { PeerTransport, PeerTransportServer } from './transport.js' export { stripTerminalControls } from './terminal-sanitize.js' export { MAX_REGISTRATION_BYTES, MAX_REGISTRATION_CANDIDATES, PEER_PROTOCOL_VERSION } from './types.js' -export type { CandidateScanResult, PeerIdentity, PeerRegistrationV1, RegistrationCandidate } from './types.js' +export type { + CandidateScanResult, + PeerIdentity, + PeerRegistrationV1, + PeerTransportDescriptor, + RegistrationCandidate, +} from './types.js' diff --git a/packages/core/src/peers/platform-transport.ts b/packages/core/src/peers/platform-transport.ts new file mode 100644 index 0000000..2108f7e --- /dev/null +++ b/packages/core/src/peers/platform-transport.ts @@ -0,0 +1,38 @@ +import type { PeerTransport } from './transport.js' +import { createUnixSocketTransport } from './unix-socket-transport.js' +import { createWindowsNamedPipeTransport } from './windows-named-pipe-transport.js' + +export interface PlatformPeerTransportOptions { + getRuntimePaths: () => { socketDir: string; namespaceId?: string } + platform?: NodeJS.Platform +} + +function createUnsupportedTransport(): PeerTransport { + const unsupported = (): never => { + throw Object.assign(new Error('Peer messaging is not supported on this platform.'), { + name: 'PEER_UNSUPPORTED_PLATFORM', + }) + } + return { + kind: 'unix', + createAddressHint: unsupported, + validateAddress: () => false, + listen: async () => unsupported(), + request: async () => unsupported(), + } +} + +export function createPlatformPeerTransport(options: PlatformPeerTransportOptions): PeerTransport { + const platform = options.platform ?? process.platform + if (platform === 'darwin' || platform === 'linux') { + return createUnixSocketTransport({ + getSocketDir: () => options.getRuntimePaths().socketDir, + }) + } + if (platform === 'win32') { + return createWindowsNamedPipeTransport({ + getRuntimePaths: options.getRuntimePaths, + }) + } + return createUnsupportedTransport() +} diff --git a/packages/core/src/peers/registry.ts b/packages/core/src/peers/registry.ts index 27c3763..9254c81 100644 --- a/packages/core/src/peers/registry.ts +++ b/packages/core/src/peers/registry.ts @@ -15,6 +15,10 @@ import { type PeerRegistrationV1, type RegistrationCandidate, } from './types.js' +import { + type WindowsPeerRuntimeSecurityProvider, + createWindowsPeerRuntimeSecurity, +} from './windows-peer-runtime-security.js' function exactKeys(record: Record, allowed: readonly string[]): boolean { const allowedSet = new Set(allowed) @@ -25,7 +29,15 @@ function validIsoDate(value: unknown): value is string { return typeof value === 'string' && value.length <= 64 && Number.isFinite(Date.parse(value)) } -function parseRegistration(value: unknown, socketDir: string): PeerRegistrationV1 | null { +export function isValidWindowsPeerPipeAddress(address: string, namespaceId?: string): boolean { + const match = /^\\\\\.\\pipe\\x-code-peer-v1-([a-f0-9]{12})-([A-Za-z0-9_-]{32})$/.exec(address) + return Boolean(match && (!namespaceId || match[1] === namespaceId)) +} + +export function parseRegistration( + value: unknown, + runtime: { socketDir: string; namespaceId?: string }, +): PeerRegistrationV1 | null { if (!value || typeof value !== 'object' || Array.isArray(value)) return null const source = value as Record if ( @@ -82,14 +94,18 @@ function parseRegistration(value: unknown, socketDir: string): PeerRegistrationV } if (!record.transport || typeof record.transport !== 'object' || Array.isArray(record.transport)) return null const transport = record.transport as Record - if ( - !exactKeys(transport, ['kind', 'address']) || - transport.kind !== 'unix' || - typeof transport.address !== 'string' || - !isSocketPathInNamespace(transport.address, socketDir) || - (path.basename(transport.address) !== `${record.instanceId.slice(0, 8)}.sock` && - !/^p-[A-Za-z0-9_-]{16}\.sock$/.test(path.basename(transport.address))) - ) { + if (!exactKeys(transport, ['kind', 'address']) || typeof transport.address !== 'string') return null + if (transport.kind === 'unix') { + if ( + !isSocketPathInNamespace(transport.address, runtime.socketDir) || + (path.basename(transport.address) !== `${record.instanceId.slice(0, 8)}.sock` && + !/^p-[A-Za-z0-9_-]{16}\.sock$/.test(path.basename(transport.address))) + ) { + return null + } + } else if (transport.kind === 'windows-pipe') { + if (!isValidWindowsPeerPipeAddress(transport.address, runtime.namespaceId)) return null + } else { return null } return structuredClone(record) as unknown as PeerRegistrationV1 @@ -108,7 +124,7 @@ async function validateOpenRegistration(handle: fs.FileHandle): Promise<{ size: async function readCandidateFile( registrationPath: string, expectedInstanceId: string, - socketDir: string, + runtime: { socketDir: string; namespaceId?: string }, ): Promise { let handle: fs.FileHandle | undefined try { @@ -118,7 +134,7 @@ async function readCandidateFile( if (!safe) return null const raw = await handle.readFile({ encoding: 'utf8' }) if (Buffer.byteLength(raw, 'utf8') > MAX_REGISTRATION_BYTES) return null - const registration = parseRegistration(JSON.parse(raw), socketDir) + const registration = parseRegistration(JSON.parse(raw), runtime) if (!registration || registration.instanceId !== expectedInstanceId) return null return { registration, registrationPath, mtimeMs: safe.mtimeMs } } catch { @@ -139,15 +155,8 @@ async function pidExists(pid: number): Promise { } } -function sameFileIdentity( - left: { dev: number | bigint; ino: number | bigint }, - right: { dev: number | bigint; ino: number | bigint }, -): boolean { - return left.dev === right.dev && left.ino === right.ino -} - export interface PeerRegistry { - initialize(): Promise + initialize(signal?: AbortSignal): Promise write(registration: PeerRegistrationV1): Promise read(instanceId: string): Promise listCandidates(): Promise @@ -159,18 +168,43 @@ export interface PeerRegistry { deadlineMs?: number }): Promise<{ peers: PublicPeer[]; registrations: RegistrationCandidate[]; partial: boolean }> removeOwn(instanceId: string): Promise - cleanupConfirmedDead(candidate: RegistrationCandidate, graceMs?: number): Promise - paths(): { registryDir: string; socketDir: string } + cleanupConfirmedDead(candidate: RegistrationCandidate, graceMs?: number, transport?: PeerTransport): Promise + paths(): { registryDir: string; socketDir: string; namespaceId?: string } } -export function createPeerRegistry(): PeerRegistry { +export interface PeerRegistryOptions { + platform?: NodeJS.Platform + transportKind?: PeerTransport['kind'] + windowsRuntimeSecurity?: WindowsPeerRuntimeSecurityProvider +} + +export function createPeerRegistry(options: PeerRegistryOptions = {}): PeerRegistry { + const platform = options.platform ?? process.platform + const windowsRuntimeSecurity = + options.windowsRuntimeSecurity ?? (platform === 'win32' ? createWindowsPeerRuntimeSecurity() : undefined) + const transportKind = options.transportKind ?? (platform === 'win32' ? 'windows-pipe' : 'unix') let registryDir = '' let socketDir = '' + let namespaceId: string | undefined + let initializePromise: Promise | undefined - const initialize = async (): Promise => { - const paths = await ensurePeerRuntimeDirectories() - registryDir = paths.registryDir - socketDir = paths.socketDir + const initialize = async (signal?: AbortSignal): Promise => { + if (registryDir && socketDir) return + if (initializePromise) return initializePromise + const operation = (async () => { + const paths = windowsRuntimeSecurity + ? await windowsRuntimeSecurity.initialize(signal) + : await ensurePeerRuntimeDirectories() + registryDir = paths.registryDir + socketDir = paths.socketDir + namespaceId = (paths as { namespaceId?: string }).namespaceId + })() + initializePromise = operation + try { + await operation + } finally { + if (initializePromise === operation) initializePromise = undefined + } } const ensureInitialized = async (): Promise => { @@ -180,7 +214,11 @@ export function createPeerRegistry(): PeerRegistry { const read = async (instanceId: string): Promise => { if (!isUuid(instanceId)) return null await ensureInitialized() - return readCandidateFile(path.join(registryDir, `${instanceId}.json`), instanceId, socketDir) + const candidate = await readCandidateFile(path.join(registryDir, `${instanceId}.json`), instanceId, { + socketDir, + namespaceId, + }) + return candidate?.registration.transport.kind === transportKind ? candidate : null } return { @@ -188,8 +226,8 @@ export function createPeerRegistry(): PeerRegistry { async write(registration) { await ensureInitialized() - const validated = parseRegistration(registration, socketDir) - if (!validated) throw new Error('Invalid peer registration') + const validated = parseRegistration(registration, { socketDir, namespaceId }) + if (!validated || validated.transport.kind !== transportKind) throw new Error('Invalid peer registration') const finalPath = path.join(registryDir, `${validated.instanceId}.json`) const tempPath = path.join(registryDir, `.${validated.instanceId}.${randomUUID()}.tmp`) const bytes = JSON.stringify(validated) + '\n' @@ -235,8 +273,8 @@ export function createPeerRegistry(): PeerRegistry { rejected++ continue } - const candidate = await readCandidateFile(path.join(registryDir, name), instanceId, socketDir) - if (candidate) candidates.push(candidate) + const candidate = await readCandidateFile(path.join(registryDir, name), instanceId, { socketDir, namespaceId }) + if (candidate?.registration.transport.kind === transportKind) candidates.push(candidate) else rejected++ } return { candidates, scanned: selected.length, rejected, truncated: names.length > selected.length } @@ -245,7 +283,10 @@ export function createPeerRegistry(): PeerRegistry { async listLive(options) { const scan = await this.listCandidates() const candidates = scan.candidates.filter( - (candidate) => candidate.registration.instanceId !== options.senderInstanceId, + (candidate) => + candidate.registration.instanceId !== options.senderInstanceId && + candidate.registration.transport.kind === options.transport.kind && + options.transport.validateAddress(candidate.registration.transport.address), ) const registrations: RegistrationCandidate[] = [] const concurrency = Math.min(16, Math.max(8, options.concurrency ?? 12)) @@ -271,7 +312,7 @@ export function createPeerRegistry(): PeerRegistry { if (!candidate) return const livePid = await pidExists(candidate.registration.pid) if (livePid === false) { - await this.cleanupConfirmedDead(candidate).catch(() => false) + await this.cleanupConfirmedDead(candidate, undefined, options.transport).catch(() => false) continue } const requestId = randomUUID() @@ -326,7 +367,7 @@ export function createPeerRegistry(): PeerRegistry { return true }, - async cleanupConfirmedDead(candidate, graceMs = 30_000) { + async cleanupConfirmedDead(candidate, graceMs = 30_000, transport) { await ensureInitialized() const registration = candidate.registration if ((await pidExists(registration.pid)) !== false) return false @@ -341,29 +382,30 @@ export function createPeerRegistry(): PeerRegistry { ) { return false } - const socketPath = registration.transport.address - const socketBefore = isSocketPathInNamespace(socketPath, socketDir) - ? await fs.lstat(socketPath).catch(() => null) - : null + const address = registration.transport.address + const remainingBeforeRemoval = await this.listCandidates() + const shared = remainingBeforeRemoval.candidates.some( + (other) => + other.registration.instanceId !== registration.instanceId && other.registration.transport.address === address, + ) await fs.unlink(current.registrationPath).catch((error: NodeJS.ErrnoException) => { if (error.code !== 'ENOENT') throw error }) - if (socketBefore?.isSocket() && !socketBefore.isSymbolicLink()) { - const remaining = await this.listCandidates() - const shared = remaining.candidates.some((other) => other.registration.transport.address === socketPath) - if (!remaining.truncated && remaining.rejected === 0 && !shared) { - const socketAfter = await fs.lstat(socketPath).catch(() => null) - if (socketAfter?.isSocket() && !socketAfter.isSymbolicLink() && sameFileIdentity(socketBefore, socketAfter)) { - await fs.unlink(socketPath).catch(() => {}) - } - } + if ( + transport?.kind === registration.transport.kind && + transport.cleanupConfirmedDeadEndpoint && + !remainingBeforeRemoval.truncated && + remainingBeforeRemoval.rejected === 0 && + !shared + ) { + await transport.cleanupConfirmedDeadEndpoint(address) } return true }, paths() { if (!registryDir || !socketDir) throw new Error('Peer registry has not been initialized') - return { registryDir, socketDir } + return { registryDir, socketDir, ...(namespaceId ? { namespaceId } : {}) } }, } } diff --git a/packages/core/src/peers/service.ts b/packages/core/src/peers/service.ts index f95bfb6..ed8d1f6 100644 --- a/packages/core/src/peers/service.ts +++ b/packages/core/src/peers/service.ts @@ -1,5 +1,4 @@ import { randomUUID } from 'node:crypto' -import fs from 'node:fs/promises' import { type PeerMessagingConfig, resolvePeerMessagingConfig } from '../config/index.js' import { sha256Text } from '../permissions/authority.js' @@ -20,6 +19,7 @@ import type { } from './inbox-types.js' import { createPeerInbox } from './inbox.js' import { peerSocketPath } from './paths.js' +import { createPlatformPeerTransport } from './platform-transport.js' import { MAX_MESSAGE_BYTES, encodePeerFrame } from './protocol.js' import type { PeerFrameV1 } from './protocol.js' import { type PeerRateLimiter, createPeerRateLimiter } from './rate-limit.js' @@ -27,7 +27,6 @@ import { type PeerRegistry, createPeerRegistry } from './registry.js' import { stripTerminalControls } from './terminal-sanitize.js' import type { PeerTransport, PeerTransportServer } from './transport.js' import type { PeerIdentity, PeerRegistrationV1, RegistrationCandidate } from './types.js' -import { createUnixSocketTransport } from './unix-socket-transport.js' export interface PreparedPeerSend { requestedTarget: string @@ -178,20 +177,21 @@ function sendPayloadHash(message: string, summary?: string): string { return sha256Text(JSON.stringify({ message, ...(summary ? { summary } : {}) })) } -async function lstatIfPresent(filePath: string): Promise> | null> { - try { - return await fs.lstat(filePath) - } catch (error) { - if ((error as NodeJS.ErrnoException).code === 'ENOENT') return null - throw error - } +function peerErrorCode(error: unknown, fallback = 'PEER_IO_ERROR'): string { + if (error instanceof Error && error.name.startsWith('PEER_')) return error.name + const message = errorMessage(error) + return message.startsWith('PEER_') && /^[A-Z0-9_]+$/.test(message) ? message : fallback } export function createPeerService(options: PeerServiceOptions = {}): PeerService { const config: PeerMessagingConfig = resolvePeerMessagingConfig(options.config) const enabled = options.enabled ?? false const registry = options.registry ?? createPeerRegistry() - const transport = options.transport ?? createUnixSocketTransport() + const transport = + options.transport ?? + createPlatformPeerTransport({ + getRuntimePaths: () => registry.paths(), + }) const identity = enabled ? (options.identity ?? createPeerIdentity({ name: options.name, cwd: options.cwd, now: options.now })) : null @@ -236,7 +236,13 @@ export function createPeerService(options: PeerServiceOptions = {}): PeerService if (!identity || senderInstanceId === identity.instanceId) throw serviceError('PEER_SELF', 'Self-send is not allowed') const sender = await registry.read(senderInstanceId) - if (!sender) throw serviceError('PEER_AUTH_FAILED', 'Sender registration is missing or unsafe') + if ( + !sender || + sender.registration.transport.kind !== transport.kind || + !transport.validateAddress(sender.registration.transport.address) + ) { + throw serviceError('PEER_AUTH_FAILED', 'Sender registration is missing or unsafe') + } return sender } @@ -419,7 +425,13 @@ export function createPeerService(options: PeerServiceOptions = {}): PeerService try { const targetInstanceId = update.target.address.slice('peer:'.length) const candidate = await registry.read(targetInstanceId) - if (!candidate) return false + if ( + !candidate || + candidate.registration.transport.kind !== transport.kind || + !transport.validateAddress(candidate.registration.transport.address) + ) { + return false + } const requestId = randomUUID() const request = transport .request({ @@ -496,11 +508,6 @@ export function createPeerService(options: PeerServiceOptions = {}): PeerService await startPromise return } - if (process.platform === 'win32') { - unavailableReason = 'Peer messaging is not supported on Windows in this release.' - unavailableCode = 'PEER_UNSUPPORTED_PLATFORM' - return - } const generation = ++lifecycleGeneration const startIsCurrent = (): boolean => !shuttingDown && !signal?.aborted && lifecycleGeneration === generation const operation = (async (): Promise => { @@ -509,43 +516,26 @@ export function createPeerService(options: PeerServiceOptions = {}): PeerService if (signal?.aborted) throw signal.reason ?? serviceError('AbortError', 'Peer startup aborted') registrationWriteGeneration++ registrationWritesEnabled = true - await registry.initialize() + await registry.initialize(signal) if (!startIsCurrent()) return - const socketPath = peerSocketPath(registry.paths().socketDir, identity.instanceId) - const stale = await lstatIfPresent(socketPath) - if (!startIsCurrent()) return - if (stale) { - if (!stale.isSocket() || stale.isSymbolicLink()) { - throw serviceError('PEER_SOCKET_UNSAFE', 'Peer socket path is occupied by an unsafe file') - } - const scan = await registry.listCandidates() - if (!startIsCurrent()) return - if (scan.truncated) { - throw serviceError('PEER_SOCKET_IN_USE', 'Peer socket ownership scan was truncated') - } - const owners = scan.candidates.filter( - (candidate) => candidate.registration.transport.address === socketPath, - ) - if (owners.length === 0) { - throw serviceError('PEER_SOCKET_IN_USE', 'Peer socket owner cannot be proven dead') - } - for (const owner of owners) { - await registry.cleanupConfirmedDead(owner).catch(() => false) - if (!startIsCurrent()) return - } - if (await lstatIfPresent(socketPath)) { - throw serviceError('PEER_SOCKET_IN_USE', 'Peer socket is owned by another active or unverified session') - } - if (!startIsCurrent()) return + let addressHint: string + try { + addressHint = transport.createAddressHint(identity.instanceId) + } catch (error) { + if (transport.kind !== 'unix' || errorMessage(error) !== 'PEER_RUNTIME_NOT_INITIALIZED') throw error + addressHint = peerSocketPath(registry.paths().socketDir, identity.instanceId) } localServer = await transport.listen({ - address: socketPath, + address: addressHint, instanceId: identity.instanceId, inboxToken: identity.inboxToken, onRequest, signal, }) if (!startIsCurrent()) return + if (!transport.validateAddress(localServer.address)) { + throw serviceError('PEER_TRANSPORT_ADDRESS_INVALID', 'Peer transport returned an invalid address') + } server = localServer const timestamp = now().toISOString() registration = { @@ -555,7 +545,7 @@ export function createPeerService(options: PeerServiceOptions = {}): PeerService ...(options.sessionId ? { sessionId: options.sessionId } : {}), name: identity.name, cwd: options.cwd ?? process.cwd(), - transport: { kind: 'unix', address: localServer.address }, + transport: { kind: transport.kind, address: localServer.address }, inboxToken: identity.inboxToken, permissionClass: options.getPermissionClass?.() ?? options.permissionClass ?? 'prompted', status: 'idle', @@ -573,6 +563,32 @@ export function createPeerService(options: PeerServiceOptions = {}): PeerService }, 15_000) heartbeat.unref() started = true + void localServer.closed.then((result) => { + if (result.expected || shuttingDown || server !== localServer || !started) return + lifecycleGeneration++ + started = false + server = undefined + void localServer?.close({ deadlineMs: 250 }).catch(() => {}) + registrationWritesEnabled = false + registrationWriteGeneration++ + if (heartbeat) clearInterval(heartbeat) + heartbeat = undefined + unavailableCode = + transport.kind === 'windows-pipe' + ? 'PEER_WINDOWS_BROKER_EXITED' + : peerErrorCode(result.reason, 'PEER_IO_ERROR') + unavailableReason = result.reason ?? 'Peer transport exited unexpectedly.' + void (async () => { + await registrationWriteTail.catch(() => {}) + if (identity) { + for (let attempt = 0; attempt < 4; attempt++) { + if (await registry.removeOwn(identity.instanceId).catch(() => false)) break + await new Promise((resolve) => setTimeout(resolve, 25 * (attempt + 1))) + } + } + registration = undefined + })() + }) } catch (error) { if (startIsCurrent()) { registrationWritesEnabled = false @@ -580,7 +596,7 @@ export function createPeerService(options: PeerServiceOptions = {}): PeerService await registrationWriteTail.catch(() => {}) if (identity) await registry.removeOwn(identity.instanceId).catch(() => false) unavailableReason = errorMessage(error) - unavailableCode = 'PEER_IO_ERROR' + unavailableCode = peerErrorCode(error) debugLog('peer.start-failed', unavailableReason) } } finally { @@ -663,7 +679,12 @@ export function createPeerService(options: PeerServiceOptions = {}): PeerService throw serviceError(code, `Message ${messageId} is not eligible for retry`) } candidate = await registry.read(retry.record.receiverInstanceId) - if (!candidate || `peer:${candidate.registration.instanceId}` !== retry.record.receiverAddress) { + if ( + !candidate || + candidate.registration.transport.kind !== transport.kind || + !transport.validateAddress(candidate.registration.transport.address) || + `peer:${candidate.registration.instanceId}` !== retry.record.receiverAddress + ) { throw serviceError('PEER_STALE', 'The originally resolved receiver is no longer registered') } } else { @@ -720,6 +741,8 @@ export function createPeerService(options: PeerServiceOptions = {}): PeerService if ( !current || current.registration.instanceId !== prepared.candidate.registration.instanceId || + current.registration.transport.kind !== transport.kind || + !transport.validateAddress(current.registration.transport.address) || current.registration.transport.address !== prepared.candidate.registration.transport.address || current.registration.inboxToken !== prepared.candidate.registration.inboxToken ) { diff --git a/packages/core/src/peers/transport.ts b/packages/core/src/peers/transport.ts index feb4bd9..9d2583d 100644 --- a/packages/core/src/peers/transport.ts +++ b/packages/core/src/peers/transport.ts @@ -1,11 +1,16 @@ import type { PeerFrameV1 } from './protocol.js' +import type { PeerTransportDescriptor } from './types.js' export interface PeerTransportServer { address: string + closed: Promise<{ expected: boolean; reason?: string }> close(options?: { deadlineMs?: number }): Promise } export interface PeerTransport { + readonly kind: PeerTransportDescriptor['kind'] + createAddressHint(instanceId: string): string + validateAddress(address: string): boolean listen(options: { address: string instanceId: string @@ -21,4 +26,5 @@ export interface PeerTransport { timeoutMs?: number signal?: AbortSignal }): Promise + cleanupConfirmedDeadEndpoint?(address: string): Promise } diff --git a/packages/core/src/peers/types.ts b/packages/core/src/peers/types.ts index dea8aab..93f1413 100644 --- a/packages/core/src/peers/types.ts +++ b/packages/core/src/peers/types.ts @@ -2,6 +2,8 @@ export const PEER_PROTOCOL_VERSION = 1 as const export const MAX_REGISTRATION_BYTES = 64 * 1024 export const MAX_REGISTRATION_CANDIDATES = 256 +export type PeerTransportDescriptor = { kind: 'unix'; address: string } | { kind: 'windows-pipe'; address: string } + export interface PeerRegistrationV1 { version: 1 instanceId: string @@ -9,7 +11,7 @@ export interface PeerRegistrationV1 { sessionId?: string name: string cwd: string - transport: { kind: 'unix'; address: string } + transport: PeerTransportDescriptor inboxToken: string permissionClass: 'prompted' | 'bypass' status: 'idle' | 'busy' | 'waiting' diff --git a/packages/core/src/peers/unix-socket-transport.ts b/packages/core/src/peers/unix-socket-transport.ts index f4ffb92..d3482c9 100644 --- a/packages/core/src/peers/unix-socket-transport.ts +++ b/packages/core/src/peers/unix-socket-transport.ts @@ -39,6 +39,18 @@ interface UnixSocketFileSystem { unlink(filePath: string): Promise } +export interface UnixSocketTransportOptions { + fileSystem?: UnixSocketFileSystem + getSocketDir?: () => string +} + +function validUnixAddress(address: string, socketDir?: string): boolean { + if (!path.isAbsolute(address)) return false + if (socketDir && path.dirname(path.resolve(address)) !== path.resolve(socketDir)) return false + const basename = path.basename(address) + return /^p-[A-Za-z0-9_-]{16}\.sock$/.test(basename) || /^[0-9a-f]{8}\.sock$/i.test(basename) +} + async function lstatIfPresent( fileSystem: UnixSocketFileSystem, filePath: string, @@ -131,10 +143,19 @@ async function probeListener(options: { }) } -export function createUnixSocketTransport(dependencies: { fileSystem?: UnixSocketFileSystem } = {}): PeerTransport { +export function createUnixSocketTransport(dependencies: UnixSocketTransportOptions = {}): PeerTransport { const fileSystem = dependencies.fileSystem ?? fs + const createAddressHint = (instanceId: string): string => { + const socketDir = dependencies.getSocketDir?.() + if (!socketDir) throw new Error('PEER_RUNTIME_NOT_INITIALIZED') + return path.join(socketDir, `${instanceId.slice(0, 8)}.sock`) + } + const validateAddress = (address: string): boolean => validUnixAddress(address, dependencies.getSocketDir?.()) if (process.platform === 'win32') { return { + kind: 'unix', + createAddressHint, + validateAddress, async listen() { throw new Error('PEER_UNSUPPORTED_PLATFORM') }, @@ -145,6 +166,10 @@ export function createUnixSocketTransport(dependencies: { fileSystem?: UnixSocke } return { + kind: 'unix', + createAddressHint, + validateAddress, + async listen(options): Promise { const address = path.join(path.dirname(options.address), `p-${randomBytes(12).toString('base64url')}.sock`) if (Buffer.byteLength(address, 'utf8') > 103) throw new Error('PEER_SOCKET_PATH_TOO_LONG') @@ -152,6 +177,17 @@ export function createUnixSocketTransport(dependencies: { fileSystem?: UnixSocke const sockets = new Set() let ownedSocket: Awaited> | null = null let closePromise: Promise | null = null + let closeExpected = false + let closedSettled = false + let resolveClosed!: (result: { expected: boolean; reason?: string }) => void + const closed = new Promise<{ expected: boolean; reason?: string }>((resolve) => { + resolveClosed = resolve + }) + const settleClosed = (result: { expected: boolean; reason?: string }): void => { + if (closedSettled) return + closedSettled = true + resolveClosed(result) + } const server = net.createServer((socket) => { sockets.add(socket) const decoder = new NdjsonFrameDecoder() @@ -208,8 +244,12 @@ export function createUnixSocketTransport(dependencies: { fileSystem?: UnixSocke socket.once('error', () => {}) }) + server.on('error', (error) => settleClosed({ expected: closeExpected, reason: errorMessage(error) })) + server.once('close', () => settleClosed({ expected: closeExpected })) + const closeBoundServer = (deadlineMs = 500): Promise => { if (closePromise) return closePromise + closeExpected = true closePromise = (async () => { const expectedOwnedSocket = ownedSocket const displaced: Array<{ @@ -363,6 +403,7 @@ export function createUnixSocketTransport(dependencies: { fileSystem?: UnixSocke return { address, + closed, async close(closeOptions = {}) { await closeBoundServer(closeOptions.deadlineMs ?? 500) }, @@ -423,5 +464,15 @@ export function createUnixSocketTransport(dependencies: { fileSystem?: UnixSocke }) }) }, + + async cleanupConfirmedDeadEndpoint(address) { + if (!validateAddress(address)) return + const before = await lstatIfPresent(fileSystem, address) + if (!before?.isSocket() || before.isSymbolicLink()) return + const after = await lstatIfPresent(fileSystem, address) + if (after?.isSocket() && !after.isSymbolicLink() && sameFileIdentity(before, after)) { + await fileSystem.unlink(address).catch(() => {}) + } + }, } } diff --git a/packages/core/src/peers/windows-named-pipe-transport.ts b/packages/core/src/peers/windows-named-pipe-transport.ts new file mode 100644 index 0000000..fd0f606 --- /dev/null +++ b/packages/core/src/peers/windows-named-pipe-transport.ts @@ -0,0 +1,598 @@ +import { type ChildProcessWithoutNullStreams, spawn } from 'node:child_process' + +import { debugLog, errorMessage } from '../utils.js' +import { NdjsonFrameDecoder, encodePeerFrame } from './protocol.js' +import type { PeerFrameV1 } from './protocol.js' +import { stripTerminalControls } from './terminal-sanitize.js' +import type { PeerTransport, PeerTransportServer } from './transport.js' +import { type WindowsPeerBrokerArtifact, resolveWindowsPeerBrokerArtifact } from './windows-peer-broker-artifact.js' +import { + WINDOWS_PEER_BROKER_MAX_OPERATIONS, + WINDOWS_PEER_BROKER_PROTOCOL_VERSION, + type WindowsPeerBrokerFrame, + WindowsPeerBrokerFrameDecoder, + WindowsPeerBrokerFrameKind, + decodeCancelAckPayload, + decodeInboundRequestPayload, + decodeOneStringPayload, + decodeOperationErrorPayload, + decodePeerFramePayload, + encodeOutboundRequestPayload, + encodePeerFramePayload, + encodeStartServerPayload, + encodeWindowsPeerBrokerFrame, +} from './windows-peer-broker-protocol.js' + +const DEFAULT_REQUEST_TIMEOUT_MS = 3_000 +const TOMBSTONE_TTL_MS = 5_000 +const STARTUP_TIMEOUT_MS = 5_000 +const INBOUND_CALLBACK_TIMEOUT_MS = 29_000 +const MAX_STDERR_BYTES = 4_096 + +interface RuntimePaths { + namespaceId?: string +} + +export interface WindowsNamedPipeTransportOptions { + getRuntimePaths: () => RuntimePaths + artifact?: WindowsPeerBrokerArtifact | Promise + spawnBroker?: typeof spawn + requestTimeoutMs?: number +} + +interface PendingOperation { + state: 'active' | 'canceled' + resolve: (frame: PeerFrameV1) => void + reject: (error: unknown) => void + timer: NodeJS.Timeout + signal?: AbortSignal + onAbort?: () => void + terminalSeen: boolean +} + +interface StartupOperation { + operationId: number + resolve: (address: string) => void + reject: (error: unknown) => void +} + +function transportError(code: string, message: string, cause?: unknown): Error { + const error = new Error(stripTerminalControls(message), cause === undefined ? undefined : { cause }) + error.name = code + return error +} + +function abortError(): Error { + return Object.assign(new Error('Peer request was interrupted'), { name: 'AbortError' }) +} + +function parseBusinessFrame(bytes: Buffer): PeerFrameV1 { + const decoder = new NdjsonFrameDecoder() + const frames = decoder.push(bytes) + decoder.finish() + if (frames.length !== 1) { + throw transportError('PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH', 'Windows peer broker returned multiple peer frames') + } + return frames[0]! +} + +function validPipeAddress(address: string, namespaceId?: string): boolean { + const match = /^\\\\\.\\pipe\\x-code-peer-v1-([a-f0-9]{12})-([A-Za-z0-9_-]{32})$/.exec(address) + return Boolean(match && namespaceId && match[1] === namespaceId) +} + +class BrokerClient { + readonly closed: Promise<{ expected: boolean; reason?: string }> + private readonly child: ChildProcessWithoutNullStreams + private readonly decoder = new WindowsPeerBrokerFrameDecoder() + private readonly pending = new Map() + private readonly tombstones = new Map() + private readonly inbound = new Set() + private readonly onRequest: (frame: PeerFrameV1, senderInstanceId: string) => Promise + private readonly requestTimeoutMs: number + private readonly resolveClosed: (result: { expected: boolean; reason?: string }) => void + private nextOperationId = 1 + private startup?: StartupOperation + private writeTail: Promise = Promise.resolve() + private expectedClose = false + private exited = false + private fatalReason?: string + private stderr = '' + private resolveShutdown?: () => void + + constructor( + artifact: WindowsPeerBrokerArtifact, + options: { + spawnBroker: typeof spawn + onRequest: (frame: PeerFrameV1, senderInstanceId: string) => Promise + requestTimeoutMs: number + }, + ) { + this.onRequest = options.onRequest + this.requestTimeoutMs = options.requestTimeoutMs + let resolveClosed!: (result: { expected: boolean; reason?: string }) => void + this.closed = new Promise((resolve) => { + resolveClosed = resolve + }) + this.resolveClosed = resolveClosed + this.child = options.spawnBroker( + artifact.executablePath, + ['broker', '--protocol', String(WINDOWS_PEER_BROKER_PROTOCOL_VERSION)], + { + stdio: ['pipe', 'pipe', 'pipe'], + windowsHide: true, + }, + ) + this.child.stdout.on('data', (chunk: Buffer) => this.onStdout(chunk)) + this.child.stdout.once('end', () => { + try { + this.decoder.finish() + } catch (error) { + this.fail(error) + } + }) + this.child.stderr.on('data', (chunk: Buffer) => { + if (this.stderr.length >= MAX_STDERR_BYTES) return + const text = stripTerminalControls(chunk.toString('utf8')).slice(0, MAX_STDERR_BYTES - this.stderr.length) + this.stderr += text + if (text) debugLog('peer.windows.broker-stderr', text) + }) + this.child.once('error', (error) => this.fail(error)) + this.child.once('exit', () => this.onExit()) + } + + async startServer(input: { namespaceId: string; instanceId: string; inboxToken: string }): Promise { + if (this.startup) { + throw transportError('PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH', 'Windows peer broker server is already starting') + } + const operationId = this.allocateOperationId() + return new Promise((resolve, reject) => { + this.startup = { operationId, resolve, reject } + void this.send({ + kind: WindowsPeerBrokerFrameKind.StartServer, + operationId, + payload: encodeStartServerPayload(input), + }).catch((error) => { + if (this.startup?.operationId === operationId) this.startup = undefined + reject(error) + }) + }) + } + + request(options: { + address: string + targetToken: string + senderInstanceId: string + frame: PeerFrameV1 + timeoutMs?: number + signal?: AbortSignal + }): Promise { + if (options.signal?.aborted) return Promise.reject(abortError()) + const timeoutMs = Math.min(120_000, Math.max(1, options.timeoutMs ?? this.requestTimeoutMs)) + let payload: Buffer + try { + payload = encodeOutboundRequestPayload({ + address: options.address, + targetToken: options.targetToken, + senderInstanceId: options.senderInstanceId, + timeoutMs, + peerFrame: encodePeerFrame(options.frame), + }) + } catch (error) { + return Promise.reject(error) + } + this.purgeTombstones() + if (this.pending.size + this.tombstones.size >= WINDOWS_PEER_BROKER_MAX_OPERATIONS) { + return Promise.reject( + transportError('PEER_WINDOWS_OPERATION_CAPACITY', 'Windows peer broker operation capacity is exhausted'), + ) + } + const operationId = this.allocateOperationId() + return new Promise((resolve, reject) => { + const onAbort = () => this.cancelOperation(operationId, abortError()) + const timer = setTimeout( + () => + this.cancelOperation( + operationId, + transportError('PEER_WINDOWS_REQUEST_TIMEOUT', 'Windows peer request timed out'), + ), + timeoutMs, + ) + timer.unref() + this.pending.set(operationId, { + state: 'active', + resolve, + reject, + timer, + signal: options.signal, + onAbort, + terminalSeen: false, + }) + options.signal?.addEventListener('abort', onAbort, { once: true }) + void this.send({ + kind: WindowsPeerBrokerFrameKind.OutboundRequest, + operationId, + payload, + }).catch((error) => this.finishPending(operationId, error)) + }) + } + + async close(deadlineMs: number): Promise { + if (this.expectedClose) { + await this.closed + return + } + this.expectedClose = true + if (this.exited) return + const operationId = this.allocateOperationId() + const shutdown = new Promise((resolve) => { + this.resolveShutdown = resolve + }) + await this.send({ kind: WindowsPeerBrokerFrameKind.Shutdown, operationId, payload: Buffer.alloc(0) }).catch( + () => {}, + ) + let timer: NodeJS.Timeout | undefined + await Promise.race([ + shutdown, + new Promise((resolve) => { + timer = setTimeout(resolve, Math.max(0, deadlineMs)) + timer.unref() + }), + ]) + if (timer) clearTimeout(timer) + if (!this.exited) this.child.kill() + await Promise.race([ + this.closed.then(() => {}), + new Promise((resolve) => { + const forceTimer = setTimeout(resolve, 250) + forceTimer.unref() + }), + ]) + } + + private allocateOperationId(): number { + this.purgeTombstones() + for (let attempt = 0; attempt <= WINDOWS_PEER_BROKER_MAX_OPERATIONS * 2; attempt++) { + const operationId = this.nextOperationId + this.nextOperationId = this.nextOperationId === 0xffff_ffff ? 1 : this.nextOperationId + 1 + if ( + operationId !== 0 && + !this.pending.has(operationId) && + !this.tombstones.has(operationId) && + this.startup?.operationId !== operationId + ) { + return operationId + } + } + throw transportError('PEER_WINDOWS_OPERATION_CAPACITY', 'Windows peer broker operation IDs are exhausted') + } + + private onStdout(chunk: Buffer): void { + if (this.exited) return + try { + for (const frame of this.decoder.push(chunk)) this.handleFrame(frame) + } catch (error) { + this.fail(error) + } + } + + private handleFrame(frame: WindowsPeerBrokerFrame): void { + switch (frame.kind) { + case WindowsPeerBrokerFrameKind.ServerReady: + this.handleServerReady(frame) + return + case WindowsPeerBrokerFrameKind.InboundRequest: + this.handleInbound(frame) + return + case WindowsPeerBrokerFrameKind.OutboundResponse: + this.handleTerminal(frame, undefined) + return + case WindowsPeerBrokerFrameKind.OperationError: + this.handleOperationError(frame) + return + case WindowsPeerBrokerFrameKind.CancelAck: + this.handleCancelAck(frame) + return + case WindowsPeerBrokerFrameKind.ServerFatal: { + if (frame.operationId !== 0) throw this.protocolViolation('SERVER_FATAL operation ID must be zero') + const failure = decodeOperationErrorPayload(frame.payload) + this.fatalReason = failure.message + this.fail(transportError(failure.code, failure.message)) + return + } + case WindowsPeerBrokerFrameKind.ShutdownComplete: + if (frame.operationId !== 0 || frame.payload.length !== 0) { + throw this.protocolViolation('SHUTDOWN_COMPLETE frame is invalid') + } + this.resolveShutdown?.() + return + default: + throw this.protocolViolation('Unexpected broker-to-Node frame kind') + } + } + + private handleServerReady(frame: WindowsPeerBrokerFrame): void { + if (frame.operationId !== 0 || !this.startup) throw this.protocolViolation('Unexpected SERVER_READY frame') + const address = decodeOneStringPayload(frame.payload) + const startup = this.startup + this.startup = undefined + startup.resolve(address) + } + + private handleInbound(frame: WindowsPeerBrokerFrame): void { + if (frame.operationId === 0 || this.inbound.has(frame.operationId) || this.inbound.size >= 256) { + throw this.protocolViolation('Invalid inbound operation ID') + } + const request = decodeInboundRequestPayload(frame.payload) + this.inbound.add(frame.operationId) + void (async () => { + let response: PeerFrameV1 + let callbackTimer: NodeJS.Timeout | undefined + try { + response = await Promise.race([ + this.onRequest(parseBusinessFrame(request.peerFrame), request.senderInstanceId), + new Promise((resolve) => { + callbackTimer = setTimeout( + () => + resolve({ + v: 1, + type: 'error', + code: 'PEER_REQUEST_TIMEOUT', + message: 'Peer request processing timed out', + }), + INBOUND_CALLBACK_TIMEOUT_MS, + ) + callbackTimer.unref() + }), + ]) + } catch (error) { + response = { + v: 1, + type: 'error', + code: 'PEER_PROTOCOL_ERROR', + message: stripTerminalControls(errorMessage(error)), + } + } finally { + if (callbackTimer) clearTimeout(callbackTimer) + } + try { + await this.send({ + kind: WindowsPeerBrokerFrameKind.InboundResponse, + operationId: frame.operationId, + payload: encodePeerFramePayload(encodePeerFrame(response)), + }) + } catch (error) { + this.fail(error) + } finally { + this.inbound.delete(frame.operationId) + } + })() + } + + private handleOperationError(frame: WindowsPeerBrokerFrame): void { + if (frame.operationId === 0) throw this.protocolViolation('OPERATION_ERROR operation ID must be nonzero') + const failure = decodeOperationErrorPayload(frame.payload) + if (this.startup?.operationId === frame.operationId) { + const startup = this.startup + this.startup = undefined + startup.reject(transportError(failure.code, failure.message)) + return + } + this.handleTerminal(frame, transportError(failure.code, failure.message)) + } + + private handleTerminal(frame: WindowsPeerBrokerFrame, failure: Error | undefined): void { + const pending = this.pending.get(frame.operationId) + if (!pending) { + if (this.tombstones.has(frame.operationId)) { + this.tombstones.delete(frame.operationId) + return + } + throw this.protocolViolation('Terminal response references an unknown operation ID') + } + let response: PeerFrameV1 | undefined + if (!failure && frame.kind === WindowsPeerBrokerFrameKind.OutboundResponse) { + response = parseBusinessFrame(decodePeerFramePayload(frame.payload)) + } + if (pending.state === 'canceled') { + pending.terminalSeen = true + return + } + this.pending.delete(frame.operationId) + this.disposePending(pending) + this.tombstones.set(frame.operationId, Date.now() + TOMBSTONE_TTL_MS) + if (failure) pending.reject(failure) + else pending.resolve(response!) + } + + private handleCancelAck(frame: WindowsPeerBrokerFrame): void { + const pending = this.pending.get(frame.operationId) + if (!pending || pending.state !== 'canceled') { + if (this.tombstones.has(frame.operationId)) return + throw this.protocolViolation('Cancel acknowledgement references an unknown operation ID') + } + const status = decodeCancelAckPayload(frame.payload) + if (status === 'canceled' || pending.terminalSeen) { + this.pending.delete(frame.operationId) + this.disposePending(pending) + this.tombstones.set(frame.operationId, Date.now() + TOMBSTONE_TTL_MS) + } + } + + private cancelOperation(operationId: number, reason: Error): void { + const pending = this.pending.get(operationId) + if (!pending || pending.state !== 'active') return + pending.state = 'canceled' + this.disposePending(pending) + pending.reject(reason) + pending.timer = setTimeout(() => { + const current = this.pending.get(operationId) + if (current?.state !== 'canceled') return + this.pending.delete(operationId) + this.disposePending(current) + }, TOMBSTONE_TTL_MS) + pending.timer.unref() + void this.send({ + kind: WindowsPeerBrokerFrameKind.CancelOperation, + operationId, + payload: Buffer.alloc(0), + }).catch((error) => this.fail(error)) + } + + private finishPending(operationId: number, error: unknown): void { + const pending = this.pending.get(operationId) + if (!pending) return + this.pending.delete(operationId) + this.disposePending(pending) + this.tombstones.set(operationId, Date.now() + TOMBSTONE_TTL_MS) + pending.reject(error) + } + + private disposePending(pending: PendingOperation): void { + clearTimeout(pending.timer) + if (pending.signal && pending.onAbort) pending.signal.removeEventListener('abort', pending.onAbort) + } + + private purgeTombstones(): void { + const now = Date.now() + for (const [operationId, expiresAt] of this.tombstones) { + if (expiresAt <= now) this.tombstones.delete(operationId) + } + } + + private send(frame: WindowsPeerBrokerFrame): Promise { + if (this.exited) { + return Promise.reject( + transportError('PEER_WINDOWS_BROKER_EXITED', this.fatalReason ?? 'Windows peer broker exited unexpectedly'), + ) + } + const bytes = encodeWindowsPeerBrokerFrame(frame) + const operation = this.writeTail.then( + () => + new Promise((resolve, reject) => { + this.child.stdin.write(bytes, (error) => { + if (error) reject(error) + else resolve() + }) + }), + ) + this.writeTail = operation.catch(() => {}) + return operation + } + + private fail(error: unknown): void { + if (this.exited) return + this.fatalReason = stripTerminalControls(errorMessage(error)) + this.child.kill() + } + + private onExit(): void { + if (this.exited) return + this.exited = true + const failure = transportError( + 'PEER_WINDOWS_BROKER_EXITED', + this.fatalReason ?? 'Windows peer broker exited unexpectedly', + ) + this.startup?.reject(failure) + this.startup = undefined + for (const pending of this.pending.values()) { + this.disposePending(pending) + if (pending.state === 'active') pending.reject(failure) + } + this.pending.clear() + this.inbound.clear() + this.resolveShutdown?.() + this.resolveClosed({ + expected: this.expectedClose, + ...(this.expectedClose ? {} : { reason: failure.message }), + }) + } + + private protocolViolation(message: string): Error { + return transportError('PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH', message) + } +} + +export function createWindowsNamedPipeTransport(options: WindowsNamedPipeTransportOptions): PeerTransport { + let client: BrokerClient | undefined + let server: PeerTransportServer | undefined + const namespaceId = (): string => { + const value = options.getRuntimePaths().namespaceId + if (!value || !/^[a-f0-9]{12}$/.test(value)) + throw transportError('PEER_RUNTIME_NOT_INITIALIZED', 'Peer runtime is not initialized') + return value + } + return { + kind: 'windows-pipe', + createAddressHint: () => namespaceId(), + validateAddress: (address) => validPipeAddress(address, options.getRuntimePaths().namespaceId), + + async listen(listenOptions) { + if (server) throw transportError('PEER_WINDOWS_PIPE_CREATE_FAILED', 'Windows peer broker is already listening') + const expectedNamespace = namespaceId() + if (listenOptions.address !== expectedNamespace) { + throw transportError('PEER_WINDOWS_PIPE_CREATE_FAILED', 'Windows peer broker namespace hint is invalid') + } + if (listenOptions.signal?.aborted) throw abortError() + const artifact = await (options.artifact ?? resolveWindowsPeerBrokerArtifact()) + if (listenOptions.signal?.aborted) throw abortError() + const broker = new BrokerClient(artifact, { + spawnBroker: options.spawnBroker ?? spawn, + onRequest: listenOptions.onRequest, + requestTimeoutMs: options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS, + }) + client = broker + const onAbort = () => void broker.close(0) + listenOptions.signal?.addEventListener('abort', onAbort, { once: true }) + try { + let startupTimer: NodeJS.Timeout | undefined + const address = await Promise.race([ + broker.startServer({ + namespaceId: expectedNamespace, + instanceId: listenOptions.instanceId, + inboxToken: listenOptions.inboxToken, + }), + new Promise((_, reject) => { + startupTimer = setTimeout( + () => reject(transportError('PEER_WINDOWS_PIPE_CREATE_FAILED', 'Windows peer broker startup timed out')), + STARTUP_TIMEOUT_MS, + ) + startupTimer.unref() + }), + ]).finally(() => { + if (startupTimer) clearTimeout(startupTimer) + }) + if (!validPipeAddress(address, expectedNamespace)) { + throw transportError( + 'PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH', + 'Windows peer broker returned an invalid pipe address', + ) + } + const created: PeerTransportServer = { + address, + closed: broker.closed, + async close(closeOptions = {}) { + await broker.close(closeOptions.deadlineMs ?? 500) + }, + } + server = created + return created + } catch (error) { + await broker.close(0).catch(() => {}) + throw error + } finally { + listenOptions.signal?.removeEventListener('abort', onAbort) + } + }, + + async request(requestOptions) { + if (!client || !server) { + throw transportError('PEER_WINDOWS_BROKER_EXITED', 'Windows peer broker is not running') + } + if (!validPipeAddress(requestOptions.address, namespaceId())) { + throw transportError('PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH', 'Windows peer pipe address is invalid') + } + return client.request(requestOptions) + }, + } +} diff --git a/packages/core/src/peers/windows-peer-broker-artifact.ts b/packages/core/src/peers/windows-peer-broker-artifact.ts new file mode 100644 index 0000000..b1051b3 --- /dev/null +++ b/packages/core/src/peers/windows-peer-broker-artifact.ts @@ -0,0 +1,133 @@ +import { createHash } from 'node:crypto' +import fs from 'node:fs/promises' +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +import { WINDOWS_PEER_BROKER_PROTOCOL_VERSION } from './windows-peer-broker-protocol.js' + +const WINDOWS_NATIVE_MANIFEST_VERSION = 2 +const WINDOWS_PE_MACHINES: Record<'x64' | 'arm64', number> = { x64: 0x8664, arm64: 0xaa64 } + +interface WindowsPeerBrokerManifestEntry { + file: string + protocolVersion: number + sha256: string + sourceSha256: string +} + +interface WindowsNativeManifest { + manifestVersion: number + artifacts: Record +} + +export interface WindowsPeerBrokerArtifact { + executablePath: string + sha256: string + protocolVersion: number +} + +function artifactError(code: string, message: string, cause?: unknown): Error { + const error = new Error(message, cause === undefined ? undefined : { cause }) + error.name = code + return error +} + +export function resolveWindowsPeerBrokerNativeRoot(modulePath: string): string { + const moduleDir = path.dirname(modulePath) + if (!/^windows-peer-broker-artifact\.(?:[cm]?js|ts)$/.test(path.basename(modulePath))) { + if (path.basename(moduleDir) === 'dist') return path.join(moduleDir, 'native', 'windows') + if (path.basename(moduleDir) === 'chunks' && path.basename(path.dirname(moduleDir)) === 'dist') { + return path.join(path.dirname(moduleDir), 'native', 'windows') + } + throw artifactError( + 'PEER_WINDOWS_HELPER_MISSING', + `Windows peer broker bundle has an unsupported package layout: ${modulePath}`, + ) + } + + const sourceRoot = path.dirname(moduleDir) + if (path.basename(sourceRoot) === 'dist') return path.join(sourceRoot, 'native', 'windows') + if (path.basename(sourceRoot) === 'src') { + return path.join(path.dirname(sourceRoot), 'dist', 'native', 'windows') + } + throw artifactError( + 'PEER_WINDOWS_HELPER_MISSING', + `Windows peer broker module has an unsupported package layout: ${modulePath}`, + ) +} + +function verifyPeArchitecture(bytes: Buffer, arch: 'x64' | 'arm64'): void { + if (bytes.length < 0x40 || bytes.readUInt16LE(0) !== 0x5a4d) { + throw artifactError('PEER_WINDOWS_HELPER_HASH_MISMATCH', `Windows peer broker is not a PE executable for ${arch}`) + } + const peOffset = bytes.readUInt32LE(0x3c) + if ( + peOffset + 6 > bytes.length || + bytes.readUInt32LE(peOffset) !== 0x00004550 || + bytes.readUInt16LE(peOffset + 4) !== WINDOWS_PE_MACHINES[arch] + ) { + throw artifactError('PEER_WINDOWS_HELPER_HASH_MISMATCH', `Windows peer broker PE architecture mismatch for ${arch}`) + } +} + +export async function resolveWindowsPeerBrokerArtifact( + arch: NodeJS.Architecture = process.arch, + nativeRoot = resolveWindowsPeerBrokerNativeRoot(fileURLToPath(import.meta.url)), +): Promise { + if (arch !== 'x64' && arch !== 'arm64') { + throw artifactError('PEER_WINDOWS_UNSUPPORTED_ARCH', `Windows peer messaging does not support architecture ${arch}`) + } + let manifest: WindowsNativeManifest + try { + manifest = JSON.parse(await fs.readFile(path.join(nativeRoot, 'manifest.json'), 'utf8')) as WindowsNativeManifest + } catch (error) { + throw artifactError( + 'PEER_WINDOWS_HELPER_MISSING', + `Windows peer broker is missing for ${arch}; reinstall x-code-cli`, + error, + ) + } + if (manifest.manifestVersion !== WINDOWS_NATIVE_MANIFEST_VERSION) { + throw artifactError( + 'PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH', + `Windows native manifest mismatch: expected ${WINDOWS_NATIVE_MANIFEST_VERSION}, received ${manifest.manifestVersion}`, + ) + } + const artifact = manifest.artifacts?.[arch]?.peerBroker + if (!artifact) { + throw artifactError('PEER_WINDOWS_HELPER_MISSING', `Windows peer broker manifest has no ${arch} artifact`) + } + if (artifact.protocolVersion !== WINDOWS_PEER_BROKER_PROTOCOL_VERSION) { + throw artifactError( + 'PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH', + `Windows peer broker protocol mismatch: expected ${WINDOWS_PEER_BROKER_PROTOCOL_VERSION}, received ${artifact.protocolVersion}`, + ) + } + if (!/^[a-f0-9]{64}$/.test(artifact.sha256) || !/^[a-f0-9]{64}$/.test(artifact.sourceSha256)) { + throw artifactError('PEER_WINDOWS_HELPER_HASH_MISMATCH', 'Windows peer broker manifest hash is invalid') + } + if (artifact.file !== `${arch}/xc-peer-broker.exe`) { + throw artifactError('PEER_WINDOWS_HELPER_HASH_MISMATCH', `Windows peer broker manifest has an invalid ${arch} path`) + } + const executablePath = path.resolve(nativeRoot, artifact.file) + const relative = path.relative(nativeRoot, executablePath) + if (relative.startsWith('..') || path.isAbsolute(relative)) { + throw artifactError('PEER_WINDOWS_HELPER_HASH_MISMATCH', 'Windows peer broker path escapes its native directory') + } + let bytes: Buffer + try { + bytes = await fs.readFile(executablePath) + } catch (error) { + throw artifactError( + 'PEER_WINDOWS_HELPER_MISSING', + `Windows peer broker is missing for ${arch}; reinstall x-code-cli`, + error, + ) + } + verifyPeArchitecture(bytes, arch) + const actualHash = createHash('sha256').update(bytes).digest('hex') + if (actualHash !== artifact.sha256) { + throw artifactError('PEER_WINDOWS_HELPER_HASH_MISMATCH', `Windows peer broker hash mismatch for ${arch}`) + } + return { executablePath, sha256: actualHash, protocolVersion: artifact.protocolVersion } +} diff --git a/packages/core/src/peers/windows-peer-broker-protocol.ts b/packages/core/src/peers/windows-peer-broker-protocol.ts new file mode 100644 index 0000000..f016bb3 --- /dev/null +++ b/packages/core/src/peers/windows-peer-broker-protocol.ts @@ -0,0 +1,259 @@ +export const WINDOWS_PEER_BROKER_PROTOCOL_VERSION = 1 +export const WINDOWS_PEER_BROKER_HEADER_BYTES = 16 +export const WINDOWS_PEER_BROKER_MAX_PAYLOAD_BYTES = 139_264 +export const WINDOWS_PEER_BROKER_MAX_OPERATIONS = 256 + +const MAGIC = Buffer.from('XCPB') +const MAX_PEER_FRAME_BYTES = 131_072 + +export const WindowsPeerBrokerFrameKind = { + SecureRuntime: 0x01, + StartServer: 0x02, + OutboundRequest: 0x03, + InboundResponse: 0x04, + CancelOperation: 0x05, + Shutdown: 0x06, + SecureRuntimeResult: 0x81, + ServerReady: 0x82, + InboundRequest: 0x83, + OutboundResponse: 0x84, + CancelAck: 0x85, + OperationError: 0x86, + ServerFatal: 0x87, + ShutdownComplete: 0x88, +} as const + +export type WindowsPeerBrokerFrameKind = (typeof WindowsPeerBrokerFrameKind)[keyof typeof WindowsPeerBrokerFrameKind] + +const KNOWN_KINDS = new Set(Object.values(WindowsPeerBrokerFrameKind)) + +export interface WindowsPeerBrokerFrame { + kind: WindowsPeerBrokerFrameKind + operationId: number + payload: Buffer +} + +function protocolError(message: string): Error { + return Object.assign(new Error(message), { name: 'PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH' }) +} + +function assertOperationId(operationId: number): void { + if (!Number.isSafeInteger(operationId) || operationId < 0 || operationId > 0xffff_ffff) { + throw protocolError('Windows peer broker operation ID is invalid') + } +} + +export function encodeWindowsPeerBrokerFrame(frame: WindowsPeerBrokerFrame): Buffer { + assertOperationId(frame.operationId) + if (!KNOWN_KINDS.has(frame.kind)) throw protocolError('Windows peer broker frame kind is invalid') + if (frame.payload.length > WINDOWS_PEER_BROKER_MAX_PAYLOAD_BYTES) { + throw protocolError('Windows peer broker frame exceeds the payload limit') + } + const bytes = Buffer.allocUnsafe(WINDOWS_PEER_BROKER_HEADER_BYTES + frame.payload.length) + MAGIC.copy(bytes, 0) + bytes[4] = WINDOWS_PEER_BROKER_PROTOCOL_VERSION + bytes[5] = frame.kind + bytes.writeUInt16LE(0, 6) + bytes.writeUInt32LE(frame.operationId, 8) + bytes.writeUInt32LE(frame.payload.length, 12) + frame.payload.copy(bytes, WINDOWS_PEER_BROKER_HEADER_BYTES) + return bytes +} + +export class WindowsPeerBrokerFrameDecoder { + private buffer = Buffer.alloc(0) + + push(chunk: Uint8Array): WindowsPeerBrokerFrame[] { + if (chunk.length === 0) return [] + this.buffer = this.buffer.length === 0 ? Buffer.from(chunk) : Buffer.concat([this.buffer, chunk]) + const frames: WindowsPeerBrokerFrame[] = [] + while (this.buffer.length >= WINDOWS_PEER_BROKER_HEADER_BYTES) { + if (!this.buffer.subarray(0, 4).equals(MAGIC)) throw protocolError('Invalid Windows peer broker frame magic') + if (this.buffer[4] !== WINDOWS_PEER_BROKER_PROTOCOL_VERSION) { + throw protocolError('Unsupported Windows peer broker protocol version') + } + const kind = this.buffer[5]! + if (!KNOWN_KINDS.has(kind)) throw protocolError('Unknown Windows peer broker frame kind') + if (this.buffer.readUInt16LE(6) !== 0) throw protocolError('Unsupported Windows peer broker frame flags') + const payloadLength = this.buffer.readUInt32LE(12) + if (payloadLength > WINDOWS_PEER_BROKER_MAX_PAYLOAD_BYTES) { + throw protocolError('Windows peer broker frame exceeds the payload limit') + } + const frameLength = WINDOWS_PEER_BROKER_HEADER_BYTES + payloadLength + if (this.buffer.length < frameLength) break + frames.push({ + kind: kind as WindowsPeerBrokerFrameKind, + operationId: this.buffer.readUInt32LE(8), + payload: Buffer.from(this.buffer.subarray(WINDOWS_PEER_BROKER_HEADER_BYTES, frameLength)), + }) + this.buffer = this.buffer.subarray(frameLength) + } + return frames + } + + finish(): void { + if (this.buffer.length !== 0) throw protocolError('Truncated Windows peer broker frame') + } +} + +class PayloadWriter { + private readonly chunks: Buffer[] = [] + private length = 0 + + string(value: string): this { + const bytes = Buffer.from(value, 'utf8') + if (bytes.length > 0xffff) throw protocolError('Windows peer broker string exceeds the limit') + const prefix = Buffer.allocUnsafe(2) + prefix.writeUInt16LE(bytes.length) + this.push(prefix) + this.push(bytes) + return this + } + + bytes(value: Uint8Array): this { + if (value.length > MAX_PEER_FRAME_BYTES) throw protocolError('Peer frame exceeds the broker limit') + const prefix = Buffer.allocUnsafe(4) + prefix.writeUInt32LE(value.length) + this.push(prefix) + this.push(Buffer.from(value)) + return this + } + + u32(value: number): this { + assertOperationId(value) + const bytes = Buffer.allocUnsafe(4) + bytes.writeUInt32LE(value) + this.push(bytes) + return this + } + + build(): Buffer { + if (this.length > WINDOWS_PEER_BROKER_MAX_PAYLOAD_BYTES) { + throw protocolError('Windows peer broker control payload exceeds the limit') + } + return Buffer.concat(this.chunks, this.length) + } + + private push(bytes: Buffer): void { + this.length += bytes.length + this.chunks.push(bytes) + } +} + +class PayloadReader { + private offset = 0 + + constructor(private readonly bytes: Buffer) {} + + string(): string { + const length = this.take(2).readUInt16LE(0) + const bytes = this.take(length) + try { + return new TextDecoder('utf-8', { fatal: true }).decode(bytes) + } catch { + throw protocolError('Windows peer broker string is not valid UTF-8') + } + } + + byteArray(): Buffer { + const length = this.take(4).readUInt32LE(0) + if (length > MAX_PEER_FRAME_BYTES) throw protocolError('Peer frame exceeds the broker limit') + return Buffer.from(this.take(length)) + } + + u32(): number { + return this.take(4).readUInt32LE(0) + } + + u8(): number { + return this.take(1)[0]! + } + + finish(): void { + if (this.offset !== this.bytes.length) throw protocolError('Unexpected Windows peer broker payload suffix') + } + + private take(length: number): Buffer { + const end = this.offset + length + if (!Number.isSafeInteger(end) || end > this.bytes.length) { + throw protocolError('Truncated Windows peer broker payload') + } + const value = this.bytes.subarray(this.offset, end) + this.offset = end + return value + } +} + +export function encodeSecureRuntimePayload(root: string): Buffer { + return new PayloadWriter().string(root).build() +} + +export function encodeStartServerPayload(input: { + namespaceId: string + instanceId: string + inboxToken: string +}): Buffer { + return new PayloadWriter().string(input.namespaceId).string(input.instanceId).string(input.inboxToken).build() +} + +export function encodeOutboundRequestPayload(input: { + address: string + targetToken: string + senderInstanceId: string + timeoutMs: number + peerFrame: Uint8Array +}): Buffer { + return new PayloadWriter() + .string(input.address) + .string(input.targetToken) + .string(input.senderInstanceId) + .u32(input.timeoutMs) + .bytes(input.peerFrame) + .build() +} + +export function encodePeerFramePayload(peerFrame: Uint8Array): Buffer { + return new PayloadWriter().bytes(peerFrame).build() +} + +export function decodeOneStringPayload(payload: Buffer): string { + const reader = new PayloadReader(payload) + const value = reader.string() + reader.finish() + return value +} + +export function decodePeerFramePayload(payload: Buffer): Buffer { + const reader = new PayloadReader(payload) + const peerFrame = reader.byteArray() + if (peerFrame.length === 0) throw protocolError('Windows peer broker returned an empty peer frame') + reader.finish() + return peerFrame +} + +export function decodeInboundRequestPayload(payload: Buffer): { senderInstanceId: string; peerFrame: Buffer } { + const reader = new PayloadReader(payload) + const senderInstanceId = reader.string() + const peerFrame = reader.byteArray() + if (peerFrame.length === 0) throw protocolError('Windows peer broker returned an empty inbound frame') + reader.finish() + return { senderInstanceId, peerFrame } +} + +export function decodeOperationErrorPayload(payload: Buffer): { code: string; message: string } { + const reader = new PayloadReader(payload) + const code = reader.string() + const message = reader.string() + reader.finish() + if (!/^PEER_[A-Z0-9_]+$/.test(code)) throw protocolError('Windows peer broker returned an invalid error code') + return { code, message } +} + +export function decodeCancelAckPayload(payload: Buffer): 'canceled' | 'too-late' { + const reader = new PayloadReader(payload) + const status = reader.u8() + reader.finish() + if (status === 0) return 'canceled' + if (status === 1) return 'too-late' + throw protocolError('Windows peer broker returned an invalid cancel acknowledgement') +} diff --git a/packages/core/src/peers/windows-peer-runtime-security.ts b/packages/core/src/peers/windows-peer-runtime-security.ts new file mode 100644 index 0000000..e13404d --- /dev/null +++ b/packages/core/src/peers/windows-peer-runtime-security.ts @@ -0,0 +1,205 @@ +import { type ChildProcessWithoutNullStreams, spawn } from 'node:child_process' +import path from 'node:path' + +import { debugLog, errorMessage, userXcodeDir } from '../utils.js' +import { stripTerminalControls } from './terminal-sanitize.js' +import { type WindowsPeerBrokerArtifact, resolveWindowsPeerBrokerArtifact } from './windows-peer-broker-artifact.js' +import { + WINDOWS_PEER_BROKER_PROTOCOL_VERSION, + WindowsPeerBrokerFrameDecoder, + WindowsPeerBrokerFrameKind, + decodeOneStringPayload, + decodeOperationErrorPayload, + encodeSecureRuntimePayload, + encodeWindowsPeerBrokerFrame, +} from './windows-peer-broker-protocol.js' + +const SECURE_RUNTIME_OPERATION_ID = 1 +const SECURE_RUNTIME_TIMEOUT_MS = 5_000 + +export interface WindowsPeerRuntimePaths { + registryDir: string + socketDir: string + namespaceId: string +} + +export interface WindowsPeerRuntimeSecurityProvider { + initialize(signal?: AbortSignal): Promise +} + +export interface WindowsPeerRuntimeSecurityOptions { + root?: string + artifact?: WindowsPeerBrokerArtifact | Promise + spawnBroker?: typeof spawn + timeoutMs?: number +} + +function runtimeError(code: string, message: string, cause?: unknown): Error { + const error = new Error(stripTerminalControls(message), cause === undefined ? undefined : { cause }) + error.name = code + return error +} + +function abortError(): Error { + return Object.assign(new Error('Windows peer runtime initialization was interrupted'), { name: 'AbortError' }) +} + +function waitForExit( + child: ChildProcessWithoutNullStreams, +): Promise<{ code: number | null; signal: NodeJS.Signals | null }> { + return new Promise((resolve, reject) => { + child.once('error', reject) + child.once('exit', (code, signal) => resolve({ code, signal })) + }) +} + +export function createWindowsPeerRuntimeSecurity( + options: WindowsPeerRuntimeSecurityOptions = {}, +): WindowsPeerRuntimeSecurityProvider { + let initialized: Promise | undefined + return { + initialize(signal) { + if (initialized) return initialized + const operation = secureWindowsPeerRuntime(options, signal).catch((error) => { + initialized = undefined + throw error + }) + initialized = operation + return operation + }, + } +} + +async function secureWindowsPeerRuntime( + options: WindowsPeerRuntimeSecurityOptions, + signal?: AbortSignal, +): Promise { + if (process.platform !== 'win32') { + throw runtimeError('PEER_UNSUPPORTED_PLATFORM', 'Windows peer runtime security is only available on Windows') + } + if (signal?.aborted) throw abortError() + const root = path.resolve(options.root ?? userXcodeDir()) + const artifact = await (options.artifact ?? resolveWindowsPeerBrokerArtifact()) + if (signal?.aborted) throw abortError() + const spawnBroker = options.spawnBroker ?? spawn + const child = spawnBroker( + artifact.executablePath, + ['secure-runtime', '--protocol', String(WINDOWS_PEER_BROKER_PROTOCOL_VERSION)], + { + stdio: ['pipe', 'pipe', 'pipe'], + windowsHide: true, + }, + ) + const decoder = new WindowsPeerBrokerFrameDecoder() + let stderr = '' + let settled = false + let resolveResult!: (namespaceId: string) => void + let rejectResult!: (error: unknown) => void + const result = new Promise((resolve, reject) => { + resolveResult = resolve + rejectResult = reject + }) + const settleError = (error: unknown): void => { + if (settled) return + settled = true + rejectResult(error) + } + const onAbort = (): void => { + child.kill() + settleError(abortError()) + } + signal?.addEventListener('abort', onAbort, { once: true }) + child.stdout.on('data', (chunk: Buffer) => { + if (settled) return + try { + for (const frame of decoder.push(chunk)) { + if (frame.operationId !== SECURE_RUNTIME_OPERATION_ID) { + throw runtimeError( + 'PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH', + 'Windows peer runtime helper returned an unknown operation ID', + ) + } + if (frame.kind === WindowsPeerBrokerFrameKind.SecureRuntimeResult) { + const namespaceId = decodeOneStringPayload(frame.payload) + if (!/^[a-f0-9]{12}$/.test(namespaceId)) { + throw runtimeError( + 'PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH', + 'Windows peer runtime helper returned an invalid namespace', + ) + } + settled = true + resolveResult(namespaceId) + } else if (frame.kind === WindowsPeerBrokerFrameKind.OperationError) { + const failure = decodeOperationErrorPayload(frame.payload) + settleError(runtimeError(failure.code, failure.message)) + } else { + throw runtimeError( + 'PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH', + 'Windows peer runtime helper returned an unexpected frame', + ) + } + } + } catch (error) { + child.kill() + settleError(error) + } + }) + child.stdout.once('end', () => { + try { + decoder.finish() + } catch (error) { + settleError(error) + } + }) + child.stderr.on('data', (chunk: Buffer) => { + if (stderr.length >= 4_096) return + stderr += stripTerminalControls(chunk.toString('utf8')).slice(0, 4_096 - stderr.length) + }) + const exit = waitForExit(child) + const timer = setTimeout(() => { + child.kill() + settleError(runtimeError('PEER_WINDOWS_RUNTIME_UNSAFE', 'Windows peer runtime security check timed out')) + }, options.timeoutMs ?? SECURE_RUNTIME_TIMEOUT_MS) + timer.unref() + + try { + const request = encodeWindowsPeerBrokerFrame({ + kind: WindowsPeerBrokerFrameKind.SecureRuntime, + operationId: SECURE_RUNTIME_OPERATION_ID, + payload: encodeSecureRuntimePayload(root), + }) + await new Promise((resolve, reject) => { + child.stdin.write(request, (error) => { + if (error) reject(error) + else { + child.stdin.end() + resolve() + } + }) + }) + const namespaceId = await result + const status = await exit + if (status.code !== 0) { + throw runtimeError( + 'PEER_WINDOWS_RUNTIME_UNSAFE', + 'Windows peer runtime helper exited before completing the security check', + ) + } + if (stderr) debugLog('peer.windows.runtime-helper', stderr) + const registryDir = path.join(root, 'runtime', 'peers') + return { registryDir, socketDir: registryDir, namespaceId } + } catch (error) { + child.kill() + const status = await exit.catch(() => null) + if (stderr) debugLog('peer.windows.runtime-helper', stderr) + if (error instanceof Error && (error.name === 'AbortError' || error.name.startsWith('PEER_'))) throw error + throw runtimeError( + 'PEER_WINDOWS_RUNTIME_UNSAFE', + `Windows peer runtime security check failed: ${errorMessage(error)}`, + status, + ) + } finally { + clearTimeout(timer) + signal?.removeEventListener('abort', onAbort) + } +} diff --git a/packages/core/src/tools/shell-session/providers/windows-job.ts b/packages/core/src/tools/shell-session/providers/windows-job.ts index 26f8558..1ed56d4 100644 --- a/packages/core/src/tools/shell-session/providers/windows-job.ts +++ b/packages/core/src/tools/shell-session/providers/windows-job.ts @@ -31,9 +31,33 @@ export interface WindowsSupervisorArtifact { sha256: string } -interface WindowsSupervisorManifest { +interface WindowsNativeArtifactManifestEntry { + file: string protocolVersion: number - artifacts: Record + sha256: string + sourceSha256: string +} + +interface WindowsSupervisorManifest { + manifestVersion: number + artifacts: Record +} + +const WINDOWS_NATIVE_MANIFEST_VERSION = 2 +const WINDOWS_PE_MACHINES: Record<'x64' | 'arm64', number> = { x64: 0x8664, arm64: 0xaa64 } + +function verifyWindowsSupervisorPe(bytes: Buffer, arch: 'x64' | 'arm64'): void { + if (bytes.length < 0x40 || bytes.readUInt16LE(0) !== 0x5a4d) { + throw new Error(`Windows shell supervisor is not a PE executable for ${arch}`) + } + const peOffset = bytes.readUInt32LE(0x3c) + if ( + peOffset + 6 > bytes.length || + bytes.readUInt32LE(peOffset) !== 0x00004550 || + bytes.readUInt16LE(peOffset + 4) !== WINDOWS_PE_MACHINES[arch] + ) { + throw new Error(`Windows shell supervisor PE architecture mismatch for ${arch}`) + } } export interface WindowsJobObjectProviderOptions { @@ -85,20 +109,31 @@ export async function resolveWindowsSupervisorArtifact( } catch (error) { throw new Error(`Windows shell supervisor artifact is missing for ${arch}; reinstall x-code-cli`, { cause: error }) } - if (manifest.protocolVersion !== WINDOWS_SUPERVISOR_PROTOCOL_VERSION) { + if (manifest.manifestVersion !== WINDOWS_NATIVE_MANIFEST_VERSION) { throw new Error( - `Windows shell supervisor manifest protocol mismatch: expected ${WINDOWS_SUPERVISOR_PROTOCOL_VERSION}, received ${manifest.protocolVersion}`, + `Windows native manifest mismatch: expected ${WINDOWS_NATIVE_MANIFEST_VERSION}, received ${manifest.manifestVersion}`, ) } - const artifact = manifest.artifacts[arch] + const artifact = manifest.artifacts?.[arch]?.shellSupervisor if (!artifact) throw new Error(`Windows shell supervisor manifest has no ${arch} artifact`) - if (!/^[a-f0-9]{64}$/i.test(artifact.sha256)) throw new Error('Windows shell supervisor manifest hash is invalid') + if (artifact.protocolVersion !== WINDOWS_SUPERVISOR_PROTOCOL_VERSION) { + throw new Error( + `Windows shell supervisor manifest protocol mismatch: expected ${WINDOWS_SUPERVISOR_PROTOCOL_VERSION}, received ${artifact.protocolVersion}`, + ) + } + if (!/^[a-f0-9]{64}$/.test(artifact.sha256) || !/^[a-f0-9]{64}$/.test(artifact.sourceSha256)) { + throw new Error('Windows shell supervisor manifest hash is invalid') + } + if (artifact.file !== `${arch}/xc-shell-supervisor.exe`) { + throw new Error(`Windows shell supervisor manifest has an invalid ${arch} path`) + } const executablePath = path.resolve(root, artifact.file) const relative = path.relative(root, executablePath) if (relative.startsWith('..') || path.isAbsolute(relative)) { throw new Error('Windows shell supervisor manifest points outside its native directory') } const bytes = await fs.readFile(executablePath) + verifyWindowsSupervisorPe(bytes, arch) const actualHash = createHash('sha256').update(bytes).digest('hex') if (actualHash !== artifact.sha256.toLowerCase()) { throw new Error(`Windows shell supervisor hash mismatch for ${arch}`) diff --git a/packages/core/tests/__snapshots__/api-exports.test.ts.snap b/packages/core/tests/__snapshots__/api-exports.test.ts.snap index 920d0c0..79d99ef 100644 --- a/packages/core/tests/__snapshots__/api-exports.test.ts.snap +++ b/packages/core/tests/__snapshots__/api-exports.test.ts.snap @@ -120,11 +120,13 @@ exports[`@x-code-cli/core public API > export list matches snapshot 1`] = ` "createPeerRateLimiter", "createPeerRegistry", "createPeerService", + "createPlatformPeerTransport", "createProviderTurnUsage", "createSkillRegistry", "createSubAgentRegistry", "createUnixSocketTransport", "createUsageBreakdown", + "createWindowsNamedPipeTransport", "debugLog", "debugLogIntegrationDiagnostics", "decideInboundDisposition", diff --git a/packages/core/tests/peer-registry.test.ts b/packages/core/tests/peer-registry.test.ts index e9ebfa2..d1a3e69 100644 --- a/packages/core/tests/peer-registry.test.ts +++ b/packages/core/tests/peer-registry.test.ts @@ -9,7 +9,7 @@ import path from 'node:path' import { createPeerIdentity } from '../src/peers/identity.js' import { peerSocketPath } from '../src/peers/paths.js' -import { createPeerRegistry } from '../src/peers/registry.js' +import { createPeerRegistry, parseRegistration } from '../src/peers/registry.js' import type { PeerTransport } from '../src/peers/transport.js' import type { PeerRegistrationV1 } from '../src/peers/types.js' @@ -26,6 +26,21 @@ afterEach(async () => { await rm(testDir, { recursive: true, force: true }) }) +function createTestRegistry() { + if (process.platform !== 'win32') return createPeerRegistry({}) + return createPeerRegistry({ + transportKind: 'unix', + windowsRuntimeSecurity: { + async initialize() { + const registryDir = path.join(process.env.X_CODE_HOME!, 'runtime', 'peers') + const socketDir = path.join(process.env.X_CODE_HOME!, 'runtime', 'peer-sockets') + await Promise.all([mkdir(registryDir, { recursive: true }), mkdir(socketDir, { recursive: true })]) + return { registryDir, socketDir, namespaceId: '0123456789ab' } + }, + }, + }) +} + function registration(socketDir: string, overrides: Partial = {}): PeerRegistrationV1 { const identity = createPeerIdentity({ name: 'backend' }) const now = '2026-08-13T00:00:00.000Z' @@ -68,12 +83,12 @@ describe('owner-only peer registry', () => { const linked = path.join(testDir, 'linked-home') await symlink(target, linked) process.env.X_CODE_HOME = linked - await expect(createPeerRegistry().initialize()).rejects.toThrow('Unsafe peer runtime directory') + await expect(createTestRegistry().initialize()).rejects.toThrow('Unsafe peer runtime directory') if (process.platform !== 'win32') expect((await lstat(target)).mode & 0o777).toBe(0o755) }) it('routes through X_CODE_HOME and atomically writes owner-only registrations', async () => { - const registry = createPeerRegistry() + const registry = createTestRegistry() await registry.initialize() const paths = registry.paths() expect(paths.registryDir).toBe(path.join(process.env.X_CODE_HOME!, 'runtime', 'peers')) @@ -91,7 +106,7 @@ describe('owner-only peer registry', () => { }) it('enumerates duplicate names and short-display collisions with full UUID identities', async () => { - const registry = createPeerRegistry() + const registry = createTestRegistry() await registry.initialize() const socketDir = registry.paths().socketDir const oneInstanceId = '12345678-1111-4111-8111-111111111111' @@ -118,7 +133,7 @@ describe('owner-only peer registry', () => { }) it('sanitizes untrusted registry name and cwd fields before exposing candidates', async () => { - const registry = createPeerRegistry() + const registry = createTestRegistry() await registry.initialize() const value = registration(registry.paths().socketDir, { name: 'back\x1b]52;c;Y2xpcGJvYXJk\x07end\u202e', @@ -136,7 +151,7 @@ describe('owner-only peer registry', () => { }) it('rejects symlinks, broad modes, oversized files, bad schema, and socket namespace escape', async () => { - const registry = createPeerRegistry() + const registry = createTestRegistry() await registry.initialize() const { registryDir, socketDir } = registry.paths() @@ -170,7 +185,7 @@ describe('owner-only peer registry', () => { }) it('does not remove a registration for a live pid during residual cleanup', async () => { - const registry = createPeerRegistry() + const registry = createTestRegistry() await registry.initialize() const value = registration(registry.paths().socketDir, { updatedAt: new Date(Date.now() - 60_000).toISOString(), @@ -182,7 +197,7 @@ describe('owner-only peer registry', () => { }) it('removes only a twice-confirmed dead registration after the grace period', async () => { - const registry = createPeerRegistry() + const registry = createTestRegistry() await registry.initialize() const value = registration(registry.paths().socketDir, { pid: 2_147_483_647, @@ -195,7 +210,7 @@ describe('owner-only peer registry', () => { }) itPosix('removes a dead colliding registration without unlinking a live registration shared socket', async () => { - const registry = createPeerRegistry() + const registry = createTestRegistry() await registry.initialize() const deadId = 'bbbbbbbb-1111-4111-8111-111111111111' const liveId = 'bbbbbbbb-2222-4222-8222-222222222222' @@ -237,10 +252,18 @@ describe('owner-only peer registry', () => { const identityModule = path.join(process.cwd(), 'packages/core/dist/peers/identity.js') const pathsModule = path.join(process.cwd(), 'packages/core/dist/peers/paths.js') const childScript = ` + import { mkdir } from 'node:fs/promises' + import path from 'node:path' import { createPeerRegistry } from ${JSON.stringify(`file://${registryModule}`)} import { createPeerIdentity } from ${JSON.stringify(`file://${identityModule}`)} import { peerSocketPath } from ${JSON.stringify(`file://${pathsModule}`)} - const registry = createPeerRegistry() + const windowsRuntimeSecurity = { initialize: async () => { + const registryDir = path.join(process.env.X_CODE_HOME, 'runtime', 'peers') + const socketDir = path.join(process.env.X_CODE_HOME, 'runtime', 'peer-sockets') + await Promise.all([mkdir(registryDir, { recursive: true }), mkdir(socketDir, { recursive: true })]) + return { registryDir, socketDir, namespaceId: '0123456789ab' } + } } + const registry = createPeerRegistry(process.platform === 'win32' ? { transportKind: 'unix', windowsRuntimeSecurity } : {}) await registry.initialize() const identity = createPeerIdentity({ name: 'child' }) const now = new Date().toISOString() @@ -251,22 +274,39 @@ describe('owner-only peer registry', () => { ` await Promise.all([runChild(childScript), runChild(childScript)]) - const registry = createPeerRegistry() + const registry = createTestRegistry() await registry.initialize() const scan = await registry.listCandidates() expect(scan.candidates).toHaveLength(2) expect(scan.candidates.every((candidate) => candidate.registration.name === 'child')).toBe(true) }) + it('strictly validates Windows pipe descriptors and namespace isolation', () => { + const value = registration('C:\\runtime', { + transport: { + kind: 'windows-pipe', + address: '\\\\.\\pipe\\x-code-peer-v1-0123456789ab-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + }, + }) + expect(parseRegistration(value, { socketDir: 'C:\\runtime', namespaceId: '0123456789ab' })).not.toBeNull() + expect(parseRegistration(value, { socketDir: 'C:\\runtime', namespaceId: 'ffffffffffff' })).toBeNull() + expect( + parseRegistration( + { ...value, transport: { kind: 'windows-pipe', address: '\\\\.\\pipe\\x-code-peer-v1-0123456789ab-..' } }, + { socketDir: 'C:\\runtime', namespaceId: '0123456789ab' }, + ), + ).toBeNull() + }) + it('rejects registration tokens that are not full random 32-byte base64url values', async () => { - const registry = createPeerRegistry() + const registry = createTestRegistry() await registry.initialize() const value = registration(registry.paths().socketDir, { inboxToken: randomBytes(8).toString('base64url') }) await expect(registry.write(value)).rejects.toThrow('Invalid peer registration') }) it('bounds listLive ping concurrency and returns only authenticated pong identities', async () => { - const registry = createPeerRegistry() + const registry = createTestRegistry() await registry.initialize() const values = Array.from({ length: 20 }, () => registration(registry.paths().socketDir)) for (const value of values) await registry.write(value) @@ -274,6 +314,9 @@ describe('owner-only peer registry', () => { let active = 0 let maximum = 0 const transport: PeerTransport = { + kind: 'unix', + createAddressHint: vi.fn(), + validateAddress: () => true, listen: vi.fn() as never, request: async ({ address, frame }) => { active++ @@ -292,13 +335,16 @@ describe('owner-only peer registry', () => { }) it('never deletes a live-pid registration merely because ping times out', async () => { - const registry = createPeerRegistry() + const registry = createTestRegistry() await registry.initialize() const value = registration(registry.paths().socketDir, { updatedAt: new Date(Date.now() - 60_000).toISOString(), }) await registry.write(value) const transport: PeerTransport = { + kind: 'unix', + createAddressHint: vi.fn(), + validateAddress: () => true, listen: vi.fn() as never, request: vi.fn(async () => { throw new Error('PEER_TIMEOUT') @@ -310,10 +356,13 @@ describe('owner-only peer registry', () => { }) it('honors the overall listLive deadline and caller abort', async () => { - const registry = createPeerRegistry() + const registry = createTestRegistry() await registry.initialize() for (let index = 0; index < 20; index++) await registry.write(registration(registry.paths().socketDir)) const transport: PeerTransport = { + kind: 'unix', + createAddressHint: vi.fn(), + validateAddress: () => true, listen: vi.fn() as never, request: ({ signal }) => new Promise((_, reject) => diff --git a/packages/core/tests/peer-service-sanitize.test.ts b/packages/core/tests/peer-service-sanitize.test.ts index d2307b6..3c893b0 100644 --- a/packages/core/tests/peer-service-sanitize.test.ts +++ b/packages/core/tests/peer-service-sanitize.test.ts @@ -57,9 +57,16 @@ describe('peer service terminal sanitization', () => { paths: () => ({ registryDir: '/runtime/peers', socketDir: '/runtime/sockets' }), } const transport: PeerTransport = { + kind: 'unix', + createAddressHint: () => '/runtime/receiver.sock', + validateAddress: () => true, listen: vi.fn(async (options) => { onRequest = options.onRequest - return { address: options.address, close: vi.fn(async () => {}) } + return { + address: options.address, + closed: new Promise<{ expected: boolean }>(() => {}), + close: vi.fn(async () => {}), + } }), request: vi.fn(async () => { throw new Error('not used') diff --git a/packages/core/tests/peer-service.test.ts b/packages/core/tests/peer-service.test.ts index fcb465b..065d096 100644 --- a/packages/core/tests/peer-service.test.ts +++ b/packages/core/tests/peer-service.test.ts @@ -273,7 +273,7 @@ describeUnix('PeerService over real Unix domain sockets', () => { const realTransport = createUnixSocketTransport() let stalledAttempts = 0 const receiverTransport: PeerTransport = { - listen: (options) => realTransport.listen(options), + ...realTransport, request: async (options) => { if ( options.frame.type !== 'delivery-update' || @@ -282,7 +282,7 @@ describeUnix('PeerService over real Unix domain sockets', () => { return realTransport.request(options) } stalledAttempts++ - return new Promise(() => {}) + return new Promise(() => {}) }, } const receiver = await startPeer('receiver', 'hold', { transport: receiverTransport }) @@ -363,7 +363,14 @@ describeUnix('PeerService over real Unix domain sockets', () => { } const close = vi.fn(async () => {}) const transport: PeerTransport = { - listen: vi.fn(async (options) => ({ address: options.address, close })), + kind: 'unix', + createAddressHint: () => testHome, + validateAddress: () => true, + listen: vi.fn(async (options) => ({ + address: options.address, + closed: new Promise<{ expected: boolean }>(() => {}), + close, + })), request: vi.fn(), } const service = createPeerService({ enabled: true, name: 'late-start', registry, transport }) @@ -382,6 +389,40 @@ describeUnix('PeerService over real Unix domain sockets', () => { expect(close).not.toHaveBeenCalled() }) + it('fails closed and removes registration after an unexpected transport exit', async () => { + const removeOwn = vi.fn(async () => true) + const registry: PeerRegistry = { + initialize: vi.fn(async () => {}), + write: vi.fn(), + read: vi.fn(async () => null), + listCandidates: vi.fn(async () => ({ candidates: [], scanned: 0, rejected: 0, truncated: false })), + listLive: vi.fn(async () => ({ peers: [], registrations: [], partial: false })), + removeOwn, + cleanupConfirmedDead: vi.fn(async () => false), + paths: () => ({ registryDir: testHome, socketDir: testHome }), + } + let closeUnexpectedly!: (result: { expected: boolean; reason?: string }) => void + const closed = new Promise<{ expected: boolean; reason?: string }>((resolve) => { + closeUnexpectedly = resolve + }) + const transport: PeerTransport = { + kind: 'unix', + createAddressHint: () => testHome, + validateAddress: () => true, + listen: vi.fn(async (options) => ({ address: options.address, closed, close: vi.fn(async () => {}) })), + request: vi.fn(), + } + const service = createPeerService({ enabled: true, name: 'crashed-transport', registry, transport }) + services.push(service) + await service.start() + expect(service.isAvailable()).toBe(true) + + closeUnexpectedly({ expected: false, reason: 'listener crashed' }) + await vi.waitFor(() => expect(service.isAvailable()).toBe(false)) + await vi.waitFor(() => expect(removeOwn).toHaveBeenCalledWith(service.identity!.instanceId)) + expect(service.getUnavailableReason()).toBe('listener crashed') + }) + it('closes a listener that resolves after shutdown invalidates startup', async () => { const registry: PeerRegistry = { initialize: vi.fn(async () => {}), @@ -399,10 +440,13 @@ describeUnix('PeerService over real Unix domain sockets', () => { const listenGate = new Promise((resolve) => (releaseListen = resolve)) const close = vi.fn(async () => {}) const transport: PeerTransport = { + kind: 'unix', + createAddressHint: () => testHome, + validateAddress: () => true, listen: vi.fn(async (options) => { signalListen() await listenGate - return { address: options.address, close } + return { address: options.address, closed: new Promise<{ expected: boolean }>(() => {}), close } }), request: vi.fn(), } @@ -438,11 +482,14 @@ describeUnix('PeerService over real Unix domain sockets', () => { const close = vi.fn(async () => {}) let receivedSignal: AbortSignal | undefined const transport: PeerTransport = { + kind: 'unix', + createAddressHint: () => testHome, + validateAddress: () => true, listen: vi.fn(async (options) => { receivedSignal = options.signal signalListen() await listenGate - return { address: options.address, close } + return { address: options.address, closed: new Promise<{ expected: boolean }>(() => {}), close } }), request: vi.fn(), } @@ -488,7 +535,14 @@ describeUnix('PeerService over real Unix domain sockets', () => { } const close = vi.fn(async () => {}) const transport: PeerTransport = { - listen: vi.fn(async (options) => ({ address: options.address, close })), + kind: 'unix', + createAddressHint: () => testHome, + validateAddress: () => true, + listen: vi.fn(async (options) => ({ + address: options.address, + closed: new Promise<{ expected: boolean }>(() => {}), + close, + })), request: vi.fn(), } const service = createPeerService({ enabled: true, name: 'aborted-registration', registry, transport }) @@ -524,7 +578,7 @@ describeUnix('PeerService over real Unix domain sockets', () => { const realTransport = createUnixSocketTransport() let dropFirstMessageAck = true const ackDroppingTransport: PeerTransport = { - listen: (options) => realTransport.listen(options), + ...realTransport, request: async (options) => { const response = await realTransport.request(options) if (dropFirstMessageAck && options.frame.type === 'message') { diff --git a/packages/core/tests/windows-native-artifacts.test.ts b/packages/core/tests/windows-native-artifacts.test.ts new file mode 100644 index 0000000..f4bb898 --- /dev/null +++ b/packages/core/tests/windows-native-artifacts.test.ts @@ -0,0 +1,93 @@ +import { afterEach, beforeEach, describe, expect, it } from 'vitest' + +import { createHash } from 'node:crypto' +import fs from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' + +import { resolveWindowsPeerBrokerArtifact } from '../src/peers/windows-peer-broker-artifact.js' + +interface ManifestEntry { + file: string + protocolVersion: number + sha256: string + sourceSha256: string +} + +interface NativeManifest { + manifestVersion: number + artifacts: Record<'x64' | 'arm64', Record<'shellSupervisor' | 'peerBroker', ManifestEntry>> +} + +const nativeRoot = path.resolve('packages/core/dist/native/windows') +let testRoot = '' + +beforeEach(async () => { + testRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'x-code-native-artifacts-')) + await fs.cp(nativeRoot, testRoot, { recursive: true }) +}) + +afterEach(async () => { + await fs.rm(testRoot, { recursive: true, force: true }) +}) + +async function readManifest(root = testRoot): Promise { + return JSON.parse(await fs.readFile(path.join(root, 'manifest.json'), 'utf8')) as NativeManifest +} + +async function writeManifest(manifest: NativeManifest): Promise { + await fs.writeFile(path.join(testRoot, 'manifest.json'), JSON.stringify(manifest), 'utf8') +} + +describe('Windows native artifacts', () => { + it('packages both independently traceable helpers for x64 and arm64', async () => { + const manifest = await readManifest(nativeRoot) + expect(manifest.manifestVersion).toBe(2) + for (const arch of ['x64', 'arm64'] as const) { + for (const artifactName of ['shellSupervisor', 'peerBroker'] as const) { + const artifact = manifest.artifacts[arch][artifactName] + const bytes = await fs.readFile(path.join(nativeRoot, artifact.file)) + expect(createHash('sha256').update(bytes).digest('hex')).toBe(artifact.sha256) + expect(artifact.sourceSha256).toMatch(/^[a-f0-9]{64}$/) + } + expect(manifest.artifacts[arch].shellSupervisor.protocolVersion).toBe(2) + expect(manifest.artifacts[arch].peerBroker.protocolVersion).toBe(1) + } + expect(manifest.artifacts.x64.shellSupervisor.sourceSha256).not.toBe(manifest.artifacts.x64.peerBroker.sourceSha256) + }) + + it('validates protocol, path, hash, and PE architecture before launching a broker', async () => { + await expect(resolveWindowsPeerBrokerArtifact('x64', testRoot)).resolves.toMatchObject({ protocolVersion: 1 }) + await expect(resolveWindowsPeerBrokerArtifact('arm64', testRoot)).resolves.toMatchObject({ protocolVersion: 1 }) + + const protocol = await readManifest() + protocol.artifacts.x64.peerBroker.protocolVersion = 2 + await writeManifest(protocol) + await expect(resolveWindowsPeerBrokerArtifact('x64', testRoot)).rejects.toMatchObject({ + name: 'PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH', + }) + + const escaped = await readManifest(nativeRoot) + escaped.artifacts.x64.peerBroker.file = '../outside.exe' + await writeManifest(escaped) + await expect(resolveWindowsPeerBrokerArtifact('x64', testRoot)).rejects.toMatchObject({ + name: 'PEER_WINDOWS_HELPER_HASH_MISMATCH', + }) + + const wrongArchitecture = await readManifest(nativeRoot) + const armBytes = await fs.readFile(path.join(nativeRoot, wrongArchitecture.artifacts.arm64.peerBroker.file)) + const x64Path = path.join(testRoot, wrongArchitecture.artifacts.x64.peerBroker.file) + await fs.writeFile(x64Path, armBytes) + wrongArchitecture.artifacts.x64.peerBroker.sha256 = createHash('sha256').update(armBytes).digest('hex') + await writeManifest(wrongArchitecture) + await expect(resolveWindowsPeerBrokerArtifact('x64', testRoot)).rejects.toMatchObject({ + name: 'PEER_WINDOWS_HELPER_HASH_MISMATCH', + }) + }) + + it('fails closed for unsupported Windows architectures', async () => { + await expect(resolveWindowsPeerBrokerArtifact('ia32', testRoot)).rejects.toMatchObject({ + name: 'PEER_WINDOWS_UNSUPPORTED_ARCH', + }) + }) +}) diff --git a/packages/core/tests/windows-peer-broker-protocol.test.ts b/packages/core/tests/windows-peer-broker-protocol.test.ts new file mode 100644 index 0000000..d94b7ac --- /dev/null +++ b/packages/core/tests/windows-peer-broker-protocol.test.ts @@ -0,0 +1,117 @@ +import { + WINDOWS_PEER_BROKER_HEADER_BYTES, + WINDOWS_PEER_BROKER_MAX_PAYLOAD_BYTES, + WindowsPeerBrokerFrameDecoder, + WindowsPeerBrokerFrameKind, + decodeCancelAckPayload, + decodeInboundRequestPayload, + decodeOneStringPayload, + decodeOperationErrorPayload, + decodePeerFramePayload, + encodeOutboundRequestPayload, + encodePeerFramePayload, + encodeStartServerPayload, + encodeWindowsPeerBrokerFrame, +} from '../src/peers/windows-peer-broker-protocol.js' + +function frame(kind = WindowsPeerBrokerFrameKind.OutboundResponse, payload = Buffer.from('payload')): Buffer { + return encodeWindowsPeerBrokerFrame({ kind, operationId: 7, payload }) +} + +describe('Windows peer broker protocol', () => { + it('decodes every fragmentation boundary and merged frames', () => { + const encoded = frame() + for (let split = 1; split < encoded.length; split++) { + const decoder = new WindowsPeerBrokerFrameDecoder() + expect(decoder.push(encoded.subarray(0, split))).toEqual([]) + expect(decoder.push(encoded.subarray(split))).toEqual([ + { kind: WindowsPeerBrokerFrameKind.OutboundResponse, operationId: 7, payload: Buffer.from('payload') }, + ]) + expect(() => decoder.finish()).not.toThrow() + } + + const decoder = new WindowsPeerBrokerFrameDecoder() + expect(decoder.push(Buffer.concat([encoded, encoded]))).toHaveLength(2) + }) + + it('rejects malformed headers, flags, versions, lengths, and truncated EOF', () => { + const valid = frame() + for (const mutate of [ + (bytes: Buffer) => (bytes[0] = 0), + (bytes: Buffer) => (bytes[4] = 2), + (bytes: Buffer) => (bytes[5] = 0x40), + (bytes: Buffer) => (bytes[6] = 1), + (bytes: Buffer) => bytes.writeUInt32LE(WINDOWS_PEER_BROKER_MAX_PAYLOAD_BYTES + 1, 12), + ]) { + const bytes = Buffer.from(valid) + mutate(bytes) + expect(() => new WindowsPeerBrokerFrameDecoder().push(bytes)).toThrow() + } + + const decoder = new WindowsPeerBrokerFrameDecoder() + decoder.push(valid.subarray(0, WINDOWS_PEER_BROKER_HEADER_BYTES - 1)) + expect(() => decoder.finish()).toThrow('Truncated') + }) + + it('locks the exact control payload boundary', () => { + expect(() => + encodeWindowsPeerBrokerFrame({ + kind: WindowsPeerBrokerFrameKind.OutboundResponse, + operationId: 1, + payload: Buffer.alloc(WINDOWS_PEER_BROKER_MAX_PAYLOAD_BYTES), + }), + ).not.toThrow() + expect(() => + encodeWindowsPeerBrokerFrame({ + kind: WindowsPeerBrokerFrameKind.OutboundResponse, + operationId: 1, + payload: Buffer.alloc(WINDOWS_PEER_BROKER_MAX_PAYLOAD_BYTES + 1), + }), + ).toThrow('payload limit') + }) + + it('encodes fixed payload layouts and rejects suffixes and invalid UTF-8', () => { + const start = encodeStartServerPayload({ + namespaceId: '0123456789ab', + instanceId: '12345678-1234-4234-8234-123456789abc', + inboxToken: 'a'.repeat(43), + }) + expect(start.readUInt16LE(0)).toBe(12) + expect(start.subarray(2, 14).toString()).toBe('0123456789ab') + + const outbound = encodeOutboundRequestPayload({ + address: '\\\\.\\pipe\\x-code-peer-v1-0123456789ab-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + targetToken: 'b'.repeat(43), + senderInstanceId: '12345678-1234-4234-8234-123456789abc', + timeoutMs: 3_000, + peerFrame: Buffer.from('{"v":1}\n'), + }) + expect(outbound.length).toBeGreaterThan(100) + + const inbound = Buffer.concat([ + Buffer.from([36, 0]), + Buffer.from('12345678-1234-4234-8234-123456789abc'), + encodePeerFramePayload(Buffer.from('frame')), + ]) + expect(decodeInboundRequestPayload(inbound)).toEqual({ + senderInstanceId: '12345678-1234-4234-8234-123456789abc', + peerFrame: Buffer.from('frame'), + }) + expect(decodePeerFramePayload(encodePeerFramePayload(Buffer.from('frame')))).toEqual(Buffer.from('frame')) + expect(() => decodeOneStringPayload(Buffer.from([2, 0, 0xc3, 0x28]))).toThrow('UTF-8') + expect(() => decodeOneStringPayload(Buffer.from([1, 0, 0x61, 0x00]))).toThrow('suffix') + }) + + it('decodes stable operation errors and cancel acknowledgements', () => { + const errorPayload = Buffer.concat([ + Buffer.from([15, 0]), + Buffer.from('PEER_TEST_ERROR'), + Buffer.from([7, 0]), + Buffer.from('failure'), + ]) + expect(decodeOperationErrorPayload(errorPayload)).toEqual({ code: 'PEER_TEST_ERROR', message: 'failure' }) + expect(decodeCancelAckPayload(Buffer.from([0]))).toBe('canceled') + expect(decodeCancelAckPayload(Buffer.from([1]))).toBe('too-late') + expect(() => decodeCancelAckPayload(Buffer.from([2]))).toThrow('invalid cancel') + }) +}) diff --git a/packages/core/tests/windows-peer-transport.test.ts b/packages/core/tests/windows-peer-transport.test.ts new file mode 100644 index 0000000..297594f --- /dev/null +++ b/packages/core/tests/windows-peer-transport.test.ts @@ -0,0 +1,317 @@ +import { type ChildProcessWithoutNullStreams, spawn } from 'node:child_process' +import { randomUUID } from 'node:crypto' +import net from 'node:net' +import { setTimeout as delay } from 'node:timers/promises' + +import { createPeerIdentity } from '../src/peers/identity.js' +import { createPeerRegistry } from '../src/peers/registry.js' +import { createPeerService } from '../src/peers/service.js' +import { createWindowsNamedPipeTransport } from '../src/peers/windows-named-pipe-transport.js' +import { resolveWindowsPeerBrokerArtifact } from '../src/peers/windows-peer-broker-artifact.js' +import { + WindowsPeerBrokerFrameDecoder, + WindowsPeerBrokerFrameKind, + decodeOneStringPayload, + encodeStartServerPayload, + encodeWindowsPeerBrokerFrame, +} from '../src/peers/windows-peer-broker-protocol.js' + +const describeWindows = process.platform === 'win32' ? describe : describe.skip + +describeWindows('Windows named pipe peer transport', () => { + it('discovers and sends between two real broker-backed services', async () => { + const suffix = Date.now().toString(36) + const sender = createPeerService({ enabled: true, name: `windows-sender-${suffix}` }) + const receiver = createPeerService({ enabled: true, name: `windows-receiver-${suffix}` }) + try { + await sender.start() + await receiver.start() + expect(sender.isAvailable()).toBe(true) + expect(receiver.isAvailable()).toBe(true) + const peers = await sender.listAgents() + expect(peers.some((peer) => peer.address === receiver.identity!.address)).toBe(true) + await expect( + sender.sendMessage(receiver.identity!.address, 'Windows transport integration'), + ).resolves.toMatchObject({ + success: true, + status: 'delivered', + }) + } finally { + await Promise.all([sender.shutdown(), receiver.shutdown()]) + } + }) + + it('rejects a wrong token before dispatching to Node', async () => { + const senderRegistry = createPeerRegistry() + const receiverRegistry = createPeerRegistry() + await Promise.all([senderRegistry.initialize(), receiverRegistry.initialize()]) + const sender = createPeerIdentity({ name: 'transport-sender' }) + const receiver = createPeerIdentity({ name: 'transport-receiver' }) + const senderTransport = createWindowsNamedPipeTransport({ getRuntimePaths: () => senderRegistry.paths() }) + const receiverTransport = createWindowsNamedPipeTransport({ getRuntimePaths: () => receiverRegistry.paths() }) + let dispatches = 0 + const senderServer = await senderTransport.listen({ + address: senderTransport.createAddressHint(sender.instanceId), + instanceId: sender.instanceId, + inboxToken: sender.inboxToken, + onRequest: async () => ({ v: 1, type: 'error', code: 'PEER_TEST', message: 'unexpected' }), + }) + const receiverServer = await receiverTransport.listen({ + address: receiverTransport.createAddressHint(receiver.instanceId), + instanceId: receiver.instanceId, + inboxToken: receiver.inboxToken, + onRequest: async (frame) => { + dispatches++ + return frame + }, + }) + try { + await expect( + senderTransport.request({ + address: receiverServer.address, + targetToken: 'x'.repeat(43), + senderInstanceId: sender.instanceId, + frame: { v: 1, type: 'ping', requestId: randomUUID() }, + timeoutMs: 1_000, + }), + ).rejects.toMatchObject({ name: 'PEER_WINDOWS_PIPE_IO_FAILED' }) + expect(dispatches).toBe(0) + } finally { + await Promise.all([senderServer.close(), receiverServer.close()]) + } + }) + + it('propagates abort and bounds shutdown while an inbound callback remains active', async () => { + const senderRegistry = createPeerRegistry() + const receiverRegistry = createPeerRegistry() + await Promise.all([senderRegistry.initialize(), receiverRegistry.initialize()]) + const sender = createPeerIdentity({ name: 'abort-sender' }) + const receiver = createPeerIdentity({ name: 'abort-receiver' }) + const senderTransport = createWindowsNamedPipeTransport({ getRuntimePaths: () => senderRegistry.paths() }) + const receiverTransport = createWindowsNamedPipeTransport({ getRuntimePaths: () => receiverRegistry.paths() }) + let dispatched = false + const senderServer = await senderTransport.listen({ + address: senderTransport.createAddressHint(sender.instanceId), + instanceId: sender.instanceId, + inboxToken: sender.inboxToken, + onRequest: async () => ({ v: 1, type: 'error', code: 'PEER_TEST', message: 'unexpected' }), + }) + const receiverServer = await receiverTransport.listen({ + address: receiverTransport.createAddressHint(receiver.instanceId), + instanceId: receiver.instanceId, + inboxToken: receiver.inboxToken, + onRequest: async () => { + dispatched = true + return new Promise(() => {}) + }, + }) + const controller = new AbortController() + const request = senderTransport.request({ + address: receiverServer.address, + targetToken: receiver.inboxToken, + senderInstanceId: sender.instanceId, + frame: { v: 1, type: 'ping', requestId: randomUUID() }, + timeoutMs: 5_000, + signal: controller.signal, + }) + while (!dispatched) await delay(5) + controller.abort() + await expect(request).rejects.toMatchObject({ name: 'AbortError' }) + const startedAt = Date.now() + await Promise.all([senderServer.close({ deadlineMs: 300 }), receiverServer.close({ deadlineMs: 300 })]) + expect(Date.now() - startedAt).toBeLessThan(1_500) + }) + + it('exits and releases its pipe when the parent stdin channel reaches EOF', async () => { + const registry = createPeerRegistry() + await registry.initialize() + const identity = createPeerIdentity({ name: 'parent-eof' }) + const artifact = await resolveWindowsPeerBrokerArtifact() + const child = spawn(artifact.executablePath, ['broker', '--protocol', '1'], { + stdio: ['pipe', 'pipe', 'pipe'], + windowsHide: true, + }) + const decoder = new WindowsPeerBrokerFrameDecoder() + const address = await new Promise((resolve, reject) => { + child.once('error', reject) + child.once('exit', () => reject(new Error('broker exited before SERVER_READY'))) + child.stdout.on('data', (chunk: Buffer) => { + try { + for (const frame of decoder.push(chunk)) { + if (frame.kind === WindowsPeerBrokerFrameKind.ServerReady) resolve(decodeOneStringPayload(frame.payload)) + } + } catch (error) { + reject(error) + } + }) + child.stdin.write( + encodeWindowsPeerBrokerFrame({ + kind: WindowsPeerBrokerFrameKind.StartServer, + operationId: 1, + payload: encodeStartServerPayload({ + namespaceId: registry.paths().namespaceId!, + instanceId: identity.instanceId, + inboxToken: identity.inboxToken, + }), + }), + ) + }) + const exited = new Promise((resolve) => child.once('exit', () => resolve())) + child.stdin.end() + await Promise.race([ + exited, + delay(2_000).then(() => { + child.kill() + throw new Error('broker did not exit after parent EOF') + }), + ]) + await expect( + new Promise((resolve, reject) => { + const socket = net.connect(address) + socket.once('connect', () => { + socket.destroy() + reject(new Error('released peer pipe remained connectable')) + }) + socket.once('error', () => resolve()) + }), + ).resolves.toBeUndefined() + }) + + it('reports an unexpected broker exit through server.closed', async () => { + const registry = createPeerRegistry() + await registry.initialize() + const children: ChildProcessWithoutNullStreams[] = [] + const spawnBroker: typeof spawn = ((command, args, options) => { + const child = spawn(command, args ?? [], options as never) as ChildProcessWithoutNullStreams + children.push(child) + return child + }) as typeof spawn + const identity = createPeerIdentity({ name: 'crash-receiver' }) + const transport = createWindowsNamedPipeTransport({ getRuntimePaths: () => registry.paths(), spawnBroker }) + const server = await transport.listen({ + address: transport.createAddressHint(identity.instanceId), + instanceId: identity.instanceId, + inboxToken: identity.inboxToken, + onRequest: async (frame) => frame, + }) + expect(children).toHaveLength(1) + children[0]!.kill() + await expect(server.closed).resolves.toMatchObject({ expected: false }) + }) + + it('fails the service closed and removes its registration after a broker crash', async () => { + const registry = createPeerRegistry() + const children: ChildProcessWithoutNullStreams[] = [] + const spawnBroker: typeof spawn = ((command, args, options) => { + const child = spawn(command, args ?? [], options as never) as ChildProcessWithoutNullStreams + children.push(child) + return child + }) as typeof spawn + const transport = createWindowsNamedPipeTransport({ getRuntimePaths: () => registry.paths(), spawnBroker }) + const service = createPeerService({ + enabled: true, + name: `crash-cleanup-${Date.now().toString(36)}`, + registry, + transport, + }) + try { + await service.start() + expect(service.isAvailable()).toBe(true) + await expect(registry.read(service.identity!.instanceId)).resolves.not.toBeNull() + expect(children).toHaveLength(1) + + children[0]!.kill() + await vi.waitFor(() => expect(service.isAvailable()).toBe(false)) + await vi.waitFor(async () => expect(await registry.read(service.identity!.instanceId)).toBeNull()) + expect(service.getUnavailableReason()).toBeTruthy() + } finally { + await service.shutdown() + } + }) + + it('does not leak operation capacity after local encoding failures or missing cancel acknowledgements', async () => { + const namespaceId = '0123456789ab' + const fakeBroker = String.raw` + let buffered = Buffer.alloc(0) + process.stdin.on('data', (chunk) => { + buffered = Buffer.concat([buffered, chunk]) + while (buffered.length >= 16) { + const payloadLength = buffered.readUInt32LE(12) + const frameLength = 16 + payloadLength + if (buffered.length < frameLength) return + const kind = buffered[5] + const payload = buffered.subarray(16, frameLength) + buffered = buffered.subarray(frameLength) + if (kind !== 2) continue + const namespaceLength = payload.readUInt16LE(0) + const namespace = payload.subarray(2, 2 + namespaceLength).toString('utf8') + const address = '\\\\.\\pipe\\x-code-peer-v1-' + namespace + '-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + const addressBytes = Buffer.from(address) + const responsePayload = Buffer.allocUnsafe(2 + addressBytes.length) + responsePayload.writeUInt16LE(addressBytes.length) + addressBytes.copy(responsePayload, 2) + const response = Buffer.allocUnsafe(16 + responsePayload.length) + response.write('XCPB') + response[4] = 1 + response[5] = 0x82 + response.writeUInt16LE(0, 6) + response.writeUInt32LE(0, 8) + response.writeUInt32LE(responsePayload.length, 12) + responsePayload.copy(response, 16) + process.stdout.write(response) + } + }) + ` + const spawnBroker = (() => + spawn(process.execPath, ['-e', fakeBroker], { + stdio: ['pipe', 'pipe', 'pipe'], + windowsHide: true, + }) as ChildProcessWithoutNullStreams) as unknown as typeof spawn + const transport = createWindowsNamedPipeTransport({ + getRuntimePaths: () => ({ namespaceId }), + artifact: { executablePath: process.execPath, protocolVersion: 1, sha256: '0'.repeat(64) }, + spawnBroker, + }) + const identity = createPeerIdentity({ name: 'bounded-operation-client' }) + const server = await transport.listen({ + address: namespaceId, + instanceId: identity.instanceId, + inboxToken: identity.inboxToken, + onRequest: async (frame) => frame, + }) + const request = (signal?: AbortSignal, targetToken = identity.inboxToken) => + transport.request({ + address: server.address, + targetToken, + senderInstanceId: identity.instanceId, + frame: { v: 1, type: 'ping', requestId: randomUUID() }, + timeoutMs: 60_000, + signal, + }) + + try { + for (let index = 0; index < 300; index++) { + await expect(request(undefined, 'x'.repeat(65_536))).rejects.toMatchObject({ + name: 'PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH', + }) + } + + vi.useFakeTimers() + for (let index = 0; index < 256; index++) { + const controller = new AbortController() + const pending = request(controller.signal) + controller.abort() + await expect(pending).rejects.toMatchObject({ name: 'AbortError' }) + } + await expect(request()).rejects.toMatchObject({ name: 'PEER_WINDOWS_OPERATION_CAPACITY' }) + await vi.advanceTimersByTimeAsync(5_001) + const recoveredController = new AbortController() + const recovered = request(recoveredController.signal) + recoveredController.abort() + await expect(recovered).rejects.toMatchObject({ name: 'AbortError' }) + } finally { + vi.useRealTimers() + await server.close({ deadlineMs: 0 }) + } + }) +}) diff --git a/scripts/check-package-size.mjs b/scripts/check-package-size.mjs index f628571..cf11388 100644 --- a/scripts/check-package-size.mjs +++ b/scripts/check-package-size.mjs @@ -5,11 +5,18 @@ import { resolve } from 'node:path' const MIB = 1024 * 1024 const limits = { packed: 3.5 * MIB, - unpacked: 12 * MIB, - files: 40, + unpacked: 12.75 * MIB, + files: 42, } const cliPackage = JSON.parse(readFileSync(resolve('packages/cli/package.json'), 'utf8')) const requiredRuntimeDependencies = ['@vscode/ripgrep', 'fs-ext-extra-prebuilt', 'undici'] +const requiredNativeArtifacts = [ + 'dist/native/windows/x64/xc-shell-supervisor.exe', + 'dist/native/windows/x64/xc-peer-broker.exe', + 'dist/native/windows/arm64/xc-shell-supervisor.exe', + 'dist/native/windows/arm64/xc-peer-broker.exe', +] +const nativeArtifactLimit = 0.4 * MIB const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm' const result = spawnSync(npm, ['pack', './packages/cli', '--dry-run', '--ignore-scripts', '--json'], { @@ -48,6 +55,15 @@ for (const dependency of requiredRuntimeDependencies) { violations.push(`required runtime dependency is not declared: ${dependency}`) } } +for (const artifactPath of requiredNativeArtifacts) { + const artifact = files.find((file) => file.path === artifactPath) + if (!artifact) violations.push(`required native artifact is missing: ${artifactPath}`) + else if (Number(artifact.size) > nativeArtifactLimit) { + violations.push( + `native artifact ${artifactPath} size ${formatBytes(Number(artifact.size))} exceeds ${formatBytes(nativeArtifactLimit)}`, + ) + } +} if (!Number.isFinite(packedSize) || packedSize > limits.packed) { violations.push(`packed size ${formatBytes(packedSize)} exceeds ${formatBytes(limits.packed)}`) From 9dff22a627257a4d02c538e330e6d064cd4733a5 Mon Sep 17 00:00:00 2001 From: woai3c <411020382@qq.com> Date: Fri, 28 Aug 2026 23:51:17 +0800 Subject: [PATCH 2/8] fix: secure Windows peer runtime ownership --- packages/cli/tests/pty/tui-clear.test.ts | 1 + .../prebuilt/windows/arm64/xc-peer-broker.exe | Bin 279552 -> 282112 bytes .../native/prebuilt/windows/manifest.json | 8 ++--- .../prebuilt/windows/x64/xc-peer-broker.exe | Bin 300544 -> 301056 bytes .../native/windows-peer-broker/src/pipe.rs | 2 +- .../windows-peer-broker/src/runtime_acl.rs | 7 ++-- .../windows-peer-broker/src/security.rs | 31 ++++++++++++++++-- packages/core/tests/file-ingest.test.ts | 12 +------ packages/core/tests/pdf-ingest.test.ts | 16 +++++++++ 9 files changed, 56 insertions(+), 21 deletions(-) diff --git a/packages/cli/tests/pty/tui-clear.test.ts b/packages/cli/tests/pty/tui-clear.test.ts index 32fc1f3..54ba5ce 100644 --- a/packages/cli/tests/pty/tui-clear.test.ts +++ b/packages/cli/tests/pty/tui-clear.test.ts @@ -39,6 +39,7 @@ describe('TUI /clear behavior', () => { await harness.waitForScreen( (screen) => !screen.includes('LINE-01') && !screen.includes('PowerShell(') && screen.includes('test-model'), 'viewport cleared after /clear', + 10_000, ) const lines = harness.screen() diff --git a/packages/core/native/prebuilt/windows/arm64/xc-peer-broker.exe b/packages/core/native/prebuilt/windows/arm64/xc-peer-broker.exe index 7cf479c1d1fd1654497a6641164e5a5eb2a8f00b..ddb53961c5e51fee30279cd93125a700028e06e6 100644 GIT binary patch literal 282112 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≶q=nK}e?@W2-r4tAT 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 sGS8S}?Y0kbpx2SV7bz#A+aD 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 Rm|_L3kQFWH|NcM!_a9+&`$hl& diff --git a/packages/core/native/prebuilt/windows/manifest.json b/packages/core/native/prebuilt/windows/manifest.json index 7ad6896..447175a 100644 --- a/packages/core/native/prebuilt/windows/manifest.json +++ b/packages/core/native/prebuilt/windows/manifest.json @@ -11,8 +11,8 @@ "peerBroker": { "file": "x64/xc-peer-broker.exe", "protocolVersion": 1, - "sha256": "33177bdde78c76162433dd21fb2a40800f817fa58f41791360558865b333dffd", - "sourceSha256": "4258b29c7b414c43373e802f779ea9d78c86da1086139b1dec95773e0946e78d" + "sha256": "4a4974d64501b7bcf843c41a378c28eef4fbf983fb67c601cfc8b6a5b50b30ec", + "sourceSha256": "3db7bed59484aa6aa06fa48e8de779393d27d40c372c35fe0f3d85f780f12f84" } }, "arm64": { @@ -25,8 +25,8 @@ "peerBroker": { "file": "arm64/xc-peer-broker.exe", "protocolVersion": 1, - "sha256": "e1608fa1537845064078568b7bb8840e8c7198ba83380d704416781ec7450c26", - "sourceSha256": "4258b29c7b414c43373e802f779ea9d78c86da1086139b1dec95773e0946e78d" + "sha256": "6ab738f7e6e5e6b948dac91db32edb6e452bf68243f77720f251d470d9bade82", + "sourceSha256": "3db7bed59484aa6aa06fa48e8de779393d27d40c372c35fe0f3d85f780f12f84" } } } diff --git a/packages/core/native/prebuilt/windows/x64/xc-peer-broker.exe b/packages/core/native/prebuilt/windows/x64/xc-peer-broker.exe index 9a422df404444a26d7c499cca9dd12c12e05a4c4..2ec29c14b9694fec3e7815893e88609fd6ae4bfb 100644 GIT binary patch delta 79040 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 kB5C7O{s#Ty6qI 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�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 Zsohb#r*>a$y7pMD*}l8`Cg*7A{{d|P-eCX$ delta 78647 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 diff --git a/packages/core/native/windows-peer-broker/src/pipe.rs b/packages/core/native/windows-peer-broker/src/pipe.rs index ef2a52f..39d8068 100644 --- a/packages/core/native/windows-peer-broker/src/pipe.rs +++ b/packages/core/native/windows-peer-broker/src/pipe.rs @@ -1127,7 +1127,7 @@ pub fn generate_pipe_name(namespace_id: &str) -> Result { fn base64url_192(bytes: &[u8; 24]) -> String { const ALPHABET: &[u8; 64] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; let mut output = [0u8; 32]; - for (chunk_index, chunk) in bytes.chunks_exact(3).enumerate() { + for (chunk_index, chunk) in bytes.as_chunks::<3>().0.iter().enumerate() { let value = ((chunk[0] as u32) << 16) | ((chunk[1] as u32) << 8) | chunk[2] as u32; let offset = chunk_index * 4; output[offset] = ALPHABET[((value >> 18) & 0x3f) as usize]; diff --git a/packages/core/native/windows-peer-broker/src/runtime_acl.rs b/packages/core/native/windows-peer-broker/src/runtime_acl.rs index 53b7523..94465a9 100644 --- a/packages/core/native/windows-peer-broker/src/runtime_acl.rs +++ b/packages/core/native/windows-peer-broker/src/runtime_acl.rs @@ -11,7 +11,7 @@ use windows_sys::Win32::Storage::FileSystem::{ FILE_NAME_NORMALIZED, FILE_READ_ATTRIBUTES, FILE_SHARE_DELETE, FILE_SHARE_READ, FILE_SHARE_WRITE, GetDriveTypeW, GetFileInformationByHandle, GetFinalPathNameByHandleW, GetVolumeInformationW, GetVolumePathNameW, OPEN_EXISTING, READ_CONTROL, VOLUME_NAME_GUID, - WRITE_DAC, + WRITE_DAC, WRITE_OWNER, }; use crate::security::{ @@ -144,7 +144,10 @@ fn ensure_private_directory( return Err(io::Error::from_raw_os_error(error as i32)); } } - let handle = open_directory_with_access(path, READ_CONTROL | WRITE_DAC | FILE_READ_ATTRIBUTES)?; + let handle = open_directory_with_access( + path, + READ_CONTROL | WRITE_DAC | WRITE_OWNER | FILE_READ_ATTRIBUTES, + )?; descriptor.apply_to_handle(handle.raw())?; verify_private_handle(handle.raw(), &identity.account_sid)?; Ok(handle) diff --git a/packages/core/native/windows-peer-broker/src/security.rs b/packages/core/native/windows-peer-broker/src/security.rs index ce1afba..dd6dbad 100644 --- a/packages/core/native/windows-peer-broker/src/security.rs +++ b/packages/core/native/windows-peer-broker/src/security.rs @@ -16,8 +16,8 @@ use windows_sys::Win32::Security::{ INHERIT_ONLY_ACE, InitializeAcl, InitializeSecurityDescriptor, IsValidSid, OBJECT_INHERIT_ACE, OWNER_SECURITY_INFORMATION, PROTECTED_DACL_SECURITY_INFORMATION, PSECURITY_DESCRIPTOR, PSID, SE_DACL_PROTECTED, SECURITY_ATTRIBUTES, SetKernelObjectSecurity, SetSecurityDescriptorControl, - SetSecurityDescriptorDacl, TOKEN_MANDATORY_LABEL, TOKEN_USER, TokenIntegrityLevel, - TokenIsAppContainer, TokenUser, WELL_KNOWN_SID_TYPE, + SetSecurityDescriptorDacl, SetSecurityDescriptorOwner, TOKEN_MANDATORY_LABEL, TOKEN_USER, + TokenIntegrityLevel, TokenIsAppContainer, TokenUser, WELL_KNOWN_SID_TYPE, }; use windows_sys::Win32::System::Threading::{CreateEventW, SetEvent, WaitForSingleObject}; @@ -277,6 +277,7 @@ pub fn constant_time_eq_43(left: &[u8], right: &[u8]) -> bool { pub struct PrivateSecurityDescriptor { descriptor: Vec, _acl: Vec, + _owner: Sid, } impl PrivateSecurityDescriptor { @@ -317,6 +318,10 @@ impl PrivateSecurityDescriptor { if unsafe { SetSecurityDescriptorDacl(descriptor_pointer, 1, acl_pointer, 0) } == 0 { return Err(io::Error::last_os_error()); } + let owner = account_sid.clone(); + if unsafe { SetSecurityDescriptorOwner(descriptor_pointer, owner.raw(), 0) } == 0 { + return Err(io::Error::last_os_error()); + } if unsafe { SetSecurityDescriptorControl(descriptor_pointer, SE_DACL_PROTECTED, SE_DACL_PROTECTED) } == 0 @@ -326,6 +331,7 @@ impl PrivateSecurityDescriptor { Ok(Self { descriptor, _acl: acl, + _owner: owner, }) } @@ -341,7 +347,9 @@ impl PrivateSecurityDescriptor { if unsafe { SetKernelObjectSecurity( handle, - DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION, + DACL_SECURITY_INFORMATION + | OWNER_SECURITY_INFORMATION + | PROTECTED_DACL_SECURITY_INFORMATION, self.descriptor.as_ptr() as PSECURITY_DESCRIPTOR, ) } == 0 @@ -683,4 +691,21 @@ mod tests { random_bytes(&mut bytes).unwrap(); assert_ne!(bytes, [0u8; 32]); } + + #[test] + fn private_descriptor_pins_the_account_as_owner() { + let identity = crate::process_peer::current_process_identity().unwrap(); + let descriptor = PrivateSecurityDescriptor::new(&identity.account_sid, true).unwrap(); + let descriptor_pointer = descriptor.descriptor.as_ptr() as PSECURITY_DESCRIPTOR; + let mut owner = null_mut(); + let mut owner_defaulted = 0; + assert_ne!( + unsafe { + GetSecurityDescriptorOwner(descriptor_pointer, &mut owner, &mut owner_defaulted) + }, + 0 + ); + assert!(identity.account_sid.equals_raw(owner)); + assert_eq!(owner_defaulted, 0); + } } diff --git a/packages/core/tests/file-ingest.test.ts b/packages/core/tests/file-ingest.test.ts index d1d5a5f..9192dd8 100644 --- a/packages/core/tests/file-ingest.test.ts +++ b/packages/core/tests/file-ingest.test.ts @@ -701,16 +701,6 @@ describe('ingestFile', () => { } }) - it('never emits a BOM-prefixed PDF as ordinary attachment text', async () => { - const disguised = path.join(tmpDir, 'bom-pdf.txt') - await fs.writeFile(disguised, Buffer.concat([Buffer.from([0xef, 0xbb, 0xbf]), Buffer.from('%PDF-1.4\n')])) - - const parts = await ingestFile({ raw: `@${disguised}`, absolutePath: disguised }, multimodalCaps) - - expect(JSON.stringify(parts)).not.toContain('%PDF-1.4') - expect(parts.every((part) => part.type === 'text')).toBe(true) - }) - // Regression: a multi-MB @path attachment used to be inlined verbatim, // pushing the user message past the model's context window before the // first turn could even start. Now we substitute a short hint that @@ -906,7 +896,7 @@ describe('buildUserContent', () => { if (!Array.isArray(result)) return expect(result.filter((part) => part.type === 'file')).toHaveLength(10) expect(JSON.stringify(result)).toContain('10-media-part limit') - }) + }, 15_000) it('counts Base64 expansion in the cumulative serialized attachment budget', async () => { const padded = addPngAncillaryChunk(await fs.readFile(imageFile), 3.5 * 1024 * 1024) diff --git a/packages/core/tests/pdf-ingest.test.ts b/packages/core/tests/pdf-ingest.test.ts index eaa23e3..d599433 100644 --- a/packages/core/tests/pdf-ingest.test.ts +++ b/packages/core/tests/pdf-ingest.test.ts @@ -4,6 +4,7 @@ import fs from 'node:fs/promises' import os from 'node:os' import path from 'node:path' +import { ingestFile } from '../src/agent/file-ingest.js' import { MAX_PDF_SOURCE_BYTES, extractPdfTextWithFallback, processPdf } from '../src/agent/pdf-ingest.js' import { createReadFileTool } from '../src/tools/read-file.js' import { makePdfBuffer } from './helpers/pdf.js' @@ -220,3 +221,18 @@ describe('readFile PDF integration', () => { expect(JSON.stringify(result)).not.toContain('application/pdf') }) }) + +describe('ingestFile PDF detection', () => { + it('never emits a BOM-prefixed PDF as ordinary attachment text', async () => { + const disguised = path.join(tempDir, 'bom-pdf.txt') + await fs.writeFile(disguised, Buffer.concat([Buffer.from([0xef, 0xbb, 0xbf]), Buffer.from('%PDF-1.4\n')])) + + const parts = await ingestFile( + { raw: `@${disguised}`, absolutePath: disguised }, + { image: true, pdf: true, audio: true, filesApi: true, toolImageTransport: 'tool-result' }, + ) + + expect(JSON.stringify(parts)).not.toContain('%PDF-1.4') + expect(parts.every((part) => part.type === 'text')).toBe(true) + }, 15_000) +}) From a0ebd905e08f655977f99ad9b74e9e462e2f3290 Mon Sep 17 00:00:00 2001 From: woai3c <411020382@qq.com> Date: Sat, 29 Aug 2026 00:49:50 +0800 Subject: [PATCH 3/8] fix: harden Windows peer messaging lifecycle --- .github/workflows/release.yml | 4 +- packages/cli/tests/pty/harness.ts | 4 +- .../prebuilt/windows/arm64/xc-peer-broker.exe | Bin 282112 -> 279040 bytes .../native/prebuilt/windows/manifest.json | 8 +- .../prebuilt/windows/x64/xc-peer-broker.exe | Bin 301056 -> 301056 bytes .../windows-peer-broker/src/lifecycle.rs | 34 ++++++- .../native/windows-peer-broker/src/pipe.rs | 33 ++++++- packages/core/scripts/build-native.mjs | 8 +- packages/core/scripts/native-artifacts.mjs | 47 +++++++++- .../core/scripts/write-native-manifest.mjs | 20 +++- packages/core/src/peers/registry.ts | 1 + .../src/peers/windows-named-pipe-transport.ts | 15 ++- .../peers/windows-peer-runtime-security.ts | 10 ++ packages/core/tests/file-lock.test.ts | 13 +-- packages/core/tests/peer-registry.test.ts | 1 + .../tests/windows-native-artifacts.test.ts | 32 +++++++ .../core/tests/windows-peer-transport.test.ts | 86 ++++++++++++++++++ vitest.config.ts | 1 + 18 files changed, 285 insertions(+), 32 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a32ddbd..13987f1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -78,7 +78,7 @@ jobs: path: packages/core/native/prebuilt/windows/arm64 - name: Generate native artifact hash manifest - run: node packages/core/scripts/write-native-manifest.mjs native/prebuilt/windows + run: node packages/core/scripts/write-native-manifest.mjs native/prebuilt/windows --all-current - run: pnpm install --frozen-lockfile @@ -121,7 +121,7 @@ jobs: path: packages/core/native/prebuilt/windows/arm64 - name: Generate native artifact hash manifest - run: node packages/core/scripts/write-native-manifest.mjs native/prebuilt/windows + run: node packages/core/scripts/write-native-manifest.mjs native/prebuilt/windows --all-current - run: pnpm install --frozen-lockfile diff --git a/packages/cli/tests/pty/harness.ts b/packages/cli/tests/pty/harness.ts index a5b6198..cf572f7 100644 --- a/packages/cli/tests/pty/harness.ts +++ b/packages/cli/tests/pty/harness.ts @@ -222,14 +222,14 @@ export async function createTuiHarness(options: { ? `& ${values.map(powershellQuote).join(' ')}; Write-Output "${EXIT_MARKER}$LASTEXITCODE"\r` : `${values.map(posixQuote).join(' ')}; __x_code_status=$?; printf '\\n${EXIT_MARKER}%s\\n' "$__x_code_status"\n` processUnderTest.write(command) - await waitFor(() => raw.includes('test-model'), 'CLI header', 10_000) + await waitFor(() => raw.includes('test-model'), 'CLI header', 20_000) await waitFor( async () => { await waitForRendered() return lastPromptLine(terminalScreen(terminal)) !== '' }, 'interactive input prompt', - 10_000, + 20_000, ) await waitForRendered() await waitForTerminalQuiet() diff --git a/packages/core/native/prebuilt/windows/arm64/xc-peer-broker.exe b/packages/core/native/prebuilt/windows/arm64/xc-peer-broker.exe index ddb53961c5e51fee30279cd93125a700028e06e6..4e1511fb2a66699250b1337bacf3a57e68163493 100644 GIT binary patch delta 85679 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

0odUF~z6h<11du?SQ94p_aF#SgB}gv2espVTvo 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 diff --git a/packages/core/native/prebuilt/windows/manifest.json b/packages/core/native/prebuilt/windows/manifest.json index 447175a..eb16e5b 100644 --- a/packages/core/native/prebuilt/windows/manifest.json +++ b/packages/core/native/prebuilt/windows/manifest.json @@ -11,8 +11,8 @@ "peerBroker": { "file": "x64/xc-peer-broker.exe", "protocolVersion": 1, - "sha256": "4a4974d64501b7bcf843c41a378c28eef4fbf983fb67c601cfc8b6a5b50b30ec", - "sourceSha256": "3db7bed59484aa6aa06fa48e8de779393d27d40c372c35fe0f3d85f780f12f84" + "sha256": "770b043c09a5658dfb56d1d1c6584d47d51bf34f31036c66acc51c453992a707", + "sourceSha256": "1a184729bf008ff374e869e41f354f59f83433986f2296daf32479c0c5f4253d" } }, "arm64": { @@ -25,8 +25,8 @@ "peerBroker": { "file": "arm64/xc-peer-broker.exe", "protocolVersion": 1, - "sha256": "6ab738f7e6e5e6b948dac91db32edb6e452bf68243f77720f251d470d9bade82", - "sourceSha256": "3db7bed59484aa6aa06fa48e8de779393d27d40c372c35fe0f3d85f780f12f84" + "sha256": "9031f7b8e130229a044d347a8cf74153be9a9f2e80c93c415d31f4f5366b7492", + "sourceSha256": "1a184729bf008ff374e869e41f354f59f83433986f2296daf32479c0c5f4253d" } } } diff --git a/packages/core/native/prebuilt/windows/x64/xc-peer-broker.exe b/packages/core/native/prebuilt/windows/x64/xc-peer-broker.exe index 2ec29c14b9694fec3e7815893e88609fd6ae4bfb..0243780351d6de9b2b722e070996abe6d62a2bcd 100644 GIT binary patch delta 52725 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 delta 52373 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 self.capacity { + if operation_id == 0 || self.active.len() >= self.capacity { return Err(RegisterError::Capacity); } self.active.insert( @@ -99,6 +99,9 @@ impl OperationBook { return false; } self.tombstones.push_back((operation_id, now)); + while self.tombstones.len() > self.capacity { + self.tombstones.pop_front(); + } true } @@ -121,6 +124,11 @@ impl OperationBook { self.active.len() } + #[cfg(test)] + pub fn tombstone_len(&self) -> usize { + self.tombstones.len() + } + fn purge(&mut self, now: Instant) { while self.tombstones.front().is_some_and(|(_, completed)| { now.saturating_duration_since(*completed) >= self.tombstone_ttl @@ -705,7 +713,7 @@ mod tests { } #[test] - fn duplicate_capacity_unknown_and_ttl_are_bounded() { + fn active_capacity_and_tombstones_are_bounded_independently() { let now = Instant::now(); let mut book = OperationBook::new(2, Duration::from_secs(1)); book.register(1, now).unwrap(); @@ -713,11 +721,29 @@ mod tests { book.register(2, now).unwrap(); assert_eq!(book.register(3, now), Err(RegisterError::Capacity)); assert!(book.complete(1, now)); - assert_eq!(book.register(3, now), Err(RegisterError::Capacity)); + book.register(3, now).unwrap(); + assert!(book.complete(2, now)); + assert!(book.complete(3, now)); + assert_eq!(book.tombstone_len(), 2); + book.register(4, now).unwrap(); assert_eq!(book.cancel(99, now), CancelDecision::Unknown); let later = now + Duration::from_secs(2); - book.register(3, later).unwrap(); + book.register(5, later).unwrap(); assert_eq!(book.cancel(1, later), CancelDecision::Unknown); } + + #[test] + fn rapid_successes_do_not_exhaust_active_capacity() { + let now = Instant::now(); + let mut book = OperationBook::new(256, Duration::from_secs(5)); + for operation_id in 1..=257 { + book.register(operation_id, now).unwrap(); + assert!(book.complete(operation_id, now)); + } + assert_eq!(book.active_len(), 0); + assert_eq!(book.tombstone_len(), 256); + assert_eq!(book.cancel(1, now), CancelDecision::Unknown); + assert_eq!(book.cancel(257, now), CancelDecision::TooLate); + } } diff --git a/packages/core/native/windows-peer-broker/src/pipe.rs b/packages/core/native/windows-peer-broker/src/pipe.rs index 39d8068..79996a3 100644 --- a/packages/core/native/windows-peer-broker/src/pipe.rs +++ b/packages/core/native/windows-peer-broker/src/pipe.rs @@ -8,9 +8,10 @@ use std::thread; use std::time::{Duration, Instant}; use windows_sys::Win32::Foundation::{ - ERROR_BROKEN_PIPE, ERROR_FILE_NOT_FOUND, ERROR_IO_PENDING, ERROR_NOT_FOUND, - ERROR_OPERATION_ABORTED, ERROR_PIPE_BUSY, ERROR_PIPE_CONNECTED, GENERIC_READ, GENERIC_WRITE, - GetLastError, HANDLE, INVALID_HANDLE_VALUE, WAIT_FAILED, WAIT_OBJECT_0, WAIT_TIMEOUT, + ERROR_BROKEN_PIPE, ERROR_FILE_NOT_FOUND, ERROR_IO_PENDING, ERROR_NO_DATA, ERROR_NOT_FOUND, + ERROR_OPERATION_ABORTED, ERROR_PIPE_BUSY, ERROR_PIPE_CONNECTED, ERROR_PIPE_NOT_CONNECTED, + GENERIC_READ, GENERIC_WRITE, GetLastError, HANDLE, INVALID_HANDLE_VALUE, WAIT_FAILED, + WAIT_OBJECT_0, WAIT_TIMEOUT, }; use windows_sys::Win32::Storage::FileSystem::{ CreateFileW, FILE_FLAG_FIRST_PIPE_INSTANCE, FILE_FLAG_OVERLAPPED, OPEN_EXISTING, @@ -235,6 +236,7 @@ fn run_listener( { return; } + Err(error) if abandoned_accept(&error) => continue, Err(error) => { handler.server_fatal(error); return; @@ -279,6 +281,13 @@ fn run_listener( } } +fn abandoned_accept(error: &PipeError) -> bool { + matches!( + error.os_code, + Some(code) if code == ERROR_NO_DATA as i32 || code == ERROR_PIPE_NOT_CONNECTED as i32 + ) +} + struct ActiveConnectionGuard(Arc); impl Drop for ActiveConnectionGuard { @@ -1163,6 +1172,24 @@ mod tests { self_test(&identity).unwrap(); } + #[test] + fn disconnected_accept_instances_are_recoverable() { + for code in [ERROR_NO_DATA, ERROR_PIPE_NOT_CONNECTED] { + let error = PipeError::os( + PipeErrorCode::Io, + "named pipe accept failed", + io::Error::from_raw_os_error(code as i32), + ); + assert!(abandoned_accept(&error)); + } + let fatal = PipeError::os( + PipeErrorCode::Io, + "named pipe accept failed", + io::Error::from_raw_os_error(ERROR_FILE_NOT_FOUND as i32), + ); + assert!(!abandoned_accept(&fatal)); + } + #[test] fn pipe_codec_rejects_bad_flags_kind_length_and_business_bounds() { let encoded = encode_pipe_frame(BUSINESS_REQUEST, b"test").unwrap(); diff --git a/packages/core/scripts/build-native.mjs b/packages/core/scripts/build-native.mjs index f9e152b..18d24ad 100644 --- a/packages/core/scripts/build-native.mjs +++ b/packages/core/scripts/build-native.mjs @@ -3,7 +3,7 @@ import fs from 'node:fs/promises' import path from 'node:path' import { fileURLToPath } from 'node:url' -import { WINDOWS_NATIVE_ARTIFACTS, writeWindowsNativeManifest } from './native-artifacts.mjs' +import { WINDOWS_NATIVE_ARTIFACTS, updateWindowsNativeManifest } from './native-artifacts.mjs' const coreDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..') @@ -56,7 +56,11 @@ async function main() { await fs.mkdir(destinationDir, { recursive: true }) await fs.copyFile(source, path.join(destinationDir, definition.file)) } - await writeWindowsNativeManifest(coreDir, destinationRoot) + await updateWindowsNativeManifest( + coreDir, + destinationRoot, + artifactNames.map((artifactName) => ({ arch: process.arch, artifactName })), + ) } await main() diff --git a/packages/core/scripts/native-artifacts.mjs b/packages/core/scripts/native-artifacts.mjs index fa7b0ac..b3f66d3 100644 --- a/packages/core/scripts/native-artifacts.mjs +++ b/packages/core/scripts/native-artifacts.mjs @@ -82,8 +82,33 @@ async function artifactSourceHashes(coreDir) { ) } -export async function writeWindowsNativeManifest(coreDir, windowsDir) { +function builtEntrySet(entries) { + if (!Array.isArray(entries) || entries.length === 0) { + throw new Error('Windows native manifest requires at least one explicitly built artifact') + } + const built = new Set() + for (const entry of entries) { + if (!WINDOWS_NATIVE_ARCHES.includes(entry?.arch) || !WINDOWS_NATIVE_ARTIFACTS[entry?.artifactName]) { + throw new Error(`Invalid Windows native build provenance: ${String(entry?.arch)}:${String(entry?.artifactName)}`) + } + built.add(`${entry.arch}:${entry.artifactName}`) + } + return built +} + +async function previousWindowsNativeManifest(windowsDir) { + try { + return JSON.parse(await fs.readFile(path.join(windowsDir, 'manifest.json'), 'utf8')) + } catch (error) { + if (error?.code === 'ENOENT') return undefined + throw error + } +} + +export async function updateWindowsNativeManifest(coreDir, windowsDir, builtEntries) { + const built = builtEntrySet(builtEntries) const sourceHashes = await artifactSourceHashes(coreDir) + const previous = await previousWindowsNativeManifest(windowsDir) const artifacts = {} for (const arch of WINDOWS_NATIVE_ARCHES) { artifacts[arch] = {} @@ -91,11 +116,27 @@ export async function writeWindowsNativeManifest(coreDir, windowsDir) { const file = `${arch}/${definition.file}` const bytes = await fs.readFile(path.join(windowsDir, file)) verifyPeArchitecture(bytes, arch, artifactName) + const sha256 = createHash('sha256').update(bytes).digest('hex') + let sourceSha256 + if (built.has(`${arch}:${artifactName}`)) { + sourceSha256 = sourceHashes[artifactName] + } else { + const previousEntry = previous?.artifacts?.[arch]?.[artifactName] + if ( + previousEntry?.file !== file || + previousEntry.protocolVersion !== definition.protocolVersion || + previousEntry.sha256 !== sha256 || + !/^[a-f0-9]{64}$/.test(previousEntry.sourceSha256 ?? '') + ) { + throw new Error(`Cannot preserve provenance for unbuilt Windows ${arch} ${artifactName}`) + } + sourceSha256 = previousEntry.sourceSha256 + } artifacts[arch][artifactName] = { file, protocolVersion: definition.protocolVersion, - sha256: createHash('sha256').update(bytes).digest('hex'), - sourceSha256: sourceHashes[artifactName], + sha256, + sourceSha256, } } } diff --git a/packages/core/scripts/write-native-manifest.mjs b/packages/core/scripts/write-native-manifest.mjs index b918e3b..d4392b2 100644 --- a/packages/core/scripts/write-native-manifest.mjs +++ b/packages/core/scripts/write-native-manifest.mjs @@ -1,7 +1,7 @@ import path from 'node:path' import { fileURLToPath } from 'node:url' -import { writeWindowsNativeManifest } from './native-artifacts.mjs' +import { WINDOWS_NATIVE_ARCHES, WINDOWS_NATIVE_ARTIFACTS, updateWindowsNativeManifest } from './native-artifacts.mjs' const coreDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..') const windowsDir = process.argv[2] @@ -12,4 +12,20 @@ if (relative.startsWith('..') || path.isAbsolute(relative)) { throw new Error('Native manifest target must stay inside the Core package') } -await writeWindowsNativeManifest(coreDir, windowsDir) +const buildEntries = [] +if (process.argv.includes('--all-current')) { + for (const arch of WINDOWS_NATIVE_ARCHES) { + for (const artifactName of Object.keys(WINDOWS_NATIVE_ARTIFACTS)) buildEntries.push({ arch, artifactName }) + } +} else { + for (let index = 3; index < process.argv.length; index++) { + if (process.argv[index] !== '--built' || !process.argv[index + 1]) { + throw new Error('Use --built : for each rebuilt binary, or --all-current after rebuilding all') + } + const [arch, artifactName, extra] = process.argv[++index].split(':') + if (extra !== undefined) throw new Error('Windows native build provenance must use :') + buildEntries.push({ arch, artifactName }) + } +} + +await updateWindowsNativeManifest(coreDir, windowsDir, buildEntries) diff --git a/packages/core/src/peers/registry.ts b/packages/core/src/peers/registry.ts index 9254c81..b98185a 100644 --- a/packages/core/src/peers/registry.ts +++ b/packages/core/src/peers/registry.ts @@ -335,6 +335,7 @@ export function createPeerRegistry(options: PeerRegistryOptions = {}): PeerRegis } catch { // A live PID may have a blocked event loop. Ping failure hides it // from this live view but never authorizes registration/socket deletion. + partial = true } } } diff --git a/packages/core/src/peers/windows-named-pipe-transport.ts b/packages/core/src/peers/windows-named-pipe-transport.ts index fd0f606..c0d2f27 100644 --- a/packages/core/src/peers/windows-named-pipe-transport.ts +++ b/packages/core/src/peers/windows-named-pipe-transport.ts @@ -182,7 +182,7 @@ class BrokerClient { return Promise.reject(error) } this.purgeTombstones() - if (this.pending.size + this.tombstones.size >= WINDOWS_PEER_BROKER_MAX_OPERATIONS) { + if (this.pending.size >= WINDOWS_PEER_BROKER_MAX_OPERATIONS) { return Promise.reject( transportError('PEER_WINDOWS_OPERATION_CAPACITY', 'Windows peer broker operation capacity is exhausted'), ) @@ -400,7 +400,6 @@ class BrokerClient { } this.pending.delete(frame.operationId) this.disposePending(pending) - this.tombstones.set(frame.operationId, Date.now() + TOMBSTONE_TTL_MS) if (failure) pending.reject(failure) else pending.resolve(response!) } @@ -415,7 +414,7 @@ class BrokerClient { if (status === 'canceled' || pending.terminalSeen) { this.pending.delete(frame.operationId) this.disposePending(pending) - this.tombstones.set(frame.operationId, Date.now() + TOMBSTONE_TTL_MS) + this.rememberTombstone(frame.operationId) } } @@ -444,7 +443,7 @@ class BrokerClient { if (!pending) return this.pending.delete(operationId) this.disposePending(pending) - this.tombstones.set(operationId, Date.now() + TOMBSTONE_TTL_MS) + this.rememberTombstone(operationId) pending.reject(error) } @@ -460,6 +459,14 @@ class BrokerClient { } } + private rememberTombstone(operationId: number): void { + this.purgeTombstones() + this.tombstones.set(operationId, Date.now() + TOMBSTONE_TTL_MS) + while (this.tombstones.size > WINDOWS_PEER_BROKER_MAX_OPERATIONS) { + this.tombstones.delete(this.tombstones.keys().next().value!) + } + } + private send(frame: WindowsPeerBrokerFrame): Promise { if (this.exited) { return Promise.reject( diff --git a/packages/core/src/peers/windows-peer-runtime-security.ts b/packages/core/src/peers/windows-peer-runtime-security.ts index e13404d..628edb6 100644 --- a/packages/core/src/peers/windows-peer-runtime-security.ts +++ b/packages/core/src/peers/windows-peer-runtime-security.ts @@ -1,4 +1,5 @@ import { type ChildProcessWithoutNullStreams, spawn } from 'node:child_process' +import fs from 'node:fs/promises' import path from 'node:path' import { debugLog, errorMessage, userXcodeDir } from '../utils.js' @@ -79,6 +80,15 @@ async function secureWindowsPeerRuntime( } if (signal?.aborted) throw abortError() const root = path.resolve(options.root ?? userXcodeDir()) + try { + await fs.mkdir(root, { recursive: true }) + } catch (error) { + throw runtimeError( + 'PEER_WINDOWS_RUNTIME_UNSAFE', + `Windows peer runtime root creation failed: ${errorMessage(error)}`, + error, + ) + } const artifact = await (options.artifact ?? resolveWindowsPeerBrokerArtifact()) if (signal?.aborted) throw abortError() const spawnBroker = options.spawnBroker ?? spawn diff --git a/packages/core/tests/file-lock.test.ts b/packages/core/tests/file-lock.test.ts index 5ec5471..c1c429f 100644 --- a/packages/core/tests/file-lock.test.ts +++ b/packages/core/tests/file-lock.test.ts @@ -9,23 +9,24 @@ import { acquireFileLock } from '../src/utils/file-lock.js' const execFileAsync = promisify(execFile) const LOCK_MODULE_URL = new URL('../dist/utils/file-lock.js', import.meta.url).href -async function runLockContender(lockPath: string, holdMs: number): Promise<{ start: number; end: number }> { +async function runLockContender(lockPath: string, holdMs: number): Promise<{ start: bigint; end: bigint }> { const script = ` import { acquireFileLock } from ${JSON.stringify(LOCK_MODULE_URL)} const lease = await acquireFileLock(process.argv[1], { waitMs: 10000, retryMs: 5 }) if (!lease) throw new Error('timed out acquiring test lock') - const start = Date.now() + const start = process.hrtime.bigint() await new Promise(resolve => setTimeout(resolve, Number(process.argv[2]))) - const end = Date.now() + const end = process.hrtime.bigint() await lease.release() - process.stdout.write(JSON.stringify({ start, end })) + process.stdout.write(JSON.stringify({ start: start.toString(), end: end.toString() })) ` const result = await execFileAsync( process.execPath, ['--input-type=module', '--eval', script, lockPath, String(holdMs)], { windowsHide: true }, ) - return JSON.parse(result.stdout) as { start: number; end: number } + const interval = JSON.parse(result.stdout) as { start: string; end: string } + return { start: BigInt(interval.start), end: BigInt(interval.end) } } describe('file lock ownership', () => { @@ -44,7 +45,7 @@ describe('file lock ownership', () => { { at: start, delta: 1 }, { at: end, delta: -1 }, ]) - .sort((a, b) => a.at - b.at || a.delta - b.delta) + .sort((a, b) => (a.at === b.at ? a.delta - b.delta : a.at < b.at ? -1 : 1)) let active = 0 let maxActive = 0 for (const event of events) { diff --git a/packages/core/tests/peer-registry.test.ts b/packages/core/tests/peer-registry.test.ts index d1a3e69..9fc3dc8 100644 --- a/packages/core/tests/peer-registry.test.ts +++ b/packages/core/tests/peer-registry.test.ts @@ -352,6 +352,7 @@ describe('owner-only peer registry', () => { } const live = await registry.listLive({ transport, senderInstanceId: randomUUID() }) expect(live.peers).toEqual([]) + expect(live.partial).toBe(true) expect(await registry.read(value.instanceId)).not.toBeNull() }) diff --git a/packages/core/tests/windows-native-artifacts.test.ts b/packages/core/tests/windows-native-artifacts.test.ts index f4bb898..d32b596 100644 --- a/packages/core/tests/windows-native-artifacts.test.ts +++ b/packages/core/tests/windows-native-artifacts.test.ts @@ -1,9 +1,11 @@ import { afterEach, beforeEach, describe, expect, it } from 'vitest' +import { execFile } from 'node:child_process' import { createHash } from 'node:crypto' import fs from 'node:fs/promises' import os from 'node:os' import path from 'node:path' +import { promisify } from 'node:util' import { resolveWindowsPeerBrokerArtifact } from '../src/peers/windows-peer-broker-artifact.js' @@ -20,6 +22,9 @@ interface NativeManifest { } const nativeRoot = path.resolve('packages/core/dist/native/windows') +const coreDir = path.resolve('packages/core') +const writeManifestScript = path.join(coreDir, 'scripts', 'write-native-manifest.mjs') +const execFileAsync = promisify(execFile) let testRoot = '' beforeEach(async () => { @@ -90,4 +95,31 @@ describe('Windows native artifacts', () => { name: 'PEER_WINDOWS_UNSUPPORTED_ARCH', }) }) + + it('preserves source provenance for binaries that were not rebuilt', async () => { + const scriptRoot = await fs.mkdtemp(path.join(coreDir, '.native-manifest-test-')) + try { + await fs.cp(nativeRoot, scriptRoot, { recursive: true }) + const manifest = await readManifest(scriptRoot) + const currentX64Source = manifest.artifacts.x64.peerBroker.sourceSha256 + manifest.artifacts.arm64.peerBroker.sourceSha256 = '1'.repeat(64) + await fs.writeFile(path.join(scriptRoot, 'manifest.json'), JSON.stringify(manifest), 'utf8') + + await execFileAsync(process.execPath, [writeManifestScript, scriptRoot, '--built', 'x64:peerBroker']) + const updated = await readManifest(scriptRoot) + expect(updated.artifacts.x64.peerBroker.sourceSha256).toBe(currentX64Source) + expect(updated.artifacts.arm64.peerBroker.sourceSha256).toBe('1'.repeat(64)) + + await expect(execFileAsync(process.execPath, [writeManifestScript, scriptRoot])).rejects.toThrow( + /explicitly built artifact/i, + ) + + await fs.appendFile(path.join(scriptRoot, updated.artifacts.arm64.peerBroker.file), Buffer.from([0])) + await expect( + execFileAsync(process.execPath, [writeManifestScript, scriptRoot, '--built', 'x64:peerBroker']), + ).rejects.toThrow(/cannot preserve provenance/i) + } finally { + await fs.rm(scriptRoot, { recursive: true, force: true }) + } + }) }) diff --git a/packages/core/tests/windows-peer-transport.test.ts b/packages/core/tests/windows-peer-transport.test.ts index 297594f..6f2253a 100644 --- a/packages/core/tests/windows-peer-transport.test.ts +++ b/packages/core/tests/windows-peer-transport.test.ts @@ -1,6 +1,9 @@ import { type ChildProcessWithoutNullStreams, spawn } from 'node:child_process' import { randomUUID } from 'node:crypto' +import fs from 'node:fs/promises' import net from 'node:net' +import os from 'node:os' +import path from 'node:path' import { setTimeout as delay } from 'node:timers/promises' import { createPeerIdentity } from '../src/peers/identity.js' @@ -15,10 +18,25 @@ import { encodeStartServerPayload, encodeWindowsPeerBrokerFrame, } from '../src/peers/windows-peer-broker-protocol.js' +import { createWindowsPeerRuntimeSecurity } from '../src/peers/windows-peer-runtime-security.js' const describeWindows = process.platform === 'win32' ? describe : describe.skip describeWindows('Windows named pipe peer transport', () => { + it('creates and secures an absent user runtime root', async () => { + const root = path.join(os.homedir(), `.x-code-peer-clean-root-${randomUUID()}`) + const registry = createPeerRegistry({ + windowsRuntimeSecurity: createWindowsPeerRuntimeSecurity({ root }), + }) + try { + await registry.initialize() + expect((await fs.stat(registry.paths().registryDir)).isDirectory()).toBe(true) + expect(registry.paths().namespaceId).toMatch(/^[a-f0-9]{12}$/) + } finally { + await fs.rm(root, { recursive: true, force: true }) + } + }) + it('discovers and sends between two real broker-backed services', async () => { const suffix = Date.now().toString(36) const sender = createPeerService({ enabled: true, name: `windows-sender-${suffix}` }) @@ -199,6 +217,74 @@ describeWindows('Windows named pipe peer transport', () => { await expect(server.closed).resolves.toMatchObject({ expected: false }) }) + it('survives clients that disconnect before authentication', async () => { + const registry = createPeerRegistry() + await registry.initialize() + const identity = createPeerIdentity({ name: 'disconnect-stress' }) + const transport = createWindowsNamedPipeTransport({ getRuntimePaths: () => registry.paths() }) + const server = await transport.listen({ + address: transport.createAddressHint(identity.instanceId), + instanceId: identity.instanceId, + inboxToken: identity.inboxToken, + onRequest: async (frame) => frame, + }) + try { + for (let index = 0; index < 4_000; index++) { + await new Promise((resolve) => { + const socket = net.connect(server.address) + socket.once('connect', () => { + socket.destroy() + resolve() + }) + socket.once('error', () => resolve()) + }) + } + + const requestId = randomUUID() + await expect( + transport.request({ + address: server.address, + targetToken: identity.inboxToken, + senderInstanceId: identity.instanceId, + frame: { v: 1, type: 'ping', requestId }, + timeoutMs: 2_000, + }), + ).resolves.toMatchObject({ type: 'ping', requestId }) + await expect(Promise.race([server.closed.then(() => true), delay(50).then(() => false)])).resolves.toBe(false) + } finally { + await server.close() + } + }, 30_000) + + it('keeps accepting active operations after 256 rapid successes', async () => { + const registry = createPeerRegistry() + await registry.initialize() + const identity = createPeerIdentity({ name: 'success-capacity' }) + const transport = createWindowsNamedPipeTransport({ getRuntimePaths: () => registry.paths() }) + const server = await transport.listen({ + address: transport.createAddressHint(identity.instanceId), + instanceId: identity.instanceId, + inboxToken: identity.inboxToken, + onRequest: async (frame) => frame, + }) + try { + for (let index = 0; index < 300; index++) { + const requestId = randomUUID() + await expect( + transport.request({ + address: server.address, + targetToken: identity.inboxToken, + senderInstanceId: identity.instanceId, + frame: { v: 1, type: 'ping', requestId }, + timeoutMs: 2_000, + }), + ).resolves.toMatchObject({ type: 'ping', requestId }) + } + } finally { + await server.close() + } + }, 15_000) + it('fails the service closed and removes its registration after a broker crash', async () => { const registry = createPeerRegistry() const children: ChildProcessWithoutNullStreams[] = [] diff --git a/vitest.config.ts b/vitest.config.ts index f259b32..806631e 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -18,6 +18,7 @@ export default defineConfig({ name: 'unit', include: ['packages/core/tests/**/*.test.ts', 'packages/cli/tests/*.test.{ts,tsx}'], sequence: { groupOrder: 0 }, + testTimeout: 15_000, }, }, { From 580258b601387d8cfd513c45e39e8de459be1233 Mon Sep 17 00:00:00 2001 From: woai3c <411020382@qq.com> Date: Sat, 29 Aug 2026 00:54:20 +0800 Subject: [PATCH 4/8] fix: update native manifest after local builds --- packages/core/scripts/build-native.mjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/core/scripts/build-native.mjs b/packages/core/scripts/build-native.mjs index 18d24ad..30fbd8c 100644 --- a/packages/core/scripts/build-native.mjs +++ b/packages/core/scripts/build-native.mjs @@ -47,7 +47,8 @@ async function main() { const destinationRoot = path.join(coreDir, 'dist', 'native', 'windows') await ensureCompleteDistNativeRoot(destinationRoot) - for (const artifactName of requestedArtifacts()) { + const artifactNames = requestedArtifacts() + for (const artifactName of artifactNames) { const definition = WINDOWS_NATIVE_ARTIFACTS[artifactName] const nativeDir = path.join(coreDir, 'native', definition.sourceDirectory) await run('cargo', ['build', '--release', '--locked', '--manifest-path', path.join(nativeDir, 'Cargo.toml')]) From 36fc6f77432d280115af8a7f8449fe6cde4c31a9 Mon Sep 17 00:00:00 2001 From: woai3c <411020382@qq.com> Date: Sun, 30 Aug 2026 21:34:56 +0800 Subject: [PATCH 5/8] refactor(peers): simplify Windows peer messaging --- .github/workflows/pr-check.yml | 2 +- .github/workflows/release.yml | 2 +- CHANGELOG.md | 2 +- README.md | 2 +- README.zh-CN.md | 2 +- WINDOWS_PEER_MESSAGING_DESIGN_REVIEW.md | 522 +++++++ WINDOWS_PEER_MESSAGING_IMPLEMENTATION_PLAN.md | 1196 ----------------- docs/peer-messaging.en.md | 2 +- docs/peer-messaging.md | 2 +- packages/cli/esbuild.config.js | 5 +- .../cli/tests/package/install-smoke.test.ts | 42 +- packages/cli/tests/pty/harness.ts | 4 +- packages/cli/tests/pty/tui-clear.test.ts | 1 - .../cli/tests/pty/tui-peer-messaging.test.ts | 75 ++ .../cli/tests/shutdown-coordinator.test.ts | 130 +- .../prebuilt/windows/arm64/xc-peer-broker.exe | Bin 279040 -> 346112 bytes .../native/prebuilt/windows/manifest.json | 12 +- .../prebuilt/windows/x64/xc-peer-broker.exe | Bin 301056 -> 362496 bytes .../native/windows-peer-broker/Cargo.lock | 54 + .../native/windows-peer-broker/Cargo.toml | 2 + .../windows-peer-broker/src/lifecycle.rs | 322 ++--- .../native/windows-peer-broker/src/main.rs | 12 +- .../native/windows-peer-broker/src/pipe.rs | 1055 ++++++--------- .../windows-peer-broker/src/process_peer.rs | 36 +- .../windows-peer-broker/src/protocol.rs | 10 +- packages/core/scripts/native-artifacts.mjs | 2 +- packages/core/src/agent/pdf-ingest.ts | 174 ++- packages/core/src/agent/pdf-render-worker.ts | 42 +- .../src/native/windows-native-artifact.ts | 130 ++ packages/core/src/peers/index.ts | 15 +- packages/core/src/peers/platform-transport.ts | 1 - packages/core/src/peers/registry.ts | 14 +- packages/core/src/peers/service.ts | 38 +- packages/core/src/peers/transport.ts | 7 +- .../core/src/peers/unix-socket-transport.ts | 10 +- .../src/peers/windows-named-pipe-transport.ts | 292 ++-- .../src/peers/windows-peer-broker-artifact.ts | 147 +- .../src/peers/windows-peer-broker-process.ts | 100 ++ .../src/peers/windows-peer-broker-protocol.ts | 16 +- .../peers/windows-peer-runtime-security.ts | 140 +- .../core/src/peers/windows-pipe-address.ts | 6 + .../shell-session/providers/windows-job.ts | 101 +- packages/core/src/utils/image-compress.ts | 30 +- .../__snapshots__/api-exports.test.ts.snap | 2 - packages/core/tests/audio-decode.test.ts | 2 +- packages/core/tests/file-ingest.test.ts | 10 + packages/core/tests/file-lock.test.ts | 13 +- packages/core/tests/pdf-ingest.test.ts | 46 +- packages/core/tests/peer-registry.test.ts | 9 +- .../peer-service-legacy-transport.test.ts | 40 + .../core/tests/peer-service-sanitize.test.ts | 1 - packages/core/tests/peer-service.test.ts | 5 - packages/core/tests/peer-transport.test.ts | 49 +- .../tests/windows-native-artifacts.test.ts | 8 +- .../tests/windows-peer-broker-process.test.ts | 49 + .../windows-peer-broker-protocol.test.ts | 10 +- .../core/tests/windows-peer-transport.test.ts | 239 +++- vitest.config.ts | 1 - 58 files changed, 2374 insertions(+), 2867 deletions(-) create mode 100644 WINDOWS_PEER_MESSAGING_DESIGN_REVIEW.md delete mode 100644 WINDOWS_PEER_MESSAGING_IMPLEMENTATION_PLAN.md create mode 100644 packages/core/src/native/windows-native-artifact.ts create mode 100644 packages/core/src/peers/windows-peer-broker-process.ts create mode 100644 packages/core/src/peers/windows-pipe-address.ts create mode 100644 packages/core/tests/peer-service-legacy-transport.test.ts create mode 100644 packages/core/tests/windows-peer-broker-process.test.ts diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml index 78c4d1e..824d00c 100644 --- a/.github/workflows/pr-check.yml +++ b/.github/workflows/pr-check.yml @@ -111,7 +111,7 @@ jobs: run: | pnpm build pnpm build:native - & packages/core/dist/native/windows/x64/xc-peer-broker.exe self-test --protocol 1 + & packages/core/dist/native/windows/x64/xc-peer-broker.exe self-test --protocol 2 pnpm exec vitest run packages/core/tests/windows-job-provider.test.ts packages/core/tests/windows-supervisor-protocol.test.ts packages/core/tests/pty-provider.test.ts packages/core/tests/windows-peer-broker-protocol.test.ts packages/core/tests/windows-peer-transport.test.ts packages/core/tests/windows-native-artifacts.test.ts package: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 13987f1..0e3c3b2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -84,7 +84,7 @@ jobs: - name: Exercise release x64 native helpers run: | - & packages/core/native/prebuilt/windows/x64/xc-peer-broker.exe self-test --protocol 1 + & packages/core/native/prebuilt/windows/x64/xc-peer-broker.exe self-test --protocol 2 pnpm build pnpm exec vitest run packages/core/tests/windows-job-provider.test.ts packages/core/tests/windows-supervisor-protocol.test.ts packages/core/tests/pty-provider.test.ts packages/core/tests/windows-peer-broker-protocol.test.ts packages/core/tests/windows-peer-transport.test.ts packages/core/tests/windows-native-artifacts.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 39b9b9b..16a206a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,7 +56,7 @@ ### Features -- support secure same-account peer messaging on Windows x64 and arm64 through a bundled Named Pipe broker +- support secure same-account peer messaging on Windows x64 through a bundled Named Pipe broker, with an arm64 artifact packaged as a preview pending native-device acceptance - support ChatGPT subscription sign-in for OpenAI models with browser/device OAuth, automatic token refresh, and strict API-key mutual exclusion - unify foreground and background shell execution into managed sessions with automatic 10-second yielding, `/ps`, and `/stop` - use a bundled, hash-verified Windows Job Object supervisor for reliable process-tree cleanup on Windows x64 and arm64; normal Node.js builds do not require Rust diff --git a/README.md b/README.md index a68d041..c1f7162 100644 --- a/README.md +++ b/README.md @@ -170,7 +170,7 @@ xc -m sonnet "Refactor the formatDate function" # Specify a model - **Plan mode** — `--plan` or `/plan` enters read-only exploration; the agent designs a plan, then executes after approval - **Durable goal loops** — `/goal` runs execute → verify → repair cycles until passing or hitting a stop condition - **Model-directed Git worktrees** — when repository state and verification risk warrant it, the agent can use ordinary Git commands to create and clean up a temporary worktree instead of risking the active checkout -- **Cross-session messaging** — named local sessions can discover one another and exchange peer-authorized work (macOS / Linux / Windows x64 and arm64; see [docs](./docs/peer-messaging.en.md)) +- **Cross-session messaging** — named local sessions can discover one another and exchange peer-authorized work (macOS / Linux / Windows x64; a Windows arm64 artifact is packaged as a preview pending native-device acceptance; see [docs](./docs/peer-messaging.en.md)) - **File attachments** — `@path` or bare absolute paths auto-ingest text / code / PDF / Office docs (docx / xlsx / pptx / odt / ods / odp) / images / audio - **Local PDF processing** — selectable text is extracted page by page; scanned or visual pages become images for the active vision model or local OCR for a text model. Large visual PDFs are loaded progressively with `readFile` page ranges. Original PDF bytes are never uploaded - **Local audio transcription** — MP3 / WAV / FLAC / OGG Vorbis attachments (up to 25 MiB and 20 minutes) are always transcribed locally via Whisper (whisper.cpp) in an isolated process; only timestamped text reaches the model. Before any model download, the native runtime is probed and a streaming decoder enforces the limit against actual decoded PCM frames. Queue wait and transcription share a hard timeout. First-use model downloads are revision-pinned and SHA-256 verified before being cached under `~/.x-code/whisper-models/` (default `tiny`; set `X_CODE_WHISPER_MODEL` to pick another, e.g. `base`) diff --git a/README.zh-CN.md b/README.zh-CN.md index 2c2a521..3915bc0 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -170,7 +170,7 @@ xc -m sonnet "重构 formatDate 函数" # 指定模型 - **Plan 模式** — `--plan` 或 `/plan` 进入只读探索,Agent 先制定方案、批准后再执行 - **持续目标循环** — `/goal` 自动执行→验证→修复,直到验证通过或触发停止条件 - **模型自主 Git worktree** — 当仓库状态和验证风险确有需要时,Agent 可自主使用普通 Git 命令创建并清理临时 worktree,避免冒险改动当前工作区 -- **跨会话消息** — 命名后的本机 Session 可以互相发现,并在权限边界内移交工作(macOS / Linux / Windows x64 与 arm64;详见[文档](./docs/peer-messaging.md)) +- **跨会话消息** — 命名后的本机 Session 可以互相发现,并在权限边界内移交工作(macOS / Linux / Windows x64;Windows arm64 artifact 已随包提供,但在完成 arm64 真机验收前属于预览支持;详见[文档](./docs/peer-messaging.md)) - **文件附件** — `@path` 或裸绝对路径引用文件,自动识别 text / code / PDF / Office 文档(docx / xlsx / pptx / odt / ods / odp)/ 图片 / 音频 - **本地 PDF 处理** — 按页提取可选文本;扫描页或视觉页交给当前视觉模型,纯文本模型则使用本地 OCR。大型视觉 PDF 通过 `readFile` 页范围渐进读取,原始 PDF 字节不会上传 - **本地音频转写** — MP3 / WAV / FLAC / OGG Vorbis 附件(最大 25 MiB、20 分钟)始终由隔离进程中的 Whisper(whisper.cpp)在本地转写,只有带时间戳的文字会交给模型。模型下载前会探测 native runtime,并由隔离进程中的流式解码器按实际 PCM 帧执行硬上限;排队等待与转写共用总超时。首次模型下载固定 revision 并通过 SHA-256 校验后才缓存于 `~/.x-code/whisper-models/`(默认 `tiny`,可通过 `X_CODE_WHISPER_MODEL` 换成其他型号,如 `base`) diff --git a/WINDOWS_PEER_MESSAGING_DESIGN_REVIEW.md b/WINDOWS_PEER_MESSAGING_DESIGN_REVIEW.md new file mode 100644 index 0000000..174ab2b --- /dev/null +++ b/WINDOWS_PEER_MESSAGING_DESIGN_REVIEW.md @@ -0,0 +1,522 @@ +# Windows Peer Messaging 设计审查与收敛方案 + +> 审查对象:PR [#29](https://github.com/woai3c/x-code-cli/pull/29),`origin/main...580258b` +> +> 审查日期:2026-08-30;本文件区分“事实”“判断”和“估算”。 + +## 结论 + +**判断:当前 PR 存在实质性过度设计,不建议以现状直接合并。** + +但原因不是“Windows 功能完全没有复用”:现有 `PeerService`、注册发现、消息协议、收件箱、限流、投递账本、 +权限/污染链路和 CLI 生命周期均被复用。新增代码主要集中在 Windows 传输和安全边界。 + +真正的问题是:一个“补齐 Windows transport”的任务,同时引入了严格且尚未完成人工确认的威胁模型、两套新二进制协议、 +手写 Win32 overlapped I/O 状态机、重复的 native artifact 基础设施,以及与功能无关的测试改动。实现复杂度已经超过现有 +Unix transport 约一个数量级,而 PR 尚缺少其自身计划要求的异用户/完整性级别、双机 remote rejection 和 arm64 实机证据。 + +推荐方向不是退回纯 Node 实现,而是: + +1. 保留原生 helper 和必要的 Windows 安全边界; +2. 复用既有业务层,不改公开的 peer 行为; +3. 删除重复 loader、校验器和子进程管线; +4. 把两套新增协议收敛为最少的 request/response/cancel 生命周期; +5. 用实测 spike 决定是否以 Tokio named pipe 替代手写 I/O; +6. 把非本功能测试变更移出本 PR,并用真实 Windows 多进程通信验收最终结果。 + +## 1. 审查范围与方法 + +### 1.1 事实来源 + +- PR 元数据、提交和 GitHub Actions 结果; +- `git diff --numstat origin/main...HEAD` 与逐文件 diff; +- TypeScript/Rust 实现、测试、构建脚本和预编译 artifact; +- 当前环境 Node `22.14.0`、libuv `1.49.2`、Windows x64; +- Node、libuv、Microsoft Win32 和 Tokio 官方资料。 + +### 1.2 非目标 + +- 不重新设计现有消息业务语义、权限模型或 UI; +- 不增加 TCP、跨主机或跨用户消息能力; +- 不把 shell supervisor 和 peer broker 强行合并为一个可执行文件; +- 不以减少行数为由降低已经声明的安全边界;安全策略变更必须单独获得维护者确认。 + +## 2. 7,871 行从哪里来 + +PR 事实:`+7,871/-260`,54 个文件。按职责拆分如下;Rust 文件中的生产/内联测试边界为近似值,其余来自 +`numstat`: + +| 类别 | 新增行 | 占比 | 说明 | +| ------------------------------- | --------: | -------: | -------------------------------------------------------------- | +| Rust broker 生产代码 | 约 3,555 | 45.2% | pipe、安全、runtime ACL、协议、生命周期 | +| TypeScript peer 生产代码 | 1,486 | 18.9% | broker client、平台 transport、runtime helper、artifact loader | +| 测试 | 1,170 | 14.9% | 845 行外部测试 + 约 325 行 Rust 内联测试 | +| 实施计划与产品文档 | 1,213 | 15.4% | 其中根目录实施计划单独占 1,196 行 | +| 构建、artifact、lockfile 与其他 | 447 | 5.7% | native 构建/manifest/CI/package 适配 | +| **合计** | **7,871** | **100%** | 二进制文件不计文本行数 | + +因此,7,871 行不是 7,871 行运行时代码:约 2,383 行是测试和文档。不过约 5,041 行产品代码仍然很大;其中 +Windows 专属栈约 4,767 行,而现有 [Unix transport](packages/core/src/peers/unix-socket-transport.ts) 约 464 行。 +差距主要来自安全与代理协议,不是 Windows pipe 地址格式本身。 + +预编译体积当前为: + +| Artifact | x64 | arm64 | +| ------------------------------ | ------------: | ------------: | +| `xc-peer-broker.exe` | 301,056 bytes | 279,040 bytes | +| 既有 `xc-shell-supervisor.exe` | 211,456 bytes | 204,800 bytes | + +## 3. 实际复用了什么 + +### 3.1 已正确复用 + +以下行为没有在 Windows 重写: + +- `PeerService` 的发送、重试和 `PEER_DELIVERY_UNKNOWN` 语义; +- 注册发现、过期清理和 PID 探测; +- `PeerFrameV1`、帧大小限制和 NDJSON 编解码; +- inbox 的 hold/accept/refuse、幂等和投递账本; +- rate limit、权限 authority、peer taint/provenance; +- CLI 启停、消息入队和 UI。 + +当前结构是: + +```text +CLI / tools + | + v +PeerService + Registry + Inbox + Authority <- 既有公共业务层 + | + v +PeerTransport + |-- Unix: Node net + Unix domain socket + | + `-- Windows: TypeScript BrokerClient + | + | XCPB 控制协议 + v + 本 Session Rust broker + | + | XCPP 会话协议 + v + 对端 Rust broker + | + v + 既有 PeerFrameV1 +``` + +**判断:业务层复用是合理的,“没有复用代码”这一说法不成立。** + +### 3.2 没有复用或抽象不完整的部分 + +| 问题 | 证据 | 后果 | +| -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | +| native artifact 解析重复 | [peer broker loader](packages/core/src/peers/windows-peer-broker-artifact.ts) 与 [shell supervisor loader](packages/core/src/tools/shell-session/providers/windows-job.ts) 都实现 manifest、路径、PE architecture 和 SHA-256 校验 | 两份 schema/type/error/path 逻辑已经发生漂移 | +| pipe 地址校验重复 | [registry.ts](packages/core/src/peers/registry.ts#L32) 与 [windows-named-pipe-transport.ts](packages/core/src/peers/windows-named-pipe-transport.ts#L79) 各有一份正则 | 安全校验规则可能不一致 | +| 子进程协议管线重复 | [windows-peer-runtime-security.ts](packages/core/src/peers/windows-peer-runtime-security.ts) 与 `BrokerClient` 分别实现 spawn、stderr 限制、decoder、abort、timeout、exit 映射 | 一次性 runtime 检查单独占 215 行并复制故障处理 | +| transport 接口泄漏 endpoint 细节 | [transport.ts](packages/core/src/peers/transport.ts#L10) 暴露 `createAddressHint()`;Unix 返回 socket 候选路径,Windows 返回的实际是 namespace 派生信息 | `PeerService.start()` 出现 Unix 专属异常回退,平台边界不干净 | +| 低层构造器进入公共 API | `createPlatformPeerTransport` 和 `createWindowsNamedPipeTransport` 被加入 core export snapshot | 给尚未稳定的内部实现增加兼容负担 | +| Rust helper 间只有少量原语重复 | shell supervisor 主要处理 Job Object,peer broker 主要处理 pipe/security | 为少量 handle/wide-string 工具抽公共 Rust crate 会增加构建耦合,暂不建议 | + +## 4. 哪些复杂度是必要的 + +### 4.1 原生边界不是多余的 + +Node 的 named-pipe `net` API没有传入 `SECURITY_ATTRIBUTES` 或设置 `PIPE_REJECT_REMOTE_CLIENTS` 的接口。当前环境的 +libuv `1.49.2` 在 `CreateNamedPipeW` 路径使用空 security attributes,且没有加入 remote-client rejection flag。 +Microsoft 文档说明,空 security descriptor 的默认 ACL 会给创建者/管理员/SYSTEM 较高权限,并给 Everyone/anonymous +提供读取权限;Node 的 Windows `chmod` 也只能有限切换写权限,不能表达 Unix `0600` 的 user/group/other 语义。 + +因此,如果验收标准是“与 Unix 私有 socket 等价的当前用户、本机通信”,就需要 Rust/C++ helper 或 native addon。 +纯 Node 方案只能在维护者明确接受更弱威胁模型后采用。 + +保留的最低安全与可靠性要求: + +- 创建 pipe 时原子设置受保护 DACL; +- `PIPE_REJECT_REMOTE_CLIENTS` 和 `FILE_FLAG_FIRST_PIPE_INSTANCE`; +- 高熵 pipe 名称; +- 对端 Windows account SID 校验; +- 私有且本地的 registry/runtime,拒绝 UNC、remote volume 和 reparse escape; +- 既有 `inboxToken`、`PeerFrameV1` 严格解析、authority 与 taint 链路; +- bounded frame/concurrency/timeout、AbortSignal 和 parent EOF shutdown; +- artifact architecture、protocol version 和 hash 校验。 + +### 4.2 broker 进程本身是可接受的选择 + +与 Node native addon 相比,独立 broker 避免 Node ABI/N-API 装载和崩溃隔离问题。每个命名 root Session 一个 broker,也与 +现有 session 生命周期相符。问题不在“有 broker”,而在 broker 两侧又建立了过多确认层和重复状态。 + +## 5. 过度设计点 + +### 5.1 P0:安全需求扩张先于 Human Plan Review + +根目录的 1,196 行计划把“同用户、本机通信”扩张为:精确 integrity RID 相等、AppContainer 拒绝、逐级 ancestor ACL +审计、双向进程身份验证,以及双机 remote rejection 验收。这些规则可能合理,但它们是产品/兼容性决定,不只是实现细节。 + +审查开始时 PR 不是 Draft,而 PR 描述仍明确记录 Human Plan Review、Human Local Acceptance 和 Human Technical Review 未完成; +现已将 PR 转为 Draft,并在剩余验收证据补齐前保持该状态。 +这与 [开发流程](docs/development/agent-workflow.md) 中“有安全/公共接口/跨平台影响时先做 Human Plan Review,Human Local +Acceptance 前保持 Draft”的要求不一致。 + +本次收敛默认**不降低现有安全行为**。是否把“精确 integrity 相等”改为更接近 Unix 的“同 account SID 即可”,应作为独立 +产品决定;否则重构无法用真实 elevated/non-elevated 环境证明兼容性。 + +### 5.2 P0:三层协议重复确认同一个交付事实 + +[Windows broker control protocol](packages/core/src/peers/windows-peer-broker-protocol.ts#L9) 定义 14 类 frame,包含 +`CancelAck(canceled/too-late)`、operation tombstone 和 shutdown ACK。broker 间协议又使用 client/server nonce、auth-ok、 +business response 和额外 business ACK,最内层仍是已有的 `PeerFrameV1` request/ack。 + +在“一条连接只承载一个有界请求,连接双方先通过 OS identity 与 token 验证”的前提下: + +- nonce 没有提供额外的跨连接重放保护;业务 message ID 已负责幂等; +- response 后的 business ACK 不改变发送方“未收到匹配 response 即 delivery unknown”的语义; +- cancel 不需要双向 `canceled/too-late` 仲裁,never-reused operation ID 加本地 late-result ignore set 即可; +- 未知但属于已取消请求的迟到 completion 不应杀死整个 broker。 + +这些状态曾导致成功请求占用容量、快速断连杀死 broker 等缺陷;虽已修复,但说明状态空间难以推理。 + +### 5.3 P1:手写 Win32 overlapped I/O 规模过大 + +`pipe.rs` 共 1,234 行,约 1,149 行是生产代码,手写了 create/connect/read/write/event/cancel/close 的异步状态。 + +Tokio 的 Windows named-pipe `ServerOptions` 已提供 `reject_remote_clients`,并允许通过 +`create_with_security_attributes_raw` 传入自定义 security attributes。它可能删除大量 I/O 状态机,但会增加依赖、编译时间和 +二进制体积。因此这里不能凭感觉替换,必须先做不进入最终 diff 的 x64/arm64 release spike,并以 artifact 体积、功能和 +package budget 决策。 + +2026-08-30 已完成第一轮不进入仓库 diff 的 Windows x64 探索性 spike: + +| 变体 | Release 体积 | 结果 | +| ------------------------------------------------------------------------------------------- | ------------: | ----------------------------------------------------------------- | +| 最小 Tokio named pipe,启用 first-instance、remote rejection 和 raw security attributes API | 286,208 bytes | request/response 通过 | +| 当前 raw Win32 broker | 301,056 bytes | 当前基线 | +| Tokio + 当前 DACL/SID/双向身份/runtime ACL 模块,不链接原 raw pipe 主路径 | 348,672 bytes | 私有 DACL、双向 SID 验证和 4,000 次快速断连通过;压力段约 0.32 秒 | +| 同时保留 raw pipe 与 Tokio 两套 I/O 的上界实验 | 445,440 bytes | 功能通过,但超过单 artifact 0.4 MiB 预算 | + +**事实解释:**替换而不是并存时,x64 有较大概率满足 0.4 MiB 预算;但目前只是下界/上界测量,不证明完整 broker 替换后的 +最终体积。当前机器未安装 arm64 Rust target,所以 arm64 spike 尚未执行。实施时可以进入 Tokio 替换分支,但最终 x64 或 +arm64 任一产物超预算、功能回归或取消语义不稳定,都应回退 raw Win32。 + +### 5.4 P1:runtime 初始化被做成第二套 helper 生命周期 + +runtime ACL 检查复用了同一个可执行文件,却另外启动一次 one-shot 子进程并复制控制协议。它可以并入持久 broker 的启动握手, +或者至少复用统一的 native child client。当前设计增加了一个启动竞态和完整错误面。 + +### 5.5 P1:manifest 以 architecture 为第一维 + +当前 manifest 在每个 architecture 下重复 helper 的 protocol/source provenance,曾出现“未构建 architecture 被错误标成当前 +source”的修复提交。推荐改成 helper-first: + +```json +{ + "manifestVersion": 3, + "helpers": { + "peerBroker": { + "protocolVersion": 1, + "sourceSha256": "...", + "binaries": { + "x64": { "file": "x64/xc-peer-broker.exe", "sha256": "..." }, + "arm64": { "file": "arm64/xc-peer-broker.exe", "sha256": "..." } + } + } + } +} +``` + +一个共享 loader 负责路径、PE、hash 和 protocol;build 脚本只负责写入各 helper 的 provenance。 + +### 5.6 P2:非功能性 diff 污染 + +PR 全局把 Vitest unit timeout 提到 15 秒、PTY harness 启动等待从 10 秒调到 20 秒,并移动 PDF 测试、修改 file-lock 计时。 +这些可能是 CI 稳定性修复,但与 Windows peer 的因果关系没有记录。全局 timeout 尤其可能隐藏性能回退。应恢复 base 行为, +只给确实较慢的 Windows peer 用例设置局部 timeout;其他修复另开 PR。 + +### 5.7 P0:安全声明强于执行证据 + +当前 GitHub 8/8 jobs 通过,Windows x64 多终端 smoke 也有记录;这证明主路径可运行。但仓库中未找到实际创建不同账户或不同 +integrity process 的集成测试。remote 测试只锁定创建 flag,PR 仍缺双机执行;arm64 只有 PE/hash/provenance 校验,缺目标 +机器执行。CI 绿不能替代这些 threat-model acceptance。 + +## 6. 目标架构 + +```text +PeerService(不改业务语义) + | + v +PeerTransport.listen({ instanceId, inboxToken, ... }) + |-- UnixTransport + | `-- transport 自己创建/清理 UDS endpoint + | + `-- WindowsBrokerTransport + |-- SharedWindowsNativeArtifactResolver + |-- 单一 BrokerProcessClient + | |-- secure runtime + start server + | |-- request / response / cancel / shutdown + | `-- 统一 spawn/decoder/stderr/timeout/exit + `-- Rust broker + |-- security: DACL / local-only / SID / runtime ACL + |-- pipe I/O: raw Win32 或经 spike 验证的 Tokio + `-- 单连接单 request -> 单 response +``` + +目标不是追求一个任意 LOC 数字,而是让每一层只拥有一种职责: + +- 业务 delivery ack 只属于 `PeerFrameV1`; +- transport 只提供 request/response/cancel; +- OS security 只由 Rust 层执行; +- registry 只存经过 transport validator 验证的 descriptor; +- artifact provenance 只由一套 schema/loader/build path 管理。 + +## 7. 详细实施计划 + +### 阶段 0:计划确认与 PR 状态 + +1. 将 PR 标记为 Draft,直到本方案、真实运行证据和 Human Local Acceptance 完成。 +2. 由请求维护者确认本方案。 +3. 安全策略默认保持当前严格行为:同 SID、精确 integrity、非 AppContainer;若要放宽,另行决策并补对应验收。 + +完成条件:计划决定被记录,非目标和安全不变量明确。 + +### 阶段 1:先做低风险复用与 diff 清理 + +1. 抽取共享 Windows native artifact loader:统一 manifest schema、路径约束、PE architecture、hash 和 protocol 校验。 +2. 将 manifest 改为 helper-first,更新 build/copy/write/check/package 脚本和测试。 +3. 抽取唯一的 Windows pipe address parser/validator,registry 与 transport 共用。 +4. 把 `createAddressHint()` 从 `PeerTransport` 删除;`listen()` 自己创建 endpoint,删除 `PeerService` 的 Unix fallback。 +5. 不再公开导出 platform/Windows transport 低层构造器;测试从内部模块导入或通过注入接口测试。 +6. 恢复无因果依据的全局 timeout 和非 peer 测试改动;保留必要改动时写明原因并局部化。 +7. 把原 1,196 行施工清单替换为本 ADR/审查文件和简短的 maintained product docs。 + +每一步后:运行受影响 unit tests、`pnpm build`、`pnpm typecheck`。 + +### 阶段 2:收敛 Node 到 broker 的控制面 + +1. 建立一个 `BrokerProcessClient`,统一 spawn、bounded stderr、frame decoder、write serialization、startup timeout、abort 和 exit。 +2. 将 secure-runtime 合入持久 broker 启动;若生命周期耦合使 registry 无法安全初始化,则保留 one-shot 命令,但必须复用同一 + process client,而不是复制 215 行实现。 +3. 将控制 frame 缩减为最小集合:initialize/start、request、response、inbound request/response、cancel、error、shutdown。 +4. operation ID 单调且不复用;cancel 为 best effort,不再返回 canceled/too-late ACK。 +5. Node 仅保留有界、短 TTL 的 canceled-ID ignore set;一个合法迟到结果不能触发 broker-wide fatal。 +6. 保持 `AbortSignal`、request deadline、最大并发、broker crash 和 `PEER_DELIVERY_UNKNOWN` 语义不变。 + +完成条件:协议 golden-vector 测试覆盖所有 frame;连续成功、取消竞态、broker crash、未知 frame、超大 frame 均有回归。 + +### 阶段 3:收敛 broker 间协议 + +1. 保留 connect 后的双向 OS identity 验证和 target token 验证。 +2. 每条 pipe connection 只允许一个 auth+business request 和一个 business response。 +3. 删除 client/server nonce 和 response 后 business ACK;关闭连接即完成 transport 生命周期。 +4. 继续在 `PeerFrameV1` 层校验 request ID/message ID,保持消息幂等与 delivery-unknown 行为。 +5. 将错误码分成 protocol/security/timeout/canceled/capacity,统一映射并去敏。 + +完成条件:错误 token、错误/无法读取身份、malformed/oversized、断连、超时、取消和重复 message ID 的结果稳定。 + +### 阶段 4:Win32 I/O 实测 spike + +1. 已在临时目录完成 x64 API、DACL/SID、体积和 4,000 次快速断连探索,结果记录于 5.3。 +2. 实施候选中完成完整 broker Tokio 替换,分别构建 x64/arm64 release,记录 source LOC、artifact size、启动耗时、压力测试和 + package budget。 +3. 决策门槛:安全能力必须等价;每个 native artifact 仍满足仓库预算,或维护者明确批准预算变化;测试不得更差。 +4. 达标则保留 Tokio;不达标则删除替换,保留 raw Win32,但按单连接单请求状态机拆小并补注释/测试。 + +这是测量性决策,不预设 Tokio 一定更好。 + +### 阶段 5:验证与独立审核 + +1. Rust:`cargo fmt --check`、`cargo clippy -- -D warnings`、`cargo test`、fresh x64 build/self-test;arm64 交叉构建和 PE/hash 校验。 +2. TS:聚焦 peer registry/service/protocol/transport/native artifact tests。 +3. Core 改动后执行 `pnpm build`;随后 `pnpm typecheck`、`pnpm lint:check`、`pnpm format:check`。 +4. 执行 `pnpm run ci` 和 package/install smoke。 +5. 首轮改造完成后启动独立、只读子 agent,提供目标、方案、候选 worktree 和完整验证证据;按 finding 修复并重跑受影响检查。 +6. 每次修复后让同一 reviewer 对新候选复审,直到没有 blocker/high/medium finding;记录其不是仓库已配置的正式平台 gate。 + +### 阶段 6:Windows 真实多进程验收 + +在隔离的 `X_CODE_HOME` 和 workspace 中,用真实 built CLI、真实 PowerShell/ConPTY、真实 registry/broker/named pipe,模型端只使用 +确定性 fake provider: + +1. 在三个独立终端启动命名 Agent `alpha`、`beta`、`gamma`; +2. 三者互相 discovery; +3. 完成 `alpha -> beta -> gamma -> alpha` 消息环; +4. 验证 payload 进入接收方 peer context,回复/ack 与 message ID 匹配; +5. 验证 hold/accept/refuse 至少各一条; +6. 中止一个发送并杀掉一个 broker,确认其他进程存活、stale registration 被清理、重启后可再次通信; +7. 重复至少三轮,保存命令、Node/OS、commit/worktree、stdout/stderr、exit code 和副作用路径。 + +安全验收另列: + +- 不同 Windows account:必须拒绝; +- remote host:如果 PR 继续声明该能力,必须用第二台受控 Windows 主机执行; +- arm64:如果本 PR 准备 Ready/发布,必须在真实 arm64 Windows 上执行 helper self-test 和两个 Session smoke; +- 不同 integrity:按阶段 0 确认的策略执行并记录。 + +### 阶段 7:交付 + +1. `git diff --check`、工作树检查、生成最终 LOC/体积对比; +2. 更新 PR 描述,真实标记每项为 PASSED/FAILED/NOT EXECUTED/NOT APPLICABLE; +3. Human Local Acceptance 前保持 Draft; +4. 用户已授权本轮最终提交;只有在代码、审核和本机功能验收全部通过后,创建一次 conventional commit; +5. 不 push、不 merge、不 release,除非另有明确授权。 + +## 8. 验收标准 + +- macOS/Linux 的 Unix socket 行为和公共 peer API 不变; +- Windows x64 三个真实 CLI 进程可发现并完成环形消息; +- Windows 的 DACL、local-only、SID、token、frame bounds 和 authority/taint 不弱于当前 PR; +- abort、timeout、broker crash、快速断连和容量恢复没有泄漏或全局 fatal; +- manifest 对 x64/arm64 的 binary/source provenance 不会互相污染; +- core build、聚焦测试、全量 CI、package/install smoke 通过; +- 独立子 agent 对最终候选没有 blocker/high/medium finding; +- 未执行的 arm64、remote、异用户或 integrity 证据必须阻止对应安全声明或 Ready 状态,不能用单元测试代替。 + +## 9. 预期规模变化 + +以下均是**估算,不是验收指标**,各项有重叠,不能直接相加: + +| 收敛项 | 预计净减少 | +| ------------------------------------------ | --------------------------------------------: | +| 1,196 行施工清单改为短 ADR/maintained docs | 约 850–1,000 行 | +| 共享 artifact/validator/process 基础设施 | 约 200–350 行 | +| 控制协议与 cancel 生命周期简化 | 约 250–500 行 | +| broker 间 nonce/business ACK 删除 | 约 150–300 行 | +| Tokio 若通过 spike 并替换 raw I/O | 约 500–800 行源码,但 lockfile/二进制可能增加 | +| 移出无关 diff | 约 30–80 行 | + +在不削弱安全边界的前提下,合理目标是把最终 PR 控制在约 4,500–5,500 行新增(含测试和文档),而不是追求纯 Node +方案可能达到的低行数。若 Tokio 不满足体积或稳定性门槛,接受更高 LOC,但必须通过协议和复用收敛降低状态空间。 + +## 10. 主要风险与回退 + +| 风险 | 控制与回退 | +| ---------------------------------- | --------------------------------------------------------------------------------------- | +| 简化 ACK 后改变 delivery certainty | 以现有 outbound ledger 为语义 owner;断连仍返回 `PEER_DELIVERY_UNKNOWN`,用竞态测试锁定 | +| cancel 迟到结果污染新请求 | operation ID 在进程生命周期内不复用;有界 ignore set;wrap 前 fail/restart | +| Tokio 增大 artifact/package | spike 不进入最终 diff;超预算立即回退 raw Win32 | +| manifest migration 破坏旧包布局 | loader 只读取当前包内 manifest;package install smoke 覆盖 source/dist/tarball 路径 | +| Windows 修复破坏 Unix | transport contract tests 在 Windows/Linux/macOS CI 均执行 | +| 严格 runtime ACL 使临时目录不可用 | 测试使用受控本地 runtime;不通过放宽安全来迁就测试 | + +## 11. 外部依据 + +- [Node.js 22 `net` 文档:IPC/named pipe listen options](https://nodejs.org/docs/latest-v22.x/api/net.html) +- [Node.js 22 `fs.chmod` 的 Windows 限制](https://nodejs.org/docs/latest-v22.x/api/fs.html) +- [libuv v1.49.2 Windows pipe 实现](https://github.com/libuv/libuv/blob/v1.49.2/src/win/pipe.c) +- [Microsoft `CreateNamedPipeW`](https://learn.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-createnamedpipew) +- [Microsoft Named Pipe Security and Access Rights](https://learn.microsoft.com/en-us/windows/win32/ipc/named-pipe-security-and-access-rights) +- [Microsoft `ImpersonateNamedPipeClient`](https://learn.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-impersonatenamedpipeclient) +- [Tokio Windows named-pipe `ServerOptions`](https://docs.rs/tokio/latest/tokio/net/windows/named_pipe/struct.ServerOptions.html) + +## 12. Human Plan Review 决策面 + +请求维护者已于 2026-08-30 在当前实现对话中回复“同意方案”,批准以下整体方案: + +- [x] 同意“保留 native broker,但收敛协议、生命周期和重复基础设施”; +- [x] 同意本轮默认保持当前严格的 SID/integrity/AppContainer 安全行为; +- [x] 同意 Tokio 仅作为有退出门槛的临时 spike,结果不达标即回退; +- [x] 同意未取得真实 arm64/双机证据前,PR 保持 Draft 且不宣称对应验收已完成; +- [x] 同意按阶段 1–7 实施、审核、真实多终端测试并在全部通过后创建一次提交。 + +## 13. 实施结果与最终证据 + +### 13.1 最终结论 + +初始结论经实现与复审后仍成立:**原 PR 确有过度设计,但“完全没有复用既有代码”不成立。** 既有业务层、注册发现、 +消息格式、收件箱、权限与 taint 链路均得到复用;可确认的过度设计主要位于 Windows 专属 transport 的重复基础设施、 +控制协议状态和手写异步 I/O。 + +本轮已经移除这些可确认的冗余,同时保留 native broker 及其 DACL、local-only、SID、integrity、AppContainer、token、 +runtime ACL 和有界资源策略。最终候选不再用多层 ACK/nonce/cancel 仲裁表达同一个交付事实,也不再为两个 Windows helper +分别维护 artifact loader 和进程协议管线。 + +最终 diff 仍然很大,因此结论不是“代码少了就安全”,也不是“剩余代码都天然必要”:当前主要体积来自 3,505 行 Rust +broker(其中安全与 runtime ACL 991 行)、Windows transport/控制客户端、跨进程与安全回归测试、构建产物管理以及本审查报告。 +它已从“状态空间难以推理”收敛为职责较清晰的实现,但仍应以 Draft 接受尚未完成的真实 arm64、异账户、异 integrity 和双机 +验收约束。 + +### 13.2 已实施的收敛 + +- 抽取共享 Windows native artifact 解析、PE 架构、hash/protocol 校验,供 peer broker 与 shell supervisor 复用; +- 抽取唯一的 pipe 地址验证器和统一 native 子进程管线,删除 runtime probe 与 broker client 的重复实现; +- 保持旧 `PeerTransport` 注入兼容,并让 transport 自己拥有 endpoint 创建、校验和关闭生命周期; +- 将 Node 控制面收敛为最小 request/response/cancel/shutdown 状态,ID 不复用且 wrap 前失败; +- 删除 broker 间 nonce、auth-ok、额外 business ACK 与 cancel 仲裁,保留 OS identity、token 和业务幂等语义; +- 用 Tokio named pipe 替代手写 Win32 overlapped I/O,同时保持原有安全边界和 fail-closed 行为; +- 将 CLI native copy 范围限定为 `native/windows`,并校验 x64/arm64 manifest、PE 与 hash; +- 恢复与本功能无因果关系的全局测试门限,只为实际重型媒体用例保留局部 15 秒上限; +- 删除 1,196 行施工清单,以本审查文档作为决策、实施和证据记录。 + +全量门禁还暴露了一个与 peer 无关、但会让 Windows 测试宿主以 `0xC0000005` 退出的 PDF native Worker 崩溃。为保证门禁 +真实通过而不是重跑掩盖,本候选把 Windows PDF renderer 隔离到 child process,等待 PDF/image worker 自然退出,并补充 +abort、IPC disconnect 与安装包 fork 路径测试;其他平台仍使用原 Worker 路径。该修复是最终 LOC 高于阶段 9 估计的一部分。 + +### 13.3 规模与产物 + +| 指标 | 初始 PR | 最终候选 | +| ------------------- | ------------: | ----------------------------------------------: | +| 文本 diff | `+7,871/-260` | `+7,543/-425` | +| 变更文件 | 54 | 60 | +| 根目录施工/审查文档 | 1,196 行 | 522 行 | +| x64 peer broker | 301,056 bytes | 362,496 bytes | +| arm64 peer broker | 279,040 bytes | 346,112 bytes | +| npm package | 未记录 | 3.00 MiB packed / 11.80 MiB unpacked / 41 files | + +阶段 9 的 `4,500–5,500` 行是初始估计,**最终没有达到该估计**。原因包括严格安全实现不能按 LOC 目标裁剪、Tokio 替换的 +净减幅小于 spike 下界、增加了竞态/容量/真实 PTY 回归,以及上述 PDF native crash 修复。最终新增行数仅比初始少 +328 行,但删除行数增加 165 行;更重要的收益是删除重复协议状态和手写 I/O 分支,而不是用测试或文档迁移 +制造表面 LOC 降幅。 + +### 13.4 独立审核 + +同一只读子 Agent 对每轮修复持续复审,先后发现并推动修复:shutdown 保留 ID、operation capacity 释放竞态、ID overflow、 +取消后迟到 terminal、子进程 EPIPE、异常终止汇合、destroy deadline、父 IPC 断连和真实时钟测试抖动等问题。最终轮未编辑 +文件、未运行测试,仅审核最新完整候选,结论为: + +- Blocker:0 +- High:0 +- Medium:0 +- Low:0 +- **无发现,可提交** + +### 13.5 最终验证 + +验证环境:Windows 10 `10.0.19045` x64、Node `v22.14.0`、pnpm `10.7.1`、Rust `1.94.0`。 + +| 检查 | 结果 | +| -------------------------------------------------------- | ------------------------------------------------------------------------------------------ | +| `pnpm run ci` | PASS;201 个文件通过、3 个平台跳过;1,985 个测试通过、37 个跳过;无 unhandled worker error | +| `pnpm check:package` | PASS;3.00 MiB packed、11.80 MiB unpacked、41 files | +| `cargo fmt --check` | PASS | +| `cargo test --locked` | PASS;19/19 | +| `cargo clippy --all-targets --locked -- -D warnings` | PASS | +| x64 `xc-peer-broker self-test --protocol 2` | PASS | +| x64/arm64 artifact manifest、PE、hash、source provenance | PASS;arm64 为交叉构建产物校验 | +| PDF/image native 退出压力测试 | PASS;5 轮、每轮 42/42 | +| shutdown coordinator 稳定性 | PASS;10 轮、每轮 2/2 | +| `git diff --check` | PASS | +| 测试后 broker/repo child process 残留 | 0 | + +### 13.6 真实 Windows 多进程通信验收 + +使用 built CLI、真实 PowerShell ConPTY、隔离 `X_CODE_HOME`、真实 registry、native broker 与 named pipe,启动三个独立命名 +进程 `alpha`、`beta`、`gamma`;模型端仅使用确定性 fake provider,不替代 transport: + +- 三者互相发现成功; +- `alpha -> beta -> gamma -> alpha` 消息环成功,接收上下文与 message ID/ack 匹配; +- 两进程直接互发成功且没有出现 authority dialog; +- held message 的 Accept 与 Refuse 路径均成功; +- 注入式 metadata/payload 仅作为转义后的可见文本呈现; +- 最终全量 CI 中 `tui-peer-messaging.test.ts` 5/5 再次通过,其中三终端消息环用例耗时 8.451 秒。 + +因此,本机 Windows x64 的“多个终端、多个独立 Agent 进程可发现并通信”已经实际确认,不是只由 mock transport 推断。 + +### 13.7 未执行与交付边界 + +- 未在真实 Windows arm64 设备运行;仅完成 arm64 交叉构建、PE/hash/provenance 校验; +- 未创建第二个 Windows 账户验证异账户拒绝; +- 未在 elevated/non-elevated 或 AppContainer 组合中执行真实 integrity 验收; +- 未使用第二台 Windows 主机执行 remote rejection; +- 当前最终候选尚未 push,因此 macOS/Linux CI 尚未针对该提交运行。 + +这些缺口不影响本机同账户 Windows x64 功能结论,但会限制跨架构与完整威胁模型声明。PR 保持 Draft;本轮只创建已授权的 +本地 conventional commit,不 push、不 merge、不 release。 diff --git a/WINDOWS_PEER_MESSAGING_IMPLEMENTATION_PLAN.md b/WINDOWS_PEER_MESSAGING_IMPLEMENTATION_PLAN.md deleted file mode 100644 index 2e53951..0000000 --- a/WINDOWS_PEER_MESSAGING_IMPLEMENTATION_PLAN.md +++ /dev/null @@ -1,1196 +0,0 @@ -# Windows 跨会话消息实施方案 - -> 状态:已实现;待发布前 Windows arm64 实机与双机远程拒绝验收 -> -> 目标:在 Windows x64 / arm64 上为命名的交互式根 Session 提供与 macOS/Linux 一致的本机 Peer Messaging 能力,同时保持当前权限、provenance、taint、队列和投递语义,并以 Windows 原生安全机制实现同账户隔离和远程连接拒绝。 -> -> 核心决策:使用随 npm 包分发的预编译 Rust helper `xc-peer-broker.exe` 实现 Windows Named Pipe、SID/DACL 校验和本机连接约束;普通安装、TypeScript 开发、构建和测试不得要求本机安装 Rust。 - -## 1. 摘要 - -当前 Peer Messaging 已在 macOS/Linux 上通过 Unix Domain Socket 工作,但 Windows 会在 `PeerService.start()` 中以 `PEER_UNSUPPORTED_PLATFORM` 明确关闭。Windows 支持不能通过简单移除平台判断完成,因为现有实现依赖 POSIX UID、`0700`/`0600`、socket 文件、inode 和 `unlink` 语义,而 Node.js 的 Windows Named Pipe API不允许应用设置严格的 DACL、`PIPE_REJECT_REMOTE_CLIENTS` 或验证对端 Windows SID。 - -本方案采用以下结构: - -```text -Named xc Session A -┌──────────────────────────────────────┐ -│ Node.js │ -│ PeerService │ -│ └─ WindowsNamedPipeTransport │ -└──────────────────┬───────────────────┘ - │ bounded binary protocol over inherited stdio -┌──────────────────▼───────────────────┐ -│ xc-peer-broker.exe A │ -│ - secure runtime directory check │ -│ - Named Pipe server/client │ -│ - current-account SID verification │ -│ - protected DACL │ -│ - remote-client rejection │ -└──────────────────┬───────────────────┘ - │ Windows Named Pipe -┌──────────────────▼───────────────────┐ -│ xc-peer-broker.exe B │ -└──────────────────┬───────────────────┘ - │ inherited stdio -┌──────────────────▼───────────────────┐ -│ Node.js PeerService B │ -└──────────────────────────────────────┘ -``` - -每个命名的交互式根 Session 启动一个 broker。未命名 Session、print mode 和 sub-agent 不启动 broker。Windows broker 同时处理入站和出站连接,使两端都由原生代码验证对端 SID,并避免 Node 默认 Named Pipe 安全描述符成为安全边界。 - -业务层保持不变: - -- `/list-agents`、`listAgents`、`sendMessage` 的用户语义不变。 -- 消息只传纯文本和现有摘要/投递元数据。 -- Peer 消息不等于用户授权,不能批准权限或执行 slash command。 -- peer-influenced taint、authority evaluator、hook 隔离、held/accepted 队列、去重、限流、重试和 delivery update 语义不变。 -- 不监听 TCP/UDP 端口,不接入远程 relay。 - -## 2. 已确认的设计决策 - -以下决策在实施前视为已定,不在编码阶段重新发散: - -| 主题 | 决策 | -| ---------------------- | ---------------------------------------------------------------------------------------------------------------------- | -| Windows IPC | Windows Named Pipe | -| 原生实现 | 独立 Rust broker executable,不使用 N-API addon | -| 进程模型 | 每个命名根 Session 一个 broker | -| OS 身份边界 | 同一 Windows Account SID,且处于兼容的 Windows integrity level | -| 多登录 Session | 同一账户、兼容 integrity level 时允许互通 | -| 提权/AppContainer | 首版不保证 elevated ↔ non-elevated 或 AppContainer ↔ desktop Session 互通,不降低 mandatory integrity label 规避限制 | -| 远程访问 | 使用 `PIPE_REJECT_REMOTE_CLIENTS` 明确拒绝 | -| 应用认证 | 保留每 Session 随机 `inboxToken`,作为 SID 验证后的第二层认证 | -| 本机管理员 | Administrator/System 不属于可防御攻击者,与现有同 UID 威胁模型一致 | -| 不安全目录/远程 volume | fail closed;Windows Peer registry 只允许支持 persistent ACL 的本机 volume,仅禁用 Peer Messaging,不影响 CLI 其他功能 | -| 纯 Node fallback | 不提供;helper 缺失、损坏或不兼容时明确不可用 | -| Windows 架构 | x64、arm64;不支持 ia32 | -| 普通开发 | 使用 checked-in 预编译 helper,不要求 Rust | -| 原生开发/发布 | Rust stable;Release CI 构建并验证 x64/arm64 | -| 网络协议 | 保持 `PeerFrameV1` 业务语义;Windows transport 使用独立的有界 broker/pipe framing | -| Registry 版本 | 首选保留 `version: 1`,将 transport 扩展为判别联合;旧版本安全地拒绝未知 kind | - -如果实施中必须改变上述任一决定,应先更新本方案并单独评审,而不是在代码中隐式改变边界。 - -## 3. 功能目标 - -### 3.1 用户功能 - -在受支持的 Windows 环境中,以下命令应正常工作: - -```powershell -xc --name frontend -xc --name backend -``` - -任一 Session 中执行: - -```text -/list-agents -``` - -应列出可达的其他命名 Session,不再显示 `Peer messaging is not supported on Windows in this release.`。 - -模型工具保持现有 schema: - -```text -listAgents() -sendMessage({ to, message, summary? }) -``` - -要求: - -1. 两个同账户 Windows Session 可以相互发现。 -2. 可以按唯一名称或完整 `peer:` 地址发送消息。 -3. 同名歧义、自发消息、空目标、广播和超限消息继续拒绝。 -4. 空闲接收方可自动启动新 turn。 -5. 忙碌接收方在安全工具边界注入消息。 -6. goal/maintenance lease 期间继续延迟处理。 -7. `auto`、`accept`、`hold`、`refuse` inbound policy 与现有平台一致。 -8. sender 能收到 `delivered`、`held`、`refused`、`duplicate` 和最终 delivery update。 -9. 正常退出和崩溃后不遗留 Named Pipe 内核对象。 -10. 失效 registration 能在现有 grace period 和 PID 复核规则下被安全回收。 - -### 3.2 平台行为 - -| 平台 | Transport | 行为 | -| ------------- | ------------------------ | --------------------------- | -| macOS | Unix Domain Socket | 保持现状 | -| Linux | Unix Domain Socket | 保持现状 | -| Windows x64 | Secure Named Pipe broker | 新增支持 | -| Windows arm64 | Secure Named Pipe broker | 新增支持 | -| Windows ia32 | 无 | fail closed,显示不支持架构 | -| 其他平台 | 无 | 保持显式 unsupported | - -### 3.3 开发体验 - -以下命令不得要求 Rust: - -```powershell -pnpm install -pnpm build -pnpm dev -pnpm typecheck -pnpm test -pnpm run ci -``` - -仅以下场景需要 Rust: - -- 修改 `packages/core/native/windows-peer-broker/`。 -- 执行 Windows broker 的 Rust unit/integration test。 -- 重新生成预编译 helper。 -- Release CI 构建 x64/arm64 原生产物。 - -## 4. 非目标与明确边界 - -首版 Windows 支持不包含: - -- 跨机器消息、SMB Named Pipe 远程访问、TCP listener 或云 relay。 -- Agent Teams、共享 task list、共享文件或共享完整对话历史。 -- sub-agent 注册为独立 peer。 -- `xc -p` / print mode inbox。 -- 广播消息。 -- 跨 Windows 账户通信。 -- elevated 与 non-elevated、AppContainer 与普通 desktop Session 之间的保证互通;首版要求兼容的 integrity level。 -- Windows/macOS/Linux 跨操作系统通信。 -- 对 Administrator、System、拥有调试/接管权限的进程进行隔离。 -- 消息持久化;broker 或 receiver 崩溃后不承诺恢复进程内未完成消息。 -- 将 Named Pipe 地址、SID、token 或动态 peer 列表写入模型 system prompt。 -- 将不安全 `X_CODE_HOME` 静默迁移到其他目录。 -- helper 缺失时退化为默认 Node Named Pipe 或 loopback TCP。 - -## 5. 安全模型 - -### 5.1 需要防御的对象 - -必须防御: - -- 同机其他普通 Windows 账户读取或伪造 registration/token。 -- 同机其他普通账户连接 receiver pipe。 -- 远程 SMB 客户端连接 Named Pipe。 -- 伪造 registration 将 sender 引向其他账户创建的 Pipe。 -- Pipe name squatting 和地址替换。 -- 恶意或损坏 frame 导致无界内存、阻塞、崩溃或 request 混淆。 -- broker/Node 一端退出后另一端成为孤儿进程。 -- peer 输入尝试继承本地用户授权、绕过 authority 或触发 plugin hook。 - -### 5.2 不承诺防御的对象 - -不承诺防御: - -- 本地 Administrator/System。 -- 与当前进程使用相同 Windows Account SID、且能读取当前账户文件或调试当前进程的恶意程序。 -- 用户主动把敏感信息发送给另一个可信 Session。 -- 用户显式以 `--trust` 启动 receiver 后授予的本地工具能力。 - -即使两个 peer 属于同一 Windows 账户,模型输入仍视为互不可信的数据域。现有 peer-influenced taint 和 authority evaluator 不能因 OS 身份验证而弱化。 - -首版“兼容 integrity level”定义为:两端 `TokenUser` 完全相同、`TokenIntegrityLevel` RID 完全相同,且 `TokenIsAppContainer` 均为 false。不要为了让 high/medium 或 AppContainer/desktop 互通而降低 Pipe mandatory integrity label;不满足时双方按不可达处理。 - -### 5.3 分层认证 - -连接必须依次通过: - -```text -1. Pipe DACL -2. PIPE_REJECT_REMOTE_CLIENTS -3. client/server Account SID 与 integrity level 双向验证 -4. target inboxToken 常量时间验证 -5. transport frame schema/size/version 验证 -6. PeerFrameV1 严格解析 -7. 现有 inbound policy 和 authority evaluator -``` - -任一层失败都必须关闭连接,不向未认证连接发送业务数据。 - -### 5.4 Windows Pipe 创建要求 - -broker 使用 `CreateNamedPipeW`,至少包含: - -```text -PIPE_ACCESS_DUPLEX -FILE_FLAG_OVERLAPPED -FILE_FLAG_FIRST_PIPE_INSTANCE(仅第一个 server instance) -PIPE_TYPE_BYTE -PIPE_READMODE_BYTE -PIPE_WAIT -PIPE_REJECT_REMOTE_CLIENTS(每个 server instance) -``` - -Pipe 名称由 broker 生成,不由模型、用户输入或 Session 名称拼接: - -```text -\\.\pipe\x-code-peer-v1--<192-bit-random> -``` - -要求: - -- 使用 Win32 `CreateNamedPipeW` 文档规定的本机形式 `\\.\pipe\`。 -- Pipe namespace 是平面的;名称只允许固定前缀、十六进制 namespace ID 和 base64url 随机段,不接受用户提供的反斜杠、点段或其他分隔符。 -- 随机部分至少 192 bit,使用系统 CSPRNG。 -- `namespace-id` 只用于隔离不同 `X_CODE_HOME`,不作为认证因子。 -- `secure-runtime` 通过目录 handle 调用 `GetFinalPathNameByHandleW(FILE_NAME_NORMALIZED | VOLUME_NAME_GUID)` 获取稳定目录标识,以规范化 UTF-16LE bytes 的 SHA-256 前 12 个小写十六进制字符作为 `namespace-id`,并将该 ID 返回给 Node;TypeScript 不独立重复 Windows 路径 canonicalization。 -- Registry 初始化后在实例内部保存该 `namespace-id`,parser 只接受完全匹配的 ID;broker 启动时接收同一 ID 并按固定格式生成地址。 -- 注册表 parser 对总长度、固定前缀、namespace ID 和随机部分做精确验证。 -- 不在 debug log 输出 inbox token、SID 原始值、canonical runtime path 或完整敏感 broker payload。 - -`FILE_FLAG_FIRST_PIPE_INSTANCE` 只用于同一地址的第一个 server instance。后续用于并发 accept 的 instance 不得重复该 flag,但每个 instance 都必须使用同一个 protected DACL 和 `PIPE_REJECT_REMOTE_CLIENTS`。 - -### 5.5 Pipe DACL - -创建 Pipe 时原子传入 protected security descriptor,不允许先用默认 DACL 创建后再修补。 - -DACL 必须采用显式 allowlist: - -- 当前 Windows Account SID:连接所需读写权限。 -- 可选 LocalSystem:只有实现和测试确实需要时才能加入。 -- 不允许 Everyone、Anonymous、Authenticated Users、BUILTIN\\Users、INTERACTIVE 或其他普通用户/宽泛组出现允许 ACE。 -- 禁止从父对象继承不受控 ACE。 -- 不得把普通 Administrators 组作为功能依赖。 -- 自动化测试必须枚举 DACL 中全部 ACE,并验证每个允许 ACE 都属于批准 allowlist;不能只检查 Everyone/Anonymous 缺失。 - -Server 收到首段有界数据后必须: - -1. `ImpersonateNamedPipeClient`。 -2. `OpenThreadToken(TOKEN_QUERY)`。 -3. 读取 `TokenUser` 和 `TokenIntegrityLevel`。 -4. 与 broker 启动时记录的 Account SID 和兼容 integrity policy 比较。 -5. 无论成功失败都执行 `RevertToSelf`。 -6. 失败时不继续以 server 身份处理请求。 - -Client 连接后必须: - -1. `GetNamedPipeServerProcessId`。 -2. 以最小权限打开 server process。 -3. 查询 server process token 的 `TokenUser` 和 `TokenIntegrityLevel`。 -4. 与当前 Account SID 和兼容 integrity policy 比较。 -5. 无法证明时 fail closed。 - -### 5.6 Runtime/Registry ACL - -Windows 上不能把 Node 的 `mode: 0o700` / `0o600` 当作安全控制。原生 helper 必须创建或验证: - -```text -\runtime -\runtime\peers -``` - -要求: - -- 所在 volume 支持 persistent ACL;不支持时禁用 Peer Messaging。 -- 通过 `GetVolumePathNameW` / `GetDriveTypeW` 和 UNC 检查确认路径位于本机 volume;拒绝 UNC、mapped network drive 和 `DRIVE_REMOTE`。这是必须条件,因为 registry 使用本机 PID 判活,不能在多台机器之间共享。 -- 拒绝不安全的 reparse point/junction/symlink 路径。 -- 验证 `userXcodeDir()` 根和相关父目录不会允许其他普通账户替换或删除受保护 runtime。 -- `runtime` 和 `peers` 使用 protected DACL,仅当前 Account SID 可读写枚举。 -- registration 临时文件和最终文件继承受保护 DACL。 -- 原子写入继续使用同目录 `wx` 临时文件、flush 和 rename。 -- Windows 无法目录 fsync 的现有处理保持不变。 -- 无法证明目录安全时返回稳定错误码,不尝试“尽量运行”。 - -由同一个 `xc-peer-broker.exe` 提供一次性 `secure-runtime` 子命令,避免引入第二个原生可执行文件。该子命令必须先完成并退出,之后才能启动长生命周期 `broker` 模式: - -```text -xc-peer-broker.exe secure-runtime --protocol -xc-peer-broker.exe broker --protocol -``` - -runtime path 通过有界 stdin frame 传入,避免命令行泄漏和 quoting 差异。 - -## 6. 总体架构改造 - -### 6.1 平台 Transport 工厂 - -新增: - -```text -packages/core/src/peers/platform-transport.ts -``` - -职责: - -```ts -createPlatformPeerTransport(): PeerTransport -``` - -平台选择: - -```text -win32 → createWindowsNamedPipeTransport() -darwin/linux → createUnixSocketTransport() -其他平台 → explicit unsupported -``` - -不得让 `PeerService` 直接 import `createUnixSocketTransport()`。 - -### 6.2 Transport 描述符 - -将 registration transport 改为判别联合: - -```ts -export type PeerTransportDescriptor = { kind: 'unix'; address: string } | { kind: 'windows-pipe'; address: string } -``` - -`PeerTransport` 增加: - -```ts -export interface PeerTransport { - readonly kind: PeerTransportDescriptor['kind'] - createAddressHint(instanceId: string): string - validateAddress(address: string): boolean - listen(...): Promise - request(...): Promise - cleanupConfirmedDeadEndpoint?(address: string): Promise -} - -export interface PeerTransportServer { - address: string - closed: Promise<{ expected: boolean; reason?: string }> - close(options?: { deadlineMs?: number }): Promise -} -``` - -`closed` 允许 Service 发现 broker 意外退出,立即停止 heartbeat、移除自己的 registration 并设置 unavailable reason。 - -### 6.3 移除 Service 中的 Unix 文件操作 - -以下职责从 `PeerService.start()` 移出: - -- deterministic `.sock` hint 的 `lstat`。 -- `isSocket()` / symlink 检查。 -- stale socket owner scan。 -- socket path unlink。 - -Unix transport 或 Unix endpoint lifecycle 继续保留现有 inode/sentinel/ownership 防护。Windows transport 不执行文件 socket 清理。 - -Service 只处理: - -```text -initialize secure registry -→ transport.listen -→ write registration -→ watch server.closed -→ heartbeat/status updates -``` - -### 6.4 Registry 的平台职责 - -Windows runtime 安全必须是 Registry 自身的不变量,而不是依赖 `PeerService` 的隐藏调用顺序: - -- `createPeerRegistry()` 接受可注入的 platform runtime security dependency;生产默认在 Windows 调用已验证的 `secure-runtime` helper。 -- `registry.initialize()` 只有在 runtime ACL、本机 volume、reparse 检查和 `namespace-id` 获取全部成功后才完成。 -- direct registry callers 和测试不能绕过该步骤写入 Windows registration。 -- 测试可注入明确标记的 fake security provider;生产代码不接受调用方伪造“已安全”布尔值。 - -`parseRegistration()` 必须: - -- 精确接受 `unix` 和 `windows-pipe` 两种 descriptor。 -- 对每种 kind 调用对应纯函数 validator。 -- 当前平台扫描到不支持的 kind 时安全拒绝或忽略,不把任意地址传给当前 transport。 -- 保持 candidate 数量、文件大小、exact keys、UUID、日期和字符串限制。 - -`cleanupConfirmedDead()` 必须: - -```text -通用部分: - PID 两次确认死亡 - grace period - registration mtime/pid/updatedAt 再确认 - 删除 registration - -Unix: - 保留 inode、shared address、replacement 防误删逻辑 - -Windows Pipe: - 不删除 endpoint;内核已随进程回收 -``` - -### 6.5 Protocol 版本关系 - -需要区分三个版本: - -| 版本 | 作用 | -| ----------------------- | ----------------------------------------- | -| `PeerFrameV1.v` | agent 业务消息 schema | -| registration `version` | 磁盘发现记录 schema | -| broker protocol version | Node↔broker 与 broker↔broker 原生 framing | - -新增 Windows transport 不应无理由修改 `PeerFrameV1.v`。broker protocol 独立从 `1` 开始,manifest 记录可执行文件协议版本。 - -## 7. Rust Broker 设计 - -### 7.1 新增目录 - -```text -packages/core/native/windows-peer-broker/ - Cargo.toml - Cargo.lock - src/ - main.rs - protocol.rs - pipe.rs - security.rs - runtime_acl.rs - process_peer.rs -``` - -允许实际实现按规模合并文件,但模块边界必须覆盖:协议、Pipe、SID/DACL、runtime ACL 和生命周期。 - -建议依赖保持最小: - -```toml -windows-sys = { version = "0.61", features = [ ... ] } -``` - -所有依赖锁定在 `Cargo.lock`。协议使用固定二进制布局,不引入 serde/JSON parser;`namespace-id` 的 SHA-256 优先使用 Windows CNG `BCrypt`,如引入纯 Rust hash crate 则必须锁定并单独说明供应链增量。 - -### 7.2 Broker 进程生命周期 - -- Node 使用 `spawn()` 启动 helper,`stdio` 仅包含受控 anonymous pipes。 -- `windowsHide: true`,不创建可见控制台。 -- 长生命周期 `broker` 模式必须监控父通道 EOF;Node 崩溃或退出后立即停止 listener、关闭连接并退出。 -- 一次性 `secure-runtime` 模式只接收一个有界请求,返回验证结果后退出;它不创建 listener,也不与长生命周期 broker 复用 stdin 会话。 -- Node 必须监控 child `error`/`exit`;意外退出后 PeerService fail closed。 -- 正常 shutdown:停止接收新请求,给已接受请求有限 drain deadline,然后强制关闭。 -- broker 不写普通日志到 stdout;stdout 只用于协议。 -- stderr 仅输出去敏错误,Node 在 `DEBUG_STDOUT=1` 时写入 debug log。 -- broker 不启动子进程,不访问模型、项目文件或网络。 - -### 7.3 Node↔Broker framing - -采用有界二进制 header: - -```text -magic 4 bytes "XCPB" -version u8 -kind u8 -flags u16 LE -operationId u32 LE -payloadLength u32 LE -payload payloadLength bytes -``` - -约束: - -- 最大 control payload 由同一常量定义为 `MAX_FRAME_BYTES + 8 KiB`,初始上限 139,264 bytes;Node 和 Rust 边界测试必须锁定同一数值。 -- `operationId = 0` 只用于 lifecycle event;请求使用非零 ID。 -- Node 和 broker 各自维护 active operation map,上限固定,建议 256。 -- ID 回绕时不得复用仍 active 的 ID。 -- 未知 version/kind/flags、未取消 operation 的重复完成、从未分配的 ID 和超限长度视为 protocol violation。 -- parser 必须支持 chunk 拆分和多 frame 合并,不假设一次 read 对应一个 frame。 -- 所有 pending outbound operation 都有 deadline 和取消路径。 -- `CANCEL_OPERATION` 必须有 `CANCEL_ACK`,结果至少区分 `canceled` 和 `too-late`。调用方收到 abort 后可以立即结束本地等待,但 operation ID 必须保留为有界、短期 tombstone:`canceled` ack 可结束 tombstone;`too-late` ack 不能结束 tombstone,必须继续保留到 terminal response 或 TTL。协议还必须固定 terminal-response/ack 顺序,合法的 late response 被丢弃而不是误判为未知 ID。 -- receiver broker 已经把完整业务 frame 交给 Node 后,sender 断开或取消不撤销入站投递。receiver 允许 `onRequest` 在既有 deadline 内完成,并丢弃无法返回给 sender 的 response;首版不向当前不接受 `AbortSignal` 的 inbound callback 伪造取消。 -- tombstone map 有固定容量和 TTL;容量耗尽时拒绝新 operation,不能无界增长。 - -建议 frame kind: - -```text -Node → broker - START_SERVER - OUTBOUND_REQUEST - INBOUND_RESPONSE - CANCEL_OPERATION - SHUTDOWN - -broker → Node - SERVER_READY - INBOUND_REQUEST - OUTBOUND_RESPONSE - CANCEL_ACK - OPERATION_ERROR - SERVER_FATAL - SHUTDOWN_COMPLETE -``` - -控制 payload 使用按 frame kind 固定的二进制字段布局:固定宽度整数、长度前缀 UTF-8 字段,以及末尾原始 `PeerFrameV1` bytes。不得把 frame base64 后塞入 JSON,也不得让 JSON escaping 改变上限。每个变长字段必须在切片/分配前检查长度;未知字段在协议升级时通过 version/kind 处理。 - -`PeerFrameV1` 使用现有 encoder 产生的原始、受限 UTF-8 bytes 传递,最终仍由 TypeScript `parsePeerFrame()` 验证;Rust 不重新定义业务 frame union。broker control payload 的上限按 `MAX_FRAME_BYTES + 8 KiB` 固定计算,即初始不超过 139,264 bytes;如果固定 envelope 实际需要更多空间,必须通过常量推导和边界测试调整,不能使用模糊的“约 160 KiB”。 - -### 7.4 Broker↔Broker Pipe 请求 - -每个 Pipe connection 只允许一个请求,并采用分阶段握手,业务 frame 不得出现在 auth envelope 中: - -```text -connect -→ client broker 验证 server Account SID/integrity level -→ client 只发送 bounded auth envelope -→ server 读取有界 auth envelope 后验证 client Account SID/integrity level -→ server 验证 inboxToken -→ server 返回 auth-ok -→ client 才发送 one PeerFrameV1 payload -→ server 转交 Node 并返回 one PeerFrameV1 response -→ close -``` - -transport-auth envelope 只包含: - -```text -transportVersion -senderInstanceId -receiver inboxToken -client nonce -``` - -auth-ok 必须绑定 client nonce 和 server nonce,避免把其他连接的确认误关联。业务 frame 的长度和 bytes 位于 auth-ok 之后的独立、受限 frame 中。 - -要求: - -- token 使用常量时间比较。 -- sender instance UUID 由 broker 做基本格式/长度验证,TypeScript 再做完整验证。 -- 不允许第二个请求或第二次 auth。 -- client broker 必须在发送 token 或业务 frame 前完成 server SID/integrity 验证。 -- 未认证前不返回详细失败原因;对端只收到通用 authentication/connection failure。 -- 本地 Node 可通过稳定内部错误码区分 timeout、abort、protocol mismatch、broker crash 和 target unavailable。 -- 对 `sendMessage` 而言,transport request 一旦进入现有 outbound ledger,任何未获得匹配 acknowledgement 的错误(包括 broker crash、timeout、SID 验证失败和取消)都继续由 `PeerService.sendPrepared()` 映射为公开的 `PEER_DELIVERY_UNKNOWN`,并要求使用同一 message ID 重试。内部 broker 错误只作为去敏 cause/debug 信息,不能破坏现有 delivery-unknown 保证。ping/list 等非消息请求可保留更具体的内部错误。 - -### 7.5 并发与背压 - -- server connection 并发上限与现有候选扫描/队列规模协调,建议初始 64。 -- 超出上限立即拒绝,不创建无界 task/thread。 -- 每个连接有 auth deadline、request deadline 和 idle deadline。 -- Node↔broker stdout 写入使用异步背压,不在 CLI UI 线程执行同步重 I/O。 -- broker 不为每个永远阻塞的连接创建不可回收线程;优先 overlapped I/O 或受限 worker 模型。 -- shutdown deadline 到期后取消/关闭所有 handle。 - -### 7.6 错误码 - -新增错误码至少覆盖: - -```text -PEER_WINDOWS_HELPER_MISSING -PEER_WINDOWS_HELPER_HASH_MISMATCH -PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH -PEER_WINDOWS_UNSUPPORTED_ARCH -PEER_WINDOWS_RUNTIME_UNSAFE -PEER_WINDOWS_PIPE_CREATE_FAILED -PEER_WINDOWS_PEER_IDENTITY_UNVERIFIED -PEER_WINDOWS_BROKER_EXITED -``` - -面向用户的 reason 必须去除 terminal control;debug log 可记录 Win32 error code,但不得记录 token 或完整敏感 payload。 - -## 8. TypeScript Windows Transport - -### 8.1 新增文件 - -```text -packages/core/src/peers/windows-named-pipe-transport.ts -packages/core/src/peers/windows-peer-broker-protocol.ts -packages/core/src/peers/windows-peer-broker-artifact.ts -packages/core/src/peers/windows-peer-runtime-security.ts -packages/core/src/peers/platform-transport.ts -``` - -职责: - -- artifact 路径、架构和 hash 验证。 -- broker spawn 和 lifecycle。 -- binary frame encode/decode。 -- operation ID、timeout、AbortSignal 和 pending map。 -- 将 `PeerTransport.listen()` 映射到 broker `START_SERVER`。 -- 将 `PeerTransport.request()` 映射到 broker `OUTBOUND_REQUEST`。 -- 将 broker `INBOUND_REQUEST` 交给现有 `onRequest()`,回写 `INBOUND_RESPONSE`。 -- 在 abort/shutdown 时向 broker 发送 cancel,等待/处理 cancel ack,并按协议保留有界 late-response tombstone 后再清理 operation ID。 - -所有 tool execution 路径必须继续传递调用方的 `AbortSignal`,避免产生孤立 request/tool result。 - -### 8.2 Artifact 查找与验证 - -沿用现有 Windows shell supervisor 模式: - -```text -packages/core/dist/native/windows//xc-peer-broker.exe -``` - -启动前验证: - -- 当前架构为 x64/arm64。 -- manifest protocol version。 -- 文件相对路径未逃逸 native directory。 -- PE machine 与架构一致。 -- SHA-256 与 manifest 一致。 - -验证失败不得尝试 PATH 中的同名可执行文件,也不得下载二进制。 - -### 8.3 启动顺序 - -Windows `PeerService.start()` 推荐顺序: - -```text -1. registry.initialize() - └─ 默认 Windows runtime security provider 验证 helper artifact - └─ 运行一次性 secure-runtime 子命令并等待退出 - └─ 验证 ACL、本机 volume、reparse safety,取得 namespace-id -2. 启动长生命周期 broker 模式 -3. broker START_SERVER(namespace-id) -4. broker 返回最终随机 pipe address -5. 写入 registration { kind: 'windows-pipe' } -6. 启动 heartbeat -7. 标记 service started -``` - -这样 direct registry callers 与 `PeerService` 走同一个安全不变量,不依赖 Service 先调用隐藏的加固步骤。 - -任一步失败: - -- 禁止后续 registration write。 -- 等待已排队 registration write 收敛。 -- 删除仅属于当前 instance 的 registration。 -- 关闭 broker。 -- 设置稳定 unavailable code/reason。 - -### 8.4 意外退出 - -broker 意外退出时: - -1. `PeerTransportServer.closed` resolve 为 unexpected。 -2. `PeerService` 递增 lifecycle generation,停止新请求。 -3. 停止 heartbeat,关闭 registration write generation,并等待现有 `registrationWriteTail` 收敛,防止已通过 generation check 的 rename 在清理后重新写回 registration。 -4. 在 write tail 收敛后删除当前 registration;对 Windows 短暂文件占用执行有界异步重试。若最终仍失败,registration 因 ping 失败对其他 peer 不可见,并在 owner shutdown 或 PID 死亡后的既有 grace cleanup 中继续回收。 -5. pending transport request 以 `PEER_WINDOWS_BROKER_EXITED` 作为内部 cause 结束;已进入 outbound ledger 的 `sendMessage` 必须继续公开返回 `PEER_DELIVERY_UNKNOWN`。 -6. `/list-agents` 和后续工具调用显示明确 unavailable reason。 -7. 首版不自动无限重启,避免 crash loop;是否允许一次有界重启另行评审。 - -## 9. Native 构建与分发 - -### 9.1 Artifact 布局 - -目标布局: - -```text -packages/core/native/prebuilt/windows/ - manifest.json - x64/ - xc-shell-supervisor.exe - xc-peer-broker.exe - arm64/ - xc-shell-supervisor.exe - xc-peer-broker.exe -``` - -`dist/native/windows/` 保持相同结构。 - -### 9.2 Manifest - -将单 artifact manifest 扩展为多 artifact: - -```json -{ - "manifestVersion": 2, - "artifacts": { - "x64": { - "shellSupervisor": { - "file": "x64/xc-shell-supervisor.exe", - "protocolVersion": 2, - "sha256": "...", - "sourceSha256": "..." - }, - "peerBroker": { - "file": "x64/xc-peer-broker.exe", - "protocolVersion": 1, - "sha256": "...", - "sourceSha256": "..." - } - }, - "arm64": {} - } -} -``` - -每个 artifact 独立 source hash,修改一个 helper 不应无理由要求另一个 helper 重建。 - -这是 manifest breaking change。必须同步修改现有 shell supervisor loader `packages/core/src/tools/shell-session/providers/windows-job.ts` 及其 artifact-boundary tests,使其读取 `artifacts[arch].shellSupervisor`;在新旧 loader/manifest 不匹配时明确报 protocol/manifest error。迁移完成前不得提交只有新 manifest、仍使用旧 loader 的中间状态,否则 Windows shell session 会全部失效。 - -### 9.3 脚本修改 - -需要修改: - -```text -packages/core/scripts/native-artifacts.mjs -packages/core/scripts/build-native.mjs -packages/core/scripts/copy-native.mjs -packages/core/scripts/write-native-manifest.mjs -``` - -要求: - -- 普通 `pnpm build` 只验证并复制 checked-in artifacts。 -- `pnpm build:native` 在 Windows 上构建当前架构的两个 helper,或支持显式 artifact 参数。 -- Release CI 使用 `cargo xwin` 分别构建 x64/arm64。 -- source hash 只覆盖对应 crate 的 `Cargo.toml`、`Cargo.lock` 和 `.rs` 文件。 -- package smoke test 验证两个架构的两个 exe 都存在。 -- 更新现有 shell supervisor artifact loader 和测试以适配 manifest v2。 - -### 9.4 普通开发无 Rust 保证 - -PR CI 保持分层: - -```text -普通 lint/typecheck/test/package jobs - → 不安装 Rust - → 使用 checked-in prebuilt helper - -native-windows job - → 安装 Rust - → cargo fmt/test/clippy - → 构建 fresh x64 helper - → 运行 Windows transport/E2E tests -``` - -如果 Rust source 改变但 prebuilt/manifest 未更新,普通 build 必须明确失败,防止源码与发布二进制漂移。 - -### 9.5 Package size 预算 - -新增两份 broker executable 很可能超过当前 package size 余量。实施阶段必须: - -- 保持 Rust release 的 LTO、单 codegen unit、panic abort 和 strip。 -- 在 x64/arm64 产物生成后记录每个 helper 和 npm tarball 的实际增量。 -- 修改 `scripts/check-package-size.mjs` 时以实测增量加有限余量调整阈值,并在测试中为单个 native artifact 设置独立上限;不能删除 package size gate 或改成无界。 -- `pnpm check:package` 是阶段 2 和最终发布门禁,不允许等到 release 才发现超限。 - -## 10. 兼容性 - -### 10.1 旧版本 - -- 旧 Windows 版本继续看不到新 Session 的前提是旧 parser 拒绝 `windows-pipe`;这是安全行为。 -- 新版本在 macOS/Linux 扫描到 `windows-pipe` registration 时忽略,不尝试连接。 -- 新版本 Windows 扫描到 `unix` registration 时忽略。 -- `PeerFrameV1` 不变,因此业务层不需要平台转换。 - -### 10.2 `X_CODE_HOME` - -继续尊重 `userXcodeDir()` 和 `X_CODE_HOME`。测试可以把 `X_CODE_HOME` 指向 NTFS 临时目录。Windows Peer runtime 必须位于支持 persistent ACL 的本机 volume;UNC、mapped network drive 和 `DRIVE_REMOTE` 明确不支持,避免两台机器共享 registration 后用本机 PID 误判和清理对方记录。 - -若路径所在文件系统无法提供要求的 ACL、本机 volume 或路径安全性: - -```text -Peer Messaging unavailable -``` - -但以下功能必须继续工作: - -- 普通聊天。 -- shell、文件和其他工具。 -- session resume/fork。 -- 未命名 Session。 - -### 10.3 Windows 版本 - -支持范围跟随项目 Node.js 22 的 Windows 支持范围和现有原生 helper 支持范围。不得额外声称支持已被 Node 22 放弃的平台。Named Pipe API 缺失或安全调用失败时 fail closed。 - -## 11. 实施阶段 - -### 阶段 0:基线与测试固定 - -目标:确认改造前行为,避免把已有 Peer 语义变化混入 Windows transport。 - -工作: - -- 运行现有 peer registry/transport/service/tools/authority/inbox tests。 -- 记录 Windows 当前 `PEER_UNSUPPORTED_PLATFORM` 行为。 -- 为平台 transport factory、descriptor parser 和 unsupported arch 增加预期测试。 - -门禁: - -- 当前 Unix Peer 测试全部通过。 -- Windows 普通 CI 不回退。 -- 没有产品行为变更。 - -### 阶段 1:平台无关重构 - -目标:把 Unix endpoint 假设移出通用 Service/Registry。 - -工作: - -- 新增 `PeerTransportDescriptor`。 -- 新增 platform transport factory。 -- 将 Unix startup/stale endpoint 逻辑移动到 Unix transport/lifecycle。 -- 将 dead endpoint cleanup 委托给 transport。 -- 增加 `PeerTransportServer.closed`。 -- Service 仍在 Windows 返回 unsupported。 - -门禁: - -- macOS/Linux 用户可见行为和 wire behavior 不变。 -- 所有现有 Unix ownership replacement、abort、timeout 和 shutdown 测试通过。 -- 注入 fake transport 的 service tests 无平台耦合。 -- Windows 仍 fail closed。 - -### 阶段 2:多 Native Artifact 基础设施 - -目标:支持第二个 Windows helper,同时保持普通开发不需要 Rust。 - -工作: - -- 扩展 manifest schema。 -- 重构 copy/build/write/verify scripts。 -- 更新现有 shell supervisor loader,原子迁移 manifest schema。 -- 新增 artifact 单元测试、package size gate 和 package smoke assertions。 -- 更新 PR/Release workflows。 - -门禁: - -- 普通 `pnpm build/test` 不调用 Cargo。 -- source hash 漂移、PE 架构错误、hash 错误和路径逃逸均被拒绝。 -- x64/arm64 shell supervisor 现有运行行为不变。 -- `pnpm check:package` 在有明确、实测的新预算下通过。 - -### 阶段 3:Rust Broker 与安全 Runtime - -目标:完成可独立审计的 Windows 原生安全层。 - -工作: - -- 实现 framing parser/encoder。 -- 实现 secure runtime ACL 创建/验证。 -- 实现 secure Named Pipe server/client。 -- 实现 Account SID 与 integrity level 双向验证。 -- 实现分阶段 token auth,auth-ok 前不发送业务 frame。 -- 实现 cancel ack、late-response tombstone、超时、并发上限和 shutdown。 -- 实现 parent stdio EOF 自动退出。 -- 加入 Rust unit/integration tests。 - -门禁: - -- DACL 的全部允许 ACE 都属于当前 Account SID 和经批准的可选 LocalSystem allowlist。 -- remote client flag 在每个 server instance 创建路径中被锁定和测试。 -- 只有首个 server instance 使用 `FILE_FLAG_FIRST_PIPE_INSTANCE`,后续 instance 可正常建立。 -- 不同 Account SID 或不兼容 integrity level 被拒绝。 -- server/client SID 无法验证时拒绝。 -- 错误 token 不向 Node 派发请求。 -- malformed/oversized/truncated frame 不崩溃、不无界分配。 -- parent 退出后 broker 和 Pipe 自动消失。 -- `cargo fmt --check`、`cargo clippy -D warnings`、`cargo test --locked` 通过。 - -### 阶段 4:TypeScript Windows Transport 集成 - -目标:让 `PeerService` 在 Windows 通过 broker 工作。 - -工作: - -- 实现 broker artifact loader 和协议 codec。 -- 实现 `createWindowsNamedPipeTransport()`。 -- 接通 runtime security、listen、request、abort、shutdown 和 fatal exit。 -- 扩展 registry parser/cleanup。 -- 移除 `PeerService.start()` 的 Windows unconditional gate。 -- 保持 helper 缺失/unsafe runtime 的显式 unavailable 行为。 - -门禁: - -- Windows 两个 Core PeerService 可以 list/send/ping。 -- 错误 token、错误 SID、stale registration、broker crash 和 abort 在 transport 层均产生稳定内部错误;已进入 outbound ledger 的消息仍按现有语义公开返回 `PEER_DELIVERY_UNKNOWN`。 -- Unix 测试无回退。 -- API export snapshot 按预期更新。 - -### 阶段 5:CLI E2E、文档和发布 - -目标:完成用户可见功能和发布门禁。 - -工作: - -- 在 Windows 启用或改写 `tui-peer-messaging.test.ts`。 -- 更新中英文 Peer Messaging 文档和 README 平台说明。 -- 更新 CHANGELOG。 -- 生成并校验 x64/arm64 broker artifacts。 -- 执行完整跨平台 CI 和 package smoke test。 - -门禁: - -- Windows TUI 两个真实进程完成发现和双向消息。 -- npm tarball 包含并验证两个架构的 broker。 -- 未安装 Rust 的干净 Windows 环境可安装、构建测试并运行该功能。 -- macOS/Linux 包和功能无回退。 - -## 12. 文件变更清单 - -### 12.1 预计新增 - -```text -WINDOWS_PEER_MESSAGING_IMPLEMENTATION_PLAN.md -packages/core/src/peers/platform-transport.ts -packages/core/src/peers/windows-named-pipe-transport.ts -packages/core/src/peers/windows-peer-broker-protocol.ts -packages/core/src/peers/windows-peer-broker-artifact.ts -packages/core/native/windows-peer-broker/Cargo.toml -packages/core/native/windows-peer-broker/Cargo.lock -packages/core/native/windows-peer-broker/src/*.rs -packages/core/tests/windows-peer-broker-protocol.test.ts -packages/core/tests/windows-peer-transport.test.ts -packages/core/tests/windows-native-artifacts.test.ts -``` - -测试文件名称可按现有组织合并,但必须覆盖相同职责。 - -### 12.2 预计修改 - -```text -packages/core/src/peers/transport.ts -packages/core/src/peers/types.ts -packages/core/src/peers/paths.ts -packages/core/src/peers/registry.ts -packages/core/src/peers/service.ts -packages/core/src/peers/unix-socket-transport.ts -packages/core/src/peers/index.ts -packages/core/src/index.ts -packages/core/src/tools/shell-session/providers/windows-job.ts -packages/core/scripts/native-artifacts.mjs -packages/core/scripts/build-native.mjs -packages/core/scripts/copy-native.mjs -packages/core/scripts/write-native-manifest.mjs -scripts/check-package-size.mjs -packages/core/tests/peer-registry.test.ts -packages/core/tests/peer-service.test.ts -packages/core/tests/peer-transport.test.ts -packages/core/tests/api-exports.test.ts -packages/core/tests/windows-job-provider.test.ts -packages/cli/tests/pty/tui-peer-messaging.test.ts -.github/workflows/pr-check.yml -.github/workflows/release.yml -docs/peer-messaging.md -docs/peer-messaging.en.md -README.md -README.zh-CN.md -CHANGELOG.md -``` - -不要顺便重构无关 shell supervisor、TUI renderer 或 agent loop。 - -## 13. 验证计划 - -### 13.1 TypeScript/Core - -最低验证命令: - -```powershell -pnpm typecheck -pnpm lint:check -pnpm format:check -pnpm build -pnpm test packages/core/tests/peer-registry.test.ts -pnpm test packages/core/tests/peer-transport.test.ts -pnpm test packages/core/tests/peer-service.test.ts -pnpm test packages/core/tests/windows-peer-broker-protocol.test.ts -pnpm test packages/core/tests/windows-peer-transport.test.ts -``` - -最终执行: - -```powershell -pnpm run ci -pnpm check:package -``` - -注意项目 `pnpm test ` 会先 build,core 源码改动后必须生成最新 `packages/core/dist/`。 - -### 13.2 Rust - -```powershell -cargo fmt --manifest-path packages/core/native/windows-peer-broker/Cargo.toml --check -cargo clippy --locked --all-targets --manifest-path packages/core/native/windows-peer-broker/Cargo.toml -- -D warnings -cargo test --locked --manifest-path packages/core/native/windows-peer-broker/Cargo.toml -pnpm build:native -``` - -### 13.3 功能测试矩阵 - -| 场景 | 预期 | -| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| 两个同账户命名 Session | 相互发现并发送 | -| 未命名 Session | 不注册、不启动 broker | -| print mode | 不注册 | -| 同名 Session | list 显示两个,按名称发送报歧义 | -| 完整 peer UUID | 精确发送 | -| receiver idle | 自动新 turn | -| receiver busy | 安全边界注入 | -| receiver goal/maintenance | 延迟,不抢 lease | -| policy hold | 显示 Accept/Refuse | -| wrong token | 拒绝且不调用 onRequest | -| wrong SID | 原生层拒绝 | -| same SID、不同/不兼容 integrity level | 按首版 policy 拒绝 | -| remote client | 原生层拒绝 | -| broker crash | registration 立即有界重试清理;失败时隐藏,并在 shutdown/PID-dead cleanup 回收;service unavailable | -| Node crash | broker 退出、Pipe 消失 | -| sender abort | pending request 取消,无 orphan | -| oversized frame | 连接关闭,进程继续 | -| unsafe X_CODE_HOME | 仅 Peer unavailable | -| x64 package | helper hash/PE/运行通过 | -| arm64 package | helper hash/PE 通过;功能首次发布,以及 arm64 binary hash、Rust source、toolchain/build flags、loader、broker protocol 或 package path 任一变化后,必须在真实 Windows arm64 环境执行 broker self-test 和双 Session smoke | - -### 13.4 安全验证 - -必须有自动化或可复现的审计证据证明: - -1. Pipe security descriptor 的全部允许 ACE 都属于批准 allowlist。 -2. `PIPE_REJECT_REMOTE_CLIENTS` 实际传入所有 server instance。 -3. `FILE_FLAG_FIRST_PIPE_INSTANCE` 只用于首实例,后续 instance 可正常建立。 -4. client 和 server 都验证 Account SID 与 integrity policy。 -5. token 比较为常量时间。 -6. 未认证连接收不到业务 response。 -7. Registry DACL 不依赖 Node mode bits。 -8. 不安全 ACL、filesystem 或 reparse path fail closed。 -9. 所有 frame 长度在分配前检查。 -10. 所有请求、连接和 operation map 有固定上限与 deadline。 -11. debug/user error 不泄漏 token。 -12. helper hash/path/PE machine/protocol mismatch 均拒绝启动。 - -不同用户测试优先在 Windows CI 中通过临时本地账户执行;如果 hosted runner 无法稳定创建账户,则必须提供仓库内可重复运行的 Windows integration harness,并在发布前的受控 Windows 环境执行,结果记录在 PR 验证说明中。仅检查代码中存在 SID 比较调用不能替代运行验证。 - -远程拒绝分两层验收:自动化 native test 必须验证每个 `CreateNamedPipeW` server-instance 路径都包含 `PIPE_REJECT_REMOTE_CLIENTS`;功能首次发布前还必须在两台受控 Windows 主机上执行对照测试。测试 harness 先创建一个仅用于测试、DACL/认证条件相同但不带 reject flag 的 control pipe,证明 SMB、凭据、Server service 和 firewall 路径可达;同一远程客户端随后连接带 `PIPE_REJECT_REMOTE_CLIENTS` 的目标 pipe 必须被拒绝。没有 control pipe 成功证据的“连接失败”不能作为远程拒绝证据。后续未修改 Pipe 创建路径的版本可复用该集成证据,创建路径变化后必须重跑。 - -### 13.5 手工验收 - -在无 Rust 工具链、仅安装 Node 22 和 pnpm 的干净 Windows x64 环境: - -```powershell -pnpm install --frozen-lockfile -pnpm build -``` - -终端 A: - -```powershell -pnpm dev -- --name alpha -``` - -终端 B: - -```powershell -pnpm dev -- --name beta -``` - -验收: - -1. 两边 `/list-agents` 能看到对方。 -2. alpha 发送消息给 beta,beta 空闲时启动新 turn。 -3. beta 忙碌时消息不打断当前工具,在安全边界进入。 -4. hold 模式显示本地确认,peer 消息不能代替确认。 -5. 关闭 beta 后 alpha 不再列出 beta;无 broker 残留进程。 -6. 断掉 alpha 进程后对应 Pipe 自动消失。 -7. `DEBUG_STDOUT=1` 日志中无 inbox token。 - -## 14. 性能与资源边界 - -- 未命名 Session 不产生 broker 进程或 Pipe 开销。 -- broker 不轮询 registry;发现仍由显式 list/send 和现有 heartbeat 驱动。 -- 一个命名 Session 最多一个 broker child。 -- inbound connection、active operation、frame 和 queue 均有固定上限。 -- 当前 CLI 会在 `startApp()` 前 await peer startup;因此 helper 校验、`secure-runtime` 和 broker ready 必须全部使用异步 I/O、具有总 deadline,并建立 Windows 启动延迟基线。若实测延迟影响首屏,应在独立改动中把 Peer lifecycle 移到 render 后启动,不能在本功能中无证据宣称已经是 post-render。 -- helper hash 验证可缓存于当前进程,但不能跨 artifact 变更错误复用。 -- `listAgents` 继续使用有界并发和总 deadline。 -- Windows Named Pipe busy 等待必须受 request deadline 控制;Node abort 后本地 promise 和 broker operation 都要终止。 - -不以牺牲安全验证换取启动性能。性能基线和阈值应在实现 PR 中根据真实 Windows CI 数据固定。 - -## 15. 可观测性与用户错误 - -用户错误应简短、可操作: - -```text -Peer messaging unavailable: Windows peer broker is missing; reinstall x-code-cli. -Peer messaging unavailable: Windows peer runtime directory is not private. -Peer messaging unavailable: Windows arm32 is not supported. -Peer messaging unavailable: Windows peer broker exited unexpectedly. -``` - -Debug events建议: - -```text -peer.windows.broker-start -peer.windows.runtime-secured -peer.windows.server-ready -peer.windows.request-failed -peer.windows.broker-exit -``` - -允许记录: - -- error code。 -- operation kind。 -- elapsed time。 -- architecture。 -- instance short ID。 - -禁止记录: - -- inbox token。 -- 完整 SID。 -- 原始消息正文。 -- 完整 auth envelope。 - -## 16. 发布与回滚 - -### 16.1 发布门禁 - -发布前必须满足: - -- x64/arm64 helper 来自锁定源码和锁定依赖。 -- manifest source hash、binary hash 和 PE machine 全部匹配。 -- Release CI 在 Windows x64 运行 freshly built broker E2E。 -- arm64 完成交叉构建和 PE/hash 校验;功能首次发布,以及 arm64 binary hash、Rust source、toolchain/build flags、loader、broker protocol 或 package path 任一变化后,必须在真实 Windows arm64 设备或 VM 上执行 `xc-peer-broker.exe` self-test 与两个命名 Session 的 list/send smoke,并把命令、版本和结果附在发布验证记录中。 -- npm tarball smoke test验证两个 helper 均存在。 -- 无 Rust 工具链的安装/运行验证通过。 -- 中英文文档明确 Windows 支持和 `X_CODE_HOME` 安全要求。 - -### 16.2 回滚策略 - -如果发布后发现 Windows native transport 安全或稳定问题: - -- 保留 Unix transport,不回滚整个 Peer Messaging。 -- 在平台 factory 中恢复 Windows fail-closed gate。 -- 不回退到纯 Node Named Pipe 或 TCP。 -- 发布 patch 版本,明确错误原因。 -- 已存在 registration 由 PID/grace cleanup 回收;Named Pipe 随 broker 退出自动消失。 - -## 17. Definition of Done - -只有同时满足以下条件,Windows Peer Messaging 才可标记完成: - -### 功能 - -- [ ] Windows x64 两个命名 Session 可发现、发送、接收和返回 delivery update。 -- [ ] Windows arm64 artifact 可验证,并在真实 Windows arm64 上完成规定的 self-test 和双 Session smoke。 -- [ ] `/list-agents`、`listAgents`、`sendMessage` 与 Unix 用户语义一致。 -- [ ] idle/busy/held/goal/maintenance 路径通过测试。 -- [ ] 未命名 Session、print mode 和 sub-agent 边界保持不变。 - -### 安全 - -- [ ] Pipe 使用原子 protected DACL。 -- [ ] Pipe 拒绝 remote clients。 -- [ ] client/server Account SID 与 integrity policy 双向验证。 -- [ ] inboxToken 第二层认证保留。 -- [ ] runtime/registry ACL 经原生代码创建并验证。 -- [ ] unsafe `X_CODE_HOME` fail closed。 -- [ ] 不同用户、错误 token、伪造 registration 和 pipe squatting 测试通过。 -- [ ] peer taint、authority 和 hook 隔离测试无回退。 - -### 生命周期 - -- [ ] Node 正常退出后 broker/Pipe 被清理。 -- [ ] Node 崩溃后 broker/Pipe 被清理。 -- [ ] broker 崩溃后 Node service fail closed;registration 立即有界重试清理,失败时对其他 peer 隐藏,并能在 owner shutdown 或 PID-dead grace cleanup 中回收。 -- [ ] timeout/abort/shutdown 不遗留 pending operation。 - -### 构建与发布 - -- [ ] 普通本地开发不需要 Rust。 -- [ ] Rust source job通过 fmt/clippy/test。 -- [ ] x64/arm64 预构建产物和 manifest 更新。 -- [ ] package smoke test覆盖两个 helper。 -- [ ] `pnpm run ci` 通过 Linux/macOS/Windows。 -- [ ] 中英文文档和 CHANGELOG 更新。 - -## 18. 实施原则 - -1. 先重构边界,再加入 Windows;不要在同一步同时重写 Unix transport。 -2. 不删除现有 Unix socket ownership、inode 和 replacement 防护。 -3. 不因 Windows transport 改变 PeerFrame、authority、taint 或队列语义。 -4. 所有原生输入先检查长度、版本和枚举,再分配或解析。 -5. 所有异步请求必须有 timeout、AbortSignal/cancel 和 shutdown 收敛路径。 -6. 原生安全条件无法证明时 fail closed。 -7. 不添加未经审计的纯 Node fallback。 -8. 普通开发和最终用户不承担 Rust 工具链依赖。 -9. 原生二进制、源码和 manifest 必须可追溯且 hash 一致。 -10. 每个阶段独立验证,避免以“最终 E2E 能跑”替代安全不变量测试。 diff --git a/docs/peer-messaging.en.md b/docs/peer-messaging.en.md index 4ee5e1a..571faa7 100644 --- a/docs/peer-messaging.en.md +++ b/docs/peer-messaging.en.md @@ -2,7 +2,7 @@ Cross-session messaging lets interactive X-Code sessions on the same machine discover one another and exchange plain-text work requests. Each participating root session keeps its own model, conversation, working directory, and local permission boundary. -> This release supports macOS, Linux, and Windows x64/arm64. Print mode (`--print`) does not register a peer; Windows ia32 is unsupported. +> This release supports macOS, Linux, and Windows x64. A Windows arm64 broker artifact is packaged as a preview but has not completed native-device acceptance. Print mode (`--print`) does not register a peer; Windows ia32 is unsupported. ## Start named sessions diff --git a/docs/peer-messaging.md b/docs/peer-messaging.md index 6a2406e..1dc1d90 100644 --- a/docs/peer-messaging.md +++ b/docs/peer-messaging.md @@ -2,7 +2,7 @@ 跨会话消息允许同一台机器上的多个交互式 X-Code Session 互相发现并交换纯文本工作请求。每个参与通信的根 Session 仍拥有独立的模型、对话、工作目录和本地权限边界。 -> 当前版本支持 macOS、Linux,以及 Windows x64 / arm64。非交互模式(`--print`)不会注册为 Peer;Windows ia32 不受支持。 +> 当前版本支持 macOS、Linux 和 Windows x64。Windows arm64 broker 产物已随包提供,但尚未完成目标设备实机验收,当前属于预览支持。非交互模式(`--print`)不会注册为 Peer;Windows ia32 不受支持。 ## 启动命名 Session diff --git a/packages/cli/esbuild.config.js b/packages/cli/esbuild.config.js index fbccb1b..399d27f 100644 --- a/packages/cli/esbuild.config.js +++ b/packages/cli/esbuild.config.js @@ -5,7 +5,8 @@ import { builtinModules } from 'node:module' import { fileURLToPath } from 'node:url' const OUT_DIR = fileURLToPath(new URL('./dist/', import.meta.url)) -const CORE_NATIVE_DIR = fileURLToPath(new URL('../core/dist/native/', import.meta.url)) +const CORE_WINDOWS_NATIVE_DIR = fileURLToPath(new URL('../core/dist/native/windows/', import.meta.url)) +const CLI_WINDOWS_NATIVE_DIR = fileURLToPath(new URL('./dist/native/windows/', import.meta.url)) // ESM polyfills — provide __dirname, __filename, and require() for CJS compat const ESM_POLYFILLS = ` @@ -145,7 +146,7 @@ await esbuild.build({ }) try { - await cp(CORE_NATIVE_DIR, fileURLToPath(new URL('./dist/native/', import.meta.url)), { recursive: true }) + await cp(CORE_WINDOWS_NATIVE_DIR, CLI_WINDOWS_NATIVE_DIR, { recursive: true }) } catch (error) { if (error?.code !== 'ENOENT') throw error } diff --git a/packages/cli/tests/package/install-smoke.test.ts b/packages/cli/tests/package/install-smoke.test.ts index a43bce4..d6fa527 100644 --- a/packages/cli/tests/package/install-smoke.test.ts +++ b/packages/cli/tests/package/install-smoke.test.ts @@ -340,30 +340,46 @@ describe('published CLI tarball', () => { await fs.writeFile(pdfPath, makePdfBuffer([{ text: 'Installed package PDF worker smoke test' }])) const script = ` const fs = require('node:fs') + const { fork } = require('node:child_process') const { Worker } = require('node:worker_threads') - const worker = new Worker(${JSON.stringify(workerPath)}) + const childMode = process.platform === 'win32' + const worker = childMode + ? fork(${JSON.stringify(workerPath)}, [], { + execArgv: ['--max-old-space-size=512'], + serialization: 'advanced', + stdio: ['ignore', 'ignore', 'inherit', 'ipc'], + }) + : new Worker(${JSON.stringify(workerPath)}) + const postMessage = (message, transferList = []) => { + if (childMode) worker.send(message) + else worker.postMessage(message, transferList) + } const timer = setTimeout(() => { console.error('worker timeout'); process.exit(1) }, 30000) const fail = (error) => { clearTimeout(timer); console.error(error?.stack || error); process.exit(1) } + let destroyAcknowledged = false worker.on('error', fail) + worker.on('exit', (code) => { + clearTimeout(timer) + if (!destroyAcknowledged || code !== 0) return fail(new Error('PDF worker did not exit cleanly after destroy')) + process.stdout.write('package-pdf-rendered', () => process.exit(0)) + }) worker.on('message', (response) => { if (!response.ok) return fail(new Error(response.error)) if (response.result.type === 'init') { if (response.result.totalPages !== 1) return fail(new Error('wrong page count')) - worker.postMessage({ id: 2, type: 'render', pageNumber: 1, desiredWidth: 320, maxPixels: 1000000 }) + postMessage({ id: 2, type: 'render', pageNumber: 1, desiredWidth: 320, maxPixels: 1000000 }) return } if (response.result.type === 'render') { const png = Buffer.from(response.result.data) if (!png.subarray(0, 8).equals(Buffer.from([137,80,78,71,13,10,26,10]))) return fail(new Error('not PNG')) - worker.postMessage({ id: 3, type: 'destroy' }) + postMessage({ id: 3, type: 'destroy' }) return } - clearTimeout(timer) - process.stdout.write('package-pdf-rendered') - worker.terminate().then(() => process.exit(0), fail) + destroyAcknowledged = true }) const bytes = Uint8Array.from(fs.readFileSync(${JSON.stringify(pdfPath)})) - worker.postMessage({ id: 1, type: 'init', data: bytes.buffer }, [bytes.buffer]) + postMessage({ id: 1, type: 'init', data: bytes.buffer }, [bytes.buffer]) ` const result = await command(process.execPath, ['-e', script], { cwd: suiteRoot, timeoutMs: 40_000 }) if (result.exitCode !== 0) throw new Error(`Installed PDF worker failed:\n${result.stdout}\n${result.stderr}`) @@ -392,13 +408,17 @@ describe('published CLI tarball', () => { }) const timer = setTimeout(() => { console.error('worker timeout'); process.exit(1) }, 30000) worker.on('error', (error) => { clearTimeout(timer); console.error(error); process.exit(1) }) - worker.on('message', (response) => { + let resultReceived = false + worker.on('exit', (code) => { clearTimeout(timer) + if (!resultReceived || code !== 0) process.exit(1) + process.stdout.write('package-image-normalized', () => process.exit(0)) + }) + worker.on('message', (response) => { if (!response.ok) { console.error(response.error); process.exit(1) } const png = Buffer.from(response.result.data) if (response.result.mimeType !== 'image/png' || !png.subarray(0, 8).equals(Buffer.from([137,80,78,71,13,10,26,10]))) process.exit(1) - process.stdout.write('package-image-normalized') - worker.terminate().then(() => process.exit(0), () => process.exit(1)) + resultReceived = true }) ` const result = await command(process.execPath, ['-e', script], { cwd: suiteRoot, timeoutMs: 40_000 }) @@ -473,7 +493,7 @@ describe('published CLI tarball', () => { for (const arch of ['x64', 'arm64']) { for (const [artifactName, protocolVersion] of [ ['shellSupervisor', 2], - ['peerBroker', 1], + ['peerBroker', 2], ] as const) { const artifact = manifest.artifacts[arch]![artifactName]! const bytes = byName.get(`package/dist/native/windows/${artifact.file}`) diff --git a/packages/cli/tests/pty/harness.ts b/packages/cli/tests/pty/harness.ts index cf572f7..a5b6198 100644 --- a/packages/cli/tests/pty/harness.ts +++ b/packages/cli/tests/pty/harness.ts @@ -222,14 +222,14 @@ export async function createTuiHarness(options: { ? `& ${values.map(powershellQuote).join(' ')}; Write-Output "${EXIT_MARKER}$LASTEXITCODE"\r` : `${values.map(posixQuote).join(' ')}; __x_code_status=$?; printf '\\n${EXIT_MARKER}%s\\n' "$__x_code_status"\n` processUnderTest.write(command) - await waitFor(() => raw.includes('test-model'), 'CLI header', 20_000) + await waitFor(() => raw.includes('test-model'), 'CLI header', 10_000) await waitFor( async () => { await waitForRendered() return lastPromptLine(terminalScreen(terminal)) !== '' }, 'interactive input prompt', - 20_000, + 10_000, ) await waitForRendered() await waitForTerminalQuiet() diff --git a/packages/cli/tests/pty/tui-clear.test.ts b/packages/cli/tests/pty/tui-clear.test.ts index 54ba5ce..32fc1f3 100644 --- a/packages/cli/tests/pty/tui-clear.test.ts +++ b/packages/cli/tests/pty/tui-clear.test.ts @@ -39,7 +39,6 @@ describe('TUI /clear behavior', () => { await harness.waitForScreen( (screen) => !screen.includes('LINE-01') && !screen.includes('PowerShell(') && screen.includes('test-model'), 'viewport cleared after /clear', - 10_000, ) const lines = harness.screen() diff --git a/packages/cli/tests/pty/tui-peer-messaging.test.ts b/packages/cli/tests/pty/tui-peer-messaging.test.ts index eec1046..57ca489 100644 --- a/packages/cli/tests/pty/tui-peer-messaging.test.ts +++ b/packages/cli/tests/pty/tui-peer-messaging.test.ts @@ -77,6 +77,81 @@ describe('TUI cross-session messaging', () => { } }) + it('routes a message around three independent named terminal sessions', async () => { + const alphaProvider = await startFakeProvider([ + { + type: 'tool-call', + name: 'sendMessage', + input: { to: 'beta', message: 'ring alpha to beta' }, + finalText: 'alpha started ring', + }, + { type: 'completion', text: 'alpha received completed ring' }, + ]) + const betaProvider = await startFakeProvider([ + { + type: 'tool-call', + name: 'sendMessage', + input: { to: 'gamma', message: 'ring beta to gamma' }, + finalText: 'beta forwarded ring', + }, + ]) + const gammaProvider = await startFakeProvider([ + { + type: 'tool-call', + name: 'sendMessage', + input: { to: 'alpha', message: 'ring gamma to alpha' }, + finalText: 'gamma closed ring', + }, + ]) + const workspace = await createPeerTestWorkspace('xc-pty-peer-ring-') + const alpha = await createTuiHarness({ workspace, provider: alphaProvider }) + const beta = await createTuiHarness({ workspace, provider: betaProvider }) + const gamma = await createTuiHarness({ workspace, provider: gammaProvider }) + try { + await alpha.startCli(['-t', '--name', 'alpha']) + await beta.startCli(['-t', '--name', 'beta']) + await gamma.startCli(['-t', '--name', 'gamma']) + + await vi.waitFor( + async () => { + const registrations = await fs.readdir(path.join(workspace.xcodeHome, 'runtime', 'peers')) + expect(registrations.filter((name) => name.endsWith('.json'))).toHaveLength(3) + }, + { timeout: 10_000 }, + ) + await submitInput(alpha, '/list-agents') + await alpha.waitForText(/beta .*peer:[0-9a-f-]{36} .*idle/) + await alpha.waitForText(/gamma .*peer:[0-9a-f-]{36} .*idle/) + await submitInput(alpha, 'start the three-session ring') + + await beta.waitForText('ring alpha to beta', 10_000) + await gamma.waitForText('ring beta to gamma', 10_000) + await alpha.waitForText('ring gamma to alpha', 10_000) + + const alphaRequests = await alphaProvider.waitForMainRequests(3, 10_000) + const betaRequests = await betaProvider.waitForMainRequests(2, 10_000) + const gammaRequests = await gammaProvider.waitForMainRequests(2, 10_000) + expect(alphaRequests[2]?.rawBody).toContain('ring gamma to alpha') + expect(betaRequests[0]?.rawBody).toContain('ring alpha to beta') + expect(gammaRequests[0]?.rawBody).toContain('ring beta to gamma') + await alpha.waitForText('alpha received completed ring') + await beta.waitForText('beta forwarded ring') + await gamma.waitForText('gamma closed ring') + + await exitTui(alpha) + await exitTui(beta) + await exitTui(gamma) + } finally { + await alpha.dispose() + await beta.dispose() + await gamma.dispose() + await alphaProvider.close() + await betaProvider.close() + await gammaProvider.close() + await workspace.cleanup() + } + }) + it('renders authority metadata and payload injection as inert visible escapes', async () => { const metadataInjection = `unsafe\x1b]52;c;bWV0YWRhdGE=\x07\u202e.txt` const payloadInjection = diff --git a/packages/cli/tests/shutdown-coordinator.test.ts b/packages/cli/tests/shutdown-coordinator.test.ts index 64eff96..ba8e4b9 100644 --- a/packages/cli/tests/shutdown-coordinator.test.ts +++ b/packages/cli/tests/shutdown-coordinator.test.ts @@ -9,71 +9,83 @@ const timing = { describe('CLI shutdown coordinator', () => { it('runs shell cleanup before ordinary drains and shares one absolute deadline with emergency cleanup', async () => { - const order: string[] = [] - let emergencyDeadline = 0 - const startedAt = performance.now() - const result = await runShutdownPhases({ - controller: { - quiesce: async () => { - order.push('quiesce') - }, - terminateShells: async () => { - order.push('shell') - return null - }, - drain: async () => { - order.push('drain') + vi.useFakeTimers() + try { + const order: string[] = [] + let emergencyDeadline = 0 + const startedAt = performance.now() + const result = await runShutdownPhases({ + controller: { + quiesce: async () => { + order.push('quiesce') + }, + terminateShells: async () => { + order.push('shell') + return null + }, + drain: async () => { + order.push('drain') + }, }, - }, - reason: 'cli-shutdown', - ordinaryFinalizers: [ - async () => { - order.push('ordinary') + reason: 'cli-shutdown', + ordinaryFinalizers: [ + async () => { + order.push('ordinary') + }, + ], + timing, + startedAt, + forceSync: (reason, deadline) => { + order.push('emergency') + emergencyDeadline = deadline + return { reason, requested: 0, results: [] } }, - ], - timing, - startedAt, - forceSync: (reason, deadline) => { - order.push('emergency') - emergencyDeadline = deadline - return { reason, requested: 0, results: [] } - }, - }) + }) - expect(order.slice(0, 2)).toEqual(['quiesce', 'shell']) - expect(order.at(-1)).toBe('emergency') - expect(emergencyDeadline).toBe(result.absoluteDeadline) - expect(result.absoluteDeadline).toBe(startedAt + timing.hardCapMs) - expect(result.shellPhaseTimedOut).toBe(false) - expect(result.ordinaryPhaseTimedOut).toBe(false) + expect(order.slice(0, 2)).toEqual(['quiesce', 'shell']) + expect(order.at(-1)).toBe('emergency') + expect(emergencyDeadline).toBe(result.absoluteDeadline) + expect(result.absoluteDeadline).toBe(startedAt + timing.hardCapMs) + expect(result.shellPhaseTimedOut).toBe(false) + expect(result.ordinaryPhaseTimedOut).toBe(false) + } finally { + vi.useRealTimers() + } }) it('enters emergency reserve without waiting forever for a stuck shell provider', async () => { - const startedAt = performance.now() - const result = await runShutdownPhases({ - controller: { - terminateShells: () => new Promise(() => {}), - drain: async () => {}, - }, - reason: 'sighup', - ordinaryFinalizers: [], - timing, - startedAt, - forceSync: (reason, deadline) => ({ - reason, - requested: 1, - results: [ - { - managerInstanceId: 'manager', - shellId: 'bg_1', - disposition: deadline > 0 ? 'force-sent-unconfirmed' : 'failed', - }, - ], - }), - }) + vi.useFakeTimers() + try { + const startedAt = performance.now() + const resultPromise = runShutdownPhases({ + controller: { + terminateShells: () => new Promise(() => {}), + drain: async () => {}, + }, + reason: 'sighup', + ordinaryFinalizers: [], + timing, + startedAt, + forceSync: (reason, deadline) => ({ + reason, + requested: 1, + results: [ + { + managerInstanceId: 'manager', + shellId: 'bg_1', + disposition: deadline > 0 ? 'force-sent-unconfirmed' : 'failed', + }, + ], + }), + }) - expect(result.shellPhaseTimedOut).toBe(true) - expect(result.emergency.requested).toBe(1) - expect(performance.now()).toBeLessThanOrEqual(result.absoluteDeadline + 20) + await vi.advanceTimersByTimeAsync(timing.hardCapMs - timing.emergencyReserveMs) + const result = await resultPromise + expect(result.shellPhaseTimedOut).toBe(true) + expect(result.emergency.requested).toBe(1) + expect(performance.now()).toBeLessThanOrEqual(result.absoluteDeadline) + } finally { + vi.useRealTimers() + } }) }) diff --git a/packages/core/native/prebuilt/windows/arm64/xc-peer-broker.exe b/packages/core/native/prebuilt/windows/arm64/xc-peer-broker.exe index 4e1511fb2a66699250b1337bacf3a57e68163493..0a7d727546296a3cb3889a2ff9bfb29a7e91635b 100644 GIT binary patch literal 346112 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 D8*yLX literal 279040 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 diff --git a/packages/core/native/prebuilt/windows/manifest.json b/packages/core/native/prebuilt/windows/manifest.json index eb16e5b..382e86d 100644 --- a/packages/core/native/prebuilt/windows/manifest.json +++ b/packages/core/native/prebuilt/windows/manifest.json @@ -10,9 +10,9 @@ }, "peerBroker": { "file": "x64/xc-peer-broker.exe", - "protocolVersion": 1, - "sha256": "770b043c09a5658dfb56d1d1c6584d47d51bf34f31036c66acc51c453992a707", - "sourceSha256": "1a184729bf008ff374e869e41f354f59f83433986f2296daf32479c0c5f4253d" + "protocolVersion": 2, + "sha256": "b125674ceb4d86f38706613cfcd8ebe2c269f63cac8d7bda3ecac3574c9c0bdf", + "sourceSha256": "7eab0e913510d668a77363bde81d483e3586bc05953a8eed93166626ab06c016" } }, "arm64": { @@ -24,9 +24,9 @@ }, "peerBroker": { "file": "arm64/xc-peer-broker.exe", - "protocolVersion": 1, - "sha256": "9031f7b8e130229a044d347a8cf74153be9a9f2e80c93c415d31f4f5366b7492", - "sourceSha256": "1a184729bf008ff374e869e41f354f59f83433986f2296daf32479c0c5f4253d" + "protocolVersion": 2, + "sha256": "60be817ed197d44d21cd54c7f8dff0e29c09ff1706cf376ab0dbb5a77f56ad69", + "sourceSha256": "7eab0e913510d668a77363bde81d483e3586bc05953a8eed93166626ab06c016" } } } diff --git a/packages/core/native/prebuilt/windows/x64/xc-peer-broker.exe b/packages/core/native/prebuilt/windows/x64/xc-peer-broker.exe index 0243780351d6de9b2b722e070996abe6d62a2bcd..34912fcf7cfba3aad46d94b0258d7967d507f4d3 100644 GIT binary patch literal 362496 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

65JE#Nxi12~?lE_=fnmqS+|=G>EqTmJ$$ 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

-ke=+K1+IQ72cV0lze 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%0D^0s`2CVG}9iJ+X^EA?TtG4tN zP&wdCsZM>h9Yg@*HQ$$*PS@I!Df~_TK&7EolZ(Y6(u53D_zb~VV$)S@U=|eRu%!SS+ zH!MT1v>#Pp1zLQ?u~`jQu4h5M!;wv(p*v( zT=5xP3U!N1t5Q=yOd`!^tk8krokp5lacTexf@Xqr=I?QuBZc=0M-cfUu3y>N^iz!E&5_-3rBcd23-;_9ekVczdi|#)uHU8*WOkK&Qe}pS9Pfw zJ6UnzoD8J{Hj470{&QGBlZL651Ib4}wkVEL{$#AZvNaFf%z(N4=>NWf{Q$f)4Ss>U zizc&hH~T-@-w>6UKR~Fu@i#&@4j@$h&30Wx&fmA@YEDUuaPLPP3ubHP^7gA10aJ6~ zp)7XwTCMu;m2>#5$0X}3e5rM0N3R7rP$!Gtb&jz5v$TtM!d;x}pllFxM6lon`7`JL zBkpbBqbjb(|J}Smf`l8CC?aUks7bAsC@N8uY}mzJ+#sSTSP`s>NPWR%7w`qyxVy^D za@G3M$EVd6tF_kJ7Of&u(cJ(^z-j|l1g#RW>Rs2DASwZr{eREgyDtIl)93g9|2}^{ zn!R`K%$YN1&di)SbLJfG>s5+&W@==oQPc=^|rJ z_Tkwx@j-Fz*S@;10<}1$9bF=vJ(4S%qrY}KgE)bT_XswK2fNK_c);UWYZJCEERvO} z4HDsso%eg}gv?nCcx7iKitEW7&z>h!7M0Xvq=%fm)%24f;`bPH%4ZTlSB0(gHpb4G zCZRfK$@;rmcr3=Pk&CgoM%0Zh9!fp}nGWQ1w+)qF!e7&2{vHjRwf{1I#UoJ@(Y9Ya zIirgz0f>2{%p6qu(WjDO@hD$x!I+%*xsg;${G@O-g-7)%JetD3a5^0rg45RXxYNFB z9x#Ojiz%p8+db8?RywfH0gs&6pCGX(h&MOB&Bx_e4)tr=@P#9>^=i82tIPM^@a5-6YoO8q^yRLNbdnKRRPRwOJU zZa-r8SAmP8Wq0Dv*qKd-v607NS%MU=7@-+0;}!DAnAL}Bb) zB{z?i%YAeLn`%FGt*j@X-dVfJwX26%9lr1;#|u&+`dV6+@a=l*@J~zEWt32;TN~Qh zMpi1`6H#TfU+y%$m9D72PzlHf!xf{wb(@=x^6LC|aY?GooVI%(eRK|uJ|2F>){t!y zm(2%GnB*vY(iDr(h98d1S{=Wq^#DWQ;ad*>9Uqki!sekD!!ZFc?NPewMw% zlGM9Co!Zh?Ai@+!@HbSZ?vs7V%oDi-HHlWrHe-xWALUvyja@Alo0xwNm!9OHyrz>8Bknz-34)tWk->&SVA8##U3X9p@|eMCD9oYVe1m6mee?NJaM}uej2r2jhQ9K z!AIj4fLwvITJ{{q6dE|y(#-@>c5F4jK8I3==0J%e&^$&3{C?L`OJ~kx$h=-M-+}g1 zbj_$7He>HG6wv17+eDh^C!t2@9IQ3i>lSaOBV`avh>GeTUzYq6wt-46=4=ajf8RsU zOYhXmi$|Si5OXpVua!qY~jq(?hcVa88@as#}E^)c@4%ajx*}(ovr)BwH z^cvGg30p1{rp0FA$9h}6&lLUQIU;}=M%ikvF|eZWu08;CHP|N`0^$0 zs+s=Sq)IESt?=4bbJiXZjulE21aIsDSWrAT2MA(LlN*gH9EARGqt6(NS^j9k5PcJ% zmA!ub^VGqO`X`NbU->0O#Xc?aAj>H0Ce}Q@*bpL2w?VJ1rb93#Y&Ivo>(~)_(WQsL z$=&**nyf>MW}(0HQ8auNssp331hdJ@MdXYKRhW6S$O(LvMSl)=cCo~ivl)k1$=Qs= z#hBj0yJ*yP&zSI4ZVqv$g*z*C4>6pFSD{)h)b6?pB4MRl?KjS4>1iUFe*=1^l%RVK0W&^DIPdo6d50olu=|z zxmm)bZAoELEi#x^+l+ad%prg! zz}@B+;S_Q76nrg(9&H;PqHY5a{o_hnjlZYxFQlXe#jl$_t)XK-821AM0Lr`YXJwy?m(5Y?+JGJ{SjS4T*)%a~h4&o!**P=n$X2pb}Sc^9S+D%==o3q0^os#Bfm@ zcl6A)J?0_IR!S;+%PirM6PyxrdM~Td*VxO8O^z%z_cO_2MXXQ7v|DvuJ(}1Is?xXf zSbk=jKOj{dJ>b}xfCQq)MGu@>1zFo>ht>D)E!9<_QEP z>0$F3^l3K)lETbiXC4mhx;5M z%h>%&ahc4#B;$$Mt6xBM%)oV>t3ZQmFylAE@04V`j)kcu0Q@mh$XKe#XTHTmg9KGc zoRjV(8em@5A$=vyFWCby1;aSA%pI~tImsJ)*6Le0?r1j3ggx6+0A9HFR9qF=$VQrP zFVqWrvYX;Gy=ART#QDM=LQkYBL}IHYaQlsjQc>p4?Jiu(glKVJ+48?B>1T(Lk$z@Y z^3f=(C&4^q1ke8yw9PTL<;y8@B4Am6XY;d)cvBAZ%i;e)@jp{MgUm4&GHa(v*#t@#Y3IJBkZ#5QOAfG;{{R%5Pv^U z_$2S_W33ocfY5gx$!@$SN6j}jsIEOt`a@aILCI&>!2L3YSD{kqBA)q?6C2#WlGhaEHo93RbK z7$NdS(vk~@$$-S%hRaSHwXitU_s3?Kcqi`ST3NT)E#r{aU&E>6qA_wcu*9c5`bzWJ zzB2w zrsAgGCJ&amLniR+Ci`$=5taxMa`IJ|(8A{fYmzaf)K|Aj3!lnMee2kR#-A~^Jn#>H zVdE&8IVSZCR9McH9ifCA!o4B&$M7DDpcP0lKL<-`?8>A>MiJU1AF-S7!`i}b{aq?) z5v^aOT2IqazT6oc016I!bdnQ%tc zU}^1cxhqL)PZrDl6X8B@IO%LUjfjL=crp32ExLl2`qt63XmoktEn4KImc!|fraOcj zNpZp}4~?Aqh2#CiQFc%B5FEl3J6>MQcrNzd$5>wtl;9Wmsy^2!I*AdgMee1Xr&XM< zy%Jf!u$b$jTsGpc|0q%xI>R503+>)E{|sCYO)f}$gv)T8h?nkhh4%I|olFjIVR(E0 z#P)-6qo46XyitNV5E^AHXcVP}@mG9}m+sLwrpkCJOl-$x_$If$(Kx?7yyt6TAA}Px zgm>?j0JnHsxtiH1^+V-Hxv_3X^Ke>F=6G4V>re19#xJSCt`}K$9my{cC%N=XD$#KZ zn@3y8Jmb7^Gv8*rS{6AjnWRNeVK3(E=n%dAU!|mV0+YN`9<}E^j#Fn|B2OzC3&J}l z%`Qy@PO^&z#{E^caROe8{5M4f;>?-Aj93O|JCk8jfz8P-ZZR{NgCkYBRJAL#r~u4Q z0!OP-8;#UKd@1BhHD3tQ<8yAKN6s?_j*(fjBT()Njg@gx@4TreIgBcl6v5=^aJ81m zO&AYOF-v`h*O|N@1l{@;E=kdX$(D=vz1!wrMt@DST)e+ef4wgL-G4%XBFSZ6k`kBF z^rpM?tx{qey`J)e9hM5Ve@|Ln+;l8>7QL+9J&j~I=nkg5J(o3~F$1`$i?XK-wXbg{T4xF7` z+U-B&*M-CG$cK^EhXOvxh%0*8Dn0ga?aq426NO56yj}5l z{|t{G#}~G|oqoN}&%uYtTds1npZpNgtQy_NKNu;Z3_t{7!fwRe5gz#*W?`4im7%F` zCbpO3InMKjtF#NHPNh56xUsPm(ZjRFN7NHvsocvD4cJjpj^RcP`Fn3Rk>F3Y!Q>bqftoB z7k8?-q2~alcqbx(lDR~ldH0Y4NAP1}e>K*yvc;L>w1`NZ7KuW2C(%A$F`+7T{pBQX z&|Bj?-NtBsJ9QJh8rpu8wqg&RI3+vO-T02;`&?_Z6Lq$fP{_>AGG$*<82+e#;v;6~ z516^%ALl7exk~rqSk$@@xq-HE3$7@21b=0AFMZRc?@g8SR+#vRS^8U#o?-!~;+E~( z@T44WdpW#k7&ErZXzs$*X}xxDyUVy`TR5%p$bsdq`jR(;hr5gmnAwk8Fv9!NVyd`J zNT@x!xw(wXbb-S>t;3SXz#7a2Eey49nodZ4#2F*Ya6Mf>H!NhoF>k0}pHu18ry<9A zN6|fF?6AlxS0%!@NIiWHu|PDn3X;#s6LTMHRf5?F#9V@uFJE;Qh0KqJa2d<_Dz~Gt z4gMH8`i`gh%s$~8kw1;%nd)_;`Kk3fhF95@y~``22|_EyHjwW;m2bVdjt|rur!Lji zmeLS2Afxz`3@(7@N(h~9Znbhhnad4JOZBL;#8&-))>lGe(B-Jnr?S|-hcCVTUk zmHUS|XpBEL34KJw@F#QRy5X$w8SFZ5Q5@UA=D1<9OAT@*22@cF8L!71Yx4SIm&{@{ z8p_2&pIk^pxU!gj;uzv&PQzaT`*?|?adV|VHkX5#DfHIc{+ic`dtx>^5%#BcBk++p zl_k5avF2lZCh)QaKWP2rQoR_&F6wP0)Izi#bnu2eaFAbn^zY46(5&N>1&I+;pxx<4 z&Hbu)y{g;Re4dXB5X7et|7naVmY|!R<6DOxI{u8|Ljv#m3#V@J>r<+wkS)>(M=k12 zT_=7IGM@soVKhldp%LFrBM8g^xzO;qF`LD0G$Q2(@}6E#AU-X8E)~%bCw!}gf5;0p z4r(}K_@RiD$h`uV!EXvIsVqQnz=>msry( zx!>@W_>Jl1;&k;$KlTZA9nA-Y#-9E1Z3iWv0gM*;Gk?(l1wX*++oSR<3KJbh0DDxK z9Svhhv|!=q+4|}#Pp%^|c!%6?J(y_gTJ(>+w>J!PssL;at;6Ns^(!8{`064Ud-PXi ziRKP+z~PkeG9o>mPX`lfKJg)w5N^dwcgXy7DS6zE!pst_F0ywcjdT*d0vF|}@hDfJ zJ7)UmxTaJ$>Q0|tX!+tu-K@f4l)2utPntMu-lZYIQBWorV7ar)} zPPr@qYLD+~*&PDoCJFJy9E{Y;W}vBD9?)%A7Bj?kQTDJ60s)bp@R~Z;FxJlLGxIbO zBDAiPS)r3zq3(||nXFF@;JHFQE32DjWom9oJ*B?-QC;6fO3oouU*`jIR)c|w@W59{ zSFuS$(+Pdj(3ag_!7@##Pf=X6e;mOE@t~;e91o`n=AV9@PS-#0lyx#iDQ^cW7M(Sr z#F^YG@1nUsb5e;Gt_2Fd`C5l_ix>;^N#)v#HQ`?WZMTMdFV^lZ=4-gO(F(B^?nQ)_ zz$>B-xsoFdjvl^VgE|-8zoX@S(E??#`4Q`O^ldy&a0C=bw_H3cA`@f9HS(jmyUam3 z{Lancx8$~xJZ|UCW!zMa9^djB^IhX`PX@;c1bx zsE-ct8%1&UM;xq_oep@At>h;X_u<4ZSxO$83K!6HDom=|8sL4TT*A!5?RbToYU0BW zXK{Or?vhrXOKuz84w6E98w00iN(+HLzFk^I6%KPIrG(U9XUG5eF{6%JCdr9xs4~TikeEJ`Gs`J$8?e_Bo{>Iz+P4^ z2`SYWB-)EuV@UBrkc6lobxB4yvJp#K?tuXQl+7o z!;D$g{5`yPd|*U)?*+ju^ZUs7!Qu?_WBp`TFHQj4RXVB@hdB`dsS4yAo5lpBFmP*g z3LGhvX=b%o3?QXpg5YIpr}7272%J_0M+j*aC`6#NDsWLH&aq6z0I~;HAbTFMK#CW? zEEoOW0@MJYWUD;O9^!s0@q`@o$Nt+YtD;XrtT>p%VmT?sNWwgn(;BVX z6W6L4F4l+CwHX3m4q;~AmfHn1c%lr&?)J-|Jt$Qe9ZUDP4fAOJcl z&geaPA87kx@n@3rIVAoce? z5hbvkLB2*{ZouFbuV<&!yTWwXxnv6;XJ7z22jWwXnw`J>%Vj{p1;&fO4^UyWHIB{sn_t4gSM zuuD8*jj)gggw zU#{YTUShB4tNFt9B5#gHZTxm$_#3A${0|oKZ-!xy{QlQ%&cNWty3Z_I4Oi=-KuH~h zp@7&aM1f{B{Ce!LrgEd9Yb?6TW>P|JAM0Jv4sIgo>3dq}G7^2xxOV$g9vbWZv7l;| z)b6j@E^+NduQ^t7$Yr*Us%J1cOU@SlbFw8oMoQrH591iTxa|7E>r^e$ZkM1#P(_;O zO_-ILm}x5ERB^|~D*kzz5Ko_DO8pMC5tezecIWFnVe{szdwu?phM4=|hZ=OZbj&Nh zx>pu_mMSBbM~Ez1_}(0R-EAy`0-S{`(;{b+j-#R4P2OG439&hlQ;5k}b|!o+yCt#d zhtg*+X&)~eB>$;ae#r3hCCp-it5=cj;=g{I4u`0WqaXiJ)0<5QR;UvRlCCR z<7zj}#%54^9<#xByrs^~sO~Wb-OtWcUk5sm za7JB3MEh@oZ>Jt$WqWZxCx;;#WiCuR<=#CezGu2hnnz%aCjPzDqT+%dMRz&ao7i57 zH>xTnk`X5Oh)`Qp+?0m)d?<0o)N#3J_`F)fMsI1?fs5WvmCUu3REI5(dD9Lhd2!x- zTV-}RGm3vtGc%{fGk9iOviT2wVm;F@@(uuSTftfil)|Ah=nRh!Xq~_vGY* z!^yZaC>hn3>~TIRVK-Qow;fYbVjmc5Fn>tLxs`j?m-N4omH}5c? zhuLl6d^$;?y)N-tZ{Z?)vbm}>bD_h0b9W~K#^=Y|VBtDF}3sY0pZ z?LdZp=G~M{`Xo6Iv;H~EZs5C(#wIWd?VYSeKam+Y1G3lx`Gx{1x`pKXxz7O+l>d^e zZDbBwL=EP%VF^oZV6nw~*kYd+Mt$KxC^+4(MQ`RY<0`@uzhtZPHMJsvX%W%=x6WX| zT9o0GCx6deNY!BQNpoh;Z2tPLYgS=g0-abU>P;zL`%@ul8a?w2}!>G_jjDuH6 zQh1LTnr4VnC?qf{)>E&=r{?j1P`jjDEtW+Q*&fYhbC4~$T4oFCcox~*ru{{^Vi*V* z6$@1nSr*M#4GZ!qHfBGsqz`VkK|D2rm$~*!?QmXZ$V*;dAD@F129jOhhq5gIg?Eos z%@oXEmn2qj*<9RC#q8~vkGSBzkVVZOY_eorWaJsh$QXcrVV(~a#Ht|rW7XG$zm`qq zN2+X&k)Om_nH@Hvz;4PMt9G&FJepZODVK`;`fTK(9n4MdU?*lNIx^%wLGl|F#R`%d z?JJj(r(9t?m1;KyPLtNi$-dpdV)ZSDg{I0v8;5x-Wu?K}ab_OcJ4J4#Tls`5%o_z; zMfeNJXG43QtWrS%zjo4NlBDzl5Ar0sj(hl3DtOC!WsEg3+8VvT303shFl{hq^m60y zR_ejfLF|^xd9KVz2I@)G)i~OW~}~tghHW3y^i1n%smtbKF0Pog%)1aa^B3o zsd;6)%ZW&tLNc`Kk-c5YT825FT;k*+Le`mM-nv(+#*AF$vbtgd-AORZs~8^o>+aUk z+|3o!wu{Q$=yY9aFvT!qeEi{UmrY)yE+9pp}^87$K-xhj~Wa&$xhFrhPNu z?J3@!%k@WTcxc~#bH`IEFAZ^+Lvwjs$O|o@4y*QRCh_DeYW2tx=xivKA<$q|Jp@`O ziQL`A+XhZqDidrIT>&yQ@rm_4{xre zm*h&Wk&<~-dqcrjR2!Yk^|0iE*#AUvLR)3k9cCSEj?>g+?NBf;|^;&n~|$U zi#%&(yN+zh2YB8e(O>7vKTUa?PsL;=OXgpEXu&O3aMd(qUs~gdEewwB18C08mOf7n9P-&50SU4|Ld3dJjmf(8X zjO0LRr&YqjgWo;{Wm{Ep}kQ04z^yR#gBAncsD>;givX;tON#t!Ux=B{W%m`g4FDO8B z*_~uhK1y;c!h($pw~mU>BnvsK_&H$dNS%H{9S<3 z+u<_eC1%m&(0p_cwa`6Xq03iC(w~#91EN#jLOnLgPNyE$%il>yOdkMcMX_GT=uX|A zX_%1eOI3m~>M)B{2`ze~0Hu@%3M=x?%GIJpWLrSFmsL5~(UE+Rlvccys-pLaIfZ6D<<_cH11HEn|E~e{b;vYh1r?4)qc=hTG*`&g6Z&wvQ zM9yApec{f$T*UH8-%cv_=hKkp6c;-nbNk0g;&d83P6X4evIcZpcp9A>S z98P{UDFv^}u^_UPg-&1+1wT?XN%smxQZ1PRqj^QlOmv?Zs)Ip5J)WvzfWpZg4@!hfLPpP>PlQ>Fj4f?ura|E+@mw%OT!w^i{; z2d&DC4_m=69?2j{H9rR`_`5>?p@QGKyM~6pQuOUytVP|f95qbgK(8H3+-9yd?{K#c zujOunPv^+rxJ8MH+P!Od6hX0{WzMuM$hE?~GlP|l`i91uwkFI{2B?J>OO%zlR$6J#5Unm36SEw9Qkx!9y?#TaWx6dgQHy zq0ZP@zK3N-r^lH5GHU8=u5jA`kKsjk-HXB6_zj4V<;_(}tJuxtvB6*3CedA@lVxIT zSu2DS9gxi2M%nd0fw#A&6lJp>v84CCvfrv#V&;tyRfQq^yLbs9Ce*6qfx%UldMi5J z1$>9tCQ;vy4xHj@*=L!?ohQY@`vxvP+r!jy0gt7YB`8k=f*0V2zxUGXleYs(#5DnX zv;`JV9BAG+r}1%~tY_`nqYUK$*#ie8$UsD4MK8q{x7>I|w*GYd$3fE{KL z=ZK8>+vK@=o;(Md+-1HN)L+rRDSXZOz zjx93jt8RMwGZfrNs-Xq_Ful3(SWYk%=FozwCJ~>qvF?+mx2*;wxuL+)v{iNhbJ>?; zTG>M^5L)XoxnS7a>iNRm8r*q6ZDV?xjMR&@U&DsswcdQ4KSyM$I`p`est@+hz@fl? zR%;8T8|TUB5KoX1nd`kqFs|5qk9n}#)*oq|Uh|0nW}Q|H(?cZVN*W;l7W+oFV|RuV zGt8pqGXtPo=$J562*z(ES=Ge*5Uc!I(sfNcu*V==M)Xx!z`h8sMMja&7tQ`C?enr=9UtT-mIdEtQ2M+* zDQ>&qn}LfD7d||R$I`%+{2dTHS#|#PDS5M4?CAd$i#?*)D!52kY~6K=#cupQ7CZWX zV6m%&#Z1nl-X)|&j>S$i?ItM})1se3Yq{lK_l_2ps2Qn^EXAg^Cj=QS*A>t9Y4B8#X8Qf?7h)KKB>M8PA2pbkR0vj zlsHnZR_@E#C1jm{loAwN%Flu8{OBwUL`?-_$;=Xa6!bx4O{SBNrXI+`9m%%< zqikP-WfiNy?@2=0Zdwue#l*ZS=}rPvA}Ewh;m>x8q~16S9dheJg=m=UubNJ zCs6MbpK4giS&cu~QXt7PviK%7$#5*Wo9*aHpQ|@KLiJ}|3BHgje+k}mq&U!Kojb2w zJP*mBuC(XhtoEZ1GSiVjQDqsY{tmMr!G+s;XP%qEWrE15pmMHsTfjy|bXi|6RFxma zi~}l4f}#eF_=obq#h^odbi)u9y#+j zu(U8ne8NVPH8t)xj@`?nx@lzZ3emompndx(`IYvqCL^X)X0&hH%?5?B7Cl*jDxHX2 z#jvDOF)O-n8ydw$CNik9yCg?ozAdvR`Gm6`lPN7unXIvbZ9$PSEIEbM-n{ocA%zxw zMS$D8q+xa!8WoR&xVdtHmE{Rlzi1Y&_|!@f3$fI(nPS6TqHMM|EvoS+j5gmk7RbFJVcqC$YUAPi7MSs>9QhM`(kfyT;USM7Vz! zo(YLb+~>3bNo=qq86u~8LeAtYSxGCFJ!)ugchhi7S+4B)xt%ZSB%XVFB!w#fqke+rBc8CuHU&ict=v03VGxSga?G$#w}2(+lyJXa9reBisKayA+#Sh z%+AzRF5DkmmJF5@I+ja5B5m3-=yqh#x5jeGhulSordSYLb`0tYnphBbxl7}zBl%1T zF=E)_*5j!`yelIHI!VT(^8 z$@1;4lkURnovFMr7>!-RXUx-d@-oX|<2lkfdP51RG*wKAiZKO}B&OPlmAoE{t%NeY zHp;%ZSi!$Ss+BcmmG2UwKe?;W#=7)PE*1Z&tb&ns z4!Umlk_)R!t>ki~YAusSATG%|FhA`eE3G6yZJ?FLeW_g8GKmWXY(Nj9c1?mo6%|P^ zsG@!ZgK}35nk}|F7<=FV!RcP&8qn@KXaM839M>c)>=jQgmL--U=+C8%&CW5ZT`{dyBJt9EylGoL9dZ^#z;= zNGjGnNe}cqKw*GSB#d!b9DOl7WGh#TuR?4~X(K+k^cmU6uq;b8tO<2gz?#6JjA&%} zKh4EfQ7A~9gnD#$-t=q14@G}qPC?^&53S8RxyZUpY_c5|zQ%ZOEluvaMg7d;C%b57 zjts<4FLx?3M`>p1M@$iCI)f$3+^i&Zj4zEPxQBQ^m~h3;!wlR$EEq0k-Kio`;o6fZ z$f)yi_C_jbIo&d$oa2SmhoQu;L%R=OFhX0A5H}V^S=nkP^cXRujIvGYv8Y6-eE;B3JJ^5XaXhS-xOoahH_s_hd{RYFG=P==luQ z3gLTmgaXGU7ps^#i>&UN`PE4|zPC&fXNf2`D?{juA#}GbCUnUmuP9@#w5=_d0rEg= z%WmwDdu*dhL3i%E2dZLznrSMvRqVVlkIJ(!UQEuvftqZ3qKPq?@17$Qd4I*vftr{J zFDD_&b=#-(r)#>;gp;ou32wyA~7`vuV*D;l!L|(}%}{6#fn#-^mWF zHf=lJuz0B{%h}??lg=2WI!*1cTe~}?!HTH^MV)VbN3&`X@~v(1$~WCk-CZ6g(CN~`|oYb~)?t~FZaE}>k~ zIv=;%BFFk0uvM_Pev2q!lkov5Wc8Uk789~&>baRxt5qr5n^o{7$5Fbk1<_@h60*f? zQYB=~GAlCm1Z#73I8#UGXTNNUpe1Jw=7&GE(F$Sby*_~_I*xIpfLlS=}pKZ62AdpbUjZApi2P6oR&!a%FbxtSHL6f z5#Ln!f^xBKxJKr#oNGPNx6QF8F}sh4C=Ozub=Gfy#9GRPa#h@KoVZ)Po_YsAV*S~7 zw zJp0tjy6J?wv>_SF{2;Rz-jl)!jm_=W;FL}2OuNQYqz1Lcdkly;d6aXCD%?cdo49SH ze%~hUM-s2%)z>Z5Keo_Qo8LpN)=2=UT~IW;$D?PSV0q1iiWNr`$q`T-@4Vt=O#ccO zW3(aLyKc27wr3Qh;z#G8b4Da@7kq|_|)FAkitQ}Hz(flO`5wd7%k>8NXUO2b&_&+b4w?gIp&oBmC z^TS-Lok{!Q=TkaM}I))dC|>LQP4zX9CalS$fmTvsa&?+42dSOCUZ~6_Q_0 z2NhMd2ugEC$_2>pJF-R)!CM`2ta%M8#Vn)2y#SMt;>r)ksZt`ms00=54|t@u;Di2HGY&hy4pdUl zg{mGTEwK#O~oH?sMM6PQX>kZ?$*jOiIcBq>O5Jjd9NI zaIv*F)r=;aRZ-STJ%@^6lHl29)=`0sURk8ozQG7S@d6riYESR<{+1D?v{VGZ+HL+# zsLr9yM4!G^I)<081MlOo#~!~xG%8k|%gB8HD#b73-To)kekbl*&wJyUoW`aad)AGdWr+&FhCBtDI`ZTtqgz9|lP-q$>{th$J!Fz)L{3 zpe(f?P0X^hTfx_&TU3^VWS|aLtaRr162(hgX|Z`p-9FCLFJRtPV3Zj1?Ugy&Q8^oN zp^9w8GhU*Tzhv&LZ)Nvkw*Y5J#Y2GrASXZEJn?cl5VNh0>`kEG0adjsIMzPNu3vIX z3C?wF5K8~+leTb-ip6y{d!K`EIl?#)A31hPQ`Y>+#siO?EHl5*O)f`34&UAq;>h;y za*iKyW)YiSEk`Hbx;5H=#R*AR>90%S^rj@CMemWU#)MIPM;UV47{b_{{UbJ=jWyz^ z=ZD0Y)fNn|-6Y44gWY3r05lxiJBDKL3*2X63VtwJd|}2H*`ub4)rlXAM4iw12Ksit zemw`6pZjXkO_lyLuj^efj1$h{<}2_YG*+ztBsBU>?M~&)5tN$mOcA*4vdZ=eE_U97 z#8}to{2P}lh{UdW)`o7Y=f1pWExY2(HYn3s9P#w?)pYord_2joccgQdEX zaI$;MYyK`uj+j$hL5s_dS&oDdD@yQK&*S$+0@!a-dr*gf_O(Rs6!tjUv6CWOoCk^tJ z?oAbP<-PRXRB__NfrOqm#`X`li`$ImW5hE+L<0*?tGmAw2;x$OSME+%~(rD5#deq1=NV4EGICvQRjXLrKE%Iw7I-X9XQ9NPK#ayok-;%j%wp^d8 z!O(MR`TT1_WBY@~epUX{DH2b|ts)mDL6h5#>HTo%|LwwW#FrI*CQyfkIUVDqa)aRR@Q( zh>R=Tt!h#6!UXN+XweRyd{~$T280%KCueDk6gJLr5^eb~7BPrO6|F<*>^0KA9Cyc4 z0sFXHTQSe_RKQ_(13B=UB#sKiZ_-Y2RB$$F^=KJ0$K3DpQ5}SHjP1fnwj35l#6Jzo zVG$ED28ZIz05=D6=sk#c^p0}q{fbB5!dW+Z)c4ROC$hR_&b_zNg_?H9`AX2+EYs=8 z>@~2gw*O2|LFNK(9o6BXiB;^n?)it!ZW%YTDp+nceKsvcZ-w3nVbQDamE{WNBzi%W zb+tX*ds1+eFZ?Yt{JTv0dG+uH)hf1Oe_&tq-N=3<*~?r#(I`5B&Xq}8Sogn3$L+Yg z)d}b>E}@~jbvaYqLX)87VnOh4ZlN(;P9b}d`IB?P}P8o7SX=4%Eqh=>O%3Rr4L)^%s)B4QGm}^%_ z45s`!dGON&)oC+pFmuUH$y#Iv)lD)6p6sjJ-Fy&o)F680FI4PvZkDSLb-S7$O4gAl zA6c}dAd6uE$2mu6(cAX>j7-31+yIFfa+G|m`O53unVi5H-+Hbyw3}v}O|ww{iJJ~F z^N24Bs-`JA1dN$M<8z05xnc2lYN_;*;ZAtvxC4o(FNwE_w!@VFb zzToib=QCW$@p3bHJZBx~X!WZc&)_SjM~lcU2Fq95MtqQ1UiEJBSnkW1dS@|t{|oaP z{Fk{HK=trB4$S22qFe50o<)|)S+yZEFst>_o-Jwb|SkqBwwUe+OTFjTvK>Imdkd$4ZKh3yYjJEo78E!o@Sh!{0EvEE9*x>(zlV80;L`!Q#_MNG&4wYpkfC2j=?|_v2vsO>=%bgQktu+snsNJ z>YJ?aPnct^dcVzpWWA$tEEYJ7!rw0Fr^fQ|72i{*@bFkBV;+K-Z0<03u2T&dI}XG3 zGo;^);%S-2XYvYYyiS=N#Q}UZTK5nF1L^dsBZTS;eK6 z&dF588P*1KCUE{X6?I*`sO#$GK+eE4R+oTTKNU~6T%%_PBC$FpU=|CBNCRbb5dE}; z(O}0NF2MPI7K^C6WVMU~z|I z!C|h@`fm4 zD8r*>tnt^lN|+Z1IK``iGJiy-DrN6fxSVhWD#S2468rXXx?4OZ2-zx5kdD1;97O9A zL+w+NT`La;KGtkG9Vu~I@DjjOq~f%2Cb?9Fuxl-@I-<}qmKAc?K(*SOMdMi7)*Zy( zi{n~Nq)H46+JtBx%!ip?u=$EFR$pCMO^yhGgFmKN8BtP6f8 z4)Y&Uj?n#QKC6BSB|sJ87NfTuGo0AKJGAxs(ue|zWNhL^yIz7Q%%T>8w$$slR=M3U zhSv>?NVJN{Zd~zS=!V6nk$kECl!_x5d#Y+UC1MX%4V9lrl>l_p*dqCjEv*{DFYxA2 z_*wxq4*&r-j>g69CtlFMl-9ghRm~f@rL97$Y5cnJfnFuQKXadcWATGOYUS!aQx(^w8Hqaxm^hG}y{o0;jmw7rp{3)o+sEDO zYFWEu@D8FrJ*5b4M1S0NQJq3YPQaN1w|G!xzs(Lbuaa9;B|iO2s|pV~F428ubJRmA z>4=v0HH!vLrE8@FS~^~e)>gS%+MPcRqj!&}ZYX~6$^KiUIu#z(st!NT77vW}2;D9-0gwix+J)yYoMTrs91Fr=n%-5!~WbAcUJ^ zK1GwLQD%<3?v`e(yt<}lh{8^0nU&{Xv7w)Z-AZ{q=V!lrLt(e`pzij**j=7qy&B$q zuxrTwY!gvVs=gIcE(12Yw_N8gRg^M|Ei`31%Io5VD-S6fa{)MBT6OEnZ?5}cqlI9I zTr0JEyV)^wHBEwunK2{7I5TFV zKWw^J5mAkqlh(JjSU5f*IR16O-1!Q}3!4XA)fdO%`A8f{#BYo8n$Q==3_tei=!NDQ z0A@yrAg@Nqqvv1Sp~!db%6YMK+XOWkA?MB>X0hHQ=F7k7i&rGS;sf!zD*yBTcv*v^ zPv$alDT@5a7pzQd0F z-*mA=y~=*hp~)1p&>p?ght>#brAgm2LY{kZ`Dlfm8X^7#-s3Io)CeiL_Vgnac84Y& zJG?J;nRZ z;K_`Ll7fz zr&=~xB)=5!5<%TwJ!pR~NoE6?-OTwS3b~2YqeLSZ%o05^mw-vNdE?>{RLu35>W^`;Gt3S6n*&c=7p)f>;xSij+oo`UENN@A#o5?q9vaG*Mw+!lZ%?!z?v7nT0UCaI>}F`V52Oy~R4B1#kh}JEm)-$xgIu+{Jo-OfiM2d^ zqJNuM$B`M4hTOGZv9~P*%x8t}+I?;(RFgyX_g&7tiO&mbKQFv_psTRfQ#ifIRd^F5 zrrmEO)@iQVE&A(;HD#XIfZ9~z;{mmAIrq5rzb860xBd$0wR_nJ4-jgQb*q)txs_D3 zi-{C%e%s3Ja_)5NuO-^csGH)S52)ScDr^|&cE+8(*z4-k6(w?nz^T&y;rN!o&$Hdy z;uovt*-w@@E@@Axjig(vc}#6?cz8%{t9ZCy?c5~OQfmjOv2m60I9ovV!1_E`@t1aL zH(;c1iDo?e%4ciy;!jg_-qs`ddqekZk9LOkehJTK4BFCzXa9bZTzsK2&JIYxTSl13 z-}Qb3viG&#=aLjRxj=Yr3L_f}P~Jxm^A>Rm$JFqh`CbF^)JDjdAp< zzdh=&36gB4W^4P3zwUMtPDHzbbHFjLd?_dnlGkr|+b0hllIcA%k+4gB&U|T?FK>R= zmv!>x)dRjjG}=Nl7BeNuk1`Goh(wGC!35x^Ei$Jgls2*-dzdClqxmS9Bn0Z6-wkz? z1yuoOKPhj1u{;I1-!>4*_?1_n8*I=oR)wU?GVQGUF6eZEg{*?^x1g(#y$bb*YzZE9 zmRx8S#Q(+GC5S((J_&S1tJJprsib(r~J8bArsZRo3 z(fi@=f{xNl;C&z2pHey&wn#bLt8M7ktemC$dEW({_-hun-$nOKr`j~>Vip&g5Qr~J z?g8Hg^xu-ZPbV(2K|Wg*f<{>~ujS;gFSGuSWEM?mhP=nyP_3O=mb|xp7u0`GUeU>B zpkh&>ns057vt%9fT~Pl$S@Szfjw6JqFRFgb()EjXzJmh)mahACmN;>ot=&LuMm15) zl9Bhv?*fV*R5&2Vz1EP+$5HGSWpgG28<>%*kUY4weQo=9(!P&?weMZdc;XV#c^UbV z<$Kd*Q+x#eRXE;2h1#}Kpty_Kr)df<2zSYF%w;=)i5V$HB4RjJh!y0mJ@i#)o`dR6T5614N^eccRD?E3K`E9wG4Tf*2NBQG+(u9kkP7TstT{QZ)(a)2u4iye?#Z$TmwA| zpzIl%qX@;xk#fsvgl_8!ugq+KF7JR?4Y@vKg7gb5v#}a3(crsk=?au2NheUzu(Vi|l zL!hcanDwpC2@G%etP@Fd1drn62WIhfrYBcpc8He{OzF1N<2?W3`W1z#EAl>bQqxWF zLZ3bvrXg|;5pjqyJ=C>i-r?R@*|vUMaEldp^Mln9&`g6JxND{@g$<;bsoEmX4#w2}KU`J#-gU&Ltjlcvf-@3t$Y5b?gU?;;C3l zkklJ1J{M%K0*)fER}76}p;^>XudVnR?RUX^F=C_$(M)uBu(8|R3S2-u&LOY&ih;|$ z&P4jX@4)+ut$BFk<=Z%?WN!KNwZB$(Awo1EJJ`9n}>+)dyOki}z$~IE0 z1%KY@alv78AD*`Jo>$16N7x9))Jmnuw9J2&& z);o_C5ZbEuj@0gJa~mNzInJpn6~zPPKTE0}}* zF@(}0%keRg8maOI7Av?z`@&sAwm=bZpJ-XHY7+*>6c4>;587~7`i(G=1^cBde)ERY z5i7f&?8}`N`LyUx+Bf&%>G}pC;!S*V8x7fyoB0?eOkSH7d4)&3?GZWsbUBMFo;?O$ z@Lgga`FlBJZ0rh;bhNvQc=T+^@r2kuSe)gF%Rq*Q@bQr5kzrV|0ILd99phsTo4PbT zWfZnvbDh&MrtI`;ZjQJ-47(Dq%mhZ`%4`jU*-^X;xQcBwSf&aade@jN^fLweC=d|r zFt#yLOH^)omeI{9nOKv30=u!3|M)AHz>A=P=^MYfn1JqeF*5ubH z^-Y%ga7EyeYqQw>s}n~mAY}`!hNcy#{y+`WE^{DYFcM&{j;s$HMHk}N&M14lMzP5* zepdZa2=&$D2s;O1CiPw+CLRF^uohlBS$wE?WqInxVp4uhPCA)sJs5x}Gi7lrW2QOY zl`o`*7nV41aL*B=x&E?rdR2*FgIR(3SKd-jYDY2Y3hik`rPr7{8EeZeQov~3Vm8sg zLhi~LYi7?rNjoYcP1!$xpNh&oPuZmy}%sp5U#WnrmDdA_0j{Z5EWhN0>{1$p*@A# z?RN{dM#XLpcxg|!Yb6u6!(4iyP{0G%CcL}0-q`Oih0heEd=|l`La;qWc$*NI z@H2&Di<$?I1uVJG$bITyJhdUyIDVxotkz`s30v7L zA4v29Il=!w=7Kes=5c`nmRwHK_w;XlUq;IH@2&Y@%jtV6XxoPx-%W;!oo7pHm9KoX-|4Q*7}la)(gjRE z>CRjeq%~F(T+$k=jjA>CX@q=9ccp%sp@kNC1Q`C9>QP@yuaoauxL4pBQ=gzZS99}-d%jUu@>~icN9_!6#ekHP2*||q6u6u|dYia$(uVrcNyPoAwGC6U@8(uw> zHaUnaZz$$8FN5!8rt2%e%sya!{2qAU!H(q_=9FdgSlZO5kwZxMzgXXM7wuQyVzfJbCpA|Cpoy@7DJQJ{B|dRQ0VT;lTFgEx-6&WC2EAWdS4RNDv2T z#lPRh>~5`F!`YEJ#})+o3lGTsUiITmAN#GCA?mN0-##M0JJ_(jfj?>|(S-6?VdWEt z(dJ8*kfmmAW);(Fo+~Gr>A8d-wV3G-JaH%kdWCaIw3xId(IP8D&k&fAf8_1uQCO2l zM}X${(UtxOGQqKaor`tf=pE^b<3UwV=-6j}j=|9q`4)>lp?*+JDSb)LNn&d` zm{!?0Irgxl%j7~-5{h?3yZMoS+6qH)zhO$c5w+@xcB!}G7lB0sxA4{;?Z^0#qCNId zXpcHcaV{|mW#AakNzb@eb|J$tHj$9dyIYOYbj8mTGA35bwL-X?F}Yfh&@TSkQ~R&f z0PU!H^muF4g{J5-nj-&1xoJEgZ&)CwEBrt}=+GiZ(iWe-j^@ZWx^NmmJE9BiV&EF$ z5fN&MeAbP7_zA6+kuAr^#5uZ3yDt&x)S_=-c-9^*P)#z_FJ(tbA;X#okQA&p)jB;| zZ@o$5$?3J;gaEuvmN$L%G%Hc)MB*&#O;F=)j{L;R4*CLuiqN%3i8w|t$!c?^nrW<& zAyWL=4#|Z4&ca%7IG2tp+(?pMz4#65gBJM-OdC4uIbPZ3Z56RKRu)$u*9VUgLByzd zgGDu6Q78q4aN>?#KIp{{k}tiH$5`Y!?iug2i+BsP71` zFA~l^^-5LnYYF#JR&Nz+QN`}d6q8tbgdw87F?>hQBTbWd;VyL;pWX~3EvNDFkH?if zs`;WL8n;v1qy1Iyh|RTpV&;XlveSwbhRF_o2)ME5q`aSiS^P{i2F`b_+{X@<&#x>+ z9of(knJ@3KPD{H0@#`ul)Agf0Lh7_?$O3sbDmo4md^fygxBnJVS8~}-FP87=imh#` zAJ>66gg4dC+C%kYJP_?5%{AF(2U8&vqA*kqWq3s&_uu*Pf;_2Kbkb7oa zi%Gb(hBo&ScUfF-OMG19O|Qpn?47R$c-oq zC2CYfljPEOBxgwiGb98}SG)rkB~_2+x`!bsT>x`Q8-pV=-DMb(Y__U?v9eg*GrObT zNz&EQN05RxvE3N9U$F~v-8s8sLcy8Yl~zhorTWp;YRv2}H8Eexv=38$^qKUf#gu=L zXQRRgWm&&owEMCht+BA=La9dw3x)?${r1YR9Zjf){n#bQ3G}`=c9RjTM4bIWv+Qa?oO+Da7enMn*|8g(9V)C+MPSt z4Crf8#ebDodf*A0dsv?ACm^omQ5!s}Bf5--YUzdC;$^5r#Y^OrDM_ATDK2g+meNfw z$E6?W;fqUMSQBcU7Bd9Cx1)_N;8MG)0_GB~mNV|~t&@f6r#OQpzwn081No;*-t>pJsGn%J^=*{;c|d@eMNloDvg7U`qR+3B$)(0LV%>kyCo;tySC%5D7Mq}b7?25QsAO>sP3>&Ck zFUT%>W%mtIdXuO4Sv3quW&?*$sgpS+*&#_I1$ak7Sj3z!UpS*GJ8z6CQvzJe_2wYH zXb0u*7r*PQXPSLHBz6Y%AloBczz$4))b2!-2>4t8^~U8qo^}L8*Be)6rZYUpcUF*%o%Cd^DvBqOH8t03oQv3|3PcaF z3uLo+$-=?qa`PAcESEjvfmo^xj#t%*PbF1!u3F~%)^%`RT>~zCfEMQ&!GL2Df)j1@eY~*@H~j)z#ejym_IF6ew;Y4%4^%6 z5@{QSthNOXX4cN#vR2{iUE#9}VxD>01BuGcv6#s2)}rsQaK$_ebx(<+dxL6K+3mox zNq^qq2X=El>8~cM>ch=N3Msu0Qs*nASf(;eg^w;4oO59kT!h6AfmxR$gsp^3M0WRJ z&oilHCi>+-R`}ow_rd1KJ zXhJjrRE*dvYSntzu!Oa`+50j=3MsK*R|JP_r(uQ=hweEFzG&7w*t3NWDwvGy^V8yTOOSY~oc z8cpApbxT}c3tfPzoX9IxOfQ0i^x3B$nNG)6^s=Q+qZCmT`UqFD0$aDWH@cm`gyLOU zR>4Z!XN}jJ;&6)k_IBaWJCduA`-5Q3d&bIgslfeCuD2M_Iunl*tj2J50df|9=U?* zaKWyWfN3g?3^2t93Q^3>FeBL?8=v`Rj}Hz#~TxU@RiR zC8a{5`cl>>^r40ivI*w3mAI%nm^g2WYBM!n()tAxej40uj|V8JsFPmgjt0(VniF#VkIL~zK#*#3EF{9hMU@1Np(f^k7yULgG&y09*G`{IMs!bb^^HlbgdK>J;>Ic!Hbp`g zQ~;!RpCp|L_4(F8lJm6Pe*a{xqrul7+@T|rdljK8^holyu{q?ydj(JWyxt)dWX|g@ z|6Hw0k$Bx86Rhu08ka<;08m|0kOaBvh7b$fTuHDu$y*U#1oTw+i1{D+8j&8^o+F8& z1Y5-3O(RD{hR_Cz$2dq1r*%Xm7uX*%LhW-lojmpfeV(v7kjeO@O_2D!ozDY!bPr1( zO#3(qm5Qu}|BwjzZRiSdj+fZ3>dP_{aN`I?S$!T86sXmf&BPlnsfe8gO#{E;U z`>e&t)Ko*+JH#C>h6bqmYN z%s4n~5ixEYDm$38Uz(oYc3ZJ5A&r|3moI>lV6A4)N!`3WV8oLO$BUCD>JF5ow^VXKwtTeg>Zfyf2E z3-Dp%2U7$Z9T*lH^hX|`S-E&{wR3TQ)VXL_B+o+&1B5ZG z*}CKwP%47h!68hj(*caBKbvEnaw3|xEInQG`jSPI2p&bm;O7XQGo?M8l7a?l*Nj*z z{prW=AUVMPzsK&2C?wsqzL+kjy9l%&sQLJox09vZ8_h%btIlTZDtqkbRav6kbtZ2| z(y1g{oL}r8j*wniiD%gLu@&n$z1?a)@7`815{1KYm%)j zD%UvDLKv~1st5CTaOk%Y8n8Pc2FwkWp{iE^vxESbNIZv!k+`0=}w7R9uHN@bmsWgkLrw@i)VZ^)42ItGraP1@r(-jsh?4ev3Tc4=i%veuIr;& z#?9Y8*DF8s&aIH2;JNbt#f8Qjn*rcg+x>`kZ)6s^3BN0U{*6!98z1oJ)n^yV%Nyk3 zEAr=UdGorw=}>QEAA~#Q&x`VAv%G0nZz7!hHGx=Htr|$2jiVynnh>$6I|TkXg^_^S z?={Kk7OEu2SMoMq2CPfL;h}YY0P{KLU42QfyuL-h=IGL|e_!}o@`Lg7_2L#U+^F&EEkGvkzBbVS7zFbp-uODu&D5p4%!$YzbfHcH=Jg1a`>> z(M&C=3gI^E2AzO_kX*A}7OVZoE;(gn_)W8Ff6)Ds?7!AP{D1<-+_>%S-m62+raz!n!K>oS> z2`%7H!y^8u1BPF9;_$1EAP!eKnhMBD<}fu8!e$GK;2;TP2%Y$CAw@0Ei|WZ1d%h6L z?)_%XR@0cZl^5H1Vb9`emMauKPutc=^rk?`23m0?Ct#4Mi)j1axk5o^EvywKiT{Vy zumj#!Y`b@a61DKQe#vU*t1uIj+0_AnXy5B#tlpsE+ai>u%&Pg)yCRzz%XaV0wioZP ze@B83Jhd^h7W3R3JZX8BGBRe%Tt8R7vu6Q0Vn$RUWwS$37sQ2AeV_xuX+w3(GBrsM zvy8gmc@IsPJ?{}?uV(Z@wo0TqrRZd zb<{8aqE3^NH+q%Sny_@6Yosyzc+pLh<7G{IQ@hc$kOI)v4B-y1)4ZsWD2RGNmG=YU z%-j8HFo>&l_r3f;o4gFhp&ESV5T)!2F7A^o1nh@fem<-8JL87mVu2Eg3G;|L5UIcsJszjcT%!hn0#?k zjhKO&6|LkKe-p|3s!TaJ?lf5=`8$mLqy# zaCmaYJ|Lmyh^aDUaw^rV7?sW(=~mE_Q&WiKV{wIiLh%=ZajS)A{+3tkTh^?WiA<;p z%=pZsMG4LmDiJU-MyfP6@t0fHh`_Nv-c{eyEKuredA`M3FQ4MgU|MUUT-qzd;>Zd; z0PgVGi{vKZFQIc4Qj^!e19rxSo#`{G*2suiOx1?&A!R{2RwXaYxUZV>4^Y09@@>Y* z3z?~a*BI%JuGldQLhS(*sI)kJnEuUxy|qR@x7T2=Ci+hyu9!CI81Ve$)E6t4mH0* zNhVZ)7hde<{;LvNfDCqSLVX=?zLh#?OX_TCzMa3(Pf6nOLsf0M zW{gy1d_sL3Z$4R9As@FiPvS3%LRmsg2n1i%w``PIu5H;Ub5q~)V3icS|0Mo8(`KK= ze6ay^{%no^Jy96Q zbYrbgppBQv+=Ub+4|g%|DW1!&ZjB*zJIr5%AP3=uDsanyWdtTMTP<@2R4Ek~`0`RNjvuMMB4 z1vy@dxECYvSjQlf6HdtDhfTcvyPwOWA)q{!5~ zuKkG8hv-`KmD06hy0+Pu?opkZKD`KIueQ`zg7`}QpLUK^;!8`X4`ycwX(lO^82>tv zerr&D;if!VQV6iDJTPO$4Zj>dm5Cb#9-Q>lJi1+P)V~rCONU8pugPx^fnPEj?wy>5 zPf7BAz*BN@CcD*m>)a3n{$9Q=ij3)3E-8+C#@gjY}6s zS~_U@qcv3&PBMS?mH3{9@^XcYx<2lT z7T;crn|1rUB-35HJpe1ycwiniMXvVa10LIT7?G&K{c^5RfPg={N+`dte&{Rp#uKkl z_%sR|O%nlIZf3}r*HY~uGrf-=uZBYhat=u z$Yg3X{g@lms>8B+)1W}C?K8%nC$C@vDIf>h$jgki(@&43Cxyqv((}T2vftqjx)GopjJz9+zaraa zys#H#oo+I6_)3ED0A$tWG!rieaF z_sZlu!TVDsbSvfK2=5fEt!F*?14@UiE8K`2F#Ku{R=pKIilt-_u*>7;g~tS}+uQ_7 z48%W;d>Dv-B$1xp=ybbv1sAexfpV6vA{o#}{d7?HBxY-Q4S!}66MH-BO>m7L!WP$6 z=dmyB;6afwoo>n8I;G$wH4}>~$VpS|Z+U%|HRh|tXCG1@Z}^z{uAe%`x_B@#?;HB& zSoMQhWn}q@(}Rh+65fvVqav}+{pV${SaF||zM?X5v7ybA&U&-GQY(oHkJTxSm_FRSGts7~0 zXCDI>HPRUABR}y_=CU#vzpy$vN(ST}oE)Y*#nwC0P%@{Wgqhi4cOl*5;S?T$@&dMN%4l)&b^y-)zJB^ko~CTINi{vjHv0C&3TEET$@HmU=Dxu} zqpq7L!#E#41-Hrlj!@0(Mst+$x4K1KFp-Ql#gN`aAs7GQ$TcFj5h;`X+&rZ$`B7V{ z0Vww@y}&knDjKej3&=LsA5$A9&!(Xw#jd|fx!O%6^BD<5TC@MKe znng9I)k=}SF$bxeHNH@%c^-a}R1St5k0;3Kc#Km|5~3E?34iKwsbdT9nOb}~r-w`K z47~hjoE8}ybZ;?hwizowXE&Md7tN||k$aKyI3p!t5o1`(yXk{vr%(3~*yLG%Q(73d zAiB^1SXP8jQPy z?1K7#K-}H-a~)mr5OM@X9mMyTCpSD`to)-CAt4lSD@Q|99sE|RRk1Es*@u$$^r{ix zMS6uy3mIzams&7)A2+Vl50oe_mEfi?)hrYgATs{}nG-b~Ief3uChV~zP9HFe)$K1n z!)ZJ6CTS!_Ox~+jt!Xy6Qf2eo1M4ZkUvOZ8B0lE47Fltxz4Dt1XPkEc9&iM2_Q**N zyfP@o6@QcW@E2OG3(E(BFvX?=la-fjWs#D&v_w)@trCSoFmZUm8c`GweD`u>7+dE8 z$#ankt1HOL+1B(?X8Og=Vk<**i|T02X_1rlkqen+71zev zhRD(8rhftVnVf99IoaBQlQV~=idu&S+}*+W;1&#v;&WJHFps8W6+^ZUL2+sbbM^`s zAY9?E&p`bG2Fk^Q5bQC9RdFvpi>s-~Bvyb~ym$+J3QBY@y%{+b+l%}+c%fg&UT9-~ zb@)qO4i6XlZY+uCx2G=Dr;m)qSh!GQ7(%vLy8*4fK`<_q%A~d;1(HlQ~O&eE_{^#+IoN zE{J@SJ$SL4;GKCYw($X#argJotD z6Z(guM0sM`R3`g*+Vmn1Kj+CyoKAAKUQb6oMY&33*7e3ze33f1oIjdgc0R3@@zrL= z$JXoee+&#{(v=KrX%IIe#QitwY$frR+LM`FCEnm(lX-;1BRZi; zCQV5hnM-;&w?1wOebVCJ`=ki#QWcq$CYdB9A5-F!meAf7|Gp;``Jed87fo@X<}FeY zF~tXwIDahWa$Oh8G{Y_3$uz$u(=2-m8^PEe&NSQhzV&LFdv>X5w$(JhrKh z&&5v4n_ni%^XuH#UoyX;On#J)b|Un<>GgyC3^oJtE$a!VoK9ZFNLdr^;RhwIYq64t z3C%nPanOR+>0#oGe-z(x$nPP*)E1|FC?L$4LGAkWtG(S#3EuRxI<3a9Jv)aByvJd|m`Db(|_} zjYJ(@)+7i`DB-k3U+PuSmw3a|JkRR$%d$=jA=^HeyCkmFh-eir&rS2bY% z!!vVp50S!>o7UW3Q+aW2;^0ECvbrudeTa)N3F&rL--~yAMKaMBgmBlz_syzI~Ja8;rB)6 zn;IeeLCfW{Q1_bsFuh>mPdvoJ|0ek@)}WByLO^LWiP5^i03(L+2H5Rl*h)xGp%k_k zoX0a06AYw9i_6puv?DgyE>abn6o*`@c~G88Roh6oCe`YZCx)29ItidwbrUSneQ8N@ zB%KjRGn!veRLlQ8w7oehf8Af?F8LT$0$a(&Qnifn8o97azXg_n2WjSK!v*xlzU>M{ z22FfN;7@I&b9Zt(? zpNfSWL?%XB>9YG9m1n6UbVw%~9v{F$EOK1B>>pSqCx@{1k~=k7Dxj!TI>N~&5Ap|R zLjE$a`K+0QA5E8;R7U-!>9WBq-L7-RH7{}_UeFIQ7cfHJb#wqPurAZ6>ym6wBk>)> zG_hL3!&aJ-oQ0YcV+p9F%a+lFa|h9KWCG7O$j9^x8ysvh)pMiiERLe)wp*`&MN>>jGm8a<-aNh7h+&co_S<8uJuJGPoQr>=yDcM%L^yn~t);FQUX+zPKk0VC1f7ZC zDzc+?3IhO4by39pK;+xF&U63zZi_}~}4GT#xhlw_pY)reD4?NlV3uoH} zvCp})$NoF2lh_K|9WljpSs`T+%LZ_YTP0E4Cxw)nRf5 zLqZB59Goh2lvR2Lj~(Z_KKlfop)M{5iWr_JO*}`(@JLik>b%4I+#4OCZUzlZBj$Cw=Q4=9zu^MK=~r8S+- z#?2eRPZjQ84gp7(73#r1ogE=t)XV}(=Db)prGjR@@1xPGY%Cj&3&>b;lxRHY29OpX z{gl8HO=jhZzUcJor|%qswP@sHSZvGxn3@RX4@*(y539WUNQ0CvJL(Q?V|pzM9K5Rc zT&dKEiN>I-`7wz?z&~ZPt}d($)tZ8R@id`c>iu@rm0v0Zl#XlZNQFCCNst#hnmKO=Faevh8(05A>IZF>)kK(*%u zRQK3-T*P`>rC;YUpdRH%9|{YFXtg}6RtAZQvmFVg|{qXt%z9FY7UnRtL#q{r<0HJqaDlG zDKjYHMh+V~_rQ7&q@sVSe-Fj~sI14RalvK+c4*3}5Mmg`7v&N7$)XfT*1CPpZ-1 zJ2T=ig0TaG!X=#f%^YZiuulHIfB3=JI?-6TA_3D>2{p(c@Vvu;N*Y0_Hk_ zg{%;Si4jF+qQ0nva#97gkP^*@LMj`5>GnenLME1iIxTOQnU}pn^siabg5VbcmxD`#a_I< zm)WXjwvwk)RB)Nx5FxxEp6Ml*0!Dzz_0{&>4Fx=SUOX`6ND^QgwuHyPtyQ=>-LCL3 zb<)~5V2FZLE*(CWmgkg2j!2jN8FQD+IBAw}VJz4h9!e)9c$ivs&EGco6!X^j!9zf2 zRzBO+T){0n6;zIb24BvjJiJbb2gGIqLK%&XGW>*pT{hMqK@ue}tmTq=RE$`wL|sal z*yeI|senl${mB~@4oVl%uk)CeAD3jwNL8WT%mY*C2Kg5?TurX;VAVcFo``0}A=x^8PYD!5*bw^Qacv~O4}UPiV91=1cU=g!)wc;O zs%epc8*w{b_Q+Dshz^uUho#Hz;WauJWhv}Ky;Jk7(M(oVh`Ob`QDMm51i^;fAF5UZ zHO~@i!X}+wCKlPsITTJ_!JqzqR+c3bB^dbcf`Jo{%Pl4?GH1@ZB{5JJ+(s+$>VZMV1ae~U{NEnIWR%&mWQ#8Y8A}H{jyAvQ&ZE^WzQ~WTwP}Sdys@L zN)R$tBy5^u1}*=hPI2Z#I-zK1yII-d^a6T|j>l+BYBxsWYZ^!RdK==ejRJPA$Vn*_ z3#zevU>Owe(~&&G)tQpvk*Z#2&g~PZUIIxzL@ip(G2fw1tyutdbB~NBp)NHf&k~?k zu%{Vt0cv@pfLa&Puk(Pq9sk};_yDQUZskFyLq_urvP4Vy!@*PennS{gZO~Pi>cOF6 zFNDO7v+y`x>L3SI==da{WK`xY#}E0OO`R7{Qo|POs`{1K9@gMX0CR1sT;ekRI z1=EpFPkm{7nPnA^{@f})jj`6iO8=AoI}6-z*>3*7u1~KP^P$!-J0E&QnU6ARE?BGL zLpG%lsq?1*pQ=y~+HhQ^n@p%3yB}Fuj&I#Km=nPoxlNms);qeU^Gz`!Dr+-@!^h%^JmvHz!8A7f-ox| zrp74w&BFTlDYuGVE53qEpP%5Sf)-trUI+tmRby+z1CE6qdLJcfax_)ffMpuMr)p%XQ1)sR(6?+IJ4FAKLDVBW`KpTQ!zxD{LKKQ9R!W??`rf?1P>` z3R1K%c9297_#U9c>W9Oi3uT%nTp;+%-=(QwS?<=`v@oQ}7wmT&6I5Li z$D~&y>m9B`ZF5D>K!1xvE(~ObxJV4O7r(CnJba=8WJ^hWLRG zo#!l6W_eQ%K~F(WRVq1uUimz#C%0o&f8Y(YTtCyFFHA$eXrN$!q!R4sr63O;O0qxJ zk?em)e(_xX@nian_H};pP+t0R-039)`NhfH?AVUXzBe~Jz4m#(RczWkx(54DGH=PQVKs*tESUH7&DUE zmCrSxDws;YhtU1@#0q2(JdpD6X!+hX366`p65Nr{_0zK~zycR|SOUVBH-MnXO0>3i zWQ$_2%GQYVL9zzie;+*Ra0$i!5=}Sk;3KhVIOIo_nUAjJqvy4LU(XMnf`t)p8;oDI zIk7-?k0!PcIxL`gh{H2XbAJb4XCFKXT37xvX-wsPNdB^2NFxlwR9blTESQ*Gj^%hD zy;H+rLq__&NG4%Xo^DA(zF;p++*P_Uvz#|QOc<1`U(Fo9z3M*Ks#SIZl0v4T$39-Q z%wCE6+rR@o2!0^iXW}1#lHe%ug)zk!rc1<;R5`Om7K2~p8xULN{6WyuyIaHDk!BoI zv_-Jiw|ZfV#}RA>7GjZ-$)JBl?uQ?Gx3W4@pW3Ss%LqkMPn}vm>xlSS`Rf;fDSC9o zBU{hsA3oD;u+qUPaP1GTnMulg-_7^xTNY)9eN(^hbGuvkQP%RZ41i_!w_df7Gq1J` zTIN$vg1=AQ=g;f5ooZff`-P`vMd9uNE5WbKYjxb#N-IiV)L|(NI>wbEw|vDhFHg=AdSj27__{asSQZ|2dl=|=Rm{T115v(SJmG2C z#*GJ*OQ69omhewQDFP601Nwxa0OWduunA5$W?zZ^a>-y{%NSQG;=_dz{OD7v&+WeU z_cQuY!x!D!=BJFmCFpXef>>ixYAXs-$x@k7kdE<1pX>3rOrX@oF1HjdN`XY*q3Cl_ ztsj+k{4Mk3?ZvJlDKf}(?=v|NzkEhWe#(rXap<#Oor!-bGlE9~p=^?8Lj+`CDvJ-F zL}QeEYU2QWm~d-!bI9GEk&gh!U_kr?i7ZpHK{g%Rt?^%ayCG+(W~-I3)ef@NfhJ{I zrT3SVwNE5ss?#Ci#I3SdD5v>(1sWHYWR;wPU!B${sl6mcvXL22?!Ce)3Loq81MWpU zmKEbVb|{5AtJQs%=Y^jlV{cUd>{}kD)zyhQ*;Xxn8Z6`ch`Ji4~!0y2+^aQP?TK> zdzub;Eipds;zwN<8_oBt61zo5v!Dw%m`?7c^`FbK$vn)p zxSq`P^4rJ60lt8URXUDOg)-1W(36x9G%^z^38m+5`_s;Ygby;B&tTK0>I0BZwA}gk zgXz=-aziP59d}a1D@BfRiah!zMNY{Sd5}9Pf(l6Je_PR=R@sk#mg%(d zI>BYHj72K9O{dP6P0pu2k`kq=#1uC1ms~pp7Z&!~u46 z!kJ~>jEveUTl<()EmbfNFrR%be)K?+L^mBi$F$D6M5tA31*~a6$UT$h)j?pMB~-G$}Ae5f{F%_jhl8UUH!=;J~@_w8s6gdM@K`p$}v22OIYf zmD^R-{AG~eIyuka52KI9{S!`fx$ZdDy62r8poarfj8(tlL%`{q3LT8O$8>K^?`j=G z$>cS%_aBDj)3{rFLmKzLD9@YrsOxUIZhn&M)?z-r^9UNbvvL11 z6;gb?DiY%r&p`!bG>IlvS(-NP-v#q|=gp1#=St_B-c*IKRpk16T&J$K8ei$4 zzqrOw>xXBN3}k6)ZsY!M&}{g|#{D;_uE-W>+=td(WFq+n=$72ttXkFv} zZ_$nL)YRzKV<_+r&4y2H+<&Chb9`$Rj|@f_KC*HDWAZyHm1^97Yz0>(jr)_wQ}G+E zV>?>MceHvsT8DSEj_7DTp`*3DqqV4`b!bOxNk{A8j@BU^t)(5UgF0G=b+k_CXdTzl zdPGO7x1;swj@FSKt%r5APV8tkI$DqFXdRV1p9<+4sIZ*v*sJm9lm^qj<~_hk%+0^c zhzPENSX*1x*!!{U&ycG=T`K$)6-pXXNhsDu-puP`o!4iYaUi>NII>ccJm)Q!c|~J` zTs}w7_U6&DPo9n3Z8SJA|KV?WXbfM^no-9dyOrAl{vk7{3gJOBglez-EV`D}a-KU) z<>K|^(Z|(5?@fQFbFgJLZl_9KpZP+a&$Y5KYco@&uwtCtVF^hS78WC*0V&vEUgmmf zxORTh=k$RzUOD?MO(ZBo9*ydhEG(CAYec5w1NNh)S8w8I)BGQY=vmw-$)qfDcA*`D zqu=>dsR$uuP(hTe%P~>iEBhIu=hH!pzY-*n9O9&4IcecBZQj|-YiuwLr~gW7RLH)z|o* zh`Iek-}4XM=eM2^TG$`|*w_BSC{YO+cZul_a-BiMi7N5qB`LDA_MUQT9mcmV*9^Yx z^0oh~*w^?jH{2bZWfh<4Yi#R{Mx*udVlu&X;Ky|(OV{-|)IPQ!#$B(<^hlgEfxZkm zj~AvU=lksO(;aet4m{qK-sFE%EP6*d_~85UrGznTmJ6$RD$4TISdlCdcrHNxFyK+# z^lRF~3j<_{Wo9vh-LfpjocAn#mA@a7NR789Z{?dXWcRJO7N1ESgRnSCi4m5(z#_FB zTP1Rp5Ub4H&X>K5A4H(VD`m9qZcqKVb7na(K3ETHDX~21uP`xv_QX?we)p$(;QewP zec8w>ra2?O(wk~MR6z{+U$+lTl~R~&u~V2?wWdii?#ZZTnM+mBeMWx4uV|wy0rv-!5pl1PQYr7k)wL~WmIU39S{tQgu;v}338EZmKflO$ zVzlwZp2l4+FaezF4i2?%G#*U9K`&MjFp|PMji&t+#-w4g&-%Wrf;UfWA?(d(T&#rO zV>fpcH@>R{#_9*_jqxBHZ(!(NQ%-wO04J1tTQI)YZ2y-xRpX2AmG_MYqr6yxzEBGI z9>-ehxzw5Lx5k4qNlOm%DaIN(y}USrKN7sGJy{{H6+Xpb2jH;feL{`ZtU5sK%m7-0 zRYE8zXE+3|>DuVKGisyTz#e=AUMbbx3n`l)9 zN8;ivzh$W+q`}igZ1q9e+P|<-E&TxrI#x2|VB&H4K8P@8A3TKB%grJJ;NGwLA~^6a zSx#%rG^o`@FT={qETV>!uUsm2vy@avw|&_ABJ@#p4CvnTq}t7PuWVbcC-$FzC5Jr; z&e?r(-p}(n+C*uADx z3*@{O!RJBnY1@k9xt#ks&Z=!ICi4C>ZZG?c7*9id?eB1E?LsN@dTJDJ4ob`@NEnOK zv0a7^1+|mcFR3U{EUN0!(9M3!+$T`M;4!xx0IUM8&OA@sNddwOE<=zMJRtYAG zkSsHUV)dK6W_?yHg+~ojbQ+F`B#kGZOX(7CR{D{N4Vo{K&e#hX%|&cH&0Bkt?`}Sr z#%9RamaW%mUdvaV(-0Cw1mATc*E!{HGWB9eRmdSKF7JuIIy0zc7MZ%_HytR!Y^F=F zB$h>Y`9_fKj>ufG_7PaG9DZ3=?v?rGQ2Hd1j59qC{8PKt}_`69eB*hi{(9)Ykik4k{P)3`~Q9Y z6=asP7`NrE1k-7jBfv zQ^%s4I2o5PkB>K|<*AV$m_{{-Q@F8LO@=3Z!S;gZ2u`ubo!Xv-ihTZR-K`a1!|TWP zrw4lxLV#t-6pk5yc($zHD;uG#`>X8Pr)291&OJ)94w3ygGBI5?_EK8PnyMy$1GQv6 z#UGb!nBhgDUNp~aNL5T&t2m5oXqn-v1rX_ zQF%YJ_}j(MIxJ@K$(&jI%1bh4@gsSz4KT`H!0ImH?>={=%LO~Qg&sH-@|Zx2(N)X& z{1O2cpZ>kc|KfUbTg!P2YM*hJM53XhQ2g^i)hB`2=NQf_GXOOsnkKdyy7jzjnVDwV z>0a;H-DA}-PwZ9c zurkZFe@{l+KHh&;j zOluIKsfn2!w~mSX%BUPE%{zF)3;D5s*_dbOP8-HHX@gl3_0F$P5Hh9oofqVpOgGQI z&oi*m0DP41G#~rG%+Mpy&@_`Sdk>HiR?sXMl)?e|`=3MRGLf&$B{COCYmxDUdm$?@ zVPU*zp`5Vdfv!dHM*U_*7hwZS9-$quu%kkn802gl<@TeVf4n}Ztc@NCnXjZaMb zlG_AzV;T>+8*lS9_6XA^bf>U+2p5P}9Tx-N_|_D*u`}sWKaZ4Dv3Tk*sh1T@Dn7qI z1P4FPDhA_(yK1*zpQy;qlbJ9an(Y0@tJ~WtAQ9o-=QfLsxyb5M*;J_f#IB3jn#S7i z6f5snL0SiuT23h*Pdb9iYCc+WR0jV+u#7>Tx!WGg8*$F5t?Uy+T zD&eVHQKZa74?=fzX!;CNgSHhZS#5U7YO!zkhR@s}R5@TcWILeDa!eubtzrtm zOSQ9S5;=WlC5;J*!a@4bMh?;+G7So5R3-K!$LMi8qKj*##RZ5c)j>nc%0d__-7c44 z6C+xX3Z-`j6A-RYw(*ykTk5}-!OTyNdjggU$I7_>GmeuUalAvgvdJF#Z`p8>HkRXT z)F+U0o6!;xN(B|X3&+i|t6mRV*+wagq>ZGzD@&tczY z{3an(x_l1t%N%dAA9?K{1nbottMew7gV*OHH$)v1tlDd=WCdNJ1Q;AGj?pB?8aWAq zRegj+HeyE!zDNXtVB+bj_@MTRat>@aX3Prdzh?WOsDUD*ndh$L-FzQP;Fu;UCaMC7 z`iT{F(c7!j!y-o`Z?eZ^3a2P1JyK;Q2oljvX_Yh+or|y0el$WI`~zrCK22E(1rE2! zLC|Z@Kvhvd$QMxYAPVWuk2aNT)xM8G4iOnUeJNMX>1LM9cLoNWNjP}>zYfP%&b>Dz zZgsfo%mp|;c@~iGK8`(ZmEMDK20-%Xt?-+p>5;venZxEt;uorJO`)%}92uSbr!ceX zxzt<1bJc-#{Y0TKmBztwSuf-d6#mcir`CLcrc2e1cfNA$Tc%{-K<_re_OL)D_KVnB z%D(mwydF-|@2n{6XQ-ug~uc9t~idYJF!M$CQc;py=K#8IE82&qj-r(eafJ z$ypQ^2Sm zfrs4ueKnZ4u}41PRNAfm+M!sR?x!MUO%IY>McnsvPxMajaj6x^GoyEk1F`5FaGDl0 z2|`xC%%Ygf3p*>D3W?GiKLVcdh15j(h1!@>F`<4}bPKPWVy=Q5pqO zlY}b8EDD;%-JSeIHX$t@HhHfg5GjC)B|1JK30GCFnD*nNybo&3z_ys1gkldW&34WlfyzbOgz{T1r6CS0xUSUit0{Aqt83UD!od0b}iQQ=~@^rp-)xhm|LZXi!!jM?Uf+4KKPZ464TW#zl!CS z@ccg9-+3@`-(}J`;p--uR*Sk$cp50C?JtpF7)>?oG1Iz?pl`;Xj;!Hb25vu84^h{A`c_uJ&!?I2VS{LcG^; zSDGv&QK(NOqhkssqZyU%UZeRwnSW0!H4 zYP3tBZ|G`GtEPMS*>Hk%bu~N*&o{E5_Qw#2NeF5P?e-DrvK#AoC81ERRahVbA0r0H zihh0#T@shz)cHcVZ~aK{1m}cRdNguodO!cql=)IH@nEd zhJBblV@bY>G~fOZtiNLB z^y9_(<+GcW3y}}@BkL3H#wqaNZIP)7&m-R%0RGVhYU%rmZW)au2^>0O6T8Jd?7Gwt zc6U-Xd7IFi^E*~+{H0M2-loT}g!#?qw+{`ez?%M|+)-zg&WV=)f%F#wxxjwkjom;e zMhE*5ZcPP}JN^4``+ff=z3FjACLhqqgYV zGGr_iWIvZ)#~azts2)5a8bKN$`*}8(s<6a#kp28;_vE%-qqXcTUKq_kmMY?<6S#5q z^Eml7BggFW?~q;2eGfkj!RG%D5pyQx){LFI=SHMZkvq*U&p){W$}xB=eV0pHkPWus z-NfeaF-Df|;+Zkh^Bg~B+VdAFT>1z8Mh@rOpKu}nP<43j=NfItR90&4{0{pEN2=X* z+aJKCCzQ!`XrFx^T(_FMCcG}wslU?Zc2I|X7T6UQ#45c^>M#4(S2&=b$k89pdb3cW zZu=*+C%}q8d0`*)zU_?l5iT-g z{S(((vtyM$$TiBHsq|UHe<3_YmzB$0Veo0c{V_%i?XjJM5M0Tb%efeSyBklo&lnNwp1~5|rguvY=N{UO+>Itfh2 zkt;1ez!|#`TLdm2;!!uhtvu>@SUp-tUwgqIa%3R1f53kDy4)V)SZ#bJN?R;Ec2X+% z82icR5Es7xa6fHBdz^#*HttgYZ9mG{{(K?+$p(JOZOGgfiWgLJ8+XnYD%=o?p6r)9 z8)gn7^cs83`IYt?yAi{I|#+@a@KDCd}GErFji!yMCp1lREi;L>CF%1}so?85OC z%mMQ2Q|JoW>Kj<$$9E)eSC2CTd+7%<7t%5V(}{+S=F6oBQy^CKM)O}}qOvpb;9c^8 zASFI%YBQQY;j-3POLVBx^Y<_mZPKv%BNl>u6j*RO-%>pJj#MQwh**~a%=a>^Kfa}> zVlMlD;nq(yc{rP1$@LVjw>br>MO~qT!U!lRTS7HsR#_RvVYUvizkP})k%hktk+qU| z=K6l)4N|~a#iq8%xt;zVx6Xu3SNuJ6DKnH?>Ay3SjUVTRB1GJWkBA?FN``y}AUBpu zWvA+j?HASCRyW6EcFvYG=gpbeAKk|Q6jv~S9=iOZ7}z?LRFqpsx|01Lk%I%9h?7xKPcBmx`f6L{3H>X`* z648>d=yE;!zr^uQ9=Xn8d52&Pt_^BK?8;<<7a5jPo&r??u z${qeAa@;7n* zb5iu`P+`xPI)vwK2u$ob!v(1iqz`lQQ32}vn14auA}z?1KUE4$Rn+6CM6k#BD~WNF zx8Fq?1`>YU#jM2V7jIBeN%rmXtrr+tbOs5=uG=1a>xlCR33)n_zQxB}x4o7;=$P|V zy{heu+ZLDV(gZ~$`pRb5%3=ovmA!U`+g1An@$O@N?lAFHCS%2au6REX_7_f})@c1o zq)Pci$;#_UAfic?ls8@JvhVUadUSM}$pv&r(7?Y9vCAkpkTiW%EkgsTV57ZNkclF& z_^l9wQOKW}43PXUM0X_U*fKx_86s3t1kc;ub{thny6lH%<*O`}8L5^+s(3=#HXVKA z7Z5>-alrB*r_7=PNK(Ud zVB^815xdL(kbKzb|Gn(LM;>GlR_Gz$x&|KFYksHpUz^Z_!mGF0KfEe$6Pnf!RK;=9 zy2TgpfoWYNKHi>F-D0@rxrD)+ap>ENAl|lzhmtzJf|LQNBO%_t`ArZBdg|uQ>btV! zZv+8qY#n;Y{@MKp$uRv89G`SgItor{W$Qut(2d|<=osljWiD~Gz7*19bB4u;L`)UU zD9b~DiWCpglgC5k037avGnl{RHL_eS+3y`p$+Vh9?!%gq1f#d>+-j`=E_Wk+R|k&oGufj&Tu@)Y+qVJ z^JlmkP%7RZurPK#-$A)*qD}#|2sZ}q*F67~3{hs=ZVqBab2%U8ohJj!`+MnnNd$VE zX3wGT`Cks;9|wNVX&{-pvjSD796qWEC2w|C?OV9ZuQtc;_OH*b83tnd;`j6t4saO} zI+!cSdg*j|zuNT{JG8wW`ZhIOwNe2B^(j(LP^f}8$AvM+c;;R*Q^6=p&Y=AIq_D4dM%9xOxKcUarn{ylH^X_*Z~m z+kRJwK!I1#!)P^=r6M#^?_L)gIU#+4=O?~jA^Pc%GaT6MiTzDk>y(4Aqtu4l6{yhzj`vJJJ;l^&tBvku(*7TL-;2B_ zd@I-v3+w9%2SI=Y|iWW$$UE(P|q{ zDtf=oj;anb1=$YQ9=gAKUEnOIkSv}3F7uW8P$2FL=tmkKnzc;X5-HoWl43b*1 z{&8$hg5`UPJ8V4c%+3{yM7q4Zmtyh-g7 zAVC!7vRNE>$<_zwkrwTiIxftT$YB}m4wXoq(jC6do3pGv)dHEc1wvda-d^-$!a^hn zkXY3ojzAN`Eri-c2pDTCSA1#eh=r?ZYO@O6ogg+03B(eiZZsC@CH3s@9emJ@xDc>W za}Q9~f+xOw?*E`BAO!=M`i&a5*qw)A$VxI(yFj0p$u7#sfSmjM{hoJTUB4h#ivwZ0 zCVQ3heZ`lazw-T|7ikvXQ}+&Y8gik;{LR5cq&reBGn}oE{T%BcUD>uU>$;@ROiYv5 znCu!{F?K_%s8kGpSHU+y*b6|O)Q{CWPz;W!^B6IOnI>`FB$-Mc$!|SSyU;@^S^4h)~QwUONSp( za}YzwIyM7rVn}zH?9SwIl#n%2cdSqrze#!v7?kVhGP^Vgd}p@+K*ttHBF}-4WP8jf zKJ=%ItS@{t@CE~+=m>n zy*va*nxRBI$zOje**ZjC>Tn;(v^jNuApdF<=?PAW&&lO4aa zU#r!?!NwXFWxkl=e8Em-ymEeJ$}4?90f6NCQ^>FXe7WKm;MZ>h2JGV-=$m3e>8N>0 z9;;AL8|O*BX++}(eL_fBzn>VT61)W$aVzK{DE@R^jJjN0G@3Lg@QQW{8umXlB~QIL zTf^CD%3SV+}5YD8ney(O4X`GS4vodGLU zoD#cIX;(c|`$Ot4%JqyqF;rr+oDPORq05%mvpL_HsLCqa27sbh39 znDGPOWm2=67~ig{$B9QWc8!0lz^d{un~61u zcjr7f6K6oSCZVvm+lF`o5S5j&Pj@fDqvll>G5BK z?)RbJO62AE)SUz0;P}2hd<_*AQ6WOzl?Vf*zECkE2-l^8I%Xo*XQyfdR(+=8XJ%U? zDwzvhmiLE`NF9HOSHxrA9~nVfEf2xwYAbrN%t);1QGY6Fo1V4GbAtV zPvRovQaQXCyezhvXqLr>+5gVJFe18Y%<7f`k4hy$N&PgD#}>h&UX znk8)*tJ={mz|F;-bi`J#f|P6@?rEbB1-Z)EzL@e7IBld0;#KyFVE(KNn`Cx0Vk@N< z4TS8#xsXwpkxgv@-?EM&*3qA%O{k$+lhthZI(l>VB@{-PG?;($*_KjSW52h!T9_gU&8Lhe->>$%-cNd+H}vqXc^hP3=0er~}m_FP>Pz-{3?q ze~TwVUQ7{50ugCyxi%TBXwA@*l4{)Bu*mS^Xv_!WTR(fRTEGwF(&8N+L}@yPJ5>E`D=`gCRme}iXw`CEKu zApIT^H{zplyrAaM5_bFF%s8KB5-naWc72I=m zZE7WBnLW(BEEb?5hSS4U8z?hj>JgLs96mH` zVZpJq?Ba1}v3nlm2sI?5QbGTrmZbiJy*mvg7$N5_zTR%^hPRTQlK#?J$&J@8S@KAb z$5bye<5n$=W}$ARrC@BNo`m@Q0%P>AM}Fd#%sqQh0cuf8^K5x)MJ~kGe{KfqE)oVO zn-768$rcRUux(0x%fu2H97DFpNgVDa)wnph*HJH| z;ttN}0*HyfCh&M4$dBXhYEt`3no;dP(gW2^qP5Qkujf-VqID2+5OOp4TSSH($x^+9 z&a}x(s1c|%OFAY>#~Zq*kXdbL9!ae24H7mIpz})KLxv zkcDYWirW$V;*&0+4D^S=X^+VB$mo9MLX^u+(F_0a6v-A<9ZK$k`~c0ZrgHhm<$e69 z>Fa8KfJ^z;sbrIgH}p=7`ysT{vM^wUV6*dLH0_iny`gtXFtJfy1>Fbny4fi?#8ZYO z3hkN_z$>ju7#`fL&k4j1vIOGARo@cn2_!D44#Y#8+um7j{#-DUKbIZ@u4@pq7ZR-J z7k{rYZ2le&)Y9)FzPT1^1|`&qA!{Zpcu+Erc8DE2d+$`6L=swyO6jgBdjB5w+5-&A ztXU(YHkyj0#|bs=&SEcH2Qx-h;t=({`Cfi~OP%@}kcIlaDRlM?#53=P6J6EFVvY115_5!` zkTXWJ+^M-0U$7QBBG|%MIf$=)(c9hbUt-#h2di9vPVtm;eUPM}Z*y&0LdEE_!}7dw zE7M4@f2jueU9I#lgI5Xnp~yA+z`vQb$-Fk2w@AbBzT{7+CA$A<K>Nrc2Ns%0jqW(p?~ml8Qx(TSm+co)5bgqwilDNe z;x=Uf4bRIbyx&7{Of^?){x6>?Q+)I9qI`NNsQ&YB=|^m%z^@LwA?Q&_YwUY@rN=44 zOr?X%lB)gu>A$c&;hQ-{Yt>G&{nVJ@n{#Au;dz*~@6N@8fbUoRk8V_SQRE0ZEbF5? zET@#N{@n+^sQSF~>PzaUTG_I?+CHfkD0JC(AF^7956;t{-YPPeJR9n5W@4(N){+=K zDiBmKu^3#soK%TvW9f+!u5YsBHO=*p{77S6m?uka`&T1EUZ%#Y+&q$l;O<`|KN&85 zk|~cO0mOY-&huamM%FD{oYz_W6_R;(@!*!JQvI=QqD_PEW(^2;{U#5-lmkKje#`q_ z6-NTqD=Njge1!}=tHYsJ+5My|DWC@r)gO8y5tn6rx+k9j2-%IKDjDdnlGh);$G~I) z2WxMqLIdkWoTV01G;MzvP+LyO(@SU5$De@8NI%o}hh^`5Bsq+4-XOLNB zi^$~NUT>V&hS-iI>*N`(+2%9uCAsAr#CqeZ!*A5T?r(Y{e0_j(qiU0}QnpRawk2ic zdpDZ?z)c{%wch%LG?5zQi+|*+dd}DQsh$AR!KcHKKzfs}u|rKj%T@w$`D;3S#*ZcF zNuXvsR|F%fZ1r}*{+6OtwOQ3yv+b6{gd*PqDc;yF700($?Q!PVP;*Qo z={7yZY(htGW0fxBsOE(D0Y4kY(NTK=hX$K!SwubG#m|Q0Y2nSGUI&|1183Mv6@7`lbG*HB10*Mh#dc>#;1k6#BUU3YE4~MfD3$UQ7q#z z6P_8qB26CW@V#2Ua-pu2E&Y*{h@{w2dZczK)JtwN%6`cpDm_W2#WqXSd7U8n_}tZ% zvvu^|X3xaiL-9`ggK=;1stFo)eNGQ6|lIKK+Vc_IG?5Kjq$ zs&KRt1^t;;r8t6oH0bs;Pif$Q!5WBYbj#B8%Ua?tCevdtC4A0e}?Q!&qkxzBI zW*vM)13DTQ+{4p~7z{By|uC}ODFo{fHGU>yVLh5qepVyfE~ z{mlQ(_X3nR0h9y3{XZB#^FQ$W95&JTwNSstX6d!d-j-b=`e>0BgvE{v3k6oYdVX>! zM%+><3bqXWmeH39g(Ui?LjBqfDw7Z7=*i)8d!zuzJpT0WkH&5Z&jU5$aTOWNr<^#7 z?z8;Rg0x|Iu7b49oHa`+$XR1A(`PHeK#%_bs>GojYeWtCHFmf1`a#KFNY_hVnwIQ z#-S+ifa##9TJN|IineQ3IYa05EU&^DE!@;rycI4+4JF1{X1Q2Jn_hAf_$sHTW%AoA z(`A1h%CPk}S@Z>Nvi~6jTkI>Y@OiuiHGl@_=-K~a2gT$;*@5h^cit-uZ8{x3icVZm z5;K-+s?;PYo(- zQIi|ry+78olpzH2?4t_C19xF-BNAKIJYyQx|57f%u%}y2dImSodcD@h{QTR{#L4ZhaVSvc9txVjB z?EWo8V!^~@?0?VcPi7=qFOvnvcNuSljIVX_Y^ciY`YQjV*QJ!TNYRvMZQ;H6Cru6z za=E56a=4#R&jbcVWFP`IU%K5NpMyGD`CI#p);S{#Wy>3gpY7|?nTd47v_R|*32-9{ z$^dTZpqX^Qnu7()CZgB&6vI7{f0Oy0ECeZbfB|ub44`-u;Plz{j z35G74q%S)3Qz(9k*O%TReTj?;Xu@go7T;ZSMnv})g)e4lsvTIi_q`+H2kNv+Z@&}9 zrk z2ukk5*f4cZc0M&fp0{7B6%gdbf;oi!VgCN0JO|SML)x3bM^)bY{}~`KDB%oBG+L`e zjhfV@N!=1boFNNmWP-s3qqRs~A}*C}g1BMg1ju0=OIx+JwY|1lulII~y;gy`WD+HS zRsmZ9Z53&)XB-#676=yR|NcB@CX2QA{$H=3FUdJ`&U2pi`+WEB_j&XeIU4dAuG-@_ z2U5)-D42u~ubET>CTGyC-#)0+4c{~=#{1mMe`mO~mb>7wBGr4WW znt{yoavt$^(HyAWPwysj{b#u*aV3hDEBDaCJ9Mg2)Q8&298<9pUX`3cQBp3*c{p_c4_V)S z8f_4jm)Ikkn1Fx%>Ho6R`?D%=dSHI1XTSQn@}t!r9j5)B%dfDFQYODbB!LB;^rTC1IJtK3R_P@Ttx-++&l0?(3ILSB8r!C zB;_KyNUl^YNH_ig^@(GwhVnNS6q^yHNDZ_@V$F6=`Pa`s;y*E;5O}nYj?U|0sPZ(9_kmH<86vFyV@D0 ze}tjEk-`hVX=?g_i-)2&@R3}g#<&%K;`7C5eK6~Rm)V?av&D~OX~WrRj!mY@dj_i9 z^arX$byBqb>!!-f)VZnZ+|x8R^!z*JgC0P#;^~k&#Ygpf5yDcz+CBnd_LvUXUH5)| zt%UFx4k$M@vR3>nfA_ET!zc`*5&4gE{DhI$KGUC_ZtG)%XhiOdA@NIj4kuBaC_Mfv z|AI35nS-+iP{zxr8I&;~FB&w^Y8EcXAN&_Z41XX$PWS^0j4#dY{A`y4*cRvVuv{>v z<$!#p9!KFhBL5Of7T2co8dcBfHA*QX8%}D^Y`->aD~C)=0dR@#K8Xy_$UUbf4^RXauXEJ! z26y~cei@vZn~;C2&rp5a-ADgpXu|{hb;wZ-nEE9F8P$~+W)w|)BN(av6K*_qTh z8E2xLO}4}7FDOV2Z!IRuH6y>}a~oBPZ; z!Ad2GC1t+ioj@R*##~00C{ASdk~A3ZfE?E5Ar=`^sLqeB_JRfCV{45|!VkslCW{`r zNte7GwEh*3;S5o1(D@R^YsE9Z%Xsf)=Wx%9dppNyu?FSMS#WY3MoJ(AC-*}=%*up3jG#Gy;mTP(#&Vb`ZPA)046U#bP8*@?|y|D|8{=JX$+Z1)5R-web z7&B@0ff6q64ss~i$$M?x-=hyv+pOUlO)PV{Xl{#9*pV0e-tGKe)5;%ru4(LE`8K*K z9#BC6lD~T@54iX1{&d{~y|Lq%Rn&APgY>hWmN*ztHX)0-f6fwUwLfR1|rk9@tHu%OfpO7ewVJ;=pEe^-c6a?rkl9&$LFKq ztTY+v3I_3ogGixdbjFwSe-vEl~v%NX+`g+Y>T8u$3cN{a>lkdH|&CK80fD|02pX+$w`9^pk z6rQa`K9&C2RNVx_Zcf9g>5i6@b#$YMjnf+~@4Y2JPTWe!Sa)Wmtmxb(W;NR78$9*H zHuo-wn;}K}-I#6@)2VP~V}6EZOLZp*OD69Xpt?7BEB>(VuQ&J8=eRfOCQ)BurbP2l z;hyY4!#b6dCYSHG>K-B8gN!eDkTL!oN86beXm&1wGSmb;>#uZ} zyxr#RpspzS&_hI5M#(H5f`fD2BWXDErky3D5w)xdQYgGiv%@FK78O553wpSH@AyufqERP~aCUkjS0cEFudu)!LfWED#XMi5e5$Mvt zH50LQTyxl(8`|kjShK_XLOCmYWH-+8D-3zel$erZ{J>TQMMVVts%(J*T>rprC-lw z%}Eq=pYDdt=J&FnC+SNjf+Rg)^O69nLA)IL+`fIRb-dS~`5;$eKfY1N&xf!(M1(lcGHh{KW+?zS) zm0)MdX56E`5m)kn>O^dmg**sbKrUOuRuxW`c2Ky}{U9aAV=zh`#rHY1!QJN(<~+XD zbegsHtcxeAw^}?U;gOMPP>%uR$MH2<>2;*P0`{i+e|$E7&}X>?V7@?LUP2p=qRr!b z&C2gs{{)fV+C`O9J|`S)Xdf!Db)dWfm;<)eq?54}P!FA(W*t6nT9IK!9Ot!b!;CP-Hw zDnTD^91t|+5it`+bW)lmofJ}AS{ANu493n*F7Sa{Pr(nedSlDT2J6?`GDX#EV`XUO zqX;{rVFottY_OhaDrxDlp6ZU^AOP&4xEDWJArOedGZK1wira*qgOwkRG0|GH{ip@w z_}pPJEMB4M7)GO~KNgF|#P0Yqe83uHLv%e$e#DPRjRVLw?&wI#6r>L33}k9-f^Wwjwo5#=?<|cJb&Q{nZdilN7c| zYMAnyX^mG8vzD&g1sC&~oua*G47m4|KFF;|jqS9TuGGDAPiZSxG*=~&WP52B_j=dC zRT1tKtSy}0t*J7rBC7~yRUR{$Hk>Y z8`nT_YD*jGUIj_(=wh_ADdKFwH3HpD>uCVQ(}=0j>i3DId|wf@E%hr3I_e5CS2%w( z^&5mEleQban}Q&OU+_VE|2NUb^@fAJu|xH2+Mf<&aeWB4?)5qErytS4lSThkE^U!f zSENB&IK6P(n!Dy9e6W2VaSmfkosB)dQ5~$(U6bxYQ8J#|HXgD-#>J&o?y2k-)Qb7e zki4XHvAXjcj(BcxKFXX)58VguU{f)BEL3jxOvQ}etGA{i>fByMHGE-eVkLdY5fZ8`h&?)P&-MB*bA=G{{a=Wp?V=l`kaA{g#c+IktRxE&|!;?iFlVD++CtOy5sWL;0Tb#2XN8&OsoA3b5morZ!$NHR{M9%&81fR z7IX7Wt6hqKc;7s$z1!R@&VO|)VO{3Q?NbN`IF|B1PuZ|?uw z-2acc|L{zeuQB(pnCA`V{%v!wp0xG3=Dyb4596=Zez>`pgm1OaG53w;{xWlaA@F9k zBN6hg&JDEM|6=aHhz^B8nfq^;d$~lk_1$RhC2P0!Ei(66^ZZqFzt-GuH1{k6WvoKg z^MtuK2|?QhQf+;0phT$~O)T(4{EYt{A2w!Y~Q_}HaweP0T4y`Zfx zeFE31ZGB%va!gAI>(rWPTvkkzanf&99i)5L1?Sf z-_v=7o{l$9$A6oA$JrgwjLr!?ohSBmj_Bzu?CCtZr}NOB&XS(a@jad8J)Ot(bdKxk z9NyD8tfzBSPv_{K&XGNxhxBxo_H+h&IuGmVEb8eD^mHEE(|J@+r`6Lrwx{!$p3W~I zd%=(y8Yc<)=+KHAK;ln}yu|-o0<$^|_~w&6|fjK9i5r7vBVa(kKw;oedaWUVDG_UGytrJ-cD= zrajvlIM(U4_X(wHIYKYVMYS<9A=NN?ol?+B7Gbtmcp~AU5(&-TUj0Ap)gk1V7HXZB zI8N8N$f4dzxfg$WAnWuRX@2zD`q9JF!-2kr#ABKU>!~-R$y0t9iN9DFPKq&X4KIBm zc6i-{ck7(Lg;O5|BB>9KGhx1woOP|--@$OhCi z!p7jPf=opuF^Xsle-?t#4=HE9^RFL#P$|)+j8w<;fYOKw00>SZ6)G zKJ|{jvdemU%jgZ6VV%QLJ1~HCjozs78K@mAzQ-L&3!Oe9Li$-!G05)Cxi)HB7uOGy zp~1$`wmx=3yxP|ivdw|UNR#lC;lRT4Nlc1};Y`ZzW4I+{x1xfbC4tPC zX!X2(MA}q0?QHp-ofSWx*WG)v4a!;g@AznBqCtGLv&n7zjd*o7n|sklmx7)lZ>tEOO%8vw-0_F2|7Gb0))b zFY`Km15TT6k?FMbUW*w=^u+^N_feWQs-m4%s^|$0b$w2A5n0u8?ZSE2esk`^2yw5g zzd84so4>JO?lqChO_4R8vxZ z!;7^Z9$n&qhv>pZwl7PVc@Kuez+LUat4GmcQNM1A23CYI$0 z$=EPC{Jfv$8_M@asyW=Tufdw~s^lwYzqohtYEzP9{y~WX8+vzWJwQ`mMY#ULLtv*f z-+))gr?Il0f$nn8Q~whbsYFBC971t%u%Y~5gY)-D{IB~Os^439)bzwD6Qh+ko6>|f z7DOvgBL$5=vm+e;8~!M2mc#)K)HTJ-1x-1N1d?XU=R(rFt!i5VpB2D}DNTq~J{`8> z)(Q>>ud)xl6`&hwS4#Q2%N28JpFVkY)?B9(-B3@_nI%zQukG6uNp%%PDmfFfJ7A}J zgLdTx?AkmWXZyB9D#?c5U2IqGw^OO$|9km?x>YL+mg)*dE4%H=jW#V|r!j;;>7>I5 ztGpKIuSqW z%MFB$k618fN@B#Y@EXuaL5AFXWMqh<=HLMNX!ZJqUm&gBFi6xfhp^Otq)0*JwZBA1 zZ;iw^3~Q*~Kf0uIwd z%(m?wcn_4ta>RHzRFVDmRe4)Ll!1#!JH^)7L}BEx^{7drR?UWJISkpRNO=k!Mzs8u zTLO%}67PE16Uj%R6Yo%AC&zGbX}1e!&3@=Zi=!<8rk0r?UOn7edPrJ*%xkp%Z-YV} zyG7nN*oKt>c06`*mPqGHK_;AOt{kHdxc(qGr?^|At*>%s0=y>{3@YZl?mmAUxHbj3 zwSLXgxY(P3xJzA)juEo8&*O-5JGOG(b)zeV_(1FIi@06yzp8NwO{uZKjUkIf`z+v zFC8ta&DOTK4% zbUecTT<+G^SCAP?=zyH|()POFeOEou0WI;9h|QhqR~sN?q6IDmaAwMBDOPTjf%V)Q zo!@Lf8->q<#GHSX;GkBC3~0kiU>nt$*V1lP*xZ2+rMLYQZA&CM;-GXAW%>glFfY*u zfRu*+jwV~Rq_&bxS2ZNb*G~bsZ>(PE3wGM0zi&jIc)Hb7ppOGqHE#FMny_Aw;=v3= z8GD0!WdNbzGxIzE)+lN*AkFj}>x=D>I2~53d;`IdsrQGwzx*rJC6)x$4NRB-2r3bh z_nJ)Scp6P(8;wt~m3BpwBM#8(0(ZkhOqXx3?cClEP5so}PPA>OjArdhDNox{`}E0K zqj~1^nw7;29JD>x4fMgpN8I0Sm!o67S06^@bQ5t#Mx2>U$S&7EK_8NiZI_EvA-8=@ z?vK$e5m&xPGGsrgH~f>`EPw@*vG+Sjmn{DgnSDUS?ik9P<*KA!;^euC}WBqPx z)~?-FpisZv4L>X>;78F4^RjHyZtIGTyRFN1bKSsox_`IT^vZ5)+;qQ|tbzdu&qG|( z&%^cPQ3q;lti%`*TBY3Je2RsabFUeKDIUcTfTvnNHUv?`T7Qt6kZ#Iamn?hQX1!iqBO%fL=7 zoxXjnoZF>Yj+gMHl+OsU^aKx>*J!tb!}=tG;<3n4s3;G)S>3#i%nCZGa<8QT?gcDOn{G@7Wg z<3aj>$(HI!jtWkOPf}0xMcu8U7i*aL3ennPVcv9OU0(4^qe>1ZBS) zqFL02r%B)G)}>?vl7v<@MD=J;_#k1=w~)LQ$a;fJhL_w4@Asft(>zT|;z7}t5>&aX z4lhu$KDxHd;F{|0g(q|0!8=71*==j3HAATzfJ%sX!pn~vp9{>LCF9Wjiv>1p-fp+z zks%zWr~avP)}pr7c1+ynx8qk4kDV-j+WLHJkugQE8 zlcUiyWb5d~NKH_u^dgRKL)RZNQ4`M5mra6Yi#ZEwOf`HMRoGQUNQ^{$5w{W{)<#vCl>&O2ttBpgH7HMrsc<&Ii@6uVUuMo0p4LxLoa{m;=;4B} zIkLw4l0!N8vIRCGSIqTM21a7}NPU~KgW$# zH;93HG|dQ%j0R}LGs9{-V1V?PXLZRmsUsX}53r~+_5L)eiV9pGTbI!>En(~{3pwKk zbQgC1;JQ!CSArr`&+GN>_x_-FYn?xa+y1E<8?3s$VXN+gXcE0i5^GXj<%hW@Pcnud zlsEgrz~P5ff-$TDW0)8Y!=J3cAeOmCEXf?_rqX%tZEDTgsA-v_eS8kTA>W`p&vm=D zJ=HSRxma^nE1LKY?$^2M$1?-D>dgia`=jdj)Rx-5mczUa3TWKykDZYI8tC5}zL}2Y ze^-Z+MJHhv$Q`~%Hfxc0;BE0>AW#1q*8(BQs=U>(alnf50S*nOV^r0JWdOZO`E+u6 z62BCcF^I#^QN-{;h!jDjEG?(a!dC}EiC-%eHY}6g> zxN?jY?ihUhKBx3=2TI>YW0Zb`i~H7(KDYGpfztPRrGKl^os{m^sPwC#$cTvwYF8&T z(15fYk3dxa1NzPUReYGiycH;vk?%c)a^lNEc{(t+(bF}M0F@mk3Km{1vYag*)5}tl zPj_Ut`1nQTR6Vt&vujZy17OgK-ERGNve^~WeU+Qx-tX@|12*dxf5(-9j;ToKN9OU3 zkv&p=!D9PK^p@_W526qqcpmfX8TuU(>u6u3DOKS*&j>pR_eK(ueJ zwQ7GKv1+?K%?Xy<%*ozu4m%Wk?j>LF9(o9wcnZ}b9Q3f}B-hoO&HU_=hZG#@kp1{i zEkd$r917yOi)3~OnoDqH4@W-7rWrKnm%UX zXHb$ofRf6a22j$e5rdK*;NoGIKS_21yVygq%Tjr-dsJ)~pEIq;b8&z5{m-F57@b6d zlqpSHL;gr?^IBly?k(VDO z1r5pTm?GRKkv^H{TJ2G0Lx1Ms&_BHL!zdw5Rd#iTK(xeo>~>i9fp2&3E8=w1ZWArp z@fZD>KY{vBM{?KjnvCHa)sx@tW+4ghETKW5UEDGs6Sr3{I*O;bA&K{u{O3T@)64j1B^)o>~IGtpK?bFJ3IlSHtBe4>Fadbpm+CP zT!CTcqZ5||tT-BE?cBU!1Ji_!48h0SN!{aX87ZAZ<`0P`EIiG7d%o{eJXX>k#{GDO zWUaH4;Su~O(GO&6+s}`Hd6UWvkN+iTkA6uBEb5${VQi#fWuV-iy^D<8Anf=%Ux|z! zY$*L2J%dred%-Zn*zMM~Adax3-f;hf%|C5};Mr9}h$?IlfNwihA_%NI{Appqa#dtl zsinjt0)$U-am&9qhz#MX34@3xrF?@?A54Wcu@fktQLw-#&Pt!42dJjoRzIi}XE`vj z##1x_dy7TXQ#0NF4K~C=-n%%F4dPZkQQ>^}(F;r5x4<)`mAnDjap$MhI(*dX*?8Dfno2gm(ZG_kUPM_%HW@b7@Zf;zN1=d22Ght5*M+~}zF z>#aCt$Bx^SM)%f*e;Jlg6R(4Y#HlawzRpZBvx#pzVXj&?T$<$pdEVpWD(tK9v5kk&3P58GdQXLpVbeTFc)R`XwX1ef=i0 zM|fjLdb`wMj_fGLLD$sjLJ<#0D(_j{?6+21KdY)aq)wXJSZ0p&s zGkkLXs0Fn4{GHtT;nsbnRy?S0u3xYIMus;OxIgvkNYA6wkQ^mXe1%8pw-|-_z2B9p zN0TKZ5|b5M3`QiR^;7RB2P0F|pdQgCq?|nlO+8cE#N-C8yYJ(*CanxOJ;}Z4KVhy# z#oV!f^qyC^vA_4PVfr$aP8RLF%s^;4_O&%2XQGI{P2<3S74WY$Izih<>QvZNI}W3` z8M`iw;zrXHx<#+K1COb>m^!x0eMlYS`Ziaq%!4ZY&IDwGnJ_6|7OP=!WP$r64fEgv z9%P``h4o+KO-OHkz#Fvq*ms!}l=86eh}&R7?B-}=I5s3c!LvhRwlNk(sG~US>h9R_ zh8V=ZWF~aD?eOh5bINH8N8?e8(7DJ*&`tcTAAcFvbd2Rg|thfFW9CfP>f{$k}L9?(|9RD zE*xMnS@g8WI#sYP?m{$L8n`Au8#}&ZMwQ(gE}?x^L8(Vn54pM#Ho9SZSN+d zbR@nB-6sk>+O1v()Tam)1q4uPyin!MIJE3OG5<(H!S2@m3g7V_dGlLz*;E5&w{cl> zg4T5LxB6#$XM9X4yWQ7}%hQ#bde{X5N&O2iwA;G3Qy78EU5z%%6a)tm1Jz7I>M7Wi zDLCD~uxh8>2CoezP((7?os+O2v#UbzV(23icdXlI)To(pp1wWrInrZPGw$JYP{qGz zR6|DGx0jn4AAZX;^(I-=w3M3jjGW4L2u-{_L>#~P$UF!Xt%jEX=67&$??lUwiwA}%84Tf6WIeS5=>@7qtP7HekrLJ8 zpkev#LK0L-{ z4gM}&=EiyazNh$hOG$sdqX9lB$lPyefScFz`7~s*JeLc4j}^YUU~k20C5fX z(5n|GQSni#_=g6r*{SaJKV#ki+(7H%x`GvTBhc-+Akew>nZrpQupX9=O*Uc!$@XfU z=|R;mou+XApV@) z8D#APVGf1UX)TFK>kPkw^MT#gr$VtK!^!cuTWv<3!4;6m)R}$=cV>I|dA%m0D>gQQ zTNrFTsn(V!2rzDeYs_2b9>Q@3JqVUL8C(gI z=yQu1L8dH{Sf+jgHbX~&sn8*&I}5fm1tjswcGyP{1--^ig3Ce z|GI3QPJ{Js?;8zAbwzN)^eHsYrd!IGzVa!CliCjSt{X<~1J~Pa`;QpdZA+@nZaeN| zU%?G0U+#W|d9w}`Q3~Y715$y_-2DpVLiAQ~jGgEsBT$5AV!8r^#n}Ivf^o{xvo}jNG#nzzB z0E+tDZ$V6Ca3U&5cd60o=e0kqx_xFL+`Dj~a9o3^jlqb0y3748L?iR70k5n_pPeeN=ZOwUs1NfGYF zzvn^1l3!`W85P0(Np?GgD~}jsbm+nls>F82MrDh3>Wy|tz+b=b?N!+#i?_`eN}Oosklz}Vwd9rd&V?WL{!z&66>P<+=p zLL&K?nEy2vX0dVf5}3?mI_!iO3quBk@Do1waQHaFV5$`c6K9#CiJM9*6b3VwALyMB zQl7pPzua0A0nm+I0v1ghH7!&Ps8^whVY}LlwlR>U?^Jd+SRqC zW!CclP-z+I;Etbq6|8-vRYFWII;~mgps#Q-nzwFMdfbBRg>g zkEpoOj(uXyRtuc!&vr-*=xQI8v&mlTj@Z*g<8?nP3ZiHrxHl zCSj~T_n%zT_!SQv!RN{Ayo33cVz12YTH(!jC|$)?F{~#?&%jHw>hHr=YyF3?)m{hA zr2~6S z3ESV`;K{zer7#l5ONEF+{$%9==I>EVTe5i7SLLicmTJ-sXHY9$SRLe-7Y7Ib>LrO$uxWN4~V$vEhJ+D(gAOoEB^1w#jCt&V%1ou1S8UVMG zYv97NXtFsZ4dgqx!f1s?^tVPv&ME0cgtv)dH_5;3j+@HV9CD!RY$maZer8=k&#_F^JRo0lr%oMuuTm>KCyp$hwM6v5%;)MqJR5bb6PWqv`boB=L9i}5qya&kCyp51a zgV@(bZI4Fx7g`)RxYYaAyfERe&DPD`&DQL$-PXJ=oLuI0)kc$%?W9Jw7Om%4ndpSB zPprA)edMrsquGjWZLYPpeA-+G19V!Q^~{!tue)JFcLSk%sdo#b&hMk;ADV5?siFn3 zlk1X~X6q*GuXDC!UgqOX`gk*HIcw=7bU5nUifa%q5Iup+gHd?ay*m23kW3+wys(oBk$+B=J4;1D`>8>p4}Rbe`1B(Fl6~S#qgQ+b-r!k&emp< zMq9Uxie&4n!kyXrjuGQ(J8H*~#aS+ijV{$I&BR^cK(Plsu6kl5! z;_#7reBXEv^Eg|9eyy5vYh3*tp|sfw*?s4C+QAf#I8%uQq%8WVQKT~+!@02i-Y^C( zRVR(2&HuBi@c_yMXFxVhGz;~Gzh~5R0M*M6091)(TPd60EZcSed7H(?&@sCphSe|% z?!*b21y8vbKCBv~a*zijuPR`*+{2!w$GPq6R&M48jKd1-!3re)7gTwMPgJX-K|bzH z{%}W#iV8~`2RMp~3WEW+aq%$V+i_Y?7TUQoM7_g$e2tz%>4%?g3jgy0z6Z@$KsqnF zTO?o3*;S(X%xh41|4wj7{Ji0@5<{-UJy-$iQ6em4YKbMuqIajMn&O$rW3GL_aB40G z%Or_}(c~0Tj6ii}aAeY(Bus0tYPLo8zBxTP;%L(6l2;_4b3?^o;|4!(YvU<{-#Aczed1L%E}E zDg=7Ls58tD z3Z6B82Vuu2569cBcOsQPq$bVWH9?BYIb?#7kNcsfxs} z!Sgj=MBc4%4v~1N)&GnVmR|(rTgIIbyiqz6w^q{ofZwu>6`2lmPEN`#;<0hI6>fRm zLmV=+{!Cp1f4O$@Kg#H}tPLl>os*$U#{eFF(R6~zHWdh{dK7a!T241lO;W9!sstirC$|F0i^6>Wj(b45To&?+rFF3%# zwDpvmPB~D&RenJL`l-h5_=g%_1jfMiPIF>oUuNk+d(A-_INJ=>t)y8|F0~3-Xhkas za-1vJYM{wDeBj#yj)(D=RF9gOg%4zVva!#CySglM7uq4>v3*W-6C0AFW zd$F2@*`uyaQt#DG@ajMXo$H&DktB^Wce(G|K>SK?hyMGf2^{vZj&{kBj5s{>~b{O*gQSFG+{ z)MzJ;)fOq=7%A_P!^{I{{kBEQ`x>fKIzut+UmtEIJy(TYP6iQl5=yA=!_Q)yjA2nk z4`LY6@Vl>kQ*$^dj6&HdQtxpPz!se$0(8>tAS;vpF(rp~?KX`VL;2vYr4~)icWqt1 zYfz3MUBl)|*G|fHEs`7$Lp(;j@o@EM(&zOkIc7iI8J_RUVJaiZlQAQy}7mngT7Wj+~0rv z@7sRBe4Q-*Bh~YXsw{HkY_~bV! zU+&vb!VmCR!IEJ;WJ?+1E!Osdgv18tg`A31K}&a_-179Jt0d(W#E8`Db58^(8>O29 zQ_+*juBg*r;@Q3WkzLlx-$>h9kwX!N3eHteH_|wz#UVr{n*5knyJT)uDiE{}v3&A_ zD(X0rFKs$nzgTFYY*0?x2HlNWHpoWv(- zVV(I@aeD5t_aZ;Ha>`EZi*l2*d)v)hq2{RbOzB3hp{ISBKxoA?=0!B&J&YvAltxfP z`Q4-NM^yKk3{J6=zbKWIQ@i5Yl2Cg#cUW-Z+_zX@`Rb!rd^K&DjAZfV31a!Zk$Bn; zEz}jqYZcB5KVMJ~WPtk+D(Bq<7?gIXPYEyMO_a|%O&_sm;Fsh+Hky-!s}YwUv2k)Sj>kwJ|g&n&iRYW7Y!Eh507vi zjSQbk+8F_h)CIaj+`9=qAga7F-G!)Eko7H9T+(0hGf-Yzr!UTi=oOW~xT0CooQd|7 zU$0j2%i>TZz^9e3+-1Mg2WfW!S1(YCxu^hW*lGwTW~)sqvX)-s?F~UYd&6pnT(RhA zCf$#aUDK$u`Q{EOB2BOrYD4WPQ#=dYqx^t2G&VS{`vhSd=uyy>l1jJzG1Zf(XPna^ zpX(YXaFohN)nuN$dF^MFA@+7;Mo$~ES^9_ZEY#ess3g#bpb7yhD@aF4uAJV;gjbdA zI`!AW27FM<-&F>ivWAJ*0(VSb?2_c%?1Tf($C;NR@lSoyH*DFA-r;!bnav_S6E@^k zByZF$ebZXHk}-RZOqt=5T74TMMq9!;RTI{k8q?pDK56gUk<@#I=O?07`)o2B>9Z*a z$W^X#8@2LF(sIQVYaEa41oox#9Tm;5#K}KLtDf!WFHb*TT*N+nzG0+L&MWF%PnwK3Oeg3= zfIh$#AZx?FK5F{sh3x@1RUsoWeuIk_ZhqH1t+upv2&&z-8(oHS3zjL%3a|=WHZpbU zl9`CXxLsz+P`|Wh+k9-<{p(S@i`~~rP{V6ZpUZ`TOV^`b+c~v6DXn8k$ zpaO)Wi7DHe>!`CK{W6woX$4I1#h&irO2r--jZ?z9piHQ~mUnr`vwkT-*4*90rBE2x zvYQ=R^!Tur33hy^I0>Vr{%56GlP{uD_6}dp+^jVzD&+yveVv}4z#O@+@jOTO(WXGh z#vq8Ihj;!)W8?&u^r#>alRwN=tv+&N49^Q@5u39gSBd~ zRG(kvb!3|NJf`Pg*7Ngo)f$Qd=-}S8eI#T+oC4v}E@#SZT;P`rM*M{)bVr^pOp1Ui zPlu7-1Ak(47~)}_es7cc-c;Pp#Vu4LdFzz>>QcU7$VCGALfKA`1H5%RW=kT5sNi(|QJBDpC8Stdw`um`D z_=<*kH7wqMjW?R8B;+N$XYH_-g+`0;68C|Y`bYxGZkyyT>_k)*;&2tuL1;g<7~*8k zpqj|Sb8=VFJ*S&h`Xv|7D)=b?XM*S$-(3+>+*2K{ktGU_uiO|N-PJO-a?gO=&2SUL zANR*fsqZM(@C-IjB>uM#HMG-P{+2x~y?`Mb&NH)|_S#V{0Y}Axijy_2gxX6M9pgbu zot~RzUFbc31{IY%RhuBMl>vuCG9UL_?I@-S9uHVc|A%YdbZKNfo$p8Y$q8gK;*wGT za)&}Faa`s4Jw5(d!=9c%OVgeny3D4gul;0BYyr9YJ#b;4jFMs1HJeK3L#=@I!rIcG6M$!1xJ!D1vV|o3Zda6u=3rXZ0xh z@%wV?P*1q~oMrH}d~r|DNYd@F3^TOF2Q34`pKRu79ZY|%hELGU;4%wtBHIrE8e8#F z7$}0oll`0tyO*Rw6Rf9F()NDIKqN_Z$Twru&{77aBhPzkOZ{Lg=2g`CnZv_Zc~hLw z6q}uO)b-j;*!{f$GFO5#Lo|({TU4z|o8u&{Faai}tAGKA)QCgWknVvftH1or9A?fO z#EM#swcgok4g`nCl|GPd$&v2EFj15dFQ$0{=MDhm4;UV<<@rt>{o*?cTBWz?#3F+?k5>3KehBwK>g3BO@J?+H6w!maOl-asdy$_N~fp1dmD^hB9^ zEo*8T*j9^1>?8aS(mT{4**nFXqAj^bMskzK{mIe-y^A*=kyAsD>}S=+wU@5Y021}6 zFWQZCfl`bU?%PZMo9EJ*ar*;P#FHd!XW7HKpGFpOmOZY5W$mSUY?YfxU;Pwg$j??? z_-U@?_48J%FKhJ6-SgjuMaIZr6qEJ-2=RuiJ9+iVqmlSyUED~r9BJKK$J{j}A8X}7 z)Opk!PNIf$Z(gw4|44nf3Q6ALBNZ`XEhqa0qt4Yql5&=z2<8@XftW-HlBVo;=aD8d zK^(Q=4wEap^jR`DQ!K&px8eLS8H2QQSqPNEGW3)E3DNRclF7+wUWKIhIYjjH@W}#p&on5C~QJBq+cKYke;dB z7gP>jVUF9xGn1HKOd|>~geZ3=&mt_dU*{DvH_XZ|_tD6~EYmd>L6Kjtmr2Ey{8<$p z9>m<~Xp|*$?D%;FEe+xlbCUaC)ob?Etj~ChDj%Hn0eCr zYJsq4DqBjn_(_&ow9ZCFD!lZ^xGXU4w@(93d zjZfy4q@!RV_sp{nWYaIRzsc$ww3GLFtBqdr(Zy=F-CK!!%u2{ZqLoGmJS3uTXdtMd zpn?IyU{U?e|07F*w^iyoAn{P)cK7wSs2+`VqCW9# z3Q$1d6aG>BZ|6Cmn7q+rj&r4;vJ+z_g8nD^-89|AoI1{EGnh%-#4DHQ+{A;1h~WgH z$>l!1m`~vrpJuL%BfKW#@vB6>@-t=tz{~jes{5_mG*6ryyi>u^CoweqUvWolDReJo zXo`Y1Dhi^<2Bzf~2lz-!xak&;l*+T#%Why2C~t9Ia&N-P%Vdez^P0cM|B_fDQrjW% z$)IW?_S5Ikn)}qPIl*8>Q*CI)oI0hS%MAOUVP0AH2+FXGN|-p~F1-GB=D!}Ay&11! z#hExSv6Ak||78+I{?;dYWi3qtrgm~+AU+v4s~&?4ISt|>zuWb*Jmkl359kCXVI&QW z>wkWaYoaD3@PH|vW&s+NTpeN~T-``JJQBrUThqh} zE}WgX5xi^U}@$QEEHPc8ReYNrt>vA8$!Ycb#Vj3vy zq7wK0f2vn&TW=2(tkRwcKdTL5Nb&F+OVnSN6hG*#lq902%D}r70q=sbFg3VUrfs^V z%#;N6{>G=UUg99YeYYdf-(Epq`RpLV{(Q}lvyikq%4kH%)9!T`<8WGHX}4D$ z%#v~N3@QeOO|Nt5BdPVpKSWTmvgT-}$&zL1}pji2I67&1}H8ySv~n!Ka~(;BsQ ziaXDOuHMz*H+-&xksXD%;*(0O&pjJs{GJ# z0pcO?!xD&=o@luA2e_;`Tsx!v8-m-S7f%4|C5zAExw{fAhsfzyI!qish*Pm2<&@5O z6dZAmsbm5dw|$nu1oxkm!vyY6cpyQ+Ug0~qj+&>{`$(MH6(trS;?slkd0;0-5PpeR zPgDmgDC}CO5+e>auEGZ}pG8bwL~M5#@}_XtSlSu$#sOoQ!eQS_G>;%SkZAr3vZmz| z%@55ozujb+Cy7=r$NZbZDLAyX+St;9#`iAe*4@{SVt8HQy*8c;SXOtrmKpml_t;!9 z4xI34P{Q{c-?Eh(fyMUCAb61;8me^bTRePov`P6$R{jva+??^#T2;WIB@^fQW3Q3q z#n2yv@}OAH1H348(c(+!DL#@(Lg?}6@@Kny7vx~2aFo$$kbKlQH9~jRc@L9CACl&r zsk`}XmgP*X^PjHpmZj`pN_&B!SEyu-O8!PA`$_ES-q6j^(whJ=Gktj1_qXPKf1mU| zWAy!3uM{2V7h{;>SAnb#s#!#6F?3g1xQqX;-!G!`l=)Yu%LQR0*2iu|#SyZX+d=n4 z8O0NKu^&d^gFPPdfivPiNtHKD8^>ySKht0*FYvn;KPQ|74UTdOvFa8By560nelz7r zbZ{M8pt>-B@QI|5tjrJ0xzs~84zcZYkkG+tk zxq8eBk`{8j0K_KOEwr`j+1QpdD&I7Yil~o#F?<=Yn4rM?GaZu7Mi9q98%=sQ@%dyMqeVU=%Ynu!LI>Dy|TIDy{Bc91hsSAWsV>XYyrWWvdI@***n zRc_9}%>@h03lq(ae;l7S1sW3bh(wZn4bs5w87tk!_GXx$X*<7 zMmBk5e#GsUc_XOulEMN}5KF+-@IqDT%|IW$e|=Ca!*5{s;Yg>MOKs`do;vLc?JDi> zoo0VOYd+BaHeO-`b9nS5Elgp5Z708Wy*RgH>cBR zNIqj%mG6OZuz0EUHc4S98<@$-M8>fdIeQfLz=$h_?K~Hh{RWZ`Q($aL?j?s~j#KJU zD0omtrKqzwz#uR@JxaxFyVdh}>7GhCKI$(t4-RHtNppO55Qb%TS%Jxbhc_l?x?ERP zfIH}QA*844Y-*U=2%`ghPHiH$*PNVKJC({2z%ZPh%bg_cXSD3tQ6!ca<6C%DkXyE& zJLxbsFWk@^E&4p!@)j4^)xFm8Ylo|go5+V9b+)5?E{yuTh$OqZ&x#+^=h>7*a8+uR z-Ba47>o^-JpKg=eGy6j34{kktu{Y!=OnqyyJloGwQvbC!IR9u}G8+ExI8Cgy7;?v` za({#XqE3Z)bjoVQispJP#@wAqXo=q1`T|UFO(}d_d|#op>>V@xn@nO*WH{5aOS_`D z?1v~Y(rWLeD)tQ_I8+oH%iN4nApvA29ld_D>YtXJG;X!t!zX|8=rpH&oPOY?GA;h- zII;BHcV~XB=&7Us&G;F+WYRg&>h0FDpX&?e&%{IA!ay6Gcjag7IqOBS^*gv8r`-)? za@Vjb1W8NhP;j-MPZg0{e-S?zTRve-QdKheCc7G&?V_35pLYK_Rdmt4>>=jJa9R|V zXN0x1j0(hRHpz(^7B^aYikX?r1h?cQEWXZ*X>c>`VM<7+)pCD14Tg!{Khj$IYljt7lU|4Zw8Kyngk}xSGXQpuNI9BPr8x)aAN>w z4O0=Fso)gBpr=o{y`pk`$29T0Ar2?8o8yl>$VYq?e^{6JBSPi_%As*_Zw(*m(&LWA zI{rqTA8zDQ>m;^vNw@RIfDqFy=6&C)X2SEpWq$X$<(3xWMY6e>Grw|gRod

T?^!JTuso$uXZ^+%m&I~}Hj+&6N+(scGg?FLdcJj_McRl3F>?$Tv#>kGO>oyXU4 zQ60>3hqgl0>C{%xqcR?C&)v`F-sRpJ*ZNQIvQuwN7~Y&AaEe4VaoGH^gB)-i$puqn zxeb8B(xa5#U*1iS`SH=57A4`Gr%^IQZ@zj}U4G*KD7{#L&M<$hPg3)ch9W)B%x z!s3;f%vPbs3isuG z9y8Fdd(XMJ88_&GUGAI);9jkqtIimUg5{IsQUeI?%J8VcInz% zZ%fq^Z>}onU8ZF`mwz4i{*}M9_XjQoj)|yn9{7{@>|H(Uxc5E&O6-vCsb3r!t%ru| zQ|u-jQ4lN1YRP9NT-lp<_f2_)E8#9O{Hoa88?T>x>VlX}uANn}Q*W8O;Kpmo$U0>d z!wz_o-A*IkAWY$@TAT*}?B)vgO{MQgCFFVRvOkan5NBpIxubU&?zt{8wW@b&6*Hwg zX}JC;rZyUsYz3x<6sQs;^#q)%JkuVM_(K+I#iRrYSpmU`Sd#FD_HzLgwFtY+_lsQC z)KRH>`~@(MB4+(5YTX(FQDNM%a_55K;rlpqj=36`6BvS^`x8g7hGVhOM#^^^z?SuO zo&nA2i`}~@v8I*J`|H{^k^>TblpCw@AXadq*wLm)sLrNi-B-?i#Yw^e0V-->$R1Cy%8Nr-8ZOqe^r$Ax{lQZlCsvdWCVw zASLIa((USh@sHHUCrgEq#Ca}n4jQ&;5~!Hz0L|i_msqLScJ&r3ev2wey*J7pzRG<6 zhh}e#*b&6sehkboE_ZW>T3;gO8?JbUY55tW@t3b(0VCo60{4|`0DQ6W-=GBSxzrEV z(o%ke*Vfmg&iR&jD0ftk7L2r(icL*=CIeJ1Xt9BCpZoO{s5Uo2QcfA2GKd7txCl(R zx4ufvgq>NF!p_ZndPONmL+cTJM0k{&O$~M9deF?NZg|7NQwTf2yN{rzO;)X#*&D2&)m+|Y_#&N zpMUae>fmbJo*Vgsylz+L=BJtlm0zvNPS_BWdyH44dLRsCJ55l(`avm!X#|GG?5PKT zlFgE4`plDWGwG(!)ivCDN9h8E1Ji7n-p(O$7!x)}vAR(G3j&GAJY~+hcntjJ=DoW( zx9A)xPJ{0Aq})JDDOaZjMo|pgEv^`MPjN8KJj*wH91WWa>uBMoI<0bm`b>M3o5Oo| zDq#?@tl;T)+-E3kxNtExo{_56Ot(He6c~`6luRQez-wHT4P*&aUF8TTk-a-*+#^jxbzg*xib}p_$G0dE7*a1xru0MtFt6qg({lBzWMS#E zlNSZUt6Hg_Bwg4ta1BRY@0D=wGlo{VPIgg1kSWf%v(F>jV{FoP&hRd2ACf0xpLDMFfow3WFgb#+Ip zN!6rZq_cR{3p`LFj^4~R%~JeUOy`A(@F|(IfY`OW!`3Xe2tY|z@+;TzsCT#Z_0(?L zI;D%~ZF_KDf&2Vl4&I0b2Almdm0T8{J zbG4@Kf0$_?wImZ`dinArNB1T!dTnG5$BeoOhzZbatVNvwfnyyJ`|9Y5jiZVv@e z;2X%83S*x}XGET6RTGi?$)dr6Y(Kv*67m;(+@@~yWgb_fQn_+9)36}9S3 zn3Ui1X)*@;m{9o#ALgmRJAl4zC8Q$kbi;a8Z?)QG7>Onq`=UPMx%Y{3`Axi}B({UF zGrlx%N7#TBp8}!Br1~H=iFGciOW1%Zp%P?KsdHWm6D>f>w6;%MDR9f9M&dJ>vlHV9 z@|sd2XQ$LhL>S)?3|FshsjPD{b>*ML%4?msH+>u~|FkA~#_8;@h+&7IB-!YM_4epp z(%+q5(vr#)QM*A8={jE4;^h;{HD)b8C@o9*0YkgV;z|eVs{au?orGcY56Li^J9EUCnRfPw%-%P$tk_!Gze8vGaSnWp1aTe0N)D#a3sLoo zn&Ze8t7RcW`W+7GvrGBR{@l+p#B#D)0@6DTND}o#sUE}{+r-$E$w4cr@l&BQGnhnf^(39pEi&UddO z{S%vl6NO3fdbF*OUK#kU)KY7B%5YpZb@|FTz|_Lqq9x< z-K){K%NmObf4Xyq8_B*Hb>^}ZN|pH}F+bi6huS}kO*VKesmWO>kc=i;ALgRK6SQY$ zbqHpS9XmZS{*Z>m_Xelp`zpM;+r{ zxS7yF5ED8ZIe%9X9NWM(r1?er5uqayaND@vf>UhG{3j&H|G>c@~mK290C=o zJtTDVTMK;@SLuA!H){p-z;?gfjj@T5ZSIVJK`6f=(k?Kj?SR|4g ze4^t~;-C6kK48K^k$CsMuvo`GWQtSo;BLL1b8%uvPOF~eZ%9V`Bn*QnmXND3twehI zaVS4L43w@0*611ZYaSt0CUnw0%j+1yw}w63yDj2HfKN}3@o^vzM{hs_0}Y_03#$J= z_TD@`sv_$j?%PY!+318d$ac}7K}g6(Hns%P&t@*$&{v8E@VPgQh?81Q&4c`eNlv0Z;q_Q8KC>ILh(X8pITda z^>*}}a~Q$dHgd*h=^8hy@5P-6&hXjUP!Qp3#BD zQ+RX~Vr(QjqD`te59T79RC$z+?oF!wKn~mwn^gN@ld84r)+S^}D7kSMZBm^H&XnxCW!`)}Q#9V*Cfp%Ltm zS*k5GVlcqLmgEOXjd895==lGf1$>Jmw7v9h+SCF}*?fP_#s^vdB;`Z2eaGT^-U1Im zNP^cyvIg;bsjV!NygN`C(7tilF?5l`vWMWszdDk=Drh+LbuM!;76BHBdz1 z#7D+Rzf@j^&dEj_KLE7y5k6?;9ys^D3@%AKQ(?4)BlqbFhWb2Lf81|@u75u^Li z@>zMfwGw=wT`9SmGCHmN_$%r_=aqTnLZV_IL&74E+c60N{Rt^!9O#IMErH!6O()#| zD<3Nx$QuI%+cJC&G)mAvlf{8@?}8su=1oC#*p9kSq*nPG<19kJMma>L=v=Whg5@do z+q$~IX2zpcW0n2*pwekJpj>(z{{R!$C~Gl5(79u63}M&FBoY#JE9bGwPqlgcG{q){ z=DGHqm?3DfQWlA_&MV>6ZT`6)Xl6|nal-&M9e)VUzBnq#IgOf%pEN`ZF=!7u!uPN5 zlg5GVx8KK;9E78kvDgtNNC}wKW8p-z&qcY+<^B&V%s(B|d!GBZ*_3<4Jf1}Xm5RBW zM)_$f0e)JUX-4D35uZaB8`M;euX~9R`XYA2rb}5goh6T^_c?e+nRg=(n5#g$r3CXr z`%~yLyd!ij3q7x#LjI;O(s2_R(5$T!F0y?*jMaZCLDE1iupKd}^`oz6#op5azbvRI zkXbPzDfd&j&+s@E@>{(7SCXS}sL)QM3#;2u5g4#Rq9Y!5=~v>jK(Qf=>bI81>05EY zG&~gRVZ`dK|M)v!4;T6mvo7OS0IG01MOop&>CoW<{GK zwWcT>7D&W~$On{qk+bDs`~6>GGqun-DWf1e0EEG;GMJka^rU=P-X7lb!`dSa1S_m{ za{Ws*>0j8{+e~Q_XhI97ubR-B#y%s{XTzs%7|*%)wE-{*mZ3E7Sw}2}$ln#6?WRj* zT_iaeSrD!@y5ER_!1P>W%*Tk5y=806-{6v1QA7kxyr>Km+cG^=+B_S#l7ozQ$7Hb{ za$0%jZ{QN%RE#V}D{kH~ZSo*(rLh18kjr2kWASch1-B1F8CXXh338$2O?t!{m<{Mo zE7x@3bUkQXgG?Jh7^Esz3ownHDdQiz%AukI9q%c{93SdPb}7|%7~vT{e-ru9VVxc< z<<2yk8ec@Kv3j*1pf?niN09m&W84@k_8tLr5DCvbXu@4$kyyct%tHx{F>O@v*sU?0 z%!SD$OSC&?7Y#7jeAotf_wGPq7}kRIloMsY#xBTfWQ?7!0L)^_ly|HsmGqTVxtE{9 z*xHH->mlK>8y>lWjk1|DwTo5oQ);IK6pg`BW4iSPgtVU_jfaYGGzVdhGJYHDIu>sb zjE$ik#Hfh9NK_G$D=3#Na(k_c-Fk8mdK^loARERWLJX-;CF=5@kU^hmI;-WZZx!qqN2Ip$JqFY6%Xfdinm9^lX*O|1`$7oGK0b>H?j%9 z?7kM&*@aJ`7{EYE4NaAlS!K5}^$-=^C>jC^Bg&Et3=HkJ3iU`jYE({olF3N9136?P zKIMeZbM(2TG3Haao4EptK0o81eA01u%;)&DqN~!VHAU!j z@lRbl7CM9l#1^2oAXOgjQYB?92BBaVwDET{ot^u8$rYunxrzc%HXz3i7sK-;q1!wP ztnI=|TxqWyf+ zq_d$#U#Y#u6a`VBF=j3Ts4ebAG8#IFOo-sN;k&G%H0md=?4!^qeH5jjn3#)1;Ubd* zK+<3$HY07oZZ0$tpaR>d~t+Y?AvU zD-b)&65E2QYRX)8BnkA!*li3L)kfRvMgeCY+^azY?xT0*hU?g@h#B7NamzNC>0ScH zik%k_FFAWW^B^dxJR23)Aam4e2V&4CjAd9SBHFa#n}~-x74>}jjuhX~BAi?br_Ms* zlnxSFE_zff3)&t-{lkhDqP|Rv*|oWdm(D&w`v}ZMXUoDjvSE~rU<*EBV)0;%4KEZx zluq#F@p#0s=yM@HLFoilHYmS(w%sH!8>xM{uF5z|RT|?KZeTI+EWVa|hlj+Z}Kj*gNsU=qUj&rpT=^ zQ{low1YCo^U<(Fbtf=83xGeDz@&GC{0$)ak8s4P{MT9CVnxF7V?bws=BcCRCvpNy~ zqB-waxXk|JOi#YDLHDNGIG7^5B_OX(^z1P3$vV zYx7*$Zp8>nJ=g+tDEn`Ox&xHgh6uQi&-C0@CZU+&^*4Bt?xKh!6l(u6&uru7>7hBB zr$a)4meVhx4ETT~l&QGI1QJS@&V>miUy4C}VXQ!uplLrUM%g@k{htd979DM1g2Zs= zNn+sJc?UW33PXt(f)fK)!UX-2f6a2-^tPA^c&4(~!IiUKo-ooNLm>5PUNWznirPuG9d8 zGEfVEqv7Ou+Q|T6Hyc2afHJ(ACBQChYKGU)-ZoF=ZZigPs#%Vw@(0YW_S3w(9PRy* z#d8fdcTIoW=9&GW%`+d?R@a=ecK?DE$msLH>-OSYP0M z^K_F{jIiab#7`6(*83_8(0K}JM@1XP%}Qx8bqjO{vP2^zv!Ce}=n|F$bc?K(EV7vw za!f<95p-QVP}5LMlR`Q z8OcOlg05UdA(q6V@FOF-qp|^pFMLqjXNc&;JVlNeZowz%bobqidD=1ngQ+nY$ar3Z zXl&&ILpbbhmG9Q_5j=}vMMF}*q7j_vTw|Gnd8Wp6(*afyApoL+ZVChCu*mo(USI(S zX7rbFHw#~zMD=vDkP|f4=0eBt29?%(oF&T=nuxQsG~TilcXLs3!}kQQX;U>KRmPIo zp##(pOSz^o;32tMyaheh28Y_!~iF$?LXyRxVV z!-8mEr5<7sPq>W|l9>+VC{p9p5(glW2wV{?GXY#u)+lFYap`LZG6g27TPY`n-y!bT z1Se<9?wI3fifs3{lA8D!c`W7wxP(6HG0Fp2y3591iFYg4F$|1$ zpqvI75EU3h{+2*w2BqB~GFJn5A{^H}oe zl>mcp0bZM!Z&5>0xyG}uDra+TZEMyV_(?gN%Uyn=J)q3pL<|#XuuVc|2O3->D45=q zx1XbN2b>EZ)E9`8&=GU+qE`#nF@eJC>12!HuxbM;C?eXumR#gl1lJWo`O%v)Q{-1p z!RSU%NtZRmzyK9v39)q=*0Y$qJ!USsQ8`A;yluw*rYI=)aDyuy?$v%8T2+hx+$0U< zCfYgiEl}rT<<0Q~$K8zZ_pos3V0$nWBp^DA7gkl&TV8XJ&07n`T$0hpa`^*t@ebst zL1Ugkdr6i0LRWv~GpzRz0@@IQD5iFloe2c{VeldTvV z7~~!n>3^^l9H?u;2W6)4NSNioI*U+1I43w5;nGx^DhA?X!&Jt0=D!w)sd1LYMBYeL zb|&f(&<_)6HjJWJO316V(A2^-td>q6U8k)ZPE2|oZHK|>7-x@Gb`@BTDHh-4O_*(J zFb{=pDB~=SzBmg#2I}33gB@w!RZd#To6N{N$MYbgJ1Rrv8$^6!DnYEQy6)$AQAUgD z=Kc&w00ct^Xy-YbqRw~|a^^L!@43L_AIx6oZc@*=!m^Hnvw>2x=4qRb&kLmy+Q+IwJwW zMp=MGID&MJJ8v-~1c+9gkGYoyLE_u1s;N2$z_&?-hOyh?yEYOW&F1;`%!8Do4LMpo z8wm&a+6l+Ak*YyqL?{TmgMETF@xDU@o#R0i-{!fW>d9JuBWL|gu-M3wBO8WF&&DH& z)Uxq7ev#>&ZE$R!M-=*MxW5w)E3%1P&qkI#BYn?CN?z7*KjDr=p%+AnBnP=u+4v+; z2pP$0tQ|a7Ivf%)wvijPF%}N;%7R0&E#y`jmjIqTyuzn|h4}Ur(I=4GW1>NYQ5{g2 z2H2%fR$I?Tqxhs+5M<(W2mhqG3q@vC^{`E=03jB>gmD7cvvEAW@IjUEY)rrhU8HUG z6hbs!8Oexs4*^8O1-Ufkfr}WpnuLySwEFa~k=_T!vCuoAXYN8U5dzb~*nBCkBQ_?0 zpoQ%*JMc=o(VX+VCJ(Ln4HC0V{ybv+*L3FNsZRa1<6DlPLSe?pGST_W>(vk2` z3p*}IX10vdm|9cgAS5TQT0Yl1S%!xEgCCH?3ri7Q+|ZyZ>$bCry2ZEg5VFOtXKM7U zZ(C@eakI@EtGtXVvr&npOyyNV00}Gau{9Nv>`k}4aUOQM8WhOY6CYtooJwicyhasc z2hRHp2R_3)H5EIu$g^CgYeI0eN&=Z&+C0C?LO?l)cP+Z`atO6AxRIExDt%2FkpyH< zGVUq@fG$I7mYZ?xA>Xh>`YP=*9Nm+v0>ZA6m7eWj@*3@RG5;jTRvwTcAbA zfO{Mv62hY@wVWG^LWP;h8h-^#bR67x+^HOS$XzSa-sSHC=`Qu zGtoW!W-B@!8bUT((W(6h5Qcq-$XVGw1`$aliDoIeexp(kr4+;wUi(Qgh=Q%+n3_hm z?>mKTd=Y>CE6d^|IF$+4DDk~>!Fn;r7;?ataU#HPFQZHr8QTw@qYN}VhMi2TosPxvh&aSWmFB`xnh9Q?;Vm>v zH!2tk!qnv07llB?{|Jt98{%)-9anMg?Z;1~ZE(m+i|v)5 z{wCT->|9Qp^hqq)M60?!T$t&*g*c~@1Ha|588`?%r2Bkz@?YEL?b;AMhN5fC&5QVR*Nd%?`rr_x$9H!81khBKw#!k-(*>0Si z=EU*-X~d6-XU1V+7Hp8Ig5Ji4Y~0p@Lua~znVk`ZF$?fcWe>tSOd!}tA0{p_iqc|! ze4|lA8!t~Q4?%~5WIe#6i|Kyn2kR2h58I8;cFfD{EUGuKFyRc(Zb-)tXDe+&#f<2d zov5v1!rXuv?2+}DdtJ1+kf;&rsE$}*>kvZ;_K8EgfHfO_t6k1mP@C+_8|Q zq&z|>623Ug6Nmm6Samb=dYku8%p5K}U3YG$6eY4TP+vS8PMHw$yKfm)>ndBV(r z5jJcpY_O>yY%e1tu3UJ4p!yl-cx*=WT5dl9eQrN?sPSxnobY~gJmK9jurUl47HWJ; z1MGM)E--V8juF_!IGT16yP#P|Mp(Txc02`-NasL)L)_`}B$s!h-qd*rATsjkcm&6F zGZyQE{V9z+hE(dh)CGY?>VmkOA!dTofbIM=6yY=_Tx8G9`;Y|p5Zhw1*tTX&g!r~* z6WK1{j>U9ZvpY)nHCPZcp<@VhES?ODXAOD{a>ZWnNQ@6jnAdFsU=}(Xsi8SCdzaLX zBO+-0apGoxCU%bCFSN)VAjzIBQp-rRM~kGuR^Y$XBAZe6KhYwE*u!y=7NOb@wpfce zQq&fS6>29RuC(QybxJC)pP804Md#EB1X8sMZ^zA z6T=bPzBioOg#!7(kKom`tR6WVtFrTDQ{*)Xw9_@gGJ=s-<;i=)}G7#(5J(?37$D?aZ4c;~PRB&Yv%hkx>jJs1uN3axrS$MX^1txF;kS z|MMd8vq;8I;ROYP|I~tan_`1Zu>c_!pu_^CD8!6fB%7je>Uk8T*K;uAqRNO-0Q7n) zwjoo8<3f8^$`rL231J}@Wko`mL-TVRuZQfwZ8$EG1%kRaB_O9RXTKNit1WY0NVbywz`v?GnCF*Yu(&1!C%}4F-8sm5{)Uf+N&;S%# zd<%&#uE9SDWh@A0tX6D0B)a&9a08W&vL4c=&HE(LG_5GtTD(sZ;%vUPgt*y=M+Q#i zs|a!I$RQx^y;}Mj#qUFdl`>Q!4Q-vXec@Qcz~x5yu}B#!QpU5CKn=8WGRhou1r?25 z7@8N62~gu*09pF9@;`tBHJ|wN)JY&y-{M=lFgk(<9PB7ziM(^lu?HFZM$3_BEq3M7 zwo^vvo_VsxvnZA%O{ReAoy#*k7ck%=Y)(N!%7Z6Vdx&RVtj+r(jfNzb)Y-fb@4!3m z2Ou0>eugS^TFGHE3gC#&U{L;CL$CoyIL0Ig3!WTDIP)BxA56N73~79Wv?8sMrR{+w zi3Pl`ocIePAhN8-w%M(0E@z6|&MeDJk$1CMnQ81&?71C_-Or}67*E)ZK7`?q00O(R z#}rH6u@oVeqDC!2?^=M~H3z*58mJqEF6#n8bq_5SvU9k+Lc$f6c3WRRs|O z&ZK*fs@w$qhSdYZ$YAC6M9yPP;*6lO)~p=K%}xoTL%wh#Oe7OT^e1VhLc~h(ruWA z?F^7A4&k+wz3M@&oS)>h5}_O3fwS)_)L+pJ1suMJ@Po{MA`EBvQ4Oy~U&wA~?<=~k z4Ht&_V2lLW26741Iyo^AVrZI>6O)zeTZuzgDiXHLOvgbou+}g^Is+_Fg0Q= z6?02S9bJo}+p`!LI4#7Nt%YGYP74X4WbLscQWj0%EnUC>Xatabtn_1GHbY*>^#dSFHB+hY^;H zxg?N6bNlL8I))nj4~+*~3M`dk!>ScGD>Qyj{hMtj#EGaRE#Rm>vQGeNy zC{0ofqys&SLJGLzVA>FLrydUkEiWW*AeXohJ#O3R zCQNE9&F7~<*@{t){=cVre)%4G?Exz1C_n zznW|M<5BCePhcAVE&NPoY!5LX!x?J1rU#Esv^0MeX7;?58}bUaVomd$J^Nnv=<~VA zxB1IySXxQp+gLQ3BeSey58FZxs((0h9 z4X2=@8yI85GPE%_`2!oO9&Hg3@*#w@QJ1~*LRnu6DwRT zI`VaO+Pp}MV=6#wFGZrTEZQ9^1E<4aL2B{757h;25Dnc2wxm&h1&(3yf)`>=c2LA+ z3yex6)(n*r1Js#^luUY`L+{6x<#=Z?Jkd%MQe)h8C=M*IgZJ%(qb$+m=Te^Vy%0LK z&^4cZE5-0cZ@|%f5kFC+KO`PMFeb%8dH$B=NuKS0Ku#2w@Jh3&NSbLS@X9`q{!jaMXi+jN z>D#Q$*odW6;$zEkZ^Xvck_Knjm>MsG2hOXR-D+3`FMOcRgHCZ{-q+zM8We#FhVG$t z-*%{UD8i#W!gh-Az7hMd4RJ^f%xOA|=sc{fEw3tfz(<(_a4lX)Z0Q=>E_6uw5~TnS z{mscu*}gn&GS0}*bq$g!uPb`Q#lcpGloxnh^yV<-Arz$8@ni9xQ*LH%w6Y$q%?mrY zV;FGXcK_Ig<~$E!9|h!N3y;g7lpsd(Tex{H9?*CXb__*~_jrs+*bO9W5XX!-pcr-% z3N(!tAUC0q9}2A8g}B>z(`>`5_f_RgFnr*iCYQC-0%Xk^qz-)bwb$C8L_O3toP}6G z;Ak8+q#r{J51UwwSV^07$T={%iBz5uKdh28uCJ1KL+_G0&Wf~XnBW$}X9$&)Qe>&T zh;lG+>XVu}1}b!#4n9JX4=WGjwd2cOd}5&X5BHSEkW%A)-?b7=U0caIA20J2HJcepG^hqv0>*2H* zvhgc10MP07f=qFCJAh(z9BuP9@5#Les~Z`HHRrzXa;>wJL_CNWP*O2Dx>q)2*gEgP-sOh=vAd4^DjoZ3#3+lia>!hR3Xz%QB+oa~Y zP>2`0X4|BuIxvU>u^lIqVeI=B$5O+!F`63)U!lNj5L_)obM!&ZL$IcP&HGM$<6Ew9B@;*maVNu3D~$FMJgH&IR78ff@V+Zp zi3Y+ua6ip4U^f=tiUbcT%VNqoX7RG)M8TqXUw@wDhqK3rHJ!x{JtC%qtY1gxTf9(G zo=UKI4bE~v_I%R)C*yukqtK*-u6o?97inoV69dJOs>jlZyf6dtm~qjbD-*5XWJ#p= z#r)lu8_mCekC~9m=&d7-N*r`3nr|2@lCl83q}pvP%tcAAv|WkzDWL*T>TM(|#k8h<=ldGjg{< z^F)$H=3Y*DMqC3`Vwt>QvcxFuvVEM=7D~~sAr1SbMnK(fZ3N!V;Z0-ujY=sf9?fxgGx0xiNymYSD{g%wNkt*op1#&=Xv`^JP-=Z`KH_r2j{$dbxcjuh4bx@ zqT!&?GU;SpJIk2p72>}iF5ifHp0+k1?VgLIZLep=GnxbaRAE;h1{9efiA-)vK5V*w z!|7_Ly=ueP71efY*io;-T6)8oS@vpI*fF1_%XGi@yleTG&S_mHORM2}I|#uII9mp51Ur z%JCQ`= zd%)8)KFfEe`*Xan?1{n0B;|S&RVl~&K}V3;do)V}d5*&?wC5G+x6Tq<*@s;gGS_kd9ZhhQ?z^#as5b2W008-0sn8 z7==&btscV&yzPad>k+^`2JbnS!OEfSM}Rqmz9t=YrLht&J&<|8H3pG1@NS6stOUEm z5b=Xn!!f)Pv`F$PUORAfhv5UfnD%`>#1U>W?dt>u7!JcH+qCcF0gk!;{AO6ZgLY8> z#>{3VGTZxVLtD^>kGnK_jU{3%EI&LEx1r66KU{`-4{AhQEc>m+$$_7|h;OIJbdUp^ zaexLC);7R_Yf|=2EI<$-!4Wp-E8Z$d=opXFLEe#toDVc10(vKP`R=D{%%#a-e`5x+ z-yrsTE{S~l_waw0`5b4zNhuV%oBb|lztQY>Hv4^y{id?tSoV7f`<={w=d#~B*e{Q7 zWA9h9-*Wc*2`hIu`~5BZt!4gN_N!;VBiS#{|60W9u8w%|%g4|nxRE@H zwV^e#3`2|JtHo}|(wHn<4b?WfC0Bw@0LMqcT!xNA$aB(Rpnu1~ahP+nRk%d7jJ1A3$xJNeYW&Y&|_drKUnjNExqdPXlm(IP0{QQ zbl%2jyeM=Yn;{Yi1?$UdhlK>rs58tUqUTLcb)_b6uKK5&eEuc8$>(43i%mX_m;fm| zf39cuZ1SD|bd%Foy}%~Nw1#!+=Rm(bJ2h?0_?b?PCa0ADR+H~Q2LH<@-wpx|Z1Sg8 z|5B5qxu<)>@AKF;p)d2+#gYrPZVnMVZ(XVuweH_=(%(PXp`FpZb)92=v2}|f3%!=l zL|0!Gtq2|xrUpv$PhC9&F!wYlIy8cU-KZp3_jvNzN?;aUZ=Qu)?doRJat&@I^M%9g z;T4N%7Bo=jLtexXfkoRH=h@w>zFY-E3?1SW5ATK>6bZ*`croK3qcG1@jPO~7%aQg%<#a6Y;>^3|Y{t^4 zq~GoXKESAlQz3hZHQ>+Jh|s=m|73#0@Mdq3`$^h)=lA^&C=i zQJG!{^|zlD^zMro53u-Yo+R48)|2dg1M|@y*k9Q*4}bkpb+l^!IaD34`8d$fR@Q1( zXquLLTp55127ZAQAX7zDZ6<8Z2Hj7OgiEAwTR94a4G=>)m6t%o1nJidbW>Bs;&^Gb zQi1hZxDxe&1gTNxv+jZu>2}~t-R6yT1e@1fZu90B*u2Z~06$7KLo&-n6hj_Lh9YJb z9DY&B5u0ZjKtn6Fn$Hn}aI}gmi`Cedzk?I=mA49F_L-3vYT+}a{egKw5@<)Az*(lF zzeaom(3JhO+Tb-80Y_~%^a)xvAOv=2_rWb9J8nz%8rkx(F2Zt`k^B4HE0*UDoJ>zg z?ypns%Zaf4O=OA%${1zhQrrB_Tn}vjvEV}@ADQj#C?obtf-jvbd{lXpQU^Sg87d6! z#^}XNqz!U5y!|-AMSw@_eS*=OqO|$DNp~(6OTXKne!ZH0$3@cTab`laMl|Q|Y7=f^ zKm>NRwxzrSDDy7N&<{@l{kEY}g&-_mzlcvCXL+)lCFs!c^@F!2Mqx+ z^qt!TtPEgzXbJ9Ks`aChv-*UFcK)(SWD$x1rO+OsLR@%}C0b^Mnu`rlb46xwxYOKj5kfcYc@7#(+Yyd*)1sG&XW(E!*Mv`loL;JZ`h13=K=)OxhPl_CukQtBnBJqc5M*0oFp@J!=FGz zjSlmM=~-#ASU`BF9@T<}NLlc$gi?cQ`eUo@3B_Id$1x@A8sf zXC4U0-!PrsAI5p7hX5{xH1A+TApR%O5ZxVOs^5%`(%H35jG9 z`dnWU32XUoiR6}lh$e@4XU467xCyNNPefPj%G*c_?n~}EV8hv9)`su&j-oT!ru~OV zV3jaQ|Ddd_EMBcoE{;N5Gu`y;@aP$t!-wYjmPpQ1W!caF)K!*!>|kP3nR)baoV#~b z_j;sPGh{wG-_UI<(MwY+LH#~HXPk#waet)oL9CTpg=^NX!y^|(Q zb-iV6IH-rghaUcQr#klSlF&*_LhRKa*WJ$g<4!pHYET>Hg&vg6vD_oRH%b{vRqoaI z*?J&aA5vK5H^5P#JP1>s9@6$qX#T$IZW-Pk{hcrYxw~&r$mo`&ZOGIh@g8!wfBr8d zaBBbF{SPES;&t;EdMpu7hVsp_7c7aM8!y()=8`ZT2Q!(jLDMcJ2HH%P=hW4@28|>S zNaZ7Xb|Y0RzwH4omj8{!awA~x7Rv)W8Am1i&8MStV%Y$4_5i?|X4sewjB2RPIp!<*x9gb(7#o|PCXSx-ESQw-t(1jxg0T_$`sc`niAWLPdO8BA<|4M&L zM+U6F5psyx68n1fyMLy?jr^KushiV#4dZhqEC{mY=RCH*;cqzBfsfso%#qkbwH8fLuC3(q7=qm4GqQUP_WVSN{u*C z76wHqZ`luEZbj$@Ht&>X8CgZ6bNB4u4X;RqVdpZOXqt_Say$nbKGB@2g1D^aJvguX3--CrtwpSn1@c^>X z(p}ml-$0~C3h3s{ry!+5PQaC2vKIma=A}1FJN3?>u0aot;H_*SX5GC@#O9k4g0wcD z3$+@v1#xWNxDF5mj>daMg6U)q&gG=a+>z~R%7(oTtIWI-{mr@3IjUb*8)_1n-Ede` zB!{kxK9=Lj71hA0($FTV)p%P};~f~d<#@x8IkL?0yaEKlp6F(qbgrun?e*3M&|W@j zgo!|{GX4w*p$Gru@{M2T!w=u~Rc7sBOkJ%rI7lv*5}z0@sJmCad(zdwIRSL_>g=DP zt01qRu1+8#=qe0epsU>wLy4}?KLkh+5t)G}Q#U|mJZ^5JHRI6Q!7%hElfz?gaqa;* z71Q_=xT(bflY`}vu=g=qr1xnn(uZF_=#ak0fQ}RGI?`HZMuXJn4y7Q&JG7&v*|Lw; zUWmO}M&oQ*D?vP^MF}lr&9JifV(QQ& z;%Ynd*Vu2h6I;S^zLuMDpD;2&|7GUYXt`wv{iBfbC^4j-EjZuWy9F_`Cms-iZM4Y4 zg4bN2%7PgdaR>BaLzc(iiUSb~t!RK3TJbB$qaDxsxx>FEU&uiG1^n&rvnU5{xlp2Cu8sz<&C~Kk7NXJ@ZV?K`RqT8dmy*|@> zVNycnwwS*GG6y-qyVvk1i-bj) zZu>FZetJD{EHQH#xEfanEl<$^O^=&nC%;XR&|KKYxR1mh=n|*jg&IQE$ni$pj8uSk z;22&4%t(BmEX2Z&N17tw))6Cfaa{@9E}VrXw!{L57W5Tm=(m)w>m0juh~=(4`z7cC z+j~y4``|h}etA^12Nz1HIdabdA0bevPQRNj2+$S!e>_E593G%iw(>zCg2R?xQ%~*z|0~iO+xm zZ-nj=e!j)8CSi*Pl?6TplNwNSl!}N*bUm5}LVN3r_}yk2=?ppO===VH=*nBzk!T9T zNKa3T8SBBmK~ouLXwTkrhGG<%8O@>eTt#V^*@KpWu7W;REvGdR7<|>T0hqa9)iQ#* z`9%_+c)*|d^S%-v0l;j@6K6T}SoQ3hK+Qefh&sNBWXg9Ph^8LUh&ojz;L>En$)8{` zY!Tg9-D{W*aoJ5au{k6I58MJ9mP<9Ty~gN?{JgUxJ7mxoEzV&ZLa@51*)^zUFf{?z zzA*rJFnZ0!r7n>oZ+3r2-{?7azrThr-PH$rz9P^$DMrlr4QsEr;c#7nRs>>Iv}g6J zFQ-Og)jxtfmG4377ejG<4*+z10kB$>(O2Wn2Y*u=_wze@K~HM>14_crB>wR}f8zGu ziTQf=83Nlc*1&e3?-8N?na&rdKfx5!)JUc`R?nL@?;2c(z7|NwsUqz<%c|yJ98hV* zEd&_S`TF!LP-0_KV#X0@KF~GJnM@78Lx=PXJ@v59()rQrmG;OlWok9QiG*u8*;r|n1$UrKd@%S?YiTxKc_DKmB8oc|l?N|eZs zPf6^C2D22hcf(In*=$b4R(`R(@`f#=1uN*V$i;!f-znOYIF$DTY^KjRYij%yJxyfMw&l1Sa9sMZy+jmpe=g~HgjNgo8mUWbbWMZ_U7@y zGd5QRN4jwucAUTq*0#pHhQl7O$GFO(!(;%f;hi%!kG~?DA~O?vtMGlQYsThq_}hXb zF+r~}Yv?yO604=N=||f>fU;pr-s4F9gvE_ml1$paXQ&5^?NdyfOb}$TrmkZHClpy{ zPj{bNA`b1g9>XE+=$1G%4oKT4}rJdIvKdB+{>=8G(|X1y8m}i1hA@?B`Lg7ECQx`3TeJZuWM?W=OS$(cmX+Jiytt z_*{nTE^rJPIP>&K2)lPNr8d^^XraSrcxD=P7Pj88hWHTH!{8_{e}-(cxR~wz(&9ae z?Ks{LrSSuCpfFU02&E7y`S1ohZ=lJvz1iCgf583!KmTVK*jNhO;;|KRcd~F}h1*}a zLBjo}kjMK}xUUHJS>fI*T(@v5g^}} z`2zkb;Vu{PSS0-H6!BgV?)Ad06K=V1=L`2H;cgSIn$M{MUhd4r+^rPuX5s!;xZ&6E z@DG=8H&1-uB;0Mn-67l)!rd?8-z(gW!d)TU*}{EE#D7G%-wOXs;l>D8FWjjjUZ-%? z`qVAu@MSLN?q>0=hNsY85IheFSM?tm@I811kM~sozB+~fcHwRoZkcee6mF1k?-%Yu zk$hV{f&U*bK##OTowMOReup*^)Cv*&n|%%HT+KTeUosj zgu7I@@xqN1u12_DF5~!lOSt=m`-E^e3ikyOf4unaCtR&?Pl@*VNVsnaw@J7U3HJ`+ z772I0aF2`pQ^a?yaHEB*6>got!y!TMSBmda0mnCj&W{WCkZ_+C?lrv-j!n4f!krrse_Mz?3-X3Wb({L}@3sI}ZNF0yJY4;LN#FZh_5VS~ z{dZp^-2Jkam8-`8CD$GB=(I564KnD%LPLzEei7k!OxQC0ww$yzZ+_qO%pX5^rhUnQ zt20hVonHLl#%Z^|vwZlYcRUh&Tw2o5|AkG7F$Zr5&v!0+q3)-rK5{=C^x<93(|0vD zSKRgKO|xG3d&@n|rq}KZkEt2o9`{J2bM}XS+O_n==JRXkUp4iP)h&rT4_%?#)q3ON z7te&XwamKh;diboc_nD&*s%jQg+6yh`siWtKdc^~J0K!`!9qu<{rS+!weg1!Y}hou z?)LkX7w?}_cFE3K@0IMi5`Hqusax#F4q zyHfrfK0IUgBgf~?d*$vWXKLchzuI`Kv!>*a>jthn)M(VUZvC$7g>4;Gc@Lg_;QR|; zuUpfydfBV*j?e2TS(p9LqBX<3d%r(-`7>2PwiV}Ry|^ms_VFts{Rk#SHJ*eS_&4)+ z^_TqUNie_8R0p(6i=IyI;*21TrVXOj-?MWvmpW?7ob|BKK$>2 zUtjr?KQ!(az(f9H`tXlKC%Y8>b*^e>#cF%4-CpM)M2YXh;*u(=cS&(|O?5>{ag{6r zK(Dq_nrdfpMKy3E*V$`} z>l}8uwx*)m8BW|h5K#S2;k8P=jO zd#MPot*a@qJJ5oq$g{$^p0{R6&1!&Hv7*Y}E1TYtSd(Yh*3RI7+Uw*MbttV4?SV2c zXwyEyrk1joI_!0TUhWGPS9S4P#3=?SBGyG~^fS3sRQqexE1N!Q6p)P|sh+44)Gp5j zxyaN^bv0FTSzYmJ`|9GVvYNWp_ENb9Xh3t8fYp@t5s`YDiY_4DUWZu4pj#&>%i$#c zgkHEB%}?FW;Vi8{8&=gg5Nm}UC7@TK#n-s(=whs3LEro4aC#3D-_WLOXqDYzFLBk` z<5c=8E-A6sqSx8i6_+@x*2^{3cAm}nMPQLN^$yT2;8UZs)I=L4<@SY z`l_1Z(jNR}T}d1P7AJ5XS7$FqheiDY>-_-yXmE&&15IIss;TOY0Zyn6dsSH+Q0;V8 zud1%8uT~pmHQH4>(7uj$6xp8%x|JYtib8-DO^3PRO-N+EZ*L#f?SQddz6mLZn_2aEymp46SA z!&y@+gC~GdTr7&SobVSI46JE1zs~JVM_<4XTg5N%C&f06Pu<0;Bok0(U-=C{x)sF^ zduocSu1YShsx2>GVFz1t$oUIr#-$_l!t&PWG@4lWXHTDzW1cz7Vx2w5mOFP|-c|D# zEW}z@!QyL*SCo|6%T|_GRIaL8U0qYVrVh=!wtn6EYZDTal2az8rln`Z6$Zld8AcP5 zHv|2@g#U;>{B7{3afEdf);1u?YVcKJ#k?i_K@7{>GcbSJ$$VKK`G*6T;eGh0!#|`C ze=IHa=}+;YWYt8gq^Oc-MfHjr7Y5@dEhkk!v^1!K8!*0n0X~iZ-oD_Pe-U_#;ZOKu z*^91&26mLYoNVLBX-2_B*TWc?^1~V;{8D=@N5)c*4$jkG?%2;0y{!mu2PEA$L zSVJJbw*!7`#=W3k_rrgx3MVU7Wj^+GC3Xx@a#h9Z3a7v1Rp6673ib!^a(e_(O&qnw zka#M3rifm;G@kK+rR%`XO6{Dntxbw+lH!^)EA7>Gl2QcGnRWaasa>R5t0MBNrrS#QKkaSX%pFS5>|`-Ir#el&e4829kn&pBu+1M)8WKu+42J%c9GMKwymfl@V>Sj0 z!GO(ggbas?BF!SyxUR%h-tYaATrX*lOD^c%j^dT}?o^CZ@F42gJ?IO}Yq~0GaHxol zaHhri#*lnI?wSaBcu0Or#($vy4e(3FzY31phgHZK3_a#kekrx8c%`GS08q9A+&~p= z)r?mcudFC>B`3+~Dl&(Z(>V&q69`v3{4U4;g$NT6s(^~lQiEd4s%q+~gxWeg3h29_ zz;aHa44TuaV6Iq?F{`+)u6TX#W}p`QSMog;kgp&JuogB$B)LRoH#L}jaRv&$uFiEa zO}^G%SL1Ko9<2}VDm%-O70He$hn~QCZGs=^69WCc@SEO;|5ozDzrWd5*H+nS{HEE6 zn4n*5q>&x#F*98)*MXVTtd_-C0-2I`9yzvI*0_sEE{Djf_J8Uw8qLgt-gG(x{g-q( zf&Mx0kLttU41bd20^^f^68zaj17k&T6^H{fXS2Mz*sz<#>G#F8cqvG109hW? zsxN=y;~bVg8%}NQ?kIvM5$j{>p}G0cE0rv*swlIUtS_lz6U$!na*NrPhiQ7={CNxK z&6sB^%(X7a&0aXe(k(&xSs6pUqr9S4CLs#@(h_-0cO^eDhWL<^>B2N$D{! ze_^k%p773{VYZobdIc}co^e+* z6|-i)f1jO&MfIbFsjOLsAWRiZMy-87>BK?_6fc~?T!1##PG2nH}L)<5?P&E=Nj(RTL)PVskb=K5Wm6Q{UTMCUR^uKZI(o+jlQ{rk%;_A7YGH$hF zEpfgT6DS3_;Dqd*JnM>S*~eMRR&X5atD#V>U5%fbQZB>*{zr>=y=c1LL!;587jt-O88o=q2=0vkCOjm)_JHS506e3BpK*XE(0?cV`tpAg{)ErK_%Fkc z<_UrRt?(oHw=aKdAO45nH>(eSG9&6MAM)=jpVvh`|Fw2!a}__L6H0iyV=F6regiyT ziMK$1vbfCX!=LnQeZ|L-QB2?UU#nMrF&2RQ^)i$u{T`cERI3W6CnU5xlB>(d{Y@OZds;j0MSGCO9 zwSUO3TK^wH8zg6FZW{M8WFC>a|e{$Eb4W!`c8YbH~loB z-pTmyNyz^j`w+-TWHu5%F*!bw5v~(ziKXjlie88n#BKtPtl;IZK$-N=SV!w*2}iiU zs{ir8F9iRG-s1kN@J`PO{1eUs{b~Fv!2jlBz2pB1glvO=LhRE-T$nWGY!dzr&sZ(34rf5 zk>5KazX6pz{>9+C7=7;%{QKM*o?dm!+IcV00b7|>Y_xz+x!;%vlRb=lWfd!7ZGey(w$dllDj#eNpdRAu7FgAy40?9P|A53_ zQA5Ii1rulQsp9xh$CIl;@3fvWv#w@!zOyXdOg0FlM0PB!TTh+~Fe|e&-#o0mvzHo2 zA?foMVi5~-mKkD!YayFF<@>EvtYXO}zgk@^%I>w^#+x8dtUlycI93-sOUh>m4afqq zGMWRFEg+)}XhmjlS;7WwjI~Bh$UxGp{5+&`(-SM7uRBvcIrAU${&?g3ephWRH{A8; z`wgRpzTUQ^CyM`1_#Keya#mC=Wvj%67{CR~tLFGs`5MXmB&VuMnrmA=;uRaGVe4-kJfzg_@c@ zk7B>=&RNr@BF5|WbB6Vg*wB&TPjq?e_Zu9%?Cs{N8% z+3Ic~7m&!coDM81Sg0V$ZT;))t7~8{2Awr5Fy&bAiKfA0!5!G*>I%C&nKahi9}5oM zDh^d){_n$CS6pAX*4}&ekMUK&nLp!psCI;uNy+s_LM%O$W>?1N%~-I7|RtfNXUeJ z57%bkOD$!DWRdg|GM9|fRgyM1+_*y0hJ*!MwZo8~B&GF}P@*ABiV2a*^imLj(hk+? zb&>iAyaq`oI(%6_TsJ~HQk$iff{l_kEJTV!elG2$(psHf8zKeiJ^%oKHkfkM8iPW$ zQbN2oe4sudRIj@{BwQ=&wL$3!LNY_TQLDW}Cq+oXRGd!RlBJOjj@IaWQjx3)f(@r$ z3YE3EW*ha?OGC8=>37;o`bS8Y8;6ET(s*40>INXC7-UCtm(B(CJaRe%gE^RdNX7 zn)`!VIskDH++h@o$dwFBcKX#z22F^h{f88)*Gt<_zFv|;V}n@h1!;BhXoMEzElG!i zfh=kMU;v1mt_^}0S_5=Q#o<)$Fl~y#pc{fZ2bnbCI-SNaDOe*-(_aOu0tVu>Lo^0m zkkP0O9;x51)1>K>j8Z>out73uf~6>yD{esAfizR}8vRe&Gn74WuL)iqtSNGLYW}y~ ztprvBOe_Xh=%r^%b8@~gNA$B_VLnGPaiIUr@F(7!kdTm=kd%;|kdiPlAvGZ_Aw3}@ zF(ENAF)1-QF(q+gVrpVqVtQgmQbJNqJ`Ptkjcpn?7Q(hLL1%I$tzW{@jw^WrB4eP9#Bwm1u8=Vs8=0FfRk6%NU~4SO0J_E6 zK$B)L&xt32a=s4h$Hh*$DMDU>CPHrf6T?2sp2hf=3i!A2$^cvngY1&>9_mQVo^>3* z>Uh5cxTX13pnoI$NIwTde;BdJMe}OOR4y~qRb5|KTpK&Kh^8~ea?xB^P8Z1#Y+QC` zNr@!5ngECY>1EArh9b?f0XsDPhsdMC<)Tr4A73=?%7nIYH4p6=uiYufjr?AY*ZfqJ zdT-Z`)E}kMX;Nr$T1>>~^hf*MmoXuFbmp0nqvvF$+_zw4@y820D~t2z)qI?P&;H`8 zHE$L#vLC%~k>}?N@TA{+#wZ!}n776_cjUopwmN7mV5OP{i6DhO-#u&&$P~-JFnEfWvlPjXPXbc z)bi@POP_si*zjOuXxP9ZsTr9&|8)HQkhE>L?F6oe0PJVIf z?_Dpq=;h1CTppX8o@tqF%Uh6tb-^`Dmlu`T%T_to-EiZU2OoKISJROvo~*8E{p&}+ zUViCy2Aw`mSEiFD#Je|+&?TCN>tjMj8pauN^!=`MKN1w9kI}~(Q^MxzQo=W+g$xcg zMo%(l=t_(s34;xzb;At9E>G9bF-*{h28RS^$yeyZLsE5_hD(C=;lX*nE{Kz0<$mn?Em4h$2eE7g2A#+h!PQ=jQ&>)NPiV#=W^r=?{O)`WAT@@r5 zB6Wta#YXLj6(cRiQ1?U2FExjS21N|W3~4HWlhudL%|uyd%Ql>{q4};NxBjFk|`;o;jS`QnERzIwvvd(gvi06 zx87ygIP1>6nK!j;%m}_xzclFb(3zpJh5;LPWx89I7*fX1(PsolWf{VPL+*ZetX%B4 z@5c?vCTT=aKfQ6oR*!y_Awm}t9C>Sz`$ye|-9bZ4QKnfT&dKg?LmkH2K{Kx%7(Ot3 zQOHpD%^POvHcdATYRnrI6y$zqoMGx{sWwh`iC()QYgAOGLE3QSO82|t^pd+N707CH zpB-z{hw8NrQ8~6L?gNv9Bz?YNSc-N-zw!Fg@T)`JPo$5C7_Scr*7gf>-`ViKE=m`n zbDszb*Gr~weL5;1YaFlF_6xaULxFLGE=)H`KN8L4{=U%wxzk_>3epA#8G}QjLWhS9 z4Idg2*)QCrkJR<=KOkhVG(;aQ4b@!|GE5q-9W_|ijnl@3#Y+kLL~WAvC+#EpM~&ZU zzc>7(>k4^%-FmO@{)9yZ-mTk)|FxfKj_vy&;wMa7x~%Y%M&B*B-TtSi_C5b{%i&i( z`t&p07s9$kTIQrF*4fJ%Z$aSheb2YN^2VE=ex~W}Fq5dqEHAY;-gehLhu?TJB5G{r zB(rtVlI4Y^cHeD(LW-9UpZxT*&WI>8v<~jZr}w|`;ydqko^IIWeej_dUVORr%@ZG3 z?)b~=EpNPOojY&Q;^l>&TW)>o+2>wtZfSilYVeRHOTRt)Q_5 zzk1@yk51-3zkl$Mk)vkLnmdm=&982J=H<8F`LOf!Kk6K}I$f8?Pk8vr=U!}m^SzUI zYO;QJN5ZY6-sqY;@0umSMpNV!6TbR;bxqooY17RMR=N%yK63Q<`(OOjrI8CS-FQ;J zF~>Me9~8CWv3~AH4RY{?;kuzlNk2iKq7T+d!9l@Mp?RkM!TG^D{qWEbolzI8!*od( zt~cnyf~0n>kA2Mv*rMo0(x_3>&Y%Bq&Vhehfjjf$ndNlXWKDRLoY!88&uB zMH?qX#py2XH`?Uhs^56$;IKiPw;Luv#@6z8h>q3LljWdnmLC&y|x@+`{L);C~!$Sv$*!1o#L61HdK182*pMJxM%Y(xW zhK+xguM9$fPw##~H%w=W__xPA7vI3Pl+3r-g1KL?clFOYx0lU;fnm3~&1x4B*m{WKP@LA=O9R7Ie;JQ} z0*Y%gwkMlKv^t5hGLhJNSO<~OwQ9jyTCoz7gEF=`1y$mKm;tRoB3OjTRitkvx-6qP z1T1QW@d`{ed&GiL70~`%ta?@RM8t{m>M&8Mj$sSh_=yDk7)K}AH;Z(6E1XYtd`ORHr^VS z14ICgKim2Q1FyjJl}JzhDbSzxamDoEpQPt&P}T|a)EN#H#y4@ZO_Gee6wMdAx{G>5 zR87GGBNHp4{oG{h>Q9Km`zSvba1jp-g!ih8_|JgN`@;XP z;ZOMg&(TXoO-ZePoH(?J(`zxxq~|*P4`pxsN9D(=+x$1qm;ZC{VM_HKY)A>qVraYSVn#5N)3Ttbss%SiM z)MH`@Yhe3$d0rjHLHK26W|yp)Z?77A0emgUm*$;;aFgu{tyAX`pRB8f!rV?PQ<<1k z^F6|@YOMT0nZg(oR--ayE8lvLz2V?^v~}3!kV~;{1eFXpFE(L~mz&9sAGuyw9`Se5 zV+6u+FZ^f?r)RtVXO`&54#m+;fLWV)`>N}7bcHX`|1a5H{C^$(AHtJ=nFTwTsUJW} zaxBF%1||U5{H=~M7gA>h7E~C4LR^U*i}v+!yo%vp^D6iX(cgtBD|@93O!t~d_q4FT zpthk$K)l0d^e)TR2>*y~;1yb@0;oUR`ctIKLcTyg@}<@TQ9>D4H*cv0(hqX?h-A&;l}tL`YJcX|wC>`~pH1bo7~ z8*UZ;qXFS+zH0hW7YXlqzSfE3AF9cY zpS?5BQk*)#5^?TP3Xbcv7pl=}87>9jonGEvDqP=)Z=xl7eiYvz6aH-F@uAjdPnh^t z;|~bj^L5I!~_eTw*|HAQ;dck}#7#-L}q2v^r<7oh43=r{!)e8IRo82a;ggawYr z<1gYr8~!wJvSRmT9>?Ph#$=%-q#^?Ic|na|Lr}OJ)9HMfKH~je#0yMcqo()ELl+lw z{KC!ucACUy5{1Q(-knUa#BwiZ&1Zca&vU7gc+_>$1XdE4g=u^!i7UlCuzDqowILA4 zC#AA%)+VS7zW5fNk17w3LRYSAQ+0|{g}X29UkB1KD;wm7s>>wwlOwQ8wVt96RjfmUmA#-TM1eTvoE z)Dg>YzTbZh$;r-%ScT_%zxVpql{^1?-DeH=8u!|3+Gn2UU%YrduPbS|;5<%o)SIKA z_UJ2PZ^j$3(hE);k2z15kg&IhBSMwq54vCilYr3^Mn(_j0AyYCP+kN$mUUco_{b5Z z%c`Q$!=ids&b6n)IF_R!O;qZ%)AI#742?GqjE-7ZH9R`%1m2aovO~kE^H`9IUNAmN zsbx2W)Avt0BKa$3!EyX}vnQrl*9-WUJ4P4P9G25)NiPn1pJ&$II6jGcS~QzcQ=CGd z?~*^-({Ttdh7(R;DeU;@`OzU&^%WHeF=0K%Ak&_Xuw3K0RC4tpspO|3SKk&6=L}@S zp)b|kDq@RD7A!MOZqsG9y{V6rSqQ1^hUI$4@188 ziB@KLStu>7sg9529yo>-3_QDi?Z(U|M8Yx?k44dUa_%m)FfXdaT?} zEG?~>R<)p_zLY+&O-Lx4N60Ax{MW+|?ul}&T~;~2nmfl@<`IJ64?nTxWqbV~SVXy~ zD8Fv>v{-lSvVDy)JB!R@h1#-iLZddf*cX;-2gZ+nZ1tMuDnNhq(mP~{X6`kN({vX# zRBHmeI@n}(EotF~%}BADie>W3xII=<$waZa>4yu@ueR~2Zu$q+U+lj5UHg0UKP)bP-(u@I z0(;HZIc3#4scr5%Rg$vY`?SW0G6O8M%a3pHf<2VqX4dNIuS4MO7MxRI&4WFcHe5|J zVD^%^OP%f4M7~+q;o=l?sezshv8r;eqHMi8jXPkNlV~g9J)n%e@03@|+-Fs+?wo24 zLL`Zj0x?e-?hqqFCykYs(C*AVmmEW=2A*!vB?Ot^hI(?M^#s`ghDNkx!YK@;fmXrbfXY! zF6H%=NxxN8bEzK=$Yc`<(}C_SZFp?-qS0LFQc0Jxgo_)h<0F{Op=^Dk6bkRSx;Dzc z@s(HUpgZewJTw{id9kL0TK3@EYNBPaDh_ivz04u@+E{FfJ=7u2Oh_w^v+JwtO57zp zG43`Z)|O>E3c&7KeJ=|==7JCtadp+A*1|H=1~v5zb4!yhducuDXm-M}Vl9o_ z;xBv1xS5q<1UF$VQWdgyq?np*@Aq6(T|*~YYNzUVLr>XqY6XU9)C6m;xBbznu06g@ zf7BPguWQg|$=~#W)%Hq1=PvB;`x&m^EM3a9l{}PFtlCjn8=W6pR?R*@ddBh^x7Dv* zyFa6oo0n+uKdpL}ynEleGR$rh{JI%IbC}0tqrBSgc=QXLcCdBcI-4JQFP705UC;k; zzdaXyqsYVkp1ObA>rrm1@VJrba)S+bh_$x#e_uB-HSUnaR2Tjf7ykD_>HT%XS7zD4 zXptFy&(pR~-Aq$mQ_EEdEq4s8ck%n@yWV;9p3%X0J{Fy2uZS`W5haAyGPtG_jTYw3 zvb#N!VoMt56K*=s>11O&Al-gEBPa|eb7nD*`B#h7%$c*I=Ha3Fx#4z#X1cvyZO-r! zbO7#*vT1wK#>j}>l5bQp6JT-;Yr4_agE>z56<~iTNyEdwNJHN*=_b=7jvf(&!_)ht z-V=96xpPmGSKSY?f^|Q$`kzi5G7m#~4++a3K&E-FuHD=V)FF-Ohp@$a-x1~>HoxP6 zMxutz6J^1YZUF=1LURCdvb%;>dv`eY&$+H6#{@xTP!f~}RfM{`Q>UkrZU5i8scrc@ zNo<-w3d`R^HaUg-Eo3J`K7np4d;NU9<(R=FOQ>ek^jCgWY?*p$)tb9Jes1;F9E8ko z=#M*Wf7;t%YUcQ)TVYyzGPiMxJ>YDtD$@g6yD^g5pC+TL7IB56#@yyKCRZ*`%%2u@ zJ8~EsnfGH|AZ67Fb~ybsS0K~RLNIUl6lGnRuc<}$RzCmgJnd$iFTOvg8kzPHmXAlS zcYv8JY%>a?LWrmNDq8$DLqGG1`^>uAiS8{C(0fS@W`a84fV?ns=u zU#8|9h0H`FudF6%2j61THP_|i4?*?!?cajfNl;%U-?7r+B&#kqLSDlDd(ofjy@!Hi zl&TiVQl7R!QI_1Y&ybPfc-tkJp#b-ujEnb|I0rr9h&L#YiKe_``^ri;UuYdHV!<@X6tD!JxiXSZBU z&ZL^zo5!Hpp5ftz97S6?Cv%rK)syXV`gnm`hzN&!0b#0Mhvioy)AK1T|8WQMHORF# z5q3X^c5`3~`Dw^Czmb$4JGh`pO|P%0E1$${VPW+gcEILxf~j4&f5vYry_=A$0f+T? z4w=?>!t#sIL(c(?OItIP7)$jj6UOA~wm2|lk5loY$$@%hwA{NLklgB0r^ygP34#s3 zwB?*@Y_0!xNBgzPBsbuFS|3V_DP(o5){!>08k2RK)n~R-WfHi%#=V-0cV0>A}%hN&CP(5Cgz@6SitR|$1h~+nGL`cS&1%@p3kQoTGbfct*A(= z=SA!&C}Q!lrmm<(MfZz2f*1a+wy&M@)hRu%183;$<*%R)?{y32k(S8l#>TJRc`sa8 zK95Tf7*?p){<>93F9H7XAAIu;TR%>A`M!U;UGE9YUr)2`BrMOwy~fjFIcH9 zeVFRU!t%puhZ_56Ozy14x&KZs(5xXVEY92K$C2MoWwb4vqp@m#J4=*& z*C`Lg#$NuJXs%uHoel1_#waf>2qL_i+ z(sJGn%%s@TlA3ZeQD=^I*n7ZATDzfc9i-yqwyCIHQXXeh*rHaC=E7h*1H(buJ$32On(y(MCdReS=H;gVY#uT~kRaK_Wuh(VSX0W8CMOP)v>}Q+BqNI1{lo7i)eU-A4 zSuJN`Sf=o0WV7AgnUoYLYqOf9Ed=3 zHoluaR1|b{Z_K6_Y(JCpqQ&BuEV^Q9w~uzY`+c3mX7B!G>(7s~qAmd6pU0oGzi)7u z<>K}I-=yk>3EEONv1-`~gZxGUa$AcFHbv(Axl2xumdyt`lrG_setxUv7kfvs`?`gy zg85~1%Ps{jPjIEUfa|DvIo3OsJxP_)_3#m2wNP6oiWpeUV^pMFa=u-J_g}ojgG0~7 zRPrGy8^@z~?KG*(se2s%Lv5&9A1>vz=HTE`Q?E4JR{)LQiQ(PPlXKL4G!7NB_< zlXa!_=YPm@jQ8LCd;5Dw@n^aF$CG9Vd{8Mdjpqi&{!i&5rSQwS_lZgo#25UO!u5YI znxhSyW^?pcZAGm|C6aG>y7PB!`^96s+jVPS9(pg7@#W>uFLd;K`251a`)&BXpNhX> z%X_&)FJI&A?dSdcF(O@%Qsgg48BWVAqV|qx>>eFn&3F2=j2>-_XiCAD@Vee)CXLiD zgyjXi=cJMsbs+yn2lAO6$mcovjOx0RbYwHXWodu1S=rBRS=r}=sJhW)0T0Zntn1Hi zUDlsrm-Uk*t?nnzH(v%NCMV;7huKRryEZ01PT$oLb1x&8)ARqfcIFGo%~hoy7D25zcZe>8EKCeTw<=7&|iww6MB5PX}EK+zR?6 z7R#r!ETGGUB$H89FL}9IK9AK-HtXlL_?^yzIeUwi)H+q<6+%V9S~(jt zscmM3e0J;iSX<}Erc^IP|CtM?n`QB7Roq8tR>fyBgshouzIW-?!)Mf2Oi{g6Wa0U) zF?1+;&koCV9^fG46U}(ocy|{v`VFIvY=P4*xUbqzFf2Bk*my7U4_V@S^iPlA_O zM7=%|3_oYtc4zjzgy#*e!TsU556iiIE2VrD^21WNU*CcJ7UV6BAAjNJO#E5f@3cJU z%_b*yxoE87m$EcgvTG)FUpM#sn%2NZn{R&J=61?&2>N~9@L3@6%kwN>(;KS2)acZK zEwly~@0r9UvkKBYZdiUUvcW0jniJFeSJ=JA&C2I+IX=@tIX>Be`~g>v9X&@HU$Eu% zO|v1zob#l$n@fhyjG8N1RdD96Ri=ZYb?30fVs!E$!`*V3r`x}4zj{rC^Aw@U;6FWL z%e9=mkcmRQpjLI&vO7MOy607`)u9yjRl54{sMWU;9c8pm*cD;|fOmu{c6pf%S9?q? zuT9OoO060c*;j{oCVFYu`}bDA1}TR*ff1SJ8UD8w(x$oO`}z53dK(jc%<5^BOz|&S zU(HzW_K$Rgwz25qvZb+k6(#4|^DOyJKkc88nGX$x_OM>AI9sN3f-O!D|9+u!;_6R6 zxW>LOOof;6!IGQcOtr^8K4-AiN9<6=UtsE|K$Q(uD+Z-`u9dA z(#-vFjN9lJ!uQ8jaSL}1=WWdVo{9H+PuTFn&-YuLd{_E>+26zOJ^uRz-hW5GyX7=UTlx`aS&p1Mkn{v##BIRsXvR-~Zki6xOieSRX-9Bu+_ggSKaEb>qy(Pw(LS^ zACBH1vPsqE?AEjR_~WBfrso%aBYOV%`c7M$A7;!fG~edi?b&WtZ)q&$ z3+>nkHG?I8YFlsTP(P%9SYC?!#1!%v@|+a%^O5Vh?k5Vv;a$Od@30j9Zbd#Kh5T2@ z4@@B+&I4BS%6lfW*zd>g3A5FDw@08i-g&hZv6wmc_W3im9L^#wG9yXX9_g>m#};(d zAy!(Hw2wRfXB&U1jXt;lRQ&Dhv6)}gP8Ho%#2Q9S*TDo~{|`9-yFJ^C{V-ud^O3^g@8*o|FuiuIlnbg&!YfM}ii~9Vh&_`umXtNX?Eb7R z56vsc424u41v5@Y5e6KsA6I5@?BAlz-DzgBZOf&kL4x&1i6ehpRg!Rj!|JM0|J(hR+Y?H5C#FPD^t>?w?GHJxG zcKEl4Z2SA%;r`#}!F{%*jJp7TSr`ED|s#}rwS9#~qeH6s|Gm0|z4<5$n) zLwDi-I5+Ik)j2qCr~gloX`VG4zTRgJh7N2OzSV12;VyCEw()MqWNhfDuTn~J(k|Zn zkttmTf3*4MzYli9tJc15qs2S_U~zwkH@n~GDo{++{3m>er?9=%F7TN9_UPEdm)P#H z8l<_|d79u*HL7{p)*s*Qeo6h&`-^|F_^~s!!Q7gebWYYRwU1AlUQ$Ucash?IttZ@l z2-kep(|-o`s#G$=B8fj?5GPk8E zoAlA~Jupu2j~Y{ertY?O1V_GN_4V(|kC5M*7v6=wrZ|dt$ufgE+=s*YLx`<2%C#HIA0Ac@{hfnR_<@V(?#0TI{Ko|wW@jpoX%HOVTOBwxh z=aI~q&UYPk*!@Q5zI}Wtqia`gFT3*W*uQB9;bLnSj_yfK-JWWzO5*nAE4gk(UB?+t z&)cL&@9*vPX$dD)+ia)LcRH*`sp|O=?fie*ae8#UYnyhWw1m^KjQ*{I{E+`_eJRJ> z05^X8^oet$%!8Xbigw}Dxp2DNVV_5bIqdQ)Yros!p6y3@3F8gA^)^=S1^SEapUNmJ znU~0~Ot5{q4QW?!$(1P_j_PCTaFT;*Z9-xH>fcm<_FR7Gb-#7KE8mSj$0-vqdp2He zWwmoYbKhwDeAw63ldyaka=o8ue+m18?M@eNG2m36(Kqb=2J%ni-AauV-A$iN-*^T5qlTIJ7_6Y#wAmINZAlQ~hd}SOwidtn~QC&c~UvwZ}K^;XFg@ zSVc>Tt!}dUw%DYedr3jH)3Cfd`H)Kf32wEX7k01m*SV3fT+eT%J1k#;Y|qzIoAwIk z^!?{JSG{S|UqSpbwa`E)EWZNTeo)h2t$RP8^b)ctl%k#6UC(;N`nOx2aAE(i;8*z? zmOq3n3Vn(9=xH-m>9~eYCl*RaM{}v2(PFkOVdYKNe1S>Z*4^-mP2S}d`uqe7I@VEi z+RV{kA|6xA?J=$nB9n_R5uFWabRjy~NdiAXV3$`%*=_YLXE1bVx$V|^Cbeqcw&idf zc_g#P`WaV>yh<3;=;EDkt-%?f>VMeKT#VV@y+4f&;U3f1<>fp#Uh*U8_&YYg%u67e zjew4V!tyc5G-t>vkoJvmi$#O#5~KcN4)Vq8{PQjBPhqJZbIGrkt?2Y>bc3j`bLJ}+ zx>!_wqnD265C=84tRzmysxmek$obvhKN%ffQO=}9vDxRNPcQQ=CHuVol9;< zP;D_U-tCTo`$RE z(Ei-8!jYpxsLJ}Dchu&jt4@0N*z+0ZHC9b=%}Vz}wzeNL&}f}qH9Jatw(F6ghNz`< zGBDKC%*dss9h%1nA;-z+HVu`wn%qEK4OaIM9I?gLr%G8c+5_4j@>_B2q3}Z69R0*= z%^u6NmKfS@D{CE>hQI&50A2UU`kHIrEtAcmjc$H=bL+b{|NOa<-qbtk6P9bfQ}cyk z`BTUaPa%IC*(uPj<|#RBWtM0CJY_ii=Ltj4wPAi3+kUFFO%P%KFXA@}h2_6Nrt}>0 zMH7|b$<7qvM9CM;YX_jrK6V46tMxiWejFWod4_L-Q&^ry_(!CWKZrb)`zJb(@0*@lpRH#YNIeOvovq7SxyVEaMMGs--VUfNGJvy8{rkmwxU%g91nluJ7nXynF_E>~Hq zYad2prNQ%OPOc7-|8RKSXvcakh2?{gE1s}?ALPS2kRO{uz8~&2KM)S50J-Y5U7%~N z0bzHV#~zi!|4%!R{|&jyIULS=$W>ob$u*`A%U4p5hNh5z7x|D5gN25PY@_(Z~md5zTnSU=@^>17M{CknouIFl4o`vkt z6mrc8DE(%v#TOjR>2Wvgu{rR+(87|M)EOVz^pvBMjK&G-FIvWB#cgyPKR(wk&KJ+- zn;+&Fk=a{TR39&@tB&dHf{xdjHz_m8MPu{h(vdCO(cFBP89SP{F}L8);d=Xm?*>J7 zo=ojkpImew3uNns-w(Hdmp3+%mC)wTvD0bRN6WdKm^tZHtGCkf%6hILb|-Xauw6%Y z&GfYHjox;F;PcS_qvxq-DzAKV>zPR~8n7@V z#`5k2axp`vW?t0Mgt9`ZaN7$Fn z`WuyR^dc?enLflW*6RJOt9zgH;mjrsJ@3Q)i_Vv&>hFGxT=5iAD+j0C;y(q#lN-s{Ve4EJZJx*!y6p>eATmCrn`j}^!a)0HHpLt&?(Sts2Gyd zF3!E47cv^d%JjC-f_m4J@xS}{e7*7hef-_5b5pm)hV9FRyU^d$~uSA3pzlI(`1BZ3AMeDLMs^C@ii{(X2pd|wVepS?RDuGiO>zn6RT@p*q9efZwLkH`P+)9K64hv(6U z>+L>0;r8D25N#dW3Uz%rkr)Ua0v!vT0-X*OLDkT?&`K!!U?OoDcpY>rbU*Yb=r!oy z&%Zb_fNOWgkdodN?!@DuB*{7D4Ag zE1=cT@cR>qpMW<*cS661UWDF;K8G@?Ls`&3Xb3bCItH2yZW6korA;o_~xi7_E8#H^z^n{J6{e^>S|yW90$c5`z!i zmiTUTTjJY8wk3vwGm5q)9*%8G{2LPgJotBL(86trNsG26PKB02;)|eKXbqIUcw3?e zbRZ4 z^|nOh``Z!)@E;;u^_^{rU#vuL_`|>lR&7gs=kjgz-`f($U$-rh`{Qkim#!zyA8kv_ zhL?O8@?+O-OWb}H@jOG^FOmn)F@M^YSiEUlVn66m=xAga(1lIg63@Iz9Dm=Im=2AE zj)As9@4mY&@g6A3`iG^l;0j168kod;nU~9t_;C&=fVUE62G|4I4F5jV1%9jJWe>0m zMZbo&JKoD)2-#o9zNFLk#6FqZ6OTi`f(CZop17j(_C$G??TKvY{_fio$9LPF=nuXC zUUBO7#6KK0gWHqnb@(G^ZcqHpQ6-oMod+FOygji2YJzTtHbKjwA49J}JxjJHE{7h4 zRzY_{^PvXlLFivl-Tdu|o1n$emC$794Cs33S?Kfy+Y=W71nLAy*7M5ki9@g0p6KK7w5y0`7qnz8IzZlCNfPg6Ul;3BggFD*-M5gJ z(BB~O12=9@EZPMPdvbeXbdsB6llWcv{j$Fwlp@UYkzN1%_QYM!Qbx~hPaFabczJuG zv!j9F+WtEd83T7Do`d#x*vFw{9nqM*cO*p19Vwh+2DG|=1pej0I}*Qze!bt0#NQ#| zn*A+`-xd9S-yMm`_>Vcag$K0y+0JkJU8rz8@9{bpZ}M-+@p*T*E!>g#5E`*)N8%_b z_v#&qY0#OF_)@3=x&jJ*x+BpE+6NLp1Ud@JgL>SsBe55BFeH8yG!dE$T?AbL-QxH= zz(=8{p&zZ^k?0D&1Bt)P@mGU?fd>C#N1`7j{!s8h=w#?{=qShMf)k*Ax9&*fLqCL) z`N6l7KIlM5{L#?i(8IS;KEK+L_$#yx68{L4wqZx&`(V{?&o9)+C<%Xc1L0ybO!YE7c4#gB6Z=V9SNc6bBEsUQF8f_{UGQ5;3R+E-PghG9mKt> zFuh*8au@#ntN8o$3v~Rm%b##OU)TOoQk=WWqmh)!Kb-qJll*n0!#-c345MGcPjdWU zMy~;1A&xI9o8JkD+1v>`bIX!YPjL1Li^h>AN%W0dCX! zTfQrJG&CMMa^TKH96AY_4IK~N4BZAbI({QKZNSdNQ)6}}@{in^coJFm3~zRvC5;8n<8g_@xIppDR9pl2N~ z`^!oE)$lJQ+4cK9A^QW^*Dl$acx!Ph{`%aViQhu6L*lpHzB4i44vQ~=Pux#FJ+U+K z+2cDC`-0E^n>_rG-@&?%cAEFr;e9f5^p3eH-Oi6ELdN_Ue(Br|_MEeAyy2kkoow~k z=rH`d-{;d#zJ~oj#etJD=MX1pk}n zb2O)#wO3}4^`ExCY0f8`1(%`xHq`xwXpfkN{v`(~RjT1)>lXu2Gw6aRhHuORUdfCwI z?4TLh>Vv$D4_L9Wxq?kvUN`HOT`)Nr!M#+2(dGKs;?ScM9&IDgeE#U{>;(%K1wk`* z%|DLLEhrp1H+Q1kYz@hba7r6@+NvIOX(O9voMnY%5)KT>a*;*b%1n5}+sN`vc+{CB z{qiO$-f?YZ#&1p=S-$Z*wXMv!%WoqqH16iMl^J)%$kshYzSOu6RZ>re6SuVwEtDRr zt134qtC5Vh9!zbOEv>Got1QK?_F6~#b8gQ)_guc3jeKtZOq;%%x&=e0O*Hxxw~?J; z^eIc06llHZgXzx4HH8bcsKQlWco?e{R#P-$9 zv>NI#k&@FY3#HqqbaQ!d5_LPkGHyH zch2t=&n$K_`M=ZoKd4u5P}#I#--c6yzLBefa0r8j_q=F$*|@YJ>4PG*8T=aWR@}9* z^QO$E^yWxDXOZYTvj%1cks;lKAzb9!|HeMqS@GV*y&8LL>ekeyxf5>wZ~yJU%qs?I zjbMweu`Ke!hKv)Pr;%!O6&lhdKFW&fV+hTKE0& zpLdE4tM{qa?-^hxe(sTH{hkg=lVhh_`+%8t4K@ZU>mbv45bl0{;U_ z*Ynvpq_(vNl)Yl1wXXnWk90~8I=!V@h(FcC`Jn1(0rj$PH|o=X;4tmZ{j+JngACp{u==U2#zpE|I54AYGo4RDu)~9XS z6xW?eaVdW%h4NQAU+#47)+y+Ad8h2meA|1P{&7-RBl6kg(XjSuv-;S&-J?^`gF5DO z*7T`2Cg;2>`}wZyO_)R4hp99aB&DHO=b%?vsGLlW%$Z_pJR<>_)!0tUz$drvl6%Ji>?IKmu&)b zKpEecidR1*^hUqQ|9ae;zKgNRRP2r4jTp><_om6o8ZVBRa2l}7YycIm{752q!brFD zVWek_(i7>CIi*KBPvLl4v9b5;G^}TOmr3*?Mlz^(=h?l}O%04^6sI@&JjmalboK2N z^e*V0ZJyLko${4th2Ow$-iTX{UAoKYccatyB0p!Xe^W5t@95>$Rxsr{YtTD#xoBzW| zuwk{;@2wwLeY22BU-QghQv!M(g`Nd%^z7el3c9VJ2DZ^H(t*yA?wtddqpf3~?io|M zr*~SR62f1M@KmGQhSx3qD9W_JlwnrJMOo=xA_D{5_v|!<@?7D|6aPoye||gvoip3E zy>97K2(PA19m#feBt@NwxH$VM&h8n*(07v2w|D0ld2(l)Jn7Trs6OfD2@>yAY)4>` zeY;<@Z+hQ|c|x^G8Tp!-(b{KqOOK(~ozg4ZF5ii|b~(njOWA!p?7?9imD*rXV}{9K zxK66TRh~j`a|YY@)8>6MjGx1?%ZvjRhJH7GyU>1b^iO2f5uSIx&A1XC z4IE`uVyvq)vz=c)2&eo`J~F_ut^ zY2%8#GyVO3?fYz(e`cf<%D>2ft``kR?@hhpIoDF#2&-qO813TGmUhu2^CJ zg*iP%nMC?_J*sbduL4FI@h-)k8~r;(q<@!-`lt7d>>ae$cG_D#?d`2_$wvBjmfH_o zU7}Nu%osY{8P>r(;lk;1`k7Ht_&1YJquS?Fk1p+H-8u(tM@;B(_Wr@yWxay3hTcKZ zs;uDjwS9uT^?L=m_x26OZ|oNwvAKV6$d{k9HZ43uI#HK2Pifbqay4V{9XZ?zrU z_`04-Z`JjUL;w4_?%Q}Xe!bB%GZ<#)0>r8|sxC+3da6?2!5bE*8QF{_R(3roH;*`b zbw!%-w+fWG$Jy6ZT6f|8r`G%*_r9ZsP za!_fw*twyu%%-kf?&}J=wDi}?$1O>^NC)}NI=EE_^#KF1`#rNhe;RAk0={=<;=UM^ zS?%n;?7oqrO(@Q%3Gct{k9L=PrBSK-I4O-x?*xMn$qX88GFs}uh6bCyfD4*b-f@Rb z4)f1V3-Y;iNxuzRYCT^Biu(a5`K)u&%sc2jQ1(Vp<$5$>D=$xUar_XJxy9M-JjAky z<{>^w3-=0k9-??S`S^dqJcPW}Ro<{`7pC$3MNm=KVh3vThCqRW|Q0w|;wH=-jWc_P>Jq{afGReUC7| z3(CIzqBJuPvG2v!K4FzD>m}c_;ob_$JPAstH=TT&llOIL@XwyUp=S@{)s$mGwV``Q zFox-1yy}1VeM%EZ z=;plwjVsLzPUtx~$oHXcTq}Kt9)`YI89|RRj2DVq-)ZuYdm}vyv4{KbP1n(HK+3D1 zfHF5YyYD-5JLo&tE8Y&qcs{Q-g>=}AJ@y=cGm{wxh7=Qe#zXnd~x-%QwpY+KcwshNwB z%=eGM;pj@(S)lsqabUR4DQ?9p^hSO}Lvf$uh2VxK(oCCQ{V(v=PSK&T@JvR{^q~7B)e!EQc4OheN3`aP;u(rP8F>D zvnl5}+B@+mj(>wPnaE^kj<23Mn&*<=MU|$>V~9(0d}CVY_`-JI)+%u8jjGrA*vp*2 z=jWQ|ZG4+RzU6J=-VVytB9psIoE!3YHsyGuFUJR@ONw%QCn;W)0(;braz zU0%1FBUGFl6z7-B>&;0zD6h9*5BF=!|7zpg0B-n;<#XX>=7P%WCC*Lw-ErtxbaC&o zzK-P~^G4||#2$WzX1|ffosKrHbaG3-DaJy}MD=jF76z|VLnFpMG(2(vI>D{YO2k%}}k0NgM&GXyO7k4E0Z6JhE#V)a@MHaneG{>|!mIVhdq{<|%ouFfsYaLmx0*BdA9B!Htt5S`CZEog_l_jO8;8tCfxUx5?*q=$-LKLbx4P6u;(anOiSLp zZ{y7en_XOYyk~XT3d&u?x$))LyMwj-t57B zuto89&~~!MwN39p?8Tw@Hhj#p^&^|UuJAI0Koj2=jsFSj3&;OSacfTCO6=i2tMOC% z4JAcwhP?wF_V7{f=#$2ZOPP+d}?l)IS&Qq3|+C zf-atxwHW1hA^uavbABkEmDqDkNUdcX-%4J)aHqn{oCcbBI#?f4obM~n4(13tlKXbp zZ+vU|Rhx!l&o?o*>b2%SR+mj+qtj>9=T`PhP;KMapwY8~ccVJO{i1iHYm)R(+q(&S zPDqd9?Tm}I*?4w>G8xEBygfVB^W1nV`MJ^WIN}V|{r}dkd{VwlAS`b*Zk~rd?gYMX zC^jQs#>)~f0*f;F3{G~hXIQd|HlfRM9&HbR#{hYJ&3~pJ!QyFg{KC{N`*0N;x zWw;q$VQm4WYu1GJZ3(f-C!sg;BifF?94`c;k#zGcZ$u;IZ71w913}sKyZnX6qVtH? zj}yWuT@}ho+;}7I8tmb*X`D58nQVtyVBE!hewvMY6)0VrLDhuq&K}ljOA4KQzGWTX zs*Cb1iao5$h77Aq9Bf1n#rcZU>o8=>ha*7A2W6#S#5(JTT8mVf%_BSp7H0lmamww= zq&OAwYV4Y0lhN-AXG3RxVQ+-^^TcB=1Z5x8xAR4P)4NCd@+Rl!XcX5b#nq27s^6P~ z4nEGUp*VvR+OLB|yAw|r8^`3XHqNs_6K816Sn=f$Mz}5c_{#Xr8-*0dp5p{QjX6Ei zgJR-T_`g@&m`%0(fIcO)NyRXeB#<+~o# z@7qD;d3XHC9?sj0oYZ+c61g`DZ!Gp4C-7z1gnq@4!oA7qdaJV!+AH&-z0$jVm|RD% zR9t<{T&kI$`7*rnP3e0eNgw6g>)6Bj7Vq!!&0%9dn^UaH*1jZv@AP0D`Jwm@f|nTq${v2t>opbk? zw5=Op!_NmdxH#Sdm9P7{-=d(2JHgISQ`I0RIjliY77JGq~uJTb*QzshC#WOVsonxkA# zT;BAC*@(SaN@D~{$GSsp+Hye2mXEOZX0X|%sb;X1T?)$2g8i-igQ#u$c|)wI?5u`a0+fUr*9c;k<)A2bA%7nw8CS zV6+YYsl%Z$Cq zrV`(O`3|?I-K*?X*5lC4n=UYA*o&RO=WX^;Hmyx#ZQ8Ssw&mQ6T)%7pRqk=Hag23y z=8?7z)PpkXK)D%77?PY0s^&ieN`uWV?C`tMW6HbG{N(#dIxDP?v4{J|4d@t$R94>s zWmY?TNBdmYP9v_+^J!4XuJV+-j^ttgyR!RoXjI(j*bJ&%MxN5XjyE0a^3q{Gs63U? zFOB2c+Lgb`Te-;~JeBX7xP1@G!mpmEIgmHmP8L7L=G*T+BBXrgA~Wjpv-N~PMM{gOW&@zLS+=TE02{2Lr-nhLEKpE z;d&DsZ{yuGf&Sz;tIPiIO8>#2bXyF{oa^lD5gf*P^_cK_HS5^3kzXE`s}5}bECOd-{wg+9c#d>6Kz^*bF3_PqOCjAK&A0TP-*@Ulvz?m> z&fZad89DvS*Ox-vdLynBdsw&pldNu0aFdIBy7$})!4&h^xzb$$A)PZ zmxGN?r~0Y3&UHnmH1-CKu6;5u>XY7;c@V7#+WD4E(v$bk@Y?RyBppl)GuzL91k=-l zXr2xGc~EAXv)g^fQ#3MevjaKOh5m99^DyRg72}LdbB;0FoLwnPYkS5~`@H?SX`?;G z7||K8vdp&Ue|lsFJ<2#Uw8EW{$zt!bb_=(OnYeTgNGA*YIUsWe>0tKX&TOY=sGhTn=j=|A9R(IsfX?3wCqactcIQ98tHL{wJqY+y`G1G=Xg#}R1Xtrv7)fK#KW#9=?>)zM z3wm-6D$*?@=r-2qACL6w67(zW9P}&f6!c?#w%=Y^=G8%A$q2{IX{~b~oJAj+%RI~M zR@rvRCT0W!liYPHqW$5n%jvD|_C~f9cWdXi%ElpE#oYkIll)FXHW0r$3+~P268M~q zpgBqQIw8?^bH&T zVu!07{@7uUGwkoLf74>VvtR6Rjl*>gUv>C^bAO$~6%OY+JjLN-&i$IW|g!1-^Ws~Wo~xp<@<;1d(XG-J_zMkvy)%xaFxS_4i9zM z$>EI-3tjkehqpR;qr+z$u6Dn_?(A1P`^Qd?|8erk4!!<&dbxA&<;9`=+2HcU|9-Wz zU+l2L;XH?<9cDQU9RA}>n?KJve8Axy4p%sQ$hjZs?7bYOIeg!h&tDxr=djV?%?{T( zEOuDnaI*`4tg{byIM895!y1I9( z!n$JS{KYt%72_LC<#qaInDu=UpU;#>{E3}bwXnLTvZSuOx@yug`;8EV!msXQGWj*t z3-}&3vYC9!)7kj+OU&GdLu_qg$DfaJa;$biO?ezeXYzp{a~sRF+S5xa%1dXJm%2FG zyPaIJpu)y~dUZv8Wh}p>u53n0rBPX0O|B_l8Y^5DZ%sp0NriXhQ{d8PLr6-Y3_`e)h*FyFlMasVl6W#rMtSVp49+vUuIe zv8n<-vQk}%#O8HN1iqvuE{MrJ>Bx&!EvhSXIgwi(UuIe59~o3Xe`0-IS+xo-x0+9+ zSU;g(6q1c+POPHh)GEHiZ%T-`j71ugA1%c^9)*UhYQQtY`E)wQvfMn~*6fLV2X0ZrfZDXFT9 zsluR(i+pOV#Edb8C)JoA1Mvkh703eXb|%X5>2bdKSrDtOuTbroLsg2Yy~F2M*Vdg@ zAFGd*=2ln6D`INQv_4K7AK|uXktX}e-*)9`oVU78E-hQm z)9bm|YocNE)GI(Iej=$@J>d`U+FmRNADxpL&hc%_A#TI)%@C#Z}{MwXX@r zn^5e>)smlVT{Ed^xg~KvX%$ob(4B03B+IL=UQ!=FslIA~g5eukH9XutPS2|@L5uk{ zB{j<^ryrzzB zV|Eo8LqktbC!ASzrM{64vuUoXt*(fXP@2<-B+1PBx_EtEF7J#7WweA_SnVSViaMEk zMsnnTPEabpQ>vDh*Hl+k(g~ejQd6$#F(>%Bez7@eqekmZ5qdBl)zj%xN){<+Z_ZFn zYzZ#7G3<++Sdl@qtXY=N_m<_G=1jkFc73dB!Ls1OcE6dY4G-&nCf&tdC9AOxpQ zDVQ-O&)1_~K~Yg|L&Hfm6tF8tZXi1@sEk!EsH8eiFkGB+IbK|4_0m{yg1Fik^|p(A z7uCjN3(6OkFDNQAA0}gburG23D>Y<9k-i3JstI4ROd&0z+M612dTzn&8HLlPPdQ?& ztF=3Wc=b8V>lD?-%8C}2SMUinLW>2HB&jQ+TP&($_`sJ|izKM8jVVw0P8=Ex3>5If z@$lmQQu z(%|0AS+Tm=Rko(Lc7gaJ{q*qvzuA*Hpm{i%HizG==)d}JXJ-E^FKrxq|66;ty(hPZ z4>1Uqn_YJOu7wQheb?`#nFZckwPh8O-1^fA0} z$+xHpgE9>+hgTYfzl8cB7bc*=@WT5qWW5+(c=r|b=kUTA>p2evFFfWK?C*mY9&{_` z;NXR|w-Y|RaP%EkEF#4?|7x!al#TyzmG}WhcDw zZt@d1!XMqkb8??dgBSdkCpo-u?!7jA;hFc5F3G_Jr26p4?}Ffs`)xT2yFXyV7asc% z^Y^$He!r1&ffr7C#MT+%wUF}d_u!J>vrdW|;q=E?BZL>ud4jTo7asE@_aeg!=RztA z;Ts#7w?!`e1d?1h`wvzhVJ#%NuL;cy8Is-oUcbiwjo445V6}|^4&yRYS{aldpL|6kU zOyRE}=^$MBzI7w~Gc=I!-vB>=3kUX&n6@mO+y{5~6@H^{#MC$8w0@DG4!^>j z{+2fgul)ZB*k$iXuo5@I-$F|Jzrk|{pda}o>@hGBti_G+Vdy4!;g4DQR{asq;KSwO zg^%wW3GTv;@U?>?!PD@<%EKb2%?huDq=WF!ju-YGY4c$p@H|LuU-*jS-v;N7LQle+ z!pDj4g__}oe}|NZ!s&-worS9)#U&h=9WmuDJOh$E2L9!Uh-u@(Ek{Nu_{<<}Y$O;1 z$;~|QFOL7a_@g4GKlwX2`WVaCg26cJUO3b7!WE7e-r;y*doK5fX;7yRq?iXOQllPqv366l|SD1agEtf*@VMub}jE zDy3lc+1HV(@uX2W=ys53dcHL7O;m;f|eA)5B{pMKr+vZQ6xLKnh=22Py3rgZDs6qwqaQc`mH~24x8^ zycv>T;d_vA1LmF)F=G$mPaQ9O9#WXXZr`-LaH8W4I=%t?jpLsJkDF)17uG-uM|ivA zg)c!WN8yGuZCZpMK+;n<@+`{>t048y!k;*~u&KzlW#K1~{0e6m+wg^(Ak|gjsU?;d zJ_3~@e-#`spZX0iEOfl^GRF&_alEkm0_$GbvlRXDE9@P!ys*zg%M1H1vb=Cx8G7PA zw>%P@11W!mzjVCt4aW=nF1BujCp%ua3|dDx!W*IW@WL0M4e-JboLtyziIodSL-H#u zhg2VgH#uJThU0~UDrr-=5uOC8EQGa=7vAD{;nR@PCH%MJg?m?7x$rp03yU2uycSa3 z5Webo;ecu@7Zy5Rc$wpcS#j$|_(R7Fd!23N!ex#ZZgsqHP>t2?XmCArFZm<5p);@*?_;i-~K$OoP9MkHYJo+FyS+5)2m)z5q>t z*Zs5~LwWGJ8}^>>@$B9oH{i!m4t&lfk>CbsJ^TjnzDpgyntJ%dNU#yP?rL2FZGjhV zh2&oN!!^`-(jt5qQhnG2_PvZg^MFi)li`&o!m}>tnNFSv)2^`ntuPl-IKrPodRJNp zj=VAw0_+b5d@*I90_`t#=8a_cPHZ(+~j~ig@(hg1OEw0pJp)oF5Dp({u+||MsVWYmd^(_IbJyX z9xE>fn;b7J`K^`5!Dhz`&%W1%30`u)&BHa|r;ze3`T);XNcpx2ob`}(Qw%-=%|)M0 z;M)&V7VypBp^a9a4NiK*y3Yr~4eCF^r#4$&`0ZEFa|rLz;ATkmR=D@8ww?tp<&wW52cp&coMZ0JwO!yPP zlmCtW@WMJsIt$-{^v)%We`xbrcn73B5jK2e%S(7Cr13x#_`7YiXTp3LOy6$Z3m=5^ z-Xwg@$@kttK6g$FHsW6RX16rcZwQxgUils5!qfIj3%0`xABB1x#Je+iRlhXT7YRQb zm=+91eiFOqZ-C@R_`v>Y!8mx~&I7ndkoqsYHkxMod|}^1xMPhrCHxO0H^RITmKTmW z)aoF722vj=96l1igfINps5H~B3VR&^k6iduNPU7ZdyM6U-NxGV3O_nJEjSk+Y+PD!8zg-;fhQen^{fJ4A8+Nt`;SWt*5Fq-V}cD|c;E5Xjd1OWR%hY+6K%Z0 zBXg}^;q@n_1?vb$xcTHX)6aC7nidqyA|H_pe+H>9y&EhkOf&uVgW$*#{NN@Imd)p$ z3V31l0`8(5nrZOS^0Z(eyl~m#v|uj0?z+|8w{`GB-G93lUU)XN0e(674s;js>i*f= z&rS<+hVhI5UxW(bbvNw+HEF>-_&9h}EoFmy-5Gli^fYqaA)A1j;DfrfU^=vwXS(iG zUEe_2988$t$50`>?qMy3D&Tb&>kH6Ic-_Z3`P{VN8hG8wdY1^k5!BtEbBR~j?-J5= z2+soW`_MJ;x+nB)=w5i;6*}fp!iCp;qAQ_hxdFFAJ%*#h>a<`EG#p-ck=_YShHnJ> ztVs)sNAQdT54fEAL!HqbnSZ;2a!0OvFneD~e!^#g(;+=)b!X*{A5+H;CH$+>f>BTz zd^R}zy0qXic-_2EywO$5(GAPvCW@vqy2 z_u%~-Y+Y&uFa0(3VI*k;-?)oBf^PzQ-DB%#7C7m*wp?`QV&=V+3vP4=<76lwUiTqZ z+(+Ah*Zqh$K~KZ$zQS+bPZ~y%SK#f?WO&^tsCxz1!3&Rn2tDC-*WV3~kgn0V0h^$4 z@WOxoJ}tNsz8S1|%+|d)xEWF&<~&Y*LrRP8-Mi%p^ieqA6VPMuo4~`KwDm#v)qVa) zc<$H>o}yks=fmqRyZfLk;dRel*QW^wUU%KqL65=fPC4BzSC~z@K;8XT2QT~#dI3Jz zlokwuw!rJow*Jqi1rv@S|G|k+KKyd@57v?)&s5{H#MyNZ?GPqYvxC0ujJI7v03yyn@GE%vK&qC@mb-&oTen+M2UUzmq2(5(I9bQ|YYv6TH z*5O;I+wi(SYZ)|9cWZ%vfU@D^@1_O6hStOD{;I3~fu8WX*Xki?BfRdmdJ}pNm~gJ96C#wGC>55B{ANT=b#s6V`xRAw7e# zK1vHNfYe9nKBb?1%w0OikSCz-INA&^y!TV|A4izr2T(q|?jAbjGwMIQ?jkxHYJ%5Y zL1kO1566;T@G@vByzb~({U7oQUU&CwgdTv`{XN6BkzRP+qw`Jf&Y3)(du!`; zP$RtVEIFb_dNA+=^ao3zY`#Z*P zCr7iw0hd5MP9z-g=g?qy-S@E_8VRpEK?Xw;;B_y^8BiX)?%#M3dI!D<9KwATTj6!z z#nOJb$)TQr_d})djbNYtoS}q|f)&vD@VYzW8fX=~?u(eTH|NAAQs2NEptbP2)8QoU zP-vDM{0WpX3HRWOP!D+BvGB`*gbS~`7v6(b!R!8o8crjwh1dND)AvD7_lCPyzVQQ4lRe*{RQ8Ku7uZ}23JDYz^?<}gj9cY=KotG$S=78{|-ebBL|P-ln<}_1Kx$o%E14zwM)&WHCpg7lt@d$16an_}=e$h^ajNe_Mt=^a*Q zrC%AF9u(tVXR8l7iadeO21}u}@H$hy9@+rE0o(#@gl`6i9!*=2d$1JRD)-6Ay176Cx(>i#aWqlL65?<$9_s=Em@H+FVv!V~c3+pGR2gP}m zFR1gR4e-K8p_TADyV-}clg;ot%Xt#iV>*7p252z6&Q|`Avx}?Yb=LA;Xg$2nGcKJ* zotc3f@K?}ac%6Ct92yC)bCAQK3GmtAOQ+I~c*Zq>{qt-+*BQm_&~0)*Jv}%adQ9%Y z<&erq_&TJy1!4LO^x2ztb8r}>cWvPhocukoZ$5cDh;)IcL-H%U1k(GdFzqxe?+1>7 zBo_`Vpnl{2IPgD^=Er)?qRm1I=a1kgklYU|r0qhI{|4+f+w#K2jz15)(ec8kA%!pO zdAfBkoDC_=mEhx!7jAdFaNZp2z7qTeB=^FnA?1m1=3L5xwAX@nLXrz7f5W;L{>t&f zx6UBUnaqoVL%wO<3o9V$*#Q0=QW`tWOAn5M#Fv5BLJI#C@PT6Td@$!67tm)y*@P+F ztJH=gEQ91;cu$OHDrF~(EVSh%917*&cO3W=NO1`dU1WLTLy*c>_$H(1OYQ@Gp?U7v8;uGQf>+O$B`r;m@p0 z555a29O1i=;`#{Ouga!fI0cd$VTI#`mpEQ{7o_?ud>2yw3wu{v9fpB_jMImpgYcNM ztsCL*AngYbHq_9@akCuEthMn9M?um}cv~HP2=0ZiK&BkQ6YH&e;l`!5jD-81W8)I` zX|Q?mcnn5H>+_BP_n0zC&?=DEAam~##Jh#TRPkk)yh1wVkKr|=us+I$nf20e}Ye}lQ#*}M{NfV4It%(~u|-9T^+ zq_w2qfHT(FdLn$)@xp;O*tmqJJ6?FD!Zy_&;S9te&$^!l~aK~e?Y4+FdW%DNZc z4QV~=ci@G;Vcc~ZYh>UZko-Ohj=am3g>V)m-GpaDa`PiF0jW+3pS;`Vp>XeetXwz@ zl6&D*kotV#GxymxEM#gA29g_L%<;k>I$rn-NIDDu z?Bv2V57_5|@U;i6p2D6F*)WCILW)=TH%RUMb8!EMt^6QxA|xHAf@eHNd60*~(kG~^ z@V9_RJZbY;xc^3*KfP5I7Z*8{zjIe_>yI|ygawfL zPvI-CFwR2<;nY`MIAA@beo1%(WcniTRY-9OcQ{`7*hj=gIKu6a+z1c)*tR?2>`!cd z3ge%Wzqr2;{Pt(ojqvmTr@gZYncXVmc&H-;6^+=|py*Atty8@hq6-%1rPp>xd$E!_D|BlzA=!f__i1JK~ zUcKIHh`)p=55%Yb2_Ik+e-GWmxx_ELem$2MJ%GQj$MFWd{g%!0Ox^*12K6{TfUiOW z?AO4THdp%|_(O<%ApUx_NANl99dJf_;$4W^9Kdg{_C4^At9=2#jC};C|F3`#Vjltd z^Vk~z+(C4lczd<)fZtke27U*k{#)=%*y};Vxgq#6M92RCej0laki7?U=oz#rz-hIK zkG}nS{3iGl>|bD@P4~`?@O{XJJ%Yc54zMrat#=_#}v194qD#pfloe+KJmU!1D}VeJ<*50i{lOWw)bA!6Q6`AMh*Nc zL~R6lBiw-KTm{^%wg%pXs131P?FRfQMDL>q@J|q(OMC^pZ$5+fWyD9`cRg1HZ$tFn z&<4HLZoof7ix2o7%uhnpMgva}eU8Aumm%uE1AnvHBS_z!Nymww!uMr%bT0TT^b6R; zI}o+8!LO}0@dps)VF3TK9#=lF5mJbrjW^)k4`M$}#BPI+-oTy?h*t%_2~iscKBpl6 z=-&iigy>pFuv=~7tw*l;SHYh{)aM9({X?h;iV=Lrhp&ASUm%;V3qJH1Y8B7=6z~pY z!X|zXqBb4)#mBETV1f^SU-PPy%QVV;`1@xscgV{{*WN-F%{@$N`CujpFJcUivM`ql|O2U#h84`or+~tf9 zeBy`vn9HS7ZcDY?m0GEn$BI`?g$_;BJD@YgYdp<2eA{<@=C}UfPreYy0S~(199*u~ zKpZ1ta3dDAQ5T(~F`6SG7UMP+lWn3VdP0%82}fK*az<=ZazT9f4;x(LI^T1Ho7{qL z2k!6_{A+o~dw6-~BRswEnIF<)%F`}Ary?qaPRJBJnM65G_S2q++U|UoF*BGZhh?fv67u6<3eAwo4>d?jnXhpYnZS z7Ixtj$AT42(G^267MDW8=xU{1p30`wD;nRf+W)(LjvIW2K)#>Yz_y;@*`Dh$uk{3< z;?Vt*-}p*k22Q{*;$tvj%=NHE-AQ#Ul8_}Wwi6o1Ggq@d+acpt zZs&*p$a$X+`FY8_P>6+E=tW<{5r*{+5SYf!?7~#<=t=%AaDzFJFjFp}h%2cvkGt4O zx@5;Wm$EIgbi#=D81FfgmaEa|&beF61;wwI6!*EhRAQ~vT8$4d1cuAVh?_BvYmJya zq9=Kpr+a&kqv~6)^LlUa&Yptn^KgnNE#afh0|BwH@7V`rvL z>ZUBkL;9uat`&Db2QDJNeowv|s2BkwvLiRrVgs{mmuQKRn8{&TJBDR`iJU4+#r(1`=Q%2Df`>e%d>NUH z%I|ZdaEl&QGL%y(RB}Ztja507f%OFr47eXGdFq*kk=UXpcD{z1*ac>ISmwRFR5i`} zJ{mCk2J+J^^(`h6=8Cec0Ov%-9Jeu(SvoBqxEL=HHSFdsMoNPp1N_)8mD-kF*_RsD zyuQ+xwGK{<_iNQ;Gn2e6#)|57Ui`9r$8UmdXoO~HEvu0ljj@Gn%!!(gshzo47h0?Y z8fHJkd=XG{c5%X7=`mC0Wv1*)t8^9*`f@DiQmVFQMLfSkIK3%e7V| zwnepC%t0+RSOLb>yZfH?{yDIhb%4gJMUJM3MvK-&8ZjGV<|Id~`V8x1^TrB!T_15B z0k7BTa@AZ}wSyYLFVb7_m&gFFt+E}iudnqhdxDMUFZj13YuU+z@#fF}RR;bAsJxk& literal 301056 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 z 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≦̸S3JNsTM3qvN*6U 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 Option { + next.fetch_update(Ordering::Relaxed, Ordering::Relaxed, |current| { + current.checked_add(1) + }) + .ok() + .filter(|operation_id| *operation_id != 0) +} + #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum RegisterError { Duplicate, Capacity, } -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum CancelDecision { - Canceled, - TooLate, - Unknown, -} - -#[derive(Debug)] -struct ActiveOperation { - cancel_acknowledged: bool, -} - #[derive(Debug)] pub struct OperationBook { - active: HashMap, - tombstones: VecDeque<(u32, Instant)>, + active: HashSet, capacity: usize, - tombstone_ttl: Duration, } impl OperationBook { - pub fn new(capacity: usize, tombstone_ttl: Duration) -> Self { + pub fn new(capacity: usize) -> Self { Self { - active: HashMap::new(), - tombstones: VecDeque::new(), + active: HashSet::new(), capacity, - tombstone_ttl, } } - pub fn register(&mut self, operation_id: u32, now: Instant) -> Result<(), RegisterError> { - self.purge(now); - if self.active.contains_key(&operation_id) - || self - .tombstones - .iter() - .any(|(existing, _)| *existing == operation_id) - { + pub fn register(&mut self, operation_id: u32) -> Result<(), RegisterError> { + if self.active.contains(&operation_id) { return Err(RegisterError::Duplicate); } if operation_id == 0 || self.active.len() >= self.capacity { return Err(RegisterError::Capacity); } - self.active.insert( - operation_id, - ActiveOperation { - cancel_acknowledged: false, - }, - ); + self.active.insert(operation_id); Ok(()) } - pub fn cancel(&mut self, operation_id: u32, now: Instant) -> CancelDecision { - self.purge(now); - if let Some(operation) = self.active.get_mut(&operation_id) { - operation.cancel_acknowledged = true; - CancelDecision::Canceled - } else if self - .tombstones - .iter() - .any(|(existing, _)| *existing == operation_id) - { - CancelDecision::TooLate - } else { - CancelDecision::Unknown - } - } - - pub fn complete(&mut self, operation_id: u32, now: Instant) -> bool { - self.purge(now); - if self.active.remove(&operation_id).is_none() { - return false; - } - self.tombstones.push_back((operation_id, now)); - while self.tombstones.len() > self.capacity { - self.tombstones.pop_front(); - } - true - } - - #[cfg(test)] - pub fn is_cancel_acknowledged(&self, operation_id: u32) -> bool { - self.active - .get(&operation_id) - .is_some_and(|operation| operation.cancel_acknowledged) + pub fn contains(&self, operation_id: u32) -> bool { + self.active.contains(&operation_id) } - pub fn is_tombstone(&mut self, operation_id: u32, now: Instant) -> bool { - self.purge(now); - self.tombstones - .iter() - .any(|(existing, _)| *existing == operation_id) + pub fn complete(&mut self, operation_id: u32) -> bool { + self.active.remove(&operation_id) } #[cfg(test)] pub fn active_len(&self) -> usize { self.active.len() } - - #[cfg(test)] - pub fn tombstone_len(&self) -> usize { - self.tombstones.len() - } - - fn purge(&mut self, now: Instant) { - while self.tombstones.front().is_some_and(|(_, completed)| { - now.saturating_duration_since(*completed) >= self.tombstone_ttl - }) { - self.tombstones.pop_front(); - } - } } pub struct ControlOutput { @@ -186,9 +124,9 @@ struct BrokerInner { namespace_id: Mutex>, outbound: Mutex, inbound: Mutex, - completion_order: Mutex<()>, next_inbound_id: AtomicU32, worker_count: AtomicUsize, + outbound_runtime: tokio::runtime::Runtime, } #[derive(Clone)] @@ -200,6 +138,11 @@ impl Broker { pub fn new(output: Arc) -> io::Result { let identity = current_process_identity()?; let force_shutdown = Event::manual_reset()?; + let outbound_runtime = RuntimeBuilder::new_multi_thread() + .worker_threads(OUTBOUND_RUNTIME_THREADS) + .thread_name("xc-peer-outbound") + .enable_all() + .build()?; Ok(Self { inner: Arc::new(BrokerInner { output, @@ -210,16 +153,16 @@ impl Broker { server: Mutex::new(None), namespace_id: Mutex::new(None), outbound: Mutex::new(OutboundState { - book: OperationBook::new(MAX_ACTIVE_OPERATIONS, Duration::from_secs(5)), + book: OperationBook::new(MAX_ACTIVE_OPERATIONS), cancel_events: HashMap::new(), }), inbound: Mutex::new(InboundState { - book: OperationBook::new(MAX_ACTIVE_OPERATIONS, Duration::from_secs(5)), + book: OperationBook::new(MAX_ACTIVE_OPERATIONS), responders: HashMap::new(), }), - completion_order: Mutex::new(()), next_inbound_id: AtomicU32::new(0x8000_0000), worker_count: AtomicUsize::new(0), + outbound_runtime, }), }) } @@ -242,7 +185,7 @@ impl Broker { Ok(false) } CANCEL_OPERATION => { - self.cancel_outbound(frame.operation_id)?; + self.cancel_outbound(frame.operation_id); Ok(false) } SHUTDOWN => { @@ -344,7 +287,7 @@ impl Broker { .outbound .lock() .unwrap_or_else(|poisoned| poisoned.into_inner()); - match outbound.book.register(operation_id, Instant::now()) { + match outbound.book.register(operation_id) { Ok(()) => {} Err(RegisterError::Duplicate) => return Err("duplicate active operation id"), Err(RegisterError::Capacity) => { @@ -366,71 +309,38 @@ impl Broker { .try_into() .map_err(|_| "target token length is invalid")?; let inner = self.inner.clone(); + let runtime = inner.outbound_runtime.handle().clone(); + let deadline = Instant::now() + Duration::from_millis(request.timeout_ms as u64); inner.worker_count.fetch_add(1, Ordering::AcqRel); - let spawn_result = thread::Builder::new() - .name("xc-peer-outbound".to_owned()) - .spawn(move || { - let _guard = WorkerGuard(inner.clone()); - let deadline = Instant::now() + Duration::from_millis(request.timeout_ms as u64); - let result = outbound_request(OutboundPipeRequest { - address: &request.address, - target_token: &target_token, - sender_instance_id: &request.sender_instance_id, - peer_frame: &request.peer_frame, - identity: &inner.identity, - deadline, - cancel: &cancel, - force_shutdown: &inner.force_shutdown, - }); - inner.finish_outbound(operation_id, result); - }); - if spawn_result.is_err() { - self.inner.worker_count.fetch_sub(1, Ordering::AcqRel); - let mut outbound = self - .inner - .outbound - .lock() - .unwrap_or_else(|poisoned| poisoned.into_inner()); - outbound.cancel_events.remove(&operation_id); - outbound.book.complete(operation_id, Instant::now()); - drop(outbound); - self.send_operation_error( - operation_id, - "PEER_WINDOWS_OPERATION_CAPACITY", - "peer broker could not create an outbound worker", - )?; - } + runtime.spawn(async move { + let _guard = WorkerGuard(inner.clone()); + let result = outbound_request_async(OutboundPipeRequest { + address: &request.address, + target_token: &target_token, + sender_instance_id: &request.sender_instance_id, + peer_frame: &request.peer_frame, + identity: &inner.identity, + deadline, + cancel: &cancel, + force_shutdown: &inner.force_shutdown, + }) + .await; + inner.finish_outbound(operation_id, result); + }); Ok(()) } - fn cancel_outbound(&self, operation_id: u32) -> Result<(), &'static str> { - let _order = self + fn cancel_outbound(&self, operation_id: u32) { + let outbound = self .inner - .completion_order + .outbound .lock() .unwrap_or_else(|poisoned| poisoned.into_inner()); - let decision = { - let mut outbound = self - .inner - .outbound - .lock() - .unwrap_or_else(|poisoned| poisoned.into_inner()); - let decision = outbound.book.cancel(operation_id, Instant::now()); - if decision == CancelDecision::Canceled - && let Some(cancel) = outbound.cancel_events.get(&operation_id) - { - let _ = cancel.signal(); - } - decision - }; - let status = match decision { - CancelDecision::Canceled => 0, - CancelDecision::TooLate | CancelDecision::Unknown => 1, - }; - self.inner - .output - .send(CANCEL_ACK, operation_id, vec![status]) - .map_err(|_| "control output failed") + if outbound.book.contains(operation_id) + && let Some(cancel) = outbound.cancel_events.get(&operation_id) + { + let _ = cancel.signal(); + } } fn finish_inbound(&self, operation_id: u32, payload: &[u8]) -> Result<(), &'static str> { @@ -442,16 +352,9 @@ impl Broker { .inbound .lock() .unwrap_or_else(|poisoned| poisoned.into_inner()); - if let Some(responder) = inbound.responders.remove(&operation_id) { - if !inbound.book.complete(operation_id, Instant::now()) { - return Err("inbound operation ownership is invalid"); - } - Some(responder) - } else if inbound.book.is_tombstone(operation_id, Instant::now()) { - None - } else { - return Err("response references an unknown operation id"); - } + let responder = inbound.responders.remove(&operation_id); + inbound.book.complete(operation_id); + responder }; if let Some(responder) = responder { let _ = responder.send(peer_frame); @@ -511,10 +414,6 @@ impl Broker { impl BrokerInner { fn finish_outbound(&self, operation_id: u32, result: Result, PipeError>) { - let _order = self - .completion_order - .lock() - .unwrap_or_else(|poisoned| poisoned.into_inner()); let send_result = match result { Ok(peer_frame) => encode_peer_frame(&peer_frame) .map_err(|_| io::Error::other("response encoding failed")) @@ -531,7 +430,7 @@ impl BrokerInner { .lock() .unwrap_or_else(|poisoned| poisoned.into_inner()); outbound.cancel_events.remove(&operation_id); - if !outbound.book.complete(operation_id, Instant::now()) { + if !outbound.book.complete(operation_id) { drop(outbound); self.report_fatal( "PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH", @@ -558,15 +457,21 @@ impl BrokerInner { fn allocate_inbound(&self, responder: mpsc::SyncSender>) -> Result { for _ in 0..MAX_ACTIVE_OPERATIONS * 2 { - let operation_id = self.next_inbound_id.fetch_add(1, Ordering::Relaxed); - if operation_id == 0 { - continue; - } + let Some(operation_id) = take_operation_id(&self.next_inbound_id) else { + self.report_fatal( + "PEER_WINDOWS_OPERATION_CAPACITY", + "inbound operation ids are exhausted", + ); + return Err(PipeError::new( + PipeErrorCode::Capacity, + "inbound operation ids are exhausted", + )); + }; let mut inbound = self .inbound .lock() .unwrap_or_else(|poisoned| poisoned.into_inner()); - match inbound.book.register(operation_id, Instant::now()) { + match inbound.book.register(operation_id) { Ok(()) => { inbound.responders.insert(operation_id, responder); return Ok(operation_id); @@ -592,7 +497,7 @@ impl BrokerInner { .lock() .unwrap_or_else(|poisoned| poisoned.into_inner()); inbound.responders.remove(&operation_id); - inbound.book.complete(operation_id, Instant::now()); + inbound.book.complete(operation_id); } } @@ -657,10 +562,12 @@ impl InboundHandler for BrokerInner { } fn server_fatal(&self, error: PipeError) { - self.report_fatal( - "PEER_WINDOWS_PIPE_CREATE_FAILED", - &error.sanitized_message(), - ); + let code = if error.code == PipeErrorCode::SecurityContextLost { + "PEER_WINDOWS_BROKER_SECURITY_STATE" + } else { + "PEER_WINDOWS_PIPE_CREATE_FAILED" + }; + self.report_fatal(code, &error.sanitized_message()); } } @@ -682,6 +589,7 @@ fn pipe_operation_error(error: &PipeError) -> (&'static str, String) { PipeErrorCode::ProtocolMismatch => "PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH", PipeErrorCode::Capacity => "PEER_WINDOWS_OPERATION_CAPACITY", PipeErrorCode::ShuttingDown => "PEER_WINDOWS_BROKER_EXITED", + PipeErrorCode::SecurityContextLost => "PEER_WINDOWS_BROKER_SECURITY_STATE", PipeErrorCode::Io => "PEER_WINDOWS_PIPE_IO_FAILED", }; (code, error.sanitized_message()) @@ -700,50 +608,36 @@ mod tests { use super::*; #[test] - fn cancel_ack_precedes_terminal_ownership_release() { - let now = Instant::now(); - let mut book = OperationBook::new(4, Duration::from_secs(30)); - book.register(7, now).unwrap(); - assert_eq!(book.cancel(7, now), CancelDecision::Canceled); - assert!(book.is_cancel_acknowledged(7)); - assert_eq!(book.active_len(), 1); - assert!(book.complete(7, now)); + fn active_capacity_is_released_on_completion() { + let mut book = OperationBook::new(2); + book.register(1).unwrap(); + assert_eq!(book.register(1), Err(RegisterError::Duplicate)); + book.register(2).unwrap(); + assert_eq!(book.register(3), Err(RegisterError::Capacity)); + assert!(book.contains(1)); + assert!(book.complete(1)); + book.register(3).unwrap(); + assert!(!book.complete(1)); + assert!(book.complete(2)); + assert!(book.complete(3)); assert_eq!(book.active_len(), 0); - assert_eq!(book.cancel(7, now), CancelDecision::TooLate); - } - - #[test] - fn active_capacity_and_tombstones_are_bounded_independently() { - let now = Instant::now(); - let mut book = OperationBook::new(2, Duration::from_secs(1)); - book.register(1, now).unwrap(); - assert_eq!(book.register(1, now), Err(RegisterError::Duplicate)); - book.register(2, now).unwrap(); - assert_eq!(book.register(3, now), Err(RegisterError::Capacity)); - assert!(book.complete(1, now)); - book.register(3, now).unwrap(); - assert!(book.complete(2, now)); - assert!(book.complete(3, now)); - assert_eq!(book.tombstone_len(), 2); - book.register(4, now).unwrap(); - assert_eq!(book.cancel(99, now), CancelDecision::Unknown); - - let later = now + Duration::from_secs(2); - book.register(5, later).unwrap(); - assert_eq!(book.cancel(1, later), CancelDecision::Unknown); } #[test] fn rapid_successes_do_not_exhaust_active_capacity() { - let now = Instant::now(); - let mut book = OperationBook::new(256, Duration::from_secs(5)); - for operation_id in 1..=257 { - book.register(operation_id, now).unwrap(); - assert!(book.complete(operation_id, now)); + let mut book = OperationBook::new(256); + for operation_id in 1..=300 { + book.register(operation_id).unwrap(); + assert!(book.complete(operation_id)); } assert_eq!(book.active_len(), 0); - assert_eq!(book.tombstone_len(), 256); - assert_eq!(book.cancel(1, now), CancelDecision::Unknown); - assert_eq!(book.cancel(257, now), CancelDecision::TooLate); + } + + #[test] + fn operation_ids_stop_before_wrapping() { + let next = AtomicU32::new(u32::MAX - 1); + assert_eq!(take_operation_id(&next), Some(u32::MAX - 1)); + assert_eq!(take_operation_id(&next), None); + assert_eq!(take_operation_id(&next), None); } } diff --git a/packages/core/native/windows-peer-broker/src/main.rs b/packages/core/native/windows-peer-broker/src/main.rs index bd5d341..b0fba68 100644 --- a/packages/core/native/windows-peer-broker/src/main.rs +++ b/packages/core/native/windows-peer-broker/src/main.rs @@ -29,8 +29,8 @@ mod windows_broker { use crate::lifecycle::{Broker, ControlOutput, sanitize_message}; use crate::process_peer::current_process_identity; use crate::protocol::{ - Frame, FrameDecoder, OPERATION_ERROR, SECURE_RUNTIME_RESULT, encode_error, - encode_one_string, parse_secure_runtime, validate_node_frame, + Frame, FrameDecoder, OPERATION_ERROR, PROTOCOL_VERSION, SECURE_RUNTIME_RESULT, + encode_error, encode_one_string, parse_secure_runtime, validate_node_frame, }; use crate::runtime_acl::secure_runtime; @@ -39,13 +39,15 @@ mod windows_broker { let mode = arguments.next().ok_or_else(|| { io::Error::new(io::ErrorKind::InvalidInput, "broker mode is required") })?; - if arguments.next().as_deref() != Some("--protocol") - || arguments.next().as_deref() != Some("1") + let protocol_flag = arguments.next(); + let protocol = arguments.next().and_then(|value| value.parse::().ok()); + if protocol_flag.as_deref() != Some("--protocol") + || protocol != Some(PROTOCOL_VERSION) || arguments.next().is_some() { return Err(io::Error::new( io::ErrorKind::InvalidInput, - "expected --protocol 1", + format!("expected --protocol {PROTOCOL_VERSION}"), )); } match mode.as_str() { diff --git a/packages/core/native/windows-peer-broker/src/pipe.rs b/packages/core/native/windows-peer-broker/src/pipe.rs index 79996a3..273468c 100644 --- a/packages/core/native/windows-peer-broker/src/pipe.rs +++ b/packages/core/native/windows-peer-broker/src/pipe.rs @@ -1,51 +1,45 @@ +use std::ffi::c_void; use std::fmt; +use std::future::Future; use std::io; -use std::mem::zeroed; -use std::ptr::{null, null_mut}; -use std::sync::Arc; +use std::os::windows::io::AsRawHandle; use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::{Arc, mpsc}; use std::thread; use std::time::{Duration, Instant}; -use windows_sys::Win32::Foundation::{ - ERROR_BROKEN_PIPE, ERROR_FILE_NOT_FOUND, ERROR_IO_PENDING, ERROR_NO_DATA, ERROR_NOT_FOUND, - ERROR_OPERATION_ABORTED, ERROR_PIPE_BUSY, ERROR_PIPE_CONNECTED, ERROR_PIPE_NOT_CONNECTED, - GENERIC_READ, GENERIC_WRITE, GetLastError, HANDLE, INVALID_HANDLE_VALUE, WAIT_FAILED, - WAIT_OBJECT_0, WAIT_TIMEOUT, -}; -use windows_sys::Win32::Storage::FileSystem::{ - CreateFileW, FILE_FLAG_FIRST_PIPE_INSTANCE, FILE_FLAG_OVERLAPPED, OPEN_EXISTING, - PIPE_ACCESS_DUPLEX, ReadFile, SECURITY_IDENTIFICATION, SECURITY_SQOS_PRESENT, WriteFile, +use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt}; +use tokio::net::windows::named_pipe::{ + ClientOptions, NamedPipeClient, NamedPipeServer, ServerOptions, }; -use windows_sys::Win32::System::IO::{CancelIoEx, GetOverlappedResult, OVERLAPPED}; -use windows_sys::Win32::System::Pipes::{ - ConnectNamedPipe, CreateNamedPipeW, DisconnectNamedPipe, PIPE_READMODE_BYTE, - PIPE_REJECT_REMOTE_CLIENTS, PIPE_TYPE_BYTE, PIPE_UNLIMITED_INSTANCES, PIPE_WAIT, +use tokio::runtime::Builder; +use tokio::time::{sleep, timeout}; +use windows_sys::Win32::Foundation::{ + ERROR_FILE_NOT_FOUND, ERROR_NO_DATA, ERROR_PIPE_BUSY, ERROR_PIPE_NOT_CONNECTED, HANDLE, }; -use windows_sys::Win32::System::Threading::WaitForMultipleObjects; +use windows_sys::Win32::Storage::FileSystem::SECURITY_IDENTIFICATION; -use crate::process_peer::{verify_named_pipe_client, verify_named_pipe_server}; +use crate::process_peer::{ + ClientVerificationError, verify_named_pipe_client, verify_named_pipe_server, +}; use crate::protocol::{ INBOX_TOKEN_BYTES, MAX_PEER_FRAME_BYTES, PROTOCOL_VERSION, valid_inbox_token, valid_instance_id, valid_namespace_id, valid_pipe_name_shape, }; use crate::security::{ - Event, OwnedHandle, PrivateSecurityDescriptor, ProcessIdentity, constant_time_eq_43, - random_bytes, wide, + Event, PrivateSecurityDescriptor, ProcessIdentity, constant_time_eq_43, random_bytes, + verify_private_handle, }; const PIPE_MAGIC: &[u8; 4] = b"XCPP"; const PIPE_HEADER_BYTES: usize = 12; -const AUTH: u8 = 0x01; -const AUTH_OK: u8 = 0x02; -const BUSINESS_REQUEST: u8 = 0x03; -const BUSINESS_RESPONSE: u8 = 0x04; -const BUSINESS_ACK: u8 = 0x05; -const AUTH_PAYLOAD_BYTES: usize = 1 + 2 + 36 + INBOX_TOKEN_BYTES + 32; -const AUTH_OK_PAYLOAD_BYTES: usize = 64; -const MAX_PIPE_PAYLOAD: usize = MAX_PEER_FRAME_BYTES + 36; -const AUTH_DEADLINE: Duration = Duration::from_secs(5); +const REQUEST: u8 = 0x01; +const RESPONSE: u8 = 0x02; +const REQUEST_PAYLOAD_OVERHEAD: usize = 36 + INBOX_TOKEN_BYTES; +const MAX_PIPE_PAYLOAD: usize = REQUEST_PAYLOAD_OVERHEAD + MAX_PEER_FRAME_BYTES; const INBOUND_REQUEST_DEADLINE: Duration = Duration::from_secs(30); +const CONTROL_POLL_INTERVAL: Duration = Duration::from_millis(5); +const CLIENT_RETRY_INTERVAL: Duration = Duration::from_millis(20); const MAX_CONNECTIONS: usize = 64; const PIPE_BUFFER_BYTES: u32 = 16 * 1024; @@ -59,6 +53,7 @@ pub enum PipeErrorCode { ProtocolMismatch, Capacity, ShuttingDown, + SecurityContextLost, Io, } @@ -145,7 +140,6 @@ impl PipeServer { }, )?, ); - let first = create_server_instance(&address, true, &descriptor)?; let stop_accepting = Event::manual_reset().map_err(|error| { PipeError::os( PipeErrorCode::Io, @@ -154,26 +148,37 @@ impl PipeServer { ) })?; let active_connections = Arc::new(AtomicUsize::new(0)); + let (ready_sender, ready_receiver) = mpsc::sync_channel(1); + let listener_address = address.clone(); let listener_stop = stop_accepting.clone(); let listener_active = active_connections.clone(); - let listener_address = address.clone(); - let listener_config = config.clone(); let listener = thread::Builder::new() .name("xc-peer-pipe-listener".to_owned()) .spawn(move || { run_listener( - first, - &listener_address, + listener_address, descriptor, - listener_config, + config, listener_stop, listener_active, handler, + ready_sender, ); }) .map_err(|error| { PipeError::os(PipeErrorCode::Io, "listener thread creation failed", error) })?; + + let ready = ready_receiver.recv().map_err(|_| { + PipeError::new( + PipeErrorCode::Io, + "listener initialization ended unexpectedly", + ) + })?; + if let Err(error) = ready { + let _ = listener.join(); + return Err(error); + } Ok(Self { address, stop_accepting, @@ -203,30 +208,74 @@ impl Drop for PipeServer { } fn run_listener( - first: OwnedHandle, - address: &str, + address: String, descriptor: Arc, config: ServerConfig, stop_accepting: Event, active_connections: Arc, handler: Arc, + ready: mpsc::SyncSender>, ) { + let runtime = match Builder::new_current_thread().enable_all().build() { + Ok(runtime) => runtime, + Err(error) => { + let _ = ready.send(Err(PipeError::os( + PipeErrorCode::Io, + "listener runtime creation failed", + error, + ))); + return; + } + }; + let first = match runtime + .block_on(async { create_server_instance(&address, true, &descriptor, &config.identity) }) + { + Ok(first) => first, + Err(error) => { + let _ = ready.send(Err(error)); + return; + } + }; + if ready.send(Ok(())).is_err() { + return; + } + + let result = runtime.block_on(run_accept_loop( + first, + &address, + descriptor, + config.clone(), + stop_accepting.clone(), + active_connections, + handler.clone(), + )); + if let Err(error) = result + && !stop_accepting.is_signaled() + && !config.force_shutdown.is_signaled() + { + handler.server_fatal(error); + } +} + +async fn run_accept_loop( + first: NamedPipeServer, + address: &str, + descriptor: Arc, + config: ServerConfig, + stop_accepting: Event, + active_connections: Arc, + handler: Arc, +) -> Result<(), PipeError> { let mut pending = Some(first); loop { if stop_accepting.is_signaled() || config.force_shutdown.is_signaled() { - return; + break; } - let instance = match pending.take() { - Some(instance) => instance, - None => match create_server_instance(address, false, &descriptor) { - Ok(instance) => instance, - Err(error) => { - handler.server_fatal(error); - return; - } - }, + let mut server = match pending.take() { + Some(server) => server, + None => create_server_instance(address, false, &descriptor, &config.identity)?, }; - match connect_server_instance(&instance, &stop_accepting, &config.force_shutdown) { + match accept_connection(&server, &stop_accepting, &config.force_shutdown).await { Ok(()) => {} Err(error) if matches!( @@ -234,49 +283,77 @@ fn run_listener( PipeErrorCode::Canceled | PipeErrorCode::ShuttingDown ) => { - return; + break; } - Err(error) if abandoned_accept(&error) => continue, - Err(error) => { - handler.server_fatal(error); - return; + Err(error) if abandoned_accept(&error) => { + tokio::task::yield_now().await; + continue; } + Err(error) => return Err(error), + } + if stop_accepting.is_signaled() || config.force_shutdown.is_signaled() { + let _ = server.disconnect(); + break; } - if active_connections .fetch_update(Ordering::AcqRel, Ordering::Acquire, |active| { (active < MAX_CONNECTIONS).then_some(active + 1) }) .is_err() { - unsafe { - DisconnectNamedPipe(instance.raw()); - } + let _ = server.disconnect(); + tokio::task::yield_now().await; continue; } + let connection_config = config.clone(); let connection_active = active_connections.clone(); let connection_handler = handler.clone(); - if thread::Builder::new() - .name("xc-peer-pipe-connection".to_owned()) - .spawn(move || { - let _guard = ActiveConnectionGuard(connection_active); - if let Err(error) = handle_server_connection( - instance, - &connection_config, - connection_handler.as_ref(), - ) { + tokio::spawn(async move { + let _guard = ActiveConnectionGuard(connection_active); + let fatal_handler = connection_handler.clone(); + if let Err(error) = + handle_server_connection(&mut server, connection_config, connection_handler).await + { + if error.code == PipeErrorCode::SecurityContextLost { + fatal_handler.server_fatal(error); + } else { eprintln!("xc-peer-broker: inbound {:?}: {error}", error.code); } - }) - .is_err() - { - active_connections.fetch_sub(1, Ordering::AcqRel); - handler.server_fatal(PipeError::new( - PipeErrorCode::Capacity, - "connection worker creation failed", + } + }); + tokio::task::yield_now().await; + } + + while active_connections.load(Ordering::Acquire) != 0 { + sleep(CONTROL_POLL_INTERVAL).await; + } + Ok(()) +} + +async fn accept_connection( + server: &NamedPipeServer, + stop_accepting: &Event, + force_shutdown: &Event, +) -> Result<(), PipeError> { + let mut connect = std::pin::pin!(server.connect()); + loop { + if stop_accepting.is_signaled() { + return Err(PipeError::new( + PipeErrorCode::Canceled, + "peer listener stopped", + )); + } + if force_shutdown.is_signaled() { + return Err(PipeError::new( + PipeErrorCode::ShuttingDown, + "peer broker is shutting down", )); - return; + } + if let Ok(result) = timeout(CONTROL_POLL_INTERVAL, connect.as_mut()).await { + return result.map_err(|error| { + PipeError::os(PipeErrorCode::Io, "named pipe accept failed", error) + }); } } } @@ -300,175 +377,108 @@ fn create_server_instance( address: &str, first_instance: bool, descriptor: &PrivateSecurityDescriptor, -) -> Result { - let address_wide = wide(address).map_err(|error| { - PipeError::os( - PipeErrorCode::ProtocolMismatch, - "pipe name is invalid", - error, - ) - })?; - let attributes = descriptor.attributes(); - let handle = unsafe { - CreateNamedPipeW( - address_wide.as_ptr(), - server_open_mode(first_instance), - server_pipe_mode(), - PIPE_UNLIMITED_INSTANCES, - PIPE_BUFFER_BYTES, - PIPE_BUFFER_BYTES, - 0, - &attributes, + identity: &ProcessIdentity, +) -> Result { + let mut attributes = descriptor.attributes(); + let mut options = ServerOptions::new(); + options + .first_pipe_instance(first_instance) + .reject_remote_clients(true) + .out_buffer_size(PIPE_BUFFER_BYTES) + .in_buffer_size(PIPE_BUFFER_BYTES); + let server = unsafe { + options.create_with_security_attributes_raw( + address, + std::ptr::from_mut(&mut attributes).cast::(), ) - }; - OwnedHandle::new(handle).map_err(|error| { + } + .map_err(|error| { PipeError::os( PipeErrorCode::Io, "secure named pipe creation failed", error, ) - }) -} - -fn server_open_mode(first_instance: bool) -> u32 { - PIPE_ACCESS_DUPLEX - | FILE_FLAG_OVERLAPPED - | if first_instance { - FILE_FLAG_FIRST_PIPE_INSTANCE - } else { - 0 - } -} - -fn server_pipe_mode() -> u32 { - PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT | PIPE_REJECT_REMOTE_CLIENTS -} - -fn connect_server_instance( - pipe: &OwnedHandle, - stop_accepting: &Event, - force_shutdown: &Event, -) -> Result<(), PipeError> { - let event = Event::manual_reset().map_err(|error| { - PipeError::os(PipeErrorCode::Io, "connect event creation failed", error) })?; - let mut overlapped: OVERLAPPED = unsafe { zeroed() }; - overlapped.hEvent = event.raw(); - let connected = unsafe { ConnectNamedPipe(pipe.raw(), &mut overlapped) }; - if connected != 0 { - return Ok(()); - } - let error = unsafe { GetLastError() }; - if error == ERROR_PIPE_CONNECTED { - return Ok(()); - } - if error != ERROR_IO_PENDING { - return Err(PipeError::os( - PipeErrorCode::Io, - "named pipe accept failed", - io::Error::from_raw_os_error(error as i32), - )); - } - wait_overlapped( - pipe.raw(), - &mut overlapped, - event.raw(), - &[stop_accepting.raw(), force_shutdown.raw()], - None, - ) - .map(|_| ()) + verify_private_handle(server.as_raw_handle() as HANDLE, &identity.account_sid).map_err( + |error| { + PipeError::os( + PipeErrorCode::Io, + "named pipe DACL verification failed", + error, + ) + }, + )?; + Ok(server) } -fn handle_server_connection( - pipe: OwnedHandle, - config: &ServerConfig, - handler: &dyn InboundHandler, +async fn handle_server_connection( + server: &mut NamedPipeServer, + config: ServerConfig, + handler: Arc, ) -> Result<(), PipeError> { - let auth_deadline = Instant::now() + AUTH_DEADLINE; - let auth_frame = read_pipe_frame( - pipe.raw(), - AUTH_PAYLOAD_BYTES, - auth_deadline, - &[], + let request_deadline = Instant::now() + INBOUND_REQUEST_DEADLINE; + let request = read_pipe_frame( + server, + MAX_PIPE_PAYLOAD, + request_deadline, + None, &config.force_shutdown, - )?; - if auth_frame.kind != AUTH { + ) + .await?; + if request.kind != REQUEST { return Err(PipeError::new( PipeErrorCode::AuthenticationFailed, "peer authentication failed", )); } - let auth = parse_auth_payload(&auth_frame.payload).map_err(|_| { + let request = parse_request_payload(&request.payload).map_err(|_| { PipeError::new( PipeErrorCode::AuthenticationFailed, "peer authentication failed", ) })?; - verify_named_pipe_client(pipe.raw(), &config.identity).map_err(|_| { - PipeError::new( - PipeErrorCode::IdentityUnverified, - "peer client identity could not be verified", - ) - })?; - if !constant_time_eq_43(&config.inbox_token, &auth.inbox_token) { + verify_named_pipe_client(server.as_raw_handle() as HANDLE, &config.identity).map_err( + |error| match error { + ClientVerificationError::Identity(error) => PipeError::os( + PipeErrorCode::IdentityUnverified, + "peer client identity could not be verified", + error, + ), + ClientVerificationError::Revert(error) => PipeError::os( + PipeErrorCode::SecurityContextLost, + "peer listener could not restore its process security context", + error, + ), + }, + )?; + if !constant_time_eq_43(&config.inbox_token, &request.inbox_token) { return Err(PipeError::new( PipeErrorCode::AuthenticationFailed, "peer authentication failed", )); } - let mut server_nonce = [0u8; 32]; - random_bytes(&mut server_nonce) - .map_err(|error| PipeError::os(PipeErrorCode::Io, "nonce generation failed", error))?; - let mut auth_ok = Vec::with_capacity(AUTH_OK_PAYLOAD_BYTES); - auth_ok.extend_from_slice(&auth.client_nonce); - auth_ok.extend_from_slice(&server_nonce); - write_pipe_frame( - pipe.raw(), - AUTH_OK, - &auth_ok, - auth_deadline, - &[], - &config.force_shutdown, - )?; - - let request_deadline = Instant::now() + INBOUND_REQUEST_DEADLINE; - let request = read_pipe_frame( - pipe.raw(), - MAX_PIPE_PAYLOAD, - request_deadline, - &[], - &config.force_shutdown, - )?; - if request.kind != BUSINESS_REQUEST { - return Err(PipeError::new( - PipeErrorCode::ProtocolMismatch, - "peer business phase is invalid", - )); - } - let peer_frame = parse_business_request_payload(&request.payload, &server_nonce)?; - let response = handler.handle_inbound(auth.sender_instance_id, peer_frame, request_deadline)?; - let response_payload = encode_business_payload(&response)?; + let response = tokio::task::spawn_blocking(move || { + handler.handle_inbound( + request.sender_instance_id, + request.peer_frame, + request_deadline, + ) + }) + .await + .map_err(|_| PipeError::new(PipeErrorCode::Io, "inbound handler stopped unexpectedly"))??; + validate_business_frame(&response)?; write_pipe_frame( - pipe.raw(), - BUSINESS_RESPONSE, - &response_payload, + server, + RESPONSE, + &response, request_deadline, - &[], + None, &config.force_shutdown, - )?; - let acknowledgement = - read_pipe_frame(pipe.raw(), 0, request_deadline, &[], &config.force_shutdown)?; - if acknowledgement.kind != BUSINESS_ACK || !acknowledgement.payload.is_empty() { - return Err(PipeError::new( - PipeErrorCode::ProtocolMismatch, - "peer response acknowledgement is invalid", - )); - } - unsafe { - DisconnectNamedPipe(pipe.raw()); - } + ) + .await?; + let _ = server.disconnect(); Ok(()) } @@ -493,188 +503,130 @@ pub fn self_test(identity: &ProcessIdentity) -> Result<(), PipeError> { ) })?; let address = generate_pipe_name("012345abcdef")?; - let first = create_server_instance(&address, true, &descriptor)?; - let second = create_server_instance(&address, false, &descriptor)?; - crate::security::verify_private_handle(first.raw(), &identity.account_sid) - .and_then(|()| crate::security::verify_private_handle(second.raw(), &identity.account_sid)) - .map_err(|error| PipeError::os(PipeErrorCode::Io, "pipe DACL self-test failed", error)) + let runtime = Builder::new_current_thread() + .enable_all() + .build() + .map_err(|error| { + PipeError::os( + PipeErrorCode::Io, + "pipe self-test runtime creation failed", + error, + ) + })?; + runtime.block_on(async { + let first = create_server_instance(&address, true, &descriptor, identity)?; + let second = create_server_instance(&address, false, &descriptor, identity)?; + drop((first, second)); + Ok(()) + }) } -pub fn outbound_request(request: OutboundPipeRequest<'_>) -> Result, PipeError> { - let OutboundPipeRequest { - address, - target_token, - sender_instance_id, - peer_frame, - identity, - deadline, - cancel, - force_shutdown, - } = request; - if !valid_pipe_name_shape(address, None) - || !valid_instance_id(sender_instance_id) - || peer_frame.is_empty() - || peer_frame.len() > MAX_PEER_FRAME_BYTES +pub async fn outbound_request_async( + request: OutboundPipeRequest<'_>, +) -> Result, PipeError> { + if !valid_pipe_name_shape(request.address, None) + || !valid_instance_id(request.sender_instance_id) + || request.peer_frame.is_empty() + || request.peer_frame.len() > MAX_PEER_FRAME_BYTES { return Err(PipeError::new( PipeErrorCode::ProtocolMismatch, "outbound request is invalid", )); } - let pipe = connect_client(address, deadline, cancel, force_shutdown)?; - verify_named_pipe_server(pipe.raw(), identity).map_err(|_| { + let mut pipe = connect_client( + request.address, + request.deadline, + request.cancel, + request.force_shutdown, + ) + .await?; + verify_named_pipe_server(pipe.as_raw_handle() as HANDLE, request.identity).map_err(|_| { PipeError::new( PipeErrorCode::IdentityUnverified, "peer server identity could not be verified", ) })?; - let mut client_nonce = [0u8; 32]; - random_bytes(&mut client_nonce) - .map_err(|error| PipeError::os(PipeErrorCode::Io, "nonce generation failed", error))?; - let auth_payload = encode_auth_payload(sender_instance_id, target_token, &client_nonce)?; - let auth_deadline = deadline.min(Instant::now() + AUTH_DEADLINE); - write_pipe_frame( - pipe.raw(), - AUTH, - &auth_payload, - auth_deadline, - &[cancel.raw()], - force_shutdown, + let request_payload = encode_request_payload( + request.sender_instance_id, + request.target_token, + request.peer_frame, )?; - let auth_ok = read_pipe_frame( - pipe.raw(), - AUTH_OK_PAYLOAD_BYTES, - auth_deadline, - &[cancel.raw()], - force_shutdown, - )?; - if auth_ok.kind != AUTH_OK || auth_ok.payload.len() != AUTH_OK_PAYLOAD_BYTES { - return Err(PipeError::new( - PipeErrorCode::AuthenticationFailed, - "peer authentication failed", - )); - } - if !constant_time_equal(&auth_ok.payload[..32], &client_nonce) { - return Err(PipeError::new( - PipeErrorCode::AuthenticationFailed, - "peer authentication failed", - )); - } - - let server_nonce: [u8; 32] = auth_ok.payload[32..] - .try_into() - .expect("fixed server nonce"); - let request_payload = encode_business_request_payload(&server_nonce, peer_frame)?; write_pipe_frame( - pipe.raw(), - BUSINESS_REQUEST, + &mut pipe, + REQUEST, &request_payload, - deadline, - &[cancel.raw()], - force_shutdown, - )?; + request.deadline, + Some(request.cancel), + request.force_shutdown, + ) + .await?; let response = read_pipe_frame( - pipe.raw(), - MAX_PIPE_PAYLOAD, - deadline, - &[cancel.raw()], - force_shutdown, - )?; - if response.kind != BUSINESS_RESPONSE { + &mut pipe, + MAX_PEER_FRAME_BYTES, + request.deadline, + Some(request.cancel), + request.force_shutdown, + ) + .await?; + if response.kind != RESPONSE { return Err(PipeError::new( PipeErrorCode::ProtocolMismatch, "peer response phase is invalid", )); } - write_pipe_frame( - pipe.raw(), - BUSINESS_ACK, - &[], - deadline, - &[cancel.raw()], - force_shutdown, - )?; - parse_business_payload(&response.payload) + validate_business_frame(&response.payload)?; + Ok(response.payload) } -fn connect_client( +async fn connect_client( address: &str, deadline: Instant, cancel: &Event, force_shutdown: &Event, -) -> Result { - let address_wide = wide(address).map_err(|error| { - PipeError::os( - PipeErrorCode::ProtocolMismatch, - "pipe name is invalid", - error, - ) - })?; +) -> Result { loop { - check_deadline_and_cancel(deadline, &[cancel.raw()], force_shutdown)?; - let handle = unsafe { - CreateFileW( - address_wide.as_ptr(), - GENERIC_READ | GENERIC_WRITE, - 0, - null(), - OPEN_EXISTING, - FILE_FLAG_OVERLAPPED | SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION, - null_mut(), - ) - }; - if handle != INVALID_HANDLE_VALUE { - return OwnedHandle::new(handle).map_err(|error| { - PipeError::os( + check_request_controls(deadline, Some(cancel), force_shutdown)?; + let mut options = ClientOptions::new(); + options.security_qos_flags(SECURITY_IDENTIFICATION); + match options.open(address) { + Ok(client) => return Ok(client), + Err(error) + if matches!( + error.raw_os_error(), + Some(code) + if code == ERROR_PIPE_BUSY as i32 || code == ERROR_FILE_NOT_FOUND as i32 + ) => + { + wait_cancelable_delay(CLIENT_RETRY_INTERVAL, deadline, cancel, force_shutdown) + .await?; + } + Err(error) => { + return Err(PipeError::os( PipeErrorCode::TargetUnavailable, "peer pipe connection failed", error, - ) - }); - } - let error = unsafe { GetLastError() }; - if !matches!(error, ERROR_PIPE_BUSY | ERROR_FILE_NOT_FOUND) { - return Err(PipeError::os( - PipeErrorCode::TargetUnavailable, - "peer pipe connection failed", - io::Error::from_raw_os_error(error as i32), - )); + )); + } } - wait_cancelable_delay(Duration::from_millis(20), deadline, cancel, force_shutdown)?; } } -fn wait_cancelable_delay( +async fn wait_cancelable_delay( delay: Duration, deadline: Instant, cancel: &Event, force_shutdown: &Event, ) -> Result<(), PipeError> { - let remaining = deadline.saturating_duration_since(Instant::now()); - if remaining.is_zero() { - return Err(PipeError::new( - PipeErrorCode::Timeout, - "peer request timed out", - )); - } - let timeout = duration_millis(delay.min(remaining)); - let handles = [cancel.raw(), force_shutdown.raw()]; - match unsafe { WaitForMultipleObjects(handles.len() as u32, handles.as_ptr(), 0, timeout) } { - WAIT_OBJECT_0 => Err(PipeError::new( - PipeErrorCode::Canceled, - "peer request was canceled", - )), - value if value == WAIT_OBJECT_0 + 1 => Err(PipeError::new( - PipeErrorCode::ShuttingDown, - "peer broker is shutting down", - )), - WAIT_TIMEOUT => Ok(()), - _ => Err(PipeError::os( - PipeErrorCode::Io, - "peer wait failed", - io::Error::last_os_error(), - )), + let wake_at = Instant::now() + delay; + loop { + check_request_controls(deadline, Some(cancel), force_shutdown)?; + let remaining = wake_at.saturating_duration_since(Instant::now()); + if remaining.is_zero() { + return Ok(()); + } + sleep(CONTROL_POLL_INTERVAL.min(remaining)).await; } } @@ -685,11 +637,7 @@ struct PipeFrame { } fn encode_pipe_frame(kind: u8, payload: &[u8]) -> Result, PipeError> { - if !matches!( - kind, - AUTH | AUTH_OK | BUSINESS_REQUEST | BUSINESS_RESPONSE | BUSINESS_ACK - ) || payload.len() > MAX_PIPE_PAYLOAD - { + if !matches!(kind, REQUEST | RESPONSE) || payload.len() > MAX_PIPE_PAYLOAD { return Err(PipeError::new( PipeErrorCode::ProtocolMismatch, "peer pipe frame is invalid", @@ -717,10 +665,7 @@ fn decode_pipe_header(header: &[u8], maximum: usize) -> Result<(u8, usize), Pipe )); } let kind = header[5]; - if !matches!( - kind, - AUTH | AUTH_OK | BUSINESS_REQUEST | BUSINESS_RESPONSE | BUSINESS_ACK - ) { + if !matches!(kind, REQUEST | RESPONSE) { return Err(PipeError::new( PipeErrorCode::ProtocolMismatch, "peer pipe kind is invalid", @@ -736,239 +681,92 @@ fn decode_pipe_header(header: &[u8], maximum: usize) -> Result<(u8, usize), Pipe Ok((kind, length)) } -fn read_pipe_frame( - pipe: HANDLE, +async fn read_pipe_frame( + reader: &mut R, maximum: usize, deadline: Instant, - cancel_handles: &[HANDLE], + cancel: Option<&Event>, force_shutdown: &Event, ) -> Result { let mut header = [0u8; PIPE_HEADER_BYTES]; - read_exact_overlapped(pipe, &mut header, deadline, cancel_handles, force_shutdown)?; + controlled_io( + reader.read_exact(&mut header), + deadline, + cancel, + force_shutdown, + "peer pipe read failed", + ) + .await?; let (kind, length) = decode_pipe_header(&header, maximum)?; let mut payload = vec![0u8; length]; - read_exact_overlapped(pipe, &mut payload, deadline, cancel_handles, force_shutdown)?; + controlled_io( + reader.read_exact(&mut payload), + deadline, + cancel, + force_shutdown, + "peer pipe read failed", + ) + .await?; Ok(PipeFrame { kind, payload }) } -fn write_pipe_frame( - pipe: HANDLE, +async fn write_pipe_frame( + writer: &mut W, kind: u8, payload: &[u8], deadline: Instant, - cancel_handles: &[HANDLE], + cancel: Option<&Event>, force_shutdown: &Event, ) -> Result<(), PipeError> { let bytes = encode_pipe_frame(kind, payload)?; - write_all_overlapped(pipe, &bytes, deadline, cancel_handles, force_shutdown) + controlled_io( + writer.write_all(&bytes), + deadline, + cancel, + force_shutdown, + "peer pipe write failed", + ) + .await } -fn read_exact_overlapped( - pipe: HANDLE, - mut buffer: &mut [u8], +async fn controlled_io( + operation: F, deadline: Instant, - cancel_handles: &[HANDLE], + cancel: Option<&Event>, force_shutdown: &Event, -) -> Result<(), PipeError> { - while !buffer.is_empty() { - check_deadline_and_cancel(deadline, cancel_handles, force_shutdown)?; - let event = Event::manual_reset().map_err(|error| { - PipeError::os(PipeErrorCode::Io, "read event creation failed", error) - })?; - let mut overlapped: OVERLAPPED = unsafe { zeroed() }; - overlapped.hEvent = event.raw(); - let requested = buffer.len().min(u32::MAX as usize) as u32; - let started = unsafe { - ReadFile( - pipe, - buffer.as_mut_ptr(), - requested, - null_mut(), - &mut overlapped, - ) - }; - let transferred = if started != 0 { - overlapped_result(pipe, &mut overlapped)? - } else { - let error = unsafe { GetLastError() }; - if error == ERROR_BROKEN_PIPE { - return Err(PipeError::new(PipeErrorCode::Io, "peer pipe closed early")); - } - if error != ERROR_IO_PENDING { - return Err(PipeError::os( - PipeErrorCode::Io, - "peer pipe read failed", - io::Error::from_raw_os_error(error as i32), - )); - } - wait_overlapped( - pipe, - &mut overlapped, - event.raw(), - cancel_handles, - Some((deadline, force_shutdown)), - )? - }; - if transferred == 0 { - return Err(PipeError::new(PipeErrorCode::Io, "peer pipe closed early")); + message: &'static str, +) -> Result +where + F: Future>, +{ + let mut operation = std::pin::pin!(operation); + loop { + check_request_controls(deadline, cancel, force_shutdown)?; + let remaining = deadline.saturating_duration_since(Instant::now()); + if let Ok(result) = timeout(CONTROL_POLL_INTERVAL.min(remaining), operation.as_mut()).await + { + return result.map_err(|error| PipeError::os(PipeErrorCode::Io, message, error)); } - buffer = &mut buffer[transferred as usize..]; } - Ok(()) } -fn write_all_overlapped( - pipe: HANDLE, - mut buffer: &[u8], +fn check_request_controls( deadline: Instant, - cancel_handles: &[HANDLE], + cancel: Option<&Event>, force_shutdown: &Event, ) -> Result<(), PipeError> { - while !buffer.is_empty() { - check_deadline_and_cancel(deadline, cancel_handles, force_shutdown)?; - let event = Event::manual_reset().map_err(|error| { - PipeError::os(PipeErrorCode::Io, "write event creation failed", error) - })?; - let mut overlapped: OVERLAPPED = unsafe { zeroed() }; - overlapped.hEvent = event.raw(); - let requested = buffer.len().min(u32::MAX as usize) as u32; - let started = unsafe { - WriteFile( - pipe, - buffer.as_ptr(), - requested, - null_mut(), - &mut overlapped, - ) - }; - let transferred = if started != 0 { - overlapped_result(pipe, &mut overlapped)? - } else { - let error = unsafe { GetLastError() }; - if error != ERROR_IO_PENDING { - return Err(PipeError::os( - PipeErrorCode::Io, - "peer pipe write failed", - io::Error::from_raw_os_error(error as i32), - )); - } - wait_overlapped( - pipe, - &mut overlapped, - event.raw(), - cancel_handles, - Some((deadline, force_shutdown)), - )? - }; - if transferred == 0 { - return Err(PipeError::new( - PipeErrorCode::Io, - "peer pipe write made no progress", - )); - } - buffer = &buffer[transferred as usize..]; - } - Ok(()) -} - -fn wait_overlapped( - pipe: HANDLE, - overlapped: &mut OVERLAPPED, - io_event: HANDLE, - cancel_handles: &[HANDLE], - timed: Option<(Instant, &Event)>, -) -> Result { - let mut handles = Vec::with_capacity(2 + cancel_handles.len()); - handles.push(io_event); - handles.extend_from_slice(cancel_handles); - if let Some((_, force_shutdown)) = timed { - handles.push(force_shutdown.raw()); - } - let timeout = timed - .map(|(deadline, _)| duration_millis(deadline.saturating_duration_since(Instant::now()))) - .unwrap_or(u32::MAX); - let wait = - unsafe { WaitForMultipleObjects(handles.len() as u32, handles.as_ptr(), 0, timeout) }; - if wait == WAIT_OBJECT_0 { - return overlapped_result(pipe, overlapped); - } - - if unsafe { CancelIoEx(pipe, overlapped) } == 0 { - let error = unsafe { GetLastError() }; - if error != ERROR_NOT_FOUND { - return Err(PipeError::os( - PipeErrorCode::Io, - "peer I/O cancellation failed", - io::Error::from_raw_os_error(error as i32), - )); - } - } - let _ = overlapped_result(pipe, overlapped); - if wait == WAIT_TIMEOUT { + if Instant::now() >= deadline { return Err(PipeError::new( PipeErrorCode::Timeout, "peer request timed out", )); } - if wait == WAIT_FAILED { - return Err(PipeError::os( - PipeErrorCode::Io, - "peer wait failed", - io::Error::last_os_error(), - )); - } - let selected = (wait - WAIT_OBJECT_0) as usize; - if selected > 0 && selected <= cancel_handles.len() { + if cancel.is_some_and(Event::is_signaled) { return Err(PipeError::new( PipeErrorCode::Canceled, "peer request was canceled", )); } - Err(PipeError::new( - PipeErrorCode::ShuttingDown, - "peer broker is shutting down", - )) -} - -fn overlapped_result(pipe: HANDLE, overlapped: &mut OVERLAPPED) -> Result { - let mut transferred = 0u32; - if unsafe { GetOverlappedResult(pipe, overlapped, &mut transferred, 1) } == 0 { - let error = unsafe { GetLastError() }; - let code = if error == ERROR_OPERATION_ABORTED { - PipeErrorCode::Canceled - } else { - PipeErrorCode::Io - }; - Err(PipeError::os( - code, - "peer overlapped operation failed", - io::Error::from_raw_os_error(error as i32), - )) - } else { - Ok(transferred) - } -} - -fn check_deadline_and_cancel( - deadline: Instant, - cancel_handles: &[HANDLE], - force_shutdown: &Event, -) -> Result<(), PipeError> { - if Instant::now() >= deadline { - return Err(PipeError::new( - PipeErrorCode::Timeout, - "peer request timed out", - )); - } - for handle in cancel_handles { - let handles = [*handle]; - if unsafe { WaitForMultipleObjects(1, handles.as_ptr(), 0, 0) } == WAIT_OBJECT_0 { - return Err(PipeError::new( - PipeErrorCode::Canceled, - "peer request was canceled", - )); - } - } if force_shutdown.is_signaled() { return Err(PipeError::new( PipeErrorCode::ShuttingDown, @@ -978,20 +776,16 @@ fn check_deadline_and_cancel( Ok(()) } -fn duration_millis(duration: Duration) -> u32 { - duration.as_millis().min((u32::MAX - 1) as u128) as u32 -} - -struct AuthPayload { +struct RequestPayload { sender_instance_id: String, inbox_token: [u8; INBOX_TOKEN_BYTES], - client_nonce: [u8; 32], + peer_frame: Vec, } -fn encode_auth_payload( +fn encode_request_payload( sender_instance_id: &str, inbox_token: &[u8; INBOX_TOKEN_BYTES], - client_nonce: &[u8; 32], + peer_frame: &[u8], ) -> Result, PipeError> { if !valid_instance_id(sender_instance_id) || !valid_inbox_token(std::str::from_utf8(inbox_token).unwrap_or("")) @@ -1001,30 +795,22 @@ fn encode_auth_payload( "peer authentication payload is invalid", )); } - let mut payload = Vec::with_capacity(AUTH_PAYLOAD_BYTES); - payload.push(PROTOCOL_VERSION); - payload.extend_from_slice(&(sender_instance_id.len() as u16).to_le_bytes()); + validate_business_frame(peer_frame)?; + let mut payload = Vec::with_capacity(REQUEST_PAYLOAD_OVERHEAD + peer_frame.len()); payload.extend_from_slice(sender_instance_id.as_bytes()); payload.extend_from_slice(inbox_token); - payload.extend_from_slice(client_nonce); + payload.extend_from_slice(peer_frame); Ok(payload) } -fn parse_auth_payload(payload: &[u8]) -> Result { - if payload.len() != AUTH_PAYLOAD_BYTES || payload[0] != PROTOCOL_VERSION { +fn parse_request_payload(payload: &[u8]) -> Result { + if payload.len() <= REQUEST_PAYLOAD_OVERHEAD || payload.len() > MAX_PIPE_PAYLOAD { return Err(PipeError::new( PipeErrorCode::ProtocolMismatch, "peer authentication payload is invalid", )); } - let sender_length = u16::from_le_bytes(payload[1..3].try_into().expect("auth prefix")) as usize; - if sender_length != 36 { - return Err(PipeError::new( - PipeErrorCode::ProtocolMismatch, - "peer sender identity is invalid", - )); - } - let sender_instance_id = std::str::from_utf8(&payload[3..39]) + let sender_instance_id = std::str::from_utf8(&payload[..36]) .map_err(|_| { PipeError::new( PipeErrorCode::ProtocolMismatch, @@ -1038,78 +824,26 @@ fn parse_auth_payload(payload: &[u8]) -> Result { "peer sender identity is invalid", )); } - let inbox_token = payload[39..82].try_into().expect("fixed auth token"); - let client_nonce = payload[82..114].try_into().expect("fixed auth nonce"); - Ok(AuthPayload { + let inbox_token = payload[36..REQUEST_PAYLOAD_OVERHEAD] + .try_into() + .expect("fixed request token"); + let peer_frame = payload[REQUEST_PAYLOAD_OVERHEAD..].to_vec(); + validate_business_frame(&peer_frame)?; + Ok(RequestPayload { sender_instance_id, inbox_token, - client_nonce, + peer_frame, }) } -fn encode_business_request_payload( - server_nonce: &[u8; 32], - peer_frame: &[u8], -) -> Result, PipeError> { - let business = encode_business_payload(peer_frame)?; - let mut payload = Vec::with_capacity(server_nonce.len() + business.len()); - payload.extend_from_slice(server_nonce); - payload.extend_from_slice(&business); - Ok(payload) -} - -fn parse_business_request_payload( - payload: &[u8], - expected_server_nonce: &[u8; 32], -) -> Result, PipeError> { - if payload.len() < 36 || !constant_time_equal(&payload[..32], expected_server_nonce) { - return Err(PipeError::new( - PipeErrorCode::AuthenticationFailed, - "peer business challenge is invalid", - )); - } - parse_business_payload(&payload[32..]) -} - -fn encode_business_payload(peer_frame: &[u8]) -> Result, PipeError> { +fn validate_business_frame(peer_frame: &[u8]) -> Result<(), PipeError> { if peer_frame.is_empty() || peer_frame.len() > MAX_PEER_FRAME_BYTES { return Err(PipeError::new( PipeErrorCode::ProtocolMismatch, "peer business frame length is invalid", )); } - let mut payload = Vec::with_capacity(4 + peer_frame.len()); - payload.extend_from_slice(&(peer_frame.len() as u32).to_le_bytes()); - payload.extend_from_slice(peer_frame); - Ok(payload) -} - -fn parse_business_payload(payload: &[u8]) -> Result, PipeError> { - if payload.len() < 4 { - return Err(PipeError::new( - PipeErrorCode::ProtocolMismatch, - "peer business frame is truncated", - )); - } - let length = u32::from_le_bytes(payload[..4].try_into().expect("business prefix")) as usize; - if length == 0 || length > MAX_PEER_FRAME_BYTES || payload.len() != length + 4 { - return Err(PipeError::new( - PipeErrorCode::ProtocolMismatch, - "peer business frame length is invalid", - )); - } - Ok(payload[4..].to_vec()) -} - -fn constant_time_equal(left: &[u8], right: &[u8]) -> bool { - if left.len() != right.len() { - return false; - } - let mut difference = 0u8; - for (&left_byte, &right_byte) in left.iter().zip(right) { - difference |= left_byte ^ right_byte; - } - difference == 0 + Ok(()) } pub fn generate_pipe_name(namespace_id: &str) -> Result { @@ -1123,7 +857,7 @@ pub fn generate_pipe_name(namespace_id: &str) -> Result { random_bytes(&mut random) .map_err(|error| PipeError::os(PipeErrorCode::Io, "pipe name generation failed", error))?; let encoded = base64url_192(&random); - let address = format!(r"\\.\pipe\x-code-peer-v1-{namespace_id}-{encoded}"); + let address = format!(r"\\.\pipe\x-code-peer-v2-{namespace_id}-{encoded}"); if !valid_pipe_name_shape(&address, Some(namespace_id)) { return Err(PipeError::new( PipeErrorCode::ProtocolMismatch, @@ -1156,18 +890,12 @@ mod tests { let first = generate_pipe_name("012345abcdef").unwrap(); let second = generate_pipe_name("012345abcdef").unwrap(); assert!(valid_pipe_name_shape(&first, Some("012345abcdef"))); - assert_eq!(first.len(), r"\\.\pipe\x-code-peer-v1-".len() + 12 + 1 + 32); + assert_eq!(first.len(), r"\\.\pipe\x-code-peer-v2-".len() + 12 + 1 + 32); assert_ne!(first, second); } #[test] - fn every_server_instance_rejects_remote_and_only_first_has_first_flag() { - assert_ne!(server_pipe_mode() & PIPE_REJECT_REMOTE_CLIENTS, 0); - assert_ne!(server_open_mode(true) & FILE_FLAG_FIRST_PIPE_INSTANCE, 0); - assert_eq!(server_open_mode(false) & FILE_FLAG_FIRST_PIPE_INSTANCE, 0); - assert_ne!(server_open_mode(true) & FILE_FLAG_OVERLAPPED, 0); - assert_eq!(server_pipe_mode() & PIPE_TYPE_BYTE, PIPE_TYPE_BYTE); - + fn secure_server_supports_first_and_subsequent_instances() { let identity = crate::process_peer::current_process_identity().unwrap(); self_test(&identity).unwrap(); } @@ -1192,10 +920,10 @@ mod tests { #[test] fn pipe_codec_rejects_bad_flags_kind_length_and_business_bounds() { - let encoded = encode_pipe_frame(BUSINESS_REQUEST, b"test").unwrap(); + let encoded = encode_pipe_frame(REQUEST, b"test").unwrap(); assert_eq!( decode_pipe_header(&encoded[..PIPE_HEADER_BYTES], 4).unwrap(), - (BUSINESS_REQUEST, 4) + (REQUEST, 4) ); let mut flags = encoded.clone(); @@ -1206,29 +934,20 @@ mod tests { assert!(decode_pipe_header(&kind[..PIPE_HEADER_BYTES], 4).is_err()); assert!(decode_pipe_header(&encoded[..PIPE_HEADER_BYTES], 3).is_err()); - assert!(encode_business_payload(&vec![0; MAX_PEER_FRAME_BYTES]).is_ok()); - assert!(encode_business_payload(&vec![0; MAX_PEER_FRAME_BYTES + 1]).is_err()); + assert!(validate_business_frame(&vec![0; MAX_PEER_FRAME_BYTES]).is_ok()); + assert!(validate_business_frame(&vec![0; MAX_PEER_FRAME_BYTES + 1]).is_err()); } #[test] - fn auth_and_nonce_codecs_are_fixed_and_nonce_bound() { + fn request_codec_binds_sender_token_and_business_frame() { let token: [u8; INBOX_TOKEN_BYTES] = [b'A'; INBOX_TOKEN_BYTES]; - let nonce = [7u8; 32]; let sender = "550e8400-e29b-41d4-a716-446655440000"; - let encoded = encode_auth_payload(sender, &token, &nonce).unwrap(); - assert_eq!(encoded.len(), AUTH_PAYLOAD_BYTES); - let decoded = parse_auth_payload(&encoded).unwrap(); + let encoded = encode_request_payload(sender, &token, b"frame").unwrap(); + assert_eq!(encoded.len(), REQUEST_PAYLOAD_OVERHEAD + 5); + let decoded = parse_request_payload(&encoded).unwrap(); assert_eq!(decoded.sender_instance_id, sender); assert_eq!(decoded.inbox_token, token); - assert_eq!(decoded.client_nonce, nonce); - assert!(constant_time_equal(&nonce, &nonce)); - assert!(!constant_time_equal(&nonce, &[8u8; 32])); - - let request = encode_business_request_payload(&nonce, b"frame").unwrap(); - assert_eq!( - parse_business_request_payload(&request, &nonce).unwrap(), - b"frame" - ); - assert!(parse_business_request_payload(&request, &[8u8; 32]).is_err()); + assert_eq!(decoded.peer_frame, b"frame"); + assert!(parse_request_payload(&encoded[..REQUEST_PAYLOAD_OVERHEAD]).is_err()); } } diff --git a/packages/core/native/windows-peer-broker/src/process_peer.rs b/packages/core/native/windows-peer-broker/src/process_peer.rs index 4c2f54b..9b46715 100644 --- a/packages/core/native/windows-peer-broker/src/process_peer.rs +++ b/packages/core/native/windows-peer-broker/src/process_peer.rs @@ -11,6 +11,11 @@ use windows_sys::Win32::System::Threading::{ use crate::security::{OwnedHandle, ProcessIdentity, identities_match, token_identity}; +pub enum ClientVerificationError { + Identity(io::Error), + Revert(io::Error), +} + pub fn current_process_identity() -> io::Result { let mut token = null_mut(); if unsafe { OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &mut token) } == 0 { @@ -67,17 +72,22 @@ pub fn verify_named_pipe_server(pipe: HANDLE, current: &ProcessIdentity) -> io:: } } -pub fn verify_named_pipe_client(pipe: HANDLE, current: &ProcessIdentity) -> io::Result<()> { +pub fn verify_named_pipe_client( + pipe: HANDLE, + current: &ProcessIdentity, +) -> Result<(), ClientVerificationError> { if unsafe { ImpersonateNamedPipeClient(pipe) } == 0 { - return Err(io::Error::new( + return Err(ClientVerificationError::Identity(io::Error::new( io::ErrorKind::PermissionDenied, "client impersonation failed", - )); + ))); } let guard = ImpersonationGuard { active: true }; let result = inspect_thread_identity(current); - let revert_result = guard.revert(); - result.and(revert_result) + match guard.revert() { + Ok(()) => result.map_err(ClientVerificationError::Identity), + Err(error) => Err(ClientVerificationError::Revert(error)), + } } fn inspect_thread_identity(current: &ProcessIdentity) -> io::Result<()> { @@ -111,15 +121,17 @@ struct ImpersonationGuard { impl ImpersonationGuard { fn revert(mut self) -> io::Result<()> { - self.active = false; if unsafe { RevertToSelf() } == 0 { - Err(io::Error::new( - io::ErrorKind::PermissionDenied, - "client impersonation revert failed", - )) - } else { - Ok(()) + let first_error = io::Error::last_os_error(); + if unsafe { RevertToSelf() } == 0 { + return Err(io::Error::new( + io::ErrorKind::PermissionDenied, + format!("client impersonation revert failed: {first_error}"), + )); + } } + self.active = false; + Ok(()) } } diff --git a/packages/core/native/windows-peer-broker/src/protocol.rs b/packages/core/native/windows-peer-broker/src/protocol.rs index ccaca1f..e4694cb 100644 --- a/packages/core/native/windows-peer-broker/src/protocol.rs +++ b/packages/core/native/windows-peer-broker/src/protocol.rs @@ -1,6 +1,6 @@ use std::fmt; -pub const PROTOCOL_VERSION: u8 = 1; +pub const PROTOCOL_VERSION: u8 = 2; pub const HEADER_BYTES: usize = 16; pub const MAX_CONTROL_PAYLOAD: usize = 139_264; pub const MAX_PEER_FRAME_BYTES: usize = 131_072; @@ -22,7 +22,6 @@ pub const SECURE_RUNTIME_RESULT: u8 = 0x81; pub const SERVER_READY: u8 = 0x82; pub const INBOUND_REQUEST: u8 = 0x83; pub const OUTBOUND_RESPONSE: u8 = 0x84; -pub const CANCEL_ACK: u8 = 0x85; pub const OPERATION_ERROR: u8 = 0x86; pub const SERVER_FATAL: u8 = 0x87; pub const SHUTDOWN_COMPLETE: u8 = 0x88; @@ -155,7 +154,6 @@ fn is_known_kind(kind: u8) -> bool { | SERVER_READY | INBOUND_REQUEST | OUTBOUND_RESPONSE - | CANCEL_ACK | OPERATION_ERROR | SERVER_FATAL | SHUTDOWN_COMPLETE @@ -422,7 +420,7 @@ pub fn valid_inbox_token(value: &str) -> bool { } pub fn valid_pipe_name_shape(value: &str, expected_namespace: Option<&str>) -> bool { - const PREFIX: &str = r"\\.\pipe\x-code-peer-v1-"; + const PREFIX: &str = r"\\.\pipe\x-code-peer-v2-"; let Some(suffix) = value.strip_prefix(PREFIX) else { return false; }; @@ -502,11 +500,11 @@ mod tests { fn validators_lock_pipe_token_and_instance_shapes() { let namespace = "012345abcdef"; let random = "AbCdEfGhIjKlMnOpQrStUvWxYz012345"; - let name = format!(r"\\.\pipe\x-code-peer-v1-{namespace}-{random}"); + let name = format!(r"\\.\pipe\x-code-peer-v2-{namespace}-{random}"); assert!(valid_pipe_name_shape(&name, Some(namespace))); assert!(!valid_pipe_name_shape(&name, Some("fedcba543210"))); assert!(!valid_pipe_name_shape( - r"\\.\pipe\x-code-peer-v1-012345abcdef-../../bad", + r"\\.\pipe\x-code-peer-v2-012345abcdef-../../bad", None )); assert!(valid_inbox_token(&"A".repeat(INBOX_TOKEN_BYTES))); diff --git a/packages/core/scripts/native-artifacts.mjs b/packages/core/scripts/native-artifacts.mjs index b3f66d3..f6181c1 100644 --- a/packages/core/scripts/native-artifacts.mjs +++ b/packages/core/scripts/native-artifacts.mjs @@ -5,7 +5,7 @@ import path from 'node:path' export const WINDOWS_NATIVE_ARCHES = ['x64', 'arm64'] export const WINDOWS_NATIVE_MANIFEST_VERSION = 2 export const WINDOWS_SUPERVISOR_PROTOCOL_VERSION = 2 -export const WINDOWS_PEER_BROKER_PROTOCOL_VERSION = 1 +export const WINDOWS_PEER_BROKER_PROTOCOL_VERSION = 2 export const WINDOWS_NATIVE_ARTIFACTS = { shellSupervisor: { diff --git a/packages/core/src/agent/pdf-ingest.ts b/packages/core/src/agent/pdf-ingest.ts index 8c46fec..4550336 100644 --- a/packages/core/src/agent/pdf-ingest.ts +++ b/packages/core/src/agent/pdf-ingest.ts @@ -1,4 +1,7 @@ +import { fork } from 'node:child_process' +import type { ChildProcess } from 'node:child_process' import path from 'node:path' +import { fileURLToPath } from 'node:url' import { Worker } from 'node:worker_threads' import { isModelAcceptedImageMime, normalizeImageMime } from '../providers/capabilities.js' @@ -23,6 +26,7 @@ export const PDF_ANALYSIS_PAGE_LIMIT = 200 export const PDF_MAX_DECLARED_PAGES = 2_000 const PDF_PROCESS_TIMEOUT_MS = 120_000 const PDF_WORKER_OPERATION_TIMEOUT_MS = 30_000 +const PDF_WORKER_SHUTDOWN_TIMEOUT_MS = 5_000 export type PdfMode = 'auto' | 'text-only' | 'visual' export type PdfPageKind = 'text' | 'visual' | 'both' @@ -111,26 +115,114 @@ function pdfWorkerUrl(): URL { return new URL('./pdf-render-worker.js', current) } +type PdfWorkerMessageListener = (response: PdfRenderResponse) => void +type PdfWorkerErrorListener = (error: Error) => void +type PdfWorkerExitListener = (code: number) => void + +class PdfWorkerEndpoint { + private readonly child?: ChildProcess + private readonly thread?: Worker + + constructor() { + if (process.platform === 'win32') { + // @napi-rs/canvas can fault the host when loaded in a Windows Worker thread; a process contains native faults. + this.child = fork(fileURLToPath(pdfWorkerUrl()), [], { + execArgv: ['--max-old-space-size=512'], + serialization: 'advanced', + stdio: ['ignore', 'ignore', 'ignore', 'ipc'], + }) + return + } + this.thread = new Worker(pdfWorkerUrl(), { + execArgv: [], + resourceLimits: { maxOldGenerationSizeMb: 512, stackSizeMb: 8 }, + }) + } + + onMessage(listener: PdfWorkerMessageListener): void { + if (this.thread) this.thread.on('message', listener) + else this.child!.on('message', (message) => listener(message as PdfRenderResponse)) + } + + onError(listener: PdfWorkerErrorListener): void { + if (this.thread) this.thread.on('error', listener) + else this.child!.on('error', listener) + } + + onExit(listener: PdfWorkerExitListener): void { + if (this.thread) this.thread.on('exit', listener) + else this.child!.on('exit', (code) => listener(code ?? 1)) + } + + onceExit(listener: PdfWorkerExitListener): () => void { + if (this.thread) { + this.thread.once('exit', listener) + return () => this.thread!.off('exit', listener) + } + const childListener = (code: number | null): void => listener(code ?? 1) + this.child!.once('exit', childListener) + return () => this.child!.off('exit', childListener) + } + + postMessage(request: PdfRenderRequest, transfer: ArrayBuffer[]): void { + if (this.thread) { + this.thread.postMessage(request, transfer) + return + } + if (!this.child!.connected) throw new Error('PDF render process IPC channel is closed') + this.child!.send(request) + } + + async terminate(): Promise { + if (this.thread) { + await this.thread.terminate().catch(() => {}) + return + } + const child = this.child! + if (child.exitCode !== null || child.signalCode !== null) return + const exited = this.waitForChildExit(1_000) + child.kill() + if (await exited) return + const killed = this.waitForChildExit(1_000) + child.kill('SIGKILL') + await killed + } + + private waitForChildExit(timeoutMs: number): Promise { + const child = this.child! + if (child.exitCode !== null || child.signalCode !== null) return Promise.resolve(true) + return new Promise((resolve) => { + const onExit = (): void => finish(true) + const finish = (exited: boolean): void => { + clearTimeout(timer) + child.off('exit', onExit) + resolve(exited) + } + const timer = setTimeout(() => finish(false), timeoutMs) + child.once('exit', onExit) + }) + } +} + class PdfWorkerClient { - private readonly worker: Worker + private readonly worker: PdfWorkerEndpoint private readonly pending = new Map() private readonly abortSignal?: AbortSignal private nextId = 1 + private closing = false private terminated = false + private terminationPromise?: Promise constructor(abortSignal?: AbortSignal) { this.abortSignal = abortSignal - this.worker = new Worker(pdfWorkerUrl(), { - execArgv: [], - resourceLimits: { maxOldGenerationSizeMb: 512, stackSizeMb: 8 }, - }) - this.worker.on('message', (response: PdfRenderResponse) => this.handleResponse(response)) - this.worker.on('error', (error) => { + this.worker = new PdfWorkerEndpoint() + this.worker.onMessage((response) => this.handleResponse(response)) + this.worker.onError((error) => { this.failAll(new PdfWorkerFailure(`PDF render worker failed: ${error.message}`)) void this.terminate() }) - this.worker.on('exit', (code) => { - const expected = this.terminated + this.worker.onExit((code) => { + const expected = (this.closing || this.terminated) && this.pending.size === 0 this.terminated = true if (!expected) this.failAll(new PdfWorkerFailure(`PDF render worker exited unexpectedly with code ${code}`)) }) @@ -161,17 +253,21 @@ class PdfWorkerClient { this.pending.clear() } - private request(request: PdfRenderRequest, transfer: ArrayBuffer[] = []): Promise { + private request( + request: PdfRenderRequest, + transfer: ArrayBuffer[] = [], + timeoutMs = PDF_WORKER_OPERATION_TIMEOUT_MS, + ): Promise { this.abortSignal?.throwIfAborted() if (this.terminated) return Promise.reject(new PdfWorkerFailure('PDF render worker is terminated')) return new Promise((resolve, reject) => { const timer = setTimeout(() => { this.pending.delete(request.id) - const error = new PdfWorkerFailure(`PDF worker operation timed out after ${PDF_WORKER_OPERATION_TIMEOUT_MS} ms`) + const error = new PdfWorkerFailure(`PDF worker operation timed out after ${timeoutMs} ms`) reject(error) this.failAll(error) void this.terminate() - }, PDF_WORKER_OPERATION_TIMEOUT_MS) + }, timeoutMs) this.pending.set(request.id, { resolve, reject, timer }) try { this.worker.postMessage(request, transfer) @@ -209,20 +305,56 @@ class PdfWorkerClient { } async dispose(): Promise { - this.abortSignal?.removeEventListener('abort', this.handleAbort) - if (this.terminated) return try { - await this.request({ id: this.nextId++, type: 'destroy' }) - } catch { - // worker termination below is the final cleanup path + if (this.terminationPromise) { + await this.terminationPromise + return + } + if (this.terminated) return + try { + await this.request({ id: this.nextId++, type: 'destroy' }, [], PDF_WORKER_SHUTDOWN_TIMEOUT_MS) + } catch { + await this.terminate() + return + } + this.closing = true + // Immediate worker.terminate() can race @napi-rs/canvas finalizers and crash the host process on Windows. + if (await this.waitForExit(PDF_WORKER_SHUTDOWN_TIMEOUT_MS)) { + if (this.terminationPromise) await this.terminationPromise + return + } + await this.terminate() + } finally { + this.abortSignal?.removeEventListener('abort', this.handleAbort) } - await this.terminate() } - private async terminate(): Promise { - if (this.terminated) return + private waitForExit(timeoutMs: number): Promise { + if (this.terminated) return Promise.resolve(true) + return new Promise((resolve) => { + let settled = false + let removeExitListener = (): void => {} + const finish = (exited: boolean): void => { + if (settled) return + settled = true + clearTimeout(timer) + removeExitListener() + resolve(exited) + } + const onExit = (): void => finish(true) + const timer = setTimeout(() => finish(false), timeoutMs) + removeExitListener = this.worker.onceExit(onExit) + if (this.terminated) finish(true) + }) + } + + private terminate(): Promise { + if (this.terminationPromise) return this.terminationPromise + if (this.terminated) return Promise.resolve() + this.closing = true this.terminated = true - await this.worker.terminate().catch(() => {}) + this.terminationPromise = this.worker.terminate().catch(() => {}) + return this.terminationPromise } } diff --git a/packages/core/src/agent/pdf-render-worker.ts b/packages/core/src/agent/pdf-render-worker.ts index c9f85fe..ac3500b 100644 --- a/packages/core/src/agent/pdf-render-worker.ts +++ b/packages/core/src/agent/pdf-render-worker.ts @@ -4,8 +4,7 @@ import { parentPort } from 'node:worker_threads' import type { PdfRenderRequest, PdfRenderResponse } from './pdf-render-protocol.js' -if (!parentPort) throw new Error('PDF render worker requires a parent port') -const port = parentPort +if (!parentPort && !process.send) throw new Error('PDF render worker requires a parent channel') let parser: PDFParse | null = null let queue: Promise = Promise.resolve() @@ -68,13 +67,38 @@ async function handleRequest(request: PdfRenderRequest): Promise { +function send(response: PdfRenderResponse): Promise { + if (parentPort) { + if (response.ok && response.result.type === 'render') parentPort.postMessage(response, [response.result.data]) + else parentPort.postMessage(response) + return Promise.resolve(true) + } + if (!process.send || !process.connected) return Promise.resolve(false) + return new Promise((resolve) => { + try { + process.send!(response, (error) => resolve(!error)) + } catch { + resolve(false) + } + }) +} + +function closeChannel(): void { + if (parentPort) parentPort.close() + else if (process.connected) process.disconnect() +} + +function onRequest(request: PdfRenderRequest): void { queue = queue.then(async () => { const response = await handleRequest(request) - if (response.ok && response.result.type === 'render') { - port.postMessage(response, [response.result.data]) - } else { - port.postMessage(response) - } + const shouldClose = response.ok && response.result.type === 'destroy' + const sent = await send(response) + if (shouldClose || !sent) closeChannel() }) -}) +} + +if (parentPort) parentPort.on('message', onRequest) +else { + process.once('disconnect', () => process.exit(0)) + process.on('message', (request) => onRequest(request as PdfRenderRequest)) +} diff --git a/packages/core/src/native/windows-native-artifact.ts b/packages/core/src/native/windows-native-artifact.ts new file mode 100644 index 0000000..ab7fb03 --- /dev/null +++ b/packages/core/src/native/windows-native-artifact.ts @@ -0,0 +1,130 @@ +import { createHash } from 'node:crypto' +import fs from 'node:fs/promises' +import path from 'node:path' + +export const WINDOWS_NATIVE_MANIFEST_VERSION = 2 + +const WINDOWS_PE_MACHINES: Record<'x64' | 'arm64', number> = { x64: 0x8664, arm64: 0xaa64 } + +interface WindowsNativeManifestEntry { + file: string + protocolVersion: number + sha256: string + sourceSha256: string +} + +interface WindowsNativeManifest { + manifestVersion: number + artifacts: Record | undefined> +} + +export interface WindowsNativeArtifact { + executablePath: string + sha256: string + protocolVersion: number +} + +type WindowsNativeArtifactFailure = 'unsupported-arch' | 'missing' | 'protocol-mismatch' | 'integrity-mismatch' + +export interface WindowsNativeArtifactSpec { + artifactName: string + executableName: string + displayName: string + protocolVersion: number + createError?: (failure: WindowsNativeArtifactFailure, message: string, cause?: unknown) => Error +} + +function failure( + spec: WindowsNativeArtifactSpec, + kind: WindowsNativeArtifactFailure, + message: string, + cause?: unknown, +): never { + if (spec.createError) throw spec.createError(kind, message, cause) + throw new Error(message, cause === undefined ? undefined : { cause }) +} + +function verifyPeArchitecture(bytes: Buffer, arch: 'x64' | 'arm64', spec: WindowsNativeArtifactSpec): void { + if (bytes.length < 0x40 || bytes.readUInt16LE(0) !== 0x5a4d) { + failure(spec, 'integrity-mismatch', `${spec.displayName} is not a PE executable for ${arch}`) + } + const peOffset = bytes.readUInt32LE(0x3c) + if ( + peOffset + 6 > bytes.length || + bytes.readUInt32LE(peOffset) !== 0x00004550 || + bytes.readUInt16LE(peOffset + 4) !== WINDOWS_PE_MACHINES[arch] + ) { + failure(spec, 'integrity-mismatch', `${spec.displayName} PE architecture mismatch for ${arch}`) + } +} + +export function resolveWindowsNativeRoot(modulePath: string): string { + let directory = path.dirname(path.resolve(modulePath)) + for (let depth = 0; depth < 8; depth++) { + const name = path.basename(directory) + if (name === 'dist') return path.join(directory, 'native', 'windows') + if (name === 'src') return path.join(path.dirname(directory), 'dist', 'native', 'windows') + const parent = path.dirname(directory) + if (parent === directory) break + directory = parent + } + throw new Error(`Windows native helper has an unsupported package layout: ${modulePath}`) +} + +export async function resolveWindowsNativeArtifact(options: { + arch?: NodeJS.Architecture + nativeRoot: string + spec: WindowsNativeArtifactSpec +}): Promise { + const arch = options.arch ?? process.arch + const { nativeRoot, spec } = options + if (arch !== 'x64' && arch !== 'arm64') { + failure(spec, 'unsupported-arch', `${spec.displayName} does not support architecture ${arch}`) + } + let manifest: WindowsNativeManifest + try { + manifest = JSON.parse(await fs.readFile(path.join(nativeRoot, 'manifest.json'), 'utf8')) as WindowsNativeManifest + } catch (error) { + failure(spec, 'missing', `${spec.displayName} is missing for ${arch}; reinstall x-code-cli`, error) + } + if (manifest.manifestVersion !== WINDOWS_NATIVE_MANIFEST_VERSION) { + failure( + spec, + 'protocol-mismatch', + `Windows native manifest mismatch: expected ${WINDOWS_NATIVE_MANIFEST_VERSION}, received ${manifest.manifestVersion}`, + ) + } + const artifact = manifest.artifacts?.[arch]?.[spec.artifactName] + if (!artifact) failure(spec, 'missing', `${spec.displayName} manifest has no ${arch} artifact`) + if (artifact.protocolVersion !== spec.protocolVersion) { + failure( + spec, + 'protocol-mismatch', + `${spec.displayName} protocol mismatch: expected ${spec.protocolVersion}, received ${artifact.protocolVersion}`, + ) + } + if (!/^[a-f0-9]{64}$/.test(artifact.sha256) || !/^[a-f0-9]{64}$/.test(artifact.sourceSha256)) { + failure(spec, 'integrity-mismatch', `${spec.displayName} manifest hash is invalid`) + } + const expectedFile = `${arch}/${spec.executableName}` + if (artifact.file !== expectedFile) { + failure(spec, 'integrity-mismatch', `${spec.displayName} manifest has an invalid ${arch} path`) + } + const executablePath = path.resolve(nativeRoot, artifact.file) + const relative = path.relative(nativeRoot, executablePath) + if (relative.startsWith('..') || path.isAbsolute(relative)) { + failure(spec, 'integrity-mismatch', `${spec.displayName} path escapes its native directory`) + } + let bytes: Buffer + try { + bytes = await fs.readFile(executablePath) + } catch (error) { + failure(spec, 'missing', `${spec.displayName} is missing for ${arch}; reinstall x-code-cli`, error) + } + verifyPeArchitecture(bytes, arch, spec) + const actualHash = createHash('sha256').update(bytes).digest('hex') + if (actualHash !== artifact.sha256) { + failure(spec, 'integrity-mismatch', `${spec.displayName} hash mismatch for ${arch}`) + } + return { executablePath, sha256: actualHash, protocolVersion: artifact.protocolVersion } +} diff --git a/packages/core/src/peers/index.ts b/packages/core/src/peers/index.ts index dbd5c57..65e8bda 100644 --- a/packages/core/src/peers/index.ts +++ b/packages/core/src/peers/index.ts @@ -7,7 +7,7 @@ export { peerSocketPath, } from './paths.js' export { createPeerRegistry } from './registry.js' -export type { PeerRegistry, PeerRegistryOptions } from './registry.js' +export type { PeerRegistry } from './registry.js' export { decideInboundDisposition } from './inbound-policy.js' export type { InboundPolicyInput } from './inbound-policy.js' export { createPeerRateLimiter } from './rate-limit.js' @@ -23,19 +23,8 @@ export type { export { listAgentsTool, sendMessageTool } from './tools.js' export { MAX_FRAME_BYTES, MAX_MESSAGE_BYTES, NdjsonFrameDecoder, encodePeerFrame, parsePeerFrame } from './protocol.js' export type { PeerFrameV1 } from './protocol.js' -export { createPlatformPeerTransport } from './platform-transport.js' -export type { PlatformPeerTransportOptions } from './platform-transport.js' export { createUnixSocketTransport } from './unix-socket-transport.js' -export type { UnixSocketTransportOptions } from './unix-socket-transport.js' -export { createWindowsNamedPipeTransport } from './windows-named-pipe-transport.js' -export type { WindowsNamedPipeTransportOptions } from './windows-named-pipe-transport.js' export type { PeerTransport, PeerTransportServer } from './transport.js' export { stripTerminalControls } from './terminal-sanitize.js' export { MAX_REGISTRATION_BYTES, MAX_REGISTRATION_CANDIDATES, PEER_PROTOCOL_VERSION } from './types.js' -export type { - CandidateScanResult, - PeerIdentity, - PeerRegistrationV1, - PeerTransportDescriptor, - RegistrationCandidate, -} from './types.js' +export type { CandidateScanResult, PeerIdentity, PeerRegistrationV1, RegistrationCandidate } from './types.js' diff --git a/packages/core/src/peers/platform-transport.ts b/packages/core/src/peers/platform-transport.ts index 2108f7e..eed09bb 100644 --- a/packages/core/src/peers/platform-transport.ts +++ b/packages/core/src/peers/platform-transport.ts @@ -15,7 +15,6 @@ function createUnsupportedTransport(): PeerTransport { } return { kind: 'unix', - createAddressHint: unsupported, validateAddress: () => false, listen: async () => unsupported(), request: async () => unsupported(), diff --git a/packages/core/src/peers/registry.ts b/packages/core/src/peers/registry.ts index b98185a..1e5936a 100644 --- a/packages/core/src/peers/registry.ts +++ b/packages/core/src/peers/registry.ts @@ -19,6 +19,7 @@ import { type WindowsPeerRuntimeSecurityProvider, createWindowsPeerRuntimeSecurity, } from './windows-peer-runtime-security.js' +import { isValidWindowsPeerPipeAddress } from './windows-pipe-address.js' function exactKeys(record: Record, allowed: readonly string[]): boolean { const allowedSet = new Set(allowed) @@ -29,11 +30,6 @@ function validIsoDate(value: unknown): value is string { return typeof value === 'string' && value.length <= 64 && Number.isFinite(Date.parse(value)) } -export function isValidWindowsPeerPipeAddress(address: string, namespaceId?: string): boolean { - const match = /^\\\\\.\\pipe\\x-code-peer-v1-([a-f0-9]{12})-([A-Za-z0-9_-]{32})$/.exec(address) - return Boolean(match && (!namespaceId || match[1] === namespaceId)) -} - export function parseRegistration( value: unknown, runtime: { socketDir: string; namespaceId?: string }, @@ -282,11 +278,12 @@ export function createPeerRegistry(options: PeerRegistryOptions = {}): PeerRegis async listLive(options) { const scan = await this.listCandidates() + const activeTransportKind = options.transport.kind ?? transportKind const candidates = scan.candidates.filter( (candidate) => candidate.registration.instanceId !== options.senderInstanceId && - candidate.registration.transport.kind === options.transport.kind && - options.transport.validateAddress(candidate.registration.transport.address), + candidate.registration.transport.kind === activeTransportKind && + (options.transport.validateAddress?.(candidate.registration.transport.address) ?? true), ) const registrations: RegistrationCandidate[] = [] const concurrency = Math.min(16, Math.max(8, options.concurrency ?? 12)) @@ -393,7 +390,8 @@ export function createPeerRegistry(options: PeerRegistryOptions = {}): PeerRegis if (error.code !== 'ENOENT') throw error }) if ( - transport?.kind === registration.transport.kind && + transport && + (transport.kind ?? transportKind) === registration.transport.kind && transport.cleanupConfirmedDeadEndpoint && !remainingBeforeRemoval.truncated && remainingBeforeRemoval.rejected === 0 && diff --git a/packages/core/src/peers/service.ts b/packages/core/src/peers/service.ts index ed8d1f6..f13fd17 100644 --- a/packages/core/src/peers/service.ts +++ b/packages/core/src/peers/service.ts @@ -186,12 +186,15 @@ function peerErrorCode(error: unknown, fallback = 'PEER_IO_ERROR'): string { export function createPeerService(options: PeerServiceOptions = {}): PeerService { const config: PeerMessagingConfig = resolvePeerMessagingConfig(options.config) const enabled = options.enabled ?? false - const registry = options.registry ?? createPeerRegistry() + const registry = + options.registry ?? createPeerRegistry(options.transport ? { transportKind: options.transport.kind ?? 'unix' } : {}) const transport = options.transport ?? createPlatformPeerTransport({ getRuntimePaths: () => registry.paths(), }) + const transportKind = transport.kind ?? 'unix' + const isTransportAddressValid = (address: string): boolean => transport.validateAddress?.(address) ?? true const identity = enabled ? (options.identity ?? createPeerIdentity({ name: options.name, cwd: options.cwd, now: options.now })) : null @@ -238,8 +241,8 @@ export function createPeerService(options: PeerServiceOptions = {}): PeerService const sender = await registry.read(senderInstanceId) if ( !sender || - sender.registration.transport.kind !== transport.kind || - !transport.validateAddress(sender.registration.transport.address) + sender.registration.transport.kind !== transportKind || + !isTransportAddressValid(sender.registration.transport.address) ) { throw serviceError('PEER_AUTH_FAILED', 'Sender registration is missing or unsafe') } @@ -427,8 +430,8 @@ export function createPeerService(options: PeerServiceOptions = {}): PeerService const candidate = await registry.read(targetInstanceId) if ( !candidate || - candidate.registration.transport.kind !== transport.kind || - !transport.validateAddress(candidate.registration.transport.address) + candidate.registration.transport.kind !== transportKind || + !isTransportAddressValid(candidate.registration.transport.address) ) { return false } @@ -518,22 +521,15 @@ export function createPeerService(options: PeerServiceOptions = {}): PeerService registrationWritesEnabled = true await registry.initialize(signal) if (!startIsCurrent()) return - let addressHint: string - try { - addressHint = transport.createAddressHint(identity.instanceId) - } catch (error) { - if (transport.kind !== 'unix' || errorMessage(error) !== 'PEER_RUNTIME_NOT_INITIALIZED') throw error - addressHint = peerSocketPath(registry.paths().socketDir, identity.instanceId) - } localServer = await transport.listen({ - address: addressHint, + address: peerSocketPath(registry.paths().socketDir, identity.instanceId), instanceId: identity.instanceId, inboxToken: identity.inboxToken, onRequest, signal, }) if (!startIsCurrent()) return - if (!transport.validateAddress(localServer.address)) { + if (!isTransportAddressValid(localServer.address)) { throw serviceError('PEER_TRANSPORT_ADDRESS_INVALID', 'Peer transport returned an invalid address') } server = localServer @@ -545,7 +541,7 @@ export function createPeerService(options: PeerServiceOptions = {}): PeerService ...(options.sessionId ? { sessionId: options.sessionId } : {}), name: identity.name, cwd: options.cwd ?? process.cwd(), - transport: { kind: transport.kind, address: localServer.address }, + transport: { kind: transportKind, address: localServer.address }, inboxToken: identity.inboxToken, permissionClass: options.getPermissionClass?.() ?? options.permissionClass ?? 'prompted', status: 'idle', @@ -563,7 +559,7 @@ export function createPeerService(options: PeerServiceOptions = {}): PeerService }, 15_000) heartbeat.unref() started = true - void localServer.closed.then((result) => { + void localServer.closed?.then((result) => { if (result.expected || shuttingDown || server !== localServer || !started) return lifecycleGeneration++ started = false @@ -574,7 +570,7 @@ export function createPeerService(options: PeerServiceOptions = {}): PeerService if (heartbeat) clearInterval(heartbeat) heartbeat = undefined unavailableCode = - transport.kind === 'windows-pipe' + transportKind === 'windows-pipe' ? 'PEER_WINDOWS_BROKER_EXITED' : peerErrorCode(result.reason, 'PEER_IO_ERROR') unavailableReason = result.reason ?? 'Peer transport exited unexpectedly.' @@ -681,8 +677,8 @@ export function createPeerService(options: PeerServiceOptions = {}): PeerService candidate = await registry.read(retry.record.receiverInstanceId) if ( !candidate || - candidate.registration.transport.kind !== transport.kind || - !transport.validateAddress(candidate.registration.transport.address) || + candidate.registration.transport.kind !== transportKind || + !isTransportAddressValid(candidate.registration.transport.address) || `peer:${candidate.registration.instanceId}` !== retry.record.receiverAddress ) { throw serviceError('PEER_STALE', 'The originally resolved receiver is no longer registered') @@ -741,8 +737,8 @@ export function createPeerService(options: PeerServiceOptions = {}): PeerService if ( !current || current.registration.instanceId !== prepared.candidate.registration.instanceId || - current.registration.transport.kind !== transport.kind || - !transport.validateAddress(current.registration.transport.address) || + current.registration.transport.kind !== transportKind || + !isTransportAddressValid(current.registration.transport.address) || current.registration.transport.address !== prepared.candidate.registration.transport.address || current.registration.inboxToken !== prepared.candidate.registration.inboxToken ) { diff --git a/packages/core/src/peers/transport.ts b/packages/core/src/peers/transport.ts index 9d2583d..3224915 100644 --- a/packages/core/src/peers/transport.ts +++ b/packages/core/src/peers/transport.ts @@ -3,14 +3,13 @@ import type { PeerTransportDescriptor } from './types.js' export interface PeerTransportServer { address: string - closed: Promise<{ expected: boolean; reason?: string }> + closed?: Promise<{ expected: boolean; reason?: string }> close(options?: { deadlineMs?: number }): Promise } export interface PeerTransport { - readonly kind: PeerTransportDescriptor['kind'] - createAddressHint(instanceId: string): string - validateAddress(address: string): boolean + readonly kind?: PeerTransportDescriptor['kind'] + validateAddress?(address: string): boolean listen(options: { address: string instanceId: string diff --git a/packages/core/src/peers/unix-socket-transport.ts b/packages/core/src/peers/unix-socket-transport.ts index d3482c9..d32dd7a 100644 --- a/packages/core/src/peers/unix-socket-transport.ts +++ b/packages/core/src/peers/unix-socket-transport.ts @@ -145,16 +145,10 @@ async function probeListener(options: { export function createUnixSocketTransport(dependencies: UnixSocketTransportOptions = {}): PeerTransport { const fileSystem = dependencies.fileSystem ?? fs - const createAddressHint = (instanceId: string): string => { - const socketDir = dependencies.getSocketDir?.() - if (!socketDir) throw new Error('PEER_RUNTIME_NOT_INITIALIZED') - return path.join(socketDir, `${instanceId.slice(0, 8)}.sock`) - } const validateAddress = (address: string): boolean => validUnixAddress(address, dependencies.getSocketDir?.()) if (process.platform === 'win32') { return { kind: 'unix', - createAddressHint, validateAddress, async listen() { throw new Error('PEER_UNSUPPORTED_PLATFORM') @@ -167,11 +161,11 @@ export function createUnixSocketTransport(dependencies: UnixSocketTransportOptio return { kind: 'unix', - createAddressHint, validateAddress, async listen(options): Promise { - const address = path.join(path.dirname(options.address), `p-${randomBytes(12).toString('base64url')}.sock`) + const socketDir = path.dirname(options.address) + const address = path.join(socketDir, `p-${randomBytes(12).toString('base64url')}.sock`) if (Buffer.byteLength(address, 'utf8') > 103) throw new Error('PEER_SOCKET_PATH_TOO_LONG') const ownershipProbeSenderId = randomUUID() const sockets = new Set() diff --git a/packages/core/src/peers/windows-named-pipe-transport.ts b/packages/core/src/peers/windows-named-pipe-transport.ts index c0d2f27..0052d82 100644 --- a/packages/core/src/peers/windows-named-pipe-transport.ts +++ b/packages/core/src/peers/windows-named-pipe-transport.ts @@ -1,18 +1,17 @@ -import { type ChildProcessWithoutNullStreams, spawn } from 'node:child_process' +import { spawn } from 'node:child_process' +import { setTimeout as delay } from 'node:timers/promises' -import { debugLog, errorMessage } from '../utils.js' +import { errorMessage } from '../utils.js' import { NdjsonFrameDecoder, encodePeerFrame } from './protocol.js' import type { PeerFrameV1 } from './protocol.js' import { stripTerminalControls } from './terminal-sanitize.js' import type { PeerTransport, PeerTransportServer } from './transport.js' import { type WindowsPeerBrokerArtifact, resolveWindowsPeerBrokerArtifact } from './windows-peer-broker-artifact.js' +import { type WindowsPeerBrokerProcess, spawnWindowsPeerBrokerProcess } from './windows-peer-broker-process.js' import { WINDOWS_PEER_BROKER_MAX_OPERATIONS, - WINDOWS_PEER_BROKER_PROTOCOL_VERSION, type WindowsPeerBrokerFrame, - WindowsPeerBrokerFrameDecoder, WindowsPeerBrokerFrameKind, - decodeCancelAckPayload, decodeInboundRequestPayload, decodeOneStringPayload, decodeOperationErrorPayload, @@ -20,14 +19,16 @@ import { encodeOutboundRequestPayload, encodePeerFramePayload, encodeStartServerPayload, - encodeWindowsPeerBrokerFrame, } from './windows-peer-broker-protocol.js' +import { isValidWindowsPeerPipeAddress } from './windows-pipe-address.js' const DEFAULT_REQUEST_TIMEOUT_MS = 3_000 -const TOMBSTONE_TTL_MS = 5_000 const STARTUP_TIMEOUT_MS = 5_000 const INBOUND_CALLBACK_TIMEOUT_MS = 29_000 -const MAX_STDERR_BYTES = 4_096 +const CAPACITY_RETRY_DELAY_MS = 10 +const CANCELED_OPERATION_TTL_MS = 125_000 +const MAX_CANCELED_OPERATIONS = WINDOWS_PEER_BROKER_MAX_OPERATIONS * 4 +const SHUTDOWN_OPERATION_ID = 0xffff_ffff interface RuntimePaths { namespaceId?: string @@ -41,13 +42,11 @@ export interface WindowsNamedPipeTransportOptions { } interface PendingOperation { - state: 'active' | 'canceled' resolve: (frame: PeerFrameV1) => void reject: (error: unknown) => void timer: NodeJS.Timeout signal?: AbortSignal onAbort?: () => void - terminalSeen: boolean } interface StartupOperation { @@ -76,29 +75,22 @@ function parseBusinessFrame(bytes: Buffer): PeerFrameV1 { return frames[0]! } -function validPipeAddress(address: string, namespaceId?: string): boolean { - const match = /^\\\\\.\\pipe\\x-code-peer-v1-([a-f0-9]{12})-([A-Za-z0-9_-]{32})$/.exec(address) - return Boolean(match && namespaceId && match[1] === namespaceId) -} - class BrokerClient { readonly closed: Promise<{ expected: boolean; reason?: string }> - private readonly child: ChildProcessWithoutNullStreams - private readonly decoder = new WindowsPeerBrokerFrameDecoder() + private readonly brokerProcess: WindowsPeerBrokerProcess private readonly pending = new Map() - private readonly tombstones = new Map() + private readonly canceled = new Map() private readonly inbound = new Set() private readonly onRequest: (frame: PeerFrameV1, senderInstanceId: string) => Promise private readonly requestTimeoutMs: number private readonly resolveClosed: (result: { expected: boolean; reason?: string }) => void private nextOperationId = 1 private startup?: StartupOperation - private writeTail: Promise = Promise.resolve() private expectedClose = false private exited = false private fatalReason?: string - private stderr = '' private resolveShutdown?: () => void + private closePromise?: Promise constructor( artifact: WindowsPeerBrokerArtifact, @@ -115,30 +107,15 @@ class BrokerClient { resolveClosed = resolve }) this.resolveClosed = resolveClosed - this.child = options.spawnBroker( - artifact.executablePath, - ['broker', '--protocol', String(WINDOWS_PEER_BROKER_PROTOCOL_VERSION)], - { - stdio: ['pipe', 'pipe', 'pipe'], - windowsHide: true, - }, - ) - this.child.stdout.on('data', (chunk: Buffer) => this.onStdout(chunk)) - this.child.stdout.once('end', () => { - try { - this.decoder.finish() - } catch (error) { - this.fail(error) - } - }) - this.child.stderr.on('data', (chunk: Buffer) => { - if (this.stderr.length >= MAX_STDERR_BYTES) return - const text = stripTerminalControls(chunk.toString('utf8')).slice(0, MAX_STDERR_BYTES - this.stderr.length) - this.stderr += text - if (text) debugLog('peer.windows.broker-stderr', text) + this.brokerProcess = spawnWindowsPeerBrokerProcess({ + artifact, + mode: 'broker', + spawnBroker: options.spawnBroker, + debugKey: 'peer.windows.broker-stderr', + onFrame: (frame) => this.handleFrame(frame), + onError: (error) => this.fail(error), + onClose: () => this.onExit(), }) - this.child.once('error', (error) => this.fail(error)) - this.child.once('exit', () => this.onExit()) } async startServer(input: { namespaceId: string; instanceId: string; inboxToken: string }): Promise { @@ -169,6 +146,52 @@ class BrokerClient { }): Promise { if (options.signal?.aborted) return Promise.reject(abortError()) const timeoutMs = Math.min(120_000, Math.max(1, options.timeoutMs ?? this.requestTimeoutMs)) + return this.requestWithCapacityRetry(options, timeoutMs) + } + + private async requestWithCapacityRetry( + options: { + address: string + targetToken: string + senderInstanceId: string + frame: PeerFrameV1 + signal?: AbortSignal + }, + timeoutMs: number, + ): Promise { + const deadline = Date.now() + timeoutMs + while (true) { + const remainingMs = deadline - Date.now() + if (remainingMs <= 0) { + throw transportError('PEER_WINDOWS_REQUEST_TIMEOUT', 'Windows peer request timed out') + } + try { + return await this.requestOnce(options, remainingMs) + } catch (error) { + if (!(error instanceof Error) || error.name !== 'PEER_WINDOWS_OPERATION_CAPACITY') throw error + if (options.signal?.aborted) throw abortError() + const retryDelayMs = Math.min(CAPACITY_RETRY_DELAY_MS, deadline - Date.now()) + if (retryDelayMs <= 0) throw error + try { + await delay(retryDelayMs, undefined, { signal: options.signal, ref: false }) + } catch (delayError) { + if (options.signal?.aborted) throw abortError() + throw delayError + } + } + } + } + + private requestOnce( + options: { + address: string + targetToken: string + senderInstanceId: string + frame: PeerFrameV1 + signal?: AbortSignal + }, + timeoutMs: number, + ): Promise { let payload: Buffer try { payload = encodeOutboundRequestPayload({ @@ -181,7 +204,6 @@ class BrokerClient { } catch (error) { return Promise.reject(error) } - this.purgeTombstones() if (this.pending.size >= WINDOWS_PEER_BROKER_MAX_OPERATIONS) { return Promise.reject( transportError('PEER_WINDOWS_OPERATION_CAPACITY', 'Windows peer broker operation capacity is exhausted'), @@ -200,13 +222,11 @@ class BrokerClient { ) timer.unref() this.pending.set(operationId, { - state: 'active', resolve, reject, timer, signal: options.signal, onAbort, - terminalSeen: false, }) options.signal?.addEventListener('abort', onAbort, { once: true }) void this.send({ @@ -217,63 +237,63 @@ class BrokerClient { }) } - async close(deadlineMs: number): Promise { - if (this.expectedClose) { - await this.closed - return - } + close(deadlineMs: number): Promise { + this.closePromise ??= this.closeOnce(deadlineMs) + return this.closePromise + } + + private async closeOnce(deadlineMs: number): Promise { this.expectedClose = true if (this.exited) return - const operationId = this.allocateOperationId() const shutdown = new Promise((resolve) => { this.resolveShutdown = resolve }) - await this.send({ kind: WindowsPeerBrokerFrameKind.Shutdown, operationId, payload: Buffer.alloc(0) }).catch( - () => {}, - ) + await this.send({ + kind: WindowsPeerBrokerFrameKind.Shutdown, + operationId: SHUTDOWN_OPERATION_ID, + payload: Buffer.alloc(0), + }).catch(() => {}) let timer: NodeJS.Timeout | undefined - await Promise.race([ - shutdown, - new Promise((resolve) => { - timer = setTimeout(resolve, Math.max(0, deadlineMs)) + const acknowledged = await Promise.race([ + shutdown.then(() => true), + this.closed.then(() => false), + new Promise((resolve) => { + timer = setTimeout(() => resolve(false), Math.max(0, deadlineMs)) timer.unref() }), ]) if (timer) clearTimeout(timer) - if (!this.exited) this.child.kill() - await Promise.race([ - this.closed.then(() => {}), - new Promise((resolve) => { - const forceTimer = setTimeout(resolve, 250) - forceTimer.unref() - }), - ]) + if (acknowledged) await this.waitForExit(250) + if (!this.exited) this.brokerProcess.kill() + await this.waitForExit(250) } - private allocateOperationId(): number { - this.purgeTombstones() - for (let attempt = 0; attempt <= WINDOWS_PEER_BROKER_MAX_OPERATIONS * 2; attempt++) { - const operationId = this.nextOperationId - this.nextOperationId = this.nextOperationId === 0xffff_ffff ? 1 : this.nextOperationId + 1 - if ( - operationId !== 0 && - !this.pending.has(operationId) && - !this.tombstones.has(operationId) && - this.startup?.operationId !== operationId - ) { - return operationId - } + private async waitForExit(deadlineMs: number): Promise { + if (this.exited) return true + let timer: NodeJS.Timeout | undefined + try { + return await Promise.race([ + this.closed.then(() => true), + new Promise((resolve) => { + timer = setTimeout(() => resolve(false), Math.max(0, deadlineMs)) + timer.unref() + }), + ]) + } finally { + if (timer) clearTimeout(timer) } - throw transportError('PEER_WINDOWS_OPERATION_CAPACITY', 'Windows peer broker operation IDs are exhausted') } - private onStdout(chunk: Buffer): void { - if (this.exited) return - try { - for (const frame of this.decoder.push(chunk)) this.handleFrame(frame) - } catch (error) { - this.fail(error) + private allocateOperationId(): number { + if (this.nextOperationId >= SHUTDOWN_OPERATION_ID) { + const failure = transportError( + 'PEER_WINDOWS_OPERATION_CAPACITY', + 'Windows peer broker operation IDs are exhausted', + ) + this.fail(failure) + throw failure } + return this.nextOperationId++ } private handleFrame(frame: WindowsPeerBrokerFrame): void { @@ -290,9 +310,6 @@ class BrokerClient { case WindowsPeerBrokerFrameKind.OperationError: this.handleOperationError(frame) return - case WindowsPeerBrokerFrameKind.CancelAck: - this.handleCancelAck(frame) - return case WindowsPeerBrokerFrameKind.ServerFatal: { if (frame.operationId !== 0) throw this.protocolViolation('SERVER_FATAL operation ID must be zero') const failure = decodeOperationErrorPayload(frame.payload) @@ -304,7 +321,9 @@ class BrokerClient { if (frame.operationId !== 0 || frame.payload.length !== 0) { throw this.protocolViolation('SHUTDOWN_COMPLETE frame is invalid') } - this.resolveShutdown?.() + if (!this.resolveShutdown) throw this.protocolViolation('Unexpected SHUTDOWN_COMPLETE frame') + this.resolveShutdown() + this.resolveShutdown = undefined return default: throw this.protocolViolation('Unexpected broker-to-Node frame kind') @@ -384,53 +403,26 @@ class BrokerClient { private handleTerminal(frame: WindowsPeerBrokerFrame, failure: Error | undefined): void { const pending = this.pending.get(frame.operationId) if (!pending) { - if (this.tombstones.has(frame.operationId)) { - this.tombstones.delete(frame.operationId) - return - } - throw this.protocolViolation('Terminal response references an unknown operation ID') + if (this.consumeCanceled(frame.operationId)) return + throw this.protocolViolation('Unexpected terminal operation ID') } let response: PeerFrameV1 | undefined if (!failure && frame.kind === WindowsPeerBrokerFrameKind.OutboundResponse) { response = parseBusinessFrame(decodePeerFramePayload(frame.payload)) } - if (pending.state === 'canceled') { - pending.terminalSeen = true - return - } this.pending.delete(frame.operationId) this.disposePending(pending) if (failure) pending.reject(failure) else pending.resolve(response!) } - private handleCancelAck(frame: WindowsPeerBrokerFrame): void { - const pending = this.pending.get(frame.operationId) - if (!pending || pending.state !== 'canceled') { - if (this.tombstones.has(frame.operationId)) return - throw this.protocolViolation('Cancel acknowledgement references an unknown operation ID') - } - const status = decodeCancelAckPayload(frame.payload) - if (status === 'canceled' || pending.terminalSeen) { - this.pending.delete(frame.operationId) - this.disposePending(pending) - this.rememberTombstone(frame.operationId) - } - } - private cancelOperation(operationId: number, reason: Error): void { const pending = this.pending.get(operationId) - if (!pending || pending.state !== 'active') return - pending.state = 'canceled' + if (!pending) return + this.pending.delete(operationId) + this.rememberCanceled(operationId) this.disposePending(pending) pending.reject(reason) - pending.timer = setTimeout(() => { - const current = this.pending.get(operationId) - if (current?.state !== 'canceled') return - this.pending.delete(operationId) - this.disposePending(current) - }, TOMBSTONE_TTL_MS) - pending.timer.unref() void this.send({ kind: WindowsPeerBrokerFrameKind.CancelOperation, operationId, @@ -443,7 +435,6 @@ class BrokerClient { if (!pending) return this.pending.delete(operationId) this.disposePending(pending) - this.rememberTombstone(operationId) pending.reject(error) } @@ -452,19 +443,26 @@ class BrokerClient { if (pending.signal && pending.onAbort) pending.signal.removeEventListener('abort', pending.onAbort) } - private purgeTombstones(): void { + private rememberCanceled(operationId: number): void { const now = Date.now() - for (const [operationId, expiresAt] of this.tombstones) { - if (expiresAt <= now) this.tombstones.delete(operationId) + for (const [candidate, expiresAt] of this.canceled) { + if (expiresAt > now) continue + this.canceled.delete(candidate) } + if (this.canceled.size >= MAX_CANCELED_OPERATIONS) { + this.fail( + transportError('PEER_WINDOWS_OPERATION_CAPACITY', 'Windows peer broker cancellation tracking is exhausted'), + ) + return + } + this.canceled.set(operationId, now + CANCELED_OPERATION_TTL_MS) } - private rememberTombstone(operationId: number): void { - this.purgeTombstones() - this.tombstones.set(operationId, Date.now() + TOMBSTONE_TTL_MS) - while (this.tombstones.size > WINDOWS_PEER_BROKER_MAX_OPERATIONS) { - this.tombstones.delete(this.tombstones.keys().next().value!) - } + private consumeCanceled(operationId: number): boolean { + const expiresAt = this.canceled.get(operationId) + if (expiresAt === undefined) return false + this.canceled.delete(operationId) + return expiresAt > Date.now() } private send(frame: WindowsPeerBrokerFrame): Promise { @@ -473,24 +471,13 @@ class BrokerClient { transportError('PEER_WINDOWS_BROKER_EXITED', this.fatalReason ?? 'Windows peer broker exited unexpectedly'), ) } - const bytes = encodeWindowsPeerBrokerFrame(frame) - const operation = this.writeTail.then( - () => - new Promise((resolve, reject) => { - this.child.stdin.write(bytes, (error) => { - if (error) reject(error) - else resolve() - }) - }), - ) - this.writeTail = operation.catch(() => {}) - return operation + return this.brokerProcess.send(frame) } private fail(error: unknown): void { if (this.exited) return this.fatalReason = stripTerminalControls(errorMessage(error)) - this.child.kill() + this.brokerProcess.kill() } private onExit(): void { @@ -504,9 +491,10 @@ class BrokerClient { this.startup = undefined for (const pending of this.pending.values()) { this.disposePending(pending) - if (pending.state === 'active') pending.reject(failure) + pending.reject(failure) } this.pending.clear() + this.canceled.clear() this.inbound.clear() this.resolveShutdown?.() this.resolveClosed({ @@ -531,15 +519,11 @@ export function createWindowsNamedPipeTransport(options: WindowsNamedPipeTranspo } return { kind: 'windows-pipe', - createAddressHint: () => namespaceId(), - validateAddress: (address) => validPipeAddress(address, options.getRuntimePaths().namespaceId), + validateAddress: (address) => isValidWindowsPeerPipeAddress(address, options.getRuntimePaths().namespaceId), async listen(listenOptions) { if (server) throw transportError('PEER_WINDOWS_PIPE_CREATE_FAILED', 'Windows peer broker is already listening') const expectedNamespace = namespaceId() - if (listenOptions.address !== expectedNamespace) { - throw transportError('PEER_WINDOWS_PIPE_CREATE_FAILED', 'Windows peer broker namespace hint is invalid') - } if (listenOptions.signal?.aborted) throw abortError() const artifact = await (options.artifact ?? resolveWindowsPeerBrokerArtifact()) if (listenOptions.signal?.aborted) throw abortError() @@ -569,7 +553,7 @@ export function createWindowsNamedPipeTransport(options: WindowsNamedPipeTranspo ]).finally(() => { if (startupTimer) clearTimeout(startupTimer) }) - if (!validPipeAddress(address, expectedNamespace)) { + if (!isValidWindowsPeerPipeAddress(address, expectedNamespace)) { throw transportError( 'PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH', 'Windows peer broker returned an invalid pipe address', @@ -596,7 +580,7 @@ export function createWindowsNamedPipeTransport(options: WindowsNamedPipeTranspo if (!client || !server) { throw transportError('PEER_WINDOWS_BROKER_EXITED', 'Windows peer broker is not running') } - if (!validPipeAddress(requestOptions.address, namespaceId())) { + if (!isValidWindowsPeerPipeAddress(requestOptions.address, namespaceId())) { throw transportError('PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH', 'Windows peer pipe address is invalid') } return client.request(requestOptions) diff --git a/packages/core/src/peers/windows-peer-broker-artifact.ts b/packages/core/src/peers/windows-peer-broker-artifact.ts index b1051b3..a6ff8ff 100644 --- a/packages/core/src/peers/windows-peer-broker-artifact.ts +++ b/packages/core/src/peers/windows-peer-broker-artifact.ts @@ -1,133 +1,48 @@ -import { createHash } from 'node:crypto' -import fs from 'node:fs/promises' -import path from 'node:path' import { fileURLToPath } from 'node:url' +import { + type WindowsNativeArtifact, + type WindowsNativeArtifactSpec, + resolveWindowsNativeArtifact, + resolveWindowsNativeRoot, +} from '../native/windows-native-artifact.js' import { WINDOWS_PEER_BROKER_PROTOCOL_VERSION } from './windows-peer-broker-protocol.js' -const WINDOWS_NATIVE_MANIFEST_VERSION = 2 -const WINDOWS_PE_MACHINES: Record<'x64' | 'arm64', number> = { x64: 0x8664, arm64: 0xaa64 } - -interface WindowsPeerBrokerManifestEntry { - file: string - protocolVersion: number - sha256: string - sourceSha256: string +const SPEC: WindowsNativeArtifactSpec = { + artifactName: 'peerBroker', + executableName: 'xc-peer-broker.exe', + displayName: 'Windows peer broker', + protocolVersion: WINDOWS_PEER_BROKER_PROTOCOL_VERSION, + createError(failure, message, cause) { + const names = { + 'unsupported-arch': 'PEER_WINDOWS_UNSUPPORTED_ARCH', + missing: 'PEER_WINDOWS_HELPER_MISSING', + 'protocol-mismatch': 'PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH', + 'integrity-mismatch': 'PEER_WINDOWS_HELPER_HASH_MISMATCH', + } as const + const error = new Error(message, cause === undefined ? undefined : { cause }) + error.name = names[failure] + return error + }, } -interface WindowsNativeManifest { - manifestVersion: number - artifacts: Record -} - -export interface WindowsPeerBrokerArtifact { - executablePath: string - sha256: string - protocolVersion: number -} - -function artifactError(code: string, message: string, cause?: unknown): Error { - const error = new Error(message, cause === undefined ? undefined : { cause }) - error.name = code - return error -} +export type WindowsPeerBrokerArtifact = WindowsNativeArtifact export function resolveWindowsPeerBrokerNativeRoot(modulePath: string): string { - const moduleDir = path.dirname(modulePath) - if (!/^windows-peer-broker-artifact\.(?:[cm]?js|ts)$/.test(path.basename(modulePath))) { - if (path.basename(moduleDir) === 'dist') return path.join(moduleDir, 'native', 'windows') - if (path.basename(moduleDir) === 'chunks' && path.basename(path.dirname(moduleDir)) === 'dist') { - return path.join(path.dirname(moduleDir), 'native', 'windows') - } - throw artifactError( - 'PEER_WINDOWS_HELPER_MISSING', + try { + return resolveWindowsNativeRoot(modulePath) + } catch (error) { + throw SPEC.createError!( + 'missing', `Windows peer broker bundle has an unsupported package layout: ${modulePath}`, + error, ) } - - const sourceRoot = path.dirname(moduleDir) - if (path.basename(sourceRoot) === 'dist') return path.join(sourceRoot, 'native', 'windows') - if (path.basename(sourceRoot) === 'src') { - return path.join(path.dirname(sourceRoot), 'dist', 'native', 'windows') - } - throw artifactError( - 'PEER_WINDOWS_HELPER_MISSING', - `Windows peer broker module has an unsupported package layout: ${modulePath}`, - ) } -function verifyPeArchitecture(bytes: Buffer, arch: 'x64' | 'arm64'): void { - if (bytes.length < 0x40 || bytes.readUInt16LE(0) !== 0x5a4d) { - throw artifactError('PEER_WINDOWS_HELPER_HASH_MISMATCH', `Windows peer broker is not a PE executable for ${arch}`) - } - const peOffset = bytes.readUInt32LE(0x3c) - if ( - peOffset + 6 > bytes.length || - bytes.readUInt32LE(peOffset) !== 0x00004550 || - bytes.readUInt16LE(peOffset + 4) !== WINDOWS_PE_MACHINES[arch] - ) { - throw artifactError('PEER_WINDOWS_HELPER_HASH_MISMATCH', `Windows peer broker PE architecture mismatch for ${arch}`) - } -} - -export async function resolveWindowsPeerBrokerArtifact( +export function resolveWindowsPeerBrokerArtifact( arch: NodeJS.Architecture = process.arch, nativeRoot = resolveWindowsPeerBrokerNativeRoot(fileURLToPath(import.meta.url)), ): Promise { - if (arch !== 'x64' && arch !== 'arm64') { - throw artifactError('PEER_WINDOWS_UNSUPPORTED_ARCH', `Windows peer messaging does not support architecture ${arch}`) - } - let manifest: WindowsNativeManifest - try { - manifest = JSON.parse(await fs.readFile(path.join(nativeRoot, 'manifest.json'), 'utf8')) as WindowsNativeManifest - } catch (error) { - throw artifactError( - 'PEER_WINDOWS_HELPER_MISSING', - `Windows peer broker is missing for ${arch}; reinstall x-code-cli`, - error, - ) - } - if (manifest.manifestVersion !== WINDOWS_NATIVE_MANIFEST_VERSION) { - throw artifactError( - 'PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH', - `Windows native manifest mismatch: expected ${WINDOWS_NATIVE_MANIFEST_VERSION}, received ${manifest.manifestVersion}`, - ) - } - const artifact = manifest.artifacts?.[arch]?.peerBroker - if (!artifact) { - throw artifactError('PEER_WINDOWS_HELPER_MISSING', `Windows peer broker manifest has no ${arch} artifact`) - } - if (artifact.protocolVersion !== WINDOWS_PEER_BROKER_PROTOCOL_VERSION) { - throw artifactError( - 'PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH', - `Windows peer broker protocol mismatch: expected ${WINDOWS_PEER_BROKER_PROTOCOL_VERSION}, received ${artifact.protocolVersion}`, - ) - } - if (!/^[a-f0-9]{64}$/.test(artifact.sha256) || !/^[a-f0-9]{64}$/.test(artifact.sourceSha256)) { - throw artifactError('PEER_WINDOWS_HELPER_HASH_MISMATCH', 'Windows peer broker manifest hash is invalid') - } - if (artifact.file !== `${arch}/xc-peer-broker.exe`) { - throw artifactError('PEER_WINDOWS_HELPER_HASH_MISMATCH', `Windows peer broker manifest has an invalid ${arch} path`) - } - const executablePath = path.resolve(nativeRoot, artifact.file) - const relative = path.relative(nativeRoot, executablePath) - if (relative.startsWith('..') || path.isAbsolute(relative)) { - throw artifactError('PEER_WINDOWS_HELPER_HASH_MISMATCH', 'Windows peer broker path escapes its native directory') - } - let bytes: Buffer - try { - bytes = await fs.readFile(executablePath) - } catch (error) { - throw artifactError( - 'PEER_WINDOWS_HELPER_MISSING', - `Windows peer broker is missing for ${arch}; reinstall x-code-cli`, - error, - ) - } - verifyPeArchitecture(bytes, arch) - const actualHash = createHash('sha256').update(bytes).digest('hex') - if (actualHash !== artifact.sha256) { - throw artifactError('PEER_WINDOWS_HELPER_HASH_MISMATCH', `Windows peer broker hash mismatch for ${arch}`) - } - return { executablePath, sha256: actualHash, protocolVersion: artifact.protocolVersion } + return resolveWindowsNativeArtifact({ arch, nativeRoot, spec: SPEC }) } diff --git a/packages/core/src/peers/windows-peer-broker-process.ts b/packages/core/src/peers/windows-peer-broker-process.ts new file mode 100644 index 0000000..dd743fb --- /dev/null +++ b/packages/core/src/peers/windows-peer-broker-process.ts @@ -0,0 +1,100 @@ +import { type ChildProcessWithoutNullStreams, type spawn } from 'node:child_process' + +import { debugLog } from '../utils.js' +import { stripTerminalControls } from './terminal-sanitize.js' +import type { WindowsPeerBrokerArtifact } from './windows-peer-broker-artifact.js' +import { + WINDOWS_PEER_BROKER_PROTOCOL_VERSION, + type WindowsPeerBrokerFrame, + WindowsPeerBrokerFrameDecoder, + encodeWindowsPeerBrokerFrame, +} from './windows-peer-broker-protocol.js' + +const MAX_STDERR_BYTES = 4_096 + +export interface WindowsPeerBrokerProcess { + closed: Promise<{ code: number | null; signal: NodeJS.Signals | null }> + send(frame: WindowsPeerBrokerFrame): Promise + endInput(): void + kill(): void +} + +export function spawnWindowsPeerBrokerProcess(options: { + artifact: WindowsPeerBrokerArtifact + mode: 'broker' | 'secure-runtime' + spawnBroker: typeof spawn + debugKey: string + onFrame: (frame: WindowsPeerBrokerFrame) => void + onError: (error: unknown) => void + onClose?: (status: { code: number | null; signal: NodeJS.Signals | null }) => void +}): WindowsPeerBrokerProcess { + const child: ChildProcessWithoutNullStreams = options.spawnBroker( + options.artifact.executablePath, + [options.mode, '--protocol', String(WINDOWS_PEER_BROKER_PROTOCOL_VERSION)], + { stdio: ['pipe', 'pipe', 'pipe'], windowsHide: true }, + ) + const decoder = new WindowsPeerBrokerFrameDecoder() + let exited = false + let stderrBytes = 0 + let writeTail = Promise.resolve() + let resolveClosed!: (status: { code: number | null; signal: NodeJS.Signals | null }) => void + const closed = new Promise<{ code: number | null; signal: NodeJS.Signals | null }>((resolve) => { + resolveClosed = resolve + }) + + const fail = (error: unknown): void => options.onError(error) + child.stdin.on('error', fail) + child.stdout.on('error', fail) + child.stderr.on('error', fail) + child.stdout.on('data', (chunk: Buffer) => { + if (exited) return + try { + for (const frame of decoder.push(chunk)) options.onFrame(frame) + } catch (error) { + child.kill() + fail(error) + } + }) + child.stdout.once('end', () => { + try { + decoder.finish() + } catch (error) { + fail(error) + } + }) + child.stderr.on('data', (chunk: Buffer) => { + if (stderrBytes >= MAX_STDERR_BYTES) return + const bytes = chunk.subarray(0, MAX_STDERR_BYTES - stderrBytes) + stderrBytes += bytes.length + const text = stripTerminalControls(bytes.toString('utf8')) + if (text) debugLog(options.debugKey, text) + }) + child.once('error', fail) + child.once('close', (code, signal) => { + exited = true + const status = { code, signal } + resolveClosed(status) + options.onClose?.(status) + }) + + return { + closed, + send(frame) { + if (exited) return Promise.reject(new Error('Windows peer broker exited unexpectedly')) + const bytes = encodeWindowsPeerBrokerFrame(frame) + const operation = writeTail.then( + () => + new Promise((resolve, reject) => { + child.stdin.write(bytes, (error) => { + if (error) reject(error) + else resolve() + }) + }), + ) + writeTail = operation.catch(() => {}) + return operation + }, + endInput: () => child.stdin.end(), + kill: () => child.kill(), + } +} diff --git a/packages/core/src/peers/windows-peer-broker-protocol.ts b/packages/core/src/peers/windows-peer-broker-protocol.ts index f016bb3..3a0cedd 100644 --- a/packages/core/src/peers/windows-peer-broker-protocol.ts +++ b/packages/core/src/peers/windows-peer-broker-protocol.ts @@ -1,4 +1,4 @@ -export const WINDOWS_PEER_BROKER_PROTOCOL_VERSION = 1 +export const WINDOWS_PEER_BROKER_PROTOCOL_VERSION = 2 export const WINDOWS_PEER_BROKER_HEADER_BYTES = 16 export const WINDOWS_PEER_BROKER_MAX_PAYLOAD_BYTES = 139_264 export const WINDOWS_PEER_BROKER_MAX_OPERATIONS = 256 @@ -17,7 +17,6 @@ export const WindowsPeerBrokerFrameKind = { ServerReady: 0x82, InboundRequest: 0x83, OutboundResponse: 0x84, - CancelAck: 0x85, OperationError: 0x86, ServerFatal: 0x87, ShutdownComplete: 0x88, @@ -165,10 +164,6 @@ class PayloadReader { return this.take(4).readUInt32LE(0) } - u8(): number { - return this.take(1)[0]! - } - finish(): void { if (this.offset !== this.bytes.length) throw protocolError('Unexpected Windows peer broker payload suffix') } @@ -248,12 +243,3 @@ export function decodeOperationErrorPayload(payload: Buffer): { code: string; me if (!/^PEER_[A-Z0-9_]+$/.test(code)) throw protocolError('Windows peer broker returned an invalid error code') return { code, message } } - -export function decodeCancelAckPayload(payload: Buffer): 'canceled' | 'too-late' { - const reader = new PayloadReader(payload) - const status = reader.u8() - reader.finish() - if (status === 0) return 'canceled' - if (status === 1) return 'too-late' - throw protocolError('Windows peer broker returned an invalid cancel acknowledgement') -} diff --git a/packages/core/src/peers/windows-peer-runtime-security.ts b/packages/core/src/peers/windows-peer-runtime-security.ts index 628edb6..5fd49db 100644 --- a/packages/core/src/peers/windows-peer-runtime-security.ts +++ b/packages/core/src/peers/windows-peer-runtime-security.ts @@ -1,18 +1,16 @@ -import { type ChildProcessWithoutNullStreams, spawn } from 'node:child_process' +import { spawn } from 'node:child_process' import fs from 'node:fs/promises' import path from 'node:path' -import { debugLog, errorMessage, userXcodeDir } from '../utils.js' +import { errorMessage, userXcodeDir } from '../utils.js' import { stripTerminalControls } from './terminal-sanitize.js' import { type WindowsPeerBrokerArtifact, resolveWindowsPeerBrokerArtifact } from './windows-peer-broker-artifact.js' +import { spawnWindowsPeerBrokerProcess } from './windows-peer-broker-process.js' import { - WINDOWS_PEER_BROKER_PROTOCOL_VERSION, - WindowsPeerBrokerFrameDecoder, WindowsPeerBrokerFrameKind, decodeOneStringPayload, decodeOperationErrorPayload, encodeSecureRuntimePayload, - encodeWindowsPeerBrokerFrame, } from './windows-peer-broker-protocol.js' const SECURE_RUNTIME_OPERATION_ID = 1 @@ -45,15 +43,6 @@ function abortError(): Error { return Object.assign(new Error('Windows peer runtime initialization was interrupted'), { name: 'AbortError' }) } -function waitForExit( - child: ChildProcessWithoutNullStreams, -): Promise<{ code: number | null; signal: NodeJS.Signals | null }> { - return new Promise((resolve, reject) => { - child.once('error', reject) - child.once('exit', (code, signal) => resolve({ code, signal })) - }) -} - export function createWindowsPeerRuntimeSecurity( options: WindowsPeerRuntimeSecurityOptions = {}, ): WindowsPeerRuntimeSecurityProvider { @@ -91,17 +80,6 @@ async function secureWindowsPeerRuntime( } const artifact = await (options.artifact ?? resolveWindowsPeerBrokerArtifact()) if (signal?.aborted) throw abortError() - const spawnBroker = options.spawnBroker ?? spawn - const child = spawnBroker( - artifact.executablePath, - ['secure-runtime', '--protocol', String(WINDOWS_PEER_BROKER_PROTOCOL_VERSION)], - { - stdio: ['pipe', 'pipe', 'pipe'], - windowsHide: true, - }, - ) - const decoder = new WindowsPeerBrokerFrameDecoder() - let stderr = '' let settled = false let resolveResult!: (namespaceId: string) => void let rejectResult!: (error: unknown) => void @@ -114,99 +92,85 @@ async function secureWindowsPeerRuntime( settled = true rejectResult(error) } - const onAbort = (): void => { - child.kill() - settleError(abortError()) - } - signal?.addEventListener('abort', onAbort, { once: true }) - child.stdout.on('data', (chunk: Buffer) => { - if (settled) return - try { - for (const frame of decoder.push(chunk)) { - if (frame.operationId !== SECURE_RUNTIME_OPERATION_ID) { - throw runtimeError( - 'PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH', - 'Windows peer runtime helper returned an unknown operation ID', - ) - } - if (frame.kind === WindowsPeerBrokerFrameKind.SecureRuntimeResult) { - const namespaceId = decodeOneStringPayload(frame.payload) - if (!/^[a-f0-9]{12}$/.test(namespaceId)) { - throw runtimeError( - 'PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH', - 'Windows peer runtime helper returned an invalid namespace', - ) - } - settled = true - resolveResult(namespaceId) - } else if (frame.kind === WindowsPeerBrokerFrameKind.OperationError) { - const failure = decodeOperationErrorPayload(frame.payload) - settleError(runtimeError(failure.code, failure.message)) - } else { + const brokerProcess = spawnWindowsPeerBrokerProcess({ + artifact, + mode: 'secure-runtime', + spawnBroker: options.spawnBroker ?? spawn, + debugKey: 'peer.windows.runtime-helper', + onFrame(frame) { + if (settled) return + if (frame.operationId !== SECURE_RUNTIME_OPERATION_ID) { + throw runtimeError( + 'PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH', + 'Windows peer runtime helper returned an unknown operation ID', + ) + } + if (frame.kind === WindowsPeerBrokerFrameKind.SecureRuntimeResult) { + const namespaceId = decodeOneStringPayload(frame.payload) + if (!/^[a-f0-9]{12}$/.test(namespaceId)) { throw runtimeError( 'PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH', - 'Windows peer runtime helper returned an unexpected frame', + 'Windows peer runtime helper returned an invalid namespace', ) } + settled = true + resolveResult(namespaceId) + } else if (frame.kind === WindowsPeerBrokerFrameKind.OperationError) { + const failure = decodeOperationErrorPayload(frame.payload) + settleError(runtimeError(failure.code, failure.message)) + } else { + throw runtimeError( + 'PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH', + 'Windows peer runtime helper returned an unexpected frame', + ) } - } catch (error) { - child.kill() - settleError(error) - } - }) - child.stdout.once('end', () => { - try { - decoder.finish() - } catch (error) { - settleError(error) - } - }) - child.stderr.on('data', (chunk: Buffer) => { - if (stderr.length >= 4_096) return - stderr += stripTerminalControls(chunk.toString('utf8')).slice(0, 4_096 - stderr.length) + }, + onError: settleError, + onClose() { + settleError( + runtimeError( + 'PEER_WINDOWS_RUNTIME_UNSAFE', + 'Windows peer runtime helper exited before completing the security check', + ), + ) + }, }) - const exit = waitForExit(child) + const onAbort = (): void => { + brokerProcess.kill() + settleError(abortError()) + } + signal?.addEventListener('abort', onAbort, { once: true }) const timer = setTimeout(() => { - child.kill() + brokerProcess.kill() settleError(runtimeError('PEER_WINDOWS_RUNTIME_UNSAFE', 'Windows peer runtime security check timed out')) }, options.timeoutMs ?? SECURE_RUNTIME_TIMEOUT_MS) timer.unref() try { - const request = encodeWindowsPeerBrokerFrame({ + await brokerProcess.send({ kind: WindowsPeerBrokerFrameKind.SecureRuntime, operationId: SECURE_RUNTIME_OPERATION_ID, payload: encodeSecureRuntimePayload(root), }) - await new Promise((resolve, reject) => { - child.stdin.write(request, (error) => { - if (error) reject(error) - else { - child.stdin.end() - resolve() - } - }) - }) + brokerProcess.endInput() const namespaceId = await result - const status = await exit + const status = await brokerProcess.closed if (status.code !== 0) { throw runtimeError( 'PEER_WINDOWS_RUNTIME_UNSAFE', 'Windows peer runtime helper exited before completing the security check', ) } - if (stderr) debugLog('peer.windows.runtime-helper', stderr) const registryDir = path.join(root, 'runtime', 'peers') return { registryDir, socketDir: registryDir, namespaceId } } catch (error) { - child.kill() - const status = await exit.catch(() => null) - if (stderr) debugLog('peer.windows.runtime-helper', stderr) + brokerProcess.kill() + await brokerProcess.closed if (error instanceof Error && (error.name === 'AbortError' || error.name.startsWith('PEER_'))) throw error throw runtimeError( 'PEER_WINDOWS_RUNTIME_UNSAFE', `Windows peer runtime security check failed: ${errorMessage(error)}`, - status, + error, ) } finally { clearTimeout(timer) diff --git a/packages/core/src/peers/windows-pipe-address.ts b/packages/core/src/peers/windows-pipe-address.ts new file mode 100644 index 0000000..6d85483 --- /dev/null +++ b/packages/core/src/peers/windows-pipe-address.ts @@ -0,0 +1,6 @@ +const WINDOWS_PEER_PIPE_PATTERN = /^\\\\\.\\pipe\\x-code-peer-v2-([a-f0-9]{12})-([A-Za-z0-9_-]{32})$/ + +export function isValidWindowsPeerPipeAddress(address: string, namespaceId?: string): boolean { + const match = WINDOWS_PEER_PIPE_PATTERN.exec(address) + return Boolean(match && namespaceId && match[1] === namespaceId) +} diff --git a/packages/core/src/tools/shell-session/providers/windows-job.ts b/packages/core/src/tools/shell-session/providers/windows-job.ts index 1ed56d4..5d03f89 100644 --- a/packages/core/src/tools/shell-session/providers/windows-job.ts +++ b/packages/core/src/tools/shell-session/providers/windows-job.ts @@ -1,9 +1,7 @@ import { type ChildProcessWithoutNullStreams, spawn } from 'node:child_process' -import { createHash } from 'node:crypto' -import fs from 'node:fs/promises' -import path from 'node:path' import { fileURLToPath } from 'node:url' +import { resolveWindowsNativeArtifact, resolveWindowsNativeRoot } from '../../../native/windows-native-artifact.js' import { debugLog, errorMessage } from '../../../utils.js' import type { ManagedExitStatus, @@ -31,35 +29,6 @@ export interface WindowsSupervisorArtifact { sha256: string } -interface WindowsNativeArtifactManifestEntry { - file: string - protocolVersion: number - sha256: string - sourceSha256: string -} - -interface WindowsSupervisorManifest { - manifestVersion: number - artifacts: Record -} - -const WINDOWS_NATIVE_MANIFEST_VERSION = 2 -const WINDOWS_PE_MACHINES: Record<'x64' | 'arm64', number> = { x64: 0x8664, arm64: 0xaa64 } - -function verifyWindowsSupervisorPe(bytes: Buffer, arch: 'x64' | 'arm64'): void { - if (bytes.length < 0x40 || bytes.readUInt16LE(0) !== 0x5a4d) { - throw new Error(`Windows shell supervisor is not a PE executable for ${arch}`) - } - const peOffset = bytes.readUInt32LE(0x3c) - if ( - peOffset + 6 > bytes.length || - bytes.readUInt32LE(peOffset) !== 0x00004550 || - bytes.readUInt16LE(peOffset + 4) !== WINDOWS_PE_MACHINES[arch] - ) { - throw new Error(`Windows shell supervisor PE architecture mismatch for ${arch}`) - } -} - export interface WindowsJobObjectProviderOptions { artifact?: Promise | WindowsSupervisorArtifact executable?: string @@ -78,67 +47,23 @@ function timeoutWake(ms: number): { promise: Promise; dispose(): void } { } export function resolveWindowsSupervisorNativeRoot(modulePath: string): string { - const moduleDir = path.dirname(modulePath) - if (!/^windows-job\.(?:[cm]?js|ts)$/.test(path.basename(modulePath))) { - if (path.basename(moduleDir) === 'dist') return path.join(moduleDir, 'native', 'windows') - if (path.basename(moduleDir) === 'chunks' && path.basename(path.dirname(moduleDir)) === 'dist') { - return path.join(path.dirname(moduleDir), 'native', 'windows') - } - throw new Error(`Windows shell supervisor bundle has an unsupported package layout: ${modulePath}`) - } - - const sourceRoot = path.dirname(path.dirname(path.dirname(moduleDir))) - if (path.basename(sourceRoot) === 'dist') return path.join(sourceRoot, 'native', 'windows') - if (path.basename(sourceRoot) === 'src') { - return path.join(path.dirname(sourceRoot), 'dist', 'native', 'windows') - } - throw new Error(`Windows shell supervisor module has an unsupported package layout: ${modulePath}`) + return resolveWindowsNativeRoot(modulePath) } export async function resolveWindowsSupervisorArtifact( arch: NodeJS.Architecture = process.arch, ): Promise { - if (arch !== 'x64' && arch !== 'arm64') { - throw new Error(`Windows unified shell does not support architecture ${arch}`) - } - const root = resolveWindowsSupervisorNativeRoot(fileURLToPath(import.meta.url)) - const manifestPath = path.join(root, 'manifest.json') - let manifest: WindowsSupervisorManifest - try { - manifest = JSON.parse(await fs.readFile(manifestPath, 'utf8')) as WindowsSupervisorManifest - } catch (error) { - throw new Error(`Windows shell supervisor artifact is missing for ${arch}; reinstall x-code-cli`, { cause: error }) - } - if (manifest.manifestVersion !== WINDOWS_NATIVE_MANIFEST_VERSION) { - throw new Error( - `Windows native manifest mismatch: expected ${WINDOWS_NATIVE_MANIFEST_VERSION}, received ${manifest.manifestVersion}`, - ) - } - const artifact = manifest.artifacts?.[arch]?.shellSupervisor - if (!artifact) throw new Error(`Windows shell supervisor manifest has no ${arch} artifact`) - if (artifact.protocolVersion !== WINDOWS_SUPERVISOR_PROTOCOL_VERSION) { - throw new Error( - `Windows shell supervisor manifest protocol mismatch: expected ${WINDOWS_SUPERVISOR_PROTOCOL_VERSION}, received ${artifact.protocolVersion}`, - ) - } - if (!/^[a-f0-9]{64}$/.test(artifact.sha256) || !/^[a-f0-9]{64}$/.test(artifact.sourceSha256)) { - throw new Error('Windows shell supervisor manifest hash is invalid') - } - if (artifact.file !== `${arch}/xc-shell-supervisor.exe`) { - throw new Error(`Windows shell supervisor manifest has an invalid ${arch} path`) - } - const executablePath = path.resolve(root, artifact.file) - const relative = path.relative(root, executablePath) - if (relative.startsWith('..') || path.isAbsolute(relative)) { - throw new Error('Windows shell supervisor manifest points outside its native directory') - } - const bytes = await fs.readFile(executablePath) - verifyWindowsSupervisorPe(bytes, arch) - const actualHash = createHash('sha256').update(bytes).digest('hex') - if (actualHash !== artifact.sha256.toLowerCase()) { - throw new Error(`Windows shell supervisor hash mismatch for ${arch}`) - } - return { executablePath, sha256: actualHash } + const artifact = await resolveWindowsNativeArtifact({ + arch, + nativeRoot: resolveWindowsSupervisorNativeRoot(fileURLToPath(import.meta.url)), + spec: { + artifactName: 'shellSupervisor', + executableName: 'xc-shell-supervisor.exe', + displayName: 'Windows shell supervisor', + protocolVersion: WINDOWS_SUPERVISOR_PROTOCOL_VERSION, + }, + }) + return { executablePath: artifact.executablePath, sha256: artifact.sha256 } } class WindowsManagedProcess implements ManagedProcess { diff --git a/packages/core/src/utils/image-compress.ts b/packages/core/src/utils/image-compress.ts index d3b0620..838b930 100644 --- a/packages/core/src/utils/image-compress.ts +++ b/packages/core/src/utils/image-compress.ts @@ -502,15 +502,17 @@ async function runCompressionWorker( return new Promise((resolve, reject) => { let settled = false + let outputError: Error | undefined + let outputResult: CompressResult | undefined const cleanup = (): void => { clearTimeout(timer) abortSignal?.removeEventListener('abort', onAbort) } - const fail = (error: Error): void => { + const fail = (error: Error, terminate = true): void => { if (settled) return settled = true cleanup() - void worker.terminate() + if (terminate) void worker.terminate() reject(error) } const onAbort = (): void => fail(abortError(abortSignal)) @@ -523,17 +525,29 @@ async function runCompressionWorker( worker.once('message', (output: ImageCompressWorkerOutput) => { if (settled) return if (!output.ok) { - fail(new Error(output.error)) + outputError = new Error(output.error) return } - settled = true - cleanup() - void worker.terminate() - resolve({ ...output.result, data: Buffer.from(output.result.data) }) + outputResult = { ...output.result, data: Buffer.from(output.result.data) } }) worker.once('error', fail) worker.once('exit', (code) => { - if (!settled) fail(new Error(`Image compression worker exited unexpectedly with code ${code}`)) + if (settled) return + if (code !== 0) { + fail(new Error(`Image compression worker exited unexpectedly with code ${code}`), false) + return + } + if (outputError) { + fail(outputError, false) + return + } + if (!outputResult) { + fail(new Error('Image compression worker exited without a result'), false) + return + } + settled = true + cleanup() + resolve(outputResult) }) }) } diff --git a/packages/core/tests/__snapshots__/api-exports.test.ts.snap b/packages/core/tests/__snapshots__/api-exports.test.ts.snap index 79d99ef..920d0c0 100644 --- a/packages/core/tests/__snapshots__/api-exports.test.ts.snap +++ b/packages/core/tests/__snapshots__/api-exports.test.ts.snap @@ -120,13 +120,11 @@ exports[`@x-code-cli/core public API > export list matches snapshot 1`] = ` "createPeerRateLimiter", "createPeerRegistry", "createPeerService", - "createPlatformPeerTransport", "createProviderTurnUsage", "createSkillRegistry", "createSubAgentRegistry", "createUnixSocketTransport", "createUsageBreakdown", - "createWindowsNamedPipeTransport", "debugLog", "debugLogIntegrationDiagnostics", "decideInboundDisposition", diff --git a/packages/core/tests/audio-decode.test.ts b/packages/core/tests/audio-decode.test.ts index c26400c..552f275 100644 --- a/packages/core/tests/audio-decode.test.ts +++ b/packages/core/tests/audio-decode.test.ts @@ -330,5 +330,5 @@ describe('bounded audio decoder', () => { `Audio exceeds the ${MAX_AUDIO_DURATION_SECONDS}s local decode limit`, ) expect((await fs.stat(output)).size).toBeLessThanOrEqual(MAX_AUDIO_PCM_INPUT_BYTES) - }) + }, 15_000) }) diff --git a/packages/core/tests/file-ingest.test.ts b/packages/core/tests/file-ingest.test.ts index 9192dd8..904756d 100644 --- a/packages/core/tests/file-ingest.test.ts +++ b/packages/core/tests/file-ingest.test.ts @@ -701,6 +701,16 @@ describe('ingestFile', () => { } }) + it('never emits a BOM-prefixed PDF as ordinary attachment text', async () => { + const disguised = path.join(tmpDir, 'bom-pdf.txt') + await fs.writeFile(disguised, Buffer.concat([Buffer.from([0xef, 0xbb, 0xbf]), Buffer.from('%PDF-1.4\n')])) + + const parts = await ingestFile({ raw: `@${disguised}`, absolutePath: disguised }, multimodalCaps) + + expect(JSON.stringify(parts)).not.toContain('%PDF-1.4') + expect(parts.every((part) => part.type === 'text')).toBe(true) + }) + // Regression: a multi-MB @path attachment used to be inlined verbatim, // pushing the user message past the model's context window before the // first turn could even start. Now we substitute a short hint that diff --git a/packages/core/tests/file-lock.test.ts b/packages/core/tests/file-lock.test.ts index c1c429f..5ec5471 100644 --- a/packages/core/tests/file-lock.test.ts +++ b/packages/core/tests/file-lock.test.ts @@ -9,24 +9,23 @@ import { acquireFileLock } from '../src/utils/file-lock.js' const execFileAsync = promisify(execFile) const LOCK_MODULE_URL = new URL('../dist/utils/file-lock.js', import.meta.url).href -async function runLockContender(lockPath: string, holdMs: number): Promise<{ start: bigint; end: bigint }> { +async function runLockContender(lockPath: string, holdMs: number): Promise<{ start: number; end: number }> { const script = ` import { acquireFileLock } from ${JSON.stringify(LOCK_MODULE_URL)} const lease = await acquireFileLock(process.argv[1], { waitMs: 10000, retryMs: 5 }) if (!lease) throw new Error('timed out acquiring test lock') - const start = process.hrtime.bigint() + const start = Date.now() await new Promise(resolve => setTimeout(resolve, Number(process.argv[2]))) - const end = process.hrtime.bigint() + const end = Date.now() await lease.release() - process.stdout.write(JSON.stringify({ start: start.toString(), end: end.toString() })) + process.stdout.write(JSON.stringify({ start, end })) ` const result = await execFileAsync( process.execPath, ['--input-type=module', '--eval', script, lockPath, String(holdMs)], { windowsHide: true }, ) - const interval = JSON.parse(result.stdout) as { start: string; end: string } - return { start: BigInt(interval.start), end: BigInt(interval.end) } + return JSON.parse(result.stdout) as { start: number; end: number } } describe('file lock ownership', () => { @@ -45,7 +44,7 @@ describe('file lock ownership', () => { { at: start, delta: 1 }, { at: end, delta: -1 }, ]) - .sort((a, b) => (a.at === b.at ? a.delta - b.delta : a.at < b.at ? -1 : 1)) + .sort((a, b) => a.at - b.at || a.delta - b.delta) let active = 0 let maxActive = 0 for (const event of events) { diff --git a/packages/core/tests/pdf-ingest.test.ts b/packages/core/tests/pdf-ingest.test.ts index d599433..e3c87fa 100644 --- a/packages/core/tests/pdf-ingest.test.ts +++ b/packages/core/tests/pdf-ingest.test.ts @@ -4,7 +4,6 @@ import fs from 'node:fs/promises' import os from 'node:os' import path from 'node:path' -import { ingestFile } from '../src/agent/file-ingest.js' import { MAX_PDF_SOURCE_BYTES, extractPdfTextWithFallback, processPdf } from '../src/agent/pdf-ingest.js' import { createReadFileTool } from '../src/tools/read-file.js' import { makePdfBuffer } from './helpers/pdf.js' @@ -81,7 +80,7 @@ describe('processPdf', () => { if (result.type !== 'content') return expect(result.parts.every((part) => part.type === 'text')).toBe(true) expect(result.parts.map((part) => (part.type === 'text' ? part.text : '')).join('\n')).toContain('mock local OCR') - }) + }, 15_000) it('does not pass parent-only Node flags to the PDF worker', async () => { process.execArgv.push('--input-type=module') @@ -92,7 +91,7 @@ describe('processPdf', () => { } finally { process.execArgv.splice(process.execArgv.lastIndexOf('--input-type=module'), 1) } - }) + }, 15_000) it('returns a reference before rendering too many visual pages', async () => { const largeScan = path.join(tempDir, 'eleven-pages.pdf') @@ -123,7 +122,7 @@ describe('processPdf', () => { pageRange: { first: 2, last: 4 }, }) expect(invalid).toMatchObject({ type: 'error', code: 'invalid-range' }) - }) + }, 15_000) it('forces page rendering in visual mode and returns an atomic continuation at the byte budget', async () => { const result = await processPdf(textPdf, { @@ -186,6 +185,30 @@ describe('processPdf', () => { name: 'AbortError', }) }) + + it.runIf(process.platform === 'win32')( + 'waits for an in-flight PDF child process to exit after abort before accepting another request', + async () => { + const controller = new AbortController() + let abortedAfterInit = false + + await expect( + processPdf(textPdf, { + vision: true, + abortSignal: controller.signal, + onNotice: (message) => { + if (abortedAfterInit || !message.startsWith('Extracting PDF text')) return + abortedAfterInit = true + controller.abort() + }, + }), + ).rejects.toMatchObject({ name: 'AbortError' }) + + expect(abortedAfterInit).toBe(true) + await expect(processPdf(textPdf, { vision: true })).resolves.toMatchObject({ type: 'content' }) + }, + 20_000, + ) }) describe('extractPdfTextWithFallback', () => { @@ -221,18 +244,3 @@ describe('readFile PDF integration', () => { expect(JSON.stringify(result)).not.toContain('application/pdf') }) }) - -describe('ingestFile PDF detection', () => { - it('never emits a BOM-prefixed PDF as ordinary attachment text', async () => { - const disguised = path.join(tempDir, 'bom-pdf.txt') - await fs.writeFile(disguised, Buffer.concat([Buffer.from([0xef, 0xbb, 0xbf]), Buffer.from('%PDF-1.4\n')])) - - const parts = await ingestFile( - { raw: `@${disguised}`, absolutePath: disguised }, - { image: true, pdf: true, audio: true, filesApi: true, toolImageTransport: 'tool-result' }, - ) - - expect(JSON.stringify(parts)).not.toContain('%PDF-1.4') - expect(parts.every((part) => part.type === 'text')).toBe(true) - }, 15_000) -}) diff --git a/packages/core/tests/peer-registry.test.ts b/packages/core/tests/peer-registry.test.ts index 9fc3dc8..bd78f1e 100644 --- a/packages/core/tests/peer-registry.test.ts +++ b/packages/core/tests/peer-registry.test.ts @@ -285,14 +285,14 @@ describe('owner-only peer registry', () => { const value = registration('C:\\runtime', { transport: { kind: 'windows-pipe', - address: '\\\\.\\pipe\\x-code-peer-v1-0123456789ab-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + address: '\\\\.\\pipe\\x-code-peer-v2-0123456789ab-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', }, }) expect(parseRegistration(value, { socketDir: 'C:\\runtime', namespaceId: '0123456789ab' })).not.toBeNull() expect(parseRegistration(value, { socketDir: 'C:\\runtime', namespaceId: 'ffffffffffff' })).toBeNull() expect( parseRegistration( - { ...value, transport: { kind: 'windows-pipe', address: '\\\\.\\pipe\\x-code-peer-v1-0123456789ab-..' } }, + { ...value, transport: { kind: 'windows-pipe', address: '\\\\.\\pipe\\x-code-peer-v2-0123456789ab-..' } }, { socketDir: 'C:\\runtime', namespaceId: '0123456789ab' }, ), ).toBeNull() @@ -314,9 +314,6 @@ describe('owner-only peer registry', () => { let active = 0 let maximum = 0 const transport: PeerTransport = { - kind: 'unix', - createAddressHint: vi.fn(), - validateAddress: () => true, listen: vi.fn() as never, request: async ({ address, frame }) => { active++ @@ -343,7 +340,6 @@ describe('owner-only peer registry', () => { await registry.write(value) const transport: PeerTransport = { kind: 'unix', - createAddressHint: vi.fn(), validateAddress: () => true, listen: vi.fn() as never, request: vi.fn(async () => { @@ -362,7 +358,6 @@ describe('owner-only peer registry', () => { for (let index = 0; index < 20; index++) await registry.write(registration(registry.paths().socketDir)) const transport: PeerTransport = { kind: 'unix', - createAddressHint: vi.fn(), validateAddress: () => true, listen: vi.fn() as never, request: ({ signal }) => diff --git a/packages/core/tests/peer-service-legacy-transport.test.ts b/packages/core/tests/peer-service-legacy-transport.test.ts new file mode 100644 index 0000000..b27bb9d --- /dev/null +++ b/packages/core/tests/peer-service-legacy-transport.test.ts @@ -0,0 +1,40 @@ +import { randomUUID } from 'node:crypto' +import fs from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' + +import { createPeerService } from '../src/peers/service.js' +import type { PeerTransport } from '../src/peers/transport.js' + +describe('PeerService transport compatibility', () => { + it('uses the Unix registry kind for an injected legacy transport without metadata', async () => { + const previousHome = process.env.X_CODE_HOME + const testHome = + process.platform === 'win32' + ? path.join(os.homedir(), `.x-code-peer-legacy-${randomUUID()}`) + : await fs.mkdtemp(path.join(os.tmpdir(), 'x-code-peer-legacy-')) + process.env.X_CODE_HOME = testHome + const transport: PeerTransport = { + async listen(options) { + return { + address: options.address, + async close() {}, + } + }, + async request() { + throw new Error('not used') + }, + } + const service = createPeerService({ enabled: true, name: 'legacy-transport', transport }) + + try { + await service.start() + expect(service.isAvailable(), service.getUnavailableReason()).toBe(true) + } finally { + await service.shutdown() + if (previousHome === undefined) delete process.env.X_CODE_HOME + else process.env.X_CODE_HOME = previousHome + await fs.rm(testHome, { recursive: true, force: true }) + } + }) +}) diff --git a/packages/core/tests/peer-service-sanitize.test.ts b/packages/core/tests/peer-service-sanitize.test.ts index 3c893b0..97973a7 100644 --- a/packages/core/tests/peer-service-sanitize.test.ts +++ b/packages/core/tests/peer-service-sanitize.test.ts @@ -58,7 +58,6 @@ describe('peer service terminal sanitization', () => { } const transport: PeerTransport = { kind: 'unix', - createAddressHint: () => '/runtime/receiver.sock', validateAddress: () => true, listen: vi.fn(async (options) => { onRequest = options.onRequest diff --git a/packages/core/tests/peer-service.test.ts b/packages/core/tests/peer-service.test.ts index 065d096..5bcd52d 100644 --- a/packages/core/tests/peer-service.test.ts +++ b/packages/core/tests/peer-service.test.ts @@ -364,7 +364,6 @@ describeUnix('PeerService over real Unix domain sockets', () => { const close = vi.fn(async () => {}) const transport: PeerTransport = { kind: 'unix', - createAddressHint: () => testHome, validateAddress: () => true, listen: vi.fn(async (options) => ({ address: options.address, @@ -407,7 +406,6 @@ describeUnix('PeerService over real Unix domain sockets', () => { }) const transport: PeerTransport = { kind: 'unix', - createAddressHint: () => testHome, validateAddress: () => true, listen: vi.fn(async (options) => ({ address: options.address, closed, close: vi.fn(async () => {}) })), request: vi.fn(), @@ -441,7 +439,6 @@ describeUnix('PeerService over real Unix domain sockets', () => { const close = vi.fn(async () => {}) const transport: PeerTransport = { kind: 'unix', - createAddressHint: () => testHome, validateAddress: () => true, listen: vi.fn(async (options) => { signalListen() @@ -483,7 +480,6 @@ describeUnix('PeerService over real Unix domain sockets', () => { let receivedSignal: AbortSignal | undefined const transport: PeerTransport = { kind: 'unix', - createAddressHint: () => testHome, validateAddress: () => true, listen: vi.fn(async (options) => { receivedSignal = options.signal @@ -536,7 +532,6 @@ describeUnix('PeerService over real Unix domain sockets', () => { const close = vi.fn(async () => {}) const transport: PeerTransport = { kind: 'unix', - createAddressHint: () => testHome, validateAddress: () => true, listen: vi.fn(async (options) => ({ address: options.address, diff --git a/packages/core/tests/peer-transport.test.ts b/packages/core/tests/peer-transport.test.ts index c064fe7..c53b26e 100644 --- a/packages/core/tests/peer-transport.test.ts +++ b/packages/core/tests/peer-transport.test.ts @@ -23,6 +23,10 @@ function token(): string { return randomBytes(32).toString('base64url') } +function addressHint(): string { + return path.join(directory, 'peer.sock') +} + async function listenReplacement(address: string, sockets: Set): Promise { const server = net.createServer((socket) => { sockets.add(socket) @@ -55,17 +59,16 @@ async function closeReplacement(server: net.Server, sockets: Set): P describe.runIf(process.platform !== 'win32')('Unix peer transport', () => { it('closes the bound listener and removes its owned socket when post-bind initialization fails', async () => { - const address = path.join(directory, 'post-bind-failure.sock') let boundAddress: string | undefined const chmod = vi.fn(async (filePath: string) => { boundAddress = filePath throw new Error('simulated post-bind chmod failure') }) - const transport = createUnixSocketTransport({ fileSystem: { ...fs, chmod } }) + const transport = createUnixSocketTransport({ fileSystem: { ...fs, chmod }, getSocketDir: () => directory }) await expect( transport.listen({ - address, + address: addressHint(), instanceId: randomUUID(), inboxToken: token(), onRequest: async () => ({ v: 1, type: 'error', code: 'unused', message: 'unused' }), @@ -87,13 +90,13 @@ describe.runIf(process.platform !== 'win32')('Unix peer transport', () => { }) it('aborts a listener while post-bind initialization is in flight without leaking the socket', async () => { - const address = path.join(directory, 'post-bind-abort.sock') let signalChmod!: () => void const chmodStarted = new Promise((resolve) => (signalChmod = resolve)) let releaseChmod!: () => void const chmodGate = new Promise((resolve) => (releaseChmod = resolve)) let boundAddress: string | undefined const transport = createUnixSocketTransport({ + getSocketDir: () => directory, fileSystem: { ...fs, chmod: vi.fn(async (filePath, mode) => { @@ -106,7 +109,7 @@ describe.runIf(process.platform !== 'win32')('Unix peer transport', () => { }) const controller = new AbortController() const listening = transport.listen({ - address, + address: addressHint(), instanceId: randomUUID(), inboxToken: token(), onRequest: async () => ({ v: 1, type: 'error', code: 'unused', message: 'unused' }), @@ -128,6 +131,7 @@ describe.runIf(process.platform !== 'win32')('Unix peer transport', () => { const replacementSockets = new Set() let replaced = false const transport = createUnixSocketTransport({ + getSocketDir: () => directory, fileSystem: { ...fs, lstat: vi.fn(async (filePath: string) => { @@ -145,7 +149,7 @@ describe.runIf(process.platform !== 'win32')('Unix peer transport', () => { await expect( transport.listen({ - address: path.join(directory, 'race.sock'), + address: addressHint(), instanceId: randomUUID(), inboxToken: token(), onRequest: async () => ({ v: 1, type: 'error', code: 'unused', message: 'unused' }), @@ -165,6 +169,7 @@ describe.runIf(process.platform !== 'win32')('Unix peer transport', () => { let replacementIdentity: Awaited> | undefined const replacementSockets = new Set() const transport = createUnixSocketTransport({ + getSocketDir: () => directory, fileSystem: { ...fs, rename: vi.fn(async (oldPath: string, newPath: string) => { @@ -179,7 +184,7 @@ describe.runIf(process.platform !== 'win32')('Unix peer transport', () => { }, }) const server = await transport.listen({ - address: path.join(directory, 'close-lstat-rename.sock'), + address: addressHint(), instanceId: randomUUID(), inboxToken: token(), onRequest: async () => ({ v: 1, type: 'error', code: 'unused', message: 'unused' }), @@ -206,6 +211,7 @@ describe.runIf(process.platform !== 'win32')('Unix peer transport', () => { let replacementIdentity: Awaited> | undefined const replacementSockets = new Set() const transport = createUnixSocketTransport({ + getSocketDir: () => directory, fileSystem: { ...fs, mkdir: vi.fn(async (filePath: string, options: { mode: number }) => { @@ -219,7 +225,7 @@ describe.runIf(process.platform !== 'win32')('Unix peer transport', () => { }, }) const server = await transport.listen({ - address: path.join(directory, 'close-rename-sentinel.sock'), + address: addressHint(), instanceId: randomUUID(), inboxToken: token(), onRequest: async () => ({ v: 1, type: 'error', code: 'unused', message: 'unused' }), @@ -240,11 +246,11 @@ describe.runIf(process.platform !== 'win32')('Unix peer transport', () => { }) it('authenticates and completes a ping/pong round trip', async () => { - const transport = createUnixSocketTransport() + const transport = createUnixSocketTransport({ getSocketDir: () => directory }) const instanceId = randomUUID() const inboxToken = token() const server = await transport.listen({ - address: path.join(directory, 'peer.sock'), + address: addressHint(), instanceId, inboxToken, onRequest: async (frame) => { @@ -265,10 +271,10 @@ describe.runIf(process.platform !== 'win32')('Unix peer transport', () => { }) it('rejects an incorrect token before dispatch', async () => { - const transport = createUnixSocketTransport() + const transport = createUnixSocketTransport({ getSocketDir: () => directory }) const onRequest = vi.fn() const server = await transport.listen({ - address: path.join(directory, 'auth.sock'), + address: addressHint(), instanceId: randomUUID(), inboxToken: token(), onRequest, @@ -286,9 +292,9 @@ describe.runIf(process.platform !== 'win32')('Unix peer transport', () => { }) it('times out and honors AbortSignal while waiting for a reply', async () => { - const transport = createUnixSocketTransport() + const transport = createUnixSocketTransport({ getSocketDir: () => directory }) const server = await transport.listen({ - address: path.join(directory, 'timeout.sock'), + address: addressHint(), instanceId: randomUUID(), inboxToken: token(), onRequest: async () => new Promise(() => {}), @@ -303,7 +309,7 @@ describe.runIf(process.platform !== 'win32')('Unix peer transport', () => { const actualToken = token() await server.close() const active = await transport.listen({ - address: path.join(directory, 'active.sock'), + address: addressHint(), instanceId: randomUUID(), inboxToken: actualToken, onRequest: async () => new Promise(() => {}), @@ -324,12 +330,12 @@ describe.runIf(process.platform !== 'win32')('Unix peer transport', () => { }) it('drops malformed and oversized raw client frames without dispatching', async () => { - const transport = createUnixSocketTransport() + const transport = createUnixSocketTransport({ getSocketDir: () => directory }) const instanceId = randomUUID() const inboxToken = token() const onRequest = vi.fn() const server = await transport.listen({ - address: path.join(directory, 'raw.sock'), + address: addressHint(), instanceId, inboxToken, onRequest, @@ -349,10 +355,10 @@ describe.runIf(process.platform !== 'win32')('Unix peer transport', () => { }) it('drains active connections on shutdown within the configured deadline', async () => { - const transport = createUnixSocketTransport() + const transport = createUnixSocketTransport({ getSocketDir: () => directory }) const inboxToken = token() const server = await transport.listen({ - address: path.join(directory, 'shutdown.sock'), + address: addressHint(), instanceId: randomUUID(), inboxToken, onRequest: async () => new Promise(() => {}), @@ -374,10 +380,9 @@ describe.runIf(process.platform !== 'win32')('Unix peer transport', () => { }) it('does not unlink a replacement socket when its owned path changes identity before close', async () => { - const address = path.join(directory, 'replaced.sock') - const transport = createUnixSocketTransport() + const transport = createUnixSocketTransport({ getSocketDir: () => directory }) const server = await transport.listen({ - address, + address: addressHint(), instanceId: randomUUID(), inboxToken: token(), onRequest: async () => ({ v: 1, type: 'error', code: 'unused', message: 'unused' }), diff --git a/packages/core/tests/windows-native-artifacts.test.ts b/packages/core/tests/windows-native-artifacts.test.ts index d32b596..080c94f 100644 --- a/packages/core/tests/windows-native-artifacts.test.ts +++ b/packages/core/tests/windows-native-artifacts.test.ts @@ -56,17 +56,17 @@ describe('Windows native artifacts', () => { expect(artifact.sourceSha256).toMatch(/^[a-f0-9]{64}$/) } expect(manifest.artifacts[arch].shellSupervisor.protocolVersion).toBe(2) - expect(manifest.artifacts[arch].peerBroker.protocolVersion).toBe(1) + expect(manifest.artifacts[arch].peerBroker.protocolVersion).toBe(2) } expect(manifest.artifacts.x64.shellSupervisor.sourceSha256).not.toBe(manifest.artifacts.x64.peerBroker.sourceSha256) }) it('validates protocol, path, hash, and PE architecture before launching a broker', async () => { - await expect(resolveWindowsPeerBrokerArtifact('x64', testRoot)).resolves.toMatchObject({ protocolVersion: 1 }) - await expect(resolveWindowsPeerBrokerArtifact('arm64', testRoot)).resolves.toMatchObject({ protocolVersion: 1 }) + await expect(resolveWindowsPeerBrokerArtifact('x64', testRoot)).resolves.toMatchObject({ protocolVersion: 2 }) + await expect(resolveWindowsPeerBrokerArtifact('arm64', testRoot)).resolves.toMatchObject({ protocolVersion: 2 }) const protocol = await readManifest() - protocol.artifacts.x64.peerBroker.protocolVersion = 2 + protocol.artifacts.x64.peerBroker.protocolVersion = 1 await writeManifest(protocol) await expect(resolveWindowsPeerBrokerArtifact('x64', testRoot)).rejects.toMatchObject({ name: 'PEER_WINDOWS_HELPER_PROTOCOL_MISMATCH', diff --git a/packages/core/tests/windows-peer-broker-process.test.ts b/packages/core/tests/windows-peer-broker-process.test.ts new file mode 100644 index 0000000..78fea99 --- /dev/null +++ b/packages/core/tests/windows-peer-broker-process.test.ts @@ -0,0 +1,49 @@ +import { execFile } from 'node:child_process' +import path from 'node:path' +import { pathToFileURL } from 'node:url' +import { promisify } from 'node:util' + +const execFileAsync = promisify(execFile) + +describe('Windows peer broker process wrapper', () => { + it('survives a broker exit while writes are queued', async () => { + const moduleUrl = pathToFileURL(path.resolve('packages/core/dist/peers/windows-peer-broker-process.js')).href + const script = ` + import { spawn } from 'node:child_process' + import { spawnWindowsPeerBrokerProcess } from ${JSON.stringify(moduleUrl)} + + let streamErrors = 0 + const broker = spawnWindowsPeerBrokerProcess({ + artifact: { executablePath: process.execPath }, + mode: 'broker', + spawnBroker(_file, _args, spawnOptions) { + return spawn( + process.execPath, + ['--input-type=module', '--eval', 'process.stdin.destroy(); setTimeout(() => process.exit(0), 20)'], + spawnOptions, + ) + }, + debugKey: 'test.windows-peer-broker-process', + onFrame() {}, + onError() { + streamErrors++ + }, + }) + const payload = Buffer.alloc(131_072) + const writes = Array.from({ length: 16 }, (_, index) => + broker.send({ kind: 1, operationId: index + 1, payload }), + ) + await Promise.allSettled(writes) + await broker.closed + await new Promise((resolve) => setTimeout(resolve, 50)) + process.stdout.write('survived:' + streamErrors) + ` + + const { stdout } = await execFileAsync(process.execPath, ['--input-type=module', '--eval', script], { + timeout: 10_000, + windowsHide: true, + }) + + expect(stdout).toMatch(/^survived:[1-9]\d*$/) + }) +}) diff --git a/packages/core/tests/windows-peer-broker-protocol.test.ts b/packages/core/tests/windows-peer-broker-protocol.test.ts index d94b7ac..8a6a05c 100644 --- a/packages/core/tests/windows-peer-broker-protocol.test.ts +++ b/packages/core/tests/windows-peer-broker-protocol.test.ts @@ -3,7 +3,6 @@ import { WINDOWS_PEER_BROKER_MAX_PAYLOAD_BYTES, WindowsPeerBrokerFrameDecoder, WindowsPeerBrokerFrameKind, - decodeCancelAckPayload, decodeInboundRequestPayload, decodeOneStringPayload, decodeOperationErrorPayload, @@ -38,7 +37,7 @@ describe('Windows peer broker protocol', () => { const valid = frame() for (const mutate of [ (bytes: Buffer) => (bytes[0] = 0), - (bytes: Buffer) => (bytes[4] = 2), + (bytes: Buffer) => (bytes[4] = 1), (bytes: Buffer) => (bytes[5] = 0x40), (bytes: Buffer) => (bytes[6] = 1), (bytes: Buffer) => bytes.writeUInt32LE(WINDOWS_PEER_BROKER_MAX_PAYLOAD_BYTES + 1, 12), @@ -80,7 +79,7 @@ describe('Windows peer broker protocol', () => { expect(start.subarray(2, 14).toString()).toBe('0123456789ab') const outbound = encodeOutboundRequestPayload({ - address: '\\\\.\\pipe\\x-code-peer-v1-0123456789ab-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + address: '\\\\.\\pipe\\x-code-peer-v2-0123456789ab-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', targetToken: 'b'.repeat(43), senderInstanceId: '12345678-1234-4234-8234-123456789abc', timeoutMs: 3_000, @@ -102,7 +101,7 @@ describe('Windows peer broker protocol', () => { expect(() => decodeOneStringPayload(Buffer.from([1, 0, 0x61, 0x00]))).toThrow('suffix') }) - it('decodes stable operation errors and cancel acknowledgements', () => { + it('decodes stable operation errors', () => { const errorPayload = Buffer.concat([ Buffer.from([15, 0]), Buffer.from('PEER_TEST_ERROR'), @@ -110,8 +109,5 @@ describe('Windows peer broker protocol', () => { Buffer.from('failure'), ]) expect(decodeOperationErrorPayload(errorPayload)).toEqual({ code: 'PEER_TEST_ERROR', message: 'failure' }) - expect(decodeCancelAckPayload(Buffer.from([0]))).toBe('canceled') - expect(decodeCancelAckPayload(Buffer.from([1]))).toBe('too-late') - expect(() => decodeCancelAckPayload(Buffer.from([2]))).toThrow('invalid cancel') }) }) diff --git a/packages/core/tests/windows-peer-transport.test.ts b/packages/core/tests/windows-peer-transport.test.ts index 6f2253a..8983918 100644 --- a/packages/core/tests/windows-peer-transport.test.ts +++ b/packages/core/tests/windows-peer-transport.test.ts @@ -1,10 +1,11 @@ -import { type ChildProcessWithoutNullStreams, spawn } from 'node:child_process' +import { type ChildProcessWithoutNullStreams, execFile, spawn } from 'node:child_process' import { randomUUID } from 'node:crypto' import fs from 'node:fs/promises' import net from 'node:net' import os from 'node:os' import path from 'node:path' import { setTimeout as delay } from 'node:timers/promises' +import { promisify } from 'node:util' import { createPeerIdentity } from '../src/peers/identity.js' import { createPeerRegistry } from '../src/peers/registry.js' @@ -21,6 +22,8 @@ import { import { createWindowsPeerRuntimeSecurity } from '../src/peers/windows-peer-runtime-security.js' const describeWindows = process.platform === 'win32' ? describe : describe.skip +const addressHint = path.join(os.tmpdir(), 'x-code-windows-peer.sock') +const execFileAsync = promisify(execFile) describeWindows('Windows named pipe peer transport', () => { it('creates and secures an absent user runtime root', async () => { @@ -37,6 +40,34 @@ describeWindows('Windows named pipe peer transport', () => { } }) + it('rejects a runtime root reached through a junction', async () => { + const base = path.join(os.homedir(), `.x-code-peer-junction-${randomUUID()}`) + const target = path.join(base, 'target') + const root = path.join(base, 'root') + await fs.mkdir(target, { recursive: true }) + await fs.symlink(target, root, 'junction') + try { + await expect(createWindowsPeerRuntimeSecurity({ root }).initialize()).rejects.toMatchObject({ + name: 'PEER_WINDOWS_RUNTIME_UNSAFE', + }) + } finally { + await fs.rm(base, { recursive: true, force: true }) + } + }) + + it('rejects a runtime root replaceable by another ordinary principal', async () => { + const root = path.join(os.homedir(), `.x-code-peer-insecure-acl-${randomUUID()}`) + await fs.mkdir(root, { recursive: true }) + await execFileAsync('icacls.exe', [root, '/grant', '*S-1-1-0:(OI)(CI)M']) + try { + await expect(createWindowsPeerRuntimeSecurity({ root }).initialize()).rejects.toMatchObject({ + name: 'PEER_WINDOWS_RUNTIME_UNSAFE', + }) + } finally { + await fs.rm(root, { recursive: true, force: true }) + } + }) + it('discovers and sends between two real broker-backed services', async () => { const suffix = Date.now().toString(36) const sender = createPeerService({ enabled: true, name: `windows-sender-${suffix}` }) @@ -69,13 +100,13 @@ describeWindows('Windows named pipe peer transport', () => { const receiverTransport = createWindowsNamedPipeTransport({ getRuntimePaths: () => receiverRegistry.paths() }) let dispatches = 0 const senderServer = await senderTransport.listen({ - address: senderTransport.createAddressHint(sender.instanceId), + address: addressHint, instanceId: sender.instanceId, inboxToken: sender.inboxToken, onRequest: async () => ({ v: 1, type: 'error', code: 'PEER_TEST', message: 'unexpected' }), }) const receiverServer = await receiverTransport.listen({ - address: receiverTransport.createAddressHint(receiver.instanceId), + address: addressHint, instanceId: receiver.instanceId, inboxToken: receiver.inboxToken, onRequest: async (frame) => { @@ -107,20 +138,21 @@ describeWindows('Windows named pipe peer transport', () => { const receiver = createPeerIdentity({ name: 'abort-receiver' }) const senderTransport = createWindowsNamedPipeTransport({ getRuntimePaths: () => senderRegistry.paths() }) const receiverTransport = createWindowsNamedPipeTransport({ getRuntimePaths: () => receiverRegistry.paths() }) - let dispatched = false + let dispatches = 0 const senderServer = await senderTransport.listen({ - address: senderTransport.createAddressHint(sender.instanceId), + address: addressHint, instanceId: sender.instanceId, inboxToken: sender.inboxToken, onRequest: async () => ({ v: 1, type: 'error', code: 'PEER_TEST', message: 'unexpected' }), }) const receiverServer = await receiverTransport.listen({ - address: receiverTransport.createAddressHint(receiver.instanceId), + address: addressHint, instanceId: receiver.instanceId, inboxToken: receiver.inboxToken, - onRequest: async () => { - dispatched = true - return new Promise(() => {}) + onRequest: async (frame) => { + dispatches++ + if (dispatches === 1) return new Promise(() => {}) + return frame }, }) const controller = new AbortController() @@ -132,9 +164,19 @@ describeWindows('Windows named pipe peer transport', () => { timeoutMs: 5_000, signal: controller.signal, }) - while (!dispatched) await delay(5) + while (dispatches === 0) await delay(5) controller.abort() await expect(request).rejects.toMatchObject({ name: 'AbortError' }) + const followUpRequestId = randomUUID() + await expect( + senderTransport.request({ + address: receiverServer.address, + targetToken: receiver.inboxToken, + senderInstanceId: sender.instanceId, + frame: { v: 1, type: 'ping', requestId: followUpRequestId }, + timeoutMs: 2_000, + }), + ).resolves.toMatchObject({ type: 'ping', requestId: followUpRequestId }) const startedAt = Date.now() await Promise.all([senderServer.close({ deadlineMs: 300 }), receiverServer.close({ deadlineMs: 300 })]) expect(Date.now() - startedAt).toBeLessThan(1_500) @@ -145,7 +187,7 @@ describeWindows('Windows named pipe peer transport', () => { await registry.initialize() const identity = createPeerIdentity({ name: 'parent-eof' }) const artifact = await resolveWindowsPeerBrokerArtifact() - const child = spawn(artifact.executablePath, ['broker', '--protocol', '1'], { + const child = spawn(artifact.executablePath, ['broker', '--protocol', '2'], { stdio: ['pipe', 'pipe', 'pipe'], windowsHide: true, }) @@ -195,6 +237,57 @@ describeWindows('Windows named pipe peer transport', () => { ).resolves.toBeUndefined() }) + it('receives the graceful shutdown acknowledgement from a real broker', async () => { + const registry = createPeerRegistry() + await registry.initialize() + const identity = createPeerIdentity({ name: 'graceful-shutdown' }) + let acknowledged = false + let resolveAcknowledgement!: () => void + let rejectAcknowledgement!: (error: unknown) => void + const acknowledgement = new Promise((resolve, reject) => { + resolveAcknowledgement = resolve + rejectAcknowledgement = reject + }) + let resolveExit!: (status: { code: number | null; signal: NodeJS.Signals | null }) => void + const exited = new Promise<{ code: number | null; signal: NodeJS.Signals | null }>((resolve) => { + resolveExit = resolve + }) + const spawnBroker: typeof spawn = ((command, args, options) => { + const child = spawn(command, args ?? [], options as never) as ChildProcessWithoutNullStreams + const decoder = new WindowsPeerBrokerFrameDecoder() + child.stdout.on('data', (chunk: Buffer) => { + try { + for (const frame of decoder.push(chunk)) { + if (frame.kind !== WindowsPeerBrokerFrameKind.ShutdownComplete) continue + acknowledged = true + resolveAcknowledgement() + } + } catch (error) { + rejectAcknowledgement(error) + } + }) + child.once('close', (code, signal) => { + if (!acknowledged) rejectAcknowledgement(new Error('broker exited before SHUTDOWN_COMPLETE')) + resolveExit({ code, signal }) + }) + return child + }) as typeof spawn + const transport = createWindowsNamedPipeTransport({ getRuntimePaths: () => registry.paths(), spawnBroker }) + const server = await transport.listen({ + address: addressHint, + instanceId: identity.instanceId, + inboxToken: identity.inboxToken, + onRequest: async (frame) => frame, + }) + const gracefulExit = expect(Promise.all([acknowledgement, exited])).resolves.toEqual([ + undefined, + { code: 0, signal: null }, + ]) + + await server.close({ deadlineMs: 500 }) + await gracefulExit + }) + it('reports an unexpected broker exit through server.closed', async () => { const registry = createPeerRegistry() await registry.initialize() @@ -207,14 +300,14 @@ describeWindows('Windows named pipe peer transport', () => { const identity = createPeerIdentity({ name: 'crash-receiver' }) const transport = createWindowsNamedPipeTransport({ getRuntimePaths: () => registry.paths(), spawnBroker }) const server = await transport.listen({ - address: transport.createAddressHint(identity.instanceId), + address: addressHint, instanceId: identity.instanceId, inboxToken: identity.inboxToken, onRequest: async (frame) => frame, }) expect(children).toHaveLength(1) children[0]!.kill() - await expect(server.closed).resolves.toMatchObject({ expected: false }) + await expect(server.closed!).resolves.toMatchObject({ expected: false }) }) it('survives clients that disconnect before authentication', async () => { @@ -223,7 +316,7 @@ describeWindows('Windows named pipe peer transport', () => { const identity = createPeerIdentity({ name: 'disconnect-stress' }) const transport = createWindowsNamedPipeTransport({ getRuntimePaths: () => registry.paths() }) const server = await transport.listen({ - address: transport.createAddressHint(identity.instanceId), + address: addressHint, instanceId: identity.instanceId, inboxToken: identity.inboxToken, onRequest: async (frame) => frame, @@ -250,25 +343,39 @@ describeWindows('Windows named pipe peer transport', () => { timeoutMs: 2_000, }), ).resolves.toMatchObject({ type: 'ping', requestId }) - await expect(Promise.race([server.closed.then(() => true), delay(50).then(() => false)])).resolves.toBe(false) + await expect(Promise.race([server.closed!.then(() => true), delay(50).then(() => false)])).resolves.toBe(false) } finally { await server.close() } }, 30_000) - it('keeps accepting active operations after 256 rapid successes', async () => { + it('releases capacity after 256 concurrent unreachable operations', async () => { const registry = createPeerRegistry() await registry.initialize() const identity = createPeerIdentity({ name: 'success-capacity' }) const transport = createWindowsNamedPipeTransport({ getRuntimePaths: () => registry.paths() }) const server = await transport.listen({ - address: transport.createAddressHint(identity.instanceId), + address: addressHint, instanceId: identity.instanceId, inboxToken: identity.inboxToken, onRequest: async (frame) => frame, }) try { - for (let index = 0; index < 300; index++) { + for (let cycle = 0; cycle < 3; cycle++) { + const unreachableAddress = `\\\\.\\pipe\\x-code-peer-v2-${registry.paths().namespaceId}-${'B'.repeat(32)}` + const attempts = await Promise.allSettled( + Array.from({ length: 256 }, () => + transport.request({ + address: unreachableAddress, + targetToken: identity.inboxToken, + senderInstanceId: identity.instanceId, + frame: { v: 1, type: 'ping', requestId: randomUUID() }, + timeoutMs: 500, + }), + ), + ) + expect(attempts.every((attempt) => attempt.status === 'rejected')).toBe(true) + const requestId = randomUUID() await expect( transport.request({ @@ -315,10 +422,39 @@ describeWindows('Windows named pipe peer transport', () => { } }) - it('does not leak operation capacity after local encoding failures or missing cancel acknowledgements', async () => { + it('accepts late canceled terminals but rejects unsolicited duplicate terminals', async () => { const namespaceId = '0123456789ab' const fakeBroker = String.raw` let buffered = Buffer.alloc(0) + const pending = new Map() + let cancellations = 0 + const send = (kind, operationId, payload = Buffer.alloc(0)) => { + const response = Buffer.allocUnsafe(16 + payload.length) + response.write('XCPB') + response[4] = 2 + response[5] = kind + response.writeUInt16LE(0, 6) + response.writeUInt32LE(operationId, 8) + response.writeUInt32LE(payload.length, 12) + payload.copy(response, 16) + process.stdout.write(response) + } + const encodeBytes = (bytes) => { + const payload = Buffer.allocUnsafe(4 + bytes.length) + payload.writeUInt32LE(bytes.length, 0) + bytes.copy(payload, 4) + return payload + } + const readPeerFrame = (payload) => { + let offset = 0 + for (let index = 0; index < 3; index++) { + const length = payload.readUInt16LE(offset) + offset += 2 + length + } + offset += 4 + const length = payload.readUInt32LE(offset) + return Buffer.from(payload.subarray(offset + 4, offset + 4 + length)) + } process.stdin.on('data', (chunk) => { buffered = Buffer.concat([buffered, chunk]) while (buffered.length >= 16) { @@ -326,25 +462,37 @@ describeWindows('Windows named pipe peer transport', () => { const frameLength = 16 + payloadLength if (buffered.length < frameLength) return const kind = buffered[5] + const operationId = buffered.readUInt32LE(8) const payload = buffered.subarray(16, frameLength) buffered = buffered.subarray(frameLength) - if (kind !== 2) continue - const namespaceLength = payload.readUInt16LE(0) - const namespace = payload.subarray(2, 2 + namespaceLength).toString('utf8') - const address = '\\\\.\\pipe\\x-code-peer-v1-' + namespace + '-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - const addressBytes = Buffer.from(address) - const responsePayload = Buffer.allocUnsafe(2 + addressBytes.length) - responsePayload.writeUInt16LE(addressBytes.length) - addressBytes.copy(responsePayload, 2) - const response = Buffer.allocUnsafe(16 + responsePayload.length) - response.write('XCPB') - response[4] = 1 - response[5] = 0x82 - response.writeUInt16LE(0, 6) - response.writeUInt32LE(0, 8) - response.writeUInt32LE(responsePayload.length, 12) - responsePayload.copy(response, 16) - process.stdout.write(response) + if (kind === 2) { + const namespaceLength = payload.readUInt16LE(0) + const namespace = payload.subarray(2, 2 + namespaceLength).toString('utf8') + const address = '\\\\.\\pipe\\x-code-peer-v2-' + namespace + '-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + const addressBytes = Buffer.from(address) + const responsePayload = Buffer.allocUnsafe(2 + addressBytes.length) + responsePayload.writeUInt16LE(addressBytes.length) + addressBytes.copy(responsePayload, 2) + send(0x82, 0, responsePayload) + } else if (kind === 3) { + pending.set(operationId, readPeerFrame(payload)) + setTimeout(() => { + const peerFrame = pending.get(operationId) + if (!peerFrame) return + pending.delete(operationId) + send(0x84, operationId, encodeBytes(peerFrame)) + if (cancellations === 300) send(0x84, operationId, encodeBytes(peerFrame)) + }, 10) + } else if (kind === 5) { + cancellations++ + const peerFrame = pending.get(operationId) + if (!peerFrame) continue + pending.delete(operationId) + send(0x84, operationId, encodeBytes(peerFrame)) + } else if (kind === 6) { + send(0x88, 0) + setTimeout(() => process.exit(0), 10) + } } }) ` @@ -355,12 +503,12 @@ describeWindows('Windows named pipe peer transport', () => { }) as ChildProcessWithoutNullStreams) as unknown as typeof spawn const transport = createWindowsNamedPipeTransport({ getRuntimePaths: () => ({ namespaceId }), - artifact: { executablePath: process.execPath, protocolVersion: 1, sha256: '0'.repeat(64) }, + artifact: { executablePath: process.execPath, protocolVersion: 2, sha256: '0'.repeat(64) }, spawnBroker, }) const identity = createPeerIdentity({ name: 'bounded-operation-client' }) const server = await transport.listen({ - address: namespaceId, + address: addressHint, instanceId: identity.instanceId, inboxToken: identity.inboxToken, onRequest: async (frame) => frame, @@ -382,21 +530,18 @@ describeWindows('Windows named pipe peer transport', () => { }) } - vi.useFakeTimers() - for (let index = 0; index < 256; index++) { + for (let index = 0; index < 300; index++) { const controller = new AbortController() const pending = request(controller.signal) controller.abort() await expect(pending).rejects.toMatchObject({ name: 'AbortError' }) } - await expect(request()).rejects.toMatchObject({ name: 'PEER_WINDOWS_OPERATION_CAPACITY' }) - await vi.advanceTimersByTimeAsync(5_001) - const recoveredController = new AbortController() - const recovered = request(recoveredController.signal) - recoveredController.abort() - await expect(recovered).rejects.toMatchObject({ name: 'AbortError' }) + await expect(request()).resolves.toMatchObject({ type: 'ping' }) + await expect(server.closed).resolves.toEqual({ + expected: false, + reason: 'Unexpected terminal operation ID', + }) } finally { - vi.useRealTimers() await server.close({ deadlineMs: 0 }) } }) diff --git a/vitest.config.ts b/vitest.config.ts index 806631e..f259b32 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -18,7 +18,6 @@ export default defineConfig({ name: 'unit', include: ['packages/core/tests/**/*.test.ts', 'packages/cli/tests/*.test.{ts,tsx}'], sequence: { groupOrder: 0 }, - testTimeout: 15_000, }, }, { From f927555deec43523f49f2f4e0d68d32eace452ca Mon Sep 17 00:00:00 2001 From: woai3c <411020382@qq.com> Date: Sun, 30 Aug 2026 22:46:44 +0800 Subject: [PATCH 6/8] fix(peers): stabilize Windows CI and approvals --- WINDOWS_PEER_MESSAGING_MANUAL_TEST.md | 305 ++++++++++++++++++ .../cli/src/ui/agent/authority-approval.ts | 2 - packages/cli/src/ui/agent/types.ts | 1 + packages/cli/src/ui/agent/use-agent.ts | 10 +- .../cli/src/ui/agent/use-goal-controller.ts | 7 +- packages/cli/src/ui/app/App.tsx | 1 + packages/cli/src/ui/chat-input/ChatInput.tsx | 26 +- packages/cli/src/ui/chat-input/types.ts | 3 +- packages/cli/tests/pty/harness.ts | 7 +- packages/cli/tests/pty/tui-interrupt.test.ts | 11 + .../cli/tests/pty/tui-peer-messaging.test.ts | 20 ++ packages/core/src/permissions/authority.ts | 2 +- packages/core/src/types/index.ts | 7 +- packages/core/tests/file-ingest.test.ts | 2 +- packages/core/tests/peer-authority.test.ts | 5 +- packages/core/tests/peer-tools.test.ts | 2 - .../core/tests/shell-tool-execution.test.ts | 1 - 17 files changed, 373 insertions(+), 39 deletions(-) create mode 100644 WINDOWS_PEER_MESSAGING_MANUAL_TEST.md diff --git a/WINDOWS_PEER_MESSAGING_MANUAL_TEST.md b/WINDOWS_PEER_MESSAGING_MANUAL_TEST.md new file mode 100644 index 0000000..49cfaf9 --- /dev/null +++ b/WINDOWS_PEER_MESSAGING_MANUAL_TEST.md @@ -0,0 +1,305 @@ +# Windows Peer Messaging 手工测试指南 + +本文用于在 Windows x64 上验证多个独立 X-Code Agent 进程能否通过 native Named Pipe broker 互相发现和通信。 + +## 1. 前置条件 + +- Windows x64; +- Node.js 22 或更高版本; +- pnpm 10; +- 三个终端使用同一个 Windows 账户; +- 三个终端使用相同权限等级:不要混用普通 PowerShell 和“以管理员身份运行”的 PowerShell; +- 三个终端必须使用相同的 `X_CODE_HOME`; +- 手工发送消息需要已经配置可用的模型/API Key 或 ChatGPT 登录状态。 + +先进入仓库并确认当前提交: + +```powershell +cd D:\res\x-code-cli +git status --short --branch +git log -1 --oneline +node --version +pnpm --version +``` + +## 2. 先运行无凭据自动化验收 + +自动化测试使用确定性 fake provider,不需要真实模型或 API Key,但会真实启动 built CLI、PowerShell ConPTY、独立进程、 +registry、Windows native broker 和 Named Pipe: + +```powershell +cd D:\res\x-code-cli +pnpm test packages/cli/tests/pty/tui-peer-messaging.test.ts +``` + +预期结果: + +```text +Test Files 1 passed +Tests 5 passed +``` + +五个用例分别覆盖: + +1. 两个命名 Agent 互相发现并收发消息; +2. `alpha -> beta -> gamma -> alpha` 三进程消息环; +3. metadata/payload 终端控制字符转义; +4. held message 的 Accept; +5. held message 的 Refuse。 + +如果该命令失败,不要进入手工验收,先根据末尾的故障排查收集日志。 + +## 3. 构建本地 CLI + +```powershell +cd D:\res\x-code-cli +pnpm build +``` + +手工测试应直接运行本仓库的 `packages/cli/dist/cli.js`,避免全局安装的 `xc` 指向旧版本。 + +## 4. 启动三个独立终端 + +最简单的方式是不覆盖 `X_CODE_HOME`,让三个终端共同使用默认的 `%USERPROFILE%\.x-code`。如果平时设置了 +`X_CODE_HOME`,请先在三个终端分别执行以下命令,确认输出完全相同: + +```powershell +$env:X_CODE_HOME +``` + +如需隔离测试,可在三个终端中都设置同一个本机目录: + +```powershell +$env:X_CODE_HOME = "$env:USERPROFILE\.x-code\peer-manual" +``` + +不要使用 `%TEMP%`、UNC 路径、映射网络驱动器、junction 或 symlink。新的隔离目录不会继承已有的 ChatGPT 登录凭据; +这种情况下需要使用环境变量 API Key,或者先在该目录下完成登录。 + +### 终端 1:alpha + +```powershell +cd D:\res\x-code-cli +node .\packages\cli\dist\cli.js --name alpha +``` + +### 终端 2:beta + +```powershell +cd D:\res\x-code-cli +node .\packages\cli\dist\cli.js --name beta +``` + +### 终端 3:gamma + +```powershell +cd D:\res\x-code-cli +node .\packages\cli\dist\cli.js --name gamma +``` + +基础功能测试不要添加 `--trust`。三个 Session 都使用默认权限模式时,默认 `auto` 入站策略应允许它们互相通信。 + +如果要验证“实现 Agent 与 Review Agent 持续交流、无需人工值守”的场景,三个 Session 必须统一使用 +`-t`/`--trust`: + +```powershell +node .\packages\cli\dist\cli.js -t --name alpha +node .\packages\cli\dist\cli.js -t --name beta +node .\packages\cli\dist\cli.js -t --name gamma +``` + +`auto` 入站策略会比较发送方和接收方的权限等级。不要只给其中一部分 Session 添加 `-t`,否则权限等级不同的消息会进入 +held 状态,等待接收方选择 Accept 或 Refuse。全部使用 `-t` 时,Peer 触发的工具调用也会自动执行;只应在这些本机 +Session 都可信时使用。 + +## 5. 验证 Agent 发现 + +在 `alpha` 中输入: + +```text +/list-agents +``` + +预期能看到 `beta` 和 `gamma`,每项包含类似下面的精确地址和状态: + +```text +beta · peer: · idle +gamma · peer: · idle +``` + +也可以分别在 `beta`、`gamma` 中运行 `/list-agents`,确认三者互相可见。 + +## 6. 验证三进程消息环 + +当前没有 `/send-message` slash command。必须用自然语言要求命名后的根 Agent 调用 `sendMessage` 工具;子 Agent 不具备该工具。 + +默认权限模式下,接收方处理 Peer 消息后若要读取文件、修改文件、执行命令或回发消息,会显示一次性本地授权。授权框默认选中 +Deny,上下键可立即切换 Allow/Deny;左右键仅用于可选查看完整 payload 分页。要测试无人值守的连续协作,请按上一节让所有 +Session 都使用 `-t`。 + +### alpha -> beta + +在 `alpha` 中输入: + +```text +请务必调用 sendMessage 工具,向 beta 发送:manual alpha -> beta +``` + +确认发送结果不是错误,并在 `beta` 中看到: + +```text +Peer message · alpha +manual alpha -> beta +``` + +### beta -> gamma + +在 `beta` 中输入: + +```text +请务必调用 sendMessage 工具,向 gamma 发送:manual beta -> gamma +``` + +确认 `gamma` 收到 `manual beta -> gamma`。 + +### gamma -> alpha + +在 `gamma` 中输入: + +```text +请务必调用 sendMessage 工具,向 alpha 发送:manual gamma -> alpha +``` + +确认 `alpha` 收到 `manual gamma -> alpha`。三个方向全部成功后,消息环验收通过。 + +如果名称重复导致 `Name is ambiguous`,从 `/list-agents` 复制目标的 `peer:`,要求 Agent 使用该精确地址发送。 + +## 7. 检查 Windows native broker + +保持三个 Session 运行,在第四个 PowerShell 中执行: + +```powershell +Get-Process xc-peer-broker +``` + +正常情况下应看到三个 `xc-peer-broker` 进程,每个命名根 Session 对应一个 broker。 + +也可以查看三个注册文件是否存在。默认目录: + +```powershell +Get-ChildItem "$env:USERPROFILE\.x-code\runtime\peers" -Filter *.json +``` + +如果设置了 `X_CODE_HOME`: + +```powershell +Get-ChildItem "$env:X_CODE_HOME\runtime\peers" -Filter *.json +``` + +## 8. 可选:验证 Hold、Accept 和 Refuse + +先退出三个 Session,然后备份当前 `config.json`。在三个 Session 共用的 X-Code home 下设置: + +```json +{ + "peerMessaging": { + "inbound": "hold", + "dialogExpiryMs": 60000 + } +} +``` + +配置文件位置: + +- 默认:`%USERPROFILE%\.x-code\config.json`; +- 自定义:`%X_CODE_HOME%\config.json`。 + +重新启动 `alpha` 和 `beta`,从 `alpha` 向 `beta` 发送消息。预期 `beta` 显示本地 Accept/Refuse 选择: + +1. 第一次选择 **Accept**,确认消息进入 `beta` 的 Agent 上下文; +2. 再发送一条消息并选择 **Refuse**,确认发送端得到拒绝结果,消息不会进入接收 Agent 上下文。 + +测试完成后将 `inbound` 恢复为 `auto`,并重新启动命名 Session。 + +## 9. 验证正常退出与清理 + +在三个 Session 中分别输入: + +```text +/exit +``` + +全部退出后,在 PowerShell 中执行: + +```powershell +Get-Process xc-peer-broker -ErrorAction SilentlyContinue +``` + +预期没有输出。 + +再检查注册目录: + +```powershell +$PeerRoot = if ($env:X_CODE_HOME) { $env:X_CODE_HOME } else { "$env:USERPROFILE\.x-code" } +Get-ChildItem "$PeerRoot\runtime\peers" -Filter *.json -ErrorAction SilentlyContinue +``` + +本轮三个 Session 对应的注册文件应已删除;其他仍在线命名 Session 的注册文件可以保留。 + +## 10. 故障排查 + +### 看不到其他 Agent + +确认: + +- 三个进程都使用 `--name`; +- 名称不同; +- `X_CODE_HOME` 完全相同; +- 使用同一 Windows 账户; +- 权限等级相同,没有混用管理员与普通终端; +- 使用交互模式,不能添加 `--print`。 + +### runtime directory 不安全 + +Windows 的 peer runtime 必须位于当前账户可控制、支持 persistent ACL 的本机 NTFS/ReFS volume。不要将 `X_CODE_HOME` +指向仓库、临时目录、网络路径、映射盘或 reparse/junction/symlink。 + +### broker 缺失或 hash mismatch + +确认正在运行本仓库构建结果,然后重新构建: + +```powershell +cd D:\res\x-code-cli +pnpm build +pnpm test packages/core/tests/windows-native-artifacts.test.ts +``` + +### 收集调试日志 + +在启动每个 Session 前设置: + +```powershell +$env:DEBUG_STDOUT = '1' +node .\packages\cli\dist\cli.js --name alpha +``` + +日志位置: + +```powershell +$PeerRoot = if ($env:X_CODE_HOME) { $env:X_CODE_HOME } else { "$env:USERPROFILE\.x-code" } +Get-Content "$PeerRoot\logs\debug.log" -Tail 200 +``` + +## 11. 验收清单 + +- [ ] 聚焦自动化测试 5/5 通过; +- [ ] `alpha`、`beta`、`gamma` 互相可发现; +- [ ] `alpha -> beta` 投递成功; +- [ ] `beta -> gamma` 投递成功; +- [ ] `gamma -> alpha` 投递成功; +- [ ] 三个 Session 运行时存在三个 broker; +- [ ] 可选 Hold/Accept/Refuse 行为符合预期; +- [ ] `/exit` 后没有遗留 broker; +- [ ] 没有未解释的错误、超时或 `PEER_DELIVERY_UNKNOWN`。 + +功能说明还可参考 [`docs/peer-messaging.md`](docs/peer-messaging.md)。 diff --git a/packages/cli/src/ui/agent/authority-approval.ts b/packages/cli/src/ui/agent/authority-approval.ts index 8017d3c..dd6c697 100644 --- a/packages/cli/src/ui/agent/authority-approval.ts +++ b/packages/cli/src/ui/agent/authority-approval.ts @@ -3,11 +3,9 @@ import type { AuthorityApproval, AuthorityApprovalPreview } from '@x-code-cli/co export function authorityApproval( preview: AuthorityApprovalPreview, decision: 'allow-once' | 'deny', - viewedComplete: boolean, ): AuthorityApproval { return { decision, - viewedComplete, authorityHash: preview.authorityHash, canonicalCallSha256: preview.canonicalCallSha256, ...(preview.outboundPayload ? { canonicalPayloadSha256: preview.outboundPayload.sha256 } : {}), diff --git a/packages/cli/src/ui/agent/types.ts b/packages/cli/src/ui/agent/types.ts index 2a76ea3..16faaa0 100644 --- a/packages/cli/src/ui/agent/types.ts +++ b/packages/cli/src/ui/agent/types.ts @@ -43,6 +43,7 @@ export interface PendingPermission { } export interface PendingAuthority { + requestId: number toolCallId: string toolName: string input: Record diff --git a/packages/cli/src/ui/agent/use-agent.ts b/packages/cli/src/ui/agent/use-agent.ts index 6ca2b11..b1881d6 100644 --- a/packages/cli/src/ui/agent/use-agent.ts +++ b/packages/cli/src/ui/agent/use-agent.ts @@ -168,6 +168,7 @@ export function useAgent(initialModel: LanguageModel, options: AgentOptions, ini const fileIngestSequenceRef = useRef(0) const planApprovalTimerRef = useRef | null>(null) const pendingAuthorityRef = useRef(null) + const authorityRequestSequenceRef = useRef(0) /** Pending tool calls keyed by toolCallId. A single slot can't survive * parallel tool calls in one turn — the SDK emits tool-call A, tool-call * B, tool-result A, tool-result B, so a shared slot gets overwritten and @@ -514,7 +515,7 @@ export function useAgent(initialModel: LanguageModel, options: AgentOptions, ini }, onAskAuthority: (request) => { return new Promise((resolve) => { - const pending: PendingAuthority = { ...request, resolve } + const pending: PendingAuthority = { ...request, requestId: authorityRequestSequenceRef.current++, resolve } pendingAuthorityRef.current = pending void options.peerService?.updateLocalState({ status: 'waiting' }).catch(() => {}) setState((prev) => ({ ...prev, authorityRequest: pending })) @@ -971,7 +972,7 @@ export function useAgent(initialModel: LanguageModel, options: AgentOptions, ini }, []) const resolveAuthority = useCallback( - (allow: boolean, viewedComplete: boolean) => { + (allow: boolean) => { const pending = pendingAuthorityRef.current pendingAuthorityRef.current = null setState((prev) => ({ ...prev, authorityRequest: null })) @@ -981,9 +982,7 @@ export function useAgent(initialModel: LanguageModel, options: AgentOptions, ini void options.peerService.updateLocalState({ status: 'busy', busyKind }).catch(() => {}) } if (pending) { - queueMicrotask(() => - pending.resolve(authorityApproval(pending.preview, allow ? 'allow-once' : 'deny', viewedComplete)), - ) + queueMicrotask(() => pending.resolve(authorityApproval(pending.preview, allow ? 'allow-once' : 'deny'))) } }, [options.peerService], @@ -1090,6 +1089,7 @@ export function useAgent(initialModel: LanguageModel, options: AgentOptions, ini abortControllerRef, pendingQuestionRef, pendingAuthorityRef, + authorityRequestSequenceRef, permissionResolversRef, turnCoordinatorRef, appendMessage, diff --git a/packages/cli/src/ui/agent/use-goal-controller.ts b/packages/cli/src/ui/agent/use-goal-controller.ts index 0656cda..d580fbc 100644 --- a/packages/cli/src/ui/agent/use-goal-controller.ts +++ b/packages/cli/src/ui/agent/use-goal-controller.ts @@ -60,6 +60,7 @@ interface UseGoalControllerOptions { abortControllerRef: MutableRef pendingQuestionRef: MutableRef pendingAuthorityRef: MutableRef + authorityRequestSequenceRef: MutableRef permissionResolversRef: MutableRef void>> turnCoordinatorRef: MutableRef appendMessage: (message: DisplayMessage) => void @@ -82,6 +83,7 @@ export function useGoalController({ abortControllerRef, pendingQuestionRef, pendingAuthorityRef, + authorityRequestSequenceRef, permissionResolversRef, turnCoordinatorRef, appendMessage, @@ -118,7 +120,7 @@ export function useGoalController({ }, onAskAuthority: (request) => { return new Promise((resolve) => { - const pending: PendingAuthority = { ...request, resolve } + const pending: PendingAuthority = { ...request, requestId: authorityRequestSequenceRef.current++, resolve } pendingAuthorityRef.current = pending void agentOptions.peerService?.updateLocalState({ status: 'waiting' }).catch(() => {}) setState((previous) => ({ ...previous, authorityRequest: pending })) @@ -165,6 +167,7 @@ export function useGoalController({ goalToolLifecycleCallbacks, handleStreamRetry, pendingAuthorityRef, + authorityRequestSequenceRef, pendingQuestionRef, permissionModeRef, permissionResolversRef, @@ -281,7 +284,7 @@ export function useGoalController({ const pendingAuthority = pendingAuthorityRef.current pendingAuthorityRef.current = null - if (pendingAuthority) pendingAuthority.resolve(authorityApproval(pendingAuthority.preview, 'deny', false)) + if (pendingAuthority) pendingAuthority.resolve(authorityApproval(pendingAuthority.preview, 'deny')) const pendingQuestion = pendingQuestionRef.current pendingQuestionRef.current = null diff --git a/packages/cli/src/ui/app/App.tsx b/packages/cli/src/ui/app/App.tsx index 0291b36..83b8f91 100644 --- a/packages/cli/src/ui/app/App.tsx +++ b/packages/cli/src/ui/app/App.tsx @@ -2069,6 +2069,7 @@ export function App({ authorityRequest={ authorityRequest ? { + requestId: authorityRequest.requestId, toolName: authorityRequest.toolName, preview: authorityRequest.preview, onResolve: resolveAuthority, diff --git a/packages/cli/src/ui/chat-input/ChatInput.tsx b/packages/cli/src/ui/chat-input/ChatInput.tsx index d4a7ee3..6fc8aee 100644 --- a/packages/cli/src/ui/chat-input/ChatInput.tsx +++ b/packages/cli/src/ui/chat-input/ChatInput.tsx @@ -361,7 +361,6 @@ export function ChatInput({ * lands here instead of resolving the dialog. */ const [permissionFeedback, setPermissionFeedback] = useState<{ text: string; cursor: number } | null>(null) const [authoritySelected, setAuthoritySelected] = useState(1) - const [authorityViewedComplete, setAuthorityViewedComplete] = useState(false) const [authorityPage, setAuthorityPage] = useState(0) const [lastPermissionKey, setLastPermissionKey] = useState(null) const permissionKey = permission ? `${permission.toolName}:${JSON.stringify(permission.input)}` : null @@ -371,11 +370,12 @@ export function ChatInput({ setPermissionFeedback(null) } const [lastAuthorityKey, setLastAuthorityKey] = useState(null) - const authorityKey = authorityRequest?.preview.canonicalCallSha256 ?? null + const authorityKey = authorityRequest + ? `${authorityRequest.requestId}:${authorityRequest.preview.canonicalCallSha256}` + : null if (authorityKey !== lastAuthorityKey) { setLastAuthorityKey(authorityKey) setAuthoritySelected(1) - setAuthorityViewedComplete(false) setAuthorityPage(0) } @@ -844,18 +844,14 @@ export function ChatInput({ const dialogSlashMode = textRef.current.trimStart().startsWith('/') if (authorityRequest) { if (key === 'escape') { - authorityRequest.onResolve(false, authorityViewedComplete) + authorityRequest.onResolve(false) return } - if (!authorityViewedComplete && (key === 'down' || key === 'right' || key === 'pagedown' || key === 'return')) { - setAuthorityPage((page) => { - const next = Math.min(authorityPageCount - 1, page + 1) - if (next === authorityPageCount - 1) setAuthorityViewedComplete(true) - return next - }) + if (key === 'right' || key === 'pagedown') { + setAuthorityPage((page) => Math.min(authorityPageCount - 1, page + 1)) return } - if (!authorityViewedComplete && (key === 'up' || key === 'left' || key === 'pageup')) { + if (key === 'left' || key === 'pageup') { setAuthorityPage((page) => Math.max(0, page - 1)) return } @@ -864,7 +860,7 @@ export function ChatInput({ return } if (key === 'return') { - authorityRequest.onResolve(authoritySelected === 0, true) + authorityRequest.onResolve(authoritySelected === 0) return } return @@ -1828,10 +1824,8 @@ export function ChatInput({ } frame.push( textToCells( - authorityViewedComplete - ? ` Complete payload viewed · SHA-256 ${preview.outboundPayload?.sha256 ?? preview.canonicalCallSha256}` - : ` Payload page ${authorityPage + 1}/${authorityPageCount} · Enter/→ for next page; approval locked.`, - authorityViewedComplete ? S_SUCCESS : S_WARNING, + ` Payload page ${authorityPage + 1}/${authorityPageCount} · ←/→ view pages · SHA-256 ${preview.outboundPayload?.sha256 ?? preview.canonicalCallSha256}`, + S_WARNING, ), ) diff --git a/packages/cli/src/ui/chat-input/types.ts b/packages/cli/src/ui/chat-input/types.ts index af16c60..51a21ba 100644 --- a/packages/cli/src/ui/chat-input/types.ts +++ b/packages/cli/src/ui/chat-input/types.ts @@ -88,9 +88,10 @@ interface PermissionRequest { } interface AuthorityRequest { + requestId: number toolName: string preview: AuthorityApprovalPreview - onResolve: (allow: boolean, viewedComplete: boolean) => void + onResolve: (allow: boolean) => void } interface SelectRequest { diff --git a/packages/cli/tests/pty/harness.ts b/packages/cli/tests/pty/harness.ts index a5b6198..7e46ff1 100644 --- a/packages/cli/tests/pty/harness.ts +++ b/packages/cli/tests/pty/harness.ts @@ -222,14 +222,17 @@ export async function createTuiHarness(options: { ? `& ${values.map(powershellQuote).join(' ')}; Write-Output "${EXIT_MARKER}$LASTEXITCODE"\r` : `${values.map(posixQuote).join(' ')}; __x_code_status=$?; printf '\\n${EXIT_MARKER}%s\\n' "$__x_code_status"\n` processUnderTest.write(command) - await waitFor(() => raw.includes('test-model'), 'CLI header', 10_000) + // A named Windows session secures its runtime and starts the native broker before rendering the header. + const startupTimeoutMs = + isWindows && args.some((arg) => arg === '--name' || arg.startsWith('--name=')) ? 20_000 : 10_000 + await waitFor(() => raw.includes('test-model'), 'CLI header', startupTimeoutMs) await waitFor( async () => { await waitForRendered() return lastPromptLine(terminalScreen(terminal)) !== '' }, 'interactive input prompt', - 10_000, + startupTimeoutMs, ) await waitForRendered() await waitForTerminalQuiet() diff --git a/packages/cli/tests/pty/tui-interrupt.test.ts b/packages/cli/tests/pty/tui-interrupt.test.ts index 1b38185..c5ff3b6 100644 --- a/packages/cli/tests/pty/tui-interrupt.test.ts +++ b/packages/cli/tests/pty/tui-interrupt.test.ts @@ -210,6 +210,17 @@ describe('TUI interruption', () => { await submitInput(harness, 'hi') await harness.waitForText('session-recovery-ok') + await waitFor( + async () => { + try { + return JSON.stringify(await readSessionJsonl(workspace.cwd)).includes('session-recovery-ok') + } catch { + return false + } + }, + 'recovery persisted to session JSONL', + 10_000, + ) const recovered = await readSessionJsonl(workspace.cwd) expect(JSON.stringify(recovered)).toContain('session-recovery-ok') await typeInput(harness, 'session-still-editable') diff --git a/packages/cli/tests/pty/tui-peer-messaging.test.ts b/packages/cli/tests/pty/tui-peer-messaging.test.ts index 57ca489..55ae006 100644 --- a/packages/cli/tests/pty/tui-peer-messaging.test.ts +++ b/packages/cli/tests/pty/tui-peer-messaging.test.ts @@ -166,6 +166,12 @@ describe('TUI cross-session messaging', () => { ]) const betaProvider = await startFakeProvider([ { type: 'tool-call', name: 'readFile', id: 'call_metadata_injection', input: { filePath: metadataInjection } }, + { + type: 'tool-call', + name: 'readFile', + id: 'call_metadata_injection_repeat', + input: { filePath: metadataInjection }, + }, { type: 'tool-call', name: 'shell', @@ -188,6 +194,20 @@ describe('TUI cross-session messaging', () => { expect(beta.raw()).not.toContain('\x1b]52;c;bWV0YWRhdGE=\x07') expect(beta.raw()).not.toContain('\x07') expect(beta.raw()).not.toContain('\u202e') + beta.key('up') + await beta.waitForScreen( + (screen) => screen.includes(`${GLYPH_SELECT_POINTER} Allow once`), + 'peer authority allow option selected immediately', + ) + beta.key('escape') + + await betaProvider.waitForMainRequests(2, 10_000) + await beta.waitForScreen( + (screen) => + screen.includes('unsafe\\u001B]52;c;bWV0YWRhdGE=\\u0007\\u202E.txt') && + screen.includes(`${GLYPH_SELECT_POINTER} Deny`), + 'repeated peer authority request reset to deny', + ) beta.key('escape') await beta.waitForText(/Payload: canonical-json · \d+ original UTF-8 bytes/) diff --git a/packages/core/src/permissions/authority.ts b/packages/core/src/permissions/authority.ts index 8c58689..6a4defa 100644 --- a/packages/core/src/permissions/authority.ts +++ b/packages/core/src/permissions/authority.ts @@ -418,7 +418,7 @@ export function verifyAuthorityApproval( preview: AuthorityApprovalPreview, currentAuthority: ExecutionAuthority, ): boolean { - if (approval.decision !== 'allow-once' || !approval.viewedComplete || !preview.complete || !preview.approvable) { + if (approval.decision !== 'allow-once' || !preview.complete || !preview.approvable) { return false } if (!equalHex(approval.authorityHash, authoritySnapshotHash(currentAuthority))) return false diff --git a/packages/core/src/types/index.ts b/packages/core/src/types/index.ts index 4a8614f..dd88fe7 100644 --- a/packages/core/src/types/index.ts +++ b/packages/core/src/types/index.ts @@ -133,7 +133,8 @@ export type AuthorityDecision = export interface AuthorityApproval { decision: 'allow-once' | 'deny' - viewedComplete: boolean + /** @deprecated Payload pagination no longer gates a local approval. */ + viewedComplete?: boolean canonicalPayloadSha256?: string canonicalCallSha256: string authorityHash: string @@ -286,8 +287,8 @@ export interface AgentCallbacks { input: Record }) => Promise /** Peer-influenced calls use a separate allow-once-only surface. The - * callback must prove that the complete canonical payload was rendered; - * absence of this callback is a fail-closed denial. */ + * callback binds its local decision to the complete canonical preview and + * hashes; absence of this callback is a fail-closed denial. */ onAskAuthority?: (request: { toolCallId: string toolName: string diff --git a/packages/core/tests/file-ingest.test.ts b/packages/core/tests/file-ingest.test.ts index 904756d..89db111 100644 --- a/packages/core/tests/file-ingest.test.ts +++ b/packages/core/tests/file-ingest.test.ts @@ -709,7 +709,7 @@ describe('ingestFile', () => { expect(JSON.stringify(parts)).not.toContain('%PDF-1.4') expect(parts.every((part) => part.type === 'text')).toBe(true) - }) + }, 15_000) // Regression: a multi-MB @path attachment used to be inlined verbatim, // pushing the user message past the model's context window before the diff --git a/packages/core/tests/peer-authority.test.ts b/packages/core/tests/peer-authority.test.ts index 2853464..e4a1b33 100644 --- a/packages/core/tests/peer-authority.test.ts +++ b/packages/core/tests/peer-authority.test.ts @@ -36,7 +36,6 @@ function classify( function approvalFor(preview: AuthorityApprovalPreview): AuthorityApproval { return { decision: 'allow-once', - viewedComplete: true, authorityHash: preview.authorityHash, canonicalCallSha256: preview.canonicalCallSha256, ...(preview.outboundPayload ? { canonicalPayloadSha256: preview.outboundPayload.sha256 } : {}), @@ -367,7 +366,7 @@ describe('canonical outbound approval payloads', () => { }) describe('allow-once approval binding', () => { - it('accepts only a complete, explicitly viewed matching approval', () => { + it('accepts only a complete matching approval without a pagination gate', () => { const preview = classify('webFetch', { url: 'https://example.test/data', prompt: 'extract one field', @@ -375,7 +374,7 @@ describe('allow-once approval binding', () => { const approval = approvalFor(preview) expect(verifyAuthorityApproval(approval, preview, PEER_AUTHORITY)).toBe(true) - expect(verifyAuthorityApproval({ ...approval, viewedComplete: false }, preview, PEER_AUTHORITY)).toBe(false) + expect(verifyAuthorityApproval({ ...approval, viewedComplete: false }, preview, PEER_AUTHORITY)).toBe(true) expect(verifyAuthorityApproval({ ...approval, decision: 'deny' }, preview, PEER_AUTHORITY)).toBe(false) expect( verifyAuthorityApproval({ ...approval, canonicalPayloadSha256: '0'.repeat(64) }, preview, PEER_AUTHORITY), diff --git a/packages/core/tests/peer-tools.test.ts b/packages/core/tests/peer-tools.test.ts index 3e9854d..05c2f99 100644 --- a/packages/core/tests/peer-tools.test.ts +++ b/packages/core/tests/peer-tools.test.ts @@ -133,7 +133,6 @@ describe('peer model tools', () => { ) const onAskAuthority = vi.fn(async ({ preview }: Parameters>[0]) => ({ decision: 'allow-once' as const, - viewedComplete: true, canonicalPayloadSha256: preview.outboundPayload?.sha256, canonicalCallSha256: preview.canonicalCallSha256, authorityHash: preview.authorityHash, @@ -331,7 +330,6 @@ describe('peer model tools', () => { ) const onAskAuthority = vi.fn(async ({ preview }: Parameters>[0]) => ({ decision: 'deny' as const, - viewedComplete: true, canonicalPayloadSha256: preview.outboundPayload?.sha256, canonicalCallSha256: preview.canonicalCallSha256, authorityHash: preview.authorityHash, diff --git a/packages/core/tests/shell-tool-execution.test.ts b/packages/core/tests/shell-tool-execution.test.ts index 797f955..6c0e5f7 100644 --- a/packages/core/tests/shell-tool-execution.test.ts +++ b/packages/core/tests/shell-tool-execution.test.ts @@ -229,7 +229,6 @@ describe('PTY shell tool transport', () => { const options: AgentOptions = { modelId: 'test-model', trustMode: true, printMode: false } const onAskAuthority = vi.fn(async (request: Parameters>[0]) => ({ decision: request.toolCallId === 'call-peer-write' ? ('deny' as const) : ('allow-once' as const), - viewedComplete: true, canonicalPayloadSha256: request.preview.outboundPayload?.sha256, canonicalCallSha256: request.preview.canonicalCallSha256, authorityHash: request.preview.authorityHash, From 4c9c69c2b4c75dcfac46e6ef92fd2232b896de53 Mon Sep 17 00:00:00 2001 From: woai3c <411020382@qq.com> Date: Sun, 30 Aug 2026 23:03:40 +0800 Subject: [PATCH 7/8] fix(test): wait for idle peer turn before exit --- packages/cli/tests/pty/tui-peer-messaging.test.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/cli/tests/pty/tui-peer-messaging.test.ts b/packages/cli/tests/pty/tui-peer-messaging.test.ts index 55ae006..3698759 100644 --- a/packages/cli/tests/pty/tui-peer-messaging.test.ts +++ b/packages/cli/tests/pty/tui-peer-messaging.test.ts @@ -279,7 +279,11 @@ describe('TUI cross-session messaging', () => { expect(request?.rawBody).toContain(' screen.includes('accepted held payload') && !screen.includes('esc to interrupt'), + 'idle beta after accepted held payload', + 10_000, + ) } else { await alpha.waitForText('denied by beta') expect(betaProvider.mainRequests()).toHaveLength(0) From d95af88028c971e12eaa21fb1a244c8b481e1962 Mon Sep 17 00:00:00 2001 From: woai3c <411020382@qq.com> Date: Sun, 30 Aug 2026 23:18:19 +0800 Subject: [PATCH 8/8] chore: update --- WINDOWS_PEER_MESSAGING_DESIGN_REVIEW.md | 522 ------------------------ WINDOWS_PEER_MESSAGING_MANUAL_TEST.md | 305 -------------- 2 files changed, 827 deletions(-) delete mode 100644 WINDOWS_PEER_MESSAGING_DESIGN_REVIEW.md delete mode 100644 WINDOWS_PEER_MESSAGING_MANUAL_TEST.md diff --git a/WINDOWS_PEER_MESSAGING_DESIGN_REVIEW.md b/WINDOWS_PEER_MESSAGING_DESIGN_REVIEW.md deleted file mode 100644 index 174ab2b..0000000 --- a/WINDOWS_PEER_MESSAGING_DESIGN_REVIEW.md +++ /dev/null @@ -1,522 +0,0 @@ -# Windows Peer Messaging 设计审查与收敛方案 - -> 审查对象:PR [#29](https://github.com/woai3c/x-code-cli/pull/29),`origin/main...580258b` -> -> 审查日期:2026-08-30;本文件区分“事实”“判断”和“估算”。 - -## 结论 - -**判断:当前 PR 存在实质性过度设计,不建议以现状直接合并。** - -但原因不是“Windows 功能完全没有复用”:现有 `PeerService`、注册发现、消息协议、收件箱、限流、投递账本、 -权限/污染链路和 CLI 生命周期均被复用。新增代码主要集中在 Windows 传输和安全边界。 - -真正的问题是:一个“补齐 Windows transport”的任务,同时引入了严格且尚未完成人工确认的威胁模型、两套新二进制协议、 -手写 Win32 overlapped I/O 状态机、重复的 native artifact 基础设施,以及与功能无关的测试改动。实现复杂度已经超过现有 -Unix transport 约一个数量级,而 PR 尚缺少其自身计划要求的异用户/完整性级别、双机 remote rejection 和 arm64 实机证据。 - -推荐方向不是退回纯 Node 实现,而是: - -1. 保留原生 helper 和必要的 Windows 安全边界; -2. 复用既有业务层,不改公开的 peer 行为; -3. 删除重复 loader、校验器和子进程管线; -4. 把两套新增协议收敛为最少的 request/response/cancel 生命周期; -5. 用实测 spike 决定是否以 Tokio named pipe 替代手写 I/O; -6. 把非本功能测试变更移出本 PR,并用真实 Windows 多进程通信验收最终结果。 - -## 1. 审查范围与方法 - -### 1.1 事实来源 - -- PR 元数据、提交和 GitHub Actions 结果; -- `git diff --numstat origin/main...HEAD` 与逐文件 diff; -- TypeScript/Rust 实现、测试、构建脚本和预编译 artifact; -- 当前环境 Node `22.14.0`、libuv `1.49.2`、Windows x64; -- Node、libuv、Microsoft Win32 和 Tokio 官方资料。 - -### 1.2 非目标 - -- 不重新设计现有消息业务语义、权限模型或 UI; -- 不增加 TCP、跨主机或跨用户消息能力; -- 不把 shell supervisor 和 peer broker 强行合并为一个可执行文件; -- 不以减少行数为由降低已经声明的安全边界;安全策略变更必须单独获得维护者确认。 - -## 2. 7,871 行从哪里来 - -PR 事实:`+7,871/-260`,54 个文件。按职责拆分如下;Rust 文件中的生产/内联测试边界为近似值,其余来自 -`numstat`: - -| 类别 | 新增行 | 占比 | 说明 | -| ------------------------------- | --------: | -------: | -------------------------------------------------------------- | -| Rust broker 生产代码 | 约 3,555 | 45.2% | pipe、安全、runtime ACL、协议、生命周期 | -| TypeScript peer 生产代码 | 1,486 | 18.9% | broker client、平台 transport、runtime helper、artifact loader | -| 测试 | 1,170 | 14.9% | 845 行外部测试 + 约 325 行 Rust 内联测试 | -| 实施计划与产品文档 | 1,213 | 15.4% | 其中根目录实施计划单独占 1,196 行 | -| 构建、artifact、lockfile 与其他 | 447 | 5.7% | native 构建/manifest/CI/package 适配 | -| **合计** | **7,871** | **100%** | 二进制文件不计文本行数 | - -因此,7,871 行不是 7,871 行运行时代码:约 2,383 行是测试和文档。不过约 5,041 行产品代码仍然很大;其中 -Windows 专属栈约 4,767 行,而现有 [Unix transport](packages/core/src/peers/unix-socket-transport.ts) 约 464 行。 -差距主要来自安全与代理协议,不是 Windows pipe 地址格式本身。 - -预编译体积当前为: - -| Artifact | x64 | arm64 | -| ------------------------------ | ------------: | ------------: | -| `xc-peer-broker.exe` | 301,056 bytes | 279,040 bytes | -| 既有 `xc-shell-supervisor.exe` | 211,456 bytes | 204,800 bytes | - -## 3. 实际复用了什么 - -### 3.1 已正确复用 - -以下行为没有在 Windows 重写: - -- `PeerService` 的发送、重试和 `PEER_DELIVERY_UNKNOWN` 语义; -- 注册发现、过期清理和 PID 探测; -- `PeerFrameV1`、帧大小限制和 NDJSON 编解码; -- inbox 的 hold/accept/refuse、幂等和投递账本; -- rate limit、权限 authority、peer taint/provenance; -- CLI 启停、消息入队和 UI。 - -当前结构是: - -```text -CLI / tools - | - v -PeerService + Registry + Inbox + Authority <- 既有公共业务层 - | - v -PeerTransport - |-- Unix: Node net + Unix domain socket - | - `-- Windows: TypeScript BrokerClient - | - | XCPB 控制协议 - v - 本 Session Rust broker - | - | XCPP 会话协议 - v - 对端 Rust broker - | - v - 既有 PeerFrameV1 -``` - -**判断:业务层复用是合理的,“没有复用代码”这一说法不成立。** - -### 3.2 没有复用或抽象不完整的部分 - -| 问题 | 证据 | 后果 | -| -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | -| native artifact 解析重复 | [peer broker loader](packages/core/src/peers/windows-peer-broker-artifact.ts) 与 [shell supervisor loader](packages/core/src/tools/shell-session/providers/windows-job.ts) 都实现 manifest、路径、PE architecture 和 SHA-256 校验 | 两份 schema/type/error/path 逻辑已经发生漂移 | -| pipe 地址校验重复 | [registry.ts](packages/core/src/peers/registry.ts#L32) 与 [windows-named-pipe-transport.ts](packages/core/src/peers/windows-named-pipe-transport.ts#L79) 各有一份正则 | 安全校验规则可能不一致 | -| 子进程协议管线重复 | [windows-peer-runtime-security.ts](packages/core/src/peers/windows-peer-runtime-security.ts) 与 `BrokerClient` 分别实现 spawn、stderr 限制、decoder、abort、timeout、exit 映射 | 一次性 runtime 检查单独占 215 行并复制故障处理 | -| transport 接口泄漏 endpoint 细节 | [transport.ts](packages/core/src/peers/transport.ts#L10) 暴露 `createAddressHint()`;Unix 返回 socket 候选路径,Windows 返回的实际是 namespace 派生信息 | `PeerService.start()` 出现 Unix 专属异常回退,平台边界不干净 | -| 低层构造器进入公共 API | `createPlatformPeerTransport` 和 `createWindowsNamedPipeTransport` 被加入 core export snapshot | 给尚未稳定的内部实现增加兼容负担 | -| Rust helper 间只有少量原语重复 | shell supervisor 主要处理 Job Object,peer broker 主要处理 pipe/security | 为少量 handle/wide-string 工具抽公共 Rust crate 会增加构建耦合,暂不建议 | - -## 4. 哪些复杂度是必要的 - -### 4.1 原生边界不是多余的 - -Node 的 named-pipe `net` API没有传入 `SECURITY_ATTRIBUTES` 或设置 `PIPE_REJECT_REMOTE_CLIENTS` 的接口。当前环境的 -libuv `1.49.2` 在 `CreateNamedPipeW` 路径使用空 security attributes,且没有加入 remote-client rejection flag。 -Microsoft 文档说明,空 security descriptor 的默认 ACL 会给创建者/管理员/SYSTEM 较高权限,并给 Everyone/anonymous -提供读取权限;Node 的 Windows `chmod` 也只能有限切换写权限,不能表达 Unix `0600` 的 user/group/other 语义。 - -因此,如果验收标准是“与 Unix 私有 socket 等价的当前用户、本机通信”,就需要 Rust/C++ helper 或 native addon。 -纯 Node 方案只能在维护者明确接受更弱威胁模型后采用。 - -保留的最低安全与可靠性要求: - -- 创建 pipe 时原子设置受保护 DACL; -- `PIPE_REJECT_REMOTE_CLIENTS` 和 `FILE_FLAG_FIRST_PIPE_INSTANCE`; -- 高熵 pipe 名称; -- 对端 Windows account SID 校验; -- 私有且本地的 registry/runtime,拒绝 UNC、remote volume 和 reparse escape; -- 既有 `inboxToken`、`PeerFrameV1` 严格解析、authority 与 taint 链路; -- bounded frame/concurrency/timeout、AbortSignal 和 parent EOF shutdown; -- artifact architecture、protocol version 和 hash 校验。 - -### 4.2 broker 进程本身是可接受的选择 - -与 Node native addon 相比,独立 broker 避免 Node ABI/N-API 装载和崩溃隔离问题。每个命名 root Session 一个 broker,也与 -现有 session 生命周期相符。问题不在“有 broker”,而在 broker 两侧又建立了过多确认层和重复状态。 - -## 5. 过度设计点 - -### 5.1 P0:安全需求扩张先于 Human Plan Review - -根目录的 1,196 行计划把“同用户、本机通信”扩张为:精确 integrity RID 相等、AppContainer 拒绝、逐级 ancestor ACL -审计、双向进程身份验证,以及双机 remote rejection 验收。这些规则可能合理,但它们是产品/兼容性决定,不只是实现细节。 - -审查开始时 PR 不是 Draft,而 PR 描述仍明确记录 Human Plan Review、Human Local Acceptance 和 Human Technical Review 未完成; -现已将 PR 转为 Draft,并在剩余验收证据补齐前保持该状态。 -这与 [开发流程](docs/development/agent-workflow.md) 中“有安全/公共接口/跨平台影响时先做 Human Plan Review,Human Local -Acceptance 前保持 Draft”的要求不一致。 - -本次收敛默认**不降低现有安全行为**。是否把“精确 integrity 相等”改为更接近 Unix 的“同 account SID 即可”,应作为独立 -产品决定;否则重构无法用真实 elevated/non-elevated 环境证明兼容性。 - -### 5.2 P0:三层协议重复确认同一个交付事实 - -[Windows broker control protocol](packages/core/src/peers/windows-peer-broker-protocol.ts#L9) 定义 14 类 frame,包含 -`CancelAck(canceled/too-late)`、operation tombstone 和 shutdown ACK。broker 间协议又使用 client/server nonce、auth-ok、 -business response 和额外 business ACK,最内层仍是已有的 `PeerFrameV1` request/ack。 - -在“一条连接只承载一个有界请求,连接双方先通过 OS identity 与 token 验证”的前提下: - -- nonce 没有提供额外的跨连接重放保护;业务 message ID 已负责幂等; -- response 后的 business ACK 不改变发送方“未收到匹配 response 即 delivery unknown”的语义; -- cancel 不需要双向 `canceled/too-late` 仲裁,never-reused operation ID 加本地 late-result ignore set 即可; -- 未知但属于已取消请求的迟到 completion 不应杀死整个 broker。 - -这些状态曾导致成功请求占用容量、快速断连杀死 broker 等缺陷;虽已修复,但说明状态空间难以推理。 - -### 5.3 P1:手写 Win32 overlapped I/O 规模过大 - -`pipe.rs` 共 1,234 行,约 1,149 行是生产代码,手写了 create/connect/read/write/event/cancel/close 的异步状态。 - -Tokio 的 Windows named-pipe `ServerOptions` 已提供 `reject_remote_clients`,并允许通过 -`create_with_security_attributes_raw` 传入自定义 security attributes。它可能删除大量 I/O 状态机,但会增加依赖、编译时间和 -二进制体积。因此这里不能凭感觉替换,必须先做不进入最终 diff 的 x64/arm64 release spike,并以 artifact 体积、功能和 -package budget 决策。 - -2026-08-30 已完成第一轮不进入仓库 diff 的 Windows x64 探索性 spike: - -| 变体 | Release 体积 | 结果 | -| ------------------------------------------------------------------------------------------- | ------------: | ----------------------------------------------------------------- | -| 最小 Tokio named pipe,启用 first-instance、remote rejection 和 raw security attributes API | 286,208 bytes | request/response 通过 | -| 当前 raw Win32 broker | 301,056 bytes | 当前基线 | -| Tokio + 当前 DACL/SID/双向身份/runtime ACL 模块,不链接原 raw pipe 主路径 | 348,672 bytes | 私有 DACL、双向 SID 验证和 4,000 次快速断连通过;压力段约 0.32 秒 | -| 同时保留 raw pipe 与 Tokio 两套 I/O 的上界实验 | 445,440 bytes | 功能通过,但超过单 artifact 0.4 MiB 预算 | - -**事实解释:**替换而不是并存时,x64 有较大概率满足 0.4 MiB 预算;但目前只是下界/上界测量,不证明完整 broker 替换后的 -最终体积。当前机器未安装 arm64 Rust target,所以 arm64 spike 尚未执行。实施时可以进入 Tokio 替换分支,但最终 x64 或 -arm64 任一产物超预算、功能回归或取消语义不稳定,都应回退 raw Win32。 - -### 5.4 P1:runtime 初始化被做成第二套 helper 生命周期 - -runtime ACL 检查复用了同一个可执行文件,却另外启动一次 one-shot 子进程并复制控制协议。它可以并入持久 broker 的启动握手, -或者至少复用统一的 native child client。当前设计增加了一个启动竞态和完整错误面。 - -### 5.5 P1:manifest 以 architecture 为第一维 - -当前 manifest 在每个 architecture 下重复 helper 的 protocol/source provenance,曾出现“未构建 architecture 被错误标成当前 -source”的修复提交。推荐改成 helper-first: - -```json -{ - "manifestVersion": 3, - "helpers": { - "peerBroker": { - "protocolVersion": 1, - "sourceSha256": "...", - "binaries": { - "x64": { "file": "x64/xc-peer-broker.exe", "sha256": "..." }, - "arm64": { "file": "arm64/xc-peer-broker.exe", "sha256": "..." } - } - } - } -} -``` - -一个共享 loader 负责路径、PE、hash 和 protocol;build 脚本只负责写入各 helper 的 provenance。 - -### 5.6 P2:非功能性 diff 污染 - -PR 全局把 Vitest unit timeout 提到 15 秒、PTY harness 启动等待从 10 秒调到 20 秒,并移动 PDF 测试、修改 file-lock 计时。 -这些可能是 CI 稳定性修复,但与 Windows peer 的因果关系没有记录。全局 timeout 尤其可能隐藏性能回退。应恢复 base 行为, -只给确实较慢的 Windows peer 用例设置局部 timeout;其他修复另开 PR。 - -### 5.7 P0:安全声明强于执行证据 - -当前 GitHub 8/8 jobs 通过,Windows x64 多终端 smoke 也有记录;这证明主路径可运行。但仓库中未找到实际创建不同账户或不同 -integrity process 的集成测试。remote 测试只锁定创建 flag,PR 仍缺双机执行;arm64 只有 PE/hash/provenance 校验,缺目标 -机器执行。CI 绿不能替代这些 threat-model acceptance。 - -## 6. 目标架构 - -```text -PeerService(不改业务语义) - | - v -PeerTransport.listen({ instanceId, inboxToken, ... }) - |-- UnixTransport - | `-- transport 自己创建/清理 UDS endpoint - | - `-- WindowsBrokerTransport - |-- SharedWindowsNativeArtifactResolver - |-- 单一 BrokerProcessClient - | |-- secure runtime + start server - | |-- request / response / cancel / shutdown - | `-- 统一 spawn/decoder/stderr/timeout/exit - `-- Rust broker - |-- security: DACL / local-only / SID / runtime ACL - |-- pipe I/O: raw Win32 或经 spike 验证的 Tokio - `-- 单连接单 request -> 单 response -``` - -目标不是追求一个任意 LOC 数字,而是让每一层只拥有一种职责: - -- 业务 delivery ack 只属于 `PeerFrameV1`; -- transport 只提供 request/response/cancel; -- OS security 只由 Rust 层执行; -- registry 只存经过 transport validator 验证的 descriptor; -- artifact provenance 只由一套 schema/loader/build path 管理。 - -## 7. 详细实施计划 - -### 阶段 0:计划确认与 PR 状态 - -1. 将 PR 标记为 Draft,直到本方案、真实运行证据和 Human Local Acceptance 完成。 -2. 由请求维护者确认本方案。 -3. 安全策略默认保持当前严格行为:同 SID、精确 integrity、非 AppContainer;若要放宽,另行决策并补对应验收。 - -完成条件:计划决定被记录,非目标和安全不变量明确。 - -### 阶段 1:先做低风险复用与 diff 清理 - -1. 抽取共享 Windows native artifact loader:统一 manifest schema、路径约束、PE architecture、hash 和 protocol 校验。 -2. 将 manifest 改为 helper-first,更新 build/copy/write/check/package 脚本和测试。 -3. 抽取唯一的 Windows pipe address parser/validator,registry 与 transport 共用。 -4. 把 `createAddressHint()` 从 `PeerTransport` 删除;`listen()` 自己创建 endpoint,删除 `PeerService` 的 Unix fallback。 -5. 不再公开导出 platform/Windows transport 低层构造器;测试从内部模块导入或通过注入接口测试。 -6. 恢复无因果依据的全局 timeout 和非 peer 测试改动;保留必要改动时写明原因并局部化。 -7. 把原 1,196 行施工清单替换为本 ADR/审查文件和简短的 maintained product docs。 - -每一步后:运行受影响 unit tests、`pnpm build`、`pnpm typecheck`。 - -### 阶段 2:收敛 Node 到 broker 的控制面 - -1. 建立一个 `BrokerProcessClient`,统一 spawn、bounded stderr、frame decoder、write serialization、startup timeout、abort 和 exit。 -2. 将 secure-runtime 合入持久 broker 启动;若生命周期耦合使 registry 无法安全初始化,则保留 one-shot 命令,但必须复用同一 - process client,而不是复制 215 行实现。 -3. 将控制 frame 缩减为最小集合:initialize/start、request、response、inbound request/response、cancel、error、shutdown。 -4. operation ID 单调且不复用;cancel 为 best effort,不再返回 canceled/too-late ACK。 -5. Node 仅保留有界、短 TTL 的 canceled-ID ignore set;一个合法迟到结果不能触发 broker-wide fatal。 -6. 保持 `AbortSignal`、request deadline、最大并发、broker crash 和 `PEER_DELIVERY_UNKNOWN` 语义不变。 - -完成条件:协议 golden-vector 测试覆盖所有 frame;连续成功、取消竞态、broker crash、未知 frame、超大 frame 均有回归。 - -### 阶段 3:收敛 broker 间协议 - -1. 保留 connect 后的双向 OS identity 验证和 target token 验证。 -2. 每条 pipe connection 只允许一个 auth+business request 和一个 business response。 -3. 删除 client/server nonce 和 response 后 business ACK;关闭连接即完成 transport 生命周期。 -4. 继续在 `PeerFrameV1` 层校验 request ID/message ID,保持消息幂等与 delivery-unknown 行为。 -5. 将错误码分成 protocol/security/timeout/canceled/capacity,统一映射并去敏。 - -完成条件:错误 token、错误/无法读取身份、malformed/oversized、断连、超时、取消和重复 message ID 的结果稳定。 - -### 阶段 4:Win32 I/O 实测 spike - -1. 已在临时目录完成 x64 API、DACL/SID、体积和 4,000 次快速断连探索,结果记录于 5.3。 -2. 实施候选中完成完整 broker Tokio 替换,分别构建 x64/arm64 release,记录 source LOC、artifact size、启动耗时、压力测试和 - package budget。 -3. 决策门槛:安全能力必须等价;每个 native artifact 仍满足仓库预算,或维护者明确批准预算变化;测试不得更差。 -4. 达标则保留 Tokio;不达标则删除替换,保留 raw Win32,但按单连接单请求状态机拆小并补注释/测试。 - -这是测量性决策,不预设 Tokio 一定更好。 - -### 阶段 5:验证与独立审核 - -1. Rust:`cargo fmt --check`、`cargo clippy -- -D warnings`、`cargo test`、fresh x64 build/self-test;arm64 交叉构建和 PE/hash 校验。 -2. TS:聚焦 peer registry/service/protocol/transport/native artifact tests。 -3. Core 改动后执行 `pnpm build`;随后 `pnpm typecheck`、`pnpm lint:check`、`pnpm format:check`。 -4. 执行 `pnpm run ci` 和 package/install smoke。 -5. 首轮改造完成后启动独立、只读子 agent,提供目标、方案、候选 worktree 和完整验证证据;按 finding 修复并重跑受影响检查。 -6. 每次修复后让同一 reviewer 对新候选复审,直到没有 blocker/high/medium finding;记录其不是仓库已配置的正式平台 gate。 - -### 阶段 6:Windows 真实多进程验收 - -在隔离的 `X_CODE_HOME` 和 workspace 中,用真实 built CLI、真实 PowerShell/ConPTY、真实 registry/broker/named pipe,模型端只使用 -确定性 fake provider: - -1. 在三个独立终端启动命名 Agent `alpha`、`beta`、`gamma`; -2. 三者互相 discovery; -3. 完成 `alpha -> beta -> gamma -> alpha` 消息环; -4. 验证 payload 进入接收方 peer context,回复/ack 与 message ID 匹配; -5. 验证 hold/accept/refuse 至少各一条; -6. 中止一个发送并杀掉一个 broker,确认其他进程存活、stale registration 被清理、重启后可再次通信; -7. 重复至少三轮,保存命令、Node/OS、commit/worktree、stdout/stderr、exit code 和副作用路径。 - -安全验收另列: - -- 不同 Windows account:必须拒绝; -- remote host:如果 PR 继续声明该能力,必须用第二台受控 Windows 主机执行; -- arm64:如果本 PR 准备 Ready/发布,必须在真实 arm64 Windows 上执行 helper self-test 和两个 Session smoke; -- 不同 integrity:按阶段 0 确认的策略执行并记录。 - -### 阶段 7:交付 - -1. `git diff --check`、工作树检查、生成最终 LOC/体积对比; -2. 更新 PR 描述,真实标记每项为 PASSED/FAILED/NOT EXECUTED/NOT APPLICABLE; -3. Human Local Acceptance 前保持 Draft; -4. 用户已授权本轮最终提交;只有在代码、审核和本机功能验收全部通过后,创建一次 conventional commit; -5. 不 push、不 merge、不 release,除非另有明确授权。 - -## 8. 验收标准 - -- macOS/Linux 的 Unix socket 行为和公共 peer API 不变; -- Windows x64 三个真实 CLI 进程可发现并完成环形消息; -- Windows 的 DACL、local-only、SID、token、frame bounds 和 authority/taint 不弱于当前 PR; -- abort、timeout、broker crash、快速断连和容量恢复没有泄漏或全局 fatal; -- manifest 对 x64/arm64 的 binary/source provenance 不会互相污染; -- core build、聚焦测试、全量 CI、package/install smoke 通过; -- 独立子 agent 对最终候选没有 blocker/high/medium finding; -- 未执行的 arm64、remote、异用户或 integrity 证据必须阻止对应安全声明或 Ready 状态,不能用单元测试代替。 - -## 9. 预期规模变化 - -以下均是**估算,不是验收指标**,各项有重叠,不能直接相加: - -| 收敛项 | 预计净减少 | -| ------------------------------------------ | --------------------------------------------: | -| 1,196 行施工清单改为短 ADR/maintained docs | 约 850–1,000 行 | -| 共享 artifact/validator/process 基础设施 | 约 200–350 行 | -| 控制协议与 cancel 生命周期简化 | 约 250–500 行 | -| broker 间 nonce/business ACK 删除 | 约 150–300 行 | -| Tokio 若通过 spike 并替换 raw I/O | 约 500–800 行源码,但 lockfile/二进制可能增加 | -| 移出无关 diff | 约 30–80 行 | - -在不削弱安全边界的前提下,合理目标是把最终 PR 控制在约 4,500–5,500 行新增(含测试和文档),而不是追求纯 Node -方案可能达到的低行数。若 Tokio 不满足体积或稳定性门槛,接受更高 LOC,但必须通过协议和复用收敛降低状态空间。 - -## 10. 主要风险与回退 - -| 风险 | 控制与回退 | -| ---------------------------------- | --------------------------------------------------------------------------------------- | -| 简化 ACK 后改变 delivery certainty | 以现有 outbound ledger 为语义 owner;断连仍返回 `PEER_DELIVERY_UNKNOWN`,用竞态测试锁定 | -| cancel 迟到结果污染新请求 | operation ID 在进程生命周期内不复用;有界 ignore set;wrap 前 fail/restart | -| Tokio 增大 artifact/package | spike 不进入最终 diff;超预算立即回退 raw Win32 | -| manifest migration 破坏旧包布局 | loader 只读取当前包内 manifest;package install smoke 覆盖 source/dist/tarball 路径 | -| Windows 修复破坏 Unix | transport contract tests 在 Windows/Linux/macOS CI 均执行 | -| 严格 runtime ACL 使临时目录不可用 | 测试使用受控本地 runtime;不通过放宽安全来迁就测试 | - -## 11. 外部依据 - -- [Node.js 22 `net` 文档:IPC/named pipe listen options](https://nodejs.org/docs/latest-v22.x/api/net.html) -- [Node.js 22 `fs.chmod` 的 Windows 限制](https://nodejs.org/docs/latest-v22.x/api/fs.html) -- [libuv v1.49.2 Windows pipe 实现](https://github.com/libuv/libuv/blob/v1.49.2/src/win/pipe.c) -- [Microsoft `CreateNamedPipeW`](https://learn.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-createnamedpipew) -- [Microsoft Named Pipe Security and Access Rights](https://learn.microsoft.com/en-us/windows/win32/ipc/named-pipe-security-and-access-rights) -- [Microsoft `ImpersonateNamedPipeClient`](https://learn.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-impersonatenamedpipeclient) -- [Tokio Windows named-pipe `ServerOptions`](https://docs.rs/tokio/latest/tokio/net/windows/named_pipe/struct.ServerOptions.html) - -## 12. Human Plan Review 决策面 - -请求维护者已于 2026-08-30 在当前实现对话中回复“同意方案”,批准以下整体方案: - -- [x] 同意“保留 native broker,但收敛协议、生命周期和重复基础设施”; -- [x] 同意本轮默认保持当前严格的 SID/integrity/AppContainer 安全行为; -- [x] 同意 Tokio 仅作为有退出门槛的临时 spike,结果不达标即回退; -- [x] 同意未取得真实 arm64/双机证据前,PR 保持 Draft 且不宣称对应验收已完成; -- [x] 同意按阶段 1–7 实施、审核、真实多终端测试并在全部通过后创建一次提交。 - -## 13. 实施结果与最终证据 - -### 13.1 最终结论 - -初始结论经实现与复审后仍成立:**原 PR 确有过度设计,但“完全没有复用既有代码”不成立。** 既有业务层、注册发现、 -消息格式、收件箱、权限与 taint 链路均得到复用;可确认的过度设计主要位于 Windows 专属 transport 的重复基础设施、 -控制协议状态和手写异步 I/O。 - -本轮已经移除这些可确认的冗余,同时保留 native broker 及其 DACL、local-only、SID、integrity、AppContainer、token、 -runtime ACL 和有界资源策略。最终候选不再用多层 ACK/nonce/cancel 仲裁表达同一个交付事实,也不再为两个 Windows helper -分别维护 artifact loader 和进程协议管线。 - -最终 diff 仍然很大,因此结论不是“代码少了就安全”,也不是“剩余代码都天然必要”:当前主要体积来自 3,505 行 Rust -broker(其中安全与 runtime ACL 991 行)、Windows transport/控制客户端、跨进程与安全回归测试、构建产物管理以及本审查报告。 -它已从“状态空间难以推理”收敛为职责较清晰的实现,但仍应以 Draft 接受尚未完成的真实 arm64、异账户、异 integrity 和双机 -验收约束。 - -### 13.2 已实施的收敛 - -- 抽取共享 Windows native artifact 解析、PE 架构、hash/protocol 校验,供 peer broker 与 shell supervisor 复用; -- 抽取唯一的 pipe 地址验证器和统一 native 子进程管线,删除 runtime probe 与 broker client 的重复实现; -- 保持旧 `PeerTransport` 注入兼容,并让 transport 自己拥有 endpoint 创建、校验和关闭生命周期; -- 将 Node 控制面收敛为最小 request/response/cancel/shutdown 状态,ID 不复用且 wrap 前失败; -- 删除 broker 间 nonce、auth-ok、额外 business ACK 与 cancel 仲裁,保留 OS identity、token 和业务幂等语义; -- 用 Tokio named pipe 替代手写 Win32 overlapped I/O,同时保持原有安全边界和 fail-closed 行为; -- 将 CLI native copy 范围限定为 `native/windows`,并校验 x64/arm64 manifest、PE 与 hash; -- 恢复与本功能无因果关系的全局测试门限,只为实际重型媒体用例保留局部 15 秒上限; -- 删除 1,196 行施工清单,以本审查文档作为决策、实施和证据记录。 - -全量门禁还暴露了一个与 peer 无关、但会让 Windows 测试宿主以 `0xC0000005` 退出的 PDF native Worker 崩溃。为保证门禁 -真实通过而不是重跑掩盖,本候选把 Windows PDF renderer 隔离到 child process,等待 PDF/image worker 自然退出,并补充 -abort、IPC disconnect 与安装包 fork 路径测试;其他平台仍使用原 Worker 路径。该修复是最终 LOC 高于阶段 9 估计的一部分。 - -### 13.3 规模与产物 - -| 指标 | 初始 PR | 最终候选 | -| ------------------- | ------------: | ----------------------------------------------: | -| 文本 diff | `+7,871/-260` | `+7,543/-425` | -| 变更文件 | 54 | 60 | -| 根目录施工/审查文档 | 1,196 行 | 522 行 | -| x64 peer broker | 301,056 bytes | 362,496 bytes | -| arm64 peer broker | 279,040 bytes | 346,112 bytes | -| npm package | 未记录 | 3.00 MiB packed / 11.80 MiB unpacked / 41 files | - -阶段 9 的 `4,500–5,500` 行是初始估计,**最终没有达到该估计**。原因包括严格安全实现不能按 LOC 目标裁剪、Tokio 替换的 -净减幅小于 spike 下界、增加了竞态/容量/真实 PTY 回归,以及上述 PDF native crash 修复。最终新增行数仅比初始少 -328 行,但删除行数增加 165 行;更重要的收益是删除重复协议状态和手写 I/O 分支,而不是用测试或文档迁移 -制造表面 LOC 降幅。 - -### 13.4 独立审核 - -同一只读子 Agent 对每轮修复持续复审,先后发现并推动修复:shutdown 保留 ID、operation capacity 释放竞态、ID overflow、 -取消后迟到 terminal、子进程 EPIPE、异常终止汇合、destroy deadline、父 IPC 断连和真实时钟测试抖动等问题。最终轮未编辑 -文件、未运行测试,仅审核最新完整候选,结论为: - -- Blocker:0 -- High:0 -- Medium:0 -- Low:0 -- **无发现,可提交** - -### 13.5 最终验证 - -验证环境:Windows 10 `10.0.19045` x64、Node `v22.14.0`、pnpm `10.7.1`、Rust `1.94.0`。 - -| 检查 | 结果 | -| -------------------------------------------------------- | ------------------------------------------------------------------------------------------ | -| `pnpm run ci` | PASS;201 个文件通过、3 个平台跳过;1,985 个测试通过、37 个跳过;无 unhandled worker error | -| `pnpm check:package` | PASS;3.00 MiB packed、11.80 MiB unpacked、41 files | -| `cargo fmt --check` | PASS | -| `cargo test --locked` | PASS;19/19 | -| `cargo clippy --all-targets --locked -- -D warnings` | PASS | -| x64 `xc-peer-broker self-test --protocol 2` | PASS | -| x64/arm64 artifact manifest、PE、hash、source provenance | PASS;arm64 为交叉构建产物校验 | -| PDF/image native 退出压力测试 | PASS;5 轮、每轮 42/42 | -| shutdown coordinator 稳定性 | PASS;10 轮、每轮 2/2 | -| `git diff --check` | PASS | -| 测试后 broker/repo child process 残留 | 0 | - -### 13.6 真实 Windows 多进程通信验收 - -使用 built CLI、真实 PowerShell ConPTY、隔离 `X_CODE_HOME`、真实 registry、native broker 与 named pipe,启动三个独立命名 -进程 `alpha`、`beta`、`gamma`;模型端仅使用确定性 fake provider,不替代 transport: - -- 三者互相发现成功; -- `alpha -> beta -> gamma -> alpha` 消息环成功,接收上下文与 message ID/ack 匹配; -- 两进程直接互发成功且没有出现 authority dialog; -- held message 的 Accept 与 Refuse 路径均成功; -- 注入式 metadata/payload 仅作为转义后的可见文本呈现; -- 最终全量 CI 中 `tui-peer-messaging.test.ts` 5/5 再次通过,其中三终端消息环用例耗时 8.451 秒。 - -因此,本机 Windows x64 的“多个终端、多个独立 Agent 进程可发现并通信”已经实际确认,不是只由 mock transport 推断。 - -### 13.7 未执行与交付边界 - -- 未在真实 Windows arm64 设备运行;仅完成 arm64 交叉构建、PE/hash/provenance 校验; -- 未创建第二个 Windows 账户验证异账户拒绝; -- 未在 elevated/non-elevated 或 AppContainer 组合中执行真实 integrity 验收; -- 未使用第二台 Windows 主机执行 remote rejection; -- 当前最终候选尚未 push,因此 macOS/Linux CI 尚未针对该提交运行。 - -这些缺口不影响本机同账户 Windows x64 功能结论,但会限制跨架构与完整威胁模型声明。PR 保持 Draft;本轮只创建已授权的 -本地 conventional commit,不 push、不 merge、不 release。 diff --git a/WINDOWS_PEER_MESSAGING_MANUAL_TEST.md b/WINDOWS_PEER_MESSAGING_MANUAL_TEST.md deleted file mode 100644 index 49cfaf9..0000000 --- a/WINDOWS_PEER_MESSAGING_MANUAL_TEST.md +++ /dev/null @@ -1,305 +0,0 @@ -# Windows Peer Messaging 手工测试指南 - -本文用于在 Windows x64 上验证多个独立 X-Code Agent 进程能否通过 native Named Pipe broker 互相发现和通信。 - -## 1. 前置条件 - -- Windows x64; -- Node.js 22 或更高版本; -- pnpm 10; -- 三个终端使用同一个 Windows 账户; -- 三个终端使用相同权限等级:不要混用普通 PowerShell 和“以管理员身份运行”的 PowerShell; -- 三个终端必须使用相同的 `X_CODE_HOME`; -- 手工发送消息需要已经配置可用的模型/API Key 或 ChatGPT 登录状态。 - -先进入仓库并确认当前提交: - -```powershell -cd D:\res\x-code-cli -git status --short --branch -git log -1 --oneline -node --version -pnpm --version -``` - -## 2. 先运行无凭据自动化验收 - -自动化测试使用确定性 fake provider,不需要真实模型或 API Key,但会真实启动 built CLI、PowerShell ConPTY、独立进程、 -registry、Windows native broker 和 Named Pipe: - -```powershell -cd D:\res\x-code-cli -pnpm test packages/cli/tests/pty/tui-peer-messaging.test.ts -``` - -预期结果: - -```text -Test Files 1 passed -Tests 5 passed -``` - -五个用例分别覆盖: - -1. 两个命名 Agent 互相发现并收发消息; -2. `alpha -> beta -> gamma -> alpha` 三进程消息环; -3. metadata/payload 终端控制字符转义; -4. held message 的 Accept; -5. held message 的 Refuse。 - -如果该命令失败,不要进入手工验收,先根据末尾的故障排查收集日志。 - -## 3. 构建本地 CLI - -```powershell -cd D:\res\x-code-cli -pnpm build -``` - -手工测试应直接运行本仓库的 `packages/cli/dist/cli.js`,避免全局安装的 `xc` 指向旧版本。 - -## 4. 启动三个独立终端 - -最简单的方式是不覆盖 `X_CODE_HOME`,让三个终端共同使用默认的 `%USERPROFILE%\.x-code`。如果平时设置了 -`X_CODE_HOME`,请先在三个终端分别执行以下命令,确认输出完全相同: - -```powershell -$env:X_CODE_HOME -``` - -如需隔离测试,可在三个终端中都设置同一个本机目录: - -```powershell -$env:X_CODE_HOME = "$env:USERPROFILE\.x-code\peer-manual" -``` - -不要使用 `%TEMP%`、UNC 路径、映射网络驱动器、junction 或 symlink。新的隔离目录不会继承已有的 ChatGPT 登录凭据; -这种情况下需要使用环境变量 API Key,或者先在该目录下完成登录。 - -### 终端 1:alpha - -```powershell -cd D:\res\x-code-cli -node .\packages\cli\dist\cli.js --name alpha -``` - -### 终端 2:beta - -```powershell -cd D:\res\x-code-cli -node .\packages\cli\dist\cli.js --name beta -``` - -### 终端 3:gamma - -```powershell -cd D:\res\x-code-cli -node .\packages\cli\dist\cli.js --name gamma -``` - -基础功能测试不要添加 `--trust`。三个 Session 都使用默认权限模式时,默认 `auto` 入站策略应允许它们互相通信。 - -如果要验证“实现 Agent 与 Review Agent 持续交流、无需人工值守”的场景,三个 Session 必须统一使用 -`-t`/`--trust`: - -```powershell -node .\packages\cli\dist\cli.js -t --name alpha -node .\packages\cli\dist\cli.js -t --name beta -node .\packages\cli\dist\cli.js -t --name gamma -``` - -`auto` 入站策略会比较发送方和接收方的权限等级。不要只给其中一部分 Session 添加 `-t`,否则权限等级不同的消息会进入 -held 状态,等待接收方选择 Accept 或 Refuse。全部使用 `-t` 时,Peer 触发的工具调用也会自动执行;只应在这些本机 -Session 都可信时使用。 - -## 5. 验证 Agent 发现 - -在 `alpha` 中输入: - -```text -/list-agents -``` - -预期能看到 `beta` 和 `gamma`,每项包含类似下面的精确地址和状态: - -```text -beta · peer: · idle -gamma · peer: · idle -``` - -也可以分别在 `beta`、`gamma` 中运行 `/list-agents`,确认三者互相可见。 - -## 6. 验证三进程消息环 - -当前没有 `/send-message` slash command。必须用自然语言要求命名后的根 Agent 调用 `sendMessage` 工具;子 Agent 不具备该工具。 - -默认权限模式下,接收方处理 Peer 消息后若要读取文件、修改文件、执行命令或回发消息,会显示一次性本地授权。授权框默认选中 -Deny,上下键可立即切换 Allow/Deny;左右键仅用于可选查看完整 payload 分页。要测试无人值守的连续协作,请按上一节让所有 -Session 都使用 `-t`。 - -### alpha -> beta - -在 `alpha` 中输入: - -```text -请务必调用 sendMessage 工具,向 beta 发送:manual alpha -> beta -``` - -确认发送结果不是错误,并在 `beta` 中看到: - -```text -Peer message · alpha -manual alpha -> beta -``` - -### beta -> gamma - -在 `beta` 中输入: - -```text -请务必调用 sendMessage 工具,向 gamma 发送:manual beta -> gamma -``` - -确认 `gamma` 收到 `manual beta -> gamma`。 - -### gamma -> alpha - -在 `gamma` 中输入: - -```text -请务必调用 sendMessage 工具,向 alpha 发送:manual gamma -> alpha -``` - -确认 `alpha` 收到 `manual gamma -> alpha`。三个方向全部成功后,消息环验收通过。 - -如果名称重复导致 `Name is ambiguous`,从 `/list-agents` 复制目标的 `peer:`,要求 Agent 使用该精确地址发送。 - -## 7. 检查 Windows native broker - -保持三个 Session 运行,在第四个 PowerShell 中执行: - -```powershell -Get-Process xc-peer-broker -``` - -正常情况下应看到三个 `xc-peer-broker` 进程,每个命名根 Session 对应一个 broker。 - -也可以查看三个注册文件是否存在。默认目录: - -```powershell -Get-ChildItem "$env:USERPROFILE\.x-code\runtime\peers" -Filter *.json -``` - -如果设置了 `X_CODE_HOME`: - -```powershell -Get-ChildItem "$env:X_CODE_HOME\runtime\peers" -Filter *.json -``` - -## 8. 可选:验证 Hold、Accept 和 Refuse - -先退出三个 Session,然后备份当前 `config.json`。在三个 Session 共用的 X-Code home 下设置: - -```json -{ - "peerMessaging": { - "inbound": "hold", - "dialogExpiryMs": 60000 - } -} -``` - -配置文件位置: - -- 默认:`%USERPROFILE%\.x-code\config.json`; -- 自定义:`%X_CODE_HOME%\config.json`。 - -重新启动 `alpha` 和 `beta`,从 `alpha` 向 `beta` 发送消息。预期 `beta` 显示本地 Accept/Refuse 选择: - -1. 第一次选择 **Accept**,确认消息进入 `beta` 的 Agent 上下文; -2. 再发送一条消息并选择 **Refuse**,确认发送端得到拒绝结果,消息不会进入接收 Agent 上下文。 - -测试完成后将 `inbound` 恢复为 `auto`,并重新启动命名 Session。 - -## 9. 验证正常退出与清理 - -在三个 Session 中分别输入: - -```text -/exit -``` - -全部退出后,在 PowerShell 中执行: - -```powershell -Get-Process xc-peer-broker -ErrorAction SilentlyContinue -``` - -预期没有输出。 - -再检查注册目录: - -```powershell -$PeerRoot = if ($env:X_CODE_HOME) { $env:X_CODE_HOME } else { "$env:USERPROFILE\.x-code" } -Get-ChildItem "$PeerRoot\runtime\peers" -Filter *.json -ErrorAction SilentlyContinue -``` - -本轮三个 Session 对应的注册文件应已删除;其他仍在线命名 Session 的注册文件可以保留。 - -## 10. 故障排查 - -### 看不到其他 Agent - -确认: - -- 三个进程都使用 `--name`; -- 名称不同; -- `X_CODE_HOME` 完全相同; -- 使用同一 Windows 账户; -- 权限等级相同,没有混用管理员与普通终端; -- 使用交互模式,不能添加 `--print`。 - -### runtime directory 不安全 - -Windows 的 peer runtime 必须位于当前账户可控制、支持 persistent ACL 的本机 NTFS/ReFS volume。不要将 `X_CODE_HOME` -指向仓库、临时目录、网络路径、映射盘或 reparse/junction/symlink。 - -### broker 缺失或 hash mismatch - -确认正在运行本仓库构建结果,然后重新构建: - -```powershell -cd D:\res\x-code-cli -pnpm build -pnpm test packages/core/tests/windows-native-artifacts.test.ts -``` - -### 收集调试日志 - -在启动每个 Session 前设置: - -```powershell -$env:DEBUG_STDOUT = '1' -node .\packages\cli\dist\cli.js --name alpha -``` - -日志位置: - -```powershell -$PeerRoot = if ($env:X_CODE_HOME) { $env:X_CODE_HOME } else { "$env:USERPROFILE\.x-code" } -Get-Content "$PeerRoot\logs\debug.log" -Tail 200 -``` - -## 11. 验收清单 - -- [ ] 聚焦自动化测试 5/5 通过; -- [ ] `alpha`、`beta`、`gamma` 互相可发现; -- [ ] `alpha -> beta` 投递成功; -- [ ] `beta -> gamma` 投递成功; -- [ ] `gamma -> alpha` 投递成功; -- [ ] 三个 Session 运行时存在三个 broker; -- [ ] 可选 Hold/Accept/Refuse 行为符合预期; -- [ ] `/exit` 后没有遗留 broker; -- [ ] 没有未解释的错误、超时或 `PEER_DELIVERY_UNKNOWN`。 - -功能说明还可参考 [`docs/peer-messaging.md`](docs/peer-messaging.md)。

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 z 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 Rm|_L3kQFWH|NcM!_a9+&`$hl& literal 0 HcmV?d00001 diff --git a/packages/core/native/prebuilt/windows/manifest.json b/packages/core/native/prebuilt/windows/manifest.json index 25020f7..7ad6896 100644 --- a/packages/core/native/prebuilt/windows/manifest.json +++ b/packages/core/native/prebuilt/windows/manifest.json @@ -1,14 +1,33 @@ { - "protocolVersion": 2, - "sourceSha256": "5fa5990bade94702bf0d828a27e081d83657dcf770fc37af6674d78c20971c41", + "manifestVersion": 2, "artifacts": { "x64": { - "file": "x64/xc-shell-supervisor.exe", - "sha256": "e4a99d21759551712f4ea7e60bd11b5595a9b2442569f074ebcb671f05fa2cb2" + "shellSupervisor": { + "file": "x64/xc-shell-supervisor.exe", + "protocolVersion": 2, + "sha256": "e4a99d21759551712f4ea7e60bd11b5595a9b2442569f074ebcb671f05fa2cb2", + "sourceSha256": "5fa5990bade94702bf0d828a27e081d83657dcf770fc37af6674d78c20971c41" + }, + "peerBroker": { + "file": "x64/xc-peer-broker.exe", + "protocolVersion": 1, + "sha256": "33177bdde78c76162433dd21fb2a40800f817fa58f41791360558865b333dffd", + "sourceSha256": "4258b29c7b414c43373e802f779ea9d78c86da1086139b1dec95773e0946e78d" + } }, "arm64": { - "file": "arm64/xc-shell-supervisor.exe", - "sha256": "463eb57ccd64ffb438dff3f0a93548e403b6122e05431939f72f91f6427c2e3f" + "shellSupervisor": { + "file": "arm64/xc-shell-supervisor.exe", + "protocolVersion": 2, + "sha256": "463eb57ccd64ffb438dff3f0a93548e403b6122e05431939f72f91f6427c2e3f", + "sourceSha256": "5fa5990bade94702bf0d828a27e081d83657dcf770fc37af6674d78c20971c41" + }, + "peerBroker": { + "file": "arm64/xc-peer-broker.exe", + "protocolVersion": 1, + "sha256": "e1608fa1537845064078568b7bb8840e8c7198ba83380d704416781ec7450c26", + "sourceSha256": "4258b29c7b414c43373e802f779ea9d78c86da1086139b1dec95773e0946e78d" + } } } } diff --git a/packages/core/native/prebuilt/windows/x64/xc-peer-broker.exe b/packages/core/native/prebuilt/windows/x64/xc-peer-broker.exe new file mode 100644 index 0000000000000000000000000000000000000000..9a422df404444a26d7c499cca9dd12c12e05a4c4 GIT binary patch literal 300544 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