[PATCH 1/2] tevent: Add tevent tutorial files.

Andreas Schneider asn at samba.org
Wed Jun 12 06:31:20 MDT 2013


From: David Koňař <konar.david at gmail.com>

Reviewed-by: Andreas Schneider <asn at samba.org>
---
 lib/tevent/doc/img/tevent_context_stucture.png | Bin 0 -> 21888 bytes
 lib/tevent/doc/img/tevent_subrequest.png       | Bin 0 -> 22453 bytes
 lib/tevent/doc/tevent_context.dox              |  75 ++++++
 lib/tevent/doc/tevent_data.dox                 | 133 ++++++++++
 lib/tevent/doc/tevent_events.dox               | 341 +++++++++++++++++++++++++
 lib/tevent/doc/tevent_queue.dox                | 274 ++++++++++++++++++++
 lib/tevent/doc/tevent_request.dox              | 191 ++++++++++++++
 lib/tevent/doc/tevent_tutorial.dox             |  20 ++
 8 files changed, 1034 insertions(+)
 create mode 100644 lib/tevent/doc/img/tevent_context_stucture.png
 create mode 100644 lib/tevent/doc/img/tevent_subrequest.png
 create mode 100644 lib/tevent/doc/tevent_context.dox
 create mode 100644 lib/tevent/doc/tevent_data.dox
 create mode 100644 lib/tevent/doc/tevent_events.dox
 create mode 100644 lib/tevent/doc/tevent_queue.dox
 create mode 100644 lib/tevent/doc/tevent_request.dox
 create mode 100644 lib/tevent/doc/tevent_tutorial.dox

diff --git a/lib/tevent/doc/img/tevent_context_stucture.png b/lib/tevent/doc/img/tevent_context_stucture.png
new file mode 100644
index 0000000000000000000000000000000000000000..fba8161572d5af6b18e266e88cc2eb20ac76c495
GIT binary patch
literal 21888
zcmZs at byQVt*F9{296=hS8$miG57G_NAT5Ft(hVXd-6bL2(jn5_B7)MT5)zV%gaQ)3
zb-eHAd7p2L&p*y^z-FIoU$NF)bI!HH)m7!OG08D6UAly=s34<x>CzRBOP4M`KwN>J
z^iMWUU%I3tuP7s_?K!v8=3%5Q|LH>Q2UUS021Skxd(Nmx1Ug@`A$C1!;I-)2Uzqw6
zUYV7T-X$lD4(F-YqaPJ<zxA4em_Gnp7XGQzMwm%6c6?m+e$(Mo-^9+o&6)k1rgcVZ
zE#r>M at L{UWhYYg(j_Y(mahpA1`Vt7bAf(KHKGZ|ue}6yX$aAD|X~bF`m%2Y>is)7t
z at H@=6mS`0*wLP4xeX`*5`^zhpbkz)@`0VV9(_@!pLe$@}hL)F?7b>T;pZ)rDetv%Q
z=FL~HUNLEsc1U<(;W)axf1i21T&$7rd$LjVslh=j8TGZ=Vp(^e);#<DeW at pOx=a^$
zj^UtxU;uH25FdZE-tJSo&z~47kza2<ilrX}gcCC3P~UBI`SxLHY02H)z5l|W(9YJj
z*>z*@aN2}Hm6eU{(J{Uh!cBoVH8u5)#Sr4g4Zb^f2<HO1trk0<zfa*3_c?KOa&mg|
zWW$AJ at BwWbItFdf$?>;r at ssuZfdK^@8=G)iw;%IozZd*M2VN7wEFl at +kLJt&`TgU^
z$_m=B|0!+F at zHYZ$1Kr52OC<sf~!g@^s0gm^G4MVB|~wj;Q51S>uhIvg at upL&;Hzq
zMLpudg&FPbxOFw at iM@Ubhk}BFyIu#yHS=2t6{O$!U3x|?F0P;CC9;t>!=h=O*)^mP
zB~3_eZEe1%dn*QY){>;`931k|<Vi_MhugDvIAmGX8G<Aiy!WGHV{t33OiknC;{4g1
zX|K`+O~_Coy$-CF`=f{9-_Q^NAt9Gh<0bUc01W?uFKy2})`n8;?d{bWPL12V_`A7o
za=_mZQL%DxWD3}kchf$4w9KTEwmnz3^>g{H&MB#S{{FX*zc(k}&&`or^F8eJ|NPmg
zorgXMuV<RB at tKg1p`oF&^80r$n00?RZhrfi&1KU5`Qyir6BD&h_t!#kX*gL}OvwnP
z!n!uq4Gat(KQ4e(>FBudyZB>bypA1+nI-J9W^!?o5*!>{R<^~}ajJRPMFtzQbR?IM
zSv4pq=;h0owf0|-3=H|Twb~w8n_Ynz(jhk_6D{oQ+T3>x+Bsn?(&M?}=SK{;Zx77O
zG+KVlg2kBV66E=qEq<}`LXDD=l2%qZh12I~mkui(PwIwDDBg8+3=HX at 5FDz~_dS<s
zW%t*HUEJL*wBZzl<V!z!@`R3#PAX_`f8Xu&XHGl;i$RC4=mIgmRG9A;US9UvaC&-b
z>V~aHh7=0{m1|{X<)2?W%Lt?tVpJD3lRkfT8emTvG}vcmW>(0Xe7oy+e)`2 at p{}mZ
zZmN7XiB0#&7 at sa^y%0wwTkOlbckdP!E+$H}yaYWy1Y+QtJ$l5!!2x%C_U!}J&AV`2
zDh`#X7ZK)TbMvH(jPfD}{SR59h7I<{T3X|9FXy2vaLo%GVq#)A`Y^pJX?z>szqFkE
zsTDsvc#)o-URG8n7UCL&r|IH$n}y}w=;&+37fjQY#^YNlY>mghXD9lGh8=KTo5g2h
z at uZ5SFO)4TUg at d3!K_ at XKH3PzA_)i#<X~s7xBoJD7=fUZ!F5%LihuSk)8ht{|4Y$l
z^)Fs%Mc(A7H0k*8+9e1tZyf1*us%9hXJcq!KrQSnQ)CfWhWP#c3l<jE9UdP2dRww@
zf9QhnGN*E3F&Rk7g`FRpn&#4p{>qb$G%_;E%g=XlcD6!;JLMx8=Woo;&AlotB%4{U
z`TF&1SQr8xo5QevmjgA0#W=&Mcizs<3X6%&(~6&FKpe@>XSmWH5O8JgGW<RRNA&4l
zfzxt76B84Kpgo_zsq>yuqaz(H?Iq11KOuwXcv7yap})3gmseMbsi}RJ`>~~cj^^8*
z8S3kEJZNofY<&3&;$w56^rN>ibqx&{yFIuUCtF-_kweGXR9|1AR*~w{r%(CNVevVr
ztS3v8Qd4K)v9d*<Srp^?!7?r`KJ at VT4T0y4O$>aSLMZQ at J3c->XJ=<`-n_y7bG-cZ
zD?2;8 at 7bYlpf`pbg6^bLnoYOT)y3u6Rz<@NUxIqFI~GF1!afJ1@?N5TY;-}SX*ki8
z!ebvkeBY|- at ZDW}ZYq8O>n$oO`pC at 8*~R4vHq0Cwa-v-Sj+U0zk=2=jtO&%H+qZAC
zu_>Qv*?(zX{qf_+;-cf~Ah7|2jP)QKQST#eZtjuU+2gT7<&(o-uqO`dtS6hjkDZ%7
zSkKk6$oxLo7&nR!g9nfb?WGM4!KT=pPLU3??bQ}toy>)=hqbm}XwM`(#ghtCU5`5o
zIGofqNlLv+bi!voNED<*!fEtU%%{1bp&>T*V;a8=?WG?b7h+fN#l<^TRvy1g_;e)B
z%R4qd-){G*9u6QxS2hPs)|mzelY94W5QP4syz5yFaTCsQ93cY(gF-xPYzP_~;_R?Y
z?mKf|{f-~B;4{e0%*}D?*95sZK+sWLAAyMS_51gj+e^Q8K8<}!7qGLou(&4Q at v!U4
z_FTPPdQlN`(BsXC5<G&i%dUkF+PtQ#Ox|`OxM(dX1Z;&ozEe)f+H&b)vL5Y!6mN0c
zs<)ZuygfCPdM7_G&v6hUV_;xl{83*diL$bCWMpJtQKN~^A#p*ad at MB!3(L&yg>fO@
zQ%_2PNBvQGdGzFHbV1r3ICNf)PEJpMfAKJ9x+E(>NJNAt at 3%2l*kMxsn&Y(nK+VO)
z1>Z4jwL#_HJ-h(Yw#B{G_p3^h=nn12OlbF_*!9}H-1PKj>TITWI}}vLxG>D6;)3)r
z=91&%bGHval9+fet*iw35BXch&<5f8jM1UtefaPpUp_Y3#6_WhwCqT~!`J80qeu8@
zh{5y#OmaRe|K2`Rb*}Kvf$Xfbv<T8N{Wlg6LA8_TPLKEd_B8<z$TYYr%yX4h(YtL<
zbX|yed{2COY{G&JI=Y5TOh}-=Q*LyA04W*$+O at BX#BBF(Kietz`V=zfdKr$}&fMhK
z7%!YZ5fKq)=AtL#uP|Fa at QvqEi+a&IokEgo^F8y@)=up1#Sc2%`Q$NMV;+|`GBQ%8
zTg6HlqDlqv{mU2~57uF|Y0u-6RoH46p*Zq>dn at lC-LU<6`nC5uqO(7m;>(vW_+c;8
z(xmR39BjZ~GMx)^zP=K)n_F30dfp4)<CN4e at 1<NmF<q>|KuAc4X4>X;C`I4)?Dsq%
zjODknA2WoPmzT$1KY9zB>|MvLv^$nK3%C&UaW>*exiEA&?>ta-t-E}5QeMtJDUSb?
z-ME>Lk+FAft{J|KjEpQU`R_NzA0^yUzH;RX-~c at 0OmV*l>r;?0Ui0ws^78ZRxW1)h
z36iHbr;FHQacQN5DN4o(XPG`ftn&NP?56DXtb~Z`jAcUVG%<*FRYkIn=p7^HY#2vE
z+h)OCs}WiXigY+OS$~HGr|hL#*W0&m7fF2ZT(@UNySuNvCQ9*zRnHvB&CAQ{?3B23
z=MF+sMURS;k8fgTMz1wLPZCc`;c#nY;o{y|6U4O5G-rtHLvq(w(^UTy8nw6&fBYD`
zZwH6Req*HNM?1hF!|1B-%1K&HBua{kKMxLUKh;+Zz2}xf&`p*|-?9AQ>g-G|<e1Y{
z^%iL}#eVmRlvF^MI14=33!HE|m&=zgUlZ5Pg&6`U$Zxu;4{?&2ij|WS=WjBY?eM#J
zWBKvM;S%h6I82cF#>d8l6i{(lA++<)j}8Y*%in-6-}+mU>9u;kE-SM!GNMEa|2HZ_
z^8Eh&do(%!Se1_cd)aI;ADH%6YS|xBiD1`$b6p1%bGS7v$is6C at DO|N>c^p>A($7y
zEHI?WppOM`*+*AI6ouf2`S}O;G^{<<vJw+l*4K|twyM6Zu8!is1tf0k+p}-rQ2=mm
zY;0WnMScNLwW at UwGp{Y0LeLpW15c$vb>;f?>jDA-A%X^yQR-n45t^@6Aza68PUkYn
z$9O(N<&-v86<X1};$j6fY1m||l%M{lOYQsje at z)WKpMs+<1NU^>EzCO`u%eg99u+4
z&6_vEQmE-L2<?PS3>#}`c(}p-i-GZY)_r<N_oySe?3jxIL%^lF@`72--PP50syy{F
z8s61wHzYhmJFW>M;sEw&g`&<5KBS*?UUSUz>4hTWHx?=t26Y*knb;0!w2)b9aGv*s
z;{G`~p--5peexp9-O~K=<Dk&c^p`K$P1-Yh2>;Gjae28d#LSqOnCH)*!y%k*d3dFJ
zyhMu`3oG*I=m>EAo5kyYr!_G#@dhb(XMaCb3IbjY)}I0TZ*Om>@jY=q-ZPJhX9&V;
zo1lw(@#3nky at f?cu~h8*K0^Xze`k01`8Srh6N!bYe>39ZNAZgrn3%jgJWqeL{l>(?
za=W-r!mhWtxoQ36NfV?rh`6r@;7dE)V07&K{QTV9>I$PfpBmhn(v|6 at 00|MkWrEa1
zw;mUlcNGH%4Gm2q;_LFV!<Xj5bWOe|V~otq%wZz{`b~_ChPs)8 at UD*1r4|>%xKp at H
zrb_T#5k7KJq^1rI9~B at A!ej;!ok7)rkB at I*VS!fwS!-j!Ll(jSd}rttVG)sw)BTU$
z%qT=zA}tjGk92alWeIWD&Mq at CQG4eNN4fqRIhiMb)`UHGb1vTtlSj}^<ff==YVyKp
z<mKf7ibLS|@uj7~pw$n)<l_9y&dx46Dhh at T&_UP*7oa<Wis1PuY(@%x>&I}7sVR^5
z(Jp`u-B~YGC1~RPGq|Bau$$J>@*4^(Y6DiBV5cI`bOk)7CVn>2*N5))(9Z5`DU at cu
z^{G~w<U7~^9T(?+0Jgj#X+4}WOyM-<eR+8Dw@|asLBe|f7%#$g1*km(+1d{-{r#ir
zAgg(3=$=(pM~C>z+kt`GtgO}mFk at -NEy4+;6r!i-!pW(`ypN&<=kcr=<*@Ii at m(i?
zQszxWK}LFd3sjhmjY1e07>roxQiE*w%O!62>o5OPH(k}idp-Is+wc3gZ<f~9n3CNK
zIXOAKy}deR_cKL2REJCED~(&~eg3!)=()PqW at b{YU?}Pv7`ShYq4SJD)+?3>!jq!X
zyrmEq0lU#-!AB5cHjGt9p>uecgO|4k>IFEr5dX7z&6UQm#Ew^9&`F25?#%Ji(|3=K
z;uj%y at b_SM7ai|^gMg5foUHl$?_|X6A_ku$HXugPa6j~qjg3VlXg_-Vcx7>M1crnP
z5PGk_LSh0alMko};Z{t*w*eI)q^3_$)<Rl`ucjg)v9z<JA|~c{`q~TipWWw19)5me
zCpAUIcl#vjzNl|1Al4 at s$`)UkoqY<p8XX-yA)1{|3XzMWgO7q6uIu6##~)4n&iVoX
zRd3?C!Tv=2`|*EuJyHghNu~bz$ismWIrpCrjsF(>>Y>HbaLK<P6Yv#u|9))Z{k`-5
z&+Ws^VyH!t&wgz)YSwLkZrX=JnLTB5(0UWkM at z+n2Z?U|9Lf)#5`zbu?s}XC!~gk3
z^Zlt}bPWv+)V$xTRkO7%hw2E4>~$V}a9=BQJ>9xFa<r=kFoLV3q$Js>7+@{kw>#BF
zwP}+RbSJOUzMHvLm+ND>a`fo`dso8!=->Aka&a_5^~Q$C)+pYm!6Tbt7dV);|IE^f
zOHCDiGFIU4?+>`5)a4Y`1xl!$^>tEG(#D5f0kDbL?iHzKB41s^B_$OWrt7*BUmc+{
zW+TC_fg3Fp{C3L;;0!UZV1kIi4{4Q`7tryZGVVDL1#N9@(-nrgdU`^p-9fv%yW88g
z!5e587|R!tBwWeK$*&3uCMu07R;?^88_eG)Gpl9YW;Zv#@3b{lkqt~prpNrx-Q7m#
z)rf=2F%mR%^mm^-F0aQ`CPiM;SE0&t7&}DL3R79$Vq$7;Y^=4OWEB-Pt|<%PlrtGb
za&h5)EN%;1D!lvb*FCWpNtb!5U%!^T{`KM;mwIx{ZJVEd`ub$lcUf4ja}Zm-18h^E
zO!g7ZQiIKO<=a>qwpJ at R-w&Ry5(9!Y7i96N7#yQZj_h`3(fzv&u5CC9VX(DhV){4W
zl#FnMhv<y-tt;zSnRK+ at uQ1qLdGkwMj}!AcWOD(5`|bs<$h{}sTj9~Uxw(kM!X30v
zI!09Tr2-0e>v->FO`Ft1t>bVeGmzDGp9Iv at J_4qF)!0bN!F4JQ*g>%&t7~hd!mxp!
zp8lSS%3)!-4oyjOd0+p_m!yV<p8({quC0}pNOQHh7H;9a4 at PQ_yA{h#J_pp_dE&7>
z^AqTp6=?|x2|x(lUF3Pv#?7wyUsP_}3knMUyvZRfEd0L}224Qk-AMbBsS3lMyE5&<
zLP8JUm+F+kmSc3m%){WbExMOVKuYQfiMXHuMbOaD&`>g^-e7^_sfyuI=eQ(=iyNDg
zd<X$kT1qPF0qq&5ygqX9)Y!|*%hr}X%M19X<KyGz5@~jlO?8#&Tyh- at gL>O178dSH
z-N7|AH4sXdFWn6|Xjxa9$Q>IS11jX`<V5NiI2(xXw~X=9c1k_<BjuBQEl~k3 at jX;s
z>T<rmzK5HWJ;d?i02pmXaxObxBfF)#{iWqMU>#*8r4_X%0Mt;s_oX*M)LL6vf!~q5
z4Ko%xgOVJ;Q0Ri>SBSCxsU_oUajlgvK37DzCLW8}N{U=f4o8(p1{xaiIGeCu`l$7a
zz?m#Y`j;vH-dMWyIrkv)H4L`N<r{28#AL551}?Rcy1IJ2agrw1W9n*?4&SM%DFFL;
zZcZAnZ6IacE{A9uR+fL at clz@!aC|HxvU^giP-Z50Tv}UOqjzAw_tO8`ATW&C?Gk4m
z&v`w{=&6X$aV~O9gD#wU-Y0WN+sG*+iKwVVoxaKtzgczPoKT#l)L<tGUX`Naz5UP+
zm2l4h0+v=+SNBgnN4jk)ICNbGxVgC=he?ue%lcg|nw(BL>bz at kP|2BY*!^9;Esopa
z85JX?HM5K{Eze8X$aG9SoTuUzL!|g<WkRw{<{Q}n?E0lyKI>H0+>ej3_6wDtX?9~X
zGk-Y<!5z<DDMnl1fyq at WP0Mbhi~(njBBNsIYXcC|Wpm<QzP!EAUMcJ*LCM}f7d|pL
zIjM7!e+%0viuaMtOm%K;o}Ph$(&r3|79xX|8sUk_0}rW}!4dB%o1iL{v4D{ApwV%u
z*=;K#GEyfyFRvWJ1e??hW^!GGtM(re)3&eScSS|<(cXV9a($-!h{|h&u^R|Y>v~*0
z&Ivkc24Fh{SiQ&BNAqo*sYu1Vg<KB?;u-Mh!iqaO{2<T{g=OwFzl2$1iwean0ct_f
z+Xz7WicdL=s2>IC%fmXh=IYoAIRCe5gM3cdvU`V{yBbAP7X0jBL^m%gzHQTM87A`L
z#S0p7-y4&^_xE3L@*ci7kVSGGdUUVSsR7z6h-FX83pjJ;%9PRT%V=UJNp;S}AtS;I
znKtpGx<*b-9n-<zievk^arDa<pV2(oRjP)HxxU-29}^M?7{BlA*qNL2L+SH4>~ZgN
z7@>PZ^7KNuuXrt~*WqSx0s&coKtxFii&C{(wwTBF&+(K|6#lmPU36zpa=W!qh_^>#
zD)a7B0zvkDEpJjhGP0*oA4-SfENxU{88W&T;-Lk!x3>#9|CnzZNba~e?vyY^?xBZ9
zbBBCs at rZOmSIfE^9vdq^UuyqT;?LD9SK=O8TbD+OomFK12!+T8VdydK&`X}HJ2u*^
zo|;pakBHXq!y&3}0B8j0kT<35v(u+Iw9%2|X at X&Qoz|PS^Q~n4{@VeeKEJlfD(hS~
z#^U1edes2Ud>9yrb8mrUN(O+U;J1$Rv%R7)f6~r4bva(~K9(@Cw$@fWF#+2dy!)<;
zotHOKjaTATW%iJg`p7+=HcuUvd3~kdc2bW<;xtVy5?qM0DsNGlHQk2r6GylEmc|dj
z`OEZlX=aO$S;jqE{<K_NRUSX)N7ittkQs1n3fp+D31kQ03E$3OjMAzI!>m(3CrX{?
zIR3!-j)h)jgF-!|oBEFV#sHDg#)T}?Dp0{QO~`2-&t?JFu+_Y3I09ZDVbb#R^MQF5
zJ6gQD5)#p#My`p$xOge`TZJ(4adGj5uLi~R*JfM;Rv6X%9kX5p at B;6Mtjn(&xbaNT
zq2LST?Gtgp<1H;MpFVw}5ptAhl{clz!Py`;H8mAby8WZP1)H3&y0*5qzJ6-)^WJ>*
zD%K6#v;QRP0z)WcIiTR}?R^ZvJE800zxT$zt)nWNP?|<DMf)#mh_jznuX at l1H6sWJ
z^k?Qbw*2oK-*78t>hTpe9<bhwvrl>fyiP;I?~U=ILJT5qOY0cf*X1SB6LeFZ*2^pJ
zUVz2{hXgQ1^6@~nn?F*f81*}e9Ze&n(>a@})bw;*Dx|hAf$-GjO}xM0<Z9jfqo2z=
zJ3Bo+J$<@)L#gDI(g1`?Q|M at uf+Mbf(C5 at io}9?tv;^)jD=X`EZek+Q at v)*lM(vK7
zt9odZB5|H=fJ?G+k~zOyaoW4#VPczSYMDqKc0?~yy^m9_NL>I|aFlh>;(=w8whCnN
z(if0xE?>QtGfYiL$RLU#uqC0>Olo}Rx+X`pQ7KPZiS*<<pe#N=a0Duam}YRqv2N20
zs(UQA;<*9PVQ_Gus6B at Qfm+O4!H^L|o?>a8w*cIrm;vtK+6_|LHW>hje}68ishN<U
z|42bW!NP(`BnE{bH`SAB92UeJ92{I+_J`92%N~dT5eoB^tMm#&Hn2?~5fL)oTl6SF
z0n}1!pyjP?Y$&Lxe1MLfqe0!dG?CwCs<EX-1c^NV`Id(FeG?%H<01=;;n_B)s~pVC
z0+ at Y(3q4^*VMZWyGm45>XPaD#IQ`C)UgSJQ4Q}<?s2Y?#z%e{KSdULh(Vfq5a&uc{
z6x9ij`9!A at uqH{Bhm({JX?StN+s6k*LALd0o(K~HItLo>!+5?Okn?VS?%HW+!-23%
zS!qg2O4MnAkcPA>?t7~DCWGuRV!h0~F)9F%b=pUyKyl<Q>RFxDwY4Wob=dCQc at xhd
z57~*=(v`Apz%C8VB at 5Ymg%blf!q*KAeyd5kl at HoVXD6=n`OLwfgw?3bF53)10e$!G
zU0YjQcr-0d&F+lcd{gt>r+Ay{lTMK9cXu5L316h%vAju4%wq`wZhsTlI>XvT-%O<2
zy$d>Ee%}O^Nb^rI-sp$nlp9>c0^k7N%fQg^ZGZoKvs<JvLxw73+q!SA!1hCx$@!r5
zcH2uWIC5rYd6ALIW%nz_#>a29D4F095d~>+nzY}e;`Mx?pr}}4+#=xG_u+#*{P~!c
zh*DV$9(9`l?j~N@)WstR=pc|#Q&R(}%R1Fq_VB~X>S}IjVp*=P(?mz{Q2a-eoHhzV
zRrxs^e~3@(>sFq5Ap5}cT3A|^iODXwg)!xpd%qtXj59VXeWpDGq?MwelA|)<pceO?
z1nSY!qQ47w##N-2je|gNgT&D8{j_hoQ7it=)^t^sPFZr)w at HCbliCOewRs!huZG9R
z_tPEPSvWaEBD*f$SPVD&U9?}`!c&o|Q<RAA?FaS|D#Rzmz3!<L`A|?CBmunugzJaT
zpS?$NBmvaTy-$VmK~_cv2*>+{;~E!vI)2ag9z5y|!>_Ne7jfVAJUL)-#*Geyx_0B3
z{l>jeD}v3Sff-Ul!mB+JqQFKL!hLV3hl-sYXklQ4LMj8WTB14CsFi#N{`b1JRz_5^
z&)vnP#p{q&fQgw|UQTZA)29Z&%^VzdJ9Bl2D>79cfDHQ5Sv at U3)76(7)M1vgxC{cD
zHlmsVrR>9pivZIS5)xWlTfM!#9Z7NSdujv^P^JQ5JJ!pRZ~(d>H)x at 7E(<y=hRHwA
zLnRygt0p@;yD>vSX_l&6g;K=595Q89+b;uE)tJ_4tJ#{u)Ks#{fB=d2Bp8cbRYpyk
zO);-(Yh6EN2tyKev<nXppPijexL<G4Vnr}_=eou^@MW)Gziv!@eicKBJQAWo+;gH`
z&`v^FG5-MZDl)fdFif_jSGX{=oY!~)2zQZP-61!4*S>h>UwnI7H6oia)8g?1LQYCz
z;y|`Ds1v}9^!PBW0>I7V1&RcPZ}&)aLWbgjPr-kZcOQ6P?Ngxn1AvW+oWFBKWrXAV
zZLurRQTnShCJpANTP*DQHIHG#Hk#foX`Sxu>hJGQ;1IfGso2r4zGej)6tikZ at funR
z(1dPIPCQ<hIR!m;7XtzUBDND~*X~g9K1O_JW at Kbsr!g`%2CCkQfc#~Uj04_H>35EU
zwNJ)-9q&Uf8^FUn0%%)pTYHE{0P<@CrnB6utb?uTkD#YgWB#V4%$TY3yYQVbY`n9y
zu^8g}ACQb*q0FO+pvx>!{sL*%(=piXPhlH<0$);L)wVO{4?Jp>f=g=A6Eci+evg0w
zjGqs<3M$gXXs)x0<17%|pR-2A_4M@>Idf+ at H`3#WEUg(aRHUxHh?}B7(>$UHXE&_h
z28sf;9`hvJrI=~85aglss_b<tb|f_MJuXZ`YJ*T9#6CJhr0~50=oZ-6Gr<>cqsSP@
zlq$E0QWFdPtk+z%ne)CDrFj%PDud>{RN+{;jzJh7<oY(AS3chsQ=_(bbvYMSRf!EV
z&on&Gs$LmModywB<VS1Zl&HPfA`PAbOB9?AF8=FJsJa7zkDG+VI6v<TcoVi1YJk2Z
zy8x_hCQF0m6;xCz%K5)T5WMPe2qBI&{j2V)tgy8UnB>(KG at t}8eXH~Q`4yPbN_d#Y
zM!iFp=4IE3R_S2F5L_A at -DfKU_>HVb`hI>Fz=x;mj$=|qN3h7O(zw7qRaI39WEB+@
z;#!?YY*Sp9<yvR26lxBo3#tvjx~?J>j1x|I^LTM%14=kKNEI7Smn|(U^6Yb>>#auV
z6 at 4lZfE5*$l%zs($aBtY?CmRK#y0>*r%m$k at W8Qv0u;ytP_5Hug0q1-<uItVT4)zN
zPbtXRCi>!pw4TrH<^Yw_)x(1%IIqp=)2&;#6s7<I4GvmE*l84f7j_j8q?s-U1S*{C
zEK;g-v$HIB6OfMwP-X$hdiu4$VcJAMZia(_L&l4CNXNtT6KH(H4&O5<4>iUN&iX5A
zB=Wa`4VUj*A20fdsspkXLBfKdh4_tjoGRq>HIYRtF}2<Et$&Cqpd)p<;7`GnX&?>#
zfq)XT@=!<w4a4eK$*-hnHxVkjF6rEBVBjE-rQO$B%VVXMIT?tGx}iw#iATJl?3*Rz
zbj8kZ(xZ58WAOm^mAWV6*L+L=!Nvq!Molr-+V9D*?%gb#<%~v!`Z>mjmr$YI<41DV
z5B%Zwqa)7=q0P9ZExaKd@~ds(QBkh0t};Zn^ua4S)sG`V0)(mtQZ<k&-Y87`RLC{r
zAH|f;y6ftFBO%?Y2hm;uZ{-U?@1vj$inygF;4mMxMK3OENqag6g(wv7<rNhmYDN8t
zr|v+TM6r28jMA8D_-E9Y8sd|ZZvB0(EZGx<B?cM#gz5K~<0;1_Cpdut0llQG=Ftlf
zVL>v^_eZ*}J8n*}q+T`-`Ax+J8%8ng_!*;aqAy)ac6RKDy7DlQ<}ecNkAkxDpY1mv
zrKF{E*$CR6BP1V<Y|8VK@>@?ZXM6K*pwsvsEkUdT!SN<kM+*7|8Ib!=e(kiFzrUGj
zKz1H0e!lzjr{rRQfB||EL2|UC`T=f^oBQFWPOdfUJrllSr<W^j!JAVJQmKjJvL`x0
zr)tNMr7;A(@r6pB8><sd(!|Jv-;qn*gZ4AKt}yA{j4ND>DzIUr!Zbq<9)ymx>s3GO
zVykKm=+uuw*1dkcF;OxO<r*NYE?~;AC=zJTl<x1D-Q>u0+nS;aDmCd4^KQdqJdMRe
zi*B_3QP=Y9x4o+?AKzghu2^x7vD8O$LHj66nF1(mr8YcB`F!{_E;xcA<(A|qs)vFj
z!+yT?7=T at 5iCr$`5i{5?goT at OaxRVK*^b0VTuU4&05k=st4SkY&T&eeK~S&(ME#^K
zwgV+g$hioU70Zw8Bvt{#;EeEQ8Ut#5VnRDLDZ=Um0tl+4(2mKvCBq5<C6BNk+z$)B
zf9$|>fV|vtl6LUPp#$(6?kF*(;Dps+B8yp=9q~7+#7R&T=jYEmpI;@fa`FJqh10kh
zLMmM`IoOJzT3ex!Nl_91E1v1xUA<!kR7`*a=w)t|oZmn1p&R*yF_|i?Y2>?Ey^W!Y
zkB>*(&yfJ2-*LL9?Bw)XU`4W6!^^8#Cc3+)2M`^r4K<Y;2-yZ!R=2xr;Gik}&P~F4
ztnu(6Ey2&9KW7`A@@sxSXtq5m94whnA3b`wsUFRLJ&-4syj1#j0?@7^LP8P*ITGoD
z4!%dbx%F3xa^=Eg$@#5=9(H$ke_f6huk4+5)&67!CmOGpHZlJEwx&-+L<Ddn!IXg(
z03}oodyV*fnmzv_(t-%E--K}^a^Hb7Wq*IatS0itv=k}bRDA$uy~6^vWNrNdY1d6-
zBcs-~HmJNSy6WN{soSi)tf<&Yf%GwUtLMoHY=G-)cij|NY^KWbMU_!fhx_)+{whV*
zN;wD|*x1-0)byQEig`EISWLx#`=_4rT$wD>P4Pez4xpZSeT2qEPycl!S9<f{*4V*@
zl at -Cz)6F=uo18}LYikydAM;rZy at caeO2b0SAPWH&h!7xLA%GB*iR1);VPyKjGwj?U
zxWTIBhVC$wAJ2d_D8?s;D!LjnE5A$BD>ZrP7Y{#Zg%U-^0ap$F4e&bjx&CbKgjyCX
zUZB`i++raY_k}0*@$_swDmFYLY_Ofx1Pe}(4U}joerDQiDS<49xH3$dH3gy^OS;be
z=~h%tfm;8r0CYS$8R`YUi!(6zxNgQnjl$=-`w+}i3L2~KBX$ezRIFFn*r#XiDtu^k
zTBf9;!WVMip3$%{BR<TG;VEHF<k-o#LG~u(J)JP30!LU9ltT2m;Iq3w_<3wDj-JQH
z6!0D>6l~@*QsD2BkwLqX205UV<{}eZ7jQ_S;!x*8i%G-&Mi at DAk4Y!2+bzTu0}7dZ
zxh*_ae-LiS(E$m2ZAesY?&L_LMTb=wx3~-1e=c5ZVapJE*m=oH@!q|t&5fX25~nx0
z9&E3!2Dd_5>dF#*#+T(&8KsTUY~-Mi<cm!!lLq?$(bj`lDv|o?YW26-J0N}02at*T
zdZTx+8Pq%u|Af_ByU!&m1_T5!h5#(^awP+=(JdU9UB&_(^9fbJ1>_|zvjA{y^z?1X
zMm_{~#*B9x0E+e9Pf~Jna*mGNM601RzUr3VU4SOx=|KIu_QjyxyUE_&m_RD*d}HKu
zlM5KIz!w7pdDT|s!rJ!73~U3STjGU)L}rtd2?AA2baY*HH7UgWgDYl(IOh<Td(A!q
z<eh`*JGhk(is!W3Ixwd|IY4P4d9}mnQA}ATY~S!gGO?3&25hfyz4x#oVu2Q0YQ7Dg
z3CQ-a2k|(HM^U1T>SJ*8 at lkn!T?)##iSX;Laj+4nOfw=Qv92UKw-wDcIAnt at rm5)|
zK&?&`um8M6mXEi0&bWFxL>Z;3ntKSkg1rBDs(>viJ5GKu?XT+kW1cErsY&jP<mOEQ
zo2j9R3D at qR>#QGGZ{H^6vx?J`0bqHKpcG~V^_W#Z)azjVGBb{c5&s)~8-7Nl$M=jh
zB#-O5Ixy?&>+1kJZi}oztoujM1SA9o&&+--3A{WqD+Vx}rH at l;i$IcGA(1thK-ukj
z0GM=j(Q$C7_!*uc!r`a^0DW~YHSdFNF`RcN4-XGl*WP6|N}F9cPr#o@&qPH>=jwzJ
z)d{|3^T9rg<ZVCMWP6>!Rq{ZnC&1lpz3unBv>vzjk>i((hYI{=#}lZksLe~~5D@?j
z4eTM1p>q=0GU^Z*u0R5_=OOJs3)ykGNt#Gs<aG=5%D6y<@Qn{+QVQsI%Z%|#oG-0U
z?+6LajE(I91A1~~p+FwQ58kmL=TlJkS+7woa{uHlf!YonTzeShh7FwH3u6U$R0p_J
zSgqK{r$;)9>!TsKk`NI&#spfMo}V6PJU47X)_VRltL+8r7N4P;_Vf`*y;M|Gq1Y6!
z=<CzLHc~z~J^dTxP2RIOARKy{e*O9ddsg(>FBxrZ{<(Xo at y-dXqv@lCluN at YBYt5`
z(O+;0%%gjId(Ivny1!IxtgTsz24G2{*5Q3r6-zBT2YxOvNvz|sSFwJZ%Fi9|7!lAz
z<JU&{$(9nqZwLmH8_O?-KvZno8)O4k3bSR6mIL&CxPU^~xxlqEDCgUIu8wjjh+n^U
z0;Lj&h*Hm4eRAX(mR+E%y0jY<c;*m2;Oq%TsS0;t(0D(zv at CM859WE)PdoKoT at m;3
z0Qk=4+gj at C_yY<c8GmW_Y1zD$8lrlkDQ%k%iJ%G=6{0K~k4kM3vq~Bf9-hBfbT*VI
zJZE4HW<MO)aHlUTg4KqM<nHKr1O`o4%cjW)2DxEKu~-rGZ9e0#RDdr)oC6|fxbA@`
z5F8ZLxea=9G+~*I6vGL5#R+-aFRl<v3Ruc=qfb`ztxa(D;^RkG->3Y9^(MVA0jEf9
zE#IwM=sFauG4&hC9EJsd6bdS&NaZ%LpoU{q)Cet=3PrkagL(Ef*h{HW3z<MllT)u`
zin<E|?f%c7&wHeD7-kVIxVX4rA4wH<dFA<Yf3fRokbIo!j1gP|^|N|(5Bi1;>sK4b
zw?sE@!j%7yK&M=F78#LVo_M0!mvnH9#riuLA|;b?BW%<Qb93_nL7q^?v|NA&FX}Px
z24`n4fUZzLm2<E$L07SbH+PP*tq2H+fqgN?yS*74c at Xv$4gD=9Dhx@)l=t*2AB#qU
z1`jlZDHb(Z3;}u6uGLhz{v<Wd*tB-<^uMxQh|n!YMm{Kpo9Xg8&Sm>l?%($*Nmepw
zQXr}HmX!WWcBrFGjrE7`@O}jHO_OSHU_j!tf6gI<yk^IIb;Rpp<35#EpaDRwN#OSW
zhtILXmP}pzfXc!f8`m$(1=T_g8?DQcS2fCF@&-5xqAkG%Z!IIEsGFSU@>tSd)J#{$
zbCt at uCN&ky#sqr*PtjBCz$wDfc>@fz>%gZ^e^6Fn1pWghuuFhf81gMB<x3+_(?phX
zHs6P5<scyAF$)R|yow?`ln%dT14|mHPs{)E5KNb#egThb_T<TRtj-PC$B6rk#topS
z+{|pXZuh)*@19H!gV7j-qCWW&NC0n}!2H$E88#9}C++wV$*UCC{_1P{wR#M$H;>-p
z at Uh25-#$R`H$M`w?}a|zjP$g7C3!1J7#*8m=7!d*d)IH=xa;xV2nf%V6cX}sp&J-%
zt;M|Rhj>}^t8lXN=)&fh74<X1(BK%X90ov^y6=t5`?^W5DL*XB at NRGrb7ugMPNYZk
z=DPYnn&Ef9e>B4hI&g47^3YlO;~i`Z=-}FG)1GUjq1o9cU|Iu95bQmaP<joU+^ES}
zR>&2t)$su2TwT%c$KaId4Y#W8uD1Y}KQXb}*@;^Q+m{X8d=#5=lxR7e#xLr10JL3~
zoLl0f)1#k4PH at mX`S|?sC?Lln>MCKc6^narf;6pI)Si-8Rnl06ul1yp$&{`;Iqqup
z(BL6g_0Yd!<^ITLNsc(zJt*uSeTpmLO4HFi)>0?DRrU3iYG&Gt7jHa%JfLK7e`lhN
z4uK9B5Wzw1))2`LD1PST)<V#ALUp;~FIEg*o}QiaP=;xIAFSlGMw^SbYRV&vu4mb-
zS^uCRA6kw6DmcRbphzX1X`T=$ZT-+>cKs`FFJo{#AurAW48e^rLtIUqPZH)l*Wo8#
zj`koQst0k?14vZM$|eo1$7|`1ncec8?}LJa-%-3M=H?dBHr6whlM6Y~A(;b_ln-*r
zQVc-3$Ul&`WWL4~f)KVoM_+otPyCx-h|09`F&0ket%7_@^K*2S*WjJe9zIrsFtGLY
zD}CuD6g%|L^qBldf~0T%CqRI7Z;9$j%(D~%l}dMs-jy|i-AnO7WeyKBuU2k~E at IOd
zBsWK{?zqPf_JTt~BIu<NkvkwchVYcNd%<0Q68 at qEu0&yCg6=fX{iTo-L}sf6Aj0)S
zW!7TI`IRy^RQkfMExklD6DiLHb|wyUyZZt-WR0Q}TxzYayfRxlspti-UU at xxCJ5=+
zD6p#6o5Ru4s;DPm6sOOGuX6O-w2HE(>G}b`^-0?Qil%s9g-3PDKAaYTrYfaMes(oV
z$@w~{riKBhQ4K=qg4et5+fk5fYnm4g6r5^uRe|0~N+hYEfEXfp9%e<Sm_45-i&ab9
ziyWB2DY?m08&TGy+vzz~WwOxj^9;Z4{X&v8Rd*ej$s?HXGkPHEEm9UsPgY5TS?4~p
zi|j3VERFMu^8j?LhZ6s%g-&ezAW)eGDJ1o~$Wtr{LNRV`JPa_{NSz(a_2qXRf0gm%
zISp<(-Dz0RzUOPescsB{<SD9%28FB11*49<oj419{sNLRFp>zF7)oJhIBSrS7kTjG
zZRcvQ<G+KG6Lo|e--RoFx(oLKOZN1|zWBv{ABl+sZ<0!*qDlU%s^{HZ)5|=vmnFX~
zjueUz>-0*~_?^B!WiP(X|MbN_^6ug<#)!OG&SOu+XzPJpZ(m;t8SWEx#iUG4mip(I
zys*(^dbm3P at P^+^IM^@~8p;rMQ5PKjEW;A!@KML;4E)8A*<^;WIV8)=pW}oN()0F?
zj}!JQQjJki5sZ&?ZFDZ>8DA5Li>m2SQ$YWW-5TQkLWRz3R`h at Ew7$YT^W;l+#^m3e
z6qX4O+$GPbDLxhQfC?TA3w~ffUU>Q~6Ij__KNdP*j$kHwT_8<g_n3dBLUH8u8LDKJ
z5wAX$I8Gyy;aj9-;J1G9f{>usuE$X&=}{hj-f&qA&gk^*7U at JTOoe+CxY)mb|Bj80
zP9h^K1laWQ!Ts~6fJLyC<8DVV-kk7ExiQG}NJmfYpEI$YsPr0pv;fE^G*&9>xb at H!
zF{<b$n0dS%##+*cvI#L{#JcjLvY&6%$tlau8n<bO%82DRhs!3HNPF%3q8ePl_(|XD
zzw~Qk9K*@~F&DveEcJ_LdOUTPH3JptW>H?>0;XoJMV`@<z+)-a5hmF*$9rO8VpJmT
zt*#phNQdy=KXjjqc7Nn)wHuL^prt-EH%Dja*I9fFD(mU#>Byx}S74Wb<IfQTHy&6n
zo5AD<dCGqR$|>xcQ04$MRF_k6Y7g+6!p at 9WNG2paF&K;gofXqO=!qEHY_yZvRk#@t
zu@^9_%tcT&TN!aMt29lLSbi- at dx-_mVIUn{Rc}f#uedp9X)~ehkg at arnhM|ELtkD+
zl}sc*1H;u}20kiAvb>YcVv{_!)!n6 at yy$=s9D3P}M=Mz5WHIE;K(=h)yaWcU_wCz!
zP$0pWdvW%|&otoT{CCGB8CU39&;RmVH at 4z^1F>x=pyo+i?vS-s at ACJ*M0z<d4>*>{
z2^2dP4Ri%aTX`ZlH*o{;IJ`6rC&(H&`rj))2$i5_0>g&m<=5S?Sk-2I5s<=AR!8v5
zcM{XNS(O4C{~ONTu8(60%1;Fu5|qGJ)^7gV61qvNzWg2BPr)wiIv-r3)n8w_>=T{V
zer-egN3N+O67N~<wZ~#nW$YJMwvrOv3b)7fLJPLAhBW`iP>nB_Y%fi!tQ8H(>U<XF
zrA*>vWyQQW-Fweft(aN>Tw38Df`^5O)!Zr8%68{fCCW=!UCXE%iKRyX)V#vj_#aYu
zl at hJ=N$#}8(^d^n-l>KeAYFkEPAu;JolUOYu{XsTToN8VLqE&Lnoygs%ls3pD*&->
zfPy<l1_jREu;4<DTlv}`U-KQ+=k0P-CJY1b-%Iy~OUd7e=nsmjBc1og96OX<R$}#w
zxaaobn8i<nxJsi>woiOdF}I5dbhG~A_3v`aSBK?^MwF{KU(^io?0xyeN{KK?<-Mtj
zf?ota>jSPldQ)+D`)ggP5t2P-wWOX9iOeYleWFc|$Tw7_%suQqkp(}t=iB}OCnvk5
zPP7G?1FS{*KR1jAC(Ft|0EXn)99iJ%pGZqj&lYx(lV3|IWAAk-EG#4 at A;D6y2FMKO
z`G|WTxZ&|S*^70X(#~o1P*?1rQE(8;1(KeB13U#8P}`-G!)+kPwHOLst3p;I-pT;T
zptH9nKWVu~^qn#8uhCtSdPdnb0+I*N3`}MWr&?`<w&QTK8=V5Idc(3Ez^RmFW*Wn3
z at I78lQPTG;gwW?`Q at pWyDDc&Z-K6s{v{W?|40)Cg4polt8Zq;}s<hYBc!D?sWdIzw
zxTx7P;08^%I5|0?rR+hyEwqqzcxwFY!4+Rucqn6%uVa!weJ-2gP!lj|H1?y^g1P#d
zhYky~W at v4hG!SAT at 4t@~Mjp7voy3r`GmEOB-9yQEyE0}@0=<e3tv^E$QC`2cOV;!p
zPsq;>`Mq{bP_@~$O6lE+uC6ZN3wHaEy!)<w_=M?$QO4~+g1=k<u{<1cz8H%~dVF*w
z5dj=jGMC8%W4700BdI&J*mH`}Q at I@%Ph}6Fb7X5Ep_~|PNmX4v4m|EJ=jFVn!I%QX
z#LsFoWBTnj*sW0DL5-Uu2Z;2;;9zNGXIRJw+akMagmop34@}#D8Gnbxqz^Czp>M+@
zBVS~V$X;5)e}9z$ji~JE>6w}4hg-_YD3hV)%FYg8MC(J#*QgqCm+1*}0fFl}2q<Ry
zi69P=cdpy<gbqVIApZ4+ZY at woUr+B~=aVik_GL8aLQxjdK$C--6J$qgVoP-F%yZd8
z6**a1l?)-CaBU2;4ea}B9GiISlVv1EyI{-ZycsfP0#Y(4jL`ga>$=BES0&h4)}vpB
z-K%LUC|E&}s|N?YoQQqc9;Lk8c~!Z78g@|b8fXY$^8hiTq^j!f;em at l#Fgj0DhfL^
z1meNiJTmI~{c^pfwY89DA2^~LETX&H>LsA^FyuiSg%7kw0SYc-l3ur2H%X-HAV4d*
zNmO}Nid7|)THKd?N;^c*8{7a{V&9+^g*nHcfqkTKm}nK3+}kTdK|yi1?sU%!5!HTv
zVgm&pn%s!RJG03H{sXQ_DY8+r+sp<Nbk$%ugqmx^O at XnW79wleoke<aaT9hEQ7{7>
zJ9x%l1-Cb36Qbv%Ig)|)pBr;0ZB4O@{OAf^ZQ)%B1M139Pw!qTuPi%Lg$Y<vu)FYF
zSHWPOqQ9&|24&0suV4KP4s*4NOSN)PIA;nvWC5#p1%PV~DsG4H)MkS1Un8^=P9ijn
z85^Vg)RlpEG|Scioz%a6jdBScnBC>VmK3`<bqP`*c?kiWE&bIA00>Zs30-8NodA3^
zp~IFyszu;*wc*f+eg5#F5>%+U?;)i|fWbBa4Q+2{q@@{fqRWyp%H2XeC>}SZ0K{#u
zO`^#GB*4$^8mk5lD!~o$85CPq)<GanW4*pXe<XBbsi>&HBr~@mYSWBbJ at Ln`JO`}p
zpgr^yQ%6-zEmR67f!1&S*^f5(qib@|h4>DM_UrqXt>tAPR@)$@f^5Hez6`BDBpzjs
zSJ3&7H;S_HwuF#K at SEuMNr)7G09wcLL&nDDCgzt?-Ku$*Su#?5DTP~Gc&$58WOp($
zGNh!W&QJH%sQff)!9+(wLNdxw<W*k3DNl`bEv~5GFzW(>tM%aFV`V`291pmiR|Z;J
z at BSUm6O<H!YXt$|iMcs38CfdWf8VIO!x@;Lp9fNrIGdvdmIQ1n3f9{*uer_&@X7YT
zTn7}9<OLonfOoL>uFGyKK%+vg^dcN=n0x7GG}wN|dRg*WP=Nf?n0f>a%w>tPr_jEP
z(77WhxB!ekvdvCCAJtiCJ4;YRn?DZ(F;Hw)<+H#^Wr{u%V4mZ7=>Gk4iH*tou}!Pz
z$O>s%5fQ@!F%Z$#HYdxF#KctKj=I4KF2BZ27H_`wxElxrcy`p~y_}SsoPGkK?sSs~
zYR3?O!BgzqCm at -ETrK=Q=5l`E8;nu7XLF_WnC3+5(|w2yn*%L*u%W}kmDn_b&=7(D
z6w|Y1x?G34UH&Kszh2ax-X at TzOo3s4YHrB;aRa<e!lN<I at hK?E(%+PzM(LFU{SLhk
zSAnqG>Nbpn+63q|$xrezl=@BdjE&G!2*N&{^J<zkZfRhk`0)xMz^l)OGBUm3M;T1g
z?PiFg7A42+(|5lS1&sFA+9p9Q(jdooJ<e12;D_G@$f1}KY0yJqyZ}9~#JSx<K>3i7
zsl4Qtd`8x6F`Nd6c1emWlS?NA<*-czD+xWflsl?{a+B at WG!5 at V*Lue%ZnY9^qq!X>
zQ90>Akb7c{L3n~*P8}zjFTnSKuU;p}93*jAzWfMWRkl^xQRqLjwX;j-w?XZVy{u<o
zZiQ}iss1?Ke|tEP`(H*GMzD7K5pL_N)b2o815gBo!_CFz&%wBw!$P|;dLRkx>LVyB
z#38piZh^TSR;DsQO<n_Bw;HhBpuMa8+O5z|P=<XVtIJ^`=;L*{RD!6VKkyfnE0(ra
z)NptI1$xHL_I3^?ECaZIKy9l`o<Pt|LtiDRN#HJ78X+VgD0Oc7jv7D2vBvMv2$|Q#
z_i5k-in(?>j?;y}DDHh!9nq=aCn^PvQ+TC=T+7-?&_$w}#>WCg=uOS02JIqMs&T)8
z!NIZZhnsj6s?Y8haox1iZh9wq9fwkg*6SURDmikuqu>ZCX(Jv_L7FkFwK4^-&*R4v
zHRj4ek~*zxSAre`F$I*eXD7HRp8RqZ!t$WT$G<H4rmjv!NlEip$%_Zi(1PDzzkkb&
zh2`ZS(0FXWlfi`)zYV%{p-3Jy4nxBpXiX^PBP)w at R_El3%ua$xF3#vCtCbtHT3X>r
z>yDhHq?+m*xCQO5*PxT at ctz}vLRgip9?Oxunus>{$LjF+j|D#f>z=C7Jq#<0u*|^N
zt}QP!B*>nCyUA;JQL at gvEy!|vs)C|+cj4l^;iRW=bszI7FUl88DrrQlDp}C24jk=6
zy;bX*I+TZ8C#UF>TS;-*V{U4hhMN1AgXQBY$7rF-KqATQukau<V6o~qwGK2wt=y1i
zZr#trWW_}9-i7xWFn#$hscCil$6TFqb82P!O{;=J*S-S*afsvqn{y_axcnP}r?bTU
z&Ve>uY%ww5hIcXCg=qY>FEaE7SpZ`C^JmHr<f-6F-h$2^davRKHqtz(*C%{Ly{93f
z{AEm$e+BezNt?vWju)w=khvFkt3wrTQg)w%Ot;vsbTyCIL8{cR$674My9Ri+{euId
zH*fOq{S^Odu at OFxEsYwpxtn9X*&{0}D+`NPwYp%4LbFN6QRGFWCS+ydEU=!k2gz6^
z1P7z{(y$)>`sBbs`;zZT!pjF{phT!=Lb?{To<PvYYB^TN(G+llqy?;OP&Se`@M_Tg
z8_Qyji~jvuB at t05$pUD-k!^5dQ;GW;CFJl*H at R)y2N^5idue&br1NO$0b)}e26|f(
z1PcgKv_^8Kxj%_WNJ8E1SG_LtxqTZ-UEbP?w1GAW`jv!6>S6aJWq5*S3pcYz&_b+K
z5B$@Z4VHT7dF%_~09SYq0{ED*sqc~s+e81;SP2uYl==}wAbLg!djy*T1fwOwLA`ta
zx6k2)2#Fq~4c(mxZ0phN at J@uv26XchhtRKi`0Iq5MtqI7`pZ``syckC=iqw=@!u*b
zQp~J3p4(%IGdFXl26{GvDtL<|E=Eez{%g$|5!!{V^z&zzsgT~1EHS+z+FOP54#%Y{
z<hLO6C^!O9*O(1>fyMy(HJHbAFBF`JkJCv$K~uK|bG!o<3FpD?E}om(NwSO at f?QN#
z9O7a{29#qAXu8b0eL5>;t^lDm+#6j?cZDt;d#?^A4IW<kub-*(I&0#JA>aQ at 6GPe`
zuxcqh{+ENyO_5i)^wAqS{U8o;8rI+7e+=r`iwBp!{ehkr*ki{)ru6moS at mwD{TgtD
zQuZc?LFXR`-pyap!<mDz+x~oS84*B}Ly2kdh6t4K9UMY`H}jxu4-|&{U-mQAm-)%~
zi=ge=>Q|mMs;b_*7JA#6fEn-s1)Z*<V)!Ww-UMLY$cA!=&BO2B&9-=O#o)KBaFyQJ
z(5*|j0K<>tpI>&Pe!-<N2O5)od^Pkwhq2m6t!96~uLs7^SnKe&Ca=xVS?h=F!o0!;
z9UeUj<U?6<TioqHp~@&$t&Aue(0#HU5Se1zb-6LaHMWD73)Ou5m*JabhQ>OyPuwRM
zjd$MN;`?+fE_J3BhJso2EO&AvZBp^z8Yae<?mEaZOlj2<bZ*Ox=BE|nKrYEdW$A%`
zsxazvpoUbq=~F98VI;D<hE5q1TeiOxawEpVWsg9@;1>KAU|?|5<=F1=Jzrt~1DO2J
zn at US82@T~4>04AIz`A$4l*}&Co|WD=4Zs|SZ9x1{#Izf&mVT)hS|-i~dQCwll(XKw
zLa+bM^FF_eju;KB83Vl7L{CqzIA3~nbaYq6`h(bPwW;(ISxG`Y6q~2`UB<#pi&Cy^
z+^6it6h)8<y-Mv5d<%_GYrN_r;C6G^bL9}rtmX%3V=^u5JUsZA1?}<@E;leDnUW+D
z3?N*_5xFm2fG!kPNk9xtAp4otS&Rd*Wl45>ME0P4JJ>UdJGoRSZ=usXpOOZ+D_a%T
zO`(1#l5x5({;SW8R@}QSuFMG$o+u$GIXjRb+6)LYjYw!EkkKF at AYeS>PTNW7MYSU&
z8X-A3Rc8-UYLS^W$R|`%V*j|ru0}LMKfZ~H$)-AXUO|D(&>QH&65RMbMvNOJVE-BM
zNOOuW`8De(H3<iADns99?f=n<jBjY55ryk+KuvlT_{7$~s%IX7dlqWw+1e*s+FwBY
zU~9R|{{|735*!x0#J}hQ?`yz+KiDdGe;r->9&_o)3;>PQogM6F6ri=PPnHaD2A>hK
zzUnBL+(?{!chHf$EmQx@%PTE473TD&)h_|7kxTeIW(*s-%`m*)1D{RLAmBdpf{DSn
z3o<qIz#4|aX82Esg;ns9pCaa<>L^xh&i0y!+a|mtBR(So`1(hQk>Jtnl~l+^F?Apb
z_FlHiE^S1OHfMD4`}cM*quIrN3egD at sPW#dnB_ct%QCX*I=s2Ea5Xna175=8ju~5k
zLng#6*+?hT3rnMAc}0s~W0aSeD|^%ma3x8U&XFXVTAVbg695D7&@%{=Ry?eo8f8!N
z4KMu1^ySm}0Q at -Dv;Uf-2JH<`*grQ#pxqKz%Mi*vkKZjC%+mFa!2fTz1s$T3WyTrI
zQ5zFrM{%@QQW^yNq3nC@)+Mbwx~pY;_SZikVy<!KgJum9G(l|n`v*C#NSU&6ma at QT
z$$dam96K&3n;8vF>`V$$o6v+P8ermZobH3CvaO*L_3|^VPhBJ=F5NS^*Xz#)UY-9>
zbN*OhB&ZyBz{a3R)3%bes)p}#<q|Oi_ at YsSQqq_D1N{V#3QWR at ZG}_qU#(^>z%Znw
zOhc&w#1_KA6Rc&n at nSv@LmhAKVhyAM%+HVLW`NiDC=46v%<vAsf4}vmMeyr1C|Ls^
zMIA^{L#HYu-2bhRCFQlP=<6#+uhC|8T_cn=6<YIkO?-%*euv>RKr3_I4!(?9<iUvh
z<QHB{k;f})EJ;%5MW?dFnx$xy8)be4o8OXbQ at mMeXX*E86CU-7Z+<JS$)b->>^|kW
zL6tYT5i|L2p_Q+xsfjmDg{qVVbe^H<X%f2^5CI2q-Aj#PB}(J>R6m<>BV`WWZx&1Q
z*LtXWKQ#dNG~fbVZ&E?gE8vg<-mt(MT4WF4Wj}+1n_v*EI^woB{)PD4bW!~E_+?oZ
z=uObO1fKD-{c8IBztoMDo6aM*6SL<NbawI3eM?SmZEcO}2gSr$o-&VBFQp9R`syrN
zUIXs)TI7y?X1gA(n?ht*d<wWe;IfhdZu?(xq}&s9-2ty~p5XJOgacOuwE*NXe(HXe
zSP8C93Wf=~JUZxR2E|K2P>@Ez_GN!h;|BgZy5}Q!a~0n=s6os~;Uz_7{1pH57s8;j
z<`n>$3oK+|7q`6=yk%mdH=OWAm}#zUDh-vB8k7~ZZUYjYzqV6fZYf$Mtvf$Odt{b#
z+i*gf#5Jr?8VgPd4p?9i(A~(-pULwmM2}U&=kd)Dx{y$?&y<oFP;tZ|ANzxR at D5C?
z{rzi at uDPbUzw>Hd9qBrMEQPwkVq_k)U4nO8&~|2bFp2G??w2sCrQybNaME at BnzMlj
z59%t%?b{DS{&oqM3WMegC%mL&11@*lNxJm+@@(jIsOmU3D5uU&PQFiQ(F^Uo(4ca8
z2lUL?x;i&dk|7qP{_W8%u?9aK88x*%tcBfN?H<lDG_-Hxm7t+2es~>5 at jA#G&%mO7
z=Wk1}j*`AU7|fQpcXp(urQg)l2t~nrlBno)hQY1`wn?zEo_`Se;Ycb7-N-Vf&kqg`
zfH8))2SDmjL&TAxnu+6C3*o&0AP)me2h=>U(JS2cs3r|<{*f$bdj_);G at ZuuG+u|E
z5KZhAkld^%z~R8h!V><UA3}W%^VswM+PL;;DDyD9C)<VWm{_`vWu`H%OIb8D<Zfhh
zS!p)XPE5J1G8Bj7)`pBJ(Nse1N~^MJNm5ZboN^>eX;+)vCMQx-axI#DelFWNo&9eP
z-+c3Zzsvi3-{*av2Ygqwd}(zX$!!bI;kE$VC=?3XlU=j-ltbbHo(*_Ekfnl<-#D##
z-egKN0C4<*-vbas^V!$fh}VPiySKle99$r_&Amwu3PdFs6u`p+Km;IuKTHAkK_O%{
zX(G{TOggLqfXQXe4lB{1g8vK80SGe5sJf?cy*y#xa7Q~AW$2>|yg^`Sb5H&pB?dB`
zYv32Lg_<d0D&*cP*fFCQm(^K<O^z0e7SZHV>W@#R&X)Y?yxwub|HO!ynBjW+H7=P3
zkg1q%t_A2oyoV-A32!Dj;BC~zGx|Fy{O6w)VRAhhf&Rb&2=)+AZ#bgC^+I+Tt at z}D
zDcDayq2 at 24akf2=3J3 at gTr@6c;L+=4#t9!|ue*rcQHN&J6x?(@Dd{Jy;^72P?*q*@
zww)M!4sn$v+65EY%v+&(Ced}vm^xVo1$IvyB4$25-l>hdEoyu9pTL|*%|D6B@!bqD
zgT?VOQ`aM36-6#l`E97pfLyX`G`NKxzv_EjbE%2Ay;#`y>1SUf%Qdf9(4mZFIDEX(
zhb*LKo^hx=RO|0IB&O`iR>6NP&f6`d&=x5u01UhV{q$xd&@fO$M~=VgM(@ds*AZ^G
zhYVuxlUKq9lz)gFKZ54E*(hlk!hi(y#?{u4*KFAocTzoP44uBfb(6JTb?F+|fcF_J
zJWa3#8u24oJ}IlYlSv$?_qMckw>~cMhgFaa&6secs<=!s4IN(7poao*k-^*ca|sD~
zg&0;A*Nzk6=CIz-m?Kf#Te3_|%fMp*sQlGRGY)*0PJIxo>H|IoISMiY=$^6vaOAdJ
z3++Tzjl&Z1=IiC<bm5WLzmvqft?cLCuC6!0*rfargbD%Vw|qVypaAGP`((wwH&_WH
zSl340S9Cy5#Yu34>RKJ~GE*=JR(wU|fcS3HDf3cbfQW1v)oXV+T^5j0wd4bqL9U4N
zPRG!&qr~3{89m($K@<xRr1*WzW0{#Br=(>~0l9IJZ>0_*fDkFf$PcYHeIp|`=4Gfz
z3LXIyIc<%dO7-v0;BMHU at U@P)c{H{&V at LLdPNeTvRv*{PCX|>8F<7i135e7DLNR3k
zz=fgcL*CxbRnXH(2yHkl=q8h2aStp<s)eR-Nn(DtG!LE(QE&jEp5s>2yn%D)J0FGb
z*x^MiUELs5Cya0QCk+pF%1|?~36H2*`%YE`o`_-L?B<q$fOk(){R<G_{8bMQfwGO(
zr^dpA?4U;l9-xV<YTI5o9gM8zNcCD(r{D#>#@d+JLXo@*OY=a6q5^iTO;i;7%yRZH
zbZamX;aW+9T8rA9G~&K&SEh5p-_kS(Mq4K%s(z#nc^W`-;!#=yhxk_BQ}`HJLvm4l
zVkz|ocR$mf2LV9Fa68 at I2YSWb&XY7_fvB(eD4CLA#n~S(X!=G~Rm)O`kGtTMsEqqy
z#>hwN>CEg#b&Zl~qpPc0tz1pu)9WQYiGM>rwRGtTbcLoM<}uRKlPGGzjc*Vsos_wQ
zH`rR-iIH*0=|bm(W)es(GK{YRS_{BIS+Zd21GreX_`9=XJi`PIdqsP^rq6%}JDvFS
z==(;r_xQnFPV^8u$CdByty6a1X9dPyj3igIp5*IBDViRTF573#o3CeJkYue8RI`O^
zAD+b_lJgLeECF2%<Z6VpiS?!C!?aA|Mq{6{t#yhTEB|0i;8hVJ3go5ez1BxgN=!j;
zK(3NbfRRbcs~-~kiDU=GHAXkc#-;|RKCfu2t_QLx$5`lQ#`WuNkMuo|lgN!UG&aUQ
zOIwR6(6*2Y)%H3(^kuoB0i_uP5M}F?Ko6v~0DLE~-(%m at EM(-!D=Bqe+AdeC%Xt9~
zWSHVS^{0nEJyc%>r5$K3HaHF;6vNv}{F3dzqk7${tD~$mQ(UOofMww8?VZ!}ryCj}
z_)N5eSM$%GxAVZ6O1H(Slo@|^@8o!xYRj!%?G>gy^9gK+<&Ln77U`kIsh+1}N!711
zWCm;+tfM at k@z^;jcP0wIBp7v-L49hU*U=80jLBo2`V*<X4ay#t1Ju#XDr*``a{Lry
zRJ_=EP*RSy3(qdHqnqiqH?^h%YQ*BA^<;QKAW at n5gkVdqx%v+=xcndYPsCsPljN81
zzfx!9TXes-n~Cs$U9_8Y%)&pnpZs-t!lr{VLa6OecV>U<^WeQeX=W{>FD*aw$t1M&
z;GkI2<34(JNjfi%L!O|ab?4Gf)#Z2d48o;v3)9JgB4UL-WSSqV9O#<+!+|gfhqEp5
l8A&1L+(|xv`ei0EjfyUtlU3BPn{ZbB!r8&qzQ~rp|6i>3*oXiC

literal 0
HcmV?d00001

diff --git a/lib/tevent/doc/img/tevent_subrequest.png b/lib/tevent/doc/img/tevent_subrequest.png
new file mode 100644
index 0000000000000000000000000000000000000000..ea79223d4dc1f6c524d40b566e9895003ec4df34
GIT binary patch
literal 22453
zcmc$`bwHKd*ENc9!~zthOG)VlLBgO at x<R@@HYrHhq)02NgfvKZNQZ!QgObu9AdTOA
zHtIR&eShzFzwh2Zu761F{p|IuXRSHM7<0_!b5~9r>n!nE3=9k`NeK}}42%<ZFffkA
zoIVb}(K{pDj)9@}P*UWUvdhq7jHigv&#G-<e|9l318NPTpbR5_iC`&8Ne*0%Iod(D
zJYGrOAeZd0iXiG{&8{U{w at XxvR78aty|R>&xw%4f at 1vH#Nd+5ixO;4E?vyV-=m=D5
zE9~u=Tx)baxSmZh>rmLA(ElK2eYX`4J{*IZ*7GYa^36RI^1oN}G2{y^Cj7VRFJoh8
zw}#_2z{JeFHhu~N<4aIv^!Z-TW8Q7UMYcP(C*U<HvRV208_d;l^z`%}r{G<<)l-C-
zS8<oI;CmTtHa_ at LJw+ZlIy&m>>#K#AnwB;+JY0*s5+lS-LRD3 at tGnA>XgpI&R#rAC
zDJe5M+YlLvSF_;xy}doTWP22f<7F-t6;*0#>WddIUX#Kf at 1bzK`WGC_M(qeXnwwKI
zGwYA8S7yt@%R7yWb^d&v&K*zBs-6!O6#?iwqIIS^nE&?eK7R}*CMK(1CEQVOT<O8^
zGd7Xlk1+J)<Ya4WYp1e<dOreJ+b8Yqa(q at E9zx6Q+Xo)0 at 6yxHg}}{X$Sk{xw1%d%
zwYB+37 at L@olaUe0%AJ=N7u{BNad1#JveDPSRl~=}H{VoKbK562F0OI(&E%wE>btjZ
zF at 9aZBzgDJWcn$w5Kgf>@9r9f_gbjvmyOzd@;#wa)$`=nSkHxUO8Pt;a1F^QzLC(&
zmLr4Aao}v*!~|v4b!6hCl|z*5QSa`4Be)Ur)*f}G|B)Wd3(Q%0vj$VRgpQK0i2=$Y
zMw^Y$zl_e*)YPX;Zkey6Ss!K=nb>)nCu||D?d{>A&z?Q&?(W8+5K1|rsHC*{5tl7o
zrL)Odt$xX0(}W!F_#>~L&z+q?-n3iM{mrS2=;cA{yfVAvoSU2LFBTRQq at OpaTjk;I
z<TT^JU!T=8JK;}3bH>lc)>gW at SYAy*A?Vu>Rzl6^&#!u}VCkdKkB`=Qyr;J}EIhnH
zXJm5CrDE*lCZP;AGC?vdIeh&5Qqs~SWMlyei&In7dszm^a(F#*CpRbO>TMo&cDr;%
zp*U7SL3d+g8au&LA?URf;&zsll(eU(XCzI+*m!zuO!v0idD<7qe9~gRCPmiss+&w!
zV&W8zmoSy{U+6#GJpP*WCKDT<3^oP^d3G~1GjqjX-T@<5Uy~xU42zu<y({3R(VGLt
zj$G&0kN?we1u<r4XKlyIbB3239UZF*uD+<fO11X!<HyOJW1l)Yv^-G{9uP4yxL1aZ
zYEGZkVhV=^vh0Qofvx05LT)a~#pU|tv&Ke7`+d*rzK+;z8SW90l9Pu=L^S&Px{RvC
zO>eA!|6V-D4m+!Q%H|`?Y_Vp>$lToA(9qBx-*8S&PF7Y{;}6d5?KMMBPtS~$jgqpm
zJvrjY$jH+4G-N}1nd+lpZ<Umk=v8?HMD9&C2KxK^2LuGb+jn<&VNJl>F9hjmX>s~^
z?0la-6DNe+`2B2JUS8f=R0$Kl-;m<yHS27>Dmgj1!a*yGWm6PNk$L^>4MhbVoy<IJ
z92}L2t}aD={db|?T?8f`G)&6o$`F#0hK{{YOw7p0XsUX5w<)n^X~}x7oRszJJ+|%n
zUdFOf7Vg*4hSVsQ%*@Pr!qi(dQe`V+71FY at c=kHFx^hxdii}^W1(}&;BLe*SW7;=2
zHzy_xQkieu&}y%FO;XUV?*1w*Q9 at eUuX1sHeSM#z8lu9N2XCUcKhDq3_jYV<4|P!2
zFFE;@`p9^Td1It*eEq6#jT<C^rJJoLF6^;?E%*D<Fz=bYheDkZQAYI>8yopB*7Wp+
zsi~=N-z0oT5}AWa8XCm-Dsyuc<t$uXHT}EyNdvsiB?~Bo9u^lDU$74TFfaMw!2@~u
zKxM|q>MAO|BO at 6ve}12qc6YB}A;-t-|McmTm8IpSC!s at PVq(hAW*o(qo;c{nG%YV@
zT at Foi**pf at z-!hF1rI^Wi)-SfsHkZCWrm^g@$s&%_?m)(f_R~vwE5*_a$;h|ubG+5
zcGx;T_woj_+Bn|5e{TXoNL+MM#3n2A{=Iu&x|8K0s4_S^IjM at Y?2~c_FQ7^wK-PAV
z5EJ{`n>S#-kBNy<Qc~h)WMYVaui3Ajsk+W at xcT*9Zwr-5M@#$t`}a!EpX6I)dBw%s
zjrK{2i6Sy`hX*GNs60JZ{qQipC`3gU-}dl0ob8AUs9_ftW_6`bQ@(rm^UzQl1=-M&
zQwXb>grI9sbd%DR3!gPU-uwLZzIGJexwsC~=n-6;OKRPx3>Eb?G~Qf`T$3m$Wa{H1
zzK9btNi|DW8(TXsDfDs4X=P;vmc8TLY`dCp+*0Mkov!ls6!*KcVPRp$IqK~l9iHyG
zXRqMfj#o|-Fk)0E at RX#-1^$3cQx~qxMMZT-CZ)W*yr{_8%}tA<u(UL-FS<UhZq8xe
z%)%m#-Pyn({@uH;LmBF!;o-z?T at dKrym?@)MQJ+0Z)j-9pc8Ll{id0ZSW;eoYwtkc
zXF|O}jh~t+H>t+JeAnFENZEgIa*Z&3e$VGYjKba(y5Qho%I^&CxBXTku7!lO?%{vw
zNa2%)t&L37{(Dt>g^%~{Cf=g)Js=Dm92``T-#vwiNkT$md)*qpa8V}uPF0P0Fy6Vz
z$$t4bA;~+i3;GMWZ`_EAi_7j#e*fM9$1o=0B45LGg`y81?mIb|EH*bc`xJlK-7WQf
z85mepP~cOYD*j2ob8gN&M=T+$;^B_s2Jhlx&Ak5*CLgOKC1plKa*<sWX#)3sTgd!r
z&5q8_FK)kstecU+6sE4NJ<{7t({N=jo{I9$yb3%;&CZKe<Jl&`H7*Cc1)U6uxCQYx
zo}PO99ow?pAsOo4#=ho~o?}&>thecj>0EodyA5^UdH2-SJ<SqX6!&F}@pXJDCO{sj
zOoK^EMkblCw6vrq%o~3C<niEZ{kK?jV5h1lxbiS;`n5YbIr*B42C%TQGO9uBZ)<Pw
zOCOi{HSpBwjOmA>)>H&L?3yPa60I`H$bC>}g81c1ZszQ)_Nl?5z{JF)WyP+OENpqx
zm63s=F1}8bGQFj_nLTSTSPB+$B5taMjZM2tqNFMlyf!!_q at J7R{-!-kT6wv4_JE&?
z{($8Llz;T&p;1O;9d_de1^ZFSE;w4nyGu$+vP4+AxTx>EiM`Fp%pA6>f<u*nl5un_
zXfp|!Kw$-(oB2If{2MoJpw7a!3-a5Ktu|xEXW<RgX5S%tQ*OHM@`@rn#Ysv^O1*T%
z>N~}(stWuYZ4S4A%u;=cx1{WL-NfcX|31cR=MqLC&qF4%y&p?a`wu>Mbs1>m at 0eYD
z;kVy2(b6L2>RPJ%)b-B$_wT#9x;7}(Mo5qhxsp^>CEVwB!mGLdma%b?!>8@(*~Y*P
zp6}~Ja><;PXX=B3f_i$CCr6mK0L#%jHyRlmH-Fol>rQrF8ME7DFS$`?QzX7j6^!xo
z#7`@fZg&5YQ=^WSoLqawl7T;@QUURh^t3c7Ik`&4fV}$W6ifCbnF-6MBh+b&N=oRz
zK6>=1*m7ZIC4!jTqL2jQn9DBY-jNu4S6AX6cA8=2r%%FS=(T8TZdS-XVJVYqkW*S3
z85DHYlX_!ggD}j_%1S0lO<6f5o8Rx1qk}_YVxmMNB(+7SJwF0g{~Ht%*Liu>x=c+>
z{K=LV7x(Mi?jLwm^?dH_t*<zSq-E+ZGcq2!qRL8^_`d#rXFEFuU0oK9-91lQ4cg+-
zWr&t%9{xPk;Z0PQp_ZrdC6J2mo>Pt?A|u0lqouC?Swl@&j{^V2x@$#5L<9iN1{(r=
ze5q|Up0C%1gu;o>o;^#xI(Chj*?nd&jG2YyyWepPHood9kLD?nFzPfRPpWv at ukrEm
zmU%L;IQ8AW=pO91+?#T^H|2I7w~u6ohnss2^KE=^1C^(HYMcfCVr~D{Lt8IxOb-P#
zNEu;$6W!?xJ0O6?IN12Ms%kjto0u48q2#Ity1x=i)e at WM%upy)M#c?|dFR^h9rvvU
z`&cyk2{|FNY$MZdk|((_F>!mApY$b+;kuxpwT+ExW=afamWN!Aq_Uu6#k=NI%3VwP
zAbV8R_SG=VxDdDYg{dAqBu^sOP?OEd$dHM*IDxZyLCN-=Ww0Z2Yilc at 7|k$vaF?^w
z(t=%o{P+PtF`K(&WJLQ+y8A%SJioQ=5z^eFjE;#B+~x;71rHyvf5~u8MMY+)gzfXa
z%>}h-E&xU=<5fkPnGo~(P2NOJw70)JSvRn83O6Jq#MLphC&4LCC7bLtuD3tLv-G~e
zmoIx51aHybn<`76a1vwY4Aeb%NT+7;?c296V at HFQc-_hW{Sx)#j at j0h7Tk{jHW~uG
zUYow*Viy!-#s;iX>Av^A`^EF;(Q?UcCh6(vO5NuAF+Ph?m+h{TTG%tw508yyDJ$-z
z*u`bV$5VC|kcg?YDb~)+&~BZANCO))Vbh(8UtLp^*xBx)Qg(l9#Ut1Ww3yXq2N)34
zAa(}4eA%GjghB<os{tm1VG(9h1P26QUCj0I at zDzVzVi^U86zX(2nk#bfMkbVzK6i@
zHu=BcD*2y}gV+o&@@oFrO_mO!;t*q-6Qy<!0nYbOuP_YpegRfCK9_PJF#uTGu&O!`
zpo?JCqfbEg0s>XNn(gS3CyNXUmMX%>kT1oU`yN%JHUw8)s>zfQydi`Ag@~PtOIbtX
zfm#93pa%lvSq$j+AKQ2Ov9)DyZ(rqc;Hrj)jg1Y at AEl3APk56p;L^gvLRvbyVXH#5
zY+cEgA3qA8W~wgK*Nfh{a|co^PhNkvUOH7-S(zgiu$9p=XOy~_Si|@4C`HAt>FMdI
zsl=YQ&ez$pZ(T|^7X>8H^V2A6e_~>Sb1-|6;_xd4%)pdhp-mZH$Btze++KBnx`sw`
zd;8()*C($-PQQ7ovfI}OaWrgv1?S}P`uh6d+|tr{r?UEvx-OB!MW-_U?||X}10*NU
ze*1Qf at Vr#&%#2AGw}3!K&)tjZ&)F!WRHNhKZp5 at F^D6ySjcp5`aZ|wCtwcKuSYA^`
zWo6~q*cgSdN6NRgH9KH4q}lNY2M0hE7)CySzQUh!uCK2TFtX^2`r)k1kLBh89kZOS
zUqjeS0R9$oJYj<yfGLN`BIbuo9vK;L;-gD=kdd5h>fzyGX}M7Q0_U&4{(@8wF(;VC
zM;}KL7OBdW%V!6depFNlt`lcjYj%%}2nY%uY{<OqBrfKKN9g4ufrcbOa}(+S6dOYQ
z{m;Lsg=jZ6JX}^$VZBiZ>yIq#!@#?<*;!eo+F6#C#f9dEwt<0xM47*y_)o(eb^l9-
z=gyr2eu(=zCI*-{&W$d at Q2-`^cddD%<OKNmE-Gm0>8W)BdueEBu(Ui)m21A_4Up8o
zuPO at W2NpwUXlPw&a87AOS(%oCf*s_Cw6qNo4#+UHn5!vkE&?!H at Z<qL*GV_r4m+G_
zBdMsARXD;Lv2>U)BnS)Xj#k(&s4kqAh#y~BSzfj=H`mb8QtHsMw6p|fPE(Pc-I0hq
ztIFM-tUI!@ZQUfj<X_E}9QXrPi0RHw+z%Sn)zCm-+RnqGGz$w01|SJPZ`D*BgPkBS
z|K at xUpI?1&bhMTBa(GNkMO76APtnz7;{r`iPEKP71tsUl*EJLsgIlMGfoPclRF4gZ
zEP#iH2hW9$j*gc5>BYf~PoMlf!sM&){F)DF>+&vjPEnRII|r$oPwD-|t8ZjP&CR{3
zUxW)92t4oVsfpdu2rpWKLF=76HNVoRoV7KQdC?nd)VT<_6pa8I+XZK9m?Fg|&FOrw
zdy$wkGRa*6_%?!7Z)oWUukF~k40u6gB(Y?^W~NP%n}>(4xstf}i|#pr>(^gVLIj%G
zgr{s`WHew^7#mBT!0|F5Aa%pn_w43Vo!;o+V3e!tP+uSIQl-mUP4UvBr?8!Abc7$P
z%>nwyRUP%isTybHc5rmGvqi at cA5&C32LS;AU=v)At>u^&T<ctQrg#nDieVf1`T2~s
z!>8a9iVU2b-Q^w%)xXnfS%e~ckU-e$kPv%gmji>}dWfmc!NUU$()NW-U0vOm{{Dor
zSsy;!t$~Mbr}y-iIP&G4$Jw8&I6vQ35+6kKGHPjSPZga+N5OhS6hnDM1 at l)xsMaXW
z9%>y=4KciuuZ+hP)8K=da*B(uTP38Wo2{@*3|JJT-B(fy at xWl{G8a%hzd}H9A^p9f
z^)+Xl6hZP>zV8%I$8pi2k)W#iS#yYDG;rnea)C+xB27&?-D{Yz5&SylI*6n$DOh?h
z`oDz0*4R=SlH{RJ=g}ds&IgGN!fp$&_;mf1*ebpG`_~gYpFDZe=tO_A!cpC5Ba0<;
z)TT(C$+ at h#ZjzUeo0~@16%S~%eTnwY&JJvByQppe=l1q_4DrJH*ZNiC=TjH3WaaRJ
z$i+-j`S at b+wj5om`ASSH<>X?3bH64P(5R#Hm_B!I?JBnO&j8(4V5~qdGrp1OUgJA}
zur|x4NfHJtR;LCDNeskvoe2pE>3Xpzv~+c|($l-srq)~%pTnN?^E=1B0{V!hEDM0B
z8pV#@@rV&~H>HKC#~<&F5PV%+T-5Ief#@|Uq?y(8SXe5ms$y-#BqZmCiw?<OiBYVo
zRH{GR-_8Mysk(v93YY4M(OYli)ASRS%mzf=LxKZ&&h=Py<igO{n5wP7>G4W;C05Ll
zk*TSsm>9A%-Z^tB&PRzJM6cx(OI4+J`kfF}X|xQ&^(r4KXh<ES8rQ)q;<R}4Kp9Aa
z;vI2uOhl-m#k_!Xq*rk0inYO>3 at A09vrVe3^w8J;nxk{A<TAtw+Rn1lyH%4L6tiZ`
zk9!9O%<=~7hU-%NSJ?euzLY9;-BDg_oJPScnV;xp71Opvf$lYNUr}4+^LDad_gv`i
z!u))XgXX}w3;GHwbzkqNv=t;;xw-8@;OiaN>tS2&R#8 at _Cacs}?q%Y(vavBhPZfrz
zp^c5)bC!Z)IxDSrknA8_v=Y8Iafh|jdptWuiR|57iBrr(rM`ZCNfJ&@KU!LR*|#7M
zf|^N0L<H~($c07cYkzCh2W2-qyUx#_-^S^_;k<tRn!B8&WDxC?-ee6GQH}9x$XP-1
zz at b|z+*cc=)x{<t-TIuBz at jxJ_HnsmX_?M1X2B**FR4aR^ZCUy(aGYwIlEU>Brmd)
z9N6!Kb%e2N{<IOn%s$ACIfGJjs~E#nBa(S}g9w(hh&NG2R+jF8womqfjN*t*QA(8A
z)6-9NdAJ})l2M*lNCC;Bu#o2>m7QNu&_%n;VU8etK&t8Pws&x#W`QtaJd)yIX(_F^
z at 8Nmn!i5s{l}u$=J$=2sjwlpmLGxO}qa~1-x>6$VuI)T5<@tw(Vhv2Dv~*}+=C_D)
zVKh`pY1SB}2n!-LJG;NWHhxVfCB^+!d-|op(b2HSioG%AyI#!)LQ`~%n!^12#Nrwy
z(u2-;fM2n%M1$-)nU|Ozx8MO1K+o=4dK}5gxuj{3O>%gC;{QCoM;dXcdi&0uCw4>h
zi-QJwdV03D*^$C!;SgRYuU#XiLnQ><-4}D#`Y>q4z{bY53gqbhd)hD{b?K!RsP_%;
z`lnH%LLD4 at sqO9Usj2iac=!R6x9jI?_qJ95Wzzl at P1?<3E?8MvdB19wUs6q)Vh!2Y
zaF|?r1RD$j(0-fp_w{vQ&qFKafSsKO7pa00A3uH!IOgE<XPctNU8m<wPwfitd3yew
zZjDeAPTs8{*O=d76E!!V!)l}>`s5#?HK9LYF?3I)2L#%7tW!^R8S#vbjpNN4sCtKT
z)lDr#1Y};~NOK9(7Y%0?I{FgB7)6(!@Ml95^{fBRIDASVu5$=K%5Ay%<Htw)vZ!=Q
zNH|;j?i2`gm%+w;4x0nuaK(iiprMc+X(;{0YFqR3X`0sfDwwbo*^^f2q{Mqrwt`o$
z>c%G+$mv^_%3he|{E?iHP+R<$(g1N8;NR!ZPxU at 6ZXXzUZKIIM%*m%j1wq22N|>p0
zDzUC>qr0og>>&Yz1;vzzqN1XRZvEwezYv51nr_GwQ+wfqX;uq-2Ey~cEGZ%tgFyzS
zrs9H=B&4J;wf>qNfb5!Hb>7ykd`SP;#n`2eJ~}$un+I^rLg?V2#w6EpfjtBN{#-X5
z{QxLZN;TodKI19<qDemc`wwG;xVe+G{2kwmO%YCtjMmiD3=Y0&mJIl%qhMiSiHc2@
z-Bs9o%Nlb!eQj<@2TP5HhQ<?PpQu2KfVOeq7zAg^kcH)C>}R*7rKNWbu>gJQ=;%zG
z4Q8RFBu>Q7>Fw+D^@jQZ_X{JD(A(~3RW2JjIB<bl$vTg^PWtHP&9vahU8*30oDTQ!
z-=1lUQa`s6FBj-zE~x at Ei6HZGz$L-?xw+0!Rh6Zc6+gTAl_DPrqJC;gwWQ*%RCvmD
zlWP(xsA`a{xY8;QZ2?nPb<8d-E?(~b{ludqaIf=O^64oIH;H;wacCc_J04=V2ym1<
zs5zCa5z_eP`OhFdUJn3T{^?Vw-XJAE!|1}Ms<N`Tu+Ouny;R1KwXAux03DIu)5fHI
zPVI9fg{1o16-p{M6hHqI{pQV^sVO6Nxicvx*HWce$%AcXr>7;0lGfq!rOHRLiZ>#w
zyg8Cpq^V^sk8$&*0zyvJ+hpS)9)ISG7O4KIolM-xKV-gXHHCcys1Uw^Fc^f&0Ao4&
z(QEsG0L8)a- at k)Dp<nW^S9;y}vbYEuE+aR0uSs55M8x<$m0#c^cvhwb^?wb=jf9)-
z9lMQabUB=83beDZ+0)l2r7}O<uBD~ba4=0SY<2dy)!E0usi?{S$mSL6k(sKNHE*<G
zQ-+L>#HXf8$|)Th#|4sn|HM0w)T5TYYHMqO9l+c~wfz8nTXJx0Ed0Yj*MDV4n^|VJ
zuU&Qps6`qc6a<JQIyBVb!2_rx(Q|*(z+5Nh%8BGbIXTfjetn;|(F_YsB&*5ta&v=Y
zVh+C6VzSd+<T#VQ0f{j!jiG9s;`B+#HZ;bLj=dmu$N9i|A6#;BoC4&5mZm#8I~CXn
zLlptQGa#x~>N`qREPW9kvggW-WG4Bi(DdD<@Bcjsnq%YP;VIW;P1v*-TOK$f2_H6o
zRRC3JJUJJamh2Fgi*ZI0Fc&D$JsGeV65=*DHUM1NT3fqsuR_i2Z9#!b#ltKAB1KMu
zG7V{8hu#MuN>1I{{yr&)7~Zu+6oZUYvHxZO*6!{xZYN;1NC+5Bt?wQD-?61OkUwDo
zF#W8ZvS~d$^mu)KRDMuT{7~XFC*NFP_gv4V>LP<9*uT2^>gaRWpfaN1kB^TJ$$^>;
zcDkM(g;OGXX<l9e`8#6gJwb#~b$62hW`t@>f8PZ$qi$b7hIM31<g;diJUsYC0S8ip
zWkhrT(%+7V15krk_gn;G4-XITUUPudJJAc;Mb~)wgG)RW|EGk?*ep6WHhiP9QYeJD
z#@kAhkdW{dB?ACSZB0$z<^xJMH at A7BX~BpCGPI_rUm`h?C3{E!Ktrh>T}E3a47z&P
zsNEoknvRYnqRiOT^o4c&hq5xp-*l=6p;M<-|DWiT1BA)}Q)ST^wh}#RK%{!|$=#{A
zjSUSP92{0WQTtyu<n<jLRcL-}Y+QTbtI2~ORBu>7<7^1T=lTS!WG$_zQ5(;-iD!1}
zC(cNB2Mcj>8gi9D-S$jJM at OSO_tXkj>aD{rmlU@<hu0s>lxZ`uuppI0ujWycp~()M
zYhmO*F7B{~j>A4<7+rFLRR>IERD^<Jr{)$@JbvI%xWv0Or(ZPY<3IplSi9>x>t8^;
zFfytecm!DE%+D4#w#LRr#XGldeY`VDa-mR-6&@2%xFwk^gqhq|nZx%>%FJvl&p4yt
zCvMI7UGUVIg*E}G#ciDU448Z}$iSs)J4KC~Y~jR<t^2kDvk1#T*8<u23a*MzL3u<Y
zI5sB6`k~$S3 at t%{OGY83teiODXhY-Ca?TmG$y<e9hB48lP|HLL<5fl|d_U3ndC8O@
z$l;)MIDYV;o0<838F{CSj2zyXXSahiEac=&>)pA@@5^ETs-N!Bgsi&=;6el`EiN7y
z9zHj`=Jen}NmiCzS-W-e#~R;8i`KfS9!varV}gQGx#1{HI)d}3CMz$)2F5A-bD1(S
z>=$=r{ee15IzUM<TQg5H)0LIm2lQI)gZ*s at gec_BR1#_kSZK``oVay7=!gM`i;Mq{
z6aX!atr{sj*+QzQbHV4w`r^K2)>0;P&E6PP at 3tw@V!}7ZlQ+zdjg5sOVM|9xf4`}j
zS<{@ukQLN?_yy}}1S6<KYqVMVi)_aY!noN>nkE#6&$=C>{62b)o|5<7khXM7VNp@~
zfhhbxO*ko}GZE1cbNf?5nn~)_`BQaAD_`Woi at mUpZ$D|Fya~YFP*k*hIjsY=3qjSt
zFYr?5N4*{0{Km;O*9x3(?C7`1zk2uXT}w;Lu*rc`!3<Pb1)GwU+IIdFW(T+HC-w9}
zu2 at bZ%=F}iNia7z2Lfjo8WSCDG_HcArI&-_;~i~n2fLdKnYkWGLzV!G_0-i}tO(Ky
z3!SX3+o*{ho%`K{+{G5$?im{1d1_@~Frk|CP)N_!br(Ln))id`zj>SuUAygRyzI~V
z%}1xg<A9%!Z_p$!RU at vsS+by-@jKSX6pbKm5$pEEA@%dv*itm$i{R*Ku4=#$1f>xV
zwD4!-f#OSVOM#D*y_%#UJ%38C!qvEFIO$XfXTa3z>IaC|WK`TKBIXFg;gB;mGGbz7
zrK6!q4Z9y48y^0?RZJ{KZgzLq)y^)b2b36V(hr8cMCmw+VVB{?I|){2hVKY2{XwR;
zK<UZ!RaR9UYvzzbvXWPF;OnDWZrHYFBD$7q=p*KR^IHekc^n+e7pJM17*(+pqBv7|
z{9*NjMFC3TuvHQgsDiFe-i{BX5cVZZ{cBMuP9CLF+N5o0m_W*UA~9b`P!PhA^_V=B
zfu`cp3mgg-78a2x>I_#!G|!>x^}PZbBR4N^`eYRp)%5hT{a%RHbAx&`JTz2yC8-dI
zk;*%C5imxLE*GNVUrA|N6}#2Hk~OseqS85UWqD*ZvNAB>zPZ~88RcN^1>~5Z*pyAe
zJQ)jbtM>9CHqfs8(_e}}30K(#DAm3gZ<>j*^1Xi-bC-IIy5s|<K-X*9!u(IQT>L`$
z&_i#}j9<lE&|)uLx&+H~yvj4sHiLnle&@uOjwT(1j$phZ^ro4bo%KB2A50;JvN@#~
zrR0$!x%=+js7>JRXSzR=dj21kTdH{c(<dEl*a#i2lQL+ls?z$J2q*%?pG)qno!b5&
zLXY=@R8{`F&cR5GyQinHs&YnavA<3(fOT_S(;lIeby%CAE3H{~x3kRM!$x at iO@sSD
zEtQoMg&%^k<SMo@%>M9jdf_QGV5n)mCP7b)>(j1U*wgktSJ2e7$jD4cxZ~Naa(Zv~
zXI-5Lu)32X?RAbo*p*8~fCpLbr5?$oNac1uO8 at K`KdaOa>X9Cr#6);On@}o9+x0L&
z2GisNwI=U!UwYzmW6>a}6=CEA-8hLv#xDv~RcSp;%4~#}b?*912sRi(rLu>!@<<U)
z+5CG%`r7G-z!t$j0Yokax3ErjU#x-!5q*D^Z#U|6Gdzfc4E--T9*M3Eu?Sx|mzABJ
z{%w2P1v1)c(3I~QIlv at jbf#E>P3dw0){U|c{0Tp9wM)l%BRqr|(dfXLl~q=D<MP>N
zigCyf44{G)r>9G6-|7+-5qZ)h4Zx{@lG39}uk9+)nO0wwJ3TWpX#vsXm%4)|5Nh%B
z(jRK!w*&&eDAwlIut=i+xYvcfpb4pDgUxR5#>t?xDKFSL=E_Tj%lEGX)1;Ovn)cV!
z)T|@!%~MDnpIvu6s at kRr^4Ir at iHqmu<!#RMh8zv|OmuWXbasmM6s0f%(7*UZMc>O&
zNBtMZ at o?`)ruR#!EwtJ?A#ZS1{~uGz&dC`P9nEz1+N1P1dj%*LxIT*Eij0V$3y|vm
zn_J|kIBog%B3qYIvCGt4Gu!aelC+c*sze*`cT2~{WleMQ)ShftLZUFkG=$7VU5-%V
zVR_A&$_c!)yhj71uO at mfZf;SQ??^2K$OXnxQpCW0^y7yUJ6}OCqM2j3^pR3f^!N7<
zFZ}>XWZNm}iJO?ag8U%@_H7y`2aV3e^1)UEChe at K0<~dRQ)BS1QBggy+}qx1^xPL`
z=i4DbE+ipvR8(1ccqn7ULQn70y0@(#1L?ckb`~8)xsM`qrdv at _5sg)WCMydIF){JR
zR($;@@LFZQ<XTR;YO%RIdV`ONipuc80}ZYPKqZiGEk0|Jz3zYO)0-azu at 2PM)hBNI
zfP8!#nyV0eP;ILZuBjV0_Mq%wAV+EB${O%*){yP7Of~Vle6k^)C@(J$sm{&S_2tW#
zk3YT*g&Ml52F$Az7G918QVysG_zLz95J)z+%&uHSTL70&*|A2nCRL?dC1z)57Zs^_
zPVH=O7pJ61cq)CUs?zhkUGnbTEr+`V8JU^AQ4b~5-OYx|Pp!ZI*@58^92Q0+*3^M^
zgSjj_I5|PtRJ0BBeC}NhdHIh0{e7TR5TT(O3-G*`E|i9S at v1q@_SvVmua=Ew3G<Vs
zKevqPlX$kUumCt4(B1wbLJPfS<v?s2UkQ{UXk=hw;(BjnWOSYMC0GNXzyn64gd%Gz
zt8Xb!>#<c_fH_U0bhK&<WW{S1u#t(w(AHqWpR60Gsd+qPW$olt2nc#n!q5Q`ByMwi
z^v_I9iL3<BLfQoCqpNj?Fi7^r)l6k&<<&g2KP~nKq)zvDOXxa?r{B-EC|+0hsQ9CO
zD<F?ePC)^<Rc&E_6kGhtg;yd~<Kw`Wy1H@;3*W~U!7a<l%S*fJ>BUJROpO^T_dZnM
zvGa45qO0=!+1|l&b$dbY=WZi~XVcMx9?gT2JcntHIyfByT1Rv9^0v0N0>qb>mwnwd
zGW%cw0~Sh4y>Tm=iJrcB8ij>}Bb{GasVm?5pkfTfGx*4mkV{7-;gu91axM^j^Yij*
zaaa_-xFME23?JX?6-`ARUtR(;20IB4dY+I92K+nv9-(;u{vMIvF)#$E1}2fOR}}OE
zk(YakJQE~`uNbkH|Npqi7rtCDIAIFlgolS0e?1n<wz!6|`tav$t^Jp!;i8dM40*yI
zE*LJAv}&4~yZEszpaVfAa{Xk;2^W0YM#2txB1Cw&=a1>pf-b!p3al!fLLv#_<fAwa
zWJdhg0=@s#%bu2f0XP6TcBXN0c^RaZk+dOD=%LyNZ-EQRup9%Q>U=Bl8Rw6FzP=(e
zGT2b`{LO8h(A6#G#f1|vRWQLF{ZkN4R`kMb2F$Kqmbx3lDXbxRQ4#>8e*)kVaD4RC
z*4}{v<bxV=9AGAKgd`+oo+_me66C9=DCPSWHcLmBiy1%t_R+?!uh_%gR!<!Y0~rJe
zxRoJQWWm)b%ktd_DOvF&C94>uWL5j)2M-ka&LhuIX8C7RTU&3L0AGw;*mWKr5Hi3R
z%D}(?W9tnKjt7ECHo57lB6a10H&gt>B*@&<GoarAHL at wHa#_1=eTKN8lO!^lYj({g
zL)8*YCm`FbHKk~D1pt|bn}EC}o#l{FQZiUB3Z|s8evtV6D?JW0u~V|M)jGk8*wWnB
z(<4#Pl{LHs)?40Kx1Nx&LkV><B8oI=fOo&9YiNp6#oWY1EFOfdcp=;ijKOsf0zv<S
zG;sG?VjvR(gJKtcfwzZ-{@*36QIq#=E{XeC3^hGyW64!H`Z?e$>>Y~h`i~tThCtO>
zvj)tHoVG|v*kv_v1?gLX{u`=f!|gq;ELaz3S>jD{)Tx<N>9~`Vl88tGTys%0G_D>V
z<XiIV+uQ0E-Vb^4Lrx&6vLs5|&dzS&<syR)$b6>BzBX1?54Tr8CQ3}Tp2fu<+{Ft~
zy7Z_eOQeUIiN`z^uP>mWfcuQ8v9Zpujk9wRDKG}aQ)#y2<N9`PeMh&#H3|DtNb9Fh
zJvw2Alq6U;G|EN~{W|<q4ir1uJX;LnJP#K1rpHt8f-R>!e{Oj~@y{^zN9{}th3HoF
zp5D(*y`Mj9fBq2uxh@>YwpI0WugdU%=0_B2nzf-x4U1f0t0XFVr+260=e~S%fVThl
zGW!#cZcb6HiU%_a21efC<=u)x{hSm&Ovuky_UNR(o3&5*YD7J-!$WVmsmZ%_`mEcG
zi&n^`LEmYj`JGhapYsa~oBP at sltHuv(l$0`C^5`n8^Yet)UE1IP*-A%YsSW6&E9Cs
zpTWVwadvc+yu{7Tjf)q+scV#KZ)F9HgSGEWr1p#LpNB7<@M(poJ$E8JgED}Lr4$IZ
zk9Z!=dWMg99`t)w%#L{OCVRR*ErF^~kl#piKqTXdmb at 1CW!kL~kFlAOeHNGfs<t+J
z*@on(sOWEgB1MITlz|UHs5A1ZYx-=te?c>Y(%A+z5rkV=T>M!B`^Dr?Mw87qCVTLk
zPTkv)zQbe<&jVOdJSfCq)^p`IwYHYEVigwlbadQ&PMe(Ay&cUj6jIh3JyKomwV`x)
z+(&bGrImYUVWM;9aJi}ucVVS#d`qqL!SZBur%TEX+04`g*mhDz#(6odV)w3_c2dm0
zsWJ4Z!DZ~9dehk^+YXv=KA5yJ%xrC0VPdQzr99>qw#YyEjg&M4G@&mD{*X`e6=14m
zo-$TT^i-AC{Jd<Ws`NM_qbD;d?9ik$-R)=cz92CH!gBK&F&#9~Kdc9^*T9c9xWrzh
zH7rl at iBwQJ*9vv6O%!i>?+|#@1d72I+g0VhXCmXTDU#VjKz)G-%aRLUKPgnx=c9Kk
zm`Qbqh6V=MG}U^T4kn(V3D{FGKG?d9h9)AGpA^lDX3>Glm#iosq at 9?bcpYa2)*pQ>
zw>RRw`Hv7M`jPo&bwt+2)s-KDld!O!?KeIyuEens5P8o<@qgbtu*g&=3=*x;^*Ze*
z#zTDItW at VmV4wgvnbHE`0ko0o8fn{rvm836Q6PGc?3aQV=aW7sd3Ua`Cp+%zSxRrk
z%;6=~>@BH-uKb<mv=YGt?B~`?#^fq$S{4H%BXwxMlnX4A4bP8)mA2>nR?_GS*RH0`
zZ at TW#pMZex1<VQugn6JTL*Krcks3o;5Q<dj=)SB0EXP7S_lL{Cz`%v8QLkSYtI)@F
zM8w8|t+?hWm&hzD-1BQ2RrQEl8hZ*TCdCh1HYFp2OGCpOF{5|*RUK|-_j|nk3&e1A
z(h(dRcb%b-J at q>Y35tOOPF868d^I7?e&{hoGjDMDl6)RX%xn!OgpCnQ9y?2 at r>OWH
zQ$S~G)(>rRUp11&jztm+<Sh9BgbA$*oF0COe<Z9U??L{BlwCT?-)tqn6E}1u{Q4Cl
z(*JoOqSXI>6Y~8pc#W3nA<wZNrT^+FTs%lQ$e&q$A%g$#CImVE`vONVVk at b8dW0VS
z9>m|{`fqPK0{BNGIJ&?W;t+5g?4P*81G{v87J!LMB5krz^tlUufRVn(0YU)-FCz47
zc?l~iDk7Bt3~H}tFry+yN|-B{FhqOvX$I?xsAxTC7Ah)Wc17AP01yaLgZm50UP5sz
zs!2zlO?WtnhYIF~{Q1FwdvZ6xR3h=gf23>pBU=e(^-*^Ao1L11q6E4V0t8InsHi9u
z5$35=6It&7PFoC&jWr-o=8A%B`^wgWZ5Lor;snTu;U^%Js%(t^JQ%;h&mS!}3$(R0
zf)#Ev+e2s~BQ+J86jalpN&wiCv2A{FQASqw;P9XfxZem!ht~IUaxa4s8Vc1sQJL}a
zw;9w#DTl+P5~b5h^!V1YvRKfQiQ7B%6vWXr>Y!wRj6PuVDAi^;xSb*r5*#d&26esA
zF2FuMr=Vj-%ErbftKJ}J1O_Lis;L=CJx>LG&O|`m1y9E-+)QI>B;rNX)YR(Nsb7J_
z$z)&!Ugx`tVDz38TKH!xjn_#YzIWg`a_#*)*?s?pPIj9`O1nO5qQ}_zl2jSgq$I&i
zl}e?uJ2Vve6lx})@}7df>_cX{L4jq_u%pexlvoKt^aG?WY=(#C^Rz^p<yUI)nE>D+
zq0D9D<kV-T93;gBz$PMsU`|)eG*>gT-$e3CTAXMhNdaBa;TfVx4*}Z#o}P`yJX1Tn
zpz$kct@$zNkDDizqOJaw2O#9-?3+U>*gr}I+~LisDYajVd8Dlr<Dux#9~m7Pa_Qo}
zXo%ZWdlYO#&j&x6lD_bsMpjwTO=gGg?8{cRwv3Hw+1b4844u~{p=;)BtBSs{CJ-^)
zED&*dS|`_1zCoD_T46v`%5duCFS*A?xU~aXvS7O-s^cMOwy-&5SmZ(_py~;sx8S|=
z-MiVRMPf)UEh$l618Oc?*8lBW3ZWM0WJs6}(8TAq1eV#+qMq3YSXq5Ztg?*3#<YiH
zJ>|mblZnrPBsQABr9qB9jZ7&F)&xwwpJb{o at Pi+d-_g!apNnns+}X#c-?W+7myN=`
z8c0Jy(cD~;LO?)(sU-M1C+E6nKaEp38w7RT#7uB(D%mIut0+Bha4!X3l6ZpGKka$q
z^R_lwbe#&r<t(jp1Rcd*z|$KKG``Ny)(CB0xh at 2L)&2$dr?^iLi3{0-?jf)P{!?R-
z_GO?}VOeAp6ypMn2zwK0f-1g^O3UneQgSj>%mw6pK29O=0yZmd)T1cV`bH?4?=FwF
zrDkM|3=g~I|M`?#@lr=kN7aVBCBebCm6JI7zhpLyR}d#IoI{V<tI-k#d(ifnL4r`z
zi{>?wlhA*Z08s^9JNQ?Z5fZQe({D!%Yro!adgXclesvN$ia{A=8aOuC6>W-OM|pr=
z?95AtJ?m6f(t!-#%hVcmBu-T6%7djBI)koVj*O1})YP;+I!aDL0``{)p(C!E-3;~S
z*_oNKrOS~`+The&S$^Q|eo#|$e2WMf%xa<x?Bn)n6ma5#z+{CX5G8<bSmh0tmX*<f
z=+R|SFi$2d+hPH7dQx#HR20n2%p_!G0|aKk2m;pX9O at NNh!q)*)QhJpfS_rY7@!+s
z`U4mW!@}@()GWF+V2*$&b+HFFu1_}NjH>YI)_lCT+MBNCRHkFWR&oVRCIvn;`$U31
zD0L5vaauu%#iKR~yzI%qdF+V8gkVki8tU at +|6Ap7-2J0kz+A=SgS(QMm33uq4z>|)
zL9kS0RFv&NRwy$gBg_iO<Utc%S^W##r6B(OfRsSJxW40%Eiwb{sOfF6<EMK5vaviy
zKdaSOv})?=DbZr~4<BlSXXtjqZ_B8*mKGzAp(0N(+E%K|y|S5n=};1!-l$v&5O|;&
z(m^@$@cVQt)^H~HgUHBw6*`NdInONbazM8!-GCJj9u(}hH|C&Z8qxyxJ!?x#&Z=MY
zkl5_=_DIOpNCrPW6jJ at xybms4zMNlJm}VLY4OccrD@#jnLIV=>^Lwrt5vM|d)cyW_
zHoztvYWx>|oK%tz)EUm|m`#VM;+tALw6!v>qAbFE;q<qWdu-qCUso;$d-!D_LYkTc
z3y%eG at d*fix at 5rv^KNdg^1NvUAz>Tq90q`h<@wpXCNPj(yn@%()O4YQ9%grGX>@F?
z??om^xyDAc#<dqF=|P6E6`Wtdp0EZ-I6uQzV0t8ljLT+=PEZOlF?s*;Ip{;LU&G?L
zt5cxP1gWTWRxVkIIn&Sa7I|;^<(o`nmF}&!>KI<h=BV#ly0WZ)J^2Vuo3LxQ4FyaP
zZKe;p0>Lc8#Y)lueA3R93FMFv2qR4n2X#thRQLs8BCB- at Fcx;-r6x18w(h0ZmmYzp
zJ4hDu79Jjza&eK7U4nt|abe9qRh55jb6T|HLfmv|q3s_XB|G~J?itDq$_7B#)YSUH
zLy`!NR=@ES6&uiCp$6emRh6C1syfIvR{p?HTP^w3llo7vD at 2>13wE<xhU&=nI^7kW
z53L-Ol}WKhy2DxDVqS-nt{xt^<;Zsy191UYr at K>{G?))4-vjezsL0H;HZZuYMoCOp
z4<ucdr73}fPt5Ym7(f?rEvhqxgF9bvt^f)Vxdulr*Yg*iD9q_*7eN-U`v!fLFe1=|
zL|@n7CY_3E3l9y2Ob7DLrGmGoLrA}%N}j)X5vDe0USc^M^X84DoE(0$l5IT?7ng)a
zMY()CbScQU%eC7<6c|vML^sZ4BMy(h^bz|2M6<3bug=}(55U%etOW;u*V4L}8CXhQ
z{S+JulWw=s4J+WScf3Ave at 4&u(DA4b*sx;!k{>wZz-6kw-goq(d#FI0{IT)zK&`Y1
zMv}A7Jkpybv!mrqr%F4b*f=<XBO_g1T$+A0fK(q9(Ut3UeiTJU|EooK8YTxKCHbCN
zMNv_5tmByd;J7IYkd)$jb at j~=?v1T2X{@b%LBtCJa9L)#Z)#>{zN3r(zX%!|ByFG^
zFytgBi%Y8a<kCWEO!8vcDAb=XnV=rste#wh<Osq(IFOc%$jHbj{f>Hz6<49PxIyPa
z{11 at Hl`KG^2;7VOM|bhj*vM#Ar1I*9fhn;Zs}PMEUK$%33igr;)a*kbmI8ZrzZ*D1
zI5-TLAk?#9gBty-&1G)ht=-_o{0HD1K_#Fr8G0IQ<^gnyM;mQl{en(jZjkarPDrqY
zFtV^<58swbf(BGD_pRsBf&e}z9&TXO at HpNXS9M(I@{5rB3JRSn`2<wdOzoy)@@w^a
z4{g$iu!aq$JeILaq^yL>ii?|8&LXoK;@1sLF!7OhA(kbgZM3Pf12)De;Jo^B_`Ma0
zCJ9-hk<l+3=4WFvsyTmr6<P at Z#|KYbnDocLuK?}|k=`fDR4`!x80Wu$b7a^eB#r0t
zSyBA_L90I`TQkJ3SAP0g>AT|WGxn%09LPzCZMDh*1tM!a7!u=EVOPL9YIp*u1wwfK
zG`LWE7A`98&#y2p<=X-emQ=THdQV;sKwQrfm9v}L*9 at Vfn6+tekZ56wd{y}LuZtE{
zgB7%yxq#mqfRFGjz&;QQhT?n1%Hn0g_ at vMp$tEO}wSgGinV(+@^>9DfRWXi<ivv|w
zmw0qwpm=vL3iI(v%7mO<qMhZm;uwY2PYKXylo&?L&(B}X3%U8|$qNb!#y}{AVo?z(
z88I=6KL#*2l;7oTBs-=h?5;<&Zh{!8ZY=xCqJF=}NnO#?&8>`s=i}@;IRAWJLC?lP
zOwflSB1%0Q at 1YJ5wE3X_Izs(D(te$$nW}GZAA&Zi$Y8_Hth|^5eQW_`#RG}`3)8=P
zY3}8FU;u)HI3y-6K6&j1A7682I^Yiw8U6cknj0FPpB}8MtIL$yc~}Vv2D0=r7Hk%1
zN0{Z-95z_La=>@}dP-_)iAoUE_M(`!Cx2ZSKJwQ`<66Ik>Z86m?ddzqXVF*)%!c>g
z9``<K$fm^%j5sR4b&hu-SOh^XNBa?(C4|KyKmL!uExriugHwl3o}6I$3!WchwZw(h
z2;v_s2AIzB@`qrmbS}Dv#zo%|h)Rpu5qVUk*ULyOEL5E at DK8IQg%TdLwXQ7x0OMjY
zm9P+c3{PeeACQgBGT3}q3N_Pvcgx&#_4KMfe5jVc07I*u`Xb5xr$M@{`yUO`pyda1
zfS;=+Y3qQCJ{^K$_=Mv8#00dTUImfn`|G?s&Yap5_jAu~gNPWS__sBfcxA{54-^2D
zIyf7^JiO0XFqZ*y1n!f$*Nu}qYm+aQ)BfE;t$pEWu3YYk$f~NT(Xa^%XJ<+rS$ki1
zfBpLIdVmxKIXQkkJ7mRwch3Z2O2j}bv$u@!{}CeUErHIMPtc76ZHiCbh2oaOj%w<9
z8XEMQP&xu47p3=mG!kdeoeS$W1DOXAwat|CtE#G!l0=_ at ce~z1rbVm^DXk5s&s0zj
zf<(k09`yYAb68_!Veg^lj;eLCw6K76>8Kp}Iro|gJ#lh}+<!Oe4)^t$c-$fn2i_wb
z%LqEX0qXk-#f7M(BpQ!;5KdO>F5YVH0HJaxPYxLQo47cF$%}jR*RDb8SLxuo^X}EC
z&G_&zCq0QI6b%)c{1KO#!_xk~0EhH{KuD4KN%52x;N+Y=_2kxz+IKa-O}Jg9>I73k
zpQMk~O~9tz_XSz^%N+DULUEh=cw#&}UP at l5XI4~H3=a?Qe(3F0De(W4Xhmp%7zGsa
zp!foPj|TKXF2k_v?B=ub^46a(`Q9Kd8%6ghrzYrIZURfGqg7F3#&3m1x?BRSjM57R
zI<LeHP^e1VV~75cd7x8)!F!(fo8Do(Hn?ctCnu+iTqK at k2a-6SGxOyO_(c*P46*@I
z3g|X$pyyp at 7ZYB)3_bmINCPE6;GD%|`MAUrfS&njtb8CH;U_EWaC at 9Lwy==e66pKu
z0rim~5#q0a-rr`}ziZOqMwRIThg7|74?_{$6F9e^wAJ5FkZwf?ha|9Pr7N93e_o>C
zmj#Vj16ssS9zT|<9T@`hfM#7$&w8KbFkS^zu1_G1#y{wZdAYct(>S3+&e0rtk?UX?
z=_P^2Dk~%NO-f`k(FGjc&A)I66lm^+Tw=lp6*((*V`y{~Pa{V&6T&tJuJ^|jhwOf6
zS-NTfMkQPr4s>Me at A1OH6wjEaFTU|(x>f_>c<MhPp^)m{4qm#%4Bat0Q%Ep$rgXE=
znQFS2w#I#$Ppn;SX&G<fF`K4%?jQIQ8W}=zb9o<q{0T?aHNYas7R9}n at 5CQ7L$On)
zRrl4y+5Si-%29pXU~p9A>C?M@#Q#<a#TUTz7e~8Q7BxIRPQV+Wef9n&I6(k<F+l|{
zL7Kuayq*$eu5?eqg?_c}3eeFd7Z!#?&PPY5<+2iB&8ZLW-Mg|(yt}uT^c-^sg at uTf
zz&r`6G&3_Y%Avs?>M;-2#Y}+$f|?-_-)jNqtbi{>>NVsmw1o8Nvd=DyJt43&=)hL&
z`1DEUb at N}xj|DbTZGuh(;lP3}gcf8U;MHJ{N&JE|@9t56`^gyHq6Cde2QTHItkILf
zPecJG1&eP$J%7yz^wJuD`3A~i)ca814x`zHHh+;YsPiz)fkjB|c at h51%uHhF8fUu#
zJg|#+f4X(WLcncF at B*s7A at 8ANO{3$!BVYA`ou8k910<v?`U-+7QgdHGm<Lu9FbCTV
zH=q==8H?{%YcIO54hoSRe0Wd~4*zht8236FpL>&@$S{bclJs*=Pa=heZw^t^rHYUb
zyHYQ&M?ZxymK9$?cvas{2oJ`Ly~puVia>9_ezq`e^h2P+_-w`1e&04zsHW`bfLk2$
z=-O-T*PQevL?k3ILQZn0^a2|MA#I8~X1BIV8+Hd(bSd!BS}Zu{9%o(LSlL0kjg8ke
zN-pnbq4Qpei;SGC6dx(}e`zX;21)HnZ+Nl3F}NF^f?L2L+-9h5O8FV+EBaXUtUXv@
z_In-Tb`9xQhBOLhKbWkD``|tI^=*(;UP`)H)I1GvH}h6c3(t}kgfWYX(cW>2 at _DF!
z$RIU^VyG$jf^QcD%ru7rITph64es>7*VO5 at zWluP>$+us8QktlfAfZDv*8X<VqJ`6
zlM*01y(Bm_K%09kkMZ)BK*LXxxWQ8k_UN}8(khG^|7;3Y^YmQ5`Rb+-VjUFr385Ui
z at uwkZV}8~zAKejz*a2ZSZyNab0m=jEo+nDSTsEU=o4gjps>CvMqxTwlL~B8Qej>9}
z6`>t72p<3ptY1t!@I$-}%Q*uEu=$Hu!SJ|ygG%3)Q>1d_3Z9f;R}tbCJd>>3|Et?)
z6uNy>7?Ext6xfxKeZr<W&P(aUyHlydR7YE(%ld0D&?S80zJmiCBf*2Tqzr<i?uQQe
zLSWwks*?B*suI%Wi(F738?n1#&UJkJ_{Z+Hd}NP4`aIB>(f2FR`6w+h at hRDxE9XlX
zkuz&x$4huUg2OKmt07E?fG%*+vEy}Oo(eeVIwAs}kjIUtGl;F_*N^Z<1kb?WkT2x;
za6k?D{a->74A at Jrer0QT$%!ax#Z=4H?t0O1n{gxhR$Tgy`ohK}RbXL}2hMtwf at c}}
zeCh+?6X9ZCc5<t#;-aFU-Mjxrs`dT*ABu{$JY4?)l8_hu10><L{CALKUZA--qd;rS
z4UbAuTS`Y;n+v4C_wR}Ap~V~ISJ_?sv(LsV+~|_PDm>K$&MnwXQTgez3fR(;l8}0W
zJd=20;NdH)t6w97XACF1eAWs3w_oub*kuuS0*-%5Gc>iFoSB_1z?1Za1m}3ko?k%V
za<al4*j(bT&luMt%_C`PP*{3&^KEgldU71nFDw`GG6tN~5fNJ(8_);tqbW%PoQ2m)
zt;Ltt$<YzyFbO;J{)Nr?5isIFg7pM7wFZ{mmXuLePL9G$5Eessf#?92Y-2tBYb{Vi
zSZXonf_w=*wv=4|Jod$alh&AO4x-!AlFGWSn8-VSMMB9tcWMC=zLe^QT6Bqi86Zh8
zkMc7RZ$VRlb$Gnp?&8U)w)e+RoH!9D<PIvZVhM0hXz-pPIC-=d$Z;=*f~BS-PIw^{
z+_TV(#7>?QchrouDZ}}@3ppe=2st6;naoiqGFf`4!<EG|?_<f!3U%!2z|WcR+BY3B
zQ;UlJ?nr|D_6(kvNT<JeT9RW9OVh!BJwzriKfi8;3l>By8O#H6!#5d_(;!evXxkt3
zF=ygv>FB7mHp#R+zuKUru1?6!2u4j(M%9SAVc1d*$~7Q?!IY154lDt2fkZ at xrIpUh
z&W?1^m0IMegB8%BBStRyNU!SoEf}$)Ked~+plV+fk&JFBF#gYq(I+#L34L0!Zh3)c
zP~FH$fm4S_3N4xTpsi@`CN$p3oza?@aVqQY>r+;PH0ik8(-XS<AmiNkyR>v^yT6Zs
z0q?4*DGF%7ySrxQ=Jbq=(lnr+LG>E$Kynv^+wB0&X;m$)8-jvMTYG!Ey9QxclVB2R
zaCG#At3rF)`qjq&uh6J?S3(Lsus=;C<9`lP>9T}_RE+A64pOPUaw?&#Lf2MQ^qF at j
z#IlTBeIw|NWg}7o|Mo`6l>-(FYD$?u$D%w4iw%dBU{1-$r$H@$Tupd9`c<y$gScoo
zwJA0_CVFyYBswR(q5sMhA)j7BnOerV8Z#`kK^kNAve*K&iA6_~MzzsalJH&JJ3Tlu
z0<{f!Ny#(P1a=Ws>NY^=Rl?R}ub|l`#+4wk1z4}rjc~GqlZVF`)SVyJPjyma6YLnz
z0kH>Ws&2bl_ZvZd;yOA7OklpV6sptwCL^MgYg82hBmHm;Py_F~>wil~NNpK|dce%O
zXjryT)~)=>Zk#N%EhF|A%T}~K=7=d{;9BMLjAQU#m9eq6SE_;CW!K*aRVZ$O9s*4E
zU-o^i|8VLF9OuD}&))1?KR<6FCic9|WMOWOonaE-yHs{c%3WK@|J|`Co0dHc6`&l|
zz;dwDJNu_+8||_3;nIB3)(o9*e#rWSkQo{gAsv1go+}xC23p3!Nqii<zx`PBc$b=$
zd?ua+e{<khF$Fp$Is at G*4t>2HaOO%aIKLp2f|uE_2pp<34-s#Q=<l;n&{72kQg&0I
z at kv|3_Dzvgx1G}uHhx at hU~Xx7P8w{6FQc*j9|qp4nRv-Cf&eBjUn%0i{mmqgw7Czm
zBEPS|$(Mi!D}z|4g}U`AbR_a|K&Q+ at xusrOiH|AEc;+a6s7sJCF35%Nj;=Z!9nZ#A
z0yPsz^zneE`1_G#q>O8hI;ky^Dk^knG at 0;y(vq`yx%gB>Jeg at wa?1q5i8ayagWq1Q
z(yD<!S)qU^($!l-PtVi3uK-*k{k^^BDsW(kVmUyY`N82~IB2Y*Zwef$G)$Y?2ky-=
zg}lFj&P6oPL7yfE>jPL at X6U!ZKnjNGh5qaob0|*2<k}W!^78P&Ib6K;pwuDV&REol
zIpQo|D)@b-=U4u34mQESHOYUuf70j6`VOeeA|IffwMKPiMuS#XMqb{p7EY&t6R+kr
zKs`wAHqRRbR12-k>ZX)?w4$WgFMhQ%For1$S&Ss7gYVK|>A8YRUJvN8&FJ$>&^RXk
z3FruR1O)7xt`+E>GK~KT#$fz!&osfPwkOTB&MBFV{r3 at kM`xN~{5HX32#j`?{%;Q8
zL(0-n60@&eSw|Pn5%~rIFG$7dw~6rY?{CK62ZaVslPDY2Ra1+&A5&FczOi?}%a{B1
z?H719`^89s-HT2XP6J$By?^a;OH-3XMl9x&kDZ;JB;*1d9N*U_#XUv<IAK(G>qD=^
z&jM%9i%SP~q>WWZCbVUe1Ul3~k_2yFzu|N09CZk?;Rumw=oAh1|0Gj7AludJ5JEj?
z5^Tf~><}ap{6_MV5eFxSB**yp-j?9QPa9e!RemcoJH at X%s at C~tH%h)uFGlA9 at stzz
zE|r9P{uGT@;q}9voxzo at ya{R;XzA0ZQBa(R11?|QK%KcC`QDi0O<^H15s`kUB)}Ah
zC(vuW8KnSrTCvIL>7?N$o;NbsFA~0H<<jbmx0vLa<Y_c`dU%{V{s<(hgoEj68pz#N
zJabqtYAwo1pJXkFm5s0PVlzdw5>+^rL5FAB$4)aY!t;eBhfMhA7UY6YV7!%1R7{0E
zr2;2_1XVk at yE9K4aip4SGU~`0aS+9Iz%g>+a>)U*U^@kX0&dc(%1Y|eR5M3=d#ZIh
z+%rDzxFv~9apZxfZf?VbfQF3<Gy{+`D(B`(s;X=kjEtRg@%)ZH>1i!;c3oI0wQ!ge
zO|K<Sl;@&_jiDhGu20H2moO>Onm3Vj<bkYAOcJ*=K?VYMED2A9p^|f<O1g^UMHYO&
z=CypcTo?w!xyRI)7&ja3!7xc%0#!W+{>;*rX_T$)N}x^~1hl9q5*0XsK{`n>_}nF*
zr>)anjt2`1(nAmtj0na}vLU-Al;`J%wwVOvzBgC2-ZC;~4W`m?2!?er`c^aZ$L3~g
zT4`V#AX$RbCp{J|ZYxF(FJ;*h!C{7{uYF~L5v$XlI(4ejoeoY<3(Hx6`qK2Yajy+{
z{iX`sDglteIV+BIu$Dh#1vgJEE?T(@q^&@?xe88Y%t=3UMr(83 at A+^Kz%L+?{!Wt<
z(O&_Q9USPKwY9ZXP3Mki1y5yyXqyrf{xJXGix-$7&C1s<t2?7d2;K%VQqq*P_vTO>
zs`@FQ#m~!25ZI_SX8{$d&Ve+KSkRW5;YolIP3`*|yK^zMUtjSh<tQ`2;ZSL|ax`O-
zW+dd~HZH~Qu4<Hy+C;SWmS-%uauFN<uR+pXC-8`j{(k<@v(G;Rw~(k!_GG#SOd@|z
zsKxr;cw6RK$NTvNk5PZi<_Mi-dYf(S?7U`7zK{kiknVebdSCxBe!tYC2k-6gPreoo
z+%f)3>ig{?z3IRn``Z1^5};K7FY9QMp$J#$i-W)a)^WD3?Y~~SH)!RC7vLP>Vk5V{
z{@H at fz;&5h{uQq_+7Y7%$tza(fLVEMn6-^fOnm(NJDX2D|E#;uUuCY}b$f3{P^ieB
zdH(rk&bI&B$7cSQuFskP>H~Rz*5W9DN|Xj*f?;3)sbla2b%W|>*E75qSa7iG<A$X`
OE`z75pUXO at geCwWJ5sX%

literal 0
HcmV?d00001

diff --git a/lib/tevent/doc/tevent_context.dox b/lib/tevent/doc/tevent_context.dox
new file mode 100644
index 0000000..1036d3c
--- /dev/null
+++ b/lib/tevent/doc/tevent_context.dox
@@ -0,0 +1,75 @@
+/**
+ at page tevent_context Chapter 1: Tevent context
+
+ at section context Tevent context
+
+Tevent context is an essential logical unit of tevent library. For working with
+events at least one such context has to be created - allocated, initialized.
+Then, events which are meant to be caught and handled have to be registered
+within this specific context. Reason for subordinating events to a tevent
+context structure rises from the fact that several context can be created and
+each of them is processed at different time. So, there can be 1 context
+containing just file descriptor events, another one taking care of signal and
+time events and the third one which keeps information about the rest.
+
+Tevent loops are the part of the library which represents the mechanism where
+noticing events and triggering handlers actually happens. They accept just one
+argument - tevent context structure. Therefore if theoretically an infinity
+loop (tevent_loop_wait) was called, only those arguments which belong to the
+passed tevent context structure can be caught and invoked within this call.
+Although some more signal events were registered (but within some other
+context) they will not be noticed.
+
+ at subsection Example
+
+First lines which handle <code>mem_ctx</code> belong to talloc library
+knowledge but because of the fact that tevent uses the talloc library for its
+mechanisms it is necessary to understand a bit talloc as well. For more
+information about working with talloc, please visit <a
+href="http://talloc.samba.org/">talloc website</a> where tutorial and
+documentation are located.
+
+Tevent context structure <code>*event_ctx</code> represents the unit which will
+further contain information about registered events. It is created via calling
+tevent_context_init().
+
+ at code
+TALLOC_CTX *mem_ctx = talloc_new(NULL);
+if (mem_ctx == NULL) {
+    // error handling
+}
+
+struct tevent_context *ev_ctx = tevent_context_init(mem_ctx);
+if(ev_ctx == NULL) {
+    // error handling
+}
+ at endcode
+
+Tevent context has a structure containing lots of information. It include lists
+of all events which are divided according their type and are in order showing
+the sequence as they came.
+
+ at image html tevent_context_stucture.png
+
+In addition to the lists shown in the diagram, the tevent context also contains
+many other data (e.g. information about the available system mechanism for
+triggering callbacks).
+
+ at section tevent_loops Tevent loops
+
+Tevent loops are the dispatcher for events. They catch them and trigger the
+handlers. In the case of longer processes, the program spends most of its time
+at this point waiting for events, invoking handlers and waiting for another
+event again. There are 2 types of loop available for use in tevent library:
+
+<ul>
+<li>int tevent_loop_wait()</li>
+<li>int tevent_loop_once()</li>
+</ul>
+
+Both of functions accept just one parametr (tevent context) and the only
+difference lies in the fact that the first loop can theoretically last for ever
+but the second one will wait just for a single one event to catch and then the
+loop breaks and the program continue.
+
+*/
diff --git a/lib/tevent/doc/tevent_data.dox b/lib/tevent/doc/tevent_data.dox
new file mode 100644
index 0000000..4ee4ac2
--- /dev/null
+++ b/lib/tevent/doc/tevent_data.dox
@@ -0,0 +1,133 @@
+/**
+ at page tevent_data Chapter 3: Accessing data
+ at section data Accessing data with tevent
+
+A tevent request is (usually) created together with a structure for storing the
+data necessary for an asynchronous computation. For these private data, tevent
+library uses void (generic) pointers, therefore any data type can be very
+simply pointed at. However, this attitude requires clear and guaranteed
+knowledge of the data type that will be handled, in advance. Private data can
+be of 2 types: connected with a request itself or given as an individual
+argument to a callback. It is necessary to differentiate these types, because
+there is a slightly different method of data access for each. There are two
+possibilities how to access data that is given as an argument directly to a
+callback. The difference lies in the pointer that is returned. In one case it
+is the data type specified in the function’s argument, in another void* is
+returned.
+
+ at code
+void tevent_req_callback_data (struct tevent_req *req, #type)
+void tevent_req_callback_data_void (struct tevent_req *req)
+ at endcode
+
+
+To obtain data that are strictly bound to a request, this function is the only
+direct procedure.
+
+ at code
+void *tevent_req_data (struct tevent_req *req, #type)
+ at endcode
+
+Example with both calls which differs between private data within tevent
+request and data handed over as an argument.
+
+ at code
+#include <stdio.h>
+#include <unistd.h>
+#include <tevent.h>
+
+struct foo_state {
+    int x;
+};
+
+struct testA {
+    int y;
+};
+
+
+static void foo_done(struct tevent_req *req) {
+// a->x contains 9
+struct foo_state *a = tevent_req_data(req, struct foo_state);
+
+// b->y contains 10
+struct testA *b = tevent_req_callback_data(req, struct testA);
+
+// c->y contains 10
+struct testA *c = (struct testA *)tevent_req_callback_data_void(req);
+
+printf("a->x: %d\n", a->x);
+printf("b->y: %d\n", b->y);
+printf("c->y: %d\n", c->y);
+}
+
+
+struct tevent_req * foo_send(TALLOC_CTX *mem_ctx, struct tevent_context *event_ctx) {
+
+printf("_send\n");
+struct tevent_req *req;
+struct foo_state *state;
+
+req = tevent_req_create(event_ctx, &state, struct foo_state);
+state->x = 10;
+
+return req;
+}
+
+static void run(struct tevent_context *ev, struct tevent_timer *te,
+                struct timeval current_time, void *private_data) {
+    struct tevent_req *req;
+    struct testA *tmp = talloc(ev, struct testA);
+    tmp->y = 9;
+    req = foo_send(ev, ev);
+
+    tevent_req_set_callback(req, foo_done, tmp);
+    tevent_req_done(req);
+
+}
+
+int main (int argc, char **argv) {
+
+    struct tevent_context *event_ctx;
+    struct testA *data;
+    TALLOC_CTX *mem_ctx;
+    struct tevent_timer *time_event;
+
+    mem_ctx = talloc_new(NULL); //parent
+    if (mem_ctx == NULL)
+        return EXIT_FAILURE;
+
+    event_ctx = tevent_context_init(mem_ctx);
+    if (event_ctx == NULL)
+        return EXIT_FAILURE;
+
+    data = talloc(mem_ctx, struct testA);
+    data->y = 10;
+
+    time_event = tevent_add_timer(event_ctx,
+                                  mem_ctx,
+                                  tevent_timeval_current(),
+                                  run,
+                                  data);
+    if (time_event == NULL) {
+        fprintf(stderr, " FAILED\n");
+        return EXIT_FAILURE;
+    }
+
+    tevent_loop_once(event_ctx);
+
+    talloc_free(mem_ctx);
+
+    printf("Quit\n");
+    return EXIT_SUCCESS;
+}
+ at endcode
+
+Output of this example is:
+
+ at code
+a->x: 9
+b->y: 10
+c->y: 10
+ at endcode
+
+*/
diff --git a/lib/tevent/doc/tevent_events.dox b/lib/tevent/doc/tevent_events.dox
new file mode 100644
index 0000000..8e350d2
--- /dev/null
+++ b/lib/tevent/doc/tevent_events.dox
@@ -0,0 +1,341 @@
+/**
+ at page tevent_events Chapter 2: Tevent events
+ at section pools Tevent events
+
+Ok, after reading previous chapter we can start doing something useful. So, the
+way of creating events is similar for all types - signals, file descriptors,
+time or immediate events. At the beginning it is good to know about some
+typedefs which are set in tevent library and which specify the arguments for
+each callback. These callbacks are:
+
+- tevent_timer_handler_t()
+
+- tevent_immediate_handler_t()
+
+- tevent_signal_handler_t()
+
+- tevent_fd_handler_t()
+
+According their names it is obvious that for creating callback for e.g. time
+event, tevent_timer_handler_t will be used.
+
+The best way how to introduce registering an event and setting up a callback
+would be example, so examples describing all the types of events follow.
+
+ at subsection Time Time event
+
+This example shows how to set up an event which will be repeated for a minute
+with interval of 2 seconds (will be triggered 30 times). After exceeding this
+limit, the event loop will finish and all the memory resources will be freed.
+This is just example describing repeated activity, nothing usefull is done
+within foo function
+
+ at code
+#include <stdio.h>
+#include <unistd.h>
+#include <tevent.h>
+#include <sys/time.h>
+
+struct state {
+     struct timeval endtime;
+     int counter;
+     TALLOC_CTX *ctx;
+};
+
+static void callback(struct tevent_context *ev, struct tevent_timer *tim,
+                     struct timeval current_time, void *private_data)
+{
+    struct state *data = talloc_get_type(private_data, struct state);
+    struct tevent_timer *time_event;
+    struct timeval schedule;
+
+    printf("Data value: %d\n", data->counter);
+    data->counter += 1; // increase counter
+
+    // if time has not reached its limit, set another event
+    if (tevent_timeval_compare(&current_time, &(data->endtime)) < 0) {
+        // do something
+        // set repeat with delay 2 seconds
+        schedule = tevent_timeval_current_ofs(2, 0);
+        time_event = tevent_add_timer(ev, data->ctx, schedule, callback, data);
+        if (time_event == NULL) { // error ...
+            fprintf(stderr, "MEMORY PROBLEM\n");
+            return;
+        }
+    } else {
+        // time limit exceeded
+    }
+}
+
+int main(void)  {
+    struct tevent_context *event_ctx;
+    TALLOC_CTX *mem_ctx;
+    struct tevent_timer *time_event;
+    struct timeval schedule;
+
+    mem_ctx = talloc_new(NULL); // parent
+    event_ctx = tevent_context_init(mem_ctx);
+
+    struct state *data = talloc(mem_ctx, struct state);
+
+    schedule = tevent_timeval_current_ofs(2, 0); // +2 second time value
+    data->endtime = tevent_timeval_add(&schedule, 60, 0); // one minute time limit
+    data->ctx = mem_ctx;
+    data->counter = 0;
+
+    // add time event
+    time_event = tevent_add_timer(event_ctx, mem_ctx, schedule, callback, data);
+    if (time_event == NULL) {
+        fprintf(stderr, "FAILED\n");
+        return EXIT_FAILURE;
+    }
+
+    tevent_loop_wait(event_ctx);
+    talloc_free(mem_ctx);
+    return EXIT_SUCCESS;
+}
+ at endcode
+
+Variable <code>counter</code> is only used for counting the number of triggered
+functions. List of all available functions which tevent offers for working with
+time are listed
+<a href="http://tevent.samba.org/group__tevent__helpers.html">here</a> together
+with their description. More detailed view at these functions is unnecessary
+because their purpose and usage is quite simple and clear.
+
+ at subsection Immediate Immediate event
+
+These events are, as their name indicates, activated and performed immediately.
+It means that this kind of events have priority over others (except signal
+events). So if there is a bulk of events registered and after that a
+tevent loop is launched, then all the immediate events will be triggered before
+the other events. Except other immediate events (and signal events) because
+they are also processed sequentially - according the order they were scheduled.
+Signals have the highest priority and therefore they are processed
+preferentially. Therefore the expression immediate may not correspond exactly
+to the dictionary definition of "something without delay" but rather "as soon
+as possible" after all preceding immediate events.
+
+For creating an immediate event there is a small different which lies in the
+fact that the creation of such event is done in 2 steps. One represents the
+creation (memory allocation), the second one represents registering as the
+event within some tevent context.
+
+ at code
+struct tevent_immediate *run(TALLOC_CTX* mem_ctx,
+                             struct tevent_context event_ctx,
+                             void * data)
+{
+    struct tevent_immediate *im;
+
+    im = tevent_create_immediate(mem_ctx);
+    if (im == NULL) {
+        return NULL;
+    }
+    tevent_schedule_immediate(im, event_ctx, foo, data);
+
+    return im;
+}
+ at endcode
+
+Example which may be compiled and run representing the creation of immediate event.
+
+ at code
+
+#include <stdio.h>
+#include <unistd.h>
+#include <tevent.h>
+
+struct info_struct {
+    int counter;
+};
+
+static void foo(struct tevent_context *ev, struct tevent_immediate *im,
+                void *private_data)
+{
+    struct info_struct *data = talloc_get_type(private_data, struct info_struct);
+    printf("Data value: %d\n", data->counter);
+}
+
+int main (void) {
+    struct tevent_context *event_ctx;
+    TALLOC_CTX *mem_ctx;
+    struct tevent_immediate *im;
+
+    printf("INIT\n");
+
+    mem_ctx = talloc_new(NULL);
+    event_ctx = tevent_context_init(mem_ctx);
+
+    struct info_struct *data = talloc(mem_ctx, struct info_struct);
+
+    // setting up private data
+    data->counter = 1;
+
+    // first immediate event
+    im = tevent_create_immediate(mem_ctx);
+    if (im == NULL) {
+        fprintf(stderr, "FAILED\n");
+        return EXIT_FAILURE;
+    }
+    tevent_schedule_immediate(im, event_ctx, foo, data);
+
+    tevent_loop_wait(event_ctx);
+    talloc_free(mem_ctx);
+
+    return 0;
+}
+ at endcode
+
+ at subsection Signal Signal event
+
+This is an alternative to standard C library functions signal() or sigaction().
+The main difference that distinguishes these ways of treating signals is their
+setting up of handlers for different time intervals of the running program. 
+
+While standard C library methods for dealing with signals offer sufficient
+tools for most cases, they are inadequate for handling signals within the
+tevent loop. It could be necessary to finish certain tevent requests within the
+tevent loop without interruption. If a signal was sent to a program at a moment
+when the tevent loop is in progress, a standard signal handler would not return
+processing to the application at the very same place and it would quit the
+tevent loop for ever. In such cases, tevent signal handlers offer the
+possibility of dealing with these signals by masking them from the rest of
+application and not quitting the loop, so the other events can still be
+processed.
+
+Tevent offers also a control function, which enables us to verify whether it is
+possible to handle signals via tevent, is defined within tevent library and it
+returns a boolean value revealing the result of the verification.
+
+ at code
+bool tevent_signal_support (struct tevent_context *ev)
+ at endcode
+
+Checking for signal support is not necessary, but if it is not guaranteed, this
+is a good and easy control to prevent unexpected behaviour or failure of the
+program occurring. Such a test of course does not have to be run every single
+time you wish to create a signal handler, but simply at the beginning - during
+the initialization procedures of the program. Afterthat, simply adapt to each
+situation that arises.
+
+ at code
+
+#include <stdio.h>
+#include <tevent.h>
+#include <signal.h>
+
+static void handler(struct tevent_context *ev,
+                    struct tevent_signal *se,
+                    int signum,
+                    int count,
+                    void *siginfo,
+                    void *private_data)
+{
+
+    // Do something usefull
+
+    printf("handling signal...\n");
+    exit(EXIT_SUCCESS);
+}
+
+int main (void)
+{
+    struct tevent_context *event_ctx;
+    TALLOC_CTX *mem_ctx;
+    struct tevent_signal *sig;
+
+    mem_ctx = talloc_new(NULL); //parent
+    if (mem_ctx == NULL) {
+        fprintf(stderr, "FAILED\n");
+        return EXIT_FAILURE;
+    }
+
+    event_ctx = tevent_context_init(mem_ctx);
+    if (event_ctx == NULL) {
+        fprintf(stderr, "FAILED\n");
+        return EXIT_FAILURE;
+    }
+
+    if (tevent_signal_support(event_ctx)) {
+        // create signal event
+        sig = tevent_add_signal(event_ctx, mem_ctx, SIGINT, 0, handler, NULL);
+        if (sig == NULL) {
+            fprintf(stderr, "FAILED\n");
+            return EXIT_FAILURE;
+        }
+        tevent_loop_wait(event_ctx);
+    }
+
+    talloc_free(mem_ctx);
+    return EXIT_SUCCESS;
+}
+ at endcode
+
+
+ at subsection File File descriptor event
+
+Support of events on file descriptors is mainly useful for socket communication
+but it certainly works flawlessly with standard streams (stdin, stdout, stderr)
+    as well. Working asynchronously with file descriptors enables switching
+    within processing I/O operations. This ability may rise with a greater
+    number of I/O operations and such overlapping leads to enhancement of the
+    throughput.
+
+There are several other functions included in tevent API related to handling
+file descriptors (there are too many functions defined within tevent therefore
+just some of them are fully described within this thesis. The
+declaration of the rest can be easily found on the library’s website or
+directly from the source code):
+
+<ul>
+<li>tevent_fd_set_close_fn() - can add another function to be called at the
+    moment when a structure tevent fd is freed.</li>
+<li>tevent_fd_set_auto_close() - calling this function can simplify the
+    maintenance of file descriptors, because it instructs tevent to close the
+    appropriate file descriptor when the tevent fd structure is about to be
+    freed.</li>
+<li>tevent_fd_get_flags() - returns flags which are set on the file descriptor
+    connected with this tevent fd structure.</li>
+<li>tevent_fd_set_flags() - sets specified flags on the event’s file
+    descriptor.</li>
+</ul>
+
+ at code
+
+static void close_fd(struct tevent_context *ev, struct tevent_fd *fd_event,
+                     int fd, void *private_data)
+{
+    // processing when fd_event is freed
+}
+
+struct static void handler(struct tevent_context *ev,
+                           struct tevent_fd *fde,
+                           uint16_t flags,
+                           void *private_data)
+{
+    // handling event; reading from a file descriptor
+    tevent_fd_set_close_fn (fd_event, close_fd);
+}
+
+int run(TALLOC_CTX *mem_ctx, struct tevent_context *event_ctx,
+        int fd, uint16_t flags, char *buffer)
+{
+    struct tevent_fd* fd_event = NULL;
+
+    if (flags & TEVENT_FD_READ) {
+        fd_event = tevent_add_fd(event_ctx,
+                                 mem_ctx,
+                                 fd,
+                                 flags,
+                                 handler,
+                                 buffer);
+    }
+    if (fd_event == NULL) {
+        // error handling
+    }
+    return tevent_loop_once();
+}
+ at endcode
+
+*/
diff --git a/lib/tevent/doc/tevent_queue.dox b/lib/tevent/doc/tevent_queue.dox
new file mode 100644
index 0000000..fef98c8
--- /dev/null
+++ b/lib/tevent/doc/tevent_queue.dox
@@ -0,0 +1,274 @@
+/**
+ at page tevent_queue Chapter 5: Tevent queue
+ at section queue Tevent queue
+
+There is a possibility that the dispatcher and its handlers may not be able to
+handle all the incoming events as quickly as they arrive. One way to deal with
+this situation is to buffer the received events by introducing an event queue
+into the events stream, between the events generator and the dispatcher. Events
+are added to the queue as they arrive, and the dispatcher pops them off the
+beginning of the queue as fast as possible. In tevent library it is
+similar, but the queue is not automatically set for any event. The queue has to
+be created on purpose, and events which should follow the order of the FIFO
+queue have to be explicitly pinpointed. Creating such a queue is crucial in
+situations when sequential processing is absolutely essential for the succesful
+completion of a task, e.g. for a large quantity of data that are about to be
+written from a buffer into a socket. The tevent library has its own queue
+structure that is ready to use after it has been initialized and started up
+once.
+
+ at subsection cr_queue Creation of Queues
+
+The first and most important step is the creation of the tevent queue
+(represented by struct tevent queue), which will then be in running mode.
+
+ at code
+struct tevent_queue* tevent_queue_create (TALLOC_CTX *mem_ctx, const char *name)
+ at endcode
+
+When the program returns from this function, the allocated memory, set
+destructor and labeled queue as running has been done and the structure is
+ready to be filled with entries. Stopping and starting queues on the run. If
+you need to stop a queue from processing its entries, and then turn it on
+again, a couple of functions which serve this purpose are:
+
+- bool tevent_queue_stop()
+- bool tevent_queue_start()
+
+These functions actually only provide for the simple setting of a variable,
+which indicates that the queue has been stopped/started. Returned value
+indicates result.
+
+ at subsection add_queue  Adding Requests to a Queue
+
+Tevent in fact offers 3 possible ways of inserting a request into a queue.
+There are no vast differences between them, but still there might be situations
+where one of them is more suitable and desired than another. 
+
+ at code
+bool tevent_queue_add(struct tevent_queue *queue,
+                      struct tevent_context *ev,
+                      struct tevent_req *req,
+                      tevent_queue_trigger_fn_t trigger,
+                      void *private_data)
+ at endcode
+
+This call is the simplest of all three. It offers only boolean verification of
+whether the operation of adding the request into a queue was successful or not.
+No additional deletion of an item from the queue is possible, i.e. it is only
+possible to deallocate the whole tevent request, which would cause triggering
+of destructor handling and also dropping the request from the queue.
+
+<strong>Extended Options</strong>
+
+Both of the following functions have a feature in common - they return tevent
+queue entry structure representing the item in a queue. There is no further
+possible handling with this structure except the use of the structure’s pointer
+for its deallocation (which leads also its removal from the queue). The
+difference lies in the possibility that with the following functions it is
+possible to remove the tevent request from a queue without its deallocation.
+The previous function can only deallocate the tevent request as it was from
+memory, and thereby logically cause its removal from the queue as well. There
+is no other utilization of this structure via API at this stage of tevent
+library. The possibility of easier debugging while developing with tevent could
+be considered to be an advantage of this returned pointer.
+
+ at code
+struct tevent_queue_entry *tevent_queue_add_entry(struct tevent_queue *queue,
+                                                  struct tevent_context *ev,
+                                                  struct tevent_req *req,
+                                                  tevent_queue_trigger_fn_t trigger,
+                                                  void *private_data)
+ at endcode
+
+The feature that allows for the optimized addition of entries to a queue is
+that a check for an empty queue with no items is first of all carried out. If
+it is found that the queue is empty, then the request for inserting the entry
+into a queue will be omitted and directly triggered.
+
+ at code
+struct tevent_queue_entry *tevent_queue_add_optimize_empty(struct tevent_queue *queue,
+                                                            struct tevent_context *ev,
+                                                            struct tevent_req *req,
+                                                            tevent_queue_trigger_fn_t trigger,
+                                                            void *private_data)
+ at endcode
+
+When calling any of the functions serving for inserting an item into a queue,
+it is possible to leave out the fourth argument (trigger) and instead of a
+function pass a NULL pointer. This usage sets so-called blocking entries.
+These entries, since they do not have any trigger operation to be activated,
+just sit in their position until they are labeled as a done by another
+function. Their purpose is to block other items in the queue from being
+triggered.
+
+ at subsection example_q Example of tevent queue
+
+ at code
+#include <stdio.h>
+#include <unistd.h>
+#include <tevent.h>
+
+struct foo_state {
+    int local_var;
+    int x;
+};
+
+struct juststruct {
+    TALLOC_CTX * ctx;
+    struct tevent_context *ev;
+    int y;
+};
+
+int created = 0;
+
+static void timer_handler(struct tevent_context *ev, struct tevent_timer *te,
+                           struct timeval current_time, void *private_data)
+{
+    // time event which after all sets request as done. Following item from
+    // the queue  may be invoked.
+    struct tevent_req *req = private_data;
+    struct foo_state *stateX = tevent_req_data(req, struct foo_state);
+
+    // processing some stuff
+
+    printf("time_handler\n");
+
+    tevent_req_done(req);
+    talloc_free(req);
+
+    printf("Request #%d set as done.\n", stateX->x);
+}
+
+static void trigger(struct tevent_req *req, void *private_data)
+{
+    struct juststruct *priv = tevent_req_callback_data (req, struct juststruct);
+    struct foo_state *in = tevent_req_data(req, struct foo_state);
+    struct timeval schedule;
+    struct tevent_timer *tim;
+    schedule = tevent_timeval_current_ofs(1, 0);
+    printf("Processing request #%d\n", in->x);
+
+    if (in->x % 3 == 0) {   // just example; third request does not contain
+                            // any further operation and will be finished right
+                            // away.
+        tim = NULL;
+    } else {
+        tim = tevent_add_timer(priv->ev, req, schedule, timer_handler, req);
+    }
+
+    if (tim == NULL) {
+            tevent_req_done(req);
+            talloc_free(req);
+            printf("Request #%d set as done.\n", in->x);
+    }
+}
+
+struct tevent_req *foo_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
+                            const char *name, int num)
+{
+    struct tevent_req *req;
+    struct foo_state *state;
+    struct foo_state *in;
+    struct tevent_timer *tim;
+
+    printf("foo_send\n");
+    req = tevent_req_create(mem_ctx, &state, struct foo_state);
+    if (req == NULL) { // check for appropriate allocation
+        tevent_req_error(req, 1);
+        return NULL;
+    }
+
+    // exemplary filling of variables
+    state->local_var = 1;
+    state->x = num;
+
+    return req;
+}
+
+static void foo_done(struct tevent_req *req) {
+
+    enum tevent_req_state state;
+    uint64_t err;
+
+    if (tevent_req_is_error(req, &state, &err)) {
+        printf("ERROR WAS SET %d\n", state);
+        return;
+    } else {
+        // processing some stuff
+        printf("Callback is done...\n");
+    }
+}
+
+int main (int argc, char **argv)
+{
+    TALLOC_CTX *mem_ctx;
+    struct tevent_req* req[6];
+    struct tevent_req* tmp;
+    struct tevent_context *ev;
+    struct tevent_queue *fronta = NULL;
+    struct juststruct *data;
+    int ret;
+    int i = 0;
+
+    const char * const names[] = {
+        "first", "second", "third", "fourth", "fifth"
+    };
+
+    printf("INIT\n");
+
+    mem_ctx = talloc_new(NULL); //parent
+    talloc_parent(mem_ctx);
+    ev = tevent_context_init(mem_ctx);
+    if (ev == NULL) {
+        fprintf(stderr, "MEMORY ERROR\n");
+        return EXIT_FAILURE;
+    }
+
+    // setting up queue
+    fronta = tevent_queue_create(mem_ctx, "test_queue");
+    tevent_queue_stop(fronta);
+    tevent_queue_start(fronta);
+    if (tevent_queue_running(fronta)) {
+        printf ("Queue is runnning (length: %d)\n", tevent_queue_length(fronta));
+    } else {
+        printf ("Queue is not runnning\n");
+    }
+
+    data = talloc(ev, struct juststruct);
+    data->ctx = mem_ctx;
+    data->ev = ev;
+
+
+    // create 4 requests
+    for (i = 1; i < 5; i++) {
+        req[i] = foo_send(mem_ctx, ev, names[i], i);
+        tmp = req[i];
+        if (req[i] == NULL) {
+            fprintf(stderr, "Request error! %d \n", ret);
+            break;
+        }
+        tevent_req_set_callback(req[i], foo_done, data);
+        created++;
+    }
+
+    // add item to a queue
+    tevent_queue_add(fronta, ev, req[1], trigger, data);
+    tevent_queue_add(fronta, ev, req[2], trigger, data);
+    tevent_queue_add(fronta, ev, req[3], trigger, data);
+    tevent_queue_add(fronta, ev, req[4], trigger, data);
+
+    printf("Queue length: %d\n", tevent_queue_length(fronta));
+    while(tevent_queue_length(fronta) > 0) {
+        tevent_loop_once(ev);
+        printf("Queue: %d items left\n", tevent_queue_length(fronta));
+    }
+
+    talloc_free(mem_ctx);
+    printf("FINISH\n");
+
+    return EXIT_SUCCESS;
+}
+ at endcode
+
+*/
diff --git a/lib/tevent/doc/tevent_request.dox b/lib/tevent/doc/tevent_request.dox
new file mode 100644
index 0000000..1461384
--- /dev/null
+++ b/lib/tevent/doc/tevent_request.dox
@@ -0,0 +1,191 @@
+/**
+ at page tevent_request Chapter 4: Tevent request
+ at section request Tevent requst
+
+A specific feature of the library is the tevent request API that provides for
+asynchronous computation and allows much more interconnected working and
+cooperation among func- tions and events. When working with tevent request it
+is possible to nest one event under another and handle them bit by bit. This
+enables the creation of sequences of steps, and provides an opportunity to
+prepare for all problems which may unexpectedly happen within the different
+phases. One way or another, subrequests split bigger tasks into smaller ones
+which allow a clearer view of each task as a whole.
+
+ at subsection name Naming conventions
+
+There is a naming convention which is not obligatory but it is followed in this
+tutorial:
+
+- Functions triggered before the event happens. These establish a request.
+- \b foo_send(...) - this function is called first and it includes the
+  creation of tevent request - tevent req structure. It does not block
+  anything, it simply creates a request, sets a callback (foo done) and lets
+  the program continue
+- Functions as a result of event.
+- \b foo_done(...) - this function contains code providing for handling itself
+  and based upon its results, the request is set either as a done or, if an
+  error occurs, the request is set as a failure.
+- \b foo_recv(...) - this function contains code which should, if demanded,
+  access the result data and make them further visible. The foo state should
+  be deallocated from memory when the request’s processing is over and
+  therefore all computed data up to this point would be lost.
+
+As was already mentioned, specific naming subsumes not only functions but also
+the data themselves:
+
+- \b foo_state - this is a structure. It contains all the data necessary for
+  the asynchronous task.
+
+ at subsection cr_req Creating a New Asynchronous Request
+
+The first step for working asynchronously is the allocation of memory
+requirements. As in previous cases, the talloc context is required, upon which
+the asynchronous request will be tied. The next step is the creation of the
+request itself.
+
+ at code
+struct tevent_req* tevent_req_create (TALLOC_CTX *mem_ctx, void **pstate, #type)
+ at endcode
+
+The pstate is the pointer to the private data. The necessary amount of memory
+(based on data type) is allocated during this call. Within this same memory
+area all the data from the asynchronous request that need to be preserved for
+some time should be kept.
+
+<b>Dealing with a lack of memory</b>
+
+The verification of the returned pointer against NULL is necessary in order to
+identify a potential lack of memory. There is a special function which helps
+with this check tevent_req_nomem().
+
+It handles verification both of the talloc memory allocation and of the
+associated tevent request, and is therefore a very useful function for avoiding
+unexpected situations. It can easily be used when checking the availability of
+further memory resources that are required for a tevent request. Imagine an
+example where additional memory needs arise although no memory resources are
+currently available.
+
+ at code
+bar = talloc(mem_ctx, struct foo);
+if(tevent_req_nomem (bar, req)) {
+  // handling a problem
+}
+ at endcode
+
+This code ensures that the variable bar, which contains NULL as a result of the
+unsuccessful satisfaction of its memory requirements, is noticed, and also that
+the tevent request req declares it exceeds memory capacity, which implies the
+impossibility of finishing the request as originally programmed.
+
+
+ at subsection fini_req Finishing a Request
+
+Marking each request as finished is an essential principle of the tevent
+library. Without marking the request as completed - either successfully or with
+an error - the tevent loop could not let the appropriate callback be triggered.
+It is important to understand that this would be a significant threat, because
+it is not usually a question of one single function which prints some text on a
+screen, but rather the request is itself probably just a link in a series of
+other requests. Stopping one request would stop the others, memory resources
+would not be freed, file descriptors might remain open, communication via
+socket could be interrupted, and so on. Therefore it is important to think
+about finishing requests, either successfully or not, and also to prepare
+functions for all possible scenarios, so that the the callbacks do not process
+data that are actually invalid or, even worse, in fact non-existent meaning
+that a segmentation fault may arise.
+
+<ul>
+<li>\b Manually - This is the most common type of finishing request. Calling
+this function sets the request as a TEVENT_REQ_DONE. This is the only purpose
+of this function and it should be used when everything went well. Typically it
+is used within the done functions.
+
+ at code
+void tevent_req_done (struct tevent_req *req)
+ at endcode
+Alternatively, the request can end up being unsuccessful.
+ at code
+bool tevent_req_error (struct tevent_req *req, uint64_t error)
+ at endcode
+
+The second argument takes the number of an error (declared by the programmer,
+for example in an enumerated variable). The function tevent_req_error() sets
+the status of the request as a TEVENT_REQ_USER_ERROR and also stores the code
+of error within the structure so it can be used, for example for debugging. The
+function returns true, if marking the request as an error was processed with no
+problem - value error passed to this function is not equal to 1.</li>
+
+<li>
+<b>Setting up a timeout for request</b> - A request can be finished virtually,
+or if the process takes too much time, it can be timed out. This is considered
+as an error of the request and it leads to calling callback.  In the
+background, this timeout is set through a time event (described in
+ at subpage tevent_events ) which eventually triggers an operation marking the
+request as a TEVENT_REQ_TIMED_OUT (can not be considered as successfully
+finished). In case a time out was already set, this operation will overwrite it
+with a new time value (so the timeout may be lengthened) and if everything is
+set properly, it returns true.
+
+ at code
+bool tevent_req_set_endtime(struct tevent_req *req,
+                            struct tevent_context *ev,
+                            struct timeval endtime);
+ at endcode
+</li>
+
+
+<li><b>Premature Triggering</b> - Imagine a situation in which some part of a
+nested subrequest ended up with a failure and it is still required to trigger a
+callback. Such as example might result from lack of memory leading to the
+impossibility of allocating enough memory requirements for the event to start
+processing another subrequest, or from a clear intention to skip other
+procedures and trigger the callback regardless of other progress. In these
+cases, the function tevent_req_post() is very handy and offers this option.
+
+ at code
+struct tevent_req* tevent_req_post (struct tevent_req *req,
+                                    struct tevent_context *ev);
+ at endcode
+
+A request finished in this way does not behave as a time event nor as a file
+descriptor event but as a immediately scheduled event, and therefore it will be
+treated according the description laid down in @subpage tevent_events .
+</li>
+</ul>
+
+
+ at section nested Subrequests - Nested Requests
+
+To create more complex and interconnected asynchronous operations, it is
+possible to submerge a request into another and thus create a so-called
+subrequest. Subrequests are not represented by any other special structure but
+they are created from tevent_req_create(). This diagram shows the nesting and
+life time of each request. The table below describes the same in words, and
+shows the triggering of functions during the application run.
+
+<i>Wrapper</i> represents the trigger of the whole cascade of (sub)requests. It
+may be e.g. a time or file descriptor event, or another request that was
+created at a specific time by the function tevent_wakeup_send() which is a
+slightly exceptional method of creating
+
+ at code
+struct tevent_req *tevent_wakeup_send(TALLOC_CTX *mem_ctx,
+                                      struct tevent_context *ev,
+                                      struct timeval wakeup_time);
+ at endcode
+
+By calling this function, it is possible to create a tevent request which is
+actually the return value of this function. In summary, it sets the time value
+of the tevent request’s creation.  While using this function it is necessary to
+use another function in the subrequest’s callback to check for any problems
+tevent_wakeup_recv() )
+
+ at image html tevent_subrequest.png
+
+Comprehensive example containing features from this chapter is especially by
+reason of nested subrequests very long and therefore it is located as an
+example on the attached CD. Description and explanation is placed within the
+source code itself (subrequest.c) and enclosed file README. The example is
+available <a href="subrequest_example.zip">here</a>.
+
+*/
diff --git a/lib/tevent/doc/tevent_tutorial.dox b/lib/tevent/doc/tevent_tutorial.dox
new file mode 100644
index 0000000..9f01fa1
--- /dev/null
+++ b/lib/tevent/doc/tevent_tutorial.dox
@@ -0,0 +1,20 @@
+/**
+ at page tevent_tutorial The Tutorial
+
+ at section tevent_tutorial_introduction Introduction
+
+Tutorial describing working with tevent library.
+
+ at section tevent_tutorial_toc Table of contents
+
+ at subpage tevent_context
+
+ at subpage tevent_events
+
+ at subpage tevent_data
+
+ at subpage tevent_request
+
+ at subpage tevent_queue
+
+*/
-- 
1.8.3




More information about the samba-technical mailing list