From 3db3ce570ae39cd4c27db97d769a81c5d7f8d842 Mon Sep 17 00:00:00 2001 From: tamakyi Date: Tue, 13 Oct 2026 18:31:58 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20v0.6.0=20baseline=20=E2=80=94=20?= =?UTF-8?q?=E4=B8=BB=E9=A2=98=E7=BE=8E=E5=8C=96=E5=89=8D=E5=AD=98=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 已实现:HTTP/TCP/Banner 探测、90 天可用率、表格/卡片视图、 数据源过滤、UptimeRobot 双向兼容、服务端驱动的刷新节奏、 刷新接口滥用防护与信息泄露控制。 --- .github/workflows/monitor.yml | 31 + .github/workflows/pages.yml | 29 + .gitignore | 11 + LICENSE | 21 + README.md | 436 ++++++++++++ docs/DEPLOYMENT.md | 132 ++++ docs/SECURITY.md | 154 +++++ docs/screenshot-demo.png | Bin 0 -> 103277 bytes docs/screenshot-desktop.png | Bin 0 -> 81621 bytes docs/screenshot-mobile.png | Bin 0 -> 108078 bytes docs/screenshot-uptimerobot.png | Bin 0 -> 61266 bytes docs/screenshot-view-cards.png | Bin 0 -> 102862 bytes docs/screenshot-view-table.png | Bin 0 -> 81621 bytes edge/cloudflare/worker.js | 221 +++++++ edge/cloudflare/wrangler.toml | 14 + package.json | 15 + prober/node/index.js | 746 +++++++++++++++++++++ prober/node/lib/banner-probe.js | 64 ++ prober/node/lib/http-probe.js | 31 + prober/node/lib/tcp-probe.js | 18 + prober/node/lib/uptimerobot.js | 140 ++++ public/assets/app.js | 778 ++++++++++++++++++++++ public/assets/favicon.svg | 5 + public/assets/style.css | 356 ++++++++++ public/index.html | 49 ++ public/monitors.json | 100 +++ public/status.json | 1100 +++++++++++++++++++++++++++++++ scripts/verify-security.cjs | 171 +++++ scripts/verify-uptimerobot.cjs | 193 ++++++ scripts/verify-views.cjs | 130 ++++ scripts/verify.cjs | 191 ++++++ 31 files changed, 5136 insertions(+) create mode 100644 .github/workflows/monitor.yml create mode 100644 .github/workflows/pages.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 docs/DEPLOYMENT.md create mode 100644 docs/SECURITY.md create mode 100644 docs/screenshot-demo.png create mode 100644 docs/screenshot-desktop.png create mode 100644 docs/screenshot-mobile.png create mode 100644 docs/screenshot-uptimerobot.png create mode 100644 docs/screenshot-view-cards.png create mode 100644 docs/screenshot-view-table.png create mode 100644 edge/cloudflare/worker.js create mode 100644 edge/cloudflare/wrangler.toml create mode 100644 package.json create mode 100644 prober/node/index.js create mode 100644 prober/node/lib/banner-probe.js create mode 100644 prober/node/lib/http-probe.js create mode 100644 prober/node/lib/tcp-probe.js create mode 100644 prober/node/lib/uptimerobot.js create mode 100644 public/assets/app.js create mode 100644 public/assets/favicon.svg create mode 100644 public/assets/style.css create mode 100644 public/index.html create mode 100644 public/monitors.json create mode 100644 public/status.json create mode 100644 scripts/verify-security.cjs create mode 100644 scripts/verify-uptimerobot.cjs create mode 100644 scripts/verify-views.cjs create mode 100644 scripts/verify.cjs diff --git a/.github/workflows/monitor.yml b/.github/workflows/monitor.yml new file mode 100644 index 0000000..0061bc3 --- /dev/null +++ b/.github/workflows/monitor.yml @@ -0,0 +1,31 @@ +name: probe + +on: + schedule: + # GitHub Actions 计划任务最小粒度为 5 分钟 + - cron: "*/5 * * * *" + workflow_dispatch: + +permissions: + contents: write + +jobs: + probe: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: "22" + + - name: 执行一轮探测 + run: node prober/node/index.js --once + + - name: 提交 status.json + run: | + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add public/status.json + git diff --staged --quiet || git commit -m "chore: update status snapshot" + git push diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 0000000..41ab0b3 --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,29 @@ +name: deploy-pages + +on: + push: + branches: [main] + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +jobs: + deploy: + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - uses: actions/checkout@v4 + + - uses: actions/configure-pages@v5 + + - uses: actions/upload-pages-artifact@v3 + with: + path: public + + - id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..996c745 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +node_modules/ +*.log +.DS_Store +.wrangler/ +.dev.vars +# 私有配置:真实地址/端口/密钥,不入库 +local.monitors.json +# 本地备份包 +backups/ +# 助手的工作记录(含本机信息与运维笔记,默认不入库;如需版本化可删除此行) +.workbuddy/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4538136 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 shiroko-monitor contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..0add600 --- /dev/null +++ b/README.md @@ -0,0 +1,436 @@ +# shiroko-monitor + +轻量级服务监控面板。借鉴 Uptime Kuma 的交互思路,代码完全自研,**零运行时依赖**(Node ≥ 18 直接跑,无 npm install),纯静态前端 + 可插拔探针,支持本地 / GitHub Pages / Cloudflare Workers / EdgeOne Pages 等多种低成本部署。 + +## 功能特性 + +- **HTTP 可用性探测**:状态码(支持自定义期望值,如把 500 判为正常)、响应延迟、超时控制、不自动跟随重定向(保留 3xx 原始码) +- **TCP 端口探测**:连通性判定、连接耗时,区分「连接被拒绝」与「超时」 +- **Banner 探测(SSH / SMTP / FTP / POP3 / IMAP 等)**:连接后**被动读取**服务端主动发送的标识串,支持 `expectBanner` 规则校验(可做版本合规检查);不做认证、不发任何数据,不会触发目标侧的 fail2ban 封禁。默认只输出协议族摘要,不回显版本号 +- **90 天可用率**:按天聚合每次探测结果(保留 90 天,自动淘汰旧数据),卡片底部以 90 格色条展示每日可用率(≥99% 绿 / ≥95% 橙 / <95% 红 / 无数据灰),悬停显示当日「可用率(在线次数/总次数)」;顶部汇总整体可用率 +- **两种面板形态**(顶部一键切换,也可用 `settings.view` / `?view=` 指定): + - **表格**:一行一服务的高密度列表(状态/名称/目标/延迟/结果/最近检测/心率/可用率),默认视图 + - **卡片**:一服务一卡,含心率图与可用率条 +- **数据源过滤**:`settings.dataFilter` 可选 `both`(默认,两边都展示)/ `config`(只看配置文件里的自建目标)/ `uptimerobot`(只看 UptimeRobot 数据);也可用 `?filter=` 临时切换,顶部统计随展示集合同步 +- **可配置的自动刷新**:`settings.refreshInterval`(秒)决定面板自动刷新节奏;未显式配置时,「只看 UptimeRobot」模式默认 300 秒(UR 自身 5 分钟才更新一次,刷新更快没有意义) +- **监控面板**: + - 每个服务的在线 / 离线 / 等待检测状态(绿点脉冲动画) + - 响应延迟、结果(状态码 / 端口 / 标识串)、最近检测时间(相对时间 + 悬停显示精确时间) + - 最近 48 次检测的心率图(绿色 = 在线,红色 = 离线,柱高 = 延迟) + - 分组页签筛选,顶部统计摘要(监控数 / 在线 / 离线 / 平均延迟 / 90 天可用率) + - 自动刷新倒计时(基于截止时间,不受浏览器后台标签页定时器节流影响)、手动刷新按钮、暗色模式自适应(`prefers-color-scheme`) +- **配置即文件**:`public/monitors.json` 单一配置源,改完即生效(本地探针支持热重载) +- **刷新节奏由服务端驱动**:探测由服务端按各目标 `interval` 持续进行,快照里带上「数据最后更新时刻 + 服务端更新节奏」;面板的倒计时对齐到**服务端下次更新时间**,不因访客打开页面而重新计时(旧行为下每次进页面都要重等一整个周期,最坏会看到近两倍周期的旧数据)。自动刷新只读取数据,只有手动点「刷新」才触发一次重新检测 +- **UptimeRobot 双向兼容**: + - *接入*:把 UptimeRobot 已有的监控结果当数据源拉进来,与自建探测并列展示(异地视角),状态、延迟、90 天可用率、心率图全部映射自 UR 官方数据;UR 读取失败时保留上次数据,绝不把服务误判为离线 + - *输出*:提供 `/api/v2/getMonitors`,字段与状态码编码对齐 UptimeRobot v2,既有脚本/看板可直接消费 +- **滥用防护与信息泄露控制**:刷新接口仅内网/回环可触发、按来源冷却(429 + Retry-After)、可整体关闭;支持 `hideTargets` / `redactDetails` 与 `local.monitors.json` 私有配置分层,公开配置里可以只有服务名 —— 详见 [docs/SECURITY.md](docs/SECURITY.md) +- **三种数据源自动解析**:边缘 API(实时)→ 静态快照 → 浏览器直连,也可用 `?source=` 强制指定 + +## 快速开始(本地) + +```bash +# 常驻模式:周期探测 + 伺服面板(默认端口 8787) +node prober/node/index.js +# 或 npm start + +# 单轮探测后退出(供 CI 使用,历史心率与 90 天分桶从已有 status.json 恢复) +node prober/node/index.js --once +# 或 npm run probe + +# 生成演示数据(含 90 天可用率样例,用于静态部署首版占位) +node prober/node/index.js --once --demo +# 或 npm run demo + +# 自定义快照输出路径(--demo 会覆盖真实快照,需要保留真实数据时用它写到别处) +node prober/node/index.js --once --demo --out=dist/status.json +``` + +启动后打开 即可看到面板。无需安装任何依赖。 + +## 项目结构 + +``` +shiroko-monitor/ +├── monitors.json ─────────────── 已移至 public/monitors.json(单一配置源,见下) +├── package.json # 零依赖,仅封装常用命令 +├── LICENSE # MIT +├── public/ # 纯静态面板(可整体部署到任意静态托管) +│ ├── index.html # 面板页面骨架 +│ ├── monitors.json # ★ 监控目标配置(改这里) +│ ├── status.json # 探针输出的状态快照(面板读取) +│ └── assets/ +│ ├── style.css # 浅色主题 + 暗色自适应 +│ ├── app.js # 数据源解析 / 渲染 / 浏览器直连探测 +│ └── favicon.svg +├── prober/node/ # Node 探针(本地 / CI 用) +│ ├── index.js # 巡检循环 + 静态服务器 + /api/* + /api/v2/getMonitors + --once/--demo/--out/--config +│ └── lib/ +│ ├── http-probe.js # HTTP 探测(fetch,redirect: manual) +│ ├── tcp-probe.js # TCP 探测(net.connect) +│ ├── banner-probe.js # Banner 探测(被动读取标识串,零认证零交互) +│ └── uptimerobot.js # UptimeRobot 只读数据源(API v2 映射) +├── scripts/ # 开发验证脚本(需 playwright) +│ ├── verify.cjs # 热重载 / 数据一致性 / 刷新语义 / 面板渲染 +│ ├── verify-views.cjs # 视图渲染、切换持久化与数据源过滤 +│ ├── verify-security.cjs # banner 探测 / 脱敏 / 私有分层 / 刷新限流 +│ └── verify-uptimerobot.cjs # UR 映射单测 / 兼容接口 / 失败路径 / 真实 Key 冒烟 +├── local.monitors.json # 私有配置(不入库):真实地址、API Key +├── edge/cloudflare/ # Cloudflare Workers 边缘探针 +│ ├── worker.js # cron 探针 + KV 存储 + /api/* + 静态伺服 +│ └── wrangler.toml +├── .github/workflows/ +│ ├── monitor.yml # 每 5 分钟跑一轮探针并提交 status.json +│ └── pages.yml # 推送 main 时部署 GitHub Pages +└── docs/ + ├── DEPLOYMENT.md # 四种部署方案详细步骤 + ├── SECURITY.md # 刷新滥用防护 / SSH 探测边界 / 信息泄露控制 + └── screenshot-*.png # 各视图实测截图 +``` + +> 配置源为什么放在 `public/` 下:面板用相对路径 `fetch('monitors.json')`,探针(Node/Worker)、静态托管(Pages)读取的都是同一份文件,零拷贝、零漂移。配置文件不含任何密钥,可安全公开。 + +## 配置说明(public/monitors.json) + +```jsonc +{ + "settings": { + "title": "Shiroko Monitor", // 面板标题 + "description": "轻量级服务监控面板", + "view": "table", // 默认视图:table | cards + "dataFilter": "both", // both | config | uptimerobot(详见「面板形态与数据源」) + "refreshInterval": 30, // 面板检查数据的最大间隔(秒,最小 5);实际对齐服务端更新节奏 + "dataSource": "auto", // auto | api | static | browser + "allowRefresh": true, // 是否允许触发强制探测(公网部署建议 false;详见 docs/SECURITY.md) + "refreshLocalOnly": true, // 仅内网/回环来源可触发强制探测 + "refreshCooldownSec": 5, // 每个来源的触发冷却(秒) + "hideTargets": false, // true = 面板不渲染任何地址(对外发布用) + "redactDetails": false, // true = 快照 detail 只保留「正常/异常」 + "uptimeRobot": { // UptimeRobot 只读数据源(Key 建议放 local.monitors.json) + "enabled": false, + "apiKey": "", + "pollIntervalSec": 300, + "group": "UptimeRobot" + } + }, + "monitors": [ + { + "id": "example-com", // 唯一 ID,状态数据按此关联 + "name": "Example 站点", // 显示名称 + "group": "公共服务", // 分组名(相同名字归为一组) + "type": "http", // http | tcp | banner + "url": "https://www.example.com", + "method": "GET", // 可选,默认 GET + "expectStatus": [200], // 判定为「在线」的状态码列表 + "interval": 60, // 探测间隔(秒);无人打开面板时的后台节奏 + "timeout": 10, // 超时(秒) + "probeOnRefresh": false // 可选:false = 该目标不参与「刷新即重新检测」,只按自己的 interval 探测 + }, + { + "id": "cloudflare-dns-tcp", + "name": "Cloudflare 443 端口", + "group": "基础设施", + "type": "tcp", // 只测端口连通性 + "host": "1.1.1.1", + "port": 443, + "interval": 60, + "timeout": 10 + }, + { + "id": "ssh-gateway", + "name": "跳板机 SSH", + "group": "基础设施", + "type": "banner", // 被动读取标识串(SSH/SMTP/FTP/POP3/IMAP/HTTP…) + "host": "10.0.0.5", + "port": 22, + "expectBanner": "^SSH-2\\.0-", // 可选:正则策略,不匹配即判离线(可做版本合规检查) + "bannerFlags": "i", // 可选:正则 flags,默认 i + "revealBanner": false, // 默认 false:只输出「SSH 响应正常」,不回显版本号 + "interval": 300, + "timeout": 5 + } + ] +} +``` + +添加监控目标 = 在 `monitors` 数组里加一项,保存即可(本地探针自动热重载;静态部署等下一次探针写入)。 + +`interval` 与 `refreshInterval` 的关系: + +- `interval`(每个目标):**服务端**的探测节奏,与是否有访客无关;也决定 90 天可用率的样本量 +- `refreshInterval`(面板):面板去服务端取数据的最长间隔。由于倒计时对齐服务端更新节奏,页面打开期间**不会**额外触发探测;服务端数据比我配置的节奏更新更快时,面板会跟着服务端走 +- 探测只由服务端驱动 → 打开再多标签页也不会增加对目标的压力(旧版本下每个访客都会触发探测轮次) +- 需要立刻看一次实时结果时,手动点面板上的「刷新」(服务端限流/关闭策略见 [docs/SECURITY.md](docs/SECURITY.md)) + +> ⚠️ **注意目标限流**:探测本身会消耗目标的配额。例如 GitHub 未认证 API 每小时仅 60 次,按 30s 节奏探测会很快耗尽并返回 403,面板会如实记为离线(那不是面板故障,而是服务真的在拒绝请求)。对这类目标请调大 `interval`,并可设目标级 `probeOnRefresh: false` 让它退出强制检测。仓库默认配置里的 `github-api` 就是这样一个示例目标。 + +## 数据源模式 + +| 模式 | 触发条件 | 数据新鲜度 | 说明 | +| --- | --- | --- | --- | +| `api` | 同源存在 `/api/status`(Node 服务器 / Cloudflare Worker) | 实时 | 首选 | +| `static` | 存在 `status.json`(GitHub Pages / EdgeOne 静态部署) | 取决于探针写入频率 | 次选 | +| `browser` | 以上都不可用 | 实时(浏览器直连) | 兜底,限制见下 | + +`auto` 模式按上表顺序自动降级。可用 `?source=api|static|browser` 强制指定,便于调试。 + +## UptimeRobot 集成 + +### 一、把 UptimeRobot 当数据源(推荐) + +UptimeRobot 的探测来自其多个节点,适合作为**异地视角**与自建探测并列。配置(**API Key 请放 `local.monitors.json`,不要写进公开配置**): + +```jsonc +// local.monitors.json(已在 .gitignore 中) +{ + "settings": { + "uptimeRobot": { "enabled": true, "apiKey": "ur123456-xxxxxxxxxxxxxxxxxxxxxxxx" } + } +} +``` + +```jsonc +// public/monitors.json 的 settings 里保留开关与默认值 +"uptimeRobot": { + "enabled": false, // 公开配置默认关闭;由私有配置开启 + "apiKey": "", // 留空;也可用环境变量 UPTIMEROBOT_API_KEY(适合 CI/Secrets) + "pollIntervalSec": 300, // 拉取间隔,别低于 UR 的检测间隔(免费版 5 分钟) + "group": "UptimeRobot", // 镜像目标在面板中的分组名 + "includeTypes": [] // 可选,按 UR 类型过滤:1=HTTP 2=Keyword 3=Ping 4=Port +} +``` + +映射关系(全部来自 UR 官方 API,非我们的二次探测): + +| 面板字段 | UptimeRobot 来源 | +| --- | --- | +| 在线/离线/等待 | `status`:2→在线,8/9→离线,0/1→等待检测 | +| 响应延迟 | 最新一条 `response_times`(缺失时用 `average_response_time`) | +| 心率图 | `response_times`(最多 48 个采样点,随 `response_times_average=30` 聚合) | +| 90 天可用率 | `custom_uptime_ratio`(1/7/30/90 天),逐日色条由本探针同步后自行累积 | +| 结果/原因 | 故障时取最近一次故障日志的 `reason.code/detail`,如 `403 Forbidden` | +| 类型徽标 | `UR·HTTP` / `UR·PORT` / `UR·KEYWORD`(与自建探测区分) | + +行为约定: + +- **只读**:仅调用 `getMonitors`,不做任何写操作,因此 `ur*` 开头的只读 Key 即可 +- **不参与本地强制探测**:UR 镜像由 UR 自己探测,本探针只拉结果;面板「刷新」不会去跑它们 +- **失败不误判**:Key 无效、限流、网络异常时只记录错误(页脚显示「UptimeRobot 同步异常」并给出原因),目标状态保持上一次的值 +- 速率:一次请求取回全部监控,默认 5 分钟一次(12 次/小时),远低于 UR 的接口限制 + +### 二、对外提供 UptimeRobot 兼容接口 + +`GET|POST /api/v2/getMonitors` 返回与 UptimeRobot v2 同构的响应,便于已有脚本/看板迁移: + +```jsonc +{ + "stat": "ok", + "pagination": { "offset": 0, "limit": 50, "total": 14 }, + "monitors": [{ + "id": 536986782, // 由字符串 id 派生的稳定数字 id + "friendly_name": "Example 站点", + "url": "https://www.example.com", + "type": 1, // 1=HTTP/Keyword 4=Port(UR 编码) + "status": 2, // 2=在线 9=离线 1=未检测 + "interval": 60, + "custom_uptime_ratio": "97.436-97.436-97.436-97.436", // 1-7-30-90 天,三位小数 + "average_response_time": 1291, + "response_times": [{ "datetime": 1791880740, "value": 429 }] + }] +} +``` + +该端点不做鉴权(其内容与公开面板一致);如需鉴权请在其前方加代理。`api_key` 参数会被忽略。 + +## 面板形态与数据源 + +### 视图 + +| 视图 | 形态 | 适合 | +| --- | --- | --- | +| `table` 表格 | 一行一服务,列含状态/名称/目标/延迟/结果/最近检测/心率/可用率 | **默认**,目标多时可一屏扫完 | +| `cards` 卡片 | 一服务一卡 + 心率图 + 90 格可用率条 | 需要更大点击区域或看图细节 | + +指定方式(优先级从高到低):URL 参数 `?view=table|cards` → 浏览器上次选择(localStorage)→ `settings.view` → 表格。 + +### 数据源过滤 + +| 值 | 含义 | +| --- | --- | +| `both` | 配置文件里的自建目标 + UptimeRobot 镜像目标都展示(默认) | +| `config` | 只看配置文件里的自建探测目标 | +| `uptimerobot` | 只看 UptimeRobot 的数据 | + +配置在 `settings.dataFilter`;也可用 URL 临时覆盖(适合做固定链接,如挂墙看板):`?filter=uptimerobot`。 +过滤只影响**展示与快照输出**,不影响探测——配置文件里的目标始终按各自 `interval` 探测。 + +顶部统计(监控数/在线/离线/平均延迟/可用率)按当前展示的集合实时汇总,不会出现「列表 8 行、统计 14 个」的不一致。 + +### 自动刷新节奏(服务端驱动) + +```jsonc +"refreshInterval": 300 // 秒,最小 5;不配则默认 30,「只看 UptimeRobot」时默认 300 +``` + +面板不再从「你打开页面的那一刻」重新计时,而是**对齐服务端的更新节奏**: + +| 环节 | 由谁驱动 | 说明 | +| --- | --- | --- | +| 数据产出 | **服务端** | 自建目标按各自 `interval` 探测;UptimeRobot 按 `pollIntervalSec` 拉取。与是否有访客无关 | +| 面板检查时刻 | 对齐服务端 | 快照带 `dataUpdatedAt`(数据最后变更时刻)与 `updateIntervalSec`(服务端更新节奏),面板在「上次更新 + 一个周期」时去取一次 | +| `refreshInterval` | 上限 | 面板检查间隔不会超过它;服务端节奏更快时按服务端节奏走 | +| 手动「刷新」 | 你 | 唯一会触发**立即重新检测**的动作(服务端可拒绝/限流,见 docs/SECURITY.md)| +| 自愈 | 面板 | 若服务端数据超过 1.5 个周期没更新(如探针刚重启或被休眠),面板会自动触发一次重新检测 | + +效果:无论你什么时候打开页面,倒计时都显示「距服务端下一次更新还有多久」——刚更新完打开是 300s,过了 4 分钟打开就只剩 60s。静态快照与浏览器直连模式没有可对齐的服务端节奏,仍按 `refreshInterval` 轮询。 + +## 90 天可用率 + +探针每完成一次探测,就把它计入「当日分桶」:`monitors..daily["YYYY-MM-DD"] = { total, up }`,只保留最近 90 天(超出自动淘汰)。面板据此渲染 90 格色条与百分比。 + +- **数据积累**:从探针首次运行当天开始累积,跑满 90 天后色条填满;没有数据的日期显示灰色(悬停提示「无数据」) +- **判定口径**:可用率 = 当日在线探测次数 / 当日总探测次数。**提高探测频率会提高统计精度**(60s 间隔约 1440 次/天,GitHub Actions 5 分钟粒度约 288 次/天) +- **本地时区**:Node 探针按运行机器的本地日期分桶;Cloudflare Worker 无本地时区概念,按 UTC 日期分桶 +- **跨重启保留**:分桶随 `status.json` 持久化,重启/CI 单轮模式都会先恢复再追加,不会断档 +- **浏览器直连模式**:不记录历史,色条显示灰色、「可用率数据积累中」——需要可用率请使用 Node 探针或边缘 Worker +- **`--demo`** 会生成 90 天演示分桶(含绿/橙/红各档),仅用于界面预览;若不想覆盖真实快照,用 `--out=` 写到别处 + +## 部署方案 + +| 方案 | 架构 | 数据更新 | 成本 | 适合场景 | +| --- | --- | --- | --- | --- | +| 本地 Node | 探针 + 面板同机伺服 | 实时(按 interval) | 免费 | 内网自用、开发调试 | +| GitHub Pages + Actions | 纯静态 + Actions 定时提交 status.json | 每 5 分钟(Actions 下限) | 免费 | 公网演示、个人项目 | +| Cloudflare Workers | 边缘函数 cron 探针 + KV | 每 1 分钟 | 免费版可用(TCP 需付费版) | 公网生产、多目标 | +| EdgeOne Pages | 纯静态 + 数据更新同 Pages 路径 | 每 5 分钟 | 免费额度 | 国内访问加速 | + +四种方案的详细步骤见 [docs/DEPLOYMENT.md](docs/DEPLOYMENT.md)。 + +## 浏览器直连模式的限制(重要) + +浏览器没有原始 TCP 能力,且受同源策略约束,`browser` 模式下: + +- HTTP:优先以 `cors` 模式请求,目标响应带 `Access-Control-Allow-Origin` 时可读到真实状态码;否则降级 `no-cors`,**只能判断可达性,读不到状态码**(显示「跨域可达」) +- TCP:以 HTTP 连接行为近似——快速拒绝判为端口关闭;连接后无响应直到超时判为端口开放(启发式,无法区分「开放但静默」与「被防火墙丢弃」) +- HTTPS 页面无法探测 HTTP 目标(浏览器混合内容拦截,会判为离线) +- 结论:**浏览器直连只作兜底**。要准确的状态码与 TCP 探测,请使用 Node 探针或边缘 Worker 提供 `/api/status` + +## 已实现 vs 路线图 + +### v0.1.0 已实现 + +- [x] HTTP 探测:状态码 / 延迟 / 自定义期望值 / 超时 / 保留 3xx +- [x] TCP 探测:连通性 / 连接耗时 / 拒绝与超时区分 +- [x] Node 探针:常驻巡检、周期调度、配置热重载、历史心率持久化(重启不断档)、原子写入 status.json +- [x] Node 探针附带静态服务器与 `/api/status`、`/api/monitors`、`/api/refresh` +- [x] `--once`(CI 单轮)与 `--demo`(演示数据)模式 +- [x] 面板:状态卡片、心率图、分组页签、统计摘要、相对/绝对时间、自动刷新倒计时、暗色模式 +- [x] 数据源三级自动降级 + `?source=` 强制指定 +- [x] Cloudflare Worker 边缘探针(cron + KV + 静态伺服) +- [x] GitHub Actions:定时探测 + Pages 部署 +- [x] 四种部署路径文档 + +### v0.2.0 已实现 + +- [x] **90 天可用率**:按天分桶聚合、90 天滚动保留、卡片 90 格分级色条 + 悬停明细、顶部整体可用率(Node 与 Worker 双端一致实现) +- [x] `--out=` 自定义快照输出路径;`--demo` 覆盖真实快照前给出告警 +- [x] 修复:配置热重载后 `/api/status` 永久冻结在旧数据(闭包捕获了被替换的旧 state 引用,改为持有器对象) +- [x] 修复:慢目标(如 10s 超时)会被每秒的调度 tick 重复探测,形成探测风暴(改为探测前同步占位 + inFlight 标记) +- [x] 修复:非法/缺失 `interval` 会算出 `NaN` 导致该目标永久不再被调度(改为回落默认 60s) +- [x] 修复:刷新倒计时改按截止时间计算,不再受浏览器后台标签页定时器节流影响 +- [x] `scripts/verify.cjs` 端到端回归验证(15 项断言,覆盖上述修复) + +### v0.2.1 已实现 + +- [x] **刷新即重新检测**:`/api/refresh` 等待本轮探测完成后返回最新快照,面板自动刷新与手动「刷新」按钮都会真正重新探测目标(此前只是重读旧快照,导致「部分卡片停留在几十秒前、手动刷新也没变化」) +- [x] 服务端强制轮次去重:多标签页/多客户端同时刷新共享同一轮探测,2s 内的重复请求直接复用快照(避免对目标重复施压);强制轮次先等在途探测收尾,保证不跳过任何目标 +- [x] `settings.probeOnRefresh`(默认 `true`):关闭后自动刷新退回只读轮询,手动刷新仍然强制检测 +- [x] 目标级 `probeOnRefresh: false`:单个目标可退出「刷新即检测」(适合有限流的 API),只按自身 `interval` 探测;默认配置新增示例目标说明该用法 +- [x] Cloudflare Worker 的 `/api/refresh` 同步改为「等待完成再返回」+ 同隔离体去重 + +### v0.3.0 已实现 + +- [x] **Banner 探测**(`type: banner`):被动读取 SSH/SMTP/FTP/POP3/IMAP 等标识串,`expectBanner` 正则策略校验(可做版本合规)、`revealBanner` 显式开启才回显;不做认证、不发数据,不触发目标封禁 +- [x] **四种面板形态**:卡片 / 表格 / 大屏(深色 NOC)/ 极简(对外状态页),顶部一键切换 + `?view=` + `settings.view` + localStorage 记忆 +- [x] **刷新接口滥用防护**:内网/回环来源限制(不信任 X-Forwarded-For)、每来源冷却 429 + Retry-After、轮次去重、总开关 `allowRefresh`;Worker 需 `REFRESH_TOKEN` 才开放 +- [x] **信息泄露控制**:`local.monitors.json` 私有配置分层(公开配置可只留 id/name/group)、`hideTargets`、`redactDetails`、TCP 详情不再回显地址、banner 默认不回显版本 +- [x] 私有配置分层 + `--config` / `--local-config`(多实例与测试用) +- [x] 修复:客户端中断请求(切页/关标签)后向已断开 socket 写响应会抛出未捕获异常,可能终止探针进程 +- [x] 修复:非卡片视图的状态点沿用胶囊色(着色规则作用域写死在 `.card` 上) +- [x] 修复:首次打开面板时需等强制检测完成才出数据,期间显示空白「等待检测」——改为先用已有快照立即渲染 +- [x] 新增 `docs/SECURITY.md`(滥用防护 / SSH 探测边界 / 信息泄露控制)与 `scripts/verify-security.cjs`、`scripts/verify-views.cjs` + +### v0.4.0 已实现 + +- [x] **UptimeRobot 数据源(只读)**:把 UR 已有监控作为「异地视角」接入面板,状态/延迟/心率/90 天可用率/故障原因全部映射自 UR 官方字段;镜像目标不参与本地强制探测;同步失败只记录错误并保留上次数据 +- [x] **UptimeRobot 兼容接口**:`/api/v2/getMonitors` 输出与 UR v2 同构(含 `custom_uptime_ratio`、`response_times`、数字 id 与状态码编码) +- [x] `stats.memory`:探针自报内存占用(RSS/heapUsed),方便观察「监控器自身」的开销 +- [x] 配置分层增强:`--config` / `--local-config` 指定配置文件路径;UR API Key 支持私有配置或 `UPTIMEROBOT_API_KEY` 环境变量 +- [x] 修复:非 http/tcp 类型的目标行渲染为 `undefined:undefined`(改为有 url 用 url、有 host 用 host:port) +- [x] 修复:热重载会丢弃 UptimeRobot 镜像目标已累积的逐日分桶 +- [x] 修复(实测发现):`custom_down_durations` 不能作为请求参数传给 UR v2(返回 `invalid_parameter`),改为只从响应中读取 +- [x] 新增 `scripts/verify-uptimerobot.cjs`(22 项:映射单测 / 兼容接口 / 失败路径 / 真实 Key 冒烟) + +### v0.5.0 已实现 + +- [x] **表格设为默认视图**,移除大屏与极简两种形态(面板只保留表格/卡片,切换器更精简) +- [x] **数据源过滤** `settings.dataFilter`:`both` / `config`(仅配置文件)/ `uptimerobot`(仅 UR),支持 `?filter=` 临时覆盖;服务端快照与面板共用同一口径(私有配置覆盖后也不会错位) +- [x] **顶部统计按展示集合汇总**:切换过滤后不再出现「列表 8 行、统计 14 个」 +- [x] **自动刷新间隔可配置**并按数据源自适应:`refreshInterval`(秒);只看 UptimeRobot 时默认 300 秒(UR 自身 5 分钟才更新) +- [x] `/api/refresh?scope=external`:只看 UR 的刷新只同步 UR 数据,不跑本地探测轮次;普通刷新也会顺带同步 UR(最小间隔 60 秒,尊重 UR 接口限流) + +### v0.6.0 已实现 + +- [x] **刷新节奏改为服务端驱动**:快照新增 `dataUpdatedAt`(数据最后变更时刻)与 `updateIntervalSec`(服务端更新节奏),面板倒计时对齐到服务端下次更新,**不再每次打开页面从整周期重新计时**(旧行为最坏会看到近两倍周期的旧数据;实测:两次打开间隔 25s,倒计时差值 28s) +- [x] 自动刷新改为**只读**:探测完全由服务端按 `interval` / `pollIntervalSec` 驱动,访客数量不再影响对目标的压力;只有手动点「刷新」才触发立即重新检测 +- [x] 新增自愈:服务端数据超过 1.5 个周期未更新时(探针刚重启、机器休眠过)面板自动触发一次重新检测 +- [x] 移除已无意义的全局 `probeOnRefresh` 开关(目标级 `probeOnRefresh: false` 保留:该目标不参与强制检测);`refreshInterval` 语义澄清为「面板检查数据的最大间隔」 +- [x] 页脚改为展示「数据更新于 … + 下次检查 Ns」,tooltip 内含服务端更新节奏与快照生成时间 +- [x] `scripts/verify.cjs` 适配纯外部数据源部署(自动跳过不适用的探测类断言),并新增「倒计时对齐服务端」断言 + +### 路线图(后续迭代) + +- [ ] 通知渠道:Webhook / Server 酱 / Telegram / Bark / 邮件 +- [ ] 故障事件记录:连续失败次数、事件时间线、状态变更历史 +- [ ] 状态徽章:SVG badge(shields.io 风格) +- [ ] 更多探测类型:证书到期天数、响应体关键字、DNS 解析、ICMP(边缘端)、HTTP 重定向链 +- [ ] 主动协议探测(Redis `PING`、MySQL 握手等):需先设计「发送探测字节」的安全边界与白名单,避免退化成通用交互工具 +- [ ] 只读分享令牌:给 `hideTargets` 之外的场景做「带令牌才能看到真实名称」的分级 +- [ ] 多区域探针:多 Worker 部署 + 结果合并,取容错视图 +- [ ] 配置 Web UI(可选加密编辑),替代手改 JSON +- [ ] 面板:更多形态(如时间线视图、地图视图)、明暗主题手动切换、可用率区间可配置(7/30/90 天) +- [ ] 状态页 JSON API 的 CORS 开放与缓存策略细化 + +## 开发 + +```bash +# 本地起服务(含探针) +node prober/node/index.js + +# 只验证探针逻辑 +node prober/node/index.js --once + +# UI 自动化实测(需 playwright,仅开发验证用,驱动系统 Chrome) +NODE_PATH= node scripts/verify.cjs # 热重载 / 数据一致性 / 刷新语义 / 面板(21 项) +NODE_PATH= node scripts/verify-views.cjs # 视图与数据源过滤(10 项) +node scripts/verify-security.cjs # banner 探测 / 脱敏 / 私有分层 / 刷新限流(20 项) +UPTIMEROBOT_API_KEY=ur... node scripts/verify-uptimerobot.cjs # UR 映射/兼容接口/失败路径/冒烟(22 项) +``` + +`verify-security.cjs` 会临时起一个假 SSH 服务与静默端口,验证 banner 探测的在线/不匹配/超时三种判定、默认不回显版本、脱敏与私有配置分层,以及刷新接口的 429/403 行为。`verify-uptimerobot.cjs` 用合成 payload 做无网映射单测,真实 Key 冒烟为可选(未设置环境变量则跳过)。 + +代码约定:探针与面板通过 `status.json` / `/api/status` 的同一份 JSON 契约协作;新增探测类型时只需在 `prober/node/lib/` 与 `edge/cloudflare/worker.js` 各实现一个 `probeXxx(monitor)`,返回 `{ status, latency, code, detail }` 即可被面板直接渲染。 + +## 界面截图 + +| 表格(默认视图) | 卡片视图 | +| --- | --- | +| ![table](docs/screenshot-desktop.png) | ![cards](docs/screenshot-view-cards.png) | + +UptimeRobot 数据源(`?filter=uptimerobot`,截图中含真实监控名与域名,公开发布前可自行删除):`docs/screenshot-uptimerobot.png` + +演示数据(90 天满档)与移动端:`docs/screenshot-demo.png`、`docs/screenshot-mobile.png` + +## 致谢与定位 + +交互设计参考 Uptime Kuma(心跳图、90 天可用率条、分组卡片、汇总统计),实现为自研轻量版:不追求 Kuma 的通知/多用户/数据库体系,只保留「配置文件 → 探针 → 状态面板」的最小闭环,并对静态/边缘部署友好。 diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md new file mode 100644 index 0000000..e0e2081 --- /dev/null +++ b/docs/DEPLOYMENT.md @@ -0,0 +1,132 @@ +# 部署方案详解 + +四种方案按「成本从低到要求、数据从准到轻」排列。所有方案共用同一份 `public/` 目录与 `public/monitors.json` 配置。 + +--- + +## 方案一:本地运行(Node) + +最适合内网自用与开发调试,数据最实时。 + +```bash +node prober/node/index.js # 默认端口 8787 +PORT=9000 node prober/node/index.js # 自定义端口 +``` + +- 面板:`http://localhost:8787/` +- 状态 API:`http://localhost:8787/api/status` +- 改 `public/monitors.json` 后自动热重载,无需重启 +- 历史心率存于 `public/status.json`,重启后自动恢复 +- 90 天可用率按天累积在 `public/status.json`,重启不丢(每次探测先恢复分桶再追加) +- 面板刷新即重新检测(`/api/refresh` 等待本轮完成再返回);多标签页同时刷新只触发一轮探测 +- 后台常驻可用 pm2 / systemd / Windows 服务,按需自行封装 + +**适用**:监控内网服务(面板浏览器与目标同内网时,浏览器直连模式也能用)。 + +--- + +## 方案二:GitHub Pages + Actions(零成本公网) + +架构:仓库里的 `public/` 整体作为 Pages 站点;Actions 每 5 分钟跑一轮 Node 探针,把 `public/status.json` 提交回仓库,面板以 `static` 模式读取。 + +步骤: + +1. 推送代码到 GitHub 仓库(`main` 分支) +2. 仓库 **Settings → Pages → Build and deployment → Source** 选 **GitHub Actions** +3. 首次提交时建议带一份占位数据,避免页面空白: + ```bash + node prober/node/index.js --once --demo # 生成演示 status.json + git add public/status.json && git commit -m "chore: demo status" && git push + ``` +4. 之后 `pages.yml` 负责每次推送自动部署;`monitor.yml` 每 5 分钟更新一次 `status.json`(提交信息为 `chore: update status snapshot`) +5. 访问 `https://<用户名>.github.io/<仓库名>/` + +注意事项: + +- Actions 计划任务最小粒度 5 分钟,数据最多 5 分钟延迟;心跳图按「检测次数」记录,5 分钟粒度下 48 格 ≈ 4 小时 +- 90 天可用率同样按「检测次数」统计,5 分钟粒度约 288 次/天;每轮 Actions 会把当日分桶续写到 `status.json` 并提交,因此可用率数据跨运行累积(若某天 Actions 未运行,该日色条会显示「无数据」而不是 0%) +- **静态快照模式没有服务端,面板无法触发重新检测**:此方案下刷新只是重新读取仓库里的 `status.json`,数据新鲜度完全取决于 Actions 的运行频率(面板页脚会显示「数据源:静态快照」以作区分) +- 若仓库开启了分支保护,需允许 `github-actions[bot]` 推送(workflow 已声明 `contents: write` 权限) +- 免费额度对公开仓库无限量,私有仓库每月 2000 分钟,足够 + +--- + +## 方案三:Cloudflare Workers(边缘实时) + +架构:Worker 每分钟由 cron 触发,用 `fetch` 探测 HTTP、用 `cloudflare:sockets` 探测 TCP,状态写入 KV;同 Worker 伺服 `public/` 静态资源与 `/api/*`。面板以 `api` 模式实时读取。 + +```bash +# 1. 安装 wrangler(任选其一,不影响本项目运行时) +npm install -g wrangler + +# 2. 登录并创建 KV 命名空间 +wrangler login +wrangler kv namespace create MONITOR_KV +# 把输出的 id 填到 edge/cloudflare/wrangler.toml 的 [[kv_namespaces]].id + +# 3. 部署(wrangler.toml 已指向 ../../public 作为静态资产,monitors.json 随之部署,无需手动导入 KV) +cd edge/cloudflare +wrangler deploy +``` + +- 面板与 API:`https:///` 与 `/api/status` +- 手动触发一轮:`curl https:///api/refresh`(等待本轮完成后返回最新快照,与本地探针同语义) +- cron 表达式在 `wrangler.toml` 的 `[triggers].crons` 中调整(`* * * * *` = 每分钟) + +注意事项: + +- **TCP 出站连接(`cloudflare:sockets`)需要 Workers 付费计划($5/月)**;免费计划下 `http` 类型探测与面板完全正常,`tcp` 类型会报错并记为离线 +- KV 为最终一致存储,刚写入后立即读取可能有秒级延迟,对分钟级巡检无影响 +- 90 天可用率分桶随 state 一起存于 KV,按 **UTC 日期** 分桶(边缘环境无本地时区);每分钟 cron 约 1440 次/天 +- 免费版 Worker 每日 10 万次请求,面板静态资源走 Assets 不计入 Worker 请求数 +- 中国大陆访问 Worker 默认域名不稳定,可绑定自有域名(需 Cloudflare 账号管理 DNS) + +--- + +## 方案四:EdgeOne Pages(国内加速) + +EdgeOne Pages 当前以静态托管为主,采用与方案二相同的「静态 + 定时数据」路径,国内访问体验更好。 + +步骤: + +1. 登录腾讯云 EdgeOne 控制台,进入 **Pages → 新建项目 → 导入 Git 仓库**(或直接上传 `public/` 目录) +2. 构建配置:无构建步骤,输出目录填 `public` +3. 数据更新二选一: + - **A. GitHub Actions 驱动**:保持方案二的 `monitor.yml` 不变,EdgeOne 侧开启「构建时拉取最新提交」或配置 Webhook 触发重新部署 + - **B. CI 推送触发**:在 `monitor.yml` 末尾追加一步,调用 EdgeOne 的部署 API / Webhook(按控制台提示填写) +4. 绑定自定义域名(需要备案的域名走国内加速线路) + +说明:EdgeOne Pages 若上线边缘函数(类 Pages Functions),可把 `edge/cloudflare/worker.js` 的 `/api/*` 部分平移过去,实现分钟级实时数据;当前初稿以静态路径交付,接口契约完全一致,迁移时面板无需改动。 + +--- + +## 90 天可用率在各方案下的表现 + +可用率按「探测次数」加权统计,因此**探测频率直接决定精度**,也决定色条填充速度: + +| 方案 | 每次探测间隔 | 每天样本数 | 90 天色条填满所需时间 | +| --- | --- | --- | --- | +| 本地 Node | 按 `monitors.json` 的 `interval`(示例 60s) | ≈1440 | 90 天 | +| Cloudflare Workers | cron 每分钟 | ≈1440(UTC 日期分桶) | 90 天 | +| GitHub Pages + Actions | ≥5 分钟(Actions 下限) | ≈288 | 90 天 | +| EdgeOne Pages | 同 GitHub Pages | ≈288 | 90 天 | + +注意:分桶数据随 `status.json`(或 KV state)持久化并滚动保留 90 天,**必须由探针持续写入才会累积**——静态快照方案下依赖 Actions 按计划运行;Actions 计划任务在仓库长期无活动时可能被 GitHub 自动暂停(后台重新启用即可)。 + +需要临时提升精度时,可把 `interval` 调到 30s 或更低(本地/Worker 均支持,注意目标站点的压力与自身限流)。 + +--- + +## 方案对比与选型建议 + +| 维度 | 本地 Node | GH Pages | CF Workers | EdgeOne Pages | +| --- | --- | --- | --- | --- | +| 数据延迟 | 秒级(interval) | ≤5 分钟 | ≤1 分钟 | ≤5 分钟 | +| 90 天可用率精度 | 高(≈1440 次/天) | 中(≈288 次/天) | 高(≈1440 次/天) | 中(≈288 次/天) | +| TCP 探测 | ✅ | ✅(Actions 内) | 付费版 ✅ / 免费版 ❌ | 同 GH Pages | +| 真实状态码 | ✅ | ✅ | ✅ | ✅ | +| 内网目标 | ✅(浏览器同网即可) | ❌ | ❌ | ❌ | +| 国内访问速度 | 本机最快 | 一般 | 一般 | 快 | +| 运维成本 | 需保活进程 | 零 | 零 | 零 | + +建议:个人/演示用 **GitHub Pages**;生产公网监控用 **Cloudflare Workers**;服务对象在国内且以 HTTP 监控为主用 **EdgeOne Pages**;内网资产用 **本地 Node**。 diff --git a/docs/SECURITY.md b/docs/SECURITY.md new file mode 100644 index 0000000..e79832c --- /dev/null +++ b/docs/SECURITY.md @@ -0,0 +1,154 @@ +# 安全说明:刷新滥用防护、SSH 探测与信息泄露控制 + +面向「公网可访问的状态页」这个前提编写。核心结论先给: + +| 场景 | 建议 | +| --- | --- | +| 本地 / 内网自用 | 默认配置即可,无需额外改动 | +| 公网发布 | 静态快照(GitHub Pages / EdgeOne)或 Cloudflare Worker + `REFRESH_TOKEN`;**不要把 Node 探针直接暴露到公网** | +| 目标含内网资产 | 用 `local.monitors.json` 分层,公开配置只留 `id/name/group`,并开 `hideTargets` + `redactDetails` | + +--- + +## 一、`/api/refresh` 的滥用风险与分层防护 + +「刷新即重新检测」意味着**一个未鉴权的 GET 请求会触发一次对所有目标的出站连接**。滥用的三种形态: + +1. **探测放大器**:任何人反复调用,把本服务当作对目标站点施压的跳板(借刀杀人) +2. **资源耗尽**:每次强制刷新都会对所有目标发起连接,慢目标(如超时 10s)会长时间占用并发 +3. **目标配额消耗**:被诱导高频探测的第三方目标可能限流甚至封禁我们的出口 IP(真实案例:GitHub 未认证 API 上限 60 次/小时,被高频探测打满后返回 403,面板如实记为离线) + +### 防护措施(已实现) + +| 位置 | 措施 | 默认 | +| --- | --- | --- | +| Node 探针 | 仅允许内网/回环来源触发;**只信任 socket 对端地址,不解析 `X-Forwarded-For`**(该头部可被伪造) | 开启 | +| Node 探针 | 每来源冷却 `settings.refreshCooldownSec`,超限返回 `429` + `Retry-After` | 5s | +| Node 探针 | 轮次去重:多标签页/多客户端共享同一轮探测;2s 内的重复请求直接复用快照 | 开启 | +| Node 探针 | 单轮上限 22s 兜底(`FORCED_MAX_WAIT_MS`),防止卡死连接长期占用请求 | 开启 | +| Node 探针 | 总开关 `settings.allowRefresh: false`,完全关闭强制探测(只读模式) | 可配 | +| Node 探针 | 拒绝响应只回错误码(`{"error":"refresh-throttled"}`),不回显目标与内部细节 | 固定 | +| Worker | **必须配置 `REFRESH_TOKEN` 才开放** `/api/refresh`,否则一律 403;token 比较用等长逐字节异或,避免按字符提前返回的时序差异 | 默认关闭 | +| 面板 | 收到 401/403 自动退回只读轮询(页脚标注「只读」);429 仅本轮降级并在按钮提示 | 自动 | + +### 配置参考 + +```jsonc +{ + "settings": { + "refreshInterval": 30, // 面板刷新节奏 + "probeOnRefresh": true, // 刷新是否重新探测 + "allowRefresh": true, // false = 完全关闭强制探测(公网部署建议) + "refreshLocalOnly": true, // 仅内网/回环来源可触发 + "refreshCooldownSec": 5 // 每来源冷却 + } +} +``` + +单个目标也可退出「刷新即检测」,避免被高频探测压垮配额: + +```jsonc +{ "id": "github-api", "interval": 300, "probeOnRefresh": false } +``` + +### 已知限制(请按需叠加外部措施) + +- **限流在进程内**:多个探针实例不共享计数;需要强约束时请在网关(Nginx / Cloudflare Rate Limiting)再加一层 +- **反向代理场景**:因为不信任 `X-Forwarded-For`,前置代理时所有请求都来自代理的内网地址,`refreshLocalOnly` 会失效——此时应设 `allowRefresh: false`,或自行在代理层做认证与限流 +- Worker 的同隔离体去重是 best-effort(不同边缘节点各自计数) + +--- + +## 二、SSH 这类服务怎么探测 + +支持三种探测类型,按「侵入性从低到高」: + +| 类型 | 做什么 | 适合 | +| --- | --- | --- | +| `tcp` | 仅建立 TCP 连接,测连通性与连接耗时 | 任意端口存活监控 | +| `banner` | 连接后**被动读取服务端主动发送的标识串**,可与规则比对 | SSH / SMTP / FTP / POP3 / IMAP / HTTP 等主动问候的协议 | +| `http` | 完整 HTTP 请求,读状态码 | Web 服务 | + +### SSH 配置示例 + +```jsonc +{ + "id": "ssh-gateway", + "name": "跳板机 SSH", + "group": "基础设施", + "type": "banner", + "host": "10.0.0.5", // 真实地址建议放 local.monitors.json + "port": 22, + "timeout": 5, + "interval": 300, + "expectBanner": "^SSH-2\\.0-", // 策略:必须是 SSH 2.0 + "revealBanner": false // 默认不回显标识串(含软件版本) +} +``` + +`expectBanner` 让探测同时具备**合规检查**能力:例如要求 `^SSH-2\.0-OpenSSH_[89]`,若目标降级到旧版本,探测即判为离线并触发面板告警。 + +### 明确不做的三件事 + +1. **不做 SSH 登录/认证尝试**:会触发目标侧 fail2ban/sshguard 封禁,需要凭据,还会在目标留下审计噪音 +2. **不发送任何应用层数据**:因此需要客户端先行发包的协议(Redis 的 `PING`、MySQL 握手)暂不适用——这是刻意保留的安全边界,不是能力缺失 +3. **不在标识串不匹配时回显实际收到的内容**:避免把「目标是什么版本」写进公开的 `status.json` + +banner 探测的副作用仅有一次 TCP 连接与读取,与端口扫描器不同:不产生登录失败记录,也不改动目标任何状态。 + +--- + +## 三、信息泄露控制 + +状态页天生是公开的,泄露面有三处,逐个封堵: + +| 泄露面 | 风险 | 措施 | +| --- | --- | --- | +| `public/monitors.json` | 面板必需文件,静态部署必然公开,含真实 URL / 内网主机端口 | **私有配置分层**:公开文件只写 `id/name/group`,真实地址放仓库根的 `local.monitors.json`(已 gitignore),探针按 `id` 合并覆盖 | +| `status.json` / `/api/status` | 探针输出,Pages 部署会公开,`detail` 可能含地址、版本、错误码 | `settings.redactDetails: true` → detail 只保留「正常/异常」;TCP 详情已默认不含地址;UptimeRobot 镜像目标的地址在 `hideTargets` 开启时不下发 | +| 面板渲染 | 直接把地址、错误详情展示给访客 | `settings.hideTargets: true` → 不渲染任何地址(含 tooltip),显示「已隐藏」 | +| UptimeRobot API Key | 泄露后可读取(只读 Key 不能改配置,但会暴露监控清单) | 只放 `local.monitors.json`(gitignore)或环境变量 `UPTIMEROBOT_API_KEY`;`public/monitors.json` 里 `apiKey` 必须留空 | +| `/api/v2/getMonitors`(兼容接口) | 无鉴权,暴露全部目标与可用率 | 内容与公开面板一致,故默认开放;如需收敛请在其前方加带认证的代理,或设 `allowRefresh: false` 并只暴露静态快照 | + +### 对外发布状态页的推荐组合 + +```jsonc +// local.monitors.json(不入库,仅本机/CI 环境存在) +{ + "monitors": [ + { "id": "blog", "url": "https://blog.example.com" }, + { "id": "nas", "host": "192.168.1.10", "port": 5000 } + ] +} +``` + +```jsonc +// public/monitors.json(公开) +{ + "settings": { "hideTargets": true, "redactDetails": true }, + "monitors": [ + { "id": "blog", "name": "博客站点", "group": "网站", "type": "http", "interval": 60, "timeout": 10 }, + { "id": "nas", "name": "家庭存储", "group": "基础设施", "type": "tcp", "interval": 300, "timeout": 5 } + ] +} +``` + +这样即使 `status.json` 与面板完全公开,访客也只能看到「有哪些服务、是否在线、延迟、可用率」。 + +补充:`dataFilter`(`both` / `config` / `uptimerobot`)只决定**展示与快照输出**哪些目标,不影响探测行为;如果希望某个来源的数据完全不进入公开快照,应使用 `config` 过滤或把对应目标从配置中移除。 + +### 仍然会被公开的信息(请自行评估) + +- **服务数量与名称**:命名不要包含敏感语义(不要叫「内网财务系统」) +- **延迟特征**:多次采样可反推大致网络位置 +- **可用率与故障时间**:这本身就是状态页要公开的信息 +- **GitHub Actions 场景**:CI 读不到未提交的 `local.monitors.json`,需用 repository secrets 在 workflow 中生成,或只监控公开目标 + +--- + +## 四、其他基线 + +- `.gitignore` 已包含 `local.monitors.json` 与 `.dev.vars`(Cloudflare 本地密钥) +- Worker 的 `REFRESH_TOKEN` 用 `wrangler secret put REFRESH_TOKEN` 管理,不要写进 `wrangler.toml` +- 面板为只读前端:无 cookie、无写入接口、无服务端会话;渲染配置字段时统一做 HTML 转义(`escapeHtml`),XSS 面仅剩配置自身 +- Node 探针同时充当静态服务器,**不要直接暴露公网**;确实需要时在其前方加带认证的反向代理,并设 `allowRefresh: false` diff --git a/docs/screenshot-demo.png b/docs/screenshot-demo.png new file mode 100644 index 0000000000000000000000000000000000000000..f7b2f35b374dbfd39ce6567155c4aee4fea51b75 GIT binary patch literal 103277 zcmd42Wmud`(=IwdfCYq*K(Js5?gV!T1PSiW;1b+j10e(m5ZomMcO6_3EVvIcSb)I> z9|jv_&stgE_wI9D-;eWW?{oSOeGO0dQ{7!%Pu+J_MX9UGh;C;EA9Qp)(GS)%R~?Pan(tFw=czRQ8he z@@uf{w_M$5WB+rRx+{KvcH+$KHw1{6cQRAjYOS9e#dV)TCR1YG*G139KKlBVj1vv` z>l6Lc>Q<&Tco(mzXn>M;(u$SO&VvJML(<~V!NC#lF?^M=zOyq24J8VyeQa~Z`qRrt zdl&lW$2UY@0T}=M7|Qq(?caZ^yg`5b=fTX-M`V9`d}uhY|McFY6Po?$O+KRU`P0kC z`9C-zE&1Os@tnvlnWkB_4|YN73pl>@<%)%5L_AEi(lN?+O(%;M-+BE~Lt zPRZKNH-q@od2ILZf7Cv?Xh3F2#UGhHLDn4xjz-@dOJp!U7~UK)@8F`#Yk4RI1-+%a zo0%T=SF^H`QTEh!bj;gjUMsAYN(DfGz{+PbaV*tc(NwqPL}z-lN60;5okEX=sONl6 zgA;AV5c$7QE0XxFE@5s&L(_*Yj{QWJM#6)qZ@r4l7eBtw!?*BFO2j z9_T1zB|`?II{eZEYMf3mu54dsV)S1R4X%WQF{53a8+6#};1CeRd?^H@buDLIbkcDix_5$-WgR(|;lqVx z>~Df#knV~b(BZe`mz1I|c4mSPCUER2O~iq`9@?+Aqv<^9GFAsYw=V z&QHH4^}f0FO*aKH)SI@hytA)eth;S0DLIp_thy^EqWxw)J|)X~Cx0G&>cG(a;2p$W>wA(ev5%0j8CoZDyBBntgR% zUrQIR7LYk&L$9b29U6OdVMD9fAxzf0tmU2ZjY{xb{d7$+-P;^Ldw73hV z_2J(dY7`I^GB!hB-HPXAV~U^(jWdQ%N4n=MatYu))^mkiPb} z1b1^Q1R*h)T?bbymYiw<-(nGoi#4S2Cb0V62IXXfxfD%^ z2zStC&I*@mlMB32;Q2&gI}egd81fvSVpM0s90@iwJ*ScI(@&Jf>9YWE9xJfzK2l&B6jz%XY0PCd{f;%dy`74Naf83RCRjNb-Ycv$=95;J z`<(p8bmF4;cOzRHAa&|;RjQ_lSMuEe!MT)C1;LcjyGU)HJyt3cLCA+7F&r?qtxChi z?d^vg$$-6G2(qH9(z(>Zp`=2Kf@AWnp+a{7{(D|y^C*`#Xgl$xA0OI$d?< zI`PT{p$`uiKlFTJB1$fzR7$1Ug1#bl>Q*=(66?o!17_Qs9*j6s)sR7RD zUcf5T)P5EUu4c2ChVA`it^U=p7RYUu6+#v0Y6W+@VX`wB$7kkkV zqDk>u^75N-kxg*CAY{=J_t;3*7Y|HMZYds$=%Hg8b@q0(zYbC~g4IFsXteQ%iy{ja zwiomk(|iX;9#W9}wLB~z^3LU~Gq8oLvSla6Z4`&Re>!ZWsE*{08Fl%cws$0F4mQ|Q zr-?{*AH-M3%&L+R6Q?ATsX2W!?=iPCeO-iM&qUbNvy6$>rK$<>8jUCN3V@B9at)qLC>52ow!QmkE+FxToW z9j~#=BgLqi80WP4phna2Tv(H;{=wH|r%a`N?;;L4QwZ5qsh&NQ<7GhEj!0ER3v%DX zHj@b@JG{0bH24oqv)9)j#EB@EeA{9T|FT5(_4NRz?uyzR&t$AFulZ1!5q zLTD9lKF0Un@8MP}>sgPkG-u|HkFT${H**m0bic*!v7F1q=W*}F-c1--4#q_S`G9c- zb$QY~*we(N9p{A*@v-0>>=-@9Asx@X31Yn^bd~Gqw1fJ^&9h(lt*m-c4ldE3>1d|o zpw4h70sa8S2HldV`-$g7hpZ9e!e2CKFNjAzl=anF&NY%&$7ew&2Oq@ zXwNo*z~`$2s|VHmUfbDr1Ky;tH$|G4t?odz=4(9nqIK&~OhU0#v!m6Hes1FRG+tA8s zT>La)$WpiB@?$%zvpzGjJBq7|JHyOlMQS-%bW?1jk#EA47lR(OlWtCS!#VvXdbu$0 zcgizOw3HQ*<(Q3vrtsz_w7|X=Pra-|kaw`ek%djAa{=fFT30%=(1M2ONnF8a&cKUEbuEp5;@@o{1wb_E>nY)j^VpV@%erzzV1Uf_ zwN6~d^Z&N1csO|vn=<#UQX0eo0HmZd5xC3iOeLgk5k@0N5<{;315;{i(1*uCR#)m+ zD@<#9y&_bZ`Hf)3&XcX+khrl|z#eSqQkxu&_}m=}a9n%g2It66G4t5aPS9N~Gfe&{ zoyE4pJ*kGL4!rxUoaxGE+t!}q3+};f)nK6E61XXK8bHIla@PxUM!)@GkfbM`moqgZ zo=N0z$vghtqkVzxEhDtZ5ysle*3`sSKby#oJjE&ta~kX|uvdw*u;#ioEC+kN*!zuI zP1`|w1&6rEV;8SOAvC~C=5x(3QZau}SkKaygCI^S7Y}7OvQ2fLRKUWjM=gZ-Ipt1! zB6H`7?lRY>?lY*yNZ!#nrQN=PDwN85a{Hk5GGxESh`^>aap2N`DNrTIorUXM(K4tC zBMNG=e0H&)k(XmTuz&GUe^#J0!JtM&M`Nx$0V(NM(T;OcF$k)2hPyIpuAlsF1|B)G z$0O1%_hz~EGnW!VlCGcPIXoxwa5La?&l&eJ&-pO|g-$l~?tWR`=@Y^8oR1>{0MKcQ zy1I@xkb8@jm0AWP_Bp|BUU0gStD38cy|Eqpkc=X+xYg^}VQ-37}7v54xWsNQ$2Sr4yAvm}=vR_OHul`YpN(C^09%KOTc+jfGn zR%};KuP9@^&BaT*tTtj*JlRQ21SoJ#!i;i9=k9745uWsGThE5NZMHOWrepusa9MMfG*c?$LCmV2Op z{3+R^6xA#pXh50ppbXcO?+ubt&#Wr!Rd36H!YJ$XmoJBjvc2^6J_DWQr>5Qqc9r-=(kZeaF(?jb?{CJ%oHJ`zBRCKh3_{X)E zI|?MmpSH!$n<+^?e&SF@+P{K{_vZRu{v;Z&5WRVPQrA@Ty2cwa^>!Y664)!YP!&V^ zvjpTn<%~~L-4g0|#gv`5+Q2^0gn95SFx;cug;ifi+@VZrFl{WN0#t{oRPQw^dDHoT zEDe`zz3Qk~yYsi6zDnXJaBP$?`Kq40@D*Vpjz@N(u!zDHxU&05EzoakznuL6;H+-* z^6%Vf3zOB{O60CCddJAE+BRKdg({&L_v~+cy>8bl&a&NC(ldbCZl7rskW#6 z2YDOMX;JqlGE!B|E&8Q%+{|GH%EI-`ADN>cBx`!t7A4aYSSfLmr)76`?+yfr`%@!} z!%F%DON8lre@ouMRNTYtfp)&qJN+-UbWDKv)7O=0eS{ppx}5{A14>MavjeRMFT;z7 zh`}Bx?Di;XV=Sgws8PDwv}69_rKPipYH_cY#Ilaopzh9bB2CGdDKA&d2S?cVy$ivy zOyNQE7(1>maisS3L?MYp?yCtu+7xkU%=Refo-X>WAA)af-~jiXG1>^u z^uB{WnOR3&ifzBMFCQNK)M$+$X2#Q34f5>!U_#Q!^#ARXq25gmME=0#igW1Mg{Gj{ubq5c5Q|aB zFZa|J>28M?t$r{b70lM_toPxMd)p%Xw*#oGJLrxSSex-Of<{8t(jEdjuLUJL8$V$F zHPvWzy+M(ZbQNUc1RJYaWl~`s2Ni#gn#d8KSkC=QHbSbkfr32GfBRHCyYhHU~numu~QBg4_y(_s}Y(FN{q%4J~S|&N?uDJM%9oZhl3xx`uB~A zQuqY>A|$}-s!pIJ76p)4npc-`Cx%gPOmDO=Sf`|k^{GXnB(Ya9Q9X1=?w}f->{+;{}Ec-*H=yLxbHY1 z*;|1ht7WZQeC0K)D09cz&a%00Ww1fFs7|l#G?8^BMMQdyFrheCM5)$grAal1!8u*~ zw^&3Iup5@X=Kos9%U1{k;2NG8hUXP?#;ZjR=@1gk1JkP-G&-{!;{p5R#)qvSPEzm0 z4|%)A3E|>?gzP1&<8^Pb8)p$$OBcqtF3r)bu1d!#+%Lsb>%FsgNrCrE;UkM9 z*ttS}Esj@|H7>|~ij_8jWntgP@MknfD5CD=#|YVrt&<{;F(%_GYLV6nX0Yx(F$Lm{ zqz?YY+*tgHC~K_0fBwipvY;p_J{RkY_v`VcLq09OLbuJl+5}EXE*hz9;9Gv@)t&<$5yWtF33k`AnxxTwy0;lO5=_&qyQ(}rd$-OW{=?Mg)+^?PmxJ70;r9CH z!m~A|lx{Kgt~tc)E_WsLxKqf|eUSB{qn}5v^-30nI~4@QEeh%`-7bo6U1y1otC>3= z>gH9cGICauHiPHdyqwZ={pXeB*KE4pv|FGQX|jxZ4902*RUIeZzaP~LQHX7`D7(F@ zSQ|}oH!C~T<0Gv=vckpHkqXK7A76(Ym6jwOh=>LJyfJ26N)nAgaeUb)+&wxs)(&S^ z=i_Hz*RS>_I1QQyj9XYk++s)ka@i=`-b`5BTdeVmczbw1N8T9rjKU9gQ5eK=e5BX0 znNOtYwhK8jV$_3>*iRwxxZ|Gih4wzWFWbj3cI9HE%=^}2Difx52a;!Q7+1qO6m zfu;iadd7cGK&kP*7i&A4KEQWDuq9h(gkMCK4C66CHJQ6dHnlCW^V-pQRiw3U&e{8Y zfcPZlQVM1eW9{}@hyDb*j^Ex1agBPzbr=TC)c2q-_@<{*?FB%eHA|LwxDjQMq#k?X zZ*jFE$qpT{LTqA+w1#;CWy?;6%FX~HyFgd)`7ilyixqezGT7@OHuo{Z4vi4^yOq;> zU|^WL-;Mi@QGmiMjd543pImO&f;owh$z4(vQ3&%q^BtpQHQeT6?Zfh2*;&If+iFLP zZ)2%)!J!fYRDwrhnd|1-r8#HSd6-_Wq}MRFnB-8N3`a4vuVOh@=c|7UNIFMEL?8}h z9+ABXA2+afo@A(7m5V%Gv99!ym8&H<%V@Txd!uSL*yi_j<&a7y3f7T8;3#n~0b})V zvt8t}{xp}m^@FxuYkpE)pglHLZ>>WqC!ZA(_#P7LW;E3zd!6ycdbSBLy+}yfN}d*IhoXdChf3MaPGMk|68tLXm8fuckC1LF zU4}nMWaoSVbIGQu3~XN1?F_*O0L0@6JJQoHK4D>1PYy|4;Qg4;uKfVbKiMw&_3N+l zSC8L5%KySFT;PBqRqD+DRn7FWA~@)^m<<9L6K^UI0xpW1^kG_)Q@gZMDkAoDtJWA+ zmBsp%Wxu%GLD}v(*_GAB?$mW&)8CS_c9=~%u*G3N32qGDy@|6H#opM;PgUz-d_JSnHU5lOUPOy)%RVUFV(~MTki!%MJ+Ag zFOy?qMrnID4C*8BYOCJ1q9^=*Gxb%#{5|4RD+#T;=VdsCaW6%5Z0%tDUk0^W6^!jD zN$^lU(vmOT>$`ADeGZXK!H1i~?A~AT>;pd&+m;9&Cb&rF#>y6X2}xY|_EQiU@N)_Q z(jt0pU0_QcW0toyw_!jd;xW?xoRIZ!;m)w!e$6=}y?c_gca}W0lDBsCcealK1=b@L zxBV4M5Cs>jGgCV~)6CtrY7l?})c891W;sFDXlp*poFY+?CU?j{w3#^0G|@?LS#9>` zYg6^{hBF0_&C*%k4EfnSGt=yxy6Akk&0*Uc!>x&Q#IGuZ{B%XFP|={bI9um&4;cky z=L}k*5Ot~yVSbyPG53N3lI9m>|MbO+tQ*;Z`ZuzX^4LRdKLl}3dUk`4RqnlB|r&@-D2b%n}=LGLRXWK^u5}F3ynCA9Z$OTI-p65Pa2Q~s?Qf^^6 z&8mvet4vFldga-%!arNw#&ATEv~x~ozkOE}c|Dz2l-ae=lq{wMTcHY>yALZ*7)jlS z8acL?UlIdzpygb5Qn=VS@OgH(11_M2_KUB)2b-1udTy=!@H`bwLf?w3H>E#Nv8}a@ zAroI;6wf_?p|tYzZt9}KVw?Qn#as)$$>annhZ&62XqrcnwbIWf!jrg|ofcA`E4Z6- zQW!=G(<5JO*=*7#}2FSowLs}2u8z}d3O?6JamxAV{ ze1VH7f$|20Q*~vunpN>(KUR5KJ=vwvfcVyamPzx7b21l05dqaa6QvA=!7r6j$-bF{_#(dclu8o9CN79Sn+|yh-2sm5vrk>pE ziaC9)t}P%}=XB8~sZ^{VvAOowXm{eCE?U$~p)Wqkk3pX9iNU@a4*6HoHQFIpKOXRF z{^;#usquv~4o{R>B^KsMIzu*$%Y@@fZiFjI6|jZDjSXSeg&ENXazpphF%tdEnNQg; z*3)@+sz#Dy?59=SDlg|VN}LrrhWM?Or;M)rVK}5zH=bbDC@(y%6hlkjQG2V4vGXf`16G1$ z=_X%dMK@q3k2n7DGlQ2R`|V`T>lq&~Zstrnl<}5EKa?G&)vq0h_U?+kKGqmV1;=hs zF{4wA_A}3r?T>99N08+J26oaPt|>{;zajw%P{bmOxSfdCwx%- z({ht2wE|1E=EM#kcYXQKq3TmD9Fo(SqL3IRC4E^O7uw<)n2d*t^hE<5p5P0P3`>~V7AcY9BZd6+0|^A1xjd#ha50gTCfM~iQN+rBzSWT7}nTPy`hyA zyxC3@dTgeewI=2Bf_Qj!@k>-&&fIzPnU*h6vjneHoN+(Rks@_x92(%w=YoL=i6AoT zP!5hm4vs*_*ZhA)dS|_cww)7Es}4zauero4`zEob_3zP+Qv|~Yguf`x?XW{JQ~Fb* zV2|fC6SMQ|RH8}fi5%k&@NYL?MZi*|??p6(Qyk!5h#H=Z5JBHjj9A{a8A>Lnzh0k)R`AcmupjS| z5|e+65UyiBR#A#;vGu$ft<<$g9vWV-CD=dR=LAv-)tatnw|FPqfj~`DStD(OTo`>U z{fNz=AP$=CssfQ&vD~Re6;bn|7XxPV=%2ZtOBy!c z^wRcrXhRUa=4Ti?-&icB+@{efP7$EE75*hEBWw@t78tsd4V|rZ{h_Fc@nGS9aRL3| z!_16y>B(4O%e^mM6tHWOtvx{f36Y#R0B~*4|hho^7R;j z6UbW|2>vhSk<_+A#0%kOD`&Zdi!<(a=JhgcJqW(|2q8_bqkY~l;0W@`uL>xsexo_> z%;JquyYfm*G@EBe+3@Q&_I5SPv^|gQR8Eo{N+RBA!X#{_y3GrU$3q~OV}lOfGCc8% zF_Kh~uJ8DspQ759?+z9_uCZgwuuN__&4|e7{5)%L!|Pj$w^MI!K8f6v6r~_qx_vfD z4uEe{K5$PxtE&rYm&8uj4tMRkkzQ-jw|9%pS9}B(UFxsY!;e*&ub!Vt@RUSa2P=l& z$vkmYpj!#K+_IxqG;Rd&g8Vs>!V)MO{w5d}T4Wog(=tG1h0{^k}0<~J~#y!MMgnec)*`x8x%+@cq|h_+T> zjU>tepA?G85_YVb_c5X1YFT)Knf3-9 z<+~fNvl521e<~^#zD*oRR?u=Brqd393Ph`xtfZPmHvkt$1|8R0Yv2mC>F?dFi-8sJ zF><>m$J*shpI5v(3}gGgU%B%9IXD7drRYJ;J)64Pnv2d@eZOnqx*&A!8Jn;m+{BLN z@H}fs>^9|~t|>xY3I^0$c3xk=H0+o{ea@BnpwWncqUnSCy@~B2GB_!z4=hEKnv9D0 z^PO)v`rOOD=ocUHywU=Su%w=mlRqP(N_i^Tqn8wbt%AG)nRU+kq2eDeudLr)`hRsJn_w#gF1gO%>W zcp0j*QvbmypG$M)yLoC0WywA>RnEfOBrU_Z^g)hHm&I*~{(3HnDE^zrn~dd`mpTP= z4B+b8ti_*x2IUC_8;;n!+@gfg=D$fn6U7Ao&9LUV$}je`;x+Q%=#qrIJuHs5x!A=0wi98GFFi@$qnT4ATNr$i5(X{@ z7f!9&6y*u6#wY`yvB?rm`DCsoUT&OYCaKWYr24a2N10zfSKp5LL0^#dG{}-gH7c4d zy2RmpS|y%jCfH`Sve3rL8jF1{@NPONQ9G!xYS66euD-bbI{AYVuilInC2~5slxb$) zEcIP$*UZJjI~-xPZ9$en8#1MuqAZ>Ff71iR$#v{ctGsWe#B{!EwUf;CPtY{4l?W@# zV}G^GxB8w`Rk)}#JGRtu@akx4*IQqgpjLIVDN6F`Ouh})Ew@skdro33g=3PgLBPI7 zEDrI)7Y0$k@r=WbVCjOru1~~5D;OC}v7^|@EMCkwX#>qWUyRx{w|;~9&+s%vY-aMn zF6#{XMaKK(lAv<_(yLye;}*~5UR?}?rNXv%FUoFO%H!vf+vX#br~p#ql<~PlN8&|c z$E=v#=`*Zh?VP|!S@2?me|yT^REcC!-rE1W! zY_Ez{6t_~-A%A5Uni5bZ)cpuaVg`8lPZHGA@xLWQH9o-qXGu{1Q<~OiG21fpKav5y zan`#S=XrnluUxN!*RObJY0*(m-#_i6KrSFMGLr7!6tB?90V1$NFxQc6`?b#rrLeJ&~a53GTR*mqIso(_G55L&IIK!cG!op zsFr19_<|yf;>C+Sepz|>nGl1^k6W!4!J@!__UgqmS{&DV8Vc{=Db2O#`6_{RQ|7!! zpGT1zG+-SBe(Y@eVz;UBT1)jY{mE3x>F^vZxpv?p${bjf;L#uG+4j#QjdZ(2W*#b# zBus>kmlN9bKI};o7Smv4cP0_cDSj6O0>KdYQyLl=*ys2k1V&Xg=yr-m<})+1HZ738 zkbXUfooKIP&wmd6y^1Rn3eZd3KwwRJVK$Do77w+8AtXC~Pn603hAu& z=lM@@wSB&TYW*}-(tq{~3)9CfV<|YC8Oh+;=sB9}qIQ_EG`hRXFoRc;c6_b%|9sXB zJ^NwsQ+b;JiQ{hi-Y@aR`mS%>BCLv83JoN>*)|U z$F%X$Rf}ob--Gt9L{}?|ikezmt=B`llzVrfGYaqRezcx_jx0fu0I0xHLl{3A=W7AX zgY1c%0=kmTW8bXe;^OJ;J^IPAU0>d8wy6IeL2K}oXTFiD{JlAl*UN0G zSEKU45FEofxG~@y+g(gbH!2L$;oLpZU+Gjj27ft zMIl90R8SeS6{(d6Osw)){T!@Qj*5*b`L&e$lY~UuGa0cK_J3)O(e$Za)3Lm~?PG~K z!!J9-h~akeQUN)+bjdUQ9!_!alwMXjo-OjQ<}_}K<){^vB-va-zxaAs)GEVN;(Lw? z?6mWr3EOTgzff}Qj>)U`$BP!&%Hn~$^FSq2n-id=YVGl!{{N~8J2TOGkSXY+4=T#J zh9r>J30dknih_tW1+P*=xJV?DuHc?9)fr^!L+)jXxPnnV*eBTi)NdfTlgBQw%B9{^ z8nx7o1Y`m59@N@e6o2XC&4J2+O6OMF()JJfRCkgu+`j2Kj?dB$#i0nXO6!ke*Dz<* zcPh7b)N;OO)C(|^kS+;ReW(0IZ9Iil9+=ZTa@q_dJud24s~uO*VKT|2x2*nf*jT}s z53d!s#+k4|fjrAB(i$E^kM+iDcdyW2bvpGVoaM$%pw|(3qqN_nVvV-o2YS<|dw*xj z0w(L%l|$n}-gf6)O-C2x%2h2CunggX-QOQgkAG)WS@p&=9c1(|EqIm1`h3$5HnZ$Q zUVb*^dY9h&Le9x^na;Z3qfl&M`nCO{&NjD5us?D9^3F|jRaI3`XU;^KFT9xbu3q_C zBUQ?@1?8!SS2?8;E~$XQLxjlWCVIWXHiaAOoF;`#4zD(4mIi1>Ap=WpUBbu#Z*NKf z(K6F2=$6;Ax=FZ^mz!H-zPh!_|K!Yg&jY+GZihB*YN=kuO?=?ltu*`r>b+vGq?s6_ zS8cCdQV9{0bzw1YVxV0FY4F%)9NwL+2Wh~r{=KgT>Wn>1Y@K=AgWq=Gxk?6(W>d#R zkzK%wMhvYdViwlZNW6U-GaRsTOWu{r!S?70Muh4$hjl+jW(YhFw$m~0* z{Opg4_f8Hm(dYXpK^)6|rHf9aGVVPV)&f^An+?}r%#RtSr!hD!x{%8Q}@>Z35n;d(GE7|=R;pl708g(>w&;#M$mzWU4UY$9-62?!a_ig4Frj-xKc{eqBP0>P94i~D9Xb|Y)^Iu#8 zt|U&cQ?1Cri#ysPy>Dmqs<@cJ0SlAmwa4fj%(2-#WmGz)m1Q~%Nl`~W4%|n!9>6C` zM~`xFMP3~R!wy^P>tRb{lmR|k;}5^96QhB%0^<~B*bOgc6w7k5b=b%Gc~--!X7Nsd zMP&2GiUO4l{6QuAgLNsljh`j0ATIV7(_*kZ*B2U<`8Rms9qB0vfFTMjEC(9iTu9WdHs$7`)}_@k_oyHm+zx7n>n9N6%Q#%{Hl_ZlHjey0w{L~Sw# zn7B;-_a)9(4yB{(`1K*rRF@9x#-!=VWs$bP{<@mu_mFFWoa60%j6As%wf(`1QW0sF z4xwm< zV!c_kP58JTH#Uo6FyM?@uvO|scU zQA{>`VE+pr)vgv9fJjvckJPlXu+DT z;~G)~DX{9<-?jpf21ydq+9+1u~q3Q-{lsv+6R%#l`e z?o7?@PkaFiNpCB+3@J?08ywJ?UJw<7Uq)RH3X zV(lm&{ZEa6rI+2a8C&idZ|jHss2rhomYn5A+W|E}eQbKTbEiD}CvCNQcM;;>zq^F= zM%^S>=NsO@uS-+6PM)XveIRI)sLqv(nO>4!(Z9w#i`xhX&r8 zbv65(w0#S1#%*tQ>3LpLxHv698nwLmcTuIC8)HGC{g3rAW&^Ioq18M(n@&hH zYt>3j9O%U!rxHF*&+Os&-2m);fbeEeuqpgJ@_X>1h9!@dNkqG;?8ivK=0@MlSp#Bn zm9|!QdEX}E}BA+zaM;Se8U2s#hCxpEa zA%1prY!6#$O(ZZ~j~yNYu6sGaUs0e*R<{tZT|$aaCamNIVB zROwF0h;d89PqxoGG@v;m_ zvT;tF5*+X-GL9ou)YX!$?NaZ>TPnBF^o&pm#!HiF*H%-vKM>n%x98JX+hri{d)DPU z0an(t{W+MUndCN$)(;W^(~Qy~u&{7<=%PQJQgbTwE=g;2`h|oSkyBoli^{^4wvGW_ zcEd8FUEdIkx5~KRaj{;u>o_5(qO7%k*elW`$9yPIsf#boed9UTk|D}@Mj~Q7P~VX8 zlyU|!qc1uj5TJc&K>#O}CxTe3xXOb3dw;K@M{M?MqvK_zMMOU^AT~x%$7mvDNIS9E z^nJTVZN^*%+Z^_$uc?JSx9*+nwwOgL236iaem;N$uid-z1Ln6uld^}7pAIH>j6#O*S3xY*fsnyh^l6OtO?y#X~h>*<(& zi8-7(eQNr@JG)_C^_0WZw#&~JnKCh{L~KOP;u=h)g_X6nw@?@%{nOM)Nz$a9NTdhD z>B+w?hwjq}lB~<`5<{myd~Q8QJ-2cl$stU|Wv$oyP5#9S=RfzL0YdF50~5sXvww$Z zxvp_S=du_2?tjd}QsPqM7U72|Bw^fcQuCuD&V;Aa)&DwIQnmpFME3q2qFx(^rkn1t zl*?XPQ|m4Nvpp&D{H+d z(2w7}Iz9ehSmXWi9r|cr$0X)J@mpe!-{$OZ48zOjnyYeFa!E2QKOcF5D^!~r8wL3J zr$UhDQBhI98>nPuK4J%mGVznXpy601Uc?;+FtagNRDn1j33>Exa8!V!6PiG1VmcQ7mw=uPA6{H?A}&p9ad4<1f_am`1vgm z@CBlc=wJE*HJ}-6O(m!q2px;JH)9OudwgWL7}mKCR&FF z;IeE&qbg$W{M@2T^qctq!PQNTP^b$(lky65)zeQn5AlN@ug~c%C&V=TFt& zn^4^8M_21u63RXc1hPv*ymR&}n4NAn@dKpY?ykpdAulZQ*1U(m;qeV+BRvq*pOo(| zA99CD#~UUt%SB~pJY2@!T>Jyq0Z-S%c+fak>)Vz0J{mU#kh+wJw`~66Tg?#mTbjtT z==OuI=Yc3k4+cIj*GoQZOWr#M2)&>FGWuQgn#|JRHn~KGu3^_&rE2iumG$_0+&^dX zm$vzQwP5W_MuhG5VY8$jA|iF+=Cx1ggmJ$BJ0!@&8I78G3|*W)NZ%kM-PEwKC9u@> zY!N;rI6PFPzjqe@54HrnF~dEAyi|aj4bgq5@P61%(aO;5tz4gsT&yZz*~u9MFfl!0 z71a;?=)S`H1wY9qBlt9hcYkN`MKHtr`+r;{z+YxRvH>*LNn&?r@qO>s#c#Je15B@} zw4gmaUd{)}OiHD(K8$%XOE*G(OXug|Axp@1c(Pf^+D{@oKSd5Z0&K3*8K7O;-VcRe z!GAb9bX_4l&E$w^RJPH>8&&JF&dUsi(=T%xPdX|Tn;5K1l52_yXf(Za#m3VmqRzI~ zZfzzEVAb|qEjM@>mXUQ!A~!lW`UrgsyL*mQ3C!5eKdSeGUf(FR=)z>1&nQK`WE7nP z9|P3B=yDdDq4gl{!QQmdg`ko5W8-61ym^seYyt`igF%$gD8&2LZ zU2=Ch`+{YpDQ+)CK+EZ+8Yjm@H$y`e_CGU)zIh(@U-W5cLp~KMQ|q6$j{kq9iu6C$ zy%lWnl>!cm=6g1Y)!f$4?TKgj2;?lL7Hq4NR;dkeA*0{DGOuBA85DS3{?q1<^o z9-{O>joJfH>91cOukKMCDvG}uRr*U2uugz_+f(&6qGWU#6l`UkqWvQW zGc$hxWiq-VN)+t!c*T*@sYig2T_Pftrp#PYzGum(Dz1O@L|xt934i#J5VK3Tb}*E} z&U~xq+hah_d_e&%#1JC3MvYR9Tl~MbBf43N#r2UXy7JuPzpGPUeTl%2Chq|N0y${K zI;uKX;He~k%PRPftR|R6p@dez{30!O6+1HOMnO}oP_rpJeRDU;)YdTP7Xz2@68LQVzNGB2%MKzRP6r|VDCvR`qcozvoDF-T6y+}a}DRR6@{u*B|&E3$QgZCXAT$xfG%s2psEVLQLT>C#rgiFB_S z`W+^@M|awh+j__CA%2Ua&1|OG_CT-gCTw0kN{Xi2a16D=w&3X_TP*Rm@Uh^#pKM8F zZ{pwE*+pH;IPUxx7Z81B$zG5%lV|qfhoF?gO|JL&5zOVmSg#u$fYR8p=cygDQh!w~ z2$^r-L36}H{*06L1w^0!>RWdoYqGY3v2V+1=)ZgS5~daem?uFp1xOl>$D12}OU znpH2ktP{&kOC?|xTReqWwzq9Tw?IrI`}N1RF-9qNt-Hyp&;J?^1d z>K`p|4z@$F*};0T`lGKajY_$ezIK<%+ye)eJF=f!uG(u=)%zs|FKUL52a`6!0d_?v z2I`p?8xg~#I^D~c`oo(>D_f14O=&axR0JiZTJN`d0p22?l|an&=udd7fvwG|H#!^1 zve%!6!;CGXoZyYu4%^nkhxCs&6Gy-O>a!eSX2HEKb_T9?YqD!dQxbn&wUI=u(70O~ zUO0j**&wImN2Dcf?4*nLH(i6d7A~c6GOWMQJXPc)ivBKs(f(ZYcVhDpI73_Gb7a1@ zPP&DAq5CK!IukP@^s8!U&Z=zrxHh&YW>p7=`Ny|&#aG#N>sBGx3H1hZi2T6*yKvpl z3_hedjexgr))!q+*|M;MUcQL{-W2&yxBOT(+}lo8!m4F1`KNm7V`0(W5Oc##X{Hn8%%BVo8@XM>x5DnwLGp|$^eGtJ}Ea?FH8p*)I>|J#*b`` zbxy9Y)LH^HjA&H!m>R@h(XiZw;R0#5sJWKgyavHl1^x-gAIEaX0Dww5VA?kR~`B)^gBfoC)K-7t4CyaYll5MDyehZu?<&h>n7IL=By z^ACr8`;-84Y5!3o*oFcnL3)>S;)2(}k^xW$?7rkDv4b65${_RWKI}C`Nk*>j z3qCfetqogd$Pa?(Xtq-GmnX0#^k|UtCL_M}>4jdk#vU(2khqgX)u#Hg_3ittX=3 zMhT+iS{D+Ui*kRn#PpdmjY)R4xlF7ZKhH53_4O{_hFOptv{59N<{KDz|M+eD;4!Z9 zV>9^TC}Mct79tJ}C*A``qFgjF^D+=UgT@OPd=^?Ye zaP+P7Hl*B_2SGf)$>V7K1u2l50A}r{M+m4LdiV~1oL6NL9N4eMw0zmpB;Y#e?lrn{)1sO6&TU5c zp%F9ax`z@DF(=i&cS6|E-Inf?{QPaiO4t`D&Xj zA__dGJ=5xp|DfUZ5i1_0Z!F1+YEA$^&NM!FZgz6c&{n_RIrdd=n~2*mEeo?D4UH^R(LYP zP7S^-)(oLanHg3w4O!VSf4upUTT=DN7iEn( zZ-=YwxT0@e2YUl=$jc!C2AN=&eKtkc=Z72z+N~Vhnu(Q_k^|d;`ScmkB9NjA!!N~d zLchwTE*}tUJ1d)s#3yeA7D!(l@Mh)7|!*7%%wKR*Qr2`*yER9mZGt~(QtNkjQ~2{I1}S}@$bK6mC| z(c+JJ>S~r#;~Ct90RzAjD2&T4(gP3vdgyy@TOYdlMS8GNw&OQ zADf-x;JGq;ic-#WL$#`zENaiDf(1j^_kZ%jZTP+F8k*Z_2jd5;ZH3jIM3}a3k3TpY z746aR4O$KA4m@Cv%!4api3jR{ULamr#D<*<9ODAN$v~7u{mqG+lD)9=w6|;N*BGMq zB_Fd9bY4?#Iro<&dB1b3c1GG>CkIV+tJ`A~UbF9~`g4QE03`L7|nG)^m@z#!MA< zxSAsChj_T7yg2b2aO-EBE*=)|bSh%Uw?*K-$|ajTqjh`JKGU$HSKED~D&{j;hB8IlJ8z45_BPb*;qUM8 zyb(271y)OOZEGCsv(d#?Mz&{$c{6o(EOTBazxQFl@DzR%l@tfisq`8PY;#h@&~K~*Nwc30 zdI=6-7kD3L9&~D#ITKpMr0@Q+y{|>oF;uz7=^=gajObhX0*b(&<8$#gM~>{okO`@M zF53?_t?1+uZWyKOq&T5jvacut7FxZ~@_G}FKPLEy9|VbbX%u&1#)^zqw3GHBX@yY1B& zO8eN%d_TtS`_1@FMu;x^y??+ad%f&yMNc@>s_oT2w4$3Lrn|S6J_WpgG+*c!I<-eW zw1(;^XNm4S*=v5yX(Z||IMcA!gW;me?8@OmJ6~^n3%wpB)sxalIQxlVgs?u3asns-z z=1E##AW-~FTuzkee`~n9P0ny|!C-TN3EG!!Yj107ch9xaB`;qKc<(lra@dVPNJHOijSI7J20S2QNJev3#YY${$-}ay1)Em;f%N zuTluDnlO0MY`IoM6>;{FO{SA?jzsOGs#6V*PN@uu5A6n%0ird@f+FeyOmd_Lhe0u7+8W|C8z|Bo%PdhWX zrT_bUIJq4fCEHgP`dhzWI0k|5T8XIm5Rg#;u=tAWAFSHO_Vd3=AHx4d1+RZxmUe#Qp`PsiWFR){H%ix*L@-L0WE~E86=2`YlRlA>Hd1qXCRLadJ@l*4B6!#Soq^ zZ7mu%tC4@d)TCFj^S*%U-8R(ed-H2-1U}wQ9D>$9MHE7fhD$}*K*-u4cs9r5v`+*) z8jN$V%UpCZn2O+A{M%&2kGbnHh5_4jwuG4@!IAUKk(quMQ+A5z#Fg4kE1026SxlHw&ggOZ^+s(TN05*vkHY&AqX$lK5CjHJ8sZYNm5)#(M2F zYy`#HpeeQ(L(Li`&?8#VSEg%P%^Kxe`mgy$0*96)I;9_UUf-@6UiD;%$5c$DRoEug zgnQA=ItpK~@JVC#I(kK{$LG zVO>@8vr_%~cJ->DDHPKHX`^S`nhG-ge^Hhyfz^#{@n~64L_+1R3hU9F4jtKhF)0|= zmd)xi^RDr5b0UqWlQb~@L)&Eg%aR~m#vBk$NKUYxQ_Cn^)%jiGmOKMZU_sY%Ega|f z^3vU`ua??;quY({X3P|>DTM`Yf>MN?r_X7sQdQS$k?iq2yX=% z2s46enB_rG_59eBv0e(NP@a5Tnn%1(BnWupzdYaSbkvm3)ai27jol?{$M^5IWJ6;* zO_f{K2TCOwb65lNo=XdKr($oy~aXu_kqWU2AYTN)x zx2)d?0BOU)BA->R#3i1H{TP3u3FxzIQ*b2~Hf#+B0-68O|I&6e82mNJ`l zb+sed1-iYHH&^UN!=~D@%~V>ySuN)$j?HQEX?9x4ZZK zL&h)?k`VW&kgeVQ2X0v*t7h)R*A;~*R}gx&ESbs9^B+Zem3DZr&vZ0rNYT2;6B_z* z6Ll;*lSf6p`Vyl9_@6uWqn|FeI>BE}?~=IPcaIrWPd`S@z*k9acA!Nqw6cGlQ%foM7A zZVh6hI@-Ke(|n65?jY8^B?!Po;`$A2PxiI0 z#4pKRAHT+Us+B$kzPqhVbOvTdc4k{2F)24p2Jiw|K{J!Cw-c4tyG)V%0>-ioD9B{8 z(()X(eR?{#ggeIm%YwR%+n#o0_NSgM0 z-YVA8FV@YFsL}8_p4go-qV`XRV=)_};+gVtB4D);uCS)RYKyq}p_=m!mt?|uVR2gW z<2ZZHxM@!5m}>85vwcgs&VdLa%_!4r4SbCXJ6sjFKTT4dGGwxOEIE0@<>qX-C3&*; z%LvI^6IeR>so{2`_13HlUyW4YRvPR&dvW)ap--F$!h>L&q7m7_95W*QnLdcF@$~#i zV1YLOy_6)LKWj#aL)I9(o;*V|H^9XzoayNIU)Rc||Fgq!%NFpXQO=fZ&4wEjLEI0l z`WHvf@>O4b8Ft?rAy$GqdKDBN(2w+nF){>K>9N94wrD*Zx=E#g*{Af97rS4w zm@4{$_&}DrzBP&xdR(~|^7KjCA{_4bNHcY1!a%F@2T0w$7bO|7-Ec7VVvph+MI0t2 z8-8jBoW&(-Af|DDMce|oOGI^DopqltFEF)G0Y_`mL}Vqe6C!;y+rOPvmMS61|b*?!>%gNHnb&vI&Sm6x#+sY*#x&)&M|!G>ScML$^{YGRZHO_({YI9 zx9kcNlG!$obt&^<$}48tObZ?*rhc|leq&rXxFBeH#FpoDr3*WJjM+YA!fp522_+J_lU{z(V#hBo7uf%U4> zHQu{FFtGDWhzjr4IywSB7zXR}&tQX{Acx%{r;fp-nnJMGz}|KYx(amd$gHOlKlWN=FoSB* zzmh31U?VhwPS(M^LFmPOlF0){uMrvt+SA^B9YI>a)s;UNW5JOnL=Y-=he!tL@P(`;L26-Xrv~2okGEb9xatHK}R6pt#2oYL{u&M1o{th4} zkR;aFqB;s!i5z(dibB{l3EB^_^mg(%ZN|+Qc|A~+rifALu!## zv{g&Wa+8w6bC&tAobiYaSXuw6%p>=tbC;*?A$-kkz{P_FVfvGew)v#tJ$Yh}U)PkH zqs+DN6@6za8Ma{35}@E3t*qKh*eS$rq$}`vJ#)6KJ-!$e(qD7tV{Wc!v_dj<{6jDK zhk!l|L-JA-5OSQLfNO^(*ll zZcmk_^tqYcA6Sgw;_Olyy?241M!Ux^SAr4&k33J^$Q+`=czm->M1Z zO_fc3)m+Xg3hNL2ekuFDjrcCtF*eV-5#l9Juu(H++1-AIhYTSdmc|o9S8I(Z*PSe} zoueey#UfQ?J|$!b^t`V2TdP*rKAoo4-1Zvj zV7S5m26IY8muwBnQbFwO*3X zaDGglV$?eFA|Wc7IRC)fc>e+Ta?=B|6^9zCNdj$AHPY{bW?=T7c5s@EYm`mhXuPA9 z?Y@US#+1#VC^^PY(qyCyMK7<-hLaXsp>Bg@!``rWjw@(tqP0Mc+vVq&9xUjiWpkB& z8pJRRHmTh%)!a&*`8nPEbu`Pjmv@m9emV%HaRx^N@TW^&X5@-R?yn_ zWdhZ?S$jKkHSUr!v$GR(n%WA!Z1WY$lZeFdBadty&n*;wNxr3{TG26@Ivv+*iW60OtZE=C41tghb$R) z;Xab5d#xJJ@AEyfwjeZFCvy~UgMqx%d~i0T%I@i+KEVmaoq)D=ZR35YyZ34mY7~|{O@Yf`DI@o&D0zfQ| zF0x^e@q+xL_(g{B&$E$TI#y0q5rn}=^uIdpYyPbE=o|bYy(nC(if%}u? zyD-O|tquv6{KB+YfK{!DS?alv+wR#4JBH*{s}NXxW@!AmVL-)w+jPI-l2hz@{vzA3 z<)6EIs^AzaH~Xz3Aflm_va#rR?nK8e;jKAD6L?NjNgsZCd_1vaQyxir zq;*fbj95?R%EC_M>20_rER^qy-&>7ZQBlpMQ~>FHB_sLSpfD+)5RC;%Hz5O;NSZS3 zCfH2dh*X|TNFiU%mQc91Wd<&{OmC!M9LXo_Et)D@fREN_Na{NhDthbL*n=$Phy=T~ z=oj4?f<<7~CWF$R1eh;gXMfJn`x)d(uW_Ugpf6SsMf}i54%Z8yFLY4%iE)^K>`i~<}r3}0s z=kHR)Yws@&qOw>t--k@r>|;_`x<)U2+D~)2|B+MQa@gy>gPNOyadqjK@giN-a)Wym z*ITD;8a$b3gIOw(u|I)?`9yaOF4KSOYADUk9%K$7h0&-abm*{t4IwVl)uI&!6?2?r zeM}c<`b&C&+N}OpZ%!5qKZNg_&7!A4^xK)x?I}UcWb%S6mg{tuU|nJ6d@1 z(0zyYJk-VYZtqE-(&*=(F_ikVPF{WGYvoFc7t9|qN=2nB!~~;%x~~OuUgBLID1`;A zluEndf9+=EcOy-H{Hgiwe6c9tXil%EB=rcIM7zbOR4*1w=DOMWVlQRv%GejB65$%D zu2aqy@9%j4;PgZu)-WS!`6JB(+*eoM9E`JKb+5!~H@s$;DjPS#`Ly4m;gIv%p(f?y zwbZrV{)!*t=Wq0z85kw-n_u<0m5+o5XxhGhuYiK9ALXHK?29-95^Q#;d8R|Z~(8uEGx*spJUX2?f}jpfxC%xo7d1hB?R_Mv=SGt?*zI#A`prSGaWZbd z0M1N%;^a$Q7)Ot-Hs3B|l7K_#*j$SjB*n)BkIw3s zx%dVapIM`Fjk96P-Wj8Q(^%1P=0cOkpJ?1`!5ri9GK(-Xr8>y-R4_iuP{Wf zrQW|l_}J&okfu`r-LTL7RFyJ+u6o!0g^bDZrmyIVKx6k8qH01fYh^X=nT6;V>GBC%-q17nLj|K_V;%xCHjHm>j8cjv5jsfLz6sEoq{`RRwyB)EdG}uOjfX;mw+%5<1sEn>BRBKH~m2s)ZayDepUqLj2$C|B!FRwMKtcMWa5=0dhDBQIWtH&_WXiWu~<=peJWhbu+;p!w+hR z!_o7uX6dS8x}FMzj0Fz%gO6MJ_fkzeS-cYPzh5%&F+;IH04;I~gxf?h!z!-_lhHx~k4 zacTs1f`NS+FBTlg#x`+WEw6rL!Lf3fy{m0#z`!y1`5^SY@`4*rTBcNKcXgQeAY66Q z!^8_B@RT5CFsg}U&GKM6pchp?PW;W`ocGjc<44*$Z|(=5Q~Z7VuEp^Jk;v3&K&I*F zhE^>h+<1|(pN#{WsoXqa0IA)8VB*gO@e=Hj_qp%|(A+k3G~2@@VJM||5^jjUztbfJ zp$KV}vz}w8j7G8WoTMGtGS0MZi3*l0d8+S{jS|IdD81Gd8oeVAyq46Bb9giK*yD~h z#Kt^+Sfj7BSxOC2C##qW0!k|T_H%^{1U3D`L8&4xCZqUj31uVoYFitH$$V|)F8s4E3NQ3ooy2{%wT zvOc1^tzgUmKOs>^t5*~qhr2>P4Z$e`zb|XzvI!jG4i;>FNdKT=NfEhZms{vmin~p0UgLleAn$puOsgyK zQ%RSAYdl79q&T{!3KVh0SQJr% zMW+dy05V!vF$6@E5F!Yp4AVw*GJpT(^hn%`ZG4=q_$JCj41 zo^lC4eV^oD7gR}2?#+x)d5TGBbVPgBFy5pKF5_})6-u74ZZac>Y)&8zXfCp<%`R&9 zX?Ou|0WWbw#v~fk@1N7p7ykF@JGmP1d1>*f@qHY0_#0aUQp+fBr-FD6VuMQW>@eL? zJE^?N=m}d>Rol)~}vu_?Z9t zn=N9FSf%9TozY_uje_9{V#8ln*|FhrRx=jewJVrR5iNn)jge zy?p}rya;Oz>BVAQTo8=24^|k$0>&t{N0G$%=2B~e=zOy>3lWTWoI9WDZ8TTe;Y`Y( zI8%E2p))SF;a2stqz&zz=aoRViu#;qELvQCUY07G^x|}ScEHspda)XTrm;e{P(IeNPD4}z-LX$& zxQUpC`e$YY%s^HWtsgSb%oizNa2BoZxI3S&+W{Pdbp#LvjGDo3s;nYbcPh6_h?rb< zOR}gU!8;lCaCj8ft(y;dyTa9=7I7Pea?!{Qp}}Y|$J1|PpF|nAg>c&kso>ELj?2Q@ z2@czGsri4E#2fB@e2pgsx9- zmC<%u2L)?y(R?bY?NN#-BGUFSTAY&{M1O z=LlL0)&hqsAC_hyGK5C%Ah!gUIM1w!Q#rPKCNbTq49r(!AM^!L{ruesCqw&2t|mXl3gNW zpk>5rBSp7iz&7_vN4@K5`EAWv1}X+yelo}jbukI66dEopMyXEanZV$2c@A%*gBZ0w z<4jVP6lL|T`MV7j1&=kTRDKsZ`A4P}cEGn~fkhdg$yptBc2^tqL4CkDZ1>v_{mPI) z0lQI*b;`!$DcQjO_pwpX(k#+Z+5y*zy|2uQ^z=)*25%*DCNncl?F#}uuWA*xEKvl( zVLaK`;@zi7mYWe@1fQqu|L$_Q7Uji@gjDmk{c0A>2nujE%o*k?Fnsg#FM?p&#{2h@ zu?dW^+$vx#*zDApQ8Gb7w6tR|*W`2o5HEz6 z7pk5um8CMFXSusR=;xK49h%Md>J7d=MR>j}Q7;d986jB33C@uz1&fX(F^q#TTBvvX zd9nbisFer)aY?RY-vxaog=Y+Yy0jvUI6ykH=#k?ICZCbDsR{BkyI0l3Z?F}txv z@ww~M3y*sQOx%GDaUC;FK76Psj^ac%;Za@co3WbIa0#K@y_G+5+eGMc^DKUs%p#Yw zGz_0%9*Zl7RN*`Y_qR}!+4WCFq<#iK`6{k>ib>6Dej~WXrX}#*cs$^K%(BF?wsBqG zL3sw_=uq+s{ZUnlxm^AB;9SiD{Sa>vZF)FNKPmmM2Cp-R{{qUfTAG0OcvwSY3jW1aW)lrlw%sMQq$ z+_NTK2CiYf8p5MULRNi}7|qed>$?Se$UzpWw^&G|YGW^T_AJDq9aPnpI`2JxU!QzDxzY`Ja}d0ndnPVc+0#8)-v?QJm5@{BErA0`ZRp$4`YFUOi`Rjj#ro3 z%#pLuP8*ym01~Ai;cjCF?AprK1@z&JajKWpw74bFk>fa{D2r(czt0CCljhs#h3X!zVAnjnZnyKx*P~LVC&o|78qPdOFh($-nV;M#&x-j4B z_z(#P23n8aKcUsg=k=FVx$7L8dJQdrEj^jI5_ZQy=8l%0bJ6wMISD3GU76$h$-&cRH&aM-{^U@KvjVX z1}5%G6}IY2Wg70?dD@B1W2u~?>+-xf&X@x(Z4RtiR@7+as^75cUocvt2x+}K@tEKI z0=Ldea4ri`2)i0PJxj|NS;g(UojZTe9NdO~uZCI>Jy0rF6S8MSAJ(d;&&NnElFxc`XAgqAE=&FNeB^g430yfUSvaVpH3ut1Jqdi?hI zhH`n=J^AM6Id=7;XD7U?_0B&-Tv@*s#L7UUHK^4;8jeGjm z?TQkkf!ctN|#d8T$2eF5oKuq*%YcpWK! ze9AC-SqxPf`r;T>?tfmc>v$c_JMw8`?|}B0vhRpDp%lfTC!zzEq7RMrpoVBJZs-2b(q%12vBs=`|oTJWz64*%u?RM z^TCq{8VYIUOePq;G>$OpZSHhCcFM))TKK^jYNk9%TnZ6JbUg`s8f`(}Clad)_l)lK zh{cH=A#@ssWbtg?x#&L)xf))yW}?zgqv^34ET-mK%y<5%$?Nh%(O6ukTLKG=W1Y#= z?5HzLQ^9FB4}h$1Mqffu1ToB2@hz?Q-H-6ClJ2eATTMn5cEGHS9G5;1a9IdNWC%9( za*S%HY%hmTn2ZeM~?I;QX%=fq?b@7FnE% z2stH)DVidM>F(j7tnY3vsXZMMC5{svY|O?)L}MTR^V4t)x)Pr014D4nrET_wNwtcRs-b&-&Ebe!`QdP;CM!wzVJTY8<2z#7*|P3_nyM|*?IiAPXc?uM`)(_DrERULVM|U z5V4QyFTzV&Mo+lzS?JkG(eabL_MV>Hyhs_T+W`fL9ve%7jtY^sgna()y3feM&8jni z8g=0}avWpW)BOp)MLalX?^m#tuY{P2&iR1eFg z`qAasbyJ>wKZBb0*6UUy9j^`p21+R5!*u#Z4pfXr2Z zRoJrd#?*1vg2=hfwNfG)hEV&(Zygkmacm)AX-8oy!dK&jFiCj;<3gBP9cKw&RKdhf#96$Hh&~m&&C6@6G z=%9U=PUp?u93G;`rnt*0e{>+u-fIVrmf|M2xcR%~N&!2LCVPp+iwr?WZkaMvYM) zC<)gO6t;EVdl%0~SS1{`;OeoK=PU2q06TLZ98YajRaN=if6?l3m}0)u)6;r11>Vm;bz!Zz?(-qwL*y3)io`yWjN>s(W1JHUd)MRU>SIZt6~!<*WV)W%d9aXy}4r=N4i7OUE_ zUaQlo3od?J?!Hjw=lS}GA_9^UA^Y>nT#hZJ+tl0c)j3?5x#!_?nw@sSPi&|&g72z! zNhDb?RRhR+Ox-PglwufO$3X4`3~*O$=j@HPDHIQGGjf<|sS>nPyBqWP==Vs?A5?bqr;v2-|Y%@g1ni#*OX9LqHhm6fF^|>!VhCRh& z+orCnE1wutbp!;SXi-RUxxdd*XiVp^SGO;SHUK( zKOryGlo4;TLCe(>=UvgfeNXnV+qr(1XGjhWMDOlS$>w%5XaAJ_aqRBpr{O|`pU5*9 zduD3+ElZCrvH*9?@O^&e(ZI9@OGuG?6n~gvy*~=0z!2zDv1GuV#bmgLinw#>a{Ao* z__B|-TO6$H?WfSAD^d9&?2SN7 z_b%YoK3|0`CpG9(3qMpnE&JHZ^1S$VX4|>!Afi_!ck=NjT*{~SRJq_R@*+XVEo7T5e38eaiZF`4En*YwR#8D{G6ap5Xf6zc=+1lpS ztj?&IsHcnlNnI}>FN*fBrD(ke6ublnFxx2#kx>$na1Fc4l2QK*$e%CD`Jhv{0nS=Eyo z^~uQbMKYd4-s{rrMVHrenmXl@%xgQA`5_q=f?yW#Ebp7as`El~FR!XTRjA6FMc2Bv=>Cx)@HuQ6=;DLeL=5fX$8$Z ze<1T2BB;IENsZpTgy6BlO}7SLfaA@grjnm_76?pZn_e3msuqa?0p;^u5y>=+$vk>9 zBcWVYej4@jwW$F%+P5$PRUL)SJEp4d^UAQ{|*`{`L9Y;sF zvwJn%O2$^SdW!Oh(`LD++`8zDYE4+laQy9E)>O3Ha|q=&b|4U2`hUjAbrk?_7o zx**a9booFO*!0}l)h}W6axsO^{_`F({@>7v6jjl}{N@(%cU3Ayw`Yod%(|+$w?5GO zX^#jAhql8omVll0Yapb0W!^0$u&uppmvGi}4J(^~D3wFb+E!Vle0z&4o>gODJVhHu zl7LBkVNI%Kw>|Oi>PG}82|#?5AHN-IsQ`cID$I`Rl#Jk;{zPF|0 zjiCy)(!JjCJ0BmnTzq=PCjb|^rtdFzk9#O{!>3EKe6ejnwF1|SG{*9RNFN#7%3xHrvE{v8vJP*dSdb8kvT zjD&G3)B9JwsJ+mGcV+c#ZpSqyA(gcwCt_k_*LSFtsr%@FV1M8I>P_0|kE zy3IWkIfKsqNY)}Iu!nhdO^9);>?HoD7I03H+I(kLr>vdxum&Di6HVR&q6FVpCHcu; zCFruO>TK+B=fk;Ip@E8-U26D2Px@{r8jwOzk)Zs?XS&^G4@P6>YA~tP#IZf-$sYMb{9sGs2EWJ7bSwk-xjKm8&Zd8rtv{%!am*9eMCzl zw}{;J;MMgn)Hx_^WYuI_7>#r5kKOcp#lWLGPJW7u@!|Jg1vaG^wakFznsuJl-m@$K zSs-MwZ0D+D1pdKo6G$YzZ#$o*`bEk4jZLT4y&gE{S)_`2rZx0Sc5#V>D@!PH`|kip z*bKTasPx=u>-|3ZNc;8R${SB(=8hE_>S^=ssgXZ}W$y2%-}fxShHIF&a-k*61x+))blFyQ0EQ zZAq2)zp!h=QOJY1!B+*ZRuM0vmSm}O^41~~xPM)aKYr^_1wN3w$4og{!;??(E5M%}q#XH*`%h(6O>PIxm`5KaWuwR4vFJ10*YZa^;gHyJ zs}rt6{8r;P*I`a}^mjuer73r>Ytzfz6vw(QX)7sUSc%QF_U7fGdo1ZpnAWz5aRt%0$ zc|LAH2#o7e3ep@`BETcRv`MDeR=iz~q>!2g;jXV{wo#!sJyKwLVxh5l-0q~Z80}>` zOk2^nCnaC$p*9{S7C7r^Hn2hLB&<{XK5 zv{YpNaN2Q%J%lIu(|>%r)yHM)BFNpAPW$LKPn_E{u`h%Ul-L|;f3IkJtN&S?c;Dvr zViD-twc=rQZrw`u>7l0NdYpR=@BzXxPhR;wW^WMaCld2zckcxGP2taN#EpwG1xu-pOY0jT98?L|bDjL7v>+#1`yCf*C z;==sBN76GMG-k&*3v#=k(Ere)Dwfrik-SX$mwf19N?5e<^5yUM{}|0M+rBuXy&nRI;hNIEgP4b$33XW(EdUk8iS}eIOssTE#XO z38NhL$CXi;tNsolMXTed=6^CSYZ0eg=IBY=13_1#GaF_EUF&)((`LEKDxONN@)XlL z{rlP5%!vhdKAu&N_9l6GiozP@L(A~XrGt%~&d9>fRM3W)T+!?T<%~;4o*t>b$ zdrVJ@w((Xck{^`fbhp4(^QeISZjh#s8P7O5BN-6Pjf)XWC=riXozi~>0t8!m-({eF zaNK-XAPv{Iw0^i|uds*SzsFEkEljUDvpm1d5;>)Q`Fc=B#vF0?d=Cu7i8Z4)`Dkp} zO(n67*Hfp-m81l-+uze&RP1oi5nOPy7fAY_uL3vOSg;QTH(s{qK6KaC$(`%-!8gO` zTx9$G%|*2A_py(fm4_=2L&}?(LGBXT-q#n)sZD1mW8}>Z&@}#UO+U|)+N-*=11?!Y z0L*MmTqXB5Oz7g;N39ztZK<)MZ#)B51Pl7#(RYUykviNHVeS(2cmR{waK zB)D}BY73f#E!NLlZ@qdqgM1)4bz3<2QgEz2kmfNrH=lJ7d+Lq59jq43AiQO?j+bv8 z^eVXai;E87xw{#+&x}X0lva+Bu6Ee4fn!yj_wej+N!5f3`(yRbw}`G3CHi%co~fWP znSBMiF3b^Za@<$Z5Em?>Op|64pUGJ2m)^l2(-`@#itVXi*x$4c*4Hi_FT9Pg7tvar zm>SqEq!!Z~JUX5wP zu=kT?Z}p4qFpd<%Uj&m;O|H`_%%1=Qy*X>^Eh$mYz9O^#GRA^9pEou!mEoulXwVxx@a(N70*-1n>SCu6VtF!x$*YI-3&%9hZ*=DGfgw9z%c zOF+042rMBP?4(FoI4fxyu3M3c1))hz+Wc(w&p`0;Jk%i9r-#UoVWb*S86U{xjnA6^KDQWsoQ7UFn#|Qc4(U1l!DbyFQPyv8xU3Bwx z_$+~^Ap}Tp2@oK-yGsb#KnU&-Ab4Ryy;M%ymLvVNZ;O?$_@Xa&l zy4JbYK4<^h<0suz*BDi!Ua5MYTOHHGdp+wOc#-nY#RZwkJ{-fX#4Ph$KAh*HLw6aD zq=@f3-YJf`pNb8smd0B?4t`L$)5hzs%suuhG$Xs;jseCN+R%gE?wp zQ)QU+m%(KjQ3$7*cp_WT%_CX>#P-H!w3FoypYxwQFTISN%7QFlJr%)Sg}K++h^Y^H>x*GXsxfxeu)%u$&-?cHLesNNhH=YD%~?*0bjpVHu65 zZ9sGEi~n9-?4z>o(*{YQ86o4?8Ia7-ZQf2;z?7))wy(c!xYL_Ca=yBpDyX@t0Uh6e za){Y)rHzHOwlq*tlJWiuNZurNHXJ|}Y_`)MY+G4OIB(Wl(R&-bEYN)HTS;kpyW;3^NWvc%9b2(fIDPOtAJmQ>YN{`&p&2KKX? z+x^`c5n=1R&00l5zrjfO<5;t2BjJPTRCCCFVu`q)sX1Eifb7gmVig*8u^A-f=6r*- zMS_;Hj0B`vG%5fGR?fXa!{w%O;c3bXnVDM{_F$gp-Yoc}|=(4o1$~r#( zMOs@SZ1`Z*8vBURQ1Z3V;Kenr0^F|o^t?XknJem)^$4-xEmiGzAZlec)K}aYP8YTc z0H*lZvE|{I5IOL6b>Mz+cdpq1R(56_$A$EF*DJp{fb8P*LJ7OBBH;0054e7n?SNhn zAKXu#QTS~p-R-}u7I3ZDyFR^*xz8;N4=%UR(si=?#Z+!H;B^2NAA|WTz`ye1d5i$; zmd2jB#GAU)7yq^V;<=+upg*>RgR4_qoT~E;-cfCkUrpNbb&KiGeiLdv*NIZ=}Is2o@!E2=Sz`aE{P6 z^FhuX1QCkFf#B4jg!BXUjSk>kG|$?L;U;kxrCEA+??q_OpI+uNkvvvbJ;bw-D0+ZD zd~9nj1a>B>4USW>yHNTqu9S&IUlJw4>H!-+HGp)~SD9V5$BU``t z@fRDpOyB`Ut0ud1r}%qQYBw{XM$1{Hetm*-AUufs!oCrrPFOw7k&+k-I4L{9TgQCe zOmwckiGQG*QIL>>ZSS7efDDY0yxK1^J zvNNDjmqq9!*hD1)dikx)%neM{bOip(L#~?gU(|B{oeOZ60k)n1G4`z;Vr#%lF-(Fw zSQ1C_>h%_{OkX~s)-rL(iG4PNa8&aEzPQPd2k6fkoc~a z&&>yN_EF(QQ8rByOSgYD>zV{dT_3>ldD8txadBEa#(hn&K;I|{6coEHC1Z@UZ zEeg>d4a{jaFmK}B;8a`Fo>za>6g`?HVcD_R2iJINTtd%I;5r6sQ3?K34JmohKd-uO z{%wtT@_ZTOeIQ$O-g5JZEkDig0X-{hV2kA=h4KF&;=n~0!bO8#TFY)yY~UCHYziD$ zO^}&8m@WK*V;j^5-h%UNxxw0@cQMif&})TvMY* z>_WaYwqQm7AXncEw{o>+c4hv{{FeTN@+Ek8nj1IifD$D6wziw0kgr(B#k@T*JbcBI zfXnnKlJJg_hs0|tnu5xzUhKBM!h#SJzo@6jYDVQlSjg4d4U^OM&27@!-NOQjmu92= zL$RRHQ%w8_5GP{RN^vXMEjF%49PFKjSZI;7dccJ%$;~M!Lp`(Ty3doA8o8gVA0E(m zV@9Xet*$0c`4*Wp%uKH@Zc5MBTg#8XZLgyX+lx7=omc;M-^96}E0fa_lzt|{GmOX6 zvRpI$EK;RCbTPH%dS~_hxAssDJIgh6C}}D!_`LN7Vf}ii!kq317rQ6fNEmNAVg%1= z*z<=1;9sGI3$=T`b=$loV2TiGzr7(mOybL~0SBzdcVjy}-&h4bLtHnd#^%QL93cal zsB>BCxVpjJDvePO#fKJ4LY`(G`d7n&>q3u*R)s73TNAlUM6De|vwYl7l=th$guA!5 zGxdB=K&(ku0D)k}4~?S<2t5lpJ&wdu3moWiNK>5Dn8 z#)==F_xfdtaU9YC*4D~QS}#4jxY<0eE?h@<`u#ej6*k}=Px|^(9i?D^Hjn3Nz5ZHi z+i;H@O&ZWyn+IbO7tu$<))uR@^Hb^ViOo~4`4Q%Epn^)Ghsg*-z-=jO{ki+`6y5qk z=VV0AJv3xJ!kPm+;WJy^!1^)C)Xe(2+`;ONl@0e3-P-v&UVP^%U+S~#arg=gcwBjkf7{-litqTg+QC~X210Qv=`|J$m)at#wV75^H&35@}G@ooA3T) z0a?}zNnE0LVy)lWTe-68Ii?+(j9fia)XqhyLs;U=c zH9U70MZpD(I|<(vT!(})bynN12SJ)g!U&Z&VOfN%vBU=0R*IWC#Zqp0|p6%;1 z-|M{h%H)132Vw%r&4RjKwbu7u(wJg0yEj&H?|CF09=L)=B96n;hMx_2l{!Wna~JcR zxSxQZO8$UBJcRR-&n)8dHa-tVN+S2}ICup~kCZVe0sSW1ol7yRCAvXk{ zjnZtkY!(@Fr}S$^+8(7o`Q7LOm%wES3o@5HIpPRiyYrBk(Ky3(?%r(~9d9H;xfCGV3SW4ISTLM>ej&(mGr3H4p1W<=|5 zcgyD;?)+PJIvNi_A}`a7GxSuq4zfSc$r$>ahRu^+D z->;8Eh6@Fe2zBvpj|iRXv~^Q7{CXU{YhZMFAHV2Tx}IIf-h~rSud_^shwEA5CA$xw&c98TYKXpMCV0=m0P#U|DG7Fd6whkVU!Cadvt*eQ;w5 zFKNHPwzhjfUAyVXUQcr+7kW~8YQEaInOI7FuEE)Sn7Cde-gR5DXW(DFy-8Xk5{d~I znp--Z*rpn)TyN!)e(#mU?MbWs^zOL=a(4{dL7%Rkw(-BDjQ3Xz2Zsjwz7u2%-db?z{-Rp?yD)-*0x+xMot8IG z_NRs$A2i&tHy+>7Hj+@ll0NWy8LFvbTlB6dt=*{xDdKDrDkM-kJXdx$-991SP))1q zman3oF-9~6_%@+m&u!8Ls-~e%8+N@Yf>}QnetfKeA`-!ojHMKz*HtvXN9pB|lN!62k3f9DV zkz8g_L^4tQR8rnqL&@Q0s#D`|o{0)jx}+-{QjdoILD3M|(Z^{#|Dv~eN_3H-9it79 zZ{jJnwQa-sPV}YaLU+XzqL%Kd-`I41^h=IGZV$itUfoUrfSYq#)D+_L=NmF}T2CW|pji z`SwA|fnN3g#OU!%%flg;F!B%^p`^c9Ui3{(g+uR1Km^-bzsuhj{oQ=uy)Nk}?w3Cs z(hL+{;3xFkF{x;171<~~=#AC&ec`Dwp&gwKM6UwD3D@o-?wegD(TB3?4E$NIRvy&X z!{MC0(p1qlSb+sx`+7fRG{ABGuHP9E{=vt;k(y>hDy_u(I?ikKwJ*=Bopp$ak`x@sLSo0cer3jMcqGeqp)eZAdNkz+U*!up8li zmH!+P;lx!3xp9z6Jbg!R(-i+A@S?I2av3wRGlNEnwSx`xx_{K?J#Z@HTG_sz?K&k3 zi)%1ovuMqq?R4%oXN{XIm&tL`Fd&H&Rs6YwDKX_pA0N;N&^m2HNmLkr=T=u>V0;7Z z2m;50$Gb9r#s7|i{2pY}31Eo+Az%%pRBMGU)t$0rldmAAzjc#aS!X)c+{MM47`rl3 zqxJ8)fP<=F^XJcYfBnfTaa3?NN|?s3+&Mvsv5C#Xa;8*rCT!!Z(a}5iR<^UE0@GjK zpmUB`a}lPUFDq0gUzLgvwL)yr)#)zZ+?tEt&@F34@>oG^4)t{iO}K3FKq9(Z{5|cV z2IR$N-{RRFXIO1glKv3&CQc*d%iZM zM2IK!s9yXAP8>L@*^-V$ajT~Fx}(5MBE(?3EfZCo)9D=>0Rzg?g`DGTl9?J&TJ9gx z9L;d7@+dThX7@7Pt>{=(^Dgf1`_#CIpu~*q6n!#$qUtqDI&8bRErJ}hk60|h-3A^m|DVxUzUqu9#iN#kzWRQU*9U#k#QZ6V4B=zcDVVW$9|Dm(iL6T1dRa{W5bpGU0DK znGx|o?!8K7oBGo?O3MaiW?mVR?jfO+l<2O1vrP$YSrsc$i@y2xRW_?*TP-V5_#@$3 z>HP300ZMc(pP;ROx%(M;kh^3+vY8mEQa$(Z3U+~}jd=PJLzNWxSr$PhzY{2XA``2v zt4!m@*2b2TXMh4#u7UMnvEt5Ma`lwv&x1B%I zu~=BQcSB}y9P#4vp28CyE47L zxWEOPT?wp7@Y12UXgQO4#-ES=%|TK~*&kIF@q%dV-tO4p;GNr^JA84Xw9g|(`*$wD zX*ubfAgMobeq+ors-Ls3z%11V`UX_hna@nlD;Dx)py|FmHY9kqJvLK*x;@~v>L$|{ zPVOtennu0s^cwtUH&c90tpUY;VJ-qP?pIWMOoDea62S4NN>a*rvh zU%vaMDjJ7nl~IO8r2|1y64Sx_B_a<0JOF6r?pyz!Cw( ze;6PEpJ+zE0XE^E>;F25`+p-9^{?I}{!aifk&hFx09PSIqEs^v7abrbL+?1UWb3;z zrYK+Bq6ner+IgiyjRY1hCaSJHjRa1wp{63Vr+&!mmdI?~n#pv`eE@lEMO%JEt2jTb zRcH2CLZA`&kCrMC9Oy6#HtM|`_1E95=SIr^z#*zp5#9qTpI_C#Y0lZ;v8dN7Ss0af zSA8MF2APC()zx?l0Ot?lh&KQV15o3tSTCtdAAph&_;E1rwJtuQdC9nqbS}80s@{)1hpna+TWa6?Crov_#7aUpcioJC#-u% zN}7CANQk6zzEbyT=7xCIazi=Xi(yWxWmIfV$p3bET4a1qjdL1DD5F$ij}HirQPb8_ z;~H-D{pn$qmy%_$z0@jDI#&5wf{{?K<{BZtOmv7;cgQYqmMUCC*O-*dbaJRs12gvokhX1UK_oi)3?o=j`Svun7H)<6%KS#y|o27u_h+&;0-x=={4KGf^OniSlN?m&;(5jolR)fgUclg zB52hdHB9!eQsJ(;@ISyOK*1aUgB7M@ef6n8xda5CkR{I zFNlEOCkNn7SQF&r9X4Y=)UT9e)8VmDgOgiEKmJBqO(yrkBsvlmBcMSiugS@>R zeKOYF`6wg_DLXv8H3$Y|kF9L1AZ%PDKuO7~b@EUTJg!xAtayN(_zFD)2SFC7Oxn?2 zqM=6!|7HPWL{?#p3MP3UQ+E82ff+wYeg{P(Ob6g*%Z;{|cU{t|nPlYpnOS6HWDV0$ zBw#4rC4;2pFT7qFu@D3r@%cv)-`Wg!etv#0X-{3#+1y<7`*%@56`o~mtf~zJ;+>qI z7ROEi21TEs! znwpw4MInYQ{=i)Y!g3*4-vzzORWSO6G1Q1TO5}r~JXlQ%VAFd38I0afH1sk`eYcd< zmkq05yeam28O7{6?Lj-SSdC)euWi_0W<$xR7qr`2Yx-menfgi0GIH?x`2A0BG!U^u zdxKRLj}HdO9#EMF!D9&_Ky|QQBbSLjmV79J6V81g>UkLo&42nTLbx}>{ivZEZKiB{09Q=>3&Wo1K%O#BYKY1I0-!t->n^S;? zK}}B|dWrQiZQ)-!8=LwDEI?_Gu?j#`bG9Iyce!C7a^Qri+B-VP+B?X}$N-?)ZtLL8 z%ftTH4LlIVx{6VMY`YvnwHP`CChY$qWpBN;Zc;&aWp)_2+cvr<6mTMkKb2P?XcNbYYoHtdTcuc?dDcs$z|3?MkR@+Ng0|P~_dw2kMC+u`X z!>GN`P<@x$xW7HJ?{xQaGtR>#pYmrAY*3g}?of@0ecZ_h+z{nepM|w}s6*`^)QRyUQtuD*m0*o;%s!Z6HuXCzT&m z_-zqG8`kKvQn>`JNy(tA`?PEfud$1MhFB*@cAu&H^+r)t82&3fW{ytWw zNexUW90Tdhmg!tM89V91fXhVS)<@x*!lW-r4x%9Up4W{pD88oGU>FK&%vHE438-OJ z706o%zyRlfWk*n6zQ1a<+zrhki+SkeJNgDRwx#^_HT5SK!t67;6-gA}jGrO!M;vVI zx#{_>+pB;7!*mSQCKVdVFmS^|3+Y(gK1?t4*pQ-@rMz5 zel;s+WY8b79ouie#6bUC|IJSEAgch-KNZ)1pno_x-OmG{bXDzUm6tIbA0K}#VZVR^ z42sZ0%!yJfdXyhP+dpNJUP2KZABAgEYM3od5oTPtYG^c799PG!*Vi@p9R!BrV%+@_ zQE|~X2P<3v(&K(b^e%^st5&OV`Kz{O{M(hZt3gWPy`^MJbo3UIdr$y=l=)j2lK`Er62e{(WNGt zT2u4tpA$v2^QWh<&W?0-a^}DAyup>&bR4;eHg0{&ima=7H~`%_I!^!1GE1gj+$1jO$?7NQ4v7|!C)F*z+;2~uL~K##8Il&Lk< zF#}`cd2r?S-1$;r&+uSk)LLZ}Cw4r$_F~261EJOA!HOJ-6MraE8wb|D?78C?Z!i!o6p z=|a**2mYMdbe?Slh{;9Y1&)kLl<#G|6|KVZ^0XN~n&~bqRgqXv(-ttCT<_a*f11wH zrPG!jj9>z5a^=HFz?z(^s`W2$8^`1s1tv3lSr+tV1dGtat1IaROGfqI6O3K?DzLrY zg0K5x?mG3{r`gzWBCxr;%yxURy^9GARxszICm#eonbt*k^sG_nn2#%OKv45D;I z<7wU#M0N4`4Qj}B6rxrbcv?1#qTtuI?#ZiuiMa&|ej%Fhrjqjpn04c3PS3@Y`=c}n zBvw^}UAQGv^3!?#FR>t0hU9#38#_+xRJwVA5Y_SsO^#}{alB9hcn6mXcVFFMH#4K~ z9An8G&3P>%WTnAtENev8kcCJCX~5GiU_@sVKSzBzsffSQ&}c4jAhkR^`#!tHLbehS z3aPz4)e+^3weV#B`NKqOc%5D_uX!=6Jshzx7xAoiTC>FJ-j4oHDy!;bDQaN#+o!HTxE_Q(Llh)8kgy+*O;tyyB6wOZ+qIrCFHwr#)>U8Kre?#wiS-;WMvfY@6 zWTd z$S<6mSv0Fv>{<=Fop)1iz$O*;RvG0){(7f~3J3LNrVXxwx^c$6qs(2|4t?XnDX(-5 zNul}$y?U()n_HZ5gy^N?qEG=DQDN(#rYId)eV}`;`g@{|T&llAx7`d8P(|5$!YxFn zNhu5ED>IDJar$85SOQnynMf=e)o|+*?RDTT??*#n%|Ox<%zaSKouqc^C!`!FogD|o z=G?ApoRy-J&Nyy+=SWu8f=A4R{+6Kx+oh>G&_Mq-b$fkIv-Df@)&*qWwxz-z<(@7z zF4(Y0DD@S}g_ZFpb6R>v0(PxMDlP#{c=;@~;FQ1!`h=RSs*N6uDSsA%cmTPOqfufU zJjeW1;jkyRJ?W#eN9k24sn~5;ud2%uP^A`kMI{L`*=7_nkX1<(JLZ&eusTeQ4RqxGIAy>xHR}55x*B23^=8A%N`y&==tLx0aZ1ze+JHVS?P9C{)6wu0e+Ls~ zzDvJx;YRnmVs2T)1v=lWs=&pj=XJhhK~MvJgsJOBG-Lg$XPv zduB!sHOWh0pQ_XX#3xajAKnns$2l#DG49f~3q@+Ic)&m2!mjz%%w^4lYD2Bu@jc;L zFC6`=Jft9+h&a+aol7lCWU13slx!snFfCn)l)MiDUGwH$_)#vEgUH@T8Wp~EOsaD4 zqK!7_(d$q3Z}yIci6nPM@3NH0L0zj{E(EaU6;*~;bepajO`=4|9yR27R2}{fY0YNc|)- z!s^{^HitRLs10X*Gsso}gTub2I^Ws1&jD6Z9zMlo4A$|K*D!Ihg%&XCSkVHJLxDRfz=%?4 zuG3nNnR$Fi@=EtM-$8TyD4sXs#A19kGPx#e*1Xn~kjd&cvfnDx$96}!xYU51DSb~{ zHa#dAY8ZvX76Qg67R!phJZF8ut%f?dNwIX6WVA+uzbOQPiNLVL(<2q1HkBi|(&hTM zdg5M7uBa$lUTglaD`MtljKkhlV=@_%wHSF9HtR{qGbPG1&d1opq#=vBG!!9t)30Y* z>aOXHG`fb1;-`tzEOhdYhEAn`DsGBkR{w+Y=iW45v&7e1Wp1p9oWXKgo-^9B%JV6r zm|Q)A;y9fy@DXzF^P17i;nW-Z{}@ocs(NiFW3SF5>#8`;sxnk7J`fUV(#aB=SS>b^I@cxh z9jl;CYWFLcq&53l7brpH~gl;};iH6at$hsEseCg}!sMIC*Ng}Vsxr#laI5WX; zhw)`uHVb)sqcm@mh76L#Msn(6b48sB!^E4n?6u^3!uz`!7B04bKAI{n<5we%Ky(_= zM>z66`9~B@-}z<0X64uBXZq+k%hc2tR{W4UTiYqG6#M!*yv0v{(dx4oMNC1oSgUJ3 z{#S6q_aqWkv!TVmYx38pLaRabirIdt)eO7?`+sPM;&j}GRmV;8Vn_IhG#J`aO)L^6 zZ`p5u)lp&~$U_f*c8(9GL38-K8wQ{c9rnPjpsQafC_M%~c^|3RJJbwXc&hVGxD3X( zq-VzC(&$E*{EDnS&uKu4yo=5b7CR04OfU|DL)B-wE_Q@e?(v6r<$A@#5v`+ig_7{eS5$E>J#WA*NvE;BAVW}LIaegFK@Yl1tx;q!`l10SR zc9lQ-JU{FOk}wCf*YnKaw@z)2F|#&HeiI1oS;kyC{M=e1!1OOWupc|$7~9tQYv3eC z7<`m}_>~GzmjNy@!iC6QFw-jVIDd{**`8T_qEBL+NO>hSgzsIejhQ)|jf`aPs+z&r2H zH9yfudJ8v2!5noK@z+?c18@=%E}jqfsDi)%qGn{rSIrl8u0!z2(qdm5Wlk%6AMkvB zJ7n|vAXKGbYGYa>0*0LS=+B2IoPtWjcZ5qF%EOQXx1fRM^sYDGj|kMtpY~`DFi*m% z^jF`oH^y$vKFFGES>PE^w2|wt5uO&p_`0~I$EpSIq+@ZwuFFqMN6z#g;x(Pg`0hN@ z&u|3KD=z7b9yQDg2ZA3#Cy;FhD+}C1IL(~;MmQReuvnd_OvNg3u8g||Va>GwH1(zr z%1wXGq51c72U=hz36V7;hSbb2Ph!|se==8Gez`4g>|0(3%DH>8xP|x(C84Zg&N6cf zezNok+xU5*; z$g7CjCbvd^n$aXK8!L(-VEBCt2{ak=qq5z@Sq0X=>rA&urH&CI<+EcpL^W*W$8lQt zGg4&m-JWIfCh2hD=g8lc{ri;|DT*7@&TAed-0uiI#BtA^u-I&aR>JwuLTUAKSkgua z3YA+|E&up$#qk^bouwW7>(cB7>uUe=it0D!x0PLmT=dku+KS`SMW%R(5zeX(wKh?F zd5&&nQU}_YZSK<}Bv(~PW{w4Zup$;9Ct+f2imv znRXL$muS!^JU3%%C|(=2E!tHeNexwYk2anr;vL9Esp^BwZRL7X4&lXWL^k$VNspjV zL@??F#o+xRrRX^8RIO4gs?~}YchY(%6sNQ(hf>DB@;7!Wbu5|_-{S+v_FnaPo;g{z zBYG64ofwncd2ilkiT8Lfma>pt>7gVIOaxRvsr2p$v}Cb~5dQ4&?_9wA$DHhOve%9J z_b`)jfi(p6RQyzN>s?ei1u!gH-?Fjoz*zboC@xMrZ_*e?*&VBAQUe4$uPVhK`q6dn z>AN6Y&4e%;9h$sEcp4%n1mBOmTztoT)y?=eeOY7eBIPiJufHnwPayGw`Pm*m*wk7? zYYJC&I#;C!OUcBlZRaBVo)$czZKWaPccUCf|5>`l(H{QX_b_5_731Y}WYHgUdp=FX zqY=DH9&vn<{Gq{=?eNp%qHB=rc;foFQI8{UcT}N~*T!1|jMRAI7-`&y@?U#XY^>mmztFlIc_>>{XoC zXE@(h2*saOZRZQ*&&98#f?pj9d+os8P40Up{R&hq(Aj5c2d`;+Yf&7wU>@_HxVg_l8@k@GjoQ|(tZ1~Uvo1C-fDI9Stj-pMk>MPbW?-$<-%>k@@CE?EU{G|MJ@~2&h*`k1fN4~52#JMWA!BVxU>%gU2 zw$$s`s1F5b9^@;*Z1tv+u~@l9o}|N--xz8$^ZKT&A1r0o z;|uvxtv};fMe1g5ENCo{?&VW(%Y(0)MkQ$q-H2`%PSu9mdx8R;R@QBJVr;Fh`Dj~H zF1F^CGW)b;-&Xw`y5wrh5yLlN59$SDy1nm zp3H_9h!2Y&#?D7hNY|E1J8#A80VLq=^ARrEFf=Oeo6R>rf1Ro6N@_1 z*+_>9UG^i!#uQ^}y=l3->`y+qX3}`5Gp>9~$5Fnd=&B{{v@gTaTimW0{>NA0{B^y3 zy?+(SMPq((G0_9@09J>Hh@4Qe;_)5VzL`|VSXcnwHuWggxX3PL!o!y%@ECXzuzLLc zNS>nunrp8;k8jX(h;KVGyLyQK)<#4hPo>^L)a&zE<#q+Q3Mp57b&i7jj=R5Xa4c0y z>}kVJ)uztSaD_BB%O!}+GJl&AH2I}OS|`AkV#qjkQM{dZp- zhk50(X3hA~QCATdABBa_(neKr3c<`^yoAJ<50|JJ6lWOQ$OP_SdN}>Aeqx$tti`%5 z!A+OQia zVty-tv}FFgq`2UFgZk%T)(2~V0JF$9DDdg03g_nzttR`;yGug(s3oa^yn>d|jL*)s zB`Jg#1vp@DWFG}{lS&sOYl^l{M0ma*7)fE!I1i6QKjT;MRPU!xPXCJeCLtZ>P}PQS zZNmnSAd6nab`sNhqDFGF39o?|R#T-DBYx%Yza%_5v|Q&>xygtZ=AAxyrk2(=^Qx*W z9W7KmM0ymhs+A4Ruy^ZM`edk&5DaCLdJY7Ba>K_6$6M2o8~x*i);rc?BNodW+2bSC)}9y9DAfHc##>Mn025P!%oqx| z?ck&XuYOxHN>wo$%vGHI>1qJkeqdS&>@v;^W_3}3OxEAVCJqZDmwf<3;3=d*CWOF8 zz@>re5Bb+Vr#I<;P8xjvk3OdVf6h|9fkFO%PJ7|~XShyW+|OqS@V~_c!dP)+U$Gs0 zDfO#2*CZ1(JM3VGG0(u;<3F8rG@)HqD=0UDQ)o8Gz^!C9N1jb+#>~92wdK$Qm&#=F7E{_cTA_`YeE#iu{3ezMXESE5jj25VgbW!~seXU4&5J{e3lne3m@#zkPt zFoTLAZ9{Sph~2`?$ymt@BGxR)rchl(315|CJ7?Elv|GEk6!et(@g>Qw-0Jw9i7%N| zhV&V0olZV1qWoyv{!pLanOZ(5--lD0P#GhMBF!~Cr_>JFG#;K4eGW=V;2`&d zupNAa4we^-=(JC#UpkuKU_`XPrb{^pjh>M=!D1IMXfQKpnf62ZLD`b;B$aGVwIa34 z5Id#svD}Vg5mmN5AeY%QJX{qAmfkq543=3Dn!fg36D#>~_LfO|jL11@P#>ks6+dbA z==5+O(tKmAAj`g@;i}kB>-RDLqmYno`)r;CpY(&(+YippsiIYCm8k#;@0@i8({pX1 zpMxx}FRHm}aeStnL07$f+B(gA@9kgx@?my?jzakSxP4a%+L5oTXo}KX<>R;u#^;R1 z%$dz@zuxzz)>5Y3pqk8|s)RV<{gpn`r*v+fZcdyTcE&zlWKq0sd~2F};V@Y{&l}As zVawy`+Uj?fJE=H2NH-`)5I5{~Xs;ae(5|IleZVJ^T{@z!Ax=AhR`&x3OF2WGd)nwM zCO%D+K+KN?+LF;`G)7yMCnr2o8Ij6uXd5M*0rV?{s2`syMfAtLGFV-V*4xzY9R)vS zy)P-9n_9Pu#ktneBhIfpIrr#T$%hk0T+`U2Nvl7CIH#rENKozJH?c;)-Zbq@Iqo6B zB*wvDu0~rh0x4`d6dy+kvqT2AfgIXIYszVyKLyj#0w^K3XxkTW?&#$2Q$;$yE|*w% zSQO&G<3y;PQm`!9C4}JU`U`#Rv6tTS2~{djK8jwVaisAwMkrl1{>01|Ax>6K5TWk5 zSyJ8DJ*-1ff~sjSJ~vHYv=)Oq@Uf5AtLPdDde60WOodXpV;FQavcN;Wh|4+B>aiaE zXoFIzgv+Dcfw0gFbsX?nzL3?X`fm z?{rR}p~%))%uGexwHZb>yw<*w$I&?0Nc*=q-rvSpuit|sYKGCUrmu@{4EzkH9s6sH zTqUt{-iJS^nI~2>3n&c6ntI|^J^FbPt-)ni|D-=MEfHsTn!9IUzy9R~d&P5pAj%lk z2rkT&HIgS7CbE?6H>S`}L{5r^W+#SLiyu>ghCU0rY+`=he?RjIAyh7-E1^=E7Y6RH zIwMBY@B}swC9ztk=I>p`AvH11VLh1Orb0{46PlXcsuajZ^jx7yG0DB%LCJT*F=rGf z+&4M{TgP%IG%v%x<9qqbPbFXe=h$63fzt5B6SeZYaVIH|7*p{v><2tNW|;7lK0BTm zo?v!+na`mPtP%G)?`+2Q`?Y_Nvy3Gj*g+s}Q@UoCEL%1f5Y<=bmZtK`NaMkuH~-)f zH_=c3jjD%!iC*O8(Mu;$8W%mS)hw2BL_$r{h+^d`{b;)OCSoO4MTwFE{E3H$#Z)mP zW|aDU5_rJRyo-|y17skXI2>Z0vrMTl))s%J=ub`cPT+YEf_H!CLI>V*9kprf&4MZQ@W%eGMOz_E@>5t`()6Is z)WTrqkrp}E61?~^LsQaPoZ#OgjqhUNE{wX3?8f;^JS^lfkS-^cJV&DlKb*uMK(>RK zJsyv)l>OQbcJD->XUL;)hH1e5?n3x4wv5gmQS7I}!vZ=wQC&PrsfQST10$WSWS63L zYOzaIXWWHAN*;wV?t1TLvG8NfyoPU+1GQQkiVX&F5rT#y#pvMNWc*k0jRAp0dccGC z3;}%t&NUMHiND3@AP!`uNc)}5+P%lb51haD0Q0*L&TKcj?S8-i;p^aLF8Po(Q{0~d z4(P*Y&k|MSH;wNGCnM9-7RwJrF-AV59N@3rSE1YcgoB zXj`AxGM*x`?)$nad2Z42&-b^WVg!KLt<=Dt_(}^pUl})kHMsM)W055=AU8YswV{RJ zr?ejX^de;TxkCCbK9cYg`qR$NlWq1z)%&L6jwq7d=9caMMcZFSMg4|t!{~^pgo=QG zk|HT7-5?@e(j_3xkdi|WNJvO`H%QmeDILKO!L{H3KRnd z@L^0l5sT{<4fIx?CN5n6m51_!7>nh+tEGlzB;6F-n+-CJz$bt5tO~0I*~Q!yUdxT@ z5LjIPe5xBQ_k(Gpk*|nQ%F8t}*mq`)i3_FGuoL~9LA}xTe`^8ne^$0nHN6jeBH?lx z4Y`_OTp1^KY2#^9NQZesNm}?gD*&moAW_5Qo47AmHWg9uOJWbtx2=!x%3zH_-MT%y zpPD7SGD`KCrMyC5f?emGm}3~+BMxPsJKRZhEnVxs+2ncPmi}7f=&ICg>_;4CJsUDj zUG}_VSjlx$_gG-8mNk(wJ2uu6fvt2>*pkn~u^$C1kIT0z7du8n_9A$$w&8^9znc}d z5aPE9Ts-bXt=eVtBl?XCz^32-xVm=Mqa==bDY{|8+_EJXpLe|0Bb?)2OrzwV*I#gn zoCtumKYv!_?J5u)D`S{UlkBL^r*r=kP-cCj*R7OQrEI`bzfryaq0Jt?0sh1Y96!7geYxP;0AX02}HVoC|!!UCe&Wfekx*Hv6&C)qezG;!uDD<4)4B#659 z5O5eh^;F|^jRyI43%Vat?%l_as+GxTR2!syI)rV6lz5~NH+^o;&zC(fO|dDGP2MPr zf2{`V3?7B^h-QJ0gOp#5f3elZ(V^*~%2D{3I}R#`7sx=AS5mGa>nM4h_oZ(IONvD4 zh$oy}RzI33!^}BrfQ`?z%}e(Q<*)n*Oe_b(B#>@!uRu8w&VAbEec+um_=7*^uBRxs z(H<$sM}y?tFlDbEO_RcbYN7xlH||hdIAPTAcK)KY)F!KX;rXAvs#{ba$TL0+CI=b( z@mgetm)ac9u;5f2oWS+)p4n1zu@j(fHib%NNmdZ=Kf@g34fxXZMPebcsi_GVk^FtE zm>>B+4>}3m@EHZX2NNmAgHCVFp!Nq`M~Yd(=BDdv?O#>Rd_SbSYB(Ry&~bBf)6#a2 zTGewhKH@!y;VttmASz19!ET;ynfu8TB4=SDYMd~7b!^}!zg3$o;>TMd?y&b~`QG$7 zE}8o054!S%IIOx`IR$AHii~xy4YJJCeL?=Jdj7;~Gg&;t{&X(Czf4rm9pb8<QTf+dVkI`(zvgj)t#{oV@51X|E1R`CK zz@M7Uq{bL1UCjBd3dc{)W`!kKg zYtqHc1G6iG5d$-ylX!w-7v+|_H~NjUYR$`Gax>xF))l~3fZvnwzPj^17L;&(m*+F$ z(w4-q&$-Vn=GJ-)I_c>QR)1lfEtM;itHHMMTbjwZCDksr! zNr_6V^;hsq_BKH6yNE(SZx{OGSzQ$9=_}zVWQ}{E8 zgVi`e)5cN!H2w$Y{0_p#%}fT5VB}u6BF?Qdch_Kut= zZrhq`T+1j`){Dlk{-OP~FX4G%#53;W3}aha`3;qCqNaDF(-a=sb)LHe!!h9u4>R0$ zZ1(owalaKSX37|(lWZD0p4MVpma}-)$}2-cw3o-|A<)=nL%v_TS=2Y}XK|hjA2ipL zIm6N+S4!)MFHNn}cG(!C(G=7KkMHz9=8*b92h$$H1jPwE<(rKW8z7%`WFB z-d@%0xN8o7iL2@H4kza{8+;KNpD%3Gzab*|Hta>2RhG#cbk^Kx>S5R0R4470s8F8! zSc^c)Mh^vhfnBm3uTBfCyE@0pP~`;VL}Xk%ClRdS_V)&+Cfmy%xzmA~PR7M4$1_02 z+r^?W($->Ys>biW^i!<7nu3Sg9qs(=r}po&tBD?_vaGrjd>XK8>>1-o!b0(&sv2>pf5A zO~zSmJ02FbtoZp6GMJeC%Td|8b{I~Lp3D;(Q7TQGgYAw^`Zf`-g~Rxl)dBU5iUgPM0Ru_+A>})CTv>$D7Ztge0DqxSf(c`~-}12aJ~g%Y ztw`^P#}PI_eAw~>ki+Pk+k97a7#m4(jitPDMKz=UJmuoKKA(s0?FE$sTBdzNk!{0@ zIsP4$m!#J=EJ51Tu(at%Ax>H`;#coDbA%HN#x41V;X5Z^0J*jsSQ`7Ca$|ErBzJCe zh1`cn@|Lve-+zS`<<*mOhrpz90Ca=3;wQb_EN&;SvM(+vv9ZFSO3$jD-lx~4 zy_5NY)PBo{P|o-dZWiMpH&^5FOkNSori-0>*yVD1O!1Up*aGZv8b7Q}0&ZDvw(y@C z_iYq|!SjzzRSxqY_*}jaAj{Ne@4ZLs{}|! zDf&dSsjEMPLmBqD+lKfVKR&Nm2Fs&_?~-7=CW+7~W0r8_V@U~|gfUFYM=J4iI-Xlu zw4vOma_rRal7i`1AsP284LxL{pGhBMfLr1>Q)6D81Ixiwma#vRL6bBwg}E0Ki(dMC zw+`$S7d;X?O*Mi3eM?77j!FdGt#7n>UbSN?&HGYXvi2SS%I>-ZG*swj2-EYjYzi0^3CyuAz>fEu!~xi@a+T zA7ji0gC%%|uQt?d=_W{@{V%;4O|4t4UT@l?6n%Cb{^yk)g(F{GLLR>cjp(uj$%v%9 z=;lhUiWy^cA8WP~>v%6*aZ@G3A}9 zitY=8$9V?dSaeip&*UV&2s3ocQ4}_l@6!;GU-mv^*0;Fy;5#WQi(?zhA2QS{g6HlE zJl6hz`%RueZSPKfK!;v&y422cgwSG1?w|Dbll4kjFtO!v%vghZICfP*#4OE( z7oFxV)zH0QFVg4vxX$A%@k7_e2MFOlkdx&DJMm$+w@+WhCdgjau`6?VQC)7cXn)58 z+?v>7l}GFeFV*ktxUiA(FQ^niUwh}(*9WW}N5Q{=H2Ul+DZId#D~@AXp1XJD?=(azE(c<3*#diDJleTp7!{3977L=R9W4p3^_Nnm zYtpgK;^ir^$=8N={B_QWSbqPo6Q6=8auANiJrkvSJ**eqj!x4=KN{y5ZGDsph)~vk zOZ~|^pp9KQ#RGe=`@5`oE&Ebrm{Xx#r;oD!b;o zG}vPtI(!I)yO7p8J_;j_ApJV-Of9Pv*DvM*CAujcaSC>2`h34|l#Is``Meb3{UrZe3%IJc7S#}Cq^jboac+MUHD=?QoI7E` zA-0btn-QHNO{jkbZa!pAI4s?6&!e)D3iZIfT1f_L?txc&1yYOYfq|(vcf~emp9{*= zFDYbKago!_+l>#>u*RP5-@^9l6A~NbZV4`BPZ7ep>re9Om`QHhu3Y1NWoDL@e(e1n6<#L+#;@(8&vsklp z^AjYW3~M9u*eeAzR--Rk-6Xjzbzp3{Ue$IFf_y^kV|5;UBG`MsX4J_`LDrex&tPv zb#3Wf#&*RP_@VmSvfrFc?Zaga*Dha|1MLnpbNXkwELRf4DGTD8Ej90f??LxT6mHFq zwqAjt>XfBgS5EIb=hCxZaRNh1@+C!QknVPp46e~o>M`TLm_L0EbJK?MXsMwYmQ;kR z4azf33QaSF#HMW~3%AMYI5O44w5~-mAK2M+UY}id#|TCPVyeOOn~bVdV!sEHYs%lo z6XT08*XI8ksc7%^#@CvDQKd@g2fEQbES6iN*JH{qd!$+S5p<-=hFEOuvKVzP8yKlM zv+qvHkgQHz82EN8w6TginkuQtGhg&4-m6oDO%D5+&T8Z#N#$>aw|Yk4^Zb%_@gG6+~4#0PX7hghc^BATbY=G zp~zjo!~%qBzUFs3YH;av?fJLC`^I1h+ueIhimRFkQ+W0 z*B1@K9p4$cnEQ#*9pnRo+q9|o!IW-X&W6QPa$~HtIt+0Fmf~Do^B-fR%|?g*5bt2% zSvOi=2fr z-ke5gkr%r1EJv`T{!!B79L3@plG~SIl=5#tl+^kJCh06<3bLss|6Q4PrCXcf!o`M$ zcZFZL*%@puRn+i8Z<3@ktW-i>S%G$p^7Vgu+h#m*r0U-I@d*#crx|FL^SW7T_K8%} ze|-tP6voylG(5?UH(fj{sULQ#j1kNhh+mp}tLq!j%&6;|`mz4e+(E~Aiz~rtl|^Zc z$7sqPhmDGryCr_N&1h2nskW-D8RwnXilba%>0ELO_W#Ijhrkc+-?H+MXbT(s1}Z!L zg^q=)r=PUFGs7`i6Gc2NWVe(wBXk;k$I|5BNpD3TaM4$rf#8+p=&gn3+>W4p+!MJzJ?f@>7E!0oAaAUr~=y=G>_ywD@TPE|>^q8+pFagR^_oBeUxuCYiF zF6*SJ{PsBF6&YItotK`@t z0o`en2BFm3I#3O~T2IHPgxpO@tG3u8qPdEhFLFkX_KbgoRC~L>!ootFn5vBvNItK< z-RyW=Z7H`;%88ibrRSf?zgvu#w+svIQX%F`F0?&{mzJAa5I*C_d&eHdB(8nO0hz{v zRD68s;#UyjDiHoi(?==NZfXVfIg*m6BF9y_Q z@s(%HGEAvIqZSHU+WCNJU;Q+(* zZK>_*HXEMIBakL{&Q2~9>Qx~wciB=^(;*oJ&CTi%o}=QwFU{9sUIk{%`doQA8Rgl+ zn+Nra9~i=uvA#TUWXAGL6E-p0!@2a$P1bpx{Pv>Eg{6C}(sg7PyOQ_3^5t1wm!zs< ztD@N!TZ+nGjr`!Zxl<-T%sl9GXkjT7en4N0(VA3VU%Q@-?0^%0YS&O#<}RVqG1BTy z&ZlHTx*?H=vC7h)#%PKumxsMmVrd5mtpw$V-m;pnhV#qG+Hl(j=;$iZv}tm_X`_(l zUHlY3U_+0<#fA}?AAE}$4oli@)5yOVVvD!l`a2m4d@Y2^V%T8~M$jE+V>Ek=bhvnb zGE2z9cw%6s0(+Sup;vyjC{k!0v*9YI8|3+zUcrdqJ&=wQx*AsE)E(6w<25ByxpP$Q z-pPh$^Yk;zfz2FrgX|A-Zd@H_CmyyfP1n~4lJ^Ri*~&N?PZWIAq_T*hc4xWbzmnE* zUwlUNuj|XbyW_g8B-1Y}ouT-4hl}eP!p?+B9tyEI7)LJ%zOr+> z2Xm&f5Eqq#>!LmuHs?!bkfgk9QZT_foy{347K@e2C&XP>baL9(cygPTQ)=5n3w}$5 zJgD9&7CH#U(GQpXDbj5G7-<7j+_Ec_lT#ht-PA#M;t)EtO=>nC2GR-y)qyIi;{kBR ztvH(WWsneD(@#3P3OxD0?ZBiu4W&2Po^PTbEz+T$k+hR(GB&S*fIOU~m z)xIoBqynPU=M%#@v=eJ8Qc5r%+*HbuFVD4eQCqd!{e-xv*?XePlYTv4V6 zGsYD1H#*LAMR$#9^e8oHz=wGl*LE3_lytDik|H1ZeZ5ApyK^xBTx0Q#DE)*cfjM#&0bL`?hq^ z3AaweuH&uc*UiGwuEmJk3YwxW_cC(7tHE#B?^|`*RW5B~*;e2W7~U2TP6qQE7y9)N z(x3D%?k4d|VE&5ZPBqDR)gpe-f_F0c6aD=M!}NSl`8A=rtazx_c2z2sdFivKAXbZV}VKtqhWN#kH@!%B$9T?6P>V(P*jmrmuPBRor z$vm_5CmqjixWaGl!;+LaXXXc3X1c`qj=zN}lA~c)3^PE|G+Lz@V94LQSSx%-=tr!% zu3fD_6qsl59q#ZziKOahmf=$6%j%(l0>rjc{8qSJqO`;49}{nB@Su_LwA)x zC+WolJ(9S&CR8yI#6F@ECg2fWf|j0lCF*$vf!VYNnBhd)t2ir{WFg8hCc}X z*B{dBU%KI*{H@Ypb7kh~oY0zn(qE`z#)oyHDTik>J{jPHUo$XK@6<0*`U7fU1V7=} zcvDa-CdAmbO;Lsk`u*)6>xx-u% zz41+Lx0~Hx&$Ka$2%(&-oP5)+pY#t-17z-9%179^NB47djP1PFf?CNKAH7N*1{$ zikH@hmubhevOJq&;fgw%uA{V^EFvY`i|4%RYl)l^6Qlr&Gy}rN*hP>9`$k8Yz^op0a5-n)D~?DIW{xkuozvng3v9h@;r_ox5Ae;d-U&Y`1+0Ci6aH*_gp`h za_0Q^Qzpr!Q zfyONZqaXC?Xv4>?q2_NwI2ey+EL1>-x!FiQwq8e#JGhT5|5ahM88U~(Y03VP zO~0J_NLpWC-`4hM?Ydy1&xks^kjn0YXw1Y|WF<9jxL<3KcmnMK361U6hEB|$Ql=6t z7kj5V^5*15@4}hOz6SSetSYX&{`tTT>o&Ci?%RZ1A4Ff}_Li>H*>0sLVg-aJ zd@4CN$TMSf9{18b_ER-DQWet0&>8M@l*dd~<*@-P$?>db%g)ZGrl$7Mv~J7#D{v%S zu_qJbSv-lh!X&46?9BURtB1w>$qI_F;RQcQj?O3@U)Iw7{i5}KOV9*3qO|MPT2RzZ zsu7($Z%j^SoM8-Am*>;!T)vKn%3k;>iTX_+b4*yP2s|TzZ+j`D(vza%yS4Ek4d$cwG^ON&PU;tc^?AaMYQ!p+8PdV`hG} zF?89ak=OfAVY@;6Z`d0#AGw;u34nm}9!I665Fa>jDgVxZ(VpOs{0Rb@HmsUu2!-fm z9@2N-*{#(&?n{QnPH=vOiC&v{2?NGcIoog}!ml6@R96frI-FEY|M$-V7=v8yf4YsJ zr=b7)(}Mr+cH@mr6+oNu0wnuMT>bxe6cLL7q?_=!%rF^E?ET*RBw*FcTIyIS8WTAA z{lfPBeLk{+L_MBX@|hRQy0jP>w-QUCd~vyc@XuX4IKgs>2_6OrRF6gQbu3E%ro7*$ zNKv}Z1t-jH{4Ns{l%h8>pe!n;_F3KA>ocCboI>Z6pGo%_GX4j1c}5u4GjztD9wulZ zGW^GCVI!M&l%b1_5!^bOqFEXC^N--k?6s2D7cV$j)BTTnC`4+hn<`2A1qjqY6a_*! zZR9X>)54&$qTOFRB|4{+*_VG&|F%BLW6`=EwTslJ~Q)1)~~`>X=h%0>J4VLT^~?VG_902 zH^SD6Vm>*YlSU2YW^v5!{EMkAkiW&UTgKY+8hx825>w_o_3PbAkz z9C@5XjMM&#*B6jSFV;J;PwZ#hIJ+BNI-Dlec@rri$-t5v6g0p%hFV5OlXDPe#nA{m zO8o|&Po|}io@>F7=hN95h(p#8C&+17{=MW0@qqQv}hyN}6aw5>CC*@)gr+3VHN2$~i} zRI0qih++FDWvDKP_`lnQKu*DT8!-;k34!I*XpNRoQHel9 z>mJ6wkrcDio&BJ9%c76?S-&Kqi*E}y)W29MG<$MW(y<<0DqH0tTf5 zI;Dxwt4xuWbLVn5g=-`2ir=)q#yPzysH5?hWl9jsv-T}5XqT-$=~x5s@M&*|3dCz; zp+Z>13!aM40f~7dNhZTbv2qo1z${-cDn{W39lKt``qWp6b*VOfga*tXxC9J7pkmNZ z#gES1R31zzWJ|}#KC!<>Z&5Lb660F*qEEIwGhS5WxL@)m4&FJ3-i`ZuN?*M$ZmF!^ z{vsoTW#0S<1oGv5g#BK?b^W3(RAPFT&G~rD&c$VxIoM18YOYG`a|GnfpOAy{6z~?iwUg(3%ox;WbW?fQNLPtx>O&b7f5~I4?!Ht+6oK%LwJiaj( z+)3oX0b%D(X)wL?lcQHtCL~ILJ8rgGJij_3=edob`ei@AfaBqEc-vf&KLESdAZHSV zRL2v3^#y6@H)r`Qlu3|u+IN)y*{p2`*6S0jI?bPpT{Ks$zQ6^mIZ;q^KVYjU^0|*) z^`TMzi<%JGtJz?{cO5Nb2fTA9B+QHkL90l{&->0QOM4ygAd=KTw)=!XZg{}aZ65#} zXXoJg2ME4QZyf_?)Lni9C6a0vovullD3khmN||CS(BHql3_&>S$Hk+;XKgP9*`FW0 zWw^BZy*S9KS1-`69dkCP{3L>I3}c3T@b=`Q?fZVruV6SK%W8(;HwByPMJ&wplNXUC z(~_bgvleEC(A=i*dDlXJAPAA8chLeUb(i@383Z%lyrkb8AH5G_|B1%K2xFM3}7h|ImXz)*)j2fOT)X9|qMEioLoV!Rb;X+(F)_ILt%9ypq&$q+AwcZ> zfH2L%Y{)A9du`ZWHGJFX)^z>n_v+J3KSWktfW(fH9m4!LgX>8;$&lT_g6EfZPoLxy znu*XU!t>8)SMTXTz}oJL&nge(wzkN4La)LaM&6kD)7PFMsGkz z$&NB=6)#(mCu`XL9v4G5XQTGy$gGs>d6eC%Q6$~Hn=v|CPsyk0z!|>oG%~VI@#C6Q zxGqy;N!piIcn+}ohI20C>tLH+zF{AF$Xx#U% zk7Vo7IE81y3TioS1&9ufY+7wM(~nPYPTVbqhpo%fKxBQxO$$4shO&AsJ(GsZmo=+T zp#iX*eQT0w<%-#rH=y4#ORUPmDA=LzD=oANc*QWnh6ERqxSibeX%h3saP?4j5t(z= z35`G>)gx%r+guUKhug)iiX&9VcT>XV@oU?*9D zMo+)V-&W@U-hZ1~%SS`ge>2mx!MbrOrsQ?sS#Pdn+f$wmk$V1F?6L`M z8+AJrZQCs04)`KxvB@=n;)Guz{89RdsF@8$cJ*pQs~_iKno7QU^X>Wwa0#g`oRXAh zY>6%iw4^$n5$iTin}C8S&(H1$W~K|s5Uv3b(+sXhlkhSV5u~Ya_A?2ovM0Jwd=Ece zc3u~0{gL;)A(5A5vhSZ$eApTf<72x9e*I4u>2hR_DwiPuID|Ys@YRz5ehY3=f;D1? znP{MveR72^--z!^9S!5jUwePK)6lluom+(4ArVZi zniqIxy}G(5NTt>6vSbk1V8vDWP07-ND^%>Dmx=`k7n=rj0=` zU(#X#$OidPKd{56ir;=W&%Ul!2y?_(O0m3?Mr$uH&X!5+9A8mL>CO(`*BdOLo80aJ zuVqunxXla!aHXnpy@Vv>Q1<&&gqoq(x4~#F6>|I;Kc8{27H@THUWw^wLBJGuGp3eW zR(Qy<-(#jmWaIA_GO#u6LiM#q09C8_%S%Hr#vvoSc5=JU>jkd8tK$)hJ2el@a%L2X zh+aC$Xi{_c&%;>m-)FWQiI<*zV&yF!cLRVP&emzHYpb2ksx|AJD`j{T2Q|63iyZP7p&hX`jTvyqr`4`G4(rzj#67h z0fW0QHi0sEMQV;;!Cwm4t|4pS_ePP=^|3S6koTAJKo}Hx+q97}06d*cqd@hZ_K99H zLxO#5X%Rnnr53k*y!x&c()H}=<3~qdGR{}bC9h>*-VBB2C>c?dlxMWpPw(JCH+P>5 zJ-_d9-}~t%CuX6${6Tj-K2>X4Stuaqk|>LnN%T7WZm$DgYIuPfq#2AE;mi@iknSBz33?-hKEE>90! z_?|$HAE5k_X$1#>iS}~%pv$JG6Gn(0@+d$teJn%>k?%ZdO=KZ=dE^jvO8l( z_zy9X3mm_UY%k^iG(`8G$>uE08Zh7ea8uBeNAd4#Z*X;8a#}xbbh&4G;m=?jQY!9KWfR{ed3TBlz?; zA<&SYbN5S?hW9bboAXv|U)oEB%YPLSQ_Ovz=*u@e5=3tOF3!czrYLPC{FhfTNB0W! z)G3P8stxytO{iE}8Csb$FL)R!ibdC(9C?MgZNA~jGhh4VZGk;>Lqya5YEJQhd=pb$ zYWE8_P!?2aj=_hC#f|QlmtBhhUW_C}`?#YIU}i~dOW)>DmT5=zt3GFcdpH-STBaN8 ztGCI+7rB{zgijfqA1zcWEatEqv`^6F9IOG4uo3{gd@7EhdGS%{ zJBh8|k~`D&*>DL>&Ze3N!-SOmL@4kcyuCJ=cr}$?=mgfBNx`nnZt-zDaLTNB83`sE zL3`VaTPxX8te(39UU|5BcuNCJFpPBw$Us1`P??57`A0P|1<~7_n<)_%(-e+hzCfQInA;M1_gYQa_;)#4Fat_!v5xYwunrv zZbPNIrDgEnwjZPLCPD>+Tmiti-!Y#{>!x4PDy~O8V$k|xw(Fz3I&jTsO<3XK0q{(C z87aoUm1WiqWT6KjyLf+#-n#mvwMx^Hsa%#fs|=$;RHrZ^9ZW zQAyqC*>BBn+UnJScg2;xXs+!tNrhp^ksS(np4v`RgFp}XJuh4Cijq=9cm5W>MbLT8 zjcD!|v|=V1Os)!`#uH*afl%98fBbD>p;fzDVykli$kU)P^I~aku+<)A&Z*$Xdzms%-0I+deQou0mysPwu3*66Y7s$9D zh-$moER0AF3gY#m-UykCdY=?_LI8W<^8RKqx(Gy7{>v-R9-L++sBAqKkOZ4r;t@Cx zKp!^WJh1Z};J#xSX5^8gBY131l{Y2Ul8a6Xz8PKMJ|*3tPplSQ&8X5Np-=iA9`swv*4( zCy)z59B=*FCotU%d$L`6&qLIf<2eT3%B_x_% zkMdaVZ#J7!`Sv=aA}E9+$=?wh++IvBlxWGyU^SNy;Ic!{up58VKg)lVIwsF%31&ola^r~rLLu8nqKh+%2df z-1qqc{<4R}<6(bMp0w3rn|Bjp^^%5LD$= zXd?N9G*6_9nNfuyl4)NIJ?V+QUH#RH)?#;qLm_Qw28>lS`%qZ%7R`AkgJ?35ScoW= z4Z0#0B!(`4qd$ltRtweQ?hFdd5=WmO`slTnw}Snqt^&Z%5acD2L|mq+jG&_M?9A*rA)x1O1N0T=sXwwAc%y6MFTIkdY@1U1>?J z@3N3P3_UzPZQRGGNz9*ag5qN6ej(r*2ErRW#^~mtCvE70x=Qp8ug$NURkQ~2RT5|Z zbr}2OHZ)Lx@7ZZnAr5^Z&7Qb_i?Pao_j@xWcF#W`MNLHbSIx=EbcYazeHye%N zWbuKm8SeBpz}<$!q7z_Ak3-r%3&uRiM}08 z-P+m@%+_z}-rfQqq7w~+Tn~uHQ0-T`iQ~Do*Jvm@kx~+l%oO6=4`JBdN;T+iy+Tja z*_Ib(x*nrjuTy4Au}#t7a-Nftia8W|gCwtf#1q|)Mv|GC!I4n3cZ$(O^;=u^A`5gP z%N~b|)dz%_yJKde!Ndx>MK}@}8F`!;>r|8THVZjAoZqPP0nzT^l1O!*b*RQ;*gDW|-_Mtiw=dXa=b8LDJ2m%dOoC zB?oHgS2+tW&I&>2x}14*0luTOh6V5XM{%S6S;c^H)?clrLX@^G_&b>1+|;&dg!_23hsNZYui-}Wixz!JXv^v zyoOM4N!g>pRUHs?*T>E}A+dH9l719K^xKu?8-)G-L`hCTlP`N70{!Q6I5Kne8XW;Q zPtiISi8UPRs}@b?zSJ9cxS#{Bi?M?T($0$ev0v#*Vwwi^k zcRo65M)M%9C+(9p*T$J4ecj#9Axq-|bb-fE9qQ4Cd#K6WPHS}T7Bccc_8Kk6HY%~< z-Y2X(5qe|?e?f|J|B6`kKZ2gR`|yEBkq|1en!iXfb?>t&vnurFZXuI5DqebIDtHun zvl$|m@LzBM61$`z@?tF0>JW`}joQ&54r?}=^!*^F-HK#*=DfbK6@gFjksoc%E6BJ! zLl;DUaxqF$OO57vd-S8e2Ip(jj$XQFkKpLaWzC)g;a&p5IfCgI6F$}Dp^#dpf=96E z?n~mTojMgV0j44ws@ZPT)wVH_B6>VihU5a?K2alnERfcq}#?_x#rtnl}@fS<#M${d~1hMN@`fQC5r- z76Ioq!oYqO{z_Qe2@Tc&`)J4ttU{YIm7kxkpw%OhVj7Ow>MQ6Ud+W0$YLT(SFf_NP zmlEoJZ!bZQ%^UTaX2J&9DhBmXRi0f%M;K86CVzJu#!eSOC1!vSd%LYfO1O)f+)A`J zu&qU+fpSF)`g%m^2LD;NYRsA$87lPr^~Y2*;1ilkxGPY3hrV;r zrYOxnw})sOJ?MFn&*46hhWh2xe6pN;O} z;^L+ft*+tikyRA0ZDkJCW^K+}$8&nczm{i{E*HC%zkWqPmR)$nGF^;vXKOP=gqB@M z^xM@OIa}ufr>2+rho4g~j7?=jp&nHw*+*LY$8_&PeAr>PVF7{5jI8;AHxXSyE~J8S z+g}qQ$L7$f=@M9Nu|&I%zEpTl^3@ieSl;l+#WJ`{x4Xj+rV*Qv*m4cMcdJ7?I9whA zQDy}Jy<}1(TSB0xwfx}dmDcb@XcOr&v}qwcmVxIAeRCRg)P8om>Z%8XILjA{=wmNw z2wLK!@D=pJvJQ=pe|Zem*7ikEkrGW0T%XS_p%?8Fuh4gw9#`n{W{d^&oc1M(unA4V zHa0rhiZr`!FPWm*yI^>Pj{oiaZuuw2`<* zBUbT_ro-AOz*!yss;LBydydb*VwN8&{&4}VsCN!E6jF@MD|<^SFE{6B7V{(nhaUMT%E?L>@@ zq3t}^@K97<8tykh9J(y0r=0rxvj9&pA8r>Cj%W)**IO_3KD^gUX>brb{+KwW>Ghh_ z39?3I;=hvLc=hFc^5i_5=VI>UT!qg=?b+QOhC9iG+elizb)AMKnhoqB<-y63RREQK zKuKmRz<(2IKkS353tSuf$>7M<7M7_@(_#IYFfv@qK8;%wzVPSrcA-6#Qb=ghoI2=l z8fPGCw%Xmv7q8q0>C)E>$MN!RsZ?xzktuu7f)9qZggf!ZTcVl%XBa%|_s@9HWSE&R z-W2*0?Q3qwTJNw5DY`x)tvc;MCluH$jW!3Ukot(iq{zuUgqGqI zqkY8!KCDP40#ww0RAi^t=b}YMGmZ_6W%Z+?nJO}xT_uZb?TX)xl{Nl1Jx;%puX@W$ z3rv}tzfj51aHX*~k=je*)r+#dgS@<{8aMZsXgw`+A6>0`L7sB@$!-NQj^M^pZ&X)c8LB#C9GbxVKWkTX>me}d`;=4=yw1KT`m=X(sn(O_oNGcup0u6kyqpfP zNo+nIkPviO?@v5=BMXZYAHC-q~+v+g>kp~1mwcUqD8=vE$jZ$EKBeDvv0`eav5 z5r1NGose&3G<4xXf%WNxA_?3^*5<26VHz5;wKSgK+rOryeV;z$Djxw97)H$;eDNUP z^)1^Awv`v2b=EIgdruO4!y5;l6}@xXYfXp`BsL%ZywcNTkB4Vi%E>m%OG9UG60w)9 zK*K}#PjQqxxnzlm&|)i_t4E5){#|(8b514=oocji3AUaSFf52i)k~ty5J@+px;o46 zR2QS3NuEl#UIX;OaQ?RzFeZf6;VYL;RHeBBGOi8>sDvT-g5o8aTpu7j+NMXgT@&E;n5?fEu}Qx;m-|xhOD`ueJf^^c z|A3RF z`zX~PGo|x%S(?$&0vB_hx!4PIa>Hg9e8=0wJ_K;;1Xm5~Z?RpD`?mFQ8rs7`MrUGd zxz0Hg|K$D_287WjOs|Ry^M>0s-qqvG*FMfVXN+^(?sO`^?x{WIhrftBGK2gY6cK1_=3h^jIyVI{{U~|T^X^_zl+Wy3EpV8&K|hB}+)Unus|L9X=uaCsFnL0kIzs~Ifd%7Y z!7y1wZRxbuyc9TopJ*h_g=pqc{=EDxmJ#tFdC_o`e*ME&51)dD`=eWnn9KqKFJG}N z#&!{|erfiXk@)gT7uuLHHxbKP#2eE(gFiQ83Xqi~p059PC)??-a5)kxU1@W}J63V^ zHu?Mq^F6I@r&Cf4IC{jGJ_2%^#lIk∋pNJj8Eu`uuTL6LXfZBv-9ZU*BMvxpYB&$xth(ornu_TXLQhLUFcGvxXiE>+hIX{o5-iT{MT~B5Ze1+qvM}`0Tu&$m!GB#BVW+96>UnXS=E5t~|1S zg92~g9rh^8&U1)a>FXpUFa)bPVEPF}N(X`89zEJU6u_5ptmL@8P zQAGP^&bj<^1_iTeeVd|EDkYAOWn3h?)wzOqi*1>MKYn>T{sN0}0>|KQrP}=mk7~mU zm}?r+OrB`=c1UEj<~Z8H>EvpgFtC*34v=;oB=mJ)&Sfh106cVQaG7Y(ZFpp4WOVd_ zo5c%PVmutDi{HeEkbXqDnitjfn>a*7L^wDLMr;6)1!cqXmp0m2;j&jBPyPb#Nk8J9 znhdKAawk9lCxzty=^k|d8vzy??YHm>OF7+z99DYwgkt9?vmA9RX-5bShsiv z8U#y?G^MW-t{c{vyx;21BcyYiHBdr#eyFcg*=V@XW%UQN!V$$VYQ4e$O2@wN|Al|} zK|J<--%z#U5_F8~@qIP-Sn+t=5L)SU!O}h_f9cMA7Dw__q{ul`jEGGgC^;%h4^tALD zdIQ_t)OG9kS{L`3aYu5McX`sgPV9S-eDRFd<=b?bjvR(M_2x8WTXg+`F#UN;zxR9J z?oD$X>j_GAk*7!XF^$@UfdYY%fN(CulwF8NgZtFnE8 ziJ>~cFE6liG>n3JP#5UIJG%1%AJ_MMx-685Z#B>>N*q@$;z*s+4%0WB>ei{Du|L~V zVaH(pX3l!q@dKez;?7|GQ|${g)4*_8CR8LxG2?acy*TR4EmcPYW~NKh*L?aa#ZGME zC&kTlhb&Nr4;W+I(4J(&bVOkL=eTuz&V%Z>Qb073_si@2qSudAf!K`8Mq51l?Vx=d|Mu%@b4?=sRQTj+f6dH>d$#?3qU))#g6VUgL0a*6)U5(tvFcBH zq_Pqj;r+$6r`dyGKW|**GpOFCbrtw4n(t;@r;kL|z2M-XbAF!|=Zy6DC`}9n>OClJ zKT7p0#c+K|jVkF&Koduyh$>U}5kH^?%KO(p+e!@ZT~%y%_=#9ag0IGvpEiU7yRL8? zaZ&^blz7Oua?SsK)~tn@wPLikwBis}0^S@y|rzO{qtvW$kzjw`9%VVlM?IX@IoTT>DA zDx0KZ!1Q>h+oP0Jfa%ACXDoU@KLH$tbB^B#*yQ4vQU`^_tKsmu$hgW0DAVjhnRQgrq=*C<^D7 ziL3Ykbm>LDKYN^Lgw@VxQ$;tFeE%U|Wym{T{16hXgrh)fJ+BFCQ4YcKBEm<(XAs%(+#SoSI40m#)R#$LD!9 z8BW~?zw+%>ZzQy&r!ihVk6shln|Ek7>HSL`fK<NNI41tYJ@lmwVw z26pmgL7pPX5Q)eoPC$Y#UK|~;Gffb(u}Ev=|HIyl1%%NhLK^KH;7v`@W@LJ{Pt?U$ z{RY2Yrex^#EW9$M&V5E}QQrf7_f}>>Z4h;)EhD<`NnJAI%4s_Ph@ z-Q$AH0IKMGGFh9Bb1vD$DCM~d3|2^~Gy&4|!<_67SNdPQx*`vLOyKD2HK>pZY~|1# zkttaydArt0e_ZSxd<`bt&u+9!O8VQ?D!40sPw3;j6{6y|OBrO~U25_xHCHU}7<|Vra~d@x!X{Ipi+_7HY;fSRboG5h zZ#Otv@438*3bp|(cSA2r40SKFbo3dk+d~A86NtV?JXyR%rcA<%lAnzO%|3BwyH*F3 zN@D#1{v$Av@Nma(-z!YDMDw2D79hUCu$*9VIN3}be!=z1PvSl8*v=0bDVc#_&^pdi z1ok7c5H5R^+8cM?p|GXzx7I_NBJ!W$w`nL?}rMm@3WJc)pt zkSHDhr+ceE)Vt-g!riY@N@rg+)+FZMh?|7mzUfAWlJz4_PXo6wyIY*9l2T|=5np7n zP0#m)Ek_WrDBP2kEa6%)07jZEL6R>~z<6UC^>W+Qq?vWSuGn9_!V~`!D)ZLJ$Cm=U zGeNIM>G*cK2qm>dK2q}+2GU$^D z5+|fIF%;O#N?a^aU9~*_;=l{7$6Xf zzuvCN)Pd#1+#)dfid%<@DffpEkIY6Y^*`%2 zX(MCyO-z9>>qlu9GADN`>a_()Hjnc$FPQtxIZRE3pIZIl(n5`~f}~UGoQm8xHq2F3 z9zi@-M*EY8?Mh3KIlbIFE%`12vV8hng&`2w)bS>VkmI7HgliZH;5TZD3oj~;Hwq47 zgpdHqKo8>{D5EcJzO%3insM*tq_$QC^vmhJ(Jz!MHXGkOr%D}qZKvb zG1p55DjN&Yn}Q*|2RrX2f$$vYi}3P$(-9IvtAj}>g{m6$0+Nv-jDjs0h5eyuy8WL- zwC~Hy1=yg0|+x&+kVb;BZGYm*h zv0yNobt)aIHm1EF{C-bD$qf$q*b1ZpyAi@lNzG)Nd}|@3egAf}Lg<5&-rV7OS@4jPjbqCa+>o0sMqvA z<9s1bNUuL-JO6PK?!^UFbMubO*`;6V4B2W>T09Q? zVBAypcxm?Uw|?#_?L&4L?{nv22*sPfy)x5-y+~3jp3sX4aoACNl@k?0U7{Bxp*3hf zwQK#Wu-@obJuhru3|nSr^Exr-<5|lb-i@)A&G7`Zx@_MS?eCYCB5hYwi z?n2C-llEs>)WxrJ{8qb_{FQCiFeeu=tt%WMqB#Y(prT7%-;s9L*U2Q~I=mdSKf!a& z(hx9t4J#1SOJ(?*&GsnIouO?cVr(?8<%*FY-0CaiXk;0eqOf(oY4xpb2xqN&YMo?x zdp>2k!=?f!3OiA5m8RFzn>u||Z_-*m*HBubxWS3_w{d1~Usga?%@%s9(#Yc8o?Ohe zq;|S?;rqv!-LiEBQ94fTT7+v@n3SJ&d+Hm}=f*HkuNH~gsu^7fO`b@XEGIo!+P!gl zG`9sNw?7{<&4(3`q=obR*XVeXi8oLA(WBcK`u+JAcO=K_t^;5Dt9O@=@U-#u$JBow zPtm)*)}HNkHPW!-<3FFb8%2RJQn~hD{WVbRS1s#8R_Eg?nPuo_P)bO2S~-QUN=iF2 z8?dXZX@nRw8P%?sF{N$SE#`=$rNiy&-7^<2)+;q)FER;V zi(mFu^Jzr_i`R?c5*%*FHFGmI zJq#Cb6H7Xq+O0?eha7jGe!Q|Srv3w{E+JX=<|_jArWG^(n)p7C)~SH=$Eu{*ErA+Y zo#StRr=}tZkj2~%3b9wlh=dSKInVV{j6VL}ZT)WckgHfvZ$Oq?v-j%+u_o^LSJ%9+ zHbR)@7=Q8H{p@8!l7(j?s)+%-s7Tmn=ix~KR8=v~k-KN;{7)ZYm2bHnyU`<6oqCBm8N1au50)$KlVJ-| z$90e3?=Sx^o8r7a;{Yc_Rf9&VCF`2<~9|n1dHrXv?J@kuoM#eSOnC`HtwMz}IYx+UY;4aPM9}Si? zNb+c~mdE<>d{inp9lntw>#N($n%m?6GCfwQQ}eu(@|=sN0;fD-2M6Vkr}S)UU??St z(C#8bA$2G;?QXEnOk&Vq<|AM0|DH45G+AHF@{ywk5u8_f1@L~&NC{%RYoZkqehiR4 zDuEElSh`CfA*mk~2t|e5@1nI76j`^!)O)PuebVZUdn9NYZZ7g$ysLMU@Ze zdxcyA_iUvlOJf_}-B_W3lo%MREFGFg=PqpjcBnCeM|6L-KC;;-bY29pKS5>kU8kHT zm(4=`nO!JJTaLHnL2tBt9{eujFh$ZMyX%Lh@LeaMChnjUmwB~LiTr5fK#)Y(4QT^<>J3{CS#?-eBZbbK;25i`vt;V?!^yraB!M#q#^Us)eh^OQLx-QVujN!zmuYmkB|M%aFNzn zZ@QWATSRDAAR!pFFR`9D?=;);sEJC%eZy%PExr}sCbyt}#+U}gjhqW12X*zn9UUGU zG>eNkiN2%FF$-YarKGDt@?;{xJg$`Qj(!pM3iR?#KZ_Kiww9XKX2n6YZnSwgx8^h^ zmSDwak5Mt{xSpvOLIF9C9+9kJo7JT}-6bKBoFqV|_F(Vz01-|j8m2-)wT2#mbgR{9 z_{47^l)li!OJ^i!9HtF5k2e2ak76th;=4&sq&9H-zoOkB$Fi5Ou6;wuQ=;&XhvctG z^^AZ(F$_V>>P4qNZnXKe5HG02S<|M1QDi6n7dijlq5*Wj-32tk--0%SKCuyn--H8#4I z3PAQ2ZZ?9LTN^%G z7Fp5$v~^e}9E$^62U-Z1E1br{8}@GLE#UexGZ zem2!J-GF4KZ%|;eSa7buK-1NLCvmX1lr1_$&rS6LSyldhp9c9L(&h#O&KToRH+H>M zETCdTzd$8YmIs`)lp$AEoCo?wnHrLp!!Ck;w#g6C3G#))`#MuOvO>$huuu8dO&+@N z>J>V!SK}t;esVjiBH@Sg?7PVoT`XsiF_7jQ;<2(tjVi!0fpP4)0x@Umz(}0CdFhQD zQTES;aEU4of!W+LdTw$wPLj(GFAcMbSr8P~BHJQv4UK#r3d?t*zr5+ZKG=3wr&>Lw z%wyp#qKjNy@!%qN97WpmUFOwZP3qERrQEZ%bDWHyDQnBd$C$n$iKjXS%pe~UNbu=#f-Gg@JZ^%dQ zJ*2uw>7PW{t!CH#Eity5ee*Sh?>O1c<33dp>gU`SwvNnFFs3izZFyid{A@}{k6^B# z%XfN!H*kU#r0edcyRcLL3q~hGray}U0ssOP%5M%a3r%S|bN>0RoB_T;f{W#)|I7tQ z*CC&evadQsZ`cXY(2O1=yc2V-iUB6I{O%;o>ryihaKm-gvv-2mcHX#^Co&?fy~L9C zqw6Tr=eE2BmfF_SbWfF$@EqcE++wZF9i>eaRZq1}%K3~+E|G7Kbg7hT#-g4w5bl4{^{k#!9(<+T$4* zn0{FNr2JG%Nk4MePfcylTPstNvHC*+Z1pC!M4PH_QMD845XT|6>@*?h9+uH^7YT4+ zPJG;jrR362GM8*rVdinKIGw35&aU9SE5>@?q@CW{C+)WsMMyqH?)P=wlM*}@@@&SE zCAXU+GNrbYw(=eyHAk|pdq5TO{8E{-c`z~1(CfMp*wNdbG?&PP{AQzvtESGaRc}*E(#VfY>eo+wt+myc)NHyt2R%r1WENkT zUi5#aGcKWxoXAKn9o_+%wEj#KYeeD&>#orCue2NaTbJ~wUCTGl0b*5`tqBgtT=3U% z5_$o1ljKrzijoSVr2$fmFJBx;r{l#sZJ#Bqxesdx8J5gA@Ei;6){k0={{Z;W8P{Ul{8RmT`c|QIX4r0OWVlLu@~>sz6KPn3pF%4YtCb`BVFPRG&Gh9W$$U2PkJpfieba-6lFbf z8ZS*fexWZvGVQQvq|%Kw)VT6k%p`Bmnk?9|??5h45u>mTT8$uIyVx5f8X~S* zpmS5$dtgZ_jMX~Zxh=YJnjyklv=DP|n&$=9TE6sq2c~+n(KJLf>?R#vK7! z<4x6Tbk_PF64e%Ni3W8E5K=Zmztp0PpE8}?Mtv_g8Lka;4W|&|`2z_&uAZYIUx>;X zD>k>)m5t%YeO80Ib3ZRkRpw{vV-*d$P+Ff(!wh~mFSe0tvP)`%^5c51osii#^(%t6 zZ<5-`6d)O`s);P}SnudNW!Mu1D$xr)`y+ZzcPe{)XWnplm7??zM)J0IN@eEZu@DS7 zJr9|GX;8+xH>($W@y7UScsE;cuJm^Tr@Fx7>mAxu%F=G#_-|&>-hP z=|yp95X5-|!!O+}hg;+r+Z>VjC=eHf9f34|&&B&O#Qr$dsDF6!=UDu^(^!Lsnlw?c zIWKZdCQTY++YtNEmrTVI+j^@cRvvoBSbq&8w)@#TY-LuT(72bQM)+#%gM8QCXttG^ zj`itO4)bsq3&OeoncL?}dG`EkI4`A5Xp+ZOAJs-fm=8l@(a?#BX2R(j-g*&s(Mlv% zWwuto$ruPLAy;Sz$gw#YaOgW~rn*9}Z|~ebd8k_L4@QAdTSU~3mN5-P;b2oSQ*CG7 zpR4&CfyRvexu1)?EbS@M%P)2$pl6LC^YVv6PscyueA&WJwjH3D4~pk7wu~r+RBKf4 ze~W&trCft1wS_13%k5`lAl}_rP<|(Xm_=t(Bd}E^Z{yELC-*Rv^4;yKwg>&n{aNcQ zzp{4^=Ia15hjbj{*ta35*{kP8aSx(#A)$nfcY9wia-4S*Fl`AP#+nOg45!A^fYB>f zNdNt&<|Zd`@j=xvYka1eO3So$rM`Y8E?(YR>#Sh2@<_0m>2D)^dG`&T3OMhYq$A!_ zr89X&u}|DaE{n(%_$$&hGLGh(8VMhxgN-lr@=tTWB!W$fU?c;&R5YZY9qi=5V_HfS zXpi!D2lStX#`|Zw^1re6ygq;64Bm1)alzqwe>1Hd(Qy1nJwQ94Z)7yd;HGLlaiHH*bY4A#mAK5j_CzB=FMBq%=M zFD0CA!UTF#2PXaU!LHovE3t8PbUNy2V9`2BM<0NxZv+p|X`Jn~)F@LLtqt1j%EKs8uOpDPEZOdT+;cV$ z)LntFI5rONhL6EBVL9>b7n$uKGR`eMlpg!Is^O@5mp|%%KmefT9nslyq^V7>yWjZR z&>0hYQYBUA4tTlf8rmhApflHIPJI|Q-T$&H9Km+K1{{fgcujeU0&QSesizX?`$@X; zWTm}jEujxj>ErSZQXXEn?XwDs&b+bxW@20&%kiJ1*4!s*n{B8{7Pxeld-DV>%(_3oz?w z!`_J&Zg!&!49dSqsYE2ECG#op2xRGF-UC-HC5uJgjQ$|1Vy{#JT|eG3`K7d=QJ>~w z{F_Z*MYT=lLsH48AS8L_gTCcyJLBW5L&cgMPIUH15P%&l`h51A`jCBP!#rdpIBcCT zccp!q>2T}ag6FYrFA2Z1N_5aCMUM00@zjl?rt0QAoPkWZz8{X6!AqpngOEI%sJry4haI9$GRkZkr^mX?`BBadjp~!L zqnz|vzf4gMp$OKZoY!znz53wv!`W}yr&SekvZMz@(%tuVvB~Mg~DVa&D>rk*u=4CQT>9(5D}ty_KA% z{H0FE_3Bp2=?#mq0aoKr$rTJzkINt`_Vr z&elamkEE;SHV>!6O1y9E$KPR~H+uX;nh=Ordv4G}(%@VbdlM1LO&9&w$v)(fW$Y)HfqL4=uvZIA5~$j*g6(9WKaKMhK6SUi5Ys*E@fA% zE0QLq$cx^R{2TqK0VTkV)}8LZVTQn99uYDk;Em~cTOo{U_1>2mVmD<##VRVnlTW!N zrhibV^0{-PBtx`bz(S6EUYfNzCs=G|Bpe?<)NA!nDnR$C{5{_N-ig7HBixy*A31V@ zOmu_ZZn?Hgk#D$p0H`SZHG(k**qDla=(nMWKSmQguu5b>+tI|VTTcFYu=GXpC<#d% zF^?wpC{y(SHCoaIMJaUaW=D>?Q;PkN{gOIT##G;m} z<&Ywp#t(;!5hm@8qba8FWFn>Ln@rqmk=u$qt^h#Gd1sg*gTiR;R>1e_-e|bWbQs2FU5*%43*(U-9;cCq>k=T3vEyXC=$1?U@XY*LKynOma z63Rn`S5ixITA6f`k6Ar;Q#L)zu!pu{bbv7U`9!rVlM zJi_2B#d0Z9JbuFtUH)0M+X;LRji01#nB>|X9q5zJP{4eXc$|}D541NP>qV^fam{-w z>%J1F44<{aPR-@b-whT2Tu3Zz&aK1-&qk$0{(TB{JP-~sfmza*y`~PCq=2Gr3#)mP zzT>|ZpB5N|LuFg6d0IwPH3z;Epo}3u!VO3Ga--@6b1Wr^#NnL117KqUIU=yb zVOXU%PJKdc`~BwNE)8NJjC$`aZ>rj9d&X>bJQllC7gizTcBP-Q!_Tnym%T$! z$(%O?6D)0pwF;U4nF}BgpAk|va8>viIi(n>yPVo#zl%#3ftT02sKdR8@A~lVV*a#% zkYu1E!ec#y007<*4J2<~MAR6xiv-{IH0Ap#{{h^sT<>qefWI>0pi>Qs$ zMpam>WpY#yNV3u2KljRBUTn*%uky52{$1BU=U9Bxtaa4=!iu(S!iX22Rl;spPX(Z}Ia8PbIbbG^x1A z@cYbb525dU4zEwy$zHnIG{b6_XqG>6ef@GGI3f#sjHR9Tkt7l6IO97N+EXFMh|C8H zuy&serny|HI`!?4n)dsicr?e_{Txo(&Gjf5lIQyuG-9Ald+)k6k|&PCquhp3`0JKi zSiX)>6MbaZ7oLbXYY`NQIfnK zkG+O#_5Dj$)I?S`^8_b#I)SrST8g>*>s9j_^6fPb==4i)|8QzlXhPoEe*Vj;0g>0c zKrRf{n$J!T#71!Y5iP-#Ah$!e`z8H8JDDO!Lk|dsLS?LNqe^PV4+Tl;5 z#9nyY#;nN*Yftg!s;F%pRJ(Te-1|Ktg}*kq49{0SRX8F>Vn{|g!waP$8UNng{`N|a z5SCI=`zrla(Fgy-vaI5w$A#1_AcAK*gIk$gf;xqqyXi#F_qwPrrOYMr~em|n((E;ng53~vo?bh1StoXXojKbLRd!|R? z^KAAzHyQvZ@Ij2Jy99^^j?rnwC~UE?9JrFy*N{?W3gY)%bW1QJOos^;%X?id6gAx& zcyC5fH{nrP)DFrs9Q1dNHW@X%R53QT6h4T zS%#oTAstNe3_O@v@A8mi%S`!Fjxp+%G2^vQB^OY0qupfPnl#%~JLSibW4kgcRGG1* z@=jc%4`g=cd-#b@EQ}wSAtkkG(x@C?m+C0wQh4P1wWzm4uJu(uHtYxRhfcjox5|3h zutsS6bvyVwBUWy|jiAE4h>74%+QpzrVqF5up1rCEU1nHD0b-_-c)c^Ab=#f-y zSM577|6aKDm?8In2=(&+7rYDDig*w*AVg!hOAZ-nm3PK$JH~BJ2q+5n*Sw5O;xdZ3 z;#}v!?c|TpeWIVhb+zZD0t;h;M|}wBQa7q#Ds;qSGS+e6`d`vl(m!N8m5yF&-)b!3 zQ9Qqo5II9K5&x_E+>+}`J!8(dgPkK`rO`2MY1h}Cxi&J6bQ*n-k!I{Z^#mU5D5^KYgIncfXH2kguf4%+1^D1x`L6kz^KsIX3Dq>jrZ7NK-c8{0zJ z()((=XSK4_nx3U0Qd0HY@v;?wj&*- ziC*oUUZgtK3u*&aGh-z>TfipU?C~mMm#0S4vm9ES0h&1}Xizglcu#|R2n^$dQ388J zBNtx8KD)L1Kfq70PF%(Ux^$s&Y|T`#o)W`C(LeAN3oV+FA%$}*4=d1r`3|RS91ZFY z8qkDU%$b-MWjHn%lB4Jb!PCD>SRxpy9F#l+zICM(4l!p0ZyExUVbvFKa{!S)Ol0zv!!vmJ717xf7BbuH1z z{|p%-8@-P+!mx~@_=Hnh0Pmyv3^navYDey;;H@&Mgs69hd4pYPK)Fq@<7rpV*qB$d zr5Zi=0yS|+h0&lXF-WJ%u~d~JtfHgvUNqOi=7dJ5!SC!bf8xXEh!uEUqu;n{O}(WY zN1g`JHY;}8E#sKpx8&?xpgAnvo=F&q+WM4=uu2XtPmLxm04hg*??jm-GxeA5zw82c zj8amc%giZSm(&|?zU^}#8_?5rQ;d+_U0&B%G$Rtd#*{F&R!Ecn{jyrY{?V@6;-eOK6)4iv9)F?@E{^TEK|QbD;yN$NHg1XRj$c_ZP`&q(S;4t& zvdx%yCCxp7>vF`%pTIHYm7isOO@I`iFx>Np^Du2|4(<7A?JO6`rDP{Vl6?4ap;Wqb zzJ|V3jA8G(sr~?{47ZZU>cQTP^Qs_^m<74k;VS`oeZ%QQENN2X*_r zN0u#e(&4J?p5n7&?Ja~9DH0$Jq&}yh8JcQ4i+Yw!bAvI9Dx;$LVeAsUBt4vZm$cj5 zEmrmm2dbgj;)Bs5J6uVkT$S{dnMV^y>_@Qf?{ZdB`Z7H9d6fu?$;yYxuy&c}izFY= zrS(+El39#qen)CpyPD#Rdzxix;NDWKL+9k9{sFgLAphF0j7Cdo{8ZvV z(wG|nBRWNry;V4)8I(lHjblBWwLOMJ87SBAIT*aRtcus`&$SI4(*~CnrdbX_t6^5L z>}n@U&2i1-oHK}Ux)r)rR0lV$)o-mk5p2=uRU5cDhE*Jtg7!^=^air zLBnM#!t$4+>mShGYeto+-q^>R@6gZH-cmL3%7Eu!_ZztL*mKqhdQ>Pny$eXBISPoC zjjm4+CjG#7b$H*}C*%?8tNd%p4}yNKA*?UBhSq-Wc2C^BkVHMdO5V_4#}V>(P??s4 z8f0Ic%zuL(!D<%zFZ2j%Mx5F+hr;J~h=!su>-q?)_!^X0c5VZW3BHJ5g-3aVpZccW zdg^szN}B#UnuxY7W%`!M!R!18Rkz!-14DVj;vi7w9L-3hK>9{($*+?o!g#auhl-+; z&9e%N51EnZ9~l^)WIy70wB{(7y!`J2B$fi@f>Z-IU(oxSgp;G^##8`X3ROnr~1LQEfu`M={$B5wJ2_A$TDus&q6JG$pE@5kJvT2S;rhrH@#JXN@?b7b{X z{zvBDO=)!|d`EEqmC&eph(g_Gyy_?`9zLy!|1u1hM$~LdNPSgz+ajr_ZtxyB zZ~t2(K(qY};0W2OFQw=SQt`jNSTW^&^739K`O?($!r9(WRHEK=4OB_ToNL!iJWfcw zdoB1WjuRR5RNSLD^hK-BZ8==t$V$b1E%?;E;RpF6D||l=NR5q2qw>IM?@AbyLigMJ zKjsATzmD|55tBo_H2+nF>FvN_76oPXj49E{BElSpz2B(z;bw{WI*b}$PTb2@VvTD) ztkTboy=LaTb-inuW5fJpdzv1&*Inm1p4FD5W?mcw!3usSh@VJOK;C__AfDMT+RRmo z>2$UauFg6Q1zZ8XN*{05iJie(%GCspO%qfb7TH3Vc-}}~lGKOuTl6bO1%r)>@(Yj~aKUJK+Q#rBTr4N^7(OtskqszHFkNmQKyR;(d zoiX?EsJ7k}e6_&=*tLlO|I-z$%T|VKGdyLo+o>>;q{!{vv5ZpyXmI15cNUog?neTa zBxo4uBxZ7?kF06;O@RY1hl$05ZMH(ScG8=%bUNTg{|AHs^=%-VItJF)`<$ySv|rn= zqJ|n64#~5`sPkfu5Z_}8__EPF{BN4Sawp_T5vOs>dlb}UU zt^bGPA@~dI&HVH8I7I48>RQ%puv%osg9b^G^?xxu?=kHFzupTD}BU6>Hf^Q~0kx6XEi|)XFGZkfak|zu@Z6e;sGa`>_vndVR z0*0f80Kv#yQ$880~CqVmG_5u!-Re2 zAlV=*coG{dkC2FB*3RYZ!`X8LGH~mOyxb5SqkMw(K8t#J(~8aR4|(cKT7TBbW+=E> zaheILPjDKT6a)JWNDnId=NiFykNP~$blwcEsXg7V$Ey5Ry*eKCPKQoOyMcPvl3>C_8Cfg7$cpvHSgxm zQdXEN^1ak!ht-q^ozQP6GF zoKL%V(htvmw00_YJM}6L2?0t-SBDGi&YsI-tCG~D#mBM6ZFXveUE}Bq*y^f?Pe2oz zd9HuY$1m(B7Q?Z>^9?ef?>W=*XO;zZ4i$zL`h0MI18cLbvKnn?-ib(awJsYOl5PX` z;Lf*8Mz0c_0p}yEjT#K!-7}gp^P_rYU`bcOTFye&Ru;isGaWpMcn-kB6}YhH#6ZaS zPkZKq-QJLC*SdM%0CvOi_)f)oStFduWtUmJ{LyUoP4m#DZuROxspll)UTG0<#l5x4 zkEYI5K$%&cIS$aHxstH%VWbtvs1c9YFfHS_u;1ii>1C%i_Fn-<87cHbqgLXM?*Zi? zeX1e1g6221Lv;@@Ob7OAVkaaQiwLK{|2U(H#*8I>ir2Czu)MMTv{nZ$@A>A|WYS;M z+E#!P1^HssNCV?)gz0y}P5~U1|4qCQw$-tcB?ZSLzSfg$it+e%erPl@C*^6MMbs9> zr%^wP&H`m`AFu1B;N1vzznxXmv9TWh1%9}eZ{j+u z#*+|^7?-otB57D6WS4U}wqOJA=r27WjK=x&%$(>`->~w)+Vzx0pQEyX3-BGQ~^cIgd%3 z+T7TH3P!LmURliEGk`tU1J>3t(NgPeb38ZuxJgXT5!i{?h^0BHKQ6quBM{K|kC4>_ z%51iUVKUh(xWLg<3Kl3<9#cQ*ur@9Eiu{+}1B>fwE_P7X!-&P$2t)%wO`nw8nQPp2 z4!k{%RWn5um-oFlW1Q{%skZ09`XpKf_Y*KPyu#M2Uqv4zUNbaSX{s`f2~S(Rwl_tE zu$k_*Eapu9xHbyG+!_c0`R8~au;3??{JOY+OMPglKhwiyI1Q{~^k(guq9&`?-0KCl zz(@OYP35aUPZJW7swSZ7Y4}5UmgIFnFVfoZYgHLV*FRC4K!N zrg3q+Erf zUw88DVtpcaRnq!x$er1DFuoG$?q~{&F)Zf9;v&t3tP=llbm*3y4;5G+{(=c}S?u|( zUE1vcXK8W9vdjpY68A$wGl+my?*u@M6zYE6soCCfcETo?Jvop2(zFo{iyxEGNnLb4 zBExwC${!$;n19liJu3%6M8`v#=VF_(16kJ0VCv$(ot_KX{uGVuFt$DoB7i4%&c$mp zbj9oFpMkkOnOPE?H{sD~W3fda`1XmouW@<>9k~pdA-61+Rx2~Ng0SXUmh-A*?^U>7 zs>X%>->E+#T=8lC>8+# zP+~kAk+vA`Mz&}lvYQzX5DG7U$8FqnHWN}BM$l+QHJm5W3Z!T~B_*-9n0ud%v?Dv3 zR0JRynn^`C^A=1AmXY|xeD0mYTrgdpYqg%lI;Z;N4F?f*hi7aH`0x_v4%WI|V#pie zfml2MPB?PTKrGc5QR6$ z;5hdVKM}8f( zQ`4*KudyBmAwbYb($4Xj_n>Q(5A?SO9-8^?=$L!8-0AOyAbP-o0jPx5)7k`}gAr>U z)@rwN)3Efl)!kdFB=$=Lqptp$h&o4{J} zB*d6U#-;DZ3H`I1ZAXBfS!lU@efn{alc-8{f{(zJ#qzpuEYCGnBlA*0=0vfB%x&9D zgzkt|M8U}!EptGd35*tg`?F~+n2&9&R@Yho{m#a5tK9`~X5KXnjGbxF(yQyaIc%Y| zAiZn^E2T_Bq~7d#8i;d_MtNc zzg9U0-Bc*4BO|;Fm+yMu(oqu|J*IrSxs+(x6P7*rWuOI6MrM;oA{&SQo@1Z4M@j2wd;1jkHCsVuQEh!xrV40o=ob^>mhXTWB`T*KvNc%8Ip9~noU!>N) zt2qov!Y0b9T1g7Hp)1yV0m8x3Cz=*bPXOcPdS|l%xSwZ*7_*%DVPwEv+<(P*I#lrh z8~rIBpM&DLBr_k!y0CFo0gbO;k&OS_~uxHdXo@;4(qtv5_b16n5V?X&AkdwF9XMd(yuLFpa zg!TBwm5ihITUVFexUaGeA+OA`b;0{el=ST4xLFH6Q+v~{&=*c~x$A0r179OM5|ohm z<>fXfS7SX0=q1K5;7mRQLm@&a7|{js?Y91MbyUBFYA{$S_N)mUhTZk1hQo zc+XR!8d9jzl^oiqs$0O0(&O0|WCB(%A17i0HFIt7jFpoIY^ebu?ts^?si>`()OGt4 zd-wc`gI=X7*2@fRCY^@jX&Ir7G3%$-htH&}8n0%8RAKBahXcr&vPddUigwIXOn14=;bd56x*|~2)DTtNLcFv7y&5MhisKYULoX8c_sGdl1~gkcb5|p?mf2P%tk1HD z6+sPSIrr%xZYV2ZzQ?7~@0x|8wAw=J|5DsrM@1QR|Dyv6h$tv2C4v$nAs`*2A|Nf@ z3`*zFHNs$k3ew%uF?9FP-6`GOIWRCYzsL8zzd!F<_kQoa>z;pR&3fXTv(J8ZoqhJl zvn!juxzepNZ#Jc#ZShGjoa|3CW4+_fR4VeVfIB*lu%{qg6)>da6Mp;R*DIc?7;**e zT3<~!Ut4#oB=i7&0rRu=Io1S#xo-pbf{$c$hOjZdy}ij2*A@VkzHVKs3wAxX|9LTn zkBfae8zriPit3vw?=0yda$P&E@6NpTQFeowd51vi)W#}%82hFeW>^5Un8ef5hjLYt0_;wFYcVag8YL7reJRgJwhTMX)keu74HIb7KkkXcu#;mLUi~@vPpD>EI5*gGt{ug zcY3sPXr9jl_+4t|yD*;FVx<8JJ-@E)#?tK-@cC(;Z z!LvuCe2}N&8yqh<7@^*$!B0HWg2JinUeK1E?(Sh9_@`Xna zeZYQlf zVW#Lmr(4g7gN5sJh1d5y7v6tzc{m~r)P}P>H1^BLKYbU98zX+R5T?VPXhmuElQ1J$ z-qF?4eDco7y*wDL$6tCHj^Ik2>DCi<4g$gF8l~#y)azvhnk{pj<;I!)jY}nt@ZwBu&79ZuP3_CZ9OuTjM~em@j!8(Z#RSd=(|&+=iN5GqlPGGyk#VAmiKgY zB&6r+hfu%HdpAhKT6gAQ059 z@VR`>VUjg`cR6;2Kkz)r1uiyxIvX+uZ?MhAY}dmdbX~<@J)1m~ejncv2EBg!6hsJ` zlfr)T&b}HdM()!bzudyDxziS@N`M@$#<~{dcre=rQ>tK`j3NFKeCGzTU^!TM@p%4Z zc;*+76hBsb*uI=0oeH64^m=07l7D4xOWm2Kzx=Hjj_FxqGTTMpOxG?Ba9k$Bu=?$7 z#YT*lMaE%nOxqfk;3O>$V6UDT7{JoSF%yPyVSQ-GmnxQU7TcFYcJ7OqR3GBBQcsVBkp?jaV#k}e`c^%e)>3Q|M-8zX(%U2*-!Xgb%hgga z9D>BBOlX;T4F+NiVC4tb2(F|&*R6eOMXc~@AjvG3`DEfRpzqPUp- zGKd?&z|HRZ3-uTpT>~F$Scw&Y?h3l|0&bzwwawcIm-So`11(Kjrcp0Z&@>V2X5doH z(O}nhx2xZG=wyT(^@6bpDSN_icB$;qlX*RP8_}jS&v-Hp)J_$A5(SESk7vbX$Njx~r z#^@ifEG{%6ng*jiQ@KgyuL$qvb>rGreGEZcTEAdV!OFN`EKIShSC6By9MhtZf=a?^(|+b+N|HyDiBF_xOr;bX*j#H zBK2VH>B`pn^o;6Kf0Q+uC6yGGX3;1~2;v|L>-`OwF1=6oOOt;1dTwUOSfh-ad?%#1 zjhb4Xg=>l&rm!F07|UW4I#+JeW@VO(L|4>tHPZx&lYVnao7ghc)V>~6CCa05QSA_@`*}{VFT|* z6%>qr{W>lalnq8(eLrKDQNq#fV~JI8$heR?n=9-*NMk>rKOMSJjK-h@aO-MF7c^oMj- z=o4N|a}T&v_7B8bhWq>KRr7OSkzO4~Z%Tf~HPrJ48>>0VMC8{xnsIrv6l*SUW|&T` zhwz)kMI@CyJH_HYqfGf*mVv{>i>VSW**7&gT)HnY%RlCIissZbDSgnz9TC2?@+pE@ zI4Rs2jU|_Uj1Jo5_cmDAdBg)lBcYbm#9=!l!Hwxz9)lLw>^_Xg-aOdmjfp??zs$s) zP|i|%MZ!kG5#mo3vrhq0#!5>t)O%)0c{>vaU5&+V>ko589_vh#NycEplyF&a94e|` zX|}?;CqDk3XK$)KvB&-~DMGks`&(`u!#e;P5@&0pwrK(FQEU_A~7KbG~vId_yo`iK>I&`#dpe&tn0`d=*i+ORgA`( z{~{R^oWm#0uxYeGv#25CK;T*qQTbAKhz#0@$< zOqD0vi#uzE$We-t2SE=So^%%HTm^fO-t+e@badMn`%&`bbW^0|@Nl3OuQS;)x|0(1quF@#M%_=Jx9ar z$y|VqnGv21Sbr;PJrEOUSD9}=)fvOHn9$J6T^XG+5Gr)Ah48H97oW*EuindrO1{8X z%u3OCbl~MatDhEY)!5^Bkhc%JiQ(=h{2W4Yg62$F)>`9I{;MJOr(UEm{DY|UFa0C!HdIPZjJNa7s z#v$QpUN&eme$q|5<9&QkO?&|r=vEwqef@%j@rh00JuCBNsE%UzJ&{l$-z1dHzSvm8 zF%$QuBY^KRU%O0=bGN?4F!0_gOS;da%etd1`X+r62Jw)83G-ZazU4D^*rHQZ?pgradEiK`_<*Om)c$<6}9>#5JlN zRm4Rh>CX$NdBWmbt3K?S#VPiNA0Pk%TclX7}{8b(5{aWC7*;O~#Cdc%-L1o`S?fK3m z)J~0v%VByEbtcvdX%2Kg;n$x@N`DuSFgR2n@GkG3o>BTZYG<>x))KQ2iG@uRF76r$ zdDxLk>8lOXEvHUb?BiUQd+%0is+X2rC`Zpz6&3AUPiyEIF$2i;Qo!fNR^&RrGc;w( z+Hlqi8{Owzx&N0XV`V+LNgXm<6wI{QNat|Rad?D*YDjE%N4ScZue!w1!CmFGVzC`o zQsX44baV_?l2co1YVNjJ6nyB)mwMks)GK-@y0=7wpu!(TX<^oV2sdbE3#ktZ0i!V@7?J{^pQ+?7gHE@+Xbv*Ez%DPYHexP?aU5&)lTwS6? z@#Utc1vo75W5&mBc-+ z)nYs24%Dvx{bJH)T>)ddvhU?a_=zxJ+f z;9~h$#ZF1YPGD8AevUcB_VDNbjs*yA`#o;AA(JIv5WS-?B{`*DU& zCj80{ImDaed|*B3Tc=XUKcG<}0}M~fmY|s|i}$z1GODfX9Bfa!c)wcjdu+PIWjh(w zK#QrE;+j1R!)JaT#fCu^VRteBT9q|hQ~Ac`_cfOja(uPvP7BF$98-?<(FNIf-j&5* zlr5R;iJDQeIbMYWCT!8M2AI%ekF{C8xlXTWgUJAuw!*F(QI(@>n2Up-(`NjtuST_V zis-Q-6?nxEN*==RW|y|MFMivU^QxRm3bCYTFO^F>vPEK%M}|LX}5S|R1Wf!KT^gG z7sQX*3mK@ZtA8KpjsnfSQriI3=$(I6?1A?GhU)u&pgqG_xHhazjS@55liRAZk>*|4 zq}T!5H6cK8ElB=TTz5xqI>m_s-aYfD5`RHxi<2psRS&l>*s=CqbsUVTWW_VMs2;B} zo79R;7+Of;9*STG>3(q;^43=H ze?Fz|EIW?3*jdruygQ@s6XN-n5o#&Kh+9&YV|LL=)2x8vAR`>wUw zexS4}8!Bh77@}RfLF0uc$Su+}J6Jc2DUKfKxX7vVmd?nAcciJ7gX-%EgrF+30pKZ16N=BJtk4H zF+q`s4h1lsYlETWyE;Lhy+vVEF4qS7XoJ~+b3y1N<53gmw^{ZdJLhM11-3je-%SK# zQ{Y?NT`9m~dS_M$s>!UIEGBZ6@qbi|^&|a}MsI0maIAj?kEXJ(7xFc(gYYvI;~BOMWbL9x7)(VVKY^s7u$> zyd6q3vhNyK-?moRw@})rS2s9PwL6g3Yj69@7udjjTdobVJ7ez;-+v@My<(#Cj+yYX@g6vW_E-L!cpoIn{4+HN~!H7bIh0fyG#D}lDfAU0&TW>S#02bx1 z9(_DV_rV5i(_`j>m+U)I($_#Czo;1qHFTPwY zia9TPR#&LKb-yovzgiPi@^!D@ZpsAN?;fxb?Vx9?MDeFAqzfba`s|m;hr)r*xaEw& z$n@Pz%X>dZ=4Zwu*VpRl$-wo6?m5GVP0d;8FMwU&dr~Lfe!(s+a*ghYKigwKO7$Cc za?}jFK$JDN>+EG;?=Ir+S(}9Wt8{HHMC3l;ZdxCfMBvQ{IiIv|N@CK%PoEAIla=#P zEIc#EZ#sU04FCX+u zQH7(i!Rsb%g(>9uANK(1y5@Zj-Y(zlVqWRL z0_7clj&BRn{`XO7`|S9O)}b955&geo_yu2QV?DID=5w?Lk{9hhx9pGp`ye}QLf@zd zbK7HPBEf8PSucAnDdU+`$=&ajco!DSCGC5cALI&&S9nvt9N{&=^O{Z{5Pen_^!*Vf z1?74H-ZYil?B`nbIKF1}P`iZ32i}&LoSD7h9ku3nNMKr}dfcEv#N0{Ej_1urNXlDU z(jW6hw#6RZMX6`}rf&i&-I!6D10r;K1#>WG-J6D5k-C7ny-_yXE-E_XcZar18=-i|DraxN7(#RO<3( zFi_%Z6dmk4rhHxZx|sTKM?mJfPQLG6xpr!@qD9&+*v!To1PW{ZuRGTD_ix4BP`U1r0rCi}OA61ks0f8J_grT}tC;5cOky}m8 z#P6IP$(!VpgWWuKfs=zCK&Og=XY4p(N_A>ZkxInP0}p+gZi9Y4Io9_xZ^AjEG3XQa zZ$KsO2T+}&kiQZ3YBBshfa1K(xBk!nBrhX5i-aFb`Yf9avH$C`cOB7F^{7k^a5y8m zCqEN|9;m;q0`bNrSF@ma{U`svg^~DO)*bCV<(;P7C}66GJ&)5zFp(vnzc_rPttcCs_l$w zo!!;|vR0WH1SXiU$sB$ZX;RM?)lhJrl?7I!o#Wu&%D%=YYHrn-8&^!4qN+CFMhN1A zSR%6I_41=w`^*d??2L}7`PkKapK0K~d>9$diwEjgf5$QgCpYU+ziugEWv@S1XERp@ z31`x9oX?stafrS=fN7I3;ERWc*Xlh;Nd7 zmGgCl&5u4|uayXKDu#b2h2>xWPuy=eA3c>`d|nl9z(id$&YKLwEkUuJ$}dUo@q-u?JDC)dx zbz-#J<0vp@BelbE*h*_1q|Gz^g%nULCyG(q8yVRx6fA$}+?ePXY`m{L|D}sVx3YG| zw`6&rA|%$B%R|t9#)Gr{*Ju!AxG9&@3RO9cZ@Z-f zeaD^gf(y!>G$=%F0P|#kd_z2IrSbl)i}#k zE7IU>j2ToK)21QC{5kAC9`54yJQPPT(G;cnUR_wa7<(_x%@(WbohL?3%E|V5pZZH& zV)GE*r$I_x+XcPTN8?^@G0jiotIz1@%Z(lBgzLxu5Yu`Wn$T}uI zT23v71Q0T6#S(Up$NN>x7CdTl}WM!Nz)`7=QEukx$;leYTkEc^KO*G=}y% z7ErsO7V>hE3ZJXH%!vjsTq;MG@ziQ--}5BB;NT=Jmo}l~R7_IY7fFOf@Etjnx`uGP zy!&UB!@+_Z=CsQ{7EyO?5!qvQr*%xGSk0DuH`5}cHla-=mG^oujor9i zsVXBN>3rv_kH+9=r4Mw|ce&ad7oUK!tYDoTU7V}mE7I%p6|~h`6W~gUz@oE4h{iv4 zO$N1*VEI(ygb7RU{XQGt<auIsWQ?;>8vAPVU-?*6<~d{~`KX z=)(ARz9tYA%#ICez{}OVne-H<$devx1B@H8M02?-?alUY*FGdM5@@2`{s@ZLYIjLV~ zH?B}!voE|oVw+ZZ^gL|KIq=NJzH|zxLKtZR?~%`7o*F7!WUW|ocZ43qw@f(;HN5OY ztt@K@+NSTpKc}spBg(jZ-w~AR)T3;zvFoDe+n%4c&!#NQntas?y&9p{mNte^R06L} zx>$|UP3})_P{=BVf)a5lrGYu^)z{XW+(x8WQHF}P%PA9lOuSBCcFjVnL(JRVX2~{o zDw(gpQ>!4lb4oLGH{_UwPS;WlbT$c%B2@`vw0G*O18=^%j%{BwZ5lRMAR16>P7C0z zqYjmQCWd$o<5Yxy*?#&H@IZCs3xr*{w)hj5p^aNIc#9biENMl?=Mri^?*^>=DSxz> z{PpYSkNT&R;i6jSya|iN;P{q)IAAdS_l!VQIg8{C6~!?-cz169e(+n&qwd{l$q;VUSWS&wV zu9k%u%KGY6e9byL#z}X%^3}T*J&N|S22Q?(B?>;~{C&s^Y!&{>tEuz7kts{;DbC4KuPFv8_KWfaKBI*9Bpaf(64e0oD{Pfcgk>#hF)gKCJ-*z&~mIq9RRer3M z=7Q|(w$_OY2MVz+)0p+9TbBQfm?Yn_$Em#ux7i)r3ibt@2M2CV?)Pna@!K!7uc_M2 zpJqPD=hl}+o_sKG$<}JXG`^auRhmeVB;?mWjaKi!(EA*mj?LrLV#?Nv#ZT zT;1zKWPUY>=%OWr`S@Y`E_USVfL5cgka~B=xi3{78un&NAbq6Lto)v)So>|!7;fR1 zy>0J)(P5{zxkp;!Mta!n5O+0AhK6_mzU&^gPBCf7XYb@>mtNuAbA64Rs|~1!`)2HJ zJ*A}f!$eU6;P=bVjXq^Xp&R_e+Qq4_RmgMtD`d6PW z@Aa-VA7$J@?%~(cPt9&T+*_Cg)hDZ}r4=HD0((@63@1L^&^cenKOC#Ko=Tx?pmS1d zB{Z>9G>Ds)%6C3_lJ-lTf`$_ndD-%hq6@q!it@j?xb7WP@na`j7AoKTsB`D-70gJ1;n&%ggN-3uKv+? zPVf5nm6BDBHpJwZcc*ZsoPXf4D=NP3^=_d{qB%N9D6}4*ZBGLpWSlrsn+>ghKyTbVKa7~X zEt46KfDNpEsr2;xXwsdJekrVMa6Yr{Qw*7pz3z}YRZOkzXpLIpjmsmrOkW@pm;6JF zmi-m_ObQh`h)dzC29caL9#78hKqd~@4fyNHb_&r7==8&1rpWsYkew;TUpL-s``jY@LGJ`q@&s1lv~!jk!ud}R?ij({bR1mU)25c_s< zW*qoSY(#e~j4FLo)#;p23&Z!PYcu68*XF{vbi48e(K!IrG57FyL7f=$=uj0}jHaL4 zKoHk_fnoPSeM4zso(ecrIVQjH4xatf=%E`2dF*&jdI!fx(>61&l4AvGw&x!Ad#*ZU zY#QuwCr-cH$h+wL=dib5LLll5BdS8G*;|xz)FNe!(dALw;u=rr{jJ$+UoUBfH@0$m zD_as)3+lWyqGA;XUGw)7_0P|l-E|CRf`~#YNFZNYigT*nbJst4hIk}pa|JLu_N0GN z`@H2w`~#DrESU3kAr>KgV@&)EP%xXudZW?7Cyhkpv021mj`h6fcKK(ZZnEze=Ypsz&8v~KR%d@s?L8h@qi@Z1-jHMx_xf!_8yo?aisOc_ET5BO#El6LM}1O)R8 zqqkP9^!>V+Lr|eF=LPU?eX683IsB_O0jg;gf2@U2;!}+{d+LIA5Fz|KypStaNiBzr zw-b@{Sxb`M9ZvTpzo-&F`+f2OrafZukYXZE0x8zI`RTUKNJwpTw3JqvkisNME(z?L z@H$5?)JAaTWisOlS9a65zR9-dMhBPEODiNtu`Xr6X4Dj~)8s3=ojaG6V?=AnT!`}F z2RO8vRc~rIF+P>;5YgCI?ciA|vDLgj6N{2#wm?$&dZ?9zWM{Xm=!_raPheilL2K*$ z%?Q5dmvnO`q+VR`<$RXk<#p5tpo;AU#bj=Q9K~(OcEVWeP>hKDMZ-dZ?+eqy5-Otp zlRvYf{{|mJvLDK#Wt*g$9|{XFRmsOt?;t98(g#jrJrLAJ@ZnO!R6@bEhbl~0?=J1F z85E(7rxg#r&o|ac5DFv>m%E zYA1(H;0(R&98bxi|2sh4f=a>Q#lY1-tlT z=#6hdzUp_0kih<1oDt~_pVZU~S2{wx1*I>u6HK%7x}}_XeESVzpS<`mMi^Y8u_@uo zQf-Cx)74~^K-MoLa{gIqn^SJ~SXiM-i!gOnJJw|A_U6k`7)fl zW2k8|`?xrC%u?)6?nwX{MpdRm%HY3iV3b@7Cy*Vp_Mq^_c~wVO$d($Gvv5Sp7}0mD zuzs=Ea3$}Wv^L(6a8UZW^sP#t7@rUh-At-B=W>1-Xgfs~cj0)oD_6?yz1dzmchuLi z<{f9fBMLN#!}Lz#i<4D-Nx7d%e($3H06{%H)pK{zMyMa%pG)J&;n~*}F~U?|?>3f7 zRhy#NR2kBv6VHi@Dr9x)xuWw+*b(m&VQl@B#lj|ZZ){Qy6>RYai|^h`lPo8)R&rVJ z-1^3esnfl@IA^-WrP&eT(Orrz`=wjkW!IB-YpHn1<1vbh3H9m*t?zek@4Xls+{XV} zYe<&vm5{FlE^EpxLFcBZP&L8 zze&&)u|Hl3lKcMf%suYw{)c}Yv53i7H{b5mY}=6cYc%!KO7b$RY48nqsoybQ8cwOB zOgDfjorP3pi_+iJ{qcld5!z>~(~l!x-#^tgq`h#cwlupBlUt)(q`?rnj|Xv3>J*Dn zOUMd`C3FvH)IORIBR`~3FtUNAZHf?)xdx5RH;G0r=F@6JQvWDESG1l97b%UC7`%c~{T6Er{Mi#g^u zD^&UPls9N5u_5jB@A@Ccl}XeYRNZLy{mhl+d9+JU>R&gYiRXPasr7c!=>Fwoua6}3 zU9_Gu+y)n%5!8BK>UjPH5<*HcyOL884j|p`V+Ql1vkBH)(<;l>C#zglO->6i1lObf zpDx{|(uxIikU1zDtO^Ed(TxZ<7Bq0MgWDw3@ps8#q|06~Dm(am`^6?za5)d2u{098 ziMinrCl%_A8+JK1FG=&T)tPsKjPCM|>ez*SEXj9pRpKcBpr#!SXDhNf5Ba?I%2+aM zfQ{;tfFM#6#olS;k!!@o(?6Pn3>=@=*A7n+`?HwJ$W)ns7-Wq`I0BAh(|8IeN8N~O z$ldZ;@XIErP88pg_@e|xqYGz@dLJ|DeKkX}gLGG~PqE zQmC=q5DGbPY~1vETD#t-)Dz~$v$HK%=Ad=v?kXw}d+FA$&fR<;i(}j)bt71-Cq)%b zZA@N(3l_-cV(-O&DR@r7o>cm~0f^Rov?^2}nD0s|-HUty=aKYxQ4N>x;e;JWcd#$; zD{OoePQ3iZ_7OFAQYJbm&E(ZfpMN>x{XWP+^ZHGbbgH9fkOzaz)qEiu7G?ifzeOvt z&g#jUF)@c)>aB)aW80cxT-3heN}TtH-u!{$8uz}$(Yb`Q`TMrc9lx@DHY}|Nxec;= zkLTlqv>DKu;zp9CW3@WLq#k$l{zUBy*na0yorU~%_e-iJ_#0Y46mh>f1@D&3iXUH$ zCNzCSe8r(C=KgP3Y#buHqNv;@e_W_zM|t9vR($pktz-$AvFu4#Qz0%N?LyKax`&Bs zs3;&N^`P;OIQBgMfyTavHT=6ZUKMXumdYh*j+V4On*xN>M3b*BOh&Us?B-j)vo z18!T(n7lo%y)&K18`ui1^O;xogp;tnQm)M|Hmcq%0_53{k5_MUbI#xWofDRQlEBx= z%85=rTp@?Mqe2P8MesghlM~4o= z19=S~Ky@Nh@`Atay!ug8pXY4R@j8CuJarGF(cpC(b6oRb1qlNW2C{I z5Nw$nm-2HT_Noe1D$l1-YNV)4+CZV1y7n|^a{@{?LbP=k6EBOpKx6VkuQ4anzh&i(_0P9wi$SwmnQG*nu9VEk%g$I$ zq+efv(&~-RXpGeM)=i03p>6k;U16W#6qla?1%ZOyvYFfS!mE zqZv%vQy(j_Dcn;!15PM{o@fIB)o|u4SUFwIP@q6@3GPzd0<=)vio3f@a0~A4?(PH$B*@KA z{^y*#*8P0eoiCYW&Ai!rX7--_JbS-E-{d86vB^*ym{J{I% zpWFk8)?TUyuz;P^}BQ*qN=?7J9!-#&2|u?4kE>9wa~C2#q?745cLU zp>Ve0c<)?zop*4Wj_^5*MDmT^3a{?Eg?osKqC7#0f^3e?I?w*;wV}NMp#Rg2{|O-Z zr>Fh&sop=mADGX6{xheI_Wz54Yw~{yHpVfJ?USFs5B%y0vDhTB==Fj_a|5ZoYg0tF zGe@H(z9H0Z7ksB5C6}XH@ku1D*Y~g=*z(46rl3xd8&~tNyx+8G)!H@(*BhmZJJ_h* zR3CYGe=g)#Sx1EHDpNx~P-fgdZI`{kA0=JtbFLzSdDyTeTKCqUuLtpY?4S+U%C1s$ zHuzj`I$JLfCv(@$i8#3w9M?Cw9Ip&_PJ$(QBW5sl1k?dmN{xHvZ=l@b$HjAfT5^9N zS#+xkP4CMbO~@lzlX~v+cg)Wzk*DKR@rNdn%xYqUqDRCpfg;fm??Bo7TEho#YZUNV z{k!uZul$AW^Z@CpfuqzDg-B>vySCU7Y|xSyAS%g9EaIgM!vH1#r6j&~VtJ%Jq6X^l3U)T1E;1BOiQ^R8~B$PT#Z0|hE#h}URh7Wm|)ETscToLt8 z(#SeHA2ReigJfg}-gBJoVIK{?Xy%$`XE=9`YI96d9g0!aZJel)jrV}VEEg@AHtE8P z>zYi5bIm`pc&e z#xbM5Q#cx@QfjXaQG%+h*^Vp?Xu*e(7iehsYz)F0RZNH@Z9cTr)Dc$JPG28|xatoH z_$dx0pzw2Jjq7kc4FTloWSJQo`*BD#Jri~Khx!igPI<;jNolj(ROdt@2-=C>pz|`5 zdVb838NLZRICXW{`^EI=1b<`kXwY2c4-C>&R6x-?2z zTr%CeiM2Lzy|htFi<=IFU)-4A z-u@ZLh;aFES9GL1*k_?pK&?#s;_Qd5bY4sq7;TR=B*rMfgcm2>0|AZi!=&>B}S9ymq>4;tvhE!mcu6e=JiL1Vg^j8dRSZ$lgiO8z-2fkIF z7wO*j7~GOOm)Tf*o2e?&;mC`F&^A&3DVN+ri>KYnkrqm2ZFjSSV6Z*#V`d-Udq4qv z@=()S{BhrCDGrHSxOo>k-{={ojSBWriRn|WE4QrM2XbOyDanJqK_=bHvd7w|tKQC! zu*2rUQq&;!0#w#r2t_5PrPx6tMhB<*_oc{&m_O? zL5+!K1%VJR+_~_|WkUgJma(KKXHni(?$>8BM0-4~Bw9aNdWh(n0?TouuT$8cb1OE} z4gFwwugiHaWEmeDeLlKhP9x~gWj@l*^H9(oY`VJmCN9$B%#`gJPvNy;dU2yjRf0JP z;>Kk5AY<_;NNtp3ADQRk8(TOan<@9!G8&P1onkGg0RUvQ7zC~QCnd?REX+$V!xWV} zIoGYJ4`RFYx@8NGEdzcCI~k)ry2!Md`NT0T60x0><MEF9v0>yC4I}Ls4Dy zViuB9FLPV^zHIE9M=RmuyD3}T-5FhHoA9L(8IpEf+LAq(s+ERxwZyr*JHw8~Q&Taj zR*{~%#ofKuZP3*6zgCX_$=UYetXK5C`@nvl<~ybezj;P0@#I+&Ft=&p!$PG?qs)Q5 zs{vjU>gzu;8Bxk2>dO;Tu-k5fO_GLSR#$VchVw7VQ8(ezTppSy4R6)9$;vDjy9p&% za$C+-H?4z16UE>MT;mUkIxpoI{jBH1-q;-v#$9xb=ZWjG?7$-CN`skIz&33*AHD{Qjtn<;J!FFzK- z5_y+1#|y}7Ls6i|IpX+T&8I`uwowY5D<|b3psW>PZ59R7nQpniy8QQV{lf`(RKVSMK8mJbs0Y;-+9*iR=-MRxws!A^;O-(4Km zwWxHGROb^%7Tq_?Eu`fvdcvCpSz%bM>hQnk0#PGF7r~mEK(Fb_$&IDjG5ev;3A-%2 zqqPQX@yI3@H6}mW@EEYBAdY##>0bC4qV8S*p2xKkyA-AxCM>x?eHVA*DOxh1CCO+T zr1i!=J4LB%!4=}@D?{TyXV+9x-MW(5b8~l+k;bs*`5^Ae@ZmvK12DJg z^kg~otGUi{D)Krlq%drn?NA)nd<)QpM#v2ZdeK^mH!Xe%`S4K%m^tMWOx+OwCEFhZ zEgAHubvQ_;r>``_P+Zvpd{-{lq+e%pOpny%`9y)59-0WB^%%3Z_vs2FLAb*!ubO~I z&a?TqD43e^UK0UcAGzB9l*VeV_a8qDO}-s&6WAt8mLQI+1xdw&jeDGZ=CO0m%W&Oj z4s+hRZuuwLcQNIIa8WFAn}C%*hLT<;4ejOfHS^ESkAnj|W_OHb7OfGc(t|GLxlhi1 zIW#!efNHx`>&(BFlyt|nI3&+AiqduG#?)%s$duX!GaE-4b4KT4)wWEEPbYy0nRGAm zzL#2#Pm0DaVKv_5EJX1f`?n<3r6WVKx7CV2XYD@L`Fu);a+9JKb5p+#Kon|P5IaAP zIg8w>1n3E`#CDBgv7KX%-^VIobVDYh*e7DLQwGSb-tAg7d9o$j&iE4)1_NrMK$y5?s4Ez`lsN=?BxM1#0-`+pv{mzI{aw{8`#EzAMUw_7$A?Bu-E zIv+L97g>3E;t=q`#cDGWX58aGNPlyP-vc9E&&C9?y+7H)5*C9$zKn* z4yhkwg&`oHjBPFtm!R{qp+)$)b9YZ`jR7dmur%q8%X`CysnSj)mn(wZnH%pb%^87d z=qegfV{-VN6%U8%;pK?v*zVVP>`?rweN*_->+?OU?l}`sJ!(znNLRMC?hk|XNFpJO z8`o|a->~&vNf%EC&ve(tFE^Y9H9krmCc$&&A0w5om2g>wV{cNt@XfdoYbseS#ju?Z7Zi3%SUadi_s zy$$W_&DBycJiM+=MMOEZ2JdeT-1dtT2S{fJf^Q%0SnCnJo0k_`5r_6Sg2PpBjr-+e z0xyeXpo{~PBgof0EqSAKlC6(&;ds?kdgMIC z_HRID#ZGh%t}fktMw^oAWhdH|AuYQTVP{UfEGzphr^{tcx~(Zg`9jJo$I|<;;Md&M zIyMto$^?g|e#I^E@hN}EYpGekKJtqgi{IA&HVfc-V@o-iafHMY`_z}7iBYSuy9|^| z-S$rBCZjP#n^1lSqbwq{HU#%$hAMLD#Q@BW{8lO+okvYMcP2^Axp3?1YeMcsTQ70T z9+e?S!VuXUq${|dFdz(J3XHw4cBgv+$hfzxUbHKrO!6;q4s-dpF%y-Qnte-GqzA*Vdx* z-S(=N+dIujV8ug?WFml7EC`-{cPZn9q!qDUWQ((=}Vxv>erm;AA9x*&8~r zrdr)@Ph-PaajhHwaDy}p=tnn$^v8!>Uh9H>b=Sjb)0zP*mUuV56x*B-`_lf?DOsxX zbjVad$xB4DTs(02)srH-?Gsxqu_;n)S&{XvC|0cYn;kk2A>ctE18I}K(MXz977yr~Hd2+zcpK$zXEk+!!0i)^<=(xyAcQ$D6_+p_uX0 zwoh@Ju|D`rB%(T{~*5|ioZ+s>Jcu+ z3?w?1JpL_p99O=mDeNz@JN*#|b}Qj3_?UYe;y;${yXhNG7ydzx0)uT>tl><0z))7+TO^@C z$m<3wHZ8^faU=z6@@TBYIg8ymTu%~qqjFu6bMYE;Zdo1Ol%uAv^Ttce+(TJ9!J(2~ zq`Zp9;C%7+e23dTjVu;N+d(H^I_LbMg&^-HTcY#l@jgwD?n^@Hr3Wmgp>9iBWFv;=kcbQB z*%P6|(H3h=AT489t~Dj?L}{wX&#Hu?~oLya|r&L^a)(R>#l5t>hwy`TVP9$a-da-W2QNFYqfa?=4Sa*_z1+JAcDiSKnS;PY7nsLE=r;j5S54OUJZaW@X zr*a4YhKuK$3)P)WOT)sv-`iHbm2WhfxbD6L*`xGym3LLsS4e#%@34&wQN>B6W#=j; zN;KlY5whk)Z3F17hi&_Ri_7=US6RvW;8tzA0&)4atTk9(i3$HTN<26l3eV`R#s`I> z2rL(P7I&9sbQ-F?Cllo5!Qv|9`eh>`^qZU3PmEoTIfsf|J@JXjXbEPQ7sd`@vqj)rk=yw z%YF@Hf>9@r%DncN&)af12H%#*E$Fy-FZyQ|H95Wo0GQMnUB6siomuk+!Q(({7yRSM z)ABjX=`#6yoh7*(XDz=f9%6_pLabDQ5_K@E2Arq8%dOwvL1H+g8QlthUPB}5lO(@I z>DlhxDK*a8xYfdNetA;aAd>Q)l4JO!x3xB$C>A&3l1jcbhmaS^%8dmzGzfqZ6SoVT z7GR9=_ML~LeeO`86QNqwEUw|$?<;KnPIP3Kn#~&p-<@7sye;U z!)&6ul1q2q6%#e|&#=e| zM6kt85h~Ln%I*b4gMZ~Nl}iybEizuPRCoyBi{tCJ+Ke#?)8VFBX9DBJgd3!h{9fDB zQxuTPu@&TR~7w!g>zfyJO>#2(4sS(^eMVCfhTMx$96C`a|F4MqWHzoTfVxgZtB;tKhaE71p1-{~K~)_7Z%PVlcY%Nc#* zWKR=9@vH|h2~{NGWo&_Ej{foI;4A{*~r z&0C-OgNacU6kf8;hg4agUp`d6w_vitWg(Z^Y-?CD#V^l^ySz zv_C1qpbxl}{S!~v%#>2Wh;t5Zzb$kdJN>`IId2;xkkLSC>_>g%5O z{FE1lvB}9=<+{i{(;joP?taNsaDrD;N>i*JmWp4)?aXtu9A;9o0b*I|kE_Kq_;py4 zsgRelB01cxTE_x6j$9Wnwe==gM(bkM%A~Rl6$dw&$5dH#+3Rsdk8CW2F1yjBD?FpY z()!$w*`Tikbf6R>)0zv}l~L~TAHBggo^^Sthrzcs5lL?Yl?J z-@24z6x=zSoVv8!gbttBzp$owQioE4q?vH5sEW0$M~TPc)b4A)z!GX6IUX+whi8W^ zp52$XLiCCkt8(6A^Ls1$ze){$_9x%MyeIf$^p9_p;=|w9toDJ{J*JnAU$}D1<@NM` zgxVoUx$OLK8z$}L&~C|{gPw{8#*pf;J5t6(=YzV3Tnt6s#h)q20LU?{^8mjMc>-UT`r$W!G z9>e7-;eH)Gex@h#R5c%Za+=Z${4!_sK92fBj68E#yi`gRQVi?K_BsmTc%v9_0#q!dE@cT-nl^HpmE192!5@`|G z9o`B>Z~!gn*lxdz9WhU$VMP&nzQ^n3C|`3Os1FG+;_^WEe21SuVRNmqz&`j(XQoQz z#f8G?Ae*5#N)OM^yT{a3b?D-kJ}Rdv7=obhkj7A zQj;_;QIGi)oFqsvv-A7+H$?(`_s-nztg8lNI~Hv6rRx+DrKik1=ZArPJq>4Mc`5S>o9|*G)IlRB zUqRF+5lceekul+$nO?7J-kQ^kI&coYfA@hm{Y$X@L=C|MDYc*a3f?uJ)lA-pTUG0- zgm%%-I$ierbjs;6ESfRo9Kv4)cMlcn&Bk`~%cJIAk?Tn%GBVL`O%*)!L@c8xZ?$Qq z?U^vVPS1?)7WR{r%rT7tb8*YXocy7oix`#WFAJ(PztfMdwEZ6cyp$Q24TpDn<2_E@ z;l!WHL${E=cjMoX%-%0+_|me#P9)P&<5{mzO<5v_$@uATlGci6@=MyPga%2N4Kk5* zabW0jJ%{-hdu%D8S3Wfm(Pya7g5c9VzxNszX>D+YUT&u|*;YbCpvW+POc;e~UnE7m zZ`fla^3?{}!7VeogzEQ?iSI;kiLuKuCm^@^!38CO`GNDZPStr?wnI^w`->da`k4*% z@E+z#?@_s=Pabk4tGp38>PftO*D&m7YCN~!93R*{U5UGyle-_+$JaU8b2{@4_`!-d7{o*$Hb&%stTDs#5Wa1vP23XNrY9P?V$Pe!JG`5EHwj>dh} zQPtIEzp3>i(80fd?2cf9)#L9S_d9&NADV&rIBtY*RztvFQs}+ZLb(oO$q4E~R||$_ z!&hE;Dq=;w?6~|q{yII!I$xvWd;h@QpHH~5d$+Nc>X#Do9hSGfBBg2Sn=TCYT$Ce* zZwZ=>b!BE(|NI_OCoo-HmSW;u8dvEnyvnMnc`T)r%B4#;gQUXa}ZmCYGl zzPW|vLb2oSQ$k+h;>0#h)k`4Z*-JvTR(9V z(p&~iEn=How)2y!&&>QKeuvC=88)o$h(lhe`hIiUm$}-u^n_p9h`6nx6Wp&9mfQAc zO23ANx)N>hpEa~Dh%%{y`KJg4vp7kezbK4{wZB7QR_w_tK_BU*{}kFdR910kY1K$z z_;OFN^KOQ6AS8`Yk6C00U8LeDiMpsHCgnd|0NpSK%ZC?0ThG;HoM=x=qfjhMxeRVD zM|%>_I0oGqweN7e3+%(wItLecK|aI9#BV;5FV6uP;FqHq&JI@Odc<9wnmugJnFe{% zj|x#$4)jk&3%&|K-6F?m7^LKr>Z#?8es;g1z$V1}L?oWV2&LG`aio>~OqFv+n`2us z+#eZQ;4><_6A=)~zW;}mgoaz%lGENwTGf57_FTAlX^lZZE!j~Bo7h{Bomr&P48>O9 z&1f9{2R1&xyHM*C6;W989S5WWAj;eLBO20U5)znfXVGf5wMX${?|5-FKt7rEheD`% ztEpF>0;lGYW%a8MMU`lGS&|5rflOK^6ROc?fjf1p(p*XEsgi?5AJktFA8GK;)$PC{ zuSyKYZbvMc`Wld-qVwsF9c;NpE8z{TqVJE}ff{V$V)v^{BhpzUEx*Y4!sdCl?(|Zl z=Y5Y{Ej>$wSO4cH6~2AMAJa2uARf>U_~MMDdRaB(QjH}2vn6eR{&0}p3MQ`;6Wu5( zCZN;h%8a*A! zdnA<1l_dRq)00V;)(x>+x%E!$jHy=b9AEMG18(|147>yx7dS;@|Q_;gTXp0 zJqW9X`ttqH6;ejp3@(ogsB%(zv{&(3cRfmFBc}G7si502%U|r3M_wu?5^D3BqqSVG z(G6Z#B3(ylUjZY4~}&untI0Spj|2GR5t!}duet~wd`^YA8!chy7Qe_ zwi@|O%XG*2VrRE*Ppau$zT&u&!Zx7I;<=#Zq0LH3VNt8nY#yc~L&fQ#lgl8Ahnw%z zXDJ01O<^yW7k-)%JE5_DDVkn$b3(qehT_Z-xPK(0b*YA1T_!w4LW^|TLogFHg+ne4`(by>E+k~m098Yqp%;m&CV%Afx$apYg z6FV~P>WxU%=M&#Xp8#fm;WiL^16s*OB<@m5pkOyA8C}T6$F>N+?CeyokGZv=H>^qPe~hC&v*cno=d zGx*fII3$gZZ?M@^!$zQ*C9Gc8eJQG8`ecj0>dlC(xGH0~8iP4XhfjsNILS(#2koEU z19Yg)i491mDx4vsFZNqUo`*@2W0X$RO&N029r?3lzmM)sVP_nD`JxbkB~#^!&Vf%> zNJ!#8rT@8p3L<2)<*!1GH#-`M-!=9j+0#*s1LDiQ6kk-+t7_y6#Xru^94rm!WsFc( z4fo#+)t_kJuIFBBM;;3RfN|<%Bo-7(IB!?2m781L{8PU`zO`NOeote>N^hvjy5zd0 zKq{BTr7!2%vF>;Z%hv-Ly4}OeTmM>DoTyld?g`d@%-fn{vvg~Vr`BJc0$W&SMWDUV z%wFxaBhnaI@J2_;JpunF$+mxV+}nccQKEil!*H2-V+BRhw;XN$riJR1KIZ5oZS2nh zD1XTV_$j;hq(&yMt<+emi9!DPVXWaCP%j(L`kxZ842R7p6_@x(%IUA>XhDKT_D}bJ zzg}!jJ~bpS>tWBuNfP_??wi*xG|azIU<-uI%PJ_;A?};PNynXr*p^U0n&7z1*4EbA z+7rCayaRHQgFa;9u+h=(a3NQAwoFGzaH+|$y}=?>RDt*}Wj^KaI^Rp+I$_<4EJ+X4 z-;Y)`vf6xiNM7)zTrOz+MTzAY5pqK0?5$>z*w`pgXS-?w@wnVuX%WEoUTSha?x3bV z=u`hT&@s8t*r-)!VQFDgX?QSGN{*0YnPeCx`EW3KMq z`C;pg&J!lDS>L2XlVO&)q2^+jQC*>ANaS_IJ-2R)voBgnnoy&%LqlIfmMXu_-z#61 z-HFkb6byHh=5?CBI(~O(i93jnaCe%2y=!h8vImF5$$2ds-CQpln$+l#1pq;`d~Co5 zucq4Cd{canx?;!z$jZdk!nxdEv!Y!9mkT6R}>r zM2e3BphY#ic?a>~f2C$EK*4Ckq?+9;IxNiAM+{vr#nIZ%EFJ8uuO|^u1Z9L%2n%4= zG9PX11|JFjt7u_1dK+>}`tNGXQeg;{?(4*3zQxBL;^N{aWi74Q-4ordj=6Pk^f$Et z2jiFI|7_;Z!GnS)Ka_foodtFrqUX}U_qL$KMdYSUH|2+fZW-YUfSg~<6`FzAQ<#Fn z^0EI?rOmiO86&5#;L%irf?EN}>F!g02MK{vEr8miF)kjskNsyhr=C=o^}xp!!eYz$ zuwxMcEX!>D>DgJZVA`_6dA~wp`aT$>QBAc?$1;GaUiG18)c)=DOkv;^7@0*@1EvhA zDOwqsCUTK-Y~KDH!iT9Pl$;7Z-2UDJ-1_ktb}s~zY|dy>31F&~>zdMcEu6^@^Q$FY zPB)o{_ur12SV?8&hXv#Xr>5NLCmYaw-Rav+>1r5$&(XTe{rMdD=RbMNhYG^Q_wsHF zTGG+~Y8LC%2e?6+j80PG@nMT?V{do4#a_ISGPUi<08cAH(;VVT?_R>!BNo)QIQh^P zmm|>R<-L!a#jAE3T4a^F7q5>P4d0lrT>idVT3ULj{}`=v0Ui88H}ZmAMNCXe0&XYw zb#pz1P$_T_h38@5UGPiAtj|c`y(E(rK|~A6sYSD(J^Ehpa-zkfIE6_(w2?<2a@#~T zBGR|@RqBx7d}+JTS~{~^?kdtnZ|7H| z;VRy+kyL?}BZ^T5k!>2CF6f6_6<0?w_=2e0c+V0uwwcI;DSgOS(U~l9>Zz+B^_B1P zO4+5?*wNHll+qTS&4K=`ykR(M6i1dqXFNUWZ#ggb$MPIcPweg+r;9KIMpeX?;Lo%; z+At5Z2_5XCIZAD#y4&n^VOcZ1lG}ZR(oRH9mOYYYAq7=ZsEZQ*eHtcrk5%iB;)Umv zf0Y*l)&}^E0C%Dd_nmhMHK38!*YciF;WNqvP4hk!Fv-n>iZEhl2^0lCpjltppcsv* zVC|h?+0Y^)T-8C$oU+k}_)j8sv_0&TDLkh76qgFiVL$2)A#}XvrW$>r8a*HS+4ybl z{8joJ*5TKU>y=C$xwPcAPvyS5eG4D{g7c*4?eB|71FOQItKg3!<4G>#{y*Yq^Kjz0 zbI(U@HCLrBi-Cibe{H(Ku?}K1Hpd+zjy~tn42`8z6X0TnOc?`CxvY3 zw_3Ly_8-nj!@P+J)$d;vVD|B>&QCbqRql9PFU=@_HLGhB9l7ieb8Ipr!0L8)X@Dxr zaill9ZRMvqv}jOHgb!)aNGbwX$7+fxJU?DUaRz_M;!W)N?lrEUpnk8f`?N5N?1(HY?-elwx?$?CawnKr zZ^Y^5cT8IT-Q1>;*e^(?DNS)VfJl~E)CT8fSX5P&?G5Z|ntm?qE{oV^0;95PV>Szi zfKPTD>JQx;C-Y*&S+AZ(U;hh4(e%#i+K&CV8FK)fPc0;I?s}kDC&(LxRr1Wm9_JSrTFJ& z$2?<u>?k9gL*jH1T`pLn1K|W&P>64pifqt^%@+;DQtd|A@b%N zFRqCzU2mq2NPmeN(9rcebKWu(-#nI6ToDhK68vSWfW14Uu`cE3Yi&=fj@r4AX?>Qx zsaFk-Pl7YSl1r{!u_yn-1-#jg^Y!wUPGZ$CUj3+k^uDBJIyYo7Rp9C*>~|l!*Er_k z)g(1ZI6Hov*mV?|mE|A~cnYIE3i>C`^QR;(wuT2|1a$`kjI;AP7Dd30PLyAx-_%_$ zaK=SyXV@LPdi+VP*!IzP$NdSi-Qc0#Y$YnRqzK8H58(mzMi?vm@M?P!7NVIvgx>&0 zA9*k=o{q*qP3#>Q=d9!m8WXV<+w$~Ig{Qx_ojOjht_D_~^FN&t2;x0EP<$mos$xzhPilqdHD_oLcfM_qdA;ltofA6al?K>*k=o|h=dE_t&K-^syw);w(d&O{ zimc;aXyn)ORv03YCd_Ut56r$Jr`6^}epK@PD{jK@+iAAF9J6*B38N zyDVKZCr}&hveljAd+A-A?{yQ`TAZ~P4LhV128bf$$o9QpVU1K)%kQrCdLlX&nsl0+ zTbzn#Cd(wB?B<^Z4xW+Z%n?2zC69sAyEDEma!}uxnon>JTAj`g$fF6oomr_l)$S)>>;@W4KON^~czgBh6xyD38}fJc3SXj? z%4*wRDpFFO%$6-@2)FdBHb@JY*Xn1`8E$U{GRh`tN0o*-0NUqw_FdMraCGA)>Ta1h?jT{`b38vL^I^GE)z>( z#&8XDyD*U(O)GUO!_hBN3B&2LGU9(0$79%8yq=4G7r7bV5Bp;GGdmHMzAfAOM7bIc*bol9Q1+ z60==h9*w&a1OI2x>onDFuYURQTpxzSIh}t6<;~~FfR8;iAOL}Uk)+?RveT44v;PO) zu8hIvzp<7Eg=_U3A>?rVaQgf@{g`vnK`RdVe%eYD(*WDeJylk(vc8dj z%_xcgdQ*v~*Uf!(I#RQxs>K*#g@6hPd1yoICeb$eo%@d3=GPZng9p=?EN1@wpU)IE z_!YnMvb=OBrTvQKN#E66cCU{Yk6a><_0lf8*%VI43%S|5d>T(LMpEJbH!{>346r+h*$sZ} z{4bIc+r|7zi^O!cjX3j1Jl>aIFzs^GZ zzX*`_RQ_y#fAqiOc)-scdk2SX`TPsiHkXs71|2Q6(T76Q|4ico#mRVAks`)FPyTti%?va0iA_Oqlf$Nj91`_6x}45n zcIed|@>&#h8vHsbU992eu0y7Pnw07G{#lfT*CEZUz=oM@j1V6oe#fopUnqLl-rpP! zojpB8Pj%CzZvPSVBVLF{xejDLH$*GqWSQRvXGu}=SDZa0(CeS)r2O>LVZJeVOM>0S zZ}V&hX{iD(CsR{PUoQWKn}9WBLGI8~cA{{_-l?}JdJOlAyC*CEHQC=!kNNpwz4RI~ z-o22dST5`>K$Z^v)#Q8rn&dS0?nf{7PYpRyYipg+G@*Z)os@7tL+1B~fq%~fqgFI| z(7Qe7{CnP~-i{7-qL{Y;=cvEVjw`YZ{jX+*VnhA@&~*t3$ft3di=K1>{}I31FPuEa zsRHN2hVI|vemZA$qM1=#@wNT^6##Jl{9g=K=H}ItTCH~aa!+@jo4WE||0?3%=y+2? z3`rqT4TPs@DqvClPtf1RFurXkP$?oHX5rkb)-%kUBDc05_40twy3N(i=J%}8C zR4+_H0jO@Df)1k%m`>3o@9lctU!VFNu^fh9yO~UL>Z6X?Rd$>tKglwC?maP`cUlWk z5{DlD!`DPI^5%v|!vIZsciri3Rsjf<*j52r;|2BmwunF(F{Gq4w4vQxC27VYJ zn7{UUQ4t+HCk`FI17PTJgDqTBa0Qx*rP`)OA-75eS5p7gT~`3TY25C`El>IOVt6)&9bv* zO5}RF>e@Wu_{1*$){|X@*!FIV(wV7$m(&(_cp%c5S|pjGd(D&@BVpy!A+{xfP%z&F zOpTQC;`9{F9xtRgV1v=_ErPt0k3Ks4x#j*y;qg|(Jx2FI_v+DXSk$BM+@qe|jHLhs zpH)>$HE~c4N+VH$Xl0cArj?-$NH=NLXq?Xz5vv_I(4J@ItJHrt<8t zWmk?lSizMu#z6Q(_n!fLVdG|+cs2~(O&Ys#3^Vl3*&=xKwiYY1>wZM>vy7JYI%IYK<*a@y zN{4Dt-yh&38`BAQ`YnwobfJBa7^|RV`c%_^cYs+N=Yb`JyzU5MM!Io8ya^fcs!Hh= zd10vIEMkwhouAwkuxxcxwN(lOP^4~hezoNUVJsQi`C&3i5!<~fKNY^QQ%(3d=kX=o zEmhd;0A^bX9%orlZ7{I#mzH5R`4u8&ftZL{0s*VSbrP6yklH0oxGy zz4geD>NTrQEkCuKoR%UBJYp;1Y;J^4r&UKUdtWSU0AG1m!OJ}!+*f^8ak!e@1k-1+ zDzKg!q!+}YtZ8|9K5408KPFDO$JUu3VvEzBCSLqg)m(JF7i5IA29E!4?rwnhT)%EQQsdOes2V=wWlwKY5el@%kSx>!oWf1#Fjb$F9j5{3t%GiDs@WTAhIt>cH z@lD#lO=k8%4Ooul38`1yVdyeQI|wzuES~k^Y)g4aNmmA@>gbzHq>J6ut$lW$O#@XY zX3*AtgVaQ7Xiz7fOu^c>)iG_ZT6-OG8AAx3`hGm5rkoSuAKs3rDsY? za8*SL!_-y%)T`fAOjHkS73DV162f|R(ZwW|!FG~Wr$bLLBGf9IR;89#wz<59VC5{t z!2YLLq7E#xGYts91^Eo75@rr_K=_HP9M}1Vc!&*#ZBSP$d2vn@v=rOWq?MJ-yifm! zhZViy0;*<_W;jJUrEVECgbh_Tg&d%7t>sjEU@T_bXBeHya6& zHfUgMHhzj|N0LA@hD}EWBd*~Zt6Ji>49~@@gBA&SrDF7nYCHPMgl}fhn}AY zSogBwAYBE;RJM&^50IqXjgI(355)#xKJw(xLj=?*mzbJd?(tx;k$h)~`DSr9_AOgz z;YtSn&r>S)x%<$QUQ0(c>G4F?m6sSv*1pR(Eno1P1SQXs^;t3 zT;E1PrYv;AF3GH)%AuT`Q#?m3o&ph$0XH^P#ZT~a=zphWcd(t@qA&_)fbo5dkJ!4( z#yN2aWd}M|=HC8Nd4@}}sZwG)lo9nq@IPEY_EGUzSr9ozXYtx<)dB16%u+Q9CtFUg zrCig|9M0HEP%`I+@wNOimBuz%x~h3F=9vE${M(_<+D+<4=q$z_0uH?^g8g}-gsxyy zyKoX%o`y6%@k-G6VewS9ySR8oG$fY!P)d-h*!Is529@IN-j7N(5R6rui>q%Uf3Mqo zbhSaWwd1bPtPs-RJ| zUXz-g_Ljfi4qM|Gz?@2IySdySwwZocN^P~niNZ>r{ce;%F&bK%+j6B!)__m)I8=_% zJj%R`zYCb{F5cW_EL?pCtW~2segpEH^Zr&TFG-Q{@)Lp!)PMl!6*pq#t@NBqV zTi28dbD|wUe@5tL>n82&XuE%kBEg{LiSjcESz&UK4E9>lRf+ZNL3l-Lf4VfE@ncuadd?!J z`#>b2^6UB&8LC+&Ta&=+A$z-9xlqA(@UQ5IGpSHmb|kdt*owK%M?p++1m(uTP(tUU zg>c)8#dT@^K}CJJ9iSh7Q%GBv#_c|G>*Re0>oYsk8XO zvZH;QCjCyZEax=w5z|84z+dHN6*7Y=g*tZUu-l`EKlnCXC!&|1M-&+dL7>NkL~oq? z4Q}=q>XYk|_YL=t$xd$#Opf%@(#MJ!?gnciy10pT(EfJr)pw867TGbRbo#Sy~-FY;UuS%x^gy?_z)3e+)p(%mWM-6&H%u2uU7Wp z&(qz;itgx9nb^VMbsw=PAKwtB)25E*s3>~GpSsHR%E$nn!CERy!cBn{wpZnBchak< zjgQY&i71DJz3@|wV+ZsZBWiwJdjdWMOiR7odjbn3;r=Bf!Z+X`r+=i?b7Cp#S@@@g z+o*$t2f~NO_v!FOwunjTrjCcJE-z%b0uY-x1Uhd$*G*A=uankpL4V!T@r${bTc5`(%s!i4~+^4LrX|^ zcXvp4cMUakcXPJ-d*1V$=UnH%_dWC9TwE~2-m~}I_h+r|TDZ@-T_>&}-Iv(H`rjW^ zrW~#&{MvKM18>%PX}xiIUE$8T=EL%bCGfK2D>fNNn;tBK)U; zR|R0g`GmBQWvFq{P{QU|F9stIo*;cg+jfb9=Ew?cJ~7iA!)+8R5c!_9<`7h&gQ?7^ z&?Y>KxRKoR^Vm;!0n<9_+O@Z+f%n$1dO4_M zHoLf4z~Fc88eYrA6iM}0HtcrOa9%^>)Jm|AX|-*o1eZu(LB`SN=>A|uuU|Mg9g7fG zA*#8v2X5zQWn}!1s~jn3VK;`EhYug^pJ{g@)^$-xacMpZ=wU3B`xs?_o#)P&#Hak( z@a^Qht8=|dBOh9l0eW3<+I!Z~be1q}(B`Ia07t{CZs#0)=+l?DpiplaCBdw1L(eFC z=x42$*1D%v>r6C|Uf<>1Ztkb3tCe)QfviV%(fhoR5(vYgccSfQ}H)(d1@p&^0V7*>Ob z3T7V52&b0TEXUSVc_{^tQE?1amxIvtv<=ajnIbhqgPB7&Y1kfxgm}yx5L3imymG*xwL{NO-@UNrDMI^*`Vb*5$HLs5@>W0S=3@{1Ep)D}kUd853Iuh9zR3fQ0l zk9+hI$St8goxDgJmGGowbTc}A3ril|;50@H^f}w$alEMy0l9sTX;wsKu2fjV!Bma) zL9eX}-{HlH5r-YiW08gX)a|2ZdNJgduRUW!gqFmKIzGZ3{l#fC&#&XpVOR9%1z2fntJwXCWyd>~=On;`@+ zGP~Aqpzm|DN&MauVUAeXiRXdladTmFE1YVLI0i?qk~+;9Gb4B9S6700G?2?0@Gkvg zM`@e1&d5#zcf!QC-YOfo)cjHTRMbr2S=nnZRSWQEIWatTbndFVFBL|FO55~59vELQ zp>GxP(v;i{fXcP9?^%6^VjEh5#FIN+J5A{m1a?z?86Fd@>rTFkp@yORJ569vcQ1w` z{lbSnUJ07Nr%Oijr1eIjjYVBFn4EXkK+`aHo6W;U^)W@`>{$zNe_4&&@D#JZ8GCBRtz;aw3JB)r>79pcZHS(cfYh1+h*E!;!`&ub$!y+^**0NE#Y_hqsKTBlSLjo zFT7n+koN1YL#Pbh=~q46S*!p&FE%zd6QBPp@#xlZ1g;kOFA;&Oh5P?wM&AT~K z{)?I5O4Y?seVT3-ME-J@5o~TV$=5Qef8W#pY&g@hEW=yxP0f@~6C|d=%n9sc#=!lF zGbHZXZ5{4n=i^0;lbHG4msrXxd}vW*3`(e*e>p!jyE@Mw21LVOFk^)F_f1zKF}#Aq z@gQ5BJUlg5!X+Bs99Qo}%-BQyq%KXM()z{pm;1yjNO+N){b4T06t%y!M?EM60`lCg zlEb1Uh(Y@ESA5vVwh@-sdU*wi?gsKr+phZM%L?9u!79f&DeD12Tz$_kwnC>v@uzuf zkBh!4I8RS!%SGC^NP|2nXT!PCh{Lx2uwb~ek>;d|HYicVIrfTX@>fepx?F|yyqKm3_n)^TfTZeqy`$aa z?z}zLIXD=?9XgZP`v047zHkxbf9I8YZ_DasPB8RjL#w6tJ6vJPMmHZI5#_FK&0bYhSz0U8KLs4s!0#e6H>kt&B~8mVn`8 z1D>K1Q*XGt8w>(@V=Obrjf?oDjd>klKvWT%r!By7xfUul$}!3y#$@gqQ(e*%u8h=wts_ z+^qZG-N0$qhc~^8BMw9*a$-n$XVnxe$IDC_S(83~=mpI!ZKK0p=ra_A%&2C9L;8>6 z{IiEB>C;C^{${0dN2ARl&4?iA{XOtz)oA!|E~I~-z~TJ&C#o&W5-Fa;3VzQH0}s85 zP<%Kjkks_|=?FI9k`MLKUb9V9>P(bqVx z`~Z0@8_j_5Jkf*e7X16}&E`_&C@WIhq_WnbgbvE0rF=Zix=jf_zsOaKI#Tq;~(bsM!kxMky#zNoX!3{>G_flDG_ZdG|xe7=}; z^W*%|8%U<>ZoX50q@l9el#nrBKb9I}qx+$53QaiKa*r3C>ecyR z?0`30d@z&*iJq*ga`HUbfw}k_-~9R)3kbVx^5Unz(N3r{1P5sZ-0}SRB$% zP&JojO&GdWdw_31T zz4|loMP}wHrt4bFdOXQwWpT9NmlnvVsq{b$06lY!C~E?U+q<$O5urCpP0N8q<2pc` z9F5rJ;@6Z1q+3!X!)yKR0F6D!iMN*rC4|sQ`&Y`WIe25lTfRWv94DvFOOTs>Evip(1VqS_HpE47&bC^sL#{QO~OQStHlP-k^j8xi?6OMA$^N-{nX_MhPi#8 zP$=@(u;%4QgZP!niOT}^(6kG38j~Fd0`?Ye6P?ukT@<;2S;MuH>0+qk;oPL4b@Z%> zI`L1>r*j`0G8ZyMa>%BJUveZA4XTxetj37kQg6WCQLXzIeMioi$|_f{k~@4~3C!*h z6`Ej@vS>VN2`UOpq|v=qQ{LEOd*>ku?qz%P-dQUkDGVmn{#q`mS0WF#d#0bfGgPyP z5y&Eaj1)SE`pFaI{tJS5j8xs%z`7A~g{ogRPf3)_qSn$nd&!q!1_t`$_?yGjEg17{b@vahy1E#>?{iX$w9?I%ne2 zrZSUpuVgNE_bvl-TwXci0)|6CtzK5_GGGN6Kgh~EY+#mYeYVwmZ+HI0wBi=;zRiD< z$nkOv!|4IebvR5+LGr>=^O`TgYv%Tsx}cnF-QnlScSwBIBA2)+%MnLa>fAy`mKz>B zJ4?0{i&99;=%D#qFKE(@GiQBS9Sc8+uN##Mc`oV%hj1RI)h^txg(`^VL@pZgNiqX<&l*xR_U;wEiCk*J68?ZH&=K<6$kSGgD~CUIq;KyrVU^bDfQk!iaxG zud9&xM78b93I#sSQ2sfKXG}>7teaBB)T}-Ie#ZKl2-VvgEN(Dd-D+c z#|yv-YBF=kaQ6W-boxP3B&n`0Ob;YLhK;0tpojKDrTq z6^~xMV!AGJ;}n-?_8Ya6_ff9v=7oDXdGnB(6H4Vm9gp^&E7IdYcUT-nKp`cvRoLut zq8bx0IiGH#G3*9&iz-vXe%Dk+uM!Rp;cO5ClQpX`k%u4-xb39S78Dem9+h5*Sr*b{ zgm1}|VeIW3$w%BJ=iVDoHwTlgous=BIAU6@?U6s%QU-VVUpJynTDC>{F?n^h}_ApENw!5UvM_Pld{!TdP!u{Q_ltwJwkYQ5aUmr-V*sxI&#{o>5#qTv%1W}m5b5C`RbP-8ruBli60&Sm&v3!o0OW7 zGFz-}K*;oDp<^;?%-ob{Q)KN8tjXA6L;eCyBi`aC-d#s=p;JWPMNK0ibv&Lf{%}Rf zT|CG3Xm?*LE*-`M$T@0y!9! z;JyB+z2J#U61gMV<*zzlA3W_K8B@=0uIobyty(rn=p1fqz14QEl-EDdJ>JEVxaO2` zq08<-+aVhMovjl(*9RVw*9shK4lu%tldkF|E3y&8U|2&RmvNQYEOShOW^+`Gl|8sx zV3=zfe>Q&h8LB(2j3xtg{aFza#QrvhO6>Y`=10Zi)A$c!3tU$s-QOtIHxxOQmHdOT zIdI<)6Gb!^2@nwJ$p>$EIhWcFxH+>iaLnu7R0sVu9)0@J6wOEdKo##Ezcemw30SEd*dgg3l9Ivp7I>&{C&S%t1Neo_Dj9UHM4_$2dxG=y=t zFfkWsP2=`0Mk=zNPIeuBE6n^dYhp;CS(N5mcyasaHfB|Om!fHpX znJ$7);GO!u3(E|SqOfIO6;T^$D`CKQ#k3I;ZfgBf5t)wG{yIh13J(3K+E}<0c8cEX zRKwmoNdGeU!~NPcF-V3yC5E4)br=$`d@}T{+@9%eJ&345-2Z)SG^Dv*^a`BBt~sE4 zf2uZFZn7FAbN6b7!$7G1vF+!UU%$DKfg!IvZesTZsNyVUYIR-_gM`AF24Pi0w#zPf}OKNT6 z*%D9&!=cxUA{~C8mV*#7OQ;XpQ#rSDX)7_aQ7XijE`Sq4d$!B5T|_j0kLjM3K1R{ZXH zU8wibg42oO^K^sk$TUYn2GkZ(lbBFeS=;y289f4J0_BOGAs$ZVBU@*CA%?-EHd8#u zm8`lnjtJzY&vJIBBcDpgi;iEKZw%h+tLhIB`1Y}uEIieaH>qK_79@t)W_&(GrpMsa z>@f6t@RYE;tY;ca(VZy`Ps(wPTR&WDVljN!ftY}0jd|W7Sc`@_-;HNSGy6+w-7^;+ z(Qc}~W7?9@^#+X{wJ~z2Zg#$uJfX4$c~5pul)5Gaty8eCVZA+^A73c|C3=Tbm7VWW z&&#;Vyn1v!ZL4~_NM&G;3p3f_pw>AF3C7=P+E1SdqW_Gn6Dg#e6Lavl+W8HmY|) zjm6?kX!6phtXAs?LT0Ml>i8@_6TeJ`^Q*@HB%k|Ou-|Acw(cmuD_qxTQ?S6hqb-!5 zsQNB3a!xKndrS?h`gk()0voQ$#lD7>$>nN%LXh{yyHP(iqoJqzAdXAeY zC%Ro(`%ml125Hq;eX$`~iP=%n9h!o>CUgYG-fMsL?L`FDYC%=k=ZHDDJT3w2I)Ttde45lhaiGDu7hzYL}{+0GDe%M(JJN@ zs(Qb$Y@$pRdwLd|GT~SuZbRB@g0mlGdpyeiI#JkNJ~Sz7fw~{eAen2GURMGxl)@%u zg7ng!s{fQ?!ldSCNqh|a;aw*u3w{v6=i>HJh0{JcML#0%?<_2v`o#5tqC>4aF*Z@2 zq6WHwr&o@6%N!Y2#eupX_bczoCgHr!gk1g3v(w^ysu`>VzmhK5HYNKV3RLo2;i7&J ziyzL*5NB<3EM65Q#|Y)cYZXp1B*TU`_=d1U=!Z~Id}NydDx0w1Y1X}2wQ1<3jaKeG za2%^{+Jp69!nzj;4o2XvHZALGOQy;L*L7R;<#5y+vq{?^iW+LAUWA1VX?Nsj&KfO$JJwkz5%7ZlyaradB-i;V`t2(Gdh**M z%2lXrY3+QE)XpJyw*qY}!^= zOmds$l^?L0;&ixAd%JAy5H^SyRBXD}bHFb0bo1G3zGAL>K{8Tgjpr4!u^!`Y4_`~T zSyRl6jYKtz9~>=ps0o+{aMgl7a0-_p($o54XRT9D_kxr&wfx4{lT(l6gAOqskwMYB z9CQm%v4l8sgFQHJsD%taVsOw=&iFP}ei0p|p_5S1u(5K#@iyK@z*~IcFbIS=zGkX6 zK*1mm7?&)0tGNz~1&5(1hg_)dvk~z|<(#1PvrrAlu?NS%NR|zo-5Xyn3;Q|>gYoL3 zo9}tHX7sH6bMUe(_rfv#P50l#?4)qzP*Z1)Ang?=EZ>LpLr!zD0_aOG;a#1>U*~LO zeFe5BSKkRGVANuQ?Pmzgfsd&ZdAzknG*A}X+~(Freu?;=Fb>K}^=E32%L1K>q}*SC z-A8rGkRHfCxBQ(wW3mBgU61j>bMSkmDbc-nX3JeTeG;Ap>RzQ*yZe@u>T zvsi0qG5732OAxzZEc`9?d3>~u+_o$8gY`D0Xa$!ustkm+ZvJ~vT>Ql0$!*g$!CumN&{3`4*$HhZ4xbo`5|kKbTr78t9z z0hJzYJ?Fk!xfAINSJ3glRK(iP6-iBa>&1LVWUqAmOsWyFz=fbzdsfRfV6q1cMPCoQe8i*8k?Qdzz+==#;`jgk#x()pDz$8-{3 zUB`thDUv`T7Gm?};im=W+G%7i(KB;mZ|GsJKrn@-(UCtcggx_AWppeiYdkVM%GO#F zo~b{$fhy&qRK3FUoFomRMr>)gY4L%IxQqN5b+FsJh^aERpJ7OA0JM=PnYwkXvkO_V#* zuI7({=4mV(zR6f;>(e+di<(5}-=4opJ{j5MCjRi4Sb3Wj&0!uiyrvXUUT=3(zSExL zK4@=bs%J=|w{&EsF0Z!wD)0DoYJYp|D~ZBd&bMo%Q^ai9@*GFPWKO!I$@dT}8RD6@ z!L#udXY$w!`1~5`Bq_#(iW+Awz!tKht1#(wV&4c?0s?)?izk!;?M-fAus>+adq{8j zJW)S!wv1C==#1s;@Y~5+^||zls6y0+*1+n@+!oWU?DLaYijWA(Z-aB0SC%irwDpOb z@dNysKiJ9_&P}TtH-C5Hh1bep|^1nw4y{`~1#r`;g@X(Vdw8GsX< zYnqunc}v>k1yUGjsFy6qZv8pnR2Hveh$Gf=QJ)UJZhKR|$SgMaP_gua+X{-1=;}&0 zl@)3QZ0vKROH)|^4g)0Ggp=Rz??G|a8$BNv5vK0@pVdeiba~w+_F{+c&4?;%0Ct8b6;|XSC}pmlK%B?s`4*FAKcpsp zh&ePxA6H6<_nA=jXz40$r>Ihn`ltG0i(>N}3>9?k;>7APmv?<9E8i?UebkE@y)qe? zBB$_=e+Ds)XE(p+D9rC~x*gF{ZqwDxaWTb*ZF zD}<)vw0qK40>zs%U7i!$h#+q|Ip^8C1Wk2PZ#C!ozrMN(^x#(VNAV0EB?H zXIn-ibC@XjQccw)bOKFEo>kS=#j3-^fZyMS{-9!hWTdsa>mLud1~T$M%%=7E_GtI0 zwvmG)v@DQVyFnh}d4fRFR-yc4nVl*L+vJn2?h`n~r>!HuYF+l{pz{!8OGe!$9aYuo zk<~e6Y{7;0(ErP6HZVTYbHUSqxh^ z&N*=?iqZrvNgPg(%IHrAPO8Y#!vW*tiFb?l;X1K>eGW5D8Hs&;K^2DyiFWkQmXJgn z;C6}qXlQu84+u0DLeKu3gt@LDTaaE$d*fFx2WUxeVDlK(-SvPM`|%QEY`6pc-A&R7 z0oGTy+v3|;#HVnw0Vsd+A}T|Mz58bEcUUZt8~Q^_<#MX+DtS}(F59CW#?avfkl!Mp zgw#3TZvYupPEJm!s1qOmQ^_ELM(r6JtM;2BiTrT5_mJV>z87JSxJ)pz$9w$z{vpS* zKC?S9sT{ZzUcqU~*G^sD3f9TVkr=`5Q<^=tUCz25(tx$MK zN^RdI%R^0U`5duVqkD>e(V%2R}^LAFj4~GaAy>zyYr8?Q9^RE|Jr3AX$gxJ*-yU{j1UD5)XmPJ#9iu0jS(cvYL=lukaZlMJ zlA2vCf+yPycbs)1tTe_w&JZ8Z%waN0uPbn)jm?NARN|~-vcAlUrP8xjQUT$lvLb~k zST^jM31tQZo%E0k#ese)*&b9)3>?uSDdP%@l!M%13;#cXrR<%euPUkb;z?p$6{KY) z*>v`2J0C^lskwQXx?j2E4OzKxcVR?ZyE~rYm+Mp{HZ6C4xkAu{Y2%-Y-uai#SpPs9 z#w*la-g74y+cJuOTN8Q&iscWUa3&#$Aa@c7bBmFmIpeYg->VH32L`J z9`?nt4i8F>d1v}5dQ@UVh4IU2ixo2+)lB^_w4RrEF6sWt`Dn7$Z>h3(K(~g;kI|2H z`D`v2wE#_pb_z9d@WAv8nLx#5WKl|N;u>L@4@4|MJ$q^W&RcY$eF=T&rJH@9XIKFP z*H#&QefQPVux}-UV|ZkmESrj|mtN%CI^5yltJ$T?+XD~94s1keE!W}?l} zISP8bbhlpu>X9KP`7NKo$msez?^-B_+j#kN9js>dcZ^mloCz~v^R`GVCNJJ7nZD<2 zl>;XbomvSfY6@bz1S>TY({K+`OuO|+Cwq=3F4HXT>itFWh7K#^fLu5>zNd{hg0~ zFbM{V(0#|(ifQ^9lP$@XEMG$L3{*yIslEQGDy~mMK6#ApkEl?f1>WDu^i()6D9fH4 zna)1uXWNH;C#1AD{EP)6uvCIZx2@f^8`4cnYQI_-)}^remw-SDwAnBhWO=1@cTq0- zbDc`sMI53=BD<~D!1wNR#CdN|O@43bDi3VS^QPRKQ*<`6{*^*4DM+$@W$e#8jEUSpEu5sr{2nhtXqM1ynkVZWXmibA3KzNsK`0=&m1gRz(xXevBvM6YY_&Kr?+h109XS>PnC=0<)mBs6E)Mxhz?&(UYj)r&dMpPm9`Wko+>72wwO(^E~;Q z)%F{&rQ*-I6c-VjrJhZW&Syu5J=MX_t34h_>kg(U>*_>&G0G?_D!b*zdvdadQIAen zNoyNf(h9Xuz8}bSU$wHF43*lCy39NWmHZZ~NY=Bqp3>{Ke3?dN1cD2K5cj*J8PNq< zSb4vP^cQ^m7YjgL>!vl(SSzM1;v-_PNEN{}D@TGjv6yuQ$pk5O)6`w(jf*WyJkU~N zDr1lS$@X<%V@Xa4uWLxuHl5=}Um{InpozoBq?QT(KFU#r`W#=7XUJ?O#iwuJeZ^bn zLp1JB%EYZ-i${O)te%gj?=t{I|Ac9swa89bHnz&uZ6!0WQWVW*u=Kr)yBp|{x=?my zM!)l|n(;jTY-Tz^RMxvG+CU?Z?4)>=-L7!5SS07<_A|)#Xrr zzC=E|UO*##JRN?+UUssw`9e#!F8fOq4x@FQs8p;pc3$p?T1?1wPUTv6V8hw>UUH5? zjVOWi`Z#8GGfD*hgTyi^exV@t3nBs|Dhmd38SXZ+^+62`{k zTueX?<8Al%+vDx*r|>2@O!_@uu4Oa#RdrUjS0EuGgXpnxo1_0zV1cebmKW?UKXawz z=H@oSAIGb%j+;^CQzQs{dtJa_BGV&m-c3gKk=ecE)Mo*tfqoS2W@99r z#9oh3XR+1kC1S{dAdrc=!J;jJ6qJ*Oe}VVctVsRPod7Lv_iUwW*^$zfDHDyKQSVRc z$%!$2|xuV%@eO}>xwfN?!p2B%&jXF)2AtZ?rDeA! zuvA$ar5oPG?{=s*dqR&b#U(>c8(8yYYEX@gexm@7Q{3%xM2hE|7PJ} zGhCJk`_umG*pRz^Py4=8#<8AJc;3>+^-Ypxu^0%O#ADNt+;y(Fjg?jWiC<`dm`V^@ z)>rjRx4tWz-n<{I(w^C#=~J+jxHilLpbQf0D;L+7AE7M`x1z{&n-_b3v z0Tvt(!~>E@d%9`(+nB+Qw}G!A?`q|EkPh^F82#|Y>~fFrhPy`W2-%ca40C1sEc_ik zPFH4T(C2XLDWoB!aXrz83t8e|J!^?;bkdP@gy&QE2_&Gp(8^vfJ3mEsyfu1_e|qq0 z;Xg5VXo#2fX?x%*si3?=Xf%m93UTsJMJ;89-<&%(X^;Siq7_=Bp~$c}Tk?}AJ!R15 zV7g?c!|T=k#~ca`ytvUAOQl#?bUA5zaGe&$vw-*2tp@$q5QUSd-J`^v594Pgl$THa z!W7cSd53RSOF_$1TNpQX5Y_J+e~JLgb5eMNXC57OYdY5A{&XT>0DXJ#ntZ5iZS%K@i2)IyTrIORegjQ>E+nCUW7 zbW7f9#9JR*2D0$iCvLxmNUb*l%|Tp zgvD<21XjGt<3Xd>xG*on9i)s@K-+mt38R(k$@`AyyJ2c>Epl}w>eeUHK_56GnL=wV zqhx>EOZ6iucT=8zQNegV`!Gm?&64cRxg;6z1uG?O+Jq@51^r&mT%qo|Gl>hXuCC@J z6YJ4AGKin>RS(_c-Y8LtIP%bke55E z49|xdE38#RDcN#;J8=#U3p2A%cu2HXQz!Oy=ZKhOi}`cVry5p?aC4X{llhFK9X)c- zR?4vNm$EhnDF?)8RQ7iZm~}hq6QrBj|3SYfLdtj?#tZt@m zIy#?w94$L+(@71}jOyQTuXYv3IFDe!zGZG_yI~oF?}tO$htga&aIme-P2HzvU*Y)V4@ ztm)x?lUlfs{ASJXX@>)i@j6eq*aum`HKW^81o~x6MXrDOEWHKa&6mgDUb=ktpeL~) zElCi&*wL8B4??zohqQ$q-ek=`ZP!s@CbR7GyDZ^}+jk*Bgo`fy?Iu5x7@*Cv^bVB^ z&A*P{fwZ{9=v5r^_C9-8rf*YB(4-FTLVDM|fK9KbUwIX3eeuu(;c|dC$eI-%O6DT_?jjQ4bG=k(nthns!LK|RI+OmK-JWbY4y&SGm{W)sVIC3ktR3gFQ4$EbyG^_DS(z%}oyDOo z08%h|DRZmJ2B#M5#;11~0NUm=WDK~A#yWt)nzW62&m68K+eZ%*(Cz;Ak~nIE(2Z`H z)hP!K*adDAYR53_t{Z=}<3CRWr>XzO>{IuX37}e;L0PxSv!OaI4U3qd6)3dpWba{z z{Gq6dG`ZX?yFK3CN|A!Hm$Ldh1>H;5ju>Km&&2x!>Rgv z{Y)KdvYdWc(xKCIzuq|qEWj}Vtu{7|mSw;Z{gb)TI^a#XD#z_L;6lL_yK&>U8G1x2 z{K(7Tn`j9bPF)g*2$wjHph%BFaINaE;Dij_E>9eVX@A?Tw-$=MF4PB)*E}p9Y^~Ls zH)Qt#k^{82u=vGFTI<$Ytab6=FdXG^g(*VJZB@$Pe!{f|jy(O7psE3lmIF0i4{}Uw zm#*cHTfBhdru>slvSwyx_B-9iZNCe!{r+)Y!@*gvG*+(`FYy8KC#xG9;TRi)Px17C zcK|&8+YH}dc$}m+tFZog#sAA@{y#l?Qj7WfzY)-U-=M)D^K=O&w?7;@9yj*aUd|0* z_TN7qVb3OVUEAEPza-JzNrbz)3xSMvH1XZem*1I!i0>s;j~pU+99%bW=*ORO-d%A&g4r;YJR9f#_(mrAba!Ufn@G{^($| zI|c?wUi+h+MDQPc)>6^`^4a*Yg3Vra{M?n}rqh|>O>t`c?(yaZdY^&tOQb$`Fr|qL7vxRhg%_xBn0nu zU>*C?FNkW4&3-8ktBgbi@XO%~jzncJUfJTtRha6eUK9K&OlK=!Jrb^}LfHW#b(B0O zfr|kkR3}GvE{4aJ{j9946H`;bOpHTWc|9PoSoH&^U$3OF^M1@QpFNc8b}4H6cdHh> z$zjE+t*Z3#)ca`VLTkxK4WN!3_$HYaQE-pSxRs5^-M>ZFj45e!f-!=Oc&taL2hWj7 zQhE(AE54)ycCFd+zQDfmwF6YD96jm-?_swPnL@(zTc9cGHC!cbyg&g@Di`yF%h}t4 z!_C5}kbAXIuQ=Z{GPbLZj$tR3x%W5pfCv3?)ye`-C6$4bMy7nVF2&ofrEGqvx-UjK z7)+kL3gyqgS(@1IREF(<@)Q$h7$9Ei)iEOZi}m12-kW#H@Xm(+W}j~$@?5DK>re&v z01f4BBOS3Ev2l#0wAMhI?mRp8xun4g1XyH6=omA)8gy5x&Y7Ok#wFh0coW_*+Q-<^ z0;@xUSl!1(s=a_jW1*Ftv9OT-$F(+z3n91>$#8gf1BpeTnx4J6*tPdk4C2RYT2^WI z|1_hItw`u$NBwT0m-*e>$7}kbsyM@zQo%r$Nv<-+I%5iG*kaT$a@O6;Nn|_s%;Rs+ zJCDLKL)Wt=IQkb0C_ps*>^hU@XaA0aXGbl5b}O*S`JS?Wggdv0d7e%Ru_8=Bb8F~5 zhxzF5Oxl5hGoXB`T7IG24Aj}!xc+US6zjA8M7vGZ@_jhIb=o9kzHc6Gt|1MP&AvXgw%SzZJ9lsoVZ{7R z;$8KBswBS?17B5eVX;jfhCZ~npg*uxfeKDQ2IiYE{R)zc7nI$%#XCsmt2p-uHOAM# zm6?>dD*L!i%g%J&%*38un?^K}S@K}#jhON>F0F;5M=q{KaUwAeJEL%2+o@Ee%x2lj z8I%FI=jy*6=y0bGk-!~ZAB#)&Hrvu(k30wbB%Hw7kouCZxPCpgyLyXw4U_kEGrN@O zcdNlfIqk*UkW6=Au4Bd29eUVsDg$n|u{sDIMv7<;)P(nRlx*bmAca(;WlgbDbQ@>`46Gqe?|_4W6hC)Bp7`x^YtkELF>VOvd&DdBiC24D1up(hxHA@q7J zASa1=VB9KH8?(OYN-e5(tnYK|KU6uI)!}S4_2gpK=VB|N5Wg}}?Bs3);LbI`d2$wR z+>~7z>&UBY?|YIyczUZGG~;@-z?YZvr5zh(R8@h{(?M0*>zbI0c*DBnY;vJeHJ=)7 zb@aSG|HNs6e`29dW~i;L^YP~5t2^(l7hZ+mTncbER10cwpSA(PU^`(Ux2r*XIA1Q2si*Y zTQzq3hLexSS!Go$MDN9C6(h_gxuSn$0!@|N}BNh_Jk)I)xVllhz1P1Njd;R$4QZqh06KLT%9#%2B}^IMsHEbIfDPPu>Z_A$%DFMxkZ zDWHu%hHG7GM1An4+I|#Q+qP$Fu=%MCKqP2*6jz;N2{q~yiS;$JBjth zm@^DoFa1vA4NGvJvtrtH0)npAx=zZvGG0+H!2M9-D$pJxp(Ke<(}-s@=S;(jZf=i% zz6>5s)|BWA(<7-*5WQIRE|q2)w-~HJT*Fb<-M997bN3)H9~;z1BSc2IWq+xf>oLp2 zfUT}P2*cTQU27zfeX~11CE6+N8LCQ-#?ZecD5VIC`xnQ~EWf93(ZU%FW(?V!RrQic zsg&#Mz-K)4|47>7wo%dfZ_fC_gS(OJ&>np<4s6xqiZao2ZED^j5O0@#(FEeJ`#X{C zxM&@LEd2)q{{G*ktnf-YWQYXJU3|2<8H zE&@Bt#4Wrfco_j`5q5!M$1GR*yPRdE{9txSb{jZL&rsjJ9VS1i941h~?4fTjPkpC| z!>*AvSkQ{RiZ0GJSh(PM)+Bl$_2wK#=A4zs^oDa&?K&LiZahaqznZC%zaFBjcWU8U zJ%u?Ag+y^A#K>}WD*I+@uDQsnSU{tTPAJIUa&+71s+`Kod{zIDNO-!nMI|{CtT#Y#4X>sr|3aVQEneJEC1GPDulH@cM!@}!HN->XW&sYwNc^Rr z2eYrQ(`W0!agPiyU28RM<1Z?|*1T@Li&CcYr?IctQA4eK&}?rJlz32SGuNS)shBQ# z9=n?yt#3VhCxVwhDZ%`k8!AK$tSz0%E1V0Sd+l$@?3xB1uBA1a$)D1znm|VQxTZhl z=ml9*d^IVYc{4R5FHMZtfIEJD2SBbhu}KG#_cNB=%uk9F41QZ!^4!*aRIiF&a6tJ z()>?9e6jT(Kl~&$Ax|Oh(}K|YX)jdw8Fu0&R!Xj5>4nAu$YbbPDomWpuSCa^~G(m|50;o$sp%(G~96 zeKV7&TVE>{niOzKyEwz+nS-6U6y_>wSJa$RkFk_1oZgTyZEnEp{F%^EpL%R&k^rFJCg zc=m;v5zC#Ao`zPPQ%`<-++(BUGmZHiU73}?;5U#&^I(S9mui~Yt-ky z@M1$nYtEBiRa*L1h)BaWp|O=lIjy+cCA3y*Jwu9((kGY4OL0uz=OPtaS>;KQzU<^; zJP+pMS0n$M!c#nJ+TJ}B!`HcjZR|9v0UwF={mqj4pZSe<<>7%9@j+LvsE)OFMK8YN zZbx_Xi_^nxl-18ZNa+_bi&#aM!~CY7whLEQ#wgKug3`;=H6%M7NLAP=J;&SQxnCx~ zG^u%xxXq98qy0U{5AFtFzm9H2Ot5gsC32g@lGXR_i$AKW=4XZU_cFpePTvjUbM(nc za6dLk4v+nuBL3F)QbqX&@D7BUjb~P$Rue^xi%5hdxN6c@{7MnQq$v}q^GuL-XHb(5 zl8qPLZ^MB-O8+tZY&|6Fth<7A$CGlo+bPLz&@-IPw>b{Wpo$3HbG5uY>D7{(A8#@L z%jgcU`Y^|TSbg;86@@tQ7*sOW?YP*sO|@#skW3#TH{PtSAE2E`-Fxl3?t1JP^2Wnd zNg_6|fcp=mQ$bd-Pja;=)rloW9CB^(3@vhr?`&L>TGlx@QW5lu4ZkM@*PxN;1>tLr z0nG-)*>XF@DEg8wtCKPB+4I(u`^x2G;7g64sfDoWi0|aZUd9Z@xy1WTwSP_4OkCV+ zmb=ORXw~mnf(_vnP}STo{s=Sxkp{ zv72e!qM{PHB`&%!zt{J3eL_1- zed9%fSt~w|JHu=d5&z8kugG{ptz$cVXP1Iz4W7q#_=~h1SL|_O&e`*Bo9}9)uGmlk zx2&%2Sp1T4>tu~_i@H(YmFH@(+E}VeeysqHK2tw!OObyGv>Z-t&Po36JD|g)551ti zLp#O}BpZxwpgO`}r~cVRO{~X@*^-6Nyw7tS<$$ry{Hi{hXy27z=t0ls+jqTelrt3- zJxgJQFaZ#zM)(SlQh(5S`v4byxs8VX8IJvDAUxRnq+90-8u+e~Jh~i3OK(~g0b5rxB z-^S~+!?dx>5!YK9s@={JI|0hXFI^>5Rj+=4MUx@-dEgtOb%Z`@nX!>1R`u8E)TJ@F zB*uMy|BI#e%&V(ndg;Z-B4=&vZ zjEuQrH`b{lU36w#2y-+liNWuo%eekpVHGW-Y!QQs&rLg)XcKWH%a^^>bkE1^pJuUIq40(i77=P`Ww+kQa#^B5%#)3qpggqwL|#>Bnsxds z(CZLL9Qp)NYTTguW*f}K)#w*AO#uaCj`z_##2Q$OQYrg#IDG7R z?y$5@OQr!VbX6{IQ#}+23amRD5#Ht#c&8jdmo`SgiGRZs?1@bFYuJ7KldUgvAvwZ} zTcDHef^*>@2u=n9#iLT8Kn#xR95z%^t2r^5YeE#JnVDQp8y5e}O; z>8@PF>ou}b+BWdNf`>0Q?xvP_z9}WXKl7T=*!(DI%ijdErP)7M@-gArS`$BedRG7@ zixTrqZqxNJFFu(^FL_bJ1krd>bK_W?Az0pH*w92Z@j*|a;sr=vNBn3x(tp>rz|rvW zfjl#1%H;s7IbrJu5oIMQhZPfBEziTCiU`8;&0%6AponqkJKhGHvVY7mN0R~E^oR*# z{@zh^#=+ODU|!7;-iz^-+kmxCtf!6Nmm4@(u0mQ@x8;;}k6zT||5%Lp(SEJ29=P9P z9-_rx>{kiAaL9Vp35W+nv|jOhTUi_VC8YP+90ND`bkFSF*J(s&5>KPMMp4z43JPtm zUYHSOcK9;I)nWRbV4K_g>!<$Fi3gnDyS580BUU=0*D@kG4`r_=;z9z!&obuCDiUUt z>Ig@ZR0#cpy5DTaN{m47B(dUnlLU32D>gGS>4G(;YqlEomHVYCKFnWD2>uT^qOYpp z`9BNp6{jaCRr6L67U9d}-N|XZYWXhK=L^V3i2*r?+Z zv@jZnVD=md8Z%f8 ziH1)FL-1KyE_R5xC}tlG?Qe+dXm6}b0c)h@D|$embjU<^m~1GE_?{I83y;DONskw( zzD%q4Wy}u)jf8;GPP=5BJ}fuof1{2^JWrnu29?!#c$%_Sf=FC6jo2-uKZ-~Lu!ASx z{jckYzdpcH0H?Q!@-2<3aRr>^Ri>0kZTYwwk16cArOLzQ&(Gq5vOXZ|6#OJrW{ECF z<4LcvE!&z5JI-3?_IdjL<{g`(lC&KjAc4ulTaAD3y0e&5*MQgaxs$tE@ExaGu=tJ+ zHH+mR*AxWCFWzli$T#@>wprY|;Jq-piV$x~ytD}j&2tVKzrP9*I=k*pyf^fGC7Lu8 zFX|0W;z!qoFUs{mb?2A#X(?ym!B;!Rh0Z|VX`P+Q>NnW~Mh3e7#vpK9bQUJaj>l%; za`ne2%+!Ng2d8q=a~>hq%Wu6lnUcgql(M29^<1PY?k(YFQ*hj?`g9tDjqkZ>+>TB7 zn$U(D%AmKfq~AW}dy*N$L>kat$bl1RL_9TGXB69iEX=-$%Y5!EQ^0b&UOYj!t#r1raAuBHogU4al znyuOh5~j*M{WU-DK3#DWJ3Bc+=qa?n5OC*pSlZ3-JIvH7eM+Ifa*X7@vo#Jzir%4s z6_?dEX*iqyh}@n#1Qby+-;K_ku4}>5b*P+oUJbWXAL31xVR0Lb$5<|gz%jW zu097g`Lct2bT6hVZh%b9dxiIQcWVKbjd6D-Mh}Z5Ou5jkU!a*jB6ScmX~!6oAJ+g< z4(?~WOG``p6U!ovz~yUc!F=(Dr@S=-7Wy4{SyB6_bFNo>u)m+5W>)`fgmSQ&QG| z@w3V{S?EGeshqSp^JF$<4ygGy`3CT z^0s5<;QB86SddQW1}0QxvV@B^5Uq_T_39t>cptz_;DRpU0`dMc+Ri$_!nJK9EX!XY z9I*cb#b-s6)^q<^jI;l@*^7nBp)2uUUU;4KC-6H`qoZ+Q|9z%SVqh&jOPa_9 zASXkXfA{%)<9Cjwh@#8AAD*S~YPqz0_u{y0`cC9>at!4-G5Yuy`M(Ym;g7zJE%|jP zd`ey|k8Qs&(CE57iNb@s8Kyy)CV06_OQ0{XkUJ4j8T{7z!In436;3Vwh67Dc1vEWT z;Di(lKpOZia^BVpxM})oq_ey0p|Xmr4a;AutRMu> z#x%A2_m_utH=2L4lCTop`@P~0T$TWU{tZqVyO6q~>4d1Vurg3NZbg4Z7{INn2ybH- zH764EC1Wdq>HYK`MeHE+>hXkXE5)_vByKP<9*E^bM$)aE^3$-~-)KE@%KuArxb zm1Nbl|9}r~aXOs$VP_LA%`(U_Ly2S+I(rZ3o!<-EhH4xe zzCygR-yx@BP!mT~IqN6A2qsOcqw6nATqZ)2=n`u@C#&M)v^;|pBA@-94v~+$yf%lZ z)m!<^ZT*h<(_;I!hYFgMlkL*2^UGQ7PqzT+8DL8u5at1NrHm?0&6w=qU{7*rX*I8J zQMPh&@DY8Z87EJ%0K4NAfEX}*CY($aNosr_V1!zX<4{%xD zrl<6Zh)qEMiQrIjk2;YsW;Sfy2oM4}Gd8G7g}WT;P;w(2q@PV602Y-3NR)!d++mL) z{YHwjPdEm8*;Dy#shi8nBc~4e7Ex{HReq+6tu5L_hK#!gqah%~{pbOV->&LLeM@^$ zTspgl0naOq%a=T`E8jxy6nJNqd}EZ43l$l)InNR$w3wf4mW97(Y^*QmZZD%Lv(x zJoYq?1JRGpI1o+yL0cWJj|bb43mY5LgCzt-Hc%riM~wJyve4Tl)FTlB4smG0@gr-c z_$B;|;==XVNvv2nBZeDo9qeQK_Um|D0dKUXjV>AnT4W3SCJiLId;6>S8-3o~McsDP zXUf@3k5I)!nadgG)Rz_94kAuY2fR`HIhct7>3d$S2LrroSN|x5!n+Wn>LEIo%m+j_ zZ=b&%a6aw-`BEise?GRFRhdMdtQS_3o<)Q;t%+m8lBRH=!BFeq4)$CcQB^0>HFg*M z*o~IFrcg;3VyZLuK1S<73jK;SR#%bN@fb160{|jw4p*S}H)WW;y}s*Ahy|thoE@vv zURzwd5VIN`qCFDMj-}a>^u+eJ99-%X2xn= z$|=NT3Bd_#T1-PX3i%7Fggi0Z`YxJ2JxCW9o?>>;u&DmL5-ovziwW|Hi@lC_=G0Nh zt%qv=B5a|G*;m7_6x4&AOfW#_teaG3C>ctHXB5pLhU+xiTLD%DM_`*&k0**CCI^oV z@QXOBJ`Tfnc|K?2Ke>IBDukwcwTC5}C&Jlub1n7~$&fEpdAzg;hBBC(MO4|Rh+MPi zAT`gtJ+Bfn{#UGq24FSR5!dIhADyv-dAAprLGcF8vS*8f_w(+v8Sy>}v+R4t&y0ak z6}PI&NSc;2;xWp}1BDd?XTY|kYo!X-d7!d5u=?y!>g4bp%?ihZF{50+Ymx<6UAYb` zB6YnC{DpzGIQOQ?>ZHi(t)zJkX$FbI88g-+d@LcUVdQ&0e^6h zFN8^yF=}ze=@V+#Jqc{4IakG~^n+(W#8*f5Kf90|>dci`k$eBih4f0J;&^0D-^XSj z2J_Ex>N#$Gd;OOZXm+x~t3s~Wg7g^^3M&V1E%`ds-yARaPWp-lhl+Gc72hzwEwwLZyzvF zf(@_4SIZ)^-xnX*n|FKm;zp)8OB4!LLElEvgsGfu>5cumGdi!*Yq36wr`_?h|{>iAwp%v!`xMbfC-wBY&Ue}@-dV>yTl zPVpKGH5{ zk5>iM1yN$^M-v%_)eo!Yw!xMBab4S^w--s)KPm#$vMS`vwhv#BiUn=GTkANMd3v3U z*RDL66!zAv9IeZm9Gf15%SwRV1Z;AiOv8@JVvt)gz4Ul6JsH`Cd9xe;2Mb0TdlZ!S z*8o%$4fIV|inRl-q6q6IKbBcnL_qBRhkxml*vKClc%Q)@-? z)bi>^+l>=m>2 z<6lT-Z3bSHn_Cab%+WI27b})g`tZAgdq3e3Us10NVK)&!Gapv<234FhNYa~LT@y52 zyAAK3D%l@ehHIEb^F6BOx4cj{xfjUMD6>)N`2arSCg3T{1sBfwC@3?O4-6et45-Q6 zCN+DApK$p)rwo6HnN~CX|BO)BH#XXEr7r>Z;518qYOG;ij%Q~BbZWI)A$gU{K7YhW zglpFS9RzKDQ>}qV;;9%WyW!E;XZ~KEnXx09-olDMS-cQ^=gjd+o}!S%z(O{Aw8dt5 z_FhS*j><=Sm3)>-)2*l;Y61erH9Zu=-lbipP*{SHeS4wg!&laKuMIvMFaIFM&;llm zDst!C$8qjxI(6sM!JnAKu_{9MD+&DTrB72oQQe({(%w{PC;SKfQQkwxp)%wegSes| z;@PBXkSy;@Yjb?4uWW(61koFt>Fmq#X_Jj4>sCv!=S;SQE|aM7%ox$ictyO)q6dGP z{;^e%C_)a~SA3x?fr5n7OhBHkmC^dC{z#aeahz7(GyqgW)F=DeYE@J*Lr zdJT7fRDD~T-Pw9$OvrHZ;Ku)8Oss?6oY`U;G_sXvW_--_99a=F_c-bNk)X$Po`Qep zJz!gsi|bW>*(r0Fnbd(10l=1m14Eo)MVH~Mwl#rkH#f+rxZUT(G^vMWA72VeTCV@w zp%f%H&eJ&)O1^iQ2g0ub6iV$J!IUB|+q1o!*X&te=x1x_*8BfRIZ3zP33`+JR;@&a)s#Td2W=;ex2=CNrK ztdO5^_#P~1*8xJ%w+?-VJO(4$ zBlV#M68Y>7Pi{;s*#pXJvz+Jjf>J#UUWFfey-B4dYkG_AlEyP4)XJy&^wT(=_P47V zeX;DG;30^crT^{O+?poqlIVqa=geY@zhI20q~*o*-~gKsc=hq67^{H3X~`(E7gT)= zFlDM6FEct?|5cBjcO9Y_PdMOi(pBXWk!WpoIOk##KE9EXwccj{)^oUM#ur__9aB*} zB@-0N*Hk6p%cw}}z-wv0!3i^#G*IGcG|d|`pJXP$fy;R)J$`t5%6~5TFcwrb$sOU; z!|`gu_!Y&gf(<;yVC_)stYP)pSUe!9RVZX?IwgeoUZA=V!_=1EX14ki9hX9G9LIR6 zC{v_lbxf92>O4q0-rM+*qGiqgxNg|=(}I0ZCUT_^No&u=?6Nm%)M}p#IUEJ$48HFj z{@h~^&Q<(FldKZZYY=%kSU_?r0Mx{{%WIhTdE@wZ{5;%{n7Ce%7b!J5ReIGWu)xXh zY2WDSYO{@p#Q{SlftudzEbQekk(z-UZE|;@6`q52k1q>1{xW#0&~?N4p!&kUsfDf%rpDdYnQ%b>}ib?io_+= zJ{m_Sd_W~|v&)Ai)!MWz%rajvc)h~X@1L+ReW(C$vW!dfMD*@1bK8(oLb@xe*E(*x z&XE~yFEctMY3V9mf5ch2nTKXjdi9YV<&0i+F;J17{)wI_zaTAsmOuMx%@WEzF@17+ z7U&o3lStce(TRw#61x835R*SL%c7@i-xsbqighPaAD)8&Y0FBW< z_6fgHk?d9D``utnWpvIvF$vw)PSG+xDlc}QLg>5U7xPFQ)q5hDQwY8B)V1lDRL!lr z6=l1+F`YuXJSwQ`#b(?P!b@hWy`KZ#EBuATWEG(8|44u?DI#Lpr$@xlZ#qhlz$+AK zD))%t6uohf>p)v)pu}eDBm79u!D1`|xT3+H5-e)!=FJRn*WO4o6Dosf)-)_uh1A~9 zvxUdPC;r>mqkGZWK{u`jV#!86XNqaw>|rz2@B7O~HDGko=HL9I5Tdf8&TvgH}o=%DwJ=;b#}4% z)Y#<(>?2`n)a5@CB|&yaekgAe2j{N!+Qb$R*}4RVt9$MtMqXC#&clJU4J6>@%hyAS zSNjUFY_ubehK{B;c!g?HI}NH9CF?Z}(yAbK~VO^?%;AP8Sp}If5##QSZJl5t@B#fq&{z_YxwnT;YzInd=SKQU5L^ z%CB+PlO-O^5gNh`iuf11Xy!ek_N$O*h`D|u+EHRRCqH{?`N5xIZXQ=$4{~!|Bczqp{qrfY~`-$OcKmYnQUE#6e-aPv3C$`p>NlX%sSnRQ}q83 z-Z$+?rH471$GvT_iAgifKi!!1dSTZNlq(^==~A)5NNu>FCg^26Kv@ZXrm0O?0)5M=Kj-;GNJbz3^m~9$RDy_9H{W&4r?IB#FIV}9 zi8Ojckw4j-KfsEett6)L<7IL+F+|Jm`GiJ1DP&N$^+Qs7u;TD=_whH?+5%W6vy0+d zlUAaQTM6^V=46!U@XSYyRz1Q4weVWQ+an=B$rLXlAfV}3k@8AZe1P(wWX{>|xA-_p zrAh+g2Qy{YPxKIW1+uj)+f;tHrFjOLxI=1?P;G30e30pUQ#o(lnoN%yGUhy&Otc;ienIk0imcI?}PGk)E z3E0pY$=3ijlDq9&!*od>bPD%VDHBajRsPBqHPE>{;ad{~B7{;?w@>(=xMFFmJ9vu~ z&Jbnf8rqHtR6ak|yM<_E2NrEG>unwJ; z&L@v_e4hKg^~xC3d0G+icjQR(p$`~+mJj)tZ?0sOteCP^*)&4ioe)i%jEy<8lr$u6 zJk9ipkuIFs->gcr4n%#&b9TZ#@1LnS{WEIFq(>qB=Id?SJbM3MK701%xk!&FOQBl_RZeZQ*q{gOd#mVU!?lp2q7Gft!8=~)Q-*zS7 z?H=IQn2)nVtW$ckzUz(V|L%X9L9$JlY+V}U_Bc&@QZWjoNXCkRN8)&ENRIK9iAOK z(!VK){(nSeZO%YYNs&eP*CuO4|2e9lwPu60;&(#cw&v~;$=wiT#81W=#H_Uvh*iAyC6D*5;Yw>0M9pL{H9AACPF1!Yr`|dBu3&7wpDO`g2*R@fZBI)J3h2PTxW0Pw zn=Juk!|!A!xY7M$cO*w15s+a=_qP`bK$5h7hiZUh{x5mj{uq1er20SS^XV5bNAoOA z$NR&!fH=_RHwIa*f4W8fZ_o5M-TKe}_g@NsKIc%7XAaZrX8SZyAGtsz+FSI0>MX1} zYN^T=?|3fR(vx5$=9^hl+0QOK$2PtfWG(6Z$8mRK=1f zLh}?&u}3$z9`#Pk(sw}Rcz3g1<3`4j09yEWf+|2u1KPI$;O7KMp(cdw0XV^ zSL$8kO70SQ3bl0NeD|l#;6>TH`BcI9!qNu7mbOu%`&+!m46{lE*e$@;07B2Iu6_aV zZmUEzGy!3CSWcI!6}iKCGsEZ>1i|s!(_cb7TJgU1Z&eia0icQsjw)}K<8O|TK)bnI zaKjxdbNL}aNLI+a(-1w{^telJ_V^T$DR3zQ^YNk9euEy>O^YiR=<^-z$f|(l(JQ_8Gml>9 zNHI@ITVv=dQ3d&Y$GX?_!rqJVbvCvAFptmMx?FV@aMWTk1`z;4LijW8b zdAwfNCTFFwQmiTzY%A5Gwqboyw4Z>6DPleA8|1(t8C$7YyfY8iP+T8BvN)dax|;fG zzqr%OWYZ6C2?W82uE5nbv^OEMKAG$dv-VLc|#>d%a5TBa&CQ`~PUwcWE#SxN2k zZ6T`lt`qXKj9lx5CbHO5AUzM-Mx}B4JYN8iplY?D}`KjEHC-&Su0fF>Y8YM?v=seI#y{bKi`>= zf#>i%iEI%#gsDSmsbB{4K+ev%?1^udedmfy)fD?3J{*^gU z)@q`%$`au$?_p{YF0@_LyV^)(9@`T~Qf)W1pka8)RDNZb1Nk2r&+7hJbHftz!`GlSDzmF$2Jp`E>etMIm{o1HZmUd<+Sfv6dnS$B z*d0Vr#bZVr_)y_zB;0xX72uRp49g2@n$7VYr5{|5{S}aZNgN zGq-!5n&wDVD`Mq#$9_`HaZvWu;5x5QGnUtNRir3#NkrZDmaK=GebiNL?dC772@&%& z?VQ8!(C0XWgp;5iRZ++K*NS&;lz9w{=ZyoL+DXaYMe(a!i1$aPo1qE^bgVEW z34-}*`N-;%*n5+-y^L!m&#q;6%oji@GdaxtJ_#PA$sp=5^r(*SQaQj+;dy|u?7w-692?3KJVH$mGVUE z^7_0%pBpx!QkbcDKVt~gNq3NRsabeKf5TS#SUDiEM;iRVq*#TlXppI@0&L(s{1OF! z$$kya=jkM~8C$nEh;(YEE}z}57ul<&nl){**(6=TTs#~5>5_85gqLU`F`0>DW%L7L z19^d$WBxGQhdz3il)LtP-j8qMTzt63HtSp}7k-#)HOc-l2_pEQ7I!+K9O0GCo@fgt zi9A~BB*TX~?J5hwwBr{2bWA19_^fHDLkw8NhK3C)A9hzqFsn-dMvZLgj*oVAYvT&`YgoBq-h?tM)>P_aLLkVX_eIsKfG>h!HkUrD)e(&JLqlYDBCJ zc!5wY`tbXSH1X&1pojX$D9p^pt1R_&<(jzwkKE;{M1Fa-@$#B1-Sjxxb3|&Z`@8)^ zBEIks*73MZ;WU2HNy0zs@-^!o-*c|WGE5hF!?JULrAXL6tkCCpSGfZ5(vuO)ddkiF z1ODuL!9`L!AuU{_`SAMidj4dB}O*c9ssF`R}xUuX-1RE%{T~5YRKOl%CF|+73>(&rRRNE;mLKgfw zLWHIHvD(0Avrkg_EUsPjowlPyp6V|qajuHuf@1D3RQnY@$nIC^7~KBZjl8Bc16mNe z4VUEnv0A37>~{LYHEi~u*CThlCTRR3Fl&-7QCykLKNi>U%kMkQu zt9>qunf8jn|DYzB~}zqB6hF_Z5rRW)eH4}WwTP6<ZaNf9G zb!OZb-ef*@M48b1hS%D5YvOTkp=+W{0BT!(QY*{c3KpU+Z;+B_t!1oD1s8)g%swlg z?M|Hd8FrI$v9TUBC6`7V8~boaw^SAOX8SvipY^otBNF|wC?g551TT!^)C(JYReFS!g?W7d0JJXDLNHAxOllvau9i5aydVSC9M)=pz zP{SvB#+ zwyPS?%~){N00(*}j<=dT0()NFV6szx4;&Y51!4*jX$*`GTcn)6GRL*#RdVFbOsWbYfs#@x0t+;&AfmopFnbRiK zH**mR;cj;h>;;>p)hkGhr6U1*_tpt^gr5Z2+WkzE_d}D%Ilec`WCo!hSlllxm96nl z5r&H;I?XYlj*iE8ZeP@{%)2DIN~(<{q|2v@Ua9V%5Mis;7Kmxoc6aoIFTKRZ=fNW^ z@me=p1TG^Yg6YidHLtcP=`ZNh4{tk|r0ULIsO&eIeai4MO8h~T4DzdY!@g|_DaeUs z-UHzu!hbpTU?F)?wA3O_i`pa+2am$y^1OGB?-WfZ3F6HH(gno@9{$><#$&SX$H2xu z#`g2DxLek*pF9x?G}>p_ofa3Y>71K1>&(uhdj$8DD8F zW}@g(RyY17U%f)=;=BIFl%j9zDAxY9#|UThm?2m)Mtw2a>QOT;7+OL%RAhMn+iYOB zNrxl?%=bc4sA~L@NrmWXj;Z)@zGY<0v$$=w+@*3n$(H3<1 zD`|zTy7V~0vG@c;L`=X?t|&q_3{oqS>PuTH9-Y|HHlmQUo+(6y*Z+`mtv!lk@cR6| z<{0xr$!)p#VrW8I^=m1{{VVphTdwPC&L-Y<8OAyzLlc!TAjVx-n% zmy(M!FP$O;==^waUzjH z(K>_ml378e>yITr>=cMQBn>CL7O&2JH2k=9^xP7k9a2qw{LC(EQfFIl#;MGuaWj

OqZ+fi13bMxPkhcAxbJ=~DF`IOw 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 R*1zW*6GKY_+~sSx{|Bk&-P!;E literal 0 HcmV?d00001 diff --git a/docs/screenshot-mobile.png b/docs/screenshot-mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..2a09e12eeda5ac24391d4bf179006d7d7aa36b4e GIT binary patch literal 108078 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 Opu~iv1xtSD{Qh4~)}o65 literal 0 HcmV?d00001 diff --git a/docs/screenshot-uptimerobot.png b/docs/screenshot-uptimerobot.png new file mode 100644 index 0000000000000000000000000000000000000000..68db2df06e5874390461641d829cb301a766582e GIT binary patch literal 61266 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 GiGKoEMk?0; literal 0 HcmV?d00001 diff --git a/docs/screenshot-view-cards.png b/docs/screenshot-view-cards.png new file mode 100644 index 0000000000000000000000000000000000000000..f2eeb1a2d41b56d45331585168b1f60804d6d60e GIT binary patch literal 102862 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�x3mUIva0Q!97#5S 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

P%DA|j;W0?8 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

ZLZZ@ra9g{=)c#edP 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Ü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 literal 0 HcmV?d00001 diff --git a/docs/screenshot-view-table.png b/docs/screenshot-view-table.png new file mode 100644 index 0000000000000000000000000000000000000000..f81bf09ac23e98ddfc920968f571f08be545ad0c GIT binary patch literal 81621 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

OqZ+fi13bMxPkhcAxbJ=~DF`IOw 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 R*1zW*6GKY_+~sSx{|Bk&-P!;E literal 0 HcmV?d00001 diff --git a/edge/cloudflare/worker.js b/edge/cloudflare/worker.js new file mode 100644 index 0000000..561ff91 --- /dev/null +++ b/edge/cloudflare/worker.js @@ -0,0 +1,221 @@ +/** + * shiroko-monitor 边缘探针(Cloudflare Workers) + * + * - scheduled:cron 每分钟触发一轮探测(HTTP 用 fetch,TCP 用 cloudflare:sockets) + * - 状态与历史心率整体存于 KV 的 state 键(小规模单键足够,上限 25MB) + * - /api/status、/api/monitors、/api/refresh 由本 Worker 提供,其余请求交给静态资源 + * + * 注意:cloudflare:sockets 的 TCP 出站连接需要 Workers 付费计划; + * 免费计划下 http 类型探测与静态面板均可正常使用,tcp 类型会返回 down。 + */ + +import { connect } from 'cloudflare:sockets'; + +const VERSION = '0.6.0'; +const HISTORY_LIMIT = 48; +const UPTIME_DAYS = 90; +const USER_AGENT = 'shiroko-monitor/0.3 (lightweight uptime panel)'; + +// 边缘端按 UTC 日期分桶(Worker 无本地时区概念) +function dayKey(d = new Date()) { + return d.toISOString().slice(0, 10); +} + +// 只保留最近 UPTIME_DAYS 天;YYYY-MM-DD 的字典序即时间序 +function pruneDaily(daily) { + const keys = Object.keys(daily).sort(); + while (keys.length > UPTIME_DAYS) delete daily[keys.shift()]; +} + +export default { + async scheduled(event, env, ctx) { + ctx.waitUntil(runChecksDedup(env)); + }, + + async fetch(request, env, ctx) { + const url = new URL(request.url); + if (url.pathname === '/api/status') return json(await getStatus(env, ctx)); + if (url.pathname === '/api/monitors') return json(await getMonitors(env, request.url)); + if (url.pathname === '/api/refresh') { + // 公网上的强制探测必须显式开启,避免被任意访客当作「探测放大器」使用 + const gate = refreshGate(env, request); + if (!gate.ok) return json({ error: gate.error }, { status: gate.status }); + return json(await runChecksDedup(env)); + } + return env.ASSETS.fetch(request); + }, +}; + +// 未配置 REFRESH_TOKEN 时一律拒绝(wrangler secret put REFRESH_TOKEN 开启); +// 比较采用等长逐字节异或,避免按字符提前返回带来的时序差异 +function refreshGate(env, request) { + const token = env.REFRESH_TOKEN; + if (!token) return { ok: false, status: 403, error: 'refresh-disabled' }; + const url = new URL(request.url); + const provided = request.headers.get('x-refresh-token') || url.searchParams.get('token') || ''; + if (provided.length !== token.length) return { ok: false, status: 403, error: 'refresh-forbidden' }; + let diff = 0; + for (let i = 0; i < token.length; i++) diff |= provided.charCodeAt(i) ^ token.charCodeAt(i); + return diff === 0 ? { ok: true } : { ok: false, status: 403, error: 'refresh-forbidden' }; +} + +async function probeMonitor(m) { + if (m.type === 'tcp') return probeTcp(m); + // 边缘端无原始 socket 读取能力(sockets API 需付费版且未覆盖测试),banner 类型请使用本地探针 + if (m.type === 'banner') return { status: 'down', latency: 0, code: null, detail: '边缘端暂不支持 banner 探测(请用本地探针)' }; + return probeHttp(m); +} + +// 同隔离体内共享同一轮探测,避免并发刷新对目标重复施压(跨隔离体为 best-effort) +let inFlightRound = null; + +function runChecksDedup(env) { + if (!inFlightRound) { + inFlightRound = runChecks(env).finally(() => { + inFlightRound = null; + }); + } + return inFlightRound; +} + +function json(data, init = {}) { + return new Response(JSON.stringify(data), { + ...init, + headers: { 'content-type': 'application/json; charset=utf-8', 'cache-control': 'no-store', ...(init.headers ?? {}) }, + }); +} + +async function getMonitors(env, baseUrl) { + const raw = await env.MONITOR_KV.get('monitors'); + if (raw) return JSON.parse(raw); + // 未手动写入 KV 时,直接从静态资产读取仓库根目录的 monitors.json,实现零配置部署 + const res = await env.ASSETS.fetch(new URL('/monitors.json', baseUrl)); + if (res.ok) return res.json(); + return { settings: {}, monitors: [] }; +} + +async function getStatus(env, ctx) { + const state = (await env.MONITOR_KV.get('state', 'json')) ?? { monitors: {}, generatedAt: null }; + if (!state.generatedAt) ctx.waitUntil(runChecks(env)); + return state; +} + +async function probeHttp(m) { + const started = Date.now(); + const timeoutMs = (m.timeout ?? 10) * 1000; + try { + // redirect: manual —— 保留 3xx 原始状态码交给 expectStatus 判定 + const res = await fetch(m.url, { + method: m.method || 'GET', + redirect: 'manual', + signal: AbortSignal.timeout(timeoutMs), + headers: { 'user-agent': USER_AGENT, accept: '*/*' }, + }); + const latency = Date.now() - started; + const expect = m.expectStatus ?? [200]; + const ok = expect.includes(res.status); + return { + status: ok ? 'up' : 'down', + latency, + code: res.status, + detail: ok ? `HTTP ${res.status}` : `HTTP ${res.status}(期望 ${expect.join('/')})`, + }; + } catch (err) { + const latency = Date.now() - started; + return { + status: 'down', + latency, + code: 0, + detail: err.name === 'TimeoutError' ? `请求超时(>${timeoutMs / 1000}s)` : String(err.cause?.code || err.message), + }; + } +} + +async function probeTcp(m) { + const started = Date.now(); + const timeoutMs = (m.timeout ?? 10) * 1000; + try { + const socket = connect({ hostname: m.host, port: m.port }); + const timer = setTimeout(() => socket.close(), timeoutMs); + await Promise.race([ + socket.opened, + new Promise((_, reject) => setTimeout(() => reject(new Error('TCP 连接超时')), timeoutMs)), + ]); + clearTimeout(timer); + socket.close(); + return { status: 'up', latency: Date.now() - started, code: null, detail: `TCP ${m.host}:${m.port} 可连接` }; + } catch (err) { + return { status: 'down', latency: Date.now() - started, code: null, detail: String(err?.message || err) }; + } +} + +async function runChecks(env) { + const config = await getMonitors(env, new URL('http://placeholder/')); + const state = (await env.MONITOR_KV.get('state', 'json')) ?? { monitors: {} }; + const monitors = state.monitors ?? {}; + const redact = config.settings?.redactDetails === true; + let up = 0; + let down = 0; + let pending = 0; + let latencySum = 0; + let latencyCount = 0; + + await Promise.all( + (config.monitors ?? []).map(async (m) => { + const prev = monitors[m.id]; + const r = await probeMonitor(m); + r.checkedAt = new Date().toISOString(); + const history = [...(prev?.history ?? []), { t: r.checkedAt, ok: r.status === 'up', ms: r.latency ?? 0 }].slice(-HISTORY_LIMIT); + + const daily = { ...(prev?.daily ?? {}) }; + const key = dayKey(); + const bucket = daily[key] ?? (daily[key] = { total: 0, up: 0 }); + bucket.total++; + if (r.status === 'up') bucket.up++; + pruneDaily(daily); + + monitors[m.id] = { + status: r.status, + latency: r.latency, + code: r.code, + detail: redact ? (r.status === 'up' ? '正常' : '异常') : r.detail, + lastCheck: r.checkedAt, + history, + daily, + }; + if (r.status === 'up') { + up++; + latencySum += r.latency ?? 0; + latencyCount++; + } else { + down++; + } + }) + ); + + let uptimeUp = 0; + let uptimeTotal = 0; + for (const m of Object.values(monitors)) { + for (const bucket of Object.values(m.daily ?? {})) { + uptimeTotal += bucket.total ?? 0; + uptimeUp += bucket.up ?? 0; + } + } + + const next = { + prober: `shiroko-monitor-worker/${VERSION}`, + demo: false, + generatedAt: new Date().toISOString(), + stats: { + total: (config.monitors ?? []).length, + up, + down, + pending, + avgLatency: latencyCount ? Math.round(latencySum / latencyCount) : null, + avgUptime90: uptimeTotal ? Math.round((uptimeUp / uptimeTotal) * 1000) / 10 : null, + }, + monitors, + }; + await env.MONITOR_KV.put('state', JSON.stringify(next)); + return next; +} diff --git a/edge/cloudflare/wrangler.toml b/edge/cloudflare/wrangler.toml new file mode 100644 index 0000000..596c33c --- /dev/null +++ b/edge/cloudflare/wrangler.toml @@ -0,0 +1,14 @@ +name = "shiroko-monitor" +main = "worker.js" +compatibility_date = "2025-09-01" + +[triggers] +crons = ["* * * * *"] + +[[kv_namespaces]] +binding = "MONITOR_KV" +id = "REPLACE_WITH_YOUR_KV_NAMESPACE_ID" + +[assets] +directory = "../../public" +binding = "ASSETS" diff --git a/package.json b/package.json new file mode 100644 index 0000000..ad02f99 --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "shiroko-monitor", + "version": "0.1.0", + "description": "轻量级服务监控面板:纯静态前端 + Node/边缘探针,支持 HTTP 与 TCP 探测", + "type": "module", + "scripts": { + "start": "node prober/node/index.js", + "probe": "node prober/node/index.js --once", + "demo": "node prober/node/index.js --once --demo" + }, + "engines": { + "node": ">=18" + }, + "license": "MIT" +} diff --git a/prober/node/index.js b/prober/node/index.js new file mode 100644 index 0000000..389f50d --- /dev/null +++ b/prober/node/index.js @@ -0,0 +1,746 @@ +#!/usr/bin/env node +/** + * shiroko-monitor 本地探针 + 面板服务器(零依赖,Node >= 18) + * + * 模式: + * 默认 常驻巡检:按各 monitor 的 interval 周期探测,结果写入 public/status.json,同时伺服面板 + * --once 执行一轮探测后退出(供 GitHub Actions 等 CI 使用,历史心率从已有 status.json 恢复) + * --demo 生成一份演示状态数据后退出(用于静态部署的首版占位) + * --out= 指定快照输出路径,默认 public/status.json(可避免演示数据覆盖真实快照) + * --config= / --local-config= 指定公开配置与私有覆盖的路径(多实例、测试用) + * + * 私有配置:若存在 local.monitors.json(已在 .gitignore 中),其 monitors 按 id 覆盖公开配置, + * 用于把真实地址/端口从会公开的 public/monitors.json 中拆出去。 + */ +import http from 'node:http'; +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { probeHttp } from './lib/http-probe.js'; +import { probeTcp } from './lib/tcp-probe.js'; +import { probeBanner } from './lib/banner-probe.js'; +import { fetchUptimeRobotMonitors } from './lib/uptimerobot.js'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const ROOT = path.resolve(__dirname, '../..'); +const PUBLIC_DIR = path.join(ROOT, 'public'); +const CONFIG_PATH = path.join(PUBLIC_DIR, 'monitors.json'); +// 私有配置(不入库):用于把真实地址/端口从公开的 monitors.json 中拆出去 +const LOCAL_CONFIG_PATH = path.join(ROOT, 'local.monitors.json'); +const STATUS_PATH = path.join(PUBLIC_DIR, 'status.json'); + +const HISTORY_LIMIT = 48; +const UPTIME_DAYS = 90; +const CONCURRENCY = 8; +const WRITE_DEBOUNCE_MS = 300; +const DEFAULT_INTERVAL_SEC = 60; +const PORT = Number(process.env.PORT || 8787); +const VERSION = '0.6.0'; +const UR_DEFAULT_POLL_SEC = 300; +const UR_MIN_REFRESH_GAP_MS = 60000; + +const argv = process.argv.slice(2); +const ONCE = argv.includes('--once'); +const DEMO = argv.includes('--demo'); + +// --out= 或 --out :指定快照输出路径(默认 public/status.json) +function argValue(name) { + const inline = argv.find((a) => a.startsWith(`${name}=`)); + if (inline) return inline.slice(name.length + 1); + const idx = argv.indexOf(name); + return idx >= 0 && argv[idx + 1] && !argv[idx + 1].startsWith('--') ? argv[idx + 1] : null; +} +const OUT_PATH = path.resolve(argValue('--out') || STATUS_PATH); +// --config / --local-config:多实例或测试时指定配置文件(默认 public/monitors.json 与仓库根的私有覆盖) +const CONFIG_OVERRIDE = argValue('--config'); +const LOCAL_CONFIG_OVERRIDE = argValue('--local-config'); +const ACTIVE_CONFIG_PATH = CONFIG_OVERRIDE ? path.resolve(CONFIG_OVERRIDE) : CONFIG_PATH; +const ACTIVE_LOCAL_CONFIG_PATH = LOCAL_CONFIG_OVERRIDE ? path.resolve(LOCAL_CONFIG_OVERRIDE) : LOCAL_CONFIG_PATH; + +const MIME = { + '.html': 'text/html; charset=utf-8', + '.css': 'text/css; charset=utf-8', + '.js': 'text/javascript; charset=utf-8', + '.mjs': 'text/javascript; charset=utf-8', + '.json': 'application/json; charset=utf-8', + '.svg': 'image/svg+xml', + '.png': 'image/png', + '.jpg': 'image/jpeg', + '.ico': 'image/x-icon', + '.woff2': 'font/woff2', +}; + +function loadConfig() { + const pub = JSON.parse(fs.readFileSync(ACTIVE_CONFIG_PATH, 'utf8')); + const local = loadLocalOverlay(); + if (!local) return pub; + // 私有配置按 id 覆盖公开条目(前者可只写 url/host/port 等敏感字段),settings 同样按需覆盖 + const byId = new Map((local.monitors ?? []).map((m) => [m.id, m])); + return { + ...pub, + settings: { ...pub.settings, ...(local.settings ?? {}) }, + monitors: (pub.monitors ?? []).map((m) => ({ ...m, ...(byId.get(m.id) ?? {}) })), + }; +} + +function loadLocalOverlay() { + try { + return JSON.parse(fs.readFileSync(ACTIVE_LOCAL_CONFIG_PATH, 'utf8')); + } catch { + return null; + } +} + +function loadPersistedStatus() { + try { + return JSON.parse(fs.readFileSync(STATUS_PATH, 'utf8')); + } catch { + return null; + } +} + +function dayKey(d = new Date()) { + const p = (n) => String(n).padStart(2, '0'); + return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`; +} + +// 只保留最近 UPTIME_DAYS 天;YYYY-MM-DD 的字典序即时间序 +function pruneDaily(daily) { + const keys = Object.keys(daily).sort(); + while (keys.length > UPTIME_DAYS) delete daily[keys.shift()]; +} + +function recordDaily(daily, ok) { + const key = dayKey(); + const bucket = daily[key] ?? (daily[key] = { total: 0, up: 0 }); + bucket.total++; + if (ok) bucket.up++; + pruneDaily(daily); +} + +function intervalMs(monitor) { + const sec = Number(monitor.interval); + // 非法或缺失的 interval 一律回落到默认值,避免算出 NaN 让该目标永久不再被调度 + return Math.max(5, Number.isFinite(sec) && sec > 0 ? sec : DEFAULT_INTERVAL_SEC) * 1000; +} + +/* ---------- UptimeRobot 只读数据源(异地探测视角) ---------- */ + +// API Key 建议放 local.monitors.json(不入库)或环境变量 UPTIMEROBOT_API_KEY;两者都无则视为未启用 +function uptimeRobotConfig(config) { + const ur = config.settings?.uptimeRobot ?? {}; + const apiKey = String(ur.apiKey || process.env.UPTIMEROBOT_API_KEY || '').trim(); + const ratios = Array.isArray(ur.ratios) && ur.ratios.length ? ur.ratios.map(Number).filter(Number.isFinite) : [1, 7, 30, 90]; + return { + enabled: ur.enabled === true && Boolean(apiKey), + apiKey, + pollIntervalSec: Math.max(60, Number(ur.pollIntervalSec) || UR_DEFAULT_POLL_SEC), + group: ur.group || 'UptimeRobot', + includeTypes: Array.isArray(ur.includeTypes) && ur.includeTypes.length ? ur.includeTypes.map(Number) : null, + ratios: ratios.length ? ratios : [1, 7, 30, 90], + }; +} + +// UR 侧不探测,只做「拉取 + 映射」;失败时保留上一次数据,绝不因为读不到 UR 就把服务判为离线 +async function syncUptimeRobot(runtime, { minGapMs = 0 } = {}) { + const ur = uptimeRobotConfig(runtime.config); + runtime.ur.enabled = ur.enabled; + if (!ur.enabled || runtime.ur.syncing) return; + // minGapMs 用于「面板手动刷新时顺带同步」的场景,避免被反复点击打爆 UR 接口 + if (minGapMs && Date.now() - runtime.ur.lastSyncMs < minGapMs) return; + runtime.ur.lastSyncMs = Date.now(); + runtime.ur.syncing = true; + try { + let list = await fetchUptimeRobotMonitors({ apiKey: ur.apiKey, ratios: ur.ratios }); + if (ur.includeTypes) list = list.filter((m) => ur.includeTypes.includes(m.sourceType)); + const seen = new Set(); + for (const item of list) { + seen.add(item.id); + let s = runtime.state.get(item.id); + if (!s) { + s = { monitor: item, nextDue: 0, inFlight: false, lastResult: null, history: [], daily: {} }; + runtime.state.set(item.id, s); + } + s.monitor = item; + s.lastResult = { + status: item.status, + latency: item.latency, + code: item.code, + detail: item.detail, + checkedAt: item.lastCheckIso, + }; + s.history = item.history; + s.uptimeRatios = item.uptimeRatios; + s.downSeconds = item.downSeconds; + if (item.status !== 'pending') recordDaily(s.daily, item.status === 'up'); + } + // 清理 UR 侧已删除的监控 + for (const [id, s] of runtime.state) { + if (s.monitor?.source === 'uptimerobot' && !seen.has(id)) runtime.state.delete(id); + } + runtime.ur.ok = true; + runtime.ur.error = null; + runtime.ur.count = list.length; + runtime.ur.lastSyncAt = new Date().toISOString(); + markDataUpdated(runtime); + console.log(`[uptimerobot] 同步完成:${list.length} 个监控(在线 ${list.filter((m) => m.status === 'up').length})`); + } catch (err) { + runtime.ur.ok = false; + runtime.ur.error = err.message; + console.error(`[uptimerobot] 同步失败(保留上次数据):${err.message}`); + } finally { + runtime.ur.syncing = false; + } +} + +// 恢复 lastResult / history / daily:优先复用内存态(配置热重载),否则读持久化的 status.json(重启) +function hydrate(config, prevState = null) { + const persisted = prevState ? null : loadPersistedStatus(); + const state = new Map(); + for (const m of config.monitors) { + const own = prevState?.get(m.id); + const saved = own + ? { + status: own.lastResult?.status, + latency: own.lastResult?.latency, + code: own.lastResult?.code, + detail: own.lastResult?.detail, + lastCheck: own.lastResult?.checkedAt, + history: own.history, + daily: own.daily, + } + : persisted?.monitors?.[m.id]; + state.set(m.id, { + monitor: m, + nextDue: 0, + inFlight: false, + lastResult: saved?.status && saved.status !== 'pending' + ? { status: saved.status, latency: saved.latency, code: saved.code, detail: saved.detail, checkedAt: saved.lastCheck } + : null, + history: Array.isArray(saved?.history) ? saved.history.slice(-HISTORY_LIMIT) : [], + daily: saved?.daily && typeof saved.daily === 'object' ? { ...saved.daily } : {}, + // UR 侧的聚合可用率(用于在逐日分桶填满前也能显示官方数字) + uptimeRatios: own?.uptimeRatios ?? saved?.uptimeRatios ?? null, + downSeconds: own?.downSeconds ?? saved?.downSeconds ?? null, + }); + } + // UptimeRobot 镜像目标不在 config 里,热重载时需整体保留,否则会丢掉已累积的逐日分桶 + if (prevState) { + for (const [id, s] of prevState) { + if (s.monitor?.source === 'uptimerobot') state.set(id, s); + } + } + return state; +} + +async function probeOne(monitor) { + let result; + if (monitor.type === 'tcp') result = await probeTcp(monitor); + else if (monitor.type === 'banner') result = await probeBanner(monitor); + else if (monitor.type === 'http') result = await probeHttp(monitor); + else return { status: 'down', latency: 0, code: null, detail: `不支持的探测类型:${monitor.type}`, checkedAt: new Date().toISOString() }; + result.checkedAt = new Date().toISOString(); + return result; +} + +async function mapLimit(items, limit, fn) { + let idx = 0; + const workers = Array.from({ length: Math.min(limit, items.length) }, async () => { + while (idx < items.length) { + const i = idx++; + await fn(items[i], i); + } + }); + await Promise.all(workers); +} + +async function probeDue(runtime, force = false) { + const { config, state } = runtime; + const now = Date.now(); + const due = []; + for (const m of config.monitors) { + const s = state.get(m.id); + if (!s || s.inFlight) continue; + // UptimeRobot 镜像目标由其自身节点探测,本探针只拉取结果 + if (m.type === 'ur' || m.source === 'uptimerobot') continue; + // 目标可单独退出「刷新即检测」(如有限流的 API),只按自身 interval 探测 + if (force && m.probeOnRefresh === false) continue; + if (!force && s.nextDue > now) continue; + // 先同步占位再探测:否则慢目标(如 10s 超时)尚未返回时会被下一秒的 tick 重复调度,形成探测风暴 + s.inFlight = true; + s.nextDue = Date.now() + intervalMs(m); + due.push(m); + } + await mapLimit(due, CONCURRENCY, async (m) => { + const s = state.get(m.id); + const task = (async () => { + try { + const result = await probeOne(m); + s.lastResult = result; + s.history.push({ t: result.checkedAt, ok: result.status === 'up', ms: result.latency ?? 0 }); + if (s.history.length > HISTORY_LIMIT) s.history.shift(); + recordDaily(s.daily, result.status === 'up'); + const tag = result.status === 'up' ? '[up] ' : '[down]'; + console.log(`${tag} ${m.id.padEnd(20)} ${String(result.latency ?? '-').padStart(5)}ms ${result.detail}`); + } catch (err) { + console.error(`[probe] ${m.id} 探测异常:${err.message}`); + } finally { + s.inFlight = false; + s.inFlightPromise = null; + } + })(); + s.inFlightPromise = task; + await task; + }); + if (due.length) markDataUpdated(runtime); +} + +// 等待在途探测收尾(强制刷新前调用,避免"正在探测中"的目标被跳过而显示旧数据) +async function settleInflight(state) { + const pending = [...state.values()].map((s) => s.inFlightPromise).filter(Boolean); + if (pending.length) await Promise.allSettled(pending); +} + +// 探针自报内存占用(MB):便于观察这个「监控器」自身的资源开销 +function memoryStats() { + const m = process.memoryUsage(); + const mb = (v) => Math.round((v / 1048576) * 10) / 10; + return { rssMB: mb(m.rss), heapUsedMB: mb(m.heapUsed), heapTotalMB: mb(m.heapTotal) }; +} + +/* ---------- 数据源过滤 ---------- */ + +// 只影响「展示与快照输出」,不影响探测:配置文件里的目标始终按各自 interval 探测 +function dataFilter(config) { + const f = config.settings?.dataFilter; + return ['both', 'config', 'uptimerobot'].includes(f) ? f : 'both'; +} + +/* ---------- 服务端更新节奏 ---------- */ + +// 快照里回报「数据最后变更时刻」与「服务端产出新数据的节奏」,供面板把倒计时对齐到服务端, +// 而不是从用户打开页面那一刻重新计时(否则每次进来都要重等一整个周期,最坏会看到近两倍周期的旧数据) +function markDataUpdated(runtime) { + runtime.dataUpdatedAt = Date.now(); +} + +// 当前展示集合下,服务端多久产出一次新数据:取各目标 interval 与 UR 拉取间隔的最小值 +function updateIntervalSec(config, filter) { + const intervals = []; + if (filter !== 'uptimerobot') { + for (const m of config.monitors) { + const n = Number(m.interval); + if (Number.isFinite(n) && n > 0) intervals.push(n); + } + } + if (filter !== 'config') { + const ur = uptimeRobotConfig(config); + if (ur.enabled) intervals.push(ur.pollIntervalSec); + } + return Math.max(5, Math.round(intervals.length ? Math.min(...intervals) : DEFAULT_INTERVAL_SEC)); +} + +function snapshot(runtime, demo = false) { + const { config, state } = runtime; + // redactDetails:公开部署时可只输出「正常/异常」,避免 detail 中的版本、地址等细节被公开读取 + const redact = config.settings?.redactDetails === true; + const filter = dataFilter(config); + const hideUrls = config.settings?.hideTargets === true; + const includeConfig = filter !== 'uptimerobot'; + const includeExternal = filter !== 'config'; + const monitors = {}; + let up = 0; + let down = 0; + let pending = 0; + let latencySum = 0; + let latencyCount = 0; + let uptimeUp = 0; + let uptimeTotal = 0; + + // 配置里的探测目标 + UptimeRobot 镜像目标(后者只存在于 state 中,由同步产生) + const entries = []; + if (includeConfig) for (const m of config.monitors) entries.push([m.id, m, state.get(m.id)]); + if (includeExternal) { + for (const [id, s] of state) { + if (s.monitor?.source === 'uptimerobot') entries.push([id, s.monitor, s]); + } + } + + for (const [id, m, s] of entries) { + const r = s?.lastResult; + const isUr = m.source === 'uptimerobot'; + if (!r) { + pending++; + monitors[id] = { status: 'pending', latency: null, code: null, detail: '等待检测', lastCheck: null, history: [], daily: s?.daily ?? {} }; + continue; + } + if (r.status === 'up') { + up++; + // 平均延迟只统计自建探针:UR 的延迟来自其探测节点,与本机视角不可比 + if (!isUr && r.latency != null) { + latencySum += r.latency; + latencyCount++; + } + } else if (r.status === 'down') { + down++; + } else { + pending++; + } + for (const bucket of Object.values(s.daily ?? {})) { + uptimeTotal += bucket.total ?? 0; + uptimeUp += bucket.up ?? 0; + } + const entry = { + status: r.status, + latency: r.latency, + code: r.code, + detail: redact ? (r.status === 'up' ? '正常' : r.status === 'down' ? '异常' : '等待检测') : r.detail, + lastCheck: r.checkedAt, + history: s.history, + daily: s.daily, + }; + if (isUr) { + // UR 镜像目标不在 config 中,需要把展示元信息随快照下发,面板据此合并渲染; + // hideTargets 开启时不下发地址:面板反正不渲染,公开的 status.json 里也就不该有 + entry.meta = { + name: m.name, + group: m.group, + type: 'ur', + url: hideUrls ? '' : m.url, + source: 'uptimerobot', + sourceLabel: m.sourceLabel, + interval: m.interval, + }; + entry.uptimeRatios = s.uptimeRatios ?? null; + entry.downSeconds = s.downSeconds ?? null; + } + monitors[id] = entry; + } + + return { + prober: `shiroko-monitor-node/${VERSION}`, + demo, + generatedAt: new Date().toISOString(), + // 数据最后变更时刻 + 服务端更新节奏:面板据此把刷新对齐到服务端,而不是每访客重新计时 + dataUpdatedAt: new Date(runtime.dataUpdatedAt ?? Date.now()).toISOString(), + updateIntervalSec: updateIntervalSec(config, filter), + // 让面板与服务端共用同一份过滤口径,避免私有配置覆盖后两边不一致 + dataFilter: filter, + stats: { + total: entries.length, + up, + down, + pending, + avgLatency: latencyCount ? Math.round(latencySum / latencyCount) : null, + avgUptime90: uptimeTotal ? Math.round((uptimeUp / uptimeTotal) * 1000) / 10 : null, + memory: memoryStats(), + }, + sources: { uptimerobot: { ...(runtime.ur ?? {}) } }, + monitors, + }; +} + +function writeStatus(data) { + const payload = `${JSON.stringify(data, null, 2)}\n`; + const tmp = `${OUT_PATH}.tmp`; + try { + fs.writeFileSync(tmp, payload); + // 原子替换:避免面板读到写了一半的 JSON + fs.renameSync(tmp, OUT_PATH); + } catch { + // Windows 下 rename 可能因目标文件被短暂占用而失败(EPERM,常见于杀软扫描), + // 退化为直接写入;监控探针绝不能因为一次写文件抖动而整个进程退出 + try { + fs.writeFileSync(OUT_PATH, payload); + fs.rmSync(tmp, { force: true }); + } catch (err) { + console.error(`[write] status.json 写入失败:${err.message}`); + } + } +} + +function scheduleWrite(runtime) { + if (scheduleWrite.timer) return; + scheduleWrite.timer = setTimeout(() => { + scheduleWrite.timer = null; + writeStatus(snapshot(runtime)); + }, WRITE_DEBOUNCE_MS); +} + +// 刷新即重新检测:多客户端/多标签页同时刷新时共享同一轮探测,避免对目标重复施压; +// 间隔过近的重复请求直接复用当前快照,只有真正需要时才新起一轮 +const FORCED_MIN_GAP_MS = 2000; +// 兜底上限:正常情况下轮次在目标超时内完成;若有 socket 卡死,也不让请求无限挂起 +const FORCED_MAX_WAIT_MS = 22000; + +function forceRound(runtime) { + if (runtime.forced) return runtime.forced; + if (runtime.forcedAt && Date.now() - runtime.forcedAt < FORCED_MIN_GAP_MS) return Promise.resolve(); + runtime.forced = (async () => { + try { + // 先等在途探测收尾再统一探测,保证返回时每个目标都是本轮的新结果 + await settleInflight(runtime.state); + await probeDue(runtime, true); + await settleInflight(runtime.state); + runtime.forcedAt = Date.now(); + scheduleWrite(runtime); + } catch (err) { + console.error(`[refresh] 强制探测异常:${err.message}`); + } finally { + runtime.forced = null; + } + })(); + return runtime.forced; +} + +function writeDemo(config) { + if (OUT_PATH === STATUS_PATH && fs.existsSync(STATUS_PATH) && !loadPersistedStatus()?.demo) { + console.warn('[demo] 目标已是真实快照,将被演示数据覆盖(如不希望覆盖,请用 --out= 指定其他输出路径)'); + } + const state = hydrate(config); + for (const m of config.monitors) { + const s = state.get(m.id); + // 过期证书目标在演示数据中固定为离线,其余按 id 哈希产生稳定的伪随机结果 + const seed = [...m.id].reduce((a, c) => a + c.charCodeAt(0), 0); + const alwaysDown = m.id.includes('badssl'); + const history = Array.from({ length: HISTORY_LIMIT }, (_, i) => { + const ok = alwaysDown ? false : (seed + i * 7) % 23 !== 0; + return { t: new Date(Date.now() - (HISTORY_LIMIT - i) * (m.interval ?? 60) * 1000).toISOString(), ok, ms: ok ? 30 + ((seed * (i + 3)) % 240) : 0 }; + }); + const lastOk = history[history.length - 1].ok; + s.lastResult = { + status: lastOk ? 'up' : 'down', + latency: lastOk ? history[history.length - 1].ms : 0, + code: m.type === 'tcp' ? null : lastOk ? 200 : 0, + detail: m.type === 'tcp' + ? (lastOk ? '端口可连接' : '连接被拒绝(端口关闭)') + : m.type === 'banner' + ? (lastOk ? `${m.protocol ?? 'BANNER'} 响应正常` : '标识串与期望规则不符') + : lastOk ? 'HTTP 200' : 'CERT_HAS_EXPIRED', + checkedAt: history[history.length - 1].t, + }; + s.history = history; + + // 90 天可用率演示数据:多数日期满分,少量日期按档位抖落,便于观察分级配色 + const perDay = Math.max(1, Math.round(86400 / (Number(m.interval) > 0 ? Number(m.interval) : DEFAULT_INTERVAL_SEC))); + const daily = {}; + for (let d = UPTIME_DAYS - 1; d >= 0; d--) { + const key = dayKey(new Date(Date.now() - d * 86400000)); + const missRatio = alwaysDown ? 1 : (seed + d * 13) % 23 === 0 ? 0.05 : (seed + d * 7) % 11 === 0 ? 0.012 : 0; + const miss = Math.round(perDay * missRatio); + daily[key] = { total: perDay, up: perDay - miss }; + } + s.daily = daily; + } + writeStatus(snapshot({ config, state }, true)); + console.log(`[demo] 演示状态已写入 ${path.relative(ROOT, OUT_PATH) || OUT_PATH}`); +} + +function sendJson(res, data, { status = 200, headers = {} } = {}) { + res.writeHead(status, { 'content-type': 'application/json; charset=utf-8', 'cache-control': 'no-store', ...headers }); + res.end(JSON.stringify(data)); +} + +/* ---------- /api/refresh 滥用防护 ---------- */ + +// 仅信任 socket 的对端地址,不解析 X-Forwarded-For(可被伪造);若前方挂了反向代理,请改用 allowRefresh:false +export function isPrivateAddress(addr) { + const ip = String(addr || '').replace(/^::ffff:/i, ''); + if (ip === '::1' || ip.startsWith('127.')) return true; + if (ip.startsWith('10.') || ip.startsWith('192.168.')) return true; + if (/^172\.(1[6-9]|2\d|3[01])\./.test(ip)) return true; + if (/^f[cd][0-9a-f]{2}:/i.test(ip) || /^fe80:/i.test(ip)) return true; + return false; +} + +const refreshHits = new Map(); +const DEFAULT_COOLDOWN_SEC = 5; + +function refreshDecision(config, ip) { + const s = config.settings ?? {}; + if (s.allowRefresh === false) return { ok: false, status: 403, error: 'refresh-disabled' }; + if (s.refreshLocalOnly !== false && !isPrivateAddress(ip)) return { ok: false, status: 403, error: 'refresh-local-only' }; + const cooldown = Math.max(1, Number(s.refreshCooldownSec) || DEFAULT_COOLDOWN_SEC) * 1000; + const wait = (refreshHits.get(ip) ?? 0) + cooldown - Date.now(); + if (wait > 0) return { ok: false, status: 429, error: 'refresh-throttled', retryAfter: Math.ceil(wait / 1000) }; + refreshHits.set(ip, Date.now()); + // 简单清理,避免长期运行下 Map 无界增长 + const expire = Date.now() - 10 * 60 * 1000; + for (const [k, ts] of refreshHits) if (ts < expire) refreshHits.delete(k); + return { ok: true }; +} + +/* ---------- UptimeRobot 兼容输出(只读) ---------- */ + +// 把内部快照映射成 getMonitors 的响应形状,便于既有 UptimeRobot 生态的脚本/看板直接复用本服务数据 +function toUptimeRobotResponse(runtime) { + const snap = snapshot(runtime); + const cfgById = new Map(runtime.config.monitors.map((m) => [m.id, m])); + // 字符串 id → 稳定数字 id(UptimeRobot 侧 id 为数字) + const numericId = (id) => { + let h = 0; + for (const ch of id) h = (h * 31 + ch.charCodeAt(0)) % 1e9; + return h; + }; + const ratio = (st, days) => { + const buckets = Object.entries(st.daily ?? {}).sort().slice(-days); + const total = buckets.reduce((a, [, b]) => a + (b.total ?? 0), 0); + const upCount = buckets.reduce((a, [, b]) => a + (b.up ?? 0), 0); + if (total) return (upCount / total) * 100; + // 无逐日数据时回退到数据源给出的聚合比率(UptimeRobot 镜像目标自带) + const provided = st.uptimeRatios?.[days]; + return Number.isFinite(provided) ? provided : 0; + }; + const monitors = Object.entries(snap.monitors).map(([id, st]) => { + const cfg = cfgById.get(id); + const isUr = (st.meta?.source ?? cfg?.source) === 'uptimerobot'; + const name = st.meta?.name ?? cfg?.name ?? id; + const url = cfg ? (cfg.type === 'http' ? cfg.url : `${cfg.host}:${cfg.port}`) : st.meta?.url ?? ''; + const portLike = isUr ? st.meta?.sourceLabel === 'PORT' : cfg?.type !== 'http'; + return { + id: numericId(id), + friendly_name: name, + url, + type: portLike ? 4 : 1, + status: st.status === 'up' ? 2 : st.status === 'down' ? 9 : 1, + interval: cfg?.interval ?? st.meta?.interval ?? DEFAULT_INTERVAL_SEC, + custom_uptime_ratio: [1, 7, 30, 90].map((d) => ratio(st, d).toFixed(3)).join('-'), + average_response_time: st.latency ?? 0, + response_times: (st.history ?? []).slice(-HISTORY_LIMIT).map((h) => ({ datetime: Math.floor(new Date(h.t).getTime() / 1000), value: h.ms })), + }; + }); + return { stat: 'ok', pagination: { offset: 0, limit: 50, total: monitors.length }, monitors }; +} + +// runtime 是持有器对象:热重载只更新其属性,服务器与巡检循环始终读到最新引用 +function createServer(runtime) { + return http.createServer(async (req, res) => { + const url = new URL(req.url, `http://${req.headers.host || 'localhost'}`); + const { config, state } = runtime; + try { + if (url.pathname === '/api/status') return sendJson(res, snapshot(runtime)); + if (url.pathname === '/api/monitors') return sendJson(res, config); + if (url.pathname === '/api/refresh') { + const decide = refreshDecision(config, req.socket.remoteAddress); + if (!decide.ok) { + // 只回错误码,不回显目标地址与内部细节 + return sendJson(res, { error: decide.error }, { + status: decide.status, + headers: decide.retryAfter ? { 'retry-after': String(decide.retryAfter) } : {}, + }); + } + // scope=external:只同步 UptimeRobot,不跑本地探测轮次(面板在「只看 UR」模式下用) + const scope = url.searchParams.get('scope'); + if (scope !== 'external') { + // 等本轮探测完成再返回快照,避免面板刷新后读到的仍是旧数据;上限兜底防止个别目标卡死请求 + await Promise.race([forceRound(runtime), new Promise((resolve) => setTimeout(resolve, FORCED_MAX_WAIT_MS))]); + } + // 顺带同步 UptimeRobot(至少间隔 60s,尊重其接口限流),让「只看 UR」模式下的刷新同样有意义; + // 再等 6s 上限,避免 UR 接口慢把整体刷新拖过面板超时 + await Promise.race([ + syncUptimeRobot(runtime, { minGapMs: UR_MIN_REFRESH_GAP_MS }), + new Promise((resolve) => setTimeout(resolve, 6000)), + ]); + // 浏览器中断请求(切页/关标签)是常态:等待期间连接可能已断开,此时不能再写响应 + if (res.writableEnded || res.destroyed) return; + return sendJson(res, snapshot(runtime)); + } + + // UptimeRobot 兼容的只读接口(GET/POST 均可):已有脚本/看板可直接消费本服务数据。 + // 不做鉴权,因为其暴露内容与公开面板一致;如需鉴权请在其前方加代理。 + if (url.pathname === '/api/v2/getMonitors' || url.pathname === '/v2/getMonitors') { + return sendJson(res, toUptimeRobotResponse(runtime)); + } + + let rel = decodeURIComponent(url.pathname); + if (rel === '/') rel = '/index.html'; + const file = path.join(PUBLIC_DIR, path.normalize(rel)); + if (!file.startsWith(PUBLIC_DIR)) { + res.writeHead(403); + return res.end('Forbidden'); + } + if (!fs.existsSync(file) || fs.statSync(file).isDirectory()) { + res.writeHead(404, { 'content-type': 'text/plain; charset=utf-8' }); + return res.end('Not Found'); + } + const ext = path.extname(file).toLowerCase(); + const live = rel === '/status.json' || rel === '/monitors.json'; + res.writeHead(200, { + 'content-type': MIME[ext] || 'application/octet-stream', + 'cache-control': live ? 'no-store' : 'public, max-age=300', + }); + fs.createReadStream(file).pipe(res); + } catch (err) { + try { + res.writeHead(500, { 'content-type': 'text/plain; charset=utf-8' }); + res.end('Internal Error'); + } catch { + // 连接已被对端关闭,忽略写入失败(避免未捕获异常终止探针进程) + } + } + }); +} + +async function main() { + const runtime = { + config: loadConfig(), + state: null, + dataUpdatedAt: Date.now(), + ur: { enabled: false, ok: null, error: null, lastSyncAt: null, count: 0, syncing: false, lastSyncMs: 0 }, + }; + if (DEMO) { + writeDemo(runtime.config); + return; + } + runtime.state = hydrate(runtime.config); + // 启用 UptimeRobot 时先同步一次,保证首次渲染就有异地探测数据 + await syncUptimeRobot(runtime); + + if (ONCE) { + await probeDue(runtime, true); + writeStatus(snapshot(runtime)); + const s = snapshot(runtime).stats; + console.log(`[once] 完成:共 ${s.total},在线 ${s.up},离线 ${s.down}`); + return; + } + + let reloadTimer = null; + fs.watch(ACTIVE_CONFIG_PATH, () => { + clearTimeout(reloadTimer); + reloadTimer = setTimeout(() => { + try { + const next = loadConfig(); + // 复用当前内存态恢复 history/daily;仅替换持有器属性,不再产生游离的旧引用 + runtime.state = hydrate(next, runtime.state); + runtime.config = next; + console.log('[config] monitors.json 已热重载'); + scheduleWrite(runtime); + } catch (err) { + console.error(`[config] 重载失败:${err.message}`); + } + }, 200); + }); + + setInterval(() => { + probeDue(runtime) + .then(() => scheduleWrite(runtime)) + .catch((err) => console.error(`[tick] ${err.stack || err}`)); + // UptimeRobot 按自身 pollIntervalSec 拉取,失败不影响本地巡检 + if (Date.now() - runtime.ur.lastSyncMs >= uptimeRobotConfig(runtime.config).pollIntervalSec * 1000) { + syncUptimeRobot(runtime) + .then(() => scheduleWrite(runtime)) + .catch(() => { /* syncUptimeRobot 内部已记录错误 */ }); + } + }, 1000); + + createServer(runtime).listen(PORT, () => { + console.log(`shiroko-monitor v${VERSION}`); + console.log(`面板: http://localhost:${PORT}/`); + console.log(`状态 API: http://localhost:${PORT}/api/status`); + console.log(`兼容接口: http://localhost:${PORT}/api/v2/getMonitors (UptimeRobot getMonitors 只读兼容)`); + console.log(`监控目标: ${runtime.config.monitors.length} 个自建探测${runtime.ur.enabled ? ` + ${runtime.ur.count} 个 UptimeRobot 监控` : ''}(配置热重载已启用)`); + }); +} + +// 直接执行(node index.js)时启动;被测试脚本 import 时不自动启动 +if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) main(); diff --git a/prober/node/lib/banner-probe.js b/prober/node/lib/banner-probe.js new file mode 100644 index 0000000..d2ddc08 --- /dev/null +++ b/prober/node/lib/banner-probe.js @@ -0,0 +1,64 @@ +import net from 'node:net'; + +// 协议族识别只用于生成「SSH 响应正常」这类摘要;版本号等细节默认不回显,避免写入公开的 status.json +const FAMILIES = [ + { re: /^SSH-\d/i, name: 'SSH' }, + { re: /^220[\s\S]*ESMTP/i, name: 'SMTP' }, + { re: /^220[\s\S]*FTP/i, name: 'FTP' }, + { re: /^\+OK/i, name: 'POP3' }, + { re: /^\* OK/i, name: 'IMAP' }, + { re: /^HTTP\/\d/i, name: 'HTTP' }, + { re: /^220\b/i, name: 'SMTP/TCP' }, +]; + +/** + * 被动 banner 探测:连接后仅读取服务端主动发送的标识串(RFC 4253 的 SSH banner 即此类), + * 不做认证、不发送任何数据、不执行任何命令——因此不会触发目标侧的登录失败计数或封禁。 + * 需要客户端先发字节的协议(Redis/MySQL)不适用,属于路线图内容。 + */ +export function probeBanner(monitor) { + const started = Date.now(); + const timeoutMs = (monitor.timeout ?? 10) * 1000; + const maxBytes = Math.max(32, Number(monitor.maxBannerBytes) || 512); + return new Promise((resolve) => { + const socket = net.createConnection({ host: monitor.host, port: monitor.port }); + let raw = ''; + let settled = false; + + const done = (status, detail) => { + if (settled) return; + settled = true; + socket.destroy(); + resolve({ status, latency: Date.now() - started, code: null, detail }); + }; + + const evaluate = () => { + const line = (raw.split(/\r?\n/)[0] ?? '').trim(); + const family = FAMILIES.find((f) => f.re.test(line))?.name ?? null; + if (monitor.expectBanner) { + let ok = false; + try { + ok = new RegExp(monitor.expectBanner, monitor.bannerFlags || 'i').test(line); + } catch { + return done('down', 'banner 规则无法编译(expectBanner 不是合法正则)'); + } + // 不匹配时只报告策略结果,不回显实际收到的标识串 + if (!ok) return done('down', '标识串与期望规则不符'); + } + const label = family ? `${family} 响应正常` : '收到服务标识串'; + return done('up', monitor.revealBanner ? `${label}:${line.slice(0, 80)}` : label); + }; + + socket.setTimeout(timeoutMs, () => done('down', '等待标识串超时')); + socket.once('error', (err) => + done('down', err.code === 'ECONNREFUSED' ? '连接被拒绝(端口关闭)' : (err.code || err.message)) + ); + // 对端发完就断开(无换行结尾)也算有效响应 + socket.once('end', () => (raw ? evaluate() : done('down', '连接被对端关闭且未发送标识串'))); + // 只在收到换行或达到字节上限时判定,避免把分包到达的标识串截断 + socket.on('data', (chunk) => { + raw += chunk.toString('latin1'); + if (/[\r\n]/.test(raw) || raw.length >= maxBytes) evaluate(); + }); + }); +} diff --git a/prober/node/lib/http-probe.js b/prober/node/lib/http-probe.js new file mode 100644 index 0000000..68db0e6 --- /dev/null +++ b/prober/node/lib/http-probe.js @@ -0,0 +1,31 @@ +const USER_AGENT = 'shiroko-monitor/0.2 (lightweight uptime panel)'; + +export async function probeHttp(monitor) { + const started = Date.now(); + const timeoutMs = (monitor.timeout ?? 10) * 1000; + try { + // redirect: manual —— 保留 3xx 原始状态码交给 expectStatus 判定,避免跟随重定向掩盖异常 + const res = await fetch(monitor.url, { + method: monitor.method || 'GET', + redirect: 'manual', + signal: AbortSignal.timeout(timeoutMs), + headers: { 'user-agent': USER_AGENT, accept: '*/*' }, + }); + const latency = Date.now() - started; + const expect = monitor.expectStatus ?? [200]; + const ok = expect.includes(res.status); + return { + status: ok ? 'up' : 'down', + latency, + code: res.status, + detail: ok ? `HTTP ${res.status}` : `HTTP ${res.status}(期望 ${expect.join('/')})`, + }; + } catch (err) { + const latency = Date.now() - started; + let detail; + if (err.name === 'TimeoutError') detail = `请求超时(>${timeoutMs / 1000}s)`; + else if (err.cause?.code) detail = err.cause.code; + else detail = err.message; + return { status: 'down', latency, code: 0, detail }; + } +} diff --git a/prober/node/lib/tcp-probe.js b/prober/node/lib/tcp-probe.js new file mode 100644 index 0000000..d85f992 --- /dev/null +++ b/prober/node/lib/tcp-probe.js @@ -0,0 +1,18 @@ +import net from 'node:net'; + +export function probeTcp(monitor) { + const started = Date.now(); + const timeoutMs = (monitor.timeout ?? 10) * 1000; + return new Promise((resolve) => { + const socket = net.createConnection({ host: monitor.host, port: monitor.port }); + const finish = (status, detail) => { + socket.destroy(); + resolve({ status, latency: Date.now() - started, code: null, detail }); + }; + socket.setTimeout(timeoutMs, () => finish('down', 'TCP 连接超时')); + socket.once('error', (err) => + finish('down', err.code === 'ECONNREFUSED' ? '连接被拒绝(端口关闭)' : (err.code || err.message)) + ); + socket.once('connect', () => finish('up', '端口可连接')); + }); +} diff --git a/prober/node/lib/uptimerobot.js b/prober/node/lib/uptimerobot.js new file mode 100644 index 0000000..b3283b8 --- /dev/null +++ b/prober/node/lib/uptimerobot.js @@ -0,0 +1,140 @@ +/** + * UptimeRobot 只读数据源(API v2) + * + * 作用:把 UptimeRobot 已有的监控结果接入本面板,作为「异地探测视角」与自建探针并列展示。 + * 只读:仅调用 getMonitors,不做任何写操作(暂停/编辑/删除),因此用 ur* 开头的只读 Key 即可。 + * + * 术语对齐(UptimeRobot v2): + * monitor.type 1=HTTP(s) 2=Keyword 3=Ping 4=Port + * monitor.status 0=暂停 1=未检测 2=正常 8/9=异常 + * logs[].type 1=故障 2=恢复 98=开始监控 99=暂停 + * logs[].reason { code: "403", detail: "Forbidden" } + * custom_uptime_ratio / custom_down_durations 按请求顺序以 '-' 分隔 + */ + +const API_URL = 'https://api.uptimerobot.com/v2/getMonitors'; +const HISTORY_LIMIT = 48; + +const TYPE_LABEL = { 1: 'HTTP', 2: 'KEYWORD', 3: 'PING', 4: 'PORT' }; + +// 暂停/未检测都归入 pending:否则会被误报成「离线」 +const STATUS_MAP = { 0: 'pending', 1: 'pending', 2: 'up', 8: 'down', 9: 'down' }; + +function splitNums(value) { + return String(value ?? '') + .split('-') + .map((v) => Number(v)) + .filter((v) => Number.isFinite(v)); +} + +function ratiosToObject(value, ratios) { + const nums = splitNums(value); + const out = {}; + ratios.forEach((r, i) => { + if (Number.isFinite(nums[i])) out[r] = nums[i]; + }); + return out; +} + +function targetOf(m) { + if (m.type === 4 && m.port) return `${m.url ? `${m.url}:` : ''}${m.port}`; + return m.url || ''; +} + +function latestDownReason(logs) { + const down = (logs ?? []).find((l) => l.type === 1); + const reason = down?.reason; + if (!reason) return null; + const code = String(reason.code ?? '').trim(); + const detail = String(reason.detail ?? '').trim(); + return { code: code || null, text: [code, detail].filter(Boolean).join(' ') || null }; +} + +/** + * 纯函数:把 UptimeRobot 的 getMonitors 响应映射成本探针的内部结构(可离线单测) + * @param {object} payload getMonitors 原始响应 + * @param {{group?: string, ratios?: number[], now?: number}} [options] + */ +export function mapUptimeRobotMonitors(payload, options = {}) { + const group = options.group || 'UptimeRobot'; + const ratios = options.ratios ?? [1, 7, 30, 90]; + const now = options.now ?? Date.now(); + const monitors = []; + + for (const m of payload?.monitors ?? []) { + const status = STATUS_MAP[m.status] ?? 'pending'; + const samples = Array.isArray(m.response_times) ? m.response_times : []; + const logs = Array.isArray(m.logs) ? m.logs : []; + // UR 侧的真实检测时刻:正常取最新响应样本,故障取最近一次故障日志 + const lastCheckSec = status === 'down' ? logs.find((l) => l.type === 1)?.datetime : samples[0]?.datetime; + const lastCheckIso = new Date((Number(lastCheckSec) || Math.floor(now / 1000)) * 1000).toISOString(); + + const history = samples + .slice(0, HISTORY_LIMIT) + .map((s) => ({ t: new Date(s.datetime * 1000).toISOString(), ok: Number(s.value) > 0, ms: Math.max(0, Number(s.value) || 0) })) + .reverse(); + if (status === 'down') history.push({ t: lastCheckIso, ok: false, ms: 0 }); + + const last = samples[0]?.value; + const avg = m.average_response_time; + const latency = Number.isFinite(Number(last)) && Number(last) > 0 + ? Math.round(Number(last)) + : Number.isFinite(Number(avg)) ? Math.round(Number(avg)) : null; + + const reason = latestDownReason(logs); + let detail; + if (status === 'up') detail = 'UptimeRobot:运行正常'; + else if (status === 'down') detail = `UptimeRobot:${reason?.text ?? '连接失败'}`; + else detail = m.status === 0 ? 'UptimeRobot:监控已暂停' : 'UptimeRobot:尚未检测'; + + monitors.push({ + id: `ur-${m.id}`, + name: m.friendly_name || `UptimeRobot #${m.id}`, + group, + type: 'ur', + url: targetOf(m), + // 与 UR 侧一致:编号、协议、检测间隔 + source: 'uptimerobot', + sourceId: m.id, + sourceType: m.type, + sourceLabel: TYPE_LABEL[m.type] ?? `TYPE${m.type}`, + interval: Number(m.interval) || 300, + status, + latency, + // UR 不直接给「当前 HTTP 状态码」,故障时取最近一次故障日志里的 code + code: status === 'down' && reason?.code ? Number(reason.code) || null : null, + detail, + lastCheckIso, + history, + uptimeRatios: ratiosToObject(m.custom_uptime_ratio, ratios), + downSeconds: ratiosToObject(m.custom_down_durations, ratios), + createDatetime: Number(m.create_datetime) || null, + }); + } + return monitors; +} + +export async function fetchUptimeRobotMonitors({ apiKey, timeoutMs = 15000, ratios = [1, 7, 30, 90] }) { + if (!apiKey) throw new Error('缺少 UptimeRobot API Key'); + const body = new URLSearchParams({ + api_key: apiKey, + format: 'json', + response_times: '1', + response_times_average: '30', + custom_uptime_ratios: ratios.join('-'), + logs: '1', + log_types: '1-2', + // 注意:custom_down_durations 不能作为请求参数传入(v2 会返回 invalid_parameter), + // 但响应中默认会带该字段,故 downSeconds 仍可解析 + }); + const res = await fetch(API_URL, { + method: 'POST', + headers: { 'content-type': 'application/x-www-form-urlencoded', accept: 'application/json' }, + body, + signal: AbortSignal.timeout(timeoutMs), + }); + if (!res.ok) throw new Error(`UptimeRobot HTTP ${res.status}`); + const payload = await res.json(); + if (payload.stat !== 'ok') throw new Error(`UptimeRobot 返回错误:${payload.error?.message || payload.error?.type || 'unknown'}`); + return mapUptimeRobotMonitors(payload, { ratios }); +} diff --git a/public/assets/app.js b/public/assets/app.js new file mode 100644 index 0000000..ab7f698 --- /dev/null +++ b/public/assets/app.js @@ -0,0 +1,778 @@ +const VERSION = '0.6.0'; +const HB_LIMIT = 48; +const UPTIME_DAYS = 90; +const BROWSER_CONCURRENCY = 6; +// 表格为默认视图(目标多时可一屏扫完);卡片视图保留给需要心率图细节的场景 +const VIEWS = { table: '表格', cards: '卡片' }; +const DEFAULT_VIEW = 'table'; +const DEFAULT_REFRESH_SEC = 30; +// 只看 UptimeRobot 时,其自身检测间隔就是 5 分钟,刷新再快也没有新数据 +const EXTERNAL_REFRESH_SEC = 300; + +const state = { + config: null, + status: null, + source: null, + filter: 'all', + view: 'cards', + refreshTimer: null, + nextRefreshAt: 0, + loading: false, + // 服务端未开放/拒绝强制探测时置位,后续刷新退回只读轮询,避免每轮都撞 403 + refreshDenied: false, +}; + +const $ = (id) => document.getElementById(id); + +const SOURCE_LABEL = { + api: '边缘 API(实时)', + static: '静态快照', + browser: '浏览器直连', +}; + +const ESC = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; +const escapeHtml = (s) => String(s ?? '').replace(/[&<>"']/g, (c) => ESC[c]); + +async function fetchJson(url, timeoutMs = 8000) { + const res = await fetch(url, { cache: 'no-store', signal: AbortSignal.timeout(timeoutMs) }); + if (!res.ok) { + const err = new Error(`HTTP ${res.status}`); + err.status = res.status; + throw err; + } + return res.json(); +} + +function fmtRelative(iso) { + if (!iso) return '–'; + const diff = Date.now() - new Date(iso).getTime(); + if (Number.isNaN(diff)) return '–'; + const s = Math.max(0, Math.round(diff / 1000)); + if (s < 10) return '刚刚'; + if (s < 60) return `${s} 秒前`; + const m = Math.floor(s / 60); + if (m < 60) return `${m} 分钟前`; + const h = Math.floor(m / 60); + if (h < 24) return `${h} 小时前`; + return `${Math.floor(h / 24)} 天前`; +} + +function fmtTime(iso) { + if (!iso) return '–'; + const d = new Date(iso); + return Number.isNaN(d.getTime()) ? '–' : d.toLocaleString('zh-CN', { hour12: false }); +} + +async function mapLimit(items, limit, fn) { + let idx = 0; + const workers = Array.from({ length: Math.min(limit, items.length) }, async () => { + while (idx < items.length) { + const i = idx++; + await fn(items[i], i); + } + }); + await Promise.all(workers); +} + +/* ---------- 数据源 ---------- */ + +function setSource(s) { + state.source = s; + $('source-badge').textContent = `数据源:${SOURCE_LABEL[s] ?? s}`; +} + +async function resolveSource() { + const forced = new URLSearchParams(location.search).get('source'); + const mode = forced || state.config.settings?.dataSource || 'auto'; + if (mode === 'browser') return setSource('browser'); + if (mode === 'static') { + try { + await fetchJson('status.json', 5000); + return setSource('static'); + } catch { + return setSource('browser'); + } + } + if (mode === 'api') { + try { + await fetchJson('api/status', 5000); + return setSource('api'); + } catch { + return setSource('browser'); + } + } + // auto:优先边缘 API,其次静态快照,最后浏览器直连 + try { + await fetchJson('api/status', 3000); + return setSource('api'); + } catch { /* 无边缘 API */ } + try { + await fetchJson('status.json', 3000); + return setSource('static'); + } catch { /* 无静态快照 */ } + return setSource('browser'); +} + +/* ---------- 浏览器直连探测 ---------- */ + +async function probeBrowserOne(m) { + const started = Date.now(); + const timeoutMs = (m.timeout ?? 10) * 1000; + if (m.type === 'tcp') { + // 浏览器无原始 TCP 能力,以 HTTP 连接行为近似:快速拒绝=端口关闭;超时无响应=端口开放但非 HTTP 服务(启发式) + const t = Math.min(timeoutMs, 4000); + try { + await fetch(`http://${m.host}:${m.port}/`, { mode: 'no-cors', cache: 'no-store', signal: AbortSignal.timeout(t) }); + return { status: 'up', latency: Date.now() - started, code: null, detail: `端口 ${m.port} 可连接(启发式)` }; + } catch (err) { + if (err.name === 'TimeoutError') { + return { status: 'up', latency: Date.now() - started, code: null, detail: `端口 ${m.port} 开放(无 HTTP 响应,启发式)` }; + } + return { status: 'down', latency: Date.now() - started, code: null, detail: '端口不可连接(或被防火墙拒绝)' }; + } + } + // 先尝试 cors 模式读取真实状态码;目标未开放跨域时降级为 no-cors 仅判断可达性 + try { + const res = await fetch(m.url, { + method: m.method || 'GET', + mode: 'cors', + redirect: 'manual', + cache: 'no-store', + signal: AbortSignal.timeout(timeoutMs), + }); + const expect = m.expectStatus ?? [200]; + const ok = expect.includes(res.status); + return { + status: ok ? 'up' : 'down', + latency: Date.now() - started, + code: res.status, + detail: ok ? `HTTP ${res.status}` : `HTTP ${res.status}(期望 ${expect.join('/')})`, + }; + } catch { /* 跨域被拒或网络不可达,降级 */ } + try { + await fetch(m.url, { mode: 'no-cors', cache: 'no-store', signal: AbortSignal.timeout(timeoutMs) }); + return { status: 'up', latency: Date.now() - started, code: null, detail: '跨域可达(浏览器模式无法读取状态码)' }; + } catch (err) { + return { status: 'down', latency: Date.now() - started, code: null, detail: err.name === 'TimeoutError' ? '请求超时' : '不可达' }; + } +} + +async function probeFromBrowser(config) { + const monitors = {}; + let up = 0; + let down = 0; + let latencySum = 0; + await mapLimit(config.monitors, BROWSER_CONCURRENCY, async (m) => { + const r = await probeBrowserOne(m); + if (r.status === 'up') { up++; latencySum += r.latency; } else { down++; } + monitors[m.id] = { ...r, lastCheck: new Date().toISOString(), history: [] }; + }); + return { + prober: 'shiroko-monitor-browser', + demo: false, + generatedAt: new Date().toISOString(), + stats: { total: config.monitors.length, up, down, pending: 0, avgLatency: up ? Math.round(latencySum / up) : null }, + monitors, + }; +} + +/* ---------- 渲染 ---------- */ + +function heartbeatSvg(history) { + const pts = (history ?? []).slice(-HB_LIMIT); + if (!pts.length) return '

暂无历史数据
'; + const w = 100; + const h = 30; + const max = Math.max(...pts.map((p) => p.ms || 0), 1); + const bw = w / pts.length; + const bars = pts.map((p, i) => { + const bh = p.ok ? Math.max(2, (p.ms / max) * (h - 2)) : 2; + const color = p.ok ? 'var(--up)' : 'var(--down)'; + const tip = `${fmtTime(p.t)} · ${p.ok ? `在线 ${p.ms}ms` : '离线'}`; + return `${escapeHtml(tip)}`; + }).join(''); + return `${bars}`; +} + +function statusText(st) { + if (!st || st.status === 'pending') return { label: '等待检测', cls: 'pending' }; + return st.status === 'up' ? { label: '在线', cls: 'up' } : { label: '离线', cls: 'down' }; +} + +function lastNDays(n) { + const out = []; + const now = new Date(); + const p = (x) => String(x).padStart(2, '0'); + for (let i = n - 1; i >= 0; i--) { + const d = new Date(now.getFullYear(), now.getMonth(), now.getDate() - i); + out.push(`${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`); + } + return out; +} + +function uptimeSummary(st) { + const daily = st?.daily ?? {}; + let total = 0; + let up = 0; + for (const k of Object.keys(daily)) { + total += daily[k].total ?? 0; + up += daily[k].up ?? 0; + } + if (total) return { pct: (up / total) * 100, total, up, days: Object.keys(daily).length, source: 'local' }; + // 没有逐日数据时回退到数据源提供的官方聚合比率(UptimeRobot 镜像目标自带 90 天可用率) + const provided = Number(st?.uptimeRatios?.[90]); + if (Number.isFinite(provided)) return { pct: provided, total: 0, up: 0, days: 90, source: 'external' }; + return null; +} + +function uptimeBar(st) { + const daily = st?.daily; + const cells = lastNDays(UPTIME_DAYS).map((key) => { + const b = daily?.[key]; + let cls = 'lv-none'; + let tip = `${key} · 无数据`; + if (b && b.total > 0) { + const pct = (b.up / b.total) * 100; + cls = pct >= 99 ? 'lv-ok' : pct >= 95 ? 'lv-warn' : 'lv-bad'; + tip = `${key} · 可用率 ${pct.toFixed(1)}%(${b.up}/${b.total} 次)`; + } + return ``; + }).join(''); + const s = uptimeSummary(st); + const label = s ? `90天 ${s.pct.toFixed(1)}%` : '90天 —'; + let labelTip; + if (!s) labelTip = '可用率数据积累中(探针需持续运行)'; + else if (s.source === 'external') labelTip = `由数据源提供(UptimeRobot 官方 90 天可用率);逐日色条由本探针同步后累积`; + else labelTip = `按已积累的 ${s.days} 天统计:${s.up}/${s.total} 次在线`; + return `
${cells}
${label}
`; +} + +function hideTargets() { + return state.config?.settings?.hideTargets === true; +} + +function targetText(m) { + if (hideTargets()) return '已隐藏'; + if (m.url) return m.url; + if (m.host) return m.port ? `${m.host}:${m.port}` : m.host; + return '—'; +} + +function typeLabel(m) { + // 外部数据源(UptimeRobot)标注来源与协议,便于与自建探测区分 + if (isExternal(m)) return `UR·${m.sourceLabel ?? ''}`.replace(/·$/, ''); + if (m.type === 'tcp') return 'TCP'; + if (m.type === 'banner') return String(m.protocol || 'BANNER').toUpperCase(); + return m.method || 'GET'; +} + +function resultText(st, m) { + if (st?.code != null) return String(st.code); + if (isExternal(m)) return '–'; + if (m.type === 'tcp') return '端口'; + if (m.type === 'banner') return '标识串'; + return '–'; +} + +function renderCard(m) { + const st = state.status?.monitors?.[m.id]; + const s = statusText(st); + const card = document.createElement('article'); + card.className = 'card'; + card.dataset.status = s.cls; + card.dataset.id = m.id; + + const head = document.createElement('div'); + head.className = 'card-head'; + head.innerHTML = `

${escapeHtml(m.name)}

${escapeHtml(typeLabel(m))}`; + + const target = document.createElement('div'); + target.className = 'card-target'; + target.title = targetText(m); + target.textContent = targetText(m); + + const metrics = document.createElement('div'); + metrics.className = 'metrics'; + // 外部数据源只有「最近一次状态变更」时间,语义与自建探测的「最近检测」不同,tooltip 里说明 + const checkTitle = isExternal(m) && st?.lastCheck + ? `UptimeRobot 最近一次状态变更:${fmtTime(st.lastCheck)}` + : fmtTime(st?.lastCheck); + metrics.innerHTML = + `
${st?.latency != null ? `${st.latency} ms` : '–'}
` + + `
${escapeHtml(resultText(st, m))}
` + + `
${fmtRelative(st?.lastCheck)}
`; + + const hb = document.createElement('div'); + hb.className = 'heartbeat'; + hb.innerHTML = heartbeatSvg(st?.history); + + const up = document.createElement('div'); + up.innerHTML = uptimeBar(st); + + const detail = document.createElement('div'); + detail.className = 'card-detail'; + detail.title = st?.detail ?? ''; + detail.textContent = st?.detail ?? '等待检测'; + + card.append(head, target, metrics, hb, up.firstElementChild ?? document.createElement('div'), detail); + return card; +} + +function groupMonitors(monitors) { + const groups = new Map(); + for (const m of monitors) { + const g = m.group || '未分组'; + if (!groups.has(g)) groups.set(g, []); + groups.get(g).push(m); + } + return groups; +} + +// 面板展示的目标 = 配置文件里的自建目标 + 快照中带 meta 的外部数据源目标(如 UptimeRobot), +// 过滤优先级:URL ?filter= > 快照 dataFilter(服务端口径,私有配置覆盖后仍一致)> 配置 settings.dataFilter +function dataFilter() { + const q = new URLSearchParams(location.search).get('filter'); + if (['both', 'config', 'uptimerobot'].includes(q)) return q; + const f = state.status?.dataFilter ?? state.config?.settings?.dataFilter; + return ['both', 'config', 'uptimerobot'].includes(f) ? f : 'both'; +} + +function allMonitors() { + const filter = dataFilter(); + const cfg = state.config?.monitors ?? []; + const out = filter === 'uptimerobot' ? [] : [...cfg]; + if (filter === 'config') return out; + const known = new Set(cfg.map((m) => m.id)); + for (const [id, st] of Object.entries(state.status?.monitors ?? {})) { + if (known.has(id) || !st?.meta) continue; + out.push({ id, ...st.meta }); + } + return out; +} + +function isExternal(m) { + return m.source === 'uptimerobot'; +} + +function renderTabs() { + const nav = $('group-tabs'); + const monitors = allMonitors(); + const groups = groupMonitors(monitors); + nav.innerHTML = ''; + const all = document.createElement('button'); + all.type = 'button'; + all.className = `tab${state.filter === 'all' ? ' active' : ''}`; + all.textContent = `全部 ${monitors.length}`; + all.addEventListener('click', () => setFilter('all')); + nav.appendChild(all); + for (const [g, list] of groups) { + const btn = document.createElement('button'); + btn.type = 'button'; + btn.className = `tab${state.filter === g ? ' active' : ''}`; + btn.textContent = `${g} ${list.length}`; + btn.addEventListener('click', () => setFilter(g)); + nav.appendChild(btn); + } +} + +function setFilter(g) { + state.filter = g; + renderTabs(); + renderView(); +} + +function visibleGroups() { + const all = [...groupMonitors(allMonitors())]; + return state.filter === 'all' ? all : all.filter(([g]) => g === state.filter); +} + +/* ---------- 视图:卡片 / 表格 / 大屏 / 极简 ---------- */ + +// 展示过滤(URL ?filter=)与服务端快照的 dataFilter 不一致时,被过滤出来的目标不在快照里, +// 会整页显示「等待检测」——这里给出明确解释,避免看起来像故障 +function renderFilterNotice(container) { + const snapMonitors = state.status?.monitors ?? {}; + const shown = allMonitors(); + const missing = shown.filter((m) => !snapMonitors[m.id]).length; + const serverFilter = state.status?.dataFilter; + if (!missing || !shown.length || !serverFilter || serverFilter === dataFilter()) return; + const el = document.createElement('div'); + el.className = 'notice'; + el.innerHTML = + `当前展示过滤为 ${escapeHtml(dataFilter())},但服务端快照的 dataFilter 为 ${escapeHtml(serverFilter)}:其中 ${missing} 个目标不在快照中,因此显示为「等待检测」。` + + `如需一致,请把 settings.dataFilter 设为相同值,或去掉地址栏里的 ?filter= 参数。`; + container.appendChild(el); +} + +function renderView() { + const grid = $('monitor-grid'); + grid.innerHTML = ''; + document.body.dataset.view = state.view; + if (!allMonitors().length) { + grid.innerHTML = '
当前数据源下没有可展示的监控目标。
'; + return; + } + renderFilterNotice(grid); + ({ table: renderTableView, cards: renderCardsView }[state.view] ?? renderTableView)(grid); +} + +function renderCardsView(container) { + const groups = visibleGroups(); + for (const [g, list] of groups) { + if (groups.length > 1) container.appendChild(groupTitle(g)); + for (const m of list) container.appendChild(renderCard(m)); + } +} + +function groupTitle(text) { + const h = document.createElement('h2'); + h.className = 'group-title'; + h.textContent = text; + return h; +} + +function renderTableView(container) { + const hide = hideTargets(); + const wrap = document.createElement('div'); + wrap.className = 'table-wrap'; + const table = document.createElement('table'); + table.className = 'monitor-table'; + const thead = document.createElement('thead'); + thead.innerHTML = `状态服务${hide ? '' : '目标'}延迟结果最近检测心率(48 次)90 天可用率`; + const tbody = document.createElement('tbody'); + const groups = visibleGroups(); + for (const [g, list] of groups) { + if (groups.length > 1) { + const tr = document.createElement('tr'); + tr.className = 'group-row'; + const td = document.createElement('td'); + td.colSpan = hide ? 7 : 8; + td.textContent = g; + tr.appendChild(td); + tbody.appendChild(tr); + } + for (const m of list) tbody.appendChild(tableRow(m, hide)); + } + table.append(thead, tbody); + wrap.appendChild(table); + container.appendChild(wrap); +} + +function tableRow(m, hide) { + const st = state.status?.monitors?.[m.id]; + const s = statusText(st); + const up = uptimeSummary(st); + const tr = document.createElement('tr'); + tr.dataset.status = s.cls; + tr.dataset.id = m.id; + const targetCell = hide ? '' : `${escapeHtml(targetText(m))}`; + tr.innerHTML = + `${s.label}` + + `${escapeHtml(m.name)}${escapeHtml(typeLabel(m))}` + + targetCell + + `${st?.latency != null ? `${st.latency} ms` : '–'}` + + `${escapeHtml(resultText(st, m))}` + + `${fmtRelative(st?.lastCheck)}` + + `${heartbeatSvg(st?.history)}` + + `${up ? `${miniUptimeBar(st?.daily)}${up.pct.toFixed(1)}%` : '–'}`; + return tr; +} + +function miniUptimeBar(daily) { + const cells = lastNDays(UPTIME_DAYS).map((key) => { + const b = daily?.[key]; + let cls = 'lv-none'; + if (b && b.total > 0) { + const pct = (b.up / b.total) * 100; + cls = pct >= 99 ? 'lv-ok' : pct >= 95 ? 'lv-warn' : 'lv-bad'; + } + return ``; + }).join(''); + return `${cells}`; +} + +function renderViewSwitch() { + const box = $('view-switch'); + if (!box) return; + box.innerHTML = ''; + for (const [key, label] of Object.entries(VIEWS)) { + const btn = document.createElement('button'); + btn.type = 'button'; + btn.className = `view-btn${state.view === key ? ' active' : ''}`; + btn.textContent = label; + btn.title = `${label}视图`; + btn.addEventListener('click', () => setView(key)); + box.appendChild(btn); + } +} + +function resolveView() { + const q = new URLSearchParams(location.search).get('view'); + let saved = null; + try { + saved = localStorage.getItem('shiroko.view'); + } catch { /* 隐私模式下 localStorage 不可用 */ } + const cfg = state.config?.settings?.view; + return [q, saved, cfg, DEFAULT_VIEW].find((v) => v && VIEWS[v]) ?? DEFAULT_VIEW; +} + +function setView(view, { persist = true } = {}) { + state.view = VIEWS[view] ? view : 'cards'; + if (persist) { + try { + localStorage.setItem('shiroko.view', state.view); + } catch { /* 忽略存储失败 */ } + } + renderViewSwitch(); + renderView(); +} + +// 顶部汇总按「当前实际展示的目标」计算:URL ?filter= 覆盖服务端口径时,统计也不会与列表不一致 +function localStats() { + const monitors = allMonitors(); + let up = 0; + let down = 0; + let pending = 0; + let latSum = 0; + let latCount = 0; + let uptimeUp = 0; + let uptimeTotal = 0; + for (const m of monitors) { + const st = state.status?.monitors?.[m.id]; + if (!st || st.status === 'pending') { + pending++; + continue; + } + if (st.status === 'up') up++; + else down++; + // 与探针口径一致:平均延迟只统计自建探测目标 + if (!isExternal(m) && st.latency != null) { + latSum += st.latency; + latCount++; + } + const s = uptimeSummary(st); + if (s) { + uptimeTotal += s.total; + uptimeUp += s.up; + } + } + return { + total: monitors.length, + up, + down, + pending, + avgLatency: latCount ? Math.round(latSum / latCount) : null, + avgUptime90: uptimeTotal ? Math.round((uptimeUp / uptimeTotal) * 1000) / 10 : null, + }; +} + +function renderSummary() { + const st = state.status; + const stats = localStats(); + const down = stats.down; + const pending = stats.pending; + const pill = $('overall-pill'); + pill.className = 'pill'; + if (!st) pill.textContent = '检测中…'; + else if (!stats.total) { + pill.classList.add('pending'); + pill.textContent = '无展示目标'; + } else if (down > 0) { + pill.classList.add('bad'); + pill.textContent = `${down} 个服务异常`; + } else if (pending > 0) { + pill.classList.add('pending'); + pill.textContent = '检测中…'; + } else { + pill.classList.add('ok'); + pill.textContent = '全部服务正常'; + } + $('stat-total').textContent = stats.total; + $('stat-up').textContent = stats.up; + $('stat-down').textContent = stats.down; + $('stat-latency').textContent = stats.avgLatency != null ? `${stats.avgLatency} ms` : '–'; + $('stat-uptime').textContent = stats.avgUptime90 != null ? `${stats.avgUptime90}%` : '–'; + // 展示「数据最后更新时刻」(服务端产出新数据的时间)而非快照生成时间:后者每次请求都变,无法反映新鲜度 + const updatedMs = dataUpdatedMs(); + $('updated-at').textContent = updatedMs ? `数据更新于 ${fmtTime(state.status?.dataUpdatedAt)}` : '数据更新于 –'; + $('updated-at').title = updatedMs + ? `服务端数据最后变更:${fmtTime(state.status?.dataUpdatedAt)}(距现在 ${fmtRelative(state.status?.dataUpdatedAt)})\n快照生成:${fmtTime(st?.generatedAt)}\n服务端更新节奏:每 ${serverCadenceSec() ?? '—'} 秒` + : '尚无服务端数据'; + $('demo-chip').hidden = !st?.demo; + const ur = st?.sources?.uptimerobot; + const urChip = $('ur-chip'); + if (urChip) { + urChip.hidden = !(ur?.enabled && ur.ok === false); + if (!urChip.hidden) urChip.title = `UptimeRobot 同步失败:${ur.error ?? '未知错误'}(保留上次数据,目标状态未被误判)`; + } +} + +function renderAll() { + renderSummary(); + renderTabs(); + renderViewSwitch(); + renderView(); +} + +function renderError(err) { + const grid = $('monitor-grid'); + grid.innerHTML = `
数据加载失败:${escapeHtml(err.message)}
请检查 monitors.json 与数据源配置。
`; +} + +/* ---------- 刷新循环 ---------- */ + +function refreshIntervalSec() { + const configured = Number(state.config?.settings?.refreshInterval); + if (Number.isFinite(configured) && configured > 0) return Math.max(5, configured); + // 未显式配置时:只看 UptimeRobot 的话,其自身 5 分钟才更新一次,刷新更快没有意义 + return dataFilter() === 'uptimerobot' ? EXTERNAL_REFRESH_SEC : DEFAULT_REFRESH_SEC; +} + +// 服务端产出新数据的节奏(秒),由快照提供;浏览器直连模式没有服务端节奏 +function serverCadenceSec() { + const n = Number(state.status?.updateIntervalSec); + return Number.isFinite(n) && n > 0 ? n : null; +} + +function dataUpdatedMs() { + const t = state.status?.dataUpdatedAt ? new Date(state.status.dataUpdatedAt).getTime() : 0; + return Number.isFinite(t) ? t : 0; +} + +// 服务端数据是否已明显过期(超过 1.5 个周期没更新,例如探针刚启动或被休眠过) +function isDataStale() { + const cadence = serverCadenceSec(); + const updated = dataUpdatedMs(); + if (!cadence || !updated) return false; + return Date.now() - updated > cadence * 1500; +} + +// 下一次检查的间隔:api 模式下对齐「服务端上次更新 + 一个周期」,refreshInterval 只作为上限; +// 静态快照与浏览器直连没有可对齐的服务端节奏,直接按 refreshInterval 轮询 +function nextCheckInSec() { + const cap = refreshIntervalSec(); + const cadence = serverCadenceSec(); + const updated = dataUpdatedMs(); + if (state.source !== 'api' || !cadence || !updated) return cap; + const left = Math.round((updated + cadence * 1000 - Date.now()) / 1000); + if (left <= 0) return Math.min(cap, Math.max(5, cadence)); // 已过预期更新时刻:稍后重试 + return Math.max(5, Math.min(left, cap)); +} + +// 强制检测需等待各目标探测返回(含超时目标,服务端另有 22s 兜底),故用更宽松的超时 +const REFRESH_TIMEOUT_MS = 30000; + +function setLoading(on, text = '刷新中…') { + state.loading = on; + const btn = $('refresh-btn'); + btn.disabled = on; + btn.textContent = on ? text : '刷新'; +} + +async function refresh({ force = false } = {}) { + if (state.loading) return; + // 自动刷新只读取服务端已产出的数据(探测由服务端按各自 interval 持续驱动,不因访客而变); + // 仅两种情况触发重新检测:① 手动点击刷新 ② 服务端数据明显过期时自愈一次 + const recheck = state.source === 'api' && !state.refreshDenied && (force || isDataStale()); + setLoading(true, recheck ? '检测中…' : '刷新中…'); + try { + if (state.source === 'browser') { + state.status = await probeFromBrowser(state.config); + } else if (state.source === 'api') { + if (recheck) { + // 首次加载:先用服务端已有快照立即出图,避免强制检测(含超时目标,可能十几秒)期间显示空白面板 + if (!state.status) { + try { + state.status = await fetchJson('api/status'); + renderAll(); + } catch { /* 拿不到旧快照就继续等强制检测结果 */ } + } + try { + // 只看 UptimeRobot 时不需要跑本地探测轮次,只同步 UR 数据 + const scope = dataFilter() === 'uptimerobot' ? '?scope=external' : ''; + state.status = await fetchJson(`api/refresh${scope}`, REFRESH_TIMEOUT_MS); + } catch (err) { + // 服务端未开放强制探测(403/401)→ 本次会话退回只读轮询;限流(429)→ 仅是这一轮降级 + if (err.status === 403 || err.status === 401) markRefreshDenied(); + else if (err.status === 429) $('refresh-btn').title = '刷新过于频繁,已显示最近一次数据(服务端限流保护)'; + else throw err; + state.status = await fetchJson('api/status'); + } + } else { + state.status = await fetchJson('api/status'); + } + } else { + state.status = await fetchJson('status.json'); + } + renderAll(); + } catch (err) { + if (state.source !== 'browser') { + // 数据源失效(如静态部署缺少 status.json)时降级为浏览器直连 + setSource('browser'); + setLoading(false); + return refresh({ force }); + } + renderError(err); + } finally { + setLoading(false); + resetCountdown(); + } +} + +function markRefreshDenied() { + if (state.refreshDenied) return; + state.refreshDenied = true; + const btn = $('refresh-btn'); + btn.title = '服务端未开放「重新检测」,刷新仅重新读取最新数据'; + $('source-badge').textContent = `${SOURCE_LABEL[state.source]}(只读)`; +} + +function resetCountdown() { + state.nextRefreshAt = Date.now() + nextCheckInSec() * 1000; + updateCountdownText(); +} + +function updateCountdownText() { + const left = Math.max(0, Math.round((state.nextRefreshAt - Date.now()) / 1000)); + $('countdown').textContent = `下次检查 ${left}s`; + $('countdown').title = '自动刷新只读取服务端已产出的数据,节奏对齐服务端的更新时间;点击「刷新」可立即重新检测'; +} + +function startAutoRefresh() { + clearInterval(state.refreshTimer); + resetCountdown(); + state.refreshTimer = setInterval(() => { + // 以截止时间计算剩余秒数,而非累加 tick:浏览器对后台标签页会节流定时器,计数法会导致刷新严重滞后 + if (Date.now() >= state.nextRefreshAt) refresh(); + else updateCountdownText(); + }, 1000); +} + +function bindEvents() { + // 只有手动点「刷新」才会触发一次重新检测;自动刷新是只读的 + $('refresh-btn').addEventListener('click', () => refresh({ force: true })); +} + +/* ---------- 启动 ---------- */ + +async function init() { + try { + state.config = await fetchJson('monitors.json'); + } catch (err) { + renderError(err); + return; + } + document.title = state.config.settings?.title || 'Shiroko Monitor'; + $('site-title').textContent = state.config.settings?.title || 'Shiroko Monitor'; + $('site-desc').textContent = state.config.settings?.description || ''; + const versionEl = document.querySelector('.version'); + if (versionEl) versionEl.textContent = `shiroko-monitor v${VERSION}`; + await resolveSource(); + state.view = resolveView(); + bindEvents(); + renderAll(); + await refresh(); + startAutoRefresh(); +} + +init(); diff --git a/public/assets/favicon.svg b/public/assets/favicon.svg new file mode 100644 index 0000000..07fdb56 --- /dev/null +++ b/public/assets/favicon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/style.css b/public/assets/style.css new file mode 100644 index 0000000..1d51685 --- /dev/null +++ b/public/assets/style.css @@ -0,0 +1,356 @@ +:root { + --bg: #f5f6f8; + --surface: #ffffff; + --border: #e5e7eb; + --text: #111827; + --text-2: #6b7280; + --up: #16a34a; + --up-bg: #f0fdf4; + --down: #dc2626; + --down-bg: #fef2f2; + --pending: #d97706; + --pending-bg: #fffbeb; + --accent: #2563eb; + --uptime-ok: #16a34a; + --uptime-warn: #f59e0b; + --uptime-bad: #dc2626; + --uptime-none: #e5e7eb; + --mono: ui-monospace, SFMono-Regular, "Cascadia Code", Consolas, "Courier New", monospace; + --sans: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif; + --shadow: 0 1px 2px rgb(0 0 0 / 0.04); +} + +@media (prefers-color-scheme: dark) { + :root { + --bg: #0f1115; + --surface: #171a21; + --border: #2a2f3a; + --text: #e5e7eb; + --text-2: #9ca3af; + --up: #4ade80; + --up-bg: #10281c; + --down: #f87171; + --down-bg: #2a1517; + --pending: #fbbf24; + --pending-bg: #2a2113; + --accent: #60a5fa; + --uptime-none: #2a2f3a; + --shadow: none; + } +} + +* { box-sizing: border-box; } + +html { -webkit-text-size-adjust: 100%; } + +body { + margin: 0; + background: var(--bg); + color: var(--text); + font-family: var(--sans); + font-size: 14px; + line-height: 1.5; +} + +/* ---------- 顶栏 ---------- */ +.topbar { + position: sticky; + top: 0; + z-index: 10; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + gap: 12px 20px; + padding: 12px 20px; + background: var(--surface); + border-bottom: 1px solid var(--border); + box-shadow: var(--shadow); +} + +.brand { display: flex; align-items: center; gap: 10px; min-width: 0; } + +.logo { + width: 26px; + height: 26px; + flex: none; + border-radius: 50%; + background: var(--up); + box-shadow: 0 0 0 4px color-mix(in srgb, var(--up) 18%, transparent); + animation: pulse 2.4s ease-out infinite; +} + +@keyframes pulse { + 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--up) 30%, transparent); } + 70% { box-shadow: 0 0 0 7px color-mix(in srgb, var(--up) 0%, transparent); } + 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--up) 0%, transparent); } +} + +.brand-text { min-width: 0; } +.brand-text h1 { margin: 0; font-size: 15px; font-weight: 650; white-space: nowrap; } +.brand-text p { margin: 0; font-size: 12px; color: var(--text-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } + +.summary { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 16px; } + +.pill { + padding: 4px 12px; + border-radius: 999px; + font-size: 13px; + font-weight: 650; + white-space: nowrap; +} +.pill.ok { background: var(--up-bg); color: var(--up); } +.pill.bad { background: var(--down-bg); color: var(--down); } +.pill.pending { background: var(--pending-bg); color: var(--pending); } + +.stat { text-align: center; min-width: 44px; } +.stat b { display: block; font-size: 16px; font-weight: 700; font-variant-numeric: tabular-nums; } +.stat label { font-size: 11px; color: var(--text-2); } +.stat-up b { color: var(--up); } +.stat-down b { color: var(--down); } + +#refresh-btn { + padding: 6px 14px; + border: 1px solid var(--border); + border-radius: 8px; + background: var(--surface); + color: var(--text); + font-size: 13px; + font-family: var(--sans); + cursor: pointer; + transition: background 0.15s; +} +#refresh-btn:hover { background: var(--bg); } +#refresh-btn:disabled { opacity: 0.6; cursor: default; } + +/* ---------- 视图切换 ---------- */ +.view-switch { display: flex; border: 1px solid var(--border); border-radius: 8px; overflow: hidden; } +.view-btn { + padding: 5px 10px; + border: 0; + background: var(--surface); + color: var(--text-2); + font-size: 12px; + font-family: var(--sans); + cursor: pointer; + transition: background 0.15s, color 0.15s; +} +.view-btn + .view-btn { border-left: 1px solid var(--border); } +.view-btn:hover { color: var(--text); } +.view-btn.active { background: var(--accent); color: #fff; } + +/* ---------- 分组页签 ---------- */ +.group-tabs { + display: flex; + flex-wrap: wrap; + gap: 8px; + max-width: 1200px; + margin: 0 auto; + padding: 16px 20px 0; +} + +.tab { + padding: 5px 14px; + border: 1px solid var(--border); + border-radius: 999px; + background: var(--surface); + color: var(--text-2); + font-size: 13px; + font-family: var(--sans); + cursor: pointer; + transition: all 0.15s; +} +.tab:hover { color: var(--text); } +.tab.active { background: var(--accent); border-color: var(--accent); color: #fff; } + +/* ---------- 卡片网格 ---------- */ +.grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + gap: 14px; + max-width: 1200px; + margin: 0 auto; + padding: 16px 20px 8px; +} + +.group-title { + grid-column: 1 / -1; + margin: 8px 0 0; + font-size: 13px; + font-weight: 650; + color: var(--text-2); +} + +.card { + display: flex; + flex-direction: column; + gap: 10px; + padding: 14px 16px; + background: var(--surface); + border: 1px solid var(--border); + border-left: 3px solid var(--pending); + border-radius: 12px; + box-shadow: var(--shadow); +} +.card[data-status="up"] { border-left-color: var(--up); } +.card[data-status="down"] { border-left-color: var(--down); } + +.card-head { display: flex; align-items: center; gap: 8px; min-width: 0; } +.card-head h3 { flex: 1; margin: 0; font-size: 14px; font-weight: 650; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } + +.dot { width: 10px; height: 10px; flex: none; border-radius: 50%; background: var(--pending); } +/* 通用着色:卡片 / 表格行 / 极简列表 都以 data-status 标记状态 */ +[data-status="up"] .dot { background: var(--up); } +[data-status="down"] .dot { background: var(--down); } +[data-status="pending"] .dot { background: var(--pending); } +.card[data-status="up"] .dot { animation: pulse-dot 2.4s ease-out infinite; } + +@keyframes pulse-dot { + 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--up) 35%, transparent); } + 70% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--up) 0%, transparent); } + 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--up) 0%, transparent); } +} + +.type-badge { + flex: none; + padding: 1px 7px; + border: 1px solid var(--border); + border-radius: 6px; + font-family: var(--mono); + font-size: 11px; + color: var(--text-2); +} + +.card-target { + font-family: var(--mono); + font-size: 12px; + color: var(--text-2); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.metrics { display: flex; gap: 8px; } +.metric { flex: 1; min-width: 0; } +.metric b { display: block; font-size: 14px; font-weight: 700; font-variant-numeric: tabular-nums; white-space: nowrap; } +.metric label { font-size: 11px; color: var(--text-2); } + +.heartbeat { height: 32px; } +.heartbeat svg { display: block; width: 100%; height: 100%; } +.hb-empty { display: flex; align-items: center; height: 100%; font-size: 12px; color: var(--text-2); } + +/* 90 天可用率 */ +.uptime { display: flex; align-items: center; gap: 8px; } +.uptime-bar { display: flex; gap: 1px; flex: 1; min-width: 0; height: 10px; } +.uptime-cell { flex: 1; min-width: 0; border-radius: 1px; background: var(--uptime-none); } +.uptime-cell.lv-ok { background: var(--uptime-ok); } +.uptime-cell.lv-warn { background: var(--uptime-warn); } +.uptime-cell.lv-bad { background: var(--uptime-bad); } +.uptime-label { font-size: 11px; color: var(--text-2); white-space: nowrap; font-variant-numeric: tabular-nums; } + +.card-detail { + font-family: var(--mono); + font-size: 12px; + color: var(--text-2); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.card[data-status="down"] .card-detail { color: var(--down); } + +.empty { + grid-column: 1 / -1; + padding: 60px 0; + text-align: center; + color: var(--text-2); +} + +/* 过滤口径不一致时的提示条 */ +.notice { + grid-column: 1 / -1; + margin-bottom: 10px; + padding: 10px 14px; + border: 1px solid color-mix(in srgb, var(--pending) 45%, var(--border)); + border-radius: 10px; + background: var(--pending-bg); + color: var(--pending); + font-size: 12px; + line-height: 1.7; +} +.notice code { font-family: var(--mono); background: color-mix(in srgb, var(--pending) 14%, transparent); padding: 0 4px; border-radius: 4px; } + +/* ---------- 底栏 ---------- */ +.footer { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 6px 16px; + max-width: 1200px; + margin: 0 auto; + padding: 8px 20px 28px; + font-size: 12px; + color: var(--text-2); +} +.footer .version { margin-left: auto; } +.demo-chip { padding: 1px 8px; border-radius: 999px; background: var(--pending-bg); color: var(--pending); font-weight: 600; } +.warn-chip { padding: 1px 8px; border-radius: 999px; background: var(--down-bg); color: var(--down); font-weight: 600; } + +@media (max-width: 640px) { + .topbar { padding: 10px 14px; } + .summary { gap: 6px 12px; } + .grid { grid-template-columns: 1fr; padding: 12px 14px 8px; } + .group-tabs { padding: 12px 14px 0; } + .footer { padding: 8px 14px 24px; } +} + +/* ================= 视图二:表格(高密度列表) ================= */ +body[data-view="table"] .grid { display: block; } + +.table-wrap { + overflow-x: auto; + background: var(--surface); + border: 1px solid var(--border); + border-radius: 12px; + box-shadow: var(--shadow); +} + +.monitor-table { width: 100%; border-collapse: collapse; font-size: 13px; } +.monitor-table th { + padding: 10px 12px; + text-align: left; + font-size: 12px; + font-weight: 600; + color: var(--text-2); + white-space: nowrap; + background: var(--bg); + border-bottom: 1px solid var(--border); +} +.monitor-table td { padding: 9px 12px; border-bottom: 1px solid var(--border); vertical-align: middle; } +.monitor-table tbody tr:last-child td { border-bottom: 0; } +.monitor-table tbody tr:hover { background: color-mix(in srgb, var(--accent) 5%, transparent); } +.monitor-table tbody tr[data-status="down"] { background: color-mix(in srgb, var(--down) 6%, transparent); } +.group-row td { padding: 7px 12px; font-size: 12px; font-weight: 650; color: var(--text-2); background: var(--bg); } + +.t-state { white-space: nowrap; } +.t-state .dot { display: inline-block; margin-right: 6px; vertical-align: middle; } +tr[data-status="up"] .t-state { color: var(--up); } +tr[data-status="down"] .t-state { color: var(--down); } +tr[data-status="pending"] .t-state { color: var(--pending); } +.t-name { white-space: nowrap; } +.t-name .type-badge { margin-left: 8px; } +.t-target { + max-width: 280px; + font-family: var(--mono); + font-size: 12px; + color: var(--text-2); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.t-num { font-variant-numeric: tabular-nums; white-space: nowrap; } +.t-hb { width: 160px; } +.t-hb svg { display: block; width: 150px; height: 24px; } +.t-uptime { white-space: nowrap; } +.uptime-bar-mini { display: inline-flex; width: 110px; height: 8px; margin-right: 8px; vertical-align: middle; } +.t-pct { font-size: 12px; color: var(--text-2); font-variant-numeric: tabular-nums; } + diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..e7977dd --- /dev/null +++ b/public/index.html @@ -0,0 +1,49 @@ + + + + + + + Shiroko Monitor + + + + +
+
+ +
+

Shiroko Monitor

+

轻量级服务监控面板

+
+
+
+ 检测中… +
–
+
–
+
–
+
–
+
–
+
+ +
+
+ + + +
+
正在加载监控配置…
+
+ +
+ 数据源:– + + + – + – + shiroko-monitor v0.6.0 +
+ + + + diff --git a/public/monitors.json b/public/monitors.json new file mode 100644 index 0000000..eb1fcff --- /dev/null +++ b/public/monitors.json @@ -0,0 +1,100 @@ +{ + "settings": { + "title": "Shiroko Monitor", + "description": "轻量级服务监控面板", + "view": "table", + "dataFilter": "uptimerobot", + "refreshInterval": 300, + "dataSource": "auto", + "uptimeRobot": { + "enabled": false, + "apiKey": "", + "pollIntervalSec": 300, + "group": "UptimeRobot" + } + }, + "monitors": [ + { + "id": "example-com", + "name": "Example 站点", + "group": "公共服务", + "type": "http", + "url": "https://www.example.com", + "method": "GET", + "expectStatus": [200], + "interval": 60, + "timeout": 10 + }, + { + "id": "baidu", + "name": "百度", + "group": "公共服务", + "type": "http", + "url": "https://www.baidu.com", + "expectStatus": [200], + "interval": 60, + "timeout": 10 + }, + { + "id": "cloudflare-site", + "name": "Cloudflare 官网", + "group": "公共服务", + "type": "http", + "url": "https://www.cloudflare.com", + "expectStatus": [200], + "interval": 60, + "timeout": 10 + }, + { + "id": "github-api", + "name": "GitHub API(限流目标示例)", + "group": "公共服务", + "type": "http", + "url": "https://api.github.com", + "expectStatus": [200], + "interval": 300, + "timeout": 10, + "probeOnRefresh": false + }, + { + "id": "httpbin-500", + "name": "HTTPBin 500(演示 expectStatus)", + "group": "公共服务", + "type": "http", + "url": "https://httpbin.org/status/500", + "expectStatus": [500], + "interval": 120, + "timeout": 10 + }, + { + "id": "badssl-expired", + "name": "BadSSL 过期证书(演示离线)", + "group": "公共服务", + "type": "http", + "url": "https://expired.badssl.com/", + "expectStatus": [200], + "interval": 120, + "timeout": 10 + }, + { + "id": "cloudflare-dns-tcp", + "name": "Cloudflare 443 端口", + "group": "基础设施", + "type": "tcp", + "host": "1.1.1.1", + "port": 443, + "interval": 60, + "timeout": 10 + }, + { + "id": "google-dns-tcp", + "name": "Google DNS 53 端口", + "group": "基础设施", + "type": "tcp", + "host": "8.8.8.8", + "port": 53, + "interval": 60, + "timeout": 10 + } + ] +} diff --git a/public/status.json b/public/status.json new file mode 100644 index 0000000..a0f9d32 --- /dev/null +++ b/public/status.json @@ -0,0 +1,1100 @@ +{ + "prober": "shiroko-monitor-node/0.6.0", + "demo": false, + "generatedAt": "2026-10-13T10:31:41.131Z", + "dataUpdatedAt": "2026-10-13T10:31:32.261Z", + "updateIntervalSec": 300, + "dataFilter": "uptimerobot", + "stats": { + "total": 6, + "up": 5, + "down": 1, + "pending": 0, + "avgLatency": null, + "avgUptime90": 83.3, + "memory": { + "rssMB": 62, + "heapUsedMB": 11.7, + "heapTotalMB": 15 + } + }, + "sources": { + "uptimerobot": { + "enabled": true, + "ok": true, + "error": null, + "lastSyncAt": "2026-10-13T10:30:41.627Z", + "count": 6, + "syncing": false, + "lastSyncMs": 1791887440289 + } + }, + "monitors": { + "ur-792059439": { + "status": "up", + "latency": 171, + "code": null, + "detail": "UptimeRobot:运行正常", + "lastCheck": "2026-10-13T10:25:00.000Z", + "history": [ + { + "t": "2026-10-12T11:40:00.000Z", + "ok": true, + "ms": 258 + }, + { + "t": "2026-10-12T12:20:00.000Z", + "ok": true, + "ms": 144 + }, + { + "t": "2026-10-12T13:00:00.000Z", + "ok": true, + "ms": 277 + }, + { + "t": "2026-10-12T13:40:00.000Z", + "ok": true, + "ms": 482 + }, + { + "t": "2026-10-12T14:20:00.000Z", + "ok": true, + "ms": 698 + }, + { + "t": "2026-10-12T15:00:00.000Z", + "ok": true, + "ms": 312 + }, + { + "t": "2026-10-12T15:40:00.000Z", + "ok": true, + "ms": 336 + }, + { + "t": "2026-10-12T16:20:00.000Z", + "ok": true, + "ms": 275 + }, + { + "t": "2026-10-12T17:00:00.000Z", + "ok": true, + "ms": 255 + }, + { + "t": "2026-10-12T17:40:00.000Z", + "ok": true, + "ms": 304 + }, + { + "t": "2026-10-12T18:20:00.000Z", + "ok": true, + "ms": 323 + }, + { + "t": "2026-10-12T19:00:00.000Z", + "ok": true, + "ms": 328 + }, + { + "t": "2026-10-12T19:40:00.000Z", + "ok": true, + "ms": 304 + }, + { + "t": "2026-10-12T20:20:00.000Z", + "ok": true, + "ms": 265 + }, + { + "t": "2026-10-12T21:00:00.000Z", + "ok": true, + "ms": 294 + }, + { + "t": "2026-10-12T21:40:00.000Z", + "ok": true, + "ms": 379 + }, + { + "t": "2026-10-12T22:20:00.000Z", + "ok": true, + "ms": 176 + }, + { + "t": "2026-10-12T23:00:00.000Z", + "ok": true, + "ms": 325 + }, + { + "t": "2026-10-12T23:40:00.000Z", + "ok": true, + "ms": 192 + }, + { + "t": "2026-10-13T00:20:00.000Z", + "ok": true, + "ms": 342 + }, + { + "t": "2026-10-13T01:00:00.000Z", + "ok": true, + "ms": 252 + }, + { + "t": "2026-10-13T01:40:00.000Z", + "ok": true, + "ms": 164 + }, + { + "t": "2026-10-13T02:20:00.000Z", + "ok": true, + "ms": 199 + }, + { + "t": "2026-10-13T03:00:00.000Z", + "ok": true, + "ms": 216 + }, + { + "t": "2026-10-13T03:40:00.000Z", + "ok": true, + "ms": 160 + }, + { + "t": "2026-10-13T04:20:00.000Z", + "ok": true, + "ms": 435 + }, + { + "t": "2026-10-13T05:00:00.000Z", + "ok": true, + "ms": 281 + }, + { + "t": "2026-10-13T05:40:00.000Z", + "ok": true, + "ms": 285 + }, + { + "t": "2026-10-13T06:20:00.000Z", + "ok": true, + "ms": 270 + }, + { + "t": "2026-10-13T07:00:00.000Z", + "ok": true, + "ms": 235 + }, + { + "t": "2026-10-13T07:40:00.000Z", + "ok": true, + "ms": 271 + }, + { + "t": "2026-10-13T08:20:00.000Z", + "ok": true, + "ms": 417 + }, + { + "t": "2026-10-13T09:45:00.000Z", + "ok": true, + "ms": 612 + }, + { + "t": "2026-10-13T10:25:00.000Z", + "ok": true, + "ms": 171 + } + ], + "daily": { + "2026-10-13": { + "total": 12, + "up": 12 + } + }, + "meta": { + "name": "狼的公告板", + "group": "UptimeRobot", + "type": "ur", + "url": "https://blog.tama.guru", + "source": "uptimerobot", + "sourceLabel": "HTTP", + "interval": 300 + }, + "uptimeRatios": { + "1": 100, + "7": 100, + "30": 100, + "90": 100 + }, + "downSeconds": { + "1": 0, + "7": 0, + "30": 0, + "90": 0 + } + }, + "ur-795497022": { + "status": "up", + "latency": 744, + "code": null, + "detail": "UptimeRobot:运行正常", + "lastCheck": "2026-10-13T10:27:00.000Z", + "history": [ + { + "t": "2026-10-12T11:35:00.000Z", + "ok": true, + "ms": 713 + }, + { + "t": "2026-10-12T12:20:00.000Z", + "ok": true, + "ms": 692 + }, + { + "t": "2026-10-12T13:00:00.000Z", + "ok": true, + "ms": 733 + }, + { + "t": "2026-10-12T13:40:00.000Z", + "ok": true, + "ms": 935 + }, + { + "t": "2026-10-12T14:20:00.000Z", + "ok": true, + "ms": 802 + }, + { + "t": "2026-10-12T15:00:00.000Z", + "ok": true, + "ms": 720 + }, + { + "t": "2026-10-12T15:40:00.000Z", + "ok": true, + "ms": 798 + }, + { + "t": "2026-10-12T16:20:00.000Z", + "ok": true, + "ms": 685 + }, + { + "t": "2026-10-12T17:00:00.000Z", + "ok": true, + "ms": 700 + }, + { + "t": "2026-10-12T17:40:00.000Z", + "ok": true, + "ms": 694 + }, + { + "t": "2026-10-12T18:20:00.000Z", + "ok": true, + "ms": 703 + }, + { + "t": "2026-10-12T19:00:00.000Z", + "ok": true, + "ms": 729 + }, + { + "t": "2026-10-12T19:40:00.000Z", + "ok": true, + "ms": 713 + }, + { + "t": "2026-10-12T20:20:00.000Z", + "ok": true, + "ms": 784 + }, + { + "t": "2026-10-12T21:00:00.000Z", + "ok": true, + "ms": 628 + }, + { + "t": "2026-10-12T21:40:00.000Z", + "ok": true, + "ms": 629 + }, + { + "t": "2026-10-12T22:20:00.000Z", + "ok": true, + "ms": 751 + }, + { + "t": "2026-10-12T23:00:00.000Z", + "ok": true, + "ms": 624 + }, + { + "t": "2026-10-12T23:40:00.000Z", + "ok": true, + "ms": 715 + }, + { + "t": "2026-10-13T00:20:00.000Z", + "ok": true, + "ms": 683 + }, + { + "t": "2026-10-13T01:00:00.000Z", + "ok": true, + "ms": 643 + }, + { + "t": "2026-10-13T01:40:00.000Z", + "ok": true, + "ms": 641 + }, + { + "t": "2026-10-13T02:20:00.000Z", + "ok": true, + "ms": 609 + }, + { + "t": "2026-10-13T03:00:00.000Z", + "ok": true, + "ms": 606 + }, + { + "t": "2026-10-13T03:40:00.000Z", + "ok": true, + "ms": 720 + }, + { + "t": "2026-10-13T04:20:00.000Z", + "ok": true, + "ms": 711 + }, + { + "t": "2026-10-13T05:00:00.000Z", + "ok": true, + "ms": 598 + }, + { + "t": "2026-10-13T05:40:00.000Z", + "ok": true, + "ms": 729 + }, + { + "t": "2026-10-13T06:20:00.000Z", + "ok": true, + "ms": 676 + }, + { + "t": "2026-10-13T07:00:00.000Z", + "ok": true, + "ms": 691 + }, + { + "t": "2026-10-13T07:40:00.000Z", + "ok": true, + "ms": 696 + }, + { + "t": "2026-10-13T08:20:00.000Z", + "ok": true, + "ms": 682 + }, + { + "t": "2026-10-13T09:50:00.000Z", + "ok": true, + "ms": 774 + }, + { + "t": "2026-10-13T10:27:00.000Z", + "ok": true, + "ms": 744 + } + ], + "daily": { + "2026-10-13": { + "total": 12, + "up": 12 + } + }, + "meta": { + "name": "狼的共享盘", + "group": "UptimeRobot", + "type": "ur", + "url": "https://share.tama.guru", + "source": "uptimerobot", + "sourceLabel": "HTTP", + "interval": 300 + }, + "uptimeRatios": { + "1": 100, + "7": 99.789, + "30": 99.951, + "90": 99.93 + }, + "downSeconds": { + "1": 0, + "7": 1276, + "30": 1276, + "90": 5432 + } + }, + "ur-795556828": { + "status": "up", + "latency": 367, + "code": null, + "detail": "UptimeRobot:运行正常", + "lastCheck": "2026-10-13T10:26:00.000Z", + "history": [ + { + "t": "2026-10-12T11:35:00.000Z", + "ok": true, + "ms": 374 + }, + { + "t": "2026-10-12T12:15:00.000Z", + "ok": true, + "ms": 333 + }, + { + "t": "2026-10-12T12:55:00.000Z", + "ok": true, + "ms": 245 + }, + { + "t": "2026-10-12T13:35:00.000Z", + "ok": true, + "ms": 590 + }, + { + "t": "2026-10-12T14:15:00.000Z", + "ok": true, + "ms": 322 + }, + { + "t": "2026-10-12T14:55:00.000Z", + "ok": true, + "ms": 225 + }, + { + "t": "2026-10-12T15:35:00.000Z", + "ok": true, + "ms": 275 + }, + { + "t": "2026-10-12T16:15:00.000Z", + "ok": true, + "ms": 450 + }, + { + "t": "2026-10-12T16:55:00.000Z", + "ok": true, + "ms": 281 + }, + { + "t": "2026-10-12T17:40:00.000Z", + "ok": true, + "ms": 320 + }, + { + "t": "2026-10-12T18:20:00.000Z", + "ok": true, + "ms": 287 + }, + { + "t": "2026-10-12T19:00:00.000Z", + "ok": true, + "ms": 283 + }, + { + "t": "2026-10-12T19:40:00.000Z", + "ok": true, + "ms": 464 + }, + { + "t": "2026-10-12T20:20:00.000Z", + "ok": true, + "ms": 187 + }, + { + "t": "2026-10-12T21:00:00.000Z", + "ok": true, + "ms": 233 + }, + { + "t": "2026-10-12T21:40:00.000Z", + "ok": true, + "ms": 213 + }, + { + "t": "2026-10-12T22:20:00.000Z", + "ok": true, + "ms": 235 + }, + { + "t": "2026-10-12T23:05:00.000Z", + "ok": true, + "ms": 241 + }, + { + "t": "2026-10-12T23:45:00.000Z", + "ok": true, + "ms": 230 + }, + { + "t": "2026-10-13T00:25:00.000Z", + "ok": true, + "ms": 244 + }, + { + "t": "2026-10-13T01:05:00.000Z", + "ok": true, + "ms": 133 + }, + { + "t": "2026-10-13T01:45:00.000Z", + "ok": true, + "ms": 127 + }, + { + "t": "2026-10-13T02:25:00.000Z", + "ok": true, + "ms": 182 + }, + { + "t": "2026-10-13T03:05:00.000Z", + "ok": true, + "ms": 413 + }, + { + "t": "2026-10-13T03:45:00.000Z", + "ok": true, + "ms": 229 + }, + { + "t": "2026-10-13T04:25:00.000Z", + "ok": true, + "ms": 255 + }, + { + "t": "2026-10-13T05:05:00.000Z", + "ok": true, + "ms": 150 + }, + { + "t": "2026-10-13T05:45:00.000Z", + "ok": true, + "ms": 201 + }, + { + "t": "2026-10-13T06:25:00.000Z", + "ok": true, + "ms": 232 + }, + { + "t": "2026-10-13T07:05:00.000Z", + "ok": true, + "ms": 247 + }, + { + "t": "2026-10-13T07:45:00.000Z", + "ok": true, + "ms": 559 + }, + { + "t": "2026-10-13T08:25:00.000Z", + "ok": true, + "ms": 219 + }, + { + "t": "2026-10-13T09:50:00.000Z", + "ok": true, + "ms": 672 + }, + { + "t": "2026-10-13T10:26:00.000Z", + "ok": true, + "ms": 367 + } + ], + "daily": { + "2026-10-13": { + "total": 12, + "up": 12 + } + }, + "meta": { + "name": "狼的导航页", + "group": "UptimeRobot", + "type": "ur", + "url": "https://tama.guru", + "source": "uptimerobot", + "sourceLabel": "HTTP", + "interval": 300 + }, + "uptimeRatios": { + "1": 100, + "7": 100, + "30": 100, + "90": 100 + }, + "downSeconds": { + "1": 0, + "7": 0, + "30": 0, + "90": 0 + } + }, + "ur-792059414": { + "status": "up", + "latency": 2264, + "code": null, + "detail": "UptimeRobot:运行正常", + "lastCheck": "2026-10-13T10:27:00.000Z", + "history": [ + { + "t": "2026-10-12T11:15:00.000Z", + "ok": true, + "ms": 1867 + }, + { + "t": "2026-10-12T12:00:00.000Z", + "ok": true, + "ms": 2409 + }, + { + "t": "2026-10-12T12:45:00.000Z", + "ok": true, + "ms": 2922 + }, + { + "t": "2026-10-12T13:25:00.000Z", + "ok": true, + "ms": 3598 + }, + { + "t": "2026-10-12T14:10:00.000Z", + "ok": true, + "ms": 2478 + }, + { + "t": "2026-10-12T14:55:00.000Z", + "ok": true, + "ms": 3489 + }, + { + "t": "2026-10-12T15:40:00.000Z", + "ok": true, + "ms": 2901 + }, + { + "t": "2026-10-12T16:25:00.000Z", + "ok": true, + "ms": 2402 + }, + { + "t": "2026-10-12T17:10:00.000Z", + "ok": true, + "ms": 2816 + }, + { + "t": "2026-10-12T17:55:00.000Z", + "ok": true, + "ms": 2291 + }, + { + "t": "2026-10-12T18:40:00.000Z", + "ok": true, + "ms": 2251 + }, + { + "t": "2026-10-12T19:25:00.000Z", + "ok": true, + "ms": 2178 + }, + { + "t": "2026-10-12T20:10:00.000Z", + "ok": true, + "ms": 2123 + }, + { + "t": "2026-10-12T20:55:00.000Z", + "ok": true, + "ms": 2087 + }, + { + "t": "2026-10-12T21:40:00.000Z", + "ok": true, + "ms": 1870 + }, + { + "t": "2026-10-12T22:20:00.000Z", + "ok": true, + "ms": 1662 + }, + { + "t": "2026-10-12T23:00:00.000Z", + "ok": true, + "ms": 1859 + }, + { + "t": "2026-10-12T23:40:00.000Z", + "ok": true, + "ms": 3138 + }, + { + "t": "2026-10-13T00:20:00.000Z", + "ok": true, + "ms": 1681 + }, + { + "t": "2026-10-13T01:00:00.000Z", + "ok": true, + "ms": 2312 + }, + { + "t": "2026-10-13T01:40:00.000Z", + "ok": true, + "ms": 2200 + }, + { + "t": "2026-10-13T02:25:00.000Z", + "ok": true, + "ms": 1924 + }, + { + "t": "2026-10-13T03:10:00.000Z", + "ok": true, + "ms": 1144 + }, + { + "t": "2026-10-13T03:55:00.000Z", + "ok": true, + "ms": 2124 + }, + { + "t": "2026-10-13T04:40:00.000Z", + "ok": true, + "ms": 2623 + }, + { + "t": "2026-10-13T05:25:00.000Z", + "ok": true, + "ms": 2562 + }, + { + "t": "2026-10-13T06:10:00.000Z", + "ok": true, + "ms": 2625 + }, + { + "t": "2026-10-13T06:55:00.000Z", + "ok": true, + "ms": 2226 + }, + { + "t": "2026-10-13T07:40:00.000Z", + "ok": true, + "ms": 1715 + }, + { + "t": "2026-10-13T08:20:00.000Z", + "ok": true, + "ms": 1620 + }, + { + "t": "2026-10-13T09:48:00.000Z", + "ok": true, + "ms": 1809 + }, + { + "t": "2026-10-13T10:27:00.000Z", + "ok": true, + "ms": 2264 + } + ], + "daily": { + "2026-10-13": { + "total": 12, + "up": 12 + } + }, + "meta": { + "name": "狼的提问箱", + "group": "UptimeRobot", + "type": "ur", + "url": "https://box.tama.guru", + "source": "uptimerobot", + "sourceLabel": "HTTP", + "interval": 300 + }, + "uptimeRatios": { + "1": 100, + "7": 99.787, + "30": 99.927, + "90": 99.902 + }, + "downSeconds": { + "1": 0, + "7": 1288, + "30": 1899, + "90": 7593 + } + }, + "ur-798788113": { + "status": "up", + "latency": 513, + "code": null, + "detail": "UptimeRobot:运行正常", + "lastCheck": "2026-10-13T10:26:00.000Z", + "history": [ + { + "t": "2026-10-12T11:30:00.000Z", + "ok": true, + "ms": 437 + }, + { + "t": "2026-10-12T12:10:00.000Z", + "ok": true, + "ms": 528 + }, + { + "t": "2026-10-12T12:55:00.000Z", + "ok": true, + "ms": 738 + }, + { + "t": "2026-10-12T13:35:00.000Z", + "ok": true, + "ms": 412 + }, + { + "t": "2026-10-12T14:15:00.000Z", + "ok": true, + "ms": 401 + }, + { + "t": "2026-10-12T14:55:00.000Z", + "ok": true, + "ms": 321 + }, + { + "t": "2026-10-12T15:35:00.000Z", + "ok": true, + "ms": 517 + }, + { + "t": "2026-10-12T16:15:00.000Z", + "ok": true, + "ms": 324 + }, + { + "t": "2026-10-12T16:55:00.000Z", + "ok": true, + "ms": 452 + }, + { + "t": "2026-10-12T17:35:00.000Z", + "ok": true, + "ms": 346 + }, + { + "t": "2026-10-12T18:15:00.000Z", + "ok": true, + "ms": 386 + }, + { + "t": "2026-10-12T18:55:00.000Z", + "ok": true, + "ms": 357 + }, + { + "t": "2026-10-12T19:35:00.000Z", + "ok": true, + "ms": 423 + }, + { + "t": "2026-10-12T20:15:00.000Z", + "ok": true, + "ms": 303 + }, + { + "t": "2026-10-12T20:55:00.000Z", + "ok": true, + "ms": 524 + }, + { + "t": "2026-10-12T21:35:00.000Z", + "ok": true, + "ms": 330 + }, + { + "t": "2026-10-12T22:15:00.000Z", + "ok": true, + "ms": 441 + }, + { + "t": "2026-10-12T23:00:00.000Z", + "ok": true, + "ms": 215 + }, + { + "t": "2026-10-12T23:40:00.000Z", + "ok": true, + "ms": 239 + }, + { + "t": "2026-10-13T00:20:00.000Z", + "ok": true, + "ms": 273 + }, + { + "t": "2026-10-13T01:00:00.000Z", + "ok": true, + "ms": 273 + }, + { + "t": "2026-10-13T01:40:00.000Z", + "ok": true, + "ms": 347 + }, + { + "t": "2026-10-13T02:20:00.000Z", + "ok": true, + "ms": 505 + }, + { + "t": "2026-10-13T03:00:00.000Z", + "ok": true, + "ms": 412 + }, + { + "t": "2026-10-13T03:40:00.000Z", + "ok": true, + "ms": 332 + }, + { + "t": "2026-10-13T04:20:00.000Z", + "ok": true, + "ms": 396 + }, + { + "t": "2026-10-13T05:00:00.000Z", + "ok": true, + "ms": 537 + }, + { + "t": "2026-10-13T05:40:00.000Z", + "ok": true, + "ms": 332 + }, + { + "t": "2026-10-13T06:20:00.000Z", + "ok": true, + "ms": 426 + }, + { + "t": "2026-10-13T07:00:00.000Z", + "ok": true, + "ms": 344 + }, + { + "t": "2026-10-13T07:40:00.000Z", + "ok": true, + "ms": 334 + }, + { + "t": "2026-10-13T08:20:00.000Z", + "ok": true, + "ms": 341 + }, + { + "t": "2026-10-13T09:10:00.000Z", + "ok": true, + "ms": 249 + }, + { + "t": "2026-10-13T09:46:00.000Z", + "ok": true, + "ms": 641 + }, + { + "t": "2026-10-13T10:26:00.000Z", + "ok": true, + "ms": 513 + } + ], + "daily": { + "2026-10-13": { + "total": 12, + "up": 12 + } + }, + "meta": { + "name": "狼的聊天室", + "group": "UptimeRobot", + "type": "ur", + "url": "https://chat.tama.guru", + "source": "uptimerobot", + "sourceLabel": "HTTP", + "interval": 300 + }, + "uptimeRatios": { + "1": 100, + "7": 100, + "30": 100, + "90": 100 + }, + "downSeconds": { + "1": 0, + "7": 0, + "30": 0, + "90": 0 + } + }, + "ur-796219015": { + "status": "down", + "latency": 123, + "code": 403, + "detail": "UptimeRobot:403 Forbidden", + "lastCheck": "2026-05-07T07:54:09.000Z", + "history": [ + { + "t": "2026-05-07T07:54:09.000Z", + "ok": false, + "ms": 0 + } + ], + "daily": { + "2026-10-13": { + "total": 12, + "up": 0 + } + }, + "meta": { + "name": "狼的评论系统", + "group": "UptimeRobot", + "type": "ur", + "url": "https://artalk.tama.guru", + "source": "uptimerobot", + "sourceLabel": "HTTP", + "interval": 300 + }, + "uptimeRatios": { + "1": 0, + "7": 0, + "30": 0, + "90": 0 + }, + "downSeconds": { + "1": 86400, + "7": 604800, + "30": 2592000, + "90": 7776000 + } + } + } +} diff --git a/scripts/verify-security.cjs b/scripts/verify-security.cjs new file mode 100644 index 0000000..22c05c0 --- /dev/null +++ b/scripts/verify-security.cjs @@ -0,0 +1,171 @@ +/** + * shiroko-monitor 安全与探测能力验证(开发用) + * + * 覆盖: + * A. banner 探测:SSH 标识串识别、expectBanner 策略匹配/不符、静默端口超时、默认不回显版本 + * B. 信息泄露控制:detail 不含地址/版本、redactDetails 脱敏、公开配置不含真实地址 + * C. 私有配置分层:local.monitors.json 覆盖 host/port 后探测才可连通 + * D. /api/refresh 滥用防护:冷却限流 429 + Retry-After、allowRefresh=false 时 403 + * E. 来源判定 isPrivateAddress 单元校验 + * + * 用法:node scripts/verify-security.cjs + */ +const fs = require('node:fs'); +const os = require('node:os'); +const net = require('node:net'); +const path = require('node:path'); +const { spawn } = require('node:child_process'); + +const ROOT = path.join(__dirname, '..'); +const PROBER = path.join(ROOT, 'prober', 'node', 'index.js'); +const TMP = fs.mkdtempSync(path.join(os.tmpdir(), 'shiroko-sec-')); +const SSH_PORT = 2222; +const SILENT_PORT = 2223; +const results = []; + +const sleep = (ms) => new Promise((r) => setTimeout(r, ms)); +function check(name, pass, detail) { + results.push({ name, pass }); + console.log(`${pass ? ' ✓' : ' ✗'} ${name}${detail ? ` — ${detail}` : ''}`); +} + +async function waitForHttp(url, timeoutMs = 8000) { + const deadline = Date.now() + timeoutMs; + while (Date.now() < deadline) { + try { + await fetch(url, { cache: 'no-store' }); + return true; + } catch { + await sleep(200); + } + } + return false; +} + +function startProber(args, env = {}) { + return spawn(process.execPath, [PROBER, ...args], { + env: { ...process.env, ...env }, + stdio: ['ignore', 'pipe', 'pipe'], + }); +} + +function runOnce(args) { + return new Promise((resolve) => { + const child = startProber(args); + let out = ''; + child.stdout.on('data', (d) => (out += d)); + child.stderr.on('data', (d) => (out += d)); + child.on('exit', (code) => resolve({ code, out })); + }); +} + +async function main() { + // ---------- 准备:本地假 SSH 服务 + 静默端口 ---------- + const sshServer = net.createServer((sock) => { + // 忠实模拟 OpenSSH:连接建立后立即发送标识串(RFC 4253) + sock.write('SSH-2.0-OpenSSH_9.6p1 Ubuntu-3ubuntu13\r\n'); + }); + const silentServer = net.createServer(() => { /* 接受连接但从不发送数据 */ }); + await new Promise((r) => sshServer.listen(SSH_PORT, '127.0.0.1', r)); + await new Promise((r) => silentServer.listen(SILENT_PORT, '127.0.0.1', r)); + console.log(`[准备] 假 SSH 服务 127.0.0.1:${SSH_PORT},静默端口 127.0.0.1:${SILENT_PORT},临时目录 ${TMP}`); + + // ---------- A/B/C:banner 探测 + 脱敏 + 私有配置分层 ---------- + const pubConfig = path.join(TMP, 'monitors.json'); + const localConfig = path.join(TMP, 'local.monitors.json'); + const outJson = path.join(TMP, 'status.json'); + fs.writeFileSync(pubConfig, JSON.stringify({ + settings: { title: 'sec-test', redactDetails: false }, + monitors: [ + { id: 'ssh-banner', name: 'SSH 服务', group: '基础设施', type: 'banner', host: 'placeholder.invalid', port: 22, timeout: 5, expectBanner: '^SSH-2\\.0-' }, + { id: 'ssh-reveal', name: 'SSH(回显)', group: '基础设施', type: 'banner', host: 'placeholder.invalid', port: 22, timeout: 5, expectBanner: '^SSH-2\\.0-', revealBanner: true }, + { id: 'ssh-mismatch', name: 'SSH(策略不符)', group: '基础设施', type: 'banner', host: 'placeholder.invalid', port: 22, timeout: 5, expectBanner: '^SSH-1\\.99-' }, + { id: 'silent-banner', name: '静默端口 banner', group: '基础设施', type: 'banner', host: 'placeholder.invalid', port: SILENT_PORT, timeout: 2 }, + { id: 'silent-tcp', name: '静默端口 TCP', group: '基础设施', type: 'tcp', host: 'placeholder.invalid', port: SILENT_PORT, timeout: 2 }, + ], + }, null, 2)); + // 真实地址只存在于私有覆盖中(模拟「公开仓库不含内网地址」) + fs.writeFileSync(localConfig, JSON.stringify({ + monitors: [ + { id: 'ssh-banner', host: '127.0.0.1', port: SSH_PORT }, + { id: 'ssh-reveal', host: '127.0.0.1', port: SSH_PORT }, + { id: 'ssh-mismatch', host: '127.0.0.1', port: SSH_PORT }, + { id: 'silent-banner', host: '127.0.0.1', port: SILENT_PORT }, + { id: 'silent-tcp', host: '127.0.0.1', port: SILENT_PORT }, + ], + }, null, 2)); + + console.log('\n[A] banner 探测(私有配置覆盖地址后执行一轮探测)'); + const once = await runOnce(['--once', `--config=${pubConfig}`, `--local-config=${localConfig}`, `--out=${outJson}`]); + const snap = JSON.parse(fs.readFileSync(outJson, 'utf8')); + const m = snap.monitors; + check('私有配置分层生效(占位地址被覆盖为本地地址后探测成功)', m['ssh-banner'].status === 'up', `ssh-banner=${m['ssh-banner'].status} · ${m['ssh-banner'].detail}`); + check('SSH 标识串识别为在线且只给协议族摘要', m['ssh-banner'].detail === 'SSH 响应正常', `detail="${m['ssh-banner'].detail}"`); + check('默认不回显版本号(detail 不含 OpenSSH)', !/OpenSSH/.test(m['ssh-banner'].detail), m['ssh-banner'].detail); + check('expectBanner 策略不符时判为离线且不回显实际标识串', m['ssh-mismatch'].status === 'down' && !/OpenSSH/.test(m['ssh-mismatch'].detail), `detail="${m['ssh-mismatch'].detail}"`); + check('显式开启 revealBanner 后才回显标识串', /OpenSSH/.test(m['ssh-reveal'].detail), `detail="${m['ssh-reveal'].detail}"`); + check('静默端口 banner 探测超时判离线', m['silent-banner'].status === 'down', `detail="${m['silent-banner'].detail}"`); + check('同一静默端口 TCP 探测可达(证明两者判定逻辑不同)', m['silent-tcp'].status === 'up', `detail="${m['silent-tcp'].detail}"`); + check('TCP detail 不再包含地址', !m['silent-tcp'].detail.includes('127.0.0.1') && !m['silent-tcp'].detail.includes(':'), m['silent-tcp'].detail); + const rawSnapshot = fs.readFileSync(outJson, 'utf8'); + check('快照中不出现公开配置的占位地址', !rawSnapshot.includes('placeholder.invalid'), '未泄露 host'); + check('快照中不出现真实内网地址', !rawSnapshot.includes('127.0.0.1'), '未泄露 host'); + + console.log('\n[B] redactDetails 脱敏'); + const redacted = JSON.parse(fs.readFileSync(pubConfig, 'utf8')); + redacted.settings.redactDetails = true; + fs.writeFileSync(pubConfig, JSON.stringify(redacted, null, 2)); + const outRedacted = path.join(TMP, 'status-redacted.json'); + await runOnce(['--once', `--config=${pubConfig}`, `--local-config=${localConfig}`, `--out=${outRedacted}`]); + const rSnap = JSON.parse(fs.readFileSync(outRedacted, 'utf8')); + check('redactDetails 开启后 detail 只保留正常/异常', rSnap.monitors['ssh-reveal'].detail === '正常' && rSnap.monitors['silent-tcp'].detail === '正常', JSON.stringify(Object.fromEntries(Object.entries(rSnap.monitors).map(([k, v]) => [k, v.detail])))); + + // ---------- D:刷新接口滥用防护 ---------- + console.log('\n[D] /api/refresh 滥用防护'); + const cooldownCfg = path.join(TMP, 'cooldown.json'); + fs.writeFileSync(cooldownCfg, JSON.stringify({ settings: { title: 't', refreshCooldownSec: 3 }, monitors: [] }, null, 2)); + const srvA = startProber([`--config=${cooldownCfg}`, `--local-config=${cooldownCfg}`, `--out=${path.join(TMP, 'a.json')}`], { PORT: '8897' }); + await waitForHttp('http://127.0.0.1:8897/api/status'); + const r1 = await fetch('http://127.0.0.1:8897/api/refresh'); + const r2 = await fetch('http://127.0.0.1:8897/api/refresh'); + check('首次刷新放行', r1.status === 200, `status=${r1.status}`); + check('冷却期内再次刷新被限流', r2.status === 429, `status=${r2.status}, retry-after=${r2.headers.get('retry-after')}s`); + check('限流响应带 Retry-After 头', Number(r2.headers.get('retry-after')) >= 1, `retry-after=${r2.headers.get('retry-after')}`); + await sleep(3300); + const r3 = await fetch('http://127.0.0.1:8897/api/refresh'); + check('冷却结束后可再次刷新', r3.status === 200, `status=${r3.status}`); + srvA.kill(); + + const disabledCfg = path.join(TMP, 'disabled.json'); + fs.writeFileSync(disabledCfg, JSON.stringify({ settings: { title: 't', allowRefresh: false }, monitors: [] }, null, 2)); + const srvB = startProber([`--config=${disabledCfg}`, `--local-config=${disabledCfg}`, `--out=${path.join(TMP, 'b.json')}`], { PORT: '8898' }); + await waitForHttp('http://127.0.0.1:8898/api/status'); + const r4 = await fetch('http://127.0.0.1:8898/api/refresh'); + const body4 = await r4.json().catch(() => ({})); + check('allowRefresh:false 时刷新被拒绝', r4.status === 403, `status=${r4.status}, error=${body4.error}`); + check('拒绝响应不泄露目标信息', !JSON.stringify(body4).includes('host') && !JSON.stringify(body4).includes('/'), JSON.stringify(body4)); + const r5 = await fetch('http://127.0.0.1:8898/api/status'); + check('只读模式下面板数据接口仍可用', r5.status === 200, `status=${r5.status}`); + srvB.kill(); + + // ---------- E:来源判定 ---------- + console.log('\n[E] 来源判定'); + const { isPrivateAddress } = await import(`file://${PROBER.replace(/\\/g, '/')}`); + const priv = ['127.0.0.1', '::1', '10.1.2.3', '192.168.1.10', '172.16.0.1', '172.31.255.254', 'fc00::1', 'fe80::1', '::ffff:127.0.0.1']; + const pub = ['8.8.8.8', '1.1.1.1', '172.32.0.1', '11.0.0.1', '2001:4860:4860::8888']; + check('内网/回环地址被允许', priv.every(isPrivateAddress), priv.filter((i) => !isPrivateAddress(i)).join(',') || '全部通过'); + check('公网地址被拒绝', pub.every((i) => !isPrivateAddress(i)), pub.filter(isPrivateAddress).join(',') || '全部通过'); + + // ---------- 收尾 ---------- + sshServer.close(); + silentServer.close(); + fs.rmSync(TMP, { recursive: true, force: true }); + const failed = results.filter((r) => !r.pass); + console.log(`\n结果:${results.length - failed.length}/${results.length} 通过`); + if (failed.length) process.exit(1); +} + +main().catch((err) => { + console.error('FAILED:', err.stack || err.message); + process.exit(1); +}); diff --git a/scripts/verify-uptimerobot.cjs b/scripts/verify-uptimerobot.cjs new file mode 100644 index 0000000..086f842 --- /dev/null +++ b/scripts/verify-uptimerobot.cjs @@ -0,0 +1,193 @@ +/** + * shiroko-monitor UptimeRobot 集成验证(开发用) + * + * 覆盖: + * A. 映射单测(无网络):用合成 payload 校验状态/延迟/状态码/心率/聚合比率/元信息,且不泄露 Key + * B. 真实 Key 冒烟(需 UPTIMEROBOT_API_KEY,未设置则跳过) + * C. UptimeRobot 兼容只读接口 /api/v2/getMonitors + * D. 失败路径:Key 无效时只记录错误、不把任何目标误判为离线 + * + * 用法:UPTIMEROBOT_API_KEY=ur... node scripts/verify-uptimerobot.cjs + */ +const fs = require('node:fs'); +const os = require('node:os'); +const path = require('node:path'); +const { spawn } = require('node:child_process'); + +const ROOT = path.join(__dirname, '..'); +const PROBER = path.join(ROOT, 'prober', 'node', 'index.js'); +const LIB = path.join(ROOT, 'prober', 'node', 'lib', 'uptimerobot.js'); +const TMP = fs.mkdtempSync(path.join(os.tmpdir(), 'shiroko-ur-')); +const LIVE_KEY = process.env.UPTIMEROBOT_API_KEY || ''; +const results = []; + +const sleep = (ms) => new Promise((r) => setTimeout(r, ms)); +function check(name, pass, detail) { + results.push({ name, pass }); + console.log(`${pass ? ' ✓' : ' ✗'} ${name}${detail ? ` — ${detail}` : ''}`); +} + +async function waitForHttp(url, timeoutMs = 8000) { + const deadline = Date.now() + timeoutMs; + while (Date.now() < deadline) { + try { + await fetch(url, { cache: 'no-store' }); + return true; + } catch { + await sleep(200); + } + } + return false; +} + +function runOnce(args) { + return new Promise((resolve) => { + const child = spawn(process.execPath, [PROBER, ...args], { stdio: ['ignore', 'pipe', 'pipe'] }); + let out = ''; + child.stdout.on('data', (d) => (out += d)); + child.stderr.on('data', (d) => (out += d)); + child.on('exit', (code) => resolve({ code, out })); + }); +} + +// 合成的 getMonitors 响应:结构照搬真实字段,但内容全部虚构 +const FIXTURE = { + stat: 'ok', + pagination: { offset: 0, limit: 50, total: 3 }, + monitors: [ + { + id: 111111111, + friendly_name: '演示站点 A', + url: 'https://a.example.test', + type: 1, + interval: 300, + status: 2, + create_datetime: 1700000000, + custom_uptime_ratio: '100.000-99.500-99.900-99.950', + custom_down_durations: '0-100-200-300', + average_response_time: 250.5, + response_times: [ + { datetime: 1791880000, value: 300 }, + { datetime: 1791879700, value: 200 }, + { datetime: 1791879400, value: 0 }, + ], + logs: [ + { type: 2, datetime: 1791879700, duration: 300, reason: { code: '200', detail: 'OK' } }, + { type: 1, datetime: 1791879400, duration: 300, reason: { code: '500', detail: 'Internal Server Error' } }, + ], + }, + { + id: 222222222, + friendly_name: '演示端口 B', + url: 'b.example.test', + type: 4, + port: 22, + interval: 300, + status: 9, + custom_uptime_ratio: '0.000-0.000-0.000-0.000', + custom_down_durations: '86400-86400-86400-86400', + average_response_time: 0, + response_times: [], + logs: [{ type: 1, datetime: 1791000000, duration: 0, reason: { code: '403', detail: 'Forbidden' } }], + }, + { + id: 333333333, + friendly_name: '演示暂停项 C', + url: 'https://c.example.test', + type: 1, + interval: 300, + status: 0, + custom_uptime_ratio: '0.000-0.000-0.000-0.000', + response_times: [], + logs: [], + }, + ], +}; + +async function main() { + const { mapUptimeRobotMonitors } = await import(`file://${LIB.replace(/\\/g, '/')}`); + + // ---------- A. 映射单测 ---------- + console.log('\n[A] 映射单测(合成 payload,无网络)'); + const mapped = mapUptimeRobotMonitors(FIXTURE, { group: 'UR 测试', now: 1791880300000 }); + const [a, b, c] = mapped; + check('监控数量与 id 前缀', mapped.length === 3 && a.id === 'ur-111111111', `${mapped.length} 个,首个 id=${a.id}`); + check('status 映射:2→up / 9→down / 0→pending', a.status === 'up' && b.status === 'down' && c.status === 'pending', `${a.status}/${b.status}/${c.status}`); + check('延迟取最新一次样本', a.latency === 300 && b.latency === 0, `A=${a.latency}ms B=${b.latency}ms`); + check('故障时取故障日志里的 HTTP 状态码', b.code === 403 && a.code === null, `B.code=${b.code}`); + check('detail 含 UR 侧原因', b.detail === 'UptimeRobot:403 Forbidden', b.detail); + check('心率来自 response_times 且按时间升序', a.history.length === 3 && a.history[0].ms === 0 && a.history[2].ms === 300, JSON.stringify(a.history.map((h) => h.ms))); + check('离线目标的心率末尾补一条离线记录', b.history.length === 1 && b.history[0].ok === false, `${b.history.length} 条`); + check('聚合比率解析(1/7/30/90)', a.uptimeRatios['90'] === 99.95 && a.downSeconds['30'] === 200, JSON.stringify(a.uptimeRatios)); + check('端口型目标拼出 host:port 形式', b.url === 'b.example.test:22', b.url); + check('来源标识与协议标签', a.source === 'uptimerobot' && a.sourceLabel === 'HTTP' && b.sourceLabel === 'PORT', `${a.sourceLabel}/${b.sourceLabel}`); + check('映射结果不含 API Key 字段', !JSON.stringify(mapped).toLowerCase().includes('apikey'), '无泄露'); + + // ---------- C. 兼容接口 ---------- + console.log('\n[C] UptimeRobot 兼容只读接口'); + const cfg = path.join(TMP, 'monitors.json'); + const out = path.join(TMP, 'status.json'); + fs.writeFileSync(cfg, JSON.stringify({ + settings: { title: 't' }, + monitors: [ + { id: 'ok-site', name: '正常站点', group: '网站', type: 'http', url: 'data:text/plain,ok', expectStatus: [200], interval: 60, timeout: 5 }, + ], + }, null, 2)); + const child = spawn(process.execPath, [PROBER, `--config=${cfg}`, `--local-config=${cfg}`, `--out=${out}`], { env: { ...process.env, PORT: '8891' }, stdio: ['ignore', 'pipe', 'pipe'] }); + await waitForHttp('http://127.0.0.1:8891/api/status'); + const compat = await fetch('http://127.0.0.1:8891/api/v2/getMonitors').then((r) => r.json()); + const first = compat.monitors?.[0] ?? {}; + check('返回 stat=ok 与 pagination', compat.stat === 'ok' && compat.pagination?.total === 1, JSON.stringify(compat.pagination)); + check('字段与 UptimeRobot 对齐', ['id', 'friendly_name', 'url', 'type', 'status', 'interval', 'custom_uptime_ratio', 'average_response_time', 'response_times'].every((k) => k in first), Object.keys(first).join(',')); + check('id 为数字、type/status 编码一致', typeof first.id === 'number' && first.type === 1 && [1, 2, 9].includes(first.status), `id=${first.id} type=${first.type} status=${first.status}`); + check('custom_uptime_ratio 为 1-7-30-90 四位三位小数', /^\d+\.\d{3}-\d+\.\d{3}-\d+\.\d{3}-\d+\.\d{3}$/.test(first.custom_uptime_ratio), first.custom_uptime_ratio); + child.kill(); + + // ---------- D. 失败路径:Key 无效不得误判目标状态 ---------- + console.log('\n[D] 失败路径(无效 Key)'); + const badCfg = path.join(TMP, 'bad.json'); + const badOut = path.join(TMP, 'bad-status.json'); + fs.writeFileSync(badCfg, JSON.stringify({ + settings: { title: 't', uptimeRobot: { enabled: true, apiKey: 'ur000000-this-key-is-not-valid' } }, + monitors: [ + { id: 'only-site', name: '唯一目标', group: '网站', type: 'http', url: 'data:text/plain,ok', expectStatus: [200], interval: 60, timeout: 5 }, + ], + }, null, 2)); + const r = await runOnce([`--once`, `--config=${badCfg}`, `--local-config=${badCfg}`, `--out=${badOut}`]); + const badSnap = JSON.parse(fs.readFileSync(badOut, 'utf8')); + check('同步失败被记录为 ok:false', badSnap.sources.uptimerobot.ok === false, String(badSnap.sources.uptimerobot.error).slice(0, 60)); + check('同步失败不影响本地目标(无目标被误判为离线)', badSnap.stats.total === 1 && badSnap.stats.up === 1, `total=${badSnap.stats.total} up=${badSnap.stats.up}`); + check('未创建任何 UptimeRobot 镜像目标', Object.values(badSnap.monitors).every((m) => m.meta?.source !== 'uptimerobot'), '无镜像目标'); + + // ---------- B. 真实 Key 冒烟 ---------- + console.log('\n[B] 真实 Key 冒烟'); + if (!LIVE_KEY) { + console.log(' - 跳过(未设置 UPTIMEROBOT_API_KEY)'); + } else { + const liveCfg = path.join(TMP, 'live.json'); + const liveOut = path.join(TMP, 'live-status.json'); + fs.writeFileSync(liveCfg, JSON.stringify({ + settings: { title: 't', uptimeRobot: { enabled: true, apiKey: LIVE_KEY, pollIntervalSec: 300, group: 'UptimeRobot' } }, + monitors: [], + }, null, 2)); + await runOnce([`--once`, `--config=${liveCfg}`, `--local-config=${liveCfg}`, `--out=${liveOut}`]); + const live = JSON.parse(fs.readFileSync(liveOut, 'utf8')); + const mirrors = Object.entries(live.monitors).filter(([, m]) => m.meta?.source === 'uptimerobot'); + check('真实账号同步成功', live.sources.uptimerobot.ok === true, `count=${live.sources.uptimerobot.count}`); + check('拉到监控并全部映射', mirrors.length > 0 && mirrors.every(([, m]) => ['up', 'down', 'pending'].includes(m.status)), `${mirrors.length} 个`); + check('每个镜像目标都带展示元信息', mirrors.every(([, m]) => m.meta.name && Array.isArray(m.history) && m.uptimeRatios), 'name/history/uptimeRatios 齐备'); + check('快照中不含 API Key', !JSON.stringify(live).includes(LIVE_KEY.slice(-12)), '无泄露'); + for (const [id, m] of mirrors) console.log(` · ${id.padEnd(14)} ${m.status.padEnd(7)} ${String(m.latency ?? '-').padStart(5)}ms UR90天=${m.uptimeRatios?.['90']} ${m.meta.name}`); + } + + fs.rmSync(TMP, { recursive: true, force: true }); + const failed = results.filter((x) => !x.pass); + console.log(`\n结果:${results.length - failed.length}/${results.length} 通过`); + if (failed.length) process.exit(1); +} + +main().catch((err) => { + console.error('FAILED:', err.stack || err.message); + fs.rmSync(TMP, { recursive: true, force: true }); + process.exit(1); +}); diff --git a/scripts/verify-views.cjs b/scripts/verify-views.cjs new file mode 100644 index 0000000..50b381e --- /dev/null +++ b/scripts/verify-views.cjs @@ -0,0 +1,130 @@ +/** + * shiroko-monitor 四种视图验证(开发用,需 playwright) + * + * 覆盖:卡片 / 表格 / 大屏 / 极简 四视图的渲染数量、切换器、URL 指定、hideTargets 脱敏、无 JS 错误 + * + * 用法:NODE_PATH= node scripts/verify-views.cjs [baseUrl] + */ +const fs = require('node:fs'); +const path = require('node:path'); +const { chromium } = require('playwright'); + +const BASE = process.argv[2] || 'http://localhost:8787'; +const CONFIG = path.join(__dirname, '..', 'public', 'monitors.json'); +const CHROME = 'C:/Program Files/Google/Chrome/Application/chrome.exe'; +const results = []; + +function check(name, pass, detail) { + results.push({ name, pass }); + console.log(`${pass ? ' ✓' : ' ✗'} ${name}${detail ? ` — ${detail}` : ''}`); +} + +const SELECTOR = { cards: '.card', table: 'table.monitor-table tbody tr[data-status]' }; + +async function main() { + const browser = await chromium.launch({ executablePath: CHROME, args: ['--no-sandbox'] }); + const context = await browser.newContext({ viewport: { width: 1280, height: 900 } }); + const page = await context.newPage(); + const errors = []; + page.on('console', (m) => { if (m.type() === 'error') errors.push(m.text()); }); + page.on('pageerror', (e) => errors.push(`pageerror: ${e.message}`)); + + const snap = await fetch(`${BASE}/api/status`, { cache: 'no-store' }).then((r) => r.json()); + const shown = Object.keys(snap.monitors).length; + + // 默认视图:不带 ?view= 时应为表格 + await page.goto(`${BASE}/?source=api`, { waitUntil: 'domcontentloaded' }); + await page.waitForSelector(SELECTOR.table, { timeout: 15000 }); + check('默认视图为表格', (await page.evaluate(() => document.body.dataset.view)) === 'table', `data-view=${await page.evaluate(() => document.body.dataset.view)}`); + check('切换器只有两个选项(表格/卡片)', (await page.evaluate(() => document.querySelectorAll('.view-btn').length)) === 2, '2 个'); + + for (const view of ['table', 'cards']) { + await page.goto(`${BASE}/?source=api&view=${view}`, { waitUntil: 'domcontentloaded' }); + await page.waitForSelector(SELECTOR[view], { timeout: 15000 }); + // 等首次快照渲染完成(不再有 pending 条目)再截图,避免拍到「等待检测」中间态 + await page.waitForFunction(() => !document.querySelector('[data-status="pending"]'), null, { timeout: 40000 }); + await page.waitForTimeout(400); + const info = await page.evaluate((sel) => ({ + bodyView: document.body.dataset.view, + count: document.querySelectorAll(sel).length, + activeBtn: document.querySelector('.view-btn.active')?.textContent ?? '', + }), SELECTOR[view]); + check(`${view} 视图渲染 ${shown} 个条目`, info.count === shown, `count=${info.count}, 切换器=${info.activeBtn}`); + await page.screenshot({ path: path.join(__dirname, '..', 'docs', `screenshot-view-${view}.png`), fullPage: true }); + } + + // 切换器持久化:点击后写入 localStorage,刷新后仍生效(URL 不带 ?view= 时不覆盖用户选择) + await page.goto(`${BASE}/?source=api`, { waitUntil: 'domcontentloaded' }); + await page.waitForSelector(SELECTOR.table, { timeout: 15000 }); + await page.click('.view-btn:nth-child(2)'); // 卡片 + await page.waitForSelector(SELECTOR.cards, { timeout: 10000 }); + const saved = await page.evaluate(() => localStorage.getItem('shiroko.view')); + await page.reload({ waitUntil: 'domcontentloaded' }); + await page.waitForSelector(SELECTOR.cards, { timeout: 15000 }); + check('视图切换被记住(localStorage),刷新后仍为卡片', saved === 'cards' && (await page.evaluate(() => document.body.dataset.view)) === 'cards', `saved=${saved}`); + await page.evaluate(() => localStorage.removeItem('shiroko.view')); + + // dataFilter:仅配置 / 仅 UptimeRobot / 两者 + const cfgAll = JSON.parse(fs.readFileSync(CONFIG, 'utf8')); + const configCount = cfgAll.monitors.length; + const urCount = Object.values(snap.monitors).filter((m) => m.meta?.source === 'uptimerobot').length; + console.log(` 配置目标 ${configCount} 个,UptimeRobot 镜像 ${urCount} 个`); + const rawCfg = fs.readFileSync(CONFIG, 'utf8'); + try { + for (const [mode, expect] of [['config', configCount], ['uptimerobot', urCount], ['both', configCount + urCount]]) { + const c = JSON.parse(rawCfg); + c.settings.dataFilter = mode; + fs.writeFileSync(CONFIG, `${JSON.stringify(c, null, 2)}\n`); + await new Promise((r) => setTimeout(r, 900)); // 等探针热重载 + await page.goto(`${BASE}/?source=api&view=table`, { waitUntil: 'domcontentloaded' }); + if (expect > 0) await page.waitForSelector(SELECTOR.table, { timeout: 15000 }); + else await page.waitForTimeout(1500); + const n = await page.evaluate((sel) => document.querySelectorAll(sel).length, SELECTOR.table); + const snapNow = await fetch(`${BASE}/api/status`, { cache: 'no-store' }).then((r) => r.json()); + check(`dataFilter=${mode} 时面板与快照口径一致(${expect} 个)`, n === expect && snapNow.dataFilter === mode, `面板 ${n} 个,快照 dataFilter=${snapNow.dataFilter}`); + } + } finally { + // 还原并校验:测试改配置必须原样恢复,否则会静默改坏仓库里的配置 + fs.writeFileSync(CONFIG, rawCfg); + if (fs.readFileSync(CONFIG, 'utf8') !== rawCfg) { + fs.writeFileSync(CONFIG, rawCfg); + check('测试后配置原样还原', false, '首次还原后内容不一致,已重写'); + } else { + check('测试后配置原样还原', true, 'monitors.json 未被测试改动'); + } + } + + // hideTargets:开启后面板不渲染任何目标地址 + const raw = fs.readFileSync(CONFIG, 'utf8'); + const cfg = JSON.parse(raw); + cfg.settings.hideTargets = true; + fs.writeFileSync(CONFIG, `${JSON.stringify(cfg, null, 2)}\n`); + try { + await page.goto(`${BASE}/?source=api&view=cards`, { waitUntil: 'domcontentloaded' }); + await page.waitForSelector('.card', { timeout: 15000 }); + await page.waitForTimeout(800); + const leak = await page.evaluate(() => { + const html = document.getElementById('monitor-grid').innerHTML; + return /https?:\/\//.test(html) || /\d+\.\d+\.\d+\.\d+:\d+/.test(html); + }); + const target = await page.evaluate(() => document.querySelector('.card-target')?.textContent ?? ''); + check('hideTargets 开启后面板不渲染目标地址', !leak && target === '已隐藏', `target="${target}"`); + } finally { + fs.writeFileSync(CONFIG, raw); // 还原 + } + + // 429 是刷新限流保护在起作用(快速连续导航各触发一次强制探测),面板已优雅降级为只读数据; + // 这里只把 429 以外的错误视为失败 + const hardErrors = errors.filter((e) => !/429/.test(e)); + check('两种视图无 JS 错误(除限流保护外)', hardErrors.length === 0, hardErrors.length ? hardErrors.join(' | ') : `无;另有 ${errors.length} 次 429 —— 快速连续刷新触发服务端限流,面板已回退到只读数据`); + await browser.close(); + + const failed = results.filter((r) => !r.pass); + console.log(`\n结果:${results.length - failed.length}/${results.length} 通过`); + if (failed.length) process.exit(1); +} + +main().catch((err) => { + console.error('FAILED:', err.stack || err.message); + process.exit(1); +}); diff --git a/scripts/verify.cjs b/scripts/verify.cjs new file mode 100644 index 0000000..1702c0c --- /dev/null +++ b/scripts/verify.cjs @@ -0,0 +1,191 @@ +/** + * shiroko-monitor 端到端验证脚本(开发用,需 playwright) + * + * 覆盖: + * A. 热重载回归:改写 monitors.json 触发配置热重载后,/api/status 必须继续更新(历史 bug:接口冻结) + * B. 接口与文件一致性:/api/status 与 status.json 的 lastCheck 必须一致 + * C. 面板重渲染:跨越一个刷新周期后,页脚「更新于」必须前进 + * D. UI 断言:卡片数、心率图、90 格可用率条、统计栏 + * + * 用法:NODE_PATH= node scripts/verify.cjs [baseUrl] + */ +const fs = require('node:fs'); +const path = require('node:path'); +const { chromium } = require('playwright'); + +const BASE = process.argv[2] || 'http://localhost:8787'; +const CONFIG = path.join(__dirname, '..', 'public', 'monitors.json'); +const CHROME = 'C:/Program Files/Google/Chrome/Application/chrome.exe'; + +const sleep = (ms) => new Promise((r) => setTimeout(r, ms)); +const results = []; + +function check(name, pass, detail) { + results.push({ name, pass, detail }); + console.log(`${pass ? ' ✓' : ' ✗'} ${name}${detail ? ` — ${detail}` : ''}`); +} + +async function getJson(url) { + const res = await fetch(url, { cache: 'no-store' }); + if (!res.ok) throw new Error(`${url} -> HTTP ${res.status}`); + return res.json(); +} + +async function main() { + // ---------- A/B. 服务端数据新鲜度与一致性 ---------- + const cfgA = JSON.parse(fs.readFileSync(CONFIG, 'utf8')); + const cfgIdsA = new Set(cfgA.monitors.map((m) => m.id)); + const first = (await getJson(`${BASE}/api/status`)).monitors; + // 优先选配置里的自建探测目标;若当前 dataFilter 只展示外部数据源,则退化为一致性/新鲜度断言 + const probeId = Object.keys(first).find((id) => cfgIdsA.has(id)) ?? Object.keys(first)[0]; + const isProbeTarget = cfgIdsA.has(probeId); + const before = first[probeId].lastCheck; + console.log(`\n[A] 触发配置热重载(改写 monitors.json),监控目标 ${probeId}${isProbeTarget ? '(自建探测)' : '(外部数据源镜像)'}`); + console.log(` 热重载前 lastCheck: ${before}`); + // 原样写回(不改格式)即可触发 fs.watch 的 change 事件 + fs.writeFileSync(CONFIG, fs.readFileSync(CONFIG, 'utf8')); + + await sleep(12000); + const mid = await getJson(`${BASE}/api/status`); + if (isProbeTarget) { + check('/api/status 热重载后 12s 内已产生新检测', mid.monitors[probeId].lastCheck > before, `lastCheck=${mid.monitors[probeId].lastCheck}`); + } else { + // 外部镜像目标由数据源按自身节奏更新,热重载不会让它产生新检测;改为校验服务端仍在产出数据 + const ageSec = Math.round((Date.now() - new Date(mid.dataUpdatedAt).getTime()) / 1000); + check('热重载后接口仍持续服务且数据在节奏内', mid.monitors[probeId] != null && ageSec <= Number(mid.updateIntervalSec) + 30, `数据距今 ${ageSec}s / 节奏 ${mid.updateIntervalSec}s`); + } + + await sleep(60000); + const api = await getJson(`${BASE}/api/status`); + const file = await getJson(`${BASE}/status.json`); + if (isProbeTarget) { + check('/api/status 跨越一个探测周期后仍在更新', api.monitors[probeId].lastCheck > mid.monitors[probeId].lastCheck, `lastCheck=${api.monitors[probeId].lastCheck}`); + } + check('接口与 status.json 数据一致', api.monitors[probeId].lastCheck === file.monitors[probeId].lastCheck, `api=${api.monitors[probeId].lastCheck} file=${file.monitors[probeId].lastCheck}`); + const dailyKeys = Object.keys(api.monitors[probeId].daily ?? {}); + check('90 天可用率数据已聚合且不超过 90 天', dailyKeys.length > 0 && dailyKeys.length <= 90, `days=${dailyKeys.length}, today=${JSON.stringify(api.monitors[probeId].daily[dailyKeys[dailyKeys.length - 1]])}`); + check('统计包含 avgUptime90', api.stats.avgUptime90 != null, `avgUptime90=${api.stats.avgUptime90}`); + + // ---------- E. 刷新即重新检测 ---------- + console.log('\n[E] 刷新即重新检测'); + const cfg = JSON.parse(fs.readFileSync(CONFIG, 'utf8')); + const snapMeta = await getJson(`${BASE}/api/status`); + const expectedCards = Object.keys(snapMeta.monitors).length; + // 外部数据源(UptimeRobot)镜像目标不参与本地强制探测,其「最近检测」由数据源给出 + const externalIds = Object.entries(snapMeta.monitors).filter(([, m]) => m.meta?.source === 'uptimerobot').map(([id]) => id); + // dataFilter 只展示外部数据源时,配置目标不在快照里,探测类断言不适用 + const cfgIds = new Set(cfg.monitors.map((m) => m.id)); + const probeIds = Object.keys(snapMeta.monitors).filter((id) => cfgIds.has(id)); + const probeMode = probeIds.length > 0; + const forceIds = cfg.monitors.filter((m) => m.probeOnRefresh !== false && probeIds.includes(m.id)).map((m) => m.id); + // 显式 opt-out 的配置目标:不参与任何强制探测 + const optOutIds = cfg.monitors.filter((m) => m.probeOnRefresh === false && probeIds.includes(m.id)).map((m) => m.id); + const pre = await getJson(`${BASE}/api/status`); + const t0 = Date.now(); + const roundStartIso = new Date(t0).toISOString(); + const fresh = await fetch(`${BASE}/api/refresh`).then((r) => r.json()); + const roundMs = Date.now() - t0; + check('/api/refresh 等待本轮探测完成后才返回', roundMs > 100, `round=${roundMs}ms`); + if (probeMode) { + const ages = forceIds.map((id) => [id, Math.round((Date.now() - new Date(fresh.monitors[id].lastCheck)) / 1000)]); + const worst = ages.length ? Math.max(...ages.map(([, a]) => a)) : 0; + check('刷新后参与强制检测的目标全部产生新检测', forceIds.every((id) => fresh.monitors[id].lastCheck > pre.monitors[id].lastCheck), `${forceIds.filter((id) => !(fresh.monitors[id].lastCheck > pre.monitors[id].lastCheck)).join(',') || '全部前进'}`); + check('刷新后最旧数据不超过本轮耗时', worst <= Math.ceil(roundMs / 1000) + 3, `最旧 ${worst}s(轮次 ${Math.round(roundMs / 1000)}s)`); + // 外部镜像目标会被顺带同步(受 60s 最小间隔约束),故不在此断言其时间不变 + check('probeOnRefresh:false 的目标不参与强制检测', optOutIds.length === 0 || optOutIds.every((id) => fresh.monitors[id].lastCheck <= roundStartIso), optOutIds.length ? `${optOutIds.join(',')} 未参与(另有 ${externalIds.length} 个外部镜像目标由数据源同步)` : '无此类目标'); + } else { + console.log(` - 跳过强制探测断言:当前 dataFilter=${snapMeta.dataFilter},快照中无配置目标(${externalIds.length} 个外部镜像目标由数据源同步)`); + } + + // ---------- G. 刷新节奏对齐服务端 ---------- + console.log('\n[G] 刷新节奏对齐服务端(不再每访客重新计时)'); + const align = await getJson(`${BASE}/api/status`); + const cadence = Number(align.updateIntervalSec); + const updatedMs = new Date(align.dataUpdatedAt).getTime(); + check('快照带 dataUpdatedAt 与 updateIntervalSec', Number.isFinite(updatedMs) && updatedMs > 0 && cadence >= 5, `更新于 ${align.dataUpdatedAt},节奏 ${cadence}s`); + const browser = await chromium.launch({ executablePath: CHROME, args: ['--no-sandbox'] }); + const pageG = await browser.newPage({ viewport: { width: 1280, height: 900 } }); + await pageG.goto(`${BASE}/?source=api&view=table`, { waitUntil: 'domcontentloaded' }); + await pageG.waitForSelector('table.monitor-table tbody tr[data-status]', { timeout: 20000 }); + await pageG.waitForTimeout(1200); + const shownText = await pageG.evaluate(() => document.getElementById('countdown').textContent); + const shownSec = Number((shownText.match(/(\d+)/) ?? [])[1]); + // 期望值需在当前时刻重算:面板显示的是「服务端上次更新 + 一个周期 - 现在」 + const expectSec = Math.round((updatedMs + cadence * 1000 - Date.now()) / 1000); + check('倒计时对齐服务端下次更新时刻', Math.abs(shownSec - expectSec) <= 4, `面板 ${shownText}(服务端还有约 ${expectSec}s,节奏 ${cadence}s)`); + check('倒计时不会退化为从整周期重新计时', shownSec <= Math.max(5, Math.min(cadence, Number(cfg.settings.refreshInterval) || cadence)), `显示 ${shownSec}s`); + await pageG.close(); + + // ---------- F. 面板渲染与自动刷新 ---------- + console.log('\n[F] 面板渲染与刷新'); + const page = await browser.newPage({ viewport: { width: 1280, height: 900 } }); + const errors = []; + page.on('console', (m) => { if (m.type() === 'error') errors.push(m.text()); }); + page.on('pageerror', (e) => errors.push(`pageerror: ${e.message}`)); + + await page.goto(`${BASE}/?source=api&view=cards`, { waitUntil: 'domcontentloaded' }); + await page.waitForSelector('.card', { timeout: 15000 }); + await page.waitForTimeout(1200); + + const read = () => page.evaluate(() => ({ + cards: document.querySelectorAll('.card').length, + bars: document.querySelectorAll('.heartbeat svg rect').length, + uptimeCells: document.querySelectorAll('.uptime-cell').length, + uptimeCellsPerCard: document.querySelector('.card .uptime-bar')?.children.length ?? 0, + uptimeLabel: document.querySelector('.uptime-label')?.textContent ?? '', + uptimeLabelTip: document.querySelector('.uptime-label')?.getAttribute('title') ?? '', + statUptime: document.getElementById('stat-uptime').textContent, + stats: document.querySelectorAll('.summary .stat').length, + updated: document.getElementById('updated-at').textContent, + lastCheckTitle: document.querySelector('.card .metric b[title]')?.getAttribute('title') ?? '', + countdown: document.getElementById('countdown').textContent, + version: document.querySelector('.version')?.textContent ?? '', + })); + + const a = await read(); + console.log(` 首次读取: 卡片 ${a.cards},可用率条 ${a.uptimeCellsPerCard} 格/卡,标签「${a.uptimeLabel}」`); + check('卡片全部渲染', a.cards === expectedCards, `cards=${a.cards}/${expectedCards}`); + check('每卡 90 格可用率条', a.uptimeCellsPerCard === 90, `perCard=${a.uptimeCellsPerCard}`); + check('可用率标签含百分比', /90天\s*[\d.]+%/.test(a.uptimeLabel), `label=${a.uptimeLabel}`); + check('可用率悬浮提示含统计明细', /次在线/.test(a.uptimeLabelTip), `title=${a.uptimeLabelTip}`); + check('顶部 90天可用率统计已渲染', a.statUptime !== '–', `stat=${a.statUptime}`); + check('最近检测带绝对时间提示', a.lastCheckTitle !== '–' && a.lastCheckTitle.length > 0, `title=${a.lastCheckTitle}`); + check('版本号已渲染', /^shiroko-monitor v\d+\.\d+\.\d+$/.test(a.version), a.version); + + console.log(' 等待一个检查周期(70s)…'); + await sleep(70000); + const b = await read(); + // 自动刷新是只读的:页脚「数据更新于」只在服务端产出新数据时变化,故用倒计时重新对齐来判断面板仍在按节奏轮询 + check('面板持续按服务端节奏轮询(倒计时重新对齐)', a.countdown !== b.countdown, `${a.countdown} -> ${b.countdown}`); + if (probeMode) { + check('探测目标数据已流入面板(最近检测前进)', b.lastCheckTitle > a.lastCheckTitle, `${a.lastCheckTitle} -> ${b.lastCheckTitle}`); + } + + // 手动刷新按钮:参与的卡片都必须重新检测,opt-out 的卡片不应被带动(历史 bug:只有部分目标更新) + const readCards = () => page.evaluate(() => Object.fromEntries([...document.querySelectorAll('.card')].map((c) => [c.dataset.id, c.querySelector('.metric b[title]')?.getAttribute('title') ?? '']))); + const beforeCards = await readCards(); + await page.click('#refresh-btn'); + await page.waitForFunction(() => document.getElementById('refresh-btn').textContent === '刷新' && !document.getElementById('refresh-btn').disabled, null, { timeout: 45000 }); + await page.waitForTimeout(400); + const afterCards = await readCards(); + const notAdvanced = forceIds.filter((id) => !(afterCards[id] > beforeCards[id])); + const optOutAdvanced = optOutIds.filter((id) => afterCards[id] > beforeCards[id]); + if (probeMode) { + check('参与检测的卡片全部重新检测(手动刷新)', notAdvanced.length === 0, notAdvanced.length ? `${notAdvanced.join(',')} 未前进` : `${forceIds.length} 张全部前进`); + check('probeOnRefresh:false 的卡片不被手动刷新带动', optOutAdvanced.length === 0, optOutIds.length ? `${optOutIds.length} 张保持原时间${externalIds.length ? `(另有 ${externalIds.length} 张外部镜像由数据源同步,允许更新)` : ''}` : '无此类目标'); + } + + check('刷新过程中无 PageError', errors.length === 0, errors.length ? errors.join(' | ') : '无'); + + await page.screenshot({ path: path.join(__dirname, '..', 'docs', 'screenshot-desktop.png'), fullPage: true }); + await browser.close(); + + const failed = results.filter((r) => !r.pass); + console.log(`\n结果:${results.length - failed.length}/${results.length} 通过`); + if (failed.length) process.exit(1); +} + +main().catch((err) => { + console.error('FAILED:', err.stack || err.message); + process.exit(1); +});