From 608229a49704f241fdb5912c0ad561693f7698d5 Mon Sep 17 00:00:00 2001 From: TIAN <1846195334@qq.com> Date: Fri, 9 Oct 2026 16:43:58 +0800 Subject: [PATCH] Improve Android app UI and controller flows --- 各种归档/20261009_网页图层UI修正/README.md | 40 + 各种归档/20261009_网页图层UI修正/all.log | 248 ++ .../browser-ui-extra.json | 10 + .../20261009_网页图层UI修正/browser-ui.json | 51 + 各种归档/20261009_网页图层UI修正/cleanup.log | 3 + .../20261009_网页图层UI修正/colors-320.png | Bin 0 -> 40755 bytes .../20261009_网页图层UI修正/colors-390.png | Bin 0 -> 41881 bytes .../colors-desktop.png | Bin 0 -> 19429 bytes 各种归档/20261009_网页图层UI修正/copy-320.png | Bin 0 -> 27167 bytes 各种归档/20261009_网页图层UI修正/copy-390.png | Bin 0 -> 28899 bytes .../20261009_网页图层UI修正/copy-desktop.png | Bin 0 -> 30916 bytes .../copy-dirty-desktop.png | Bin 0 -> 10678 bytes .../data-preservation.json | 8 + .../20261009_网页图层UI修正/deployment.log | 130 + .../20261009_网页图层UI修正/hygiene-final.log | 1 + 各种归档/20261009_网页图层UI修正/hygiene.log | 1 + .../20261009_网页图层UI修正/installed.log | 1 + .../isolation-node.log | 95 + .../isolation-retest.log | 125 + .../isolation-unit-retest.log | 2 + .../20261009_网页图层UI修正/isolation.log | 184 ++ .../move-exit-desktop.png | Bin 0 -> 54979 bytes 各种归档/20261009_网页图层UI修正/node.log | 95 + 各种归档/20261009_网页图层UI修正/prepare.log | 14 + .../production-browser.json | 20 + .../production-dialog.json | 19 + .../20261009_网页图层UI修正/verification.log | 4 + .../20261009_网页多图层与扩展画布/README.md | 52 + .../all-final-retest.log | 248 ++ .../all-final.log | 679 +++++ .../all-ready.log | 248 ++ .../desktop-final.png | Bin 0 -> 33696 bytes .../device-browser.json | 15 + .../device-cleanup-confirmed.log | 1 + .../device-cleanup.log | 2 + .../device-deployment-deploy-ready.log | 130 + .../device-desktop-menu.png | Bin 0 -> 31708 bytes .../device-mobile-menu.png | Bin 0 -> 26015 bytes .../device-ready-verification.log | 5 + .../device-rest.log | 2 + .../hygiene-complete.log | 1 + .../hygiene-ready.log | 1 + .../installed-source.log | 1 + .../isolation-final.log | 9 + .../isolation-ready.log | 57 + .../media-formats.log | 16 + .../migration-edge-python.log | 2 + .../mobile-320.png | Bin 0 -> 23523 bytes .../mobile-layers.png | Bin 0 -> 26336 bytes .../node-ready.log | 95 + .../text-drag-final.png | Bin 0 -> 34022 bytes .../text-resize-final.png | Bin 0 -> 45955 bytes .../windows-file-retest.log | 2 + 整体开发需求/01_网页配置端需求.md | 113 +- 核桃派软件源代码/FEATURE_UPDATED_AT | 2 +- 核桃派软件源代码/README.md | 8 +- 核桃派软件源代码/app/animations/store.py | 103 +- 核桃派软件源代码/app/config/store.py | 10 +- 核桃派软件源代码/app/main.py | 38 +- 核桃派软件源代码/app/scene_layers.py | 168 ++ 核桃派软件源代码/app/static/app.js | 4 + .../app/static/canvas-tools-model.js | 6 +- 核桃派软件源代码/app/static/index.html | 53 +- 核桃派软件源代码/app/static/pixel-png.js | 54 + 核桃派软件源代码/app/static/scene-board.js | 289 +- 核桃派软件源代码/app/static/scene-model-v1.js | 577 ++++ 核桃派软件源代码/app/static/scene-model.js | 694 +---- 核桃派软件源代码/app/static/style.css | 36 + 核桃派软件源代码/app/static/ui-copy.json | 892 ++++-- .../app/static/vendor/fflate/LICENSE | 21 + .../app/static/vendor/fflate/README.md | 7 + .../app/static/vendor/fflate/fflate.js | 2665 +++++++++++++++++ 核桃派软件源代码/app/static/views/canvas.js | 140 +- 核桃派软件源代码/app/static/views/layers.js | 121 + .../app/static/views/templates.js | 2 +- 核桃派软件源代码/app/static/views/text.js | 35 +- 核桃派软件源代码/app/templates/store.py | 52 +- .../scripts/check_layers_browser.mjs | 155 + .../tests/test_animation_preview_fixture.py | 2 +- 核桃派软件源代码/tests/test_animations.py | 2 +- 核桃派软件源代码/tests/test_canvas_tools.mjs | 4 +- 核桃派软件源代码/tests/test_config_store.py | 4 +- 核桃派软件源代码/tests/test_scene_layers.mjs | 77 + 核桃派软件源代码/tests/test_scene_layers.py | 189 ++ 核桃派软件源代码/tests/test_scene_model.mjs | 31 +- 核桃派软件源代码/tests/test_templates.py | 8 +- 核桃派软件源代码/tests/test_ui_copy_editor.py | 11 +- .../如何测试/本机测试环境/local_test.py | 1 + .../如何测试/核桃派点阵屏控制服务测试流程.md | 37 + 移动端相关内容/开发要求/跨端兼容与变更记录.md | 8 + 90 files changed, 8103 insertions(+), 1133 deletions(-) create mode 100644 各种归档/20261009_网页图层UI修正/README.md create mode 100644 各种归档/20261009_网页图层UI修正/all.log create mode 100644 各种归档/20261009_网页图层UI修正/browser-ui-extra.json create mode 100644 各种归档/20261009_网页图层UI修正/browser-ui.json create mode 100644 各种归档/20261009_网页图层UI修正/cleanup.log create mode 100644 各种归档/20261009_网页图层UI修正/colors-320.png create mode 100644 各种归档/20261009_网页图层UI修正/colors-390.png create mode 100644 各种归档/20261009_网页图层UI修正/colors-desktop.png create mode 100644 各种归档/20261009_网页图层UI修正/copy-320.png create mode 100644 各种归档/20261009_网页图层UI修正/copy-390.png create mode 100644 各种归档/20261009_网页图层UI修正/copy-desktop.png create mode 100644 各种归档/20261009_网页图层UI修正/copy-dirty-desktop.png create mode 100644 各种归档/20261009_网页图层UI修正/data-preservation.json create mode 100644 各种归档/20261009_网页图层UI修正/deployment.log create mode 100644 各种归档/20261009_网页图层UI修正/hygiene-final.log create mode 100644 各种归档/20261009_网页图层UI修正/hygiene.log create mode 100644 各种归档/20261009_网页图层UI修正/installed.log create mode 100644 各种归档/20261009_网页图层UI修正/isolation-node.log create mode 100644 各种归档/20261009_网页图层UI修正/isolation-retest.log create mode 100644 各种归档/20261009_网页图层UI修正/isolation-unit-retest.log create mode 100644 各种归档/20261009_网页图层UI修正/isolation.log create mode 100644 各种归档/20261009_网页图层UI修正/move-exit-desktop.png create mode 100644 各种归档/20261009_网页图层UI修正/node.log create mode 100644 各种归档/20261009_网页图层UI修正/prepare.log create mode 100644 各种归档/20261009_网页图层UI修正/production-browser.json create mode 100644 各种归档/20261009_网页图层UI修正/production-dialog.json create mode 100644 各种归档/20261009_网页图层UI修正/verification.log create mode 100644 各种归档/20261009_网页多图层与扩展画布/README.md create mode 100644 各种归档/20261009_网页多图层与扩展画布/all-final-retest.log create mode 100644 各种归档/20261009_网页多图层与扩展画布/all-final.log create mode 100644 各种归档/20261009_网页多图层与扩展画布/all-ready.log create mode 100644 各种归档/20261009_网页多图层与扩展画布/desktop-final.png create mode 100644 各种归档/20261009_网页多图层与扩展画布/device-browser.json create mode 100644 各种归档/20261009_网页多图层与扩展画布/device-cleanup-confirmed.log create mode 100644 各种归档/20261009_网页多图层与扩展画布/device-cleanup.log create mode 100644 各种归档/20261009_网页多图层与扩展画布/device-deployment-deploy-ready.log create mode 100644 各种归档/20261009_网页多图层与扩展画布/device-desktop-menu.png create mode 100644 各种归档/20261009_网页多图层与扩展画布/device-mobile-menu.png create mode 100644 各种归档/20261009_网页多图层与扩展画布/device-ready-verification.log create mode 100644 各种归档/20261009_网页多图层与扩展画布/device-rest.log create mode 100644 各种归档/20261009_网页多图层与扩展画布/hygiene-complete.log create mode 100644 各种归档/20261009_网页多图层与扩展画布/hygiene-ready.log create mode 100644 各种归档/20261009_网页多图层与扩展画布/installed-source.log create mode 100644 各种归档/20261009_网页多图层与扩展画布/isolation-final.log create mode 100644 各种归档/20261009_网页多图层与扩展画布/isolation-ready.log create mode 100644 各种归档/20261009_网页多图层与扩展画布/media-formats.log create mode 100644 各种归档/20261009_网页多图层与扩展画布/migration-edge-python.log create mode 100644 各种归档/20261009_网页多图层与扩展画布/mobile-320.png create mode 100644 各种归档/20261009_网页多图层与扩展画布/mobile-layers.png create mode 100644 各种归档/20261009_网页多图层与扩展画布/node-ready.log create mode 100644 各种归档/20261009_网页多图层与扩展画布/text-drag-final.png create mode 100644 各种归档/20261009_网页多图层与扩展画布/text-resize-final.png create mode 100644 各种归档/20261009_网页多图层与扩展画布/windows-file-retest.log create mode 100644 核桃派软件源代码/app/scene_layers.py create mode 100644 核桃派软件源代码/app/static/pixel-png.js create mode 100644 核桃派软件源代码/app/static/scene-model-v1.js create mode 100644 核桃派软件源代码/app/static/vendor/fflate/LICENSE create mode 100644 核桃派软件源代码/app/static/vendor/fflate/README.md create mode 100644 核桃派软件源代码/app/static/vendor/fflate/fflate.js create mode 100644 核桃派软件源代码/app/static/views/layers.js create mode 100644 核桃派软件源代码/scripts/check_layers_browser.mjs create mode 100644 核桃派软件源代码/tests/test_scene_layers.mjs create mode 100644 核桃派软件源代码/tests/test_scene_layers.py diff --git a/各种归档/20261009_网页图层UI修正/README.md b/各种归档/20261009_网页图层UI修正/README.md new file mode 100644 index 0000000..e1edb4e --- /dev/null +++ b/各种归档/20261009_网页图层UI修正/README.md @@ -0,0 +1,40 @@ +# 网页图层UI修正验收(2026-10-09) + +本轮修正颜色区布局、背景/帧复选框尺寸、不透明复制与脏目标提示、退出图层移动及模式提示。scene/模板/动图/配置格式、REST、手机公共协议与驱动均不变。VERSION保持1.1.3,FEATURE_UPDATED_AT为2026-10-09T16:12+08:00,未导出OTA/IMG,无App更新、摄像头、实屏视觉和Android真机测试。 + +## 验收清单 + +| 用户行为 | 功能与视觉验证 | +| --- | --- | +| 画笔/背景颜色选择、背景开关 | 桌面对齐,390/320上下排列;开关20×20,标签可点,无其他表单回归 | +| 复制弹窗、长帧名称和多选 | 两种弹窗计算背景rgb(23,28,36),原生checkbox20×20;合法长中文及无空格长名称换行,窄屏无横向溢出 | +| 复制当前板、模板和动图多帧 | 扩展浏览器入口通过;独立静态目标4层、两帧各2层,100/300ms间隔不变 | +| 脏目标保存后复制 | 独立目标正常提示、保存、追加及重新载入,不透明提示截图 | +| 画笔/文字移动、退出与继续编辑 | 已提交偏移保留,全屏/扩展/视线保持、面板隐藏、撤销可恢复 | +| 切到视线再退出 | 保留视线平移/滚轮缩放,草稿及撤销状态不变 | +| 未提交拖动预览退出 | 鼠标未松手时用键盘激活退出,候选取消,后续鼠标抬起不提交;一次撤销直接恢复上一已提交移动 | +| 文字退出后直接拖动 | x32→37、y26→30,文字工具恢复,可正常继续编辑 | + +复制与脏目标写入只针对隔离mock的独立测试ID;设备既有目标只打开检查后取消,避免修改用户内容。截图已独立目视检查;窄屏颜色截图先将标题滚动到固定顶栏下,避免错误地把遮挡截图作为布局证据。 + +## 本机与隔离回归 + +本机全套513通过/9跳过;全部Node87通过。隔离中文/空格目录首次503通过/1失败/11跳过:未改变的显示配置原子替换发生WinError5。单测重测1通过,关闭本轮mock/浏览器后完整重测504通过/11跳过;隔离Node87通过。失败与成功日志均保留,不认定未证实的文件占用根因。 + +默认环境跳过6项FFmpeg格式、1项HEIC编码器、1项Windows目录symlink及1项仅用于旧OTA子进程的probe;隔离目录另跳过完整Git1项和大型镜像依赖1项。这些媒体功能本轮未改。隔离目录未复制凭据、venv、运行数据,使用已有解释器测试复制源码。 + +## 经验及剩余边界 + +稳定需求、TEST-LAYERS-UI测试映射及CSS/布局/截图经验已补到整体开发需求和测试流程。CSS未定义变量使dialog背景失效,使用已有surface;checkbox必须用局部高优先级样式覆盖全局input尺寸;模式出口不应清空撤销。运行mock时应使用准确的源码相对路径定位任务目录,并让环境初始化失败立即停止。本次首次启动环境路径写错,产生源码data下5个默认mock文件后已停止该进程,后续全部测试改用独立数据根。 + +自动安全审批拒绝了清理上述本轮生成目录(仅返回blocked by policy);未更换手段重试。核桃派软件源代码/data中的5个默认文件在本轮启动16:04:51至停止16:05:23之间生成,确认不是用户内容,已无进程使用,可手动删除该目录。本机一次性目录测试相关资料/如何测试/本机测试环境/.local/work/layers-ui-20261009在本轮结束后同样可手动清理;持续使用的venv、私有凭据和主机密钥保留。 + +## 设备部署与交付 + +凭据门禁与远端工具检查通过,离线载荷SHA-256通过;原子更新在持久数据副本上准备后才切换,完整预检508通过/7跳过,首次启动和重启健康检查通过。7项跳过为源载荷没有完整Git1项、本机harness3项、大型镜像构建依赖1项、板端没有Node的跨语言对比1项、旧OTA子进程probe1项;没有新增板端依赖。 + +已安装8个本轮源码/元数据文件SHA-256与本机一致(installed.log),VERSION1.1.3,功能时间2026-10-09T16:12+08:00。实际网页1280/320两种宽度的完整图层检查均通过、各6次原生确认且无pageerror,退出移动和撤销正常(production-browser.json)。390px检查整行背景标签可点、复选框20×20、弹窗不透明、帧列表405px内滚动(内容1032px)、文档宽度等于视口(production-dialog.json)。设备已有目标仅打开帧列表并取消,未复制或修改用户内容。 + +部署后与基线逐项比较9模板、6动图共195帧及全部持久文件SHA-256,像素、名称、帧顺序/间隔和配置均不变(verification.log、data-preservation.json)。真实驱动运行正常:deadline_misses=0、oe_pulse_faults=0、last_error=null。既有BlueZ TxPower属性告警仍在,未在UI修正范围处理;服务启动及健康通过。 + +已清理远端 /run/matrix-screen-controller-layers-ui-20261009 内离线载荷及文件校验清单,并确认本轮10个精确载荷、stage、rollback和迁移/测试路径均不存在(cleanup.log)。本轮mock服务、浏览器及SSH本地转发关闭。本机两处可清理目录因删除被自动审批拒绝而保留,见上面的经验及剩余边界;未改用其他删除手段。 diff --git a/各种归档/20261009_网页图层UI修正/all.log b/各种归档/20261009_网页图层UI修正/all.log new file mode 100644 index 0000000..d2e348d --- /dev/null +++ b/各种归档/20261009_网页图层UI修正/all.log @@ -0,0 +1,248 @@ +requirements 未变化,跳过依赖安装。 +> <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Scripts\python.exe -m pip check +No broken requirements found. +已清理:<仓库根目录>\测试相关资料\如何测试\本机测试环境\work\pytest +> <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Scripts\python.exe -m pytest -q -p no:cacheprovider --basetemp=<仓库根目录>\测试相关资料\如何测试\本机测试环境\work\pytest +........................................................................ [ 13%] +........................................................................ [ 27%] +........................................................................ [ 41%] +....................................sssssss.......s..................... [ 55%] +........................................................................ [ 68%] +.......s................................................................ [ 82%] +........................................................................ [ 96%] +.................. [100%] +============================== warnings summary =============================== +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15 + @no_type_check_decorator + +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: 10 warnings + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15 + @no_type_check_decorator + +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: 83 warnings +tests/test_animations.py: 913 warnings +tests/test_api.py: 2075 warnings +tests/test_fonts.py: 249 warnings +tests/test_frp.py: 332 warnings +tests/test_library_order.py: 332 warnings +tests/test_media_conversion.py: 830 warnings +tests/test_mobile_control.py: 1162 warnings +tests/test_ota.py: 249 warnings +tests/test_performance_mode.py: 83 warnings +tests/test_scene_layers.py: 166 warnings +tests/test_templates.py: 664 warnings +tests/test_ui_copy_editor.py: 599 warnings +tests/test_wifi.py: 249 warnings + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: DeprecationWarning: 'asyncio.iscoroutinefunction' is deprecated and slated for removal in Python 3.16; use inspect.iscoroutinefunction() instead + is_coroutine = asyncio.iscoroutinefunction(dependant.call) + +app\main.py:2049: 1 warning +tests/test_animations.py: 11 warnings +tests/test_api.py: 25 warnings +tests/test_fonts.py: 3 warnings +tests/test_frp.py: 4 warnings +tests/test_library_order.py: 4 warnings +tests/test_media_conversion.py: 10 warnings +tests/test_mobile_control.py: 14 warnings +tests/test_ota.py: 3 warnings +tests/test_performance_mode.py: 1 warning +tests/test_scene_layers.py: 2 warnings +tests/test_templates.py: 8 warnings +tests/test_ui_copy_editor.py: 7 warnings +tests/test_wifi.py: 3 warnings + <仓库根目录>\核桃派软件源代码\app\main.py:2049: DeprecationWarning: + on_event is deprecated, use lifespan event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). + + @app.on_event("startup") + +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: 2 warnings +tests/test_animations.py: 22 warnings +tests/test_api.py: 50 warnings +tests/test_fonts.py: 6 warnings +tests/test_frp.py: 8 warnings +tests/test_library_order.py: 8 warnings +tests/test_media_conversion.py: 20 warnings +tests/test_mobile_control.py: 28 warnings +tests/test_ota.py: 6 warnings +tests/test_performance_mode.py: 2 warnings +tests/test_scene_layers.py: 4 warnings +tests/test_templates.py: 16 warnings +tests/test_ui_copy_editor.py: 14 warnings +tests/test_wifi.py: 6 warnings + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: DeprecationWarning: + on_event is deprecated, use lifespan event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). + + return self.router.on_event(event_type) + +app\main.py:2079: 1 warning +tests/test_animations.py: 11 warnings +tests/test_api.py: 25 warnings +tests/test_fonts.py: 3 warnings +tests/test_frp.py: 4 warnings +tests/test_library_order.py: 4 warnings +tests/test_media_conversion.py: 10 warnings +tests/test_mobile_control.py: 14 warnings +tests/test_ota.py: 3 warnings +tests/test_performance_mode.py: 1 warning +tests/test_scene_layers.py: 2 warnings +tests/test_templates.py: 8 warnings +tests/test_ui_copy_editor.py: 7 warnings +tests/test_wifi.py: 3 warnings + <仓库根目录>\核桃派软件源代码\app\main.py:2079: DeprecationWarning: + on_event is deprecated, use lifespan event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). + + @app.on_event("shutdown") + +tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner +tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner +tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner +tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner + <仓库根目录>\核桃派软件源代码\tests\test_media_conversion.py:134: DeprecationWarning: Image.Image.getdata is deprecated and will be removed in Pillow 14 (2027-10-15). Use get_flattened_data instead. + assert sum(pixel[0] > 240 for pixel in output.getdata()) == 1 + +tests/test_templates.py::test_template_crud_copy_persistence_and_thumbnail_cleanup + <仓库根目录>\核桃派软件源代码\tests\test_templates.py:165: DeprecationWarning: Image.Image.getdata is deprecated and will be removed in Pillow 14 (2027-10-15). Use get_flattened_data instead. + assert len(set(image.getdata())) > 1 + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +513 passed, 9 skipped, 8390 warnings in 87.13s (0:01:27) +> "C:\Program Files\nodejs\node.EXE" --test tests/test_animation_ui.mjs tests/test_canvas_tools.mjs tests/test_color_math.mjs tests/test_current_display_playback_ui.mjs tests/test_device_ui.mjs tests/test_font_picker.mjs tests/test_frp_ui.mjs tests/test_interaction_feedback.mjs tests/test_scene_model.mjs tests/test_scene_layers.mjs tests/test_settings_ui.mjs tests/test_template_management_ui.mjs tests/test_ui_copy_editor.mjs tests/test_wifi_ui.mjs tests/test_workspace_order_ui.mjs +✔ derives automatic frame names from current animation name and position (0.6874ms) +✔ keeps custom frame names and restores automatic names when cleared (0.0966ms) +✔ builds non-repeating animation edit context names (0.1028ms) +✔ selects saved animation preview frames by ordered durations (0.5996ms) +✔ loads every preview frame through revision-checked pagination (0.6345ms) +✔ validates configurable animation preview concurrency (0.4131ms) +✔ rejects mixed revisions instead of showing a partial animation (0.4235ms) +✔ validates frame duration only when explicitly called (0.3479ms) +✔ moves selected frames as one ordered group (0.1972ms) +✔ protects an eight pixel ring around interactive drag controls (0.2474ms) +✔ reorders mixed library keys without mutating the source list (0.1172ms) +✔ restores drag eligibility after protected pointer cancellation and drag end (0.3627ms) +✔ animation workspace exposes two previews and the simplified control order (6.0767ms) +✔ normal and pixel modes expose independent ranges and presets (1.0924ms) +✔ pixel stamps are exact squares from 1x1 through 4x4 (0.2203ms) +✔ pixel stamps clip at every canvas edge (0.1736ms) +✔ normal circle geometry remains unchanged (0.1043ms) +✔ line interpolation includes endpoints without coordinate gaps (0.199ms) +✔ older tools migrate while v3 restores the coordinate guide choice (0.205ms) +✔ coordinate guide spacing adapts to the transformed logical pixel size (0.1349ms) +✔ coordinate guide ticks preserve logical values through zoom and pan (0.1674ms) +✔ pixel mode markup and grid stay accessible and non-interactive (7.3324ms) +✔ pixel undo history stores changed snapshots, caps entries, and clears (0.339ms) +✔ canvas view clamps scale and keeps a visible section in the viewport (0.1618ms) +✔ zooming around an anchor preserves its logical position (0.1217ms) +✔ floating editor button stays inside its safe viewport bounds (0.0699ms) +✔ canvas editor markup, guarded input, and checkpoint events stay wired (2.9591ms) +✔ normalizes and converts hexadecimal colors (1.1604ms) +✔ converts RGB and HSV boundaries (0.2164ms) +✔ round trips representative colors within 8-bit rounding (0.243ms) +✔ recent colors deduplicate, normalize, and evict the oldest (0.6482ms) +✔ formats and projects looping playback without moving paused content (1.4035ms) +✔ seek dispatcher keeps one request in flight and flushes the newest position (2.5348ms) +✔ topbar current display dialog exposes static close and animation controls (4.9926ms) +✔ device workspace exposes the compact immediate pure-color test flow (5.5196ms) +✔ font catalog normalization, grouping, and search are stable (1.3207ms) +✔ font picker implements commit-only searchable combobox keyboard behavior (4.6556ms) +✔ settings places unrestricted FRP maintenance at the bottom (6.1934ms) +✔ FRP editor uses raw server storage and official validation errors (1.3256ms) +✔ network diagnostics renders layered evidence (1.803ms) +✔ unavailable controls never masquerade as indefinite loading (7.5008ms) +✔ action controls do not bypass the shared state module (12.1379ms) +✔ HTTP requests time out with a stable user-facing error (17.1637ms) +✔ demo library actions stay black, explain restrictions, and preserve copy (1.7199ms) +✔ sortable cards protect controls and keep demo cards fixed (1.3723ms) +✔ old scene migration rejects unknown fields and duplicate text without filtering (56.87ms) +✔ PNG compression round trips sparse and full brush pixels without DOM (8.0872ms) +✔ blank and black are distinct; independent backgrounds follow layer order (5.9144ms) +✔ disabled background colors stay independent through storage and copy (22.0436ms) +✔ extended pixels survive storage but never enter the central output (6.1956ms) +✔ move preview does not mutate source; confirmed clipping removes only outside ink (13.438ms) +✔ text clipping follows anchor and scale and is retained after edit/reload/copy (8.8565ms) +✔ multiple text groups isolate edits, copies and IDs (0.5382ms) +✔ strict v2 storage protects unknown data and the final brush invariant (5.9174ms) +✔ creates a fixed 64x64 RGB scene (7.6661ms) +✔ serializes pixelRgb as base64 and round trips an independent scene (36.8527ms) +✔ moves a valid v1 draft to the stable key before removing exact legacy keys (47.4139ms) +✔ keeps the v1 draft and all legacy keys when stable-key migration cannot write (21.6215ms) +✔ preserves and blocks a future stable draft instead of falling back or writing blank (8.9167ms) +✔ preserves and blocks a damaged stable draft (0.3938ms) +✔ does not discard a damaged higher-priority legacy key during fallback migration (2.492ms) +✔ rejects damaged scene roots while skipping only damaged elements (11.8415ms) +✔ normalizes text fields and creates a centered lowercase ok element (0.5473ms) +✔ migrates the first valid canvas by v3, v2, legacy priority and merges text v1 (13.6859ms) +✔ supports independent add, update, and delete operations for multiple text elements (0.8036ms) +✔ duplicates with a deep copy, new id, 2px offset, and topmost order (0.4624ms) +✔ alpha-composites full RGBA layers in array order without mutating inputs (1.9702ms) +✔ settings brightness explains an active temporary display-test override (8.6144ms) +✔ settings exposes full OTA upload progress and service recovery polling (4.2243ms) +✔ settings automatically opens and safely copies a detailed OTA failure log (3.456ms) +✔ settings exposes a transactional performance-mode switch with the fixed warning (1.8978ms) +✔ settings exposes persisted animation preview concurrency below performance mode (2.5657ms) +✔ template edit baseline distinguishes clean, dirty, and unbound scenes (1.772ms) +✔ template manager uses a monitor and unified four-row card actions (15.8254ms) +✔ animation editing backs up and restores template edit ownership (2.8231ms) +✔ special editor exposes the agreed modes and guarded editing flow (10.9369ms) +✔ latched WiFi draft state remains dirty until explicitly cleared (2.0158ms) +✔ WiFi settings expose independent network and prompt-delay controls (3.9931ms) +✔ workspace order resolves saved ids and appends new registrations (1.7676ms) +✔ workspace order movement is immutable and respects both boundaries (0.329ms) +✔ drawer exposes one editable list and commits only from the save action (7.9569ms) +ℹ tests 81 +ℹ suites 0 +ℹ pass 81 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 614.8645 +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\animation-thumbnail-preview.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\animation-ui-model.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\app.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\canvas-tools-model.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\color-math.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\color-picker.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\core.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\current-display-playback.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\font-picker.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\interaction-feedback.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\media-crop-geometry.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\media-import-ui-model.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\pixel-png.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\scene-board.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\scene-model-v1.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\scene-model.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\sortable-card.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\template-edit-model.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\ui-copy-runtime.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\vendor\fflate\fflate.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\animations.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\canvas.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\device.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\frp-settings.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\layers.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\media-import.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\settings.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\templates.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\text.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\wifi-settings.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\wifi-draft-state.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\workspace-order.js +> "C:\Program Files\nodejs\node.EXE" --check app/ui_copy_editor/static/editor.js +> <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Scripts\python.exe scripts/build_ui_copy_catalog.py --check +ui-copy.json is current +本机测试套件通过:all diff --git a/各种归档/20261009_网页图层UI修正/browser-ui-extra.json b/各种归档/20261009_网页图层UI修正/browser-ui-extra.json new file mode 100644 index 0000000..d69faa9 --- /dev/null +++ b/各种归档/20261009_网页图层UI修正/browser-ui-extra.json @@ -0,0 +1,10 @@ +{ + "candidateCanceled": true, + "undoX": 0, + "continueMode": "draw", + "textDraggedAfterExit": [ + 37, + 30 + ], + "errors": [] +} \ No newline at end of file diff --git a/各种归档/20261009_网页图层UI修正/browser-ui.json b/各种归档/20261009_网页图层UI修正/browser-ui.json new file mode 100644 index 0000000..8fd46c6 --- /dev/null +++ b/各种归档/20261009_网页图层UI修正/browser-ui.json @@ -0,0 +1,51 @@ +{ + "browserResult": { + "passed": true, + "nativeConfirmations": 6, + "layers": 3, + "errors": [] + }, + "narrowResults": [ + { + "width": 390, + "bounds": { + "x": 19, + "y": 198.484375, + "width": 352, + "height": 447.015625 + }, + "checkbox": { + "x": 36, + "y": 410.640625, + "width": 20, + "height": 20 + }, + "metrics": { + "width": 390, + "scroll": 390 + }, + "background": "rgb(23, 28, 36)" + }, + { + "width": 320, + "bounds": { + "x": 19, + "y": 169.09375, + "width": 282, + "height": 505.8125 + }, + "checkbox": { + "x": 36, + "y": 386.96875, + "width": 20, + "height": 20 + }, + "metrics": { + "width": 320, + "scroll": 320 + }, + "background": "rgb(23, 28, 36)" + } + ], + "errors": [] +} \ No newline at end of file diff --git a/各种归档/20261009_网页图层UI修正/cleanup.log b/各种归档/20261009_网页图层UI修正/cleanup.log new file mode 100644 index 0000000..09c887a --- /dev/null +++ b/各种归档/20261009_网页图层UI修正/cleanup.log @@ -0,0 +1,3 @@ +私有凭据文件可用;未输出任何凭据值。 +All 10 exact remote task temporary paths absent. + diff --git a/各种归档/20261009_网页图层UI修正/colors-320.png b/各种归档/20261009_网页图层UI修正/colors-320.png new file mode 100644 index 0000000000000000000000000000000000000000..079665c645e1753c16fd6a1882ef5a3ee6f7aeac GIT binary patch literal 40755 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

yYgp;e>L+w@bUr&mK%RCE&oQ}k-wq#akaS}L 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 P4UW2swsNJSWypU4%_0Hw literal 0 HcmV?d00001 diff --git a/各种归档/20261009_网页图层UI修正/colors-390.png b/各种归档/20261009_网页图层UI修正/colors-390.png new file mode 100644 index 0000000000000000000000000000000000000000..6418ee5abdfb39be2b54890b83678d3890efc7b9 GIT binary patch literal 41881 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 U6oUHE3#&#Ep#T5? literal 0 HcmV?d00001 diff --git a/各种归档/20261009_网页图层UI修正/colors-desktop.png b/各种归档/20261009_网页图层UI修正/colors-desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..2024345260ca019d17d5ed8c2b86e2fcac5d707e GIT binary patch literal 19429 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 literal 0 HcmV?d00001 diff --git a/各种归档/20261009_网页图层UI修正/copy-320.png b/各种归档/20261009_网页图层UI修正/copy-320.png new file mode 100644 index 0000000000000000000000000000000000000000..e31a61389b743d929b2a1557357bf66f3f93a6ff GIT binary patch literal 27167 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Ν}kB^9m_sV=5+>Aimj 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 Z(5c(^Tfwn<33vrTML|QpR@Nf&-vCk1QkVb$ literal 0 HcmV?d00001 diff --git a/各种归档/20261009_网页图层UI修正/copy-390.png b/各种归档/20261009_网页图层UI修正/copy-390.png new file mode 100644 index 0000000000000000000000000000000000000000..0e2242b6eabc7dfa2a433b37ed2827d11c6ddfef GIT binary patch literal 28899 zcmZs>WmH^2*CmW=U(xCM8DySsY`7BslK26qh*oZ!&7yE_DTcfNk!cV^anGxMX@ z>UFDbRjs;J`|Q2XiBwUNK|vx!f`EWPk&~5FgMffE0sndspukVC$Y|~%AkZP?B*iqm zvd?nheKn+(2E#REsSqg;S+El~#WJyRu*F2Nf3roQ^atHUnn_8)z)Gq5YBE1jGDe|@ zF(A>;!W@%mcq39!C*&%McUeCsd~0R#*J8=K?W{JG8aM#BNZ$MnqKZ;GuiDZ5^E5X&lx-aqpZ0n6l|asDJB$(hSw7 zvW0zKB>g}5dw~kD5PiA7a@9tLTBJKme^rd|ul$HZarj^vtCtJ-yT1snyP0%0>9am!A!<*Y8yTz|@B9cD&3* zGvj{${vCt;p9XmLG5J0^daf_r44Z##C^_0ZPFB=|Oz{U{vBkaa^}75&x)#j#-k=%F z%BT^;O!4u6lu%HW`~UvEgobKQjVj;)KtQBlzicUXRE0Igs}3ycf=uuapz?8p#H(I< z6NVXdz|#OEL|LBTHLgL-VYeiT;89@9L*<22wgR`dt?;Fx=f%Mv>pyeCXrTi@8GT6L z|LSj&Ge_U=7eF%W`X%+8r{lfB@MMJCde~U;@z34M%lHo2LdiEPc*ewhF4L2}*VlB$ zc`v2(F-)~*&(pzZDs{?vN_`A#&CYmEvwwDII(-Zmx(wT=x-uHf1}VYJ!~$DXe?t#$mky=2ms$ga8A zK*o%Czot`WHSAi~6B`cx{CFjc4MIRgB;|7H>3Bw-o%=Anz%b(OPz8lOMb#)1EtZwv zoi06&)S27$55By-92_3L!atqjz>IR9#TDG2EOb7s3Qq~$&L>jIlyyBX_Ju}s4P0!r zr`I~Gp7Uw4EY=!3ADy>oqo83)^_1pXjtWVsp|@NH8%GUJQOX8_x1-sw=I=pZ zxXdrajxfBu0H^Jrkiqaf%Ae?PrHt~q!9^{CeC`vucDYe}*i-x2Wi$|-bx3Kj zFi)up$@S{K+%&4ce^<4B)7$pDr|}Q>QMRw?rk`V2gUQvBFmNyj2M0Sq2kjbz=MRiW z)T4l$H(U-fJnb^IUS${yODk^Y#j`Tl+kMEa76(74b>tw^4x%X>n6MQq#jIHmEiEmh z8oH|LSx!z@*X)XK?S`98-fr%zE2ouJ&5oPsI?uj58z-u&WF3!NZ$Sfue3rZYBOa{& zl)}O^|K0@8u3)|Ij(AMpkoS!6oeQXPiC>@Gm+qX#4>Sj5kqBW+r6Be4L4J^>LFS;*A;3dt~6tL41rso z`_mZVovHPZACT@Ri-9!s_@xkNKA?;tY2&3@Hp?P;Iex+8R0iXK+Z=kRiA-)3WR#Ng z(Ns3s#@KckSojK`w|7SzqNwcx)%dQ*$-5duL5T#HoR6jZv9U29v$MIdp}m5z4Sp^l zFhMw1K{kWK@}z_8AX?276c+0VXb*4R`4i*)B&LR*#pBrZ+J)g=0tbzBqJ$+hvpqcO z|M*U@-;0A}I4u%_19Qukdl&Y(?mssDxlRjc)T)+`RD;j>v(r?2ue$3UKO`nVUX;dcd>Omz{g|oHC^cC&$ z%~zRqnI_0v$ja~Mqd1x7n3zg_!q##00Fi)h`_i~rz+*MLXBK&k^t_mX!=x$Lh z`dXKm?&)+qYl*!y&FQc_Eh8huT!j~=oXV(q7p^I%TxGGxi(YV9bG)Gsj4AUfB!9SA zTPpc(jo))PnL|}DIyq@n=US4(ALM<1Qc)mG*}$JCkJwl0 zPI@!B?RS_vUN6?%Px-9bQAzmUwu9r{WKv41zEg)Ehipd}iHUB1yQYwEN=d`st+h^? z8ip2^kg%IC7sI(29t?OxWmVq=uesS_B~6%*g`c4F5g;c>nbPigA?$jmQ*fvihEl7J zuBxgEL{DS+1=L{pXe+OY#wDetAQ_z& zr_L32b)zir?ViBKyBMix+-S=0a_?}BT%akVbciRp z#dm|Z4R5fX^1r(tA|TKWHJYm?FF{JlG{K+3?#~tSS^TJTx>(xU^qewmgcs|VAtRyr zGT_Y*VMhG^akLaeISsWXaCSp7J-=eI+7Yk45>19e;_nG znfH^bgDk9RKyjrWH^8Hw9w(?02ImA7p-2}q^=HtZ61a%#Y_`MEc*nKoKp>vwh`N*0 z#nI59o6Xk6SZ!BamHKN*x>1NWR0+D_``Z~Cu>gIdHeI)qDU5AT3h+y!@+WVDUX!e8 z)_TYK-|yYeZ_#Y9>N^a%D!GEG(I@}Gf=L;cxc3uLZw{1*(Ii?pgULE&3fx@9oB z8;?s{=r=F-r!$pUZ$t-_^?Ln(zrR6`DU9s0+-|-srHu!ra4FgxW|DR*{#0#KfmJ;t z7I1qyTS)<2gs~Q8_fwBmTm{Qsedm%(W9sQ@loXU z+$Mas;A{Him3P#WQ4zt(s14Bjj*3cVUAzC0qx*gGnMXVRV&e_!t$=N~jGVDOq7rxE zw{0>g95vwMnYck0ko`|RK@Pnx<`>x{I;q%Y$J^7Ka!^GNww%~>eRrkiRCjR*eWt*X zu6eVOtWtzcP)e6@m(e{VhFMf)gtW9|#P0Sr`zIbQ;mbw)<@v^`LG(twWdkmY9*>O* zn}9&6w+8o7#Q6Al_s5F!H`tJ`&`{7eM2SiwM7MlaPq(9|Nb%u95UL~AdH#0O_s~#m z*|7cl;vQ+&P^8b^l#t4=1~q}z6m*hYV)FP<;AvG~AI`7nqEd}IYx=R3o9q^js2Djp zIjPvM@2>agv_85pb79SD!2IIflz&3EO4?xtO92SjiR|cw^WTkRSIpv~O(z-zjzj8^ z18yHQ%y!2=CxTEE;D-hWH@VN^{QX|%0W}P@E-!b-@zx*CgYaaLNfv7l=UB7~9KPwj znQKm+f0skIP+9bwHH=*Yg;Cs9yZt-I*e-AKz=6x)Vg47VHSSxZ%Vn-#7@qC=)0XEf z9*bUw!?Sav-*E}b<rYT{zh{`IrPQ~(KcgeCdFfdT;Y~@L! zAt41RQyV|t#B};RP8eTdIh17J!!Q*E1&QBPQDi4Zl%H75s4SDGWU04iT7C8gH|i8w zPmxAICVTu8|Fqqq#J60&SbJQ>pt>k(()s**zNnk$&-1UTBFGf!N>WTkIP?@AwMT`= zd{73A3L?H8_YZ;>?S~hifX+^(bG@UkKgqSHOUk)W;ZT_ObIQ?HzE5@S$NCi1Ec#rv znhm9H)uCeo3Eq$&aq$=M!X|&gh_}hfCNOPrUpxxN?0YeJO|iS_g{;da3GFZf85LC?Ns zyUh-Qb6(`G?F`2(BC*zN`+bas zSKY?27MmOnd@}GaiUY(dP6D33TLnqH1ZnKG=gq+l|Z}4WvS(txU)02 zgf!L$jY?uyIc!7UhqAm{o$J@cqM^Gsh$1G+_d;xb*Sm5nG&4#riNBs(!jh18WyD|H zY*uQ!qcBa*S4E7xe_&RWnajlcJ-&CipMEN6amX*j2<%2Nd3OlZac!Dfb`YbnAjrB0 zzueQ$qx}uFDcY*lYl5R-=T`m#LyCcfq~>-!`@Cvj<22XozR}8uKcd0}Wbb-&WkpfH z?BazEuxfd=SS+KG7B0V70do^Dcr4Um3@o=fzLqsu&&j0p?=59pPi4xD7$U(cvwYV_ zPIv#Aa4y3s()$qj4o|Xz>OP1;(?7{urpQbD>+$ou$?1b*ACHTRx5s4-V!Dc5_DsAm z6p18C-TtBR#ot5Lzy6Yw5`wP8WlA)&Ys9w4wk|>;r-$Ng9_IiFI4ojk#m`z3#xJCd z2xa>LZ{5ZF``sTeuj$5VE6=)&G0r!kOgEdsLBZXx7d{PppZtGBmi|@c3Fj22)3;6_ zNQtS9{2L2EMnRmI7+L8u zm+@$ZhD)4}*Kc-uf62P63=3Dq?|YW~JX_L8c_FN7kGujiC+qw2le;|=JOA{l?kBsw zQkL1qUKn*fz12vp>z8(-o6+L*;2=hk+jZnKV_?48kP$E0YP%c|05Xu>7(9O(@*xOg z55<820ZadY9fm<{wBVGcy^~l%As+f=69P49@0UAU^*B;t`s~v;D(N`F2DcHg^seo^ z%}q>qZ!@tYryIH+DC49mDugo->3{J+M7-ALb?#`Jat|ft@jI!qo}@+&GmV0tGLHN5 z3K|7uKBCEa@<;-A2JVDDU2?R#3kX!P-f~MvH4nWgB72- zLHFMz_@$E924emF^BKS&nf@XMfH&ls9N>i{eG9r@=^!vwu}kI-zf6RSaV7=>SceKALVq8e3Xf ziV8N`tVkD;Be}CvJBR@l7*v8-rM0vU22oD)$wTbbps@&4kkkr#f{!*E@EXGiwKOC! zr@3)i;q=h~>PRX1K^d8nb}_oFC}8C8p5GubibKT$ggUlB@^w(mxr?h z)R|KT<>kwRzbVHJYA0`b@zV3*6I$fjD^feabCCUJfpz~-^Tu8LubwW#2w|o%JHB8K zOQ-k0JS-hCAix}n3H(^W6t))_!|kB0+0nQ+NgZe(^px;ZAPa|F}r@WcM% zKRrFcg~~{Cw>BzeO~(2d5$To*d-UZWz3ww1K)rFCOYP7)u{DtbFD6PmU*>o;K$*I8 zo-FskV`LDJM!sPax($^`$`0zx=wUAi@zeVAt}S-$ueDf@N5ZPc&8O)qeKfLugGgpGG7@mFr5KaUU%V(??`Kjd0}hc6ufU*sJrggF+$ zJ`~u%*5EtlMgND*(fCbt)&+D@O)#Hi;Xk&J_Li@qB9g)e0|@~5Tzi zMNJx>sdMx4{p!6P;NE40f-wj)^dPmh+>yUQPIJJFo?4th?GXO&QlVd3((Rm)VrK~L zQjjEoT9EVIz^Df7au!0dhX6~d=`5^DrKOh;5q>A7=DK>#ttOObEK9Svh@PjNw@l_G zr|;3HovUw54x2>x-1OvLQr zajI*B7lnX13K84nwp8R^`{SjGe>vXyzHGaSx3o)IN@@osUiJCM2&K1ZcIbDhUUR+d zXtT4`I?d`d@x0w#Eh_am1{&CcD9Vp%zX_P_{zxndr!MYhtDICO?VO1CGRGItL*1SS zmdj}n}-%`l89-rK@We)YLyJ0bgEA}cgB>i$CXpQ}v)vSVa)yS>*> z%hE#IKeL?vD#l%f1$?_F6cs$GJ=0tmHei;H!zVQq(%T4*rwZF*iW-+vM;EGTMQXk% zkO;4M?ZZqnHq9T*T?^lYJ{BHLhJ>f=x8BH}d_LQxKf3mo2D&PR_8+4Hq^|gp>eHiAZ=S_{_HFnj~@7~zoU!mYF4krx}bjk$_ zxa}5x*O~4~zZ^AzH%k(i#lUrcIMMt5^!@6c7f5^+j^g{pYkM1<(7=)^O2LMKW4%*- z+QHwIeHc!c77=#o`322Hd(d(7-9k`0#upvl_x8LcK_3CaB0fYb3_@ersq7alT0*lB zlE=-yT+9O3hG>{T^L-I-f0H_1*_yI6v+ka0at_e!WBiLhpbi#TlW-SYx^wF_-ha-#!x8YNyIzNWKE zSkwFnJB;^d9@?amiLV?=2EM(VIs@-n)?W*uaUgK8@D9iGAa`UaD9WE?Vbh9Q!pH*j zmJ37Yj#T0U9n9fW59%2HnpBL;GDF-nKG1ZEsQNF~*h?x|*n&fvJWH#A1kf6fw z9Z@OCpu@0ZXuf(m{^yhK(J8I-?H_=`CJt5 zN=~pKjCJlXRk6{b4~ljJjx=Z6_xMq)(bL5xQhiy6IWCx9R{BmU=#l%mp`i$X3a|J; z9))xNnE|V)kUt2v*|?I6Xf$FKbPt!W_kx}90g8~G(5sL{g?#j#?&w!FcyCWwaO{Ar z^!eJy{ylS`dPLpol~)8xBmqoV;roRE2K91;;H-=nCD^i@&48w!s&wteXEiYA;Kyhc zoKU1piwvMxw!=nel`E1?H*?|9M-fYIzj^uU{|uX+3NP_Pj!85KDbOeww};0Lpo-}3 z+6V?C1_@CHQ5is+sq8mfcvU+jC?V21q09xDfQ`lyc^f)(9@**_o7_(VulAk8V z$8WafzgE2*ACWU5C|-k}2D)}5iAbI!;*H+{`Gn7isY0hj?MACzxfBY_$d~6P zPsoND2=7TbIV_sc!hHjxj-oQ;UkY-g^+m0BjBU93sqPLW7__O>n}4Q5s*7Wjl{Bg# z3F+hvhSQtbq2sdkZ|{VY0uZjkkz;3wpdhG-Rk=Xy1W>@^e~5iN(->j)$@7}}=t}($ z!4l%LbF-+Vzu|P%;zRU$$%29^tpcU-IlO=@`j|DUnXFLuQk+{92GYX60pV2Ei@%ls z#X#qh?D};j7*G6gJ;S<^1kh2m-QRLo0^V-=)I|A$r?dC9Nq&Y21k{1^2#^i-zT z)A7X+2vGO1S*(GVYm?4q`B{9smi@o-oBvlp`!8?9kZ$L*$ zZWq>0SBp}3*l=*-b`$|!C!(4j-LwFqi5tuV-Zn`ZRm);I`Q@cwR{liT{67Y1{D$Jl zb@7AcLs40-5))e>!QAYBdI6Z&dYVAM-u?ec9sHOACck9G#10GGXWf(jjOC0RGPmd5 zSD^uU@uRCnFv8%jp&La2dB`Wx?F7r#at_w(w|$%IYe3Qz=tz$H!}7Ho`TVB{Vb^-( zx&PhY40)&IT`e1Vpe9J?b0B;+qV=WjdRbP9FEfC(#Xs5O%pMqn2h|(mB`!-*`GioH zdH~(Oav43?&h1M)DW}ZX~|xD%kp16FAWr4 z4tYo8J4J^*Tu1nKcyR0&{)xC?yy*p5iu@4-qNJiUH?!luy1%t93pQoNeSUua@fUx5 zj@>#DJ3ysXOS;#?X5$lAz~r`LiemVI?Z{~KuW@N7!ufooc7VfPn!BE-0jK>-O$oBB zB3M0iAWG6;c#=>3hdonC>a+$M;z`tBKGKNoEZA|`hMqHOQW4%C%{4Cl+_qcr^JV;J zW%4&cIC3v{=?b#6tYEJ_LylIHM;c6`Q$)0Ygl!5inrba ziR-{{-OVNd%q}BHKOR1?TfQI{I_-Hl>7z^bZM8RpnQUGFYo(I}SVu?_6sxLy+^haD z_1{%lgcVE9D!M(<9@$Foz5L5zNm?F;vgOP1IUwUGO~c)aS3IAPlh}My#CyF|{>tsX z<|*~Y(P2eQiJj^jBUKfkVU!S`k+sbvAC|jwc%mWvXkUL>=Ma~~fs^v~{jgqbDwp4% z&;K$`f@o>k0L3y8YD-w6)~o%$ljwdR4hkAhKUiU35_lXI z1c#G5Bs3D%)rqj^Ioz(7<^8y@5bv8_bI#$j2x;%sR;lT7)7_RY9U6P?9c3+2`QaDiC z-kpOTc5x!Ex2~tR@3Xj1hqW8j59~8DwF;RkEk=eJ6h$&39IpL-0Uv*R#Vc7<98uQw zxUt4v_WAr@yszE;YTw-loJj=SzzP+A=Lf)SCMnMp_RGsr`C_%+2*&dC06CLM^VmQF zF60WvG;$HCHv}2Cd8_{L>0GtBxtR%h$H!__7`%i~rwGU-he7FbwF%i#VnZ|$@qsM^ zDgF=%ib`aFeAC;$&4o;p91`yK{`7Mm@T#VQ5?DTV&T1$iAvn#$N?9BHK8<~4pm7e3 z2RaL?lnEAekG^~7t7X0kr$m9UVx2by%A0kRN+Iw1#9`-H1G z|JY)&Kk=l3aqsD#?c&@U><2A&YhnQ%Bqp?O7wfirr4u!$>4nAOsgy4?H&+86$f0s;dA0}>P{Y}Wnj z-MKfIN`|k#;q%!#z|MR14OT>a#)OKC&tmT&059C6UC)9VfbySVzr>4`i(ZlYBM1=s zBXcJvBtX1El?o0(S;Rox;$=Q7;bgH#RBBdHnnl@SJZo+VFJ(u>%S1?K0+t7r_$0yl ze+@f0i2M}dMw$I9;x8N^0X=0t;TumKK`=hwFn?!M2BlxfY=u5AYFF3+cFKO381(fy z_?+%fek>WLCnrNMXtir8u0pe1oB#6?);^;3>f=2u5HoJ;Ku)xPAabdIJ%QPE1!P1TkcnR#K+@ zU7he@Nlez`awVF)L}gLeL|#e{3wJK>?j_8?0_7EIu13h)Z7)R?n4bh?+E1*TD?IHFQFv3y#su&I%tC`{&-~o!%Q<=mBH2{9}Cj| zUy!POVPXgdQ3gv;K{3KVKfM^Q=M4-`;T?h_jV{4)#fS&TwU6@1S3*zwFjL7HoRC|( z@0ClVu>32w6(ff?tRHOl;Fn&WVMC<*^G!y|;(j3pJ*XeQss2GxhB4Vo5Y0B-u zzJ*hqgcl0ByNppOmEhcz2>F*vD-#tLwKt3j_D$WJq(P+#U`*5@JHoJzsEO>!%A66C zIX!+@x!PC!ww1T5t1IzLod4u%mLQei6na43TYg?Ut$Hw_rQc&*zekYL|1o?FkU6~nS z9GUWlZ4{dx7-fk2)o4~_0wIjO4+|DUg`b|cB?hJM|7gGi4J~z#R}+c`syeKq#{~WU z&lHhC^hHdlV~^q^g+1J$jNVJL|Cd|#zj?kX(M9B4IkzJ(sb5L)zqMRBsZ0{g882N9 zDfwz19lyUCHF&SYPl?=y&^RzO37$fDS- z?x3HR>wL(badIgcD>F;?=}+e3MKG}){y6;TLss5V_8*s>^7?n*a_uJdV>X?((}R)y z`k)uOOvy*tj*Jm>(nO>q2pkBa>yB1!`PRPQkJaY~6z}u+>5`@Jto)747 z7u>Um4?iFE)ZJ0wcOK`Jnik97ViQ-+ML=)z;}Q$81Xct@B!Amk4gPhp=2t)~EGCpp zj(5fv7Y|}uHVLH6Ym*Q_v?`WTNte9e&P}i3M zTfR7Z-!GYbjwax_;lzU9QvICJVP_x-caGOm?H6~p&^CX`hgZ-_W8`U=d+PKH;txX0 zuMhNy5@KRDx~+_6!J$pVJZq%A)f3ktI_&?;tx~0uZiNFavSj_zy$@jw3Elk_T|fvG zDqblTh7YI>qoXur@WXA%)zCvPCY0TCvsnsT$0Zj1h7P{^h5%`0+gAMgtS+8&lD}B> zi5Xt2~wd}87A$8%R@ge1?q;!Nc_}3`m0zvd@KjC|uhm@m0%}!ej&9|C& z7)U`p`KimkCQ*sez=>nl1j=Rd1o#Pmdlq$ra@>%eKME3UDrPX1rv>l_!2%S8YDdZP zG_Xa`H85tpC&iK3Om#qTRV9nOoY+wr#FgqLh$t@2ulAS(gEUSho8Dd4jNM+AjN39z z^xLpwY@h3xM4i8y8rC%1vDWt9-#R(0F zC+3$XJJ&&X+PO|9WF1vYH@`NMFV(pcfE6pexo<)CemwEN+Qx`&HyRb=Q(*0<%TDrS zHbO3>SFU_cGX#`|(1R_sW{4FRF6lECF6NX)ShK~V>7RM}$v-Z{?ejd(R?Yn~=25wX zO!-o)ejp)HdOs8o>`nq>6y*)Xur0^gjtP+LPv*aU?9Zp23!-#uf@-Gi#dU8iu$uJF z!p-;3@k_Dk7d+WnS*3jOiiknTCHNBL$JyXefUo}l)@uXFwv%tZs<;eA1FW#ER`{G> z>d3*x#7|EzQ5>*HF=pulN$Fe~oI$2B;6yrKJ;&P{l;kfcSn0YkGjN2cB{|zX+mKHB#^fSijS-*;@P;(t>nj_SJ_fVM3!gprWFn<~&vy zf5;Ur{x_nVjE{`-5n*Gpc93FYN~H!{5d5dH;y;l4ED%xrL=|_|I9<8Wv1lgKtMUch zMf1@o0KA%pOjCRmDen!U4JJNjp+fI!gM{RqtW&=9bUId^j1~zC(mGzRr9XKnGP0M< z;OJ5YuH7vueqG{$P-jvfGWThocfdxgEUTm>96|G~+(F9W6`c7Vb>B z+b^j1}D9>U9;T>s;FMAm@I?qS`h=#Op{U6G`l;Q+ zf!7x%YXkAI?YBB!gL!!;Wl^C;*65_@l5w+J;*NQyp_T{4M1xJ6<;YG6Qr{nBf$EfUO3_`xYZ*oX8zxZGw-2_VJ)%)|T5TiJBS7 z%1VQ1ydwHRh(uavnfin7k z&2;0LeDtdhz=gmcD>N2{QAxe+*f6B`2WuDLYv8GU*S0!&ZD&n0AND9Z(8G~F@RL&X zRrS($|8sDcstNr;0spc1-Co{aRj4rna4(lwacHhJ+&RzpOiUnGfqLTa9R}s0 z(_^(7KY|1$4_BpFb;6%NfBarOKq_{Nh5yXW^Jruc8KLz=D~V>aysv35Z9hDXk85LA zgH<{0)`7ZS8T{0sLYOuzJ$O9rCLV5j2JcFV*iie}M$I|3$+Wnl9YZ9j96*2#PZm;N zoT3fZoh;wE3c9ZDFCf7OxP(=J-qNaA!tB)8)i!)gz+9z7slxk!uoym$6yTF_W=%K> zu3Vg|!pg;JvvyuAyze1$?lr|%GjTtCRg~4ybY-27i#E-(kX|H(aRq1Ek3zlU3C%y& z*+kSIMY;2vO_Q((M5{5efAa<(dt9|~3vxDatk3>Iq*Io+lp$1X%@m|99o&y(G%*K?_IFqWcZ50vk@NULy@`*3>|2 z!wSpZX!mTk-%=IGvYKQgCGLbp6Ml~MoXP*1&Rm>xAc^LI)z z>5E1mcZ~7FeigUN%;4T2d0s5TCGRJFC3@fHh#T&w`i>}2Lk)#q_?sz0+)>;Q4LCP< z+nvRfas=VcDTz@E1N(rCl4%EU-kF6xQto`c!-}$I4dh6I`jwOvl%{ov!KJEPFDXk{ zfO>?45SKq!wUk1sXo`)@B_0=0VB^B7I6dv3#Jbw-!cILM_A-=WCuO9#SbQ%Tqu+BU zkzMbR)2jN2HWz>lkJNim(#_mwviTmhneN$bc0almqV7hNNX1anGJR1Tse%+u{;%-4 zFn@D;S~=F|8C;b?=(?tIgUU=BgTRf%WY7kYTQt9vxua-s)PT)qsUs#Tj=n2CP?6g( z1m0p>nK)=FMk}G6ip2_TGzs=`|K+Hoch|FeL?lrjVBb<-IU3FvscLby&@MANbScz_ zJb0wM$mxFakgq=r{HDKsqf$lJYlyE@9Ji2$h7*!h(D*tEJx^hXQXdsGjGAJVY&DUb zlpSq(=+BOG zT}$;)p2$sGWlzsshmnCx%_}h42B+_^!y59oL*i_}yFrY-}>^LlxAZh9OCQ@Rpa@)NappnEU%k5tvU)W>5s}jp9OL~_T6HW(CGiKDkyf2lUTpztB z=s%Gkxx7?WfEY}965(c|B7RG&L*TN8S-hsjG6e`4W6B~}95m>X;rL7?)Om8NncxSb zvns-`jWTywH>U*mB#S#_C-Rg8%te-e=T}M+QLFMG$-FOi68)?^)dC;_0HW7N`1Htk zlt>ZNEjA2C$TvIDb%GYja47`5;;rzrtY~395+5@X9Eu#lYG=Csjk%nR9;218 zfjl+3RXi^V^jgz}HbBC;a+LgT32~4{F!~LZHM@h6mb2J&D||4PIkF+~#?pZr&EM9D zG)5cTLjov!SrmmMb977%<`~m&rVvvCaHcwFv%h~@iTT-e(VRhM*L-A-{Rs<# zDS;LnCa> zNzv)W#Um)4Gxj!O`RaX9rO#4&vPH&}V#A05^cWmQ`$$ldyw@!9PByk#LQTSO1*DOu zW4}ZM@mT??>8j=NfOCnGR7fd83RBOH>&b9JYsnJ~Z?4%@R~jY~^K-K!WYGfQFGZDi z8|O;(EeX&i-HCuWhqX4j902A1I9IOCdUDY}>{1n|1Xl^Fw-N_2jg#e5tB+&PFw?tv z$Mv|a0}F6n+5c8^@C8v#T08#CPpYN7+|DT{HN(sM*trT*>6<@q7y~Dmx95`pzcu;4 z3$#o|MMr}ojeUiT!5JUvtNwwX=PplIraQEJ1BOMxrWw)Ep4GwA9b)A&O5XNH_jNj- z@%FQ;-0vrF+=-F2{F$@^S#UoD8(u3BH}+5E?%e)E#pYJSJZCP87mzruJIw23%raKT zukb%10y06ozG|oIcCL`E?mjc7zQTyWG1)GKKCF4ofJ6t}6t_X^y z*?jv#=$tP<`V<5cwkv|7gshY+57af%{l|ERxa^n5CBGg#rHs`aHz9xl(TsKtR{Irv z3sYK@9GPQrwbF6qz?FHDhWM;BTfrCeb@nZKO{c>PQJGRs9&PF%X+>9Je%CsJ>IkM$ z4#oB8v~U*VHXYoLRe$L2&jTjaKChf0ps&47P?&aj=r=4{38+^iUX?h;VtY$UEpOXV zZ=6a49GS-w2YYmpU(G-JD|Dk5Grw3i7O)mATH8?(q@@=Iqu_le9*t@ShrIkrv6c2m zX34K3{}AHSdzJpv2GGFKK*)M2maMB?qw#@%S=t#cwOm5y91Sbh#g)_j4yLu$_hb21 zwb@ve`*^E4`+9O3;tmchT*e!1_qM5Ymf-p{b0!jp20^*8=*(O-N|~X4*;on30(Mc0 zHb%|4nO*H?)vkHEya=t{v~>adoeA6!J15l}99uk-`6Qk!PWa;j=o@Z|1w~OdYR=ke z2h_^LAfq7Er~;$gw!}YLTdczD;%Zg!&<*|gH_q4 zw+iIZ826(iKChd8WH<%e3&J!RKQ&cy%$pLq2`1{wV%yE_KN2>w^qv32YL(^`Z5=e! z#s8*CD7KkXm};Vspa^cr9lWY+6^nPGka%pNZTZtwQ@n1-c_5z9{gJkO5PjB)UR^wC z-zT({ab_o00!*YYOFF^gf+N|6D$8X>!FW_ksMPF4@u6RZTjd#O)2&_U510GZD z_N$zcqLH`8N+Dy{*^k9Ujj8E!(kNBSqfN0I^Qi;{xmj>_S6e>s!Sog(pnM`QEtK7B zce!rSaqX-55ObGAt$#isKGqMHjKZf8%b!4l8sMDa;~iN)m$PkPlA?7_zJQ5XJ#kUI zA`vWxA>-B1Z}YN-BM3%4xDBuG;G}`A{w-q)BazM5JAb!ma5AWy(-Fx#rcG=}#nldJ ze;A9qrv8AXZEq+}U?YTG*>NDmZV%;eQu{}8~0WbJDirJ z^u=o4x{xVKfQ` zgbq45eQ4Yj^*y7-kU(yBlg?3VsXX} zxEvXWeGuCz$jaogH%&tV-|E~x?!sor0NvLyfkz@QP~Y>`+{Xh6tL%iyxmj^>_CiO$ zEyibAjQ@Nov~!14Ym%1gtDZ7GMyCAWJ;oThy=-z{dj2-HqrN8{L2yEMw1l;)8sI+j zp*`7ZJiieyWk!ay$on@qfbVcG*kRDbcrqXWEcZ+GL=$htIYU*B@E062=A?pY;V6*& z5#dOder2_iH(HUo%eLH7iF(m1&|ts3A}rc)2v$)2ZCv}N;N}KU@Y@+ph4|6)Fp{j) z)MT{~wd%fW@e>`BQqUg55TFV)Da@4;-#Agq#1El&VISU*2pvn&;zmDsr!pfjQ07;1btDx}1c{(Q%a2NaeQ+QN?`h=t|F*o<)eyD+4 zPr7N%)Y*BX{`lrXd-~%m5w94r5^3ZG6Q>iEU4E(8Ek429&^$ziyN!N7IX(4Emjs<( zDXydokTW&s9N0n5lJ8|cDmm-Lr+2=Kt`kLpk~7&LU;@9Li|{Nq`MqTTYJF<{i*%J2g21pZBjeAV%=$P+MVf`WCN7oh%G_4bgw18EJxvr2gs#p=4Mk(ayfYJ8C52Q` zqNAw6^CDYpQp9*obpTZrEu138ndlyE%+ODI=L;(;80^?uu!5(_Cy?kdVnYdbqaIA5 zM`1k!uay1w3>%c#u!zk?7p+Y>#${-cION5(M0_7vY_SO9zT7dFtNG<_7E*C;jp$1d zRCMe7%f1}`rjYk^$t+!P#DaiyN#V7x>si=jS03P{k3IIsBj9dB4l7s%O&SOVpU3Af zsn}vk2Uj4Li9!o58~2 zu=DoJ_K$#w+pcnCjtN;5Cqh7VK)PDTPuz3G0)0bd@pq8g+^g}tk;Yf9P`RODt$Y-} zI0sJTAUA`84Y?XJ-MTkCy?h3|;%T@4ueG<1isS3HMR5r3(zv?@3-0dj9)er25F|7b z+zIa5xCVE(pp69*+&xHw-pcno=iKky@!q-Pjq(0rFnV`YSJke)_u6x=IoH@PPGQ>U za2)f-vtoejWF2u2Xo2GhABcY@5>i4@*ZL-U)w_;H#DRY{Uu)je^7BCk2%QKwQr`bp z_B6l-M@E)yZ*7HUZQy4!5r;Di`{EXx+<&k5q3`K9TNq~iPILUP!NN)(9%7;!OXTYj zZWY;2)_*+&w!AnUNox27*8W@^)CW}=LcXaT-znI!M-3I~czqbEA^(n{-;ZNhvcypGnB=(x|y~aD?aVC z03Zst$fT{7c-Hz@b#Y+7oKHjYLamAhQeY>MX`^b#t#^YXkZL^c6?z2nG6`NJ$}lx= zWc!&By4MRkFr<0akSRa}9a6}YWg|Qu914r(sXYpCE>SA{IBhngadq~qJ4;!)U}3_c zm?&(v3IREDi41yIHTC5Epo)$*Y^q;ZV}*Ng7ZlkO8!Who67!f*dgH z_WlDz`c@nQv6g&0Dx+9PwcpS!Iy0#Wtt92gt^Q5HclHeOOi`+S8t zia&i2r^BK|DZvBzAUX!J7cVQx=6lauE~WE2G%0^v(zU<4tS*U3RlGOm{DlGmjQCs0mg(!Z)iP|^0JR50*624(tazuD_S3`xWT+(bYucy8 z7t)T8ci+5Eg_S-+**>=WA141`Fle`-J`K(M1jUFA7mJ1GeK(7?*UFHK>F0gf|Hlu0 zPzaJY*{0Q~ce*azLTYO{ka%=#uw_Me^S(v+F!}z~$Mv!G;=mvAM9e6Bv0y`nEh#+T zLe4^g8F@Y|mTqt}Svo2-lNndfCnwFcom=MUNAMiyQ`7Y@9nQ^AM zWn!W?$rT$fBu_<0n+fP|h&Yz>>`BikeExA~ zqYvm*>Tl{9I-~N?9s%cIe`)`kSSo`^WoK7{h0%VEm8fg2f!$__hNid zd>ThEtEM`5r?b$h2%^%V?ki}*V8s*zqrZ%1PaI&_wo%)`bI{A_gr3Rvaf(^en0EgV zf9a@oBlmPX3R*0DOLL#a!$7pB{V4H<8e>no%>lAnqL z3)wbKkEup~Y6ls};-?>{Go)5oz$mEVOX=c%IE~_7gUQ_YK_JpCuu)>&($@nfK6Dh6SovMb%s0h%cLdf^W|3 z8@?)Tn_&9cGP(e`!V4NNHe;qnFCTYv>9bY!kJY8g$t*+cR+L9j)THqXMf(V_R7m%I z(;q-30_MYxb;u0x#!Q{rd|9Zi+E5&S6K=@@m+cW}NzD5H%r5?0?!&+1694xv*D4d! zCWDWHJd!NawT3(J2l<|m=yHW*GlI@K-|eWj{J^0MDrDQ+v`oJW2EsT#*VU_%Xin!f zI{vRnfLy7~z}I!os64#)6U<))&ff{#*H;F3JR9b2=wM3@njeDEf62P}Y4ySIm2(Cj zbZsHu97M^LEsWREuhF%~ebc~h&nDy0fT=)&sDE98NeqSl?cxae!AR*;V0tK^3mZ5# zLBA1L4L#P6*#kCnfS$&xx2I}|D~9`V!sx$(fdBiwat0VG6PIM8VZ{@_ahRN=7az+3 z#CdH`-vHy29D7=TE6mc;w7=#2y-CW4726rM7PK!)%Xz#I);+hT^FGH^_-p)M5uu<# zSEhfhiWwuVXuy3FbISg3A)Rlwrgd)r@W05zWEEk@5vaCnVghz;AZtpB{}nh>n^$1Y zpOsRhD^4UV3ZI<35~6PC3NVR@!q5lr*HwE~?^|aw?XWDCMTgY~(`g-dNaN`{@1p!+hDeyas3CV&jmkNbg7U#kt~a zT19OvxzoGWhC5PihAo&Q6+uL3=##Usr~hGF{er9C%^6zX7ig%fu-9Q}Tdf&!XeDgT zsendNaV|jUG&e0_b-(>HH{|K|i?EtO-5*v!iu;V>8OBc$Kvp#NhS2tl)HgP=Tsvr) zxi!r&ej*_tAR!@GNdLNzWU0AZd*Mor&AkNB;-WK3IV^DPh20VJ6_-d63zi={b4)Q2 zk&3!9DW6NaQQkFyB8WwaLgZrDc(K}4Hf^ZodbHL0=P{C2PqF-P&(XZs$tngMJaf`V zvNv(H;)Hj>MmmhXBVlim?w3PJL9m90A8$qF@87Ts zQw-e~6mhS3PMhS6X8b$#q^rr!l*=jL)?$w4K zQFcENLfH@+wCLY?uzVmCDtBYnKTb-ZkVNMDSev4?T4hongZgO^d@y%gLvBp{2Y^Si zn(cD3vzq`?=w#6A!fu(i_S0$4?OC6iNb@H91qwh?C$vb%_p#f2tcDD8SW7eeqAcQtN^UAjkz+Ov^Q};R`1bR8mug9W(e8dU5TzFA z7GvL6JeZQUQf35#tzQ z2p@VnN%-XdaigPHyC4+)>YDf+Thm09JOMhgq=VK3A5Q;)Q&=NNI%obyb9E*`BZjP> ze*a*(wbV}pQ~G$msKAk2)I$)U*PW-IwjL{0?07_IYuKVb0r82*t6cf7N=D-=P1ibp zPE82mXUUA)>}rgs`LL$)0iyWMi(T(HJwa2E>{|PE$*0=JBnoD4<$*p_7<)XH6#_( zikjE$s+Cm)hFeR5G$Lk5pybNMXvN}}gh46E?aO)$Q-JT$a5EGUbfI<%@$Gw>0y)Yg&6edY( zg@ss~i}?_{#&3^N=sc79aNETy;qV|WF`w$Z`b$u^53jp$&c0U`8qA{H4t;2P8cZ z`RV!;#G6{s#yuJ?sJJzd?{BW3sc6F;!Fpj~MVptN)z)E2Pqk93oCM$?_>Xs>U@Bb{ zX$8)*g+qLSvp*j|eL{5eW%BLbee?ayW*N!Qq}ZM9#z&2W-TFS$;FDVhmK`p%yEk@b zf0S{MKkhSGAv(4bu9{~Y?Pn~SJ&BP4`hwY4-7#l=TfjC-$PHx|e0@F5h0E-bTxCkUD z%+i4nsU_8A!^X=~$t13~V?gfMN@*po?u1IR0ddazCzK#17Wj7V8J`$7S>%c-oNxdcxXYMl4#)thu?e`s7?4SX zXE?D4dy{(!L*w`mOeq5jl{C0iG#ZS;CXN+*GUbl0u5){aI z@u1T$2oz5~VeP{Oq}&G-+-W_%dq9PYSIHG2fT#FefpAl<=@UI6#h4@&I$ux_YKXU2RT6P1=NqOh!;qrB%u z5A?*DW8+Es90%6S!SBIW(A=*joDR&YDuOge^&#?22ny$x zMeo7)qhduG;6rl0M_qEyOl#L>VideC?Jx{-Ct8ax)mivmPMzs)-1TsQOi|#BiY_^n zJWqX0$skbmy44y#vp|WKGL(XFq^PExt|`yP7@ydD=J!=x=4!Hlu5uX1Y~fqhBNh<6 zjLWfgRMY3~u+Q=QVH9b}aJ*B@o)+S^BR$U^UyWH*e&PFi{}~NWz)W&Se&r_?8DIKC zWcWDH5DlIv7FfWoL<66nD>Nk}sZgkSxiR#@Y6$vnEW=05;Zy&3)KmKSgyWhlX|5}z zU~l)>HU*a(NzI2aXGeA`ug`LoMvNDv8tKs8a2zrBGi_Ns zRaZr+i}|aY{XF3!APLm2^*@+_Z4O<$W!HH;wa$ZbdKKLlAD2J4i|kcfo|F?w&P%YB zOi&eRdW^8mff`2V-4ddrJ> zAH`4JZK5=`=|n|!je)}?ZcopOXTZs1k$KKdDa-p5N)Svz$1q<;q3x;@6FJ6fxEY%C zekzcIUo$~e(afY;Yf6=Gi3Gq8j#ia!d>j3~29l}j2^J_{mj2N@Wx4leJ=a*HYEwpzkwoj?otf=krR5z#>1>po#cvIM%cBZj<80*GeU>_#xytRE zzE3$W^E3!Exop02q*A}8ZuHxZq!o`J21%IYKK7Z#m-I=KA_Yvy-oL_c2I%4C&eRw)OLt`?5TKAip!tPMD1f7>(OJZ%G8%WDJHE0ry%=H*`C2;HS`mFRFVnMYfVxH9!qX3@jpN% zCMAb|f@UAHVExR1-K2T_rvP_`qMqP8DeCdY{Q9%v3xx@(X2hu6 zbd_YcLgjm>1|RDD zM@Zi0hb}er5*lvWG$*L5t&;4{Mtnicta5V@ooGO0tyS(H%@cm-?Or0oJAtb2!Hgpc z2q5aOTY&KAz&7Ve7ONz?QB1Csec>dHp`PI(%Q$ijy|KT*Jn(7P$u~aDD>Dq~dzYg; zz(9FE_Sn;!asVW?I*F1BgEkiA>{F(a`5t)zrqbBDu#FY*Xc%zKPt8ClK^^6S3 zw$)4u`t-j>BH-Xfo#W={gD?4!=eqLC0?;CQuGNr5>#&$7w+jqD@lx?tMkPdw04YbQ@4%% znw`n$uu;POA2i>ijH3szdK-Jl)()BCqxw6VI*Dlhz2ls-0F<`Qz#yod0#hUT7b!VO?C!?3_TIXwN z#S_jf03aKGd3<_9{F;_sbaSO-*AMgZuKzmv6>#*9aL~XRIi#CP!PP-K7xA50GI;QZ zS$cZa%n~c$a{**Lg0H|cXhX{se12?)5y0F>!nena`>m_PM=7We4KJBnHdmi32B)NqY6fkVNY+01 z`{_zE1`p@je#_6myf?@5`V6Ww(Rjg6FOSXN+1pr@K1`0+`9WR(Ixm>PuePK_%NSuf zO9oXPMv-Hs8BOQionHOaQ^~sJ51<=6pKlR2D(|Dmpa|N6G&{a<2@{Dv>}4U51`-5a z72mY+2a}n38zKhtiEB!)Ffe+rUV_wzc$Z^VNOUoVPIt3f5H+=()BxE_ZfRXb)Sw3x?H~#_kC*C2Q-sA zYC1*^ewpp^=7E})7aEc$Yt0Y2mOd0hz9^?r!<9Is5A%gX{L=yV8T)Dsbm(1Ai;>9; z6E2dX8+SkT2~34Iw7xZv3q3x^V7aSa6Rc^9!Wf~`SbE==f2Qcodn`Z1ZrF!N(Puo| zv}Ar!kG((t+iacAw~660|BvLPY@#c^YN8F z;+FXwTBbGt!(_ZXEf}o_J&wKXd|mK7$`3m|IIyd*sn9yYMYl1LxE%D;dLBz0T{)cayM1{66LXe~=A>;9Pu_$lKNF|>U~&~T4dDa zql5J+z%jsD;ASIw3WUah+o>}yCwqDYVVV2G!+avSVYh%> zj!2HiAH8Z{%w>_lc-Wuo^cnv1tEJKS9D9KC02#t2z#f_Do6X|Ek>KD2o_G033r^`| zb?o90-O7q$d$q;VNP_H1QyGq9qcGG}yBbzJV}5)DJ9Dndv#?F&SHsT9(hr)t72g-n z4fS#dRT;bbwv!WuaG^;M>(yp_Eb+M;UB)3mSH}$@)CYfd|0&D4P}c0b7R z@i|&Z1mi5L59Gg-q-rnCsIp>g!m5d%Gcq9?hXWOOS7$!(ZixLS7O*VWClw;y{k$h! z&^x1r8Ygf;$&c(51tiP{>wOkM05rp8c{1_d-x!(>2AH3y#2u~lp( z4#y#BVMB>5=&#lQvhM6O=ugxtpY%H77qx?L2CUtv{@jVTf*s zCG^(JCAT(@b0Id&S!JmV5%VC<_VXrAAuubJlBx}kRBjW9@1`|6td-Pm8^G{^@x8(n!huL1_4!r&hi72$+fQ+B-nAB-G3s4_pw)r`(9;c@z z`h~V<3Kf+)aNh{&1U{^PYfOCUOQa=RS$TPE>;bHCe-S-K^kHnjKFNtyda@?PtK{NU zQkC2=)ajYLw}=g47KT9&a_@$*gW^Kbx>lm)_4rffyWTz|M13tf-Q{fUqjo z-h2E7p20Bp$p0OrAYKwi1dgKk#cN42ag4@ZMNj%JmD}EDV(fdfURpEZw0vV}N2Df5E-&{jr^+|9oJZA{9Y`s818m4C5JIDP z1&mPm>--8glLYN8qqdAy?2(~nvil4{6mLU|IWsrJC~@4)<`F5>(%OVES(C&UI223#t_ zSf5<2nf@Gw%6&pVUq}DC&-zN|ht~&onf!AS@7vRruwArd(BMY$k=()(@37>bs9aTsW^XS*u8WFcnoS%^hT{yQruZxj10wC7)jm|$=X;{0P3Lx?Wf1jVig}&8D564t=9d{?r(8V?$EeBDkLn8{<;RjQJy}sA|tHoy85zBgC z6`FmYgQ6d15;xsE_Fxkyu(2KL?bwT$?tm7r;CzV&u}3LDqS0xps=d07?&ezL44E-Bn>HDk+b5bn2IKQ)ttB#NGr#Cc5uu~|Ex)ZnUK)LW1zIhrV zCttt4*g*`MSgaNpxpu)Z^lqJqo)(vX`-$4^-ZLquUbC@DGQQg{>k80rfx8rjZJP3LA8x?YFFc4SNcS+y!T!G%f7B z|L_5PspJn-RC$DxqP3ba1N7!?-#@k%OrXj-*MBogbrDiCz16x7G2+);)*f)#|X zc*s{W0-s?wHTmE}z{y+j%OYu{?dX~*;fvcJ(BX0zsJQ5EPVCQk-=Z}U8DThoCTw~y zBH&3fv>whs2&m0N=HC<-=isQUAOKA=!bX(C7^aK$D>Jsh0NwauV_S?`$` zbw2?LaB>mfooCJXW6p?Lz1sDQx#A_NKNv?#&8?Zwtmu2{;?D{ib%!*`G1oErWR&IpPA(x(jcG%&0 z?}>l0rrlhC9G(Y?9QA!HAR>I~)S(dn{k20@64|K1DQtCa`PFx`M(wMoN7?WP%ab(` z-~0=d<3JU4x_S-i7^H={G3~OQaw-#W4v;C|*Po|rUzWJN9GSc6Y_ z^iUwkRZ;YZ`iHbD$>WOtPtYnR3*jERjJ_|zeLcQ!z@H2&WTSyiH=X#X!gy|IB{Bj+ zf`bHdFQrcJy3dbr&0-~uR6w-8T}dk+H`_NuL`^MOlt-pNJ1NAeg^j%=7t4`xd0FPO zCN$_oN5mnkMv7el6i#3>Y0zmM(6*)sR-=9+lPBR5EZ=B3Pk7v@)DN~$0_j!{fIm4E z9d3%vv>) zh-ux&e4GtDwED#U-RDSsP*8#!cR~Zu_f)mZu=>}|K2kV^$FWM_qLX~O#;`~?UG)I&44%~BIdlu)T!!{Y27s9sb1iRbzds?9}F;Ld%) z>96RUlFlgQ4-1Qusl!mbT=eaRA(xB9V_ej%jLL3Mj+R=`vJg4V&>fBa%e* zGi}-<+6OKWh#&D9?B+$+$n{2zh~SlL6IC&BWogbhU{7EpGM1S2Yh`kUn4~z`lKaSk z4EqfR16!ABD0}g49$;+HV6UVr!}*E9F?l+hnOAQdKPTQcAg(k%GOquk=xl`R6E*`c zij}dGq(Y~%qz0)(ko1m)$4jdn#1;Z~f*4a?s}^9KLZd~QhzQHMkeJFog=%E2ogzs= zttG+}F8qX_dD0BNM0vBE@I{_}KqVRlYubIM{1=hk3h=h43m3)zJ+WgZUf&Mjd3Q(R zMsOPZHbO2;NSq=MhIXww_2VfP@q!Cr6Y!I{@Il#4yqTjJ?E<-QVC*)(vJ4Lq)ZavVb z(+H$1;V?NO3tE<_vXtm?WW$%SGdMVUE55}wnnf;JI84Q+6F&^b=Fs=P@1QLDtVwh& zNGIv80kzhWl&{t9V3=g;YYi!-RkSPULRaZ+^?lCZM#0*)h`UMOH01~va<^b=veBO5 zZ{{VJu$6L9I@;~JuSA}&KsG@Q3Ar{uFpenU)kU$7>sK+jKR$Or(8&oH#9nw9r|2)K zyKs%RRdu6_vi$0~>UM?OvfTaNXJSv4?=?{-7mG3B5TXNt*K^0fZLGoI zrww7^%-}f+oEp8XmVo+lg}+*!J?W1EZC+}CXG;>EdPEemAvQ7=WmpgG{(vGUm6g^( zcC-&Jj_yDeyv}ksN16d|6UhM#fN%8+bH`}o2hbA$&R74F*8iUc!k1?%BabuPBShBG zLpqI7#8Fk9E#m!$H)7r0VCIK>^4Uz=pFjg?73u1c%%)ge6}os2OkYaCOq`u+qib8i z1jZtUb1)++jVRyBw73S>TgoO{qxlnKmjjOwFKOeAM6iP575uZv*A(X&u$>&Rguwz! zScnwqDje23?j&{cN?d$EzlLsveQFngF5vm5S4}z#*qMLgAOA=7pWg6l6_efIpd463 z|5A4e0xZF{5cI^w9=LsHG# zrDog2EZ3qFSH+V$CDsDK9f-4CFqqe7-bNJiHsu!Xh4h|Y{vV=$i_X|b|NTNF6;A+= zx~>{=lTLdT^ta3;O`5w0M>pZNS5)O%^YEwjuvd>CfMN5Gq3f?iVRqL|1CN; z+0-Zod8ej}i3-@-a-nLVLEhm8XeHr+rTYW?qZym=2e@`&m=MatQg)KNff5;j+U z9hxVv|5jKVVxVc~mr5Rc^^I~{s3+;_cd%(7Y%ujE^l!m8VkX#fI3|SqgC;6FR(3v! zURUXdwl{C$*!~_!E67Vz=r{G$@iGb2f}=1OfBA(9*8zA%I4(H)afts+Or<6chbZ&{ zzAl1w57WTC?fd9z;UkQWeG~b}P~bP^7px0zY~;E6HT~BBP&h(~<_wz{zrh@eDaC@a zYs$WiQ?`wz`w9Zm?y#iag!c)7A`GPHXX6p#aM!)UP8DhW2zV-Iw*uwadRZjDz3e+q zqoZTS)~rx9_?=!iy*4DVe`9!vq6Qe~?fX9@|1H<|Z$*P5*?E68X@TtUkGf$LQuSrXP~zN*xD@AX`H`>VN=ijrR!;9)oFh;i_P3D+XIxwhMAF? zUT9VP-9;=Zb{~N>NQ_p=HxqeIp?}zqF#rP-Gh@10(@|Qhw@>2Y0@*mvSVbkPARJ9( z=&!u$Ty}@o@Q92|KBckisVqMWRY2v=Vl+vdYX8ZT^%%m-vo*A?C*!{t6(h-Ps z(vh^Z!*}4dK#*b(nuyd;ctk`@On78utaWN)Txw?ODg~3Kq}l$u>|aj z)&dUew4AmMgS*=fc~&XFz*(B9xtQ*~=;`!*@M5jYm9!TWJaXXuT&r%?@a44bN|Ry- zaMy|cZxgxnrl@H9X3I6lNMUTulsE%ld1<@pPN&y^_R}^un~KuqGT_d*=Z}5G1wXjj zqZn#iv2jjIshQ^VPxB3{yFVLv@DM~^y3vXtkW$!CGcl|yD`lt6HGKAyG&OC>T$Suy zb^)u$H3hzx0B%6?hi!B_TQ9`3b#${yW_z8f2CNs86z>f#ew(ElW?myOXeX#oA{cgV zPpv*P7>A`oa|E!L`fd0qe-+{C&)U)}hG`XFlW=fSu=nZybG@W=ncz zXn$W{VPOOHVuvm|@V6l<3}P+pMQLL%eo^6I{{YVJ{(p=;@u$HCeKwp}=bt;K{8Chq z^arAQfu-tT*SX;q5IVF5W^0EDRaU5O!agR zajAMf)qh=~YxE>ZE~d6CdNV7&xD>le16(8v{1ypUds|Ku5oB^;ypq1s-`}L=JrDdJ zYqgq^V~^)69v_3kOHm+$L0zaMz5#@1t7(rLqOT8!`#IJfN0lXRx5r*#gnqBRu}$)w zy7vR!{?OnoS9MQMr~78xm0JS)7MH{6GnL;_cs`dOdSi~48;obgjeA!V|Hw(%+1lE| zh{w3DqWFZh6}7A7?e);Cyg!EVW;vi-Gc{)DlkBx5S!R$N{NpW#Xjwmz?5u?bIN<~p<`;V^!Yx zXGn4l!^1z&B5V<`#|65cE_2$=O2xRHtlmGK(RsIc4;coYwfofKDpb!^w!KKCbWi@2 zB=#-VZeoGjDRIVq{qn}z^4HRaED066|hwwUEZ61?6-OY2=l35$jY=h`Z2LmauPcyu|6=twU@OlE zi%=$oF)6T8x3#b$I9$ckFSfzEA@2Q3CybmYE$ChZaTpZ?Lqq zbVBges7J6;i8RmW(bcxLR)q*U!)#c0hM9Q2$c^b2%c81zCQD^=!A|ER$+asMjLp^@ zCjK0RCrPrK*!y79Z^B#jlBxc2q|D;-Y8ce4!=(jV34pH_eQ=27^<@-WnNXTwKFFVIyrdH8uI4u|Z za!ktahR(|Q^5jHEM~CD2MO5otynDVvo9j6LmEC4hXztygKc-FcW2ab~MSY9|mhIfr;i!ZY?6MJWjlPN>)xQr^k@A2AR|AwA* z9*>WX%JS4%-+|}K7P#TSla(FB(8|Q`ymo31vFY|7Nqnz4C8zZ1XGG&@@6@-LQQ&!} zWewZm2fJhJ5#6C<)ST%7;10s{w^&ra+RsM>H9HuO+)qzWM-y-f%Xmjo2`~zj*(Pr% z#$hwC-kmH(y4C^jGQzYUiD*6fThs;0yUlU8RGd?p1_~Kk-}fGi&~8E33mK{0<#=A9 z<=8IM!JFfwsA)?}3y!`sDLoQ;H6ELuOVrgc9b+3L4{^)L2P1sWdLh$uISs%7-^J=} zW1~_Wg{2O<*SR#dM`Fh?9)1||@9XSHR`7TNTVcJ=2ihvCf1gwVIID4=ueifRBCmKd zHr*f38Xg{=FV|e?c+An`PGxeF&uSd{2fL2|Co?HDNXcul2ti~7&z6uEczCreKZ@i_~LXNgT9jb?Xv zX0z^@v{3L;nXjAY(14`mzxmqk(b?8&Wl#aZ`uX5`(BmQQ zzx2F7kbBI68l+Wwu4!#9h9vMf(cYcR;fJ7?o9B4;+_5|r9~=Y)h1^~-|6~T|?T<}l z@U9TUfjS>9Ws(!n7I0qdLoTBMV9sDN_II&f*sKCboXsq^xGdS<%rR7wz3ago6=J;k zcemRa+Q?hm2^g=LkLsE&@MN&oNFkSU33dmdsx$sO0R+n+rNw&7ne+m+c3}IU@;`;0 z38F8yiy^M_)dL>IeP^}U1Y)48Dt3QJ+XuHiGWuYgn!$|a2|S+Ejq@32o^77i-7}mF zay7YvN3-r9jxnpUtF7H$@?+&gXKw116~eE6Tox-)Ww~R(Xee~kP*c0#&-n>Ho#ziL zyiZL57?+FmPyEJWGi1>Ow3tvL1McCK%q5cGA2rkvq!gxCm#aMnW|)-MOPPc((XoPH zZjZn6U1mjmbP@u$kOW3Lls0IPeRr9{ztkMEptwnN>1TvFcU-Nfxw83_;T2OJVEg7{ zGiVLf z_LVt(zA8-V)c&xf-Sp55mycMX-6Sn9U&(>1Q?3kdCkn95wwbKX{fLhH$7@F)_3Jo^ z|LEE1n4F9pTLlXtm-RA|9}#ao6CIPXz|X;mUz`ATZ;DZK(AN(15@)@@yr}$efAVjz z);O0TZA-{XP}ccw)2R-1IQ;LQ=H=-$7s%86VvCaX-&I&|sELWm!N0q>Ka?`bjkYUr zMtj?+NhwM9ZS`GnG%CQ#e(!OkANFY;a?m4NKBkoERD~x|%;#}>S*h^}-J0G~^(zN2 zH^^97S&bw!Y#Q)A6q7gEgKB^%h)lq_?)KXIgBXR#b8(VX^sB3lzLwVQbX3Zw)-|@R zmR9L5lEjUbu53I2tkDJ>CxsdI{rX*3Wh5d*9ws#-5EBbhpXE9DQAGEV(x5_Pk7+!yPqFJCC< zTenTmkqBI$s<&fjNJy`O#e-KGPZyglw|jykeeZYG5ws&mM@8XLx}`KKYFrK`1$ZVc zuY=IO3&Io|W_@*OKb_Z}JmxaDu{I!netC?5CwWNm>D%qYl!qMaPY`ogceONnYHBX| z?T>jq-*BluV?13yOvYHkihg(e9_o5J#>R>}Uv61Pyw*lD0hfo1L`OrjR^zlkfK0IY z?q%Xc0h>v0i=k&704wd$oxMG~l}25^`t}?YHqYLWXir$fCp$H@Oc;G&N3JknfdMV2|{%UL63!OiY6Z`Glg~#0Z4) zu>Yk6_&`WIplMYw`ID$}JS95C%}r;E(P?Pr;0WI%;ZDB(3MEPRUOCNOR*Xgyku{R} zXq}T|wtvf8l$XK}Fnk8>M!tu|?K3}SnQ_6ZlPi+Zhl6E5J$}cXun>-8MfO!U;fM~e zyGo6V!7HZr;;N5O?loVYo+Bce+M(cbyrhPTo=qNaPsjQ9GY91GOE%6O?D+9L5mHTA z*LPENjXvC-rB!L0nGsJnDI_XC=t6+}j{l0|b}89uD6aQ`c)G|fM=y)ld3Z=_urAQ} zyzKs}L)@|FL+^C7CeJ<>vG5^=XSJtCpMW-A1P*)2vyl zwA+Y3nt;qO15FUI8QJ@Bk5cEp(g`r46lM@#_8GVCgG=r}uZqka*dhoun8&Z!sdLUp zvlo;8(4MykJhzD~nibl;Zads9qC(q;O-?Y()6maJA1g2`zHB{wkC(Ag40+GIYyMulb;Bqobpzx1P>n zZJ2PF;>u;S>bz(ec)F=xrS%NIukL;soM*{AP zxQsYRwa_6$#Yb6Z$Y=txv=8Y1v7vuyX3NYKkOXLApX)uxmL~)rz1NF!TC|nWV$E~B z-uVsZn@bXTKsNpcwz`}y*P2H5^z@_+&>7|Uz5MZd|630bV%B_#10|{_Mm;tGjFahn zzP+Hzp0*Ut=W|(JqqW!@eHmgxUP(_Nx1?iWSW|8(Dk$H{u*ZG{y>{gFe<1f@9x)+~ z2=YfUcsjXR06A*re7JMj3QJHGa@W?zW4#4(Q4(LsCV-s*nI5|!wpiX<+$g4=p7l;2 z$=z&zAZr&}&r7KBzMtst|1(?{&}k}4DCYa>b9W7%!^|&IE|lGd5f_m{2)CMKK8)*? ztkAEKy;u0|IBggR|9m-OulPmvuG@a8#u%PQf{k{BrsR3pW#I(~KojAlK<0PWer4Cu zFf~Z*RlitL>Nyv$+aT?$JGlMcQu5^B~I@MO;a>- zacyqatRV#rkBsNKRjh8#=eJ3zu0hYBlhkHBXeb)%{q*aRA*FASOQV*Vy)6cqDqJjJ znprAQjRq5fal!Nn(T{l~ox>hQKkw2X*kO1~D!inmmI?}f7NeHtX&{lNah}(_=H}N^ zQO=uA$x*0t*$0RypaG&l9nGgK7JRc>xji-1`g;}{d&=uv3sYH4opXN~`CzQ$y$XqZ zZP&T}AZQo@N=|^bm9d+JjMh!`3N2UadKmR?niMgv8C22${)R_(Igo*wOlr^Kb%;x! zzYcU;MAJv5aJH@9+d zt`A&>rYR$xQ}bg9){FFC4^h|3l17;v9UIeKQvs#Z@mwjivkzF8hHHh|H`~As9D!_A}R5|Ld7ndH4d07o4k|=5GnJe??<7+AaJKd7f<6sT4U< ztuN6_UC(B<<-U2{_ZQti-~fuO{p_iGsu|#DLls%X?}owxeMo-XOZn>d?l?1Stn`?> za`Tm%l<;QEZ0&@{25(-6JF?6|(e#vNQure--!*QUu8+OJFq^PvYS*#Nj>d)ysLz4# z!2aI=Cy{Lur@jfgxK?jhrGoL_l7PHF?o)d$}l-P)frVH|K)Lr2*_$Ri;S;# z{9FWIOn5>(88TU(7d&**QqV-g{H}31Jr5us@=P|G6a*iB90~e#wc9Sd_^trefcl@$ zkST&!ABbyBYdroR$}b!-3Q`f_(UB1m-vPf3b*iYUo|cqTGttm8F6$=dAU^KjO$Z2V zrt@yf_cfuVOb4v_Y8t;-;tq7zBRWi#DUA8O815=neHqhA{)Dr)yY~raS3Nm}G${g2 z1YrqBgS+Me86yFoLs~BM$H{UHtTgBTUu_lyj-6FHG$@RO4x{^tI?yePh~S0b{iz-3N#S~^>*-`$0=DuiH!|@kkZEf6c-#4jLF$Nbv`f z!&D)z*kH=UTR1o zw0YVjc*;nf#U*!q^W_J8gpVfTb5c>PVuM8b9Ob}{cC0oYBY|)Ukd`!4>%VO{VQ69h z@?!jOrI3SW%;W7JYQ2dAelOFNI;#AXf|a%Hvj6j@?PK0?PhKp|Byw8Xh&mp?8$mD# z5%lK;DJwS)s8x$W1)ttrB=)%`_`c=Mig2OkP1gUvGl%uRj-#od^|gmyIe2|MK|#kUQw)e$0e7yDQaw0Tn~8+w@&;K?!ZpSaa9JdIVZ}G4?WwC zs!kb<3uKhZHYGQVxAvSEB168pFYKc#h)*r`Q*8QP{B@@DL1k3fSlGigFTIkx1g=B@ z5#C)V+B|`N7Ysc*PNz2*S5Nnd&O>Yy+(fV0&Rahicw#P!*rhe=4+wULpHcamy%rds zRt3N4BqbzV0U`mlK8D}?(wu*mNnv)~FEo)JJpF}31ma@Y7jGn_;O0AUTYP-N1kWQA zBq1R#EjojH_t2QDcVq36a)uHzn2m3eAtdvg?ywkypw8+N_c)C zp}keK@DHpp41}{@sAOQEv!1V~c?vCCsLXg-B)@DkYU@t)S4maR;`97eFU))J1Iptk z!qOOPAF45U0pw>tQy3kU_fNIing`<3|B-0X0T)RSS+kZx2=mLEBi3<&Jc<|GY&-vW zW>R22gh#lsoydE}eOJ{9UO0(0**DS@vzS_ymel56R)~srUUY3kg&?kiloSm~3@9wohRkvs%*{-{{V8LqYl0 zOn3$;+qJc%y$W+-1a6w4&1&IgV`IZ+dU&Xnc?m(-{3V(Ru|UTv zMt?t%^V*QA2I&=cb&WB8YL)&mmR;0B>ix)I+dsC7i* zP1tF)1-T9{Ivg)lgxdLBZ$3hL-w9+p9vwoYVI?~rFboramk_b;Ff;Jr22W$l3Ja4; zSUVf6>5+Jyuz*G7gvmsu&mo)c{bxX(d_XR}+g;>qC<qLn3b zkbL5EISLGy?gTYLmX4?iK9ClG7u!uo7L^BmuBYI=Xz54|6gjXy9^E`wPfvd*?8fij zz~nPyoS88#4QPf;7WV30ENCMrY2FN${tbk;R@ewCd(l(Vvtud!%#&=1lBZ_@w(oRd zJt2rvqKQ>N{YpyASD+~ZR5r0CFt)t!I_^3sp)XP|Mt0oU6zK1QSAogtFn;rW4BBM* z_S55=j~O`t+8+9m|ibAEkReY8WEmAgx0`pG>GVE2e|M^1HW8TS<;0jI8XE3o@ z8rZf!o84rz?2Qb8g>nqcbgw4-HWWPQ+1Pj2&2|kbO4`c_4eJNGO^f*Q@~rqAhpz^b zydzU%`7RM~xtLGPIv<9&`Xd>zQ$LvG3kSk2!+a8-y$hRSWm8=)=ku5y0%|dHWb!vT z(SS}$yCJVa`UgPnYe+6SsD|whs0WKeBUj<$o9;Te{%c~?W6~fk^r}{CKa999tS&}J z=>$;k!8lgK47JC#CX8hEV5ul)wZ^z;^jewN3I3OX;wg~8u>&$hZ-zSm9Y34sm*$id z^@BLHe%`a@(=I2$!?m&^{;bRS6ha&~2C86bK{xnp2q;s|aO*Bq1>eK{hvaPF zZoLox`)&s=Z+m3dceLVlvv*;~0N|GZNu3n z!G!l%;Z!}XumM#FW<>zQKfUjHcmFd?NctSTHZPiaC_466pV(kuz0Hd4-T1Ow2+*by zQ_M@kf;5<>>nT1sV5`wsTu-g9s`{ttBrbIt=5`UF%cZwqC19*DWL!N5Wc)&Qc^Uhq zPRlE``xYKZ?>+ge>sa>;QylXZaaQea6Nz_t#kV@_m(%U1tCJ?Sw%a4F+bV8iM=%yZ zwqG94PpjWuq|8z?a4?YPtA?g7a(m(cY!67SOP7^Dcoi2nTe#WXe%n@i%?X4NbJAbfx3Ktp^hYWH$ z6Z@HEnB?i4(n`&jgR17+4EEZ?26wK5RZ716iSN@vLE%__em<>?4Bg1E$v=Q|k@mr; zseiYsOXh#PCH5FN_gnWEI_MG-+o97is5|TWmoo(P!YHvgTtLU*xB2$7?oxF~X8Mlq zavkKnwY|Lm4P-4i3ZSzTL?w%r2EWg)snxb~Rf6N56{S}8b&XkD_+N?c~nBCSKvr;W(GQM3%GTJCwMqfVG{)Q>^-9-^G3$;|Jjm?+pMseWg#t!Ws8_(T5y6 z?wkX(*39*EuE3NaDp_2dS9a+vUW23HB3nNqFJ*7xUkFnLz6w!BtGTh|bxK=vE)sxQ zkG$=E0B4W^>E5xd7-+6UW_ql`eY0Fz43XO%@V7LQk6Ack=AH1C3{i+g+b#%Uhp z@woFk`mzI*dKz>bj~105*7+CszP~rFs*x?o|7uu0GDFBZ9l`)d;;F!+|D(EUp(a9x(rQe`*YoUf0Wjcw{Gw zeZ|BdKVD8%q6{lJjJL)oG9lzZlq`n_%c@a#rE3GBu1;9-VD3Y?G}+I%p(GBYKsC{J zrBQC=gOCl;SJ%{=P00sY56za6?_U(tBL{NMUNDDwAr(M#!q7z-Q&(bEf>TzmNpNuR z47l^G<4*9cm#ilhiUVovS=+t~5z9ZhT)*ihPQVACouA<@Pt(k!dUFVS!~QKb%4w@$ zzWBn%u(0Wx{|mtV1|*cngtmNp*7bER`=O2vEAe`MfM z2;Vxm#PHvQH9mZYtsfc&MnSr+yQ*;{+(<+|;RsPxc0gsUj7@*RHA%y`>=lAMSRF(G zw<{Q?xV0dN%qEl9Ku#?6cn@A{6}Z~jRy4Xt@afOVBY$JdslWG}!#-f)lJRJY?#?1?^((G6`JN@^pV; zeM{o`KA3zY@pkKaeZWM@s>1PRxlhj6)p(ga5S7{(n=wCU=*dVC?eKl@r4i{dJ6dev z_4fSnya}bR*<;LS^MI+aN%u%HzO79}bqyyH9JonE7&~-{tHS1P-SBiib{$Tgim~g}lC0LjWqa7U zy!`ldojzwhJu}19b%K#m4++5HktN1;NGJWu24Xu37K?(&qQOje zE&7BZP}-c(|9*#<<@Ye`9_9Nw^}Aj3hQ+rxeC^?DCPzD&q5P%WQ7 zvEgqzZvv@rkc;79XS@kKLTIz@sS-LK!LY&Al_z8lTj5klgp;qquNe;O`V+p#r*7y2 z>^&z5CmaGXp$)bRt|Q46)d&jsEIQ*tyxJyao!r}|Y)>aVPE7cIFMwM5K7$896^c~^ zeKuvt9x$N0iyxx=eQ z6VmYTsABP9Z^lMeD9wL|LEN5OZ-6)@<&N1L(qK3D-D4nagCZ!SQlZO#t2r2d(bBeu^?$JoX^Z(osBh8J@!!916MT^v>=PF+d6rU5T5c=K zYp-uE{#->Z*ff8>nQ+-U0Lld3g_#Nl9}Zc{cD)osB@qjI=X9-3^3*=h_)VHp{>~Ox z-F}+U(Xe2c3Oq3Q_CVNY4P=>-QE4eaVxQIoD{_zAIS@FOZzT>=3;36*0_WY zbFQ+Rj99mye@W3|(36l;@47@&ngd&{7D1<%`SxZx2a(=o;_6J&64- zCNy^+oc0l&C5D><>kuoDy!N}^!a?Td6N-pbANp^i98VMu*g|0r=x1X1?;bGnjkn0awzR+_$#i-AzThqxp8nmW5QzuGa6hU`)=vzg4sti&9vI`&b-T$_=&INMF1dlTV7utN zGPYo5+JNtRqC~XZ#L?Apop*IkH3(EP?)V^!l6Cu9Mv(LE7O5-H!0XM*AJED+>YjXV zq}!UWvFFuZ45*XK+O=aBh+Zd5N7}ug4J@+inrunjZiCUP6C{yVI*kXFC&0#W47#_y zi&Ip816pi)Tp){0ZWBFQWSOJq(|QX;lN3*+lxWNp8hCCFr+swm-sZ`ay9hi7lP|aK zKQ15b1=uF&?_Kf0jH$fA)Y;q*^ozB;t|y5jF8Iq0BkBBZ*+79EI;$8G^34a8qyZo& zU5wTM2U(A)7*;Sa*KuFh=d@eSyAd)u`J=Aa6z1Pg_D$AN@54WRYw`w7#3urwVVAA# zt;~fwjXGC;yN?f3<(kUMr-UrQgLk~aiy0q^i;IOih0hJ5v9Pg6V#)SKulHiGb9smG z{6?Vu(>^VBV;(A8DNn>Ea)RoE@sUD~O&0Bnj{><6RX)O!)nVEsmB^@fE`v!a(?y?2 zi&ij{!ZP>9EHur+K?FA?@zJFSBWbs&A0Ly~9;gOj1Ol%U`14_s+47eI^ZmHj>Fv8^ zBbG0nFW2NVKa1zmORQU6kD6WA;10l~9bTi4PjqeQW-*~Ou_Y9&^jj&*1>u(Z0ynF# zx(@$f!;t^dH(`%vNv~TSBljAw53D1Q?sVsm`-E==JX+lHQTv<92Yo;a1A2n*`!Hi3 zeRfM@PFF-2eweKnT}|L}EoVH+&p~E%qDT?nK``W;O6R*hvxECr*^Nc*R1(#ND(Y&r z!Wkc2ik4AkIwc*7tzHYF{=vqvT~lI+kRehlb;N{PPA2B?*o}(D^6lC#!o>{sh9b4! zjC=JLOl~?g+H*a7y{)>u7p2IDQ%RpstC{p$1s(P0s#c+9<$+~OT_ zV~Xo~M%_sNr3IL8B7)r_jHjl+YhOigH#og-FG8J}Q(HW5^SMOhfC>S{(YIbgsvEhE zXNjl7*!3@XJ;LxZf2yl-IVBPFv2W4CBC^kjNeImGpfL?X4~^4essta7Bb-}iwqy8f zL8Kje9?z$B@`Ah1sDi?{POEfMyg&hr?3d>>v(xvS%fX=OE8#-H`+!|K$pp$B16&0$ zSQ>|>-hhI6UZ2x3x2hJyTAwKZ#(6A0DC--QVdD+6v7JZAFvj8J?ef)|thGiL#o+l1 z?y{^MIinCqks|4A;_T)#xu$l(co*H?mB{JmZG9(t+d$Pb%pGxq3z5lrnoX!gb46`7 z2Ctp}!oLYVJw`aQnE_u@8ct2MjTB3v{$kKR)~;Ac5@){-^FjOh5wUNSqu~- zD_Ncm`wc{tsZH?oPt%zZinAk$wPtkPn7JJ%9S^ysJ-$cnGKj)7^ck+ zSF5`~LcC;5TQwk}c6j)*!|S&ASG9IyVD$Uhuz#OEQEdf$=V7zFHj95bm?jXin(fDLS$;$`m>)cf`UZI zzLV%+&VSWM{*~*8*R}^zW*MoW8W)5aN3X`CWz~y*WGMQrX|NXn|elmS>it ztX+4+&QC=<644jh;orWk2W)zDKt{J8($a(9T{PK(^e#b;%8rOJQ%CO&)+7IDXw~*m zdVm=9f(V)tNv?h^G5r$jdDrvvkgtuqXZ0;W13R+}k(xtFWvzI8U?L)_FsatyM09$ zJLY8tO87@*J*AlU6$I#gw{!bfjE|3ED(ZEnH7W!Yd!3;<^(yX(aCJfljU~m^=big@ zZrw zzF}TKe!y{%?DkzySuw~%xDV6m#vnvxWuJKN)k05J8?*x<*&%`dH=mLffbvr*^;7Za9XWSm=rrga8ZdrLC+r?Mo#Cld*^mB7y%l~ zmiG3B)@^-)4VRpW3LzM5;dMRe0~(hHJ2Hp1B~ZLCr{GIDoqcABc*8fNx-y%d_Hzhf zWv!uU&w@q<=oWazpVKdTW?H#yT+walF#Rc2KNV;SZo<$f~-$tUWoY7|w?|Ua0K9n&}r2k!}mz-+@?g1dGGQ z=o0+>R8+8IBJ++_*mjBoUIObu6D=I*ewD!zsU7Nn!9H(Y~T3mGo2FQk0e&ssK_ zuIi_8QvG`4I+HY%A#tZMb!i3reXhdRzAk`zKe=f-BRF`RLx)iU8VF>4o{W6 z;9J&`k!;N#*eM>JNWr>GEwBn6I0tRZ%b};YN4**S?()RTq1HSY4pjt?N5|Tsl)Oj2 zm*P>e-2nO?V?Dm#Y~|C>kA)OPLQ2l81viODR9U7U_A2$T>*Z+dsM|(lRtyW3-w#TK zgNgI@hMK4wwy0FH_qJCr{2n*5xSSjM)VKT{?slm2y(o2ifOdu3e}i=t?O-tJ&ran! zMEk?^T(n0$${?U&Lg1wD7xvAx(916wKv|xcm{8~VPNg5N`0bc{I%Xa0Gjm&G)Ic?? z7u~-)+hP2TPa1z2_8xb6D=}^9eU>wy+fET!BP^IyfMmCZ2b|?ucIIFe3Cci}I$6hK-l>X%%3C35E?uq>O=h^@AqQ+0v4gZTm$3#Cz0Wyk%k-3RU&-5IscoSr= zjx#byT;@mM`oqhx%$>fhhdmMcCwcc4x3l5n^*Szm%^Bf<0rfkB`lkDAnx<5>a%W6) zKS<|VJyym#y|0va-QHNgItdO*5pQt7(%3Y=2i)f8dISVKcY)7yd0chLvr$=&sp zjkrXLg3WXSyT6ir_B2!X6J*OX9~_ zr}NvUi*3-Di?hb}6|t!5lgPS*Veh3B*2lBX0}luNQRqEo7C_$Sy+I+>1_kiHb;HWk zUhKl<_~e%b{cly|x6tz`QY)E}1;}U%@M>~LH=^q4u??*9xzo&G$Yw)g>O&O6ays=x zR;y#dpLZTP^)H54ioUvje(G6S+-c__Sy5=c&N)d%!9dsD_2?{4qBbk`iGz7wWngGa zqg~6IK7}HrI6uo(pn2zgLHQ8I)PFee&+SiPp>Xyeq~rHCu?#=AD8{KSwDY}C8_g{ISK24=FG&)nH4>j()3E;U z!3H&dp?`ig!24N06razeGz;s8U~?ugf@*2n&=x}f8IC{GO!y9FH=l>^>L_a8aO0MM zo4QV1#=HG-{PiZ^WjQ2^Ij_8Zb(*d|DrsIiGFg*rjdM)ExM%BQa!l7arMGit1Q|Dq z#}Q+D{dHLo>ym8jtvOPWN1txV)Si4fb1c*K}HmBKY z3;97vl2QSU2&Hbq@OD_KK7`mKD$TtaezW7>MlKo+rEPDi=7PlE^EI1e4Bk~I;VJHr7&s1-OdOhrVL^X#85NR zi-^ps%B=dR9z>XJcVTugo^H8$c)?sU*P7a6?f)s=LApX{>3f6W6lnpr4?p|lO!Sc< z3U?a>gJ_!_I-@4-`wryuq`0DQK)I;)Oot@XAecCt+YyTa`hdm1fy@s*kRlE;f7JflI(=Rd|!@6rW+|=tTe7+aVBO5O(Pj=`^|5SXADM)w(6ASV2lU$zde#C@IEAg@0fPbaYvS?hhCxJv zkInks7R)26>ADRkgDLP^MG}za(U|%ADP^!9T~sqTZGUWzHkp;6`Ag`i|NNXKIGoB9 zxvih_8aC4Pyk`wbM`JrVV94N_`}%EKEC^nL3kfkLtuRbSVnZiRKF>$xUjWiAggem! z4^^3?Q_P|7-(<}tye_Fvre@@*&h45}B>xdpa>NoDW#qqjgYE5b+pZi%U*QNu} zL8Fu8G3zZ(UeeO!hXr|0zwLu=bIa?I;8tn2$K&rm;WqTBCJX=l=@V|%g;k{1AhB!g zP|6E@V5nj6@)38j+EBDguS4aa8zDK{lK{!{D+u5xGM1u;VqDT8gOlW<6CoP31z-lRh2^Ak3c?bM z){8W)#r`NO(ko_;&b8C8JhEp~JVzNR*?>bRD*s#K zV|l3Y-?O>gum*z`Ped#8i=cM)v!M(EAy0}St3f^VL~ed^Q9m)iew(}gRBGYDqT+)z zs=~FgB)I?50yJCoTj2u(udkz$==?D6m~;v~T6j&%rRI?E57iysA0T|i5OVl>m3h(T z>fz#cua_Ao<5^g<+!Skp(l&&5w-pqxDam$1ZpkXm zU*ZnWNOG1kIqj>W+;2Efrynnrc_l0^Fq%i}By&Oa4uO@YF`Z(V3~;RWH~S=AeolKx zSl`A1Z2~lT)7guZ$?5mnTTz;*lG4}k56jF5)#Lw@)av2{uB18M27uR8tp>kuP zW*zk@Z^7pFAlE$3n;pgiRzx-Pr0Tmc+av-ROWwx=hP2>!V`35#k*{7aC18Fpz=Xqh z&7<$J{&F(d0Fdc%iTO&V?Oc;W+KVda?gq49s!09%YUFpn>|oc?$+2c%w`je`a69w3id%(fn`Hke~lp$PQN<2qZMdpnkN5na0Kq z&r}!xzG&k9CmY?Q?=`2bKR>vovesS5F^ApArJq*{+A^UE*mo8(_{>I{(;QAqRf+nn zvzgD_W;4fzOE+Ak@Ca(})2dl9Y~@{T^zm}A%{7riJeCRaWM%OTV6EKK)81J6scFeM znS8;_##~DBUONQC2M@LGcQo7MY@bQ25beaM!P7@O`0asp6Fo0eBGF|@A{e|>bS`?M zZWizGTT-_*AK{9!$SsOzAAbM!7e=1pjO>&H$y*p)B=(z-I4x^(-}ax92swO=XP#q@ zBr+y>f&r*x%8`|DiVL4io$12Azg*apuzwoXLm(@Od~4zRFCF{+Mx6SeK*uER9xj|-%Hmx~0c&zvNaSnx)t zKLM%bD2`XI5Tms~u3RXog(dmu0_nAKTu*+#Mp=MQa(Pn>8-BW=+7lzc>Egiws)zQI zxL#1e75uIa9wq$LmUhAXMTh-NGV3EH;6^rzy!Zt?pTP?-p+ZC*B9XAJh#37YBmL3; z)7e=^#nG+l9(O0W2M7|}-8HydaCditySoMr?(QzZ9YSz-m*8@X?|d_7&Ru8C%)S4y zy1Kinc2j%5@;tv?Tp+t*20{{dy|;osSbD^SON~6i1g&_}*Xb5AfhpzYh(A#|HIluR zzfh1MWSO>8{v9sH&>qb>v1uzdt+qJH;p4{E2kJb7tu1JLR+pD>V{dJjKNwiv&zFNE zK4Q`M55JY@-^J5p9Ds0r()k!@!i!M|dBI12?$AX% zP;Xnm$!fQ9(sh~G6xwKP=ndYU?m>;;4uBBI9T{h6PnexVOlnTilMUaZM8l)C+Tz>L zX`EUsajRTAXld4&a8WygB0asDJ{Go%TKZ_oR-NqLtEPEgjjd*#z)!h*UN5C=8M#lL zjo!>_ejn>CSs0qa%Q!@Edd7H?T+EqY$z1dn+rCf5@9Q5J9M<~6ca|nAfsI!9#Ie7> zKU&sLcPy9#%k1in%W?xlv`*$KLYJ6gx*NI1X?M64G{V{dEMacvr%MY9p|(>3UCkDq zYN6Oh(}=d0TBBqx@^-7vaL>7#zT|IB z92+LuGci{`))6ok?~NbiGJaLLw#cjMxgY;o(uHHYv;4*RiGFl{$Lh}~y{p@@#hUIk zy|cvF7pc^pYcyvDr2nEGylQI6AV3Mc7+ST)#@=I{)&+o?5`y~lJGwZ5a z1;-0V)-EzWIp+hCmf(5gV^)w6=uioP3$&dv1F-A|wf%Jtnh*~M+rh}(_W7b6ER^5x z;Zn+94UGpUw54^+*3vZ3Tf)0Nx{w9A83<+#*GkBAlD*XeMPN1y^gRZ1k}EXdZbv7R zJM(?_e%3zY&K;+2%f%LSDCZnRfz#|y-x!+pIG|0iba9oMFjM43fNN+VwQ}#(*WEar zc$7=DK{&I2t)8LoA@;Ksu3%jMj@PK$RMURlSfu)SWj-W)x{&sBkE+#pTpSvL5?rW_}nNI z3)Q;ST+B>(aB#~=BLl-P$rMi#0|EypE!lVp(n;6*ajms-IVF3X)m5?*WA+4dT9mJQ zOT5SeNEK2i3GV3ddJhe9l*nK34rLFcgVv-)P|-+$z!+$HSmo4@R$l7>dWgd6`M37L!Ik6%7B2qCnXf2X>#SVhGR31q9Es0+96uIx(?`qXCTC{xDxXj`)g2nOh)2-)eJ>_*e*(FGd zN-{^dJY%^+JpmrGX+3X^;9n4KUzFmNrnb7txUN$5Lx|kR7OuPG=Z|IvPK-YTqORM9 zosNmaRPBz{#ua)lXm;67_%C*ki~HetQ^s(`dU1|M3%p7;(`*H+WK5X}fDqRGY*>7} zoUQ2S5a;6+dTmwsRe31#@^s|v-IfuK~K#{?l=a`q1UvC4^xv7(b#90s^4p@7h zy=O`Cj=-$i`D~TdlnEk3v#md3Sep|P9V~#$$}6%%y2qB-^rP$*cqJE0b14Pnk8E5UhoAh`{e1# zHL0wHK}Ea{OW`xnOvb3tpjZ?&?cmjc(oJ=Gvd`CzDe;kSX?Q9bITr}{JP-jYSB%Vc zqN46WbWlrMG}P1{$3bdeU6k-Vm(uuOs}Tr@IoDe(*&UZvct{t6Q-ux46hk+@eb~%QTJs@f5S*g+9NlRO0&E!#!$_SnyaCW4td;RI(Pj&_9eR z7Y2wieVYGDOqkvdJqelCaRls{p5#3G+;#~dC_mGqlM)hL&fR3Cp@C>bF$<;#1kO>! zh&qy5mZk%c&`rfG?` zw+*y(B2i;00e#}x_9wZ=aTvQrK9g8ZKDuQCIl1DLa)uP3{hc3VYNewuf>)80SfiDG zH!!f0In-CL>FhQV|H3v9fNgoWHQxitCA|e6K4fNaQfL(Q2c_>fD4AhE@Q!EkS&neT zWu5_lx=zr%<$RN(BTCA=>I6unm*KMv*Gki;<;l>%qcj%?UZ9=G;)g!2uu22bkdOfp zGBY4$`gDTl*XHYXqnGNgh-_{)mG@rA;~Q^smp?V_(BgHr>p!STR?Bt1ruIXnNXKJQ zG|^pNO)(RkY#iiG4-fjaZr=cz>38rg!#eM_SEEt1N%wv>X7uJO0-~l@+Q(213c2*+ z{qfHfOgOuRX=Tl}RD@@;rp8@O-q0p%RqGtKa9EAj^$oD5#Jrwf@c#4Wz)q#Wz+3eNBaX<~ zg>@C;y;N|LJi2U8y0X%t2!LT3BSd<#w8`;vpri4|H^aMk}kF4zsz#6H=y~ zyn+JX^)A*QuDi$QM(f2{qE=U6%tz%m1SXnnW^H==@z4_DceF-hG`DboTsH)1&2;#) zhNRJKu(Jsd&?LRNijZ4KM_ZXVP?CMS2x!{(e$M5ivb;TxNw$SX!gZKW)u-lT#Z_&8f-V`BpVWmMv*l>CVKt!iyqWcPR>@%@~;OR!cJo*24h|> zF(OPmK*&7oF2%^ux4b<~zUaVh0(-+t-kfjy2D-P+b}qq*LCDO!OQrRGO)pyREXg5x z@R3q2h?1kE>n29^Q*jv@77x=KT7-AYuuaM0kYB89zGkRWN5-=HP)HNfBSW?5p@JI) zB1KZv7(TgZzfRnbx&yz{Ww9M$gEp2uk9XZG0Ct;dm zij!%+=0qBh%E^RBwX)guJmNddXv78erd52k(-00iit#JOj5AhMsE=1b(x9fQ47i*_ z3)T)*f45Vq%sw8U(p(6K%4c*rdqq76_M|_rA`On7hZ8Rn#p3A}5Zu zDstNZEB9FHC*kQkJR4d$1`%7`I_)6Dz4WeTVV=~+)8%cFP1~!vr;D+R_VJ4$s+X_) z8F#SxFe#(%!y-Eb;r=Z|EO|%#dKY^#c$P8<`ABb_fOudHY(p?FF7wYB-pDL5(5QTF zeHNE=m!0?pc*`gii=7oG?FsLa(tmxR*mc0)xB@z`;Vhn76Zb$@b=&9VG07K_6!)Ak&6(x$Lh>ZV{RHtQ8%t>kTX(}`FH zH=|~8^IFK^c>_{H@mP|fvXm^(5iMxMCYPP*!O7Q)Z#DUGlQW&$+m8*FyJ0`Rjg5{b znIM()R%}K_gAV$X-xE;SFGTZ$e(T+R+>Zrc@~TJt-o@OV#@g(3Nlu-RP!)^X zRz7@~#>B+faM)#TCQYySD_a`>R!M{+VFEtKCpeaXS-W?x+Bfb(%qkojht072yw>1LT@-P zV0$!3k-q^k*J8{k0uOo;+xa|=g0RNOUQux-U+YXccv(CgD+~V_ZOg3D%{#v;9}gyx zB6aKnMB2wB7zeu|{=N+bgg;%G*}|al{2oi+PAo;UnM*&u3|Fm9*)V@_=CO@6EVn&*jm^fBt+|Od3}d8QZK2lq;Ifm-v`1lj#sbzepoS zbkD&p`PE)Icn0o8rLuw{L&jxrkr8m{dXEk!i+k8o))Z>c92n$?y9m!*2|yNL1+fer zgvr`9H}KrrLv)2&|56v_QZ!fClRnnE6757Ytx054pGr=K37Vww+2Tl!0f$0L_BXpk z%E%O9ewSa-j*~|x71@wVQtDiNPX!oQ0qY~q1G4EZSBzgti<)-@F%uo{yMHA zwhlqc@`Ji;(oHdKG^5&lTkyNMVWtUi(cD9wmuZrL_dX`q{n-b$oG}HAb+14m&S93sp>zTPr#KzBbz|{^ZTJZ>2{o}`sT@{ZBM--CD z09HsStH~lAkP)@ioJ2EB zb;3B4s9lugvnMsJ+Xp`!2c4X$GvsIefvSCP+^%t)oBu~z) zwK5vy^}!r8f)xt{7LK|Z_orJ#B1|I{SXs2H#|O4BX_U;Q`#;{^?p!#@ocqNbFcOyB zCgc28TsdVgTW0+LZ>xWjYRJj=v8f#1sR9Y#Q7BQW-V8TZt=JqkOmgq6u=s6nhZjB> zYE^_Qo)1aJeC!go!q&*UmElp|rLRQ-_T z5XhI#TMeq15a@Fyes8f)m?vXpzcgH!8 zgC@n8G04fOkdu)?S8I4xsO!v~x;t7GUy_%SQzcr47BY@iWfFvv(!Vn+A{rq&>Z=PPbxNEa4H~+DY(R%%N^b zj+Z9pS|UkRN!c(W%y2L3;m1?{(aE(D%%IIrNp$mUe-d(ep^+g(7J(=K3t9wj&(C4k z7rwbTR}0|gYe6hGX9O_7U_KmEK0B0OBL;mn7}r662N7MC3XQUBe@(}S{+ z-sKG8@bE4GHPQGc=VC*bQUWliLvwWHf-q9wH?ny9j7y^Ns zWH0x-sqYmzhFMRSH1(_ow)0$i5%-KxKh`nk3A8e^LkF4IAy$P?lV(~%ihe{O#*@gT zKAaWFhOOfLurTqFK)hpv1c!zxB&zuUdy30ifiKm7D`VS<+i1KIc_UktvoXqvYT zw|~Rj>9x#6YB;~$ylvVQt|e_YMt}VEbVhCqyD~u|iGqyVpHx86q1H;u&#u+>yGl7iZWnn^kS8NEwiaQlyfm3R!Qtf*ONDs|ZGfj0i*%s_v_d^|nP zQq$DbR#x^)TvUWm11SeW3ZV1^O5SN$)J3boLY<_|YcoQ8gnHcm=t2@N=sKMuqm`U{ z!Dnap&A_4YUo*|e9W~DP@~1F#%Zfvt;`3UY^O3CtZhybuWm_L~V>@~y&+%eaL(F$< z)#Oj(@fG7eK~EeROvVAAZ1tXw?g6(Iw*$BgKD|>xZUERf_r(l($7qC!h!$tLA?V3yc`r(ZvUp*liwyicLY6*rO9#A zU^;@1%Uq*7ya}y~sLv>i__w|*sNVrTYW79?ED1BI5xSH4!7456x+}!n=|c7=ZO4K& zRD2h_70Uz)nGXxuC;HSAV!S0}_1yl#Hh}nwv`z|Xh@b~x9=yWRb0b8(N=@<>uqWM_ zkflL%k-C|fL^#?si>}?W7O@2yiQBz+*F3=8g0}o)$Q3RT6CMfqEP(#*d#NQ1|Gk;} z2kn2?%>BW`gPQ77){9R^8M9q`ubQG_=HLL-P0^ra zFI1AlP3xR0LcwIb96k>PJ`oWS*ONs$620IY)QhKTqg; zdBZ$N1m-u#d(^@1kBg1g8H)}ijYtICV~-3F$#8l8n$kX7RAdN;BE1(s9<`k2N$TZ4 z*rxmtuZp3yPG00lKkbYKT+OS0*wedqr94=6jd$0U#1F|S=_Qh>&r`uJ0NbR-jE1^8 z$LZOV*MgyVW&5+@vnOEq+GDp)rx7-zk_=1oyR5I@_+( zvXXdCgVs&y)A<58oP;jm;NiFl?IX3x@H3nI^pl0Jv4c>2Mhrt*1{vHga-c3R z&pWXaThWD%qPrI=#3OjN`ZpP9`eFJ&(9&(|CM{vDT>N(P)eT$0=@^SQVt*=o_Mwm< zASuy6wpB?=qw5;jtdV4CIi74OGV zAwqW?jLhj;$FgAzzxyTRw)V=92MtQvI@jmp01YB){=>PFA5F`1p`Iw;K1lHkm(vlA z%S05|;I4E!VF5%UF?r7_2t#T0bl4%-$2~y{-~qE=3@d{9IRZc)g%YT1FaP+{(?s*F z>hvjd9Tgu{bg@~lfk{C|(fDuflo$?%IwB8Nv)XfN3P^Gqf%{E2gxtG3<~(F%-9ue2 ziByBLGVvRH5Z}*QEFI}kH*ooGsG+0qx`j@!wUR&LQ(sv6ZJdCc0pjvJb(*4S*ur|P z~lp?_e=#+JPM{n`FZW zVRG@la8>E-o~GoMP$pqyl4;XHGalSeH`d1LYmDvm65ofZhOu;zXJ5tHt!dxFvQ;3qICiD!wdSAuOAh}!0mwVkyuL)c?Xyrg}Q|Gfr2JS2}1%-VEG_J>s|g?bR>(Glils@JQ8iY z?cU{U0@>ZmH_8CyiUNgO`f+t;J^OCaRH9l0fY4w&z+Yz2qoddo*ddcQgAPY@V|py^H$G1_$eO zeIG|(Y%I8M?CJLRzntySs`ET0L5PD}oF|KA(2u=#c~jjEWu}f2O-ojG zZHE(;p7hbM+m5PFsBEH9ZsEo+RRNlYcQwWip}gXoFWWH0m}7 zW=;>Ck6B>SlD2VuD|05_xBKDJlq@(84X`wSVs%Wnsz}*FW}wur!}f3yn9XiBev$m* z4RGygbi?e~ws+Nlx_PVq3ls)hD9s@u7t&2NChnJdo4f`lZUMQ_SU&+6Y%9p-D`I2^ zofz*PaojO2RlwKZ(?4yS0#7Q7Pj|kbMsbNsahc?fhKcY2H_Ab0jgAvsRGC$F&NnX7 z-?t}L=uAUwK+k=frxnsw8rBXLxj*J4Xu9ONfB7CiURhoJKnkJI1x=_os{54TMlQ*8 z#TeMsVxw{9#ggUaK=t^Q9v3x&Ku_1Mhsl&nS;~1Xe1MVMR$g+6L9Bp>);r+-{=D-| zunW{>c056}fXnp^;WM-h|IfVGR}ZN=0!mB3*U#{5GHmMAUra`WCsD3WJLLZ2QkMk< z7AGYm!+ScXbYd9j@qpnvm=pO{q1%;f7}Y>sCB4zaX1m6e9_J|j~K^@wd+108nNWQ`A569c) z>SL4C9fuHh`lCDiO$=zpl5#9h(Y2TJ9lM++it7kfat{=LgdVam%Z~_VwOPRqrtv3X zCJ5NX)SCi&B-}lbAtVT7&&#$cdDuBTspmq(>v~wdX^mp-f4o!0c66W9 zn52Z3JLw$7Xv+9H?`IIqZUK;p5!<8PkDmP70zWp>W)4m5M`IV2AD{Pj(pTGD?+)3g z5D?JC^MpVXrd6F%Z*o3lMQo3$q;;NKw?+{RpVD`JU$4-@;!%43PB@Xsa z$1Pb22Nw3T0eZY*Vs`3_jjqYB!##}X6p+@LKLMgqG>t(vn8!{+jk?F=n$p5ug&dl= zW}upsU0^Ah?R6{l=1Tx-;#-(}GQJb+hRg|pnnyi^SSiD!8C~`PU(t_W{mnnHbZW@J zi4+j}{UZAXRE>9seW4#FBMx_jQ8 zC&<1t=CU%gNz19peY1Z@!@+c)HO|1g@BG?-t$PfgXmBXgmRIW zoTR&kq}5li1QS|3vQN7vwl|lWs`w65Xwm~U=yPt^NBUj?JN~QO8py*v2qXL!phsX9 zf%Kai_Am;sYWU({3k+^TrQGpBZ68QPsOBK&VCLZO^vXE`Q}5O7+fkc?dy+H&<^l`} zYmQisPIHL<07<_;J;op&s0B95EHkEz91O`DI4jtEZ-Mx5xNvBu=I3a5KMVCQ7RI6g zx99}^2+|^?$rd=BeSgPRGZ0)2uuGSh8|lWQd@jZ+CRpn<2EGyXE__?a*YOxYF5Gj$ zleoy!%X7DX8wI|P^bBJ#2!u5f9u8<;rY!XUFR_D_5&SpQh5wBEN&V~&y1n0l3TcPP zKtp!XN50R0D|10dNGTdh`xN<|#xS|x?s^rvS-SS%a(H+A%lc&g$Flc>vk(lbP-D!s z;1B>?SkL{Yh0pVJFHG0-t6ZD^>;!)LmoE2ZIQx3qe7i;+dJO+#7BmrHxBu!H7=n!B zcAR;Kbh3Wed;N-rg|$!1Hb~^J!UE6^M!2OqwOtkikK4831s$Z5*t4=P&)aOeYJ9qc zy}ANpxe9(!=TOm6iaKl zZ8r;g+F6NgEGHNeh6PsfX03dY@})CSTx&hwep`y3OO8+W-Q~Us!nmOuM@Mj9VyfGl zeWjf5a$0+lq~U%e`BY`K+_{RT4xXR@87?(zca(~H&pg>oNlxMn2bXmQlZPqbIf2i< zmn)uy%j?jLNv1NZ5$L;l-?aWF0BSS;5&TnFgBDK!l5~=lDb-hSnj(SkgfCG)9>zT&(#`FEcO_6?b5AG}m zVoD^zw;2Fq@$g%P{0}lK4GJC4+sSU%YczOUTz(v14t^iZ==dsmVN%S7gTz3YZ9A#r zoz7|u2nY=M`<{aK=fW|$E`t0k$BG1t`hg-SCUQtG63=bl2BYuq?<4odcgd`n>iCOR z2{+yy{|)m$+KazXMDt0-F$4p*I3p7fGQN5i_ZU!#kB`k07FrzBzTOo5)&>0HdmcvSL5mQQscA>7|J}3UvfuUlq-nEbL;o(e#J&x z6mg)5^o-tuY)=FR{PS8#T#_fqHhR?O`|GM=amwP5o3k35 zRWWT35~)1ttKi6O8rnlwYP4keJ}_vukor|@qDtq+AY+T{MnkRQ3 zH>nL)%Y{C(S;xCSfntsyRg1f;y6@sUtlLDv7-wR?ry6yk3LOyvr|O19CTP8?jga>p zh@+Iy&bU5IsoS4WlD)PHioFq+)D}R5$FE>H98co>RRHXf;dYp`@W-yEeW~DE*p*GV z;aIC}@ohujPGr+OnBNkq^c4lpRwP%EFE=NeJ=Q z>ovlBGe{8}#rmNB22qb7NkY&S)y+e%a9HJ)F(#AOmUITOiE66tM`@i^7AMuFS=qT! z%#1hzj7d9598L}egBAwnFaVUt>2&Tg?x`@G0vsvk{ei%RqtB}yx9TOvIXa(7cUP(J z`-o(Q?V9{2!&S$Vs?2%R)Di-mE`s9K+4k$#m6U5N!lf>H3#743?+}80L%@W^Zg9__ z+iNLo0Z<+G+#?8rUkh(|2c!95Rc>sz-{7)MyQ^9Rz@||EMR>>CPYSQugg}bo)LN$r zjFhh+YS68!SJ8F%JR4`;dqF9aPoswio08;0B{mCmQo(~9gqXQgNbnG&9O$hMwRCgS z;z&u%wXr#)G=+|@OqHGs6AasHZx84yczf6l5zJFI0DMGX3p-`BpBe+jps#?<+@MuV zCYZo8aWReDs7tRT_24UY4EXa7YTuR1X*!2FQ@zD(AuTqT?-B{apgl5(K>}V8^%liU z;c@P#w)vnDM*vDQQjUnD-v~1~wy-`8M-j0Y3ipv(nb}@>q-l!N`T}+@5}C2_CJ=S> z$w+E%QsaKS>E-cOH4FCghd9!LWe;a1!7hg(AwLPU&)a^~5?I|BS6m$bk}27W#24vA zMh05jVlabb!JkG(3(MRoOQlMz7&37eq@{v=`NBy53Xus9{48IROsmyDIGC4FvTlib z=%B%x8W=cdLffuFsfsVuzNu*6?guBTyX6=5qbrV{7+na7q1or(lraB+4gWiOAn$e$ zQ&9;=*$S09)dQ9|Jiqy9kkjf8AiXm*_&{Q$`>$)h^wj` zi-or!fGTtg`3J0_Z@CFrp*gm6?7zY&_gy&}3gUYv20kOt!6?JeA=!ee+r!i-Sq|8f zT)2n1FSApS6;cXGAQqz*W1Z>0AKQ=`xD?yKg&L=!TFXpb5kVD76w(%mDsG^EU&6y; zfaP7VgD5$pqo%!_p}=10QEcen#18us%61z~3Ah*qY_=+})FafNNAJ!Se*n1t(CDzR zsHj18mah*Nf%o%q?;#9rk1{?t$!||cs%~AyANBc(b32K1{|u5;{*3DU17qQ*A_T-Q zC}>^-H7K<&efdJvLZSTCTPSD<|Eop+e}G*43o0vIysxzMgWA|T)J;&J5!lL))oL

!g*j@*Vzy6`-tudloG4Q(&7(>+Nh`|4*X=5FrO*U{|Bvm^NWQ? z*=ozOLzA`g9v4BzFPfMz+t`)-ztnNPXrUkS;rz*o45i=nr_VAgmhV=SG!ztc-l_Dl zb|0z8SsUC(=SRB$R(lHblNt5|=I*)GV&~vmY3bFB!TS&dLRWW}LY}19hQqlWCom?v zj2jG#yPbkd&0yHm;qt3RVOfm@h^R8jG~RZdPyN&Ij!GPxXGQ^A{*MAu`vz`$&SK~}#$ zBq*TxC1J*3pU<$bKQYf=J3JOV3q_raPxSH)*n;@&4aC!T4fq4qmKa}gG1^@s6 literal 0 HcmV?d00001 diff --git a/各种归档/20261009_网页图层UI修正/copy-dirty-desktop.png b/各种归档/20261009_网页图层UI修正/copy-dirty-desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..c3135557ae3598870ea0abbe9bf1961b7797459c GIT binary patch literal 10678 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 M$f!tHNty)xe^v*x{r~^~ literal 0 HcmV?d00001 diff --git a/各种归档/20261009_网页图层UI修正/data-preservation.json b/各种归档/20261009_网页图层UI修正/data-preservation.json new file mode 100644 index 0000000..035c4ab --- /dev/null +++ b/各种归档/20261009_网页图层UI修正/data-preservation.json @@ -0,0 +1,8 @@ +{ + "templates": 9, + "animations": 6, + "frames": 195, + "persistent_files": 430, + "persistent_baseline_sha256": "cbda03ce858f01ce0d025a4ef0de679dac00d328b7a159be14a05c40fbcb592a", + "unchanged_after_deployment": true +} \ No newline at end of file diff --git a/各种归档/20261009_网页图层UI修正/deployment.log b/各种归档/20261009_网页图层UI修正/deployment.log new file mode 100644 index 0000000..f7bf1d0 --- /dev/null +++ b/各种归档/20261009_网页图层UI修正/deployment.log @@ -0,0 +1,130 @@ +annotated_types-0.8.0-py3-none-any.whl: OK +anyio-4.14.2-py3-none-any.whl: OK +certifi-2026.7.22-py3-none-any.whl: OK +cffi-2.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl: OK +click-8.4.2-py3-none-any.whl: OK +colorama-0.4.6-py2.py3-none-any.whl: OK +cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl: OK +dbus_next-0.2.3-py3-none-any.whl: OK +fastapi-0.116.1-py3-none-any.whl: OK +fonttools-4.63.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl: OK +h11-0.16.0-py3-none-any.whl: OK +httpcore-1.0.9-py3-none-any.whl: OK +httptools-0.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl: OK +httpx-0.28.1-py3-none-any.whl: OK +idna-3.18-py3-none-any.whl: OK +iniconfig-2.3.0-py3-none-any.whl: OK +packaging-26.3-py3-none-any.whl: OK +pillow-12.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl: OK +pluggy-1.6.0-py3-none-any.whl: OK +pycparser-3.0-py3-none-any.whl: OK +pydantic-2.13.4-py3-none-any.whl: OK +pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl: OK +pygments-2.20.0-py3-none-any.whl: OK +pytest-8.4.1-py3-none-any.whl: OK +python_dotenv-1.2.2-py3-none-any.whl: OK +pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl: OK +starlette-0.47.3-py3-none-any.whl: OK +typing_extensions-4.16.0-py3-none-any.whl: OK +typing_inspection-0.4.2-py3-none-any.whl: OK +uvicorn-0.35.0-py3-none-any.whl: OK +uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl: OK +watchfiles-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl: OK +websockets-17.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl: OK +Looking in links: /run/[private]-screen-controller-layers-ui-20261009/wheels +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/fastapi-0.116.1-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/uvicorn-0.35.0-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/pillow-12.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/fonttools-4.63.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/dbus_next-0.2.3-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/pytest-8.4.1-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/httpx-0.28.1-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/starlette-0.47.3-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/pydantic-2.13.4-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/typing_extensions-4.16.0-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/click-8.4.2-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/h11-0.16.0-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/httptools-0.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/python_dotenv-1.2.2-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/websockets-17.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/cffi-2.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/iniconfig-2.3.0-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/packaging-26.3-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/pluggy-1.6.0-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/pygments-2.20.0-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/anyio-4.14.2-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/certifi-2026.7.22-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/httpcore-1.0.9-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/idna-3.18-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/pycparser-3.0-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/annotated_types-0.8.0-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl +Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/typing_inspection-0.4.2-py3-none-any.whl +Installing collected packages: websockets, uvloop, typing-extensions, pyyaml, python-dotenv, pygments, pycparser, pluggy, pillow, packaging, iniconfig, idna, httptools, h11, fonttools, dbus-next, click, certifi, annotated-types, uvicorn, typing-inspection, pytest, pydantic-core, httpcore, cffi, anyio, watchfiles, starlette, pydantic, httpx, cryptography, fastapi +Successfully installed annotated-types-0.8.0 anyio-4.14.2 certifi-2026.7.22 cffi-2.1.1 click-8.4.2 cryptography-46.0.5 dbus-next-0.2.3 fastapi-0.116.1 fonttools-4.63.0 h11-0.16.0 httpcore-1.0.9 httptools-0.8.0 httpx-0.28.1 idna-3.18 iniconfig-2.3.0 packaging-26.3 pillow-12.3.0 pluggy-1.6.0 pycparser-3.0 pydantic-2.13.4 pydantic-core-2.46.4 pygments-2.20.0 pytest-8.4.1 python-dotenv-1.2.2 pyyaml-6.0.3 starlette-0.47.3 typing-extensions-4.16.0 typing-inspection-0.4.2 uvicorn-0.35.0 uvloop-0.22.1 watchfiles-1.2.0 websockets-17.0.1 +make: Entering directory '/opt/[private]-screen-controller.stage.1.1.3-layers-ui-20261009/app/display/native' +rm -f -- libh618_hub75.so hub75_benchmark hub75_native_test hub75_safeoff +cc -O3 -std=c11 -Wall -Wextra -Werror -fPIC -pthread -shared h618_hub75.c -o libh618_hub75.so -pthread +cc -O3 -std=c11 -Wall -Wextra -Werror -fPIC -pthread benchmark.c h618_hub75.c -o hub75_benchmark -pthread +cc -O3 -std=c11 -Wall -Wextra -Werror -fPIC -pthread native_test.c h618_hub75.c -o hub75_native_test -pthread +cc -O3 -std=c11 -Wall -Wextra -Werror -fPIC -pthread safeoff.c h618_hub75.c -o hub75_safeoff -pthread +./hub75_native_test +native_bitplane_tests=PASS +./hub75_safeoff --fake +HUB75 safeoff complete +make: Leaving directory '/opt/[private]-screen-controller.stage.1.1.3-layers-ui-20261009/app/display/native' +........................................................................ [ 14%] +........................................................................ [ 28%] +.............................................................s.......... [ 42%] +........................................................................ [ 56%] +........................................................................ [ 70%] +.......s.......................................................s........ [ 84%] +........................................................................ [ 98%] +.......sss [100%] +508 passed, 7 skipped, 389 warnings in 403.15s (0:06:43) +PASS: H618 PI pinctrl: allwinner,sun50i-h616-pinctrl +PASS: /dev/mem accessible: /dev/mem +PASS: /dev/i2c-1 present: /dev/i2c-1 +PASS: CPU3 present: /sys/devices/system/cpu/cpu3 +PASS: native HUB75 library: /opt/[private]-screen-controller.stage.1.1.3-layers-ui-20261009/app/display/native/libh618_hub75.so +PASS: AArch64 userspace: aarch64 +PASS: default network route: default via <设备网络地址> dev wlan0 proto static metric 600 +PASS: NetworkManager active: active +PASS: lightdm.service inactive: inactive +PASS: gpioc-server.service inactive: inactive +PASS: map_device.service inactive: inactive +Persistent data prepared successfully: schema=config.json +frpc: OK +LICENSE: OK +frpc binary already verified; skipped +frpc 0.71.0 installed as a system component +● [private]-screen-controller.service - WalnutPi H618 Matrix Screen Controller + Loaded: loaded (/etc/systemd/system/[private]-screen-controller.service; enabled; preset: enabled) + Active: active (running) since Fri 2026-10-09 08:23:44 UTC; 9s ago + Process: 333499 ExecStartPre=/bin/sh -c cat /proc/sys/kernel/sched_rt_runtime_us > /run/[private]-screen-controller/sched_rt_runtime_us.original && printf "%s +" -1 > /proc/sys/kernel/sched_rt_runtime_us (code=exited, status=0/SUCCESS) + Process: 333501 ExecStartPre=/opt/[private]-screen-controller/.venv/bin/python /opt/[private]-screen-controller/scripts/dedicated_host.py check --service (code=exited, status=0/SUCCESS) + Process: 333507 ExecStartPre=/opt/[private]-screen-controller/app/display/native/hub75_safeoff (code=exited, status=0/SUCCESS) + Main PID: 333508 (python) + Tasks: 14 (limit: 1021) + Memory: 137.5M + CPU: 11.733s + CGroup: /system.slice/[private]-screen-controller.service + └─333508 /opt/[private]-screen-controller/.venv/bin/python -m uvicorn app.main:app --host 0.0.0.0 --port 8080 + +Oct 09 08:23:51 [private] python[333508]: File "/opt/[private]-screen-controller/.venv/lib/python3.11/site-packages/dbus_next/message_bus.py", line 712, in _process_message +Oct 09 08:23:51 [private] python[333508]: handler(msg, send_reply) +Oct 09 08:23:51 [private] python[333508]: File "/opt/[private]-screen-controller/.venv/lib/python3.11/site-packages/dbus_next/message_bus.py", line 898, in _default_properties_handler +Oct 09 08:23:51 [private] python[333508]: raise DBusError( +Oct 09 08:23:51 [private] python[333508]: dbus_next.errors.DBusError: interface "org.bluez.LEAdvertisement1" does not have property "TxPower" +Oct 09 08:23:52 [private] python[333508]: 2026-10-09 08:23:52,019 INFO app.power.voltage: Screen voltage sensor is available +Oct 09 08:23:52 [private] python[333508]: 2026-10-09 08:23:52,049 INFO app.monitoring.resources: System resource monitor is available +Oct 09 08:23:52 [private] python[333508]: INFO: Application startup complete. +Oct 09 08:23:52 [private] python[333508]: INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit) +Oct 09 08:23:53 [private] python[333508]: INFO: 127.0.0.1:51326 - "GET /api/status HTTP/1.1" 200 OK +WalnutPi Matrix Screen Controller updated successfully: 1.1.3-layers-ui-20261009 +WARNING: The directory '/home/[private]/.cache/pip' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you should use sudo's -H flag. diff --git a/各种归档/20261009_网页图层UI修正/hygiene-final.log b/各种归档/20261009_网页图层UI修正/hygiene-final.log new file mode 100644 index 0000000..f13a93e --- /dev/null +++ b/各种归档/20261009_网页图层UI修正/hygiene-final.log @@ -0,0 +1 @@ +仓库卫生检查通过:已检查 733 个 Git 候选文件,未输出任何秘密值。 diff --git a/各种归档/20261009_网页图层UI修正/hygiene.log b/各种归档/20261009_网页图层UI修正/hygiene.log new file mode 100644 index 0000000..945c3e8 --- /dev/null +++ b/各种归档/20261009_网页图层UI修正/hygiene.log @@ -0,0 +1 @@ +仓库卫生检查通过:已检查 725 个 Git 候选文件,未输出任何秘密值。 diff --git a/各种归档/20261009_网页图层UI修正/installed.log b/各种归档/20261009_网页图层UI修正/installed.log new file mode 100644 index 0000000..e3ac560 --- /dev/null +++ b/各种归档/20261009_网页图层UI修正/installed.log @@ -0,0 +1 @@ +{"verified_files": 8, "version": "1.1.3", "feature_updated_at": "2026-10-09T16:12+08:00"} diff --git a/各种归档/20261009_网页图层UI修正/isolation-node.log b/各种归档/20261009_网页图层UI修正/isolation-node.log new file mode 100644 index 0000000..74e57ed --- /dev/null +++ b/各种归档/20261009_网页图层UI修正/isolation-node.log @@ -0,0 +1,95 @@ +✔ derives automatic frame names from current animation name and position (0.808ms) +✔ keeps custom frame names and restores automatic names when cleared (0.1255ms) +✔ builds non-repeating animation edit context names (0.1235ms) +✔ selects saved animation preview frames by ordered durations (0.7779ms) +✔ loads every preview frame through revision-checked pagination (0.6472ms) +✔ validates configurable animation preview concurrency (0.2981ms) +✔ rejects mixed revisions instead of showing a partial animation (0.3864ms) +✔ validates frame duration only when explicitly called (0.4326ms) +✔ moves selected frames as one ordered group (0.235ms) +✔ protects an eight pixel ring around interactive drag controls (0.1911ms) +✔ reorders mixed library keys without mutating the source list (0.12ms) +✔ restores drag eligibility after protected pointer cancellation and drag end (0.497ms) +✔ animation workspace exposes two previews and the simplified control order (6.8882ms) +✔ normal and pixel modes expose independent ranges and presets (1.2686ms) +✔ pixel stamps are exact squares from 1x1 through 4x4 (0.2839ms) +✔ pixel stamps clip at every canvas edge (0.2249ms) +✔ normal circle geometry remains unchanged (0.0917ms) +✔ line interpolation includes endpoints without coordinate gaps (0.2369ms) +✔ older tools migrate while v3 restores the coordinate guide choice (0.2616ms) +✔ coordinate guide spacing adapts to the transformed logical pixel size (0.1598ms) +✔ coordinate guide ticks preserve logical values through zoom and pan (0.2017ms) +✔ pixel mode markup and grid stay accessible and non-interactive (7.2448ms) +✔ pixel undo history stores changed snapshots, caps entries, and clears (0.3945ms) +✔ canvas view clamps scale and keeps a visible section in the viewport (0.1984ms) +✔ zooming around an anchor preserves its logical position (0.1317ms) +✔ floating editor button stays inside its safe viewport bounds (0.0831ms) +✔ canvas editor markup, guarded input, and checkpoint events stay wired (3.1863ms) +✔ normalizes and converts hexadecimal colors (1.5345ms) +✔ converts RGB and HSV boundaries (0.9382ms) +✔ round trips representative colors within 8-bit rounding (0.2933ms) +✔ recent colors deduplicate, normalize, and evict the oldest (0.3496ms) +✔ formats and projects looping playback without moving paused content (1.2628ms) +✔ seek dispatcher keeps one request in flight and flushes the newest position (2.7001ms) +✔ topbar current display dialog exposes static close and animation controls (3.7402ms) +✔ device workspace exposes the compact immediate pure-color test flow (6.3507ms) +✔ font catalog normalization, grouping, and search are stable (2.0276ms) +✔ font picker implements commit-only searchable combobox keyboard behavior (3.427ms) +✔ settings places unrestricted FRP maintenance at the bottom (5.1351ms) +✔ FRP editor uses raw server storage and official validation errors (0.9648ms) +✔ network diagnostics renders layered evidence (1.527ms) +✔ unavailable controls never masquerade as indefinite loading (6.4433ms) +✔ action controls do not bypass the shared state module (6.9201ms) +✔ HTTP requests time out with a stable user-facing error (10.9783ms) +✔ demo library actions stay black, explain restrictions, and preserve copy (1.3072ms) +✔ sortable cards protect controls and keep demo cards fixed (1.2485ms) +✔ media import workspace exposes streaming upload, crop controls, and queue polling (1.6826ms) +✔ free framing starts from the complete source and keeps one pixel visible (0.8104ms) +✔ free framing copy is stable and catalogued (0.1191ms) +✔ upload action has visible ordinary-build copy (0.4106ms) +✔ media naming happens after analysis and conflicts keep the draft (0.2591ms) +✔ awaiting-settings cards survive polling without hiding server transitions (0.1535ms) +✔ old scene migration rejects unknown fields and duplicate text without filtering (47.9235ms) +✔ PNG compression round trips sparse and full brush pixels without DOM (6.3474ms) +✔ blank and black are distinct; independent backgrounds follow layer order (3.1552ms) +✔ disabled background colors stay independent through storage and copy (15.4641ms) +✔ extended pixels survive storage but never enter the central output (5.6959ms) +✔ move preview does not mutate source; confirmed clipping removes only outside ink (9.8782ms) +✔ text clipping follows anchor and scale and is retained after edit/reload/copy (7.7534ms) +✔ multiple text groups isolate edits, copies and IDs (0.7824ms) +✔ strict v2 storage protects unknown data and the final brush invariant (4.1681ms) +✔ creates a fixed 64x64 RGB scene (5.3096ms) +✔ serializes pixelRgb as base64 and round trips an independent scene (25.3775ms) +✔ moves a valid v1 draft to the stable key before removing exact legacy keys (27.5528ms) +✔ keeps the v1 draft and all legacy keys when stable-key migration cannot write (13.5803ms) +✔ preserves and blocks a future stable draft instead of falling back or writing blank (5.8011ms) +✔ preserves and blocks a damaged stable draft (0.4566ms) +✔ does not discard a damaged higher-priority legacy key during fallback migration (1.941ms) +✔ rejects damaged scene roots while skipping only damaged elements (11.0519ms) +✔ normalizes text fields and creates a centered lowercase ok element (0.337ms) +✔ migrates the first valid canvas by v3, v2, legacy priority and merges text v1 (9.0729ms) +✔ supports independent add, update, and delete operations for multiple text elements (0.6678ms) +✔ duplicates with a deep copy, new id, 2px offset, and topmost order (0.3218ms) +✔ alpha-composites full RGBA layers in array order without mutating inputs (1.4592ms) +✔ settings brightness explains an active temporary display-test override (7.2325ms) +✔ settings exposes full OTA upload progress and service recovery polling (2.9749ms) +✔ settings automatically opens and safely copies a detailed OTA failure log (1.7251ms) +✔ settings exposes a transactional performance-mode switch with the fixed warning (2.449ms) +✔ settings exposes persisted animation preview concurrency below performance mode (1.8539ms) +✔ template edit baseline distinguishes clean, dirty, and unbound scenes (1.1902ms) +✔ template manager uses a monitor and unified four-row card actions (7.157ms) +✔ animation editing backs up and restores template edit ownership (1.9429ms) +✔ special editor exposes the agreed modes and guarded editing flow (6.9422ms) +✔ latched WiFi draft state remains dirty until explicitly cleared (2.0016ms) +✔ WiFi settings expose independent network and prompt-delay controls (1.8652ms) +✔ workspace order resolves saved ids and appends new registrations (1.0842ms) +✔ workspace order movement is immutable and respects both boundaries (0.2086ms) +✔ drawer exposes one editable list and commits only from the save action (4.9742ms) +ℹ tests 87 +ℹ suites 0 +ℹ pass 87 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 650.3177 diff --git a/各种归档/20261009_网页图层UI修正/isolation-retest.log b/各种归档/20261009_网页图层UI修正/isolation-retest.log new file mode 100644 index 0000000..e831b69 --- /dev/null +++ b/各种归档/20261009_网页图层UI修正/isolation-retest.log @@ -0,0 +1,125 @@ +........................................................................ [ 14%] +........................................................................ [ 28%] +.............................................................s.......... [ 42%] +....................................sssssss.......s..................... [ 56%] +........................................................................ [ 70%] +.......s................................................................ [ 84%] +........................................................................ [ 98%] +.......... [100%] +============================== warnings summary =============================== +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15 + @no_type_check_decorator + +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: 10 warnings + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15 + @no_type_check_decorator + +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: 83 warnings +tests/test_animations.py: 913 warnings +tests/test_api.py: 2075 warnings +tests/test_fonts.py: 249 warnings +tests/test_frp.py: 332 warnings +tests/test_library_order.py: 332 warnings +tests/test_media_conversion.py: 830 warnings +tests/test_mobile_control.py: 1162 warnings +tests/test_ota.py: 249 warnings +tests/test_performance_mode.py: 83 warnings +tests/test_scene_layers.py: 166 warnings +tests/test_templates.py: 664 warnings +tests/test_ui_copy_editor.py: 599 warnings +tests/test_wifi.py: 249 warnings + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: DeprecationWarning: 'asyncio.iscoroutinefunction' is deprecated and slated for removal in Python 3.16; use inspect.iscoroutinefunction() instead + is_coroutine = asyncio.iscoroutinefunction(dependant.call) + +测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\main.py:2049: 1 warning +tests/test_animations.py: 11 warnings +tests/test_api.py: 25 warnings +tests/test_fonts.py: 3 warnings +tests/test_frp.py: 4 warnings +tests/test_library_order.py: 4 warnings +tests/test_media_conversion.py: 10 warnings +tests/test_mobile_control.py: 14 warnings +tests/test_ota.py: 3 warnings +tests/test_performance_mode.py: 1 warning +tests/test_scene_layers.py: 2 warnings +tests/test_templates.py: 8 warnings +tests/test_ui_copy_editor.py: 7 warnings +tests/test_wifi.py: 3 warnings + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\main.py:2049: DeprecationWarning: + on_event is deprecated, use lifespan event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). + + @app.on_event("startup") + +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: 2 warnings +tests/test_animations.py: 22 warnings +tests/test_api.py: 50 warnings +tests/test_fonts.py: 6 warnings +tests/test_frp.py: 8 warnings +tests/test_library_order.py: 8 warnings +tests/test_media_conversion.py: 20 warnings +tests/test_mobile_control.py: 28 warnings +tests/test_ota.py: 6 warnings +tests/test_performance_mode.py: 2 warnings +tests/test_scene_layers.py: 4 warnings +tests/test_templates.py: 16 warnings +tests/test_ui_copy_editor.py: 14 warnings +tests/test_wifi.py: 6 warnings + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: DeprecationWarning: + on_event is deprecated, use lifespan event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). + + return self.router.on_event(event_type) + +测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\main.py:2079: 1 warning +tests/test_animations.py: 11 warnings +tests/test_api.py: 25 warnings +tests/test_fonts.py: 3 warnings +tests/test_frp.py: 4 warnings +tests/test_library_order.py: 4 warnings +tests/test_media_conversion.py: 10 warnings +tests/test_mobile_control.py: 14 warnings +tests/test_ota.py: 3 warnings +tests/test_performance_mode.py: 1 warning +tests/test_scene_layers.py: 2 warnings +tests/test_templates.py: 8 warnings +tests/test_ui_copy_editor.py: 7 warnings +tests/test_wifi.py: 3 warnings + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\main.py:2079: DeprecationWarning: + on_event is deprecated, use lifespan event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). + + @app.on_event("shutdown") + +tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner +tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner +tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner +tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_media_conversion.py:134: DeprecationWarning: Image.Image.getdata is deprecated and will be removed in Pillow 14 (2027-10-15). Use get_flattened_data instead. + assert sum(pixel[0] > 240 for pixel in output.getdata()) == 1 + +tests/test_templates.py::test_template_crud_copy_persistence_and_thumbnail_cleanup + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_templates.py:165: DeprecationWarning: Image.Image.getdata is deprecated and will be removed in Pillow 14 (2027-10-15). Use get_flattened_data instead. + assert len(set(image.getdata())) > 1 + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +=========================== short test summary info =========================== +SKIPPED [1] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_repository_hygiene.py:17: repository hygiene tests require a complete Git workspace +SKIPPED [1] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_kernel_artifact_dependency.py:103: source-only update payload intentionally omits image build dependencies +SKIPPED [5] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_media_formats.py:19: FFmpeg is not installed +SKIPPED [1] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_media_formats.py:43: FFmpeg is not installed +SKIPPED [1] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_media_formats.py:64: libheif examples are not installed +SKIPPED [1] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_migrate_state_root.py:139: directory symlinks are unavailable on this host +SKIPPED [1] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_ota_isolation_probe.py:10: only executed by the isolated legacy-worker compatibility test +504 passed, 11 skipped, 8390 warnings in 83.88s (0:01:23) diff --git a/各种归档/20261009_网页图层UI修正/isolation-unit-retest.log b/各种归档/20261009_网页图层UI修正/isolation-unit-retest.log new file mode 100644 index 0000000..f971f7e --- /dev/null +++ b/各种归档/20261009_网页图层UI修正/isolation-unit-retest.log @@ -0,0 +1,2 @@ +. [100%] +1 passed in 0.18s diff --git a/各种归档/20261009_网页图层UI修正/isolation.log b/各种归档/20261009_网页图层UI修正/isolation.log new file mode 100644 index 0000000..b183007 --- /dev/null +++ b/各种归档/20261009_网页图层UI修正/isolation.log @@ -0,0 +1,184 @@ +........................................................................ [ 14%] +..........................................................F............. [ 28%] +.............................................................s.......... [ 42%] +....................................sssssss.......s..................... [ 56%] +........................................................................ [ 70%] +.......s................................................................ [ 84%] +........................................................................ [ 98%] +.......... [100%] +================================== FAILURES =================================== +_____ test_refresh_rate_config_write_failure_rolls_back_driver_and_frame ______ + +tmp_path = WindowsPath('<仓库根目录>/测试相关资料/如何测试/本机测试环境/.local/work/layers-ui-20261009/isolation-pytest/test_refresh_rate_config_write0') +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x00000163445B46D0> + + def test_refresh_rate_config_write_failure_rolls_back_driver_and_frame( + tmp_path, + monkeypatch, + ): + store = ConfigStore(project_root=tmp_path) + service = DisplayService(store, driver_kind="mock") + image = Image.new("RGB", (64, 64), (9, 8, 7)) +> service.show_image(image, mode="composition") + +测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_display_service.py:566: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\display\service.py:237: in show_image + self.config_store.set_last_mode(mode) +测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\config\store.py:189: in set_last_mode + self.update({"last_mode": mode}) +测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\config\store.py:159: in update + self._write(config) +测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\config\store.py:193: in _write + atomic_write_bytes( +测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\persistence.py:14: in atomic_write_bytes + atomic_write_many_bytes(((Path(path), content),)) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +writes = ((WindowsPath('<仓库根目录>/测试相关资料/如何测试/本机测试环境/.local/work/layers-ui-20261009...ations",\n "templates"\n ],\n "performance_mode_enabled": false,\n "animation_preview_max_concurrent": 2\n}\n'),) + + def atomic_write_many_bytes(writes: Iterable[tuple[Path, bytes]]) -> None: + """Durably replace one or more files and roll back a failed transaction.""" + entries = [(Path(path), bytes(content)) for path, content in writes] + if not entries: + return + targets = [path for path, _content in entries] + if len(set(targets)) != len(targets): + raise ValueError("atomic write transaction contains duplicate paths") + + originals: dict[Path, bytes | None] = {} + temporaries: dict[Path, Path] = {} + replaced: list[Path] = [] + parents = sorted({target.parent for target in targets}, key=str) + + try: + for target, _content in entries: + target.parent.mkdir(parents=True, exist_ok=True) + originals[target] = target.read_bytes() if target.exists() else None + for target, content in entries: + temporary = _write_temporary(target, content) + temporaries[target] = temporary + for parent in parents: + _fsync_directory(parent) + for target, _content in entries: +> os.replace(temporaries[target], target) +E PermissionError: [WinError 5] 拒绝访问。: '<仓库根目录>\\测试相关资料\\如何测试\\本机测试环境\\.local\\work\\layers-ui-20261009\\isolation-pytest\\test_refresh_rate_config_write0\\data\\.config.json.30b22bb7a1fe4136ba5d2ae99b94f117.tmp' -> '<仓库根目录>\\测试相关资料\\如何测试\\本机测试环境\\.local\\work\\layers-ui-20261009\\isolation-pytest\\test_refresh_rate_config_write0\\data\\config.json' + +测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\persistence.py:41: PermissionError +============================== warnings summary =============================== +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15 + @no_type_check_decorator + +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: 10 warnings + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15 + @no_type_check_decorator + +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: 83 warnings +tests/test_animations.py: 913 warnings +tests/test_api.py: 2075 warnings +tests/test_fonts.py: 249 warnings +tests/test_frp.py: 332 warnings +tests/test_library_order.py: 332 warnings +tests/test_media_conversion.py: 830 warnings +tests/test_mobile_control.py: 1162 warnings +tests/test_ota.py: 249 warnings +tests/test_performance_mode.py: 83 warnings +tests/test_scene_layers.py: 166 warnings +tests/test_templates.py: 664 warnings +tests/test_ui_copy_editor.py: 599 warnings +tests/test_wifi.py: 249 warnings + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: DeprecationWarning: 'asyncio.iscoroutinefunction' is deprecated and slated for removal in Python 3.16; use inspect.iscoroutinefunction() instead + is_coroutine = asyncio.iscoroutinefunction(dependant.call) + +测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\main.py:2049: 1 warning +tests/test_animations.py: 11 warnings +tests/test_api.py: 25 warnings +tests/test_fonts.py: 3 warnings +tests/test_frp.py: 4 warnings +tests/test_library_order.py: 4 warnings +tests/test_media_conversion.py: 10 warnings +tests/test_mobile_control.py: 14 warnings +tests/test_ota.py: 3 warnings +tests/test_performance_mode.py: 1 warning +tests/test_scene_layers.py: 2 warnings +tests/test_templates.py: 8 warnings +tests/test_ui_copy_editor.py: 7 warnings +tests/test_wifi.py: 3 warnings + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\main.py:2049: DeprecationWarning: + on_event is deprecated, use lifespan event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). + + @app.on_event("startup") + +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: 2 warnings +tests/test_animations.py: 22 warnings +tests/test_api.py: 50 warnings +tests/test_fonts.py: 6 warnings +tests/test_frp.py: 8 warnings +tests/test_library_order.py: 8 warnings +tests/test_media_conversion.py: 20 warnings +tests/test_mobile_control.py: 28 warnings +tests/test_ota.py: 6 warnings +tests/test_performance_mode.py: 2 warnings +tests/test_scene_layers.py: 4 warnings +tests/test_templates.py: 16 warnings +tests/test_ui_copy_editor.py: 14 warnings +tests/test_wifi.py: 6 warnings + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: DeprecationWarning: + on_event is deprecated, use lifespan event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). + + return self.router.on_event(event_type) + +测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\main.py:2079: 1 warning +tests/test_animations.py: 11 warnings +tests/test_api.py: 25 warnings +tests/test_fonts.py: 3 warnings +tests/test_frp.py: 4 warnings +tests/test_library_order.py: 4 warnings +tests/test_media_conversion.py: 10 warnings +tests/test_mobile_control.py: 14 warnings +tests/test_ota.py: 3 warnings +tests/test_performance_mode.py: 1 warning +tests/test_scene_layers.py: 2 warnings +tests/test_templates.py: 8 warnings +tests/test_ui_copy_editor.py: 7 warnings +tests/test_wifi.py: 3 warnings + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\main.py:2079: DeprecationWarning: + on_event is deprecated, use lifespan event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). + + @app.on_event("shutdown") + +tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner +tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner +tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner +tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_media_conversion.py:134: DeprecationWarning: Image.Image.getdata is deprecated and will be removed in Pillow 14 (2027-10-15). Use get_flattened_data instead. + assert sum(pixel[0] > 240 for pixel in output.getdata()) == 1 + +tests/test_templates.py::test_template_crud_copy_persistence_and_thumbnail_cleanup + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_templates.py:165: DeprecationWarning: Image.Image.getdata is deprecated and will be removed in Pillow 14 (2027-10-15). Use get_flattened_data instead. + assert len(set(image.getdata())) > 1 + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +=========================== short test summary info =========================== +SKIPPED [1] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_repository_hygiene.py:17: repository hygiene tests require a complete Git workspace +SKIPPED [1] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_kernel_artifact_dependency.py:103: source-only update payload intentionally omits image build dependencies +SKIPPED [5] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_media_formats.py:19: FFmpeg is not installed +SKIPPED [1] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_media_formats.py:43: FFmpeg is not installed +SKIPPED [1] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_media_formats.py:64: libheif examples are not installed +SKIPPED [1] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_migrate_state_root.py:139: directory symlinks are unavailable on this host +SKIPPED [1] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_ota_isolation_probe.py:10: only executed by the isolated legacy-worker compatibility test +1 failed, 503 passed, 11 skipped, 8390 warnings in 86.07s (0:01:26) diff --git a/各种归档/20261009_网页图层UI修正/move-exit-desktop.png b/各种归档/20261009_网页图层UI修正/move-exit-desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..8880b6733c500c443eb6a813fef03a697e8ff750 GIT binary patch literal 54979 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 literal 0 HcmV?d00001 diff --git a/各种归档/20261009_网页图层UI修正/node.log b/各种归档/20261009_网页图层UI修正/node.log new file mode 100644 index 0000000..8303b0f --- /dev/null +++ b/各种归档/20261009_网页图层UI修正/node.log @@ -0,0 +1,95 @@ +✔ derives automatic frame names from current animation name and position (0.8344ms) +✔ keeps custom frame names and restores automatic names when cleared (0.1109ms) +✔ builds non-repeating animation edit context names (0.0981ms) +✔ selects saved animation preview frames by ordered durations (0.609ms) +✔ loads every preview frame through revision-checked pagination (0.555ms) +✔ validates configurable animation preview concurrency (1.0187ms) +✔ rejects mixed revisions instead of showing a partial animation (0.4183ms) +✔ validates frame duration only when explicitly called (0.4254ms) +✔ moves selected frames as one ordered group (0.2261ms) +✔ protects an eight pixel ring around interactive drag controls (0.1889ms) +✔ reorders mixed library keys without mutating the source list (0.1202ms) +✔ restores drag eligibility after protected pointer cancellation and drag end (0.4112ms) +✔ animation workspace exposes two previews and the simplified control order (6.6239ms) +✔ normal and pixel modes expose independent ranges and presets (1.1758ms) +✔ pixel stamps are exact squares from 1x1 through 4x4 (0.2195ms) +✔ pixel stamps clip at every canvas edge (0.1762ms) +✔ normal circle geometry remains unchanged (0.0804ms) +✔ line interpolation includes endpoints without coordinate gaps (0.2975ms) +✔ older tools migrate while v3 restores the coordinate guide choice (0.2289ms) +✔ coordinate guide spacing adapts to the transformed logical pixel size (0.1372ms) +✔ coordinate guide ticks preserve logical values through zoom and pan (0.1836ms) +✔ pixel mode markup and grid stay accessible and non-interactive (6.5794ms) +✔ pixel undo history stores changed snapshots, caps entries, and clears (0.3632ms) +✔ canvas view clamps scale and keeps a visible section in the viewport (0.1771ms) +✔ zooming around an anchor preserves its logical position (0.121ms) +✔ floating editor button stays inside its safe viewport bounds (0.0683ms) +✔ canvas editor markup, guarded input, and checkpoint events stay wired (2.1547ms) +✔ normalizes and converts hexadecimal colors (1.0959ms) +✔ converts RGB and HSV boundaries (0.2125ms) +✔ round trips representative colors within 8-bit rounding (0.2085ms) +✔ recent colors deduplicate, normalize, and evict the oldest (0.2279ms) +✔ formats and projects looping playback without moving paused content (1.0028ms) +✔ seek dispatcher keeps one request in flight and flushes the newest position (2.277ms) +✔ topbar current display dialog exposes static close and animation controls (2.8138ms) +✔ device workspace exposes the compact immediate pure-color test flow (5.2814ms) +✔ font catalog normalization, grouping, and search are stable (1.2077ms) +✔ font picker implements commit-only searchable combobox keyboard behavior (3.0832ms) +✔ settings places unrestricted FRP maintenance at the bottom (4.0794ms) +✔ FRP editor uses raw server storage and official validation errors (0.9054ms) +✔ network diagnostics renders layered evidence (1.276ms) +✔ unavailable controls never masquerade as indefinite loading (5.2608ms) +✔ action controls do not bypass the shared state module (6.9201ms) +✔ HTTP requests time out with a stable user-facing error (22.2398ms) +✔ demo library actions stay black, explain restrictions, and preserve copy (0.9731ms) +✔ sortable cards protect controls and keep demo cards fixed (0.9556ms) +✔ media import workspace exposes streaming upload, crop controls, and queue polling (1.1751ms) +✔ free framing starts from the complete source and keeps one pixel visible (0.6278ms) +✔ free framing copy is stable and catalogued (0.0933ms) +✔ upload action has visible ordinary-build copy (0.2064ms) +✔ media naming happens after analysis and conflicts keep the draft (0.1499ms) +✔ awaiting-settings cards survive polling without hiding server transitions (0.1005ms) +✔ old scene migration rejects unknown fields and duplicate text without filtering (49.3698ms) +✔ PNG compression round trips sparse and full brush pixels without DOM (4.3169ms) +✔ blank and black are distinct; independent backgrounds follow layer order (3.1915ms) +✔ disabled background colors stay independent through storage and copy (12.446ms) +✔ extended pixels survive storage but never enter the central output (5.3709ms) +✔ move preview does not mutate source; confirmed clipping removes only outside ink (9.928ms) +✔ text clipping follows anchor and scale and is retained after edit/reload/copy (7.5961ms) +✔ multiple text groups isolate edits, copies and IDs (0.9609ms) +✔ strict v2 storage protects unknown data and the final brush invariant (3.8003ms) +✔ creates a fixed 64x64 RGB scene (6.227ms) +✔ serializes pixelRgb as base64 and round trips an independent scene (30.277ms) +✔ moves a valid v1 draft to the stable key before removing exact legacy keys (30.4664ms) +✔ keeps the v1 draft and all legacy keys when stable-key migration cannot write (16.3615ms) +✔ preserves and blocks a future stable draft instead of falling back or writing blank (6.9734ms) +✔ preserves and blocks a damaged stable draft (0.2876ms) +✔ does not discard a damaged higher-priority legacy key during fallback migration (1.4569ms) +✔ rejects damaged scene roots while skipping only damaged elements (10.0087ms) +✔ normalizes text fields and creates a centered lowercase ok element (0.4748ms) +✔ migrates the first valid canvas by v3, v2, legacy priority and merges text v1 (8.6045ms) +✔ supports independent add, update, and delete operations for multiple text elements (0.4692ms) +✔ duplicates with a deep copy, new id, 2px offset, and topmost order (0.2556ms) +✔ alpha-composites full RGBA layers in array order without mutating inputs (1.8318ms) +✔ settings brightness explains an active temporary display-test override (5.5205ms) +✔ settings exposes full OTA upload progress and service recovery polling (3.2091ms) +✔ settings automatically opens and safely copies a detailed OTA failure log (1.5628ms) +✔ settings exposes a transactional performance-mode switch with the fixed warning (1.5066ms) +✔ settings exposes persisted animation preview concurrency below performance mode (2.5054ms) +✔ template edit baseline distinguishes clean, dirty, and unbound scenes (1.984ms) +✔ template manager uses a monitor and unified four-row card actions (8.406ms) +✔ animation editing backs up and restores template edit ownership (1.8903ms) +✔ special editor exposes the agreed modes and guarded editing flow (5.876ms) +✔ latched WiFi draft state remains dirty until explicitly cleared (1.131ms) +✔ WiFi settings expose independent network and prompt-delay controls (2.1816ms) +✔ workspace order resolves saved ids and appends new registrations (0.8661ms) +✔ workspace order movement is immutable and respects both boundaries (0.1794ms) +✔ drawer exposes one editable list and commits only from the save action (5.1424ms) +ℹ tests 87 +ℹ suites 0 +ℹ pass 87 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 544.9717 diff --git a/各种归档/20261009_网页图层UI修正/prepare.log b/各种归档/20261009_网页图层UI修正/prepare.log new file mode 100644 index 0000000..c460ce2 --- /dev/null +++ b/各种归档/20261009_网页图层UI修正/prepare.log @@ -0,0 +1,14 @@ +私有凭据文件可用;未输出任何凭据值。 +/usr/bin/python3 +/usr/bin/git +/usr/bin/curl +/usr/bin/tar +/usr/bin/sha256sum +/usr/bin/make +/usr/bin/gcc +Python 3.11.2 +aarch64 + +Baseline content: 9 templates, 6 animations, 195 frames +deployment.tar.gz: OK + diff --git a/各种归档/20261009_网页图层UI修正/production-browser.json b/各种归档/20261009_网页图层UI修正/production-browser.json new file mode 100644 index 0000000..089ddb7 --- /dev/null +++ b/各种归档/20261009_网页图层UI修正/production-browser.json @@ -0,0 +1,20 @@ +[ + { + "width": 1280, + "result": { + "passed": true, + "nativeConfirmations": 6, + "layers": 3, + "errors": [] + } + }, + { + "width": 320, + "result": { + "passed": true, + "nativeConfirmations": 6, + "layers": 3, + "errors": [] + } + } +] \ No newline at end of file diff --git a/各种归档/20261009_网页图层UI修正/production-dialog.json b/各种归档/20261009_网页图层UI修正/production-dialog.json new file mode 100644 index 0000000..050cfb5 --- /dev/null +++ b/各种归档/20261009_网页图层UI修正/production-dialog.json @@ -0,0 +1,19 @@ +{ + "width": 390, + "labelToggle": true, + "background": "rgb(23, 28, 36)", + "checkbox": { + "x": 36, + "y": 300.203125, + "width": 20, + "height": 20 + }, + "frameList": { + "clientHeight": 405, + "scrollHeight": 1032 + }, + "pageWidth": { + "viewport": 390, + "scroll": 390 + } +} \ No newline at end of file diff --git a/各种归档/20261009_网页图层UI修正/verification.log b/各种归档/20261009_网页图层UI修正/verification.log new file mode 100644 index 0000000..78a7679 --- /dev/null +++ b/各种归档/20261009_网页图层UI修正/verification.log @@ -0,0 +1,4 @@ +私有凭据文件可用;未输出任何凭据值。 +All persistent files, pixels, names, frame order and durations match baseline. +{"service": {"app_version": "017ed103e3aef71c", "software_version": "1.1.3", "feature_updated_at": "2026-10-09T16:12+08:00"}, "driver": {"actual_refresh_rate_hz": 97.412, "panel_scan_rate_hz": 97.412, "completed_frames": 25279, "completed_scans": 25279, "scans_per_frame": 1, "deadline_misses": 0, "buffer_swaps": 647, "submitted_frames": 647, "oe_timing_backend": "h618-pwm4", "oe_pulse_faults": 0, "oe_forced_blanks": 0, "max_programmed_oe_ns": 128000, "oe_timing_error": null, "safeoff_error": null, "cpu_affinity": 3, "cpu_affinity_active": true, "cpu_affinity_error": null, "realtime_priority": 50, "realtime_priority_active": true, "realtime_priority_error": null, "memory_locked": true, "memory_lock_error": null, "running": true, "governor": "ondemand", "last_error": null}} + diff --git a/各种归档/20261009_网页多图层与扩展画布/README.md b/各种归档/20261009_网页多图层与扩展画布/README.md new file mode 100644 index 0000000..710450d --- /dev/null +++ b/各种归档/20261009_网页多图层与扩展画布/README.md @@ -0,0 +1,52 @@ +# 网页多图层与扩展画布实施验收(2026-10-09) + +实施范围:scene v2、模板schema v2、动图schema v3、配置v11;192×192逻辑编辑区和64×64输出;画笔/多段文字图层、背景、复制/排序/命名、位移和持久裁切。VERSION保持1.1.3,功能时间2026-10-09T15:27+08:00。未导出OTA/IMG。 + +## 验收覆盖 + +| 行为 | 证据 | +| --- | --- | +| 图层增删、至少一画笔、多段文字隔离、复制/排序/重命名 | Node模型测试;桌面浏览器入口check_layers_browser.mjs | +| 透明空白、黑色遮挡、各层背景/关闭颜色记忆、擦除/清空 | Node/Pillow合成;浏览器背景操作 | +| 192外围、扩展开关记忆、中央64边框、64输出 | 浏览器/节点;Python PNG逐像素对比 | +| 图层移动、偏移提交/步进/限位;视线不改内容 | 浏览器桌面鼠标和移动触摸;模型测试 | +| 越界确认取消、文字部分裁切/全删、移回不恢复、缩放与重载、撤销 | 6次原生确认的浏览器验收及模型/持久化测试 | +| 保存/复制静态与单帧/多帧/全部帧、冲突、脏目标保存 | 浏览器操作及REST/存储测试 | +| 场景/缩略图/索引写入故障、重启无半提交 | 动图存储事务故障注入测试 | +| 旧草稿/模板/动图迁移中央输出一致、损坏保全 | Node/Python严格迁移测试;设备原数据摘要比对 | +| 手机共享内容库/播放接口兼容 | 相关Python协议测试;App无需更新 | +| 桌面/390px/320px悬浮菜单及面板、文字拖动/字号、触摸/视线缩放 | 本目录截图、浏览器正常UI输入验证 | + +绕开正常路径的验证包含:确认取消后草稿完全一致、移回后不恢复已裁内容、迟到文字请求不覆盖新状态、If-Match过期冲突、两帧部分写入失败全部保全,以及旧草稿未知字段/不合法数字拒绝迁移。 + +## 已完成本机检查 + +最后版本本机全套513通过/9跳过(all-ready.log),上一轮512通过/9跳过(all-final-retest.log);最新迁移边界59通过;全部Node87通过/无跳过。隔离中文空格目录全套499通过/11跳过,最新相关59通过。隔离副本未复制凭据、旧venv或运行数据,使用现有解释器运行其源码。各结果存在重叠,不相加。 + +本机9跳过:6个视频格式测试的默认环境没有FFmpeg、libheif编码器1项、Windows目录symlink1项、只供旧OTA隔离子进程的probe1项。随后复用已有FFmpeg单独执行6项视频格式并通过,HEIC编码器仍未提供。隔离目录另有完整Git工作区和发行构建依赖缺省导致的2项跳过。无需摄像头、实屏视觉、Android真机回归。 + +Windows一次媒体任务原子替换WinError5已保留失败日志all-final.log;单测重测与关闭本轮浏览器/mock后的完整回归通过。较早隔离迁移目录rename及WiFi替换也曾偶发拒绝访问;未证实根因,未修改无关持久化实现。经验已登记测试流程。 + +## 部署验证 + +通过私有凭据门禁和远端工具检查,上传离线载荷并核验SHA-256,使用既有update_walnutpi.sh在数据副本上迁移及完整预检,原子切换后健康检查并重启。本轮未更新驱动源码,也未发送实屏诊断图案。 + +部署前基线9个模板、6个动图、195帧。既有名称/顺序/间隔、64输出摘要、配置和其余持久文件逐项对比;允许清理13个不属于当前修订的严格命名手机缩略图缓存,未泛化忽略mobile目录。旧缓存失效是scene摘要改变后既有PreviewCache.reconcile的预期清理。 + +板端存在原有BlueZ LEAdvertisement1 TxPower属性告警,服务启动及健康通过;此告警未在本轮修改范围处理,不写为已消除。相关共享协议回归通过。 + +## 可重复入口和经验 + +稳定需求见整体开发需求/01_网页配置端需求.md;测试映射与经验见测试相关资料/如何测试/核桃派点阵屏控制服务测试流程.md;跨端兼容见移动端相关内容/开发要求/跨端兼容与变更记录.md。浏览器入口为核桃派软件源代码/scripts/check_layers_browser.mjs,调用方提供已有Playwright page与隔离mock URL。一次性SSH载荷、设备测试脚本和隔离测试数据在本轮完成后精确清理,持续使用的测试环境、凭据与主机密钥保留。 + +最后部署版本的板端预检508通过/7跳过(device-deployment-deploy-ready.log),完整重启和健康检查通过。7跳过对应源载荷没有完整Git1项、没有本机harness3项、没有大型镜像构建依赖1项、板端没有Node的跨语言对比1项,以及旧OTA子进程probe1项;Node/Pillow对比已在本机执行。 + +设备实际REST保存重载、中央PNG输出、文字裁切状态、独立图层ID、单帧/全部帧追加、原间隔及If-Match冲突、64/192文字预览全部通过(device-rest.log)。测试创建的独立模板与两帧动图均删除;之后基线复核9模板/6动图/195帧以及其他业务持久文件全部保持一致(device-ready-verification.log)。 + +最终网页桌面验收通过、6次原生确认、无pageerror;320px窄屏触摸整层X移动10像素、中央屏幕边框可见,切到视线模式后重新打开菜单仍可使用偏移面板。菜单坐标x74/y394、尺寸224×438,在320×844视口内,更多控件可滚动。截图见device-desktop-menu.png和device-mobile-menu.png;结果见device-browser.json。一次性浏览器操作曾引用错误的canvas选择器及错误地二次切换已打开菜单,导致自动化超时;改为实际DOM选择器和逐步检查后通过,应用源码无需修改。 + +校验已安装的33个变更/新增源码文件SHA-256与本机一致;VERSION为1.1.3、FEATURE_UPDATED_AT为2026-10-09T15:27+08:00(installed-source.log)。驱动截止丢失0、OE脉冲故障0、最后错误null;未改变显示模式进行视觉测试。 + +已清理远端本轮独立目录 `/run/matrix-screen-controller-layers-20261009`,其中包括离线部署tar、wheel副本、frpc副本、测试脚本和文件校验清单(device-cleanup.log);更新脚本的stage/data副本由既有事务清理。浏览器与本轮SSH本地转发已关闭。本机一次性目录 `测试相关资料/如何测试/本机测试环境/.local/work/layers-implementation` 的精确删除被自动安全审批拒绝(仅返回 blocked by policy),未更换手段重试。该目录已无使用进程、所需证据已归档,可由用户手动删除;测试venv、私有凭据及主机密钥继续保留。 + +最后再次比对所有设备用户内容并确认37个本轮远端载荷、stage、rollback、迁移及测试绝对路径均不存在(device-cleanup-confirmed.log)。本机安全拦截使删除临时目录与随后检查的组合命令整体未执行;本轮仅重新执行证据复制及只读检查,未再次请求删除。 diff --git a/各种归档/20261009_网页多图层与扩展画布/all-final-retest.log b/各种归档/20261009_网页多图层与扩展画布/all-final-retest.log new file mode 100644 index 0000000..65e757a --- /dev/null +++ b/各种归档/20261009_网页多图层与扩展画布/all-final-retest.log @@ -0,0 +1,248 @@ +requirements 未变化,跳过依赖安装。 +> <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Scripts\python.exe -m pip check +No broken requirements found. +已清理:<仓库根目录>\测试相关资料\如何测试\本机测试环境\work\pytest +> <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Scripts\python.exe -m pytest -q -p no:cacheprovider --basetemp=<仓库根目录>\测试相关资料\如何测试\本机测试环境\work\pytest +........................................................................ [ 13%] +........................................................................ [ 27%] +........................................................................ [ 41%] +....................................sssssss.......s..................... [ 55%] +........................................................................ [ 69%] +.......s................................................................ [ 82%] +........................................................................ [ 96%] +................. [100%] +============================== warnings summary =============================== +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15 + @no_type_check_decorator + +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: 10 warnings + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15 + @no_type_check_decorator + +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: 83 warnings +tests/test_animations.py: 913 warnings +tests/test_api.py: 2075 warnings +tests/test_fonts.py: 249 warnings +tests/test_frp.py: 332 warnings +tests/test_library_order.py: 332 warnings +tests/test_media_conversion.py: 830 warnings +tests/test_mobile_control.py: 1162 warnings +tests/test_ota.py: 249 warnings +tests/test_performance_mode.py: 83 warnings +tests/test_scene_layers.py: 166 warnings +tests/test_templates.py: 664 warnings +tests/test_ui_copy_editor.py: 599 warnings +tests/test_wifi.py: 249 warnings + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: DeprecationWarning: 'asyncio.iscoroutinefunction' is deprecated and slated for removal in Python 3.16; use inspect.iscoroutinefunction() instead + is_coroutine = asyncio.iscoroutinefunction(dependant.call) + +app\main.py:2049: 1 warning +tests/test_animations.py: 11 warnings +tests/test_api.py: 25 warnings +tests/test_fonts.py: 3 warnings +tests/test_frp.py: 4 warnings +tests/test_library_order.py: 4 warnings +tests/test_media_conversion.py: 10 warnings +tests/test_mobile_control.py: 14 warnings +tests/test_ota.py: 3 warnings +tests/test_performance_mode.py: 1 warning +tests/test_scene_layers.py: 2 warnings +tests/test_templates.py: 8 warnings +tests/test_ui_copy_editor.py: 7 warnings +tests/test_wifi.py: 3 warnings + <仓库根目录>\核桃派软件源代码\app\main.py:2049: DeprecationWarning: + on_event is deprecated, use lifespan event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). + + @app.on_event("startup") + +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: 2 warnings +tests/test_animations.py: 22 warnings +tests/test_api.py: 50 warnings +tests/test_fonts.py: 6 warnings +tests/test_frp.py: 8 warnings +tests/test_library_order.py: 8 warnings +tests/test_media_conversion.py: 20 warnings +tests/test_mobile_control.py: 28 warnings +tests/test_ota.py: 6 warnings +tests/test_performance_mode.py: 2 warnings +tests/test_scene_layers.py: 4 warnings +tests/test_templates.py: 16 warnings +tests/test_ui_copy_editor.py: 14 warnings +tests/test_wifi.py: 6 warnings + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: DeprecationWarning: + on_event is deprecated, use lifespan event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). + + return self.router.on_event(event_type) + +app\main.py:2079: 1 warning +tests/test_animations.py: 11 warnings +tests/test_api.py: 25 warnings +tests/test_fonts.py: 3 warnings +tests/test_frp.py: 4 warnings +tests/test_library_order.py: 4 warnings +tests/test_media_conversion.py: 10 warnings +tests/test_mobile_control.py: 14 warnings +tests/test_ota.py: 3 warnings +tests/test_performance_mode.py: 1 warning +tests/test_scene_layers.py: 2 warnings +tests/test_templates.py: 8 warnings +tests/test_ui_copy_editor.py: 7 warnings +tests/test_wifi.py: 3 warnings + <仓库根目录>\核桃派软件源代码\app\main.py:2079: DeprecationWarning: + on_event is deprecated, use lifespan event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). + + @app.on_event("shutdown") + +tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner +tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner +tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner +tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner + <仓库根目录>\核桃派软件源代码\tests\test_media_conversion.py:134: DeprecationWarning: Image.Image.getdata is deprecated and will be removed in Pillow 14 (2027-10-15). Use get_flattened_data instead. + assert sum(pixel[0] > 240 for pixel in output.getdata()) == 1 + +tests/test_templates.py::test_template_crud_copy_persistence_and_thumbnail_cleanup + <仓库根目录>\核桃派软件源代码\tests\test_templates.py:165: DeprecationWarning: Image.Image.getdata is deprecated and will be removed in Pillow 14 (2027-10-15). Use get_flattened_data instead. + assert len(set(image.getdata())) > 1 + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +512 passed, 9 skipped, 8390 warnings in 162.85s (0:02:42) +> "C:\Program Files\nodejs\node.EXE" --test tests/test_animation_ui.mjs tests/test_canvas_tools.mjs tests/test_color_math.mjs tests/test_current_display_playback_ui.mjs tests/test_device_ui.mjs tests/test_font_picker.mjs tests/test_frp_ui.mjs tests/test_interaction_feedback.mjs tests/test_scene_model.mjs tests/test_scene_layers.mjs tests/test_settings_ui.mjs tests/test_template_management_ui.mjs tests/test_ui_copy_editor.mjs tests/test_wifi_ui.mjs tests/test_workspace_order_ui.mjs +✔ derives automatic frame names from current animation name and position (0.8905ms) +✔ keeps custom frame names and restores automatic names when cleared (0.1147ms) +✔ builds non-repeating animation edit context names (0.1237ms) +✔ selects saved animation preview frames by ordered durations (0.764ms) +✔ loads every preview frame through revision-checked pagination (0.6488ms) +✔ validates configurable animation preview concurrency (0.3821ms) +✔ rejects mixed revisions instead of showing a partial animation (1.5654ms) +✔ validates frame duration only when explicitly called (0.4885ms) +✔ moves selected frames as one ordered group (0.2723ms) +✔ protects an eight pixel ring around interactive drag controls (0.2357ms) +✔ reorders mixed library keys without mutating the source list (0.1522ms) +✔ restores drag eligibility after protected pointer cancellation and drag end (0.5359ms) +✔ animation workspace exposes two previews and the simplified control order (7.0698ms) +✔ normal and pixel modes expose independent ranges and presets (1.3121ms) +✔ pixel stamps are exact squares from 1x1 through 4x4 (0.2387ms) +✔ pixel stamps clip at every canvas edge (0.1973ms) +✔ normal circle geometry remains unchanged (0.0999ms) +✔ line interpolation includes endpoints without coordinate gaps (0.2263ms) +✔ older tools migrate while v3 restores the coordinate guide choice (0.2476ms) +✔ coordinate guide spacing adapts to the transformed logical pixel size (0.1444ms) +✔ coordinate guide ticks preserve logical values through zoom and pan (0.2051ms) +✔ pixel mode markup and grid stay accessible and non-interactive (9.0143ms) +✔ pixel undo history stores changed snapshots, caps entries, and clears (0.5226ms) +✔ canvas view clamps scale and keeps a visible section in the viewport (0.2232ms) +✔ zooming around an anchor preserves its logical position (0.2588ms) +✔ floating editor button stays inside its safe viewport bounds (0.1569ms) +✔ canvas editor markup, guarded input, and checkpoint events stay wired (5.1933ms) +✔ normalizes and converts hexadecimal colors (1.3708ms) +✔ converts RGB and HSV boundaries (0.2687ms) +✔ round trips representative colors within 8-bit rounding (0.2699ms) +✔ recent colors deduplicate, normalize, and evict the oldest (0.3041ms) +✔ formats and projects looping playback without moving paused content (1.121ms) +✔ seek dispatcher keeps one request in flight and flushes the newest position (4.2348ms) +✔ topbar current display dialog exposes static close and animation controls (6.5266ms) +✔ device workspace exposes the compact immediate pure-color test flow (6.1077ms) +✔ font catalog normalization, grouping, and search are stable (1.2991ms) +✔ font picker implements commit-only searchable combobox keyboard behavior (4.3202ms) +✔ settings places unrestricted FRP maintenance at the bottom (4.7159ms) +✔ FRP editor uses raw server storage and official validation errors (1.1139ms) +✔ network diagnostics renders layered evidence (1.7464ms) +✔ unavailable controls never masquerade as indefinite loading (6.3779ms) +✔ action controls do not bypass the shared state module (7.9189ms) +✔ HTTP requests time out with a stable user-facing error (15.7531ms) +✔ demo library actions stay black, explain restrictions, and preserve copy (1.5646ms) +✔ sortable cards protect controls and keep demo cards fixed (1.4711ms) +✔ old scene migration rejects unknown fields and duplicate text without filtering (9.4326ms) +✔ PNG compression round trips sparse and full brush pixels without DOM (18.4773ms) +✔ blank and black are distinct; independent backgrounds follow layer order (5.5719ms) +✔ disabled background colors stay independent through storage and copy (18.2751ms) +✔ extended pixels survive storage but never enter the central output (5.6184ms) +✔ move preview does not mutate source; confirmed clipping removes only outside ink (20.7736ms) +✔ text clipping follows anchor and scale and is retained after edit/reload/copy (6.3203ms) +✔ multiple text groups isolate edits, copies and IDs (0.5384ms) +✔ strict v2 storage protects unknown data and the final brush invariant (2.9911ms) +✔ creates a fixed 64x64 RGB scene (8.3545ms) +✔ serializes pixelRgb as base64 and round trips an independent scene (30.0145ms) +✔ moves a valid v1 draft to the stable key before removing exact legacy keys (22.8032ms) +✔ keeps the v1 draft and all legacy keys when stable-key migration cannot write (6.6069ms) +✔ preserves and blocks a future stable draft instead of falling back or writing blank (7.6802ms) +✔ preserves and blocks a damaged stable draft (0.9426ms) +✔ does not discard a damaged higher-priority legacy key during fallback migration (2.7322ms) +✔ rejects damaged scene roots while skipping only damaged elements (5.4182ms) +✔ normalizes text fields and creates a centered lowercase ok element (0.2989ms) +✔ migrates the first valid canvas by v3, v2, legacy priority and merges text v1 (8.9943ms) +✔ supports independent add, update, and delete operations for multiple text elements (1.1051ms) +✔ duplicates with a deep copy, new id, 2px offset, and topmost order (0.324ms) +✔ alpha-composites full RGBA layers in array order without mutating inputs (2.0929ms) +✔ settings brightness explains an active temporary display-test override (6.587ms) +✔ settings exposes full OTA upload progress and service recovery polling (4.7051ms) +✔ settings automatically opens and safely copies a detailed OTA failure log (2.3833ms) +✔ settings exposes a transactional performance-mode switch with the fixed warning (1.496ms) +✔ settings exposes persisted animation preview concurrency below performance mode (1.9836ms) +✔ template edit baseline distinguishes clean, dirty, and unbound scenes (2.2967ms) +✔ template manager uses a monitor and unified four-row card actions (6.6472ms) +✔ animation editing backs up and restores template edit ownership (1.4212ms) +✔ special editor exposes the agreed modes and guarded editing flow (5.8489ms) +✔ latched WiFi draft state remains dirty until explicitly cleared (1.2836ms) +✔ WiFi settings expose independent network and prompt-delay controls (2.6322ms) +✔ workspace order resolves saved ids and appends new registrations (1.1186ms) +✔ workspace order movement is immutable and respects both boundaries (0.2128ms) +✔ drawer exposes one editable list and commits only from the save action (5.9252ms) +ℹ tests 81 +ℹ suites 0 +ℹ pass 81 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 594.5022 +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\animation-thumbnail-preview.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\animation-ui-model.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\app.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\canvas-tools-model.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\color-math.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\color-picker.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\core.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\current-display-playback.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\font-picker.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\interaction-feedback.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\media-crop-geometry.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\media-import-ui-model.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\pixel-png.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\scene-board.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\scene-model-v1.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\scene-model.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\sortable-card.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\template-edit-model.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\ui-copy-runtime.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\vendor\fflate\fflate.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\animations.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\canvas.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\device.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\frp-settings.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\layers.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\media-import.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\settings.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\templates.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\text.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\wifi-settings.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\wifi-draft-state.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\workspace-order.js +> "C:\Program Files\nodejs\node.EXE" --check app/ui_copy_editor/static/editor.js +> <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Scripts\python.exe scripts/build_ui_copy_catalog.py --check +ui-copy.json is current +本机测试套件通过:all diff --git a/各种归档/20261009_网页多图层与扩展画布/all-final.log b/各种归档/20261009_网页多图层与扩展画布/all-final.log new file mode 100644 index 0000000..d7f8be0 --- /dev/null +++ b/各种归档/20261009_网页多图层与扩展画布/all-final.log @@ -0,0 +1,679 @@ +requirements 未变化,跳过依赖安装。 +> <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Scripts\python.exe -m pip check +No broken requirements found. +已清理:<仓库根目录>\测试相关资料\如何测试\本机测试环境\work\pytest +> <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Scripts\python.exe -m pytest -q -p no:cacheprovider --basetemp=<仓库根目录>\测试相关资料\如何测试\本机测试环境\work\pytest +........................................................................ [ 13%] +........................................................................ [ 27%] +........................................................................ [ 41%] +...................................Fsssssss.......s..................... [ 55%] +........................................................................ [ 69%] +.......s................................................................ [ 82%] +........................................................................ [ 96%] +................. [100%] +================================== FAILURES =================================== +__ test_media_settings_api_accepts_outside_centers_but_rejects_an_empty_view __ + + Exception Group Traceback (most recent call last): + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_utils.py", line 79, in collapse_excgroups + | yield + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py", line 183, in __call__ + | async with anyio.create_task_group() as task_group: + | ~~~~~~~~~~~~~~~~~~~~~~~^^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\_backends\_asyncio.py", line 815, in __aexit__ + | raise BaseExceptionGroup( + | "unhandled errors in a TaskGroup", self._exceptions + | ) from None + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\_pytest\runner.py", line 344, in from_call + | result: TResult | None = func() + | ~~~~^^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\_pytest\runner.py", line 246, in + | lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise + | ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\pluggy\_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\pluggy\_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\pluggy\_callers.py", line 167, in _multicall + | raise exception + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\pluggy\_callers.py", line 139, in _multicall + | teardown.throw(exception) + | ~~~~~~~~~~~~~~^^^^^^^^^^^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\_pytest\logging.py", line 850, in pytest_runtest_call + | yield + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\pluggy\_callers.py", line 139, in _multicall + | teardown.throw(exception) + | ~~~~~~~~~~~~~~^^^^^^^^^^^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\_pytest\capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\pluggy\_callers.py", line 139, in _multicall + | teardown.throw(exception) + | ~~~~~~~~~~~~~~^^^^^^^^^^^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\_pytest\skipping.py", line 263, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\pluggy\_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\_pytest\runner.py", line 178, in pytest_runtest_call + | item.runtest() + | ~~~~~~~~~~~~^^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\_pytest\python.py", line 1671, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\pluggy\_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\pluggy\_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\pluggy\_callers.py", line 167, in _multicall + | raise exception + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\pluggy\_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\_pytest\python.py", line 157, in pytest_pyfunc_call + | result = testfunction(**testargs) + | File "<仓库根目录>\核桃派软件源代码\tests\test_media_conversion.py", line 347, in test_media_settings_api_accepts_outside_centers_but_rejects_an_empty_view + | accepted = client.put( + | "/api/media-imports/" + job_id + "/settings", + | json={"center_x": -31 / 64, "center_y": -31 / 32}, + | ) + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\testclient.py", line 583, in put + | return super().put( + | ~~~~~~~~~~~^ + | url, + | ^^^^ + | ...<10 lines>... + | extensions=extensions, + | ^^^^^^^^^^^^^^^^^^^^^^ + | ) + | ^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py", line 1181, in put + | return self.request( + | ~~~~~~~~~~~~^ + | "PUT", + | ^^^^^^ + | ...<11 lines>... + | extensions=extensions, + | ^^^^^^^^^^^^^^^^^^^^^^ + | ) + | ^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\testclient.py", line 451, in request + | return super().request( + | ~~~~~~~~~~~~~~~^ + | method, + | ^^^^^^^ + | ...<11 lines>... + | extensions=extensions, + | ^^^^^^^^^^^^^^^^^^^^^^ + | ) + | ^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py", line 825, in request + | return self.send(request, auth=auth, follow_redirects=follow_redirects) + | ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py", line 914, in send + | response = self._send_handling_auth( + | request, + | ...<2 lines>... + | history=[], + | ) + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py", line 942, in _send_handling_auth + | response = self._send_handling_redirects( + | request, + | follow_redirects=follow_redirects, + | history=history, + | ) + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py", line 979, in _send_handling_redirects + | response = self._send_single_request(request) + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py", line 1014, in _send_single_request + | response = transport.handle_request(request) + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\testclient.py", line 354, in handle_request + | raise exc + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\testclient.py", line 351, in handle_request + | portal.call(self.app, scope, receive, send) + | ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\from_thread.py", line 338, in call + | return cast(T_Retval, self.start_task_soon(func, *args).result()) + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^ + | File "<开发机用户目录>\AppData\Local\Programs\Python\Python314\Lib\concurrent\futures\_base.py", line 450, in result + | return self.__get_result() + | ~~~~~~~~~~~~~~~~~^^ + | File "<开发机用户目录>\AppData\Local\Programs\Python\Python314\Lib\concurrent\futures\_base.py", line 395, in __get_result + | raise self._exception + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\from_thread.py", line 263, in _call_func + | retval = await retval_or_awaitable + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\errors.py", line 186, in __call__ + | raise exc + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\errors.py", line 164, in __call__ + | await self.app(scope, receive, _send) + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py", line 182, in __call__ + | with recv_stream, send_stream, collapse_excgroups(): + | ~~~~~~~~~~~~~~~~~~^^ + | File "<开发机用户目录>\AppData\Local\Programs\Python\Python314\Lib\contextlib.py", line 162, in __exit__ + | self.gen.throw(value) + | ~~~~~~~~~~~~~~^^^^^^^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_utils.py", line 85, in collapse_excgroups + | raise exc + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py", line 184, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "<仓库根目录>\核桃派软件源代码\app\main.py", line 760, in cache_policy + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py", line 159, in call_next + | raise app_exc + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py", line 144, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\exceptions.py", line 63, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py", line 716, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py", line 736, in app + | await route.handle(scope, receive, send) + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py", line 290, in handle + | await self.app(scope, receive, send) + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py", line 78, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py", line 75, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py", line 302, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ...<3 lines>... + | ) + | ^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py", line 215, in run_endpoint_function + | return await run_in_threadpool(dependant.call, **values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\concurrency.py", line 38, in run_in_threadpool + | return await anyio.to_thread.run_sync(func) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\to_thread.py", line 65, in run_sync + | return await get_async_backend().run_sync_in_worker_thread( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | func, args, abandon_on_cancel=abandon_on_cancel, limiter=limiter + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ) + | ^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\_backends\_asyncio.py", line 2641, in run_sync_in_worker_thread + | return await future + | ^^^^^^^^^^^^ + | File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\_backends\_asyncio.py", line 1033, in run + | result = context.run(func, *args) + | File "<仓库根目录>\核桃派软件源代码\app\main.py", line 1527, in update_media_settings + | return media_imports.update_settings( + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ + | job_id, request.model_dump(exclude_unset=True, exclude_none=True), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ) + | ^ + | File "<仓库根目录>\核桃派软件源代码\app\media\manager.py", line 463, in update_settings + | self._write(record) + | ~~~~~~~~~~~^^^^^^^^ + | File "<仓库根目录>\核桃派软件源代码\app\media\manager.py", line 137, in _write + | atomic_write_bytes(self._path(record["id"]), payload) + | ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "<仓库根目录>\核桃派软件源代码\app\persistence.py", line 14, in atomic_write_bytes + | atomic_write_many_bytes(((Path(path), content),)) + | ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "<仓库根目录>\核桃派软件源代码\app\persistence.py", line 41, in atomic_write_many_bytes + | os.replace(temporaries[target], target) + | ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | PermissionError: [WinError 5] 拒绝访问。: 'C:\\Users\\<开发机用户名>\\Documents\\wenjian\\1.work\\奇妙小屏幕控制器-核桃派\\测试相关资料\\如何测试\\本机测试环境\\work\\pytest\\test_media_settings_api_accept0\\data\\media-import\\jobs\\9905d4cf-ffe2-4270-91a2-8fd6579b252a\\.job.json.45cf7fdfecf34a80a4164eb8f5171514.tmp' -> 'C:\\Users\\<开发机用户名>\\Documents\\wenjian\\1.work\\奇妙小屏幕控制器-核桃派\\测试相关资料\\如何测试\\本机测试环境\\work\\pytest\\test_media_settings_api_accept0\\data\\media-import\\jobs\\9905d4cf-ffe2-4270-91a2-8fd6579b252a\\job.json' + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "<仓库根目录>\核桃派软件源代码\tests\test_media_conversion.py", line 347, in test_media_settings_api_accepts_outside_centers_but_rejects_an_empty_view + accepted = client.put( + "/api/media-imports/" + job_id + "/settings", + json={"center_x": -31 / 64, "center_y": -31 / 32}, + ) + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\testclient.py", line 583, in put + return super().put( + ~~~~~~~~~~~^ + url, + ^^^^ + ...<10 lines>... + extensions=extensions, + ^^^^^^^^^^^^^^^^^^^^^^ + ) + ^ + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py", line 1181, in put + return self.request( + ~~~~~~~~~~~~^ + "PUT", + ^^^^^^ + ...<11 lines>... + extensions=extensions, + ^^^^^^^^^^^^^^^^^^^^^^ + ) + ^ + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\testclient.py", line 451, in request + return super().request( + ~~~~~~~~~~~~~~~^ + method, + ^^^^^^^ + ...<11 lines>... + extensions=extensions, + ^^^^^^^^^^^^^^^^^^^^^^ + ) + ^ + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py", line 825, in request + return self.send(request, auth=auth, follow_redirects=follow_redirects) + ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py", line 914, in send + response = self._send_handling_auth( + request, + ...<2 lines>... + history=[], + ) + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py", line 942, in _send_handling_auth + response = self._send_handling_redirects( + request, + follow_redirects=follow_redirects, + history=history, + ) + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py", line 979, in _send_handling_redirects + response = self._send_single_request(request) + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py", line 1014, in _send_single_request + response = transport.handle_request(request) + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\testclient.py", line 354, in handle_request + raise exc + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\testclient.py", line 351, in handle_request + portal.call(self.app, scope, receive, send) + ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\from_thread.py", line 338, in call + return cast(T_Retval, self.start_task_soon(func, *args).result()) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^ + File "<开发机用户目录>\AppData\Local\Programs\Python\Python314\Lib\concurrent\futures\_base.py", line 450, in result + return self.__get_result() + ~~~~~~~~~~~~~~~~~^^ + File "<开发机用户目录>\AppData\Local\Programs\Python\Python314\Lib\concurrent\futures\_base.py", line 395, in __get_result + raise self._exception + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\from_thread.py", line 263, in _call_func + retval = await retval_or_awaitable + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\errors.py", line 186, in __call__ + raise exc + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\errors.py", line 164, in __call__ + await self.app(scope, receive, _send) + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py", line 182, in __call__ + with recv_stream, send_stream, collapse_excgroups(): + ~~~~~~~~~~~~~~~~~~^^ + File "<开发机用户目录>\AppData\Local\Programs\Python\Python314\Lib\contextlib.py", line 162, in __exit__ + self.gen.throw(value) + ~~~~~~~~~~~~~~^^^^^^^ + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_utils.py", line 85, in collapse_excgroups + raise exc + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py", line 184, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "<仓库根目录>\核桃派软件源代码\app\main.py", line 760, in cache_policy + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py", line 159, in call_next + raise app_exc + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py", line 144, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\exceptions.py", line 63, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app + raise exc + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py", line 716, in __call__ + await self.middleware_stack(scope, receive, send) + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py", line 736, in app + await route.handle(scope, receive, send) + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py", line 290, in handle + await self.app(scope, receive, send) + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py", line 78, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app + raise exc + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py", line 75, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py", line 302, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ...<3 lines>... + ) + ^ + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py", line 215, in run_endpoint_function + return await run_in_threadpool(dependant.call, **values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\concurrency.py", line 38, in run_in_threadpool + return await anyio.to_thread.run_sync(func) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\to_thread.py", line 65, in run_sync + return await get_async_backend().run_sync_in_worker_thread( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + func, args, abandon_on_cancel=abandon_on_cancel, limiter=limiter + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ) + ^ + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\_backends\_asyncio.py", line 2641, in run_sync_in_worker_thread + return await future + ^^^^^^^^^^^^ + File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\_backends\_asyncio.py", line 1033, in run + result = context.run(func, *args) + File "<仓库根目录>\核桃派软件源代码\app\main.py", line 1527, in update_media_settings + return media_imports.update_settings( + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ + job_id, request.model_dump(exclude_unset=True, exclude_none=True), + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ) + ^ + File "<仓库根目录>\核桃派软件源代码\app\media\manager.py", line 463, in update_settings + self._write(record) + ~~~~~~~~~~~^^^^^^^^ + File "<仓库根目录>\核桃派软件源代码\app\media\manager.py", line 137, in _write + atomic_write_bytes(self._path(record["id"]), payload) + ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "<仓库根目录>\核桃派软件源代码\app\persistence.py", line 14, in atomic_write_bytes + atomic_write_many_bytes(((Path(path), content),)) + ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "<仓库根目录>\核桃派软件源代码\app\persistence.py", line 41, in atomic_write_many_bytes + os.replace(temporaries[target], target) + ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +PermissionError: [WinError 5] 拒绝访问。: 'C:\\Users\\<开发机用户名>\\Documents\\wenjian\\1.work\\奇妙小屏幕控制器-核桃派\\测试相关资料\\如何测试\\本机测试环境\\work\\pytest\\test_media_settings_api_accept0\\data\\media-import\\jobs\\9905d4cf-ffe2-4270-91a2-8fd6579b252a\\.job.json.45cf7fdfecf34a80a4164eb8f5171514.tmp' -> 'C:\\Users\\<开发机用户名>\\Documents\\wenjian\\1.work\\奇妙小屏幕控制器-核桃派\\测试相关资料\\如何测试\\本机测试环境\\work\\pytest\\test_media_settings_api_accept0\\data\\media-import\\jobs\\9905d4cf-ffe2-4270-91a2-8fd6579b252a\\job.json' + +During handling of the above exception, another exception occurred: + +tmp_path = WindowsPath('<仓库根目录>/测试相关资料/如何测试/本机测试环境/work/pytest/test_media_settings_api_accept0') + + def test_media_settings_api_accepts_outside_centers_but_rejects_an_empty_view(tmp_path): + app = create_app(project_root=tmp_path, driver_kind="mock") + payload = png_bytes(Image.new("RGB", (2, 1), "white")) + with TestClient(app) as client: + uploaded = client.post( + "/api/media-imports?filename=a.png&name=自由取景", content=payload, + headers={"Content-Type": "application/octet-stream", "Content-Length": str(len(payload))}, + ) + job_id = uploaded.json()["id"] + wait_for(client, job_id, "awaiting_settings") +> accepted = client.put( + "/api/media-imports/" + job_id + "/settings", + json={"center_x": -31 / 64, "center_y": -31 / 32}, + ) + +tests\test_media_conversion.py:347: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\testclient.py:583: in put + return super().put( +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py:1181: in put + return self.request( +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\testclient.py:451: in request + return super().request( +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py:825: in request + return self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py:914: in send + response = self._send_handling_auth( +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py:942: in _send_handling_auth + response = self._send_handling_redirects( +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py:979: in _send_handling_redirects + response = self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py:1014: in _send_single_request + response = transport.handle_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\testclient.py:354: in handle_request + raise exc +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\testclient.py:351: in handle_request + portal.call(self.app, scope, receive, send) +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\from_thread.py:338: in call + return cast(T_Retval, self.start_task_soon(func, *args).result()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +..\..\..\..\..\AppData\Local\Programs\Python\Python314\Lib\concurrent\futures\_base.py:450: in result + return self.__get_result() + ^^^^^^^^^^^^^^^^^^^ +..\..\..\..\..\AppData\Local\Programs\Python\Python314\Lib\concurrent\futures\_base.py:395: in __get_result + raise self._exception +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\from_thread.py:263: in _call_func + retval = await retval_or_awaitable + ^^^^^^^^^^^^^^^^^^^^^^^^^ +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\errors.py:186: in __call__ + raise exc +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\errors.py:164: in __call__ + await self.app(scope, receive, _send) +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py:182: in __call__ + with recv_stream, send_stream, collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +..\..\..\..\..\AppData\Local\Programs\Python\Python314\Lib\contextlib.py:162: in __exit__ + self.gen.throw(value) +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_utils.py:85: in collapse_excgroups + raise exc +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py:184: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +app\main.py:760: in cache_policy + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py:159: in call_next + raise app_exc +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py:144: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\exceptions.py:63: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_exception_handler.py:53: in wrapped_app + raise exc +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py:716: in __call__ + await self.middleware_stack(scope, receive, send) +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py:736: in app + await route.handle(scope, receive, send) +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py:290: in handle + await self.app(scope, receive, send) +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py:78: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_exception_handler.py:53: in wrapped_app + raise exc +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py:75: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:302: in app + raw_response = await run_endpoint_function( +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:215: in run_endpoint_function + return await run_in_threadpool(dependant.call, **values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\concurrency.py:38: in run_in_threadpool + return await anyio.to_thread.run_sync(func) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\to_thread.py:65: in run_sync + return await get_async_backend().run_sync_in_worker_thread( +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\_backends\_asyncio.py:2641: in run_sync_in_worker_thread + return await future + ^^^^^^^^^^^^ +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\_backends\_asyncio.py:1033: in run + result = context.run(func, *args) + ^^^^^^^^^^^^^^^^^^^^^^^^ +app\main.py:1527: in update_media_settings + return media_imports.update_settings( +app\media\manager.py:463: in update_settings + self._write(record) +app\media\manager.py:137: in _write + atomic_write_bytes(self._path(record["id"]), payload) +app\persistence.py:14: in atomic_write_bytes + atomic_write_many_bytes(((Path(path), content),)) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +writes = ((WindowsPath('<仓库根目录>/测试相关资料/如何测试/本机测试环境/work/pytest/test_media_setting... },\n "source_size": 72,\n "state": "awaiting_settings",\n "updated_at": "2026-10-09T07:13:23.922089+00:00"\n}\n'),) + + def atomic_write_many_bytes(writes: Iterable[tuple[Path, bytes]]) -> None: + """Durably replace one or more files and roll back a failed transaction.""" + entries = [(Path(path), bytes(content)) for path, content in writes] + if not entries: + return + targets = [path for path, _content in entries] + if len(set(targets)) != len(targets): + raise ValueError("atomic write transaction contains duplicate paths") + + originals: dict[Path, bytes | None] = {} + temporaries: dict[Path, Path] = {} + replaced: list[Path] = [] + parents = sorted({target.parent for target in targets}, key=str) + + try: + for target, _content in entries: + target.parent.mkdir(parents=True, exist_ok=True) + originals[target] = target.read_bytes() if target.exists() else None + for target, content in entries: + temporary = _write_temporary(target, content) + temporaries[target] = temporary + for parent in parents: + _fsync_directory(parent) + for target, _content in entries: +> os.replace(temporaries[target], target) +E PermissionError: [WinError 5] 拒绝访问。: 'C:\\Users\\<开发机用户名>\\Documents\\wenjian\\1.work\\奇妙小屏幕控制器-核桃派\\测试相关资料\\如何测试\\本机测试环境\\work\\pytest\\test_media_settings_api_accept0\\data\\media-import\\jobs\\9905d4cf-ffe2-4270-91a2-8fd6579b252a\\.job.json.45cf7fdfecf34a80a4164eb8f5171514.tmp' -> 'C:\\Users\\<开发机用户名>\\Documents\\wenjian\\1.work\\奇妙小屏幕控制器-核桃派\\测试相关资料\\如何测试\\本机测试环境\\work\\pytest\\test_media_settings_api_accept0\\data\\media-import\\jobs\\9905d4cf-ffe2-4270-91a2-8fd6579b252a\\job.json' + +app\persistence.py:41: PermissionError +------------------------------ Captured log call ------------------------------ +WARNING app.power.voltage:voltage.py:601 Screen voltage sensor status=disconnected error_code=unsupported_platform +WARNING app.monitoring.resources:resources.py:249 System resource monitor is unavailable: proc_read_error +============================== warnings summary =============================== +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15 + @no_type_check_decorator + +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: 10 warnings + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15 + @no_type_check_decorator + +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: 83 warnings +tests/test_animations.py: 913 warnings +tests/test_api.py: 2075 warnings +tests/test_fonts.py: 249 warnings +tests/test_frp.py: 332 warnings +tests/test_library_order.py: 332 warnings +tests/test_media_conversion.py: 830 warnings +tests/test_mobile_control.py: 1162 warnings +tests/test_ota.py: 249 warnings +tests/test_performance_mode.py: 83 warnings +tests/test_scene_layers.py: 166 warnings +tests/test_templates.py: 664 warnings +tests/test_ui_copy_editor.py: 599 warnings +tests/test_wifi.py: 249 warnings + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: DeprecationWarning: 'asyncio.iscoroutinefunction' is deprecated and slated for removal in Python 3.16; use inspect.iscoroutinefunction() instead + is_coroutine = asyncio.iscoroutinefunction(dependant.call) + +app\main.py:2049: 1 warning +tests/test_animations.py: 11 warnings +tests/test_api.py: 25 warnings +tests/test_fonts.py: 3 warnings +tests/test_frp.py: 4 warnings +tests/test_library_order.py: 4 warnings +tests/test_media_conversion.py: 10 warnings +tests/test_mobile_control.py: 14 warnings +tests/test_ota.py: 3 warnings +tests/test_performance_mode.py: 1 warning +tests/test_scene_layers.py: 2 warnings +tests/test_templates.py: 8 warnings +tests/test_ui_copy_editor.py: 7 warnings +tests/test_wifi.py: 3 warnings + <仓库根目录>\核桃派软件源代码\app\main.py:2049: DeprecationWarning: + on_event is deprecated, use lifespan event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). + + @app.on_event("startup") + +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: 2 warnings +tests/test_animations.py: 22 warnings +tests/test_api.py: 50 warnings +tests/test_fonts.py: 6 warnings +tests/test_frp.py: 8 warnings +tests/test_library_order.py: 8 warnings +tests/test_media_conversion.py: 20 warnings +tests/test_mobile_control.py: 28 warnings +tests/test_ota.py: 6 warnings +tests/test_performance_mode.py: 2 warnings +tests/test_scene_layers.py: 4 warnings +tests/test_templates.py: 16 warnings +tests/test_ui_copy_editor.py: 14 warnings +tests/test_wifi.py: 6 warnings + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: DeprecationWarning: + on_event is deprecated, use lifespan event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). + + return self.router.on_event(event_type) + +app\main.py:2079: 1 warning +tests/test_animations.py: 11 warnings +tests/test_api.py: 25 warnings +tests/test_fonts.py: 3 warnings +tests/test_frp.py: 4 warnings +tests/test_library_order.py: 4 warnings +tests/test_media_conversion.py: 10 warnings +tests/test_mobile_control.py: 14 warnings +tests/test_ota.py: 3 warnings +tests/test_performance_mode.py: 1 warning +tests/test_scene_layers.py: 2 warnings +tests/test_templates.py: 8 warnings +tests/test_ui_copy_editor.py: 7 warnings +tests/test_wifi.py: 3 warnings + <仓库根目录>\核桃派软件源代码\app\main.py:2079: DeprecationWarning: + on_event is deprecated, use lifespan event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). + + @app.on_event("shutdown") + +tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner +tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner +tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner +tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner + <仓库根目录>\核桃派软件源代码\tests\test_media_conversion.py:134: DeprecationWarning: Image.Image.getdata is deprecated and will be removed in Pillow 14 (2027-10-15). Use get_flattened_data instead. + assert sum(pixel[0] > 240 for pixel in output.getdata()) == 1 + +tests/test_templates.py::test_template_crud_copy_persistence_and_thumbnail_cleanup + <仓库根目录>\核桃派软件源代码\tests\test_templates.py:165: DeprecationWarning: Image.Image.getdata is deprecated and will be removed in Pillow 14 (2027-10-15). Use get_flattened_data instead. + assert len(set(image.getdata())) > 1 + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +=========================== short test summary info =========================== +FAILED tests/test_media_conversion.py::test_media_settings_api_accepts_outside_centers_but_rejects_an_empty_view +1 failed, 511 passed, 9 skipped, 8390 warnings in 133.37s (0:02:13) +本机测试工具失败:Command '['C:\\Users\\<开发机用户名>\\Documents\\wenjian\\1.work\\奇妙小屏幕控制器-核桃派\\测试相关资料\\如何测试\\本机测试环境\\.venv\\Scripts\\python.exe', '-m', 'pytest', '-q', '-p', 'no:cacheprovider', '--basetemp=C:\\Users\\<开发机用户名>\\Documents\\wenjian\\1.work\\奇妙小屏幕控制器-核桃派\\测试相关资料\\如何测试\\本机测试环境\\work\\pytest']' returned non-zero exit status 1. diff --git a/各种归档/20261009_网页多图层与扩展画布/all-ready.log b/各种归档/20261009_网页多图层与扩展画布/all-ready.log new file mode 100644 index 0000000..d2da305 --- /dev/null +++ b/各种归档/20261009_网页多图层与扩展画布/all-ready.log @@ -0,0 +1,248 @@ +requirements 未变化,跳过依赖安装。 +> <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Scripts\python.exe -m pip check +No broken requirements found. +已清理:<仓库根目录>\测试相关资料\如何测试\本机测试环境\work\pytest +> <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Scripts\python.exe -m pytest -q -p no:cacheprovider --basetemp=<仓库根目录>\测试相关资料\如何测试\本机测试环境\work\pytest +........................................................................ [ 13%] +........................................................................ [ 27%] +........................................................................ [ 41%] +....................................sssssss.......s..................... [ 55%] +........................................................................ [ 68%] +.......s................................................................ [ 82%] +........................................................................ [ 96%] +.................. [100%] +============================== warnings summary =============================== +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15 + @no_type_check_decorator + +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: 10 warnings + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15 + @no_type_check_decorator + +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: 83 warnings +tests/test_animations.py: 913 warnings +tests/test_api.py: 2075 warnings +tests/test_fonts.py: 249 warnings +tests/test_frp.py: 332 warnings +tests/test_library_order.py: 332 warnings +tests/test_media_conversion.py: 830 warnings +tests/test_mobile_control.py: 1162 warnings +tests/test_ota.py: 249 warnings +tests/test_performance_mode.py: 83 warnings +tests/test_scene_layers.py: 166 warnings +tests/test_templates.py: 664 warnings +tests/test_ui_copy_editor.py: 599 warnings +tests/test_wifi.py: 249 warnings + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: DeprecationWarning: 'asyncio.iscoroutinefunction' is deprecated and slated for removal in Python 3.16; use inspect.iscoroutinefunction() instead + is_coroutine = asyncio.iscoroutinefunction(dependant.call) + +app\main.py:2049: 1 warning +tests/test_animations.py: 11 warnings +tests/test_api.py: 25 warnings +tests/test_fonts.py: 3 warnings +tests/test_frp.py: 4 warnings +tests/test_library_order.py: 4 warnings +tests/test_media_conversion.py: 10 warnings +tests/test_mobile_control.py: 14 warnings +tests/test_ota.py: 3 warnings +tests/test_performance_mode.py: 1 warning +tests/test_scene_layers.py: 2 warnings +tests/test_templates.py: 8 warnings +tests/test_ui_copy_editor.py: 7 warnings +tests/test_wifi.py: 3 warnings + <仓库根目录>\核桃派软件源代码\app\main.py:2049: DeprecationWarning: + on_event is deprecated, use lifespan event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). + + @app.on_event("startup") + +..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: 2 warnings +tests/test_animations.py: 22 warnings +tests/test_api.py: 50 warnings +tests/test_fonts.py: 6 warnings +tests/test_frp.py: 8 warnings +tests/test_library_order.py: 8 warnings +tests/test_media_conversion.py: 20 warnings +tests/test_mobile_control.py: 28 warnings +tests/test_ota.py: 6 warnings +tests/test_performance_mode.py: 2 warnings +tests/test_scene_layers.py: 4 warnings +tests/test_templates.py: 16 warnings +tests/test_ui_copy_editor.py: 14 warnings +tests/test_wifi.py: 6 warnings + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: DeprecationWarning: + on_event is deprecated, use lifespan event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). + + return self.router.on_event(event_type) + +app\main.py:2079: 1 warning +tests/test_animations.py: 11 warnings +tests/test_api.py: 25 warnings +tests/test_fonts.py: 3 warnings +tests/test_frp.py: 4 warnings +tests/test_library_order.py: 4 warnings +tests/test_media_conversion.py: 10 warnings +tests/test_mobile_control.py: 14 warnings +tests/test_ota.py: 3 warnings +tests/test_performance_mode.py: 1 warning +tests/test_scene_layers.py: 2 warnings +tests/test_templates.py: 8 warnings +tests/test_ui_copy_editor.py: 7 warnings +tests/test_wifi.py: 3 warnings + <仓库根目录>\核桃派软件源代码\app\main.py:2079: DeprecationWarning: + on_event is deprecated, use lifespan event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). + + @app.on_event("shutdown") + +tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner +tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner +tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner +tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner + <仓库根目录>\核桃派软件源代码\tests\test_media_conversion.py:134: DeprecationWarning: Image.Image.getdata is deprecated and will be removed in Pillow 14 (2027-10-15). Use get_flattened_data instead. + assert sum(pixel[0] > 240 for pixel in output.getdata()) == 1 + +tests/test_templates.py::test_template_crud_copy_persistence_and_thumbnail_cleanup + <仓库根目录>\核桃派软件源代码\tests\test_templates.py:165: DeprecationWarning: Image.Image.getdata is deprecated and will be removed in Pillow 14 (2027-10-15). Use get_flattened_data instead. + assert len(set(image.getdata())) > 1 + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +513 passed, 9 skipped, 8390 warnings in 80.59s (0:01:20) +> "C:\Program Files\nodejs\node.EXE" --test tests/test_animation_ui.mjs tests/test_canvas_tools.mjs tests/test_color_math.mjs tests/test_current_display_playback_ui.mjs tests/test_device_ui.mjs tests/test_font_picker.mjs tests/test_frp_ui.mjs tests/test_interaction_feedback.mjs tests/test_scene_model.mjs tests/test_scene_layers.mjs tests/test_settings_ui.mjs tests/test_template_management_ui.mjs tests/test_ui_copy_editor.mjs tests/test_wifi_ui.mjs tests/test_workspace_order_ui.mjs +✔ derives automatic frame names from current animation name and position (0.9515ms) +✔ keeps custom frame names and restores automatic names when cleared (0.1245ms) +✔ builds non-repeating animation edit context names (0.261ms) +✔ selects saved animation preview frames by ordered durations (1.2698ms) +✔ loads every preview frame through revision-checked pagination (0.9708ms) +✔ validates configurable animation preview concurrency (0.3327ms) +✔ rejects mixed revisions instead of showing a partial animation (0.5586ms) +✔ validates frame duration only when explicitly called (0.4824ms) +✔ moves selected frames as one ordered group (0.2395ms) +✔ protects an eight pixel ring around interactive drag controls (0.2648ms) +✔ reorders mixed library keys without mutating the source list (0.1429ms) +✔ restores drag eligibility after protected pointer cancellation and drag end (0.4837ms) +✔ animation workspace exposes two previews and the simplified control order (7.7914ms) +✔ normal and pixel modes expose independent ranges and presets (1.4623ms) +✔ pixel stamps are exact squares from 1x1 through 4x4 (0.2562ms) +✔ pixel stamps clip at every canvas edge (0.2164ms) +✔ normal circle geometry remains unchanged (0.1049ms) +✔ line interpolation includes endpoints without coordinate gaps (0.2417ms) +✔ older tools migrate while v3 restores the coordinate guide choice (0.2446ms) +✔ coordinate guide spacing adapts to the transformed logical pixel size (0.1592ms) +✔ coordinate guide ticks preserve logical values through zoom and pan (0.2081ms) +✔ pixel mode markup and grid stay accessible and non-interactive (7.7742ms) +✔ pixel undo history stores changed snapshots, caps entries, and clears (0.4387ms) +✔ canvas view clamps scale and keeps a visible section in the viewport (0.188ms) +✔ zooming around an anchor preserves its logical position (0.13ms) +✔ floating editor button stays inside its safe viewport bounds (0.0947ms) +✔ canvas editor markup, guarded input, and checkpoint events stay wired (3.4305ms) +✔ normalizes and converts hexadecimal colors (1.9821ms) +✔ converts RGB and HSV boundaries (0.5703ms) +✔ round trips representative colors within 8-bit rounding (0.5308ms) +✔ recent colors deduplicate, normalize, and evict the oldest (0.5626ms) +✔ formats and projects looping playback without moving paused content (1.1975ms) +✔ seek dispatcher keeps one request in flight and flushes the newest position (4.4609ms) +✔ topbar current display dialog exposes static close and animation controls (6.2645ms) +✔ device workspace exposes the compact immediate pure-color test flow (9.8628ms) +✔ font catalog normalization, grouping, and search are stable (1.5036ms) +✔ font picker implements commit-only searchable combobox keyboard behavior (5.6835ms) +✔ settings places unrestricted FRP maintenance at the bottom (6.9486ms) +✔ FRP editor uses raw server storage and official validation errors (2.167ms) +✔ network diagnostics renders layered evidence (2.1028ms) +✔ unavailable controls never masquerade as indefinite loading (10.083ms) +✔ action controls do not bypass the shared state module (11.6691ms) +✔ HTTP requests time out with a stable user-facing error (22.3421ms) +✔ demo library actions stay black, explain restrictions, and preserve copy (3.2743ms) +✔ sortable cards protect controls and keep demo cards fixed (2.9684ms) +✔ old scene migration rejects unknown fields and duplicate text without filtering (64.7563ms) +✔ PNG compression round trips sparse and full brush pixels without DOM (6.196ms) +✔ blank and black are distinct; independent backgrounds follow layer order (6.6852ms) +✔ disabled background colors stay independent through storage and copy (22.0249ms) +✔ extended pixels survive storage but never enter the central output (9.2346ms) +✔ move preview does not mutate source; confirmed clipping removes only outside ink (19.7505ms) +✔ text clipping follows anchor and scale and is retained after edit/reload/copy (13.7559ms) +✔ multiple text groups isolate edits, copies and IDs (1.2854ms) +✔ strict v2 storage protects unknown data and the final brush invariant (8.3614ms) +✔ creates a fixed 64x64 RGB scene (10.9456ms) +✔ serializes pixelRgb as base64 and round trips an independent scene (37.0409ms) +✔ moves a valid v1 draft to the stable key before removing exact legacy keys (49.945ms) +✔ keeps the v1 draft and all legacy keys when stable-key migration cannot write (24.5337ms) +✔ preserves and blocks a future stable draft instead of falling back or writing blank (8.204ms) +✔ preserves and blocks a damaged stable draft (0.4319ms) +✔ does not discard a damaged higher-priority legacy key during fallback migration (2.5171ms) +✔ rejects damaged scene roots while skipping only damaged elements (14.877ms) +✔ normalizes text fields and creates a centered lowercase ok element (0.6562ms) +✔ migrates the first valid canvas by v3, v2, legacy priority and merges text v1 (21.5273ms) +✔ supports independent add, update, and delete operations for multiple text elements (0.9531ms) +✔ duplicates with a deep copy, new id, 2px offset, and topmost order (0.6196ms) +✔ alpha-composites full RGBA layers in array order without mutating inputs (3.6943ms) +✔ settings brightness explains an active temporary display-test override (9.7684ms) +✔ settings exposes full OTA upload progress and service recovery polling (8.1602ms) +✔ settings automatically opens and safely copies a detailed OTA failure log (8.1723ms) +✔ settings exposes a transactional performance-mode switch with the fixed warning (5.1003ms) +✔ settings exposes persisted animation preview concurrency below performance mode (4.0705ms) +✔ template edit baseline distinguishes clean, dirty, and unbound scenes (3.5809ms) +✔ template manager uses a monitor and unified four-row card actions (14.6767ms) +✔ animation editing backs up and restores template edit ownership (2.2034ms) +✔ special editor exposes the agreed modes and guarded editing flow (14.5121ms) +✔ latched WiFi draft state remains dirty until explicitly cleared (4.2347ms) +✔ WiFi settings expose independent network and prompt-delay controls (6.8702ms) +✔ workspace order resolves saved ids and appends new registrations (1.8016ms) +✔ workspace order movement is immutable and respects both boundaries (0.3724ms) +✔ drawer exposes one editable list and commits only from the save action (10.7414ms) +ℹ tests 81 +ℹ suites 0 +ℹ pass 81 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 693.5062 +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\animation-thumbnail-preview.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\animation-ui-model.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\app.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\canvas-tools-model.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\color-math.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\color-picker.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\core.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\current-display-playback.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\font-picker.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\interaction-feedback.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\media-crop-geometry.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\media-import-ui-model.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\pixel-png.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\scene-board.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\scene-model-v1.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\scene-model.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\sortable-card.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\template-edit-model.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\ui-copy-runtime.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\vendor\fflate\fflate.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\animations.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\canvas.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\device.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\frp-settings.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\layers.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\media-import.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\settings.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\templates.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\text.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\wifi-settings.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\wifi-draft-state.js +> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\workspace-order.js +> "C:\Program Files\nodejs\node.EXE" --check app/ui_copy_editor/static/editor.js +> <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Scripts\python.exe scripts/build_ui_copy_catalog.py --check +ui-copy.json is current +本机测试套件通过:all diff --git a/各种归档/20261009_网页多图层与扩展画布/desktop-final.png b/各种归档/20261009_网页多图层与扩展画布/desktop-final.png new file mode 100644 index 0000000000000000000000000000000000000000..fe4534468b49d7d379802e7e61a95eab032ba76f GIT binary patch literal 33696 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%0A-;`lmLZZ(*l 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 literal 0 HcmV?d00001 diff --git a/各种归档/20261009_网页多图层与扩展画布/device-browser.json b/各种归档/20261009_网页多图层与扩展画布/device-browser.json new file mode 100644 index 0000000..42e75f4 --- /dev/null +++ b/各种归档/20261009_网页多图层与扩展画布/device-browser.json @@ -0,0 +1,15 @@ +{ + "desktop": { + "passed": true, + "nativeConfirmations": 6, + "layers": 3, + "errors": [] + }, + "narrowMenu": { + "x": 74, + "y": 394, + "width": 224, + "height": 438 + }, + "touchLayerX": "10" +} \ No newline at end of file diff --git a/各种归档/20261009_网页多图层与扩展画布/device-cleanup-confirmed.log b/各种归档/20261009_网页多图层与扩展画布/device-cleanup-confirmed.log new file mode 100644 index 0000000..0cbb2c6 --- /dev/null +++ b/各种归档/20261009_网页多图层与扩展画布/device-cleanup-confirmed.log @@ -0,0 +1 @@ +Verified all 37 exact task payload/stage/rollback/test paths absent; user content unchanged. diff --git a/各种归档/20261009_网页多图层与扩展画布/device-cleanup.log b/各种归档/20261009_网页多图层与扩展画布/device-cleanup.log new file mode 100644 index 0000000..c73d897 --- /dev/null +++ b/各种归档/20261009_网页多图层与扩展画布/device-cleanup.log @@ -0,0 +1,2 @@ +私有凭据文件可用;未输出任何凭据值。 +Removed exact remote temporary payload: /run/matrix-screen-controller-layers-20261009 diff --git a/各种归档/20261009_网页多图层与扩展画布/device-deployment-deploy-ready.log b/各种归档/20261009_网页多图层与扩展画布/device-deployment-deploy-ready.log new file mode 100644 index 0000000..2bfe850 --- /dev/null +++ b/各种归档/20261009_网页多图层与扩展画布/device-deployment-deploy-ready.log @@ -0,0 +1,130 @@ +annotated_types-0.8.0-py3-none-any.whl: OK +anyio-4.14.2-py3-none-any.whl: OK +certifi-2026.7.22-py3-none-any.whl: OK +cffi-2.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl: OK +click-8.4.2-py3-none-any.whl: OK +colorama-0.4.6-py2.py3-none-any.whl: OK +cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl: OK +dbus_next-0.2.3-py3-none-any.whl: OK +fastapi-0.116.1-py3-none-any.whl: OK +fonttools-4.63.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl: OK +h11-0.16.0-py3-none-any.whl: OK +httpcore-1.0.9-py3-none-any.whl: OK +httptools-0.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl: OK +httpx-0.28.1-py3-none-any.whl: OK +idna-3.18-py3-none-any.whl: OK +iniconfig-2.3.0-py3-none-any.whl: OK +packaging-26.3-py3-none-any.whl: OK +pillow-12.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl: OK +pluggy-1.6.0-py3-none-any.whl: OK +pycparser-3.0-py3-none-any.whl: OK +pydantic-2.13.4-py3-none-any.whl: OK +pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl: OK +pygments-2.20.0-py3-none-any.whl: OK +pytest-8.4.1-py3-none-any.whl: OK +python_dotenv-1.2.2-py3-none-any.whl: OK +pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl: OK +starlette-0.47.3-py3-none-any.whl: OK +typing_extensions-4.16.0-py3-none-any.whl: OK +typing_inspection-0.4.2-py3-none-any.whl: OK +uvicorn-0.35.0-py3-none-any.whl: OK +uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl: OK +watchfiles-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl: OK +websockets-17.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl: OK +Looking in links: /run/[private]-screen-controller-layers-20261009/wheels +Processing /run/[private]-screen-controller-layers-20261009/wheels/fastapi-0.116.1-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/uvicorn-0.35.0-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/pillow-12.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/fonttools-4.63.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/dbus_next-0.2.3-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/pytest-8.4.1-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/httpx-0.28.1-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/starlette-0.47.3-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/pydantic-2.13.4-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/typing_extensions-4.16.0-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/click-8.4.2-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/h11-0.16.0-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/httptools-0.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/python_dotenv-1.2.2-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/websockets-17.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/cffi-2.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/iniconfig-2.3.0-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/packaging-26.3-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/pluggy-1.6.0-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/pygments-2.20.0-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/anyio-4.14.2-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/certifi-2026.7.22-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/httpcore-1.0.9-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/idna-3.18-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/pycparser-3.0-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/annotated_types-0.8.0-py3-none-any.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl +Processing /run/[private]-screen-controller-layers-20261009/wheels/typing_inspection-0.4.2-py3-none-any.whl +Installing collected packages: websockets, uvloop, typing-extensions, pyyaml, python-dotenv, pygments, pycparser, pluggy, pillow, packaging, iniconfig, idna, httptools, h11, fonttools, dbus-next, click, certifi, annotated-types, uvicorn, typing-inspection, pytest, pydantic-core, httpcore, cffi, anyio, watchfiles, starlette, pydantic, httpx, cryptography, fastapi +Successfully installed annotated-types-0.8.0 anyio-4.14.2 certifi-2026.7.22 cffi-2.1.1 click-8.4.2 cryptography-46.0.5 dbus-next-0.2.3 fastapi-0.116.1 fonttools-4.63.0 h11-0.16.0 httpcore-1.0.9 httptools-0.8.0 httpx-0.28.1 idna-3.18 iniconfig-2.3.0 packaging-26.3 pillow-12.3.0 pluggy-1.6.0 pycparser-3.0 pydantic-2.13.4 pydantic-core-2.46.4 pygments-2.20.0 pytest-8.4.1 python-dotenv-1.2.2 pyyaml-6.0.3 starlette-0.47.3 typing-extensions-4.16.0 typing-inspection-0.4.2 uvicorn-0.35.0 uvloop-0.22.1 watchfiles-1.2.0 websockets-17.0.1 +make: Entering directory '/opt/[private]-screen-controller.stage.1.1.3-layers-20261009-ready/app/display/native' +rm -f -- libh618_hub75.so hub75_benchmark hub75_native_test hub75_safeoff +cc -O3 -std=c11 -Wall -Wextra -Werror -fPIC -pthread -shared h618_hub75.c -o libh618_hub75.so -pthread +cc -O3 -std=c11 -Wall -Wextra -Werror -fPIC -pthread benchmark.c h618_hub75.c -o hub75_benchmark -pthread +cc -O3 -std=c11 -Wall -Wextra -Werror -fPIC -pthread native_test.c h618_hub75.c -o hub75_native_test -pthread +cc -O3 -std=c11 -Wall -Wextra -Werror -fPIC -pthread safeoff.c h618_hub75.c -o hub75_safeoff -pthread +./hub75_native_test +native_bitplane_tests=PASS +./hub75_safeoff --fake +HUB75 safeoff complete +make: Leaving directory '/opt/[private]-screen-controller.stage.1.1.3-layers-20261009-ready/app/display/native' +........................................................................ [ 14%] +........................................................................ [ 28%] +.............................................................s.......... [ 42%] +........................................................................ [ 56%] +........................................................................ [ 70%] +.......s.......................................................s........ [ 84%] +........................................................................ [ 98%] +.......sss [100%] +508 passed, 7 skipped, 389 warnings in 401.84s (0:06:41) +PASS: H618 PI pinctrl: allwinner,sun50i-h616-pinctrl +PASS: /dev/mem accessible: /dev/mem +PASS: /dev/i2c-1 present: /dev/i2c-1 +PASS: CPU3 present: /sys/devices/system/cpu/cpu3 +PASS: native HUB75 library: /opt/[private]-screen-controller.stage.1.1.3-layers-20261009-ready/app/display/native/libh618_hub75.so +PASS: AArch64 userspace: aarch64 +PASS: default network route: default via <设备网络地址> dev wlan0 proto static metric 600 +PASS: NetworkManager active: active +PASS: lightdm.service inactive: inactive +PASS: gpioc-server.service inactive: inactive +PASS: map_device.service inactive: inactive +Persistent data prepared successfully: schema=config.json +frpc: OK +LICENSE: OK +frpc binary already verified; skipped +frpc 0.71.0 installed as a system component +● [private]-screen-controller.service - WalnutPi H618 Matrix Screen Controller + Loaded: loaded (/etc/systemd/system/[private]-screen-controller.service; enabled; preset: enabled) + Active: active (running) since Fri 2026-10-09 07:36:54 UTC; 9s ago + Process: 292616 ExecStartPre=/bin/sh -c cat /proc/sys/kernel/sched_rt_runtime_us > /run/[private]-screen-controller/sched_rt_runtime_us.original && printf "%s +" -1 > /proc/sys/kernel/sched_rt_runtime_us (code=exited, status=0/SUCCESS) + Process: 292618 ExecStartPre=/opt/[private]-screen-controller/.venv/bin/python /opt/[private]-screen-controller/scripts/dedicated_host.py check --service (code=exited, status=0/SUCCESS) + Process: 292624 ExecStartPre=/opt/[private]-screen-controller/app/display/native/hub75_safeoff (code=exited, status=0/SUCCESS) + Main PID: 292625 (python) + Tasks: 14 (limit: 1021) + Memory: 137.5M + CPU: 11.644s + CGroup: /system.slice/[private]-screen-controller.service + └─292625 /opt/[private]-screen-controller/.venv/bin/python -m uvicorn app.main:app --host 0.0.0.0 --port 8080 + +Oct 09 07:37:01 [private] python[292625]: File "/opt/[private]-screen-controller/.venv/lib/python3.11/site-packages/dbus_next/message_bus.py", line 712, in _process_message +Oct 09 07:37:01 [private] python[292625]: handler(msg, send_reply) +Oct 09 07:37:01 [private] python[292625]: File "/opt/[private]-screen-controller/.venv/lib/python3.11/site-packages/dbus_next/message_bus.py", line 898, in _default_properties_handler +Oct 09 07:37:01 [private] python[292625]: raise DBusError( +Oct 09 07:37:01 [private] python[292625]: dbus_next.errors.DBusError: interface "org.bluez.LEAdvertisement1" does not have property "TxPower" +Oct 09 07:37:01 [private] python[292625]: 2026-10-09 07:37:01,456 INFO app.power.voltage: Screen voltage sensor is available +Oct 09 07:37:01 [private] python[292625]: 2026-10-09 07:37:01,489 INFO app.monitoring.resources: System resource monitor is available +Oct 09 07:37:02 [private] python[292625]: INFO: Application startup complete. +Oct 09 07:37:02 [private] python[292625]: INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit) +Oct 09 07:37:02 [private] python[292625]: INFO: 127.0.0.1:47456 - "GET /api/status HTTP/1.1" 200 OK +WalnutPi Matrix Screen Controller updated successfully: 1.1.3-layers-20261009-ready +WARNING: The directory '/home/[private]/.cache/pip' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you should use sudo's -H flag. diff --git a/各种归档/20261009_网页多图层与扩展画布/device-desktop-menu.png b/各种归档/20261009_网页多图层与扩展画布/device-desktop-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..87d2c63c6c6cb7e8e16ede7dcc61ad0d41ec6a4b GIT binary patch literal 31708 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

-ceX%fv~vE8+aAvJcih>o+DM8%|A+MIr!QV)sid+B zaf_fdYsq8h!%mA_A81H7Ow?cP9jlT?dtXt(G=d-|bBgleaj zsn){5x?-$pntV2c#;v&uh>G}E4!Oi!%zw>(;KxUzOXB{VahG9;_b(9HsdzQzAWgyl z^2INOD6eOeWJ@p0xE6y^;i$wG0K=)8wyvz1rn=@QUKFjK`)uSYvPgh<3t+=&lh$9rX@Ufb$n}an5f$SAM$XV!r4biBIBONh_bIZcZrkzXc-~Iv z=r|1x-R^Ujrf$4dY(wpH@SZ#Su~@%Yg&)b$SLbaR`+ryN*YE!7e! z9af4x z_Da#uS)?4jBuUNyisaN-Z(?|7#r`)R3;U?<%w#v%wMWdg$mTE+>kdvhgL!tUCsi$W z({hjnY+H}h|5Zz@H)C(I9|%}k;oL}f*LmhO@fm3iq$R~JfcDHVHHBZtfZ~{yU#ZFy zRrFj5pn@ndf)AsWXS@_87?F+Eyx76J^SyPRsJ;4m$mdEMBpq}La`W?3 z(s8wjT#vH0K2mFNj;;W*^rfe;+^1l+Fc;#QdZ{IW9s!MQ-ctGw@hJ!Sro(@;0< zdT06sb;I2n-$S32@c;UNa&ly{Ib+==C8&gTtop%GGLWYO0hl}(dN^-n)NN|(=e3hR zJvRjq1A>O3=!|goc3JHU)=sRD@Un6tsdYvZZ>rwXbTrcE6btVMaAa{vkXRYf(9&K! z^fjz|OBn$*X{BL=Lg9bXWB$`0N`}GFb1>hG@r^BIGm3e&spfXr4Cqre;a)kq80o!$ ziz|_b{oDZ1fHGXLp*yf_hcy)u?Eb3XUd5URaBk`sr1q9XY--cMIzIsJl9I48>#$y+ z*lGe3(XKWv_k+Z0!?d&mUO~zQYFt^xehr4%c*l+5;Nz19H2?}^QgftCuWdK!p<_Jn zOP~vp5>&pe5mD}Ul!>!t(qG#guzDk4ydEmqqVacVoMYYQ8bMv3dEM${(3@+zyKDMh z6>F%yt&ACmt)Z=?d?1-u6y(_~d=h}}I4b(&G9nukZZKl+EGLQ%R2NE zkFgV!6x?E@4mJP^{Cp)rj?$}m$bN7CD~UsY=vO8tX*ZYM?U8Y*)$d_KLT9DcAN=}P z0K}<$q@!~PChne5=T{OYfPB#pQ|{8IqE;GMKDdm}>!J?o{TGWymbx%5JWbWVkNr;0 z954pA%z0-EKI{_|e%^P~|4Wk^2YDnC`S9UG5|!FNm)wyOK{%lY>_OCD7BX#f#{Fh4 zDr06|{}PEmf+SR~S>KqiXU$*#)~@5XO4sK5dmCz3)U>IrpI=Ablm^e?qaL={S9>KxdSCvo-sRpOUT~)YqMhc(V%d2oRc z>ndJHgsVR}eYvODvJYFD-vv_NKP}2jNXYiRFz7y-^F6U>NfWP>I&<9za|=vB=2M+Q zFgB4C+)so6=!KVnlr1cX)J$LM$e)hv&H&Tzad(pO8CX4kn-MtuTQ}C%(~Fyn3?KmW z9r;PkzQ zAz6Oy{ee-V$MW`*4S07CEB#~HyuV>JVrX7u=$IPpeNX&K_pIh*zB+ge#kP>PZM4a= zs8Oo_rT&cS&X~4!y{KihBxfx=z|th@sk#RR_cu70^tZQRIvFoUM|bm{PmU#t*E)?a zba=}*pGs7hiOlwWd#pF7+Kd($;wvEd^$xgDp72@|?>Yv3=hUfu_4maY$9O7`;F4FN zV?Dm`c~z1M!K5f%)cNLB+;Q!DSy~wM#r!{iMHDzTw6tFE?rh~UM8Q?9;3%GNaJJ!W zxR5I}S0qMK9GI;Ab9pcpEEP6!9a%9Lu%3*B8OAJNX8Z#XIu#StPlNWD+Pk zf(Ol>7jdoF7ouke0NOwUx*P$D^U;-6#G_AH_pwNG&S;2b*|GcY8gGqKylQH^Htaf} z3+&%V`DP4mYSrZI2rUNE%Zn6+vntqCu#5H5ZjhdSj6ITu!f%T0ZBn1~i(SSP_geBL zZ2D|0;Bb1eG}r9ltO=H=!!RI;1D#wxgZUuvg7CU~+pQld2n%9&9bNQx3-PN zc~)``hvzSyl{*loa_pSU+NX2?`PG%ey3lmBq1!G9 z(}6iRuVE5@?C+eq|2oW{L0s&)?Kw_}m8dLgVB1_r_yf)NyUaUwaC}WE!j@i`*uN~W z>WQ+Y5@rgrVVM`!x-jwr*rckdZ&#kSn3`Np2g1IR!z+H(OG`;Z&KSu^UibCf^jPVQ z^`xi?`QrOV(vIujLF>9wkkkbU?xF6*TOwuZV)X7U(4(jBR_}&pxIT{r_*7ILQ4R|V z<*Q%h5*5y}~hX@VX zbU(fw^Sop~-OcvILvBt9)J(hEcuVn*{UQb^VbY1=dBNO-!x;;^x^mDiOKN5xNZdcPmN;SW%NTDr8(ZNqxR>>y+Z6CUJ zpc|cH3D_pcB)#TFXZZR#vkmd|pW|t4Id7OjWvP)7SqWJrPhgRFkYza~Ne=j-zqb{` zc)3%)GKvm8XMxpwW32edCo3`*$8UHl=lR<{&?7v~>UfoD3raFk%>MvS6~?0$sV+UpHee9>(JF!dZRWzBKxr}wBg+6+#DD^{8QFXy9L`1zm>0} zt5cDQC621}1qip&8u_o)_k{!#-Qd5pfV*bhrab1<87F^T{+#2P<=4#S@Y9)>gCy003GncaH0Y@zbCW)7{I`ZssOq3 z0UC8xUx3|h+M`$iCs-QCtk$bn8)vhi6U^!`DobHx$yD7rU)$^==6LkM-dWyg?@29n zV`!G!1CEYPC3^~T@`IjdWl4UrB$?V}#w@g2;yeLgfIoAabPEPm!Ts?Dg1_juKR=Q8 zT)IR{O1?EO5~ntj7sFQJTecr0P7?!4e7g&UxWhGg5JkODJAcFN~f zcMOUc@gmjpZzMdd4(F|$;#le~FUU-IF`82Xn`%M*O8km6kI3POaGe319e!BT|q{w4)E21+ybhlL|u31LB}!y6At3i zRx4=?hz({jxNx&iM5*!h;}s$Y<5Qn1m)ZzwsLfjY0ZTfe@4)tWsHnnpxP7Zw6#Sv) zJ?zT8=?)kjB6cxc-z(sPfQyO2q}N%=(AL&ZxAGIPE)zbKKfP&f>$_eYButLWdtz!BEwj4*Vn*E&1^`P<=01L z&hlhsN~|6z)UJa_YJrj3A$E0p9J;TeFIS$@cN}aP9zV=TsE2W3H zUfn7hpXd9Rko7vEs08e*zy2*iS1d>J@NNgx4b%}J^i`s3QG-@03(NrzJaBpczMcn9 zCu)I<4?ctzE69tw9uX+J&yvf=q?BU|x6hLnJcK@YNz{YlK3J(Hy<95Z!ICT9#HtfX{R99)b7-glHB8;|A2GgyoiDz#>GF-94~Kw ze_QC7X}K_{lJ!!YAlGoc%A3|O1KiRQ8w_K#J!5TfKqjkhscx>4Cm_d~p;>`7oLn6X z){*i4FpJQV0%VZl)uOpVco7pIv5yF6@*|*Yif@5+Z(}%ucMDTGZ?-TR%J=Ko0Y}Yt zc+q?HKRxr~z`uva$43t+?J}8Ykyb`?;{q(dmQd0x`sveO;li=IFdb76%W$J3*oLnC z{7%mA9(p_erw2{~Ja8Hj3vrKg1^=VxW_%WE=dq;**k~ zthwSBrEoXfx^7UkC>* zO>?u-xT&A^3pHFF2Okf;l$|kfu*_nPj`D^Zrpli(st9 z-A3a%hqf8+sLBp%Hw9n>6Wq!@e++-T>IFS7+Z52X*L2pf1I*h+K|?mPGx)2Rre-C2 z3a9Rw9t-G+GQ%7yAa42aqXuO{{Rbv-=Ou|D3lX{%o_au*G!V~^0~z@uAPBB6WHSzd z7{|NwSlRrL%^t%ZP7e>Br&&|iHD*57%{LzuLd&*;N7xZ%+Xhe=7F^x={>&mM>D+6z z99RJrO*aqvnb{Ne_W<4ia59gUaM<7mGkFXMfTm+yrzT=`KV5ibvKD$+QTb|D10SDX z=5QNmIdMwItLV{v@nK~Z=OgJqq1){iXI>zaK>&Qn58&#m^Hq{n|NTKmbB$FIiTvNu z`xB4(EKTG9;28g{wV>@*udAyFUON9b#sY!>c#%)F@#3=D+Wc{&a+U2+2!z!HsYKVm;lO zqct&n7#;Yq`*O;HJpHtH;HOLa=j*>yb++^@G^aA$kKq7ys-U9ThkbpQ4 z5P`w^D!rzoqiX}lhRI?vzgD-rfZ(c5UDegMJ-8M6`H(7{u)PH!LdcBT4R&NRRGyxh|*cZSAC}Wlx?Ao z#LF=sf%75@f=*_k!s|z&W7E^w19&a}01f}cAKH#sfE$DYk=@Ynjh{Djo8{H3Mu6CY zI1W6c8IzjdqX2rp8F5emq#kc?FqtQ33dg9%-TH@SR`LvxvseGbK3&#J^4v%h(8cH? zc29U+1dC8c1R+yfM;mY2uq@!J)I9y|H55;t40HAvq5Aj5OI(2b07~DyDK5;9dM32Q zaf}MkvEU6{u#>?+R?eZ+(|E$C^o$fjIv)YM0uay=oxdwM`iIE%C!umX)scjgJ`ARf zQ8Vd7t2g27JpUwzf!n_UUVXNL)h(0#XKJm zX7+@?eRD_DJLpK+AZQOakwGOoP;m~BtCWSeWjh%wxn1k*z^&&b^B;#B$+k*tEeHbq zt-ne54|zjm$i^A}Q5BLx6cLB7Yj{TXzVGa$Is$`M$`;T%ynue9l-ewm9<~Y9*+69o zV0wDTj#r@~Vm0XBzi|S!FRd;0hCJqd!9bkZoa;6n-rrHtQ0dp(0(y<1M&X*>4t$>G#A-tu)B7`k8n0;pJe4>8terNSRz z+CFjFOfc9fN$8z|pS~1JBI8&PjDXq`LOKIE(rpYESTXm3Fuf(&`d+lm>igJDA4aF` zFS*th7!G2JbDb~*(LTM<2~{!ZFNluwxw#A%T#IQv`>mzvY@>BFn6#XtBKuVXjr#a8 z8i$ch!YOwf6LIl}Ys9|t;&#z&@xXDTP3Fdo?v}D`=EkB0Sx%Dxo>bLS?8#XHkLj)z z9DURu8hO`PclE*XV~>qVRb~;xyH7~2zWtbrzx#ObD0zs^-CR@gKx#cg?khjmd0r)M z6Sl>dYZ3B{n5_iKe8KXVp#wK;L&j&pe7csvsZ`=;K`^hd`*NCgo^JPcdM)UTKRZ4n zj&mX-yI&s-!@ysL9q%8iP-9NhV#>OI{#FUGc`8$HWVikrAv@}`W`FZi)B$JnL20!Whpl5>Sa{!ioZ~IC+-kcJHWJX2a;w{H%HRJvCP2S-aOusl;(x-yAY4n_gDj$5v!*1V~q)%->>gJK>?`S-!bR z4>%__T@D6%7WdyO6+7>Rq)O~`bx!TN+s#ckUQ}l`HTv4R{wQBLXcmsr%%V$9)<>;U zeY5p2NXUE~Lkg7~!fy91>%&^F6`$vtH`J5wk&z_F8=*wqu2X5|>~ck+Vn75wN8x4mrwE>K19 zi=>j_WQGlFP8W~#4it(Tj4=_HBb`#S3Wau*hXyJR8f&Bw5d%U-$rEaV=7!ohPN$ZO z1o!cL1Xvr&ZgIIQ))|+~vURH$H5iF_OLt=AQRMt@Ra5B9ONF%?N)ecb>n7ixLV^GX zD@%=J9KZiF71Zl(s(xy!K8=shdqh4+xqcs0;EMRV$rKZF;h_h8q!vJ1!1r!M}LY)usCK%@OsEFVCccmJ^lTQqtD~1yc4)S^R~-35j72`uLV8uK=ej~ zZ>-*?k*5spyj8X1t`8sQmcoHIBsF@oMumW5$79~7!7B3``Ilg==(dPGA$htfQctd9 zqU`j+W~#TMb`B1YhP?p4K{yu}Uzc&DHX>z0LRy6SqzKm)zPyzN_N2#$v;hhb4>fBhhp%PTIh!V)nqw(Xx)Q_KRsGZ&-CsFr&_Ug*H3*~}ontQb7 z=2J2Y~xsJ3Zc-&SsPF-JBPMOBeBI|1W5I5^nV)1Ud^!igOP zqZO6H!Xh*CmnHTa31H2nImTP*O=R1DP&y;{oeC%YAPZZ~q3stoIoVe(xX0*v^W5=o zt#UMj?3UQJ<&F<*QLTZS=H@&ayoVY^GSCKCVeE6)w<{4TqUnBVE*crI%1)_<%S|Q8 zLELbMg(q~RH?E)-83F<*f*M?0Ua3F#QYt^~MP)_St*-7|Zm)4{pGlV)ya^SSY0{Vb zmFcvq|LHkK$xBYHGHh31Mr^M}gW^4{Lr4jE)ozi%o*YACsh8x-ndmFjz{$f20K8cd|-8Cq>oiUUlo6+LR1Mvl|#;Z9=YT z+veh8uH(YeP~XnZPMxuxwE)^FJ;`Q5i(pVQEf|^``BXg&&_fqacXf5WDKbmXqUa_N z$oCJw#~*%?s&@e!_$mDc7mdYW_YgHQntprXadNEoiK^bv%bxQhycMwMn>;v}i+gw| z4xv>nWHEH<41r*le!{9zw>Wd-ZRHjwn6*d7T_PJkwqk6jd6+|`i>x5RGc9%M>!WPl zU)Ye=xU?}wmlSo?JDZrfL=27$Mux7t(QmP*B@u79*jieH-TvEsRw|{Aora;t#@zUw zzJQSG8RBV;C#o>Gs&7^4B{7UnxW>WbAKk_W`zM~$Ns5U9mk zwEIt#hq{5BwFg4NTK~&;3W+bKM??b>VTFy=TSn%C-1o?OCQw73odi=y!IlBe#g|$2 ziXp#^ihz|&o34NM$Y2@SdlIu%7g+06=g}sHx|@PIT=OThgcpsY(y==I>tgdWIOQ6X zU_*_wzUU?EY38UM7VuEMnA8OYQ$knvX zp9I$Sh59z+6cLF>4-br#?Xd`eoagrWY!U0_$S)d6dT7X**JotQkCGbHFK z^dicF4Bki8Pr4&AnfNvBX^~Srjdlq`TGqNL|F^5)h_to<PASnhbhXb%4Xkv_S^pek0*i$ literal 0 HcmV?d00001 diff --git a/各种归档/20261009_网页多图层与扩展画布/device-mobile-menu.png b/各种归档/20261009_网页多图层与扩展画布/device-mobile-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..c687d1d10f483b14924e7fbabdaaa84f8cce2a9e GIT binary patch literal 26015 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 literal 0 HcmV?d00001 diff --git a/各种归档/20261009_网页多图层与扩展画布/device-ready-verification.log b/各种归档/20261009_网页多图层与扩展画布/device-ready-verification.log new file mode 100644 index 0000000..68c1c81 --- /dev/null +++ b/各种归档/20261009_网页多图层与扩展画布/device-ready-verification.log @@ -0,0 +1,5 @@ +私有凭据文件可用;未输出任何凭据值。 +Preserved all user content/settings/files; obsolete mobile preview caches removed: 13 +All persistent logical frames, order, durations, metadata and other files unchanged. +{"service": {"app_version": "a412c79f4887320b", "software_version": "1.1.3", "feature_updated_at": "2026-10-09T15:27+08:00", "instance_id": "<本次服务实例>"}, "driver": {"actual_refresh_rate_hz": 97.36, "panel_scan_rate_hz": 97.36, "completed_frames": 14796, "completed_scans": 14796, "scans_per_frame": 1, "deadline_misses": 0, "buffer_swaps": 379, "submitted_frames": 379, "oe_timing_backend": "h618-pwm4", "oe_pulse_faults": 0, "oe_forced_blanks": 0, "max_programmed_oe_ns": 128000, "oe_timing_error": null, "safeoff_error": null, "cpu_affinity": 3, "cpu_affinity_active": true, "cpu_affinity_error": null, "realtime_priority": 50, "realtime_priority_active": true, "realtime_priority_error": null, "memory_locked": true, "memory_lock_error": null, "running": true, "governor": "ondemand", "last_error": null}} + diff --git a/各种归档/20261009_网页多图层与扩展画布/device-rest.log b/各种归档/20261009_网页多图层与扩展画布/device-rest.log new file mode 100644 index 0000000..319e150 --- /dev/null +++ b/各种归档/20261009_网页多图层与扩展画布/device-rest.log @@ -0,0 +1,2 @@ +{"passed": true, "checks": "save/reload, central output, clip, single/all frames, independent IDs, durations, revision conflicts, 64/192 preview", "driver": {"actual_refresh_rate_hz": 97.377, "panel_scan_rate_hz": 97.377, "completed_frames": 11365, "completed_scans": 11365, "scans_per_frame": 1, "deadline_misses": 0, "buffer_swaps": 291, "submitted_frames": 291, "oe_timing_backend": "h618-pwm4", "oe_pulse_faults": 0, "oe_forced_blanks": 0, "max_programmed_oe_ns": 128000, "oe_timing_error": null, "safeoff_error": null, "cpu_affinity": 3, "cpu_affinity_active": true, "cpu_affinity_error": null, "realtime_priority": 50, "realtime_priority_active": true, "realtime_priority_error": null, "memory_locked": true, "memory_lock_error": null, "running": true, "governor": "ondemand", "last_error": null}} +Removed all independent REST verification content IDs. diff --git a/各种归档/20261009_网页多图层与扩展画布/hygiene-complete.log b/各种归档/20261009_网页多图层与扩展画布/hygiene-complete.log new file mode 100644 index 0000000..c06fa63 --- /dev/null +++ b/各种归档/20261009_网页多图层与扩展画布/hygiene-complete.log @@ -0,0 +1 @@ +仓库卫生检查通过:已检查 706 个 Git 候选文件,未输出任何秘密值。 diff --git a/各种归档/20261009_网页多图层与扩展画布/hygiene-ready.log b/各种归档/20261009_网页多图层与扩展画布/hygiene-ready.log new file mode 100644 index 0000000..e9dbdca --- /dev/null +++ b/各种归档/20261009_网页多图层与扩展画布/hygiene-ready.log @@ -0,0 +1 @@ +仓库卫生检查通过:已检查 694 个 Git 候选文件,未输出任何秘密值。 diff --git a/各种归档/20261009_网页多图层与扩展画布/installed-source.log b/各种归档/20261009_网页多图层与扩展画布/installed-source.log new file mode 100644 index 0000000..7259604 --- /dev/null +++ b/各种归档/20261009_网页多图层与扩展画布/installed-source.log @@ -0,0 +1 @@ +{"verified_source_files": 33, "version": "1.1.3", "feature_updated_at": "2026-10-09T15:27+08:00"} diff --git a/各种归档/20261009_网页多图层与扩展画布/isolation-final.log b/各种归档/20261009_网页多图层与扩展画布/isolation-final.log new file mode 100644 index 0000000..942bd3b --- /dev/null +++ b/各种归档/20261009_网页多图层与扩展画布/isolation-final.log @@ -0,0 +1,9 @@ +........................................................................ [ 14%] +........................................................................ [ 28%] +.............................................................s.......... [ 42%] +....................................sssssss.......s..................... [ 56%] +........................................................................ [ 70%] +.......s................................................................ [ 84%] +........................................................................ [ 99%] +..... [100%] +499 passed, 11 skipped, 8390 warnings in 85.15s (0:01:25) diff --git a/各种归档/20261009_网页多图层与扩展画布/isolation-ready.log b/各种归档/20261009_网页多图层与扩展画布/isolation-ready.log new file mode 100644 index 0000000..9d908bc --- /dev/null +++ b/各种归档/20261009_网页多图层与扩展画布/isolation-ready.log @@ -0,0 +1,57 @@ +........................................................... [100%] +============================== warnings summary =============================== +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87 + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15 + @no_type_check_decorator + +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: 10 warnings + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15 + @no_type_check_decorator + +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: 83 warnings +tests/test_scene_layers.py: 166 warnings + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: DeprecationWarning: 'asyncio.iscoroutinefunction' is deprecated and slated for removal in Python 3.16; use inspect.iscoroutinefunction() instead + is_coroutine = asyncio.iscoroutinefunction(dependant.call) + +测试相关资料\如何测试\本机测试环境\.local\work\layers-implementation\独立 工作区\核桃派软件源代码\app\main.py:2049 +tests/test_scene_layers.py::test_append_layers_conflict_batch_failure_and_restart +tests/test_scene_layers.py::test_text_extended_preview_default_size_and_persistent_clip + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.local\work\layers-implementation\独立 工作区\核桃派软件源代码\app\main.py:2049: DeprecationWarning: + on_event is deprecated, use lifespan event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). + + @app.on_event("startup") + +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495 +测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495 +tests/test_scene_layers.py::test_append_layers_conflict_batch_failure_and_restart +tests/test_scene_layers.py::test_append_layers_conflict_batch_failure_and_restart +tests/test_scene_layers.py::test_text_extended_preview_default_size_and_persistent_clip +tests/test_scene_layers.py::test_text_extended_preview_default_size_and_persistent_clip + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: DeprecationWarning: + on_event is deprecated, use lifespan event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). + + return self.router.on_event(event_type) + +测试相关资料\如何测试\本机测试环境\.local\work\layers-implementation\独立 工作区\核桃派软件源代码\app\main.py:2079 +tests/test_scene_layers.py::test_append_layers_conflict_batch_failure_and_restart +tests/test_scene_layers.py::test_text_extended_preview_default_size_and_persistent_clip + <仓库根目录>\测试相关资料\如何测试\本机测试环境\.local\work\layers-implementation\独立 工作区\核桃派软件源代码\app\main.py:2079: DeprecationWarning: + on_event is deprecated, use lifespan event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). + + @app.on_event("shutdown") + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +59 passed, 276 warnings in 3.45s diff --git a/各种归档/20261009_网页多图层与扩展画布/media-formats.log b/各种归档/20261009_网页多图层与扩展画布/media-formats.log new file mode 100644 index 0000000..559b309 --- /dev/null +++ b/各种归档/20261009_网页多图层与扩展画布/media-formats.log @@ -0,0 +1,16 @@ +ffmpeg version N-125146-gc6bb22dea0-20260621 Copyright (c) 2000-2026 the FFmpeg developers +built with gcc 15.2.0 (crosstool-NG 1.28.0.23_185f348) +configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug --enable-shared --disable-static --disable-w32threads --enable-pthreads --enable-iconv --enable-zlib --enable-libxml2 --enable-libvmaf --enable-fontconfig --enable-libharfbuzz --enable-libfreetype --enable-libfribidi --enable-vulkan --enable-libshaderc --enable-libvorbis --disable-libxcb --disable-xlib --disable-libpulse --enable-gmp --enable-lzma --enable-liblcevc-dec --enable-opencl --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth --enable-chromaprint --enable-libdav1d --enable-libdavs2 --enable-libdvdread --enable-libdvdnav --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme --enable-libkvazaar --enable-libaribcaption --enable-libass --enable-libbluray --enable-libjxl --enable-libmp3lame --enable-libopus --enable-libplacebo --enable-librist --enable-libssh --enable-libtheora --enable-libvpx --enable-libwebp --enable-libzmq --enable-lv2 --enable-libvpl --enable-openal --enable-liboapv --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --enable-schannel --enable-sdl2 --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --disable-libdrm --enable-vaapi --enable-libvidstab --enable-libvvenc --disable-whisper --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-libs=-lgomp --extra-ldflags=-pthread --extra-ldexeflags= --cc=x86_64-w64-mingw32-gcc --cxx=x86_64-w64-mingw32-g++ --ar=x86_64-w64-mingw32-gcc-ar --ranlib=x86_64-w64-mingw32-gcc-ranlib --nm=x86_64-w64-mingw32-gcc-nm --extra-version=20260621 +libavutil 60. 33.101 / 60. 33.101 +libavcodec 62. 36.101 / 62. 36.101 +libavformat 62. 19.101 / 62. 19.101 +libavdevice 62. 4.100 / 62. 4.100 +libavfilter 11. 17.100 / 11. 17.100 +libswscale 9. 8.100 / 9. 8.100 +libswresample 6. 4.100 / 6. 4.100 + +Exiting with exit code 0 +......s [100%] +=========================== short test summary info =========================== +SKIPPED [1] tests\test_media_formats.py:64: libheif examples are not installed +6 passed, 1 skipped in 1.83s diff --git a/各种归档/20261009_网页多图层与扩展画布/migration-edge-python.log b/各种归档/20261009_网页多图层与扩展画布/migration-edge-python.log new file mode 100644 index 0000000..0e5eb82 --- /dev/null +++ b/各种归档/20261009_网页多图层与扩展画布/migration-edge-python.log @@ -0,0 +1,2 @@ +........................................................... [100%] +59 passed, 276 warnings in 3.05s diff --git a/各种归档/20261009_网页多图层与扩展画布/mobile-320.png b/各种归档/20261009_网页多图层与扩展画布/mobile-320.png new file mode 100644 index 0000000000000000000000000000000000000000..c15e9986de56fd9bb8690333ebce2dd487f37e20 GIT binary patch literal 23523 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 literal 0 HcmV?d00001 diff --git a/各种归档/20261009_网页多图层与扩展画布/mobile-layers.png b/各种归档/20261009_网页多图层与扩展画布/mobile-layers.png new file mode 100644 index 0000000000000000000000000000000000000000..7fe56cd0d2beaac5a75f76f6130a31ea1068e263 GIT binary patch literal 26336 zcmeFZWmH^Sw=J6N5C{+)g1d#_5?q2)Xb8dG9fEsRf&{lBNN`JVcM1s(!QCN1;e|Uz z6|eR_@4M%Ir=9!$yxZD)KW_b~YBkqtYtA*-nxpqIMjtcsy}BX}76sOmCr@wyN^&2b zJbC){$&+WQFaAQc%;RPOo;<;S0+5sb=$i>!#V{k*Mq->c*(YSbdx1$`Kf!UylKVP} z?nRV^tOmkT0{b9xWh2X$dqrPELZaqVM8vkZxHJKpCjLJ44;8>?fhp_~_~Wr88H=H< z;W;=^Dz%4`zb^uvACEpkun(^p@bui`XY~EV)*caF*1UD5ncl0b}+0J)j+Td9l(LVzkmzRj5HBGipZUSXg?Sv4}sc{bm=aA@Xs%%3j*9e>6s z39E_<*2Q^ke99|QUx6yNdh7bL60PYmdvY2ttCN&kaPZO+g|r-0>HYgpavzPtj}huA zsfDz+eYY_*avzo!pLxX7jz|EN@CnG15?0vgTQ0ts3Q=TA3JVv8CGNkc-QKn0iH{g$ z+|%4x@BPLleGd}L#a;@!)ql_ctr7rUT}mdCqNDh(>zj6?l%u*F_=tW4oZsN-D}Lmi|QtR zMP509o1cilZ^XJ9%}e2`v8m~ zl9`ZTmJ;#{(;Xo|plLQ6OYOaa!irWU3sg5aGNh8_e?vzRi_#DLIx$?2Fhc?kEX%sqlATo|2zR5K-4D0C%1+|n}`u0 zVpFI8{*RkjStPa4zY~scmW@b(Tnras+t~o!KmB_bORo2O2X&C%=%2-1P5dIg8%O;Z zu%~2nY#YD6Z}qQ2EVX8sHr@Jzo21d!vj-|9(?e7Wv82HGFub z@uoLZKER|Iq!e9kcBgc8FSZ?flw%YE!d7|1`sjBz)j%HnI)Mxj`|J&Akjay7`C(GD z-vzFfQl90vASs$wPbE0^@$K(LcPqg~?uR8!`zp{mHn1L|_rl^h434q>a2sU`8uqDC z7PJrh138MycDYbNcN~DeUIAWh9T~JyWM-wmQ2@JB(PZ|^W_a%cJ7B+vd~kgaR@Gbs z&xe2CRQ@tvNpn!cKa8>P%_(dUtIgy#i0RCgooy9^C#+Mhqyme^n6Zd$KJluFBmgv15$Zd0josE{u zqVT~o7y-I#wKQ$_*AH*hydH0SiLGu=)DpBF3D(xSy!uw{4RLuGzG<%cG@Dp984~bm zaPSM8()Y&>0gC9Ufzdom=B8W@QQw~&Qw$m>bHf4UD`5L1#nXqN5Yop?$$DLITlC(Y z(@wF^tA{AItEM8ON$PRQ>v5b)+ajBY#6qfY*R_b8Myq=L$5+woWKFy8 zzXW1Q6^yH}Rh6&ZI=UFZ7mBfMuvPjJ&sTy%T!S7kI87CB0QS_&e_z^&{|`PNT$zH@x>zP~7ixJQ|0lcUvt!FT;BVc>UQTv5INg6j+k)MU_qnKtk0EzQx;!AOtRf(CgIxGYKl3_jdFSzQ=Rx@ zJ^9s!r$EH9Bi-~$B{;#O4MY<=bY464&EhT&06Mc@>-mu(8~y0JUVi# zz`!i|G%209gi|r3yalmOd+Enyo}3`3*Iml_Jwn~KPRpa`4L}5Uz5NmSD*=P`2HcdW zeA^WpRuz{VpF82}wtfZfj^{!~cc+9Ef8LZ8XV=+PRnJK;U+3&CS9tAy zOTz_dF7eg4Jf?MS#aC59F58Gd0xmjNALqr;b9K5IQ@n_Gk`3b+D?Y*Dv5G||K4V@5 zQ(z(nm@Vm3)S%U3n6`zfy!*yVj&h2*I|BV)x~OJ)voLZ|gU?UZ+DQ%iV=h>XCfv@( z72VH=YYGeWt($``nvY$9_bP`ADbpr~A(Ws1vs3wJAHJ@%{y`p&x9otqNLL%)2hfX$ zfgUgK?;jr!Q_sl5nt69iq6Ht)FMd}3>WV&=`0zS4a$cg-b*hu}m^|oFXes^SLW6YW zrb&CfLM%!)U z=4<%(eKfCW&W(OwD6m|ybk#@y3d#;*M)n;EN!3C7@+|wbvL7}!rP+LpWh+p)HUkKmqaF#6%8CQ4yaW6TSfLP zKEtXqCoH5=_^@@_R1!j4?Y)vfD(iyyAQ|!bT?dD+{m9JWI07DS*nn{s(zdr+@iwjl z;XlEL7DqtaJBmjczrp1KQ{kTKmVYGdPUl`?1Yi<;S8?tC(uT6K4LK%;IF!XM{;KyM zn=gul=C%e77ZJhM;9%7}&I2m-O1Pq^SJmTPYLzMSd#=A`|a|GxA_x6IlyzSWRvXLSfuFrMSzw!5?{cKI%*xyl8|_L$PEPX5 zrX4NF+S=Y8APqFJvC&cRzjwvBK3S|Y6i7gQLVKaNbC{EpZW{yy^z?ZwT0N$-Wk0Tl z<<)iOUSJizbF!^lG%_~UHqp^BGD-k32noS`y}TOe*gH)!dr#rl6Xrc|JhH*F{^$RS z1@t7)2_Z}~y&2Q$kLV$xJ%5)xag@zTof$5KZU-`yBH`@4b#(=Ry>?D)$fuV23= zcJ<7oPb45X5-q$EF4FMcnY@(6P>za5BeyJ8KH&Ep`ALgBv|w{{J1bC#CwJSBXFbQd zhOIW)o*-9Nh`Q54L+4f@Kd$!HDzpP(rO8qpkH?VU;6MVURsZaasl1CC%kPUKEm+y9 zgG!~eSJhdXo=s{_(_A8KTZ67}?-SzDjIK9BN=)D3FWX1-nZmw)HSxPDtg#$$UGMN% zj7lyRrsC*NOH12R;i8y?+_Xe@>fg?$VwaYdhIZx&i$dlYpL_{h?rAqHINiok2N$5RhrDwpql7)L_v zha01!ls6 z&~oYAii*?)-F5a!l^YrB9B=7J65(6_uoeR?Y8x5(Z^b4VHn=o6AL?x26~`wi4#e47 z+gM{a@PZE%C0uPi>3EbT8Uo^pMD&xBN%HT`n88l$5shqKrG>qXfa#x)HI_y7H;)qB z5{z`Fjmb$F5XX}a6-8swPk(-`LcEicld;w>sfEjnn=gHBQr^=rmH=lSy}39!v2k!5 zQ^8RLu9FXBF-&moKZ0WZe?~%#r>1BS!hKs}iI?h{ zh(G178wK?ZC6UmM!9C}X5qOdUqlX`BsZLJPy#M@>mM;9fj!PpGB3DNYRZ1vh9rZ#@ zNQS^wmsI(Bv-RDL)a}VaOUCw}unt3H&rid>jE}ks&pyzF= zFE1~R+PzJXnV@q^porBA7&|i}A z*`4B>>jfT$J_O517pAp6{PlNtRLOB(&ls2lte_DWuYm2%&CPPYcF?e0Jc@h*?zlY5+u32Of882%dVk9uvs`?Y0NE#8MIqv+#DadB~CDanix z#9BH!DVc*x?sUD*sYg-lm9N>WZmm->a^~ZsVjfo2=GD@L>A3{2XFl*!SW6(D#Q)jN ztn=So4DRlJM7mD4`Q;>kOTn_FmASi`U+oFUB^LsAKfZdH{{>|bXUH#|dZbmQKi9Oj zCZQ;z6Z0x#f_#jKjiwayUV+!`V)ay#ffi>1PU=Gw0kE|?*R7wNa6GD!p;1ouhRh9W z0`lyMRfNlt@@Ii6)(f#6wZ0qm4{;t zTHwWz4+b8!^jj-(GeP~a>E77xdd&S%KhWyeQE6!xu5fQA ziLDABNix3T$CH!HV4#tz=cQ?mzsW+?`>aO;q<$+5e#mNkH=7ESd=P@RZ8WWU5B!X! zT+6wdYd+JxK3;a+sncl9elB)oe6u2Tcq9~0C0T5$WLLbETUA<`dC?VcI9J&pgQt;0 zKu*5>sWuZf(m5VjNhhU2hEKYFaC0MZdbT2>hXKEG+qi}t_jTS{8*6x9+Vv-af{3|m zJO;d-Yxrpb+~ISa>m2tv)h?lwt{qpVkAcRW-IYx}!Q7Hb7u`M6w8rfY%#D~XmUZzR zPAlx(WA*x=hq(BMeeUM7srBsW$Ve}^*ru)+5LSFm=)W|K*oX%m&9syuOBx(?AgdI_ zcIx9XJlGe0vgoPbvIK5Lv}Y6t8Dp^8FMnq!^6{BY9K5Qd46|$Gw&%p`lLaLl5K8Rclqx zz{a!SZZKU!1_hYMs1SdL{M_SdETP&d-Yl5*NDmNUk2pot zO3RK-vz9dKEU3_C@Ty78Uw{JiQ+Ng~+*;pNv$1E+8l}dO2b?xNGmze>R_1#V{ktZ6 z&_OHD?kpCqH$KIp`HMg%^7P|(&p~}+$MX^zi7^L)x%}edF%jC`>*J)vL@r&`j+EuN!KO!~)H*n*s%*82%CQR$b3u@2LgCByyQ?|4^lUb}`PEs~emC~j%dsX&tlavE>)4WdG^ClHc3>G<$8V}YGh~4V4_PT_ zbXpVM>`q*Q0ZYKukmJQV6&;Mhu#u517qN`|V_+QJ#L2095y_k~Rwt^LpzYBPvwR9E`N&X8tB``%D;%@}HY*B?>{zs`_PQ!wd{{b-3Oo2gK;ikvA3 zXi7g=DnRf53i8=%5bpST<^(@0upEfX87#X{_-LM-nzQ~!vcnj{Z(Fs=%p1_z(T<|7 zVs~F1*MdM}C5mA{F#ls8*s;`cYO0k+xZ3pgC8VbO>)P!AySq=i=Ml8Jx_Ty#nzr@P zMI=^jT~W_x>5g`^#?-)CzRz-8lFhR(0%l}}+5I`@Qg%5lUp^101u?+@w?q{+t~5IJi2+~hAyP;|#VA*gq2Al`mhk){El+AH{tl9l;Kke%K_Y$t@I zllpwvrdWk?KMCX*#H@7HzfUQ@%Vi8)b>4e{t?-lAE-u7T&@Z&d;WgTUdH{>%`T05f zn=(O6qL?!LF0uJCZfI{SEQ`i~kxb?lr<3@+M(4w0)Io5Z z*X*1XrR4@SFfr%9UwoY^V{_ zO-@c0_rWk)gepxh#+HuOqY;&|1m zTXWT2z939FSCzc+!RTYX*D#BS^t{VzgL=LWvwfYV38}FN#~Z|{`H>6!y2L%~YI-nG zZezMsn_cb=5Q0lBwo&mHDE(-;=>U5KFu(R0H}_$7f}A)7J@YG>ygpOe#|Ju7E($-) zY=cf0oHeIxzlZp}X6AaetJZnImrpFDk~%Y!zF; z&Iezu9rEZyp!{AKt*!yr$0uuVolzL7Q#qC6XU1P|wGT5-5Nk0O+rWE40V5>eS3GTu z@Au#RmSLrfYgy^OpiL>;cgyQ-347ALMDWfwFTeJ$3Vm8YtupweektyLBq`n;ZywJT z`>>0n0&9A~^R>~uV(m?+I&Vt6F>!LRk$K^U2Pj?8>Gt^^(GXjWB&T7cc;Fu0CZPmh z`OE7CqLvmx>>2dVYP1JKJ-ye%%&_I|^x?-q1d0C6;9AZ^Ec4<=!2K^mZ)zb9hqaZ( zTJ+GB6)L%fW8=n!a%POwiETQAn*Js3L9JDQ3JPiKqv^l(twy15sT{unISmMtRbd_hqp_-_2 zVG>D$6c%z+c$A)Ev{hL=ff&Zql<6Qp2a$+z(tNWlmeEx+tLhKnPM5rvfQ8o9<&sbo z`}1)BCi2r=FRz(idI|YG@y99cvkv;OiILmE7P@t?b94dCC#UVS>!g_Goqw;cO&(31FEN8He zLwP;J<7a)n0E764+h@OhIl1eFyz7yV5QMtO8e2}cqD!$SYoVHsd*eC1Gz`(WepJ7KLrX1!uS>iUwM6-nY}D?&3jy3ph-6D(~!CE%Ync)OI#o+;wj5wyXf2CISAeyQD;?3 z=h;~W4^MoejWhcYeP9c9wVOILt9sF&Y&ezMcD2!V3JZe>A7ni@EorqkNI`@>PiunT zy7ko;Gv;PrsJw@(8cA0mNbzE?K3^Bu^_;Zr@*Z;j;`7Rkh6J#*znAv)iCkqO|DT}~ z)jabQ8QC&$JvFlZW-Y*FXSlMb&m9U(-hQ|2>?291YWt=?XW%UYnbGx^{iLGlC1;t*3#eJP4S zF+7S1*Tv0WCPbQS=$!^r`wdO(Wp4@!R(zsSF{lJwg2at`j5Fkpox#Af{iR+$Ck6&X ztl_gQi*S_*ZiY8}-39J35i`4&OUu?jn8yM%Y^|sy;y^?O^CFn|<{J*#t&_ysLSsB; zF<6ItyiL2bX$1_7!^%MjASzE3#SEs>;TA4*WCDBZYZSrKb#^IZQBK;*SaG|ZlTlXW zbgO4~Ckm9jW*p1-J*++!CaSOyXfkfrZ>1z>Sr=|Knip6X+Wh$pyvJbd?lEkNB1Jdj zI}BePlT&{LrdYCP2#VdVIcHSm%5kP-jYcmJzGYKqWMgDxY{`PVzSpZcFG9J&*%GZ@ zO3qcFHe(31RX!!eAA^W#USc6s$nqOO@advEkkp~3; z1Mgw3z)_b9m*_a~Y+I(cw|SVWqGC3P^vB{#iDhY>!H`o$JkJ-T^ayZqPvvyw@l}we zSOc}z`}e!*S#f)kOxmuWRuGXzraZUgOZ_i8DS*;`O9F9_{ffEFG{xCrMK zAqQHluDJG~!&gUzVk^!`X?qsjUf!cPBj+pp8Vi9~^H&C#hd#N>nP!NK18rvJz6+^z zk5R8A6dfxHnwX)t&B+MxZQUl8KFV}G>TyKh0uRO;$xo$>W>ls5Uil2`zVPX|zc+lz zY8-Ht94{W&NlKa`MgGy*y=bs=#Dbr&@BM6#V<^PpAPcH5|IMo%KTt8wdF7Ld8I!yV$h7J>FE4hnX$@ zHUC{i!=aE!`$J=c9C$JKjPY{bDku~du-yQ{dbY&UXixAes+Sm;Z>;^HwhCM=n=ee^ zvACUQp0|sWRg|L(N;dS9&_A-QKVPCd-^#s@pA>s|658<~;`!;(Lqm$*)zV%Fc{~>{ zm2P=)_p;q(H2`X5`-tqoxa+ zyIebNAC%?H6oUPg$3E~LX=Z<3P_z^^1ZvRqzNEdslOV=B9Z^Z091`*cy0uV>w{5RwH|`!MNZ3WJVcfWitFvvO>@=DFv!&T`Wfe z){*P(8krLv2DM&gI>ytYHz)H&iZ_+7Q+Tow*#oReeHmz6b-9a)cA@{$}Bp^OL@z(@Kep{Eu9zf}h z;HnO!FLIapSdui~v^|m3_!e=qzGy@+%6*AZ)Vt5uyMy06Iv-`%)PUV)B5DJxH1+=J z4Qmcu1fQStiBN>mW*p|&zc2mxQAa^e!2$+=ocp+pm1w;q2s{5h{W`H4|EOExnrC5M zl>RAqD$3)RvaK^m7;qSY`~v;*}5b!>xzonESjU|)xop?gksA8W=OhgpI^M;E{eO$OPV0;aSQs}YT zy`g41t0c|;a_<#|gTeh#6T=gy4klSsW_vu*2Lpnjfg>wF5!`-8aOl%>?5z|ad^BoX z1rN5)s)4PfEb3)%fG`g@(xX&}u6MxAVmnG#d{Gem@Nj*kwXLlfdR1!`!D{tgm8zFK zC3m#UI9LbQa+q7I<))HtPyY8|KK*b#0q;?idhqLCE2gf+rKJvccx3~z)UjK3eSODO zxrN~qH9IJW6zog?=FR3*B54rv?&09zv(fu*rDSLV(r{{LG%GfDGCL|Zc9!clK915G zh>#Yzd#hNh8xf`o@_pkHLm}b68&~1}{PLN^i)dVG(Iulk%w+ZG>Q~c0r5s+_$YoUH ziqoq>>%^K|Wy{Ud)6(?NV%sE}1gAnVFSWt2RtAl;H%t1u_msF*^zu;CV}_v*BHyoR zMN_Kn5hpHf$kiL9v9T5-g^bdt)55Z;8s_qvI;GIZ4j^>$xevVbuw`c+ATCoheYCz(|1)YNUkLmrW2tJ3j?j92GJ*lcUfU(n3@YTqCnev?VcWl>W6dcUbhup_fiO9^5 zCIMoELB8uIyMd=`92yr95foW;8^{8rtvjsg8HS19zH3lG*4w*#M;TdJ`P|GmiKm3~ zs_DKueu}w5m<0tDZoh1CnHo94 zQ1Nv#r_vxqgYI`lxzW&?IK$O47HeB;Nd$B&!26`_Q7HYdpYn|_)8k! z0cW9;rG|@b(#L)zh3191#HRN>72wV^X&WAY0FCIGvcHC(9IZ7RrXRYJ@ijj_z5)iE zCO~BR^#r_*XUtd9G;K7+T#qwjDd(^m9Mofi-WDXC{d_A`rQl$M%JV%!w!f}IZa7U^ z+j4)w$NhTy`(kL`)*8;&Gp_?LM)Sk8wY7sI(!Wn9e!S^n5)1A{@H!6CQKMCA-G|BlYTeL*0}uu3zJLv)0!3kiSWYDa4~hOhQgzO+Zdf zLQYG&UJx*!!rAQ&TR^ThVb50?vPKm9P0NF~G*%6yG%fz9JZ19SJ`JIi@V|tuFjoXQ zIK;b9Z*3aND=38NYfuyymveA(4vh~FkBo@Be_D?p?p%fV#M3d4bRnl9Af}q40)gBIoCN3RKIU+6v%eA7{FcK$ zs38MWY&_B$ihfgaCPRiw`|8MQ%LCki&d-eRKF^>MBUFThb8qO$aahFov$~+9aiT8Q zADz01Y5$;e$8^B^&d%H5xS4b@smL!SxI3ouDbe!7d)FVfX_a5x>ap&qvZ#RdkmgnIYN43P>ZT9Hbe z`xEcPP83DXWPm8GKdzs9Pt;AoWgG#)A;b8BQ&<{KVnh z5+L10Fa8+u@D~o|C?KIJGnVW<&8oNhQG&yRXJt%}WK!Oj2iws!j~AZvNjMY>u0!1# z+gA6>*K2-T%;M4ZnWO46Om~+*0HZ`xyOWAE5fS2EUyofe@HEoJt$%YSsr*(Zxdx5Ge; zFVxb)TAegJ@%?HCMKZBF3?42oxHr*1ybHj$9;?$Bc~}024dHCg868J64sLSJ<(L|H zwc@ordP`8Gg)XE#{M!V0bR-|0Dr#uUAw}PHzR14L`0S8>2aIj%yYEHHtq7&gzB`tf zVW}|a`(aDfej03U@C4IQA0;%%(^f4m{kawZr*v(PrzW!=OT(NW9%xuj11`szk^<|9 zlgurMjSRHIVq{nAtq*bMXNlw#1-M^8aAnooAO)U3+KjV4u?TzK&;Ge{^ zHvm0Z{JzxykDWZ#I#XtHkk5)g(a%(N%k`UHBf~kMD}RAbErDNbBJ>B%>ePFN7Nw^% z@8{K8yLY66cz?J}T3-ai@MuK8af#VQ@Dsm{AhSihZBgc{#((YZ4qm-uglQY>`TsB#%J9*~-CnkRD?&>N0B<9V~PGZFAE5QarWiUzv!8YVfz#K1i zKPaSJatHlt}Q?fMrCZ+BR(XX_dKrtif^|9egIiVUm%A;SJYnvd4&Re^T* zmSd$%wp;J-xr$VI3kwfPr^YR4A#xo&-X?@n?>ApqJZB!c>p?F#?HY5s2w}7^r%x$3 zf04D38q;}*v>)^Kx?DPSMPU+jo5alG<;n|3Ma=18UiX>z%*@tY{f$9iW)6MU`g}!Z z-Zy`Npxbug)skS)K2LnCRzBC(_X`vMv{Svytl=_qGlR;_)XU!P*{YEVQ6$b(8uJ}n zn7G{+KGhcmDD>Mo#Wjn-nlZD5|mZYSNWkFtgiLErrVSzm|7UssTh}!5Y`=o>f)AyfA zWll8WgiyqM;AiJGWN02J@aO^eTXbXmar%sT?VaoMn&52gYrl^YOQ-yNKbi~CT0SRq z(?2AV;`T&#e=t$ znn)v_2XQ7`i#=bPpP9dGe8t#VF$yNn+}uh^*j{_{2>+OUJNT{9c`2p^Dl@;!yt$1J zA{+0IQIb7!^L&yR^P&T#fm!sBs^RXs+;w)S_aHcKzG9L7ctQq{lqRJ2uXZhXFJr1e z*&*$N?uFxyCQav<1TAEGfH;nuc&=Znyep^N`YZ-W+DAmi#bh22pc4UQmT?`w2zt{=>58>JPzOKE8Z^nPG@=kifF=A6kcTOb8 zYFe#aTU=3si-r42PEz(i07U`ZH*{W`kia7i=&5M^bvtyzlQEG z4I0KUMdv@P;J>iWlarJtk`em{iWH{U7QgRvGUh)|#G446NI<*$oal+Qwy3Ov#gM;= zmZ&@7I}xhKa2Jv2si4!JcYeNEyf6prN>rRMn{fL37~0*}UFO*@EF?rZ32EO9aI{Hg zXOkP=z6~BEpgI{idmCeG`S1eqc1{u4rBsWG+tH$FsX84N@7?D9!6)j>4TGhP?kuG{ zP@RkqON{ZHGb(^B`O?q`X1U}3R@DDL){pEmi@f5mb-m23Gx*7j(I@{sn0&=**htIJ z@V)!_ud_`YNR*Bf36wR4$?!#ippcPKQlf7A(WiZ(WrqtDInF9WW$$2B=`&4wpueB{YkJr&Y87G$Gnn`!mAlBWq?Lj6~0xDQ>T^HXn!&j@G z-+eU(^Cu`00GyRg^#{cn;&Z!l7jw^YF)`0^825=U=ik#N2c1el?4hv+{1kZU_!M9| zS{|@^*Qa-VsfXVcq3s6z|7zqw5exEvh(!oX=-0oAMGO=6KU4TWKh%0vl}aS13jW>8 z|KJS1grDW#8-3e;U}VV2qt6q;Jb%SF)a?!w#AqDib{G|3T_;`f{$G^kfY)Pa#r&_% z<>MdyTIm>EdBJTy{B;2q{~825%|$kA>KI(3;G5f^?W11L_DWp<%C-InF9+Fp zyRf<2<1p*>1yFpTBjA8>%;YZ>RFLAxwe70IsQC;tr9w{xMI%n#-8TjqR}g+j=ox;r zLC~k=rJq>ESa)lRY+M$a`~GmCICkAG@cf$NW)c8>$v9-Wv<6%)WUt34TH$LcEWgZ? zLXe162ckV!`S?*zM?Fq3+U*6!jFHk)zvUf$a(ut%Vds@WYa7QY4eO3R+-+uLKNU+z}rYvkD)b zLb*jXd`tI(v-om2UlO6b-=vI1eZDnW3#obQ3A(J^!-)7#om`G1fk6Qq1h%VO?~eaq zM4mzpS%WV3N%vrbONvrBwdg9cErq6I#fgk474{;jayJEgbShWRn+lUUf+}WRRjGmz z#+9_IE~APjX2o)zc7$-dn$u#BH~!z__fstk;qhe(kE$=?X%5ko1|4-sjZ7Rc21yqt zve}$A7)deYDgKnO&T+Xm=o^S@`;=yc(aV5LPBi%NVF$*%;8x)OOX(aP*UanSTPaA6 z@<}6YQ_6D!n@Ox!M{F}}$+Oz~`-;vfRouOomyB}Vt7I*Xes^Jv14chq3b?W5 z1R%v&kuNQn{47yXT@;8ke<4fvybAROM56eEYbX39!?pF*52DQ>;BGHRa`NmRV4v10 zDFOc#Vd<*8_%?J0YxhS&_Nd6y2%d~zd@|_P78!!CYbPp_wl?pBhiz7=bOI?%31gK| zJruZBd7y-LhJAfp`pB&`6|UaS;-HD-o(@iRJf0!8hIV4hcLQ@Tje*8hYkuEX;4{&3j3iO@clI5;^eWQ}%n2+3Uk z%)D|Q%`5hFu93R)_lur%$L-{o6TC!~sqqE(N%4$aXH`KMsJH?dfToAO`X9d$_i{fd zE>O}qXU^XX7%y8Ez|99}8CbHWR3X@fjS(n&1*s*1%!Y`QS8ji^MD@|ynk0q#ee^^GyGhW*?!miFg*6XthtnsZ~_xm zEVKPZ{y`$`lexG=b0+vO^}2&rtMG~D;WHaUDI9+9%hwOlmSOj$%2J`+t0)(P>}r=l z=$wFYNOwt+Tg+O)W)g3GVg9`WI#_PChH0MUdyl16<#+&b>v*&I=aq@j3jt}7ik z>8z{jf_CpZt)odJY%EWi=be%JhtoHz-N+P@s?`5gQKf#Gql0_`0RN6_(8^vN%BcXB zca{dc5Bx@VPEJ9Xo>TPe!ZcINpL2F|cb@$RbdUjF^-+3wbqp-6`ZfT&X8?6jeIc=5sA>Wmn_n9 zSHstc99f9mM_1UhaAU%MuiQe_`&BYVhOGWwi5L8zm3aT9QZ>g-%yQ7L$F=<^PK{Ei zP3o}1ZL12U9$z1^&GD2_36IMZaP-BD*0sa}~z1Bv5({r8c|;wcY0nasv~~Sd4d_)~2Swx+a+= z72=v9mQ4C9!1?xF9O^iP$Bu`F<)fTQOotQI`R3~41r!at;}(`7|5&%!e)eaKdif}| z5wvcCCTA2_rii>u%>fxil5cPMLc63?=ULd<+^8^ouTbJgZ8AgKqsqq8(@l2Qh-tSF zN(@|B(xL-V?s?^Df~4xU&1BVwsl(4G8rFjR{8(Gww*V9a`6h1~h#WdO z33#U$@=WX??r8Zmw|b6x-pD5;h6V<_m%xW4s1|oh-jz?te-8bDl0AoFLIsNBB_BOI zkn*StL1V6~A&q-)@&6SIz*oqEya6RV8>8EF?C|aT)ni3Yg zI-%?hl{TPfjFw*9Z9lCB;&bADOQ^RS6ma8tFrzPQx;$n)1#PVT()5&RpIgj_sY!)k zrVX{Cst0~M?8SoG7<}dd^Xj`4B{0+DN#vhreI*dlA# zRo3HOXM2nr^P*QbVdzu6r%jf6OW(#NF3?0n2oe)hjYJhXT?}m1rhG)KVWNh9q}9ly z<)WRPok8{dj@_{Bg7F5I(Qz&Y%qs(JYi2&p%A$^Gq5UPwH*eT+k=~yZv*u3!LFB|<0se(O)yKAuK09CH(sm#JKWv@K^m1MZ53 z@4&orwAz#tsH|5;Gg5YxQdK(Iy!>iAsEzY1MXdhEHr(jRdWl~>q< zZ;3gU=w)8o??a^SuWCf@f0_o97Adzzs36#0EQuKDNmLN+!l<5S=ogFdhc$jW{rEU#)pp{jxVC<7u?RW$4Nc|dnxS@CAVKYCAV)@)Cn%8e@q;e|LlmR89F!T=*gN>`m=UwY zn*nZz+JXU<+0gxG*92+jI#rY3KN$dZ~I7aapWaRhcKdcG`~#oy|8}&0qOzb3s#slxOuchvC3|1}YhSU*{GdNDE zxn@6EXN4FmaAWHfI|*1|r7UIBLcJx+a{;d@R5wQ$=M=*N-ys?6Au^e3wA-P!F4&xS z2e4|dliQ2l=di%P1=p~Ga34xomA%YM6X_2bSlplP-#!Fb#4R2@^Wq!1a#xr7zZyI1 zxTxA~kJCy^NH@dK-7tbkBVB@oB0~#EhlBzGN{plk(%s#NbTrZ^tET#LHOUOJ0rWfHQPe_ocR0i#1qyg!8Lr`4QT*4^vJT%8b9#lmkCp^d*q> zd_ru>#?IxInbhy>NIQQ*C94K;Jj19<@opeBM=-^b-(mf{?0Iy?zYlbV=;-Lgm3>4n z6akq0USU|NN%Ox^c|$XI zZz9|!!ND+5>;7$Ti@PlRR1AS$GR5Ksx_TOH1fb<_r6yvTr_-61Hp{}ZdXqZ?0Uwy` zll}TwQ<-)t#tw9Gm1l7X=njxt+-t+<;!V!ti+;s>?|&8&(h1yMRFo}KH2M-6m4cgCI724dBhH=~l@ z3=E{tl#nQByb0W7=;DQd4~V{5wf`7trE zHN*Ygxzeqv8w~e0K;g+m>Bxc|0%oE#6uhD}yZ;BbNM0PKwajVGymE`@_F){h4jEMF z;BDC8Ugr#Y62vztJQ*Vp9>XfvV?Ic@R@n8J#r}zUz#ywK5{o*03i--mQ~)>xE&sIY z6GG+q=zg4OG_zp62uM8QtBdq3vrdP2~U}A;c{3oP?+1S zuw~JW>(9^kPntFB9ftcmQLPsVri8~oL3EP04m&^Q>4)n*p}J3>@)>%MFDc{ z*9X07U4Ft&I1($sI|_}LuP?a&yeS&*QR3vs1CMYTN++>lqrLtwn+Q0de$QHo^Q}~LEB`DWoitFsA4Uu{i zf&b(?DRvCK2!RN3CWGGjt|4Aj&l^xWa@W1y=L z3a~u&HgRjRhXd8`N`&p+Zsp%G)f@S6XT1 z_LQ6w*tNRNy79sHR6u^H@n3UGQUjIvTm|*zBho@a!INa=juV>&$ii^4m4Fqaw5gfi z=SF2&)Kapf2$~4yRg@ox_{5<_+uU@K41T~)ESewZF@|ONoovo)(-_#9^xv8pKGZie zZbv30W5z2=EW%bC0Ndc0kDxqn^}_ zu#igb8M>vY{JbX8-cuL9ZKGcS;|s@AJ!Zo{Q9m8y%F~-~53{5|1#q+ShKYCUoG2{d zm~1jfy~)O36{e<+^LNB+$X6aDh@5O^*ORWiRUbExmpJ!HCAvQU4Pns43P9}2l+!RV3Pc>t7ToQ#DiX$H( zdT76>ayblea}UVh>m;44BZfr|3`l@zK0oAaelp-x1|D|C-3;Sjnzk!RCyO78@9fOJ zkEeyz#JROxyZ6T1tfk2o;*k6E4QF#>GRNgE;vx#9u`&pb|CLxj9UIy>L1<1{9_>-# zV>(<*x?mdJ@WoU^6U}Q6O))la97-07shM~?A~g6xuhbVv!RkX?CqDKMj%9gSGM;O9 zm1C7QxZ9Reho#6L2IjWjX^}FNyJRT7K5DuBp{Ofi#r(7hXtv_gfL18~Spij;wSs)7 z)MJgBX5h0gt-AIHxQUV$nL^4kS^Amdni)wlcs~n4vYMKhznQU>U`{JE|32BfpW+XK zg{UudUOm#pC0e5ulS-H+>g zJ#P{c4v+Mc3_L?A1AOOc7r{aUV21)eeLJ`t+7KaIkZ~7q_1IeGv!hz~Cbj_Oz0L>k z)ZG5m^M2wbN6IeXIRBs|kED^jhsEG2(30*vzrR&NylQA*fNRC{j$O0iC!h=;Z!cM7 z5>N(q0p?(LZ?`|-mcdDOMlPPoT%-y_ztU|3%!30!^(XoSZRtE3YW+A;SX43xD4{J8 zVn9b?XjUNuS6~V8G~O1thfVS2A1#0;C}Q#ZS3O2*;bq^(=QFZX5`7A%y=G@5rw3BB z&LCQG=LD~6S68(GHE9nugVMp-13=#6XU-H&c1|pN9-H!w9Mv!)E~M@ zfx8tx1P}|`jJ?`7eU-9a+OA9^cCN4oVyDMcr-11orf;J`Tc7B)KhyP6c%e-|3}i-RdL``WQD()tI0AkVUjf8l1dgNi36q!Nbr^DdM3eRH!O&}FBf_xWS7WYOp;sP$S!^_bC;|Btau z_w!S{rk4`dZ*I^QG0yo_tgHqCIzO$9`%)L~yX9L#5BKQn7eji^0joA5kLVLm^a1{% z_c-CBML)~6w`XNq&{u%x%tU9@p1CzbKQ#h9wxEc(A6CrF7XNuItE1)Z7{%YL zUHPAmeMd$>@IiNAnKB0=02{=J8$r&x5&v^2GLeMv1Q*&OHQl}{cm0Zz%TL{6TmWHZ zZ^ZDS?k$qr>@*la2z0vKDY_0^%BD~Ggrcv#(dFOX=%Ml1%D;!wKBlyH`ZtpG)&1!$_rOAEfbc^YZb*UGB&}0iEDkOyxN?BPJ#~&VH^?D+0AuOV9(i7yni? z_EP;R8j1c((O3neCxO#Ov-$i@(HIHh|Bn^p4Pe3Imd4joqb!UBIoCvn10Ra?ukz6+f*swPRRUDfRCVvxtX$_! z!=>gF8h)i%adj{m;FdCr5Tv#4;$IJm`+p1=$C!I$@;iiBMUt)wZD>f_*C6s-%*d0|+PykyC;P6A8RgaQW-e#}8pZcp! zo^v}^7SKzXSk?eherx)|4@lG({ZDZnUW)*&Q$RH$>w28AH_VtX8$|W+;848b{3NjT zON*7mjFXv;I4+B85MbKl<-&73f$C{GTX~ei!s4m}$}cf~s;(dhz9#Ab{|dBUClwR` zJcXQs=ALDJeug%U3V1jLY>nzyFg1_#I1pg1?<=j$~M5_}skmz-dK4Coo&^V*SpMuYd@j z6+kyofJXlFB|=U~+0(^__dD4RYUx%%DCq<^c|)NJ?j=kUazHA47kTT-QF-TD70s5L z2TpZ^3EJJBHb9gMj;bTl$cPpO=@bkB^(TsH|kkj&m4&faQN76NuaYCEG=p z3+PZm5L2rMh5L0@{>^M$Sc7C}@Gl^g03;$7cG&TGhDuQRf@75Pou9g z(71|XjOVxceuDl9$kgj#Wvvz>icqRG94JewN{NVEGMb>a9avr-XM4qt@iqQ%@1eJ1 z3!k}}NLsC~XLtNpQ|K*#ocNt^VvOI~Yx4Fe2_9bgz0-7cud=LAspdbHSb`c?+Dcrn z1^-^_n7v-3@V2QYdL;%oSlHh*!ajdqa-GM8+;C7#18&A8Z9$^p@X%0?wq#qce2iN&6->fqq;-(fx#Z5dS+_6G#hW39=M`M&5wt1!+*OLP@ zrmmAoqVnan{}Ms^9~>=+S^+o(Ku^~BoJE{e*O#0#$ZkF0Z5PQ3_zT!%1nA97suEH| zf?{_4?|U$g`ph%dGV|8H3oZ4R0BX?^CiZKcl~_SR2~hZFA+I26YEO|f`PO_7TMkmi z&68b`gx-7G#?^`++lsw5N)`-+D&{SvLqbEX*Wfp;Bu-gbU}^qOaGVxAE^7#B>mSEG z5nAYG)YoRJR0FQ*?Qtaln>;+E6`O~=^5?JhZ)O_|j2}MwD2YVi<0(baF=G%*Q!S3x zZy$S1-*77i<{AmT9VBBn_58+Yedej18S$a0?*jOQQjYI7dOaBT(Bk}QDrUw+eX}|ie zkj$^m7nwbB;5pfy@31fVGqc{TvkgAQEh!0cdb);lg?dHyW+QoFG4McK+|qHsYWJ^k zz^EsnPY58>f@m<|n)>=!iz+n)3A@|?T;MogLqe_+36hN~on39u?ybfWW$2^Nfei9EvSJs7*(VMMuG-yVz+b_wc1zG$D1tp?MJUz)VI&+cVn0+~BO*xT`- zU4XF@*%4p#eI(*>Y~_;ksGv8(>A1r=G3~kMC}+KTqBE%BCFut6>tbP3vG!k9*gP?! z%;u_I^fP`2sdb4B=bTp$ba6(^I>Frj}xi*&a}>A(r{T5 zW*&@igW+TUX58c!fgph;{!UsfW$?Wm=C6y2Gn1de(P<*M`ILjAxM9eog#~9GiNwD% zwf_bFvT-&^8n({FIZrNVGz>}^r1zN45qy#W)iKedC#U0~p_xW^$ogt<{et&VDG`tk zl`5dInu3%R{2$jixQ6fnH10pI4U7`L91Hb>br)OSt^nWLzN&OPf@@i{1Yqr&ZWRPuO$Q)Rw~uHv5Gx1vh-VI^ITj~G8__JPy`bD$_jAQ5GA_3_QRUyY41Od zucuOt?ib@F&%VxF5$QdmiBm@W?CNlKjX+9Ux|l8wmI;yVubHZJE|yPp$R;CGM6@uN z{u(2zaT-qh+&xD^OvgmcP<8R_{c(OSxD(m45RxoAdf!z&&1yyn!g9-IR);JjmCIN^ zskb^EFy*267CHVDnK=@&cheO!z;^>Oa)4cgh5*2M`2o&uu5Oo#`u2k>^~ZoS+_Yof zz)Hi%O3_Ef*67}R{9d0*z|Uzf$aha11P27tl(UD042J~a1X~9KoB^m$9LURo!75YA zY}i44+_n(gd$uZ9+p-jPCp!D!n|~r2p)b9}w!Fno9pGdl%r&eOYORlfz2FKo!2N^G zC9=d!wXt8+5Wot`tY0exytpDCXpC58;-cBnjet#a?~E0J{~NBf7oiuA8xBl`Z2#!+ z2@pGhl@IsBH(!Il>84B=ky^e=ezCe3nR2{WH_Hdt4pqRq z8djyj5lcrO&Cxd)5fO1a>YKE4%R%?qEFakWY;^J+&zbvJTR_Jeq+>1n*n_OwfYG$Wm_aS_xowwnduyjI(N zU5nv};xa1k1>?U!xJ%OFnWs|>l|CL}TB;-FnkHgsh2zWd*sCapPs-&nO6CE*1fQ}T>D0$mN$!YlP8RJ16H_lHF3rk8CfZgF-59mUQd!LF#mFS&I zxUV<4%Xqv`Gj?t*DIZz5=N`={ZI4>es>!v(cPD9pM~scVjfdxG&`#sIDlDrYvN&8t z?%S#ES7vW~=|%0FY8)r*bM@o<`=&-kFGt!Dt0zMgFOLCxcJxkjehagkvgQkybj?&< zosEnZ--DPNX_XW*r~qkiBTd+>ps_;Ek4Yo1ub#pIA(fA!{Nkq@C&wdMZ4-&okXfyE zuIG(;57;Ebb1_d*1XK_nV9z~>w9E>iruLW^9O;j#oG3D&b470qEolU($vG^to+v&} z?mLO^&yUmdbMx~0HgU>>AhBdj`8A~dvjuU9%7`Chk2;G97^WTxL}HZ4+vCl#)8u5c zpX_5sDAA}gJkV|q{JQAXwgj}q|NKDKp%v-AP*D$i|Lo&=HIShE@S4&3wLZyza0g6? z!NOmDR|!+fFv%zdpDp$S{-k>22@WKD-clKMZ*%$f<;ms{uZh<>>kza5Qwz!U9RSW8 z{`HuT;?+B&N@)9F`A5f!E#)2yb+TO%6Y)|?1_vd(Tz$}qWypL#c`h59biJcwy_Rew zwGG`JzO(kpXj%pZuc16va7pHiz*;&v4)@)(Q0-gOF1ABK?W`wL0PpB|(PWZGmDd~T zjh8!?f$m?wbDaD9-ADulf9IBF;QEEmJJVJ-WD7)ILWx&d-;j-U5a23jr55Rci*@a(wSFo&t5 zre@+B#k770u^|rT@(p4JxiF{w39C+iY8b5qDD3S-Uf1?Ar`h@Bky(B%jT54zv%P`zrjyahJP+%4}fW4rJ` zNynOykdQc%k&!;ESCe&JZ)^QJM9(@E4SH}cvNmd*<|4{YqrAGGy)Er7)ogRLnY`K2 zk+oTbSKT=6`<_-lN{NvLHOg`mtl6NxWr6F!mJt61r*}1#_tqVrNO{&eD9d`UFQ|ns zxz0bI*s0~v>4X%)cMr=S>tN|ASpFqAEVrii9x#jd2z8asTt0j#Hrq=<{TN3i9}q*k zy1GKJ!l2d+Un`tyS5_Qs8f5I|;oZVf@2(Ur?Qp==Z0a52qqOuqD6&hn|k3uV0{-FZ#DdM%Zi9i%%3{?diqkm5(%9cXmASpH(QNKk5qZ zY2U*O@tv293V~^HTY9hNX~Vf?TekIt8j?y%xer=QDx|bRgQw7wjO3~pyH3Id>`MlU?Qmc-_31fM=dEK^;lRn&8 z_SJmUk++ekl2sX)0e64WaG!2ePt~>^TEJE1e2bv4r#sGU4(`kF2_AFmGL~1guMpes z$Z^b;5VG=^l&{H^k3vx+qTB)$xfbK4C5Aqr6gys)+@BpUK>L2dP5{?`9AtzmN(>GY zPt}6^8i!(br&N`yYB#DO+!gxoE>LN(EthZ<#i@w#zQp}3;_XWHElxrpNqP9-Zp!K< qIvU#Lr33r`__rD~oU4rm6YY{y-h0mFPy%=aO;u4-q3qt{p#K4M<>SWy literal 0 HcmV?d00001 diff --git a/各种归档/20261009_网页多图层与扩展画布/node-ready.log b/各种归档/20261009_网页多图层与扩展画布/node-ready.log new file mode 100644 index 0000000..3562f2f --- /dev/null +++ b/各种归档/20261009_网页多图层与扩展画布/node-ready.log @@ -0,0 +1,95 @@ +✔ derives automatic frame names from current animation name and position (1.2763ms) +✔ keeps custom frame names and restores automatic names when cleared (0.1825ms) +✔ builds non-repeating animation edit context names (0.181ms) +✔ selects saved animation preview frames by ordered durations (0.9958ms) +✔ loads every preview frame through revision-checked pagination (0.7561ms) +✔ validates configurable animation preview concurrency (1.9627ms) +✔ rejects mixed revisions instead of showing a partial animation (1.0326ms) +✔ validates frame duration only when explicitly called (1.176ms) +✔ moves selected frames as one ordered group (0.5676ms) +✔ protects an eight pixel ring around interactive drag controls (0.4859ms) +✔ reorders mixed library keys without mutating the source list (0.3325ms) +✔ restores drag eligibility after protected pointer cancellation and drag end (1.1104ms) +✔ animation workspace exposes two previews and the simplified control order (23.9095ms) +✔ normal and pixel modes expose independent ranges and presets (3.1862ms) +✔ pixel stamps are exact squares from 1x1 through 4x4 (0.4014ms) +✔ pixel stamps clip at every canvas edge (0.2968ms) +✔ normal circle geometry remains unchanged (0.1377ms) +✔ line interpolation includes endpoints without coordinate gaps (0.3125ms) +✔ older tools migrate while v3 restores the coordinate guide choice (0.3512ms) +✔ coordinate guide spacing adapts to the transformed logical pixel size (0.2046ms) +✔ coordinate guide ticks preserve logical values through zoom and pan (0.2702ms) +✔ pixel mode markup and grid stay accessible and non-interactive (14.9772ms) +✔ pixel undo history stores changed snapshots, caps entries, and clears (0.9471ms) +✔ canvas view clamps scale and keeps a visible section in the viewport (0.4943ms) +✔ zooming around an anchor preserves its logical position (0.2473ms) +✔ floating editor button stays inside its safe viewport bounds (0.1309ms) +✔ canvas editor markup, guarded input, and checkpoint events stay wired (4.5038ms) +✔ normalizes and converts hexadecimal colors (3.1945ms) +✔ converts RGB and HSV boundaries (0.699ms) +✔ round trips representative colors within 8-bit rounding (0.9168ms) +✔ recent colors deduplicate, normalize, and evict the oldest (0.4437ms) +✔ formats and projects looping playback without moving paused content (1.752ms) +✔ seek dispatcher keeps one request in flight and flushes the newest position (3.93ms) +✔ topbar current display dialog exposes static close and animation controls (8.6886ms) +✔ device workspace exposes the compact immediate pure-color test flow (12.5038ms) +✔ font catalog normalization, grouping, and search are stable (3.6219ms) +✔ font picker implements commit-only searchable combobox keyboard behavior (6.5188ms) +✔ settings places unrestricted FRP maintenance at the bottom (9.7463ms) +✔ FRP editor uses raw server storage and official validation errors (2.0804ms) +✔ network diagnostics renders layered evidence (4.4397ms) +✔ unavailable controls never masquerade as indefinite loading (9.4291ms) +✔ action controls do not bypass the shared state module (14.0548ms) +✔ HTTP requests time out with a stable user-facing error (10.9642ms) +✔ demo library actions stay black, explain restrictions, and preserve copy (1.7026ms) +✔ sortable cards protect controls and keep demo cards fixed (1.9263ms) +✔ media import workspace exposes streaming upload, crop controls, and queue polling (2.0486ms) +✔ free framing starts from the complete source and keeps one pixel visible (1.1908ms) +✔ free framing copy is stable and catalogued (0.1702ms) +✔ upload action has visible ordinary-build copy (0.3722ms) +✔ media naming happens after analysis and conflicts keep the draft (0.2871ms) +✔ awaiting-settings cards survive polling without hiding server transitions (0.2058ms) +✔ old scene migration rejects unknown fields and duplicate text without filtering (71.3308ms) +✔ PNG compression round trips sparse and full brush pixels without DOM (8.2936ms) +✔ blank and black are distinct; independent backgrounds follow layer order (5.6738ms) +✔ disabled background colors stay independent through storage and copy (21.0577ms) +✔ extended pixels survive storage but never enter the central output (9.418ms) +✔ move preview does not mutate source; confirmed clipping removes only outside ink (25.3666ms) +✔ text clipping follows anchor and scale and is retained after edit/reload/copy (9.4652ms) +✔ multiple text groups isolate edits, copies and IDs (0.5377ms) +✔ strict v2 storage protects unknown data and the final brush invariant (7.1636ms) +✔ creates a fixed 64x64 RGB scene (11.4014ms) +✔ serializes pixelRgb as base64 and round trips an independent scene (54.9539ms) +✔ moves a valid v1 draft to the stable key before removing exact legacy keys (45.076ms) +✔ keeps the v1 draft and all legacy keys when stable-key migration cannot write (20.6105ms) +✔ preserves and blocks a future stable draft instead of falling back or writing blank (8.6419ms) +✔ preserves and blocks a damaged stable draft (0.4874ms) +✔ does not discard a damaged higher-priority legacy key during fallback migration (3.3709ms) +✔ rejects damaged scene roots while skipping only damaged elements (8.7487ms) +✔ normalizes text fields and creates a centered lowercase ok element (0.4622ms) +✔ migrates the first valid canvas by v3, v2, legacy priority and merges text v1 (17.8965ms) +✔ supports independent add, update, and delete operations for multiple text elements (0.8215ms) +✔ duplicates with a deep copy, new id, 2px offset, and topmost order (0.502ms) +✔ alpha-composites full RGBA layers in array order without mutating inputs (2.4435ms) +✔ settings brightness explains an active temporary display-test override (12.3309ms) +✔ settings exposes full OTA upload progress and service recovery polling (6.7881ms) +✔ settings automatically opens and safely copies a detailed OTA failure log (4.2111ms) +✔ settings exposes a transactional performance-mode switch with the fixed warning (2.3383ms) +✔ settings exposes persisted animation preview concurrency below performance mode (2.3375ms) +✔ template edit baseline distinguishes clean, dirty, and unbound scenes (1.8657ms) +✔ template manager uses a monitor and unified four-row card actions (18.9569ms) +✔ animation editing backs up and restores template edit ownership (3.8261ms) +✔ special editor exposes the agreed modes and guarded editing flow (9.4519ms) +✔ latched WiFi draft state remains dirty until explicitly cleared (3.7375ms) +✔ WiFi settings expose independent network and prompt-delay controls (5.8772ms) +✔ workspace order resolves saved ids and appends new registrations (1.7218ms) +✔ workspace order movement is immutable and respects both boundaries (0.3358ms) +✔ drawer exposes one editable list and commits only from the save action (8.5284ms) +ℹ tests 87 +ℹ suites 0 +ℹ pass 87 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 866.8466 diff --git a/各种归档/20261009_网页多图层与扩展画布/text-drag-final.png b/各种归档/20261009_网页多图层与扩展画布/text-drag-final.png new file mode 100644 index 0000000000000000000000000000000000000000..62c86f34b3d38c59999906f60981f8a45b369a7b GIT binary patch literal 34022 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 JaP#5w{{Vr?X!igB literal 0 HcmV?d00001 diff --git a/各种归档/20261009_网页多图层与扩展画布/text-resize-final.png b/各种归档/20261009_网页多图层与扩展画布/text-resize-final.png new file mode 100644 index 0000000000000000000000000000000000000000..96eba155d3b18b9d817069b70656a273f62fa94e GIT binary patch literal 45955 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", - "elements": [ - { - "id": "", - "type": "text", - "text": "ok", - "font": "default", - "size": 12, - "x": 4, - "y": 24, - "align": "left", - "color": "#FFFFFF" - } + "version": 2, "width": 64, "height": 64, + "layers": [ + {"id": "layer-1", "name": "图层1", "type": "brush", "x": 0, "y": 0, + "background": null, "backgroundColor": "#000000", "pixelPng": ""}, + {"id": "layer-2", "name": "图层2", "type": "text", "x": 0, "y": 0, + "elements": [{"id": "text-1", "type": "text", "text": "ok", "font": "default", + "size": 12, "x": 32, "y": 26, "align": "center", "color": "#FFFFFF", "clip": null}]} ] } ``` -- `pixelRgb` 解码后必须正好是 `64 * 64 * 3` 字节 RGB888;`elements` 数组顺序就是从底到顶的绘制顺序。文字元素只持久化示例所列字段,不得保存 `background`、运行时 `revision`、渲染状态或图层缓存。 +- `layers` 从底到顶,ID唯一,至少一个画笔层;层偏移为−64..64整数。文字元素ID全场景唯一,坐标、大小沿用原范围。`clip` 为null或相对文字锚点、以字号为单位的 `[left, top, right, bottom]` 矩形;累计交集永久保留,随锚点和字号变换。图层和文字只保存已列字段。旧v1先严格校验,再把中央RGB写入一个画笔层,全部旧文字写入一个上方文字层,外围为空白。 +- 整层拖动松手、单段位置拖动松手、位置输入回车/失焦和每次步进均为一次提交;候选越界先确认,确认前不得写草稿、保存或应用。背景不计入越界;确认裁切和位置变化是一个撤销步骤,最多50步。 - 选中元素、渲染中/失败状态、透明 PNG 缓存、状态消息、设备状态、测试选择和错误不持久化。 - 稳定键不存在时,先读取并验证所有实际存在的旧键;任一旧键损坏或无法识别都必须保留全部原值并停止迁移,不能跳过高优先级损坏值后拿低优先级草稿覆盖。全部验证通过后,先迁移现有 `matrixController:scene:v1`;没有该键时再按 `matrixController:canvas:v3`、`matrixController:canvas:v2`、旧 `matrixCanvasRgb` 的优先顺序选择像素草稿,同时独立读取 `matrixController:text:v1` 并合并为文字元素。迁移保留能验证的旧像素、画笔/背景颜色、画笔粗细及文字属性,丢弃旧文字背景。 - 旧文字草稿迁移为一个稳定 `id` 的 `type:"text"` 元素;损坏文字元素单独跳过,不能连带清空有效像素或其他元素。缺少画笔粗细时回落为 `1`。 - 只有新内容已完整校验并成功写入稳定键后,才精确删除本次已迁移的旧键;写入失败时旧键和值必须保留。 - 稳定键内容损坏、出现未知更高版本或迁移失败时,页面保留原值和内存草稿、停止自动写回并明确提示用户;不得用空白场景覆盖,不得自动上传到核桃派。场景只保存在当前浏览器,不写入设备 `config.json`,不要求跨浏览器共享,也不保证核桃派重启后自动恢复实屏。 - 同一来源的其他标签页修改稳定场景键时不得直接替换当前内存草稿;冲突解决前当前标签页的后续编辑继续保留在内存但暂停写回 `localStorage`。用户选择“载入其他标签草稿”后采用最后收到的有效外部值,选择“保留当前草稿”后才显式覆盖共享键。 -- 画笔颜色、像素层背景颜色、画笔模式、两种模式各自的笔尖粗细、当前画笔工具和坐标系开关使用独立带版本号的本地 UI 状态;它们不是场景元素,也不改变 scene v1 的最终像素和元素契约。当前键为 `matrixController:canvas-tools:v3`:刷新后恢复模式、两套尺寸和坐标系选择;首次从 v2/v1 读取时保留已有工具值、把旧 `brushSize` 迁入普通模式,像素模式默认 `1x1` 且默认关闭,坐标系默认关闭,损坏或缺失值安全回落到默认值。 -- 每个新工作区显式选择 `none`、`local` 或 `server`;普通显示功能必须说明怎样接入 scene v1,不得把未来场景大对象无条件塞入服务端配置。 +- 画笔颜色、像素层背景颜色、画笔模式、两种模式各自的笔尖粗细、当前画笔工具和坐标系开关使用独立带版本号的本地 UI 状态;它们不是场景元素,扩展显示开关同样仅属于浏览器工具状态。当前键为 `matrixController:canvas-tools:v3`:刷新后恢复模式、两套尺寸和坐标系选择;首次从 v2/v1 读取时保留已有工具值、把旧 `brushSize` 迁入普通模式,像素模式默认 `1x1` 且默认关闭,坐标系默认关闭,损坏或缺失值安全回落到默认值。 +- 每个新工作区显式选择 `none`、`local` 或 `server`;普通显示功能必须说明怎样接入 scene v2,不得把未来场景大对象无条件塞入服务端配置。 核桃派模板(`CONFIG-TEMPLATES`)使用持久根下独立的 `templates/` 数据区: -- 每个模板 JSON 使用不可变 UUID 文件名,用户名称不参与路径拼接;落盘记录包含仅供存储层使用的 `schema_version: 1`,API 中的模板 ID、名称、创建/修改时间、场景摘要、内容和修订语义保持不变。 +- 每个模板 JSON 使用不可变 UUID 文件名,用户名称不参与路径拼接;落盘记录包含仅供存储层使用的 `schema_version: 2`,API 中的模板 ID、名称、创建/修改时间、场景摘要、内容和修订语义保持不变。 - 缺少版本的现有模板按 legacy v0 逐级迁移到唯一当前 schema。服务启动必须先迁移并校验全部模板记录,再执行任何缩略图协调或清理;任一模板损坏、含未知字段、版本过高或迁移失败时,所有原件保持不变并阻止服务启动。 - 缩略图文件名包含模板 UUID 和规范场景内容摘要。更新时先生成并验证新图,再提交模板 JSON,最后删除旧摘要图片;重命名不重复生成内容未变化的缩略图。 - 服务启动和每次模板变更后只在专用缩略图目录内按严格 UUID/摘要规则清理临时文件、孤立图片和过期图片;读取或迁移阶段存在任何不可读记录时不得开始清理,也不得扫描或删除配置、运行期最新帧、模板 JSON 或其他用户数据。 @@ -1244,3 +1258,14 @@ WebSocket 消息示例: - MDN Canvas API:https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API - Pillow ImageDraw:https://pillow.readthedocs.io/en/stable/reference/ImageDraw.html - systemd service:https://manpages.debian.org/bookworm/systemd/systemd.service.5.en.html + +### 图层追加接口(`WEB-LAYERS`) + +- `POST /api/templates/{id}/layers`:`{layer: <完整图层>}`,要求 `If-Match`,副本独立ID并置顶。 +- `POST /api/animations/{id}/frames/layers`:`{layer: <完整图层>, frame_ids: [<稳定帧ID>]}`,要求 `If-Match`;单帧、多选或全部帧共用此接口。全部新场景和缩略图成功后才一次提交索引;失败不改变任何原帧。时长及帧顺序不变。 +- 正在编辑的目标有修改时,先保存/放弃/取消;保存失败和冲突停止复制。演示目标只读。 +- `/api/preview/text-layer` 新增 `edit_size: 64|192`,默认64;192模式坐标为图像坐标(逻辑坐标加64)。输出仍64×64 RGB888,手机内容库与播放契约不变。 + +画笔层 `background` 为当前启用的颜色字符串或null(关闭);`backgroundColor` 保存该层在关闭状态下的颜色选择。此已登记可选字段缺省时读取为现有背景颜色或黑色,兼容早期scene v2;新网页保存时包含该值,切层、复制及重载不得借用其他图层颜色。关闭背景不绘制该颜色,擦除/清空/裁切不改变它。 + +迁移边界:旧导航只有 `text` 时,移除后使用当前默认导航顺序;其余非空顺序保持不变。旧浏览器草稿同样先严格检查字段、整数坐标及范围;未知字段、损坏或未来格式必须保留旧键并禁用覆盖保存,不能由旧宽松读取器丢弃字段后继续迁移。 diff --git a/核桃派软件源代码/FEATURE_UPDATED_AT b/核桃派软件源代码/FEATURE_UPDATED_AT index ee1c4eb..8c6ae66 100644 --- a/核桃派软件源代码/FEATURE_UPDATED_AT +++ b/核桃派软件源代码/FEATURE_UPDATED_AT @@ -1 +1 @@ -2026-10-09T10:26+08:00 +2026-10-09T16:12+08:00 diff --git a/核桃派软件源代码/README.md b/核桃派软件源代码/README.md index 81a55ca..6a97a4e 100644 --- a/核桃派软件源代码/README.md +++ b/核桃派软件源代码/README.md @@ -70,7 +70,7 @@ Unit ADC 仅使用物理脚 3/5 的 `/dev/i2c-1`(PI8/PI7),默认地址 `0x ## 数据安全 -配置 schema 为 v8,包含设备共享的 `workspace_order`,并在 v7→v8 时把 `media-import` 插入文字与动图工作区之间。媒体源文件和严格 schema v1 任务记录位于 `/var/lib/matrix-screen-controller/media-import/jobs`;成功或取消立即清理,失败及等待设置保留 24 小时。只有数据文件不存在时才能创建默认值;损坏、未知更高版本或迁移失败时保留原文件并拒绝启动。更新程序必须先克隆 `/var/lib/matrix-screen-controller`,在副本上完成登记迁移并验证后再原子切换,不得把设备凭据、主机密钥、旧设备配置或测试数据打进部署载荷。 +配置 schema 为 v11,包含设备共享的 `workspace_order`,v10→v11仅移除文字导航,其余顺序不变;旧文字入口跳转画图页。媒体源文件和严格 schema v1 任务记录位于 `/var/lib/matrix-screen-controller/media-import/jobs`;成功或取消立即清理,失败及等待设置保留 24 小时。只有数据文件不存在时才能创建默认值;损坏、未知更高版本或迁移失败时保留原文件并拒绝启动。更新程序必须先克隆 `/var/lib/matrix-screen-controller`,在副本上完成登记迁移并验证后再原子切换,不得把设备凭据、主机密钥、旧设备配置或测试数据打进部署载荷。 媒体转换依赖 Debian 的 `ffmpeg`、`ffprobe`、`heif-convert`(`libheif-examples`)以及带 `zscale`、`tonemap` 的 FFmpeg 构建。分析和转换由 `matrix-screen-converter@.service` 在 CPU0–1、150% CPU、384 MiB 内存、无交换区和私有网络限制下串行执行;主服务只负责流式上传、任务管理与结果展示。 @@ -185,3 +185,9 @@ python "核桃派软件源代码/scripts/export_release.py" ota --repair-current ``` 此入口校验原产物及记录、候选摘要、最终源码一致性和实机验收结果;完整归档原包与记录后,按原字节晋升候选包,不再构建、不推进 VERSION、不刷新功能时间。验证或提交失败保留原产物与记录。 + +## 多图层及扩展编辑 + +画图页清空按钮下管理画笔/文字层;至少保留一个画笔层。每个文字层可编辑多段文字。小圆球菜单切换192×192扩展区、移动当前层及视线模式;实际输出始终中央64×64。移动越界确认后永久裁切,可通过会话撤销恢复。 + +scene v2使用有序图层、±64偏移、192 RGBA压缩PNG和文字相对裁切矩形。模板schema v2、动图schema v3;迁移先校验旧摘要,在数据副本上生成新场景/缩略图后原子切换。损坏/未知/未来版本保留原件并拒绝启动。无需新板端依赖;PNG编解码复用Pillow,浏览器使用仓库内fflate(MIT)。RGB888及手机内容库/播放协议保持不变。 diff --git a/核桃派软件源代码/app/animations/store.py b/核桃派软件源代码/app/animations/store.py index 6bdcfaf..0143b5f 100644 --- a/核桃派软件源代码/app/animations/store.py +++ b/核桃派软件源代码/app/animations/store.py @@ -19,10 +19,10 @@ from app.persistence import atomic_write_bytes from app.templates.store import ( TemplateConflictError, TemplateError, TemplateNotFoundError, TemplateStorageFullError, TemplateValidationError, - render_scene_thumbnail, scene_digest, validate_scene, + render_scene_thumbnail, scene_digest, validate_scene, prepare_scene, ) -ANIMATION_SCHEMA_VERSION = 2 +ANIMATION_SCHEMA_VERSION = 3 NAME_LIMIT = 80 RECORD_FIELDS = frozenset({"id", "name", "created_at", "updated_at", "frames"}) FRAME_FIELDS = frozenset({ @@ -74,7 +74,7 @@ def _revision(record: dict[str, Any]) -> str: class AnimationStore: - """Schema-v2 animations: compact metadata plus one strict scene per frame.""" + """Schema-v3 animations: compact metadata plus one scene-v2 file per frame.""" def __init__(self, data_dir: Path, *, font_resolver: FontResolver | None = None, cleanup_playback: bool = True) -> None: @@ -131,7 +131,7 @@ class AnimationStore: def _write_at(self, record: dict[str, Any], directory_id: str) -> None: self._dir(directory_id).mkdir(parents=True, exist_ok=True) data = json.dumps( - {"schema_version": 2, **_persisted(record)}, + {"schema_version": 3, **_persisted(record)}, ensure_ascii=False, sort_keys=True, indent=2, ).encode("utf-8") + b"\n" try: @@ -210,22 +210,54 @@ class AnimationStore: "updated_at": str(document["updated_at"]), "frames": frames, } - def _migrate_v1(self, value: dict[str, Any], expected_id: str) -> dict[str, Any]: - record = self._v1_record(value, expected_id) - # The entire v1 document is validated before authoritative metadata changes. - for frame in record["frames"]: - self._write_scene(expected_id, frame) - self._write_thumbnail(expected_id, frame) - self._write(record) - return {"schema_version": 2, **_persisted(record)} + def _migrate_legacy(self, value: dict[str, Any], expected_id: str) -> dict[str, Any]: + if value["schema_version"] == 1: + record = self._v1_record(value, expected_id) + else: + # Validate all old paths, digests and metadata before creating candidates. + document = dict(value) + document.pop("schema_version") + if set(document) != RECORD_FIELDS or document.get("id") != expected_id: + raise TemplateValidationError("legacy animation fields are invalid") + frames, ids = [], set() + if not isinstance(document["frames"], list) or not document["created_at"] or not document["updated_at"]: + raise TemplateValidationError("legacy animation metadata is invalid") + _name(document["name"]) + for raw in document["frames"]: + if not isinstance(raw, dict) or set(raw) != FRAME_FIELDS: + raise TemplateValidationError("legacy frame fields are invalid") + ident = _uuid(raw["id"], "animation frame not found") + if ident in ids or raw["scene_file"] != f"{ident}-{raw['digest']}.json" or raw["thumbnail"] != f"{ident}-{raw['digest']}.png": + raise TemplateValidationError("legacy frame paths or ids are invalid") + ids.add(ident); _duration(raw["duration_ms"]); _name(raw["name"], optional=True) + frames.append(dict(raw, scene=self._load_scene(expected_id, raw))) + record = {**document, "frames": frames} + created = [] + try: + for frame in record["frames"]: + frame["scene"] = prepare_scene(frame["scene"]) + frame["digest"] = scene_digest(frame["scene"]) + frame["scene_file"] = f"{frame['id']}-{frame['digest']}.json" + frame["thumbnail"] = f"{frame['id']}-{frame['digest']}.png" + for path in (self._scene_dir(expected_id)/frame["scene_file"], self._thumb_dir(expected_id)/frame["thumbnail"]): + if not path.exists(): created.append(path) + self._write_scene(expected_id, frame) + self._write_thumbnail(expected_id, frame) + self._write(record) + except Exception: + for path in created: path.unlink(missing_ok=True) + raise + return {"schema_version": 3, **_persisted(record)} def _validate_record(self, value: Any, expected_id: str) -> dict[str, Any]: if not isinstance(value, dict): raise TemplateValidationError("animation record must be an object") - if value.get("schema_version") == 1: - value = self._migrate_v1(value, expected_id) + if type(value.get("schema_version")) is not int: + raise TemplateValidationError("animation schema_version must be an integer") + if value.get("schema_version") in (1, 2): + value = self._migrate_legacy(value, expected_id) document = dict(value) - if document.pop("schema_version", None) != 2: + if document.pop("schema_version", None) != 3: raise TemplateValidationError("animation schema_version is unsupported") if set(document) != RECORD_FIELDS or document.get("id") != expected_id: raise TemplateValidationError("animation fields do not match the current schema") @@ -252,7 +284,8 @@ class AnimationStore: "updated_at": str(raw.get("updated_at") or ""), "digest": digest, "thumbnail": thumbnail, "scene_file": scene_file, } - self._load_scene(expected_id, frame) + if self._load_scene(expected_id, frame)["version"] != 2: + raise TemplateValidationError("animation schema v3 requires scene v2") if not (self._thumb_dir(expected_id) / thumbnail).is_file(): self._write_thumbnail(expected_id, frame) frames.append(frame) @@ -435,7 +468,7 @@ class AnimationStore: def _new_frame(self, source: dict[str, Any], now: str) -> dict[str, Any]: frame_id = str(uuid4()) - scene = validate_scene(source.get("scene"), strict_schema=True) + scene = prepare_scene(source.get("scene")) digest = scene_digest(scene) return { "id": frame_id, "name": _name(source.get("name"), optional=True), @@ -499,7 +532,7 @@ class AnimationStore: def add_frame(self, animation_id: Any, scene: Any, expected: str, *, name: Any = None, duration_ms: Any = DEFAULT_DURATION_MS) -> dict[str, Any]: source = { - "scene": validate_scene(scene), "name": _name(name, optional=True), + "scene": prepare_scene(scene), "name": _name(name, optional=True), "duration_ms": _duration(duration_ms), } with self._lock: @@ -549,7 +582,8 @@ class AnimationStore: frame = self._frame(record, frame_id); now = self._now() old_thumb, old_scene = frame["thumbnail"], frame["scene_file"] if scene is not None: - checked, digest = validate_scene(scene), scene_digest(validate_scene(scene)) + checked = prepare_scene(scene) + digest = scene_digest(checked) frame.update({ "scene": checked, "digest": digest, "thumbnail": f"{frame['id']}-{digest}.png", @@ -614,6 +648,37 @@ class AnimationStore: def set_all_durations(self, animation_id: Any, duration_ms: Any, expected: str) -> dict[str, Any]: return self.set_durations(animation_id, duration_ms, expected) + def append_layer(self, animation_id: Any, layer: Any, frame_ids: Any, expected: str) -> dict[str, Any]: + from app.scene_layers import copy_layer, validate_layer + from app.templates.store import _validate_scene_v1 + try: + checked = validate_layer(layer, _validate_scene_v1) + except (ValueError, TypeError, KeyError) as exc: + raise TemplateValidationError(str(exc)) from exc + with self._lock: + record = self._read(animation_id); self._match(record, expected) + targets = self._frames(record, frame_ids) + created, now = [], self._now() + try: + for frame in targets: + scene = prepare_scene(self._load_scene(record["id"], frame)) + scene["layers"].append(copy_layer(checked, scene["layers"])) + digest = scene_digest(scene) + frame.update(scene=scene, digest=digest, updated_at=now, + scene_file=f"{frame['id']}-{digest}.json", + thumbnail=f"{frame['id']}-{digest}.png") + for path in (self._scene_dir(record["id"])/frame["scene_file"], self._thumb_dir(record["id"])/frame["thumbnail"]): + if not path.exists(): created.append(path) + self._write_scene(record["id"], frame) + self._write_thumbnail(record["id"], frame) + record["updated_at"] = now + self._write(record) + except Exception: + for path in created: path.unlink(missing_ok=True) + raise + self._cleanup_orphans(record) + return self._detail(record) + def copy_frames(self, source_animation_id: Any, frame_ids: Any, source_expected: str, destination_animation_id: Any, destination_expected: str, insert_after_frame_id: Any = None) -> dict[str, Any]: diff --git a/核桃派软件源代码/app/config/store.py b/核桃派软件源代码/app/config/store.py index 0019fc8..e343c17 100644 --- a/核桃派软件源代码/app/config/store.py +++ b/核桃派软件源代码/app/config/store.py @@ -35,7 +35,6 @@ DEFAULT_WORKSPACE_ORDER = [ "device", "settings", "canvas", - "text", "media-import", "animations", "templates", @@ -66,7 +65,7 @@ DEFAULT_CONFIG: dict[str, Any] = { "animation_preview_max_concurrent": DEFAULT_ANIMATION_PREVIEW_MAX_CONCURRENT, } -CONFIG_SCHEMA_VERSION = 10 +CONFIG_SCHEMA_VERSION = 11 CONFIG_V1_FIELDS = frozenset({ "orientation", "brightness", @@ -455,6 +454,12 @@ def _migrate_config_v9_to_v10(document: dict[str, Any]) -> dict[str, Any]: } +def _migrate_config_v10_to_v11(document: dict[str, Any]) -> dict[str, Any]: + checked = validate_config(document) + checked["workspace_order"] = [item for item in checked["workspace_order"] if item != "text"] or list(DEFAULT_WORKSPACE_ORDER) + return checked + + CONFIG_MIGRATIONS = { 0: _migrate_config_v0_to_v1, 1: _migrate_config_v1_to_v2, @@ -466,6 +471,7 @@ CONFIG_MIGRATIONS = { 7: _migrate_config_v7_to_v8, 8: _migrate_config_v8_to_v9, 9: _migrate_config_v9_to_v10, + 10: _migrate_config_v10_to_v11, } diff --git a/核桃派软件源代码/app/main.py b/核桃派软件源代码/app/main.py index ba5efe4..e3a4009 100644 --- a/核桃派软件源代码/app/main.py +++ b/核桃派软件源代码/app/main.py @@ -249,6 +249,15 @@ class PaletteColorRequest(BaseModel): color: str +class LayerAppendRequest(BaseModel): + model_config = ConfigDict(extra="forbid") + layer: dict[str, Any] + + +class FrameLayerAppendRequest(LayerAppendRequest): + frame_ids: list[str] = Field(min_length=1) + + class TemplateCreateRequest(BaseModel): name: str scene: dict[str, Any] @@ -353,6 +362,7 @@ class TextRequest(BaseModel): class TextLayerRequest(BaseModel): + edit_size: Literal[64, 192] = 64 text: str = Field(min_length=0, max_length=512) font: str = "default" size: int = 12 @@ -1337,6 +1347,23 @@ def create_app( except TemplateError as exc: raise template_error(exc) from exc + @app.post("/api/templates/{template_id}/layers") + def append_template_layer(template_id: str, request: LayerAppendRequest, if_match: str | None = Header(default=None, alias="If-Match")) -> dict: + try: + if template_id == DEMO_STATIC_ID: + raise TemplateConflictError(DEMO_RESTRICTED_MESSAGE) + return templates.append_layer(template_id, request.layer, normalize_if_match(if_match)) + except TemplateError as exc: + raise template_error(exc) from exc + + @app.post("/api/animations/{animation_id}/frames/layers") + def append_animation_layer(animation_id: str, request: FrameLayerAppendRequest, if_match: str | None = Header(default=None, alias="If-Match")) -> dict: + try: + reject_demo_animation(animation_id) + return animations.append_layer(animation_id, request.layer, request.frame_ids, normalize_if_match(if_match)) + except TemplateError as exc: + raise template_error(exc) from exc + @app.put("/api/templates/{template_id}") def update_template( template_id: str, @@ -1344,7 +1371,8 @@ def create_app( if_match: str | None = Header(default=None, alias="If-Match"), ) -> dict: try: - reject_demo_template(template_id) + if template_id == DEMO_STATIC_ID: + raise TemplateConflictError(DEMO_RESTRICTED_MESSAGE) return templates.update_scene(template_id, request.scene, normalize_if_match(if_match)) except TemplateError as exc: raise template_error(exc) from exc @@ -1356,7 +1384,8 @@ def create_app( if_match: str | None = Header(default=None, alias="If-Match"), ) -> dict: try: - reject_demo_template(template_id) + if template_id == DEMO_STATIC_ID: + raise TemplateConflictError(DEMO_RESTRICTED_MESSAGE) return templates.rename(template_id, request.name, normalize_if_match(if_match)) except TemplateError as exc: raise template_error(exc) from exc @@ -1408,7 +1437,8 @@ def create_app( if_match: str | None = Header(default=None, alias="If-Match"), ) -> dict: try: - reject_demo_template(template_id) + if template_id == DEMO_STATIC_ID: + raise TemplateConflictError(DEMO_RESTRICTED_MESSAGE) expected = normalize_if_match(if_match) current = templates.get(template_id) if current["revision"] != expected: @@ -1909,7 +1939,7 @@ def create_app( try: image = render_text_layer( text_layer_options_from_request(request), - size=(display.width, display.height), + size=(request.edit_size, request.edit_size), font_resolver=fonts.resolve, ) return image_png_response(image) diff --git a/核桃派软件源代码/app/scene_layers.py b/核桃派软件源代码/app/scene_layers.py new file mode 100644 index 0000000..8518d46 --- /dev/null +++ b/核桃派软件源代码/app/scene_layers.py @@ -0,0 +1,168 @@ +"""Scene-v2 validation, legacy upgrade and logical composition. No driver I/O.""" +from __future__ import annotations +import base64 +import binascii +import copy +import math +from io import BytesIO +from uuid import uuid4 +from PIL import Image +from app.display.text_renderer import TextOptions, render_text_layer +from app.display.colors import parse_color + +SIDE = 192 +ORIGIN = 64 + + +def decode_pixels(value): + if not isinstance(value, str) or len(value) > 300000: + raise ValueError("brush PNG must be bounded base64") + try: + data = base64.b64decode(value, validate=True) + if (data[:8] != b"\x89PNG\r\n\x1a\n" or data[8:16] != b"\x00\x00\x00\rIHDR" + or data[24:29] != b"\x08\x06\x00\x00\x00"): + raise ValueError("brush PNG must be noninterlaced RGBA8") + with Image.open(BytesIO(data)) as image: + image.verify() + with Image.open(BytesIO(data)) as image: + if image.format != "PNG" or image.size != (SIDE, SIDE) or image.mode != "RGBA": + raise ValueError("brush PNG must be 192x192 RGBA") + image.load() + return image.copy() + except (OSError, binascii.Error) as exc: + raise ValueError("invalid brush PNG") from exc + + +def encode_pixels(image): + out = BytesIO() + image.save(out, format="PNG", compress_level=6) + return base64.b64encode(out.getvalue()).decode("ascii") + + +def upgrade_scene(scene): + if scene["version"] == 2: + return copy.deepcopy(scene) + pixels = Image.frombytes("RGB", (64, 64), base64.b64decode(scene["pixelRgb"])).convert("RGBA") + canvas = Image.new("RGBA", (SIDE, SIDE)) + canvas.paste(pixels, (ORIGIN, ORIGIN)) + layers = [dict(id="layer-1", name="图层1", type="brush", x=0, y=0, + background=None, pixelPng=encode_pixels(canvas))] + if scene["elements"]: + layers.append(dict(id="layer-2", name="图层2", type="text", x=0, y=0, + elements=[dict(element, clip=None) for element in scene["elements"]])) + return dict(version=2, width=64, height=64, layers=layers) + + +def validate_v2(value, validate_legacy): + if set(value) != {"version", "width", "height", "layers"} or any(type(value[k]) is not int for k in ("version", "width", "height")) or (value["version"], value["width"], value["height"]) != (2, 64, 64): + raise ValueError("scene v2 fields or dimensions are invalid") + if not isinstance(value["layers"], list) or not value["layers"]: + raise ValueError("scene must contain a brush layer") + ids, element_ids, layers = set(), set(), [] + for layer in value["layers"]: + layers.append(validate_layer(layer, validate_legacy, ids, element_ids)) + if not any(layer["type"] == "brush" for layer in layers): + raise ValueError("scene must retain at least one brush layer") + return dict(version=2, width=64, height=64, layers=layers) + + +def validate_layer(layer, validate_legacy, ids=None, element_ids=None): + ids = ids if ids is not None else set() + element_ids = element_ids if element_ids is not None else set() + if not isinstance(layer, dict) or layer.get("type") not in {"brush", "text"}: + raise ValueError("unsupported layer type") + fields = {"id", "name", "type", "x", "y"} | ({"background", "pixelPng"} if layer["type"] == "brush" else {"elements"}) + if layer["type"] == "brush" and "backgroundColor" in layer: + fields.add("backgroundColor") + if set(layer) != fields: + raise ValueError("layer fields do not match schema") + ident = layer["id"] + if not isinstance(ident, str) or not ident.strip() or len(ident) > 128 or ident in ids: + raise ValueError("layer ids must be unique nonempty strings") + ids.add(ident) + if not isinstance(layer["name"], str) or not layer["name"].strip() or len(layer["name"]) > 80: + raise ValueError("layer name must contain 1..80 characters") + if any(type(layer[k]) is not int or not -64 <= layer[k] <= 64 for k in ("x", "y")): + raise ValueError("layer offset must be an integer in -64..64") + result = copy.deepcopy(layer) + if layer["type"] == "brush": + decode_pixels(layer["pixelPng"]) + if "backgroundColor" in layer: + color = layer["backgroundColor"] + if not isinstance(color, str) or len(color) != 7 or not color.startswith("#"): + raise ValueError("backgroundColor must be #RRGGBB") + parse_color(color) + if layer["background"] is not None: + if not isinstance(layer["background"], str) or len(layer["background"]) != 7 or not layer["background"].startswith("#"): + raise ValueError("background must be #RRGGBB or null") + parse_color(layer["background"]) + else: + if not isinstance(layer["elements"], list): + raise ValueError("text elements must be an array") + checked = [] + for element in layer["elements"]: + if not isinstance(element, dict) or "clip" not in element: + raise ValueError("text clip is required") + raw = {k: v for k, v in element.items() if k != "clip"} + legacy = dict(version=1, width=64, height=64, pixelRgb=base64.b64encode(bytes(12288)).decode("ascii"), elements=[raw]) + text = validate_legacy(legacy, strict_schema=True)["elements"][0] + if text["id"] in element_ids: + raise ValueError("text ids must be globally unique") + element_ids.add(text["id"]) + clip = element["clip"] + if clip is not None and (not isinstance(clip, list) or len(clip) != 4 or any(type(n) not in (int, float) or not math.isfinite(n) or abs(n) > 4096 for n in clip) or clip[2] < clip[0] or clip[3] < clip[1]): + raise ValueError("text clip must be a finite rectangle or null") + checked.append(dict(text, clip=clip)) + result["elements"] = checked + return result + + +def copy_layer(layer, existing): + result = copy.deepcopy(layer) + result["id"] = str(uuid4()) + sequence = 1 + names = {item["name"] for item in existing} + while f"图层{sequence}" in names: + sequence += 1 + result["name"] = f"图层{sequence}" + for element in result.get("elements", []): + element["id"] = str(uuid4()) + return result + + +def render_element(element, font_resolver=None): + options = TextOptions(**{k: element[k] for k in ("text", "font", "size", "align")}, + x=element["x"] + ORIGIN, y=element["y"] + ORIGIN, + color=parse_color(element["color"])) + image = render_text_layer(options, size=(SIDE, SIDE), font_resolver=font_resolver) + if element.get("clip") is not None: + # Rectangle is relative to the text anchor, in units of its font size. + left, top, right, bottom = element["clip"] + pixels = image.load() + for y in range(SIDE): + for x in range(SIDE): + u=(x-ORIGIN-element["x"])/element["size"] + v=(y-ORIGIN-element["y"])/element["size"] + if not left <= u < right or not top <= v < bottom: + pixels[x,y]=(0,0,0,0) + return image + + +def render_v2(scene, font_resolver=None): + image = Image.new("RGBA", (SIDE, SIDE), (0, 0, 0, 255)) + def paint(source, layer): + nonlocal image + shifted = Image.new("RGBA", (SIDE, SIDE)) + shifted.paste(source, (layer["x"], layer["y"])) + image = Image.alpha_composite(image, shifted) + + for layer in scene["layers"]: + if layer["type"] == "brush": + if layer["background"]: + paint(Image.new("RGBA", (SIDE, SIDE), parse_color(layer["background"]) + (255,)), layer) + paint(decode_pixels(layer["pixelPng"]), layer) + else: + # Match browser source-over rounding after every text element. + for element in layer["elements"]: + paint(render_element(element, font_resolver), layer) + return image.crop((ORIGIN, ORIGIN, ORIGIN+64, ORIGIN+64)).convert("RGB") diff --git a/核桃派软件源代码/app/static/app.js b/核桃派软件源代码/app/static/app.js index a150042..b26f767 100644 --- a/核桃派软件源代码/app/static/app.js +++ b/核桃派软件源代码/app/static/app.js @@ -12,6 +12,7 @@ import "./color-picker.js"; import "./views/canvas.js"; import { refreshStatus } from "./views/device.js"; import "./views/text.js"; +import "./views/layers.js"; import "./views/media-import.js"; import "./views/animations.js"; import "./views/templates.js"; @@ -377,3 +378,6 @@ document.addEventListener("visibilitychange", () => { if (document.visibilityState === "visible") pollStatus(); }); pollStatus(); + +if(window.location.hash==="#text")window.location.hash="#canvas"; +window.addEventListener("hashchange",()=>{if(window.location.hash==="#text")window.location.hash="#canvas";}); diff --git a/核桃派软件源代码/app/static/canvas-tools-model.js b/核桃派软件源代码/app/static/canvas-tools-model.js index dbb64af..8e3e996 100644 --- a/核桃派软件源代码/app/static/canvas-tools-model.js +++ b/核桃派软件源代码/app/static/canvas-tools-model.js @@ -62,13 +62,15 @@ export function coordinateGuideTicks({ visibleStart = Number.NEGATIVE_INFINITY, visibleEnd = Number.POSITIVE_INFINITY, step, + count = 64, + origin = 0, }) { const start = Number(boardStart) || 0; const size = Math.max(0, Number(boardSize) || 0); const interval = COORDINATE_GUIDE_STEPS.includes(step) ? step : COORDINATE_GUIDE_STEPS[0]; const ticks = []; - for (let value = 0; value < 64; value += interval) { - const position = start + (value / 64) * size; + for (let value = origin; value < origin + count; value += interval) { + const position = start + ((value-origin) / count) * size; if (position >= visibleStart && position <= visibleEnd) ticks.push({ value, position }); } return ticks; diff --git a/核桃派软件源代码/app/static/index.html b/核桃派软件源代码/app/static/index.html index a06f783..66ba440 100644 --- a/核桃派软件源代码/app/static/index.html +++ b/核桃派软件源代码/app/static/index.html @@ -103,6 +103,7 @@

@@ -120,6 +121,16 @@
+
-
画笔颜色 +
画笔颜色
-
背景颜色 +
背景颜色
@@ -252,20 +264,8 @@
- -

画布默认不会直接落笔。选好颜色和工具后,点击“开始编辑”进入全屏画布。

-
- - -