From efacff698d25d8e3871c367fa12a46a4ba0781d5 Mon Sep 17 00:00:00 2001 From: StarHeart Date: Thu, 11 Mar 2021 10:55:18 +0800 Subject: [PATCH 01/40] :bug: typo --- nonebot/plugins/single_session.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nonebot/plugins/single_session.py b/nonebot/plugins/single_session.py index 30fdc496..42df70d7 100644 --- a/nonebot/plugins/single_session.py +++ b/nonebot/plugins/single_session.py @@ -17,7 +17,7 @@ async def _(matcher: Matcher, bot: Bot, event: Event, state: T_State): current_event_id = id(event) event_id = _running_matcher.get(session_id, None) if event_id and event_id != current_event_id: - raise IgnoredException("Annother matcher running") + raise IgnoredException("Another matcher running") _running_matcher[session_id] = current_event_id From 0fec9915decb0f4193ae2ea8118508248d461d97 Mon Sep 17 00:00:00 2001 From: Artin Date: Thu, 11 Mar 2021 13:21:18 +0800 Subject: [PATCH 02/40] =?UTF-8?q?=E2=9C=A8=20ding:=20send=20by=20webhook?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit close: #189 Feature: 钉钉添加 `send_by_webhook` 方法 #189 --- docs/guide/ding-guide.md | 56 ++++++++++++ docs/guide/images/ding/jiaqian.png | Bin 0 -> 102378 bytes docs/guide/images/ding/test_webhook.png | Bin 0 -> 76694 bytes docs/guide/images/ding/webhook.png | Bin 0 -> 102603 bytes .../nonebot/adapters/ding/bot.py | 86 +++++++++++------- .../nonebot/adapters/ding/utils.py | 14 ++- tests/test_plugins/test_ding.py | 51 +++++++++++ 7 files changed, 173 insertions(+), 34 deletions(-) create mode 100644 docs/guide/images/ding/jiaqian.png create mode 100644 docs/guide/images/ding/test_webhook.png create mode 100644 docs/guide/images/ding/webhook.png diff --git a/docs/guide/ding-guide.md b/docs/guide/ding-guide.md index 7e1d8d01..cb710d26 100644 --- a/docs/guide/ding-guide.md +++ b/docs/guide/ding-guide.md @@ -11,6 +11,10 @@ - [群机器人概述](https://developers.dingtalk.com/document/app/overview-of-group-robots) - [开发企业内部机器人](https://developers.dingtalk.com/document/app/develop-enterprise-internal-robots) +钉钉官方机器人教程(Java): + +- [开发一个钉钉机器人](https://developers.dingtalk.com/document/tutorial/create-a-robot) + ## 安装 NoneBot 钉钉 适配器 ```bash @@ -93,6 +97,58 @@ async def raw_handler(bot: DingBot, event: MessageEvent): 其他消息格式请查看 [钉钉适配器的 MessageSegment](https://github.com/nonebot/nonebot2/blob/dev/nonebot/adapters/ding/message.py#L8),里面封装了很多有关消息的方法,比如 `code`、`image`、`feedCard` 等。 +## 发送到特定群聊 + +钉钉也支持通过 Webhook 的方式直接将消息推送到某个群聊([参考链接](https://developers.dingtalk.com/document/app/custom-robot-access/title-zob-eyu-qse)),你可以在机器人的设置中看到当前群的 Webhook 地址。 + +![机器人所在群的 Webhook 地址](./images/ding/webhook.png) + +获取到Webhook地址后,用户可以向这个地址发起HTTP POST 请求,即可实现给该钉钉群发送消息。 + +对于这种通过 Webhook 推送的消息,钉钉需要开发者进行安全方面的设置(目前有3种安全设置方式,请根据需要选择一种),如下: + +1. **自定义关键词:** 最多可以设置10个关键词,消息中至少包含其中1个关键词才可以发送成功。 + 例如添加了一个自定义关键词:监控报警,则这个机器人所发送的消息,必须包含监控报警这个词,才能发送成功。 +2. **加签:** 发送请求时带上验签的值,可以在机器人设置里看到密钥。 + ![加签密钥](./images/ding/jiaqian.png) +3. **IP地址(段):** 设定后,只有来自IP地址范围内的请求才会被正常处理。支持两种设置方式:IP地址和IP地址段,暂不支持IPv6地址白名单。 + +如果你选择 1/3 两种安全设置,你需要自己确认当前网络和发送的消息能被钉钉接受,然后使用 `bot.send` 的时候将 webhook 地址传入 webhook 参数即可。 + +如我设置了 `打卡` 为关键词: + +```python +message = MessageSegment.text("打卡成功:XXXXXX") +await hello.send( + message, + webhook= + "https://oapi.dingtalk.com/robot/send?access_token=XXXXXXXXXXXXXX", +) +``` + +对于第二种加签方式,你可以在 `bot.send` 的时候把 `secret` 参数传进去,Nonebot 内部会自动帮你计算发送该消息的签名并发送,如: + +这里的 `secret` 参数就是加签选项给出的那个密钥。 + +```python +message = MessageSegment.raw({ + "msgtype": "text", + "text": { + "content": 'hello from webhook,一定要注意安全方式的鉴权哦,否则可能发送失败的' + }, +}) +message += MessageSegment.atDingtalkIds(event.senderId) +await hello.send( + message, + webhook="https://oapi.dingtalk.com/robot/send?access_token=XXXXXXXXXXXXXX", + secret="SECXXXXXXXXXXXXXXXXXXXXXXXXX", +) +``` + +然后就可以发送成功了。 + +![测试 Webhook 发送](images/ding/test_webhook.png) + ## 创建机器人并连接 在钉钉官方文档 [「开发企业内部机器人 -> 步骤一:创建机器人应用」](https://developers.dingtalk.com/document/app/develop-enterprise-internal-robots/title-ufs-4gh-poh) 中有详细介绍,这里就省去创建的步骤,介绍一下如何连接上程序。 diff --git a/docs/guide/images/ding/jiaqian.png b/docs/guide/images/ding/jiaqian.png new file mode 100644 index 0000000000000000000000000000000000000000..8895d6c6d866cd6049642da40dccebdfb94429bc GIT binary patch literal 102378 zcmeGEWl$X5)&>j%!9BP`@SwrnLI@VzA!v}`!QCymLvVM8;4;B2xVuBJ!5M6rckUz4 zc}{ZISKp8K&s+6ORafuo-o5wIYpuO{_k=4eN@Jjspu)hwV93h6Q-y&+aD{<^=SPNv zUZIY~MT3Ds-L{mJRF;*Lq*8XYH@CDggMpC=PfkTrPaG!jKY+}T!s1X<(OuKaF!(1; zO1>-%Dh;NMQ-1qFqC0eC8?_phnmV_7v;1pd1v8bk1dFzc%_5UY5d;vnkOV zOTP<-dsn;<7VRuf2)c(YAO^JGNyD9buHiUUp95 zw3=qx(|ky!MxhpdGj5sqWR|H$PgEsnj7xqPS<3iNb2X`Nq0GzQN zhav5IeoAAd?6^^BqHr{GGc&W;E9{>AubuEPsN}|)BRSs1;C{b|X|dFd;@#mkdiXPj z1X<43R>;Bpll}0B`iK5EQiwW?7!mKx5$pXxob{4PEQ)EQqW#p*!C-hadU+<6*aBtLgT0?LdNVF&LMZgc@@U&RHt5Sj(MALVI*WqVr02><{qu@ z#4@Me-OSEAAP4eYA!^!y8l*CiVEUf%6d^4@u9Jm9u2nOJZ2YkC<%r0K14QW$9LNX( z{wOBm^l>jp?2WfnTr@@+EZRL`~szByO?ME`y))lo@g4 z{1fuHWzb*e?oH~J5;27^<*g}`UvoK=3BJ$|Y|DLAX6Huk3=r*Q{DwYbtiOntjnQDl zO9m(1i?+$_&XI{k_=9u{wFOZWnXlVollh#y1<4mBHWwx$*d!NSd7hDAgb+VQ?p;xS zVQF$HwYoq#;+(&gluNE%o~N>8snTbb^icEsswv=HeUoPn-|0ipd%XozR^qoRDT>J!1P!h_$&Y(Rh(F{1pb- zdhLDyfAE^D)aoyao*-j}&GhJO34ht*XH$$}?z0^v@5>rk>$}+z-IjIt=@1cx$@xmS zv#>dOfplJS&UZ0!Q2?(Ih|(R6t+}QpMo%qQr*Ns%L;9+LKyB2JS+e3?h0bvuukMPfSN1K= zY1Z;VW0?80Mcc&g7)!c`>HZ6H?Lk!rRf{yms&S31m--@W;`-r0*R_T=Nl$bU`%dRh z&Q3MYpa*UrC7*cTv}a2&;Rg)*jI`lOqwG(Zq`!#Zi5bydNu5ceNYaT1h^jekxV>%O zahnhqkt7p0l46h^lZFwq^HuZt8ohmEoQAB>l;-@+`wb6QG?%``vW=iovE=~AC|3oa zm#HELh||!<;FIqPoOO5oQ0=0zLoZH~b3LA}rj9{#U{z+-J58a=HgjY1)^VJP^0YZy zg(h>o1MLMp(DECbx3=?(+$$aFw!%UVuEQrWOB*&>He9x#MbYnS&1g+}pBAh@1MAb- z7KUbiD*@Zso3$f({acL%$pt?gN_IpT($&7r2$r~()Qq!@s~#X8NDzKXHBGfjwIj&F z?_U1V_AA2S#zBA2v*#u;qakDU^y>;Ga2`kuL|R4K|2FpW=Mq=RMDJwKaotM6VB%rg z$$f!EY-#}ELdC#wS#vz!hF1;9sR=5B@0ZV~JXl$&r2H#rGcd3u4f%yf)-*#JeUkn?zY^{<2Wl$N41kJu3 zjIIoL4TJVmFOU!@0#&=O)MIC-X9Kunzq48fy=6CU{UWo=T#nbNh$Xj?{QQbW_>>@d`kAjpQ>#)tx!dJU=w2sXv$*PYxLnk7ziZP%93~jj-E}ThX)AxD z+n>Om3+T^&A#q_^@LA0VH{|N^O|$L{&o*>REzygzuTbBi|#w8 znb{*#fd)dw!_|u`Pz`k#{|N4E3!hquXZEsa5fAeZ(o zX+QRdE~n1khtp#K{zW7k;R-=2q2JPvl`r>5?UYQuL@VFg>YNg)NGE+kgGl~*>(6_-Lfb5j0kCnYDCWo z&K*~Xoot@9w9a^0^s=q#_qU5e7#}Xyfj`z1c#3)U8W)!{mo2IC2ohdf~C1MzUnBi0A)72Wy zE9vFf`WW6PlS}y6^E%U?elUE@zYVk4nOGO)JNtNWA9qE_4*!vVr5niaGqtlFE^n6_ zV`#2#*R}0kbXYz!_h})sn*7)qXwwFC?A!}Ij-Ia;&@Zv`ToZO0J(~|%$z0I_{_LD_ z;oApx0txKwM`4-?%HIYvX5{p9T4Y<*}nVzl6)~$F`dXC=Rj{JAFH~a^8#h zEDj!f-M62B*ue-Bj1wa{$6__4wUqoEL~q=8`kx5F>~!qXVW^P2+t?$m{Tko<-pAOA z-iuyvO;OF@x{Z6qjq8TcpxY_UOB$thi%v?g^0mtG&a+ab5_!&!s2HXGB?72uyP|(# z-u~4FMYLITv}}ti@Ex=NTg1$C)E^l>GJcsbFsFzxefNprn_%%o`#=;pNH~MnIf?^f zZWF2hFEf~6gBM0#bkoz+&t*gHRDlt{)?iOIbIBk$I^{v&LiT#X>2zTVQZH*vm}+?c z8oE!P3K~CsGPI62rG%SI5n5V^jik67_@)H&OKZQmd1)^QFl;&jDItM~23??&b#EN_ z!DUsE@d=FSkU*1O8#8TLa|Hz$CTJTO1|F6K1_9cFg&v}?r2o@?56cMi;vd(ciE@}F z4E(?PC_>MF{o`4|v3z^h>XgdS!wp?%vwj?z+@_FxeJ=)1O5D1^rzh-tJ71-X} zQ_m79`2{%v16%29J5K5$L}-RfL`1}qL93@TtvOq`m33}z&VE$g$7TGr+hneUqK@VI z6T*mUvtm{~XFUK1dA6)Uf-dQ@o#0}b@gVC$GYH%!;CE8rR8eo5e6?hHFe5u&Srl_X zH?dw<$7Mugae%4#Q-9^=VxpN7n0b@UnmxO+WL2>BaLu6d%`}E;--%`ECz+AI!+(+9)-JwPOWafec0T5)9MTb~q zFc=}`86)d3b9%wD*1(zl_#b2bH4w}{hgWuhlR?L~&~Bsi=IBpr?OW>7S2rP=9I#ZG zC?j_gi1Jlz54CPI z$wdF>u>YPx{57_?31dk6lhDV452W*s341+iVrgBq60Eo{J$aRK06vm461yT7J;)Z& z&=)|NY2Cz!5Dfnx`u;gkvW&l-CS6Zq=|6zn%W48zq0b!;aw6&zKHYbWpvKo zJ3H2Pk)p4P)MXM{pagL0oK*j5AWIcYn zhHI53ApfYQfMd;_Yun9LYPDm!ozdRe;`-tI>_*O$;Q%to*M8LRXxrKT2tE5G>f3Qt z+JOwtN@;+HxJ?!@heP9mH`mt}lh#sl`|Ty#`0ks|8$`5vCd2(`t7 zNy!D`{&rr4X0~qH)~g&!J7Uk~FRrJ*yhWFYc~^*eCUhoT?3P~Ze1rSo%h!8vnqa2a zxNNloXl(ej-`aCvM*QD8`5`C?6Kh#xw6m=dnyPYxAe)XMgbv7@e#dbQWkLqtEsvP@{df^nz%SdLZlyh zHUJLv;FR@JWy}ZADfhv-LT1)-NwYOIG9dVLC0#eK0ZH~?dQWB{uJLUgo~eX}#!)J< zJLk|QdnKXMb6X>^P;khLVd8YSon910t6P*A33HYv-PeJ=hdxv?C|29^rw<(JtyJt7^$M27433<&|9?q1oYuDx;l@pNovOdt-E`L8< zZFPFYBq!mP!O$c0VIh9?zaIWqQ(Fk$6g4-yUA029D$}6T_wlq@Hjy4I==(HVhN5*f zQr(v>i;h9cdoov{1)>l+nw7oZ({c@A#QJYFL8*ZWD5uI*1k-2OP!|NK6ugfn<1pFk z2}$-!;fW(!{%*U{?sn#Sx~yS`!HDrU4>!KgwOecRdAL@Y49W?`$lx@SqswmA4$qTM zWqW~${&~H_gDyKG{~x&W-=etFNB(ZVVW2B{O6mLU{J17r16Bb}+jTm;dEL|cI;37U z{>2~jDN7>Tv}}cfA8xEynrzMHnr*@*j9)p+jghJ7loXQv?wL?*D}Mo7hMr;D+rj5Q!NfVsPlDkeUtfSqYpR7TIcX&n7<P1ze(~&Xxy!>4@I#-*}6D!_a!U86SmEsiAE(_K~_ zn>|eOzqJPC%nC6eB212vmSeU`tH#_YH|6gn6D2+;hhBZGS?NiJ@i%mjQ7JpT%#FjB z95WJU{X0q!;p2$PyA^U#{}?4web0JB zV;&EL!V%$52CT%P43MnCm;Yy$f0J8!59QnHS!5UW-&g)K^qfDG0iG5Vb=W`jt9*q* z#WDNjHH7~s1Ld$#2CTl|mi{Zc|1YWK?&CuFz6ZrI|7VteldJv$%D~(vz49ON&R=|t z0m}E)*(wq@PO;BBSSuKe zqGAGn+TmQ>4?$**leV2(B~j2w4K718xtQ@rZ;anVp4Wp70X`bjXMb$6^?Z*8Me>zL zH@D}&5FDQGt3_&I`(x=3q^YcWq9>^@b=O1V$ENM9ArP2h`3(x`CcxiN@sh=0DeM# zm!YyPO6A8^$IhF1y_uurvr--r`Nk0dl%9MRuK+>{z*!|g|6*Q}U|Xw#Mno8FS&RPP4xgKZ5=AZq%&-TXP8VHif*%J>q{h-} zJ#UWKyPh0JlFIxRjURb!my<9%U35$)^^?Y(H#TYv>zxm!g8bsAFH zxWe-^MhUtHE?F}@y3HD`=PqOQlLh;8Fa_xeoWRlYIJ%)JN&=vKDqqvM25*Kv#^1%P zZ4D2N)Rczgly8iVIW-V(ZbToi8!Tr^D(uqfjH>2p1v5XBrxFFXKtmqZhR?A_s)5h) zg*51-%K--587q2|D&%&8ZNst=_?Fd_l2M<=tDuQRw}bY;mG|xca;(3a;ykpIjn=8q zi~!8(eOH4^U+Nj65n9_dSs)F{a(61kr})X(hJzo@UhR#ILV#SdAyG-_Ov8zMi>5x5jSmoN4qA zjaDIFAI=B?`=z6ZbhORB{zB8cKGv$LHeppSrlk!ex33v#kbiEtAmBNJfq(&!>uZgK1%u`uvv^|Ch|b$#(* zG2!uYxR>d7NPS|1f4DiV&_R%nAxl;=i|aZ++*B%=_?CBcbFw6P@0aTN+{K`eL>Jml z;chzn%i(2Z35B0}&KTd+Kuy@wmnjWCs|Y04X8ZQ3ss#g*;j%gX=X1Y$yUCfWWx)Ep zm{_mvg1+mW#N+*Fj^E8Gh97|8@kgd!v0{$Ohka&tlCOPnxKyOS`Lj9_T)o`+_Il}5 zL4yY3H39^&DhQ{S(9jRmzaU9Hv5^B>FNkdjf1-&I+IiaW)hp~I<+bPi1=J(qv%-Ut z5UtxRyuArF@C8@lGi#cj&85Vgt{^%o?f=Y;Rx4JZ6g(khwOOw48oWKdG(&3w9e3*d z&ywmtwgJr<^z2$g=y8a+Ty3&?>!b!JYJWz zrfOcK*FYt6%J-4@iw9&!DOL#lWTb)Sw`li6s77R_%KCtlfy8pLw%ec`h$qT>aLKm; zb{`Kp0jhuqX3KYhmRt~T1b1Y|W#7_=i){7DH9168x#4WLoUb9ZDjm0Pvc#0f9K%_ZM(I;}%tu1`V}wQ#vNf220aoB8`+q znt*_PSftL3mbBsz2k=3bF(azInU5Hy3WxQ1GuFz{wiSZ;%>U=kYlGvK85MMWZJ;x-1%FkX1O9p z4x8zQ6`;`B8^@n5;fcjx_cisdEvNaVCkH{I53?5JKaF*Wz)?C4($V4Lrtw#CFAE0t zSI6J~j!dP`@OT>z=L|vMJG5w0KHXX)WB!LvH#L59bG3MMh#n%sz7TS#t@Z{;XHnOK zA8)!&0-dP87KwUa-Y=x9yoGxgYX^lRr)mSgl{JCphL^wdFi#Bk{PeP`t5&wgAj7_E zX~EEsCLA_dqPYb+JY<-n)=UhXIC*~8z@Fv&bE`_X30dr7Vcj!T?9-k=NjCPnfsx0V zh?{M@$}t>qpnm$qWtE#KvZl`OnFBP_q!Jb@+7`M!oY9+GH_w25piGv)meVqs?9Xw6 zVrlkMZ@t;5ee3bFkX?tI-qZEeCj0Z_^Pui}rB-Yfq*mY2TE{O&^yJ5B^J^x8UJFB? z$UbEP#oON!(NY8WLU!-lLyH-UpURCrSJI3RG)zH$6>_>Jiw=*r%_r^mZeo~ThdB`7 za_deS10@4vuP?E~gCYCPA-eDmtzX_Z$OK?F9U7b5e2HNi*%_Ni(y z8@|o-QMMu9&!{#k$ivhORZo{0XE6dUMgjSY2>%_IVc_P1{jWom)E?f(Qmi>0q4{d4 z5X(uKeB-iM?;gzNbzWp|yExiH!U@vkJ6!@p)x{4@nz$p&YS?X7ixMkItrp4~-(y{a zB*Us=YS{MUwrB?N5~GEGcf|8{Tq04EV0!?Sk8z|g7TOCy z-(P_L&|IZ(tSL?Q-SCdU%6Ej&0IcOcI$bmx`YhZrv>4qT0K)VX);9km`JKmrizeaG z^#kAV0hi};#PWYeUTTCcH(D!Ya+g7U+-%=4m9ugOr?V%snWZr;F#H%l7p z5y29D7*b=uyHaDaU?E6k4WdsLKDpz%UA8@dMiFTKnDGS#Aq8vQJ_qx3gz_@rrE$_r>ga8|B;y2X8pweAoKP>4Cs561roXGsmMM6gTS$(WKZ|ck0%~aDq&W) zBe|L0Xh_d{N>U`EpQq($L%oTX{#X?9B>4+{p3L>u5Ig$y>GHJv^$JMz?pvN1MvY<3 zIys*~D=52NPWkR21EK+XF4>|9lGnEHyipX~uXR!ssxuCHcpk6^Phzi4HZ) z5%|z@pL7mZcfEDkoGOtCItPuX3E7|Aq38lv>wF?HGLXXXw6$x`o8t=xnIvcEquX6h z$#%UDhmjVzVcvaVLHpevU;0d}7n z$QUg9xpOW*cLC8gGV9 z;FjQicTH?w}F!OaVXq@3>B-EC^4O!k*$hehksQ~|L>`P3g-W$@xSBv|4HNj6={^}Z>k>8RpFjQ5AI|i+(VE^ z|B)@#zK0LRAT546U2d$85e2m6(OA2w{yA4_Fu*FEShWeO{@7k@KiFciSyk^flTKr3%aVbEJ1r4HzSqu&3& z7!$uoZmF(#Au_?du|@W;iyp?E+1kKL65elPxJ$Z;zsXN556r+RhSM z)da1pI3dpp!?_&IsuXEeYO7q8D@OlovE7P%Cua4G^|2Z}Y};tPFh6~{H;T4vtksHg zXJkEBuF(Pyd}}O##FWe$f+xwsX-^Xg3Qa zafOt!{e!(i-X%f!}06DrWb>c<)de(=MDEjyW`%7PJ=m*)vS!q8nq8IDxu!C*IX68 z#vvM9MYod#8+vfN@;9aX+v-Do#tj|*a>SR=(y9bsWcgboeJbdifv|8~h6kqJwl5+d zU;KlkBwpA#4Vg})3$ z4TyIW{6p}q5%^|d!+j^3CzQr1)NC|G_TE66Eo$^1kQJaxO+^adZx|<)jeZ@`VJC$O zE%zTL(8+V3cUjGqQ^!*48N(gTkI)u=cntXqKK%1>2Kp)8v2LdCE-8|(*O6=ze3FaN#lP*`~OMf|FhDN3;Xf?V!U#=-vC&S-@nfich>AN zKC;&eV%OVdF--T;y47UQ?u=%IR>oakh))lA zqeQU=_E7R*!WqIdlw3RArshc_ZyoldM*z5^)vB5$c>UAkty^DnorRrq`gdnun+z_= z+9{s{Sx{s!P6gJSBs6h%B&#^d@-UHgP<8^|f$K8Z_mD;g+9a}q*=G& zMT29zy%?~|H;2osykXByN9f8Xt}EweG=ss~S&3){tJugmzhz;AV~CnpXOy8&G`5vjoMw${DqDS%zN@6^EVf0z zV~H#pXitdDMT$kTx;lo?O{?mfmw5Bk;e&EHVAJ=pTIj*c+La|eXSFC#F}cjulx5%d zxoyEhnv``GK&2CErZ_XNnC02ctEW8r-ZqQiG%y;7MJd<|sJqQ!dy}y3z;lQmxD574 zSWZ8ZaYxF`S_gP0KXyAA1P#PkX<*FMh^;7Vrz!PEp~SFAr#Jnyi_zNRDSIVk+>*S} z=q4bf+c@v!cQ-T&oI*%8=$s~gZfqFM>kjQe>lJk(WIccO*6l(ER=x%bDaq=WM{$6> z85~yGpUobRxW8DDP-2kK$9pNSn*Hg}Vx>}U(f6ZYGCa@8c% zf3Z7Bm!wI>QrJt38+ppcYik+e{Z!vDmmTj&+ugF!g}YR$;Un825_{7;SS>us zgk8~yc=p!2vB9&*uFY+?h&W`yV1xWQTFA`i$v$?sg)yty&c|)Z#3D$LSQ@{T^GFC( z!rq~e$;|1sXF47jpoN=S3l_$NRc}zdS7_LyUwBd28=>}?U zMVZapD5e9@y>^8UDIesCLYOT}_=Jbi!34F#`vnl1hpnns%48pRq0a>;(ZGaPCdL zH5*TQ0)5+c2epH;C`Gvs0blXjy~Ql1;3QMQ@84lA;Fiw!gxc;bbfwo>+$Jr$gjv{3 zsk!y_ug4%EkgnCN*SBxB;RJP%Vk3vx3cYVu0vKxNi zuv#bCsn9em%=o<+t^p~>LdnIjRV{5+qFz*$(Zgb6$NQ?O!6v*sRbSF9%JA-+i)ODS z(D~Q_!B+V+oqL4*DP2c{cKWJuyv2)ZUo~O<87lW-jC|U z0?*~AY-WQiJD<;fI60kE=PNjs9EWQxU3iI(bxr4wxB6}y1fS~AKW+P-2XYy)lX?(H zHdft8i`;T1+EolpqZRhC-cq{(#Gf5c9XGs(rX=-%&bK1jV&?4*hWhO~55a;czy(O1 zn|Fz1LVxVD0ehp{4}rsmvI+V|yTff~G1gA@)?G~B{!1Hxp=a#)oP{*#%Fn|q=ezks zv5$r*pK*nJKP}=-!NAkzsZ)dt$!NT3exrL{LHxmqdUKvF^OqS5B?pG+di1Wbq4!y9 zpd6Q3x6Af2=yow@%FZDd(nTbu2Fax?mjxIdKMINYr9I;>w#Q`Wln6~R?Z=k#G$$m358;AzRg z1UL*M{E?TW`}k~SY)-!OFI!8@hNM7K4NF z|Dj7?>s=<~(6V5QCS==_`vdJKYH<|Dr+t&CwqxG&@fOK06i&)y;&Qh;sr4x>{>B-~ z?~D2to(j6*1`J22TfVoUZItHrm4*AhI|S=x&Bd`JA03re1Xm$-Su+EN z9|hm|_Ft*OuBM(jS|~(V*Q&o5ywCuKvCHTvLpF|ElZBocKwI*iiT2lm_U1_C)`h%= z4be6NN!;&Ah_^M_8K=6?F%0hSwOAt890MyUI>6)T_}Kc_+`BkO4NGCzPJtH|BBSH%hDa6h9j#h~<1QOM11pYvPNJxE(F5%ZWJg`@?QTyzd1HA}I?O}P zGCs?1Om&oFpXOK0?XSp(vP`q;mUZf8--qH>6Ia{7&&G2d(pJ&8BuXz6ioccIJ{{6e z5Og_8wry6rv?d-gHHXMG(Cg%EC^0F#U8j&{uodrdQQVh#b{NEPqU;oQ%Ah&OIwv^0 zJUGcdx{v3G&k>%$TZwLS&#=iD*QrS9GGFgLC~C&5+r{+Yi=yW5VQYX;0HxW@M3}-^ zp7Hkp)w!8uXuheU*DvB}l;&(Mo7SX90v~@M&}R)j(A=LY`23_X4Eo4kS-Y}Uho(fH zTwU&KPUbclVi%+T@U?GFGG^mGK1alLhhzVM8qYZN=)NL&;VjWlp>1|3;j&V9i`*d` z6xP?$`R=}?I?@!SCVeUEc~6d>n=p>(I`TF)U_6Oqy%jW4LFcslTE0sj|YFZU&G#a;|q0*l;3piPEZHnyF< z(vU`PAKSk?@dTvAZ6pHp9siwpx`{970NP3os=- zV(Om5JtatI6S>WGcF`J4^KgZYBDTt7)N0Gm21fR>2P`FHq=*qJK0Wo#apsI)Xjrbv z>eC-XKpP?@ol$8OGVsI6tL*EufRA3&D;>DiSBOtj^CdBje0$gf{K6$~Nt@l;*wZz46S?^@@zGfajB8IeGKl z@JX0Fkr?7#W{51Gxi4)&Y&oWi+p=fj5kY9e<1UZl@wkBWD8716a?6R^{VpQA#C3TP z4(iGDT{8PS+YiN24##|Q1eMQ?iiJv=0Ss@{!#1o{=4G=x#FjxU76>?quP-vzIaktT z(uL(NUT+_W#BotYJ}!#@Q|%F?we5AVvfKIsS}KtacTzh={k{m|A=}5t^`x@hUSojN zw)uK|7amT@@a)hkG?#EGgm;M_ZRlKkr$V9{QrIFe+J>giHaSumPEFFA5?Zj^56D8q z&K27mYwMzz?{haNn#ZdxR!-z_%Fr>i><3dJ^EDp2$&<`A*yv%IXDi$NvF(Dck7eVM zgkB{Z1iKgV`_LV1KcL$Hew=P6g9%t7J#+c! zzC*&YP;R?l!x{5=Nz@}L^aA1>$RHVY!>8=cdGLs}qg5D6Ttqy?<~dKxg%k6=cNVuD zoRr&GjqO8F#2!zpwEHDcdGN3w&@QF#(ESSr4>Z0haSS9+^$A5UEqh#%Rq>u_j4m7Db}C;d(r#F=~g^W zNe+JQkMuda(SirRtcn|oQ}#bJh_(V1X@5vtL3E#wpN}OhRgY{44JkqQdVBN*2FjN% zak;tU!{jA&*4bYoWoqO?XI7lIZwx5HyWvouo+FwSl|CtfGC2tZmgK)fB`R9i$AzNoO`s&XeAe zJA@(x?FTlXY$s@ex{fOHbrzexonu*?RW4;&*{4i9pBW_lS(;V198P^seA{mFr*dCP z{L!Tqo*OIYV}?0Z(kzDR+nCnrE*x59ajHaU&Owhg|JR;(`dmYxNKAZD-Q$r+^#>SQ zj?(ZA3+c02y-Q3f0u{QmzT*yM23FUD!|X~jsO|fd-e?3Gc$+kQAX@j*WIg##?%4JI zOIuQ9k&c>)mG`W{#CsLhVe%yV<3~)|*cvFd;&)H9* zjt2#9Me5$mI|MA96~Qh+*U<~h3u;DVpfhRq!?UDIrekPN0#6um;Oz$MS{r)ISSxmH zMsscGXYKG}Fq<5^%zfXRo9}Wb+xckRzP-7M@lA^rni4x`CpU zi_4)<=akp_wDC0MlQSEC4KV(_=Ye7~rd~#L!SshXh2joe=@w4ujoPaItu2R6kOfdrV756IkAP^ z7Xds-L5;BMeM5PM*+R~>2%V90t}dz<#5bK63k1aDrLUhh7=BtXoV>}=iEeBvmX><| zUNDO=oL994v2lS4ysM)mC1V)3og22X$`_&Nd5*qc z0zo(7YeN+~^e_NqIVN#DAfctY50JMaMc{i~o(_)Tj^wRTxIwv5 zh||%DT;(dU9-je>3bfGk={{@6~m3c*-PfL2{X`Ruiz` zGny%sNa`e&``u6^nq$_M5%9tT?>(0N6r1l>ffenLf>Mp_N3h4n?i;Qg2K@;w3_KFc zlh`RO12O6c2du}t!r+XbCOFni5(A;AzORVQ_8hOMJs<+$Tj)B;hSQTN4Uh9v;A8hy zwG9g03_J(BD)Aj!0M1{#!?&?uQn3Oy!u<#C@n_`KJ}@h14h+okk8@$Bsfh9D;g=4_ znikV{g#u=oDIUe#Zt-+5Owj=l-U$uTx2_lxs<@_ms5P=^}P3}&SI@IUJOQ#7~5^-gRyOk^|ZCH1(>qOYnOQjSz4_raivy)f*16)>6bfcq=AU} z$@2vOgqM?7*m6?lXynF`z&H?&N!kIqiw@9m!%N)h!n5?Isx)E?ry$t_Z$m9Ei zipi&mjD$Y&{{7X1-TJUc)EKt?YRz%UYaRDHoD!W1@v6zXd4W_z4flkh>Q1vNsthWZ ztDkGHOZb!dD=MqG-9mNb9vhl}=De16IE!VtE7ophPU+ORm3Aan{`PGxW@ND}j;>sf z(bZ>QeKG>UP}vR4ZV}uhFn(uDuTwnmy-{9km)uh#?`xqd2oD0ufFR-o6{Jb1Hh7uh zRSPmBN1Cve`eks*&df5OABwT^7IqMEPneBjRtw*XdGx>IzCoG8oiC}>D9MzzE?`FU zkexUxp-T`lFMZtH*d`Rtd`^IuE`K@~$~YCm-u5!_rFzBT{y@BZgFJzCo2Mt{V)G#$E@8R)BWcQL$N0)eE=s=UGmG0H$de97 zCpk6yrxZ}OqK4qLmVH&)Gi!8?cLU91;}@&NcT;@AVn!0R`eI}Cc0!+x0ti<>;Jsi- z?F-<%ZXm+mc`or_+hJIbTi8*`)_k};Ub*YBEuKAbELF%)B5oMg5HEViLZk-IjT=$C z9N%fmq~krJ+t_;wwTk9msP_EzafnyP?E4+q$!H> zq4|WurKKs|W%@l}E<{ty??`(?Nd5Wc{E6l<)3#4;Ln#*lEjhK)>?!DKg_u{ZjXrPk zTV7~j(Dz~9?9g%5+f4J~>N*KOgAaQgKE`IVMe|~1#V>xPzv+pZeZ?rCUE56%IbA{_ zHESZyGi4;t(n!2VdSJIp2>I*qXY%3f`HVi^1UVt$qmmujw~!$cTX29GbA zm{aw<<)o&p=eo&)<}@;%D{KUv*=^?iX{v@vX^+D#hh#2}gzU{R91i(+{36yItezqW zd-#^kUwVNotwqb>+8j_4ks7n1tHL%)Owu-|7-d zql;V*!FzA9S5KuH%A$Jy6bj9&0!6nR41q#^Vwl48D>(f1~i>Lv)4VpOmySJN0BhTwbC;qu+Tk(91a{c`2yIeZSeg5&7dg>(#;P@6|^6mRoR+YA8*>PvE=E?1mNRF8~d3UD+3Fuhi@Dlx2p;<-Y7T8 zagbbLw@{ySNmSX?ttI3DaoL|Z-?0p@T^A?B5stzuCvZ5U)7a#ylQ*d^JP#znaNKB7 zW4JFnsvaC>`M3Ej(-;p^NysL)=ow*jF5em%HA^uH3`-Yh7BZ%E zZn#Tj=TZUK+N02q$L2Y|C?W-@GUUc|Ml+0xNF>f#c74wa>g>K@l8H3w0WEQ~T23QdPnr@- zySp5Wm^pVT$FCi0JbE{(9Xx>b(L!&*XB5 zoKx{~^3l7&kCwPi3<=Gq#wY6m1mCxB9uxI})D8E8NRZfjmENlTk}r!Pyv7z=cph(3 z*rUN<(?rEtb&Z>*#|8uVhCNxLH^=2OA;U%tZ;S=F{{3G7E(&wN7@uZRH_X!Y6gj|kmbp|Rw! zTN>$*o2w|$f))&aUeakN1L>6ljOLn`FaemTF!$5s`?;^!flfe-m5#;SHu&^+PpL!0 zr{oJB8@?Y^Kw}U_cOF67z{ek-SHK zzm&DT6ROu;+{7MlRg35$;~6i#ewjF3-H#IYl(I{H95=gEh)eF~JJZHu;tpgYrlVhO z&fFxwZT>nK=2LuKe+TC1)QJG(LJr1j*O&b$>KFwov^@2Y&T47IIGgqPK!#YqtkdSL zsa>oW)xUq@BPaE`Q+P0Gi&Z~ z4K!P5z-wQukU; zQDK0b4!+GPxmJ|=Fw`oNC7BZ_pUoXEarTuvhWvJ+w^EDV_14}KO{s5UMm?y#k}(A* zd@gufcl+$UXCM+2cT?eH^U%PyJAE>>_3-Yp7Byg+2AVi~f-;#yf1JtvKx}z9Grr0! z%dowo=RbNgTFmWx?*z=iqCbdaY6=a%je>qaX;Acj*K{)u%vCf0EtJJHljUIe9rM_L z3n_1Sj&qP_)393EO-+hJY4rcY-a9`>{snQr8{5vtwr$%^Hr`BZXJcCvV}p&Yjcwbu zv$1*S`=ILHTes@|1J6%0HB&S5ne#cPPoH;pzdENGo=!0q4vPBD8w#Ii&N2o6bq;~U zhk9Qjmh(`)+XoOO^@q|-FjnUHy5ei)u%i8v+Ka%_>lN}`yEKqUKMh|YbN+e>W1f0; zv8r2i&WXE|^KW5GI{rR9Q24dbKFrkS0UyDZgXl+jt zM_as%-NltI}8&BHuu!ddQk%egxBNwiwic)Wqo@SBT_+gQN1>uyHOY$ zn>OQ55~!R}PR43uzcPqoNGs&!yUXTqT@!M(QL=dbSB;CVJH~z@=`1=-fw?k)R~wVF zMuTZ(F|#_JI5xMJU2<<+v-dxX3H}MZ#?5CZp+Wd7mK_IlvD-OrX?%01K{yj!(=M&# zhjmMJ8AhDP(YD0U-A5rr0_Qzn=c4|fu#*qCr=l5@9l{1SuL^N)Aq*f(JExJ@MH_3* zsxe1WD-_UWRUE3-Yc zBAd~Cf3Dj0gcAdH^!Bw>n0W7>7jr`nFW2{rb~~|$SRNr2n2JcK! z3`_X|@uo+=qXfMh47Z+NP$-(usnz2D65E*tx802AC~dXB#_oCe7%K_VMotO=&W8bivNA(1DQ=1itFkNo4YhmhJTjk^;jPB&r5LRjx>wh0hZ=L-uBi1D4aq;YZ z>QHP-a_8gekY}ZxPZNTa(PsV{WTX~fHKD0I$UJ~-(nz!M&snF zQQ6=|*)SCEbjiK8gH?xi2F>oiUh+X zt#m_>THtq~Ssz&&fVK)I7wnVyrb2!U4C(qJIhh@W*ro_O-B;8c#X;1(yOoptEwFal z9G!t>Ns6Yj^l>JPZ9b@thdw0Kmlbi7-wxOogaX!jMlA{)a#-mW@SWcoc1QAJLR$4X z7SO3DLpA(#UH~>|w%gw{Tt32$hmHF_t6lX3;=T5r5ZguppuAL9ra~Y>v(qsRDQMW* zNLB?c;3cjH471)XA2CP4W_Q5`FEk>ECH12u>|n*Yz4Nl1l&W8UJdG3H zR^N>;e|9LnGHN}WWKFXHFi5|Uqc`&cCi788c;U@3Am!pg^6TlQOEoU|Vt4@b9DsPM z#fx%*W){0HJ+$>g^`|yb`YfDwG#Bt7D8IU9jYgDT3JKu9_QI59p|D65tPuJf zkYw@su6w#T0^HN1mE>EA6u?#&DbB(#z0vl6Rw+K(YI?Jt7*^{P$B=?lcTQJqB=eLFI9VANLp+gNB+}%fG!j+$RyFVZ9r1@oTp!Mk zM?)yL#kYnXoo?E)T}5Hg*59i4V%V^hY0PZ(YG~H9plkZYv)rb@mbvnAvd~oi!tYW) zrl>4u#7SLdSvEhE#a+)=MCd)pd3l`Ge$1c&&50lWb?l3cc({aNC&1FedHW-ST@b(7 z?LtLR#yO|HhlV#Phjr7&O7P=JCUZ%;n0Zze{+($)jPQ{?+E;kA_$aV@Opo-0?m25x zich9{GJ5k%+iPCO^;fHFr(dq34e(ay26I-NSMz0N0(lGi0ccQ=hw7$^X{`|`SqOgN zoZebV4a~p_AzwIa&lk0l97o{WMf>hI$e-Ydkwc}TbaA|OzU9%y{%+I2HNC{?O7@U^ zK#CQeku(z3T}+saX`nWwazvk4W)D}4eA=F5G#c}Tb?FpszyVj*I}Oq7iR@O?iVbn>UE((c+8%>{{{|jtP1YXP(aMlXWzkp*SWCt)6j}2VUQs zsK&$){m57qlQVVndzRrVYhE-AMfk}KDfeG(72K996CU_tSU?{(kv9OaB-Q)(Kq&L~ z0to_=w)s^WR@(cC8hsu+}S3cKrTL z$fwBoXZMTY3-5%ZRKNRD4%yeV^Cp8vi+$9g@p3BlG)Iakt>S;5@LRnL?^a(OCWpMo zBA91oh_J5qEhf#@XfR5m`n<7TDU+6@IOaq#+E}YeH$=%mss^t#f3MLA)O7v}PTBF% z(%Lg3W!&z|7-z85Kqy#aE}W7U!uJmpmO{f;?%sUbPv8#G7$oflx z94Y7#ZGHIha_~{?WJl`#y=z(@roer0j&EO^MJOU_ zeD70g<>kwDT90KUszU7TQ%hnNtCsD-kxW zmkm-b12ltaw|%P#!Osc68mWVJ&#woI2*~=@Z<)r!)t6G7rB+P*qw#rm;_)Z`&fH77 zKHG8C_#oYP9LrynZjUUacJW(dBXZ6FKJgoInSDG5pT>l|##T(J9N5LfKuIq71V22I zMWuPhf+s&!ynP!?6MVg`*~ZNl-%k%QJ=x~l8=s@vKmR7zN77K4g&9?MxGV}UOHg!A zPI4vANR1aoVP!CCXot?EWt+`gf7&ESLG`1GwZb!5fp}rHmTo?+&D|m@^=Qt2htWJ`g^hwhUBg*66ZdqFN7oTDSlx;@yqX z*I$hIVxe=pjW*{3&wfxl1H5Qtfb9OLw3eCiN0t9<;~++v{BElrIp#h;8>%5md^tE$ z=DwroIp{-N1*+zB(Lf!y%ceF_`A-a)^fB{^DdA!Bs)+%=Fj{?NFY@I%oD>p`C_uT) zia)01u-Rzo50i1tz)E69VF!9iqsV9(^EQXJJ}ufoJ0mD*8oLeu1yY(;EsSwlY{Cvl>qYDh(y5 z2&>4oxm63c@(%Kmm$#%KgkCz5EJ-gUDv|5V+XY|ySRxqLx;Oq!)?{J=TwooVU#;?} zT;-$@T-IQCKtcPAA8@Ruz>oA{b>?txLU;7Irhsr{DYHuDv~r{j$ZoRmm!8GLy6Pd; zyZypKbJL|r%P7qUv^!4+!3wqpCnw=8w$Na$r^LvNi1*iCI=y%4Jvo> zy6>xAVl1a$Nm0<67X2BJUdWZnA=7Rsc*XHD-nBiGJ(~kb8!NUrQ^b#kH#PDf(-E#I z!ej+0RZj-{J--^&*&7O#OD{Jtw6m6)R^8Vu8~Ss+O0o$j#1-AiB9WV3!ep{whmRD9 zuS(A?4LBdFDF^Pi=LO#VKgU!tJMnWUAToY#GKC*^AiKRy_EP_=`(qS-xSGnqwRt-3 zF?97#^THJKx~0kW5qI)rIV<2X^0u_TJbaKBSWHe6H_fk1(>-C)G1=t7QSnFPDq#tA zLBgJS46jlO2OS%GHa6dFP&dK&AdY}cn{bmk36ATm5>NAxp8ASi^84hQRv7&3pQF8- zrmtv8J=sqC>aGfpT!65Y2@K4KBZEP*m!-AhtiP+RH4$K)u1Eys;LpoV;8(4#^ONAB ztt>})@*XSwOOu#$&`3_cR!z?cDU~eu`Uvj<_$h)`I+NVIt^a!z62u6igpx=kF`I8c zV@~21zvUqilvlt3il}fPq=KH|%k~iaJ*|%!by*o~UljKKH3gbJ(~>pw*~0siH2~7&#FLJ@j|Gf;Cl98|6`=5mthOQ`)5kC!2GkU z<55umLD@{@dRBha-LMeZSrb zbFFsWARu~SjQ^6(;|w=z|0A$lul57{VL6eFdq!5+cN1Q92QD_D!lm>&(3)6UZA_PM zg`oYAC-z6?cqfnojuuPIa>&mM@sdc+uMpt*QtXb56{XAh&imuK2 zHlh|Dk8XhQDG4ea*4K|yvs_WUAVM;-MZP|vorsH~ z9oMd4RQ_?37BKh0oC7H6M#J(GjAL_ zJaBC;#UEcxWnVCka?aFQ1Mt#{FSn^{R(KSu9x5R)oP3*mRGY`=7mI7&UZS5xj}ITW zwXT#KW-3NCNobqi6^H2<^rsk(;y@!|r&Sv~owgbBwiB8|^)=6843(rWCG4p*&)QOe z#h0(C6xpjO1HQQJVL{`=hlFi~DI*q1<*mKW%@#)90EHCi`xKahoz7w@xqJC2qltov8myEiA$h$hch#n`eJKkb%WWhTU5 zI2n1g`i0-HKF|iiGY5B;j_pV3&cL6E9p!dKZjGfK?8(c&>p_7nmY_}!`YxqVzADo4 zi7S|X0?N}f>#qDC(L~jr=C{LIYTR$-5R7w$_)qvB^MwJu8)UOT#|+c_yVx&W3d(7} zS19W___}20@XiL|#Jo;@TGqSFR{GuFtLoBST2qp`hpBU|M2%J?dUpXG zhkhG2!_fCj`cKl-1Tneb@=+Y;`M2*;(}|cK~aS*BeTn+DNwn8Q3kcw zPEiM$7G0_B@3`uT*bqVm=0v7|OP&SUg;M^x?pbP++rI`vY$a7!`LIG~V+Z3q+1w{h zGS$V8u#RS^)1xvM{5_ruaDHR|V=v~I(uCj*DuVErpw02EI4Hq}@=u>#E_s)R)yq|(7l&hKKELEwOzWF%<8s<& zu|Dgj_LVAy3{s?b_Cgi`~HiCJ;%@e0w(R2z~|McQm3n_Ok1?mvBZO$oB3ns zaQ8#e^5+*&6@|*m5lfBLZnnMw<@VBF%@R{3Ko}xiGt?dH6v0J`QD;TP-A@4EHARN7 z*2G75QOK*Rae9FtIDUQ)=SShynAKl`ZSfS0(}66wP}?A%&aIBHq!S-w6B<9-y5T9_ z$||qo2&zpOYQ+395=C9WOnq>^i=FE)moy(23Z*g;JX3@E#-0_|Ocbdv$=9A7s@Uvi zEB8X^v%h}NlH^1ui;Q}w*u*J)PVy@ww~F8^{!5o@CG*>#U$Tgw zp(ANO$P>=Mkq9q7k6AI&6~1mUyF?3$GXs_sl3g#UWm!{ zarDd3ifTM3WL_9FK6z=Gq0RbGyq7U>If%u5wCkt_X$7c=Nz!He=DpyDWQj#rE0vvs zO$t-Rc*(`<)a_XlX?!agh7pVIMlFiLckbMPWzFrcC2>T$4#~8{TW>@}?6Ny9G+}YT)D^8|MGJ4Hccy)^auLagKItAFE-S7ttGw^-snqQe# zNz_c)b5RpTnpR)As#>2ELK`7#xhs4X>un2uk~_-iGn+V3bc;BrQi{{2;PoIH=ivLd zw3p7HI$mM_GBN;|2{n*y&KF^lE0}pgry|3HZzD$aqt*wS6`T+y`Q`?KBv(dj#erUdq zdS9;awe=hyD-Rl`G*c>gW`o`ORziogLKe#JjMAlGLU-Gq9820na zLW_mU^Wpl}7ilN6j+*wrg&#qUF`*%NL71p6NGi;0dxS$1-^F~11e-HEevWvXHzcrG zas7y#Fx!IUD_0VHVX=vi{k>G>pi8lBsR<3LDKn{{Qy0XTyef@E{Gd2@%|JSjEdNv3 zDxCcO>2*^wV*`@o_yK>ZLK~SXQc}Whvstsd_vg{tU6qZ~$!gnz7 zeoe|31yXdq)J(cD3qSgpyu2@Ki76YO?mS^( ze0jrU7ql||vnkN^JftZkA>>uRP4K*!6V8HJdUcz>%{H~OOn$9qXP3b6rNl%yTA`nh z{}>^SQl=&C@8b?Dp+L-?y7I}aqX9MjPO&TW>In5a+H?9L1G!Ui(;kp_=A z^t!~?6I*!zee+_wx(bxhH+qsO^s2bdG3G^cgQ^|x{Faz_Ln@xkI11h3FY0`Y!ApMT z{ctLB={?_B`L^NN*&hO4$)Hlg+p(Q(-*-Cka-Bj@Xg-UHlr5Vg7fa^zVk9w_^l(}A zsCaooemkFNn>|a*UrbZM!k7 zZ+po%??>;!(^K3u`Z}0q5S;V(pawV)8qVyL+uBQ)cNL&^%bw!50@yx?d7mQELr6_b zv>l_CtoXR+Trc-f?a3&vh9BPAVwj{-hRT9DRDP}EpjDS5aVYMeqNNO z)ju&sRVo|g3<7xs6$Dx!q+;+(e|MafE4PewCVhyZlPtVEaw4Uht$xztp)xjwf)@2z zgW}hsLD#@M=h!0I0znKYoyh-hNqa#A3jB{e#8m2n0#bS>cFbwHde@O!1tqiE*^3`r zTyW;MmRUXZn?s`V-1;J`t9ouRDER0?14dfWOZbh4^1x=Lw%LypsH{xZ{7*B?0>g^7 zO15oSqOh3Frad~#h@BH;_@DjeTmg6#RnTm)Z82iyy#LhDg9le^mKmvTilTs9{FL4P zhD)>x1*(W%NQKOL#)NPNiBf&dU(r^|qRU0H<7S8mf@j1+4x&dK+=k7J9l}N%GanasE|P( zg%Dl^ZIWZPJq(lbK!QHE5{=FYX}(_xw-pt5F=xy#lNUIyZ%W;QKaB;P)AtVOS6k<9 zbt$49%nDbDJ0`q7O{cfdMq2un&zxSc;)n?Jw9PX5^ulsM+0&DQ3_ME9OyHt&km7Jl zY}n|zMpq#=jE{yCUN|mFDZY2h z%?;iQ$eYkQp1WcFLQwnpc`10DzCjgv&_;fdF{^E$-R5Kz+h6kfmGf)uXc}Fq>lw&M z_U!e(&H06gOn9h-ze_hHoj`GF9(wE=?ng!)VV1h|d%{^|e(wN*j`T$~5h1L@M$1Yq z73(*L$}y<)5WrVrG*MegoZU80h5f9hibXCvmPXfYme@R(W+zINZsv! ze*6~i#ng87juCkm6uH79Q?h=(qFM(h_{@f{gNQj&_`x4Rng!!c59K91&aiYPa@cx zD?saU+V#CU-uWrpWr>dCnx34Hoer7rn)goItN@YYJ_p+gjxSQzKjvk2BiS|nfUxR~ zsGc=)Nem?ne2QMDAS8@cyi@Bp8J_J}6!k2fE;Jw-dm$Y-5?SK;pQ20$tyL>LMr!rM8d#I8v6a!J#EwGs&Os7*MbI5D1tr zL_mzr$pHLv&V&uWncnzb>D5k{5s}(FA_SyUOeHV-bV;Co601-;n%K6s7kpp)InXkZa>miBfQ9qH!$aXM`T>f9HP4`MefXwE&OW^rG>hf z`fq>vgIzy|Okbx(QI>^wpQN;b(IC(5_?lGjvF*tNQ(asY*Q~2#RJy+bs;GX=yF7gu z{&&ICU~U|BBmK6KuJLHT_@|r+0&^%g-Tqr{P0Nh?pc-od(bs<2>v0x3r>l&!>Jf+^ zX>}L*dDC)$t@}<(B7ZWP>;}Z6Nd&1P&S;J>NchQDJ^OL|OxsLN{~PM5(g0@}gd)ke zU>o$(p2+zIUM2`RCK~YchhXME;+;-2tiZFeVPsx90;9KQVY=GL|3)Q=Ad!<$2RXla zEY!*uwV~2ve!G&KEgkufSwlh{$PiqS-MaEW0XF|HkP|!zc0&^p{`>#+@_#5QOli=3 z=TSQN|DsosfOd}{&lR};4^op8=*%6pFTwPGCwTlX4%GkovH$0I<^7*w{9pK=|1&}U z|JIoXWgw`D$uWc9YCT}SMA@j#)oQBKHblgYoCUZj)QX z2D+v8XlffYZu`BJr4YCF)pWgDAOH6F+zCb@Ti319g{ZbbuC?BNB=<~Gc;r*|1IbQe^ck6_?`??Q-|FUJj)}+6$ zU1J&onWv}QuyY6WuBWGinb$^(6R7P-wC%zfmbSjr%^;3+)47B+q1!?_>rb-vkHy|# z80jvSXdGr_XQkhKnjX86)H$$C|1ti1gP?k?cSAv6q=QQ2dq3N^I@bA=@1SKbY&p6R zYC{HbAiNp`*ivTSbBNV(+t#L^^0!&7j%VQA3oU9!Hcb4Ah!Irw>AsD?Nt0vNnRgwz zlaKeNtT7b0-X2H(#dWpCDTwp(KWK1ye5j=cgmj{WAj3aL!Qy%{1L7Vom8nxZzkmqW zOR1o~Celq7HCryzf}p`Z`*mK06OBcgKD2)W!XgraF70f?Jgq6Uc_K&fhj?Ba=)oJC zr;$%a`0Kra?f!hZW@MZ}MenA4!R1GtsbsVLCO)UN#=Ginc3U@8T-A@}OB^Gg*-r1L zYf|1c&Z+kWb>-i`&dPY7tP9#|;stIa*e;sZ?O$#+HXlKdeqT@v9rQuHCR^Qi-L99T z?*_|G!-P1z5`2Ng&S`@<;v@4#q_0c{ zZ5yDE@Tm^R5q{-%-UTF;^Sxb9O)*JINJ?T#4pv93@DCBS4-H@|aztk8{FyBsEumtS zEEux9pj=!*_rB<)cOPVOuOp3sS8JYlVt_$O;|ExnK)YvH_(A@lJPo)L(sd z91HqC_Y*&E`+q%GZh=T}5kmJAi?UtrS6jbTCqSb!DjtCb8c{mEZz<$bF(T-D=190K zB&$@(ty$rO?zmsh^PrKrF@wmF8i=!N-gK|1YKnR&#lpQ{KBS8w z6R?U9?N9`v!hJ!*Yl-b=4OBk;*SzgFCrh1=f88d@KM1e?YgQ6x)BCD3nlpX!H7C{$ zqxk6P%CI_vTG-O-U^BHiwT+gswQTbJ2X`6m)9S#+ifn5ghRfucXIvl!07uPG1ShJM7hv|w;DBH%8-0QCOs!hekvB!PI4*VP%G0yhH~%XV; zse5Mm4C<`pxu&vZ5>9ygfsKje(~+VLqBqBKEB%g>{Ag>8#8D(6P1Z8-PIVh56nocWj_YqjZ>pQttUb#$ zpoy6eBZh`X#adcr)kh1G#e)~v6Rg!cYk1ZzS$Bz2{INLDa=d&zL!hVna*uZhj0E2< z8XQ_dlh8c@%M(p3YqfcPW+q@>$-*Chlz?_JnxBN1cf$wiTTVsRGa1?~| zDjs0=D}xOcXZ?-M=3;QnA`Ep0xtkP!f>C!Af7yyN=$k=M@ zdzANpUvTr;d7k^_Y5kLHz9HYfYe?bh((MDMG0Tdt{g&3cxsct>Wd_jj`{dzXw`3aCilpVh_%h0{qfeD-4&2pOWpDd!<*f0w= zMHS0B=ufc5!%zN6=VmJ1-E}v`udo?j!juz@5uF>^py#;wZ4x#c)Nf4LxsMnw1{N9l z=C1@lW*qNP`hRPBB!N^Q#EECcAG8s9rQaBMF}y$$=R9K7iBAW2$BGhMxGfuSKTm{w z+vy3vWIZtO*i5MfcO`RWGDO{q3r6OnAyEAIeyMTmm;XeHMBuUEBmlu-?mF@A!e|N) zZ>=yOhbn#japj+j3u##4h)sPfk&i>*|9_4mSs-%Tnd8X^wOz=YoGDQ)DE ziGP(GR@GJAdB}Tz=EgWsA_h)NDk~V6f#5AbsprV-HQ@RDPpU|hGAQ=1E%GWcBENYv zQ*3vgR&f8T56ew^?#?xz>8wc`hOIi0u$4QgHVgM3RX1yCnf`z6_k#qxh-R0+q!2G#W9Ezf%;@F8IN5>mIv9N-`{$_v<=)Axz=riIUGS=#GW|?A^KJaE0?GCd0uvmee9a&SPMqAdKu z@l{Xd?_Mp0k{g``Ul+s#z~yAR2YCenxuCO-fP#JJgI4i2!Xx!VY2g}y=T4yT*UPjx z<=*m@-xL4dqcZ=$zh>-za6JiA^{mUxC;{(=WV)W@Y7Z&(;xj6+COty)R{~$8Zj^va z*m43fh+RZ^=1z{NZ_H3vBwc*F-#U;>sW%wj-KTs(#?G;?wVM> z@vvgZyl!Z(UX1h>V}f9QS)={N!3Hn?6K=i4M`3ZBjiK!sFXPUBL!_IL;wULSNAnT% zW7)R99Yt7ig^_I>PAuWu&iDp9ant+W_l8m<34Uyf|E7rXB|6R17x=L~b7vbQ1xq}d zaVuCgLf}#iy>K6I%gxIz*p%{^D3bc#3!??ba@cqKh=Crt*yP_NWHT_?c&U;Uf@H-$ zvV1b$lwp{E547K_gQ{`H_pe&^k>90?+oK1;DgN!W*Uv!v*NdN`0I|)h2qY*8)YNkgwE%AH(a5rrnV0rfIsS>Ma$n|W0okhW+4iet0S%fMJ({Hg8|>s z=R<>`gGm8xO3(*iFher&n8XnX&Ny0r4RU2e#d+=y03>zbPl+gN@cDS4W;OsG{4YQe z`WdtyG^YS5$g_g2G4%A)$qtjLPlIuE>N6eo3h>B*LacUvICpDzO zWQlMR!!>=EDF^FjcTIsJF9YSPTf9ia5r1x&s5^MJz62R~cL=pTd^Z13+G-k}ZC3oe zK}tf|Zu$QCf_Ou6)puYoLU^*Jg0rmOA;={iG}QQN;f>|IzDjE9V_=?1!Mce(PS0h; zBtHNt|9u2_J>t!H6=%0;AwwQbcq>ey*z!~2?(E~NZd%n@uy*ffuT{|K!O_Ncj(w)X z8h)Ir(P5j#`RC(;22=B0InsB;5&OTck6~$9$okBJsnNOFYwh0VC7SQ^9K=nW=m`Ok zZRlYB!|ijM^)=|}Abvk$2<9b&goVUAz#rtHV`LC~(OA@gomur4I^nXZfxDD5><;D1 ziuKIyozvHJ0D(ji<|V#e4N=@cfleLX5lAzyo_>>CE-rCXWAv04>kY&)*+|k-6bKk( z3S0iB67P_udBLy=eWp+4-fy;R>>@lJphLq%OFew>;?As0xk!x;SX?wGs2haYg|96( zQxt-9AgwM5j%&u4E%sy>c*7*Au&^M5WvclG=QF!nao5dj`ppn4dA@kd=B#l-xQiDL6e*&NKz77(xKF>X&!9OA6wRM|xO8e43l1I__zmCcAP4=fzhGcW zk(Dh@8=~fYcngt+*y#Tg#$80{OP+T4v;`ct7Oc!u`}qx1aV|u z3W2s#lo2G`dDK@aTku>Jb5?K%8q=|U6k(qsJPSv@DS?jxaFp-iBk8DmK))bg0wtc^ zkc01-$VHzYqso5h)_+7$yU1AT(80zjm&j2S0u2N5l6(|-5*H~2qTbg~$5DyQgMc(Y zGfdFM2H!$2fIc@rYo0Ylry`8#4L$D~mN2ez*v!Q)9onBrp1`u?oZ&X!8r(0O<~r4< z{9Nfo;k(z{`29S4<*%BLVmc7>!QMC%Hg1v~uz5+R$4u`m{JJM&-f71f7T&|(N^Dzw znvB1Jg8v>drTmVa_S?AW$TcMU{o*jqf)iK%vu)>qq$LA7?=2?wAkL8^$2|k}oXQUiPqFGGQzvj;KeIe|>DjD#V3+u)~KlL1`8tK^QtjU3+opGRhmC<#@c0 zBaou?Z92-hu=eh*MrFfZ{I4ekvz(^i!Dnxt5*SStUnYSiDpHUpuW8p9L66G3hsg`G z&nYR)@j|aOM6_F+aRg-#BExM@B&<8~?1n%s)TSQV4Zz;ks9`U}H-h4)0z!`B1EFLX zVjq@pnTQCO?_@@5ZE6B_>^Kp@#*5#)q;y~tI-HC}fAqF8Hr%Du_ajBMvy;d>xdCGm z5QD%Cxyz-k>(G}Elb_3}yuS;+)cR92XRUy3DQ-OD4kX$N^B-Q1qXx-Et&*0XJS-bo zEJDyhOxsz8S&qm%kpoV!0@ST`=aY+ZdDy5#g7A$9t{heYI>0nd^>3&>>@~b zKJsZLh-!&p!`d;WxRrjC5>pB8h8hYB5Zntb#<)4B<7Ig|ne^9!UJ~ydRHY z66YV9ODs6bmPN^|2r4&6b-jm@3h6=>{HwvNbb>ui~soxDy(U*k-n%oUDA ztZ@haS3MRij-sHqe#9UeEZKQwgHmraI@rymgI`kCNaRJ^Shs5m%r_pWb)1UIWJ1Rq zzu8z4$Lo}m=;&0uTlGrs1#+&NOvkk7$NRcZ-D-yqt zbECVS5bE#+#4^uP&!u1#A(;~iR>hEYOjB#qw^arff91Aef8pi(i*QEy`>E_&Nsm*o1#gB6vqFpYmpod zP>tVDn6Eva7HXH>r_S>qeEnyo5=68~@&;zGE`h$uJso1-zEDdNX)OuH(dTzeGFIQJH3Lz@vc~A2qVT~X&i!&p!_sdy;jBRCiF&Cr)(eSjK1Gu6$5ul)-gNfe*MqE-4 z+5e)yg8x&`5#|ihLv28{KL?%u6@kJn`TILQw+@*olnQ-Jid5&Kzk9lMXTv zXK4r|r}9KsXoDk&{up~k)lM@*pP>U%sb_fZ!N?he_Kfy)#Yoc+mjmkZ2qlW*)loSj zeFE8ki{8s_l{sql`rqa5&LFsC;B?jAQQU9MLs>aVyDUU>CqZoT->*}K12 zwn}`YOi$0`=sCL$(CRl?C$PvcDo&g9)A ziPpO_NbPnH&5@&A`5l)p7{HX7=c%*Lz)T5K-TyI<$aa`LwcCC?YJwa5{)Tp|K%E29 zFp3O(2_&U5@42Fp1fJ;z-vdo8Qq+k%FtJ^Cv|)~g8A4&z=UZ515G5!fBS}M8SS;e$ zgPoG0p#RetqH2>MMIMQPl`+j zB+MsTCE%v34;}`8>qUc5+O#ANO=1Wc7roYs|JMh-&=124y?i0a zGmOT>m>N=NNZ)){M1QLWmuH$pDv5}lEex;Tc^LuK6A>RduW_9oF^C*KAKSD3U)c8y z_PTXD2xhc7?qbfU=`14^Xu&{F{)A&_L|oJ@23L5)m(m}JPl@3n!!g=BphFdNAma)C zL4e3wbh{gw;0)e#q@`#&t(H#>pu6@V^&ogal7tj!4;=N zgIJ*OflRwhJ%nxjc)w=91r4UGy4?)|qg%y&m65+lSqd`4>hn^b6kpT+7*g3@KjVj)`Bi>wcdNx%6Ft|v_4p+ufTVz8VGyq* z?zfJ|7=$_~v}i%lK=D7%;UOY{UlwO%g3VbVTeM6bU@_%x59)TvyXAZ#NW^yd-Jye( zNdm>D57bV#6PX}oMM&3pO4w6qbSx@acPvnSpbzpO__zC7q|)9s1~ytfZy1dY@-Dke zs|H!vwcE)|zU)_q`GvHMB{VXYEK;zGB%o_Jj(R9Y@C_6Ao0OKdu#d0rGR!q*5lpAw zq8~pW-o!lJ`FZD@Z8EM4^~ihN_VHoWj`b_#rlI(^3IbKgo%i=2sWhmLXmNX2MVXW~ z*8*v}<{28nURU%lY}XTL!MOY=5GZh*h!`k%C|pDKfBCQFR(Er5|K82rbf8%VALq7l zl<~cU$mIlr&h5z_?2A->hk=NOeCW7zCLIp~8KbW85%`vlQ1gQIQ4~5qC&AGnHp$0= z$4b{6;TD)Q;QqE=Qw>$z1*49SibZ@xa+1Q6`!RO+Fp4wNmk5GM9C8#)-Y18@V=CNj zdl)nZmVKHY=iIGmXlaHNTr8`o81096j5d+ zPH_2P?P@WOmBjak(h-Hf&<{8x(8WJht#!=f2fl>|NsChoS<{4A9qcSWTx|<~B|BEl z?SICXZX*SEUHaLd^rJpwuZLG7fT1 zatG8*oLRC1R+A#B4mpNomXZ8N4ZLoiOI~(}xJ@EY%`D1f>!Xg2;(9T&#i1S8up)gmo>=9Koz@cqAoUCgWBW4v!DB@gM_Jp17jMbVV)r(0STwI zJ7U2qAU$)H!7#exSN2pl!*&Zumfn;68NABOl0O-Ra)DY=KT4G~(bcPDA2{k$2&u;M zElCqj0P$dI=S8~T`l(k2xk}BwcJvnJ5*#Y$xP_P+Ky-9~C7*_d^PC_O!h?ShZ?++N ziox%i43mz;usR>2fm~?2Q+HrwO20=J6SSm5-^+*ZTo6_u0f!Zh4JWG!kH3q){q^~T zwkFpNwIMgBjF|1EJ{JUypk?^!!=Cg7g`&z^H)+TGKx!87080@@z*_vUIqiZY#OkY_ z^X{UP)=SM?P19}iWAbPm;9si*lAo=}y8A(j5y4->eXa4dR|sIm{Bx}pzsk|siAxqP z+C9{qppsqLc}`U{zYztq?B3{s_WyGBvEY(l{UfS*h~7ZA$W;}b2hNPrtQFF~7lW;K z-M&4A9rZ|FS1y6LX)>9g7Da|6jZKV3$osa4F4`AKb;E3V_yGwWqLt|9&oLRq1^?I6 z5*nP4%y3xiS7or2-T%~8MCN#l6kS*{Nga6ABU+Ox2_9BAIURF!Q#_D{z?d)=_+rS_ z*ON$oD)QoTF$=DTvU^#1D|3W-V5uY7*PVy3#aT_hOL{Z#-UpH_M^N#aN=JnGj%^&N zT4|>3oIhk%SpQ0NC^+XL935wPP8(&ZOzF@8!fnv5Fhb~xPkxqyNYSv?BqR~Z@b~N- zB+lU_f=AXx6M85E$RSN2ao~LbL)na{3^$eqy9uiGY0F!jx5p$p95pgHA#kX-(X>3& zw4b{A7!-Cn#3C1@vqLS^0lRO={fMC;@3<|4Vfeq;d#k9pvaM}6Na0R!D_nxRdvFa2 z?jGFT3MaU`28j?nxVr`o65I(E+~wPJpYF~%@6|uXf7v$-lB#0wy=tzt=A4f#LUO@( z=7Q#`#^GW7ufgdEWJ;?&76_%m6b&dl{U0(|90H0YdQH~PQ$H>HG!*z}R(_`T#4uie z4H=;yCE|8HpswDZsd(f{?C(FCwsAy;3Vj%B&}$5c`y68LK0j_{+JDRF4w#oB z=5^!W@C@xObR8x$l=+7DG=T`o`Jjzx5Kujm3oCVPzkZ*6O+ji~C+Y(~w51w&g7*b1 zkp=iRB!mH& z+{vQJD+geZgaWU4=W{2CBbR(T@L`1|#WGsvOhPQjN9}@$JhkWhRvwI}==p*1Nx{0G zJ{Y<@Gs0917BeD%LYsTB--@YZ$^tad%9;-ObAo-;imcVOYy9fIBV9&gFFzK1&FgM2 zjy08Se%LfWkn+5Os!TCOnx6bUTy8h)Qbf`MC70vivH`hryMPieus2@BU__xC3o&^|)Qc;yb!GKW-9!+}%|- zbBIf9H&=HCJF*Of_adLoNUqRt7QhkZmq+3*k{zDGB2dXJak*KE?jq4^th=gGX}t|3 z?4Mvr;agdv#Uay&CnYEC+>nPXs4!O2wJ|jR8uws462$JnoF*nGhCK*KP10iu*Pu8a z1QOF<_(SclSc1{LUQUEr<}ZqeGvEu6U#@*9_(;L0&3g3=apgFk323|~_&_-0R!;{@ zzVt0?P3c)Y4zY{GHqQsP9`$SxH;`W%G}$(Ehr}xTdfU8U==v1-9gj1xm(4VyGmN)r zRx1tZCn@renpZ$70W@impr}L3oJ#gfV7GjsdEtf)IUtYiFzCci{p7qjMZPvwtx(hi z!YYnZS1+$<_mv|y)56JhLCa}}tFFOj2#%pC@9VR(UaDLw``@TdP)n6y`e!yM5|jHp z?0{C+*(eF|+Sh$Sb-}OQ96!}&ImX||V8GNyi-OuUP$u9KhhgK^3o)smz&VqWVe@MZ zQyiECD7Nh#(2TyfZKWoRQnyx*vV;`51IY-Tfi6PtTmXkZHL@(3inBP3AdkA#iYOMm z7=pws8E2cx<`k=i-<(;S+XU&-()w?YJE`B6I+?Yu=kI?30d#9_aJ4KtLP zcd?s{x{ZM);I9>TkOPs1TUfL^0FT=~Fag15syyE#R}#+0tx@I@#a?9sU%#yKp0}x1 zJPA=Gr7$sT?G{ykUL}vAjYDeAj9K3Ks~za&hWS!)>;rue6u?q!iFjY9vIkd(3Y4)C zax$b=Y-U)0oNWFuB$81|9xcwGNZA2;ymK2B7UCfHBj-FEkJD;)@6d$Qu9M?QOxXB& z8mp0bYu;Uk6h9!>0AyW{Osk{!u0%7t29HAm#ry8(g)P&TrUr<$>HQ)zgnx8IKWIVA zp>TQck<`QT<3Xj|BnFa}WK`I4t8cKlPHR+;F9NM=h302D5}%s7Sy(@Qi{elJ{wnNh zP{Ckzp!Kep+B%`Sls*D-D$^IxEvjrx5o#D^8a<3c<~+=Xf&?E#n(zi{^tuPn0L4${ zBtv0py%EE>os;nd$%OW`_gJ17@AiQCLCUcw2A&GfQM^op^l~^pZCYU7vkf>jP^cOA zP#f`N?Lv~!#ca@5{NVSAH*Al^!PN-j%U#Y4o^qx)Jwer`{3DC}DgnUdZiinflSOGM0yt#tWlnp;T%j0KdI@@Sn^yvn zkDh6*Mp=A&&1Y~qZ!aQfN)e~=c!OQFP>BL%a5>B|%DCfNVMsJ&)XsZQ+SH3`*osM; zJ7_#qaSB!0oOOqMg`#k=Wlf+Ey!O^vz15xV{`G5%&+B@RVo<9Z zJ^=st32cSadj<)>R(pYPa+_k%MS-ve9mid-I|~lr4(4VR%5kY2v`MkgEt_D=66)j! zlj%<0nIm9aC+EX`1Q~@tga5GR4vG&Hc`qET@=a>r+Hq3iAXV^ojq zu$;ulkfuFq(h!%eK7T3D3YC3C#97rcqgL|sgUlv~zubqFjj0Jg9)L2Roul$($^an@ z48G=D3egb2koV(W?Fvn)F>YMgjNK=^E;!>?EF7*iXLE31-g-O$mA z?W+7^LgRRAH(=65)%Q}Egc7-)p`O`n{Z?q5K7pU`nfqJ^UWr|G#Y>YC2*fd9G>F=T zEG_O4woc>pD%<))bq(d#R>?~^Tie|wHKL||!&UGMNS^7dd02fYK&BRdE@3s-Q%~QZ zV_@C7y1B(8Y<(MHzS-kGW3ym0SJOE}PC@f+`71mkxZI-^@#EUycINbM?xNN8KKBc5 zM)qX|ZJ5+>4I^6lAMWyf8N+#*A!;UrI`IQ%0MEeIJETuKc_PeARfEgz>( z_Q%#~t9_KwTp(nRPlCDQIMN>&chB#XIfmnlQ!p%dg5*8kQaX2@Zzham0U`a@y#Uw}t^RVeh zR?~$o=W0g8RF4YZb_0uROg|P@tX<8x)Ey^vq8)~E$Ef(M9tAft=+IR+Netz=m%-0u z76YYkB%VVqdW>eDhRZKWcn#`uI2z7YC9y7$1F?Y4oQ$KD=e;0xUGoGIqKOV&o|N>T0atf z>WNn!o)546#n)e(RhILX`8cpkz-(>L-K+vBEyHwcmRBHJxSZjDLepm^e6Sp>$wr41 z$Dn(^yg^Jq=8y zeCuWh%FjTMT)9PuI9OjaA~v57w@&Y5HLdHy9H6+H?N@R zXC<@?*5YNTCFPHwz0c2!axe}%!CZV-T2<3F)n;ZV{pa+vkKA#80Za5e-XYCZAz43#kIcM1xy#Q0J*jOoG>Z2urq zYQNe=MOKQ^R4%CJ9w#i7aTRx!%UNPK$lf4w+G10;<^@Apfow|E?DQA2$(5=nrDI=qRtVopCPqS7CoL)I3!`#zs)sQE;4n0_T8YyAS|kgNVn))?Cc{Lw z0?lN##b^kw_6MChI~=wTn1AP3PZP;-8UeqD)p|kjGYRyUFJBI7jvN%RL=CP0ZYHf# zmL|O~)Vs7!usNH4q6!HBfBiG}_>rOB{<_l}qw)yG5I|5LM!)TD02LEbj>d}K>*d;)PN_Mvb z4+Do%f80yteYT_eku=A#mw-|_rupt<=yKL176JpGVvoy%_-1X0rA=@<%lYQ)XCnVG zKWW z;|33%-s$(?2uhKwovv760uiImLfOQh$idsWz@y5a5mmf?1mW%I-JE%z)9q2>YlF@~ zrH&SC;mbr(8pMkLEO*&Y8SC@Qd--!xcRRNCkGCb`qm#-aEfl{N0ioZZd|fw|{N28V zhMFEzE+1d3m^~##7>V-GNmErrYMnx7sl7=7C8+UKdd97+Ls0H zj=G+{%ai-l;^Ja@wPL~hv&kp*;*+{4f!2ZbiAjsMzY!yF7#^AIkI=WCq^6XvIO;ra zTQ^dtTL8zi)qtn(XWOlVKs;cMO{1{Urux3m!KJ}0Rp0)Ae6f*>hGRil6y@)+y&NlwZbo@GQCo8R5l(_l0K6h)x_rrUSb>5aUiI+r4 z*|xQF=56;Ek$7MKnPF5aj!!KoX>F3A#ip6~#Q=YS2TuS>rd7@v78LOh+0JbNpg2~x z@WBcohVkx*vfG9nZyn(fo{x$My*VAA&3%&Rou8ir@^s8Y>>KFG{9vjizP@n$j)*5^ z@xy8EW1cT-Wy6#3P9FB7G4MqC)?dCFQ&%282}o5rjTJw&w`*v>Ekb6l2T!+MtwoAl z12POiPYQ4g)GHI<08x4mpbO1K;S%{-n0VNFYnN3vTe{epHrgwE(am8HLuAmnIsdEm zao~e8kFNaz^(~8jW0CYWGbD`E3!%@WB-@SQI0|Q<{3rQ`?bTJ+e*22mP$Dd1M?j|S zzfQE=k3O3(q{O=m_n7j2?0Ab}`~KmwZQJps_0<+nTYBRf@D+H^=($(A{k&a%^xIWA zdGU+B98P>`glD<=uyK!Oxpg*5SZ&F=yhW~Uijxv8JQvT;$1*mrT|=Bo-|J_Q;k!wH zU>LA7IE}jz{4&D5jVk~>r?9ldGfe(YK!!*{80L?OfY88yx!{bbNMQ-8d`9`Ate&Dx zsfV|3Qsj1@qZ`u?)i@gT&zcIc!k}AmR$piTk);PM&-e$JeOs;Vjdi=HUoE zG)!F)ycccPBldDch6#u zVqh`+1cNS!Ax-UdWLqNQ{!btW@&a145_dh1RDJQRqVWR zyxy|3R7sT>qfC1E4{I-2T28$7hC7h6Ccac+su?Jz1z_VaDP(b8w}z4G7&Vw-5DvCU z3NDKGAO_EQ=fLKC_mD<7-xe=4;RS@gY8o4M>^$EV1RyZOyCpFcm8&007*5-&*y-BX zr@^8}N<`JiW({3an8G(<;u zd)V~L;Nc|oNs0KF?7tdHS6siF3V*L5qn;oXAp1~L8!$i?_%EO>? zrZ&M3!Oi(%5i2~w7g^tS5ES2S_d-jo^aYPmbw4*|c3bk?ev&CfO3Odr;l@)$3a2LY zmied3G)zIHV;g2~+|5bz-f9@md$VWk2TK)78gb3zL?L{xVBU2;^i%Ta!$3pD)mk;X zk&-@t0b>85`i*usYxNYgBIMZ?*~3v7XRj^T56T@>2`lsziO{8n6IRcUrIXOF$O>&fnU+4o|08i zd*Eqp6P31}8|E=@KV5Y%_KQ=N9KXYt6ePygJj;Ie5Be=|=vK>@ktLcRu%Hex_33WJ zk@(l}D@K56IA61M>MmviACl`U(Z>rFVv~|QTl6tl=6mp)-3MQc?orKJnNM-nejpP&-I?L=njE)NGH;s{peF2xFCD^cDe zO+Gu&J}40eYT~@d^X-onF*e0Pcuc4fBY*A=oUVh@b#)Vv%F)ISfLco7^*%em^HjBMTB!Y#(s=D zFDif03b#HI_c%iA5w`1zmui+ix@b&QE90}Jk`TNLAfrP^UCO@5uLESL<*bdQjs)~_ z)QtZ%JGh@_2Tl8K*28A~a7yMTsbA^&52C%Y7B&ut^u~{hu8A~X_fNYPPFZU7s-!Q6 zw$??%IZ}cx*586D;ylSWx%1dD92Mni;YmFV zQ}x`gznA;O4z<53|2LH9?A zhFj7>-z!YKmE{{D_fZ?R8ruj-r$xzu$gp$JwW0$Ypyv9H&Bo*Hm#L{XhLH2@mbU^e zP}YxoRYENMAQ5ETFbdqbKaeTGioEAqaGSR+J!a;}BA*pASdqMOm^BKcW>Q02B02qB zxcOdW*m6xb#3xRYIgf>vhsY;wD#C~Q9mHSD+`xec32k*X&MB6fsL-3P^4)E=`&`aR zV&Oex2n9hEFxXLQzHOE6^*_gv_CC+B&twX{$Z6AvBa-sv=g&F0#xqFhHj4f}ul#{P zxe~}(dUV&^SY97>(;XZakkcOHK1Y$2AwZASP0BSU{~nc1sL9fP$YjzRC2Kb)$}vHf zz{>TBv>Cdz0nCH+7OW<oq!M?_!-NCZ5%gINB*dB98wWU z^-E(1?tLCXKD?+Q6sVj*7|?v1!AE!P$)Y@u{Bku|q@}^-wy*i4Pqq7D18+x=>8Iy| zp6Dio_TqH3O6s5OAWshVZvL~J;R_?~%#k<*hnBB8eX*l0mwqG$salN>-6r!V!fqQ~ zj6(W6{vjnw;)E-|{9bh@KVWB-o&agL7lYfgnZU_oA&0hOBuxS(U6(<>lNaA`wDx3N z$Sy1mg`g9&sDjZwDJ%zGQ%$DTA73Hzl7B$lcYus`k>Al(HIY-q{b2H!5GKa)>ZidJ zc{q;k!dXwES;EA`CBG9`zRzRR*f2PeK0@3sen5R7&E^BVh}6Oo43<4^7dJEp?{RfF zr-1pjgY0A0H(0mqY2Ux{o$fM&r3C~hOOS*QUE{fK0D$M+CqBYJ!c9fEGnRMMj?TOC zOlf7Z9oWE`IST((N{i{C*Wfz?h1ta8O?9wveG~Ce8#0=lvNn>FDOm zbw!JGsfUNE=39L7Rp=I^d)X~p5N5iuL<+ngnWk;WQP5g|qy9$4G3>=pEMp2Qli3KE z>_FxHfZvm&26@p4qr(&X$K5ZF^}yQl_}$-orV%H_TIis3I`Ki%|D=3gglQbQEjvPZ z3Rd@0Q<2Zqj?zrXIkZx^tzBUy!@4X&qg|IySVW(Pes4}Yp*oGPyQKr!c#)SQ1+;i& z8Hat0I);GY#(O@cHs^Wx%m49K_;x?&vnU2^)0m#$^=2g-$QYxZn0%phM`|2wYx=+t zHAbq&S&aG?4eh^@XL7ux7sF9EWtzsv!1;6-F-1RPQ8^|qL9w-b(S_ouc&An z3D)F4UL77s^}SJ0u4lFL(b1JSk!Xe)0OK82t5i*#WYLPQjRM(e`S9Kv4xY6vQfOQV zR5HXBRbi#1Mvy%}?g#j52UR)ZFPh4iPucaT1>5>mVhofoBs>7H=@2H6juQ-FV)9_| z@Rygt8MwIK#E^<7TZ~%H+8Y*AAc4XoSwjB)Sf9WCaFN@}rpJ+T=GQ%bU54)(R_4 zM3fWAntu$+vwWqpsAQyQ_$XP!w^cowj875W@J2MME1&6fm-pzP*0e-Q_;NQ7<50T)V+QOp=Q;>ne;jo^gfnotEF5pPgL+gx#sdR%(YhAgA<4J=ue5(V24 zQuSBK58FJ!Jdx;CV6JXPUBKrDA*tE;^~q8t={qlV+K`LmWueOj?07ah5=n_XL7Hutk~R1L8+^d9BzqmP{4Xl?z?{>L`k zCD&im9HW#_rskhVhBy_Kys`Lc9v{r_xhFG+sj=Q=*$01A6(kdX78o>QuQ8BCE>C^ zhYW)g&|vnBX(tLaG@P9>D<3;x6i8!RWC$A9vaaHLS zy=uS%hZG8$%7B>LW>$*GHpymGUMvmEo*9js-|$2wY>*sLUfTT~lN;izmV&n@xbK;; z1||E#E5KndSPVuZ(7<@npm?z8%Y-Zj)R4p zbMH6K1vD_kN_SLo@qYQBy|y-G^RI7;FP-8;s!Ot_oQ98g&^9k`0cN2B7n)i~AE~#E zUtljw>s6qvs+$#+8`xF-ZqVRB%pebLIUt&9EnlVGU(^^p+jNF>gatvQ4>Ao$5l}DQ zRWm?z>nBsS#NHA?l%vJg-z~i>x1^I{l^v&QQ!Euz4Bs>kQRLBe{|N;~#uyLs+5tk#= zcERCN(G{6Fu5@4J$q>SH#_MDN2gRr!XvG~vA+#UHjac!t0@O_hh=Yhs{$;HH9i=N@ z!l*NX0R>llrVXxOG@iZ(WGZ>!CeZAa{40ZE=LuhJT`4hv{Dd#mfvuuQk+Wvau)$;7?c%Q!68yk|<2MNJXnZ9IvNN3(JKgY~S~*3j`f|peXYm_fWvfKf z&Hy&#T%G;0sjpvp6pE2L_oGTxsQEy7(a^rAR-;(CzO5|vRYkTWqAvvQAS1)P*T0bz zQXyp3A^VW~c(*-pykfqtw|-4YP?1CD`9U-N2#VX3eElcic2*DvkTJ13t)w1Q0N%%A{W|s8754z zHoMW47K=R2G+F+kKC#vTb^^mpC(f&lyeKwr%0%Kq~D&z1At!32*@dyv~pU`4RE^xIy8PTL1ZWDzAK%34_aCg$!R=lNwRQ@!b zLps;@LTf3Wy}TzQ&q+JfOxUqJaf6;wPR?&rY>mr^C3FKh*+!)zDx*D9o*$;RazoqW zq?@kiy8=iVFRaOmjjfjme`Cc#ww0=|kt2Hx)|%_E#~k9+?CVy-?iK*_YAKeuAQa;;%A|(Y28Q>k7rt5OQrFVC}>Ih`|Ro zS2Q;4O-^%2m_0VCR$!#m1ZS+M+^^xa(OF;%q$EwUx5GWZmp83;*Ur8?`GUk$yz*m)m2VFTz; zhV2#36sLwxVpFt&NFBQ|rQ<|G_F=L*;cyGBnNAn5Ml>bFT)J>|Y&xKe+U_=4Y|g8I zG$qxN3=K!YSRDPjA}#Rpc``%>eq!uZOcnA+O}=dRX1&`U!ophURbgD~w=KVo$vF@< zuVZaXs)t=DT7}d?d}g@=HJ@!!9h1on0`_L*O6;{9-*{n^^X|&3Nfv?LZs*SdQEM6q z;;cED+(JnqJq@knKzOQ>y4!~+vYx7=rw*w?OM*|%bFY4=C!0*bib$_G+evChHP!wa zGL#gDzk`2Gc+?~(k1~Xw^_IJ7cy+dP4R)5Ps7gQ%;~TaUHN}zd?fi0?M_7;;a|bC> z{;(IF@W6g-wZnLYD#!}7$8`mie`$bwXSSj~vR%7Yv2Otm_pD(M05GIoATXyI`0HaP(smBUbXayjkJSo8Bk<726G`0n$0KIlAU6*Ng z3~&H{ySy0h1mh4?A?5X+!Q;DAviIa@!dHe9vQ@r}@6_$Z5`mPnhFECLZL^5) z^fj#{!EY*vTdTUv-bO&Z31Kpqm_Tw%TA2aQv8`pU)z<%ag87{ipmzw>X8&OS1_K%V zLyLV0Gyz4nX44N%$T?e)8c64M%ChDjtYR^?$xBC+wt|rnchN-d9I$4pWA2{-h_=sW z%t?lup3-5p<2QQ?PPam!_2(%&b(#prnpOU7fmjm0G}Xs9dr2biVlGB5oa3Ki3IS2f zax1)Y3P2leG>Hf?{Ag}PjlsCRjrl+)KJktop2P*C5{`F!UvnS^%haFhCICM-rc4+N z9r#_DkrQl5mm?pJEhg)K16Uqj^@%u<2V(Mb!g4Cspl`@@VvjxVw~+0{WtWb7%PxZg z`zD{4>N0W_FQS*aOk5PZ$#qJ=hWIZpfD@CiTN&09QDs$EpC!G~0WI@i=>0Gh^ttm2 zp?(22mSG397FIfyq=8{h+?DATIwnc~qD&d=G|5q&-}Q@$&upT)XpLbT@e8!jml0@* zn>jDm(&Ln4e6DP?wanppL2N~f%1-0b=_%eLGtP@&XXs|HvM;4#$R58J4kSu9tMUdL zjaj{5X_Uzg+}57^j(C)^%1{lQVt+;+M%>xVuMOjfT9m!*BsJ0+TfeiRCTSq5B^tGE zptM203^=vM^6%2QpmwtdqRrCKm>M$mG0wf2bqO6K$C4@z1Zz@vOi=0P0$t|EcQ48e z$tB(fNxm5iSWWbS7$gIAaRz$_X6fg(mr^_%8gx6z`2^Bk^c{?NNY-?(G!UWC5a?Wj zG?Lq2WY_|2(a)vE#41S127k||c3rUH^Df;0VLX-rgQMY%#Bd0rgj3IHov<*B0M}6} zKW2|buCH6#bLw)U$z)y_)6iwWiuWjHOEY(_FNW2gxzCh-{zrTV+A5{)Jz$Myh;;=3 zPaW?K^I^|7>`WPXZFpbXyd}6CcrmS`TWrOcgpf)}*@b5i<9&Y46NLQy_Gq*Im}kig zFCXbkh+DR%+s~qDhX~2w?}$kI{SJ$+Gs$z9lFZu0haQ4>n`p7wAH7dPRR(ULo85J- z&jfPj^Vq@s&s_?GFq`c0 z{qyjK5&MupSpDm{D?~>#kNIJwgUxi`6!3YA(-NszGdFBOw0FnYN2L|IHY42TnHd?H z($OE{GrS8E1wAySu2veah;sdIegY+vGk~GN#)hOJn+C=`gQkt1d%eXG(PS>!bWlq) zzm7`4PF1h7;b+43auzE#r8}`4NOd=ZUvc~#EcWVu5ru{x7w%XbKL4EsI!iS-#&bWy zqBVmxe=)33`toqEyn2gWUcaf2 z;OK_5DA~pW>#HB9tk~A=L>Y}P0O0fh=m`4lP=1 zO&=Y9cq~kj$BOGEGpOmL&`piAx|?P!i%5Nv0c(Z(Ucj~(mpETTz;G6Ilk zR9kB(Lca3mHN4`3%}RV*<+AQk^ReMNeOupW{foP?qMuRw zt9zg@V&ZNd7U8s?aWRj8*s250m7I5Oqz&x9ph;PB_%L}s?mWxVSqt(2r&spnj@I>d z#dfz7!V6!m)<~!sc(q!OteIHUgqhgGAet zOe&xKoUM|CvPYU}A&!S;2@fIS#rc@L3g~`0y6XT(m@M10nN6(f$u3L(>HP{};|+K+ z->YL<179voJhZ;}iV*!4FXl>*wxZPCHiz7hg8K}HrvYUp@G)PzhzOxSEe6}HcCS@# zE8jk)rYI={5A2Fx=cBSHW!{FPeRvjpT{AD-2K9=hfp%c1eThv>T2xHn;c6WojW~QQ zAUM@uu8HgHo!;Auh)ewfHhZ?ba09vvxs#ZqAW=VfiiFM+3{DksD$Q4_oi;xuN~!bh zEqQz@q}r!iZx3}!VTu$zU;n-7O`$!BDjH^DYCdCyt4->;K1<%?A<7UBn)^BE<<&1* zYTIFJKH|U0uY;YEHczW-jE0hYt8ebpO}rD8`dbTyPRfv*I+X7?)vU5ihXq1N9$-=A zjC06EzV|%5Qu_Iasl~qMaFw`G8iO{`v*{c+(5${7tBnY!w7+)WDPAb|qz}jN?W^*J zF<9WUY(tL=)K#@P zKFs`xA-|5^rRhJoFYwtsA!sSK8tMLZz{=z$A{dtOiO<6Ik?p_Vq=o^oY1J0s1jzsE za!*v1o!uw*zZ;U8$G>j*ZvqQMNeoCb|NYo+WA^Wm{Qn;%P>`)@t&Vmr?94rFr)sCN z?Y{%?KLalc0v5T~80Ontt}{*NZJvzt{MBT_`|HEK8bB>ip16DIYCrYM!ME#0Zqc6F z2*d4pB4Rohi*@tbcQlc>nO4>1?PfdoR-LPEX^}xjPsh3;eR`i7z@<3jpR)3a*#;q` z9aC9fFOOeceo)#9T%E&{vS41$Z_rpj6Ju#JTx>EhM{5=EKD8T>MZ-fKEnq>}5mKW@ z)hEjod*5%qyIT^0o;1#wp}hykG(n?xxAQG@JaL!s#K&_D88CY-TcWpR@_acMc{zys zGgIK?AyhHdM%x^c{x$CPWP01h&!r3B{KH9Q@`BZCWe%dt+y~c(-bS{>T`wBa)7zzT z1OEv1-TVJDHfD$$p25jn(}(grtqW{u0pur6VLwr`<)Wv~NVqib`p??_@Udc@TDv0QhR2PU zFZO-qyIzg)bh)kU z&v1K^Hf(as+4J_13Pl_RNLCyo2)_BZT^F-tGzkbv}66@9gP<-ADf>&$cbqu4RdXZ3)EV@~1l>)V^2X!~iA$G3-{ zi-%XOYklm$Pq($E3Hb%3)KgLEuNbgc+@25mI%`pfhIjwQjr${p-(k|N480ky4do|; zGA0l&VJ6L?hB7tb4%@*HF`+RZ!*pw`gm{D%rwnW9aQ>>6YgqE=RH)I&t59kq&hftt zCFUb(%}ThQ89Lu%$(jG)zxo+N|M;PP*vPsT?1^E-_LaJN<8BfZ)3h|CD^Ng6xn5GM zmmVBblRlP2{;(Dnr1S9b>Yj^o7agB7Q7gsiZu{H|ni>g-4s>Ic{NK|J*zSS@uq31{ zM_)k!Xd91sY;rVhk`w9H6yOrxJ*KJv@$`dxX7wErkNI>d^be zbz##VPfGzDJTd;f%!8|G%eaAq2Oz?HB{gd3dvNEx+x~j9=k`|W69R47Jd3n$?`FB_ z`)&-htTWA&g*XvK7w}`j?@Y}0m0r|OE>+v$Q4p(Wj14Q0|X6sVB z;e6ksn#_-jQjlD``SIS1JBZi#OF9MS+PF&lAq?fbm*+i^q{OfaMNCF571dnYVdZKM z%M43gFZL=Fwtu84nAG>>X4ug`KDPJ}|38~Op z29f`nHdHEn&>Rhs$sC^n-s4JyZ>Bgaw19M(v!}^r%mG3=X%C$IhTZk_Os4+y_xn3Y zXqZSAGa2XC>D9XJU$A24eOS4hc!R$7U#F47EF#o*9$j-lKSVefoag7y;Y*hqJ!F|y z-f2`7<`$w0Fwfk)7a$7tZ~M81x9k7t;T3ngz^_I-`^9;qgF{NS!28c56n@{jPY{PU zypsJhn3|9vQ^sLw3v3Ge1{YTMchR7&(>^6TY&77Q1DVQN(K-SgNrLWCJhfeQJzl>( zQOI4SsgdBx!#_cutKfe+~KDRI}$At?G}F=Q^YhtV4qcReYrPhABQN zLrh5$vg9fGE8Cshd&@)y8=4*1rAhy_#sK@x(=wCP_cq6xtMX$E$qQv)_MuM5z=$id zt3A=`R7zvSh%E)Q9PB)^3iD&vZcvDK%3!9-@YDqIhTm7CAwN)EF<_O zflN=Lek;3IM7QO}9%gPG8M`P-C#wAv*`tixJ@pT_dft;(IMYDN)+K}Lm6v@AgISll7h_yH z;@(FClYJ_P2}VLRP*s0)Z3*W?Sx@Vi_VN0blKc%;kQ+DH^i#I zL4U8v8iNxsmGaSH%^Yg-YQ?5P$^I)n28Q4R95A)4R1W00MKa>F3N#u>{7w>wvG7J@ zdfVO7#B#u?R5XXn)t(_C6IPu|b)3!YwRzPdlP?FbJ-4=)fIaU*^uhaf%XGId{fFW$ zyOsD>+2yYCd}+gFRI7r04>MK}3sZ%o`Gm{@h*InA|JiTM69IhO273RbL_~<8x~sj0 zS;gTsb|yOll=K%N%2nvMgcABe0!v?L?ZsPLRmPM$1|M7X{kwfpOA}U{r|wbjx2%_Z z+M|$*l#EFFqMNvF7urPYs?S{?ugp&aCE1?GbA9tHd&p*qB$n6fE&tzHJBA4iIY~a3 zat*a-$MvWg-cF8yp~{|fuDLLN?ws9RXC%C)Gq!t$2_F{%yqxo>C?8081!h&ppDO)^-6Rz$1yFn zr@Y12d)l_r#V9vx0V(sb?l=)~a{F%dNAvYmK8G!P<>|?neS+&IqdAt6DUysh(n0vs zG5GU6-KFqWhuI7!^n>q`#NBefPUycDYaa8aMFey7ZmW8mmd-Jm$V!<0HzE~*5^GrT z#`)w&UCZRw=iFOew;th!d3XCIr=QbmIsI5Y4hP>xPH{YugtGyMoBoO>*ljeuPogXB zN8{;{2K{y-6|T{(pcq^ta6Iy(=a+|E7PH)Y&T5BP{+j@8OrlGh4^0kxTO%o-MDCVC zv+Zp(?T;5&rmg4RUaP0_NJ{=*??0&_T*RSYW(_ILsx@(X!)lHP>^%&f>%{1nY<88i zdoL_FOzNE5=%t?>1ff5!!kUKgU*tER9}ExrBK;b|xH;+E8IGCZxv(k~@c&HknU?qL zuzvV$_Uqbu+yLjR?;m5wNznqk|GGV2zA=EA!+5OG8d|j;p+aR`Y#O;-x*C+~ z4woHq_2F|LN>`VniiqnrnztsR{W_&rt#+EgVefr?z0qh}mVIn_Z`zNdx-yYko!T;y z;s!~^^!~D-&G=os9;1QOuT6I7n5ahg*y`SM)Plt?|H(M5o7FYrpt!ue;?$|(x@l8} zD4ibbG@v4IH=a1$?Efqj2oM54!_BB2aZ!>o_14$Va< zIJ4^^h&}W94-^VF$~U6FcpV(}V&UqRZuRef+_z3+wc1HaA*T2#*otvk?(Kqf@V-lS z5+J*ldm9#FbGxW?O*)AT5@v^q>c5F~s95D;7cd=CDm)VaYZH0caDxw}tr*@At*E~8 zYF&JwLHc9~14wtYYUB9XQio89xNQJM@yDC1kW z2WSTEx;9euK5?8mMg^UR)7X-CwUNqXO!FJ#f6f4iPoaK#J6huw!q7NGR}qE!^M~;Z!*KFiMU$TA zDl5bYV|Ck~K%kG0^H)G`+N~=T)h8qK_HepHj5qJ?WU;}`L@Jim-Pxq_>098nWuH^U zHIO7TA*ZFNoT}=0I|OF?TlUZdx?%>W)>o@Hva$m}L-(4KSk$rk4me}6Jeb}0a{x3F zUEUu*L~TH?9tlY1ceUAoTgfvAp^*tIgys7AVW=DWKy7jyg2TBSh@)sMmzw$d&Tcfy zbb%8Z<=G`aS6YnbK*7LCs`2LVyY2$o1-}96R3AW1Q4$9n6ITZa&zG-yc>-+IVA zrbPWAy5CU{E|azcpD+c=@zW7eq7rdolH%xyJvZwA83tfLAhSsL#^JV;n!xRRK!ys% zy4&`Du;@${zMUJDQbT|hyjlq=gf$8;_dEZ**yxJPfstIlo#TxKC(O#U1{^L#!+Km9 z>l>97Oa&<5&Hx=3X8z7{n+QFiW~)D&kO$7CmGptsp+tH-0+JCx1atJHN;;p`3F?$p z2seZM`SAL$@8r1(;C;z_i9hOAsg6V!r)?;HnN?=Cj%c<2@+v_1F&sF9GMccb6TZVK zmN=Nj7(SYi3#kmRbSm!T$M{F=`C8jsfCw*E+jiU3hD?D#97`gQk_#YJ+#IhEyAE2$nd}D*pW`U<+|aIq;>kvMG&;|uI(zEEp6$w>|o zbBjUX6o&*5m>xJD`yz4*GP1MZL|BsJXn@5Hx$3zU@w zAZU5(9`yB~Kn$4R)*}&~P0pyhx=$%<$Wtb#TO)U-4Z#&kC`K#afiH!X`V?l`MYF=N zBZ*#3y;M_GQ?nllS+CK>6M+8G>Ecxo9HW<7yjirWOaYwgNpck~sgT9%2&}AnO>T<) zKXrbKkTph(>uRBI-)roU=p6Ks?~XoY(Jl>mnwYF9PMi5atnKHjLUMt{6y^W1_f>IS zZd<$3-JQ}c-Q6JF-60^|4HD7_(p^%E5<$948l*wGK{}*FIFsex-*&Hae}3oUyYa$5 zZ_PR8GsbvE9XQ|LIKM0Bj|xib1_e>vR%66hVbxpw=LMTg4oTVKFn zanAQ7Ao+t6lFM!XZTc^Dg6Ym^dLn4Tr|E~)!hebhx)p>3vanz-HDAmeMU35?hhwE$n24Z;+OG9nS!~Qpo693T-EZ^OiEDB23PX9De_>R z!9^0mPAuRN^BxscIsSa=NZ+vH6OF0$(MXZp)Kc(&pb{L*9UwJkE23J;K^F#O5iCxL zb~s(3@K=#uZGKD=%l&x4-YCdAd*Hnz#=gf`y4z0EDGYACu|a*IUvIHEw5Nq_>SuZ| zTUqgQz9TRY65Z4W+1{iB;d`~ydUrH)^WM-oUVhZo(PFswKc4E%_Az%xT{P%I-{c_Q z^CXTAsznvkfG(P4$w20SB{bEF@5=|7I8+e9Y@Vh-5={siL^Z8PM$?&Mi(s(>IzhYR zZU&4#?0y1=;TYsuYm<->RyJM}pT4IiqbcU_E9|Nidg-Af?V5jpkOTPIjaiCWnV>uB z&M%2ftN85^?Dr2lSuznUTj4f!b%DJtcyuC&TBa5};nqIrX4W%hnw+2H`iE0qm=E185~)Rd6cACJ?AMrN~+m)BK>8Pg96 zrIQG`&+6unWBJ;a%i~B|i-ReS+_eYwN=QRLmjDfv%UVSA0$q=f+pQ3_Gn$Fz13&8n zKWXf}jq^$x`MI!QKI*#ef60q0kQX*bvhorjFR~Hrq1Oh!Kh?uh;Zb+SvVCt(*Fm#E zYGj@HS}QbyF_+OkkYtyM^ZYp&59ss?`lp;i8f%a@0f*HXGK16JS8{gN&h-z^e_4w! z`~9iX>f!Ot22xULauBn2Ateb`mfXGwou~Bjd$EPCj|V<*;5CEdKul&lJM+N|c!YgT zANl#<1O&QjG)u3Io3qUYkzh%+G>J1X6Bu*TBv5Y76FKq^Nf_VUgw*3!|Kv-MOlO8>>~xK&aYz#4JqU{vDgd@ftP zkyxf?=w>DzgRIoIZ-nUQX(^T(*ay&Cw;6zCg}tcY_gy{LpGGM=FdV;(3?bb+9#< zNW28hfaT`oxH>vz>N7Cb1EE+DdI6V7=M+>jv!VsNFvJp87=4i{C)jF?aF?zatT-Y3hL!x#?On0|)Mv4eV7} zq3>#`Dkbh43z3LwQl=q%(r`FQI33ZTH{xmHZYJQg7bXrcl;>$*zTXF1A<6~q^Uwi1!^?P~J{x$qe2YYo zBQ^bI0uh>!eNb7c8%`4X{DSi5Yntqrq(+i-3BrHrLF((dkei`v3XCrOv6mX!Yh7@R z$QTxCg@H}43M@#0p+gV^^lSg*3tcBI?flc%tr2*qL#L7{8Us|cVnKwFNRoKTBU{Zo zs{c8sK;>w#2VXB~jg>Rzb$ZjVe$roXiLARUo9VXwYYg{~tlYX{b$X8->duy zApiGM{<)I>yDR?>1WW~eE=m{3J?}WoyXPVSU{sBH|2rHUoaB_0oL$d@Bl^ElQzc#0 z!NEaHObpaXW^mcg0zEKPQ*yI(GK)>8slfkJt8@cqw5s!#<_Q;URZnDsD$t*N5a1`) z7L;kJ{XQDa7-VY!HTQkm7Qlc77K?t-!QHYRbyXC5t|g;}M#Vnj^mA}Tf0R_Vsl#kg zR0EF>fU#O8@VmBlcP|>rn7L|6f1^v5I>cQ=UtgchJ7V&oPPz^N;IDMDPh0BT4`xGY z@uAn}Y{T3T7OWv*L)JPxPgct6#l=ZD?wHPxW#%{CXet#uc&Cx-m>`38lF55Ap$${<&W?uPT1Y&d7hPgS3w zXZ4d>vc?g)3@RVN{ie%zu3q8r_Ct1Eq)$b&;v4h!kFIb3y>=Tk=*S0~(Fu+tU>f9& zu8mL#7USrvurfsGYJz%kO(dQU$lW4Q-K6PMurw;Ekbe4b#`9g{&8?s3exok1^w+fu zR}B~#rK+?k?vlUvfsY1ZKR(;cv9<2SssHfofE)D1fO|2#}Yb4bvTKD0U_Jei% z?!4)H@TYcrIvdkj0M;{VKU4ivcYOZ@e(+hkS!sUSroYANU;l8?nndL9Fui#BPsHcWg4@pK9>`)u*Va#GNeb zYXccDBX6TkY0I#LgakR3)KqP6w+CQWCZ{C6 z3|m@SlB)$kq?tjRcxT~K35XsIpGpOGVt%*MNjqS0m2)c75TKF@>e$q8Y;4F~e11Js zHYv!Jybk!PWZdMJ`otmut&=W<+;%!PIT?2(wo8r9MRP-2*G`WQzmij?YAlDJUWPoe zeqgI({Py-X-C#@*taYb1nab_z%iS(TAEbY59FVESr&ZOTKmVt8FU5Nj5GfAd#D88h zUH`_GZMwdC`;Q$`VS!f45gdf1t4QsNPG$j#6>eZx^nzQY9Z{3Y6k$J(oM5(oqR zhY69#4uSg`7{=c|aTr%H5YiCS2Np4f_4$KY&hNJ3t_~Mm0VzXUVwHBD{L!ySF_W9% z6?Y~O&sZRZ&CXX0;N7Dki;9Yv(#DPXT6OALRBss*Eg#2=m6$$_J=eeAdd-x0{CeFg zWWVX}FF3=aV`B0H{SR)&P|AlqpRd00L*usoYBE=4Xa~>kaX7!T&B86T9vG4e^woHd&}|EC##qEC3=*!SIs-p59o^bV;g+)Z zN{#&@_d~^czT&0&L)3RbKpHyO;o4fvjUL60`)ujefW!|Dz-^ywD+N79XD8?uB{jp1iOU;dmF=QT1*FF5?i}EYQbGUpBv4kam>y90Hz0}D!}}fC z8k=vK+k@^bmwSr}RmlcD)(Gj( ztuU<+VDk%EY9~cr^JSO3-bY%WQjkuyIQNS=>r6IcOsp^cjLv>qu4z-RaLkw}2tB~i zrbQ#1j4K|d@GUy9i}6L&wl>3P;{9s)mUx5Iy=x^yq;seKCPHkh2X9+iV=an9l>^)?eIfjZ!5<)@gu03OS0 zZL%AVq10`sgK5GqXBN8~d5#rg_oMKM7JkxV!eCR&0+P1OnH$?7U5ojQ*rJ$4Qm z%59u<=r~>8W0Q_Q!BS=1;H0|ajrHAyI&>A|RxHa6}lYMa0yX5B;etEfPygJKhly@Ex4X=_ftT4}0wb z5R?P*aHo?DMhhixN@=dmcCISDf?cJ}77kPzGIbP)AtE=fvDB`mEBq*1*ZmDgy<%%b zAZ!7;+Z1pia93LJC2Y+Q>*DP{{5*+!h58Obt?+ryX}`$BdvvH_j@5vlM}sAq1%PM9 z0jFlM_>&pnnU&s%D9$$q72$%^cvaZey+tfHlb0`23>9wOsP%|#d5VqGV&90fVg`w1 z1{d`)=v|WQ*=3lQ4Sh=l7PwMkf81{wC=G`MJZT{4SBB}}2T;85iL`g!8F_gV(EzxY z98McGmu7mv`HlgjDC>fz`pJY+gxG)=lrl|$9%eibhfk!z*BFfc`s`B}DhWSyBE4G5 z*lYs*RF5Qg8N3o&s)a}^2QkdR@rEsNRJXv&8=#0g@GSDj zO55VWeng4Zz8VFchx(sW-`9!d1)&Otz`*mLnz6$Ke*EmP%zxW`c{LU129Ku>|6oVq zdUrpV3a?&@A8md%HxF!s9?5?n3N?sXEd>IzwP<$oY$AmYR#y#^-UtlP;!K87eXqiVv)JOvl4vI6)y<$IIDdJAVfgf(|injy*dv ztCcNS|BA1}7ry!wN4JYULe>0QW><0`M*`MW4b^S<3=eEbp$O33$=GAxO8M z*C(svh-$rf5$qan!V5aCK`>;43gI0EcFDyJHdC*F`UU3 z?L_7zTKMKYyd(idE)^+eBw2;%T8I$KEt8HTJ2{qWTxgO)u?aK`O;*||cj9}(!>)8E zt@A~NFS^xtp65Vk?f0;W?Eu%7Dl7ROcV??MH0kmP(_*E;(YRZ8&{6$iKP&!)mriPY z+G$Eh?bA7-VZlhqqD?FbOgCUm^jDY0& zN=|HXz8b1?#3uszx=MUl*J>6yjoN zPjTp&k*&sp9DG}agm4$1t3!gMlz@1t492_nzwIGsEU*2dREDTeu*(4j?w|(REaSCu zjv(J?2_Oc>oC=`z#Y*U(0PfFtSs8t&&a+to6DJ4(?X%NRbWyib$iVHxrKZG)XX6rk zyH@9=4E{oCR$VKJg0NP%(x~|S82)}k=Ayw!8etu65iAdRtRIMG-~4?rM{PifEjB7n!~aL_KWh zLFUpJfDzf2sfH=>Iz8G#^hOaKa^<+fJvzE!~4;Dr4ltacg z^-kKuZ;|kXL7$`vcD&S%0(zTweA(LZ>tBc*IeX*348>uWngi0x9r<|s4^Ml5CI}eq zAk(Er`t?X-M_$%bI>Sb9B$wK&wr@P2rF)qqgYv`zxBu8UVffv82BjmPNMW zwui_hAm+>l(1+~66{7YCp|-{|voI9fH5k%chCk2_Tp;Zm9G1(BCkE0h^&8%`mOqd$ zCTTrxG34l~XXe)fqbEwcD!}8)3U~?@#F!C*$Es^+`%e`BK2GCI0uy2H_(?8>a$B zuW077rB1EjyJe{wqs9qlP7w(BfHNy-tKujVq=STwjjhrFSQVYQ$)Vp2FgjEa7)O5d zT|qsYtmkaAe`@RO!)qkyYQUS!Fn3|$lsZ1Gp?B~&OVk+ltj(*_^S^I*h6UeFd|R+}knj!0INPRd;j@jp@G@vk{mHz4 z(&FO7Yk1KoGgJvVzFal9giZww*tOF=($^_CyjGBc&`M5{rV%eune1j3_VY-oAP*Utv5wlhyEiVfE zpVr8o=4-wEVnIOxP))~x0HEan)*CYu(}>fHa{lr{yx#;Qa7H3nSiOQi4w%eB8Nc_l z(b7X{mjI2lN4rtnB6;lQJDt(f0FSNKoJ3#^Q(Vd_LV@2A5IAlB?_L0%k~p$`3O1Gn z|3zNr0oK07^JHf@QzSpQqu}+K8E)m@f-j1Th)y#=)!vys@v}&Ksmf5Gxp$;;jrJo` z>n5*O`WaF$9^@A9>^MI?y8Kg6)DD-isPmS&GglGWl&rmz5)YQ^v|-{lpnoOz_n}RO zM`r?K+etGoaCGjvrUItv8pUcU~HA1BzJI%ZybbRTB!ZzJl29whdQl-2| zd8!%!{Qc`(Iz1rG!&S9$qf+qJX}41|Iz0eE;eGrzE%2Y1TB$K4kV$C5?{h+P56j|+ zc1Onjj3AK(fmd~-^|g{CAW8lOF(4QKZBC%GLgzK397@<^E6p7Gk&ynYICiP_lPqhx z`quvIxnOs9D@DJu2|GHD6M=LMJ9H;OP43SL?tf(L{Ea|lSKvysRY@(C|9Q%9WCE7} zG)AekAo(ZwM6>}Undf^8bZ^mGVG>Am5K2ql07VXn8q? zW}TOP&o$lT(%OB;R{+$W9(j8^ZS)Sd{k+oN_cdRC+%n_y-^uchPHjuPSCyjAIv*?Jve}^VyX)`IS!wo{k)jUW z7w|at0dy88Mkq;($D{kubVxXAc!`Bewbe;Go^ilY^1dUffQR6Kvc2cgO6FkGpm$CV z`;YWpVu zJlj+yM(vOK?JhsoAbznk1unkJ_PsiOp2YB|U%O(|VCrf_N>ax0Q=^C)1(9gUW6FIn zmDlGIU%67h-tPVV#6lr4uT#WN5TDszz*akQ)vh$`S9ITBqHhYVJK)*b*{OG2<-YwO zr@k{{H~=5<>4S`#cv1S4#oFb@MgmN9ipSB?C-+y9`VB{EzpjEkwJNiD9o&X-M-!1) z=;(Nz&n-;Fwhf1}Tdv-8Muaf35G{UwiDiZY4T*?^)Sb!iafrYDT-b$*@MV7YmW^iD z$>6)}7Gv+D7s73R_eCJb7P+j!udmD-DHZu})oSZB|Mph%pn=Cu1%H-y{gu^NdWZkd zF`|zh%{GZ&5S~+a7`BL9|25O}*wT8seh^)C;{UqzS?pZ?%l(egv5qRw!TGTh>FZ+0 zAzyd%l^G#SIM_phoZ5X8hmd>XhdxBY99N~3t)GW1;@*m!)%_chTl)FAT1-KKYopUd&5?iy zHJ=qN3(St5+Y7S!gjJWXE0-JdG`B6&*_@?2ZIH2nQwlfNby_? z%q%|M74-!gyubc2hiK%z+VW_0e^Aj{H7Y0KscI$?xbm*`fK>i0wI|TP&~5yyni+~Z z&sOY-n%q2vPY9e+Qc<9n6ZIL462VIQWi(~I+_kq}_rR_rT)}&yd%kEiJdhbVL9`B9gWByk=a;EQ{+qMcM)IiwSSvL@0S{A`n0ZL}?J<)-+4so8&bNYfS{n$7fZ@7Pelm4)`* za~5WXo$K%>hWqFA{=U~b^=30kc*d4rCC^VpwiDxm5Z2!oz)czD60{%97EOKH?B8WE z=)TEDV!_8Q*7o^Y>Aio^fMjC|Y#4sbcP|E`>YvukQ|N?A4Mb9B6tB8WLe*)L9?@z!q=mEa zj<#e(6nP)M?`^EU81?nDTuB>?gm@R4h0|ug%({Dw6ct!Ums{|Sn?L!$t+)8_$XILJ zXgYuTMqKJm@$W#j6F20`K;bM!)10T&KMOKZnZ)*EYRYh#iyD)z#S2_xw{;jH->fM1 zukZC60@P28mO}#Q4b4b%!b`r|oBKoLAYUl(Dr~)>J$3W{K))Y{zzCY4?|R?!8g^qT z67isF?Nh#YMm+jfj|$5b(|8)39|9*C?Q`6xo%pkS0(tj74Sl4d0q^o?*>$PtL#N-y z{%&L>t4eMZ2K>#zg?czDsn`0~u2xG6ICBE8$sCszu}f*KkA@=Vvj!AmSYM11&{<3x z;XaY(j2ru$NlmB+Z}!P+GwC){#5u{U(Ta@R?zXf~tc5NySncmxRH8Fdb61C-BjfKR+(J%R9d?)ENvH=3g zH?R%#DB<{ajK)X>cH(NNwX~Ryg1n6Dy8^zhwD`6M0wVO97FS#Vxkc2Dm2!3YmurXbbY9JY02&A~qf9u^>)C8rUx*|}vC4#qou|FqG z`-MKDkQHUCM4P6V)_55E-|!L!oSWBq-ccZKk}NuyPQn_7a|+#J73TnrhySZRz#I(g zXo?6wa@~2M_sPZGG(5G74< zUl_8v+*CvS@_}6ewsZDd6%YQt)VY|2NuFi$I&|cGP$-f-nTw{eP&9Z+eK12D z7~E#0G9O8oGdYESz-J0uFJNaxHH@zn2cO3g3rWY2J-S7Z-y~=D4Fs#l8fqa+h=BZe zkS{*e_%_-Lu24ai{9O;*$Lfcrli{fq6F*6p2#6V{+c4HZ-L(QiFEK>I zigzz%t#7_|iFwf_yqM}~uavu`9az5ZK#ap0+o=p)QaT*nx_dKTZ3SEvY~1Jl8e_6pTsPQpHkka&%^T6B@tREmI^Ce(m(Y~v%P*P&Q8cFZp^f!a(2}d<8faXx?b`Xi} zmT=#YWGYsf;Dx^fli!7X5V*ftC(XqtBNas2ywlx&k7VdK!D@ym#_e7gERD7Hq3Mr_zWw^s0Rf5*8ZsxB|43-gu&*0yeSgW(iI zM%<26 zZ&iZ3G}&Nb)*z`fcGuT>FH$u?t|qEMp$Ff8M40OEc!_|jbu`?z#`8ASozeR)#WULf zu`{6~U5(Y>d}VuiSP41Gs9E6p{kHd`r=N2)wsUpp#{U!n&R_syn}ll|M1yKE;Ab%k z<;TfjX4&CW7~pBvJ@=>2imw%RK5U;$v`b`no;i zqGR}i*29-a)Tw!ZxSM#CXp4&J7(IZHm~|&Ogm3Yjn{)(4TgS^WH=%`vZr^7o_#HIm zT^+-(!-(nYOqB}9e{m;ygn;`h3)*=~A*hEGtTk*l!=Y>=$|W5lO_J?D98GscCFK`~ z4&pl63z#}<`5tv9`0|xl`=GWGynu@Wgo)HMpep-vTTC#7I>|%srtCLyur<}xmKs%i z79HEk^Q%5~a0xV(D>tO4iC;UE?0n%!%Km}jotN!&ywLgr$%9E&^%LAeuE$ z^*r20%s@M|K9r@`?zXYHjvcrC+{?u>ZnVBp*$|t+;^2FgHh6|bOUV5izh2J^m;Q3= zw!;Zq`V>Rcl00s1B}-~9`x7!0$NU5(6NgXdF?o0#u_a6prHu9MCN$EGr3BPx>#tGj z@cbi&)l@#re35Rf?P0YUoHmnXmab!nfgEw90%JQQc8cuQq77?Ir@B4CHY9Jtx1B;l z@p*-0$!BLjDzhMtplETyUumhoVT%zy0ZNIIB;M8Nm!R7>kxUG6?ox4s=OE#p} zIQQB?Aw)i@22Zhs;b+-8q&%O~H)+EKOlC?_fqa2rIda?K> z{^2`8B-gJnRU!puV4zc%BiD>m4C97oo6bV+O@Hdypk~BnF&v|G6aKzhqV0A7{at+L zQ|dd!FKMBgl*c`<-}ch;MkAXuH$`w^bSra+m`Ed!t%qd{(z3_V=;X5BVSFI1YP)ku z(OzowW~>##w-#NL3MWNpClg5&K;?>X@KVLCU2CAQo_$$@7iW=x>WLAGBkZ<2ig5OJ z&;3LHXTA7ZKcQ&Plk7IWh*mf2xvTR?bHZd6fgu!eNv4>Ym%0(33sA`5UrG+6y(3`k zvY>#J7zt@K>rP{ZPRZi%AM*W~LVV-55DIB@@@U%?tO11uBDVLpd%n@Z3vgSj0lc1j zj>?L92(L6RZPFWcp)$3K1AkorS5zmbUn%`i6Jzu?&}xfgYy*jM>X$&xzR9s|<`Awe zS#Y&aAgcTeKVJjqhHxcKdOf|V+-x?1jorj3VQ3R;+w2d>n99e#runGpF2-iC- z3*T*EBujs^W~V@cXB`TGTnJCz7RRiIFY-aYFzH1h?0S|6a^mO_hUug;b7^mxlsl!7 z>BlWEAqWzT6_H%K>yY0`&IT`O<1P-G8cApx+ojx|TdyG6jX-9x|P#kE9hP9I;_6Rb-=CmB`73ZI*xFq%yQU&yG3?# zzeu8QbKApSZ)%YiO1V~dP$Y&09VYKu3NJ}n85f76C~&uG89Drw!82Dn9k=Sn(g-76 znmThr!4j-)cn-&<&qel`T9>&!NfiPnMhN8`=kr-0aqCpqK3~f9%SEk)sF_v53KNpi z<-u~|1IO~W8Qamh?sdn>qGI+^_){k~7 z7ZDC(hyx%p#i;xwe@=EO88NbrNUu?LnD!)k-`Y8fJxcy^;R_ z!8F+qptLrW{Go5I%z&pwmre8Tr(C-GG$VpP!)MGrOjtHId{i+(xp%eNS z_{KVu0O%kDEk1wOoyEXx_GC>e0KN<5GIQWq+A|?^NfX`sz-c3BeT*?;TTh$e434HL zv^r05CrFE_w$_H2fT)j0p0zdk3gL>9fxX4bkgtBLl#-4umE+$(oRO#ap?4KbL+Ehy zn=sbG3ph;=PJhlnI2}nT#b@lp)gh6n2FqK>mwk)+SjYS5ixs6~S70hO1_zrg$lBqy z{IKL3R!o#ry)LRNH2kpoQ~~i60H6LWx?$|jW!S#`6r_xVy!@rJ{|1H9t7^>erYc+D zT*dP-D5QcAe^hQYhWxB6C%SNoAi9dC@i2R4Vw8s9q?0#d&5hqc@CWs4ki|biP&-bS zh}`0FqL?VSb@rbNc(mw!=!VQDG@@ilC`)ZLo+zv*l1m8SVurE2WC|U{(6Q+mg z+6PeDE8ZWe-*95RRH{031Gz{rlHL;Uz3;snJ0lHJd@A& z7*Z{wF*$rNYPNFq^XpN)01@4VeC3bF(9;naFLYXCMuofS1x*!|o+rhMB5XR8V3nVC z*gjlQp*<3meLb{7Ni%jjDXn?9?=;3!I##`lK7Wg>_Rg$y4>ATdZ}p*E3ZaL_rCy4* zLc_`BAdIggO~bE$3g&rW`&wjXwD5&m*SSzrVCyG4R`HCvxYaS*&OSBN4&#(n))G4j zq**iB4kw9>$*1(9zj@s;qfYdm1tPs*NJI@Wlg*tMwY$t)s;m;D`@}V-7Q9H=6v0aHatK@61aH&LYl&6j?9czwb`u%gel&&}Lw@<3a#1}+i%Z4gH zZ|DqF-*lvJipgETVza~V^_ zpJJFY@SX?=Qz1|klEj4seVv@>xM_KTq_HZj>OsblLroe2DMlv{A^7kmh??8y`mpQn{r!#|HEgXfT1WG}85-$yoGi*hx(A!>m>;YR zdM~+ArxtdbkB9mF*bvu2DgF!b94Yyfkl8|KN<<586(mx@isM23Fy z9d02Q^GCrW*RhO?LF~jYv3l`zj?cWDQ5g+(wu|xAFckI%PK!tW9mCcH)uAfX%p9P? zb^-CT<6?>?f{*c1wm(Ghn5GWJ_@Y$}l~D-jrqC>?P_dV%JEbmvmKdapfSid|+z)ra ziC#(8*m?eQu>64fgs$ttShLCbXL7>KyCHo=Yk1A#D;3MN6nIRQxgA3EeeFp*Dc!B^;?S{fz1sN}9oKn0mb zsf7KR^jtL^n&xLyoS5pI-Y|H!(~nR;ZD|aW8YHK5=-uYygEYULb2Md#4tYSUpIX%E(<~D4Rh4TLQNK)#{=Qx5eG%gJhZz4n^C%fK{wr< z+(oN|`hy?8QVw4}o)@85pGtCEuzVw|lkAag0T1Q>3Rbcj zMk4&mUL7|xHc~;{^cZSQ(5U0@Y(M{`<9_d5V!c)$o>5Nc=S=RN4rnJG92{{AvE;P{dV&B1gNH4G&bY z$i(D^M!BL`zqZ!jez#tx%JZZlD7M#U(&2L$Tp^bF0f^7mr4_JJwew4Y(#IuLvmfiy_F$xpw z%5;SV4K43>0yf_IrQ}*bMBwv!rxDFQ@?nXUK)I|$Q8LAsTuS>=2!DM04uUsqqMmYw|};9O(p zJ-|vm+I1}CyAL}hM2RLZRXmt}k0B3*ZoD?gr_P7pqg=wqr_5c9PN-8GKq=(Z83M1g zDlF8{+LTRzRd||}y8zuwqQ*=h8z#@v9+5lfOQ(?;>~OUNBad$zU%WWp3bg~T!KrF? zR)b?F_HvrC0_p-at=Dshx7;Yeh)(dPsEE7L6dWsVZZZ}iavXK za~c~K*Fey%hDq>DM1B~TuPMb+qWnij4RhR0caC|}YPQOKk!qia1#GYW?eG;grX~IY zxqCXwx$74XrC%5&8g96CNGZM*T3kZ^u192e;%^Y*pEH8=K=@O;6tlz+2=pIu1e;@p zKPsiiF8pM|?Yy}?pf&EQz1|u1vJ^ZQpbdu`bL(z#-{*8*+M8R+7-hpc-#092)vBan zU(cQRVGwLJjq~GExdud*ZbNVpF1N$V5Nbr$@SA%O?X97qFc(_!vgMA30W|!46mAFp z*N>jb%&Ed0qnt;v1fec8F>O?%f)P+~sG6McZ>hysb?fT2$B##Z;j8)zV{{$IPgW}B zhivdJFXkNPIbE+>uUA-`3dFERz$8w@sJ6`%BD%!ypBSyqW2uyr;4iB8DCI@OM<WVO6XqDrg#3a-W4EB}2@JtRw6Y9!>_{IMj|A-4 zkMUds&3c}#4y6jG%P!AXTguDv*P^%I<30$a3cJfsoT8pEzZcyLnt;wk+kS9!c!>3v z^Z6{hysKO)arpux%CR-)@ez0H+D`TEJezhQC_%Y{zuC)gE&)wMpYwpTCY|q>OlJc`2OQM7_*>cD$bG= zVqY-eBPc?Vn)uaz{C&75okmdGN>^sGiN)g`RYJEP;>zq*^cj+RNn2MA$p{I2FbVxf zudO}Rlz4b;X4!#@E5BJ9y4W!cooZ`>_eg4K0#1kXY$@w`&{a~b!Md+bQuvKQ+$T22x-%dyVgTMb4+=)Pm# zti`t5ztSM(#fuGa&WESY7akM(2stWV#@k=jFB!9pJx&RDBfo8|Gad{{jMkH?M^FD+ z=Qb7|EzC{*7<7Bvp_}j+i4@(zTSK)yQ|_h;H1_X&y2_`#Q%xfzZPB1<$S%D%ZijRB z^Z28m93RE%k^MmUsvxp|hzGB9Z-EYrIqiB(_Yk7%?p-V)_sv04>i*%xHWHHQcVRI& zT*ACencc)>nC>`K5@B}NF~P8f3$Jt-jF2M)c-(3e$wlr;-P>H(L4~}0_3*28U1F8n zy{It3E~5@-tT{zg&Lr$q_wo5cr`e_32}~uD)SYUF=lP-f%8q9P&=6X0=UZ6%)Gx71 zwBtYfSuQ}vBL9k*wdxzH8IZau@EmnQ;~WaVK0%yB@NhDQrc5)!*oh%c+DYPqA#&Q< z$uT-(xpTf{TmBJ>$~w34J=A9YJj7lARz^!<4Y_In9{Uw;wGZSE@Ic9q991F5e z5aQ>}wz}C)Ww4E)9$sC)+21unR6D=8$l!Dkhuy)bcA?$W&ERnyN20&+)|1G%uk>}LbB|8af6a7*g)vM(tM88mCVJbg4t zJgHET%!QiIkI}%DH_x8wi+DI1`S_PT1Ui9%+rxp@rVC~$3aJse-Dgl2!=N%C^6>ef z3tHFNRZr7Mj0xm4Eeq4_NW{kFu!0)gj`8Vufnk$KZt7$Bwzs4GXj6dzc^F5PM*%PG z5}~Wf!DQyoDeq|?#g=*YJs91f+TMLZR0$(M|24U-Qlz}HbAwp;e^cJ z!FP9>PL&HOd94^yF#D&=YX}iNa?P7}^Aw98w6}2FSYR*VwEvc7`B;$49^YPI^SEX8 zI1B|hlyWSua}xi+I^O)@*G$rnzl1>!2>OC)`Fiw$?k-EAK^maMxPtFx1Lw zt%YKgV_r)4y|F+&d#g$!|Fh1AC%$VfBL7J4|Frj&VNq>ixPmmOLk|MdDJ|X7rGQBH z0HT0|f;2efAV^A=f(l4TNFyK&AT1yz9fEXs-8FbTN6)=K?{n{co_qK;Fq^&BUVE*t zzxU1Tqi=ZjMrz2N(RE{W^m=LwxUv6$05gmmS*V#8{VUc|BwZy^ih|^c?9*`V9u)T%|xz<%qmC1i7H?^N;_L-bKY#$ID9Q{`fPv3W>_6hFxuZ z_pg=@*2s?_2UA?Wl2`fXt)8OuqJRrCn+pLBz)wZ?YcR|AAVt6YP|WtXHk9-4q{C26 zkJ-F=AbJ1i|NQqT|Gky}HrVfH;{W%v0{4UVHvwrREdddBnnnUxm+)&62H=OGJUKae z1muHs@(l#;e|f2Z_W|-(ZP0ldB0CL8pT$b|I1tWMe7cWQfP8)03wnfQIx+xE zi~_~GKK8WCU-AkJ@|(>>fB~(OmU}55O13gm-VJ^x!`ezn$jR46E4M(eH_7-b+2A&H zgw|z#&||W>xd{y=%<|AK;ll8MYToILk+}6&SQTJ^9)b2COJ7P4Y&^?|3&tAkhW;Cv zDhzjT!ULdw4HkYy=8ZvXUh`t0r~VWG2+#9tAHF|3e813_<+~Y^p2A};lVmrgcy_vW zRttJ@xV@(E0m=vgam*DHuZ!?^kX9u5b&X^>3>=Oa-C;m z^ct`QUg*<-LS_}yOIXg4@Nm~dyQwSyCiAVr$>L4ZqXhu|5k@U0C|>jp`$eNT$?dh? zH>$~k4~g1D+}0-n49?t(x@XUxC1f{@&?46Xz;V8DwIH38w#sE*6rAFt&#kmC@+gC& z9sU175nV*Jx_X@APp(|on81wVGHxRXwG0FR#uyU5WD$rbv57rj0Dv{XT>#mzD*cjs ztt?n2)%_7sO$Wo*Wb>%jt_IgZ_W4Y z2x*VF>UFYYdgcA+=N(A`_*DR55j!dsv{~`NKm&d(Eu{sSp8r7KC5`LKiPxUo?=Z|a?H3XM@c8sDoW z-#(^TM&idCLJS2mukY7QLz-`z0McOqv8|a1&IAA}g2H`H4w=3_bHASA z2Dp_m;wL%jf&#=pDXOuUFSek7IRLWm@gl%=J*qo9;xFA~_-Eq6s2-ljOL{_}tJVd; zpKW_4>KDSA@VJ`$-0opGMv7Cw39)Biw|9m;eQBWDW-2u1+(+#?8l@}`z}J<^Can*T zjhL()#831Ej@XvumH}e%{igWZZ6<|>a`;!86_1zdPOn$H$@OKn1Ye<91xJyesdEFs zqf4#BuRz+|k5ihp)Fqn2o&x$v(eL^_NHr|-!re~*u2cRX z{b+PPV}4+RSBnvVxVFnXR7?dG7*{hJNkG-2?$u)1-l3PRVV*+rJAk6}4x(59ByhBq zekKlZJ!T>5Nsmu{WlO-ZW=2m8?|QE6k{<-j7=Uf@<79LDbS~N96a@gp@pe7F?wBdY zK%1Wj&WkTccDf!c1)1C51yu3JTiqqZ*36h#?g&gCY&aA74XHQ1DG`!~tnS}RZCf5P zTVJ+k9AbSjO!LWhZ*>eDC|D=vCbz){L^>#+SCuT!AZZ{22tq zDJL>V64?~PmMRd?$pfG`RG+i4gKjKO)TKK?mQxSF1dCrXXwmsWKfTk=Jq38i{ua!p zqW~WSS4h?pPED_L+^X)=P;hCxK!4B-G!_GbNVjbYNmY5C5P!affE%JukGJb7AfIM0 zAFiJq?M)P0;aA_~i>7~dY*S}-5E6S`_t7C|`DpaLPNfXG)_8#2?NgtJ2jd!T0R7Sp z1fS}$cQ;d{d?lSI*t8B|5bUy+d%AV86o zE_t988EO0yfVl$xofzdo(?HpE^ht;D`B7^0@VMmPXhq3 ze}e`Cs1-7tIZTbFmnGhv0)vHaXb$=zlYp^#J6kgo1rfg)hlXE+L*uAcGa15?Hu-b~ znh;Wt73m6idjV33(p1xow~s>g>h{)f6+N`6o+vCYdY$`hle>n=I+Tp_GnLu^4w(n* z_37Y#Hu;7G>G5PkWsG*!IR;X_nX= zXLOBSw6__;DR$~7aj@(mVK2KzWq79Olb$ zF-m39VHI!SZDP!zL%Di@%Ko9x7J4viKo)NP|thCmcU{VT%07^wc7a*O)*RbiZ8qmyDO0WEwH}zO}lXBZMRg>W6)6Cx9 zhDgOapA+`Zl$5EAP%an-HvXO0VV5C~&D+(d83-OLNeU@VRRus<0|c1)CU%Q6dVe)E z0X3hE>Th+)St&(C5@4V%0IsWi^4%`f=+VuX;d*9SkIV|Dh zKB*I8Tf?^p_F!cCIqe8@FUUQa@e-NKR5xoi6%|d{r+QESR8vXrCue#wLI^j98%S zXg6bOzmGdg-L4Fg2Hdc&{1P5ik1z#7d}e>uUx9V+KpoB+cwQPfobt3#Q^-J&<3$T% z$>XUjgP#%pg+riOnUDV^u(!-rsA({$j|$V%=N5tZa&1$>2o;7rrbE`N1-HhqD5~x+ zsQaog`VseWFt)BH<3x5sWM6ds%{@VT9o4ofe?wmx0D$bFZ^tDr*MGn{><1WY8N_Kd z8Rn(7B35lL02+P-NCnr0DB{f!& z`{2MAdSH&+DK?Q!Y6#(m)S92E>O546>5TX*i~P#0H=e zhl)D0Y6f-8;M+~_1H3Z!PU<2YdSdJ!ceh4QqgA;M055wQ^W$|wS@vu0vrzzzzoa)s zyAxs;K(YKpzyEQLFHes@F~!8q!b!kS4SS9?&L=tptc-gB=nD&>-v?gOUa?hv-Mx_Y zO9(zicOnLYebfMX2#^F17zzPgLi+J63xLmle?J&8c~e5leGbJE!P6+_yIj-)-E;)B zDC*veS`=x~?q%$O(Ch=CcyVb8uQY9bZ%?Gy5c1s;(lv2sieLIxx`aZgMnQ$45J|?j z()LDu&rUkL_j}`O?-I)EHS$yueq~hK`^R#mJq7WA=?R4a(2rcK_H=$X&sFISD2Zr{ z@xqcE^;pWEl8_6Q!nm%eFc`r|d9sT_;R29goq&p>p#-{6Xg3VN_R69*8}PXasD#(M z#MY>I%%l@uy}j&LbTLfv{rlV zU&u^wsQ2N1&-M2;e4e{@==8uAa7fa=)>uNo8$j|8mb*Sn+Hz}Qn#6oAS!13=H0 ziKBd}=)FF9lZ?b{48B*p_Ys)+5d)ECH}~Tt4}gSro1}T`2!PvP0nED?P8{AZxmjvD z>Z6s9S<+1aT?_$U_WhQY`y%~fmvxe67XxlY?}ag1t|N)nF_>sU1qk_<7~23@F-Uq@Au})|E@QY=b2iS%TfmZl_+W_rlsfpaw@P;+W963z)e#Any-Q z8WdPizVl)el>i$b=LIBCSsz^%sz)6Ykr5+zXO91GsfaqSplg1JRR<&>i?yEyA3u0^ zt>b0_5Y5-AdGMcx3x!gD3AWZj&%}aCe+uve*p?f!=`E*ulOSENy-57bDi1^bh(hBF z*bip+&>Vyu#;GhbA(s(^h4wO$L~&;!>RuVWsaFyB0IeR19x7b?L$=|KJEff+ML`3^ za+0%;)x`J2<(>i$Pe3(81rJ~?n(Vvc{X|lgKo`FV&<-7(nAtXJdKWg$nC-HB?61J_ zzjT#9d)uD7?)VY222TJT6kGFwj{>hFX9gAP?KvfV3lD--Iq$Az5FoOfLlV=Qd}26K z>y1K!X?zkoY4z;*JSw@tcI+wt#A`w0#+1d91&J_wfNRndF*LdLJ>HZ#@S(7cr*iub zm*1EwvTwrK-^ZKy50P1NI$)RhK_*)$@WE~ z3p!k55McbGfli2%AnXK_707X-ByPkDGXK^9&y8r-{>q2Cl2-bubT~#{Q)Fh>z}>(8 z@bezD8e-rk--g)}|N8x}o6jmqBj^-U^K*Xw_pdKsK0%iuC@s76fFY?|%H9(Fe(?qPH(VUvuU$H=e-25j2!<3{ zw7bRh+nvD>rNj_ec4~g~zlID4Lq7UCoTT#4G*I)gVWCB8h#4{w|2ZTT7;-kdL?HI> zIiG*{dRrO*E0w7*|2d=x5d`*G)7qB(&!^8$1y8?X7pwN?kdGLFJ^bH-|F__O@0R~| z_G^oTx$~DP%O5VSrKM$SYpbZ( z0&)bDS=t7C7(fuwO;*NUfV+_EmD=@@^vg=7AVUBO2|`l@tL$-7 zIq)<=>E1h&OJGbJR(AgjfPDw%BX>N{GL4^_n%ddfDMJuj)GGg%VVkW5XGB8kzR90V z57z8kb%%wBuDqLi7YAu{RQ9}#hR&cM7a#_mmXhJM=Dx%W{XE(K%lNa@1QSAbr=_Ls zV{#{Q(IF$73i4p7fzWq|99DFUHXP((cof4lKCe1=xFv}{M3zDz{@0XU*djrkqbUEi zUn{q#i@tvBRc0_6CgNoPA6OXylCz z9J(Mi=NOfLIXWKXKnLwzyCd~49fS*>>wm}Pg%7Mg?nNFF-gkq80G}ddOBlrsJIOu}iaLS?L`H!AWgVS)=^d zDJq8_zy@3{`S$Hw+g#4;uGsy%xhch@1+X9$g6j`FnY;~Js}1sfxvHwF+Sp6W%i}w> zT0QlK3RI}tB=2IKKO&DEx&ki&Whpk{uMKg&m*D_1{n@K1Pu&q5OBpi|(bdkIk7iPB zi_;lniSsrZCWt-OF0rGFdKFEG7yCl16(>;TG}^SaguPX()wJe1TUNAqzm0C`qEY@M z_6MG&nc&)re-bv>3qKQ0h{6fxyvmRFg!dwz#Hlx84*+K-U0{V+{ZtEq*+<;Bs3=}5jv8m z`!nyoS8UbARzCE0eguTqt|Jf20s3=+bJ_Ny$b8CHS^3A6Ve9l;-6Xe++`q@Nq&oM4 z#J%D6yO`f@2)XYD_GQr8G?jp(|0O}aGP_|AGE^yd&wMWUi~xk!I8!-4iu#@&gQAWI ziW|%lTKq*`2b&&1jLt|s9qG41bj~W&&dS5H& z=f5#|T2N5Xa?O(?2um$la0NttQMp^!VXOF5*YN{^_wKh;RaFfp>yamW6K8-I1K`p> z?n)6!wkvLZn`~dzL}p0k@#7UCI-=u!?cpMd^ce0ME4=kq=wnW1W~N-w>>VJ08Kcu5 z%mGf!J&>(lx#qdNF;HGx%47JQE@-yrLVsi-=D%ObHz%$EBah3V`4+~Wn4iai&-eRkwh_U^RRl0RIbtWEn zOFTIJL`3OOvtbtByQTd84NWNXE?Du5d3<%9&4^tP?#*g2eD;B*uligg~2sUSS_(*N=^J_e*?k39LM4vp!K{POXuXi-EI(W=VG*QTSE zfN}{HdreW3C1}+ho|{t%US||(_d(-2+%9&Bga3XiFEMB=l;;IKaI~i+nuwXXvh4KQ zG!_s79i^Wgq_4TPh~drPOcDEPd_3N4R|j$5*<+9eFxjgb{J536HVW2$X7@A1cg6i^ zWWopJ#P%A!04n}%fJx3+3vs1(n}ma%wj3_Dnn2*LSNX{5*j*$@e!Dt%fF{PB*veX6 zPJsPD^-;cUuGjC!%TgEk70bJ0RsG`V7#l6e6)b{Uh$hTy-rGH>G!QQj-Rb8u5L8}I zvMo>!4mWk_*N!)SqCXq<>5VC1Pl^y*t=Lv}T63-4O2tv*FsTu4W2Nv^rWgDPI_pv*K-h}69WieC0 z++@5oBepkMXlQit*PdOt8Rm~*RX`F7jyg87T23bTIlu9TvhuFmm_Jxbx~=$-poW+I zxVpb(t6PdjH$r$C0e8m|BaSJukPo?dS(tVp1j-Sy^}E>l91Fr~1y!E;&CR+e>R!{t zgfK)&k*Ea`tYZ4v^|{Vua_ezWd$b$M{aT0yq#-vR9`Dtid55VW9DXQLyWBNWnZ}P2 zUM_6xO$iK1$RS*kBuUHB5iLs(gD7M0!MGG&P&^EIA}>0S74}rAE=$hR@{=E?(`H^t z*E1&e44tF3I^T|?eIOjPq2KmF4v0#Yb6U+(2^~_zVnu*J5K<5(g#?bK`5Z1lS2dj} zLVeV!_IU^1glaN6`E1U%8roNWuP5mG{Tu#PMC)Z< zPkI#^z>SfUm1Z!_%S%izLl8BkD0Qew1XGHC>^qletum??s>(Y!19phoAVGuxGtBE| z02FUf2k}`Z;2J%VQ{OG2lNATwP#e3_ex0HVvw&ot+S5d?hE|54XYqqaQG^0t5`)AR z&DjQxvIpQdkATP$MeNVta|CSWGk{#(^aYvLUHYrhk}`h3pTR^j5b|{1yHvWl(IhtP z!acmiHDDW7*Q@vnCExP~^)j|W&|aVn&vQD2WxCxxn)6Aq8c~tr9GHF2{)}(PNUkTF z&fDX9Y)Ob!^Lju+6k%)~U>2US_`sDxzkDf4O=rRKgqsX*5OL8a2S@EMK zWm&_eGx}}Fk*OR8U9$(^u}`lAs>^35*R-hxr$tVQzD@ZFy&9PZB4U9sQzjasAnpOw zP1G5RL#sEJ==Ys;-wbShtku!YTcMaFuvwYe5%>Aj8EZR{#8Iu*A19xQ>4Fk$A*$ld zc=$!D790~0)6I0R&DJ3w`r7&yjDSsnY=!XI5g&s)a%A+>7s-4;ZC%UfK+DFiA=r&4 zKf>y7BFSO$tvI}|4;YG^7kc;gq1qvA1Wt_Z(Hn%CGE9_}Emto&y$%d+1x@Jpk{^<3 zCVYyA|!dm*x3SGWy5lIDTpcn*Gv zKb>WfIsoMaqV_3*4-GiJLv9e#w?P!cIQHiUI9LsXi6~H6+#!Y=%^Y^sD`jUV6K5xY zrS0GZR0oj*=3W4OKrB;U~bHxB;1Nrdn^ppAk066buS&C7inC?aBuWlD08!se}YbAUKVtI zW*7!ps-FUx@{;(P?TCUcn^6C*3_aGPbWk0Mpbq9o7z3;7hU?hHgbl&Q&+5R zwEwcZ9b zZS;b1R5)z|T`<+7cFuC-yJw&hV-MH}(T`xRLBcTfrg_P|O1&{!5&gb&UW!+nn=u}@ zllXHs4QCnu7}W=y(-Y~dyA}bYu=&7-xhBVxp{_|#<9SQH`D+j(^^)XU7Hn0dTEOfb z58X|t+0RkD9Q5J)`(L%x$DCTIi%)iQQGKLw)H{=7-i>HMZoeXt!yG2=O~*DNw4rg6eq%27=w7XyA^ZdR?jU zv$^+-ej*^5n6XEeR&#cGgfB&QOLsHR=ZuKU;5O4vh>I7>Qs5IrvY||e*6OSN3(rud zL$o#=#yO6%O=40LLQPbFxzhb0N&he5z)AQ!4sc#|x^QB3aTHtHoVw3u3@cB=r5$2WgoTWbEP5t)oZ&kO z$9_9v5@%nL`}@A5)wpZ6|AdU=(2XVd7A@ITVXGa&MzU#j?Ta(`nlb!Hh}f+c1$rE$ z6eG%VY5VPZ!wz#%Q!_MYZejL_W5OD}8aJnfhTKOxKo~yPrc)s=1r}6`3DHK&7Fe)N zAk)1TI-CRs?9WR_!Q|fB-KO}*k_J&hSs*y5o*cde9IifIeEPKagpdUg|2azD>8hmy z)gUU}iWQg~#qPN0+Ut6i<{R;D&cmv_{xc{Y@`^YxS&?kKe{77JX2v=!J3@e=pzie0 z!E1)nN|C|z$*>hlf)aQs2{v(XXe9kEbTMS45ua=e0bfq64nrLj&|W^sJF zS4YDF%h&GsLtMF2LqG5~H@BUc9Wg#)?KJhCOnvc>QI`~HW~iAHc+b`Wp?uhU$DL3@1dKRy>d1vB}5jZ~f+IprHqXLmYUu*Bc#`c7~aM9xCT!#zZ!3W~F)90k&=>1q;4s%0#g2E%8 z4TR5L!BPwMH8)y6TBkw4xpP_+;caK^5TE}0``=*$rz`!WSkjg>l=*nj_e7WD%l>SP z`YG7{r6Elu^gkkXmI@m$A8p3h8CBdE2K1RRxx8ew;Yux|0S!eLi(=#nLRpVaq`c+6 zhoCspc%7%8J9t^tp^+=&c6NG~z}pIV6V-~9WUmx0+zay;o(drDeWGoWUMyl!)L~hy zz+}i1$9e0g@BWuy{2BsOK&rExw>HD+eHu;B`Tvoh8J{s(i+Lk(zv^1`ZKUar#eLbj ztBU)yaZ=}k|1nwgTK5C5S06u~{K$+5Umz_-aLWn6zR13iVFB{ z4h)bOOVzR=gm_V+{3B*8CpidR+ZuUzh}$hb4*If#AA2}7zi;43V{n?6ca7f&oGqE2 z89W&9^V$&D@5_zQBjbG%kC2wN6D*nu7i%7c`x)6XS-6H+`iFpgeA#6uWc)#eEwJfY zHT+5+y+5IAAaly|E)Y$Jt;%u`ZH%q?2+c{p){O9xSKN84mPm9%P9;JgK`rF)ac7{x zbIsVBB(2hRN7IeDxAhv?LTiEyY`*=j>~D4!JctmexrBl|ZCRLKV^u*9)b#5Nr6*PC zyFSslqq2TQj=L0^5um`Snfw$KAzq|_!Q{gVp*QZSE$dOx#TLJ5t_iV-kaz+@D6PVX z;)6a-qQDy}ZR1QAe^03Jv4ezkPq@~K3mM{zbXbGl{0N>sB9R0$o&DD7V^?j1DzD## zZ#E@ZuBrt*Qo2Z8xaGB5RcMPmJiwg3Y?V%=Wzsh14$L4^LG@BTqzb)N=sQOBVHtYa zg`HdMY_B%OcgXyggz|Il%fhI%dbXB4_?p%8mpJ9O96+UpeD~nAC5M()*^mlBuJ*jj zDFug^)_c290G51yfZ54^7}`zT{Npf#i9s`-LK-1xW4HhH#Wu*{yIuKRY@-YZb{xRB zjiyQX`xAltKZW?a{_FoC*?wSalR`-UJtDX*_Wyj_4?3?1w5qMw(`aH94gtrYs{NJ@I`z@6WnNeHb5O2b^8 zX8%+E3Gy$ac&sf&q*5l_0@BluC2CBdBc2M$h30Raih}`>s z4jD-UhCJRbjr&(r@+uxEzkulW{5d3;xD3I;f-UE-2-S^+se{A{x&)3A@ zG4}=3dQd=seYgRdx^xSShDSz{;fwF49dY>u1WL=w!mkS00LNIsV{UM5HA&RFsquY* zLD4$}bqzaa%x{JY%SFoVtzxC7g{F$klrMWxdsG7@F27Z93r`MV zez5r+pPVa9TDFFrnB{g}hX1|{DKBM3HV%KvadMMuowd=$a?L)}*?IX0jc&dzALaSf zJK`gc5&MhKjX+#tW@l$-1UG>z_SciG=~x6ggGq#&^0amc`C9|+({E$O&D?kKOQzaG zSQ~{_7i{+L+0deN%w2k5vV=s7gSqNSq4OR}T%(#H#~>e2$F`i!+3-NB62%&q+3AEAvG{gLS|FLjGJvYt*5)o)QM}e08|ef2%V({6v zjrcgc{9fd?=ge?643wWrk)*D55lK|{rv)k>*M3&4KX+Fb?mq4);{_kt4o#^=G^0X^nIfU zjwuKo-u8{4+KG3K7<(+E%9-T8Yr-&}_HnBG3JqysIsfyD>1@rcm0pujY_^#5NBVf)-W$M5FeyIPrVIuR7!v;ErGMy2bA(&FgU&muHKN&I)#^dc##{k$7!-zT(v7Nc!TYGL<>GXINh`f=8taK|Ct{eNC)QKVaXne2WzPxNb>sX9#RcRHPSVWKcoJPT~+fese&8-Pw6k$Exsvw-dmK9D_3N z)2S=IL%qGlAZu|AFLAQ={D4BA!}BN^c8lp>q&;02U?~EX6W|CjD*>qeokZPiwF$CHqmE7YT*3z ziuK8VoEhp4jAWjo1YD#GeE%EGk(?aPOUL0rJwv*0AZToOX`m`ITy$~0@rrsTZqeZk z*wr6FO6|2Z9x7-t0i_E8-ciB&YiA4mj+I4s7yYOx94kZPC!&ptXNArtx*O51W3RuL zykBy=XWpG(%Q~l@7%y4M!oEA}tbG56e}f%U zudiV*xkp09E-WV5S+L23=rK0MzD5Rr{JC0@J^|X~t1nFs9XQBWRm@5{1wBE|Dot>q zU)S^mggN7U!sLo2Wz=3MsW&SHL!Amc1xHA@_MkoRp~PuaBxj|3;#wf`1EQgna(cY0 zt81v2kMp%Dy#oJsC~UiZ(xMT^Xg$j+(;(SI|C>t3-jEw!#fikLDuBE zUO(QxvC2{<8Bcg?VWVKj&Rc9H$1z+uNpqx_QsUZzc@%!Uz7}sH()lImh03|-dQ}e8 zNZ%B_gHnx=q;Sg-#D_9oDBUfV5EO+k=t>OYMB)TmRtEzy&CEsGm8|q=6~s@-P29}w z0z@8u`!Mu@FYcMzyoy{9nEq+X<1Xb#myao~tHh1dKAz<4vb;OF=;yGRHCAY8*5$~l4u$n?;d+jA6eW-=&(Mf?2`%J5%_S6Zey1$E zKV~7*e(6RvLt~Cuc}q8qgv~R#{A&3F)B#^t$3wn1Ih#$*bs&a8pQU-C+%!-x340%$ z>`*K6k#l&7?j(V67bNx)t~&vx+9Vo|>MuLavadVYrIhe+uCrTc(WB$jXXFF=RS~rL zHPW0qPEjmS;f1Z;7k!Xb>#!p$<-=>yv|L*L(au2P`*f+4@pkW`74-}ur3-(jglFTb zUe^Xqi}!ov{lF;C+dmA$ooBki_Q0{TZ#!E4| zMKAroUpu<_eci&2aU-_w$tAmepBRJip(;)?xr&2ffsLoGE2FiY6>~X#y5bVPx4zPT z+-qvGO&#^Hdu)_cn$40yut1osh%CC_l%z>ev@El%E@I`?4(=gUw)gq-@xn;(2f}-Y z96t+NHBdEAE<Tyy60N z4v{h*&SksLVXOqaa%xjT>MnJzgS)0RR?bGxTW%#+4{$Dg{F#e;iH31_y7c3x-R;5( zS>l$M7)ATF#RfuxTL zbf5NGw$^u3NRp=iGRjY1=7!kLd^~^$$%|1Bb447h=S#eS^=W$31v&4uysl@NJ2_!9 zJzgqyH@2PAKvoe1&QK35EbyI|nZXZH0h4YY&Ff%u@fS;nal3(P1lThpUHCvO=y8;-!7MwxP1;1spwt<=%=sYTQ4qekoFdwaO5?d~m zol0zQCZXg-G~58iYQh$SQOV&p;b=IdT-9zvaryJhV;f`GRrYD6_ojj#VynGC?5(Yc zZLgSYxP7{d`23_1*Mew7f(5x|?3*4>xFjQa0KddlnYCo=N~sZ(uB(m;DSg=od+GT^ zivh}i+Tnr_20-txgH)INtu*i5VPKO9VX=`6u*={U1ez3j?&vXAO~oWeI%l2Vyf zqIVLz~7v)_F{?sfyT@-`vV)c|K-iv=!!_TShVX=#XoLP|MA7XE}^o&?Zs%orCNx zx}c1?+o+>0tpKDm-#4dsAcp`9l~Gg{Pe|_03=Ws`lPC5-Bgg2{fO1G+bbJRH+$SK} z%}ha$wUJ44!rI$H~BYA}3s*y>&9 zKejP#P*f&7^YgI%mBT+j3dMAVAP3f+E+rMhhU^9|R@P4VFyw(Kk-Fr8rJWRoE$=Eo z+-ae9HA;El-~hm6CeBJh4H>Ei1&h*7qoP`FnV!&sioOCu7t|obuFP$Cum7V;%2gJ1 z&vrxtjZ>?6s>QdYG}Et-=hos2^hu^@@{MXeHd>$|>k-7hXJ;1$mkcZDcC*wZTd0B` zn~L%E@-otiJf7?ir6(k2isn-+7x12Qp+2ipR}|mgo!7l~mfM7{yX~{^-gs@i()&y~ zUrOZO*I;`CkG2=JY@|Zkg)Z`&I8x_PNNHx^tn>BUVh0Wd+zx-a;*fPD2vy?)AcIVc zVDcRa2sWaH4+zjbez=fz1~5x%4i|GRy4yeQe!I@buAqQ~MHUfRrf?X#St1;pLHx$h zzyQYBgeqaO&X`rPf5B3XUQ|3o7h^b6eIn*+M>Ek=ZqTx$?wam26FoF)ZkB29ZU5bA zq}2N$vdf#Llw;x4GssxTUc@H3mY0urovxCJ%m`6>jV8HdF(}b?qi9~E2|QV^PvusP8}g)Wp(b=W#I#FsnNib3^dn56agXZpZsQ zq^;Y*!j*%_+MAc+$E&@}UeIF+8&ynvMsS1f#rg4Kei#`*Xvljeq-MOGTOJ;wPwI3^ z>}yo^sB<*5A?!R{hO)jvG0cj{4yZztw!lG(BfvU)fI7gQ6s_ALRx!5(MUK}SEna@A zA83*x0A;F0xmJ&IN=pR>Y*TnGnt|E=jr(y&))06;lxX*vXK;(M_o0Xp*q!h_)4P~q zdX0usZL+OJC#6uT+AKQSGagZVOVQRkWQdJv~U`G{kuQ3wLPBVllBFn$07 zU-GD~o$UROkDEpGubydtWaz3eUm!FrHvyh{#*}{|zQ^uiYr_yh{0$+kqXpKU_ zdDsRXhRY9%XeKE0+L*|uuPu|!qjn?!;O4Gbmw7=JN`ALUOfIvUWxGbMgaqr$fOub?}|BQB7_*&>(TI^Xc; z5f#+<(k@`IX7JX%Gd$3{4sELQtB=wots&x`~Upv9Rmo~Q7gXr_505+;3>cj znLWn*@<+WJm=iU)%c3xQ;NQcYf0#7_Ztgty)45+&)PLP&5tVpp(PaB)IMf%k^WbfZ z_@eRuk>~_*Ly+irB^s{scjflaDT;s!>CXrFFVBtHzn@3?r6{;dztdejRK(+-*?+DC z0kbaC3!T3b41ayq53*|6;hA@SyA-upY9?wO7cN{}RhGMXw+odvI7PoN`R5(8!@(V0 zsA6S+Br(7NF=6?lj~_plvKl2mXN;_2Y{kE^{iMluaE?6SmDpTPz;2v)sg5D)otQbI z)!ihppFz!Vpj;Z1_TNRtWS6Sx(@fXUTUC1p26XbDtxA5h)(kSBYM#UBt{*1-)fin@ASa3)4kDW!U(G7Oo|Aosn z*pXjAP9pJ1HtU}|la>bq{t6pSB@i0Nq0bjk1sX;Eyx?!t&+qUhFo$R1vCmnQbr=yN-+qQLczVF=cp7Xxv-d}L{7;CIr zHLCU=t7_IWpZUzWBNgQ(;9+oJfPjGDr6fg_fq=kCfPjGiK!JSq6kzqe0Rh46Sc!-z zN{NUNDLOltTiKcc0ZB$Cr$VYG4Pyixe$L_oqmU4h-%&_X2K<;3LH-$B8bTJYC@d?~ z6E?B~Qw2jpl2^4=77!1aAeR=%+EHAwUXC?qrMCtwJi_HML&2HMUBlXi6NHH9_a~h@9G|PchHkAaLgqLx` zD(THEON9cflG_Ls|2Vpa3CNQPF_aLGZ3A3v;Bp)H~V6f;yOe$kZ&lK`Zxu=)~x|v)Yu2Cvt zz<5Q3T$J8X;LM+;-%`vas7;Eb{gze6lH~{0O#e{b3j<3W3n*aWbM$i+EVZi8jz++w zH(jfp6h%pzeSkRSO}efDnVoCZ3Cz>%P%VyxP795!w9Y=m{yDSCt@AXq_YKVbY>XLTsj2bxJlbsi{P9%M`aR}I8NH+BoC z!xmzY5N8Agv?1{pF!7KuvjIp-@O&N;TJX3bO(|HrAl(uoLLg}#b{3FDH@GAC8jwe~ z$Q0;Hj|?N+Mz9i8kRuX!fsl4QzbS~8&;t_eO~_lmA{B~sKw>_tB;2>W{VDBIEb36| z{B=eAI~G?wZcx3Tw!BwG23DxfK>j|eG`LwKy(P39_aUPuF0u{yxCVHH-Xi>q>(&SPSRjx9K`2cG%w>5C&GSGbID{TThojesiAO9_tr$$W==pXt6M2P_zINRv>fK1asu zG}bW`S>j^6dQ2BM7XlZ^S%4Ry-xynyr2>{6DlZuApW21f%QN4yZk#+o_-yC{6M)8n7fNxqt}pEC088Rlh=h{YC+IF zu}Jb;sLs%tP(DzVA*Uh!y;MrEmg09r;;6Hc<&o%rAa=ZVNOyElB26Wo$;U|}C7*x7 z%oxpxDKi|SYGvC>J&;o-pzp=*`R%da_}%Ehgc?g<7n3RP{fPa+J)$*&IwFCd5fuv~ z5n5d*T_jy3wO>3!Lmg->Y^H*#d|SFdS2%Y%N30f9_N%O#TEnf#I{CzD-hLjLEh8ga zyG1)?1)>quI&}_W&grE1U7?KxTJ(Vdi0KV)o@&vkg02M4<$8 z7IB*AxDV$9Cl03;M~1D8Ro?oJQ4vlBB0OPu=?`ab%jgrYhzEpEnBl++Hav^{#8V!Z z%B+q`p4QLhQZI?ydJL6O0~(QX(Q>WRT6XPKWuKe}l=JMB!^Uv)8H={by>Z$MFVh21 ze9b{+N@a_5`N|2kY-ByYbwRzz3-|TKJA5(dzM`i*E%$9buInopvtUDQFWe*HghBM)(Mo!vh;a7xh8X+L(N5<#}!6fVY`JT*42&- zJ6;|q_u;d+#g8eB5DD`O&I`vHn;PB@KDaNauPKBt!-iRdx0wqs z#HF`6L?DhaS`+X3l=rM7!b|NoM{Grm9&i>>AVwF(jdahyLg}q?*N1hBB_``b%f|k# ziT*((%RtvkSK;mK3H@3Fr2$nGnl7^C&(fdHNYdN)Lx=3m+`S*FX|5iD%Rxo3^mKFj zX{}d#Bqt;n1%<6){F@I`hYA0*E zj4}DQA9u9wIvsA;HLRj-8W6)6L)v?;Kb6|b7&UxLj>fOYevLf0khu>}7g@{n%Tym| zA5=~Hw5j|{GU`W z*Bckz>vC+xZ2OH%D_JWRKE{u(Z+~8X*;hYo>~tDDMn2x30oJ}(O%zpK1WW|V-8*&` z_+J^$^x%fSAvCgTa-7+lvSJWIgrkQWyk))Ju9Ff=tN`lb*x!tAWbT<(Y6~bzzcpL6 zXf3VHCQi+`@jiL_l>4048rb=-d-QIJ&P&B6Wy&Kfpl9LmWP5o3l$&99r8t*0crADc zx7eNB;ODs1J$#P8#bf}}Uv?@ zcH!K)A9fnMP{pNJV(-1q>oR(|5W1SRs&O&aIqSx8aM5}3^CHLR%?I?6<+95^{?_o$ z=!0~uuwbwZFq(VB`|Ejpr+I+jFejA*@YLtI{p^w99ek2%awPXupc=P^ zkdq0E(Q~)|4fCCWoIxTS<}?2RaH4Tg?f=~O3MlWp?t8B;svg|1^(?=4-{cweI44CW zRoJlTBz#xAQ##%KP^eJA&)wx0Ak@17e=OQ5?_XSSAl@X1HH(dvYEixrr3ny*$jX4} z&h(S~o&^MS4gvJ%IqCgAL@>!A2pZ%wlG5i2+6f}B2{+)#3@Ah&)X;}~W`^YB*HAlA zP}I>n@Yz-#-Y1GyS@8Q$hC0ld3|<0U9~%UqDzJcRaubunMiUbQn*>urkf{`&Eve#&L@BHH5^{g=HYjc>`FWiu5m4#FVbskrYU7ECkI6R z)rJBB1I7UY|7rn$UHrhf|I-!+rUC-}ul_Hh9Bu^!_Rlf$U-y4};=itc%=zy-NFK=l z9sy302l~I;z<>TRbjx_i;p+zND5>QF1cX8Uj|*5znd}M(NDxR$R7lkm_$(VT3(vyu z!@|Sd-Q1%o^;B%;mxqjV@*4aAdolPdF|cr=067v-K4mdwelRpSF*FzyI|S}72`#jwPfzv*$SR6ZvAXo$t zG7*Sq02C7N|2!CSL$#EcAZrKzYv=zNVF)H^KD!D0w`pG^0tR+mA*7(5nllyKiC>l(0$9?N z5{m+W?{?s(M|aB%S7 zqLisMz?4>+Oe}PKd^9{1TG+Oo+ja2i~#SRwmG}~iiVFiHDC(HB%bQKj9rHyJ(C)-l6v9qgF8!;|z zOe04QkmW9p-{w1}Ve%#JHPXu5d2*(X?k3n~!bY!Z&xqASmDAX_riq0@4- z6K$5ufEL%_(I93rt;+3pHTB! zZ({G-$z`%JCqjY>6^>tP%TJ9WUz=uy*DF8CFvr2U92jtlQ&Cgv+6-s&5^^Pav|A;W zCSh1A#zutre)p~;y*zhc?Y--Tsn1QGgT~5FuFIPKw{v^-iiAZ#pxw1SELHu(?07)q z_YH@~J4N=eJU6h?tb@;~4kaI(KhlWH=mMRi+2ptMP6xv$Now@CkQi$>Pscpn5s?Y? zXz-r>CRdTI_4mQJVaMF{DqD)qhvqK11~N~jta%Qf=MnU4Pv7|{bhSq3v!&W#NJIp9 z_+xQ&W-R30IB+Ff5jly%=?Qnwm1#$^otubadqD-BFs7AF1KPb;z&#=YLL2RDQ-yJB zgbeNIftQAagoKAj^Nt2JI+Q)frDM%+y3swd--^Ei@^@ND=$~sD z?JDK^=bAnoKTm1>4~+d2bUqrOV&Y=f{4P7|&BxnrqG%=#k^nJr{0~dJhuO`(6KBhs zl(`JHtH0$^On(CR8TS`Ip{0(7E}2!+ikKhXcyie_#V+jenK2LBRest=`@V*Td7CB!hFK#NbxDP6%PrTO}KVNAkx{Ud< zb20Po9pGWDK&?GM^(r!3WfYSP_rwb%jUB1cZQW8N{hAw+{H46nY;iesG&Ex-Ly}<0 zi|k-yXJ=z~-EAYz+S1q4ED_Lbr`@!Flo9vy)Vj6K!;vaoep{70yP|AXFm7gBV&Rd{b1QI=!?xvN#Rj)Td3bKSPXgy_jSc5_kfcUSG6L$a0!~w1-5Wmd z4gn1m+VmY)z1PvQyZ-ZaaR)bb5@Y)?eSM()#t2qZiQR|HRviXgoS6QRzfQ1xty24h zz-@{LV10|U1G5P5W%ys`RF0>W0JLtd?i4#ryjar7USMzXqPh`57L3J7CW;H`&c8z9 zoiUK?Gux`LGwjnEFT;=#!jW|7pM432Pj9_sikQXoh6lyP6AKH^v$H#5cv?F3s|U{~ zEM^kPeyNRLBJK?gh(o>-w~$`jPxrrH#C;y0rK3C8IfNk&pP5rl`TbuFk$r z^#N$L>i!(w%5fjkLPEld4OysSB#|rdBBO$9Fy)S#*AFEQcqskw(26M+HSF z?~P)NMTfp+Xe(b!mc1NxHg|qx6WWGB|6f;5r^!B)GzxEp&&QpV(o5R9=|f5pwOo__ zStbygu%fW=_Vaz*KmjXjh8S&Q<@Hj6ksa+U1a>qTCQGwYyPvb5CqW{nk_j?=%Cn}> zq?QV$>9XTio{XUDMXlOeHfCO&pxJ}(<)}^N_@Ta4Piq!XJm6fa7Pd&--%+KJ z=X*^MmU}=Ma{ZBL6^as*H#=9PBWJd3SR^+rWk=g zC!D+H8mI(99+X#+wwM^}AS=0&XbSsHHz`U~3ZxG=4=M3?;?!R$qf>`eZaKJX24ivH zBo-GpV$83$AI?YGe>FON5D+TsP_m757W2H}+1W|ndXvMdWSR*d=$u`&W>F;0hPyQ` z7kT%{%a+@T0kLM^$M*Yo@e{U&&DG7D6vB@qiLRD=c4V)i#J9NSPWbDwSeX+ZNJN6R z-MFvi{zIGyxb|DD$~NHhJ=&|MLV39G=(KrzDiDLc{Qa1N&*P!%u})*Hw6?2|bMB9D zJZ){}xV4lI3VA2JOxmK28W|V&a4~_f${y51WZFbF+SGrn_8xT0AV_*H-KsovsMYaN z`(ew>mm$mCZ>tm3U0=495%x$OzkJlbpV!3>6U=Czv~8plS48x-O4>K= zZYWh~-Ll$Wn2b62{0^h)QLBoycHv3()6*;qRTkc$l8#PaN|=U0SFP&Dm2IgO!biF+ zj^5x@^(u`|0kPP2_FWHMpc;b!DNf?Dg{Ua%-!QTn%66j;9I?Ul8fC6OXl$d-?Di)! zZsd5s@^eOcwQ~8q-D(p)mopiGLdQj8H8wWE#?_w6voJyQ-tDu&`wPO^SkAfzV7w~V z&Q7XAtG@W7_7xH$$IIMA!e_M~)1bp*38xzvfv%F5~&sw}?mG_4XTf8MNL#`SB; z--L`GCi!^#P{QS0Gj8P`t%`Jec(@U__&LUlDdswb{*t@8;wuHpiJ&v+DAlGHo-5Gj zj_&iYZCNcg>m>;*XJ`=x^AK64=J%SztBMk4MZ?*Zxbk6=ga2URb@U}h$bzZ7%)01rw`)~k{!^U;Mjko1x$Lg^F~^sIW!&^iJ1dlplht%?^a7>@n&c;H8s+FWDRx z7dd`D&GxG>(AtDClqm4C?VX*w@EmgaU8;VeQe7VIu7c*5%k3U3X6(i-=m1qVJDnSE zU8JE>#o{8BU(&5$x=}kUboc~~WUpj^Qd}ss$<*jjS?bpBlN)dw7-<;MfB^l ztf|bKN5eRq6a475gc+8eJ2*o_>{C~T6q|_(HXD0Z>3jNjF`yu(y@(B;LGu7 z8k+yuM6RanC0uU^DZTMthFQc-tS%`jev?B(9x$L!r5!~ApRm(m>S`w4lMDILG@;qT z_SNSuKhPzt`+!d8npP%-pqjqPcG!66ta7y}TiRU2gtQO)!ebXz5LCo+KDd*( zBa=24!tV3JHDizRF#@T$hsN-DFM}lXwd_k$==B-g zR`~wWb!9o72qTT6PdAddc)0a?N#HwF@}zFy%k;oux53QHJD13re}ggd(_ym~KY!vM z&fz}DnwH&XEiBJwZvP_4$S-lMien_G7@xz>+dUx}ex1gL%yY=U-=Gq$FrU#fGb3*A z?nyHcGRihN0xKA%x{nF+otX2rC?49BwKJQ)dp532T?G^&mJKGfgOyU051Afq$i$C939)~@>+Bb7gp#bbD4M1+nk@QesV0r z{9iPa|FUn#IHUl^RS!df9}90@wz-hTY*T7{gcJxRf9 z4p#T~L~IrdW6JD_7z1FwEGMWE*Egbv{JpI#6N$=FZ8Z}f>fSW3u1&y}1=Z*Ed--Ce z4_tE})Xw}O{}oVFryS1QJ0juxQHTea!TX5@vh4fEW2eL0y2s_l`>ny7@tdRxVc_DD z1jq5fkn6dtyN6~NdbFsL9&M)VfnMA%+`_&-9d?Idv)N}^jQo{IPhD{-ryLfqRI*pP zzHVGdH8rg(cKv8hc`}p;Y$=i60HIjCWh(nuuA*TW?_MH!#YMG4Ko!vdm>iGT%ibz!VQYXW}^E}rOGnb3Hzd+H8uR~w!CoStuJiynpPRGfeogyk=I%j;ST{s*9k-rUDc}A zH8zrC#A>$zbKsgy_T@_wA-U?}b-cS$fF>Czbw~~mnB?u?^iH!ZHxS(%>BJqZhnf~^ z(`5oHlxfQUyoJH+H_PbR0Ax9la=gYwSc3f36CT0@djEL}1cf}=?>Pk|4>JmQjiyv` z=z6>lyLFYEPJ{awcnhOl4`){4V%XK=E(GwyEWVsO_+*+LAw8y6wYpkbnr?JFFWVvjfI9&h7O8qpjb$lx zI;%AwwTfgxt~P4(ik53NV{ujTT?&Eiy3;X%(|6rdSnlyL=jiJ)m}7t^zc4%3$*g{m z3AXif$Em?OM79~x2PwIFMcN%U_?1fH@OIUq?fzJzmfKJiUHds+iPakAU)@^foOrIQ z;^aEgky3yt5rMK<$V@@TYs8{R8B3VIuAt}^IT2%uECK@j&VZxA>3+|k02tZYMyC%Z zoi?lgRsW`jFRgAzg}iE0gq1>(^8KMy(d^RlZ#!I);ZxH3*B7Fzlh@cw{PT0kN%6^= z0Z9``bJ~Zl=W_=RaU7n~Umx?;-#eW=U+^vUWV_oVkLQ;(UET`;7wergTrZSCJNC`xIT;+t~SnJ)aXbwFQlk`#gPTkok?Z&L( zpHs5BD10A|K#k*5$`wD=e{t=Eg>3)X51Yjc{iS2%~fn@nW=))G>R zfGUV7HqKyAkvEq%ypVk(mm5emeK1wEjQN{)0(7Tnx7)gw|Gpl;rQ}_oRS<|}w4KBK zer(pX39u+Hqf8sa^15i1%Vc-J`CNLe(p%;9UDet2t{W4Vex}jCjvB}sKzLg+u7#@g zK0cX`?P0lab#u?=m8j&S^j%L<$lf0sxIaa&ZYIZLf){bTJvw6Z&^IV5fB*sJ9R89m z6miC5>$b9jNz4%W-mc_0I=yyTCJS=bqSVSst~uMH4UnP53KKZGp6vj)NR(Iu8$MAK7YiUg^S%B{|5na}Ypw%5RcrH*W3A@NnNyR|)R1Dn@; z`A37GCR!54_(@4J{wfT2%P0UH95z)}3_Q(i=*=fe%6jI}RJYtLALgun-vWBE`eq^R zS!JN(aG_Qu>++=xwz2iLQt}et#HKRnXcPM0441fHuHPPT{H{&tam#18TFK#pcKRFIx=wTI9_*C#-43QM{k6 zgV7bXNA6T^&C$V32;(ss){A-`dPG=);>{9J4Gm4*pqup;llj3u$U;Og7f2|*>yi-7 z$|h2)&P4Yvt+YP`%Hlx5VRCfh%FFA01~2?Y^BOO*q3?Rl zX`iaWp>G>%S8O<&+`N`gn}4k8{LHY?4^!~CJ5pkF#luu}rA`i0MR-Z}WHmm)+37}J zqw`9BxX77yMUW)+o6fdz-^4>px3RO*Ycf?DFBd0t#f)n6GQC`ThNVVd`UKA<8zJD& z#M!5XZQYby4Xch#F~90gaLuMc15=8kSb4`w5{9cAu~I(8K4AF*T)UtMmp zkw+!WF?C0c|2qmYumOXG>>{VoYAJi$)pIIJ1n;~N~Pn=kRg@8r@wa+z9Hck zeHoqm!vSLs%z2%~L{{zh&%peio~^fMN`b>+QmUR%)2##2W)53VkZ3`*oQ^qF35f8t zu^bkQ3snZ*UEfh=JW=QRIR_4XK0$}a`*E!f&+B5jObAFwby@+$@$%}nlN-X%MZi?q zONx$tV7EBwxi2vfD{F+m&esv2hFPulybq18OIPJACAz_70=fE4TAQ-)AP-n<|Dvv; zuzHfE15azqE=rzw4n|Y^GQzOc+ML`rdjqifil+Thx5&Uuo@b8Mu299zCK*M>$UVCW zj!@TUmToyTDMag?AKg=$BfIctJZlabGWG4NKA_WOTjEAdrb2`?C;c;je!NO?#gFBn z!NUJF5OTCfUTXBgB(NM#>@V@I2!+MSQ^F{-h>eMBYRqYEXS%!6*|;nAxzvfSvo1a6 zvpTu?b>a5nGzSqr#=juI_$itmTdbw%T0~Ni539Mo9Zo3TTCGZvJZ!3w)%-SJ?d@iw zRZ{CQGqK_Kde!a8;OI>MDCIKAJ0&m$Sj4zJknb9c>n8~_>a}KSrC@7gn300l6B3|}>#u{`+ZC?q=UsFfH`8}P75Vry$@3kg1rBp;U> zmx(z=U6JH+vmB#MpK^nZ&cMc~qhyPjI&LbrdQEJ*(Qk1JUX3zj?wqd6R5299z?eoi z6x6QGCWB$%1jgmeOR#-ss`o6c!nIan5IXVK#T5kmkc1YD%%{VUomP3?Q+d}tDhbuz ztkpad`Tp8`Z)2qX{Z?mFoPhI!&7X}7tx(2=1X-uXkk}cJ;2OK4+v@9o{{G0I)v*W9 z(dqxT_ws@0|I`=QBh=8F!Bdj{w4a3OX#_TX^ZD>j=<4D2KJT+}+k3=%?sxTmIVD%F zJ)d9@8*!a!@7;GbH3e#ODM4}v&(X0%De!T5J89rG&bG*V{|8mF>``*2aZw)@3 z9VdF+pvLhyaX(!aA$iPs`L43-$%{TUX_{Z>p|Qywg7jLFHE@^;m;kQ#w|J~0L1*># z?7lPXQ(0&<%N#vsxnSIpOX}*}eEtV%dy@ly%XbgPfH6DGjSJ^rx@>ovyiBajI8b4t z%N$bzrKc3y){`02=SiW`-wyM_GR>{q&P8B=E?Ti$*@dKwv@W__7N7!5>@vkLPIEwo_`X&rp)oY`TYu5 zB#;0c-KH=IJR2#puCi9XrXEoXBx|wfj7Me2p%;xta>FI?BxTV^5YP zxxou#T{|{p3=wo{-hvM;xN7K`y+kZfi=RDX6CWQO;0Qt7a+Ve0 zaT2=vgIbwj*-==&DlXV=mrtiFwrDYS!sB@5D5C=jQx+Rbp=5$hv5{V+?BwW3l{=nKg}-5}S)9zUU*2ZD%$;&+X~p4&+BgDheVy{z zu^WSQm2O4)w=^nJ;4xW1@q*2QZkyYxI@XF@6^&14&F@+_SJxbA6O(UPtrpd_wG(Y_ zr&EZh$%_V?d%JRO8JI7cg3&h3qfTH)=7U1a9o>b`DTT*sP$sZBbyn(Z==!W@HhTT` z^MEWXG|EG8ONSvtp}hqAa||)f`DbM@mIQ)x7F&(hvUV`!_lkAL8ZRpQNK8}xc*e@& zMsPCIRatitLl>l{reRqt(S%nJWFhq$B+7^$$EU4rk#qcWD%f1vlG}b^Mm+1w6GnU% zogorOAZ~*jPn}h6)=@kuN|sRCw+C}h*^i)~=`>ade+v%+pt7R6i&CqEEICeWv#on& zc;bwmWm4%x+%5#BOgNiB)1x{pHJ2k!!uafTD74i`$8fE2pC_73`jj+4fJH=Hxy+sY z$+ygnwmKpWo%#aMB>bGg`-j&+UYw7^xLog+YPZRPx(~-QDJ3f$Fy9=ZHQK-@4p_;8 zPGuWJ{7B>R4!CxPoj7KNgV?>zTr!MW!K9!E_XS7hMnt}HRd(kl!>a7L61x|UtYO^N zZB`h!Thn8{*t*{JY{2kvwU*g2)?glpX)DJMewkmI5#8kFgWy{?tIaY#l|7 z9zo8a4;a+7Ecg8Ctj@ROy!27E`=M#lQty=URF>muPqMTzv~Y=p0K48|^*3Tyv{}ct zvL0axm9NNAnJO736i**gv@k)Gw%BuDO5iL+C~+AzVCwHe@z?Ir0gpBj`ysc$E5-h_ z!C;(-F5Og*-VMtTSLHlOVuIDartT30D%o;4yyX)0CcVS0(@5NNW!IUP3q~Cs_NCSs z*&8i0k03ZrKV)}UY3kIZwG0b9SW`Shx{W}rCO6cfwOD1&^*mVCWX+N;KDZm_cD}m; z$JB+gdE1sCAi%}F&$~?RMvp?8D-Bi`lWHrwfTNr({>nnGWJH95mhupcm^yyKHF)67 zpOECo7Z{dc(|_e^^F>|$nuj0)5jBJX^VMgNwY9X;?4h+>iw&}X#{ z*M!~==smNPL~w)u2B38SD=7S}4URsSn5M~jGsK-b%Ein`7C}4ob(kO4bbkWSWQPzS4OEQr4O0f42U5a%$ki_M2#R9JXP&mX0 z4nhEce4cM1N{|$^`YH&pw55oF$1j?USBS;2u(PwXE{do!4@V>vLukrWL(xza>_{A4 z$>Pxv&Uc{Cru!A9MthoAKqS^)-tP0!D;AD`FZ{-(>RY62Z)KIf&S7C{$~wJZTo{^W zB0-|GbQEVsy7Kq=JP9G<;jZz4URV|%H}LGn;|5~+>R~H8vd8q_aB;gv0z?KS}esj(rRPf zc10h?ANCiAo&|9WhVR{};|Eis9p918%c2tn!kj7tn9Xr`4_w(zoP4QOsD8CsxkxiI z*HDwDLMLoH~Q7kNB7M7>M=VR}Y!QyPhfEOA_z4old*@vC~3szy&vm{f1i91mb?)=axe4it+ zceqvxW(M|r|8~l)eGlAI;k4yt4E8N1y?*Dx%-80$7`?xUKq8h|gRc-8rK`$_zGOU!Y+(FbuQr%E#XGH$f(6}t*If)h*)Gylny8HorHS$z*y37lO*&| z4mjBLmIMQQ1n`3Gt0V>fTEACzQ~h1)S!Pa5Z`<}Me>lBA){7)zYhlU~QBM_GEcMH@ z1>*@N_y`a)=~*NyMNTiU|5m)j84j&V=P`|;8og-O92q3qfDBA>rHmTC=B~(SLJ}2{ zeQv%KHVRL7=GGbyTNzF8gYp*2euLC|iZohHVz)(=qWN*kao!oPS!WTRW3WEUE{??x zw*Xt|Kws+jTU5Ee|M}=D4>z)f{^*4`x>GFXdeCU#fH<9t=G0Trf_ORO;C{DM*wH{( zi<7xyJLeDaTS?Lk*@^+JU)Ppu)enew9DSi{e=C&uA{2Sc7eBVYW!!xh%t|FMkbqby0Dan1xGD6Y zaTk>hj^o(BZ{Yr*R%HUI)jDeKBi_J$Z-5B}0cmo1uAm)G*~O8uD2D*)o4#2Qkbi!J@KgU5viR1LxbqMRyzL~5+)!}Jqxy6nP zwV2RhKq53}g2$U=NyxWQ#4Wa2w~`ec zGj4BddAZNWTWEIndQG{JrVBlkEe8FBaIc;2psn@NRQybfhF%7#dIv?-H9QV(?G|VF zjrmx)dF^T1;lW#0S9$sA2u;<{Pv!QRl@>O zK3oQO&+GB;1pxmvF|bc}RlG#a_|D&4^@n|l zX^pL6lwT)l%TXOI3%|EG>>K>MuFUuVLWtXVuXq>-&u|0B*Et?CcZc~DtTY*NZTGA5 z*bWNy!DKkTywoUHW5=#Nu}_t_(#(j`KGK)^VFnFf58k6ki?Ld;9PK>c8iqL z-G+^`8#Q|_wGF+-`@=Ha@uqjRS}do%4lA!DQ4Z!?2{&mLs8ZXePCuYO^%SW%=o{oGw)hqO>X%As{f? zYBmrr8l(ldxFqfUikv7g;X2wVEge;zN;xrRdM-_w-<%0@Sa_|9qicoi7e!fB*;Kib z_GFDj2$E9aSAJIjpi z{zPFSu~wC}NKs+^Aa^)Vv3L?^euWD-V*S?;q5F$=(uuqEPZE$;e#sOOP-wT{WZJMn zXpv${e{?F#)W+uwb#>euD<+Q4=W9){^Z`UZV4^0Z?rZ(j*{#S-^si`=mYzc-2)qR9 zT6h<%Gyrv(0(0Yxgl@2-i(p@PJVm$MG9eqUFj_0d6y%1uz)_MW?34X zSRpH1^!W;F5(Y4kkKbA>UTiOS6CBzFyCxH}jzpphCqWp-!U&g2C0J*{ zj*XnTODhVu4huRQ7cN}b+ebh|?4g-Z(2zMrQ*gYqxtxeL>2kZdSz(`sUBL39V?#Qc z1$8^Jp8o3;C;42}AKf=oy9P0dS-EO5HxD{y;oYOF|8v2MKOGw=2)Vop7WC8U)9- zHp1b^rmWk1Dd9r3v!!DZqNr|0qf{EUdt@J zEJD0yqh#K)sTA^{35C2*KPrmAC7nl1gNsP#)fs^dy;f=Z5Q}FA> z(w6Mc=1SU-r|7{z10O_6D7XjK6HU*+4P)#&JtG#`RgL$E=`r>(jOMwgv@ ze2r?8SFxrK*g(@(|K``~DGlQkl6YVDEy2I~C%iz8{M5c_hyuW%;ZbqfMipn^PH=F` z+#zehg^vK0Wo9BOdU5FLzQjV(uH(9GCp%j8hfknFd$xV#BcCg)J(mvck7J*RS^VU7!6RO83*|bxr(FoLwF$yB3*M-zL&7 zx&R64g$7;njF~z zCL0ZmKgIwz@Ek{Hh;H_9u9!~=^hOv@}AmL--E$notBsj_aOcCzJVf&Uiy6$kj z7ftYFvC#zz*Rfa-FzJ*95$1>_MZD>t)|*)({O%Oj0Tbz{YBco^GAqb337OUu5k_2oW>WWOE&`24<_ zN_(&xl}DCV+nxL=s^@jn&Rrq_(TV_ss43pKuf$bG5iZ*rPWQ-@+m7NwRT6 zXYv}nu$I4G7|3Zhu!$WeRJo{3jcv%8V5CEn8ak-drj)3v)sr~E5+2eoRM^PV6l*g< zunG)Rny4Grmp!%88s~JEE^3_d|FsPPrDwjxC7F@~af0SPV3ua`i{G%2qi;RI5cs_^~8G-lNrCj#zI1E&s_0LmaC0qRs}5{GvDW_YVHjBPpsEFziS%qr?*BZ&=$;ocdBx#8T~%vHv;W_T|Q8LxFJQ z`m8U`js$5K01_dk>RMBcp(13qK4uIc^+xn1uq)HsbB5du-k?-G2!(CBRQCSvsBlNA z27Yc5I^_aeNu31Cq$KS)=N*b0V>Py%V?nsaDd<9ddRO?;SPJ2USbY&jI8(dv+m?jt z^uJyaFJAWtM!Lf&KRwP_0)av2Y;2O&jL69~=C zQO8^=7bQymxn3FzcQ7VRUk4-05dK&8Ao$-8D#SqFR%cMc>BYpDSoei3o6It)$S~l* ziPDtNDm5$iU_*PReJOMTpXNu+(#9$TFc~t68{I}9a^m!dNehj&rqpTs?()evX?X1O zb#d4$00B4NWvr{!X4Zut*f&+g^>kp-s}v+N`R9;v@M|CC2Im5Xr1D{?Q3vo_}Fpj_(kDAr^&;L(0JrCirVm6%THB0?(9jM zZGNu@usEsRq;sV!cqi1SrC2m_x>_9lR}a8PCd^W7s+6O7+G?m7*f_3;H1QTp6l_B8Mv@ zVr(qGKCLp|CnI6IwdK5ZkuEyYPkL|K!BA-%on||}h0W@xcl#VdGrqPo)v(<05y0)x z=E0ZJ#NxIdZ!wV(%6j$?hw!wNE-PMM8h>9I*^ z+jD4ay+|J6gl&U61c<=iI&Q|j3?6RujYYu*PzAl+8_P!O&c2F>!Qq+J=u%;yL3*3G z24kJp%T(v6xwQ-X+1?JnD5Tq;6kI4s1~i&5qw}Rs6(!%g!NOA^&y9ZJh08}T;?__i zQ{I9W;^g!(cTUaat1)DfI2app+Oo_#jg98d?wrooum6951HcS$aK{{EIAmSlgQ{br z_UJe2;N-VNwiU(bCeQ38oLjW%kFCL%x3-bcI;$4~E20*R>u7tX2tI)o8WosdRZT6k z{z60oQK5X_k31akpYNZD=anV?7kh6N71y$bjYbGTf(Q3tAy{yigkT}KI|(k0yN2Ly z0fJj_r|||FcMUF$TX45V{*`mjIXgRNkNbGXefSycVU2Ejt*TkmYt}chYTp(|;;}1ZLcQa7 z(I6o)k)*_wfkSYxkv?-d9+oH=bTVY96gA&zM~{h;^_dW7ni-$OZVM#oF#d`G57@P# zB2x%J^SU(kZdTX6U&ArzWsNV?d81p?7m_~1#cX)qFgU~4)=!z%v~^Dtv|m$$u${FN z7m`~zYRdQ=N#9n0c#Zqoo3cn-r9ZcT^TdMYpUmgocjUFfwoMGr^`l*!jB>{E%gUbZ z{uc>VF4(+O37qzYDmqx&=X7X6LN`(f4muatYx=K0f8SbO#wy!=qf~4z=C3PO&iw;i z)ZlXv5$d~b+{M=KCQfSY=WCBQ*3O5Lk{GY6I2cIob=bJxKT6J@7WAGBi*w@U;Y$!Q zbB!6Vz=o!FK{0R|YfYW#g_i?|pV_V^l@hsC<7IgLkPtNcYV|bRS++TB2NMo?a`J?$E^y!sPmi9F|Ma{kp4FXm`Nma%3mpBqMn@RPJNFhU$ZKZ3 z?+>C&w~0r;e}|Nj%iR~B8AHf`Is}mj=+>8^+S4?t?j?cMP=ZI3`e}mVmAc3UkMk)% zW2vJD66&(2nBa{KHaOYdwo@g}H@Mnw5(NZr=p+@=x9V$2(6tR=t%7Ww3e@}7QQ``t zKNyR5ccFA1N2JcN&oCZW*z#`2XQy*LXWOX>CtkwjUVefz+-m!!{~3Z|?;a5`5zB34G)Ihr5;Q6kob(jJZU^Jr59d%_$?$6%fad4E;r;49*pcEpGv`n^|o)bWc zn}BF*<$OA7xx3}6tZ;m6yYf?6RrQ8UB~D>`;B~Z<=c)Sr$kI~j9=}2tV<5@CWobNk za35hbBFhBnzN@X8zXDF_k{Ty#&{a=U-$aIwFY=>yk^C7#BbhaGg2ZK=1ooFV-WA`* z9MPW4VV5w)lm#c4MD4Q>IySKWo_2VE|lFRII7+Et(cdpjE* zn>6J6_FA^D?DMq@Y=-jFr3Z|zm&{-7&5w!ByHDEbK|-`twXT%Gun&qEKu+T>abmue z!R^SSoWN)_87UtD z5RD6FIU}{6yN=JXqwP&sWamres+_g9Qr32_b_;rh5Q-igJCwq~fEtG>@~&UL3|#YP6U zF~^xVpOBpmyEZ;Hm3^D#c-UNczE1RGHg9Tus@$m>l(7_|Iu=93jY(7UP zFLoxR#{mu%7`!zWzHr8{y+60J^4e9F^SS?NlDEx9jDOdUI}h168eO$$(EC1eWG&dg z_rZ2JqMV;u=EHGHd8Ly0M%zdqF*ZwC`hpto2z@mJotSUrMaAOS+2+B%M>lnU)3_)G z%+sBV6VJlTTG2Qm^a^fuPoH)jvZLqB+_QTp3O^DMU`c_q@h{BA4}Oo%M04xOjc?K| z30cq}dCn-VkDk33Uu%9?TDfFr7LQy%sHp|v`8F}q#<)!6S-$)%^wAohn~$TTGX@5F zrrTAijyvlx{xcJ{`pmnB%5O!Ht2`=fPPd{hg;@Gx3fn2WAxMTGu!!wBOJZkC^AQUX zs+7cQK90tIyBYBjhMMjdOrth0u+4)zM`VlD8MBg-)Q%C`7wqayTe{GAI!YK?bogW4Pu?=ygc#SB?XEt0 zadG50FDx_!J8D=>7>=|{-4Z;#Q8mocHz(GvlhYjtw%R{$nqL&^fn9Ga8GoL7WQbMk z=Hb~$B$9uXvK9Kh!gi_|DRzb|ZHMe4y4!p9tUk}?GGKD`YC6(*(%bT0c<}Iie*Pl( zN#A_e05TDrWmqa4=At?4iiLD~dcL>Vgp-AL*5#rwGU6fq++}V}`vs9w_9LRg2&yMU z_mv`QMW&UVEB%?lpyv-H(wV630^6c%BF?kBBYqm!=aiu7vJp9owJjH_4&tIb7JY0w z!pX)%-EgJNwHYlCk<5f9(IEfQ{Pho8;+f>(bxboWVy+HOhnjx0%)OS;b0lUUAd-A% z;!so52~;5wAg`^nRW?eGO1?XCQ>lIg)>(7?Ds^$)SSOI$TQj%|LL~hMjcp&@VvS+* z+JMqGQ+ByyD4cDPAcQZ+F54)#X$r$ec($vpQP>{Y`D6DQ`SLN@e!8kX>BAxSm3t!Z zZB}Nr^=9|^*3_HXu}H7ex9651uiOgCnj=X%>*`&3r)=)K4Zm1x?UttfCur_%1wREZ zFa77^1m{zF==BgNphV8QC!}&85?l$Tz!KvIzgnsDZ+1SpJx$p$Saf zM;=bIfBCB`N?cMwYG%^GUT+!MCJTyWtbahkVMnJ~VnR_)vF=?Q8H zWl$@gZ+0X;*Z5Wka?dCyeOE%PTlVx3ga*-(Gzei`zh(2JFKRj|^UAPp>QlkDTHdjK zKCgZ+VWCGr&I9YK*K)OV^3`6-+UXjCv zYWO^s=`OtYmj?`7^gBXgBX3u3R)%gN9V<-zYPward)Js|Op0P>Q?k$zOl71~0V zgl`HYNbhqsn5hzp_Nq8vejFDNt!JZF62ZK&`Lf3(Q8QkJdHh1 z&S9qgRs!>bZqK@F_j3{;qc`4eMOWg32$G`)#GMG>6(@TV3$&p{a zo$T?nyEjn_WO)&Ot9bim=m@TBcf~m@)I_Gr{?$oM&G`wleSM5?p(>~P*o%-b_5KGlGOtDVX`mm+S>i1?aD(I>u>X$lpEGv-NGLs;G(i>h|505oR zXPQstg(tnE5&OC>FoWzZl8t>~Cl1bd4xp~04|ICNRut1sswfa_nn8mX66jlA+Z2Oy zn2o`mMe$ULG;gi*gt`djg} zO)2Jd!m?LQXs1hd1h>O6A@?{J{FH_fe$5_f@7xrDqd})*WgP%-IjF-0%_lJPTk)jZ zrn1ZOd@~9!>$XN+?S`0SQ_mG}mG$6OvwKGkX3q;gtrz9pw@Fhm74;K9X@qgy`%NJP z40>+8aY}b)T34;HO%|`apXt^7nz^H%mkx15bRH8J^8S=`eH&O0Ik*3q2wyRZ70?gu zD9qX`BH{Q*(4aelUi4+tGmd_b<;C|K!*HF7S38x&rJ+#E7+g7$FAuJ77MrxD3d>yQ z+*M2J&2M^T2Xl^dkwW{SjJG zS-lUwZp*Z~YvBnoK9^H@o43cFeK-1ktY`Cu=W&1Zr5WlxH#7Y4!8?QCspjQ9=yhl0 zt(P}tx@beSX2An0^UrXPhv_TBo2a=~Jz1D&ZcGUo$sr%jgD@mytf?&$UKJYgR;npB z`bfSE!ZsrFkyvwO)jLH_5hiObQ(d~Ud97Yzp543FMK^_CWIEF6N*zq&rS(#CXu$q* zf(aC?(X@wsfPg#d+hYm}iivIvb46hO%obn$a9PKVqh1y-6&k4!bFER*r}d0IWbh%CyJFk7ro zhk!7&8Y?`{`q*nXzUaR+O)<7rl)2|F1?`FmEFP0M?^t~e2BFh!5|wE zsj=Adkh8s_$(Z@#c5vPsBrFs`4hQd|V&1Jb;8czr={`t!F!fza9Z3hfc`10FJ<=$> z?v>jYOub#b%eeY<_<#=!nQCN2ByJ$ZeKL%EL2E&;=2e-s=h^puE<^>iS+;NxF?W@d zgUm=#B+MJXi`9OIeTSuayP=C_y8b@me$YfQsyMt=;-G1DC;du)^))A-U)d&?z;S@H z_Y&yf7T$GvnF=^^=?C}yCK)F?zPEuGOBS$Me(2GdJFUtrlF8j{-rad`;6c$a%LZ5i zW8ZTr;{JBT1ZumEHmo-6euubt+t!^~kuJQlJq%ti=uX$YXpw+A^!N681AN9X<$Orr zd=*LVb=u5Np>2IPbe}>+1i7>9SJm}Xdk`ty82`it|9wMldvzCHxOi-Va*n3>=em{H z=g?x+aea!u6J`ZW`Ko6VLzp)}{qzG(m)^_A)lXV|v5j*3v8Z%`!?!KGiuIY((PKJ= zJj*s}($c0b9I-4SL2KV%N#f(! zT_MZ;b9tJ0R$N>Y0yzWXIkkGb#`dL&tvZu~gQ0d? ztO3p_Hig{i_S|JAupU}Vio-RE+N?N8WdeU$obOVLXY<)o{{B*tYwL1CCX-C5m z8}TOsBH}z%T{|()wxPjc54b&f=iN#izRvYA@g|Fg?OMx19$6E441uwu#PC3o?$!16 zK-UG6oN%*yKbU=!QT^nYco?!(S&?~X!Y%N{YkceMEGM#Yv;W=}vc)@kx>-l=d225! zfzfnTc5l_&7y3B!uvL&>zc5cc5bAg$F$;0uWGQJHDu6ASEW*uo4D{^I&RlxxLlelS zn@Bfqt`}jqmyeS$WMQk#AifA8$dMVUx#LX!F!Z#WO=>t(l>nV)<9vs*T5rWXb0p3eF} zeIN}*OKP+2NAIRao}P!uyPnl-&$~+eS50qzJf+zuCe~=Tae<=|ozY}euxu|i19+VY zWd0pT`mi_R8=2Vy1l`hsw6&;jKZqTyAve%huh3 z6wl%Jx^)4n66){Sif54&gCjb2@GtH%HfnLFQUX;cP%+5E>L4e zxMf9(9zbEctd#`#{_T4Ef5mj zqidN$-az$M1as`_U+@9AHeu%LDROO#2zn)lT#=HFEGRJyAz$oAHn*PQg?D*`Ouc5* z;l`pVeOX?u@Md&qo$aTk(`1{9G>ePINyQ3U%DhN}fFio0$_-tS;+6G2!{Jkzf?T`U64 zh_upl7YT|FT8i&F)V$TFro(~r>1T%r;gK@OtYvlkj%eXJPy{~jiS43tZ~dv7t``?~ z$8^(yR^C&A!Z6^6jkitSQ2m)#yNm9`$x4g4eD_y7({k#qwI0g`7>l0#Ssl>R1E_!r zr_*hsL2&$3<4;oW+e|rKo8CB`Ca^%vGX*pwRG$(T0D!_127?_|g?2s~XZg~=&(C+G zOU_oLFg(EZK^b9_S1X<-oiXqxq(C%J4TUjo7U|LxI6@Y^{JKd-#*tr@gJ8>2#-XA)0i(K z(3&bU-VzhDRgF6BU^F=**2!rPSlQiE;>n?Zgf_;Jw)sa)rWIy@+v!0z;2q-PV`Sn- zox~=@c^M6A&bC@zb)GX_>Pq|vTP|a1$IXFkJ61xM!;tsxizDZ=R*A@~M{^2i)A$(P zAPd{4h^(1X43OrwkWd!rJpj8Wtal!=T0cK5*h*pn=m>$TwoQ-rTrRqVY zZ}~eu3T6|RVK-m;>W!xx-uT(u3uA}sxlL4G@^O<}H>8Cao;yT;cl=wW@ZA!^hvX+} z?Oy`8O09dw#4&l=N_Matju4Qdgj}VI7`GZ${R$`OhWUiP7@GN+%S{DzyAP7oOfPW6 z&Wuc-iH5ziNFpD0x<(Tc(B9FZXI5DbK~$TRLwcWX16t+m@Uva3GVrw*QuNCFJnzRF zOXg)aDS=r1F=%g2{6Ia~>oB~e3@s!xA2T8(I`3q7|K;9-%0lR))l@~ego(#e%%OiQ zvt3~;Zo;_XxqUZm*F2}ueMek1VKn-dVi!>T#w)Af>#5gj;XntTbu_ zF)3Ng<+(}vzroPaNs|{U#M}7re0yE;#KR`mG!oJ;18LhgUFP`#p8cEmnQ0I2T9cvY-B}gH!}s1^ zCf9fUN8V((o+2+q{@NS%Nl1FosOK@^H*h3T;9jG$;~%zj9lUM3Y~O|>s`WNKoiR=L zjG*7J+4dYc_G2>DN4VJZ_M{suC;ikZpwn}mFn%_?_L+>;7N*e8$&;J8!1nrrUQ6M! z8<(SteG&*fqQae`=HBzrzkIVRyfjSrx-|_-m|h6ualB47!Y}r@;I~;5VNONqUYSet z#6})wP}B1%+F%l5!Mwf)z*zN3I%fh7zAM$z)JyL-&D8<5=V1@WLc`56{m=^#6eaJT zzkT}_DU;eqK4#?YK@-88J~95hdz^bT#Em!Zeumhrsdbh@d4+=?KDfJU?|$3_ z_dJooA%PV?!X;1Ff6)bhMk3q8DluBcSYpXXXJ1E;(7ZpLBv!fe?VCDWUVd;u;q;Y| z39SGaGa-GzSiAxzpxjFKA^AMjcebjulskTOmLFclo+x}W(u5%dkI;M2IHtJ1Dks7Q zzhs{x6ca&s_n*sL@`0X%<`>R-qV$@?AM?C0T>RCy$~b%rlgqhXX1leNjI29rs1r_P znlYf9CEA#Ida#CWsFI)NM&C^1`MRnqHZy)~t*;eNg*AK}1f80Fi+D6vcah?T!TEf3`Wxdo|Tq%Kc6 zoh^omF+kB;KVT>~z$AhUf0SHlB*7lLUyS(KorEQ6hmzKL>03Jm-4$)eDitSlYPy@G zcQonQtfSrEtg;|!(Am!ole@IJDz9JDP$cR=ZycSlFdzQs^4UVFGBfP8RCV9qx97~R zK=#vZTGXUXqW);iufFT%TCKuJ&!6HCUu@=3$-dcq4q2Gf*GO|We0NytQFMISW4X${ z7;lowYD3jF|AFm(qNlycpAh^S-3D(TrNM}_vapwCg5D3pZ^{7e3)K=&S{Nw%_)X_H zoC-YpqsP+t6S&gu{$qC7ZPaKU@X>-$qF};%cY2mSndI7eg(x|{s~}s24;M7Ct|P5c zvh(AyZcO=aF5kPiZVwVqKI7jT5HWDa<8I$DtvVkvPX(FFrCxhzAEGF4nxPlbEd3Z05cs zOt?C(I?-=qL9W*u?)Jt{9F&Tlfz*JEZOfW{1LhP)E=!Ljvzx%qmQ?A4giv+Nelp4; za|PO|+QjFesX!JAaNA}#bd zKf(jNK#HQqiq8`QuSEQJKt(>@(GTi<1Lxr$|+IxvAust!`1e`=3v;I_ru z7#z0+SC|rxb@uLe#lN@V>AzIHMm1=gUDP!pMQH#HRm{V^h_`RYWK>Bzh-SM`)QfK# zIW1sek&DKbzMiN?iEnaqx%U=K9$2`^+;7R4ADZz$6+TZ1oi-XR+q^$AF%dLsgOcB@ zUwAvLciaoyJcWurajj?M-ct)!_1Z^uf!S{AhRtxZL-kXcgyAzv!bw*% zaOE_oAu&Hla`xyf{7gz%xc*?2isGqze!;A0q6n znE}U-+|pl#c6!J>z3`_@l(a9>HyUyycYJJ16PT;8BiUoGg26g!=T51kt&ZIyQ#<$& z%}e7q{Bk55pFE^X-DjfeRW-3v-h?usOXSU+WulDLHteVFz2`}BFY1dD zSO(WZ$h4Lk&L87{ag`5HftJtm%Y3cFol3P*iAfF*e|;(JwZ}%e$XFfz=zhUOg>RmZ zq`dlrlOVM1?DWSgI^N#iMIGw`&zcCc(m6x~j{F0ZH2{Xe;7AgBe3~8RkFYv~g~dIz z-!CWF#$eW)8VK0-vp%i;?;C?A=`QCL!XQmZjO<8?pUI;0CK|i2Cr0<#;pag#ra87zyLck8NuTvf?r#4g%;fF}esFbIy?NL&mXh}% zz4`1%_Qir&{lOBJ8q6Gb0I$T;5z-D#T)OQKOp|(V_BB1({$7Xs>DdqR8r7e5m?QJM zt6wzeu>Pyw9%AM5KN2ReG*jkSqh~51um)3pjvl+=seMzTed9OFMOKw7nB5ep?EHmh z$L01@K-?I-SeALRlGcP^`>TK<{?*D?tOeRL&3vKTZD3DK%=_{gzEWQv$adLKcNcZe zYam3XhKtY8fN<}g5&Wogc;{1RMcMQw(R|_iloR#kUD<}MA;HY1VrJMV1?J?Br$C*XrDeqIyXk^CIiJa~- zGB;Z01^ld~9S%)+2GvJ}Bl1Oft?>QnBopzJ&@lw!b(G-!gi~qVmWsmq+*Y&%C-^sI zI*#_RY6aF_!m~~8jm2zpolnPJYDrxxs6hAxKBo~s=Av#fMFV5%J`f(NayU!hs0+G9 zpWkh9go?W6Ftg|JQFWe;zf()!C{4kh64cYg+8t;$hFM=jE1)~0$fd(&}g7%E=bLf3)dr4&Di_s1js7{J>w!$rVY> zV=#i->FZ>d!f<4qEWh1K#k5#$PxU>;zd8Tsg7fFp)HySo?y@_Fvpr{S3o}6$N(z$j z!DF4e4vnAYE8mM!~)7Ivn!$Q=B z&ih7FD<5;KN2ig4rA+kfCYtU&Mj5O3c7IuAEr`eVPaK)jvoh%A*4h0{d#PHcE>fMn z-O2WP2VcQ&s<)+ARA0s?hkM(}-P;#6-Nq`|!o_0h`+lhcNXJwfiY7*Mpk+Q+mZoFv zztcFybO!J9S6QAJ==Rc2!;O&Lui6~0O=&TvdYepB-N&GFFVG)CZ4&PoJ!OYvEwFYC zW3)K?=}dR!EEjg+Z>@8lc;D?X*L_w+%k5q{Ut8e zsy}qSN6r?gEz+EpYCe_Gq(L}r1vj-)QQmm{oSRhqc$w(!SV)tWI%krs4NWtnUo#o9 z6>MlZ`%&2bH1E_QdRxH8-JoPWx<<7&!o}UtXU9ly_ygNTs8?ipq(~y^N72M!5qaR~ z?wbmd>f8hf3Y;LZT!r$UrRfR1$DczuIIckdb(ThV69Yx|T$ona$*YBpP9pO+Xec*juX!P4rwp zuwEI>NQVkC%Cl{nBMAegPXst|e;+`Ah+9gnzqa8hW^4%(iT5K9$*X*_`;#e!Y&HJde*#?dPW*v{hN9(F z^N-6$J5T)ZXNkq{mZov^c|Ygc=7ivu;r!T7nQ!F#DVh2=b`w!Xc>n5?UB7@BZbc3* zt5Mv3{%oH*FpF~pf&ISAZzz-9#(T``xMhNJkf*(t#QrG1uj0S&<+UCqCF^K?F=zRW zD*s_Tu803GKZ}{ErpZ75hezt;L=Ds^mpi4Y3i)Jaf#%K3;9{!~vm;C7D zx6ix;-DRDexYQafF7`*W#k;z@C0r(uk&(4(Ed^Z;}EJB?1Y;A2bWG<6xKy!64tGw{3om4JR0NoI~)4-OzZ&`8vG{nR@d#zB3Ke!&@0r@t) zfJppD|Nd)1-_e%4PnFKtZ>XrMhLH-gQL&F{n|Gs=V&mWhQ>Js>_Aj>w)L2Y$VZL#5 zi=`Ard^*W*anm?R(l^+@ny0iW%gP!!W?XGK(>Al6Z)Aae`BAt5>S}Df@oh94n#5~= zR>(;uOS+IHX76Q5MQcq3PUf`WGCZV!DEeyxD!!CPgcJWawF2mB9xSBiczDdZm4@&d z(j(-fyl~RZ&FUebIREC-)}`K7zP7K2fW!2G)yGXE9Jz%Y>CFCM$H$fJz*kpIQa)Y5$Ec_^){DymR11#o zrFCH4bxFXANxYT%)2z@j`Wzo0a{^H2x=l5W#l;{9moFmvhxhMM8a2Oe&X~xmSGgdw zmkM94u~#`P3NlcTu`GdK6t6dPqq#nPUZ+iwnah9)35iQ#d0rJOx}ioUhblnfSM??DCzHuOIJcir(z z5QrX1yE1FUq^o^ycRg&ua>{TS+4=C{JrVEm_^zNk9*cIP)n3D3GWW&76b4-lXdWza z!E3)^HCHp3cHd}qix_dfJJDWKf%@_gfE0B4Ioru1%7a+k1~7t^)?`NcTmlu$YPwPk zb>&B|_|Tf=D+UIJ$8zRjV6JF1P%?Y@{Qf(Cq+dfrdT;!{L&NLPt#YwdP>@>m@^m}j zVzpkl0ho;J>;*eJ+Yldo;B05AOuYg{Z2RlX*7VxfH8f&y*nqKA36oY0rlIV9MT-?y zm2!=>^M@B*&}%zd%~_$JGzr=rNxIa;CZer!=|?m(um-2SFAo!1d=WQN0AQ4Ii2i6+ zS2!`@K`l(%KmXTi`b+<^c)wqC=nqL6+XK<)-pvn)%1X;IFw}0mn$vQs!F>-aoWSDk zeVzR=l1z}V%34p=imAJ^D@(85wf?z!{?3xmV|J6lHXUtkZAD#GT}5pHi*rl#imI_b5XyTaW<*oasWEA>Qv+%b zKxZn;f64r6Blt1bWsB|Z#m}*RvogCXzz@l$p>_YwcmvYmgA@3fov%UeV8ILjd;v}l zbZZ$PfVzRDpVjLO?{3_}&*vcg&byWUhNSGl-3>s^hnivwTC-i}D`U5(GCD(Uvx^?! z7Bg~{nOe-+iBAC3rEKEhJKG=i;RLLW0Bk8L0Ha;5|1mHka5LN*_NgQdR_Y1QAEGf3 z22`+@NEO51NC=Qq0q2`d*QMmFA!wj-(CuQ|pGdFH6bpUN&kq5z@O++?6=)=MUi1u1 z-1}*&Q%nqa`^aiAsemcwY_r&j@j7mt07W^36aZ(9UNb8wa0*A^qyS9eV^i}Nf4-@j zMr7?O2&-M_>hz>DG`>8mTF<#7W!34tsCb=u{{lQDU;x0FFiKD6f_AXl1L@oZ)*;0_ zu88dnbZ1(<#qlNryvfqW=_v=0Qq4a!AJQWix5O%scX2FK+?d> zwGz!e6SIQ|LiUhTgY#1Q@_0vaap?_73^KMJYtU=q{)XB0FdW)2y?VQeR?$EKGHDDv zd@Usi4i3)F_VaBCHm!^Qag*zEWzwS)63Cx-zz@8))Z{h}gK>tBix}zYKcYLm2Tq#G zHJ-?SRQPBnWhUki4dCV~Vb?mCt#`lJ-_2mJO1&kiCNWNA9&-Yeis3tUBgN{(4ol;O z%O5%Y27>XTbCzl97$>zw7pMGuz@m*F#r!=_8q|U;_1Vvm8u0>Bg+|P!Xn@yjM~1Qr zH=4CKHqIS$If}_)tlTTMjZfwRwJ~ef#+L(mg*?g`Bw2KoL7ssSmkpc@R2CuBH zxLxeyN;TL)>QOQQ)e!h1+wJc{23Q_d1iO>t$ucdugI@aH$B54)LG#nDxdhJ7c8n9; zn)3BbJii_L+)ft4%*r$8G6Ggq!pn%vF|6)(0qEowCqrx9z- zHMCmEjicy#fl{5=weU%!KY}L&x|ZUNrKg1!?F8Q(%L~y;7T2(~z#Bn{)2>&pvX7Pa zVPJ`F^u1tQlO*nb(<{O%%ZX3JX@W(nrGVR&yty^@o#A312Ju=&yfy>cH-H($0l$FE zT+_%fjEpk|7fi2IZ_qvT1Qj3KaG^|3FJ)TUX?xymw5^jp*L$YGAn@Virybqo(Vb|I zLD7Jl8j%wBEAIH+Kadr9WZihhRl52b|NMH#I)IPQsLxP1T3cCLd7H^`7Kdbip3`XZ zF{(E902g2(VSRB$Q`cOOVuJ1mSYm>?`QeZRDk1Q zt_hm2!#W#^F`#y&+SADBZ*ae`0`y<%?b#GCdh5kfou!E2(K>*&D8!z zk6*N*5b#;adT|`Z%0DaDjQ9LCMnjZ8MDjJ@Ox%5G`*N*V?iXqT{23bhO$~Q;cIsMd ztagRB>6JwQabqHBNZ9rtH2&8!%^$HU)XG2plO=z}u0EK6Q4syC@P|PEOV-{2yJq}u z#^#iN>P(Y)F$Do1ax1aG z|F6*QzcH8}putHWg%$qOiG3ok<(ws&?Fb{pGNWp zm;lo2LcG8Gj{hRp)-RuA_yg1LeEjcw3It#RnEJ|0|3I$MUlNd(sQKR+{dFUP1WbUk zCI1f#@-I=z0`f4Vg6!45Uj4`Qe;4lWzSpmH#QeVt_je5oaOVG?Bu-$I8~I08apP-Y zYiloEvA1vST*X|Ca_065ZR+Qn)B7mU3X5Kql+2U*+KL$&`SGV)oT>SKT@OELJBtNpXiInT2s-j{_LPGMlZ{s|iDxdfT zs;v7*3yC-8*ydMRhk#BdM?48be<;KyxeQe{NV%zn?9lADZ$AiX>1ez5Lc%LJ?4D!K zk)eUmA;m`mQ{OQl;A~tV_8*xmC@_=i?Ueve90f>cw9URMxi@#4t|taZ;-m#EErC_g3S1Cp{>MZUm| z2;`#pOrpY)?&NTw;i;uXM2w}O;8Q32K~nNVP{Q2gRa!=+l(oFJcAG>@WPG<$`*0mt zF76L){(?>(=ic7d>~0cPq`i-w(C;f=Y7-Y*^z5nT9?TdC^zKXa(`Y?W5Tm`l{bA^2 z?$c_)A%v)zdCL55@!sBEso)>eUN;Y8Qoc>Uq@kHK@O1q zW;st_)&MngqjDDeP)t+Z6ttQo)9<89`IZ#R2sAKJdc7y0dtoFSlaQ=+aa-7JAo}?N zRhTPy6{m-YT#nfd)Qa5U`Y9G0hX;{4;|aH7$=}`*)WS-ESv??RLvhjK14|=NgE*O$ zXmY*atxL|gb>>}MALNkFYQpND5Uoa?z@_wt&uS>F(rV9R&ki-3QqE0WKOh`kJ1PPI z$Hsje|D+pM0b9SxyUV9Kmqn zysAD)`+8{@YYuMd^znO!?z*^$zLlleZYvA=-IoO;QL+TsF!|goTWlmCj8Z^9d%3|$ ze9;xI0YsueIBtKQmYlFDSlQ(|{*@QTP}az2alRW96Z4bZ_>jod{>!*c!3VjZ3cR<% zxoRD;2`e!%0Vg;9MH^j9sYZ%oe)vP(th8K{PY13I&3;cV19pr@2q8-@@_Dkf-G0dN z%5jKdI+^iN2?0Z7;-abLv;oRpcF*?XO{b-TT}+WQ#C+qjS}OALho|hr-}CbH?9V0;r1-;c`xw;9 zRs^?Zs~O%3x;vk*C&(4JZ7rKz>@8N0ud+@~OOB=TJ2Pume)nE%PUUm_LddDh63HLo z@~BO6W#y0%?j0oGw)HWq8Zm?f5RSA(6YzzqKUD|!JP+C9fzSzy5c1f?z}(#b0w7dbf?1_-yaIB2!MTkeY(HrED8C;9YYHd z8Glqzd5r0rW-xC%`PH)DNN4|r&^!nk`D>aZDE^qsXK{C2o)_-M2AgQav3MN~ihjBx z{zETxW6&D19*=*2@uR2=3gD~bU+gZVs^&%Vdye-g?QNvXr8d}%zHkcukjCZdW^S%2 zpBUci$KJ(l_G7K-Vi7(J9@g=ORU1y#@Y~`sChmpO^W=EngMiR)V3xyee9K_-3|42m zTF6;M*plJn3rt{}MCvj9>YYx-Cz{CDh!{jXpDqtIBT(XgC1E|`=Z;$=t#*1RtUbLm z%?1*~WRuA|wMY6n8Rf5;IIE@c8B!=&goPO_lyt4gjJ|q%d3l+eo2xBmX0>I7YiRKD z@_Gp(z}8t&ygZHrp9&Vf|GPivgZP%hJW)phNU}=>opr>i#$OpaJ<*8wh!u&R;n|Fu zudd^$;(z-Bk@BO(uI4G8trC?y6_;?sM@2;dd*5RdIxJLcvB^vYUS0VVOh~)M%{7^t zI5X=UE^*MUPVt<+@noML$m49miiUlBpMI$sVCm7T^%4w>vVk=?^1B@B`;B(KaYxk) zeq1A+Fr+O8q!HS*Ci@i@AGY=8G1*cB$?^ z<|zpY31jJW-UmH|m|kYQLCLkh*-YhgB66NJ+ch>Z+2pI7vCp?Z13F@&XjcbuD4o!Cenq_OdtoR;G> zcLS|k>t26$z)&eZo};_syEEr9XoQ-HSM{*aJtHgSQDISO*tz!0J=&jU2(NMMK8U!C zZ1AY*xg3eXNBr1_ctE=qA;feZx7QYB;Ngi86d)EO1|M!&?~i19epCQttOzg;?Ck6s zGJFH_iJpUBcZ+3`N2+FK++9{D%ksA|5+Rah1^$S^&Q3qFq?*N9DOs^hJ3>g>x$^%W6K^&wkBf-Y zuF5kXv_lcww3kiilv!RLh5TdS$#kQuwCW`7LIjZbj07^jVMlp^^)?-c=X-MiJk21f zBu-8B&Sdrk(9V(DZ7u&b+ATWPtjydKpob)o8WDBL)POVqdkGHx<0wOwBP5k1*}CY z{;Kt}`BhH~$xcOwA17WT=!SNX&A&a3o86TlXPE($WWQ?x-^6P0u!f0&A$n(B)qnV) zJIp}o4zJ1U{AwIXQq9}kI%cxPi@7jqXlTgxN09PkH_dm|^6to76(#D?bkM~F@Et}K zv~u%%w{m|UeUa24<>qF*GtlgL&1LQNZfJX02+qg?{XDbOOHcocyJx?~B_u~4eSVmC zx;+sJltHC@pF3!}5L&HYTM6CmyJoVn$b38V67!o(;p_O@_p-9HV3UJBm7*VGKY*k| zxB;Q{YdI05b{pLYLf*`~b^yhj!xVEYZxaAqw7d$bFc8Ne;|S{iPJ3Krz8D*@{{wQQV&OfC1y1xf*MU^FTJGrayS62`5O? zxVy`BWrYFjmCJ^99PZ?o88VAyiW|F^hC6N}o$<}Ii(LGH{)B-gp0&x;6HlJ_7ZijG zlHr||P>9x>i3%{{4P>1aI7;hM?KCbZ8e+4y0NM2pO0%=YrP{DCRWLN|_9m1?*LknH z+SXJUeshADRKKEkzpeI>&6uvE6P|V9J2q40dXjA27#(Y3w7kOfs}l_JK=Ym3P@J0X zXn}zQWU!FaLh_W;bfjfd&*kIrLX$e%XV?rxtxSjAcsw6G#MfU_{E|hl(m|>{dM1pW zj@x;nPz6Y~P!(x=Xp{8CGeI--fg~1yP#JZ16KWPFEXY)?2ld*Ut44igC1u@JbKl}q zGFL+t0KVAGG+B7}sAkUsL#gFk0W1YL-C8OO)`65DtO8vN(j9)%z#xvRn8WikTU zlw@y)@{lLOj|20-ao_>5iZ6WWq&IuoY6Q|I41YSd5yC!OMm0}AYLi7C%+eJTRuFeP zhC%X!-t`EXd8%tXttast8AxQ0o`;qrOOmVQ&L3VfaHx18sW@D?mbbhQ~{Bu3&k@Lsr>jXx>fqiSqZvsS7~}T z^K#&(+adnqHIFN!gy{F-!Gi!vZ!NdS6Tv3H{uo8L>xk00I}O`qvUT&-r&$MS1#)^- zshz>YL+a!=G0YzQlfV`PTIy>rj}iCaxdQ<6h2Lp6qulEjG1op_$V%G}zvm2GJP66DcILiDV`W^2F(h!a;;|M!plHcJm= zTsT^&9>k+q%w+j{DnI$t4vGPGFg!4kcY2MumhDTniH*3H*|*V2)*jw;y(H8Qdi-}F zpgr&=&}Pl3o<2Rt;$WePr-IiEv*aWM&L1dUK{nxOlOnsyfl zVswoFx8*1J9*3<@we7(AN(EGeg;K90)`8_nVS}ef3cso0HNp4}jgSsvctwe?6BWK> z_#!_x23upLA4%GyUZ7mP-p*0Mb`(gdYSvn(Pnf7CZBAt5c@0@5WlGzdtyDBVcM&_jo`(%m6a(j_sJ#L(T{-Q94H&%5rr@6Y@E z$zrWJbIyFvj!*2Z7<&~PyXFdvi&;_s=*YRdRw_-QKI0WlI)8+i65*&{X&h8U)sFDY zMNMq6D4F$LT%7Xhj$Yv&# z6YDO#jUwz{F~cSBkb6J%rp`|N5@)-psB6MoR8`eF3afVX*7`B;D02_uTAg#yD#SBm zsXnXN>^{FGO*z)q)gAlwnNH2rnL{9;hUUT!QjW+%5S$QV#1Ky`nJ3R$K&P#|cTAs@6AN z4$I{yZw9Bttuts$Xxa?0*b(mh=8%v@cc#o1I+c>boLDZSB)2t+R42kk-mXisw1qY# z8b!H;(rEn2X?xf_!oj11)-Dr!b8~ZjT))zB6X5VtE+T`skFdt+vk1pBCc zEzVtE0&~OI#YN4#QfHa}qN0Ef<^yZBiLp=~Z4W<`KZYMF-NfE^(v3om|UfwqKWUB0Xjm{h?iH8&qh#$Ri(4F)zN|#lu zpk4WaGVi54d5v0iXsf!R~H_&*SPa2`PE;VI5^t0zxwHbbU6yqQF2L7Od3syFe zdj&Jouh&Df+wG&aNr&Q6{pvjjz#@8H?vx1F5;W=E-s6?ZY8&iuwMjxD&-?qD3DQf> zG;9xZiPvx|_~x$O{fX+IT;=3Au{cp`EheibQ+cc{hA=GWky%f2R@{-D+NVo(cp*z( zcGEF5C@4gKY{3Vlyms8io%VE!11W-#@x;LbOv;#)6dXdz;Q*{{zr!IcGNF32L!cBo zUdqVpO1@N#Z0?dLsMb#N=Ko#!|2vgRz^gy_YF7ONB=38}IK!(k5HWuQW!hk>92s>X z0qW?l&&)LF40X2iu4fy)42Lv0H?f7}T0!sI5qg=_3(42APA%im4t1#B^#H~v>!bno z(gUzI{DX3Vd`S}T15OVmzlCt)h;0gR~@`u*>R@2d9 zocF|5_pIN$gSut+q=)&frUllYH&Sl6ZV3Br5z?ypAksegVSx!HMdjVVjN#vyA^aJQpS+#!KT&7OG zbieIH3ny`BYFKqA@Ed@o4N3=d>Yu_Dq_?AoYE_%Z?L-bsK0iI$tKhz}!-C60IA5++{aa%=llv#EJk0eUIA$;D{RC%PkdKM+BEIRDPf`^P z^75?1t|j!DEbCG>d}Z4xgApFGN=g(wR(NvdI(2p>@ZLWuNmK0dUDMR1giiXRJ`bC9 zg5WmN;p;NjKVVdbDw)Kv##RcNy0%<~zv=N>nKSS^P3KA@SKXc_eSHBeZj^xgZ9V?m zx~`1RDg`M$KKW*pJ}cUPVK{lQ>Fd{UzqzmQ%<}HJ!AS>;XB2{&d;aa) zD>V8{@88wFB8&w}E4SZal+_zuvuiE^m`rj(9Y8b9% zua|7s=u948rGuU4iGz;+I$uMC6NXW^&~II@9+M3?HjCUBvL8*YY}mlw7x0bNoR)Q|jQ_@xE;^-8`Yt#aQ!o;u1!SC6BBAatRD)VmjgXNn+7z7o2Q0coI@Uh z&*sfEc&Fttx<*^*@vxMn?}c;RzSbo_Rcb&aQdE^K%J9~7Xv_Uola_SnV1LG^itxb z1Cq;7NDQ~-&v5ZKF(pu-FX#T_r{pHd{CEB8PltR7csngvibJx*5T;@sAe=@?V$qut zsOBj%=}S_~3`aMUHJ6gC5h@4hMWM}jpHa+MYj!q9asc-+l-MFdz~DE>v|Xt1N7q+l zgNFA3P?hRzt~A7)Stw6TZ+50cv-0(F(Itfjn1xbthTl`Hz*a+Nav1!U`-cDr6&&#Z zO7i+b0fhZyJyrFgv&Dj^8e5uz&`Z??&+EgE@ZxISJ6Y*MJ58M6LDeIv?XK)NRLwf~(4$PDUXL>WkcZ+Fu0i)%(<6lQ%KOWG`INq0u9giz z)}xl{X$DZL)vZq?T_R=|g-;?T2ZOM@%j5ZLAdfL?lqxAH5p#KPb2S%Z?bZErl!b9m z1`8vt&=V5t8pb{!ImQWm*VwYE9yXq{Q@=UuU8H&Y>MYr-|HIyz6IU$XiA_xbl~&1; z`*wzTmiJY0dCT3y`7mR&-a_D|@q3*_PALu&tw@ZJLUU^ik~B2kI#*jCu_r&ZlF#|0 z{v|&L#k-5AN~rJZWIgTx&~H?mu9a7FDBWIaeoFfKb-7;MQAFL+T%{9~@_qUS!1GEX zu30TL+7|Qo#eNbhdw~i4*}s)wnm5R18gAgTnGpL?J_*SV*jajWvL2=4v4t)FvGr_^ zx#!Hs`~G%!tnGJqD-x>rWP*l5vVE|(6_RXcy_2b>9ffh}D6q&H+?ki8>o^)jIKyM~ zs)3(>AZm+Mf}hgT>~u4@GiQ)79g8kJ#RZ~n8#4cS`o>2`evtCiJtq+o5~6tQeF7(M znuE`%B!CZ+ECZSXex=Fh};Q8SDh#xh3?JQch_}ae$T43lY(r>AanJb%<4_|Po6tJ zP79*eu{k{fc<{57k#FSA;)_wl>p#skFY;$+2i#5Wq`%!0Dme<3o(GRLCDW_bbYWz&1?_E}Cw`5rGEgr1Ul!B3e7!a^mM z2{AZ6w(rcH{tZ5nIB>p3WWAOwe{_d*Z4%GU7;WWBG9x?~n2W=!6R*!CBQy}iR+|*6a&!n;o<|L81wKaT5Bh>G2X2RuvfG=uD4^T!plYM;85VsO zy1CZ^Me8L;i#MqiL>6kXEkxpD2?(`UpuIZNDq?O*Sxig^HVEOSWh~SwgQ2hK0LUPv zU)b|%8gbhR7nAHAHtD<{$(D%F?Zo&*w2L2aO#1m2gYtLH80)#3-7Rde$8wAJ099g) zL8HyBd6uu8?2bbL)d7DDKi)+GBujR&Gm%}hekUMGq-E#px#EbYipjs80WwN>)&7HI zO%3-HXhk*)h|d50sa##%*ruXFsEG#?8eKzdI!8q!GpQ|slu6q6PH9DMJ`WfH{>=qL zu8zvCvvKk@JtOa&AWXvG$ z0pN#o`MOA6mzxnIgW(K-G1%i%UhspPdNBYqo`x*=kdF4Sv@1+B62pLKGoW1Ci_;2q z-hFsH_Kt%1PwZIk?)uCA-dSz&JQn^jc)Ebp|1TC41*Ny`!`N5ZI|7#Ns&GsSvm;8 z0*Rn2dcp_&65WPAovl0tk?Mi)aQ$Y_7_?|TyA^z94bIAi8rp+gm;C`iu!}`0z-^)K zWU}Q&%QJU#x}Fj*<|i?p52x0R@ScDE7t4R85cVv8n;k_>J9kS38?TQFHa3!`4n@G0 zw0)hS;;~fAZ)#IxjV;I5h(4sHug!LPOlYbj#JBJ*`(7!?^Z^K+BVMnZ)2sTMPkn+M7a582wgOfV@1BrWTW z(pSxk?l5?vI6@VQZ4wMR>3X4qnuWv9AThMIKXqmpMa-2t zb5T;lA{2Oo1?T`3skx2&M_FY^YSgpIUb(vF3Zryy796?sSoTzn<`T0On0?}1c9ZB= zFRe%1mf^FaZYvVqFX2)q=Sa`BwA_s#c^Ok{JAcO>ba>FGg|xV-mftpV?5vaqhRn8G zEWY!f?tw=6Y!xW6Me~LZI&ZQ_kMUoZayju09_k&LgP^!9qZ?Otiv;fj!?(vh+LzE> z`sJJdL+QUK#{nSABzIX8bz;I}J3Q$TK58C1(9mI+lY4*Y!tXIU9jmeJ3A&jy9{<^P z-+pOy!+`1duMG^Y5v0+YrkqS^p{C=qj*cIrC>8+*`Rb_j%}V0S8qbRzu>}^>{H8Gk zZDwv_`JCJQK6Op3S4?4twRA4`@xOWY1Qu+9q_W=TznZH)WKgnQNY2Uz@f4$DHJN#X zqSdE#c3g8Qv}VG44>7)c!muY=m?;4p>|HjNUOc;adGfaHPe%VIt7orb12^K?oEIhw z$SS{1e(d6?%U_fmcqE3WV&&r!zH$MZ;JZ8x=eFLIvW->7iv3>pP(Qh=`v4_ z?e_?jPprE2*vAkrFY3(qUqDC7;#xpKeotXi++suC5QZW%PeC+2c_uvjEGN)qh8Mx{Gwi|5s{=Qe=zw<+tP4}a2Q3*Qp11iU#LOy@*8=k^IrD14%T&U`0H#L)DA%e5rHgS>zmJ(wnL;_U z+hmyKgK;E=g_*wRzeo&W@ z6j-9Nb4Z^FlI-$&k&6L=IOqQO@4NCI0 z&niRhb>9wB2)Y7$vH);E%8u(R%<~r1N;aJ<9Yu#j;$3C0n#A@Q%{!$!o8iPHZN#B~ z6N3JN2j*tqoDGnuRFw+zk+`dn>v#Y7Q7C+j@?oPb*DOai8>EQ|z zn3nsu4?^&1$7-^X;_mmPFw$Jr|4#)5hz}JIe}pQkIBMB( zDW^}S@yrra_5U(Z_bR7tr&$f7WhRQC6wQ2DqXl_2sYq7OrMuw#wP0?wq^wV+i}7To zauiiA&CPLP{eZ%KZ_lW{H2c(zc{ml24v@G^hSCt{*^nT?EonL3YhlSS^~rlV;9{6q zT#CM0vDeYTqWGm&Klz-@4gVi>l`rLQ^d23SvFwKn55J`4*kTsuNn9>DJK+XuAaN90 zsg$3umU&dyPIzAt7uh6rv@*_+n&=M_3}h~`hzd4qDV%>mL_-Hc;vQ z%s$_xFHyu{vT9o?1swpRJH=E^)$%$HGb4zN)3l1Hj7=4pvk;c>_g&rl`k1~qOAbuY z?Imxel+MpJ7ybWrYj5CrX#O&m+1h<`UB8<22}WR42bFY&-Ji63q4ExP8WHOi%8h0S zXp?<6tb_YFAQT(*J(0P_*&V03*y=%C+~J8M&holIJ%fdNoMubu|3ZxaBMGy5{}&i< z`~8un!NkiFW?ZbkS*trYRbnpX*IF;Im$vNV-edKyohEg~6?Q*hZ8+R>0MM-!6IVDG zUk`6|mrJOnzV7i61h#i-;0}Cp`G>Ci`zJOAAU*-X%}>hBcT~-)-~7(Y=P$^s9-WET zj1!=z@6HJJz*uvQG;`&-W8fC zYvup#CS-t{uzkz)-8`qL*%aS258vW*RZfCON=C*PGetrIf->EPDp`-XiwinNMn>4V zP3uP#4)432>GwL+9lN+GwgMk4b1O%e?yrxJCyL^V(C1=~vDv3+;9ln?#p5L=o~3o} zs!yGU4@`;a6#Z|eQfm6YKU0$S$J#MH-Ghkpx82>{9P)y6iCy2(6eisC?T+p)_v`Ey z8{Nkf=@e71_9mJ6`Dd-LS;hp<{O1xQNO*oQgVX|G`R4#vR*~r%7&cfby^YI8K`5Q- zT)z9~$lxDB<9|e-g&cpMthsn@Y`P$b?$2l9tR$TSRz^j|?{)cKpt`q!p4+|4!VnK! zV3z>^UG4F^K*e2=mYVu)oJi4{Y?OzzGG_k*e7Bn5<9fUV$QDd=1}JOIwR1-M`}*YM zo9WEcSm&bVK!7OOT8vAXg@5+HV!F0489(-IuUa;f7%DKa(GU7H+P%~d*>r#7m0Qd$ zOIK%Sj_UQ%Y)Wi;Vth1N|0^xiF0TQg38}MLTq;yOOEJ%!EwSXvSLR|cZbIFo6D5u% z6-&#^%mhaI#QnLO8wtRfPt14+OP05zK*cq@rwWEglJW%&|>n zAPR}M^t4la?^?=&bA0}jQ&*B-ub_e0xIsb+e3jqi>T}k{$ zViL4xVzI>CL+&FD*b+xx`FxkDhy5xsR(*gAeDt7Rs$D}d4@*oXi-@Xo^vI1Kou8eZ zjlX61m=Y7?zm!K|qMtDlo(?L{XDt_rp_FLn5&+JaSR+6$rok`Sn9uuhE@Ic)DN+<5 zXV!D5Gyx;#<=m0E3mt;ET_Z+|a{jNR)K(Yo*S&7Jaf(M%+q?wcrL~x$R?+zTG!utP zS(up^UAsEFIvbleZ)JNa2!`2MSgsQj2$DL_;5y0`&bWSbX5@aDIIBndywK$Cv^Uyl z0p2+M6M!r)uVp_!ryvZniN{&B(KPm>;|1m83T+(D)vhx@B_$;VAx8%b4P1&9IlY8A8|D%R{cl$><{Mm@9acuu}_Lm^yx2`=pgjh z{u>@OJ|$8J)UcPzYBv;DwRb${b>+RJP-cOnvDiLyJkAuJbvVrg=rLHQN{8!=ScKu0 zTDKIdHeOEuolc>hPSQsco)cT5Gz`z5P~~Qwkazi+a(yT+i2TN+!>(p#bd@{#PWv@a zq|(WBiq9ODmWm~{&8Xh=Q_WS8+e%!N^Uniw|MB+u#|6I^7Z);^*c=zJT(Z}*z=l`- zKG4(z&pcgMyXG83kGcEJ2^z1Fl=i~r0z8}9?D={PSG(5A@@=)Zl88;>SZO4Bfnnd) zBnaRxAH&O}0_kaKsWNBt8Y)-G@=?t!Y_b}l0LuNBvnZ&5zEZD1GTc4vOP-nG(K8&=Z~^7zNK@G>MYiXhZ7q4ege`;52E7WATGCe=Px!&;27s;WaJ-O zKW!+~nlB#cAekU02FmGBeVZAg7*@ZGmuhqQ$TQd}knUOXBmH8uPnW{)~G&xq+t zNpPF$z{_?&207l*^9*K`hgywC4R?Ms;Y}NtGW}2L#`d4XmQkp9&1H$}9~TGU`hrwc zI5?#1FjAYYKn?Xz9?hmQmU}7{$XHu%>1gY$mm_B&NJ;`s=|Gr*+kis_aj z4dFyHh#I3)$VmAcL$7gHCoyoAP<+nS^a_^$NeSJ4FLH`roeLr9PHxr(0GFKKmM>!{ ze?zZ@dO8glRo^}uw{tOD^2&lKNF|2sHO!=}CoXd&kllr?>QOk;7@XtcN?-#wMAgn9 zOxt*2V<_lbGt5Lq;=lI=m*y8sFw5|XZx&_Zy_rV6Nsll=Tyngh#JrC7(Pg8&Jj1)m z+0^32x2&xE{EW2xDTpiT=neSFc0ukT)Za1bLx^EULQ6SwbC(y&q8lJ-%e2Y%1BuBX zl_eW!%bZHPh z3jJtolAOHQuFc6z7tBAuV=h746u8BpL&WIwsYc4Ix{vVBUOHZu>w7SI+IJq&p{D~6 z^Sr))9%3!E{Y1r-_GKB2dc+U)L-XAyElDp2RU6A9Xi2*BdT&JR_?mH?o}KRO(ZfUY zOXne9G;u6~likoow)WBeIhAU(Dp@ z#w;(7@zg=KDB>fto`YRdw_GTaC~w#ZQ*4~t*m&BCY~-FqQ1k2$EBu?x)ov+0b5qmG z*P3EtaMiU4wx4MJ`@#QH<#YoFo>MT_l(3G}gMM;$y>y0|Kz}yJHMt3SI zsEqe{HgO!qrEh<#)ai=yvj*pXV&4BTTlkaUhR&raK5=D5ZiSm+?8%v#>QJqlnlk82 zRDl^1zFu zJ{=_`Of=K=7N8)`r|9>2yaU|PRZ48hnx_P;+JMoVaF@a;Bt}PSCTHM33G#o6KqaNW zzw=CT^4Xaq0@`xTX5Uqq)&%EeOW3UXko|Jg0nx?LnvXV+(^{C_pIH~Cx20mvSfToNlsu=of^0>a94-b0&LHaQA zyTGrA{|-_4KlX-|!oQc;AYx`@#GETnaj+$u*xlWwrKPnv01Q{Rx(ib!Hb225!4vDs zzc(Q&X+6yRINvhh-W8S=`*L%7U>b67r)1e+i4THje_uPp0bU#vUNH3lyD~&4noQeG30e(P{%c za~q-Iu&}9LdP5OmQ^)`eDz-8~`bXgeMBHjCU0Hr&S0^0w4koI3q{Ed&A+V}w%RTS#28I4hW)+Z@5Wc4`= z#Xk)8@}bgAPl*Ot{!r&2SmXyYCn`r%WcW}2U{ZfgRf8xKz`yfMgn_1`LRJ`*vm0AS&)eZ<_XdTbOuuFlSo7vgHH=D{IEr zTLRPJKd!NVy^5p5M)9CuM82GZjC}J``2Y$b94Nq!gq|s1IH)zD4tx+I%}K7{@!m|{ zJx$b8GnMW%Fs=g7fT4=U27M>c^V;2j`rMtLn8lDijwAT)PSkcQ`}!!qh2hNUdLLe9 zKrg+vM4ux@L|#`fG&QB!HQ27X69O7p&zKo$K@|zKja% zX|}$cr-t&5bI?qg>(K&g$UeA!*Ddm-v~IcKbW5i|ISc3F=k?>MGCJcgXnUPziLZGa zo$~H1ba_Cl`VheY7^XQLLLss@-|TwWsDkR@dbspB@98UQeKqZx<+^&wyCn1&UJWlw z^4ni;=C>_W4-|C#xFYR^eS>{FIX!tKnWRACc}J|329jJ_t-L3FeM|I(5uTpQzmV|4 zvArFiEGs%XElxuJ^x(keY429nw3Dl-rzeQuqP$@D+lXD_qPQh82$IP>$GJF`qg6Ct z&dNWW99636Aj&ca;8FEneH$7Eo{wEg`i)H6T2cX0@%DFopY3cX@=ttPK?)D89JD7rV1`a%&?{fk|4)n}(43=Bm z&T!sM>v<~vVjm4YFVs7ltCipI73z*8e(WL~f4V<#s#|b2d0XvvP#wthrm*Z`s1}gK zcdc92fY6APDFCP!=Prof*#0$&j<%&@i9A>U(NaTKB&eP%(r&Ki zHpTbZ{OqSZy>erx-k)%Q4Z{t%1DU{$?LdoZpjl3XB}Zb4i0;ZzT( zAPt~)i_4VWM08@%JF`FS%;hclP6d&}PunR|r8@VsO^;WC$|9HOS>?nAUPlmQkw@Tb z?)(}vEe*#t>j*YCr;$SU-M`d0JZ=UQhARPW79HFdf}P9r&mz}N26@f%Rg&Keo-XTW zH_;BOHkog#M+CUWK_~`=^Q}~?!+C(S99|6d!-X)Xg}hpCT_Bxe8YTs&^YT*jLo+k; z`B|->DDoDAuQw+b7tU%!Lqm?hs(~|l#m|IAY!fw;x~k{sSswqFQ2v)S!p}Qr8o{a# zuRu}sn6txkdPXg?h*w&zJiZU(Sx!!lfM{fDw;-zcJZ7azv&l^sfC%gwPoeqe07WZ$ zGabUP>~L>OE>Kf`&Na6B047-B)NV0;dEKjg^x)9i;vLzgrQ|1KeWH)pl5^R=n!MD^ z)58742MCTstVEo5Mu6D_gBiTf0azkJ&kyI~DP1?l_5-S8A3tnXqE6CZD)mm3XpLtI zd#n(paBqI|^u6CF1sC2$-|>K#nr8n}Oghhf*5%8t{ewQz2oOr2n^Ay!qpDac6SFk1 zAH^B#7y0svIgxGarz`C~9R;8L$kHWqIH}-ohjl4nUXAzpAtV@!d=E0Qbm?Y{(E4g# z`Vij0w!HC9TS)amw(0C!|0%gcl~#~Gh1r)NqBxjjc8O&rYEvF|840wgm4wAh1CKf{*Y=E;|_TqeqV z&o4EkBFHR{sXbdBtn!mo!niLrUD%BiosK7>se*x)O{q8 zPB5ZYLzPp367RBefB}|E3)*c#CMFw%MwF0JM>J*7v#)?%0c+?wwZNaBzhSxIPOb@0 zEbYW@O##z`VXn_eBBbehNXMu2>7gya;^2HpxZ8^#PDJc|)WczU$@!Z3?!smmI=tKE z9*^kr?BbAzS|-R=plac^;tjJk?ym$E(ZjjV!ZvHiy`<&MUY9)6t36}`tcS(jP^k9HC2 zS!f`!KAfNWo+``EgGy;`tw?H+0YCrt(7R`^8ryl89UzUtq{z6~85N$0dpSSGHgUL& z4b{O1>IJ~2S6ohaWqC8r#U5{iA5|PH+J~t5tR(etUD8r>#3X9 ziR=arQ~Xqy)r+i|AAJt=TH8}_hul^ho>Tikw%X--&F#Z&2TFX_)JId`EuV~3_1g45 zkJryBQ8Ng>EuuTq^*8l=P)f6frn9l{ol+tXJ0`7nm*88e`|nxL6C!&o3y$XzJqO!a zzNb@ZV1YeI3*cb#_%-~M&;96@a0FdOeVf+}dOlpBBuN!T=5BSY-+a*b^C!)MG$5UR zS`-!Z=()r4xiNu;w80ycY!CC3;gMLp$H2+tU2t}?vs7ajI`KHcdkQ0Ds%xvCk5 z-J!nllrb2trJm`|@@dptXCV?6GP|%aH)ZVy76HhPBMe<->p75qV5n~JyuaEFxDdzV z2U9?GGLui#VX)3Q9z1M*L=iq~hAggA8{O++;pa7JO5bq$I1<>&De`fxr3oYU`G^n) z6;1(dmi0sNL%+*Z3hskI(Y#*fuFy?eR>y^`z}MENL!3F8nhaN|pIFcV*TS{|8HN|K zYVgDE%Ea~Jz0UYUZ$T!V@z>ODirchm3F>szHvMYXL146nMyYNW7pIf+!_D~Pk=GjD z)?gYI+%~fP?AhiFFllIdmfjy7*pqR@Gp*n1yj#Vnp?e89a1celS&ja<)d4s4y?v9P zXn4MM{_G+$vdVQclk3|-9`T$m+67DrS-wyXMShv75sYOjews?mjQGTdtiFEs{CJir z&vr$4RS+q#=1xgTe0ME@^Az6w43@b$-6=##4@BIPGRq2Faqb;`y<$L@TM2dD<#a#G z1L*H9Bd3~-9(}~Uz!xITslqbtwO<`wBmKcP{sw2^a3KuYm9_yli2aqlNvcrTY=S|` zmgxPi9stj_+1~e<_!b;uwLUl7&PVYHD%KNFXyEWPy7j(Z5b?=)N~ZliL)F;B$D2)hpB5ZJ5QEj4Wx!Uo_UPctA1 z9?hc7_wO1k%s zlQ}H6RZqE;6pPCHHWZZL-UH6#RX0P;oN;@0h{Z7_cVH6-@w(Y?rbMx7u2NTlt%rpF zJ8?C$7TzF^TkH=j|pV9-+7D*kH&M><*oiE(X+@>&^zLa@8x_IoE8`eo|l`1 z_ZO5s7`I3BV5B*85&`(Zfo5{IoioOy3;|=lOSg$IfqcI#l5JK>ocJu*mpU!hD~E2b#a|R-!do*GC@e zLECUSpkzilI(21Yz0zY%)=^7dn))864K+0#)_pS=?iW{!X?8|3Si(1cg?6eci#%Ptx} zEYUkYVb;UF;*wbbqu;*5m)ysWSxe0g(eKP+D6PicF1F-h)d_Iwjh4(#1<0&$?LJm0 zx)g!4mXdV6VrBtTBh{qIC>ZFsJAg?RSk)@K$*(o5oQrOyZp!JO{#>t{c(A#!!LOnM zieH04v(+;_`?L5r2JKTNTKAg+DL(XF2GSUq0)ii>y{z9_jsR_cI*hTGvC~(;`rs^x zFn##COLXD6fH_}R>J_>uVTi5N>cV+(iy1%j?VWWV!y>)6ihTKPsabG;5R26N&EkFtUN76W<~G3w~-uW(MEav=1elTW@wf4>1OslPgm$y8KQhYm2;!-gom4Cu}IBoHC zSCI@39SB#?KWjW*vZxBxa&SpV0OI?xg13*p$T42n;Gv=C53}^Xh2&GhU0?QQ1^30f zOQEQD30r{p3LaZrZ;NVSZxOs(&3tPUW+3(n?U2q6mw7R~0rmw_BK^ZT0@mH+ zdfH~UmMrFX6;9IX>aefECPE_I`O({rK*ua;nav-Tc`3N}iF3K(>Mpyezt{9I z-f4&;-{ku)_`x8ccu-Fj23)5<#V@* zSb%>++q8ieVEh% zJ`!T4=Z7CK_qibK+;f@sLWU})p*@r+e&Vt|N%6>J(1R@UtkU>AdK7l(QJ7Fwf@~Hn z?zoRJtLw9#u3L|vJG{Mua|H;&9$rnCH`%K;X>~RYw~6yWJ2k9eX$LHPTBCUV9%#Sn zAX%tTKA?AKzFxe(mZs$BFr!0D!Ano_BNZxS$^@ApnIR5gCz#B$8yLNeIQLu9vZTyA zscU@-3Q68#__N_3m3Z^!Z;?>a3z^Je(|tL9pOL}WFC<GT(++Mqbfqb{{ZP$6 zpUU|Ko;k_`1%Wy?SwShXw`~g%p-iVP)0gf*lfp($?pum-r_17HoS=K)>hzx56UM1v z?O(vl2AGQjdW9d!3U|&Pmtl83lc~`B{k=E#3K}gj@&VWLL#Dym;rVftaO}s7{GGfc z1IgMY=XDI4VjiSr#ak;oAPsmqcs)kc`CO+xbD`EKkgpv zUA>hMMX3G`|HlOPLgiC}f7x;NAgc5BZos9>LjmL^4~m*>aD~CsGI+qb6L8e6EG<6< z(>v!J#2DR-ot8fxE#33c=syBV`u6#)a2NV^u8M}+k3*DsZG{u>*V|IH3pQ*WDEAbp-qzg9ishv;dqhpm_tJF zjoI*k)?L4LFjV{p;>ek8AC4Y2NG90DPiMSmXv%EK-}lDkdJ)2IEK9m;J(B&Wgbijv z2=>eJeIovjkowKl`3ZbZ{M+!7rzz;t{ltgXiH|lVAC#>}wO9D0sLocsegHv|Z_=*?JDAoMF+r z+-lvyZrQOkBUdsz(WjeptacVgv5*$)r0)oi1r@Yeo=-uV=BwpFx!gtT?(={rI0SZy zv;K$B^{73E)KfpimZ;zI9b*iKp2#PK633UX&-<8xbq9}!W3A7y2DD|Da7#fw`xajc z!Y~fbgYh~_|C|7W?DF0LW-p#|RPa>IERfi@S(L)Oo`MKZA*m^w{2u&wg)|wX`NbUA zD+{{^oFP^x--nSgspzN_GaS#t;2xl?#11A`dDAQ>W%y!xj%%m&`Gg%`ET(J` zY*fv>h*@NV##)C&Wf@5zOSbaDyXPJ(O`HcaNS{McNEkj^O_!1PM1Huiij+SWv}@%# zuhYIz`6Z%RNT>RWU|+3nLc*Y48I>Mpr8(<>|=BqEFNKPG}F!Gy57yz$B-tt+u(rGM2H@;an!sL~BmtMGiVKJv0~Ve|$G zd!}CF{?Zpu?IqiV$s^^TtH8ViTUK3&g6NRYdbmFCa(k13!YME*W2?W>CE{_fGp|-5 zHtL7*rqxj9r6ddfsS6S4i^^GR3q z{b60kMem3;WI$;;zH^{+)wV5(;nQc*-?bbfJvrqxfEGTdy$bjJ|xty^okZK2UA0eMfdb-K2E9? zMD1(x&@*Wc;UmloEdFlv$p^*p@$O3Ot<$LyLYDVY!%+q4qxODpfF9l4X_8V-gqU3? zJA*e)+8Db}IH@R{lM3mu0p_Y9lDQ;}bObQe(je;3^;lxC0WKo`Ck_xH;!S1KiOJ*r zs&rCIE;Gg?wkUe<5wPo&keI|`rox{!MHPMfI_OJihW(ot+kVM|@T_0N0#Ev9ZmiDY ze)ji(FLo-Al~Q-ur+EDA$c&px+oh;IPICuyr7^IW#qIOaZR>sT*DoHHydiyo4kkF? zbbApCQyXlL?5Kh>F+`hqtH~^O1_qk)ucu8r7%bU$oN*v{PQ8sAL|=pR87GpxuPpyK zOYhry&d8T*iZR1Tc40Zm8PDH&A9GZAzfdfMb0LqBf(15fPS>TnHEh}@?59dBxS~5U z$%FqIwb97L>o*BQzg&-YXH{TEl#n}Gz>@}C?ar6CUQm+rpYd!EpuBl&;QjgfDM~mp zz`^(H&MMf<+kN$R+u^H%X(wma>mNUt>n&-dB@%j7t2WlL9Z@>43%?M1yjSU!MrA`| z*3KEU8~Z7{@_GF=b{jK~FGBmU`?f3J!-)j5Iy&1^XWD9Tng@rR3_)NUFn{R6cf*KT zl?xh@^f5`EEzfBf(#dXiUo4Se3t3LT0Wllj>`SH%Qa$fS>J30{UAe8N;(OO6$_%6nrq zhT*}v(q!)FzV}z|Z_1fV?W?9v{(M$# zkTZSO%=}&l*RqKC!vLp6*W1x6s#4wcSYMDu@j-HSmXc5PT$(^=;FG<8P`m_tP%pXN z$W=KRBsszr9ACh6_K4Z5#wrIW?hR382H4;r?Hj$v#zkG6AeN)A9>}#PTnL$xdcFOG zkPIS&1}8(#FWYQMZ+J!z`JNw~Qt)NbQ*|cfF0wq9z4phIMUGx~6B)iuuw&Dsb?zY_ z;zuiHYMB~0A4uo6yw}AoljF=#c zZ}}vP@ZWUPv4rmz&KVjjo7S9F`g57OOYoAN=QP#LpB|R=$+$OmXrj;`$Djn9^KrxU z%cI0xtrx=@omOr6Ij3$f&eDDlCGQrYXjXUAW$Of!)4h#xVc(kwbNdnoI9SM162t4o zyY#H`q9vtMLVEE#aq(^KCimKAt6Mz*r_JsXRa-8L_sP?}&FT?*9kKvJ;=HMz`dpJ& z*IDH{-HO<^7Q-m(GVnZn`9x3m(#IY~eb^u>0v% z03p`%8}&bDKL`(x;98}p^yU6kyz-Gi-_IX)y4C!U*g4$4QJw7Hr@#i|@9vH*)$gO&=by zI9%PDUSZT|y@0jwoZw2~ikg<(v+SeO#@#iNf5xo^R`w77Yw!|Xb)g=ezn2b$?|p#s z`E0|{2a5XUKPO_M?A%XQ)vO>@xYiYsH^X%y1%r2$Fv#c=-WW-uD}2j?lLDh{_}=wT$(?!dj-w@Rw)CBZwm zkHj=hB?H~LimLT#Fg)fJD6`7Ta*u`S439oWjjQ_9oQQR0E76@Gf1-~sWAXRwW_Zr` zczV*JrO+zL+djShsCN5xT_!4*1+nMw;=&K^`RN|306aeYYzr3?c*`cu^anQH@rNv& zdF@f^|;DX9*FRm{IcNtWikLV>&cCh{AO4=!e9(qZpe)ka9o=|UTHO_=kT2C z{^TF+H#^@A5a8g}%ZrXKYB-%`pGTZ1obzCG51bAg(%w5-z*^`C)7pNMcipo2n=sRJ z3I=WMnTbawCJpe^r!#io*`46z@uNa*0W)h(_lgPOd;C2rIPC{`7LR_Z`)m-%w=-< zwdYNa9}#vcg)shpNib}iCf_(u&dBxwe#fR4oqOON*Y2kvy*UAo!|>!2w4X*UQ}5A- z#;9-Q&kH(xo@-+|1oga7394zN!X3>TpSWM5Ui6;F%TPe8# zH-hqvHdStaILZTm!~;&fpt|VEpIV1%7O68P*_{C$^WmqdNV9S*s7WAQqW*@ z(yKdCa7--ZWr5jc`mv%BN8?<=jGyiJ;X$IZSC$1A?@hqFpFa+g8r-k7SB zAsf$6f)^ccSHvq|`UfowZqOE9(=pQ|NVnW(iPMlNywC&9=lF`#aIYM;tuhq!vDIt; z~jv@@NBX^PSQ6fi!Ygb@&;*iUP73GekRJ~6xt*6~2+8919ZoAT&x& z0aP}@4l+&idOgw#km8}TFb($b(YUg(owS5o_D=BP!ahs}La0yzf&#PWayB;vgQ*<% zGoy=Es{bGM-hwNxWs4RL4#6$BySoJq?h=B#I|O$N!CiuDun^p(vEc6R?(WXFx#zz7 z?z!hDd~Xa!kM2SD-c_|%%_X(gT#RjT!Lyq8?{%D+UwFUtaA}iArg9&0GFP0?fu|)%{Jfi(q#4Ykx_lzUp!2|pCyfZLhqwW z$h?m`#3+~f4|`ar(`DE7(xhw8Wg2D@e5{f$#uS!Q0@S+H_dR%Jj;wX1A*f-XlV*rj z+MyO#waHqrX~en^+ga#`+r!6Uu4LZITBN&u0bcK!(%wP$7c6S zsmnW~XJDe$`WsOn!Ew@*;1YLh3I4nplk(WXLVa^fw6;n=g}#mHd>I%QYZ#-CH6)I3 zO&`nU?l#c`lgLej4>CoF{PPPm8ThGO5J<$bYhw%T!cI_qU#WbCh1NfU@~Do0a+XQ3 zd^fN6<;Y-%V9t|xmj0Fgk;)o3$Xa+bRSKp#Wa6_j?{_UNcsYUVi-C>&F3%xMJd3Mg z3hIdVES|Eq{g7%gCc&dE@D+f$Xq-*pacDAPV7@;ec6%Hhl)IF;N#!Ok1H( zIHg8Ck!{B_X(o(jzB$yv`C(ukf5G*eNd0~l22QkD;R6gaEl zytW`HDjF_rSDU>)nS_WN#VG%FZuT=T;`HVOt1?JgztB(F&vT#jOSV!60`DApc8Bye zYxWedQc_bVDhwcavv){EAVNy)0_r_=2|2rhl+c(1 z2PoPj`WnBv#&V)?uGmR;UJ`b1ljxxjtY_TZ@Q&lk;?`hPK5BQl3w-!mzp?}`xP>8b zcv!Ae-Im1`e0BoVQL(%T88nMLZPNi3B?`QM#=}OXv0~~^DnIz*G3nc-YL?hN_B(5J zB5c`4lAslvLlI4MSZnM$lBl0b2wf7Z-Q4Mn1Qs2P;@|MYm8cJ9ij)g6wTA>Q`pAUw z*sgPKCr%=umwrXFRo8?fTW`eI<-|Onc^VCS(N=Lt7S9aj;>w$!<0e`tsFdycR=q`khmxB`GX@Owy z>A#sp@%nGLS1G8zh*Q?CKO+@-_-vMAYxNNf2LI@~GSdv?zN!m6<2SkDyxPQW39~m6 zH`(E4`r7ZYG6#=$x5BmTw*4asB#HIwEUS^1Wo}qQ8P%1Y9RRA@6YzfKTUa_%He0a) zKZ5rkp+Qreqx9A7V@di7f2dw&^>$gZ`;)~=H8~)*7niwPMLGboC*UYe9rpYF$F4Xz zi?FzNsv9}e>+6%^wu5IL^48&w2*l&+E8e#)oIS6u4?`(O7vFSSy#n=y4;9dH>l{Zz z%*I2;aybd-FUr$tEDg}R2rZyyg&x`*ye!0vmJ3{uo#w5kOSU^W_1g@*iovs3q7wTx z{GnYz{`CGjtv2QYv0qp=YHhQQK4(e(?!%LH6`on*Dqzw1+S zaY$|ZT9&$Of=^CtT5n!iFPIO%=th6cGO?Mb&36*3JqLv{z30wGSZT9(Q`C18N8%IA z;h#&kQX_>9J;D`JH{n$g+T6J;@I+b;*L*rZD+9-2$ zj}=KqiYx`#CkwL{UWV8dvN#U$mh4HO8rfsPv%D|H)%1o9y*~UPe%X3zJyF!lJr?gU zI~!ki zCnKL%@7Ok}h_$nC+wwcP`_ZEuLqEJPq(&vXkgltkf4tH-&ZjK+B_FFI+XLIx>-{s_ zS+buPwhs6QQYlt|@wiB7>xOW-yygY!nWBN&0|~nI*f!X41Zgp=QbNS}9cN~^JaL=} zda&Eq3MBo0OmXJYQTQePh2|XJ%{wGG25lA~t&IgOCYgZj*M{r|%NMLV4!W0WPh-sD z3OMVn=KIT^S2Pef$HG{BF+QWZFYGgV)T?4kWIS9{FOX1hlcV~TIMQ=g<@}wA0hfzF zh0J)bX5)a2DkL6dYRLSrR-5Sf{yDFl(v=|hxRCkD0`DrFp^=oqg|g-GIu$xczCg4B zSG4>LfD#iK|9SQG=6%Vvq~ml)0kUY>0ura!I(ZO}VOrL|otN%0jkNyA>$DZ>cM^|(H`ujaB^ zm}>AKgym@AB8}e~qf-m{t4;0UAjcU`qZ8s^_S%~<3Z8pM* zrdr3QPlk|ve#vrM5CEg_X0#ydll`bSGItvIp>s57MCA|s!G2+;J}ys~Io@bfD0iO| z9IW~}B>TkaAA`2EWHPcVJ^YZze{&te9WPb*vX&$ygB zQLGl=MQa5sna&V(GcQ+_-%&Sl=0$%QMI>KM4PJ}Itsg4$m@)QDv?Z|!^@m-_#z&Pa zyzC8wZeL)2^5MEA!>478i%76qgOdVWM+2+Nc$^^#*>jtf*&`BoZWOF@UBf{PPI*V2 zx;{|lo_xvN(faqJKu+m%jEE*oo@#4H3A#Vq_{sX0u~=!OF2`f_I6qfnBU0yssmAQd z?knR8&gd&)eOs4o$olXTf}}^M=`zsGL1C7AVy2XUw#A%Mo@A{uR+&hahv_@A>$$3C z9(&U13}0PQ7T%~+6xY=EfJ?mfqdh9xUe}S<`zPwJt5xP>84;M^x?vo)-2;aCtoqMU z0XRDpWikrLpzQFBnou7~>+%J?F9ID-YwA|P$a8|P-?MNBxE2T2{hfbbD5*tgBxgp- za*&x_8|8U6!9N~@qL0DwUA1|qB4kZZmJh`}US~kqs=9T?&0pu=+1fodQL2@<2>CcF zd+wd$@8&b6z&}0Tx=?~R=7z<32rHH+eP7P`a)XxX9n&HpfrAUC%N5TP;lfA(L?Sy_ zAMA<8=nrbxu1-!BF<|LpEo~H+yRSW?L`Iz{DH{HgwjEd3nclg+WN0lESh&lQdrD;- zKf(7Qeq+|mya-!kFZQi>O0ZUbXcOpSR%=tM&h$5)lOQ(TY!y(jwl^ZAF7yMru6QHw zcK2bOzHh1k14B@WuEn_l^@Ztf7MZ16fHDo@=b>PQkqx5cec9OsP>eEI2|bTk{O{Ts zXJeDwf4tA@cgC9D_IW%G4!z!;H0vTY-PI(9qrPl3gTZ%Pf-Bh`)I^@K1`EJERXmVy zauqdcGvL`p<0b&L>O>w)lOh)WEVwD(Vt3nPe(JHW2I5#(5<u4FYgI`&;}x`7OJo@Bb>1^sUA zSpq9fWBB}Hk|>hkF=si)!j<!uC3+xh8H3fhekvv;uu24 z?}gQlkhLx&s0Sl0@$ncBh^27Bq5pwhlP7|STxLA}XuMZpRSq)fDrN%FMKLcu?ku`_ z>bdOayUYlg^Hg^6@t(O4bvG8B`NSES#<6<$9K|c}d*9J@e&xWGfn!8u4a?D)MA@$GX`=h3FGRLgo*!?j(QsWj8}@??|J9(jubihlVq+0wZ6YmuYInx`X(Skhb2|?EOsSlzcKo47F%TxEQt&E~ zJ{T{R|AVrY=EcaCtGgAHYSViLo6E#uQPp3H0#}NehVnMP4pGVc83qk}CJ}MieUfAd zTzuzSld3~2RnBz#A~5{+-MtN;^L{3;wdVl2h+PY_29pVNYIVMC!OJ-eY4zDshp%7t zUYh!-{Q+6cm6TxotqhXiyL)rcP*N3o;~Kntq?Ieh^rS&T$MPInn~RbIkG@Xs+3(x9T9r3i5PwU^-bq zoP;(dA|8PL9d4hLRw0NqmgN(~^$xy!u?VJ9&-=bWw*}QuLGUtt7Y0eFo508dA^Jj^ z>fCu2IB!m98`@|E(B8dew@A;}#&J(htmwAMstiYPJu=B*sVJx^Dz$(v-fvVBeyBpZtJ{%xI)V{eqA_o#hEr3DnR9SUIOD6LDMPzliJPsPVyJ)EY}plpj{h-Pz@Ow z`iRX2Llu9yfNUQDyY4EV(dlRpcCO60^!F5k!8jfa_etiqJ}a1 zS;mJ&-FFbO6K3s0`;NBH-_Gjfj-3csUNY}IZQ8sKra_BSPr~gKS5J_$a^}lrv23=&5DpdBgYT}O<^QsZgJ%aQ z*;Jz3vLE=|+QR7v+M#x{;Iq^%jiL6b4R8K%cMREo6H}V;4fbrgJZ@Nju!84yB#F!I z^*a`!rxM0xq%*7*JU?xFJz1?apx;tzsxz;=6=1kQ;&6n`gFyl(FWf&t$xPs)iZEJ1 z>`|0#W8!NnY;$hy=0rrcKr;bOBs};bQy{TF5v1X~p~8NP5`kUHimP@@Y3LSPODs zR?81-2h+dr=}3ouQFve^oVig%BneaWxJqVIywwPW1Pa;TI2l=FO?1h>t6%gw8qd2v zn)V#}h3c=sN~d0>NE`6SNEZ)P)f17` zuzKZ?m~K9FYyQw0-MXRXx9FiqX|osjZi;rulobB1Wz_S;+pj(54-=$z_V}#{MTOr8 zqOY*5DmlNNp)XHmFe>w%{N~~l5W!7-y3s0IRel>Z4s-yKDV121S}eBPg|9#9Y%Qy9cY^@%uE>I_eH}bn|0IBa4V76Kl2* zDH}7Lc+fbY%Fh~&%TH#I!cSO~sTQ!rrtcPb}xJIhg%h%j!V_aG4; z)^&I0##Kwy^?WRyJx4trFg`oEi1tJPFj~{ zUhA4@N$*^Vx!%dO?Dya~Fnr~|H2M8yB#ZhR((5CSW6FI;3}O&fgc(a9HoZJzApc1J zvBK?Ake;ht8AE7-pV-9`$%$o0&ccyZ*}e~@-bK)1s?1%a1eS`q}l zG3ZpS0pjDjOrEz*S4)DotDg0Xk!Wkv%lkhW_o&X*{c&I8%9hVe#%iRLpI}7?0&^YM z{qbve(P#jU@QQ23&|mt?jbs5o=(ISq&GV^yC_)h=gT~>RHgfyo>w4TTcP^*S-d#*x zrWoavl<6?GKF?^qpUZ5IONXM5#H2Q&Sq~coHByx17MeYc%R{W|ULV4(F&jLoFTpS? ztlyz4>>HPeKfQ@su?xe@2SnrZQ=p0{>>MI-c#(YB9Cu%Yjzh$MEo0kJwpS^*G=?`Prk`Hj7^6z=eX2r= z$)ak~%j2jKFRAKDW?z-@Wf(-;7xSmV1{vXZ|9x@k?B?UUm#cP&FFoeuQsQ&uV*xhX=Ajl19M z|MoNDJbZGL4PZ(}>_#E15X_QfG%|Q%q4l}R# z%d*t4qz5C+Pk2E}o~-5dB~&trd7VeDQfpibluR9Rd9LJvLDs&Z4_a}nb+Xy^UB^VV{g(15jgC%5ig*q!+h?3*X6rVup^Ux2b)zg`l;P9)uh0a z(fSkh48=%xAk2BTm{+XMH2*I?x)_4n%ogsvU^5g3o?mk%vFO^5e+ zthksTx4Ja#eJ0^fq}V53j$%8OWNt)6M!~>-7$Y=%6=ZH)t5zt0GPYKOEv_9eT8rAS zN+WPT;kT14n?mGT>B|4}3VU*^4Tk_0;dPBk?!E%yrOj>PO8vS0iNEDT^62@xhyS{+N&q$*g7gNq$CI zYt};?~1w|4#JWeRbtT2a(+ZLgvahfT4i)jfNqGu z7@@h4ep124x4Q$Ya*5}WXfW`e3shn2s+Z>n=n=;9eTeD#EnOl~%%U!^jJsP3_~a$@s4>~Y%}AcB)EN6xTv!*`&h!0l zRye?g(C`&iQv%eyimt$aJkYfe$U_Npv^vrAl>mm1HwKJD9PXIjklv7cs_qz-F&wc% zwne8%043{?u?{(}NF!G~FF~TtW-!fcAmP?6UNogEO2JK9NDTiscJvnqVxRMkwk91P zD0$Mxhw?~#+e5=JjwWu|Vs%p6HNV2n12y+e=cY3+X`^PQskWwKsN+>haT0eQW8e$VHhFd4SbtrIQGcIUp7U;Va|Sre>|7>S!?xF zCq`^b^PbY({f)}s+) zYJ-pq=fn_VFy?jj3)QESRCkt45AS);D4I#H^;@{-gGJ%Rd*Nx{gMBj=vBQ~_7GX2K zMoJcex%~}B7e(ZNRAmLhc%?R7uIs${2t|;w0mPS@MceCpVX=)N^ZioSrG6CT(x&Yl z-JG56%#R*V>Ohh-9)A!BgX<+{@&@{l$L<#=|mho$U9DqA!%pxkI5i}B)gHxPyLD_?@=~xj?o|rFaM6um;$IA%v^D zxS*eztLP9;L63~m;(G*~#wc}!)N}g}Mx%Ci%;a0(GvR`G9}S!i1@G2Gc*ipWWpREQ zPOw_q_&lCeBlD%WhN%v=$V(-{SxrcSkMd1^Qb3(_VQ2R-RV9)$>>7m2%4ar~- zyhau@xEJ+7Pk7HtN#W~hx0G$0RoPEl;wGW=&`x7#_|qqDvYKB%92X2WMQ{qqv}UoH zEj0kCS@#9gp4BsleuY`WGd~AIEH;!C_}L7ntoX>D+|)f*r`T$uB_qc~2w^_fU znENemqiIF9gnugh4#pOMCD{f6!-pO&a5KH$*>8)euFbD&=LX1lggI_ zMy%@F#z=d{?2nVK5H=e6Y_$$cYZJ63^6f1XH}(dzdZ-1*SS-pqLq z#I+(Cy;kk|L68wS=2y{Orm$HW(EVfU;~>e9WbrYlzAyndhIbMbDf_3rfQTf;IG!xn zD{Ab6ZJ$lm_07Ev9Mnw)R^vSxYCEYm-@#|Xlf~d7m|wY#GqPEAhUCAY=<^i8VF+Dt z9j|L=NsKOE{?x(hus9si6lO++gK?qL*3`aWgP02idxG36C$To5Brp*O5#1g_B{l6^ z^G+2~yf)=p8reoa7LuI~S(Tmqu@Y3Iv=jcaA<8;prSSSADJT;lrMD^rt z?#gyMo@~%8Pd}29#lO2c$ws>Qr@OmIbVP(eg)uY({ub%+n~g~lQ{$3hCYj5i3;Fv? z8Akcf_v%PDY5>^)L;PpxV=MK02BPiDvcj||oekUOm&57sK?(jF(=(OMcbSa1E19vf zW6j-}T;rc7HiNechF1{!sXtQqR-@8>U{nv$u9Vp1-w^nN36=?h>hN(Ur?yhmk5LAD4RPVrmFQyLbWvC`%WKZL1T2X>&iTokDopC-xAjq1fQQKN88TcE#$(M4aw&n+IcUI zrHJ=n10^F?i!pv-$+aWd(7F0P7v>Vt+!xqouwn32A%@ps9!nqaHudrv#Nc;gv5yTG za~H?`2?br)gWx!MSq0Jics@BP^G&_5?!Rns!S6?X7wgG_?9ZK+$`##bHkSh+DUtmwSQd@DjJ&AJWLA+kjl7V7y(xa`T7>zv8= z_f!V6h{7s?B;uE*a`&_N!)nz9>S_|cbl|&3NW0?*^oDMMtSBO{$x`EG6xagUeZteH zdIZbh1~DCtK@R(slD*+1xoROq@rAOVBD%g@AC|YCwUH_o5V-c^mHXjB%BLfmSYYv&>!&IWuu`?C@B>4IqxcDW)6n_$i06S~jI z{R)KhD!*%fUf$Uff#VTeQ4!5jKEUsOIE7sB{XJXq?1t03&_THf#6Fcxv@7!*dJiHc0J-;gSW>2$e?YwNjMs9js>bKjj z*;Tj6<$MI3?C)my>3_Ns5{^4jB!kdb+ydz7tu0h)W%)tRBcPNEPJ<)t;?$SpdMNq~ ze%mKEUin@KH<{D4CZO8$wck*EeY}^*tfVgrHU_%$;{>-^qHO!gZC~yZ$;c@*@;Jcl z0>-5qN==AuM~amjZ1VXtb;=(C&XuhazN{Z9DX}SVDw(Ru>UrPYajM)1HC^NEXYC{1 zB*z(o^S7e6T1^BJ2&}s~D9idv19?`zfleEvwNks5rUBI!G1#4O`c}!CG@Vz!nm0T& zlfq>uphsfrz(dDoi)ZavLZY4&&bz5Ip;?dF!`sC{zv}N?Im|iWdOtu79x5fYaMabz zXm5_mWM0ROu|@aogu6vbPc#<#9*uMfhLR7<0)9gc#|Tn&FRVqfH9HU{3kgQ+D6-$` zVUL0dsO^Ewxlq5-zUP*9jVYs*o?5hRlLt%5a48ap!xlBNb-1T?pR?IjFz%c~Dd&+y$Y(k& z-&5cvPMVH#Sk5S&yi(1-kp0J2U5FT(7bneaix`#i2w zG^6~XC&zl3(|9EaNNe^L23OtF-u!j?y~c@IFMxr6?2;KP_77!SvfOMEQoc-9n@~37 z5(ViJtL-r8C!$?|NQtO-Qw zV$IUqv_Q8)SlKdx*XF3gEFW42Q*#Dx+EXBP?6VfNu-(b@Ad^u%lvN-On<@0gPfH}x zg=rie)*$&Oxb)g^85B;xuNOCY{mi1N$FudwyLhP)T=xODtG%`DtB*h~W=F@x3>(fc zQq9ti$=-VzbTuT+PvoSOo*h!Yi zrVXp&Du)euU3=%IJP0f%E;B(xf)=Sx$MiA=2zVO-b>I9Rx54hTJsKSL0#zHOn2 zzGn`F_(T6SL8(nhHcw}vU6$Il=DDA0k+~R}m9`g@ki}~Wf#A@1OEnvQ4Xf+slg;*8 zz#>_lXY4QZ-DThtGg5+|GlGYO?q-SW-N4!U+qrF3(=bV}It$)?ybk#m7PP>jEn0y! zzKeMp7(~{tyuKuwBTlqvR%XaN2&>lfx``!=+n8%&dbrZzHgU% zSvV2ZhBvFeOrD#ip*84w5zWXt9^iMJM*Yw|q-MhpsmNgE@IxQ(guVth7+>|OS3?-R zUs+l8y0l4orNqDhWMAd?8wpk>tYlgSm3AYQJid*~iH*v8R7nKzJ3%8!LKq)|UCW;O zNNP)Y{#x(36)$tKJ_PI=fbHqM%6eVt(n^B5T-~w@nb9R=adX10{3|KTe6jIOOq#; zo%}A7^h0}2qoc2z&5-(%>f|f}e%L8vL4|g1n(YCOw+c99KwBdHe6u^e&Z4PY8l)`3 z#x(ht-nkXFx^HaF;PQ%QQ4r8jnK`F3rL|Vm0I{vg9-KpD$wWEvu|%1p2&caTq34rS zklk4OqCX~d_1K*O5vt^ertph+rA+N^%n?-o^drfg!gPnv>NKgjvSZ1Qoyd3a2-Kai zGFe^+I8$l-O?vLP8TG-OWUDLy2h2+wB!5toyh!AIOK^;WO&(GV0(Y>klLK z5O?fQI4s@4@o;V}N@U0U*%{8VL+7#{iwT^+WdCwtxjye}bERHCm_1=pn7Ki;>=YWT(>G+UZh8sATW_y;Nh!>lDHtX}_%@di0ar!dD=6SJEE?>UJ>i+D11iMww}cPa|M@>Of4{CH(T4Yy0slq93+&Xl%}PT;4AVxj zCOo2TseAuN_HmM4+laMFS|}jAB$TG#wA`{lhs?3xXQyI0tVB}<$Q%9_ujPMUQQ^#& zk3!5ZT!~K(O>f;+o9}d97OJea4}7xS*SmBM6P)Y*^Ig)IHOLxUmv4H+9OW^vedf(E z?LCEa@x4+#Q9sB7P}e3X|M%+MGJrFDei5z8>v44J6P+m33l7;1#cuO|FZtJK6eECz z!6JJyS79U4s@oWUC&mrUKK8$D*HQd8NQqfM4SlqBqrTBlW(TkHNh2BG@S;=h^j-zNa-N(VHn%n$5zDwo26!#`SX5(0;c6u>+yRH5~ zye`cSNF~L?g^iupJ;vo)>`u=NG{aS4_%PRN^89PE-RrrFYq4?a%$e~H8D46q3!9Es zDr5YRU9lt2A>-qTkVDmrLA(nF;nH+n^!1u=((rRLX#%6^^0D@C(hniSYlk zn*Ux_p$#DSE2CkSvL}(F++byYEwlt$LmI8Y(7w4)o zheVrct45tN>#KYthU3bL?)Pak5qZN3|I>Ba4>o}k+`(V9s+=;aD=1^5 ze{R#4gF)~8z}$Ovb+m)jK%GTfi1 z339yuE5gL!J(6iURj1#Iky(Se&W<{nl9M0vtSC(c*(WcfT(-e>?$L)d?7j=$%G_LT zPz_yv876wQh+6K<9?QITP3}^|*JqqtdBU`%AQnl}yQ26!a`~?XIB(32nj_!D% zo7up7jeNOrTcF`Q8b3cf$oFbyJ?py{T3*O?KGdgV4^!uXIUMTgVSk5x`|@%mHG);c z%;jTTXX4KCQYyu9x>sH-oAzMpAfa40bQ3_+U-0?2Yo85!5YeInolZJWT`b9VvYty< zMFW=Du->s8C6Qy0l%a$BNKc7_&u%?)a5S@3{gEVqHUHUg|K3ZufK&qg9xui+wO&TQ z$g_=lTeUtYOh+))Adg&9I{}R&0(b9B_Y+9v>gGZ%A4ebJ;~O1SB+qAhCiu`c?E|={@X6r<1jjB(Ca?*I z&VildRoOPC7M%^p4X}6KlPH?4Uu149PEzu2>=D2m>%ZUpDDTl%GK2Ebj zn0jiuf}X1;E;oXPc@EBtk*?&2>llP>#s0C??9pQ2Yc}%qVww(BulTY|%udx^Q#Hoi zU?oz#PP8&5YT9OZhe`-->b_IQl=`0bs03V-xt;1QhSz-9ykU0Pw5E<9w~$yUdm*Ma zl90xcc?z=G=_&g29ir{p@a$VuQ8VY?K@|*DQXK#+^qYyTiHZlz7Ra`84%mDb-n`6P zLALzolYvA#_RU=zg|!#0#(rhkO-=fW`R%F{++k7MdV|vzpJFMw8&mV(3_ipJX3TUZjcV@X>`4d1lmJGwdT;nuP@q9AN4y&t{AIiC85f`gM0 za{TvfhIwSPc=VR?bbqjMG=0`&HVT~5A0kv~PR?@u&<21wv#1%UB;R7O9ll}s0ihR> z+sZunhriB110?(PM@DRwkiQRJs1i^=I`ng!ibdC4LFjh%8iO`Z!BBOo&Jd^t&fG2a z&OYLwcia}c%L3-V#?+NJK2MIBcmK~u0X|v-WkR65mG|MZDG~Gmy118i#V^k%dUn!m z-?#={Th5kmE)C_F4r9`Y(nWi%R$A4EF=>0RP*o zHrephodwmM$orKr?OsmSLM|4WiD8}K6mgXy{w%yMhx+xO_*5%*41$}^mugMnE2wvl z8TTdeRGsx!#sx2xWCA@XRW1Jzt2s>AzKkz$tpk0d*2|hF+<{c4DI|`v^Q^jCW6H9p zoSBkC54xixoUl#kqb#f1h9kD70y@?YBTKR2F}2vQN9AX%oNy=$u{Ao3;nEsQ~l*`ZmuqC{eeb$-73+G$Y(&?r^$-WPV*{wH7PqvrX?s zs?3V#0pykPMbOUNIB#k4b(`f*2!58COXv}S$-OXr1;@wU{yYrcckhU*q(nb`fw<=x zmi?8)q1U1R^$#vnfd=Aab?vU9oKHu9Uk%gWEf~e7H#76ktfN)Ir(g1{rc)LLx>508 zJz0Ncq@+b^+);%O*U>ZCItJmq7Vm$Ye{5lQrNT+e#o8^I5|f?~oi9PrWtmQ&WS9QE zmh)%TF53MYufjQiL@5f-lcv1(&?K;^}3TEYDj1)WU|~QdYBpj&3Sp zqYW_%rPABd_C+K`z9roW3M|Mq*RoX_BA#>jY}RGFxC~Cksxu|?Xt+8~EGBWX!xx!Z zbqqXoK3JCB^Ys{(=d{}YWuFsMf*(%I_9n=Oie@{Z0yf<4p~jVA9lt-sVe%&`cch;A z52YNJYMvuQs&<^1pXHX{uS}VLKl2Xmxi?0y;|`sN^R$>^{y(_ouM-B?csd6ThsFe8 z413#(2}kdW9SJ^mIIZ+P>3LTxFgOYkI0|nPm|YD@+i5WU!?q;`50nFz&j6jV>EfJP z;7Q`tjElbJP>sE~K3OGgs378}Rgfjxf0XiHZ~S#qfV)DrJkWcYcn58Ryzkh;PbTPr zQWH1vQk=v!EXm=&X>2ESqgw;p=jsPC}GYW~M$4-tAx_t%Ly zb1e55Xq>RvmG3VQibiDo$66{jL&nXN$uO;aNT^yU2IBO$Y^jY?%@+YFH-#Dv1=+=3 z-7PlVTEtea>uSJ88|qCgbvxIEp9Y+{|D%v|AZPN+kt4rEz$SPA%dzPd3NJDg<%q75 z{+iV@mGc^BeT>t)I%-1&;@&BK<^G}Fdyy~*PzxYv%R&8MUcj(1n@vpM55Yx{6 zjqWc>47l{9+EBFsrTSll`u};&PCx%aPC!v_b---PPCnp!SW7%r$r%-`bTvT1fZwaLmtZoPPw-t+Mq-v-p-Q z7Bye4um(pmPbM8FV&{2b+Cy~Z?@lW9x6?v<+@vKBBE5AzfEAp{B3MIpImEV zq&eLLv@2WPz25%JX4a^2I+#jv#V>StERjh6_V72amRv{W;9Qk-9iRPz<&F}m!zn6@l=-hX}{sag7L@wG@o7S59m zma>fr|H5vx$o7iHoe>52sb5pZ)wQm7Xgj5>LMQ0+e^hcJYK5aVsP%XW8&lRgPilgGS1s+Ne*p!)5NI<#9@@)2CW~&4glggY6@( z_^RsP$Bm~Ct7iEsb}@7#LXzNif& ze6;Y4con3pL4F-y;#%f&sA=4OeS*P!YXjqtCcYN)P@rNQ>68$UbET6Iu(PsH$+nnB zo>r^Xob{LW?B4~r2E6Cxv6|H2ys&vHrS(tYP(_%(zx>i@b69>j^v%$;uWwQFxjlLC zeJxQhRO(K>o@L6&N{kO1fr&U#yNvX! znhdc;gfpTudbtyROgX)#J$<|j-s)cu{j>Pm5arHD=Y^xZ$gb!R$B7!-j#<2FkC$`h zd7BQI>Da%GAjmg@Ixxm>sc-dwlG3zlp3$kLqdkgClNPg9+V1r|X|wb+YAq+JtE~$1 z@-%w6y7!uh^#$dOdM!6W-K&KvNg}zA&q5VI^ z?=&&#{$)`p>Vwnhp)PdwdbuV#jh;(7yK_Tr13wFhX-1p$1)Z|zXkHlEo-Lc;-&ny;3Y7G zfidMT^oTWY%qZgF?`COBE?(ub!Ao7HgQ+&x`0m0Ndg(^MG-N9NL7Y-Bz=Sb`n*?632)Px2NXYNh~TJtv1`-)iTDUi>5@ zl-5ZWqqFdEqw1((xyKe4d;=G*$vXR{8Rx3|vnPU$+bE3pZ#r10h}dtjuT&{Xqa@vQ zpn;_?M%l;c#RVsATxzAI#D1=#YTrj+vMDAcOD$DNFtCeO_+PWjHh<%S(p>p12f6Wy zn5I!Sr3&+qaNOd!dB1qaSJ!*=dE)m>$#~6ls-TZ%+Y$22?Lw2SiuAqoet2u~#L*cx zL5`T^Yz2?$iGwoBw03iKgq%nEY86L0D&^sn;1HP}E~Rzb*NvOpz0OzZ+w`zadHmoe zqGtnWU%N6sVp(0We~q1n`0F*y&JXKP#;w(#pd zb=7yS%GN}>F>GjTrD+>9Ah$pqzYAKqD&095ZCOfV8yb*RdIJ}oVwegX8yYCb@TWk-Ss+87R3}56W)YOEj&`qye4RP(bc@5?5+AiqpNFZuYdSzN#^`F`gqP mCp24mDwTf*(Y3iRAG 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 literal 0 HcmV?d00001 diff --git a/docs/guide/images/ding/webhook.png b/docs/guide/images/ding/webhook.png new file mode 100644 index 0000000000000000000000000000000000000000..c957e72f925e1490afdfabf2af7b0aecfaeb3252 GIT binary patch literal 102603 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%0DQ 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 literal 0 HcmV?d00001 diff --git a/packages/nonebot-adapter-ding/nonebot/adapters/ding/bot.py b/packages/nonebot-adapter-ding/nonebot/adapters/ding/bot.py index cfe73fde..db2e77d3 100644 --- a/packages/nonebot-adapter-ding/nonebot/adapters/ding/bot.py +++ b/packages/nonebot-adapter-ding/nonebot/adapters/ding/bot.py @@ -1,6 +1,9 @@ import hmac import base64 +import urllib.parse + from datetime import datetime +import time from typing import Any, Union, Optional, TYPE_CHECKING import httpx @@ -10,7 +13,7 @@ from nonebot.message import handle_event from nonebot.adapters import Bot as BaseBot from nonebot.exception import RequestDenied -from .utils import log +from .utils import calc_hmac_base64, log from .config import Config as DingConfig from .message import Message, MessageSegment from .exception import NetworkError, ApiNotAvailable, ActionFailed, SessionExpired @@ -20,7 +23,7 @@ if TYPE_CHECKING: from nonebot.config import Config from nonebot.drivers import Driver -SEND_BY_SESSION_WEBHOOK = "send_by_sessionWebhook" +SEND = "send" class Bot(BaseBot): @@ -72,10 +75,8 @@ class Bot(BaseBot): if not sign: log("WARNING", "Missing Signature Header") raise RequestDenied(400, "Missing `sign` Header") - string_to_sign = f"{timestamp}\n{secret}" - sig = hmac.new(secret.encode("utf-8"), - string_to_sign.encode("utf-8"), "sha256").digest() - if sign != base64.b64encode(sig).decode("utf-8"): + sign_base64 = calc_hmac_base64(str(timestamp), secret) + if sign != sign_base64.decode('utf-8'): log("WARNING", "Signature Header is invalid") raise RequestDenied(403, "Signature is invalid") else: @@ -142,49 +143,63 @@ class Bot(BaseBot): return await bot.call_api(api, **data) log("DEBUG", f"Calling API {api}") + params = {} + # 传入参数有 webhook,则使用传入的 webhook + webhook = data.get("webhook") - if api == SEND_BY_SESSION_WEBHOOK: + if webhook: + secret = data.get("secret") + if secret: + # 有这个参数的时候再计算加签的值 + timestamp = str(round(time.time() * 1000)) + params["timestamp"] = timestamp + hmac_code_base64 = calc_hmac_base64(timestamp, secret) + sign = urllib.parse.quote_plus(hmac_code_base64) + params["sign"] = sign + else: + # webhook 不存在则使用 event 中的 sessionWebhook if event: # 确保 sessionWebhook 没有过期 if int(datetime.now().timestamp()) > int( event.sessionWebhookExpiredTime / 1000): raise SessionExpired - target = event.sessionWebhook + webhook = event.sessionWebhook else: raise ApiNotAvailable - headers = {} - message: Message = data.get("message", None) - if not message: - raise ValueError("Message not found") - try: - async with httpx.AsyncClient(headers=headers) as client: - response = await client.post( - target, - params={"access_token": self.ding_config.access_token}, - json=message._produce(), - timeout=self.config.api_timeout) + headers = {} + message: Message = data.get("message", None) + if not message: + raise ValueError("Message not found") + try: + async with httpx.AsyncClient(headers=headers) as client: + response = await client.post(webhook, + params=params, + json=message._produce(), + timeout=self.config.api_timeout) - if 200 <= response.status_code < 300: - result = response.json() - if isinstance(result, dict): - if result.get("errcode") != 0: - raise ActionFailed(errcode=result.get("errcode"), - errmsg=result.get("errmsg")) - return result - raise NetworkError(f"HTTP request received unexpected " - f"status code: {response.status_code}") - except httpx.InvalidURL: - raise NetworkError("API root url invalid") - except httpx.HTTPError: - raise NetworkError("HTTP request failed") + if 200 <= response.status_code < 300: + result = response.json() + if isinstance(result, dict): + if result.get("errcode") != 0: + raise ActionFailed(errcode=result.get("errcode"), + errmsg=result.get("errmsg")) + return result + raise NetworkError(f"HTTP request received unexpected " + f"status code: {response.status_code}") + except httpx.InvalidURL: + raise NetworkError("API root url invalid") + except httpx.HTTPError: + raise NetworkError("HTTP request failed") @overrides(BaseBot) async def send(self, event: MessageEvent, message: Union[str, "Message", "MessageSegment"], at_sender: bool = False, + webhook: Optional[str] = None, + secret: Optional[str] = None, **kwargs) -> Any: """ :说明: @@ -196,6 +211,8 @@ class Bot(BaseBot): * ``event: Event``: Event 对象 * ``message: Union[str, Message, MessageSegment]``: 要发送的消息 * ``at_sender: bool``: 是否 @ 事件主体 + * ``webhook: Optional[str]``: 该条消息将调用的 webhook 地址。不传则将使用 sessionWebhook,若其也不存在,该条消息不发送,使用自定义 webhook 时注意你设置的安全方式,如加关键词,IP地址,加签等等。 + * ``secret: Optional[str]``: 如果你使用自定义的 webhook 地址,推荐使用加签方式对消息进行验证,将 `机器人安全设置页面,加签一栏下面显示的SEC开头的字符串` 传入这个参数即可。 * ``**kwargs``: 覆盖默认参数 :返回: @@ -213,6 +230,9 @@ class Bot(BaseBot): at_sender = at_sender and bool(event.senderId) params = {} params["event"] = event + if webhook: + params["webhook"] = webhook + params["secret"] = secret params.update(kwargs) if at_sender and event.conversationType != ConversationType.private: @@ -222,4 +242,4 @@ class Bot(BaseBot): else: params["message"] = msg - return await self.call_api(SEND_BY_SESSION_WEBHOOK, **params) + return await self.call_api(SEND, **params) diff --git a/packages/nonebot-adapter-ding/nonebot/adapters/ding/utils.py b/packages/nonebot-adapter-ding/nonebot/adapters/ding/utils.py index eb4145bc..13be81d0 100644 --- a/packages/nonebot-adapter-ding/nonebot/adapters/ding/utils.py +++ b/packages/nonebot-adapter-ding/nonebot/adapters/ding/utils.py @@ -1,3 +1,15 @@ +import hmac from nonebot.utils import logger_wrapper - +import hashlib +import base64 log = logger_wrapper("DING") + + +def calc_hmac_base64(timestamp: str, secret: str): + secret_enc = secret.encode('utf-8') + string_to_sign = '{}\n{}'.format(timestamp, secret) + string_to_sign_enc = string_to_sign.encode('utf-8') + hmac_code = hmac.new(secret_enc, + string_to_sign_enc, + digestmod=hashlib.sha256).digest() + return base64.b64encode(hmac_code) diff --git a/tests/test_plugins/test_ding.py b/tests/test_plugins/test_ding.py index 96c905d5..ad9b8d4c 100644 --- a/tests/test_plugins/test_ding.py +++ b/tests/test_plugins/test_ding.py @@ -3,6 +3,30 @@ from nonebot.rule import to_me from nonebot.plugin import on_command from nonebot.adapters.ding import Bot as DingBot, MessageSegment, MessageEvent +helper = on_command("ding_helper", to_me()) + + +@helper.handle() +async def ding_helper(bot: DingBot, event: MessageEvent): + message = MessageSegment.markdown( + "Hello, This is NoneBot", + """帮助信息如下:\n +[ding_helper](dtmd://dingtalkclient/sendMessage?content=ding_helper) 查看帮助\n +[markdown](dtmd://dingtalkclient/sendMessage?content=markdown) 发送 markdown\n +[actionCardSingleBtn](dtmd://dingtalkclient/sendMessage?content=actionCardSingleBtn)\n +[actionCard](dtmd://dingtalkclient/sendMessage?content=actionCard)\n +[feedCard](dtmd://dingtalkclient/sendMessage?content=feedCard)\n +[atme](dtmd://dingtalkclient/sendMessage?content=atme)\n +[image](dtmd://dingtalkclient/sendMessage?content=image)\n +[t](dtmd://dingtalkclient/sendMessage?content=t)\n +[code](dtmd://dingtalkclient/sendMessage?content=code) 发送代码\n +[test_message](dtmd://dingtalkclient/sendMessage?content=test_message)\n +[hello](dtmd://dingtalkclient/sendMessage?content=hello)\n +[webhook](dtmd://dingtalkclient/sendMessage?content=webhook)""", + ) + await markdown.finish(message) + + markdown = on_command("markdown", to_me()) @@ -184,3 +208,30 @@ async def hello_handler(bot: DingBot, event: MessageEvent): message = MessageSegment.text(f"@{event.senderId},你好") message += MessageSegment.atDingtalkIds(event.senderId) await hello.finish(message) + + +hello = on_command("webhook", to_me()) + + +@hello.handle() +async def webhook_handler(bot: DingBot, event: MessageEvent): + print(event) + message = MessageSegment.raw({ + "msgtype": "text", + "text": { + "content": 'hello from webhook,一定要注意安全方式的鉴权哦,否则可能发送失败的' + }, + }) + message += MessageSegment.atDingtalkIds(event.senderId) + await hello.send( + message, + webhook= + "https://oapi.dingtalk.com/robot/send?access_token=XXXXXXXXXXXXXX", + secret="SECXXXXXXXXXXXXXXXXXXXXXXXXX") + + message = MessageSegment.text("TEST 123123 S") + await hello.send( + message, + webhook= + "https://oapi.dingtalk.com/robot/send?access_token=XXXXXXXXXXXXXX", + ) From bb64c6fb711989628c23c3913a5a4310d4548a88 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Fri, 12 Mar 2021 16:28:56 +0800 Subject: [PATCH 03/40] :bug: fix type and permission updater --- nonebot/matcher.py | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/nonebot/matcher.py b/nonebot/matcher.py index 942d4a2c..baa4a768 100644 --- a/nonebot/matcher.py +++ b/nonebot/matcher.py @@ -108,12 +108,12 @@ class Matcher(metaclass=MatcherMeta): """ _default_type_updater: Optional[T_TypeUpdater] = None """ - :类型: ``Optional[T_ArgsParser]`` + :类型: ``Optional[T_TypeUpdater]`` :说明: 事件响应器类型更新函数 """ _default_permission_updater: Optional[T_PermissionUpdater] = None """ - :类型: ``Optional[T_ArgsParser]`` + :类型: ``Optional[T_PermissionUpdater]`` :说明: 事件响应器权限更新函数 """ @@ -587,16 +587,18 @@ class Matcher(metaclass=MatcherMeta): except RejectedException: self.handlers.insert(0, handler) # type: ignore - if self._default_type_updater: - type_ = await self._default_type_updater( - bot, event, state, self.type) + updater = self.__class__._default_type_updater + if updater: + type_ = await updater(bot, event, state, self.type) else: type_ = "message" - if self._default_permission_updater: - permission = await self._default_permission_updater( - bot, event, state, self.permission) + + updater = self.__class__._default_permission_updater + if updater: + permission = await updater(bot, event, state, self.permission) else: permission = USER(event.get_session_id(), perm=self.permission) + Matcher.new(type_, Rule(), permission, @@ -609,16 +611,18 @@ class Matcher(metaclass=MatcherMeta): expire_time=datetime.now() + bot.config.session_expire_timeout) except PausedException: - if self._default_type_updater: - type_ = await self._default_type_updater( - bot, event, state, self.type) + updater = self.__class__._default_type_updater + if updater: + type_ = await updater(bot, event, state, self.type) else: type_ = "message" - if self._default_permission_updater: - permission = await self._default_permission_updater( - bot, event, state, self.permission) + + updater = self.__class__._default_permission_updater + if updater: + permission = await updater(bot, event, state, self.permission) else: permission = USER(event.get_session_id(), perm=self.permission) + Matcher.new(type_, Rule(), permission, From 785eac1345a98aea25cabe975250329f938cb944 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sat, 13 Mar 2021 15:35:13 +0800 Subject: [PATCH 04/40] :label: fix regex rule typing error --- nonebot/plugin/__init__.py | 2 +- nonebot/plugin/__init__.pyi | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/nonebot/plugin/__init__.py b/nonebot/plugin/__init__.py index b9ed77ed..bd9fec3d 100644 --- a/nonebot/plugin/__init__.py +++ b/nonebot/plugin/__init__.py @@ -489,7 +489,7 @@ def on_shell_command(cmd: Union[str, Tuple[str, ...]], def on_regex(pattern: str, flags: Union[int, re.RegexFlag] = 0, - rule: Optional[Rule] = None, + rule: Optional[Union[Rule, T_RuleChecker]] = None, **kwargs) -> Type[Matcher]: """ :说明: diff --git a/nonebot/plugin/__init__.pyi b/nonebot/plugin/__init__.pyi index 02cc6b96..d99e96e1 100644 --- a/nonebot/plugin/__init__.pyi +++ b/nonebot/plugin/__init__.pyi @@ -156,7 +156,7 @@ def on_shell_command(cmd: Union[str, Tuple[str, ...]], def on_regex(pattern: str, flags: Union[int, re.RegexFlag] = 0, - rule: Optional[Rule] = ..., + rule: Optional[Union[Rule, T_RuleChecker]] = ..., *, permission: Optional[Permission] = ..., handlers: Optional[List[T_Handler]] = ..., @@ -409,7 +409,7 @@ class MatcherGroup: pattern: str, flags: Union[int, re.RegexFlag] = 0, *, - rule: Optional[Rule] = ..., + rule: Optional[Union[Rule, T_RuleChecker]] = ..., permission: Optional[Permission] = ..., handlers: Optional[List[T_Handler]] = ..., temp: bool = ..., From 211c571508824f17ba0221c7c953c4eea6931c00 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sat, 13 Mar 2021 18:21:56 +0800 Subject: [PATCH 05/40] :bug: fix reimport by require --- nonebot/plugin/manager.py | 22 +++++++- poetry.lock | 112 ++++++++++++++++++++++++++++++++++---- pyproject.toml | 3 +- 3 files changed, 123 insertions(+), 14 deletions(-) diff --git a/nonebot/plugin/manager.py b/nonebot/plugin/manager.py index 5965d02b..40426b7f 100644 --- a/nonebot/plugin/manager.py +++ b/nonebot/plugin/manager.py @@ -6,7 +6,7 @@ from hashlib import md5 from types import ModuleType from collections import Counter from importlib.abc import MetaPathFinder -from importlib.machinery import PathFinder +from importlib.machinery import PathFinder, SourceFileLoader from typing import Set, List, Optional, Iterable _internal_space = ModuleType(__name__ + "._internal") @@ -142,6 +142,7 @@ class PluginManager: if "." in name: raise ValueError("Plugin name cannot contain '.'") + with self: return importlib.import_module(f"{self.namespace}.{name}") @@ -173,9 +174,28 @@ class PluginFinder(MetaPathFinder): list(manager.search_path), target) if spec: + spec.loader = PluginLoader(newname, spec.origin) return spec index -= 1 return None +class PluginLoader(SourceFileLoader): + + def __init__(self, fullname: str, path) -> None: + self.loaded = False + super().__init__(fullname, path) + + def create_module(self, spec) -> Optional[ModuleType]: + if self.name in sys.modules: + self.loaded = True + return sys.modules[self.name] + return super().create_module(spec) + + def exec_module(self, module: ModuleType) -> None: + if self.loaded: + return + return super().exec_module(module) + + sys.meta_path.insert(0, PluginFinder()) diff --git a/poetry.lock b/poetry.lock index 73598b33..d33bbbc2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3,7 +3,7 @@ name = "aiofiles" version = "0.6.0" description = "File support for asyncio." category = "main" -optional = true +optional = false python-versions = "*" [package.source] @@ -389,7 +389,7 @@ reference = "aliyun" [[package]] name = "nonebot-adapter-cqhttp" -version = "2.0.0-alpha.11" +version = "2.0.0a11.post2" description = "OneBot(CQHTTP) adapter for nonebot2" category = "dev" optional = false @@ -406,7 +406,7 @@ url = "packages/nonebot-adapter-cqhttp" [[package]] name = "nonebot-adapter-ding" -version = "2.0.0-alpha.11" +version = "2.0.0a11.post2" description = "Ding adapter for nonebot2" category = "dev" optional = false @@ -423,7 +423,7 @@ url = "packages/nonebot-adapter-ding" [[package]] name = "nonebot-adapter-mirai" -version = "2.0.0-alpha.11" +version = "2.0.0a11.post2" description = "Mirai Api HTTP adapter for nonebot2" category = "dev" optional = false @@ -439,6 +439,24 @@ websockets = "^8.1" type = "directory" url = "packages/nonebot-adapter-mirai" +[[package]] +name = "nonebot-plugin-test" +version = "0.2.0" +description = "Test frontend for nonebot v2+" +category = "dev" +optional = false +python-versions = ">=3.7,<4.0" + +[package.dependencies] +aiofiles = ">=0.6.0,<0.7.0" +nonebot2 = ">=2.0.0-alpha.9,<3.0.0" +python-socketio = ">=4.6.1,<5.0.0" + +[package.source] +type = "legacy" +url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" + [[package]] name = "packaging" version = "20.9" @@ -507,7 +525,7 @@ reference = "aliyun" [[package]] name = "pygments" -version = "2.8.0" +version = "2.8.1" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false @@ -560,6 +578,47 @@ type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" reference = "aliyun" +[[package]] +name = "python-engineio" +version = "3.14.2" +description = "Engine.IO server" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +six = ">=1.9.0" + +[package.extras] +asyncio_client = ["aiohttp (>=3.4)"] +client = ["requests (>=2.21.0)", "websocket-client (>=0.54.0)"] + +[package.source] +type = "legacy" +url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" + +[[package]] +name = "python-socketio" +version = "4.6.1" +description = "Socket.IO server" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +python-engineio = ">=3.13.0,<4" +six = ">=1.9.0" + +[package.extras] +asyncio_client = ["aiohttp (>=3.4)", "websockets (>=7.0)"] +client = ["requests (>=2.21.0)", "websocket-client (>=0.54.0)"] + +[package.source] +type = "legacy" +url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" + [[package]] name = "pytz" version = "2021.1" @@ -655,6 +714,19 @@ type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" reference = "aliyun" +[[package]] +name = "six" +version = "1.15.0" +description = "Python 2 and 3 compatibility utilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[package.source] +type = "legacy" +url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" + [[package]] name = "sniffio" version = "1.2.0" @@ -683,7 +755,7 @@ reference = "aliyun" [[package]] name = "sphinx" -version = "3.5.1" +version = "3.5.2" description = "Python documentation generator" category = "dev" optional = false @@ -735,7 +807,7 @@ yapf = "*" [package.source] type = "git" -url = "https://github.com/nonebot/sphinx-markdown-builder.git" +url = "git@github.com:nonebot/sphinx-markdown-builder.git" reference = "master" resolved_reference = "fdbc39e1b50aabf8dbcf129895fbbd02cbf54554" @@ -1083,7 +1155,7 @@ quart = ["Quart"] [metadata] lock-version = "1.1" python-versions = "^3.7.3" -content-hash = "f4e49d25ac5c37b3c7527935b52acf5d0d6d0261a645f4247120f9e28c5ca282" +content-hash = "51c469a7330ef3dc06805b771670f2c1526ebfc6e50d7c22571ae3ffc7b0f352" [metadata.files] aiofiles = [ @@ -1248,6 +1320,10 @@ markupsafe = [ nonebot-adapter-cqhttp = [] nonebot-adapter-ding = [] nonebot-adapter-mirai = [] +nonebot-plugin-test = [ + {file = "nonebot-plugin-test-0.2.0.tar.gz", hash = "sha256:c9ee997c5c96160de4af02d10a7c6301b3fc4e942df7e70906df0534606ea23b"}, + {file = "nonebot_plugin_test-0.2.0-py3-none-any.whl", hash = "sha256:75cd18cc282815a03250bb86c7d2a8d6a66a5064ac335bedc9a3e268a1e7dd13"}, +] packaging = [ {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, @@ -1285,8 +1361,8 @@ pydash = [ {file = "pydash-4.9.3.tar.gz", hash = "sha256:d709e57b537b1aaf118f188da3ec6242a665090ecd7839b66f857ee3dc2bb006"}, ] pygments = [ - {file = "Pygments-2.8.0-py3-none-any.whl", hash = "sha256:b21b072d0ccdf29297a82a2363359d99623597b8a265b8081760e4d0f7153c88"}, - {file = "Pygments-2.8.0.tar.gz", hash = "sha256:37a13ba168a02ac54cc5891a42b1caec333e59b66addb7fa633ea8a6d73445c0"}, + {file = "Pygments-2.8.1-py3-none-any.whl", hash = "sha256:534ef71d539ae97d4c3a4cf7d6f110f214b0e687e92f9cb9d2a3b0d3101289c8"}, + {file = "Pygments-2.8.1.tar.gz", hash = "sha256:2656e1a6edcdabf4275f9a3640db59fd5de107d88e8663c5d4e9a0fa62f77f94"}, ] pygtrie = [ {file = "pygtrie-2.4.2.tar.gz", hash = "sha256:43205559d28863358dbbf25045029f58e2ab357317a59b11f11ade278ac64692"}, @@ -1299,6 +1375,14 @@ python-dotenv = [ {file = "python-dotenv-0.15.0.tar.gz", hash = "sha256:587825ed60b1711daea4832cf37524dfd404325b7db5e25ebe88c495c9f807a0"}, {file = "python_dotenv-0.15.0-py2.py3-none-any.whl", hash = "sha256:0c8d1b80d1a1e91717ea7d526178e3882732420b03f08afea0406db6402e220e"}, ] +python-engineio = [ + {file = "python-engineio-3.14.2.tar.gz", hash = "sha256:eab4553f2804c1ce97054c8b22cf0d5a9ab23128075248b97e1a5b2f29553085"}, + {file = "python_engineio-3.14.2-py2.py3-none-any.whl", hash = "sha256:5a9e6086d192463b04a1428ff1f85b6ba631bbb19d453b144ffc04f530542b84"}, +] +python-socketio = [ + {file = "python-socketio-4.6.1.tar.gz", hash = "sha256:cd1f5aa492c1eb2be77838e837a495f117e17f686029ebc03d62c09e33f4fa10"}, + {file = "python_socketio-4.6.1-py2.py3-none-any.whl", hash = "sha256:5a21da53fdbdc6bb6c8071f40e13d100e0b279ad997681c2492478e06f370523"}, +] pytz = [ {file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"}, {file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"}, @@ -1338,6 +1422,10 @@ rfc3986 = [ {file = "rfc3986-1.4.0-py2.py3-none-any.whl", hash = "sha256:af9147e9aceda37c91a05f4deb128d4b4b49d6b199775fd2d2927768abdc8f50"}, {file = "rfc3986-1.4.0.tar.gz", hash = "sha256:112398da31a3344dc25dbf477d8df6cb34f9278a94fee2625d89e4514be8bb9d"}, ] +six = [ + {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, + {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, +] sniffio = [ {file = "sniffio-1.2.0-py3-none-any.whl", hash = "sha256:471b71698eac1c2112a40ce2752bb2f4a4814c22a54a3eed3676bc0f5ca9f663"}, {file = "sniffio-1.2.0.tar.gz", hash = "sha256:c4666eecec1d3f50960c6bdf61ab7bc350648da6c126e3cf6898d8cd4ddcd3de"}, @@ -1347,8 +1435,8 @@ snowballstemmer = [ {file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"}, ] sphinx = [ - {file = "Sphinx-3.5.1-py3-none-any.whl", hash = "sha256:e90161222e4d80ce5fc811ace7c6787a226b4f5951545f7f42acf97277bfc35c"}, - {file = "Sphinx-3.5.1.tar.gz", hash = "sha256:11d521e787d9372c289472513d807277caafb1684b33eb4f08f7574c405893a9"}, + {file = "Sphinx-3.5.2-py3-none-any.whl", hash = "sha256:ef64a814576f46ec7de06adf11b433a0d6049be007fefe7fd0d183d28b581fac"}, + {file = "Sphinx-3.5.2.tar.gz", hash = "sha256:672cfcc24b6b69235c97c750cb190a44ecd72696b4452acaf75c2d9cc78ca5ff"}, ] sphinx-markdown-builder = [] sphinxcontrib-applehelp = [ diff --git a/pyproject.toml b/pyproject.toml index 7e64c234..283b7927 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,10 +35,11 @@ uvicorn = { version = "^0.13.0", extras = ["standard"] } [tool.poetry.dev-dependencies] yapf = "^0.30.0" sphinx = "^3.4.1" +nonebot-plugin-test = "^0.2.0" nonebot-adapter-cqhttp = { path = "./packages/nonebot-adapter-cqhttp", develop = true } nonebot-adapter-ding = { path = "./packages/nonebot-adapter-ding", develop = true } nonebot-adapter-mirai = { path = "./packages/nonebot-adapter-mirai", develop = true } -sphinx-markdown-builder = { git = "https://github.com/nonebot/sphinx-markdown-builder.git" } +sphinx-markdown-builder = { git = "git@github.com:nonebot/sphinx-markdown-builder.git" } [tool.poetry.extras] quart = ["quart"] From b31317720b49942c8076d236c25f95cecbd8147b Mon Sep 17 00:00:00 2001 From: StarHeartHunt Date: Sun, 14 Mar 2021 08:49:22 +0800 Subject: [PATCH 06/40] :memo: add tips for separated adapters in 2.0.0a11 docs --- archive/2.0.0a11/guide/cqhttp-guide.md | 6 ++++++ archive/2.0.0a11/guide/ding-guide.md | 6 ++++++ archive/2.0.0a11/guide/installation.md | 14 +++++++++++++- archive/2.0.0a11/guide/mirai-guide.md | 6 ++++++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/archive/2.0.0a11/guide/cqhttp-guide.md b/archive/2.0.0a11/guide/cqhttp-guide.md index 356fa6c3..867eb56f 100644 --- a/archive/2.0.0a11/guide/cqhttp-guide.md +++ b/archive/2.0.0a11/guide/cqhttp-guide.md @@ -1,5 +1,11 @@ # CQHTTP 协议使用指南 +## 安装 NoneBot CQHTTP 适配器 + +```bash +pip install nonebot-adapter-cqhttp +``` + ## 配置 CQHTTP 协议端(以 QQ 为例) 单纯运行 NoneBot 实例并不会产生任何效果,因为此刻 QQ 这边还不知道 NoneBot 的存在,也就无法把消息发送给它,因此现在需要使用一个无头 QQ 来把消息等事件上报给 NoneBot。 diff --git a/archive/2.0.0a11/guide/ding-guide.md b/archive/2.0.0a11/guide/ding-guide.md index ee9449ba..7e1d8d01 100644 --- a/archive/2.0.0a11/guide/ding-guide.md +++ b/archive/2.0.0a11/guide/ding-guide.md @@ -11,6 +11,12 @@ - [群机器人概述](https://developers.dingtalk.com/document/app/overview-of-group-robots) - [开发企业内部机器人](https://developers.dingtalk.com/document/app/develop-enterprise-internal-robots) +## 安装 NoneBot 钉钉 适配器 + +```bash +pip install nonebot-adapter-ding +``` + ## 关于 DingAdapter 的说明 你需要显式的注册 ding 这个适配器: diff --git a/archive/2.0.0a11/guide/installation.md b/archive/2.0.0a11/guide/installation.md index aaf916ec..1c6b5d38 100644 --- a/archive/2.0.0a11/guide/installation.md +++ b/archive/2.0.0a11/guide/installation.md @@ -1,6 +1,6 @@ # 安装 -## NoneBot +## 安装 NoneBot :::warning 注意 请确保你的 Python 版本 >= 3.7。 @@ -67,6 +67,18 @@ poetry install --no-dev # 推荐 pip install . # 不推荐 ``` +## 安装适配器 +适配器可以通过 `nb-cli` 在创建项目时根据你的选择自动安装,也可以自行使用 `pip` 安装 + +```bash +pip install nonebot-adapter- +``` + +```bash +# 列出所有的适配器 +nb adapter list +``` + ## 安装插件 插件可以通过 `nb-cli` 进行安装,也可以自行安装并加载插件。 diff --git a/archive/2.0.0a11/guide/mirai-guide.md b/archive/2.0.0a11/guide/mirai-guide.md index c22631e0..71003e64 100644 --- a/archive/2.0.0a11/guide/mirai-guide.md +++ b/archive/2.0.0a11/guide/mirai-guide.md @@ -28,6 +28,12 @@ Mirai-API-HTTP 的适配器以 [AGPLv3 许可](https://opensource.org/licenses/A **为了便捷起见, 以下内容均以缩写 `MAH` 代替 `mirai-api-http`** +## 安装 NoneBot Mirai 适配器 + +```bash +pip install nonebot-adapter-mirai +``` + ## 配置 MAH 客户端 正如你可能刚刚在[CQHTTP 协议使用指南](./cqhttp-guide.md)中所读到的: From 1e294b8fbed19786425b12b2dd09819f31e9a898 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Tue, 16 Mar 2021 16:17:34 +0800 Subject: [PATCH 07/40] :bug: fix config load due to pydantic breaking change --- .../nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/config.py | 1 + packages/nonebot-adapter-ding/nonebot/adapters/ding/config.py | 1 + packages/nonebot-adapter-mirai/nonebot/adapters/mirai/config.py | 1 + 3 files changed, 3 insertions(+) diff --git a/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/config.py b/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/config.py index 8879705a..1a17f853 100644 --- a/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/config.py +++ b/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/config.py @@ -19,3 +19,4 @@ class Config(BaseModel): class Config: extra = "ignore" + allow_population_by_field_name = True diff --git a/packages/nonebot-adapter-ding/nonebot/adapters/ding/config.py b/packages/nonebot-adapter-ding/nonebot/adapters/ding/config.py index 08e84ee2..405fb2c5 100644 --- a/packages/nonebot-adapter-ding/nonebot/adapters/ding/config.py +++ b/packages/nonebot-adapter-ding/nonebot/adapters/ding/config.py @@ -17,3 +17,4 @@ class Config(BaseModel): class Config: extra = "ignore" + allow_population_by_field_name = True diff --git a/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/config.py b/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/config.py index e1983f45..6783259f 100644 --- a/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/config.py +++ b/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/config.py @@ -20,3 +20,4 @@ class Config(BaseModel): class Config: extra = Extra.ignore + allow_population_by_field_name = True From 62135dc117a580caf0d24d8efab32771935d0b7f Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Tue, 16 Mar 2021 16:20:58 +0800 Subject: [PATCH 08/40] :loud_sound: fix logger color tag --- nonebot/drivers/fastapi.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/nonebot/drivers/fastapi.py b/nonebot/drivers/fastapi.py index a2c315f5..d83fc762 100644 --- a/nonebot/drivers/fastapi.py +++ b/nonebot/drivers/fastapi.py @@ -234,8 +234,9 @@ class Driver(BaseDriver): return if x_self_id in self._clients: - logger.warning("There's already a reverse websocket connection, " - f"{adapter.upper()} Bot {x_self_id} ignored.") + logger.opt(colors=True).warning( + "There's already a reverse websocket connection, " + f"{adapter.upper()} Bot {x_self_id} ignored.") await ws.close(code=status.WS_1008_POLICY_VIOLATION) return From 6bd12b7f2cdc4085ca279adee8a9f46086baf9c7 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Thu, 18 Mar 2021 19:16:18 +0800 Subject: [PATCH 09/40] :alembic: add handler class --- nonebot/adapters/_base.py | 1 - nonebot/handler.py | 161 ++++++++++++++++++++++++++++++++++++++ nonebot/matcher.py | 138 +++++++++++--------------------- 3 files changed, 208 insertions(+), 92 deletions(-) create mode 100644 nonebot/handler.py diff --git a/nonebot/adapters/_base.py b/nonebot/adapters/_base.py index 5983838a..effef2ff 100644 --- a/nonebot/adapters/_base.py +++ b/nonebot/adapters/_base.py @@ -7,7 +7,6 @@ import abc from copy import copy -from typing_extensions import Literal from functools import reduce, partial from dataclasses import dataclass, field from typing import Any, Dict, Union, TypeVar, Mapping, Optional, Callable, Iterable, Iterator, Awaitable, TYPE_CHECKING diff --git a/nonebot/handler.py b/nonebot/handler.py new file mode 100644 index 00000000..d741d342 --- /dev/null +++ b/nonebot/handler.py @@ -0,0 +1,161 @@ +""" +事件处理函数 +=========== + +该模块实现事件处理函数的封装,以实现动态参数等功能。 +""" + +import inspect +from typing_extensions import Literal +from typing import Any, List, Dict, Type, Union, Optional, TYPE_CHECKING +from typing import ForwardRef, _eval_type # type: ignore + +from nonebot.log import logger +from nonebot.typing import T_Handler, T_State + +if TYPE_CHECKING: + from nonebot.matcher import Matcher + from nonebot.adapters import Bot, Event + + +class HandlerMeta(type): + ... + + +class Handler(metaclass=HandlerMeta): + """事件处理函数类""" + + def __init__(self, func: T_Handler, module: Optional[str] = None): + self.func: T_Handler = func + """ + :类型: ``T_Handler`` + :说明: 事件处理函数 + """ + self.module: Optional[str] = module + """ + :类型: ``Optional[str]`` + :说明: 事件处理函数所在模块名称 + """ + self.signature: inspect.Signature = self.get_signature() + """ + :类型: ``inspect.Signature`` + :说明: 事件处理函数签名 + """ + + async def __call__(self, matcher: "Matcher", bot: "Bot", event: "Event", + state: T_State): + params = { + param.name: param.annotation + for param in self.signature.parameters.values() + } + + BotType = ((params["bot"] is not inspect.Parameter.empty) and + inspect.isclass(params["bot"]) and params["bot"]) + if BotType and not isinstance(bot, BotType): + logger.debug( + f"Matcher {matcher} bot type {type(bot)} not match annotation {BotType}, ignored" + ) + return + + EventType = ((params["event"] is not inspect.Parameter.empty) and + inspect.isclass(params["event"]) and params["event"]) + if EventType and not isinstance(event, EventType): + logger.debug( + f"Matcher {matcher} event type {type(event)} not match annotation {EventType}, ignored" + ) + return + + args = {"bot": bot, "event": event, "state": state, "matcher": matcher} + await self.func( + **{k: v for k, v in args.items() if params[k] is not None}) + + @property + def bot_type(self) -> Type["Bot"]: + return self.signature.parameters["bot"].annotation + + @property + def event_type(self) -> Optional[Type["Event"]]: + if "event" not in self.signature: + return None + return self.signature.parameters["event"].annotation + + @property + def state_type(self) -> Optional[T_State]: + if "state" not in self.signature: + return None + return self.signature.parameters["state"].annotation + + @property + def matcher_type(self) -> Optional[Type["Matcher"]]: + if "matcher" not in self.signature: + return None + return self.signature.parameters["matcher"].annotation + + def get_signature(self) -> inspect.Signature: + wrapped_signature = self._get_typed_signature() + signature = self._get_typed_signature(False) + self._check_params(signature) + self._check_bot_param(signature) + self._check_bot_param(wrapped_signature) + signature.parameters["bot"].annotation = wrapped_signature.parameters[ + "bot"].annotation + if "event" in wrapped_signature.parameters and "event" in signature.parameters: + signature.parameters[ + "event"].annotation = wrapped_signature.parameters[ + "event"].annotation + return signature + + def update_signature( + self, **kwargs: Union[None, Type["Bot"], Type["Event"], Type["Matcher"], + T_State] + ) -> None: + params: List[inspect.Parameter] = [] + for param in ["bot", "event", "state", "matcher"]: + sig = self.signature.parameters.get(param, None) + if param in kwargs: + sig = inspect.Parameter(param, + inspect.Parameter.POSITIONAL_OR_KEYWORD, + annotation=kwargs[param]) + if sig: + params.append(sig) + + self.signature = inspect.Signature(params) + + def _get_typed_signature(self, + follow_wrapped: bool = True) -> inspect.Signature: + signature = inspect.signature(self.func, follow_wrapped=follow_wrapped) + globalns = getattr(self, "__globals__", {}) + typed_params = [ + inspect.Parameter( + name=param.name, + kind=param.kind, + default=param.default, + annotation=param.annotation if follow_wrapped else + self._get_typed_annotation(param, globalns), + ) for param in signature.parameters.values() + ] + typed_signature = inspect.Signature(typed_params) + return typed_signature + + def _get_typed_annotation(self, param: inspect.Parameter, + globalns: Dict[str, Any]) -> Any: + try: + if isinstance(param.annotation, str): + return _eval_type(ForwardRef(param.annotation), globalns, + globalns) + else: + return param.annotation + except Exception: + return param.annotation + + def _check_params(self, signature: inspect.Signature): + if not set(signature.parameters.keys()) < { + "bot", "event", "state", "matcher" + }: + raise ValueError( + "Handler param names must in `bot`/`event`/`state`/`matcher`") + + def _check_bot_param(self, signature: inspect.Signature): + if not any( + param.name == "bot" for param in signature.parameters.values()): + raise ValueError("Handler missing parameter 'bot'") diff --git a/nonebot/matcher.py b/nonebot/matcher.py index baa4a768..a3f45b08 100644 --- a/nonebot/matcher.py +++ b/nonebot/matcher.py @@ -2,9 +2,10 @@ 事件响应器 ========== -该模块实现事件响应器的创建与运行,并提供一些快捷方法来帮助用户更好的与机器人进行 对话 。 +该模块实现事件响应器的创建与运行,并提供一些快捷方法来帮助用户更好的与机器人进行对话 。 """ +import sys import inspect from functools import wraps from datetime import datetime @@ -14,6 +15,7 @@ from typing import Type, List, Dict, Union, Mapping, Iterable, Callable, Optiona from nonebot.rule import Rule from nonebot.log import logger +from nonebot.handler import Handler from nonebot.permission import Permission, USER from nonebot.typing import T_State, T_StateFactory, T_Handler, T_ArgsParser, T_TypeUpdater, T_PermissionUpdater from nonebot.exception import PausedException, RejectedException, FinishedException, StopPropagation @@ -31,11 +33,21 @@ current_event: ContextVar = ContextVar("current_event") class MatcherMeta(type): + if TYPE_CHECKING: + module: Optional[str] + type: str + rule: Rule + permission: Permission + handlers: List[T_Handler] + priority: int + block: bool + temp: bool + expire_time: Optional[datetime] def __repr__(self) -> str: - return (f"") # type: ignore + return (f"") def __str__(self) -> str: return repr(self) @@ -64,9 +76,9 @@ class Matcher(metaclass=MatcherMeta): :类型: ``Permission`` :说明: 事件响应器触发权限 """ - handlers: List[T_Handler] = [] + handlers: List[Handler] = [] """ - :类型: ``List[T_Handler]`` + :类型: ``List[Handler]`` :说明: 事件响应器拥有的事件处理函数列表 """ priority: int = 1 @@ -134,7 +146,7 @@ class Matcher(metaclass=MatcherMeta): type_: str = "", rule: Optional[Rule] = None, permission: Optional[Permission] = None, - handlers: Optional[List[T_Handler]] = None, + handlers: Optional[List[Union[T_Handler, Handler]]] = None, temp: bool = False, priority: int = 1, block: bool = False, @@ -178,7 +190,9 @@ class Matcher(metaclass=MatcherMeta): "permission": permission or Permission(), "handlers": [ - cls.process_handler(handler) for handler in handlers + handler + if isinstance(handler, Handler) else Handler(handler) + for handler in handlers ] if handlers else [], "temp": temp, @@ -284,27 +298,13 @@ class Matcher(metaclass=MatcherMeta): cls._default_permission_updater = func return func - @staticmethod - def process_handler(handler: T_Handler) -> T_Handler: - signature = inspect.signature(handler, follow_wrapped=False) - bot = signature.parameters.get("bot") - event = signature.parameters.get("event") - state = signature.parameters.get("state") - matcher = signature.parameters.get("matcher") - if not bot: - raise ValueError("Handler missing parameter 'bot'") - handler.__params__ = { - "bot": bot.annotation, - "event": event.annotation if event else None, - "state": T_State if state else None, - "matcher": matcher.annotation if matcher else None - } - return handler - @classmethod - def append_handler(cls, handler: T_Handler) -> None: - # Process handler first - cls.handlers.append(cls.process_handler(handler)) + def append_handler(cls, + handler: T_Handler, + module: Optional[str] = None) -> Handler: + handler_ = Handler(handler, module) + cls.handlers.append(handler_) + return handler_ @classmethod def handle(cls) -> Callable[[T_Handler], T_Handler]: @@ -319,6 +319,9 @@ class Matcher(metaclass=MatcherMeta): """ def _decorator(func: T_Handler) -> T_Handler: + print( + sys._getframe(1).f_code.co_filename, + sys._getframe(1).f_code.co_name) cls.append_handler(func) return func @@ -339,23 +342,17 @@ class Matcher(metaclass=MatcherMeta): async def _receive(bot: "Bot", event: "Event") -> NoReturn: raise PausedException - cls.process_handler(_receive) - if cls.handlers: # 已有前置handlers则接受一条新的消息,否则视为接收初始消息 - cls.append_handler(_receive) + receive_handler = cls.append_handler(_receive) + else: + receive_handler = None def _decorator(func: T_Handler) -> T_Handler: - cls.process_handler(func) if not cls.handlers or cls.handlers[-1] is not func: - cls.append_handler(func) - - _receive.__params__.update({ - "bot": - func.__params__["bot"], - "event": - func.__params__["event"] or _receive.__params__["event"] - }) + func_handler = cls.append_handler(func) + receive_handler.update_signature(bot=func_handler.bot_type, + event=func_handler.event_type) return func @@ -416,42 +413,27 @@ class Matcher(metaclass=MatcherMeta): else: state[state["_current_key"]] = str(event.get_message()) - cls.append_handler(_key_getter) - cls.append_handler(_key_parser) + getter_handler = cls.append_handler(_key_getter) + parser_handler = cls.append_handler(_key_parser) def _decorator(func: T_Handler) -> T_Handler: if not hasattr(cls.handlers[-1], "__wrapped__"): - cls.process_handler(func) parser = cls.handlers.pop() @wraps(func) async def wrapper(bot: "Bot", event: "Event", state: T_State, matcher: Matcher): - await matcher.run_handler(parser, bot, event, state) - await matcher.run_handler(func, bot, event, state) + await parser(matcher, bot, event, state) + await func_handler(matcher, bot, event, state) if "_current_key" in state: del state["_current_key"] - cls.append_handler(wrapper) + func_handler = cls.append_handler(wrapper) - wrapper.__params__.update({ - "bot": - func.__params__["bot"], - "event": - func.__params__["event"] or wrapper.__params__["event"] - }) - _key_getter.__params__.update({ - "bot": - func.__params__["bot"], - "event": - func.__params__["event"] or wrapper.__params__["event"] - }) - _key_parser.__params__.update({ - "bot": - func.__params__["bot"], - "event": - func.__params__["event"] or wrapper.__params__["event"] - }) + getter_handler.update_signature(bot=func_handler.bot_type, + event=func_handler.event_type) + parser_handler.update_signature(bot=func_handler.bot_type, + event=func_handler.event_type) return func @@ -545,32 +527,6 @@ class Matcher(metaclass=MatcherMeta): """ self.block = True - async def run_handler(self, handler: T_Handler, bot: "Bot", event: "Event", - state: T_State): - if not hasattr(handler, "__params__"): - self.process_handler(handler) - params = getattr(handler, "__params__") - - BotType = ((params["bot"] is not inspect.Parameter.empty) and - inspect.isclass(params["bot"]) and params["bot"]) - if BotType and not isinstance(bot, BotType): - logger.debug( - f"Matcher {self} bot type {type(bot)} not match annotation {BotType}, ignored" - ) - return - - EventType = ((params["event"] is not inspect.Parameter.empty) and - inspect.isclass(params["event"]) and params["event"]) - if EventType and not isinstance(event, EventType): - logger.debug( - f"Matcher {self} event type {type(event)} not match annotation {EventType}, ignored" - ) - return - - args = {"bot": bot, "event": event, "state": state, "matcher": self} - await handler( - **{k: v for k, v in args.items() if params[k] is not None}) - # 运行handlers async def run(self, bot: "Bot", event: "Event", state: T_State): b_t = current_bot.set(bot) @@ -583,7 +539,7 @@ class Matcher(metaclass=MatcherMeta): for _ in range(len(self.handlers)): handler = self.handlers.pop(0) - await self.run_handler(handler, bot, event, state_) + await handler(self, bot, event, state_) except RejectedException: self.handlers.insert(0, handler) # type: ignore From e7dc4e1eec4fa32cd59604aa14c2a7c1eb5c2cca Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Thu, 18 Mar 2021 21:30:52 +0800 Subject: [PATCH 10/40] :alembic: finish handler class --- nonebot/handler.py | 19 +++++++++---------- nonebot/matcher.py | 9 ++++----- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/nonebot/handler.py b/nonebot/handler.py index d741d342..930ebf41 100644 --- a/nonebot/handler.py +++ b/nonebot/handler.py @@ -75,19 +75,19 @@ class Handler(metaclass=HandlerMeta): @property def event_type(self) -> Optional[Type["Event"]]: - if "event" not in self.signature: + if "event" not in self.signature.parameters: return None return self.signature.parameters["event"].annotation @property def state_type(self) -> Optional[T_State]: - if "state" not in self.signature: + if "state" not in self.signature.parameters: return None return self.signature.parameters["state"].annotation @property def matcher_type(self) -> Optional[Type["Matcher"]]: - if "matcher" not in self.signature: + if "matcher" not in self.signature.parameters: return None return self.signature.parameters["matcher"].annotation @@ -97,12 +97,11 @@ class Handler(metaclass=HandlerMeta): self._check_params(signature) self._check_bot_param(signature) self._check_bot_param(wrapped_signature) - signature.parameters["bot"].annotation = wrapped_signature.parameters[ - "bot"].annotation + signature.parameters["bot"].replace( + annotation=wrapped_signature.parameters["bot"].annotation) if "event" in wrapped_signature.parameters and "event" in signature.parameters: - signature.parameters[ - "event"].annotation = wrapped_signature.parameters[ - "event"].annotation + signature.parameters["event"].replace( + annotation=wrapped_signature.parameters["event"].annotation) return signature def update_signature( @@ -124,7 +123,7 @@ class Handler(metaclass=HandlerMeta): def _get_typed_signature(self, follow_wrapped: bool = True) -> inspect.Signature: signature = inspect.signature(self.func, follow_wrapped=follow_wrapped) - globalns = getattr(self, "__globals__", {}) + globalns = getattr(self.func, "__globals__", {}) typed_params = [ inspect.Parameter( name=param.name, @@ -149,7 +148,7 @@ class Handler(metaclass=HandlerMeta): return param.annotation def _check_params(self, signature: inspect.Signature): - if not set(signature.parameters.keys()) < { + if not set(signature.parameters.keys()) <= { "bot", "event", "state", "matcher" }: raise ValueError( diff --git a/nonebot/matcher.py b/nonebot/matcher.py index a3f45b08..f91ff4e2 100644 --- a/nonebot/matcher.py +++ b/nonebot/matcher.py @@ -319,9 +319,6 @@ class Matcher(metaclass=MatcherMeta): """ def _decorator(func: T_Handler) -> T_Handler: - print( - sys._getframe(1).f_code.co_filename, - sys._getframe(1).f_code.co_name) cls.append_handler(func) return func @@ -351,8 +348,10 @@ class Matcher(metaclass=MatcherMeta): def _decorator(func: T_Handler) -> T_Handler: if not cls.handlers or cls.handlers[-1] is not func: func_handler = cls.append_handler(func) - receive_handler.update_signature(bot=func_handler.bot_type, - event=func_handler.event_type) + if receive_handler: + receive_handler.update_signature( + bot=func_handler.bot_type, + event=func_handler.event_type) return func From fc334ec7b956817de1f8af0ce51664922d79e518 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Fri, 19 Mar 2021 00:24:38 +0800 Subject: [PATCH 11/40] :wheelchair: add logger id --- nonebot/log.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/nonebot/log.py b/nonebot/log.py index 854b4b78..3f6d1e1a 100644 --- a/nonebot/log.py +++ b/nonebot/log.py @@ -77,8 +77,8 @@ default_format = ( "{name} | " # "{function}:{line}| " "{message}") -logger.add(sys.stdout, - colorize=True, - diagnose=False, - filter=default_filter, - format=default_format) +logger_id = logger.add(sys.stdout, + colorize=True, + diagnose=False, + filter=default_filter, + format=default_format) From 22033e1cfb580ca5f6c6c8aad83302bfc6c9e0ca Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Fri, 19 Mar 2021 14:59:59 +0800 Subject: [PATCH 12/40] :bug: fix typing --- nonebot/handler.py | 7 +---- nonebot/matcher.py | 9 +++--- nonebot/plugin/__init__.py | 59 +++++++++++++++++++------------------ nonebot/plugin/__init__.pyi | 51 ++++++++++++++++---------------- nonebot/plugin/manager.py | 11 +++++-- 5 files changed, 69 insertions(+), 68 deletions(-) diff --git a/nonebot/handler.py b/nonebot/handler.py index 930ebf41..946b9fe6 100644 --- a/nonebot/handler.py +++ b/nonebot/handler.py @@ -25,17 +25,12 @@ class HandlerMeta(type): class Handler(metaclass=HandlerMeta): """事件处理函数类""" - def __init__(self, func: T_Handler, module: Optional[str] = None): + def __init__(self, func: T_Handler): self.func: T_Handler = func """ :类型: ``T_Handler`` :说明: 事件处理函数 """ - self.module: Optional[str] = module - """ - :类型: ``Optional[str]`` - :说明: 事件处理函数所在模块名称 - """ self.signature: inspect.Signature = self.get_signature() """ :类型: ``inspect.Signature`` diff --git a/nonebot/matcher.py b/nonebot/matcher.py index f91ff4e2..2aac333c 100644 --- a/nonebot/matcher.py +++ b/nonebot/matcher.py @@ -146,7 +146,8 @@ class Matcher(metaclass=MatcherMeta): type_: str = "", rule: Optional[Rule] = None, permission: Optional[Permission] = None, - handlers: Optional[List[Union[T_Handler, Handler]]] = None, + handlers: Optional[Union[List[T_Handler], List[Handler], + List[Union[T_Handler, Handler]]]] = None, temp: bool = False, priority: int = 1, block: bool = False, @@ -299,10 +300,8 @@ class Matcher(metaclass=MatcherMeta): return func @classmethod - def append_handler(cls, - handler: T_Handler, - module: Optional[str] = None) -> Handler: - handler_ = Handler(handler, module) + def append_handler(cls, handler: T_Handler) -> Handler: + handler_ = Handler(handler) cls.handlers.append(handler_) return handler_ diff --git a/nonebot/plugin/__init__.py b/nonebot/plugin/__init__.py index bd9fec3d..ded978b4 100644 --- a/nonebot/plugin/__init__.py +++ b/nonebot/plugin/__init__.py @@ -14,6 +14,7 @@ from typing import Any, Set, List, Dict, Type, Tuple, Union, Optional, TYPE_CHEC import tomlkit from nonebot.log import logger from nonebot.matcher import Matcher +from nonebot.handler import Handler from nonebot.permission import Permission from nonebot.typing import T_State, T_StateFactory, T_Handler, T_RuleChecker from nonebot.rule import Rule, startswith, endswith, keyword, command, shell_command, ArgumentParser, regex @@ -107,7 +108,7 @@ def on(type: str = "", rule: Optional[Union[Rule, T_RuleChecker]] = None, permission: Optional[Permission] = None, *, - handlers: Optional[List[T_Handler]] = None, + handlers: Optional[List[Union[T_Handler, Handler]]] = None, temp: bool = False, priority: int = 1, block: bool = False, @@ -123,7 +124,7 @@ def on(type: str = "", * ``type: str``: 事件响应器类型 * ``rule: Optional[Union[Rule, T_RuleChecker]]``: 事件响应规则 * ``permission: Optional[Permission]``: 事件响应权限 - * ``handlers: Optional[List[T_Handler]]``: 事件处理函数列表 + * ``handlers: Optional[List[Union[T_Handler, Handler]]]``: 事件处理函数列表 * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 @@ -150,7 +151,7 @@ def on(type: str = "", def on_metaevent( rule: Optional[Union[Rule, T_RuleChecker]] = None, *, - handlers: Optional[List[T_Handler]] = None, + handlers: Optional[List[Union[T_Handler, Handler]]] = None, temp: bool = False, priority: int = 1, block: bool = False, @@ -164,7 +165,7 @@ def on_metaevent( :参数: * ``rule: Optional[Union[Rule, T_RuleChecker]]``: 事件响应规则 - * ``handlers: Optional[List[T_Handler]]``: 事件处理函数列表 + * ``handlers: Optional[List[Union[T_Handler, Handler]]]``: 事件处理函数列表 * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 @@ -191,7 +192,7 @@ def on_metaevent( def on_message(rule: Optional[Union[Rule, T_RuleChecker]] = None, permission: Optional[Permission] = None, *, - handlers: Optional[List[T_Handler]] = None, + handlers: Optional[List[Union[T_Handler, Handler]]] = None, temp: bool = False, priority: int = 1, block: bool = True, @@ -206,7 +207,7 @@ def on_message(rule: Optional[Union[Rule, T_RuleChecker]] = None, * ``rule: Optional[Union[Rule, T_RuleChecker]]``: 事件响应规则 * ``permission: Optional[Permission]``: 事件响应权限 - * ``handlers: Optional[List[T_Handler]]``: 事件处理函数列表 + * ``handlers: Optional[List[Union[T_Handler, Handler]]]``: 事件处理函数列表 * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 @@ -232,7 +233,7 @@ def on_message(rule: Optional[Union[Rule, T_RuleChecker]] = None, def on_notice(rule: Optional[Union[Rule, T_RuleChecker]] = None, *, - handlers: Optional[List[T_Handler]] = None, + handlers: Optional[List[Union[T_Handler, Handler]]] = None, temp: bool = False, priority: int = 1, block: bool = False, @@ -246,7 +247,7 @@ def on_notice(rule: Optional[Union[Rule, T_RuleChecker]] = None, :参数: * ``rule: Optional[Union[Rule, T_RuleChecker]]``: 事件响应规则 - * ``handlers: Optional[List[T_Handler]]``: 事件处理函数列表 + * ``handlers: Optional[List[Union[T_Handler, Handler]]]``: 事件处理函数列表 * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 @@ -272,7 +273,7 @@ def on_notice(rule: Optional[Union[Rule, T_RuleChecker]] = None, def on_request(rule: Optional[Union[Rule, T_RuleChecker]] = None, *, - handlers: Optional[List[T_Handler]] = None, + handlers: Optional[List[Union[T_Handler, Handler]]] = None, temp: bool = False, priority: int = 1, block: bool = False, @@ -286,7 +287,7 @@ def on_request(rule: Optional[Union[Rule, T_RuleChecker]] = None, :参数: * ``rule: Optional[Union[Rule, T_RuleChecker]]``: 事件响应规则 - * ``handlers: Optional[List[T_Handler]]``: 事件处理函数列表 + * ``handlers: Optional[List[Union[T_Handler, Handler]]]``: 事件处理函数列表 * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 @@ -323,7 +324,7 @@ def on_startswith(msg: str, * ``msg: str``: 指定消息开头内容 * ``rule: Optional[Union[Rule, T_RuleChecker]]``: 事件响应规则 * ``permission: Optional[Permission]``: 事件响应权限 - * ``handlers: Optional[List[T_Handler]]``: 事件处理函数列表 + * ``handlers: Optional[List[Union[T_Handler, Handler]]]``: 事件处理函数列表 * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 @@ -350,7 +351,7 @@ def on_endswith(msg: str, * ``msg: str``: 指定消息结尾内容 * ``rule: Optional[Union[Rule, T_RuleChecker]]``: 事件响应规则 * ``permission: Optional[Permission]``: 事件响应权限 - * ``handlers: Optional[List[T_Handler]]``: 事件处理函数列表 + * ``handlers: Optional[List[Union[T_Handler, Handler]]]``: 事件处理函数列表 * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 @@ -377,7 +378,7 @@ def on_keyword(keywords: Set[str], * ``keywords: Set[str]``: 关键词列表 * ``rule: Optional[Union[Rule, T_RuleChecker]]``: 事件响应规则 * ``permission: Optional[Permission]``: 事件响应权限 - * ``handlers: Optional[List[T_Handler]]``: 事件处理函数列表 + * ``handlers: Optional[List[Union[T_Handler, Handler]]]``: 事件处理函数列表 * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 @@ -408,7 +409,7 @@ def on_command(cmd: Union[str, Tuple[str, ...]], * ``rule: Optional[Union[Rule, T_RuleChecker]]``: 事件响应规则 * ``aliases: Optional[Set[Union[str, Tuple[str, ...]]]]``: 命令别名 * ``permission: Optional[Permission]``: 事件响应权限 - * ``handlers: Optional[List[T_Handler]]``: 事件处理函数列表 + * ``handlers: Optional[List[Union[T_Handler, Handler]]]``: 事件处理函数列表 * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 @@ -457,7 +458,7 @@ def on_shell_command(cmd: Union[str, Tuple[str, ...]], * ``aliases: Optional[Set[Union[str, Tuple[str, ...]]]]``: 命令别名 * ``parser: Optional[ArgumentParser]``: ``nonebot.rule.ArgumentParser`` 对象 * ``permission: Optional[Permission]``: 事件响应权限 - * ``handlers: Optional[List[T_Handler]]``: 事件处理函数列表 + * ``handlers: Optional[List[Union[T_Handler, Handler]]]``: 事件处理函数列表 * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 @@ -504,7 +505,7 @@ def on_regex(pattern: str, * ``flags: Union[int, re.RegexFlag]``: 正则匹配标志 * ``rule: Optional[Union[Rule, T_RuleChecker]]``: 事件响应规则 * ``permission: Optional[Permission]``: 事件响应权限 - * ``handlers: Optional[List[T_Handler]]``: 事件处理函数列表 + * ``handlers: Optional[List[Union[T_Handler, Handler]]]``: 事件处理函数列表 * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 @@ -619,7 +620,7 @@ class MatcherGroup: * ``type: str``: 事件响应器类型 * ``rule: Optional[Union[Rule, T_RuleChecker]]``: 事件响应规则 * ``permission: Optional[Permission]``: 事件响应权限 - * ``handlers: Optional[List[T_Handler]]``: 事件处理函数列表 + * ``handlers: Optional[List[Union[T_Handler, Handler]]]``: 事件处理函数列表 * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 @@ -645,7 +646,7 @@ class MatcherGroup: :参数: * ``rule: Optional[Union[Rule, T_RuleChecker]]``: 事件响应规则 - * ``handlers: Optional[List[T_Handler]]``: 事件处理函数列表 + * ``handlers: Optional[List[Union[T_Handler, Handler]]]``: 事件处理函数列表 * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 @@ -673,7 +674,7 @@ class MatcherGroup: * ``rule: Optional[Union[Rule, T_RuleChecker]]``: 事件响应规则 * ``permission: Optional[Permission]``: 事件响应权限 - * ``handlers: Optional[List[T_Handler]]``: 事件处理函数列表 + * ``handlers: Optional[List[Union[T_Handler, Handler]]]``: 事件处理函数列表 * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 @@ -700,7 +701,7 @@ class MatcherGroup: :参数: * ``rule: Optional[Union[Rule, T_RuleChecker]]``: 事件响应规则 - * ``handlers: Optional[List[T_Handler]]``: 事件处理函数列表 + * ``handlers: Optional[List[Union[T_Handler, Handler]]]``: 事件处理函数列表 * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 @@ -727,7 +728,7 @@ class MatcherGroup: :参数: * ``rule: Optional[Union[Rule, T_RuleChecker]]``: 事件响应规则 - * ``handlers: Optional[List[T_Handler]]``: 事件处理函数列表 + * ``handlers: Optional[List[Union[T_Handler, Handler]]]``: 事件处理函数列表 * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 @@ -756,7 +757,7 @@ class MatcherGroup: * ``msg: str``: 指定消息开头内容 * ``rule: Optional[Union[Rule, T_RuleChecker]]``: 事件响应规则 * ``permission: Optional[Permission]``: 事件响应权限 - * ``handlers: Optional[List[T_Handler]]``: 事件处理函数列表 + * ``handlers: Optional[List[Union[T_Handler, Handler]]]``: 事件处理函数列表 * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 @@ -785,7 +786,7 @@ class MatcherGroup: * ``msg: str``: 指定消息结尾内容 * ``rule: Optional[Union[Rule, T_RuleChecker]]``: 事件响应规则 * ``permission: Optional[Permission]``: 事件响应权限 - * ``handlers: Optional[List[T_Handler]]``: 事件处理函数列表 + * ``handlers: Optional[List[Union[T_Handler, Handler]]]``: 事件处理函数列表 * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 @@ -814,7 +815,7 @@ class MatcherGroup: * ``keywords: Set[str]``: 关键词列表 * ``rule: Optional[Union[Rule, T_RuleChecker]]``: 事件响应规则 * ``permission: Optional[Permission]``: 事件响应权限 - * ``handlers: Optional[List[T_Handler]]``: 事件处理函数列表 + * ``handlers: Optional[List[Union[T_Handler, Handler]]]``: 事件处理函数列表 * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 @@ -849,7 +850,7 @@ class MatcherGroup: * ``aliases: Optional[Set[Union[str, Tuple[str, ...]]]]``: 命令别名 * ``rule: Optional[Union[Rule, T_RuleChecker]]``: 事件响应规则 * ``permission: Optional[Permission]``: 事件响应权限 - * ``handlers: Optional[List[T_Handler]]``: 事件处理函数列表 + * ``handlers: Optional[List[Union[T_Handler, Handler]]]``: 事件处理函数列表 * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 @@ -889,7 +890,7 @@ class MatcherGroup: * ``parser: Optional[ArgumentParser]``: ``nonebot.rule.ArgumentParser`` 对象 * ``rule: Optional[Union[Rule, T_RuleChecker]]``: 事件响应规则 * ``permission: Optional[Permission]``: 事件响应权限 - * ``handlers: Optional[List[T_Handler]]``: 事件处理函数列表 + * ``handlers: Optional[List[Union[T_Handler, Handler]]]``: 事件处理函数列表 * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 @@ -927,7 +928,7 @@ class MatcherGroup: * ``flags: Union[int, re.RegexFlag]``: 正则匹配标志 * ``rule: Optional[Union[Rule, T_RuleChecker]]``: 事件响应规则 * ``permission: Optional[Permission]``: 事件响应权限 - * ``handlers: Optional[List[T_Handler]]``: 事件处理函数列表 + * ``handlers: Optional[List[Union[T_Handler, Handler]]]``: 事件处理函数列表 * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 @@ -959,8 +960,8 @@ def _load_plugin(manager: PluginManager, plugin_name: str) -> Optional[Plugin]: try: module = manager.load_plugin(plugin_name) - for m in _tmp_matchers.get(): - m.module = plugin_name + # for m in _tmp_matchers.get(): + # m.module = plugin_name plugin = Plugin(plugin_name, module, _tmp_matchers.get(), _export.get()) plugins[plugin_name] = plugin logger.opt( diff --git a/nonebot/plugin/__init__.pyi b/nonebot/plugin/__init__.pyi index d99e96e1..bda05b77 100644 --- a/nonebot/plugin/__init__.pyi +++ b/nonebot/plugin/__init__.pyi @@ -4,6 +4,7 @@ from contextvars import ContextVar from typing import Any, Set, List, Dict, Type, Tuple, Union, Optional from nonebot.matcher import Matcher +from nonebot.handler import Handler from nonebot.permission import Permission from nonebot.rule import Rule, ArgumentParser from nonebot.typing import T_State, T_StateFactory, T_Handler, T_RuleChecker @@ -37,7 +38,7 @@ def on(type: str = ..., rule: Optional[Union[Rule, T_RuleChecker]] = ..., permission: Optional[Permission] = ..., *, - handlers: Optional[List[T_Handler]] = ..., + handlers: Optional[List[Union[T_Handler, Handler]]] = ..., temp: bool = ..., priority: int = ..., block: bool = ..., @@ -49,7 +50,7 @@ def on(type: str = ..., def on_metaevent( rule: Optional[Union[Rule, T_RuleChecker]] = ..., *, - handlers: Optional[List[T_Handler]] = ..., + handlers: Optional[List[Union[T_Handler, Handler]]] = ..., temp: bool = ..., priority: int = ..., block: bool = ..., @@ -61,7 +62,7 @@ def on_metaevent( def on_message(rule: Optional[Union[Rule, T_RuleChecker]] = ..., permission: Optional[Permission] = ..., *, - handlers: Optional[List[T_Handler]] = ..., + handlers: Optional[List[Union[T_Handler, Handler]]] = ..., temp: bool = ..., priority: int = ..., block: bool = ..., @@ -72,7 +73,7 @@ def on_message(rule: Optional[Union[Rule, T_RuleChecker]] = ..., def on_notice(rule: Optional[Union[Rule, T_RuleChecker]] = ..., *, - handlers: Optional[List[T_Handler]] = ..., + handlers: Optional[List[Union[T_Handler, Handler]]] = ..., temp: bool = ..., priority: int = ..., block: bool = ..., @@ -83,7 +84,7 @@ def on_notice(rule: Optional[Union[Rule, T_RuleChecker]] = ..., def on_request(rule: Optional[Union[Rule, T_RuleChecker]] = ..., *, - handlers: Optional[List[T_Handler]] = ..., + handlers: Optional[List[Union[T_Handler, Handler]]] = ..., temp: bool = ..., priority: int = ..., block: bool = ..., @@ -97,7 +98,7 @@ def on_startswith( rule: Optional[Optional[Union[Rule, T_RuleChecker]]] = ..., *, permission: Optional[Permission] = ..., - handlers: Optional[List[T_Handler]] = ..., + handlers: Optional[List[Union[T_Handler, Handler]]] = ..., temp: bool = ..., priority: int = ..., block: bool = ..., @@ -110,7 +111,7 @@ def on_endswith(msg: str, rule: Optional[Optional[Union[Rule, T_RuleChecker]]] = ..., *, permission: Optional[Permission] = ..., - handlers: Optional[List[T_Handler]] = ..., + handlers: Optional[List[Union[T_Handler, Handler]]] = ..., temp: bool = ..., priority: int = ..., block: bool = ..., @@ -123,7 +124,7 @@ def on_keyword(keywords: Set[str], rule: Optional[Optional[Union[Rule, T_RuleChecker]]] = ..., *, permission: Optional[Permission] = ..., - handlers: Optional[List[T_Handler]] = ..., + handlers: Optional[List[Union[T_Handler, Handler]]] = ..., temp: bool = ..., priority: int = ..., block: bool = ..., @@ -137,7 +138,7 @@ def on_command(cmd: Union[str, Tuple[str, ...]], aliases: Optional[Set[Union[str, Tuple[str, ...]]]] = ..., *, permission: Optional[Permission] = ..., - handlers: Optional[List[T_Handler]] = ..., + handlers: Optional[List[Union[T_Handler, Handler]]] = ..., temp: bool = ..., priority: int = ..., block: bool = ..., @@ -159,7 +160,7 @@ def on_regex(pattern: str, rule: Optional[Union[Rule, T_RuleChecker]] = ..., *, permission: Optional[Permission] = ..., - handlers: Optional[List[T_Handler]] = ..., + handlers: Optional[List[Union[T_Handler, Handler]]] = ..., temp: bool = ..., priority: int = ..., block: bool = ..., @@ -216,7 +217,7 @@ class CommandGroup: rule: Optional[Union[Rule, T_RuleChecker]] = ..., permission: Optional[Permission] = ..., *, - handlers: Optional[List[T_Handler]] = ..., + handlers: Optional[List[Union[T_Handler, Handler]]] = ..., temp: bool = ..., priority: int = ..., block: bool = ..., @@ -230,7 +231,7 @@ class CommandGroup: rule: Optional[Union[Rule, T_RuleChecker]] = ..., aliases: Optional[Set[Union[str, Tuple[str, ...]]]] = ..., permission: Optional[Permission] = ..., - handlers: Optional[List[T_Handler]] = ..., + handlers: Optional[List[Union[T_Handler, Handler]]] = ..., temp: bool = ..., priority: int = ..., block: bool = ..., @@ -246,7 +247,7 @@ class CommandGroup: aliases: Optional[Set[Union[str, Tuple[str, ...]]]] = ..., parser: Optional[ArgumentParser] = ..., permission: Optional[Permission] = ..., - handlers: Optional[List[T_Handler]] = ..., + handlers: Optional[List[Union[T_Handler, Handler]]] = ..., temp: bool = ..., priority: int = ..., block: bool = ..., @@ -262,7 +263,7 @@ class MatcherGroup: type: str = ..., rule: Optional[Union[Rule, T_RuleChecker]] = ..., permission: Optional[Permission] = ..., - handlers: Optional[List[T_Handler]] = ..., + handlers: Optional[List[Union[T_Handler, Handler]]] = ..., temp: bool = ..., priority: int = ..., block: bool = ..., @@ -274,7 +275,7 @@ class MatcherGroup: type: str = ..., rule: Optional[Union[Rule, T_RuleChecker]] = ..., permission: Optional[Permission] = ..., - handlers: Optional[List[T_Handler]] = ..., + handlers: Optional[List[Union[T_Handler, Handler]]] = ..., temp: bool = ..., priority: int = ..., block: bool = ..., @@ -286,7 +287,7 @@ class MatcherGroup: self, *, rule: Optional[Union[Rule, T_RuleChecker]] = None, - handlers: Optional[List[T_Handler]] = None, + handlers: Optional[List[Union[T_Handler, Handler]]] = None, temp: bool = False, priority: int = 1, block: bool = False, @@ -299,7 +300,7 @@ class MatcherGroup: *, rule: Optional[Union[Rule, T_RuleChecker]] = None, permission: Optional[Permission] = None, - handlers: Optional[List[T_Handler]] = None, + handlers: Optional[List[Union[T_Handler, Handler]]] = None, temp: bool = False, priority: int = 1, block: bool = True, @@ -311,7 +312,7 @@ class MatcherGroup: self, *, rule: Optional[Union[Rule, T_RuleChecker]] = None, - handlers: Optional[List[T_Handler]] = None, + handlers: Optional[List[Union[T_Handler, Handler]]] = None, temp: bool = False, priority: int = 1, block: bool = False, @@ -323,7 +324,7 @@ class MatcherGroup: self, *, rule: Optional[Union[Rule, T_RuleChecker]] = None, - handlers: Optional[List[T_Handler]] = None, + handlers: Optional[List[Union[T_Handler, Handler]]] = None, temp: bool = False, priority: int = 1, block: bool = False, @@ -337,7 +338,7 @@ class MatcherGroup: *, rule: Optional[Optional[Union[Rule, T_RuleChecker]]] = ..., permission: Optional[Permission] = ..., - handlers: Optional[List[T_Handler]] = ..., + handlers: Optional[List[Union[T_Handler, Handler]]] = ..., temp: bool = ..., priority: int = ..., block: bool = ..., @@ -351,7 +352,7 @@ class MatcherGroup: *, rule: Optional[Optional[Union[Rule, T_RuleChecker]]] = ..., permission: Optional[Permission] = ..., - handlers: Optional[List[T_Handler]] = ..., + handlers: Optional[List[Union[T_Handler, Handler]]] = ..., temp: bool = ..., priority: int = ..., block: bool = ..., @@ -365,7 +366,7 @@ class MatcherGroup: *, rule: Optional[Optional[Union[Rule, T_RuleChecker]]] = ..., permission: Optional[Permission] = ..., - handlers: Optional[List[T_Handler]] = ..., + handlers: Optional[List[Union[T_Handler, Handler]]] = ..., temp: bool = ..., priority: int = ..., block: bool = ..., @@ -380,7 +381,7 @@ class MatcherGroup: *, rule: Optional[Union[Rule, T_RuleChecker]] = ..., permission: Optional[Permission] = ..., - handlers: Optional[List[T_Handler]] = ..., + handlers: Optional[List[Union[T_Handler, Handler]]] = ..., temp: bool = ..., priority: int = ..., block: bool = ..., @@ -396,7 +397,7 @@ class MatcherGroup: *, rule: Optional[Union[Rule, T_RuleChecker]] = ..., permission: Optional[Permission] = ..., - handlers: Optional[List[T_Handler]] = ..., + handlers: Optional[List[Union[T_Handler, Handler]]] = ..., temp: bool = ..., priority: int = ..., block: bool = ..., @@ -411,7 +412,7 @@ class MatcherGroup: *, rule: Optional[Union[Rule, T_RuleChecker]] = ..., permission: Optional[Permission] = ..., - handlers: Optional[List[T_Handler]] = ..., + handlers: Optional[List[Union[T_Handler, Handler]]] = ..., temp: bool = ..., priority: int = ..., block: bool = ..., diff --git a/nonebot/plugin/manager.py b/nonebot/plugin/manager.py index 40426b7f..bac90246 100644 --- a/nonebot/plugin/manager.py +++ b/nonebot/plugin/manager.py @@ -174,7 +174,8 @@ class PluginFinder(MetaPathFinder): list(manager.search_path), target) if spec: - spec.loader = PluginLoader(newname, spec.origin) + spec.loader = PluginLoader(manager, newname, + spec.origin) return spec index -= 1 return None @@ -182,7 +183,8 @@ class PluginFinder(MetaPathFinder): class PluginLoader(SourceFileLoader): - def __init__(self, fullname: str, path) -> None: + def __init__(self, manager: PluginManager, fullname: str, path) -> None: + self.manager = manager self.loaded = False super().__init__(fullname, path) @@ -190,12 +192,15 @@ class PluginLoader(SourceFileLoader): if self.name in sys.modules: self.loaded = True return sys.modules[self.name] + # return None to use default module creation return super().create_module(spec) def exec_module(self, module: ModuleType) -> None: if self.loaded: return - return super().exec_module(module) + setattr(module, "__manager__", self.manager) + super().exec_module(module) + return sys.meta_path.insert(0, PluginFinder()) From 2166595e50c1bda4caeb9e13438087c5d4e46c9c Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sat, 20 Mar 2021 14:49:58 +0800 Subject: [PATCH 13/40] :bug: fix cqhttp secret checking #289 --- docs/api/adapters/README.md | 2 +- docs/api/adapters/ding.md | 8 +++- docs/api/matcher.md | 8 ++-- docs/api/plugin.md | 44 +++++++++---------- nonebot/adapters/_base.py | 4 +- nonebot/drivers/fastapi.py | 14 +++--- .../nonebot/adapters/cqhttp/bot.py | 7 ++- .../nonebot/adapters/ding/bot.py | 7 ++- .../nonebot/adapters/ding/utils.py | 6 ++- .../nonebot/adapters/mirai/bot.py | 10 ++--- .../nonebot/adapters/mirai/bot_ws.py | 5 ++- 11 files changed, 61 insertions(+), 54 deletions(-) diff --git a/docs/api/adapters/README.md b/docs/api/adapters/README.md index 172e87a4..05fe3b49 100644 --- a/docs/api/adapters/README.md +++ b/docs/api/adapters/README.md @@ -93,7 +93,7 @@ Adapter 类型 * `headers: dict`: 请求头 - * `body: Optional[dict]`: 请求数据,WebSocket 连接该部分为空 + * `body: Optional[bytes]`: 请求数据,WebSocket 连接该部分为 None diff --git a/docs/api/adapters/ding.md b/docs/api/adapters/ding.md index 7bb07c8a..7cfe5932 100644 --- a/docs/api/adapters/ding.md +++ b/docs/api/adapters/ding.md @@ -150,7 +150,7 @@ sidebarDepth: 0 -### _async_ `send(event, message, at_sender=False, **kwargs)` +### _async_ `send(event, message, at_sender=False, webhook=None, secret=None, **kwargs)` * **说明** @@ -171,6 +171,12 @@ sidebarDepth: 0 * `at_sender: bool`: 是否 @ 事件主体 + * `webhook: Optional[str]`: 该条消息将调用的 webhook 地址。不传则将使用 sessionWebhook,若其也不存在,该条消息不发送,使用自定义 webhook 时注意你设置的安全方式,如加关键词,IP地址,加签等等。 + + + * `secret: Optional[str]`: 如果你使用自定义的 webhook 地址,推荐使用加签方式对消息进行验证,将 机器人安全设置页面,加签一栏下面显示的SEC开头的字符串 传入这个参数即可。 + + * `**kwargs`: 覆盖默认参数 diff --git a/docs/api/matcher.md b/docs/api/matcher.md index 509ab6e9..0683c8f9 100644 --- a/docs/api/matcher.md +++ b/docs/api/matcher.md @@ -7,7 +7,7 @@ sidebarDepth: 0 ## 事件响应器 -该模块实现事件响应器的创建与运行,并提供一些快捷方法来帮助用户更好的与机器人进行 对话 。 +该模块实现事件响应器的创建与运行,并提供一些快捷方法来帮助用户更好的与机器人进行对话 。 ## `matchers` @@ -202,7 +202,7 @@ sidebarDepth: 0 * **类型** - `Optional[T_ArgsParser]` + `Optional[T_TypeUpdater]` @@ -217,7 +217,7 @@ sidebarDepth: 0 * **类型** - `Optional[T_ArgsParser]` + `Optional[T_PermissionUpdater]` @@ -237,7 +237,7 @@ sidebarDepth: 0 * **类型** - `List[T_Handler]` + `List[Handler]` diff --git a/docs/api/plugin.md b/docs/api/plugin.md index a924bb6b..cc785f1f 100644 --- a/docs/api/plugin.md +++ b/docs/api/plugin.md @@ -121,7 +121,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -162,7 +162,7 @@ def something_else(): * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -206,7 +206,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -247,7 +247,7 @@ def something_else(): * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -288,7 +288,7 @@ def something_else(): * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -335,7 +335,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -382,7 +382,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -429,7 +429,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -481,7 +481,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -538,7 +538,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -590,7 +590,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -767,7 +767,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -808,7 +808,7 @@ def something_else(): * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -852,7 +852,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -893,7 +893,7 @@ def something_else(): * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -934,7 +934,7 @@ def something_else(): * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -981,7 +981,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -1028,7 +1028,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -1075,7 +1075,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -1127,7 +1127,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -1184,7 +1184,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -1236,7 +1236,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) diff --git a/nonebot/adapters/_base.py b/nonebot/adapters/_base.py index effef2ff..dc2d663a 100644 --- a/nonebot/adapters/_base.py +++ b/nonebot/adapters/_base.py @@ -72,7 +72,7 @@ class Bot(abc.ABC): @classmethod @abc.abstractmethod async def check_permission(cls, driver: "Driver", connection_type: str, - headers: dict, body: Optional[dict]) -> str: + headers: dict, body: Optional[bytes]) -> str: """ :说明: @@ -83,7 +83,7 @@ class Bot(abc.ABC): * ``driver: Driver``: Driver 对象 * ``connection_type: str``: 连接类型 * ``headers: dict``: 请求头 - * ``body: Optional[dict]``: 请求数据,WebSocket 连接该部分为空 + * ``body: Optional[bytes]``: 请求数据,WebSocket 连接该部分为 None :返回: diff --git a/nonebot/drivers/fastapi.py b/nonebot/drivers/fastapi.py index d83fc762..18a5f1db 100644 --- a/nonebot/drivers/fastapi.py +++ b/nonebot/drivers/fastapi.py @@ -16,7 +16,7 @@ from typing import List, Optional, Callable import uvicorn from pydantic import BaseSettings from fastapi.responses import Response -from fastapi import Body, status, Request, FastAPI, HTTPException +from fastapi import status, Request, FastAPI, HTTPException from starlette.websockets import WebSocketDisconnect, WebSocket as FastAPIWebSocket from nonebot.log import logger @@ -177,11 +177,11 @@ class Driver(BaseDriver): **kwargs) @overrides(BaseDriver) - async def _handle_http(self, - adapter: str, - request: Request, - data: dict = Body(...)): - if not isinstance(data, dict): + async def _handle_http(self, adapter: str, request: Request): + data = await request.body() + data_dict = json.loads(data.decode()) + + if not isinstance(data_dict, dict): logger.warning("Data received is invalid") raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST) @@ -208,7 +208,7 @@ class Driver(BaseDriver): bot = BotClass("http", x_self_id) - asyncio.create_task(bot.handle_message(data)) + asyncio.create_task(bot.handle_message(data_dict)) return Response("", 204) @overrides(BaseDriver) diff --git a/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py b/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py index 3d440127..ca477559 100644 --- a/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py +++ b/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py @@ -244,7 +244,7 @@ class Bot(BaseBot): @classmethod @overrides(BaseBot) async def check_permission(cls, driver: "Driver", connection_type: str, - headers: dict, body: Optional[dict]) -> str: + headers: dict, body: Optional[bytes]) -> str: """ :说明: @@ -271,14 +271,13 @@ class Bot(BaseBot): if not x_signature: log("WARNING", "Missing Signature Header") raise RequestDenied(401, "Missing Signature") - sig = hmac.new(secret.encode("utf-8"), - json.dumps(body).encode(), "sha1").hexdigest() + sig = hmac.new(secret.encode("utf-8"), body, "sha1").hexdigest() if x_signature != "sha1=" + sig: log("WARNING", "Signature Header is invalid") raise RequestDenied(403, "Signature is invalid") access_token = cqhttp_config.access_token - if access_token and access_token != token: + if access_token and access_token != token and connection_type == "websocket": log( "WARNING", "Authorization Header is invalid" if token else "Missing Authorization Header") diff --git a/packages/nonebot-adapter-ding/nonebot/adapters/ding/bot.py b/packages/nonebot-adapter-ding/nonebot/adapters/ding/bot.py index db2e77d3..08175ce4 100644 --- a/packages/nonebot-adapter-ding/nonebot/adapters/ding/bot.py +++ b/packages/nonebot-adapter-ding/nonebot/adapters/ding/bot.py @@ -1,5 +1,4 @@ -import hmac -import base64 +import json import urllib.parse from datetime import datetime @@ -51,7 +50,7 @@ class Bot(BaseBot): @classmethod @overrides(BaseBot) async def check_permission(cls, driver: "Driver", connection_type: str, - headers: dict, body: Optional[dict]) -> str: + headers: dict, body: Optional[bytes]) -> str: """ :说明: @@ -81,7 +80,7 @@ class Bot(BaseBot): raise RequestDenied(403, "Signature is invalid") else: log("WARNING", "Ding signature check ignored!") - return body["chatbotUserId"] + return json.loads(body.decode())["chatbotUserId"] @overrides(BaseBot) async def handle_message(self, message: dict): diff --git a/packages/nonebot-adapter-ding/nonebot/adapters/ding/utils.py b/packages/nonebot-adapter-ding/nonebot/adapters/ding/utils.py index 13be81d0..5529d42b 100644 --- a/packages/nonebot-adapter-ding/nonebot/adapters/ding/utils.py +++ b/packages/nonebot-adapter-ding/nonebot/adapters/ding/utils.py @@ -1,7 +1,9 @@ import hmac -from nonebot.utils import logger_wrapper -import hashlib import base64 +import hashlib + +from nonebot.utils import logger_wrapper + log = logger_wrapper("DING") diff --git a/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/bot.py b/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/bot.py index 4f5cb196..1b598ebf 100644 --- a/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/bot.py +++ b/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/bot.py @@ -178,7 +178,7 @@ class Bot(BaseBot): @classmethod @overrides(BaseBot) async def check_permission(cls, driver: "Driver", connection_type: str, - headers: dict, body: Optional[dict]) -> str: + headers: dict, body: Optional[bytes]) -> str: if connection_type == 'ws': raise RequestDenied( status_code=501, @@ -224,7 +224,7 @@ class Bot(BaseBot): \:\:\: danger 由于Mirai的HTTP API特殊性, 该API暂时无法实现 \:\:\: - + \:\:\: tip 你可以使用 ``MiraiBot.api`` 中提供的调用方法来代替 \:\:\: @@ -447,7 +447,7 @@ class Bot(BaseBot): :说明: 使用此方法获取bot接收到的最老消息和最老各类事件 - (不会从MiraiApiHttp消息记录中删除) + (不会从MiraiApiHttp消息记录中删除) :参数: @@ -462,7 +462,7 @@ class Bot(BaseBot): 使用此方法获取bot接收到的最新消息和最新各类事件 (不会从MiraiApiHttp消息记录中删除) - + :参数: * ``count: int``: 获取消息和事件的数量 @@ -599,7 +599,7 @@ class Bot(BaseBot): """ :说明: - 使用此方法使Bot退出群聊 + 使用此方法使Bot退出群聊 :参数: diff --git a/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/bot_ws.py b/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/bot_ws.py index 9dabe356..7f990183 100644 --- a/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/bot_ws.py +++ b/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/bot_ws.py @@ -116,7 +116,8 @@ class WebsocketBot(Bot): @classmethod @overrides(Bot) async def check_permission(cls, driver: "Driver", connection_type: str, - headers: dict, body: Optional[dict]) -> NoReturn: + headers: dict, + body: Optional[bytes]) -> NoReturn: raise RequestDenied( status_code=501, reason=f'Connection {connection_type} not implented') @@ -127,7 +128,7 @@ class WebsocketBot(Bot): """ :说明: - 注册该Adapter + 注册该Adapter :参数: From f8c057b1350d993c65ac2b24cf85e906fcfd3084 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sat, 20 Mar 2021 15:05:42 +0800 Subject: [PATCH 14/40] :pushpin: update lock file --- poetry.lock | 20 ++++++++++---------- pyproject.toml | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/poetry.lock b/poetry.lock index d33bbbc2..41f617f8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -235,7 +235,7 @@ reference = "aliyun" [[package]] name = "httpx" -version = "0.17.0" +version = "0.17.1" description = "The next generation HTTP client." category = "dev" optional = false @@ -243,7 +243,7 @@ python-versions = ">=3.6" [package.dependencies] certifi = "*" -httpcore = ">=0.12.0,<0.13.0" +httpcore = ">=0.12.1,<0.13" rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} sniffio = "*" @@ -807,7 +807,7 @@ yapf = "*" [package.source] type = "git" -url = "git@github.com:nonebot/sphinx-markdown-builder.git" +url = "https://github.com/nonebot/sphinx-markdown-builder.git" reference = "master" resolved_reference = "fdbc39e1b50aabf8dbcf129895fbbd02cbf54554" @@ -998,16 +998,16 @@ reference = "aliyun" [[package]] name = "urllib3" -version = "1.26.3" +version = "1.26.4" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" [package.extras] -brotli = ["brotlipy (>=0.6.0)"] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotlipy (>=0.6.0)"] [package.source] type = "legacy" @@ -1155,7 +1155,7 @@ quart = ["Quart"] [metadata] lock-version = "1.1" python-versions = "^3.7.3" -content-hash = "51c469a7330ef3dc06805b771670f2c1526ebfc6e50d7c22571ae3ffc7b0f352" +content-hash = "9907ba758206e19d2c36493252f8b026db796ff4dbc67142824d86da31763919" [metadata.files] aiofiles = [ @@ -1232,8 +1232,8 @@ httptools = [ {file = "httptools-0.1.1.tar.gz", hash = "sha256:41b573cf33f64a8f8f3400d0a7faf48e1888582b6f6e02b82b9bd4f0bf7497ce"}, ] httpx = [ - {file = "httpx-0.17.0-py3-none-any.whl", hash = "sha256:fe19522f7b0861a1f6ac83306360bb5b7fb1ed64633a1a04a33f04102a1bea60"}, - {file = "httpx-0.17.0.tar.gz", hash = "sha256:4f7ab2fef7f929c5531abd4f413b41ce2c820e3202f2eeee498f2d92b6849f8d"}, + {file = "httpx-0.17.1-py3-none-any.whl", hash = "sha256:d379653bd457e8257eb0df99cb94557e4aac441b7ba948e333be969298cac272"}, + {file = "httpx-0.17.1.tar.gz", hash = "sha256:cc2a55188e4b25272d2bcd46379d300f632045de4377682aa98a8a6069d55967"}, ] hypercorn = [ {file = "Hypercorn-0.11.2-py3-none-any.whl", hash = "sha256:8007c10f81566920f8ae12c0e26e146f94ca70506da964b5a727ad610aa1d821"}, @@ -1487,8 +1487,8 @@ untokenize = [ {file = "untokenize-0.1.1.tar.gz", hash = "md5:50d325dff09208c624cc603fad33bb0d"}, ] urllib3 = [ - {file = "urllib3-1.26.3-py2.py3-none-any.whl", hash = "sha256:1b465e494e3e0d8939b50680403e3aedaa2bc434b7d5af64dfd3c958d7f5ae80"}, - {file = "urllib3-1.26.3.tar.gz", hash = "sha256:de3eedaad74a2683334e282005cd8d7f22f4d55fa690a2a1020a416cb0a47e73"}, + {file = "urllib3-1.26.4-py2.py3-none-any.whl", hash = "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df"}, + {file = "urllib3-1.26.4.tar.gz", hash = "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937"}, ] uvicorn = [ {file = "uvicorn-0.13.4-py3-none-any.whl", hash = "sha256:7587f7b08bd1efd2b9bad809a3d333e972f1d11af8a5e52a9371ee3a5de71524"}, diff --git a/pyproject.toml b/pyproject.toml index 283b7927..11ec5be4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ nonebot-plugin-test = "^0.2.0" nonebot-adapter-cqhttp = { path = "./packages/nonebot-adapter-cqhttp", develop = true } nonebot-adapter-ding = { path = "./packages/nonebot-adapter-ding", develop = true } nonebot-adapter-mirai = { path = "./packages/nonebot-adapter-mirai", develop = true } -sphinx-markdown-builder = { git = "git@github.com:nonebot/sphinx-markdown-builder.git" } +sphinx-markdown-builder = { git = "https://github.com/nonebot/sphinx-markdown-builder.git" } [tool.poetry.extras] quart = ["quart"] From 7f27957164df36a9f07dbac8c57961e11a27bc1a Mon Sep 17 00:00:00 2001 From: Reverier-Xu Date: Wed, 10 Mar 2021 01:40:37 +0800 Subject: [PATCH 15/40] :boom: change cqhttp ding session id --- .../nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/event.py | 4 ++++ packages/nonebot-adapter-ding/nonebot/adapters/ding/event.py | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/event.py b/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/event.py index 53497870..e0551279 100644 --- a/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/event.py +++ b/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/event.py @@ -199,6 +199,10 @@ class GroupMessageEvent(MessageEvent): if x.is_text() else f"{escape_tag(str(x))}", self.message)) + '"') + @overrides(MessageEvent) + def get_session_id(self) -> str: + return f"group_{self.group_id}_{self.user_id}" + # Notice Events class NoticeEvent(Event): diff --git a/packages/nonebot-adapter-ding/nonebot/adapters/ding/event.py b/packages/nonebot-adapter-ding/nonebot/adapters/ding/event.py index 7dfdc2e1..e01588a6 100644 --- a/packages/nonebot-adapter-ding/nonebot/adapters/ding/event.py +++ b/packages/nonebot-adapter-ding/nonebot/adapters/ding/event.py @@ -143,3 +143,7 @@ class GroupMessageEvent(MessageEvent): @overrides(MessageEvent) def is_tome(self) -> bool: return self.isInAtList + + @overrides(MessageEvent) + def get_session_id(self) -> str: + return f"group_{self.conversationId}_{self.senderId}" From 1527fb55f50c672ee4ef4cfadf9f1cf517a5d1a5 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sat, 20 Mar 2021 15:41:50 +0800 Subject: [PATCH 16/40] :bulb: update handler docstring --- docs/.vuepress/config.js | 4 ++ docs/api/README.md | 3 ++ docs/api/handler.md | 111 +++++++++++++++++++++++++++++++++++++++ docs_build/README.rst | 1 + docs_build/handler.rst | 13 +++++ nonebot/handler.py | 53 ++++++++++++++++--- nonebot/matcher.py | 2 +- 7 files changed, 179 insertions(+), 8 deletions(-) create mode 100644 docs/api/handler.md create mode 100644 docs_build/handler.rst diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index c2efeb3e..fdfac5b0 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -166,6 +166,10 @@ module.exports = context => ({ title: "nonebot.matcher 模块", path: "matcher" }, + { + title: "nonebot.handler 模块", + path: "handler" + }, { title: "nonebot.rule 模块", path: "rule" diff --git a/docs/api/README.md b/docs/api/README.md index e12dd0ff..3d5a6497 100644 --- a/docs/api/README.md +++ b/docs/api/README.md @@ -19,6 +19,9 @@ * [nonebot.matcher](matcher.html) + * [nonebot.handler](handler.html) + + * [nonebot.rule](rule.html) diff --git a/docs/api/handler.md b/docs/api/handler.md new file mode 100644 index 00000000..dc2ab74f --- /dev/null +++ b/docs/api/handler.md @@ -0,0 +1,111 @@ +--- +contentSidebar: true +sidebarDepth: 0 +--- + +# NoneBot.handler 模块 + +## 事件处理函数 + +该模块实现事件处理函数的封装,以实现动态参数等功能。 + + +## _class_ `Handler` + +基类:`object` + +事件处理函数类 + + +### `__init__(func)` + +装饰事件处理函数以便根据动态参数运行 + + +### `func` + + +* **类型** + + `T_Handler` + + + +* **说明** + + 事件处理函数 + + + +### `signature` + + +* **类型** + + `inspect.Signature` + + + +* **说明** + + 事件处理函数签名 + + + +### _property_ `bot_type` + + +* **类型** + + `Union[Type["Bot"], inspect.Parameter.empty]` + + + +* **说明** + + 事件处理函数接受的 Bot 对象类型 + + + +### _property_ `event_type` + + +* **类型** + + `Optional[Union[Type[Event], inspect.Parameter.empty]]` + + + +* **说明** + + 事件处理函数接受的 event 类型 / 不需要 event 参数 + + + +### _property_ `state_type` + + +* **类型** + + `Optional[Union[T_State, inspect.Parameter.empty]]` + + + +* **说明** + + 事件处理函数是否接受 state 参数 + + + +### _property_ `matcher_type` + + +* **类型** + + `Optional[Union[Type["Matcher"], inspect.Parameter.empty]]` + + + +* **说明** + + 事件处理函数是否接受 matcher 参数 diff --git a/docs_build/README.rst b/docs_build/README.rst index 0e029d9b..745fc781 100644 --- a/docs_build/README.rst +++ b/docs_build/README.rst @@ -7,6 +7,7 @@ NoneBot Api Reference - `nonebot.plugin `_ - `nonebot.message `_ - `nonebot.matcher `_ + - `nonebot.handler `_ - `nonebot.rule `_ - `nonebot.permission `_ - `nonebot.log `_ diff --git a/docs_build/handler.rst b/docs_build/handler.rst new file mode 100644 index 00000000..d7376b97 --- /dev/null +++ b/docs_build/handler.rst @@ -0,0 +1,13 @@ +--- +contentSidebar: true +sidebarDepth: 0 +--- + +NoneBot.handler 模块 +==================== + +.. automodule:: nonebot.handler + :members: + :private-members: + :special-members: __init__ + :show-inheritance: diff --git a/nonebot/handler.py b/nonebot/handler.py index 946b9fe6..366e0bfc 100644 --- a/nonebot/handler.py +++ b/nonebot/handler.py @@ -6,7 +6,6 @@ """ import inspect -from typing_extensions import Literal from typing import Any, List, Dict, Type, Union, Optional, TYPE_CHECKING from typing import ForwardRef, _eval_type # type: ignore @@ -19,13 +18,28 @@ if TYPE_CHECKING: class HandlerMeta(type): - ... + if TYPE_CHECKING: + func: T_Handler + signature: inspect.Signature + bot_type: Type["Bot"] + event_type: Optional[Type["Event"]] + state_type: Optional[T_State] + matcher_type: Optional[Type["Matcher"]] + + def __repr__(self) -> str: + return (f"") + + def __str__(self) -> str: + return self.__repr__() class Handler(metaclass=HandlerMeta): """事件处理函数类""" def __init__(self, func: T_Handler): + """装饰事件处理函数以便根据动态参数运行""" self.func: T_Handler = func """ :类型: ``T_Handler`` @@ -37,6 +51,14 @@ class Handler(metaclass=HandlerMeta): :说明: 事件处理函数签名 """ + def __repr__(self) -> str: + return (f"") + + def __str__(self) -> str: + return self.__repr__() + async def __call__(self, matcher: "Matcher", bot: "Bot", event: "Event", state: T_State): params = { @@ -65,23 +87,40 @@ class Handler(metaclass=HandlerMeta): **{k: v for k, v in args.items() if params[k] is not None}) @property - def bot_type(self) -> Type["Bot"]: + def bot_type(self) -> Union[Type["Bot"], inspect.Parameter.empty]: + """ + :类型: ``Union[Type["Bot"], inspect.Parameter.empty]`` + :说明: 事件处理函数接受的 Bot 对象类型""" return self.signature.parameters["bot"].annotation @property - def event_type(self) -> Optional[Type["Event"]]: + def event_type( + self) -> Optional[Union[Type["Event"], inspect.Parameter.empty]]: + """ + :类型: ``Optional[Union[Type[Event], inspect.Parameter.empty]]`` + :说明: 事件处理函数接受的 event 类型 / 不需要 event 参数 + """ if "event" not in self.signature.parameters: return None return self.signature.parameters["event"].annotation @property - def state_type(self) -> Optional[T_State]: + def state_type(self) -> Optional[Union[T_State, inspect.Parameter.empty]]: + """ + :类型: ``Optional[Union[T_State, inspect.Parameter.empty]]`` + :说明: 事件处理函数是否接受 state 参数 + """ if "state" not in self.signature.parameters: return None return self.signature.parameters["state"].annotation @property - def matcher_type(self) -> Optional[Type["Matcher"]]: + def matcher_type( + self) -> Optional[Union[Type["Matcher"], inspect.Parameter.empty]]: + """ + :类型: ``Optional[Union[Type["Matcher"], inspect.Parameter.empty]]`` + :说明: 事件处理函数是否接受 matcher 参数 + """ if "matcher" not in self.signature.parameters: return None return self.signature.parameters["matcher"].annotation @@ -101,7 +140,7 @@ class Handler(metaclass=HandlerMeta): def update_signature( self, **kwargs: Union[None, Type["Bot"], Type["Event"], Type["Matcher"], - T_State] + T_State, inspect.Parameter.empty] ) -> None: params: List[inspect.Parameter] = [] for param in ["bot", "event", "state", "matcher"]: diff --git a/nonebot/matcher.py b/nonebot/matcher.py index 2aac333c..d59b8871 100644 --- a/nonebot/matcher.py +++ b/nonebot/matcher.py @@ -50,7 +50,7 @@ class MatcherMeta(type): f"temp={self.temp}>") def __str__(self) -> str: - return repr(self) + return self.__repr__() class Matcher(metaclass=MatcherMeta): From a941b32dd5146794bf055593d07fa7f15c376f9c Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sat, 20 Mar 2021 16:28:25 +0800 Subject: [PATCH 17/40] :memo: update changelog --- pages/changelog.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pages/changelog.md b/pages/changelog.md index 713f722d..425a5842 100644 --- a/pages/changelog.md +++ b/pages/changelog.md @@ -4,6 +4,12 @@ sidebar: auto # 更新日志 +## v2.0.0a12 + +- 分离 `handler` 与 `matcher` +- 修复 `cqhttp` secret 校验出错 +- 修复 `pydantic 1.8` 导致的 `alias` 问题 + ## v2.0.0a11 - 修改 `nonebot` 项目结构,分离所有 `adapter` From d738f8674df089235c73d915dfb8a263c5694fad Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sat, 20 Mar 2021 16:38:42 +0800 Subject: [PATCH 18/40] :memo: update doc and chqnglog --- docs/guide/end-or-start.md | 1 - pages/changelog.md | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/end-or-start.md b/docs/guide/end-or-start.md index 9587c4bb..aa072c3d 100644 --- a/docs/guide/end-or-start.md +++ b/docs/guide/end-or-start.md @@ -4,6 +4,5 @@ - 请千万注意事件处理器的优先级设定 - 在匹配规则中请勿使用耗时极长的函数 -- 同一个用户可以**跨群**(**私聊**)继续他的事件处理(除非做出权限限制,将在后续介绍) 如果「指南」还不能满足你,前往 [进阶](../advanced/README.md) 查看更多的功能信息。 diff --git a/pages/changelog.md b/pages/changelog.md index 425a5842..4879acfc 100644 --- a/pages/changelog.md +++ b/pages/changelog.md @@ -9,6 +9,7 @@ sidebar: auto - 分离 `handler` 与 `matcher` - 修复 `cqhttp` secret 校验出错 - 修复 `pydantic 1.8` 导致的 `alias` 问题 +- 修改 `cqhttp` `ding` `session id`,不再允许跨群 ## v2.0.0a11 From 6371cd6bfecceaadf94c09bd356fd0927e401c1c Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Mon, 22 Mar 2021 01:15:15 +0800 Subject: [PATCH 19/40] :bug: fix error matcher module when import --- nonebot/plugin/__init__.py | 11 ++++++++--- nonebot/plugin/manager.py | 32 ++++++++++++++++++++++---------- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/nonebot/plugin/__init__.py b/nonebot/plugin/__init__.py index ded978b4..b17a8190 100644 --- a/nonebot/plugin/__init__.py +++ b/nonebot/plugin/__init__.py @@ -19,7 +19,7 @@ from nonebot.permission import Permission from nonebot.typing import T_State, T_StateFactory, T_Handler, T_RuleChecker from nonebot.rule import Rule, startswith, endswith, keyword, command, shell_command, ArgumentParser, regex -from .manager import PluginManager +from .manager import PluginManager, _current_plugin if TYPE_CHECKING: from nonebot.adapters import Bot, Event @@ -32,6 +32,7 @@ plugins: Dict[str, "Plugin"] = {} PLUGIN_NAMESPACE = "nonebot.loaded_plugins" _export: ContextVar["Export"] = ContextVar("_export") +# FIXME: tmp matchers context var will be removed _tmp_matchers: ContextVar[Set[Type[Matcher]]] = ContextVar("_tmp_matchers") @@ -142,6 +143,7 @@ def on(type: str = "", priority=priority, block=block, handlers=handlers, + module=_current_plugin.get(), default_state=state, default_state_factory=state_factory) _tmp_matchers.get().add(matcher) @@ -183,6 +185,7 @@ def on_metaevent( priority=priority, block=block, handlers=handlers, + module=_current_plugin.get(), default_state=state, default_state_factory=state_factory) _tmp_matchers.get().add(matcher) @@ -225,6 +228,7 @@ def on_message(rule: Optional[Union[Rule, T_RuleChecker]] = None, priority=priority, block=block, handlers=handlers, + module=_current_plugin.get(), default_state=state, default_state_factory=state_factory) _tmp_matchers.get().add(matcher) @@ -265,6 +269,7 @@ def on_notice(rule: Optional[Union[Rule, T_RuleChecker]] = None, priority=priority, block=block, handlers=handlers, + module=_current_plugin.get(), default_state=state, default_state_factory=state_factory) _tmp_matchers.get().add(matcher) @@ -305,6 +310,7 @@ def on_request(rule: Optional[Union[Rule, T_RuleChecker]] = None, priority=priority, block=block, handlers=handlers, + module=_current_plugin.get(), default_state=state, default_state_factory=state_factory) _tmp_matchers.get().add(matcher) @@ -960,8 +966,7 @@ def _load_plugin(manager: PluginManager, plugin_name: str) -> Optional[Plugin]: try: module = manager.load_plugin(plugin_name) - # for m in _tmp_matchers.get(): - # m.module = plugin_name + # FIXME: store matchers using new method plugin = Plugin(plugin_name, module, _tmp_matchers.get(), _export.get()) plugins[plugin_name] = plugin logger.opt( diff --git a/nonebot/plugin/manager.py b/nonebot/plugin/manager.py index bac90246..07c47115 100644 --- a/nonebot/plugin/manager.py +++ b/nonebot/plugin/manager.py @@ -5,10 +5,14 @@ import importlib from hashlib import md5 from types import ModuleType from collections import Counter +from contextvars import ContextVar from importlib.abc import MetaPathFinder -from importlib.machinery import PathFinder, SourceFileLoader +from importlib.machinery import PathFinder, FrozenImporter, SourceFileLoader from typing import Set, List, Optional, Iterable +_current_plugin: ContextVar[Optional[str]] = ContextVar("_current_plugin", + default=None) + _internal_space = ModuleType(__name__ + "._internal") _internal_space.__path__ = [] # type: ignore sys.modules[_internal_space.__name__] = _internal_space @@ -138,7 +142,8 @@ class PluginManager: def load_plugin(self, name) -> ModuleType: if name in self.plugins: - return importlib.import_module(name) + with self: + return importlib.import_module(name) if "." in name: raise ValueError("Plugin name cannot contain '.'") @@ -150,14 +155,15 @@ class PluginManager: return [self.load_plugin(name) for name in self.list_plugins()] def _rewrite_module_name(self, module_name) -> Optional[str]: - if module_name == self.namespace: - return self.internal_module.__name__ - elif module_name.startswith(self.namespace + "."): + prefix = f"{self.internal_module.__name__}." + if module_name.startswith(self.namespace + "."): path = module_name.split(".") length = self.namespace.count(".") + 1 - return f"{self.internal_module.__name__}.{'.'.join(path[length:])}" + return f"{prefix}{'.'.join(path[length:])}" elif module_name in self.search_plugins(): - return f"{self.internal_module.__name__}.{module_name}" + return f"{prefix}{module_name}" + elif module_name in self.plugins or module_name.startswith(prefix): + return module_name return None @@ -170,9 +176,8 @@ class PluginFinder(MetaPathFinder): manager = _manager_stack[index] newname = manager._rewrite_module_name(fullname) if newname: - spec = PathFinder.find_spec(newname, - list(manager.search_path), - target) + spec = PathFinder.find_spec( + newname, [*manager.search_path, *(path or [])], target) if spec: spec.loader = PluginLoader(manager, newname, spec.origin) @@ -186,12 +191,17 @@ class PluginLoader(SourceFileLoader): def __init__(self, manager: PluginManager, fullname: str, path) -> None: self.manager = manager self.loaded = False + self._context_token = None super().__init__(fullname, path) def create_module(self, spec) -> Optional[ModuleType]: if self.name in sys.modules: self.loaded = True return sys.modules[self.name] + prefix = self.manager.internal_module.__name__ + plugin_name = self.name[len(prefix):] if self.name.startswith( + prefix) else self.name + self._context_token = _current_plugin.set(plugin_name.lstrip(".")) # return None to use default module creation return super().create_module(spec) @@ -200,6 +210,8 @@ class PluginLoader(SourceFileLoader): return setattr(module, "__manager__", self.manager) super().exec_module(module) + if self._context_token: + _current_plugin.reset(self._context_token) return From f0a8b47c067a1d493ce28a2eef0e0c932ce96600 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Mon, 22 Mar 2021 01:23:09 +0800 Subject: [PATCH 20/40] :hankey: remove __manager__ --- nonebot/plugin/manager.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nonebot/plugin/manager.py b/nonebot/plugin/manager.py index 07c47115..18b43cf8 100644 --- a/nonebot/plugin/manager.py +++ b/nonebot/plugin/manager.py @@ -208,7 +208,8 @@ class PluginLoader(SourceFileLoader): def exec_module(self, module: ModuleType) -> None: if self.loaded: return - setattr(module, "__manager__", self.manager) + # really need? + # setattr(module, "__manager__", self.manager) super().exec_module(module) if self._context_token: _current_plugin.reset(self._context_token) From 45199a247b477b05aaf321f49396fd22f37dce0c Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Mon, 22 Mar 2021 16:41:29 +0800 Subject: [PATCH 21/40] :bug: fix plugin matcher data --- nonebot/matcher.py | 2 -- nonebot/plugin/__init__.py | 65 +++++++++++++------------------------- 2 files changed, 22 insertions(+), 45 deletions(-) diff --git a/nonebot/matcher.py b/nonebot/matcher.py index d59b8871..b3206e1a 100644 --- a/nonebot/matcher.py +++ b/nonebot/matcher.py @@ -5,8 +5,6 @@ 该模块实现事件响应器的创建与运行,并提供一些快捷方法来帮助用户更好的与机器人进行对话 。 """ -import sys -import inspect from functools import wraps from datetime import datetime from contextvars import ContextVar diff --git a/nonebot/plugin/__init__.py b/nonebot/plugin/__init__.py index b17a8190..1e61d8e1 100644 --- a/nonebot/plugin/__init__.py +++ b/nonebot/plugin/__init__.py @@ -8,6 +8,7 @@ import re import json from types import ModuleType from dataclasses import dataclass +from collections import defaultdict from contextvars import Context, ContextVar, copy_context from typing import Any, Set, List, Dict, Type, Tuple, Union, Optional, TYPE_CHECKING @@ -33,7 +34,7 @@ PLUGIN_NAMESPACE = "nonebot.loaded_plugins" _export: ContextVar["Export"] = ContextVar("_export") # FIXME: tmp matchers context var will be removed -_tmp_matchers: ContextVar[Set[Type[Matcher]]] = ContextVar("_tmp_matchers") +_plugin_matchers: Dict[str, Set[Type[Matcher]]] = defaultdict(set) class Export(dict): @@ -93,17 +94,25 @@ class Plugin(object): - **类型**: ``ModuleType`` - **说明**: 插件模块对象 """ - matcher: Set[Type[Matcher]] - """ - - **类型**: ``Set[Type[Matcher]]`` - - **说明**: 插件内定义的 ``Matcher`` - """ export: Export """ - **类型**: ``Export`` - **说明**: 插件内定义的导出内容 """ + @property + def matcher(self) -> Set[Type[Matcher]]: + """ + - **类型**: ``Set[Type[Matcher]]`` + - **说明**: 插件内定义的 ``Matcher`` + """ + return _plugin_matchers[self.name] + + +def _store_matcher(matcher: Type[Matcher]): + plugin_name = matcher.module.split(".", maxsplit=1)[0] + _plugin_matchers[plugin_name].add(matcher) + def on(type: str = "", rule: Optional[Union[Rule, T_RuleChecker]] = None, @@ -146,7 +155,7 @@ def on(type: str = "", module=_current_plugin.get(), default_state=state, default_state_factory=state_factory) - _tmp_matchers.get().add(matcher) + _store_matcher(matcher) return matcher @@ -188,7 +197,7 @@ def on_metaevent( module=_current_plugin.get(), default_state=state, default_state_factory=state_factory) - _tmp_matchers.get().add(matcher) + _store_matcher(matcher) return matcher @@ -231,7 +240,7 @@ def on_message(rule: Optional[Union[Rule, T_RuleChecker]] = None, module=_current_plugin.get(), default_state=state, default_state_factory=state_factory) - _tmp_matchers.get().add(matcher) + _store_matcher(matcher) return matcher @@ -272,7 +281,7 @@ def on_notice(rule: Optional[Union[Rule, T_RuleChecker]] = None, module=_current_plugin.get(), default_state=state, default_state_factory=state_factory) - _tmp_matchers.get().add(matcher) + _store_matcher(matcher) return matcher @@ -313,7 +322,7 @@ def on_request(rule: Optional[Union[Rule, T_RuleChecker]] = None, module=_current_plugin.get(), default_state=state, default_state_factory=state_factory) - _tmp_matchers.get().add(matcher) + _store_matcher(matcher) return matcher @@ -957,7 +966,6 @@ def _load_plugin(manager: PluginManager, plugin_name: str) -> Optional[Plugin]: if plugin_name.startswith("_"): return None - _tmp_matchers.set(set()) _export.set(Export()) if plugin_name in plugins: @@ -966,8 +974,7 @@ def _load_plugin(manager: PluginManager, plugin_name: str) -> Optional[Plugin]: try: module = manager.load_plugin(plugin_name) - # FIXME: store matchers using new method - plugin = Plugin(plugin_name, module, _tmp_matchers.get(), _export.get()) + plugin = Plugin(plugin_name, module, _export.get()) plugins[plugin_name] = plugin logger.opt( colors=True).info(f'Succeeded to import "{plugin_name}"') @@ -1038,39 +1045,11 @@ def load_all_plugins(module_path: Set[str], - ``Set[Plugin]`` """ - - def _load_plugin(plugin_name: str) -> Optional[Plugin]: - if plugin_name.startswith("_"): - return None - - _tmp_matchers.set(set()) - _export.set(Export()) - - if plugin_name in plugins: - return None - - try: - module = manager.load_plugin(plugin_name) - - for m in _tmp_matchers.get(): - m.module = plugin_name - plugin = Plugin(plugin_name, module, _tmp_matchers.get(), - _export.get()) - plugins[plugin_name] = plugin - logger.opt( - colors=True).info(f'Succeeded to import "{plugin_name}"') - return plugin - except Exception as e: - logger.opt(colors=True, exception=e).error( - f'Failed to import "{plugin_name}"' - ) - return None - loaded_plugins = set() manager = PluginManager(PLUGIN_NAMESPACE, module_path, plugin_dir) for plugin_name in manager.list_plugins(): context: Context = copy_context() - result = context.run(_load_plugin, plugin_name) + result = context.run(_load_plugin, manager, plugin_name) if result: loaded_plugins.add(result) return loaded_plugins From 48fae782d7bf811e60ba9a36e971d8f2bb5a363e Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Mon, 22 Mar 2021 17:27:31 +0800 Subject: [PATCH 22/40] :memo: update plugin doc --- docs/guide/installation.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/guide/installation.md b/docs/guide/installation.md index 1c6b5d38..04e5e7af 100644 --- a/docs/guide/installation.md +++ b/docs/guide/installation.md @@ -68,6 +68,7 @@ pip install . # 不推荐 ``` ## 安装适配器 + 适配器可以通过 `nb-cli` 在创建项目时根据你的选择自动安装,也可以自行使用 `pip` 安装 ```bash @@ -99,6 +100,7 @@ nb plugin install xxx - [NoneBot-Plugin-Docs](https://github.com/nonebot/nonebot2/tree/master/packages/nonebot-plugin-docs) 离线文档插件 - [NoneBot-Plugin-Test](https://github.com/nonebot/plugin-test) 本地机器人测试前端插件 - [NoneBot-Plugin-APScheduler](https://github.com/nonebot/plugin-apscheduler) 定时任务插件 +- [NoneBot-Plugin-LocalStore](https://github.com/nonebot/plugin-localstore) 本地数据文件存储插件 - [NoneBot-Plugin-Sentry](https://github.com/cscs181/QQ-GitHub-Bot/tree/master/src/plugins/nonebot_plugin_sentry) Sentry 在线日志分析插件 - [NoneBot-Plugin-Status](https://github.com/cscs181/QQ-GitHub-Bot/tree/master/src/plugins/nonebot_plugin_status) 服务器状态查看插件 From b7e5ce88eaec204070692aa15c50d296c8646030 Mon Sep 17 00:00:00 2001 From: StarHeartHunt Date: Tue, 23 Mar 2021 23:02:37 +0800 Subject: [PATCH 23/40] :memo: Correct params of hook functions --- archive/2.0.0a11/advanced/runtime-hook.md | 8 ++++---- docs/advanced/runtime-hook.md | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/archive/2.0.0a11/advanced/runtime-hook.md b/archive/2.0.0a11/advanced/runtime-hook.md index b5cc8b6d..9145cd8f 100644 --- a/archive/2.0.0a11/advanced/runtime-hook.md +++ b/archive/2.0.0a11/advanced/runtime-hook.md @@ -15,7 +15,7 @@ from nonebot.exception import IgnoredException @event_preprocessor -async def do_something(matcher: Matcher, bot: Bot, event: Event, state: T_State): +async def do_something(bot: Bot, event: Event, state: T_State): raise IgnoredException("reason") ``` ::: @@ -26,7 +26,7 @@ async def do_something(matcher: Matcher, bot: Bot, event: Event, state: T_State) from nonebot.message import event_preprocessor @event_preprocessor -async def do_something(matcher: Matcher, bot: Bot, event: Event, state: T_State): +async def do_something(bot: Bot, event: Event, state: T_State): pass ``` @@ -36,7 +36,7 @@ async def do_something(matcher: Matcher, bot: Bot, event: Event, state: T_State) from nonebot.message import event_postprocessor @event_postprocessor -async def do_something(matcher: Matcher, bot: Bot, event: Event, state: T_State): +async def do_something(bot: Bot, event: Event, state: T_State): pass ``` @@ -55,6 +55,6 @@ async def do_something(matcher: Matcher, bot: Bot, event: Event, state: T_State) from nonebot.message import run_postprocessor @run_postprocessor -async def do_something(matcher: Matcher, bot: Bot, event: Event, state: T_State): +async def do_something(matcher: Matcher, exception: Optional[Exception], bot: Bot, event: Event, state: T_State): pass ``` \ No newline at end of file diff --git a/docs/advanced/runtime-hook.md b/docs/advanced/runtime-hook.md index b5cc8b6d..9145cd8f 100644 --- a/docs/advanced/runtime-hook.md +++ b/docs/advanced/runtime-hook.md @@ -15,7 +15,7 @@ from nonebot.exception import IgnoredException @event_preprocessor -async def do_something(matcher: Matcher, bot: Bot, event: Event, state: T_State): +async def do_something(bot: Bot, event: Event, state: T_State): raise IgnoredException("reason") ``` ::: @@ -26,7 +26,7 @@ async def do_something(matcher: Matcher, bot: Bot, event: Event, state: T_State) from nonebot.message import event_preprocessor @event_preprocessor -async def do_something(matcher: Matcher, bot: Bot, event: Event, state: T_State): +async def do_something(bot: Bot, event: Event, state: T_State): pass ``` @@ -36,7 +36,7 @@ async def do_something(matcher: Matcher, bot: Bot, event: Event, state: T_State) from nonebot.message import event_postprocessor @event_postprocessor -async def do_something(matcher: Matcher, bot: Bot, event: Event, state: T_State): +async def do_something(bot: Bot, event: Event, state: T_State): pass ``` @@ -55,6 +55,6 @@ async def do_something(matcher: Matcher, bot: Bot, event: Event, state: T_State) from nonebot.message import run_postprocessor @run_postprocessor -async def do_something(matcher: Matcher, bot: Bot, event: Event, state: T_State): +async def do_something(matcher: Matcher, exception: Optional[Exception], bot: Bot, event: Event, state: T_State): pass ``` \ No newline at end of file From 696ae2da6b543682019b5ae3308f799226119795 Mon Sep 17 00:00:00 2001 From: StarHeartHunt Date: Tue, 23 Mar 2021 15:11:34 +0000 Subject: [PATCH 24/40] :memo: update api docs --- docs/api/plugin.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/api/plugin.md b/docs/api/plugin.md index cc785f1f..59a8fd78 100644 --- a/docs/api/plugin.md +++ b/docs/api/plugin.md @@ -82,15 +82,6 @@ def something_else(): * **说明**: 插件模块对象 -### `matcher` - - -* **类型**: `Set[Type[Matcher]]` - - -* **说明**: 插件内定义的 `Matcher` - - ### `export` @@ -100,6 +91,15 @@ def something_else(): * **说明**: 插件内定义的导出内容 +### _property_ `matcher` + + +* **类型**: `Set[Type[Matcher]]` + + +* **说明**: 插件内定义的 `Matcher` + + ## `on(type='', rule=None, permission=None, *, handlers=None, temp=False, priority=1, block=False, state=None, state_factory=None)` From f00ce8b4f626bf38e817d737db4573fa6501a3b7 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Wed, 24 Mar 2021 00:28:37 +0800 Subject: [PATCH 25/40] :bug: matcher.send returned none --- nonebot/adapters/_base.py | 7 ++++--- nonebot/matcher.py | 15 +++++++++------ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/nonebot/adapters/_base.py b/nonebot/adapters/_base.py index dc2d663a..8f4c2898 100644 --- a/nonebot/adapters/_base.py +++ b/nonebot/adapters/_base.py @@ -109,7 +109,7 @@ class Bot(abc.ABC): raise NotImplementedError @abc.abstractmethod - async def call_api(self, api: str, **data): + async def call_api(self, api: str, **data) -> Any: """ :说明: @@ -130,8 +130,9 @@ class Bot(abc.ABC): raise NotImplementedError @abc.abstractmethod - async def send(self, event: "Event", - message: Union[str, "Message", "MessageSegment"], **kwargs): + async def send(self, event: "Event", message: Union[str, "Message", + "MessageSegment"], + **kwargs) -> Any: """ :说明: diff --git a/nonebot/matcher.py b/nonebot/matcher.py index b3206e1a..61ab40ae 100644 --- a/nonebot/matcher.py +++ b/nonebot/matcher.py @@ -9,14 +9,17 @@ from functools import wraps from datetime import datetime from contextvars import ContextVar from collections import defaultdict -from typing import Type, List, Dict, Union, Mapping, Iterable, Callable, Optional, NoReturn, TYPE_CHECKING +from typing import (Any, Type, List, Dict, Union, Mapping, Iterable, Callable, + Optional, NoReturn, TYPE_CHECKING) from nonebot.rule import Rule from nonebot.log import logger from nonebot.handler import Handler from nonebot.permission import Permission, USER -from nonebot.typing import T_State, T_StateFactory, T_Handler, T_ArgsParser, T_TypeUpdater, T_PermissionUpdater -from nonebot.exception import PausedException, RejectedException, FinishedException, StopPropagation +from nonebot.typing import (T_State, T_StateFactory, T_Handler, T_ArgsParser, + T_TypeUpdater, T_PermissionUpdater) +from nonebot.exception import (PausedException, RejectedException, + FinishedException, StopPropagation) if TYPE_CHECKING: from nonebot.adapters import Bot, Event, Message, MessageSegment @@ -437,7 +440,7 @@ class Matcher(metaclass=MatcherMeta): @classmethod async def send(cls, message: Union[str, "Message", "MessageSegment"], - **kwargs): + **kwargs) -> Any: """ :说明: @@ -448,9 +451,9 @@ class Matcher(metaclass=MatcherMeta): * ``message: Union[str, Message, MessageSegment]``: 消息内容 * ``**kwargs``: 其他传递给 ``bot.send`` 的参数,请参考对应 adapter 的 bot 对象 api """ - bot = current_bot.get() + bot: "Bot" = current_bot.get() event = current_event.get() - await bot.send(event=event, message=message, **kwargs) + return await bot.send(event=event, message=message, **kwargs) @classmethod async def finish(cls, From 2dc71079908c7c239790cf7514ba74a46120f27c Mon Sep 17 00:00:00 2001 From: AkiraXie Date: Wed, 24 Mar 2021 19:52:47 +0800 Subject: [PATCH 26/40] :memo: update hook docs --- docs/advanced/README.md | 18 +++++-- docs/advanced/runtime-hook.md | 95 +++++++++++++++++++++++++++++++---- 2 files changed, 99 insertions(+), 14 deletions(-) diff --git a/docs/advanced/README.md b/docs/advanced/README.md index 6d34007c..6bdba844 100644 --- a/docs/advanced/README.md +++ b/docs/advanced/README.md @@ -10,9 +10,17 @@ **便捷起见,以下内容对 `Nonebot2` 会被称为 `nonebot`,与 `Nonebot2` 交互的机器人实现会被称为 `协议端`**。 -在实际应用中,`nonebot` 会充当一个高性能,轻量级的 Python 微服务框架。协议端可以通过 `http`, `websocket` 等方式与之通信,这个通信往往是双向的:一方面,协议端可以上报数据给 `nonebot`,`nonebot` 会处理数据并返回响应给协议端;另一方面,`nonebot` 可以主动推送数据给协议端。而 `nonebot` 便是围绕上述的双向通信进行工作的。 +在实际应用中,`nonebot` 会充当一个高性能,轻量级的 Python 微服务框架。协议端可以通过 `http`, `websocket` 等方式与之通信,这个通信往往是双向的:一方面,协议端可以上报数据给 `nonebot`,`nonebot` 会处理数据并返回响应给协议端;另一方面,`nonebot` 可以主动推送数据给协议端。而 `nonebot` 便是围绕双向通信进行工作的。 -在开始工作之前,`nonebot` 会依照**配置文件或初始化配置**启动,并会注册**协议适配器** `adapter`,之后便会加载**插件**, 随后,倘若一个协议端与 `nonebot` 进行了连接,`nonebot` 的后端驱动 `driver` 就会将 `adapter` 实例化为 `bot`,`nonebot` 便会利用 `bot` 开始工作,它的工作内容分为两个方面: +在开始工作之前,`nonebot` 需要进行准备工作: + +1. **运行 `nonebot.init` 初始化函数**,它会读取配置文件,并初始化 `nonebot` 和后端驱动 `driver` 对象。 +2. **注册协议适配器 `adapter`** 。 +3. **加载插件**。 + +准备工作完成后,`nonebot` 会利用 `uvicorn` 启动,并运行 `on_startup` 钩子函数。 + +随后,倘若一个协议端与 `nonebot` 进行了连接,`nonebot` 的后端驱动 `driver` 就会将 `adapter` 实例化为 `bot`,`nonebot` 便会利用 `bot` 开始工作,它的工作内容分为两个方面: 1. **事件处理**,`bot` 会将协议端上报的数据转化为 `事件`(`Event`),之后 `nonebot` 会根据一套既定流程来处理 `事件`。 @@ -41,7 +49,7 @@ 1. 协议端会通过 `websocket` 或者 `http` 等方式与 `nonebot` 的后端驱动 `driver` 连接,`driver` 会根据之前注册的 `adapter` 和配置文件的内容来进行鉴权,从而获得这个连接的唯一识别 id `self-id`,随后 `adapter` 就会利用 `self-id` 实例化为 `bot` 对象。 ::: tip - 需要注意的是,如果协议端通过 `websocket` 与 `nonebot` 连接,这个步骤只会在建立连接时进行;通过 `http` 方式连接时,会在协议端每次上报数据时都进行这个步骤。 + 需要注意的是,如果协议端通过 `websocket` 与 `nonebot` 连接,这个步骤只会在建立连接时进行,并在之后运行 `on_bot_connect` 钩子函数;通过 `http` 方式连接时,会在协议端每次上报数据时都进行这个步骤。 ::: ::: warning @@ -142,7 +150,7 @@ 这个异常可以在 `handler` 中由 `Matcher.reject` 抛出。 - 当 `nonebot` 捕获到它时,会停止运行当前 `handler` 并结束当前 `matcher` 的运行,并将**当前 handler 和后续 `handler`**交给一个临时 `Matcher` 来响应当前交互用户的下一个消息事件,当临时 `Matcher` 响应时,临时 `Matcher` 会运行当前 `handler` 和后续的 `handler`。 + 当 `nonebot` 捕获到它时,会停止运行当前 `handler` 并结束当前 `matcher` 的运行,并将当前 handler 和后续 `handler` 交给一个临时 `Matcher` 来响应当前交互用户的下一个消息事件,当临时 `Matcher` 响应时,临时 `Matcher` 会运行当前 `handler` 和后续的 `handler`。 4. **FinishedException** @@ -158,7 +166,7 @@ ## 调用 API -`nonebot` 可以通过 `bot` 来调用 API,API 可以向协议端发送数据,也可以向协议端请求更多的数据。 +`nonebot` 可以通过 `bot` 来调用 `API` ,`API` 可以向协议端发送数据,也可以向协议端请求更多的数据。 ::: tip 不同 `adapter` 规定了不同的 API,对应的 API 列表请参照协议规范。 diff --git a/docs/advanced/runtime-hook.md b/docs/advanced/runtime-hook.md index 9145cd8f..c5d6918e 100644 --- a/docs/advanced/runtime-hook.md +++ b/docs/advanced/runtime-hook.md @@ -4,12 +4,77 @@ > 钩子编程(hooking),也称作“挂钩”,是计算机程序设计术语,指通过拦截软件模块间的函数调用、消息传递、事件传递来修改或扩展操作系统、应用程序或其他软件组件的行为的各种技术。处理被拦截的函数调用、事件、消息的代码,被称为钩子(hook)。 -在 `nonebot2` 中有一系列预定义的钩子函数,这些函数位于 [`nonebot.message`](https://v2.nonebot.dev/api/message.html) 模块下,我们可以以装饰器的形式利用这些函数,进行以下四种操作: +在 `nonebot2` 中有一系列预定义的钩子函数,分为两类:`全局钩子函数` 和 `事件钩子函数` ,这些钩子函数可以用装饰器的形式来使用。 -:::warning 注意 -1.在钩子函数中,与 `matcher` 运行状态相关的函数将不可用,如 `matcher.finish()` +## 全局钩子函数 + +全局钩子函数是指 `nonebot2` 针对其本身运行过程的钩子函数。 + +这些钩子函数是由其后端驱动 `driver`来运行的,故需要先获得全局 `driver` 对象: + +```python +from nonebot import get_driver + + +driver=get_driver() +``` + +共分为四种函数: + +### 启动准备 + +这个钩子函数会在 `nonebot2` 启动时运行。 + +```python +@driver.on_startup +async def do_something(): + pass +``` + +### 终止处理 + +这个钩子函数会在 `nonebot2` 终止时运行。 + +```python +@driver.on_shutdown +async def do_something(): + pass +``` + +### bot 连接处理 + +这个钩子函数会在 `bot` 通过 `websocket` 连接到 `nonebot2` 时运行。 + +```python +@driver.on_bot_connect +async def do_something(bot: Bot): + pass +``` + +### bot 断开处理 + +这个钩子函数会在 `bot` 断开与 `nonebot2` 的`websocket` 连接时运行。 + +```python +@driver.on_bot_disconnect +async def do_something(bot: Bot): + pass +``` + +## 事件处理钩子 + +这些钩子函数指的是影响 `nonebot2` 进行 `事件处理` 的函数。 + +:::tip 提示 + +关于 `事件处理` 的流程,可以在[这里](./README)查阅。 + +::: + +:::warning 注意 1.在事件处理钩子函数中,与 `matcher` 运行状态相关的函数将不可用,如 `matcher.finish()` + +2.如果需要在事件处理钩子函数中打断整个对话的执行,请参考以下范例: -2.如果需要在钩子函数中打断整个对话的执行,请参考以下范例: ```python from nonebot.exception import IgnoredException @@ -18,9 +83,14 @@ from nonebot.exception import IgnoredException async def do_something(bot: Bot, event: Event, state: T_State): raise IgnoredException("reason") ``` + ::: -## 事件预处理 +共分为四种函数: + +### 事件预处理 + +这个钩子函数会在 `Event` 上报到 `nonebot2` 时运行 ```python from nonebot.message import event_preprocessor @@ -30,7 +100,9 @@ async def do_something(bot: Bot, event: Event, state: T_State): pass ``` -## 事件后处理 +### 事件后处理 + +这个钩子函数会在 `nonebot2` 处理 `Event` 后运行 ```python from nonebot.message import event_postprocessor @@ -40,7 +112,9 @@ async def do_something(bot: Bot, event: Event, state: T_State): pass ``` -## 运行预处理 +### 运行预处理 + +这个钩子函数会在 `nonebot2`运行 `matcher` 前运行。 ```python from nonebot.message import run_preprocessor @@ -50,11 +124,14 @@ async def do_something(matcher: Matcher, bot: Bot, event: Event, state: T_State) pass ``` -## 运行后处理 +### 运行后处理 + +这个钩子函数会在 `nonebot2`运行 `matcher` 后运行。 + ```python from nonebot.message import run_postprocessor @run_postprocessor async def do_something(matcher: Matcher, exception: Optional[Exception], bot: Bot, event: Event, state: T_State): pass -``` \ No newline at end of file +``` From 430b3467cc6268447aaea069be5c7265435e09f1 Mon Sep 17 00:00:00 2001 From: AkiraXie Date: Wed, 24 Mar 2021 20:04:48 +0800 Subject: [PATCH 27/40] :memo: fix typo --- docs/advanced/runtime-hook.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/advanced/runtime-hook.md b/docs/advanced/runtime-hook.md index c5d6918e..7d157891 100644 --- a/docs/advanced/runtime-hook.md +++ b/docs/advanced/runtime-hook.md @@ -53,7 +53,7 @@ async def do_something(bot: Bot): ### bot 断开处理 -这个钩子函数会在 `bot` 断开与 `nonebot2` 的`websocket` 连接时运行。 +这个钩子函数会在 `bot` 断开与 `nonebot2` 的 `websocket` 连接时运行。 ```python @driver.on_bot_disconnect @@ -71,7 +71,9 @@ async def do_something(bot: Bot): ::: -:::warning 注意 1.在事件处理钩子函数中,与 `matcher` 运行状态相关的函数将不可用,如 `matcher.finish()` +:::warning 注意 + +1.在事件处理钩子函数中,与 `matcher` 运行状态相关的函数将不可用,如 `matcher.finish()` 2.如果需要在事件处理钩子函数中打断整个对话的执行,请参考以下范例: From b861149e0b763588128be56ae63154f43e497cce Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Thu, 25 Mar 2021 18:22:56 +0800 Subject: [PATCH 28/40] :sparkles: add argparse help message --- nonebot/handler.py | 23 +++++++++++------------ nonebot/matcher.py | 4 ++-- nonebot/rule.py | 8 ++++++-- tests/test_plugins/test_delete.py | 2 +- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/nonebot/handler.py b/nonebot/handler.py index 366e0bfc..acc35165 100644 --- a/nonebot/handler.py +++ b/nonebot/handler.py @@ -32,7 +32,7 @@ class HandlerMeta(type): f"matcher: {self.matcher_type})>") def __str__(self) -> str: - return self.__repr__() + return repr(self) class Handler(metaclass=HandlerMeta): @@ -57,25 +57,20 @@ class Handler(metaclass=HandlerMeta): f"matcher: {self.matcher_type})>") def __str__(self) -> str: - return self.__repr__() + return repr(self) async def __call__(self, matcher: "Matcher", bot: "Bot", event: "Event", state: T_State): - params = { - param.name: param.annotation - for param in self.signature.parameters.values() - } - - BotType = ((params["bot"] is not inspect.Parameter.empty) and - inspect.isclass(params["bot"]) and params["bot"]) + BotType = ((self.bot_type is not inspect.Parameter.empty) and + inspect.isclass(self.bot_type) and self.bot_type) if BotType and not isinstance(bot, BotType): logger.debug( f"Matcher {matcher} bot type {type(bot)} not match annotation {BotType}, ignored" ) return - EventType = ((params["event"] is not inspect.Parameter.empty) and - inspect.isclass(params["event"]) and params["event"]) + EventType = ((self.event_type is not inspect.Parameter.empty) and + inspect.isclass(self.event_type) and self.event_type) if EventType and not isinstance(event, EventType): logger.debug( f"Matcher {matcher} event type {type(event)} not match annotation {EventType}, ignored" @@ -84,7 +79,11 @@ class Handler(metaclass=HandlerMeta): args = {"bot": bot, "event": event, "state": state, "matcher": matcher} await self.func( - **{k: v for k, v in args.items() if params[k] is not None}) + **{ + k: v + for k, v in args.items() + if self.signature.parameters.get(k, None) is not None + }) @property def bot_type(self) -> Union[Type["Bot"], inspect.Parameter.empty]: diff --git a/nonebot/matcher.py b/nonebot/matcher.py index 61ab40ae..771fcc65 100644 --- a/nonebot/matcher.py +++ b/nonebot/matcher.py @@ -51,7 +51,7 @@ class MatcherMeta(type): f"temp={self.temp}>") def __str__(self) -> str: - return self.__repr__() + return repr(self) class Matcher(metaclass=MatcherMeta): @@ -140,7 +140,7 @@ class Matcher(metaclass=MatcherMeta): f"priority={self.priority}, temp={self.temp}>") def __str__(self) -> str: - return self.__repr__() + return repr(self) @classmethod def new(cls, diff --git a/nonebot/rule.py b/nonebot/rule.py index 75022335..9d5d7051 100644 --- a/nonebot/rule.py +++ b/nonebot/rule.py @@ -287,7 +287,11 @@ class ArgumentParser(ArgParser): """ def _print_message(self, message, file=None): - pass + old_message: str = getattr(self, "message", "") + if old_message: + old_message += "\n" + old_message += message + setattr(self, "message", old_message) def exit(self, status=0, message=None): raise ParserExit(status=status, message=message) @@ -365,7 +369,7 @@ def shell_command(*cmds: Union[str, Tuple[str, ...]], args = parser.parse_args(state["argv"]) state["args"] = args except ParserExit as e: - state["args"] = e + state["args"] = getattr(parser, "message", None) or e return True else: return False diff --git a/tests/test_plugins/test_delete.py b/tests/test_plugins/test_delete.py index 2c3265d8..4530771d 100644 --- a/tests/test_plugins/test_delete.py +++ b/tests/test_plugins/test_delete.py @@ -24,7 +24,7 @@ async def test_b(bot: Bot, event: Event, state: T_State): print("======== B Running Completed ========") -c = on_message(priority=0, permission=USER(1111111111)) +c = on_message(priority=0, permission=USER("1111111111")) @c.handle() From 1f585d8bcb7241d15cd7b0a80a73c976e2196b80 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Fri, 26 Mar 2021 11:25:13 +0800 Subject: [PATCH 29/40] :zap: store message in ParserExit exception --- nonebot/rule.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/nonebot/rule.py b/nonebot/rule.py index 9d5d7051..72af1601 100644 --- a/nonebot/rule.py +++ b/nonebot/rule.py @@ -294,7 +294,8 @@ class ArgumentParser(ArgParser): setattr(self, "message", old_message) def exit(self, status=0, message=None): - raise ParserExit(status=status, message=message) + raise ParserExit(status=status, + message=message or getattr(self, "message", None)) def parse_args(self, args: Optional[Sequence[str]] = None, @@ -369,7 +370,7 @@ def shell_command(*cmds: Union[str, Tuple[str, ...]], args = parser.parse_args(state["argv"]) state["args"] = args except ParserExit as e: - state["args"] = getattr(parser, "message", None) or e + state["args"] = e return True else: return False From 65ec4828a955504118e432d4ea919ecc2634608f Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Fri, 26 Mar 2021 14:27:05 +0800 Subject: [PATCH 30/40] :memo: update changelog --- pages/changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/pages/changelog.md b/pages/changelog.md index 4879acfc..ab414e00 100644 --- a/pages/changelog.md +++ b/pages/changelog.md @@ -10,6 +10,7 @@ sidebar: auto - 修复 `cqhttp` secret 校验出错 - 修复 `pydantic 1.8` 导致的 `alias` 问题 - 修改 `cqhttp` `ding` `session id`,不再允许跨群 +- 修改 `shell_command` 存储 message ## v2.0.0a11 From 43b185a3b8504a4030e8b897a98b443c17cbe8ef Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sat, 27 Mar 2021 14:42:43 +0800 Subject: [PATCH 31/40] :loud_sound: add log for event handle --- nonebot/message.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/nonebot/message.py b/nonebot/message.py index cc226875..469b1df2 100644 --- a/nonebot/message.py +++ b/nonebot/message.py @@ -205,7 +205,8 @@ async def handle_event(bot: "Bot", event: "Event"): coros = list(map(lambda x: x(bot, event, state), _event_preprocessors)) if coros: try: - logger.debug("Running PreProcessors...") + if show_log: + logger.debug("Running PreProcessors...") await asyncio.gather(*coros) except IgnoredException: logger.opt(colors=True).info( @@ -240,11 +241,16 @@ async def handle_event(bot: "Bot", event: "Event"): if not break_flag: break_flag = True logger.debug("Stop event propagation") + elif isinstance(result, Exception): + logger.opt(colors=True, exception=result).error( + "Error when checking Matcher." + ) coros = list(map(lambda x: x(bot, event, state), _event_postprocessors)) if coros: try: - logger.debug("Running PostProcessors...") + if show_log: + logger.debug("Running PostProcessors...") await asyncio.gather(*coros) except Exception as e: logger.opt(colors=True, exception=e).error( From ade5d923abe506eebaa44c3f83eb6cd922a95e85 Mon Sep 17 00:00:00 2001 From: SinonJZH <44700327+SinonJZH@users.noreply.github.com> Date: Mon, 29 Mar 2021 21:02:50 +0800 Subject: [PATCH 32/40] :bug: fix mirai message chain empty --- .../nonebot/adapters/mirai/utils.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/utils.py b/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/utils.py index 74ad9f6e..14879170 100644 --- a/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/utils.py +++ b/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/utils.py @@ -11,7 +11,7 @@ from nonebot.message import handle_event from nonebot.utils import escape_tag, logger_wrapper from .event import Event, GroupMessage, MessageEvent, MessageSource -from .message import MessageType +from .message import MessageType, MessageSegment if TYPE_CHECKING: from .bot import Bot @@ -64,7 +64,7 @@ class ActionFailed(exception.ActionFailed): class InvalidArgument(exception.AdapterException): """ :说明: - + 调用API的参数出错 """ @@ -106,7 +106,7 @@ def argument_validation(function: _AnyCallable) -> _AnyCallable: :说明: 通过函数签名中的类型注解来对传入参数进行运行时校验 - + 会在参数出错时释放 ``InvalidArgument`` 异常 """ function = validate_arguments(config={ @@ -138,6 +138,8 @@ def process_at(bot: "Bot", event: GroupMessage) -> GroupMessage: event.to_me = True else: event.message_chain.insert(0, at) + if not event.message_chain: + event.message_chain.append(MessageSegment.plain('')) return event @@ -175,4 +177,4 @@ async def process_event(bot: "Bot", event: Event) -> None: event = process_nick(bot, event) event = process_at(bot, event) event = process_reply(bot, event) - await handle_event(bot, event) \ No newline at end of file + await handle_event(bot, event) From 4e7592de98f6bb17f108d1c8b6d12e159f2ee863 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Tue, 30 Mar 2021 16:21:56 +0800 Subject: [PATCH 33/40] :lock: ensure cqhttp str radd escaped --- .../nonebot/adapters/cqhttp/message.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/message.py b/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/message.py index 07c463c5..acdef22e 100644 --- a/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/message.py +++ b/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/message.py @@ -38,7 +38,8 @@ class MessageSegment(BaseMessageSegment): @overrides(BaseMessageSegment) def __radd__(self, other) -> "Message": - return Message(other) + self + return (MessageSegment.text(other) + if isinstance(other, str) else Message(other)) + self @overrides(BaseMessageSegment) def is_text(self) -> bool: @@ -211,6 +212,11 @@ class Message(BaseMessage): CQHTTP 协议 Message 适配。 """ + def __radd__(self, other: Union[str, MessageSegment, + "Message"]) -> "Message": + result = MessageSegment.text(other) if isinstance(other, str) else other + return super(Message, self).__radd__(result) + @staticmethod @overrides(BaseMessage) def _construct( From 8f99b01fb5374a1a015a76cd0cd980a31abf78a3 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Wed, 31 Mar 2021 16:51:09 +0800 Subject: [PATCH 34/40] :alembic: add call_api hook --- docs/api/adapters/README.md | 39 +++++++++++- docs/api/adapters/ding.md | 3 + nonebot/adapters/_base.py | 58 ++++++++++++++++-- nonebot/typing.py | 1 + .../nonebot/adapters/cqhttp/bot.py | 50 ++++++++-------- .../nonebot/adapters/cqhttp/bot.pyi | 3 +- .../nonebot/adapters/ding/bot.py | 59 ++++++++++--------- .../nonebot/adapters/mirai/bot.py | 4 ++ 8 files changed, 157 insertions(+), 60 deletions(-) diff --git a/docs/api/adapters/README.md b/docs/api/adapters/README.md index 05fe3b49..bd4aab2a 100644 --- a/docs/api/adapters/README.md +++ b/docs/api/adapters/README.md @@ -27,6 +27,21 @@ Driver 对象 Config 配置对象 +### `_call_api_hook` + + +* **类型** + + `Set[T_CallingAPIHook]` + + + +* **说明** + + call_api 时执行的函数 + + + ### _abstract_ `__init__(connection_type, self_id, *, websocket=None)` @@ -127,7 +142,26 @@ Adapter 类型 -### _abstract async_ `call_api(api, **data)` +### _abstract async_ `_call_api(api, **data)` + + +* **说明** + + `adapter` 实际调用 api 的逻辑实现函数,实现该方法以调用 api。 + + + +* **参数** + + + * `api: str`: API 名称 + + + * `**data`: API 数据 + + + +### _async_ `call_api(api, **data)` * **说明** @@ -142,6 +176,9 @@ Adapter 类型 * `api: str`: API 名称 + * `self_id: Optional[str]`: 指定调用 API 的机器人 + + * `**data`: API 数据 diff --git a/docs/api/adapters/ding.md b/docs/api/adapters/ding.md index 7cfe5932..2c531a7b 100644 --- a/docs/api/adapters/ding.md +++ b/docs/api/adapters/ding.md @@ -129,6 +129,9 @@ sidebarDepth: 0 * `api: str`: API 名称 + * `event: Optional[MessageEvent]`: Event 对象 + + * `**data: Any`: API 参数 diff --git a/nonebot/adapters/_base.py b/nonebot/adapters/_base.py index 8f4c2898..d36407a9 100644 --- a/nonebot/adapters/_base.py +++ b/nonebot/adapters/_base.py @@ -6,20 +6,30 @@ """ import abc +import asyncio from copy import copy from functools import reduce, partial from dataclasses import dataclass, field -from typing import Any, Dict, Union, TypeVar, Mapping, Optional, Callable, Iterable, Iterator, Awaitable, TYPE_CHECKING +from typing import (Any, Set, Dict, Union, TypeVar, Mapping, Optional, Iterable, + Protocol, Awaitable, TYPE_CHECKING) from pydantic import BaseModel +from nonebot.log import logger from nonebot.utils import DataclassEncoder +from nonebot.typing import T_CallingAPIHook if TYPE_CHECKING: from nonebot.config import Config from nonebot.drivers import Driver, WebSocket +class _ApiCall(Protocol): + + def __call__(self, **kwargs: Any) -> Awaitable[Any]: + ... + + class Bot(abc.ABC): """ Bot 基类。用于处理上报消息,并提供 API 调用接口。 @@ -29,6 +39,11 @@ class Bot(abc.ABC): """Driver 对象""" config: "Config" """Config 配置对象""" + _call_api_hook: Set[T_CallingAPIHook] = set() + """ + :类型: ``Set[T_CallingAPIHook]`` + :说明: call_api 时执行的函数 + """ @abc.abstractmethod def __init__(self, @@ -50,7 +65,7 @@ class Bot(abc.ABC): self.websocket = websocket """Websocket 连接对象""" - def __getattr__(self, name: str) -> Callable[..., Awaitable[Any]]: + def __getattr__(self, name: str) -> _ApiCall: return partial(self.call_api, name) @property @@ -109,7 +124,20 @@ class Bot(abc.ABC): raise NotImplementedError @abc.abstractmethod - async def call_api(self, api: str, **data) -> Any: + async def _call_api(self, api: str, **data) -> Any: + """ + :说明: + + ``adapter`` 实际调用 api 的逻辑实现函数,实现该方法以调用 api。 + + :参数: + + * ``api: str``: API 名称 + * ``**data``: API 数据 + """ + raise NotImplementedError + + async def call_api(self, api: str, **data: Any) -> Any: """ :说明: @@ -118,6 +146,7 @@ class Bot(abc.ABC): :参数: * ``api: str``: API 名称 + * ``self_id: Optional[str]``: 指定调用 API 的机器人 * ``**data``: API 数据 :示例: @@ -127,7 +156,23 @@ class Bot(abc.ABC): await bot.call_api("send_msg", message="hello world") await bot.send_msg(message="hello world") """ - raise NotImplementedError + coros = list(map(lambda x: x(api, data), self._call_api_hook)) + if coros: + try: + logger.debug("Running CallingAPI hooks...") + await asyncio.gather(*coros) + except Exception as e: + logger.opt(colors=True, exception=e).error( + "Error when running CallingAPI hook. " + "Running cancelled!") + + if "self_id" in data: + self_id = data.pop("self_id") + if self_id: + bot = self.driver.bots[str(self_id)] + return await bot._call_api(api, **data) + + return await self._call_api(api, **data) @abc.abstractmethod async def send(self, event: "Event", message: Union[str, "Message", @@ -146,6 +191,11 @@ class Bot(abc.ABC): """ raise NotImplementedError + @classmethod + def on_calling_api(cls, func: T_CallingAPIHook) -> T_CallingAPIHook: + cls._call_api_hook.add(func) + return func + T_Message = TypeVar("T_Message", bound="Message") T_MessageSegment = TypeVar("T_MessageSegment", bound="MessageSegment") diff --git a/nonebot/typing.py b/nonebot/typing.py index dd2f24c5..c1dc008a 100644 --- a/nonebot/typing.py +++ b/nonebot/typing.py @@ -71,6 +71,7 @@ T_WebSocketDisconnectionHook = Callable[["Bot"], Awaitable[None]] WebSocket 连接断开时执行的函数 """ +T_CallingAPIHook = Callable[[str, Dict[str, Any]], Awaitable[None]] T_EventPreProcessor = Callable[["Bot", "Event", T_State], Awaitable[None]] """ diff --git a/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py b/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py index ca477559..20e5015d 100644 --- a/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py +++ b/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py @@ -328,32 +328,7 @@ class Bot(BaseBot): ) @overrides(BaseBot) - async def call_api(self, api: str, **data) -> Any: - """ - :说明: - - 调用 CQHTTP 协议 API - - :参数: - - * ``api: str``: API 名称 - * ``**data: Any``: API 参数 - - :返回: - - - ``Any``: API 调用返回数据 - - :异常: - - - ``NetworkError``: 网络错误 - - ``ActionFailed``: API 调用失败 - """ - if "self_id" in data: - self_id = data.pop("self_id") - if self_id: - bot = self.driver.bots[str(self_id)] - return await bot.call_api(api, **data) - + async def _call_api(self, api: str, **data) -> Any: log("DEBUG", f"Calling API {api}") if self.connection_type == "websocket": seq = ResultStore.get_seq() @@ -396,6 +371,29 @@ class Bot(BaseBot): except httpx.HTTPError: raise NetworkError("HTTP request failed") + @overrides(BaseBot) + async def call_api(self, api: str, **data) -> Any: + """ + :说明: + + 调用 CQHTTP 协议 API + + :参数: + + * ``api: str``: API 名称 + * ``**data: Any``: API 参数 + + :返回: + + - ``Any``: API 调用返回数据 + + :异常: + + - ``NetworkError``: 网络错误 + - ``ActionFailed``: API 调用失败 + """ + return super().call_api(api, **data) + @overrides(BaseBot) async def send(self, event: Event, diff --git a/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.pyi b/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.pyi index 7ba09f8a..ad8d459c 100644 --- a/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.pyi +++ b/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.pyi @@ -68,7 +68,8 @@ class Bot(BaseBot): async def handle_message(self, message: dict): ... - async def call_api(self, api: str, **data) -> Any: + async def call_api(self, api: str, *, self_id: Optional[str], + **data) -> Any: ... async def send(self, event: Event, message: Union[str, Message, diff --git a/packages/nonebot-adapter-ding/nonebot/adapters/ding/bot.py b/packages/nonebot-adapter-ding/nonebot/adapters/ding/bot.py index 08175ce4..410515bb 100644 --- a/packages/nonebot-adapter-ding/nonebot/adapters/ding/bot.py +++ b/packages/nonebot-adapter-ding/nonebot/adapters/ding/bot.py @@ -109,37 +109,13 @@ class Bot(BaseBot): return @overrides(BaseBot) - async def call_api(self, - api: str, - event: Optional[MessageEvent] = None, - **data) -> Any: - """ - :说明: - - 调用 钉钉 协议 API - - :参数: - - * ``api: str``: API 名称 - * ``**data: Any``: API 参数 - - :返回: - - - ``Any``: API 调用返回数据 - - :异常: - - - ``NetworkError``: 网络错误 - - ``ActionFailed``: API 调用失败 - """ + async def _call_api(self, + api: str, + event: Optional[MessageEvent] = None, + **data) -> Any: if self.connection_type != "http": log("ERROR", "Only support http connection.") return - if "self_id" in data: - self_id = data.pop("self_id") - if self_id: - bot = self.driver.bots[str(self_id)] - return await bot.call_api(api, **data) log("DEBUG", f"Calling API {api}") params = {} @@ -192,6 +168,33 @@ class Bot(BaseBot): except httpx.HTTPError: raise NetworkError("HTTP request failed") + @overrides(BaseBot) + async def call_api(self, + api: str, + event: Optional[MessageEvent] = None, + **data) -> Any: + """ + :说明: + + 调用 钉钉 协议 API + + :参数: + + * ``api: str``: API 名称 + * ``event: Optional[MessageEvent]``: Event 对象 + * ``**data: Any``: API 参数 + + :返回: + + - ``Any``: API 调用返回数据 + + :异常: + + - ``NetworkError``: 网络错误 + - ``ActionFailed``: API 调用失败 + """ + return super().call_api(api, event=event, **data) + @overrides(BaseBot) async def send(self, event: MessageEvent, diff --git a/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/bot.py b/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/bot.py index 1b598ebf..ebce2d74 100644 --- a/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/bot.py +++ b/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/bot.py @@ -218,6 +218,10 @@ class Bot(BaseBot): except Exception as e: Log.error(f'Failed to handle message: {message}', e) + @overrides(BaseBot) + async def _call_api(self, api: str, **data) -> NoReturn: + raise NotImplementedError + @overrides(BaseBot) async def call_api(self, api: str, **data) -> NoReturn: """ From 68ba1c1af2e279c278d1e4bfa7e73b1c0a5bc3e0 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Wed, 31 Mar 2021 20:09:00 +0800 Subject: [PATCH 35/40] :bug: fix reply get fail broken down --- .../nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py b/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py index 20e5015d..a30e2d0a 100644 --- a/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py +++ b/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py @@ -52,8 +52,12 @@ async def _check_reply(bot: "Bot", event: "Event"): except ValueError: return msg_seg = event.message[index] - event.reply = Reply.parse_obj(await - bot.get_msg(message_id=msg_seg.data["id"])) + try: + event.reply = Reply.parse_obj(await + bot.get_msg(message_id=msg_seg.data["id"] + )) + except Exception as e: + log("WARNING", f"Error when getting message reply info: {repr(e)}", e) # ensure string comparation if str(event.reply.sender.user_id) == str(event.self_id): event.to_me = True From d1e8925fe0b112a0ac90e3730d4a9917831585ca Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Wed, 31 Mar 2021 20:25:45 +0800 Subject: [PATCH 36/40] :arrow_up: bump version --- packages/nonebot-adapter-cqhttp/poetry.lock | 20 +++++------ .../nonebot-adapter-cqhttp/pyproject.toml | 4 +-- packages/nonebot-adapter-ding/poetry.lock | 20 +++++------ packages/nonebot-adapter-ding/pyproject.toml | 4 +-- packages/nonebot-adapter-mirai/poetry.lock | 20 +++++------ packages/nonebot-adapter-mirai/pyproject.toml | 4 +-- poetry.lock | 36 +++++++++---------- pyproject.toml | 2 +- 8 files changed, 55 insertions(+), 55 deletions(-) diff --git a/packages/nonebot-adapter-cqhttp/poetry.lock b/packages/nonebot-adapter-cqhttp/poetry.lock index ca160ee8..142450bc 100644 --- a/packages/nonebot-adapter-cqhttp/poetry.lock +++ b/packages/nonebot-adapter-cqhttp/poetry.lock @@ -111,7 +111,7 @@ reference = "aliyun" [[package]] name = "httpx" -version = "0.17.0" +version = "0.17.1" description = "The next generation HTTP client." category = "main" optional = false @@ -119,7 +119,7 @@ python-versions = ">=3.6" [package.dependencies] certifi = "*" -httpcore = ">=0.12.0,<0.13.0" +httpcore = ">=0.12.1,<0.13" rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} sniffio = "*" @@ -167,7 +167,7 @@ reference = "aliyun" [[package]] name = "nonebot2" -version = "2.0.0-alpha.11" +version = "2.0.0-alpha.12" description = "An asynchronous python bot framework." category = "main" optional = false @@ -226,8 +226,8 @@ reference = "aliyun" [[package]] name = "python-dotenv" -version = "0.15.0" -description = "Add .env support to your django/flask apps in development and deployments" +version = "0.16.0" +description = "Read key-value pairs from a .env file and set them as environment variables" category = "main" optional = false python-versions = "*" @@ -418,7 +418,7 @@ reference = "aliyun" [metadata] lock-version = "1.1" python-versions = "^3.7.3" -content-hash = "8110a56337b3ca1557700161e09ff2d74720b5897f0fac09c4ac5038495194d9" +content-hash = "b8ec196a78675b4098ab7509cbdbd311ffcbcf1ce8b625c589f1e95596801c71" [metadata.files] certifi = [ @@ -460,8 +460,8 @@ httptools = [ {file = "httptools-0.1.1.tar.gz", hash = "sha256:41b573cf33f64a8f8f3400d0a7faf48e1888582b6f6e02b82b9bd4f0bf7497ce"}, ] httpx = [ - {file = "httpx-0.17.0-py3-none-any.whl", hash = "sha256:fe19522f7b0861a1f6ac83306360bb5b7fb1ed64633a1a04a33f04102a1bea60"}, - {file = "httpx-0.17.0.tar.gz", hash = "sha256:4f7ab2fef7f929c5531abd4f413b41ce2c820e3202f2eeee498f2d92b6849f8d"}, + {file = "httpx-0.17.1-py3-none-any.whl", hash = "sha256:d379653bd457e8257eb0df99cb94557e4aac441b7ba948e333be969298cac272"}, + {file = "httpx-0.17.1.tar.gz", hash = "sha256:cc2a55188e4b25272d2bcd46379d300f632045de4377682aa98a8a6069d55967"}, ] idna = [ {file = "idna-3.1-py3-none-any.whl", hash = "sha256:5205d03e7bcbb919cc9c19885f9920d622ca52448306f2377daede5cf3faac16"}, @@ -500,8 +500,8 @@ pygtrie = [ {file = "pygtrie-2.4.2.tar.gz", hash = "sha256:43205559d28863358dbbf25045029f58e2ab357317a59b11f11ade278ac64692"}, ] python-dotenv = [ - {file = "python-dotenv-0.15.0.tar.gz", hash = "sha256:587825ed60b1711daea4832cf37524dfd404325b7db5e25ebe88c495c9f807a0"}, - {file = "python_dotenv-0.15.0-py2.py3-none-any.whl", hash = "sha256:0c8d1b80d1a1e91717ea7d526178e3882732420b03f08afea0406db6402e220e"}, + {file = "python-dotenv-0.16.0.tar.gz", hash = "sha256:9fa413c37d4652d3fa02fea0ff465c384f5db75eab259c4fc5d0c5b8bf20edd4"}, + {file = "python_dotenv-0.16.0-py2.py3-none-any.whl", hash = "sha256:31d752f5b748f4e292448c9a0cac6a08ed5e6f4cefab85044462dcad56905cec"}, ] pyyaml = [ {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, diff --git a/packages/nonebot-adapter-cqhttp/pyproject.toml b/packages/nonebot-adapter-cqhttp/pyproject.toml index 5054bf7b..46697cc7 100644 --- a/packages/nonebot-adapter-cqhttp/pyproject.toml +++ b/packages/nonebot-adapter-cqhttp/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "nonebot-adapter-cqhttp" -version = "2.0.0a11.post2" +version = "2.0.0-alpha.12" description = "OneBot(CQHTTP) adapter for nonebot2" authors = ["yanyongyu "] license = "MIT" @@ -25,7 +25,7 @@ exclude = ["nonebot/__init__.py", "nonebot/adapters/__init__.py"] [tool.poetry.dependencies] python = "^3.7.3" httpx = "^0.17.0" -nonebot2 = "^2.0.0-alpha.11" +nonebot2 = "^2.0.0-alpha.12" [tool.poetry.dev-dependencies] nonebot2 = { path = "../../", develop = true } diff --git a/packages/nonebot-adapter-ding/poetry.lock b/packages/nonebot-adapter-ding/poetry.lock index ca160ee8..142450bc 100644 --- a/packages/nonebot-adapter-ding/poetry.lock +++ b/packages/nonebot-adapter-ding/poetry.lock @@ -111,7 +111,7 @@ reference = "aliyun" [[package]] name = "httpx" -version = "0.17.0" +version = "0.17.1" description = "The next generation HTTP client." category = "main" optional = false @@ -119,7 +119,7 @@ python-versions = ">=3.6" [package.dependencies] certifi = "*" -httpcore = ">=0.12.0,<0.13.0" +httpcore = ">=0.12.1,<0.13" rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} sniffio = "*" @@ -167,7 +167,7 @@ reference = "aliyun" [[package]] name = "nonebot2" -version = "2.0.0-alpha.11" +version = "2.0.0-alpha.12" description = "An asynchronous python bot framework." category = "main" optional = false @@ -226,8 +226,8 @@ reference = "aliyun" [[package]] name = "python-dotenv" -version = "0.15.0" -description = "Add .env support to your django/flask apps in development and deployments" +version = "0.16.0" +description = "Read key-value pairs from a .env file and set them as environment variables" category = "main" optional = false python-versions = "*" @@ -418,7 +418,7 @@ reference = "aliyun" [metadata] lock-version = "1.1" python-versions = "^3.7.3" -content-hash = "8110a56337b3ca1557700161e09ff2d74720b5897f0fac09c4ac5038495194d9" +content-hash = "b8ec196a78675b4098ab7509cbdbd311ffcbcf1ce8b625c589f1e95596801c71" [metadata.files] certifi = [ @@ -460,8 +460,8 @@ httptools = [ {file = "httptools-0.1.1.tar.gz", hash = "sha256:41b573cf33f64a8f8f3400d0a7faf48e1888582b6f6e02b82b9bd4f0bf7497ce"}, ] httpx = [ - {file = "httpx-0.17.0-py3-none-any.whl", hash = "sha256:fe19522f7b0861a1f6ac83306360bb5b7fb1ed64633a1a04a33f04102a1bea60"}, - {file = "httpx-0.17.0.tar.gz", hash = "sha256:4f7ab2fef7f929c5531abd4f413b41ce2c820e3202f2eeee498f2d92b6849f8d"}, + {file = "httpx-0.17.1-py3-none-any.whl", hash = "sha256:d379653bd457e8257eb0df99cb94557e4aac441b7ba948e333be969298cac272"}, + {file = "httpx-0.17.1.tar.gz", hash = "sha256:cc2a55188e4b25272d2bcd46379d300f632045de4377682aa98a8a6069d55967"}, ] idna = [ {file = "idna-3.1-py3-none-any.whl", hash = "sha256:5205d03e7bcbb919cc9c19885f9920d622ca52448306f2377daede5cf3faac16"}, @@ -500,8 +500,8 @@ pygtrie = [ {file = "pygtrie-2.4.2.tar.gz", hash = "sha256:43205559d28863358dbbf25045029f58e2ab357317a59b11f11ade278ac64692"}, ] python-dotenv = [ - {file = "python-dotenv-0.15.0.tar.gz", hash = "sha256:587825ed60b1711daea4832cf37524dfd404325b7db5e25ebe88c495c9f807a0"}, - {file = "python_dotenv-0.15.0-py2.py3-none-any.whl", hash = "sha256:0c8d1b80d1a1e91717ea7d526178e3882732420b03f08afea0406db6402e220e"}, + {file = "python-dotenv-0.16.0.tar.gz", hash = "sha256:9fa413c37d4652d3fa02fea0ff465c384f5db75eab259c4fc5d0c5b8bf20edd4"}, + {file = "python_dotenv-0.16.0-py2.py3-none-any.whl", hash = "sha256:31d752f5b748f4e292448c9a0cac6a08ed5e6f4cefab85044462dcad56905cec"}, ] pyyaml = [ {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, diff --git a/packages/nonebot-adapter-ding/pyproject.toml b/packages/nonebot-adapter-ding/pyproject.toml index b11ffded..3f367f81 100644 --- a/packages/nonebot-adapter-ding/pyproject.toml +++ b/packages/nonebot-adapter-ding/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "nonebot-adapter-ding" -version = "2.0.0a11.post2" +version = "2.0.0-alpha.12" description = "Ding adapter for nonebot2" authors = ["Artin ", "yanyongyu "] license = "MIT" @@ -25,7 +25,7 @@ exclude = ["nonebot/__init__.py", "nonebot/adapters/__init__.py"] [tool.poetry.dependencies] python = "^3.7.3" httpx = "^0.17.0" -nonebot2 = "^2.0.0-alpha.11" +nonebot2 = "^2.0.0-alpha.12" [tool.poetry.dev-dependencies] nonebot2 = { path = "../../", develop = true } diff --git a/packages/nonebot-adapter-mirai/poetry.lock b/packages/nonebot-adapter-mirai/poetry.lock index 8178a3bf..f691f4da 100644 --- a/packages/nonebot-adapter-mirai/poetry.lock +++ b/packages/nonebot-adapter-mirai/poetry.lock @@ -111,7 +111,7 @@ reference = "aliyun" [[package]] name = "httpx" -version = "0.17.0" +version = "0.17.1" description = "The next generation HTTP client." category = "main" optional = false @@ -119,7 +119,7 @@ python-versions = ">=3.6" [package.dependencies] certifi = "*" -httpcore = ">=0.12.0,<0.13.0" +httpcore = ">=0.12.1,<0.13" rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} sniffio = "*" @@ -167,7 +167,7 @@ reference = "aliyun" [[package]] name = "nonebot2" -version = "2.0.0-alpha.11" +version = "2.0.0-alpha.12" description = "An asynchronous python bot framework." category = "main" optional = false @@ -226,8 +226,8 @@ reference = "aliyun" [[package]] name = "python-dotenv" -version = "0.15.0" -description = "Add .env support to your django/flask apps in development and deployments" +version = "0.16.0" +description = "Read key-value pairs from a .env file and set them as environment variables" category = "main" optional = false python-versions = "*" @@ -418,7 +418,7 @@ reference = "aliyun" [metadata] lock-version = "1.1" python-versions = "^3.7.3" -content-hash = "9eb7c46cddf1245508a34c00f5709d21415d02d7f8c356733cc20ad187f431f9" +content-hash = "5b8b3e27eccd897aa33fea94ba813b7d601c5656d52efed4401b398f6d68a677" [metadata.files] certifi = [ @@ -460,8 +460,8 @@ httptools = [ {file = "httptools-0.1.1.tar.gz", hash = "sha256:41b573cf33f64a8f8f3400d0a7faf48e1888582b6f6e02b82b9bd4f0bf7497ce"}, ] httpx = [ - {file = "httpx-0.17.0-py3-none-any.whl", hash = "sha256:fe19522f7b0861a1f6ac83306360bb5b7fb1ed64633a1a04a33f04102a1bea60"}, - {file = "httpx-0.17.0.tar.gz", hash = "sha256:4f7ab2fef7f929c5531abd4f413b41ce2c820e3202f2eeee498f2d92b6849f8d"}, + {file = "httpx-0.17.1-py3-none-any.whl", hash = "sha256:d379653bd457e8257eb0df99cb94557e4aac441b7ba948e333be969298cac272"}, + {file = "httpx-0.17.1.tar.gz", hash = "sha256:cc2a55188e4b25272d2bcd46379d300f632045de4377682aa98a8a6069d55967"}, ] idna = [ {file = "idna-3.1-py3-none-any.whl", hash = "sha256:5205d03e7bcbb919cc9c19885f9920d622ca52448306f2377daede5cf3faac16"}, @@ -500,8 +500,8 @@ pygtrie = [ {file = "pygtrie-2.4.2.tar.gz", hash = "sha256:43205559d28863358dbbf25045029f58e2ab357317a59b11f11ade278ac64692"}, ] python-dotenv = [ - {file = "python-dotenv-0.15.0.tar.gz", hash = "sha256:587825ed60b1711daea4832cf37524dfd404325b7db5e25ebe88c495c9f807a0"}, - {file = "python_dotenv-0.15.0-py2.py3-none-any.whl", hash = "sha256:0c8d1b80d1a1e91717ea7d526178e3882732420b03f08afea0406db6402e220e"}, + {file = "python-dotenv-0.16.0.tar.gz", hash = "sha256:9fa413c37d4652d3fa02fea0ff465c384f5db75eab259c4fc5d0c5b8bf20edd4"}, + {file = "python_dotenv-0.16.0-py2.py3-none-any.whl", hash = "sha256:31d752f5b748f4e292448c9a0cac6a08ed5e6f4cefab85044462dcad56905cec"}, ] pyyaml = [ {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, diff --git a/packages/nonebot-adapter-mirai/pyproject.toml b/packages/nonebot-adapter-mirai/pyproject.toml index e4adc814..a38e36d1 100644 --- a/packages/nonebot-adapter-mirai/pyproject.toml +++ b/packages/nonebot-adapter-mirai/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "nonebot-adapter-mirai" -version = "2.0.0a11.post2" +version = "2.0.0-alpha.12" description = "Mirai Api HTTP adapter for nonebot2" authors = ["Mix ", "yanyongyu "] license = "AGPL-3.0-or-later" @@ -26,7 +26,7 @@ exclude = ["nonebot/__init__.py", "nonebot/adapters/__init__.py"] python = "^3.7.3" httpx = "^0.17.0" websockets = "^8.1" -nonebot2 = "^2.0.0-alpha.11" +nonebot2 = "^2.0.0-alpha.12" [tool.poetry.dev-dependencies] nonebot2 = { path = "../../", develop = true } diff --git a/poetry.lock b/poetry.lock index 41f617f8..6f81c694 100644 --- a/poetry.lock +++ b/poetry.lock @@ -389,7 +389,7 @@ reference = "aliyun" [[package]] name = "nonebot-adapter-cqhttp" -version = "2.0.0a11.post2" +version = "2.0.0-alpha.12" description = "OneBot(CQHTTP) adapter for nonebot2" category = "dev" optional = false @@ -398,7 +398,7 @@ develop = true [package.dependencies] httpx = "^0.17.0" -nonebot2 = "^2.0.0-alpha.11" +nonebot2 = "^2.0.0-alpha.12" [package.source] type = "directory" @@ -406,7 +406,7 @@ url = "packages/nonebot-adapter-cqhttp" [[package]] name = "nonebot-adapter-ding" -version = "2.0.0a11.post2" +version = "2.0.0-alpha.12" description = "Ding adapter for nonebot2" category = "dev" optional = false @@ -415,7 +415,7 @@ develop = true [package.dependencies] httpx = "^0.17.0" -nonebot2 = "^2.0.0-alpha.11" +nonebot2 = "^2.0.0-alpha.12" [package.source] type = "directory" @@ -423,7 +423,7 @@ url = "packages/nonebot-adapter-ding" [[package]] name = "nonebot-adapter-mirai" -version = "2.0.0a11.post2" +version = "2.0.0-alpha.12" description = "Mirai Api HTTP adapter for nonebot2" category = "dev" optional = false @@ -432,7 +432,7 @@ develop = true [package.dependencies] httpx = "^0.17.0" -nonebot2 = "^2.0.0-alpha.11" +nonebot2 = "^2.0.0-alpha.12" websockets = "^8.1" [package.source] @@ -509,14 +509,14 @@ reference = "aliyun" [[package]] name = "pydash" -version = "4.9.3" +version = "5.0.0" description = "The kitchen sink of Python utility libraries for doing \"stuff\" in a functional way. Based on the Lo-Dash Javascript library." category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" [package.extras] -dev = ["coverage", "docformatter", "flake8", "invoke", "mock", "pylint", "pytest", "pytest-cov", "pytest-flake8", "pytest-pylint", "sphinx", "sphinx-rtd-theme", "tox", "twine", "wheel", "black", "flake8-black", "flake8-bugbear", "flake8-isort", "isort"] +dev = ["black", "coverage", "docformatter", "flake8", "flake8-black", "flake8-bugbear", "flake8-isort", "invoke", "isort", "pylint", "pytest", "pytest-cov", "pytest-flake8", "pytest-pylint", "sphinx", "sphinx-rtd-theme", "tox", "twine", "wheel"] [package.source] type = "legacy" @@ -564,8 +564,8 @@ reference = "aliyun" [[package]] name = "python-dotenv" -version = "0.15.0" -description = "Add .env support to your django/flask apps in development and deployments" +version = "0.16.0" +description = "Read key-value pairs from a .env file and set them as environment variables" category = "main" optional = false python-versions = "*" @@ -755,7 +755,7 @@ reference = "aliyun" [[package]] name = "sphinx" -version = "3.5.2" +version = "3.5.3" description = "Python documentation generator" category = "dev" optional = false @@ -1357,8 +1357,8 @@ pydantic = [ {file = "pydantic-1.8.1.tar.gz", hash = "sha256:26cf3cb2e68ec6c0cfcb6293e69fb3450c5fd1ace87f46b64f678b0d29eac4c3"}, ] pydash = [ - {file = "pydash-4.9.3-py2.py3-none-any.whl", hash = "sha256:7851a2d749e70c02585ae4803b01c5e0f47b7ec9df9b84ccb16aac38cad2fdd2"}, - {file = "pydash-4.9.3.tar.gz", hash = "sha256:d709e57b537b1aaf118f188da3ec6242a665090ecd7839b66f857ee3dc2bb006"}, + {file = "pydash-5.0.0-py3-none-any.whl", hash = "sha256:0d87f879a3df4ad9389ab6d63c69eea078517d41541ddd5744cfcff3396e8543"}, + {file = "pydash-5.0.0.tar.gz", hash = "sha256:845262df83b5411742e5f7f7dbfa5ed4d0ddac6d7d0a13c4375c6a3c40d4e8f4"}, ] pygments = [ {file = "Pygments-2.8.1-py3-none-any.whl", hash = "sha256:534ef71d539ae97d4c3a4cf7d6f110f214b0e687e92f9cb9d2a3b0d3101289c8"}, @@ -1372,8 +1372,8 @@ pyparsing = [ {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, ] python-dotenv = [ - {file = "python-dotenv-0.15.0.tar.gz", hash = "sha256:587825ed60b1711daea4832cf37524dfd404325b7db5e25ebe88c495c9f807a0"}, - {file = "python_dotenv-0.15.0-py2.py3-none-any.whl", hash = "sha256:0c8d1b80d1a1e91717ea7d526178e3882732420b03f08afea0406db6402e220e"}, + {file = "python-dotenv-0.16.0.tar.gz", hash = "sha256:9fa413c37d4652d3fa02fea0ff465c384f5db75eab259c4fc5d0c5b8bf20edd4"}, + {file = "python_dotenv-0.16.0-py2.py3-none-any.whl", hash = "sha256:31d752f5b748f4e292448c9a0cac6a08ed5e6f4cefab85044462dcad56905cec"}, ] python-engineio = [ {file = "python-engineio-3.14.2.tar.gz", hash = "sha256:eab4553f2804c1ce97054c8b22cf0d5a9ab23128075248b97e1a5b2f29553085"}, @@ -1435,8 +1435,8 @@ snowballstemmer = [ {file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"}, ] sphinx = [ - {file = "Sphinx-3.5.2-py3-none-any.whl", hash = "sha256:ef64a814576f46ec7de06adf11b433a0d6049be007fefe7fd0d183d28b581fac"}, - {file = "Sphinx-3.5.2.tar.gz", hash = "sha256:672cfcc24b6b69235c97c750cb190a44ecd72696b4452acaf75c2d9cc78ca5ff"}, + {file = "Sphinx-3.5.3-py3-none-any.whl", hash = "sha256:3f01732296465648da43dec8fb40dc451ba79eb3e2cc5c6d79005fd98197107d"}, + {file = "Sphinx-3.5.3.tar.gz", hash = "sha256:ce9c228456131bab09a3d7d10ae58474de562a6f79abb3dc811ae401cf8c1abc"}, ] sphinx-markdown-builder = [] sphinxcontrib-applehelp = [ diff --git a/pyproject.toml b/pyproject.toml index 11ec5be4..e73b3a6d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "nonebot2" -version = "2.0.0-alpha.11" +version = "2.0.0-alpha.12" description = "An asynchronous python bot framework." authors = ["yanyongyu "] license = "MIT" From ca08c56df76dbb6fb3eb6f61eeb647ae75c2af8e Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Wed, 31 Mar 2021 20:38:00 +0800 Subject: [PATCH 37/40] :bug: fix import hook export --- nonebot/plugin/__init__.py | 65 ++------------------------------------ nonebot/plugin/export.py | 60 +++++++++++++++++++++++++++++++++++ nonebot/plugin/manager.py | 24 ++++++++++---- 3 files changed, 80 insertions(+), 69 deletions(-) create mode 100644 nonebot/plugin/export.py diff --git a/nonebot/plugin/__init__.py b/nonebot/plugin/__init__.py index 1e61d8e1..f63bb97b 100644 --- a/nonebot/plugin/__init__.py +++ b/nonebot/plugin/__init__.py @@ -20,6 +20,7 @@ from nonebot.permission import Permission from nonebot.typing import T_State, T_StateFactory, T_Handler, T_RuleChecker from nonebot.rule import Rule, startswith, endswith, keyword, command, shell_command, ArgumentParser, regex +from .export import Export, export, _export from .manager import PluginManager, _current_plugin if TYPE_CHECKING: @@ -32,55 +33,9 @@ plugins: Dict[str, "Plugin"] = {} """ PLUGIN_NAMESPACE = "nonebot.loaded_plugins" -_export: ContextVar["Export"] = ContextVar("_export") -# FIXME: tmp matchers context var will be removed _plugin_matchers: Dict[str, Set[Type[Matcher]]] = defaultdict(set) -class Export(dict): - """ - :说明: - - 插件导出内容以使得其他插件可以获得。 - - :示例: - - .. code-block:: python - - nonebot.export().default = "bar" - - @nonebot.export() - def some_function(): - pass - - # this doesn't work before python 3.9 - # use - # export = nonebot.export(); @export.sub - # instead - # See also PEP-614: https://www.python.org/dev/peps/pep-0614/ - @nonebot.export().sub - def something_else(): - pass - """ - - def __call__(self, func, **kwargs): - self[func.__name__] = func - self.update(kwargs) - return func - - def __setitem__(self, key, value): - super().__setitem__(key, - Export(value) if isinstance(value, dict) else value) - - def __setattr__(self, name, value): - self[name] = Export(value) if isinstance(value, dict) else value - - def __getattr__(self, name): - if name not in self: - self[name] = Export() - return self[name] - - @dataclass(eq=False) class Plugin(object): """存储插件信息""" @@ -966,15 +921,14 @@ def _load_plugin(manager: PluginManager, plugin_name: str) -> Optional[Plugin]: if plugin_name.startswith("_"): return None - _export.set(Export()) - if plugin_name in plugins: return None try: module = manager.load_plugin(plugin_name) - plugin = Plugin(plugin_name, module, _export.get()) + plugin = Plugin(plugin_name, module, + getattr(module, "__export__", Export())) plugins[plugin_name] = plugin logger.opt( colors=True).info(f'Succeeded to import "{plugin_name}"') @@ -1153,19 +1107,6 @@ def get_loaded_plugins() -> Set[Plugin]: return set(plugins.values()) -def export() -> Export: - """ - :说明: - - 获取插件的导出内容对象 - - :返回: - - - ``Export`` - """ - return _export.get() - - def require(name: str) -> Optional[Export]: """ :说明: diff --git a/nonebot/plugin/export.py b/nonebot/plugin/export.py new file mode 100644 index 00000000..20ad4d72 --- /dev/null +++ b/nonebot/plugin/export.py @@ -0,0 +1,60 @@ +from contextvars import ContextVar + +_export: ContextVar["Export"] = ContextVar("_export") + + +class Export(dict): + """ + :说明: + + 插件导出内容以使得其他插件可以获得。 + + :示例: + + .. code-block:: python + + nonebot.export().default = "bar" + + @nonebot.export() + def some_function(): + pass + + # this doesn't work before python 3.9 + # use + # export = nonebot.export(); @export.sub + # instead + # See also PEP-614: https://www.python.org/dev/peps/pep-0614/ + @nonebot.export().sub + def something_else(): + pass + """ + + def __call__(self, func, **kwargs): + self[func.__name__] = func + self.update(kwargs) + return func + + def __setitem__(self, key, value): + super().__setitem__(key, + Export(value) if isinstance(value, dict) else value) + + def __setattr__(self, name, value): + self[name] = Export(value) if isinstance(value, dict) else value + + def __getattr__(self, name): + if name not in self: + self[name] = Export() + return self[name] + + +def export() -> Export: + """ + :说明: + + 获取插件的导出内容对象 + + :返回: + + - ``Export`` + """ + return _export.get() diff --git a/nonebot/plugin/manager.py b/nonebot/plugin/manager.py index 18b43cf8..fdbfe43b 100644 --- a/nonebot/plugin/manager.py +++ b/nonebot/plugin/manager.py @@ -7,8 +7,10 @@ from types import ModuleType from collections import Counter from contextvars import ContextVar from importlib.abc import MetaPathFinder -from importlib.machinery import PathFinder, FrozenImporter, SourceFileLoader from typing import Set, List, Optional, Iterable +from importlib.machinery import PathFinder, SourceFileLoader + +from .export import _export, Export _current_plugin: ContextVar[Optional[str]] = ContextVar("_current_plugin", default=None) @@ -160,10 +162,10 @@ class PluginManager: path = module_name.split(".") length = self.namespace.count(".") + 1 return f"{prefix}{'.'.join(path[length:])}" - elif module_name in self.search_plugins(): - return f"{prefix}{module_name}" elif module_name in self.plugins or module_name.startswith(prefix): return module_name + elif module_name in self.search_plugins(): + return f"{prefix}{module_name}" return None @@ -191,7 +193,8 @@ class PluginLoader(SourceFileLoader): def __init__(self, manager: PluginManager, fullname: str, path) -> None: self.manager = manager self.loaded = False - self._context_token = None + self._plugin_token = None + self._export_token = None super().__init__(fullname, path) def create_module(self, spec) -> Optional[ModuleType]: @@ -201,7 +204,8 @@ class PluginLoader(SourceFileLoader): prefix = self.manager.internal_module.__name__ plugin_name = self.name[len(prefix):] if self.name.startswith( prefix) else self.name - self._context_token = _current_plugin.set(plugin_name.lstrip(".")) + self._plugin_token = _current_plugin.set(plugin_name.lstrip(".")) + self._export_token = _export.set(Export()) # return None to use default module creation return super().create_module(spec) @@ -210,9 +214,15 @@ class PluginLoader(SourceFileLoader): return # really need? # setattr(module, "__manager__", self.manager) + if self._export_token: + setattr(module, "__export__", _export.get()) + super().exec_module(module) - if self._context_token: - _current_plugin.reset(self._context_token) + + if self._plugin_token: + _current_plugin.reset(self._plugin_token) + if self._export_token: + _export.reset(self._export_token) return From 59ec5bacdedd80a32aa2cdbfc1bc8db319a84350 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Wed, 31 Mar 2021 21:20:07 +0800 Subject: [PATCH 38/40] :memo: update changelog --- docs/advanced/runtime-hook.md | 16 ++++++++++++++-- nonebot/adapters/_base.py | 2 +- nonebot/typing.py | 2 +- .../nonebot/adapters/cqhttp/bot.py | 2 +- .../nonebot/adapters/ding/bot.py | 2 +- pages/changelog.md | 3 +++ tests/test_plugins/test_api_hook.py | 6 ++++++ 7 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 tests/test_plugins/test_api_hook.py diff --git a/docs/advanced/runtime-hook.md b/docs/advanced/runtime-hook.md index 7d157891..f7e26be6 100644 --- a/docs/advanced/runtime-hook.md +++ b/docs/advanced/runtime-hook.md @@ -19,7 +19,7 @@ from nonebot import get_driver driver=get_driver() ``` -共分为四种函数: +共分为五种函数: ### 启动准备 @@ -61,6 +61,18 @@ async def do_something(bot: Bot): pass ``` +### bot api 调用钩子 + +这个钩子函数会在 `Bot` 调用 API 时运行。 + +```python +from nonebot.adapters import Bot + +@Bot.on_calling_api +async def handle_api_call(bot: Bot, api: str, data: Dict[str, Any]): + pass +``` + ## 事件处理钩子 这些钩子函数指的是影响 `nonebot2` 进行 `事件处理` 的函数。 @@ -71,7 +83,7 @@ async def do_something(bot: Bot): ::: -:::warning 注意 +:::warning 注意 1.在事件处理钩子函数中,与 `matcher` 运行状态相关的函数将不可用,如 `matcher.finish()` diff --git a/nonebot/adapters/_base.py b/nonebot/adapters/_base.py index d36407a9..264f69c7 100644 --- a/nonebot/adapters/_base.py +++ b/nonebot/adapters/_base.py @@ -156,7 +156,7 @@ class Bot(abc.ABC): await bot.call_api("send_msg", message="hello world") await bot.send_msg(message="hello world") """ - coros = list(map(lambda x: x(api, data), self._call_api_hook)) + coros = list(map(lambda x: x(self, api, data), self._call_api_hook)) if coros: try: logger.debug("Running CallingAPI hooks...") diff --git a/nonebot/typing.py b/nonebot/typing.py index c1dc008a..a9dccc35 100644 --- a/nonebot/typing.py +++ b/nonebot/typing.py @@ -71,7 +71,7 @@ T_WebSocketDisconnectionHook = Callable[["Bot"], Awaitable[None]] WebSocket 连接断开时执行的函数 """ -T_CallingAPIHook = Callable[[str, Dict[str, Any]], Awaitable[None]] +T_CallingAPIHook = Callable[["Bot", str, Dict[str, Any]], Awaitable[None]] T_EventPreProcessor = Callable[["Bot", "Event", T_State], Awaitable[None]] """ diff --git a/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py b/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py index a30e2d0a..bea0bcc3 100644 --- a/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py +++ b/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py @@ -396,7 +396,7 @@ class Bot(BaseBot): - ``NetworkError``: 网络错误 - ``ActionFailed``: API 调用失败 """ - return super().call_api(api, **data) + return await super().call_api(api, **data) @overrides(BaseBot) async def send(self, diff --git a/packages/nonebot-adapter-ding/nonebot/adapters/ding/bot.py b/packages/nonebot-adapter-ding/nonebot/adapters/ding/bot.py index 410515bb..8f2880a1 100644 --- a/packages/nonebot-adapter-ding/nonebot/adapters/ding/bot.py +++ b/packages/nonebot-adapter-ding/nonebot/adapters/ding/bot.py @@ -193,7 +193,7 @@ class Bot(BaseBot): - ``NetworkError``: 网络错误 - ``ActionFailed``: API 调用失败 """ - return super().call_api(api, event=event, **data) + return await super().call_api(api, event=event, **data) @overrides(BaseBot) async def send(self, diff --git a/pages/changelog.md b/pages/changelog.md index ab414e00..4315c502 100644 --- a/pages/changelog.md +++ b/pages/changelog.md @@ -11,6 +11,9 @@ sidebar: auto - 修复 `pydantic 1.8` 导致的 `alias` 问题 - 修改 `cqhttp` `ding` `session id`,不再允许跨群 - 修改 `shell_command` 存储 message +- 修复 `cqhttp` 检查 reply 失败退出 +- 新增 `call_api` hook 接口 +- 优化 `import hook` ## v2.0.0a11 diff --git a/tests/test_plugins/test_api_hook.py b/tests/test_plugins/test_api_hook.py new file mode 100644 index 00000000..1849daf9 --- /dev/null +++ b/tests/test_plugins/test_api_hook.py @@ -0,0 +1,6 @@ +from nonebot.adapters import Bot + + +@Bot.on_calling_api +async def call(bot: Bot, api: str, data: dict): + print(type(bot), api, data) From f1ed7837767d565b9d5e0d2b4fded7a1cc0f1504 Mon Sep 17 00:00:00 2001 From: nonebot Date: Wed, 31 Mar 2021 13:27:02 +0000 Subject: [PATCH 39/40] :memo: update api docs --- docs/api/plugin.md | 48 ---------------------------------------------- 1 file changed, 48 deletions(-) diff --git a/docs/api/plugin.md b/docs/api/plugin.md index 59a8fd78..29d95f21 100644 --- a/docs/api/plugin.md +++ b/docs/api/plugin.md @@ -25,38 +25,6 @@ sidebarDepth: 0 -## _class_ `Export` - -基类:`dict` - - -* **说明** - - 插件导出内容以使得其他插件可以获得。 - - - -* **示例** - - -```python -nonebot.export().default = "bar" - -@nonebot.export() -def some_function(): - pass - -# this doesn't work before python 3.9 -# use -# export = nonebot.export(); @export.sub -# instead -# See also PEP-614: https://www.python.org/dev/peps/pep-0614/ -@nonebot.export().sub -def something_else(): - pass -``` - - ## _class_ `Plugin` 基类:`object` @@ -1442,22 +1410,6 @@ def something_else(): -## `export()` - - -* **说明** - - 获取插件的导出内容对象 - - - -* **返回** - - - * `Export` - - - ## `require(name)` From afba90838faea6ce91478712f91fae78b2910197 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Wed, 31 Mar 2021 21:37:01 +0800 Subject: [PATCH 40/40] :memo: archive doc --- archive/2.0.0a11/advanced/runtime-hook.md | 60 ------- archive/{2.0.0a11 => 2.0.0a12}/README.md | 0 .../{2.0.0a11 => 2.0.0a12}/advanced/README.md | 18 +- .../advanced/export-and-require.md | 0 .../advanced/overloaded-handlers.md | 0 .../advanced/permission.md | 0 .../advanced/publish-plugin.md | 0 archive/2.0.0a12/advanced/runtime-hook.md | 151 +++++++++++++++++ .../advanced/scheduler.md | 0 archive/{2.0.0a11 => 2.0.0a12}/api/README.md | 3 + .../api/adapters/README.md | 41 ++++- .../api/adapters/cqhttp.md | 0 .../api/adapters/ding.md | 11 +- .../api/adapters/mirai.md | 0 archive/{2.0.0a11 => 2.0.0a12}/api/config.md | 0 .../api/drivers/README.md | 0 .../api/drivers/fastapi.md | 21 ++- .../api/drivers/quart.md | 0 .../{2.0.0a11 => 2.0.0a12}/api/exception.md | 0 archive/2.0.0a12/api/handler.md | 111 ++++++++++++ archive/{2.0.0a11 => 2.0.0a12}/api/log.md | 0 archive/{2.0.0a11 => 2.0.0a12}/api/matcher.md | 8 +- archive/{2.0.0a11 => 2.0.0a12}/api/message.md | 0 archive/{2.0.0a11 => 2.0.0a12}/api/nonebot.md | 0 .../{2.0.0a11 => 2.0.0a12}/api/permission.md | 0 archive/{2.0.0a11 => 2.0.0a12}/api/plugin.md | 158 +++++++++--------- archive/{2.0.0a11 => 2.0.0a12}/api/rule.md | 0 archive/{2.0.0a11 => 2.0.0a12}/api/typing.md | 0 archive/{2.0.0a11 => 2.0.0a12}/api/utils.md | 0 .../{2.0.0a11 => 2.0.0a12}/guide/README.md | 0 .../guide/basic-configuration.md | 0 .../guide/cqhttp-guide.md | 0 .../guide/creating-a-handler.md | 0 .../guide/creating-a-matcher.md | 0 .../guide/creating-a-plugin.md | 0 .../guide/creating-a-project.md | 0 .../guide/ding-guide.md | 56 +++++++ .../guide/end-or-start.md | 1 - .../guide/getting-started.md | 0 .../guide/images/Handle-Event.png | Bin .../2.0.0a12/guide/images/ding/jiaqian.png | Bin 0 -> 102378 bytes .../guide/images/ding/test_webhook.png | Bin 0 -> 76694 bytes .../2.0.0a12/guide/images/ding/webhook.png | Bin 0 -> 102603 bytes .../guide/installation.md | 2 + .../guide/loading-a-plugin.md | 0 .../guide/mirai-guide.md | 0 .../sidebar.config.json | 4 + docs/.vuepress/versions.json | 2 +- docs/api/plugin.md | 48 ++++++ docs_build/plugin.rst | 5 + 50 files changed, 544 insertions(+), 156 deletions(-) delete mode 100644 archive/2.0.0a11/advanced/runtime-hook.md rename archive/{2.0.0a11 => 2.0.0a12}/README.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/advanced/README.md (88%) rename archive/{2.0.0a11 => 2.0.0a12}/advanced/export-and-require.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/advanced/overloaded-handlers.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/advanced/permission.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/advanced/publish-plugin.md (100%) create mode 100644 archive/2.0.0a12/advanced/runtime-hook.md rename archive/{2.0.0a11 => 2.0.0a12}/advanced/scheduler.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/api/README.md (95%) rename archive/{2.0.0a11 => 2.0.0a12}/api/adapters/README.md (90%) rename archive/{2.0.0a11 => 2.0.0a12}/api/adapters/cqhttp.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/api/adapters/ding.md (88%) rename archive/{2.0.0a11 => 2.0.0a12}/api/adapters/mirai.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/api/config.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/api/drivers/README.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/api/drivers/fastapi.md (81%) rename archive/{2.0.0a11 => 2.0.0a12}/api/drivers/quart.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/api/exception.md (100%) create mode 100644 archive/2.0.0a12/api/handler.md rename archive/{2.0.0a11 => 2.0.0a12}/api/log.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/api/matcher.md (97%) rename archive/{2.0.0a11 => 2.0.0a12}/api/message.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/api/nonebot.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/api/permission.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/api/plugin.md (91%) rename archive/{2.0.0a11 => 2.0.0a12}/api/rule.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/api/typing.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/api/utils.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/guide/README.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/guide/basic-configuration.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/guide/cqhttp-guide.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/guide/creating-a-handler.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/guide/creating-a-matcher.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/guide/creating-a-plugin.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/guide/creating-a-project.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/guide/ding-guide.md (68%) rename archive/{2.0.0a11 => 2.0.0a12}/guide/end-or-start.md (72%) rename archive/{2.0.0a11 => 2.0.0a12}/guide/getting-started.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/guide/images/Handle-Event.png (100%) create mode 100644 archive/2.0.0a12/guide/images/ding/jiaqian.png create mode 100644 archive/2.0.0a12/guide/images/ding/test_webhook.png create mode 100644 archive/2.0.0a12/guide/images/ding/webhook.png rename archive/{2.0.0a11 => 2.0.0a12}/guide/installation.md (96%) rename archive/{2.0.0a11 => 2.0.0a12}/guide/loading-a-plugin.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/guide/mirai-guide.md (100%) rename archive/{2.0.0a11 => 2.0.0a12}/sidebar.config.json (97%) diff --git a/archive/2.0.0a11/advanced/runtime-hook.md b/archive/2.0.0a11/advanced/runtime-hook.md deleted file mode 100644 index 9145cd8f..00000000 --- a/archive/2.0.0a11/advanced/runtime-hook.md +++ /dev/null @@ -1,60 +0,0 @@ -# 钩子函数 - -[`钩子编程`](https://zh.wikipedia.org/wiki/%E9%92%A9%E5%AD%90%E7%BC%96%E7%A8%8B) - -> 钩子编程(hooking),也称作“挂钩”,是计算机程序设计术语,指通过拦截软件模块间的函数调用、消息传递、事件传递来修改或扩展操作系统、应用程序或其他软件组件的行为的各种技术。处理被拦截的函数调用、事件、消息的代码,被称为钩子(hook)。 - -在 `nonebot2` 中有一系列预定义的钩子函数,这些函数位于 [`nonebot.message`](https://v2.nonebot.dev/api/message.html) 模块下,我们可以以装饰器的形式利用这些函数,进行以下四种操作: - -:::warning 注意 -1.在钩子函数中,与 `matcher` 运行状态相关的函数将不可用,如 `matcher.finish()` - -2.如果需要在钩子函数中打断整个对话的执行,请参考以下范例: -```python -from nonebot.exception import IgnoredException - - -@event_preprocessor -async def do_something(bot: Bot, event: Event, state: T_State): - raise IgnoredException("reason") -``` -::: - -## 事件预处理 - -```python -from nonebot.message import event_preprocessor - -@event_preprocessor -async def do_something(bot: Bot, event: Event, state: T_State): - pass -``` - -## 事件后处理 - -```python -from nonebot.message import event_postprocessor - -@event_postprocessor -async def do_something(bot: Bot, event: Event, state: T_State): - pass -``` - -## 运行预处理 - -```python -from nonebot.message import run_preprocessor - -@run_preprocessor -async def do_something(matcher: Matcher, bot: Bot, event: Event, state: T_State): - pass -``` - -## 运行后处理 -```python -from nonebot.message import run_postprocessor - -@run_postprocessor -async def do_something(matcher: Matcher, exception: Optional[Exception], bot: Bot, event: Event, state: T_State): - pass -``` \ No newline at end of file diff --git a/archive/2.0.0a11/README.md b/archive/2.0.0a12/README.md similarity index 100% rename from archive/2.0.0a11/README.md rename to archive/2.0.0a12/README.md diff --git a/archive/2.0.0a11/advanced/README.md b/archive/2.0.0a12/advanced/README.md similarity index 88% rename from archive/2.0.0a11/advanced/README.md rename to archive/2.0.0a12/advanced/README.md index 6d34007c..6bdba844 100644 --- a/archive/2.0.0a11/advanced/README.md +++ b/archive/2.0.0a12/advanced/README.md @@ -10,9 +10,17 @@ **便捷起见,以下内容对 `Nonebot2` 会被称为 `nonebot`,与 `Nonebot2` 交互的机器人实现会被称为 `协议端`**。 -在实际应用中,`nonebot` 会充当一个高性能,轻量级的 Python 微服务框架。协议端可以通过 `http`, `websocket` 等方式与之通信,这个通信往往是双向的:一方面,协议端可以上报数据给 `nonebot`,`nonebot` 会处理数据并返回响应给协议端;另一方面,`nonebot` 可以主动推送数据给协议端。而 `nonebot` 便是围绕上述的双向通信进行工作的。 +在实际应用中,`nonebot` 会充当一个高性能,轻量级的 Python 微服务框架。协议端可以通过 `http`, `websocket` 等方式与之通信,这个通信往往是双向的:一方面,协议端可以上报数据给 `nonebot`,`nonebot` 会处理数据并返回响应给协议端;另一方面,`nonebot` 可以主动推送数据给协议端。而 `nonebot` 便是围绕双向通信进行工作的。 -在开始工作之前,`nonebot` 会依照**配置文件或初始化配置**启动,并会注册**协议适配器** `adapter`,之后便会加载**插件**, 随后,倘若一个协议端与 `nonebot` 进行了连接,`nonebot` 的后端驱动 `driver` 就会将 `adapter` 实例化为 `bot`,`nonebot` 便会利用 `bot` 开始工作,它的工作内容分为两个方面: +在开始工作之前,`nonebot` 需要进行准备工作: + +1. **运行 `nonebot.init` 初始化函数**,它会读取配置文件,并初始化 `nonebot` 和后端驱动 `driver` 对象。 +2. **注册协议适配器 `adapter`** 。 +3. **加载插件**。 + +准备工作完成后,`nonebot` 会利用 `uvicorn` 启动,并运行 `on_startup` 钩子函数。 + +随后,倘若一个协议端与 `nonebot` 进行了连接,`nonebot` 的后端驱动 `driver` 就会将 `adapter` 实例化为 `bot`,`nonebot` 便会利用 `bot` 开始工作,它的工作内容分为两个方面: 1. **事件处理**,`bot` 会将协议端上报的数据转化为 `事件`(`Event`),之后 `nonebot` 会根据一套既定流程来处理 `事件`。 @@ -41,7 +49,7 @@ 1. 协议端会通过 `websocket` 或者 `http` 等方式与 `nonebot` 的后端驱动 `driver` 连接,`driver` 会根据之前注册的 `adapter` 和配置文件的内容来进行鉴权,从而获得这个连接的唯一识别 id `self-id`,随后 `adapter` 就会利用 `self-id` 实例化为 `bot` 对象。 ::: tip - 需要注意的是,如果协议端通过 `websocket` 与 `nonebot` 连接,这个步骤只会在建立连接时进行;通过 `http` 方式连接时,会在协议端每次上报数据时都进行这个步骤。 + 需要注意的是,如果协议端通过 `websocket` 与 `nonebot` 连接,这个步骤只会在建立连接时进行,并在之后运行 `on_bot_connect` 钩子函数;通过 `http` 方式连接时,会在协议端每次上报数据时都进行这个步骤。 ::: ::: warning @@ -142,7 +150,7 @@ 这个异常可以在 `handler` 中由 `Matcher.reject` 抛出。 - 当 `nonebot` 捕获到它时,会停止运行当前 `handler` 并结束当前 `matcher` 的运行,并将**当前 handler 和后续 `handler`**交给一个临时 `Matcher` 来响应当前交互用户的下一个消息事件,当临时 `Matcher` 响应时,临时 `Matcher` 会运行当前 `handler` 和后续的 `handler`。 + 当 `nonebot` 捕获到它时,会停止运行当前 `handler` 并结束当前 `matcher` 的运行,并将当前 handler 和后续 `handler` 交给一个临时 `Matcher` 来响应当前交互用户的下一个消息事件,当临时 `Matcher` 响应时,临时 `Matcher` 会运行当前 `handler` 和后续的 `handler`。 4. **FinishedException** @@ -158,7 +166,7 @@ ## 调用 API -`nonebot` 可以通过 `bot` 来调用 API,API 可以向协议端发送数据,也可以向协议端请求更多的数据。 +`nonebot` 可以通过 `bot` 来调用 `API` ,`API` 可以向协议端发送数据,也可以向协议端请求更多的数据。 ::: tip 不同 `adapter` 规定了不同的 API,对应的 API 列表请参照协议规范。 diff --git a/archive/2.0.0a11/advanced/export-and-require.md b/archive/2.0.0a12/advanced/export-and-require.md similarity index 100% rename from archive/2.0.0a11/advanced/export-and-require.md rename to archive/2.0.0a12/advanced/export-and-require.md diff --git a/archive/2.0.0a11/advanced/overloaded-handlers.md b/archive/2.0.0a12/advanced/overloaded-handlers.md similarity index 100% rename from archive/2.0.0a11/advanced/overloaded-handlers.md rename to archive/2.0.0a12/advanced/overloaded-handlers.md diff --git a/archive/2.0.0a11/advanced/permission.md b/archive/2.0.0a12/advanced/permission.md similarity index 100% rename from archive/2.0.0a11/advanced/permission.md rename to archive/2.0.0a12/advanced/permission.md diff --git a/archive/2.0.0a11/advanced/publish-plugin.md b/archive/2.0.0a12/advanced/publish-plugin.md similarity index 100% rename from archive/2.0.0a11/advanced/publish-plugin.md rename to archive/2.0.0a12/advanced/publish-plugin.md diff --git a/archive/2.0.0a12/advanced/runtime-hook.md b/archive/2.0.0a12/advanced/runtime-hook.md new file mode 100644 index 00000000..f7e26be6 --- /dev/null +++ b/archive/2.0.0a12/advanced/runtime-hook.md @@ -0,0 +1,151 @@ +# 钩子函数 + +[`钩子编程`](https://zh.wikipedia.org/wiki/%E9%92%A9%E5%AD%90%E7%BC%96%E7%A8%8B) + +> 钩子编程(hooking),也称作“挂钩”,是计算机程序设计术语,指通过拦截软件模块间的函数调用、消息传递、事件传递来修改或扩展操作系统、应用程序或其他软件组件的行为的各种技术。处理被拦截的函数调用、事件、消息的代码,被称为钩子(hook)。 + +在 `nonebot2` 中有一系列预定义的钩子函数,分为两类:`全局钩子函数` 和 `事件钩子函数` ,这些钩子函数可以用装饰器的形式来使用。 + +## 全局钩子函数 + +全局钩子函数是指 `nonebot2` 针对其本身运行过程的钩子函数。 + +这些钩子函数是由其后端驱动 `driver`来运行的,故需要先获得全局 `driver` 对象: + +```python +from nonebot import get_driver + + +driver=get_driver() +``` + +共分为五种函数: + +### 启动准备 + +这个钩子函数会在 `nonebot2` 启动时运行。 + +```python +@driver.on_startup +async def do_something(): + pass +``` + +### 终止处理 + +这个钩子函数会在 `nonebot2` 终止时运行。 + +```python +@driver.on_shutdown +async def do_something(): + pass +``` + +### bot 连接处理 + +这个钩子函数会在 `bot` 通过 `websocket` 连接到 `nonebot2` 时运行。 + +```python +@driver.on_bot_connect +async def do_something(bot: Bot): + pass +``` + +### bot 断开处理 + +这个钩子函数会在 `bot` 断开与 `nonebot2` 的 `websocket` 连接时运行。 + +```python +@driver.on_bot_disconnect +async def do_something(bot: Bot): + pass +``` + +### bot api 调用钩子 + +这个钩子函数会在 `Bot` 调用 API 时运行。 + +```python +from nonebot.adapters import Bot + +@Bot.on_calling_api +async def handle_api_call(bot: Bot, api: str, data: Dict[str, Any]): + pass +``` + +## 事件处理钩子 + +这些钩子函数指的是影响 `nonebot2` 进行 `事件处理` 的函数。 + +:::tip 提示 + +关于 `事件处理` 的流程,可以在[这里](./README)查阅。 + +::: + +:::warning 注意 + +1.在事件处理钩子函数中,与 `matcher` 运行状态相关的函数将不可用,如 `matcher.finish()` + +2.如果需要在事件处理钩子函数中打断整个对话的执行,请参考以下范例: + +```python +from nonebot.exception import IgnoredException + + +@event_preprocessor +async def do_something(bot: Bot, event: Event, state: T_State): + raise IgnoredException("reason") +``` + +::: + +共分为四种函数: + +### 事件预处理 + +这个钩子函数会在 `Event` 上报到 `nonebot2` 时运行 + +```python +from nonebot.message import event_preprocessor + +@event_preprocessor +async def do_something(bot: Bot, event: Event, state: T_State): + pass +``` + +### 事件后处理 + +这个钩子函数会在 `nonebot2` 处理 `Event` 后运行 + +```python +from nonebot.message import event_postprocessor + +@event_postprocessor +async def do_something(bot: Bot, event: Event, state: T_State): + pass +``` + +### 运行预处理 + +这个钩子函数会在 `nonebot2`运行 `matcher` 前运行。 + +```python +from nonebot.message import run_preprocessor + +@run_preprocessor +async def do_something(matcher: Matcher, bot: Bot, event: Event, state: T_State): + pass +``` + +### 运行后处理 + +这个钩子函数会在 `nonebot2`运行 `matcher` 后运行。 + +```python +from nonebot.message import run_postprocessor + +@run_postprocessor +async def do_something(matcher: Matcher, exception: Optional[Exception], bot: Bot, event: Event, state: T_State): + pass +``` diff --git a/archive/2.0.0a11/advanced/scheduler.md b/archive/2.0.0a12/advanced/scheduler.md similarity index 100% rename from archive/2.0.0a11/advanced/scheduler.md rename to archive/2.0.0a12/advanced/scheduler.md diff --git a/archive/2.0.0a11/api/README.md b/archive/2.0.0a12/api/README.md similarity index 95% rename from archive/2.0.0a11/api/README.md rename to archive/2.0.0a12/api/README.md index e12dd0ff..3d5a6497 100644 --- a/archive/2.0.0a11/api/README.md +++ b/archive/2.0.0a12/api/README.md @@ -19,6 +19,9 @@ * [nonebot.matcher](matcher.html) + * [nonebot.handler](handler.html) + + * [nonebot.rule](rule.html) diff --git a/archive/2.0.0a11/api/adapters/README.md b/archive/2.0.0a12/api/adapters/README.md similarity index 90% rename from archive/2.0.0a11/api/adapters/README.md rename to archive/2.0.0a12/api/adapters/README.md index 172e87a4..bd4aab2a 100644 --- a/archive/2.0.0a11/api/adapters/README.md +++ b/archive/2.0.0a12/api/adapters/README.md @@ -27,6 +27,21 @@ Driver 对象 Config 配置对象 +### `_call_api_hook` + + +* **类型** + + `Set[T_CallingAPIHook]` + + + +* **说明** + + call_api 时执行的函数 + + + ### _abstract_ `__init__(connection_type, self_id, *, websocket=None)` @@ -93,7 +108,7 @@ Adapter 类型 * `headers: dict`: 请求头 - * `body: Optional[dict]`: 请求数据,WebSocket 连接该部分为空 + * `body: Optional[bytes]`: 请求数据,WebSocket 连接该部分为 None @@ -127,7 +142,26 @@ Adapter 类型 -### _abstract async_ `call_api(api, **data)` +### _abstract async_ `_call_api(api, **data)` + + +* **说明** + + `adapter` 实际调用 api 的逻辑实现函数,实现该方法以调用 api。 + + + +* **参数** + + + * `api: str`: API 名称 + + + * `**data`: API 数据 + + + +### _async_ `call_api(api, **data)` * **说明** @@ -142,6 +176,9 @@ Adapter 类型 * `api: str`: API 名称 + * `self_id: Optional[str]`: 指定调用 API 的机器人 + + * `**data`: API 数据 diff --git a/archive/2.0.0a11/api/adapters/cqhttp.md b/archive/2.0.0a12/api/adapters/cqhttp.md similarity index 100% rename from archive/2.0.0a11/api/adapters/cqhttp.md rename to archive/2.0.0a12/api/adapters/cqhttp.md diff --git a/archive/2.0.0a11/api/adapters/ding.md b/archive/2.0.0a12/api/adapters/ding.md similarity index 88% rename from archive/2.0.0a11/api/adapters/ding.md rename to archive/2.0.0a12/api/adapters/ding.md index 7bb07c8a..2c531a7b 100644 --- a/archive/2.0.0a11/api/adapters/ding.md +++ b/archive/2.0.0a12/api/adapters/ding.md @@ -129,6 +129,9 @@ sidebarDepth: 0 * `api: str`: API 名称 + * `event: Optional[MessageEvent]`: Event 对象 + + * `**data: Any`: API 参数 @@ -150,7 +153,7 @@ sidebarDepth: 0 -### _async_ `send(event, message, at_sender=False, **kwargs)` +### _async_ `send(event, message, at_sender=False, webhook=None, secret=None, **kwargs)` * **说明** @@ -171,6 +174,12 @@ sidebarDepth: 0 * `at_sender: bool`: 是否 @ 事件主体 + * `webhook: Optional[str]`: 该条消息将调用的 webhook 地址。不传则将使用 sessionWebhook,若其也不存在,该条消息不发送,使用自定义 webhook 时注意你设置的安全方式,如加关键词,IP地址,加签等等。 + + + * `secret: Optional[str]`: 如果你使用自定义的 webhook 地址,推荐使用加签方式对消息进行验证,将 机器人安全设置页面,加签一栏下面显示的SEC开头的字符串 传入这个参数即可。 + + * `**kwargs`: 覆盖默认参数 diff --git a/archive/2.0.0a11/api/adapters/mirai.md b/archive/2.0.0a12/api/adapters/mirai.md similarity index 100% rename from archive/2.0.0a11/api/adapters/mirai.md rename to archive/2.0.0a12/api/adapters/mirai.md diff --git a/archive/2.0.0a11/api/config.md b/archive/2.0.0a12/api/config.md similarity index 100% rename from archive/2.0.0a11/api/config.md rename to archive/2.0.0a12/api/config.md diff --git a/archive/2.0.0a11/api/drivers/README.md b/archive/2.0.0a12/api/drivers/README.md similarity index 100% rename from archive/2.0.0a11/api/drivers/README.md rename to archive/2.0.0a12/api/drivers/README.md diff --git a/archive/2.0.0a11/api/drivers/fastapi.md b/archive/2.0.0a12/api/drivers/fastapi.md similarity index 81% rename from archive/2.0.0a11/api/drivers/fastapi.md rename to archive/2.0.0a12/api/drivers/fastapi.md index fba15c68..3b2f4f23 100644 --- a/archive/2.0.0a11/api/drivers/fastapi.md +++ b/archive/2.0.0a12/api/drivers/fastapi.md @@ -28,7 +28,7 @@ FastAPI 驱动框架设置,详情参考 FastAPI 文档 * **说明** - openapi.json 地址,默认为 None 即关闭 + `openapi.json` 地址,默认为 `None` 即关闭 @@ -43,7 +43,7 @@ FastAPI 驱动框架设置,详情参考 FastAPI 文档 * **说明** - swagger 地址,默认为 None 即关闭 + `swagger` 地址,默认为 `None` 即关闭 @@ -58,7 +58,22 @@ FastAPI 驱动框架设置,详情参考 FastAPI 文档 * **说明** - redoc 地址,默认为 None 即关闭 + `redoc` 地址,默认为 `None` 即关闭 + + + +### `fastapi_reload_dirs` + + +* **类型** + + `List[str]` + + + +* **说明** + + `debug` 模式下重载监控文件夹列表,默认为 uvicorn 默认值 diff --git a/archive/2.0.0a11/api/drivers/quart.md b/archive/2.0.0a12/api/drivers/quart.md similarity index 100% rename from archive/2.0.0a11/api/drivers/quart.md rename to archive/2.0.0a12/api/drivers/quart.md diff --git a/archive/2.0.0a11/api/exception.md b/archive/2.0.0a12/api/exception.md similarity index 100% rename from archive/2.0.0a11/api/exception.md rename to archive/2.0.0a12/api/exception.md diff --git a/archive/2.0.0a12/api/handler.md b/archive/2.0.0a12/api/handler.md new file mode 100644 index 00000000..dc2ab74f --- /dev/null +++ b/archive/2.0.0a12/api/handler.md @@ -0,0 +1,111 @@ +--- +contentSidebar: true +sidebarDepth: 0 +--- + +# NoneBot.handler 模块 + +## 事件处理函数 + +该模块实现事件处理函数的封装,以实现动态参数等功能。 + + +## _class_ `Handler` + +基类:`object` + +事件处理函数类 + + +### `__init__(func)` + +装饰事件处理函数以便根据动态参数运行 + + +### `func` + + +* **类型** + + `T_Handler` + + + +* **说明** + + 事件处理函数 + + + +### `signature` + + +* **类型** + + `inspect.Signature` + + + +* **说明** + + 事件处理函数签名 + + + +### _property_ `bot_type` + + +* **类型** + + `Union[Type["Bot"], inspect.Parameter.empty]` + + + +* **说明** + + 事件处理函数接受的 Bot 对象类型 + + + +### _property_ `event_type` + + +* **类型** + + `Optional[Union[Type[Event], inspect.Parameter.empty]]` + + + +* **说明** + + 事件处理函数接受的 event 类型 / 不需要 event 参数 + + + +### _property_ `state_type` + + +* **类型** + + `Optional[Union[T_State, inspect.Parameter.empty]]` + + + +* **说明** + + 事件处理函数是否接受 state 参数 + + + +### _property_ `matcher_type` + + +* **类型** + + `Optional[Union[Type["Matcher"], inspect.Parameter.empty]]` + + + +* **说明** + + 事件处理函数是否接受 matcher 参数 diff --git a/archive/2.0.0a11/api/log.md b/archive/2.0.0a12/api/log.md similarity index 100% rename from archive/2.0.0a11/api/log.md rename to archive/2.0.0a12/api/log.md diff --git a/archive/2.0.0a11/api/matcher.md b/archive/2.0.0a12/api/matcher.md similarity index 97% rename from archive/2.0.0a11/api/matcher.md rename to archive/2.0.0a12/api/matcher.md index 509ab6e9..0683c8f9 100644 --- a/archive/2.0.0a11/api/matcher.md +++ b/archive/2.0.0a12/api/matcher.md @@ -7,7 +7,7 @@ sidebarDepth: 0 ## 事件响应器 -该模块实现事件响应器的创建与运行,并提供一些快捷方法来帮助用户更好的与机器人进行 对话 。 +该模块实现事件响应器的创建与运行,并提供一些快捷方法来帮助用户更好的与机器人进行对话 。 ## `matchers` @@ -202,7 +202,7 @@ sidebarDepth: 0 * **类型** - `Optional[T_ArgsParser]` + `Optional[T_TypeUpdater]` @@ -217,7 +217,7 @@ sidebarDepth: 0 * **类型** - `Optional[T_ArgsParser]` + `Optional[T_PermissionUpdater]` @@ -237,7 +237,7 @@ sidebarDepth: 0 * **类型** - `List[T_Handler]` + `List[Handler]` diff --git a/archive/2.0.0a11/api/message.md b/archive/2.0.0a12/api/message.md similarity index 100% rename from archive/2.0.0a11/api/message.md rename to archive/2.0.0a12/api/message.md diff --git a/archive/2.0.0a11/api/nonebot.md b/archive/2.0.0a12/api/nonebot.md similarity index 100% rename from archive/2.0.0a11/api/nonebot.md rename to archive/2.0.0a12/api/nonebot.md diff --git a/archive/2.0.0a11/api/permission.md b/archive/2.0.0a12/api/permission.md similarity index 100% rename from archive/2.0.0a11/api/permission.md rename to archive/2.0.0a12/api/permission.md diff --git a/archive/2.0.0a11/api/plugin.md b/archive/2.0.0a12/api/plugin.md similarity index 91% rename from archive/2.0.0a11/api/plugin.md rename to archive/2.0.0a12/api/plugin.md index a924bb6b..ca0827ce 100644 --- a/archive/2.0.0a11/api/plugin.md +++ b/archive/2.0.0a12/api/plugin.md @@ -25,38 +25,6 @@ sidebarDepth: 0 -## _class_ `Export` - -基类:`dict` - - -* **说明** - - 插件导出内容以使得其他插件可以获得。 - - - -* **示例** - - -```python -nonebot.export().default = "bar" - -@nonebot.export() -def some_function(): - pass - -# this doesn't work before python 3.9 -# use -# export = nonebot.export(); @export.sub -# instead -# See also PEP-614: https://www.python.org/dev/peps/pep-0614/ -@nonebot.export().sub -def something_else(): - pass -``` - - ## _class_ `Plugin` 基类:`object` @@ -82,15 +50,6 @@ def something_else(): * **说明**: 插件模块对象 -### `matcher` - - -* **类型**: `Set[Type[Matcher]]` - - -* **说明**: 插件内定义的 `Matcher` - - ### `export` @@ -100,6 +59,15 @@ def something_else(): * **说明**: 插件内定义的导出内容 +### _property_ `matcher` + + +* **类型**: `Set[Type[Matcher]]` + + +* **说明**: 插件内定义的 `Matcher` + + ## `on(type='', rule=None, permission=None, *, handlers=None, temp=False, priority=1, block=False, state=None, state_factory=None)` @@ -121,7 +89,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -162,7 +130,7 @@ def something_else(): * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -206,7 +174,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -247,7 +215,7 @@ def something_else(): * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -288,7 +256,7 @@ def something_else(): * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -335,7 +303,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -382,7 +350,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -429,7 +397,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -481,7 +449,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -538,7 +506,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -590,7 +558,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -767,7 +735,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -808,7 +776,7 @@ def something_else(): * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -852,7 +820,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -893,7 +861,7 @@ def something_else(): * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -934,7 +902,7 @@ def something_else(): * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -981,7 +949,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -1028,7 +996,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -1075,7 +1043,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -1127,7 +1095,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -1184,7 +1152,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -1236,7 +1204,7 @@ def something_else(): * `permission: Optional[Permission]`: 事件响应权限 - * `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 + * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表 * `temp: bool`: 是否为临时事件响应器(仅执行一次) @@ -1442,22 +1410,6 @@ def something_else(): -## `export()` - - -* **说明** - - 获取插件的导出内容对象 - - - -* **返回** - - - * `Export` - - - ## `require(name)` @@ -1478,3 +1430,51 @@ def something_else(): * `Optional[Export]` + + + +## _class_ `Export` + +基类:`dict` + + +* **说明** + + 插件导出内容以使得其他插件可以获得。 + + + +* **示例** + + +```python +nonebot.export().default = "bar" + +@nonebot.export() +def some_function(): + pass + +# this doesn't work before python 3.9 +# use +# export = nonebot.export(); @export.sub +# instead +# See also PEP-614: https://www.python.org/dev/peps/pep-0614/ +@nonebot.export().sub +def something_else(): + pass +``` + + +## `export()` + + +* **说明** + + 获取插件的导出内容对象 + + + +* **返回** + + + * `Export` diff --git a/archive/2.0.0a11/api/rule.md b/archive/2.0.0a12/api/rule.md similarity index 100% rename from archive/2.0.0a11/api/rule.md rename to archive/2.0.0a12/api/rule.md diff --git a/archive/2.0.0a11/api/typing.md b/archive/2.0.0a12/api/typing.md similarity index 100% rename from archive/2.0.0a11/api/typing.md rename to archive/2.0.0a12/api/typing.md diff --git a/archive/2.0.0a11/api/utils.md b/archive/2.0.0a12/api/utils.md similarity index 100% rename from archive/2.0.0a11/api/utils.md rename to archive/2.0.0a12/api/utils.md diff --git a/archive/2.0.0a11/guide/README.md b/archive/2.0.0a12/guide/README.md similarity index 100% rename from archive/2.0.0a11/guide/README.md rename to archive/2.0.0a12/guide/README.md diff --git a/archive/2.0.0a11/guide/basic-configuration.md b/archive/2.0.0a12/guide/basic-configuration.md similarity index 100% rename from archive/2.0.0a11/guide/basic-configuration.md rename to archive/2.0.0a12/guide/basic-configuration.md diff --git a/archive/2.0.0a11/guide/cqhttp-guide.md b/archive/2.0.0a12/guide/cqhttp-guide.md similarity index 100% rename from archive/2.0.0a11/guide/cqhttp-guide.md rename to archive/2.0.0a12/guide/cqhttp-guide.md diff --git a/archive/2.0.0a11/guide/creating-a-handler.md b/archive/2.0.0a12/guide/creating-a-handler.md similarity index 100% rename from archive/2.0.0a11/guide/creating-a-handler.md rename to archive/2.0.0a12/guide/creating-a-handler.md diff --git a/archive/2.0.0a11/guide/creating-a-matcher.md b/archive/2.0.0a12/guide/creating-a-matcher.md similarity index 100% rename from archive/2.0.0a11/guide/creating-a-matcher.md rename to archive/2.0.0a12/guide/creating-a-matcher.md diff --git a/archive/2.0.0a11/guide/creating-a-plugin.md b/archive/2.0.0a12/guide/creating-a-plugin.md similarity index 100% rename from archive/2.0.0a11/guide/creating-a-plugin.md rename to archive/2.0.0a12/guide/creating-a-plugin.md diff --git a/archive/2.0.0a11/guide/creating-a-project.md b/archive/2.0.0a12/guide/creating-a-project.md similarity index 100% rename from archive/2.0.0a11/guide/creating-a-project.md rename to archive/2.0.0a12/guide/creating-a-project.md diff --git a/archive/2.0.0a11/guide/ding-guide.md b/archive/2.0.0a12/guide/ding-guide.md similarity index 68% rename from archive/2.0.0a11/guide/ding-guide.md rename to archive/2.0.0a12/guide/ding-guide.md index 7e1d8d01..cb710d26 100644 --- a/archive/2.0.0a11/guide/ding-guide.md +++ b/archive/2.0.0a12/guide/ding-guide.md @@ -11,6 +11,10 @@ - [群机器人概述](https://developers.dingtalk.com/document/app/overview-of-group-robots) - [开发企业内部机器人](https://developers.dingtalk.com/document/app/develop-enterprise-internal-robots) +钉钉官方机器人教程(Java): + +- [开发一个钉钉机器人](https://developers.dingtalk.com/document/tutorial/create-a-robot) + ## 安装 NoneBot 钉钉 适配器 ```bash @@ -93,6 +97,58 @@ async def raw_handler(bot: DingBot, event: MessageEvent): 其他消息格式请查看 [钉钉适配器的 MessageSegment](https://github.com/nonebot/nonebot2/blob/dev/nonebot/adapters/ding/message.py#L8),里面封装了很多有关消息的方法,比如 `code`、`image`、`feedCard` 等。 +## 发送到特定群聊 + +钉钉也支持通过 Webhook 的方式直接将消息推送到某个群聊([参考链接](https://developers.dingtalk.com/document/app/custom-robot-access/title-zob-eyu-qse)),你可以在机器人的设置中看到当前群的 Webhook 地址。 + +![机器人所在群的 Webhook 地址](./images/ding/webhook.png) + +获取到Webhook地址后,用户可以向这个地址发起HTTP POST 请求,即可实现给该钉钉群发送消息。 + +对于这种通过 Webhook 推送的消息,钉钉需要开发者进行安全方面的设置(目前有3种安全设置方式,请根据需要选择一种),如下: + +1. **自定义关键词:** 最多可以设置10个关键词,消息中至少包含其中1个关键词才可以发送成功。 + 例如添加了一个自定义关键词:监控报警,则这个机器人所发送的消息,必须包含监控报警这个词,才能发送成功。 +2. **加签:** 发送请求时带上验签的值,可以在机器人设置里看到密钥。 + ![加签密钥](./images/ding/jiaqian.png) +3. **IP地址(段):** 设定后,只有来自IP地址范围内的请求才会被正常处理。支持两种设置方式:IP地址和IP地址段,暂不支持IPv6地址白名单。 + +如果你选择 1/3 两种安全设置,你需要自己确认当前网络和发送的消息能被钉钉接受,然后使用 `bot.send` 的时候将 webhook 地址传入 webhook 参数即可。 + +如我设置了 `打卡` 为关键词: + +```python +message = MessageSegment.text("打卡成功:XXXXXX") +await hello.send( + message, + webhook= + "https://oapi.dingtalk.com/robot/send?access_token=XXXXXXXXXXXXXX", +) +``` + +对于第二种加签方式,你可以在 `bot.send` 的时候把 `secret` 参数传进去,Nonebot 内部会自动帮你计算发送该消息的签名并发送,如: + +这里的 `secret` 参数就是加签选项给出的那个密钥。 + +```python +message = MessageSegment.raw({ + "msgtype": "text", + "text": { + "content": 'hello from webhook,一定要注意安全方式的鉴权哦,否则可能发送失败的' + }, +}) +message += MessageSegment.atDingtalkIds(event.senderId) +await hello.send( + message, + webhook="https://oapi.dingtalk.com/robot/send?access_token=XXXXXXXXXXXXXX", + secret="SECXXXXXXXXXXXXXXXXXXXXXXXXX", +) +``` + +然后就可以发送成功了。 + +![测试 Webhook 发送](images/ding/test_webhook.png) + ## 创建机器人并连接 在钉钉官方文档 [「开发企业内部机器人 -> 步骤一:创建机器人应用」](https://developers.dingtalk.com/document/app/develop-enterprise-internal-robots/title-ufs-4gh-poh) 中有详细介绍,这里就省去创建的步骤,介绍一下如何连接上程序。 diff --git a/archive/2.0.0a11/guide/end-or-start.md b/archive/2.0.0a12/guide/end-or-start.md similarity index 72% rename from archive/2.0.0a11/guide/end-or-start.md rename to archive/2.0.0a12/guide/end-or-start.md index 9587c4bb..aa072c3d 100644 --- a/archive/2.0.0a11/guide/end-or-start.md +++ b/archive/2.0.0a12/guide/end-or-start.md @@ -4,6 +4,5 @@ - 请千万注意事件处理器的优先级设定 - 在匹配规则中请勿使用耗时极长的函数 -- 同一个用户可以**跨群**(**私聊**)继续他的事件处理(除非做出权限限制,将在后续介绍) 如果「指南」还不能满足你,前往 [进阶](../advanced/README.md) 查看更多的功能信息。 diff --git a/archive/2.0.0a11/guide/getting-started.md b/archive/2.0.0a12/guide/getting-started.md similarity index 100% rename from archive/2.0.0a11/guide/getting-started.md rename to archive/2.0.0a12/guide/getting-started.md diff --git a/archive/2.0.0a11/guide/images/Handle-Event.png b/archive/2.0.0a12/guide/images/Handle-Event.png similarity index 100% rename from archive/2.0.0a11/guide/images/Handle-Event.png rename to archive/2.0.0a12/guide/images/Handle-Event.png diff --git a/archive/2.0.0a12/guide/images/ding/jiaqian.png b/archive/2.0.0a12/guide/images/ding/jiaqian.png new file mode 100644 index 0000000000000000000000000000000000000000..8895d6c6d866cd6049642da40dccebdfb94429bc GIT binary patch literal 102378 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 mCp24mDwTf*(Y3iRAG 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 literal 0 HcmV?d00001 diff --git a/archive/2.0.0a12/guide/images/ding/webhook.png b/archive/2.0.0a12/guide/images/ding/webhook.png new file mode 100644 index 0000000000000000000000000000000000000000..c957e72f925e1490afdfabf2af7b0aecfaeb3252 GIT binary patch literal 102603 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%0DQ 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 literal 0 HcmV?d00001 diff --git a/archive/2.0.0a11/guide/installation.md b/archive/2.0.0a12/guide/installation.md similarity index 96% rename from archive/2.0.0a11/guide/installation.md rename to archive/2.0.0a12/guide/installation.md index 1c6b5d38..04e5e7af 100644 --- a/archive/2.0.0a11/guide/installation.md +++ b/archive/2.0.0a12/guide/installation.md @@ -68,6 +68,7 @@ pip install . # 不推荐 ``` ## 安装适配器 + 适配器可以通过 `nb-cli` 在创建项目时根据你的选择自动安装,也可以自行使用 `pip` 安装 ```bash @@ -99,6 +100,7 @@ nb plugin install xxx - [NoneBot-Plugin-Docs](https://github.com/nonebot/nonebot2/tree/master/packages/nonebot-plugin-docs) 离线文档插件 - [NoneBot-Plugin-Test](https://github.com/nonebot/plugin-test) 本地机器人测试前端插件 - [NoneBot-Plugin-APScheduler](https://github.com/nonebot/plugin-apscheduler) 定时任务插件 +- [NoneBot-Plugin-LocalStore](https://github.com/nonebot/plugin-localstore) 本地数据文件存储插件 - [NoneBot-Plugin-Sentry](https://github.com/cscs181/QQ-GitHub-Bot/tree/master/src/plugins/nonebot_plugin_sentry) Sentry 在线日志分析插件 - [NoneBot-Plugin-Status](https://github.com/cscs181/QQ-GitHub-Bot/tree/master/src/plugins/nonebot_plugin_status) 服务器状态查看插件 diff --git a/archive/2.0.0a11/guide/loading-a-plugin.md b/archive/2.0.0a12/guide/loading-a-plugin.md similarity index 100% rename from archive/2.0.0a11/guide/loading-a-plugin.md rename to archive/2.0.0a12/guide/loading-a-plugin.md diff --git a/archive/2.0.0a11/guide/mirai-guide.md b/archive/2.0.0a12/guide/mirai-guide.md similarity index 100% rename from archive/2.0.0a11/guide/mirai-guide.md rename to archive/2.0.0a12/guide/mirai-guide.md diff --git a/archive/2.0.0a11/sidebar.config.json b/archive/2.0.0a12/sidebar.config.json similarity index 97% rename from archive/2.0.0a11/sidebar.config.json rename to archive/2.0.0a12/sidebar.config.json index 8b16881e..97e82f74 100644 --- a/archive/2.0.0a11/sidebar.config.json +++ b/archive/2.0.0a12/sidebar.config.json @@ -119,6 +119,10 @@ "title": "nonebot.matcher 模块", "path": "matcher" }, + { + "title": "nonebot.handler 模块", + "path": "handler" + }, { "title": "nonebot.rule 模块", "path": "rule" diff --git a/docs/.vuepress/versions.json b/docs/.vuepress/versions.json index a171912c..b159ca74 100644 --- a/docs/.vuepress/versions.json +++ b/docs/.vuepress/versions.json @@ -1,5 +1,5 @@ [ - "2.0.0a11", + "2.0.0a12", "2.0.0a10", "2.0.0a8.post2", "2.0.0a7" diff --git a/docs/api/plugin.md b/docs/api/plugin.md index 29d95f21..ca0827ce 100644 --- a/docs/api/plugin.md +++ b/docs/api/plugin.md @@ -1430,3 +1430,51 @@ sidebarDepth: 0 * `Optional[Export]` + + + +## _class_ `Export` + +基类:`dict` + + +* **说明** + + 插件导出内容以使得其他插件可以获得。 + + + +* **示例** + + +```python +nonebot.export().default = "bar" + +@nonebot.export() +def some_function(): + pass + +# this doesn't work before python 3.9 +# use +# export = nonebot.export(); @export.sub +# instead +# See also PEP-614: https://www.python.org/dev/peps/pep-0614/ +@nonebot.export().sub +def something_else(): + pass +``` + + +## `export()` + + +* **说明** + + 获取插件的导出内容对象 + + + +* **返回** + + + * `Export` diff --git a/docs_build/plugin.rst b/docs_build/plugin.rst index 752fbe4a..9c463240 100644 --- a/docs_build/plugin.rst +++ b/docs_build/plugin.rst @@ -10,3 +10,8 @@ NoneBot.plugin 模块 :members: :show-inheritance: :special-members: __init__ + +.. automodule:: nonebot.plugin.export + :members: + :show-inheritance: + :special-members: __init__