From feb3df681c4a1e4ea0f34c7403167d2d8039feea Mon Sep 17 00:00:00 2001 From: MeowOS Date: Mon, 31 Aug 2026 05:25:28 +0800 Subject: [PATCH] =?UTF-8?q?feat(meowpanel):=20=E5=8F=AF=E9=80=89=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E9=89=B4=E6=9D=83=20(agent-196,=20=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E5=AE=9A=E6=A1=88)=20=E2=80=94=20panel.auth=5Fenabled(?= =?UTF-8?q?=E9=BB=98=E8=AE=A40)+panel.auth=5Fpass(=E5=B8=A6=E7=9B=90sha256?= =?UTF-8?q?=E4=B8=8D=E6=98=8E=E6=96=87);=20token=E4=BC=9A=E8=AF=9D(/dev/ur?= =?UTF-8?q?andom,TTL12h,=E5=86=85=E5=AD=98+=E5=8D=A1=E6=8C=81=E4=B9=85?= =?UTF-8?q?=E5=8C=96,=E9=9D=99=E6=80=81=E5=B1=8F=E8=94=BDsession=E6=96=87?= =?UTF-8?q?=E4=BB=B6);=20=E6=9C=AA=E5=90=AF=E7=94=A8=E9=9B=B6=E5=9B=9E?= =?UTF-8?q?=E5=BD=92,=E5=90=AF=E7=94=A8=E5=90=8E=20/api/*=20=E5=85=A8?= =?UTF-8?q?=E8=A6=81=E4=BC=9A=E8=AF=9D;=20=E5=89=8D=E7=AB=AF=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E9=A1=B5+401=E5=9B=9E=E8=B7=B3+=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E5=8D=A1=E7=89=87;=20=E9=A1=BA=E5=B8=A6=E4=BF=AE=20settings=5F?= =?UTF-8?q?write=5Fone=20=E5=AE=B9=E5=BF=8D=E7=AD=89=E5=8F=B7=E4=B8=A4?= =?UTF-8?q?=E4=BE=A7=E7=A9=BA=E6=A0=BC(=E5=8E=9F=E4=BC=9A=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E8=BF=BD=E5=8A=A0=E8=A1=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit meowpanel→f91856a4; 0 warning; 宿主curl 20例+headless Chromium 全过 --- patch_v2/meowpanel/README.md | 43 ++- patch_v2/meowpanel/meowpanel | Bin 178140 -> 187484 bytes patch_v2/meowpanel/meowpanel.c | 536 ++++++++++++++++++++++++++- patch_v2/meowpanel/meowpanel_host | Bin 144088 -> 145240 bytes patch_v2/meowpanel/web/index.html | 24 ++ patch_v2/meowpanel/web/meowpanel.css | 13 + patch_v2/meowpanel/web/meowpanel.js | 120 +++++- 7 files changed, 701 insertions(+), 35 deletions(-) diff --git a/patch_v2/meowpanel/README.md b/patch_v2/meowpanel/README.md index 47b67dd..76b057f 100644 --- a/patch_v2/meowpanel/README.md +++ b/patch_v2/meowpanel/README.md @@ -28,9 +28,10 @@ cd /home/Aska/Project/R3ProII/patch_v2/meowpanel - 两分支均以 `-Os -Wall -Wextra` 复核,**0 warning**。 - 产出(本次构建实测): - `meowpanel`:mipsel 静态,`ELF 32-bit LSB executable, MIPS, MIPS32 rel2, statically linked, stripped`, - 体积约 **166 KB**(固件阈值内)。md5:`11ed76ecb2e1c5773a01f0fb056a2df5`。 - - `meowpanel_host`:aarch64 动态链接(宿主编译,仅供调试),体积约 **77 KB**。 -- 依赖:仅 libc + Linux 内核头(`linux/input.h`),零第三方库(设备无 python3/lua)。 + 体积约 **183 KB**(固件阈值内)。md5:`f91856a44de0c8d12aba00cd40b44b91`。 + - `meowpanel_host`:aarch64 动态链接(宿主编译,仅供调试),体积约 **142 KB**。 +- 依赖:仅 libc + Linux 内核头(`linux/input.h`),零第三方库(设备无 python3/lua)。鉴权用**内联 SHA-256**(拷贝自 + `meow_verify/sha256.c` 公有领域参考写法,前缀 `mp_sha256_*` 避免符号冲突;**未改 `meow_verify/` 目录**)。 - 头文件引用:`-I patch_v2/meow_launcherd`(`meow_ipc.h` 帧格式 / `m_perf_*`/`m_power_*`/`POWER_*`, **header 为权威源**,结构体字段以它为准)。 @@ -64,7 +65,9 @@ http://.local:8080/ - mDNS 由板载 `meow_mdns` 应答 `.local`。 - 端口默认 **8080**,可用 `-p PORT` / 环境变量 `MEOWPORT` / 与后端同目录 `meowpanel.conf`(`port=N`)覆盖。 (优先级:`-p` > `MEOWPORT` > `meowpanel.conf` > 默认 8080。) -- 无鉴权(设备内网信任模型;token 鉴权为 MEOWPANEL_PROTOCOL §1.3 草案项,未实现)。 +- 无鉴权(设备内网信任模型;**可选**密码鉴权已实现,见 §5.9)。默认关=零回归;开启后除登录/登出/状态外 `/api/*` 需会话。 + - 上传/下载/管理类请求统一带 `X-MeowToken: `(或 `Authorization: Bearer ` / `Cookie: meow_token=`); + 缺/错/过期 → 401 `UNAUTHORIZED`。**默认无鉴权时请勿把 8080 暴露公网**。 --- @@ -75,6 +78,9 @@ http://.local:8080/ | 方法 | 路径 | 说明 | 实现 | |---|---|---|---| | GET | `/`、`/meowpanel.css`、`/meowpanel.js`、`/assets/` | 静态托管 | ✅ | +| GET | `/api/auth/status` | 鉴权状态(enabled/会话有效) | ✅(公开) | +| POST | `/api/auth/login` | 密码登录发 token(sha256 带盐校验) | ✅(公开;错→401) | +| POST | `/api/auth/logout` | 登出失效 token | ✅(公开;幂等) | | GET | `/api/status` | 性能+系统(`meow_svc_perf` IPC subset=all 透传) | ✅ | | GET | `/api/perf` | 仅性能(subset=perf 透传) | ✅ | | GET | `/api/system` | perf IPC + boot/network/ota 局部补全(network 含蓝牙,无网口;`ota` 只读检查,勿误触升级) | ✅ | @@ -211,6 +217,22 @@ http://.local:8080/ - **并发**:面板清空/删除用「写临时 + rename」重写日志;launcher 侧仍以 `O_APPEND` 追加,二者为竞写(低并发、会话级日志, 可接受),已写入「已知边界」(§7)。 +### 5.9 可选鉴权(panel.auth_enabled / panel.auth_pass) +- **设置键**:`panel.auth_enabled`(bool,默认 `0`=关)+ `panel.auth_pass`(str,存 `salt:hex`)。两者写 `settings.conf`, + 与实体设置页/CLI 同一存储契约(面板为独立进程,直接镜像文件)。`panel.auth_pass` 的 `GET /api/settings` 恒回 + `"value":"" + "set":`,**绝不回传存量哈希/明文**。 +- **门禁**:`require_auth` 在路由分发前执行——未启用直接放行(零回归);启用后除 `/api/auth/{login,logout,status}` 外全部 + `/api/` 需有效会话(token 头 / `X-MeowToken` / `Cookie meow_token`),缺/错/过期 → 401 `UNAUTHORIZED`。 + 危险端点(reboot/shutdown/ota、key 注入)在未开启时**不额外限制**(保持内网模型),开启后亦统一纳入会话校验。 +- **密码**:`PUT /api/settings/panel.auth_pass` 传明文,后端生成 16B 盐(/dev/urandom)→ `salt:hex`(sha256(salt||password)) + 落盘;空串=清除。校验时重算并恒定比较。**哈希/明文绝不进日志/响应**。`panel.auth_enabled` 置 1 时若未设密码 → 422 `请先设置面板密码`。 +- **会话**:`POST /api/auth/login` 校验后发 token(32B → 64 hex),存内存(`AUTH_MAX_SESS`=8,满淘汰最早过期)+ 卡上 + `/meowpanel.session`(` `,重启加载、防吊销失效),有效期 12h。`logout` 失效当前 token。 +- **静态屏蔽**:`serve_static` 额外拒绝后端可执行文件与 `meowpanel.session`(403),防 token 文件被 HTTP 读取。 +- **前端**:api 客户端统一带 `X-MeowToken`,收到 401 → 弹登录页(`#login` overlay);登录成功 token 存 `localStorage`; + 首次进入以 `/api/auth/status` 决定是否弹登录。设置页「面板鉴权」卡片含开关(`panel.auth_enabled`)+「设置/修改密码」 + 按钮(`panel.auth_pass`,走 `passwordDlg` 输入)。 + --- ## 6. 与协议的出入(「实现为准 + 原因」,供回改 MEOWPANEL_PROTOCOL.md) @@ -243,8 +265,9 @@ http://.local:8080/ ## 7. 已知边界 / 风险 - **单线程串行**:面板访问量极小,但并发请求会被排队(长上传/下载期间其它请求等待)。对面板用途可接受。 -- **无鉴权**:设备内网信任模型(协议 §1.3 token 鉴权待定案)。**高危端点**(`reboot/shutdown/ota/apps/删除/上传)无鉴权, +- **无鉴权(默认)**:设备内网信任模型(协议 §1.3)。**高危端点**(`reboot/shutdown/ota/apps/删除/上传)在默认关鉴权时无鉴权, 请勿把 8080 暴露到不可信网络。`meow_svc_power` 服务端做 `SO_PEERCRED uid==0` 基础校验(root 才受理动作),后端以 root 运行可过;launcher 电源菜单/后端同链路。 + **可选鉴权**(§5.9)开启后可对内网作加固(登录密码 + 会话),但密码经**局域网明文 HTTP** 传输,不提供 TLS。 - **IPC 服务未起**:`meow_svc_perf`/`meow_svc_power` 为板载 `trigger=boot` 服务,正常恒在;若异常退出,读侧返回 500 `INTERNAL`, 动作侧返回 500/503,绝不静默。请勿拔除这两服务。 - **升级保护**:`POWER_UPGRADE` 由 `meow_svc_power` 在写 mtd5 前校验卡根 `r3proii.upt`(存在/可读/非空/size>0),失败不写 mtd5;期望 md5/hash 校验留二期。 @@ -266,15 +289,15 @@ http://.local:8080/ ``` patch_v2/meowpanel/ -├── meowpanel.c # 后端源码(单文件,约 3150 行,-Wall -Wextra 0 warning) +├── meowpanel.c # 后端源码(单文件,约 3667 行,-Wall -Wextra 0 warning;含可选鉴权/内联 SHA-256) ├── build_meowpanel.sh # 交叉编译 + host 分支(-Wall -Wextra 0 warning) -├── meowpanel # 交叉产物(mipsel 静态,约 174 KB,md5 58a7b186…) +├── meowpanel # 交叉产物(mipsel 静态,约 183 KB,md5 f91856a4…) ├── meowpanel_host # 宿主编译(本机 ld,调试用) ├── services.d/ │ └── meowpanel.conf # 部署到 TF 卡 MeowOS/services.d/meowpanel.conf ├── web/ # 前端(已存在;部署时拷到后端同目录) -│ ├── index.html -│ ├── meowpanel.css -│ └── meowpanel.js +│ ├── index.html # 含登录页 overlay + 设置密码对话框 +│ ├── meowpanel.css # 含登录页样式 +│ └── meowpanel.js # API 客户端带 token/401 登录、设置页鉴权卡片 └── README.md # 本文件 ``` diff --git a/patch_v2/meowpanel/meowpanel b/patch_v2/meowpanel/meowpanel index 15cd1645ba92c20e1001d04087a482573a9e4c8c..e9a80583f200cda9e6c769fd5e6f4638ebce258a 100755 GIT binary patch delta 69666 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⋙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 + + + + diff --git a/patch_v2/meowpanel/web/meowpanel.css b/patch_v2/meowpanel/web/meowpanel.css index a5ce810..998e950 100644 --- a/patch_v2/meowpanel/web/meowpanel.css +++ b/patch_v2/meowpanel/web/meowpanel.css @@ -289,6 +289,19 @@ input[type=range]{ width:100%; accent-color:var(--primary); } .modal-body{ color:var(--on-surface-variant); margin:0 0 18px; word-break:break-all; } .modal-actions{ display:flex; justify-content:flex-end; gap:10px; } +/* 登录页(面板鉴权) */ +.login-scrim{ position:fixed; inset:0; z-index:70; background:var(--scrim); display:flex; align-items:center; justify-content:center; padding:20px; } +.login-scrim[hidden]{ display:none; } +.login-box{ background:var(--surface); border-radius:var(--radius-l); width:min(360px,100%); padding:28px 26px; box-shadow:var(--shadow); border:var(--outline-w) solid var(--outline-variant); text-align:center; } +.login-brand{ display:inline-flex; align-items:center; gap:8px; font-size:20px; font-weight:600; margin-bottom:6px; } +.login-brand-mark{ width:30px; height:30px; border-radius:8px; background:var(--primary); color:var(--on-primary); display:inline-flex; align-items:center; justify-content:center; font-weight:700; } +.login-sub{ color:var(--on-surface-variant); font-size:13px; margin:0 0 18px; } +.login-input{ width:100%; padding:11px 12px; border-radius:var(--radius-m); border:var(--outline-w) solid var(--outline-variant); background:var(--surface); color:var(--on-surface); font-size:14px; margin-bottom:12px; box-sizing:border-box; } +.login-input:focus{ outline:none; border-color:var(--primary); } +.login-err{ color:var(--error); font-size:13px; margin:0 0 12px; text-align:left; } +.login-btn{ display:block; width:100%; } +.modal .login-input{ margin-top:4px; } + /* 空态 / 加载 */ .empty{ text-align:center; color:var(--on-surface-variant); padding:48px 0; } .skel{ color:var(--on-surface-variant); } diff --git a/patch_v2/meowpanel/web/meowpanel.js b/patch_v2/meowpanel/web/meowpanel.js index 58e284d..65d6caf 100644 --- a/patch_v2/meowpanel/web/meowpanel.js +++ b/patch_v2/meowpanel/web/meowpanel.js @@ -10,6 +10,10 @@ const $ = (sel, root) => (root || document).querySelector(sel); const $$ = (sel, root) => Array.prototype.slice.call((root || document).querySelectorAll(sel)); + function storageGet(k) { try { return localStorage.getItem(k); } catch (e) { return null; } } + function storageSet(k, v) { try { localStorage.setItem(k, v); } catch (e) {} } + function storageDel(k) { try { localStorage.removeItem(k); } catch (e) {} } + function esc(s) { return String(s == null ? '' : s).replace(/[&<>"']/g, m => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' @@ -38,6 +42,7 @@ filesRel: '/', filesAbs: null, perfTimer: null, // 性能页轮询 route: 'perf', + unauth: false, // 鉴权未通过(弹登录页) downloadNonce: 0 }; @@ -54,13 +59,17 @@ // 返回 {code,message,status} 形异常;网络/非 JSON → 视为断连 async function api(method, path, body) { let res; + const headers = {}; + const token = storageGet('meowpanel.token'); + if (token) headers['X-MeowToken'] = token; const init = { method: method || 'GET' }; if (body instanceof FormData) { init.body = body; } else if (body !== undefined && body !== null) { - init.headers = { 'Content-Type': 'application/json' }; + headers['Content-Type'] = 'application/json'; init.body = JSON.stringify(body); } + if (Object.keys(headers).length) init.headers = headers; try { res = await fetch(path, init); } catch (e) { @@ -77,6 +86,7 @@ if (!json.ok) { setConn(true); const code = (json.error && json.error.code) || 'ERROR'; + if (code === 'UNAUTHORIZED') authRequired(); // 会话失效/未认证 → 弹登录页 throw { code: code, message: (json.error && json.error.message) || ('后端错误 ' + code), status: res.status }; } setConn(true); @@ -86,7 +96,10 @@ // 下载(返回 blob URL) async function apiDownload(path) { let res; - try { res = await fetch(path); } + const headers = {}; + const token = storageGet('meowpanel.token'); + if (token) headers['X-MeowToken'] = token; + try { res = await fetch(path, Object.keys(headers).length ? { headers: headers } : undefined); } catch (e) { setConn(false); throw { code: 'NETWORK', message: '后端未连接' }; } if (!res.ok) { setConn(true); throw { code: 'HTTP_' + res.status, message: '下载失败(HTTP ' + res.status + ')' }; } setConn(true); @@ -115,6 +128,65 @@ }); } + /* ---------------- 鉴权(可选密码登录) ---------------- */ + function authRequired() { // 任一路由收到 401 → 弹登录页 + state.unauth = true; + showLogin(); + } + function showLogin() { + state.unauth = true; + const lg = $('#login'); if (lg) lg.hidden = false; + const ip = $('#login-password'); if (ip) ip.focus(); + } + function hideLogin() { const lg = $('#login'); if (lg) lg.hidden = true; } + async function doLogin() { + const pw = $('#login-password').value; + const err = $('#login-err'); + if (err) err.hidden = true; + if (!pw) { if (err) { err.textContent = '请输入密码'; err.hidden = false; } return; } + const btn = $('#login-btn'); if (btn) btn.disabled = true; + try { + const d = await api('POST', '/api/auth/login', { password: pw }); + storageSet('meowpanel.token', d.token); + state.unauth = false; + hideLogin(); + toast('已登录'); + if (started) route(); else startApp(); + } catch (e) { + if (err) { err.textContent = (e && e.message) ? e.message : '登录失败'; err.hidden = false; } + } finally { + const b = $('#login-btn'); if (b) b.disabled = false; + } + } + function bindLogin() { + const ok = $('#login-btn'); if (ok) ok.addEventListener('click', doLogin); + const ip = $('#login-password'); if (ip) ip.addEventListener('keydown', e => { if (e.key === 'Enter') doLogin(); }); + } + function passwordDlg(title, body) { + return new Promise(res => { + $('#pwdlg-title').textContent = title || '设置面板密码'; + $('#pwdlg-body').textContent = body || '请输入新密码(留空则清除密码)。'; + const inp = $('#pwdlg-input'); inp.value = ''; inp.focus(); + const scrim = $('#pwdlg'); scrim.hidden = false; + const okb = $('#pwdlg-ok'), cancel = $('#pwdlg-cancel'); + const done = v => { scrim.hidden = true; okb.onclick = cancel.onclick = scrim.onclick = inp.onkeydown = null; res(v); }; + okb.onclick = () => done(inp.value); + cancel.onclick = () => done(null); + scrim.onclick = e => { if (e.target === scrim) done(null); }; + inp.onkeydown = e => { if (e.key === 'Enter') done(inp.value); if (e.key === 'Escape') done(null); }; + }); + } + async function setPanelPassword() { + const np = await passwordDlg('设置面板密码', '请输入新密码(留空则清除密码)。'); + if (np === null) return; // 取消 + try { + await api('PUT', '/api/settings/panel.auth_pass', { value: np }); + toast(np ? '面板密码已设置' : '面板密码已清除'); + renderSettings(); + } catch (e) { toast('设置失败:' + errText(e)); } + } + function bindPwDlg() { /* #content 点击委托在 bindSettings 里处理 pass 按钮;此处无需额外绑定 */ } + /* ---------------- 主题(MD3/MIUIx × 深/浅) ---------------- */ function applyTheme(style, theme) { state.style = style; state.theme = theme; @@ -487,6 +559,11 @@ /* ---------------- 5. 设置镜像页 ---------------- */ function settingControl(it) { const key = it.key; + if (key === 'panel.auth_pass') { + const txt = it.set ? '已设置' : '未设置'; + return '
面板密码(' + txt + ')
' + + '
'; + } if (it.type === 'bool') { return '
' + esc(key) + '
' + '
'; const items = d.items || []; + // 面板鉴权(可选防护)单独一卡 + const authItems = items.filter(x => x.key === 'panel.auth_enabled' || x.key === 'panel.auth_pass'); + if (authItems.length) { + h += '

面板鉴权(可选防护)

' + authItems.map(settingControl).join('') + + '

开启后访问面板需密码登录;密码以加盐哈希存储,不落明文。重启/关机/OTA 等危险操作亦需会话。

'; + } + const rest = items.filter(x => x.key !== 'panel.auth_enabled' && x.key !== 'panel.auth_pass'); // 按类型分组展示(bool 独立一卡,int/enum/str 各自卡片),便于查看 - const groups = [['开关/布尔', items.filter(x => x.type === 'bool')], - ['数值/滑条', items.filter(x => x.type === 'int')], - ['枚举/选择', items.filter(x => x.type === 'enum')], - ['字符串/路径', items.filter(x => x.type === 'str')]]; + const groups = [['开关/布尔', rest.filter(x => x.type === 'bool')], + ['数值/滑条', rest.filter(x => x.type === 'int')], + ['枚举/选择', rest.filter(x => x.type === 'enum')], + ['字符串/路径', rest.filter(x => x.type === 'str')]]; groups.forEach(function (g) { if (!g[1].length) return; h += '

' + g[0] + '

' + g[1].map(settingControl).join('') + '
'; @@ -542,6 +626,7 @@ else if (t.dataset.stype === 'str') updateSetting(sk, t.value, 'str'); }); c.addEventListener('click', async function (e) { + if (e.target.closest('[data-stype="pass"]')) { setPanelPassword(); return; } if (e.target.closest('#set-restore')) { const ok = await confirmDlg('恢复全部默认', '将把全部设置恢复为出厂默认(含主题/亮度/音量)。继续?', true); if (!ok) return; @@ -738,6 +823,7 @@ $('#menu-btn').addEventListener('click', () => $('#sidebar').classList.toggle('open')); } function route() { + if (state.unauth) { showLogin(); return; } // 未认证 → 登录页 const id = (location.hash || '#/perf').replace('#/', '').split('?')[0] || 'perf'; const r = ROUTES[id] || ROUTES.perf; state.route = id; @@ -748,14 +834,26 @@ } /* ---------------- 启动 ---------------- */ - function init() { - bindNav(); - bindThemeUi(); - bindSlider(); - bindFiles(); bindApps(); bindSettings(); bindRemote(); bindSystem(); bindLogs(); bindNotif(); + let started = false; + function startApp() { + if (started) { route(); return; } + started = true; initTheme(); window.addEventListener('hashchange', route); route(); } + async function init() { + bindNav(); + bindThemeUi(); + bindSlider(); + bindFiles(); bindApps(); bindSettings(); bindRemote(); bindSystem(); bindLogs(); bindNotif(); + bindLogin(); + bindPwDlg(); + // 首次进入探鉴权状态:启用且无有效会话 → 登录页;否则直接进应用 + let st = null; + try { st = await api('GET', '/api/auth/status'); } catch (e) { st = null; } + if (st && st.auth_enabled && !st.session) { showLogin(); return; } + startApp(); + } document.addEventListener('DOMContentLoaded', init); })();

?*v;f_^$Zj^k$0-t*Wto42@W8xp(RV4pFnWJTrWvUFJPp8RIv}?3^#%ri>T_Z-5+FMn{CuYY)i>tW}X5U8;BgAk-aT%IY1d(JJ(u+D2~Z&8&cEhVfmi4INKS7?f{GrfbdE9 z0dugewaRN?SkL^QAjetUoscvHFx~jaU^Mc$PUL+86VH{MYP=I=v9ugP${qKkW{-nr z*)NIglOfB~lW50esE~J)8Ktfrt=YKl+a$xXH3b;w$u4yN6g2eZltA0bn<=z*iY&Gc z>JkJ$sf#M-0qZdpTS}epg=yyOiuQOE1fJ^}KwzKXnbh2Jt(!?@g-nvs-D}D#OYA@c!JWWA{bf1MI&feRA0IK2!JE6N z;u+brX8JO@Q(D}2HWXDr1x1kDcbCg1(lXnKS8Tee2R5#hYlNk`z$kTwY*TY&l^iH7 zv3D6|GfyuYf!eW1pT0((6PBri8VXrTZC;ZDEhh#y#AMdI`Ut;$P)O|w5`;0qimOYps&yl^u;`1 zZP!9N{+Zc&;x}i*scWqSeu9!BP3w1q$~U5~tsIKY1w(1wM(GOMFf>%#FqHQ3Z|y!f z8t$Wd{I)ys+jgJSW{)Fp4O}R;`>3Esdcrua>d!Qdp(rdr)dm)8HD}{Qm&5 Cz`8mB delta 60691 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 diff --git a/patch_v2/meowpanel/meowpanel.c b/patch_v2/meowpanel/meowpanel.c index 9eb0d8d..c3625c4 100644 --- a/patch_v2/meowpanel/meowpanel.c +++ b/patch_v2/meowpanel/meowpanel.c @@ -56,6 +56,8 @@ #define DEFAULT_PORT 8080 #define SETTINGS_FILE "/usr/data/meow/settings.conf" #define SETTINGS_HDR "# meow-settings 1" +/* settings.conf 路径(可被 env MEOW_SETTINGS_FILE 覆盖,宿主测试用;默认设备路径)。 */ +static const char *g_settings_file = SETTINGS_FILE; /* TF 卡路径(运行期可覆盖,宿主测试用 env MEOW_TF_ROOT;默认设备卡挂载点)。 * TF_ROOT 保持为「数组宏」而非指针——让 -Wformat-truncation 能按 1024 尺寸分析拼接,避免误报。 */ static char g_tf_root_buf[1024] = "/usr/data/mnt/sd_0"; @@ -204,6 +206,7 @@ static int send_err(int sock, int status, const char *code, const char *msg); static int send_json(int sock, int status, const char *data); static int send_file(int sock, int status, const char *ctype, const char *abspath, const char *filename); static void panel_log(const char *fmt, ...); +static const char *web_root(void); /* 定义在文件后部;此处前向声明供鉴权会话路径使用 */ /* ---------------- CSV(enum 名/标签)非改写取值;定义在设置列表区,先声明供 settings_coerce 用 ---------------- */ static const char *csv_at(const char *s, int idx, char *buf, int buflen); @@ -481,6 +484,9 @@ static const setdef_t g_sets[] = { { "network.bluetooth_enabled", ST_BOOL, "0", 0,0, NULL, NULL, "网络" }, /* 系统 */ { "system.hostname", ST_STR, "meowos",0,0, NULL, NULL, "系统" }, + /* 面板(MeowPanel 自身,可选鉴权) */ + { "panel.auth_enabled", ST_BOOL, "0", 0,0, NULL, NULL, "面板" }, + { "panel.auth_pass", ST_STR, "", 0,0, NULL, NULL, "面板" }, }; #define SETS_COUNT ((int)(sizeof g_sets / sizeof g_sets[0])) @@ -492,10 +498,40 @@ static const setdef_t *setdef_find(const char *key) { /* ---------------- settings.conf 解析(照 meow_ui_vol_read / settings_get_int_trim) ---------------- * '=' 切分,key 去首尾空白精确匹配(防 audio.volume 误配 audio.volume_max)。 + * 路径取 g_settings_file(env MEOW_SETTINGS_FILE 可覆盖,宿主测试用)。 */ +static void settings_mkdir_p(void) +{ + /* 逐级创建 settings.conf 所在目录(mkdir -p 语义,容忍已存在)。 */ + char tmp[1024]; + snprintf(tmp, sizeof tmp, "%s", g_settings_file); + char *slash = strrchr(tmp, '/'); + if (!slash || slash == tmp) return; /* 无目录或根部 */ + *slash = 0; + if (!tmp[0]) return; + char buf[1024]; buf[0] = 0; + size_t i = 0; + if (tmp[0] == '/') buf[i++] = '/'; + const char *s = tmp + (tmp[0] == '/' ? 1 : 0); + while (*s) { + const char *tom = strchr(s, '/'); + size_t l = tom ? (size_t)(tom - s) : strlen(s); + if (l) { + if (i && buf[i - 1] != '/') buf[i++] = '/'; + if (i + l >= sizeof buf) break; + memcpy(buf + i, s, l); + i += l; + buf[i] = 0; + mkdir(buf, 0777); + } + if (!tom) break; + s = tom + 1; + } +} + static char *settings_get_value(const char *key) { - FILE *f = fopen(SETTINGS_FILE, "r"); + FILE *f = fopen(g_settings_file, "r"); if (!f) return NULL; size_t kl = strlen(key); char line[256]; @@ -544,8 +580,8 @@ static int brightness_clamp(int v) * O_TRUNC 重写。成功返回 0。 */ static int settings_write_one(const char *key, const char *val) { - mkdir("/usr/data/meow", 0777); /* 目录缺失自动建(与 meow_settings_save 同;失败由 fopen 兜底) */ - FILE *f = fopen(SETTINGS_FILE, "r"); + settings_mkdir_p(); /* 目录缺失自动建(与 meow_settings_save 同;失败由 fopen 兜底) */ + FILE *f = fopen(g_settings_file, "r"); char tmp[2048]; size_t n = 0; int c; @@ -554,22 +590,28 @@ static int settings_write_one(const char *key, const char *val) fclose(f); } tmp[n] = 0; - FILE *nf = fopen(SETTINGS_FILE, "w"); + FILE *nf = fopen(g_settings_file, "w"); if (!nf) return -1; size_t klen = strlen(key); int found = 0; if (n == 0) fprintf(nf, "%s\n", SETTINGS_HDR); - /* 逐行重写:头照抄;命中 key 行替换;其余照抄 */ + /* 逐行重写:头照抄;命中 key 行替换;其余照抄。匹配容忍 `key = value` 两侧空格(与 settings_get_value 同口径)。 */ char *save = NULL; for (char *ln = strtok_r(tmp, "\n", &save); ln; ln = strtok_r(NULL, "\n", &save)) { char *p = ln; while (*p == ' ' || *p == '\t') p++; - if (!strncmp(p, key, klen) && p[klen] == '=') { - fprintf(nf, "%s = %s\n", key, val); - found = 1; - } else { - fprintf(nf, "%s\n", ln); + char *eq = strchr(p, '='); + if (eq) { + char *k = p; + size_t km = (size_t)(eq - k); + while (km > 0 && (k[km - 1] == ' ' || k[km - 1] == '\t')) km--; + if (km == klen && strncmp(k, key, klen) == 0) { + fprintf(nf, "%s = %s\n", key, val); + found = 1; + continue; + } } + fprintf(nf, "%s\n", ln); } if (!found) fprintf(nf, "%s = %s\n", key, val); fclose(nf); @@ -630,8 +672,8 @@ static int settings_coerce(const setdef_t *d, const char *input, char *out, size /* 恢复全部默认:重写整个文件为 头 + 所有键 def。 */ static int settings_reset_all(void) { - mkdir("/usr/data/meow", 0777); - FILE *nf = fopen(SETTINGS_FILE, "w"); + settings_mkdir_p(); + FILE *nf = fopen(g_settings_file, "w"); if (!nf) return -1; fprintf(nf, "%s\n", SETTINGS_HDR); for (int i = 0; i < SETS_COUNT; i++) @@ -1232,6 +1274,9 @@ typedef struct { char *body; size_t body_len; char content_type[128]; /* 请求 Content-Type(若非空) */ + char authorization[256]; /* Authorization 头(Bearer ) */ + char x_meow_token[256]; /* X-MeowToken 头 */ + char cookie[512]; /* Cookie 头(meow_token= 等) */ } req_t; static void req_free(req_t *r) { free(r->body); r->body = NULL; r->body_len = 0; } @@ -1364,6 +1409,21 @@ static int read_request(int sock, req_t *r) while (*v == ' ') v++; snprintf(r->content_type, sizeof r->content_type, "%s", v); } + else if (!strncasecmp(hp, "Authorization:", 14)) { + char *v = hp + 14; + while (*v == ' ') v++; + snprintf(r->authorization, sizeof r->authorization, "%s", v); + } + else if (!strncasecmp(hp, "X-MeowToken:", 12)) { + char *v = hp + 12; + while (*v == ' ') v++; + snprintf(r->x_meow_token, sizeof r->x_meow_token, "%s", v); + } + else if (!strncasecmp(hp, "Cookie:", 7)) { + char *v = hp + 7; + while (*v == ' ') v++; + snprintf(r->cookie, sizeof r->cookie, "%s", v); + } hp = he + 2; } char *body_start = buf + hend + 4; /* body 实际起点 */ @@ -1396,6 +1456,391 @@ static int read_request(int sock, req_t *r) return 0; } +/* ================= 可选鉴权(panel.auth_enabled / panel.auth_pass) ================= + * 设计(MEOWPANEL_PROTOCOL §1.3 落地): + * - 键 `panel.auth_enabled`(默认 0=关)开关;`panel.auth_pass` 存「sha256 带盐哈希」格式 `salt:hex`, + * 绝不落明文,也绝不进日志/响应。 + * - 启用后,除 /api/auth/{login,logout,status} 外,所有 /api/ 端点需有效会话 + * (`Authorization: Bearer ` / `X-MeowToken: ` / `Cookie: meow_token=`)。 + * - 会话 token 由 /dev/urandom 生成(32B → 64 hex),存内存 + 卡上文件持久化(防重启失效),带过期。 + * - 未启用(默认)时鉴权门禁直接放行,行为与现状完全一致(零回归);危险端点不额外限制。 + */ +#define AUTH_TOKEN_TTL (12 * 3600) /* 会话有效期:12 小时 */ +#define AUTH_MAX_SESS 8 /* 内存最多保存的并发会话数 */ +#define AUTH_HASH_LEN 64 /* sha256 hex 长度 */ + +static char g_auth_session_file[600]; +static const char *auth_session_file(void) +{ + if (!g_auth_session_file[0]) + snprintf(g_auth_session_file, sizeof g_auth_session_file, "%s/meowpanel.session", web_root()); + return g_auth_session_file; +} + +/* ---- 最小 SHA-256(FIPS 180-4,公有领域参考写法;内联拷贝自 meow_verify/sha256.c,前缀 mp_ 避免符号冲突) ---- */ +static const uint32_t mp_sha256_k[64] = { + 0x428a2f98u,0x71374491u,0xb5c0fbcfu,0xe9b5dba5u,0x3956c25bu,0x59f111f1u,0x923f82a4u,0xab1c5ed5u, + 0xd807aa98u,0x12835b01u,0x243185beu,0x550c7dc3u,0x72be5d74u,0x80deb1feu,0x9bdc06a7u,0xc19bf174u, + 0xe49b69c1u,0xefbe4786u,0x0fc19dc6u,0x240ca1ccu,0x2de92c6fu,0x4a7484aau,0x5cb0a9dcu,0x76f988dau, + 0x983e5152u,0xa831c66du,0xb00327c8u,0xbf597fc7u,0xc6e00bf3u,0xd5a79147u,0x06ca6351u,0x14292967u, + 0x27b70a85u,0x2e1b2138u,0x4d2c6dfcu,0x53380d13u,0x650a7354u,0x766a0abbu,0x81c2c92eu,0x92722c85u, + 0xa2bfe8a1u,0xa81a664bu,0xc24b8b70u,0xc76c51a3u,0xd192e819u,0xd6990624u,0xf40e3585u,0x106aa070u, + 0x19a4c116u,0x1e376c08u,0x2748774cu,0x34b0bcb5u,0x391c0cb3u,0x4ed8aa4au,0x5b9cca4fu,0x682e6ff3u, + 0x748f82eeu,0x78a5636fu,0x84c87814u,0x8cc70208u,0x90befffau,0xa4506cebu,0xbef9a3f7u,0xc67178f2u +}; +#define MP_ROR(x,n) (((x) >> (n)) | ((x) << (32 - (n)))) +#define MP_CH(x,y,z) (((x) & (y)) ^ (~(x) & (z))) +#define MP_MAJ(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z))) +#define MP_BSIG0(x) (MP_ROR(x,2) ^ MP_ROR(x,13) ^ MP_ROR(x,22)) +#define MP_BSIG1(x) (MP_ROR(x,6) ^ MP_ROR(x,11) ^ MP_ROR(x,25)) +#define MP_SSIG0(x) (MP_ROR(x,7) ^ MP_ROR(x,18) ^ ((x) >> 3)) +#define MP_SSIG1(x) (MP_ROR(x,17) ^ MP_ROR(x,19) ^ ((x) >> 10)) + +typedef struct { uint32_t state[8]; uint64_t count; uint8_t buf[64]; size_t buflen; } mp_sha256_ctx; + +static void mp_sha256_init(mp_sha256_ctx *c) +{ + c->state[0] = 0x6a09e667u; c->state[1] = 0xbb67ae85u; + c->state[2] = 0x3c6ef372u; c->state[3] = 0xa54ff53au; + c->state[4] = 0x510e527fu; c->state[5] = 0x9b05688cu; + c->state[6] = 0x1f83d9abu; c->state[7] = 0x5be0cd19u; + c->count = 0; c->buflen = 0; +} + +static void mp_sha256_block(mp_sha256_ctx *c, const uint8_t *p) +{ + uint32_t w[64]; + int i; + for (i = 0; i < 16; i++) + w[i] = ((uint32_t)p[i*4] << 24) | ((uint32_t)p[i*4+1] << 16) | + ((uint32_t)p[i*4+2] << 8) | (uint32_t)p[i*4+3]; + for (i = 16; i < 64; i++) + w[i] = MP_SSIG1(w[i-2]) + w[i-7] + MP_SSIG0(w[i-15]) + w[i-16]; + uint32_t a = c->state[0], b = c->state[1], cc = c->state[2], d = c->state[3]; + uint32_t e = c->state[4], f = c->state[5], g = c->state[6], h = c->state[7]; + for (i = 0; i < 64; i++) { + uint32_t t1 = h + MP_BSIG1(e) + MP_CH(e,f,g) + mp_sha256_k[i] + w[i]; + uint32_t t2 = MP_BSIG0(a) + MP_MAJ(a,b,cc); + h = g; g = f; f = e; e = d + t1; + d = cc; cc = b; b = a; a = t1 + t2; + } + c->state[0] += a; c->state[1] += b; c->state[2] += cc; c->state[3] += d; + c->state[4] += e; c->state[5] += f; c->state[6] += g; c->state[7] += h; +} + +static void mp_sha256_update(mp_sha256_ctx *c, const uint8_t *data, size_t len) +{ + c->count += (uint64_t)len; + if (c->buflen) { + size_t need = 64 - c->buflen; + size_t take = len < need ? len : need; + memcpy(c->buf + c->buflen, data, take); + c->buflen += take; data += take; len -= take; + if (c->buflen == 64) { mp_sha256_block(c, c->buf); c->buflen = 0; } + } + while (len >= 64) { mp_sha256_block(c, data); data += 64; len -= 64; } + if (len) { memcpy(c->buf, data, len); c->buflen = len; } +} + +static void mp_sha256_final(mp_sha256_ctx *c, uint8_t out[32]) +{ + uint64_t bitlen = c->count * 8; + uint8_t *b = c->buf; + size_t bl = c->buflen; + int i; + b[bl++] = 0x80; + if (bl > 56) { + while (bl < 64) b[bl++] = 0; + mp_sha256_block(c, b); + bl = 0; + } + while (bl < 56) b[bl++] = 0; + for (i = 0; i < 8; i++) + b[bl++] = (uint8_t)(bitlen >> (56 - i * 8)); + mp_sha256_block(c, b); + for (i = 0; i < 8; i++) { + out[i*4] = (uint8_t)(c->state[i] >> 24); + out[i*4+1] = (uint8_t)(c->state[i] >> 16); + out[i*4+2] = (uint8_t)(c->state[i] >> 8); + out[i*4+3] = (uint8_t)(c->state[i]); + } +} +#undef MP_ROR +#undef MP_CH +#undef MP_MAJ +#undef MP_BSIG0 +#undef MP_BSIG1 +#undef MP_SSIG0 +#undef MP_SSIG1 + +/* ---- 鉴权基础 ---- + * 密码存储格式:`:`。salt 由 /dev/urandom 生成(16B → 32 hex)。 + * 校验时重算并比较,绝不反解、绝不在日志/响应中输出 hash 或明文。 + */ +static int auth_read_random(unsigned char *buf, size_t n) +{ + int fd = open("/dev/urandom", O_RDONLY); + if (fd < 0) return -1; + size_t got = 0; + while (got < n) { + ssize_t rd = read(fd, buf + got, n - got); + if (rd <= 0) { close(fd); return -1; } + got += (size_t)rd; + } + close(fd); + return 0; +} + +static void auth_hex(const unsigned char *raw, size_t n, char *out) +{ + static const char hex[] = "0123456789abcdef"; + for (size_t i = 0; i < n; i++) { + out[i*2] = hex[raw[i] >> 4]; + out[i*2+1] = hex[raw[i] & 0xf]; + } + out[n*2] = 0; +} + +static int auth_token_gen(char *out, int outcap) /* 32B → 64 hex */ +{ + unsigned char raw[32]; + if (outcap < 65) return -1; + if (auth_read_random(raw, sizeof raw) < 0) return -1; + auth_hex(raw, sizeof raw, out); + return 0; +} + +static int auth_make_salt(char *out, int outcap) /* 16B → 32 hex 盐 */ +{ + unsigned char raw[16]; + if (outcap < 33) return -1; + if (auth_read_random(raw, sizeof raw) < 0) return -1; + auth_hex(raw, sizeof raw, out); + return 0; +} + +static int auth_pass_hash(const char *salt, const char *password, char *out, int outcap) +{ + mp_sha256_ctx c; + uint8_t digest[32]; + if (outcap < AUTH_HASH_LEN + 1) return -1; + mp_sha256_init(&c); + mp_sha256_update(&c, (const uint8_t *)salt, strlen(salt)); + mp_sha256_update(&c, (const uint8_t *)password, strlen(password)); + mp_sha256_final(&c, digest); + auth_hex(digest, sizeof digest, out); + return 0; +} + +static int auth_make_hash(const char *password, char *out, int outcap) /* salt:hex */ +{ + char salt[33], h[AUTH_HASH_LEN + 1]; + if (auth_make_salt(salt, sizeof salt) < 0) return -1; + if (auth_pass_hash(salt, password, h, sizeof h) < 0) return -1; + snprintf(out, outcap, "%s:%s", salt, h); + return 0; +} + +static int auth_enabled(void) +{ + return settings_get_int("panel.auth_enabled", 0) != 0; +} + +static int auth_pass_set(void) +{ + char *v = settings_get_value("panel.auth_pass"); + int s = (v && v[0]) ? 1 : 0; + free(v); + return s; +} + +static int auth_verify(const char *password) +{ + char *stored = settings_get_value("panel.auth_pass"); + int ok = 0; + if (stored && stored[0]) { + char *colon = strchr(stored, ':'); + if (colon) { + *colon = 0; + char want[AUTH_HASH_LEN + 1]; + if (auth_pass_hash(stored, password, want, sizeof want) == 0 && strlen(colon + 1) == AUTH_HASH_LEN + && strcmp(want, colon + 1) == 0) + ok = 1; + } + } + free(stored); + return ok; +} + +/* ---- 会话(内存 + 卡上持久化) ---- */ +typedef struct { char token[65]; time_t expires; } auth_sess_t; +static auth_sess_t g_sess[AUTH_MAX_SESS]; +static int g_sess_n = 0; + +static int sess_find(const char *token) +{ + for (int i = 0; i < g_sess_n; i++) + if (!strcmp(g_sess[i].token, token)) return i; + return -1; +} + +static int sess_valid(const char *token) +{ + int i = sess_find(token); + if (i < 0) return 0; + if (g_sess[i].expires > 0 && time(NULL) >= g_sess[i].expires) return 0; + return 1; +} + +static void sess_add(const char *token, time_t expires) +{ + int i = sess_find(token); + if (i >= 0) { g_sess[i].expires = expires; return; } + if (g_sess_n >= AUTH_MAX_SESS) { /* 满:淘汰最早过期的一条 */ + int e = 0; + for (int k = 1; k < g_sess_n; k++) + if (g_sess[k].expires < g_sess[e].expires) e = k; + if (e < g_sess_n - 1) + memmove(&g_sess[e], &g_sess[e + 1], (size_t)(g_sess_n - 1 - e) * sizeof(auth_sess_t)); + g_sess_n--; + } + snprintf(g_sess[g_sess_n].token, sizeof g_sess[g_sess_n].token, "%s", token); + g_sess[g_sess_n].expires = expires; + g_sess_n++; +} + +static void sess_remove(const char *token) +{ + int i = sess_find(token); + if (i < 0) return; + if (i < g_sess_n - 1) + memmove(&g_sess[i], &g_sess[i + 1], (size_t)(g_sess_n - 1 - i) * sizeof(auth_sess_t)); + g_sess_n--; +} + +static void sess_save(void) +{ + FILE *f = fopen(auth_session_file(), "w"); + if (!f) return; + time_t now = time(NULL); + for (int i = 0; i < g_sess_n; i++) { + if (g_sess[i].expires > 0 && g_sess[i].expires <= now) continue; + fprintf(f, "%s %lld\n", g_sess[i].token, (long long)g_sess[i].expires); + } + fclose(f); +} + +static void sess_load(void) +{ + FILE *f = fopen(auth_session_file(), "r"); + if (!f) return; + char line[128]; + time_t now = time(NULL); + g_sess_n = 0; + while (g_sess_n < AUTH_MAX_SESS && fgets(line, sizeof line, f)) { + char tok[65]; + long long exp = 0; + if (sscanf(line, "%64s %lld", tok, &exp) >= 1) { + if (exp > 0 && exp <= (long long)now) continue; /* 已过期 */ + snprintf(g_sess[g_sess_n].token, sizeof g_sess[g_sess_n].token, "%s", tok); + g_sess[g_sess_n].expires = (time_t)exp; + g_sess_n++; + } + } + fclose(f); +} + +static void auth_cp(char *dst, int dcap, const char *src) /* 有界拷贝(防 -Wformat-truncation) */ +{ + size_t l = strlen(src); + if (l >= (size_t)dcap) l = (size_t)dcap - 1; + memcpy(dst, src, l); + dst[l] = 0; +} + +/* ---- 从请求提取 token(X-MeowToken → Authorization: Bearer → Cookie meow_token) ---- */ +static int extract_token(const req_t *r, char *out, int outcap) +{ + out[0] = 0; + if (r->x_meow_token[0]) { auth_cp(out, outcap, r->x_meow_token); return out[0] ? 1 : 0; } + if (!strncasecmp(r->authorization, "Bearer ", 7)) { + auth_cp(out, outcap, r->authorization + 7); + return out[0] ? 1 : 0; + } + if (r->cookie[0]) { + const char *p = strstr(r->cookie, "meow_token="); + if (p) { + p += 11; + const char *e = p; + while (*e && *e != ';' && *e != ' ' && *e != '\t') e++; + size_t l = (size_t)(e - p); + if (l >= (size_t)outcap) l = (size_t)outcap - 1; + memcpy(out, p, l); + out[l] = 0; + return out[0] ? 1 : 0; + } + } + return 0; +} + +/* ---- 鉴权门禁:启用后除 /api/auth 系列外全部 /api/ 端点需会话 ---- */ +static int require_auth(int sock, const req_t *r) +{ + if (!auth_enabled()) return 1; /* 默认关:零回归 */ + const char *p = r->path; + if (!strcmp(p, "/api/auth/login") || !strcmp(p, "/api/auth/logout") || !strcmp(p, "/api/auth/status")) return 1; + char t[65]; + if (extract_token(r, t, sizeof t) && t[0] && sess_valid(t)) return 1; + return send_err(sock, 401, "UNAUTHORIZED", "未认证或会话已失效"); +} + +static int api_auth_status(int sock, const req_t *r) +{ + int en = auth_enabled(); + int sess = 0; + if (en) { + char t[65]; + if (extract_token(r, t, sizeof t) && t[0]) sess = sess_valid(t); + } + sbuf_t s = {0}; + sA(&s, "{\"auth_enabled\":%s,\"session\":%s}", en ? "true" : "false", sess ? "true" : "false"); + int rc = send_json(sock, 200, s.b ? s.b : "{}"); + sbuf_free(&s); + return rc; +} + +static int api_auth_login(int sock, const req_t *r) +{ + if (!auth_enabled()) return send_err(sock, 400, "BAD_REQUEST", "面板鉴权未启用"); + if (!r->body || !r->body[0]) return send_err(sock, 400, "BAD_REQUEST", "缺少密码"); + jv_t *root = jv_parse(r->body, (int)r->body_len); + if (!root) return send_err(sock, 400, "BAD_REQUEST", "body 非合法 JSON"); + jv_t *pw = jv_obj_get(root, "password"); + if (!pw || pw->type != J_STR) { jv_free(root); return send_err(sock, 400, "BAD_REQUEST", "缺少 password 字段"); } + int ok = auth_verify(pw->str); + jv_free(root); + if (!ok) return send_err(sock, 401, "UNAUTHORIZED", "密码错误"); + char token[65]; + if (auth_token_gen(token, sizeof token) < 0) return send_err(sock, 500, "INTERNAL", "生成会话失败"); + time_t exp = time(NULL) + AUTH_TOKEN_TTL; + sess_add(token, exp); + sess_save(); + sbuf_t s = {0}; + sA(&s, "{\"token\":"); + sA_str(&s, token); + sA(&s, ",\"expires_at\":%lld,\"auth_enabled\":true}", (long long)exp); + int rc = send_json(sock, 200, s.b ? s.b : "{}"); + sbuf_free(&s); + return rc; +} + +static int api_auth_logout(int sock, const req_t *r) +{ + char t[65]; + if (extract_token(r, t, sizeof t) && t[0]) { sess_remove(t); sess_save(); } + return send_json(sock, 200, "{\"logged_out\":true}"); +} + /* ---------------- HTTP 响应写入 ---------------- */ static int write_full(int sock, const void *b, size_t n) { @@ -1721,7 +2166,12 @@ static void settings_item_json(sbuf_t *s, const setdef_t *d, const char *val) } else if (d->type == ST_BOOL) { sA(s, "%s", str_truthy(val) ? "true" : "false"); } else { - sA_str(s, val); + if (!strcmp(d->key, "panel.auth_pass")) { + /* 密码哈希绝不出现在响应里:value 恒空串,附 set 标志(是否已设密码) */ + sA(s, "\"\",\"set\":%s", val[0] ? "true" : "false"); + } else { + sA_str(s, val); + } } sA(s, ",\"def\":"); sA_str(s, d->def); @@ -1802,6 +2252,36 @@ static int api_settings_put(int sock, const char *key, const req_t *r) default: jv_free(root); return send_err(sock, 400, "BAD_REQUEST", "value 类型不支持"); } jv_free(root); + char hashbuf[200]; + /* panel.auth_pass:只落带盐哈希,绝不存明文;空串=清除密码 */ + if (!strcmp(key, "panel.auth_pass")) { + if (raw[0]) { + if (auth_make_hash(raw, hashbuf, sizeof hashbuf) < 0) + return send_err(sock, 500, "INTERNAL", "生成密码哈希失败"); + } else { + hashbuf[0] = 0; /* 清空 → 禁用密码 */ + } + if (settings_write_one(key, hashbuf) < 0) return send_err(sock, 500, "INTERNAL", "写设置失败"); + sbuf_t s = {0}; + settings_item_json(&s, d, hashbuf); + int rc = send_json(sock, 200, s.b ? s.b : ""); + sbuf_free(&s); + return rc; + } + /* panel.auth_enabled:启用前必须先设密码 */ + if (!strcmp(key, "panel.auth_enabled")) { + char coerced[256]; + if (settings_coerce(d, raw, coerced, sizeof coerced) < 0) + return send_err(sock, 422, "UNSUPPORTED", "值域/枚举非法"); + if (!strcmp(coerced, "1") && !auth_pass_set()) + return send_err(sock, 422, "UNSUPPORTED", "请先设置面板密码"); + if (settings_write_one(key, coerced) < 0) return send_err(sock, 500, "INTERNAL", "写设置失败"); + sbuf_t s = {0}; + settings_item_json(&s, d, coerced); + int rc = send_json(sock, 200, s.b ? s.b : ""); + sbuf_free(&s); + return rc; + } char coerced[256]; if (settings_coerce(d, raw, coerced, sizeof coerced) < 0) { return send_err(sock, 422, "UNSUPPORTED", "值域/枚举非法"); @@ -1838,6 +2318,15 @@ static int api_settings_batch(int sock, const req_t *r) case J_BOOL: snprintf(raw, sizeof raw, "%d", val->bval ? 1 : 0); break; default: if (nfail) sA(&fail, ","); sA(&fail, "{\"key\":"); sA_str(&fail, p->str); sA(&fail, ",\"code\":\"BAD_REQUEST\",\"message\":\"非法值类型\"}"); nfail++; continue; } + /* panel.auth_pass:只落带盐哈希(空=清除);panel.auth_enabled:启用前须已有密码 */ + if (!strcmp(p->str, "panel.auth_pass")) { + char hashbuf[200]; + if (raw[0]) { if (auth_make_hash(raw, hashbuf, sizeof hashbuf) < 0) { if (nfail) sA(&fail, ","); sA(&fail, "{\"key\":"); sA_str(&fail, p->str); sA(&fail, ",\"code\":\"INTERNAL\",\"message\":\"生成密码哈希失败\"}"); nfail++; continue; } } + else hashbuf[0] = 0; + if (settings_write_one(p->str, hashbuf) == 0) { if (nok) sA(&ok, ","); sA_str(&ok, p->str); nok++; } + else { if (nfail) sA(&fail, ","); sA(&fail, "{\"key\":"); sA_str(&fail, p->str); sA(&fail, ",\"code\":\"INTERNAL\",\"message\":\"写失败\"}"); nfail++; } + continue; + } char coerced[256]; if (settings_coerce(d, raw, coerced, sizeof coerced) < 0) { if (nfail) sA(&fail, ","); @@ -1845,6 +2334,13 @@ static int api_settings_batch(int sock, const req_t *r) nfail++; continue; } + /* panel.auth_enabled:启用前必须先设密码 */ + if (!strcmp(p->str, "panel.auth_enabled") && !strcmp(coerced, "1") && !auth_pass_set()) { + if (nfail) sA(&fail, ","); + sA(&fail, "{\"key\":"); sA_str(&fail, p->str); sA(&fail, ",\"code\":\"UNSUPPORTED\",\"message\":\"请先设置面板密码\"}"); + nfail++; + continue; + } if (settings_write_one(p->str, coerced) == 0) { if (nok) sA(&ok, ","); sA_str(&ok, p->str); @@ -2961,7 +3457,8 @@ static int serve_static(int sock, const char *path) /* 敏感名拒绝 */ const char *base = strrchr(full, '/'); base = base ? base + 1 : full; - if (!strcmp(base, "meowpanel") || !strcmp(base, "meowpanel_host") ) return send_err(sock, 403, "FORBIDDEN", "禁止访问可执行文件"); + if (!strcmp(base, "meowpanel") || !strcmp(base, "meowpanel_host") + || !strcmp(base, "meowpanel.session") ) return send_err(sock, 403, "FORBIDDEN", "禁止访问可执行/会话文件"); FILE *f = fopen(full, "rb"); if (!f) return send_err(sock, 404, "NOT_FOUND", "资源不存在"); fclose(f); @@ -2978,6 +3475,14 @@ static int handle(int sock, req_t *r) return serve_static(sock, p); } + /* ---- 可选鉴权门禁(启用后除 /api/auth 系列外全 /api/ 端点需会话) ---- */ + if (require_auth(sock, r) != 1) return 0; + + /* ---- 鉴权端点 ---- */ + if (!strcmp(r->method, "POST") && !strcmp(p, "/api/auth/login")) return api_auth_login(sock, r); + if (!strcmp(r->method, "POST") && !strcmp(p, "/api/auth/logout")) return api_auth_logout(sock, r); + if (!strcmp(r->method, "GET") && !strcmp(p, "/api/auth/status")) return api_auth_status(sock, r); + /* ---- 性能/状态 ---- */ if (!strcmp(r->method, "GET") && (!strcmp(p, "/api/status") || !strcmp(p, "/api/perf"))) return api_perf(sock, p); @@ -3118,6 +3623,8 @@ int main(int argc, char **argv) if (env && env[0]) g_sock_perf = env; env = getenv("MEOW_IPC_POWER_SOCK"); if (env && env[0]) g_sock_power = env; + env = getenv("MEOW_SETTINGS_FILE"); + if (env && env[0]) g_settings_file = env; /* 设置文件覆盖(宿主测试用;设备默认 /usr/data/meow/settings.conf) */ (void)read_port_config(); /* 应用 meowpanel.conf 的 port(env/-p 优先) */ /* 优先级:-p 已设则保留;否则用 conf/env(read_port_config 会写 g_port) */ @@ -3132,6 +3639,7 @@ int main(int argc, char **argv) signal(SIGPIPE, SIG_IGN); web_root(); + sess_load(); /* 加载卡上持久化的会话(防重启失效) */ panel_log("MeowPanel %s listening on port %d (web root %s)", PANEL_VERSION, g_port, web_root()); int lfd = socket(AF_INET, SOCK_STREAM, 0); diff --git a/patch_v2/meowpanel/meowpanel_host b/patch_v2/meowpanel/meowpanel_host index 109625526966acc73721e0e9cdb33ae410d7f1cc..8962f611c19eb35c2b6a6fe7bfe47cb9e2e50f91 100755 GIT binary patch literal 145240 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 k{&#e=;ChaXQ} z)t1`kD83Zk6418fZnfDKDzU8ue5qC2hNx7#{??lW)K=RCc}oyNQn;U#iaI1OG47Xf_r|NBR^MlXPZaMGi^-#}#Zr-ULzdq?ey{BbHg#feE-*fgWZB9ZhJvGdg+!yPC@VK zP|xYFNUiyw{gtm;huW8)Gv=X_iwmB;@OS_DX?vDdDsGfQS3QbGVOo5A}iPZ+(-t`Y8WKAMo@0fS2`w ze@P$kSNp&t^>HeC9`B?4nm)=8M?mJ17yS4AKIr@e@Kdd?d-^E9t`GRUKH%X#`aiyp z^4IoJzM_xv&oj_d(e3p<;Q!JGytEJaqkZ&eQXl>KO&{fR`zZfpALVcDqd))I2mFja z;Q!qR{+s$JU)M+Z_xmW{+6VliKH#_Yf&c72_;yhrbbG%KJm2f1e03lF`CA|G^giI$ ztzTcbs?z*-rL}U^ippj8SSyz#7w?Ridnn zoXW*zm5Uaa-CA+m5&%vWL9AO>EL^DnR4h=11$Qm8ZmnFpYKc|3eOnt$6; zlZ8RE!n$iI_RV6ITy^IHYuTMkmRPsmxoqK5aNb6{mrg8Oxw5ii>8+MJv2c~O>b5%; zs`L_5q;l0g%NCZ+FI#eFrM2P?A-`+ol7$PGQTvXCchFbUBZ~8X>yE`LP*!&Lt-jv& zG@~A9D0h1VFm*K!(?edCsF^^8CF)FN#ma@1cc@iA>WWo&-e%q5)LLdnPXUa&N|A5H zs)-gsTO^lq!t=}JXq@FB%#loc(&|3-k zEUvQ>HK(xnS4S6OP-A!sjx3H{2IW+Y-Jh+_yt=a$~7d8$}-+nr0TZ>+d&)k3Rc z{+%lfTdlftaoGy%R)^s);3?Lr&EnbDTvb$DcIiczOtrk% zi4%KXC-uA*SY=n0ez^?NFZ{YFzoPWZ#Y^s7y0Elj{*r|d^W?s?!^TKc(J;sqMhzFNCZebW;9HE`N{O zkKp$7xBj4x^Do30o^kV){)Nf!XT9UXwwZLAwa-oOFzJZ(zi!&W7w*RA`9Tra(JG%L ztd>>a`kx+rpbL)$;3xm!l%E@bAK&l5mj&RK1Uvs$2jKNCp8EsvxxaVHZw~0X$in{-12V+;OD#WWB~59`(Xh7MYnus0AB9GM;t_f@Xw>ChbK1xuXM{# z2*6jn@K^x8)`iarz-wLj+yLBb_r?JHA-DXZ0Q~O1I`qFk0Qd0J1>o2J(J5aafIs8n zZw$bH;lg(W;Lp48<^bGl_mu$rb+`Q60r-0^{KEkJeHVTp0RO~=cLv~IyVfVY=du3> z&Ugn0;2zy31mGT?f&e_n#WN=W_wXzVz&$+60`LVc{o?`n+3vXN18@(|)&P8p+n*f) zxYwVz18@&dG628I#d9D4ukh%0s5d=tb>Sld@H<@i_yByJ3!f8!dwAvs;I(e~@&NoX z7akA5Jv{dZ;NNX?=KZk%e3~b(0`MQZ_!|T8Mi;�Ds?_B0&ovc zX8`^u7f*&9U;cS==>r!&J^=UdObEa~cFV^C@Dnb)JOCf`p+mPt0r+qizB&NE(1kx1 zfO~lA1Mo}T@{Ixbmt1&D0Pf*=I{?4dE&pKv?(u)dk=}Ik@C**X=eu}v1Mnp-JQjdI z=)&g&;G10djRAPW8xB2J2jCu_cmV#4i>EFC_wY0Z;2xeG0r)N#&np4Ahv&lp+{1Gq z0B>>eSVw!))5DV+fO~kx2jFcko`L|}!*gQ*?%^p9z>m6kmIdG*p1J_s!}C}Gp8gkS zUbY6{9{;=&fO~ja0`TE3o@4-ijtjSr^`@JLCnEqq&n-V9055Ri1p&B+Cl-Kz+0`#| z1Mq1sp7H>Eh6`U5fM4apmj&QnyQ>56Tio*Z2jHIE+ZuqcaLYFa;P<%j<^cRVE<724 zdw4z!z#nkScLv~_T=?zvsd~48Zrf@B;z(r!KrR03Yt!rB+vOI-ljj z2M6FD9VP_e9-e{#{5%)WoB-Uj!xshMQ{3{)0`SXScsv0AiVLp~z&$)$1Mm{J{Eh(J z8`s+bxQ8bhfG=?I90tZTo$5`cHQcv=GRGQ1(_I+`o_0=!0ka@a*uxwFm6| zYxcp1c|e}8_~65R@D?9jyZGL}w|(#t9*}3!2OsH!f9Qjc^1%=I;NDpjWq11EV|?YU zlRf;SJxlLjh7bM)56E+{51!+LkMO~Beehf#JnDmw_rddg@CiP+_L#kY1wQyV56Cm- zgP-k#&+);}@xkZ%;OF|_H~Qe?eeiN0{5&6gkq@5lgD>;J&-cMs``{P&;Bg=PLLdBo zAKVqGCb!N9zt~s)F&}(_4_@zsa~!4n-&P;|(r&0_HTvLwxwOLvcSFFYRk&+x%# z_~3(m@R$!i!Uvz}gXj9-MLzg=AH3KHpWuVf^1%yy@Gtt{F(3R&AAF7vKHCSM>x0kn z!Ef}zukyjmeekP&@I^lOmwfPLKKM00_-Y^g%RYGA2mgu>e!mZXtq)%3gJ0)^Kjwp% z_~7+E_>cs}El4gE#u%U-iLv_~6(3;4{WX-a4^%XTynzW&bj4Z8))Z*VdiDnj>X< zRqOzH2Uu1^et2cq;Py#&Za8OePHyBa@6Y6IAul}HWh ze@MFBm)=4;e0fj%KPH{$OD9Md`O?pjp6^TloOHD>{Y%nYeCg*%@AjpiC*AH#?H6=%G?%#04vRbz14Y9ixXEbnbt*+3D zmwdMJw1&03-^*XfigmT+C~_2UEhlZ=IMhx?tS?V53{z{)3?3g4#hLsOk zs_?9)D|mK9tOWK~V|yekKU#mOO&bTSMZ@h4AsyY1mr%DP#@{)#Y1%lmbINSq@g$mF z0#_ULO`Y-C_I=dJr7ZSV*2H!H_E1|S)-`#$@VO^2__jx=P$J6q0{;DwW-q9_v!QcY)_pFBf=@mA&{?%c)mEoy}pZtBY|TQu))J z@-39-ut#_Kgui@$tLw1J4syz>|9zGPw<#MLolrlXqb&0|sVy?bq<^XOr>V)P(0q6j0{U0J&}4;&sTVE4_oVV(yW8Gy`L)Ge6p-y#;>jAA>OSt zYtPQGRoKNC4d4B>2cP&_I76(j4scwfGVmGaVwzU-u6fov>3GPpYt`R#t)_nTYbAW5 zF(v0&_q07}+2#G4ZwiM=-(cO7glAGOggaAHt)}O|84q<%X*T1HHC@58ow2kKhu7jw~4DvL`dJlnX6LoW``(JL|i+OhQRb#e&kb0lEm$A&bBsu zO5TaJvl)(cTyM+i%7b z>uMis+3#b&CM5$qXTyT=)-?WZV;p1Xmw_Lc-Nm@K4Lq63{zvUow$UmdV#6PeQJ$>b zkDB3G!!P@0cU6Gn0P@RmUn#J8#4!1t&bj``Oq%Px6`kpfwsox4%!!3q*9MyeMz|{#Zlm74``?%qW-#BBP7iu`n_%?(?_K};z4M&;BOy+A?I^+80_Q%^; z-`1j4ox2!svt>;#FWLV1p?NdmrJ{xtYhT!^c31Yd>~*`XgHX`Sqmj)#Ue?0-D7;e(&hulv%TZvTG2r}sVD|LONPr9UmcYMbiVAIai= zc14)J)`T09#c6g@loX~n%&dUafwvT3)7LY_DuS9 zvZi+W$#vG#<={!x{QLBSqATw)^yDMFdwpu38pGy^bro5mk0g7*TRH&RoLD;>nKP$> zu^AbY3|rfJ@dRVc8XW5qKV*fh?d502x(cYLIfq^eZ{8=KNM*;bFKRfzT8mTWV#;U^ z4#PJW@O}{bi3k0-4@bg=hh2WoKf)YVhcjQ>9L`*izRJIndO4PL@IvNlCHi7hIP;?n zm*;}K4Id5_&!uWY%u%@EM2+|?jdc=A9HE^y=0>{f(7Z^)p-5W(vC4j~9T`bTm$hTt zNiMe`7tsx^dl?7%>5^u6553%!oBU2mvY}yx>=N-~a&+t-@|W*o%^%K=HErr2Th96M z(qvBT9{RbsIc(kY(1Q<+N@m8I>cdvk8?4DA@Yl|8*5YE7<2?f#qn&44WCZ-5o!{iP ziH&Gvh1cf}bbT*<3q2lZZsB`u*X;Z}`kip=#;D6$8S*}~II*^fxh+Np%tD`h5j_$z zb9`d$^9_<+ieDU(Tw#u_*JBM)%UVCf%KV7?U8UT;IB4Z!a}AAe6l@W&IDCaJOe~>o zj@K=Xa9GSVO$zH6-2l`0;vr>*7; zJ6UtOeQa#V?s_t0=MA(PBC&X@^!d1~Py>3)-UprDe<9TM!EZxq^YY{irz3xPMh4o< z-Q~&Rf!N+WYX;irGV%x7{Y?HDc7Kz9hMlgbyH3qooQ=&3{gTCJ(mv~ue#mY&Yq4MN zwU`_mwzUSe{!V_=dirF|x2DfXk6*6!_ugm7-L%fBnfJyX$~m6CoI59_qLtRbQ$Aj* z3C9|k^F$lC%AxnaQ7?`iDE@v3+fFpjSv0XA6W+jXw)c=P8JUFMC%+kcx)PX23-wd< z>F!4)etC-i{F*xD*dmhIU-rv@*)w~|fO7hH8u{w8`lZ?wbCK@pEby(j%>@=X5)}Q`;b5TMq5qe znDc$puw`fPS83Vp*QT8(nbqpf9sFG?-$Swm8s)$4!814A)Gbr812Tm=-=e=K){369 z&<8!TVt*u*?~@hS%NcuU!{|D*hO(VCwDYn4%dhEYmF}G0fBEk-tkTV~{@2a85gPLz zlTS9`Lfe{CQBc8_Qtth^>n$s1FY)WfmoJ!LFUYXAQ3iiH+a`A1_yN8MGTF!g@%g?; zs9_fH+Qv(5@qF@0%l`YP=op^cc*?GK?TCE&yFKHa*-LiT)4yvN=gv3NmzSr}*LTyG z({7{sVa>VJe)-*t?U$|i#&?+`)3>?__B-DDjtMq;!GR|y*y4Mq|CiV;-uv83?B9Fu zk6mKF>b)Pn#Qv@KUU#wmqW6Bw1bdhF{=~)h^Sm?8mfEL~N0GF|Z%9LLctrM=S!#BCeu%pm{v1~(jG3AJi#9H?!l+w(fNxi z3S^7VBHtoE6%KvWc05(u9?3?24Nv?B?Uo-;P1ZV>e7KGDyiZfx%8?y8)JvltdQ18@ zaSnOm=Gs=|;QBmlesrF(_d^HpM_qe==D1xOXUeyr{Ld-h%zV(U;e#ms`ZH;@^&!uk z<2eQY%k$Wi@-ePs9hIPa=XKjwnm6B^;nv5xegLo5Ti8_tke#k?^4O=yG56iEnV##` zpPuaOTAYS&*bkkayC)S1cZu%JT4TtLW5~c8nct(8@=uu8L1{+EF|T!PGl(O-ILXe2 z?!%Z*Yu+U6NaQ2)oUievGtUmJC0crc{od`93&sK0yv0vv-k|B*U8zSuBRveBU>~av zf2FR{nrs){G8vj@5{rqKJWd_)L3^=f-voZ-d)>_9Y#SM0xBY9A?Y&n|wo~x#X_QmE zU<7rZr0o&Ncj4Q|e0I=Q(VQNf-!eEe6NhQvqWmt#YvK`uX7yU*@%~mRbN*;Eea9BE zcb?2S2#w90j|48eE{YwgzP5o&Yfw>g+7_sF{|CalJ!*$_dA9Y}7Y`T47K@vKAjr^Puu}?O$o~`L~-Vj~< zwu8s}sp6rA=e_wC?;9I_cDUPyf0lm7uz}QXuUyCMqF#K`j4t>c<*?==_!x?$ijy}O3 z@aSx0%=y^ol^4Dy86$h$qh%L9mHKGteqV;6I{}49a|WMza1Jrsa^&sdv1#^E@g6>R zRk~H$jKBXo%Ixap_h%+1FwT1X{&IYN&p)T1ii@;#KqJNcL|euE_EZ06a2`W{teri@ zPWFqJ;Gef9Gl$+2r%kJ$HF;fs>)?m1ch!G^woLu8#S8L=)?WbF% zVQA6@EQx>d1K^?yG7I}VR){V({YM9s-ij=F34FEJOffNj^~tlrU!$IMf#y^;q-+(v zoATp^*jmquo2ZW(V?A=E`P0-SWN?WGQ(Pj1Z}}YSs?Ee~vlFS?FDtkP`s8+{CMCzl z3X`3wNvzL0{JumqHpTv;Xonoqn7<7_YizRP(Mfye-(Fr&Mq5$(J`r8T*|n^lpGKB1 zkt}@G$i^Y+QzM3(1!TNs5NT+jN>^6<>Lx=gmxOh(+2%F zvwp=3J8#b|SQpMcsQrz~yqb;mto=$W^R<=XQR~|yqo7rG;vVR zwKikmZl|pH68>BN+4;SF3(3G9`S+WK_8E>n)a>d&`L&8!q>3~49D-MlKr^EY(;ZtC z{B@#}RX)XjlR6uY&hEN`_GGVr484-+GrOwr#kh6Z9WQyFeDK-YN6{QaXH6ka=JZQ3 zwxM145YS^CbdW56j`Fm#4V;CVJL$?w>V#tPR>@=WXQlPfM)9X`UPSp|yA{Ynwdrri zu?c*(1bEA{bc-&N#12Qj3F(#gPd%UEZ+N-)3L=}yDtlSLp&O>wrjogb7)d`2;ABS z`U`3Lu#NT$tB_eC(uxaeuSoknyVwsZ56^01jb2w~g%;liUubWsJe=0F%hUfi^p@-8 ztf6_}@odb;c$Y0&{#k09c%fWt(6t4dnQKo@S0hKxplmLCBIQFVgI?d&g`L1U`0rzm zPmwz~t?760u57-)^MsD}F=C5B-6$W@qpjyVdHfjUL($U8m}+SGJKBk1AB#SsrD)Ji z%UHbRY5Et(?n1vB|MUjE}Jmp}dJhFzz+H*PlpjLtd6B9w!`niof93 z{Lk~)&W4!gi9Jq@;hWSi#}?3emshBlOMShIAEWfSx8F=`6dj>4E3VhZ`+RIp*(;e3x56yGyC$&Kelt*Vmy!JSKN20Nq# zn&yWi@z&HjtD$Wy{xjn`daiZPk!-8!&y>q4Cq9mhGjU|{;MshYm95(9<{!%5G)nO2 zNh2e#^V$x^>6n*N&5!8p*>l<}@WUWBL>vq}O)jDrN}(WF~&fT37vCWIy|E%kL1L ze~XvYf72TM3FTE*Lb?VEw`^K_+>b2z4S8UHG2@dkw@XMHA((b73Fe{M-H~<#9OoKsy9kDnf1>cK`swGjMErbz*^Jp=jIFpYFXB z)T4Zv2z-7Td>-a3$3PPUK89@Y*3hAO1Biv;PuzSu`=6HK;r7`M&o6QG$Rv$jJlQT< z(Vz1E@r_?0PisWB5bIj=Yw~l$om0E*``p;_&G5JKH2!MpYwz6(bxu{Cs~KOp1s$0C zheMseOh!iLzeE{m(h8khM-q7} zUy$_*AB@Z&LL1@{y+1>lM=Z6IndsnMYfAgD>u#S?u+AF(k@z|minmq{Y~Hx8dD2Ix zlU6&!Sog_4A%oagkj+_sdu2gAx?gxETJZ;4!1X5ZoN?CjN^IK==WH1DG3l*5^>sV;OU67UL%n`TIb&UXfC9Kys;m-*^Lu1AJDH=@|1nIe6?4Pd}X|f zLt!UmCFY-jO+JzR^~K1k>~NvRC)^dL4*MXat9TDv!!8xy(f9o4fGM7-_uXg2OMXlm zxjp4wo)%{{w67Y41{;Kf`3ip;FQE^u*m~z>Q%39cyUzUP-$0sq8|w8vIB(6!!>cK? z4|#xWk&ZQe(3n#5tn;2EFBxI)=0s{TzPZU$e{J9~+U%hHH1_?g`BR-_%4$%*|8fL5 zL!RE1zs1e(0RI1&gCjRP>%*IaRK%gZODK{+f z5c6>rcoi!PWmdPg&x7`rQRGWje%mzBv$|xk(Py#caj)*OLR&VqyKnvm*BvUwobKAiGSQ>b_qC|z-`KnDS#E+_YbGqis>8p+ya|D(CkCS759WD zU~8VNDp~i38Ov8b7{_K9o>+NB>_P4Sqz3*G~InAZNR{S!vSAQQgFK6#oF^dTrt2^hv=RH0UpM?zQvYw@s#Bdo{0|8trB z*)OcF&lm@18Wb1lYQN9XD>G$xtSYegV&5tT@CEv#;aC zC<>vkVt0<6G=lxiu>A|xVtZty3mcvI8R-q?+?5j#`n9piomfy4@A%+DwD-iECnm%H zdYW~!?=t(p)TgmUg_3Q8Zw~)p;{|RR)9(XW_EyTg1&tJQRvE>d$!k>nIeJYNdbSi@ z`qhTdei6g(>t{dFDZeGS|75XOAM(lie(V#36UQdHGM{}Y$(yPHv8K%ftVuHlTFaY} z12eFf#D|l`ixZ~V+l%-k{?|Q*_%u6C|Eln%1v{bf@D$C=80)9mtAWMATYs8#*ziOg zzK~8(ew=#I&T01P(78Tc`NQ(BF!VJ#!@*HI-Tpc_9zL`9ymioNAae%3uBG6KyrMIA z)^e?Z%GEjZDx2e@gjX^>I%_&|DKl}S+b5?#)9q5yjMMaYkJ~rdh2rP#aWzl3uQuh1 z49)+AK6U3Em~I#Qa5VGY%|qR$7m>p}RAGaN$5{)F9kLgHta#b5L?|uZIuhLVtWD3~ zmAuosQ2ws#r`gNNr*D%qcEO@`)9od|EaLFH$!{~bG82Os!?U!fc)DzfnXDO8KBK=~ zt~Q8gia!J^;_S&oz&6t^`;Srh z`q)JAYsfxuOl5lZKqPNGdiIJ{n*ETBJ)c&lx%(bYtS6VYtx1>L$1D5Wqgng^i4KyS zH1HcQw|_z!dFrI=F1MxoJ4tIS53$x1J3vPz>Uei-w-Jd4c$aRKp6#p*oAbibGp8|b z$q+BEAL*xtikH$7?CW5oj9&aSbD*>n6C0hcv%2-ewO>01nK3&5NzzWNcvRxc)NdXL z-&bC#IBsKzHWe=tFQ~oZ$P*ju4jY?cXdvUG9 zQ?l=lwSPtLKwElZ+)*wOupcz)}ATHnqCYn*^hXfS<}SeS<^oR zR>7LC01p2h+@HQ_)Ii$R*}F{gWOJykxGS?&K8`;I&ip-` z8*}5WpMB!Q-FLaVyaPW=I@*h0lrxU6f$!guhdZsz#XqWl$jHM7@YQ!B4}XL_ByMTq za*~T@vo81Z_mBMbi>M(nQ$X!SG4^M1ojI#X|FYv>E2HcCm{R?9#M^;MbtDO2EU;lC7 zJ5NRm+3P{p1^lz(i0#CDf775dx?Vg{=jTLoqK zb0GV!9lJ|5-fU#5-`?xqn^R=M}zl=`TDxd8Lsx z-Z?<$e8Ng(i{f3_wypB{Bh2FhY{yOa!=Knp@=32Gp37KD76RW1{3-0l&GcFC@S!PF zW~D9uJ$~AZSH^K>gmVGdmtJ1Pvbsc*_b8+DHD^<%7F$ucKcdZ?(C6W%EpUuyjl4hp zrH${OOrQDzWzUV*J~+qi&j+dh_lfNKyym?1We0K!+IjD-dqN2ooNUfU*_@x#Katb+ z7~3)@=5{eE^Bdk5Y6Xj?~r8(mbg$-vVL z-Y4|_f`jV^ri}Cch~6XMlm6yCN#C{ZB?G3x_xKlGNzNjAu-1dX25?rDvkIBY{~_0Zp!s@U;`=lVA%d2!5FV8hn_4Snr6QP%)`}zjw~PA-+mJqyxVBvIXS&$ zdkkKhMc-19(|YZ(etyrr#~$g$1Lw2bQ9RM?Ps@jR3wibn_G7&EJ|kYTFzmG1_Vxb8 zraqh4c|H7{BnBAynQyP9GToNEtlbx~e?gzisTU=!J(r!NWsB6Ob0&jwtcyDNk~*`o zgFM+R_$S*X%eImxPq7eZ%wNB{-lxS-P|SlYgAq)b_^ACicOI zlOfChGuG5>bxu(~l7~WebVS%5M_uI^8-V(ywAW91fwQl&cV@EQ@au+{GZEy6eikoT zOP%=fl<8lb^4ib*CQtT6CvS&d8q;RRdm-gwpQffLeJk&OU_EM_&OZ1=>F)f0v^VIS z2ktp%C)w@Mq2qL`;Ry4kSi5ZUHrK~V7F)KV^MtUSS{G_av39S;|1h=+d9U-{UFNB< zJx6)O)dhRWpZDw2?U|$x4Vu}2f0wT~hkW1fVS9LeXb<=UG5GH(=-}DJvW1VZ_o=hH ze?BN#M4af-Q^$!E8`|Z{C5H}dGWgN;0ry*dm0^M6&-tisvp@uSQ z$B9K`<&R~)Wy4oqFv6^hqBp~wB`a#Ex>WJP7q4|NJZaa4cY72cNbl)s$3 zZd}JX>i{0nMR?c~?x9PdPgS3#O1=IB<040hduW|R(Bu1MTTGAiI!m$d0P}?py$@NV z^Cz;MYX@)I=$z5v{?5pF$;-@>^d|H({hUod6|YN;4Hqi@)Hb%i;kB?;+geYa?4REg z`)+5QIeA(6E5M=iU;a3aWJ9WWgpmh+-jmID1X>xsOOF^iupZl4YucBw= z6=&bTf#IKB)8AeVjC6}^2b}?^RT=gHlI$_-YymNrQqj1wc8sk#D|({8T>*VX=jnbL zrx*8<1Ke*c?FTO8KYpAWgIL|)eg*o;#z>;?EA!m*6to?R5f30wbkezG?Kiv+d_OYB z$Sux292%R^d;b``aq6_WG5mwPiAMZx3+BIoXVDe7dcD z*lt=qmTs>B7k%8`&0kNY8~ze+?V{|h%BTHZwEYI}@&W7nS=)poTHfD&23Q>1w!0tu z(rqp@JR0-EI@9f^fLXw1iYA(a<_qjiz?!kiyJ3^^?2W<)tQ%iOhW)Vc0W(xyP;oW$zN4S9QO$d@pDh~*9_`k5UJOusMrSPh{J9`6F0B|1b7XXiY{WnDevESz zhNpL)W_bEecsed0VCPj`ZTJQL^Axu;?(Vs|mwU3WXV`65#7oqsBX@>%$3UI)j(r+zYZqrIy4(4fc5+X%L-2(5TlTV!_M&eLzs^0) zjy&S%- zJ)0;yf_Q??Q+z;LX6rF`80jYCI}nJz6ond#9{wzK+IMSsW9$K>(URGmXJeY>B&Axo1H z`8LiSgNNu_2Wj?6kb}g|#CP!EEwt;{$UWx>CG*4^@(Xo0>l*4J`x4e%%l;3I5g8og z41@Y4T+$Z53)C&BVjZ8X9Kg{LgeBg0$Ln{GS)MrX7&X?&&{$ z&3Aor!`sHb)0vr?j6K+MjoUpQALPWBL<=J?7frO=)IKrtZrHYo_PfAx@vpmK8I$Zk z0c%EvB#A9-4y=o($m{0UR|a;=FvS*_v;5$BlizapY9jMk&7Pa|yKL>R3qQPVjW6mN z;KZ%+rQa&h!`f>|X3i{JHPzp;qy`{?59+?;YIvKul;%bHv9Rt zA+zV(Mp>O#5{>Hrj!(c7J()N(dZzJB9tWm7pxO_6hbLnl`X`?223VKWGd}GVZ9eA6 zk;+$2w*_A?>Wh~}$um0Em0g;jO8oucm?{oBV+zil)?t-m3jscWk9uU*Eoa!C4qvBn zXNGLeQyVr>uwL}z~2UEaO`{;T}Ma?bALa8|Aw`w979I0HYv9A3+X7s`iPP10YUu4u=Hq)hid zN>!#++C{8adqV!RG3L(N3(i>*V%Cj&xf^8R-wT({a7s)A%{HR_L`&1FeHU1-CbLjq4-$OR*j5w?t#vroQBB zA^h5b@9;-2ukK8f=j!&B=wnX$h?igQq-B#DTw9&AbbH!B&i0N$MndxijJIgXn0Zy) zWjMRpy6(qgtfB959$+hD+hT?DiIv!!xTmeVhGoY?%O^1|o$b`Ps-Uy_Hk7_;Eu38& zy6#8R-$_j9e&`y#C3IaLIArUdo#xA9-A3QFu2bJ{$g+kC*T3A`f8Me1$Vp5R3pqc2t4hsevzwuTm2BQI4fsq9|v5&8JZ%pdwK zmpRRW*ESQ2i@Njt!pEuY@LHYm?*qJ6Pam#fF0==s{=E!t@mv(1(p^dEEbqRgcvAZh zxqp{^6yCE7oQnCJSlf^DE4l;R-`#KInkyG+Z)kEjv|RVRJ(_gW(XzM-j4NHd1e$lhsb9xEd4OJhwS2+WI z-i?el<0sCyS-c8Q{IcFztPjc3Om%Em{{&j#`aSAWqABQe~p>Nu6e2;q~n~|rSn|m#p9&df` zBzN{1>)r?B8;^~Z4XFL4>_p<@)T4JX7cu&i!uFfujyHFo=90Y~#@0lc_yFsK(q0@h zjXpt(uBo)w8R`G?BjDZooa{bsaKwXb$|li1AwIHg7EdEPd)?>KyyRx;HHP zY%Ti6>gG?&rf#C2ZJ(w}`++C*g0&~q99_SgaTXbw;po$1%6FhMrNffx7JSV4D9+4$ z$b7TLwzU&8lir$-?|T+}tv-A6p!22Zux=WO{v+v!y1bvNfM4a{k=-E~| zmUvyn{y;GleAt1^Rr2Ck6a0r-F=zaZ-0ZlswAUQRa;(z7P+w~Y{%wg`gY3H)v$vP{ z3Gdx`69(B!NgKICdsEe}d<@Kqkq;Jk4|K2Hyc0J{j#ZsZ+w4uS_q>Ag zu?)%iF^RRjYYs)1sqWnHZOxYC0DO7o>vYW%v3|YZulFm6+4A0xcgELqUS;T}jf(eF zRXX`6kdchFJHLwj)#THsmQbBj<}hWPZy{wSmXr7A{?@iq+IolQWS;O;YdZat{8j(< zaaX1TeWP=-(QOWn4sd9G<$F@Tq>MFr4EopeoJ^hV+&S0T0~oYr1Mg4qu0B}YyZtfm z@=?>d!JHbehDE%`dEZ|%vq5w60kTW;p?T5T(R|d77-GNt5p^=j zs|?vQRR1u(&g@v%+K9DY?MaWm##8q&^%VWKYwV0s@0T)mkFGxh9;9o&kFGx6OEAjX9Z`|)ecH}EQ zA7zgBf~#5Ii*oxDY)|(XyW5&G3?FWQt=NWqXVES`e}o;q<_q?G?(Tm8uGneTq(M)sf5?dKec|Oy zXwNvxhj+)%IOk@@5q30b40DP&%F12;Y{`{(2}LZ$0u?@lICa zR&2T>++{mVUX|n*uxinBc;}REnvEFI9s5xHR(Iv(_q>HH(;iX3%G%b>%CpxSeMRi< zN5tfM-Bkkje%f>5cKz%>gI{G#`NrXaxb%p`pDEitFP+2fXVf3gK1v^twQ3)<#&fPa z_1-7@i2-(`PJWX2M693;d(E<{HcC&2bvONE$4*!Q&Bm7)o>&b2=eToQ&z-=WZS)!6K(Zib zlJ3M`z2>Iujl>d1C6>GOEY7Wuv_`#_x1aaiJd+LBI~253MSpS-JejxHD&Q*>DHdtc|MBFl)iG~zm2s^ zM)Z#V!W)-SF9e-CITLN-z`!`eT%x)$*;3p~XWkntJF_&NM%h|Lr6Wxoco#J3BsSh= z_EoYHkAqA7`xg5u@Oxuz?MVA5K5HbGJ+d6?gPBXutTX^*o<7$ zdV1gG*M0@X#B88#@i4{98)bW(LHX3Ww1)j2tmRBwadDM1_*pAy!p~Fd{M)=YBcmmX)^DnGh=&JV%iKl5l+d?-P`eVD5a?S;sbjzDI_{Ehs z*n6B?ki233-T{wrTrIx?8KXWdQh&H7d;}X?{A6%GHq!n%aMA1tbDD&o4IG zY4`&;4DXWnCHbUY8NPYZH__DFzt!o#A|+CsXLF*wAbE@Ur&zZd@-^o z{~gAgTQkJAGG=z&$vnv4Z${7b)n=8WFP--4Ms>@6#fRMecFx?4GT)6*T={lrb{TCP zMvfte>Tcpb_}bzrHg;;G=Jk0q_p)b4Bz~*+Vs}pGTw!B#cilvNojo`6Y-paH&v|%g z{?JD0*}nQYlNf_TgPwhapsnz~e<6l!z5y@_-!wDv-?Y#DQ|w25i!(FvC-sN>-&M0m z8=LA4<&&l_@GrL2n_2cBfHiaPTm3VzTSnWz1D5N+oN~v{H|vWt*4stv4~TI)YnE?Y zI69`WAN1E+l`X4v`2n&xN9|+t>AN|P@s2$^H94*4I|w0kKI>z$OS8J@yO$Z7ogqGj zW@@V)dg@#o_Fjo(uI5>E#Sb%OHW?oM)#txmg5Qy7y5om9<3=5UGuxf_T0^N_P$=)x|XwV(y8UhIe5OX%E!Zq_VeVYI`fII@+P=} zNwy6~mNmOR;AYkyPRq8Wn=U6Fr1d{iK16^9+AA?_HI6plq)FmCN(bBwU8uKB^-e!U zy_t?phb|dy>n?Az>eX=840(SqI#hc#ar(hG(d_S`>li0~Usj@%_ilR69n-xpF^srl z2W1Q3-|$be?V~kA-S55*PptlseoKeYuOqyR?m66V+ht^ZR-(g?a|bxx{aMZ5V4cei zjJe`~_EHK?@x8H^wkrOC{4Gq@loTf6-xrVz>Q80N>=7ko1C-K-_ZhGDUv*Z&TPNMV zbWNUpgZj+#TKX2lPHp2|v^WjA=9+J-WhJ)z`#t8YZu`C!dLA9?$Qq41ddpdMiZ!RR zM3-wW)F$me=e~;{qV?QYA>CF(KWXb1v|o>&Oit`slTqwQQ#R`|czbvvpYrYJJMybz z2G3XcCYt;>+ERWV`A3yz-o8U$-!rm}wp{%ZwI12{Aa=XTzCe5Odky|;hMVshneT#B z*ZotUjQB_Q8Xj6z$9*&QeJd|ruUHkj!<;)(Je+C_izA%b!3KiHXM$7oGVS0mY$46~*L^ z`>f|P+%f(mf7$Po4EoLkt@29_RbISaK8bvj|BGL;nf>0=H$Kq%Y32Fr_e+lBn;82J z8{gP>_$BLJjTUHqJoG{8(QL*&@Rh-e{J~i{v10+yh`@vo$&8u z=z0i#M#eNACqA>CJ6E%^E+7v*m5A~E2>D1O=sR)d_2sTF6({B^KSlWEOGWY9 zwhw<;XEPFKQ8(U|;+t&4UdtNH_f$@%ACynUeL#FE?tGz3b;d_AAijas+Vwv6G<`O3 z=%D*?6Tw?ilx<%@yNc)Kk~TgS=MvwA-_%E~@i1-4erU*hMkm2Q@^!QQr zoTJ~to`U*nY+v-!Ht^lRNg;EZsuZ)9x+ ze<)Vl8pU7D9oM`uSN;<*FU1h$Km8ZDwdS4n#vluG?6=h(x+#o5JyU0+i7&TfV?P7D z9NlmPJ6JNjyUvmv`!(_`>WmrT)fto6;+F5EEtPMFUZRtHutW4$wBl^F?gZ@N+_jNy zX3WU9Z>a9asma*p2a}_&T{H0GRB3%UR@nRzvflVm!xC3hMmB4e`4;7{#FcIzaw2>i zH8b|oC727dLyv-hq48S zC91)liw)A8VNE`5_XDlRE6-c6SY}nO;sj$7o<98v;~DVe_gars=CkH>S8#Mf>xx5N zMps*WJ6&x)iGHfzpPCdN`~B7rxc{5c`h9aIQo8O)<@oOP`aZa24|;yw2k_EH+A#4- z@PsM9#>Ji6;o$x*xSQMY!C8Z8f0BPcCL!G#8Xs@n7k=t-?oxNflf&$LT|63x$p_ar z1S9SF?oX1Ij}S|yrp|}&w4am5Iz7fYVanxyK>la=Iy%poHn?bw^&V@CeQIk&*_wv` zarP0lpI6@g)xu9%KXG%Wj`hmijnODPE~FIN7DM8^&AJFqK(q34@aPxm`kwvV#^ z%ozTmpH>_*c5uplo>BL>^qcwK7W^x{+9Kbr?b(Ml^yZlEakuUbUuuuMEM77Se0)Rhbm0#T{PU=2eAMXjo0=ZiJ>lprO^-iKo9pr- z2iu5eh37uNnI2~^Fwd(0!hmbW2@y zEBQvhWhP!A?@yV&Jamzl_iOSFQAg`xA!B!ZPUvrR)0lkupBFf`!atnHHk~OlbC{XX z9QI`|T=Twjj_z0_!{|!%Ovxzdv61!D4DUPo17EhxYIvBw9Vv@(UVU_;nmcEjAHm;h z@3-fBu-eH-&ljqZMIz}}}^^_EyuJKwPg!6znX9GKS`!u^f{P0F_FYn-qU1rWE7`lubYtN*9A^hj?WoF_xr1uu3?}`6mW|JxN z=2&|JY4q1}wJBVaC}S~4nuo73N7_$$i)VL#*-Jm4GCD8deD~C$?Iz^)zXo6%fobo{ z`MyxknJyDIb!Cfe?>6`r8x5Vqel+J|Qhd*1EPnSP&L)|D8s5z6wwr3%>-A()@H|%x zn_wkt&)JvO-LPWwO`yd7e;^Cbr_JKQ-Z}Y%hnxE{=KJkOBN6A0M!NHjGU>lx?sN3> zNaT1N-CeHpl<1LN*c6Y`zGBPGobS%GvR<1J$^2+5`>3pAY&ykYvJyinqxhKiG~>6g zHsA5A;!gX@@CaiE$!@3$k6gbFdr0TCi+sX^7InQ+!XA)+-!(BFf!s4@kw~;eIQ=TNRoV*O3S0HZ= z^7Jcbzq0X6@@AavoS)J+l%kvq%OU+2=4pOy=(=*wa}`milCxX7_g5Y_cjWVr4X}np zflDX9%-y=px1U|`BWV39{i&v2m0PdYtydMVGIua%{1jVw@cL1oP;L!+wiMe4yNKly zFWJqLdA9%2ogM#KTraMfsyW9WFEVmbXA^W+*6{Biop0R!61wi?eC{56U;K^9$v@8O z+7&oo`#N;RN2|j(t?L!ntU1SKjrH39)0yP|_Blm^xQ=Gr9cG1~^eTBjHu^PUA0v;1pD9)x93N-zn3G;Q$NLVc`e`8>v4;=% z;@x#7-d!ph_sEzoY&Ao3{*|SbI+ljR59@##v0^{F5-u6(7~@;Ppo}u>+R0jrn>gAVOz1ixaKV$ zFL{OiRJGTQ=aqA8e?03JXxUd^b`dvJKh$QhJ;k-eH{y-<2yHS~(T|~JF*Y}CCup~A zEOB}IBfnt1_=OlAZIvd0|A%99RTnTJI!~6;+jwNH{Uo%CLK`OD6z7Op-J2; zn{}?O^QY)G@DH^Il9%KTVD}iy&+U%Y|CVyP_vd|2w@Usz{axQ-`eV+}3dds7$lgSp zJ>wCyJCeT<#P17<-)n9Ck^FMjnc~U=@T-QKSi0`~4^L#MeeO`VX&;hw8tHP9 z9brv%_pP43jUR7EiQ(w%huZ!K-Px=E*YF!`?%ur4;)xFoeffQ~SFv+905h?$_L_eh z3qxLa+w9`Shx06Rrq0Ny`v$o>78^y?*TziDP?r|SrOgElqZ)Seapx^)OY{M_PTNuQtvx#0^*M93I z8~uAe#YRSEB{tKC+$o9`yJLLnJo^b?8t+kP6MgeM=66`)QDE0IPsq;6vVGdd@+}s= zt9S+WO8xho`KvsBp5ak*AB6dVwpqesaKDmoe+wMVm+E_O)9ne=L#{N%PIAVE^v~KQ z@6heMpM@>$?K6u$m7V$C{U`P{^6i<#Cf&1Q;2xETt~%eI4oq!fCnciw=hNp=iK)O8 zQ*in~x#sh2ozcU{l7Y^GfIoPmCSAeX!xo&RQEryUuA-B_Y;A;><$S1+t& zZ#vF5I=b5}xX8X(eS-Fa{nXzlzLPVaG{0k=B_Cz`^*Q$K$SdQU@V<<9$=4A#j}NXg+N)U26MtaneLQ7zeDKpR*x%*7h_SrPGs;tE)|B4I zI^I8&Z%}i$!s0H+I?lxGV-NlJ!$I&)avA zJ(WC*yfNg}x_KS&f%+Id?(o=4{yxo}(A}q4`H9R$UZYRA7>I|pQ%0PHw+k4J^hECb^bApCuZc*`8$G>uXUR4=gHNV+BLpB z#dm}^`jp~LS&4heJIuUErtU*`Z^G_#^7Wf1(!CotevI#_vYW$J*1kx;e65i}_-213 zEnnxf$B~}QQ@;sU$5XMJhk3G&S{2t&U4wJS#dbOEJ?@rOTwi4s7nZ-KxNvvbWtZ4r zrR+<7*tm)I$MB#0L~E@zSvZaUDVS)#4?OPJmW}4F2|8JN-aA84^+L+bag=+3o*p%} zZXf3h-$Ms?TfE#Xsmv^w+7<2=y!Z&6uIcBJGjSz>b&R6<@CHbxovF4_-48A!<9HEReoiX%Q8S*;G^Hgnq>lAHP`Pw|myJ_>q$()~L z{c+AXjX93w##?I}C!!In22pBU#1FQ;#BP}Iz_vczIKydyLD4+ zt!?+57XYQJ`a{23)E~)WeXB~}x-#XFJ98=fHf7B@LFhRG`Btu2 z19CNK<|3rM1Tz<%oOOxOekVSi&ZUX|g8ix+hAc)WO4c9ayGdUK@2SQpe=InkT%7Bk z&!6yaXuD*p(bI}^XHap*OlbEo3e;zm(7p)*Gp!;>HC`nz2Xsm|KvvQc=xsT zW4S_xGNB4N{t~}isI?-zS}R)1 zTF3W;TX(mNPe;GzB5O9_2XC5>o@cLI_}>SAU-Pl++r8(uFIo5{ekV)wE_~6)=qK}| zb=Vi)(0x64y>FuRg_|>eJ-CyF_D77#8f;D84v*`6T9fv0btVd(zu6aGY^!m2Ni_4v z7IWYwzb=iQqHd_#n@oAL28c!JPFCF0x$r=_ zdw%TO^0fjuD!%FBAWk(792UOfQRCkXH~Y(7%$@iGe9YVM#OdH@CN3l$C4O^s{up~@ z$jTDWs!T1kqD@m~iCf0dgKsE%u^8DwKY)i%;?t|n=F9osF!l6pDdGN_hkLM$N$Ii9}ImOIXgw(e^X9+ zTWuBdE}d=iT^%m{{UzDk@YcPw`6m4|?TOdsOtZhPG5!Ny+r0As&TG#e@$p*SG<)tp z!M$tQ{~b3!EZ@V&Z%?xe!Oi?l>K;q!bbAu8IA=6M$lzT5e&@*o_@=%O+jH|0mv44V zw|@cO5QEM)x}5KL)DFJf(dFP3|8rx2MwIF-E5J*pC~qu_Pm#z@J)|-XQ)laSCFu-{4!w zre6cEu&;!V4L!7_D7c)Fq&zL07y|X+|kXBr& z>X7q0r;m|-g!^y1s5=AstM5+iLjKkaiE>ZWDenX{#Q!Q${s!!w2J{3z zT#4){oij3hD!sx!M7gJdSmQ{-7sU18@Tcbm_|-i5c0{y*t3d;xebe$jVz#;nyk zv;Gr(w>p+)HHe?Et3->!&BRe9Pe;K|CeCHx@Kf?~dnUAvK_5di=+lO*lZ_~uCAs6> zC3ue_EgY&BrOp-9 zk^QPUJvKBxYUi5p@;LnR)X>-(`dwPTX5>)aeR*osEo<5|X5n7s;I44@1s(yn?k~c- z`LkVKsPf7#m59NGUM38X-mnmSqmfx%;4J5ihkhqs z>sdUfa}V%CSDZ6T@)L!BG&({)>f6XfZ!L0}plcp@gv0qpv-a1s5`zDnGj@W@pA`Q+ zH!9Y388N^ZcXN`=Svxv#4DIMU^P3{si-|#(rmk@2#>5%Fx%Q0?>XviQN&BiHzR^7a zJR|sq@b-4j`@H}ku@9v4CTdgTj2@2I7tl#`Yd(9z(1_%CtmvzQp*X ze8Y*d|0(;6cFfs2;FW@fF;Fq^OzhQ#)d7>e zF8KCpVx81eo1$M7yZ9+^*Z-Hk|Lx96X_~zWnCvCi?}2t=y~1ZLNV6}6M`DAte#h9q zL+;CFW?gJIyjPFS3*IX69^VB#CRyo=KUBHvM=^#Neb9P7hj_QvbKJqvQi(03IFb4i zO{UpbYoF8X*JdTIf`3grooV(2%6R@QYv1v2nX5ASw>(Ar%f0e*`q|?s@A|7Pz5G?= z&+G3>wr3?Sp?r@`JuLC>>@!JD?qZId@%6L0%VhjdBU`BJ+2cP0hrXxc^FJFu=YOg^ zywylq-H9U$uKi07(|TogyA|c6BrU7m_twZnVFV;(dRVGh$Mqzgotq_4uZ;KP>e_vFruO$ zOcHai_r`le)ZCcF7|cH}qDkygZIX&GbE9+l({p(-Vi=j^K+O=!fSG#uY zs&o1@jS=lp;Ws%pIM2NtG`gm@++k4|H8eQO8=Q%v`?Fi zdgN!m13u-OopbsmeDrAOr{?oT;P1tmwy*^{I~TUFAF(B)XEvbIJlF!wVT!H!cxH%q zb1soFN1C0~qOX?#13Dw7xSn)(>hojhgMJ<-Kck*~SL^c2h;^thdDN%0*!Tg5PkKvW zGOfJWaRz9g+0_raX9D&G*he#QK9({5_z3a;?=BugzgNlEDO#US`0%^+Ul-3tuYsHn z`8)vWO1#ed%9r9f<-cGoPk>JN(LLUC;JawtPdp^{RFi=rVx?)zAHuy+>?>)0?jpH} zsbPPZ8=vpOyN@q8@j&YSEar{0O}uZA%1|dCb=3VbZnrO<+4Wgq{0#Y@O8AXm!#-e( zgg1@Vo1js>FQHx!zQdfjxcCZ}j~+RK`)I^j2gpaChMuC%xV`O|Gt$o;pY-;*U4Nl6 z$Rb({WoWZgmY=8UY9)N^WMC9752_}mk6FG{0ixUy1zZ2z2n7wo21;15nVq;o%c}&8y4?T!1}?j z={*YYue2T%q5tsfh!ro~`vqLf`rJ3akG77I?vU|=M-orb7?Ukt34hRo-voOI@38Bo zSW2zmc=zYmA!8pO6YRw>2Xipy?O4 z3i?QA6*PBf&qs5IeGB6Z`cjHHHe!9u!xbDGwti6hw)Z_0T>I{P-^9g^~U zA&Y2VuhuVo*P{XP68Rp|chdT^l5x(}gax&avLm=o^6WXQYc`dU&7lVytm$g)u^uLLF+k_&AJO% zd48Q4s|moW7w@xpSK>oHlrZ`T>pu4{IA@@783T+uI_NnI-1EV+P`5%h?Zr1^FHU3g z2l!B6F_ZfY+^-JX5$?XQ6Gc=k>JF$&&8^fS@{>-e3M z%13w2gATxPmN>&ZcN%@~elO+3<^`yy#{3Rk_k4u!5UVlwl&_qGv)=bp>qRG>50Jj6;U`4jWIwQ85S{i@ zYVEhsC)%_94(ky0_kUsS;e8&O*!8xo|EyRS#8|#Crt4Pf*QePmd|7Wx?~{p{@58p} z**Ln#kXMd(k`iWEYkte0FJ#YRJjMFJ# M)(Lyst4t~%E1u`W^DnQ07k&gW>P20@ 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 eoWnXlN^eD@dol_;MWb}?G*SP8v + +