From cbfc2ace94ca844b9197a5ddb789fe46189e7d54 Mon Sep 17 00:00:00 2001 From: Jackistang Date: Sat, 14 Aug 2021 22:50:35 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E3=80=90=E5=A2=9E=E5=8A=A0=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E3=80=91=E6=B7=BB=E5=8A=A0=20ringbuffer=20=E5=92=8C?= =?UTF-8?q?=20workqueue=20=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../device-ipc/ringbuffer/ringbuffer.md | 39 ++++++++++ .../workqueue/figures/system workqueue.png | Bin 0 -> 67962 bytes .../workqueue/figures/workqueue.png | Bin 0 -> 20598 bytes .../device-ipc/workqueue/workqueue.md | 67 ++++++++++++++++++ 4 files changed, 106 insertions(+) create mode 100644 rt-thread-version/rt-thread-standard/programming-manual/device-ipc/ringbuffer/ringbuffer.md create mode 100644 rt-thread-version/rt-thread-standard/programming-manual/device-ipc/workqueue/figures/system workqueue.png create mode 100644 rt-thread-version/rt-thread-standard/programming-manual/device-ipc/workqueue/figures/workqueue.png create mode 100644 rt-thread-version/rt-thread-standard/programming-manual/device-ipc/workqueue/workqueue.md diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/ringbuffer/ringbuffer.md b/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/ringbuffer/ringbuffer.md new file mode 100644 index 0000000..f5d605e --- /dev/null +++ b/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/ringbuffer/ringbuffer.md @@ -0,0 +1,39 @@ +# ringbuffer + +ringbuffer(环形缓冲区)是一个非常实用的工具,RT-Thread 内部也提供了该工具,通过导入头文件 `#include ` 即可直接使用。 + +ringbuffer 的所有接口如下: + +```C +void rt_ringbuffer_init(struct rt_ringbuffer *rb, rt_uint8_t *pool, rt_int16_t size); +void rt_ringbuffer_reset(struct rt_ringbuffer *rb); +rt_size_t rt_ringbuffer_put(struct rt_ringbuffer *rb, const rt_uint8_t *ptr, rt_uint16_t length); +rt_size_t rt_ringbuffer_put_force(struct rt_ringbuffer *rb, const rt_uint8_t *ptr, rt_uint16_t length); +rt_size_t rt_ringbuffer_putchar(struct rt_ringbuffer *rb, const rt_uint8_t ch); +rt_size_t rt_ringbuffer_putchar_force(struct rt_ringbuffer *rb, const rt_uint8_t ch); +rt_size_t rt_ringbuffer_get(struct rt_ringbuffer *rb, rt_uint8_t *ptr, rt_uint16_t length); +rt_size_t rt_ringbuffer_peak(struct rt_ringbuffer *rb, rt_uint8_t **ptr); +rt_size_t rt_ringbuffer_getchar(struct rt_ringbuffer *rb, rt_uint8_t *ch); +rt_size_t rt_ringbuffer_data_len(struct rt_ringbuffer *rb); + +#ifdef RT_USING_HEAP +struct rt_ringbuffer* rt_ringbuffer_create(rt_uint16_t length); +void rt_ringbuffer_destroy(struct rt_ringbuffer *rb); +#endif + +rt_inline rt_uint16_t rt_ringbuffer_get_size(struct rt_ringbuffer *rb); +``` + +ringbuffer 的创建有两种方式,第一种是由调用者自己申请一块内存,并传入 `rt_ringbuffer_init()` 函数初始化 ringbuffer 对象,不再需要使用 ringbuffer 时调用 `rt_ringbuffer_reset()` 重置 ringbuffer 对象。当系统支持动态分配内存时,可以使用另一种方式创建 ringbuffer,调用 `rt_ringbuffer_create()` 函数并传入希望分配的缓冲区字节大小,此时函数内部会 malloc 一块内存用于充当缓冲区,不再使用 ringbuffer 对象时通过 `rt_ringbuffer_destroy()` 释放缓冲区并销毁 ringbuffer 对象。 + +向 ringbuffer 写入一个字节可以调用 `rt_ringbuffer_putchar()` 函数,不过当 ringbuffer 内部缓冲区满时,写入操作会失败,而另一个接口 `rt_ringbuffer_putchar_force()` 在此情况下则会**强制**写入,用新的数据覆盖旧的数据。 + +还可以调用 `rt_ringbuffer_put()` 一次性写入一块数据,当写入数据量大于 ringbuffer 缓冲区剩余空间时,写入的数据会被**截断**,而另一个接口 `rt_ringbuffer_put_force()` 在此情况下则会执行**覆盖**写入,用新的数据覆盖旧的数据。 + +从 ringbuffer 读取数据有两类接口。一种是从 ringbuffer 里取出数据,例如 `rt_ringbuffer_getchar()` 从 ringbuffer 里取出一个字节,`rt_ringbuffer_get()` 从 ringbuffer 里取出一块数据。另一种是获取 ringbuffer 里缓冲区的指针,但不取出数据,例如 `rt_ringbuffer_peak()` 函数获取 ringbuffer 里的缓冲区指针,函数返回时 `*ptr` 指向缓冲区里的第一个数据。 + +利用 `rt_ringbuffer_get_size()` 函数可获取 ringbuffer 里缓冲区的大小,用 `rt_ringbuffer_data_len()` 可获取 ringbuffer 里存储的数据字节大小。 + +--- + +ringbuffer 的使用十分简单,一般都是利用 **init** 接口初始化 ringbuffer,然后利用 **put** 接口向 ringbuffer 写入数据,然后另一端通过 **get** 接口从 ringbuffer 里取出数据。不过需要注意的是,RT-Thread 的 ringbuffer 组件并未提供线程阻塞的功能,因此 ringbuffer 本质上是一个全局共享的对象,多线程使用时注意使用互斥锁保护。 \ No newline at end of file diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/workqueue/figures/system workqueue.png b/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/workqueue/figures/system workqueue.png new file mode 100644 index 0000000000000000000000000000000000000000..e7469d1bcd4831d995d29d0ba526ba530df2a656 GIT binary patch literal 67962 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 z

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 literal 0 HcmV?d00001 diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/workqueue/workqueue.md b/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/workqueue/workqueue.md new file mode 100644 index 0000000..209aa51 --- /dev/null +++ b/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/workqueue/workqueue.md @@ -0,0 +1,67 @@ +# workqueue + +工作队列(workqueue)是一种转移任务执行环境的工具,例如当系统产生一个中断时,我们可以在中断处理函数里做一些紧急地操作,然后将另外一些不那么紧急,而且需要一定时间的任务封装成函数交给工作队列执行,此时该函数的执行环境就从**中断环境**变成了**线程环境**,这就是 Linux 里经常提及的中断处理“下半部”。 + +工作队列的原理也比较简单,可以参考下述图示: + +![](figures/workqueue.png) + +工作队列内部有一个工作链表(worklist),链表上有多个工作项(work item)节点,我们可以将工作项简单理解为函数,因此工作链表上就存储着一系列待执行的函数。而且工作队列内有个线程一直在轮询工作链表,每次都从工作链表中取出一个工作项,并执行其相关联的函数。当工作队列为空时,线程会被挂起。 + +--- + +RT-Thread 内有 workqueue 组件,导入头文件 `#include ` 即可使用,其所有接口如下: + +```C +struct rt_workqueue *rt_workqueue_create(const char *name, rt_uint16_t stack_size, rt_uint8_t priority); +rt_err_t rt_workqueue_destroy(struct rt_workqueue *queue); +rt_err_t rt_workqueue_dowork(struct rt_workqueue *queue, struct rt_work *work); +rt_err_t rt_workqueue_submit_work(struct rt_workqueue *queue, struct rt_work *work, rt_tick_t time); +rt_err_t rt_workqueue_cancel_work(struct rt_workqueue *queue, struct rt_work *work); +rt_err_t rt_workqueue_cancel_work_sync(struct rt_workqueue *queue, struct rt_work *work); +rt_err_t rt_workqueue_cancel_all_work(struct rt_workqueue *queue); +rt_err_t rt_workqueue_critical_work(struct rt_workqueue *queue, struct rt_work *work); + +#ifdef RT_USING_SYSTEM_WORKQUEUE +rt_err_t rt_work_submit(struct rt_work *work, rt_tick_t time); +rt_err_t rt_work_cancel(struct rt_work *work); +#endif /* RT_USING_SYSTEM_WORKQUEUE */ + +rt_inline void rt_work_init(struct rt_work *work, void (*work_func)(struct rt_work *work, void *work_data), void *work_data); +``` + +每一个工作项都需要通过 `rt_work_init()` 接口绑定一个函数,执行工作项即执行其绑定的函数,并且该接口还支持用户自定义数据 `void *work_data`,若使用自定义数据,需要保证该数据对象为静态存储的。 + +RT-Thread 系统提供了一个**系统工作队列**,可以通过 + +``` +RT-Thread Components + -> Device Drivers + -> Using device drivers IPC + -> Using system default workqueue +``` + +开启系统工作队列,还可以配置系统工作队列内线程栈的大小,线程的优先级,图示如下: + +![](figures/system workqueue.png) + +开启系统工作队列后,我们就可以通过 `rt_work_submit()` 函数向系统工作队列提交一个工作项,用 `rt_work_cancel()` 从系统工作队列里取消一个工作项。使用系统工作队列的好处是 RT-Thread 内部帮我们创建了一个工作队列,我们只需要提交工作项即可,使用简洁方便。 + +若不使用系统工作队列,我们也可以使用 `rt_workqueue_create()` 函数创建自己的工作队列,当不再需要时调用 `rt_workqueue_destroy()` 函数销毁工作队列。 + +向自己的工作队列提交工作项有三个接口,根据是否允许工作项延时提交可分为: + +- 允许工作项延时提交:`rt_workqueue_submit_work()` +- 不允许工作项延时提交:`rt_workqueue_dowork()`, `rt_workqueue_critical_work()` + +`rt_workqueue_submit_work()` 函数用于向工作队列提交工作项,该接口允许延时提交,函数参数 `time` 代表该工作项延时 time ticks 后才提交到工作队列的工作链表里等待执行。若 `time = 0`,则工作项立即挂载到工作链表的尾部。 + +`rt_workqueue_dowork()` 和 `rt_workqueue_critical_work()` 这两个接口不允许延时提交,工作项会被直接挂载到工作链表里等待执行,两者的区别是 dowork 接口将工作项挂载到工作链表的尾部,而 critical_work 接口将工作项挂载到工作链表的头部,因此 critical_work 接口提交的工作项在当前工作项执行完毕后会被立即执行,适用于一些比较紧急的任务。 + +当然,提交到工作队列的工作项也可以被取消,调用 `rt_workqueue_cancel_work()` 函数尝试取消某一个工作项的执行,若是该工作项正在执行,该函数返回 -RT_EBUSY 表示取消失败。`rt_workqueue_cancel_work_sync()` 函数也是用于取消一个工作项的执行,不过当该工作项正在执行时,该函数会阻塞,直到该工作项执行完毕。调用 `rt_workqueue_cancel_all_work()` 函数可以取消工作队列里的**所有**工作项。 + +--- + +使用注意事项: + +- 工作项里最好不要有会导致线程阻塞的代码,否则会影响后续工作项的执行。 \ No newline at end of file -- Gitee From cbccfc085778e454747e488fe40b4c98a89e52a6 Mon Sep 17 00:00:00 2001 From: Jackistang Date: Tue, 17 Aug 2021 01:03:22 +0800 Subject: [PATCH 2/4] update ringbuffer.md --- .../device-ipc/ringbuffer/figures/example.png | Bin 0 -> 10075 bytes .../device-ipc/ringbuffer/figures/peak.png | Bin 0 -> 6970 bytes .../ringbuffer/figures/ringbuffer.png | Bin 0 -> 93070 bytes .../ringbuffer/figures/ringbuffer_empty.png | Bin 0 -> 9258 bytes .../ringbuffer/figures/ringbuffer_full.png | Bin 0 -> 9404 bytes .../device-ipc/ringbuffer/ringbuffer.md | 291 +++++++++++++++++- 6 files changed, 275 insertions(+), 16 deletions(-) create mode 100644 rt-thread-version/rt-thread-standard/programming-manual/device-ipc/ringbuffer/figures/example.png create mode 100644 rt-thread-version/rt-thread-standard/programming-manual/device-ipc/ringbuffer/figures/peak.png create mode 100644 rt-thread-version/rt-thread-standard/programming-manual/device-ipc/ringbuffer/figures/ringbuffer.png create mode 100644 rt-thread-version/rt-thread-standard/programming-manual/device-ipc/ringbuffer/figures/ringbuffer_empty.png create mode 100644 rt-thread-version/rt-thread-standard/programming-manual/device-ipc/ringbuffer/figures/ringbuffer_full.png diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/ringbuffer/figures/example.png b/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/ringbuffer/figures/example.png new file mode 100644 index 0000000000000000000000000000000000000000..9fde4a28fb43b0c6022e22ed0356890a0ba75bb1 GIT binary patch literal 10075 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 bDf+!#?CBF&vLbM44kYtJQKCdl|K0xpj|h;j literal 0 HcmV?d00001 diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/ringbuffer/figures/peak.png b/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/ringbuffer/figures/peak.png new file mode 100644 index 0000000000000000000000000000000000000000..a8e50f387a8fb891ada87fb446e0932a8ae5a460 GIT binary patch literal 6970 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 literal 0 HcmV?d00001 diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/ringbuffer/figures/ringbuffer.png b/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/ringbuffer/figures/ringbuffer.png new file mode 100644 index 0000000000000000000000000000000000000000..d4af5c1c8eff908ad8dd06c3744054bd0f83a2e5 GIT binary patch literal 93070 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

D=l#7Ek7-iBC=gF97!Yu?djwrt;f zRfEMp_Ef06P1TQ@X>P+oV~HK=f^+FvW{UBP5QPnU+F zbtpeBg9Vx4*%?IZ*U0ho6%!Y#^KHT>`omW|L`r_67lc8JeJg;8jc0ywJZ-4fEWfHu zc`+hIRjZrJ3DtFXn_?*9sT~m#@fLB{h}dY$lM83?VH+}qDr;-Env;u{+{y8Nv3^u_ zmO-^OntI%p ztv`j>qI#N}WU8f!_P$J^f>FC5VG%)=X|Fstl_#dqvdCYVXuWOw?}jvGSx)k)c_$59 z<*6KOn6A6qR+;zio8PuPcU&NOqX~z7(Djc@T}YaAbQWZu;J7Bw7eIW?p*P;Ec+I9N zGyX5=>az7EHPT|qU?p<4KuaWl)q z;&0`;>r1{7-eUcn>-AA1ZIUm4>Yl)Q=IWj&XcEtg#Z%4K{HtPrnOXbE=#QHT(K%7w zqJn&`gL10kuZLZe*64Kvt}CTk?yM^djY}+5@CSRq93zPbG*^^9DmSEtW9Ruva>)ont~&77h;7PyX0!4oH& zet@o&8a!+!_6YmZB&remGW#oAP3A4GD$9p2kKI|oK}pmnUw^{igI8@1ecQRI5V=v} zi1^x+WFoQRYj+p%hA(X9ZFO4Iqf?%DRW7Uh*n+D^MVibt%uRcGMl zu6LzKI#7M7!48_2=yHd%pt$}j$(^ezlctKNQZ9t94Sh?0p5&-&C`4?q-wlSSkA!Da z!d>Oxr9om_=c9VH5$y*o8&a)WQc}G#($dAhcl!ae}~XdRH?vNVyQ>s%IAz&~ewJG`>+#ca68KfUDo2OacawU<0)a2c8k+N2Tn5-Ct=VK(V72g|9d*~rl?D)kX8h6uiC3h8eoP}j zTFhv?^Y05s&B+U*62W`^F@r(Bcf8J{Pcm7Mm)KQqTJ*qJf#LQu8Sh#&Hm}}I8S0f2 ztveF4Bbgi@r;}Ee$$dW53khol79=Erc-Y@BfSa^ikGmRs{j^~K>QXDLh_yLm00b%wOmZr>Y)8%<|cRfq|@(5cosjsnW|V6bJB3ch4?a=2K~eXuQ#S1sL7o9&>F!XFm20KwcUsJ z|HO(&Bnj0$?mI9ETu$tHSyNi$>)jVstM zoQlvv71Ek`EicpKDkM7&=e>$Z`XVmjRqSnIhqic1(C$|K2A9 zwFrth8-oOQ!fIU+p1LE{5WVU_EIp#{tX4*ss58yVl9#x=J=T$$G_J?fE3z6(XnSR7 zg{`7P0?_0N@jZwkGK+QB`)G;L8ShrURpBD{WE%;rvvLdY(+)>6!H@awf^l<0@{eJ+ui|#v@9?Gk>uFDi`AiZN`ZqL0 zW;jiHYcW@W3Fi;NK;0XFso3+CjqnBhV$nfnp3S8#aP_tN@F&MfLu>AH$wZdU08drY zAd#ps<-fUr&IcA`T(Lkty(f!3 zB4dwpC!U4E%m9+$RodV<&-azjmIkJEC$31^Sh zllB_Z>!Y{CoM53!9PVo(&Yjj-kb&XXNAT`txDd9f@M{)V!C>G{{nkL;Vjk%4*m`QP z+F9H5v4t@zm)^Kfl6}|1Vb`7y>-37pjU^(==G_t3o`Rzz`;-XF8;7kKJi0UE4O+Pl zO7PTAbK7xaX7?-G1Yv|?BmVtdQ%)=L4=e`ll$>^j-!!&yJS@&ftOVZc zzeib3Y2V|f3K1;b7h%hj>GPo`0{-hMZ$XXw!Xp2TmIb-o@w#otkm(_n^>kDtnZJs* zcmVhy7l>?%e{4z)>3Y`TAJYdui*J>lRYF&k7ll?$^7q!mPxZ!d9(69`w zS5i`0PJpQLj(okpQ2H=4)naIlMB4_B@>Z&Mh*})FY^n0Lnf4tI0B{Z9SeqUBX=hZ~ z5dE}TLvPR{uzYAhuB@w5VSuJa7YW9C2ybSl?7dxJkF6j6@GBZ{uEXVp?x0f~gn1cT zJH5zhLB?C6Y z5oV0v%clKx^9Twp$>i0|k!i1_O6`(bTJw-T#1^fJgo7{pv{|32ZH_O{@i}=y3m%pNX9RIc`SRt6V|~P&?wgU-YHnj_ zov41Mz_AwB z3<;+X)j9vKpu-kWscFezgy!Ws-}kfL8DafU;;3uTN^VGf5}PyA`Q0VB(cCK_U=wPm z_*bDiR7XaCrX38_Eu49-#9k&sb9b0%TiGW`)R!#CetqaE&BT&9@He))98^a}^3uAXDkh;i7Fm&C%#pYUR=e{nuC2>_ z1CX(57HPt*e@_j@Ps7@dj*nO5*x)+$yz#^z9@|IpsO{zJ!C{bl_4!nuj&IU1TpHqq zP6g!^`h>DVc2O{J)*VpUF!<1_2(v%UdX!omN1~SbUHE`ChaxK;N+2X^Z0(|@2#Iij zj~BP#Mn}FkCcMR!S=OS~0tLHE=H@;JZ4$)S6%AZlv2=%ytKR?B0*a0yQQSPzGc&^$ zH6YilEFK~KTAln!e2srBeZ-T2+HAD0-??Xl+wNh9%55^d+iP?;tx$TLbP3?jAeet zA>bb`prca^?UrQ1e^gTa#}n{5{}m)*dqA_MmmUYS1&TNvlz@P~quv=uF1!-7%sw>e zdY=d^XXIX5EVY?gubN$AzwpX`LR6yeR$%oB9i8W;^C!SeX_@WsT7+CQEQZP6)wo}& zo=Y(+>yS;$l_P?i`2QaCXF%ADM1+yVt0Y zoV1-^(P#V@pdQYZbe&^fE6SLmzZvUw?T8KAf2xF9!u8VC5rG)8^ z5ri|RZ0sBrFy!F8$Ym(C6ZQU{)~wyYKM8r-upd8 zx<`~7F32uqn%!ipkYVAiV?{XsT4RU66H9?`E8FLSANseW#ujT{BK5F-8YXm(Q?9#Q zTzPbC3{wemq$aC%h45Hr?o!3fkWE1@xv3nu61z^gdiB_54inWym*u)G{>We{8lj6r zGWa1sOS$MN=6AIGQsYR`sr1`Ui^r=CY=bAA{}P>{6LS3pC{Pewt*^_Zng^gE?g6qc zBW1{e^hhis2(9@g&~BV3|IF+*muNSaxGi!o2V0^l+-yiz7|dTqYKpN42uT`NY05nr z+wT%Abn)=^*-v9pe2ng2MxKy3>u!27BfH2*+~f045gu;xUhUDnx~P*2w*tuNLdiGX zYyO!=3BB6xC)9S3x7Ln}k&^3uD#x1&eKP?2>?M&CPQ%!#13 zSf*Rq2HBZ6lH^9mw87*dL>JxpYVxXnLk@m7=GhRx4A9dbv1?eHB-R{#cYLGdc3! zS>{v*=NSs4yehVkMPZdkDKhcNzIAt3xX~=J^oIj=Em2OL(&-;HnQZ>CX%e6v-9Aio z0HFBh+{rz?xRx@+2Bd%r4CF)p?crJ8{AMm*K0VNY-bXm1{*_0Rvgj#qADSXykw;X) zD1}RnN;1;#)NY7R=A$}y+swtCFb0esAkc#_#?k4Dq%6C#{0tU-#t6sZp=s+A^6EL{ zQ2*O~P6bth0HLVp#M5|})~7%9()Zs2vr)R>1}uEgiQ{Afg+=D3505SC+8(6} zoUW)DD2CF}!NIZ2X5St(H#`yrrkl}G=5yyxg3Nq3gnQ!mA_`$~TYl?%A{8~_Q_&+B zc$9JLh7DWnM!ueF=_v9PWfUH91n!xLp2SBpV>*Z=`aAMF#5jG{QQoQuTzxafdg0aZ z!GUi~+kdPYrN z$41;Igli)z8R(k>d@*-*nX^n4vUKqLOM638E1MomVnHRfmH;zR?sdYoC ziHOV}(J&k_uwA7UhNdt0TtK?HJNX$dHeZ{JOg8SbfMTe|{gkv3s=;1cTr%j6S_}L` zi)(LESp6$mt$+0o^qcNWJ+^$Ud6UZD$>+k8hRw6*RMKyrAss~<1`6@O*&K61=ZvA& z*9}YQa`N&e3Q+^-h%%z~1j92hC*N)TmA|3-K%B}u*E!^vMQ1Xy>_>v?1UXLLfzq8Q zY<*HE2&s(~fa?L9XF)zq+6FhVfAOYPMAx?>@Ho6PVNd!pQPgXT0nkGCNDdzwc8 zr5Jv6?Qu|uGeUJ-4&RcjO*0?(@8puN;%mt9D-~JD(%OWh8A>JD##nOHNMZ-!pPpP^ z*n>f^oZQ^z1sL|&t_V2V;4_Y)4AG(eV6S?z_G|U+Z&E&Mix3TgNV=;kar(IQ-wWuY zS7m$A)K+0~q|`yG+(8QS+V5>!Ds7$bBZa*kV*+aoR5yM>&$P7!2zJ+(;HuIhrAM}5 zrnom7BxPg(yoXR`7hU(JHP1Qoj^UxCgm?I=8QG3L{{$ICxzo^8*Are zl7{vNmheQ!?Jk1!S*v>YBj}cDG}ssanbSsFI-1XLAY*eja0T(z!&yqCqXPZ}b4;T6 z!}!`^vF)?AD3L6>YY-%_*RUe@sdhK+N8IUFXE2o}heHIT;X$tS!o*}e}KonaB>|B{0 z_oI8_xKG!_sLt_o3vzN$BwVD^F@z)L0S$CD7R!gm%|MvWR|NV`EM zAs3^ zkZ)S%=-MWDXzdd4I)Pb0NB6jvSwxS!Z2G-#hL7s0xQrl_D6-om7%R{L1!#kE;QV+k z>ikwhXzl*&Qo;hJS!{tnfpCs<-|%c@E5+QpLiGL3#QdL(1F)!(Ovp8&YYvY$XrIeY za>siIE2w!yE8}(vAQ7UI6plqah4*7abcN$}BrFDn&;_6cW3&?pek>4&&*CVfY}|G7 zZs3rEpu;W{%a)Nr_zn0-AnW2#aCL~y{xTvhTF=L(F#4y)B?^xs`u+Aj<~6~vd}Arv zMy=b~rKlx`EyQ`hl|a{yuoZ)_Fj^vJSk~_PEWS_-;NLI;T6Tp=iq5Ud2%yNf*GP0aRUMfy{@W`f@oxtPN}NLL?odWLi7x|>*#Q& zTQZ_qz@BoTdy=!vo*V>Xo@-b~qirGAoW``)+hw?A3u zphXrV7eS&OKXG9uEDF}Tc103&vyXrnj{j^*NxUW zcD57D!D@2MYjLHhy%Ej5zm^39H&@_q%Tl$sd@>gj{&|I@yr9$&(Kl$$f<_FFvvK!B zPA+qz6&cBvutfo+)E%}?uH6q`2E*?Qy#XTd6d#%%So*UG4XccBuHYXvh#6)fTSfF0 z-?m*@9zYm^hF=hHVhD^ExiFC_M8fyZ6V+@^c&q^F!mgvBkgncqeJ0E_hU2y=+CgRx z@0!Q_89Iy`FBibSBq%Cp^B3-3gI;sJN89tJ5y#(?A@|+`VFdw@gVd=6d;c5rSO&TP zQVf4c5OM>}UoHx+jsplse5ieg)Ze`)*kF$W1p24JYS%M5%Bac~qjT3q>!rB`8F9jk z_7e(t7y`1rff(?j<~bUFQQJtrrd>(w?y2xi?nHi86g{qJJ%`H^Di7&`k_Rp)TlO`i z!B8r|#4U6xVsL6jZ$&-KG&u{voaNJQxQo|Py$f!i#9iF$X2$IcM;uJ2=*dDqNs`Fi z@}FNwa{ZszezfC8#=-dJ&6|!x=b4=)Pq_PMWnm9h7XG>L>OPo1PRC`esk?>pCt@!` zr2qm7iAcA7xY#*35B%TXGnC6n$wQ0BYXRPxYI?4)=yRd}{LJ-G zNlA!Nh5+#ZmZFn{uVX%@PC}0pnt2J@O8A%_rPV`2TXFQ(n7>ckfx->^Fm#*KRlFe_ zc<^8JeE+^yYhPLdF6i9|sJqF@NkJqEghofdorYaA%3xF$^J)l;#pUxQJ_((aUBVW* z?Z|E?B{2|2NPc_^;h?+T1m5@r@O#0? zs{Q)lL2Qe@w|qP&w{o5WN3Zc0^`3P`m~v{TYCPgU4Bd;cCYE3B<3rV@^YN|L#ONTA?`Pbp$cpZBw7`!K&Nn<7FiKtn3y{@X zRaSQ9?+XEXB}kxw6Xy4y@q5(;6;;V>c>mCVfl;HTXIKD@CkBXS@|^=n~(l8V2l_ZxC&xD5h(Se zAs_~cNVBZX?ZSH+?xR~C{5{9Ortt4q1DSggOgQVH!|C|h0=6M#3KfWkd+%m86D{0R zwua~xI8v)CK4sA2N2qMc;5~#HWO1i8RTnin?nJ{btVubb(vS=OF-@cuh=y&gu#KBd z_A2^Vw7qUZ>wQVc*qHVw$2Bk|D|4VL!>ulxmf?S}Pz;5U|16aM{(uVsf>FG@WQA*q z2uxZ!_f78Y-MFjhBqsV1kuJ~*>xEl^b$afUz_(;e+m}6x zteASjm;vzU{ERZ3xvG}^E)AF*;;=+cvF?`b{LchX8*JtD@rH&eS)NTN;0WPmdhjsI zA{BHao`?R^`26H_!^u8i;~vB*AS-XkBq8id%CzU57C z{Mqq~`^kl!7UURU6i-YrhwM60ZY#+~_-Z%eX?{EMPS;T`tvT}IibZ#4QG?yDxoXis zkBMh#(h9kE{Po7U`|P#=B*Ko{ZKm-YG4ha=FRf4cja*>l7X@if>IK4-(dWigC{PEe1^WlDyalUSbBU)hG# zDY|pQNb8dx+()QmVkt;&6CL@D|1E_YVG_v+ zAmxD01&#Gcc;aTWR~TO3EVd0zKuDP)>S2RZ`;dPfUbg@`0zz>v6qkgN*Ftj82L}I%~WErAwiJEoV1)R&J`De7Au_f+ZwA9Jxkxlxv`__dj>|LMT5i zONkk6L@MnV+vuC5yBy^fP}aTLMR<-c9T+D5Fy8yW<&sl#9|1 z2py7|+ay*dcdy*Pk-JHmf+R>acu3N_B}qME(=z9xaBd$bzt`S=sQ^q6fJfd)YWve2NpNKB=7)tX2uIa&M?8^a`J+ z0I7=}*l=Y)g%ypw-HJ`w< z1tp=&7)du#M&e}vnfJ75x5^X3w1%H7cho46*?k)S0AQ1SV044VFCHhZA5vyM6-?!y zIAkfA{>U!)5=n+OslRN(k*bQ4aq%em-7gZ(k)3k=Ag+>xTGT*IW@TkCaF>q~|0=Gm zDilUcdJ(_YQG{x=R|C_T-4%u#I)1{B+q(AtCW^S-c;^WsTJiRvc@#@;sP}pU@&zzY z>;Vt?dHh#96eLK>{AQsHonKJGa0Vw4&b$4d)HKg-Lp#{XmEU3no;Y09_jdol10B50 z-(ZjQ0|pj>SiK&b1`pmm+i9}#oIcgwiVQ&ULT`!j^#KXGjhNE~ z=nf$&2y2=nqHPhyaH!pX1LVf>d3g8;e-|otFLPzL&9#|@oZX4`y<@OCh)^(5 z04JV^&M=UoO!+DiL7WdGRb1q#$!ZL)On~yy@ZP=MnL>R?4J|DHTJdgtT|iyT@`Ue- zkJB$E^p|t*N4ej5W{?H`2V=uD^-&T5(7fR5pe2<3Brm;4lA4?Q*%Kgw#ay$p$?~mW zDqdM`fS-$@B#?xaf}z_7_y++6SjXKs+Q9$-bD~L8zX#|{NDHAIJt5(;ovSPIvDSw= zQ0k6rYODPDQx~)?kQ349hDjpAM+ogXlAj{T!?&~(iUbv^uDibup+RoLyR-mIoOya~ zAkv5k1mi6>Mep$0mEWQEJZe|(_wNS~wy`Oc72TO9-Wqc)mF9}ja%}D@b)s{SSR}|W zvm!nWok`qN7EIJun zQh#@g*^jm;7t>Z&1yz1}v(@q+k2@Zd8YtXy%5K!|$|-HOyu0UQc!pg*ZMYn#k(#gh z`%AM-ZSc{?Z{KPsCM1s@oqb8MVCUcfkMaIpA!@?mm)!|iwwnM626rjolmPTs4M>|- zYxarPb93`^32I5K+n7Vnfpggi z57!Y6sOyi-%?(dW6UK^w0+moqg{tgixx5Am79h6XP2G(ko8kV5-TDp-v-3DM@K7aAzroO&D2L}g(+;&r2Dk>t=V20g9M5lnfupScAgDRQivV;ha(ZQ~U> zV2rJ*I;&24QbtUazn4}bp2XY9;OOW`(2WNNGjTIXzq)c?rKX{+4Ty{fzfZT~TuDd& zG20>AMYm?nfSu$wfI|^DL%OAdf;{RDz&I1J#LKQT*#pmKUd-I-i~`Xv+|1Q6}- zcL+i{3)cY(s&-&nGV&-RlirKe)D1;?$ro;03WtN~uw;We=HFdiT?c>uj89G7>|0?s zOhXbK5A1V~oZOIfSYV`lY7sotr;aGm!PAsmX5nw@ZG0KA4?Dw^3o~HoT=N$>i)sOtvZtDWv_ex?*08L7+8&h9)rye&p$@C$8C+ZfjaTmz%`5Ad&< zt=z)RiZW%#?2ab6E_Eb=eypNGSwmBwg<g;54`fVb8)*V@j`?Zka9FqT94I<90z=FFM!*NKy{&B?%G18(s-Q9l+AR86&u%YIS?N3Wk|0=BDSOGxvwzahlj*Vfv!vQ4*D4e^? zTsAf*7#Vd=k($P5FIXh1zf>0lfw&^Sk+sdCjAGg9@^X8;n11b?0NWIR`M}5y?Ta%w zmi|QI=uvQNsgf4A17$Q3lye%}`2eiQrMMmw->DT70MMt-9b9A$CcbZ$@^L#~+6GgKJWl4Q!V+ zYu3OQp88(9_4Ck)a>J7_uvqBl*5fm&{uvk)eEqQY<%7!dg+J1x<2S*yUh(0>K_(^% zKl$J0r) z2rdcU#l`7?g+F&sm5tb#8FV91U1NPi*xvaas3mzLFJ%_Xg1Ca8S(1lsYAeH{#f_gY zi;K5`^}W{QuKSObG5eFdLf+)%fjMk_k1giEC!A#no!Zp}=9aXj0V*S9ZU`GdiSd=_ zxz*LxCGJOC+XeCM{R<0EJw1Wi9^LEI-1zC!(xEhU0BNu?EIy0A_u=>Nt!CGwnS<6V z^2eGSIl!g>Nat5s_78h{F22p3r@%#=nOVc8&@epA81rcrk#|M2kc0%Vq05XisOqBg z$de1+))IA%jVwq3pw`O)k6?KC8cwNyxJh61$gQ#2ilV)E|C@}An#M-<`=zTM$irP$ z)+=(YfddMC%eAZcyu14**P^Q2<8u{;C++PoLq6kmgbi~GEG#SxZEYXI_)|Se=J5m6 z|8=%XO!9{@&dYli6T=Hs(-;+?+=P33Uw3d~YHVu*3YY>Z`{d%{g;z@ax0LvMt5F5L zbLZKsS0E*7$jUn&0+T5E)cnSrs(#mn>jONxx)lz$LwaW=`kb0W>r8P2UtY009diZ* z8vu1Hbe&}Yc%Z(1^!Gn7;o9-QM#Sw))=a;ut-Xg+=4=9`@!M!$Z)NmhQQP~$!LmBS zTi^q})7iCsds|D()za~R;4DZpx{GquYG(1!3HbO&kFFjD}viH+B=+OHa|aZ zAJo%>@aOD=E7-_V(T_kPS=fwK5wy&Q8$NtsY_$e~(4Kw!_uENw!?=Po;by1 zzyS!XIn!IWLh%#e2r$cf^7ZR3_#i>ml)sWJ-*q?wV2DhX8XS?X`|v@?-aZ6i_U8q@ z?|&AUSyUv?^QPhR=S^Q^ zEiIfka`RVMe3pQOeBK2zO{??3VO8)YE zAArK|>#LoT^3R)M*}5M;SbN??8)X3bCnn3@FF5!vmf%)=_nP({7~70%JMX=nt98@{ z6+Ce6Bk?$h7eG|S#l=OXq%PRoi=or%+=2<#@%wVdRnSSD03_J6s3`Pp808iW4okWG z!ac7t$t>K(o(QxKq%}Ruz`am5loFGd2M(8Y(DIT}ZTr}z_dW4{RQs~VBy{cSU+{@2 zEiH2Jvz!Vx1yrtoZc-^MEDQYm9!Fk{%QiNLJUu-FgM)zrb@%(_^F(xYa^D|h{6_Rw zS|SKwt>x`hG$Vd)CPGOgvAio}4Th6r5^H_yf52B}hDppj-cT1l{|vSb789!PaeX}C zw33??Z_hIiG<5Y&^@rp+jcLAp>(Fzn$w-{sIJ7Kz>r?_Ih9F5fF8Jg~S$C~UxVgB0 zrBQrF1`8lOZEVIurh5p}ya)9pz*|mNa_Ebm_~U;%=DdAY$mFEHsJO$UA3rY5ES+?Z zlS>Ep9`~2#+)qtMy()Tu;|4U%S~JRXMh_(x#-Cdmf7(GSN<_%1vcb?NC8-MiXzkE7 zHtNkyNl{{9`ZeiV1fOLpS^tke06qW|#oq~DJoqj&2EyDZy>u{MbWbn711TVIl7ZR# zd-;ThhF)W*>?uB$y^+DV3?E^=p!oqE`&g;!KEvkCW8%kd_fF4J8V{dBl}%ZBCoaZ4 z$1y}^XECRir{hy!58!sX#=*mYq9t-Yz7=x%`XC*uz`jpv+E`nQ9zIOqk9eO3*Vh?s zZIL~D!f}a!Z@SX@ln#IjdN-@g#f>2yV<$X2e#XYcfKEUGV$jkqy?EoeR2%OjKh}`y zmUiugf;(PeVV6=gHng`NOi3#)AMc9O5vCwG3fggOaBvV{bHC}M{fP7K+(%Odj~iQB zY5@M-+R*`u@cTN#^)M7-Vq36r5CL1;H??2C^1Zsk1&#>HP}x{oT<$!hyZZnqci~^n z?SUP7o@EBVHAYZ-s8+ii^Xc;C1_Ai@O8XSR>;(P*2S-OD>=<<_P^t#G({4qn$bFB_ zivs5s4HL*i12gfOcEQjP*Q=tU5Hfk`q|2IKkxA$6Z`wP=#osnI9jz%Z-xL;}Ao>gt zy#V(*kdqsZ??hQJ{KpR_?%?gGWA-4xsT~l55nWnZdgnB@Jt!!Mw7eDew31C&$Tl&>NX}-;rK>1_V(w94_9F-E!1q88{u^ZQ}8`;=|J$a(Z zy?Zypik5FW{G8uF{qnfZ^gKV`moM*zMn_FdOuS&JYS}q(a%=znC|;yIJ5CE+8&$)kvOh__6k`Hh6e|tPcmKu1@Vc zW`-s?0WI7z20|=g!5e2^JIqo z=6aY@scU2@DG8jmha+s>>0~<>)qiO^s;Z`jW-iu(f@Jv49%W}_0<-pqT9ZQ2EuBs-D*|$yR^Esm8`N4*lJH>~mN8j=3$M0%|m`8nNm5mKTB3 zIL&(!(gnaR6c#L&! z)`5?@32ABT;u;+U2Qu{10WWlT`=KvioDYOw1O)ciuK-p4K=(Syzt$x7)hqADM%C@x zmzQ3g$8%2?>eJ%N{RHI?B64gKvS^@v4CjBWjSrr2-4>qA9#FaLDQ&m{QZwIn-ReC1 zV>SIpUiS0=Bz2;OJu_DBmL?z?w9C81M~}Wil``ubRZY!vmoIPO5Yc-XAOGXaS0wRx z-(QaY#!DmxYk^D#Wd4bXiHIGOAa(*>$o3OvHe=f^B}7zJ%_XIzCm}!%z%{6GJfOLCu8opEq@{=9x{%)MnS zE$JsOo0N%-jn7pfki;2ewGIvq^;8Az`1a1u69*J{)|fO;^`fKMY57V;@LvGx6JG(J zcL2dP(l`i%^@!*T%$YS9 zyo+lTuv-T%gbT>#0KXl^XqSw0Das!p(^MCff|Ka(em&1&=(=-}GN~PqT`%FR6&00# z`O=JF3AHoiE#KMptX^44U!gjmzTmlF?!7!nwfaldom3U6JLDjxPD0%W48)53tmwuD z{_6RJ$6vmD>6sJ<&&J_rLZnvD*g;(I@3$;)BZnM3&hwv_ii}75frAvn7KE$MVv*iR zKsM)1PEHk6J3+1jrScxMl{?yrgC1zOR|6;QA2aQykDXVA-gkCNHAHpvR0gC!sNU0J z&7P)L^Z|UWd06kRkPQl|NtskS?YsFjTC2@@FXi3q;!C-$)i5WJVo`uBp8l8^ucEl)p*M5F<3<#B^&V`#{N z*wLw}BNwGcDI;^Ak3;t~=^ zBqXY8YUrH`bQy?rmDfVnzjp`Fi;bCdW#iYc0o4?Mh$ny8CB(jgY-VCRfz&EOoQ<(@-sCj=~r@o`2u0NAIDRMkimi5 zY};40*~ixx@bzx87m*2Zaq(|$t$uG5lQafD4`$%cpMiI-vziW$oBJGGU#k=3kpxv9 zh*faR5Nyj|@cD0(;O&Lifv~jV=DlCqAbw6%FYQlym2Bl@)qGb0=1jc)YSU?R*!R)V zJ@7al$glo>OAA9ladB~gqTZR_d~iz#^~Pw{(uv?AjRP`(#vFj674pLGjqF~Wesu-T zd*#r~izG|Zt+kF)JI}^#R2B;br;o{JZ1d-#$2~@u5r}gw^WPW+p>EZ-hu@bT4MVA5lP7! zg1cK-uh6f_^2z-m>QN`trldOpxXjZ;?o}J1rX?kvM4JUl=bN%LJ$a8z`OeTli!DBfBnOSd#dptB;v(w_J00qhyDNYQz#fs2~vjz;2sdb z`uh4S4gF8QDdM_2%NbGr6>I8H&@{ERUlbLs`3WY$#`cFKjphKnUDYs;GQ1;BJ*QB% z4823=b3u{rk-?Hkq|95F@Dc9yzu+(!i7aXy&XmJlh3m z&rv4fwURh|7`q#E5Y+p~?3rbL5wMMS87K4c2felTNE2z?ebq>G!`~_Fgj%;|P3`H^ zmoV(S?f0xlgOAs}uZDz8Kt^_f%!2N}^D#CSzLV=odVK|v*Y{jzv%N%xr4cjvdATzpW+iQFzwsif(9bGq?8sx2iU!-Oj_~2C9pX z&mjnCFeO%vjgPAv6Z!nxN)9d}GQ#mycJS9hSOPKPZA`U&qrks3h1Q@*!skaTkqy(O znU_1|(VI`ol7381UOv8EeJ@XWr<-M-=|x!*Z!_dT`{LjV}9T{h|QON@dBq9%lJ5dKwskxP@ZJ)M(Mur^VajZ-QMb@EzHn z67Y8wfKAjvga19zq(>Xnh$otvn);uL9+m~{;$DsYENUV@u)7M2J5@bAR_xn%77ehm zU7(7dF89)X`$&%8lx|l)#x%8yXAKCXsR3#>z8m%pKrhoha>5~=vx{admT*Hgogf22 zZtuq#fYA768fIt^12uW)7l3c=xo<=ZIm=S#h!wOO>>aRqdGxy5*O-QL4k$Gst0Vy~ zT)1%If1QX=j3;x|xG-?8W@lhwOQ9gvl-Vp4dmS<3aNc1+`1XyJNIyU8<$h)@>kjtt zBu`mPXT+o*qXrfSmmiKOHW8qUXd)Hr-`b#DoPw5S#P4AoM84 z&6PLPV2cHR6N{((^=k*Dei^zVpT2%QVPmu7zESIq4&1P>Ds3f!n~s1&9|6DsI8Ln+*7*!bL(1h5&;uix{* z@$G2omLTa62Oh6jwwzZ+gT~5{AP6m?ufmXeY4XoDh*WG`T#^k$5nyeHGE6j3U%zUZ zJu_uvMZ>usaLmiG+YYrQ)-J>ArUF3S`SQe^2uA{H2_kFVfCNw3tfwL)5h&jnw^g|L`Fsh!UDT3{^t6Ku7`gL&KMYw$~0IK#~@nVL#}N<1{$dt+;_i2N6*>iA6G-%wZG+2kuaj5 zCDq9IV4n-vAI~jOlPkO|s@xhNfZ@=%F;TRB)=4eJENh)}B*z3d7dGdq3&lMdP>(Hj z%B$4n1$b|B;X+h4ef~by)c%Eu3s9VDdVEO88nfcbZ8kQ7pFVxU-X`k6nWYTdJK!YI zq1VO)>NiEOQs@ef zbX?BNT!Ft7OFh<#U}?;2TwY2u&9#U}$G#xGm)I{4-iB#!>)?p^ag z9ik}LbjSS^w8im8P`RrUV@y7(3YWxu*YuS07V_22|j3E+=jnv;m_!BdreV%KKN*l^qbG0mx3QT zF6D=qhIfPG?)~+1GA<7)&Iz{XRp}};4RYxFQQ0?(qySuk0YVwn` z)wH5upu>(4%D^oi^fHpCQ8R$gqXU;05K5}%icncB&<|?jT+Ze;?>%M%+~YJvEcEtT z3}_YsBg=`8>E*S7q)p&zqkXOy`|B?h7G6Wkbv)acD*GH|+THhcIWT+yg=vLNn?`MO z&wXoYDF~R7L`S&|N*9y8cPYci@NqeRZ|rA^ZrU*P1M>Rxi4)HTmodg8ytyRO1_7n{ zB`S5Nh+FL0(>V6i3gAybg5o^jTw`2tb`?LMq@)8Yw5=q}egsTtpIhKGvrhTCQ)Q1k z_UxfuRe($pVikU5{YOXtcP+f)Fcg~U>Bi4Zeu-#|@4zi255!FVl6yFbbnrHV7i&(u zyhd~u#&p=&*)@(w5~WO=v{-pvQF$Ak&>*afsZb}MdepG{MKc?Qf&3zNnt7S?D_57>J@O1s?cxvO((Umw{pQ8rn(F!C)~mc7zfbF+ST=Kw@E` z5Po&{o=WllVS&_=lAdbLGN;wyOS1(_0U&&enIVE{xFoyRkX zXkC2J*&B{Kp(@#Epq*(rrDO?@KVFMyZKcM8sjBpq^<1pkUz#)FU*aFVtE z_leuzEkl(B8rJDH=@spK8%I$z{*6=KsWUB+s01$uN}f@gsJu}^K&r45cKbSj;+VS_ zeI7fxZZxT!Swo>%=QdM_&pVll7ZPj52y~0Mw;CG_xo&WaC4>WC#0R|^60#p0kZ$9E z@Dn>pb?jUPQeo%**9U4U-M#kbE?nrT&p0{zH-T~7Q zgCx(AVL&MiTP)o=p1#eTcK==Xxks6q>r=7?)9dhwKlM|5LZ1PGeCe6iu={DYIG}bd z(fF;LD>1ONao@^5TZGyKKQ`lzEBG?9uE?!wdnl!Ppy42vlfyBEb&62ffF}dnDk

zJ=PbB&qE_oJCJFyCxAMs^!6r8%FSGdc1%laE&AYY)LUF_^`Aa%4P%Zq22qPt*aW8W zXV0R~H$8(_^)P%nICOv?1_t&-s;=*G#~N6a9F>Mh!xM|8CVt2m zhC%DzU&^URWJ!S8qHo+-03v?POe_=%yxiP4VjnBG(ykHTAO8`ew`~*+=9yTAooGJ? z2Y19Vo);HuN+<0~)Fe26#S~z+XuAj+a_E@~`II&-j%u>^R;>fU1)b|(zG6kvPOfzr ziCN3kS2*wF>H+QibKDPLfg4wThj)?PKtA^KCe-#}Mb^jK+R>f_i@(_5XI|_ZqD=-o z3V|WmdHfOJ_D`Dyup59b_$0N1;#U~Pi=_m*9jGzTo;S4bNN70&>TslvXE!Ys*bWGson(9yeZkqw`*JRk-3^p|a|Q zMw&S2*(K9Av3wWHEM0tB2d%De(8$2Amuw~m02G&UX4Zw{h6f{6M>B_^35ml4`(_Hy z$AYze@3xi}>KzRgNcsc=$JQa6;4z&pnBTH*X%Q;lNRKb2xC}E1u3bO> z+D{-$((A?wk310C%#L{!kv@RNz)m>jVe?M#W9FdFUR^HnvEy!WxnAvSnnnFU@R95$I$vaucM;A8z+@1N0CsG1cjKzW z5U8X`aC~Avh+b6=hu1L}-VgS{L0pLIkS>Sy zWB)D8)-HSuTLW#SEBfmHjpXxUO!!E77DFz8fkj#v>%JMbA9~#1S+9H1ytl`F9WF5n zXu7lQMWMvorLhaYCj=b+np&+67e|&iJM-r@Ygn}N)sTux!`28wC378oVW}n77(PJAM#lJOBZXbYlN}fAwLk;|YES|w@YhSfYfNS-Z7ca-SE-Po8 zbUMEY4ULVM+2pNPudx1H*pCKG%^cD?Ff&gm?=c-Wx3?2)7j|KSGKCc!60Gx?4%w_!YsgL6fd#wDO`8md)XI10hJ*+*^x$E&+lnwd7Q( z1AE&0y)VS5{s z)3xlXsTmlI{wi)_7NEV8>s`O68-#<3vww~eE90SRLq3MAH8|asBR-4M$UBS95#Q&g zSs)j=RZs+TF`G%eM!$PNG(L{eA)teY-#@OKO@C@824M!Fk_(#Oy?%WPA)FE2P+{-U z;oWoqJSNpRSmjh42f1NXxO@q^ZI4`zqSmRxCssl!wVe~L9xxLB_^}gM74jS*_H8JJ@|3O(9%$x&|r{8`;K)`XMm*=KMY<07x`-e<;-$qF;KGc#8~Y#^mo`{$3uA(!uje+ps}{ZprQa6D!{jr3SK zNxU#!uCTRcH$_k=P)ec8zzs(twH`XO@bDOUX+-(8@-AHS^K}QoqydU=Z8hZCXaRe* z@m_HqbX7T~L%y_qgszHeybyxk`4JC&h(##pX6^XmZY;&?(39Tc}2)uhlF0Fz|p z!qH!3r>~lq#P#9!x_^KlIJ3TJ4=%6CxtVv}P)wu{VlUGz+^a7^=fuX^J^1zR!d*mw zW^{pn+kbdU4s-EE&zC@EQq$8(Xdo{F+-6;|0%PUv#kp88o;eb6wqHpT!53)ge`lQo zLscGrkRr`u&SG3?RazM1`@h~K~fzXivFSc6O<;k#KzZQpy8o0bz0FP~Sn7gC@KGCUaeG z%;Hq{E`Lm`29C7H0Mrc)F=0H?SI0eu&usDwLmqW4xdF6x2f%)!o=o*EBta70H6r3i zQ$2GAT*BOejbZ_lvOB(nQG)Wfzdtln-_I>oeZ6%UKVav$beu-{s%7jz5Z_trAs6Px zaqYs37o;~4`k?7Y02QuaX2ocN)@rsXcy1#QS2&U{E2mzqbF}gt6BP`eU4Q~L3=)E; zMl(KQ@7^AAxW|s8nkNfP3w;NaEodwgHSgO>)|8eCVYfT{7i_FM%B_1R>utZpr2|^sNhm7ps zbP8zez{qIx&epw?-=hX@f}rKfBd+9GJV zxn;YWbHNsCqVio&Gx+02TTt?!nEU>P)Dt+r_It#GrT=m5yqAmQccbTftA;*}dKS?R zK&650%t7(p==P<>c;Bwm>($*3%g9`B|4nXmS{G4{ zS;5}b6}tayhJBnA|H0K^o8f|mo;uZ_(niYkkKaUj>A^>U5pdmrKfP?`H$4Uy9NLYZdz^H)A@3w?D9z9( z8rj(y`hpx56x*WNLwF!Y$)SH9y&umP&;45{ee-5nQ1Bl$!?GZywKvncJpK6i4o8$) zzH@#BjsJDkvO5}=diz}0-T37`{C)6VHIGZ{^p4a|tk`dh@%r;;Zu)d%Hl_;>_|zny z>JojM_?Aopj@TBoQ$-K(C)UCNwMC&Y5LIFRXnJBB56gUovkXx;+Je$xlVEP@h7 z``YD8vYJ9D^DmoJ58h9|X+o;G49}=_4!Q}1oO~WU_@Y?~lqSYIW}`+dlZ9exd^%;; z7k?|=DNjRQzyV4^f`cdi4eW}OJ$yIMNl&kFNyVV#^G);7Cli8jCmhBaP}b0X;gahf zpV?LQ3?kpB%W)bs9swX3FZ;-dibAwIVa;ZN;aoahg=$#QJ>oX>?ch9i3nW7}00p~v z=xSzvrhmKr74v6?mXR0A29!Qol0BaD@$HOn-_pC!1P#JEV)jg|x3{e$>QI|7C-1Li zk7^_89Mh}Ht zl2IuNEUZ9m8LvPx`d54#34X25PKK+)AR~*Onp)1z!6CP_gk?zx3uZMHy+;~G*Hf_a zRwcK2Cw@UXy*9xjh+%9INJJA{uULPXHK|(5H9HBXyyIdVp37**RRdp^UvR(;*iC6ZfQA*|DA(N`}{56fD}I(nk`$Do%Y$@L*I)p#i0{) zmQEVG!K}e2b(p(oyM*1PJXOJ%fhLLGW7z@*61%=Z(jgu`xA{2v0FM2qel|?V%Sp%` zkUR}A$5$Sp6ziDZQkFc^cxZiv;trRn6nK9heT6+baPg%+<;;GLi$EyO3Mvs|Aw1EP z14nyNSP1H~)ZRl#lXoH znB70VeKlUhw?qG|r0(mCPezNLU2Br%Jv+a(v_phH>KZ&ALUCJ@wBod(`Pu&T*)xF& zJ5S3T6Nx09-zH(4N?D$=)yVZBaIb~G;tOwK#fFX)Jto53`8FlNr!wLDo3;Q8!D0Di z@Pr3$x=(L&P)xD9G$nwDhPN9nX64{8x>L0r;x4cnvvchW3fOGp%C}|9(Aev{TbVd_ z_7dh^>+30>)E7+93sl=f%3+;jg2XVi-jqft0Pmyip_!}b8E~tVTj!)WS$s(sZA%wD z9Z?>l?EqdQog({fh^N{4n)QAi(fCD!g`*TdZhqVyAR9hM8?GG52bhLyuS?( zj|-IW*U~P-!1OKeeDOq^KQSG`+4|Io%Jz%7l6a5G@Ih`ApyZ{7hB>BLpjeB<)1|HW2E%q>_R^}OSAC~mwhYz47xTR&Fo`HTh>N-hOeI5K#SkKv zvmdKlJL)qm_A3OgiXm^J&5!w)y{)s%fv2>xaw#Hs?%}`*^R#4`XLrH@2J)3qiM0hU z1VRMC8hUhoVI988yFF^61dDpTuVd#U14Hl($XF;tgvO$P2X05e;p2Ys-bGk0BtvT3 z=#C9wK(^3Qpox$nxkRcSXmkoQ&2pFjL50FfC|-78Pm5EYF1L#5#+4(t5jTXH5%EGq zW(EQfcLz^5r1&DTpwo?4rLNn1CNZ(#ZTz0!7dzi-sjAg>jsLThx^H3frT|{W?g|U{ zz8bZ?Vr|=a)}%M>0VVbK{U+BxMeTFZ(1+B+?*)_%HYCFHt9;!!+JI1qaMsqTi^wS| zYP-6Mn`YfLqLvfKyR~%}w`m3nu-L}TMhc!DZxjzkzf3`_kWb6^Sy|Moj=Iy@del=^ zA@vh~og*xm`+!J*xg>QSZfHPHz^^HEimajacHK7ZcJ&R;FteM9<(8DxAPay<2Lv;_ zje9lnF>u-9&tYX1dhOn$VDDg2F*t;*%@psU}M}LxSTPOp;n3|9K+?3 z+l-(!QHPtXJn?L2g&Z( zL`*}A9D%#SK_Yzy(wz*0N&;Yl6sK=LprG2mRm+yZ&`P|xQ(Rr#Xb~1wKF}Kzd?=JJ zglEFR0ixWx{zy+B4habfNWbiANdBbe<|aME4OvDC-3$RJ- ziK|%BDVC6CAgU|!(|piWTm-H#C2X-8Tg`knQ7KFkG`6bFK1jw z;GnvX->ZAvucs@T__czh7n=haJ7^J-lasX<2xouO;IH9p*DE+qpYhks&{sC}`aEby z3>Ph=pPu6O?ynpAaj9G7eH-zel_8l2lq`qS1r!^oc~r4f-Rq#o@HWJ2?3b61gazFt zA4UzGxz}Nnhn@0Ua2cYn10eXntDTtQ%ECD?>>=#xfwp*PXe+)W)LD0L+&H`>WSe}l zfM?;x_0F$aE}${QB}}7fVZK0|V8zw4O(0BWg9PDrEuQL4Djs>i3788{O0BTMA{v^z zeX%RuEjLh2DYuk>A{YjA02i2M z${ZcBQ}AD%{NcX)el;r$Go6Hv^>^_oyN8Dd{x&?0x+-QR?wX3NB)HM8<#mJOz+Is| zL4YP+JOn)8f;*nRUpe*Q!zjvtI=MSCrq+vMpp(K%YrBjZ?EEUdX|QfE>Z`NZ?0gVm zdv9;Y9WS5!&3tDP48}VNTRfZxyLj2^@p_wQCv3A&p51`($~@C3FhC;Q)>c-jxj^b5 zWcul;3VCb)(3b7Io9&#P@5aXR`S}B{qlrJ-Qrd8{d~>4amBvQ+`P=M*=Fh`EhLne8 zOB6uw{{7eDN+2)zLPQM-R8>{suE9MxEE zC?|lWsuU~cAebw3VKq_RHfmBE(#Li0@JC@YTHWAUur=tDjHpmGAIZ5#Hr;nB(|~B^oetutg@>yd=E8*GT@=NzeQPOE z{M>`H%Pyg+2M!+s37+lb2<{-_!!Y3QYGEdv5@8T^O- zkU~*Qzmzj)6vq%rN{aYSn^^@UD;7T`@K(gqmRbrD$~eRZ^+0|G$rH?TW7nB2d+q(j zqAk8Eza^^L9$QCDn}Na&|Tc0CvdS zEPeMct-R`cnrN|>N20Np+1v|JZNPY=@$6J>Fa$yRV#X{;5Rl^c!c>4UI3#2hY`NE} zdZ0C?znRcaGNNjw>!s`OhC$^c(W>AO?cLX!(dvQ?!Y=s$4G+&FP%IYz2~)DJ;Z);s zVroyk55exW}}rv!0T0*q3{>; zZrK8t2{&k`TN~&nfZo{WGVo^MwFmj?Bj5uFT{Zn>3%`M3cvTP7paS%!O5hVHa*Q5* zNa)#E8`j9hVE&|;cXwDO_4Lf(OWIj=vd4Z9%QGeBm^W`&;M(ei2DF{%9Htdo4+A-axh zA^(J}3y=qq6ob(kR|hOrv5SKcU4)C-n2Ph^pD(q99tN}6O4d+<>H=pw3MB?1Ha+ew z67T+~0l} z<-adKK6*}i)6O`(SFd=0xqHCvzMefht|}w5i5eLdB_StQg`hBCEgSnmz?%8q79h}{ ztCPE8C5X!8yXsutx0=g)vYT2~?bUu8abl;&_H`L%VgeHmSwIOB@7*gKTnl_br$?r$ zXM4Hz-Ju~gs1Vcd+@JW7jZG5@vWgEMPJ@IV_d}pQ)O~Ne`-iVeVK0!b$oI@U3UHyI zdv%lf2w5YFF~n`e0pySR=~;N{u=uuQ#IoV)Byi*tz$DZ0N)TCEuus8o2}+VbN=P~> zuC2}Gm-oif4qh9ZzIzYkYk&Sc3@>(p*-dmF`kB0qPH+O0qKUdvy6!Pq+%iW7)?Tu^ zIU$Sgx=hqF@pfYHKb~I19dQX&%EqRQ$eIEs?LIzWNEBnIJpC!AXT)M>PYPi~m{JkM zr4Oyq$@Dq|he9KWF()`!$t8bNQLDC4TyKYE3V;Q%1nc172u-1*MXk{1c1*0$>EZ1j zS$XEnNg^|qs4W@#=$T@)(c}9TPKh8xwxe_7a8B zV*BEVWd0wjKa`YXV^TtKs|*eM2L=dRG zqm1}#{QWlpfrC(ZZZ17CCM7-Fbs4FK#qpEV!F$!-_-p_N5k7)+1Tq>?Rp`HV?Pw)hI?e&)vdtBe)mrlun8|VtEx# zaWRXMk1)ma@$;uqsVA2(wQ{pv>de`>cnLxg0URCKdc@dxW5|)q#3bN~uvelUqKe+u zRF$ReDC<1v@_mv8?^$`*5$eIYN83&mwLWfjSsz7|SvAB2AzYzI?!(WYdw1+O;OR4w z-Warg3Bs&_?jRRQviZ+UC^{R^xYh69%cI#kZC0$6>1nX#o;I2A2VjCeN^aP%pwOE5 zCaCi*0WRH4^EBVI>e9Qajvus(`m6kXeLu|2OcX$#jx2mDz~Oj*bDJO4IX-Nppf|Zv zst4NhZF8&4H82c%xlUX= zy>2U^bS_^RUIy9X3xF3$$HFAW>LGOi4?zeU|@1di5}6#%Y0X2Oc_$`>ids*`!t!HzVu;WpiYC# zaV{Ui4G#RO)u4{=LG1&uGo}J#{iJ#c(-8ZvHe~iaH0;X7SAb06-G$&9f&}*PrHEpJ zG&7C?9jVvmny0s_GM+S2BBN_M+>yA*)}HxdCN)}g-W25rZXFamVC9bk@y zqb6BOPmMFuo;c>MR!~?v89>w2uF(^*J#Ais9G9g=Mg$9UjF`tM7{@+>EPzu7r4oH$ z1-x~rJ`WMj7*T$OspayTuF^P|>??py0$r487Jy5#c{XH2gmWFiegr0rp#f=aXt7_K zs%<>AnVrMCD5<2x3Ot77L9b*6BZBGjx9L+DIYvF5Wh5LI*M}4Fy=Y=LiiNW@V|v;~ zUO*7)lBDVo)zNPMm#<9sIpslbfm*s8g77P6^5-{>Od>IdC%x_n%x92a{yt5hiV21Vx-vDApK(9cM5>Cc4-l14K z=BZiTq6`FmZn}_%8_n)Zli(;rm<|Fx)=UhP43rt!7pMNVuyLdu%|0~O!8w+6)DF{# zKziNPW@j>$nvj~hdwN<`wgLqX2pfPy5Vg?X!zgZKYz!L{QHa5?0f5g|8i?Q1_@e6) z9u!Rcm<^FO)`t$g7g{l5bx0>Qy98rn2#%#_yt1CB$zJwr;baiDYoTQpBruIrr#All zEeQGy)hoqG{ZHAkQ-F%hT_2f=!J77@5$32>_p4=r<)h{mx3SzzoBg?FeWOz%@f>kh zARAqZ3rI%hYlhLDbP>~<6s20Z-^FFbzajKSj0fy&eD%ACB0Qq-BY!(!SCC_{`@l;G)ySO^tQ{fNit$dpy|R8Y9N%^Gxxf@ZiCU!pSNc-^H}*XKBk_ zK~V>@1o%WJP<+LRpFi$ma7A{`zxLYLa!j4Mhi zDqMoga(YJCcPP&X!J4)>$JN#8sYmgi0YXR17kdJ}{%hbQ`aKE9G5i-`_DGk%bh;rs z@{zU9>{h(xs_BRgvceDm#|wPJSc7O!Oa#&=F-0U)!48;dAc}Fcs8vNmrV`gS${rhs zj!kX>FtD%AE&!NyJg=%PEyP$McGfS+QHmH8^{Iw{CZ0Z11b+idEmV_Aldk)CfHH;? zqt&^7;@cq+MmR|e8^O1?Ft<$5e=GBd%Ic)_zoLeWJA*-;Fahd=E_TMV zeZ2yj_)McJ!oTAm&bRr&BeDZ0NqZqKCBfYF-O#^o_bK3*K=SZDVdz8$0)ejV7P3Jl z(pV46T>s<@9ikMvg%>$Fr5zoX4qiS!fDpl6EskXNxl_VQE+Ye?@fz^rLUIdnJ+zTh z{6r)mjweV0!qwc-!6H-WYbo7=Lz-jq3%$`~Kp-$*G)C$YGOAl8K4)H@J0orqAc*Zu zTO~epbnL`qhX(I9Q{4?h5@>D+!?xT}D%jO-QeEjM1RSz~CuE9I>_qqM;lR`Q@y9L3 zj~3bfn^3S|Kqq=5km9nxcNDxKZqJn??QzTjWinA_^(83?z=6E~E}0PngdH&18BWBl z1k8;$!4LujW@J(T6C=pK!H+d1HB+O9czJo%^h)T~FPoijYYTD#nkWuP(RBn5e6zj1 z7JyTI(;<-AzGC?cf}|$B#HVRTbZS{#@?#hb!ZMUrw*_6tV)iAWwXxo>R$zv_>KI@7 z8jL2Wkc$~P5X-^;EeUh&@5DU6F8?FI_p-l)ipLov<&$_rrW0L z5s#v$XT`hj6=;Gsvme6uc%T#3RZz7iUB3&U`rp^+~|?~e=UGE z2Zf^4=v0^Pz3V6;)Ig(0qwTBgSrQ(;0#hO6eO)7yDgEnP9Y3pQu-~ZQz~yd#{(Nj+ zo*IY-uBc(qrGI?Q;4R;O@L)OmC&F?8wgldR%*Ebwa?fH1Kg&j1wv#6U!gnz=eSBNC z^nA%WLr7eSJYCUv0!2YC2QZ8I`HO@orn&h%w4#x!C;NV98tr+Stz;E6FFh52#I&p6 zC;$B6v$ubyFhQaJmdlUZ{ny-;Lo6XCHueCL{!O!lI{)w^j0?cX=4_SQ4AE-)I6NxI zQ_h{^Gc<&n7+@?=2ifzsw#(4M6}1ig=FRHd#$t-228z|rps0IqQ$R?1n2ZrjDEpP-8yV# z*Yn@tpbp{eAKl&CM}I%`4}&JO{hu#w!Hk5@7$ex;RYSs6+5#?IFS`k_B4BX@Z(N!g z%15djKdhRigX0?QcEkxqlGkD%@9<0H`R8r~=iR^m);dQ5#R2v|!up4464`dB^tdza zb8&IOo*IVdd8IU`yRtA4U==VNXdsp?2_>fO)Kr)wyVtC-(>CRG%&Rqe&bs6nZ*rYUr6l1p$|i#WRE+v*@zKA7R`5;Lt+VQ5V2t% z?DyZx$q~RjnVB0Xkz>aiaB)G?wVi)0=EpK9GtZxo!TgM4zJ7HU{+09U z-#zFQaV!0u;*L@!L7@d%65Lld0GEI>!XryW5l#?@^|pD|#gas4VGRvAvXvmzXQxI1 zb|D9=qAw*FQwS2D(TAIu6_>TO@wBu=08ozC$ngB0aPZymFn^-vW);1Wsp)&9K$4}~ zFO`&U6EB*-L#;YJeeIld60|6{89y)TG~0Rm7_SN=7zx>DLC&1)f}E?vLZq?AwV@w* zLV%f(o(7n$b}!_p6iR#1qu}0tC+Q@dVg9K1OjGh^cBNe478r+se__>Lwf*`@p|6LM zwtO8D4Gi3|EYt=!B~CzjN5?W3pF?=uiL1XRL>W<2>A??_x0U_-w>symK>rx@Qq+&N z!BJrMt9!9AL)^q<@;=^l%-=WDuyH%bSjl&<9m6w^SACul;4WTOR)sh zYxIjC0}wy-)%lgS_-T*}h|8u@*QC^{K@aB80+CpbiFsvHPv4VP7u+PsQ9zspvial& z(OcrZhf57knyMavKWOG5m50g)oC0OQO_oM#%MJ=wQcyTr+$Mm#@s~FTdpH0r5Dr1R zmwqJ(g<^B1vN8v}?Au7u&;oKrUBj+q4t#EIm8#B8ff3(3*83w$A7WyLC44ttIJvSR zG?cb)NW@WtLT2%u-T3pzml;gx&2>KX#Nn+DNFrcttc3z#Cg;*URs_u`f9+W6~{X@jk#7wf4@@&fV#9E7J0UQqm|xSCm@ zV>A%0M7OC;P8c2z`tBl#=R<3oyi(hn4JN}h3y4BRr(1(d{yC|Eia_@`ct+USy;p`e z!Gi$8iv?0>b5|A>Jq+dsR6FaOWl+W1=iXpi5od#f9ST}qAbkbLf!7ryj8mTCsl)z% zClg);vo{R33`vjs(M~m+QX6Fle{_=t_r$LT5#L~qAe2S-F7X0KsbZc4$quI0H0vf9 zF|;&!er^S0xDY@j;J~w>Z$1b18q(;_07S}<1vlJx3hh+j8gS? zLn?h;)rUxfAw{FeM(>H*1eG@WWw6j@g`PLikzfl$V}DqH!SdMwQW5jLrTz~y+c^9v zVf_Y#M4;^gEK9yy3+QI@}z$C;bFy)E?;ZAv)IVK(W-XJTX#K0?1+CK(c zrk-JIgkpx^(NJ7mO@d)BhNQV84iAif8yU2DOm?`O>yQnx;%*)f+gx>o4q`?&6H`yU zg~<+XQ22I1TYyl-1qjNssC5bMH7GSwPV+=$oH{rYSY<1TR1Mh$ZQ+KY4Jz1rUh|JJ z|GQ-(ur{zTc!+V~mvE;8xa&Gc&sTKXLVuu6cHEpW?JQC#aQWf0r|M4DRQBO7DgXUT zsesc>KP$5-2{$0rF?eZtB51h)(zMAN$qf-@oltego_L3eUMTLysmwc=IuOJAFp4oY zz+rk`YT%9re!68yBf(7wACmN;1mdLp+8*+z1B1`OffmG-c*6{%%9Uu1+Pz>;um&iOJRaiAQgHWSO1foZ9 z;dOPnlXEm6C>MKn7vJ0v4kX=73=ASW@LUzWoMto7Ec*|7#kRGrgPajH#y(di=iZ>a z5?3>!R(JGF2o2p*-@mND?6w~*X!8fCkAIITD-`aV|9L*yz)^8-MBOe6+Zr&a0K=2n z+}={tAwG0~mkl%){k0BRZguV8`1FB&%aUC-;erJy5uB6vCV#?^3W{|z4l=VnA7<-x z$}_D9wEFK``xKf=Xq)7+@smEJs43`@w8cZ-Y;A2_ijP{~;PDb<2v5Y2jG5xPV{f1grZYRB0n z2t75(v%O+LT396$@Z_v(nl5HyBK7h;uGx!hnGP!rh-$c2s?5WQeh)EtDvq`^bu)&Y35>aH5 ziJD~De~&81`zvsUhj>=04e@%mXWm(!oOxB@+#0vPzJCi`U4x6F-ZaF-YxE?hnpWHA zHvBzmIF8_7a77ri)9V6e9j9u7a;N&|jDC3w8&TI3%{ewZYlBPonLi5(E+|;=?Ag|e z_^Q*O;u$?+$!~o=>14OM#8vH5M+HdV_HQD8W!M+E8HD)Pg2&U%Ow`k?taa?+nMP|6 z9+E?&T`ljjw6wgElY`(2vHEr;Z0uO+H^;~tm*rNuR7W0fhYkynIz9~IEPi@UcT2q5 zNE$9`yo%yU(uTRGtZz{6*z>5F?atMP3*4S zg}~OAEf^l{$>m2g^vPz={!7%}(665Hqwdu;w2P{vTH`-P__m}p9cmFS*>Wd%)IqjZ zCaA5UMQsCh=wEK25B*ZjA;UVg_$>J=$j#N&dtY&i>Yec?4S2F*GzVyv`Uz&9yK{5N*Lle7&S01l2#8ajyhO6CbUt^%+lEzD|JQ;#`6}h=5>o#^Sj{wN4L4& z07+C-j4tbhF6Kde{01-q2vj4Y*byNCrWPJzK>X;1(7*xDTE`ZRf7JuvXdU(|br`oe zpLbs>X2hd=B_fnaH(J9+ZqaXe%p3sUD@y%|AblmDknYC^&@XcE}NWQi$Ce zou+)->%0+d4=4@>6CMv-gE!0N@n%A;kgi8=eu|beCVx`}HOMT{ROy+%!t{4WiP50r zOt{RdT0=vhS=z&6hF);yz4DtaAg7SM1(2V{8p;Q?f3vefki02Qb!e&Y=FgjA_MCy~ z?Hc(XpWM;;3EJ?&77QV1PS2iIctRO|tyRhc4Hs71ra3Nj(VME$Og_TBU)$Ek3Q;Yd z|IEypopDHAx(GcTHliWn3rr8(YDBw5K*j$4z>WbIo>M163RaGA-D1LUoJybw2gmkq z5fpSl5(gG#VB$pF3BX3MSt8sw-&rH_bMUJ2AhHP#$jX*=cK#O{+C4cp2arQkXpd0b zRK}Vzbg<>t^S(014~Y51TVccd`PaIGkNmzkzX~8Li9RrRlx*ldNa;mLoxo< z^vp;@!?VJFYV6nl7(IvD2PaX*Tu&`S&p#Z9eu(~VY{gI%s62=i)+Mngu50#k0_d%C ze3boL#BB>NZwD6G5SnyAMM%&#%`&>?v5G)8ijV*Am~wc#`%f}1)L<9@)&&DT9PfMg z?L#2f{~~BH1>^jI$T)7D($nKl(rAv2&4tVoU?I)Z$|UC=BtYSKyQu(bt{7xbxUR9G zuX-0`^7;uy%_^y^b9mVkHLC%=<-Zs#IY!i0zAv6*7YEOzoDZy>H*)Cs8ZJ2BzE@m{ zQgfZb=JDbee*Hci8CcEy5J4o+;|0I)=MsWgA4PvWy!TJp4z{9Af zK`R^>uosIf35XKvDVxEyD2v>+%Zh1P43dJ|1tK`acw-fwuRQKnoUg&bL6D?4U&y=p z;l2vY41{P%E5ta6zx>)YWe`0;!yyeZqIRpK@PsKpYcMt-92@s9%E;rtd1@p~@sm|j z-jcUmBCUZhWPwhTJLl4^(Ih`_sk-DwEX)2|4^P~Dw7bZ_JFl|NFv9(Fn&L%Qxh~c3 zKf?xJm5JqNJhxTnQNOjd_fj$!?afx*+eJe!mT4_myu0Bcxqs(M_x}|9Mv@a|=ry(d z86M((hACfRJoTeJIMR6~1SRIx||Ks6eRMd)r=2Y%!!;ITaQ&Y!CB!$mY zQ#;}{j46$kfBjk|tFaBJ9tMTNz?oMFr}XmkqqO9^4t8`vp@G3n|~) z+8XQX1jqZy6Q1sW%jMR+7n`~H%Jg8fvv-*C8I7IZ8&+OLa7pmR+$V>+FHKGrE|rd{ zxYcz2L#OY2tXo@OC#t=>s zA!%1huwA0HskE$6Heq48?89fZ7hiZ^?}kUCN3c{F0lEw+t#a%ATQ+ZgDrz@6ReZBN zjnYW@I~5JBwJhnbX#9D*T%DKsKJbrV&D*22x(j^Qc9R?O>TaFmdoP`IuzAQ^WqXT; z(1b1T{Mr>cu3u&q0!R9${!m0ONEfk{8HnbQl{@u&+_kIiz48vX2vytPMO*AgdxbAZ zX-pH1FBTIM7@VCIK6`fVsr7!UOa5+vuO@pR+e)U|N@fzj)sG*?p|O^gkg72R^N@G`=+K6Wz z+4r%p{4*WJ!*#I1WfI#;Wfc{_%+JrK1%`!272w3R9lM%??-2F8*_rz3#O->R2M$nf zAyFq?SSR@>Z0m)uUw`W9L4@10&rXd}0vvXy@2(D86Sy$9Q2*~=G}jGvQ}X)Px0k2!M(rLOn)$+cnt*hL#H>b!%WkgbyVdrm@>>it@8Df& zu>6D&tCG5Bon9s`Jkr^h_dU^PP@&K<`A9JugaOam^sjvfs0<+e=6LKqtQ{dN_#=7x%kQZjLzrc(tM*;64uk$ z3O){}fjVHM1_t8>f^Y*AQ^2$Q`o}?5VZ|4$xG8}{=lsqu{9j1fHp=sE|E; zxNd&F1n4n>j=0&wdq$^>8heNvZ($vA<3*ieeGx>r==U`JzxJ;DtLZCmQ%9&}0GEOj zP_bHdWEBu-Rg4R=Dxo6#7Ss?i0c6SHR3itN=F9ZqT?>YpJ8v)ADr++WUDpwNv)Nc-cQUuQ+R@`|^^6l>S7ShddNvW0^B$KRlgqe4ntg3?3Dx zFO%I_bm|eC(b`F=k|*9At}SQq%G*lHF*6qH7=Ps2_|(+dy8hz0q?vu~hso&6i{EU2 zhy6*uwOeNUVcF#51nSU=P^m_N%txaYXCGO2dF}E|zQ0IKE!B6)(XZ6*1>DvuP#vHN zb33FL4--^|iB!*}dgmQ>GUj|$o&(+4ypLLqAGb3cpPNIpgvtCzDOXeD`*V)px|Sc%~k4{5APQKEQjOPMszO}tSm?M@fgYisNj(HusikKJva^Yig>&+9H`d7B_8h1E-E^-f^b!?qVa zisYJHJun8Wf_zZS>^XGvclo~&+I>To0gv_@VlK5C8=Gc{EA9iDYl$iTuOA@<$ln=F0lI z{tkGH<0&aV0Rb*osm>74E&W`v?6O#P>3#Hr;gF|Z*Q2h};tU^ZWCXnI-*Eluv*C28+ z%cIeo-J91%1q2xxXdCPDtM2#Uj{=Co($mvz<``ez?AlauT3t=;Sdk_Af37q#q1g{RuWv-^ZtGn%kacPco>xrN7eRK&?`DAcb3RAUP>e)x%@WC-5qqG z_ziGtILi0b?%jqtP8gBgLPjl&Z>|1)K=C_L^pC5pwCsb~K9_XQ?#n%}NpH#GTvEA; zpahzihugCDUN3PiyFueHaV3>kLxFgC$fkPxC-E*`A0de4qU}g*+ zLa*XVHRD??d-FgrT+4m~>v$)YNvX@N57P`ffT|M-`$- zm{pU+oGY$&-f%-GJd}ozQ`9d-8i)t6n4FE22NV-_EWOc50R%DOtgO2JIrsVGtH>Ot zsM)`o|NC~5UyoKG)6+z%9no?LX^hdfG*PD-@be1Y=@c=bCiE%;AJi+1`eoSa(oX%$X2 zbJ2PZE^ctrXM0gkxb5XoKh$Qw+uZyD*=auWp=BKeVGh@Ti`91kN26wF1iEENMcvV}k)}auHje)`2igdQECSml;bimDB!du@r zKsYX2-8OxTIl`agI9)jIDV6V@XSnCN24~(!0Bi&P5OwQ*S$xo7>hxOH;NYC{M81T$ z^z%H!-q76_GgI-4@$pI(2SVwJu!IDkPRf*{!erGyAdaE@1%|GCY4y>c?VH^ph2h8( z10g_w44|g>!GlcA%%Axqb*^R4X_2;tKU@>mnSv6-GZgt(7o@hHTy&~-{ly4}QZW>b zwQYq95UF!KwsUx>R3x@$GuD6-V8DFL{+Oak#;rvYoY=Iq>+-~^{>Mo8#6e2%PWR2a zpkEDe!7I+5#?_+|jd?$)OgGz6@9aLDI*%x4N92hEzq@OLY%9O{azthCtJ^IogfmBO z|7uD%Y=FB8t@j&=-WEhAPkj26%t1jQNE_vy-zaAbNac0?;l_D2o|`G5_5H8oQ*^U8 zq13xx&g5o8caxR-=_xzVYati9rPaPAtKBSL(75DSQ1td9`gH0~HZx*VlPjZnHBtx8 z1Z3cQxzkrF2gD+?-KQluAdk=Ck2J%?`6Ki^K`+yDiYYp0kmCdksuRnm5?|p7zG^DD zMRV~Y&8&755^yaSva-3)$M4|eD-Zdynwj3iyLe8R)tvVNh0Unf>g+M0wh!07isXV7 zsg#PK^SB+W<{}BzI#M%iJUnrg1mAach!YaHE8n z)DoOzM|>bP0{_X}dr&>&p!%Y9SE-4XS(Jk1c&dNK<72PwK@K7 zaof8d+^vDp(KsdWXKf{H1jh|W4NNAqzC~0wydd``!U#1rGO(~#Zii4b zR6*TPRM1r50U!mUvU|aW%- z+|XXW{4I!)J4{U{OX^s`BZ4-leKB8f+RqZbDyUqsUQUMsRWIF;Dqevx326 z1B?WM{ZL4eulG~`9?vT_UZn>;nt}o%-T;s(+#TNZ!U$qhU?f`UsV@r9%v`UjQ3}eW znc3hyF=IzAq&mkp%~m&)Pw->60ZTfdLxMT4gesnQ_5rOYj<<4yM>w_b|AJQag{P6^D`3hyS8Am)_5(DuuC6U;yJ8m(?TbAh08j8{18*qga zKZ_;280tswm`<{~8U{IAjL|K|DpkDi1Z!~8yr)QHM@|q;Ciu_=1zA;s-pOfwE3HZ9 zuG+%{DDm~5oZCX8INzZ8C@NJ6k#?P(G|=8F=kve;)rQ>GsZ{qV%l=2e78c;;BSfTB zKTNdi3A6UFEfmenG(PF>R_$bfTtqikVKw}hX0>xVNN{=>`97`xkQL5Hu8D5^ZEDtD zGwUd;_Cr!iM(FvBQDj|dUn`E;@-_v^Xjp;J?;lrJ)$CfW<5|6uQr{1C4h~yo5x66` zf#BPqPpG-zRH|6HczPOGFwY23Bs(BL<8r6n)1VXjx2?&8b`AZ1OyXYjQit@Qogr^| z&BG&>p^z+?JXkMoJ0q2L&B4U@ZNxhbOEI^^^gilDaVj9;9qTb`*JxVks_Zj3%7Pe^ zTLx(FXXjVVQ+E_yxGQ-}lh%%=g*E-~b}Qj=`?I9PuzWE74r##Ysv3v5v1!-7nW%xV z^Y553&@0mDG~ZWHz!XPJj0@L#8joyn!4}MgoG+W(Eui6%o?LU2Bl)AIbRhhvy?TGX zE_3Y<&6HEDUPSegPYZjDPvSJ&$}L9JEy5iKuXiM=xSQ+0{<^9MHXDvN zG%$i)?%FBmq>^drNNs52Mx_;QQj_aQ}L5Ls+9k@x0R^k*Bm zPG%4ikPzhHpFMMi!X^d}BqTk-E&YVT7`p-(1g#osyTxl%lvX7BtfHIc;|lnF zqiJ5U_}T2*IDO`mlqbZcf%zSR8Lx@Z3Im-ivVowrMliwd{=&9V{Xpx2T_kq+Ug0o< zgO<9J!~HCZNPmmas1h|ZX3tM3V$h%0YvT@sZ0jP@Mi-Tv?7KVQ5wi1U(5~PH!$iwR zX>!Ynym~{V+K%v$}p-^kCf4u?D?D@*@7z*_r>PO5EmqIgV7=GRZi;)}WXi1Mx zkWSFjUKc#LFxH%(<9Vde`$(DW!FDNwZwedE21MJxl)CVtP=nci@<{6$td`g^HI;lA}JUXE<-+_+G)DaYvjmCN!zc0K)fCwz@K)4lh%H@Z-r zEuQgtvw~$IXF8L)ENZ%>nsgTCg!(0urV+db`Q*6kjuISx!h8c$Mxmtk@sZPKejVBf zhwm=_{o~(3_}|Ec$A^uK6w^%iH#9cNltiD%`4&F+Eun1f*BK*ecmF+P=6hEe$UVn& z_;u~twZm>`RO`h2TGX50KYaZ7`^%GWP?ryX4M}P%ou8jCOi8L%F3!o zt4Sm`WH6SY6HFyJIhh`~@$wDHRTS#xDIfalgRrXfrRw8>m5+-s76DYK1t@FNo@mn#Oty>`Ua%gV_;h>gw3$vGe$cTrt>Gz-fq zP_WTVacfQ2@t^pR(@P5Rn@KHksA#Y>NAFZnP)NBoo4rUAuhQBF2NfkHwWzBBFwC*w zY1>T0up`|i4l=O5t*jlJ?%CfATIJ8fxbvTzwM;N|)j{kL4`YE{2N8BMk4#4IS5fhz z71*ku_VV)b?)&|@rng{N0w=2!G513RkHqw;Gz;pN!0~IFNnt2yll3T6=__wthrX&n zkJ_aOBNybuK4n!_+tZ@{5Yg)LScg$)wnqTefc1nKlUFIPO!H%WAKuE6T|g zI)zkoSu~s9`=;Y*1@@y0EPq%O@+c)^BepIoSsD#_RXGwK9xfNY_-pf+tb)QrpMK&g zEEa1hUgZV}%%AG-l$5MsMqwFC+f~f!gghqoGU2?LS;PJ9DkEi$ie3|TJ0#13XXw}c z{1Q*bY;y{BsB+XK`Y{JzkxNQ6=>7epB^85({i5k|+G*X4hZ_|`f16x{-xaGIORoqD zEMK^Kda5eoR_F6sR``&GiFP`%HAAnl?WsXtMTH(j*)1U8NH`Yj2B9how3q=ZoXnpXly>G zMc#o%qa`KFAey}uelAcao$nqzQ88~22?h92pII``8H4dreA)+5w>y~{w@mM$=(0uS z9<=UAw2sbBb`L&#F*C!DQgy{a=fe%%riEKw%h83_rH;E|B$N{ReMuV1$`GUwJKp9u zBioT;s<*zY?b5wxjP9%;S{8AEOq?DJJH~;C0 zd4qY>=O?>j!Zcnx_*U&x*4(maPYRyd>E}mr#t9dD%iJ2{1;#5AdC@*yEM2CcKvNtw z^yYSKZ0PEICN_?1@m?-8Bt3R9i)Q+dD zOj+IVGy1$7;j=9_Eh5LluV;KEOf2M$Dv9Tn@-C@%MH@Sv&(QNrpin5X zva+!*qR%P*%t+p;x_c;gl8y8IM~@!SwKIGHH~l~T@u>IrYv*o-gf!+Q8p#z|mjF_R z42G#7rS`{IK$&}MdTgw$l2YRB+qWSb3b7o>kTRTDglzeUmiV)l27BA9b(07YS(V@D z$d8SUzT#}vHSFA)e1N*Uq@=`uy0EdwaX22QAC#b(rrqMMGKGt2p2&dnYoPEa`t`=PSW1)mS+*s3E!U|I&kF16BJUCMKEyM*&NOykWRs7Op5U?jrVsGruW@a^35@gi-gz#<#GZ}t0jK0kC}VF9!M$$iuP z+ch*aU?j-D?dS0ZhYw2vcC>%|XkqXoFK_SZ)2H2wuK@_I2n6i5$;rw4z^Y+Po1pcj z5J*{h`M89H1iFq5-q|Sxcke`wFV4ioq(j%kzN?5tG63@R>M87YLHm}{DjhW&K`2al z78tS8tffe{{W6w59-6qq8B-f_MU^P+oD(eX0WfsF0Du>?Lmgb6&QVfSOn^y_1yq$% zV$-rC%kf1lNavPN@mRp|P4`aBq<8V!B4T2k?(?Qhi^8pD367d30F(@J+hW)$N4|(N zJBugrpjeQzreilj&m)Om6TM%t@^Ka7z-^2g8O|CBI~UQ3uF)w)&|N+*nM0|k8#TqgE16Lm-_?2 zHehGTG6uoZFTHTy-s+Gn2pqhI^_as}5)CT>(0#u&%T%Hn za!pG(P#64(yhMba1|ztwp$qLMUnV!-sMMH+#=15qYjCs9gu^Tm$fKi~;p~zifd{ss z%cC1~P$GKC){xtxEjcfyRh5@(udJ+$Ky{~dE}0hMS&k9Q%`U#Z!8A0lP9bFAFw3ju zdFlBK-Fix-z%?SGW_UUKc;J3z<8jqF8vv)Gg&+msHZ?fpv>|#$IrlM*mEp`S*SQrGWCi!iCE%-jwT+O$ zQktzmRAg|nqaKbnCen&#o~y$6!JL7Mh3uG{nB#eeCAt zwtlsw%`|c!_Jzf=nAc>=YP+?1f?`v|V@zj#US5qSI8BFHQDp=xEABPfQ@qfEOX)WK zs0#%xt6^Tc+~p8nfYaGXRFB+Aa&m#UZvTgK%E}`X?Rk${-Q5IBGv{eosD3xd7PF`N zR{g|C!4iMyu0*=CpKxXIu#S$E-tJHLWSnCQ3JQA3*pLogI-Q=2$NNz#c1TJ>Fx$Jk zyO9+%c6MHxW{@g!+LF|4PTSbnWTLUbZ8Mq2{FOOWvB)klZE_cN?%if!nUOS)tQ*zF z%6}1{D=iBR>1ELYNCJ!()c<}g0Q7VNFdZU=vT&m1YGD^|Xr_WWc$1u#C48QmnHi6$ zI=4i0_d+^&hKEZ_OUG_ae5fhK5(bM9u79&uq9we=l;$NC31Ow9_f@h|=Lha?lxTo? z8uA7LQ#y4~EjG_Bs#M95D2qLOyL??Adgm=c(-V~pk+PGO!pPzvcDA*M>>`}9AyBhH zpeVa`bAAtD1ohOEx&*PFhUhY)xUG67n9k^eqn4^k<6Yeg!@jL83-PP~v81HDo^R&7 z%xWBg+&K`&dJ5~F`s$tK3$s%|#Y7^px6kz#S~CZKa47 z@wCtu00@>)RAoQgRa#ma7kybq5O%1483+s!4IoadpApxfeo|}RZQOY<=`4(|ss9bz zL@DwTZxKLxH#+=vw}Gp!QWXCRWMgZ%X;9X0%jq*IV_x-+9Ao7XFBbv*P6fK>$KUp9 zw)k`V6c2)j2--7PKLCIbxKfX+jovEhzh}B&Nf!&M)RWub-A~k5n(3DT*dwHyWf|@g z@Mg0EHBt)Y0)m5sofmoostj4bxgD&rd6A#*3h5(*_5}lFlOqSjWbt*>^$&xC&KcgJ z`#V%98ap-}K6L2YnVFfgAa-~49!HZz#fNX-zE!hU<7%hOOvh-0@mxkiv^Ik#ycy3 z!3IuZ`2Xotm4I4-)Rn=mhJ=K~KYXY|=G4_;fOm>@Ow?%k{1{jvCAR#w)o{>oH$ z9$4R8U|nU+;xm2i?H9egAo5!qwJ?!?ab2HvcD+Zx90(_%#M;{0^LWe1lJO30`O8M@ zj63@v8~NEol)1o+To0o!|4c7wGALENQ~ z4dno(>LXVQVM2QjCE;7uk#{u-;8=>t$;%hE4Q%l zKe_<-AFhFmhw82$8oCVCSu%Onk-=b;MG03vSV)|TI9tbNv>T>HBEb@EmiJyUr=zV>|QsWo!RC>zFaz@l*Cz7tw>RfH;RKbfW zk%oFob9;ZkJmRctJtzdP9t7$UVY4}$3TD*1lIbY~RzY0mGvaK(lwhfXsvz0^y2OA} zxmVx7An(F~&Me?KgAo(sm5a#4kn-zJz|Fngh_olFXy3jeoJv%hLY@nxxa;oSy9CWr z$Ofb#g~&XR?Z|vJ778@4F(6J*2?V#z_fABx9hjc_%f1ki-G-ru%rcK%WS=!8KLmJj z`W(PH_ZF&uv|h#~-lAZKS9kIK;o)JrFcC5s>TAokZ4Kc4k{RMvXkZ{)BMSvBo|w4) zDWEEUP0JYU4>&Dbtg+ebpwm_~Ky%Mrc+jm|b!plj<43RXEIPWor4f$+Spfa2Qh_2O zK6SjhF$I?%bi6QE(QDcI-OfI5;v{VXIG`ROArXHR$am=WMrGxx@EUI>1#JZ3$nSBW zMn#&QKi^gIVfo!=tva}rv6|RHAP_Y89uzW`r&}^B63iyX#%7CGSt(8~L5H6-Dq@Ro zICRk(W40+2_8UR-3)&0a-0NWHfEVPfHP_o-zoR5)xcun}VNlwE=zafB^AisZDK*%P z?m1&Ip1fp_D0`5)GrifuX^;7lIIXs0yL_Qt1`dM%-i9It=7+!q&sekixp}^ByEz6^ zXE0k6c+D^P(Q5*so-|95#|bKM@?iB#8Db8Dgj6h)bnS%~W4~1w^G$iq3Y?&Q(QnB7 zkvO0+&)H>grJYLzBC!Fv8T7>bLWg+|*%_K%{!p&#C2~u5f~$a4it>D+`mcv3BCU>{1dZy=PG?UmqhV zFH~zV%QpFJ!8Sm;c6G&ZM&68S9as>9IE9Pi^jByB1W&^OEMKVAxca)}3R8%rdaxvT zqjv?R)%qQqGN8f&?Y(pL#pk>Jm1o&w<@pso3^`` zn{Vi)#VC)Ju6%mi0#}nj@pK6Ehu&GV^AE7J!?0V+5mDVgmaUO~fOHlvr>RQE1sW0M zLSI)@G(xJeqt7Uy!;elLm&@4orT<~B4W6cZ`^0o#`9;l?ttlHyk0FgEb?pw8S0-Xp zA%j!PQr?^6Ryy)oPQ^Cu3pqA%!xmGdv1AA3k#`sH%WaMPyGpCy!P23r1U;~9|26A> zx_31J-YwX=b85J4v9ZLC);E71!X5l8Ncg!)epMB`{siGg!Oo`Kr5(0{40ivmPZ%Lbgwx@!4#t&y;Z*T9Z)?naN;^61b7(sV`KCDMuX z^YdebA?;s8q#?bZS=g!?RPPjC6emWI+)V!hVg0 zmNa;K#Lh(D&$NMHAx}ZT8|j~0tFE;@kQ|7-JUH`fjx!uk_y1E90#5$-9g6?ak8iH& zhc8?Qm3phJIko(`wH7MH?4P}k|ItYQu1oU&_|7SAoD(cx{gimgPpr!(8Vkye<94c9 zJGMS{Cv;A&zkCI0Fb+vYd~Q-XeEhgw#SAzqc*SB>WbG8V=eRP+Yy{H9NsO84B{wDvF!IR1ZGbOqZeZ>-mh?D4A@i4A+$3y`g``2PG~G z`p0hsq!&(xlzEL^%`T0T_pRK6j5Bx9YrfdFOc@xY8hIMI_qn>4-oVY1V9ohZ?&wi?^{Bg`aVnM+i)O_Xc!mS=%+*%r>iL@a2Ko6S z7olfavmMd8#C|7qMm<3Fese;m-KT;fjqHhybJ(@Ab9UXLDZEHk#HNbW20_drBeS6g z2Y>u}t*A0&SfqQ$V32#Sz1osCunSV>|Lg1H#pQa}s>o2*ji|^5 zfk2qb6c8e^XV?J(#4ti2jOV;;@B8-Klw!WsUL-)W*y-=og!{dmPcX<^vSDVZL?^OAB?18VoY0XMjbt}qql=z@glH=3*IG5A+iOCZ- z6Ht*)?~vk7=5wWEsPyGsuqc#taNf{2$Oq4fgW|}UKaOdC1&8m?`+p6GA0B`H4i0yY zjiKRyI$tY=93KB}fE-jWq&j_HjY%b0bkjS4c}P&YE<7Ghm%+jt{%FjXdosg*3r>n zx~P0434Z{EIw_z-x+8tl)%Ajh40tj7d+o2{ekWnK%Z8-kaYIjjHz?3k#bDwperL>0 zHpfiK!&66J9n-$?T;A%Dvy;=wI0c-ww`#_tM~|Ft-;TI&{Ls@2$4{R={ru%i>Bh!J zLuo9&>q`kU(U!*|+J%#l`g>KYpxaW)~2_ z8)FNGZn(&w_W7(|em!P5H#Y|>csW^p_wL>I_R7snypfSnS9iB@c78>L*6|Z3(yOYf zt{J_X%FgAlUYws#@*>1z^Vh4Hr@(d{BO}&1tR;MfXH_e~8aDHQZk5+np%RauH>76U zI61wZq`Hp{wOVcXC}A*HlYS4$V?ru;E-T(-A5_C&j+p4K+s_Y_$Yf<@ji&@Ho?2uu z7?E-oWIYQDi@kh&272}Pc?HIqJKM~OZ7!2k7tYr-P~wtd<K<3j2~w;Ns#z-IW~=Yjc3oE?HCvkrdY}c1_nOQ$~rA6&pvqD&CU4R{pL%h1a7I4 zqT+!d_I!i@F1YX--qF!92}{s@_3G7lGJYh28Nv)QH8bNEkhdfzYvCKqeHpg?{_1lK z27Tx%4u=!PhF1Dh*G7Vv#al%>6SXSYuU`{0QbRSZgINtk&ajWWlM|6lCeO^yQnJYT z`eQ*l0{CIy-lXWkf}3Z5_4A9{i>3uKa*0IsUuQlRubmpVEx@R&3xcUt+PUn~8Zmx; ze)F6)5gJEdn=^W^kg&7eSAl01Pbh>~FNe_bCy`acYHwrtPMD-Tq^A;eqs6q2Y;A2J zyLNMP^ZGpcj#$PS!Tb3&LbQl#c-yzTwXvi5Kd>tY1_$k!BUK$eJ(vZ@(qEX%RIJ2_ zi%G<1&z=dWDE_8tk#HJ>NZGz%=FOvP)3)jvb(?R5M&MRS|`4jQ1|@jiR)x%@)nMQBySk24QYHhCB)DK~ z+>q!|eSL@=usp4fU$ksy=&XD^s{~nm=+L1CxBTi2XXG02vLV^@^5sL|FFWoFpIxyFwrXT$fO zlaG&tigA08hlj_m^OZ60Ra$o?)2A?KZBc0OYQD7?8V!*vJs89p3zw1{uUZ>P^wG-1 z=h%?xCBBRvC#at6rEFMVN=gc>PfnxQGdQ@?wWfn7!8jx&WO8}^&9+!~M@O2#0aWB~ zpPeFPHc4|+NNDqEfBs>qvi5T_lHk@0AuAmQ4LiDC<9d4aITCX{`8aGoLm{ATujkOI8M$3rSN{mKwzIQCyu$}> z%ApISv^`aEbeM|mdh_2u!Jgze4Zd;@)b z+nwz#B_$;^I4F5_D0OF(Zf?oSR$OZdZacDn_~f+r4jN71gcJP5veuK=gA=M5c@>82 z&!=x~ZLAjJnInQCA~Go|ii*D^QD-Agq!4p0N{`gYe=S1NVfSe>ZMO5+A*pS#wP_;n znj{FKXf)VuG^Z(c&pVX61M~-^Ke?Z-m3r*#;u3jCJ;PE{!~N#t#({x>@kz=z_nRM3 zSgL2vd|2-TJ7}29Th3JZ%ynhH&diKROG`_5_U!cji5pdczOMamq{G6(Y!?PfSm_d5 zC%q{{Np+bnsz z?yRRujgS9PGCe&#?wN(e<=I|v>s9af1CBSVnOs}b@9Hk5XlpRM;@i!>^^_xf(8Q7O zTr<9KLGO4>#KK@{{1C0TR{%OObUG=?=b4$OpbAQkk1G^FHMFGXTdU{dFnDW(57#4A#;V6`&Cs{8_HEM`iAq{M*XE8v|^m*;g!|Z2G&GVI&|K!@bC#} zfpP)ckmn+Gb#)zsgCb}&R7E9iZBh8273C3}?mq2+>y6p?t3hp+MTXHQXe&+n1dW?#)cEi?oTN1!er>HWx8+Wv}? zl2>zY@ME`GBqOq_vhqR5T*xHT;EV81Q!6VmMo(_yk-n|Z;n;^z+!{)2wibkXPq}i( z_z3=PYJ6{v4gB@a(>ABophP`&OgTj%*xMfic&0mXuMOGzL|fHa2D}3iF@UcHtOtrTBv2%bE_9nVE+;O+8D?JLB&kNfr7n3_v28$iMz&=4K!*WbK?@eaPCd z`TX_3*&%n@Mo+1v0LtL_R!?uQfr*L9e1B1f{b!7Zh7d`6>1QaT4g)@? zlK^b;10<3EHV`^m2aP6i@7}%6KucEwL;r-h_xH|iX}ohH#h6B zn`a?^&g>UeFBomzs|JbIk#3OBU3zyv?e_hn(eVV1?7W1i=mmK(LP_;fY`$K7!=2X$ zj_@DfOkr}X6QE6NKpFh<>e7)w8Km1x&=uob*X2|SYyh*{dU`4Xe5H(&o12>jMMWQW zW|%Y;+BJv@+yF<;VU3H_8hO z3qMawJ30aZr0zNTgO^#(Z&C))dO!h+OG^bvTPzYmG{1^{L+LQZ5>5gnZ;G#8dFkZl zCYPcHNP>q?{GnrN2u4yebSWk^n5<@T9Lg9AuzC}1vyE0?9m0LER%6!`{W>o%dTea$ z8$Q#P+=AkuOq#fXrD!<@9>M6%$9?p(03!lCLr^(H5bM1ZsXmBVWj=(Zt%WGf&dx@_ z%>avric{;rENble{zC@QqAUvsn|ILkl_BFYR;R%tYEp@9`oK((DAnhC){7(PK!Y<1 zXJ2CjGF&hTVMHiVRxQ%P>mKYL5jP-8_bG)}M_bLPwy@03dFB@Yi~P8G>rA8O;WF8z~udB(+L zQkIvMoh=1t0c=6ec{WP^<9?b;e&v$kLlUXUj-*2#RkbYhOtZHFj_@y#6krW-2U@m* zzmEAEuZc!T8bk7MZ?CzxB(po)+yIjp1stzE;dia^aYH;pr;o^kX3)gp_|FfP=9jqv zb4F0}V5tZ0PQ|WK2fIFD6sp(C$HxbFP`e-)Z5zt!`zdc;%`0$RB9huu`%USw{|L)b>1rQ~Ilxb*5n$iU+oO$ZyEoN2WhA+*5R z0zljiZ{PmFdTN#R=8f_Omuoj%?%UDTb(qE-S^JaK<~dXVu!ffx+BQ5O5(WP%;R_4N z>>(FtXIpBDPT{TAIL<(CHTj>}L%TdDI+wpg-C-<_g-b*e6O`<8|Ec(EZr9Rs?{g@y zP$3V1wSem(Y1kQ-X=ZNT#AVh<0Nr5K@+urA^%vS1fIQGJGvm}hy@g~ZaHM*mn1y*g zJw31hF)@U1=<9u$Q7wU1g%CWr{v6bG)=&tS-LO`(v!(7m`SX>lR~rEtY_8&Ve9x$< zHBGlAIu_Re`vLeJ4Uc+Um4Lcdsk|Pni(8aLw6QX!*?|ABj%IUr9*7y6Ny9BFqilZs zTa){L6f8gGPRWDE+#PmU5<5x^GIl)%8v#*hMSc92Sx1F~p@BmYQF0rEWR{eKXg2ix z`mHgwKowm5ErIPwh#OkVAZ%px79K=#T#@u26_&Li%R&iobj{Dodf~S@Sxksz@uEU)d<3L5Y3)Rax=cBWnYc?D4A>yHR((`DG?#Wi}&q z&iCuL&mT7f&-WGpwJ!19C&# zvhpeUTj#l(bgTq00w{dA*or683%oeaPk<_GB22Jb#X~P;ufvzspYJQwBejuJv%{_N zjxVww_HLE);x3dnok$HnsOud|eRHdIJkG*B0=K;sk36?xi#-UEMN>Xui{Tyr=EZOT zJ(&e)UNdw#k@f^$#PCVwS`K+NiA~Axo^B{8IXB5+O?Yi@u6xH9+HZl$y}G)(>T5Pz zYmloK-tkC0q!PB5y~gV!kmuMmi^%SC|I{(ZYql9REmkd$ z%}hAvQ*oRs8drxFu6%>+dR14^LIRfbRddQ=^Vp?)5_YqY)&FkkQ38lw*6+sqNB# zpD5G6Z*A~Rpv10%gg=wjYJlC_44Owr+RWGXUdizs(2{K)I+m>@h{g@(Twvy{U zWH*10Q~ocrrWY3ghQ?PwMZC5*log2swG0H8>(hoX@Iagd6DQ^WVKb)Q1wjQS4NA(& z%5GU4-lu-S{~EBI>edHh^Cn8>l&=KHH=qRz zpwYW`??yynR~Ha>it^h1N>+h~>w^x#>OYdwFy+R7)fEO6G6Bi8Yb_7lQEF<39Co8T zFAIx^L_$$l2H3-IW@hF^)mb~d7WMF9y%b6NAR=G_D{cZ<2r4NMH4@;q1|VkR6naXc zU#?m9RZv$G{Wgshst&_k$v^n>J02K7Ddld##(;4}S;`CO=;$DG2{al}{Q)GwUal7e z!K5k*hD7Rq^Ve9RysN$dBiEPd8N<|)E;V57GFNkm#Dt!n=9m)`>-1C-^i;wF{7AqF zNlBP!q-ST#kX`!^;@oH2uf-NTW*-Gec^yPZ8TZ|z)Ak6^R(ts`(Y$7TIuVgvfo;eI zjJz^VlpMEJc=20XqFNKhhi+)iObZu(0EH|eA>pKZ&}z3iBG35E_nE$l0!9roL1OQg zWpkcYg<(%A@BkPZF{{?{DAgd;sRyn&A&PpDmQ29tT^>Vsg}sFpo?}0G4R-f@5!t?oIPuyZbz%E}Z0NdKfH(#!P5t6< zMLG=P{FozRi1V$ik}LP4)cAZL=?h*T{wb~Y#lR`BS!cC4Apb4ynm`ck!!#Yc6L1ED z0nz_x*Y%U;du-d2G!D7+=0y>+^O^VfbcsYFh_*64DjFIZx%f+v0F~Pt3`9TxU-D|w z522={p+?)73d2-pxe)RK`3@m5H|xS~*Hr;RmH^3rOV+UR<|>=rKEQqb1e6b3(hCS! zp|OJ~H3g*PM;fMuw_BQXo`FNyaYBNE357c_8kMG2Tw=a33V#$^*WI-in;$GKDZk$$ zk-6tKmh+C!HaJ)t%$!apV^RX9pTY?3X|F1P|ECCTId^NSB^K@FmAOGV`Qg?|GBY@X zIJWEuKMuenzXh1wUZzv2ee9WZl74-|)XZf-D`zs;SYC4r+)eA3Y9s!3)(eP2g;*67 zOn{QefxS4aMQ83psbRjXx@E3A8)SsW_GB$PZ*T9$ZP*$Vmi31=6LoypB(HfG4>cck zx&K8N?D<2J8Aut}Kpq9m9v+prHwD7&c|}D9XB7xeF`0~TJFoVaf3Z9`(H>;$jdIsU z+USv35XNViOcGem$=MkZ-VhE4HF5??VTW6IyYtoU7!3&x?_-FsZZ~0o$hqWK9g!exdNpH^X*NJc>%dt=F-rCud3TQo zQH-Oig4P;MKrsrSN)#W+BUgib?!U9OHo=4C{0Qn6Z^QWls1S%i^DPfgVJKHmhi!d38X8cM=$rk^+*#Y&q5SIJ*PcWc`{{1tP|Kx9Q bwk4j}Z%H3@+KoZ5)cJE4_40nQ`R%^|EC_%r literal 0 HcmV?d00001 diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/ringbuffer/ringbuffer.md b/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/ringbuffer/ringbuffer.md index f5d605e..dbfe1f1 100644 --- a/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/ringbuffer/ringbuffer.md +++ b/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/ringbuffer/ringbuffer.md @@ -1,39 +1,298 @@ # ringbuffer -ringbuffer(环形缓冲区)是一个非常实用的工具,RT-Thread 内部也提供了该工具,通过导入头文件 `#include ` 即可直接使用。 +ringbuffer(环形缓冲区)是一个非常实用的工具,我们可以将缓冲区看成一个环形的,可以不断地向里面填充数据而不用担心缓冲区溢出。ringbuffer 的读取以字节为单位。 -ringbuffer 的所有接口如下: +![](figures/ringbuffer.png) + +RT-Thread 内部也提供了该工具,通过导入头文件 `#include ` 即可直接使用。 + +## ringbuffer 结构体介绍 + +```C +struct rt_ringbuffer +{ + rt_uint8_t *buffer_ptr; + + rt_uint16_t read_mirror : 1; + rt_uint16_t read_index : 15; + rt_uint16_t write_mirror : 1; + rt_uint16_t write_index : 15; + + rt_int16_t buffer_size; +}; +``` + +`buffer_ptr` 是指向缓冲区的指针,`buffer_size` 是缓冲区的大小,`read_index` 是读索引,`write_index` 是写索引,而 `read_mirror` 和 `write_mirror` 可以理解为一种镜像值,每次向缓冲区写入数据,碰到缓冲区末尾时,切换到另一个镜像的缓冲区头部写入剩余数据。这种镜像操作可用于判断缓冲区内数据是满还是空。 + +当 `write_index == read_index` 且 `read_mirror == write_mirror` 时,缓冲区内数据为空。 + +![](figures/ringbuffer_empty.png) + +当 `write_index == read_index` 且 `read_mirror != write_mirror` 时,缓冲区内数据已满。 + +![](figures/ringbuffer_full.png) + +若是没有上述镜像值,我们就没有办法区分缓冲区空和缓冲区满这两种情况。 + +**注意:**RT-Thread 的 ringbuffer 组件并未提供线程阻塞的功能,因此 ringbuffer 本质上是一个全局共享的对象,多线程使用时注意使用互斥锁保护。 + +## ringbuffer 接口介绍 + +### 创建和销毁 ringbuffer + +当系统支持动态内存分配时,可以动态创建并销毁 ringbuffer 。创建 ringbuffer 使用下述接口: + +```C +struct rt_ringbuffer* rt_ringbuffer_create(rt_uint16_t length); +``` + +该接口会根据传入的 `length` 参数动态分配 length 个字节大小的缓冲区,创建 ringbuffer 结构体并返回。下表描述了该函数的输入参数与返回值: + +| 参数 | 描述 | +| :-------------------- | :------------- | +| length | 缓冲区字节大小 | +| **返回** | —— | +| RT_NULL | 创建失败 | +| ringbuffer 结构体指针 | 创建成功 | + +当不再需要使用 ringbuffer 时,可以使用下述接口销毁之前创建的 ringbuffer, + +```C +void rt_ringbuffer_destroy(struct rt_ringbuffer *rb); +``` + +该接口会释放掉之前创建 ringbuffer 结构体时动态分配的缓冲区,下表描述了该函数的输入参数与返回值: + +| 参数 | 描述 | +| -------- | --------------------- | +| rb | ringbuffer 结构体指针 | +| **返回** | —— | + +### 初始化和复位 ringbuffer + +若系统不支持动态内存分配,也可以使用下述静态接口来初始化 ringbuffer: ```C void rt_ringbuffer_init(struct rt_ringbuffer *rb, rt_uint8_t *pool, rt_int16_t size); +``` + +该接口需要我们自己创建一个静态缓冲区,并传入缓冲区指针 `pool` 和缓冲区大小 `size` ,而后初始化 `rb` 所指向的 ringbuffer 结构体。下表描述了该函数的输入参数与返回值: + +| 参数 | 描述 | +| -------- | ------------------------ | +| rb | ringbuffer 结构体指针 | +| pool | 缓冲区指针 | +| size | 缓冲区大小,以字节为单位 | +| **返回** | —— | + +若我们需要还原 ringbuffer 为初始状态,则可以调用下述接口: + +```C void rt_ringbuffer_reset(struct rt_ringbuffer *rb); -rt_size_t rt_ringbuffer_put(struct rt_ringbuffer *rb, const rt_uint8_t *ptr, rt_uint16_t length); -rt_size_t rt_ringbuffer_put_force(struct rt_ringbuffer *rb, const rt_uint8_t *ptr, rt_uint16_t length); +``` + +该接口清空了 ringbuffer 里的所有数据,将内部状态还原成了刚初始化的时候。下表描述了该函数的输入参数与返回值: + +| 参数 | 描述 | +| -------- | --------------------- | +| rb | ringbuffer 结构体指针 | +| **返回** | —— | + +### 向 ringbuffer 写入数据 + +向 ringbuffer 写入数据的接口有许多,如果我们只需要写入一个字节,则可以使用下述接口: + +```C rt_size_t rt_ringbuffer_putchar(struct rt_ringbuffer *rb, const rt_uint8_t ch); +``` + +该接口向 `rb` 指向的 ringbuffer 里写入一个字节 `ch`,并返回写入的字节数。若 ringbuffer 已满,则写入失败,并返回 0 。下表描述了该函数的输入参数与返回值: + +| 参数 | 描述 | +| -------- | --------------------- | +| rb | ringbuffer 结构体指针 | +| ch | 待写入的字节 | +| **返回** | —— | +| 1 | 成功写入 1 字节 | +| 0 | 写入失败 | + +若是希望 ringbuffer 满了之后也能够成功写入一个字节,则可以调用下述接口: + +```C rt_size_t rt_ringbuffer_putchar_force(struct rt_ringbuffer *rb, const rt_uint8_t ch); +``` + +该接口也是向 `rb` 指向的 ringbuffer 里写入一个字节 `ch`,并返回写入的字节数。不过当 ringbuffer 已满时,它也会执行写入操作,即用新的值覆盖掉旧的值。下表描述了该函数的输入参数与返回值: + +| 参数 | 描述 | +| -------- | --------------------- | +| rb | ringbuffer 结构体指针 | +| ch | 待写入的字节 | +| **返回** | —— | +| 1 | 成功写入 1 字节 | + +当然,也有支持写入数据块的接口: + +```C +rt_size_t rt_ringbuffer_put(struct rt_ringbuffer *rb, const rt_uint8_t *ptr, rt_uint16_t length); +``` + +该接口向 `rb` 指向的 ringbuffer 里写入数据块,数据块的起始地址为 `ptr`,数据块大小为 `length`,并返回写入的字节数。若写入时 ringbuffer 已满,则剩余的写入数据被抛弃,不再继续写入。下表描述了该函数的输入参数与返回值: + +| 参数 | 描述 | +| -------- | -------------------------- | +| rb | ringbuffer 结构体指针 | +| ptr | 数据块的起始地址 | +| length | 数据块的大小,以字节为单位 | +| **返回** | —— | +| N | 写入的字节数 | + +与写入一个字节类似,写入数据块也支持覆盖写入的接口: + +```C +rt_size_t rt_ringbuffer_put_force(struct rt_ringbuffer *rb, const rt_uint8_t *ptr, rt_uint16_t length); +``` + +该接口向 `rb` 指向的 ringbuffer 里写入数据块,数据块的起始地址为 `ptr`,数据块大小为 `length`,并返回写入的字节数。不过若写入时 ringbuffer 已满,该接口会继续写入剩余的数据,即用新的数据覆盖旧的数据。下表描述了该函数的输入参数与返回值: + +| 参数 | 描述 | +| -------- | -------------------------- | +| rb | ringbuffer 结构体指针 | +| ptr | 数据块的起始地址 | +| length | 数据块的大小,以字节为单位 | +| **返回** | —— | +| N | 写入的字节数 | + +### 从 ringbuffer 读取数据 + +从 ringbuffer 里读取数据的接口分为两类,一类是**读数据并取出数据**,另一类是**读数据但并不取出数据**(peak 操作)。 + +先介绍第一类接口,读数据并取出数据。 + +从 ringbuffer 里读出一个字节的接口如下: + +```C +rt_size_t rt_ringbuffer_getchar(struct rt_ringbuffer *rb, rt_uint8_t *ch); +``` + +该接口从 `rb` 指向的 ringbuffer 里读出一个字节,该字节通过 `ch` 返回,ch 是一个字节的缓冲区,供接口内部填充数据,该接口返回读取的字节数。下表描述了该函数的输入参数与返回值: + +| 参数 | 描述 | +| -------- | -------------------------------- | +| rb | ringbuffer 结构体指针 | +| ch | 字节数据指针,用于获取读取的字节 | +| **返回** | —— | +| 1 | 成功读取 1 个字节 | +| 0 | ringbuffer 为空 | + +若想要一次读出多个字节,则可以使用下述接口: + +```C rt_size_t rt_ringbuffer_get(struct rt_ringbuffer *rb, rt_uint8_t *ptr, rt_uint16_t length); +``` + +该接口从 `rb` 指向的 ringbuffer 里读出 `length` 个字节,并存入 `ptr` 所指向的缓冲区,若 ringbuffer 内存储的数据量小于 length,则实际读取的字节数为 ringbuffer 内的存储量。该接口返回实际读取的字节数。下表描述了该函数的输入参数与返回值: + +| 参数 | 描述 | +| -------- | ---------------------------- | +| rb | ringbuffer 结构体指针 | +| ptr | 读出数据缓冲区的起始地址 | +| length | 读出数据的大小,以字节为单位 | +| **返回** | —— | +| > 0 | 实际读出的字节数 | +| 0 | 缓冲区为空 | + +下面介绍第二类接口,读数据但不取出数据: + +```C rt_size_t rt_ringbuffer_peak(struct rt_ringbuffer *rb, rt_uint8_t **ptr); -rt_size_t rt_ringbuffer_getchar(struct rt_ringbuffer *rb, rt_uint8_t *ch); +``` + +该接口用于获取 `rb` 指向的 ringbuffer 内部缓冲区**第一个可读数据的地址**,并保存到 `*ptr`,该接口返回 ringbuffer 内存储的字节数。 + +**注意:**该接口建议只用来访问一个字节,否则极有可能造成数组越界,参考下图: + +![](figures/peak.png) + +此时 ringbuffer 内部存储了 3 个字节, `read_index` 索引到了内部数组的最后一个字节,此时调用 peak 接口,我们获取的就是内部数组的最后一个字节的地址 `p`,我们仅通过 `*p` 访问一个字节是没问题的,若访问第二个字节 `*(p+1)` 则就造成了数组越界。 + +下表描述了该函数的输入参数与返回值: + +| 参数 | 描述 | +| -------- | -------------------------------------------------------- | +| rb | ringbuffer 结构体指针 | +| ptr | 双重指针,用于获取 ringbuffer 内部第一个可读取数据的地址 | +| **返回** | —— | +| > 0 | ringbuffer 内存储的字节数 | +| 0 | 缓冲区为空 | + +### 获取 ringbuffer 内部状态 + +我们可以获取 ringbuffer 内存储的数据大小: + +```C rt_size_t rt_ringbuffer_data_len(struct rt_ringbuffer *rb); +``` -#ifdef RT_USING_HEAP -struct rt_ringbuffer* rt_ringbuffer_create(rt_uint16_t length); -void rt_ringbuffer_destroy(struct rt_ringbuffer *rb); -#endif +该接口用于获取 `rb` 指向的 ringbuffer 内存储的数据大小,下表描述了该函数的输入参数与返回值: + +| 参数 | 描述 | +| -------- | ------------------------- | +| rb | ringbuffer 结构体指针 | +| **返回** | —— | +| > 0 | ringbuffer 内存储的字节数 | +| 0 | ringbuffer 为空 | + +还可获取 ringbuffer 内部缓冲区大小: +```C rt_inline rt_uint16_t rt_ringbuffer_get_size(struct rt_ringbuffer *rb); ``` -ringbuffer 的创建有两种方式,第一种是由调用者自己申请一块内存,并传入 `rt_ringbuffer_init()` 函数初始化 ringbuffer 对象,不再需要使用 ringbuffer 时调用 `rt_ringbuffer_reset()` 重置 ringbuffer 对象。当系统支持动态分配内存时,可以使用另一种方式创建 ringbuffer,调用 `rt_ringbuffer_create()` 函数并传入希望分配的缓冲区字节大小,此时函数内部会 malloc 一块内存用于充当缓冲区,不再使用 ringbuffer 对象时通过 `rt_ringbuffer_destroy()` 释放缓冲区并销毁 ringbuffer 对象。 +该接口用于获取 `rb` 指向的 ringbuffer 内部缓冲区的大小,下表描述了该函数的输入参数与返回值: + +| 参数 | 描述 | +| -------- | ----------------------------------------- | +| rb | ringbuffer 结构体指针 | +| **返回** | —— | +| N | ringbuffer 内部缓冲区的大小,以字节为单位 | + +## 示例代码 -向 ringbuffer 写入一个字节可以调用 `rt_ringbuffer_putchar()` 函数,不过当 ringbuffer 内部缓冲区满时,写入操作会失败,而另一个接口 `rt_ringbuffer_putchar_force()` 在此情况下则会**强制**写入,用新的数据覆盖旧的数据。 +```C +#include +#include + +typedef struct rb_example { + int a; + int b; +} rb_example_t; + +int ringbuffer_example(void) +{ + rb_example_t data = { + .a = 1, + .b = 2, + }; + + struct rt_ringbuffer * rb = rt_ringbuffer_create(sizeof(rb_example_t) * 2); + RT_ASSERT(rb != RT_NULL); -还可以调用 `rt_ringbuffer_put()` 一次性写入一块数据,当写入数据量大于 ringbuffer 缓冲区剩余空间时,写入的数据会被**截断**,而另一个接口 `rt_ringbuffer_put_force()` 在此情况下则会执行**覆盖**写入,用新的数据覆盖旧的数据。 + rt_kprintf("Put data to ringbuffer, a: %d b: %d size: %d\n", data.a, data.b, sizeof(data)); + rt_ringbuffer_put(rb, (rt_uint8_t *)&data, sizeof(data)); -从 ringbuffer 读取数据有两类接口。一种是从 ringbuffer 里取出数据,例如 `rt_ringbuffer_getchar()` 从 ringbuffer 里取出一个字节,`rt_ringbuffer_get()` 从 ringbuffer 里取出一块数据。另一种是获取 ringbuffer 里缓冲区的指针,但不取出数据,例如 `rt_ringbuffer_peak()` 函数获取 ringbuffer 里的缓冲区指针,函数返回时 `*ptr` 指向缓冲区里的第一个数据。 -利用 `rt_ringbuffer_get_size()` 函数可获取 ringbuffer 里缓冲区的大小,用 `rt_ringbuffer_data_len()` 可获取 ringbuffer 里存储的数据字节大小。 + rb_example_t recv_data; + rt_size_t recv = rt_ringbuffer_get(rb, (rt_uint8_t *)&recv_data, sizeof(recv_data)); + RT_ASSERT(recv == sizeof(recv_data)); + rt_kprintf("Get data from ringbuffer, a: %d b: %d size: %d\n", recv_data.a, recv_data.b, sizeof(recv_data)); + + return 0; +} + +MSH_CMD_EXPORT(ringbuffer_example, ringbuffer example); +``` ---- +运行效果如下: -ringbuffer 的使用十分简单,一般都是利用 **init** 接口初始化 ringbuffer,然后利用 **put** 接口向 ringbuffer 写入数据,然后另一端通过 **get** 接口从 ringbuffer 里取出数据。不过需要注意的是,RT-Thread 的 ringbuffer 组件并未提供线程阻塞的功能,因此 ringbuffer 本质上是一个全局共享的对象,多线程使用时注意使用互斥锁保护。 \ No newline at end of file +![](figures/example.png) \ No newline at end of file -- Gitee From 7b1a6b91a54fe3a67dd83be6a5f1dbf7793eae8d Mon Sep 17 00:00:00 2001 From: Jackistang Date: Tue, 17 Aug 2021 09:35:54 +0800 Subject: [PATCH 3/4] update workqueue.md --- .../workqueue/figures/workqueue_example.png | Bin 0 -> 4631 bytes .../device-ipc/workqueue/workqueue.md | 280 ++++++++++++++++-- 2 files changed, 255 insertions(+), 25 deletions(-) create mode 100644 rt-thread-version/rt-thread-standard/programming-manual/device-ipc/workqueue/figures/workqueue_example.png diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/workqueue/figures/workqueue_example.png b/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/workqueue/figures/workqueue_example.png new file mode 100644 index 0000000000000000000000000000000000000000..42aa20943b10e863c3d13836371e02d46ba29204 GIT binary patch literal 4631 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 dzmHVW!7qbeUK{J(%whU4x@mr+Lf` 即可使用,其所有接口如下: +RT-Thread 内有 workqueue 组件,导入头文件 `#include ` 即可使用。 + +使用注意事项: + +- 工作项里最好不要有会导致线程阻塞的代码,否则会影响后续工作项的执行。 + +## workquque 结构体介绍 ```C -struct rt_workqueue *rt_workqueue_create(const char *name, rt_uint16_t stack_size, rt_uint8_t priority); -rt_err_t rt_workqueue_destroy(struct rt_workqueue *queue); -rt_err_t rt_workqueue_dowork(struct rt_workqueue *queue, struct rt_work *work); -rt_err_t rt_workqueue_submit_work(struct rt_workqueue *queue, struct rt_work *work, rt_tick_t time); -rt_err_t rt_workqueue_cancel_work(struct rt_workqueue *queue, struct rt_work *work); -rt_err_t rt_workqueue_cancel_work_sync(struct rt_workqueue *queue, struct rt_work *work); -rt_err_t rt_workqueue_cancel_all_work(struct rt_workqueue *queue); -rt_err_t rt_workqueue_critical_work(struct rt_workqueue *queue, struct rt_work *work); +struct rt_workqueue +{ + rt_list_t work_list; + rt_list_t delayed_list; + struct rt_work *work_current; /* current work */ -#ifdef RT_USING_SYSTEM_WORKQUEUE -rt_err_t rt_work_submit(struct rt_work *work, rt_tick_t time); -rt_err_t rt_work_cancel(struct rt_work *work); -#endif /* RT_USING_SYSTEM_WORKQUEUE */ + struct rt_semaphore sem; + rt_thread_t work_thread; +}; +``` + +`work_list` 就是工作队列里的工作链表,`work_thread` 即工作队列里的线程。再来看看工作项结构体: + +```C +struct rt_work +{ + rt_list_t list; + + void (*work_func)(struct rt_work *work, void *work_data); + void *work_data; + rt_uint16_t flags; + rt_uint16_t type; + struct rt_timer timer; + struct rt_workqueue *workqueue; +}; +``` + +`list` 用于将该工作项挂载到工作链表上去,而 `work_func` 就是该工作项绑定的函数指针,`work_data` 是用户自定义数据,当工作项被执行时就会调用该函数。 +## workqueue 接口介绍 + +### 初始化工作项 + +每一个工作项在被提交到工作队列之前,都需要调用下述接口初始化: + +```C rt_inline void rt_work_init(struct rt_work *work, void (*work_func)(struct rt_work *work, void *work_data), void *work_data); ``` -每一个工作项都需要通过 `rt_work_init()` 接口绑定一个函数,执行工作项即执行其绑定的函数,并且该接口还支持用户自定义数据 `void *work_data`,若使用自定义数据,需要保证该数据对象为静态存储的。 +该接口初始化 `work` 指针指向的工作项,并绑定回调函数 `work_func` 以及用户自定义数据 `work_data`。若使用自定义数据,需要保证该数据对象为静态存储的。下表描述了该函数的输入参数与返回值: + +| 参数 | 描述 | +| --------- | ------------------------------ | +| work | 工作项结构体指针 | +| work_func | 回调函数,工作项执行时会调用它 | +| work_data | 用户自定义数据,回调函数参数 | +| **返回** | —— | + +### 使用系统工作队列 RT-Thread 系统提供了一个**系统工作队列**,可以通过 @@ -45,23 +82,216 @@ RT-Thread Components ![](figures/system workqueue.png) -开启系统工作队列后,我们就可以通过 `rt_work_submit()` 函数向系统工作队列提交一个工作项,用 `rt_work_cancel()` 从系统工作队列里取消一个工作项。使用系统工作队列的好处是 RT-Thread 内部帮我们创建了一个工作队列,我们只需要提交工作项即可,使用简洁方便。 +使用系统工作队列的好处是 RT-Thread 内部帮我们创建了一个工作队列,我们只需要提交工作项即可,使用简洁方便。 + +开启系统工作队列后,我们就可以通过下述接口向系统工作队列提交一个工作项: -若不使用系统工作队列,我们也可以使用 `rt_workqueue_create()` 函数创建自己的工作队列,当不再需要时调用 `rt_workqueue_destroy()` 函数销毁工作队列。 +```C +rt_err_t rt_work_submit(struct rt_work *work, rt_tick_t time); +``` -向自己的工作队列提交工作项有三个接口,根据是否允许工作项延时提交可分为: +该函数向系统工作队列里提交 `work` 指针指向的工作项,若 `time` 大于 0,则提交过程会延时 `time` 个 ticks 。下表描述了该函数的输入参数与返回值: -- 允许工作项延时提交:`rt_workqueue_submit_work()` -- 不允许工作项延时提交:`rt_workqueue_dowork()`, `rt_workqueue_critical_work()` +| 参数 | 描述 | +| --------- | --------------------------------------------------- | +| work | 工作项结构体指针 | +| time | 提交延时,以 tick 为单位,需小于 `RT_TICK_MAX / 2` | +| **返回** | —— | +| RT_EOK | 提交成功 | +| -RT_EBUSY | 该工作项正在执行 | +| -RT_ERROR | `time` 参数错误 | -`rt_workqueue_submit_work()` 函数用于向工作队列提交工作项,该接口允许延时提交,函数参数 `time` 代表该工作项延时 time ticks 后才提交到工作队列的工作链表里等待执行。若 `time = 0`,则工作项立即挂载到工作链表的尾部。 +若我们想取消之前提交过的工作项,则可以调用下述接口: -`rt_workqueue_dowork()` 和 `rt_workqueue_critical_work()` 这两个接口不允许延时提交,工作项会被直接挂载到工作链表里等待执行,两者的区别是 dowork 接口将工作项挂载到工作链表的尾部,而 critical_work 接口将工作项挂载到工作链表的头部,因此 critical_work 接口提交的工作项在当前工作项执行完毕后会被立即执行,适用于一些比较紧急的任务。 +```C +rt_err_t rt_work_cancel(struct rt_work *work); +``` -当然,提交到工作队列的工作项也可以被取消,调用 `rt_workqueue_cancel_work()` 函数尝试取消某一个工作项的执行,若是该工作项正在执行,该函数返回 -RT_EBUSY 表示取消失败。`rt_workqueue_cancel_work_sync()` 函数也是用于取消一个工作项的执行,不过当该工作项正在执行时,该函数会阻塞,直到该工作项执行完毕。调用 `rt_workqueue_cancel_all_work()` 函数可以取消工作队列里的**所有**工作项。 +该接口会在系统工作队列里移除 `work` 指向的工作项。 下表描述了该函数的输入参数与返回值: ---- +| 参数 | 描述 | +| --------- | ---------------- | +| work | 工作项结构体指针 | +| **返回** | —— | +| RT_EOK | 取消成功 | +| -RT_EBUSY | 该工作项正在执行 | -使用注意事项: +### 创建销毁工作队列 + +除了使用系统工作队列,我们也可以创建属于自己的工作队列,这样更加灵活。创建工作队列使用下述接口: + +```C +struct rt_workqueue *rt_workqueue_create(const char *name, rt_uint16_t stack_size, rt_uint8_t priority); +``` + +该函数创建并初始化一个工作队列,利用参数 `name`,`stack_size` 和 `priority` 创建工作队列内部线程,最终返回创建的工作队列。下表描述了该函数的输入参数与返回值: + +| 参数 | 描述 | +| ----------------------- | ---------- | +| name | 线程名字 | +| stack_size | 线程栈大小 | +| priority | 线程优先级 | +| **返回** | —— | +| RT_NULL | 创建失败 | +| rt_workqueue 结构体指针 | 创建成功 | + +若不再使用工作队列,也可以销毁它: + +```C +rt_err_t rt_workqueue_destroy(struct rt_workqueue *queue); +``` + +该函数还原了内部所有状态,删除了内部线程,并释放了 `queue` 所指向的结构体空间,因此调用该函数后,不能再使用 `queue` ,下表描述了该函数的输入参数与返回值: + +| 参数 | 描述 | +| -------- | ------------------ | +| queue | 工作队列结构体指针 | +| **返回** | —— | +| RT_EOK | 销毁成功 | + +### 提交工作项 + +向自己创建的工作队列提交工作项有三个接口,根据是否允许工作项延时提交可分为: + +1. 允许工作项延时提交 +2. 不允许工作项延时提交 + +**允许**工作项延时提交的接口如下: + +```C +rt_err_t rt_workqueue_submit_work(struct rt_workqueue *queue, struct rt_work *work, rt_tick_t time); +``` + +该接口将 `work` 指向的工作项提交到 `queue` 指向的工作队列中,若 `time` 大于 0,则该提交延时 `time` 个 tick 之后执行。下表描述了该函数的输入参数与返回值: + +| 参数 | 描述 | +| --------- | --------------------------------------------------- | +| queue | 工作队列结构体指针 | +| work | 工作项结构体指针 | +| time | 提交延时,以 tick 为单位,需小于 `RT_TICK_MAX / 2` | +| **返回** | —— | +| RT_EOK | 提交成功 | +| -RT_EBUSY | 该工作项正在执行 | +| -RT_ERROR | `time` 参数错误 | + +**不允许**工作项延时提交的接口如下: + +```C +rt_err_t rt_workqueue_dowork(struct rt_workqueue *queue, struct rt_work *work); +``` + +该接口立即将 `work` 指向的工作项提交到 `queue` 指向的工作队列**尾部**,下表描述了该函数的输入参数与返回值: + +| 参数 | 描述 | +| --------- | ------------------ | +| queue | 工作队列结构体指针 | +| work | 工作项结构体指针 | +| **返回** | —— | +| RT_EOK | 提交成功 | +| -RT_EBUSY | 该工作项正在执行 | + +还有另一个类似接口: + +```C +rt_err_t rt_workqueue_critical_work(struct rt_workqueue *queue, struct rt_work *work); +``` + +该接口立即将 `work` 指向的工作项提交到 `queue` 指向的工作队列**头部**,因此该接口提交的工作项在当前工作项执行完毕后会被立即执行,适用于一些比较紧急(critical)的任务。而通过 dowork 提交的工作项会挂载到工作队列尾部,适用于不那么紧急的任务。下表描述了该函数的输入参数与返回值: + +| 参数 | 描述 | +| --------- | ------------------ | +| queue | 工作队列结构体指针 | +| work | 工作项结构体指针 | +| **返回** | —— | +| RT_EOK | 提交成功 | +| -RT_EBUSY | 该工作项正在执行 | + +### 取消工作项 + +想要取消指定工作项可以调用下述接口: + +```C +rt_err_t rt_workqueue_cancel_work(struct rt_workqueue *queue, struct rt_work *work); +``` + +该接口会从 `queue` 指向的工作队列中将 `work` 指向的工作项移除,这样该工作项就不会被执行了。当该工作项正在执行时,返回 -RT_EBUSY 的错误。下表描述了该函数的输入参数与返回值: + +| 参数 | 描述 | +| --------- | ------------------ | +| queue | 工作队列结构体指针 | +| work | 工作项结构体指针 | +| **返回** | —— | +| RT_EOK | 提交成功 | +| -RT_EBUSY | 该工作项正在执行 | + +还有一类 sync 接口不会返回错误,而是等待该工作项执行完毕: + +```C +rt_err_t rt_workqueue_cancel_work_sync(struct rt_workqueue *queue, struct rt_work *work); +``` + +该接口会从 `queue` 指向的工作队列中将 `work` 指向的工作项移除,这样该工作项就不会被执行了。不过当该工作项正在执行时,该接口内部会**阻塞**等待该工作项执行完毕,是一个同步接口。下表描述了该函数的输入参数与返回值: + +| 参数 | 描述 | +| -------- | ------------------ | +| queue | 工作队列结构体指针 | +| work | 工作项结构体指针 | +| **返回** | —— | +| RT_EOK | 提交成功 | + +我们还可以一次性取消所有的工作项: + +```C +rt_err_t rt_workqueue_cancel_all_work(struct rt_workqueue *queue); +``` + +该接口取消 `queue` 指向的工作队列里的所有工作项。下表描述了该函数的输入参数与返回值: + +| 参数 | 描述 | +| -------- | ------------------ | +| queue | 工作队列结构体指针 | +| work | 工作项结构体指针 | +| **返回** | —— | +| RT_EOK | 提交成功 | + +## 示例代码 + +```C +#include +#include + + +struct rt_work work1; +int work1_data = 1; + +struct rt_work work2; +int work2_data = 2; + +void work_func(struct rt_work *work, void *work_data) +{ + int data = *(int *)work_data; + rt_kprintf("recv work data: %d\n", data); +} + +int workqueue_example(void) +{ + printf("hello rt-thread!\n"); + + struct rt_workqueue *wq = rt_workqueue_create("my_wq", 2048, 20); + RT_ASSERT(wq); + + rt_work_init(&work1, work_func, &work1_data); + rt_work_init(&work2, work_func, &work2_data); + + rt_workqueue_submit_work(wq, &work1, 2); + rt_workqueue_submit_work(wq, &work2, 0); + + return 0; +} + +MSH_CMD_EXPORT(workqueue_example, workqueue example); +``` + +运行效果如下,与工作项绑定的任务被异步执行了,而且工作项 1 延迟了 2 个 tick 才执行: -- 工作项里最好不要有会导致线程阻塞的代码,否则会影响后续工作项的执行。 \ No newline at end of file +![](figures/workqueue_example.png) \ No newline at end of file -- Gitee From 414c82f7797ebea2c942e217e6ba75a5a494fa44 Mon Sep 17 00:00:00 2001 From: Jackistang Date: Tue, 17 Aug 2021 20:39:27 +0800 Subject: [PATCH 4/4] update workqueue.md --- ...tem workqueue.png => system_workqueue.png} | Bin .../device-ipc/workqueue/workqueue.md | 28 ++++++++++-------- 2 files changed, 15 insertions(+), 13 deletions(-) rename rt-thread-version/rt-thread-standard/programming-manual/device-ipc/workqueue/figures/{system workqueue.png => system_workqueue.png} (100%) diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/workqueue/figures/system workqueue.png b/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/workqueue/figures/system_workqueue.png similarity index 100% rename from rt-thread-version/rt-thread-standard/programming-manual/device-ipc/workqueue/figures/system workqueue.png rename to rt-thread-version/rt-thread-standard/programming-manual/device-ipc/workqueue/figures/system_workqueue.png diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/workqueue/workqueue.md b/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/workqueue/workqueue.md index d827c75..3469894 100644 --- a/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/workqueue/workqueue.md +++ b/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/workqueue/workqueue.md @@ -16,6 +16,21 @@ RT-Thread 内有 workqueue 组件,导入头文件 `#include ` - 工作项里最好不要有会导致线程阻塞的代码,否则会影响后续工作项的执行。 +RT-Thread 系统提供了一个**系统工作队列**,可以通过 env 开启 + +``` +RT-Thread Components + -> Device Drivers + -> Using device drivers IPC + -> Using system default workqueue +``` + +我们还可以配置系统工作队列内线程栈的大小,线程的优先级,图示如下: + +![](figures/system_workqueue.png) + +使用系统工作队列的好处是 RT-Thread 内部帮我们创建了一个工作队列,我们只需要提交工作项即可,使用简洁方便。 + ## workquque 结构体介绍 ```C @@ -69,20 +84,7 @@ rt_inline void rt_work_init(struct rt_work *work, void (*work_func)(struct rt_wo ### 使用系统工作队列 -RT-Thread 系统提供了一个**系统工作队列**,可以通过 -``` -RT-Thread Components - -> Device Drivers - -> Using device drivers IPC - -> Using system default workqueue -``` - -开启系统工作队列,还可以配置系统工作队列内线程栈的大小,线程的优先级,图示如下: - -![](figures/system workqueue.png) - -使用系统工作队列的好处是 RT-Thread 内部帮我们创建了一个工作队列,我们只需要提交工作项即可,使用简洁方便。 开启系统工作队列后,我们就可以通过下述接口向系统工作队列提交一个工作项: -- Gitee