[clang] [analyzer] Add time-trace scopes for high-level analyzer steps (PR #125508)
Arseniy Zaostrovnykh via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 4 06:03:41 PST 2025
https://github.com/necto updated https://github.com/llvm/llvm-project/pull/125508
>From e6648ffc578b6c878ffcab494d6c5f11c775053d Mon Sep 17 00:00:00 2001
From: Arseniy Zaostrovnykh <necto.ne at gmail.com>
Date: Fri, 24 Jan 2025 15:34:06 +0100
Subject: [PATCH 01/12] Add time-trace scopes for each work-list step and each
entry point
Also detail:
- each checker run within each step
- bug-suppression at the end of an entry-point analysis
---
clang/docs/analyzer/developer-docs.rst | 1 +
.../PerformanceInvestigation.rst | 38 ++++++
clang/docs/analyzer/images/speedscope.png | Bin 0 -> 69015 bytes
clang/include/clang/Analysis/ProgramPoint.h | 3 +
clang/lib/Analysis/ProgramPoint.cpp | 121 ++++++++++++++++++
clang/lib/StaticAnalyzer/Core/BugReporter.cpp | 37 +++++-
.../StaticAnalyzer/Core/BugSuppression.cpp | 27 ++++
.../StaticAnalyzer/Core/CheckerManager.cpp | 77 +++++++++--
clang/lib/StaticAnalyzer/Core/CoreEngine.cpp | 37 +++++-
.../Frontend/AnalysisConsumer.cpp | 48 +++++--
clang/test/Analysis/ftime-trace.cpp | 56 ++++++++
11 files changed, 419 insertions(+), 26 deletions(-)
create mode 100644 clang/docs/analyzer/developer-docs/PerformanceInvestigation.rst
create mode 100644 clang/docs/analyzer/images/speedscope.png
create mode 100644 clang/test/Analysis/ftime-trace.cpp
diff --git a/clang/docs/analyzer/developer-docs.rst b/clang/docs/analyzer/developer-docs.rst
index 1b8133ffa8920b..60c0e71ad847c7 100644
--- a/clang/docs/analyzer/developer-docs.rst
+++ b/clang/docs/analyzer/developer-docs.rst
@@ -11,3 +11,4 @@ Contents:
developer-docs/InitializerLists
developer-docs/nullability
developer-docs/RegionStore
+ developer-docs/PerformanceInvestigation
diff --git a/clang/docs/analyzer/developer-docs/PerformanceInvestigation.rst b/clang/docs/analyzer/developer-docs/PerformanceInvestigation.rst
new file mode 100644
index 00000000000000..78ba804dd64c8b
--- /dev/null
+++ b/clang/docs/analyzer/developer-docs/PerformanceInvestigation.rst
@@ -0,0 +1,38 @@
+=========================
+Performance Investigation
+=========================
+
+Multiple factors contribute to the time it takes to analyze a file with Clang Static Analyzer.
+A translation unit contains multiple entry points, each of which take multiple steps to analyze.
+
+You can add the ``-ftime-trace=file.json`` option to break down the analysis time into individual entry points and steps within each entry point.
+You can explore the generated JSON file in a Chromium browser using the ``chrome://tracing`` URL,
+or using `speedscope <https://speedscope.app>`_.
+Once you narrow down to specific analysis steps you are interested in, you can more effectively employ heavier profilers,
+such as `Perf <https://perfwiki.github.io/main/>`_ and `Callgrind <https://valgrind.org/docs/manual/cl-manual.html>`_.
+
+Each analysis step has a time scope in the trace, corresponds to processing of an exploded node, and is designated with a ``ProgramPoint``.
+If the ``ProgramPoint`` is associated with a location, you can see it on the scope metadata label.
+
+.. image:: ../images/speedscope.png
+
+On the screenshot above, under the first time ruler is the birds-eye view of the entire trace that spans a little over 8 seconds.
+Under the second ruler (focused on the 4.27s time point) you can see a narrowed-down portion.
+The second box (of light-green color) that spans entire screen (and actually extends beyond it) corresponds to the analysis of ``get_global_options()`` entry point that is defined in the "options.cc" file on line 303646
+(the line number is huge because the file was preprocessed).
+Below it, you can find multiple sub-scopes each corresponding to processing of a single exploded node.
+
+1. A ``PostStmt`` for some statement on line 2337. This step spent most of the time in the ``ExprEngine::removeDead`` call.
+2. (Selected): another ``PostStmt`` for a return statement
+3. A ``BlockEdge``, and so on...
+
+In addition to the ``-ftime-trace`` option, you can use ``-ftime-trace-granularity`` to fine-tune the time trace.
+
+- ``-ftime-trace-granularity=NN`` dumps only time scopes that are longer than NN microseconds.
+- ``-ftime-trace-verbose`` enables some additional dumps in the frontend related to template instantiations.
+ At the moment, it has no effect on the traces from the static analyzer.
+
+Note: Both Chrome-tracing and speedscope tools might struggle with time traces above 100 MB in size.
+Luckily, in most cases the default max-steps boundary of 225 000 produces the traces of approximately that size
+for a single entry point.
+You should use ``-analyze-function=get_global_options`` together with ``-ftime-trace`` to narrow down analysis to a specific entry point.
diff --git a/clang/docs/analyzer/images/speedscope.png b/clang/docs/analyzer/images/speedscope.png
new file mode 100644
index 0000000000000000000000000000000000000000..54b64041468cbe4ed9686a93b65c5bc335214acc
GIT binary patch
literal 69015
zcmeFZ^;?@u*C^bU-9n%gE3UyQR@|k*-QC&}pm+)Hm9!KO?ohlqMS=ur(F85-P#{1d
zNO6ag?!BMq`_8$p^Zo at VKV&j<uUS4bYuz)Ga9wQ`LVOzhJ9q97s;MgK-?@VeymJQ!
ziid-35fE=>z!u+hH4T-pB^4DFuT4Gy0Rb~JGf&92 at cSLU&>bcw2CgR at Iy#!pE_R}#
zLaCpVl|WLjqhmfd{Ft7ezPY(6E-BvH**-ZrX=!O0M*ZmO>zy1QkMXv(%Ghg0{m4&n
z9mvUMgLcI={hr!5J8AoRd3?G%`?GrRFdDvnf<$0Y at D+6P4|sKHS0?;t<tVCg64^5W
zM-4Rgk0ZLe`w+eTa72Gk(@^7hOT%T;@>c!i7^Z(=716iz^E;-gZ3}+V-4xrf^N<j?
z=+2!tchnT08T!p`XA#)WN{*iPgAk at Q$kpjLxj>z{AGNNW5)KOS4T0HiL#MaKdjr2-
zQoHaqWsah&7RFwGb#W9<&rzlc7juXG51(vF at 0)#QgOt+AofhQL`c#EE<u&2vrv7Q_
zaZBL9g8~AJhK8oC*5K1&%9O?H_jYretzF}LH_b+vZ>20U%fD_+k1g^1|3AR%4FXO6
zR2V%mDF6Tsin at Cj_)L|U6smadpYktk!HTW_DgQKs{%$`A$D482U}D7!{|odE#)Rf(
z2j_Wd=sVs6F%SX~>cz1FDZv%ZxbspXTYHOvqa#}!?!KF^76K~+xwGm*QeL%A9$C4L
z7Bizi*S{x<&(TKK)xUmn7s#lH1b^Fff4ZonjBIevNvd&Ye0}=~_CDd(QH_J+edpYE
z at n!ZPl-1k+;H7KHD+DoIokK8TVV8#2&?o(r at vf>ts`1V5)+x<8hV at JTI;(hB4tSqh
z72?FzZ^>%uY-Z=Ev?@WbD3p&m!6P at D0Jf%R<cd%h6yiCWRXNw)i~L?-vrsh``<GMT
zv)S42gW(t9(Cs}QO9&lQbM$SV;=ra{SiK*#)rA=>nA&^<+t;yacDRj$1_d%DEVhQ;
zW(GcCgj{}tZG~o6<Dfq2vh^yfPSPBYcRo32o!eCjX>#f>IAJLebcUN#7UzdaiPPT$
zOWBYwAljcHDa^gckW-jaX<7=Fy?bl{hL6p5+xLD+b4QE@>I4hbaG5OX(NlJd`)N3)
zU0d=CQacPQA{(9PT_v5xrRjHdklFf43`bsS_fBs at Ows@Z!r_3D0rPfQDFWM{Ipanp
zb at X%8V)&GVKW^g~aDXVE0sGoR&kKhOyqpXk+kk0GA{KC8VV2C}xS at QLSRi`twqER9
zg^XosBL4Pw=kL`^+~zPyZ>U at E{$*^~Qb;t+C}#$Q1amwm-Ky+de!YSm3Gt6-4O}_`
z;H7B~%jrqx)N^aa7lb7%5~;YBR`k7?DYsi^);R%!r^*A#gRejN4_9Vypy1Tg-V6;S
zHTeUtWFIbaE{F-G57gA3I|&aQw9rY~JRJmNv*#py=3!?q?tC};x{^-xm$T4;jlqpt
zTAM29<S-8sn^0p(yTxf6e~p*+${=8Wf3Afy8byG~@$nMn at uaB{e`^elk~%XJ7 at z^D
zS$!)k-b_GIfKI;j9Cu{dnfXkrBhh=@mRT^x%tP3T9lFR!LsL(f=!=o at mz%{8b4sdr
z(O!|1)De at f{EdA2P|}&OE|uFOcICEP@$&eMNyKn*ClQe+^V0Rn`D*WQduyN%Xm?d%
zi)Tq-I`@$zbD(1#Carnm`U$<fp~T3r783mQ@`yhpHNIdi<DyJ6&5k8MI|4T2I0-^7
zD*)7TWO_bOyNg}Zp1J|Sl6|j;ALEs<+jjVf(T9)hrZ#PQBj~L(^$9c+d=N(!{V at B&
z2zxVBmEBUp!dwil+Y3p480<KpkQO?h>g&n^Hi_L(Qc at iy9ZQ(okdgYPOCRsMi>4<L
ze1Pu$paPDDIa;5Av)_R%F62s(svI86J>9=o5_ at z=Se>DUh5U0 at Y7ZZf^UZ|8-bcjR
zw1to=?|K}L__e|uLnK|2OVeG5A(3bwVnMy+SRAp5X1(byFuSYR#)?8RB at qXDj?BNZ
zvu;ry9e8iHH at 4H@=5*CT2YH$!CpQolbbFrY<{i*1b4f-FsWLORih`5H2iWs?`B<0(
zR_=hd_UECRMYa655u+(Ov<lx99g3Ai8Lgwd4_Kj^T8^U}9B3AvI<7}n%g#Wsm{w8=
zUdh5r(Pf4?|5V1Q+e_|(^+^#!v&FJ~WQb<hZw5pD&`QUlYdkaA;nf5P-FeSu!Mudk
z;=00#>Wv)}*a6%>*YFbaWt^9Lu2*ERMvw`I83U!u8q&zfeg^|=DwbuJ%}*=Im^8Zh
zy%?(&cV-7$CnqdF&F_#2|NdD(sTmh|9|nHv7k`YI(uqROxG9$Ie>BoK;&f*a5+fen
zmQtKyVnx7`BYh+w)tmhRv<psc at mI@Gu>6qyMowGMc}E+Po!Jg at e7&(8c3ST^>AS~(
zkBr^p3T9PoyC%mon|%B}@i*R|Vdea$t_^)ITte>fDp5bZ$3#Z~d4gJ{hmIE}e~H;|
z6wiv~O41aiNjT^i)U7NV_%dKMZ)dXMC?=Axcgf>oZuY7zy;xnv&7*pM5q+tLsjpDj
zq5)=U#dN+|;eHvZ1&xwXWd4wtD at McNJ_$n*9UnqDf>GJUZl&V<Y7gieq)R2?%*$Je
zl|!8q;g(q+Ie`HgW#gp!QjT7zF%N>E6A1rv3g09|ej)2bt5_IquCbL>OzraP4$y}G
zUJRGgmA`rSn7*1<jU7GYG2V<XbUT%1CNL(K5Gu{h6UoCog(o4bBOaHQ>H}hDH(B at u
zyQiA%8%bi8V^^sE^{Zd0*(7$1YXZVIa_kMBp^J5Ls8VaQA{z*ytov|j_XHTK6Cm-0
zuGcWLsXYbT7Xsg~Y5#HSZ-ha+Di9A#F{7m at 2M#9-f7cVbL^B63!h5b;E~7b|HW8<c
zVLo~F&32g*%-|hsS`#@T;H8uFRBpv(IkXkKI5~Z+UssvL<1+6YDGrwe4+hZ!Emp_i
zWHmawX_|I1eJjkgBRO%TpwS=xmVa$~X$lOmcfT$u-yg0Uig59prP;`Pvim#J-Wu%X
zT|x)MoKAWk6i1?7 at q<cT5~tTxTYZ#*V at 57w0<1e3`G){py+$y;^Mt at kMIV&A`r&dl
zmE={-N6$*t>_$f|gMr!=;jtl(LzDi$UYjI!zKkanqI_AP{!-aEN>BqiCasAxM;QQl
zCb+t((!MALOzGimz)o_bKZzf_A at NdKU9Lv^vDpI5YJ4B_{iO9!>#6X>Lvd!?B{8$+
zr;i5=kuS0qXnr;RWXS at 4kzGl9Qeu*JBB4EoG5#QBD;OdzCDs3FX at Ysvyg<91M4E^@
zlenfm0k#bq+AasGY^in)F?@1)^2*uk@&WKt5dKT<6D+Fx+19TiuIoU6TKvV)F(#$T
zrhTYA=v-Za;5zo>FB%}&RHY7e at n%o1J at j^NV`+Nuin!>xTu_nN9u4Qo?qNymFoLK!
zXK7}0_EhwJhR at ph9MPT(5Kws4cshaJy=>T at kOKG{+i)$ZAq_L6#k8%2Exb3+r8B<q
z4T8l}zIA^*?|A at vqIHU|XB8f?Tj42pt|r61Q!>9KAc9q$2nc=`BKn2*TRA at oYoB4E
z+Gg&-GtR7_GDU_;7gB%4kdIqjlvUIdl9dEx at oV-pfz%}Wb6O<Z3Wjoz(Oz@=h0Y(z
zw3Pb7UQ(hoV>pxxp`VhUPx<vF`%)wdKQ1o2Z-KQo^sdqbul6aBRRBtzot$5w44rNv
z(<%RMuMe3Be&w7pE`N%7q|1?0)(R+5p`Nms at 2TT4ML$U)mwUp}&v`8PQnlM8VNs9Q
zfW{Q>#b~@Ttz&7wfr_dDO92_ankDG at FITmS>|biXe_pjBc=>`-mDk}$-QtApR^wmU
zCn7(q+%JM)MqV?5NM|;>W-2S)6ZF!87astJBgPDTCi(mZ_gtiaNqd&&7qr~It(4Q+
zD|@h4`4_t^ZXZWD69g7H-A$Wxn|76<1AN-_l;J-+^LUf%?-9vGxx9U>+Ly0Za#fqL
z4e&OYa;+EBPTMI$iGoVyRe||;4j^AW^Xj#cikEkGr(68EM@$l$wv679qnbK4-vdwr
zu(oF>Y~WUU3>3XKYq-I??vw>v0oCA2G;BJLNn>b$a-Q3ZzmM{X4|Xn>H-<aMmcxiz
z49^$!UBs_UA4V3bGO#br`7s<Xge_nCGDa9QcLx$!28djp&5#_>_X75B?GAA%SuC%8
z7(v;DVYnpmE-v3+;B>r$4*U#4;_O7(x<8KY*&LxR4#rc1tGgLr90vwi{CIA at xOHy&
zVO@*)ddzG_6Im(u at Wn|XHLRY^rP*~yw#DulgPcCRn&sYu`jsDB;%3TQJ>7n+(8n?c
zY&PmilY9lw{b;~RTPWC`{hGYUPePK;G5 at jnVixoRFdZd*s^Pjx&PNcArxRhpZBPbL
zC$vr|fahW`u-F#&zR-La%>7H3k~RfL at YwU*^N`uZ8Pz5=4WD3?4%KCohSTv^fmLM7
zUi;1LAj;vPD*pGpa7}4_>WawBsE-H!#XjD{>M<H!d~B#LQfs?tsG+Ctq1$lZjK7QG
zRSdbK*Iv&~QT>daQF)a at QOI>dpQ}P?JcJ+Arnedy#cCSqzI9PiMF<5ipi4B>rSQ^d
z%5LWuNTrS)*5|o{U|Dh6`c!f;Ji^yvblH$SL$+c4$M9SCC(R6-A$4=MmX8-b2Ke}{
zgfSGLBH>5r4|RHlVd6>DY6|M99?O<=!Fjb`aQpkL)kQx@<^g&f7xfz>VA7}nK8z#K
z+ClWPrxN}14ycF+o+nP26PF4m4O36$W(F5+;s-c)TgB76rpym5Fo^g<a?Fg^?$zD<
zW($fR+#odT9P6oZA=XbIP;0|F3I@^y=78V=mozS@@FcFz=5Q}II^7w=+GnOs4$c?H
z5JVZ)=u2WkjT8w`$eA>_YQN$1U~{u~X|etGYGmX at teJmdV2^kC<yjeayb>)v0<xAo
zt4tatlXA at N(-^dHZju|Z*nN>nL-A-5ptca(!gNrN{{q;`8(pOLQ<pElvMiW!5?)ob
zb9h|-GaSMICS#KO8c}wk*sDbCs-E{&VnWk^@v&WAM>1J{$!kH^#9!yH3+jgmiarm0
z=>qJXt<U{-E~y0=P;s$9_e3fBLAy(-Tgp~}c?_yZyre^(wNuKIVE6HtMuGV}(W1(d
z&hFY}TC~fH<49EHHB11A+KocZj-QyH<W&%+w<I_1UPgA434K_7rV`tWmP;%ZWkEP-
z>WRrkKltlzAH~<)s3TC(YpLTht7=}gk9X5AxU?wyo0V0WpKCIaCUfUyknX0A?c9|u
zZEI})0F%Kza=irFf_#i5fQBxOFvrUfWNj=7bP|v at uJY|D`^ZGrj(#{wQ8I!}=P=hR
zV!&+P(0)%PNXhB)R+Zw^Xsqu8L)xnbmCTyu5Gb8KC4F3(lIXija(*dvIwDDgY5T~a
znAShDzd-6#YH`aU+F;Qb>m!>-K{7K<lQY5+&yz*ga5tY?^x!~h64)~io1Q5mnNw51
z#pn|b^k=qY?`W9xVV8Z&L%n2g(1E>!pigHJ at d`VLl##zU<uByn=J`}r^jNt7u<Qc}
z8;eFEi1rqPWv{RJ%1uRa=dSEGjCr?1JZZV*F4(k(G#i31PZlm$Rs;859b6JANO4?B
zGzW+Q?Rc?nsvf#^7!|TE-Etv`o at 5hC8cB^Mi?*o~e~<PX9n|k_NenP+U-BKx3AZtx
zI at G7}ez^(i<em8P)5<l&^YtPga<e&tBOpk9NHg{6%kG^+^AGbjcEYBGM5LZCu9Xl@
zY54a`9;SPhrW!o!+zOS8Pg)Pw4H65CNT#mgnB_1dJjMac5ZIWh<YR=64=F%BxruLK
z`y~>DM+>nqC&PosBL!cWwN at 5r4T}=D$Ab!1v<SC*1nUDnDqn3^>oDWA`+j*uQqvs2
z at vN8hqXb{7fDtu7C7ew=sJ<$|<YzHH<&$wuWP$9#uV`%{+5-t{?QQmy<rBd at 9i*^l
z*u}OAGA8>szPvS9a#1sW)0N`^xB^O-Jj!)#SjbGPz4{Cj#<uR&5uw={D<U?cuv;^K
zy(25P^+?bPoicZ!w%GQlL?xu=<U2I+JR{2TDYZ++OTN}9Ne+vL*@`I*EDoo~0n4mM
z&!;58IKV6w2?N|p1$|UUKzvL5gmTP=5gGS%S8VC!Hc-w>4onZDO(@qyhP$Hmi<*!t
zHB1-V6u;O(6wL5?SA1URl?^lNd901Skgfgt0k^Hbd)L-Dz$}9=xZfHWJSd+~sC3?O
z|MUu;1S at 9T4gjN_C3_EYMD>d!hz{i8b5ECcsrv)iN5C^?Nj}8-ly*;42J`|iiWsLJ
z&{zQcx5ymqNoNnY{LU<#wWWrrEo?^j$1Y<A_g at u=v|3(%IMLyKV>w1|*V8$6KI?)o
zaO!9}F*1(Agj<=VJfkAF8WVRBWGMWqK?_#0FJ`|_BUd!&oD)b^BRHL$q@$)PI)F<o
zNZlmytXH~SIITR($9%lgy_}$zM0vq4>p&Nz{4iIL+^rZSq3=OGF;7<GQ*Ya7S4blX
z79kVlb#~52{d&2=$QCD+WhK-ZMm*|&c}b%0;8SB7%{`pKVcv{Q_s7{5LZbB#@v6<2
z at jP5Nk(*U}`HIM9Wp|E(&91NIVPrKh5-uXWUQ7Aa3k&9J?r%LrkiZKsQ;Y2q%aR=^
z+8cS;e`vPw9<4Km!{W^h(iRk88VdTL8&#bOc0LscJxXs-fONm#Oxh1oo{Tae53uAY
z5c5&$%rqebw*QtyLrRCJlWc~Hw{$^mk%05%y4P{ijI=|KUooRM at cp+X+X%}N-Is!;
zuYb9T9zk7}SZlPg*?9L;Z3hc%ESZg9>8e at A!84<hNJ9?nly<*%*)zI8sQ at OZwX{EQ
z#K<^pw;9&lnC3QB;<SqO(JMUHdA>5(b{DqsP_+o%eDFJQphS-Fi%NDZb<zh;Lc+qV
z<VNZVzw~#umZTy at c~7jvXJ8Wn)ox%1nn{P#Lm)RO=7a^j%7ZaDgWYu?S8T?JdnJXt
z+e^R_U%V8SEpWIso1{5J&MSts8QXb{^<ba_L`<wrTlKAvStu3B-?@fR06Q-rQx%`g
z<sT5;JZBWFVwCK0VD`7oqKZ|F=R~*xsXi0G&q=SJM!G^RBgg&mK^NMnWNE_K6U$Lb
z+X<;uSUB-PsBF8O$EQrf2X1PRGP0&D*rPYu?}5olFOChNbaf0RodzxOU4$E(uN-<f
zLf+IWBl}{GPnip>powxes4&9|5-2$5cfL*r?uKx=!UOxhn$?X|*q)rR*rf}gX^l0<
z8$>~gaTH%vS7i|F(-$k;$H9}(qo--~;*lSp=G8Kwnem2_EWig;hF0TYnNMf7rjZ<<
zge!D0ZC}?^d4SaMHl<Ybi%a8;lS8>t#wrFv**blC*&-x@;-Rx8rrD#q*;lz<i65$W
zB4A3v?0!<fz_+jkLISgMe<RaqaT^3+M!>WF88W5>4(@__6=6d+V{rocJ>few`1B>`
zFsGH_chTAP3?*YbyGp9roLU)u)85XXyjO at x$%vSn`Jm!WWH_Y at 3@dt5_OCGVp|y;_
zTD{^n8DU2t81KhSBn*Y*EjIoUeb at gfu*AgMsa^W>MsZtgH<TwF_QAwQgddxp*$2}C
z$1dDri&@c`7qn81Mybs^W!@Hb96*WWWAydq?X}G+z_CQlF<mwhCWu>p{G~cC_z|e6
zqPIp}NSy_7H-u!s4?Cx<E^C9 at uEUr?A61P5_PtMDfkHy|#t^(5ccG?}l0dmhfW#H?
z?%E{ql!KLP{kJY?ws7~A(m63`lG$4|U$ZeKI%D;xzp;xPhgyn~Z2r(zLb~(nSlon+
zEJXb2D8s;$H;+L@(doR`YS9rSjP1LVIB-(^E3*VH88Lyc+ at K*MU_pB37KIQU!Z+r@
z5x{+KS_?TXKoAtoVw3-qky5GFhR6A}RlMG^sBG68&4uKP>@392%)(X8qnQ%i*T!=y
zPGMVKUTy(_B!biv`Hn3qsmUj$k{)L+k*av8FMMRK3Kobb2 at ub&veVgSeN4FIC)hEI
z_hJF9!`yv6FHO!<hOgyD at 42UlMdW>m*bB^XslyWXn85;asW2HUIf0)g!N>?$elPLp
zZrD}t?akh;BnL!Pi`4hg0{r!)6_jpJh}5Mr0Q;7+;ClYxnCoe_s*TVp(Frgd<`i(V
zrZK&}zeYx)FJqs4+>mP#<`PxpzgKJ>9+d$t7k!V7aGNve6;&gVFMgvrU2VcNsjM-*
z0Ib21lmm4K>Rr-~p@|Zguc8G9H&$vy$~IVq=*yOB%H6_$B?L}UMcJ!lmMiAf4ni#n
z9<1upGuI43WU3^sl#mB7GvloLQbSg)V>>>Q8ILg=og~2=hZgQ9Ks2og5m_ntJ*vP<
zif-)3>%Ht&-%&VYO at D9Yqr<jq557gHYHM9TMd`+!l4em92}Ia>#|P;r2y8|>6&n_I
zK_RhJxmF at 2pW?Jvlr)VpAI-5_VW8Xb+_t0vE_uA;ACKT;%Xse>*@5ByX}f;`e at u8T
z?45W!`tFtiHlGz2_qrj#{Owd at Ypfmsi7kWR0@p+t1qTk`6rF7k6M4PC^(!MLR(BqO
zc}d<&AObS5V`*{sFbYlzXs%azn at M?_VJH&=lg at F<EXJyJ5?D5YLsLbsiPWA(U3Ebp
z*DA)!dfV-ri2|B7(j<fQzscR~$5s<>o+`_}gN37lkhel4kRLal448Ed%9)Ea-)QLg
zq05FO+CoG(B2yKk6p|!QfANbkmI-}X-Jc&0JIG*iXEB__J2%#z^{15{=qvV;yAPoP
zuKg at lcxh$?_b|Su0XAfQ$IfBLgyFIdq<AQf%wAcRkuN(;$B7&2g-!<u5mJ8&OO%;G
zqt8lcPhY(GJNIqVs<*Im14(>6ScMsMuO^D+N2zL7sgqhw0xVpvd(cgoZY at 82(?xri
z?J9%%d^&5h1{WBZ|BXp-IDuz%j6RR?^3!fb-`GpxKKApLaI9pWAy2QlEyT}MG{yOb
zc4Z3!Z4#SUWj|Mx_3DS6cbobU9Ml-69cn`~WMbq8B(nW0^X-t+-jkhUWAL03%Z#wy
zEtFDnhV<dUD)ptFhk#QQ;m)s at rt397wxKd~u|0<^N81eA%4YU;+|+;|@!a at Jt>hz_
ziCUhk at VkhU*IWL<3TX68&<wXu9W(15byig0`4|6<n3pq<5v6Ze;79lyYj*;jI=F6=
zBam_>@K(7*Sc?JwF@=cY*6$z-{jBc;`RbG<wkJMg%~rCh$JET;+mDinP2#B#m$nHo
zi$`6v;wck3g$A*X!B2tb4zzhq+gc#@Iikf`HKd}*$FHKK at x7lMI~BLh3x;IBmZL$W
zz~b7fAatgbflA5u=c|;mkC<46emD3YHJo!WtjQb8zUj>p*X1biOAdNiK1alrf at -R6
zZw<Wz?2epQLw2!q_YUj^jW(yjG}~D(a?7y3NS@;u4_z`Er)DIF6|hTrL(yClf)Pb|
z9$qsLq#Q=R*D)Grbv#EbG(^_Bi*8(6Eav4}bO0#_IttXWkuFReFGf5vVJU7bu!vAw
z5E-oXD56!y1?!$cWYa)9tY8(bcUIf`##RTK2*Tpn)ARAS;Zp3vew;yYjZ1e8Lyk#D
zCHDI9)}Fnk0{afn`BE2VR(}&&GaG)9wU*RaudO1<U`TQ9rk?RYr$^!L26Lz5my>I8
zNgdIOVHI`>U}Zy!ZI44?GIMoy8BEaZ$ROO_x;@=azOy`r9{}(wAhWggybKs<hoA;W
zD%2%U9cDg8G`^p;Si31Ym-q4aBgtAxkLl2<@-md&U<o`@6r1qZ`gVc~Z2ID}2n^zV
z8D(!aT$+<S+sr6<<Q at w&y0~*-u(cPSi3VT3dZEAjK%w2Iogs5j0hN3+EQgyfiiZ+1
z`H+E<wBP{0jK%-j;LKFOKRCVn8J-nGkS0trO8A?WfRaqGWC;HZY=xZ3hDNb9X(M?~
zc(Ef}3lc~I>33JCB-8haDGE>BXFZ!LgxGOJ_jON`OPwmTUE|&s;ISMSh^Hjom6-ly
zFY^W#g<S3(W|R%33vruH0sg)``zr2 at i90qkR$lpCdzFgpJzc&IBU=8Hg#%FgG_QnY
zK7I6VAy9yBLomeEIt<-<aCI2UQh%vQFUy`#RezJ_f>$J^qwFd7Rh`D_b{V$fHBP6U
ze9&Y^AIh!_RlR(-fE2mTP0ysTmDomQFSBs8CYqUvlEmL+#uJGQscSr2G%S-am6XN#
zj2$lZtSV1(9<qJ&!384rhr50Aaw1dKBbJU<bK+0CHhq25Uxklv`doMqm($*s;|0$I
zlMU|mOdUIa>`LldDxV9F{(SposbqpHq<=VK$#*jJeL-1`-W-wK6nfchU4u;{1J1l-
za(W^1_CSjNdu1 at KNLb>PmZ#F}8belTLb+TEdvfE#<<)1mRhf*xEY+&#UP;{tG3w~h
zQ=Gq=TnSCLHS2AAKbM;`vBxvE+x6z1^wM_6gNVZt5!*DK>SXT(n6#aIYop6+*$%yk
zdYn){#(Rvk{Zb^dmA7!*rXH3JX)!WLwg-o2AuzB*&d}U%uI`ztbLIj2s^RT1cUYH3
zz&DO?yR6w9gT)htIO*Dzze+Of%^b_wEJ)WH)@kw5)+rAuP&+!vMQdoHX%;}n#d7eh
zB%aXHF>8NWns#lidfL0_5zZ)!{ySMPA%sb;v;HGe0T0zX6ik<W at IsuoefN7Y@<Yx@
zDcNZ7<?^+I%8ye<v~|uBVxk`ha4u)|^*t<vB|58F`}mc%?TldNhel;&w#){XP^mz2
zeH%3>uD7dfYWFp0NCJh5+lOi%j?E5yn4_65$Zm-z$2%{X?Rva!CN|D7a;}(NX~}ah
zN77^~F?9FGiZnZ`m8(vA>hxfGf`Qa|0FCQfltZdx>aZNQt6^|*{ZrR5is85pcQW5c
zx4`mtUXiPz+VqUw_q)Qvy at vg>T==0&2Hbf24 at Y{1PFEQQ+dtEtC}gYODa%}WA(A8z
zKYd8*_-l)j5J^&bp*dY{IS1CHgweKh06TS_6ILW(N7nQ+nejmkY}8R at 0x%Rbxr)q5
ztbeBJkjZY33ru*M^}=d&a3hCR-=Y7B%?BzQ(=p<b&R*TV2JHSr1T5ic7sZIEx?8)q
zs=6aLQ0sbJLeSyl#WPA$r98Sm{<~W*2W%({7rpr~7U#?0?oWm%r$BNXefFT^+e$=;
zvq8}^j{l3L*0M)bDe{x+(UI;u4a=}Mr+c(**TwDEbH2L=4O%907Y#D{^$acPld;O`
zlf!B?9MvL7(c>Irv-sIT(hPwTNbzw-SZiFymc*$0J)oVqCxb!FUD)!bnx&DoZKBFY
zP{9bnMNe>cqvy#l9fkW-?%5Y*`h@|ZEI@#4{t*%|Gcj|a9fy9~PU-IgP3)wXl#7EM
z<TF52kE+wb71;UZLM)WdIdIFkc=Y(j8Y7f}+gL{@IRjD+L*`!IFQ)-wdN at 2549-*N
z{Kj+}h5Hsw#p`X8>p^HJxVN2$yEaE^T`qx8gW5t;gl6Wqo=p5}{aYm$A#=8d(=^En
zT369>v(8Ta+q+?d92FZ&-Pl|ok=SjSIa at k66+fB6EXHhbjk`?wHP3lA^xElg?wDX9
z#ku|CF}#8*mbF0UxQNj`b!#eg%x)Fe`r<m7F&L1eY%^8q?e3IQ-kn$fOXo?u1>?Hv
zymc&oJg at WgaeTAbb#lif{zlaTb3{7wDspj2O*Nc#hfWMQR#U!O-QNZ}RU(czmD9uO
z;Y5=-ttYC3&<PrK;TvkO<9gN896xn2P^n#?0Aq+t{(0<;6j?P$(!GiMF&^Sv?0hBB
zEV^pQ0hR|#G{q+&zcWzH)+HJNNEa(y+Y=O;X<T2Fp&7K0i$!cseyO)_Y|Z8(Ny!cv
z$9Ol<J944*M@%3F9rgJYq;>`M^qPtfTW3jx<KC+=&j4zxqzhP*?J;no8CRl at L0oKR
zqC1X6aQnfv8nmuGD~RS+abFVH;42{{j565trv>sdTiq3VY1UA{n<4gS59$qipm;${
ze=IJ*`hq`fHqfN^EmU*D>$mU<9zy2i1o#YT`z at cE{DU@})2~28O_ECUS|?}7hli;J
z41#|wr*q%pJpNJR6PP7dC0mh2_4LN{ad$7z*0PEUvH~F!LJG8-GL1s2$f`M<aOfUv
zk9=@r2OsWPzl9O8gKr{91nKK5=)_0_vt8D#7<wP7ntB&Fu%eawV&A|xobCE#v#*Dj
zq2t49st)oUxp!lONW*#_cfJrn9ozQLYa-zW{W(c6cadIPu3&u)b5!x|Sv|mibn>ls
z%y`)RO}`@{bh|J)&LHU|fQfaqj2Zph0(XfqAUfABmK_c6pqED)mY}HtC^xk5!<w9~
zcO}J~`?X{cge3+cQ=si0{4^^1)7PAvcW<HqX*a6{yw|JZQ@{rPm%izzc>AX8o5%91
z1t!W!L-);}xL)BQd(?PM^{+R9qPeG;(7G~_2wx#q9oz30I(jSEASlN^*&B<Q<ALzU
zOgAFMYY{wZT>q-#x>HQy5Y7q$i;7YM34ZNG-@*)TiC$I3pVCCG9+8_fdq2=2FR6`f
z+PaRoBMpVMT8}1&X!X5;sj9liG`&}WO1F((UqI1}sGaL9Xwc<~ein?M+k5d3K<_*O
z6n4$B3vDL_BIIVqi}tKvUZ{+29*w1>1sK+&r+5NJpMe5O$K{-4_ULQxsy)Y?s9kGs
zXzd^98 at F_+YgvOUdJZW~%TO9FW#{67arkGXhzZs|rGZO##&V>FlJP^EmlYrR1zM5j
z<cE|qhQEy4)zc|;zZI)9u{H}j-T!lXi1jfsRMAAaLjKPIBj~+%uwQ*&$ngN!N4oNV
zjvW2{03Yvf(7${9-Td!?q(AW3b4Y)npX&bmU?l08DitRu)8DPX`j}WBKE{&x)4|Jb
z9RF_;Oz5#<g3&4EIsHU)E`w$<mJp#EBRmNKbH}l9q7DBetseJ-^QzILrfv1u^uKsr
zMZ)Kt4!EhmFgxq#_|HpIi#b|fF+<VpKf$5|(xT&^3f;vFj=$Qxf#sQN(Y*2=+BAx5
zIBsJx{N^uFQ!>9TKrNOu)fDcC2~ts0<#ID%F-6EOjv2p!btAtRimB!zjY<vkln;6e
z4vMbW at Ejwv*_&N{_?N1tJB?&&a!h2bI-pV`%i;^ZZ>>9$ruQ~XoJ|2)$(x?lV at Jq@
zq5<L9_&_KCM8U3RjwhjSNy6sS at Y_9v1T^bZ81DE=eo{il!vvLKlW(zBayb~k_>r7W
zDl1`FgS=HD1e7dkl+JTm at Lile$!gel#+w*YaIsM7_LQ$sT}xS>ggQliZKmt5RLe|j
zIsu at NR%f1niI^Ek#w_J1nzK1rC{JuLtF2MoJ~?qV at i59OVEl*ixwKGtoo!mFo<Odc
zQlJGrHSn-5Be_#%HezdL(O5-EbywO9?kEhnJkqM{;*7RpJj_oUERy5{r9%hgMFnZ`
z#YwZqj5i=OyN_2(Pw5-(X-BcrL|5qOK9-zV9oVF6n1jx_ju(YuG3m)W#f{g^9=q@(
z9)T$AHhC~bpVUM>2QQWv!L!s~%6a-lQ1lZ#7_f`?vx?Zy?B>FmZPc~Fq(UP4#&QuJ
zW-%Ko1Ekz5pwof%AK7y080egOKdn=l-h^?l7Bc?&3n9pOP$*7AU7*ckb_<C&BTDsi
z$X at EPZTly_^`i90y&A~y8p(RS0+4WQJOBIj=%lp}0f~_NkB6OX#bs(ls(I}zphD2`
zDbu@=t8A>)l2iT>y;v0se)(3!C<?Km=p2|W&P}M)Q{y+Ykd^3A%?h7=iir7WEN9tj
z70d3xrZ!ricFFRP>lG90g#43qAzC4av?$B<Ij5km`j;u8wIy4F33Ewr27Ip8;gU~4
z at PW*Dt-dVgp)8sjT=vfcM(SGi at NsX=g(o^*Ba>t7`c2k+o>XQ^gHhy9jd~X=)C<Lo
z+2{!GA2USzj9W#O-<xb5vSlt1TEf0Wnepz`6H|1q!!UtqfgI(O<Lhifb_1(^0YWR>
z{v$}V@)WL>iYoE}qacUO#!>)9($i%vKIiy!r+WL6*w at ukvrs_25xc7r#rDeqSH)-n
zQcwGU%8Hl<<9RCERyCyg;h9*+<Ln`!o-Y at YhXN$=)5TnCGwYP#&tD2gTfslo+<WFj
z3NkkB8ziwW^gpIfQ5kec^s)^G_B>&*z at g3?@zYjoprQ9}$g at XfJP=Y6;CD&*x}s+=
z12ivr<<}Eun_$aUP_F)%5T`!fia%=^1~j*udWOVq_3941`b&^O$iB~TQB$!z&FV#J
zZ0+g^uro?^VQchr@{R3#%;LcP6bk7p%!bN*QX~mi^(@{mR!)j-`dI%*@fGClTxOV!
zbd}>yfB!Cpv&_fb&g=#54Bra^6Z%W18gnaRB4DlSrUI3mgt*H3FML|nEBeEa^$RS>
zS5YKXUy^4c6HQZ!GDx}~DmnEuMfFi7j2kKq9e*XO>MYM>6aikV_nUh+r9sl(gEh6$
zgsY>fRQdvGbQMHuZBplriiq=%RwfqP7q2 at j-@{y?;M_Fr`2KkMXn|i^lB8;*)v%8o
zv=?4pP?y*6zapB;dYWpR$tEVqfQ}`k2_oZLUrG}lA2rQ!l6C&@N*GDqXqZ+{6LU0+
zXs?nA2%4{tC&!+am`o3gJ`{H<t1GF9acod=R5lYGrM;WAExN9 at guJ4#C~2AMUy!!W
zqd6g^(`#VfK74R5#?frg=`W>g<>+ooAZTcFP!TV!Bs+~RumRt5i5ALZq at t4wEB~Bd
zXY0bGkWI=h=Hv~AYK|4uk_5B5vCMe`3#N}NYcZY+?$sD3GzDXPZv$D{^Q5mI+1nLA
znzQXmK6MsS#YPSK?vfVUDFZC+tOr2H=?vXd#=+QT?v$qGI|waCh;`*T%yS<|eWm5<
zEiJP0_WZZk;<f_Bf;^5W&4O{Xe!|>Wwu1~uy`I6>C0NzU?E=OcE^H)evx?Fqsp)*k
zv7u|HC0oGtjwmgV5t7Pn{glB at WuYR-aO7h@kK{%$QWFzr)srA&ON;LZj*~q1D;OiB
zMar^n&YRkwoc>|_HFn#ox$Tjo*le+y)mg7H@~bxODIvT<;Zfx1t89?ufwyY5?2Ku!
zgX?gqx2nHT%_ZV&8#)M=%o_>R at u&_?cj1|>FIR{$pW8aa+f?va(dm#xcLfX`Hd#Hw
zUnrFo at G-0{Ck<5Cg13o;sn{y5N}{W&BJXYGTZg&Sz44(JESm&IRzKoGAOY9wrc*$>
zbc=WGlPcMhm9;~g{=xJ$Ggzm=TnPA*riG<)WOILYFHLHFDJXax?60D%`Tz_!6K`1j
zxx$h}kbGn=%(&rv__EheIysWOyxz!}r_7a`hAz3+tW5Ki6?+tM3O~cOu+(%?ZNk{D
z4bF9q2cYiwrBHD-^avn$bZ787j$Wx};fb6vNHXcAckSHz)eB4PP6f%9pN_QmN$zL2
ziL(2H^m7Lxyf1;A&oy|Q*DIeym%2B~vV$ZsGE2Jh?F0k6dSAM0L}#&!QZ%eEwy?}K
z3E-}{YfLuZvFkw!A%p?9N7BmUj$SoL2sTJ%tq<{(9hf2 at _73lqvtca@Qxp6it|It8
z1B6FHQ^wa<s?ObrHT68Jt at ZL!cslgWv5Tu*fqPk<sF;r?)a#kzvy2{~eaFPNp=}G{
zp`Etfrm|2SMlPV;OdoUS3g32)?_%M?_pS1pIm$Q*D0}`Y8+dSHIEqNmThc+SV%D{3
zh?oLia&X~cdAN#ST1q(LGkq)!#~d$!#RWe9{FwbX<kOu0>bT9&W$O5l^^XJlfw6rh
zk}P+K7nH~UYvoUL=|Pcgi+-6NMb6mD&;TdI+L-e!D8ZI~`(Qu~)%#VPkWce8+O|+C
zqg%VZ at 2=EtP(pmlo5qTm8TlD%0<ouDW$?UpYLCM at _{7Ks?47?`X;+!mUNpX~un=mV
zD^L*TxnXRlyfJQQ7yQ%T5Sp2wuT?q*!M`rTWZKY_qdjl$p9+NLO?(=D`(*um_WAns
zy`RhmqUuYmAwN-)8z1j_N<8l!G9M!3rwkK<#>BzqA53OOH_ROi5BDfr7T6<hwg77H
zEs}hsg4nB)!0nj97 at 7I;tYgO|<gaXLwSYmD$M!1fNKIcvi429OTWg%#(qPzt^G40A
z7=)zCsqFRhbv++DCmh5Fro(({_s<`9A6iWrPf({p>Na~k;(Jw)JdL}y6FW^E7waAl
zzh=cgG}>2IY(-kApcRstPq&au(*9&0??_g}yriFzWoMsmG at lTgp`RO%O8mja<Sj(c
z9y|6qO=-MWeX1hH{BEy at yirN>O;(q7;n4Y$os5>>lRxG<ZCML;q>{3gd|IjMXS`Qk
zyGeMUj6^_=T`|0l at nnEQz-w`6Wysw7rD>0!nKqdEr7rO&AQ~GkvFXCNaxtkx=~-0P
znvu-ev2xI?hxb}|iL1f}oTkUsC~K-J_(M}gqP0}<8s6};r^{h#2U}k<8~x{L=d#H{
zT1Sj~>mG3xR-{MJE80wdEs0<_74UEM==<iuyEn&Zis}$&V(QqkJf367Wk}=vEa7y2
zK=U!gz(C$DPLJeR_VQzAY^khI6twOEVvBhP-ZAdd{n4tI$9dVn&*rl7dho(Ow0Ary
z5_iI>R=>Bw!@1%&k!zVP3%YvpArUrsClNE+;TcnK@^;Di^2p at d${BgJbz7L|MBKG3
zdTbh>_y9GFBX=BOem!r#OqrPbMotJ@{J9ZO|K~oyzoGWuaX9Gi-xme`MBD$3!Jh;0
z066#W{}ZxXQA43`-~AJ|hgUuXb;v*ar^`P%z<<N`KRLjEyZlY&?`sGnNqXFW|Hysw
zKco;$tpCXr4%7f<Eses%>)jgVM*F1BBL3m7Nv%kDK-z+nzWm)6-0%W1tkrW;Ds{`m
zlX@*nxP>RG^tps5$O_d?)=yJXZqBaRjJK2~@m-DjeX&da!P)8(e|5<X;eBYubTT^=
zYa)Z|pFBoa9;+u(^;q~nHz(ltpwQ9$f0LSuJHQv-BgX$GDom{9e6#rfxl#e0xR2G<
zpVa5;AE<w|_ku at W)zpep=5M(FxuW_XqErOLr1AeD+JmLfntSx>kFua&-(WfTPvu?*
zHu2C6sQV|!swV%h1Wc?h_wfK_k^f47W$^!C`tO8_i8bmE6aiM`Kl0e#1$AtJHvbXs
zf2 at Gw|0UXC`UVEWrhotF0BNF%M1cj{@<J;s*?4;sVDl=fs;Z$HG|@~rSi5AVhG|@E
zMBMZ*g3Uym(!nzmee407W8h=wBFqGV<`jR8 at vAa(n&=;fU&y1nb=*q1UoJt^G+Wqd
zuqOFONYLF8!+(X$EBXB9)suhCG-9YLFO1bfVc6t**sCYl)bKB?l70jblWKi1e~Xna
zkpbH>@&_?i;zC at knS{xm?qh`nZT_Ro`gd5H<sSV_C*1ryRxaIuzikG+_m7Z&`v&Ol
z9|QhtrrbAADgNlKP{ra8i9eXJ=>AdPeMN(}|1ce1^zL3>iM;CH$P^8p{VRbv5h$-j
z_ivMqDq#L$=a1`QS%xYa<Qo4$jb&O9i~3)t!~XWcar{5-Fskr3o&QY&e7ry6{A-!}
ze_Rl#_WzS$ivKNaN;hD9Yl;;uGK-%Cst9qbxChiwK}MB`dvHbKp-NhEZ)b%0+=qwy
zFmo9hm<$ZY`2wBX)_nfH{cs9t=O8BLWoFhVa<H?r<L&S1xxTpA=WxZg)MH=RJ3qhp
zdvMbrL*-^M)1%V)G<SYt$*`?)S at 4IITh+p00a$EmWNfqhjOel<5n;0g at t;r8$GyCz
zz1-h9j^<sNmhBDEq|98Hj`zIp4vOA%;*N1XO at 3mNowWc>H#JMLrHGRLshqv>*RKfw
z;6SS$JNUcixRjgqE58z6qt9MSjr$XL!wubSZI$VRB0o~OclTT^R at dQmz5xC9uS7rB
z^BzKCYiUg+xqeJf6}Rj+v>k)I2yHFan;+U0AQmFD=Nlj7j;dYWE;H=yAwkK-^N9}H
z56ka}<+5c>S7q&Hg{NCyPW~=@Zj|@(aO3Del9Ry!QMis)E{zx<r0W`7(lv8muyRv0
za#N%$B$sO~;8;}8D*x=3MHAa;Tb|kaLp at N6drH4XyrdTGmK8IK82L3BqA=*cnx2#G
zf#It at _&MAZrEOiA6W+M_R=Zn~K%6ltXV1}{neAt}eu<!}Rv#({anrjdwc56OY;hEg
z&?;vyH0*kEG+0l0BXYXp?7Js~8d^xm=2Q|##KGH7Y8riHX1uj8=|~1Dt}DGtNy|UH
zikqSgq at 5g}d+r>R<E`%PEJdugGvHVjSb7`!Wx~64u4xip({yq_zH)~*>ep&ot72kw
z*{)Xl<L_{vYIE&?@1H)9_OHPkAn&arr(N19$y53QsB`Xf2LuKOT9`4L2;KCBIIRWk
zR753?hj*vD!Ykn=Zj<Hq{`55}tp<+|dc at jOnU|y;a;GBsE>FI~7d9ViKnq=?Z(WZ#
z{lzhs{_OR#+!fMR?oIUz(-itqZPI6x8|@Sy8WxnhI^nZrGc#I_JA89p85SzSd;w-}
z<;N8Vlq4w5W^Q?a4F#xF@{aVruXsln$<enJN7Ncfxke{jzEn#whMa}zzO&+-Z~$p1
z7o|Q)uQBszVZYqXXWFIdxy8);2ya`VCL(ln!`BYZvXacs8Q}o at 7oTohOE^0vdM%at
zVrrAh2Uk6+HykFXvlkj6)^iWwCTBXsilh#Zv^B<wE6sqXrx%}#^|j#qLqXBK<!t)>
z9!v$ovRs=xT2HqqhVD8}Ld_i|en%@YIl#{#3AHr9oiIK*@?S2NEUZRh7!jYXfmy#*
zJ$})?{s|LX>6`b?{iUH8e0zYSJBIj)Z)-iMoFqQuyGLp^i%4tzUtl9?0;m@$RgPMZ
z5XYR5oFJrwk6ub<d%G1awJYV-&G;5s{u+X#p*rWQ6go3Wa5rl=rdRAO%vOc<vX%S;
zXY=%(kgke)f%yor<ckI$s at KlPrjPA;a+WS88)yPn1)kHM_k=*m47G$)0gleEZ4c)c
z8xa<|Gv=91!{tu`$oP4=KS(9?7iPH^wCP*ONs>ecunX2gA1C?LH}3cBtq-tQRwE*(
z8|Ey;5);?kUQ9GDr{`oX7<MLDOxcvjODIuX%}N~}sy%O*ys-&;tIbqkcr!a&`8oIH
zohl_fZH3;EY1eHp at OB${q$hp(CxcX>;_|7Gqjkwm*Di(P&{Za92RHZYpPGq7N#9BI
zFObnYFk_aXA?fpiy(Q>+?TIY$K~Mhs`dC5}MI^p+o`aa%8L~stRww`?xL_Q-SbKXy
z<Y8ZM+|<nc7j^DZ=J}&KWz~@)43lXu=tR15p>cbC;MCsP|3jztiyj{|lSC$`;$5hi
zm@%OIZOYqJ*T>ALGoD7x(cW^cys9BlJb#wfdC^q*$m;k^{}Ra$?O%hxsYiR(dOXMR
zS#6g|Sb5!>5?_6E^`_GYq=AHm$O7Fb@%#_d0se#_21a0&FX_RBIKcl>9%OwR3~dQv
z1y<csfEMS)dHt-hP4A#Qu{kiYp*Me4n12`T|5yB<nmDfo_&)#{Lt9)~(S&%YsVg4P
z;w~$C$Ak1>{VkN|Ru+^T%L+bkAU+r%tqHOREn-3Ip>+XghXDUEb!5gW2YN<`EFL37
zL2U>H2ZrpFj}J03XL~&D0jc`0)H at g|sg`wR!yxx(L@(1ss2sizsf!V5J<$r?nOHFM
zws3{_hzT;=i8NYspuLrlg2V^2-tRE9{a|NO*Q$q5uX551Pf>X3ZfYO at EtS-mw{35S
zogHctfO<kr5})JC8^o!R;yD=RW%RJh78F3WnCJ~^Zm4WHb7LUUS0;M&!2ym*@dgFR
z_tmDs;D?q|c>X*7tDm0Z@?oGYSYK%zeE^#6NWu<ry^=zc8BG5t*qRpGd`2p4vJT(9
zu>VpYc~<fkR>%T2BdKv=15*d7&IJ~VRQ#xv0b1d%%Q+Ns6zo)Ezf6O<%7mUz<?bj#
z8lEw~g$cIppNs)+XJhG<g5BMD at j!C69#WuLhp39>61+_pPBQ%-+r@#DWSAv=NM-%H
z&tG;@npv<ZJNY+wvm^(S%-~JHxysKO-u^!G6^!#H|I|=eRNXL1%@MTa1n1t;1+%>z
zmA5Rb4cq&6LFR(B=VspJ@~Q$>Q at f5Y-YmN+{ldXAeF!W>Rp9_z&uj1w^WFF^y?-V0
zpfU2uS)6yS_^I<pKq~~kBd;$OWG&!)W7Y{24PzraU=Lb};DeTLudoBl7%Yvik0j^E
zW3%1WRglib at VBt!61U$b&Do$OB`Ekl_|FpXYZ at +<555d$0an;mi)I)lnW7Kp0vDj{
zECv>fjeTJr>9p1lZ2b%#gz@~o(FNJBmX(#Eptq}`RXrxYzP?AkO_tWY=M(gy at XTqA
zvsvyyY8zh_lZBb1J#Ouz(<QGkHXEP%#5qge-h)AX>oJ+0)$sWYxvZ$os$kaEmAQS9
zqe3vvq1Bn%(c+ at l%SbP=^()&pHn~s<hJM1cw<qfmBL8>S*%3Oi>v_|NL&6mO6*jwM
zjO%{kfaQye#2lar<U4ChVgPE&LuPk(yFMtE+oBRt7%VxZv at 4md3P9&b*--eV{2q|9
zu;li$@Hjo5UPLwYj`krVCi;K(k%tp_+pUr8a_G<_BDXzFwKW1cE<ZTG<u;Khi6tBH
zTOoL|v>$xSE8?jo(gcC{M01NI(~R8S4(eQ<w(k|F=80>Vl$N4x+f;rq_$OO_ONZCp
zGc!K+sE~|Hww_(D;gx{1ea+byv8`NR7<Dd5fIZgviz&dhe`n6eGTe1jwjo8ka(k6E
zB`C<Mk5EZ(+t$ju*b3sCF{VD7go%%Lg|1~GX2m{ML|}B{dqej6TOWFR`g-0rA`lym
zJ{}j}gSVC{R~LALoAJ{?-d1u=1Wx at C{Z@;im^z2eoB;C21AV`D`8X$%rk;)DB_Uk=
zjf at QN1x}9J2#yaz-#wC&S(Wu%YrbeN3usKYKBw%r)1^FZb{b-`7S-*49&I_Z;wD1T
z{kz-dVykfxQ;CRhHx1^kuX$Iy(u^oepPBTt<jPD)ovMgdX|mvXZ*JTS at f~bUEP(Vr
znD8D#JV7~c1+;m)A|!-Xy3pMllGCGboKP_an{(N1uTG~nS5A%xZRhO at u4gawDt7bO
zzY-ntKB1UTdMYSveVnq0&u>+B?&f~kw8yY}n|t;0!lj*nxxLI0aXp+IHPHVIioVGa
zxcOBG8zdP`_uf?T0t5%L`CyikVPqCm+T)v9(H4CUZ(+t0mAmZl*?V*$>WWCs=PWDf
zXD4-E08g{UX}{Y6pqbM_ZMf47#<;0+ at TR@W%<rv;_+}5ncd99qiq;<XM6wQjg^EL4
z8g8dS4l_!8h9m?^TpxJfG*AQQ^c8)4O at cY7Ir@JeMMNzwif>ASv at 3VFoK~}+t332w
z>|44Iy5O$N+ZAjob!uoS`?=X>I!jR<3nSX=u(ISfzfje?3HEJzsFP-TH}JWJP9_ik
zLTb4C`5vP5Wxph_uu~EG5QkO;`P%VIEC;$v^gVC&QD!(lDv7pIt1>Sx+~iepN<tx7
zZbN+KGRxPdzFCc0?$btHswsy(>Ep5%6KkCU at 5wm@Jbx4Fjk4+TiAAW3Np`lc2V(qY
z2I&}>!5u>QKs)0J8~#dDq!V8{M^P>_xbS8I*Lp4mLsZ28x2(zvT%Q2Xq~`kM|5l=U
zTEWJpSHM&ss6^Es88F<=eJ=dTRidf6EO=!4Nj8jjNw?zN&%B#}HRqOxJ>`o?6JJ_J
z6`iH4ceo9ca7%xM@$6(1-`oYKXx&gR;$^Tt*&EEtzCsWYV_1MBs8SAY9l&)ch>i`I
zs|g at yXyD6z!1dSCHwCnlLP;f!A`VEF7l=c5%7P|^1_7X!|J^YCf3d;;H9R`k1zBHf
zK`mtgz&*MxW=(8dK#zB>2yF=hf%q~2{!{8m1f>G<GxonP#)u*3M^MW)JkX*H3ou14
z0cP?RW<ml?skD$R8wDW?_i%0>Efjr#O at 1<GJa|G3(I<g$q0)2K1lbE*vkL37{ug`S
z{no_RwS7DmKt%)uq#LAHrAmj;OF&8jp-S&ndOb>zE}?{8q(c%wdIuGO(1p;eK#&g7
zJACn!=Xu`mec$W){(x_O$(5Nkd(Yl8v)4Uq-D at p2W@Bn{?YXHk9_ at RQz72}XBENZ1
zo~f>~j(u&7L-xWy1vMLqaRpfQdaclOa1|yl_K at u%k+P2)u~s=2Gdwo|msn#vqwFX`
z-(?~@X^$<l^QhAKO3ow1jt}`f`+!ya7*r!**-?XS^=HShfxCZG0cP6dm7yCo1K{-9
z$-&w|%x%*H^RdU=VNvShxNR%XsGWPq(KFfXmMhEeXWl;Ha+l1M(G+bvi|WeW$KvNF
z1x7BtY&54ksGla=i$b5thnLIkm#^Zeyuq(Eal at NE4$BCKS9~u`i?~RR3#h6t*_#Z`
z)~Cz9{Ndqad`7_6F4W5z2RJ_7U3Qy4Z)yk at c87rDYESBF#A;m1kw>JZMkWoBd at VFS
zz{cl!<5|o6+gut-Xp=F9ZNwm=?x>=)aU3{py+K8w*Dq<gh!~D6fM8Kp%-!(iff`>h
z|M`qKDQ46d at fzfqfU*J^4LJnk)vl_;V%qeKhHI~tXRw2QerE#eO!8 at zp3qO@`ts40
z!=nOCI>2e%K-Smc1nH5(?d|QiV)cL!BUkX6X at RUPj9-G-^MP@*J$oyU$Su<0QGpZq
z2G6#`4g=f4;glJeDLzqP^4dhKG*<9yTC<<KoY3 at y!&~C=va*17g2_2!dPR&QKR{r+
z at z!$=RbB2=wQRMj{iurO<!f}^@&`|r^0JwG4W9xntGc-c&HP_CsLn;04IsN3T~_n@
zB)bC>CZkj<USGs)wACutz8GycBHB#(OwpdS$ms`fD*-KW1;=t5J!D{Psa%TqX+{~$
zLek=H+9Bdiofp-$<f`LKEjg{$dNqMMdyRB&aPLZfKby at xpf7nge-X+jbLiIc(IK|Z
z$>`coJK;V3zHZ5V5sVSblDPE(DfmW)1ly+Roq}AFF4_EzVH1b;ZXB}2@{rA0WpwnY
zcG9o>=cs<$s893U*yts$$qkyMr<c><h4^eT;!$xaHnv!pSQG4B!;z{YS_Ym?dxxTD
zn$k;@Rg4oxQxz6k^&b6@#5FAKeatY-5^SAftD~AxjHslqn`e68pBv4!b)V9+(#W|1
zArx^g!5nq)!@gOs*Tfe*TR;b`U5<383-qngVXkSiJXc2ZpW-8Y6Q1U~G9U5o*t?Y8
zeB834qVqgrB&y{e&Gr+%iSe|0rJoe3=WG%xgmx~Eq;2~9O9O$h#HI!%Q{#p{uw94z
z``M*!UixI?9DS at I1M_j2ln0`v5qWp`CGt+Ul@~kpvSSGe#c*4~o`!(|o7V{&i0VXD
zLDPdr=m<glyKCK9Ah+=(<)>h}8kf8SHa(}%`)}(}93asWL~tcXS54DY+QgfL(xHi<
z{!05KuUcc%T-BWfueEs?(PYN!nYjS%*G#wx&I_D<EKvO|vvAw{18a8~@K{^8bHB)x
zk9O}Yo4=~Zk{Bz_az%i3j at sWgQqVa=66`lp>LqkyR$0pRVH`%B+EEvu`lUO_vxJw<
zWoI+aIMQ)*wB24`piZd3cEHus({)LxWPe^A^UI1j69Om4|NPCR`Tsxv>r7zq(Lj4U
zY`EEZ(4P~BPXwcfSD&XegrfM5Z#EuS^OT12^zly88+d|>IDpNN(6=T8?(m3~K&~O0
z2+E<Xj#-`sNa0>wxk{8sx0*Z*PG<$0fNDLX?h+)l6Q&vqA#ZoPHsASlH^vjF!73Dp
zzcZ7qu!Fbt25dOXN?FY24Om9CihrH)RXU-loy!(pia`m}9d!&SXOP2mZ!qIVDS;a6
zu#8PTSoclBh9;yT(b~zgNf0K)?-1t(yB}XX-o%^TJ at u3`Pa&9X`wT<V7|eQDcNL=I
zIhjBAka)&^LyJ6J*r4jDulr1gt(3(6^N*xltFVclq$rZL;8O1_x->U;{nMiXuuHFd
zrKTBMMRdrbI at 4{@;-3kdcG$ElJeP7x6 at arW-vedkGbG$>g*yxRZpIw at 446!^CKQ#N
zkdy7DrY!>W$~eB~_Y0#_N4v2UId1pGCIya}r-7KT^*%XlI-B##E^cLG>UENtyU;1L
zrpM%!Jpjj-g&*aT6LMG05t%$$+PQ at 1l1VH4<v05E*#4&n>VL&IjemJO{)9cbe_G%F
zHj4ZY2Yz{`{?*Vg4%t8UlmGR=FACbf#s2yCw+HK&X94f8`lpe9j{dh(R{!lIB8+hU
ziyrsqN&nM<M*e at dm&+CM at 818{1OJwnYIKsp)8YPk`S*lW-QWIu$iVp39=zvhIQhZs
zU06UUjIOO-H$KxhqJ}09!q*I0)<W?%QrI8fbvU$!{k2u6$|y7cx&2BchTrU5fRxHj
zI!Us3{G;p%0h?T?-z%rMhyk3BQQ4O0xeTT)4TT%jGP;_X at Ad((k444&;ddo}7KP*a
zdBd`JcMV|#1ECh)8zP3^gLlH*jKe!a=;eRS$m$zqyqDua?k_(Z^8ubBs7inre8NoT
zhiCj1gcRd1<RO{l!@t`h`_&NM!}5glR~j>U68w$uct}BppNU)oyypbp{GScs+u0jm
zGj4x32ac{5e#-V?;p?}i`>G;zCW5+BHd><854s*AlELjZxylJS<Ii>0Ch&=X@`~*v
zb+HwADki0cLgikhhZeR%&k6lbJbJW4XW}qf6B7YBZDbEC(1;gQsaAGLK?#D$N9W{B
zBZfg9X)db^%5lYh5gh1ZWsQUDy_#dqVd|El!@CLbki(2tD>0A?M9hB~Mwg~b<&;a4
zX`scz&8gGu1&kj^$?W7bvp}?YSs;X{x%iO2j%dXvIEa#gw-~Le$as(XU9zG89Zn(6
zNC~Gpt8%%uAC1$`(-{j{xfGE$3J9dTzF=zeI14f=ZoM$!P*X`Y_D8CU)o-6)VcsR&
zNjPpK6s0S0(XD;{Nx7S&N1bW at KJjO_7h@_{Jw(uyAa6P2yV?K;biD&8v8P*~L&$el
z629p-o*^90`BV#PA;j7w#oSc(;|Xr;hGUxJgWk at i9DTv<4<m-BZ-GspJ3ppSwd)mo
z+>%=S{^Mg`r0RzkedJFgi#y8=bT^%f(uI-i0^^`C{<~aOCss=2djjI^cn at I(la^Do
z<cbv_myCU&fU)vD at wEIQC!tD`ve08x_e9K+07Dwo!fGaZ++pjD<v6&~4xM4FNzwhC
zNfT|X+1vFPMWulO5O07s*n`Xw17z;DFu0(EnqLI}WCxdy7{gdPr~oCuOsL{cZ2&aT
zS_`;3yF-5K^O)Afw-ZvlO}MYvgm1J4+^r{zX$a?ZAV)B|Sut_06$_rN9wzdJmB+xT
z3}e8B`PhaWBn$2t8?>T=rd8OYBX`Ogt)I;eP|@WtSlSXJY!Lnfoaa?g)y|(<|5&?g
zWGsjI<zw*RK273#m{u*9u^k)4YVqwYYkv+7x+u<IJi+Tuk{<!UDhYAU*4FI-G$_zn
z at o!@QQZh&H3Il%}#b#A~Isp~>Lv$w{p5o+DT66a3j7I`QD9l(ic(=#z$#hQhsD6yq
z3r%ZI77GN2$T=d7VDc~-qzoy_1+PscQh3P#kJNgLqnmGPe~K~>_^H2?Ohr+m!v#1^
z&+!!OwyT~SGGbfwNbcYwryzM%g+{;yC-`{id~W6R%?zA>ROsz&AIHbyrm$B+fEpQ3
zrN$*m!GNd16}Abx4*P(~1IOo(1|bNQkcHI>X;-<^m#93Ccc&T_LaGY7%lMFux{W7K
zEG7Qnc~`2cC#K`2wJx~k!Teh!b4gVU4+)>?n!YaH1}^4u?xBwqT=R-HmR}dS#n}4x
zO4Pc=j>U4J)3_Ouc+_OK4N(*hAu+uHP|KphTPqjTse7XpSloWglSicI`klh)oJAlO
zHfW8mF at 38!ePUBoMNi#hR7A~&s{C>c_~?nnVLVYc>1l@@YPehGYs0O)VRoV-){-M_
zr}dzrUOh4DjdPW9YXYplCQDQ#wTz3OYWnU^#Nl8A<WzwR5GKW%_M2T#T&*pxpICLp
z^YzglQL4%TEvfq)E3)A*E0KCdOe^o+XV%lXyhcY8DS(yvmo9n1Bbn2;iu;HPvB1(!
zRaT8@!fvn2FMiWw`nw%-WsJ^f6MleNCC)c%gCVuhI+M#tgxA-*Wb|`X-?t}DPOouM
zdX4-wx$7HRV{?+3BF{1=IPQ at l7W<W!QE5vH%X(xKe0GTn2{~03f$N?8(HN&cIzEnY
zZWYwHZAP(Kn)xvy1%=X`bL5>hnvcKch0l~pQa<HEE`mwj)su{(5k0gTH&e!Az^idk
z-cHV7<4)Dv7DAKGXjaGkYL=3T!?^{o%iH98Ogo+|Eo*1=aYG#UZ@`<QKqk=_ylrN}
z!-t?<KI64_g*p-I9y+=~e8=oH^Y6*FZl$?pXEhgIiH;ldaZxEUbVuH>JO3~*p<ACC
zi8Wj3sw#g6Pj!#?!ybx}MR023*}=Ofp~e$lx$7MRBfV^vSulpx{+Hn82Ddq{2?^b^
zn_Lt61vU7-=Jb~@C1Vgm+OgFee3N0^oh&Tzk-VjTF{mX^PMI>&;jE?~W1mc8Cizsk
zkXc?qqzw{zQJ$HoL=8ewkE7D$Hcm!<a_BN=f0r{UXiX*MdN*X`3;n4UCL?y^OP&Gj
z2Y%9+ktz>I1L)!0xmpU!d`NkU@(B2tK7#czN~K at lw*sN at M-se!VM7SQLW{c7)M|$A
zNi#0rI#J|CZA8w62+{{P65Mo`s%ATf>Ni5iD*C{$WqMHj=W~byo%7J`RyRufFJj&c
z@(SjpTD#mE`eRR^y2~5n;OYmW5SJOc(A&7s3}>!ekMZZ4 at jAd2TyL8Y07AId#sR$t
zAnEeoy6IoaBUX1q)2--fG6$i$l9x!r20QdwT*Yvz07PO|>{us)yq)~Ay&}8N$GDRd
zEf;Cb$0_4y!Sd0g3Qg{S?&K65nGL!P6HJHodDNwIY8+6w9KAFsATtAm*>U>quh%|~
z_`^?jt<l&R9kDJLuF86kEg+>(+d+x4g$9TWhX*nmUlp?D4j04>T0(b!CTU(R4{r2M
zmxsfl4-uKJPxgN(2*rJ;qeLi&d3zaZA&Q>h)=DzRyd^(=4<}!LGo`rhV*!>vKOQAs
z!H2Lrc(ojK+A~C~ziPU=ODH<rkj*FPhkJm4 at K$_!@gl6z-r3?n%~!zBDg7d&_=3<O
z*VDI=6^VU<)B@?Y>#=iIuFrADh1g!?4D&{8zT;+~+UVV=IdHpVqc*vRUy&79kmev=
ziGlCm>5>K%n2`owCmaAcg_8CFvu6-iVMq}~Voaa77vtU{WwBgznzniNu|uDp8#(^-
z96qWk7D_Q|rVM!=Hl$f{Ka92wwP(<Gbz8os4MHqpVltutrixA1#$%^wc~33!{<LD=
z+VJ(!3n@$Vv(-0Buf})p_4voU-ObB?IEp=Xy?DDfm-~f}J&)ju?mtlv;1^frFL>kk
z1P at yNgg3v?4bi_~66|ky^9$Vo|Asfe^0NK|Z+ at k69lD8!$n^4|zp}NizWEb90e``#
zztPh_cnePiQGWOfB>y at W&TRSHpSTJSt0Hdwt7AM``URl=6awn<z%rf!B+b%fZow(!
zLl5|eJ37*@!>YvtuOHyC9ei{!VPpq>qk7%uZ(Ik*pIG`957B;MIp`bsw_m6XKR{VL
z?ybK2*P!q+5x4LplV9Cf-Uc$sqW%^K{F47$91j7j|ALCjf42FTI2m3Z_ at _A8-_7G0
zQSxt#pWr`s4e*EJf8o7KyevKxo(vBm-{M_IwiI|&`3oOn at a;ilbu|?*^Mi(ohv%Y2
z^T!Pbb`HK*=icn}XKa66OBMp&mcBN!`K`lF%;{<|;M<yqA8TW}#(_0aE3H$4udQ5=
zbZk{ncHugmYS<MKevHcBkoc%2Z-G at U)gr?xkUtjUN<E5C&)R6OQ!$8j&Su2Q4@$P^
zQ_LSVZRbB>{#Qo{@D)3Lp%v_BuVlQ^T^u|FMfcgYXAWRT9Q(TPQTNw70rt;&Bme1R
zg&9}fKDTr{KiH-OZJQQ38uV7e?98JK$4&HLxY*!WO2T%lm9_5yEwBa3-F{sE at v6i5
z%K7nY^Aqpu!etJvH#r`w*?&$Z(2p75X=9KxAR517e|D)2nyiq}yLl;2u1%Zy;GkjV
z;<)54-szZyVpbV`W_I4B6`~6YHhs!0`R=l9z9w+WyP<~%79>3$;_<A&@cfG_bae`^
zyI03JDBjI~v#8#X(lQ&UX~_3JihC(`p!w
*Bih1u^;Rrek(FAF}GI2U_-pd+Mw
z2K#0wP0ud0dT%9YT+%PWhYSL{2t?K}c+40qHLMpTDkU*ENaZ)5O4UT4XMRSlarz2?
z$O^*UlCO8X5sw>uH3fKU)|q*Sm2!i0gTLElxtiTEig?ZYv_++G{=bYjc>FT!_<IoJ
zeV9(<RR){n>oT#kfGIY4koelc at lKmV;k@@OTk=+uiZQxxN(?umuyj#&Cc$^sMC#Sx
ziJ8A-Y0I8QXa<4wGEpOh4+wsE4*;`r1As3)>cllSHsH<+iE=i4ZP!v1zh at T(BJY}c
zxjrb6yN3Pw01iJT>aNOY8IWORCDM~vwx1vn*SymfJTB?ZO0EFgyjL`k8o5FlGe2wN
z0J{iguw&J#n4Z`=IKRvaDbgtFX)Ig0iMJ;vwu+H_y9_=j+sn8Fy>~+J8)_md@$dUT
z_f!yI)$(yX4yv&@up^&-Fhdqm|9YFy&H~!Tb at u7Szz|hi9eKP&zirvR#MT-IOP!am
z)M^uvF;*=x398eWs=|49TS?ivap^hulkvWIGTGmc_czXbCGz;2mUo2nN6Tc8J8$6D
zF>pyH%XtBZj|lkgowzBne8)6(qZEy{1XUXKw&3GUNf`Wn^<E8I{vE)OG~m~}8G0ZH
z!~H>TRit%zT=JnL4&F8%fT4$>&*4JAG{K4-QGTlPru?1Fmykyn+f1HE%=z`%f4?d~
z6g(>$K0nJ4^fqDHz<%WWu`qCN(Ndo$dJIsM4#SC?Oer}&+zWX2Y)T{cT|w71Rof{q
zR}@fr3utlq)+!Sogd8uI`;U2I0$!Ef`EhZ+v(lsW{$-Mw$0*?>wenYv^U#e7^k(pt
z$re at w%#BLYhdlV*92j&QcH=_h at zr*?lE#O{+1M3#^Eb^4+|9HwIkUkcyRP~7kCo>G
z%gN&{puy$lQ2d(v&jXJj5e4~`(Bw<j-MDVrF8nMSMaXdum<2nW15OXz{dT;;?>fGI
zWYi|?PJYQ`)MFictpo#my|#+yEWL9TGfU#j>s|1cBlw}1 at u2D2>m6s|tuXog2Y)Uf
zzvd(o9uOJBbQa2Z{EU7%K={&lpe9bvDVksB3ql<I!`sg|v!vZ-@;>sl@$%U^fBK5I
z)sow0>WeAASW4u448y~xvv!j2Tv!0*0nHC2aYpAML`ZT!Siw-LSnIRxp#{e$f3J!7
zz8Ex=2Y#OKj7FfbUm4*~yJ~`xuQ%;VhQKwiwN4vXo95d at W=_v{01REG4|y-H{5|Sc
zAxD7u^j2gb-QE4m^W#G%nYC~KJPEIWWBlcz(SPcqzt{6qo at GIyhk$>r*o06`R+Ypz
z`G2bj{F0CHWZb*B at Ft}BmokCLzr`C8{=35YPfdhZg7_vz`B;7}{{Pqpv=h)z-UebH
zGs%!#5ap(sHaEyjW&U`Ld1b0a0sov;@(22e5`2gHlm6v>t;|*qxL2WXk}RQrA(4EI
z%h at 1K`r((>+%!2te>^HI5`<8>T**&mCaGb5%k}ev%HBFJq>%rE;e=fN(DN^|#Gh6P
z*xxGg|1xhJ$o!=q|EqZeZ(;c#%p3T<{~E%7nm364G at tyb|8M`J&xur+{zK=(Z{RiH
zU%=p(Qv3 at Tgd^kNrpJ1d6h%CB*JoJW))q at tdllUW4-^}Fy+qtK_r|j5$sBKcJXbAR
z@<T=8-lYBEBUQa%T;B3^bCQP{nm=7ZH-<+$-X)0^G{(DEbD@@fEu&L=kuEx2eAqj>
zz&ZX+I4s322)F+HvHm5f@)U|Qpg+s7dER<Xoz!pAs^nJpxRAzTQN+}+tt5&w0IPqH
z0`CnKdWh<f+7qx>EL0$7Pp$Riq1>vAzaVjr%uMd9f8{rH5X0}plFQ9wTFW(C3F#=%
z!gkrt58GPpysAGagoG-_IoXvWYHOf&l%0YBVkx|9+5P at n4m5t@2Aj-1_C at q5kr%XO
zh8ok`E-!kw!(2+Q?T>z|F{tO{TSN{PAE4~yDD*vgL(3k8nvf(q6piZkC&}VKhef?A
z2fWv^tgnTfMr_LV_EY9UoqfKmZgkZ0kLfx$9L+Md_S;`a>U54OK0n&ADK)-&UMX6i
zU4C$o+WdQ7{{xGfNwut2cC~H(-a=kEdbRseaVA+~#QUl{j`Z2V6;aPotNooKAV`$F
zf+=@W8RN#9IW2(dCd+Y30XDF at tbDnUb4}P(qaV&%!p{SGzO{z`&WN3p-J|muE^I~n
zV}%QfdJe1!$lP-lr%QFcKl-S5>D-hgj{}L9oW7olK|KQ<$Ucoxn4*x43)Qky0xK|2
zORqZ5^&W^-NrT!fywsV{iE}ELR7{)QixTnDr;iHGTI8HkOAgCBKA<23y%IIy(Ei~M
z`dlDlm21a2r{}AyqfA>q`!097WlrZdvfJX%L?}afhtvjw*#UvqGtJq4487tT-i5?5
z+0J&kLI~90AFIV~pvK^1(-O-NIIHNVfYqzbZmX)~I5d^$=pa^uD|4I4a#odFSC1zv
z=dqJ<C$pozU*M9zulXWhiS#BsLr6Uk`~Btpc+2mK3?pl+F;;Cwu`T;OUw2O43m9Ho
zNiEY7R_IlwYKTN?KegnCr)!G)m2c<G{#GvFl%&U}Wl-S6 at Iw%v7>vrk{D`G at Tp458
zSP+*WM+DtjM@@d$nthdYwlbKqgQamvCz^D&XHs&ri=TxVG2bd at RhW4eVxQfRuOMd2
zj7vIC;E_m#R~bY_gamvH+=W8$F~$4IjRN|l{pmz1uno<Stc{N0LH50Uy&NlpaK%f9
z=c|mWm}SAtn(94)Q`UQ<&l=}7FhU5!r<SAjYMI;f--uyG^zql!ger$dbXgr2rxIJ$
z!XEa|Af6vY24W=U!f<oL>X<~DPt2{S8=Tb>?O~7FN2ci{6Xftv>7YQkmpbQtcsJZo
z<FrNt?e at X@E0gh|Qi2!v-ENv8&mJ|KnuzEw^1VU3wzwDAATh&I2*a4BD(3RXA|&`8
zz~<1bD at bRg)Q-l(W-L$Y#l}~--J?lvJH|Jql%pR?nDPscj7y%Cl|be(o3z7kEt6dt
zL6~w)WsF@*$AjcxiE1{gIlUm&*}zG841y`t^!|lqJI(XlmAZ%g1B1B+DVM6v+B}M<
zah!EqaVTjLX3NqmL&C{Lk{u96!7qIN0`FX>d!G`5ykHOZVgqC=StXVAI!@&&sPecB
zk5qf4E^CCyxe6l8?iyP^U)HmJ5?KR3Yz=K`NF6rT!)9S-;MujgD?W_wIcH^w4Z{J(
z&)%Fp1eW#bI&4((THgy=F{?{iTVv{r?}X*M%z&e0107vFFubQRBF8A`0jQMX^fb}(
zk3JW9ngB`PH9 at 9t={jp_*;W<Xa*CP&pz4hbo7V8`c~wmD1#>h!`1xqa0}=}#z#rM4
z%ag#THqP&wSlgE0-kwJ1RecaQHw}p^iHZ&dcqgrp%<MPtW1n0rKiq)j-!Z(MCo2VK
zbm6|Uwz$FMslCMMz-P at B3^hx)A65DCR3yDGqh94_3Y=*f!Db1%!s=f+!EhJ6VX39e
z*TZAOqrm`{s3-~{YO6SJ6f#j at o@ZlDS!gcxu$U5Sf)!(43+G~=1+&nPo?OrXPIqg&
zUpQdeEO|g_o&LG}IRjqJo4w{8j%)%;N at doaYwud#jGj?wGOB1;jD8-y9!!$5G3-RI
zX~w{#RIfMbmv7uNOi{QAfG*pxGFe(xpp+W3%uM+TQ3#jUtT at hcB8$%UnF0wfyW3{K
z<o(Xqq}2l)O{r-$XXWefczEwouvXrW65^t`@V)wCLmEeGQ?Y((h%%DQG8j}Zkr045
zHBumw#KI_^-RoTb&<oMJE+Nj$=n(+)HzM{R=6T8LPunS5P{;9<JiEVtOzwWwVs{vQ
zKZ<mtQUjBQFhGka9unISzl&&8Z!zR`Iv3l25p_YBZZnJ2N!A-H*H_nErwJki#HeDK
zE5;HSROcMpESf5*58^$Z+5QBGYNlZ%deMxrDbcF&&lHS$cd8sUtnJQn=eNQy;UX%W
zUdly8fvP(q(c|{2*+-4DUo~vxVbR%|@-OX%)tJwLB>73!;((F`_BMI>k3MoioRSoA
zSv_vgxLON$*r<y!5$Q~(8ai>NrZ}Yn+^`4<(8erY^<BmQCvUpEFk*;YvTe|NDYqiA
zKII-Mf6KZq`F9FH#|F~6fwDV&0KIN+dim1(v*sE+zv0#%tIBMzJhEBTs%;U%w8mQ7
zr3gzLW at fU=YRES{NLX9fG{t>dr3CWYxLwJIUFcrFFKvrvfL_tFjT<Bs>Db4#Zs}>O
zI#+<(zqO`)q8fJ}dp7?h*Ko3|I at fy3BjId6IUN?A*2grtY@;(4jMZJSTda1hcwTNR
z#DxgbLh*|VziZuyI7^UaB|Xru7OXb`OU-;44Hjs&v9e<Amsqm#h%bbW$!le=^-h%v
zgw+<%>N-=1v2M7~IM?kZ*-}dm*G88<hEmY`QA at _7J*PC0VDq&pG>>VrPT6*J%(pLd
zy~3N^scx4Y_o4Uf9n}|rY_(Ul;mvR>@gLgiSpxUXZS>z*J`t$evJw6uANxJsx4pPQ
z?DBJN52N)%uJ^lX`sOjI2Zdjcmv2lG7U(>XNr{7(v`SnUocK4;-4p_wTpi}<ygX%D
zftxVBjX{5X*CXFz38~UPG|@K2;s<`D?w`tiBFOVib at nNo0BC@43pq?fpx?+=LIlF9
zYIrS5-|alvJ$Or+A9uxP-|Cz at +m}9+=ch8NxGJ9sUwix1t>&S7VKwwI3w_X-X7TPU
zZNkx-kPz+;pgT5e7^Bb^`o74%J10LKRGRKIoZq7v(*?alD<I-XxYgoF758Q0sxmFE
zjF&Q9N2W at 52plrv@B9Y77vPsKp+N3o^N#zsaw%#B3rd<9v4y&a!}k++PxXYQ&E6|j
zpl&C>wz}88t6lZ=<~uP0aCCNM#u1s2kbv5Yc(Rxs_1CWq<&_l>1;I&>IL<h&8fE@`
z8G-YQR+ATI^{ffdQ<gB>wIFhU&5V at J{45oc)>>K+5m=B>V}6>DDGXF#yG}hkQ;tXn
zwijByw_DxlI->wIbVGZ*WX6|!)VGkZU4z;wMP&##vJIZRR|E(KUl$~_d9|w<T530>
z3i_(<u?g^4hzw<=CbyNuwJyRJWMl2ZPgsVAo*5g)0Ok`9OOGx<z&-Z}+lD^0yJcbT
zAk7Qg=&dv_KXid}1dFvu%m<1MG(F$XrwKBcH at EyEE>uV<ybb)8XugoTcSfol&NJh<
z5!Oi at zqRfHg~+sVnlW}T3$U6<amH(6n}}-DnlCLs+YQO3wO at Bfmkv~`wM3su&ksnt
z(@<8vxE?-z(45<Pk$|dw(qF`zJjJUnckua-Ec**?)J<GA#J}W9`|AUaJ8RkTD_946
zmLW2e54qkt5w6eW?><+Is!8<~R?poVD=xap=bn|eP^2jbQ%~tD8Y<J(;d`6(fXx1W
zEed-B5hngKTCordlm1Q=#u4`=y{+TJpcDGM^_ie~`X#mQ+((3Q1R`D}qKd5L6-&KU
zk%}B&s at wPQ;+bI$bzwt}=Za+)mXSJ14Vgmxbk!4&MC;9+OiP}<x(lo3T%zPI40K^h
zc6jA_>iLY#Ejg#Bz>5ySo5XxR`oX=VL)l%Is$o`uyb={!fkNnRBT8BUzz6tp7VWaW
zoN-ScB>m7MSb%m_#>_vHu`+61kW=kw3#xH;mN?W*LmL+ at Uj$CmzqpP>{X9gCm`SSs
z(YK~&^D$qx?F^h-E}?odRT+MQc*lfYrIbnm8Z~@<z<&6JO0l+JH^z7#pDCfYElqLR
z`?M|6h4JpbP)bMY>*abqo}$Y)L{Qv(dA}A7>Nj4RA>IobGh at rN54}vZ^()7PSEsez
zUmQEf)BH_I-C4ffGpI-jeaM$uZ0bYcYF4w&Rl}GX=$Fr!x!clO%ggj5Xo8NAgUiM1
zh6nY5%~VA at J%@YBq!Tmqa`x@#^%rX1>Cz3sfu%gXWn<v?glm^%(^p)`Xj3#aDwxPc
z4{}A^o}$3rRt}NRxy-X#kWqH#A98nKHV&#|bf0Y2madVrOE}ry?)t%en_$K2P+6LJ
z?LN?O;39DlpFX$D$buII<*iGUUBcKk?`)z>UwHHqI45Zw7OIs;3*lqov9vG`E?$^d
zRjrTuOB4ggI6gs@=PUaabL&81QKVYlOXpKN44-$}WJ=Lz)qtK7V?i&bbkFn8*VY!e
z8yw!dhu-77Xm1C^&_IyN<3G;1`5k-xGUC)3gAS+frPcwWpOoy4FQS_-;oS at NnU0^^
zKizidiCq2^`aL~ry`G{uH2Ni#*Eii5lZ$V5R$-LAX^0w<lg3BH(dfhtmiLKc`u%4E
zJ^Qp!Q`<^yF7e;%C=3aw19|ii-BYXlj{53Y?W1w&n*i~fOQWBr_KJJC+pWL)B||Gv
zj&fQN(SqOk=k$!>a%lq@<{)3>H{tg_iAnJ0As8E}PRov%rJlq_>%G at TJbmiNWO139
zHK1++mK^T1r=IsI!tcCPlp!N`7jl*4$$FmzwKys=O2UJTS$LKhOKhJlI at w3sZ-~KK
z05nF_;L3{(td1JlUDoGa-IdzTO@(I!ukBPJ_tM|}q_&~FjKS>;8(Z``(XWH|&2231
zYlAEuyYwjquFaZ#71GdYefF%lAh+A*2k28%;<Fm1+L_)3CmccCXJ=lrbQf935-N5C
z>O)@nD(vgzfHm+;ZMj at zy0erBtzh=T=!AB%t&GGV!D%)LT(kG8RzY%;Qdg1z9Ra`R
z_C_UWt+B3thU^c^CL<xQ*A_*fE?y?fYCXF#wf<~kSUyc*&Xt#R)wHODVHBDuw>F)2
z*4oTv4!7<JyqZ*2KF*CCDPiUCA5F;&ld4UA9o0zaYfj})lFz_(Pd<CTQKm2ch8+u3
zDc5pdsNo`0A?S{1t at Zaq*e$t%g-R3tx^GV|i!6wA)^3y-SWVaq>`NGxFx^Gk_WNC(
zJ(8hOQ2J`nQx-EJK1S=T6GsLW7<|6LUeD2P^-(v7>}x2V$m1Mx`Mjj95kiL at QOjVM
z#Ai2-pZKJpx=9#p`<p(Gwhc95s&0?`megxw>#iFV5;yQ>`h>YYu4KobDN|+;O at -Gl
zFI=0T;e;i=Qi_M36O9F9chFl^XgX4X at 1<N(GIC9?*155)0GmtaShfOxv^n0(^@Rv*
z{wNw%#bQZT$xUMo)e|u5vH!NU4-PWU4~6shs%Ci#1+Nl8CFgZviPnqsXS%)lZ830N
zT)^7CKk&@j8IXStDKpWK)NP<sYZ55}5Wb}nN;~58DX502qo4U at 660S=D?d#c%(LFc
zc#t#xZqGV&f~++T%wyn%MM=*2mPFJ%x&EgvPxIX_UmgrjLtX6Bh}PO_W(U*ni90=M
zDg-K>&=T4K6X at kJ6Ys#E6TqM3ZUXYo2a$HEVgRShz?nqNVByV|50s<I_tKn>*z(WO
zOqLTlf*Y&s-}9&AOy+jLuxjIhj><a;OCoZW+#X2m<Xb8IhMXpBIMniwaEp-lb#J+v
zZaUXSM%uPuM|F24Je4T>nG_D*mF_%E=VDn9TF`A+ZDtp=lZ$J&45C}0or*uU<x3;%
zE^IfXOZUu#kACa!=Z&AV0U9KaO6G*ZuTIA{MMrCn<Al~^LlBX at ZT7Q<SC4^vNMG^C
z!b_!8I;jlbha|$HL!prO162;|K~^bj%ad4>QpcTFjP4YgO}qJ>1_8Z(`2%{4CG9sj
z1gbtVEVaVaZG?F&lWf7U?0a$r`HC11PSHNaZ;y!0?{L;c at r1P2ig>v>^T3RX8902x
z&+x^=1WZuh3o_PnU^5GHWu)5U9uw+^PbO#RYYh5my!~kOOx2WWW;(tUZ%*0wpqzHs
zhn^C4-!w1S4Cxk0?TmG78aMy6M-nyv9H8g?z$^x?W{R7`v)lT^?gyG$7uv%fonoJK
zs5Cky9jXvfR|g!*03qpsI(#N#Rg40$kK5&v6;2o^oLZ;!u<|ZBiZuStC?d%h_~2_8
znw%eJv&OFQb0Hk*1l#n|HtrDn$>ePRbjy(xuk*c!V<_*X`Wly*sAJx6P2 at 7z;FutY
zeQ at nVeuMe<L~E7}GqRXDk4aU`_rcnS?jJMZzX;x{1>Kz{9YVnMWdTxtk5ox#b{3b&
zk&4;*X|6FwnysRc&wq4Ygsi!j1nNQ-y*~8&1X;D|LpJIHD3<Zp<Ag7C#cet(>K$cY
z##bCgd<JUS$upk6obs?`$ToSj_yNKF>>Y~IZhzpJMHTlrEmNQL*DAEO>~X)lIN%id
zK^*nsI-B;K6a^i#V?PrEZ0)(1bEJ5VJ)$9#XNBo{t+n5?piCT at m8x{`1lF$ZeG$}z
zk`zk)P at LlP!<{MCA%AjTH&2nIPA!|8UQKbMasY|b278`0nef(@S+V+bE6)j|^Z|o(
zs~X`~F>t0}>8i>fg0<W7F5+vh+0ZfBmhN at f{k`L^mY#@@K}kaJpofYL8=Q^laE<3o
z3-M7OpI?-ZNgM-k)q0^v=UOh)+z#bZy#}EqU9mWX6&H)RdiI at BD4Qk1^!QK)YsiyT
zNY5o|g(T-s<pD{QnM^|Uq<cA`){-KZPg*2;1`6_lp|7RJh2?lfO{^*kP4km_r at jvb
z*C^}gh<u;6hNi-MCu^Z&&_`Yix>8wIo^pR2x&^GVRACH@$t#@;-X^8lCZ)*NIwjSV
z_Kx`bJ_T4UO^(-Mb;m(Tr3L9FQQrRg8{Zw|iMa`iv{aiU=TcvJY~QV(aG~dCwHzE!
zX4!yw#F5=w2HTF2ya^wo;Uzfi-Q(VoO*?YzbJsLyIR^)|IkwnOB=ej(vQ*b at w%E>9
zZ-ynAjvvI<bZ?WZ1mwSqZQb3^3b9YBd1JV(bKVuYb!+yyXIL#mNmabGCs6f6=XgIj
z+Y30RU>!>RKuAQTMp~A^ZnzUVmZWuiUdYMlJaI8Frd{#v1-3KqaR!B{V((zocY5 at U
z*6p|}bt`}hF8hqVtFvWRD?eWTOj$p|-4o@)b@!Dkrwx^={SV+<*EWND*DGhxSEbW?
zG4`UTd71FfBbW;DVar|+koS%=Q^X);&b2j)nqUhWM-Yg{Pqp!RIq>@zXP~N*e#1{w
z!(d*lBIpdvJcO^PXwAhKXn}~Gs*He}J;7TrfLwb1wh-P(C{yl5(jNE`#ww&~j1aoa
zCP;ej!MPNk8t%CEC|6NAsHHmHP*1}65MPCcy&7g>aBd#en%0v+C;Hs6m02R+dcuDH
zKG#ynQr{FNZoeD}i4>M=ROafYF^muf+A|WE;W!*%=to|5A)*lMgldUp<9$>oE$m>h
zPSgQ*(87GH#p^BqG$A|f&dS>+nn4MtEq+v*(zG&$Gs|w$GTkT{O4CFwe?J5(axV;#
zx$T}-UXVzdk~|k7HN?u$yFIf-O6neWRGqr^xl=4(o at KC*bC-r48>Hi3{6 at amp$=P=
zV4nrbXN~{uFtwIE%JMVnqM3uq5?VyYH_Dq~_$W*xL7gDc&Vpn)ai_!A2rjyIrdt at W
z%yD(vY-k~-<2;$9hDI&vt5h61KCO4n8HvCR&N`E1Uu#kYxD;x!S9s5?Ef_2oqm=2X
zGau9^Hk056C5bqCf5c%n8>{#~m+kH=^bA|ZY`|xFZK~ewN9J9^9hM~ME$!sy+n at R#
zV4nnUBNCqu$~_h{7JmIBk)bSOXeWO({mmvF%?UmkRY~@MFr~CnkjTJ#A$N4p3nE0e
zn2^J(;u0ge61lw<Vp6PZN=a1egx60Z$(rQ at tQS!Aaad_v{EMT0Im*RLcvX<z;BXl~
zlIu<CNKflUjRmo-qoPm>xNBp}C at k?u`d(jd+(YS-;56Zkg^s}tq^-9rIiTUPkT*Bp
zk;3Y+?vV%+v$5TV=C>Sfzwhsfqu4m?9DB}PnZ5pKjBs3sC!AZ=5!gk<6nnuulu~uc
zO!Mi_?5Dh&gwBR>cHyrt_XmAutd#nWa28axfF?=nZCC!R$)zi-TM~eRW12X$0ud?L
z2|w>S|Aa<wki%6FZH1O2W|Q0{Z)#>$(XdkiCd*1i3=4r?9A?%zmIi>z(Xm{faVD9!
z+Vmb!9U*LR9rVsQ5=-OQZ?XKr- at MBj-@|9X1QJ$TP6b8Daa|T}efn<4mwAV4T3Oi!
zV$*0h%CQ;tXqS2(ci#_LIsd8ukbYt)ewHAQX{W2+Sxo!p+$*v|D}2?=L#}9 at iqRHk
zu)vV at O8u1AkF5>KxtTRVc>c)FBq6y;-8RcjzRT))Z+{i5geqfQ+}3>jeA(DJcT|7F
za!~o82;AwcxpCX&NvdB<f9RtGFLnZoPQ&||2V3%f7Z)5m1zQb7UURw`NV^xHc-`vx
z>HJ4K!;9M+1_eDk&T+StzUrDe!;tb9s|C}4m>)M!$=!|r(JojNGq-CGvJCkcTz?cW
z7u<_bL47!5f8z3OM??&R#Nvd9egfl at O}FCi%|*8Qn%|tHjhD)HUk$u8nXip^jIN!u
z;(I-DS5slTLxFYe2p=U^%{nlz$2q4uSf~6uulnc-IH75JdIx=h{kd at mYnvvt$ukWf
zt{!)1zDygZW(3;SUwPHr#>P&3+ba-yVe&|a0mqGl=h?YDw1aLjFNWGeC~{1|qVHj4
z^o4BnX4Z9N)YD0zw(VDz2|*{GX`StwC9M}1BXx}4B6*xZ;S#!IPAN7l-y?-I3&-p1
zvVi+>4pnwV>sD{Sf}hDnsea`eMI;o_i7lIGSXS9mihhIDnVg<AT{>8*UbK3Mj>`-t
z?)fkHo4kp3Xd6wlTn^a$_S_yz>R9PFU_H_n0m|Ca_o{XJRFt+?zVWRi;9aYFUW8ZW
zt7dox=L=A2rppG{MB~14eX_i&_N-Y;^1)2poQCJt&1OVe>F<<OhkKe^P*zpvZy(eJ
zdF{_B!obh^4o?@u;aji5 at v+tvzyviT2PDcpRD*0X+wc2`>Hv4K#^8ihZzDfz*0S;A
zBVDVWjx9GRjrg57m)t<UBUN!XC*+6pg63U;DX*tn*|et)P<!We^vGFeMF802o3_V>
z^0q3(8 at 2TSzn(tLUEw>KTrhE0sovq4GoYClKQ7~F+H|wRQG%0HxqDT)HFCN121D(P
z-(=Nthm6Ww-)@=;XboKCBs<6rit3o#fNNaoEH56 at FibuPh8ot1!#Eel48Qb96FRnF
zxC9*T^2Zv))1`+-l$TJH#$R(L1#cZQZtTSlm at n^w)GR;QkMV<A(AlU)d&*P$A^mb6
zdTr<Ghi2TCGW2$nQ|4=a7Ps7#E{h at Xv?M;NLai>5bMR7JMN|i8d|P0H{zU_LImtcM
zKS=U1@(81fD9T(zjs+p8(-gCK7!QtYUR;Q-yVsoY+53G&t`Amyjr!>`z>9!77n at ra
ztcR6#5jWLRd_1#u`c9GFY-MX at CpmxR&V_myb(n=aKeG>9eT2?{mG-Sekk&E|ke(ES
z-Q<NEH74eiP9W>4M7yNgqeA^RR2z_C?ZSdyG({n#)G9y4vkX1<gj{_st<!}Kr&Ulw
z$MUlV;8D(soE%|^CyTxJqF0qAR;t*?>LSKz1 at +*jiIe#0g$gq8kxDP?TKU#SGUN)s
zUORMh^z!R<FK&?c1}mLl^0Y_esF0T{R9Va4*D}umaubQC`vv)91#^Cv<H66_rQRKM
z)8z8}a5OY1Cb(#w61bSq?WaOIjPif2yc)5*<L8O%srSO1YhQ}N5?egEf^%OsxotFA
zCN~n>q!z}GcZF^@&>Ava8N+b<Ta;ZNAaq7wr2BL0u5R^?L}lw0_{eBL6|uNoZYc3Z
z%((v<7XOJ3YS+prZBw|AV6|CsCed8U6A>byJ`8*pSqc**xz_r?2Eg46qIOSOUpbB0
z_>q(FkpFZIX0&QSy}hG^VPWJhhP2%Us5FPX(GK}sYbt0HJHz5{0BjWRZ5<@>Ho at m9
z#+lB6u}`0c-LtZ4m=)%u!Id8hV6H`px~09p=c*V6`v!I?Z>1919rU^Zt}{vkIk6g;
zN%Aub5+>ZjV76rPy~zv1y{-j0DV=0rDPWHxJm#Gkz5_<nv~Abo)-zqJp&u$!1zs!q
z at rry|HFNi>^cg}fY#>*?a?37zqdJkn7Oh at K2YaSvV`x`7?`%mW7gJ~750l*UQOf6F
zYm1jJ`zxh#o>BUFxtjWa+SeN#3ySehGHvrS;i}1Yj5T#iuBquRTx(il!R at M&t-XO<
z>uGRd)>(vqiyqx at u9*GP#U6e)kLVYZ?>`B3`1A??5%7Sq(Y$^`c%;|Jh36jB7yv7t
zAZ=FP!bf$;+{3E{C?@HE69Tfj1jXPRfM0PGKj5Qtot)FY-5i7sde^YwEk2|Ld*|Ab
z;Kj+Q-Edb88*!AJHspz9O|d?KX+!Y`h$cG{EAor22jc%lZlIR~cs<-(TsrsGOqdHU
zn{PN71e9Em3 at 1d{>tDzK{c;bo0fY_7li4zN_ at dy~0r3ZvFbPHA)iJoprS4i`if?xN
z(Jx+Ls|m0*(CDu$XursZrmO%)>8`tYhQY6>j$6Q18DQ)AR-Bd?<DVIyZvo<DFjOiS
zlKrlN!JWU;pZ&Ef_P<5U;7|WolntH&i0|!RfB)OR|0mhgTtW`%<8LR{daYej-aCs#
zfaNp4!ocmHOTLz4kT)mk#Ae%C%SYmj8kpMJi)A8TulDN<$*#=7TycCxjj<z4Rn-b-
zpQf^i%~f`cOY;n^PJ`+5F^W6C{r1OiD)O?r39}dOu)eDxV9(&rh56c9*!7BR31oQ{
zbehdLe$icXZS4Y->VpX{?WE_QfVR#cmXPsF at 0gG02;QEyOa9iM)1{X>z18FNt&#))
z+Pmb4vEGlYeV2DP_ZbD_OQM>YaQIRVrKEd5ez?la&dqHnlzR0O7gVLOIM?L!cncWd
zb358vUF{@Ym$Zrx)rn`BYBoqUR0Jcm-Sy7jJ6j|+;bR-B$UWV?UgzFVo`!93%(|yK
z8-Lc&V8Hy=<Ledvtl?ttH!I{>%%x3U!1~vo*(gU+8?3d>CHn at bwA(&%=;R0b2sBEW
zPr!DXM|9fdLn8CzqImNe at T&gOjUC|PLN!vrJiQLfM`?I{{?Qd-^7Yh(D$&^m6-zlK
zLFbb{7`3I at TKGUOP?59hO!ivhe%yF%&rv^Tkd8awb?imEX3mw%5i_o?L+<{y2-%`v
zE8{&Lmdb3tlNtm0aW#9tiMOzNXqrpuxJ!3iDTW)7;39qHueN6zAg-mwdN#1>H(Zx6
zJ1!vuPrIe~R@|-_!GA5p^u<Lnf<?5r=iWfiX|SV9%Mm^c%1mWH37T|Iv1Iz@)~ZSx
zvkKCqH7XxZu(wexSo>ttz~Vn`oj1Mh=M|4kAm`oK`hdFT(-dcO;~DM`5HYB`v7zYg
z^v;NQIB1Y|J0U3kdS0b#mWv4&vtFD|JBpx9(^V=~Ev73R7tt;i41SWfXjq&0qD-Cr
z8e5p)>~|jAC_eFxu<Y!5_Tx+`Ml93ECwFd at 9*Yi$aH_lGRXFmo*4g*q2lsf0;3z+9
z!*e!Xw}So%2EmeUSy<nwN^LqkkG%BGsToW{>xT at GH*w>oI-%raW at FE$C^OFIq~FNW
za~)ZS#_?si);u+)S`E7sf>*2ku1FxM4zplX80j$NGz=BhjIY5lzj}?c(^Hk(D$}ka
z0R#tNZ@&IWr9vqVy5mP|DovT6&{9^LT}i#+p&?<MF+*UD%{lb~jtAaLl5SSbFU9*o
z_Kr2Zs(SC=5p;e9T-RtkQRE?=kkwW`sG~R6zu#!Ti^Cg-%J9~PF<OdOqi6V1-^t4$
z`sM`rN`cFPvfr^R?-Z(rns4D`AEE`Vd|rQX*_3%DEBrNF2#Q&iDFUJKr6oWlEcx3n
z^K3`e`gyA!t8Y=Sk;PCcBhW04x4)=tfLsubyXAzczEk*$&^$k-sbM?L9*fy_eje!w
zSFaM_jriJA^f at C=0j8W`0QDno00Bw+Sj=4NbCOZ-_S={Db&>>M)E5Nb5$T8NX1R(q
zx-7=M#M>~EKGNQN%D*l6Ud>-S-Kaagl{W0503rQiZ9I5!WJ?T?a)672F~5yIPP6GJ
zsJZ7&uFb|qKsL-QiCq6s?tYIhVOtgxPB8*dcHUG&XT5{p6M8mHbjnDB1s~f0$yi4Z
zLu{ZRJV({V?+rYk{~G!NIAyS<f*I(}!7I+7;173Nh+hSqE3(c`pSf5 at _-Dayv2dLz
z2sEktlt=);HZt!%CU3qoO$<)2N@^4*1rW$%-iyKEBff3;WdrYqtb(Xy6OLCIF`GTm
zCbv=3^inC97rB;PJCFceZgMOLoB0Fk@^bFclEhaces5dDiX1eK<E>*!Ut`=?)v9{K
z=;$;sa}hQ1XO5=8A9nW61I`y0%p88{(|8M*g!<Ji``e|h4>ox9;dKu%=*)F2%w!3y
z%eh*!hPpU&M#fJb2}wmg&mv*>&SE{aAcS_A?z4nUv1pxUyC>BMyaGB?zEdLHRL=H^
z!&mZXOAkoCn+g4Lr|!CwN}4KG3x=r|9Hkvb2<$y0caE-_QKs?vEb^ctD-0f7yu!vz
zzDoc#5drzW0Eif)lt}la>!QYpunua<!-w`vN3hwhaClu^*gzdGC(wQJCV=AeuGhES
zQN#RmvPwqsy{_$(M+5O$+^sws+}rE(day at aw1g^*b){CjBU#sPX#^kgKmQt<VEGa2
zc3wMZ$t~XNybV`8lE(zyK4~F5o$qMfACmS8(r-Csg)zsPC%AF|x|!ccZGK3f1z(Yp
zC(USLH7{O#T6v-rmmzP?7yEE?q=Haxj@!owtHm4 at D#YBlvK&1873T!&>yKzC<u<)=
zj)7l$ryKk>H>_|9O?*nVVWZ&@Z|i06G9ijG%A!3h6mZqCZfNM|I4&if_HpN5J?Bnu
zMiHv8>R!1i2>Wgm`EFzfLnN=!CdpM2edG8yh7Bv9;sL8K;oiH>e2889Lau~D3iDT`
zkqn2!EeBm_AX+ixeb>vUlf+bK+<O_4ew-2WY3Z&MQRrlQ!*u~2K50GQg)BF&9p`o`
zQ2z?!QZ{2tx4-UTeJLlkrw{$`U?~KKrs$Nuw$9_f?m8Vz98_>_D*AZ&dN?WoNZ<cp
z<eilDcPi6;wj)3n_nLH82s{@)S94zR-FrL+_UPG+^FwWex~yQZY at C!no~oM!-ug<q
zHwJpSvQ29rM~{y0odw@}9oV1ib`amybZR_2X$wg at QG9f|uz?k%K6@%64bc^RQ=XXa
z>d+VK1Z!qR09cP1R4})XVGkXi3OLQvfJ6v90`5UI-nP8Q-!dA2=I?JP*_>%&odn#3
zC14Cn526FFLx at x~cVC^bvKab^V1y|EBl4$h)TiI`-OPm_?oIO$vr@?u8oq3;fcgMc
zk3jgu%taZn(P3AL<@bzsEMtV_E^#SFR;>*cH_a-?KR!@tl&#dD`s^TR5~O7|hNM%8
z*y9UI`8vpwATj&o`}A9xp1oxk+izc7P7H$D-~V7*5E0fu(&*9Q^NJ-1uCd&#<FwQr
z-e5@|qR4{B at 2i)oI=S|iCb6g<J?bXJ(@wIu-+z1!@zopYz;rLK`BZv~fjJhm4>8;c
zE{aew{&Kv7WYKoc)<LWUbKrw06xLOQc+@{TxClDDpv_9&KE}0*G>-3hH-2u5ChC4~
zu+8?&MK@)%>i&MKg#-s at d1jqGkqXPyfpKP{yZEVt$J9nXV2pJp7RN>=oxrxY`83AC
z<)pKfU$@#&FGvrQAZyE?VDG2V=0dd=jWPfBP~vO<*8;Z+)tMhhF}jj2?msmrEXG at i
zfpbVHs?LE*GSAhV%+|X-pIF4J#M)2E*=n1Q3xB}yDem%eC*Mp9_R~siv9aPXJ(4a)
zkpcGs!6#nF4vs{Vs>jX=@Sw#?CY*Ip5Y>m1_WL7u0MOfH1u%F<Hn`}i)uP6y^%?}6
zEnnuctl)bjHxUY1uyv?1wNhr?me*Q|<dku}FYtkDHW2%4!H>&teuofBB<fCXiWLTG
z&tD9ZAb9a%<}Sk=#dARhac7#1!q0p5D+fldT-EeEMn4UPZp&fbWOiCafv(-lKa%@I
z$(Cccj#NHZvoQy<O7)3sH%sbO-aby|HCFjhWo)!}{XIfA$#7VZR at KxGNR!1YS)n%+
z)6jYIGXY=EVLe;Ww0=l+=J<24Ax9wjcB2w+z-P>RXN~*4nJR2E0t$V5k9l8%YtN9p
zqyLAv_l|0!d%Hki8%2<+^cDz2kS5YQp at l9Tq)G1}y%Ukp1wxk^6{HvG9aIEDS9(Vz
zfOP4EdI#V4`<1o6 at 1MKYU3dOUU}o~1bDo(wv(J9^p4F9N!_<?L8eV-JqHpH7`nUzr
zN+iWwzN(~ZXvDZevV{h-YevczU~N)PESDrC`mTu~jwLfjRV!_C>cg^tg`B6x_g@~*
z2U0)*syl)#w6#|`_b5dAA&r_peUOWzelAYvp95UPtRm}U3QdIS=N>K|?r at K@*nFbg
zv#4?Lc0Ui51Mzn}E<+hBPN6~K=C|z}BQ$<tSLD1VPn3CyB~T(- at XIni2*$`reF5Xg
zpvlRc_w>yrzIF_~nP0~Xft*=LN=VzH`!^|}9Hen%phsM?mD13vEBcK7sl6x9WbmF+
z8LDqj2vYR&ByS|QB=U;y!vM=yCROfsk1vDjFxH|3|3F-am>UvZ+-bus8V!#H>7nm4
zB9)@kyIoyyo5Cc+tv!FL&<#}0yPJ#ll2xHN{M+uKLB&a at RASZ+)j7Vp&1w at jV~g34
zH at ei`sN~m)JH82lKZ9P%$Pajo$0<O^q5ecHU=g-iCW#fQ8|6YwT>P|=%*@=E9<6v;
zC3sWGX3S!Dq6uM3biE%HU(qJ(mUZZ`R1dT!6)W;TxkV$xr9S)_;N<GZWO)cfj~e8?
zm_Lg^oJbl<sA<i#&Hdi-FI;}b-A0aGe3wSI{R)yAcm&ui;$vmC&Ea+r at Y2O!BGn^<
zDtlW<&^WT`0?^`1r52_x`Y4C?Ng1?5>S5;LqE`Ac##dJ_NXQFzH27Qb=hAP^5|i`X
z5^YBc3bGECc%99#sq-Q?)?9 at j)Q?B*4{4LSOCR%7JZ0NTP|WuaQXs6CniH9Oej~zn
znA~}cB6{oIlz9hYr%^En)`<hbbQax%!k>h;k(qNlO_E6|;3sRKm14we{W&?5WP;8r
zS7epVvnF~7T0);%KZ)#ZPh9|O+9lE#G}JFpl?Epo&Yv8$3WPdT9`QoSY+SeAgNESw
z;||U^vq|Bzv$HRpC-bKtfT at qq(lw+)1Pfm=_l$Z$A3D|$^{52+i8go{x*nv$vY&5Q
zQ#_&6cvMgRE;od$sy8<iqsu>dWmt1!KRoS23K}9L?{Bb3%}t747dP>BbP=4mm-~em
zM0=x$Sd#o^V(aQlMmP7?h5O?Iu_w)#yH&I5rH at ut0|8BZ(O(PGb?%Nn3bXE)n{~au
z<Ghv*?TsQHAeedDfLht5z*@{B+Lh~4o%~h2sY*8i{D{-6NqHmvZ!^lu_s(RY%P#6@
zwLMxNaDT0P$o at m&H6{FX&FXI(n|W^bd&D2Ed>?}BlRupazS)<G<dwkhY;0?tH+X_!
zx>da45Q_xCd3vux_X+OPGs)%=t+wYgc=f^kRng?2=muZV`B>WwgGeqtXsxTU6*8hH
zX?*hVnKss=o^QfYyxT=XokC5efS!A*Y(=+I0w0T-eVXmQzqBX`CJ!h4;6cWk93~!p
zILG9vJ2Wa3^MZo7OAzWk{Lx%yRxy|JzHiIV*el{F*;AW(%oHqJ#zKU{1!4;>)vPc(
zC!yR><dRA$Wl?c at UBzf*V at N43%YMbX)zGrn-B>FX`C$Y50XDxeO85RiR(ME at W-?5?
zhiA`mvZR5j2giI^7=u_9q$CitrMX+JuG?0Lzh4l7^gbFP*ShIccCNIjo_DVGbnrB{
zx4q6#p8IssJ0;KlflPmE-$YK6r2v(vQ>tz=>@GH7*q-3)_iQU(m~~ft>{5C*TW(1w
zZW$Ej!UEmnuFG56%3fPT`~7HCqkKB8j5d;ugKIlQC4b at 4*91)p4AA3QLiyHuwATYz
zW>nF&p%!dL78+_SUvb0lOSs}yS2FGyyzFzB<A`@;)Wn23Y}tJd3UW*n#?J&MAB{8Z
zH=?~q at SDs0M%uJ#Mls)m7^)oeVv!Wl at 3n-iH2ega7FftiquEv(ccsyRKiJZR&Q)`s
z3ir6?L;}-KPcR%e^gA1<JA>h{y91AX at SS1~L`R#`u|Dmo$;AO+z6satV|?ZD#eJb{
z{m5_Z)eVe<X4EK_6whzqis);?6bsQWQDBA%LL}EX>dLSGPV%0&4GN7O)%elC1Dc>W
zuDXd`=VcrQkCP{NmdI!D<3wJb2u9+w+rU3pKc2y#+B$eB0!v_L%rocUBZ8Vk!<jUC
zhj)6C7nO#ZQeX4NtyCiTugX4$P7NSVc6w|k2ZXAkx%nc7M)761RE>b8{YO5K@;OR1
z^+MJ>)vLR;<mAN<tyVuh9k}sWN^nW5#FvFA23yBKSG%E_{RUZS*NBzd<P_5L;FfA+
zSP0$}*6!AuRk(R9vezp%ecmPTIo{|&V|Gl4=#+uEGmBN^A|$Br1;A at z5S|*VYV)4C
zIVHR=N~7T^NCG&BCAOKQh`vDzwSeCC3^(231c8U5dyn#hT|<#Vm`h at vX+IjM;Ev#P
z{<WGJX;{3Fc^a{#$ZlNC0^wS_F!|0fY2u5<Fr at 7~sem{wbvQv{SlU}0|0i~lyg}r#
zyrWavWPGDbf+=1jc at tAnKQiq&Qo0_C3NH%rb1Rpelp18JPR~%~0Yv>=9sC>JI@|eM
z4ABfJ60ecm#x^o6;GA9KnyxBt-{)yfTMQ3C<gM;l$}FjPw_I(Z1@=wMcXX|<p*Pu>
zWX4Wl>$j={TmLqBfcO!Irxg0}O~xTt0-PLF1ik1gaAC31_ziZW707J^L>y)r1(<~1
zHisfHvb#11AD>ZgaXGPAeQ6LiPfjdgd%4xaEj_=+L<P)(`S2SI#3&Z6NC at Fu#(HkI
zB|!G)WAz%;PAr&DaV!llTX4USYprPDO4NaA8>4=|lN%oi{8Wdu0R(L?E7p7hww7I+
zGYMai)laLss_PhZx9Vyt`Slp27qD5~*VBZ6BXZYehC1Jtl2_fGjIuE#{tZ$~DgumO
z8)KL29q;!?nLw~xN_%n$r+L^HOTQ1a-W)EhdGR9Ac<D}Le1L~H9|tUe)}swh2 at 04F
zTbbJwb%hkE^q+OQ*dJl8ifI&RqXc)(#1V8GA;BMs4M|;aL9SeB>PHZ(`X}E8<zrdA
z_Gmz^UhucDW9LGrbt6o-EMCzB9+vTm at Gp|=f?bgI9M$VHUjRa=8C1yEbL0F~4lq?l
z at o_W0&jjK1ke7VParL$o(TL~ys>{;NQda7vigt}fobS9}k*y=+bJMVo4xbA}l4X=6
z4#d9qc9dsLv1PV$HNtKPsX(b4bOCbWc$- at _?t(jgg)lKr=5f#gr=uJipgs6Z%=XU>
zJf92tO;}huhXYEI7zYWJ6=hnNDVnc at eCyB3bWry;gU(~H10V?PEKw7Ok7Ha_Z+CZX
zj?!rVbJC%zaXe}Yfey}+I2*%~(zAZxJG+d8xkWmM$8S!@naZF5l0CNI-j&!A`eY$U
z&-7)V_~oa$k+I)~;~?Oub9&pOcBk``Ifk>rDpBSfFonoKb!p5gr=yTSOIzbJNZ!&%
zR`41H<5=BvTi;$ruBkPSR|GMZCC9qVHL8@$lAB`UjMSYJFJ0k##TFtE#_6~O_ at Z&G
zZXvdp7`+E}y5Se|QR|&-AV=-Mlw5!{@8I(ae<TF5ci+eEmyiUB-sSOMP=zxJ2Sl>K
zfJ15urSP2Pc~QPO`DzzuNuuF6P(UDpNjU6KAQR#;bZ(klmaW^Oo{K^1VlxF}^~#+I
zVNqr&5|HniNiQfC;(=P(uGr)FQBoCnGw>MHinz)$e2aKVuj||?RW!a>dJm9a1}~hI
zZk>nZn;Z^)q1CtQ<MN4XF#Aogxd=;FfacVQ2q_ua|Kv&_{fd3uD4rVcyS((wRlTN&
z*^4Y{v<OJx*Y^@c&sXJoX`-_xB4{@fMEClE<Z_aJF*)Zq>{GVL;)VGZLQ*v1c~fRS
z5LtYCI%ks!9RD$cC2STHTt9Z-k?UsP*m-{!!5m^Bp>kYeD_t}_b;2 at g^xcgWMwYUx
zlO?%T;yCMzN&ziMyE7Zu>;m<}y>8{I@`o=a4Fds<#yFmmDT{W})r-8rPor!$cTzSE
zeva at e=?*vx^Hd}t37R+8ZhDW`%av!7dRB!Z^DCT2<5<9JyUe1J&tCx2SGOz-uV at w5
zVFqfEqX~ZXvCeq(k}tMtBhmt^8w_r@?}6Rl7N2CVrwARLFVy2e^T)QsztW#V>ris+
zn`buJ!hUkrWyefbT&Z4j=~W5*WN$c<VpZ8CA9%UFSEuMgMVyvV6z!Wa7Lk)`)$MxZ
zsp9!>37b#Cvah-lL<cf2vA6X`){mSanD{VR4;Jfzx8(OE#hKa-!+ES$0^NSjH-y<p
zk~6bmwhi>=?@O<Z?;P>E)JMqetk`%+R@#)Pzn^0e>DHKCf#kp;?qYlawk->DZ<0b-
z2Je}m_LXkXBEX}&3}G|Q1%qP~ABF2K<a!(?((khgZR_l<W4BYJzBxI^4!amMI*W3Y
z&3KOw#OkR<oDjMzHqg#(WoLPcPJ;vAlpqEWa|{Ad1)rwMW at oL(R}lJUnXek3-Q}IF
zEuecY#7oNnnzLyoUFOs0v8#@8Z5nh-yZEc+^OD@{#d-dZ$m3dpiG>4g?I@>g<js8}
zKjq+I&tkv%fRSAz6|8z`u&wx9|J{P+JQ358Wuf5I6V-0phZ14LMRHq;aNgV2^@^hC
zRm(XwLR4YTmSFH?FuE<3W>*qU{sqfg6K1(oR5`BEoIpjR^)qK?O!|GUalVLD{R}a&
ze8)(|RVA&X at WpRhIe=QAC4XrFQ0rl%;yYJ86F2pnb>@QgGY?{ybS?7+m5;4aa#AFG
z^JIpZcY{V+82Okn%*!0^Pgl#t`pP?W+lVwP!iUIwZ-bVJx`by2$lRJG(0NrPLO!?|
zH63DvZ=Nk!1$0FzpNnFcw{|bYx&1=ZzdrL$mdKT#pY)|2`od`bOhdKS_(biCN-Uj?
z`%jDKh0DvMqNWl2yG1K!q*_9xiFT=bU0H2&TaSN4GIey<C+a<V;+sS>wv|Z(vaXN7
zZ<gSIUK-e$h8kxHXI)JkEF825r8dnmD69`zNNV2Ol_n6BjAh7&O(UL=XW(JY=9_+g
zsPXgNqHVsRWne#B`8y`$heA)fXdQ93jxj{>f*0y77Nox3h4b~mpF8+>KiYfzb2zQ;
ze&eR@(bvC-hSF{&@Bd&#D>zL}%x at eAfcPHkOEg>0k!dZQ6sb!JyscmQ`tmST!mqE`
zI%!UlF;2YU-q5Ok3*nPUJU?>z=ojB<9!_r5GL-rZBR`{xWR-maps6SyGm;RilJ|S^
zivl&`(bk8Vpc3+1ID$CELO;YqjG3!`1Sp=d4CgFdxDG%3D3mrrOV-YzoMTx#CXcZg
z;`wol4x`rb7L#|C&q|V_VNy7_%z8^S>gLB;l23YU&Z3s*dRSk!5tc)iv0nr_%ivoR
zr&R-u`fG{GImt-B;Rm%E>JAW`*Iuqj?dJ5XuBfRF8$&VrZB6>-4`z8AZ@`&jBLj?u
zyhR6}<@`LUr*>NH`WKSYXN+js_LmS7RDPOT93ADW#6+_y_tORDiHk5X^PkG)n(|FE
zX_vM6ddAnn=Hf`Vyo}dsm@#lDz^COC9H50?<StCa;w~>A{l!3QHnT?FCM(WK-4Lwh
zd~53kY~Rwxu=xnQFq(s;M^Sw`n+{M4r7v(}t2K6T8{62o&k1h-tI@%j+0`O|J`QP4
zG}Fzi!`h|5CP<lyTTIQm)r>UI^M?)H%+MhGr4kc4^T;{nM0)^WZ-0N6*(|W$EHSQb
zWbMW=^^-|#Ti%t5W%~CvDZ`s_eET~|gqu+};*fM^X9EoU3BHEks5-i5rmLy^k50l|
zEtY7B*pP1*Tt at I0y?=jO3p;CERX}(z?|67{X1vm$i)~L3TavDOA+X)7t3y!*m)+w>
z%rN3^9-T;CRpaL`j*5&>*;cN&?l$U;HR*Hlhb}bT8W at k0-gm{CR^8yq8cp5ba;eMi
zYYKivW42ShFv`HPbKd9-0dxn)cDmj?+|F&xNirH?upahIUQch%aS4`<7hP&^vlx4F
zu3OJ$CWR4 at ER6k&Ci_R7sX&ug;ChzSAy>TZBl#{r&&@ft^EXNBqm3t3r%HZh-P03t
zD+C@(2cM*h%Gj~A?GM-CH60gJhMq>>KX3$;aWTNTHyBNK6c4pmFL^Pr6|8WdiSOWN
z1h{@G%<M#ap}$zvw`^@xq$!+RDyj{+G<Qk9XQqgq6SKUfr+0oF;TB(ma$7N)%0{=t
zSj|3oPkXQy_>@IVe3K}L{|=%sS6uoM*3nQfd-~*O12Tp~r;GoVqjko6`(Ua^5n&QH
zTtB;G&5O(8-T`KJ<iQwOe0w;#a)ejwX^}@@UZ%YWRIT|NJd<S_knOhKaoMzgvdF&h
zI%u>$DT$+xIj$(-yzcqpTan<n<_gUtl7o<AuZLIlCz3Jw(0URrqG*=*Ue0yhm4IFG
zy?XgtmR)dh?xV?R77;B-agZ_6fV-CEV0=hX;~5@%!9cn|LYcmwV-nXom&>u at xI3rA
z6eZi0Hwg%yGOB=HRY`K%pa}b%bbhY0vAYiG>Cs5T4s4T;Wfxw$So_uxi|`oVbw#aX
z_PQ@$?UCotHrh#f&TL|qhTj=66RQEn(uXr$Qi5=q`U}YG64%+16~@JTLUAZEiQ*=w
zGI7n+!y)UYWHY at PirlKwg>uQhQ_Ccz<4_bU>E+Br>#|cv)<Uy7!-|2v at o|EgpT0D%
zt%ul+DI=qnMq{bqS%rWn8i|y$u=x-0{dzw4s<G{n6D)ghM}wd3vKz_XCU~xz5dH{Q
zB5|P=x&x>Jw`vJqhFbAn>EbKhW{KbLE}PnO)QeY&aES_}1HosxpTUIyg^G6LpHZEi
zLXt>s5zIv4NgkbHlQ9J2#yX!Ez#rDw8p~`xHt2;m>xrV<yc}C;k4M&@vIkCAC)J@|
zUt$q0Q&)-)A at E1_DGt%#U?S+A2zjmSYA_en6qV=B`K-7<-qu}9<5Chz<8nMhsSJ}0
zN`{N at sU800J$lM*O5Q5rA}!ew|5P#+DMc~bOdB*~mW({VrMI$Thlho0EPczVo$IvQ
zPg)N8MD at e<5acm(9*`VBw)c|%ie>1EYG^4wm>qh#iVHGj5889`cvn9GX9RgzK7-fo
zO+dhY@$OwESZ_PYs7VP2D9s^q<aW+n#QDmrY%@a8)ixkg=ze2U>bCG*r7d~%ak~U}
zEByEo=^mxVS<Lzb1Otc5t)?<04qR-GJSN|pslQ^-+ at GBn<g^560hsFOb$t*<>I!@0
z7Pa#iz!Xr#eK&K(Os|e!xuy|Rq#@%q{$UNkm at qLcm>Gx?@ZB%aoAFnG^8d(JwkH+>
z>skj(5yu)y!Dj~TyT5r2WlWCLk}hU~4aBL_;POfr#mko>@29=w9|wAb)QAnNB0mpN
zjIABH!awt85yQJI;qqngKYtyvb3FK@?^>$9a86+FbGmnjZ}N$WL{i}j<-W5S;2nMT
z>;hX+sMm-3KHi>R*k=6s?v`U|xpyW#AQ5rSDkqOPAI*_Q-|D|CFyo!OcwN^fO&oaG
z1*jGcU+^JXa6u>p@)(F8;5|Us{za_-l$QQsNxTNg86R!|s!zb_5S4!mCjI#ruin4(
zG)c(*obQh~1U~eOK?sufjO3cs0oZE;d-Y5HQHlU;%YeTr0c at 4)?z6lWR{EQaaeV;n
zsVMLR*P^UcfU=7+?mrBT>%Fd{+LMOPFNFS4p(+SSBl7ENGi=L3nK4A at 5EU)XVX>4z
zyx3 at bKR+N-86374kjt0n=jWFX{eOT2&gG_e{qg+DQ^2iom23?Yit0ywe$%LV#!%JQ
zde1b5c8)muvC<~jV^6?lHMWt-8jw?5ppYk?c>1G40li=3J?`SlVSLJ2ZDPpnrD(z+
zL)@}D{$1On5f!4dhAjbME=otXJd}?Wrdro#ID0%Na#e at Z8E)A~uDKLUY#fi8cKpRh
z473 at Wh%a*38a)208q<R>vbDzohy;yX at W{iGd>!kBKttMT@@CssYKqy6GQ{W5yD~Uc
z75$R+e%6T15*4KYm6LfAdvKq63f9Ud;5E|W@*-q}`izV(-PDw3jBzvcdVm7g5Stqw
zN+{s6>}4rvJvg6W#`y8Q7<ai+s`FgnJYF5y=h3iWVpM^>$1XQ+7uYb~!uH}7g{rn0
z_wr*dSjA?{xZ7vpcVks|E<0V<ZZhW)If0$8^gXBAB at JhX?@4z4xbQp<b0IBH6bmZK
zmo7;Aemjh at E3lCu{=g^IRWj&wFKYXs6TZ7VSb2Im2>;1&z-slqXOm#a{@~EWx2>WM
z6My#zzq*tOqXGeYEjB$L;wed61-!N!;~*B+etYxnZBE9YYlI?Qyw~tWmQNVf;DTwQ
zL%Fny3v{@k62EU}V(H=FN4xT>jMO04?(LmY5XSWla_ranwxl4^jJwsOrTz88(@q+g
z>-`-mdC9(u#+>kki-Po=`8zWKj83y at JZ9$uZ3efL!Y;I^Yl~;=J|5S)Mj|(vwOOWm
z$5D(%j*pQQsmRr6qoaAUFNFCDtP-pvJI6N9B?ojWDh4+Y=Xs+dK{=DyKAu&MHJ^tG
z6 at n@!Vf0CXz<YXm()=g&ezU<}UAGq2SJyHxHzoUjw7E at txsJY`ZOh{sAwj)X4k*gM
zF;P&I!Qns8uZDHWlROCf`C&=Lxq5yGXL$BN&8*57>OU5X($K%>f3Pxq+QOkUdS4Pq
zp6e7oz<PdDp}T84d?$<8uc+CCo>wp>$K9nT{V4NXwTfoAadwmIcwuzj*WvrG%NLiI
zpFStLe;dfp=^4w8k42_E+nj2&$dq$`;uKK2CagaqR?an~)rkO)__%ESN`s3yE^q#9
z{7D&f(L*g(Wp`=ADOBe@&S6^Y0#V&ftX0iIb>~u6x;f3XVLWY9Y5nLNipj0>Z#B-e
z@|W}Z5Pk{~sL?rCr_EXMK;-dYR(AK>zv=358GYoj>MZ(zQ;~u^u4b_B_>eMOipslH
zCW=pxQV7%1c%YJMYj_K^W+Bg5U}9dPq%HA*6LUZD1gJG{OQ(Hb_*we9P~fV{9Iaj1
zsS8fdbPGA2$VQ7&nZ at jomNTQ@pmXN$Z1Q2L^|_vxqZYiso{EtUp6T?0LC;QY>io~`
zGuZlvZ?t<O@`i_#2A8p+3{qEpugl+`ONb$u88&2wZ-8Xb6S8O-4wHrsgQl#bGi5i*
z7fhSpDIPa%?IW7iz7Ry!O&lh!`6u<0RnlCvaSBbF&d_Gz at +ac280t-I%<9Um7BxQ(
z8nL{E>W>?a;O}n}<MLh!{HD^A&q{CTEMAbI^?_5&66)|c$f<OD>KUsOQ&IHlaoUqA
zWO43xX(jE)5Ua+E4KtsV+G at cgwF&aQOL4!E%pf<SdzBpTjI9=_Orp1zH~Z44W1r$U
zF$Fle45d(^=aad7IILMmgqOb*GFU4$^38i{8GTz&32w6yk~?R0DXtk3X{Q>$QM|Vi
zJxWcb?5*ELKNJ#)j6{CzQu(QA`>EsJh>{jHz|eGrKOYn!s9nfjC$jM|E9 at rmr+caM
zjaZ9V5v}g(f4QvXWA|0=BK)0Ckx3qLZ5q+dg2xG&at*746b$KANy--*W?E5pI;m_=
zsCS+|B9ARHbIVNF?-L?pG)Tr0kR#`Pp~1tgYiZN_J43dssO|R1l?7C_kw1K`fadzf
z-dQf2I0Q90F~*xRPumgyuzk=2rfcy~UqFeWUOW%<b&L;SIi~z+4EOI5R-I@?Q%{|E
zv`NKV+gdF}`HwD~m~Gc-TeEl#ez5eoJUi1Uma_ac{RKvO{`GaE6a_S2Pls>m>xNg?
z;NyhZ18f=(vrxXpkZ9kYXf}1)a?Cc{NFPsH^whD^WG~AJ32w533L4?6P?zSS7D?`?
zI7Fs>Vl7w*CFCh6iobfN$5ajDvv?wyP2<hD7RvL4CJ`x<lT%&G;)4j3;rlkuPcU5?
z#&*^d2MV&e32OiSjotqeV#}1Cq=0kB%6X?@&XgRq;K}Y~qxTDw-YlZv&TVbsj*Rq~
z#MdkmC+9Fc2^C{C{V5Sk(tf_-{wWb+f3`dyjr8V|>9Sn)e6Z8Dd*ks{)7AY4SV>O&
zLH{5rcd`Smro4RXSAB9HpASuv=5(GyvIn>4 at YWLBQ#eO61fb!o#OFVLUnYIi3vY}Z
zy#X?l<t*_uUnOP>clyB^AGgf-N>4U#Fj=8~*4el9sp>DtjQRFNAgohA`^jOU_P{1T
zx8ka5bK-f>PS}71Tj4q{&+>RMS*qCP_Y)*@ak+tPot*!3iI*N?6DOU|Vm+X<CIaLf
zI9jvZ&au6(-Hw%ZHz^iBR(*(q<k8NKwDwq~^DxV`|2X(y!_<zDuPi4<T=28DRn at Yb
zko`D-2nHMjTFpazhurjdJ&w;0b|J}O^J?wB(D{A5m+5|tQmDI3H7T4GJX#Sr$gK09
zX2V{$=oHZ!ucVo+-Z%pFha84qBdlH~S_P=W(owCY7)nwt!K4>|{Uz~U>c<>3bSq at A
zO{A318yvIFDu>Qv#$<c=Ua{uYRO7iIFxBAxwl~Op${d~-%l9-wgI&FM^3#Ax&))JG
zvYddR;Hz1ZOg=rkU}sfM$vkJTi%3 at q-#vuY7q3a-8E)ZU`~4hPWYzXh!8gD2*JTQ%
zs at 0u<S){H|ZEM{V2^whr=jkZ7Uq_q^gY at jS65(_aE#aK at 7S(}8s&9pJQ2FB#s>Ka4
z(l9sBZKrw9d#7vT-va9G>^_%mQuOCZc_8TUKs>DvYV(o}1>5hADS=g{Cwv}&iuiP!
zr$C>uuL-T<Y2{{$+nZq78KWaYaVl|0ejGCBk*p_?;yS{16i;a at dk-2!rRq$UI6ZJ6
zT9o(s04V<RsuiD8b7IhiV3tRVO0uyet-Rt;3urj!@vbN)%}~l;k|&$EaAOaQaP_^O
zTkLKiwcYS`Ch$c*?&se_(1FJU?`gnT+N{Vy1yHoh=$)zCAAK^aWR<#1{7v91(3gpA
z{Tqo!m at 4%2azd%>{Mg5Xu0;@u7B}7#i>u;xpssTqWGjkaF7pJWZTt59Sb+@`=jme*
zuKMT(qDF5t^(fAEY7;{(pt%s`e^gXQq_q7)OXA91StwgQrJr}Qsb$_kFZDT(SHByg
zMO&g;39T`J$g`nB3JZ<qD!{gbYGu>6+rQ2Pwap5VxFd7ULbDtY2Qm4Bi<oetU7IL;
zTPfYjQuecte9g~M at Sdby!DQU)=d37;mj#q9AFE2AE)<LJ*FF%@GAiCD8kxq<rMn}g
z39*dO2~^-Zwo*q8>7Xj&Q0{>VqJmZ*Z7FZkgLby=YGos9VcF5h{!|&!!XuZO6J$#5
zes$?_CQg+CY~Z}s&;il%M1WDtW-6cE$amNFLffITG?-est#PR^HXz`0$suURF*uWu
zBG(IMm@*fS^ofoqiyS1iV+L0^jn{n$&LHx<uOaawCjK#K$I~FOlzcCyGKtowZ41Z2
zCXKR4AoP*r4ZCC6JyE+Fu5tD{PS4;fjYgsC>E~U%sUNbZUg-2=ke_9!Swzh(qYbg>
zdnqNX-rZNL<Djwv-yZF<<4Y3HX2!(Uhx0BX4arnDx at 8+He)@^~-?e?=7Z-;l<13tf
zF;gyUT0FlQtN~3ddQxS0Zf1nnQ+ZjtAJ9exEJx0&b&ML_F4oX?{_ at pC6|G at jJ1Q9|
ziJDsO3`qJKpfwu|Bl=xHqYHW07!m0mm>~WB>At=!%=+-R%9}g2Nq<$Vi!KekBSTgz
zz$pK^w6>&oXWHnT!B^sX<DR_P*mywRJa7#s_V!D5$5Q8%N8$Bk>!9FGSxw`YdD<zb
z)~}GuX5Nda_}3phK*QR{fn6U0WgUV6FTlV9BJY5gNS-UzY>j)8;E1%r!6DmFmztRl
zv++goRqgp6*4FL7-ZSCBk#b4>xf>?Ro0*426P07%$PzLTzx6j{O>-RQ6`^KXDis?l
z^;y%)-*Sp_m<{7rROubJwz+sp<5w*Vcfgy+W|@cs!*#?cT at kGzT7fZf>)XLzALOyg
zmBaLwTe~_;QX;i%?t{pc7Qi{$8Cm8$6dUQ0e%7p<pVZdaE)J>V1ML*bB*~?Y4tsLo
zBp!RaH;hr9hSyuUBQ}@mYqx<%`WhiP3`V;x>9Z+&l<4`x`)oE-9bgx7#bi3X6}tUJ
zuI^BEjyH;~Q4QK#*AYT<vL(3z!Qm%O6#AJLdZTtW&7bp8g!ujuI>d`WWEdU$y6sJf
zl at b_TD|<&p^wv~e0JX%GdUXH9zzOfGV3e&4+4T)zv9h$qEUx*598AXG*Ub>5C{jl>
zAr`Jnzve|)jj$8-O&av97dqqLIP7$o+^in;k%_b3+U<**qnoO1RmUlx4Sg`D#umJ#
ztu at 8u4qmPD&MM@#hF~b0X*=Xa35VkZEGtX=a+)};#BPC{0T#Hf)vdL_F9FSwh7d4r
z=27SLfbqFgU(}6+N8RO63waX=I3N$-HQuwJ5JlW%FYG3Ldnjdb%h!oXyP2kENdG)A
zy?V<-o1OMf-<P*nt<2D>H_jQsjZ*q9-4c&Jl@`R(JbYwuSuA>63Cr2fU~S at UeQfwb
z`BYLlg*cf6I+$#-IP%3vGC#z2slCDQ#sie-YR(Cd8O_zVB4yl+_}4!IzBlX-0z`d<
z4}?$7#yHD{ei9}9kar^9=2^{1Q(49)26?++{)*DjvSeTbY&L+GOAP0Mf568qPLASq
zi632FA+?5j_);m{4=ZdrYP&a{#xF0`2@|F6Av;lPA at QmgVEQ?m%6QL(r)<IY;t^A~
zGuPRRGE5j^iPy at q5k1ZH$4-NGR_6J)+6#Rds4G28tasU-mQu$~cS;}8>4hc`<oj at V
z7gl+1Gt*~_QZjfJ<-&4!oY1hyv}22sHH9>%WWUeff63GyP*>RR3KdNb23X$9!}U1`
ztc)7j_uzsYXQ?cyA3kEXIthZgy!rU at oCkyfaEtvL1BPE7xc?rMPNnfB2iRjCW<#c}
z74%)Sl-wD46%nEfit$wob3$_)ZIAm-hiW^Y(C at bXr2W$ateDW at po5v-<L?k)z3scu
zai&yvVEgV~Td>=~%EMsBDw{3lN1z1JO6n<drkyQ&R|_WH+J)T9<IgyIeQDme8eQ%i
zaamP|oa<+X1hOKWRJgTPU&@)b)|>@xVNBlyU1upiVitm(W8hh%Og2hf*m8Rrk~L+h
z+MI=Nd3cJ~^Qh&?lM#D|wojX~f1 at 3x)=K=;=(Qg&88Z=;K)DYa?$yaIWp1K+0cw3e
z;7!mquy7YY-GQWPE<$)h33U%M5<tSM2NwfLnatAzFImp at zU{>QlF3Afz-z4Kyd;4q
z0eMXP*wYLxonsapQt5x=T2vH3Juo5P#gC6G!v26F;6H^XQd|I5^1lEn5#)PqtRct<
z(!EQ46*)BO+c<!pjCE#;3~wh}19GDFd#cA=+|kZvp-5b&JxW!5sob*qlG)v7j||=g
z#p>40Y_^EVPiIH}6qvaDiIl@}+BxX0U5AkFrQO%X(fn+1asOH`yvfA=Qq at CzUq9~O
z=uW#hXorzPtMbtW0YYx#CdeGn8vZ}QAdnK!<NpKNBwl|2zF(t632!~GL7qQY5D7WZ
zH-GQ+M at 97?{0EQ~{|9hFR6?(Dr9TJ!L5Kd?AN(&U2*8Q{g+l?_rhm|;))&xT*SWt7
zdH#S&717A;`uRmbl=sixK>v=9h<wmEMr{v`{Wxz6K^~(#+eg+)_5=O|ecdqF-XY1J
zG3%Vm`>2G~(3%7!N^+n^FZ=$#+XReh7Hjrr&*D>mT9DM-0;=F&?LuOJN(}%=G7UcU
z^xF<X*9s`L6B)8t?f0_c;a3y?Y5UVA!0+!&qe*r!H-d?DFR=JvbL7GsIxMf8sq(KV
z9?r!af`)J<$X_TSvWOB*3!cnv%c>`V)sk{VasTw`-wif^vVEUj!@kXQ*kcap!BRkn
zORTzrG5?NM`Pc&A-aiyD<;6(MFTk}D$N}-h%O5TFxBe?46&S&1dmw>zZFy7ZlmFG8
zr%h?f=vu?^YobJ{J&^t${}EvyE9R}#*(eN_qtM#k-hSq}qtBRo%SRYfyO8<sF<3L@
z07<EdttV3Xw#%SByh(?o=1h8H4lj^_qtfuL*8s+6!}t%3$P)=Dl}A`=@f3{g(}0F_
zMI|PpBvJY943C1QJVuIFt38gmhsggc1Tac8%|YUaM~@{m<C4}Zr%fr=f25Kr%NtjF
z<yV1y;`*AC=r7CE2f*<CN!vLBHZaO~el2geXL-b`mmnD<d(;zgkW_Rqc-hvytoq@=
zowxPxto^%(pF^9>+N*eGQ7UJrd*{Oyvg74R`m2+~|AS;EZ-<fd(aCPd-)K0l*pZqG
zDjvisjC<7GvwYo)f51x9TcG+6%@;g(K;}pP2bg(%$^6N_|M5_}{&Da>HEh at a0RMBr
z@#<ZpsQ;j^UDuXF?>vc>D6d4BOoFD)hDGqA%J2M>W at gz5XZa&Bew908yl4Lk=D+QW
ztgg}QYaxH&-t)g{`ZCJ^diFqv%Mt&Vu<)N4t__m at +d+UK^7;b)`+$Er2;f7R-~D5d
z^dAlafE<6w|K=b7Nb at s+|M)M-UaR~6?Y{(0_$P?lAdu3v;Qv2C|A)x%HF*6$O2pUq
zF+iRl=+gi1+ at 8SyoL>e8Bf|$q;cp8B{C`<20O0xm;dJmXi2Oe_ng7$1;oq9fcv1iM
zWcarx^EEF2Kb{Q#p~?Ioo(%sE=-RX3pI-c<VhyChwTspNf5ZA;deQ&(hybwue|0F3
z>i>-Jf2G-<RR6Pt at E#Y)oqrwhZ$B^CKaLdFqX9nn)SiZv&C4!ASKZW_)Yl>TGGFxy
zaAn}t>vk at ke~tWm6C?-v_<FkyWd>buTWaXz3L)$L>MOs_wNhy)uuUh<w*=L$U34$5
zE||KVzBUj9?8)-VDod{d%K)Q^BNpJWKM%0$GyPpwN(O9y);eIo_UCSTefIy?I~gh}
zCtqT>=bCFPgrw|SKW{_m#Xwi5OluV<13YSIi<b1?M$6Z~gb7|VIVhppnQyx~ZzTG9
zjFM_wIL6uWHa*!E#>X!1+p2UDqaq4A78QXHjJZM^6U_(atFc$7MTmZdWg5mlDLzkP
zpmikf8gCJ*j0+>p at qkf)@2TITiTSoOx~eOW?l9CstAsi<SiF|$Jm&4On?WER-T9;{
zjHmkNemO1t{I>_b;ot=P=tC*FyRf)HV|W(#QRBy)jrZ7?BhFeKi~=q9ncT*%ebHgw
zsf&xMY*)-UACY2ya(iRGRhGWmPX9+<(S-(m8&7+b$};cnG0R}~jM3`>yM|OQ*RuGF
zxXV}vbbLNs!6 at umUzH}NLBt3Z<hCokp|#92Ak0BcU{`v01Tx_2%W_n~_J(@C!^V7h
zV_{<XEXIO|VMQ|)RKLtSVY2~N;fg79E*cO&h*^B+-&%&EAGPetFWnekV`#c>Uuu<J
zZ{-)sopN}IRDxu``JUgkiW{~1^F^la&=*&t1CSJ<lo+FXHgZQYaK0nroD;jSB|T9|
zwpTHP;Rr4-)YH*9n}wm<CGo_3&XB119AqbVXx)^)>UA}!YTf>q^>M49VGfm|y*a~i
zwG8#zTDjc3B-F}<>F7vT5eJR?uezM%BB3VaDyvdOrg~twkb^<twoM)1+M5y0cGS!(
zIktIEU2kRViHl!Bj)z^7(iB^^X1ofrsPKnJuxG0GfZi=>!>YnKw}hCiywZJ(h-4++
z_zZiL{wsP`&6GY<TRG^jG$W7r#KK_m;<6N%Q0_vdefq8 at O=!CEMz8i!QyC4feviSl
zRD9;6f$*l1s;y`A*6*g-be7BQ<cbQ-z`d$RJbQJklMGLMbiX$TsHQ8_4j4e#0)7p*
zjI%q1I^`Ru;BJs@*ywG at 0eUG9tVsq2bON5}>Z?cdZfh2iyK9~<$mS4sczKBVtc(~>
zmKK@`8xyN+gO|-WkQnx0UkE{zDw?Kqe%m7yekq7K7yDkz2wJ$DLx44SdaH3kb3y^%
z)_>uP=&xZum8%FM=qhS*y{$NFXd;4VcOJ<bDl6iSM1QW!)VpX`J+(^le;k;BU!+qK
zG%67wL}R3W)9tRBiSFf8ps<WzvcbdEqQ*k<VW8S#96!CLFLF`~{lfA-`7j>Hhfq9G
z6a29d9kvZtW~H}%V)VhdI))f#g$Yl2T`dYyyfAH4;i~$jcf0$sO1;d`aFyDFBfve4
zHGiOk9f1 at mCT!%wqPD&ig+$^R at _`!D6|)hiVe5Ih^c}A*y50ffZ3$bQ_P2amIsJ{R
zx at q(=Wxxhm3CbBcVCA2yXX3z`w>I|6P#IEY-(pu at c;TJ$E&;_DMA1}Hql{t8#l)(a
zTrnvcImjR1BX&?3d&k+DBfiY6LEej^qv$&Y)Wz6zr4kjf*y at weot{rgxd-!RUq|8w
z;+V;Y2lCqB$CAc+*6(;Cq2pT?s=Y#to7%rLd@<9O^B3c%=mJ(NMAZeJQt)bbJKY^A
zIEhTqN9}6H<wG;~nODXAYoRCEdjn>Bk-`K+TY9dNrR|r$#$l)!<oa{y5o{woeS4D%
z`#^V<ODQ*o8ITcKJimdUyF>d}y~rp&(UTHX?G4SL&~4FLPSR{ICf$2ag=3`R#jQ=S
zoT14}?{Ddp>IKaqf=qP+vQ?YTpV^`}!@4^^Qf>2nZ$r;wBmB%#<R9;v%Fp-Bluj=N
zqTS at t8HxhxcyZP|-j$hJS*+T(yOpM`;4ym8x*s;7$bx;P=9>mk1ySX?>f9CC5&SRI
z6k=YUUuy@%iu#=oL~PAZ?+r`5LFU#n00I!j!+!isZ@(v24$sjZmnvj^_>OYTB%Fex
z(K|7ChU9nB+#g;!jh$#tuQi#9fHwz~#<aI<Iv*DB_v$8^ot*V}QKnynhZm*`|F~mI
z+L=}8$xjzItVp6I&T)j#1(G6ydwjHbHVogXCrvz;>oGe&Do<VB6016T0Gi8|B0FC<
z6pojcpB*@Ul@{N;;>W0h9=eml#L3Q}3gd8<c}T~1E*VI{)|<yQu|BG|a?3<R0Bk{l
z;u4dh%u<A*{i5Rq*&=z8&KaEwzbWQ#ng{>N#Y+e1xrK!15B>EaR!@C%*754;;@A}h
zlN(<rD3QxXEBi22Tb_M-$|mjp>d}U)!bCj#S=N1jaZJC0QmSTUERwq9RM^Xy)+Sez
z0xuo=g|KfH%<hvktS%iFWD=c-lIW$e;c9&Iu5|dG3jCg7WRyp}WA5{J at 7KN}I2Bm+
z6>=;XB{?C?8GfuE8d<EI-WS1F58}J;NEEmYHrl+;WmY+2V~<HzF5ctCQ=qZ=wG4Sh
zt*%U_rQodD^xc2Ww&HHn+ZP#{FM?A%E(uin97;dmd!nRUC-mIeS-#11(U`s4>eyeM
zGTMFcE|f!nvIPBrb~(2+9hsb>%)eTin=la#(tV`bx!c!ImRO`!MAh+_7{RGKjZS-`
zXRZ8#j&=ONh+pe*m(0iEpS8?GCZWleGc<;FA+MEHc$W9IM}*#S6>&H11gMIz_f|0}
zsd39GkM_8)S$RE6D0#3k%#draK3RF{R#f_xO6aTF0tNMkkc0?9Hs>!bE3gxU)=VcA
z?15v+peFWlMbBR)H%3lK<Tr5nYnDXoH6fhHh0x!QsU8HJ=rr?jzK at ohq!n~u?!Xs0
zKcU5XVwBswHjs>Pj~|P$ET0{CKz%k6(R%#4>)3Uo3efD^ks6UdVz1 at A4eMgFCXEZW
zLTKSj(tQjDN|>+S6W$hQ^zs)5MMW at 5PCk<Q-3k`;<~lRmbWqTr;yedms<!<UzYTMz
z-m->I!KF5hw*vW~6yZ3ILCfO<-5K*<qo*8AkUW7f*>!QxgjiFwC)D+8`N+$fvlX>8
zGWIojhI{?{3_%@cu+^tc6Jw3*0K>6&7!#KKnY*VyryfVgs>yU_5VBnG<%RUiyF+Oq
zt?vttZVOvGtXk9HrSHqV-YuUnZuQG$c{rdex<KU{uNAa7P|6CPqG}@04QI4;Ra1Rf
zlw&eurlhO`bH=9*(BWIvZB$P>P+NLEQ52=h{{Z{tL8C=8VQpwKkFmCQC(<hAIiKPC
z1UANdAGi|B-`6463Kt{gQzOyn+e%ONGu_trV at SfkkD9K~u+0eIYg$t~ys}(8XR462
z+#nP-d1%;`#}r;HcZZ7goka&5bg#kY%Ls}y*w)`m)Iy+gkig{IJAaY5&OQrPp`OCk
z0j}D&G}|vS+0HW#K+NDGCBrr5<D3RGWqHCZo~x>1k)5k=RnoHsWOBf88nb at t`p>=N
zsc!A2k?+Y6`p#@8r#oWBo<-dYkmWeMR9G6f!Gj3y7_Q(iF+O?v+gKgt#DwjG*C4g@
zQm?AouweCaRDY~p%T^wxKrCc{KAe4)FTwD8mwA-Y at 1sDjBqo%S0Y8&`Pi|XJO0#g;
zy{=cVuK0B8i&di>^26Xv7I4r$HfSRsC}0P*vs$IFvH at mBhp)@`3}^S(;5)YmcRH+x
zU@&~)3uE6 at iBA#dPV{X<n{mPC#%87GB<}-)3G at x)PB~>a+Aa^%W)G`T$6koQBQLZa
ziG3vZ<|+RDzU1y!g|hf{aga4ewS@)#wXn^@!c&C7ULcXWTr*=OsRvAM`dvspH^!+{
zEWGW_{n<|Ks=MrmqD|D+nxMY$RZUW at k=n356<0uY%l+xGj^v>Aq5T`RJ-L*?Y68Js
zoyUB8RR==U@!kAjXJ)Y2y+*SP_5<2>Fs#nj1=ZY^sPLQMvW#T-W+Kk~LGmnCn>^*A
zwL6!JvBzoB>TQ;pP8M=C*&m6wbh<wG@((3-=}B<Ar+Xgw{`z2y!>*D{E at 16Y&~3=e
z0$F~Ym85B}^|&6atfuh&;0?cDMuvNyH9Nb8 at L!QM(GCjO*aw?|bGc-Vn~%e2#mvKV
z1ZwsO*I9O-<`G1VglWbDuN5wPd5gTX<Pu$V7MTdom&vi8K6oFc)~IM=1Du$97$BvU
zCL6L{CE1n?(Byd$>I at f;+e(D*MJC3}`b44Xd4GlBrLJD7JIXVZlP89=_EN>6-_3Vx
zso&nX&B*u+K&+8=PDVD$m`_~t#ARN5LdFChQ>7|mp at bGD7KdV9<oEsJJ at feara9SI
zy<VK%AAkG`lJ*(MqKwxD7qPiC0-Rn_*`je>w^YZCH3OvBR263M4TS at A^T(zmU5TL9
z)C(;P_pL6p*S7Yt@<({kUcSW$FDO|7+SH?Ag9yrZhkkV3a6LhE$G35R=_wwywVxE>
zL`%?>pWTh!T|azwrs8}<Mrkzh<1=5aLs at NaqL&xKHTpf>n=J}L?)$}6z#K_?KImj)
zhZ%#$Nqud#C#hZch|(~ZScKF1vqfUGf7}B{ZyVdw3kztVV^c=gh&+G2R+;QmTh3WR
z!~8nA^*2Al$Ud(z>SHPk1diV`(`ai!?%rU%8ONIm;dNxP>H at hZk>rVuOD6yJv<g3J
z+=y|#gIi%MIGBUK_LpJ%A$V)@lWwpi^_NCDi^*-HC*Kc##qc>vQr9|(M^?iUy6e!g
zM^^`hiS7 at r*(f-D63DGmS3wMN$}0J_RPIJEW+;vO`~9I9Eeu(_MG(mGr^AiX1jS`q
zn~7*6I(Gh_9KBL)el4dug9nA(Va(GaO_+;uFBmawRn`|8eJq*W^TMz*Ri at 9^`6y?)
z$_j34yrur8hAWDAiGvdRki=b>!t<U<a<m7J(kpZ37qQ4Oa4e|)#V_R^iF~6&Dj^}e
zF#bf9*(__)<2S-C%A<w+%?ghyxl?qFPPj!6oEJMPeACkfmcMYZC)=Ni=Iy*3{rtpq
zWvkI1#qny$yRLG_CU4idcL^U5z5IP!5l`fZ*(R*V@?2rA23=dFLQxuEosrsUiH99x
zgHAty?jh&fXEKq8oC1uAl+5Y3b~?I$J|+W6wZwQkOw%iL#P6Wo==VBo4LRwEP_K~f
zJ?<O7m%2C~!8HRtWvYP}M>^7B{dB*J30$H>cFEw&0A{ZSePdXGdB at MgM)p(zU1e5_
z#hyW8*$4~Bb7N=mVvQer{Mk=%9)m=Fv5iUQ)x{z^-jAw*UbUgCh?M4pSMLs*6vX4P
z*P|6UPOJtH;!HXplmtDsk9wj<)PR8b7>w?JzT-n#hhx6kX#ReDHhjyWQIN>(5H;Bl
z_6FH6LqXlWue>(-2`y(dKk;6qs%xqA9dTF at X;mFZvul=(CB-f%=AlawGng`3*1}0-
zPyG=HAGsvVFnWe$OP+D=VHXFjMhL-GQZ)-I0w3;XNq7D1Yf%|jM?a-3=ra$JT7Uc)
zRCLeR#odCok|M@*A*!l?TL2elMA$`VG%cn>wMO{6I({9gyOkKz6gfFA_vm==v04sN
zoL+t<0&tr4&-Sx-ry}QDpA at IhqLK<66w5vr!NaCrNXB6U0XCpXDzxo2o)QM^)E033
zE(DoC+|!5TmVkhq?Vf7Vf7qvj4inHO9lXn#<B|wIY3PeMKL?3o2VGh?C9k*;gmcpG
zZ`)=0e^)>wI79kxn4G+Pl`vUex$UKuZ5t~i-J#{<Pv+q*4C*c(!MkH-1+vPY_XK-w
zMLY&Q$sOU}Iz)vdW#_0Wl!V5zh22}3^Eg^Mk8}wUfuHv4t=JW;WO}`zL at M*73YWb!
zpl+p!sMkI>6DQH1jCnzR(cgnQbd;v?r|OO^cJ7gD);g^3lR)=8&+<Z$=1=(!EQ_Vl
zxKBT at 5|Hz4d6r6L`I~s&kSRlyJ{zvp at 1&ctBx1_rbYv)3kzdk_tx0;QO~j~yZp>`L
zPm=_vijpK|1 at cK+e=}d8<aRF#$a_W_$z$hRYOR(Xgl>Gizsi)C)$TxfmlhxEorKg)
zt&j74HBi4}ePeHn4Rj$;1=*Xkz4WgjH)E7VOAFV(Ix&FuriHaC);6uxCGnH*$*Q8&
z7=@s}7L;Hfl|c2*n{K|{`7jGB&tXl$BY#Vlo^R^Bk}r{W3{UbU`ht(TNvm>W)uw1b
ziY;HX)ep$ANUmVUShav>V at G_OGU(}?npU*~I~89G$lk^U&1=5gUG#u-7eX})y=Pvj
z09&>)%yEHOIm4HNi?|3vj0>{)86}a(xwhf&3 at w7toGye@$KfJk)liT46X%xSXThN=
z^_w8zJ!hIhn@$=H-I;c%u8 at U`W>J-i3OfCALmZfQEDk#??t%~pBM-MP(6x7J+Y+}5
zqcV$X32wW|pOML|zW<VwgLKCbEp6|&Nn)Ch+uc&@$(AhZ<@W00eRhoTh$Xx_A_BV$
z_FDq_Ru3jWzViv3YqkaFMQAPGa;F+Fb2-!?Io9vcdj14-<=(yN%Quar8+4UgjHP!(
z+~3&?je%dpba<aM5i@?VuY}WrB3$@-F9*)J!dckBLsh1D>>Vp;a~uDoRFB$ulP8Yv
z>&e__C22>k9Lnw;RF~$4U+9n1J&UhTM>;#AIyh+=_<j%eEOPYPfq*%_w;Vm*6yTVG
zWjYfx4=#dHdO_pJ+Hscf)1Aj#70{<xX<EeVf(o8z*&k!ZbMe)tSLzc^8?wuFnO5cz
zfw{`2xNVbASbM4=X_XhTOTfO6ZGsnCRS$E)=aNTLjs~R)0NUfh!EM<{`PS|ljj8&a
z(eZK>*&HOAQ4NM_Z1Nlx+<K}SeSs%Jc=NH#9K19!Z(_qs__C=m{^QT5)=~|05+WdL
zR~FowK;xNhnZK$tsU#Z)Vo5<8h9?p`4!%Q!ONu$KXTcb$g}(WSA#YTqc+&j&(Y6Tw
z8dRy3=QwR{_(UY*mC1q&NDQkn2Q+V50>!wct_aGJh?TZ6%p3<fORG=H+PgkKehnKP
zT8;0BhYxW+;*l8KVyLK`1M`%_1ZSbJ0Ioxz>}L(<iu-xX^wjEL6?lY0P--Wl^H3C2
z at AQMFpvkQfvE!MbLKp?`OBChx8oUr08!LcDG$|MLWF2eWN=W^tJ+%TPil5Zo?pRS#
zY=j`&hHLOGO}(gjQh3zknddIf4X^0pb9jnjr7&LEcEd~qJxCsbU1dPeIG%{Q<DIx;
zq4B=l>6`L2)xL*rqE8Xy&mfq>31Jo6MgH=P>I9 at 9QEWV%%C(@ESHs_VzdP2 at iPLeu
z9 at 6b=LU+n>KOqq|1Jpo|T1Jzw&B>vkxjHR;lIk~_d9RrkZb%x?GN$m}3+fV8MzDeO
zJ`pcvrj1UO%{JgjqDRnC)IJ^m*2VoY)N+tJ&}w6LKs8zO at g}<F8=zx$;T#`{Y;V-R
z4XymSK}3(+IDLQ(l80 at Olv|q at xIH9V7Q4}PcFZV**VFy$qc*Fb at Y@LN?<@!oV#M<c
z`x2uh<(NnrBl!19$4bw#yTWew(D!ru-Knk;1%LwdqTodU6W2L2G?+s8YMDFnWmbFO
zWxLahp?yUF19GykJoXEANnRF=Ot~-m*jjLSqdK!zvS&ovPq6Cjq5FsZQh>p>-A+5;
z=U92~cx4O6J5cH!CH0P~83Ys7$G1Sy_l#I?mHwtneYdg4HYf22C%r^YTFXFsak6IT
zshVV-u^@v$b`SZHtYC`GWDODZ5m3>bSameeK-esyzHvtDX!$Dj0?B2_)<XK0F8%BG
zOeWh8{h!~0b(e_mmfl{fTSTIJ1)yZVw38lup!?mb0Q-Mxd+)F&mv4WRZDT7<MWqD6
zh=3ryO5fXvGywqt=?b9}BE5rdG&BRDOIHZJNhl$-sI)-n9YT>_1159`;l};le|*pH
z-gEA`=eg&<_j%sTytCHKto2!+wK6lBplN*E^Sek1s<ELAB3VazjEO7kQ{oy?FXiYF
zK&ouK>wcasWSk5?0XkJ9SImDmT`lL-`R*3GZ&#TEQ3add^39KdYtIRW4z$JLe?%+g
zFN>)w5FvcDX|*t)<fc_@^>;SDREN|LFR!gIdD5jC+Z!NQ*34cfBK>7KbYy?$STg_s
z<+(Id at -$n at JEN23FARQc-=Sxam$>sFYHqDfBbD^d7g^SEwJfmpn_cF{;}lb;>qQLE
zmbqyudg@;u5${Q2#Xmm&TrZ1G^(P?YTZe{spkR`|+<r8g$&_~4fz_^Tz_Mz#=WR*K
zxkYQLFObLrq8bHbNr1Sm6kei{=&UucE<gEmz)6aQD3nq|{XThqL5^o$EGrU$T0n1H
zP4H649FCE78lR|`X&Wue9y8fhyzP=Gx!#|ti(N_8>cYvfW14<U>zZX6^QK+_-b=0i
zlJV%uHfmD_FGSGrOTgS#a4?`|nbX_t=(W94{cv?=Ew6rF>#+t|p&m%*)$_Rada*lS
zkIqxQM$<V%zs4b>3!VB)4bO!#pO|L>bfjf;Hau(-BDp<2Jx41neA7&wjNQ}@Ul64P
z{mI9ExqN<GYojVDvK18*v~!S`=u%mV@(m|D5Hi0&-a)T8+{>0)t2%ynTA0Id^yMyc
zCraI-l1Y6qyU12(c4Csi;OiJIvkty(YU_0ejQ{ORqkgkDwbF_C8!`Oe#}B-gT>g9B
zYTV?lqpaSMebdo)?x6+S=2XO~QikPoZxn>}qtc{{OEmvp?r2JFp>9cK^4wpsJZz5w
zDr5)qdJrz!IEJl|pfu+~7xTj8fT7_VeBK|o0LQUd;iRD}vzqH2bSA#}uRf=bi{=Ri
zVSo6E$1lEpHwEq|<X4#4*w0%(3u#Dp5z+Pz`D)ICsEW%=ULk%~ZJ-p=UR-u!19q4;
zJz(c4eg)!ts)G65J&xjLnIzUVDO)-BZtF+*j%U}aV$!|YuOR{^ORuae1M%2LGO9h~
z_=BXI`pGuXM_IjVx(RbQ4BR%r#Q)Pp)i$^HNRx$E$tUr8^VV0oayW<IrL2^>2<t>c
zQ{%$Mb+toxzE6L89e6<- at aS<LuY(|qD$}sflLPSSShdf?SGC7SjR7u?yUH!2U#)Ez
zUVhRX&!1b10|ypJM<tXdWSy0XXJe0@@xwD;h9N84wOm<N!y_GRB2u{w&T~1=HKqAF
z1>R15I)~n at 1w~d{##xj^4|d2+*Uwj`p))FP9XUhpLco2Sm3mBn!J{o|+HlEylgbLU
ziW1Z6&C$=_N|BA5Gy7Q|^#;TWrY-b76gK9`*Ul?ao*jYR0Q>33zmz<CV63LY=4>go
zT0x^bpRM?5gI&$q;is?Ng3<y at 64mxg3e&@Wb{8LvfA8ZJ0o)9~PF|wrj^K!mB8p7t
zpZ;Elwcl2rLZYE8CFUMKVUhG;|JvbtJ`e3bdgp#?gn!yo4SlZ5O-e}7L-Uc at Cv*7R
zobj~;rPDKFW at r3-SF$5(ZsZ?5fBX=ACvol4_tHyt73<A^DwkY7J2UA+`#K|j|Lcw<
zdC?NTh2fAMOn!&VBN89<=Is!lKR-yzr|yn?07 at X6-Y23dQcM`V_@>d&-pu=_LD73_
zfKx;C>JE>mIDh@)t?f<Y)TSSob2AqmsYw%BS!<4Gt#`3&10v~;?b6EOeMh|%E<MUE
zEcXk7NkPgt1Up#<HoShT=|~{QZhm;TukvL7y*!b1VK74li#w1odk`p;uxVA%!^Up4
zjefiSz`=X(=-k`&B)i`$g1rESpSuk`(o|04*)p`-96}gaQO6St?|>4Ev#{=VBsD{E
z;6b)@){9hXLY7yx0({1I`$jNTQ_opo?`TJ>NOf0|Ls4Q8-5)xP*<C0QgS8^)RF5C$
z%3liYhJJo{iTygrMuU!yF%l?okB*M^)>?dV?N&K6-B$$dRaS}l6;YO7&+$~m*)c6k
zcZ5CrjyStx(H<I~_32o#K5V^6CLK|*efh{?p#w8>W4b;2AZ9Qn<YVW}*`o_qHn=6M
z2s_FFcXk?kMkMo`oqPf&0jAH8y(|_;AsvRb5r>cKs6r$C!l9<6?5573#<xjNd6Xts
zO0 at W4tb*Y7rNt^+_-aV{H=$EA?5bs2o#-c{_)S^6it{0<i?$s$l3C<TvBb?6n{!aB
zB{M2?5qB@?U8xEhpKI+799i8~k=RL8Oi>BkJr*c2Jt<I}c9OeR;rhqPLiW=An@%2t
zyf4+NPZgO^qC>(Y-WBM6$hJ>HK{n$)c6O1MO^5PIVaL6IdUbs#w;-=~XlIqsxo<xF
zU?HlcLrgL>zM)Bss9y|QQExc4JNB#SIVC0)pqrA;6et9P4fxYP_Mmw8mpC8`r=;(~
zqs#>LWpGW^@LCz>b00r{%LM-S6;qXKCo>T|JZ`HU)0qeMEu*=ffW(a=49CvB&gE?4
z%^4n{#|1lWCiOOKn#m1YV at t035b{yIC!*fA0_~f=_KLB1GbMd-a`VM?-=}<7u=Hk}
z{L`+z(ka(jRW2^KGxsrnPg)hwfIf71vD<db;&{{6a7NLzWTGJStIkI|Gk$wK;jKeY
z)cyoz{|Pp;(;{u>Vfu^a7wIh<0?l0xJ5xnEy4V40{%kvP%S_g()}u6Qf$iSGHEY)d
z^^ToXc3{wU-}{u at LF<imQgrw2bE?_uG9Gd5m1MagL)?e$!(;oG+24e%u^PE^*Fd`Y
z5h3|+=iNca726$Eb^iRUZ}coaT1zg1!tn3>xm7$#?V3m2p<YA)iZXfU4?C_#RJGjv
z%uq)muw-pcR7d6d4$P;*`}l!!W`e)U^&lYY!&23*@5LRk*pks~$;F at hhcCN^b;sv=
zb|*g1DI~nlBDi0K19g~FyU7HuK>+G^Y^brb>if at nEiI<?A0-!c8Rg?aW*{GA>G%DN
z{P2d``ChEH3wxeJCb#sV>ID}YTyQAG at RO5%1TpStSOdq)s>q@{Y~8^F&JC43)<1I%
z+G`>0tuUJEe2}6TfVy1$9fH at p9Y~Kr<!4+VX8JaYnT&y=yLF9tcuj^k6qySX-e&xL
zdLp?T2<I~5WSZ!O*W$aIX8RU*S!5PhSg^fgWfx0IGZ!W;7?-(bVz^!(v=sWi9Py)E
z2D#bMt_KyZI5>GhQSQ?#K3PSvr0>)L1v*Sp6qdJNZ6apnzz)~EI}inW at OObOxH(*m
z>V&}x%E?%jeP$G770Q at ubtJH0ovz10M*55#?N$Qqnsb9z><=cKQ%UXkUY(CJ_8M|4
zPe0Byq?;4TKJ|hko&%eWK!O at fujNEZkIC(rS1|$MF{0umtGyUz-jW9Gyz4an4gzhN
z3R3paez4Q1SYpWSKu(oJx_WH!C)_6oTUe#OmL$Ct+Itq at VjFJ80T?8bRb~n2pS9lJ
zc*iwmTB~oetgByk`Yhk4Ry5UUXvS!s(e^}1XE}0u!SG?18#O=2bMq3cdv>Qc_XLx<
z*o5oWt7njL?c&i!=h}^ftL9s`$>aJS;Xjn57v(8IqX at Nzv(wAD{7ix;*6mJhi*#EH
zn3ue_B$E<PU3{w|W|k*=Ly;{pdyjk)2YXd*So&X=&-`pDe1>FWfgKHaC&5H8GT?z;
z7dtli%7mbGDcao)-<V=}QOwxjMnYY%lwQWNx at fnG#<JP+`c!sDSteb+vi9-H_nC4&
z^bQ!>eMR<t16^N;Y-1TAjH<tG`O)1WQE@?C=wTq6>00 at 4)6*<IRnwKbYaEhOY*Dp{
z>N at 2RH~iEv%D!R2n@>+}zjeLK7(&UgoL>yJ22uUAZ at b`B3-fx__Yn2$I=oFlOJ!tN
zRa--MdkK-zivU(m7uy_hD8N_>Oq2op)&eU1thMEHwd&>A>>O+ at 8_wY#@xQSYaI^A9
z<K}A}2bJhVN2{!{_VK)(3}J~cQ`5(7R6?yQ#^jRX3M5TS+3c^OGjD@#xedPbHGCnk
zHtG5{v%I_^#g`G|D|Ipnh0Gc at G`f;iOtEKaVl>y|6Ytj|78>hoXsD>^I_96%)VExF
zK^I!(TP3zJFgQMn at KI39{**Q4)gOrm_O#>llQSh0m88^h2twpvW6 at u1lb&J~p*wNq
zz at A`qaO2ifvYP-Wqm=4acclgXUM=dP(On>sYO?(JP$mT-r(Ucv=5|ev^`(o3<z!JR
zktILgTd2y7aPB2!lwVzzEBZ31zVqEIaZZZBmSVDRfoKuqfh at i0JMHyi8*r*knuv7R
zKbXZg3(qTcoNA`dQ+O5RRw^`~l~jIbx!HB*vwV<^|MsP96s)%#9cN%%CE-D_z%{)S
zNAJ9VvkCo94C0+`6kxw=T`^tZ8d4{u*^PPG`}N4IR!rN at XHM-#Oy=5n%7N&2rIk60
z*LrOP;fm|>90!sEUd9vW?PNcjjq}V<RFW*GvXHztscz@?e4P##`VPURi8W2Q>g=9L
zEAvS!&B|M77o4B<{rT8AF>Ri~5st(yi$v@}sw$gS3TW9rdxc2ytf||NL?SpfX&#$L
z8mY-!G7WiPXseM|<1;ZgqXf96)|@OU!N=0IJmK9`8<oaK$a(4 at 2a|RPtT$Y~<W~O9
zax_pno6im?RWD at z5p0!M)btn*Ila41I~ymjM>*6bi`w19D>x#L-WZ+~2G2B!Oi2Km
zN1nhi0PboTBqn~SSUfH6LB2&_&;AKqP$5trq9G_TbCb}ThRz_I`s!F$%dX3xz~e%T
z?{%M7)ppg0M9HAjf=u#!;w+Psv{K&{u!{(FEeyd-QLp9Zg{0_xvK at AY-MS|iuZ9%c
zly%4ETLv}hkk=bM6 at 4V3MM1JQxSr9eeO>pQ_r3SFwH^tv8FapqzND2m7_jn)-+0z6
zJq-CI2CJ#tgGQUqXE&RHl2c7pvb1-E<rJ%Mn;38m9^;|fT at 6HU2#a;!^}vcy$lD&r
zPLP-<Bk~jyj9}S1l~V<7kV_LHGE^nCjiTeZ5?gDeKr8kq-Qg#3oXVbWC at j46wh$Ir
zthHALCzDfif at _kby1fGk=}`>pBOeK?WTon?^}f00HJwEg at Z9e<@Z91vuL77&zE5Q(
zD0$TM8Bsst1r0NG_A#F3`Q!sf4c>`Hl(L0xk-vpzt&x*tz?r9D1HA#Rv|3Z8gfN{l
zG|PpxIFV8T$bbXmI0O|y<%U>|0`3ACWa;=cThyPxA`GG`Xd7f~nw)Kvs)54xbz{EB
zIW!8}?2p&YzGIZa9hyy5-7rpK at D!tgH?lrRYfs(V(`v=jDM^6oitnp?ArLX)r8K_v
zU1fB^YPq>N2b2G#C`HCzC2}dOIqIv(-4rd%m(GQm+B=(~lH=@=OVCZlu}Se^?T_jw
zB%fU>o|LM@?y<og3r`n1 at iTvsX*S)_)M$%)W at 9nY^V2(wD$eLac=Xv4ke663rL>eq
z6e!=^4pByycUx+k)QU at Z%MDm~Xe1Pmv%OCjK~3+%p`wGeN^2pb5{sr?y-_dT)W#aJ
zO at zGVcQY@s-4^wT#@im*DD|?+3_)gY#(uysOcILZKbT!%L(;#W6&Qmeuf!TIz?29(
z?a7a#(l=u(C=&Xo0UA|!b2dp~o1I&}$CLE1XLZ+H>;kV#i-8n2Vg_*&&x{1lTBb(p
ziX=cV?Y1T9eYy=v;fmVNjiHAvUiq{#>dKYZuY4cJxG724z at L2lB*K-|{};|8V*nBT
z5taVHnR}-%3&@b7S)W_2t&9n#oqKY at 9dZ2HxDI7ueKOF5JBDr6yjtZ%S%jZFlJGMt
zqMR?S?Hk*=QYq7ZBD}Nm-MHB<x}+z0JD{dcYwH#!5%p4o@#r$>*2vK)f?+K_`Mu=T
zng=_>(<4)RHWmJ!@>x&J*CYP0qsumMhIZ)^Tzp*;N}gv0dXA~|*AB-qOfVmNn$Hc%
zAWh2?p-WqwC#ArpC)Z`gX9gcl=#Arts)47(QR|+iKn+xv69{HGGah<sHhpS+eGtW7
z@<ZQFWim+cVc#eyZT9<Zy94{NzxGY0mrWlgv%)Bk8|WQ0JhKVMh&Cx0<I?5#O0V7}
zE98mEeo1e1>&vq#?bMrhN$Upvc^H+UJp^OaIU~9`o*80nR1$)h8~j2|PMwNWRkioe
z!-Qv9eUC%juB_!uSC<1>?X=%y0y9PTA)z-zMT|H849hGB5(@Nfaen*zj7|(uk0cU^
zwX2FHT{T|yWhpi9~_BTYCmJyVhGgNQFn-}XsnWWC?_EvCBUmmup|VL_rU<@n+<
zo!3iC<|3BHH)$aa3&4O_{3tdNwZ0#R#`U~^bzRE^C(KD+gf^gI&pRtHw8Lr4yEwOp
zlWz1KZM1Pnijtd~n$%339iYD{WYceP4!U+4YYLWZ0Su0|8=}Q68n>c$133Z);DEvH
z=7d1`9l*7%Hd~mh_6hhsb>;_jE3oLX7I}KDHuR}EP{D@<1u;D^eF&C=B{px^TaQ+V
zBX^mq^Gdt+OT4ayPSdRF&Aj)Cd|C7`X+7;plh-Dsm-T^llao3jSQp$K!xN`NEe<W7
zCrlHjV4glU^t6zkebqgt9-rn}M9a_t$){&PEdk~Q?cnaNOmdemtzBhDRedYab;-#B
zLPll-m9&})+B_(mT#7=?M&lru>o$Yhms8Qj7D6xPs_xk+V#}#W20Q^>F%%^S$ETUl
z;y#rb1BU_?N4%M4xs99O#%EygBUyWm6cA@(;)f(Tm~a_zRuT48F`6-*)Q4(?U*PSF
zuyc4bAqYx)xN*;g5MC|6Xw!u-il1n*n37wpUl-<yPido_#=ClIoc4zsbm!P(_fpf&
zU?oggGNs>Wq}=)sR~Hv_p#NjPx4=A4a5853aZ;$;0kD7(Gm)CvHCo9n!kvofXJT{$
z$cY$CEG`Oy*25W185spn&B<WWmf?8Fc7)!ZerP|U0CKh)T*spwC>rz<_xkesxN?q#
zsxyuV2U?B~VY(9z+Fm!(uB5INlLgDW;a=PtmP5*SOjk~AoWMT7%e$j$HM1P}Xp1J6
z!$bNl7rW%J at -(|gLLlfvGHPac8WT-c*3#VgSj2zwf+}y^oq{9;nP*VQO)3s at CQh#T
zUx;40zc0y>SkM_*KO-B!`T8c|ZGa>^$=psFTv)`xxFm7k&igYx%&TW-M%_(#p$P!G
z at 1l{k%fm7$vTp|wQc+d1$JKJvEV}0AldJOw+Ewb@&*Fm!Yj>{3KE3*>%<Xxl*LZ2`
zEN&zi1S9`$?y-%%&irLvPL2t-DIzJ2B(g26%Z6*_YQ>X&6ZQI>C1z)NZ>VLW5XE)&
zg<xsb;SEnlC6lh*Tb(h&gmxhm$2>lr*lq{`WS5CI{X-lz0^8m>%<n%XvK#0np=xW#
zs4)wAWZfqB`*t<Hac_YH{uh$EM#h}4Y-pAW0UU8W=kJ0W+)D;<4vwU6j8{>(#EJ%2
zSSDqn-Fu{v9Z4<~cXjS+2VxQH#buB$hR0fmgwC}F2xD~X!R$}#28`CpO*T2Us);X_
zuF4Bk>-p?3o!+&eVlScUT~hQ78lGRd{BoAZ8fft&sX-01ucQpx%Jg}XP8So4$R)<U
zG+(Ue%*pY at O>zqOMk^-e?jaWDjv=N6+kH}s#>;}V8s)$|7UFf6jz#ADM;q6iigF>@
z(U3Z)bs`ZX?WmHv at iP`$#JV;8+3X}gPuC$X3ut8OwcTAm`yg0O-^g(b&Dt_DBeB?U
zwwTc!Pyh{W+aV?R4*~AoDR+5^t4lfEy0&j24^?RSGsqR!q-<-XQUx)^@A#z_Pt4Zb
zXv*53!#ICO%th%--pG#hE3QA!QwwtyGYACzWJ}!+xY27lW>;P4O3x}6Q9k%8p~nrc
zdLC3;7T;6WtprbxW&zpYIv7or#Mh at Zi`Vf=oo<Xyy#vCt`KGJHR}c0ea<+m?-P%=%
zjGY2vK-Qwa&`J~LV!2MhT!vti at +NuzFB}{3ZkQQ6D^}RD);z6eJeeS#W1b{J_DD~W
zGfFWPjo!4~XjF5<+L=4J?$k7KByXg)TGw&vVpHbklkBAlLE{%Er(`$p8c!~DH~Sq}
z4HQ|b-G at 8#yk)buC3hD$xo8M7^x&P-8&{6MaTzF7r<Q4r+GzMv at RE!b{Afnj&<7U@
zRn^k;KGoa?nA-pj+j=64JkFe0S<PZ7S^S2{)Ca_jo*f6)L?7<pLwdMBHeHyle{wWP
z0QuN2n;CVoq}oTn7GJ<f_wO~Bs#MCIeizBE(NlGiXDe<7=C#U+4oZQOKDOn_m>TSs
zY)$crOFWA6k2y?Q at 8dA&H6T=43w>PLy$vYA4)KurBgKx at zh;rngL>JV++y-nR}_wZ
zsz{imW=s&&nVc%LIlhg_9`>TDrPbF??b*FpgMg~`T)~dt5k$3RU2BfNyju}ZK6tnk
z)*rmjG0||&{<L`Do7vQTGYu!t%OX5T;LTz<4{{?2omw0Rrj6Lrwuhhjs6MFKcO7Wd
zoE3eAFQwlSRIeAWq~lXrP~lHhXb~8EJIUf?yY+}{v(oSZFInC%x`*EmkKWzZ+&QYS
z#xDDazcsW=PQ`|sUg&;Qbp%n%!u$?SJqqNU%1kxF!~aaD{j0Unt5%12X`C%YjDW9{
zegze>cHLmE;>&}kt|rIc&deJNAgoN!j!((fU%nY2k2Fo0NSRn|Wm^uBFb;8Lp6%w!
zo${7K18m)xs6V$2<lkV3V^CSiiT2Hgv0fvUARY{xZ~HLEy&wB8>Q57W0QLzjrCfn%
z{5t=LkE$s<laGM<S8n#B&J{NWh6Dg^zhRnoYi4HsiDjVZ^z(~bn`F#`i`|2Djh63^
z;v71CUgEayDuc8<`KwGfULQV3f80}&xsfwv-9gWuC5u!&^&0;;F at BHzZpMJ7T=C4q
z;(bQ(22ajpRQ^8Qt(mCXCO7v5qJesZHkzlz7AtpnnmkV24<T*cg0co$n)qs)_NXPl
zkM8FF-7}8QmgY=9EVn=onxDB|I(^<!)*5>ij21?p_W{dlmCJ!ZKB1!?%6)vM9SHV8
z0J(FbqPP5fgwMtM%RC8R*P0+9rbqnD at 1d)PnR;raKMfm%p1XEsyVr4>g1Edq#$?;$
z4w9Jh2e;OYoQ?9pDb36S!b5^w$xb=pMPG;#&|4Gj^IQ|pu+BHxOceRHOMJ|q+MpjO
zxNr-;Q>lTbY-1*Uu|ovurVZ}otAjk~*X%v#78a=9$Do;N<(ZATq|Ec&%%7Zji~T+s
zp-&Tv+qK6=98a!!DoV*e7L3d$pQv)8%!|_|)w+VNg(D(FzAQ#GwDnxhGioTWI(`47
zFK-6gzyihF!b}Sz!ndD$$(5~U+EF2A_A9%@40k)lFXbNw6!e?#>WtD*g=$d!Di^tT
zO&~O84C1Bx at y|*(`3PIzj*wG}&O5$sn(IJf>NNm%UoMY86>)QbhDFbC%<E=nMn%V_
z$QA`39Ij2{4lTl>yQ#-Swfuw3V7J)#Cb7d4tpPFAHq6W1hrEYSt4pjt`QAx1K-XCi
znDj?BnAZ5MDLSx5rv2Amj1zK;q0C40y`Q*xe-5=C_RTdX(O=P|8}{-{?{hDnj|!iF
z$ZKPvF@(Sc#F?&*`f=y6w(mxydXckB3=iOl8Wvu&A8yowdcRrY;He(Hl({B|-$YX-
z)#3~3L-O3>!nCSRm!Y4BM(ompWhI`T96sAVV8X16ljm0N)^scTy=WRmXip at f0Xw%X
zzPKHNhK5<xLcb!$TyA4#LKMhZetM4OVzS7I_>CTg3OL-z7dy&0<3EfbbIleUuW)!|
z-^*i6uIbs*`OU!YbHPM_OE}>fN+UkWTJA9+T<7!&XbXiD9`5Ut6oU)&Ex#~cQ?@Iq
zCJc#L7x3%%H+Y at y`6qXIukOpb*6(<LYKI;ro1)TXjg3$3K}sIUK1`-|MKct>!tj9U
zrvL-Ej=M)60&g_ko8*Pb1mqUv7v9IHZ3NT=<pE9TC*sX_Za)<-6D#Qj_&h3VabYy&
z@&02vXr#{Z>0`L%avMy#GEsKEfq7Q;U|+{!s9f}zv;$LGyGC_SiD29pKJQh!-OEuC
z9Z_q`Sz#B4q#RR=>*muZYqzD5qIR+~sz2V^XO~Y`HY!R5Z{N>6y}KY&nytj##IqmB
zgwZb_h?~hz at Ldw>tSy-JKVDfo4_oCRKj&YfDPMy}J~E${RZ-6x44Gz2KsvTFhdu5Q
zh+eoW**P<JXa-8V$*KDBjG6bF=xtEBGh}dVq{Krb9dTqToE`_R<nB?_;XbgT{i;iL
zH64z4*%1ST4+7FjA(M#E9yL_Y&`hfe%hdYj-Mr%&Vi$fp=tuubFiAkE|9)zxb17+K
z+3ItNFu5s24okv^TAy9;U-=XDv_$o%pkd09+Ya<Ym#VjDkOhnX!&)EL2S?qi?TG2I
z%yldqz{AO)Ei6LLRYUGY2Lhj``I4ogG`xD~zLu7c`FD9cjr7i at aRhuZwua;_Rhygz
z<k99ivjUx?NMuNN{NU-Upnp8bl at r4ZOFGLP@b<%0^Rx~VN92(c?~)>*GUHLrz#amd
zV3bTFDo=OlmYG%F<j^heE*>pyH{v?QHQ4d~g;QqGsP1@*>^K~_ at o{^M{W{%`15Sf0
zih1!acF|I&rIrR{CzRrerpB at rR6~=Auq=OFSo%^FO!_i%Hh<yOkqAs$Gh at b)z}!CG
zlk{agUhn8 at h{vfFsMZ^v{$hTT)1bEZ)^Xt_&^bDaF^Ka|ZZTPJ>0_zO=APA<DXpn{
zMFhTDgul0735i6ynubcNgGU1X^7g>_q&M at 0m*#yL%8xN|GMl__zAG4M8=S~uqdbSF
zaU>jsf~Y$X;_LBZM~w-76RwlT%tdEW$qICIs$h)=d3o&X;)Od2`4Y=4f{drhTn1(r
zIe57!*)=yXu$Q)b2<Yr9T*+B3>F(z6k-UJWRO$wreNYy$7gIWI+`--ypkYfC*Z at Y8
zlmEh>rxRZcgAK#?X4FO=jFsgM{iV)1I6P~Q%PX}Y)I=4S)K0_ at O5Mzj9dK;1MXZb*
z7gle|INr1c3|5N<dxvV6e|5RdG1z*i#e{>5rOqPG0*Zi13Od1eyk;H>?kV<CI+ at PV
z9aaN#qk{HFWsn;cj*KK7*o}+Pyzn#@b?duz^3)K}rL&RqAT9J&@8{`IDP+ZlE7A!v
zb;brDhh9>0#Tn|m;aL;_g+-MQAYvz`zV{I%(ebuXQc%T*9P}#nBJTxS?u{~zc#xoM
z<vRVtmjea);u&G1z^H8++Kq^xmDQPEg-V0(FMB6_&NQyZb|Qu at o3MYXuY=+uzm<78
z6_6bT&Ocn*iF4xhqER!{>ak;6<K!y;-X#{g3Q;@dLRtg|{je>ySiG0*GBz30aZF&E
z5VV6&3uj1Sdk~*fI`l_Qeaf%{h=eNZH4FY7T*669nl9(yvM0?yN}}5Qg|*i0FNZ3G
zZvx1a{zG26H$c at P0|$=oy5ha19 at AnKD_40(7Y&JJhQPq#!N<7Hfp;|`-t%9+g!@D^
zKxM$LMY+%W5=j+q%>Fbx<&rHrxrZjcEl;7^2UP(J?4Rx1>aBa6J!cl&41i^jf0`Jo
zsHR_|`zpuo!8a|BM2Bnhl}T701Ra>%UI#)nSI=jPa?32P=eR<zuQ}L+TS1r~?5y`E
zHy!_Zu6YE}ENrA;K3usIo|JO7!A}2p at Ag4Og(Q+;^CVTet8K5ce5>V{umRi)2{KE!
zbokiP#o}6scB+v$Thc7AEn<u>jz<a&-RoX`LA(3<Hpn?Ox<;zCP;)o_o)`>PI&~Ng
zObdDtgDV7&j#%VZlX$X+o=@BqTTU${xOR`KUEWzSMz!|#Xr`1j9XXfRNzr|^g(=O%
zuwSizd3f!-GXXHy&t;M+CQBQUb at sj;I>hg<mm0iVU-V~PG*l57=KwKc#BWrwk^PJ*
z$J2p+Sr!0Uh&M5vfR5f&7ua?);!^!#Zoa;{<H+f+Yp;L*ecuh at hp$J%owv4~P+5Sp
zB5)?yR5p;!C9?~h%(wCI=FwL~mAEfOR>~TGOH$vh58<G=?=eT1eBOCi6Xm<ICX|}`
z2SaLGJIk%+ls`-M_S+E*sv%XqV+>XAGK;=}>oF7EZAxl!bU$%*r6szOj at L20B}PF`
zXJ$3C7JJyky<~-^o8?brd6|{a0X4u4S&mJ($clBnvEqL0etMW#2qv$$2K`;uZKcY}
ze^ai;&dAnjvC~hOBokgRrGu?XD(c<wH-OBt`6rcXFJ$=}2-R5P8y}y5;~q3=JA~Xn
z4G}E4Vt6TO;;vZr<Z_?`u1X<$noG|pnfRSCxc!ZJjXtJ~ewwe!tH3BVWdQL$d+^DD
zw&?;RJ>k9Ui_}ixR{IB4L1JR}5f|U6GfoiSs(#F>gNQ9q9aRGzxfk^I_E*bai$gtD
zMsiy&iieR6o0PpIB%P4ugTB1Ucll!_6Uw{cE+~}+6+6qtngaMuNC{xOc0C4YBwqO7
zETeCRNplH>_pbM59dlMSMP*)=Eu9c0e*_xMQ>R6{*Pq*f)+w1j<#azIfY{i+{e3?X
zcJdC*ATPck<+_7q(S~!Wt!@w6S^Xn{2g?;NaZPM-%;ke?C;KtL1JeTcSP5`EXGTO@
zmWu$ss*{sgN{;N*jYdj&Z`s01CCAu?dfj;*1#X=CmAPjp13|jaA5X^auXQtDzT at GQ
z#w7>F=o<ZeR%%Xrs at ZB(bj6#AE{lE>j<=RlH{KKI3hqWMO>!7STF{dJzqrSz+L at 8<
zr86#~z+r!5p%r8&m%-7~zFQbwfCqZ3`=W|CGID?G$&7 at P?b at YsLo=)DOfK~Hd64MV
z5+aK0I-U4ESWp)t;WDkRtJ!@}60gS!^V&nqd{}99 at Lqrk2Qke>0P~V`n``$F2Il_G
zZ4>_b3N#K|eDTDm74iAy=yE*Gx&7+Iru9wa1&{Q__oKz#s7xunThc>vi-G0H_wXQm
z5PBGp)E886rSm-P78=F(Uo`XN3ho{>DNnxL*2;aJB<d>ff=NzFWjt`DCGfNq)Y8z!
z!X?$^@fbZd%R2D_6LF;UmP9sNk#z4j1kH{~EUqxgkAV8`J7yv~Prmz3-ydt1o1<+S
zVa=hoN%V?ofs-TyZzBGyw-aak<%lNb50BWKvg|j?Vnn<R2J$v8ubqI>l9~!IM`<qa
z>$6g~`A`x<ndvq5MPhc-n>t^WbkM;dtr at 3eT&c=GYW|K<j#4u18+CujbyG_!uc=oh
z4yKs88~zmURjDzB_DU^xXby|;d}Tj+l`-{_XEB6x)b*Z1Izu!CY`lu<=w_C`BjV)1
zAh)aQ2aH5^GK_666Q!R!7~4ba8U9LY5ib+cyA^Vo2!cv6UZ$hbd6z)czM(2>NHv6?
zb at YaZEM!Iz^X(0|j#I>XXj)B|)nzqku(`s>HFm++5nBjN*=p>k5_0vupmCpk57bv^
zCXBYYW at iv*r=iD`15c^@+AJZv=YI7}m4Q7U5n0j8)(NoAk4FALo%>Zva>fa2hIvYc
zI!vn39l9`LDDtfcRd#MrGnZx3%_<wZuhzD>mc9Yk7*+Pu*AlQ}{o&=qgt^#^Q#v|d
zrcNLo9UZ&WB54JY8X9_?<K>dT(a|9t-RllSNp|jxv?_Zr-yUM at xT8)>d6A{P0?->m
z_oe}c6nP-xO>0RjXQ2sAo7Q`<3;!x&IrnR6M*@HQwX$f{FTaNUA4^_ni|#*bb|hFn
zw$U0rYl|ybu+^Y at Ln9=Wq}`$l at nx;dd!%u$sgnmgP5CN~Q;3qV>>OG|p)Y_8b~kP6
zM$lsD@#vWo%bw0x&g*e(eH>)D_72+D`<4*&!PQa&vz%RZB~Fd?#%w!}f{r{uqlP3C
zG-*VN)WKwmPkb=|qykKGxn<H`r&W|J=<~RoeW#T17!4N!`M}jSxxxK`q*$^(G3E4W
z5KY{lNTANXBSzx6rxI>4%2=P=*X7t%?1u4LHx0OWS&!2LQ*75}OR~g;UB)D`>3rDE
z6<M&KidA*iu;mJFti9qnTL?&n__aQ3f2E$fI$&l*Evo2gu|wO!s!1D;G(amv>M%AZ
z9I7lj{G$e^Qcv~+{M?I*WbK`!HvjHI4J1aoGgHKW?+k|}kC8P&lSVQ8DWb?zb!zBZ
zv+Mch8d3^R8;=x{U4YYoT!jFQ?iKnuCp1rnwmQR6Zmdq4qicg&+5IE at 0Pb4}G3<kF
zEOz-Fw!bUf#LCwKJLavo+x}J`2Z~!RF(LjNzk5l392<XbLxel$K+>Y0cEdT5qy9O6
zkZ#FP9U<bljLn+dIbwdI$GbM3Db#fhWCaIzpOs6fy3Wh3+Ydj})iN<nIBKRbO7)G$
z6%7Z at RU&|iwBu%=CC>IXZ>_oC?bz+8=Xq9jJXp7(F8uSq)%*dd_OABUYnkHmkuG)|
zPSf??#m}-8n;afS8|{m)S+fFhh`kpSv at EzPV55DTV^FxlB~sNAByXcpqz`$-EO;~#
z4wE*JJjzT;a2#x`n`}fuaZjA&KXxq87-8Tv+VwX#0jguw-J{0+%lRj&Cd-QAi+=x1
za9-XA%s1{QjDqu3n2hoJlrg!*Z+QW{dl9jm9!k`77T*XM<JlgQliac!#T*nxDF23t
zPqE|?2NQMddu~uS0D~2VyZ&Q{(Xwxd`Kk?4Gmx*GX~Ivi{gB4UQ1FnyKl5C0BmMb&
z88bht1=EP#CUTFD6E(xd5)A56l?^v<nuZj6V$tDn=qRdQW>JmD90WTAfzqnUZWI8>
ztk1F$2-!#vXY`+{hPhVzOE}~5n?r^TI%Ez>Ft3XRJRIclcC;Ah(!wme$2}F={`Bib
z)ZSi&gmIko7P~3PgAFU(n2zjE3`fI9s(3He9X|0YS%NUHfo7T`_7KY=d`<i&G&r<Q
zXc!MF*>B5 at T|}s-w at erqpUk%-P+x}6G1tFhWaL-~_o+;=q7-qF*B2BmVTUaNxXQy{
zVUs+FIXw}ka)X*_hse440?R$fIrvbEGlFaT;rd$%@5xJwnTI7WyYf<UAhlACMGFh6
zRxD0|tXezzCXJj{(&d4RiNHLgn4QlF^Lvs8EKZ8geNNmzaG(I#t#+(6i+>I9gcL5~
z-Tu!WSv$E^3uBZCs0C<<C!W2SVYrE)&B^(4=9GoU1 at KtLwFRD-utWD~*PV&0*7YH~
zOc*axUZNk3SI^`9Y*$rzGn%>$=avB9cHRwIU=zrBp+cy&V<KudAr-=|ePB0$w~Ya*
z?$RN`@$iY27v`g+zl9V8aWkvP at 5*PCjYYR*G^^$ml5DK%?Bz%8 at gr)409=x3i2QUJ
zi5E0^h!+=s0}mw?ecp(jV4QD&B(b=T6vc*ql-<=4bb(x38zx5gM}KkAIMVGiFCPlu
z8LlBb?9g0W9~;<BsCy;oBG7zBfdBS70W at 0Khunx=!#gyPPVZa_d6xCBp>Tk@#AU)q
z=3YOa(XN@{GWlEp4o39eX&#$XgFPuT>3vAgQ8luz72sU=**8l9$#D09Vk6B=s6_4p
zEg>u4I%o+qX6|yZk&+PU)IP*!k(__qP#`(!_}ckLv at KkF*-{dT8WM0Y&e%U&41;@p
zdCiwTxZW;I`IC7<q>hOcn at a-RymaUec@5?j%{&}UPS1^=tvmGAVWwHk94=ZOM8%uE
zF37uI-{Hw4t at odwvA~VHCY=Q#w&2U=C`@q+ZlP}kqy^%M<hi7Q)u7~^;oh+<OQltj
zh}l|CG?mBiNisH4i>L at gm}}5m2d+?=#3s%M6Q}|4H!-y$Hsx*_MknYJ;O at mbp1tr4
z at kMXpkf#nH4LNXTDA2kxbYtzG`O at -@u2*@CEn`jro#<Qosvy{!i7}^v-WZ(A(GLcQ
zsm|A}`2-RR={-DD9w%p_jXuqG!gEGHOOF9sDsn&x;?VXQxAgZ~dsY_T8+n>-ri4OI
zWN`65yJob)&H&BFe?F(@sj<5qYuz9;7(&UnOk(h7o%K2W5?KQ9auEJ!AGX9{=|jZ=
zt#{hvu5{TsTp+Q)M6t8U-U?I?Y1)<JZtQ2__RqL^?rk0Pe6mpe0{yk0G(jp7>BHcL
zfmz8gGR+sLpqqaAQmQiJ1kL5rl)S<rsT;Uw2%~^0+cMx&l2ZGu6V7GF{cl^-z<A_j
z<%;WDX`FSyIXFC{X1 at Fnm8k!PTmCn1POG#l4~dy%C(~a8!6Mm1-;~fE7yf2Rnt`#Z
z;WMiXdNu-y$A5;XsL;_(N!$ykfrOXci16&(39eA_<2jEhuJr83XRZ`p2UWVSmLSnk
zW~ZW^usNrq^K^6vjGE at gG)ewHfrft at -G6~Kesy{7?~>d9o}m9lSN{?1{E7wW{(nP2
z|0c|@&(L)DKL%6(*42L$=I_Pwzog>-Hq`r1NB1kV`acokzZFdX-`@RQIZY$eT9_~v
zFzjEHWb6<E-?0!nh#1>gq#x63Jgo+*^6=0mKd1!QWX<gD>B`KjVt%`ueh+x)WcQju
zTE}+QvaA`5V?R4|r2MQ6^_8TC!K!mGvg#nIyP0MxPV0xLa>7ODgWfU5Ba0w^LUUkd
zOe_uIHrwDvzB#Y;7q(A%ipkZQT6Sl?SX{!oQdNXA?}$B#!=sIqA>Zg3Cul}KqT&%n
zJ2yQE4yE+tvP<%<M6%_OrkzF?@^(puBV{?xJLN~M_<q;iv#QGQyks%14Ka3<Pnstw
zwg;!sO|K;vb~wh4<=7LV`SHUXV9Jv}p4i}xY!~Yk*wvV@!0oar^oP%!Wpbm4<%aO3
z&lnuf9vdU3xUI`~K at LI*gNr?qwvr|F$bP)ZW!$%dc=E^HkCPAU$^pT=4JD1fNzhIK
zxFr2>NC)zD4X#t<s1eBL**p~qot09kR<xnQNwNFH$#OcH78_>}27md#=Dxl?HK}`{
z+9K+k>vCPZWFJU6QF9g?x0C?0=$dqGEjl!QqwUfk#w2#D29`(}U>|I3R<iC2*b_`8
zecD5w6hOsCENpUKs7Fu8-3x9=_#W(vt9PGxB|v at VA^JLE5-w&wJH`4ds_>&_3kG`H
zj+bqe>vnV2wVr4hq>y`}E9iG&jSoRl_p;sa&buqu{~-NHk5wISeMNbRo8%ZoR+bbH
zP*HAalMeAI#*ZyK at 0%2Ij7f`wJu|xRsLCP}Kbc|uSz_D9s0<zHhhrttp?P_<GW-&z
zwd=U0biDy2Q;gothIl7eLIy&p-PK at 5+)9}%Ukb;<h`DmP6#NcCNq;oTu9|p!9Doa3
ztUQ<xeTj1^HT1GeuDM|z!=c65(YlF>+<PM%>az7a`8;S8F4h1iiOG at p%E2*v5uf>*
zOVrwEhND6T=?)jWQ!|+`KjaRAodv)Wi@&X%>!oLOa=G0!Q%{02aZopC@?^rRgDsns
zop2?ZEMYUHE{&eF1T}+fI4n`k^|zHK6*gZcC)V)|dfErdE<i59c1hd5G%|{gPLIRG
zyZ^Js2nV at vg9aNxBea7{UTQeK3qUw`Dz;@DFk&o56h>eAEMRqLAQ}Y^^(*H_#c*WE
zC62Pfl-y_#n5d;QGsd-jqiRNOv9fG8;{#M~umk(Ft$>^6l}6;j_rczi36l6ou0dHG
z2d6=?#1ip%qP7$Q+%T7;YA~-Y(9%C2NMa=`9=I1cXQrD}KqoM^Cjtmjhj&_i-~o^)
zZ=rNM(C)z$ym$!f{IAGwjFT)PJ4_OJ5_oJ*Lv<rDP-T#)n$vP9G-dgxh4$^SXAT@@
z>y2&vC1HoUANI^=5zyMqXH_VOPnL5LD`34<1x};2moqn(6l^q19fylqXjR#^piJ3j
z&Z2PX0WrBfL^=QS$+fA-UmH0~dQmdpy}8JdkSzTnV at TF=Z+$%xrKSGZ_I_2o0Mmre
zzIe&mosiqZ9E?up6P%i9cUt1-!U?E$X%qy{nbvz4=kk}7I^)thGk}n at OB21hO8rIf
z#++<O!J4aT$ilp}_&vI>v at F~u#;bb~Y0TQ1d}5i#(jgk at 0W}uflid>4!`B?-LEPEW
zNGNn at zr%IG`uq5A^SV4(s7Ax>+KSE{*zT!Fj&BY<!C0DFCX3mqPQ0cV+=(d52`4T5
zR4C`c)$~{pYO4pQAHSk$Z(9OM^Z=S>$RtVYDIcC2)_G0%)2y`Jq7Tk~wIOs|3FVe0
zheXEtJk4aEHSuxtQoeS^KF?!3XzpRx!R#0E^!C{2{@REl#U at oszsx8cPE2vH0ezZ;
zmGOV`<h>YFlql1VooY>~3`~2N9~)V*iB=$Ou+J98OVB8RW?H;+KfBv0&laB=%?yi=
zn at RLJePmoS8c;Pr_ONrgn)h*EH#=7SiKuT|k!&+hFl}K<MnGqoNjk^t^Y~R{xES1G
zt4m79uT0VCL;ABBLEe04B7LSJ><|vn+Y7+vb at MKuj^B2q6Amj;&sDyd4 at E+6_@9dZ
zLRN=SKmwR%tV38!T9*3Hz-wn7ts%$Z+QELEQ{1PA{FHTjd~)VtuK8)wM8$gk(8-zE
z0afKV<fwej(YF|0BJ6z{1?*TjIFlvu&*Kebnv`h*jUXgf%@z0Ne{S2Y^mU4bKtgbH
z&a=&2*&K=TC%@5Iy~1t(0N6jHc7yT1ywm at H_xOKvhW`s){)@QzUqAu>prikW%l;oi
zo4?7|{}Unng984CUH;STKcl7oAE$?ggo{1hsQ|&=s0Uns)2Ne(f*heU<6^0lhkw(%
zrNEKd2O7B=D2=}vJyX!FrCCPJe^I}sz`jMAZKeUU7<PkgstssMdhB1VT+NM}DyYW$
zzyHn6QnW%fPE$PQ&(Z%<D2K#<Lb*}?q=Y(zy#siAu3Vx0gicdU_i_27mw)|VX;j at 3
literal 0
HcmV?d00001
diff --git a/clang/include/clang/Analysis/ProgramPoint.h b/clang/include/clang/Analysis/ProgramPoint.h
index b9339570e1ae70..f4b044333b8a8c 100644
--- a/clang/include/clang/Analysis/ProgramPoint.h
+++ b/clang/include/clang/Analysis/ProgramPoint.h
@@ -85,6 +85,9 @@ class ProgramPoint {
LoopExitKind,
EpsilonKind};
+ static const char *kindToStr(Kind K);
+ std::optional<SourceLocation> getSourceLocation() const;
+
private:
const void *Data1;
llvm::PointerIntPair<const void *, 2, unsigned> Data2;
diff --git a/clang/lib/Analysis/ProgramPoint.cpp b/clang/lib/Analysis/ProgramPoint.cpp
index 7945c5c2fc27fc..faf6b71cf18c9e 100644
--- a/clang/lib/Analysis/ProgramPoint.cpp
+++ b/clang/lib/Analysis/ProgramPoint.cpp
@@ -49,6 +49,127 @@ LLVM_DUMP_METHOD void ProgramPoint::dump() const {
return printJson(llvm::errs());
}
+const char *ProgramPoint::kindToStr(Kind K) {
+ switch (K) {
+ case BlockEdgeKind:
+ return "BlockEdge";
+ case BlockEntranceKind:
+ return "BlockEntrance";
+ case BlockExitKind:
+ return "BlockExit";
+ case PreStmtKind:
+ return "PreStmt";
+ case PreStmtPurgeDeadSymbolsKind:
+ return "PreStmtPurgeDeadSymbols";
+ case PostStmtPurgeDeadSymbolsKind:
+ return "PostStmtPurgeDeadSymbols";
+ case PostStmtKind:
+ return "PostStmt";
+ case PreLoadKind:
+ return "PreLoad";
+ case PostLoadKind:
+ return "PostLoad";
+ case PreStoreKind:
+ return "PreStore";
+ case PostStoreKind:
+ return "PostStore";
+ case PostConditionKind:
+ return "PostCondition";
+ case PostLValueKind:
+ return "PostLValue";
+ case PostAllocatorCallKind:
+ return "PostAllocatorCall";
+ case PostInitializerKind:
+ return "PostInitializer";
+ case CallEnterKind:
+ return "CallEnter";
+ case CallExitBeginKind:
+ return "CallExitBegin";
+ case CallExitEndKind:
+ return "CallExitEnd";
+ case FunctionExitKind:
+ return "FunctionExit";
+ case PreImplicitCallKind:
+ return "PreImplicitCall";
+ case PostImplicitCallKind:
+ return "PostImplicitCall";
+ case LoopExitKind:
+ return "LoopExit";
+ case EpsilonKind:
+ return "Epsilon";
+ }
+ llvm_unreachable("Unknown ProgramPoint kind");
+}
+
+std::optional<SourceLocation> ProgramPoint::getSourceLocation() const {
+ switch (getKind()) {
+ case BlockEdgeKind:
+ // return castAs<BlockEdge>().getSrc()->getTerminatorStmt()->getBeginLoc();
+ return std::nullopt;
+ case BlockEntranceKind:
+ // return castAs<BlockEntrance>().getBlock()->getLabel()->getBeginLoc();
+ return std::nullopt;
+ case BlockExitKind:
+ // return
+ // castAs<BlockExit>().getBlock()->getTerminatorStmt()->getBeginLoc();
+ return std::nullopt;
+ case PreStmtKind:
+ [[fallthrough]];
+ case PreStmtPurgeDeadSymbolsKind:
+ [[fallthrough]];
+ case PostStmtPurgeDeadSymbolsKind:
+ [[fallthrough]];
+ case PostStmtKind:
+ [[fallthrough]];
+ case PreLoadKind:
+ [[fallthrough]];
+ case PostLoadKind:
+ [[fallthrough]];
+ case PreStoreKind:
+ [[fallthrough]];
+ case PostStoreKind:
+ [[fallthrough]];
+ case PostConditionKind:
+ [[fallthrough]];
+ case PostLValueKind:
+ [[fallthrough]];
+ case PostAllocatorCallKind:
+ if (const Stmt *S = castAs<StmtPoint>().getStmt())
+ return S->getBeginLoc();
+ return std::nullopt;
+ case PostInitializerKind:
+ if (const auto *Init = castAs<PostInitializer>().getInitializer())
+ return Init->getSourceLocation();
+ return std::nullopt;
+ case CallEnterKind:
+ if (const Stmt *S = castAs<CallEnter>().getCallExpr())
+ return S->getBeginLoc();
+ return std::nullopt;
+ case CallExitBeginKind:
+ if (const Stmt *S = castAs<CallExitBegin>().getReturnStmt())
+ return S->getBeginLoc();
+ return std::nullopt;
+ case CallExitEndKind:
+ return std::nullopt;
+ case FunctionExitKind:
+ if (const auto *B = castAs<FunctionExitPoint>().getBlock();
+ B && B->getTerminatorStmt())
+ return B->getTerminatorStmt()->getBeginLoc();
+ return std::nullopt;
+ case PreImplicitCallKind:
+ return castAs<ImplicitCallPoint>().getLocation();
+ case PostImplicitCallKind:
+ return castAs<ImplicitCallPoint>().getLocation();
+ case LoopExitKind:
+ if (const Stmt *S = castAs<LoopExit>().getLoopStmt())
+ return S->getBeginLoc();
+ return std::nullopt;
+ case EpsilonKind:
+ return std::nullopt;
+ }
+ llvm_unreachable("Unknown ProgramPoint kind");
+}
+
void ProgramPoint::printJson(llvm::raw_ostream &Out, const char *NL) const {
const ASTContext &Context =
getLocationContext()->getAnalysisDeclContext()->getASTContext();
diff --git a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp
index 2904eab0097dc8..525496baf9ce8e 100644
--- a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp
+++ b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp
@@ -62,6 +62,7 @@
#include "llvm/Support/Compiler.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/TimeProfiler.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <cassert>
@@ -287,6 +288,35 @@ class PathDiagnosticBuilder : public BugReporterContext {
const PathSensitiveBugReport *getBugReport() const { return R; }
};
+std::string timeTraceName(const BugReportEquivClass &EQ) {
+ if (!llvm::timeTraceProfilerEnabled()) {
+ return "";
+ }
+ const auto &bugReports = EQ.getReports();
+ if (bugReports.empty())
+ return "Empty Equivalence Class";
+ const BugReport *R = bugReports.front().get();
+ const auto &BT = R->getBugType();
+ return ("Flushing EQC " + BT.getDescription()).str();
+}
+
+llvm::TimeTraceMetadata timeTraceMetadata(const BugReportEquivClass &EQ) {
+ // Must be called only when constructing non-bogus TimeTraceScope
+ assert(llvm::timeTraceProfilerEnabled());
+
+ const auto &bugReports = EQ.getReports();
+ if (bugReports.empty())
+ return {};
+ const BugReport *R = bugReports.front().get();
+ const auto &BT = R->getBugType();
+ auto Loc = R->getLocation().asLocation();
+ std::string File = "";
+ if (const auto *Entry = Loc.getFileEntry())
+ File = Entry->tryGetRealPathName().str();
+ return {BT.getCheckerName().str(), File,
+ static_cast<int>(Loc.getLineNumber())};
+}
+
} // namespace
//===----------------------------------------------------------------------===//
@@ -2892,6 +2922,7 @@ std::optional<PathDiagnosticBuilder> PathDiagnosticBuilder::findValidReport(
if (R->isValid()) {
if (Reporter.getAnalyzerOptions().ShouldCrosscheckWithZ3) {
+ llvm::TimeTraceScope TCS{"Crosscheck with Z3"};
// If crosscheck is enabled, remove all visitors, add the refutation
// visitor and check again
R->clearVisitors();
@@ -3119,8 +3150,10 @@ BugReport *PathSensitiveBugReporter::findReportInEquivalenceClass(
return exampleReport;
}
-void BugReporter::FlushReport(BugReportEquivClass& EQ) {
- SmallVector<BugReport*, 10> bugReports;
+void BugReporter::FlushReport(BugReportEquivClass &EQ) {
+ llvm::TimeTraceScope TCS{timeTraceName(EQ),
+ [&EQ]() { return timeTraceMetadata(EQ); }};
+ SmallVector<BugReport *, 10> bugReports;
BugReport *report = findReportInEquivalenceClass(EQ, bugReports);
if (!report)
return;
diff --git a/clang/lib/StaticAnalyzer/Core/BugSuppression.cpp b/clang/lib/StaticAnalyzer/Core/BugSuppression.cpp
index 05c99c4a844e9e..0cefdb1e50cec8 100644
--- a/clang/lib/StaticAnalyzer/Core/BugSuppression.cpp
+++ b/clang/lib/StaticAnalyzer/Core/BugSuppression.cpp
@@ -9,6 +9,8 @@
#include "clang/StaticAnalyzer/Core/BugReporter/BugSuppression.h"
#include "clang/AST/DynamicRecursiveASTVisitor.h"
#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"
+#include "llvm/Support/FormatVariadic.h"
+#include "llvm/Support/TimeProfiler.h"
using namespace clang;
using namespace ento;
@@ -119,6 +121,28 @@ class CacheInitializer : public DynamicRecursiveASTVisitor {
Ranges &Result;
};
+std::string timeScopeName(const Decl *DeclWithIssue) {
+ if (!llvm::timeTraceProfilerEnabled())
+ return "";
+ return llvm::formatv(
+ "BugSuppression::isSuppressed init suppressions cache for {0}",
+ DeclWithIssue->getDeclKindName())
+ .str();
+}
+
+llvm::TimeTraceMetadata getDeclTimeTraceMetadata(const Decl *DeclWithIssue) {
+ assert(DeclWithIssue);
+ assert(llvm::timeTraceProfilerEnabled());
+ std::string name = "<noname>";
+ if (auto ND = dyn_cast<NamedDecl>(DeclWithIssue)) {
+ name = ND->getNameAsString();
+ }
+ const auto &SM = DeclWithIssue->getASTContext().getSourceManager();
+ auto line = SM.getPresumedLineNumber(DeclWithIssue->getBeginLoc());
+ auto fname = SM.getFilename(DeclWithIssue->getBeginLoc());
+ return llvm::TimeTraceMetadata{name, fname.str(), static_cast<int>(line)};
+}
+
} // end anonymous namespace
// TODO: Introduce stable IDs for checkers and check for those here
@@ -177,6 +201,9 @@ bool BugSuppression::isSuppressed(const PathDiagnosticLocation &Location,
std::make_pair(DeclWithIssue, CachedRanges{}));
Ranges &SuppressionRanges = InsertionResult.first->second;
if (InsertionResult.second) {
+ llvm::TimeTraceScope TimeScope(
+ timeScopeName(DeclWithIssue),
+ [DeclWithIssue]() { return getDeclTimeTraceMetadata(DeclWithIssue); });
// We haven't checked this declaration for suppressions yet!
CacheInitializer::initialize(DeclWithIssue, SuppressionRanges);
}
diff --git a/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp b/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp
index 9f7a0fcc2edb36..421c8f81af5fe9 100644
--- a/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp
+++ b/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp
@@ -27,6 +27,7 @@
#include "llvm/Support/Casting.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/FormatVariadic.h"
+#include "llvm/Support/TimeProfiler.h"
#include <cassert>
#include <optional>
#include <vector>
@@ -134,6 +135,14 @@ static void expandGraphWithCheckers(CHECK_CTX checkCtx,
namespace {
+std::string checkerScopeName(StringRef name, const CheckerBase *checker) {
+ if (!llvm::timeTraceProfilerEnabled())
+ return "";
+ std::string checkerName =
+ checker ? checker->getCheckerName().getName().str() : "<unknown>";
+ return (name + ":" + checkerName).str();
+}
+
struct CheckStmtContext {
using CheckersTy = SmallVectorImpl<CheckerManager::CheckStmtFunc>;
@@ -153,6 +162,7 @@ namespace {
void runChecker(CheckerManager::CheckStmtFunc checkFn,
NodeBuilder &Bldr, ExplodedNode *Pred) {
+ llvm::TimeTraceScope TimeScope(checkerScopeName("Stmt", checkFn.Checker));
// FIXME: Remove respondsToCallback from CheckerContext;
ProgramPoint::Kind K = IsPreVisit ? ProgramPoint::PreStmtKind :
ProgramPoint::PostStmtKind;
@@ -172,8 +182,11 @@ void CheckerManager::runCheckersForStmt(bool isPreVisit,
const Stmt *S,
ExprEngine &Eng,
bool WasInlined) {
- CheckStmtContext C(isPreVisit, getCachedStmtCheckersFor(S, isPreVisit),
- S, Eng, WasInlined);
+ CheckStmtContext C(isPreVisit, getCachedStmtCheckersFor(S, isPreVisit), S,
+ Eng, WasInlined);
+ llvm::TimeTraceScope TimeScope(
+ isPreVisit ? "CheckerManager::runCheckersForStmt (Pre)"
+ : "CheckerManager::runCheckersForStmt (Post)");
expandGraphWithCheckers(C, Dst, Src);
}
@@ -200,6 +213,8 @@ namespace {
void runChecker(CheckerManager::CheckObjCMessageFunc checkFn,
NodeBuilder &Bldr, ExplodedNode *Pred) {
+ llvm::TimeTraceScope TimeScope(
+ checkerScopeName("ObjCMsg", checkFn.Checker));
bool IsPreVisit;
switch (Kind) {
@@ -230,6 +245,7 @@ void CheckerManager::runCheckersForObjCMessage(ObjCMessageVisitKind visitKind,
bool WasInlined) {
const auto &checkers = getObjCMessageCheckers(visitKind);
CheckObjCMessageContext C(visitKind, checkers, msg, Eng, WasInlined);
+ llvm::TimeTraceScope TimeScope("CheckerManager::runCheckersForObjCMessage");
expandGraphWithCheckers(C, Dst, Src);
}
@@ -270,7 +286,8 @@ namespace {
void runChecker(CheckerManager::CheckCallFunc checkFn,
NodeBuilder &Bldr, ExplodedNode *Pred) {
- const ProgramPoint &L = Call.getProgramPoint(IsPreVisit,checkFn.Checker);
+ llvm::TimeTraceScope TimeScope(checkerScopeName("Call", checkFn.Checker));
+ const ProgramPoint &L = Call.getProgramPoint(IsPreVisit, checkFn.Checker);
CheckerContext C(Bldr, Eng, Pred, L, WasInlined);
checkFn(*Call.cloneWithState(Pred->getState()), C);
@@ -287,9 +304,11 @@ void CheckerManager::runCheckersForCallEvent(bool isPreVisit,
ExprEngine &Eng,
bool WasInlined) {
CheckCallContext C(isPreVisit,
- isPreVisit ? PreCallCheckers
- : PostCallCheckers,
- Call, Eng, WasInlined);
+ isPreVisit ? PreCallCheckers : PostCallCheckers, Call, Eng,
+ WasInlined);
+ llvm::TimeTraceScope TimeScope(
+ isPreVisit ? "CheckerManager::runCheckersForCallEvent (Pre)"
+ : "CheckerManager::runCheckersForCallEvent (Post)");
expandGraphWithCheckers(C, Dst, Src);
}
@@ -317,8 +336,9 @@ namespace {
void runChecker(CheckerManager::CheckLocationFunc checkFn,
NodeBuilder &Bldr, ExplodedNode *Pred) {
- ProgramPoint::Kind K = IsLoad ? ProgramPoint::PreLoadKind :
- ProgramPoint::PreStoreKind;
+ llvm::TimeTraceScope TimeScope(checkerScopeName("Loc", checkFn.Checker));
+ ProgramPoint::Kind K =
+ IsLoad ? ProgramPoint::PreLoadKind : ProgramPoint::PreStoreKind;
const ProgramPoint &L =
ProgramPoint::getProgramPoint(NodeEx, K,
Pred->getLocationContext(),
@@ -338,8 +358,11 @@ void CheckerManager::runCheckersForLocation(ExplodedNodeSet &Dst,
const Stmt *NodeEx,
const Stmt *BoundEx,
ExprEngine &Eng) {
- CheckLocationContext C(LocationCheckers, location, isLoad, NodeEx,
- BoundEx, Eng);
+ CheckLocationContext C(LocationCheckers, location, isLoad, NodeEx, BoundEx,
+ Eng);
+ llvm::TimeTraceScope TimeScope(
+ isLoad ? "CheckerManager::runCheckersForLocation (Load)"
+ : "CheckerManager::runCheckersForLocation (Store)");
expandGraphWithCheckers(C, Dst, Src);
}
@@ -365,6 +388,7 @@ namespace {
void runChecker(CheckerManager::CheckBindFunc checkFn,
NodeBuilder &Bldr, ExplodedNode *Pred) {
+ llvm::TimeTraceScope TimeScope(checkerScopeName("Bind", checkFn.Checker));
const ProgramPoint &L = PP.withTag(checkFn.Checker);
CheckerContext C(Bldr, Eng, Pred, L);
@@ -372,6 +396,14 @@ namespace {
}
};
+ llvm::TimeTraceMetadata getTimeTraceBindMetadata(SVal val) {
+ assert(llvm::timeTraceProfilerEnabled());
+ std::string name;
+ llvm::raw_string_ostream OS(name);
+ val.dumpToStream(OS);
+ return llvm::TimeTraceMetadata{OS.str(), ""};
+ }
+
} // namespace
/// Run checkers for binding of a value to a location.
@@ -381,6 +413,9 @@ void CheckerManager::runCheckersForBind(ExplodedNodeSet &Dst,
const Stmt *S, ExprEngine &Eng,
const ProgramPoint &PP) {
CheckBindContext C(BindCheckers, location, val, S, Eng, PP);
+ llvm::TimeTraceScope TimeScope{
+ "CheckerManager::runCheckersForBind",
+ [&val]() { return getTimeTraceBindMetadata(val); }};
expandGraphWithCheckers(C, Dst, Src);
}
@@ -409,6 +444,7 @@ struct CheckBeginFunctionContext {
void runChecker(CheckerManager::CheckBeginFunctionFunc checkFn,
NodeBuilder &Bldr, ExplodedNode *Pred) {
+ llvm::TimeTraceScope TimeScope(checkerScopeName("Begin", checkFn.Checker));
const ProgramPoint &L = PP.withTag(checkFn.Checker);
CheckerContext C(Bldr, Eng, Pred, L);
@@ -425,6 +461,7 @@ void CheckerManager::runCheckersForBeginFunction(ExplodedNodeSet &Dst,
ExplodedNodeSet Src;
Src.insert(Pred);
CheckBeginFunctionContext C(BeginFunctionCheckers, Eng, L);
+ llvm::TimeTraceScope TimeScope("CheckerManager::runCheckersForBeginFunction");
expandGraphWithCheckers(C, Dst, Src);
}
@@ -444,6 +481,8 @@ void CheckerManager::runCheckersForEndFunction(NodeBuilderContext &BC,
const ProgramPoint &L =
FunctionExitPoint(RS, Pred->getLocationContext(), checkFn.Checker);
CheckerContext C(Bldr, Eng, Pred, L);
+
+ llvm::TimeTraceScope TimeScope(checkerScopeName("End", checkFn.Checker));
checkFn(RS, C);
}
}
@@ -466,8 +505,10 @@ namespace {
void runChecker(CheckerManager::CheckBranchConditionFunc checkFn,
NodeBuilder &Bldr, ExplodedNode *Pred) {
- ProgramPoint L = PostCondition(Condition, Pred->getLocationContext(),
- checkFn.Checker);
+ llvm::TimeTraceScope TimeScope(
+ checkerScopeName("BranchCond", checkFn.Checker));
+ ProgramPoint L =
+ PostCondition(Condition, Pred->getLocationContext(), checkFn.Checker);
CheckerContext C(Bldr, Eng, Pred, L);
checkFn(Condition, C);
}
@@ -483,6 +524,8 @@ void CheckerManager::runCheckersForBranchCondition(const Stmt *Condition,
ExplodedNodeSet Src;
Src.insert(Pred);
CheckBranchConditionContext C(BranchConditionCheckers, Condition, Eng);
+ llvm::TimeTraceScope TimeScope(
+ "CheckerManager::runCheckersForBranchCondition");
expandGraphWithCheckers(C, Dst, Src);
}
@@ -506,6 +549,8 @@ namespace {
void runChecker(CheckerManager::CheckNewAllocatorFunc checkFn,
NodeBuilder &Bldr, ExplodedNode *Pred) {
+ llvm::TimeTraceScope TimeScope(
+ checkerScopeName("Allocator", checkFn.Checker));
ProgramPoint L =
PostAllocatorCall(Call.getOriginExpr(), Pred->getLocationContext());
CheckerContext C(Bldr, Eng, Pred, L, WasInlined);
@@ -524,6 +569,7 @@ void CheckerManager::runCheckersForNewAllocator(const CXXAllocatorCall &Call,
ExplodedNodeSet Src;
Src.insert(Pred);
CheckNewAllocatorContext C(NewAllocatorCheckers, Call, WasInlined, Eng);
+ llvm::TimeTraceScope TimeScope("CheckerManager::runCheckersForNewAllocator");
expandGraphWithCheckers(C, Dst, Src);
}
@@ -555,8 +601,10 @@ namespace {
void runChecker(CheckerManager::CheckDeadSymbolsFunc checkFn,
NodeBuilder &Bldr, ExplodedNode *Pred) {
- const ProgramPoint &L = ProgramPoint::getProgramPoint(S, ProgarmPointKind,
- Pred->getLocationContext(), checkFn.Checker);
+ llvm::TimeTraceScope TimeScope(
+ checkerScopeName("DeadSymbols", checkFn.Checker));
+ const ProgramPoint &L = ProgramPoint::getProgramPoint(
+ S, ProgarmPointKind, Pred->getLocationContext(), checkFn.Checker);
CheckerContext C(Bldr, Eng, Pred, L);
// Note, do not pass the statement to the checkers without letting them
@@ -576,6 +624,7 @@ void CheckerManager::runCheckersForDeadSymbols(ExplodedNodeSet &Dst,
ExprEngine &Eng,
ProgramPoint::Kind K) {
CheckDeadSymbolsContext C(DeadSymbolsCheckers, SymReaper, S, Eng, K);
+ llvm::TimeTraceScope TimeScope("CheckerManager::runCheckersForDeadSymbols");
expandGraphWithCheckers(C, Dst, Src);
}
diff --git a/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp b/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp
index 775a22e18c6199..a4aef840919572 100644
--- a/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp
+++ b/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp
@@ -30,6 +30,8 @@
#include "llvm/ADT/Statistic.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/FormatVariadic.h"
+#include "llvm/Support/TimeProfiler.h"
#include <algorithm>
#include <cassert>
#include <memory>
@@ -179,8 +181,39 @@ bool CoreEngine::ExecuteWorkList(const LocationContext *L, unsigned MaxSteps,
return WList->hasWork();
}
-void CoreEngine::dispatchWorkItem(ExplodedNode* Pred, ProgramPoint Loc,
- const WorkListUnit& WU) {
+static std::string timeTraceScopeName(const ProgramPoint &Loc) {
+ if (llvm::timeTraceProfilerEnabled()) {
+ return llvm::formatv("Loc {0}", ProgramPoint::kindToStr(Loc.getKind()))
+ .str();
+ }
+ return "";
+}
+
+static llvm::TimeTraceMetadata timeTraceMetadata(const ExplodedNode *Pred,
+ const ProgramPoint &Loc) {
+ // If time-trace profiler is not enabled, this function is never called.
+ assert(llvm::timeTraceProfilerEnabled());
+ std::string str;
+ llvm::raw_string_ostream rso(str);
+ Loc.printJson(rso);
+ if (auto SLoc = Loc.getSourceLocation()) {
+ const auto &SM = Pred->getLocationContext()
+ ->getAnalysisDeclContext()
+ ->getASTContext()
+ .getSourceManager();
+ auto line = SM.getPresumedLineNumber(*SLoc);
+ auto fname = SM.getFilename(*SLoc);
+ return llvm::TimeTraceMetadata{rso.str(), fname.str(),
+ static_cast<int>(line)};
+ }
+ return llvm::TimeTraceMetadata{rso.str(), ""};
+}
+
+void CoreEngine::dispatchWorkItem(ExplodedNode *Pred, ProgramPoint Loc,
+ const WorkListUnit &WU) {
+ llvm::TimeTraceScope tcs{timeTraceScopeName(Loc), [Loc, Pred]() {
+ return timeTraceMetadata(Pred, Loc);
+ }};
// Dispatch on the location type.
switch (Loc.getKind()) {
case ProgramPoint::BlockEdgeKind:
diff --git a/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp b/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
index 91c9b085f68292..ce23b6259f45d3 100644
--- a/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
+++ b/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
@@ -39,6 +39,8 @@
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/Program.h"
+#include "llvm/Support/FormatVariadic.h"
+#include "llvm/Support/TimeProfiler.h"
#include "llvm/Support/Timer.h"
#include "llvm/Support/raw_ostream.h"
#include <memory>
@@ -358,8 +360,41 @@ class AnalysisConsumer : public AnalysisASTConsumer,
/// Print \p S to stderr if \c Opts.AnalyzerDisplayProgress is set.
void reportAnalyzerProgress(StringRef S);
-}; // namespace
-} // end anonymous namespace
+};
+
+std::string timeTraceScopeDeclName(StringRef FunName, const Decl *D) {
+ if (llvm::timeTraceProfilerEnabled()) {
+ if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
+ return (FunName + " " + ND->getQualifiedNameAsString()).str();
+ }
+ return (FunName + " <anonymous> ").str();
+ }
+ return "";
+}
+
+llvm::TimeTraceMetadata timeTraceScopeDeclMetadata(const Decl *D) {
+ // If time-trace profiler is not enabled, this function is never called.
+ assert(llvm::timeTraceProfilerEnabled());
+ if (const auto &Loc = D->getBeginLoc(); Loc.isValid()) {
+ const auto &SM = D->getASTContext().getSourceManager();
+ std::string DeclName = AnalysisDeclContext::getFunctionName(D);
+ return llvm::TimeTraceMetadata{
+ DeclName, SM.getFilename(Loc).str(),
+ static_cast<int>(SM.getExpansionLineNumber(Loc))};
+ }
+ return llvm::TimeTraceMetadata{"", ""};
+}
+
+void flushReports(llvm::Timer *BugReporterTimer, BugReporter &BR) {
+ llvm::TimeTraceScope TCS{"Flushing reports"};
+ // Display warnings.
+ if (BugReporterTimer)
+ BugReporterTimer->startTimer();
+ BR.FlushReports();
+ if (BugReporterTimer)
+ BugReporterTimer->stopTimer();
+}
+} // namespace
//===----------------------------------------------------------------------===//
@@ -658,6 +693,8 @@ AnalysisConsumer::getModeForDecl(Decl *D, AnalysisMode Mode) {
void AnalysisConsumer::HandleCode(Decl *D, AnalysisMode Mode,
ExprEngine::InliningModes IMode,
SetOfConstDecls *VisitedCallees) {
+ llvm::TimeTraceScope TCS(timeTraceScopeDeclName("HandleCode", D),
+ [D]() { return timeTraceScopeDeclMetadata(D); });
if (!D->hasBody())
return;
Mode = getModeForDecl(D, Mode);
@@ -742,12 +779,7 @@ void AnalysisConsumer::RunPathSensitiveChecks(Decl *D,
if (Mgr->options.visualizeExplodedGraphWithGraphViz)
Eng.ViewGraph(Mgr->options.TrimGraph);
- // Display warnings.
- if (BugReporterTimer)
- BugReporterTimer->startTimer();
- Eng.getBugReporter().FlushReports();
- if (BugReporterTimer)
- BugReporterTimer->stopTimer();
+ flushReports(BugReporterTimer.get(), Eng.getBugReporter());
}
//===----------------------------------------------------------------------===//
diff --git a/clang/test/Analysis/ftime-trace.cpp b/clang/test/Analysis/ftime-trace.cpp
new file mode 100644
index 00000000000000..2c369a9bf781e2
--- /dev/null
+++ b/clang/test/Analysis/ftime-trace.cpp
@@ -0,0 +1,56 @@
+// RUN: %clang_analyze_cc1 -analyzer-checker=core %s -ftime-trace=%t.raw.json -ftime-trace-granularity=0 -verify
+// RUN: %python -c 'import json, sys; print(json.dumps(json.load(sys.stdin), indent=4))' < %t.raw.json > %t.formatted.json
+// RUN: FileCheck --input-file=%t.formatted.json --check-prefix=CHECK %s
+
+// The trace file is rather large, but it should contain at least the duration of the analysis of 'f':
+//
+// CHECK: "name": "HandleCode f",
+// CHECK-NEXT: "args": {
+// CHECK-NEXT: "detail": "f()",
+// CHECK-NEXT: "file": "{{.+}}ftime-trace.cpp",
+// CHECK-NEXT: "line": {{[0-9]+}}
+// CHECK-NEXT: }
+
+// If any reports are found, "flushing" their equivalence class (EQC) is a separate action:
+//
+// CHECK: "name": "Flushing EQC Division by zero",
+// CHECK-NEXT: "args": {
+// CHECK-NEXT: "detail": "core.DivideZero",
+// CHECK-NEXT: "file": "{{.+}}ftime-trace.cpp",
+// CHECK-NEXT: "line": {{[0-9]+}}
+// CHECK-NEXT: }
+
+// The trace also contains durations of each step, but they are so short that they are not reliably present
+// in each run. However, they are also aggregated into Total *, for example:
+//
+// CHECK: "name": "Total Loc PostStmt",
+// CHECK-NEXT: "args": {
+// CHECK-NEXT: "count": {{[0-9]+}},
+// CHECK-NEXT: "avg ms": {{[0-9]+}}
+// CHECK-NEXT: }
+
+// Additionally, the trace lists checker hook points (again, relying on totals here):
+//
+// CHECK: "name": "Total CheckerManager::runCheckersForStmt (Pre)",
+// CHECK-NEXT: "args": {
+// CHECK-NEXT: "count": {{[0-9]+}},
+// CHECK-NEXT: "avg ms": {{[0-9]+}}
+// CHECK-NEXT: }
+
+// Finally, each checker call back is also present:
+//
+// CHECK: "name": "Total Stmt:core.DivideZero",
+// CHECK-NEXT: "args": {
+// CHECK-NEXT: "count": {{[0-9]+}},
+// CHECK-NEXT: "avg ms": {{[0-9]+}}
+// CHECK-NEXT: }
+
+bool coin();
+int f() {
+ int x = 0;
+ int y = 0;
+ while (coin()) {
+ x = 1;
+ }
+ return x / y; // expected-warning{{Division by zero}}
+}
>From 8ed1559c51e25edb17ec657c29086a0337b52336 Mon Sep 17 00:00:00 2001
From: Arseniy Zaostrovnykh <necto.ne at gmail.com>
Date: Mon, 3 Feb 2025 15:44:23 +0100
Subject: [PATCH 02/12] Make code formatter happy
---
clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp | 2 --
1 file changed, 2 deletions(-)
diff --git a/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp b/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
index ce23b6259f45d3..ff0aef22fbdbca 100644
--- a/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
+++ b/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
@@ -39,7 +39,6 @@
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/Program.h"
-#include "llvm/Support/FormatVariadic.h"
#include "llvm/Support/TimeProfiler.h"
#include "llvm/Support/Timer.h"
#include "llvm/Support/raw_ostream.h"
@@ -396,7 +395,6 @@ void flushReports(llvm::Timer *BugReporterTimer, BugReporter &BR) {
}
} // namespace
-
//===----------------------------------------------------------------------===//
// AnalysisConsumer implementation.
//===----------------------------------------------------------------------===//
>From c55f873e844943bcd9c22980f3aecd5f70058412 Mon Sep 17 00:00:00 2001
From: Arseniy Zaostrovnykh <necto.ne at gmail.com>
Date: Tue, 4 Feb 2025 10:04:13 +0100
Subject: [PATCH 03/12] Less prescriptive language
---
clang/docs/analyzer/developer-docs/PerformanceInvestigation.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/docs/analyzer/developer-docs/PerformanceInvestigation.rst b/clang/docs/analyzer/developer-docs/PerformanceInvestigation.rst
index 78ba804dd64c8b..08433f43e1bad5 100644
--- a/clang/docs/analyzer/developer-docs/PerformanceInvestigation.rst
+++ b/clang/docs/analyzer/developer-docs/PerformanceInvestigation.rst
@@ -35,4 +35,4 @@ In addition to the ``-ftime-trace`` option, you can use ``-ftime-trace-granulari
Note: Both Chrome-tracing and speedscope tools might struggle with time traces above 100 MB in size.
Luckily, in most cases the default max-steps boundary of 225 000 produces the traces of approximately that size
for a single entry point.
-You should use ``-analyze-function=get_global_options`` together with ``-ftime-trace`` to narrow down analysis to a specific entry point.
+You can use ``-analyze-function=get_global_options`` together with ``-ftime-trace`` to narrow down analysis to a specific entry point.
>From bf56730224f4cb5038479e0ada3a3489d04e8719 Mon Sep 17 00:00:00 2001
From: Arseniy Zaostrovnykh <necto.ne at gmail.com>
Date: Tue, 4 Feb 2025 10:05:45 +0100
Subject: [PATCH 04/12] mention the app name for the screenshot
---
clang/docs/analyzer/developer-docs/PerformanceInvestigation.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/docs/analyzer/developer-docs/PerformanceInvestigation.rst b/clang/docs/analyzer/developer-docs/PerformanceInvestigation.rst
index 08433f43e1bad5..7ed1404e1ecc92 100644
--- a/clang/docs/analyzer/developer-docs/PerformanceInvestigation.rst
+++ b/clang/docs/analyzer/developer-docs/PerformanceInvestigation.rst
@@ -16,7 +16,7 @@ If the ``ProgramPoint`` is associated with a location, you can see it on the sco
.. image:: ../images/speedscope.png
-On the screenshot above, under the first time ruler is the birds-eye view of the entire trace that spans a little over 8 seconds.
+On the speedscope screenshot above, under the first time ruler is the birds-eye view of the entire trace that spans a little over 8 seconds.
Under the second ruler (focused on the 4.27s time point) you can see a narrowed-down portion.
The second box (of light-green color) that spans entire screen (and actually extends beyond it) corresponds to the analysis of ``get_global_options()`` entry point that is defined in the "options.cc" file on line 303646
(the line number is huge because the file was preprocessed).
>From 299b54daa6329d1ae61d8a686544e0d7163e6391 Mon Sep 17 00:00:00 2001
From: Arseniy Zaostrovnykh <necto.ne at gmail.com>
Date: Tue, 4 Feb 2025 10:11:15 +0100
Subject: [PATCH 05/12] [NFC] rename kindToStr to getProgramPointKindName
---
clang/include/clang/Analysis/ProgramPoint.h | 2 +-
clang/lib/Analysis/ProgramPoint.cpp | 2 +-
clang/lib/StaticAnalyzer/Core/CoreEngine.cpp | 3 ++-
3 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/clang/include/clang/Analysis/ProgramPoint.h b/clang/include/clang/Analysis/ProgramPoint.h
index f4b044333b8a8c..4d8f036f904cdf 100644
--- a/clang/include/clang/Analysis/ProgramPoint.h
+++ b/clang/include/clang/Analysis/ProgramPoint.h
@@ -85,7 +85,7 @@ class ProgramPoint {
LoopExitKind,
EpsilonKind};
- static const char *kindToStr(Kind K);
+ static const char *getProgramPointKindName(Kind K);
std::optional<SourceLocation> getSourceLocation() const;
private:
diff --git a/clang/lib/Analysis/ProgramPoint.cpp b/clang/lib/Analysis/ProgramPoint.cpp
index faf6b71cf18c9e..99a6e38e85cdc5 100644
--- a/clang/lib/Analysis/ProgramPoint.cpp
+++ b/clang/lib/Analysis/ProgramPoint.cpp
@@ -49,7 +49,7 @@ LLVM_DUMP_METHOD void ProgramPoint::dump() const {
return printJson(llvm::errs());
}
-const char *ProgramPoint::kindToStr(Kind K) {
+const char *ProgramPoint::getProgramPointKindName(Kind K) {
switch (K) {
case BlockEdgeKind:
return "BlockEdge";
diff --git a/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp b/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp
index a4aef840919572..2e0c58dc9179ee 100644
--- a/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp
+++ b/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp
@@ -183,7 +183,8 @@ bool CoreEngine::ExecuteWorkList(const LocationContext *L, unsigned MaxSteps,
static std::string timeTraceScopeName(const ProgramPoint &Loc) {
if (llvm::timeTraceProfilerEnabled()) {
- return llvm::formatv("Loc {0}", ProgramPoint::kindToStr(Loc.getKind()))
+ return llvm::formatv("Loc {0}",
+ ProgramPoint::getProgramPointKindName(Loc.getKind()))
.str();
}
return "";
>From a22ed13eae22bfaa80ad4a1e10608afcbab320f3 Mon Sep 17 00:00:00 2001
From: Arseniy Zaostrovnykh <necto.ne at gmail.com>
Date: Tue, 4 Feb 2025 10:12:25 +0100
Subject: [PATCH 06/12] [NFC] Return StringRef instead of a raw char*
---
clang/include/clang/Analysis/ProgramPoint.h | 2 +-
clang/lib/Analysis/ProgramPoint.cpp | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/clang/include/clang/Analysis/ProgramPoint.h b/clang/include/clang/Analysis/ProgramPoint.h
index 4d8f036f904cdf..1df1f1cb892e41 100644
--- a/clang/include/clang/Analysis/ProgramPoint.h
+++ b/clang/include/clang/Analysis/ProgramPoint.h
@@ -85,7 +85,7 @@ class ProgramPoint {
LoopExitKind,
EpsilonKind};
- static const char *getProgramPointKindName(Kind K);
+ static StringRef getProgramPointKindName(Kind K);
std::optional<SourceLocation> getSourceLocation() const;
private:
diff --git a/clang/lib/Analysis/ProgramPoint.cpp b/clang/lib/Analysis/ProgramPoint.cpp
index 99a6e38e85cdc5..5346c611c7cca1 100644
--- a/clang/lib/Analysis/ProgramPoint.cpp
+++ b/clang/lib/Analysis/ProgramPoint.cpp
@@ -49,7 +49,7 @@ LLVM_DUMP_METHOD void ProgramPoint::dump() const {
return printJson(llvm::errs());
}
-const char *ProgramPoint::getProgramPointKindName(Kind K) {
+StringRef ProgramPoint::getProgramPointKindName(Kind K) {
switch (K) {
case BlockEdgeKind:
return "BlockEdge";
>From 6101457c5b505b69bbf6b67c834badd1693145a9 Mon Sep 17 00:00:00 2001
From: Arseniy Zaostrovnykh <necto.ne at gmail.com>
Date: Tue, 4 Feb 2025 10:15:08 +0100
Subject: [PATCH 07/12] [NFC] Remove redundant [[fallthrough]] annotations
---
clang/lib/Analysis/ProgramPoint.cpp | 10 ----------
1 file changed, 10 deletions(-)
diff --git a/clang/lib/Analysis/ProgramPoint.cpp b/clang/lib/Analysis/ProgramPoint.cpp
index 5346c611c7cca1..0809f2f10ee956 100644
--- a/clang/lib/Analysis/ProgramPoint.cpp
+++ b/clang/lib/Analysis/ProgramPoint.cpp
@@ -114,25 +114,15 @@ std::optional<SourceLocation> ProgramPoint::getSourceLocation() const {
// castAs<BlockExit>().getBlock()->getTerminatorStmt()->getBeginLoc();
return std::nullopt;
case PreStmtKind:
- [[fallthrough]];
case PreStmtPurgeDeadSymbolsKind:
- [[fallthrough]];
case PostStmtPurgeDeadSymbolsKind:
- [[fallthrough]];
case PostStmtKind:
- [[fallthrough]];
case PreLoadKind:
- [[fallthrough]];
case PostLoadKind:
- [[fallthrough]];
case PreStoreKind:
- [[fallthrough]];
case PostStoreKind:
- [[fallthrough]];
case PostConditionKind:
- [[fallthrough]];
case PostLValueKind:
- [[fallthrough]];
case PostAllocatorCallKind:
if (const Stmt *S = castAs<StmtPoint>().getStmt())
return S->getBeginLoc();
>From babecf833ce0e7e3c32b56785c0d2c4194a92150 Mon Sep 17 00:00:00 2001
From: Arseniy Zaostrovnykh <necto.ne at gmail.com>
Date: Tue, 4 Feb 2025 10:44:58 +0100
Subject: [PATCH 08/12] [NFC] remove redundant braces
---
clang/lib/StaticAnalyzer/Core/BugReporter.cpp | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp
index 525496baf9ce8e..aee5ca521c12f6 100644
--- a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp
+++ b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp
@@ -289,9 +289,8 @@ class PathDiagnosticBuilder : public BugReporterContext {
};
std::string timeTraceName(const BugReportEquivClass &EQ) {
- if (!llvm::timeTraceProfilerEnabled()) {
+ if (!llvm::timeTraceProfilerEnabled())
return "";
- }
const auto &bugReports = EQ.getReports();
if (bugReports.empty())
return "Empty Equivalence Class";
>From ccbaa50c304c7e2378c960ef9172dde5f6e89394 Mon Sep 17 00:00:00 2001
From: Arseniy Zaostrovnykh <necto.ne at gmail.com>
Date: Tue, 4 Feb 2025 10:50:39 +0100
Subject: [PATCH 09/12] Handle BlockExit, and humanize the
BlockEntrance/BlockEdge comments
---
clang/lib/Analysis/ProgramPoint.cpp | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/clang/lib/Analysis/ProgramPoint.cpp b/clang/lib/Analysis/ProgramPoint.cpp
index 0809f2f10ee956..e508681410b0b4 100644
--- a/clang/lib/Analysis/ProgramPoint.cpp
+++ b/clang/lib/Analysis/ProgramPoint.cpp
@@ -104,14 +104,18 @@ StringRef ProgramPoint::getProgramPointKindName(Kind K) {
std::optional<SourceLocation> ProgramPoint::getSourceLocation() const {
switch (getKind()) {
case BlockEdgeKind:
- // return castAs<BlockEdge>().getSrc()->getTerminatorStmt()->getBeginLoc();
+ // If needed, the source and or destination beginning can be used to get
+ // source location.
return std::nullopt;
case BlockEntranceKind:
- // return castAs<BlockEntrance>().getBlock()->getLabel()->getBeginLoc();
+ // If needed, first statement of the block can be used.
return std::nullopt;
case BlockExitKind:
- // return
- // castAs<BlockExit>().getBlock()->getTerminatorStmt()->getBeginLoc();
+ if (const auto *B = castAs<BlockExit>().getBlock()) {
+ if (const auto *T = B->getTerminatorStmt()) {
+ return T->getBeginLoc();
+ }
+ }
return std::nullopt;
case PreStmtKind:
case PreStmtPurgeDeadSymbolsKind:
>From b5792c2b135e7b15290c167c0f477bc29cf84320 Mon Sep 17 00:00:00 2001
From: Arseniy Zaostrovnykh <necto.ne at gmail.com>
Date: Tue, 4 Feb 2025 14:59:28 +0100
Subject: [PATCH 10/12] [NFC] Uppercase variable names
---
clang/lib/StaticAnalyzer/Core/BugReporter.cpp | 12 ++++++------
clang/lib/StaticAnalyzer/Core/BugSuppression.cpp | 10 +++++-----
clang/lib/StaticAnalyzer/Core/CheckerManager.cpp | 8 ++++----
3 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp
index aee5ca521c12f6..605c18fdce8886 100644
--- a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp
+++ b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp
@@ -291,10 +291,10 @@ class PathDiagnosticBuilder : public BugReporterContext {
std::string timeTraceName(const BugReportEquivClass &EQ) {
if (!llvm::timeTraceProfilerEnabled())
return "";
- const auto &bugReports = EQ.getReports();
- if (bugReports.empty())
+ const auto &BugReports = EQ.getReports();
+ if (BugReports.empty())
return "Empty Equivalence Class";
- const BugReport *R = bugReports.front().get();
+ const BugReport *R = BugReports.front().get();
const auto &BT = R->getBugType();
return ("Flushing EQC " + BT.getDescription()).str();
}
@@ -303,10 +303,10 @@ llvm::TimeTraceMetadata timeTraceMetadata(const BugReportEquivClass &EQ) {
// Must be called only when constructing non-bogus TimeTraceScope
assert(llvm::timeTraceProfilerEnabled());
- const auto &bugReports = EQ.getReports();
- if (bugReports.empty())
+ const auto &BugReports = EQ.getReports();
+ if (BugReports.empty())
return {};
- const BugReport *R = bugReports.front().get();
+ const BugReport *R = BugReports.front().get();
const auto &BT = R->getBugType();
auto Loc = R->getLocation().asLocation();
std::string File = "";
diff --git a/clang/lib/StaticAnalyzer/Core/BugSuppression.cpp b/clang/lib/StaticAnalyzer/Core/BugSuppression.cpp
index 0cefdb1e50cec8..5681ed251d987c 100644
--- a/clang/lib/StaticAnalyzer/Core/BugSuppression.cpp
+++ b/clang/lib/StaticAnalyzer/Core/BugSuppression.cpp
@@ -133,14 +133,14 @@ std::string timeScopeName(const Decl *DeclWithIssue) {
llvm::TimeTraceMetadata getDeclTimeTraceMetadata(const Decl *DeclWithIssue) {
assert(DeclWithIssue);
assert(llvm::timeTraceProfilerEnabled());
- std::string name = "<noname>";
+ std::string Name = "<noname>";
if (auto ND = dyn_cast<NamedDecl>(DeclWithIssue)) {
- name = ND->getNameAsString();
+ Name = ND->getNameAsString();
}
const auto &SM = DeclWithIssue->getASTContext().getSourceManager();
- auto line = SM.getPresumedLineNumber(DeclWithIssue->getBeginLoc());
- auto fname = SM.getFilename(DeclWithIssue->getBeginLoc());
- return llvm::TimeTraceMetadata{name, fname.str(), static_cast<int>(line)};
+ auto Line = SM.getPresumedLineNumber(DeclWithIssue->getBeginLoc());
+ auto Fname = SM.getFilename(DeclWithIssue->getBeginLoc());
+ return llvm::TimeTraceMetadata{Name, Fname.str(), static_cast<int>(Line)};
}
} // end anonymous namespace
diff --git a/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp b/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp
index 421c8f81af5fe9..6206288cd9f613 100644
--- a/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp
+++ b/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp
@@ -135,12 +135,12 @@ static void expandGraphWithCheckers(CHECK_CTX checkCtx,
namespace {
-std::string checkerScopeName(StringRef name, const CheckerBase *checker) {
+std::string checkerScopeName(StringRef Name, const CheckerBase *Checker) {
if (!llvm::timeTraceProfilerEnabled())
return "";
- std::string checkerName =
- checker ? checker->getCheckerName().getName().str() : "<unknown>";
- return (name + ":" + checkerName).str();
+ StringRef CheckerName =
+ Checker ? Checker->getCheckerName().getName() : "<unknown>";
+ return (Name + ":" + CheckerName).str();
}
struct CheckStmtContext {
>From ac8707b0db5e5f9d8efe9b0c68998b1b2da6a221 Mon Sep 17 00:00:00 2001
From: Arseniy Zaostrovnykh <necto.ne at gmail.com>
Date: Tue, 4 Feb 2025 15:00:46 +0100
Subject: [PATCH 11/12] [NFC] Remove redundant braces
---
clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp b/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
index ff0aef22fbdbca..249adc98fcab87 100644
--- a/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
+++ b/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
@@ -363,9 +363,8 @@ class AnalysisConsumer : public AnalysisASTConsumer,
std::string timeTraceScopeDeclName(StringRef FunName, const Decl *D) {
if (llvm::timeTraceProfilerEnabled()) {
- if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
+ if (const NamedDecl *ND = dyn_cast<NamedDecl>(D))
return (FunName + " " + ND->getQualifiedNameAsString()).str();
- }
return (FunName + " <anonymous> ").str();
}
return "";
>From a63907b742f6135d304a3a289918ddcdda10c86d Mon Sep 17 00:00:00 2001
From: Arseniy Zaostrovnykh <necto.ne at gmail.com>
Date: Tue, 4 Feb 2025 15:03:11 +0100
Subject: [PATCH 12/12] [NFC] Move some strings
---
clang/lib/StaticAnalyzer/Core/BugReporter.cpp | 2 +-
clang/lib/StaticAnalyzer/Core/BugSuppression.cpp | 5 +++--
clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp | 2 +-
3 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp
index 605c18fdce8886..3d9a6356df3b92 100644
--- a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp
+++ b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp
@@ -312,7 +312,7 @@ llvm::TimeTraceMetadata timeTraceMetadata(const BugReportEquivClass &EQ) {
std::string File = "";
if (const auto *Entry = Loc.getFileEntry())
File = Entry->tryGetRealPathName().str();
- return {BT.getCheckerName().str(), File,
+ return {BT.getCheckerName().str(), std::move(File),
static_cast<int>(Loc.getLineNumber())};
}
diff --git a/clang/lib/StaticAnalyzer/Core/BugSuppression.cpp b/clang/lib/StaticAnalyzer/Core/BugSuppression.cpp
index 5681ed251d987c..5b5f9df9cb0dce 100644
--- a/clang/lib/StaticAnalyzer/Core/BugSuppression.cpp
+++ b/clang/lib/StaticAnalyzer/Core/BugSuppression.cpp
@@ -134,13 +134,14 @@ llvm::TimeTraceMetadata getDeclTimeTraceMetadata(const Decl *DeclWithIssue) {
assert(DeclWithIssue);
assert(llvm::timeTraceProfilerEnabled());
std::string Name = "<noname>";
- if (auto ND = dyn_cast<NamedDecl>(DeclWithIssue)) {
+ if (const auto *ND = dyn_cast<NamedDecl>(DeclWithIssue)) {
Name = ND->getNameAsString();
}
const auto &SM = DeclWithIssue->getASTContext().getSourceManager();
auto Line = SM.getPresumedLineNumber(DeclWithIssue->getBeginLoc());
auto Fname = SM.getFilename(DeclWithIssue->getBeginLoc());
- return llvm::TimeTraceMetadata{Name, Fname.str(), static_cast<int>(Line)};
+ return llvm::TimeTraceMetadata{std::move(Name), Fname.str(),
+ static_cast<int>(Line)};
}
} // end anonymous namespace
diff --git a/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp b/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
index 249adc98fcab87..189d7d6bede8e6 100644
--- a/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
+++ b/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
@@ -377,7 +377,7 @@ llvm::TimeTraceMetadata timeTraceScopeDeclMetadata(const Decl *D) {
const auto &SM = D->getASTContext().getSourceManager();
std::string DeclName = AnalysisDeclContext::getFunctionName(D);
return llvm::TimeTraceMetadata{
- DeclName, SM.getFilename(Loc).str(),
+ std::move(DeclName), SM.getFilename(Loc).str(),
static_cast<int>(SM.getExpansionLineNumber(Loc))};
}
return llvm::TimeTraceMetadata{"", ""};
More information about the cfe-commits
mailing list