From 452e03ada7c66b9c96355bb131311be8960e5e75 Mon Sep 17 00:00:00 2001
From: superche <35420957+superche@users.noreply.github.com>
Date: Tue, 28 Jul 2026 20:22:02 +0800
Subject: [PATCH 1/2] docs: streamline readme and add support code
---
README.md | 594 +++++++------------------------------
assets/buy-me-a-coffee.jpg | Bin 0 -> 110625 bytes
2 files changed, 109 insertions(+), 485 deletions(-)
create mode 100644 assets/buy-me-a-coffee.jpg
diff --git a/README.md b/README.md
index e8e7864..3900adc 100644
--- a/README.md
+++ b/README.md
@@ -1,33 +1,42 @@
# Pippit Bridge
-> Release health note (2026-07-20): the repository candidate is `0.2.16`, while the canonical marketplace remains pinned to the only currently published npm artifact, `0.2.13`. Do not activate `0.2.16` until that exact artifact is published and re-downloaded successfully. See [Codex Plugin development and release engineering](docs/codex-plugin-dev-release-engineering.md).
-
-## 安装方法
+
+ 让 Codex、OpenCode、MCP 与 ChatGPT 安全调用小云雀的图片和视频生成能力。
+
+ 本地优先 · 多账号 BYOK · 参考素材 · 结果预览与落盘
+
-### OpenCode
+
+ 快速安装 ·
+ 选择接入方式 ·
+ 首次使用 ·
+ 文档导航
+
-从公开 npm registry 全局安装 OpenCode custom-tool plugin:
+Pippit Bridge 是小云雀(Pippit)的开源 API gateway 与 adapter monorepo。它把图片和视频生成、参考素材上传、任务查询、结果下载与账号管理封装成 agent 可以安全调用的工具,同时提供 OpenRouter 风格的 facade 和 TypeScript SDK。
-```bash
-opencode plugin @pippit-bridge/opencode-plugin --global
-```
+## 功能亮点
-也可以在全局或项目 `opencode.json` 中配置:
+- **图片与视频生成**:支持文生图、参考图生图、文生视频,以及图片、视频、音频参考素材。
+- **视频工作流**:支持首尾帧、异步任务查询、结果预览与参考视频片段重拍。
+- **安全的多账号 BYOK**:通过一次性 loopback 页面录入和切换 Pippit AK,原始密钥不进入聊天或项目配置。
+- **本地优先**:Codex、stdio MCP 与 OpenCode 默认在受信主机上运行,生成结果持久化到用户目录。
+- **多种接入面**:同一套能力可用于 Codex、OpenCode、通用 MCP、ChatGPT App 和 OpenRouter 风格 API。
-```json
-{
- "$schema": "https://opencode.ai/config.json",
- "plugin": ["@pippit-bridge/opencode-plugin"]
-}
-```
+> [!IMPORTANT]
+> Pippit Bridge 当前聚焦图片与视频生成。音频可作为视频参考素材,但尚未提供通用文本、语音生成或转录工具。
+
+## 快速安装
+
+运行 Codex plugin 或完整 monorepo 需要 Node.js 22.22.2+、24.15.0+ 或 26+,并确保 `npm` / `npx` 可用。
-### Codex
+### Codex(推荐)
-从公开 GitHub marketplace 安装 `pippit-video` plugin,无需克隆本仓库或使用本地路径:
+从公开 GitHub marketplace 安装,无需克隆本仓库:
```bash
codex plugin marketplace add superche/pippit-bridge --ref main --json
@@ -35,127 +44,17 @@ codex plugin add pippit-video@pippit-bridge --json
codex plugin list --json
```
-Codex plugin 运行时需要 Node.js 22.22.2+、24.15.0+ 或 26+,并确保 `npm` / `npx` 可用。安装完成后重启 ChatGPT Desktop 或新建 Codex session。完整接入说明见 [MCP、ChatGPT App 与 Codex plugin](./docs/integrations.md)。
-
-### Codex Plugin 开发与发布
-
-开发环境必须使用独立 Codex profile,并通过稳定 gateway 热切换 backend worker;不要同时启用开发版与正式版:
-
-```bash
-npm run codex:dev:profile:setup
-npm run codex:dev
-npm run codex:dev:app
-npm run codex:dev:profile:status
-npm run codex:dev:status
-npm run codex:dev:full-gate
-```
-
-Run `codex:dev:profile:setup` once before starting the watcher in another terminal. It bootstraps
-the stable gateway, registers only
-`pippit-video@pippit-bridge-dev` in a persistent isolated profile, and preserves that profile's
-login and appearance settings across restarts. On macOS, `codex:dev:app` launches a separate
-ChatGPT/Codex process with `~/.codex-profiles/dev` and
-`~/Library/Application Support/Codex Dev`; it never opens a workspace path as an Electron entry
-point and refuses a profile containing the production Pippit plugin. Override these locations with
-`PIPPIT_CODEX_DEV_PROFILE_HOME` and `PIPPIT_CODEX_DEV_BROWSER_DATA_DIR` when needed. Sign in and
-choose the theme once inside the Dev app; credentials and browser data remain local and are never
-copied into the repository.
-
-The Dev App, stable gateway/worker generations, and detached loopback Facade are three separate
-lifecycle layers. `codex:dev:app` converges all three: it refreshes only the isolated plugin cache,
-authenticates the Facade inside the Dev runtime root, reuses an exact entry/SHA-256 match, and safely
-replaces any authenticated non-exact daemon before launching the App.
-`codex:dev:profile:status` reports App PIDs, cache/gateway hashes, and Facade entry/hash/PID/health
-independently. Cold refresh preserves login/browser data as well as BYOK credentials, runtime
-secrets, jobs, artifacts, outputs, and idempotency state.
-
-正式发布使用受保护的两阶段 workflow:本地/CI gate、npm publish、官方 registry 重下载验证完成后,才允许创建 exact-version marketplace activation PR。Agent 操作约束、hot/cold contract 边界和 rollback 规则见 [AGENTS.md](./AGENTS.md),完整设计与 runbook 见 [Codex Plugin 开发热更新与正式发布工程](./docs/codex-plugin-dev-release-engineering.md)。当前 backend worker HMR 已接通;已挂载 Widget iframe 的原地 HMR 尚未接入,不得对外声明支持。
-
-Pippit Bridge 是小云雀(Pippit)的 API gateway 与 adapter monorepo。当前同时提供:
-
-- OpenRouter 风格的图片/视频生成 facade 与服务器持久化 BYOK。
-- 可发布的 Pippit TypeScript SDK、共享模型目录与安全素材能力。
-- `@pippit-bridge/opencode-plugin`:不注册 LLM provider/auth slot 的 OpenCode 本地视频 custom-tool plugin。
-- `@pippit-bridge/mcp-server`:通用 stdio MCP server,面向支持 MCP 的本地 agent/client。
-- `@pippit-bridge/chatgpt-app`:使用 Streamable HTTP `/mcp` 与 Apps SDK widget 的 ChatGPT App。
-- `pippit-video`:从公开 GitHub marketplace 安装的 Codex plugin;公开快照携带 manifest、skill 与启动 shim,运行时使用 npm 上的同一个 stdio MCP server。
-
-**架构定位:这是面向单个本地用户的 plugin bridge,不是多租户 SaaS。** 主要产品面是 Codex `pippit-video` plugin 与 `@pippit-bridge/opencode-plugin`;通用 MCP、loopback Facade 和本地 ChatGPT developer app 服务于同一用户、同一台受信主机上的接入与调试。项目不以多用户 OAuth、租户隔离、分布式锁、横向扩容或跨机器状态同步为当前目标。
-
-**当前三种封装提供图片与视频生成。** 图片由 Seedream 5.0 / 5.0 Pro 同步返回,视频仍使用异步 job、轮询与本地结果 widget。图片、视频和音频也可作为视频参考素材;这不代表已提供通用文本、语音生成或转录工具。通用 MCP 与 Codex plugin 另外提供 facade 账号管理;ChatGPT App 的 `noauth` developer-mode surface 不暴露这组管理工具。
-
-```text
-pippit-bridge
-├── apps
-│ ├── openrouter-facade
-│ └── chatgpt-app
-├── packages
-│ ├── core
-│ ├── sdk
-│ ├── mcp-server-pippit
-│ └── opencode-plugin-pippit
-├── .agents/plugins/marketplace.json
-└── docs
-```
-
-`core` 是模型版本与安全素材真源;`sdk` 只封装小云雀官方 AK API;OpenCode plugin 复用 MCP package 的一次性 loopback enrollment,并直接使用 core + sdk 完成视频任务。MCP server 只调用 facade,ChatGPT App 再复用 MCP 的工具实现;Codex plugin 的 manifest、skill 和 `.mcp.json` 直接随 `packages/mcp-server-pippit` 分发。后续的 CLI、ComfyUI、n8n 和 OpenMontage adapter 仍可作为新 workspace 增加,不需要复制上游协议实现。
-
-## MCP、ChatGPT App 与 Codex plugin
-
-| 形式 | 运行入口 | 暴露能力 | 适用场景 |
-| --- | --- | --- | --- |
-| 通用 MCP package | `packages/mcp-server-pippit/src/stdio.ts` | 安全新增/列出/切换/删除 AK;列模型、生成、参考视频重新生成、查询;completed 自动本地落盘与受限额外下载 | 支持 stdio MCP 的本地 client |
-| ChatGPT App | `https:///mcp` | 投影 MCP 的图片生成,以及视频列模型、生成、查询和参考视频重新生成;视频结果提供 widget | ChatGPT developer mode;本地或 tunnel 调试 |
-| Codex plugin | `pippit-video@pippit-bridge` | `.mcp.json` 直接启动同一个通用 MCP,skill 只负责安全编排 | Codex CLI 或 ChatGPT Desktop 的 Codex 插件面 |
-
-本地 stdio MCP、Codex plugin 和本地 ChatGPT App 默认不需要预设 facade 环境变量。安装与 `initialize` / `tools/list` 发现阶段不启动服务、也不创建密钥;第一次实际 MCP 工具调用(或本地 ChatGPT App 启动)才幂等创建/复用一个用户级、只监听 loopback 的共享 Facade。内部 runtime、management、BYOK encryption、job signing 与 ChatGPT media signing key 保存在 plugin cache 和项目目录之外,卸载 plugin 默认不会删除账号数据;Codex/stdio 预览通过宿主代理的 MCP 本地资源读取,不依赖临时端口。
-
-部署方也可以显式使用外部 Facade;此时下面两个变量必须成对设置,半套配置会 fail closed,不会与本地自动配置混用:
-
-```bash
-export PIPPIT_FACADE_BASE_URL=http://127.0.0.1:3000
-export PIPPIT_FACADE_API_KEY=''
-```
-
-`PIPPIT_FACADE_API_KEY` 是 wrapper 访问外部 facade 的凭证,不是 Pippit AK。自动本地模式会自行生成与保存内部 Facade/Management key;Pippit AK 仍只能从 `pippit_add_access_key` 返回的短时 loopback password 页面进入加密 store,不应写入环境变量、MCP client 配置、ChatGPT widget、工具结果或 Codex plugin。
-
-外部模式下,stdio MCP / Codex 若要管理 AK,还需设置与 runtime key 严格分离的 `PIPPIT_FACADE_MANAGEMENT_API_KEY`。切换状态按 Facade API Key 指纹持久化在加密 BYOK store 中,因此同一 runtime identity 的 MCP、Codex 与 ChatGPT App 对“新任务使用哪个账号”保持一致。ChatGPT App 当前不投影 AK 管理工具,也不会继承 Management key。
-
-最短启动命令:
-
-```bash
-# 通用 stdio MCP / Codex plugin 内嵌 server
-npm run dev:mcp
-
-# ChatGPT App,默认监听 http://127.0.0.1:8787/mcp
-npm run dev:chatgpt-app
-```
-
-本地 ChatGPT App 未配置公开 origin 时不启用媒体预览。设置 tunnel/部署 origin `CHATGPT_APP_PUBLIC_BASE_URL` 后,本地自动模式会使用独立的用户级 media signing key;显式外部 Facade 模式仍须同时设置 `CHATGPT_APP_MEDIA_SIGNING_KEY_HEX`。
-
-Codex plugin 的 manifest 是声明式配置,宿主没有可安全生成/注入 secret 的 install/postinstall hook;因此这里的“安装自动处理”落在首次实际能力调用,而不是安装期间执行任意代码。ChatGPT developer/production App 仍必须部署为可达 HTTPS endpoint、在 ChatGPT 注册真实 app ID;生产多用户形态还必须增加 OAuth 与远程 secret manager,不能由本地 plugin 安装代替。
+安装完成后重启 ChatGPT Desktop 或新建 Codex session。
-完整的 MCP client 配置、ChatGPT developer-mode 注册、Codex marketplace 安装命令、生产 OAuth 要求和 `.app.json` 真实 ID 边界见 [三种集成形式](./docs/integrations.md)。
-
-`pippit_generate_video` 与 `pippit_edit_video_segment` 的 `idempotency_key` 是可选异常恢复键,不属于 Facade/OpenRouter 协议。图片接口按 OpenRouter dedicated Image API 同步返回,不暴露这一 MCP 恢复字段。完整边界见 [持久化幂等设计](./docs/idempotency.md)。
-
-## OpenCode custom-tool plugin
-
-OpenCode 1.18.3 的 model provider contract 是 AI SDK `LanguageModelV3`。小云雀当前公开的是异步视频任务 API,不是聊天/流式语言模型;本项目不会把视频模型伪装成聊天模型。这个包只注册 custom tools,不返回 `auth`/`provider` hook,也不写入 `config.provider.pippit`,因此不会过滤或覆盖宿主默认 LLM:
-
-- `pippit_manage_access_keys`:返回一次性 localhost password form,并脱敏列出、切换和删除多个本地账号的 AK。
-- `pippit_generate_video`:上传参考素材并提交视频生成;每次付费提交前显式请求权限。
-- `pippit_generate_image`:使用 Seedream 5.0 / 5.0 Pro 生成图片,可带最多 9 张参考图;Codex/stdio 先将完成图片保存到本地 output root,再通过稳定 artifact 地址预览并提供原图下载。
-- `pippit_get_video`:查询任务;写入 worktree 前单独请求下载权限。
-- 共享模型目录:新增 Pippit 模型版本时只增加 catalog entry,两个 adapter 同步可见。
+### OpenCode
-直接安装到 OpenCode 全局配置:
+从公开 npm registry 全局安装:
```bash
opencode plugin @pippit-bridge/opencode-plugin --global
```
-也可以在 OpenCode 配置中加入:
+也可以写入全局或项目级 `opencode.json`:
```json
{
@@ -164,401 +63,126 @@ opencode plugin @pippit-bridge/opencode-plugin --global
}
```
-让 OpenCode 配置一个账号时,调用 `pippit_manage_access_keys` 的 `configure` 操作并传入本地账号名。工具返回短时、单次使用的 `http://127.0.0.1:/enroll/`;用户在浏览器 password form 中粘贴 AK,表单直接写入插件私有 keyring 并设为 active。raw AK 不进入聊天、普通工具参数、OpenCode auth slot、URL query 或日志。
-
-同一个 `pippit_manage_access_keys` 工具还提供:
-
-- `list`:只返回 `account_id`、本地账号名、脱敏 AK 与 active 状态。
-- `switch`:按 `account_id` 或账号名切换新任务使用的 AK。
-- `delete`:删除本地保存;删除 active 且仍有其他账号时必须先显式 switch。工具会展示受影响的历史 run 数量,并提醒“本地删除不等于官网撤销”。
-
-多账号秘密保存在 OpenCode 全局 state 下的 `pippit/access-keys.json`,而不是项目目录或 OpenCode provider auth store。父目录使用 `0700`、文件使用 `0600`,原子替换写入;当前内容是同 UID 可读的明文,不是系统 keychain。plugin 不读取 Cookie、不监听剪贴板、不把 AK 放进普通 tool 参数、项目配置、日志或 telemetry。
-
-`PIPPIT_ACCESS_KEY` 仍用于 CI/短期隔离环境,并覆盖新任务使用的本地 active 账号;管理工具会把这个 override 明确返回。已持久绑定的历史 `run_id + thread_id` 始终优先使用原账号,不会被后来设置的环境变量或 active 切换静默改写;若原账号已删除则 fail closed。完整 loopback 协议、威胁模型与验收标准见 [OpenCode AK 绑定设计](./docs/opencode-ak-binding.md)。
-
-OpenCode 包的安装与 options 见 [packages/opencode-plugin-pippit/README.md](./packages/opencode-plugin-pippit/README.md)。
-
-## OpenRouter facade
-
-facade 底层调用小云雀 Seedream 图片生成与沉浸式短片视频 API,并提供服务器持久化 BYOK(Bring Your Own Key)。
-
-调用方不会把 Pippit AK 直接用作 facade 的 Bearer token。部署管理员先用 Management API Key 将小云雀官方签发的 Pippit AK 写入 `/api/v1/byok`;运行时调用方再使用独立的 Facade API Key 访问模型、生成、轮询和下载接口。
-
-```text
-Management API Key -> /api/v1/byok
- -> /api/v1/byok/active
- -> encrypted Pippit AK store + per-Facade-key active selection
-
-Facade API Key -> POST /api/v1/videos
- -> POST /api/v1/images
- -> POST /api/v1/videos/edits
- -> GET /api/v1/videos/{jobId}
- -> GET /api/v1/videos/{jobId}/content?index=0
-```
-
-对图片、视频和音频参考素材,服务会先下载每个 URL,逐个调用小云雀上传接口取得 `data.pippit_asset_id`,全部成功后再根据目标提交图片或视频任务:
+## 选择接入方式
-```text
-image_url / video_url / audio_url
- -> POST /api/biz/v1/skill/upload_file
- -> data.pippit_asset_id
- -> POST /api/biz/v1/skill/submit_run
- -> thread_id + run_id
- -> POST /api/biz/v1/agent/query_generate_video_result
-```
-
-## 认证边界
-
-| 凭证 | 来源与保存方式 | 允许访问的接口 |
+| 接入方式 | 适合场景 | 入口 |
| --- | --- | --- |
-| Management API Key | 部署方生成;服务配置中只保存 SHA-256 | 仅 `/api/v1/byok` CRUD |
-| Facade API Key | 部署方生成并发给调用方;服务配置中只保存 SHA-256 allowlist | `/api/v1/models`、`/api/v1/images**`、`/api/v1/videos/**` |
-| Pippit AK | 从小云雀官方页面签发;通过 BYOK API 写入并加密落盘 | 仅由服务调用 Pippit 上游,不作为 facade Bearer token |
-| BYOK encryption key | 32 个随机字节;仅部署环境持有 | AES-256-GCM 加密 BYOK store |
-| Job signing key | 另一把独立的 32 字节随机密钥 | 签名并校验异步 `jobId` |
-
-Management API Key 不能调用模型或视频接口,Facade API Key 不能管理 BYOK;若 Management digest 同时出现在 Facade allowlist,服务会拒绝启动。`BYOK_ENCRYPTION_KEY_HEX` 与 `JOB_SIGNING_KEY_HEX` 必须不同。
+| **Codex plugin** | 在 Codex CLI 或 ChatGPT Desktop 中直接生成和预览素材 | `pippit-video@pippit-bridge` |
+| **OpenCode plugin** | 在 OpenCode 中使用图片、视频和账号工具 | `@pippit-bridge/opencode-plugin` |
+| **通用 MCP** | 其他支持 stdio MCP 的本地 agent/client | `@pippit-bridge/mcp-server` |
+| **ChatGPT App** | ChatGPT developer mode 或 HTTPS 部署 | `@pippit-bridge/chatgpt-app` |
+| **OpenRouter facade** | HTTP API、服务器持久化 BYOK 或自定义 adapter | `apps/openrouter-facade` |
-本项目参考 OpenRouter 的 BYOK 管理资源和 Management API Key 认证方式,但有两个明确扩展:
+完整配置和部署边界见 [MCP、ChatGPT App 与 Codex plugin 接入指南](./docs/integrations.md)。
-- BYOK 请求中的 `provider: "pippit"` 是本 facade 扩展;OpenRouter 官方 provider 枚举不应被理解为已经包含 Pippit。
-- 在 BYOK create/update 中写入 `allowed_api_key_hashes` 是本 facade 扩展,用于把一条 Pippit AK 限定给指定 Facade API Key 的 SHA-256;传 `null` 表示不做该项限制。
+## 首次使用
-当前 facade 只解析静态 Facade API Key,没有 per-user identity。`allowed_user_ids` 只有为 `null` 时才能用于当前运行时路由;一旦写成非空列表,任何图片或视频生成请求都不会匹配该 credential。保留这个字段是为了契约兼容和未来扩展,不代表已经支持 user routing。
+1. 在[小云雀官网](https://xyq.jianying.com/)签发并复制 Pippit AK。
+2. Codex/stdio MCP 调用 `pippit_add_access_key`;OpenCode 调用 `pippit_manage_access_keys` 的 `configure` 操作。
+3. 在工具返回的短时本地页面中粘贴 AK。不要把 AK 发送到聊天、普通工具参数、URL query 或项目配置。
+4. 直接用自然语言请求 agent,例如“用这张参考图生成一张 16:9 海报”或“生成一段 10 秒的视频”。
-当前 file store 是单 workspace 实现,workspace 固定为 `00000000-0000-0000-0000-000000000000`。创建 credential 时建议省略 `workspace_id`;传入其他 workspace id 会被拒绝,不会被静默合并。
+主要能力:
-原始 Pippit AK 不会由 list/get/update 响应回显,响应只返回掩码 `label` 和路由元数据。
-
-### Pippit AK 的签发边界
-
-Pippit AK 必须由用户在小云雀官方页面中签发。本 provider 不导入 Pippit Cookie,也不代替官方页面管理 AK;它只接收已经由官方签发的 AK,并通过自己的 Management-Key-protected BYOK API 加密保存。
-
-## 快速开始
-
-完整 monorepo 要求 Node.js 22.22.2+、24.15.0+ 或 26+;单独运行 facade/core/sdk 的最低版本仍为 Node.js 22。
-
-先生成四个彼此独立的高熵值:
-
-```bash
-export MANAGEMENT_API_KEY="$(openssl rand -hex 32)"
-export FACADE_API_KEY="$(openssl rand -hex 32)"
-
-printf '%s' "$MANAGEMENT_API_KEY" | shasum -a 256
-printf '%s' "$FACADE_API_KEY" | shasum -a 256
-
-openssl rand -hex 32 # BYOK_ENCRYPTION_KEY_HEX
-openssl rand -hex 32 # JOB_SIGNING_KEY_HEX,必须与上一行不同
-```
-
-复制配置,并把上面两个摘要和两把 64 位十六进制密钥填入 `.env`:
-
-```bash
-npm install
-cp .env.example .env
-npm run dev
-```
+| 能力 | 工具 |
+| --- | --- |
+| 模型发现 | `pippit_list_image_models`、`pippit_list_video_models` |
+| 图片生成 | `pippit_generate_image` |
+| 视频生成与查询 | `pippit_generate_video`、`pippit_get_video` |
+| 视频片段重拍 | `pippit_edit_video_segment` |
+| 本地视频副本 | `pippit_download_video` |
+| Codex/MCP 账号管理 | `pippit_add_access_key`、`pippit_list_access_keys`、`pippit_switch_access_key`、`pippit_delete_access_key` |
-默认监听 `http://127.0.0.1:3000`。所有必需密钥或摘要缺失时,服务会拒绝启动。
+Codex/MCP 完成的图片和视频默认保存到 macOS `~/Movies/Pippit` 或其他平台 `~/Videos/Pippit`,随后通过结果卡预览。更多工具、文件上传和 ChatGPT App 差异见[接入指南](./docs/integrations.md)。
-### 1. 写入 Pippit BYOK
+## 项目架构
-先从小云雀官方页面创建并复制 AK,再用 Management API Key 写入。以下示例将该 AK 限定给一个 Facade API Key;`FACADE_API_KEY_SHA256` 是该 Facade API Key 的小写 SHA-256:
+这是面向**单个本地用户、单台受信主机**的 plugin bridge,不是多租户 SaaS。多用户 OAuth、租户隔离、横向扩容和跨机器状态同步不属于当前目标。
-```bash
-export PIPPIT_AK='ak-...'
-export FACADE_API_KEY_SHA256=''
-
-curl -X POST http://localhost:3000/api/v1/byok \
- -H "Authorization: Bearer $MANAGEMENT_API_KEY" \
- -H 'Content-Type: application/json' \
- -d "{
- \"provider\": \"pippit\",
- \"key\": \"${PIPPIT_AK}\",
- \"name\": \"production-pippit\",
- \"allowed_models\": [\"pippit/seedance-2.0\"],
- \"allowed_api_key_hashes\": [\"${FACADE_API_KEY_SHA256}\"]
- }"
-```
-
-成功返回 HTTP `201`,其中 `data.id` 是 BYOK credential id;`key` 不会返回:
+```text
+Codex / MCP / ChatGPT
+ -> authenticated OpenRouter-style Facade
+ -> encrypted BYOK store
+ -> Pippit SDK
+ -> Pippit upstream
-```json
-{
- "data": {
- "id": "30a504af-e33b-46a3-a689-b40fae68bd25",
- "provider": "pippit",
- "label": "ak-****bc12",
- "name": "production-pippit",
- "disabled": false,
- "is_fallback": false
- }
-}
+OpenCode
+ -> Core + Pippit SDK
+ -> Pippit upstream
```
-管理接口均只接受 Management API Key,并返回 `Cache-Control: no-store`:
-
```text
-POST /api/v1/byok
-GET /api/v1/byok
-GET /api/v1/byok/{id}
-PATCH /api/v1/byok/{id}
-DELETE /api/v1/byok/{id}
+pippit-bridge
+├── apps
+│ ├── openrouter-facade
+│ └── chatgpt-app
+├── packages
+│ ├── contracts
+│ ├── core
+│ ├── sdk
+│ ├── mcp-server-pippit
+│ └── opencode-plugin-pippit
+├── .agents/plugins/marketplace.json
+└── docs
```
-用 `PATCH` 传入新的 `key` 会创建新的内部 key version。已经生成的 `jobId` 仍绑定旧 version,因此轮询不会因为正常轮换而漂移到新 AK。删除 credential 会同时删除其版本,依赖它的未完成任务将无法再查询;若需要立即吊销,应同时在小云雀官方侧撤销 AK。
-
-### 2. 发现模型
+`contracts` 是公共 schema 真源,`core` 提供模型目录与安全文件原语,`sdk` 封装小云雀上游 API。完整依赖方向、Widget、运行时和发布边界见[架构文档](./docs/architecture.md)。
-模型与生成接口使用 Facade API Key:
+## 本地开发
```bash
-curl http://localhost:3000/api/v1/videos/models \
- -H "Authorization: Bearer $FACADE_API_KEY"
-
-curl http://localhost:3000/api/v1/images/models \
- -H "Authorization: Bearer $FACADE_API_KEY"
+npm ci
+npm run dev # OpenRouter facade
+npm run dev:mcp # stdio MCP
+npm run dev:chatgpt-app # http://127.0.0.1:8787/mcp
```
-### 3. 生成图片
+Facade 默认监听 `http://127.0.0.1:3000`。配置项以 [.env.example](./.env.example) 为准,HTTP 合同以 [OpenAPI golden](./apps/openrouter-facade/contracts/openapi.golden.json) 为准。
-图片只暴露 `pippit/seedream-5.0` 与 `pippit/seedream-5.0-pro`,省略 `model` 时默认使用 Seedream 5.0。`pippit/seedream-5.0` 必须完全省略 `resolution`;`pippit/seedream-5.0-pro` 可省略或使用 `1K`、`2K`、`4K`。`input_references` 最多 9 张,图片完成后以 OpenRouter dedicated Image API 的 `data[].b64_json` 同步返回。
+连接显式外部 Facade 时,下面两个变量必须成对设置:
```bash
-curl -X POST http://localhost:3000/api/v1/images \
- -H "Authorization: Bearer $FACADE_API_KEY" \
- -H 'Content-Type: application/json' \
- -d '{
- "model": "pippit/seedream-5.0-pro",
- "prompt": "未来感运动鞋广告海报,黑色背景,蓝紫霓虹边缘光",
- "resolution": "4K",
- "n": 1
- }'
+export PIPPIT_FACADE_BASE_URL=http://127.0.0.1:3000
+export PIPPIT_FACADE_API_KEY=''
```
-### 4. 提交视频
-
-视频暴露 Seedance 2.5 与既有四个 Seedance 2.0 模型;普通生成省略 `model` 时仍默认使用 VIP 通道的 Seedance 2.0 Mini。原生片段重拍固定使用 Seedance 2.5。
+Codex plugin 开发使用独立 profile:
```bash
-curl -X POST http://localhost:3000/api/v1/videos \
- -H "Authorization: Bearer $FACADE_API_KEY" \
- -H 'Content-Type: application/json' \
- -d '{
- "prompt": "以产品特写开场,镜头缓慢推进,最后出现品牌标语",
- "duration": 10,
- "resolution": "720p",
- "aspect_ratio": "9:16",
- "provider": {
- "options": {
- "pippit": {
- "byok_id": "30a504af-e33b-46a3-a689-b40fae68bd25"
- }
- }
- },
- "input_references": [
- {
- "type": "image_url",
- "image_url": { "url": "https://example.com/product.png" }
- },
- {
- "type": "video_url",
- "video_url": { "url": "https://example.com/motion.mp4" }
- },
- {
- "type": "audio_url",
- "audio_url": { "url": "https://example.com/music.mp3" }
- }
- ]
- }'
-```
-
-`provider.options.pippit.byok_id` 也是 facade 扩展;省略时服务会按 credential 的限制条件和排序自动选择。继续已有 `thread_id` 且存在多个可用 credential 时,必须显式提供 `byok_id`,避免把 Pippit 会话切换到另一条 AK。
-
-成功返回 HTTP `202`:
-
-```json
-{
- "id": "pippit_job_v2....",
- "polling_url": "/api/v1/videos/pippit_job_v2....",
- "status": "pending",
- "generation_id": "marketing_...",
- "model": "pippit/seedance-2.0-mini",
- "usage": { "is_byok": true }
-}
+npm run codex:dev:profile:setup
+npm run codex:dev
+npm run codex:dev:app
+npm run codex:dev:full-gate
```
-用提交任务时的同一个 Facade API Key 查询和下载:
+运行完整检查:
```bash
-curl http://localhost:3000/api/v1/videos/$JOB_ID \
- -H "Authorization: Bearer $FACADE_API_KEY"
-
-curl "http://localhost:3000/api/v1/videos/$JOB_ID/content?index=0" \
- -H "Authorization: Bearer $FACADE_API_KEY" \
- --output result.mp4
-```
-
-`jobId` 是带 HMAC 的无状态句柄,绑定 Facade API Key、workspace、BYOK credential/key version、`thread_id`、`run_id` 和 facade model id。只要相同的 job signing key 和所需 credential version 仍存在,服务重启后即可继续查询。
-
-## BYOK 选择与 fallback
-
-运行时只考虑满足以下条件的 credential:未禁用、`provider`/workspace 匹配、允许当前 model,并且 `allowed_api_key_hashes` 允许当前 Facade API Key。主 credential 按 `sort_order` 优先,`is_fallback: true` 的 credential 排在其后。
-
-服务只在 Pippit 明确返回 HTTP `401`、`403` 或 `429` 时尝试下一条 credential。网络错误、超时或 `submit_run` 结果不确定时不会 fallback,避免同一请求在上游产生重复任务。每次切换 credential,参考图片、视频和音频都会使用该 credential 重新上传并保留返回的 `data.pippit_asset_id` 与可用的 `data.asset_id`,随后才调用 `submit_run`。
-
-## 首尾帧
-
-OpenRouter 的 `frame_images` 会映射为小云雀 `generate_type: 1`。上传顺序固定为首帧、尾帧,不依赖调用方数组顺序。
-
-```json
-{
- "model": "pippit/seedance-2.0-mini",
- "prompt": "从白天平滑过渡到夜景",
- "frame_images": [
- {
- "type": "image_url",
- "image_url": { "url": "https://example.com/first.png" },
- "frame_type": "first_frame"
- },
- {
- "type": "image_url",
- "image_url": { "url": "https://example.com/last.png" },
- "frame_type": "last_frame"
- }
- ]
-}
+npm run check
```
-与 OpenRouter 当前语义一致,同时传 `frame_images` 和 `input_references` 时,`frame_images` 优先,后者不会上传或提交。
-
-## 模型
-
-| Facade model | Pippit model | 通道 | 分辨率 |
-| --- | --- | --- | --- |
-| `pippit/seedance-2.0-mini`(默认) | `Seedance_2.0_mini` | VIP | `480p`, `720p` |
-| `pippit/seedance-2.0` | `seedance2.0_direct` | 非 VIP | `480p`, `720p` |
-| `pippit/seedance-2.0-mini-lite` | `Seedance_2.0_mini_lite` | 非 VIP | `480p`, `720p` |
-| `pippit/seedance-2.0-vision` | `seedance2.0_vision` | VIP | `480p`, `720p`, `1080p` |
-
-公开生成接口只接受表格中的稳定 facade id;原始 Pippit model 字符串仅用于内部上游映射,不作为可调用模型暴露。
+正式发布、hot/cold contract 和回滚流程见 [Codex Plugin 开发与发布工程](./docs/codex-plugin-dev-release-engineering.md)。
-接口同时提供:
+## 文档导航
-- `GET /api/v1/videos/models`:OpenRouter 视频模型能力结构,需要 Facade API Key。
-- `GET /api/v1/models`:带 `architecture.input_modalities/output_modalities` 的通用模型列表,需要 Facade API Key。
-- `GET /openapi.json`:OpenAPI 3.1 描述。
-- `GET /health`:不鉴权的健康检查;加密 BYOK store 不可用时不会返回健康状态。
-
-## 参数映射
-
-| OpenRouter 字段 | Pippit 字段/行为 |
+| 文档 | 内容 |
| --- | --- |
-| `prompt` | 同时写入 `message` 与 `video_part_tool_param.prompt` |
-| `duration` | `duration_sec`;省略时默认 5 秒 |
-| `aspect_ratio` | `ratio` |
-| `resolution` | `resolution` |
-| `size` | 显式拒绝;Pippit 只承诺 `resolution + ratio`,不能保证精确像素尺寸 |
-| `seed` | `video_part_tool_param.seed` |
-| `frame_images` | 先上传并取得 `data.pippit_asset_id`,写入 `images`,设置 `generate_type: 1` |
-| `input_references` | 图片/视频/音频先上传并取得 `data.pippit_asset_id`,再写入 `images` / `videos` / `audios` |
-| `provider.options.pippit.byok_id` | facade 扩展;固定使用指定 BYOK credential |
-| `provider.options.pippit.thread_id` | facade 扩展;复用已有 Pippit 会话 |
-
-小云雀文档没有暴露 `callback_url` 和可控的 `generate_audio`,因此显式传入这两个字段会返回 `unsupported_parameter`,不会静默忽略。
-
-## 参考素材安全
-
-- 只接受 `http:` / `https:` URL;不接受 `data:`、`file:` 或携带 URL credentials 的地址。
-- 默认拒绝 localhost、私网、链路本地和其他非公网目标;每次重定向都会重新校验,生产传输会把已校验 DNS 地址固定到实际 socket,避免 DNS rebinding。
-- 根据文件特征和 MIME/扩展名校验格式:图片支持 JPEG/PNG/GIF/BMP/WebP,视频支持 MP4/MOV,音频支持 MP3/WAV。
-- 默认单文件上限为图片 30 MiB、视频 200 MiB、音频 15 MiB;单请求总计 300 MiB,音频合计 15 MiB。
-- 默认单请求上传并发和全局素材工作并发均为 1;同一请求内相同类型、相同 URL 只上传一次。
-- 任一下载或上传失败会中止当前 credential 的提交;没有成功上传全部参考素材时不会调用该 credential 的 `submit_run`。
-- 生成结果也通过本服务代理;结果 URL 使用同一套公网目标与重定向校验,并支持 `Range` 下载。
-
-如确实需要访问内网素材,可设置 `ALLOW_PRIVATE_REFERENCE_URLS=true`;只应在受信网络和受控调用方场景启用。
+| [集成指南](./docs/integrations.md) | stdio MCP、ChatGPT App、Codex plugin、工具和配置 |
+| [架构设计](./docs/architecture.md) | 模块边界、依赖方向、Widget 与运行时 |
+| [OpenCode plugin](./packages/opencode-plugin-pippit/README.md) | 安装、账号录入和生成流程 |
+| [MCP server](./packages/mcp-server-pippit/README.md) | 本地与外部 Facade 模式 |
+| [ChatGPT App](./apps/chatgpt-app/README.md) | Endpoint、配置和安全边界 |
+| [持久化幂等](./docs/idempotency.md) | 视频任务异常恢复合同 |
+| [AK 安全录入](./docs/opencode-ak-binding.md) | OpenCode 账号存储与安全约束 |
+| [开发与发布工程](./docs/codex-plugin-dev-release-engineering.md) | Dev profile、contract gate、release 与 rollback |
-## File store 部署边界
+## 支持项目
-默认 `BYOK_STORE_PATH=./data/byok-credentials.json` 使用本地 file store。它适用于单进程、单实例的本地 POSIX 部署,不支持多副本或 NFS/共享文件系统,也不是分布式凭证库。
+如果 Pippit Bridge 对你的创作或开发有所帮助,欢迎请我喝杯咖啡。你的支持会用于持续维护适配器、改进生成体验和完善文档。
-- 父目录必须由服务用户拥有且权限为 `0700` 或更严格;store 和 `${BYOK_STORE_PATH}.lock` 使用 `0600`。
-- 进程以排他方式创建 `.lock`。若启动提示锁不可用,应先确认没有其他 provider 进程使用该 store;只有确认是崩溃遗留的 stale lock 后才能人工删除。
-- 每次变更会以临时文件、`fsync`、原子 rename、目录 `fsync` 的方式写入完整 AES-256-GCM envelope。
-- AES-GCM 能校验机密性和完整性,但不能判断一个旧的、仍然有效的完整 store snapshot 是否被回滚。备份/快照的访问控制与版本新鲜度必须由部署系统负责。
-- update/delete 只保证当前逻辑 store 不再使用旧 AK。APFS/文件系统快照、备份、SSD wear leveling 可能仍保留旧 ciphertext;本服务不声称实现物理擦除。需要立即吊销时,以小云雀官方侧撤销 AK 为准。
-
-容器部署必须把 `/app/data` 挂载到持久卷;同一卷同一时间只运行一个 provider 实例。`BYOK_ENCRYPTION_KEY_HEX`、`JOB_SIGNING_KEY_HEX`、Management/Facade 原始 Key 应由 secret manager 注入,不要写入镜像或提交到仓库。
-
-## 配置
-
-见 [.env.example](./.env.example)。常用项:
-
-| 变量 | 默认值 | 说明 |
-| --- | --- | --- |
-| `BYOK_ENCRYPTION_KEY_HEX` | 无 | 必填;32 个随机字节的 64 位小写 hex,用于加密 Pippit AK |
-| `JOB_SIGNING_KEY_HEX` | 无 | 必填;另一把 32 字节随机密钥,用于 job token HMAC |
-| `BYOK_MANAGEMENT_KEY_SHA256` | 无 | 必填;Management API Key 的小写 SHA-256 |
-| `FACADE_API_KEY_SHA256_ALLOWLIST` | 无 | 必填;逗号分隔的 Facade API Key 小写 SHA-256 |
-| `BYOK_STORE_PATH` | `./data/byok-credentials.json` | 加密 file store 路径;相对路径按服务工作目录解析 |
-| `HOST` | `127.0.0.1` | 监听地址;容器端口映射时设置为 `0.0.0.0` |
-| `PIPPIT_BASE_URL` | `https://xyq.jianying.com` | 文档中的小云雀 API origin,可按部署环境覆盖 |
-| `PIPPIT_REQUEST_TIMEOUT_MS` | `43200000` | 上传、提交、查询超时(12 小时) |
-| `IMAGE_GENERATION_POLL_INTERVAL_MS` | `3000` | 同步图片接口查询生成状态的轮询间隔(3 秒) |
-| `IMAGE_GENERATION_TIMEOUT_MS` | `43200000` | 同步图片接口从提交到完成的总等待上限(12 小时) |
-| `CONTENT_STREAM_IDLE_TIMEOUT_MS` | `43200000` | 生成结果流连续无数据的最大等待时间(12 小时) |
-| `REFERENCE_FETCH_TIMEOUT_MS` | `43200000` | 单个参考素材下载超时(12 小时) |
-| `REFERENCE_MAX_IMAGE_BYTES` | `31457280` | 单张图片最大 30 MiB |
-| `REFERENCE_MAX_VIDEO_BYTES` | `209715200` | 单个视频最大 200 MiB |
-| `REFERENCE_MAX_AUDIO_BYTES` | `15728640` | 单个音频与单请求音频合计最大 15 MiB |
-| `REFERENCE_MAX_TOTAL_BYTES` | `314572800` | 单请求参考素材合计最大 300 MiB |
-| `REFERENCE_MAX_REDIRECTS` | `3` | 参考 URL 最大重定向次数 |
-| `REFERENCE_UPLOAD_CONCURRENCY` | `1` | 单请求素材上传并发数 |
-| `REFERENCE_GLOBAL_CONCURRENCY` | `1` | 整个进程同时执行的素材下载+上传工作数 |
-| `ALLOW_PRIVATE_REFERENCE_URLS` | `false` | 是否允许私网参考 URL |
-| `PUBLIC_BASE_URL` | 空 | 设置后返回绝对 `polling_url` / `unsigned_urls` |
-| `PIPPIT_BRIDGE_HOME` | 平台用户数据目录 | 本地自动 runtime 的高级/测试覆盖;不要指向 plugin cache 或项目目录 |
-| `PIPPIT_LOCAL_RUNTIME_AUTO_START` | `true` | 设为 `false` 时禁止本地自动 runtime,要求显式外部 Facade |
-| `PIPPIT_FACADE_BASE_URL` | 本地自动解析 | 外部模式的 facade origin;必须与 API key 成对设置 |
-| `PIPPIT_FACADE_API_KEY` | 本地自动生成 | 外部模式的原始 Facade API Key,不是 digest 或 Pippit AK |
-| `PIPPIT_FACADE_MANAGEMENT_API_KEY` | 本地自动生成 / 外部空 | stdio MCP / Codex 的 AK 管理 key;ChatGPT App 明确丢弃 |
-| `PIPPIT_FACADE_TIMEOUT_MS` | `43200000` | wrapper 调用 facade 的超时(12 小时) |
-| `PIPPIT_MCP_OUTPUT_ROOT` | macOS `~/Movies/Pippit`;其他平台 `~/Videos/Pippit` | stdio MCP / Codex 的 completed 图片、MP4 与额外视频副本 root;可覆盖 |
-| `PIPPIT_MCP_ENROLLMENT_PORT` | `0` | stdio MCP / Codex 的 loopback AK 设置页端口;`0` 表示随机空闲端口 |
-| `PIPPIT_MCP_ENROLLMENT_TTL_MS` | `300000` | stdio MCP / Codex 的单次 AK 设置链接有效期,最大 15 分钟 |
-| `CHATGPT_APP_HOST` / `CHATGPT_APP_PORT` | `127.0.0.1` / `8787` | ChatGPT App Streamable HTTP 监听地址;当前 `noauth` 封装只允许 loopback |
-| `CHATGPT_APP_PUBLIC_BASE_URL` | 空 | 用于签名媒体预览的公开 HTTPS origin;必须与签名 key 同时设置 |
-| `CHATGPT_APP_MEDIA_SIGNING_KEY_HEX` | 空 | 独立 32-byte 签名 key;必须与 public base URL 同时设置 |
-| `CHATGPT_APP_MEDIA_TTL_SECONDS` | `300` | 签名预览 URL 有效期,允许 `30`–`900` 秒 |
-
-Codex/MCP 的 completed 图片和视频会先原子保存为 `PIPPIT_MCP_OUTPUT_ROOT` 下的普通本地文件,再返回 widget。默认目录在 macOS 是 `~/Movies/Pippit`,其他平台是 `~/Videos/Pippit`;不会写入 `/tmp`、仓库或 plugin cache。图片 widget 读取完整本地图片,视频 widget 分块读取本地 MP4,并分别创建沙箱内 `blob:` 预览地址;不会把远程签名地址、`file://` 路径或普通 HTTP loopback 地址交给预览器。stdio 重启后仍可按稳定 artifact identity 重新读取,本地文件继续保留。`pippit_download_video` 只用于创建另一个用户指定文件名或路径的视频副本。
-
-生成、参考素材准备、重新生成、结果查询与落盘链路的内部默认超时统一为 12 小时。Codex plugin 还在 `.mcp.json` 中把 MCP tool timeout 设置为 12 小时;其他 MCP/ChatGPT 宿主若另有更短的外层调用期限,仍需在宿主侧同步配置。生成任务本身保持异步:工具尽快返回 pending job,widget 自动轮询。点击 `Regenerate video` 后,widget 会立即显示 loading,并请求从全屏编辑视图回到 inline 对话视图;宿主不支持该显示模式时会留在当前视图继续展示 loading。
-
-## 验证
-
-```bash
-npm run check
-```
-
-默认测试使用内存 BYOK store 和注入的 Pippit fake,覆盖管理/运行时认证隔离、加密持久化、credential 选择与轮换、素材上传先于生成、图片/视频/音频映射、状态映射、job token 隔离、内容代理、超时、大小限制与私网 URL 拒绝。真实 Pippit AK 的上游验收需要单独执行,可能产生生成费用,不会混入默认测试。
-
-## 协议依据
-
-- [OpenRouter BYOK overview](https://openrouter.ai/docs/guides/overview/auth/byok)
-- [OpenRouter Management API Keys](https://openrouter.ai/docs/guides/overview/auth/management-api-keys)
-- OpenRouter BYOK CRUD:[create](https://openrouter.ai/docs/api/api-reference/byok/create-byok-key)、[list](https://openrouter.ai/docs/api/api-reference/byok/list-byok-keys)、[get](https://openrouter.ai/docs/api/api-reference/byok/get-byok-key)、[update](https://openrouter.ai/docs/api/api-reference/byok/update-byok-key)、[delete](https://openrouter.ai/docs/api/api-reference/byok/delete-byok-key)
-- [OpenRouter Video Generation](https://openrouter.ai/docs/guides/overview/multimodal/video-generation)
-- [OpenRouter Image Generation](https://openrouter.ai/docs/guides/overview/multimodal/image-generation)
-- [OpenRouter Video API Reference](https://openrouter.ai/docs/api/api-reference/video-generation/create-videos)
-- [OpenAI Apps SDK: Build your MCP server](https://developers.openai.com/apps-sdk/build/mcp-server)
-- [OpenAI Apps SDK: Connect from ChatGPT](https://developers.openai.com/apps-sdk/deploy/connect-chatgpt)
-- [OpenAI Apps SDK: Authentication](https://developers.openai.com/apps-sdk/build/auth)
-- [OpenAI: Build plugins](https://developers.openai.com/codex/build-plugins)
-- [小云雀(Pippit)](https://xyq.jianying.com/)
-
-更细的边界和状态映射见 [docs/architecture.md](./docs/architecture.md)。
+
+
+
## License
diff --git a/assets/buy-me-a-coffee.jpg b/assets/buy-me-a-coffee.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..ace7d09e3c3986857bea9fce5774a015d391c680
GIT binary patch
literal 110625
zcmeFZ2V7I#mN$Ip2qMy@Mg;{01Vlik1Vy?6f^;M*AWg)Ev_O#FBOvf70wMw;CDIX)
z&=C-+QbJ9T-V$mc?LGQDbMMUD`DX5&cYgPK-|u@i+2(k1&OUpuv-c|hwf3To(58XI
z20HpW0396w=z)I#4GY=S_Hn%n0N1VorvU(91(@l$0S54h4*Ub?gaD>r#{ghKC;XRV
zdpfBtAK?lx{&79nCeQ#@@F_oA`s17BIRLPL|6`OtdsZQV?)PIldIsRl
zznoW)mw!X|*B0N<|4WOEL2nrTdi;+0k88ljeiddqhCj|Q|LcC!9r|m(>G=Omzv=#^
zH99f+zdS{(>yP&SO}}X)v@swQq}$Iz4}KWv>FF658NkBG#Q3u?F*E%t%zqS?UxoE&
zIq;YA>u!2_M(}fhnTh!?=l|{l+635VHd+I~#R^jF4FlbAfS!wvfs2mTLiZLNHq);T
z{v`LW0`?Q^7z^tGHul2+JskrBJtG4X*kACz?l=)J+pz{SXPOo5sE(sh>G4|$HCea6arIU%d0@qoCZDW31nqdqo%iF4Q!
zgr7tDHKM<7K*9g55&dOAe;E%A0~}e7XSsQhUMv!(^oR-l{}nnzI$2KAJ_gc
z)|%(qXPY(PG+=Po*XcF6>ueQUcIEjCC*W02LnvLDq*W*}T9~SNiUz>sXuz8jPA1I7
zt1P5c=q?69;Jx3A`1F_t1mw{GF6$frpZSSz>0)sb{v`C7kWt0kB}`!^m&Et`#|NJ*
z%J#aJxPAy~lrclT%)N_E%~fn@keyNbfZm`(?C%*<=-xBXdZ{Y^hF}&2h%ZdgV{->ZKZA)6~QPbXqqMAdwn*Zr76l`+Ecpc)sXM~yj%AYceGQ6E~s^R
zUwK#}d{X=LawB~qSslDb7rcij@EG|l-n-Qn@hn5EZw2n<>g4rqY-v$FZYFIRQK5Ce
zSO38gyFF`J)~>js_D&ZDavu1|f0QWuA80_xTl5{{QLP&<9@rW-)(
z`>)@+H0e6{U?udAe6lwU_-GVC1G3i&h{dQ?UFyLh8jzSrn4&gbgiw(+Z#dUA&?*|o
zL7M0w?xst(8^2k|kRUL%Pz65^7Ufj-Kaqa9ML}F2Se10$l2$kMzwV@wC49`WqOw;1
zl}laWYc;Q}DWsZ5KCyn?4nMrIjO!L#ZntNN*Y{LYRr-4J)S3H*@09uXt5T9~jy9|j
zzLj2yUJ;1v`eZzl847iniVYOA^*p4Ue_Pc@c@OT816NBFDE;mwYiR@$J2X*LXspGO
zJI1j4beF}TFFNF^wUH@%6kstFgs6jLS1WP+$ZAhOiBm|5!hGH
ziH}1^QTfIeP-m2ZBKJ7$&w_f4tXEL6;U!J3HG
zOnTsiidB331|C2NafR{J>EkW!2jSQ7{p;-+%J_lZwOcVN}K#M0m(I1=IEQdJ;t)TJ|>FyBLV=-+Pl-SpW;dnMmHr=CvuTO0nq3>3-kL*JY?4F=oLf^Yk4#3vovcQnUnR
zuk-T7LgHxv&yxuU8^UCTFEq5=_h?1`Y;Y5+7A5!_m$)&!S0~(h{*Jzk(a3;X5GQVz
z$_a|E#5_C%TwU{2WH|~~gRX!O)$*tYnGFaM<8tP{Mn5`w>Azg${eRCQHwG8EGCOB9
zM9kn|!aJAWL={P-I!-sLj5J9C{OQVS{b*5OKYxgAQnS5t#JO_naA;GhmD4&4#$^26
zbLNP3q>|wIy=NjOEIT|XqChi3IFJ*HM7yp>)Z{gzxH>*qQF7E&-y1$G^!)gFG|xau
zl)Ma2#bjlv@9zLJf
zs+LRhWZ`B)49*F)%1O|&Cfv_K`D8R-#a|t!0iy}m)XAHMp5AoVJ?^hZyv}!wJ;-hA
z=|_FK8YoYk!hK6E9C3khu03&mJwCcv()HBSW@CTQdDoRqr{LZmFfRS&rKr4iAlOnP
zW7ZI6V8(?&NiMfZgDZVE-5>KH4=puWHD9s3+D&@D&@`|+PqiYCxkns`n`<+ReTVY5
zSt9w0R+DR!4xG|CGc?&Pm)s96@#H5%`^5+4)E<+d%NTH(>fF53bCWRpJp<|PpTCq+
zSxHn*g|CM@ho3`!dy;Y`%Ah6dW7j6E0V)8OPMucTZSx!{!=j?a{Bh@6X#cIDVV|%kx$GdS*}wctZA}WM}|zCSvx75uahKakH$z
zwcw82&%N*ys0H@CsfqHGon4!jN%53Z+uZ#gH#ka4k0{2C2R?VD0YVyL)R9cK?R0^i
zdzAO(FX~e5stzyLb6=F5XpL2DyK3W{`s57O_2fp*6K`bqtwVjGO8azsi{yNeY(H|w
zaEJzrgr_C_N_8kZ$i;zJk|n_bHYz|C9dO)#T1HY?+;C4MzI=n9D-irXFE8lX`S~}J
zVVYw+M?YnA_IR#w=bKxWgj!7|-s_r7|5`WbEHbA7&)I3fa3^AcLlZ(9_MUYjf
zKe;K;lA%P&Qd7sNN_oj@kS_O4e=4tzbBgwHOj)&;jB9JRG`&%9@bCj4)C~Vmo~CFE
z^0ao4r!64%HI{;)AJdFEh`Y^DmZCaUk~mxiKm5#Q-r!<kZ{$nUJ!8gtgJ_p2VfZmZWd*3Ga?*e%(ZX+3A-s3U
zed+{i`O#?W;}aXO=Lw@~!^h35g>HUQxz4*OnRLN~ZtofmVDhi2>V<3Jk<%(sSakp7
zB-W`-t;=VKrE{y9m+|o=`Yu(&$9U%=v6e8|+>%*go*6zz*lki5tU&YK%q>EAxMF(_
zeH|_xxvBb_>46j8p(;riqWZ2T<~v@QA{e*&BJLO;BGLfMUbqK7e1FrvAB&e>hTI`A
zmf1GH_t~`ZIQ^~L>1Kg+>tT|^+4mfR=5+eZXsH=7=C-@sfo-mGs?G!6UpjCeuI?I?MA9}`(Vn+`Ku2~HlYa@+V$x#=h~YBB`C<_!*!==K)FSk1Eqv11BtEm
zj6FGK(c4zxOHB~6aVt&{3V&m9#3?MxzwPKp$uj`do_w^Is_5f@Jz0f=VIDVR9Ihwm
zq^qT-3{mOg=B}BZKSpUOY0cNYf4lZhzfMB=#_3=vBK$nDcxES`=uHr42s}o73~6>Z
zK0;P4^_{IRBdCuKo~X5bd9vm?t0zC!>Y&~tkAl^VNmPaTjes0HLN@}ZG#o}%g3}W!
zv$Khp*1Xu`JeyS%bOV@Hs<+!Px;8Ih0op!am}tQAEOd*x@WXf59)PC6^Qb|CbhN?0hcEpnCd_w6vKet5x&JS`
zr#4Qvd7rt&*Wta}j`Hr~#YD>6Z~AZb#U@R|6(z1V{5IuqcFj)oU3@q?4S`9Tc5XwD
z6f|Bu^xH5-C0b3@fj~cIjz5{?dV)xRMAm6(pu7tg{VtVz5>vs(^>KC5l#L?Q8e(cqd{vAsn2}hT%mKLWY*=M<{RrN(VfIuf=
z>JAIu8CiEIlMN2b-s2>Qw^-OK5wm^Y!PaB04;E^4pC6bLnDiKYW&Sl~*^`$mnalQy
zIM({vT%7=()RM^z_e8;6dh4{Ndw8ed0mQ02JK=({=SN|OMyzCu(o=qWWHDn}5n}A>
zaODKNExDZ?mgPR3?%b$I?850r6v>jcZ~-?NM%zzc%BxGTxg6M<+uj#G+x
zLiXlVFu>PI+-y+3SQVpjWR#P`wxT$uz&IcN%Iou>(7nFJU8zJ}MMHL*3%;?g=j1zK
z4`V+_rw>^>2a)Br{#cbCME+Xn-q1Dnb=Fy}ug30}CtIJS=uoYuU
zRs685VCKOGpI&w#N?oAv?SBpd=^~*l(?1!1;IkH~FPTtO-pSZzPEA9V3Zl&9$7M^mHGS77ko9
zKC9G>d?7FRA!R7@aNV^xKAz@-AQlp8YZ^CQ`@Njxz(@8ZrErf>-s%lVNjM$%=~vOP
zYA|WBOn>e4q-4aP8sq^?devy1LK?tOzz~xmRxUj-DXX+GLJeFe>%a5yY*Bt?pZ~#b
zVfW(oa<0WFhlfnx%Re?Hj30k@TRhQP&&gUek`CzrD+X2$r
z<&V3Sj8tQWdcX4Ogdswoe;OO%+CqIi*;n2b(=vEp_IM%=S}U!SGb|RXqwV5>Fd!qF
z*O{{t?{a^2vzUMCc1rq0w|mvP!TOc*Qp4OKQsBv%Dr8fk%&CncxuPA+kUpr^sCLY1BBK#>n;?Yn*OgkCnfYJq5a0ifwK_&+qYgmI
zEmy|8-@~Xqfft71T*@C3+Wq!Lw}xaNByc-eUzMp1=2yM6_=>y0%$;KU&$iHd89s7^9oV}r_=;vO0vy2C^UR&GsoGv>pV$D)5221~$MB4Tyu4x3BV%^d=T}
zL5U$5?=>ad{Vu!RaercKxch$M^P6`R74IFq;drQ;562rI^@ctgtQD42O*s(P1dYQt
zN>2ZVGrr-Z4gDPy&ck~~%D`oDwl_g2Ms_>WV|T5rX5vT3Cqd@bYUrtB5jFAOzh2jb
z6xOrDMmO7GK#~RFZhDrB;fMA@!zZ2RT9tVaE(NwaiHaPyU-@S`E3HDb!kM*CL&W@j
zNeXcGKC;q>rHi?Fa}z%Ir>+mJhh^k=J{Ea(PoPTK;^`9J^GbEK^GCxCCpN#55L#05bOsensn>0I74I$TVg
z7=O-Xoh<3EoLy{Vcd@|TV)$Z=?HI=B(_UQ^KmUUVfgLh&yQXzrGnP$qqXRm4<&Z)$
zbm&S=2I{?yL>0uXiX>%-l%EuDDOKy0eVxVy`!e>C+uKPRdyvzBKIjn>5ExHP!dk9u
z;-_{(@wv%w>|LuWQ(sx+Zd~&B=a@_vL$Qn<8?eCLY-QvzNa>e<@!{~OlitV&v@sEe
zrvYv5O1tfuD;%o!VaFm&g~YON=jDVYgwGkT3VN)Tc|7!Ojvh
z6M5!S^ilwD9-K!XUnN(qq!TXMqM7w?=eT@Pq8|$GTw?Uk`PjQs-|arHl3aS>%!%r|
zo(fkJvrJpRv?GbTpz66&g%4?j;>+p5iRxRE766x({Wk$F-bj{joFGIrsgfrvmq&
zM3YrQ@<_1ADPe?)a{iIyu?OdQ>H3JZEt0MElJx|I@~V%dC*5+RtKwXj_z~gf?3fsO
z0rjxQ<)C%&Us?#mn>~Vv#(G4VQIU&B9oLK;mrJ&9!WA55`_j>ah=R}=q}_0r2FMsg
zp1_^>=kO}6(tAE(x~5WSPk
zCxh)%VF{qMno4EmAh|6Hr#0_qhAV}MD%)RUfHYYFklpV-ERpExI0XK>+@YkZhWz)>
zCfl!j7#3f)@g|z{o!W1j+P|8Bv%n)yr8a;44B5*j?<-9aC84Vm
z*g6{E2A3oVvJW=8+-I4mduXpxNbQD{BO>%~dV{2nl2zW`JXi3MWoGscx^L~>rV|5Q
zyhg<~(KzqqW5~>OK3ew#)j7$sF;u}NG0T@#uX)HI_PL`Q
z5>MTx0XDIjCfbNRo>q};?)RSWyB~Ykv*L|F4fdF*P}2-_a|k0zb#q^E3AngqyZh2@
z?*I54JiZB!w$rB=G=q(NA20)leOhCS$2mv`KT`}Ax!lLCt`25DH+)pkPY>skU#D(@x(h%SG<8Z;lsnkF5VmP(A|iSqFj7H
z1Ds_LLT`*tp8lha;YDyM@|wAxMT)f
zRCSonWONoZ(j`WQ_0~g(iOb%`at5{HAm6?7ISK4Q@Z-RVN%1jCDn7I2mWq~o
zRwd;1EED3*RN5JZ>Y3&1!{2b!*DnXC%xtd%>@sIN{dnt+G@{}Q(ToUoF%j^7B~YAP
zsk^MRPM`al(|=W`Qznq!LTQ}}&fs8%K+LQ9;o)uQ!G$Hi^}1J2A))eo7&5eQV
zb_W-8Q?WqhKl@?nN_#@m_)zhydHzoD=C#9#1xUbomyq|VDaCQAA_P3`%ZD;qyzjgvHv
zd>k2JNH2Ij!=N_L*E{YL(YT5&xOtj&^=p&^X-J`X{lcB5lLic#3NNcpY0MvCXp=(a
zp=_6`8i$t9JQ1YS`dEuqm+IGTR7S
z(=o1eD+1*toGYM+l6##Iv=eWqD9oN@>-wxm1=>%`e`fg%pVju~t21iv{-m#Kkui~+
z5+QN^Zs@%vXU`cDMcj1QbW2aHLcvK-bYVAOVnQg
zwo#>O$4IPXKY~3{tVF#cKDbQkNrY+o%u<0|#O+)loe
z$MRfn!5vKl!j=iO)M$Z7G~NR=L)uTXsTD_qK6HDuFnS@&Ck7Pn!wB*tQjAX#UyBzrM0RDf!1F{c}$Kxp4kuLI0X_{>dl*m1z5uPyWd#|5Pyk&rsE>
zIXpoH)iA%ih=??){_Z85UhmO8-lNuk&m^Ws|A0f7Nw#DVupq^7`m-6<`KO93sHFb{
zO}FUbBm43G8PQM+JoDn5-Z=fkrr45sV0!qMiY)D;rHe;27_&6KYx{u7iM^QI^=wmL
z9e2R0WbMY`kX|X#4~tDJFI6GQR5?m$pt_HlZjx0nrrqA^Ms0KMw+$oSM-N3xTI@(C
zasCW2;SS-JRo)NRd!Kjeu!_GIA42D2$fqf_b;q)aW-}9C_to6lmWSls%#I(F%FsPmw=XyB
zoJ40BNbB8jNfpk_M^~(``eWs|eGJyIo=s!uRfYW3Yg#7S(riud6vDY11kPw4Z15O+
zen4`TT>3WprGC}ZbA`Ouwe^~QdIbLeUeRU))Hlf5uLIj?Cd+7dAua&`Pw;F~2I
z{;;Uq2U{;mnI!T>j#UBAb-VYRv~M^L)bLnBv(N(6?@&58B)g-)c!pi{da}Nuhq7Z`
zhR#aX9f?yK#WxQ9u*9~vA*22B+F+42c}OL_`mb_=rjz5MP3%75BQrgZSY-T5BpJ@5
zq~Ct<66THzj+QFygwpzdH_wZ1dS4kND-|t?i40*$%Go(~hOUqKXAx&yMB0z9UA}>R
zCTMzTMX&I~wsCyshHd>Z#7JuaV$rU=VWURs?ekxN`%lpQEa@!ylDTOtl>#UwEsv
zldfxC9o>(S?aXi-sE$_}{~^_N_-qT^_%mzsrA&Gn@S_S2#%7nq=+l7y>VnS2AP~_D
zq7D51R!}#7#wVPp#R*ViZK|lrUG|pt`Gf(gp?8ZM=}3hqMLH$(r^Y4qj!v7`wg-phyJAXKaJMIf71G&M(f|fa^O$d_}`KD{~*8q-IDl|*8eTt>K~-_ADZ|-
zabDkqgpwgRw3vG(RRC{<^hUW0T>7f~)TD0ni@52U#W|+@aM5z}-)sq+#lTmoz}~
z<#gu$?sxRolse$!Nj~ejdWi;H$prT@o&tBR;Xu4A{2JvwbRmfdMzk@hK*`#OJLgPT
z2op5mU>eB;(I-jJrLx^e5Tl{kB!nC1z62G#r}0`3xVaTJ630tN_C_?Hqz*#1^vPfx
zT5wt>^*EB~IE4wJMnR*Ycr!5Aw#9NsTpK`$PT@Py6)Y5P1TSJbcOKlHmQ58@*?9x{
zhKzAYGVeI(8{(rx_Gv=ez5nd!pA`Lbj{dor{*Po&E#5I|AQPrrt`ZXKW0UJk?*nx{xd
z$}=g_(RIb2&8A`Gl=TSoj)E(6-;&SwrbZBm;T?tkzkp1@{6G<*2>r3C#zO<__p7LB
z^Qhp0br|uaGdaUK7_mGBhFT54x9BLweZNOU{fvtG$EqC-h*2}lC8{)G&@mO^qYiH|
z#=aN6Kx(VB#2wV}=TQyD2M~=eaF6$7%kl~WOUOB*8kfJ{N4{u%jWMP=WVwN(r2E-m
z!BiKP=TZ#&!f&&qt>&X7!>V+ThnuQ~3o^g^34JbWGVzfqWCu{PwGx*bX@KB1@*q*N
zaX(-<>!5XX2yJ*$mN80FUwUk|TEG$Vxm74GW7N-EnG}^q7?b5B8gB;OQ|l2%
z4A+Cfj=4nX>3>P8@H4T(f4^=UKSO}np%@JqX?;fn7VXSuz5YWGYzvJ3I|Xi+`KMb|
z|KoE_r@y7RMDauImZ_%Xf)u@h)Y~AoIkFQflg&rhmT=^B?5VZ1)x)B`i5lSEtG4Fum4B=ZON
z!*-O?BN;f$vgnzo_{IDBm%@J>3i*htbom)}$?#1>!KDi)7n-5e`)X5oB)TX@QoW=qeh(oo4<0oO^)%!leCTO0L{-
z{hL+#v$dyunqMa}gW;rG^Ue06{c7UaRmG-yNELt0-2@N5oN~jyV_}z%Qvo)jB({nS
zM)~g860-i6+yLYHcBx1mYrr(S@(tsx3O}Z_QdwqS1Mum
z==_V^b|$~6Ju)2E6NeO-u9nwqrBZYMaghTg>Gyv;beZns88^K
z)k~S|XzLl5EPaK0vfuTZUSKR;=23psPHFnxrVReUit`npb#=>X25+^eK9;TXJnN7<
zDrk7nUkI3~KVa{JG9ju?$E=GMpdyRUxw8y121RM~_nu1fQ48;x-0k)YJHv4T02Kj%
z*OHGQjN=T~;PVl%CC1FCCb_;{;P3JBI%@irOZ9ZTp+W=0Cndb(3I#L-b&0|R5-u#S
zsa96f48N0ApsJmB%}?B=*pcD5;%wse-x$ipIIqqHL9hOlF4B8Flw9<5(v%4KHess8
zUXEz~Fn5CJ-YOJYg)J_IN8Q8BeoYk5GPRTDDKCDc0P738>sB)qmt`CC`4M%>C@B4{
z;Y(BAp4|DPcZ1ZLcM!yD?s&!Np3r(8%s6`qwu`qa(d*`0>nJ(tXCsOw$3I7BRaIBj
zhMnqAQKiD+3W+QyrSY8IM)t(Mx#!(@
zq1F3Ihf_2w#`U$X5dGJ$nkFo!`qN+{A$h7hq{yO=#KwDt*pVVpT1^|Jmtlg3!l|;f%Kq?pyApiETtX0UFFJPkQ{C
zLcl3pIRt4@#wfk8d588}m7TE-?21d_zlYL1&gMhx6TBVC93zK`n9e}qU(K6dRNH-|
z_1N9J?5kC=?9?NHtHC!mgjvpC;KN6(Xwd-1_8~Bn7BU8guO$29YHzx28dqgZHVw5&
zUg0=D(*I@Sag!qxLw<*v3CjxKPiHkG+~sW$6qy-^sLWf{%Y=}PQI}>u8ylqQ4xO2<
zC<`|et*EouES0d=9lu2%smh6uLReqDKEm^4!O;}8=4}b$T#QdC
zSx51@t+Ec&-jVlX{k-E6?hfo$eR&mEeL<5`>zrf!#bjPOiX3Rx(9NLBS(;R#@nB>X
z*%JS1XJte(as@MS2AKHK$?7wX5~O?K=*_psLHY@-Nd_JzA0;kl!A*$CxVW?HSMfzX
znAJA}Ct)7R8Q!1#U#_`kHms$&&Y?($4bAK=gZjJmlO^qrW_au
zwz#@IkAK7Y0Wlp5%xD!bJ$)%@ntN!$xd?!3CKi)30}`YLO=xAlS*+%R3#Y(GO%6
zkRcs&trx#S%q%FkeIgjx$o9!BrS{s2=KWB{`?}SrDNsOc)>7G`^2k>Q(T<<*Phnqs
zn;FP?2w#u?qG*KiahSU$`Spf!|1{#z<2Ls#o##Q97#+n}&(V>;fD{qig2nJpmEWYS
zCRc2uLz4_Y-86rv&prB1A|TypnzsX;_dpSY&fPC^cXoCRSCta4(z$T_9P0sf{ORsr
zf-mqm6$8Z^dWyk)iBs>%wnQh~HRVpu!;!CchOeK^);{MV?i`n`d$5pK2mVc`x>xqBn6=i*pWxVfZeH4j<^U4n+$g5VdVs
z$U}_uMu7}6b5efZMdTn)?C=1z%yN})8ifhL2B2Cw8MV~Y%ggjV)Qfsy7bkJzo8lf4
zT)|*ulM>n5C#FSAnwU0YICXgWad)9lM2qEJeUaJO4BXRcx(m3
z6(tSfd`-GZ;}k|s>qGa+y!Xd9j-^a;?iV{*(9zmJQITa9NnZ(7
z6#qr&zGrYf8|pKN8~=Od^u|918~n#G1KodQ(=LD40Fy#=+$Z|e00(~1tj>98nLMxn
z`fyAcX#afo;r|HRckDtf$m{>;$+y)#X|U@0T(tRpqq+-&O?3DqZgTCIdSU)K=WKCi
zGvve8YasMNm|v|R-9W7*pAC!5F>5wewr`
zG`!{fj;9+yO+|o+T&y2wdrzo_5U~I|2a~j^uzYp&lDr+N>)f@4>y41BV%sap~o@!9BCOgDtNrpX-y#+TPf;Kqoat{PVX_3vNMd!Ana+Z5Z3J(ZtC~
zCOL^j`77Gj6Th|tz{Mo9;dx^+pU!40Kdb~5^#k8h+9bBtraBZAomo;>{hS*bnw}N$
zP!sZ)2*Ys(k?#+)Pxo*wVwP=0uFBlUeNx!j3%xf&c1NLRcy{=R9q-A!lsq*)+>!e~
zss_BI7s@BJ`93CMCgmg7MOiIwHTOnSzfoTRmI}BYCLgW#SB5V3N`3dXCoX((@bsrQ
z7Q^J6H{#N$fH%PyYI_u8>{v6GVB?M4ut4
z;maG&Jh&_t!bTL=Lu%rmCb+(J{g`Nq`NkW3)Yz;75LEAeV!kIpVn#ITSM*>IxD)eD
zsK|Y$l(>S=g{gi4ts#2iziEX?7$x!_3r=qc|H052So2r^oLyct+ur*$*Shy5AvX`A6e_O`vWXepp*c})L_LYyg3-;kW
zrH1TEQkz&nu+?)+X*uEI48;B4-z=5saldCYl5PIrhFU0p2Me3}rY7V)=pobKCtoC1
zWFa}=hWORgsB;a}JB|K_lR*Wd?%hV-IF}L8AK#3fZwg@bamJz|3dt98*3R52jl5Dg
zPfQaj*_C)jZUW_nHFcN<2%ueA>zuLB81LyBfmr{c{+~9jkYa)y_KcnnBWsZ}6RG
zDR$q+{W8iAmwrfb2x8XX;Uhl`oP?FHMwtUcsWQY&{~24Dz>>|~i2RAqa<=(ex8Yb^yt0*
z`OZWZKVVOldO(FFq!R13fN(`dT4WMV^qq9-Ey^)EgA!kU+;bxoU-yUxtPOAZ+6{-)
z9m7rmKDLH<7`T7dsIT1pNo7S<>}`i=g&_5wM}A2i#lgPV%BZ|g33uZB%ASAFct_CW
z?z39NiPGzjAD@3E?c!LS-tzED&IA%T9h(>!jE>73d%P1v
zkX%(K&;YCN;u*GaELUrijCu>(kIDA!Fq?}AybQk(VqLMoH5nmO#Ep=DSrP@&SlljKO
zYK?(fiS2HL4)i08%!6!1Fp(8*6NG2Pl08sF()Bn=y)zCxwu=VMkJ=)eneRc;znlkm
zhf{7xpU1}C3A^GF!uCNP5Dfyo+B!bsGZCO@QuPUv3s=)FBwFl`mhN~nYsXG+NL0S&
zJG$FByageFE(XIV#u)CoF)X6>dsT0pUssHKXv@=AS)%43@K}&0vhq!s7$Cilh?^?Q
zYm&ooHVp>~5L2-vchLMg#$_+#R+Z8dFLo+u{GHfn>9(
zc*mc#oq(9dNI6$c{r1CDq4J9OAr>8xhtUA_1Nt6vw91I`p33TmJ~W%Uf+=TNt-0}I
zTGyW~{TYba!;?K7GQN}VyJ0M2G=zLQXY>bgnc4(_2s!18uiKSAch~;l8t1#k3cW17
zzefS@a2Z9r!bazH2^JM{X}Fum;?oLV)78%%R_+3SR5vLIcno6z#i9+=;VwZrS#nhs
zztQtFFXu|a@=l+eqV37c6G0d29N4G@A($YIL6CI?P>1;;6`Wv1b46E$hARH6t7l=;
zgQ7F%;}>r6dYxI)_rS
zpm!;E2aF=V5(GkFmKbd1@whySsPihz&9=lKS_+h8HXZx
z)Ko#trt~)@5BeSHNHhlXV4=BhFj>5JcvtEN>Y(o%hdm}kDEVssSeRr-
zSv5M~a?kAPA`gGk>{!Mde(82WW^|SuQ6i(Da0yoO4SA@by7_kglDv(gcaUK%!-%Rp
zFWtT~>^TB&-NTuiO;TPE+8xcXJ{RXFV(@8%Gkhzc~Bw+y?!QZ_@Z
z7ld$35cBNxj#t+m{+dFtl^B1Ua;x<<>O2EO>??{4>I-VjlX?IdK)MDugT-ht6U-~0
zy`OC4_)Ph{Vk}{FOW48+qoL)|a5PrL`5fIoCrJ(NgGa8Oz!w-0QPb6PRV9O06ZAbF
z04b9`w)Yb1&!1Okoet*k_kz!mPEmV=U@K@mOrL0+J5^aAo8A4`>uE>Xw@=j`-^_iR
z;^~9+8&KKrfp@1_n-3!Wh{jYl2uaU9v&?d3*Bb|A{+2Q+HGIZl;K`y0v%FQ9*Ns8Ae&)eWwa5wB`xIyqE|0g$sC+#k|0UsEzQna4OQr{!
z(;)*n0K#AkM0X!g$`FjArjZBT>g5S1nlP?@O667FXG!r15a8Y{(;Ie#;B#i{w(ysb(F~4B&!U$$MB+D5J_$fWshO+@1nV~R6dh%(O=63#es=ZC1>@zF(>
z2j2GMiJEj;YxB=D~;-$lcsR~b1Et_HJu-_O9A4QBX=cF?1XaZ}pT;h|WoTHzxN$EcDvEr&rNYKx%xV0KVvGo#og
zhynQvr5ZY&UJp>-kQMxKQ{np_s0fYY*5Zb|m4rfhH&vahDr_ObX++1iOUntG5VOFq
z&V>|}tQSbo
z_bT@vL>17HKO!3cMhE;ElyE8&3`&SYFHeCRItJi;c=O-gB|lvz{~Psh9a;Z@Fa62>
zPxK<_kL_RoS15(P$QICirU7jA?28ZFp?qrB9k6MJm8Tf&4GwoMcW|L(TD%+1gE&;W
z_CqKqRf5QlLq#|coSWnP23l;?3csAWH_M&7y_6?XaAIr}h!u%qj9k?pm2K0CWRew4Rl*_oRbJRI25%e2_~LGLNSI1FIf=hNI^2R5
z1|j9wpgc5g?};>pUn69s2e=nbtf+)HEq{q$dDGx(=?-tX#c#*WGNUQBO*#j+uO<@k
z(jfZ9?xItzm&%N5I?)>h9iYs(U}wyynQZ6Vj%c^!bq9orHc#!AE!phf$RIQ4d^
zYVt6V^X+*1WAArg_A7G_hs$>y_kEz#UdAWW;>V>a1jB1l?6!4md*W$Agb4QC*l-DI+yJ0zL8r6Or6=ZB8VQeV*Ez?^d<0sJPkc+3
zf+bFLd`*e<6^zYH{jRX!zLH5i4yMr-XrDpyz}ae&i{UEjv9CVYDC<>xir1S7$SeJV
z`a;Eb2d=|yh^qLRnbeSCHP9=l9b?eUPWn@eZ7*J8LXC9%ZO}0jqNj
zaX~{I6xZEw+X1TdM4U>~D{H({`f`)ZxE_ek#O
zb(axV)jSSEr!M
z_2HLDqU7r(RdFX0)uqM(VgpGn>Xf*8gQ@Q4fG~S$lAeo+PwF&F%e6zZVtQ*^qL&QX
zcRLO%0v9(y!O)u8bkjne9hVtWk?-yMRH!v{wQSuZ9(!bFiXL67mt&37Pg?tu6&}Fa
zjbIRR8m|;e&)JeKHFV8R&|mq|5CUf2i<_R%belZfyM6uiH#r%P+)V*t*w-lA2kl2L
zbOTS4aj(Dxb>eu=rb&4i;Df|5$K?4$z1F#xTNii2@_yv>YiWqi(cubeGWi+Vp8~Qr
zw^}5Ir*-JM50BOGi6N!5PpcKIvXi#{zvaD5Ke5>`!aO86t~0qsM+qp9mU228e3o@V
zTNcbpcd%UDp&5EeO%6MCxMwHb?COBbYVkYCr;Bf+%)j|>aH=m?zu}x`pt742pd?$I
zb1;<$WB6Mg)Zt{-qoAz}LS?S*`#2EvrY}~dvi9J+sN67Q&2CG~`;JO{cuEHk*9Ikb
zudZT#PzMDQq)rAZqY3M)o&-tjdf6C{Yb&=cmY$Ek4`ZRKX11ZdLB@leI+)g&S;k8}
zR~y>uJ#*8@{f*TlkD{R9$s=6jbw9&wkFJ&e_Dm?fIM8UNrDfjjK)%Nsx}Z^3!Dd&=YF1IGG;pqX-*_L+e8
zRSv>#YbLMlqfs{j4fD`@EqhNbrgd2b7n5(c_$9%5Rmj|`I{{!?A1C~AMD(lGmm&59
za>hNUHqmn<2dscK#<&{e2Nvi|<5An`r}?BSa4$T%iNpkTuCL~S88BZ_Hi2(~aqB^G
z+2hgFktcD|#=TDp)Or3Fb?+I}Rju8UVTY{oA
z=~a*_AV?MIMM5tkML|lC7J5&pk%avBi-fd}9
z;niwhcZb!*ONi6(0XlKzR@KK^_)WY}&-W(lkxmMcvNf^v=09uvRNQZdj%!j#;6TQ{
zMOI=!F`luT^~9^u+t;9#3GdTB9|S`ZzBp6YjE@hJZjdy^MIV
zg_ZuZq!m8ilIS*Ig|=JmgsxzeiNHf
z-n}Yu<7tN~`wM0A@;JgcRT{F3Nl65l=bjKB<65G59s}_TJA$erAkDNg9!<+vVcyU$
zK>h|lvbzwkfjNljp4i)4u9C%^cpPfI!-<>eaEI&P3!$4{f)JVVR}$iv!O`|Yc(Iz_
z1HjIM=9PwDsZ>&j^V(cTdXnl`ia^0Edo4
z`lHt5O;zC7IG#QSid+?9JntU<&oYWOR6Rm(GW0$sOihHfv9aOMxsjmzS}SHU!{c>a
zTzLz6DHLEZy@DZzQB*3oY(kB&9qA$7OhYdUg3mlY+W18&h}Z3^f*JX$}{MKoD7q8~Gn#gn9KY&_D+pwU@clrpI}MP9b6r
z+IokbdHzA-4Uq5f>dFGD1UUnYudod)4UmUy%vuph@T
z?Na(*&Q1(FbNh8nctfhT9~$2FO8Dd@@Ei2C!1ox5XwmljB^4e7joo2dR!DbSv}jnQ
z9>~AmB9$nH-@!(#I9JVYbmz0q1ZIiSzJ2L_+cnDH|3E#`(7TKO@>hrdK;(jCF#hMB
zIBW+f1i*3n4}jeN=N1-Nb^iZ;jqyM0eC_`eyE*>>Ks8GO|1a(Pf1~2&|8RS1fuSO@
z44k^*=W$WiSc3!=_RRo$p$Xp*-M6|Gx&{ln6e-%=k8X}y*?MV@-j#wj9UD@u0o4(?
zMAcXG5=Ep^S4v@L1iUi$m$Ep5zO$48qqGqzZ=4RQgC?GYB@JhIDLMTzK(
z&EI2mUV<~=Gfl7ukyX;~Z7M7)Jp~$d*3$F8r)S@5o4GqTv;qvhH>Zz+fba3~MU+ep
zZD57TMKOteMtL#HFH>r#5gXSKKarok#K&>yq*O~{Rl>p&E|QT;6^mC%Y_@ZOiYv#N
zDpJ@w*4t(42-{PeMpb}&BjG87Dnz`
z?Yo1U^8)}iHX;c)M?n`cKv6EvlfB3iE5b6y@0H-7;cs1TQ-s@X5fZ<9%r@WlN#){3
z`o>=5{e&!4plUNpO0`0KFgEiF=6WM=m0T|;^&F2|ENS_LGJiQN21KTRK+9Ua9%?(l
zWOCWhWJyndEl=x<@6qv;|Hi6n)N9u-Daw?gWWZle;d)V4*y>g#gJk&K&0Utd=ObuQ
z$8vYo^=G(B$3+oj=?gDS?f5|`gdo2az?oO8Q188ser>N;@BfB{#;;F!w6aFxX;6
zu4^m;#g2NOA6HYfMXyp@xqbBhtBq;Pt&|11=R-<|{yT5%i7V~ZL}$-4D8tFLirF=
z$i}E1@GRq_AN!$jSWv~YU|i;|zpScKzqWUWmg|%9g3mld%H_~mo6{e74T9B{TpgZg
zeL^PpE&y@6Tg!`Zuq`bkJcGBh1vp#l7TcA_aZ
zV0Wj~0E;<1(y#maiXd1O0K;NtD#Y!Acv*x`#-7#X*N
zs|(BVn##8g?zU#@6uvqbF=A3%edBNZhn#~P9S-?mO$74$UR9IEKH*@eL74;RVu@%a
zttBdg!#&0Y<%lG4lLT#}7)jDl&17(CnWfcsBb$PK;nlpUL!n5^8E5v-+~xSHk9eS$Hv%ajNP
z){VAb@w&x$738(~%}AL^PnDmIKZ;ZMe7GMJu{zV;)4v>8Go=7*a+f|q8LNr(gr|Y!
zBn^l&?x8=rk}f31foYKH=fkHDz?0C<#kdY8`~|k>A^y`+CUSS)MQp(|e}^xNVfIEU
zx2NWy{L%@_d|>0q378gU9r~Q9y0Y4VF8C7e-YcX6(f;oP8v5A7V0j|}aecv-E%o8o
zx5f=|IeU?N{yO#kybhPbMi7gw0%bq6$@yOu^SuPS3a)aE?jnn5k6`up8J?agTZIRtqCsYpS+HXxUE>#VEAGO(fA>@($MfyLBKnXE^ieW!}WD)@{lf!
zb3#i8dydZKI#{$#MVPwAjOQ-=1CxG?pxR)YReDl#TtwH>^si&kkaGfcp8Goi?^oY@
zmng{vQa34)9E(jBdsqAjT8JOKe7NUQY~%G!9#Y!sKc4Ts3!gbjKD&QDeGHT#N|lQb
zrFa&CqMchSeOE*;LJ>gFdAJy_Q~LPa-r%S9kJ#=;y@Q6MXk=;2Z4;I6&wQsi$pXg3d^~^C?kFA|F{K6Kn+C0>>6Aa0zYO0C
zMEAd6zQQ$s&1(FIVBRaL79-TJAIeUqRp|+S!3k-S+
zAn0Q~hu>*7!2e@F^o6+WU=G~AJghc<3IKXZS2zj;Bb=AvXdAs2y+^a={8d}H7-KJa
zMkR8(nhQ)8RW&7IhzP}tV8>Qauf>&^aOw}EtR`Hjp88#KKBcd#P$Mkcg
zn8L<)2SxgC!7Ukw4zOp>fy<)dYifnxRo45259S-V?094CZEpX%lEvgB}IKboA?i%1}
zHf_+L4lmv3#;DDv80{TK{5GTl8VT%U_)LH;zG}rzVr9Bl_i`gvE2^3m(tTF9QkKJIv)6-T9aUOB_Om`$LT$pM-h=h0$dxO%r*4Zasd5`>7LgfU2Z4?+)!!yx
z9h*};&8xdeQ=zjZY5)jQr2YM48gHJp
zlC@^@lq=B@!nsvFcj(j^?lD^91C|(x%;2S_?nP!T3@S#U5_MHv%*O9)ZtoS!*w0GR
z$*=m=l-c)ArO6Hth)ktR`MrBW{q_R*;ffhscl&E!CscZ#AAO30em|^;jJKgoxm&ui
zl^Pxl6c)2RF|p@jAHLMS5!+ibOdjBT{m_h^wj4Oo;b#9)c=m5BF8S|wZ~8x+D*(6v
zWHAP=Hvr(r#M4}CDUly~&9_kcbbHZZ@j4nYo`S&Mbsd
ze)Fy7_U1R-+8O<8XVmHp3_m6l?&*u{#!`X+RS8l6)fBKtPf)iZ{US+C?6;d#xG@F#
z7`gcl>%y`;K18DL(&^joQA@h8qDnUq3T^Dd=sOg3_7hi@T;fIRDctI2<(od5&i+kh@+)xXenfWa>NX1jJ6?}+%1-Tr`fhAwgOT^Z68hy*w
zOsHwtcygpG5NEF=@B}3KU1tfTKzkAkD*EJ}?OEq2n^l3<2y^vnbBYX{vYZd&V85z0
zX>JkO4qleHY^@yiTG~d88Li$@^rb0bp5v=_yy>-*>V*G!o`_CBx$Gs4CF2K{?K5%H
z5561$v2>5b8mLr{WZ&PHcR68tq@^6eNwm3$>QI^|jX~?-Z-@?O^sMn=3R~#%6Z0>v
zPpY*6ov15=O8P}2zOIK;EF_8ryfGs6a4?!Xk
z!ZU&I2S{>_lSGjcAQEJEcPUxilfoDtd!L77X7aKPydpD6=nseFpzs14y;e$0
z1Y36nfs}jbz>aS_kCVy%SnGXoi{TyN1wf=)!t^TDt{rd^S|D}#ebflC(1*B(yf=UO
zruj{X?K%V&Cg@l=>hkLxNl^+2$1%L{fz}+85sgT*=hD_xdsaAuM=!Hh-rBc6fgXTm
zh&|^`z|6}DH2y+*ED`TDwBVj#zR)KlX&|1A`e)mJ!5=@uIYwVnH^h+
zuSKpeY+co64)JM`EA>@ozrtVk@ltwcQIx@$%<}2Bz>a1+5H$9n(ymOpwpTs3PJ^&9Q
ziPuw4UpM2A2s%54mbO88+*sI9(N=kUtL&j|%sTI(HscZ{A_n+YIRHk3O^64--9>Q&
zUe0#DJzGDqIczZ1y(KGbwwC>re#grGKJds3KT~Mx4VgFS>VPzT#>Vgc$a>n^l%hLx
zGx@Fb)3nzw3YINbly^>#mf<}}`cOW6P(i3P_O+&%P|s8?x~q-rH{YM!!R^sm7nP6U
ziras5PnRrz&8DiJ$Vs`Mrv4UCuZ+L$+)Wa2K&8O}W=5AT5;lvF+#=m*!l3@&HrL1v`2}&U~*4wQMbp7HYJw;H^Ecg@}Z4K4#@y`j1|z3G=Ep1`7hf7wNkmht-G
zw#@>dZ%Kq-(=PWOrQx1FEGz*|g)!>6onpUMUus~r$WB07n|rEt|8swC((cVSULd8b
zf6i)lA_H%<0FX$Ul|$Aeg}dLreD0#)El6niLq^a>cHKZQhib^>3E*!9htgMnw>J2q
z)9P{0LMe$YGYYc1%D6vHrArV8evyR=GZFU7x8@R2>obxvu*TT;m5|WLM722g8#5im
zvGdHbdYu0}wBm%=LKFjvmjU7zE0XnC67yaUqC0;4Rc!&YVx-%b{`l@A_IJsehu_)O
zDCk^sEKaV+@@qWC7SQFxtwDY)fBG;;yl~=f>aqcN9)Fo&HYv{Azlt71!d=&`1j^@Z
zHt1W@4a{k^xLrDSv2wj&a^mB0KAb_%#fu5(&+5y@m{GHIl_>5{CsY)MRE~g7i0XY{
z#nMJMoO{Qd#E;92sLzF))(@on1v%4Ah%ZEhe3Iv>`}vi{oGVbRfT@pp33Ru-T#;;?
z%-HxUHQyl+Z%U1yAYIWYa|5%=(35LoDH}E-j_0<-tb@eu;2#r&W`35D4;yh
zxx^sZl%)Pu4sb{xPuG2F9c9xb`O7G~`gw>hb}9x|Vp)!MZ#8RG=S+PQOMO-Nm4UO-
z*`}#q-nqJ<(b*uXe9E&HRrw>!t~(U-;uz`%6h8lV_=AWrs=QJt2TX;c{)NL%C>cOMY?1d
z(TbWczgfARF)!sg`6lw$cK&vkRRn7rK}8{Za-KP0MihyHk#w_sh+vG?WC&FvA}2Zl
zZ!qDo;*faNe9Iru8$x@IPK4U!mdlIhfl!j*2PAr-ivhCC1(-?90kk}vbgt#u9plu^
zus0f^R(=F0_l)-efetS7TV5!l-Xr95G3ncIyr#{In5~^eIegJnjOzg73
z8*ysz@geY{^9aG;?epWLrq`bOBtRhd7`Z7Ua*b*dPA@Y~K*!?s{sDRN@Laa(4uIg9
zf%m%_5P~-E`eEaLoZAB3eeW+}+`d6=rsDxx{o@ZDU)
z_PSDaP3PlTz<9GyAHv>4v~Jgod<2e10^Uj=vV7$$SuZv<49
zdzsqyZI#op7~zqRr&+lVJv^%
z0H3GJ2*EzApj8>DXjvEY?sAGyQ@-22|ACtKrpU2GC-|xoKMvB}h>*gn6!DgpKrb0T
zT&iGfPbf|IQ({p{EOFOw7s7rK(lnaV-qog~ewq}>H~sA#zN}lF(JE$>>>x1s+ynsV?3sMh{kS-~
zz>Br@ASHf44=&iexo^?pNjJ8bT<_1bvvH8HAdOGN39V4Y$kfEh$yqG$XOIG&5}pL~
z8mqmf)glUqQ<_~u=|dbL_*)XO9k=2YF_68>x3Fh#)~-l%K3bEx(l^HI|KO1SDUhDa
z|9R&D7$7$SR3z-ePH-&{*ldGN&DLyWciGfBbSX64QIl}WbM9=z?sa{zeG+xD&n~O*F^Hd
z-+`I^t$o!|CDyNg+Aci$++X1HD|+aZI~#v#`Y-o@Zy|6&g0iRb8JA!)>+mP8d!hju
zXs#fSWg3#$y8~cZtphuvI{gGZdmlo<7x^-|CY>rQb(#H$dlNdbZVoDD>6I%GfeBu#
zw2QR|VfW|}xdQ?(KImSf(jrTLImmZNEkhh8jW1$#!RQcs{1ztOr?WA`dMW}VroVo^
zaH`w;x!|4C3Y)oT)2kJtwXfz>SMMk#J|i|?
z1bYfMW_Ev{DeGS9W#a5h)dGGup*%>eWz
z4^YqYXQ)oY@ia9%_BY>ar1sihg=INMnN4)%nhQA$Z}dZgxX8|8xO~Q^hf&ldS)wWa
z1_lOaCf>zSF2o1X#g1IRCzq-sKPw7(@j#3HNmvCT*H?$BC|R8!5Eb)9Ofo^0#t63%
zBW%2q24FqxoQ6lxt)srNSyRL@chqeawb>0tH}YvBW91_LZC5Z=w2Te%%ffbWSk-rI
za-z7^2MfP}=gb;@^3p(e&wdG&l0T<=T5(bG^rDpLT~Zq72WOZI3^B|5+1>vWqw7}K
z^rn`B`t@b;W`}|MV*qvDdeY*^fS?T2P6yKMK;@-zlG2vWikRqgRpc|)Im0-HD|g9<
z-%oD1pVe&oEGPEX(1b#9OZ?#5j!H6*!^#YD}Gxe!k4#{
zY?grh?^=BisO9IDIx9`2ziUjA95+@URt8uXM1d2Kb!UANvvd6xyma{7qTy2gxJB3I
zE*Px23!{AtEOLi?rEH%vtb{;;SU|FLT*069Ag{EmA|;}gsH&i<4$t@5hi)ae_{BRl
z`mdSkPz;=DZ<5t)&0!L|4Wf{oN_TvgYGSf^I$BC>U&%g3DLvPe>s?vb;>psM`E!At
zAkjz?6hdY2xuv06jgx+1X1=hr_PUAvwYbjIhjT^Z-(Kd3fF3A&kGhec@B&m0#w>*L
zg3c{c=Eus{0!B)exo;)WjFTYP+Ro-bprGt?t(9ajHgyhA2B`qEapBj{jWQ1k&Tk>v
zT7?lxS~72ywCFfnIRcHtC>{0Zk8CIG65i!}=Z7i$vYHn4MpucfV>HSD%7OCEo$QIp
z)rQ2AXJPb@iyK;b+f6xt^gdiE{P3%3wtwLlvrF1a#T|W`Ki)&t0Xi`$`^(w~b|(Ea
z^OmxfiN;w5!NbXoBc>_hqpxpVZuWS>(h~U~nA^f5no@1@6i&?
zk+~SH3>umK?G!rZ(vs(T_ubM6w5um~EJXq;+;57`Mkx;{2gyYE@lmXQZ1z-TNq(_w
zpj@`zvHBv~c8JgZ*AH%$7(e)?9AkIO`=>2uyuZfhxciil3vuJ6pPuEn`F!7aB4zbD
zL$H25KI=Vy+*D{YS(;xBr>=Rh4hvv2P+nOqzFl7=a%95uqM1in$E_qC8EUZu?C2+;
zlh>?q2d|5B<5N{#!?*?3SnUqDKJ&a4ANQVS`J=TOom7iK0i@`q%t|f{G!D?!J$MJi
zr~5uxBh35*vZM3%zLf%;m2QhAd!_s&Oo2#vDY$49(>2H#@cA#Ut!oE$bUwYg?LAFkEHTf>&;`ze@*;
zFjJGmjeep&3xi1D4wcXld<$-@{~SOD746$l$OhfDSsi|{hB9+u{sgi^!EwpXp?x3w
zHi9gv3t)w??QxY^F5;1DsoL1yl+yQ=&p=(C{G*n=)Qfip^kOxGlcAG)XS9tz8*b^WHg4-_u~^9NKsGzyG0
zgrZlL!z1Y#F_dc;IRXxICNyCjhh~z$q{)p`t5onjoG%A%&}INLA=T(fT4mt(#L0EF}ND(
zF!dM9(@vjk|M&j*H6NuXYWAr<=AkU>*RT>}*Q3HSXP
zCIo(dY;Zxpv%&K?TnefY>X+&oD;BilmVeGQJ*rS#X0l%C+TuSxl-p_W+ydfrhZob}
z>?i4Lz+U}g+qh-y(b@}zqA!wk_^221!QKba9GAEH?wme$EiC@j2n&%?+mT$AyWG6k5ENX&Xk>F}SL8x7
z_AOZM%m8meUiN1yc+%nV-qRk2$cER(QmHN%dxL!I?K{2q5{3MO?^fsSZyu$hn|Xql
z-n))D2(#!tO7oSC?^3GA$PHGBsOs>qlo+btR>s17ks^2s|%&G;CrV7syLK5l;_
zdnn_Df$e%m5VibRmC;bZ?C(5b%=g(g_ui1i;9vEr%wRwM
zCL$lYIKBS-bn6E16P1Q@fPhWWM@3?li(|Npn!O9q*^t|x4bE`)`uiud2tn!*64*`p#YxrWCsP_?Mjf=r;KZa(3+W+C@IZuu*
z72Y3Q^65jmrTvwQ{aY*9{_TBnED}TYFY-HRLtP%I+zym_jH4@m!y5A5Pma3u%lEr0
zbM*E-8X$yqU?z!%if{|oS~lrBcoNTWb1n}(b>{mpSR%W67|(e@i?_m}x{#McsfvlR
z_%O$d{6e=M@0Q+r`zyYyQ>_4!@%KFflrAi-SLa{fTi4~Bb`y>z^CXfO6l_c=Hy
zraPgvi$vyiiP;*=Dws{lVnqPQv!2SmRXS&5Bh6HyA1NhJx!;>q=~Wb$1As4fx4Wt#
z7}igfn}|y|!G`5Q#6*Rqds6^wvZLZgEUViz&tWH^xl77_jcfoYdH;auX_f(1zUm4+
z)M)BN%z?VJE+a@F)?2#E=}pxT`uZ!)OYvW8fu?Y%tSINj-7t}*gE%PG7(5GKN=&Fx
z;l|flwYN?APSFImh85Xr!EbCQEWKr-!<9zWgurhP1Pu{3=HSWiVQT*kk2XGu(uzQPl{K*MVJ^K@Q_cJoCsoQl1G@jDbR
zAQ6p_41B+2|Fw*$J1Il2tEs0Z?|TP6U##-b8}sykv%NZ5rr%O$_`Xl3It3q7tvV_a`+VpMuFdu9HG{u17nL$-=lPv2q
z*_g{Zj&s?VJ_m08(O^pjm7lh6eb#KIMXq3jIoFN}pB<8=24zmFt1#LJ;`X{W)HkB;
zn;uRc6Gh%kJ#Ux9aL}OY>=f2AFNJtF=jUAT--vHD0#v(db=dgdJMDLrqW?s~C
zp!JZSomX1;VRB+SFsz9bMH$vN`o^Mv$`{#R292sTl=|@7UlW*_QMkPc!nC{{XwbP-
zX{mIS2kXhTko$BjU3R-@K*<(2RAZ}fdY^nkW<=sUxtulXlcL?W#kB;McPpDBN_*y@
z>`kqFWt-1;`!o%;o41UyNKQvqrhU~E{o76-%%X>0CQv=PkOvlqE`b?bDFk4&fk4d->aoR@=TC4;RS;_ksc|sYNB&Zid
zrGGW>aCM*g*s50=l(uOQCO*$qei7s`CC;o~3X~!6TebGb7Y9b@xh%%oaE6!fNk{I&-Sc
z>3(|hKxsv};+&_NarvwpICA;4zAjim8qxKEH>0mx#ZkwF@ZEV2kx<(MrhW1KMr-JL5_ZG7hbN15>jI
zbFqUIImM9L8v}|b5rBTtng~D)uckv4Cq86PFH5{UIC&rLmC0Eg<4(rg#xHT>oZDg}
zzZZ-bKG+Ld(d`k8uR;gvkINd<%l^7YRiq<(2LJh)#D?sWfWT^E+?oPZI1;=4^%56$
zq^|h$on5W|1Ce1l7s5`HsI!)Bq$n5r@}t=l-ip&@0BBMd#|c!ycrVfGL%0gS%6|n#
z{DNEqKoEFT-kk_cx7`dTNTGk=$Rkga&Z(mV@{3`_{nQmJ5aDIGIN_e5m+&Vw~OG^yIPyVmEaDo8BtZ8
zQ)h;f{4eD0Q@mimO3k12K;}Cj7}dx-o_Xw7mb*8~@)Oh5qkP
zwfe7e291WL4K+RL8D^>Ww1)Uw;FZH8i{n9MLNG7CaDa
z@Txup!ld0dLNqrl=|A0`>t2-{6Y#Mw(g3j#>q&D+tN{`&@(@1+T!zsITI}9fT&QHt
zqFz~__Y);T^qZbcx3$-ZqZcWfrdKr?VCNaY#`Be3K#z(bHvP{8QMY7%^DH_jcArLU
z6^v!0h0TySfycHU(tYQq3J7;v@v)0(5O8jmsXe_r+#-p$IE`3=M4}iGH?351S5Wj@
z=NIh}?lyC7>nkrV1zsPF(VMp1B)5*qx)pun9CLDwFdESTxF&S!8T`L5M_Q}O}$
zT|PY$P(Jd8s{EJ>)yA%;V%nbe=+b_TA60(wrbvhc5;?Y64j{5@oZ92sy=(%<2GI*(!O9E^f1K^a2hMNB{4;g!-A~`|SxhgQ=5ghO6W$}42GcLc^
zVq+{3=>S1jEPq|9#|ia>Sw--C63c;j#EjL=9q_aP-iNh`AmSq|Ri7Sp;QQqPK)9z>
zl5yws?VSuK3+{A}_KFa0&b^((IueaC0YZF)zkzk_k>f
z-0ZJOfbSntkG%M0;c6$dpZ=ju(az^**_cmD>!_quZmJ^6xM{{CBse+uD~*SH@-2++g_;3
z*GS1nSO$m>)FzoiZQ`INRZNVcwMypn#3!EyWJ(1KxgHF$uX0;RAj>{n;+`H>t9VXm
ztrvY_w_u~iosB5H+ESNx)vUETqp$&t~G`YSn)bIx15}m7AQrzS8^lyO#9s2yl6@0
zYqGaOrSR+2-%GB%c#>HKOZ-T2H>_phvD4F0FGX{|{!iZR)I;Q+6N#QDn-?C+i8q!N
zq`sxOpoROUEShOj52vQO)AHN&8!75VCCz7xsQ<`qURvR;fMIll}GhlCo)B0!*mt7hd{T@LE6
zB9Ps}CHb|89*eUMnU1(5{)s1dX!ue2vVHv_
z;jp6$i~*4~f93M$BO5@T5t+F>_d+`%
z(#GT5bvygJhsvm#_EOOax^#9v4_rOR5qR_4i*zE>nk~MO>mLx8-N$?I(z~61
z3A%T$uguiejKiZ)GzgARp^1ca>~!}zGIB46((lX5o32+TLSDAi=3@lIl^OoC=C%tE
z;i{>{)ecO@CU7h_8{AvaNLTPwV@EiI-};*x@^2m{^WPt3_+PtV$%swBL9rt7hdu$<
z_nk%f+3BD6bWfR^SCya#`1?FWUkGm9>RwXhxJPrpA5=4{d~F5NcfepPHuYx3&ZXZ}
zo!zZw!}bP=>FBs-Z@3>gHY(hqj~ZhqfRqO5MW#Ng^I9Z~rGM;9_Y*(1CR+xD7fRfP
zRrlV^Urxw{MJ={Y4tw^VU*k$pZUxrNEQN@9NW)kZD_TqflTf>cMpo#QSWWZB-7=q_
z?tq;Mk!XSlZlRVJ#UF9dmnvezycNjhIX4NhliSOdb}Px>J-EB?Ui~b8Bbvc=z~
z155@d=JieXqmoY8^U}zGAS5EPFjN?i#4yJ23W`gk7_9U{y!bi%wKEk>!5GKR
zGa0-IKmV>Y_m^6j(zYha@YDM>y<<`5Y<=*k1wK3+^JG95
z$CEZ?k|yt`W5Jb{k1-iMVcQ%x*e;_=9%kzy6=MOCr-3b03?QlC&0
z`^jkmBWxVG)P$f+7t8EL(aUfJv19xj+GEX(^2&G&^Awpy(4l~-3uXL8rXOLmvSANm
zi`^dPQ}NYmCvEgtuHxGWN`MHAm+6K|iGC0l@F
zST=CTE-{n`jm)651=h)^@*DfS%t=dQoGU)({(atXP7tZVmp()jFl~E^F<@BGDs#`y
zx#R8Oea$n$vY0D9?ffb%56IFOi$c*!&zvMi=kb5WuBDBw4TxQIKd8R&uRfFmm%M<~
zp?a>2MSv-k*sx7T?QCZVu89u~*?yzbY0mkcL1-Gj5L#jo@IiZlZhvG2bv;n1pG5xy
z-mbpfc7?;^R_r&qoH;w`H)qoBsWEKi{*b8aWQ43`Bx|5!KU$QRAB(7hRk;UP9adMa
z>nw+Qd2MPB?u!)E0K_P~KvcKHTQDt&HZTDilN~k{53hNqtp<4|Sd~_Q52?|4((_>=>4<8G2y6QZd3Jz?sUF@oK`2t*8^;@BE3+VkbsvtC)L6zrdhp^vH&zrk?y2adMD!dw8-fP
z&qzJnkaTj;ddouP=BqDU<&T`+WO^A*rUcel;+Zg4xZu~CqCAH6{oEGlXS(;vMP8oN
zP^61!&Q5@vEPrKbqgvFbe;@Du)qSA36z1o75=(ChN)$
z$mwM{Q{Y+PPm`57qNB6xM_ic#{_>R}b@a72Rnt8K7*IyqXFHsgFF-VePTzsD%HfJv
z0;Wq5JL3`duN^}7o_(clYD)RuuhqGd6TsV`rWpO3;}TsS<3}y;lhQHH`gZ{{rR*}&
zoPJrNZ#w<~@$-o2J0%Z&Tm8nFlTl{08YgY+=+*BP=3cwi7`#>|%D2B8;%!Hl2M(!_
zy-Hlu40e^TK#)yvx^Kj4pp$draEZ{V+Pqr==n$Uk*e{+Vyo?wmBXst9%Uq`IwJ|zM
z-J-eoB?)fRXYj*xWmTDDRID_TK@}#Doqp0TZ?80K_B*tB&o)20UGh$YrlHl$
zehJQE?>^R8Ue@N>f!|HvtKB0LzhBxzs}VC`hF=e@%@YHH&AhCzSrC0#9isvBbmu6y
z#$#a*g=pW;V=#U#;Wu+e1%LGSqkgta0WDGe*y#}bvzrJ=`N~l0Iqi{Remp`niOI9}
zfpR8f^y?$5Fqf}uj(rvJC2ad``Sxn}{t$&HMRjY*`SL{8#v&K5DydfoHgYLD?0k=X
z7*>Ay@~$`3$~}hp%bzShpMk0%JX$}e#cKLZdAU{=*QvkpAe)0zUi$gphGnnO1_}-=
zr1_pdo4n7P-@)={-rf7Uwm@8Hub&`F4Y`ziV+`mYm7+w^POd5oe)=}DxU0~q{^oO?
zr|bWKs(zgBX|VhO*w2()7xhGE!YzDA_Y{&*dd}u+K=0w`LfCc|U*r{!wy2EClC0tI
z`yjfLnlCEy7h>FA@*hxX^e__b3c+DJQDWvqPeeDtbcS_NU;XpSfrz&421>9!(Hf|E
z@rc=0%)``B-Hrw(X4QrSt{1Z;+(VAj5fIWbP^cyUcN1*S*qMv1eoqn2JKDvGrpCZzG}A+IBlI5V)8Ecge${s%=VK+GT_E?
z=Bj}RMt0pLhT%jo61%0vFyuAQeLt>2iR!&73Grd+Ggj}rGvD`y_Z+^lrzR;(Z`y&L
z;@|f!fU%x0k(e45Xiv!&r>&UsugP8J+aFXjT!b1zFR&q}1AuRlQeehP7tk7nKD}I8
z*;$GCmAsr{IdPz*reU|_C%?)NY>I4j?FL^D^}BfA?u?!2@)5P3D)mf!R!v}b=Sy}v
z%xVP@yi@yuxHMb{31FK7oT8tAZDR=$g5$?PqKdKAQOhoQR!-S&!@ui#aiT_|&-)@+
zhm`LEsfcPd!xB8mE*q39_!7|oh4=IMxWoCH(`;_m?wS9OhaM@G`A%0Su0*CLj6sZwF
z3`>lmhE&IFCENZAQ(5kn?ml9DxyO=YbZ^f9Cx?5VPx&G&Dsr(=k(ETQWj(HLg%GJZ
zw?;3k{*kjRz6as?FD~o(nv(s20uPcBV6G!b`i@}3R=>p-_c>ModdCRCLQxU9Wcp^?
z%4bU-PsJu9!WAr*5N(7B|3^!lP}-^#-p@-P)fV%#?F+UN_C=@D8ZTu|#NHRJQ@z
zq~~g&31&3$qQt{hBG*IOSXz$tkm;3Uau8P(g|Bj7Xh0FNiy!4!CFV%5ZU`=QisvKz70#v=AayUF{-BygF*Xv-EP-P)d59ZAS1I29
zlS|G(dexCo@_Q+S_S~QoMWezNDw&{7;te#=#ct$C@>^PKkjo#tXwYf#jDUi9{^}}+
zss3}4TgM4-Rsa_Ie~6U)7jyML(pmni@#X*aaoYd2e*b@)G-4J~p=-0_{=B9TFn^pZ
zP97}$@vB+*+Y4%y$V%WJE*uzj%5#yTWb(rEB=JqF$m7vbYj*k;7ti898b0=l)j*So
zbfkyvJbAg5`R;o$Eq-uz=$!g@Q{37n(sbduBNZJj&f8o!wD@Pyi9-J
zj}V;jRgQMLdANO>>&f<<-Ah0}Dpf(61-Q?7uai4UaRzFtk~jSADq99@|Af@y$0_o^
zpa4q@=&aUqGnO&JIfaDTHt{KYcCF0HbAz8OHtvlXG~JY!szv7bt2dajrGI6jwD;bfCBC^)2KTqk~8j0Fc4wJ}jxOAQ?A0au&~}r#sIq{+Nu(oNnw9
z?!Fz!-~#9$aDA$kxbdLlx!iQbJ~qxa4bq6{<2
z7^Y-j_wV`t_w($v*M710tNU4NznJBP#auJj^=;>Q9G?R)HZZD*xp0ldpHz>zKlN2f
zu>43l=9?2_6zBPDK8BBN;G0$A6e2!^G1#!nXnBq!wBfx(_pH=-3%AfrUm#Ekhh5EE
zDm#5oboypixa^m_FEEJr90~yUBHp&jl4_e@fxDUJCVGGk@@11|nc2naIyuX{rdVNI
zmrPQ1LeNa&Hqe~ZLtgpCFcM3IgW3iIWK_z|8W34u-hR1A7)T2)4d%7#X+AEXD?eR4
z=I4Sr;`z!gu8#mrP$$mb}Vwo9Gzt
zc$O}f0uTF*+O=Kdb4(w6x^j}cAgz4hsWDpDcR!RrF~7r=;>Jl-{oXV-HdcbwQ;`&PT?
zaO7EgsOvkq*^-H(8AUoX2zEd)`a>_dJ6D*S#cDTqO=U{cB!%OYvozTm7e+B|GYOXW
zgHw6~vf-Ox{sW}zO8m^rXUrt@>9TOEugG%OuTU~w%mLDc
zKeVxK?+gp?g3vi;pFoeEmdw{lwSAm!(rF*oKN5)gB_|wJsf*5@dt)i_z@y1>(3cW-
z39m|!04lpC>w_!t-v^kkZV!*S3lCvum4`V#PyOi@TePL0#F0r2Qshwa8wz;>RMXtRVZQ+}eWh}hP#t@B*LCl!
zo6F6on=O{O7*YlKX2?XE4gJsQW>vQr%d|8&9S=4wAk4}rUBb{fZ`IUK44V~@GP+t8
zl_lIaU6?~2TdAz;8ktKz)rdgduoT5!Gq$oIJ8e$?6CDVRL~(
zAo@CxuD~e$o^8b=QT=_lDHS-2Gg}ZBsd8j)mgt6eR
z1Lk?CuU@jrJEx`;+v@nSXFfXTw1fy0Q*W6F`EoR7M;r$14CR%hPn~X?KV(54cPeKQ
zwlE0mG307IvU2Gy;$}(F?tF%9=#}#P_u}v%nI5K9H?)T!uA7wRHwdrZ&b{`UQ*fzj
zt64kY;9I6)NIk-GoP3jbcY4FQ+KYADbo@r7LpYA+^3%n4zTF_0&Oa?VaUi{lmrL0p
zy~C6%W#P8%sp(Ne3iUnj(qb)lyMiFLC;~0HFNC-LZlF`g5ciO<8Rr+d)gOIrsh^lS
zT8nC%tDB>ps&W+9;f;N3A4!*mxT+%5uT`V}OSq8vk8t4wAY2H)w|;-jkElW*X|4~2u*>?ilN8Fu3VhHVQ38r6Aj7A;ggr>OW{LVa%s-fz$$h#hs^%px@6+B#IT4|yVO46ht`02C8W|!e@`ibUu
zBPE_9BD;`Q2u8!h5LLEC6seu>I<3Or5cP;h%yZ6DwMzM4zUwW=ze3mh_(+|<<>Soj
zXfAV(8v?@703}A}X100ba8^c7V(>TZP5IVvGdgJ#mM>O`uQEV*(|;OnpUHiV>0R&1
zoD0yeUbXtKCGuO`bTlFihJK2EN^GsAomCZbu)6A~eQ5|X<#pQ;GUg!>a
z0Sp>-xEIM3r#(pouZ~>&!!|#SEL&*VNVZYFEQy{P5S{-dvDbDAqJR`mVGhu60uAgg
z36ZNgrJ_@8VZ-Y@N%id%fK^>ftr~>@KkNf0NBVaVpc$=!Q$~!f*gKk
zB$o#1z(04e>RIy&W%#a@wsQ2uGSzv0n^H%%XC>guhJ=Zscl}7ZeqoXo7M
zZK7g&>Q;(Z?%=zTBaUEpexsB%n$>gqeC%;w@UzBbr8i~D)*`xLHO2pMq&xje73~f6oOwf5ay?Y1cG?mU<}E!I6JB|2(?E@b+;ZRanj^
z#B>JWfa!o|Fuj^-BFYGd6
zd^Ludehg>II`zk*b^gT1{RLT^JFTwld0>v#o8nDT_IJS!6Hnf+hZ~BgDPI5Nw{64v
z@}(E=_#m_td3%Qz!-QOZ6$UuX=^NiQY)wb12v4m}@xdN|GIdcdJEaIIz(d`Qa
z>i^V{AbH5K^78B>AGCb$LS6|^PO8cqiuBC`ys1)G^?pM1%l*=k{t-4Pya!U{)J+0+
zLoUTH)eI+HSZojYeYR}*VPIo}b$fPZahZqoRgD&k!0BR5ySxAg%J3jAzJ=XrVW+5!
zujINWMBJ_i^knR}Z!hbvjWFh;#eSyW_g`2IJ3qxrV
zu1AWr2A6E@IO?`|y6gq>@{~Vw5q${XeLA3GglZAAo*(4#*JHe0ni(cozs^~H)Xv9R
zJM+3`N}_E1-p0L!pBFCgh-Z%8DY3KjXUn&3gw>Xt*ojEA(TBTj=U#w5-_^zJnP2C6
zwV7}`-+Rd0*7wqWenFx^juD52v42DCOAL8gG!6RHjj=fcaKx*;QRAt1;6V%K_}Y|x
zSN;7B!F$Hdq~9VQiCtQhn;r3@IHS#Jt=W3WDq?igZ@S~borUPbM-Ltfa4RH+T=Z*%
z@|fQKSvSv78rH5V*GJs_HnHN>7kF+uYEo1RtGOK1Ynqkw%U^EVFvi<
zRl`g8iFPi(o~i<
zP^#OzPY`m0IJ+IZQ(`2P9ypghzq!@;35NzhHqBfCmbW`dTLNK0uM>mghF9{Oc`q&s
z`2=aVI{gx*08Xa{h=f)!3Fvh>4l;2O^*&hdzNwpe&IA=SBTs&~Qv0Cz!hWZR?Ijw{
z@;cl!>Bkx=narHX|FA%+ro@%q#qOn>;3t&qPl*vh`t0Ij18SjF)A3ds4EU`YH{Q0l
zJ%?)C<5=~ofpHoxt%ya4YGal0TS~H_(4kvD(gi-()P}6#?=)}ahVJX2UtATQs#*GB
zq*~JzKr!Pj1~8v4Z*YN#Y!l$sYGk!!>5SnIsHu8ug6S_&7HD$;dH+$A|Kv=mb1udb
z9c(iP)4(*&Kcb~VyA>%_DJY8a$$~~~^|?-oSLnJf{DF5!W7Ve63BI^Nc5{jmj>E->
zUYo3$l${lfM(+I0aZda3X4AEW)8`%6lTj>#Ip02M^Y|t>Q|@?(km>v}J0>Xv-?i^Q
zJlo=Potnd+Xu%Gi0SMljukdyN(B-i7K+pLkSk7krZ83f6bj7a<1-ZnfK0V(ab;Mw>
zDVc_j@M6~LvU};Vho)@a*@qpmVx})FH+aY#2%%~CY9@beNGv_j-7AT$iN@JZ2L*g?
z=rMWzIBDhHwmSbPJ7A*#z_1mG(fj$;YPU1Blg+7Iz4n~mDUxrjnVSUnv!3p!l(+=q
z(p}2_q`!i=oQ_G18q!52m@PV3b9mq92^YtA@&8;wzarIK3SFT+scEhU6)F4$HGxiD
ze1C>WLZ)W+qA*BcI)*zjQNk3k)g9JeniVuYtix|$k1i9U*{3GEAcp{;6duf>mFyy^C$ls
z=p+8^7#xZt>R$Nl7A}bNO*(H{O$_Sbug^$v|+fDm&*<4TA5HxUYorRoY5
zJNbjW4SWCpuHw)0!2*v2BK6Emcfib&FB7|LI9e<%V`Ckzbo->-O1^s~v3@}I
z8zUpd0p!cckrog_AqAzw8R3EY$Yu8MZ)xXl4IvXnkVVkVruv@IE@=SkX~IkG0}#}J
z;pYrD#gJ+uRdsztn}3?AM48Ak4L`+wUhyNZ2QiY;PoU2V=gTimt@{?L
zHaYD=zJaTHaxZ0nTa1uf)Vp`-!IsK-;45=SKd-Cqt=XAQkwopE&>9+DCzUPAIMcZ1
zaRCP#{a|x!gx;ZN_UH=*168%u!=)~XbJC88o_ueLWY
zfi8&WSA8CJXh7RISd{T)bD1t~Cr{r5+1)JESCZA@RI9O=#!~RTC{G(-pqon+umRvvOOBpo@XLTf=XE%p#Y;P?9P*+qT=b$=t}B
zKUq1qOtgQ0(Cw>Ap7WbDud7yl=Wzpi(%ywT;$MDNr=dm{U5!e`L9}RsRe(O>f7$_VLqx`Cwh@1MZ{qEVMR
zhD|52fME@vwd~Du8yO4wGu+|9Be_(WYgCvWA93C3Wj6KEK3=%RT81M_QXs~?@HYXlC$NX>wo?R1MD~z#C8T^_WAuxa`b%WLb3LF$
zIBf)^l$^#2+dSO`xFA8E4A4I#QAf1;Gk`bEZ>GqCQi1^7u2C
zhq7@U#kV?tkW%GcCho9-jW+_};s=Ir!Tf6fpe5bN0^8r0Cs2qm3BRI9s&pmyAs3m`
zEA>eC);+C$))cWzAjBD*)MK~0o0Px|l``U%B^@#0b9yNzb`R*r4+JEvukC5!T5WjM3U(5G%g0gT3u)weGiXU5mv0C_
zUIExEUw{pE(XB~Ync!cI3|Ianw3ZJbM}tkmE+r553>wr~s;Vt3n_b=SWudx%YyzUK
z(E!=v6FW25V~+u$B|S8!M^aCB>UvO6rppY>r)!q*`EHPnDR2-8Bb6VwHzbPhBrU!44vKL$w4vr@H!C0~By?;S-
zg@6QyQHAmbgU?#o{)-r`!|BxpU7_1)Dh#Wya^&J>j=a{S@i!CEDX12gYTs4GJ1;&j
z`4){_V_WA(N7}+y1xBf>iBEuiaa+hlj=YWpk(DuXHP&4Au7w6JGmihLE_-UyP*
z&kVpHU*b!=J=JdD2cKanSqv6Re(=fU)F)o2UKPj5ttAq#$aS%cGpuwU@VDE_rPquL
z$kobC3}?QeI)5vFF82@eC6ypRRA8F`Vz90Q6Pz%qfdQ9o;%e`&ETNY9dv~8
z-A+A0bMN>7VnUv?NUFf{rNu0m@A-gfxRCd1Bws997khT5;7$7+#ZM2(jr^ABgQqg&
z#%x4XnvPS-laHx_s&2Vh!}nj_H!ffdtr$YUGPfdN6^njYG&%X`uK
zt9&JIZ(P>Q_Eg!>H)G8rDkF6e5^03YE_ZflR4zweJ-->A4jP6Xl%O5xPfWbsmW};qvbWs@Q4SM`@>P8&oa?bibHe
zP&ty&nL-LEr|gN1_pv?vxj`8k?3S4RWBGeV#W>;0?zcL05&OaI^LgB*f`!)J-ME7`-(@0mIp8RP4vA^llr1$_bdh(^B*kkP*@6Jqj74)XNUvD8((uSd)hin*_r3RiZrG8nCJ~fv;#KeT=Y{c0%e$3gN#5j*JLJMbxyN*
z3Yi~y1M5fI$C$0pI)dc{qgG|^2_~EnR@C{$iF%}HxC0{A2G%N#5BN^1Tu*DNO58K$
zR6T8bDzckF+{5Pr`=e)gkCK2HI1S7#IPbC6KDvfu`VbVX(mf}@pB=I^rp`Zn+72Xy
zBz8+P5sgNhA7Z(?EuLU-@j(oWCAJR9s8#i~scTB2)?M_;P~Ld>BLPOx_CHXAjF5?y
zx+t_2vYI+hqB@b=RgJx3w8k=1Szl?iROTUTb)@`aQ^=bavfWi#=cXo@1z^iSFoxdK
z@<5$TsJOUihs;sWZ3&Va7toxiVs58;>ven71i6sWjFy=g6_>TzDlEe)X}_TG@$^Jr
z+lxD)j&}v8KBg=qTrK@8cma}X{
zUjD-wJR-dfFOW9
zLv_;Wl5)LJSUcY^MIO_E39qn5vI1iQ1wG?^>iQemkOVNWv15f9W7*q*tk`+z_|86|
zbKZk^<Own)1o5Kzzf@7KS*3Hz^S5}6+E5`d#XyB6Fv
zn+X?#eV({F!g4qA7(%y`GH0DP2S*_j
z61(6$c)t0+Ae*FVolVnZ;Rc5u`o1{U5lW$ipv_R#hd@{=uOSNA4yGb%PnT)rd_hTy
z%^#wKIZV1+gXot*!8`O=}lY+*aYoyN_@g{zz1sOVY39c~j7EfDDTMaw*<
zk8oG7*@HDLw9D7+KzNsQjXA_Q0qqcMzmuXV+;e~x-34)YitPWZ=?OB?pgngK%r{J>HM%p3rx
zO)!s^-@XH=?9!2S*}E3_UUkr#rGYK{U>h+^2(YWKH*WJBen<%c${FpC_HFpN@h;3H
zw1Odt$L;9rv|G(tgs0Jn#hD7s%K|d*oHAS<~8*Plzq|d3^$ptaf)Y(#iy?
zlJzV2AUVv88#BCGes;CAzX}*)0P>Bgk7q{_S>gCRa7rhuxvV}eB91YXv7^}4VnOe9
zqfJUO()+HDY72FlzPqG-z04!npR!Aiuf}o-B>?G10H@`5*Un)1zRUNaSARj0B3`$G
zADq~NQ=d_Cj0ENv?fg_v!!*!^{?dA3Hg&J&UZM4xi^EtcCSUytt
zCI)Vr8ae4l{eG!WcvMW;{PqVrZiYc8zwt^?CcA$bi=D~|>jS#KAh{2-A53WWzc%Q9
ziAh>v&Ea^xNSUzS@?vSOa`X@6nM~hZSOc-RX1Sn6rcdo_1EDrG{en@V!AX{V!^6&G
z8B;nL?TVn_J4J&{g=NsYaiuqrG0uZ)+A0ZCdo%Y79v=B9&t$kwj|W`6Fe|{rh4c2%
z$Wc&SGCT8n6n?*0K2`zC&1_f}(n_Dfg;b4AD_;D%m6%3;%m;R8?9JUxG5hPD@}@c3atOMdwmds
z12}hM*!=`vY4{sh;+2{wQ0eU}kzg*Oii#vayspg=oG>AFCH$5h0|SXkQJUz~8!b{X
zBo$&GmMH>W71a(7WwzY*Y3>`sqsA@@8TFmCtLL=N*QOCIA9orzY7^zsqT&YjSpV^fv6@0
z4JNw<1wWu*pSOGO@XNil)0-#t-aUjK>1W6VYw~z5i1-jw@)&7-*Qn*NTw*gt&2(OJ
zQAy%c|LknL;CElhC;p#s;#IA6={BI1&js%uiDhpLE+~x3uV<^pnO;KaeRhohO7$U6
zOw=}D1KSM>L64cK-NLFxtRfg)Z6vY!dx39~zNw$yHD$>XGSZa&WjJw!2!*i%r!ZsE
z2bdEIiPuO#`hE5CNwV2_UUo6-t+(7wgSH?q%H>di!(2MVZ#mYiQTVVF8bW5!?O63p
zK+OYP2fpGz+TdAZ}~qJ&|?wfa8HA(fo_qu2K2zy0kGXibO*h1M%-)L*W#PI*PlwCK%*C9vk!J?JZNqNoWr$>$FoBLdK&HmOMP5^pUscw#4&;pQ
zlCsf?q=^=RJ*m3(fM%UCVHQ#LpY{CTzK;LvSy2BWr~gAw|F4(nVJhKe$O5EBDxF|}
zAJHCzx%_}Sc6OXs