From 6eabd3f0cbf27d0bf998aa4b5284a3fe14049969 Mon Sep 17 00:00:00 2001 From: Kokomi <102026640+yoimiya-kokomi@users.noreply.github.com> Date: Wed, 30 Nov 2022 04:55:50 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=92=E8=89=B2=E7=AB=8B=E7=BB=98=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E9=9A=8F=E6=9C=BA=EF=BC=8C=E7=94=A8=E4=BA=8E=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF=E5=9C=BA=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- CHANGELOG.md | 317 +++++++++--------- apps/character/ProfileArtis.js | 2 +- apps/character/ProfileDetail.js | 1 - apps/profile/ProfileChange.js | 2 +- models/Character.js | 23 +- models/character-lib/CharImg.js | 54 +-- models/profile-lib/CharArtis.js | 2 +- resources/character/profile-detail.html | 2 +- resources/help/version-info.css | 4 +- resources/help/version-info.less | 4 +- .../profile/normal-character/荧/普通.webp | Bin 0 -> 166510 bytes .../normal-character/荧/深渊公主.png | Bin 0 -> 833287 bytes .../randomMode-character/刻晴/95063921.webp | Bin 748354 -> 0 bytes .../randomMode-character/刻晴/99614785.webp | Bin 206194 -> 0 bytes .../randomMode-character/刻晴/刻晴.webp | Bin 487698 -> 0 bytes 16 files changed, 214 insertions(+), 200 deletions(-) create mode 100644 resources/profile/normal-character/荧/普通.webp create mode 100644 resources/profile/normal-character/荧/深渊公主.png delete mode 100644 resources/profile/randomMode-character/刻晴/95063921.webp delete mode 100644 resources/profile/randomMode-character/刻晴/99614785.webp delete mode 100644 resources/profile/randomMode-character/刻晴/刻晴.webp diff --git a/.gitignore b/.gitignore index d82a8e95..dd11ec53 100755 --- a/.gitignore +++ b/.gitignore @@ -16,5 +16,4 @@ /config/help.js /config/cfg.js /resources/profile/super-character/* -/resources/profile/normal-character/* -!/resources/profile/super-character/达达利亚.webp \ No newline at end of file +/resources/profile/normal-character/* \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 103e2206..24369abe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,59 +1,58 @@ -# 2.1.3 +# 2.1.4 + +* 角色立绘支持随机,用于面板场景 + * 图像支持webp及png格式 + * 普通立绘:**resources/profile/normal-character/** + * 彩蛋立绘(满命/ACE/三皇冠):**resources/profile/super-character/** + * 单张立绘请放置在普通&彩蛋目录下,以**角色全名**为**文件名**,例如**刻晴.webp** + * 如需多张随机,请在普通&彩蛋目录下,以**角色全名**为**目录**名,任意文件名为文件名,例如 **刻晴/1.png** + +# 2.1.1~2.1.3 * 增加面板替换功能,可通过命令更换面板的圣遗物、武器、天赋命座等,用于伤害计算 - * `#雷神面板换稻光换90级满命` / `#刻晴面板换雷神圣遗物` 等命令 - * 更多命令参见 `#面板帮助`,请根据需求吟唱。后续会提供更细致的咒语详解 -* 角色立绘支持随机,用于面板、图鉴等场景 - * 立绘可放置在 **resources/profile/randomMode-character/角色名/** 目录下,webp格式 - * 若目录获取到图片则不会使用普通立绘和彩蛋立绘 -# 2.1.1~2.1.2 - -* 角色普通立绘支持自定义,用于面板、图鉴等场景 - * 立绘可放置在 **resources/profile/normal-character/** 目录下,webp格式 - * 由于缓存,新增的角色图需要重启bot生效(已有图像替换无需重启) + * `#雷神面板换稻光换90级满命` / `#刻晴面板换雷神圣遗物` 等命令 + * 更多命令参见 `#面板帮助`,请根据需求吟唱。后续会提供更细致的咒语详解 * 去除插件内自带的V2/V3兼容逻辑,使用runtime进行V2/V3兼容,如使用遇到问题请升级至最新版Yunzai - * V3-Yunzai:官方Yunzai最新版本 - * V2-Yunzai:喵版V2-Yunzai,2.2.3版本。其余分值维护的V2-Yunzai可合并2.2.3版本 - * 较低版本的Yunzai可能无法正常使用miao-plugin + * V3-Yunzai:官方Yunzai最新版本 + * V2-Yunzai:喵版V2-Yunzai,2.2.3版本。其余分值维护的V2-Yunzai可合并2.2.3版本 + * 较低版本的Yunzai可能无法正常使用miao-plugin * 部分底层结构升级 - * 底层增加面板计算逻辑 - * 圣遗物数据底层存储格式与处理逻辑初步升级 + * 底层增加面板计算逻辑 + * 圣遗物数据底层存储格式与处理逻辑初步升级 * 圣遗物主词条评分规则微调,可能会影响部分角色评分 - * 元素杯属性不符会触发主词缀评分惩罚 - * 充能主词条不再触发主词缀评分惩罚 + * 元素杯属性不符会触发主词缀评分惩罚 + * 充能主词条不再触发主词缀评分惩罚 * 一些已知问题修正与样式优化 # 2.1.0 * 增加群内排名功能 - * 默认关闭,如需启用可通过 `#喵喵设置排名开启`进行打开 - * 统计为bot本地统计,只统计在群内主动查看过的面板数据 - * 可通过 `#面板`、`#心海面板`、`#更新面板`等命令来触发排名数据更新 - * 增加命令 `#刷新排名`,获取群成员面板数据,刷新当前排名 **@munnks** - * `#雷神排名` 使用个人头像作为排行头像展示(首次使用可使用 `#刷新排名`以更新uid信息) + * 默认关闭,如需启用可通过 `#喵喵设置排名开启`进行打开 + * 统计为bot本地统计,只统计在群内主动查看过的面板数据 + * 可通过 `#面板`、`#心海面板`、`#更新面板`等命令来触发排名数据更新 + * 增加命令 `#刷新排名`,获取群成员面板数据,刷新当前排名 **@munnks** + * `#雷神排名` 使用个人头像作为排行头像展示(首次使用可使用 `#刷新排名`以更新uid信息) * 增加排名相关命令 - * 增加 `#最强雷神`、`#最高分甘雨`命令,查看当前统计中最高练度/最高圣遗物评分的面板数据 - * 增加 `#雷神排名`、`#甘雨圣遗物排名`命令,查看当前群中角色的排名数据 - * 增加 `#重置排名`、`#重置刻晴排名`命令,来重置当前群的排名统计 + * 增加 `#最强雷神`、`#最高分甘雨`命令,查看当前统计中最高练度/最高圣遗物评分的面板数据 + * 增加 `#雷神排名`、`#甘雨圣遗物排名`命令,查看当前群中角色的排名数据 + * 增加 `#重置排名`、`#重置刻晴排名`命令,来重置当前群的排名统计 * 面板及伤害计算升级 - * `#雷神面板`圣遗物支持展示强化次数 - * `#面板`会展示角色名命座信息 - * 底层元素反应计算逻辑更新 **@冷落** - * 增加纳西妲的伤害计算 + * `#雷神面板`圣遗物支持展示强化次数 + * `#面板`会展示角色名命座信息 + * 底层元素反应计算逻辑更新 **@冷落** + * 增加纳西妲的伤害计算 * `#喵喵设置` 部分配置项及功能改进 - * 删除一些无效或暂不支持的配置项 - * 配置存储位置变更为**config/cfg.js**。原设置会自动迁移 - * 喵喵设置中增加排名限制门槛,支持限制 有16个角色数据/包含御三家角色 才能参与排名,防止被非群成员uid刷榜 + * 删除一些无效或暂不支持的配置项 + * 配置存储位置变更为**config/cfg.js**。原设置会自动迁移 + * 喵喵设置中增加排名限制门槛,支持限制 有16个角色数据/包含御三家角色 才能参与排名,防止被非群成员uid刷榜 * `#日历` 页面样式微调,功能升级 - * 日历中会展示角色生日 - * 日历会展示本日可刷天赋角色列表 + * 日历中会展示角色生日 + * 日历会展示本日可刷天赋角色列表 * 增加3.3角色信息及图片,可通过 `#散兵天赋`、`#珐露珊命座`查看 * 一些样式及功能点优化 - * 优化character的进入判定逻辑,防止一些额外的log触发 - * 角色相关命令在V3下会联合V3的角色别名一同查询 - * `#深渊组队`使用新版胡桃API进行组队信息获取 -* 角色面板彩蛋图(满命/三皇冠/ACE 任一触发)支持自定义 - * 自定义图像可放置在 **resources/profile/super-character/** 目录下 + * 优化character的进入判定逻辑,防止一些额外的log触发 + * 角色相关命令在V3下会联合V3的角色别名一同查询 + * `#深渊组队`使用新版胡桃API进行组队信息获取 * 增加命令 `#最强排行`、`#最高分排行` 查看群排行 * 增加莱依拉的伤害计算及圣遗物评分权重 @@ -62,67 +61,67 @@ * 底层架构升级,以V3为主要版本,V2做兼容处理 * `#深渊配队`、`#戳一戳` 适配V3 * `#喵喵帮助`配置功能升级 - * 支持自定义帮助皮肤包,皮肤目录为**resources/help/theme** - * 若有多套皮肤包,默认随机使用,可通过**config/help.js**指定 - * 支持配帮助文字颜色及容器颜色与透明度 - * 支持图片毛玻璃效果,默认开启,可通过配置关闭 - * `注意1:` 如之前更改过底图可能会在更新后失效,可将自定义底图放置在新建的皮肤包目录内 - * `注意2:` 为统一配置目录,帮助配置文件迁移至**config/help.js**,如之前自定义过配置文件,help-cfg.js仍能够识别,但建议移至新配置目录以使用后续更多功能 + * 支持自定义帮助皮肤包,皮肤目录为**resources/help/theme** + * 若有多套皮肤包,默认随机使用,可通过**config/help.js**指定 + * 支持配帮助文字颜色及容器颜色与透明度 + * 支持图片毛玻璃效果,默认开启,可通过配置关闭 + * `注意1:` 如之前更改过底图可能会在更新后失效,可将自定义底图放置在新建的皮肤包目录内 + * `注意2:` 为统一配置目录,帮助配置文件迁移至**config/help.js**,如之前自定义过配置文件,help-cfg.js仍能够识别,但建议移至新配置目录以使用后续更多功能 * `#面板练度统计` 功能调整,样式重写 - * 样式由深色调整为浅色方案 - * 在未绑定CK时,使用本地面板数据展示练度信息 + * 样式由深色调整为浅色方案 + * 在未绑定CK时,使用本地面板数据展示练度信息 * 重写 `#刻晴`、`#老婆`的角色卡片 - * 样式整体升级,展示信息重新排版 - * 未绑定CK时,会同时使用本地面板数据进行展示 + * 样式整体升级,展示信息重新排版 + * 未绑定CK时,会同时使用本地面板数据进行展示 * `#上传深渊`队伍人数少于4人时展示样式优化 * MysApi内部逻辑重写 - * 在未绑定CK时,会使用本地面板数据综合计算,以使信息展示更完备 - * 优化V3下获取Uid及CK的逻辑,防止一些情况下触发报错 + * 在未绑定CK时,会使用本地面板数据综合计算,以使信息展示更完备 + * 优化V3下获取Uid及CK的逻辑,防止一些情况下触发报错 * 武器、圣遗物 meta数据及图像资源逻辑更新 - * 重构武器及圣遗物的底层处理逻辑,重构页面引用图像资源的逻辑 - * 图像资源更新为webp格式 + * 重构武器及圣遗物的底层处理逻辑,重构页面引用图像资源的逻辑 + * 图像资源更新为webp格式 * 增加多莉的伤害计算 * 其他已知Bug修复 # 1.11.0 * 面板圣遗物评分初步增加流派判定能力 - * 实验性,尚未完全稳定,可能会导致一些角色圣遗物评分变化,如遇问题请反馈 - * 目前实验暴力芭芭拉、血牛钟离的判定 + * 实验性,尚未完全稳定,可能会导致一些角色圣遗物评分变化,如遇问题请反馈 + * 目前实验暴力芭芭拉、血牛钟离的判定 * `#刻晴面板`、`#芭芭拉圣遗物`支持展示角色时装 - * 如果角色装备了时装,面板的角色图会展示时装立绘 - * 需要重新 `#更新面板`以获取时装数据 + * 如果角色装备了时装,面板的角色图会展示时装立绘 + * 需要重新 `#更新面板`以获取时装数据 * 增加赛诺、妮露、坎蒂丝的角色信息,可以通过 `#妮露天赋`、`#妮露命座`查看角色信息了 * 角色面板支持旅行者,暂未支持伤害计算及圣遗物评分 - * 需要重新更新旅行者的面板数据 + * 需要重新更新旅行者的面板数据 * `#雷主天赋`、`#草主命座`功能升级 - * 页面样式微调,内部处理逻辑升级 - * 支持旅行者天赋及命座信息查看 + * 页面样式微调,内部处理逻辑升级 + * 支持旅行者天赋及命座信息查看 * 增加 `#心海图鉴`功能,可查看突破材料及常用武器 - * 功能尚未完全稳定,信息还在继续补全中 - * 如无需使用,master可通过 `#喵喵设置图鉴关闭`关闭,防止覆盖图鉴插件等图鉴功能 + * 功能尚未完全稳定,信息还在继续补全中 + * 如无需使用,master可通过 `#喵喵设置图鉴关闭`关闭,防止覆盖图鉴插件等图鉴功能 * 框架底层角色相关逻辑重构,角色图像资源迁移为webp格式 - * 若遇到图像资源无法正常展示,可联系喵喵反馈 + * 若遇到图像资源无法正常展示,可联系喵喵反馈 # 1.10.0 * 新增 `#面板练度统计`功能 - * 可展示当前角色天赋及圣遗物练度信息 - * 需要用户绑定Cookie,圣遗物评分需要本地获取并查看过对应角色面板 + * 可展示当前角色天赋及圣遗物练度信息 + * 需要用户绑定Cookie,圣遗物评分需要本地获取并查看过对应角色面板 * `#上传深渊`使用图片渲染深渊结果,同时可被 `#喵喵深渊`触发 - * 可展示本期深渊的全部角色信息,包括组队、天赋及圣遗物 - * 数据会上传至胡桃Api进行伤害排名,并展示在页面内 - * 可在 `#喵喵设置`中启用 `#喵喵深渊`作为默认 `#深渊`,默认关闭 - * 启用后不会覆盖 `#上期深渊`以及 `#深渊12层`具体楼层的命令 + * 可展示本期深渊的全部角色信息,包括组队、天赋及圣遗物 + * 数据会上传至胡桃Api进行伤害排名,并展示在页面内 + * 可在 `#喵喵设置`中启用 `#喵喵深渊`作为默认 `#深渊`,默认关闭 + * 启用后不会覆盖 `#上期深渊`以及 `#深渊12层`具体楼层的命令 * `#面板`、`#更新面板`命令使用图片渲染结果 * `#雷神面板`展示数据API及更新时间 * Enka面板服务支持配置代理 **@永恒的小黑屋** - * 如需配置可在**miao-plugin/config/profile.js**文件中配置 + * 如需配置可在**miao-plugin/config/profile.js**文件中配置 * `#更新面板`支持配置更新API,适配Enka新校验逻辑 - * B服角色使用Enka服务进行面板信息获取 - * 感谢Enka官方 **@Algoinde**的官方授权及UA**校**验 - * 感谢 **@MiniGrayGay**提供的Enka服务中转,若面板更新失败可尝试在**miao-plugin/config/profile.js**文件中配置切换更新API - * 更新面板增加单用户更新间隔控制,默认5分钟 + * B服角色使用Enka服务进行面板信息获取 + * 感谢Enka官方 **@Algoinde**的官方授权及UA**校**验 + * 感谢 **@MiniGrayGay**提供的Enka服务中转,若面板更新失败可尝试在**miao-plugin/config/profile.js**文件中配置切换更新API + * 更新面板增加单用户更新间隔控制,默认5分钟 * `#深渊出场率`、`#角色持有率` 增加样本数量展示,增加数据使用授权提示 * 部分角色的圣遗物评分增加充能的词条评分权重 * 重构部分components、models逻辑,重构部分伤害计算逻辑 @@ -132,30 +131,30 @@ # 1.9.0 * 初步适配Yunzai V3 - * 部分功能可能无法正常使用,会逐步适配 - * 部分依赖MysApi查询的功能在V3下暂时只支持查自己 + * 部分功能可能无法正常使用,会逐步适配 + * 部分依赖MysApi查询的功能在V3下暂时只支持查自己 * 增加提纳里、柯莱、多莉的资料及角色图像 - * 可通过 `#柯莱天赋`、`#柯莱命座`查看资料 + * 可通过 `#柯莱天赋`、`#柯莱命座`查看资料 * 增加 `#深渊使用率`命令,数据源自SG团队胡桃API * 新增 `#上传深渊数据`命令 - * 上传自己角色的深渊挑战数据及角色列表,并展示在本期深渊中伤害与承伤排名 - * 上传数据用于 `#角色持有率 #深渊出场率`等统计,可使统计更加及时准确 - * 数据统计及服务来自SG团队胡桃API + * 上传自己角色的深渊挑战数据及角色列表,并展示在本期深渊中伤害与承伤排名 + * 上传数据用于 `#角色持有率 #深渊出场率`等统计,可使统计更加及时准确 + * 数据统计及服务来自SG团队胡桃API * 增加 `#添加刻晴图像`命令,感谢 **@叶** - * 可通过命令上传添加指定角色图片,上传至 **resources/character-img/刻晴/upload** - * 请将图像与命令一同发送,后续会支持at图像及命令后发送图像 + * 可通过命令上传添加指定角色图片,上传至 **resources/character-img/刻晴/upload** + * 请将图像与命令一同发送,后续会支持at图像及命令后发送图像 * `#刻晴` 角色卡片功能升级 - * `#老婆设置刻晴,心海`不再检查是否具有角色或展示在米游社展柜 - * `#刻晴` 角色卡片优先使用面板数据进行展示,无面板数据时使用米游社数据 - * 在未能获取到角色数据时也会展示角色卡片 + * `#老婆设置刻晴,心海`不再检查是否具有角色或展示在米游社展柜 + * `#刻晴` 角色卡片优先使用面板数据进行展示,无面板数据时使用米游社数据 + * 在未能获取到角色数据时也会展示角色卡片 * 支持戳一戳返回喵喵版角色卡片,暂不支持V3 Yunzai - * 需要使用喵喵分支Yunzai以支持此能力,如需切换可在Yunzai根目录输入下方命令后更新重启 - * `git remote set-url origin https://gitee.com/yoimiya-kokomi/Yunzai-Bot` - * 可通过 `#喵喵设置` 关闭戳一戳 + * 需要使用喵喵分支Yunzai以支持此能力,如需切换可在Yunzai根目录输入下方命令后更新重启 + * `git remote set-url origin https://gitee.com/yoimiya-kokomi/Yunzai-Bot` + * 可通过 `#喵喵设置` 关闭戳一戳 * 支持定义新角色及别名 - * 新增角色 派蒙、瑶瑶、白术、伐难、应达、散兵、女士、萍姥姥、仆人、少女、富人、博士、木偶、丑角、队长、妮露、纳西妲 的角色配置及图片 - * 自定义角色可使用 `#派蒙` `#派蒙图片`触发图片查看,`#女儿设置派蒙`进行设置。后续会支持更多场景 - * 如需扩展可在喵喵config/character.js中定义 + * 新增角色 派蒙、瑶瑶、白术、伐难、应达、散兵、女士、萍姥姥、仆人、少女、富人、博士、木偶、丑角、队长、妮露、纳西妲 的角色配置及图片 + * 自定义角色可使用 `#派蒙` `#派蒙图片`触发图片查看,`#女儿设置派蒙`进行设置。后续会支持更多场景 + * 如需扩展可在喵喵config/character.js中定义 * `#喵喵帮助`增加对自定义配置文件的支持 * 角色伤害计算增加 鹿野院平藏、烟绯 * `#喵喵日历`现在可通过 `#日历 #日历列表`触发 @@ -163,111 +162,111 @@ # 1.8.0 * `#角色面板`、`#圣遗物列表` 使用新的圣遗物评分逻辑计算评分 - * 新的圣遗物评分规针对不同角色进行了细化,对不同角色的评分进行了拉齐 - * 不同角色基于不同词条权重进行计算。感谢 **@糖炒栗子 @秋声 @49631073**等的权重梳理 + * 新的圣遗物评分规针对不同角色进行了细化,对不同角色的评分进行了拉齐 + * 不同角色基于不同词条权重进行计算。感谢 **@糖炒栗子 @秋声 @49631073**等的权重梳理 * 增加 `#雷神圣遗物`命令 - * 展示指定角色圣遗物及评分计算详情 - * 展示新版圣遗物评分逻辑与计算规则 + * 展示指定角色圣遗物及评分计算详情 + * 展示新版圣遗物评分逻辑与计算规则 * 增加 `#原图`命令,可获取喵喵角色卡片原图,感谢 **@牧星长** 提供功能 - * 对由 `#老婆 #刻晴`发出的角色卡片图回复 `#原图`可获取对应图像 + * 对由 `#老婆 #刻晴`发出的角色卡片图回复 `#原图`可获取对应图像 * `#角色面板`现在支持B服角色数据获取 - * 数据来自喵喵API,目前开放调用无需Token,仅限喵喵插件用户使用 - * 已知问题:角色天赋的皇冠及命座加成效果显示可能有问题,后期fix + * 数据来自喵喵API,目前开放调用无需Token,仅限喵喵插件用户使用 + * 已知问题:角色天赋的皇冠及命座加成效果显示可能有问题,后期fix * `#录入角色面板` 功能恢复 - * 可对已有面板数据的角色手工输入更改面板属性,用于伤害测算 - * 例如 `#录入雷神面板 暴击80,暴伤250` - * 暂不支持设置武器、圣遗物、命座、天赋。后续会增加支持 + * 可对已有面板数据的角色手工输入更改面板属性,用于伤害测算 + * 例如 `#录入雷神面板 暴击80,暴伤250` + * 暂不支持设置武器、圣遗物、命座、天赋。后续会增加支持 * 部分页面样式调整及功能优化 - * `#角色持有率` 等增加提示说明 - * `#圣遗物列表` 展示个数提升至28,且根据新版圣遗物评分规则进行词条高亮 - * `#喵喵更新` 的自动重启功能适配node app方式启动的Yunzai-Bot,感谢 **@SirlyDreamer** + * `#角色持有率` 等增加提示说明 + * `#圣遗物列表` 展示个数提升至28,且根据新版圣遗物评分规则进行词条高亮 + * `#喵喵更新` 的自动重启功能适配node app方式启动的Yunzai-Bot,感谢 **@SirlyDreamer** * 角色图像增加小清新开关,默认关闭 - * 对增量包内的角色图像进行分级,较为清凉的图像独立管理 - * 勇士们可使用 `#喵喵设置小清新开启` 启用 + * 对增量包内的角色图像进行分级,较为清凉的图像独立管理 + * 勇士们可使用 `#喵喵设置小清新开启` 启用 * 伤害计算增加扩散、感电的计算逻辑,感谢 **@49631073**的逻辑梳理 * `#角色面板` 伤害计算增加部分角色,目前支持 - * 长柄武器:雷神、胡桃、魈、钟离、香菱 - * 法器:神子、心海、可莉、凝光、芭芭拉、莫娜 - * 弓:甘雨、宵宫、公子,九条,迪奥娜、安柏、皇女、温迪、夜兰 - * 单手剑:绫人、绫华、刻晴、阿贝多、行秋、班尼特、七七、凯亚、琴、万叶ⁿᵉʷ、久岐忍ⁿᵉʷ - * 双手剑:一斗、优菈、迪卢克、诺艾尔、重云 + * 长柄武器:雷神、胡桃、魈、钟离、香菱 + * 法器:神子、心海、可莉、凝光、芭芭拉、莫娜 + * 弓:甘雨、宵宫、公子,九条,迪奥娜、安柏、皇女、温迪、夜兰 + * 单手剑:绫人、绫华、刻晴、阿贝多、行秋、班尼特、七七、凯亚、琴、万叶ⁿᵉʷ、久岐忍ⁿᵉʷ + * 双手剑:一斗、优菈、迪卢克、诺艾尔、重云 # 1.7.0 * `#更新面板` 功能升级 - * 该功能可直接使用,不再需要token - * 在查询新用户时会自动使用,自动使用的CD 12小时 - * 支持国际服UID,目前暂不支持2及5开头的UID - * 服务来自enka api,部分网络可能无法请求,请科学处理,后续会增加转发服务。 - * 由于服务逻辑与之前数据不一致,部分角色的属性及伤害计算可能会不准确,如有发现请反馈给喵喵 + * 该功能可直接使用,不再需要token + * 在查询新用户时会自动使用,自动使用的CD 12小时 + * 支持国际服UID,目前暂不支持2及5开头的UID + * 服务来自enka api,部分网络可能无法请求,请科学处理,后续会增加转发服务。 + * 由于服务逻辑与之前数据不一致,部分角色的属性及伤害计算可能会不准确,如有发现请反馈给喵喵 * `#面板`、`#更新面板`、`#角色面板`、`#角色伤害`、`#圣遗物列表`不再需要绑定cookie,支持查他人 - * 使用 `#面板`命令可查看已获取面板数据的角色列表 - * 默认查询自己UID,同时也可通过命令+uid方式指定查询对象 - * 由于整体逻辑变化,喵喵1.6.0之前更新的面板数据无法查看,需要重新更新数据 + * 使用 `#面板`命令可查看已获取面板数据的角色列表 + * 默认查询自己UID,同时也可通过命令+uid方式指定查询对象 + * 由于整体逻辑变化,喵喵1.6.0之前更新的面板数据无法查看,需要重新更新数据 * 增加 `#喵喵面板设置`命令,可更精细的设置是否允许好友/临时对话/群使用面板功能 * 由 `#录入xx面板` 录入的数据暂时屏蔽 * `#角色面板`、`#喵喵日历` 部分细节样式调整 * `#角色面板` 伤害计算增加部分角色,目前支持 - * 长柄武器:雷神、胡桃、魈、钟离、香菱 - * 法器:神子、心海、可莉、凝光、芭芭拉、莫娜ⁿᵉʷ - * 弓:甘雨、宵宫、公子,九条,迪奥娜、安柏、皇女ⁿᵉʷ、温迪ⁿᵉʷ、夜兰ⁿᵉʷ - * 单手剑:绫人、绫华、刻晴、阿贝多、行秋、班尼特、七七、凯亚、琴ⁿᵉʷ - * 双手剑:一斗、优菈、迪卢克、诺艾尔、重云 + * 长柄武器:雷神、胡桃、魈、钟离、香菱 + * 法器:神子、心海、可莉、凝光、芭芭拉、莫娜ⁿᵉʷ + * 弓:甘雨、宵宫、公子,九条,迪奥娜、安柏、皇女ⁿᵉʷ、温迪ⁿᵉʷ、夜兰ⁿᵉʷ + * 单手剑:绫人、绫华、刻晴、阿贝多、行秋、班尼特、七七、凯亚、琴ⁿᵉʷ + * 双手剑:一斗、优菈、迪卢克、诺艾尔、重云 # 1.6.0 * `#喵喵设置` 支持设置 面板查询 的功能开关 * `#喵喵版本` 使用图片展示更新信息 * `#喵喵日历` 升级 - * 增加 `#喵喵日历列表`命令,以列表形式展示活动信息 - * 增加从活动详情信息中解析活动日期的逻辑,使一些活动日期更加准确 + * 增加 `#喵喵日历列表`命令,以列表形式展示活动信息 + * 增加从活动详情信息中解析活动日期的逻辑,使一些活动日期更加准确 * 增加鹿野院平藏的角色信息,可通过 `#平藏天赋`、`#平藏命座`查看信息 * 其他升级调整 - * `#深渊出场率`、`#角色持有率` 等页面功能及样式微调 - * `#角色面板` 伤害计算增加双手剑计算逻辑,增加物伤计算逻辑 - * 页面版权信息展示Yunzai及喵喵版本号 + * `#深渊出场率`、`#角色持有率` 等页面功能及样式微调 + * `#角色面板` 伤害计算增加双手剑计算逻辑,增加物伤计算逻辑 + * 页面版权信息展示Yunzai及喵喵版本号 * `#角色面板` 伤害计算增加部分角色,目前支持 - * 长柄武器:雷神、胡桃、魈、钟离、香菱 - * 法器:神子、心海、可莉ⁿᵉʷ、凝光ⁿᵉʷ、芭芭拉ⁿᵉʷ - * 弓:甘雨、宵宫、公子,九条ⁿᵉʷ,迪奥娜ⁿᵉʷ、安柏ⁿᵉʷ - * 单手剑:绫人、绫华、刻晴、阿贝多、行秋、班尼特、七七ⁿᵉʷ、凯亚ⁿᵉʷ - * 双手剑:一斗ⁿᵉʷ、优菈ⁿᵉʷ、迪卢克ⁿᵉʷ、诺艾尔ⁿᵉʷ、重云ⁿᵉʷ + * 长柄武器:雷神、胡桃、魈、钟离、香菱 + * 法器:神子、心海、可莉ⁿᵉʷ、凝光ⁿᵉʷ、芭芭拉ⁿᵉʷ + * 弓:甘雨、宵宫、公子,九条ⁿᵉʷ,迪奥娜ⁿᵉʷ、安柏ⁿᵉʷ + * 单手剑:绫人、绫华、刻晴、阿贝多、行秋、班尼特、七七ⁿᵉʷ、凯亚ⁿᵉʷ + * 双手剑:一斗ⁿᵉʷ、优菈ⁿᵉʷ、迪卢克ⁿᵉʷ、诺艾尔ⁿᵉʷ、重云ⁿᵉʷ # 1.5.0 * 增加 `#喵喵日历` 功能 - * 【!请注意!】此功能需要安装moment库,请在Yunzai安装目录下运行 `npm install moment`后再进行升级 - * 展示当前进行中及即将开始的活动,包括深境螺旋 + * 【!请注意!】此功能需要安装moment库,请在Yunzai安装目录下运行 `npm install moment`后再进行升级 + * 展示当前进行中及即将开始的活动,包括深境螺旋 * `#角色面板` 伤害计算目前支持 - * 长柄武器:雷神、胡桃、魈、钟离、香菱ⁿᵉʷ - * 法器:神子、心海 - * 弓:甘雨、宵宫、公子 - * 单手剑:绫人、绫华、刻晴、阿贝多ⁿᵉʷ、行秋ⁿᵉʷ、班尼特ⁿᵉʷ + * 长柄武器:雷神、胡桃、魈、钟离、香菱ⁿᵉʷ + * 法器:神子、心海 + * 弓:甘雨、宵宫、公子 + * 单手剑:绫人、绫华、刻晴、阿贝多ⁿᵉʷ、行秋ⁿᵉʷ、班尼特ⁿᵉʷ * 底层升级:抽象了部分公共组件为tpl模板以提高复用度,css改为less处理 # 1.4.0 * 增加 `#深渊配队` 功能 - * 根据当前账号的角色练度及本期深渊出场数据,推荐较匹配的配队方案 - * 深渊出场数据来自胡桃API,为Snap Genshin用户自主上传的深渊挑战记录,感谢SG团队 - * 配队方案仅供参考 + * 根据当前账号的角色练度及本期深渊出场数据,推荐较匹配的配队方案 + * 深渊出场数据来自胡桃API,为Snap Genshin用户自主上传的深渊挑战记录,感谢SG团队 + * 配队方案仅供参考 * `#角色面板` 伤害计算新增部分角色 - * 目前支持:雷神、胡桃、魈、神子、甘雨、宵宫、公子、绫人、绫华、心海、钟离 + * 目前支持:雷神、胡桃、魈、神子、甘雨、宵宫、公子、绫人、绫华、心海、钟离 * `#角色面板` 一些功能升级与调整 - * 支持对治疗量、护盾量的计算与展示 - * 修复冰融化、少女4等buff等buff遗漏或错误导致的伤害计算偏差 + * 支持对治疗量、护盾量的计算与展示 + * 修复冰融化、少女4等buff等buff遗漏或错误导致的伤害计算偏差 * `#老婆` 功能支持对jpeg格式的图片格式识别 # 1.3.0 * 增加 `#雷神伤害` 功能 - * 可计算圣遗物副词条置换带来的伤害变化,可用于圣遗物副词条侧重方向的参考 - * 可以查看指定角色伤害计算的Buff列表 + * 可计算圣遗物副词条置换带来的伤害变化,可用于圣遗物副词条侧重方向的参考 + * 可以查看指定角色伤害计算的Buff列表 * `#角色面板` 伤害计算新增部分角色 - * 目前支持:雷神、胡桃、魈、神子、甘雨、宵宫、公子、绫人、绫华 + * 目前支持:雷神、胡桃、魈、神子、甘雨、宵宫、公子、绫人、绫华 * `#角色面板` 功能升级 - * 优化无角色面板数据时的引导 - * 优化返回的图像格式及分辨率,平衡响应速度及显示效果 + * 优化无角色面板数据时的引导 + * 优化返回的图像格式及分辨率,平衡响应速度及显示效果 * 增加 `#圣遗物列表` 功能,对已经获取面板的所有角色圣遗物进行评分,并展示高评分的圣遗物列表 * 增加 `#角色面板列表` / `#角色面板帮助` 命令 * 增加 `#更新胡桃面板` 命令,获取单个角色面板数据,每天可更新5次 @@ -276,15 +275,15 @@ # 1.2.0 * `#角色面板` 增加伤害计算功能 - * 目前支持角色:雷神、胡桃、魈、神子、甘雨 - * 可通过 `#怪物等级85` 命令设定怪物等级,以获得更准确的计算结果 - * 计算伤害为满Buff情况,后续会出更详细的Buff及计算展示 + * 目前支持角色:雷神、胡桃、魈、神子、甘雨 + * 可通过 `#怪物等级85` 命令设定怪物等级,以获得更准确的计算结果 + * 计算伤害为满Buff情况,后续会出更详细的Buff及计算展示 * `#获取游戏角色详情`命令在服务侧增加基于UID的天频度限制 * 增加 `#喵喵更新` 功能 - * 感谢 @碎月 @清秋 的代码支持 - * 若更新成功会重启Yunzai,需要Yunzai以 npm run start 模式启动 - * 尚未经充分测试,请有一定容错能力的勇士尝试 - * 增加 `#喵喵版本`命令查询版本信息 + * 感谢 @碎月 @清秋 的代码支持 + * 若更新成功会重启Yunzai,需要Yunzai以 npm run start 模式启动 + * 尚未经充分测试,请有一定容错能力的勇士尝试 + * 增加 `#喵喵版本`命令查询版本信息 # 1.1.0 diff --git a/apps/character/ProfileArtis.js b/apps/character/ProfileArtis.js index 440dd307..a844e314 100644 --- a/apps/character/ProfileArtis.js +++ b/apps/character/ProfileArtis.js @@ -43,7 +43,7 @@ export async function profileArtis (e) { return await Common.render('character/artis-mark', { uid, elem: char.elem, - splash: char.getImgs(profile.costume).splash, + splash: char.getImgs(profile.costume).splash0, data: profile, costume: profile.costume ? '2' : '', artisDetail, diff --git a/apps/character/ProfileDetail.js b/apps/character/ProfileDetail.js index 27891028..087b272e 100644 --- a/apps/character/ProfileDetail.js +++ b/apps/character/ProfileDetail.js @@ -96,7 +96,6 @@ export async function renderProfile (e, char, mode = 'profile', params = {}) { let artisDetail = profile.getArtisMark() let artisKeyTitle = ProfileArtis.getArtisKeyTitle() let imgs = char.getImgs(profile.costume) - imgs.img = imgs.isRandom ? imgs.randomImg.path + imgs.randomImg.urls[lodash.random(0, imgs.randomImg.urls.length - 1)] : imgs.splash // 渲染图像 return await Common.render('character/profile-detail', { save_id: uid, diff --git a/apps/profile/ProfileChange.js b/apps/profile/ProfileChange.js index 0ed1cb53..c3886f17 100644 --- a/apps/profile/ProfileChange.js +++ b/apps/profile/ProfileChange.js @@ -38,7 +38,7 @@ const ProfileChange = { return false } msg = msg.toLowerCase().replace(/uid ?:? ?/, '') - let regRet = /^#*(\d{9})?(.+?)(详细|详情|面板|面版|圣遗物|伤害[1-7]?|换)\s*(\d{9})?(.+)/.exec(msg) + let regRet = /^#*(\d{9})?(.+?)(详细|详情|面板|面版|圣遗物|伤害[1-7]?)?\s*(\d{9})?[变换改](.+)/.exec(msg) if (!regRet || !regRet[2]) { return false } diff --git a/models/Character.js b/models/Character.js index ea27b919..da066485 100644 --- a/models/Character.js +++ b/models/Character.js @@ -197,15 +197,28 @@ class Character extends Base { } let costumeCfg = [this.checkCostume(costume[0]) ? '2' : '', costume[1] || 'normal'] - let cacheId = `costume${costumeCfg.join('')}` + let cacheId = `costume${costume[0]}` if (!this._imgs) { this._imgs = {} } - if (this._imgs[cacheId]) { - return this._imgs[cacheId] + if (!this._imgs[cacheId]) { + this._imgs[cacheId] = CharImg.getImgs(this.name, costumeCfg, this.isTraveler ? this.elem : '', this.source === 'amber' ? 'png' : 'webp') + } - this._imgs[cacheId] = CharImg.getImgs(this.name, costumeCfg, this.isTraveler ? this.elem : '', this.source === 'amber' ? 'png' : 'webp') - return this._imgs[cacheId] + let ret = this._imgs[cacheId] + let nPath = `meta/character/${this.name}` + if (costumeCfg[1] === 'super') { + ret.splash0 = CharImg.getRandomImg( + [`profile/super-character/${this.name}`, `profile/normal-character/${this.name}`], + [`${nPath}/imgs/splash0.webp`, `${nPath}/imgs/splash${costumeCfg[0]}.webp`, `/${nPath}/imgs/splash.webp`] + ) + } else { + ret.splash0 = CharImg.getRandomImg( + [`profile/normal-character/${this.name}`], + [`${nPath}/imgs/splash${costumeCfg[0]}.webp`, `/${nPath}/imgs/splash.webp`] + ) + } + return ret } // 获取详情数据 diff --git a/models/character-lib/CharImg.js b/models/character-lib/CharImg.js index 6a7098ed..71568261 100644 --- a/models/character-lib/CharImg.js +++ b/models/character-lib/CharImg.js @@ -5,6 +5,7 @@ import fs from 'fs' import lodash from 'lodash' import sizeOf from 'image-size' +const rPath = `${process.cwd()}/plugins/miao-plugin/resources` const CharImg = { // 获取角色的插画 @@ -53,6 +54,33 @@ const CharImg = { return ret }, + getRandomImg (imgPaths, defImgs = []) { + for (let imgPath of imgPaths) { + let ret = [] + for (let type of ['webp', 'png']) { + if (fs.existsSync(`${rPath}/${imgPath}.${type}`)) { + ret.push(imgPath + '.webp') + } + } + if (fs.existsSync(`${rPath}/${imgPath}`)) { + let imgs = fs.readdirSync(`${rPath}/${imgPath}`).filter((file) => { + return /\.(png|webp)$/.test(file) + }) + for (let img of imgs) { + ret.push(`${imgPath}/${img}`) + } + } + if (ret.length > 0) { + return lodash.sample(ret) + } + } + for (let defImg of defImgs) { + if (fs.existsSync(`${rPath}/${defImg}`)) { + return defImg + } + } + }, + // 获取角色的图像资源数据 getImgs (name, costumeCfg = '', travelerElem = '', fileType = 'webp') { if (!lodash.isArray(costumeCfg)) { @@ -62,7 +90,6 @@ const CharImg = { if (!['空', '荧', '旅行者'].includes(name)) { travelerElem = '' } - const rPath = `${process.cwd()}/plugins/miao-plugin/resources` const nPath = `/meta/character/${name}/` const tPath = `/meta/character/旅行者/${travelerElem}/` let add = (key, path, path2) => { @@ -78,31 +105,8 @@ const CharImg = { add('face', 'imgs/face', `imgs/face${costumeCfg[0]}`) add('side', 'imgs/side', `imgs/side${costumeCfg[0]}`) add('gacha', 'imgs/gacha') - // 随机角色面板图 - imgs.isRandom = false - let randomMode = true // 随机模式开关 - let randomImgPath = `${rPath}/profile/randomMode-character/${name}/` - if (randomMode && fs.existsSync(randomImgPath)) { - let imgUrls = fs.readdirSync(randomImgPath).filter((fileUrl) => { - return fileUrl.includes('.webp') - }) - if (imgUrls.length != 0) { - imgs.randomImg = {} - imgs.randomImg.path = `profile/randomMode-character/${name}/` - imgs.randomImg.urls = imgUrls - imgs.isRandom = true - } - } + add('splash', 'imgs/splash', `imgs/splash${costumeCfg[0]}`) // 检查彩蛋自定义 - if (costumeCfg[1] === 'super' && fs.existsSync(`${rPath}/profile/super-character/${name}.webp`)) { - imgs.splash = `profile/super-character/${name}.webp` - } else if (costumeCfg[1] === 'super' && fs.existsSync(`${rPath}/${nPath}/imgs/splash0.webp`)) { - imgs.splash = `${nPath}imgs/splash0.webp` - } else if (fs.existsSync(`${rPath}/profile/normal-character/${name}.webp`)) { - imgs.splash = `profile/normal-character/${name}.webp` - } else { - add('splash', 'imgs/splash', `imgs/splash${costumeCfg[0]}`) - } tAdd('card', 'imgs/card') tAdd('banner', 'imgs/banner') for (let i = 1; i <= 6; i++) { diff --git a/models/profile-lib/CharArtis.js b/models/profile-lib/CharArtis.js index e013b571..43e7aea6 100644 --- a/models/profile-lib/CharArtis.js +++ b/models/profile-lib/CharArtis.js @@ -14,7 +14,7 @@ const CharArtis = { let def = function (attrWeight) { let title = [] - let weight = lodash.extend({}, attrWeight || usefulAttr[char.name] || { atk: 75, cpct: 100, cdmg: 100 }) + let weight = lodash.extend({}, attrWeight || usefulAttr[char.name] || { atk: 75, cpct: 100, cdmg: 100, dmg: 100 }) let check = (key, max = 75, maxPlus = 75, isWeapon = true) => { let original = weight[key] || 0 if (original < max) { diff --git a/resources/character/profile-detail.html b/resources/character/profile-detail.html index 4523dd5f..426f467e 100644 --- a/resources/character/profile-detail.html +++ b/resources/character/profile-detail.html @@ -11,7 +11,7 @@ {{block 'main'}}
zlE< z(KQ#xj?3gn@!m!il3|+!&)+yU6O@;Ge+H4gk>cF=hrZZApxUFl9p6g+G?%`Fey{q( zwe^>6*`ks-jT@%(?GR13f|`q4%0*Znz0!g^Y<;Y(=I7!Mg4Yy^+m}z>~Xx8AXdxNSa)r-pY`c4KwJoaUP+fiR~KI~xj9%Me;Czmh4!sH;TFsXV8%`eyz}aT zw#PUrR}J2d)GxX&>$V#$_8av!0C^jH+*bW%fV$vP*`;yGAPvhgi9f$N?0JU7wm7Q! zjBr^Om@CqDYg4e>AsPbvOItaO_;mMg!8rjJ%;j6ENIejfPz&pMS24Ej*CPKs8rhdd zDx|qn*5~;liaRckAA(*fn(#pY!uU~LqR_lfx+6o;m15!|?C-6JX~2bv2cO`LeT{E5 zL#eif^Oqhny3q~H5D%2z$prcvCJI<}-utShX3oC4*9k5nZhs>m#9U3gfY^h8kGMoJ zLRJJZHvC6`v{Shg5=sIS-74DBotdT$9&aP#9Bg7U4_tJ;UAV6D(%XyWINc)|i}{Hp zE(dh<44n MNS2}?kd_AkeNq%LeFx3g%rb`HmZ>I3w0;~qpk#AD zUtz)@;}$BRGLpT^1uJ4v#r|v!Fk*{2=SB@UNPNjp2qwWM;1v?z`?JLXc+>s+6w2%H z4E*A5<;p15 friK^z>=;d64BSqD6@}~XSUif@K*zcH<6<#~e zmWE2CIR8Y7u7-FpBLACZMLcWU 0c?stYL6dzxFYx9H&{hjP{jUj;xH>jib z=8$KC7%4}MD47uQw$>N|-+6wx5%n)+_PG=O+rN0RzqpgL89XkhgvSySFWTI)1lRrkh{Zf56^mSiFtK{^H8RW2PZ1be$d}Y93{ifd!mFF!6mb7WF z`~o$)`R2L%_80=EvY`ar(8)DHW8G7oZ(ERC+PGO33=gM3r-+Pu$wt;Fp1*-_#A=-~ zmQ1W%xqx&&F%C>E88LG%jYmi5yjnVOh8$O{LXn2~sNTsDN(^ZV&$?6R2F^IW??H|T zTJ?a!Qa&GDOQPkt2FDNcBIw>o07U|^pKe~>g4 +j(OJ(yZgA+3qGntNJeRM2X+AGO8f{@u}jcvS&Z)Ld(2gy4dlc%^hv `3b$C2$mq z$*Tmi{;lkXkPAvb?=#NsnK^Osn>Cg@l#ZUx6`va(8*<;!o8P2zECtH`re`Ks Wy*#F!wY_chXF*;b`p*jeUS{@46@Q-3pWu=-Dy2x0SJ3z=J))lqQ?V{(dX8%% z)_Gx66c5=JNB?@fhHdu;F-AlT{Oa9t4}jHrJziRS{s6i7qfRJSyx!ovGz5X%uP4!x z5_zn(ZjpFh9$4smKHSu=zOBE+3j1DdxIB8mIdSgu`7$qS9v{j0#%@(W?#Ash0ca*# zMlZ*hO1^i&Zl^6*$sfZ@=krl8lz$+n6-P$?Nhl+nWy-kQn|>eGTlvyigT?dLyET`+ zvifE3@h!~Nm+NZoa*}0%{G>Iz0RzDF= F6p`*cn?LJuy}J<4Cf!!JTl{2?Ao_EOrCDFqdgq1FYePSyb5&`ntJlVB z$un{@r{8YAf7MOLy;J?##mKOO0Az={Uf^l4q;NO5)cadY=};mjozYX~OAjkHOS0cR zShMkOE97uoh^QI|8poC9i7TojY35aw37e$265S}f$+`bBOTXb}_vy6d>4ra+=U`** zwB=xtF!RAwcU)QhsXB})Fhx#>76rYQ|FC$j?d|ByEVQ2WWupM`&SrV#j#Dae-kDUR z(wWqmuLwzZ^cBbesz_4dv_fHUKVGicj|!`3e!3$3f>GOcad70&^e}W};BO)xUVNV5 zU(q$ye}xel?yTc>&~&FFg?zm9Gkm{1OBO@qtGmg311T>lA{>V5h7*1^TRrz1v3lBE z+2dLB-dcNs5W31!p+oz1Q(8si@hUe9E0RKn)APak?bu53_`S3=Ai8!X0bjzN^gBi( zTIM*v6*g8{822jyHevEuYSsOY@t>B{1Do=e!=TTS-~4x)TH>aGDK}ahqm1L)GYbU= zOFylD#@`LNWmw40CDBaA2>H2-R#n+d(HCj)`&k`B{Sn$ZNh{}ho8-3V+ljLY3(d>b zJbA%sdD+>TbCrcJ{yD>*q|v N<7zn(mbEt99E2-`z;AI CCt1o3)QUCdf^~%AA<5 zCo=WjRUqNSdcRfaY^?%x9CdUfbaSRMrHX6<2--?;iOb*yFxJ4unkay?RZQ6q#veMC z)ZdgkV|5iqjtQP=>yd77OrMgVY80N4O>mCT+H>$%@Z=xnC3pL^HovE_zma&10f|Kq zx*wK8Ri`kc2CZIs>$5Ifu}@KjcWRqz|K>#-ES6m@Vux#@YhqxS#}_50gd?=MIlhX0 zSZ|jkQOVx}^J7A();g`kj56Y|J~}K6aT3;jU!VEJN4Q?K-E<;h;m4wJ6(y$h5LO!6 z?~qj$i9@Oe2>4h{pRlb~h0GSCP1GVL9#&rKRc{$<*HI_dO2KgKeN@~7@Z4G}k*%}U zt@Rueeq+(?nmSau!iE^sph_%n-w2+*{Fu2F>sE|^wphQ}w~wY}hEfaJ>aC;F#3;Vy zF|U32#iFteSz_WkmWi(}&Z+Q{`o4BsJQD$YILwbScwSF4c+=*2N*Q#?{4M4cc9M!o zJ;$rCD6C^=))$gtx$j-Ub!S6ITR$iSMmepw&|eDyEZHPzVI<|lW*SZ(uAPcwtsD`; zI1-~v+`Z|Q*hhIweP7yKPW_+&P-|7KD6*dt49##^X&qPMBm1O}%T3TUhHw^|0W%Uf zw^nEWYfNR_zs+3J%4+a-;d5OV9{)jaf|{K7eBO@* 7y08n~RaXfc@ctM!juBSV|L;9<#c+ zk~F;!9Ny5k-PTvmk_8$15LJU*G7U^lZT02F8zoc_b6Y@b;dDRO_PSDbPm3<0(_*FJ z2tGgxL7sx!*F*wyl$exz^9tu`WmJDP M1 zkl`>oyl6<6;xbh0hvjMG9FHYb`S8suq>5hIYvY^W)Bz_>#>Svw&MjCD%G~spo=AtM z_K0By!R}v_7(wCQ3K=tk%N*8W9#^;W!IDZHQs{`2h=L#D0_>zljKS+qlmzG!7_s3$ zS2+rM7;S~CO}1LZv(r!Ax)mzApRyKdL@o%=HCGa4FqmY_$vSZ?N>Ktl?xIx_c4J=6 z(xf^fJsgDU4A|eob8~))5(<<|Ta{t13*E=ecsv%J