From 3e19288ed855d4e6d7db50cbf8fabb40dd414f84 Mon Sep 17 00:00:00 2001 From: zhiyu1998 Date: Sun, 27 Nov 2022 01:12:02 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8C=88=20style:=20=E6=95=B4=E7=90=86?= =?UTF-8?q?=E7=B1=BB=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cat.js | 35 ------ apps/doctor.js | 61 ---------- apps/hotSearch.js | 91 -------------- apps/query.js | 199 +++++++++++++++++++++++++++++++ apps/recommend.js | 55 --------- config/help.yaml | 26 ++-- config/{cat.yaml => query.yaml} | 0 resources/img/icon/translate.png | Bin 5422 -> 6857 bytes 8 files changed, 210 insertions(+), 257 deletions(-) delete mode 100644 apps/cat.js delete mode 100644 apps/doctor.js delete mode 100644 apps/hotSearch.js create mode 100644 apps/query.js delete mode 100644 apps/recommend.js rename config/{cat.yaml => query.yaml} (100%) diff --git a/apps/cat.js b/apps/cat.js deleted file mode 100644 index 654aae5..0000000 --- a/apps/cat.js +++ /dev/null @@ -1,35 +0,0 @@ -// 主库 -import { segment } from 'oicq' -import fetch from 'node-fetch' -// 配置文件库 -import config from '../model/index.js' - -export class cat extends plugin { - constructor () { - super({ - name: '猫', - dsc: '猫相关指令', - event: 'message.group', - priority: 500, - rule: [ - { - reg: '^#(cat)$', fnc: 'cat' - } - ] - }) - this.catConfig = config.getConfig('cat') - } - - async cat (e) { - const numb = this.catConfig.count - let images = [] - let reqRes = [ ...await fetch(`https://shibe.online/api/cats?count=${ numb }`).then(data => data.json()), ...await fetch(`https://api.thecatapi.com/v1/images/search?limit=${ numb }`).then(data => data.json()).then(json => json.map(item => item.url)) ] - e.reply('涩图也不看了,就看猫是吧, 探索中...') - reqRes.forEach(item => { - images.push({ - message: segment.image(item), nickname: this.e.sender.card || this.e.user_id, user_id: this.e.user_id - }) - }) - return !!(await this.reply(await Bot.makeForwardMsg(images))) - } -} diff --git a/apps/doctor.js b/apps/doctor.js deleted file mode 100644 index f79c487..0000000 --- a/apps/doctor.js +++ /dev/null @@ -1,61 +0,0 @@ -// 主库 -import { segment } from 'oicq' -import fetch from 'node-fetch' -// 爬虫库 -import puppeteer from '../../../lib/puppeteer/puppeteer.js' - -export class doctor extends plugin { - constructor () { - super({ - name: '医药查询', - dsc: '医药相关指令', - event: 'message.group', - priority: 500, - rule: [ - { - reg: '^#*医药查询 (.*)$', - fnc: 'doctor' - } - ] - }) - } - - async doctor (e) { - let keyword = e.msg.split(' ')[1] - const url = `https://api2.dayi.org.cn/api/search2?keyword=${ keyword }&pageNo=1&pageSize=10` - let res = await fetch(url) - .then((resp) => resp.json()) - .then((resp) => resp.list) - let msg = [] - for (const element of res) { - const title = this.removeTag(element.title) - const template = ` - ${ title }\n - 标签:${ element.secondTitle }\n - 介绍:${ element.introduction } - ` - // 如果完全匹配,直接响应页面 - if (title === keyword) { - const browser = await puppeteer.browserInit() - const page = await browser.newPage() - await page.goto(`https://www.dayi.org.cn/drug/${ element.id }`) - let buff = await page.screenshot({ - fullPage: true, type: 'jpeg', omitBackground: false, quality: 90 - }) - browser.close() - await e.reply(segment.image(buff)) - } - msg.push({ - message: { type: 'text', text: `${ template }` }, nickname: Bot.nickname, user_id: Bot.uin - }) - } - /** 最后回复消息 */ - return !!this.reply(await Bot.makeForwardMsg(msg)) - } - - // 删除标签 - removeTag (title) { - const titleRex = /<[^>]+>/g - return title.replace(titleRex, '') - } -} diff --git a/apps/hotSearch.js b/apps/hotSearch.js deleted file mode 100644 index dc83bf4..0000000 --- a/apps/hotSearch.js +++ /dev/null @@ -1,91 +0,0 @@ -import _ from 'lodash' -import fetch from 'node-fetch' - -export class hotSearch extends plugin { - constructor () { - super({ - name: '热搜查询', - dsc: '热搜相关指令', - event: 'message.group', - priority: 500, - rule: [ - { - reg: '^#(热搜)(.*)$', fnc: 'hotSearch' - } - ] - }) - } - - async hotSearch (e) { - let keyword = e.msg.replace(/#|热搜/g, '').trim() - console.log(keyword) - // 虎扑/知乎/36氪/百度/哔哩哔哩/贴吧/微博/抖音/豆瓣/少数派/IT资讯/微信 - let url = 'https://api.vvhan.com/api/hotlist?type=' - switch (keyword) { - case '虎扑': - url += 'hupu' - break - case '知乎': - url += 'zhihuHot' - break - case '36氪': - url += '36Ke' - break - case '百度': - url += 'baiduRD' - break - case '哔哩哔哩': - url += 'bili' - break - case '贴吧': - url += 'baiduRY' - break - case '微博': - url += 'wbHot' - break - case '抖音': - url += 'douyinHot' - break - case '豆瓣': - url += 'douban' - break - case '少数派': - url += 'ssPai' - break - case 'IT资讯': - url += 'itInfo' - break - case '微信': - url += 'wxHot' - break - default: - url += 'history' - break - } - let sendTemplate = { - nickname: this.e.sender.card || this.e.user_id, user_id: this.e.user_id - } - let msg = [] - await fetch(url) - .then((resp) => resp.json()) - .then((resp) => { - for (let element of resp.data) { - if (_.isUndefined(element)) { - continue - } - const template = ` - 标题:${ _.isNull(element.title) ? '暂无' : element.title}\n - 简介:${ _.isNull(element.desc) ? '暂无' : element.desc }\n - 热度:${ _.isNull(element.hot) ? '暂无' : element.hot}\n - 访问详情:${ _.isNull(element.url) ? '暂无' : element.url}\n - `; - msg.push({ - message: { type: 'text', text: `${ template }` }, - ...sendTemplate - }) - } - }) - .catch((err) => logger.error(err)) - return !!this.reply(await Bot.makeForwardMsg(msg)) - } -} diff --git a/apps/query.js b/apps/query.js new file mode 100644 index 0000000..560b980 --- /dev/null +++ b/apps/query.js @@ -0,0 +1,199 @@ +// 主库 +import { segment } from 'oicq' +import fetch from 'node-fetch' +// 爬虫库 +import puppeteer from '../../../lib/puppeteer/puppeteer.js' +import config from "../model"; +import _ from 'lodash' + +export class query extends plugin { + constructor () { + super({ + name: '查询类', + dsc: '查询相关指令', + event: 'message.group', + priority: 500, + rule: [ + { + reg: '^#*医药查询 (.*)$', + fnc: 'doctor' + }, + { + reg: '^#(cat)$', + fnc: 'cat' + }, + { + reg: '^#电脑软件推荐$', /** 执行方法 */ + fnc: 'computerRecommended' + }, + { + reg: '^#安卓软件推荐$', /** 执行方法 */ + fnc: 'androidRecommended' + }, + { + reg: '^#(热搜)(.*)$', + fnc: 'hotSearch' + } + ] + }) + this.catConfig = config.getConfig('query') + } + + async doctor (e) { + let keyword = e.msg.split(' ')[1] + const url = `https://api2.dayi.org.cn/api/search2?keyword=${ keyword }&pageNo=1&pageSize=10` + let res = await fetch(url) + .then((resp) => resp.json()) + .then((resp) => resp.list) + let msg = [] + for (const element of res) { + const title = this.removeTag(element.title) + const template = ` + ${ title }\n + 标签:${ element.secondTitle }\n + 介绍:${ element.introduction } + ` + // 如果完全匹配,直接响应页面 + if (title === keyword) { + const browser = await puppeteer.browserInit() + const page = await browser.newPage() + await page.goto(`https://www.dayi.org.cn/drug/${ element.id }`) + let buff = await page.screenshot({ + fullPage: true, type: 'jpeg', omitBackground: false, quality: 90 + }) + browser.close() + await e.reply(segment.image(buff)) + } + msg.push({ + message: { type: 'text', text: `${ template }` }, nickname: Bot.nickname, user_id: Bot.uin + }) + } + /** 最后回复消息 */ + return !!this.reply(await Bot.makeForwardMsg(msg)) + } + + async cat (e) { + const numb = this.catConfig.count + let images = [] + let reqRes = [ ...await fetch(`https://shibe.online/api/cats?count=${ numb }`).then(data => data.json()), ...await fetch(`https://api.thecatapi.com/v1/images/search?limit=${ numb }`).then(data => data.json()).then(json => json.map(item => item.url)) ] + e.reply('涩图也不看了,就看猫是吧, 探索中...') + reqRes.forEach(item => { + images.push({ + message: segment.image(item), nickname: this.e.sender.card || this.e.user_id, user_id: this.e.user_id + }) + }) + return !!(await this.reply(await Bot.makeForwardMsg(images))) + } + + async computerRecommended (e) { + let url = 'https://www.ghxi.com/ghapi?type=query&n=pc' + /** 调用接口获取数据 */ + let res = await fetch(url).catch((err) => logger.error(err)) + + /** 接口结果,json字符串转对象 */ + res = await res.json() + let msg = [] + res.data.list.forEach((element) => { + const template = `推荐软件:${ element.title }\n地址:${ element.url }\n` + msg.push({ + message: { type: 'text', text: `${ template }` }, nickname: Bot.nickname, user_id: Bot.uin + }) + }) + /** 最后回复消息 */ + return !!this.reply(await Bot.makeForwardMsg(msg)) + } + + async androidRecommended (e) { + let url = 'https://www.ghxi.com/ghapi?type=query&n=and' + let res = await fetch(url).catch((err) => logger.error(err)) + res = await res.json() + let msg = [] + res.data.list.forEach((element) => { + const template = `推荐软件:${ element.title }\n地址:${ element.url }\n` + msg.push({ + message: { type: 'text', text: `${ template }` }, nickname: Bot.nickname, user_id: Bot.uin + }) + }) + return !!this.reply(await Bot.makeForwardMsg(msg)) + } + + async hotSearch (e) { + let keyword = e.msg.replace(/#|热搜/g, '').trim() + console.log(keyword) + // 虎扑/知乎/36氪/百度/哔哩哔哩/贴吧/微博/抖音/豆瓣/少数派/IT资讯/微信 + let url = 'https://api.vvhan.com/api/hotlist?type=' + switch (keyword) { + case '虎扑': + url += 'hupu' + break + case '知乎': + url += 'zhihuHot' + break + case '36氪': + url += '36Ke' + break + case '百度': + url += 'baiduRD' + break + case '哔哩哔哩': + url += 'bili' + break + case '贴吧': + url += 'baiduRY' + break + case '微博': + url += 'wbHot' + break + case '抖音': + url += 'douyinHot' + break + case '豆瓣': + url += 'douban' + break + case '少数派': + url += 'ssPai' + break + case 'IT资讯': + url += 'itInfo' + break + case '微信': + url += 'wxHot' + break + default: + url += 'history' + break + } + let sendTemplate = { + nickname: this.e.sender.card || this.e.user_id, user_id: this.e.user_id + } + let msg = [] + await fetch(url) + .then((resp) => resp.json()) + .then((resp) => { + for (let element of resp.data) { + if (_.isUndefined(element)) { + continue + } + const template = ` + 标题:${ _.isNull(element.title) ? '暂无' : element.title}\n + 简介:${ _.isNull(element.desc) ? '暂无' : element.desc }\n + 热度:${ _.isNull(element.hot) ? '暂无' : element.hot}\n + 访问详情:${ _.isNull(element.url) ? '暂无' : element.url}\n + `; + msg.push({ + message: { type: 'text', text: `${ template }` }, + ...sendTemplate + }) + } + }) + .catch((err) => logger.error(err)) + return !!this.reply(await Bot.makeForwardMsg(msg)) + } + + + // 删除标签 + removeTag (title) { + const titleRex = /<[^>]+>/g + return title.replace(titleRex, '') + } +} diff --git a/apps/recommend.js b/apps/recommend.js deleted file mode 100644 index 6211990..0000000 --- a/apps/recommend.js +++ /dev/null @@ -1,55 +0,0 @@ -import fetch from 'node-fetch' - -export class recommend extends plugin { - constructor () { - super({ - name: '推荐软件', - dsc: '推荐相关指令', - event: 'message.group', - priority: 500, - rule: [ - { - /** 命令正则匹配 */ - reg: '^#电脑软件推荐$', /** 执行方法 */ - fnc: 'computerRecommended' - }, { - /** 命令正则匹配 */ - reg: '^#安卓软件推荐$', /** 执行方法 */ - fnc: 'androidRecommended' - } - ] - }) - } - - async computerRecommended (e) { - let url = 'https://www.ghxi.com/ghapi?type=query&n=pc' - /** 调用接口获取数据 */ - let res = await fetch(url).catch((err) => logger.error(err)) - - /** 接口结果,json字符串转对象 */ - res = await res.json() - let msg = [] - res.data.list.forEach((element) => { - const template = `推荐软件:${ element.title }\n地址:${ element.url }\n` - msg.push({ - message: { type: 'text', text: `${ template }` }, nickname: Bot.nickname, user_id: Bot.uin - }) - }) - /** 最后回复消息 */ - return !!this.reply(await Bot.makeForwardMsg(msg)) - } - - async androidRecommended (e) { - let url = 'https://www.ghxi.com/ghapi?type=query&n=and' - let res = await fetch(url).catch((err) => logger.error(err)) - res = await res.json() - let msg = [] - res.data.list.forEach((element) => { - const template = `推荐软件:${ element.title }\n地址:${ element.url }\n` - msg.push({ - message: { type: 'text', text: `${ template }` }, nickname: Bot.nickname, user_id: Bot.uin - }) - }) - return !!this.reply(await Bot.makeForwardMsg(msg)) - } -} diff --git a/config/help.yaml b/config/help.yaml index 86e9688..af63157 100644 --- a/config/help.yaml +++ b/config/help.yaml @@ -1,13 +1,20 @@ -- group: 医学功能 +- group: 查询类功能 list: - - icon: doctor + - icon: query title: "#医药查询 疾病/症状/医院/医生/药品" desc: 便利的医药查询功能 -- group: 猫猫图 - list: - icon: cat title: "#猫猫|cat 开始吸猫" desc: 猫咪图捕捉 + - icon: hot + title: "#热搜 虎扑/知乎/36氪/百度/哔哩哔哩/贴吧/微博/抖音/豆瓣/少数派/IT资讯/微信" + desc: 开局五子棋游戏 + - icon: computer + title: "#电脑软件推荐" + desc: 推荐PC软件 + - icon: android + title: "#安卓软件推荐" + desc: 推荐安卓软件 - group: 神秘功能合集 list: - icon: pic1 @@ -25,11 +32,6 @@ - icon: pic5 title: "#沃日吗" desc: 什么鬼? -- group: 热搜功能合集 - list: - - icon: hot - title: "#热搜 虎扑/知乎/36氪/百度/哔哩哔哩/贴吧/微博/抖音/豆瓣/少数派/IT资讯/微信" - desc: 开局五子棋游戏 - group: 工具类合集 list: - icon: translate @@ -38,12 +40,6 @@ - icon: 百科 title: "#百科/wiki xxx" desc: 百度百科/搜狗百科 - - icon: computer - title: "#电脑软件推荐" - desc: 推荐PC软件 - - icon: android - title: "#安卓软件推荐" - desc: 推荐安卓软件 - icon: tiktok title: "xxxv.douyin.com" desc: 抖音分享实时下载 diff --git a/config/cat.yaml b/config/query.yaml similarity index 100% rename from config/cat.yaml rename to config/query.yaml diff --git a/resources/img/icon/translate.png b/resources/img/icon/translate.png index 9ed66f3d057ba2bd27228c04ea3d9fea997f13fa..489be4f074bc75c264cc8bbb5499fe7fb0b6a001 100644 GIT binary patch literal 6857 zcmX9@byySL_f{A<(v1#*G1Ae}py*(vw7}>NsS(mcV!(&NKmi@1NJ@jGbT?AcjUXZ2 zDG2=V`}^a@xzBl?bMLwLy!YJqMrms*Q;;%|-nny!LRAH!d)xN>D?sAg`m14a>YY1G zajFQoo}c-S8JU-9r+?}+-qyzDd0_}y2f)^uD4fbgEghu-x~ER)%Jj;Q)0N7G^v!TD zgY0LjmujGJYI&g0tTDTLZ@nW01tn1eRW32Xdjh#6r1dvG6F^%#@y>-}S@!&f?_^>@ zccbrKqpa^7Z$Tn81H3*Dvovpm@yM!Grp0}j4)z8cE$D>?;7go+1>1rbJwe#f#)QQ zji6Fam3Dz-X21Cs8DoG> zX&9gKr8$`^_^pSw2*YE(&LuI-6-Ca-IIE%(H7A(4RiG(G%4-kCMa(>WHK5H!4=qwA z^6+XPUT~I|{NSHHJTS9v5Zr>AAd(VmnDwWCG13rlVZ?IKmi$3M+G>ceX8aSup`8~E zc_${_*NM0D>R;ilDyaL-Az4`GhjxvX^s+Oy!F)Y}g>3pOr1wmf2g3Xdt7r5Ije+hn zGhgY(zRZHfxvaw<+ zku|s)pS=2@FkS7i%ZvETf1MscK=X?ku(>smGxJ@h98LC>NyUgk8M+gwnwgR|`l%Z9g2#Teu$^cq$^;>2Fz=*qjLy9n>m}jEc zIwfH-4$0>lmqX;4STo)>Bv>IvCk&Vw_pi@xv;89Cwy&`c#mjd=FnJE-o)u#iBm z>2PS^_#+?~A%M1�l!=+fqTXY7-%XUh!%IVIcTexw0y=GHRl6Z!c}Cb{R%<^NOe* z)SxEcK*p5{JDhsnxzy3bg3AqFQG5u+(vSTuUWT;MM@g6~XU2ZHGT`Dr1k+r=QV&$t za?~5s2A;nBFd77ge}?LJdagnPJv8cACbN(RI@$YTTpgNOHFfW34V7;aR!%)xI56)O zc+;C_&9dY(WA%G70BcMK~ z`N_0ZwkQ~(<2<8y4%Oe*SD{6J%`9-vr7I1BR9E`TZ7nA0DcxWpq{*YOwraU~QI0{s zlD1m~rbi$Cl9@xViNOfIQ6q~id5KRqO30TuWabli0^hR)W~JyXMg+8_TyeVAC~9!q zda#pp+EvMjbzji4s~J0qO=E5g1!kUOOQZJ%8o8vc_7z;tx@h+>_M1^pPqk75I);o$ zzzC0{>D!6%{kHMbI#lnhPfrOj%wLGvS?DA0jDj#F{n&)kYK}ICjvil%uVc(%q^HfD zPsAe`N7ZLab{_K!(Ag=uIMhz6^q2M8J95p37_d!-x$1^rXBh=)t*5d#F|zB*&%Q{OZUR#SAzXob+{}i+t}UtDJctld#;e3FJgG$Q^HR#gaDt*m?tN!$ZH+A z#7XjP0+l#$LCUkW@2+nC0xEBfR;6CYxt~fx zE#6o!2iLJO&D0w)DU9c5&)004xLsikSZ$1@8scP#W@z{Iz zp69&ki4wX{7%vT=%(H~4?$K9~)(Ljobmr=ILCUmbE{SxD3Jr&@!G0DgF;j+N4}q_< zGt?at-x@2{d^p7o!;60IwGYT}zDLphKgPwffNL&2AMG|J4SpI?(gFY+wc4*y(-9QLVrgtV00x`=ywYbjR%Zd!}faj)Qq2A*vN9F1N^P02RJrpJ*@BtlU0 zg+uj5KJ@t`Pqdhg`V{06UvH#V0X(+MBYqB)*Q!KtPU75Iz3PQHcvs{rIk7xvur`#z z>x-|5&pR6>gNAfxG=Si-mt^7Z_HmF;AYgjX|h5f{9n4r%3E5p!*H3um6SNBgQbl58Xi@bWb}(LX?7C->c(Z*N^M zxs7EpdMoCNtpikTf1%@M$vhH4k4wi(fEH7$;4HLwN``y(qK9e1)Anke?Jt%)K;3*a zt(|1weI~e zZ{hUHx*Vs^?zD;_TVx-q13WMZ3wHceqTBV-QZzHWdbrXq`{^h65Hqgj*YC46MLbR4 z0GAkG3#7fCC7C<+C#-BjbQbSXoKUQniW$lKO>@PTfpXk_XR$6_y_%>QW4fsoR7E=c z?{&TD8SJ>;NP<4!o#pIOYPCtJpc4zx{pBT~UWKM5k?dQ7>c6gYQ2KmeKB-h%_zVzF zn#*U^RD%TjR>ZZR`9EMvUGD`UK#uOJbhar5G+J-3$gRll>5o{73<}Ov@j6~8o}9RU zrOIX*Q*=pOeL>Pf;Z}I$CJS1=jnsyTlWH!F`Kqqs{_&wz8f6S8-IBa|hw`E!_Vc=a z5#7BARCyJesI4G%a6>g#jwmX{#l#OE`4%p@+wOP4z^erkGMa59aMagYJI+G=RF98M zRy(w8cPM*xMvwB=O@+W1q>509v#pu0{I}->ItNocR5mwrAH((B!QXri`_`?4WDgPTxB@!9j^CU<}eza-|Zk*@e z%B7+i06e{i^h;w?j`RAh$zLVpX)~$T3wsWdJ%bHzSP&4%A`$3+TZI=18LIaErTxJ4 zyJdntJzKZA>4K}oyL+?EZxp_Nv8&YAd{Yi6dsSjhP5f$A=J&~-VloTc&OCo1PVWv` zq+_2)l1~(J&US(jUVI0RVvt0)RGyBW+P~ILfWU8;zK9qfQ1h~DzLR#v_>piP$8UPd z#D7RKT9r-7dlnp51Rb&~9Zw)v(d)A|Ll2Bz;0RPy|g^e!2BauaH_ zTha*n;mpECLiHXkt{w;aU(A;pHj|Jo?!_c&9L3-!_vQ9IrdDSbwji%wl(d{5%<2wo zb&qe%J(6xcVhe?MqgM2d4Wu!E4Rgh|f6yTAZTBNeT%^f&t*2%|#IBb>;wIg!t9c1N z=JpFdhUQ~&x7&RBHl%Opug;=O|uG`8_)bCKsPUExgy;p znDv5Oz1vS0+9r0de(&o4&P}Sl{<#Gy$x77)=yWzlhbP+|K=H%AoON<_!5$-ivqQ&` zqVJHUhS#QCgl>9f>=LKd)er2{dUOqkTkegUf4;wwd27t0By-oEQE=e2ic!dr%GPf0 z<70zBbtX82?0wwPJpuc-l>My8=PrGCUOQlB0-BacvTyy%xc_~hB71t$GBa7aAKPUg z6@&gOxtKJIm8fWwZ@^A3171kaXG-YwSf5%(Mb94aK4Zk>{r;c#rT1FjjKgf5tI0_} zH#~l2=^A^^qT(6SU4|?$uq_f#Q`$aWUg%3I6+maW(R0(Dol$IT z^2}k?p3C5vwcR?x8;eu>)Tu~u!oXQe80MEj4i<#g@{SvvyG)|r1}<@=A1%b6JOtqx>pK*8$+Kkdq;is z7P=c|V|t=d>I|uFFVYMHSDHwk)6uQHF#CR-QA!06xv-M}GS^A4u~LWSTpq|-T0IOLuDX9)5`Pmxke+*rF^wZ5yr zA`Yk5*V(2{U2X$v8b;Hz zy3~Bu2S1ipSM-+mdO;oQMe#7|v)JdOPnulF^q2z~cwg6eN8T`#mK({`8*tqFkdhox z@@H>f{3$70sYM%w+$c)BZN7mZ$kXx}ZC| z!`iHgM2xddmsD;Mu(*@q%E&O3Q|7VJT9sE;bX zE{3A32v+F}iP^viaU3A)ZCO*fX9ZQt^qz-c@n!IMhw)=?_d27O7up{YzHU#17}z)e z0*fYpZaADMmz_Gw4%9^sgh(6CJf+v3bWP^MTMTMN`I0tGf$gU&Wfj_o=I@CEt3s_IkVZ_WH`{ zQ(yXhajG}4IpM~U0`mV)aw&eUbA6HIH18=COGZo|nC&fXoj97d0qM@cz<+UatpKgSy z(gvT#U{am-D*`$~@bRXU+rOXRY^Z0XsbP4RqY43HYaQ4B)|hN}-Bed*DO7&`aaLD! zGI2|Ccc@6|HdRzEo-R4f$d8$^beBSr8 z0xSy{p;(xg`A#u>FKf3cjE9nv6}P@%F`XanFdx){;D77+WrE*ki{WAT=F&D}jfp^k z*K3vgP^=T3jtW~naKY1QX?1R^6nK-WGbreM3G{WY%d`4n#V!5q^S0A<3Q$+$o48Bg zCKPXmbgy0xsIf$n3#}X!eX=YYJ=z(lA`y%crQ&S$yW4T`9;OY3>y?EU1WcJ`J$k`N zcFtx^SK~Ri5Iz+(lu)}$z#O}Mcwjx;^G!;XNCgXl8N#htwxNN_`2ql~tcv+6)s<%n zt%d{nK2c>9AES^%`?&%+-Y<$ zoW98O@66fn7~ek2y{_y(Tks!ErSw1ZXqNV2WTvR~`*rG^q^iz#c05(Q?1TVyYb(~L z>xb_(ndQ;Jcud`D8KxZmcRhqWXKWI zm%OUB-_!>AwOspYI4Gs9@O38us-KV{n++$YNz?)Y}_NpI8u72OGj7ZuT zB`Kd_;fn+=(U-F)I@A6lliX@9P4Q+n7j zQt+tW7^N0y8~wciGLLj$<)lR@Cj9#+{Y~7sB5c{)SkB6l%sSVpFe`d*0D@rLKr+Zq zpC#snYO`Bz*k_A2xAv6Sn67^!ITab4KiQ~|73>Wz4TNQgj*^sc>YKT)R2x8n1JJ|J*l5IU5*$^$OwIDUFi;xeTnM^)Dl zbjvHTBwOipU%!F&m?Qbnd`pgk<7J{*uY`eyis#(_GL_{{WZ1BpX5lhW7phvfhRU*) zw$P;JO|4bk?-ONa z>RD((B`>!R#b(u9Dp8z3#n!=z`Sq2uI-i8&VgdpKU&P3?8wZ=4FRj>qc2qfl(TNse zbSJ@UNTO88XUIJ7MAN`WWX(FFn8iyy&MGsj;>fy4N=sPot>#Z}@p{w7*upYvUsvZK zqj%s=+0DqBBEb$jGydw%P1RQ#aq$I=yY$zu4Pp-3V{ZhdnAgG#O8CZf$HC7Med261 zni^M8g;ix77lJ;B`^9yr1g0V^B*6G`LLxr<%*fBL_kMWhtmX%l@ zxqfq;yi&lBcFb38FHD!~K2XfdeyzL4kU-;_-_Lc$@%E`2nN6eG#UUcnDijax4`x@w z)F_BxDNma7EsY@rk>Fk3C1t81LrVtJm7aVEFcT{- zj1FY1=oX^Yi5#1XyaPtWXMn2Sr$o0HmoXvYqS@bbK!)cp84Y-u@;~%&dqVKgh!}Pv zC24uk)S2`CvY7OUN;EkD3wfmdo|Etwwh1dB@fCr*aL}2Iet6? zE&7J&)pGVz6F{)>a`+$^dr1HKQ;beiVS=X4I1#}AmO)QCaV#s2g9FgF{A%2j|MW6C z>zI__If=oXm^>?-j`5JS8O0aipceF>ID9KUaWAwy?OCl7V|xZ5nWOnldOKv;4v8Hu z2!z$f0jY{u_)T&<14{pU=;>qHB=F}EnA1>ps_N&|^bue=u(%EOpRV|0(&Iu?^db3| zR|rsqhC1$Klet^!iBQ)chiU<}Q!04D+vY7gc*1>c$4^_)dacw1elr28a^sIb!|?VX zEn$NaT?TW<0#;*u73X#1({ay1m4}EpHIb8AIf04S#C~ah97UYf7CTYfm>exEWW3eX znD3k62jc8}NZ13y#}d8{CP#^7L@$XC=+O^Hwq!-uI;7Fs(ZW=ZNJB^7jCZv8Z?|#y zCczZ|!?rDp**RZnh=nE%A>D6FQ_$HddQhxs|Lb>3IB)+UXv~Vywt-olz<5K`XT5&} z2+bc^x~-GI(sKgMVq+Q|RZ;PdWWQrafz%@Nh%o;UYxI(`!hp;zACeo@^~Rn$Zj%Ufdp4{TZ{ A^Z)<= literal 5422 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