From 10e9c53e5482b309bf2767e11e767a88cf7c6f82 Mon Sep 17 00:00:00 2001 From: pasquadambra Date: Tue, 8 Jun 2021 15:15:44 +0200 Subject: [PATCH 01/36] updating examples/gpu and doc --- docs/amg4psblas_1.0-guide.pdf | Bin 1830849 -> 0 bytes docs/src/gettingstarted.tex | 9 ++++--- examples/gpu/amg_dexample_gpu.f90 | 39 +++++++++++++++--------------- 3 files changed, 25 insertions(+), 23 deletions(-) delete mode 100644 docs/amg4psblas_1.0-guide.pdf diff --git a/docs/amg4psblas_1.0-guide.pdf b/docs/amg4psblas_1.0-guide.pdf deleted file mode 100644 index 84b4b37aac69e604d7c250b83fecc958ea3ce221..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1830849 zcmeF42YeLO`uAV2?JxIU?^UtVBBC@YAylyeHV_pB1g`}Vf+7eA*c(dkUAjo`Qd0;a z^cn~Wp(P}QkU$dBd$OBk-rr=xx|!XXot>TCo$?Ix3A?j1r~GE-`OZ0W&htFkY zzo^mD=Tq$Ys>A;~_o~t2l{OuGTD5N8u6;XSpI(D}{QO!qZ`0b(r)}GI&D;6(8tC(W zqfT$U+PX*2&fPopZ2V!bZa&R?TeoW7x?LNeX06&cZ_@!su{-r1uSHEfJO zqZ&7B)uv^m{=)`xAKvjF#JW49_Y^|R^#PfHNLFji^8__@%8E8*SxJy z+g2@`w?+X5u+?bk)7lrAwej_7-MmA4U!RfwK7(q!U8AzxZE;BJ=6&j4+{lZ2>7;O32tTA>{fowtTMcHz4-bz@6e`ArS9zc zY1g`yk6+8y&09h#PNM#!zWk~`SL>G=cKQPPvU0X~1sYl%i;r#E<2v&7Yu@43pvY!d24DuVwRgZL6|{2^LDM;N-Ntt!@sCXv{&N}ts3Ft#--Wp z-NwGYzKw7{;>)M~M~jr+<}&c{^=s3d&E3zpxo?}+-0AE&e9-7``g4~(r%9zy!-qZ7 z82hzs_>0UBAGsSEEIr!2@9w+qQ05qs43f zgFpRjv=8os8Z9~x9zCju|Hv-GzhHGAHrl6sjTT*o4;?VTuM-72xX@^YTv6$Hot$f?IY{}YLD>M85Xdwki0aAbzAO%PPQh*d71xNu>fD|AF zNC8rS6d(mi0aAbzAO%PPQh*d71xNu>fD|AFNC8rS6d(mi0aAbzAO%PPQh*d71xNu> zfD|AFNC8rS6d(mi0aAbzAO%PPQh*d71xNu>fD|AF1QcNOzEoH(TwMi}pv|NJDL@L4 z0;GVF3IIABg0w|ibM?h!GL@E=7T;Qmii!#=m%O~Zoa#$1~`vURDLGV0gYxffuW3& zLQ`6#04YEUkOHKDl>!`p(Rh_lEZrR$9v)6jV5@6{K9T~Y04YEUD69Y|gN7bnhUyNX zu2v{5EsYSY@YP1ikpiRuDL@L`Qh?*{p+kpU#g*=k4+{&UF6djA3H?tBkOHItDWIeR z9DI|Kl5_`8Wh#WhXw(E&@`9tZNC8rS6d(mE6#!f?*CsSHR2f|9E|s95ppudjLNMJf zqyQ;E3XlQ{D!^eSHa1pw*i^DY5fKr@Uj?r^N{SR91xNvdD*&e8uJo8z zMn(p`2sZfrLe(b)NC8qnDFwJTU1VgW9)YQFo%ZkFPyAKt!lQIZ0aAbzFtP$%;}b4Aq?!AO%PPMHJu~zi-%yxiTpcN>6~ zZmA-Cg%N^Xya?%VQh*d71&pQu*Z4hm?wni5WQ;^ZLPGEW10{`i@lbt90aAbzAO++p z0A!%yMnQgEe@r-k{yg_2Bkx4eQKSGVKnjoohEjk-2Ey994j_Z4fPq+;I!(RMhPr*I zvZMehKnloHfNT6_W@Z{3ok~?7Q>Up3EbmgJqeuZ#fD|y40vs$39z3WNfGC}mloVV-DQO+?is1xNu>z*z-2KwP?XiHNDV0s#R5g@uLG3+?PRN&AxmqyQ

xGjC(3S>Po*@z<$Kly)WsNC8qne+qDoUv!Fkj6ReR6v)WPpcldVyPK#+qyQ;E z3P@J~{56?O=oBR^dQyS?`}Y%nrC+7ACn-P*kODeWfa?W~j*j*udMGbWfrNwvPJf+U zR8$>OfD|AFNC9yLVEoYpD<~+SIY(Z3BnS=;M$ZGag2k^=`jr$Q1xNw?DZn+pPMkR5 z75Y%7P~hy@v(yCE-d0elJ|Opc48}F`&Tt z^XIwq!aG^?l@uTaNC8qn9|~|rzNn}O;ou2;>QMj#vGVfrs25rvcNx`!6d(mi0b2z) z{+>R4T0Q8Yl5h$fJ9dnkz_wQ`Z6O6n0a8E*3c$Rhg@p+(ggkXBkdl%@O<*0|XjBDK zfD|AFcnWa*r69lRgfB`J8XAg$SU@oE#L-t$fD|AFNCE9C!1Zk=Cnu|xK2$I$5EBza zz0lgd%c$g}04YEU*eU?4jv&8iVG-uktN_NvVRRhzLfc-zw1pHP1xNucD!?_VVq;^~ zj2w4wM@?YsE15o%0;B*b zpe+SB8-D!wac$9uN*fduR8mqx2-eo^Mx`YMNC8rSQ-HJHsi~=iGc76*5fMTBrF)qa zAO%PPEh+%(jn{}2Hs9Z~s zNJ&YdCa{`sMk*UAKnfT~0j}|zo105Pesu|4UZp}qLopBw2sX|YPBkS3NC8qnoeFS` zU-V4!3^je#s{(k-PrcCUycwxfqyQ;k90j<>FZv|)${MPdtpa$<5C5Xn3vHa+oN7u6 zkOC@Hfa7miSeUJqrY$;F0RBa(39Q2Vk%~kLkOBr#fP-&*e7uf9Lsb(}AT2G85Nwb; zovKL+kOFE`06mZhPKOY6LMEEF>sSGFdQca%+HOfI4=F$j7(oH9?Gqgxtz*Pc)x;Hu zi;JTsun}%{sv{{t3aCc`uIIU+pn&Eai4#iSzXk;b!RZPiSUoo;m4p-^1$3_fXL3)T zJgINKQ0*Kl5D^jK75;LWs`IbzZ-1&FDL@K%O92=?y!cB`Pj_gXX$K=Hke!|F6bH@b z3d>qvj+h-4@aIulTE?wrGlF)L=zN7#tpl=0WUclc2 z2M!nkE>uT{3g9(Fd09pBwVZ2-*;p@LNQ;h2;nuT}DN$!`oH=#<;Jz!ob$4LQ&aD@C z>#F6adF!%8C+E#P!doZ(7B+s&UhDPOANPDcB7nCJ_1`+^ySzY+2PcwQ)rwno`2lJAcKEcz9gK6g?r07QNE;rRute!D(`PbMutK7Le&&kproWU zFSn#={b>fruBG~DAZKS4q1&8V!CJ9|R8CDOAP-f_A7wT(mbJW`!CF?vl$KVl_{p*n z+qu;Z@6XWi5x30rtL_!JeEBji@1MR2w$O(@K!LA@@8a%yO_((*Bq^YN1=t%3Xme%B z&1EcWP7Z_h=1nFs@$WSufx&wAEQ2wn+O0d@B{PBH`UhBqnSa2`0IxsGQE5A*Oy;r%TtEYGNlylSNDV!sbD}rfZ1Gj zB|fw6gX0Oi)(X_Ve_Uk54H}50eydI;)QSRC;02QE*RQtLtH<1TAAi03Zj6A`?b@mp z+r(y=*w|PR`%FLSTLA>!z%|gX?|N(W&}UA8uAP>0eNI}jZ&XfFK(z|6@I^=N{{6Z| zsyYZRlq{iW<4vAo12SKzOTNpM2J4Lz4?#9lA((R%8F9VVeSb$Bkd7fE?>S}se(oMov&Eybkpk*bfV*Fq z=bj_@I#A%QyWoifz0mpj`MY-Q(iL*3GFA#?W@h51=<(X0MkcAey8Apl;c7xQqAo%} z^_Vy+2`QjX1z7mv&F`j74$z~&#;m*=!6{|s5*;0FWw7a^eiS%(@E~4d?$~->9)Rem zkKfzC-6QI>cvLDcwgO>$F4I6P^%!|7i8>Wv;fp!HQ>I8okGwXc&W?gxY{X!ys7Opqyk)cLf1M~0 z5fOnKV&2Rnve82aLV;&m%{QA^$LZ>{dsHe?Kn)78!>;hE>%adc{yL|?*s<)R3&R{b zbVw)Qp=wkrP+Dq2OxuQarw~S6Q~=K~+&!WOLq}yG1=OYhcXu#wuBfy2sRyca&piz0 zr<9lH%xKeZh3= zCI>wpXkcn0i`~2N3}Z5xf`fyNOfG%YJuNK_H^uus*D8V@N`zD3*pWocq=vBSF@01L zQoy?ku<%9WH!O_c>yiRZnlPB?SW$s~OMNiNu(jB?Z(n&?McAG=;-<0+bndW_`0HJ3 zPr0j20hYg*^V_VMOZ3r16V=^?oH-L(0>S(D?>8*GbWriUygae2u@8+H59_MTiHE(_8`u}>F{I<^6LTkA`84>&(ANxQ!3eGQov{mu>8fP|Ln5_ zUw0|+#TTr|4BiHx&@PpXQ}XQWY}^ptx-9byeJB?wFy@C4?jA9k`K9_ASpoK%#|z4J z>)eGN84X7L9di5a%-OT(WGE^s!iz=YfJ}=uJ$m#g`a-vCI7?Xcqyq5mdFkR!8i-|N z7#XncEPoL)&&P-O>s|%Wy-@iU7^7;nNG0Qx8P7;|=_XmQwB?>ASm=7`*J7?4ATtTKD80}2x+xEDS8YtPE7(fajJyS%&{ zuNRGjGi}v0Dk=*1#H^`@Tmhn6kA3=ynLWF295H0?l!=jl{&8j7wwuAh*+T1%9qB8U zC(NF4?&lwl5B)6k{odPNdvQgx2D98+LRS(G*m02tVi}S}Myxao-;50AKmQ^AdP0HP zwORKj6%`m;t1T)Sr?d$2o0(DAu#W12{C4zPJYq=Lsufp-Q0vt8ty|OP&%OBFSBLw( zx1&>sWoSXW0!;;vZQXQsaWU&S-H7Ix>TDzh*v2oGL4!Pj9(fH${T=oF_nhi@$!Hv? zX{DwK2?;nmBZux(5GXDtRqMWSJ-V)6Fh9mAygIvcz^;tBvo8!A9NM+>D)e2uSY{Uw zpE76DITOtDZxT{u;CLYV^u0ocPhv(MI5!R_d6Zo{sa<_w6+@kfHb?bsiW$c;IfJ z&_$TaJG}eLUKXMM|2A;0AU4t?Y` z8})S56Hl;nzA7pb6BG5#HLcVRuLCgi^u=}yWZ+WSL-6`_;qUH!+v||gYT)lPt>&9e z)CFxMEE%J&EPOHSdH#HYuQwIIoG+XOhBSW1t*jxsf^SR3<$G| z9P-iKJE(!bP;dUMqpY!_x4^~#lR;|9n*D+T=HZ9ENgq8mX64nTMhzw@3B3?GIXN^C z%e!PRDJjj%D`{GPnhatpd&rPMA?{|Yl=M}?-zRHLPD{Ll;?Jac4M4}YQXu_K8X8VA#*Z{tk0)4c-RlO)rt7r|F83N&rXm|1T>@$vEA zVvv#Zy>a6PZVJqHQI@1KQfuFGK~RvO8%cLJczNloiocyZEF}Kwo=v*1APZm2IXZrv zg8ZrlzFb>=&K#T>AQ)3%jEq9h*F7{e6o&oykwh7|RQ!;yzC6H#p!BbsH{F;t{>;c> z`#9@d~F>ZXuST?YJBMX&R?Gm2>y2Tp?PyIihGK-&Q4YQh17p84aW_F+eG(P znkuMQ1z7gAQGUG&jef3l3~+;<<7nTb;a{|}yLkdbr5$TwK^*IrzzI82>Q5W}7~ zZn$nuKq;RQTj85ghtP1Yb>CPiIbye#jphQ%2*dz~mLkqQ)W+Y&K2x)^iYPRpUfHDk zda>}uo8MKd2)=4mVBkRZ1ThRI!WbEdo~%0;KC6wtsOHxr0=Rob_qLiUs6PeROShzisaH>p^pVkK)Y&2b z_y-dnjt8WYl9Ir{Ku==Guz3|17nc;95pBm6gei6G2k&m<5m5XqLJGo1mQuObsX5_| zSJqCO9BFA0tB}9wB8ZH*K}}%&u}Swe;+`9sv119o>Q$h1YxeB`!(cj$VVUT$ik~}o z4pL8@uwN;JxtPv3qYjD#m-nli;v+PFa`whP(Pqj-cB z`MP1lbp$0;Dr?(x5c)yE#FN*+|_Y(s3Dx158Qfu+ljDmtvbQI~^XjAR< zp#V!>G=9&XWp2M+?evk?X4KhHBSx^NjA2fkIN>oK87dk3i=7$jO9?^%1rdsG&0q#O&UVfS2s|^M2xP!r~$+EJdq9SyY8j6gb zscc3@25yRXx_L9cye+xbtiC1!T;5O1md4wrV4N*=YmUEk@g{lX&@s03Q8gC6m~*sa zhc?iovzDyv>U8eRJvCjpaKST3GEOcB4<5wZ!(H1|*MI9&`xiL&Z9LaFz_qREyKk-L z?h$<$YN~}U6<{w>bUrs}Lj2X30-HAB!3oQrJ$sA;M-SAru&~fd48liuSF^O#l$%rB1jtt-G?mdux5Y7#wqYRSs33j##O$K&-uet!P0UAx@P zCf%nW7Z-<{;``A->IBo<-PSv#t;i0mRwg2R!&_a~8>&T&kdaptvhYFyXIASLo64^n z1z7l+&CJ!S6y#Uij~{Qo$(~AviH?reJs;g#!JwcZ%sGmW%c%RHO5d5n6|=?nqX=iE z{Ip^H^~n>?3?8_cFWQ82f};v zV~;VdS~2h;iP6h`eoVuL4Bp|Q4eMfI0s}D+tE{XHvsT?oD19dmeei^TC6zT7Dilrc7ZL zEfQOY4U?H8JWhzGj9>fqbvp4czHppupFU0}Ymw!NCm3Y0em!&P65HEgcfsVZD_5A{ zU}nY)rbiFvzyEbQy9N!I(o($2PfSeIHzM6vyS;n&Vy@_sg9+|{rh;kqeruDnY;|^j zyf4PU=}$iiezx^ui6ILWte~5cdZyKUvx&N(bwe<1SA^vNMqZ&IW+8>^AJDRMxD*!3 z^e??x#;9cX7p(0;fI~5 z%jC)I31yf=hYq<9QaVmKH#ZmUqt4GPa+Cd6D%rXZPFTGv(OIO*-hbtas|dBwy6HTn z%J0Q==Fd9H-EG>o-BfywE5KfaXmi1hzw6AkP63>fvdD8WErq|x{oQw+sMHTXNGY## zle5st{Ml#BjT@3u7T?KaV*dI|YIXkgFD4}geHsWBPXn=>eNKQIPfSr+`NwH5(m{IG z7(gYPr?L-RFh8be_YH`-AibPw+w;jOS`qUfzG7OZCi|GtL6Y z;QJ%SZ(*USK>H7XBXN3Q1i#7Ct>1*VE*XX}r!pb|jIU zLTi&J+{FTXgQyLA38TP7*-!-u7oR|P`0|f;Vos zj?r1-B~<6HojWWf{%W3N+N?m8;qTW^5}~BS_kjo4@wd_!xQsw!O?vv+Q#ya)k`d(* zPaJJz>5D`D!gV%$h)G;9;tOM;j~rnF0+_HcCNh#ioLO+z?&2(eQS15hks6l$`}Z3e ztP<;Tot^f3&pmd^cHe!>Yp*ds|IC~|UF}#I{6$h(Sr}iJo}Mm|L5AHeBqRh) zp@>t-nx19T=j|<9HmA5kQrX9D+jg_f)2fS7;SlRWDmaS4Mo|Tmaf!})dPlpy;>Zk1!t#Vvp1#@v-` z=PxF}W@g&ij!n6__FIBNc{#;jq%Y#v>-+ER7fEQV2!An#93#m^7W6j1_nsWh(X1Xh zl6_MzB#6j%^lzLxh0|S9QW6*#D1}4@+=mPDyLIz9TjQ+JE%566*??eA&JO0N4X;_6 zQ>^y=<02z&P!m{tB-3VzSwz79(o;{#vF9SD9zRW-D99fWWbtCbU;p<%Cki9NU%R7@ z_wKcyIHn!peXH$aHxX_(5&lk{YMWBEEgyYkzZl|@T7I?LS#9}M2`H zRZ5i$3yVri%i1=Zqd9hn7r54a<6e61&oMup@K~qxUt3Zie|VyJsZ{vu8!s=Xx4_z@ znZ`=Z5&<1;c>gG3vE}`QZeF2Tv~clJyEcRFZlMJp7o}$^!ruuK?Bsy@Hf?Gr{ocLp z?2J|_x`>4qA^rm8BGg7|c*`ukf{O3CawSeWmawoeDLgXNK9Lyq#xS#|A66k3lqwRM zcpd!~`S%NeGf9k|9_1iN^om|7H+R!R~@gG0d1t2fitUmUHK%LQ0&!LT`1y{IXj5aLr-6a4sul z@E5apMHU&sm?X+BeK*L0xlv_hg@uK1G+_|DidT~h@*8vUW}OGdX^|I-m$^Z$Det_# z0l^1d96sHt!!pIo=79wLn#{7GP2_GC`U%IHtrobR!-8>-#kZECq9WXVSPPhOGHEjW=2>q;o;%ODwq8H zd`=BMNa(vP1*$HaH{Pg*A?XHOe9uol5xOjyprF5VgsY8&1i?KK23I^6?pJaCVxRB6 zvy(+!+~1R(Yu2Id{G!zm2tQYtL zIcl@O2*4UxFL*Os-Gs2;Vq;_B(Tlghbp~&N-Ac1rVCAx{meNW`F@4`&;{n^Qtt{YB zYw*C`2tH`Hh3jzRhkdqdtG--mPaI=MW1c*D()wD(XI#L+HjC~fn*hR`0h2`=I;ffg ztde-gig%+HYpm=CyKh~&^Y`(`)iM3PwLOJO=#alcczyl#s`S78mMdDdzZg7* zMj|qGmcMu3&Bl-tS~4;mR0;!|;V47mde>bJQWFx5+m10wk) zSC38H?t&??|M^d~Owq^{T7W7kd~wKM)WWV;D{hpvPzN>U0&~@OmcJO?B(lWBRI9$N z!WfG#eQ|LTlaCL)gW_CWOU#bFlzu)sm0Qn7rbL~&fmx6T_g&$wdxB$kZoR-;*Q|(G zwfwa8x_n9ayqQOM>*R6!#*f)+y^j4k^y?7;ymi>8+Xj8SnYX_8&YC_wR$H$~{tgcb~m z!P{HgL#($*FO@p453K=6`AYw z@`X2BdSHB3Ba z!~6AJj~+G*D)U&5u4mN!wE}C&10seBmz6f%JAyV#hIrZubD|p?@4!^$JW3yXNmQsm7-}ZN$bTsaC z4^Y=D2oE2eO>z-KhCQ5B4^x28oDqwM%R__1uYrL=pm1sXq)B4HlFnb0A5DJo<)@$c zdCA}}3M{fX8+;+4Dj=zyB<1mU+B7_RjrwAzQie-^>G(CCg?`Ahkv9;kKohmI@Ry?@ z0uN!^tC zp8NariQ|y7c6UIxDuC{eB{^B_A;BsBicB{~$*rdyS?VZ*zpuV3CIhb9haPf5b7lF9 zE(nw9YC@JKu;Rr+u3dEoC-KW6JG@v1=~?sm%MlPA#WSa!eY@NGdJih|YIx{paQ&3+ z)C&L4J`ZUi1mQ>TuE*(4NJ!8r^^l0vMxaBW8 zs4YO`eQ=7uI2OaJgcbzm<0X!-GWd%g?95D|OxW#+X=s~~&=zI+yJZU=lV0!qhjiO+ z%sp%0KNh2~vN8)B)ziQbHM{(^fD*1F$BhZ^(QQ3kI?Fqo4eL%r;9yIF(myPie@R}B z9zH5FqY$p%LPA26!jlow$;`~87s0MPKd>wSg6GY10tZ5vID3{&%}ooUDGBB4EPq8_ zQnzViCl?v~MNwzW5K{u0i;PC&)l@CNLHn!+v;X->I*yTCwT4Z^7`bd+)VhLTCAl#;M)-2yifNx61PPTj|(X(NO3EWt42k@;fSCJ$ zz($DqJAFzNTtp(~;IP4={`~^*7r_1X=aUP6kJ+~EChrhuzxpPn>86a3XBt ze!`Giq2=O5=Msd2Xt;?MS^yE-!l;?QC@scWnM^_za&@~z{yz2?Q&g0enx|TPsJvj` zjbbOZ&zh=UKZ|%^U8)<`a}ne>G&Iyj`q1G};M%oo zoWU|UMrBu@RSyHPLPDJ5?~oy4oM_O%xzs=_#QYUmY#nB*pTDRShL@i^CsHjrKcPeZ z?YAAvi~j$L3OH1>wmkINSp{BsZV3iLhXkoKT$FnF8?YYp^r@*J%Lz7Im;D7lVFzbd#19e);;>{1KS53K7a|}y#h5Y5 zG=!ngtXWcfD)#QJFqd`oQ)$D^Sq^$}|9zpX&)W}F*^QtQ{vtHtYcHayR`|=68PS3978@QlWh|I7yna3N;fKsW|5;4|Yc+VEd-Om)fjhO~gGi$B^ww?& zPFGTFPQ04s^RVj1kUv#t+JKJ&7R=uxFtKUPn%!X5ba`+i%&4 zNVnhaTy~hgbosKWxU@lS^$y&1lYwN#ia z?Sh6jN>Sin|6*e-A~wWJFEP(Q&-nVXGp#VN4Vad4xX?c6e_)u|)6_d^*J2Vi^xd3uh@%iP#!dhfS3{qW6^<$okN1gN|n(AEa%5#OOsP1SV>h@7262NG~!fE0?; zhZ2MWH*VaZCa^1y5bW~{rUP%>=#udlf&y*#i~{%Fhu7%&6y*26V?|7{jGuaTUs+yW zv32t~8OM6-5JXRS{iW4k4h@?(=OSLw%A>92CVo+( zpzTlJ9UJsvL`Go%uV#6WTC*NOP4D70ea9PM*&tn%teCt z47@{B91WD9yA^oi2{`?Lsj+KO+l zYrV2rnMEd(dH3$!Zlw<;4h2r0JjoH{7EkDZrxjoaV!<2aBadhgK<;i}syTgxHH1ss z{a3VZEmdBAL~PH?Eos(3?OqmDE~CeaH+$M)+!yE0og+SaMuD`nG(xb`(6u^%RSyVW zx|H~<83iz8IwAr=ew#f(Tu^xA6^|7C`mRS0+v-0fc-!f#3KgjT*u>IOGde{n$ggMM zi(K%Mow}f{a4P3x6@uHf(+q&r+%ok***^IMr)=dPr&VYJ^;aZ#^@N4#)`j}{-TSEH z`jr#7^CIpGbc%Y6K9ms@h=a%e%0&))=os(<3kG5#E}n~XQ9Xbj$^!FK~ z-cq2~8>{e+ATcqKXy`2kGBepZ*T9IOIqE{?Sp-8sxO7l?1JKCDgPZ8`@;*IQd&|%n zHs7KCTXAzN{{4hu6;N}<(^B){jtSB6yhR_%cmMwV#9tTi%O1)i7_H#u%?ZJ3Q~)lc zD=N;MzOH6VsN=H5#b&_eUgu{P>9~$stlH1t?S|cgJ0^mlcNIuTNFW5eg5WCt9zM+6 zcAFXjWaO4F>VEKGh1ra8CLT7DBZlm?xCK`5!>*kf@PCMP#qtDr_#gkl{mu&}haxHvE{(7W`Z+=GLIO(qi|*i{4r z!|%RJ{8g6%y?WuaY~ONT#1^^fCpYm|1m!z-X3Ux%?cXn;WkYpEAlkM40?xvqk2kwX zYD(5w1=g>Q#2LZ(AHts+6o`t7!s)=`3WJP%EUO*jBHg&*MErMyH%mQG{k!ghLt9g^ zss5uAoi$Ld@9%m3TBG^*xfj{scMqt-3A4{bXlhgCa^1y5G;Q&5PIiM@6$)MZBmaFY~DN!d;ZjW?;O>`Ur-qFYG3Q* z<(Ry%{N-g8Awe;UGldeAuE5oVY#4b8@~bxZqCA)gW;UC_5LXyv@MBp7W9in75bR9_ z8Z~0f=GaT=((RJsd#Z}RKyYASR^NC2QoNc@CAcq?^?Cb2?{!WcMLR2{z~=-0g8uM4 ztU~%wk)Xi&^XFN75Q61CMzGqU34G-WbNAie1dzv?nd;0aAOL5fi&y8Is*S%ua8OWo zuQxX-Wz1!y)1cPml45h>)hwTf)i_m3Mvb&}2!cYEmX^ZvFu_ip3Sb~sUS1ycLd(T3 zdmM{kEZ=-X{Pm6kojXJReWCH*wT&v|FA$9B!!NX3>P2NH{u+j}Gk(loFP6cWSudP- z49cH9dsdz3p;B=Q96QFICM>Qn$l%Aa9x029nYwko10Z#_Nj+1l+iz#ipD!ylHSw9| zT{Ejr{sO@m6kY!jZ_Wd{nU-HtVs7)ax+W=m_iAx>?&x{I;J5tze42Ble$c0+u(3M{ z!Lpws*vA)42VS#=`0Hr}1`UGtOBbGWw?T85zH0dk1b_AA0f*&x-wwUHuR_ebt((ue zFAGYUr$FfL%eXI&A3v^s`cMf&Lqp-08wi#SAUcpmFqRiz^fZ7x)67(7E(r3QmR68g zjL17Y`{VhqYUXdiuFMus&Gx(|mK;wWzlNKmXLm0T$+nb7-yfd!n~w*c^z?K>n^qKn zU+zkNfF88SQGits1F$@hTU z1QZq)QZKX|^xis#dw^kv4Dk?s)Y&HWSgC5)#yj_<#B7xqRT=#K<;UX^3;$G|X`g%; zuy#$7Yy@LQaGjdo9E6OZgt$R|_$pXpm1#G53VhIeEp)zm^(sM4TMC4ShjRqE#S{A9 zX$9COaBeR1;DdxARz{5!|iID#dH_Khb!QLomn;9sVf*DF7zesl0f&kA>$@I3Y^(o_aJVP!AWwl`f7}BLbm77U zi%F*s8d3mm%BTz43a4^DRw1};TSBlK6*zntL4N(3%#vrO+;No0_*?6~afoHp?H z#JZ#6PNf+g#ZI;8)@7MfN72qw6hPRi;$l-#Q4wAyY6v=1RBHv`tc)cHO$V04UiKJP zJM=;yKhE5Cn;QY7&St4+O4X+iG~TrStQ4cW+KRMR#uj_a6_fF zRUjfFq7uKbowUeNfK?Ao;PiCnKmSo4K%Qx1sy3HzzlFLJe+yHa@$@i%F)v9*6S!mR z#a`D9leP2mN)RcsQN5{NFN|&qaOz|-?u)~R58K*v+M+oHGBPsgMX((7-a3XwFa}~x zpHBQ$QUMGs&&x}{nXf{#>0$m385AOezv#GDgLGdE+J>8B@qDS%uhdXxHJ9P_E`PvW zCnqOs4m4C?y9!|LHu3isOJ)AgA{edUX3dlYkZPNyo+;SEg?Os@mQPna>~og;l|LeF{h1MR3ITCfe(`lo{*w^wk^)`3Ld%d~@6TWrvW*_*@9df9W$?Gn)ANPO@A>VRuUc4WO1Y8O;4yE8 zNA!Hf70hw@V%BLP47IjNL#4N;0AfdGXJ=CrST26q<5&b^88gNu`lz-|>Y0Ke$nS*< z<`UCWbtWrlyOd4Jll*N^YYIXdIm_RmpzOyVo~UfCT}DYzP;t;Kjom z)tzcKm*wW>QjlMJ_|n5R3}`3*y29To1Y=6|sDnH>|(zuoj-*A?aEUJaTmOQ&Gd*^CHO0@jzHS?h6X?s|U~u*C8n>i4g1xf^mwr#uVY~vUEPaLO4$IGw1xU{^i zA|xnAL|gjFR)H7WFN9f6O-&WH-1Lhc6bK0kF`La`h${>-_^~X4vEU`9YB8tUf=!-` zIY+|>Z?`o;s@mci{x*Md_L|k#WWX1PeEj}SRVijE%>KP>JMM$t>nvO7gF^)_$FMFM zD9EoK5bLN8=g*(7$ z1@L}9FE5XJp=Hvy@-XfJh8aED3HqqEP3p0NZQO{i`!`-zh1Vu=!|NvgHm*1QwHH?m z{Va6-x@6hp#eoavUlK3BcYmGuYZz{j@niOSw-{Q<9o{?9C%Jp~ZavV2>L5XZW5&od*j{gLQn`#b zZx$34nOZegQA|m7DmG*CL6~CnNlGx=w2OWeNJ(L1cjD9=9HX+U&pyClAlAy2lIY{H zHl{i=LiEOC$I4CS7EgIUWRDa(EQ7y1M7r`C8E4FTm_F@^- zpLP95CYF|#6&4m!kYD|fRa#BpU$hK9TPrGL1Beb}5sYV;=btA8J5b>L_aW7~Rgvm9 ziChWQ%-`2vTCE8gPaeO9listtTAXC6P&CeISa^82G@DI(=}Li^m>8BI)C89MB*AKj zfmo4|417wcv*D?RQr&Y8bM0D5QE9yg)!u5em}u4V_m>|v6K1ICh%t`F*kmWyBZI2OTJKK+#VE2zMaKSH5#zl3_g zrYV($I{CYJ;pO^|Xvw?d;@?l;)PFxZNU8Ipr*xvu+<-U-4<3|kuxUrVDS)mITmx8K zVUWR(Wt+e`IZVx(f&fxOBh*`Ec<3P}KR+!cPg|B#h5W^9-=_6vYD-3xHYd9{FSn#w zgXx+pxmyd2Zh16(u3fvPH=_uq-Xb`)5$1me8+&KkE` zGsP2E8-JHBiEr$qNrYi?D?qbq`Dw+^k){(&Ny(!izfO`$pSy>Jg;5u@EBwW=RS0g~ z+75uc)$mk9zAai{i1^va6wR4RRq=P+nD8eaQ*W#ahbK4sEIZYrTbE@H_cX{3T%ZaJ zztJaAs8&uYkdTnT5`=o8p z;FhGM#9UHR5*Qfhq@AYSb*KQ`VHFeBZB)WOuNUKuH=sx0j*C1C zrirg!=Pw*&4eS@_^N_kC49Y%t>sLqOVmP?(%9ah$)@#6yi(z}>cx(8Hq|@Qa)+>f8 zVH`DYy_T4LBRRL)dObHgtBAMe<&_i_ny?lWlv>u(5;MkTS8@=4*|oIPTvk?&6^{y* zm9vWMeXaCz`SN8QvV^MSyaLhD(cH!5B7h8jIIAI=z<8N{@4bXz=8iimDuevO8?bDn z?ZpGV#ot{!GbW8c^LDrOb!txVV)Yfz`sw=9fi`&%%g-yZtQg9LH6y+7dU9^nnv@F= zW4(C(=K1JUZpAAPAUh&F8N}zUy8~l(ZoR-;@p_uKE?abR-pnJsb<%HPXuVpmzy7%A z>k$FGb*TT=K_73nUj6%R?$cv6xAuK|b$)(HX=!P2aIo{%nvT$w0=NcDCKEM&6?u55 zGA~o6c!IwVKg`A;wqBonl6m0;{`%Hi%m*LvSGcYI`s-@zFTXG|X7JbL%b8WHs;%qR zF@b^n^}qqPj6mW&~hHPwrw`2vCmZAYLJi(05sH~fD5`psjSMx#l;bP6@f382#a8hg-%OjGBf#W zVIhMxKmYHwsE8>k;jf4eiFP#pT2_43&;p;>xw#CgR$l&oueBmJS~!|)zBa6p#X zri1jLz}~%k3BC%#7fDs|7ap;&o;kyuI>oO0_cMF;R9l0C83Y63t$+T>ELy~0Crx5_ z>#x5u-+aSg2M=Zj4XU>G@6Yt^&0i6-_@$Sst(`kFet!J5NfV}ieg1m?{mgy$Rakw62WddJ`asAE;bbx7t=%}ZKG6H>2q>&h`$Q*mu>uF`RzA?@81e^=>ka(?!RK! z{-}8)@mG^mtjB1vr81z9q2u=vK$`UHK zlM0}_1DzhkUj-i+I5C+41Nih&!+TiomZ5H4rnneR669GYZyiPabzOPPvBiBc;De2> zC#B;Qx;(QO{7p?wb<&E{?pjrV!u~2qUL?iB7meSuXDJG>{l||nW1!HavHLV+MTx&I zo-72ng%_z~M-p93#|VeR{TFVK6DLk+l_*qh$qIyogqY1{JaH+@AS0*7@)yg?FWaY& zcblJT$o-ysn5$Pyi%RQ1rWtRF#9tS|7Zt(It?1fmsf+0t;c)nfgZE2>Vn;xB$%dSE z)T9E4IEniLxG*v?6|6f;Ud%b#v4h|%roh{8L#Lo!m$YI|iNCI#DMTW`1@VONR2vQHC&5#Y9%Ht~S$6pVQwIt^f)uV25eRk~2QMHL7S4`+EnjbEkci^eA4 z3tz`IYdWTnnp>tGE8Dbbxcm?WRs9B*_$%)m)vYODAKwZ|ALv9JQ?&$GTpu_y>2BPYd5iTFfUuQGSv zEtNhVYi6oBqmMp%oTI=U7o9zj_U9>ph*2;wiHV5<=A1TbNdXG-s~~x~q*(r9Qf|5$ICIPrXmzvBAve*Nr| zEqEYZIQJNDJAIX>fN!IjWo6|EQAY!@>@iI<+c1=!nGx`bmiyII)Z!Rhp&RAA3}RN zQ~+H=1^FeVrKK1>TiveHH*F{o6%|!U3$TI~1r%V##IUQB6y~4*B>pO(K*x@F3mkqT z$)PRs{0_uliJBvJKuL)?J}#rK>gRMztdV+l8{)qeCI_QuwZR)IrIi9fK|y$SqG8Vp zaQ9Xc+`|mhub%?w(N4K;;+OrvO6#a_r-_ru9LVw?dFsM zmt!(u!{N8z%Cyr*4JZ&B8_V(H7Cq>HmlR;dMB^7-3jg>A@mDbg9(jbx&(F#zbjm1s zVCSCQH;x+y7kTaRq!H8ed#&DlRS#3=C8|c&L0kcOHaarpiS=Z|KPC3b1m* z+cP5QX{%|emD0ZaG6X&l7O%MNq6FQiz|ETlMMb8T4QIM93rd+&;MC>lKUeKFgmylcSU>3dz^83I8ZlsS^8mjIqXZ`w2Y3cQ(937ZS z-B*DP@>@`vnv(a#qZH)VLk`@!JhK@5g)>7V(@o`d4+scAkYD0&HGI1Eg%gt*HjLow zb_IU>4Qh}5IaK%j(s~6qtvib|HTaXiv|bTyl|L*r4ziy(aYE%7GHmfKTwq7aVR4N) zbaa&htdw}|d-*bR=bdh+kNcXIT1okydzfq2OvR@9k4@B;VKh`}TRb(>Y$`i*`g*PV zJk<0vl)NI9g{za&QZrguXlEIgajLC2;zc5AB*9m~rw5k5Sl)Pp;Oij;di8?d6vIx$ z2z&jflgF>&g-nmv=uN#B9zVv9*^3+G;>C-q#gJhOcJ(S7{2Ggb05Wn?tdy8@w12;c z(4&=Bs=Ld%dv}GotW$@DUIz^oz*d2-ot9z3@3t-HY=5FHo>AatT0VR`gocJ1mUJqt z_`ZGnXw0*+PYW!6@u2VLNBs4u0!^Br&p-ZhhG(o9<>HhA*AlZ!OUv3dpX=07w6lT= z^z6P8rXC(1REQzN7U|~An=CJ=@v9JnSt;Q_Z0S;uqQ~7$ORc0ob0(gAMh@Mnpw*(J zTvy=Bp*wI}%$af6^`s~TR}?sL>>5r4V#^wqcdDxRv17+rUJ!g0f-jO`TfP`c{^+B` zUoR+d@4ZY~T2Vm>=DE0Hrs!B@70Ask&dMxmSa*uD$x>?0D$vAds@YtYmzR$Sv#KJI z0Skjuke8Q7ozKd#_g0YKAAj@$dbH9+b$2=Y_s8?(`ZbZxnkL%cO$sbscmikS>k$EN zN}rN-N`Xc5kK=SiM@JhFd8(@N*|Y3iJS++V$jC{tQljS>L4Ir0ApUwyf!l7wM8^uV zxqVA|)#!zBwmcSaL4GgCrc;juPZ=+M&CDpogcnSEQ5BC2RTv8LtN5b=%U>)XeBd?o zIMuYoXr=IQ1V@p-sy3W)t5$dmaPDlX7fl>x%_*?2(({7~!!#TD1oi8?9)>D0G0{-S zQ&nZ-;#iL;SQN*QF%x8^#GIouXS5OI_l`TzNMy_G%JR)O>V48!vIGeB|7f$3&8*k! z{zAJ2Wo6}iLoR#0Bvb&N0?|<^xb+VmI;1Kp8Kf|K_wJ=2zsf!*RB`ON=hTZN>(=r2 z-@5|ds$x09*uHxa%doy z=b?Z7`gIz1r67M<9^uXJrcK&_Z{x;Hak0+%i-(ObzCaz9{C58OAi72i>?fb_T9|mIen08yScm zu6tHi7V%d>{<0jyoZl%^Gyq>v>F1wa2X9phD(5dM`|PtgH7AcJDQ>$cL2(79PS}r& ziRa}dey&Ri?=GgxI`wh!P zk5xP{FtE6|m>RzdJ}^{4?DNkx0AKVxW44ikizfJ6s}|gmW!x;#qHWY@nYV8_kE_i8 zqfHtuzoCl#Osn}ABbS+(=`jo$Hls_IE^*dZK>!&!DOOB0eq&>`5#)Ew81C#V_E!`9 zMHBeD?@;CGlMWclu6nDozKsy%xBS$}BpP|{tyAD^zB{+F!QW4vI%QZgdZ6MVAt7ae z1x@%>?unraWZk-Hpz+(XB|Ab)*+nb-z3VRK@?~?0sbL-RKkW92FlSCK@30lY6LE;gZS6dj}I6;|ZN_1w}DbDO8i_l=O-fb%Eijxp(Oe<*c*d*_AgmRay02eId#EBDb z<&mKhhkMV0f&yy%D)_)qg|KhGRXcn^oQV^a1THTv&G8p;A(N6!#isg?PLyq<=s>#) ztoq|Lu8t9(@38wTZPbJU2o_mdYA!4+3mU4aaL1702w(cR!sCfU%#$_ zAioI1r}&s>?qcHpYL35nAnDTwW#6^^f+p;tRtnj~XR4{R?83R!+V_vsN|~vgb`_ZL zYZz{jix)4t4@t&J8IC){8&vv;C*HsAAXaE-sBu8)rkcjb$5YRggHle zpMKkIYUl6NscdPbEN{Qf&Z3gBXq3NAn=)o|Tx^Cr%&!5{?EK6^M6wIob%|H^_j+v& z4$hXb2JFgM{zt;3@n;7059;8%&{;noTeqeOWx8NKzmU8#yZ#jr6w2MQ{k@)lxt(chR`c4vJ^P#>Wm&$Qt%#xci~7!)gY)?15PDguKoj^%TqgMYZ0q?vrpV?m zk0WbVUqe!LYL4fnFZ9)m{B71?R!~qDul%-O(JU1zyp-*DAnE(gUt9kYe9W-T(e9Ra zdu$fU?!>WcFdj#b9yJIn-BC@9Butupy&BK>wwqslAO%k zcb^gYd+)u>&6|b!C3PO4_mwUoc+kgN@IbnF{&8DNt`vVccKosI3VNq)bFtmxMgF3} zZkKetjX^=#Eu_`Owsy7d8~5|~$9M_K`zpd;ywEqB%kuK_F?`n@Y|?$2cy!^+uVHbi zc*R*g5j@DpNA3KbF~c!=u?OsC*REA{F)mC zr`aB&EPsKR4ePJ_Hg^01*IWEWvvkGs1c@j_*Ric)Qnq|E>X5`N9PTEE%i)aAa&CasXTl{^#?GlH`v+RH&QqI2DMg?Dc zafKxX*FT8!7ujWH7MjiG-Me=yPAGjR75sXR7l90gs z``>>*OBj&9Xaf8B;k2HOO0k%3`XF6_`j1U4DKTG(&#e2P{Wr7j;4h%_#w%;Z3+XNX zemmN^mT9LB&bdOxP-k?)yN+E;3J&?(ukU);5(Ey=H!hW}9T()6v%v<3rc%|f0@|QK ze*+8FTZQZF*;3fcK1(1Tfpz(f$zLe&#~)B*AVsQmel8LQJmX@6i58-vIDbK_|Ml8x zy$%@^GUlffe{D&%0K)DEOsEmck=yPS{$fgz!;oBum?QltaewsN=aAq-lYw&g!{|c8KXnhMk0`ZQ;7)9J5c&8}^KnC9@DJh9F!U_V& z$VstcqVXFT$Oo2pX=|JN{Q2B@ckmYt{Zh_%T?>U<3!GxvEu@k83qd+}hIsHfU~9~2i>(4_srf}krj`xGAc&(};qQ;% z9<|FFZXDaz57-*55^YLM;|N-{QTW+TxgTV?z3zW`rrzGXG}e7mo?b9b7w}K2keiy z=1Ssu{w`fy^+wgU%8G@8Ec(wu?-GICNZeDT^hF_F3ZZZT|$5X}QW z!HF?SC}n{=XgGxyDH8D);^17z#hHprpR7IE+U(G0PJtFr%`}_JA|tL#9PJ~{U-U3z z3b6HxSEb9A#$$N12xTyU*GB=%f*AK%|iA1dgMXNZXzFg zzqMH?1>SZH`dTnQ2HGM_Lz`y5JMBZj5HOBl?s zk%_5n-K&_^tCtwFL~!PrpO!9_!d}GMV_LU%P!ZxUcgo&;6OxAQiL*94^qEuO#8LKP zug7arr@Dyqmxl}~U*TO@%4j7|^0!-;RYE04d?M>Ozumg57TR<3rW7eHR&-@!PoYFa zwqtf*)x-KaoZ1F^BO#zd{%S|`AlVCAALgAAJ*t0m?f9Y3z>AipoY zB(>-H=bs(G7w94WS{|7&*Q~6pTjymiS}L6#j;X$Q{kLQ5dFl01kiT&5gx=Su>ez|$ zU|Swf@^{>ra3S#h^xZM*vSH4$h=VMLPBpot;ND6oJ1N`IE}k&<^fRp%Sr^RN&&f$S z<>lpJVPSS*WVDU@_U)tBzREr-u>8fyE0NJk7F+GD5C8cObBztq>3E5VVD7w=`0H2! z%c*S8fH9ep60@DPOZwhF@oKi&T;9QVp7d%e$X{SidcZ!9@fUtVM8=8P4u}$&RE74b z6k*YmEIu<@3Wd?bj~CM@yp$Ym_ra4Gh=bs^=y$~ek533R&s#7PmbV-}eE68n5*{9o zx5?Ja>C>m9Y?gE9&fx_sZ;7*6u3WhSSJk}b`t|EKsxK)iDd{##R#p~#eDM|xslrlJ zRD>>fZYe1#F;y<;aOM^~if~3)Sq2$4HC9YWx@wgZ7TaRFJ@#Swa_*!%_*+uKG;1cQ zBGmr1K6jHRL)c$`*kfyajJaj#pluLj{;Z=;RbN5=0xNKEfzW%8KkV3HqsRFBe($Y9 zyxX+#hV3M&S6&c|UKFq^vteCHt$Xxo!vnTZzS6g^TAA3osS{6A)~6nRM;%xmkN=EE z0?Wc>j<0|tx8Sp7BX2iFN@`eKDqeB+bO2lR>PfE@`~KzWsKo6(RoeP9Nr-G0epaXF{Lh^~~w(u`%hq z6`i*?l5=@0BG&_I)@yEVNl~GRU5ox+OH0irQyErt|K3{5@GAD!%74Ola8=0tS%z~k zckmYknLGP}ZPU`4Q=Z{(t0wb!IJ5rRse}FT1K_gtZq}a{Er_+Qg~QJnj@9qI9YRhi zty32Hj4{#!ncD|9DdbuerD09kKs&Z};D?Qt5cb zR{hNt`;GT{3tut((&klI+@(vGc<;;b)#k-o)R{A9tlz$IpN}6u&U;gbvZ2?mOGio5 zR4wLOoWHit|DSkla*L;CzxnD~j1dw+27damk62UDGyD~aMzn5ilF*bNLG$e&e z;sO35-k)`0c%Knt7Y-+dR`}24?Qi*t2n!<56+-nD+K$%rz>9h|bJDRYxTXuv|m0??!2}8s9vSVYpr9c1pX0?eoFIvqXzQO`_wA|BQLZ-+z5rq)4-8oRgT#rgc%3cLuBrEu?^36sTg{2Ol_%FpB|q$A?P4 zOp^FJWQd%S6Mwn0hA0fh#dyNUdsU+m)?s}kFqfQRFd9vwxptAicrPhJjqkoXEL044 z^A`i3wr{r|Pf(=55`V(nBB6T8-VP_380suk0F2<0lJYChFCqB41v!+cl>#i|&;(9T zXE4&(9VC^JX3d&RYN{mo?%gZ1vjDhCvYgoHTckpXu=_#2G9K`0z47Tc}- zwS+dXEs4AN+xx9eLM(HAJEALM9GY#VT-+kknUAnaQW8IYG_kCV^)+E-Ea@XDpu7Ss z>F}sGWr|w(yJn3f_~zv?K0Y$bO#B6Z+qL6*o-ugXfNYggWrTl4=fK7DX;Lh~ayD{qW5Zp)$CezalSiMG7qar}ujPWw&bZAdSe3c7JlXarB4-LIpq|42Opg{BRRz zf|R$mlp-l$qX2ucA#6dTMlx|Gqme6eNPN5`{tg@{zqG_(=#O!0Wo4K#WT>&tQm|{i zPeP@)`OiLaJZRQM{)&g&!}K2^YPglZ%^J*tGio80DY6|Cob6T(uW{i7?3W);$e5-C zza>ItbJ*iu@1Y4-6Ikz~utGMLk~WY6$}7O~4!zK!q4J3)!c%8|lEUAR5ScyCTw#d6 zefn?@Ie5!yjT`#RQvkEDFt0g3ucY??mj{`%t{?$%J=&Qgk`fPezr zCCBvW;e7;4;qQS1%*KuKSIoGPv79~YAjbzE^uBsho_6lKi$SxltPEZ;cJ125BMyD# zDR36&one+Q3FjGV-dAz{zT0DSgIZIp*Cvn8fGY`1N1Z+MoCq)Q6Q%}>#6l9`FUCzR z{5{60b;_hjOTFOu5it;j%7!Voh!Y`w6=_F*?jK^w)bhc?UrPZH&j@ZeKK&#Zo~5Cr zWl!z{JVhf0#FUAVmi_I15N}O4d3;)4ZV6t;37ARRObWO~0TxFH#E_iK)TrTQh)ChD z40?Lt5H-8ew&pS%WmhgojvV2!hQ8V=fJYQK?80aqzs9q8HsAWIIDhT3K;lMgCR*pn zeHP)b#PqFq163_qJlAH4^-sLd@CIqwQ_2VQGxJigd_`~su%4HQEq^Whb06?@0k0s7 z7slcN11X@hnzw`PS3FMea^ZdbWARD6@yE^K79&fEk^;gCQ~^p#{9J2euJ~u-ui}zg zCx}KmhOSjqz`LU@YiNsI1rSaScLy9_^USsNS2yt&E))Hl%(c#l_t|~?6&Xd0Cb?6N z98u=?dvCJ^qGgM%gAs@PwHzz`L+`gX^VGBc`h1(;>9wygALtjiE5Htjg)e2<hmPX)esdMq0Vr%8=@(MK z?Fw)gA@l01UPCbPR~}oX9JPBl_zRA}zoK2r&_)pj&YwSzyJPk=`>v>z-kPA|EgaO^CnP-n07#>tit{eDfy3@WCSK*#3k$M^Dw6YMnUm zbDamqUAmA)4maFR7s|kq0xW+q7bzx&x${o%Aei_og`_g}>DrZhxWa&55z5d{LJD9Y zR$g8nViPy2YsZ+o&R;ZmF>&>?0l}@C&f@_>fvC{iAgpFnM}+m?^q zmg!TXc*i2}F+x8ei112bf09C}aoaKIONxu>uSW!Mw}vC@NWYT;ZdZW26q%7DiN94+ zNc>OD&?P=< z_}!>@LC3E*6p^HG9U#cD8LTH`v2^G z34mNhnLoEOF07!7iij;<9oNkC-8~4dAqj{Q6G@`3fyJ3g&tza`I?h3etbg70LS0>T zad+`pyjES-TRFoW1d%}GSZ)X;;Rqp+5D3XkAOGK1RqyqC-90n?`t>`y-`5Q3*Y)c7 z>Q`TVU)5J%RlWFP=?!o2Kn3&sw}H9stVzy3TMi;{-TbUth9k^?z*A2>g$48_?{D(O zJ-RyJhk6jeB?~y43!8Z{>{)Q)59S^JU&qHT!g-YqoF@IPuak2-K6S`Nj=~7IfdH{1 z9I<}z1J=I;MV%kt&VLU(jIP)y6t-{QK7(fASM?xp_0?DB^Z6&A*j103;5a@T0!MTY0g~8o#M-#Agr!5P0^d%2*1vYpt4{ltx0Lqn z!%*t6#~zzmt?=7A5xDfyOZV*Avv2RzaYviB%*-n7IfAbc_~3&7!cqd{oO@E0OJW4- zMu1c>KG`hmUx~yl|N7JZjDxZZ1(;0vlHWSjYdz6!yX`hG!xfi4;46i~#MF-f&f?f` z>lWT~RJS(Zh;Ac5>IUP(ojXgfd5wE2nCHLMbJ&JMy1S_bOYnWZw;r{^aq354+qP|( zJuNulJN3(aj_Dr+277-+@{K3IZfg}T&jJF(pb+2}Ug)0w{lEuG%a=R*ch5akFRP!Q z{A3oYJiof4LQU_#e+m0#^7)rveiyzWa+ zY~95xzZNtBNA(B+Qd97S?&@++1y|^irvD7c{l6<#$RWmt4IAoFC>+Ns0yxGK2%kT3 zd7WaPqxl4ZFa6WCvTJxGQ@L11pk4%sQQ?Sn^Ub!dyl=V=wUc2G^zWgEmbPrczzKKf zSyd|>zfJ^jjOX6Hd-v>_3>`J?!4W>uI826)K{R`=XjnYAjgWOzyJF- znF0qv|Ni4YqSdfKiM#Xa)FvFQ0R-;2;|}2bi~q5FACRsN_`ziaethxm!Y2a4j6aM( z3m`!H7bfUuo+%xEcsr=zw%5N$9aY-B8`^j4)~yZb6i#9ZfoGq67AuMGiGAB;J;KE` zfWZ6G|G_@bEueCkL^A@Ug7Nv%mstO{00Q6rF2+lk{Nk`COR9t;H-G?6H38K3{ol3* z)Bz`P8G-Asd4%<^S+w)7)KO*lyd z2;giJ0N($JU%ISKxHwA)oU#08B*b{nQEMn1rqYA}F)kdj)~#dx>uUtiK>7USBR~uc z6Ev)CuY6?-tKfFkzXu&uy6-+1pK(n*U-H|S8f`cg0LNA@Ot0c|zF|o(aAX${c;}nG zvg6s8_>$kUDCeivL_m%qOXr`@`qy^|3=hlJ;Y)rSR-<+jVyhSMzx}qYE+`Z(!V&`i z@vU3nBZt;$O`*$FGXiA<=tRoBdrSVjZeUj9bGzD~U;XORbI)P&`}EUK+fgE%)(!$& zwrqi%U$N|`mb3#$b`*h3*S}3ol1E}$gz*z2(6R{7Bnuw4xLBtiW#_{Hhmm2OsQTt>nY0w?icT>Q}Hx;F8}fue{Qx`rza?5r88W{NE-g^WkH^ z>X1(1Z0ke-m;Bzj@kw^OYGqZ!wAV&}R4_h%o)tQz?EIGP@yFAOe5r()mrdQl$(w?} zEx7ivR9b)iqjjnYj^+>oBLlx78O1BVwM96Gwl)GJ_HoYe8{WWEV9yXZ;DFNYx5E~( zXU`tKvniQ8_0&@^doFqZ4;|7hob9X#9QXP!J@w=Zyz<-HI)S z`<`hZzfDEmr{}D*s1-`3+itt9DT;$LX$k^3c^k_CPd>40RyDy9975o$U%Xy+jp+p# zzhMMg8v){QsNi&(Rj>yL;F901Te0%HW5V?xTC)`gQnnDP9X5}pZtX_&ofGHe%U4nNEJ}(?PdMzDgs9zUD~q;#)r+D zH#bFJa3)Ph0E+_X9amiXfDgg_)hN060DSY&LXvf!+mj=;6oURx*>Ha)VV=~{*}tcgJHic3fw@tz}teCEft zM}RmU8lkh(B?aW>Ow)&DU41od4*T})!y;qTRR(9+Tm&9|_+fO8HJ`k+roQ07CL(a` z-+bY*N1x*ZH`-p^a0M$6ApHv~^dJ9N+JApm!OkMEWC@{NDs9}jvALRpb8`ZL%P+rt z@7}$8_DqJ3`a%Q$_QokHM~pOoXAKmPHLPG}0w(;)<~M;q>P?}>f8S?Y%KsX*X+|M_RQx}kSe zizW_X1cHEoR1Kxif8HtWLL=OpFLzb@_vQ;KodHncoEi0n)#)LjV5v&DTCYoRGRn(p%q(fen-|{Ar!j z5uCGg2wZW+6_b;byIJEOkiNLZ&KPIummgiuo7_Q~a2*|!r`rrpy1ve9c z-~A2)8=UG7G47m>;G7*r;I6ywLhtymi~ej=<8X2vfn$#R{M~mx#RqQ8ER*?da1bE< zi@ivjHkDrSie@SxHz%8ZE9-sllcSou@4nkn1;Lp+iU3^JpMU;&D2w=5csRVDs9^a zB)4zh?zCRu{M|v|s;jP=nwolU#~z#7C*a9rbH0J=9U*3Bl|>wZ5eOgxa%ft@+NH}A z#&#<1pZ{6zIlBJ(>)p`~T#5?_+BPUgeMe$|c+3T)a_{_eZ1 zd}kNI93$8Ws44K!P$Sx>ou;vk)#b-O#^e`!j$pBLO*L>q?jUf>Ew`X|+<5(?fz_dQ zDt_xNn|aSsuyqU9zAgmF5o_13(%<|It6*ygM56><3HF2g+|dYJipvP#98ox8EqVVB z?P#I^rtSa4FXX_!E&;@m7=ZvIKs^O|-%n-ORP z0XbwXopl!L-`NqEm;hW@8RScT-Bg8Mm37-~x1qT&|HJ(a=%b(|`Qi6BpkDy4Mr07D zVFZGT0O?;$fwyljz53O&D`% z)2Ei|`**4TV4vrpDiE%>T?9x4W9<6%ue1K034seQq^WPQc+EA}xU2=ZIIj@Eh0cXS z;n7ESSkgy9i+tTR53}2qT`A1z1B`&01<##3lLBgqS*k-shQp;PI#TbUhaU1u7jU_r zAb@L~(eAj-Cumx=&ia02@lQy4u;n?x>VvCp69MW!utHyZE$iRf2wZj<+^%p-`{kEk z?ui!QLcKx&Esnird-hBo``Rzmsgi;d?M<)w{QdVm!}lE76u+FD5g-+e&(fu}6_7*o z%9hCXq?05zciwrYS6YC}^$>xL8#jUh{`Y5h1xK;gS<~}IFOyw^>9cN;Ri;55wL>*b*Rb7(%aw8Dwq&B>@a!BFZQ8$DEzr-KOpefV~?S8 z^nc=)b*iWKj+W{Ax5<5Z0Afela9T!y5ilY^`WIH{-~5L4FCp;7FUmbfe95mLG@!RM zTyez}aKL+E*UQm&{%d#S!iv9zCw}Ms@B5zd?}H2e>!VA4Qt{XG@&Cak1;)RDo?o83 z`qGNOPp`S+3!lBF;_q8uzv;q%{iE^kq6`1@`#@s3hFUitUl_m&ncF#RoDSX#ck^6!i@N-*tK z{Ed&7)~qr8oqvAmf(t7DzV)rrMHf~6U2;jO;_tV=Ev;Ku`FHEBr41YC$jv+MP=9yc zS=zLT{vLn4{P)Z=blL`nA|<@pwRn$we~)i~u7L5CkA@G2glN+G~BH0+G)ht zMt~9U904hBpMLsjuf#r=>k|a@m0!gTwG#Q$~OhUzfAOHaj6})xpR?pP|6W}HSx7>0IE8pOBbFL{PzzFyg0V#)XzWHW1V+3xVB@nt`y*4u2rvS{K|oG{`4&PC6{5>U-*wkrJoyby2j`kH0*rv45s=dO?z``H zSrKq??jvyd<(KcL_uO-=e*@U5xypo zA2N}Q03*N%1P}qKf**P05vMf*=kFQvVZ#P@bOe{;90J(W&6D5O>U~TtBftm*838G=v1o{;L+4Zj=j=2BH{5Uo zFZ%|$BXivu0Y;z|5s)hQ!3Q67T1RmH&LMzHep&yvV((*`839Hh;0QnkLwa9(?X}J+ z2+r9#1pfTzKeOdI;9Z!j&j>IAEsB7Y-cLXMv~xOwb9M*;9Aft3i!buzw?(@ilg$V) z0*ruE!MEOet3zsnvvml8d+xc1C%@c(839Is5olcmAj2_-dg-N?F1_?phcpFe+jInQ zeA(pWBpR-D8ILJv1Q-EEfDw?>sC)0dx9MtvGjs@nM<0EZEzjI@839Is5oiMhAk1-w z!@70r9MTt@Z4(i|CBLkE+o02N6&L|VfDr%!(h9wG>((Z!3C_wP1mG{nE5F=r839Is z5oj9(q)5N{=9?YT8k}uY5I_U5@@<<=#}#1&7y(8A2*@e$3opEYjV(>l6r4%Z5kS-I z+_{sD&)i`d0Y-okXfp)l#Om(5?{2!{;0&9Bz+e9I7oPmKS*PRbFanGKBOnpL+-hoS z>dGsxY>K|%Oqz&*yyTblFLzZ&fDvE>+7baN-f^W)6BP$%)f5CCc;Eq6zHQm*xKfM& zBftnq1f-B(zkYpFv<7F=6a=s}3>(B?onS6y1Q-EEfDvd{1fYK*=bwA-xuz%%&ZH>_ zY}vAfC%^65;5|oe+}*fpi~u9R2pAEND)^B{9ufP6!JL-ee+Cc!9QsHVUp8U3bU*ifg0*nA7U_?Ob-|gGC+tDDL z)(!%=l!_<6MxNwnMt~7u1OkG96#g)Q+EF5$wlM^7$uG`AK@$Xo*|?gF03*N%FakOP zQvbgE^2<1UsWBzOsTxLL)22-lf4w>Qfe~N?7y(8gI0#4;fWwy>)+3y-0R*nQ?mAxf z4NfoPnlb{603%Qn0jOZ;f@`n6wgElDNg6|7+qP{y`K`%~9LNYT0*pX#5Ri%h*S0ew^Mt~7u1ZF@$s)Ji^z16BJ;rLb&z$L%9g_(`dGjJonVgwig zMj$u{K>tD`U@t0mq*_%d9N!WGciwp?Pkw{bv$&>=03*N%%!+_i3fPfqNt*nX1g^gNY7B1xay@OqaTozcfDvE>0)>E7!8hN0bNy3jgD%{3>r^WotsVr{uV2r~w|+k4n2Z1;zz75o0jOYn?!No( zdejQXsS|WmuxdGjX5m+}B5>7JSMepk0qj0pWk!GzUMr9Rklh^9<`>`%K6=FanGKBM?jkqzcAVZaOW) z;WZJ!WsYol4rZ6(S~CKS03*;81f>4mzI}U5EyIB|5y0tTyLa#A$!}9QkTYQf7y(8g zun5R`+=dMsYU&yetVRH*hwFNA&Im99j6kyxkg5cSNL+T=W!1WdLn;us;)*LK zCnquaZ5IBV4|)KgEf{ta?B;kq*d zi~u9x1Oie8V`ojZ-r*1+aMMjUvGR3-@i0*(OmFZ9bxFTI32eOTdEBd~Ml zPS(Ex?;~7&Mt~7u1RO#@PJ!>e_ugvl6Yvlmlr6z=2zkzy5nu!u0Y)I;2tdo=PM>w_ z)&*SQ8mo_;S=gV&`ZwTRgR9R7FanH#qXsF%z3iva2X0h^hlhTdF>P{_~%4nq|f3&Z-Yial}G%#pl5XAAGp#gKKsxK3leId9vz*3yE-$wehoK z#|}76;e)!!2mA{MGko^!*#ncZ{=tz}_`vY4f3O=`&Uy8J9mSk8X9O4lMt~7u1b~39 zbi94Qtkd`bG5871C_i|Xq0Je29^nx7lWjV@i?(}(;PWX~P!%bqgYv$mt_wCuvLul# z2&fqcm&4}sg*;tfS18c4x|D|^7k=f3>M;%eM&Oj1eAS%5h5oKOQ|CPb2mW8aIlNXQ zm;3_ix)-CRQt$zVv$~;A2g~lXKeiy&(X&t$6-y(467U#tuIJ=ne zEdorKmk9i$lVY!&cm9_By{sjd?NbC^_o55455a~je2M^*94GTOJDXS0!);b2&{8u@*$aUD(q!VxojUI@F9bEa{RGywGR^}tl)h*kLCIyRo zL;gd7De?$`w@zw&;o5iMmmbxXi}fD@zj0gp5}Uu@e>gBjo*?i(*QB1IAl?k;Nn87{ z&;#yp*Y=_@;iwO>V3OQNphsf}cfX4-zQO&va*4h}pyLTIMt|V-!Vi3h1ry{x0{`T$ z*fW&Io8jDVZQqsn#yxJ^{&WuH&2YZs2KNd2k!S1&KJ0hDzFeZO5Quuoe!LmZSG?c_ zF*kZ+dr>-=H^X_+<~}NOsXiF<=AjVr5g1I0+Xx);h^OKY=W*Q3o8jDUbRU&B?v2zl zmdcyqe8dkflXB!vFJ~Wu3wbk~%Wdwb;x6=@{lJ5~8O~2E;U+ENDWf9v>Urv&Zq}L0 z@(%)+d9?6r=JfnJ{~*GYxQM_>WXlyAgdnUMTOz8TIByx{^3NA338>_f02 zZ-#TB?fp>1cYMiy#htJ512{~B(+IrFe}g|E|B4qnU31Rg4+vc4Q~oRQW;j2vhto8C zusr7X*%NPubGq$)kpDsV`BnU(H+}g5?Bj3V4CgtUI7Psr zTYW$JBMtlur|Qr7dW*nkd@S~ir154rZ~4Tb(vSA;rUfH+&HBun;T&QBkF&kF6|}G5 z&QE%b6c_IR0ukTaUNp(bo8cU2e$TVKwq?X$sc^C9XfXjzM&QGmbZLce-VE2|*7rQS zLmqAc)3e?+cr%>m4AW!+M)kIBjfZSq_22&p@p;2>;uDS2C$m6&7B8pINBYHQWR3WI z@q!C3_&{A5bEM`XaOAF*nSF@Q#(_y;`P$<2{P9s%l{Jrxc(qfJx&uQ@2C@&yMo z*ITwV9`aXD(*VH^_WS0@)?lu>s9X|kPODw}UpuNI3sXD=(Rh=uoU6fsf2X0t-_9fO znHmic?4Sc~cUnI26h!Ci;@-Ceo7<{uf0ho8Qx644^}AD4JCkqWSJf>L=#WF7VD4~+ z)uzey{efn;s>*+M8km|H%u|pun!L--#DcA|IkMb6Y zK9TO8v%N6?>HJqJ{4$sVa9J4we)1H7KyHRR(38fBQP2~4SeKI?`9v=-0X>3X8Is*hP%*P_QOrjUK3Dmf6t$Sw;3+%vfE#+CT0fI zQ3>3YbC-EJ`H-;lW;mVwN+EqUxUg%uo4>1w6xn3eMjg zl$+s>@yPAZ)8=h~!h^CI?x#M{zF-OVL@oD=!ZU{lLIbD$r1ShlOPLisdirt@_;3H4 z{a}01TbMV)=}?pcu^H}T<@);JsnGmO?)^}$hG+=F&2Wco@|E~&sGZt3(c-q(z~}j` z@puYSZjtui40qHEJmN36xBs5neKXvD`jGv2Gm_p9+I=(J96t{JnE!PCYxm7?SNf6v z%INb`sdP#kPeD%gX9M$QxN^I+^JcgM?`82m>wo&%S`ZoAEJhi>ux=#Q^uDDz+2ZHD{Da^3i;6%hD%TWR2;i5OqC2YaH<(j0kw3WfaSPXA?(s@OoW zEj3kdpng6|QhaaS3}iFnUp>`A8rVlI)ZV1HxXaG}zW43j)IP1+s6#|WHZPps9S`hX2Q1oXJAeOP>9`(M}3LiS=F&m%w|GJw}4 z6~AJSt1P7c5gVbsZfzfy@7|SjuiMQM(1#4*F-b07IXCWcRc9)myT(lDIQnjh1s!TD z>cJ246vWY%Y{|@BymD?qO9I41JB+|*Y)LgMiGRaW5Qp2c6|;A5Gu*K+`*fV;Q?go- zo2=7Z_>~nIW-IPLS*MOuv_Ar_ZH7Daan``?&rVir=;CI$)2-6R@q>WCm@TbpCGiz3 z0E56#*6QfuX1Fx*?ezIIc7dOLQ#8VK<&C~t~iU|u! z)K=6ZpJxfE@e_AN4G9-F!=0m*$={4X83ETe!yR}RPeIDC^OHot#m#W%>^q$>Zw!B$3bcH(}-%X)Izenr5&&2ZPV0Q4&pct@9uo8jKYo8i1`XWy3W z;%2ySvK7R)Y~USX#S`s}>a3(aoHxUH*UY{x*~QIpy}kv33G)yE*EYi)@MoTac-YQ9 zExPF5&2VuZ0s52)ydQ8;d4(F#JdbRkWH4w;e zdPV&lWHV-eYe3>NDvS7lB>At;XlnvFOKmchh2#g^#zVkaTTHT>V!Bylw|WE@{qVu4 z-8=$pb%tp&{l%mO`DH)qe;XJuSRK8|?basQxj6e3%=^u@9mcc?L%3Xxy~o;@X%=#L z)5|W`kBjp+0-v?OJWYuDGv^F22F31g$eB7Ffx^?TY64T$pGBIPM8}>VfWTSx^G*|D z?te3zUx@9v7s}3;zw>}5a8>!V{=P4^W{3j2)jqnHkxwz{!R=CG@+;{QdFX$|1 zuK%!Yma>$=mCS!;{Db`~|B!39a0xd3K(OKF+E*fQnkDIFH}Zk^viPfPfgu0RUuT!2 ztffCY$Y68bs}Ly0tnrV{*oSR*&henCZXDoy1Pb4^$xs%Pe}!!?zUK)S2`s+k+NNK@ zsBhuJhg@vk7AWd`i}K56bUy!C@B}LX*)1N~lzO4Lh``hFwYst^>Jt9n?s|cK6jel&$K6DG)UR-TnpBGm6xlM+$nEW4ojt7(H zE&`Kpwa7sBqQCA%p7y!h!2T|+c!52BvYPsPtbP5>5bjb}-0{~|ImlN0E@nS>8`$rq zt+K^VmJ_dIzZbuAgq!r`??1>g3)xA)_a3>~x-C%FDR#KYa@vFL_fGurw8ww!Sh(CW z3)xCA;y(zOA`cNLyxSH#Sxx-v=XmzvVQc%Y=;F7na*)0FUt=BUJ09?mpyG?Kv&T;s zQy<4}e;&5B4~w3#$Uruu|C+V051GI-k_wNzchdrK?(wXBJ!@-U7QD=+JhPVkfZM&Z zz4#LTfD@Jfle=zzX9XN@uD%(8V#=EQvKjl(CwTN{Zh&C_D*V_cLs?AzS%1LIV^Dvz zL&@cv7LMM-E$@?-_XipOY*BvMjDE3C*v}_q_=5+$qoT0=aGMNeEqR37-Mhy2W68bN z_{VPSYuWbVM=tP+ru^Lp+T|!q=|AjMMY&vmBCyaB``C?q@WU+r{K*I2P?i6!U5>Jr z{*&HRlS}m}0#om>#y>V=AMrfTK77gvo{&}ihE0aDnEac}ex9_mPYZSXriHgo`4k8y z%Nqn%Ta;fmqyLU4AKtXHKTFMTa@Xx|o*!Z05rKEDve>3PvzGjTJ6QaA*Vg_kIe&vS z{;?ao&wmhrB9?z%HA^vWm!mAD|Eq26_UBbo`?1`@_bsuH?a2S^M-Z4MuMjA{bhK@j zvXa3Y_jpxPF4va`eA){4*pK^T*1o=E1CNL*JoPI3JY^w=D39|!YH6Pqdxiz(X+qTX zY8e>^&Hl~W79XaZAN$YR3P z+HqliM_}@87MRC=)FXHLUB398KEE@RHTsHQvCmUha=4J2*IEO$ckJShS6ks8+i}C} z_SfDFWwmx^+h!?C8C>S`$%j?=+CILs>MH->!Is#^Zse2NzP-4DmJm4AE=O5Pf8afA zdbZR&Z5}y)ttIxc9l5{F@#N}RL!dC%HcMH_;IL)JNk2_bRQK`{Hn`L;$U$H+}1Kfz(OmDY6sc1 zxbsK{8N%(X6Rgx67!za`GRXWNVF8g9GiInRs-u>)!=h&@H4%kFv3v)_LEwSWVDA6szTOp%aJP^*`TfdY7JeE-pXV-TxK!Gwwd(ov8(zBp zB+PB93Qu&n#1ZZm^NL5ff!*e%hRXYxyL{nVX^R^|!=*%Qdr?5=Z{6QDj&Ql4%Y8ou zaf#XeTukvjE^~!@#l3CPx4`Gw_9EM+@Kg8r!S#~9;#>Y>+ly+NeQ$Q1E8Hvau%~>g zf!Xa(lMG*Qj~hHFX@yozpMA62pKOrAvxj@Y748+e{|#(|@mbe1laqCi7d$EH-G1ah zcKcIIn7{8JPq@OxLjRqYxy%yBSHDhnkrTWr>WJrjHw9tSv+4tdKX}6vu9mvWR~?>- zF(8otTUR;3o5Bv*;Iknh&wUjO7XQr~j&Qlu<9#*)Ec$LhU=T?zJ{Dhit;?L?QE@-= zRfGGiH@L`fl|_wt#1C#4`?}peYIAn`Q*4-j>=kY^f>-5@SN1&q?E?f{K9tle=0mv$ zKj@n&NS=3`OV-cd(zb4Y)ttV-2i=`XFd}qxw^2KX&fyEueIWQG3G>^T(Wa~0*F2sA z;~qTUFo36o6n;Hj6SZ~tVcR@ze~|Lp|>vfq_tzv4@8aJqf{p8xAT*bL_d%h%L? zo(G=qclL0ezBR5l0=xYw$O})l=S>TinD&r|cnacr7gPm)+)_)mY2<}2qtB*i1$h3p z0ByOPq4WHnjnFQ4K~>xdGc-zoULCj3P561sr9!*#^8oSKj8*-doBUVe*{_6q@~tyA zN`PJ-y4k%ch`%k*F7}P$1p(r)S*p6+JpssWrxNSpj=!FzQG)dPDz^lnivq^IKGjf3 ztAfN|v(@!oE^US@@^M#^S@ZX|{Y?wA@to=XH&`$=B*hv|bczZ7!2dYhmCbOxMeyai??)(Ulw_Hm8E57); zD)>3zdrmW;)A?IhgI=YWU~a2M;HVdzWsqXQc@6IsLs=@f@OWTuTBzo-8A3)Zp~#UN zMqv32jS%2h2j1M6>!7yqP-FpQ?=3O(Ea|$IZsq}`%}HB z@MC7Q=@2;PCFdldb2e<@clm3#J0pXHv)eO;A6je zd$Zpze0J`9X7lFFk8j#^*T#(-Z{Kk1I`R4KCE|0D_6xjKH>oxF3=#DG{Sx~RN$^tw`-s5)xYtYY>z~KHx#h$kyXQ5+KE6%!Gv{VD zv&ymtBCva&Z#k(k!rtiM%%%bUnl%Z#=QY;OzD>1u)+YB+1a{B!Egv;X*dY(M&kNKEI#Lf7c-Sd3RMvas9 zg&7;&H!s;eukj}Kb;^zwSp-?;YZRHdh7tIPZ)DsIgs^*F!|m()gx9x#4TjzGe9uM= z6X@14A2W!z*Okl$ZxO2?MY%*@9_y62*-8f+jAmH<3 zJ__3pYXK0M#D)<#;LrY^g7h|AGfvnN2)J;}$4u&V=6CtK4{Qk#naIWwaQv8$nOSV+ zw+kAt7pH6u1YYyJZ+-FezikZ&nMykd`1hEPsdw0^7pH9v1blnvb@5+Y13;$I9s)i+ z=A*dlHTLSosaphrpZn7jHP<5WF_|_IaPpXsndi4Nyv=Vq#AdZPd8;7M%ws-gU@2>_ z7Pks|Os8E0e7G4de}mmhar)Llz<-b7&<5I=1*o0~elpRV!h~v^D{Ok6N>iI2-$nCRB*CXe|W% zvl%Y`mjhZ0I;OS>2>56-+=)%74rkG72z=8gj(~;#Z8hYW-ew?h_%r^Pf=s@x8MWa& zS`L9eXD1bP=3e|t%K^s(Hw6J-Y=$fD`0J)rhBIkB1bnd>?(EjXjVW#t0^j$13X*@| z;3n0DvuQm9oWAqAjv?Twt%n*@+%yEd-VB$&wrN%2j9L%@XYah8UHld1wjgLsa`O=I zb~9Y@Kblt)&Z#94@NzR;@x|A-BxX!>^APZKGu)cy)q`_tQ3Sl(3|H9v$`-|p$!;D3 z9&U#FX!B~pIkhYTr_4T0btFdq*7`5dZdq`d@YxaYXfs^#J+qU>F#>>qH=E%K{~Z8m zxr+55@I^=T>nxe>dviUcahw1k;K^pV&j$clu3~)%xW5^$@a*CBk;butfPnj(;Z_C# zR<2{62>k8TETgq1zs}#oH!alJG{K1G_GY+~g8?hovQ7lt-3(XwL!D%Cw4fm1>Snn7 z-v$L%u4kPHxVagw_^mpL;%LD^z`f0I#TQ;199X%g^&;TjX1LLMN#b|`Lcp!faQVkx z5g=5#s&ylfYqF7Vy6iq&H$@yVNC+Hsw;PvJ=Wh%Wrd(GG2)MEtu9&bu5l0Oa0{`Ru ziEM?71BED8)(Qg0>~Z=)nBv|ySs{qy1`C1nr<*f0E&MaV0+efO2?3`!!|_cEmYO4Y zkxy%ypsStHS;2#pYitDpM>oUqO$%0YjnDd>R}X&yI`_=0l8RE8)YG!fBta9_Z0DOLj1c#{JT{Ady@F~ zH1V&DkMMXb9zG+IjHpnp;7n&amX1^94CO{M-JJ^WJY|-0Gl|YrB4#RAR#;Ybfu6i}k?}~fGnzJ6b%~y)W>w?SSZ4y=#MtDrNQwG< z)HNPnjDMry4~cp&P_?HP(2$_F6elL)L`93mR9h|838+nUB9iEgWXw3tLUaN-B~slc zq9scZxv}sE#lJE{XQ4zSu6Rhk0E?n#vX-b5$k3}$yI~{Iaxck%g;S{{I-2Yyv-Jk# zNc^s65sjxh)9H*U4|JBOl0!-|^~j&Ad-~2%GAbI*^=pBnkW$$p`KxDWAlp0IGuS78 z4o?h?4-RF|)n2b2ofFN3vwgXdm4hVTvZJbm!I8e9iIv%vGTGpW{2pJGrA7-u5Ov4P zl|~ySqv*a6O(YqXESPIo+<%MG0~D1>B8boeDbWy)gVrK@{J$Ao;1h3DsnS5J)h z5Cv2a^`!2YO0U&E8U|^o=A3A_e|$}kB%ET$!u_K?!`U^t(Q`T>U83m!s!%D&V_^YT zEG#RV8<0uI#za*BK0356dSmss_Lp^{N#8icx zorO$A0Md;2jE)N+@m2td?^q;~ez$x-0@?{?gf2R5L2OAvg|AsP*tbfC=SBwy2Bq%N z_@&!Katz`j2H8pI4-T&$$`U;?*KSFBCTwc@M0faHw6(+=KV&^KsNgU)2|`xphI=Hn z8C0?l4U`)bEFxdmW*nK5qS2r`fGX5(B%P2X_N*jsJ2yLbY2PZeCBZMUo+2$e34IeI zi-$GYp&^YAA|_Ci-RaI`Oi_H!NNx?WW&#im=W<9cnk*ge8Bpvrpm8sv3}?qzHS&qYg8wQ)}YdWG3F(4GAw; zV7O;|bg(ZwM%^Kj37@Jc7nP<$hkC{Yb7sP8v&d60Tqe9`aD0{4;(Am_hVkrqDz-+6 z{&wN=x$lofVo>G8G7EF_a|>l{D|$gj^#6rGfW*zfT1|*#j9i>dLwIA5A*!%=bWmgA zSUNnPo=1^2o&^zT{)OlDq3yCGeOZzaREKy>;fl8;8qxAnI^wrrBub9TU??e?55M|z zDpx7*21f>DAtTu}^Z+Is8bI$GUo~8o7D*G)$&?s~38DqtQj_&hpzM)8IbsB>XGyA3 zxF`-iT_FhRkR6{`O)nv1i0LU-&+64fgMB(brNWXLyqUKMTB|H&D&;m}P$SAHR79Qo{B2?x-G^kS;LlnXDc)2p$Go;5Lj(Osj-@PY}- z55Yoo&^HMy5pQr{WKclgBh(GvjZ6&pik^XI(KGPfx2k7kK(HKsNJQ|U=K@xjI6$Pz zd<6oCGS-(9BACirqkuOtJ7ygz#W@hPgZlVDQW{bCl18J9BU+g>mC{Elkub@0dJAq& zELnQeY4etLYJg#KAysh{Be`Te9ZFyV5RI#WML7XwkO;4mIVHlqSz@wSGKoeU14yEK zBZ8zWp(*8aL9t9J*>p(#QWzz|*`BerbH{UY!BH~1)#%3(EPaSHSL;<#lk`f^s9u{J z$zc@ww3Mg1yibJ<@>G-Tx->{(PxPwpJAeVwm>5XaWK7HuJ0o#5ejrt^#$qHGXf&peujnU+Q=*e0yst-~9s~X| zBK1W1Bv~p(^*wt+2tpaI`W13f{1^>?aCGfZ?p&GmSZ+wEZ27zA+@8T99dV60FdI#U z5{XP_BBO}z>7}-e$D#sp`i3qeIf5sh`cBL^p(7Sgpxe<4ohd~+609+4ji0;CJQ7cIcEeU7q!#KgIg6A6i9HDrAe3Y9 zXjmVoQ>~!?`g@?$6)t0A6S9+0O?yZ`qdjy;r9hE^VlZ%?N~X1(B(+k1APa3=t@tEk z8WJU9(av~A4KgIrDx)z?S)0Ai?@+j3wxUTI&u& z?SUlJtUHVf$yfc^o^f!DQcM(C%2`xYa6i7wj6jmpG^9iHYOLp^Q(;nAME0r)RVNH$ zb8ATdXw@)Hu;Sf`&R9lGDy3LUVl1;dJ36T59>`4VTo8kULQVH87SrldO^Pa94oo0F z6|zY|HOAV&e3&RrYP}wB^Z_?jK#B{+vxp@uNw63hW>oP^q%#d!F4%q*q=yvu29t;; z?c=F*XEdWU%reo)Fd*ptG=?dB7M(D+mdM5%*a0!mnu`&d#(#(*Re+2zp6y#TGWf{} z!8k}D#1i71oEwGNi`ox?n2g1#IZ`PNK@n4m9h&N2*)+}JD8|7fgFok+}Y z$XY0WLlz01QnC>M(&&g{4h>>*4(dfSV0bYhrhJrz3R$##(UPTtSEAwNi%wob^Xhr? zKd3^MPJjVUTdsbQTqfo*04pSAoQ#BuV3mU6b-+CN$quchqL}ukFhQfpF?9RB;f@t& zMnWr5b(-(TA<5PV7=}Zzfx*fV2@Qpoc6_*_hIP_FKr{h!Ya%VO)o54%VE~fjG+dRF z+;|L{k(z@ZNSV+#xO*sv!4y!VpVV}54B2}p28UM4;V43losDAE;P6g}eN1|YowTl1 zZcnNS(sd@u{7chkBX=julWA=$$DkSE6$$?y^(I$(6@ zQT=EUnP8wuWYh&c<0=v9`=v`3Ef8v2WJ9E^92^*y+Qa~=Y*iTOy2%<$REusaQKE?w zgw!;^ofOttzPL$FQt@TGQ4OBOp6ppXnSMi;hqspt5mCykw7X$ zk{u`+qne3HChRKhG2uvSO(pl~Tu)!62f6N4~JLL^jFHIYe$N%RBuz`Z zc&*~vbf&xYaBm2|$^iq70flxl>S4jOLdB0Odovh!sapH1C^nYCf8pqKDt;zqsHAj4 z*M+JHtC}a?oov14siOzfAEg3xj2zHc;uiY~tS+jroU#O-9wd#js?${DpTQDGu;tKf zlD@8fBt#SX(Q;+ki(vUuSy@a?M+0TdG0=@ND!g)FGgCLxCYo@IQO&zZTeC$A501cX zp`v-avD_1w=2e}n0s`5Cx=qN;J|==MObv*!?rF*g&6&tV1BdVoKx0+ii2w9JE0usL zYz>?>e}atgC!h>XR=-#*2Gd?FM3(&+tmJmAelg6V;rb-ZcM;3Sp+(pcL_!9&hgtHog) zh6fbom7oQNX9V8bhqW@a_!iIG#3XvFX)u zd1#rb0kc@3Fy#d8kx2&Jgb~-q@YBlR3PW46vs-~XZ{oZ`ICPDQ1y$@v5X1PY*>DDa zRqe>dHHGc0U}B&~`$#GVA#k(;rdSMDARdqPzi1@9a$?qSe7ut12^KXnmU4EhaEk7>*5oDvJfyiiX1Grpn2wp9UJ7v63bvll1SK_LnPtX7LAF#lE_QUA=ZqVH^o8E zVWqZ(8m)rk

jKw#F2%yAuk%TDsD7p^Cdr!!C0J#mT<|juUBYQ^N|oy-6NCkFhTb zUdqT*F-?sIif3BBSJi5@#B8RNYRe?{2BrX*X{lXINuVC*!M#gt6o9Evy5{3So32-^ zr6`A1VK|oFYUI0u_?pYK!OyXR^h^xiH;L&M320DnTz?Q_dJwm8bX06IKoRf9ijMGT zugEx-iN}$%X052So9a0$=Y@H5=B8t@@M&<)9D!eSMP~76CWUoA57 zHhhgp9|eup`MGo9;VJzTBY3SjGia_gNU#!q#FeFEqZT|a6WZ8(w$e|}!XuKlj8qK} zQH@A<7@Ja!)zh3Z&@Zd^@scyL=C!j7TbDvzi+j&rIzHUd^&xndMBrvJI65{S%0v_T zKIJsjX4NiVa==T5;@I*Rg6AVVQ?NrIii%*PGqxs2F;0snLNV;_f{`W$p9r{}$GY(t z4aMV`j#vyy(Xn9+!d6!7o=IS5FLFpi9LJF{Hax?zI~7U6122?<%?PemDddUr(5NAJ zy`@u`4)|qdqR|juXRzfnL6pQpn8I4aMO0(}DWp0d+%#@j#S=U{szUpf&=cQ9u_<5eaA(G$&r6VPYvDNqdnY zpeY1JWY8GV1R{4QqaE;~L~DXxI4efPwr)6TM$uw`5D$bk^2WwCR6dEQpavm$MSH)a zXu5ckxC-QB-7+46J7%gojlJ~Xku(v7#*Ak~4CK;{7||pcrkiRBToVyuJ8)7WLG+@f z;n;+-k#`~uLoWf9$WV0=4?EL=1Sm?PM2JA9;wDl-@ZOf>aFYf*^E?a4t0)w*|g9bGt=M)o9daxLYk9Oi2RdQhJ;&EsO(jZ+|l9cAXUQxY^dj6Mnm}U zgf#aZ%5>URGLoE7^+$i!Gfjlx))E@ky;&%;X&cIzSyE*NQJ`m*45{UR(N^TQ5n4T} z+%=Ff#QHQC zT$4b?5VUoWs4<1`@fQLH3shRh+Aw#_obj}+QEpglk5d#wOY1NuwT#O|*3~2_l^2Ey zdR{3lFS$;D3PW?$QQ@?fm!VD4T3-F5*(@~*#vOHJmC>>?G)hLxO4@#r7sf1g}uXKHUZiAB-=o@>%bvY<#v2XnEQyvnVP|zrN+}V#4_Zm zvGwsGX$C{4H1?Xl=H^^A{-$A?Ay^JPjG|2*@hsF6SwX-@)(qMDrE(RF%u zEH^QVsi+vli=ai>m4iJe<<1MOAOVr=rekC<YBf_YeDv0O#M$k<)l#8sYpMOl_g%BWU91w|sI7Ep zWMXLOOhunQdLe+SQqjKNG+ZPin6MdAX-#7#O%!&>8R(;uk~nK8f@p@4Xg*a=but<) zMEyh_rA4xfnwt(0!yHNdz~n>>pH3$h==#`V(ep&AQ-^7SCK^k;TQZvKTbdmYtq653 zS#WZwYZ=a>0H(uWkoh4UAdS(d=O8hRGIJ2-dV(daagc0COc={mrY6CRP}GeY64qhN z$!j%aZJ-R;5F9nDtW{MX;LT7~YD9BYF==hQs+u6uI7yIzHl2xQwH{S7jo?@~QAIGD zHS&?5QWFGaKBDQk;uaHA&5o6kirRujjAbjZQj($}wlFdxv4t2(E3Bqv3)l_H%w(u{ zxy#I2ReiiOJzI$Jj=8FEVrzgcy5^0H~wrncc5?C-O0Eie+yPbxRm;2 z*^uEv{32X*L43>JLskv(9!3rMt@0DYYUB@#h74EvLDI|LDnA&)LK zPDj^CxzUx`QK6|KXLh~6>(s9KD=4c7G}YxR8d6C*c^A{yFwzca)Qp- zG)NiAGBu!4YBq_i6b@YwcIY_Hc7ZuI9mhIvv~~*`>5}s<1y{A!X|(U@a3yfW0}d*K zZ~-)eu_92WL?(_8ot-RWN5sNIv*ea)zy$hXf>uj#2ue3CuHlqBEREDA zOEsX8rF1Ktef6hxL9F6HqGCx0=SYxsC6P=6xM@f#H=t$*RSnpD37acEA8!97RdJEQArNxSCxkX#?yy%!XbwKMXss`N=45-AX=84xBZJUlfsBuOM z+Mdp;H66F0`5H(sOgQXd%@Ic}V@X`>r81lojH5BdsW`&ZXCV&E)eZrc&!-#C**#59 zZ#Z*-Od7%}Br;g6M=2M9aR>E9@%|$sJ3Z@kSO& zc}dh%=6ETH4Kp9gERE;X*E&zI^4xBCQ-Y8>Pwyr{MI9biL5v+~MoE@idDM|S&M6+z zkDpfO7l{!4BsKb_&Tgb*9qFeyC+d{ZK{{wD5*5cmVhz4ByNV$cqr7qEV>{^w%gy=vSpi;2{Oi z7+l-Xt&VZSsk(B%PEFD@cEq`637WhcQ_ibJsj)ar_r>|=rd0CGGjS9q;Xd}s33X7U zXjtuxRPC%7>C~s4n0cOxBaVF3n$vKOE>62MoTH1}SK>rx97{~+=%SS+>yLG=?p!IE zp9qkLTI%NrqD@r~L<`Zeu}O@+G3gbDjgiiUt7Ofy;pB^oBh%$sbCg0jz2IO<{a98U zhX&kniZms}xo^GWIR8xWFk<)89u$1zptW9j1qc^W{1kqcRfqDy^{G=kO1H*gjos)9 zFt(AiC>{mBU zah$d}2hr%PRdJANg;W*C%_T{uVW~hsDo))S5V8rw)38nrp4G(xAQL}iZ^pw%=A@J1 zxx@(YY5nLNs21&qBoa}2WRmi+^avC6F29o}#m*&QWMomWd?cy&!MP$pu?f;mE7&xC zNu*(YfQ`~ry9$|y&Y|le*u80HVv0VkMAQqR`3wY$DOF7KSyh8=Ln%oZ-^jdcihpM9 zQvj1B$FZueodO6Jj6h5X>d+0)k;&kB#p!|$Q5MD zGEq!g9ZxMD)SUn_m@WoDzmsD?R+3rMIPz6H?DxDuh$7-f1P+c60iw?$ zt~e7Cp|TGkKma5T`9}AXLJ6<+28d;FTDibb!-w*u5(TMBz{$Qymnp!RQ_yK_3eZ8) zS>8~fUFD%2=_}s#42_9HN^ydl-rdCuqXI^OT_@AZr9maeFowiFW=)-aLRTYc+&chW ziF70J3OLbbD z+T1X21X$pxJLB2B^iyj$9MUW!2+f8!<)Mi1%twgv#s(>#5NJM6K@=f`6kbUwtIJq~ z2rZ?~Y?epn)#5sM#bN@ePAJ9!>=^ds#H9>0`zB7$O^kz9Fb$oEI@kw4S5h?iJuxPg zOa@0`j;OG~5%gRXEU)%JB*BOHmVAhZfh;ch7#ABR=`{_djIY7-;<6FJb_S_Lvsnl+ zvR~n>0Lgpmd?-33m}EP43(Dc9c$5XA4l4)Im2oboI74|{^(btH!3I1koxVx$RU(1a0~K&mVD zJOhViRKybZc&Skg&KsZ!30(SdCa-qHxh&Ff!3puVsrP7{D3LEq0vcl@ZbcnreyR!k zvMbdg*QQ_$%;e~X6uW#gZ5P$m9dv38Zbl~RD>^Uamv9B6@oj=Gw}Ro-6u&N|N=`eb zR23(1kbu{VA*~w0INFrpOfxIcK@S3WOcbKp-7iw;Q)>@N7VcR|eGLI>tTWvdMnVhk z8KIykL0Lfw-cqv|y}8N{{jl<6mpl|`o*O_X^QJJaC8kQ7YXjg@3E zsj11N`dn9o3d?X<1Q7iOy_jyxQaA9Rk6^=q;Xvg?r20T*icf4y-vS4UG+*3wBYQ5r zQ2kNF1sBRF!>b|W=-7XwdZY%V%T3}LoF)sayCCbMbeU9kaA1`>eI6T}d&c`#>3g_v z!mnu99300g=c6;ULNsRX!Lv7mw&SYY43dv@4wJ_h_f`_IGK*=(kj8VfbiRX)tP1mX%{e zdM9^s=7wv~jJ-4%|KchpNikhPG%62=$3=6h(~Db}Qn+5qP(1brg-0|a2%;K>uQ;tf zF36!cl7A4O4{x+aqPJ>T3bsKENx3*6Tq9IC!YV@pD8(2!P3IPiyTsJ!m((3jYnPyj zyW=pgT~qE-cvl|B;)gbopxLl-e5&%P80I2@&PbF(RtKRNw-1S(dexkZktv3ef=Dr5 zgDHg=foA4pchIi0Bhj2ml&=^;G>m<4IoH^G(2_8g5fdPaX@)^R<<%y55T+`8tAR5z zqfr7aC zKzTtT;XWO~Dr6+mh!fKg+maBM*Ova?~#)q4N^OIsV#^6tBcM1>cod zYm_fQfU>127vl8v(zs1rriWiE)p7aAUK#^-YkDN1CqYGnl0;{wVT{)b`u^ZA72fmaS;?aFPa*PTVC8}|; zBFL3zy2dMSA5d0hb>u7T_zF&GhcwY_R(kX8Vd% z*r?i^9U6fErHj>Y^e{>@f-%#1(<^-W!~LF8VHZFIU_Xg#c~z zMK3jT3i=@3CwLA9QCW-+U?Df;U>ZLmkzveKlO1r27&$XZcBnM@L8r^T6DS1SCCNmf z&cz0qj^K)M4MHFr02QUivu@#}U;5Rjl(BBH)3ualaTbae+e*l@N#aPt3tG#hPEzF& z4&IapQ?Rq^l8S~?LQ=^ab|?$Y=B3|zgfLk(Bs2>elm{US3ru-zH40m1HKgS6fF)Qs z?x-QlG6-2T5qkWp9QKjWv+D2&)B8EXq$ES2l4J(Px1nQ2<~)a<(N z)T5NWAK-;0oYA%X;#kW8+3*AS5dMwA8$hGNkgYhqMqeK-mt4-4?q$<`a~6u6PS%Ol zE_A1GtsLoEv9MNY*q}m(3#hf$T3#bqZ4;jPq7u?KMe`A%5=5>#M^xIZX>dj^x-@K* zZHc?d$v|%GlCUwD?nWh}Ei`JyozXOe8^M)?7}d_ngmI*a!R%&G(#kji?T4d3jH<4vd6Yki$0Z`fn62H6?XZ;{a3CA%$frI4jFKlvmOrsPs!DL9CLp zV%$@{l63XN=$Lj*=|B#1BSnt7zYP6Ng}|IG?9n)LMP(toAc_CAbE3GcTLllp`Z9#Y z9C--GDg_SQFuoXMR=A=&lx2R5ul_Y;>+a>+&zrjBPp^W63jd_ z46HJ$x`sGE)d5P>PNy>SmW_i%no4- zrSU)U27<&`f*wRO()3Ne5HKKI%62^HY61ol*?aU62PPOs?!X=scx4FYsOVtShOjM4 zbp*Sl7Q!T zDIm{ynJpYDw8@7y(GzwaNi`7(qmQ|T z8v+m7YNEC>pjryo35XUG!89Tii^PaOfB6DvQo}+H^#Fv+DiHiyS?9twgJxEeT%1Or z%S7BeERKj1b&&&h)tMl|WG^FOC6*fuLu!PHA@zB4RpvtE3EvL=0&*qNjHK!eQ?z+O9U1FGZ5dNgpg2UEwF&W;#8i*AAqzUSSqQd6Rohr8kZi1I zSGoF60m8_EZ_$@=xR_e~Cq06dVqtQ_gRqoS&&9xjZhVf!kO|$ZE|z#HYWBQrpS(4f zGSPDF8=An4;biYX6tt_TfKjgCI!o-|QsWbFr#4iFhciYkrh{M2$VZfH2M^Ma8G>i1 zXDv!1BE<*;(?c->K?J3;Wwgp+4&sSa5FfaN)iBCILZhHS3Cc`@b2dbQg6B0pH&qIo z&~WRsY!X2h^%i(9NdXsE0uJAp;?l%xTwIo(#eK5|OB`O~qFtf3kyO?WxzPGO425I3 zHc;d#dJ96OFh)#W7$eXyD1xhu9%XoNwjW22bcv8vD@?8uV(nxQKURRDxh> zf5(HYI+;l&vl)B7Xg|1-3qJr+KyB7S>K=7lIE@>Pyn}?W9{eFyxeO6P z)tHfnGr}Z?*6I(mwFo#%RsxVYQ5=omhh(-ORM_9(@g+xr!oDYOz($xnaz~J)`ZUst zBlZ!7N8wTe3aVR#vPT3>Wy{i}rZU=Xt5zK)Lt*=o?y_dG1i=GJH}aA@l(y!ACqq%< zg}N&nh83~EkR2rri)XFMc$Dix^cqV5B)cd~7$fjNM=gmE(S{UYaGJtT0;Ec+(gr0u zG*9XT=|G8GAj0HG01pCFrJD?=gU+__U(NF}UmBRems|c=Dz}FbU6`qo_BUQ@3YTJ{ z#C#b5bS#ZwbVE(qQI@t}LKP&i!8ZlhXi+8A!7xS8uicePOf+kdW6Xh`5uC>?#=men z5`6xSwcp+N?0s7VO7_!J$vRlb{iYAgwx*2QM@PAWd z2s%ZD)RUOqK#=sQvqLczB=Qg!390o>8yq#0vwaPglvIv zRaUj!eGp|p%?}|KMc+hF9Tkr0*Td=+7Vz*yMd-91>xKq3()&4_5^C>i!BL)m9= zTCN!R!Fq#WWH04{#-;kup3IvjrwpAd^iDv6nerfBG>inQv>|vy_FHWvAO;p<=xK?K zqt#niL=EG(PmV?<+RzCE$qs86g6NCJl3;W>Rb$hT!sOGTi?gy17f=)W3bcwtr^T<~EKElugJU!ZOzHc55KWj)@GSwsLm4;x z5H&-5y4f9~GfuXC1cUo=ySsFcqFACUV|T`^QXG-1eCDRDrNOmCRuX*Qms`CSezB`) z&;X7B18ZFh>{d2yE~@PaVcK^PoX&3ev6L7&HiQ^njTcNK8i^sr|``BzE^UeSdPL zCKhWT^QmeTYamhBh_PU%mID^6RSGzkNjra~c|Qi%W^oLTSR5!XXO!0}pp3-1IU<5w zH&`lGCYFhRPZ$5naJlVPt}w{AGMuQOl?;tq<5~%vP-vr;qSx#uSl>S77}k^MhWYZz z>89g=YZN*ce%xpz@H3XEVJTQylTWv zVjvo`(#Z83{4bwA*nw^Sa6OHQ&3Q?UkX7U3tH+M->RLSpt5j7&+tHE^%!PYV_l{qLvTJ71{~V-m&6tnQ9+}c1)=D?*G0SCRJg5 zJl{Vtiuwu7MV-o|IcoTRD4j|emOGe zZB&SC0nF3S#r#v-p9PTNT{(i|mk4i|_~e%+R^%u*89r(00{H@#0y?^1j9U>~)De!3 ztFwL5K!U7=f=w#10drg(Vgs?vh_47&P56}W8_u8a#Oj-vWWeJ`m{`f4g|oL%&o~BL z(y&Njas@$HyC4$jdmQwUwh>|arS#%W`BHlN3DY$#AJJp^2xyW0aE}VtEN%)CRGUgy zSW?0s(PVJ1&`sT92_6TO!_8UEwQHISFpL!P9djFagNb1i(8n)Q16Vo{3n8#h8yZ7I zl~!%6*yLzsnlxQ`b_DOqC8trdAxO`Ce3exE$QfHhhN$I`t+ed}$ewdx`y#f}REMM= zPWjjrDVqR%4xd=+sXcu#*J`&epmUH$MX>aT&SH$D-E#q6!)!uu2|9Xi^cI025-Ay7GYxBVcDxowF!`bz`^&LNC!XFDj9l8p5rD;6w*S9dtB3!Btt_#Y_-_k1ZNE#OM&HD z5GkV0hu{)}3+xo4jCDy{soD&iPq1h#6Ic87ufS$^?7r!teZ8{E3*I?zxOcQihzwl8 zJa7Ko`5!u6`?YKiqXsuxAQ}STI4W;Al^6-D>#=SZox^Lvf5Y zBw8{!rl`_KP!vZg+l2yTOB^X3S z9&suuGx6V|$ zA%bf@s&{Z{!bDwl<*oHqB3{*7lho9EvFl9LRZpS25v%=9Fv&pG(P$73cEU7e4#9x} z*j0%4SXZW#w!qvPjo1LE?HPO@WcVO9H=DQ`-SK=GfN>pC(b>va3Q&a@L*%Ii3l^LV zr^yPJIc4YG(T@$DE1$D-SK|r?==JfjCX^;~ zk~wRI!CxO|nc&>T^to|6MJU11Gm3?{bF)Cae-O(MRn@Xngz6q^(OM^-PyNo!cy-~A z*-LeYtIP*Zci7$qBMf{dWWP0qP`@QLMAAg|*!L|O9P2Z&ZC%7b+LR|Ab1|)%yBZeO z2DqwLrIZvgHGwPApaJ?dDWI50N&$^>932-4pMU<6rSq4`DcYx1Kl$jVX(C80MzA%3 zvnED|be6>?W0X4M{ICfn!XUaDTN?()R?(Q(*jsRPe**N(LO~NqpzdTY+QF`+iAwcd z+Y{DwIHEH2zd2G0`g=Y&VC5)5(O`ZS_e zy7W=1K4d>>VsNN@Z{o~@SDJpCZ0&ULS3)~KV93(Fm3~zzic6hY>KbTE?g82a+$s+?whqmi_Qr%~A0N zt6U%kPJ|c}kfBD}zp9)+QYl=NsvR&Q_q)zrnWgJ8XVs5Q4Vjz{qF2-X%WD&qk zH=amZaU>RBMMc#V3Fdv|4Lvw9Hi1Q4HE~sKhG5ZV_=a&u#?!ZxAW$>HXbek1 zqK0@dS^~>fLSgo#K!iZHpUx?_f2=X+k1rI$@~1UN}>igQW+1z{&H} zklUigr!5e($11~3nF`!LiIa?Rh>|g(Vec$>k&Z-AKH@}Kc4SqLxaHJL=foJSFT(L& zghN)$L~nu)EWs@)#!}~*sPbXeSP}!P_aM(i$as)3EQUwpX zRH1$HssY3~holljS54v^9NZ%+YhX0lV!c^yzQ&TVb~GIVrGBT?Xl+>^Fw$DKn8%l0 z325^z{ZjGC#gPP)aEX&y6D%ShnO<(=r4W6)tTDN9>v37Hh~A33o3%EOOGQ}cplt`b z9MxR|H9?9~rpZ<%n$0jyL3t*rir;7$IOXaa0YqK(T@QFq+p=Xnj1mnm%AQ=nX7&|p zq@bG%&_)JZlknxzT*^&w!_^?CHK@3FtlXdw9;#+JeeHy_CVGqejm>3Zkr1t0=IuR&_AxLb7FQubEyhm!nG{~b9 zdT`sVY=+q(!lF6WZEHb9oCH4-!xA|;hDslHJZX!W)H|@NXCB3dhwa30uT&-4Vth0V z6V!y*{Ee;dhUI)}b)=vs)y}&@am#zLk}@I6j)qUpuFR47TmRfyN+8_2K^Ze%^@4+?o6AGXbDV?yee$efAic85#3n)6ZQV^%eM+ z_nI@i<{_se(QMW6GH=)t9prXvT#q&}SpD6Pq;+a`*pLcfP?jW%ll&V(kFw(f9H2<9 zlN!!qMG$d_U>4odt~t8;6zS`j$~C)+X&^lg@x*NGnisItujCQLotXAXk^AZBM5zxn zD<7oNC2n!d9)u|2O& zlamZgB{B0!R!{X>0ZHXoP_2jPzt#P2y<7AZ(u>jPs)u^hYGfk0c_`>#BNE@M z`i<)%&Tw{V%K*RcM|$6$R_G%$i;QYn_LGt3+8$F^VrNH7kIl+Zy+ z7ED^RDB4acT*`Idc@`mxH0cqdoVM*`Zz`gMIREX@6?<3Ta9L>4AU}Qj^aaWK0+eUA zVszUI^63Oz1X8P+aXXD#uG3h}f>KaP0)vSWx3C(aVJ2A@2pfG9iMiAcxrBKM3F+tq zr3DmsZfBgBXC-x*=79HPq1eO%3E=ttMw-#aeIEU^%mha58|6>!Aq+JY)0P5I%00n+ zX7*nuapFZaRmWz$#788T%t4z7687AgN1sF*74Hp3!jZ=eIdA4C3lW^#p}$1i&eHYF zDqyV`rqGjbE#jw7eTkGx=$lvLx60WcudggLR~wu&+C+Y2%sy#G3YUlB+Z+<{ed;MM z+@GX`5JBxb6397dnBaD{NhL`j%`%lxA@Gq7;UVHuB6%8*03rq}t{?1YKCL4ypOh*4 zfn|tUw=zRq@^Bj66m?p4n1#90?WqeA0N~nctDvZ0of6du)Xw&l45+$|rS$A)-#vTr z$}ntj|GQ_8UwlD9l)VRk(y+;oG%Tgy$TiZD3fMV*hw!hTszK)(0Ed~unglaxzt3tZ zkqcO9Ks;uvLtz(My=It`)Rm;Oqw1Tm_n&zsU5$VtcL7kdyCT)4p?9x?Y1k9JlbrAU|q>>Px#w-zbi!e35 z|J*4HFFRE0-FQX3RD-=pmab$>J0yT#mC6$JXetl|`G7N;+1^cXCT2mD>qSuT*hORC zhQZnH_L7Ehi!O#_lwPH}yGi!Rz7zmKRd5@g$>D5@RfooU#v0ifMpkq(o5h_du`43Y zwI+?cYNM}etu*ejv9b08TYKiRKiZWNV}FxPR@tH+3Q06>2=BY8T*3&`hEZrsZascy z^hL;KYcRe4{Kac=ZeANwI(+RpC;eRRTac2k9rcW$C(CVG4)sh+sjP0~&K{G^cQ2k$ z>O_d?RxhK6enN!b(-k@-cA37nc$wdt7n1kPs2kP7b3^Pt3tcioo|mgFKx4YHI?%{g zS%iM}!g~7@&&;(9IxQglP90=ZLCob6G|Z2Tp!z9lpj3EOcqlApj=CY$SC$L6>=EiR z*G~su(+Lr0;pqVI}mju`ee#rm>CZXyf~+^|tvp(hS;Vi?K<7DR7B1Zt3~y^MxD{(E8m%3M z)th#^P0=uyI#l17i22TFdBtu+a!M02KPZ7g;HsUMV&bC22=R{um>3p!xiw)F8i7j& zaBfe#pF)8TDa{oEa0qJ2m&el~5!oC_tWffR`;mMid_)p~tFmImW(50`vrI5zQAZlH zgF>iAX3Z@Rnoqd|w zrJp=jE=rG{e#%Ah9F>=L?C1R^u8RCX!YpA$|28=>xbjlmH1(tC3=h(o?dEGiXSAV7 zn^CU^t)kuFpYvpxrv}Eu{An-og<~bZr1;K|MoQK#+g<}$EcFcvrct~RH_mL?{iFj} zocyFL?DZm5gTbVTfF~hM$i=ouT7dZoun!I(BQ^pDX7ka%y{>k9o9UKfh>DC-FH~K_ z#|rh9m%U+8V}$L*q7XTQMU8RNh@|`HoR;g(N2y-2#yH{jf>-J3Ra64K2VNCQc4AA> zFJMf**$%te6_LfcUCybnL$^}9f?4H$3cfIy@ts-i*vOn&seVl`tD30Kmuri~c=bY+ zofZi{p>o;2hvXJ?C&cr{n4$fpRNHGC?0uS5_?Hw|P5gN0>UI~1=yU16}I7iGxq{1ji``!NaNh^<%O0JwER0o@#zc=_~ z9sVz;s_f5#TcO7SHVC`Y$i2u#L&S)sehs?Ce2SS~mt!h-yt+mzPqa*5YYYZM z;#q9L3g1%DdO8bYe-Bz;kTKdJEoUU2D^za9#7U5M#;D!Z+ZiGl_RH46<~|UkY}gmaPw0r)Hm=YpT#}$9HIzV8NQzceLkd0AhA3MiEp|dtTxiXD*Ls z4T&PM)WIg*8WVmP5}PI?=1OXGyV^7-w$yx@@6{v;I`;FpU^6cvu( z7`sIvqK&1>`+CYZjz#3~OCK^yQRKYlMo1(94HL1Guoe+JV+#h_g4IxnI}<@<3TE2X zGLEzHL-sygpj$(L&cPw$5~<=%;T_O>ywD&I`k*)kttbq=b5M>}7sh#v!qr$yeJ-bB z9Av3B%3C!aM@~4_b62YPV3obB<_t$>AS~}nI)8Sn5H}*@cCr(5ZzkD3(Fu`bn+)ji z0o+cNOFukgoY@7qw0hRD#iYezgl{~2cYF5K)~Q)w+w`lC-+pRAx%Miz7cQohRLr6; zyLzOTjNRN1%SdH*1`wS!#+@;sc-fBn28xX?r<9o5`WW=8r&^)`TQ`3M=k|nRlhy4; zC(SZvF`}7HMjsuF@-uWYcjp0d<>Uyv4Wv@MSWnniT41`FS-&KCA@Ey=stUx@>(h^y zTgufxI{t9A#oIxFMYJjnSd4v_h>+@SX3-%!*L{kjY^jE|wztH-0n-XE@kMCSGDcU` z(%1NnB*9ozF}bmUaiW^Ja8$(IsFfuF<7N>sO`*vSiX+Z6Of!nyK5uWUrg*AVmV*Lu zl*N}u4c!Y*Tc&#^)+Fbl5k7cWJmzjkCv2Qml%vQI4s{3{MSQi=1!3csAZ#{H#aY6n z%u42v2>P_jiH=gIvx#3JX)(POo z%E2nc77a1qS5Ng?HG&E**+YgQ8l=9Tt=1F$^FK)>(J6@}J!}IN!uV}jB+-3ot1*Vdp*8B6HOtsvgDD8v*^-ZKVg-OVi@P7;q@tP5jT%7*- zc%K{se+rEY*C2zhMAdM#);epO_=;HN-G~BjAWmVns$C$G*lb?VFV#yk<-*X8o)KlE zFz#s0s0Bd!er@kSp0!@-LTrwU?dK&i4S~(35*Fp)QzW0L!>fUpx1X{x>@#G+WU+&j zA%45qq3y@HLhfiDa|>6<6}%(1A02%fxdPoN%N5zFqIuvoY!E*X7;`8GE^qZ=G03(1 zw7n?=CSwtTMMwn_d(9PTQZVNeV@FXl845CQ_vauU8&;w!G=cK?QDAZz0U^mdnTv$z ztho{6#ZRA5C`eyV2|osVn{M<8>Y5PMWssMm0ZXUOE3*#2Wehxd@8-}IY~25KFGDea z+lzu=sG=G5#=+^mAO5nlaftk)fE)UQZG19W=5zyVOTS zq7DF!@xmtM$apiq91iYmln#C*;=m1=ILPjihy%A2yqPPw!u0keB5;63N!y=mw*5Jy z?H?pBtMdu|vd>dV9k6`|b>K+rNnuk_2Yx{vD3wX@iKqj=?IINlf;w=HtS{ z>cDBe*r@|QGIg+b83oWApd|A^E}JeD1cG*&IU<1AI-g%oIxw6#lw~X$>hSKl43#dD zXtAyCPMeokhhH7+?h2|lt1Iw=JQ{3g_~lC=&r?i80ZmK>^~@Zo!cV|m{)Fny4pGQV zX`DA3rBB&)O7-f*(uM#E1JRFU%CH~4T4i*T->;pC-v46%;@P9uPhQPDiHIVDvu$2`P*6phqE#Vo z&%(*f9T`cPDafsp_%gV3X2JWo<%cAIh5PP3c~j??TZdN%Ti2&&W?y;#;|J`1Aq%D3 zD_Mxn09as{5kF8v#h;ETi|s&k+tqsLr4q*CyEQ{w=!=zRy0ejdv9IY6xv~BH?f-st zb$W06Tg2;~d)tqXiJjWm?G17-ryjb~wC$^|i7ER_h9J4fIR8r_SHKk-EAeLD3XVu`GIl9QFF4 zj7g{^oClXyZ+C~FCcQ&~>u|uEi9e$Vly0O$;dsC&up9OXyT8Yy8<>GPjW*q%0#XmY zj7v^zj39C;+3+(}??jM=n-2!NFhqt!`Yre1sUD2=dJ>?pMDQpbfd{+0yZ8DGaYz9Y z&ZwI=PxO&aheIR*sxWL&A4lC1Y2ZDX0B;YoFh0LH!e zV5j%`{T&XZG*D!XE?7LoJd707LBuv$gA~RCotR^0O>y?PwHPgDX}ray;m*cb`J{c~ zVaJLLASeS7zQ1#i$=Vq2>f;QJKy}Spj{_ElFusk+K<{BhlOc0Sl=B7?#|z13nM{F& z`zKSu#Uf*vWp+km4kmy++S!=y=xHubd-^yvxuzsraxmSPj&QsY7e*2tm_w=4jp9+`C=(3@o#><`Y!zb|Of~CvpcP`GdZ26X-tX9S+LHC=-aEtj zaSxN%TV*6}Y?H6`liUu^v05BK<=z!Igp zW3VXwqnezoH>W+`Hq2;heljT>0hLCsrBY`Ja^7&*!m@GQZ(-t zHr1=%6&u77NjuO1RCi}ESrN99#=?E>95y*!WRGA^4v^nuA0#h#Mc_(83*WeN;OMMw zj8N%z##XTx4t7@ruB5i`=(_?A;y)JKXEBW_iAhP)RKSj4 zf+JC5wFDv*2qgUO*$Rj%3VU~yKjsKUggO=oMNlx@D+tomob1LeDhHANc>MF$Ua=RE zo$h#!)Kq#`^Z`&TteIjYSfD%SD1-EM3DVus`!q?K9HdMXFvux?@g$4}-Ln*;*Z&O} zDPbzf!b8M59=eNt^|4ezL|XkoHr#%3aenaX2yt^``^Ce@8{4l5nA*rt%p%!%W*{NqohsXP0pZ~mJQm%R#q5^JEjE&x6tSM#+ zUI8#7O)q`iQV$!XvT+N9m@TDabkA0~U5jxewWDk4`DH_u7TSE+wet2*;jT8WW~fpP z?bK>RRgGJ_-DKQL=3JVmz>~`Be;r&Yy#CvlP3o@ywhwZ@z}0g;JyLb;H>m1=<9$|V zgZof({k*>~7T7Ibj2|~eQX<@L`4OJx4tH#;{7Fvz0>SsSt8o#vHC>SV4(yPel^BA z;BaAAliV%1=IH|l*Q=}Rw?}7hcBs?!8uY{3xjb9#I?h^EiWR!#A&=KYLY7m~n`^fea%VBm*57G{ZVMpfnPxDeMFlge;h94IRh zUlI%B<97oThEgIqV2qSX8e_EW5jlb6EqgyRxPXLt#>1P6KU#?19l=FT=x|WLB_){2 z6I|G3=Mync6DjbjLUn{m7xI$mZ9=rF7GiQPglO6Q8)R%hh1rpHYsVw!$oDa5>_UrS|IlkL-oyJgo9vI{X?&IjIpZ~Mlw zDtwZh)oli2Ty{3kKbqcOmHxl1aDcJG@sZ^f+3`zbY z;GM-H8=@0)lD)jp{2lKoUYX9p@{hG~zyB?|>s@alA@TNp^VRM@uU{ktoW@La<9VQora zhd>T@h2;(+9>j$USE9G=!#mn=fMiv`P-0YGO$)bc)@NjtIU+!srBYlnl5jU5A$nPP zQ~ZY*nK85>%?)HAS9`CWZW%ZmlM4Hm)5io;CplkAm~rd27r$*(u-xRzej+a}^zjyi z8R5_gZxCkqRY`E|avIp}$lEQH{*t<({*UqLu-~%LD zV53eWgc>yq$E*2WxA%Vk`)v(*d(Y~DZok_8?&TBx|Ng>m4IeL}E`dqA4Z;=>!cck`LUbx+U#rA9a6)NR_WB(!_+HV3h{BIcbAh7;BjD-XT_-{AvDKx`>$9tJW{~hnO zAcaN%v(MiRJx~yU(uzk&UaGB)e1WV%U=0TS-EQnHVir`FQ;X!g%4Xwkz@ia=Wf=@{ zc}!LMMLBJIPH;d7exyeD=iS3gxY#YGmpC1mLV{O&RncZQg_ruA zO>NHiUY9dZtWnGxPOPfbS#+XG3QN|-xFd^`A}_|;v+K=k3(hD;*Fah_*L8)p*3O1F zD~iAjDd-VIzCoOcqa&(-;v}8=gBucGJgGKz$+>R{l2jS_pt0>p?Iw^D%NP(1l>Xtzp% zsAO<*r6q$F$;IhXpki^ZCG2$6x{;aNN8 z!Y}C|`8SA{t>kNyWfQ*MxqOYKwT*Rceb@pYYWbS@TEy2|=))0lp*UibgIRa`3+?m2 zAwOFL7tV4EmeSvlpDh|lze9eu$QOQFD!2ZId``Tu-lu3`{Y?f=`+SLPsqD@36M9X)O{KCq}CmLFAb*nUE261hE(Z|oQfvkv6-v73IH-w%LNi+bw?eg&v zY@$#j1=4FY5Z7M=e8ak1fUj~h>Or(4VM&S&s=j&{(N^YH0biS?6Z{o8T8+)5t)L~6 zZ-E7x3=8u>jo4IVT}X6gGz&xA5g7_jd#muvmJ9$RQ+mLV2#sA7{vN83T>V3AzqGXI zgv(?ARpn7do<@nCA9uNYrztU!dTH)4H?KZgG&nny0AL}iD{eJXD6daetUHr;*{y;y zTk}bAL=j2MusF|5qa;iS%?T_29EXF;ohlh#PUc)Y+w#ejuayuqU_ffZwJ@}T0|vwH zP?F|~b2(f6qM5O|GSvz@qdj9VXr(YA2$Sr?l#whTH@2C?7KrMvzI*ZLB`LoR2F?%D zTxHUv(hyE7{|p-}5qp6FCaykfWi5mM6V(ZF34%O<#!ov*%W_Z?VJA`uZ?Su`$IP5S zAB@(Zj4OgFO4bSL`fClfBaTBEXv8w$|-Pubwjve!Cdf#8o?=}yQ%7n=?F8Ofc6?xR>k*`{rfWCUKF!YVE38Ub6T`r8dta`mE&~*|Exr@IoR_&d3_4ELqMP_n%(1#H;$M7y#u& zskuv{eAE%Pawn-!0go#)-8)h6gR*bdEV&;oI=D|&xw+y6cR7fv1v81}Cbvoh9_fQb)x+MD*uk*c2?2$T?R1}0RyUxUD9Vfsuwh!ol|%26 zLO8_vh4q4Hicc18gUPPSRR4?BAK&Arx{&U>mt zFpff$FWe>koGLIvtRY5lGw&cdv&$}yHr`SBWtCT_9DZW7*`4_x1EV?vs7C7WlWY(h zHs<4O6(x6KF2FHh!LBxmTiXquY>ue4u(_#%)SGUf`w9c%=96z9sIK$QZ0K7BYop!S2hknLYyUY}Zx$N_CuytpB!eHGQEjFy|{YAlSY z)*D3VsZ{nN&U;M=&R^yR$NXrD3);gf>q^}-e^Xfmf?I75@Hcj%P@|#}6zfE72MAJ$NT8JIHsH8vaxA;Dhf?iXx>BtEE|<7 z#idQ&r&_Hy*r5=vZ9Zy+Wbic?yejIQb3~JD=aGCJK%#Sh~AQkwn8!Onh9w{~zmxU2L z@BRig@^Mof`TYFH)J@Wg3+q~t!eekcS0jn3wVpNfD6vvpGnAer0p#y23Uut+4@V~- zyV$Q%Oe`VCw!4rEK+^u=FiIU!ALZ!sa}&bUhoVIY35~)2_3INts(6rA8&&K6bEn_W zr0_p?C?;&=FrQ-6iaa*8^!+y$JC!ihC9!S&-9Oy_NLA(Xls9|TnICD;6t5D3>6CAK zZxUJ%*NUKbl6ZItgbV3}GG}6l-(8Xi_s{;)84US>Zc9&|fBToMEpT6-{o(t)mtTFq z_w>6*cCIWe)36phTKsYU_UknG%gf{UNJ;v_(b-SO7w2bm;*RM^HJM@pM2Vseux@|w z0PM7b$4~dZc?F=_sd3K8h}uf&2DS_}qjc2jYq%=lEm%pVk z?k7LA8bvx+G^A}WqgC?OJ!xTWXX^xl90bPSl;@yTo+oqj6{bAa`(dsau8(98^JmYk zK2(57Vxt4#GkGl9q{qbB^p_@b2R|NN-3ASPJ|CQ)y*qw?ePQBu-N#|2<$)DIR5!~d z+WZh$u(@euZgVnVooFmgcgBnoYNn%s_#HYj7OI1zpS_gpdb^A8Q6>D=kQe}8Q3Y8& zm4{?<)nHUp9y3i_F#(atgEtV-nN;fTCR@*@2i~K7@3ZpN#nHj_#U7e|*^++&xdZSN0h zB7b1g)uG_cCRct;g=A>%D3)>dTpOY3{hW8InJ@WoL{huMJsy zeb4fWo}F(VU`(WTn;$QZ-W~t^)r*&p9zXfFSfZ@jXjuCf2Omg{KDfffv01de^g(M!v`{@>wKfX% zP~S(y1673Lhwbaji|vzhn%3TARy*Ihxq0;S(Loydqcn6QIrE2}`+d$GczV+A73_RMO#P$@<$^_(NiorKh`6p`|B`m1tMa`siHgmfg4c4B3 z7WEKR&AM;DJ*KZhZ&ZL>T*SE0zb#gr7=)Ay2p z?VPy@!hm`oAk+hE;Ew*wiHd9nZu+Qi3vVX-2Cy~fY=7vh|Lc#>pFPs&ZZ9oAPW15Y zk()5|F=*%2#ra7rp&48&{Hf$Q(+6$=h$H;tiaV)c$oR9p}AE<)oTK zLxScXGh|cM}?!&$NYZ~=cxrKyzLV*Yaq7{xSgm52io4mPA zQzc=HqRL@8nZK*z+4ja-%^p?jrR-=)r!^P|-G`g!XKGKbo$d`0HcyfIGi6k{a=#kV z#x@+Z1yI_>D;iEJEpPMk1NIQy$%y|MI8&NW&kv8^9ebxXqeBa&OoJ0XsIA>LS|rGE zMbwacB0Www#dOMpiJO-cJE(;%o;3yAeyplf%{{8BA#b1E@eeH=U%oPKPi{Ox#N3l< zR0*`3n&^a;9LflNtACKMwimWT1pB%OUp*%8%(}jR!G3)I7Z1ep= zSfgBj=?3mrJ4;*Q;{5z7uNn~y^eCwJymYs%S*5Mn_IiV`e9^|TJzUT0U2m;5W@4o+ zrUB-OF`1`hV&*Hg3(3vHz1Mp$pFe+%Vc_#l$_fN`(PU(FK0bQ~WeMAdO@_`mE+3vB z;PpL&K4(MU55)ktb!R=w8gh~In{pvd=^X2U2QCsvyb zZoCTsnDZKdjzzG2X=JaO1@7E#ve54W81N2V6fqeEwht@o$C_hxDYZ z)`1fX*5S6_&D-JQVIwEm`g7tlem8<>Q0Xt5;ZETuA4A`}(^9MiteUKxx9WS3+t=z9-D>LCdJD(_?)B*E6j;)%h?&oD)9=SBizneysL}- zvrD9y(@lK=i}3SrUhX{$Pshb|vZAGR%GU+AVr=yH{{w5eNd+_%ymALUkKWTh#>Y4_ zu!XmG(JFJFc4xhN!XdQjMzBpBP2trtH#u(p^W;;$KEwWh{{HOvuW1#qWm~`NZI35& z2$MCfvK+3n%M*@dqM1N^{Alm>cP}5|TavUn`AxhF9gNq_zFc^tu}GAHLdq`Hk94D%4^Ay!^mjU;T1)c^AAq z0B{%T=Eb#{6wRx_QE(fayl>Cxyl%Vo?e+0V5a!bHrnR~z^gBXa{;_coeE(JNA7_^1 zhV0+HpqnjdHCwlZap#sWW~`41O%m$CFPqRv-<#FeT50QddADXZ(8W=sbzkPFm<9k} zH&P;jgJ{4TxJNhVxWv*9Z@zWcgT?=XDac1~O(?bq!TH(I=GC#<3hI~RsA45iULr4mWiATjG*M`1xJ(5ix zH-W*f*}*<^bOWylq1^HY?gmGTn5LSgy#T8fEpbz)@{B-evCT?{-23KHqJ(Dm%dVfe z=<|G+R8XIWnr-F}bhD~%KxWvK;bp{X#~Zs?(#>dK83Ar_1_tWu6ps+Xlur@LLka*E zGGuF$ha`t%EuW3JeB*`dg_v}rV;!u%jeJ4NJV%*rk6_;wz8|z&Vt`NCX7!e67{2Br`FzA09j) zavp`rxZBD8`;Ziql}Py>y2NuwhoPA?;Ymc^n33sjCN6z5!L;^UTYN3s01e6CEt-YL zzkykZO_OIKV7l8`0L55gk|9U;pQ_1vTHFdLPH2}ogAv44AqU(2>`p)UJo1iU{A%;$ zQaZ!_$s3QGdBa)%C?8*YPLgG%MhXAWQ-rFk58GGg+cr6Czk4Cp9oReP?LFFgzxo^R zy*Ac8aG36P7TztIg~z{vSqQvn_TJ~11ttM6{x6$CH6O`3C^Z#C3V3up9qaHpt8Y zCfWJ?`8xv2%gCllG4h@#<>{WRSf6`ZtWefh5bAIDp5ZLAY3bHRSQ>d7TeI~{#lJ$v zi|oq~`S-7{FoP-`WqsMJlgCIT_pcKOeGK6K;~zIqY!GhDYIYzU$n$d#<>r(*$U<)v=_J7BsN^0rcB9Gv5@38tIjip62+cCB>IagKD{zu=ZWXsq zi!2mN@hPR<<-D;p2`LyNJIlj*tMUb=;`*P2kH97$DMenXQB*lgHTfmv-H{Ng*t|I6 zRaL|8DB_hqxzsdj`2)IeDVKB5Z>dX5>geFFip^&A`RN zHk)B>Fk9FXEX?35Y+kp7?~Y7X3t(mQWqReQ{5PG;;LI&U(=9e&OzHLMJ2@yC7PJ7& zfWbFi2Qx~AJ$-NH%}a)_c4k*dN2-2P;>T}wZ)QT;$!=kTF_k_&n#@LUjj9E`111>C#Vz)Ii#*lFpBR2Yph~=1iTrg+Hn*6;&pcEXC@uEie5ipe zEef;>>u)V;jnj~Tql=U4J0U=+uB#ECo5S0QB(-$Sb`QYYLhfDrHtE{ck?uz>&fnAh z2#f1m_fiwd$~uitF_^2?r0PySv46j{f16^DaHEv^NZn<+yC%ub)AxwxB);kf>3+MF zocURtl$P$-r{Op)9$MLcL;7;4N!wwhbT@c+i#s+z&i#jRqfe`9V{4fW>Kf0acg2Jk9#thLdm<}ZPU-5Y~pbO_op zQmbiwOJ3JfUS1wiWr&b%-(=Zlv43(Ik$ab=0`p3|`{{RWfq3l+X#vqN*EgEzHiuoF zU5fI*Ac`Q% z&5&AC`5U*)oa%7pUVH@$B+*IZXCj0_h6Wlj7YIgviQ*O0ITP5f0;Qi>$SPU3<2W)Mq~`mwr?s zYmF`$%s*0%*@vIbWCNv7@$9^w2vm9X|FHhdq%{o!`yiof#JheTL``^V-sH|N-3^95 zc<~~ksH!z8!uz?^HlTu|<+2!>J=lKmKmVssxtz!s=alKaOwmOK$n2Cq`F+r3f38C3 zwK1g&Q98DRS3wBmXf}h5VJR}tg1a`Doe2Hx#S`I-Ilwvg>F8Y2yP|S@MMSm!;sRoK z>+hzm@q+p|mPiuAtB_^=*-X~sB3<{pl%2(vPlvgfZA}!;$&|XF;(nY>c>@O@&W}M~ zKYL2m3_ns;Y*ADdAJk4Qhw=5>Eih{Pk~$>EA3u`B zRAl9EtLpgC#nmlnT}Av=l3Zo3==DbTP3vw$e-0~&4%)-*M^TZU`fgAvm5mou z)oGHL^oI}tyRU!$gFKTurF<&}teb8A^Gi;s)!^rI#d~hYG!w5ni!Kk#TV|;1MQ^ZM zL#zZ6aj8WE9S-S?gu@e<=tL1ig~Wc*n^u+ZLuT5bK)BqPHb*KP)mOK?uAUcLJq(x zX1Xd*z$OMkn|}9pnDwUbmT|z6F!xw%npftcem17p zBB7Y!`nyvtfgc!o)|rUA&>`(ekau)_HxX%}VJ~$}@#pP^Y4AAil;okOEe1&k`PJ0m zV0k8dyGM79W2;cDcf*_{P-rRgZci09x)b$iDLL!R+S$2fqF#@F7j#MedxNxug^$er z_1Iiqe*7{Y|1BD%)ul$&Q&`0XC4pGqn#m58MCheuSZ-)I1RW)$_c@p$!#e3?Sk!_a zMuqqr6`TF!r+8dVln{jcqoul(=nk!E?e*3>0P;*@rE6=E z1xj!^~YyKS4+mSO9Ix-m> z=+U`_3YfV=(Q{JRp1m+$(F^h(pVxdB6XM;@=({vTFfwot_HD$*7ebOWRs$Ne8on7K zYA}k))cwh3CzMO1&n~#`rCWqai%@4k1MM-~VqAh0kyuSM=8{z&@{$Q{Z>yKg?h?Q` z{}?M+?zZuevYXKuO!PaL&ulw8_zjH(ee6*HC55P*)?ID|(Y+GOeYv3~yRej&SWZpTzfE&HN*E2N(bLHa#Mtn&sDE>Dc9TAk zR;>cXF_mog7J@FGxe3oPl|CxJxD8Ls0KxpcYcN6=-Tkesz=($ALt-V2?Ai*Lbtg%I zH(!oc-_KYMn$RMO_}3sjDr|%`_3LYzuW0VEnPNN?y0iLPs}i} zbKlIHdRWr1;wp8#e`dlrt7#?}ol27KIm)ozqk6P*E$AW|3bZePFrMgE99?7g63*{O z#xKvW-z(vbOZi=Ht%-L*_2crHqf#jCKN?pTulUnF6u(+)k;!Y9ke!&E4m;7uON#ZJ zpZs`yHESn|?|7;7nTd-AvXUv(U{1}ghY-3cimcK7l9;8!HDX8Bs8KTzgwE;~X=q7U z<{A?`Gl!CdHHqgGXN;*Z^O5@O*-F#G&u_>R8@IjN#}=kmJo*Nr^~v!8@$B$1Qx?;Q zL5^$(F|wx6p1$g7%TD7xbhJFseNPWh%N+J8km2x1yWW>6V7ojzd8ghtS2RpbM51|D zjL2&s>g6svH4XVP1J2amkis~~_Tzdxu-J5z9!FB-`~cqD-)cRj;KS8=Get zK>fk)*3OXb^Cd*JcG>F+RDIW`IglVI7=1G4zMsnh=XvKXmxhK6aDn5Lrw4*woTe4RoN$PAToylUoe!RQB03)G!`jKZ=Kj?yW z?u2&EEcWT-xjSVV%MYt+w(21Jll8a?>2knC?oef>dUn}F4o38N#7t2=^zrZrE6}pf z?e@3E*c+=S9aD^)M=w|8{mIVsK6?Q(ON)%`O!zSE>j%kB{PFtYqgA=nc6Xag65pBD z^AjqowQ60>V8{-3c6HFf7}^Ua+n`~#3v}&d83T-9W8&@im`4QLY3f;9>{?mf*%y$@ z=!J?{YMhZ1j__RUV|L3emitDX5z|G>Ooiy1Nmy^mFLSzfbZFM9Acy_??i2FQ`B(g9 zGNx0n+-6iLlWgccl)5pUGX`SZNv?L1e01SN8LQ#Z2{Axk#9#KUpN?%nDg%1O${V*H z(K(oK3;Z*fYQ|bW=hj%)oDK^ne**iI2>}@AjBUw=Xvz%f=?DLH4Y8w%SkHR>@`R}; zB_d>y>C`ZxuB5XRqn%*EDLvW1|DTRd^ug4RRfEr?@(X20Vqp&|rS5MmU&a>-3}|h^ z%|7wF%v^;!`vplU9-X@fdxHtnkE4gK%@Ui$9ShVMgUx_NFtDQzzim9M7Y1sLpTg{`xj4znE=Hfk&^LK`CoU}AqX#S#>z z?AV{Ph-Z6V-}GJ3pq{UQaMo+C83ML=jD&_hrs8ogNrp?NQ?^?3tCSC|$RT=+XRw2B zu6(wX2`pS^0A&lDWp)7H1r8l&F*696&Nv$CK1X2qls}bxbKFBi$_saG>%J_BYR*Nx z5@$Bal78TbQZXBWaVGCVc_>6=#D_i)Cb1@p6MjJvq-Xk+whG8^KQHLos^j5(GqCYD z)@6AAkNX$0?QDL1ew1H$NqNptCx)`g0lHasmLvLbjO@o)ssXITN+mpsXlQ9M!yDBo zq+jj#;W#^H^oy#Jc}jK7s2yjcPd8_neTackP2FvsKy+uGe0!%)1vd~%c;M@Ib^O=p zDxl98dEzmVEq(?nl$#}h?;-!~CgQ=zJxos&nC>VN2;RY0WcrK%K3yTY*FIHK=EXL9 z1h*NR{VsCy-6x<7MH4d7kA724$_D*}#4c!11A!X>K=@o9nYH`1S-Ab*r70f+IlXf8 z@>fnyAq>qYkVyDeeBt#MJxrMP0SxJVm~%F#E6W6^+v3fDFJJ^oFX*-FGD}w)s#!b! zDjM#{q$~-UeY`c*R+RQX429_%+QVhd>lMvRME5$rsg2DC!?8~_gN^ZIx;0Gr{o0bd zVGgju0~!7p2|v_7n%#Rreu5{VY1q?O!lpHthQQYr zQ+Oz>v)tl)k5hlT_~qpMCtkv_JIgdm?g(eLgexxD9_Mck?ck0d1ob^z1DbYa zWqpY4eTs>r8c2V~9!ndo9QBB$pCCY2_x~k0S1f082aZv~dg0-GZPJE_yGiL8K`yV3 z)G$H2y^tG|F0bf*BMMZ8(?Bvrxc?=I@ox$p=+#653p$b+#2>LH2@(< zKe_U^yLN+w93Mk&`N;){^2=Ahd?YN$KGzaglXx|RUG{cc-=f#Zn*eg|EDe=trp{>P zEd9LrTO)O;U?Z205J`9N##dO-E}NSX_V5Y536W3!6hbVAk=u$s~0m?pC z^Ir|EdKh~zfj-s4F*2Ypu%>!w4ABFf%P*d)eY*Md7R$IjYGaOYL6y(W6L9ko`#b0e za-0-HT)fuQV`1*0!Sf|6jY%r}_?7RPBWFJ4SzZXQaa+Bv$%p=~6WwqI1)(S+YxlXdlU=aHE`$)P zmzcz5Xq2g|uyjNR%<&Ej6MBNULg%i>S0SJx34`=5p1l8 zsf$m|`kR3!2F=_5_Qq(LZNB2)?sp1!6v;>0smTB>G7BTp_ zElaEk1{c#UWvN29OnN1&V3w>LgsXRQZ~0DJj}Fjrj7%U1u0E`}pF^n=z{5TY#b8uF$6OE4S0b=aaCs`HV8+__^5hxOSN%A@DTmAG{YR2$&q{bXW3JL)7wQ7!qQ&7Y95XiAmF*OEUoG} z=lR5ZAIj9AmLY=07nXxg>Yy9IjDWjQ6FBb(s#n+~gAcU4zOPDZ>BYE9gBIZ3O)dn- z+o58zM~z9_Oz1e)J5QPo-DdK#IVKKm4 zZ^BrL0r~3M&5}HAIL=?_oKwh4G9ZlN8Tf6`$M_GEyBec%^9tCJ8@!@i1A@(EWsETh zPjxMiAu%?i8 z&gu4Cgt3Y?wrnKkOeVNR%jXJGIZ0edyTwO4x&JC`djQnUgLE_Dw!+rN`t!qm3#Emi zY0gBkJfXpVo!}VLk-2T`Iwst6Q>l|#T~+%G{mtCMNJ|qGVFgg+B}+(oM&NF}92*Ki^)_Pi zWtuI&wd2|=2B26qf?VT>HSlqBOeV26(vq<`W6w=x{{~jhd^kQLq21(^55c*8*|56A zj!w(Q-M(xFa(mrMFa~4>VKLhnlwgF;&09>T=KXn|9F!#UWWum2SM8-yW3KEgeo_>{ z2X^q`mp2}OY-F}p+3@=-U?^-Kt%V@sjJ4QhE#wn#7Ng#u9gC5assvRZryE9QhbpZF zE`A^8q%l%d`VTkwI&g#5f!}EzIJ0;i5(K!#v2@`YFCmC!;C;3X`hF;&qLiGrW#Dwc z*LSPd3c^hu@Pv8{iSu5bo)e0NB(~Nvm<-Y;_;BQ{Vagq_{f~^{P$D8^d4Mg5N41M2 zao)zvU-K%-rDR)_zzO5-&2{07ol;B%^TH!q1^zTvJ^31rKH3ZTU@?i@#Uys|EIIR) z;b|Bepf6YNF_(!92A;m9ooEL#gQY$5suq1o?-G71l^U4e0%lDrrklVveDMaPh z)dwfPj=g@)&kVEd78cBc6(?Ds2hAKN#-gTOGP;|e&E(?&EKxh{t(xiuDDV;h)`k8gf-UvtN1XNDlvi6XdRo7)>FIX~Qj ztx)`o3y!Ir>R3L3+-AS2x1j-SV1mtOW_pi^NH>gemMwo+qgo0U=+5mONeIJzaqsuP zzqcJtIH^N`MN9v=_lG~+1A&hAPcwe6)P%Fw|9fsPK^2W3^N~e6JuU)}2uY&MtpIa^tmpCyABbb;yX9}waGTcvO&_pb?uEjmh z(d|bvRLp**_D}G%``c`%j|lOyJp%!x`txg|S9qM!K|;v1U4Ji!fj(rBRBnKs7#j3=r>)xt)3hmw(HxRSscE8KghK zr>mUaCWM=3AqCC!^TU@*xnoHKUdy!7VSDPPG6l8yuL!t`eDU#!EHdnvWO)AYmz|A6 z=#GdpUX+bb#`#V+h-ASOtW`YOcy;f8-D|%ArD}wBv)~QzPj_tl3lgzvA_SFc6jk#DDjFx&wQeKID7iccw_cx7L9Se!P@#6z|q z!l9&ABzFN3Q9#&S^sZuF9>!c~Mjn5GH)qdIc*X9g3a$j&0m^|-T0_u!_o*H>9^8M< zzrFk4+Ee~AACeDJ$343z5kMz~FSVWPp(@%=ftKqJwF83&$TtfxXc-P-jVG94(HnLM z#wS^58c3XQu!yGu2?rA*hZJ89HX0Uw8|=JWB&g>jBjeh@?2wJfro)N2gI&)&o%I=9 zp1DX-0kKe)2#^Y5)mHoV`L~a(#+ufwbMKR!;ApxwtQ`}F@Rw-3ER<7BNEswa$qy)O zfn$R z88KNi8#*EI`k%fn0+;X!aUVX}BOJL`yAC=GtO@P^`ZJIwwU@H;ZcEPj3phBvU~CW-;lFFnnkR&}8p{9?gaQFCbG(c=rfG zPQ|qaFWA9%y){O}Tt??qDubv(r*q%zUteBszB+>QETVPmeti{svVd1tAZn+6^J*X6vusb2|Eu-2GqNP& zBl_ej)}gF`>_sxm+3zyA>#1X6Mzz;uB~Rr|^L{Qz|Ni9sZ3D4u%a+{tE@?}SKw6G~qFa*EC2f_PX~R})gr=v+xQ?9!hDVJ^Y z8h@PCGpg}wZ*PupHWoxcLB{o4b!NaVDHulATi(e8_D~L&Y6YnF z>eqv!%d5fK@@^)cHzWwc zc^<{+?>~9^ofz(p*erXBYf6LF6%$o;!Wo=x-4;Qh%uq9SW3Lg9Ta7jEptZ-^-a))z zi~_s>|Cj9`7&jpY3tq7L1|oHAH&wCQJ5(sX$`_04y*l^+iLuO|+Axt+bCMa>1LL-P zsDxE}XKz+qt(GjK=emF{$IbzU-eH1A*xAgTQZUloA?CSLS)fLN^xeQ)T~hx7n$=4j zL^tYGyoTfh4he#`otXnAYlJtw4TRUU-vHEZbS9Fq5sX+J zd@C_)!sqY5fM#wU{BmIViYObQU~oiumV}|*LRPY(yM;i)MHikNr8{ILbdcQ?E*5$* z=sUFtjBgY!*^drz8NJUtVQnOq*@t@gQ2kKb0Y5I*|yeU5Ib-;QX5S z0kn%D1-;@9`^5*|zi*j(vd=Pc#R28*lOXs$g=rPA9h|F|!x@v99f$iT@5wy8`fzGu zEMKwQKc0E|UDpZ?v2Q3$bdsvii@AP0F+Z+yzZ7x*{#sQ4EOX2h##k>d+Z>VkBCAh&xwjJTq9s5c=TRFJWJIvu1cb~@{BW_h!{T9V!BG@Glkr?rB$ zQ)peygOfCJ18UGB-FgEh_!be~Ht9}YoG!Y8e|8GD!i{SQ_C|qobiLLGKKIYg?_RhQ zrm;wZqcuQDW2|kA%+w1k2{zP7#wy z^rPY)2pE00Z!MSXf~?n^w<*&JTWOC{2K9AD(CL;YB!Lm?LL^3U$!y=8QNWVltR1d< zWQh;Za}fw&x6)6DOR5`Z;*y)Etym!Fgbz<~hB0>#UaxD;=@LBA9X|eAW78wP+EHa- zPDH7k<2~e!e)VyJ1gVm6^k&X_i%X@1y@7%h39zYNU`tN9C!-@k5(o(3gmrq_BH*cd zm6GeZq2PasCHaaf{J0-;LhRb<^_lA7Ii^ggD;2>ma18sFPI-zqM|n4rHWeS3kM=6p zLV>#Sdrhq5f{94r4hYv9sl;9R2F(K>_jwraW^D6?1jGI;3W^|!6J9z`S~2ISBQQq1(g>3m*JbBN@f{?vT}%3x$2Q#lFON?5 zFR=J37dbsuQ;xz?-9t7&N~V&QvI`<6`hf`qnGsWribe|-^{UNCg+rmKwixF{J@nVN zF4vF{>;&7Jf^JdLOnY^jc93ot&)1s>z6LY9$cjOh%9`biOXzp{ zDCGtfpJ!Jn<@NB9zb#1q+g#9p0!!abo!huCts=e$h?JTS>*;RNM3; zwxBRMNm=PH+TgvTv%^adw&h4MxdTJmR&?$zh3WrZ#SeradhDU*vh4$DSMeKE6YgdE zrg%0Xd`;OtWxPfmNE1v?spi@wvA2q(Q#+XwI@FOKEB7E}3RZ>EL!_ulc_9SSi_U8O zQNe{e)+W!qHlbudF=MYni8s+i7i&FWq?9v8O1bCpvGvYForuvXbD&kYqR)NplwnJ& zP}r%62iG~$0kWp>nG^2R=fDXtS3Lj2E;_Pvt`Ww$v&rc6S2aW|E77@lf%V`UQ~o#C zt;q#KOdGGlgh>h$(L$5;4|Cu%V$Mu{<$^;^MDl?Z9P+2w^D6q}KU`uS7c!}zZ+Jd0 zM44g0D&ypvv};zmtv#y}9GrWX5hH1hsmhW|-9$& ze=k+CmFxs@AN~AzbU@VyiAo0UZ32)8h%?!OMmG(#b4*w59ao4bvX1l>nOwfcYzDyV ztH{`>Wl74V4?^r>djI{kmm}7&SSj1qbL4SHA!5&RshbzSn^y$|$jG2^7SWUZPFUu+ zd{nD1<^=*teefga<#Pq$-h@l#t1(2bN(>!emN*;#{!Klv~f4uxOukIJ~`F%Zz#oH(h?2m2gNQQlJ7o!D}gw2*lF`CA&tQc^Mt2EnIS(G2^9 zwD*w1>yIqa3`-#4BUU@VdVz(F%tgMzfPoQ~Q;ur|<3pa8p$bbRo{?Y1aFT{bBnY5S_oWH z;<+g+@p{0hUY+rpLz;c}(c%*ek&6Tu>YTfYe6Ot`8Iuq*Kl+J^A*RlAHeZfWi9JKh zR1MC#ANTmc^VBBM0^@CzSK*;3{H8Rwx*ne^(Pcs#^tqgVhny6N2_dj1%+yu(2BC7& zwKzvz>)0kYTaM_(lI$TE0n-f1CYQ}1$sWkbJOg&a8O6wrgY-vwwh10IQJ$|~W7IXoxiluLQ>4Pi zvWbJtX7!s(f(95a)t9J(E_(cIdqa`!MfLq9dnX7vu}o(JF>O2)g$jZ^})^dBwBGVE%L)#FlL45=`FLsM3*g5HigH@*Lq+O1X&5$$6q!AtZ28=oG`lgzb`%VgC@RW|TZnPW2k+IZL@cuLp+MXo6q9%`ryp>V*;w(ET4fm6RP+ zDS%RYL=M?^=8cHiNEx?26C`l&rc8TF8_}&T3R(~{E|!GMa2*1c?1({?>j%EGcJ&w} z{>dOB4DmW>`_BAomw7ht4-B zm2UE+xP@%Qnid#7V#2DnsUDH@XuhVCnsfcNIoCk|$g-qF zTbdFkK47u z>cZwvHVWQAMD!We-PVPC*F zkJk8mW;t7|E_pvDWEO97L9{^KRP=v9LX?b5h6N9gTdh5WPkkg9Gfx<*MRP39`iA46 z+GG4q*jg1U;{1V`e>pIPiN7VDMo}T%h8X!iOa-mYHl{ln0TkgwG5}QeB=30rNWOR- z3s3QiIjA}z(8_|4vT^GMS=CZC$W1~yLn7h{m%DY3KbkU=^){1y_)F61eK&LQZmkVg z(+-1-9;r)1X?Rv$N_QJcAB^#sq|)Qb{DmRM&0ie2mWl=2y5OK^no(e)NSR>~DFe*_ zsE*OfNEP*Zb?6$pR+b;C6~P~i)5;-^Ix`b`l1WlFoF$RPM=?S-NUlDoe$=M5Xq8qZ zimFNF8%*OCEM6Jc4_fgXb}_5%+!zuAM^k^G1wI!HeD}f6A{4DuvZvM^?t{LN+tMS{ ziwe$5;#E7kQ*Ej$XO!P0GUp*G*2k&{QPC@GfFfDC8JuCPI_-+3j?96@m57?l&sgr4 z7e@{jM4o3M6Oj*wZ#7IIzA@)7q-jZDj+fc7CBORMT1ZoPO+7<3av3=C{xXay>u&Oq zWY+1z8(&#{%Ii^T_H!h>V+#F?N0{M^{J5cKt~jQ+JLNpVGMi@>o7A$XL6D@%E>w?7 z@PfKO_P`ix*oON@G#{f=VY0N}Ev(`WGZyl920`_7VbGGiZH>6}TEnYZDT2OeIIVXY zrBpLdbGMmy<2=hsCf9A%IEVKN2mIS84$Ou9Qx~Z@%qz*Uljd`)Q*TZuoTXu*S7nyD zq)V{0+!H?-fR`$I?M8ZTaVn*6&NvxuwfkybniN-~V5+na1=F8De}V3pV*PZYi;w7h z)V9)LY|beO)fR1Lb`f1jzGMz1DC*P$%H<$BTI&P-{__`jLysi%ASr1{B&ipQlzP>1 zDs?M)wtsc-f%gkP5X?P7j!7f-Eji{~@|Ha3MeMoD%sC3yN&YqwDLtMoC0_h4>?W~3 z(uelZG~F-QyZ;%kW>wyZ(_=oz;C;&%p>7Z(ny>x`mtkkPD0&` zvj!%&cG7On#}4OR!g%8&xh#q-4O*4PK#H*JEqu;{9yhMI^>Qx&yDTEd#4r^Tql z{Y7dFg6ZJsXJ1lXeQ!Bb_!Wlyi7moVJS7BKlK37wz#45ANGH83m(T$s-yv3HO+>&2B+hku#XED zh{C@AFb5uTOCz^1M(%9X04|2TlGBo!W5O#wtzI(dFQEaPfBfiBL9i)1gIh6tQmO7t z0tq8|T3JnPn96Zm4?JG7si&?d_7#v|34kY;W@1kjY9y*V+wltMaa&D!sd(`6SppuT zPr>wXtKg(?=nZ|*ZxdV*?P=$i$eNoyjNl+V1UoJ`-FXad=TbDuT;}L~!l3 zZn-FQb!mzCQz&H-5p69(9OMVnwT~}J=L(<++5EL}V+A*YS^)f^Aqa;bVLw&YTXJ8#kE2C{iiVFZfH$ppkxu1blS1Rw_|*U?Y50n0I) zFJu)_pNly$TcBZUx!64g&rr|AaMjyL>f^J*0ui4W7o!m7idI1iiBY#jq|=<_G>M<9 zFI6Sn9v@RR0tZbG*N(6k&bJyj-J$)S&ulSughR1{CjTb;H|#mtK{#~&;x)(hQ*G~} z=N&)yo4gr*<=hVpSY2w51%lfwH{mtLGs^Iq)D4etx0idbe1J*b#{G$2XlWxFH%(y( zy`qYacT(U?#H~ph@aR>Y^LLa{LYXXc*;-3Nu8=8I+yK&P#G5Ncn@fI~-;lrIqu~gZ zQiG{Aeu`w4fi^)8!8B8%Qr%ET)IiA&?bTQ_vb*suog`R_Tp&c z9W~EZd3%N$d;>tM=0r6!gQPlBR&$~%%veG_PcpboDF1GXah>z-w%7VD-#zP`1|&vJ_p%DKtu1JV2C4(&9OMx(rPRh! zu!v7-b%rV3e%wc+Z055y+<&MhQvLpxy)aK$EXF@LOvwc*_(E7JncFH$;e5OSwQCL( z173mbKBpbc;o;>+zWheFm{9Liv;qn^`uuaNU#Xw9f{m>9@`-8Bbmtn*pDkP26#wqB zI$O_0gI{I#2))12-1SCK;O@!OaNc~L8C3pC=CY>Q{A#mh0;T28+yvF=&$=^bx?bFP zSJ${!@60kTL%Y-CGIV5$yPY~ep&^iTPW|#=g`_O}iWvAtU%n9z3hZtae2cWEtKQ_Z zo+tcXVkf^bx*AXgr6^k>Y8)nN>Y%ZL=-1KNPsbPMXBJiRIq0s%80AFTxMjVnRH;U#(8A?C7~xrH6xA|cevBKF z1wvPmcdKVJQq14$Z!5033O~z?z6L!kuljz9DADmnj*QYTbJ6OcLo6`Rw|xXDE=sqa z?&r9u64BaHK@wmBXa0L`-t0}Wffw-!`dzcOpkGqMea^lQ`*=A?w^&ct<@Mc2Z_#0s z39etVbIZmJhX`nJUg<(gTGz2h4IFMq@_MowCHApgewu@CN_{twJonz-g;7&zjh8Hcz-5a!%Xk$t{1lZ1f*Lii8b#qcb_(4Uch9R*U8e6VcT4e zr|RwyhWzaNYl2s+C2#Mh#3}-a-!!YRiSU8#{ruHiKWb=mh3GLYSU~HowH(XZGgQ%= zB?#Y`DQ-e@9?VuQ7R}lF^2L{Lzx?^jtMikttWbF=cJw;|C)`nV;}_iAH$Ni|=RPmNO^z@P)= zsx_G?$=jAZaomvwcX^DfphteY^Rlu_;U4lz4TYBz7?{qeKb=i{t$}stSX;@Wmj7ou zBs;+V)6oIRUCFY1^WWY^va#1;quBa2XO&NA#y2Ssk1?Eg3zczo2 z|2xweq`hPW->IQi_UN#uTc02TAMoOa*J|d00*u4wr96qG!6u*5iaFM;pkhj2$@AN< zbF4eUe6^I-GM3J2TWE_6;I1O*R}Z=SufU=OzH2$mCL}b*Xe;M+4^QvBq!#%}ie7JX zeb-~sLMBvuF(3M4&o{uEY}up~E;GR_xr_1Or%>*2Aaka$x>^t+>rhNe3In&yH#9E2 zie6&4MI#&_C0D7M8YIq&$8b;MGO+l-DneyU07OrFS*cFGSBW=qNC`eHZ5|e=>bVKr z(nP}W<2}hv7lZ{NJXwIN(vmq{)qIH17h-7qqStaL0vxCGiMTjE_;BKpw}j;=2THBi zz}nmj&3x!%dOMD3O=eK%NwX;dL7EBShsVUMfH#NAK++n_%|PnQL1ziOiKmn%Ky6tCT4q!Evl z>pY;4XevS)GD)F#f)?V@$pT|PT4J4@YvlGYl+=-(#)?5=&NVXpTGX&qnB@9|ND#C zj!RPe)_r4V0cgFbrO&J}_>c|neDDvR@4bBW=*_F=Prv`oj(v%yZ{;CwvhZo_e}44n z#cW07_QG4-0`VXgmtn@sbOte%o7=T4Z?oDbkTRKG2E!xZ;g$rKi8iBK6 zgm|S!n51t7wRzIC$pGDkt1vRn1Lr}(`mgrV7o-`MANR;7PHIv}lDhg;7BxRGPYz?|3 zq!6hryU-nBfPnq0%P!QIC%P(`Y-gpGKc~D3G1S6~mxY2H|E?Qi+D#(X?^r$^CTZeR zN}Mn*iUc3I5!EuR5IEE3NB@xgP0A&(50b*Czn)W}Bjr@+ujf?g2uZ{)B%5*V!TNY{ zp7SY!`DFZ9E-%giNZN%yR=U6H%nDsC<(JjvtJ_arnt|GY^zI}jNeH$FO_GFuHc1lt zRpCJ+%4R&dTVbzDeona&f@Wo5FA$*R=JT^I;ziV4UiszH!V;U}eBt3YBjbH8G3UkJ z%Qt)9e8WFayDj_cig*v6fA`|)qlYu4=Wi$FE#><+6mf0ncP8FG+k5@sk6%Ckw-^7N zM*r%`e=HYplSKEMknwJ~*3X{4dGPNKo-QBk!cMi|u~zrb^IvsyUFLIP`Q0mWon5zn zn_D~&{?*;6GyO_Fz1^5U7gbLR+?^?}mSEZHSbMvnFU9r$KWTER9Z_fdsudv;ZA+6Q zTXPV-4zeZ}-YqVfwOjS>OHFQ$J4?k8lP0J1Ga1UWO<%c}(N9EYOC3VLUFkr=EiL7i z@k>kBNotAGs1@d83$>!!JV~)#MR8l@o>}FtH$u510VDEXl5(f?O&UG^>be~jkjQ>v zSrxB5*DhTo14?qXbUht3GJH5yNtOgttz_rQq%~>D@waV5#Jef4Jq6XM9uP*S z!g5IB=p23{H>WIxb?!1hi)`gi-a~Dp7PV=C*c~!KKc}6IR>%YuBYSg0CRR(C9sfOL z_BWg|>)lK&trM&EJ3>1Y_CO_J3Ya!^^yw}n|D^(3UeH^ljPF25X=A*s=BeP4%Cr$f zGoF%HOfsuUTd%!1Ln;^6r*x=-3$96Ir}D1C4meYWLQt1Aa{V!Ld)XWr#Z@1JJ7FR^ z7~Z!Ei2Su(qwD~sn5Rxc+<5f!$CGnDLfvVvpqWaR@C-Eu-$oTcerc4FzBG~)VPVfk)(6mh=KS5Vw9#j;`3jmMH0FfvR zt~dNdiAyVAZ;yG9Ose6?^~>{Xi*_K%z7!c9V3kg$or(dR>u^K?VWPB_#!2)j0yyFY zO_Kiob6E`e#--#jXe^7?Xm;gxvTw#ww9ai7|u!CpwH+BRiw&SY;*n zTWM&Id7@^5>Q;k=2hoj>i$z>eKL$y8vj!UL8$iKyM_UT6*{FH$RE6tK&K07=YxaE^ z=2X}pkQly0z*Gh9AD=d%YB1;2)TkJw%CPQIWT<*96^o_PLs?bYia83BsG;+D17i%q z>9cC(gj)JXZvt-J(6_YQ+HIUq)7<1>N3Y5eldR}6(?4*gr1~s*CL$fM3RjB_v|6gX ziBNT1!kkom#i2_DO-;O3dw+^~2sLBQyMNs@|MegbQG5>MniX<*Pi{6V%iqmnevVgb z$G!1#&CuGroDf6BH$=SM4D7%Ys}*&Sg0rdL(yBg?&?+Vn{YL*0!D1}SJ&W!1o7U?> z(>LivI(MeR{(&U_-aun%eQ04>g*P8g-oNo+%{O>?QT9@b*m9B*bfG&po61$^Cy^+) z!WdvqRov2Ipe>gitX&se%FoQpCI9L3!F%kv?{^FDaS3k~^w1p!k?^VYw=Drt5uM6K zh|<9iDz$I4RP6(sH;>LFOqj4kSaei{Pg-A=Z8;ImFicsjwLhzyTS>75Zf;Rs(gl_# zxHwueSWD2doH}q^{);3Guc^v`YBV;|iQ=|l_+Wgcd8z&CtY?) zZBRMk$g<0tEhNMWT`RifLe|{ zln@iis9i~kEM880GNPebVy7xAn9fO>BEngAGYMvN46%}woN`H$=Zv!GCaWJHG0|%X zNHFEBi;>*-k?i#RrMPB7C=X;Il>44Ne`@uYY;jVEQOJ`6QZk6IZON1VGMl{yFlu*R zA43@o2rmw1pZB&tUaTH_as*D7&!v>~0{Usa6x9+iUmof@s>5PP z@loroXDzh*JCwdb0jW=(ZfLVz8h6zX@mr;PWcE&Ms6pKM-wL>rBu0&M}6ZfQgI;EgQg%h^eX zgh~g@>2TL-=UNwRS;*(bWk^U$X5{s=nOf{;@ki!XtGFAvpkCzVf<~KnhGg;eqd)Jx zd<4msbV1>F`}@oJwI4Vw(WP%euvefOcHa9RMe=m=4E-K_)}bN14sw2!en>U6t5yj( z>k6v~Mj76a!vfy@tE>Hk5BaV3b`)RPpP%eK`_jN{7=GRaH<_P$hL@ve+a|mQwn(;4 zXn9=XWuApfyfhxtdi_-r$%b%@t@Mwv`Sin1TV$6SzWeR5QNcp5h}Zpe>({v;Xn}+qDue3V>TOC{a&e%pY?m@w&q%=`NbE^>=#3J(4OU9(88$-=Q!_mJ-%H zzh`^0U@K;OPO1s_j=D41p46D7(zV+mi#*L-qZYR3Vknq0=6G z_Hd`LN=ANW0Ur`u-yMJ+Ud~_k~D@Eb;aC{lENcc<){mrL~ zAN92|{I)&apI5xTf$ekAHu&-4my>g&iI;C^%zb=t^t&I08HZo)f2nK>E4Y&{9eup~ z@_$q)veBpUGg;V`vDI#=h22m}oD93XetdPhZWg%I#H0c93XE?F`&5p{prxhgj zbZ_hLjNgUQMhdy>^t((xm#Y22JtFRvXt1GBxKpE=!H5zxDIfQVG$cF%79K*=GmPU_ zafLId>YwPHyt%F_8{J6Y^w3~|{y(7gAaS?N+bS{p( zZt8&MES>{cz7$GT8V*bmB65eQmlRnf7s_OM|J&zs;&70Gobb`2v7fHxhJ-ryU{sy{ z@#y00=)^iV?ey=zvZinXLT~V%D7qgZ?(&@`h#%1ri6fi}1ftN#^-2^W`;8n>_FpfB z7e$;0Pg+mZ<)b#^ z3I9&)gmu634ac&_VDy#t24;1wl2x@J5vpYt0~CLIOx8Xa zHm+!53*T)FX;@1&oLG_nC%<|^=Vxqwx`Uubcswz2u3(roxczxPPDRh=CW|JZb5!kD zU1*XTlGr|DlA4U!^z%$ot3}hQj?CX1&_rJBP5BPU*|53(< zVhhuHbvVs0YeM0gb~n^qqhm;56tS;V@$y1#592%FVJ7w-O*`Bg4B7Z|qiIL-52+21 zbqklh>xrytG)Oh6xs8nl1CfJR(Xyx6TK-}^Ti@!;avaK;4 za?2-LE~q8n9E>PT#>Oe%AOdc)GiU8+P(@vidQMen(rU&n*cC%MG4*=&w~o$;&b}nV z)}nst-{yt;IFLgEC@d0LJ3j(>3F9TQVZzcFa=yDhJ5V?au^=hDJBsyN)Ug|*E%w}_ z&Z7=kbuksmR7{Cia-k#$u49W#KC_rzqLHgy!s0bWj+!25s>OJL7tGB?*a*;rkc1jI z^oIb=^A>SKBS8elBQ?D6IHEpOK|n;OZ)+yFfAAxo9<$jGQ(QW|%CUu!P4OR6@v?reLQ&?7FDE|qd(dd&lBy?(0Ez~bk)=R0;)rVr3`tS%x#mym z^jMaY)Z{RzRB32%pI*>*%A9SM3L(})cwR(ERcMa9w3C`hKlZwoJ8+MKA3wR;5dIl5 zB0eH)TY>{k8+$!#+L--2wnFpkGajgGa`c+znbdLg5_RTqbDt73;numle(OFQLUPZJ zT*4| z$97_~>p-FXCr8_d=hxnGnN#6SJvfGZTpD($|F&?NSiHf2hYhgz*U{8euW_L5%@%Yv ziJ&uH!91kr{o4u(HH&xFmW)G>h_V}|HqOy9k_Dt?B(tYD!<3?v=ArQ5HH*NV-VPH= zo28=-h2&?jz675GrBzP6s*9`jVG66Yqagc(>fRW?a_qwBF-w&00 zeRhSe=x$7Ii#L{UiOdq-W+UgXXOa}#P*DIV$u^$WO%2G!@HBq^&wW=QK9)BQ! z;Yy-!Aj$xNe}n*^?V%NN{ENQdFc3LsCb(rQyU>hjOB^H%$BBgyYfD~hsGcDpq&Rw^ zF+8D^nn{g>(>l+qxCo|Ak$n{b@jS)gjhx95Ezx>&K0U(hpq*90q%@qE?TTEMgOP?r zPv7dfz=U}^6=hEP{oVQz`8KV4VAtxF-y5PAPmmR>51Q~yjE)4P4)R_-KOVq{#`W`^ zs9Qay9=aG-tFJCb-XY;PDob5G(n;Z~4o#kam02 zK5UQ#Nwh$KA^c!QN(HpX3$}^ z9_d;m#_FBEBDKH#t6o?BUKV$naeRpdgW+?(eLpg*4^RC>6Fa+Phpp!cmr+MDXbIiqadyce@K)_Ddkbc7A$&T_HR z`BzErQDXxF794{^Cs-efZ+>c9>b$2hxKn4o`0D)fN107bf{S84e5PwFT#_t`t_KA{ zP*gOemo(GF*bWi$eWoRgbW9v7d6?D%#pR}N!f1xn-^jG}T&C#oaJ*|XB^tP6ul3VP2eN)95-Gq~eflB#el9eW&)Yh#bRq#8v8woJ&3M4WBT?$S zpH@sY<%%hoC9i>N*@W{Na}`!T}H@rF&fcX=9@E=zD|VD zz+Sz*x((_kSG{aNfV7kAq{ghTSpT}!583!4gk$!{0A;q}ze@5O%@(=yAmf~)&Qr;n zpjzO!<6bVr)*>*KY$o?3%Ai7up$s+g$}&;#wh%e*)G4vr6(y#BwXaFl#)^LZ0$XhL zm;~EXkeY#Au+^H|sA-Jq4`~!}g>-*w6`93sFY^xfgXJ|>Lg&0P$uk14+|;<(x_Ma& zk4B`q6Etaoh``!|g)OnYU3k=u^xYgU4Xon*l@&C`9>!D10L46v#b%P;&jxx=FsuHQ z#|xU~OgAET9(9J%QQcqnwyO&a-( zT5DFpngko{V>fZwmWc+*wCAFQpW#`s7(;}o@iGj>9ky*#*ke}43ituNjj*M4dgy=n zrx?~Ip7rOO-+vGSD~fj1*-r2jqKj_@)_MfRo)PsdPSVc7vv=-M#8Hl8oPdr)aE{KU zep)mJ7wX;vpTiSJTs(=0Ba@G93#<}2(OH7b3s9_zT^Iagvb9XnPZeL8dKD0BVhA9) zCsagS0mg`20~cG(j1mlS7EtZjyi}Gk$cQ9$TYKDpuj9dYYf46B6bAiS%&OMdVd%?e z3i9{!X3KoG{Lck%|Cjgw1WCJY@x(~x#7>T!8!i*J;R zo(cIvn@0RMbJTS2ML7<*GgZCq^ULU6SYJ_gx#{)8F?ZV&5qN9}Xwwl?X&T4-%taEZ z;@`i&y(~%z>I9tqd}E(CPSw!_JvE|;wH8bWc2>gNiObg+wIgd$kHsCQFZlW5^zaV9 z|5wRtIyiZS3GA^FhZkNbEX~uV4&DEwKwRGOCt4_SdW|a|nz&FiA|Y2SQ*}@x8Erue zc0w%b>!JCQKn;I9y`cE8AF;|QQDhQx+PPRI7gj53`|PtNLcFYCPW@Zi0}4adC(j1~ z%C)1FZMAQ&Jn@&#v-wA=cX*r2w{38}N@*+3FF^>`V8tKZqqB7@F45u@8(XmvVe=Fl zZ`D@B(M-w9ZYVcr+;Q4P?1w!b+N;~-BwjzYLzZ3ExZ0^5PB^XTW%5(|fam~azA&|c z&aP5$_=1~T!+=P4Uu(q?_?v8spfDWxqsVDFH+6H1)935Z$_Z`*hK)Di5C?~~c*XDR zOV>TK#IMgV@yVOiw~^|4Qokmg^42KQ36e~M4;v1KglFh~Ej2@1xGuAy7WF|#jQbxh zdy5L)JTUg}*X6ReE&-;b5qH|l8OGpPmbO*gUR&{tl3@_q#4d^zTEi~VwFv!BptRqE zWQ|kwV3qHFuOd^NIZG^YL6}jvraoc3`}*g#dvGm-);6sR%?fhC=2wV__z%UaeSvyIe%nu${N?$qCipe=44Lcya*Kkn_3&OH)ezZW#&@fDOatw7+EC?B!_ z1pBHD24usb=^AW{8iH-`#AE!hl!pCC8Y29sHsy*%P0@oY!@bzzI1O;Fn^V(YCu7$- zljHzW<=cYvO35#3EXHRzomf=)6o=oGTPg6)mPphCSGC3@)H2#T3a&ah4V}S5vvJ3V z7GlC1uTC%ZYW7OWh3WV@-M)P*=O;cncTR3}cu7|w30T-*mitqtA+}Pb)Wfe&ez8+L zNT;x3b|~UL6?1h|@KweK)`*Pj=!x8k($JL(}AN zP{*o9>E59(IGtU85Hn&+*f;!B^U>Z4e(Ehx9&yasE{*cQgfc z@f%(?++Oso?xVOEQj=mnuIYOIp}DZB|8;3D z8mP74Q-c0e^4`V_1FGY_>YT1Vc$iF`W^PVCLPou92*b!sy7AB(XD3T&#y>kZN(jg2 zQ|=m?`O5WIi3}jh-g-SRxyfJX1hxj8ASl}LOb#_rgILWOH`qWHh$&ItMYR$5Vno7PA$~55(O(etA#EAIozb5Rr-4jy%K)?2iF|UD z;qPAFzJH0PQ8+{hgjS4Z@ClL80k?!Y1Ke}DSk}%J#EVXGYzwk4!5tsHw8nT$2>@Cn z{@^_#2)}GDbYbRk%VVrx#DPe-#whIJ0$ffHFSHI;CL1L+nqF%_gd}TdTx-Y%jJPw! z<=~;wn#R$Iobd#O=K`ma9Q1gE>exAFk`xMrt84k45m>Ec%BmOXy12mQBuGG)R{^63 z=V(T z`1it&$e`L|JgijfaksTmd)1a1M`uQ_&5@@?rXA_Df}g-ZT#TCny0{oV+KG!1Ki@+n zJeNYP53)5|)4mk^zeZ$RG2xDD2~_z!xC$DkRq|%r<4V6AF|E+79zH@t&LG@sxGG>PSn@jweRWyc~nqN52;iwgp7vQN^M zsGqT{ClR0-I@Ij5cu?|raI_F`Enx*w3lwISD5yEGVnqE!xDw;M%XGzeBPxH&$pod*CLqpse z2k32!kGdu&>Z3>4V3#P!$`7@Q%Q0p&Q3u8AadITnanI=l7b$bJ?lP{fNrZr+F<`sq zV@lwm*xD}lSjRHN@r|XVho}@iv-Ye`U{jWpxCL!|)z0MsY)bM*u9Eu)b;20Wni=s= zb`ElGh8PUvX6T~9%_u&@&W8JL@v~xAbS%WKK#X8l6x`vH%|*qo=p|=Y^g>`)bg6R$ z$0Dl8FW41(9?qj0vh!R&%ZgbCVc8h6P9SH2m1$eng8PrY6xen85F`R^{=ad4xcV;@ zKCsx$EX_-02$A#=sf)Byb5Mg)!wz`QmKwCjmM{Z)%)&&{W5}D|^VCh~bYfJmRgkkB z2ryx=)0gfT%eSWO&)Nv2^eE!)p^u|~)@XUi3Ao9}&9nWC zTbVN!ENIcajr+;Tvqojnj)8-!@z7)7`8b^Q1kEqji7Z45gQ>^m=i%IU^oqP>#Hr}j zC?PZCB8g_tS%xT*qTi!VYRaGR*1UnT$`n3IFDbSC_R%V>Tl) zx51jp+DcoE@C8cGOt-qZ%5)nJ$p}_pi7BUOw?qC)lu|L2c$XL7y}pv$lzO#wQd%~K z{)!Z7e%I#3lC{N&Glffs(2M!I2HT1a)FSg1pgGIYu=tTKjf5A`;`jE_sjYl_Hl}3f zuX~ABM#=ua6|J&m5G9fSDuIBc-17~4Pi&!l^HXt3eoCA30glz5*tvE};&-ByPPtRJ z1P2`w%~W|EVqw+Daq{q14(}JgxH*E~S1(H^+o*wq9A3;HA=;SKH7Kh^L_8V1twX3(zuHKT9m>a16Qo41F__;k`#(?v8F z_SM;|UtZzXY5fMn*dSK(RrIK5L<+A3_-aAcG!kUmGPWl=UbXu5DS=q!*Y^yU>4UpZ zUjFCF&HFodzr`#+z;|Eycn=nf*`2$O&Mx2Hydz9;K5h8@A&}7$^qR*=Huz`Y;(~el zU_{y|X!HT{GJgl;A>^7@X1qEkZ;3K%C>CJO=|y^>r|BI99xo+15*siapeP*E$WWd& zWB9V6HAT$CaBO$zlF(xwk?(NE^YIv!p9=d@5RF1-d@b}a8r~Tb3_P@;7{oq=OrD4b zW&XL~4t`Kvj1Gvg(H(dS)0>PZFl7V@lURlk5!|4{yzDDfDj1yUZG6Z6LNCYgkQgj^ z#iVn#3F+>DgYhA9bHSz?Ydka495BKeu`FXGP2BtiFz>ibioToDZFl6di&j;S6tl)8 zqYx&r6^w^En90=4@?$brUw}PPJ~WDjaG}2VKXydEnhy?uf_`wfm@-v&P`4;|jPyd7 z`3)X;->HI1RmFL_WFp4!wX?xoU=k@X63mK309G#KWX5`pEt46y$;Ch|>mifDD+{~9 z>Mr#P870Xv34jFn&4=0u=pg2{o`5tTX<|t+H`mIc7&)NGwq9Ny%x9WQYB-P{a&l)3 zY-|&K&ZD`;2i=}81Q#0sV=23U@R!Aa22lnP>u|6fuwN#u#&W3a6Vrp`2%DkU(B+8M z(S#i=C!^^d<-fpo!9v0KEtNq{F(}K0@&UpWvtDE4y>|zG4MPsl_Xbg*m=+_xMcZu*p7U z2h(mnK6`zB`o-1H2j7VVVF$vSfVr4RllRvLeBC3WP=kC0&452%Y+qx_>HQ|MO==->~3IB>3> z0|rR^(Dbpq{zIxLNPqYx*CLLl9s&B@rys9got)hqe0Om7>6c#}+N)vB`EZ>gu>pvbNA%-rO3#^-ACt_-`~0W z#nnd`4_mdtU+;c%_u<|9-P7o4eYU|)A$UdK2`2B>}?%8CX z9Nhi->ebU%uKL+X^DBwuR({)m9(vtDP_RiiIoJO6h7n5KfD# zNOn-H&CU9y%QxhTr4ya2EnPSj{g%!r1;kLB6oIhz2&l)nxPR|Su_GHhYo8Qz>Mtk7 zA`y4l&)~CsKikg|ivQyMEX7V*1npXV zZY@HDy{$&ye)gSW7CeFM9Xru7m}#AT@zVa+sj`RD>Aurt@zMUg+;H}JoReb1eM;Il z$!MPqWLt=IA_nP1Oq7cREJB)dvagYS49(UY1WXD?LZPRvm1JO9H&Nk`B?VCjMh2K$;UZ;fF)}DDWhnJ zbd{*)iux$UttEEInH7NT#Ew*@M%gj}STR$(5jztfAZpGdNIzplEeM~|&ggd(>`)KX zq1+Z>BSm6OAg4PgNzus)C>x8kkctNeWpfOa?}yzm5Lu1TSaUGQ47W66sG=HB9>MS} z7b`$og{y5Q<4M{LE|g#}qKJ}~jS1RDGza=3G;Z>UZ>PGeF{3T*egH#bZTVldmQw*l zH3uyv2XML&gWMF(OSlT;XnSp6fB}e9Q`$_LIYleNEXtjDI&9|#R#II~c(v(;aqO(F z6O++mc6=p{nvhcL45fa_4s@J@6&R<~IAr)|Es{akSi#heWWa!RB!f!350Zh|vDXbT zn05%Qt&oV6w*EJ8*3cgR9gq&{QvV$|Yc!btJ0L0OuK#upJt8G*KF-;0Cv699Q_gYQ zK=%WYjIPpe&!~JPt@a3u|3U@_k|fQS?Ful3Fk#9oSVvgn`qFQUxrKhv0;564IR2>*4Q1J>ei81syQ#Eh{0gq2bg zs(%YT#ol2g57oV8?xKLXWP;WS>yVo4nCxf9Bn8L-AmM&sQh@LzGo~no9%2B*a{I|D z<)w*IHOdf%vju)5mO9#uXSkN*570VUal?=D^~-tE-LS%hVr3Xj4&>vr3@I+f7hp1g zPgrz_=u~M-77$u5sl<5^54a+6huIOZ(%VyVV+)NM#!b7mp@|{Tf0z-hY}gg69yJRF z!aCl`G84vGXnbX6Hj=1dYt5(5z>FWQn7Wd6g0=#oGaYMrCwi+!vSRLxKPl&~pMcin zovM=NlTPidTj6?>oqACwwg zbF9-=1k_&M9P*v2M%=z1+yx~^2XdY2u^%Sp)xwTS=s=!Y0#=S%{?`v%U?2Q(oE(Sh z?|~kME4D||faHMg2O@SUYDXkS{?6onrV5l;Yp2AkqN`}#v86gP(@V(1t-gTUP8B|T z78Em;yeQkGtfojxs;RVGv@1-a0Wh;^$=9v|Ne9CHwz{1@*y|l136r+CtocTa%hLB0 zt>dNT7g)j6emI(5J=8qltBqYlS`J6>#F7i59S+RH{?`x51l5uKHoqtiQRxLFAI3V= z+wKU7>!eM_=MrTHf0Y4?I-)qP%GIP@Q&n!&VqfIgb+=QEmnB*j{7xfaWQoPswFh9i zN?$IX`6r4INfQ=?wnn|CPDDo>3dyimru<87597a z5GSYg@E;laJ-7!gZI<4ymZ5)C=4y_<`s9YhaJ57cOVSTwlR^QXk;MzGj52t2r4kjP zzJ|g9F5X^!#Bu6<84$p}vN9h4X0Z$7?pCi=H7R5@j(ILpV1suVi@n7dGx}DHVahjL z4|Zq|Tj48(a4Pa|1;C+Dz+?@;A?nMcDPm6U1o8&JD93`J38PM*=5cg9Zw@0R!dIMT z3U)>JNyG$7e;6+XCM(z^RN{y!)ADK=7Hvc5Va&f4!aZVu5(cniI1tc`ZtrJkBNX~XTGT*cY|p=Vaq{HR zpL&f;2{V=|=2@-)H3^Ogrm-5{Hi|rHtcId9p$D5}9n|~v#O;Uu(zhO=6+cvJ8Eqf2 z$kq0d{}GlBv{1Hv&VD{sv27jlkiOaS%DiMrzCZfc(^pq7&v``nb=r~k>oz37Qe5_< z=US+N5Vl?=BwBI7e(5-qx2!>-Fs>~gnZMaN(Hn|HZZup#RSmh9S6u03heN4dOm|ROI=kL!cJym7BwrpdTXoj}m z{qpkTxs^CG%r7QAoLV3!n1*O7hy3f)+w1G2lQSY1+4#yLoB<3D)r^KDPs77+Q+WnQ zttt#eUXyhdAcoCd6xK*divu~y)_}XV26SJofx#9iAJ6k`5%yMXb15AT_D@@%a!hFv z=%AuXLU`PW<)Q8Rr?ayUe!D@o>l4S98DrvIXfvyicjRF4%P;_F^%aq#9<*8>3&|!^ zSam7P4feG63F*(q!7rOS5}|mb+z815oNn^lfaZmK7P+0?FJ_T*SMMNA6m5iw;vG$t zUd1oLD}N}Znh9dn7Q-cWiCNVrKg?o^6V8hP*)*gf@=BUTy>6#P8-6f3e5jMmO^04@ zl7Y={{d5|Fhn2;^a>H9tvQs~BfU@U>FWD=u9L#H5hSM>@ZIviFpos&nAViNYAvLw|oQ}tGeSUEnP-iEnJfPYaxqf_C;Tgw>EOI7*@emEa_6{4Dj zsw@YDy0rvzdfyULanU^nc_gE7v~8d z_%4v|NzuT|(^uceuf50e%Ye*H-I_M69D|kp${@}11%=HLCwuCl#<481xYL#o>Q?6>8q}V0UPl=L6IBA-|I%f#Asb2agpiLQ~x7 zO8SBw+wx!)<51F*-i%Y47fZcJ%uUgxCj$YaoP88)X=GjM(P|>)+=N2RPk!V+UNJ!+ zLg(ZCIwLHbbLb6jMB5``StLtJ=XmSBZghEhX0y+gfzDs;;jQNzCtwqQL+WCi;f>ih z+^y#p#AJd%Oa}bZ*~Ntk4@Hhq5Xn>#yf|hJNq}k7`ApQE*lo5R+s<>a_zgb@dJ?%- z2I|<8y{S*q0VgJ#A0JOI-&)E79vMrhSM(-P{^w^O{q0wzM>TeshoL4Y_yvrE$uH%E zvwWHbe}VFi4V-U*H!&RrU2A>nOh!g6Qx$_O$EHhu0`%3zZC2pgm>nPvT)VaF;|EpQ zuE@r1^xX4fl6b-rGFd_d#86>`k_fZw(M>5@+a^8}MkiqtTl3&Smsckt|Dh%M&rCfvac~lBn@%Qh~EG^y#FLwUIhE;TY))mr-u84K+># zQ5p}M7ueFYHs{yxe2nBtv6Z)O)C+IvPrh6v?E@$vd?SDXlia%Nl zN$0BPO5fs1SgXE;fviQfp(QJq3p7DEQNW-XPg&*HfS1%piQrj)nW!a$_PiP>V~@d$usi9;gaQ7M*kSvw#t@C{COL9PpO3Y%a&hY_Vp z8)4$73eys1;+~R(D3i+A^Q7sPfuxH%uP_@FY(Qv0>#Vm6cD6aM#GNY=&`xyJ6Q(p& zpb^KNQOy)~54ST;$#7@dy`5Ri<}hM78LJM3oUfCrP%)MfvT* z3n1#7dM#LqWibYjxKtpSn-{0Qz$RR)J`Q<*7zn2vnSmp3Nhi4!{-A7gzZyuh+`Ior2F{zdvbs3A{c!g2(R07+>-EDel-ucu-f)z`MOyQq{MW;{{PrTp zP&sYk(OY*Gk#tJ-Vr%3b#GR;ZL9z5G%~L2nf<;4jNN4oJop^{;T~+ylMzltN?ZK<} zcfR}U;NUgKTC9fhYX4-1{QUuXR14I&I5@fUf9|wYDa;V;2t6_d0j${s&M|__5Z17LJlnmCMDXTtC-o^JoH7%MJ>Lq z7a~?8!oSvRTKOdFIQ)3dE5VS%pSHM`9o%*GW5s6Kjf4~HqG1y2lv_-?*2m8uKRvN# z8Wc?}N9kABxu|OUv(A^2?AQX^3`k$_2{poUbr{f%gmwjYC?CdO$Sm06;@mNBm=5lj zd)&WC?Pgm-Pb3C_VM*9yqtV8=6-!7nY!Nf)a7lS)UTHmDLxRo~CuPuww29anLfS+Q z>J_|~m;o6e#Et4g^ULNnZq#$G72LDGln^E<9ju0$zSI`c-=ENRkh@aHpRO!5o^ES{ zF%Z1n1N$BkNgHBN@@S=cGSCx30Wj-?zYb-FEJ!P$X`ut2);SrT#dX)?V%_Zn$9*8U za&7f;q^|-~ys`Y%5_3!#uoYa)HVAyFFApEARDMx9^>dgCWh|?{@1gusf}BjJHo*x3 z3=uVCWKFizwsp=U2Va$L*h(b?Nxx(aGjohw^7@wTUbgEj> zGM)^FCNBa$gx#vaa4DIajpoB*3ra5L_J^xr$%=H|=*Cc0U?Zy>R?+yPc(4FGft-^n(g_N=Wn;Q$-FpXC(f)?jFnXhV1?AR_$U5m;V-9pv zte^h6K&D4-=FvT)zq*JFnjRxu`4`TsPmEWukxSc)GXk{a!C8?ZEY^`>M)o2NrGRy! z8C62Uec}RTDd27A0Jt#I0e|_xkYe;&&`XgR+80)K$v(ZHWh9Q%*J2`g?d6$NR`$W! zg-o#M?KNp+0TgcNteI@a73E>zx1=uV(&yF~Qq^G(hRQu>7XMy2A6o=CsZ$V_3Ch+!~S8=Fd2+DGT# zpZ$bTrmd7KupAdg#>OAU-6Rc~vzmNif&@2$c+Z_^U6nFUIFwu2ARtZVnk(ML2SKKv zX!f+7CIx~ES+}BXrH~~uhOhpNeD_0StsP~o1PS%uNr0plD9{ivWmKubV3Pq%+FRQ(G{a?x-cyp}>NO~fsq$2-EPU>5C&N79|FPgoa<>~z4&6_)h0Tp#Nkh^C&M?5rsmfAm z%QNzsEfNJ5oGA=B+O2y9AmtYSu>CC21LVDECgjWS=v~~bOismTj$G;8kn3m>kt=s> zw+SveP%=AQdT|;ZaNb1O?iEO{bYyrc{A5pQ}LKl=p%Tnx22B<*JCR+SGq9_9ea3Trx+ z7Z0D_JAU!t+h@mr=~M7y4DB=@!MssN^nh=Q6#e}mqzL2n;o~`qX$H^DSUs1^Fn0*p z?YqJ!Qh_Y7xaEp1F~nIExjC?{c2r?6%w*(jhRz1{Ag<5Jc?TF7>I4=0jX-V(vR;|= z!b`IA+RKi02CkR#d$BTuy-;o(zLdS#MI}QQXr#|V$I%|CTd$(fBNW_X#F!ZgkFpRa zE50v#$Ja?%S|KFmff2#0p8&DhN+HQ9K@LWX*o6GHK&&kUr@E~Lwb9`4c@V8f2UK;C zB>e0R*%3as=ynsgPGl87d|>|`ra!+W~^f)u0C6-5e_(qucHmJ?xS}g zn%z&>CT?k+2Mu=yRerFOW|aETi~E1M|ETHh-hTS}!>hz=R$dNDE)ijVs&x@oRi>U|7k8{n0d2yheW8s6FJpJ4+ll_nGq9?vvLv7+ zRz1c`U8PA~0!JcL!6C&S5p?n=xfdPToxuM7`7@l*iaURdzaR+kDbDVto~ZYsJo=UP zQH<~D>(}Q|bd?DD9wwR_B#iDr+j9IuUk>2)zan;%P=zGq^?6C6Y9XykJwvn zNJ`N%Q{5^|=ZJK+pu||=zL8}8Q9zQELLvYL-o)(JMR~YV%x|5P zs3r)iwxpN~o3WTxL&Tw%sHAmWKRDG*4J$?Yh?#T#Q^r!J>;I&487CzEZHekHGQ$S> ze@O|UmGXbfsp+w5^RCK$OvO?+jVgI%St~M)E6%rt(tN^c7TQMWf6>ZSA{eph0 zNtqFDJ%+#+z1GwfQ7@O&6=U=Q4Rr;@1ue*M%h@QPnvODz zbU9)4{jD~XaHeB3u0CNHy!@P_*CQajs}U+B!gZlk-%VkWjvJ)|2I&0)%Y|v-;kPgD zKe=~&^5DhE!~gr>#Z%G{JUxDL|G~*RMmU_x`4(d+_}c)oAuQ-o#gPS@vu!x-bvrWmO3 zKOkb|0=`bSaGUqHg6#^|UAcQq=QFcwN_Lj5FUIf1zHr{hSulvtZ@qr;*;|X+5#xv# z$IaCT;|OuGHQqbE(<#WBFNBkNWG2+O$@Zgq1ty&8KMk(S0(~US)x@iti+;caK zE3Fz6V!dQj2adp$L0~z8f_6pb!8)*94asq}+^G@C_ur{aB(F9GxJB=V95PJc_e+^>a$8ctNTg(Vl zFNSl}qR2>ieILCx(NgL^$Lmw#j2y4)%5V+-Wro+m-V|ge^NOtadU{&nXU`|n(ub^1 z6+6)fU-Tt5?X;@XfC-w0E$?2#w}{38Mdadb|# zaQl{u6yA?+NDJ%eT(>K9u4kR-+{*?B2UB6?=|Fz|hR-QuLJz{{x+#3FI{}~Tmhid1 z6u+$Ic;%4reW$>?56KAZoPd~wbM-^{aUAC!Azls-A2O@De`&PyM|sRFLI9R-(|0@J zpe{Ggv!Sc=x0mvsVf~@$lpi-gjv2nbZ%%)tdbZ!wn&_UbpI(X{Wp+2XrtIc<6L^F9 z0I$pF`X@Bmhdpj+ES_};UJPd1}dTfn>0Nwq4A!GIT5s}%Ops|*fGjw|1vaN-jHX0{`9;QL$i z)l{@qp5T*MLP-b^D0!3`eUejX8-22T*?AYJ3Z^mVLGUNV3mN}Vg0fA};Fk#+{52e> zgoV}};sN(wp4||91j5(-@WMPwB0{n?se|)01NSVW)DZ*vh_1!$_5B%X3M@eZRpt&Y z$td?dQ6e{##o&zGN$v&96U>;6R9WkgCNPx&3H=&@G#KvBI|Z{_Vx12Y=d7)w2!2JEGbg;Eg4M{&04o+Z=?1 zZZlZS>REHl?$89WpcWgr2SmJ=aYh|bu{TC7nx`l#?4{Qhj1}kE5b^2H0TB-;i9H{2 zZ5k8)ns0^0_Q3EuHs-ElV`3ZMo+gylK=`QGl%gOL7cA5v>U>~9rIo4T3zTJ(xC1j| z+kJz9=MID39fUyh(^tfBHSiVacuF4iMa)KAB~XbD)-=!;iS=KFCKgj0QzWMj1hk%I zoU);beD7*xPfmAHhdq@+fPn0T#pD-%@9VGm=h4@j@r>I5y&EPgfd0*R-Uarx|8yBb zZ5X$RZcrW0eEoj+<%9db(~)UNPgQ=IDS49-EvpZOA}meE%6J5YP*`6mmQextY5(2H zUmkDJ-HZgK1Ep!szumAqbjxzUHstcV`%j)fee~c<8(ztZL{@q~6Dw_xid3~vY}s?d z;=PY;3ylnHV9~EUH)7}+9u$@SCPq?mGp5QnkyzSnoJ$L?yqJ1%ytYAV`zcz@=gJn1 zg0=X_mwLs$rPv`}8Xce498uy1>mA8M zh9#1KKv1N%S>YZ-9^x^~iGqJ-lpfz4s)*4mPY@+hnc*H&bnBiVTgLK0Lve7}61Ez` zpArnCc`u+_;T=OdMB>f1?6>eknGrEECB~!Z)#s#VFwY$SlOfT<`+#abR$!3Y$~MSu z-ZAX>F>0#*(B-(;PpI0UYIxUPM32AXfF*BA0+tE&?P`Q$Mk0d&F-W^9NCdC=HXLo- zmK4>|CRVhT%H>4wY?DZ~-4Vx`rij+yK739TQ&m1fRmlW9l2h z_4wYi``>)= zC)cW9-Y7K~_Eapk=yyDG0 zvue$RBr0mNq^dE|CQX{_&yFbgXZvk-U-Si%{)z{;(eH9t*0(kr#=jbhq_y4N-q_dDMD4C=v$)%ao zBQF6lJNz0e){SL4;U?)DYzB$vk(^`}vN-=%6UG4 z{CqFvn)leGRWb=mG96NBIEG7xiVi}5O;3Se=;33v`o-1HM+EQd!S&Ufn^2A<*K2{~7NZE{Cl^=IEF^=r&HW2T|triexMzj^a z+s-ET2eX9;;}uMD6P&H{Icv4&Wz3#Ff>;m76cv!NOU&K}cf%SHk`k12`7w=r+)(9S zV|Abr7?ZTzAuk?Vd9~g;u&F}{^U+FWXsB@jW?-8+(xhHpfYv(p9aefaW{mW)$*GCf zGo@oB?lE?&4P`!h25c>G6UXM^`oPU2lZ7Uw)BC7-kRxZfmsO5DU$M%QW~Y(C+e@dQ zR8U<>(GmcqIa3^qxwOmA+!;OSLPlnszX>H*nEZTiMQ)|oj*gqzTNUNvN8Y4oFym&- zKE@?9c~#^2#;vHx1ne*O4E;@Ekws2(2o{D8pqEg~(ImzQP>PMjcz(wgSjF7Dpjmh?_`Op+HuVsb3B(m9 z@dTM@tbMrYtBwaKz$T07H`=Ua%4RwBmKW?`AC%aTV! z^6yBIUPP;i*=y@W83e$L!N>7;Ng8Z1dPR!e|I9TBHf@ZM3_5V$dU|~X?~jF|qm4Zo zuA_E|Z7QF)l3EjN^=LC{y#>6x5$hb@->9r-?C^><+xW0qz&wBH4dOBQ+DA?T)e>RmAJWLtujlPV90(HF33m z&=sKvcM>S2D;$u6o1B_%#^r{@^D_k`##$bh@CRL*{$8A&##FPef8m~UmRYvpH&@D| z>iPhlzxt?Dx98Ft@ypz9`Afo$kbc9NO1&6jF%62qxT;xKPhG#03-bl3##gU*?}=_% zaPXqC>GfQ!(u$rIi*-Qr=u|k3^L^#{9S41xX3Jc$rSxJ#%zv4`)tAXtk-IUH$lf$J zLah&JpyWZq^ElH!eR3Ck-J#kbyL!)Yx6B=S_Yu70e&%i>!?#Zz8`wvo_!~KEhY3m( zLuxq-G1a)&&5M`n;>DPG<@&vxh~z8IO=s2pN}M&fvJ#AblImuLK5{xF$c{v#Y!8xH^6%I7FIjN7Mq$an zC-(0b_U|M6*Wc&lptemr2A8S0lUyDj~ANFlhuKPvCkr{sZ6 z%;q_Hapos^;67lQvopygnS->G4-a}^s*&TM+1mo%Ep;p$&=H5cfcH0}WC_@y_iP!W zY9IpyNG7qEiQj#D@7eR?dykBMg1Ai=84O*7419h3;6aOqk<#skF7^VK0-_c==lPB* z;3_3t%r!y_+x1-%``kv0VFm~H3JU2R9$u2!)w9r`$~X3#y3;{k;f_fjSbZ;FtDL16 zWUt_07lAcwhEIxaMrjpZ6u*|kvvc|o@6NN!)0^AY zJ~XJg+~%V0fUp5R8R5WD4#@A=lWR&{dU70BuITO8XV z+_4)Ph7Fjnt39ySP}4avDY8nIc=*{j#}7`vS)=ZbsCWyQcf-X6%#FZ)wvB@HzUNfE zkPC;UCzZCVsr;Bm{MdU4k&}b=M(;5(OHv#a&?UpQ%if-YAh#7p7Hf{_dQ2u5+xB@_ zYR#q_`P$h4;}347#dl`4RdLlKq6FtLn3r*BCo;E=hUyExmcwX!VSt`sNOf+Twnm#n zHhX&Yug#fF7=9l!JA)&nf>SxO)Us$<(TLpl(QU5u6|x;UbSSiacFG|7=qS z)_!?~-MDb)=qev?16aOuHm2ei?><5MbtG3Q5*mK z)x$^69vp9mx3__LN4%ZG{9EIp`%hOF6RonUY59KV%U1Bv@{f>c^t*4LWKV0HY+$4J z16t&xOVGNycSd^4-b+q8M|Tk~#VHcH!=cfbx#18$XSdvONjes|KD*~Byo|fF2SQ9> z;+)iKVB#=mOJa>xp;!%9Ha7fclNC+o61Nq?Di4MGRMhSQ6c_zY@Db4m@W9qf4cRI0 zyp*NZ#qDMI*m;09OG4yB`_E+)p{WfOVciX(!G*8Og;*q(w#{Ce-J+;Z%?N^af>5}j z+3ib`J7BDM6KogqM|bAl=kQv|MFZn+nQYz4X-h?JmKO^qJ;`P3xgRZDl&a9C&WNK|D+)^UNWe8|RllUcte> z6-kYLz1+6ZU%8-G;)1k;`Yv3{2Ey}FeuEtwXoX%g<9O2IQy3Sq){)uGIgaPfAC=_^ zL1crmoU07yX*TSw8jc`t7#=LV6zijACceb&xAq|ovIUe|AFBG&)`@CpRGoD29?Fc> zZih~L(h7|pfslOuQQ^6V>q zn?PCw-0uAirG#3w*?i>SC}T#)@u(r9C};JK-$p32)EstbR+xQ24P%hhi2McPb;;nH zw6U;pOo;2D!Y;u^S+_gceUz06ulX&3tE+lhH-d?B;9AW-_-CN5nr+)_F(oSNxLnXy z-s^UDA8My7+-MK$G$RZPj9S37li_EH+D6I7`vaF#4?mu2gCo*)JftORKV8v3fLw!$ zoaj7ad#&k3wjZJ#f`L_%YN%>}NAeoEHJ-oz5N|2Aa!AP?SOEN+ky;}@=s#Io`qw(j zs4wo94^NuQx@{fC;|EXIxL_xQ^vQ+|)|v}L)CayE)>%MPeL-#E{1n(Cw+Y!%X3A+a zC3-SKBq{fPR_T5eQ(7agj0m^*P#u&v3L0cY;qIoxX43!4nqk zJ9jNelqOJCcOk&_Nc4!jUb8iP3i+Bq#rrB~i&X&ie`dCcwPBt-`qR3g!hlD&0eUw? zn#25CL!{fx)=ro-pDYo^$IluMaxPQenOEE z=znZm$g4yXBl7u~bYmD)D`_-Kg$+C;m zRCkPW>!K=bfis8uyQ2>xJ{kSv54XgVn6HZ7eDqv8f?RnX`&H_}am>K+##sUEcVi~P zFcex)jNpghm#50caqs>g!yPdIdh6tta!|ByuSs?E;o=rutUiMGXjmyzzjF*GF^|US z<=b1uiQ4e4HF&9={ui;A#JLtsj0S3*F{lh$?i#e-LR8{s2`^H&)Ic4fo-jpz1YPQr zVzS49lz$}uwRRH}U&5rpB{5&s?3r$yIFUFn zdYaFRo`1L^j{oRiPhVZVJhwm)EidVLOSX}`ZBqQ(c;Ef<^5eO9G+O)m6w}A;_4U!o z*}0`b(M@COF!{c`xO(+{Xxd*7IY$;D;qrwsd#2N^6s7`1+}5%YMD3eyG&ejHu|Yl(nNAdscXXz89%PsSIS`X$B(~U zT>a?RkI%3h822j6&~$)-XMFbac_@!NhTp#Y&s$>6jAb4xy~^v3txaj}S*$z2Db!w8 zH!|DDG^RwMM}>DtN2on1`}0idon(J zC}KVxFd_qjJDwIMpb<17-mB&GrVN3wpO#$D-SWROXTpMro(Zx+(KCo5t#W2Q$N*l* zf^_UlS2?#sJ4OXyhq@dcuTT{ich;c z)5anH?g6PMm(dr{S%tQ~vIUgAb&19&|8PxLN+c~enXId?Pu6s!nm}^P&p+z!2AWRH z6^=DoH)2)Rb%fU#4kP(j>$aoPIn6*^`8P0a>pCKT!H{f+`B%O@e4CMSjBQ3%q;nAj z6<*R_qVAGKXYo5Dh21j|$sN^5CeioO38dldCU%Y6XhsP;G!4`-sXlZ|CtKOT;BPRj zaux9mkVoHB?kc>IKjqH%dro1}D-0;%?wIT$!ak)We9ZllX)(Z2e%$25L;u!=ZuSi(T^1YX8WYzJ4Sv9^kKeJ0sGd+^GccC&78Y5!J_~OipS?f*_`QEMw!KxS zF?c`7K{UEFeqj3L-aML!vY12JA`%bi*6D?Ll<|U*5qtGH9EY)yW3iF?ocAn=2d}N< z#TFbI!~7JGW+gfl+iO{|42LZ&O=CGEW5jIwGlC%18|=wgbq_T6%4R~)rJ%>@;K$SR z3;DG9&yX8L>y8_XUU+?Vo1R8eey%D&9ZInN5=K)CMjKNS_jgQIT?rP=hLPY#dqS4; zxt~e5B_%hGH@J=He_O{Jk~8KX@rDchgoD?_1B+bz$^xnU`Z!(3xJDVc#)l8uh!Z$= zVs(1WPWp9v1=miAHP7Bqt$aZ~;n15GA%AE+L{lCIrrY-1a1Ho@_mAMo?34|(N#o|L z|E)Im;9!Ke*NAk`U3(fNsgT4djpd&c%Dcv!U#4eLM&iD)d6KwzT6#w%;*$ack%db| zeed%xPBu{aqLt?`5iEk6YImqub5z^ve3iIic~AiUn^F2IS?IR&wWZb9;sTcD5@C6{p%5}k9jwpOExc5O-8rTu`A^UO0$rZCG1nnI_FdQ_=1}n+L*Dg5%ME*qoo<; zG?GvtM`)DC)NhI^qreP6K;WBe&$`I}T#4v3PWdSnnqTo(>1yuqUKXw@6hJ zZ9IBsmbCwR5`{B+&CU*@o0|lZEH^9E*T{Ws%Kz9sQ#C<-;u2L-axX~I8I}K%u-W$a zJ_PrKlw+Bf9$re7Yk{JR(V-*G?s;9HvKmlkTPYb+$Lr=*hj#`$S$x#FZ>WxEjswLP z>%zg(^5w8q%Lm|*%S@}sDKKXN;WZ~h-NTPBSdrX{SvKX z(Q@Y$sl?NW%3sA76)gE-tOhVB+b68NZx;Z37fHo9%2^b`}5y-u0TAPRCqf%*}BXxf03_@JC0a7>zCG|uX(Lozz?4PFO`;KWUgTT+ z^6bs&?Zu59HfOvIY1bUov3m`$4+S-o>q4}2rCENW9G#dm1jm{%oAsI3CwM_m@RTkF zWxAI@Rrd)|2%Qze{Yfy-e8EmGS^$hJ3S z4#QMu*b}iP$P;F{2pa5Q;?U9+nJnP~K@ns>`RC?3E#oohz4=;B0om+_^Uml;7+YCv zmqBmWBA&+JwYjQd$h51t84&;5sJSn6^P&rbsy>K*{QGD$^U17j+#y?XPQ8FIohxl@ z<^J(X*D@1a-zeWAi9D@OCi}9rn}u>`rflCU?A|1hXS+sFTKZ@^c}%ZJY=9pTtZmPf zEnflV$Dhux&;D1(()V7rmZhIab-b^oC%kVaGq;w0rCFxm(#sJgEy@bVhjQv#7G;Bl zPp7qednv=C4R6O@el6Rp%|;e6OYg1GzP-Q&TiFv5d4)rrtqZqlVy7AsN$5%CPGoJ? z9{nk}-_%H8)ckMPu~ZAmv@?NRjYR?TZr!Z2Wzo^7X5S9D+N_X9(KP4}#XL&C?Y|_2xdH!hAJEOf8_=EpRQKq~6fAoFv+i8F8nhG{Yfu zKs-f9BYRF+IFA`@bljvZk2bhJKX}mMnqR2TC*d4!1NCkOxB}|+m7Kzn>0l=RD&^1-F#poZ$c%8AOKkk0$-hKYvX}XiRb+&RUYaCrv|(GX0afg!SINl9 zohwSbajR=)zP)|_Qr_iqf;A5zg21kSIy?JdLfRP0vw{naI)*u3l|$U4)40@Xx9ea8 zXaT=01#IzYP~_F{f9!2R;2TcAD%=P%s!-_?Wb;;Lka!3;SPHDV%@x}`?Xg8SBda@fHe_1{EIjINwBi*97R zUiUDA_ocAYC&cKp89pK^wNk_AWL$dm@Y`;KXu{}QK)oAAFQDEWqxXh$GmM^~(ca$x zqt9^XmduR3|W}>rM`MuSo}Ia@W8~sg5t@ zSM<$sGdQx91>Oei9T8>@_D=a?19#ki2ral&2umz+F{vBmi*+d%^&Z){Ltt7D^hnm3 z&m+sbGj`m|JS6OxuTlqg+)JmKXcBFAX&r0-SM0jhoY8_giT}hJjR| zS<%iab7=H&nd3P!BZ{E-$Z(drwQvD0Ht}@9sRM4ZY^W7KXF~^EJk^Qbh*Phjcbdt~ zd@Io@|6<)B7c$3FkEr-47@Zkif%SdDgTbVM+KXME5d<8v!h#)DYh{|!{o(!o`>u)i z)dqFfcf|W}trOhUI`Mu}iP&zV!+{Ie|9&;mzPkM=mA+^;{%#*KVx4B&r4fI_rI1L@ zZJo?AFTXfy*pU;^tnF14M3uA-@{Y5&6asnfwuA4iXS1**UvPGA2hpDPp0k$4gL7Tt zOxAPWOJ9tryPe{_Gazw{kJ3njGlEHDuz0Sw_faE%squ3d2R%ZIi^&C#+q z?LBqv(@)CPuIaDyOff#7h5AlN$1+QYEZ?kmMty@1f@?bx=og-ZOUfh<**>&V@u#_vof8+3Bpzt;I&(# z*!B~=6}IfRv_zr!;P@4t`keGNM3KCDM!kr=0EJW10tG+;)oz9;l;jIosQ%DZCo696 zvD(`1c*Q10s8&SBJGb**gz$LQ#6hUuR}#XdaDH*}?8(zL3d@*3aSMpImA^fKVh-?c zCj`tf!lzr`h&3AP`_;WiC(WF0+s1%BJAU45tWeZYMbnVdryDxhh61YOEX;R`c60mC zOK1bO>JM$CE1BC~CL0rNiLQ(EpAja>#wW%N6Mix`vzJRj6YMKuzID@>b=`oI*KbvX z{$Sj*ZiaHsWK=P|Wo5@qovG9d1|?HoCt)hFkYAK}cHkW;ZWI#Hjsbtq>JAHz6Js5DkZIuu4Saf3aU#=9QvJ`kEaA_*h9mjddsk=E{OF=$(*7d zHX&fLk1Ouq@Zl?x%q8`T>#eTOU#DW}J@9iY>LnePie6Y(Aw>=ty};cubTn6_eYV1! zAMtbV6=}iGv@!3-t!we~5W3l&e+BtgDaaN*@+Wl3ph~biplo@`7eDNQptk^dH~gGK zyn!L#Inv%xwwyTGXr*nDQbK&^7&}y&Kb^T?hZ>q|R&cyh5y062`I4!dj^gr7($1@e zB}Rb}X%JOP&35#b{#1eY+{Yki&|T$HOaqgO@2IV4U|=El(JAZ{Jc7?`LMm~cHM7Z^ zY7)xx5#~j}*~et_=Kkp$ZgA##MD8XOt(LxtUt;KZ9?+Yfo70ePT{%x#?>b)+%f|(Z z`9KL;@LHR?JRp(YGttB$YGOpXxDNhoJq}S8KlWNj8+%3~N^d&Fk*P!?6hpoL&4c^R zd|>M>lcbTY#U%UaHAm7B zl_UrXRKl5dry3cFEHy*ICgLapHsLa6g412+DPU^|d(7DyFiIP{Qmjd|HARd9OBI-< zE~L_XQd+PIZOpq1)2+uU@OWziCHIY0@Yh8jTp|@|?4CVYQ_v#elr3Q14X0!v@8&WS zxR%}nXu&p-RZ*VhIG?Q^GYwXScsP{hR-HcPz4?Q-dADO=8?O)JR9P>@M1iz;# zId%=X=TcP{>gYZ47Sur-qj{&oXf5g>!8qlcI++?+YI35I7j;i!&2WrF8iS~%mmqKK zi^mV1ee>i?{n92*w!~I;WGk3=!yP%uzct0vR@1ec=Bcs7_rGo|?Y4TSulCs1{g$c= z+roAK>t>niK5ZdoiV4#^eerOQV^m`&&+dJ(w*`m|HVJ*7;YOk*u#Ufej6l)=usHnD zhVuz`b0TK>=@*o3Td)K+(6=psZDA5>1Wu;Xbihm^f$^mpgeqN`R}foxErEGnrlVPLRAyx+>GrP;M$@_%cc-R+%DEAsIF*6px#-d!7!) zz|jL(bG;c04(L|s(2%_X;>e_r`wK}b%`vXLbNuz4l{xs69D%#&1iw=QO^ei4LZ-nS zRYRPk(wLwp9p>#wbva&GvTEXlL)JUL6-`ScchXx49|7{F6fN4lUnQDtx7FdgA=iiE zBV$$sO;wA*xDoU-(aj}J#*&)9cof)NSg8hzFtE;OReahlZ^25Cl}STo81q)x@~zxu z);Wn$OjVSBW-zPYuP#zG34WC$KrF=drPMHyA$}ZlpJyW=UD0MEK&T=iT;2*;ux$i+ z=L+kakuod)%tt`K70h_U&AbAJrd4a8Mrs3?Q8rGI>^h()H>WSpFV6pFj*a8-hC{$` zs_>Moov-h=`i^D2&&g&q#=9y1%11!AU!PGu<21oB@*$=4^8~7uYoN?pjLU`)OMi?G zk2BetO!Q{1U9+Fq7?bJrAa8HQeqtyI3}xd|%9;GLuo?uRSNjPAh^q&UxBm}9C8<5!awKVg^>&nzc@dtwpKXMg+OCA zdxD0W$9Y4j=lH}^JvKEF3HU0o<5@JY!2{Ko4m7jX06N=)5ecadVZg`P2_7xV<3KLZ zP4>`2@kK-fWR1pQJZc+91`jTr#6(i1rGm%DLD!7K4seacYRZ)mk9afNG}QtfjYsor z=ZujS^V6-TJ{+h7*H#`PENYzAI6vfZhvtRz6~xAy(~ojZUUQyQt^<-;G~hf`+f-y@ zo6nK<2$m_nw8?_C`ZvkU`6hS!KfmNYIrdi9CXkcf793qua91O+8XZP}^>RDOB8CL6b+oZ( zl^>aLVX!i5q{Q|=K0SWWtom2*!cpOOv<1XF3GD^Izd513_iVKY4$>}8uvir{QH2EP zRYlAcJj8pd;78RtOO6?1QMk<-;c%zIDXZ6r*UB|Y z*6T!IFfAylpph`IVFdDw7LLk6BjLluljOlpQD_t5jY3a*`h{R>?SIf)FeIymFLM`q ztD(raQzH`_z3MW5|32kgrr_4WK|P`bA#k}WqNHWJ5UxNf%shHzJorcX7ChAdJC<)5 zQgd~NNZUcN>(O4-xj+Yx-@^=%w&U}`0n*I`nSUpAh;09(|@{JP?BQwamQW`vWeJ`Bj~WqATL=hjs75R%@IIs zl)a-Eh&Ta@Ebp=+%|fcF{;;-8XU-6Wlq3lv)BMD8bCZ~Qn~NYtPqUgEBW}l<8&a2< z^F#h>7Hi4vP;F0QQYPIg?te;-yandEY0RV$6T4Qd$7k~qA@N6(0ZL#jo8vj&SYCyL zD;EZN!=Uk}sR{?rV?gMbSAt)K<{&wUg-KW-Xbxo1)+AI}b#Z4kUyM7OEcv`=6 zRZL>8QV;nEz2}zWq9QrW2Zfq_t6F7kG#}#2$<1$dz^h6iwhTuT=7YDaH|n#^*=TpG6g{92$n_D-9sjojKYG8FFJu)TL2`gQ{e(ImDR?n zy~9ZyAVsSHh%PoO0HU&?E5U4E8>yzpDy@^RjR2qk$QZNBGbsfG!S(6;aP{i+$1|@j zUJ30HGqBQ-2jAF2Lkm|AAboGer-jra{ev zXtklN^c^D0YKbQ{B9-+Vtku!To}%Iu7da!51c(S4nYm*~wE6nclP~TyJst|ZSWKX} z4amF6H3i7OHMwS+>00kFV9a_=jVR#R&Nc#Q zW?VAs8+8+FyGht^kikCPbjCbqX%?dY(k9RbDXc%VEmBxUjbrY!1d~?g{<|yc1S)!N zf%@}?OuzEzf9v+LGMmS+qu6z^c;8=M z{S*^F%8yi9)ZnO|m*2R&dVOZRKdR%9hAO<3RlN7FQ7xPCjHDnC7UOAa%;lV78FQF# z+dW09BqXtOg%Ju0PtF^a&fIA96o=og?G1#Y{{l7%h1!^QeLK>vi9`E7~EB3uCArZAzdjUVCIM2cN6z6xpQf6Ol^#eJd5M2nKQW71a{G+eu zV2~uEiXm4q%T)2ibHWvTM$};K2YxAyrj$?0;Ww7m3_i&(UcXW%!Vboc!duh9-lNzBp1t>*v2gY-Vq_>0B;ax7fyX| zIJ-`L4#Go%I8$hDEh{$C`*>cuglv}W)s3XZj3)%JkC8+!NOEXeee8Tt<{H|GEYCiA zt+70^@+Sbq^4ybVcZiNQOesH5-l{m{n_t{5mxr$G<-)~5^Ud+kKAe6$eNUL~nZkBa z^}=yXkzk*_t8~7NT-%O)T(bwWOHmZ!ZB|;(BX*b7aGMZ>kowOB+)N)J|v@8zm}~HFip9&K#BN=61?X zHVnGDKp-s9u7VNQxQ0Z;yA8-YBHkS2ctnLTq8CGfu81u&17LqRTM%!CI1=X-q0w#( zIJgX%)tdtrb!H*(L9!VBe)Ris3z`dZ=w6^r$Tfl}5p&eiX~3;}>69rV>viyj4r;l1 z1iXD zc(2lg{?*IVSKt5SB`#kJ<~CbIv8ZPsUF9et6r5v;yYWymO5rywoaFpQ*>riJ?o{Y_ zOk$1hS(%f8b2KBLcfN;gDeH=s%rLMRkcdOs#Pg3ND97MUgGm?@Si)@N;5yCHKT zE*gKf{Ub7-k)muKQp7}9N|{B>fvm>-Ug!k{P9<+?#HtepM)pyxz0M51eD0IIFv^orl=#+RTM7+mEu4^S`O%WU z6Yt=|^qWr2Cn3~FMWa=?^X&AsmY$Eiz2M60x#RSb+OkQn9i|z%kYod|pUtD*{EB!G>lW?kyF(#nh2EFj*TZuW+=g>FV-S%46TrBj2|0!!jeHmTjyA+OB#F_1`7 zi-Al!gullDZ#!y%XWq*|W;j!f(WV#6-S zKJ|o3_fDl0;cph|BeRcgy+6CYK7A|m zyxx1MPXfDWr3I8$E)7ebxZ@B6jZ42uM!+h+JySUy)!)fF zjE-(A(g3!wm1zJAD*BGe4qmiZWokpmL+PBuhmnmRFWXY%EpW&sEneBk|8@$9KTf8R z5fdBz0_EVN7`&ouI|zjXgnTcicrOkXA#gCPqR2w9hoyzmJ!e|UDQW(Tx)TXTb6t4& z243*idDRYz(f>F!DaI6;V$qH4H=r1>$x~_&bg-3s<_M>xDH|$HSViA;q0Io1qh#-V(eoektHk!(nh8t!PrNqxdt_&)&zjC|90gZizYs_;ibIe zSkAHd%5liwubktQX`G^-Ht{#2u%_&~Z8^vOXRrl-vBKkS)KkY_QFYmJP$uZ(iQS$` z>rELB!!DIGn=$&cP?_l7>(}Q}N{B8CpPL~Y^#HQbh&*BcC`r^zQ&%fVGRHdKz-h~BoW4Vd`52O`P*#f3`cq?awiFsV8pikB7PKAjS z`e3zqwt`J6_i9R1>uiFLMGjnRS)wUH9wQ`=eawhv+PcB+HtzPjS)q*h6r7q$7{(E1;1`# zR;;#EJY^#qo8W1bSmBe$Po6yc=E3ocXMcIRu0BRMf7<}vgBz}Z=0K^~TmkcM#tk?i zgl#6PhZ}G;SrKUzvn8>bTmnzNc-YW=Z{j8hSvU%aG;Nq&atk`0NKJjQ&$il9CTu&# zd(EtUy_(9-*Q4Rlo)>@?Tk}Kof-vdshf~`7s%<4oV|}1BpKd!tjz*LoYHa8Au+9Pj z>JMw=6RJ~{>;Ev;F0o%Gh$PKD`wUAZHC3riNhUyvSO|TG*YB^){l$NIN(w!fRHWy| z-s|H1?Zr)%tEozOC!;cs@*}cwOkx%AScwz^c{BP|a>jrMSLh0kJhD~xWZr%E%gc}F zZY5_hkvo&+d4aG-tfiUfO=u&!XMn&KE$bd_q%2}zpWa?yADx_$pXj1&mM)fu4Rd@k zYhfsaPNrsiQEvjzzGg6ZJOo!Aa$y+}1 z{p^EH+Hn-AxTTGVOH=*;8)=N?mMm?dak_A!+fsq@>*UotHum34K*nEWh)&jNTR_$i zS39V=j2^2l=SgsAw|N%Z?DCQC?2nTgeCG&}W!cR$uH`#%>KvoG=wv&G3XvvH-d_05 zA^VeDsTtq7X;KZB`L+Rg7oM|#_qWD#ZZlas@tnnM{rBNH+mdo@%Z1Ta)1iLb#yk%} zEnP^j#Ef2QeWy-QadftLPHRciCwZ>YR^Zw`F z7~Y!lDKOr}na+|7SDcd^8s~v3PvIw_73m}K#v;Vd$Q9bH#Dbzuz?Z-L20&4p zp0cSjM7Pn4!b&_*wVers#<-B1^BRvnKRnBm;~8(2EW@dZ8Ls6p=GKIpaTU=Z-_8p& zw|h82HXEf-4(4c?vYZ9SdOgBwJDg&mi77#B#+GCQ$r*2Fv?@=81S0VYQ<5$ih#~dB zGUKl#dIbI|HW61jH9-wQmd=|fSg28hg$mPMpK9fo2<9ajPFUDlBubF`wmb$X9;-Rd zr!UBT#fCESKm8hH)j-D}g44Xu&&C~GCmsFGFV_g!|oZfwLGFstP^-mP$YPJPm;$?=qu9*xMN zo@W~w9U3>on&`>NEsmD{+BgKLk3!NT606+*W5i{ZW0osThB+?NR{n5t3(*);ktt7l zG+u_pVqvaSY^jm-NH0AMVfWI{L;@oP%@Xy+FvEKIUxmmBl6ciqBQ+;|jyhtwWOHOq zteErE?VJ?*D)pLw)3u-GGwdm-KJxc}(7c()Rt8fxH0r{AJ|yR3{!N%7C5&sNJ<3{% z+eu1kQY_{zR3oc2K)C(jon;!JP%3hT1}Kdm?l*(8Kim;Iqx}5}k__@} z{HlV1J*N03OL~-j6o;#LUbHTGC)Js)hKsTgzq($-C7soTSpU4`&f!8^=e6nSgk-L= zDk-|DV^b{f3Y7UVheVr#lgge5tYoS2;xH0zF_a}uadKig8`+SWlQ{&4V(l3O{ScYf%Qa(t3?R&Y6E)P>4k(44X^ryhHz%E~&T@XlW zt}S9v>|$l8OeA2+I}E3mHRHj0(U&40;~Z_JsAKl>U*!%uoE)CS4!^av(}2<(hUgjx z$O4IYnlm@ySVpRYo@@yNXH%H-8!gV5Q4QFiMQx}7X=2F9?NH%~^X2uYAVdMA=JdEu!Zkbiu^G`FS_H9MWjeIkYPS}tC68AJ=YO`NtbUtq`Isj4S0a55~irfs5NL!ssGu0raT2obnp=Kq0;NScOY+@ z`7rxh4&z3?OG4?ig$+e8pLKXCL_bdn{H6JzP05wqH0bp(*NONe3z+1QNwa~5Rm`z> zgP0%P+zFkfo{H*`+J{^vzej%%Z(pB@;1Gmr^@@3qXb1c7>Mezs3@~oSsxx(cNF)sr zA0Oe$A0k2-gY8~;3*_tcj|xMiA9m%nRm|Z(MXPV5F!j=g)C*~7B5Taf1QiPN9}X3h zY{#?Iy}{Nl%o)!P-X{b8NlPx58uTJq7WQC}1*+XpRt?#t9aOLP;cXDTBSO%-Db{+T z2QN1y4`L_P!|@1p*Iq1NM}!N_@Hwui9+s~se`;3MEbtwMH}iF*+)`g?ccFF#uo;y} zXQBXd8p&N>AXk&S0)Ss1z1zb;1HCH-+C}ho@3PQkI+9Mk=LB!OoEpI!Q>En!UBkuc z2j~trFHV0!^T45>j8UhEKIm>TuNxt#kvG-Rf=h666IH{;;a^=Mz^p?QeFxn{6tpnz zKIL^x5haMYIkT9ru`2G-+7UX;Wwc_~T>a<4)&Hq-3~l7vpYaS;enhA3_!X2=i18tj z^7AxT{w{WI)a*OJTng8=a1tNU*HrNqGbtO?mZaYZ&Qt{=$Hb+OY*6{Pn^XWBs=q<-$0QI^ZP`PNsi!wc z2cZxXxzmEIfHBqLU#nzgxNir42bsg7n?5(CPvW+&v|y}!LS zQ`F4sdtwPpRkx@h6c$S`ne}OQ`0C>HIyq}4&14)9o@2!AnFjRw+}w6XOHA^w_zsB%kThV`(7^4JWSm zL2jYyv@syJNe4k*Pu1sRQY)=XHZSym32#4C9gbH?ehaGp^!Uk|k|dF+Zv*dcL_LT1 zw?@>rnXTQ3dOlmiTqn;T{}<5oPd4sE)9d4I#n`Phy+5o?nvS&zXOW7&8c~lRIZ?;y z$b#171?4ub=!JQ8adr9D%EgO93=gjoRiCK5qHYChGHOuuI>J?M)F}wwFmA%DiuOuG zeJhd}DX%g~%@MPTepcE*35f5>=9z+dK!7UKYQ`|3w!C6~r^dqyG7it1AlGj~wHu_@n>P0Ipz;R*5W zMLWLsKpah*vDZif=lGM7s?A4VG8@dEr!*|AlYuzTQLWBmsH1ZmN<f z%c74h_6fdjGfa3zGtQw1RJr=f8FPKg+pz?+Omc?jDW zr<&>r@hGt-^RW)*7;|v&lGJMOn{J*JOsBXd<2EyJkId| z{d|TcFu|`DR=CJU2EuB7;5k}+BR)kPIuYgq2gj@TA1<)9`2%@!>xDO`ucU?`wk6Q$ zj2DuiF5NzsOvi2Ke=}yMJ!aRWv)&Whf{Hkl(r)a8ie};~NcPjw2ze8CcU(xQ2q(dT z>|Af&_q+&S&A4dLaBpb7z;nupi)yP zk$&O9SMJ?tTtUI~`B2H`^zlnPqs)t_=H!RR2|ngg`P1d(rvqo}+k#LO(kCm;9ws5- zusC#Wsg^Dy4%9;2p)+&x8xHW!p6AW1 za~#L@m zW~$sov`9xIq&vrY51rYIhHR!ND6Dk}3tIrwi$_oHTk&48h}yI54q6EjZvpjAn7DxY zx27liWNVy|dVP&q-FuH-oIH8-rw2{*=C(#Kul2mD)q;R0)W5~P*-B#=2}H4Pw6}Wz zorp(opgXCykktr^n?Muw`18Bumpt^4LL}V9=Pik{H;XErp{hi9j+ z-U($D){_ZU@n(}z6-eW0b*^5Kz`lbj^j_)~vOpWd?p!z`9FKHPoGLtgdhhtfgKwW5|7AnEum#w=(S;1`jgPypEPbc;9rW(}^7ibtbSzFk;%MVv4s=u-MQ`@ZnY~x72NLu*!aK%u zoY+@|ceu}iqAU4tctB8P%NpQ@EY~yz@{`cOm!Q;P9DE0r9~@R`tx$o;pgmRv zxXqQ`9160|>a`xqyaac@ViRKqAY6bkzd0a@lCp7;t|N#AHX<_H68kb>@Q)ENuOvyb z`0vh9PJVp#&Wmpq7@GpIR{wM^H~4Pj0KxYh`xrA}3sZu`Ofb39GLoN#whW?|x9147 zq7-q1rN1nn!f2UaUO%vy+Tsq&@2D%ABm`eFX;99BJS&o_tq&!&D7s(+P*vsd!#|~w zzc4u1^@G#jzdpNu_2TsRDtBh8MnjRf(PiC;jh!-9?LxV|^HkMYCpdo^_ih#6;YG>7 z9OoH-LhD1UCHDgpOI9nJeDQT!0G`FnaC|F47YWtxx_2O-I<>ggGckvEgD9Ij)+miv zaI6WQgq0sI@KVf-i1Z|eyVC`3wGI>)Mc_BTn@MPWuPZ_$pO!EsqbZf-RrosZrP3$o zUsQ1M0ggrGH}K;M8JAnEjoMvhsCehneh#wF$`7~aT#y$}ghLaj!JNKE6RxZO$KIQE z$8lWgy5I3DaL!s@hWdy^&4aIQuLF`0g>FtwfVR8UURoefB+3F%Fa}cchx^;_^X?rH z8IhGWfB-F7&322(%FKw2VaJ{aOR<|bLU#hjGb=|D$9#Q|Ng_$TKC!-MH}6mAMw$i> z%UAh39U@!dIY?{+<()ALVjws@pH`~wZ2rox#Zd@v1qX|{z5wPn9vtB4G>7@fV6@33vfWB#4QG zJBQ@j^6RM2vik_G6evHs4h8pkgPeY%%!gAT_1s*=bn9B8sXE{~D8ba;)n>Yq+Dv~9 zSalIT!#321*(0F>WW$&}8>UogRAx4pBmJE_{>KlYRxq>fNTpYzBb6C{vaQTm=B{uv zdscj^5{efz!ndkN5!s@VJ4NLqj80MAK{sNHAqr4)tkdXhLS0)7gF`&%oU9m>7;F@G znrKU8d$hB*WYX*f73!QwR;S+CI<)c1CZGW(v1-2^&QvjoTMkQcSJw);K}- zl96>Vw{?h(%)1Z@hHD|+6W(^)$Fm#Y?(L}%YQHKJFuj5h`7I@p3qK%2rn?<(?L2?l zt16ZQ;L*L2<0BfHmK1!L5`i9DVh->vSQ>ci0_iEOQbNI1uP}6|q-EdU`n@ne4WHgn zQNS;q#&NHRdtR6h>ieyZYr-No0zM$OQxk^7DUVn@RnUS1ia64Fh_I<^;h}a*aJmFh zT9^M&6bA!kIrHl%jgIlYkk z48KVO5UZv(^AW-rI%!4!Mt&NAIE@OMH@S03ZIq8n0Mv?kx%jdJ5JO4;#LWOeT?Zg; zL;&Ja0A#o`o4buo`F?xBW8xnJT;fdE#ut#dP8*>+YDf+JZAyfCx&ct%Bdw(R??PgU zC$*|C6p%ztDQYsn-xnum_tLp7K?uk7Xm%VAKP7hUmSq>>(Imaekr$fco)Y`;#}fbW z*O@|y>G?z?t3V<93RD6xeL;kUgm3wu36@$mIv9q>alPzj9hVqhNcc5k4CJVd$@wvS z`sDCTSE_2*C*WyL<|Wu}yin$CkZ>DP8uY%TH24*#G??SVyCe8;9QJC$xpuKGoJT)w zlQK$mDkXdf?~-@SeF*2+{SmW2t8hL>)y8pOPc}~zZ;;I|OgjJm>%+6z>G9Ve?BA*W z{mViOR0*0KpH{QL-X;G`6xfL|Oai;^8^O>;8W;G4pC*>;<@CbQOuRh_-$Uj!Yh(s; z*b=>I_@n4Elea}FQ)NGYN&aQ zheF9AYK5qNAc&RvVJ(dZ0PSzP#v`aZaxKQ4bR9(Ucckmc1ncAmis*dbSt2G^{ ztflG5+Wf+bj<{aARDLT>2abnrVntQLJc;%9q3V##B~?e>?`?G*v~5Y(k@t})JHV>0 z@3?=s*(7#06Pvs1f+f*-ZBD}DT;@lMSc zjyjUFrkWhMMd30cxq+lFkddJLy_{^m+xU-$uA^4S)HyY7x}(f?^eb5)E}q%N8v3bC zqj6$$gEkBye+Z%ympHm0os&p7TJSSh8ODbW(I(ykMJ?$9?HN{FCgEPlSsw})!qTb5 z`{X_thfQU5ALUe*ENWj-HmMM?4a=kvp}>5-&Dv*NnVF{@@_$*U%p=jOYH zmaehEJ2afn0sjuDkl%$oA!2q zLRZEkmkU&Z&#g`<>ZwbjuW$=PyZt?%Ofb#+r4<~JzQL?PnJ(dqT)O^F>`A^N)+o4D zC_-RDi~!2xL9{=42W$iQqZ~F7aU?PiJY6y^ph*7ZZBq#^o4V{bh?l!?CmnYtzE`}A zGvdQ8dP^f}_l}pTkqus6n(4AcW*JTmcv%xiiFFsWe3vc)R$kpjIgfRaak!)6}Nz!^-QTs;$4|i5188K_RF__-M>ED z*nWXGSqtyb>E+cmNsUJv+s`KF@2^ib$!)-?)BkP!>%VRU+icJB%v+s0(0s2$nhP8e zd(5JTUqTNjFJ+vPKO=$dFtB9!=<=7id(?G3^iU%*8TC+U%ZFp5r=oG4w%)`ew~M6- z)>2g_@ngUm(H;(L9DEZbvTj#V`Y`x~vW1rsX9BTCA26j0tnHt0~taYNPj zP&TNa0T&u01Hx~TuXDE}*XbVLBXo&(fDJ-3^-h12@~L#lf6Sf^88%K5{30P1iJgWU zJ>rJCy*^*30kn?hc(hR9faVyVK<#Qi;(`Ff9?tm~F!>ff)4diN-=6+!;{ei=GYBQ? zxZrWWHQ4CkZpaAuhg2VQ%9?7ihJ3K6Nsj2ghu2KM#S)uWm2yY-;0OEi-|b-|=`%5$ zIgqrJX|BhI`;-~pki$uTppQz!C~Im@!3tzq;|{9V5iVAm65)M3Vx|MdWc8Ro)(3sG zhiOY6<-LJcs}JACjC&i5g>YQG!+-cMYAUjf+8t$$q3C0uGfD<1#=;NsiZT|gK#W3< zFv<1>DlEisC`iDqYd8{Yun?mb;MP|{*|z4+a7P_ripAoBL^gfp$nCL%eOlr#$I|hc z5h)P3Ln87KpXjl9xH;=(Wmg||Hu{9s;Xa918F$AW9FaB2u{@LIN=g1XIs}r(Jyx~P ze;5SYT#%_j;%gsZr`k3H1FSha04mGQReLzv09>%40J0JfxiS^Hu1HnKJ=HqwYb6Bl ztsyh(3*cKLY(jlOJiYL7fqc8ovPjx$x0O^K7~^6v+V~ydlh=Ci)4X$jKD*x7-oJS( z#I?EoYz z{_}tS7l#Z8B&Vw(j>C82f_#7i&vPPm0D_Q~a1m6$xPl=jTt-i(I z*C6y;j&B=mY(upO4@iLjkPZoPH~ivQwM_^1T5!Al>T-5OFxuw#o7=CRe7m`QF!||v zGt5c^tNN6~^DByQZ)`v2vl7=q;W~`3b)K$fH6fJeW5hN6uA+vk`@pF2?9 z?KI*rD^_c$^o{HqXb&qDn3^E2LA%=s`|&vT^W%7bn5#`bACX1H07DE2N0Olnf~72h z%_CZJ8t)HpwTH-V5Y9L(4x{3@*B@7L7;VSnVZ7TGLT_;o2i42cDE5a!;4P>W)<&Ws zdX0Nnt{C}kDpU`(svnI{B|@+{R?0Yyj3`a2Tij-3IT5l`aX)KjH8wy3eTsF0LBnQZ~ z*w}7j-^CXr7(+4FS+Y(JW%?&|6ETuFP)%p9m4dpOs1dTmidN)?CDli_ zphiYz;?gyKYrsJp6Rnd|KKQ!oTeqiSiV5^+NtQx6#3Du8{#FU-#KDRntfX(WtcKA{ z->mvbASOdb8%qd7T-tilyadAwAx0vy8QSomirR)4SVdEnzB< zzn1P*PKl7Ys#UkWa_BdPbrFt`Jinxs;Ru{>;rH`nYl|5nb-@Og+~)0$V-7#f$8l&Z zV8L!e%Rgaa&1%nXz*)bIg~Kfa2G7A z@Ns!?kf?66tf(XG^@@wPqAzgis9Q8lDSZ5|bM+DX*=rG|eiaAG2K=cbf)=4{i24N> zOEPVt+!(^IuxD-XvD90ALWiN{jc5F5dOdmg$DJ3u|Ng`Cofl7bpZ)OY_3nS|z1Ye4 z0$a;_8lqyKG(s2^jyw7wCk*mYESbx2#EDK1xzdJu?Q z2oCscNMnV13QZ0AH)SqpW<70K&kwJUP7pd@Wvhi^u^N^zq@9RWTol{1q}2ipX{RP` z%vz^B$B^!m90d231QF@48esFew(|1jxwdeD^|_b%bBzjC=Qy5U`x$3^+w)u7a~w~I zB|w`@c>@%oD6WA)m}gW@C~`mfw4jBo7E1eXE4PZ9F-L1@4k2OH?Xt0_0b1}wQ@>`ZfmR@`o_$=S}s1{(JqHtc6yjoZS8hF4+Idt#PQ zLs#pfO|^wug$fYHm$X`d3T!dsASK{Ak)a(9fK5R%x2l%Q2(Rd*9SX~AMd@`qfEu#t5=j- z%!ok2@ZNTWB`mg4Vao2&g>=fW)9y>>g|vkg0h>)Do~o&mdfCXZGgUijFqtv%i!{zM zN-b%%06p3E$8A~*CJW&j0k2)Dl?x#}Cu6H%SLU;7?2WM7$A)EqT45(y&F%!dGS)fl z>hpqO`v!mQP(+I6uf;{W8>HM5)UB_oE^qS&J0NR@53S?aXY z@3vMbXE6*gA~-(ToiXU*3)8_s0LRx}=Tzky4BOND*~B=op{4vn z={VAWF!Q2x#KyVCanA-OYjCxfoOVA9D=3gm$4go@Qy@PuaShfw?YE&oGG13>T5yVu zAIQaZ8L#hjie)PI(;MVUfLOmHKWdNTr0)okm^l0LO2F|Ko4&jT2*t!IOC)Ez*Q`ye z;rU#dtBfu8q-7>448~Z@dKfe0BtSYbe#0><%yO{KS!ov|o8QS##V`1wSU$rJ_+<#j z#@`+}4wn-~+#ffu*<$=6=Z9*|?6ml9FSW+XQ({T0X4>e083AXl(^AmJ{OFWwXz}s# z)Nzh!C2_>5qZ)kku>$$n8On$w-W|6%R-R!4DKM#P77xpnzpXO06omH$_@e4p+7 z-@@ME1CD!h+YyzbrdUmRw4sz0pDBM@+|;n#;%48-)-9n_wtn|BtTyFel`s%J6*(B8 z@`V2mfC1bW397vH!14od+w~GqR7x1Rp;6ZkiHZEIia;gw1|JxN2q}x3mn@nWGw(0? z3syiS1Zihr1%j;GxynX{A1SBTLNAh;to)qBZCP-VOR@G-y`_MgY*x(&**%*Ie%PIt z*0m-_jF=x}C)o0-v;!Qxq~uTOziS8jF66TW2l09>W)1bm1rSybZz$}e1LEXK4%7&z zS2u4XKqxs!@~839$9=jjl$NKuD>ntmMGNyKu-Y0EDIxDuG6XN9>5T%e{8KAXz1z5O zd$zF29%;+vv5a#tc!y(+aR{%t#`Ri)aPH9qNlB(8*1+`up~=~_Pq^#?d=ob@Kh<|~ zJgRM>;+5n!qk&1&hFe=34V!#AhYKXHWlNPyUcxtaR0F$1B~#ATltr9t&j*zyVqG&Mm^2FbmX=A&S0?C2*cancWICVA z1je99wyS}r!FfpWTxxD!iJ8Edm2#hlMiy3ty_z$lQ^V5K5|)Q7VPnOwSsJX6CCqLp zo|lVtvV?V@X>za4Gn_3+6cz_0D|Q>^rf9b+QCJ6mP)wg?qs5uR(zmqea<$FJSmn%O zqWc~p;Q0aP@r)8#QnYP8X_l>07_}ubDDjiE>(j1ROU7XBJOw8GW|`~kK}aSxSFFT0 zG0S$AC9k{k^j!~dNZr~adb``{S_aQL-#^N_6L&s5(%k0o=K03w}(eR ze)PH`;gKTN$UOUYdOE%Snb2@zE6IU+Oi(yUeh7ZDIB|VJ0g(1ZoZk&n7mPj6az?zn z1_cMQHC2gdCAZUyCizJE%!f!f1@`%)f6&(A0*sV5^S(h1602E(6RKT;pc zw?vhik0%t_^2_rXYe^1}Yvq}C#1Y;Jl@I&!Ma75lwkhboB;B6}D7eP;lJ4h8y)3=O+9~Kre!=%t`r29ou?_1@fLn2Vt{i1{W$VG?zr?mS;zal=T zlUwKAFZ#%G(S82J`$hh+f5u#Na8{O|<2RIyP8Ly{Q^}jk9T}-^6x4QpibP*HuRA7fPQmVZ7c@yu4M2BB;(HTqhPnC;~ ztR=_5$8Rqe9UKlW=v|Bo)RVc#Ty);AY$!;$_nh*GzO66^Y{eK2`I3Z1=z5z|(a{C2 zL*}HXq+v_C08cJRMF$g!sCl9DsWO|vRRUdPMRstdbBtTU7#__KQ+Xm&}dA|VDl@^LKlb4 z-wrNmHta81=>9?3K^=2;VN2S0;e(mPtKCC((AY1=6P(RH4@&OBvW@X)T7pkYJeFml zizpcl}^qU6pUV|i zz3YAx(J7s1Ob;|WyHyxZnl;L??aY(_X{#d6YA!NXc*n)e zcdZfBL;sg$zKh*77^AJUOHo9-JNQy$>^D$kOuJYwGIn@zfjuk71rajVsiHfV=MxV% zT)fvbquaM-(fsM_pYz(=Us;Xr@4vpjJUqYp`s3{K$Ga8xA}eBbRL80;cy@7fO?7Ri z?Y^Cut3m-{^N2#v)fu&F9~=6>3dkUW z&0VhKSzlbrb`;38)~2aHLVL_5-nx6_Z^&Vl@U@oIq3pP=_rc^r07NCRv@Mx!R)${P6W*3}k+X7*tpAPGq?7Zc^ zMSyP;rr9RZPSLag)rISd(8E`2o*Ks!(!W^+duD4k@N9WA%c(E%^!jRYsw$tnY$=Pi zL{`R~^*20lfuT6g#B0#SGS6z`i)p1E&Y5Ee*P7ateA05%upQGy)MV&7FkOZm zYUMQIIH?Z~8LE9uCFg(iWpc!_2u+ag3(ab+wN8(X34ekkHZS>+Fe0X5%Ub|m?(E=3 z!Rv`36z#eQ8wJ}9Ay9taLBX7-1QG!@%-4wmxA*T_5Y)R7OBZ-N)U*y1$h2*ZOAVs2 zJPd~KMX2z2IsSo3QC9(VoE&?a4hg6tD*+fl|9Fb)hiZqbpFgN+cp%N*xr%VKymH2W zQ={B%Vj%cr5{uR6vhryMzKETzP&E$6tu4l8OWg^@$s=0gQAl|0a8WEr1Szt|;?_Yh zK~=duE?)sh*|@+;F%;0Uv4>O?W=}ZR-h$WJ)u=f^Gn%_!vY~a!uBx=u`N-^C_wcPce_zzti!OeXqp9$KuRoq%_Cxy?&tclM+(88@ zK2JDBF!A~e)x<%j0gu*bMqa=QUf9rC;PXpH=~s#vL+$kvGghnRB?Ag4k9ph(Uwc>F zIKl#G7dqAa%Aa*JR_tj;8tSF)EZQ&6z;_Y*1?rU9l&1* zR~BRV6kJ(!aDTY6==RfaWzogG;mX37=iYGTZ_w{b0e?mSoX13bu{<53v#EF*lAtP1 zlnQTl`|Rd?dW74#5ihr5A6-r_LIEC1ZeLx^j;4p^EH0z9aT5A#oGKT&-8w!r7iXU3 zYKP#YUSncg z9VzTVoPAXJV%w0c71&xUp{cY~;%%+B;tp&r@1MGRed+>_cNo+3k2Ndqcr#OzW{ngu zj9{piJ^xm5#~YbInHu?EZ(p6U(Evtgx2^!@!fDe2y099~Un!yGDv=<6P$&rPY6wQy zd#4T;$_rK|01ZshCV{{b{Y!^j?;`>@iiTkq-F6?1K&_W$bA+pDkw3N1#JdWvS0JxP|cE9gzM2 zm#Si=iO=e{QK2mddu0s8LQ^(f2kb=_DU($;ya%vH&p81n*e*68JfW!i>9Rx{-iV6D$Hi8zZcHW zK{)<}pbMH$2&PLYjWA@s(jv321@`zic)VzeSb(OKn^N`M@?L%sykg{O?vTgXsyN{o z#ZfU%s{)Ll=88j3aio?i%;i&DcF5B=RXYcSRy4eaLr%>*NCWP|`G9mXAI}}nPdVgA zbGk)f)njb+s#C#k4eNs9@rJmkNA^RroH8_&4nc`;)WbBTdCs`C~e6WF25 zuAMC8eOnkf|9bNtX)oAz%-|D3U8$EE4npmyw^d>$(fZqt z`u^Ux6#NMVMwuD9M)r{rmN{?$r$nvFfc`7 zAlRF(-6r>ba$V_D3yvMDF2)WVBr$lSELH&0pT2_NFjowEN9dSYgJGXwc4Es3ct+Fx zcVK`#R9jak9>=U}$@TiHpk=*vIyt;DI}k#gF$qgWp@q_coYvc{Z85$wioX)g>}r90 zW)3+2qTS2HExRcz>e2BJtk4f;TC=Lya`++V4I0q`0*+><3h-}vWFA+I7Qt+N@#w(Y zL`DsTiv%T$dbpafU{scKZ3!hZlSNoJ-&{${KkRJ%o<-Ngr#B=D(D&GmQ5%!H+1tE* zvpP8&gpy&6V5f>fRA4$s`BHE_)Ivq&igpW>$=TvDnv`j@~*CbP>*8p9AqpBFbxo%d|W9hr}NXjq+ zy3&GXP+C~omWiawBBTAw7j&hXIGd8v!;&Yd?BE{M#MC>4H6s06KCpH4#QE4%@EvBd z=mX@13?QRgvu;qOKHFrKHP9;UZdERWWOu_qCfMCfCw2>cal#c*pR~Y7HP2WUeN;Q- zEnMWI>XuFc0sm`nviA*Mt2iS6k4T|3EU@yrDU^l{uAlEN!KyimkK6W1o}ZMtM!^IR zK&d2oOdEBVV^8r3^pDtsw=RCCj|;P3d@bGcBHDnm5&ysWDgmsm)6V7l8)cFSE~zzE2$q(ztPk+kQXK_r@I_&7`}XTn z*sqEIpxjjo!hrv%FYhk;pYEeS`r@Pi8}QNBF4leY#XpyZnmb|Y=%Y^(TJk2Yz|;0^ zA!=b97!6_X@25DOgzL-MEMCGkyq#T~lZ;WVOn_^&hv zX|&tm_hJ%myUm7jb&V8|GL&@~9Lq-lf@Z|E9F#P2a|fUI(ZvyNfX}+|ZlYGBAvU^J zhm!TqGAnJGZU*m-QOJwMo#<6d%D=6{cfr;-N7dpAbUIQ5Gnf2>mR{`Wh}SK`J_Ee z%bG0~_VC+lE2mlBFnsgm@Pqpr#yPqtx~hxdUvC@vcH%yU3LBH_b2F>J*q{}-8Y2w_ zy1yQyKoJRCjXsG{zypQMcDUWXpSKN1>s?_6HrcGWW5!xT6pJmS!E4R=tlBD*BUUvQ zb1n+z2jy5F+i;;^*u8Z3_Tb}pG&|O*=#s(1)Ul~3sL>A7 zf%yDx53n^CeRuEf_JVu29yr4Em#Xk0YhwgM@8m8v=05{a>3%_KbmQX`nZ_Okm*RNL zH8|q0RM>#OL6c*|YjP|LNG_5bPu?BgSWppnV|+&vSZWl5SDa!jP`_G1?hIF=4*|Y!wacrsH;{K6N_ty^=^s1;qNpst~pySN@Wk<-CQ#2(00l}L29_fvk^w!nv?eS;roZ7 zCr>2|?`!$xa6uYd=|pq41eXp-6fa$D4`Ya()#E98n(13YckQf_HWw5+4GY)lH%4c2 z{6Y#|z2Mdu-ST6e9(4!`KD_i)v;+$u@|~J4H4Z2QsMvtO2|@{==X3w75C6zXU`|sC$r-iuw2;Zw6lsnjxrU5r;AJ_&62EB zfBcH*$iqt{Hrw3(*1MbYBW(vcZ?C5|{vK&Jg4&Bc?3a0sb>lEJJv=_9jU|t;7hU@n z9@>INpj9g^0NWjKp@JUIouy2%9L5)SRU|m*rl}V}O6zR70ErNn-Li%1QJloE6D#$w zU5LtmfF{HE9p9Xp*fyt&`6Q*LzADq^N_D0_8>Qs$zXnc;r}%n0IY0jT;&SqC`qS4Z zlf&b$50AdSy!bjwH(z_8=GX5}XKxQre>lH6TPQd)4(u$Hu=3eI(IgANiz1=XfSShf zmk=Y!Hv=;IMa75#{;+m3Dsl$Z`fZC5Ax25Wc^r?*Z!ZBNt^s)aw9VUdbdTw_LcbJ` zld{6V#u%jyKF0r$bo~MW7px1)P5fkS}DTxNYhPrH0xC5}J2k2sapeUwv)TFb@^hzzW+f#s|JTTX!( zf|g05gfJ4+LI);u;0uVnpnO|oBp0Wn8$X{Po=uPRW2_X27JX_z0uyzMEQoY)BG$|Z z_u@o|!8^TeG5=wJG40l`I1yqTHcG)ZngnBlV)_8_Wx-jbXU-zJVa_5>O?@r7ch{uC zbKFO>B^)Mg&Ju)!$MB0KTtZ7-KJE75`6${F6ocKdi<_JB3s8u)*q(}Eq|%1uS>>+j zo3~8j8#_&W#UpHpmS7XI%XtsxE@1t%58dyOC!dBnRHulMoxuIr~z#+a$h6LMw^n<>lwY#;l^V1aH z>z24+GBMK6C`LDJY!?|<8>>6EvASr~Z1SSJKj@9R`-7AWomOz0^S;({nDO6>R!)K@Lg)c{%0O{DhkF+ zrT1C5S!bIX6*v!YLL6~;rN~fFMIy)DCUPuA9dH5{kT86t$8$Pq9IhX#M7(>R1&@ZS zzXymYf=`X66n83PWe6Av>;zM5Lr?Hj^Pz~ieD9i?q@@Y!1e+A_9knz5)@=Y1Mim9{ z>^%YGb$7Yjho#QeN${%da+uyDFJ(Jc7}^lSR5AyaOBwU*-2UkVEu`sohtWJT9Bzf# zJ^(kmF9Y{t(j{({TEM_naQ|#_HZ$!eug{K-ZZ04&q6 zxr-fjX;SY75Al+L#w+LHSXot+$xP-lrM~^>F&%S<@{^ckv~ei+u_dkNG8(7-1B1|U zltowMeRCI(C`$w_1~I4<$t6)NDjQAb{} zNmj8=mvWiVEt`FayDxIZeCNtw1@46LUw6VsoNT$3&=$&#&j zGy(bWVF$4-`;tF>^~Rg`sx`)}&GyMAlTwy&%V*NF)e_rxI{T=P^~f1MVQ#Fd4TH8y zhNuU=?p$R43_Un^T%fQx$qdM|k5&Cf;+$g3C?(9pV=_#ZEV}dHjv}l$8$S+ zW72QiKv9Gx_iwHRjvoy)Vr~`mT$hK(T1g&Tbe3PjEULhy-4;Cgm6f68#c)_7bUTDe zWoGYXYBq?AnN>wZ!|;{hsYA6(RMWopI-u#xV1}FPD0C7g)imUcaSCs<==OrbIcSA!<-XFx@vnDhVYf*foZ2mhW_ zj}$5eA!zFZQfnfs5x;g2x|Nu>=+m&XQ{$4xW{A1dLtTSdTQm&ec;*}L-}kKtW1e2g zwTlrYbQJ~|Zj(?lI`gN2+eJis{(6j3EUeEQBBHo9Ih;sU!BHfje_A0rS7;T2Zu`W| za2R-c;XpKl`X`l4rNPy!Uc^RM(LwE}i_@8z){CBwjwYu%d*&s|w@&=a$D!iw#Qcid zS(Vco+2~;7?+3Xng0!I-`9?-8OEKTLD2AkXhK5++qbK&4JBL3Sm~rb!gK#>)FPlD1 zq^#HBR?mV*9{GxJqnf<#`sDSVC}ntW8Bp~}Ued+sB%e*Aasj2^!16K_j&wCBVj1JA zYk*B3<_r(34BHFy+oG_Mk}vRxj*T+TE>o0Ih=9mOf;es;^^vK{zC?X+`hNY+oK05P zgaV21T}#dBX_`(+8)j^NlzxMrQ;u8#p+bA$Ut;=tG3!;lwjGkSjFoQLlpWLlCljY# z+2dtkLCpQ1qMh-YIt33eDlr5b_~VsVwqVKirWx)YhGMMxtLxHtpydN$6Gr{=dG>h z_U}{s7lj6QUfI9<_U|M6_nH0c?{mM4kK>!fF)GD|9NOMFcZj2WAi2Cb=xpuUzpvBl zIX)!MDM9t&_1~vgsvbdKRcQ`=nd}V=gKl5&Z+q)WYLj(~6YRL+52`O$-TvxB(JGqp zfDN~tmUEWUev|eog$)mJF{8=toZ5e?<+Bg6@yt@^i&t#y&0nyFm7jsSKO8P%1?O|H#3W;Nu8xK1dLp2P6xz*bmih9 zCG``<2S^bY`b_oa@XF>ZXs+DgTU8lZJlyT5PDmqGbIBUfp`E<>(+?)jGr?3u#t>ML znN8~$wLYeGButg~&!FfP)2PW4P-FfhHfp&9`%QIXPfw?BFN2$V&pbFR)sNb}o}3-J zdb_`c%Z@aOvGp3J%KjFdzL0b}VJ4EH&1lZWS2VafRt1_)Fju`e=@FOK# z7oCfgyxkBO#tXTMi`#PczBENJ&tx_W{ZK*)BH~Sbfq5P_f@VSQqBh}!N<*aqOn#!w z%CW*wVZ26Ld)g#!y9Sq*lb?V)yxEUXS!)RdsfE6r9BJe`4GQO|#WKwi+N{6bOg#@8 z)mWxKh9Wpxd`y09tF8!CKuuerCe!_?9(+-?ItIRV6c$O}Az|M7LtJVPwRuwIfW+o%h;i)U+b?@-> zRRX`AEb&GN(-CeN;?RH*091E!c%l7Qw})gKdvE8uKy7{8yQ76& zzL7vq)OAOL8#jWvBrc9YPo#tfV9~DVMmSnnY)qo57c&@Q4UH${2erSHdb^rpA4`}N zzcRAC|>g@_hG2fY1jZbx01{-7-o0Y?)g6(`y zj%`%27QzI1_3NW(1c+-d7) z@2U9ZuNtydc|FV?Y@gqB>qrJMi7gR5`hQ9iEf0t_274i`sDVl(BK5EOwq{?wy$t}L z2iW7JJGh!yK=qt!!PpX02L*%UCk)W>yu@+Lt>(L#?3EmYa?hf2ZXG4@oNEj6CqZJU zJ1kht#pcBsxR{WwpUj%<54X>%86= zlEZh&K0iQfKzyoAUX@!-YcLP);$2eZIJ9e$fO=SG#_?Rj{+Uxn20ThE;qW#+!xcf9 zx)K6Q=Od$uF)>*@x2p9CxF(JTTv#}baG2b2LB}Rxz08ZE!&IfE=}8+RN_Y^Jlzy6s zyG#g<&`YPnd{WVz8idDX>O^xV7~|jv zUco+#F;mEB&Q6`7ab?$LMvun%x>PxD=6=- zl=({O0TPCQ7nUT-7>3sZT|(w0kAvNb1Pa)i9Z$spMDfgl3z(uT>P@UBnS3&XB^MA& zh&NC;fw2Qy#`#7H3)@TdMBuyjG=_l{x-_065@^5ce2IKOD!wF=VAzioSxyH&DlUAr zdHUnzXLMlVNWw7#! z)Iia85gn-b?;bgUtRzOhgc)U!&7O3f#_d#tn3ty!{S8;yfytmlte)c|)_mp?dp`n- zNwRiY-=ACRVTsa4nEUx!8*d}#QNYC!Poh8A!0xH*kH!KRGwQDyi%Etr_pd@AxBO5x zHIhVWCvqQBc~MXy0UR5JUeOz4badtiI1<1x9Zt_3m-0K(B73Z9mXCega3FAZOEoaE zp(Mj5*AEG5GbUNC2PR$ej?G8>u_ZF#h7RoYO+bJAju|+r9W-@@eCkz1+m`?6kdv*2 z!QsR`g`zZM9w-u9xrjnQmzu43qIR|(8HUYXy`nm*zk5BypTbZkg3`IYH_CTtJ5?!` zbck?f$TduhZ-t%L=RMVnIU_~NrnQH#kt+w^yD$ehf33DUVtuquF`-(2>pj|@@FZ@6 zKfgjn0*xr#dJJ?U?XICIo>z-wvmOKiMPp$4bG)+rs78c}*z#vs zBCU%!P+u3W!n$x3Peg_~tBLDPBgIJ?i4*5ZqM%&6?n2JGOkKUkd>baGygzr86%u#Z z(XB}+fHzL3L3g*q(zem}Ony2P|KLCL3Egz^8iiWj(H`lqt)wolq=|tBtMIUX`}x;Z zQV!UW)SVDTq07`BW)m%uYGE$Lc8UN|D(8IY_$pstZ9_V)PCqoE+KkfniLF=Bo1*<3 zfw8kC&nkKT+UD*V;8|3v4nC^Lv`+f*F|b~hbi&OVAI2TwIQ|5FNZzecAL={!4wgf^ zwl)2GtkTB5nyg|pleR)n&JhGmmJ)0DpjFQ_O2p1qq5RND%2Phv+I#j!eYJ#_G_2v4 zf4%xNw_>=9SSGzRh+`ja5$kJlXAfN!^k@S5G3k?cO`hU!I%ejuC(3(dtCzpQAmdCT z8|5>>K&4_L0kv6Sbq&B!rT$t^9P}WF`|uoP41>Zb3`m&PFdBID@X8~UIqP{oUH25D zTOWGXf_3t)=Ws(PaBgD?(|Wf3WIMdh&W5l6d}$(wz|0Kg!OM>z+BUaJA;Mm}LWF(x z5pyR?U?RwwI1kK&gd||oZF93mK2{NNx{Aukgiqd?3X><9)`bqQZrmfA_X3P-5OYYc zO_di3a5nf_(x^BAjXSsjgQw8>fYr}~cX1}OSQbMg^WyyKyrQ9UdYXM8W6kCC_}H}{ z(k=H}M$ji8FQ?Zi>IB2#5JL}PRwdXe&7;Xz2e$ciWM)mEJQ@%({xh6k$$*->R^ue_ z7R>4G%rtS_tqwRpA~P8jO77XpdL`{fl$7VCU}E%0tAidv1)6M>iKJNv>-k^xyWrVH z?pF#k{pkmDjEQ}xV9_Ql$r5&H1=ftnaPx#_R*o<2^0Rhc^jvH+B zo%KsF-XP9YHRWr3FQvGuae^Kc@ez*ZEmjWCwKbQ{xVO)_aG62w{+4YH1e<+pI3ja4 z+wK7S*dm*4gN3%iw+2(#7vCDy=LjmdUGviU);xCn`gOXFK0J@P)5T2)Ag=50#E6jI zDRlNUy;6DdC>v>t1A_qJ8MJ5rJ_+B+u~NPJj6Gs66*`ujS}HY;LO(dKV)0Q)=bB2x zm*_~0`!hT${j`hOh8d$4Iwdkgr*UXJYs?x4nt=6F*YVx1LOl(o1Idb9$lU}iq_f*( zJQXuSZIzukCUI>HH}GmvpbU3~er&aC7$y>H1MI;V!)Vk9tztAYnH~fKZ{6E0+6S3f z;ZL?u;i6t=(ySr*QeQJyf1be7~aqZ;u?%q&wVfQ|`P=0M+GW^WDaOtkriU z=$Kq#R=pT32hYY)++nPSDzRj2qJ1Bb$`Ch>5lL4;xdRo9Ag!L!uK(rwY$9+hwV!m` zvC6WpZJ~9cWDi+!i2OjWuZXXPf)zswvwgV(bf;7$zp4-%d+L=q+gjV4DuA4 zIS$bF(EcyXrhwQ+7~cN21mHNiV5s|F-cc}itaB(doE+|eeh*>4oNxd@ih>Q}3+G{; z?1=_Bpl|(s{>=Zn7^XWx0irN4{Uixz{fz?&b9xpyM(;3WA-;!cn1pdQIrfk$eaKab z&?WuYA)e7L0x8u!c|9P9na`Adr&W+{P&blVM?YLq9SNgn75cPwzh?xp(0az<`5o$0 zv*QK0Tf4;U^JjDAC&5c>FaFXp2~|aTZih(%_%0o@tBq4#0U^V~uO;sOaA+pLcvkBW zeeOCa22|v5u;W$SS(4Sk;6e+h5_ac+kd>&5U%cI1gNU?ruEES|NQ2cS^2AryY^-6^ zim@-4jn}kIG-RDRf$V4L`lt;ytL|OCyH4~HWY$BEB2f<{F9%Wu&fTio``5SI{w-4x z-Fd+T8J`h4f`7`DSJ>b~%_jl4jLe%|8ITlr#KA=@Tl?EApQ`m-?8kVpIQC;+SZI(~ z(ZbF76wf7%QFKQoja8x+4l833PUqfSj`M$CB5Sp`xK?<^cP4o4*uO9Afs10#?2Zd( ze!r6EGB&&`-V_!we5TiRs0@p?o_p|6v{kdXyfptZG%nx4PU1UYo>X-)Fys8CrbG;s zZ!fg~jfp=nCEBRFRaL3LgQJUcQs~isnP!K(nL*j_i{T$pQ#8ci@`}aZ^4EyHdP)fp zxnA%Q$SB3qH6g|JGAW3dOiDNq<^HaOijxz>hMibu4FHX2rN86H)$~0nrrq{KdWxyU zFKkt2gX6J?xhjlg4ZQ-IK0Bw8r&!uw7QdND}U>HcJaWNBnS`5 zqvgV8yZb;C%Ura=CS$0|HyJ}m8%fhdp{0qT#)SvMIwm0}lxOu`B zQ+|_2_-kqe+JAf$tjFM0&n+8uWze7upOtgf+d+5vPNT*<8$Z98hJbxzEo|G|RaO%L zGnT+gPFYoNwt3`xifR`XGIZ9{)|gj9qkPc3LpGMH!}p<^WGm(Y3mRZ6J0!Bt zDA`|Mig|bF6(TUdbI|+2$;7N&80%-2#7c-o4y>lp;=*=`zw*K031WzLh#N8S1(&`g zTqK;wd-xar=w(ZlNw|}W}$)$0j`Z`@z-O8 zCLzj$qY-O%R35?6@Xg!lh$MGd&NKIwruLF5Bs%7L4FnuDnKj%)+UY20Dq$g zst|?u?%ZHaB?862GLH#KgWy%eRSyP)os#sfP@?RdzMl}GB*V7eeXeX&PcfMK&sT-w z5Ok$?UO~x)6NNw?z%HrCN3NF%jGA5*qh?L^A3fXI_iM=juTr>%p6+M*%j&&i4j4P5 zkis`rVOD9?q?-!LDfRl;Ua=28t`=Bd=(IW}DS{<(jn=EftH0gAx#^WBQWxx;u@}Yth$UTdpm&IG9~N_~YdAy%h!4 zjg_Cz*Y`DwDZCz3ohAWR>HzBOqY@9VuI11p&ae2)TX+nmMAS|BmquM%rGyiAp{Kf| z$TdM&ZN=pr`YxoS3tN-4Uid+s$)+EG_u?`-9jQI@j z!@y+@bQjjgJ!IAJlr8k}#i3+#E;q|Cm)g`82`Ip8fUIJd?lghIC;NO*j&+u;LWGez zIQYQwRbT^;Zz33_0e$X;h)|^*aK#QRTnT?K&PxMr0Nmr*k)``CVp+>c&+e>sx? zW`hjpGrgxSYQSyrT6!7Ka(qG5zc&}3y98qWCGo&&4o-<15HKtuoOBh39EQT`oXv!D z)y4rvp7;8dVtn=E9q;*VI}QySbVb}Ak#eD{h=Qyqb3p^^cn868D11^lhj6YL+56Nf z?7CG~DTvd-cYFK(`u@vr5B{|Cde?u&yRTlq{Nvt}-6wwc(SQ2igYUv?k6*s}&)0iT zzdP{z-@SbHWcPLGaOXv6_4wtBgV%eH-WZ2<`0i-Pe!5V-!1&_MYt>gt4dDe7kq>B2D7kI189U zHGQ@7`e5(zn`b+g;iOJ#UcGt!>g9gegS2N)_Vyn?+u3`*`y`yFy%%wc{&)9}yD!3I z_rKeD_RR05Ips&|>Fbwolq!ay#F6bCgau!pHdNSBBskz$Jbv?f_jy`Rwmcs~Ky3SO9_=6O9lSXRtMK&Y%O^Fc-QRuv$Gyk9 z`-s0<>}M|%SO*|_v%edr`DEu{r<$>Y$?KPZQEVJ{>d~A1Jp-+VA?>|5*nR!_&8vgG zmoF-&^t+dT0yx4!dc4Co!`V&H`ZB;$I)i}C%hv&>Bfx9N4b;Oh|McB1uf_BEqG^c? zn068%?1L#Drvq8`7N-Xu32ziz=nME__vy2}r@Jp6hb51VUTPqJ+S}i?NjEIa&g(r^ zO{tRDhIn$)Z2zox|{*u*o}5{>ae6npf?2ixmrS z&B@>2%P~rPfB(&6^z$0N!?~gTIn%@fHARC-0&V?bHN_{JBz82XG%EZiWRiHMn?X-&h*V)-dS`WQVEEQj2EI?Yb1rX~y#7oP-2ogw@SHtrF0(! z?fi?MN4kd*@tjkiCf&D24>}ZpwS^)cYmAv9m-83O&f4*soVP$HkiQvF#FNAG>EtxX z^2cOj&Dk`Al;KU|Uy!16_so#eG#N1UmO=EoT*>G zARXZPvk21d275p8$gMlt`;`>)OJ3)Hme{jgwLn<_mHl3*TIdWtt07qzg2^85C~TSL z3dOza8Sc{VaK)Q$WKkRGzL4XjqhyE;%Txb)i~2v!AB2 z3HoavC-NJKwy^@pB8kYpJRIRq{QMAyFyaqM-J~wRJ3OV=!}CLuL--v*`3ZOb@5TA~ z>BIN44@n!ds7ri6WQOht*bKa==k7$A9L*j>Bi}>geM*}jB`XryLxEm&0|Fw61bv?ZXxh#T*cDs+#Fh%s3 zC(xC*y~IWElFY8qzPWSgP&bFXpNd!6zAWlgq}f*7Fz8K+TWO&d@*3og)sQ z+RFTRW~W2|_sb}!;t*?t`A4jgAJG+#9ufNfk!q^>HCeK4(Gldu1UDpP^ zYGQBP%DH68Kk&zHng@Pou52QeDTAH*^`s8;2*udX~zA{V$Qar^RTB38nLT$lLXqpFWj3AFSkwk7)7 z`}pSDSty^9X?*8HlCMYyP1j0G{9$VKHRx}QiWbR4eyvXnE$>toFWjnN%WSOY7TWNj7X9X@|V z2$WxU0G?Bp9`$4Rgir8v`W|2TaLcwvBb@w1zG|N;PIfFG>uf8?+ymg_`=^;R7xT4e z*}GdDBs>Je4B|MSbE7fESFDNS(2Eqm%?3E(mkeU!r9wx9?rKB4B~ zH3`WXzOwblLyAYCC+3D0IhG<79wBMRo?p)kO!c;QLzZTO^3?-D-3DE%5koN^6JOPD zoUPRZ@JJ3%e#)bne_9BEH%X&Q&U6mAVVGjnc}Veu186`nI~Vd$TjD7l2FO?EBUWr= zoR7T_iZ|2}fu+(f%1IFP{PVRi$a00^{RzrhG_ok6JtUg1l2i0BEMT_()CoF1cRZxs zo`oXx0Xk9&L-KM@W=eC-bQ7<`tf`CekOa3*CKe6m(IgEbocIe8DZINe=&$Mz5#%P{ zR5Amk*Jl@`LSiBTQa(&4AFa4hyph1TLK3EKx%CjAPCulNrcSYG9ZeXf*Cu1pj*ce8 zuv^9e7K;Osav}>7d~Zq1`&MZmZnsdPQM~{~st;@xOvZRR!9kfdXeawNq$RE+Lzo7P z?&QkOH7^`qfQsHv|L&uOv>5#IfG9&b4jXw5>#d{~x)amjlRVL>AsLTB`H)syZ_%fK z*`w7e4Rr(<1fOAObI$Ws#GV<=BYI`)7D-kJqR2*F&)^wM8%WYp2Ea88wqz;AdSM&)_} zqfL*&-wudmG4Ps$sZA=dz{iP*bt@`e+CdL_uIu9`RXY_ie7lVS5o*E8YALW));68` zfX!@F)%m$OcL1%TvUB7X@b2;ClduZ#$k7LG}v zpkx^c4QmK2nA03uODu}L6?@=lLwm^g;*GJ&fp9(z@4dQti?Q4LN!?Q>)J(6URTbk~ zE>J}MOOI%*T#;5EYB7xYPVCcH<}JYNLb}|m-)k&N!ji_I6t|p2tiF+ng5?XT*Lxu~ zDjbvAL6%Q`CSkp=Ovv2AU8;^wZLxUo_&DIscy#6X(0n3EjDtBIjfBkcip{oN0Ea=+ z?Gh};>P^D~HYFjX+9z7dr~zw7RgFP#nP?N&##l=dSkr$jWlD*3hljlPg011GSsN zm03^V%S;yl^J{sZ#X-X1lTx?0+37K&SeD{(&S&*9u@WGuQeE-GmnMAC%ibm2Zp8*K zr|*7F^d*r+sCbceiCR*i$dDLkqA6*CkG!F(*>vM>+lcQkA9E>)lj`J2L)vI&LM)@h3{g=63gLvA5sco>f78Pbr40a&8T zjIEwg1u9#Jd)C`t6{nnq3SU@dA6@{)P4XTR$~+O*VBOXxA_QyiG8!sT96Cub%qyBH z87LAf6C`kBsOm>R8H~#WmVyWZ?y&={(vg>EFnkXs;r39VWL&vq)2M_1Ktc&m30_9| z1T!(Yi6Xg-fv&-kOWt4(lhzDh`Es7YBY25XL2$A7Z3tGX9zi||ud5kH+zWvE*HF&Y zC8I=1{3j+zqexz3#xBVyKK+sC9iduv>Mww4udZ&K+2cW)M3MqBu}ECGx3|3u%U;TF z?IC3YBZE*JufS|^=#Y)ijWb{Yqlo1uNTKt`p(s|=2I!6{t->tQ5MwSZpE3FyGz7+x z$1M;dv;oJ0W%Q1-2CSKJ5^?;2#WAR9Q=Y7iZr0GhGM)*a+2K@?IWMimDqUOvezuP@ zN1O&d#1CRRHt6q>1k3o%UYZbB&K?QKm=HafWKO9*`a2bR1H!dStc7W)v{a|Msa@pt z2$>qVC`So2)QlVuZ)YPXQ+AbOEuaey;;B{D(vhq_2o?$R(n;0Vq(UOhtBra|>~6Sa zqa&`+PLh?W!4JrZOsqW|bvxqJj05ts?Hw2woLF3jAL*X2JCS3pkdM$NKS1Xf`IG?_ zxokpOWfUzLE6i)QsQmR~H8%#mVHlT-Y7C?=u+l=Rm&o||LKGdiZ_A)|#au;vOs`nz zE86hr{g^Fqf-|Hs9TLV$rh_}E58}F{Op4)SJgt4q_CZ=M-vHI2A!D+Zk|tgtQ0GAn zjX%)cs`sdE^$q12DReADTfwC)w_7L!aXr`Apf$d$@A2r1@A0oX*I3D2aZV}L=rW+W zs}`Qeb4L!u>O2B0hd5+oR{Sp&mb{v-*c<~{M0dR_@~4c zs;<3Qr(EpgOJJ|JNyErDT!=~RO~f|ADLE@xVJrk`H3NMeQr}8U_s6NJO!!%ou|Yr? zJH~TQYsiJXcRKtH%YwJ4Q914ym7}5a4cy2v5kDiFQ6ot{*t|}JciqgRk{&T}n{l;7 z(#_g~cFftMAK6X6`u7bh5<;`t(QNX6&kr9?504%moukYiY&}H6VKkLe?R!_b4&9wo zOaybdAVrcFDwn2ZYSfA=TL|9p(Mp5oQ(G%oaDag*JogR9H2S9$bH5`c05M3Sxd>S16V>Il7?~SGa9d3t2mGl0la+Q57%~ z_;?gwNh%9e#AY=xpV_)ZMTUDUs}G=~eMR!igjbWNMq5vBXs=_~C`pN>h%7Xb`;_6p z*`8W}vgq2jJkEGy?7-PtB9Qv#BRzWhC@reNyDJ_C1!K*VJv7s9hb&kbhxiuC(4bk& zhHQu2IU{AGRWd;|#WhC51>MQtZY;~JqaN4k2}49lq!M5(>ugQ>5Cf!^LpY$>sWXfA zlO3sTeQ%S(H!$mAw2_OIA$Ec3wXTZmV#-!dMvB6aGTZje>$GJ@&(!;mXG-Zz9tTVE zs)1mSo(9WqM3^1fl8{e|p2&U*ex?t> zsQxx+5_G%L``OE&eful?>X#KJ)dPutocMf=HIaeR&7u>57dIY+jc`BAHoZyU>CI8CdUvPHEbgq?5{$g$}_wrT;}6hQ6ct|z2)$&-<48b4XY_wKjA1^KS^N&`>xZW)s%=Cl@xJBd&I}|W6^4I z-9_94k~TP_2DJ&aF{TB)j!_j>S}>@U^;D0Ye)d9sUbr7{pU}P<3}gZTB;tw6didy8 zzDOZ?H93%=TjC z^$3OPFsk;S936@ii-$PFtX^`1ocTWl!w8S(j;jh?st)7$;ZUSQC_6{73~0#_B?@X# zCA0}sEY@GdCG4bCGuO0zC1fRW1(#U}jHvjNc!UVfaDkLYi4Ga!xoSKw+KxaFBkJj4 zyG*tXB;KXxC2vn*_~Br)Xs+qO4RR&|!q*SvWZj;__&jrr&jt26q@o*RBlwwsN*oTr z(ZcUZS}Gnzqd4-uBOo~6NDVb513O%IMzI)h_&ySt({OmsU@wJMNVp`U4*@PFrKx)i z;4xV`dA`r7t|K+FGdShvt$plX1S(nYDh4l}>>AD&s#JPll4(1lvavzI13~Kc;i81I z?M_sybVpRS)z<4VFrufa9IZyE8}i7Q*>%;$H3>3VM-ugJ9e}M&<)L?jF&mwMejR?8 zRj4TEG9oI%B@3ld&^BfpVLFFMjpy8STqnTpNhA)hg7{B$hiQa6lb>J|TqVujqm#q) z^NH0jrPb-wGpDQKca*e8E@>N-2S!;bodAH*W>-#5Q7ih#ufSiNfq1n*knBElXTa1r(@ z+-i!?JOV2>p`}VS6OS_W0tq_}5LKY4$jGfCf}F62tzKud=*f^4NpuBRZf>P`Q^s*2 zK{)PFlFg|6GQv}+&UM0o+x&#FGgmita|MfK$Ad#Wgtav~t^~Ap1lgxK@)4FjdW%%$ zR#);0RBteS^zC^CQaYrDiEBWkKOPP8ct6W37X z$N|d4`HJ{T4CjT4Fa~4w`E*Whjz<+$8O45r#oAr6)QRUZ_A5t++^TJwBW1A#{$7D$ z)J4QF6>9-M;1~wzb4;z*qF#`$db67R*_fTky{2LJRnt5SyS5M#UW}B`Ul=<) zl)Jt#H8HmpD(}nUQK534mZ;obFV?y2UZ`AyY{1(cc=c{Cmbplxyh}J>Xdl~1qLj%N zT-ov9QKlguGhQJc?xLTax#Z2O#|WQ>r??Jc3a|K*gTi~AA)dGZLx$1(n{mJydDk)O zz>pi;B7yx@*lsPfHc*A?Tqx=_qP15gid=xw>g=y1Bl6v;=452&3-q#t?aI6Aw8TLV z%C6?Tu;6|j-Y*nNdwK3ZB4R7>UF4|ej!q5VEdU@47kCy20Lq}WJH#Uc50`-J^s@oi z>2}2*b>xxJgL!s6nme-T72_WGEA-<%MZcKPfFo(+tHDcKCopm)hwtCJ9ASQ-T9F1n zG{a6-c>w=jJVh#JI$u1zu~gUFo%Jdn%gpdhW$A&6n+>Tb`lIV1EpHj~aH39Q^_dw@;cBYs*yD&e10mZv|1AFma2cRl1*t?4XuwXH~CFihw zlX5%C!;|YX3j#=J5H1Ebs80YzCg4c%7Bto9*}Ay`-F|LQaW`<%CiUn$X zYhc_5_Rp^vq)DRD1I4w6?jPIPGA&p1?BM;k!Rbv-F77d__g$Iod5Jr88y4CCU2zSG zsYN-Lk36%A_)$a4`|VdlsvrIbXM`UstW&&E9Eui)0!2f9E`|-~;@#oj3=$)4^UbA@ zIcka#?h34m>-DuT8ijKs;YW6CSBx;8GT$bO%6EgRy%=<7jgySqel;c?qGIUzjrgEB z+7MhjXSE*=akf}QuN%&}8+v;xnGSy}wPe4A)t<08a_n$Mlwn){KCyp0_OH_Wx3+q~ zw~F*=@eQq43AicqhJQ*5d)v2Qxn29WF_f@9M0=QC|9wM`-G_bjupv;7{^S}0`$Y`i z3;q?&jHAeGB$SgHk5hzV_2p`yziR6|rZ`#TdJ zy9?;^hG6CQR&y#m`qs#sw|zpuq8-0kc&LIC>Qt$w)l{jb<#2Q!U)T>Xq}ovCM_1?b zv$6N^K^{{~tQh+~F2liXUJAriAB;6KH=l^el+N8I4j~&xf$>aU-Z5}ZnqNmCLW{U* z6a43ai=+#4)q)g~^0`VH6K+KR$j9F{LMnnr3J>YZtP2gzhoIG>muRYdRM;n~s*t!0 zH9!e74>-9al(|Yw-j_p~K~|>*S-BV$7nrUF(S{E2bWBIz0bjq?r1-nTz$wIYJ(IbA zWHAGx*YWAq$q`A(&0CU)#FydrqZwNE!y65ny9Tjz_2>o<`pc=^9c}$vc=y>?!_L<4 zcYiuk%B%C(Q~Ut-93m&DS8pdrKZ@E)Ms^gl*bEzBheO*208JkVL*aYn;YVF!`wW}{ zXG-YbDaZ_UE$N(2W^xVIE5=ILO$dcQH|9Z)PG_n)t0pLX9zaRLFFpfv5@7R+37O?> zk?}w3%s?(|9HG4VpjjyF$Xok+JI^)eoVyadjL=(Aof73`Fp&NmPIsntH;cnLqeDfz zf27F9sd*3j9eAw^)udJYL>JAJsvxLZliu!9oLPSbdffnbvQ!X2-4Cztu&5nDAs5&X z{QZ5n5o>7vj+&Dq7(Lls$=Oi!*KvN^uhWk=m1 zSX9iKLHXQC=tJ}5l~Ejp?&_n^hvUQI?E?}%6zlS6a!Jq!j^yCQZYy}e=z;K|ZY;-# z*@?qCgtHC43;Ababwc$Bu5u8K8Tr(`ymG8AmEH(IRU$k+5MQacPwjnE+3xeKdF(N`=Y~wq=cz?HFG^N$e=yy zQ2n$Bs*ke=s_H?DQ@^`^bb^)l@5Njbv%-`zIK8vzIR2pkwi!;;8M z+!fLt*Y~5Xy5@BbW3a}4u#w$ZNZdF9sAt6qbXx;EcthJJ6fhOjD$HhlDR+%8rD4IB z>ILIVd0}ll+?B!}b00*k8rLocYq&_W)$o;6befKhW3(Yp3HcH_kgg#5Q5xR{w1F72 zh&xp0@G_^`XErgMF8lGyu}*=)8_rYy2`qC~%cuB601$VxYCA8*x1P+-NqTYV(m-eH z-wpKJ;N@dDkp!6d-nS2`~{uLbP*SC3uLu3)f!IYRAl~T-bd1 zTQW6jlOdZNWk)pDgPaWTa4|gg40pcFr>cdOlMJ?en`7=P8v7GQ)m{5u$V9;}ET88@ z(MtDIofz>)dbjTcYyb_Yp|r*$G+cdzByqO;f!^o{DV5;KA+|?1% z)8Yu}1!HA+u>KK3s|RCU46E~O*G!oYRNPZph*1fM=%9AO>C|dE+t*!PX=kX;5y~TF z5Cc-g$~>rXD$W6s@1;0CEPBXktc$CH-Ib+1ImAuQ-{W|YvK|=6<$nHwq}7KwF)D$0qaMSU#;zfcytgty&lZ~=~hXeG#T=`}!S za%|4P-GGkzRQ5OV?fw%1bQmGDl7xW99ACLzy#6)bh_kYG&v6)*& zQ{IP{D>)*Q7CawNeXI9My1a!r2fmpoV@%XrEM5 zy4dG&ZJ%?>llB>Ipoib1LGPP~VLQb-nft#Dl*-?yKL?}=TVz`W%T(#2W^Z9^j0Umr z#s@IJr__fx-&S0ZmH%k!L<&hlAK``Xluw)oF{LvTnl|4QXa{WSG1#@C@dV5 z>$5`b9wYS5W3aQ4Hx}(xnwcrAqDDabhSto(JW%J5h2?Dechg|lo)QPNyNd!@2XRlX zO)=$@H{Aajcd4uC&6y9dhAuiJ4jFZV6Ig`#Y#?lR!f)A*I3Ofm1Mh|C`ez(WU?!ZQ z$9vbur?aykAO+pUoGi&17@$}!&qBLZI}F(_#j}82@*#YuuW%tTR#aEQq!Cr(t%K8(l1&0+*EK^>A0ja8C__eAv?XBWYDgeRu3;;-|x54^;p z;3w17MlQCayb=94xe7!&ZAp&3EhNXNf8|z%Yx$x5sZ-_#xX(V?A?=QgiN!~?WgV1` z7Aq^qO}c)8b_$Gdc)H_C1`S$%tsS z+oX@kFlt6Q+qf-JjA1;eBh+Rfs_XLsB1=ap&x{B~ZE*1*Y7hiPF8&beR6&tqc})D_ zuZcfA&7p-u7{nhQWMI||MQI2`_>t{sgacJJ1TPT^+h#g0R)wx#MYhc%wUow-?_|f7 zSFA#)LxdnIKQ2N@a?=_j#w*4~Xf`lD%7dbMs!u{aQM)ediR#uo^%macfpD0q-sEjb zNH|&=`#rYuuyxf$HYhnpjL?D=gA%62&cE{*E1PnM)Nwh0~IK zgq3zfkiMAsVbgc{EBLSlHAh!^FPtbqvTUn~g$>}8e_Ot(eFUq*A4|R;&XVDgK^0zo z*n{kS2uHI+l$s%|fG45ut6p-tVCe<$-J8xa)IoDmgn(CNOSGbi8vDo#-7zWSD$Q}& zmc(QEh9nZ?zUEg%;|B`p&!d1?qLTI?^rlUR;F#{*8}!Gf&#YmOr50s{2vrv4gP$)Z zo7*qn{&oNQY-9Tc(PyoV?Qf@-SJ#`P(RgF~8G_CA3AlwX*DcO{E4b80&)$Z+?&G)K z0b=`{$R1v1V&2iibHBAY)OD}DIU?Fz-b3vcFZVGqfce^7aBRB0{stTI-`-MaR6^MtjR0d3y4RAvfdzOhJ;(wrqiYgjjfcJ^+yc@9PmGLM5}I9?+Kb zHW9G!{~hsUu!*IMPvh~@QKUj2<`pJM7dW*mi4VGTdABnGtkzvwNSO?*SAUZs6S6hh zK+)3`>)J;N*X_f6^zj|+4!YbKwvglqdDO=+n9fJfz99WSrCwNc2H%#7 zSc^gaBQ6H4;Gn(1HZphp!%DCSdc`xeDMnJ-Hq+Xd=~TH6|V@Tyx!PGe#T5lAV0Tk6dT*mmF5E5!shpq?}>%L zDUG#7-7y;fg)dXw9B+|K{zrVZCS5^B*_1AI&atwX)H*{<8hu_TKj6?@cSi=w74D+x%XUc>+{r zl4j#Tk!BVJD6#4Fd2PoQe}8lP>Fi*(x&35QvElL>c-a3+>+9=i6S;_z{wa{}p-VMS-%tr6AC`dQeujmu3KbBjo%CjH z{&uj33G>K&FzhvNgu)qkhhh!zduTVVS%j`(zF0Y$ zy6q_}_ppm~pl1XYt{e2%FW9L+;owpclhvQfPA^=WzaFNbT23q7B@x1Oy|jB_N2@0~>1s0$hZ>UJ-4WAPrWWxBfx|Zi(K&E4rfNAtvLq038U~|zqeTb_ z>8ApY+rsEd(1U5MdT+)-m|qNVGJX*m%5Hr!=pnHf=pn!P-;y7+$8n|Z27=-rdSD@- z941!c9MMnwMcCu-`a5nTy`LeOxfI}Hx5lz$@nX$fe>+{StYK=nK zLg}PfMjLT~<7zr{jTRtqB-<5@aBH*xn2f|* zwT6Ym)0Zg2LRz18&P+&cP<`sQ$Iwlj>&kHOP1UEG&!mM4m3)DvBe@GXKt}ho7-Tpk zef^GP!5+tDyW5$(C$fN~USFs6Pe4hi5?PS<4tj-17W!iD+rzc#g00#8EK(d&yAMc8 zALUHF&<4qa)*cZ|ceO}5R|Z`xSZB0BOByYpRML&DXhk(^WtYhgqx5Ji8WB{DiKLUa zlG3ee^_fp&KEMU1ah^G2mK>ftFlQ#cWT$VQPJc428FD&u7q zG3nBSE@`y@$xCTkwYu$QujGKx#8$mG@2@3@F0rlga(CHZ0NSuEYTq2o+U@&6AWN_; zn%AWWB-e!50Pkl+UA%*pt{2@iSXGL7@nHPMS%K*5<{{;puui6}KwVtzn;_6Oas^_O zPJKzM1(;0=_^Q=yA@Fv@-)dr&%UxICVz)8ek}>4QJ>3Z$buue-gMFcz@ZE@gcPKvz z>;q_GTQa_kalk~|Jp`?{7VzJT_8e3vz^Nr! zi9ir0s_vT+h_Rd{0x_HI`a6cZhwXVKy_-)N(!24%)y~=N5`I3FP}~85KsZ+k9)glaH+a0%M0SqoQ z0j&nXd`yiXNO+h7P=+)tY2d9vkiq;8V_uFRZ0!swxdLR-Nt8{ow&HoKMfBgs`MK6k z#-eIW3)apQWx4WA22VSWYidB|j;~A_8N&6SagMh=B-)G0elmA#fl17uvVaXn&4L3F zXNr3G>ETXAU}fB`7KSbMm0EE;d|~25765vVY*)dyEXvg|n)e55w{1oR+cGxaaethj z4brd7+4WJZk5)@0)+XL@fWZ_uO&r4Thma8hBRTXDyY*ruhX2vg3C7u1*&fvyYG19e zM~jZ3FV21LQNdL$*dswxK>}sbzuO++KR^djLm_v9Pv4^zX9x?pJQ~(HLyz+P$-zcv zD3}D68m{C8QB7p7)dCVDmx&dv@aG^1ZJbNea?x1Ps?#Svm$l8LcHg=c5R{R#m4_U2 zcr}V<0D>i}1CWuETNAMD#6!u0qyV6K#alS!O@0SD)v{!|-vRlI%uYSP&vA^xvx^6< zJd*~T!tqG&1y_b`c`|J8eDlq==DEFNz6aa;+iza)=|8;Irl;4lKh(@h$9@j1idLe&$|s=oV)<6%O0(o!YK7~P1rHXj>R>hZEu67PbWm7q<)pLX zTV2v3jBr=UzXeCQq80VlF-MmmT<{_b2vr8cx02%IQdAA88J;b-TZs_OPiSp;#&3g< z@OlN$R+jy>`7a5s<-TNpgIQ8uC^@{_>+ux(DAy-yp9f*$SXE!RwU3}OFv?d8mA|>o zwUk#t&TC2me~S~Cr4P!JfaM9m=97Q@FnjldqS2`D?&+=4VO{J>v>K}fUM?aPm35Sd z!mW|YJx|HtsS$8iPl;R+W`HAYHA(4k46oa^;Q)57SsWlPhT60n^s!b{v#SCr|%&(D%G-}9)8d{k-pxb{?MLs;Li%qoVw@F1RR<;(;ODeANWr{=uW zYV61um-;2j9kLpGGeUIVz(UG$_rZ0w=n)|@m<_}kBDp4qXS&js<87CXAb3jS_1n8m zZZ3S#<}zpAYZfbI&f0GZ6C()?vHSu6PYKp8Vg;fP`DSy<$L~@17Vj4U8e|NjYG#?` zF~u_}P9Td!Apx_+*%L;T0!`%HP6(~%CLmfQ2C=jUgsE8EK`$iHSRPD}#bP6 zyR4fxmxs#0d`-bliz2sxIvykdTovir71cxuTzuHJSN&f!Bx0}+dsHV;kTC4Zk)l{% zEEdYKqEtLujw-x60u-5P@C0{&y`BM<7H`Swl2{@JxccHM1DYjnbVqQYBNP&XUGZwF zwxnTm@J}aXh))t9WSrOLTq!XH6a9Jm;SU6?;rEG%HvG^n_e@DPy$dA>e!4;R6Whg2 z)jH2Mv7TIov5Ao^PL8cj4$C8c{(NE}l@qf^*&ksf2!zx+t8&ZVX2Qb|N|;%u#1wZqGhr z1vFW9FHL`Ob}!^$B@qaOD&+Gbr|v__xlSJ5ygPk3IlkHc|BeM8+f8fJ26K6UfE@rs zM{wB<8Zo+ELp-xXYL*KU)Q_VO^cQhm zV7?VoW3cY^QOKZiq2N4izDVljHR*`LkLib*l{@uO7J+qn@0ihWszgDM_ims~ysC29 zS=U(x1W#c0|FiejQB`%{-zXsps34$(pd6L1LwA=nNQcthEh!+<-Jp~L3aEsENQtx{ zAgPinh@_%O3%qOZLqC3>_xl_7jyuNtj{6Uswf5dC=bCe_xz_wls6If_&Q<{93i>Su zpzJ`9d077KQ#7`bHXzpxl+QO80H;HJ0g>u9XdTq!z21V$U{HI2dcg-a+i-99VNe05 zCfGv{2q zOOZfLn-?@-;IS+q59l$hQo*l*0J$J?&^E1tH+G)L7}?nwIfF=p0M`#SLkH++zn%q_ z8sxLIzm*WW1}Gkck4OE0+{U2{2q_Gjf6y`xRF1fj3*^BIKSW_+z=ORXD~Owg7f3@c z-~-GDtTgZ_?17%}09op03{fWtYyecMzvE}@Yc4w!2?yvJ2g-wn2jCK-SS2WO7h`x& zYXZ5jH!1jkh*d(PwoiTBE{lyD>Ji_@g5m@&;T${52UeNDy85q3 z=rFpiAP2(%a`BM{jDCL{0| z#fo?Vp2i-L0J3J?=3qM|LocAP&;CL|`x*&3GeMT|1C123hgc5?R0o4;LAo)Nf+-4W z5kyf?hP1LOJp@IkDyFo{n4ldFN(cke0jDCs5fY3ns_#4W2DENSB|~AafPkZ51W@>~ zVAg=zyiHS}p8rTwPzQEug8Y`*57h+G0jOoaCe9AyR`1aisA$JS`4CNk4-eB6$YSG! z`?#MK@d8skxS9->$oA5J*wzlc0T~O%2nLOXe!`;oZ!`r$X&+`whml<(#{CL4*k1wEoL$`a zleAm01`5FgsvBrk9Bk|;Q~_u{AyxxrC|DUg!=bsLmtX`7@P8L96a3z$g#W;KAeSiM zM|zm^@InAH5Z{0+X6FT)4OSA|{UC7zp6`<~sEnQXKM+zBDhD*d4H8x0 zZ3$Zt>1BI!a9HQtHyTiQJ%Gytdu;7C4L%b1DL)+ z@usNX<2+(X-kYu=5| z0hj+DfqS z(hltB&76^@4q%P_r60fv9*o@12I8<7g>-*ja6kE=D#m^oYh|B^+TnQ+1ScShJvxJg z#eOn_(x~n0K3qyv0}m)r`^shqs2z~m@j%(i#@4{2m{}PF@dQ>2h^v5t0jeh(CjhLo zw6}tSKAdtHVVc_>lO7SrF6!Xwjgk0kuHc!NDvK zpbB_IP}2e?!Et9-$Bv>ifB^8fWw^gUKs*3&8DMVgD{p(Ew&{ZX0A1`51qfMU5BdsB zH2(!LfJuk+Ztyas2OT5^R+NE)gAU+wL#hzm<(=8zolXF?2O-nK-33r1hlu6x7EAX3 z!ZZ#*kia-@?~YO05Czsbw9Efu*m|dhgKc4oS-_u zb{{fc@fP+GpfA`_ zB|t`AklHSYn@&+hmKlD;0~ysJ%e*}lhyJfjY=3t-0rWk92{_nLFl12Sin8jc${?*9 zY+PLcRY5X#kHw%YN3hc-@SuXJ2kd2e|H5PbX($4?BL~TBpS0LvUTo0SGH{>_mke1O zLGTYc7^xikZ*+Ydha8~b!SOgiCTvCm|93X(K#YKG+V+?7AOfY46&(MX9Xd)uSva9G z)#;5K4;qF# zcLDZ(*ggO>C&)ek7$hg1n+t%lfkyH#Y-ZdJmFf5Sr`(!q_>- z{d;t&126&GC)gl9AJ6~f1p6=1rNCPH|D#L6F{@PJ_*GK-qF70Q-yC#Of1^3z8456J zfW8IqbT99|vKPw=h&$LH6n+5&)&M}*vhZI?_%B@Qu70{R^@mCO?@^}o*bg6e?A!f; zog5r9>A>kZtYolniy!bGK8gT1ZZI1Gjuep8V1rIUpx>xdkiRm8ef2;B9WaE0r}S#j z@q+>!gX~}|M1ai>!llD617NoQX(+_Q;%9fc1J^Mwa5?orUnOPL0GH#SgYOBzTX(2a zdm*RbF8&Sa7kX=3Jx0B=twZcLX`{yWz`;FAW|#njImACu=flu%j%{RM@MGW6BFX++xh8w&IgTEiB8fI<4iUWgI9%gMoG{UQVyg6I(EgA7LOd_XpV|B#Y?2q%>TlBVDhAVAn&34+)iU~gd4zH?~+3UUOtsVF1S z;d2y7@IbeHQA)~ov!IZdJ36=y*i3Uk#0qVe0cO7u2uTGp;OfB+3LFx{qzpZUw{_tE zE}SJ8lz&IG+^w3O15^o?IQRal!EIkRXP0eEOHLp`J#8J_x50ElbGD;NZ7a*5UK39f z+yA`5+UX@Huz7HSbIAi$ZFgtCZVU?CCY%FP2VtxNj}&e&;Cwqu`<@sEGqQJleOPmb zrV9wOof+lY-Gjqcz8(8BxI7EZC;&11%Zx%$fI#^GGYa-zs2M$ctf2?u6SC4l)3!Y^ z;2^@t2&gA0VSZqBg9tDXI^Z^A-51~nYU6HHE-0~WJ^>M&clWfcbhf)k10erD!?FXo zL2#C|Yi8P}T=pINClvkyD3#mU&|&4y8^Dh8k1+syO@L6jJqWvG{TDkt?DeystRaj& zK5!8TUTxwqMT4QS14cBcJ_w&17~yxp)y1trNDfzM+~5g=VXvWYzH0;6J1q;{}+QfoJ?^F2UG*Idf0knc?1=r9x zfyWMt$am(K<6mvt+ueqc&UdW9(AJ8B72F1Zw^lH_0$u{B4I#)@2Id6N=KWd!*dv11 zVcc-=IxMe^Y0<0;r0;qvgL7!;bib`3`XO0-&q=+6iyopkm-X7ZjLhck>2{ z+nZa6?Eno2ps|4fI@=Osdt(RoP}>_jFvehG2Luo*wj4C(+tQ+Qwg5|uM70YDD8dyV?~;L=6y>_DM^ndpD)-XIJf4sbE& z&_o|LF7Fe{JGvHhg3b#}9q>Aqhi3t-V>ssY-gtp62^(+?f#2P>%3THhMTy~kItFl) z2d+A(_jby3GyX3^8i17z-N`%980at-3JVKR`cb<*=!!a6)u>!lP$LkBVb>xAzYMQ# zScv^?o$WOhD3Gu<{y>co5d&##wOs{dQimD&=n|*p`S?*93ByS-k zN0_SMeLqkzb~GAbh-asBvjbu4Q1c464;Y4_kpQoO$IxX_RM!t1a3Bq9r!scn^ur4F z_6I84&+I{!cHnNT<<2Enu|sx0xVqh8f~5sey8reP>Pp;yRH~s%1c3jdx@%ztpOSEc zb9_KZ;Fue1%)td>a0vzC+#tEHiSR=cOCb6GlND&Uv!DvVst(iy4IGGG4ACo8E^Jo; z{{auRHv?n_g*)YgbxZIP#9RP(g6(PWS11D5ANmS>3Ln;j|L|rAIxIYFi$qBWPJn~K z4erXp(~C0b@7^8+gtT)hPZAv88tprJ{dcW;m%#qju)W;?0CxnyyipCiHRRL_g2HE>a8j5WTQ!A)= z+msEr1yWNEuni#Zpddh;ApYg<1!lENdZY7Ya@Q(sU~V-^Fx7-o<=2{Y&$KSBaXXLZPX z8|c(PLB*w}R=0AsHQRlFORWj%YCr|u_lg8?>wpB9B)DD6k5F{5N65L^0(&38oablb z;RiqmVC?|hZEE;M2WNf+bQjqap~!-e1831LxYQC3j-DX)qopgTXy+$_&V(NLV)OAZ z!Ji|Z77&e*y(eHU2yiBEhESGPU~%qn z>?GvQ{My(%T(|e$O`2QTo0>x~=%#LtNT85|194eN1nMP_g}aw$0dUU2&XJV|+-os& zLYR4&Si%76um=(JkPXTPz3}yRbZ|tNgN~T_TA7=Hf4JT*M($<^S7$dfU+?`74yFJY zKEf145knZ8fuL|Gcy_pSkZop;N&^xAmr(&IIv`TiiNM~kYk(R}9qesA_g;r*8L6eL zAT4&8ac2m23loR%)xANjz!(Cy>_C6!20$df2a8bwhd-`xGg$Y^m9;l_K=7ej3x;W@ z#qf3ptOC02RYZ?CSQfC40D3_Ht$Lg45s>M|1ls8T*8~rL@;5q%%?1BkQa{`zX`sHr zqeQnoJpXtB+`zK++3e=~tmjd-E?xlDUAn?de%K$bQQe`j2jzFsJr9gdZdnr(#`d$jur?Hm;^=a;< zKz&-fDR4;+X|$IDwHxoHK;KPvQy`KN5(>0tzncSg>>vkRbKT8><`QYTF9}A-Y&Qv} z3W*}7o&EtO2WbXO4z|1RfF+9rT*%hQZZ``GPK<;n5S}dv1`%no?Ao)sI&*z53H-*99{ZA@ z)t>v3prc;9NwA?pdYL(+sye_cfoT_tZ~@B$u&8mj)3D4mGxIPr!Ts3pU?OnK`pK=T zl@c-X>&#y}IO@4ImbTm|IdP+G(Z^UY>Xb-r3dlL{F7hU2NUF413K!{NDq^As$C67$ z@m#mz6R&1DMo1Jyh#?bpc9!L-pc4Oyd2G6OKUwR~#zm5*WKBtUHp%?B@Nh|oT3Di; zP%YTujNiEx-EWgl%16o1Kg@ZIqdeJ9&qus=^SiQ)?Tst^M| zs~iQBiuR;8YuAOaorMe@YkCM;Wkj)?s<5mTnAWR=`FuF>*zrVw+wl!ibSpdG{^LV8 zm^8LnDn+s%Q1Fo-C9E3e^J~6SiANZ9p_-R7n@8(JZ76dvQ^(Wz!jSLm*p(qgI+)Vh zckkcvWGV3w?yzudc)fg&+Wm)dcm9!3HRr2sO$DKN8PDG^EacE$q$+DV#%HA&`f&ac z`>?>cN8hWQKMybr&1lcJiLB+spssPc@pzU!Ya>K3$;pYF$6(O}yA@;N%k zH8jQ2#E6i(&nktDx~|XZU$+SD!uu9zEl#CEM^_N z>fT4vx-e_LcHG&osVMn8lEM26Q5KVwDLvDhOUHi&mJz=C>5gV)N!ruXzS1gMM;eXz z{Ehsr;n0&K**B&=>CuRnI&NEh3=2>C(M+yuYrp*S>_aoeA&+$C)Ug`x(lTJz z2N?|2(b?KkCRR(o4UTMnKoT!FPn0O>svFQuD-p1E{MAzs=+h% z^5SjdAMU;4IXKjJvWVFeot%O(3}QaVn4Ys3@qLyW%b0-SZ2wWEuy|;rPJ_3-LW*o) z-AT9izO)~c!($wFj)nBt(|zYYh+OK^MVHVQZ%ni~z6w$7e_vYd5%@n}V;YMn3@N3-fn@$%JRxd?5`*%0mo zM??31q=M)`sCs*_9Uln4aUn8Yy@6!4VmDryv z>q&h@%fe*O_?6jaLp6_0`TJG!Ij^MYl=2alvj#HZY%pJ#Bd+<*7u1Tp1tK9=1bI%+x>6#W1LaSuB^E2>Pww;3Q%sDAm zo467FLGp|AT;7;#9HoB2qzDUsGv;8LM8}e-ungnoqaXWIXfTSa@6H?ZU|C5rezyJC zScy|Oik_)|#d))@@OE7PUELw)+O2#7S5}JHG=ApURm~%+-GuXX?assC;(jVt`|I=<4~|)p71*7V`7Wn;p)Fi&sN;s@y5~_!7zP+Hl^~L$IxI`Ho+M#pV?1XShHvZ=e%vA*F)dwV!CSJ zES-7NW3rJ&oaQBYf_CX??`L8^y?2GTuh`PaUezcjkNn29G0OO{Qdd?=tl>H`DCDJv zLhPJ7{>!*mj+?v{fzjLsq|pO}5Bw7}E=jx$`euFVc%0kM`?jVs@AG)vhF8#Xdyg5C z%Uu(_Vng*|?YW)bYb{H4)`Al*{yGyM1?h5%leD|K$LlqyE7hn58Pe91s`Sf~9&fzixM5%ac|ENFliX!v$Td_-Qmdtv;o-CZ=)2_K;U9;t2 zot`&lEUv@(CxS^w6yp{$8R_2lM!#47>QmWgnf!UUA3DoT*hiUJ?Z&)aMOOrK1wd?e<`eB#Y5bqWhf#wgmIZ(d%)^ftyq7&?x*0=loRE@IgE;yxD9^_q332hTplNG4r|w$5{4+#N zSG^}fjOdbWRdaYu0vTnhj4{);LL1P%@O;xSNUo3o7^|Urro$}obXVqspvY$iEBy0qgoPDixbu+S-s&~T!^-6|t zjOR@x$eB-%8xu%%4G&xw&)=9-o6jFda#Gm{#u#beO2z)9my?{IG&M}#U*aK>IIe`7 zwfQai+JyY#Ret8vJPl~kDYWhsRkKr-*qfpi>q~hJ(d7&JpZVXo4eL>)HsWcODf!cB zTp+z6vqk#l<8rd6<-@I9*R!qtFNVs|=}B=%UOeZL#mY^Qcz+KWU>L97Vo~dJSJHvU zm`C@AUbRjA=@ylA;S&lUbjEOgT6U~Hqit_33N~Ljj);6)_y-RR`;WE`w4R|#=J<4f^52|n)c-Lq^Aw|>0ke-=pdbgkgx;+U07S81&`PyeGK zUG`Uc7o-YD+bkQKwzhN@v&ypHHnxh#US=s5tEeh`{gkJY&o}U9dO>+c>Xq2#-i2D7 zjy4@OBEfP`C0a5%N%7?b^A+lXhY{(|Gj$iSRK`bZdqu8!+-4yd#5M?Vp76?&IuqVN z`WT<1$Jl*tj>yrrTIvlP&^*iiS)+2Y`t|Up|A;1funE0H05z_; zPr2Mv(G%Es?$}OE%lTDK4mUo>xwun{GY&4Ronss2n?=@kh^CmM6`c6q6FRz7 zipyT7|I8z|w`B1N50Ryg>w;=0-{$}3GpH`q7}5$q`Y`jDRne4SsE0XC z@Q;;%s(|LwaWTqTGpvC#X7|||lR~}SjbCQq_x@(&jk(Is^!DDblZ)~+DvZ9Ah4CO- zWT=Y;R{rUW_DSS8RaHmqZ{s$G=cjiiIhDSa*NiB-XOnVt;)8>M_o%+p$*~pOv@=&; z%_$}0DPQoqH}`90bK+z(-`8mAw$H8aV@$575_nBLZNnmNPdCN;nueBnLNoZw>XjZk zUZ-aKiq0+EmwhEAwhvbd9|<(wjdW8t%H&&k*Z1OmPr-zfJZ@xK(CLgLCz>U`F@!zL z&tpgw^nTkz@|{7u;!?lv^=|>V&Hj0~ZKB6UvUo6x*JDi2aKD;e8z@c_dzo@4`(7tU zJHlDzx`=k#%q> zk(uryg*m8(+f{~n)$qPQg+R`2=a|oD2EV7e&ZQm8@mJKocqI0z{P|WV`}ID`>f+BO z$THQ_-PSY=xCzfE%}7PbJI&7uzME6$w39h@M?ULJv{i1Ig+_m7$bHB32!bbz1{@~u zrP~*nx?2{BBSly;&MrBf2=?Ib6o1>t{gCU=zqt6iY8kvuLOYLTw{qGcyLOqIi zrn;%cF=oB5mItf;Ow-Y)434PI@C~d5G?^@07qSUjglrK$(UoeCb*n_3X$Lu`oznjm4_jbT%S0Cv4K6iXll@CQ&X)Vg}jo+z$ld^ga6f|t0%ex z)tTI{U%i&$aA92Hyzlo@3tim`8Slc#IEV9$D|jb(1uqZ3wX^$u#Q9{3^W>#;$K!-_ z%ksuDq_kU;P09-5`A-UK4T*WlTEvMtgQTyVe^6KCDfx}%kwAn*ci;oL%o=SXDyv2C;tk#KKiV1G&d0G;e5=&L#HNwD>}abe z|F!p|*qHfTf=r(x9G@*#U-yk65)Nc>#?Veoc%!rQHI7;H&f^!=Ms55I^w;lgF%``J z(Zc^EG<(wQ6OLGFI(^*FM6ZW(9w+b5DaAg-3RTx&J#K1P5{`D#l^bK7k^Y61e=WJ! zZ&Lfud?GWSW@>1d**XV?1sbpMoig&>PQ0OqyQ##X@|I?br|dU;(SZVf{w7&|rbvf&p;_8WfRbY}Y9V zQ%(lUiaIEt=FzR^JvNIj6{U)))WU~Vk)UddG>cpxv3Zk`@8_lxSKi5qhczUs%%ygl zw6g7)>zN0)HMMU~N$2}Y;#J!TSzH`H^GUl_{B;P6VzIVmXMRc8N4YxD`^JA%@~o-` zG%)Ij6_qhCt1hgZ@L~BBQ->yjcIu>SV)sLzcXxOQ&M_npJDfJi?RH32uDpqMd&&YS ziu=xD^U{KKm&3VH%>hf(X31&YLTBl;jUxh>Xqun6E@4hPi;5W-X;8Gi_)&~IU{aRm)vp1+9%+8+^oeI&a^cbFsR|ggZ`0$A z9T3Zet>?*RPVtH&-%3_#dEzFwu9j+)#j&e3Uy|o}R@iJ!#Kb=2evC9vOPPw~cQ|>O zO^#%jnXcmXhxD_HL^8CTefF`Vt&CNwWX8hDRTAZ|q=ar4p3G#&*JM&_LR`}jU8U&^ zF=dYr9r-}MF-6^Yg~@3|$f5=lla7*&!rO-NV#w8mqeo9a3Y@z?ek4rfqwc(6v2sY^ zhs;RpsjTXj59bKu^&?Dmx|ka;;T7Hq9lC019sS98<+cP~ zQtLmiQEp50x~FW63j6UjLN(J{H%lt!-u4k-9C>voHYFU}@;e@*7>ha?ULrp!&$s65 zEbNUDZ{^W-uDNSf(o>J((;f>McZ#CFpFpQ@lfj{MokcP@5KERsz(p3jo@9b2DyLu; zpHKNn6-G0I`Rhl^zNal$UvzuZUQ3QE&&RiTt$n+TKAmP^F!y%F@g!+mBB4BmhTlP9 zr`JqbtmZ!%or!fD?An-$%l&fg4axn>Lun#O8N)wt924jVZFCgQ&$C&Tr+Cv?KDR>i zy0yT1to!+6X^Oet9+m9&r;T9}S|;DN+Oe&T#oJ$1Vc#ARMu_!mZeeI-u;p3kH$``Vrrgtv;0$oPvd75X9>n1jCDG%x&H!YS-3_Xum6(i<~yBhTCS2r(KTQcHibdv)G-LKqI zDWy4G{MpaHvoolFe$`lF=W#sYV``C@$#ugL=Xuo4hLcZBm%ph=Ctb1OP`omVy*NP6 zBPK3cQg@zZ^;G;&{~~oeNv-X(aKe(Rg>LigKfwmFt{KZ3lOp#KGcgQYXQHrwu~=qB z8n&LaX~RC5>Y94r1wnL`(gp92{CA;ONBe^@w2pYZyFxoa(^+4%j6>z9QRC73#)|OscTGDW)}PZGPEb)^cs*?X|4a*zJOGWR_Gc zy6*^^ogccB6AE!S_+h3{wqku9AZ8VbQ=H;_Wo_8Pn(QV)YUnyGa{Epj4vlcZE&FC| z+;Ugv3Y&n;lj@#mw%pp?8B<>)1L+&Awep?`o-i2InvyY=@)8NI&VBZC6YIIPnvVFY z#TSW){CCpQqP_{%HXnkYete{x{d&Gh)Baud8=j7J^;6@qmc4$@L}?#AS8B?-*s?O~ zBU%)?aryq%(MP8ot>Y{{zOHG?=&Z|pa;X)eb1d}OQQzt3Z`=w-$1HQz?JK&C1Oz(p zX?XolTaIT)y=$(RtJI7yd_IbS^?AW9&_dmMIqB0_w2pl@VR*zvrg@Y1Z5#4Pi}^>U zKRg!Vv=-E@3a*k~ctG^ym}=O_aA8cFSn2Y~=R~wY$>vHoSx=O5y}CsG!@wx>MslyN ziN0nICdMb1M-Mm@Z{a<4^L;_Isb@q>j!ol6v%chr{ptue@u`bW(L|;+Bm(c0I}=2H z^n89iZDnXpQomF{SW%+SFK}BXIBlrzMd(JCd?>k0|>hgaP=XxD2W=8(l z5RlOZ9Z|kIz!71M(Koji{w?d5cH?6K-f=X+w(>N)t-9dBrIzlh?6hOP_Foa_y=!lt z=hrJZ9v2`G`56OUe)8;3a`SiMA<2xxf_=kulj0*OEF5~7=>$9=SD9k@49@RR%o@* zxN~e`o^)XIzyGDdkG?MxO+4kHMmYM-Fs!Iek$NjJmvG|l%ahKe@1q}&93@#+?xT%+ zRGu{2XY{c=pyVyNqG{u)bB0XQT+#Z=kvySKzGB*Pv(E~+D@O1KyZ1HSh#XiN_7*`u z*K5aHO;z|H^LOhL29>LIIW|?3BX$)@fw^XQIicb8vK(LQaRg?mp1*~iy5IeYFc5OpcKAh=~CF4be-`pCo~Q1706+@LV*it>v~^M-7vDiXpR zY`8H>Lpg~%tUlae3Sq~nwY#=R=+s@Bp3k<Q_n3aw zRxhU@x>5?4R<%#@j8<)nrG%aaKSxwy>ty^ZvHBk3#GISw1&<0_->_P1lIYfU@0`%R z`1YDHF7`9OH&%(BS^n`ydFo$`k|}nFn-YbL_15~}D4KV_KUr0L`Uq}tM1PvcY83C= z0+mFwYj(04d_E z?gQERgG#-_h3Mfw)}PcHlSjP5z8j_%e)rco_KNS0*p5XqiZ01wj?6DVx*DFgd6QN! zTqvIWuOvY#K^2|cZ2lb| z$(H1@%^1J5&0nBxN{%=;AI9S2GkVph;iYP!2-!4km5O|e*tLO}Xy4d6=EfU+E!Ee? z9o;U42pZEGu+Ygo>7!yAnto*F8Tn>w(JrNrxM1)>{|A#MBr&y!tEDIt=NFSux)07Y z=||WqOl&JP*>W1PLX5-5)KYxKPlPERDf1-t@cjNE=V#Dcy7xss^+h-H%dvuwXo&T@ zoW7{DQPyWa)UFpnnK7x=(rqM|;l}1faT38N|A%Q)ilc})9i{*$JG`a zrKkE#LCp6_dfsq(GM;DA>bf>I#I(tM{l%}(L+1&;{PZFWDB%u__;T^ovQ4e3)~7EY z3JqKd-t^C829IICd#&F)wbddXX3t|ndmK?Trdwrn(a^5>kucF>;M#^p;JX|n=Mr~{ z@ZRL$F|9@+3bIoBiK*)6#U{?hzHRxx+6sBH@IIf+SfTave(i0Kl)`2b{J>r`c*~)3 z^QFo2Akv4~NwgHj*4k6DOm2Rj8K+JER6F3r;JV@bIzuF>efcT!g;iK;#&Cq&mx7nF z_iO`-4a`opz43ehDHVOq538%;Qf#bkobp7qwDALxW0ZI6!kmuN_+jMExzgEtr%Zo2 z-8-#>k*ZD4hn`K#mSZ+ZT6sILJLtkl&CP|! z3SKqMoonh%#YP|Lk7=o-D0B>qZ=L(LX+O$ZvBB<{^=!J5uQ8BU;%LEEC0}Ag4M*L# zu~yc**pgT8-txd|=hDHGT&cMyBO3P8T1un*i`_Ufa!G#G^CRwtRio3ud4?*{(^}yz zW6oPXxFK5YboF;_pNGiY9NiN9a}V1p***_r^?9{Z~l66Jm)DV@|r{8!}ivxaWu0&Z)x$bCN4JRxr0nB zHi9mEvJG7;gpw3eRL5y3%#|8i%@HYE!}&S2?OOdSOb%Dj<|5yu{c%zo#IkM6)4NA4 z)luT#{_(R#_3x=l`bPSWOC4L*lnO&QNnZ_43_KJi4!FW2mlh|rl*m%&Rf?|PfMZs5 zM9wCh9^J`rdQGQ;>y{n<&+J)^#tFaQ@j2s7G#jQLaOZnObz_IimG3d|MU&);`mUX?33HmjiNLw_Xv<2gvnkg?G%wZ7BKe{DW-!zGl=C9i>APo63~+pp zzbdNaSajWkW{B%nqauYO8wqc?cO%LDvVOLYshSR%akRGC-0?0V0xTTFl*N&e1W`?& z@9MRNG{3-lZ%m%VRDNQs`PJ1tUK@38{-oOE8BB}gqLMy5bf?6d>0KYI(9JEoVZ0I! z+spUIC&&vo4k$f*HS=ZI?s^*A8lOoNaYPzxtz}2|h~nkg zfh4T^Z-z}DFP2I&M9F!`v@jW|8LYXZW6_SuWd1TdFLt>h_!`Hf_e=Tu#{BQoK4nSr z;3X6`j`5h>858=_8WpJV9-c{+GCN*Jp+t{A$7}mz6?4b3U2d`5uS~M`rBVSFs z6q4|6m}X+zRIIOi$(Fn3kYSQ&_S^_;U&ZPwH|I%PB-6RRW@X}d@fAIppW#Z!k~rDI zCc~0sg~Ac$3q_AcI6r38iUmig9CLSwu{^G9K#76C#;Tp>Mg;i2V`N`qXzDoWn94AY zo5L2Uv}kd`)cLg9vn%R3MVu!l0~AaN?T15hO$n}XQwVtD$T@fjU2CQ-ElcXfsP`#q zXw<%_QREPF-&|BJJSnA)wc0AwlgwG|XU-#v+$wwoRh7T8&1ZA|+r-~D*bH)T)sLoU z7_$(CR0AKmf#$4S2P?X4{3MssbT9hLzP%C!WIscxel`RJGm(@DWwV4{Rw*{jAPX_c ztXAo^KRs37bz@VTM8Wzk#sw3-^iTaZFF=LO#FDGFNr?+ByxtaG!MRb#fx+vm_ zGt!xu>RMs3`&QfV5-6=?nOm13OW6gTYJ@NzvJrda4~CaCZw&To1z+srL}#$AyE>W7 zZ+Ouy2+LS$#IqwQtj``VoyVpi>!Ff)&w2e?-kE0;e_mXkc>3Yh*GrCD zzIf?3Y~n`eu$2iatZTm-F^?)r-+xG^^HXAz=FC__^3m!SqR%Hr&deVdy@@?2B`;WF*|FrGjT(FWe|+2D9?ZN1a6+G;Gcg!Io}kW(lV5 z(qfy3FCtPbmV%jzg=1Jxyk@2^nZs<$p&_|RGe&JC^BDhDq9VgH$KP}=bM4ky)E~n< zC>l9x% z((6QDde?Bv=?a>reQB^P%}bGNthZ%`4V zRfIYIy)%dtRL+{}>&NmXg=)&$&?yNSZ{s=!b{1f>&m1+%Rq6QAeE%%_+)8Mjeg;W8xQY^=X=~+fIIV;|7lfFbeGR+&^AzG)clx4L%)$tQTzmVf6e>|uV>yMyKD0I zw7AknAdKKq;P8np&A2l}g3S5#;dBYMDIqr|Ho}9_C0$qq8Aul5x6bFjWoTAOXpzNF z>>ujpY6#C5Bl%W+$-UKFH(E@FSC>+QtnH*WhUrg}{__M^dM62=vHpsv>Sa=Ke}T^x zODNtlYNRp3h}(Pu>vDGdB6oO;^yoJ{3j?XAHeQ(ASjpAW z$2=i2A%`yL?4>@9=l?)F%EGw!jz~Bo3D$$V??>{7T!e2rHGRQ*%KwW81Cs<{6r3rZ zI^M-z=h0MnX3c4xPe#}`;Fz7gu2=GxUp|s^0meQRPCu4a${L+&lwO261cb}y69qY` zd-aLtYA`b${FnF;2Lfg9 zI6Sa%ag@n^ZPz;ic7yo8 z)!6}_++AM>IQ2hubpYW-0RF)LVXh9cy7F@3;=t7b?(!i|2jG_sTphseUN$Hg6A$?D zU;8?Mr2=2Y{XfOo0jBiB9tit=9iSKf@%;Z&R|nV;=8!+b|H#(?Y2*UDlU(76gl78x zb>9c*);{o=?Rl~PS@Nq)KlF$JII>=#wnm&PsXU%7sh(q?_JiwPWyyc(9Gbo-*bV9hFS z{Pp5fpPE}+h6ozYy^aWwbHDj@o+{XtKuVy6LXz`XvF6Y{ygykF+-GhRdK+IR5}h$^ zd^k#G^?goV9p!Ewj8Q>b zl1wlz#Ymh^KkaKCc&~}dHe+asE~r#!4zhCl+Nqd0t}Kdg>B~$sNEdzb=IJXf zfm87@kyT=!e!t9$pzkRq@0~kQl`j;4&B9mkEq&%UhXwiBg>)f2O1&Bb$}Qt92ZJ;7 z;uM;>qian!+m4m}(z-}FM}{$8mT{-=39oAISt*;fZc(5`KHkw+Y{oS&)8z_{d<<(WqaGOh(Z9Z~6ZpeK zkA~GcasG)m8jt6S1ujvlC7IfbpnEh}e!hf`o6OzQ=KcBzqxF6R+(vR+PA|==g-LtW zg-@@}8AO?h7C&Xc@bXEHOVYApdBOLVKDs&Wj(D(I^r#C*XH1MuHj{p&as2IhueO)i zM#tNNI1R*)j!hF`5e}_4b*!=dVC)(o=t0My)q4Jfz17hnU2;ABVHjqOhj6R;dzq(e zdX(4HrIub>-&So2zky_2KR!NAJdL=WdTQ8~cic;RDBkhO@2oo+G8Z(LhXPE?E|mET zm~!6BQP0Ew$i>ezw&s5Nl8Jl_!%)8fqgUsdW7?6$gkC3Y5G1)*dPc7|3L7~!8FPPS zi;`V?*&%<5CP>8WUEgw?Q0TPz%QC@vYxzIXJybU3wo4<_2EXm7uANHb8)I$=%>GJZ zW2DgLcXntsRlQS%&HG&d(b?1X*>Z}iJwp>(TZ`MO zoxwNOdjHef^7rSX!Xg1g1LM!svp=*rd{@1GyXP}MZpisNW-ou>B7fn8RZO0vcuh*| zxjt8p=X)zV#C2jo`(9whMIQfOPOi5;nXmcQ5>9j_(w7AD9#K>6(N6LtArwq^dB$#? zq^w`{Ik4gsb?u25jf{$*Pu{}4QON8^#RU>}4x?XLJE$M|-gO)#G5zLkNz5r6P8fbn z|GMP;c~P?~zfJKPFsA`5piYNF^Y6tIm|Yhi z%bQG17~tam7XI_*kGeybP%Z-nQTdy;HP2lCkCz;Yj#8y*bWj-G_kZG_!F7dQmxG@) z;{|z(pw8tkZ?=^!6HQsN5=?G7182pHD`BodrvCnc!-YyS!R*&etc*S{aV~5L{W#a| zoL1@XIaq9|&+uAC{$r`n)!!dZ>vnd*B zJ-P_odw+sfV^{BsbdW|lqlM3hr!2I02>1qY65jx`oEGoZ6XsZ&}^mS`!OP_1Zk~e{w;)u~s3rrflVI zbDTy>$q}bo8IseylMz(EdVGFmUU(rLKHB;=ynOTQ)PO>QfPo*b>6K(TS*o&%`o{`Ma^B1wNdgX4^okDi^oWCVyt%>EG!4|f__BK$xG)Yroqnpc9OWw!J zzk6XUW!`6?%=K8VwYce2kfuy54b*kj?6LznRzMpZo^3XzX1=YA+*`C`r3>#J&-<}9Z%c?+=ogwZz zXF#8!o3_vk&O)T{)Lc*IX_#=$wo7~#jkxL1$aSjOLqW3rl~`(cncqgE(*1MqRIw2X z5p(J0O&$~Ml61*8-`ZzC8R$J*k?CdItbU9i7u_`L?%NmRG2zCkP`2{Jx0%pud z8!u)T@g@WF1H7t}zs5KhVc}1I>ZZyQFFdY*feerR#$PT@yol%@c~9einLM+*gUyYb z^_q)e0B-#6B%j+A33R2zoLQp}=%(hypKLG_*i==%%xp@w$@~0!y;A;skzK^F=!ikC z812OSTHT7CT0(3lDpfNayIx5>%*Ro+QI0p-=8NXTjvv(?N)X%NwG;FDxcDvoh-rC0O;`3`9N2``n&Xki$T)vOzpP=+Et0cN%)JFgzf9yN=samno<=$pP!|@tx ze&lfs5;WbXG5%Yd8uzIg*0{;9epo0IpZJ_G5GU9={Z%EB$`RB0v43sT)b)DTAV#bF z5v!tHxx(Je7k_#Y)f#z?ZSyXZIu#k#LB98JuhzNBNK7C5(Yks*4T&rH`75Hb7027k ztYPd#8s;OxyT#-+)14bWbu8W~CM6-ZE3DBup>z+32mB`}0kGGw5Kh^tHL6 z&?Wk9?or*zw#z~d`VTEXOw-#G-+5_;!)x3Vw<7AIPqN~1d5a}37#n|vRCzi0wr<3C z>*6u#)9OQ2?@lsN8T|-6t2$V+=3<`sEGPHFRXcwZ8#aeh#tA>{khc?~NBmz)O@|o& zh+vW^a$2aT3Et2qnvu=915U(_I9FdCEUUZuX6wtks+ohKd;I4LXHybKk=f4PqT+P( zK8cPqM@tL(Uut13IR^JG*c`nV*wG@EO?is$<2A)`viAh|IHyi84aMpQJnrgKPAat> z?tJGdMDaUc--}BsGJwpBYV&5B$=nEQn~hqyV@$Q!Jci{1XP4ta)uD!1a_tG5HW5`X z-(Hro?4_9$ITIL!$RYYvL~fXrF(%3vaUs>=s;EMOk$TECRoCOQ_+GDyY0omeUe*u@ zW|rzY`!y)Rp;F!W%kV3%@!}V+{#3Ik)(AhGmG^MssL%WK#=!N#xyN^=V&D06X}zZo zWzBgjG$9oyT3nIH@`GLflk?L&{w%t4GQy9{CI?jB4nOS`C|>^1{QmAOUpuYzDdwNg z6+er0c)1w582iR%Mt&);}6 zX%-748=mes-EVJ|nwk6%gSxVMqKag4FJ=)pAv(-YHv0@WUAo0hg}Dd)i$V&tVzulD zlw!L);akqd{hrU#7}l^VKfxCSgQdJ3_iI2`C&A3c8aTeXHY+Rmns0(e1AdXzkA!|K z`{COe6yVXOCO4a{(%w&g^gN? z#xWBvNl{S)xJdEiMG6+&!`j(*Y+z7+*(~zPAp2qC8WQr=XPa@M6)_?PQt)JIn=n|( z3$N->{hb>|LT*RlYx$%2Bq;I|Aui6^uho4cjZYg(;(Lz__NchI4I9t=btXZgaX(}f z2g3{o7-nBu7VMB|g4T8bX#wA~1qHIV!Vjxax!3HXr*spqP}41JE65qN);d#Uj6P;a z9>&wv;-2yrP212X-v5Nvj!eG#fQp8sE9a&7j?XQ*_RcH(xG(uJEseC6>N+&fPLr4c znpk5Yg4Si;hOqd!YVU1l)-f(s0uw`slgMk^-%I?QBp<8|5F(o_Etn@f{idohx15A z<`lZH0Wxe{R&RMPxA^T*XpzLA?&Wa28ij((#d_>fG-#g-H1ibAvT5-rs1_kHtmCXD zx*-sQdav$gbcq7EouH-*-vSO>F!X^TQ&-8gx;GI{F7@}U$-oz{UXQD?#trCMB$OK^ zTD#8ILj0-={yzQVw!yr*=Ut0(5(~E*x>P+c`-3@8^{}QuqOoG8VMAGqw(#=RVaR`6Vg((Q0G&uez@LyqK7jDlDO_B zLPf8co}P!^fPFhPjYNi$4H4rIKOgD7D_{E=`u2<;Ed)d$NLQjY?Ol|^6gI32Y{K;| z)fhS@Yr}=ugwBIJ*9|7UlfA4@v%eB>?TYyvbCRK&{ZpdYw;F##b5$GGJzH0WX|6%M zEf-ks8|rkY5U>}~2~^K&_2zRogOu5ustIZeGmxK_D)SrUS~I~ymL{A=X9{vIVdw}(T-$Ik}SadgQ2bQX;l z)pbAYxl~%5fyxKzr{nK)@G0@5M6mp?k^rRGO6?<(x0^My|4_kdS*>9?D59`;-17)& zFRI@n#6VI0gSS*O4KH2Y8ui@HvZAga9FQNYt&vh{K6(+CegUkFjl=iG_33H{B~@A7 zAe`w-CK_26VwYH#1Eind9@Lt!vdc$J*d#?!b*|u+d5z7mB5@2O6+ZemC8Fz{aEalkFTWSNI6v1!}{7%VhDCjO7rWb40$3#gFz%A z)8P4@8Rs<56=gWsa`Mp0Ou&u`H=vYx*C}>q74%7_o|mm78hw%vdBRxWclrjsD3YON zV`0il2GyLIf6x+*Zh4re6q6fa5z}I>OO$np!ZvNj;SJt)XX4OF-&%h%wV6^nBI&!@ z1EyBUCg&-j9DjnIEoj_LuaW5YkR>%m;5uxhICd_#BlQ3GtfOzu-%fshq zaiwnJ;K;Xe*R-YJ^EhC!L>sf_{dW}u(@ZT)3(}R19Fg8Nj^-Xj+598oPeWl)ghCv} zK;cM0fg}_lkf?f?J89A`aj!#zL^@JQPrNuihRBpp9KrK+7YtggF65^zOg6BUa%^ps zI5c2R%($8MqxxL8-)gm_8u@sPXsDO1OJ|}E-vqHLu@Jx#a|V1Y zMi4IsrZl~<6sXXMoqDYkg$h!ZO@cO{-duejkFyW;@I&AZgk-Gj4k<6j?ke4~D@`B# zmmV~HNelZ)gS+1MXJ2e-D#J$}a68u~3xYBF#tTjcE#g&N7;lv_O5yHEr1ageA@mj9 zX6m@CIilwj+pW9;FwC4illg3ko@Kq@qda+7NJOz->--rleV>kJDufX{t0V}=q@_9P*IMump^7!Cp*JZLR|EwSVSM|GU^6CNrQtV_U;Nt# zDXJqLe6dzawj}IF#&^SXYFwx`b>PUfCTUPc^^^E$t7)U^FhMi{T1PLFR-mcD`2dDGyzZQb#8xp@A%z+aY zMe3pYTNBRU^bFhR_Q&vG+|ede+Jj4wqD4yBYLuRtomC!(8lmX?R68c}C)4ej;fjP# zjS0V9znEsH`Wd=>6BOGpxGyO1tP3&eZdT(x;`x>>|6PmRIf`}mvdL9cmF(i2C?PG2 zH#+3y%Jx79nNcl)>NKp)3%R&kRhnJ%c=hyEMPKk+*I9kCy_6$QP@IH^-bIL4qr(#a zJR6uT1Eua%0OkVr@mfo$b0{6gbG*x;z@R9HGdcyPrfI_G8}xt0bN?!QX|4YihKuXp zxNLw97!xbozaaq6%|!Pvb^Tb`0EL79W4e9{|C;6onE!{e+tpCMu1LU~=Qw;ZiGc~_om;9gj>%VFF z0ownm`TqpH{lAXjA4L5Ax0&t#awZ#4RG1b}t<%8V2%u^DH%T?X?f*CXKZ>gTv)tT& zPLmBVuMMC8?SBpL%{@c1rrnEaM+8UNM& zq`3|B?Bp{GR-N6^kV7OX)Oqq;iC&Z_zACj()}*CJ}@KH7*n-@}&#H z?CsqQa@NEQ?Oiw9nsu8xj!jXoX1YYX!1EfpUNE{XM^RiO{+Y7i}AeXz} zPk|?F`t5u=x-V?ty})BQ=giq2Kfifa)L+VUY|bJrSU4kV`M>+K$h_-!CS6|UW0^7v z>!t^h=cEaDhvuwDk;!v@H>#iYFQvWQtU#v`Dsjb^irr>j{5eQmz$7l(ySGp|9H!~# z`t^}LkLFyZLb)}XIZvK&_cWaP$6>wikbr++AN!r*;r3lwnSeIhk+sU>WrcHy!0@*% zCDwqP&<+KktS)=m6jAA!i#k&IfNvD0dQRU|ww!lY4 zrH9;4Zks^83)4S#2uG)Oh}|tJG>e$}ng}?VBT_&uVn_)Wc6?H=H@L|o!rqL-n%0$_ z`RkT(YSLy0j5bb(#=rzVLAEo}q4JEMiV@_OkfpCn6;PqR&&Oqc-FD01d%}-u;;yvU z{JxHQ%N1D0t=XjxOuQk)8=`y+J-PqFl8`m+BAO#_HCXmBH4JOltcqklK9g`^3Py?n z2%|;*z|He zJ7A;Y$Oo#vzPdV%cNj~T_nI~F1RYjqEE`-Sq2rp(MUIP!eh&AV+hO8C3}_hvo|7e| zxyjQ`(vkj%@i|pl5D45X6}?W(q2l}0jOU#zCf@v;mjND$=7#Nsk7i5DK9eky6QM?$ z&b@d`ZuLcN)eG9dzCk!P-3D&im9)g8be1|@`B;>bJIe-U{JiEvF9C>MmhEsV5hE7& zJ!pJ}(zLoH&8j5k@i0aAXAIF1Nq4;v!7l=$ne8xmxUMVYAHpQbf_fQb>1I@tDp|zk zh>0zpkDkh#sN*m;HM%fQW{rLfhd&HrLt#mdEs!#hn8fQ>xdq=#jA5mGcC_}AE@$Y& zbX#|fP00?PWuZ)Mr7VQ+?}0CydS~w(FW%to%ae>pH=w{Aow(o9yfn#js37Gn+4(ln zck^rop>*Qh9=G2{oNXwhDcF>jKfWw`H$TBwpvvHaf5>J_C}lWZx%1Kb#A}ycg*IYH zfSa%8=IM-(F1A}e$J*_Y`0R1=e$a=cucC8m7|nTWeTxC`Fs65dpi<|RSKM?I!SOIh z!17!K0)wNT{sYuvq9IhtkSoi*U)SyqaR8>26|>@%GieF+$xL-srl{LPG5awl z_Yhg^F8SDNoA`^V%v0UG`>rf9!G~meP$?&aIZHHfv--j=(jg-0(__m%zDCu#pbE_V z3d>b}61t^iaLOm$)Dy_QoVblRTI1W^42yOWIbntz4m=fp3Pk}a+I_B4^mAsEQo&6A zyp8(|3(iXS(Jol>Pc4gT;8r3Ku|!beK*>M>Z0-t+*0D(4eM%VQyE>|uAo~1o-jW{H z(y%%x^D{}RNE>fBG41fKyV8g6EIwt~HQMd>dJdWRP<*oVCpokkKq5c!;~N-V@jj*O z7$8VXFHDN|e|cTg0JSWCZ*iN55b=h9Mz$z@EF=jNXJ^(B3K%IS5+XE|)=b*e(S&<>T@IR*0#iF|MW(f`l=6eIuV; z1+OIce(U6){Rm?;@;TP#Z5i9&&f7HZsVUA8{bzJQgf5kZJ2uq4k^KF9v<{y!1`8v$ z*oK^*)07*Q@((nf>Z~8A17FJM@hD4o2P2WIqNJ$?^=*8DINjGu$Dn;Hn{4Cer z@LQVI2e+7RD9DPugM5y89H~qFVFkIR{!TJN9pTcVtn9?%Qf6{Vg!b9rMc3`c4^*TbD-yU ztSHTZv*Dkh(O}9`Tx8I9j;Aspa45+?modV|G{q4b`@RO-Pn1H4=e1kLNyTcTneXg^ zg{;0U3ZuQoEL{0x^)L<%87E6;wK-9={(kH7$cG${AI_o?W$K(>ca_bN=Gu|!d}oR1 z>6(Z0^0T+waNQIMjCE_(Mz#y+5M8ppAJY5~7P2b6h|9$J>|xRdfytX?Ok}-_itBCt zGSXBAk=7?SFU+JO8>g#o_zc{jn3TK4{$d(C0rpU0G^-|c!3sh8r#^>LL%vV<#cV*6 z<}$&v;gZ$B*)yDZUB|O=7QP}+|FJtQSgGox`8T3xu%=#!+j)Z@^RxL1=e!yecMw={@%o;(d|T2 zjErsfa_kH2r(YuN*@J<}bayK7;7{$ARUbKI;tNiP>}PHV;~Vk$AdLOt(zS6_*8)iy zn4FPIEZkuCiDwy9FHpWauLTaA%ChUf=j{>67G|N0{7~(s6hYQnqb<~REsc<`fesmt z*OX7_`6xnJx@x9`{xkAWTZZ7yP$y4X*FQf%ChWk~(D zALUHl*2uH1W)TOjApCw&Jy`DP24-9YSXnst^!hF0az@g>YYssyg6w-e5AYXxzHtQc zrA-HtyxsT2^e&BJ3f4Z-j+boHajOit8muFAve^~Ao(84fpJZxw-m@Div{pJ+37`^E zIq0xZSb` zUqX@4};&+QXXdj_trtiEi3Ql_+Wm)wuo-(Fg$q3ZLw z$GFbJLJc#e4-idOKhMr9v^gbEq3z9-_rRm;8r;joE3D#!0R;I1_c3feBE}t z5ZtQdb43(y9u-j?g@{q$ zhI#4wW&dGIOp|D)OatP9K5;zd%z#eZMGkAqW1kwz8v@p#OzuusH7oJmadf)X7yNMPQyoEd+t<=!=?HZ1hjD#1oSLA zPh4tsvKQ1dIKDGW7gd36?4PfoUW7rSd~2;hsQ>6){7m~bKX9{uDTmN=T{r&xM2J)s z$7iT?cV1qtnHWNBqv!x(%t1WAq7B-6XpUw{9p@+Cq7_=1T_U2+&8gL@Zx0lFhwRIa z1HTM7wG_NnVt5iSxXwDdwoc%R32JP;S0?&E6lbI^UiIWzv7|uo`X!4|UqkmQepO5p z3{U)_MW?(?Ob~WiuJ;T@S5QO7V|~FDZ6qh8A{H5(cJnRAt^=4v%~!r-RF|?^e_?Vu z(Gkw^7PJ+4Taa%hgYo7{WX+eEh@6>R(Y7D07Iz(e9W0~->EqP;2$+9hC&AdpEcDq< z7x?n-hEKZD3o24|;pEBD_j=(O4TC5${D5UFlSq_a9tlXWApbd2PYi|EVl*tjM{8*# z!z{@Ptomvc=0VZBvbe4nCYD&S`K5WLipeoj*|W31@1Xal7y?z9V2W@wQ9a@G80e93 z7FZl=R(-E{CJRfFUWIU};QT>!Xh%1pPh1r|X#(B-0OL8uCF>rlsoC zdwyPuc5kkF%mmVM>Y^oclbm?$V39alU?o!+>Okn>fqcw9v1=Ps7qBZtp+(=A287&;#ArdV~M5;I-GnTfWf}F)yQ&oQT ze7UP{Y*O#5kJN_snOz|H`eTq#tm7hFR_q;W_{TSVoyUf7&copE<5%7>+Y(JqIUm0J zYOQ{PAzp$kMOYydH0AYWPT>kr#C*kVJsYj={>c|tftdlFs#jj;Lyelk?`;qkbYx+z z3S1{meia2_2h>>fX+?Ko(n{U^>xwR;hXsfeZl!JunYcyvtM_IN;a=TK&h3m`&&a8J zd@h7=Rq_S*xQ*VSHmvWW>4~g4sBT8%dD@Q6!xLNuo1^P0vE5bT+I4~>jIpPIZ7&sb zx2qT7>zdYF#?!}#uG0_7pDTbn9I`3)%{auavO8o0`&P&+b&OSCgP(NU(Z<{y6^L{t@sUy5ZfaoU#;jC3 z+2n1rM3snrK&PHz47kTN+gT9fTaETLp74J)Z&IK+NxOY@BJ&xvq(LV8p}5l{)H=3g z;rfD)$r^{A3#WcNFIZdAZ+TR&-B2a!$gCrp2Ki9GL|^!f;6NKO3;VViIktTXv&j@% zLtkMPqVp`o<7opywQpQ%!fr~8`&8Tyti^XB{iwUBJ>4uSdB@3I29fVPc+v{CD{g0d z!C%a1%W>dQT5iye{GxH=%75<%ynX=T`Mds`l6NFC60+2YnOy z{ps|bSM?U&OGaHE2Z41RANWA9J;2IO@zLg2Lk{aw2eg-2KAzKNx=uao>Rsj_7Y@OP zX;h7eA?i+dj0tDv^*Cd9gP-c*eT2(#+c&$C(hI;q_WU|heK5@ToENs|+3)Rwuz#W2 z01lb5XBBM!Et$@W@`L+_Dhu8(C2rT@2_wkiJWU5|XZSYMQd6WudC#C1lDa$ux^=}Q zJ-Ugx=WCtA_NBZnPNS^@+L|w+l(A^@uks^X#WMQFfmADP9qR#^)eOGV1iZEjQ7 zCdVc}^me~RJJyM0Po;46qNqK&t~HgGPl7yAwt)>SY$bK1&`&Fvl~PIX zOyfo82fS%O6J&R%_q~taA{d4$qEhppsSeQX(aJ^N@;9|xy`}JOX zHVzaQ8x)o^1-i@QSb;!Dv(FD+%yE|GUB3TyGMOwxo^eQ@)8$jsH+;rxe8n-2(y#hR zXDcL44iYhtv^*m@vhU~VxOOV*zCBnjTGh=EZ9Ej)7g^o)T0RyTkD$!f9f%qSIg=us zh@WLhi^)*TO2Ra2WaPWWuf%45+)Uzk@hWkg@hys6U>wN2!$K;mb+6IYaFtWEnr^Dj zL-@8c88?dvHJV1P&@9#}flz2Gf=^N71zI_KzJ7)c`6AOKj5a9Sn%J z7)el3)~Fq#3J>|oV37UNr#*r%S8nzmfqtHOeNuCEiYQ?P96rXSbCzvIJ^YLpQS+CI zunc|NSTXY&wT6w0aW4|-nyav8 zD&MfiB%FFaOX7O~LtoVeP9&(TM@Of_B)_D|2h?e-u5&4Ot8w6f`7N*T8c^MlY}P=Z z$+WHtC^EALJ@|Lm0!Nl+67|marPrDqDjl`0?P}|nsP;oatdM`FBqoS(hA4kHq(BRc zh}#L&MwKD7tLRmCE8r>!BE_&v;^a3J7yPJ88{+E;L;aNin8i(V)Zz+Z>@_T1k_nsg zhp!|x*20=W5dQc*JhKJ>oTCyd(3=`rC8hQ&!SIo58BD!eoGUDaXg?;>Lr z+O5F?Z7j~4mi@W+2sy$O9q5k-KSh}XS`H!LE2ksY4Y5Bz!Hy;DycLUGwRjt*KDZUA zOrHhp+HrE0g-A9)uzdE72o5|G`A(pfCPBdK(Ib<618DH)_+Qr7oD^j!6K`pK)B^42~3>BS`onvSk0g^2;mC`9_#AZ#3B+=#IPgOTwR_IB8j=cgKEy<3=kzY5Z-ji56pIQhd-C1 zbdn~ZGN*!Op>yK&1GC`2Fg@muDRu=KY23CY=J*CTF5cAeH)_k~J@3+en-$U$-B${T zLQDF(vgCVe3vs5;5^nl7i6Lm1Fvr%sjB7^X$#0@d7d}nf`NgsWxS%w_$-Qy=3>4yx z>eYqXhFlXr2+rd5r0YAp300V7tiw-!9Jp0&9^Y{2sht&sBmO*LNkuH$h!D5esCO{D z?%|@XBM+av6`U?NOMoQDv0q)++zBM<4{?Q`vcTtGRYq07 zoU8QfaQ2^p(UuNaD$06F$3M<<2e!7j8sQ&gbs3$m#$db*+-CzhA_*_@NJD)f;rtwu zN}q_Q>gf#YWvbc?SC&+mtaJE5WNdrtoL%0)bpWTWQWyxl3C#=WX34lR5^M{_O|wKV zmg9pS*ZVAkk)w$Ta-?XRDGJ2JYlI*bnG5I=q4yM<<&m$_RpZIxf(k5fOIUxSUeJc=RvL2MJlyA~l_$g^U$*?3!cf1}K_ zG{sTW;uqRoLD_wHWFFsXhkO|*dqD|jWv~BNTshmn?|IU@O{_8j4?0|wb|1qvy zQT<<&<-hFzL)r3Qq5a=Mm;ZIRzxndN(0`UNXJ=snlxq8LMwly$3#!SY?C;m6e{8xv6YX3jMng4%Qzx)3masI2w z+Fwt=|B)X5RUym>P%ZV>^YeeJ(8d7Z*#Fm?@P91S2IvbYjr?CkhW~)r*y;$4R__mC zb|78Ib~lxROckBB70@-Tz#L7ITPz8hn)mofdHyi&qS>A9yPhbP=Ww4v{eN zqeCQrX2%IgxH=*6mcxj;CgL|_JB?&VC2{46SCDYCZ}$Ri5m=9|I~w0oM%LDb(g*sJ z7_V|Ad#hL~f>5wf-6RMzM`H)E&|=ah8ts8d1(@#yOA?}qunH`LNY_DiS=XOuatB&t z1{odeO=JXpVP(C>8XRk_ndiAPd)BXTbavB}9%XZ3EH^|zdigVI?@wYr=tic-&@*Tya9gkqZsrNF$XVdo zj2f#hzi=fGpkR}r$ccl>5Pscq9R2i}<~Fb2tV|6*&g$l{X{c?aC-~Bu_#78)+BaIQ zJ@usTIHpmY`EC|Tg;JQsp+<7Sx>JWDDl=-vTOlhGOs=& zlGFiEvJA93M$*hhqrn*HkWD*Wc(Pj-N(JzMr>eIfLtn=$x0&mLRIw-|nnpwt?&);qj zZt5?x)c9*dzF36DcTRin=;V#zwtpG;hLhYidD`1fmT=%AR{wMdc8Q`tBFZsH6i{GM z))2+qBDgky7OJcuaNZSTA#7^IU2xAVh$SK(-jj z&bU({?L*4$4h9#Z;w=P!%Z3cEH(Bq;FmFWzWNO?1vunXCxs0BBqCp(q6oyp$Bx-Yc z*Nd};(o%y%D>3M1a1UDGC&KpZB*(bANvkHyGUUo{-C1+)b#kDkYWq>hPr4Z*M4f4) z=sKtgDOWveZY)<#PWV#lm0?GRp&7QKxx`v5!5xMk!(|!^b@-U9v&|99qtzPz;qFOQ z1|L@;RXF~t@GPY{Y6j%ynKXVU*#ckW9bMB~3JFBPl)e&ABvb!qVa0?eRj>uT;DZ)H zVZlldIaC0SlkuFjKb7$WX1esr8Gfzjy#+6h0p)rK(Rqcow?g^8R;gvsF5;|NQGjHr z?C|tALUGuL?=#<@4=`^Pklu70W>h&-I>&w{4?6OZe=2pL94kVZfmO~dq#hk=V-jJVc%255oI~?T4Q&~ z@sc0**nx28Kh&$*a?WT^ow}nYG;*4s7x9{;NMv*PPEy4DgW{06*5$~)N#u>Lcss?+ zeI6jLBQjMklIFdsJ>lJov!R?1V0HSifWf^YM{n=BBZ?5mmoF2`tbNIt5UR9S%VyjX zM1buoUl{D)EK3nk2VYLdI<)1JYYOz_%ueY;v`uyUr7Ps;$0Ew082o7I-gA8Q|2GUSEHT$UT- z?5&J%UYQ`ac-7+bnw+(8_&UbEImm1ZHMRzK|p;zrVl zz3VG2BsPnLsNF{UX3~IwZrbSWZEcEFLZ!VvA3gYMkgf9brODbYbl-MGq8!es!-N+{ zZ6L)^7=Grf6czz)q?KGJtCbX`9jJ_3h#%D6p6(%21H*h-Gl^8; zIH_hIfL}`t^u}$hhF5m#W;W;COW|co{D3Y@N$ej>k1jI_fSMP!Wb)DdcK6CvmUqVo z{X6waQnhXldFMXEft+3GJLFizC7U9$#JtOfIQ8fhK`0!J)v`w`5@>_Uoe|30+(UOq zf4pzDW4UkZ<}9fFl6crTuEj`#LiisANe!k-oo3k=E1d-pm& zQa3li4KV=Ge(Wb80VE3rFLi#5SX{+`vm6bq`tpL^mn-#wZKCUDDbir{x_-hMbqSCSKr2whIKq*Iho!&u%+P5G6PEm53tB}$j%x;rM_kmh6F%|< zl~;6r7G7VxaJ|7dfFL?(tn|Ri0&T?|F8YbXVj$>?m{DrblAK`Ok(12%0g)(+CtTqv z{5fP+rdBmez3p;?E z&6k5Q@gBtJDOjP3qs)jRCwnjai0N<_-+b%JdR2JMI+2k>-L4PV2KqfZ3wR9Qzq%@= zM*8;Ft5^>1Cv9Qb7LAz*j$p-H$6PFSwWI>GyMedvDTN5Gd(-wgc(ugzCkKHSS>sZk zC9y{g*iFodhv!&-tx`UdyhCyMn$to9{TbrN1C>5~_5AmraJ}Mb7D7@N@?St1eeWCO zsI9DT+OFEkxF*%xHz16tPw8nNK15`(`bJO+Gk;1l4E~vK{Vma5OR$uO_zhG9+RcP; zGK4bEx&>$k{A<`Owal~c*^h!B71md5QT>w6@+NDMHtCe~+9)6VXy(I0GRAvOYT%?) zLcMN=-d`Rp;ZZI0#^JR{P)})y3U#AfOLQvb8_jUMv3G5{?)tysjX*-$$AU1s(x~}I zf#OX6sHFJ0kCUsEa|Tp+XGkxZm1|yBHWv1E&ATiY>Z28%8%C*UCGHl!ZD?cEiC&4S z{1J&;zzn9u_vS^leC*sFMh9_My1tG)8nBs9q5T?hpYn12g+2+-`o-GVREbcQ72npZ zCp%r($<7##Td`Wf<|9pm8ngRTR((8Gg_j)mTp6oP3_XNDQP-7&pFGll5zV#DwAx%zWAx5w8q24*C| zVL#Ti+c~({i^Qt>q(vM=Z<-@ok>ZaZhnq*~auXdC(zjZ|Kxl|?oQ>d2v9UTo$oXU& z?ao`;T%AhO_agkCb?W>YCITKW@y5Zev0WV0_Ba_EH)M+5=~ZzEB0W7IMC& zrSMcYc!Q>PzFrwpam%F4wLBg*!Xe89qn{&u;}+;2RNslFRRqNjA2Qfx%`xU;z`0x> z(q$as_2MCq3yRzOX$l7}KpbT13i?7U7``Jmne&Tl1yf*1KOlHFDCX|Jt0yj5)nofb zLO`TM&5;&UYJbBWj3Ik5-~&R~#(W`d9QNSa81K(dy6?c7!al1;em`C+rHVKBP~p?S zmE+|~W_fDQm7;v)%Wgxc(*aT>-?n_aOI9e8CR%r~1)j|F0i?h9N7q-aI%KPBMl~LZ z95>!2p)((DnTJ5&c6}>&+(>s@41INS9-<{S%ER!E;UDJ3u8a@X+hGqts{}sRp<+8d z@KHj}+szMJ`95&%AEVJu471&ZW6?$mdc&Q4m$0@{kZ6d}RJIOGu^rOy+{}s1&55;` zPO8wrE)9&Ea-OOXTLr;X6Zx)2ub&w+?viZqE##}R>j!mG~ouudeB%?%s zwN>*`0=Bwx;QBZhVSYsm#aqH)iA9k)I$?a%Ty>VPwVnIm`iXp}N|$8Wz4Rku5n-D= zUOFuusr`ma^NsO=Kp9o}oL%^Z@WzFP!_=~gtRzmPd>-)=@po=i>`lLgblzh_K1Kry zL@mZr?8Fbpb2xKAB$U#gVmQ6nDMtmFoPvgVTgl+Vb~f!;)%2)eU$aDzun{{$3aw%%&$eW+i3hH5{rCVU?YXjhI2b@S7sz&Yw zH})81fEuK}*w;EM$vL{mpxd{#OjJL}WrkBxXH=BrD2FH2h}!|<@f#3(Z?5$bsgS0KfU~ZhNcWvz`!OEE7jd)yl<+OF&dE+g) zqUxS5J+scpyATywB7LRx$f1hGiHhWeA03F846e4#2_7JT9}68?q=phjBex~a$(u!} zlpjJs1KVhiehPZ0thHO|AIm+Z7WM}F8p~YQ73O2-BkjQB%3T#ix#O!Z2-@ML4d3q2 z|B>IWCdY!T;i11U;pG}w^X7grYZyn$7v#i0M=p+()xiM)@uFCdkNi9`5QbA*RMb`^1 zYgnzayasGZ5SGDIID^B8eda8d-RM|D(vXBd=M!kTF5 z?jl=e(lLBa6@;|Y-Uj(s42L5Boecu`pA)%OKhM&%#=u17#OuutO|A&_v{Y ztGI+#(CEOJOtzNc`ub@f>W$3rps$U-0%h?-7pEsa!eyYQw0DNVJUPdrQB)1@U0~1- z%9j)-JjoD~V6c+@!~C9-0|XSlh;*g$c!D`Hy*nb30Z9*Cc}dUB+@YN-N1>qfxX=%t z*Q7qLeQfMBuk%H%2m07f0tQsx!ktvSaKp@nA*2@UH)_ptJd;)?H_+lD2OPXT4)Kf8 z5Q@sO;|2pCzA^|}Y7}gi$+GhJnyWsU7vz?-gN&+Gk@N;Du=+neN{n} z)@>3e5S9@!-oGSw{_TcSKwCaawj_@6v6E5&ma*2~(W(`cxN$>#;KT8ImX0ih(VOlp z41O|k*M_d2Cp9~oJZ)dWo^-8|PbTkT_u%mHbag#29^$F#E~r*mq5fqj^y^XUahc9B z1J~5UkHi5gFvL>_oSxEZjfwP{5G;wDw-Q;td=lvxaliE=c!$FJMJEXVpgB$KW?KE7 zsopDT6%n)%I_CFrDs%BY232+*<3!JrMgqjihrWgzMu*^rviFvpucbkSy&gnGb^ABx z(ep4_gToqVGg4uuSs>rkkKEjw51```m}HIB_aofJyQ|JJdl|KQ z7Ns1a#1FE}8*;k=&b>O5p~7@wgp%uwp_8LT+Iv%vCbnVhHk!#O>ZJm4=^ zDQTP;%tL5h_!)tO5s4-#V}Fg@D1!)a4ZC!3a+%|BG?b4)cl_e2gZf>`kSMM+PoL_b zTQ*2*(W1&_lZ?grYKKMbyC7nxkR+ZgBvyB@aT>V^pR<;6p-ReVkH)dL*GUAu$m0>7 zHUdARQ#thDwrrZybQMkm1F#bujN8+mQq%g=DBaQ;s{W_DG+>Q1H`j^SIbtv)`ttu* z6+nUiRF}Lzkk37u8{Acur}Hvom***_>cEw6zyG~idFu)4uYW1@ig6AaxF=q6xeDmB zmRJyyxj#gYvhCA>oFqj%4SSRw&)!Rbx^$D?<2wW zJ)=0JwNV&+SYPTYCBkH=cZ5k6Hi~6_pz2$ywlDf}MTQN9TGL!~o4k3TA0q!9`{uG* z(E>T^YyTZVG#0iSq!Shp;=0ea7YPlDq?@J;YED?d!OPA)y6`dN=N%&zhG`^jX$)%= z3RG%e34=kE&3uk&Y~>|}sV1Ib`jCa8I3k2jdDWI|f7#dDsTd|oS-0mF8iS_muLkjD z>ZC6ltBZ>hC{d@!+$XHa@#>f}h zZ)FkgGt72M8r2lIg7@&;4nbVGR=#@SD0Mzy7mRyJwfbdPme6jC%9<`?6VSW+VpWny z3C?M&6nf7wuDl7UXQ6!WW(~Nr9X(7I$fpU$g+RANas%zg=EnCCu%7KRCddDk^>28{u;j z;HF^99uvOW!Ae-GZl%cy1Uxc`+K&V4X-nttpG$63p1V^5J6SuOjWhA{q?P~S8apZ z&%2{MtwDobH&WbczjkPAlUlhxz z%nd8~)sp1Imp4A0--N_o+p!<&1l`lj`#P>r+ifh#(nFW{Gd82ESC4V9_e2ucAcpHJ zB}b}dU^RyGp5EP*X?TA_qCrXOZn{*lKJz?LOfOo4xq4yo-ZmS2Ul=YYo;0ycja-64 z*XrJT9CW5U=2zaTN^AMT3UlvM_T_-;t7gL`{`YMHbDHCmtd-}g1)Y<6%1)fxe}(+-8FePW z6LbJ?%FM`0zyi>~{ts)c|2N~)|GMV?#Fzh#Pyf~7pW6RV@ag~R4Z4G!qtXA4xcYzj z6Lc140$TpxWH}2!8(rWJVkMvz{DasCXodbDb^==A--s1Jri=VR0LoqT4+4m?i~T_W z=3e{{0!X<_{6PR;B>y0QFH(OHz!&L12;hs%9|Z74_BR52L1^XvAb>COe-OYIg+B=3 zi{c*y@I~nl0{Ei*2LXIh`GWwysQy6!U)25}fG_I55j((_FMkkVoZfH52pFelX=7w( zuV-cW+e#1kg8fp^H#2iEvoJLJZD#^_u4fMrwl}jk|7~RXrG)<{)qx!_qyFzkcEAXI zfVP0Wg`U0XZ!0|mAn0G31Ash;ZIKoIK)3&!3^kOWM*ReC-8rkMWCkx zL~s0iRc1iY#%4}`o8worwd3E{0CX|=JphoJ2gn-H``d_rRa*d1u!4a0&)zZt_R!ST z#?Wce{Tl?_h(E_kPX}1l;&OlEInY4(qokoi|1Bd5Qe6Ek2Edo!2c zo-qLe{C9sifIKwXKUWTrZ%6B3YG?GvkzdJ24$gn}o1PvphvV-V*#T=hS{VZV+zqVl z{*0pkb<>=F_oAlix9C3WiUibJorht6xVM*A9Ewi$6pBbSSufh-JX*5Gr0Arf zhsBct78^y)rCZC+CZLT;3&J$$)%W%djN}HE4;W~0Yi75IPFt;r9Jhk;#iEWYkIB+kZMfAI=2@r76@W>MyUp zXnfDmF8HTXK?L5(uuIefZJccOUfd>E+<+I0-N$<#x1#X%tKwX+H+tJ)dg{?J9O)^E zw=UqB@biI-MRMq__HZfd?V;=R=d)?*atkasZ*jr{n`=re#~pGjSZ zoQlDDxUxEq%;XJb)}g7~>Wh=*>hY%gsAgyECBJZ?`#fp!A5R`ACwr-n)w0VDcdPzW z=2K;xCpbj^@ypR0;uQmNSBlJP-;VVDKLhB^w+{Y>EK$5aLrzlq^ z<}3q;0RBS7N2&}NEpn2~RH25I)fQQ4fCLYOLM&^Y1E}XF5P#0AMIxJZ@w?es;QFax z?>-UHUSJ*ov?!IW(0|lKsH>T z;6E+!)m|1@jVFNH==Fa_7A|pUn8OA4SsS17`)q z!eHQNUIxMpR8)^it8Pe%Wo+cOq7l8#lJbuC!=PXi-S*bwftY~y*WDl|s2*^L-wr4} z1glvwx#sq(iJ(=#(X6O1>`(dyR0<_vChQ!0geVwG#X2rS>}kzQIikOKNX0D^cH%|+ z)HHZsH6DoNkD%GQ{EC{yEcBkIWa4Z!Ct}ND-El0INcJuuPm{3dIK|-!PEKz3TEs{4 z1qX3;%^tVMvDQtL0>1RYXZz{YWG@2(E(dSzek#PhmJ;E*z7NX3WfXAu%e4wI?y`Mv z4}ePm>?oG+dqEn|b4}wNU_T%c44$>ieHjpZ67rl901~KP(%Ppe``R(TcArfFSp3*Q zYLFpT1oMMyH9hLaCYxEI>}ej^ck_nJd>5z~orZQpuZvJ+dgDd}vEGg8U`B)DN(WCN zz^ndx#-YcXZnstqp*KdK6&hA$h9LOvSytj(gngV6qgG$Yghv8+_M<4M$4%fIyK)!7Ra*Z!MXI0H)JLx2b&)hV+CJc5Zy9mE%`bwa;eP23 zc;c3iQ-yq-W;q|%tUth5@h)}9LU?9JVnzHecUL?6g_&3_|`wg;;KC$|C=hiBF+_+0sqMd zS-^$w?wr;aiRo0PXF{}W1QXefIaU2e>PoLaA`)A0UBV061>i#x9M`k`0KGEmSJ)G$EXg(Ro<_U?)wr{U`$qtq8B}%1sliP(dTcW|4qYB4!+n zA_PBW_m}=yrzVn8zQjex>kD0|GE9K#hQt6i1Pt*%Xel@*%oQ&}VGw46_Lh?&7rHQr zweWNhw@p07ivw6N0eZbL-y}996}Nr+fmb}=F>2*$;x{(u{Up9Lv1I|Uw6h@RsZ8Z8 zcFv(xby4VVxjNnQJ@I`VwMDecs3_x8%FE3#E|b5njxpXT3uOBii-RNc%1H*zJG+2T zT^AC)$+hvh7E%Gf{+0abmAXj-ER-V1KbxJCf%fBKLZ8ph$o$theB9ed&z|1h?_4{& zNDK;Y#^DBIGKk-=cpq5K1{9z%AwN3c72y%NmgNu@bR!1@r(I5Ju2gGy@SAF9VxCBoWC$)OItsz!@2i{~E{xCumnEcdalfkcJ{Eth zK3?g1cr4m`UXsmYU2>b^HgB%ChPAo%p~&8>bV!p_+(Z4(*C3ToJJ50Bfn7NHBoukL zw?c?-OmYo?dp%~rwyY#4AV&DbeJb^XCHX3g4ifsR`gCM-q86J&0Zw{jw!50A`+_w` ze$9W_!nmGgAnG!U9n@s291;PF<6UBNdMCfgI_1w{S3$I@nLacaD+>JrrZsinJxU%_ z^7^flNQe~yIH+0Sw-#==6VT6l{IM;854`yL2%dER(tS|;?38rG6{4p~c(au_*T~aS z9NXb87hHSFV0GR9TNQ{KAGN3SCF!{{!HAFig*U=n)pBlvhE7T!wd($h&+?i5phm50 ztg;KU1@gX6YQLAg8m`~k<}0)ZS7jR2&~vFx)mE2_DXRFGmh-{j2dYZ(Syu7On>e)W zz%jx724o{jOfeQe6HTYgQcHb>?T}f0X^9i`MQC zeJ3<*mC%&sK>4q~Ur$Njxi=Y`&o6tBUIco1Eo5@d7teN~(_?E;VhDc5fdJSFFrl%+!}zAndK=?O)2$(d4OD}; zi&Cm2(=4SPf~f2-py)yXr0n8>CPkPAIKi`-$NWtRcUAYC>@=6y+QclJ;Ay6ZSzzC} zDrMMRSu2fk^i7eZDz}|}x*NcH+`2s8d4W~tL(o8mmsz8R8=pj7y35~fb)AOJHv4@~ z=@~^XRARMS5!JbVnh{?!idLeu?irv4v>P;1=^~FE7NoM!wd(NU4h{{eZ-z>jj#t4Z zzZJQBS6V3fgzC^pObN+A=7-KVWKYAR=E{U|SBr*Wk@6X@+^rX$I&&8#2X-DRB27HZ z1|FDs>DS_FIZjDj1(?P)jcC=~4=r4iiuvSB9%9rL!7Q(5Pi`kT70LX_s;#ae7aB#> zh9^56{)I6XAcy0IoXUSE8S`OU#vp9x9H`T*_BZ(=q0VA}RMJ3}B2gQZcW};Xn-!DQ zXjn1#vpXmCsL%zpUZ!ymJkKca^MCrmHAlb;gk?AoUyxzWUJDx^UkPNFD{QM&B6}Wb zHn3lIa#l~<7NUj-0gz?}mgk>>s%V4XXD^v}yP>d7(e1|5RWd*FXG883QGu%zBXA0R zSxE;=TY~w;h%CO-_d%HNQc%nv2T*HiJoi^r0p*jVkPYDLV2E_iPl%FG#+q!*kM>l1 zDqJvB3(X!S$U@rXpiZC+vOfhdl$UTB|Ly)v@U)azw6P7^-uXn7VNM3+K4F0pa=bLx zlhr^O`DDJTm%)_hcCR%QvjXb6oHb<52|eE4)wAd`I+M& z$oHu7gi|&S7WsRH0O1n9hiTh@Y#^0%jGP z)MuZjyVU;hSf*bqbd)inGATjU4tw9I`0wLmgV(U2k*lbBP%2T&sh3mNQsrbSALndN z?HAaOViRh~hp7|-cfECA#is)p95CM)Go@d@ZNohSFX-QYQStP%b!PP9q6+aRNeNB_ zqPyZh$rEvEs_~gA3d)Y_n$xl?p0=Su635XU&~l>UyQwxNNYIo+Io54*1$@Idahw@5t{KV_+M3^e5xJ6B%j9q9i03o>oG0QdRE1@HH}!s>c=$O+zLM4k%99|K6m<&B@0gTn z;|OQ~3OP=65g8qlg*k$|b!lVfbIs&RfOiUGT70&_6a^$h$Xn4KX^Pin@PiA|BKH9M zvf#ePI~p^5L6Le!;aN2HR|nWr97xKTO5vxT=_!8y6eXOeVq3ovPd~%)#XA+BQg?^n zxyMDVHKRWwo>%33fIHQ$NjC0{0+d(+CtPHT=u7$ZbA2+58GBJdDR&x5>U0NK;Eok( zGj)to5;Fo+n{hRfVtgKc>-v&B=`#DkHyL6V-|a`jKGgi!wd>7@ET0gdteE3xYsp;#MK}|;KLePb z*kECZPA_0^2B#0_&f@7ZGHC;-`gF?)C@)*YK;wKnL#E#VU14%IQ~K6# zN!C_e#0T45Y1UL{$cv3zU*B4_U+ijz9Im7Olr^NUs3%T1cMna7B?l`-I(Cc-ipnB{ z1Gv+w@2P*`lVPTK7CX;b431#4Z4CFZ&cmR*#2Q*|${oX~n=|IZ zjAhWwD5bGy#@KKBrWL#(JtXW>`M3X{wf@|!`US6_Cj;V2I%8_8Gp2%OG73(TwK_9H zLy$X95XyEUJbxC*vq3*OJ-^h4VUp7r$a@s}`c2EbinjJ9eN5(Vb)BYv7^O7ZpH^GU z;43boUxi}os3dgutB^73F1CHi*2mMqW6}Jtd*rJ;Jezjx_uRPO7R-9q^oKn93(WxW zmdMbf-2gevat7WQwSgj>VuEzGnaY?XdFjxq)}dDHAYE6M7{b=l)IOu#<1hoB5%qr` zP^3bVw^u41T0_akn~G1K>QjM$3F|Pk>44Q?j~BXv&ep)X2IW(Pu{F+>_bq)liGm2! z#unKv!J8@n@W_Fvor1=~sEY*fc2d;*L5Ye{0 zM_Ynsh3&)@CX=a9z<9W{CP@+)nwkIWq>pJmC=bh*py+x!f?Itcnk4G_KGp=$U9_R+ zNo;nmc~JD({A7&NTOI>~bP>9G(RbuK(P#i;r8$ax0s3n*E37Hz|ZE-)$y~OjpcN)D7cIH!8)yTEJz(b3E^am9!w(=dBw-g7_t@)5P=ene458MmOho@A3&ys%Fp zFadg9&B}N9gAkP}r5`PnZqC5{k1R@9W2w6n1`_-~uSfb$Oin6WfrBV!4D%&N8|X?3 zr3=u(D^=_vx!EU0mph?ES3;)1h)WL*&G(rw)|$d`O!Z>H^7STJPaa7Up zubWQO>Q+gCN*7b?fUD_pU`X%&s$<WCYRcO2b8(5ldGXV zGL!E6SFk(*Jo_UW0GgaE#zUjT+)aGdy878q-L1%2h};F8zJY&`>77T#*aj}#+3?Y9rN=vc42-i1=J zelsjtXd$`~gsR(ZP>&*nR}7|ZGgkiJn3fjwpb=$8so7$}CJb>%WJfU^L@Fe6Ns)*! z@_3#?;ADMcK{AQ7s!(JUCk^EJ6p+WmTtf?oNQvbLV{!z8csfBUlP2Q|H zv#6<~bFsbcZDXrL_;Dq>Xn@dwc7js|-E%A}=4Ps8M39~a%|Ky9gx4>l z_jfulrOls{B74!CI(TF$n&5S(<%Xb96Gvafr!4L+z4(vA7)M|0zgmD?*FxOv%D|VPr(viv8EQ4h+ydzQi-0LF7_IDe~M@1aS zk)8jTY0NJE2j_<9i(7lH^+&}d8Y0sZ@Ms{Uo$jM0Ymzeyb|Qo zb`NAXpfZa+uytv$gvF}%jdNix4$;*o+5x3Y}(2@ z#GI|*itH%W(f|UsPf2KT=K<08bvSG7$Y4>{P%Y0vuCFUwwi~7{C)KsallL~$(5p<; zg*Jg{)ldbil;c{GUt7mDA7Q?Zqme z?ms1I`_Fo<=AV=DmFeyGf^qFdMX-AKq03pnWbB*AQ*o&a9?yx00#ty3(a3sf{EP~A z9IEY>uiD-aTcPyMrt&_00#Y=$!`&}fm?3{yMNQnda(=E}WMOz#>Sqe!IM`J(dD2wI=JwUv68bhU-N9C#m}VjX#!flnPIDpEooBl|s3+RcDK zGTf!iZ5|Q2{tCx-+0E+)KTb>{^^L}+)&fY^+WMx?Q~ZRB1iOFTK0tsQrJuCwKfAj? zehSQ0II!NiQC0|1Sb=@^BDP^iOyHjW_6`;@GfOm)uf|fAjzpj@OKV1f;YF?bkqn;) z?)`NU0f&;xUKX=uZIyvw2lGZ$XSly{LXjNbb|DDN8*BK1izr3hX&}$L7m}Lp1ZK8DU8!187d2}EV+G)pPwa}0_~IzK*QnGcKwQkm(7%OYHl-0G}(H-z1IGa7tR^Mg^jG{ z!u}JkkKOHEaBl1Bcj9SihO52Q?+y6Uh_t%ziEr>)FHY&6R+=03R2z6^JpFMRNjY9v zlzlUQo#7rLz8OF<)kG6=Tm41xO#{VBpaF*sg8$H3*)f(jx3Aa1!1n8#MyH(j>h@ulN7UK>EqT_b zT8hN^M90F*p{nfG_5vUeTKRbo6V^GB_gf80ZBgp9RniETK^UBYU?osRW5@yCZ$4sU=u;jz0+D+ay40A#A5--0 zaPHX3fIe2w>_H{hD1BEHj#l;zXtR|^d$_IqXdbrW=QdpXJmMQcv_vd%0#d5IVX_dY z>n1g*epg;>2Lf6q@1&%94F=lES5F$YM)>VJB6Q9bNo5YsUF_N(1je$&gX>cPY{^tk zE?qGaQ*s{wI)KlSmyA5;tKv@*?>OwDdJtU&=p z!Wolodl-zU#&CF9dX(9oBK96v3zcLIZvWc4aqZLtl>TAN@TAPzsO6Lh#wgY5I$nPi zY5W0#iDMnZn2RBGr*vn8Eb=;HyF^@}cobFX z|Ksy%FagaI9Uv?wL>$mfU09tHG?^TC8W_gLx)H%g$hfcR_EH zn!Yf^s&36S?^YQKA{o32A^Kh$Kz;Q~5R9=DAjs#e5!T%yBoc&@BJ*qkS_r%(h$FuB zPgAK;xCW9~f(B9L`WCn;Bvo8g7)dt+u#z*jbxsizEl}(KHd!BgZa_BrR1Cp3a){Q; zHSQ<&|CGn-J6HIIG`oEO&`4%$_V6HDWnY_a1dSercvJnGs?iGSi5ZXw?U7qr1oU@O zBU~6G)=+d_*|N6=WUV_1nCkH`11yA-e_;?=A3$=tjpIC8czRMytnIiF(Y{dAyEOa2 z0FFV1V-2Tfu8ON&?I|_YYozj)0T&&;7AfyTk&Lq`1W5z_Q|fp)f=QcACQlZ>!hiGo zMKS9>Vp#ELSGdSZ-A`&l;!1yOI29Q7Hg&K~R&>YMyG8Wd@pL6@6Fn@=Og+3l5#lN~ z-PhH_@S%faQ}JrBWXC`GlDsb-O`X1!r9sTaW5bh(mhW}U-g-aM6F9UmX%r*F z;@BTZ@JzGCWJ**EsiJbdc~bSm`ty80Xq={@v5F||H)=PoNZhhLOVqcroGT&U-pv-G z(q6w1`R?yLkiAYyFzB@Aozm~E!QI@r4I5RK?xriltcsHAW^P*VhuFb$;a;vL=;MMXG0jIoSK9$v?-ArXA#Ah_9 zV<5+P7!geQC7yJjCZ? zJn=~p=?Yowkx~%;d5`au@`kU{=C0$5fO`sh83%n}yC0e83f!5*vYGYP$tm$X52CDOeoE} zRujsrIEJ!#qC`n;_`k#NdiqNa(&!R4URi0c`ZbgGejFO`0u(d5xm$QN+yg@2hw%S? zhCcZ6r4*fzJQ(bP*kuaFX;m^n>oV?KdZ_%)16pug#MhByASS|x8^Xq#pU*9xiIED4 z@^+!pm&=0_q5-+qgPB^*wWb8e@Vbu{Clkd8&kb8C+;O@cbd`b}z|14RIK&P9g2qDiLfAj#6cNG%T-u%m*gFKAu*`NEk_kG4mj~=TO>%zxSX( z@sDJYVMR~!73$4ZruHW9#fwh5-i>j0MPo9p9@-v1gu(<`QXzp)Jr5wYv*K3vw@fJKap>h zrdTD2NzGl5IQ>mm+F0Uf8KD2g6Ey6_vU@msavBB#@Gw6*lQIcf$?j%88gBp!cYbw- zQ9UobL~`&3J|=WdpDQfizE>6{A$Av$%LV~+qmu_{{%ZbhD0f&e+59py*DR^otlhS? zV0Cvw;n?*zj@;bs(i8v~`4JAG#95yvbl^Jn!A7e#4Yxk-cBnUDS_@yFnJSoO2a&|7 z$X(1Z9BKd>S$f-4ePDBCXu%2@xG(Q<&p~4;B87*2a*hOQ2LAQ4tuHe+<(qT1jNmGc zL<9P{@P)zy!5Io!vzR6CH(=N+(%+>;rxCJr_f8j0*3eVemoPVhR>hVf2uIB6NUfTc zpx(d(ndK`x-m8Yyn28EuhunCxV-T5ck*eXM#Fw!aLNvS0i6*ty^J#MrAX@WCKPfbc zJ_ri<#Woz1QRik=QuWXiIvXCkE1>$BVP^woHC5<<1UW-S4R*4g-bFwe5n zr_YkVW3bmXp{d+jC_lN$zMP!Y%H&I51&n8~=BbuTSvm%IiQS1H^NpT3q~Q zzb%I`C7Ltu5#)iK#l9DP7EBh0aA@d16&KL$2tXe(F}F4SvP7aaJ1>D6+8Yz>$ZrFM zc8r26ppjQQ4w|C##V>1*LOikj1$w^m9t6jGE-!SKqKY1kY4rdJHBbwV+ANhIg3e^h zyCEN-bPR7#FC0@C61#H#IHtDe)-4gjplUM5#e%CGO z9=VnEP@K9mPZK)i_D94m=KuJthJ)Rn)N^+|cv>X|bJhJ`b`bG5*pot;wrM60(`UMh zh;3J`RT0>x7tTV~Nr|$gwPBgRff(T}S z#QBubQjdP>v`Cp^G_HzuVUi{gtx*#J<0(5~3gG7LtK=lPQR;o+yn;<9T(a zR9aj=*LdwM+CKw5atDRDETs5ZFHhcF5td^9yNa8xP#& zxyHuS+3Xxb)SnI1oT=w}1W}{{I{K#D+-3$he}L^o27u;kEVAIl2{tGYYap&3UyKYc zv|r~kj&ogcoK%aKPV_rJ1o^7jwgXRNMT78D0Zg&KArz%+{_@5$!p>7SfOo_iPlOvA z96@0>f!M*xY^7vnW(fYW!`7t&8vra`jr1JxniVrMhP&F0H~qjieI}+A4Mrj7# z=)2>vkT{DY1!(z2{o_I^Q2XzLU`E}xmfne$Q(l$Du zaP8JjHULnC8mCb89|t{jXzPtiY0N~tq*Nv&#aUeHbBzK2u2c4Ak|}9N@pCn3=Tx)@ zWh(Lgt8WY~epn)i3mMJ;cT6kUtGImE<7syGh`A#7ygRQ|mR3P9+&EY{N;9xZzTi+Y zf27U~^_YZl0NKcB!M3=L8WN0fI}z5g9ioYmF2SDNU-8Q^rC*|(OmGuI^Y3wvg84vk z|KhqTvJ2BS9<=lJiagLv1V()Tt92}Ra-8Ds=?#_1O(@8QSl8~+8xTNAi?BY38{us< zNNm3pwV2lW8h5logd>tgcaSAEfC?`QMLQjUHL0Flh}pwf_Y8(K?pG>MLNclAPA<7M znH-&ZJAiYabfPX>-+;MGHr=15g2;9BKg8^^m|m?sai_E@sGBdO?((6L4{u28IxwVO zuSrbCXLdkWMo+_Fi9$1w7>5YD6+z3u*=~;S`8^Hs<83$J4pa{N09{cDVosU+fd6{I zsLhy^VGxop!5HckX!JBOqK>TUYkW5qt_T?Jqlmt@+QVubEg z-3#2uxQ=?O5Z-G}{*p>=>@JyX3#QrqvA;#P$Y4GpkaL4Ee4k;ww=i+AAVX7(K_@HU{}u;X@ACQiyphCy?k&w=v3dOWT~(6 zYk3fk^Iwx9U(>NNfSmD#LHT7C4Bxc1+BRSZop6vn#sofXJ*E7i&XIut?2o8n*c0*x zvcPf@Qgm&j(g!b^NzSfsyBd!cNw7sgw^o;sK>&-`{V1vLj_V~_Y2zJhuJ3MuL&`DM z=M2N=$ZViG5mn2*D{PK%Wd_$_BqSn z?kTedBGI^Od`YXRKy-Vqtq7bH*B3yANKvGy{W-G-wwK!l5=~wPrwxYjIHz~4z)-}; zj%)jb` ztf-lxlPXCT9}xMrZOOT~KP>Fp5r*2jxsVuOvp0Shz=Ug^bHkS?swvg7+ms4o+PPr{ z3s|nw;y!Wz|J#*694<)F)m$UPGbzd`13HY)B z6QefP@mb!#=cf7O|kb0FRvi@AANAq|u zOpLcxrJ#~-WO@+$`%^j)3X1p~d`=S&oiO<%C(y-tU}JZBnGMWyXM*3#6*O?PPQeDH zUv7gzOm+85L4GoTR6stYy>mjX5d1{oiQEGa9!yyhGC3uzCGm@>;6i*vLqOQfY&5AE z2UcopkwaJ$WD|Nx-xr_xiAt=`Z_HeH-BIG*X`k?3=)7nhpCDfw%cN1`%(A0u&y%En zu|H2<(awTK@>Kx#nDV5um|-L0Ix7Wm5v-sZJ-qK(D`3mMvp&ORia6kH3eP$aN3eR9 zT_*IOAt9R|w*>Xa2SKW28vd zJWY4wmP+qj?)1s~=t=Y06PSheh|$FMz)eGfON6nLypv&y>mzXhM!d_tV0%HWR>&rk{P`T-y|2K@3k13>^L4{lk& z`_ocK&8D^Oc;~fm|K~vM&rlQksxVP2&(^mt`W+nbS+es=MlVY89!=+2-F6GkC-BM9 z_fHuV{?~wbRfOD>oKo5e41lH~yescYmIK+1hA-9Yf_@VBoSfehek?;SR#Y^B6bk}K z&JR+6J9U5%aAK0gDm3*o!y=T`dqk&`S8*#;m-|2CC^#JYnb~IBSKi8q2CWNhU=ec+~yFtS)y|&iXO(cyjEFr4L87Q`y_mUGcVGH zQT+dR(rv~Q1>8+qfvYJST75RFNAY3E7rA#keSJ%jH+ zpjDsC?+G^-{(7UAp0WxYKY{r4J3JVuAdbSF9h0NRhy=i~GAdg}_DZ$4S)%a))i!2- zF?LF1t>d|dmkk$5?G`H8hc`arRAHA#p_m5X!m)o|J$>}1C-hw*7hF;iC!VCb{Z2(* zS=T0m&Rq*R)<+fGXXVF+?OOoBF*E)R+=26AutNDvkGGWx!>Dg5ITA|`=**})gmMiV z=NpuH176)Ad^Nlm+ByV+^-Rg#XvCVGKXw2|b6|9m0fHBKY{HJWnD^veP?Np{A3{6} z(BRG@e|<*ClhLigk^$C)Q@b|Gr(`98jwfKwwv{(9-?Lrg@fJuCwRJTy-ch50ae7t? z_`&|MT<2kG9^xf%b>-?^hi!EY(=}W3?72{{`rM#uZl6XwWoFX{20XQ zgInK?=~ujxfnykx4r5YdTIb)CYK(9zVK5&H$c(cQ$mKEd?eF*a$e zEiKqUqy#kYcyeZ*Br%k@LeFphalhr;(6dc486`J9)NV4C{(|GjjQY2?kvKh;c&+kT z>(_5#%9^0l)TJHCt5T^f`B}<&3NTiH4*X~9`}<=%ma{{A1uVGBik_@rv2z%`DXD4uhP%YBg5Zj5~x6mL%aJ?w`~bh z9N^D%pIiV)B-ZC_*<(Pep5%sPZQ}RAv2e~gh$xj-sVI)&@5imxi>O`M1kCx!{hdNQND(ZEsp80-^%)2} zjo@nauU*iRI|dG>?xiZ)+qCbYgcBMhei_dVBrE6dB1rfE;Hg{;IwUs3l*!ZV^8e=~ zNP(32yqZDKu*AnBW67sIl_hO<#X@A-;9l>v$bY8r%J$wF5Y=FPFlvON@pQ~Dx%dvv zgG?uk9ymJdks#*IpZ%_O;2yG9SZ^8q2Ui44tEbQ-u%r7eE72y65EQ%s1$B1{lZk6< zEK5N8OGae)Xn}aotf%>r6&y51eUtO@v#<)nEz8fL3tQwe#0F0~H$U-SE5Eyb&Snm` zw05SS5g)Eo*KZ4FdpbbKGAo%J1Hb0o8a95yyckhq0A%6d{)_3E0$VSO8Y}tY?j+>i zr5lftf0RK17@pe2HCY1UXOI055s7tItDUWS$3X?zTA*2Lr{)O$6&`&;$EXCvZy z82*yjq`dR$TKJ*LAM4`K*t&+q@?-=?4E{2|xT)h5A0I-Fm1TZ#`%W^wp_vBEB-B0s z(H?0^XQyC<)wB)JHf}+_CzS|89=w&M!%z)ioitO^X61>aI3}gkOz2ff0{>`#l@tz!T8*!cY z=)sE94a*Nfd>67fVoSW|gINrL=c|p8Zu9)>FWl*dmgWmg|AUs;ijO`zh3IbwB^HGO zHF-z5U3n~ z9&fM4BzryEN-)8;lD(tVXj(luTSXfJ$sP1QYoUA22IPx(a4%b0h@hf%QY?BurdQm7 zAg1G6hNN*wG^m86m3!Z0l+w>aSYPPXg#6PH^kCb|ganjl8*zSV-n-4P4tI!*cF^5i zqD;%X8?`O_d$83#5NmlW$GO6#B}~kKIJYS5dpy{_L?{IR@!k*6|Fm{(N*OE*8DO%8 z$$kqxEHa!SY0HG&aps`WCZ=-bCg{4@KYsrwZCQt9lh$rJ7~VJPIfx*uG8H$dk?2-f zgGS`vyuWxO@hvi1g@`s^azD`u-|%veAEQ>FcCx9L43685Yke&WhV6!7a%GUH<6#2sddk~7(U-Mf4F@CcuNIh;jA@yNi1Ui1%1 zc%VAyq@uWnHlM*L|cL*y@I|o3XSOffYaVc))weDu zol-v|eMOSpbqh>z2tkbTeuE%-{bwy`1WdQccak$IWAL#9@~};TgE{Sv18C_Nb9v+# zi^w4KFE>eL+J@kqC`k1&cgSOJ>JoN~(@drH^+I&P$qpF#lz4;wO2gKa9a#Lk0m zncgfY&0ae^b9KFz!aYpgY!oCmEH(uxdy6~?avsi-se|69Ns?WQPVM>e-0rFUklO@H+#@9~8bvRIX zD$8b?DEVu43x5txAxakt&zzTWf$;G`K4bu+x z6+%X^R2~AUf(vFz=XsdazYXf(s-?@XlX2{q#xFHNP8Hz3}C=voKp@LK!YW ztm|HqKe}I)2L#hx*3(XQ@BLr_k%pPRMNvfCMC45=iuy5GmIwEr6@}N+pC5xBhO7f28#6XxiHB>Z659?#zvlp$d}s1t!PnuUPNOS zeZAT>-`Hy#Fte|ZT<@!>E*9WF!@ShtFL$u3r@9GI8y6J%C|wI=zKYBvy?;HP@y4yb z5=f9^L)lyo8glc6EVTM4>FWZVw|-_2Lu&dY#>WbLWyxNg9aVE$U> z=PuEAm@>vt%!MKS54D?IF3BFeqGT_iz`H)-(M!X{?snp?yG2FxI~03qb01ezL_U-3 z?l8A^Umbtknc-dSevoD8r;^I7zM!Tc0zd1d`x>N8SRzuR?W!_ZKlHQXSXk*na12NE zlMbqZSWZ~&E!nbW{}HdcBhrX2wdvV$S%4>r?)myAM8RTx{wENSyrr9j1COiHFH~PD(1kbmWI`K?qvk zikt<8&+e`Y7(mFQ73L1>FN$QD5NXa`rQK>b22#G`N+rBflaZ(2f)|<;ATiH+m6FJ( zT*3arQfiP-bYZbFd)jFf#KdWNXGu1cL)GjnKz~VYz>L$*<%vJ^SLnpA&ns!@%4`*&Na%{ke%h( zXW`CiFSY00*}B7$gP=KHw=Vi5VLZP4URsafeUNtL2f3Ngp0_K=;o{UMgPvKlZ(-(0 z6uI%jo|xbKtg}KQtAxMD^{nPDkY}L!@sGX)-J9`BaxIL0F7HqSK%4yXv^cyryJ@8Y z6@6keP}WbU zDGB7P*i~}c z@MLw3x9O!pyim(-c;7FM9H{ zre23UbK>;89HU$acI&MS7Sj%K; z>H4(36_;Z7j8leS<4OY4%(BGe(BK0_#VvTPtNFZN1xUZ99#}0tI~4xJ zJM4M-3gK!s4c$(70_{9hHhCDTqv6rX4^u9=WhQ48`VH-^Y~pn&Eb&gw41*yg5tGkKnq{$j>|W>m z79k2Tb3ZTEiAnLWdFJzQ%h0WR|3xW!R$OZKVv2#!5~0O*q!#k`x_-`K^A$fdSlG?1 z;={z8p4y(hQv>wJJP_Zltst{PEg0TK7S3tqGw7RKogMgq_i!3+W!V}!;eL#^*r_9I zDY;(1MHIVz+bcw|lo@H#RY~WwbWFq{z{SN9Nu0vTFKi4@mBodp497hwI!>H`1%uyr zM#V)iq>K8@S?!VEyURr_7jl_OnO^#Y7Y~T99pkyI$Z&dYL@*hNtK{ycVCIi#TmZ*X zrhy8L*iytZ3B8GmSOYV4t>y25hTo}5pTRF`U`lsEfSTC2mRE;*8vjrk8^9!vO~SaM zP(na7FQ7+%1{x4RJ=}e*ercuzr~MPvYVO-qOmq5K3Kx@A9iRTen%3~~`04!Ss_Ldh zKE6`HUP$R8%ny`2WNi8CQp?Ww@0%za>A4yg!#dt!C^MU`s99wi0;NwQN38iB9!71~e`A!3X# z>RPgjP@gAR15TA5i4X&78?qZIZW@DZ-jvo^et(dfK#fu7rJA9qq8;fSh4)DMV{k1{ zY2%Hyj}|TR<`nSS_A==+N>OuP6AZBq^XO5nD{q&Jmwyp6Ru@UnE(@=fc1ILc>q=Bv z8^EevOkW1!-ig~k6TnypeWZW?@=?q?J`X!4|6baHb}7&YLY-KE28&&XK%KAKQH^e| zhsAL_+5mNX4P}&?BI1o{$wF%_ucI#~Y(}EtU8pcDHeNCO*Gpt=x0;DBbKrAlgP0$` z{iqJfGlDnz)`h%nwJL_MbUf?Mr$*od67qc_l~G>{$CN|X{k+^$|4H#|3RGH#5-%q5_Gx<{OvIAV}y}x4ZgxONd_~uS$5f;;G_>%~BiXFxbbedad z!alX{xlMRcv5uXgbNpjXKktE6ZqC=? ze$+Tz5rus#OrBX;&mK19lkt(pc8qtLfM()=l7LnVc^U2`3!IN3m37@}6_LNKXN_ni zZAoV|ZRmQLyX$^ZE6tW)99@vo1txB$8)3L_ukeJnzG$>zQ`^1w^haCCaDjF zWOx;VXcbm;a=6jnD&KR&)9&ZOR$}F~V_6lca}cfRpB|JRzGSXKz=P!pDi==4HG9Mr ztt@46hn7D?(r+o|JRIl-HvCFGWr-0P+it_NK`>|%%4!QfDk?4XazR@Xc!(_@*}-LB ztAikyGI{LM0!8PTJG`;kx+{!?sPTUqc|*=^oGs~vA}kmr(CXRb%g#c_c`rv}ngsZZ z(`svs3(9A1?Lcx7n~tH|kEz?z+Az|I(h!s?gXb;bgBw<4-$7ih&6E_6IChF6ACs?Q zg@LP+vA5IVr`GkfNjW=ZmCrSivhJ!$n z%~Umz*}xTFML{!E@2d-%&&r_p;Fe{p!^j5jx7$USH0)j5^&x_0gt%O(;75ERxMSux zqNym{$SyyZ7HusDaxB`T%HNj;oE0*pu%m@VTBD>m3{Tyn5Bblo7*}CGRH9 z!{=`kTVukV>V}+>f=Pk(tYxP*dtU|n&_HyE{G#!2ds0ps;l=$hQpV=Q|W7D~UKsz!4U`mhPMD2Sb__n64qvX+ylP%~`Ld2F`1+=hWM4ArXyp)0 z;pctI_DsJ){1}DL6|d5g8^xsB9RabSxwe^I{xfelrc$50x#*_`pxsIHIG4t&OmOqX{QK)ZPLhW8ek=;u;wlIT_hFnb-kL3=B-bjH)tD z4hCkxJdD5tKujqk>+d%>AXn4a!pIR|Xkunz14l1vYvU+kV`>XvWckbS-=xdGra1$7 zkHDG$6o0M#&){JpTRXSEa4sn*j3@!Z7A9u40C^`f1DfA$VEE%d6WyOn$=W(v7?}Vl z{;BkTT^MN8!O`Br&jt-TqL*=pzZn+!^CW@km`=;}yG2M}-o7yumXOpGjmCQMw7OzeJl zDh&V#0kyVp_~W!K8~{Lys?G139c=*?Hbz!XK&GvuIq8>;AuDjY)yeVjctvb{#fMqZ)uJO7B&t5 zM-x}a-}M**5z7`1c2)*%zJj`TbVfgVfS~h0P8UZ zl6Qf%{VoXXls`Jez|PLf?T@myfArno>$d>j^|mtoH~)zK9XI`Z5CTV+qdDL&qwvq3 z6#Xag^xp>TpY!~sq`)84Q(6u>AZPRsw6}$WsD-PEvAl(&kvZUhyhJm-+Fy{m6pAKh zPC)qXpBnM+-09z=Ue>_c1c*D9l9Lsar2bp;|2E(LXrzdZk*)FXo?`-1dx0x98@Ry% zrx9?E72v@Lbi1*M>+hjs4xp#Av2_F%`AswR0uBy)xWDsafqrrP3oiIypr-WlK&Lw@ zyV;oluO)v}_Pa@c>;vbgiRoV^Ca~}Afm~ND2H@QPO&b2=?;qPbz%gK8Y-?lX_KzZh zg0`*z4_YA8nwE);4Zs0J39~UXd;M!pBPV+xE7$Rl>j1EG;QqS*$A~pCaWyf5TVAj= z;tKqdnx5uZjh#I>F03`>$<54+&BV0(+VzV=f}q*7FE+Fne2w^ZNL^iA|IDM&XN6+i z5Qa2Xe>N!05Tsc}Y>&WNb2Pxha2 zEqdbBFRRu*S=D?$281W#eV&QQuIb~sbS`7mS%vcn>W?$q568jbKNB5i%PQNl`}#cR zH*|gr{)sZ?;ma2}b2Kug-qAaUuW9&AJaa$8J$7g4bl^iZi{;p65|J+Aj&Vfh13g#E z>YZu?U8FJkq5w1cpUUdVr}`O$8neuTDb=GGGDZ1pdNtb9%gMuL*b&EC?Avwlt&r@% zq*}y;s^^gGB0(c<`?KrJwCf$|&)<>_zm%SMal2Xlil{H+XfC>&gfz7Z$wYu-T9%o& zjLEc{;XK7Tp46WzO!tJ%Wz@bM4MHNmFJ5Apu;XmCuY!SP@<4*s>qhB3f7$i8hjrscBN_R+MifsIz>8$bl@0djL` z*=h)!q?9^u<4%B8^haX5<&oRTMW-X?;R@&dj$)%?dl?hD_J_BE80OOPhx2%ZOn58! zGUs_>u(*{nUIf*-XPAsSgvZ2lL)?NO`u2*qwEG0|_`>ssgLPv58C(<=xE32>)&fW8 z?khd*pe)i!r9e+9yXqf8a=pWh&Z4>_6gz@$v;3i9kosn!qE9If?yAuXA7J7_o+E*7 z3;8wagRWpR{<@4nxA|kXUzvxOH^d%vUPFM!WA0%jXGGy=K#u*P=pNCA!)EhlHp8MX z>Si=+;aHyPuXgSO7GsL@6B}gdf~7hwd7<#qvs$i~a1iRR8-*EC@T#?(;GM>?$oXi+ z}|l+G8=rR;qoVNrgbB3;g&&QnReN`IG68x0ew|BChKq| zn8pQrv)_7n^J}I6iza7uzy1C74c!OFY$bCY?HJkPcrlNaqd=Je8*_2xY!S%2&pr{b z^elQT!d$p~PXAze4Iq&YJyUyF!jd4oGtqPYx=v!~TF z2z2!w45%0%tX+4ZJUGxWR^TSAJ|7T(N3pEQJ}t`Mt;&eTuy5v8&=_I9o>|d~PnWBQ zo&V5VA-B^%J^fWSuAUCI82Ty8UF7G=F24pP>~QVfn30=VnE(WHn^;_NHG3H^sv~y8 zB$8OOtwjhIcFe)d!yhh z$%V3Oc!}=JZ?YgkKQYX*aEB{Y_Hl3})iFA}2Z&vsHrEAilFpQ*X}U2FHw{*F6JNhE zEMbDyb9A&Fk>J3|F-xmGxz#1{aJZADw{UGXKde%g#b@;$e#ZSzf|2Dv3C7Qi|FSF$ z%RltvzbHl~2KN7}Wnokl)#MF;xv|NrwS#P*PLV{Nu>)EC53{0L5QYfF&I)%xnPUzzt^;D_gtYItFOsugU-K1(kpZ z^54qkk53*UIe85USup^`f35B)e}B0CUD^CY@BCgG=6|l}fJXjJ(>eUVYdWAAV9Wl; zst#xds2BhHx(<$!>Az6=K*jMp0{Bl#|M!^rlX{~6n_&O%d6^FIzvkrs1sDIXIQW0X zz5g@k{@F+Wn6m#ISN*r<^Pf%sBOU;n1N`k81CR#%zR3Jr=6?za{x$obbN)@T|0gT| z95ev6@Bbem!~ZcRkQ0;_5upaQ|8Hme*DLBD!u;QqyPAwGFfRNj8UI%e&dACHpk)Rw z{{fWl3;+&h)<3E6KVt9yqvQwtKKZ}CfOh`6^=H}t_b^4t5x5u&Fed!_f#2=@?`Zwr zZbtCIAiLr^<$^rlO4}}<)X*)Ca{ZU8AiDZV&bJn~`4hX>JxQwl;chIePhH6-7rFRe zB$PdQsO#iyY}EVy^t#1}X{TzD9+y9)Hz71XGpO!wk1HtZ7QH|bOtvxG!(84|`jR;3 z`C^dX*&%rwrPRh?wxiU8pjGFeoRTLT-QRuc9~l}P=(>XJ+51496$4AgWq|FSbV8Kq z=%#P~tIp^R^2wPst`t@l-<5!UoO(l1E^t3w`WQU>NW<3;%pgmRhmWX|_o(zku}`CW z59#DC`}97X1BIpgtK2&yZ(ca-bvW(Zu6+oS;GH;sy@_&ejnV1gsa)`nTTTo^zZwaX zgQXM@F5*PT&6ZUnT$$M9_$lg{#8HMA&j|a8X$=_eRRlj@xVbKo9ceMqUwUci7n`pA z78@1*L##9a>JPrkfEU3Y%D46~@V)5wQaXoV-|`9R9u-HppoUd2=yKn_8d6H>qoO@T zR~g8b8~quE+rUlTm$_E06qS0dAG=Mxq-rG_F!YO8Sh=E$`MP0!O*Naa5 zApC0fIC_c626^#kpJDPhZwE+W=3&LW44$yVaK&UHON7yg&zIXMymCx&N?d0t?o6x< zNRh9E#8tJFevw8;8-B+00`~9S%Ust|>`2rJrn#P}&0r9zKD??{G?0{u|Kg&!OFeQ` z63gLT@jSPWm3W$T4dm3)LYB)n@f%s;WslIsa(q6Y+-66fM-S4b-FBI_q_A41;}9L+ zA@}i9`dr8$*A{-XK)%*Tk*N}<#gZvSMi0ut@F3ERjA^sHc69Tgw{yYQpP&9n& zYDO~J4sU+N1%4XgzBN(x0eSoaBPz7#yW2`{F*xXLQ$!#zyRD5D&Qe&$sW}b;Bcezh zH{)cBiP}2#Od(6=^;64n5Z>+NErwWp)fXycmZ(K;0up>d>G<&AT09)9df6~|KNKC< z`qf@3lz6S4Y+W%}&s}qARrZ*Sg3nR}S^;b0N_j!NFL8w@bC=(`#aB_0U9`?Y9bOHB zzP#&k`tjEZ5YGt{V`XbHd=K6;4P1#oXgjRTb#Axc^;5N6kZZ{lVkMuo^5q7Ra^miE z^4OzIN6K@LryUa$Me)HQd}u05pq59m_;9j~c_?)Cm4CF(0=F}|n!_9Ef%2<-Zbu=O zabai~|2H{#yc=43c9OFsWOGi-XO;FlJM&*o`Z#tqlsw8wO=$yXQ}k}!MdrNINPY!z z<){2OcrcCKi^|{CpC8FfGZh`{pKmb+YrKLs9MQ9NGc&!w;^TO)h$MJf`5x(Ohp&8K zlJhY_B*@kgyrYs_YD{*yPa~JCWindarPS&G{ zY8jeT#@K%|BCtNxMR}rXY9Na1sA5Z>=`4*{N+p=dL1UfYU0A(5NSJlOdi)5^=ia`M zWn(Gq;VKpN1Zm&)h(U3Mwv5i++Eh@T?P?X`H1W~w_?AHr#W)%jv4;%G#IZ8;6SEr_ zJF4ni8~YV!;Rmo(y04ZJW7u4p@;4|WFQxGmrWrN}2pPy03v%2YcuE_6t}Zn+SAnCt zxZbj5`zSS|`x=YYq_XYfIHl7=KI*E}luUALJSNK>CGZLBg}1OiHcuKc@pr4tgj_;) zQm>6xlc*$e>npsu1uXZ%yN#H4zv3U}%Fvp2;-f=^d2F{VoI=^d!CP9_KBKATqgAln z6kOZ1(rNnL)J4pJ1#gwq?a_O7_L&|a;0V}|M=)%XzpxWTg%BVntJ)$-pv-*zREFd> zjUKE%D~%J1CK|C5;bt3egnfz`SE0D{U@s`}7v@)x zL#h4?SePlk_k?5nP08y&p)E{z*J2OEyDdh3<^im01CAw%#jdMQ$FQ17O;q7$Rc@!@ zMuzE(q-ywv=3PD@WtnSKAE?FWA|Y-b{Y6zsfo#CTzrJvzhVd{X+0&i zG>GgJC)P!U;xEBRWW&rz#;iBCV%Cs}+_rTt<<;|7<-BKycPo~c>e4Ez(NX*C&l7z% zoxNN|!aBYtPc7>?rSP)OwV@(MCA3Vcm+|%K^$S#~PnT}+)j7(BsE&8kBm{`D;bI2? z!zHGenf%EPg^=lB*>!Ea=MyDMi;lO6GK{a+U_5(*lwd$F^RT1b{8=D|6s74s{R+tm zr@Q>~K!3@5C8A{#2MM_ge}aeRO%r8UjScZT?X%3G&4`Q@3vR2=fXABbG z!BSaf95c`Kf*1z`sz~zg;~p-@1Y6>u? zeg>PB8v!!bo?W<8c!78@1;F5ED}Ar;7re zN38vqkuyFh_W0V_FpWBP4Myonp@uEBCRI`@yV=@AmNN@FA|BLRAIU|y?~Ux48mham z3z~e*RdRYLjj4$y;8H@0`5G}=Y*X0!Qh(Lf0?$>wXUiOxlgDg%L4oZh_YBe!en0dv z(=rtCi&z=W2Q9e|0odK&N!UOlP@dGwu-PtPuj4n&48W>ecBsUL5w*bsB*E%%{gtxY zmb7;WA5-?3CvH0ZIJ3y+2YYPqEHxk(Dt~^T%mJs59Kl6nKqfV|?mw|ta$!GUTFEJJ& z%t_1SbpF&qo|HL;cmyAD4jRr`+M`5nzlNXK)Zq0&_8xkm;A8Q__X9;iUw0ooaM+Iv z>9N{IYIqEYFqVgp{JLNVwO)O)0wl@|E%IPr#eyujyrVVr} zl>{XVIg801rxgiFVu#ZNtZ^yNhG3Ow2^$Ce?qA#p?l^U9nJ{^esq#@oM<2CJo!J}` zAj5hgbUuRn-J@04MEJmQs)f0KpK_m%YOVI{IlPd4WK7@Pj_bP&K$C*nK-HZSzHf1I zQ}nBGYn5<<$O^oPtxOSa3lUCW`W8r`CZ1X#greVVSZ*ChmR?}}onJw{p1^fOazgw8 z9#OoVDO$V)-8)vE*9gO7Pskm2#^G&3%I4?s21ujRj4)@jWt0k%X2a}e^Th$)XOGB7;IycbT*6tKLWx>6?C zpr9P=wz}SXIdmQPl|_|gDl0J~OfO?WuXef;%kMW#-%$qS-9)fXekcg`!4} zibzf2c}erT!+UofdyltLBv4Aq_qje2VudeeG{+VLav#>A+Tq4-_z`P{`(6h%iDI@) zIy4MHwc6D-T+b7B!|+c&sH0jbzUL z2$^QKexT|v8P0_>v6X@0!&WzeU2;vaO%ZeE!eHWg!LT4l4$ZH%#&Aa5gJ+qN^ zs1GuEFN6EC?-D_kDj$)E|2V&`xM-c_j&i2p1FkosCxD!G-bBrZVgz51N7mxNqK4j) z$I$qB$44%a6>6WUyLQc6vp7&p~*t$mo7G_n3wi~ft(TUFb^iK)gCftmpIIEh;@S`@bvaw;N@Vx8P@ z6+x%CX3IuF2!^ZS%5^N#JVqUDC4P68a;kr)Zs(Z%d+WH(4kmauT-w3QrzEwhn3Bg_ zTG8g0!l;7okyDKY9i_-j%^ws28CC(qwlLSuo{*1B@psssU{Zpf(=_nl{J*Fx?3DC^ z8SZs;V!@Rz`-)YX%nhn<6-3qO91_Pk9D_*Xe~2q&k~SM=f)I~wsuU4EN^|WT4w`22BS$;%WXTMv-NguwiLI5h392J`6DdEbzQP@$`|K6@CyfTNAlNCh# zi$Q-YvTE04twMdLW;Unb>=qsbz z!L=&;QSYd>s$fCV=AGi9A>f=>-$ExLd48yAWqdoU52Qr6G*Z^Y;S@zC=!5!!yYR$3VQ{YK)ct!fzO`Y}NPEUAE1VFQx-T+fKbfoP5!-p|SGVLlj8x45| zO`C$|20X~kvosdTseFC;yJ%>0%gJ$Wj?app_y-SVf?}EQk5j^=llWElNI!KiCtn6m&ovitK$NSvC>8@xb4zrfUX>lUV*MK1ww zn(ORdNm=)+dl7w-vBc%e8Eh}Yc>d6ZcvXXjhW;1YB_nV=8F;IA$~IPO!{zh@1?HbQ z;J&=Q2yL-r%93uSQazjq1~wWhWk{H%D<%uy3wfDOshI63YD9Nr?Lf0PH+Mo42Z$V> zFF^up_24MTJNNN1UxipaD^anM3oU%4A+0cVMep~J z6)~MTFHeU{wk#{RWYzM=jg>-;;|7!HHCJ=B7DzFcqzd5=W8g{rDH7hN>_6$~X~q`1 zOMfcB$coSe+Fe<$N($$)1`_OZNVUD`!^cZxos;Q5n^S|5VEC)%Bf$pYJj|nNSRb*> z!W1@2e=+y%m|xOK31<32wn9RL{gxAJnx{_{t>+a1e_`VJiCsP9*?sCM1NCBaYhFSQ zbR;Ej|D)4_zNNU+{wQ9PZ2lGJBs_|pf1Mc28-{QQLu~X4#+paZ`*&nH4kwc-ve0w_ zJHzVI)9eo)L=i{fb&B#v>3$f-gYv*GuZnL~G7({6vp({{ByB+}gPCDyYOFl7)xhvb z2)ppFL|^6jkMOMRnHM}YjIdAp3=Jd;qKqRRQ5%x0!Er2rvDNp$Yk;-t$%Ne?nVLmDp5u>bcCM~~;0oAHs1lBxAyrLNC%k_N%f2IHMP~Ccb zl z?K>tU)VEE~(%$sTlvu`$TB0OFf40gmBh!p{rV@PY{cPJl{Q`N*B`qElnpnYfj9JW1 z@?*YiD~H&j!2SKBP6RssQq~9k>W(dA_DNYfG|u7dWU7q7cWu9{N;;;S0XljA4|&W@ z%ZOavL~RV?L2V?6PX-R`Ig@mh4(_A#wW^e-KMh#!7x{8|*dJme+me?`0hQ)qqkiD` z1I#MqXhbpv?#aF2&Efhx=|S5xpkQp;3(o@hq65kVYqRi3iQ)*c@{X?STk!|dA^a$y?bKl??Og6O;3J{xV=k! z21n&kxIv;V5yg_~K#}&=>{hnTVYi6dMXhFJs3;As^WZM=4I`hG<-I*DG|4%+OKX~N zz1eUgRL$b1=R5wG2}?Y-$KAhj^>leJ@i}}#!vd<9+Yrj?7ErYCrH1Ck?w%Ya;h|)o z`qKmP)P+6u&q=~gp;B5DZhA2p%3xoK%1`PeFwAb`v|+7~YWihg_Z+gxK%=-1@wv5e z0;0>&NAr?>sRjeB!*Ioe1pll@J7k(&aRfW z%g=2?5Iw7(FD-t`_qzgE>?LnAHfbWCfM#;~0k`H50h|>)G!j-2_m6STg z=6R}@Rzt7rB_IhkP5ff&sUV+S!Kd5E-_{g9M&O~$K%7UjF57+s1! zDd~9dFsYL5s4+ZD^L#M2S2aetjH5zw**zZ=k1e#Dz+61XRBqCwa@$)r`rZ{TE}!8I z>cweFv_g`jQ^QyHo;JzzCHEhQGY_Twtg$|`YN&9Hd~Z9tUY;ZFqkH_;o`408i#r`Oe z$qR>J-+(b7pVTekC zN~mC{+QB!TTsLKyBSn)wTP}oOJ6(6m@xq8?nxQYh{7^+EWU}9@A!q0{!C6GB15qt4-KV!b4k&bse?YK zih@-_=|VSoJoLUg66$N(9f>4&KtCFLUP#y)bWGDBXx3YoD4HxPZLD^3{toPHtDH)?ZGZca^wozBt)W{$WCETLA;G^ zWkZQYU3`^wdKo2LmO)E=C5DCGeI*m6+msyXAj!VZeGM|iV>cfkg$0IFzL*hs)P5dj z?K8|hi*(dKUzi1!=5gVe&od)xjT0|&uh|w6m=mYz44J%YVy-Pm;_Vj`WcwNY|m42uZ0E=ZRkHAjRA90Fdv7!v2=70(fKS_&~! zWtIGd9@0jEl1UUNC@y^YxrtVZk8bU(He?RocD2emZR!f7dq_5i3z-8)$X1XG55sxc zBEI5b>|J)6mmBVPm;7?3$qWx6I*p76U&r42sRahZ_%)55;9_5F6biKqLdifmVI$838{B&xT`w5j%Vz`E=@>O*T4roW@CLE(=^-i&jQZtI!wTpU@U zeNYS(xa-SgPqZ~3$upSfR(T9lxV#T4Z2Kh08S=`Q`a>TF`T&gf98owCS*AE*ZG%Pk zXmv`v|A>ZP@^BMyUn6 zE%7+)wp@OcKrCn_Yum$~cFpn`?2c(MD^udg{@>ypf#)6WqN5Li5safXt`voozii)B zCWloi`(Rw^!Cf&Wz|5Rm9J9$`@VD0uF<+nlzRXTU4P#B7U)GXr`$x_H&lY z!cUR97maDL7>0^`l@7n|biC7^^?SR|l_oV@P{9C~c4y+VrWpQeU@5#mDsX`iK>k+X zd9+x8B8dhr@X4*L(pGX%Ik7KU}NTU895 z*(X#8^RE(>6@Sg5FSg;xKdFt zoDMbm@a-rUMm0xxy6?W5N*@)H`&)Os!PQY-K>5;WKY zjA=Vkl*mn5Je31tfMG;?E`}>gvp*0rpVgQiuT!}U3;`Q!J#+vYZ}u> z2iAKMX7|#39?&T-=07Xm38*#%DoyT&H782zvpzwj^vfXVutd?=_DK(vz)9}(%p9D2 zY4uq=QX5O{uxX=P@$Gv2F+MvharUcrmG6kszh+Xg<%ypIrGVHtgxB9Qc<7!a15(2n=A3PbbZBIw&+b|9o!IPwii-R2H zlFHkFDmCQths$b1Eh!Slr>>f}4N-NmRYz93)x0zI4y;R%+-8`EI!7wusH3jXEljo_ zAF!VN6$XS%z zFjM05HqlhJI=-yJvfB5(HAR20!8fN)NMXR>Y#Qj-GJQzE?0#!ZPGoReY4f3=k_Fqx z21691Z+H_zUAbV@U%2{oVnJ0bVi-nv-D%uFn`Z#d&-#=dp%xHR2x{#HF_2Nli&N0eSCc z(^U!bdghIwDBw!%bIte)5#D1^BZ?2lzK!%v4UW)xoX!$6cP+*xv*$Cs%}sP&=$kFN zQU5E8Be5hd+RjAlPNT5>1+#S7XZt}bzq$tZQtEJr)?XxK#iKZyJB{F{2yha}v-x{h zzo-g%16MR<4l^9hk};aVmM#rvM)MoVLEk|yj68U4J7lU4DG0kDg?sRI(Sn1g*qnLFQtvFIxSF?Lap%uU!#uJpX|aZ)T5gM+Do$*|Q;AV12M7yJ zsu1hA?1TbG$bE2f8#m+{DXJC9MVbavC4RYc5z}RvSaIYhj99AlmiI$=y+SDWqvia{ zZ#9-%)->IwtP}7Ea&=YkrY?9&ZcGQjcU69+Y($8H7!##97OHKWpQ_;7M5T-SorwsIwzd zrD%6`#I)6ddb#BF#$ZyF5D2-EKZkPgXd(XhDkuSlX+De8>uLMrZfgq*!9Mvc>rHbj z2pBJ%5bHicQ@3eI1xvO?VgAC()UR;DpU1(Lh!o8=$SHDStvbBa>xu80>yPvu15vGl#RF)>qXv5;~<}*(!@1XU+k;L z2`~beVTOxPG-~mv*}hK8V8WE2XmoE$xnYp{*S@(<(~RA|Q?CqloD<>asBL`X`*@p% zD+wX3?y~Rw1=NZ>akcfq|A7IyOl}zUm)iOosNHkEo|JaA&#w@JEJk61BFjac?;yB7 zEfDDlfMqIn?@t!Ld~=9(>5<4&b-3-vaBwUvAoR{G3```(qB}F?{WP_0B8AJyZLR{9 z)^nfA-n+{84zQyG^fryUG$dS8h-h&~#`jZXIMY3y8y?zDsS_JpLo7sMvz$?lpk>rKRr-c)6!*Z^@OI)nqu%i-yz*r`BnNy{I!LDq);i?G zZ)=XpRIEondzhYpR7e(fxPsYgb7q_1li(4o|RqlkRiEq@xD7 z^GAIYXuEM@aar4`K%C%=iJ5&jLAXs52xMD1kVA`oU%ABx#|)1lD%X zhTEYH|Kd72-nn3Oa*rR`QCQn+JSXp%Wj%2X(&N;zbE`B(Fi$q|#7uSXut~}Xb0uiI z(|a_g6j0LEe?^Q-+gQxLE0Dtq*|wXPf(w9AAi1A|!ll%is_0(vCoX#(d!cJQiO8*3 z^WHdgyGNFAhFFGhj!PJ2Xu9sbw6{%ob<^jX`_e8q#2jdT*?`h}w0#w#-t!$9=+n&# z5~NUc!Z-0N^uCoE20a*egPR6ycll#zQXU!RF|gF32GgFshHry*L5hms1P*$XMbM9`cl6*dB6<%B%E-!r>`yvoW1H& zh^uZ~op8J>vv>}{nUW14PveyYTdz+ws$pTt+izukE5qK$6Lam4ng!~;5&yv1+P*9T z`c@Ey2TmLu`(Jm_wA@Us0K!D@5&OI=o`SlN{xN|{jL9r= zr^@kdEiAoYF!v(yf72@zFK2m}UT6=wRlq`BR#0mOI=Cj6sDYOQs01HRWPWZm*rhIc zY@Y$VDXu^$8(J)3b`6~>>(*Xr`am#rhe=k+5>k(|>pF((qUz?_+84|Wap*k->Ix8z8_i!7I$*P2Mj@zzP z#efs*h1b9jwW7AL`EUnjXelc0u|LOREuP_NQb5*O!DOL8@>Q%mYWs>zOrh*V_T7Q$||25|)8+LNQ`vIZSccNBKL8 z>#=>{rh^vlTjb|aqwgOV5`Lnsu}T-sg}REiGx$5TInjukbbl~_pX=XWAP=PaNA}HP zCEc$V&1(dwjBI7>1UW3FHK)ZGFTSg(N78}cc?Z3H7%{){n*)|Di46I+q^(-3MFS)S z*FH(DgOxb}xi)iDKDmP|ZZkBM+m_ZoF0tz#$jwqJ&c;m7H{g^~>QVN?aOp ziF5}Z{PRrKkhe3O-u0m%We11)$%sSqMmw!20mgxT&w$eIDrwOyIYBC=7sWHj+@TgC zQ_7;Vr@HfTG@?(09^u@lJbE3R6E7cI zBzL2=8*CZtR~`;)5%q9CkZQEjCm_*bzRQHV*y!0R$Lx7E&&;0wlqfG{D}f=RY1TG1 zo&uDQhRQY$aeKbm$(2Yr(8^v@J0m^u83#h^t*v#ArGr^LCxRMw~uUHNV zp)4%UlaZCLS|546iXPEF#a#pHO*~GwMH4+WDBbQNCgMR&egdwwv)&C#uLF|0(^dej%46Ez?f-g@LX_bg1WbV-3En-63dgC^ zE~T{TYkRa)2Ipw39SkayuBH@Vs0agHlZl(xa*l)DzesKe;_c&~tVN};btsvSYcR-- z7qQFEK!5OO>QRYAUq_oVYi`$C!rgX+Rt$|hZy5?w}0CuTt(*Fm&(RkH6u)$(R=g+((xi_XJ{^_Pb?mq0F z*G1hV+3xg|A0NY(Sm5)TV`7Kf#-$EgAiC|52a&yeIP{r8%qwp}7})8%QWuUJkq{o($=cU6-c77s0oCl@9*8xO<-A zl}ECyZQSyR4#(ByOs=>t9A2v0W@>_hPpFj1oqw8=%}dkAd+%ZrtBZ9$y_ejHObttN zI0JhSyb00s#p6>^q~v7wUi*BTSL-~-p=#Z61>J24d8xIcgDgD#2zxq@i`1zme#G`D z=i49#=z^jDJ(H(VusVdtc;0C7$3`IkF1so?(Kn328#3?HAfzlhmtrX(uZ-JMSMMSFRj;ErJD=qY3#)U;?0Cf4eR1>g3!$A#gV2iQ~5 z$5%FCw9+ef*YWRH#k%Uot;EEc{?L9ESpKb;!*bQd8c-em{3O(^Cj8VL*jB=CtcU%K?yqa(jPfzaNN*MOEt}E(04uDq2ciypJ^HmX3I8#k zRdqP_z*N=U_OYcfC+dIG5a)rO7i&j>G`P#CbcYV_IHThvu7MK4SWHdSHjNA z?u+WKy~@6QSYpN9`id<6iR&M=lhu`8{^)@$biHoCUSjC_T`PPHo94f!_3@>Z)A#=- z#?(e0QC{GK6SX$C2~Y;1N1SftyHKX%UlplIm`JS!Fd{OKLQ{$X{>r~HZncSP9}uA#z*LYo8dA~=8x%Z&E*mGfM8Ts_o|4x8B|RQP>N{i#iX=H z8zlei^CnmU^Mww|DD@F-Q~%$FcCTLSw>>dfiuNUidN4Vkx?Pz$4|b>-;tr)g%?xJ@ z6XtR4ADTkz(bsTUDRlcr1a}C`FO)URcKrzUL8I9sbQWOhscT>^Rc~(x6yS0%caf)Ax0K4$L8N_Jv{f7_#AC;cI zgGBk@c|%7|TM?KREgm(Zp85IH5_-MZFh2*=Ce#T3x<7e-@nK^>0^<#Kt-jrPOcvpE zo!Y^4G=f%59F9_9xqrlEtQekEzI?rf|9nJ7$wwD-ARTiAYbQGg(2dj!JH!kTsMPm8 zYkS{{d!_E^cpAe&*dv0n9p58#KYQVVHF_1L;j`hFVc-q`AFZM)-5k!4mMEx{UWYWo ziwQyj{gP^~mxLT6TY@Vq1H1WLG@x2S>IJn-FbqHhMwaXf7GPk=`!?610;BxT;#g1qW4sUcrd^lvO7|B zvlIS+Y(0g~f$Ewfy751i9cMmqNj%Xuk-zxXJ#Y%kW+67jQ>z-Xf_xnSY7K&}(^V1< z5WW9A3@C#{Wky%21XjgIMJO7|J*K(UM2AweU>I`7#L&DH$X@n3Mvzn%OeVE5}vIn=xjau z($Vx?2mH#8K+wn;zyt)92$Iu!dWx&KrSJH4a+B1#mq?k0>(VC^du~lHf>`?SDoUXk zK=1bje{H4WBSGVOq6Mv_g8Sa#o#cNo@SIEJ>ZoCHTsd0@@s8J2xUpIz+tRwb9h(B-PEQmYo_@U?u#ciLMol#6?SkjqCw9kCjaT zml98L1B_kMm|*(G=eS}xX*=rG9<*C10*0P6TeFEyS9R<6bDha5l|5uP<6!9O>v}4g z=`%zJCe_Blm{4`7j*}CAY^+1#*Urq0Vu`HCR%dO}meC%}{qT9;pR;@enRHN;eT&u& zRnf<^xMqukcPS_gZK*+5^L3R)mD)KjGLlF_NNPBp#%)XSfii=|Hbc$j-V2Kn&5V@r zCPrF-KQ(3{ge87$-S&Me=iT=HX6AC7Fv&Pi9eE;zf9f@O?fCcfSffQ{2_OJj&OQ`f z<*F;$lvF}z29`5aI}%_L@2aTWO^@|q82RrEOC%la3Bggcs9F=5Zh4tV5y>mnpMfMI zs9E;9M?FVcCpLim9t99{+2liAx%)jX4Yfp%n@$POG*0&C>XHkw2mIxf+LkZ7jvN*6 zCMeb&I%B`Aa2AJ<2BLbB_;^!B9y^L{Qn-WK{rDbaZU!e>SR1aN@AEQOhxjfwZ_`bp z`tjl#M?R1R)0>-G!0%LsYZJXiLCpyIIxu$wO2Uo7Df$RSsEi7}RXpC->XxtbGdOkC zE|1Nid<7l}`0`4_aF(XD$(JkI1lof9G_jC~u$ z616A>89J33Kp&o9jS>y%j^HcBw9qo@2nPaGA@?`COVa+T#-!LTNDty7>%A!JGRwbj zMR?u-xZH&1-@=hJP@*?8_Stl+Q#j4;Tb`I-x>RS9X!&w>yWg9BRvtjyJ(m4G{3&Qr z&}uOYf~)(bSN)i>Axo)ggT(3-o2Q$bA)sUT!?6-r-_?{LetE%x_@DOGHC^$)(cA%W zj;+)sQD<&=gPr}1=hy>nM+mL}Uo-w4U#k*0u)(P6K*+mJo@Czxq^~cXrtr}h9wqS4 z1H-J;D%z86lT?Dh%TMmbsx#zt_r0vUw_8cI-l!*YhTZT$V$@yAB7X(;mneOR;`;vP zvadFvB$3v6iq;D>0zuuWn71cg=7CENz(R~_;v-!)d1f1dtUKQ zlAECHSqE@eQH$podiu*g+F*H?Dr$^+rnZ9a|G%M zP=**LVXXU4M|b%KLJ#SqGq1L$&%|sOrY>few{fR98T(m@% zitg5AFtj0*YCeOn5-YLytDI?;ZpvrZoqH*bxj|qN8If}E92nSO02{A`DzsP-V7EZj zG|HNOZrahV2o!|Q&DM04N#m<^0KI1K@A1!%v4mKGzNq(sVB8cX4FH?`*IDr@N4(3d zUl03W(${lZSAPWu7c@C9IM2^C#3hWXXK1k>gc(*BbAnOJvX+C4_L-=%aIF*ODW(%n z`=GWX|EDF*Ojbdf;Kfm#RxRVi)#Czn?G(9#Lvjl3*^Mpy~>r?`w+qrp+C zzmpxHy^H#_429rv>`3Ar!#3$e*O5sxrW58)*XkI(C6GFRDrD-N@;s+CR0wpLj1Q4z z@FCHR<2H*3SIBX^HZ=T31xO5?nUxDNo^W8Ty?dU4R6bm#*VbW4T%R;DjM;^~o;P5H z!RGx6BVB?RKak-U&Oq)>x%FhLG0VJK17yD&D&9I1Yy1JSF;9-0-GRW>KL~De%T?EiBPie4?oboT7%Q9Ez2)z%rmPQusnf)(2?>asenZSw$mcp zQ9$WZ%(zK~-5o^h^rMEDRxs?HU?`W;Iwr2RwnIB~x&AR#qH}G-8H~YF$?cnrXAKl* zE9+f(|7h-g6a-c^Ts7xXFxxwfgp0(0LQJTS3$x&c&q|Uj0-OdOUaR;^R#v$T}v~VO(IGU&2 z)E_arp*QwgGQ3g_E5*@TTY^0&dOPfRG`M;YF2kSlO1MK~dj|9^2czGh5Dxix(MG3; z+y?2BN^(NflJJ6O8b{VKVxU)FA_NSa^QE(8DGvJ9fx47KmG{9Spa7(4rS>D3&5j;; z6zR&qo623*#&t2HHEwOf9AR>l?u7M@w|NPPnssr-z*5prqF7Tvg`0Z_gUUU?t^>vv zBs)hp*MAZ7R)JG$djO#~m3C)87PuWp#92WMj*R2+V?^L6wFD5R{RgKn1+n}cY$r8A zDbVY+9FbD=VQWfhhWkIs3pN!e!vV9KFmu(YzlHG=z`XKm;N71pQw)1Bg6)Eg5YjHO zHD9Yyup&iBowadDDo#~plJth>0<>Pb-)w0ieWv-LbR z(@+;!`|;7@)3f(Ch60UaF<`ODrIyZ8UJpaCJB=g_R-B7Jk^q{Ve<=n71fe!93{-QS zx0IOa459N79z6L@)y!8g(%3a^;n>tbOLV2L^#&WUt=2$mONWSESU^Sh0{a;p`GgR_@u_tY%1ylO0-v29?LFXMO93I}HSkS-?|dq~u1lCyeHeAM zYLYw8LAc*}t|PSOZ6B0!^SEtY6&25b;l&j@NHou7Oo2z_0@xxTP-5Yy5g0AZ(yXD@ zCOo=OqtlYZ8m%AzV9q6IW*f~;lf5-<9)-V^d_XrPad+Gk2>Feyn@OPIhY&?isl|qz zf~lM_iP5}xe+VHp6;LkfrK$M7BTGd>A@MyZRQ~L0&amDh^m(LVW7S8;{E9gwZS8|8 zLrTi$sBF)tp@)I&o554+;QmY=X6MS$p^Cu6#jwTxyNX<=)FIELd(`G(9`+()hGtNdg8#cFnUt!h4*qW*}0qv_M1KTYV`#%+Av^4g$?EIbp zU;YpfUgS=1EJ;kq}y z5~Cq(Djqe~GG5173$$890^*NY;dXrUyLEB(+#i~k5Q0gSv4S{O{~VDWO~4j9M!~xj zzSLRZ$*Vi3;>Q3nmc_8O+;ME!zJrA&g4`muPq_t+fa*G6dQMusHoQ`^5Px3i(QcYW zki}5ap^x2>n?dTeRgdWtE?vpzeO+;34-gtDDawQt=5>gI=VBE!l5ISewp~Nr=PCH{ zS3OFd&1DO`NCJX|wo*Ic4*vRMb(CTOp=}ZeVbQbfwpgSe|D+MZpj?v6CatB2u(y%4 zDNi!7?yc%tk2>2P+_nHKpz=84)Sj18#2npAULzwSr_OqY%pIYd$$}Oj$itcKGd6tk zLqa2T1qaQ=hAiY~UTTwVO!?0QF z;iIxaHtSvdQdoD0KL9Lip`K5Re~tN8qat&(n`J!agbduLA_unNdA&RmaabXo#M>2K z?6e0e062f1NilhUM&EZ3Oc%B-OrMD#)lMusXhk@=jIoI^>z_x4Gn~^kuRvP$^CJ!f zkLJd=$Y%ny_fQ7h_ybnQg)qdaGyIk1_19g4N488eaqa47C-vwT`fl#X@lY2?ALx({ z=b5)@+&eScxYU}r2Y1X8dDls>q=Y;BItKfibb49ZLn8475?dQi2Wne&>CuWqs84!o zpAF1$=~T_SH-YPnr5h>dNqM&N3zdYMTss5REv)}!p~+4iW=i6ZndoA0)=23prr?OB zY!CPL2+fEOi{g#=&mLg~6r*#AEi>yN4gn`4HW56vZ=jK!uxX~RIW9xKL^->l@0VmC z^WWFLZC0)6p&0fc;E_0Q(LQeF2l~PP$Z1VhUOK{!S+DC_^Q>3K#(vfhJ( zTHB}>07`}omTGt^w$tq#dn!wB|Hs`+Sf$1s6yKPf7U~iE+#fqkf$#FO+#h#hCTQs4H~dlh^lzPrA$#9$9^7kb)$f%C38!<}D;ng$5v+Lma{GP#(Cv4h=J z^fp}aQeHVKD9+M{nHKT5K1Ek5q*59L{651EpIs@X8&pU3D9zL)yWn(Y~l-pm{SYG=DJUF(a%k++O z^Q$X-=&Y>7jQrs#<%X6X5%~sVnb{$%o|3+_Hpv)z3CL^#JmC8p&Eupu zHLls#0OvG$6m{BnDvN5lU*tPTEt!QuI^JSaWm9V4wdHvHcumkD9_!7JQ84yrLxc zQKfaMml8&%h_NhNZX_HfRFvw-;b9t zFtbQ9ttk;{D8k+1k6^Q%RHd;RGy-LeCddu{WpJIi4`S~*0=ut>0jBsZ)B!~`w2>Ts z19mO~n_-=Ov#g}zQ64VC#nu4(xKvTtwOeRmFuR-2`Hzo3q5f51J=@)#c-b;X5;3Ml z41iKgM1(Xr!pm-UK+aEeV^%>p3y<`BuMdjHnOg72L_96ec!RdJUYi8fo%vYL*_YxnEUU+V=Bb0B5pGyV+ zFGZyOJBGfK-dI%rMM%UDSErsS>7XVu6Qb!~VMt}}TWr*o#rjzX4;!Hf7~ z?;1bKr%ByoJvra4G5(ca9I$GTJ5Gv5z^F(}Bd@GAx~TeXv>NieLtV*%_VX25=6VEQ z0;||{17dY3q7ED0>4~ud$I&j|;ERJfcXoq3I&f1npCl%%RPDb^oYcB+-LGrCnJR<- zHn|SCA<1Ho=mHEO>$jRNXBChVe-><{B!dbNW(Mm`I&|XoRbd-rQG6to;V%818bN3Y zffEz5fOppSd=nyE*Ri6eR_yhC>Njz~aO(Ag#%W!re0RviE385Dwfxpw!WR#^x5 z4Z}+OEN?hRIv}t(c4B+n5!AhGT8?sG9M+Kpqd_%t!N?OV8`4g42_)GPDg|ya6t@|v zxwyW6x#PjnVKmt%MW*n}XX3ox1BL$Q@oq(GHz`#iRWNL^Z($#q+Eczhv+${!eponi z5=;SabT-`vWQ`)vY2fnbm&r;g;$l=7K@_5G1zH4J8r8w3D*Wg|4?;(L%jv=6I_`TRy#gY=IiagH-8|ifZ;)Z3)(Ni0~$)7eE52&?UA}{N`%3WdIB4^xkJ2%lAOHjIRGbRY!N<9+mp_!Ac_4nUT z*nbA%KV09$z~(=M@$md-zTh8U$i~R_pHEB#Ow62Y|99!&e~@Zf zS=l-MSK0>ugR7`yXJhbRQtkh4d*HvMT8jUYYXAS4m-s&+)&9pNWBWe?wExd~#s3;r z`~Uiy|HD?Tn6R*nqQ?Jd)&5_1>i?!y%f|LE7{S5(&#Gl&B;aKEpNkRyW!3(FwQA$u z4CCp$)XLk_J#V5Lh|PArOo8`8p(ZhRl$Gm*W4f4?_%h{e`^oX<@+cPmWj&_o8+($4 z5Et^HF$?BxrJbr5fb)_4OK$5fb|Kw3B$(esRXpz&)Z-5bfDC6oo{h3aQ?$YA5B6t4L=w=?L%XH+y1+@iV*bn77;NH*~^W+s#yW+8!k zuvLy8oXC`ZNo{O3KWbS1SvRZ z_3~I!37I~)HuO+=+Q4~{UKcLtNC`xu&=7+;77=e)+NxY5@VRb1x6aA>#5LZAHCJm& zUYHWJLWH2);BB0pF}{My;eoJ#joIhCXm>Y`Me;4i zB6&~41B4}!s6I*ZRBJHy&|DgabV;2B?wH}mjpgOvBi}&=6Pf)1RcjY11scdhi^+A< zkv;Ow3iI4?_Pk8!#u^f~gT1Z@F4J(eZk|mzHdtCxN_*|S+0!$VA4{Bx+iio?U2USg z&)8p1!Ys4!QCI=-Fd3VV0VjrTP(3M8Td#OB66OBj+}4jdfiZ1hn=`PA-*29^P@sO7 z8qIIsZk>D^EI&(i*u;|qZ;RG4ohgOR&9*QkFrDB%a(%yd8Ia=TPw(zo4ZeycZgY^= z`ha901#xRE3=-K{ROAd7VlybsdAM8`_zZ`<+983?1eftSN=eo6~0mMAPl0LMZE#6}vI-T*%u0HVRM`)w$p#MRvnN#c&@oiEAap z56m=hoHC`*y>$4%>b4u00o7iKhzpdj9U#T`@)&?u(tFo$?h*gV1b>u6)_DeokJy(W zMp#EeC6>ZS^RBOmrP(`PBr)TG0N(c`?0c`LXs@SLJ}^9Ou#%8eokul~`kASi&5sYw ztE!3mX5-oCDNBc)Ms|09z&NAdZ52;1a13RPI|c=gry74R(qac=y7|+#WuY#q*`?w9N zE!y0S%dqauTH1tg*c1fXO~gEIe7Y*$@SarQ)N*Pj1?Rmmchv+aNSx3=iA1PvDwff^ zhWHW?N;A@aQeI**1mZ-g^=~aTakJ^{u zjUu>`cXYN}eC85Q-+j-PbjF!}3<-(t)WdW}qt-@Vc zyaucfHrW2%AQ?yO4_iFaJwIpA?Rg75R8zL)m$(d+m+7>3o%LdY$T!ZdV8kH&=rY7s zZ$%R@$OZs94(X-Ha;Mkh8((F0H6pa82TY9GyxXfazFP5$m(-)hzhBzUmvX6g_+OFF zG4^p5qlhV2y(i!flIE?y5O%{f;2*`EYyxT|J(L6eW^pUJiV!pS?Lp(i4Ow}MU!kQr zy+KG-FUw=%V?xR=ci8@jVZ5C<$QBB$c1zIEUj0+xMq=mh(0rVb{rXJFOz>7XB5)p{r%WEzLW#YSZenE=C(nDyTDj3%3=W&tPRXdq zhXBvod$Jh(PO1c|npBo`!;4&zN0RYCSuof_^DERXJZAHv_vS6!;3zCD_p3|}s@=H? z&Ht3>HY@J9aqtZh+A7kfus25X-2U)WT@0}5*Hw$#rqyMC zV%SOW0Z~UJZ#*`kSh7fA#njx8JI@RFPi zVefZL@{(Y>HYdnwa=$Wu6@$+8z4M7{J+NWBSFYMxi6- zY9pvN4aTjN(2tW@5k6zJLd}mDXen|?_A+OY?E%k<9{uGrr+UqCC1!bO{WDM|Hv?}< zn{TMKBOtUWX1v*N3%ohxJ@AA7DZW=iJe44YIxe&@+ zhVuJtMCh++OGp!;mvQXtK$ClvJ{Dh69r{JI!2u$U3q=}v?yVH*s$(Nga0<~x5jOt? zFQg{#85NzA*{iN|!v5CtHa%1amN{Rh~!@9aF6if(`9o(d@QJ=Ys5cg!{9 zi)ic~@!3YXdPG#bb4bJ6Q(3m{sRA;6)#F5R^KNDZ?y!;N%(eEVp03Z3z-mdkMX0V% zd2GyTR9`lTBOvZARhKjp`zpKB&8Sd&%9s5_4qXa>W0+sfvOljI_lG@=Gh>M@1c}ZP zUj>On?Rw;v7dW63iSsRGlfdBhi4SRT3KBYK^PU!T+B+M~P#-&xsA}Q{;xApS;TI<0 zLvqsiwC@2RUSDJfn_>QhHcnN1YiQi;leynLrGY|)A1y@NTJ^0;>{bvAaZg)@JTNfL zgl9;rpi)5zB|T`|%9|?@s|Cjyn`gvEQf;UY;UKj==RS^=V_Lfy3>oC4Lp<@uO4qq+ z>KD&>awpZ3y>E~e@FPS;tAwRFj7(afofF8#!@}fmsdrew!(m~;E&F-^rppHK&Su}W zbbDn4(Lf;PYXX{RTXOZXIVFi;n2wkV35etR&cMpGimdy|4Q#&9cWq~0^fB|-^iX5CVN6I89ufpso`L_Gqm=?z@K=QmMHEJG!wIV*X6 zXT;6IJt6R4L^NI?&@}}+XEv#rDxtsCf(ag0#39?I{S;83^#^Xul-lIV+Mfg4vpVHZ z#I;+hxP|+LJ%!DQ_Su4VhF;P>4e1Dh%4?} z+eE*q90pXzgrc0&+pOLE3Y51ZrSHT<)}@rw5TH#R63xRQJFo%9q}%7S_52TpMM1C3 z?ZtWCa4IFj)||*H8D^&{Wr{0X9<4;dRp*^LC)PWq_iBko_R)AW;*WFx_lOz8_`y)NZGzQGH9Fj~K?Zzb=6C{4Lu_g&JJ#~b6=86hnG?I!^ljRY3+q*ShNcBm<@_*P9QIq_4&=iw?k7`<*3>B{(p+@Ikb9!_}yh?yX#|xAv>~8+Z5L2+MoKewJh-JG#FF^n%%>HA3^a^FCSCX&$Q8H0mXr z%c2$aZNiCGmh0kK!p{O2*qrdyPH6f!!?dI`smR>Q~NJ4Lobm*q1NM%K^HSAp=A&T-AN}xK)Uv7w$+xSE@Yx^KP6|c;@N!a)EcbFfk zdj2zu;7GB)^K>Yb5l^az5_zu08+_Y9_?L?M9j23iB|gPN!Kneg=tZcwz(;2Jd08$6l+H~Ng`}4sl+XQ49+2th8LM#UafupInl{!Jmj(`qXUE4;Ld(XEQ*M27vIl_Rz?Ve{7yQR~7$8+~^ z-3=jgFzgz|irt^smtgx2E#R474=e?$S(yqT3T_*}Y^9{(SnzAZFE?*Js)^6XwW{rT zcZ{2W2Aq@87>?-o~-@>3eT^VUb`E z*)c;Pz@!~k(9ODl2;G+ALFWM7?# zDIn7+6IMepl}G7v$t_Q!BXPLaBf0m1IH!P*NFg6M!+3xcFZK2cd&9TZ?BQ2Lc=Pg_0avj?X5%1p^dMk1!@?7b%a zzzx@z{4Nsn{_VBQX_<${>S$O^XrLY3 ztjQfO@KYvz=YM4bDsQDD$!OSOJk>&T{W-0ac;akJ|4YS2K*2#Glj9@93(o&5-9^18 z${1`Dl6H$bY0b@_$Vm zByUHErPuO!qj*a1;&%C_6A`0DljHkqhD8Mx80a#X+NQ^4iKnBs8Q0bw}3uE&T5k9;AwT>er_DIfVL(PxA)yL9X8bJzz z#TakEzX~OT=hJ!`SdmK898}j8u6V#F)cP%cjEKb{AKYKlMB;(a36%#L>xilwMUK;X zx8Jmu)LtqNjF%NCd2v>4OU>;^>m_%ya<5AD@mgR|TA+UdGvacr8{BsMq*L@;$IOH- z;2g;w2`Q7#JTJQ@>rkqKLH;A5y^P*swcm22Od;}?U<06M($sXU=V0IHS#{lKUk{qq zZDELTJT-IXY36nN%^}QV;8|ah^p}*~MMRk! zfb?{B?}T!v>|5#pBiwN;3gx; zA-Orjzt1F2yXDYBs%Nj;hG>zRKnZYgf+(SmwPO0vaIl>;&OF!W^Z+sBqp{?2g(RBg zfSRgn4QQv<@(x}Oj6ghjqtBv;ljOt>e&e0fDJ@7?DaU|W0VyDFkng*r*HNrlgxU{h z3g#Yd#5Hpl?2f>0wiPm>DT}k%3I|;k=vmu*-Wr%#JI16`-3r1h3fgt#n61wa;xAIx zJhj763?@KuN%*&Vk0nSkZB~+ioUwLm4;wgrU-r6@$$X_^AaV-531``h$;`?({UM0M zj>j|0`#EFT=RD=V+i(k#5(Fu^n3=WKY{k-|-myRRWMR=T;&GEpU+7u~A@_GueE5M= z@d6#JKmMk6R7N@YD^@@-G+o-y_)L3m+OMmk4yB^$38;TM!yWd2sLgRW@x9Jw;6zx} zz);@;Y}VdQt!3l?RJfD+`dkYKH+9&=@$vTBL%DJIlwAo1Y2ZT-D`5z&|3!do)7 z2f%pNdbz$NlH(n_ib{p#4WKoU?CtokSkB0vk?7)MSpgEFyi6%sQgVKLS~C=8RA$w< z28W)<))V)SRm6dXD^G)}>%$!&kB*X$^0=Sm)eW1xQyoi6`Ik3s-#%R zETN&^qaPjr8mDOTv}G|-Ma?+xF3@P0tlSW~vQNQ<9vdBpMd8u2tLBs9_Z#@4w!|ya z!V}(IcV%8gDo^pim*{;|*7<}5ttr@v-Xp)IhW!jul8wzm z%n88=7I2VkQ>pi}0@e>$S)%0x88wKRHKpqf$Cy3~e1DJRm0BRubb8+#~u!*VOE26SWTp(&O0m6 zUcQHzvf;tj>JqQ2HgjQwQ*c@Mp-6dA$M|E};TqNa@JgYp|AHIAa6vQ~(Nk)-OF)Z8 zMBRJN(q((`kCe{I^@qy!-!OaZx-HrW`5IU|RQtvGsCt5*T8>7E`kj&7bIJ>q@z78~ z?AL`4Q;<*)pt}+$PE(QPruc0u6z2yFi4%#I3{f8sS_}?H<+@;8sGX8-?OZt^IZ7*7VV?s+$fzzp&_VH%hLMNcl^rhn zH8f60=S84VORgvoOx5%}-RiM&rG!#1VL_U280;^Xj(TZ-uY>Ai6v5VNG#g(h0oKS4 zaIiU&p$3D?THO-JyaWCMojDT1)*~Mr+)`*I7>%%>Y}8h=BHVXwC*%8oFT65k>p9ix z`P-y)y3yl9n-Nv*$&(YNN8vflAgUR!_$BL5vL|A>t2owY##Zk9?$;6kleTn;- zPb4MycP@*U_XFQN5 zR=~@G?C2X=Wae0u;f6NzVkK|BKB(N=|7MkCW=#u{<4azC*e#HwPN#NvypvS`av)~# zCBYC+{4!dcfza;HaM!%!wHg1R`fgO>MV|I3KfU@=znRIy0k`Fm&F@7TOD)>Qr&0Yt zVM@|0z7429twi9KnzO0cB+ge00>Ckp!Sp|x5|HT}MmXs@!SW!hqvVbaRDLv4b_yD2 zYOh}%`$fZ@_@-ntUuQW^V-97xqgQ=3HA{4Zr+qR37Nhna#~F32*TnmKY&uRR3xWN* z1^fXP{+A2iQ{>O&ZT7bgz7=(fwwnhkqnNWa`*(!t^I<;WCSZijf8U5*wms_y!|}>G zZ68>@Iy@Uk>Jy_h>~H>;GYtK+%!0NIG;#2wsp|u#J9{~?b7mo zm1B#%TA9PZC-*a1SCo;GOh@>#1xKQ!yL%#Rf;0ez{5JZdxOuI2xhR@;`@|76^0x;E zd%=%jjmMIUW%q!mj#kQ@hr#k9jp)8~g!O^g!NhJ_=bv=3_&}Y_lyRHJJ;$+z^`r}3 zU(5rR^$-Hy9k(>03#2hy1pqxEq%H-n!07ZNmpU1HvyCZ46Z0lGw?z>j;MDL?W)D$j zcUPsP0r0!dlV>>fl-^I&s!J-mZ-a=FIalwJ|f z6n;z)56Ue6ATdG*KxVZXRz;`DcJ<7yu2P7KukpV0ew$#8>1%)v%CJoZS?{|OqR{Vm zhn$dYfIwaDsulOnH^E{v0)eWf1G|<;uwo3gUgV&v3D_m3+fy?&JPIHLdB{g~T~7s9 z&I&cPBUk;jrXb_5inoF2&<{|U(e7a~NCE^{fwH6ZUt#31awiFNU2=68W67i3C58tV zE9!*63^L471pq{qwK`&I^b+a75WkM*7E8{dN>}IaZmZ<#nFX7O| z{>fny@WuodQ!Bif;(5iPsH734mou({aIU=QiMxFr+=YLe$5-4Q zHjXRg&~#10^Y3VJ*RJ5TpZMl0SY4GM_aYgWYX)}Bw25nl@Um? zLAgF4|18|?HYEFn>@DW5K#@CzIhqoIztg5|`b3}XUyL-S6Wx27^JGrp;UTk%Z+<~K zVut9|4497KGGQ^u*_r@myI}Ure1}24$S`j6it*b_8#leO`%(=n-4D=RB&Fw{%hjxX z`qdYq466=o&(nS2Ip5`U$E@aI5IHn7%OEh>$8Yl0J6VrK0P<=!m3Dpp443j<^{)@8 z#@Oh$uEa)t;1}TIQ+D@jimnL_qv$+l|3Q53f+w%Q}JpV&iPq6%<(gNuD(wtg0 zd?f(+#WaJ~qE8-#)9j_$A}F2oG|W475s%Y0v*=;P7I);e7N->9fg;(k_l}Z^`aEc0 z0k&>$3FwgeQW}#Ibi)j5hsR>4e6Z)Ea+$_$qdXgk8rAwd`7W#LB3zCx7)4Ht$>aUIT9w}p8Wl|afH7q z0)Z9e`M5fUmIr;7Gz%>OK;7v^{bq$v$i|yc5!NDsK|z?}Nr(vHdH#;+e1=!>Y67 z7c^RZ8<4pQj~hFLP;dW{sDv4uX0pla4Ld}-l=Q1l5}5zpC*>^n;}bz9x__wyvHTq? zLbI3;>jSd4Pnr&LsK$Q4n%UyaM&(^69`#_vKEU`Y9d}Uk^F=_D$aw_bnony|44n%O zr5B&s5B>Sym<8bgZgG{(RUHm<02iiVp~xs(I!sq|f?0 z0VA04Y%iZtTU?c5Mk^d#qXC3%lpx40gY`yGg*k_6sFUf1_2 za|75EHn_{KMD%UFhTE*(<0UFEMgH|+-Bfoy+^&fge2@4JKx&%guoJU_S+OMos>!c|2Ur4F6T-NUq{a1p<^M4s64j(xC#IOlLglRubaVmCDtgn zA6HtOitWu|6+=Haw)P_c1WtDI`yY23PG(48RYzdTnzn;;B%aKJ7|j276&rrJPnSXW zQ%DUOSNa=h z!`i@xMx?B%uxLLHOt*pLoVaZSPFi~g|INn6iR!M|@i;?S8i+-$O+#g}MlgOm)R))s z;&y}yLSY`0D7rD+qs91|s0EeeGRN$2X5H#vN0`6*pBNbcp$9WcMVaj1IwwAi?+nSD zYWn*&v27I908#>|z#n@1o#-oXvDPlrNf{7Q9FD+@$7E?w}F|n%>R#m#@ z+sx&W58_3#zrMnSy#AQ%l|$c=(qxH_2oN$CZUpwR$Ws)H|MSq%KH%ph7Q_;dr4I)) zt1@J@BCK_q52{wycv9(O)Vutb)K=hIE9bsOmc!A>BQTSy`c(g=c3%|cJgy1w5$|Mc zIDHoiv@ezV@46OUB26hD#3HrQX}Si$vO)vBv;rokY`!5-MY)rxf)&jr+|N@Y+aZV`<<2o7QXgEbTKFfrE2dR zvrS$sCs@Th+Oyy7g@0d2AlyX7Zf_Gi$F{X*go%Cnxy|gn{6^n>IO*f29nma?2))Jp4lY#TsWv4OQHgfnfS;InWr%0w^cZh+J+0$ zUY=St)kCRp55x3|wg*XO9e}oN|Q#T-F*y!-#~Qi4>->i-6caRox%HkQ_oRi4hTPBXd?dT?R2J z&4lJ%Kav5i`~qLNuXL0G5?iJaJ!6dT5EL%z6kPZg$Tm&qRiXbK^`XhtuJpo_v+(Ff*Xfw>52XhzQU>pD)M$dpoHh!xMFuEDZ z6Yl_DK-lYyuD0Hj(tkxiV9aCJ^(P~02dWgZ6uz&fH)V9CD66*$@qMXf3l2!=NW<`L z;Hr8gdD?l*w|ZIm4x_wuagDh|w5$cD(urIY$T@~u)>3mMu58AHhZ*+XDXSzE$8hHv zKZ2D<``dCf;N|DHX_n#GT)DO@-Usf3M&l1?{l__B%vEp7dG|MyCHp1W<|1g%=}Zec zP=J7F-4fBk21AJ)Zq8f?~uSw@b}E&QXoh5ZfM&docNS#iq(1zR_FL2&4rcPo~Zk0&wu4T~qo8 zW4zbmA{Pj%`6WT%6VF4N>|&!xuoGA31*)!8Cc`T}U#3jgM$^9^ZPSNscnk^Kz_2_y z=-LxNT;?Pn6e$>YdA{`70^=CRrUzqyuvI6L^maRy(TdlNIav3WvwTX=>O!p-`FZ-#RBgjO^jj)3^cg*un?|(7jqUThtR0 zPpMtZG4)>bgDY7qyqF2b&)Ew5659qrAGkF)Idumuzi$>?b?c7`W0A1s1_cxHk?+<8 zNc@Wlma&rA&hB}q0V)Jv_bvyrYz=mUpQX}_Sdiz639Dsdl%cVE`7=-@y|_qTIn0>L za(3ANkS+Rkyh4~gxk~!iQ1$izu~ThS#uH^yHcK;H3Kb3Z|0Z8<#&g#VA^J5CY80w)l*d9p_L-6jJm%B zDryx2e;WoWDm7QVuJsiMM340l^Z!s{3b@dLsZhkH8i&BBM8Qh+G2>azP~~G@M&azf<07GeY8k z?!eR&Z)ZV&-7z=z#ja=z+TynCh6A?P7+w(tZ&Mg~wG_G86@J&Yp`qJ`vFbCE)xG4J z!-#6`W#VBGEuYOM{qE^PER1wkq&i^q! zhC8BifLjTY3&m0>N!bcA8|6AIeJ4l=p&@Dp9&#I*Dxb;8kxv-#1s;M&PzMkc$uYCz0cQuh>{pIaB-%d_Dr8rSuso*Ihdv z@!ZS;&{2o}4{C$MAnBoeqA;)C(%Uo0aB}=}M}QX>NYL-fxu;P2+sVT{at*&`&9Z1t zhxeu$V2SB~bXBEYj{3*X>3XxqugLbrOJ^`NOItrGfM1We25Beem6aTFU^1d)mZL?$ zd5+G!p29Sv4{s<(7h`<6St&RDK^$*aw69)ceE$LGSx_A(!=1AbSsAX}NERjkkI)Fc zL;{h3L%!d4xInVL4q5FHY-dtFTw>&Jl-FDo=ikacnl(>FpJ{%Ryq1bTc*tN+usRC! zl;N5VR`F5HV@7y$v;Bv3ujN$6lANi+3u5egq+}|Q@sxV2N_Y(eOTY^j*TmO+qFro( z7NvN9;t@BSygoDENuV((EBfOvgW3bd$UET^f3_)3S4XdUmgiJdu`oDBP}-7jB+tRD zadJ^i@$}4;FH4*vIkH3)exVdfmk-#nF5ODcN@sL=P+iLRJ7gMYpzk}LCNWDeW=Z`O z*R_zQa>iG&nWzA}sn>B`{2_fSIv?qTOuf_lB|aqoN~bE>5qffCBK-<4P}*ebKKf$# zyQ3hfLhZXnpn8|0AR&4sc3BIob%XLBw&cjtmtFN;oWQHaUI@H`6D)7K;>I;k_NjK9 z0GNuQ(iJbWV-`oJO`%~&Seh+8t=^llraC}J>LA_c!o?mr^akYj>Ggz{FIqgn$Zyk~ zZG)_w((-r~spx5NKa}dn1RJo0X51a%bWc}A0((&3m4;3MS+sY#Ppti&XLtO-$FtGQ z)FW|Bdu>*uYtdP8B8|zsvI|A|iKb7;6bpuWS#NgS0|D zNv!0GwrrO$s-|AoRvx^+b`?9{F)31PqybXiK*2F)nDISGUl`q=24U4x_!LnS`#NRe z&mStQWrh8Y6!$Q4EMCLi!tq_sE-uKgxc%IurS`T_-Mq{48CSv2(M<_*6bO8vyY11Q z<#2U5M3Lk`KO>ba9Ma%TVFN;dz0oE_V}9A&hnLnK3Ol;Js)l(m4`MfR4(mSHCI&EI zK3l^^N2~J77G)HiK$@H7vO~vnhAsxZ9mJMVqRRKxz>>9Dh2T0ID&HmYkOH=(u4A7s z9K+bC<%z_kMSJRJH0LTLy)a>Lf97t=C3SwJu#ypWjm;-?L=BNm1@MdMWwYj;OT;ib$XSyncic#Ej&NJZ5(@M ztbv({Ssf;wOF0Uonm1jfol*W+{3iOf*c;67Fxn0}_qKT=fjK|8Qzr$0pJ{OY0Z*y% z5kTr1?h9wUPtLS{P%G}zo0wEp@*Wn=ev>&R8B;@q040SSVnh<|4`N`0`;PL6(H+S> z&hc5gACUspp)?X6%_7#vEVyHRJMfg~eOlI(i{u`B;NljHPiGo6|1KZ3AHPJWZCCSv zS~S#7*qW3``W_I=emkFrt2c+q+QXTQXAPkLvD*MZtXTGDOxx7AmzJep-cMj{oP63F zg<{0qKJYP{dh*!(M}pb+*ti4Oj=F6PHIX#=W+{kfUUE>xG;cZ#Yup#6~Y|1 zP_vpmo_I)L>wmmuIvN|{4tA9b*C9gxB6u(jn$ZNkXTSe*&&vV9SQu?6{_HBn< z!V3d_w8?%suF>{DAus`YUCqjLT3i2j;D;jI=B0KnSZC&UShYYR!PCCC?^>*CM;g~} zCB~~hZN2yj)#R%YhS(4SRewgcjp_bMs1H(RfCQzCjVr)xUy=ux+ra$*@o*Mh^oS+* z8Lkvs0wkpgHpf*9rXCl1gakWzdatr9pSADlmAbh7?p<51a}yR~&;MRRdS6|;R{kH! z%i&H*RY$^ID3jw}Btu_SqSkEb{p=UWT&*H{Uh2~aV^bA+J2^+sKg&9C?F7W->D(kV zpDAHSgu^qPzf4U{l_WlfcF(1h^CCPV#ROXdhXBZN4sSwIA&GQbJ(>D0&^$+Ev^c-Q zMLdXGzeh&ehohMktv%*EwU^57cM_=}(V_K59WNmM3ijI+FP)T0gRz=iLIpB{;r=kw zfV@DeFgxaLd5lCb2;#3B>gu7W?of8OsK1{bo?$Yz7(0rfis6X+89AizQ_Q86mSyA* z<0B<%HflwOeEC4jASu5ueJ29jH7y8qL@OY4g`TvN6TX6Fvy}pX2J`bIi&Ru?x#Als z4ca?`$S_hm`C;kFi9fTq7LR+cZP$WYY`s>88nFiiqYVNp=mIdP2A;++@aZ7~MklI%sF>ymEVnDGjEocRs(^aGx?($75Ifp)XPTOnDC22fa>h%)=g)+O z(h*Y)cr87ZctJbyv|*4h**&_igu8Hjl6KNtA7`g@Rj$Z7c7*yWY#t2ax!fzN0VtVX zx6iw$9^4Q>il>U29UO{Fi_^-i3~vctIo+-FlWi>w8`OG);^-#|I7G$CY(Kqzs5y40 z283cArNZ$$1$bWJc1#c5ut~m!h{7yNdl!aXn|%*SY_;U9s+7mJUvTGiMnNE=2?Qc) ztx)9G%k9{;%{N59Rf_sk>xUz=K_r$x-biI=3rIdc*D-_;q#ZALUf-j5K#VC~jR?PUMm#)GvF z7Ne@p(gZ5|e7b7`_xZZ|V?M11WIVD%S|=23gWG22pOFk5e(Zcf{ZM9di$rV)&yE#H z{Qh?C?o(Fa6hD~sgdH}6jhBvaws=H&PZK;X(alm{NyAWbI$I+Ng8LL&sE{j-Wu))~ zG*e@uv%No}v*2UHzs%RONIp(Gaff&}P-;6=D-7WZpC{oP`HC>G95Qzp7gmhtUpa-j zu>4d{2?GqCS^YI$psvIM&rSCHN<%1%X{qOsZgE)hET@K*A(%e57p@1=K6RtDhwSTx z&F~zX}@GE&V*650?)K&7WozbAj~$j5?;0Px<^js2d4-`Gdvk&U}JB5HdQ7ZO573~CM5mGAJtk^kjRn2 zTa*g6{83F0Q;4~BlqslyTXqBQE&o191sqQ?I&^(`xrX(cY`@2Ev!e_ecu85bK3I`% zuWtLkSV4l9!#=bZCU~bs!40xEHBH+{fsBUynGFI;hZ(rT%6*T24Lm6tG7;Gse*QIz z{Yf&nj*9C*ui3!mRo|i5?;_>c0vH(4a?rB@D3(a2062<*+e=F13W9crIomZv$4+zN z`a*kyS@TT=j(DU$Mcr6}%2T4x8QlkLls+h_U>Qb8nM(fypbD|YC{8`+-jf%e&2ITC z3X%bB(Tk9!Pcpp1q{KX>A>7w6N$YwjB>s~DQ}Z`w~r z;QQ^(uA)&C&Lo6JT2`in0U%Se(0CQGyB^VqS1{#pqa`Y?+cAUF?#OdkxuvyxJ4mZ~ zu?IBz1a;J^OwOP}forXAFVs>ZMNDd(yYdACoozM1nhfHEpP$n-uJ+PV-k8IN@-l zasV!1(T6i9S{XQqk*yMod~E8-w)%f8C3wVeW~y2NNU_7)^Fq@+FJkW)*JDvH*cUP~ zeJM5biCnrCJ|bCPFL#u?$k9InpzJpJj_9aOEmW4UAxtI=4_;`rx8b0ZIUk2r9+Fz(Ulz#`wW=jYfS6 z!-B8(vU-i^P4n=P_e%SNc0Sz^J<*Fa{K;Nr`#Fip*M6*(AWa-Aq<+fGU5BGm#SBK4 zWI#dP!0tlUH3ZNa6>sobkA#HMHc!t?krVUoB!SI(uDU>5V(&Xw)9bU(Hh47@WVD-0 zy*BcTpV(c(MMcsd+PcGS!iS6jzA8WE0i)3GWts1UA`Le&e08M8Z#&j72+|UEhVM+P z628PnoSnwgSwkCg;zCr<9Nv%*H(r0F@*)0o^lV^X1Lw{b>x!>`C^=$lWM#6{oH?=5 zyvaeGw;ljQRl`G_F2=&GxFR2g_0=h&Dv#R>%;?i!N`rR5upwO+91j>&))AtnF97>ba$GlP!y6S(sQ9X` zd5u{RwK2X831UyQo%C}nR|!h4XNwNLVYc7Vo&o~Fa!anY`Ada&vaWKV}wszkPK~Y0x$AXL`o2 z@P*XCW4__c)}0O7haRnH__ImkyC`eH;Lgefmm-1Rgl0vi(V?{nU;(_CLyi^^4Arg$ zI#Q6B)Ngogku4~{PHmzG3=I6&++Yv%gn`sXq_o5g-6TAMC45jSDqTnXwd5ZK#)Q0? zJF~7IIUHt(R>f=jv7J)Xn1fNWX`4R4F7eK&1x3>5=Q8tYHbx*w!QC?%}0+clb zoZeJC3OTmiwAOjsW$GXFy-JlmlHUBw7qdXw0tN5k2uWY(1mC5eOi8-a=Kxg!t*0Sg zK(Zv@>wWOVc8Ga+kKyr%v6=!4hdRM~Vg&p;hC^Sf05OkC*f&62p-%+945u3b1Vl!Y zNV69YJEenmVj9xhq9__|0Bm1uIhP%0I5|=SwLC(Caqx%FM3YPA97#TC$70AjZ48tq zd{&jcsO9fTAw_FuZnHp-DlroXCyRNX)%(B%e54uq)sPo)HIKzaQnkac$~%K$B|En?34~5i0^&8Fk4-J zU$h^^S#YEKw?P(VSbZy97-c3{ng#GfJ^WLfl5x8ShPM$GQ!3Va@8I81eWl*}{dP)& zbwR9rXbP8rAt>>d+SwNpms4 z9WD; zp4#ED792~7B1Yrt4bFd!FWnf$%|33eCwkdMcBhf-u#-zdZP0*#a^>*{luQi|+x|Y@ zjpyt!O+I^}=4EGJC)`v{t`j4DuR4J(By3Xb|5Li3Ln_U(Pkf|8;M%$}XYE z0E@aXwu2a57$-xuEti9WY^$37%yZn$i-?5z< zW-b$fXX}i3n83QcZ+s{V?UYdQUH`tnsZ`r`|Gp}$iMyO@wV%w093e>T<3z>9bw%SjGdNia+~aDC0hR6B zF%QQH49*qLa7b#90~2~SWC@&}fB!;$PY3-Z9%uTF^Y?#Mi!7h343h>3WQ0`FDuV4; z!nRf73@JGejOF9q>HCeMTmo6H(X_Vy`F%Sk=!zZ--l?_jqs&S&QL^@_zOS4Cs+i^}d37>6<`arU6N!ulRMB~um5`qVzoIfy^dh@aDNFON@L69fL_UogZY)E{C||is3Nam1G_w+Zb3tZ5;hQ(!fj&x= z)!}MrLgM*q9~Q_k02ZLI85{PW`QV4s0^b(;@6RO- z_n&JC`wA&Y@6XgWbg?}dO`OOz3^s>Pf8m&%ktTpzwTs+x%Wra&4nAWT4O~~6B)90j zy~=Y@z|3B}bq-v-L5EYe8oz;?aoYqGhL7?^cAY_zbFu2kH`Ts3^M)*ezQ`EPKU{D; zl?tA*k$IAm9j8Sod}_#D|BFd@%Eh@W9sAWTTknWHk(4NQzRYhj9xuI+VK`V^7IKQ8j|{{;GsCS8y`UL_gTeV)27ot$?fF(Avc7{Sr?jmNTe6^=X~g3XLY z=#)qYQ{@fo-HLQ;L#uHmFgtC#%Dc*RH>aB(^Z(a@Mu~Cv-yq7JZo~o8nV}pL-Xnuu z4@Au$%x9CGId)!+GszN=vJM59xR*#|PJ1$$A6G#4h1!J>|E0-?Geox;ceK6YClX?U z#Ouf-YWzD4@V4VoTD`4%IC+iYdz$-zBlBffNIn~XABacg2?D6>Kv>X`ag`#W6b&7V z;y9N~qmPMC13YZ{GEGPk^J0kj9)Am|Y@gfn)aUcd2cl7eL+jUzS*n zNRi$`hYoR`!NHslwyKgj9}ViMX^aUo^0$AlaT84R3lnkV$qB5Xdk=xVO@2W4xr`%33@%2q&mW;G?5OmjC)XtI~%kK)Ay1NA4KT{9PM zrU^bh2}a?{gfqxD_k;ZJ?0s8}3OjK&;vhzTPaMNBVjwGn&*f6@Gj}T8 zYtyT5o_AgA&;F3!8EoDk?yS^HFwynSyWTvgREx=FCGeldq32qK*qj*+yM$biAZnJP z2G?9h@a}0EwZ|4+MGS9?9uRQvt~J?8ZR&%}$vowk{7H9$@`0j@AGLS3K?nVNoNMpX z47f7So0G8~E^kwT*l3U|`y8bWWP?m4kv${Lx-TwI1b_r#pt*rR7Hn6lgwfxR?8Jw_Q$(8ee?O zvXsj3&m*A$U0GwFG6GM_vm33)S&Gy^+@-$8EmGwrK5tKd!lo-1bsD#(<@1+O=I9Un zUhKBUH|blH81Y(h?v#`7Q%Aq92O=`Eqw2pOOOo$6fMbt6V?VX#94@(L*j`RTY!$uZNvdD0Z4EZT8rxVI?YmU`;KmZAXzxowWS+B}aM3mi2ZS zM}|HBTH!mN!46%~8ra5E9)q894YJTFv1ZU4L@LQXpoV!OP0*XsB)f$WjJMS28zPZ( zxwdz%&c-0}4LiG^8uSkVHUjU6Y*Xp2lg)T7fBB)-Azd9L&syuXGBq=&<;9HOWC|B{ zDs^W3%C1LTn>!p1S9aBL2)O3EHc|sK!+})qiz8>8|C-h|2>R0_{=z8AHQ+O5L*0sl zr!ZyF0`5*jy`U4P@$K&h!cr11vHINjhE=+yA$SC6me7$_AZQWELU;l}H4% ziITtnHIRqi_6w}p9!t?b9J+ZsRKE9->4BwQF@ywF*o|`8IyL>A=U(cT_FmfFT z>lCeJp{Lp6Vi*1vm%p%3&;^mqLmHETlXAp$ zzSS|Yr!%BsA!vl($C$Jl8Mt5zc%vO6S6npX@3P}aH(JIt*oCi)2qA~~8i-2D6WGuX zzH<9k&vYv6f-zZ?=WtIY^___zY1elg+$2jf24rm>lM&B7hZSxJD)F1&T`0>WiFinH zR%Rmb@^qPWvokzxhh=@V1#Qb*izlWG`Z4E=-jNvN>j991s4+83nQB<9 zcYyKAN|5sPh8CEic=D? zWC1g}taOiCBiMy#hW~Hs<*a5TDheh#N@6oOg!B_&?cc-5`_G^peN_kg!J<|meU54a z=+#IpQ(TOMP3GNnuoH%h77nQU%yin&-|s{_nST$fp`u0L?C=%tVbLg`@e&En=#>qT zIWzq?cmhg1x&?Y^Ee*K_+%+EUMLOKE$uE>0`Tr3WMf9skV-VzTVut=ocCugYY|VZ; z_4%MSO zM6CLp-~W)EY=%9cb+!L4njWF!r{N$tGV0Hmr|Wc^?FPkEMP@t3(t%9x_i zWpCYN(|fo?EQgODmhK1mu$>x|cD=ff)v5y9NDn~LNaoT_uR7>f`%=0t)Va`{bq)45HGV4nGHRw*3wM*g@Z0Mmar z7_H+?6z0vVi<0C>g&vJG(P!~z_Y3?DkyoER1VpV!X&fp? z-vw;Sw(NNFx17QO7x5$~@7nwQ?|B%V@J@7*vAskqw*>zHsS$yjqMY+N6V1TcWh1^V zvVukK9RBS6g^rUGXa1iaWfVEBS5RF4R*n?NpghX}qLZvC(9UPzAdBo>E+~*>DvA<@ zJ`08~+dc={$PG~5SByALP$V-J4GaIyCpA~*mCRGYrT${g@dUM)T<(7^==b1aGq89H zo(fcdQpFonj@PJqHO1LL2)0l2b3?KV>T?!-0!IqZxk;IHrA_kx%@=D?10|Qauc5R5 zrp*hoYQoZ-kvAgEzyX&VGOV#!X`UW#k4s8o%H!&0HoUXRh7f)_)CJbYl z#1;k2w`T5q&OOOc(b-V<)1oWab+<@x!TgNlD>oiqd*1i?Ai1!`We%rWAP2BIVnP@Q za1^lcZF1{d>G~4pjDK_g8of@|zo?S?s1t_Up*r^eGgZ4ar4of|cw2~b7S{1^0}d%Y za+P?~TdUDW4w>7+zu&a@UAf9CG4`yf2ok%uxglvu+G%E7N%UE`W`s9&0S;9{qlxOX zKW58Isbk=7Y@_=*ISaarPZmvUHBXNd+cQ3qK`UFzjUO{q-C2y9+?PtZHx<+IVpK6& z+|`}vHE;qI_6IlYba-)TP`wo=>}$zqdBAe-vW>1Y*R6p;a({efWVa)5g-fO0-remW z`RjbD>%TX%el#6MOy_subK7{urT294x4@Qh^YYvuHEL_fb%r#gWVuP|{fLNLtQ(5U z2)|M!R}{DBG7|w{U%HU!rAnA4wiw{cK$_vYz?R=H+m zSwkDh>^0=P@-?cI_uUy<`uFxS%W3cD=q0CfTY*#)l6$lJ(5~?mV0{{z%dG9FcYEH2 zQrXB(CsD%3tFxMWF#2N_F_Onotg(H*HjQVKXHs?m(Ada~Zyfy*vsqNi)GG2Dxbwuu zVEqL=!d4eGfcWt=lgoF&=4qlWb=YL=scybTVq_qJY38|MI&AQ!fr+uRn?>Bst&3pEA(z&k3rm|xellM*iK|V&0&56N}QRikGDLZ zjzUkcOysgpVa6CP_cx-JRzE=&fNRjCyBv#^#1JD)ykSCVbLrFaZ`ZVDm>^0KMdJ8y zNERGQdih5AglqJV-M7tyMIqH{{h&ZTo_PxSm(GTs`RVkPdq7P+rXpXkXb zO)oXtvdi@JDIC~NV|hWKfBX3m>r!1n-qcdcj!jV5+J&`~nY$uKD|c}LU}@5jLFHls zNrht4Uz2?5e^2jOg4rySz8fp7=Nzu~#F}eL$&XFFT3n9^Z!=131)Oew1)uE;W2 zbZC&^`yZ;HpxWrF)@C}`12diCf)bFsahhC$(gg%>dmVN^6BldUz{OCop&L>Fjvv$E zvueW*Xcb_EN`=RMkggLE-uL**y}i-!4yV8Nv+u|RXuH5TdoQ@qZC+{IAI`RU0|o&s z`HW`W81|J{lX)_i5E#1134Ziz9#)jA6U)|?j-*;;-&P-y39PYJW0y00*ew2j6K#g+ zFB=CPjOx$|??E^%4>I_iDM=#z21JB;l!wJjm1WF8iwLXeL~4i*P7-6rM^+R_zl8g3 zrM>3r2lzEo!j@0nSt;3|2$LJYhWQLcEG=4U=f>-s)idooWeA;1_UbSm91 zA7unc{L3nNj9&{gt@H9=yT`mDDU=BBPN1iGrCb9*kV{&(#`;JrL5Qc@$=bb?u+Uwo zt}^Pw{&t{6Jy<$aaISh5w%=a5wmp(j{nFfSzwP$jKy!n>D*9kVgMQ zCL;`G(S-?XOW7)1!-K_qrB4olu@H^?GK4I5I)VsYSe`W;CD%4u9meDJ4pel_hN%If z%-=WDk#zA;uI+@r_NPx;qY&ZP)c#rLkHQuJ#ok-5^2_j#_0&iHnGqdfW6RQK(sfN! z21OzH`>qpQK=8g<^aB8sKty6wJ^pac9@B+3^@AdxixwoDtN(Jzq}qSeMe4a~`pw7B zy2m(+C}$RB4E?2i@5{76PeY8FFl`gZ^mQTRY%5kSa&mUrP-Jh>cqgdfGqHQcSPhi@ zyj})EoiM)dwqj$4l6L$MtW5Ldh3EQRdoGi!uu|D+kN|~FW$(Ymz8sjk);%0g%8!+R za0dB%rL257&p0eppGbA5Q@+E$m*Wut8&;4)Z)Fz1kPB)aw;$LfEgCv8nB+>_v0Qj9NhDjmsKOpf7AZ#=!=#?Of^T zusMj%rcjUdY(1N12J*uRM#FgT|SQjvQW2pi26f(h$sHB7hPB|rR z;P>e&RizkqX6e~2qCpFg#&wvG=Ou=uvENv{kcQkokg%jh*QJ5S1NZx8Db{#*WGU5U z1+8#aGt-&n1`H1wwh1?haj2z~M|d@A$)TQ9O&3IKU~Gc z%5+ze@~1(#!#nBFn88N|i^aC8j!2Qo6o=SO1voh8c4Uu6Mn#5p6=xr+z;4jb-nDf2SqIl+1P5%D7MVAq5C1Ms$&KEpiIL)r+1Os~X^n@I4_6bDb_nS2e_ z8tGr;VE{#PLjNtD#YtV9fOc;?^s4LR2!|JbGSAW>_-lm>Mmoqz(I-CCJLg=Q z)X>sd-T<(;|{Us zuYs`#F0D-WeKXAVAYSuu~MQe1{%V+cJA0$}h*M%7d95 z+sz2~&TjrR8;30%bCsbx#tatiT!ME~AOnqjU>bMVKRlxd^h@crW;<^LPoY7&lmM4& zu4t<)_N7mGy}1hbzGl@uy?hQ^RY03ZR*(JMTp5jhA$v`;APuM;;T^uxb@^Cv@0F4g zDfT`A8I_5-x>YB~V~q^&5F!2tKq7MC;2Cgy?CUdOUNchMAA5(#Uh@F4j=e%QZJX|~ z?@2_ws1XcNQ3cPY?acP1!N9Qq0I&6-SEFIjue%1ykL_8b1utK+ir3^fVX1&0>GkMa z0%(AL?$el8w@0wTYw`5FcY&!?g;gQO6siZ-aTdN{3sV~IcRkbqy{J*kvlf)%pdCnOLy$?7r5S!Q)OWJwERc?7~ zw8svd@I~(0CttU22sEn)lIfY~yQ#^)0iVkGWOZb7Ye zO+`dK%pcI+08^8rwdOIG@r~Fuo@9dWLF976kvEcmj&MM_AKz$GDooctG18CtRV^f0 z^3HdQ&d>HmyIKO@;FrSg>^yeySlrwF1?2DSnCK*TQ;+3|T5#zJGh~JK=BgCpx@kR+ zpjjy2w_q_JzIA}3`%$_Q1+g1!BLsBo$rQ8|IQPp2$@>S*4$z8LXefBV-s`T`7Fj zN%KiFy-3$PjVAeYg+V?I#qHn9X+`Gv(+hK4Jycsp3DxjhM+gW%R4xa`o@1hkT_sp; zF&qL53St?;zqB|$|H-|KT#E&Z=8pcQ>6ti~Vym6EzB@gBSY1U;}c^LEIxfZ02__L}uzyZfzI2 z;t!zgW-y56cWuC}pTL0vl`HBkEzC-N_X}RTr8oEL_KXQdV5w5`WZ8<5eRvB;ySsz> z5OBh#G74%0CW5uZ!o^V~8g8c#l^aGKX5nrQv4$1in5x9 z2+R73Tnwbw5M_|uE5_)Nx|k)?rA$!5VQMWal|g zGXDS7ME+M3F|jmuAuuvEx3q)$hg=|OXJ-GGHX!&%y@{*CKik|)ot!Q0?Fjx?6S4eX zO@!btg=AuHXX8om4?9E5)y787(AJcI;=k%31pg|2{D0s?OwCP)3j=EH`}{K^_BpEzKI=m1nrFGbJ3Ln|9KMdEsE)_` z(QL^3(oAm(aD0g=2MQ5)$hz36kAvv-%3w1u)nmMGmu2=qwAdKbjt{04mGnwK!Ek50 zn4KVQUnm2J-Tog%5q8H}==WaC42y`*=xXT;Z7+CsZN?&;=S#Jz$E-u)rvfnof^yLVUe3TZ-@1SoB+`%mCK+m1j)$-f7;Q5qI}! z0lJFEDFz5(dIEC{{#xf9d3T+esOgK`Em=7atP5zTK-s z$K@{ zkR#45`^RdS6x()^A*V@@0I$)7#->$U*Z9*eHKf|aaVh+9uo%O^#*wk(=X@p?ZZ#V( z33xTj$qQ%s;kur}Rl^Uz4(m|Q540AuP4~J_-5&4vN88%X0Sn#-OOK!)2pkEext7IR z6>-|{X36*{OO-YdJKF`;2w&S?j*Twi4ls7KL{0{_)JYAO^B5(;;*ivOdB{pKl zS7g@Y^b3Hb$WHRjSL}zERp0ZCbT*$o?ybDEG>$L$+<4{rz(Qdgp#V|IpQlXwScakpf>tbquV4+6?awK)fU!6V?t%Q?ul{@A_Jm4?+0^Mp? zQt5;1s;|FRzmYQ}lBQ&L<8l%90;aTIG(l}E>HwoFtM^Ykv_vUjIQnKjad5DwaBez6 ziK89(Yvg)Cv$x!Lb6^=KR>Lc|Jn;O%GE~r^gh$L9(i7IQ1jht$&|z&V6>`EH!uG(I z?zfP5xf`%yXA$>ncw&cLSj@zzr8Qvp7$2D~auuIrgGf-q)GO~TbfEJyt= z1dGHmT}FL^DkV2}6h{Tzk@c0`{?dM6GjpmzPXBSt4kL^MykW3!9EScA$FVt1gfEbx z#+uO;sVlXV*XH>`FP9a5k9o3p)?|I{->>16XRRbUq=Y)eEB`3;2=y$}W@#9Vr%yc} zeZmxLCs9fM+vYp$K^&N9L)G05+eVa`a^)C=`Bu?;{tIM`zYjs9Ji%|7gBLHxH4@cB z?nwnYw4mn3_=$sg#D!+~Vfl|2HyLLXuGZqKJRCA7Koq~etlPYfqbtfW@qXI|F!+yW z|6J&-=LvCB`#HII#vi&CQ7wb0v(|^2TWsnjYrCEbawU<;k%@xWsvn3*Mct>9uBUF@zZ+EFS)E;9-epHdu}$HRH4c;96_I{!rdn@ien9}!o)9h*;m2N| z58*T2SIPR4*fpDds=*+98$qdNsbxy)cG_%)#H5^hMhfYIcGyU}BPCCZ zN>rFA?Vy4aXZ-zh{XWd;%Q4S;Xg*1p#nNeZ?R=DdNf|E=~-B z>rrb@v6);^AgaJ*8BF~Ez0Xyb8^Ea3TKBO&R*^#v(Py*M(wbLTVXTCmFMyc{lFTd8 zt1|xh&N)2&k4qQ1Dc0BvFg=)qi+-C+?=p;Pd7=$ieD(eD?_nL6iFCIKu&E8C%mw>( zumMd@@B_-bJ)gu~%;YAsy^VQ8k|ag}5!5f)!VMvA*x2hl;-1sp7AWIrO&^b&$$rLa z@OT+`P6H}`;E27dSPAVmBwBtKfY!k?Cd%l9Y9>sB5|FUOW<{fq&}6Q&ADg^r#%nea zT#*3m_$Zkp4Ji==AQNb#v16yqIH<1DJTTT}a!V5y6qG76h+$hs%9G}GOgH%LrsM+w zCqyNNTge8LJ^LLD9W}=5O?ic%)V)RmD6qgva^p6WfNW6 zCny$OAk`JU8nI5xnRwTNB5ar7kb0~~W(4OiwaOxtsHqd=Lm{-?=p}sQS_hcAc*Ubv zvJC9`Z~|OAKfHcS7cd5qc3m(EuAHFwoiv15%hLI&t$R4Vc=k(iU#HP#VzJy4~$$*zJ0S=EpaK*fbA0g7J{03-5IyW|@l+Z=Lj6eb)kR zW+?l9fJ+swizsgtzHxi2{HSnJEot{3v6@21V*4| zKTBHBoeCftXw(E}f{&8;13!S9CO)>_9%N3gk3U{sCkKrQ!wuv{<_R{`($FEfMgUwLpC);Vtl(b{ zS-ecBE(e=%AuQIc84dJK6(CEA$o-^TNUd$vuW@m5GsyL)JnK8bWaSE;0`dG%xfTJU zMf7CFHV+mF&<(ETgoK*{@Y_OxdF)`Fb_JVaW_?2RKA$a2`qZ4YJ>rrUuZv=s0q=*@XedOmW0NsK>lh*td*^h?y|m>XuWFn(L|`~ui0nj&MV1Zn{}~`2^g5UEqU&!DuH=c zl}y>X9m~FV(3tvh>ObHV=;j5Lrb04l@iR`D@$XX;J&e0`9p_zYaAe>?z0Xegv6fk8 z88UDw;)r9e48Zd#?%Tg79=gEAapyy2qW~XRhXpv%X$8|@*)zk)of-vKcc6iftAE(6 z#X-Dj?z+OauSurj7+woBnp0k+zIXr|;&?zFA;(s+hLqgeGi143w=jv(N#*+ptQBC$Y-$nn{MJUpgNkv#_PU zTO^bc?1XWzut`zu3I%UidQNbE;zV$Q%R9e)8A5w>MSmtS!-R8Z^Vm|kcv&!IR52Uq z|748KBWl5`MjL*N(xHnRy?NsmBRyKO`n8>aOdwtOR>L|L0F&@eMTwF<-ck3Cd2>EK zBWc%L>a?q`Ex^UG5c&D1@>LX9NU~dxgFRN>n7BnbUm>_GZeLvgjZ|1$YQu*%L}HZr zNOf0lDx*p3xaQ9sbs=3oLABJrOf4a)L>1vGh;?srH*8YDSWo$WPVyC|Z&vgJKsO z&T1J`Ub?6js5}E#XQ2a986I2}N?;mrl}7M_GH|nm)Ab!XzzUVWHQIgGPr+yIbhhh) zu7p?s92Y_n;IvFuSI=TYoU}tl8iZ!Vq3kbAh~SN<2_da>lMj(>toL~LO#Xxr^&$(X zJN9soyro}^y%5{No^GcoMz~9sYImG9@U(euhvk($cxS>6)apPl>Bf?7^1a{ialu|p}?rv<66*IZIq z{r>n;)FkrCAB;qZgwZAHyVUCl7`SU7`d=B(3^+>5J!369)lSecL|BUczOy6}@rrN> zxeIHfbt4yQkIVd7c0?%$J&e=rSn%g?{abmo!42iBDXkchQQotzh_?(2b)>E$V^HeV zy0gHP0$I}u2Q9)?kkOe^eW`r`AJqmI0eDi}ofD%}q4n?Fg~<^@QG`B2y=q`ghZiP4 z_%YzYV3I;rd(_MzUD-OXS!CQf7Pyl%&dYUbUxZ`bF7XvDKi>7S00O;2<+Xy`MmN)$+2v z9xtrX0pgRJtzfdssK$rUzr5W{Xji?75gOE81~P+dnnCjm_!#4lAr@Zw0t#u_=HnA8 zjvFS46%V^z<6=!8)NH}O$%Y@UR@cAJNHy=GQIiNlgWxq#SBK78p$5C~mh8#$K{`2A z8Y5=V_mW#d^~x=jbWh#g?yh5n;$yIY8GT9IvH9|XI72Mj()Yr-47!@K!AO{2f!)(AbkUUR<~?W7 zT%@LSV5`eTD=Gcyx1Mp2&EUJT2s}0u@b3Bb0q_8tLhH_WeNhd*$Hr|C0i)Q#g6>gt zBRd4GvI`2tYK5)k23~{=Q2aeR0i{9RlWEohKOfahCMxN0Je7?D_THAzVkAEKYH%4p zwooR0vsv3hP?NDI^t>-=07?HUWgp(Ol}4kUEC?odiPk$p@8@Y~0r@BJwY4DtH! z)+S}QIZ|Nrn+~kp#AG4n7kGePy1LYeO1mX?J@vSb5)kk@0RQp~d&B{EUjKAx zI5DLNeh(*%XSY@O6*XwT=pz|N)Ry%<@liiEUt+g5p5yZ*5kxF2mo#5l{k3y2)N^9K$1?yFPMN5~;&cx%L>p z$N8K|otb=q3%}}~cDC}D({XXevb$W`%tF6aFdL%uTMTpZr00LLa^jzb4SX8_jHzVM z`Dc`DxXMu7_=kngYL+OVMD<5x2qzFwq%NGWnlz3RL|yy?RUf2fPpAdX=zUxP`nX*UK|5ob-+igaW=s|e%xtzGMWZip#^FUQ? z+lL}6^ORo}ehEtHoK(Q=#53oAGbm#9H$ap&cF$my{+si~v2y@6Gx#Vz-c0hQx#CEV z&uPecYE2Cg5fh@98^VMg&q<*rpQ!NaD6yP*xO~U{Y||s+|eQO(r6; zaz`VbbvVv76lPFa{8jA79Xe0kbrGVLGq7ku7X0i|`$Pg!)Ek{u2RpUP0wkPUSCzl< zMc@7}Pda8y8F`4_^qay`eTAHqO%&GXNj&+Qr2`Kl!x$GL~ub zzCBZ>;|Sg?6Ph`ox*oQJs>F3X+q?a_Ah{wOtTLmmNs*S05247K)D##C;%&-(8H>}a z<2P-D+)ip>3@t4yr&;dNOk^PfK=X@#7yHRjhv}`&n*) zc#W@fgZ0KRma`8Jw}384GRnQI{avz!5apa#I9cgN>Dv0&3^i?R+$Fwl*lnBbIzs18 z#jR7}(T5mn?sQ!*!5^)tbtj@xFM?6OhGgbA3uJ{vg8HNx(0lbTb~`uWfM^XT4LJ6U zz+Rw)96$ATsEs?wK|hf0$u;WJ*Bt!vFJ?KT(#mpVA0Yu(zIvJr7%3VC2@w7V?uPau z`OMxuM!L@aUx7XKLGOwzMdl3|eYhGCn?nk7muQr$9qZdDqn{#x`p=EfDlJ#*i30+-Zzh$#%Ei_1lcj!;+zcpplDRlS^vo{qw^ zs;P6&8<@51TF2IMn21Lae7mRxpM;pxA)+yeWEi5ig~}R?^OXbun`H^NBCilBLnBgw zn;&GbGcPQTFw^QU{-$!pXmZq98)3r%H#fMAv7-IQkuPJ_UR%_qZTj*N?@oMP0I^wR z+f4KI>P5(*GA)R%^%2ufH1OG|_#~b|pEa2Bmuq3j$*%1&j!1AQ-BIY@ zJdq)&chmgnYoVUczb?KL%5dQmc%ih5fL-{)Y0Q_aaic7YY9H&E7KLPAbLzHW7bsAA#-oJ}7-`KJya_ZPQSIn)tXek8kZn zQ%v0Pdsv6Z#`~r;L;>*>jST-ek_$k1T3*j26@Jl zMWxQSZy_L9l|w*2fiQQY(KNbDbbQ|xqHs0`cjD;;VQEsU_5(t3x#2eWJ2+AK<@rj! zUbtQ5H_FrB$L|U-DY1oD^2t`0lP_M|H=|2IJt>c(;@P)~zGSh#6s0ldm8l5?LXVG_ zy}mHti0T=Sn6+iRo;O(_cQ9JEE>J|8T0NE=EFQU|yHkb?vYP0%g!VV6`XRNw}X zQ`x)X^1dz{vr8~^KzNhJVz)g{7gs(IpcYR>+!n~IlQ==iCChZ2qCC*yZ+Dbg$Buxo z-%ivz1yNbqyx44=PMh`9j^;*;uTiG9MSi#!KH%`fNRa7ez0}offD}j{tk_6%yZ#00 zNF|@P5#LzmI9^Es*&qE2XfS7Dn<4%L*jtuL9=E>iB?TTs>-tMcruEuPpOR>Bb2T)L(ae~>V3Wra zdXOXQ_^m#X=T(!=-VT_rH)7=tAk|g}tI8|}Ydy>%=G7Bp3>Mfg(%3)9 z0Nu3`(NG-LP`ndO4&Y&OdWJL!Z}9QOUtvY88E2ytc2$}4sf$opLE5eKvbsOcoSLmg zCHfk?7Xj0MH=xAX(CDH1=MnH!8-M%E6EDuKaY z$Fu1Q5jG+5==&mf`!!#gJwv@{Dc>OgxZOB!W;}4}$yV^}ojFk8GCq|FR*BFEfM01Q=&ZbGTvzoA;!XUu2F)Cg}=VyQ>PuN4FPtC zWe#-PMVbUD+n&}`pwu;)__GIf{;WT@LjBIaLFKY5&yVRw2v2_wue8E15Z!7i_nm^@ zC|=4PC)jV*z#_RsPVD0CCq6Ky*MqZ@D{zzLFfa!`Uj51!=|Ru`#|h5$yJMftiN3A{WSaIbJF3Ymi+vJy-d zjcDWda5SKN$Or0FF7!@we{Pj-Sbu)dy5w9!$X2ZnRG>uk#*-MdNt?+*g+i|c5O&XE z#26bmK9>?9u)pS77v~neY>}>#&M&+TXaN58Iu?-tHq^X+RkwMUNT($97svDwq; z-*QjprlG1Nde1n}qmZ(IufKu{#ICNS69;Un;D?E-uhOzy@nyD6#ox4KM&r(;C9;|M z*?z%x{*py*Jb-qju{bF`U!X&P3yP~wMM{6Bm1F&;pEMxhug)d|9*nZu0D0pU{W1GuCSEW^wSoefTYr#4t@#;&mEZ&V#?1|x)H$Wi*~ z{?YQ8I_O1`&=7dyGA!+}YP1}4-=tLFpv*EEoQI`QE--*}3A^Kf4?p@3%a6K`K}5UN z5a{*g1l(>)iN_ME|Bq=n=xs<}_L}JN4FGXEQ$AYA2(!OnA~G25F`4CF={QE;(&7FO z?C=n7R|K&)B$~!gOj$(%#o?|hs$4i**E0Awk4_OsLI0L=aBn&jA`eWO1vy`YT@6^l zC7Xs(eS9AQpOgop)5YcPp@c1C@0sgyIvVCXwL86g%~C+(=^{ErqS-BHc>|lgKU*kJ zJv-;Gw+!9g#Z$Iy_I5X9K_X&^$kq92Yn0)sH+}MeW=8R&q|nVvK-8m}sP&F8mIEWU>ut|;A1kP5y_}CwXR>{(H63lN%xSUH9VT)M_R9>@&whVXXf`+{Y2Y&T zjDdb8TPp`J0MuiMxh@o2H=^zD4U8d@l0MxVpu^$HFCOd!ZbiJ^53Db&eqRKbXp&z= z`{vie2Hm9gC1RXPER|ff$X=4z%ESmR`YhnDM_ZQ>){ddo5Ni;0h2uoH*LKNMgZee2 zp^#A%b3m~qz50nEIsh>E(a=feY5o}eu^22E-9~BeV9pd-B8EA2eiXn2r*+`aVvN*jC92n zizd4p(kN?Eu?y8uvWIb_(eZx=rjGT50~6GJKcm6JEscZxiPFq<2Ht6h_|xmIU5*eQ<`AG|6e_{w!jD()~{B^P+78zfOsSw?OMG0A9-toSl_7t^iMj zPBRPX?na%#3*5dVjQ>Y@k_w*0Yl+{bzM%SuM9+C5A%QG?hi}jPFuhEB2D=Tgp(ae< z7vs4BES|sOTSd$FpU8Rcyh{`JVvw<%#$8O#{ZDh#u#jKPBofwH4Oc|4?F+z1DnGO@ z*;#x%%rPiSEEZ z@D0f;N^wT4p4Cx%&oc#jxK%Vv7*F%TvrmJB)*s6%?sW})2mUWOYvT(|SBrae5AwjZ(|FiyCBQQ=4U(kTB z6q$(zD@kimd&Y4_-Oo{`EHr%qae|ZKm)<%cv{uZxS7kQCrkOc@Ssb(o(meeErk#tLt>> ziR6kp2&vd0G42Sxd+KXbv@(#WKs2&rwrIqpAN||t=U79t)anIk)|3cpN!+M>MRhiT zY4wx$2K=P$vlx`?DX&uacjsF1IY2vZu7#5R1cX>gld&&7^~UBeBsyPL9}xSfnH~i> zb;PYgTeSjRkm+PREY&tYp883oz$wQ?!PlN*M*13p8e+RlfPs?iTbXbN1q9O$1Ufy>gZRdLGoJJrh^>k($KoWoaYXfMwFS3j>6f74Y(&g}hh>l=|c znE@AZ(xl`q2`$ca!qyrNmKDA9ovh$%d&5K>rOPLs92AdVU0z` zc4@k<_ciCqN{DRoYm!z^O`==)M^0(^xH{}`u)IGB#T5)dFt4LsT)oN{Tph4PO%v(&k%bNJl|W3oKhBn2U@?$AiK9I5g7MP&JK;i)K8 zO?HCwGAVkTLRHQ68@L~9b8KkCprc%x;XAjhhaNMeo z?L9^u6gZ5V9A22{IKr1%IvO2vnV?)N`D$7#Q$%NgE%-L|CCs*9L+=Q{1UYdvN>0$| z#rTqQk|sHsJE}FZ)AL4niAwBW>(ahKaugSL;a!FA_qND4)=Acuf;h*jmHX$8BER#; zDEm8bKBFCtJHPxS=BF%R?+Tmt(64i$vkHt?TKUv8ZH}=BdUcpm5*}tGk(EY(`!dyKdXJO@L?cB1pM2AhbS6beT^etvRX=n1ExI#dgP zJQY|%O?EC!sC=atF^F@YxTDkFWIj}%I!k%z_Q zEfek)j*TV-+DVDvjo0-IGb93=59DQAVnU{3DpW( z70-$Gbu%$aiZo(Mn9Xu=^F(tCqJW&vags}4&e`LY9_D|$DXQ@33E_z3{N~$=Tm^?F zUrtO<>TkP?y%@su!F0GVrJ%>&9w1zHn&@!QfZ12}co5@Zi;87M{f=uAeOkA!xTko+zsGTT{|LyaT;{9C4@=_z~8ouS20L)2}u*kP8R>B8?s-BnV2 z+dv}Kjab^<7zP)~qXH-CYe~>+s>n~hDtLM`s)`CZgHvy6J)onW*Gk)bkP3L^Q-}tu znj~0z{hT@rD!~RcOjJ=+PnyJMqvVV-z!Sa_iKP(Z-R1arUoPzp$}2~ra@tlMxn)~~ zzsGNi5E#GQ5Cw+v?t-+}>AEg{il*nL5yzgV z_r>VmGl`;cF;TW|wg}V(Pfs>mX;wzZwyZ@qm8uC&TQ*psQ&$Z zLV_c!5T^GpP^CxM{Iv4|pX-P-CjMi9xuntuHylzBN#|K1b=NeAgJyg2N%AwUqzKn3 zj5?V?FmvV^JtytIZEI$;@WQbsci2_RSc;=FM3JnrAUuPWyS?BltG2Rdh@7T?=x6Gl z6Y#Ekw@dW0IOjnQV2{TjPF$is+<%|+6?Q_6Uc5H!5D2)U7iQ_f6?}sa0&7um4pfUh zm*QtZ=~hg1A|pS}o3#Z2N(}#u!qQlV{J%-CxRFDTo6Bv(fbO`P3XmFunQ>gghTz+J?9QaX*Hs ztp`x$yTy>GYo81X3HyFg8`#9%Z$mkZA~f`12`p4|%hB4UrmpmFhVFKMEo#}V^aP*;JzJotQ(R*wU#�HQOX;Q8+yFJPo!>8WF|i2qepT<90rdxj9VGb^ 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 Hlx6=v5WCss diff --git a/docs/src/gettingstarted.tex b/docs/src/gettingstarted.tex index 5dba3495..a8f9c0fa 100644 --- a/docs/src/gettingstarted.tex +++ b/docs/src/gettingstarted.tex @@ -584,15 +584,18 @@ Krylov method. At the end of the code, we close the GPU environment \caption{setup of a GPU-enabled test program part three.\label{fig:gpu-ex3}} \end{listing} -It is very important to employ solvers that are suited -to the GPU, i.e. solvers that do NOT employ triangular -system solve kernels. Solvers that satisfy this constraint include: +It is very important to employ smoothers and coarsest solvers that are suited +to the GPU, i.e. methods that do NOT employ triangular +system solve kernels. Methods that satisfy this constraint include: \begin{itemize} \item \verb|JACOBI| +\item \verb|BJAC| with the following methods on the local blocks: +\begin{itemize} \item \verb|INVK| \item \verb|INVT| \item \verb|AINV| \end{itemize} +\end{itemize} and their $\ell_1$ variants. %%% Local Variables: diff --git a/examples/gpu/amg_dexample_gpu.f90 b/examples/gpu/amg_dexample_gpu.f90 index 142dabe0..13fc343e 100644 --- a/examples/gpu/amg_dexample_gpu.f90 +++ b/examples/gpu/amg_dexample_gpu.f90 @@ -39,23 +39,18 @@ ! ! This sample program solves a linear system obtained by discretizing a ! PDE with Dirichlet BCs. The solver is CG, coupled with one of the -! following multi-level preconditioner, as explained in Section 4.1 of +! following multi-level preconditioner, as explained in Section 4.2 of ! the AMG4PSBLAS User's and Reference Guide: ! -! - choice = 1, the default multi-level preconditioner solver, i.e., -! V-cycle with decoupled smoothed aggregation, 1 hybrid forward/backward -! GS sweep as pre/post-smoother and UMFPACK as coarsest-level -! solver (Sec. 4.1, Listing 1) +! - choice = 1, a V-cycle with decoupled smoothed aggregation, 4 Jacobi +! sweeps as pre/post-smoother and 8 Jacobi sweeps as coarsest-level +! solver with replicated coarsest matrix ! -! - choice = 2, a V-cycle preconditioner with 1 block-Jacobi sweep -! (with ILU(0) on the blocks) as pre- and post-smoother, and 8 block-Jacobi -! sweeps (with ILU(0) on the blocks) as coarsest-level solver (Sec. 4.1, Listing 2) -! -! - choice = 3, W-cycle preconditioner based on the coupled aggregation relying -! on matching, with maximum size of aggregates equal to 8 and smoothed prolongators, -! 2 hybrid forward/backward GS sweeps as pre/post-smoother, a distributed coarsest -! matrix, and preconditioned Flexible Conjugate Gradient as coarsest-level solver -! (Sec. 4.1, Listing 3) +! - choice = 2, a W-cycle based on the coupled aggregation relying on matching, +! with maximum size of aggregates equal to 8 and smoothed prolongators, +! 2 sweeps of Block-Jacobi ipre/post-smoother using approximate inverse INVK and +! 4 sweeps of Block-Jacobi with INVK as coarsest-level solver on distributed +! coarsest matrix ! ! The matrix and the rhs are read from files (if an rhs is not available, the ! unit rhs is set). @@ -183,8 +178,9 @@ program amg_dexample_gpu case(1) - ! initialize a V-cycle preconditioner with 4 Jacobi sweep - ! and 8 Jacobi sweeps as coarsest-level solver + ! initialize a V-cycle preconditioner, relying on decoupled smoothed aggregation + ! with 4 Jacobi sweeps as pre/post-smoother + ! and 8 Jacobi sweeps as coarsest-level solver on replicated coarsest matrix call P%init(ctxt,'ML',info) call P%set('SMOOTHER_TYPE','JACOBI',info) @@ -195,19 +191,22 @@ program amg_dexample_gpu case(2) - ! initialize a V-cycle preconditioner based on the coupled aggregation relying on matching, + ! initialize a W-cycle preconditioner based on the coupled aggregation relying on matching, ! with maximum size of aggregates equal to 8 and smoothed prolongators, - ! Block-Jacobi smoother using approximate inverse INVK and - ! and 4 sweeps of INVK on he coarsest level + ! 2 sweeps of Block-Jacobi pre/post-smoother using approximate inverse INVK and + ! 4 sweeps of Block-Jacobi with INVK on the coarsest level distributed matrix call P%init(ctxt,'ML',info) call P%set('PAR_AGGR_ALG','COUPLED',info) call P%set('AGGR_TYPE','MATCHBOXP',info) call P%set('AGGR_SIZE',8,info) call P%set('ML_CYCLE','WCYCLE',info) + call P%set('SMOOTHER_TYPE','BJAC',info) call P%set('SMOOTHER_SWEEPS',2,info) call P%set('SUB_SOLVE','INVK',info) - call P%set('COARSE_SOLVE','INVK',info) + call P%set('COARSE_SOLVE','BJAC',info) + call P%set('COARSE_SUBSOLVE','INVK',info) + call P%set('COARSE_SWEEPS',4,info) call P%set('COARSE_MAT','DIST',info) kmethod = 'CG' From 5c589dbf30e5e991dd5b12010766c5d96f54dd1a Mon Sep 17 00:00:00 2001 From: Cirdans-Home Date: Tue, 8 Jun 2021 16:15:32 +0200 Subject: [PATCH 02/36] Fixed TeX typos and href for issues --- docs/amg4psblas_1.0-guide.pdf | Bin 0 -> 1832169 bytes docs/html/index.html | 4 +- docs/html/userhtml.css | 49 ++-- docs/html/userhtml.html | 4 +- docs/html/userhtml0x.png | Bin 892 -> 905 bytes docs/html/userhtml1x.png | Bin 2060 -> 2101 bytes docs/html/userhtmlli1.html | 4 +- docs/html/userhtmlli2.html | 4 +- docs/html/userhtmlli3.html | 4 +- docs/html/userhtmlli4.html | 37 +-- docs/html/userhtmlli5.html | 4 +- docs/html/userhtmlse1.html | 4 +- docs/html/userhtmlse2.html | 4 +- docs/html/userhtmlse3.html | 4 +- docs/html/userhtmlse4.html | 36 +-- docs/html/userhtmlse5.html | 4 +- docs/html/userhtmlse6.html | 54 ++-- docs/html/userhtmlse7.html | 4 +- docs/html/userhtmlse8.html | 222 ++++++++------- docs/html/userhtmlse9.html | 4 +- docs/html/userhtmlsu1.html | 4 +- docs/html/userhtmlsu10.html | 30 +- docs/html/userhtmlsu11.html | 54 ++-- docs/html/userhtmlsu12.html | 54 ++-- docs/html/userhtmlsu13.html | 54 ++-- docs/html/userhtmlsu14.html | 14 +- docs/html/userhtmlsu15.html | 38 +-- docs/html/userhtmlsu16.html | 78 ++--- docs/html/userhtmlsu2.html | 4 +- docs/html/userhtmlsu3.html | 25 +- docs/html/userhtmlsu4.html | 8 +- docs/html/userhtmlsu5.html | 4 +- docs/html/userhtmlsu6.html | 187 ++++++------ docs/html/userhtmlsu7.html | 136 +++++---- docs/html/userhtmlsu8.html | 34 +-- docs/html/userhtmlsu9.html | 522 +++++++++++++++++----------------- docs/src/building.tex | 2 +- docs/src/gettingstarted.tex | 7 +- 38 files changed, 865 insertions(+), 836 deletions(-) create mode 100644 docs/amg4psblas_1.0-guide.pdf diff --git a/docs/amg4psblas_1.0-guide.pdf b/docs/amg4psblas_1.0-guide.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c745f571106205cce8cb9a1225e6eda546f69eb9 GIT binary patch literal 1832169 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ðHPxC{lM0qx$KX2rNr3ZWRq2Xss~>Z{~N;l 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°5I>?4v(!knQ@y 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

Q-mj21x<`ij;9NFz7eNU-Vz{MM58nya*eOG( zjKLMq1pW-DC=_%4&o0TqhH>zpN%csfQV4>UJ`lC0V>Qy(4nnsQ^A>#?b@tP^JYzG$ z-07jNL98trhHyOdjrZ^S(nB%NW^(NUqC~C&fZ;X?C8INc0^BYl+4I+9lwx6hW)l&` zwaMm0stS%Gf&9}7(YYe49O$-A+zgw6r{d9RYHPd?0 z)A8~6Onc9~METaKfB7U-yd9fgQ9G-0T01s6*!cTF?usaFWJbP`k;+ocH%^KXDW0Jr z7W(Lk{pHTlkA`O4Iu;Oq4)Du{PZKHYwYk-^@R3J8BiyJ4ue&~Yy{D5hytfRg`Xn#u z;&hUarct?o(r;jS845?b8Wu5)an=Q3(}&r^!z#n}!u+-D-cx99{87- zzFy3F6|ZfZWG!Q*TQ+6KwExM(X&3pOQq&+K3!f$ll6|6+Fh=SaytAT5vWpQJ?NZ0x zSz!TMb?9U}#%X?;d{mk)Gb=1zsOXVP&`U)uR%U?}Hq@c}s6OIQOp;#;M>&*;NsU(6 zP=~IV{oj7kqr%2{=$zi?QS_*tn=zyHb&aA&a{~GT1EeH1yskFB`DSA~hT?Xy%q$AU zZ3w(IFRr3oOs|F3f(p_*Tf0c-t*xi_?_>KHg$8$C*uMw%?*seyiT&&EbH9s^!(j59S*&6_ZZlCdQ zd+SkZlXZ&|>`uiWR9~*T{p>^0sx#vr3vM|r=PafDChb!S8!nE6Hg>PcQ9Gv zoU&5$L@E*DWyxnkUu}Fs?q2gmUK|}-Ybu^J;#}z@lVB58+_Q2KQbcFL%8yc5GQ2LR zA31IR6*V{tx<7`?&lQ6i`}o0j)-NH$pLZnCnsgcy!yKI+QmJJjopzN(Zop}v+=#jV z6H+Gh%DkcOC<2vIQ3Z~aW=D}&D{B{@XVU?(buY%I55r!5j%wdcA>0nyFm7jsSKO6( z=DR$Ko0-Maq|Q`0RsTd!fN>~F#8i%6#(=8}_F7U>hk zg%S`AudKHor~X?Cw!P9e=>eA~k z*!yzd;ZAz1h4#9uL5m%rj+EW~JA zgM;H!l&SypACa&}D_`2Bv=2xYnhCME=@`pJm;{7}CS)3H62VP^fuKuvgda%63`CvY zZ~^epQZ(RNeN7SfESj7v?rGOrBg1w9!gH^Z#%<9q?CYK?f!}^C@kR*K5p5ab(0~yD zQg?cEsr6U4M`Rm&Yx}w&ZGGIkqlI0*kzh{Lbw`66H-fn&PL5$uJP8fKqFvFAaI~=4 zm~^IIPGN`z8c)a%YJVy9Hk)7{OOzD9GN-wbl;YQkTo?4(&#fSrjBP%zTm(XbQ7)X+ z+ZB>xzB8>FpXx9T24okTmE)v>?R-s6460c2rz>l%z#~_&?FRlD5@%m!uUtb){VjCc zbEidLzArK2E&v-WoGFSeO=%WH8Ya>|T*V9L#{$!LJvEPqbl~CofJ0X%wUR)H%4mou zI0p=aSVa!f(x+$6c5Z?q^KVkv$(YHjwzb3=U$Zot(j1;JWcrrEVE(GnWL4qAI>IXZ zO*f)sh?Te(9b5lTagxss3|AdX5B)JCyOgHY&@UcLbr2m@G7xWXSD-?JAwZbT+1P@# z=cateMiX9gnuk$4?!gGh+|<9B$_C2TD)AsH{MJ!C&$-JW(-L@w3dI7@90?X@^W`ieRjrH{5u2(LsI;){Dc6>b;k`sAt%iL3%8cFnI z&=d8R56sFfBlaj2r$d1!Aq$l;h0TJ)2^^;RZDhEl+!c;~lXJWslngA<$h5bzV>jkL zi=;v2M8V#~6hUqazZ5p2`$lNXCBm9HYIKl>qzLLs;iAL#FzP{lClcD3XeiO0e$ewt z1&j&^5B(H1;7+jj!E(qQLa$sLpWXPWttjR2nh%V}Iz@I;tZ48O<9^|o%nKsPSjHE+ znvh0ggj(O=hshCK9Xu}LUr`Y@TVXL_vEnSW3B_&U#n;Wdkz-M4SH#`s?XV_{a2+q& z*?REtz%~jFA1)W+(99^j0~*eM-r$k^J~Up`sGLZeG3#P_^Hz>Wd3U8)SqdnelE{!@ zN}?EJWG)MMo6AM-*x6fcK2E`K54u`1F*pV$` zuHzvNXH9@cVD0t=!@z238e0>20Ke<3kK9Zu)+e6wa5yP=oemr-E_}9m`s4U#)NEpU z!a~;k{v+3;{P|rrdjZ#uinfc6g^I=R zk#@+cZsb##9Taj4AS0+TR22~OB0JgzqgA$HGVBmH>GX&>pSn_@9}&fbW!tT9FD$#U zq;)&g`}tfO`y~EU$i)^<+6AbA-BZ`^jeRhF*IzR(mLy{C!iCIlDX45{|vGIrnw_FL_(1yLf3FMF8G08`@f~GN%+rH{_+w>nFv9mQX__Vk)QWUt% z$wiVe7g5gWQWh3x*Ur`hqp;blGYYW!yVp}(HjHEckjR@cZB&#TF?Q4fL)Bp4X}96K&otr5{EHvJiuNb@4@)#rt) zFfUxi9g&gFYT$a)j^ZTn#DVi9ouFL1dPM%f3|+m(lpZDuy}fXf6>@{w)~yLapf`T4 zK|Q$3)V5J6jej~4|KLCL3ElMLHOkGpqczfBn@L^Fr0n4gR&8Vb_WiG`q<^q2sXHN1 zLzk&NyeEn%mD^lO?G$99Y|%OBxIf}AP*~{Mm$T*V7M)^pvfvH|e zAZ=E=y~-XF+{yqbJLmc3Bx4wKQUM@QTBB&t(W99ML9^HMl)dhZMh6ah)`EHRk@+4F2(BbUHoxXW5;JAR8BYJHL$w;0v;A?rQ z;s6A9@HB=_p;m&bUjzr{OlGk}iFVA3^Q-fUM#|}F`i`VHSCf+ySFlKZ-EY}}K7M~S zxkeW#91fe9^AKiLa-K3tnz(gni%&;pIR(q3jUwYe!~T^>sIhA{P6Kbjm|jm!*~i^# zgYzRYlR;^sGyHc?5Yu*+Fih{$Q`*hx0y_iAHK{CfO^PhP~$xP)T}(DdiHz;?bfe+kDM#F?sW zeU0y>+E)c9nB|-09+p1QOTPd16G!AQd`$oL;G%g_Q6#g_>~y z;e51j|2_)e$*EGk`;0x3vI;d$@|&sDIEpS|zlz02>zykujb5T7G49Xks8rxCW*cRU zitdyv4V}i3@vJd19b^L5PhH1%yNV_?k`5*-I3o8%u&B{)lYLgq2<2OLBTVAj05|Yz zQJ@TWMSg6yYZN9P*5;Qs*unN1HA1Tx%}l0;z`$GgHjDN_CRT)%P1H`BDBx5Cl)#Pr zA-|K3jGM-oaLcNtivQ=OGwCn`c4WjLVj!l<%`_PmH``QH?-HYRHQs!)@tprDs^br(F@eo%;}Y_%*Ug%s z8j2TLH`f0|h}CWeRei4C)oq}yZ%C8H)}EJT)5}hunJf(P6q~sduh+v5h#q z{cVZBad5%*_rJWOVEb5SQwW?K@4$YKlD`_W0U(OP4dV;vah?Q?hB=UL{eAkx|GF5a zJ3#@WNHhH;&u9IOLkV+w7C1)lFeEy@gJGD2aXvors4acSRf(KS`msyMq+NugRQKdq zfgEOTS^Ax3LApWRNNOGZa7A@I7(H>(ht2yP6Oe_*G&axgP@kGvFW}wURcxO=nX7OK zU1E80$(Bi|s{3<0N)pg_Da@`mPNfSZa~^#yarcKKvk1n$TF2-M*FgbLktV{nS8-=a z;t0bFO`NLaU4TMX1uuT_c4G}9($cX8tE&+WW|!a=pItM#hD9r2UoaXko14y%bxIMk zo~3uC7TAouAM@RH0;D)*J-R6#>fy-CkyNpHw<;+A_3f5_%Tz=kJz>I(Plz4C1!m?& zJor%aP5>_>^JZ6uB*h(ZaFNQ^{x-{}YCRWTvNKp5UNSE%tm(E~`mn&HD1fAr#wt;( zO*o|vPUqfSj`M$?BWty{xK;$ncP4o4+P}~2fs0~K?2Zd(e!r6EGB&&`-V_!we5TiR ztPGR3o(J+!XRAhWb!9GWXk5O7oy2#*oVDs=U?#jsO^FyN_hHHn8WVqLO0-dTt15(n zPeT{~r_iJQGR+QmGlR0<7sEfIY-tGbM7+|XuMU)ZY52FGI^<|<;6HS{8D z`s|!aFG`JFd3rE+84xk*wqeE-70wF~-N3Qk;L4~&3ZI6(On0c;wmKdrRt z(eure>hd;LvEiV*y~Z(fY;I~)ptWI-LU63jE=z{Id4&9Hzvbi^|1_EU)k(IQyDiCes$k!CrE-GmB zB5vB`rzunUYg^8+RyUl8O7DiVj4bZBvbIs*A zv~u->HBWQQE1^*iH1Ck`Wp?y7bdzkwJYYftZe^Q9_8H|9>`O84KEome=GqQ#GWTJ|iS@UT;Vs|hOM_-Z`sDN4aW(0Jvcq*Ufw9HP{4vYWc63?=P-(M5mup`=+X zRbwbAY?N^_Psk&4!S(~~>u2db_;i$PZc^h|kXfkULcnV~wD{}cNaGMl!q$joK`L+J zX!z#sv_+D4Ec==J%7lAGp%ZO$y#@h}n#>w+>%2mxdux-aW`MuZJr$uE!l~4OHI)b_ z{>(fkBn?7WjaJOWr;ibKei-g&`EE}AF; zau0S%bwqN#OkmXXsu(qEa`52E?tx!R26&MoLiF??(_dEa6=T5I8HE(SsUo)SO1?uf z1e*f&`p{mn4?e6WSYPP0IwmPXC320{i=){;Zs6SX$|I=@cF&m$6}0BY{_ewj51+l{ z)X?L7bHr2oe5l_Zy`I37So@o+BbXe>eNZvHy1?g%Ww?fh>jf#{_4mbO7CxEuv+I27 z;OOj~Qt{Bedii#8Ho27f9}EJ&w-$ZvrKR&yi^J*Fy+4hw-df#Z-B|f~)BT0{eTiZU zuLl*tNr;s?;BeD@_{3<|}ZA#rw42pY|)IOZPg2K(T(h6?q$r7I< z1g-=&f^xdT#)%k^&yJgQ^m$J{tgEZB`>_?k21f!1G*S;c!%2mLinag)mpRB?m>>6$ zRl_ru(BX@qWMeKD%P5!H)Fufmz-xfSWmoPrfx;*Id{B;cmd!%Mkvcj!VEHVtfG0N* zjS@hgdLklLDa~B50t;ut-;3iCpbdz7GCj6TV!=5}J+pr-7*^MrRu_W_0gvPu^L|S- zt~N`WkbGk{ElSYhb;F_@ifz*;<%Q)}5gSsMPoF&Myny@BYj3Zn62J_|us_p#>Y|3+ z=Fg;;K`o~jBo^@I;&Yc^tiL24Sk0j+aRCB_B}$a8BFF(0X6Jk=nyWUBF!H?DuM|eC zA8&ZiZ`*cgSfCl9fdu1)t|AGtp3DUes^c95$D!~^(HtVirX&bdr?Bf*z{QW5Ks*n> z+duHv51xN}_~+f1d;Tlleev@7pY|W^J@UH`{_1}ZzYDKDeE#CEFZUmRcj))Od;a9n z-pkP8?z7P9;qzyQFZUn3I(*KfhT;8ptJBec@fhAe(1B+~MeYAfA%X9zJ>XX#d&c@EdTv*|X>2;>rHg{X^O}KzR5( zv`PctZ~mBf`5d1Jt?bjimk+-KirokMPxcQ3>}fRL?jJr&gZMU%0;W(+U+lg-+<*A$ z$*v_)sUI~jUcG$r{2;7BTC+#{2M?d@?myjo6!z2pvp7WmyZ5KPXJN1h-|aqm;&;=S z@~!pw+N@{_cY(;kp`MT*F8EFZUiErq!wadmi`cNM2KHYu17lt9eY=3R6u&GFR zz_xh!>gC?kG@mSa4niPo2d^F+9PS^!It;V$`1$ikHLN|@d-{A0n9&tx5sO7e?DuPB15L#ga`*viic@K zmc7N{K}W(H#S;1iKHGczWdHHrvxi~IW25H+ zcjHha-H2mO+lNW>#?_NZMI&tu)1rMCz7rOC_tBpKEzEhVvvDCcIa`0FkL$M3 z=D(Ys1(8Fy#i{78Q&CpB+omS&=~QfiUMF#bN%{7Y9HsQKYgeVqL^bUkrEW{VDz&S( zMCB-ajjDK8d6N&gO^p!Kh#~65C`nVxA-B8l_U#4u4yEql*GXF;?X4vEcq+_G@64_N zhHovE=KJK0%H<7{*Pke8JmBQ?+(KXsKP{ukG{!UORw;L{l+J<@|-RvsSz&=Pl3)p5ByAQWJFOa&FBVZPQuLdW zr2UxuB1r#B3DS|5{vt>(5u^j9{~|~m%T(jWz6jEhFOCxv_SEMuNC&+BB!YCi!QM|i za_b{w&y;ubOX}!D5QVcug^rA*ZVg9Z#N$DDuVaGkzh8~rcUMZ9<8ih|zdXCo~rg9CC3S~!E zZt9H#@(CKLmJifUepFFa)2wW(`$#}4P4Et`9NXJ2WdGaU{GUtqME0S(DReP>C)W}L z`lqksibNuMt?TRQPcK3&O0YpZ{6GK4!AnRW-rd5>b)j-T)1M}?3HodA$MPGAwy^@q z;t`R3c{swK_~{W2VZA~q-^+`Ov-@wS?~*oVQJ46D z$PDkzpAn*e`kq7@;is86DJE%OdxE|8N{$O|`>KcWee z4~cJfP2z(i91Tcn>Vtf$`f-?S{n!4*?0Rwyaan{9?RFofVT$N6PoSB%y~0KCisZ*` zO({Bl6fua%~O&S#^y>G zHQ!I5Y0v8OH*V!zvILO3bvZH6 zmg~lr!1C!_PvYtwzMOM5$>FJOpSnX!#M3))K{0^py0RRU+U`jt>~nBMslj$TOeNaFZoM9g7=DagZr=8++pX2lr z9bj;U!T|;!EBPjNDUO6o=Ab+rp8|$5B=w_ zsGWl5Kp&3j5~)D{nrM-){cg?*>y}~|z3h35tRU1Cw?a(ZCEKcius34RYi%ewGCiJ5?mr>3a8_*!c{X2AK=;K zExz*MmMx7S9REbVY9A_2c1$1hY%|E%1LEWRr;#%j^R;K%yIX7|JOslC;!dEy;LFDz zuFW})Y$?W=Ra8p_ub=pZW#CD-Z8z}PD=X>6DhYGipJ5lrtrw$+DV649RFbnZwh?v! z8#AfuEGo<=NohqXO)%q@J#|Vcqc!!DJfq27;)uj)6B*6IOxB!?$I<3UpsGlKa%{xCif!7H8BXqbZZm&Qvi-QL^QjZ>mdCt&;ibW?EPOgL$Q-Vf3zrVqo zG98k>dpuP(Y-S~~M00?1UWMv0*n@DRHBfE|`GawSI8c#Gk~6%yu^m;FO(JkkaFT5x zy*|Apy%M7i*!ONSes49A;*GR5D#BwboKHKR$CGyn!UO?Ewc{~k^7?Bm$MNx)Ao{pe z?8uaqS*Ym9MPA_7$~*BXmViUP7jRvLlC93l4*pp1d1kZP%>d*8j4K12lW^|%p=#8J z7mh9=m~SWl^dWHo+AiY(v5<0aHYOmfpi*z>PE6KMibp@Q$;-^a1Os3zs8ckYKhd_9 zKplZ^!Lu2TBIa+Lt0|PJ1C8J-3<7TU4#V&pNP7aW?yeJx3V7C46ocRvU^X zPKCM-??V|sa>@r<_S(!)qH5*`rR-1!ALo3Vy?rNh)C#WO;JJA>^1(Dh993 znA)T&5qzAmUN;5PrBSPpth)|B`Q|C>;n-kYl;|U-V$0*L^1q2x1(Iw~RU7u^!jZfR zEzc=*I6O|qpM*4GFrHhF7KNt~j|{sH6-6inwAf!=INwIbcstBt#sY?(9bLS=2{|+Z zH^$poG|7(x@6~P@gAh>Fx=ieVZmPs2X}UvA4t+;_mY$qoLiT*zx?5H}i)c>DOx7Um zNH0SHE{lTS28%z8EK|Qv#nK_Ul*R&e1CgCv%oJoF30FM-#6Rj);kz&UsC(q=pul%qS4c1Xl3hZ4nc_)!!19Nf z)7#AF+DOdSPa!*j6n7|!-imp#o&%WeK`Vh`Vlx|3VK@^j0>CAOnqpBEpM)bx7q7k6 zfK{ZSh1K_*!SDMkMlPs_a3Plm+X}3W;}AW%Y&viml*$eM#+&i1c}B^^Lz%%qs}!9Z zcLk|+Z0|ve>wUQOQooQ}nG*u$F?8Lz10 z1?dh+iN+d|CivJJih4$gUl}Y+Tp+KNP9vwR_P02TSiI~k5;b-|o{}S{NJe*(A zti_vD{U_wk3QNi&6cTgCN=SxX;y6QIC*$=1$8$Uh%+lp0=x6IVb;4=bL+mDId&B-73CN61 z?xg{7tjc!|h;=l` z$x>eBw+rNgjd*4i&9o(}4?;!4xU^ICHL33iv1_B+6PF%t8Fa*S+D@_(LHJ<#ArnhW zN4=UjNMpHtZ+i#EyeH1Qu3c;swbu%{AZ_pi^sSNC8Bh()2BcX=$(3>Nyk?WiU*A@9 zFz5}VxLi~)kUGN3I;mDA@bQHx@o?X!LG6mM>hLk0ZlNn`BU#4LFd z?x4Df^OCYyhL7>I_Ay%rX&8M0R0D`?)tXA0cyUJU2Q@VQKzFO&qo&&zlxL(bvg~*T z6SLfAr0mc2Ja2>6&d2(FkG}YQf7W^4O74n%N}){G6?oFVR*#wp*k{B(&uuvftMdr3 z9Aco2S@FMAxAMZqVsi{-otO;q`)+liHtDI=RMb|-N7`6IIC8*cy zq}}BkE(j&|CUV)qAv`M=@5Ir6d>foa*p5 zObed6cFJ+bPB|Jn-@uKW67eMPzHfz4}lc-Mg|uJNd(rcB&soGl&cW@$r<=(EO9J^yA+1pvB{>z^lOkmR*&=gjbl4P%TXm&t0+M$x*?Z^Gh#I zrZdx-V2*ZJTFxOEmJDfn0YW=9?Z^bV%)r5&IME;sT{wKgPsB-53EmvB2yxHDVa z&=T4Rs$F4~RC;jzf$29n_c-Vk0=q(?vhnc^WzfQHJGGG411A}j7h_dmGl7ps@s*@X zK|OC48}nDLOH@=Bz^Z+ZbF{B43NoM8yfHTTY%UQD;*QFCc<&b0ctY}O z!i+jLbkMEz2w2*Q=oe!AROO*U!$C~d+F!%6yZo8_;sA^#D+#l-b(ALjMEC4OpqC}t#s$@c8 zh{gQta0x4EmE<*Sp9vXvoOv+Ah8-&YByJ%BV_YDmQ96f=@XQ+bi`U4$X1z5 zGDy5j_e*tJgl59!@7nzi%?r}bd ziR#I*enDj;X_=kDDL-%RWA{3sl1;K=@Z!#{(R`6grDi6Pxf3dbjT1Z^NZmeMlxViy zK?`v#L2x>JF@*6O!AW@N#TXhJs!|u0woz0>rBU&Ud7Gk-Tn8H~Z z$Atvpv_}a}qw>oRow5uLIqq(1{SSXlv=Mvy&zrr5R{G9O^e{OF*}iaO@NI6eSQf{vo^IUc>QZ67H=ynHQz1xc=Mv^G+5)KsFVH-)5 zGTDMF+a5g1G~_$LE5gHF^s`f!ym|Em;nV08*Fj9-6`yiQc&{_W3mRm|D4KsW0-PQ1 z+D081a${R0u-}T>twq)bst%qDMZHF{_M#+_3rJd>{gq@yu0hrNjO=_tUY4+3c~>2D zVSR+RqN_RAHn?BM_e+H_UtRc*NZ1N`7dh&=ty80S3lIpy1zz0&fif)Z4)GMhF(=SE z{cNChx?S-{9eIlMa2RntnmZBd72_WGEArz#MR%UifGuh8)$paQ9T>TiqqlEejxZlw z%}9fDpHU~P`hagW9xRn3qfZ|0i>j&aj*=Cdn)w$Q%FMCd^XFS`eOSe*<{KBuu0w63 zyg9_W+c9P-9^Kt8f`!c%_bXzpw~Scpxf5&MvgzecByze}&?~(zdL^k=4@DIk=Q}q{ zRFpVLyorlgZUyKzSOMBQl*3w7dE9lyswv0++MBV!ZmCwr)+Qgmq5{m9$Ps+hm=x6? zt_7%k#*rgs@{_t!@?H;Ss}H+?9Kh~Jc_JZq_u5^YgQ!(kKIO6?40jKPyT~pT=vOCy{6;ia- z@-x7!#zp0ATu{^oTQf;NCSDrNe@2b^0!2Iy2G`e@vp;NazkmP!tDWA~eMzrY1_Yqc zy4*Vsku~@I_uK6N)plpQwQbcc0B?g3uzzes(Uk()qzv{d<3qGp$LAa0|E;xo!sgUK zx`^%XZL6MdN*y63(b?t!WwsltHs#~)LC*WEOfhs;VIF`1h0}Tid+|;IP=y`r-30(l zSPU)7IV@kK+>Ubp^!nTaFcKLAFJXiF1g~TQjudY}Q;nXjn=8=m_j~zM;f(?*<|*EW zm+p0MGBbCSyjV}3PXCF1{OI>EX8LJMWmiV-?M?+a)69Z7`EMdt09#q|C2q!j}_J_-Y7Oji%o%|A>S9nhJEqo=pTlO z@oe+OrHDLgiV^M#%!=#vH8Fz1xsmWA+qNqpjJwR2sf!PCP_-98ch=a+#6nasX%iKo z=QrYm=15Oy?VQzqI3zFlqVu|8pSz*Ar*if1$D-K%7FK&g63K7G9%*eov40=gza9Hm zr4?FRJ@8uvk~H~7)~n>_l-R>RC50RwSfJvb{o5GE*&d=jOt1gGp~vq1K6=;?Q9^%m z4T1e4{_z?A>dcH#WHu5?dF||^=+NrR6`-HBb-uT=DT`cBg3B9DRaAXLh--1Yz8n*F z;^wa$Z)`oXndsk#h9hHfFv}fQ%lv)&Z{@bhk7Am(up}wCvKu1>b|INkzwHKt%)7}o z1~a1yt*sYdwY#7`Z-5z(esA@@!lQ5Pc=NW82o|;NHw_O}>_eR@&9|B=&9@wmF5(LZ z;e}L}%lzmVUttZ)VDI6gyh9zuii5Ym6o{!d8*^rEK9P_qmA(y}gKQWD#&fxq z$Dl!Jew~1bEaDeV;H3wRlB&&B3sOkR=PGGTxDov$AAZ}2sR$Y==%p*OE@x;Cf@X_e zqN(zQ&*8DnjcaK2Se@H@q(vKrCQqQC&mLM84!tt$xgTOAW?0hi5Afqx5!y}^Cp{}y zyQQpLVV$UGL((|Z042`cW9N=g<|-+CUk+)8S)CeY6-F&%vedi_#^ z;_ohiQv~UHDs%tHVi|N^$EUN?V-mufwP3tc2a3`sK zXIgi&I9vc7D%yi%MU_s>d(iK|Yh9`yumU!^Xr@$wLY1=gc9+7~`YY7y2E3D{g5dRj zczu^i?Fb9Gz=q)OAHa=RL-TjE1!{9FW~47+dcZu{@LP~kTOJ+V@Zje+=a;klDsVBL zoL=8&aeS%Ej=DprsF*dw^0}SR=ggB=MzIyTtG7ZQjt`5s10;GV*5$$YiYOBt$)Stg zR`7t)1JOg>SWXW!w8T1uvkkrr`DbEfNc9Mg5g z=m#kvPs8Odl=pskXBeqhAZUY(pj}KugKl_vu+tTC4RL|cP%5769tZ_DLsH6OWqWI^ zEIQ3zbf|gC_qu3|AJ}A%2}jh~*;SGCNdCGgy#J)&CNxO4@4{?SaMuc{_SN4gUds*7(5>vWH-sSfZPaUZzNSlM zWwuV(l3^utIwR~D#3gRS4Tg6*U0dxAo1(Vbgq5^mh0De6uU>2%+K>nW#GD>TFOHl~ z^cSw<0r3NG-4VadGRGqi0QbTh-$8*w41e1;x}b-BN?koY#xaQe11pylWg#53d?zxX zSW??8VrSl3DO!PrEtlirYW z4ek**Fp7pH9W!xNNHtwwkG5*c*Ex*A8tcJAc4HBD;{-T8D^8%>8ra4g+A^VlshCz# zHsedVYkVmU3%*n@7+=Z@Yt!Mb6!w_=IK(Qr_Apq(MVhUKucU(CbZi`>fjlAPOXNVh zg6KzSd>hyXVax*ZP@TieoN1j|#IU>U#|x)A1qpB1Px&XX%vl|!;u8Tu+|8=(ycFMh zG`%3<$dyY2ovl9_>bIfGCvYO6jqzQ)>z*<*YW%#P{b)=XHx;Bp5z2rrxz^qp@*bi~ zisbXbOpl2|XX;>(I>TTR;O`6Vm)(~_c7C;xQuWt1eK0gMtnMBasK zFKD%EW>qe1y!XF!dlHEyBd>MbORv)vEpjkb_d8C6@Tmv13G zs%S3NWRAVsXqy&9+D91yv7itWRshkVkym=)}r3OH@i(Sf+2`P$QAR6Z;c>j+hp6HANQW`=&DBzcK%dlhg2 zkHBapCvxdEU}th{&d}YEj@n@MH}UQM69IG>F|^|+ZFgr5Eio#i<0wzs(L7qRG_Gch zo2m;Z-jCY1zl6in1UCu6M@CaP*~D?_ggY?r${#0AUFxa>CMbPCo+~?8E{YF`lF$qB zsp#jc1QEL@Iu$(vf^Q^Z3kdVX*1K@02>N>G@{~MrGT|fId5LMVBTPj$l zN*6VK4P#?x5EE~F0ONZ+e(eV$F38F~HSt3VNkSjth3}Nhod+?UJ7g;0vu}m0uNMj- zp}p_oh1!9zBReQuca%v-t`v{RDPlIC@yR_Bm05lQ$}K2!e>lkX3w0ID+4ZS>%=FvP z2rUuLW}y;--8R7V+!92Ir)Z!nIlqRF)DB`z0TF|ApFaQ8i-*sD-)8OgwP)k^>e2LN z$^TQMf(=nvI3(9ch1xwv=v~BMXFJ}Qv=?b)rm%_{0j(QaGY|7XokIee^T|I=gJEk* z9MIk#3S@1>eYrNpbX(r=;Ah;WW|Nz92e3viI^;VUb%GOE#Q6*mmOIh6Y(*Rq60d>x zLUjEz4kj=Y&d}q%>+oss90W{3cQGeRvIhnzR?EH6Zq+tJwn}j?V3)iP-{~`4NQ~8~ zD`CV2c@IM%F1z*uAiZug5n#U?zobHJQN{2o!;I%n~e#0s{6n=$J$|QbXtM) zEBUxS$}SNZ9h&X-y>?Dfvy-!puMveXb_R8V+KfbXeLhHJsX*nK5wWNZEgnP-g0RTN zA3~ifEK)3wi9h@`@rS25wy+6<_``z?&6=?&fk1>GIh;l~P-P%^c~;mq({V8?bp0Z- zZ5FAe6l#1Y+pfG~)ma@Qgi-l+5kZoh)(|lsrBTlKD3^+A***%jTCU}Df5-HhHR`d{ zqO1_1%A$Pu^W}JR`}ym?A6%brY(GP(-rCsyc5*el-W-i~HnyK2*j%4NTl!rO6yNyw zf8T(i86TZ*^sU%cA3b{;?z)fPdIyZ{vm<+WnTdHv56}J9=1|wY_U4Fab9oQ7TfE%I z!~o@MbHTRh_WB#BfZAPn;XVSO3;~<{K4h(rb`>4-W*hA-cjW2GCx+aR12Dy4HruiV z_7P&??fC$Q40KyVa8D> zJDWYF&+PLb=F8S5+*^w5j{+6qfei`9`5;lqKUBSsy}o}1ODkV?B0lj z4Yxlo;KsB+diDkB|0%P>qyv0gDq>9r>5;e?FoT2k2Fu9U^$#<_B#S_*a24t7(|CHVBtHP!w%jA15VSSw3?D^hni(l6mX%=n4jSQoEtFqp*;Qv zxGfHa31vX+;==d=;L=*3pw*5%u0Yi`Ig@})hgz%4W|6lvSDH%(tnC5>AOa=MJHw6Nv8QhcHUf{jEvHg(GV*Z=)ib%@Kjcw#-%!Fhr;g)@B zWBaMnTwq(+{9f`su@E?=F}J8YMmvAw%hVYHc;Te=uzNvTnHhkHoCrLT6aOo$rp9BS)(WBcId^|evGCzFdGH?|*4uW+?8=vsf<{%(7J`{DPd zl>xe!DDyVIS7e?LRav~j3rM7yMTaD4p_B`+?b_rYY;HfE9!@v6A8jf&TwVkB`(J5( zeI9KfcLNdP8zKgq5rqp?%Ahs46M)16^v-zoG=p^WIze^6o5Q7vy(74G5F@_drGRU+OJ`}PN<-6=tPC=$hEH)6Ka0cHw zu?F}(v>WFvV%IRAtei~Ub{Cdw*u^@~vjY~c8}ip>JEAQG_glyu%^)qCERmHsS&ufq zcQOa1{L5ee3)+33V~ADQ;rzcKZ*HI}Q2iy15c@abC9FVX*2qa={M4tV)$mIdfX%cT zwhB5~&}vQtyY=C;+G%s5y?01aWS+npz^p<)g_b&OU=kI5xHcLZUmjOLi*5517F(*z z#>LJ@G1my|d*fo;T*gm*)M9gH!)lhh6EwVd&S&LmRwZi3oPEmWZIE9^6cXSvVfOi8?q?NGJ#@j?%DI;BHv_6i`p_?&P z%Lx)pXSK|Rqj{r61PSS#cM zG{UXX0${Qu-YR7*1W#Y01P*C^+Bq{JwL$f%+ipWQajq-F!8cW(YTlD9PJK^WI+Bk$ z4p4*mUJNoE3J3j;$AUeM)Am^$3#e=A^R)gBC=aT1EXaEYy+S+|`eN?e!?n)^o3p!_ zqzF>G4@ycO$#qGYXs~jTW3#(v7WXMI~`%m&rDx^k^#@ z5mb$dq?5Oj(yeOsiFacT;DX&a&zvzz+n^uJoSF2J?Y{YQ`h#)Zxb(;X#pCCe3=pc# zY5@$bGG1m8lP*2zl2!|dyp*O@tJ^O2N)8CsWYv4~`dWhMQVKI(?qjGe2yN6BwQo*k z?e^UekR{AF&eKZ?NUjMp0PhB(F5baP*E<-rpsG^LiwEO3&I&|dH-nUG!aA9@!ZKe+ zxP*bWkShqAbn4Y=&$U`W*`$E4TCIhFnfUiH>RhW%76-WiIqjG(Btzq+J_ zT9*3v4oIVPoSKrA8>b`l!i~%jliCJ*hUoo6N00v!XQox&s83L7Y#MR2#?Gk@J z^w{_aa*`_<3zq%1xKtNgaNIUS7%=IRif(X4M;qGQDFQ!SjZ$yRbDJ*l6A zMXN>h#FjfQ%K{u+Xb@VBf;mi$C`hoFBTy#OTMEHjqaeWi4%1#vAZ+f8D7iXh(N2_w zu{Ps*t3}*^!TG7?PNt&@rUi4SBc#~AGJo2wHMzaH?JEO^s7sKw{AV2FZ8wS5qOzvU zZCh{>O{MH%gHf{>LHwCwAbz^PTOGGD^;Q$Z68lW8*d9JHaUcs2JtwxSa9j4}3XJCU z!8AO#K7m31@bz)-Hmy&7hTL|2N+Q-K`q7No9E5D6HcE3P6xR8O6}yooG9rdI((x&# z+85ax)!A#Gt*}OmwxR6u)s)`F8WlX&f;9@_QAK}b-~YHhgabgnhwNuWz1yzQiamrq zT>cH~?4bww`s8S%J>-V;?OWYscClI*sZwXGxbBpFVkK&N@7T;Qadd=j+BW#x3A z1acjj4SRqOq?|~)c-P8nX~3S`8R@;?=CCaz^0-G{_r4TD=98ospd} zz#L#MbuHx_kYk(D!{1^DW~qhp1Yvn{u=&JbKTO~Jphz|HJ$ve_v{@Is8Lb{t;Ort% zQAJ33FWj1_-0_eMpFVVzdSov_f+D3g3F~kjAZ?M9hPbIye?U5`H3{WfV^W@~v=TUI z)pzCE^gXTw>5cFpH?51i_0MkKo>I z@^;~$HkVcNPBUC7tJXnN2pOKI#Q6&WJY873h$D#p<(tjvAiqZyT)bZdZ;(xhikf8x z$Q0|O7=kQHh2+c@gHMQ23PO?NJK?pSw}42J7~s+#5W-?H3B8bDV|k!K7Q4~yk^4}- z#Ca{O2h-{GLlcPqQatsz$K!@TOgaXF4g)tYY4PVngI70-Y z1u&#YhPil!-WKKCFI5^raSmf*mp%6-zm|m~11H#2^LJc~Bh*L~-W|>CKiVXmLavkm8_^xy7P{5~AU_pCMY8)KA~C%DQ=Tb)@Xf z*A(-#2y+Xz<3U2eRZ*Z_otmhGix1oKs{hM|Bn|dqkN6})5{6y*Qxpe`HADGVl%_}1 zQH6d-gd%HAi*0ISyPkrU7K_R3l5`>lzxw1VJDMeRtj93Hu6U(Yo6@j26k8>nh))tb zWP>QiZ6npB`K2(F%gMCR(arACM?04Rqk^q1TFs!Ul=#7YZkG$19wYNsyj`n-IzxC?r zw+eLP8xQ~J&+h4u3d8!(R~NINsWGmI@q5G*#a!T|#8CE?BKwzmt}@&haS+R13{m_e zN35-7OkmF>>st!eCXbeVm+TiF4tdWU*Hggi0kq_L{Pt%}d3}vV3*z@wiU7%(Xo~7{ zVbudEXf=|8DwI5tf(84$2~!CRA+1r^h20pc2JS?1KnSGvzFeYx#0qw@%wHP*;>=&j z!AdX?4yusri+sEHDfK$OfAi+-{`ll(`~N!;erz|*O&iMP!2`Adj2x9%+f|N9c+eW! z*7MWkh!*xIo)JuP2n1Jdl=jY0X-Y^1?AIihKPQ(<+XBxicqd|`ca-RW8QI!n5Gsyn znd^A&eGDvtp5A*rIeSeOF|8j7ev~FbcVjP4EK33pnm+wq_{5V5sq`FYKt~18aQU0X4;NNSUB-&2C7faWOqn1g#)O(`$rhdPF^QVS@T`5`z9B&I`_DZQbUnlRTRtnXjEQ0Rx-pL(M7kT4Qa}Nf zFaRl$76c?!QU#Gz6lsBX?R`iezt8*qjeEx(<9)~d2hLi1@0D}SIoDike&zv1V+Vx; za_d0(gL47kI@A{ssqO&UK|S8@Ex0HKwFjsdd_cp6dwT$%iie#Q_TB>m3L2@yZknv% z!#@b_U(sAp!VbC(1NNYBO)wS@5Nx~u590UmphyYa&;tSwbOIo$NT8<83mP!+SQd~6 z^cYsD;MYL#To6@ghgQKGyH8|{?Cgx3K@>uO`G=aJLv(ad&jL#g@@G2ON(gxa6c0kn zqkcdxv;ScX?O&}NcGzI_vV3p9Q z9Z(;4%3|Y&dWFJ8WZO}PKoU?2N(TRfpg4iMILGetfmJ53uKp_$`V)EOz#`vWn-K0I zA5hTuXow9!a-tXrA8@M%^S=)R1;R<7p76qC1X>J}5r}#KlM#4~Vnw_FYh#~C09mu{ zaIoEyp%+lNXn&!g1C4|nogh2;p+<_?L#zh`v4erOAgFFA1ydB%B8Z}(3~6OmdI+XY zRZMA*F+n>Vln@4_1I|c*lOz~fRNr^$4d~gBN`}H^0l`SY2%xZK!K?wbd55MzJ^zuW zpbqTT1o&5h;8lC8<4SJj9@@n=qD_S|3*_F%=Vvb=}(lG11o5crhwZJ@P|c>D?}2&o%WzY z4fa<6QD+w}4|=%234|Ug?tB8YAR}uddwU?){z4}QDh6?Ffl&_7$-#;>Q0N{|@j$EM zU}Hxi4nXq>u^K2t!OGYf4%-F21fyGk|9e21;P(zC{0Ghhxl8fxuAP0(!wZ4WKzswP zn4K4FHf%xUR#c9pr@aw?`-8*{cz!_2pfYx213@TKs2tD)H%L^0w z6uDg-PVmJZKpmvF?&HBiikz6K`);IXNUhsNACz$0iG{iw8%@^51w?Cv7X~Ykv;V|9 zJG37JnuI9?cg_Bg01NHkDUKa* zCde7>K;gScf1ns3#8|*7ELP=F>d^KeCQWL#9OFzz}08I1i6qy9pS z7l5k%2g(C3(_l7sdIgsRN(C5~C?Fy53q(K$fn`v6`%?rzfax0)k9rIM6cxnO;5Q+1 zN391`-w$bC2j~leJ%kjULyZ7)#|DL$277#V)Ni01?j!NTHSfjlfXjzY?GGrR`@Cys z;<&&SKX5z*Pu#9G)&gKAxfuhyxgFBQ+{)I<(Gg&EBOP6gK_np#B)};!L)wA;yqPo7 z)B&uqzw`q*$b*sF-9Y>)Mj_pw7u;PwtctP!iNkV0MD6lC2%ZxV#Xg-u!r~yAL21&BMQmx&x)N1Lt9AcY3IF6zc(o45$i7 z#Retru4On6MG7EypBF%{?kPIp$-evo4^Vs@CJUGaK@ETw4T>623zQuk%<=%LfJX#1 zEnpHHcXxH{C^`e^0DoJC2MYwm1HhO89>;<5b|z|vF4zyz#V%2Ra3=PkufRm}Ul0SB zbV%<8FGG6JVParK87MgD0NMhi3c+38o&CM(1TcIMYAxJd07LQzvHaa)$^KuM#sNSQ z7{{I6F-luvr@IWSJFYNrFcdIs&*}{#-_Zd`VblWvnRh^m0y{q|upZ4I?0BHsz_J#4 z9kLQY87LHL5N{12>wyi||5l{}+f;znfjHDURbX5J0Ol5`5&;)>v^Ddva)qMgfSOPW z6sY>oSPbw*h(n|U*ev8829G5Sp1%uT3}V!} zICK>Nf(1bl2|&_3#3T;W$etGSUs$z)=>-hfA4t?dSOGeLB1<_qI)bi3;B7GdfP5J@ z7Z(7{4WKRnI6M3dC4Hc86x{4wOrcj3oqO3ZqGDzzN8&?-VRgjF` zXE7+t5$wNM!+_0=Sz7Iozln(j*ZO@9i^ZwoKTtS^gG6S@LL{5 zn--RT5aCJ!{N|vO`WwvwuTg+s16V1%)4ja+%6^>Y+AB%Ble_$3X|*6M(nwP^b38QNdmO8wxP= z){c6NdS^$6_~+OjI=Dy43=?25hxiBTd>H!8v4a{6ejGTOM7_1kF`>8q1zGyQaDz8t zVE98-!>kQhabQ5pKUo_PjqvUaY88sRp%5-nfU4kt=rE%~Q4Ke+m_X1ju!#GE^Fan9 zc0M4Rz<)?d{{usn1CplT5g5eQcWGT`dL4hkF+!=wy7g|~I!{~pvO7?giUyWFdq zodZ+}mN@sps=;kvH)od}yh~0XK|O69+;@O>L34H@P3N zfpf`2Rqb@=pl%Eb+##GpQwP3=+%Uj>DG>N)N4MP6)+C3egwAiDG3o|cu)cJF8aLb~YdhIbewjH+hG0 z*>~-qP-qOGRPJO$hn2f;06WS*#sKU!0ea=mAncL#U+nPz;L#BN9v?8X!K+Oirf4uU zcEE@R)dyjB9|T?(w+7)lT%mD;Ck%$fhQ0ys9oT04WlRAZ*{d3gO$A``VCcWSs(0ae zp<$KWh35rJ1sVkS`UTkH9g&Tx7qzqd`$Yd^_XgqfaDaz(u9&|+=tZGy)D&P@_(XeL`f?tMLH!Q^dw$ApO3KU4#8h@xph=_qS zw%VxzGO0ri00{D^p6*C?5E&aF1nji-UxtGNSXO`~;c%}21R&rJK*xhC(5y|m4`}FRz+@&f=-a;skFjc|(exP9NYBazQ&rauN z2SVDR<`r%qFbqQ@0bT=-q06GEuK#Jkfi$e$%GiO^4=dQ)AFAvivj7O84JhLS2dbk4iOki2(3lRCg_`;8PNAaE=cM2^@2SjXAhL3@)KS zoEsz$G!cGiVhJSwf3gDYbrw_sSk;I>5>R{Q3U+MO6SBuR-=cJ19U9 zCy0%?cY#^$faKXbJ(mWc%dYSRallU?G-FUVU?qR3JE&y~K=1#<#V5#H820o#q|W?t ze$NG;nV_~~2XN>iH3nt~K-%)anDqY$X|Zc@_`9*`5I`Bq*aS@XfDi9N&_k*hu=(yL zfhA=3C%}{gk!=4AhfaM#MU7bu_+pqr&UVb8Z~O=eAf44AUv8jN0|gbAnp)k;)z)n9 z0WP&Bq^kiH^uQ|;0P7wSV3Oc=Ek8oh!5$&!W(#oY0UkX+8xKE#JpgNm50nMJ=-|wc zfbJrjA{1E=a^Ni51(#aF!O;`Mg|u`9747~+(3#K!&ul&(CiruN7%B{jJ>sA_5TWJ( zB96Iw9x8%P@W3TkaEXn@!P!EXo(Tc%xe&nl+05D9%oG887%CarneBF(1%N83TUxoG zp6qP2%@801geilf;+i7dzyfhb0LF_@lT|<{1CM>w%L=F$m=HUo11zd+d&TX14HaZ% z4}T0o+5)06viAhc1p&_F%@E4c3M{T3u1p9(vCxaqZC=ovz1sk&wi_X&#jYTXz$oo> z(8a_VsOv5)AYKI2NhDMZ7-uPaQ^35SAT%zxP&Xy5oWc1wh^vI$onIS!hwJva3C%#i9o#svT*nFEC2>N*g3NDfO{=wP6#s(6H6Fe9rhrC9Fvp z4zkV6QE5N|;4&%zOb0}YIuY3abq!FXse`?(=l<*PEF-m)6{N*3Gwu$-USZ-8_PRHy z6&ORnmL2HN+yIuu_i!;P;PA&4ZU*aqxw7`=4hTL}Yr!z>wiw>dfK@=Zvx?{uhsy%? z5kM~ppu_J_JpwY_m_Qr-|C-?8PyR;du({xWOX`0%NgAkc@F>yk49`Da05`B~J$GJ# zIUZODiVk2o*#G&e7VLn70J~39C>GTpotFiX%B)Pp>@5J*gP6j=Arv*9RxZ+39%iO0 zRsdlErV&)O2DIWJ3xW!WYy~kH@DX4r@Z{}11FP1=1~3u;s*idET+IHcR?6PQ0Sc1| zMYljeF*-eAzYTDk8B9G`m!@VOFfk*LEC5~~6psKwx_uEq;^0Cv3pNP=107_cQrrln z_dnth5h?L$>u>k=5{S*fRDZ8KIL?Gq%Q=mTi{S>HAVLt`xQ`}GS zB0x}*-If8|Fr>-LKK1<+s83@*1?tn>Pl5Wh_EO-I9MWh%1!_0m zPl3Lh?4>}IBP0}r&3-Qj?ASpLxaPW-1I;DU^gt4fkl9`mOcfGEOuPL9N)FNtm>g{P z-T_M%3Am80k=cCzu9al9z8R8oT<&FA_ZqF7?(wp@6{5#AgogbC zjp8S{{Q80~C@g&i@74L#>b;u^;+x~cp8}0audRI9LrWEZ-Z`N%HVLJ;M zJl6COw91HLH&tO-FEDLT3G;b>;<4k20Jr0tqUct3z5~aHZ!l?Wvs8&>KcL_vKT23V z!spj=rwWfS>Ou`KXEu-4iMmkcV5ZKe@r5DZ*s-fZigYlgweQ})3)<*!XJY z9<}>-O;$)SqHC4WB#0b*&R?P)IT6PenkDN)rKYkk+>pVcjBB|qMewW7ha`RQ|Xo@;oTrI`^Sb)QuVlZmL> zfAjMx(zz=24`~E9-hBOaNhvMRsOIh&?PEn<$s;VxuOfd-O`ewHpE2>sD4Xs~{_0_Q zq&QdU3pdqB3aBjc+I_^q-}A|eEqnyUvp9N zc_f4PXQC`7DN}l;*O!j}3@jsj`NJK}%96CVw_~+Uw4O8?@#!o18^hrzN3w6sc+#U0 zFL&Oy_z)JJ^u2{#*VcaJ$A{ko?p2u2juoy3pud}b6W0EiwUzy7;?~Nf1&&N;r<_2)d7 zd)a9ECTKUkDz|if*D`Io&0aL;3OBT6K3#ir0bLMxQB;Fx{KduF#^2rh#B*?{?_?3P zCptL=V;IDIiZMNBG3xs)HI^{}!`c3WN@4NvX1xY)N2L_m;D(cK-+gI6CWps3>>P{f zv8Vgby%)LEuZu3BFUFVkpwihgf59V!>xcIV1lRV{BH;ugiH@j*%bA;`cPOG=r^p}u z7SDHcb#usmhh#bHSpH~LsCt7i6-TrBbMea6V7Ulw%efHl1V=;n0i=THVAWfLo8Rn> zG?vIX!oNhnaN$#3!d9Y9GE2}|VA<5Se?Z9nmeR|8M4hU9&@YC3=^g3Fup!}M=Z`b! zg`1_LQN7Q31&;)ty&U^4#FMM#)z3;X(JztGw0CKJhD+?vmG!2+Byws_qc}TiKf%4- zq&h}$@4Lv-oV|?Tj}>9EXZ*@+bD^5Yrv3e@_;Q&w2AJnbX9>Kbs|ey2^fqbkFipSm zHleI)bZ*1C(NWnGaCtC(CaSZKPszft%gy(_XM9khR%>R7$89mq?!np%3`g+WSo10o zZpSH2eddqjtUq`wd)K5?h1KqXkMfo^t!+fN0B^KU%IPaXa~_WOroP;xi=)QTRgf|p zh}$eq4{^Y@R|5+TkgW%F5ihaxZ)e zk{hj{9SwY7N*t>2@IK8sO{}O#XsOlD)SrlC>C?YWj&hzGM5Dh+M=ZDTy;dOp$(sF< z8N@HsI2%%Lm-1!lBE89-NcJ`bUt4-V}{}A~_dMB-R9J>_%h3-5DKr?xHFp<`d9bV`89&*6XsW^~97E64zv8^rUwAui z;I8hlbKQ16fh#LTY#KlF+?wVQ)gHoy`VME}&d&|_>!e@tN0F24Ld~G`b{2gHthG z_w@V7OAit|&pYRTR6M8SafxiHwZ_>Sk6r(Xde?h4Y8QiO6()^HKQN!PrzxXpk=qfB<{MIcQOKL5*vb^#chtE`luDUhl5lc+sSqEzB2Daj!&exXC z2!@#pv?*0zJ%)$6vkA^{`OJO9!kR-PIOlB>y%G9W7t>V(XZg(QUX#r%;xsSG6ST`u z`#ur->AfwyeZ`hW_NqoPdE{5F%`wIgRl2fLVvX04K_M?R6k_My@n6Kfbll>t426T<)6a6&tGe>(A}{UTImX zvlg6i@zKMr=clGF+sAOM4?UewL1AE=|cOmy~26wLD0nW99k# zFpjC2r#iwCWb9<*YUUX|B(DOVEOWLS%~T%|>oU80w<-2kLCYCpZASK#OgmQu)9=rX zPtxw{9&gZ~u2Q2KVo2Las@AVadc66XyG0k}Sr$i0*d{+7c`z&yX-Y8VmU#HLp)QYWaO+lGcyD zk?+R(ErM6?Lhw_0u1DaY9N;4dLjQQ=X4M65`@vLDSxPPTjR)Xz`B1TxB0 z8Dple*NT5g7~;~;<9Qn>Z(Mp{E*)kr&cb*a^Sk(`_+|<5hXfH6R##^)&7QTGp6@or ztlU^3x*IYk!aMTeS*O-z;mWqEh#w+;gNl0LcTc%Lz3FdQE$1eogT^q%o2puazf}0B z`e|LLI_2A0&gxHcWIu*mNZ1IfIQ!e?>t|&xRquue>Xi)R7%!MekTaj2FeZ@d9vQqY zp1(Pzwva!8hI8_}akZNk$kQ}UI1)DD(M?^_8XrHWFV-aEtZzr1(mL z`6_k6!-(|fnYv3@DidRMeInO9ZnF>!VH<=vPkLoZoe6IweT>i1YwSKhPvmG@qjl%Y zZ;=!0%`5^m=#MTtXrAT%q)|0h^J-+ve^e7a*o0mpfEw4_r$X+j=m~5*cWkHTmHcWa zhZ~>bT->R}8HZNX&asX0%^~YLMN`bt3Ql}$c5A*yWJ18Aqf2i|)jflMwRy@hP_=q_ z=2dp_=U2iFh0drr!Fh(>Cor-RxaEL(fy|izJLs!`_sR zO4BY1Hc8K1mY6HmG$FSdW1!|Qy0DJCs}YKES}AZPx&NgOj-L!E+#G1OpHu7vf#o0-Nlu%6p+XCOt7jE~lh^%J_AI`aZwF%16*1fJ> zyndcHyycui--VCohc4sS%Xn7eT+r@|36{22`(ZTsnYay`Pya?1_0Hwyke5sz{5W}FD{D!IusOiV7M zfKmCditudeCK>a~S9r0ns)V#(-7R_XHGZbf@27Y%VSntU;<8uiKk~@!Em?em1kY(H zrC=O4j2$J4byABoU2RUrUZy}Vwi(pr7Rb$JY%9%ht=s{_;cf0ds-5ignv8Xl-brI<_s2>-OI zU6@0EdRIIBx}e(0H~GK#3~CBBhPA?vKFmC3RWvOa>S0b3{Czc`I-sR=LX5J`3~TU= z*?qRAq)=~n;};qDeZLraW3I9@y}9@E85yJ($F$bXa;{?yV6U?>(qi@*|m-PqQ9iX_Tg&b zBZ20-k#6cnnS6_H`^(?;7EC(H<3^?hoz6INqDA5>L)gRoJcdL;?>D_9-x#zjFAeBk z{~CbX;-81xE_!SAe>dMi)g1!J>ch5^Nv>Y znDoiV=L)De+Dp^f6!tA)-tf!?Y%?aca={9}+Fzx(GyKO9<|p+Al>wl{I}D~5w=TFQ zD7-X`FF%D78>@UJx16nFqh6KB3~_NDiFa{aFS7^vJcQgLGu=fBb4U%hyA1QH;eCG! zft=gUF`v#1eM@znPdk?5uc&?TNbFPj^KDM{8~v0u#h*%$WvZuptZ5i<6P{0*k&2Rc znV%JWJFm`ZCv)tMeAbz0tK2dRje*RN`;O@m1W%R>I85G2cPujXv@Q`xim+syU3NMV z?7`n9{-&S%A=jPJcJ%%xpJC>8G9UTYx~(+(Unw4idK7O>byJID%=%ug3|0T0p`%Y3 z8daU;8(a@)Hd(PQWD~Rq*(Q9VE9(~5exc)uwq;SIF;4^960M|7a0UG|BEci{iI+ng z4?`lkK5+zNBYSqy^pMe(rdmM?c@>R;Q7TIY|I0^LPxJ(;Gr3>CdM(4@!i2Z-SpiOe~|5Fq=I1 zTBvpIQBz$(ee`qx)$F`eil%tyKaG?1k zuZMCTC-2WI#XiIeRo7rWZfaN(j&{cj@;`Psr@HDk=c*4wKU9ZU4tV6 zP1pENnR*0fE7-4w2#K&r1)@ivRmURykfu)J)^Th4y|GIz&=xbfbf_n!v_D{0|B~<= zLb?7MxifK}j#eiK`0u)uA>fVct;ipVmy>y$$&Cxc~09h6V==r-^kn?sk1 zQpHqi<-@8>P&GxGMQ)7Ryw1q?b5n_{=;Fk~8WvUNQoBuB)&9)&%!AvS+P9~r^L-`p zYV3q8E>4{Js9h)iDuhL`SlhBIza;E~T)pUhLr&Isz% zJzG_=|1KLd?UqONbI`9>nx8s-@)?(0cr<#d0><2%^mt}oBS)C&Nea013Gfuho3L8g6 z&GfddlFIov{R9|CUfzjK3CFhlhQ}zzqE3dF$WO}iwdFbsdsD<4d32p??pjs!)MNOx z$3iBYqUi4@&?($xa46kikqi#Rk|hyvk;QHxndFJeDVW3OQ$A9S(ZXQ<>d}htY0I_p z9&g%f$#E6=_!h6UZ+FwD(<~0<-mW~JByCG1l&8@6D=6&rx+#m*!bhVsv2H`%o6~W* zpRc_pxqo>$O(ZE}7o`HmiyhZyL+zR%l+g7Fmz=Jbx@rG2hp#lHKvN zDNI7ks9(42=x7JPZBisO|^%9=@}XuV$Vf%wLv&oyM3+b@-5mUepG#HMZK zA^qc~#gd7k=kcmz#9VRLf`0z&;l*lCM%;{UcA%j9nOiEQG_Q+4_vu%52KA3G8q4fF zjwgIfEfO=iZdl?xkGk1-@`>rnS2gLRD>fX8SH`fH2I+ak#3f7W&$FzZiXR?WqV6E6 zvwap$SW>;%W1jsx*g)1bV?|?1?Krn{Z5s$Z5Xa{M!8j4nMs2nwFJ^G$}C?P71Vk#}AJ2hA@uo6z8`hJ~0-6Tj2U1vmY-)YC85iYo8-=d9M;p$vz6OegQ-4o50Te~M? z`b%UWeWSHj-ZQ}y24h;&GR9I~BEdDe&wgxSJ-1fV5nr?TED@3aR$5xrH^JKGeelx{ zk94zNEi`M|zs-Kl)48F3Y9iLM&+nNi?W5;P%~=;)SLb|0i$XUq-`_s^=#-;%oW+M% zwapn_^_fpDwIOtlg&sTVJM;XtTfx}4Wv;q?Wsi}7Kqo#8um5Swi43W?EtT_Cn(>9t z$1t!yExH9-s9UcjeH@S0vF{-akGRORVDhegQyyut@W}ML$6}n;qPkVVRniL&h`t|F z4I3RPjA<7uT{-!jh&CwMTv!hMvtKg$wHQ$4pD`0?l<~PE*|5PC7-<8jz*fp}n}tt(f+7 z@}Xv)v8IRlFr6_iJ@fpHs!pqx5Uog2jG*$)Ua{t|A=P`z+}0~MqCWKLbtlqJX8pLV zhT-bzZ5ZiB#3|}sKO6I_`fI7z!yh>sKhB@)bF`Qp{cS@)MjLcQ`RX7?gf&M0{CfD; zte@IVj|F%q&;;8n((JbDgNK$|d#bb3j``YuL7exlyLp~pui$uGfI#FY40QRavp>kq z--?GMGmZ%Mj}#77U_7&Ke`l1LwVidks37A6f%>YEQ0m>F>)ph$10pjscw#>rY7{QT zD2Zbfu2-Kk*)V;Lb$!)yogckp%}0-i?qU7eI2J$6ZtjNL3E?(kniLnwqh`Ce-}>WF zs^YCi;crk9H_misH|E;E7CIVjCw{SG6mKGosOp4*LauD(`*E$J8e38Y62VU(=Z+Gk z21~(vzDJfh<{HXD(Y)yQs*9aE@>G7MI#|B#_IX;V)k@>ev4wfkfzAK^=SDyJ{!BFS zl!qGO=r_Z#qP9dDti)WxiF+#s!egg*I#Y0J$%C*ZCa!5{42-+Uu-aCyXA1pQo}9d8X);e*UyZBH0fuGZ(+ zR8NiCRVD@In&IVyhBwG|R{k_*;bAWFxaIXmJn~nhT0PH`7adRaG>6p#{GxNM+r+O& zM^sl+3UC&%)~|^Q{|>GEC`vPr%$?|+-SlH}`u*k9F`cP5PfJAl)Y2c_kcj2%y|+lz zt>}W_mW{a7fPL!&6Nf;9d-8FE!mumK<(C!=*-lj^ggMx7W0Zz+5_ej?zrhs3j!|cK zZHdsSr!+mEZG(Y5w~pIyH8)$7s5vvfY+;(lsxR*`{hF;_PC;~)6fUi5zv3CKx>idG zJq>=2sKU0X_?Kc0y~K$*H_rBsEDImPA)!_@|&at$5|>hEXd?1cuWrZ4$4aXAS1P$ZNmp8Z*p z=xtw_(a}B+iZ&HM_i;3FDh11_g8>TH(v+Yfi>MNno;X|?tk z31+ylIZ>QM@X7yX+LGewmrxHk%~nF!_w6#f;?sGx)kf*5K2s3$eUjeST%L^QS+u&Z zjSn+zabGY0`Dyq(!RH@dgaIYoff1iCo?5Y~Q`P$T`F){*E5Yl5+05W^?6D6wLB6gS_)j>)Chc=W8_@oP7&Uh96YYoBt$`0YCkz$^Ss!^ zx!AWo|7Uw4PZr*%lNqbDe%`OV?U7R0OoH#(i-vAFRBgR5c^*XiFguBsqS#t{T9(Pp z&okq+>F*i`oETg;oS$ciB(*O;MV4EIrDlvoxP2~oA$!j@pxD6dRQqeccOO&H*Zr`% z8!yGi+QunQ)<_#a5IIJ9w?542IE^1h?z}6Vy?4sY=hJ;NN*Jly^nB>qv}`$ML!?!= z1ABrljMm;|Xks`#1$c_oe(Y*+CmHr8^~e;sdQy^Ae*_3kYXtPU<6JjvDC zdorS7KdhxRDn8pyAS0LM*E~PqZdx@t4W4JH7Co&M-a78Q?SmVl)j`*A*Y3>-Uxx|6<}|Q;|Ew#9|}p!YA9x`W|J!poxZZ#=VD6*08 zhI==W+%Fqo`;e;XkQqm7o6Q~XA|k-TK}=a38A%Y;{OPVqKG5XSnDi1dqx#6#||c8-G4n|`go~Sk|9dYL#CC< zNX=l~9UY5yTqg6U;d!ykjltJA9=%)6*Ei;Wm-aDBk_RuLuxXsfrsV8r%~$BQrN$@~mgJD0`D7PlCdB`XzuQDc+#MU5hdnEU3UYT-#K^{h2k zp`K*UYCm!wQRG(RBdDtVm2Ezm^WP@^w#jCYgR6ctJ;RuVD5M7X$PKn+jC?NY0O7){LD42<)OemWr^s-8^VFp=VMWBQ9o58vBvqS+}%h(2m^RZ7m>{y-o#Jg(w6={yKSLp>IuO)T~6xa+t9jM%ny_cpzb5c%kQ#id1)631gS1O{1G}J{APn?m?#8lS`i`}=zhL=ETHOt(( z3|Y!9=u|6&@sN$!BY!Boq-ArcPb>IhKPNhaZT;1$WPZboZb4YaN~4}di4kii8_|8A z(wCKrU7J+t@gI``ro5xlrsI;#8V#GYA zD1HASna&T1Et)gqjmbxA%0-_~j-FXKE_xGr=FV6Ub39F%Rgl4N`q9Gdg4XNwXWl#w z=D&0vIdQYZh?=vx+4sRMzvqG**d2!4t*5htHEumRW>S+Qvvg}NK$CE*7^jxOro|WM zV##Q@Q)?y9f?l{$&Maot=MOqdIB3|MA%d+v&dd@_J*CAq56dG`ES7_riiKlXPrPEL zFPX<|&!Hi?Ni$AuCG!~nR-z)qGsjf-5|Ud6o9on}$VxG^HL zwMbc@8;pMLyWZMyD#3B77X!mTH_^`O5L)0HiTNkK2-539Uw+$o%jpW5rhRF!EX@m% zY~(kp&hNEW*uq732yKsCY&v1qzja5G#XJ3%k8e;Bqg8}C{=GAZ6I9Nc>Kn)MC539s z+R-Tq8E@k{26h!-v(Fwi%2nz7-g5se`}}HXy?-RjgEoIE_o>3t=wsp+Z{)f>#&$@q zPZ&XY+x_y~7_IKSaYDgN4JO}D_PZiWY8rQ#$c*2*4R}$>>?N2D<(YO4d-@@hZ5?uif(#^!@!RKf-!QbOB(%!nCk_nva5aW!jFWt=x#Zqvt{W{T z!>dcFLDqg!8^iR6$-sGnD}7Uh&scv(RQEBdxR>K|#S)6Qju~l;GUB$Jz`C3rf4PZK zE^u)Z*MS7rfSE?H^rXFw_LzhA!WTZjs0gAKku~B?;~&I{XS8eZgM4Qmzw_-?X1JiL z{(vamk^kvDdlv@x#0k0>ljWtG?gSdLSN&)^9Q&uNW3^V6rfF#|hFl|N_mFM;R6e57 zzJ@QFxTfl={7RnRMdS`|kske~XJH`q^k%uqjn!N&easUglXB>S&R*&>c>WK>qb!X3 z?udjll3+c!`))LU*hToJQ}buMr~E&8Ffd6FM!}ilsT1Ao^&ZWIXV#rI_+*5A1CH6* z>v|=B{^=t*A7JcL>GXX?rL4)RR;fJ9As}2npD4&l=p}Y1jGES9sBTz))T<7O8R)g7@;J?I&I21&C*WrPUlbe0ltpRvvgXlxMse}Fw zAdCdZKR`IB|LX6cDEoJJ2PpslQf~*SYkS@aup7kxtp)s>eM7YD8maF_q^bO3(Iz|{f9kAkp5z>ojh*8waQ_$u!IDb5ZsrT^)HaM0HQ zdf^|>|37tgfE{7}@MriR`8pttT!43yD?E|VO#i>``vBeA2Obj+*DW0!Yz|#T2M7yD z3vgc>xaaQO<>m(Wz5%|*{ylTxOM|pUIV!;~{Xf3nEr|6!byb_4xieQE+qFrm$KX@E zT1NVye4+G*MmA}E>z7L6POF)t?-so$o>D&Z#qEUPkXr@Lr*~IDlV) zc2_G|{5<~y=O#3ja}lTNa70Wkn$)QAeQ2LFyid4Jb2?v|M=q#ZskW{pKV5;Cf=_eq zv#RS0<5u-AT)#+Zvp(C!1dc~u4NFnFeNkSpb`3ZFdhw}`Ep4sC1dZojMFhyX-~6&b z73@kNCD2MC$$6|;bNC+K@2m&zv$qMojV}|4&YCto9HUQOeWLW!a^mOgwF`8Kbv%}a ziRO`Pb6#ub2poq`i>Eqg=S+s14rPW=VwSfEC#<+=Hl$g})Q>*?e9lHLBuL(Ku&<%} z<8L?l6j{Bl=38`3it$2Qk0$1PpHtUFxtj-LRMM6t6HG`k5~tJ8_?idaYo@Zz7+$6e z>eFJ^<4v`!Ru{fM%y+BOUz>n~zr_ZDkw#c2keiX-f! z2qV2dJ{|VCoqKovI~(%#Gn2H^NC~g&cAu7giakDEQ)sbs$n$;dRc*&L|M49`bfg16 zf-1D}cD8*`XSZ1J^x2AaZ@yYjYOk zHbM#4@tGG^p~@Kn&7PMQ+%5N-j$;UaVA}p6T$!TmFUM&o#`g~uVN8@| z+^PR)^mE!lSK386j{a6+F7vJ-(K))e}Qduygi81K>XcHbo@E3=TF$%939dnH_{)5Vb*#Gx0%0_dAhDgc}-nv`IYr;)zDJp2z_{7mEP?x!!A$j2}Y z4+t=Nb)7k;9a&81b1kyEoV_ZPM(+4UEl@~3EmM9kjyufz$3&X~U_ z6I`&C{~g^+Wm93hJW6fw%Z}>WsWiTE=ElJ6FC;cb3hjPphu2coyHwb`-v$t!J#C*I z7TupIJ?L$$Uh}5f{Alp!`RvEuVG2F7G@*5MxNX`QeB*8RKd!HQdp;&C5-kGJ9G=>GEfjz zyl!9j%=Q0p$&u(NRhmX8h0%TgC;k~+SJ-tq_(?O$$y)_=E_Zvgt!|rW%952}a?=?& zD_&d;a}6@}_YWK?RGJNDzh+`(^l6!Maa-v7xen*FDtFJJVoQC7S2FS+N`0>Wdao09 zo#^>l#n~JVCWhyY;qF|%EQNV|_en~!E^-@HKO?|1)0w{Q8;i+Z!0sy_$okDdvxK;_ zD)QLS8{`A-x*P3btUqnU<3pRbY`+O#j~~^Z5&SHp6IIfD#KWDihRD}{LYkTC&c!>% zr!UYw_p*_^qH63a@U#VQ+B&zQF~jEggc8{@=i}a^oNH;n#-0vuTZ=K=F|_Cjxl&mA z1c&baSAq6`k}D@QC~rwP8c%hI3amCrpz)ba(@5*lMd0519kdp^c3-5EG|Cw*d_J|h z(%@H7&@qA@b7gF;(YF}m`C0jHYpf$HaZxtN_#&EOuB8*Nd-B(w_rJ#pC}kc~(9zT_ zG@j$s&eVIu>h{K(SXiph=86B43))R}3bD0it9M)CG*U{I?~Ef9Lu}X8Whh$hd$v69 zG@5BNH*f!T2@*RpoF48F#6j8VbBz*Fd@XHalHBV>z=%>2P14!K%l#T`qR)d_kbD>d zE#0!{GhNbNiB$J%{Wabr$;QgyP>i zrJfERZ_BKUzNL8NJW;Dj#k}hIoZg;9q%u=;>ZV*7+4;4jjFhe9Hbz0&dcMrlI3Kn$|{o^bXw`&lM>shI!zI+IEBf_l>CtU z>1PrHw)LFe8`lxXt7Z!*)R?eD*kVKiv5zkfi1js%dD_z599KYp(dAl|O^NwkBbM;n z+!Rh7*+VA6aA20u&#qpE{pTRQMW4YGirqe;1LPcI5 zI0oy~2jp&4PwG9XeZJMtVYum@z2#`{9H?>BG8`?d5>0lNxci&|eTHt@VjnmQk-}4RJ(;Ir!Zp_+ z@kun|rb83gsTL0f$&Qy|so`aQn@vjh&%IT}Mkqwgr<*r>OtMSTCEt8wpZ#QTAbrSc zII6I#yCBl#WW$H*sKC$bEY73YC79DNY;{P`lgh!N3IgIqD%$#-?SmA!R@*i2NaW;k|zl6shr zqw1m@Z?rEIErcCEsy&<_w#jQJ=JjFeYx)t>S|x#t6KOX{k9NoB*E)_>FQ=TTAd|R! zAJ0EQ>1|d?bmN$h07CxQH||q)Vq+_PErx~@wbuN|;}|4px=&;Lx3@IzQ!}h{lV5$m zSSCLCDPb^9ux;jxN+gvdruAe0y5{NY4X#0qR{5h=MY(c?eVOII`w%r6c}?vLE>k*{ z8P-9*_i(S)yUIw+9Q)q3c0LV>EBWaQqN)wY+sdqQ{6re&Bf-1H*m9&o(EK=M^Z@@El~iH8v`my88vPi_Xf6lV zBiAw2FIIPKsaUB!Y%Xj{r1AUnO@B4$WUlhHxuMW4`gQ(M{mJ&rLXG+lE#J@3+Z5k< zVTHqM+#9zl>Y`7w>T!9SB`z2nf0k5vCHS^(#5e2Wap}|Q!_{w3GEo_Q4?L?nRI=`3 zp7<;$_x)8ne-j%vhf>B#KkSeIXdT?pIDKwH@ht>nTL>D_`G>ODZye%!_L4X1mG! zC~LcoTDW6Ojo1Q)OT7=D8Zph-T3p!ORkCH@|VAB z*b{4oAI`~pIB_)OeSB@;`rzE-JJYdmeY&;YQHQeTyb+p|iW4oaOl0}auK&^bX&!$T z-8mWIM`lxlDsM)f_6ZcPyl;7T_m;1nR{AvakLQY?#5%oP3|)+UV>2T^Y&N)5h@Lh` zaH&ROq-2guhrYapuN*H`|1ib&Tg0g4)ysy)=*vdud2?@+*2Rb0?k^)MmaMl3(4s_Av(|^(#m@DXPja#3yYSauYathqVJ`}*c_L!_^4SxU z(}WXSXexOtzb=?z=M2p-yRt>UN1jEt#2E_)CnXGT+H4@dc#j>O?oM>L)0s_lE2g6v zb9^q3_cAp>m}6)4>)GaV#UK2=N$d8T^;9Nm{eCTJ|+7fJm{_{Xww|IUyguQql0xo@iN{p3d;>(j^9 zo-XZQdS#s`v&Vj>86pA+r`C*N$HVG!Ia$uF)1+q}GvksJ6*Yj17C&C3V!=JEoqfj! z1{ILYCa(-}95$&TAzyvAn-E?RCt@T8Poc4kfR(!NsSY>TxnUyYaTd8&I7<8qMSdd8 z%~fkr-8a(sw6P?y_sHmoiksW8@hnhh8X}f3E~_*cVK~4z_tNsi0hu;rZ3mDR@I^;R z@Y`18VKpkxnnUcgUh)-chLwE#)YyOC$b6c=u>Hs>~)=d*l!z4Y3B%s^9V0eaA##%WWaBuKy^LFr5G1wlNBG%=sp=z zg&wrj;EmUMD0Q?brK%kGsf-arP4Z5Qt&DPj@rAWC7exNYjOX0jE6} z`oNHxyVP3Unf%8fFeL+5KDe$|CQpTTk4U|!wxu2ngS zmB$Tzn!bRuWKA*^^pNcj!_en&@Tb7^JvTx$~mA*ZBNy1XR--v60 zeS|>urcRu3QQ;Hjrtlk0zR=E3f6YHnYQ2mv-(Eiwn;JywP5=jLOj9O4l#sdGa*qT` zV@GGElfm_>ZtVP&&7;SPJpc{@9_Iv)GQn;+f@hw42*GXen3R#-3=FfAjTuIT$HfDm z4kotZ>+8Xe$fo3AM;h{-INb7fcbtC*s=hEKQeVa|tS1=*_0!0AW3T6w8-uECyi`~? zC+Sf3=^Fa4BVk^Xv&S8BcoZA`YVmZ(9)kxj(DOvnWO`wsbnjPDoy}RNJ_aNSu8!XQaO@>Pt*o)XCs&}fBA$Bn^c*$WLq4g$?p@>9ph>HPgrv;5UZ}9=aNYPErO@Wp5GfpKVMz8%0VaIHWR7 z?$LP~Livf%29G;Uh0#>d0vjwASHX=HYd77XoNyq$^*~-{`d_!YDrOa#&bXq0#u;ZgO;D7ILZ!(j7 zZY=EnhLcNf5&dqkM~Tkkve2`%#@jeHi5RfVH!8`rf!cQ|+XzCZ`vIGjqvIE9XY+7Vma|^z+MudK1>S z@=;TEDKS*tbNX6B{{`C{k3zM;%dt^&&Or#ZHmWPIuTr&boi7W@V6F!xj`pF-aHx~bVQ?DUY4oFnX_R-7f@C=>07Ds-Q5~a76wBdC#1{f|*pSQxv!!6o4wTQDqy33&kQv zsmC|2C@ND7zuD{eHa}*%^X1sC%Vc>2#0K;YsDovI0l}y|zd7zqs_z6@QyRv-$sW2+ zu&aT%m!AwPY=rfQQ0-(BW+L`U1g&8}qWOaLf%;iOxtlmN`fb8JeJS)j0a!fQ&b)d5 zUDePmOB>UQbY&w)w0DiOxd%}$|A_e0Py`gAFlRAPBoa_C2?Yowsy^mUx{O=G>(C&P zuJqR@KAavSWXdPb&;|MnMr}4X^3xV(JJ?Ej_BKi!S}+$D+$_gY1Mb@|wc64OA@moN z4-HahNk6C>`FV|LX_jqEXJZcEgs>{H5Wtdi2K=l>5HAL%wS2G?snCdBdTo=13sRR& zLpGq^-2ESqza8r1hrt~P%i1^`QeKSRReF4@Gp`Yx>e3Bg}Wn>Ht@iPFi`TCt>d=kjGb3%xA6(WFn9Hmr9XGH4G4nmt1ya`2^MquXMl)(BizbCCyBV3*mLF#gyg^4AJ`30jsn9US zL%Q8Nqw_m>hf|KH9^CxmE8bp?!_?!wBKzy@rnI9W&1!ga{Ux3}vg`<0>y@4_Yrw17=i@StWqex03b4=`)Kd=mdu;Nbo z3LQ#offvln(aO*}=Z7fZW0rUMK2sVuwZ~o>Q>Fx4N%KQKk%P>9#e=`hyfznlp2wkf zs_xL^97QHHQak@?-RsTG=gZqSWpg2@Lxdg1X8?Ndy^8}GKwGkUlSy*8N`i1qTAHJA ztqtE0u2iEIev>+RMNkkG!N0!f4a00BZb_L<}tBq02OT0s{DekjWXtKbUjmH`vw`VQinaP!T=7OUh?Q| z9n0FG#0z56wuUoUJXA|FoyCNOImjK7QRRq(8)%@Tjud#cWn~Xl-?*Qf zkp$#s*kx{Bi13m5?dt4#a3=5Gq7XFSi1_Vb9-Oc!S|2sgmT(rQXV^}!KaLmUjxL4L z5nPfKEn3oEv-HgTtnxVA7)AG|`Y}-;nO@H<@I2nbec0P9xfUkc+$3 zWH_{rS5IG64TQdQoz4FPy=X8M1r>&M0p zC>;DB)AdvQ*EBc4{6CcC21NG%2Fd;FWPfwqzrcT%;s&Vs0ffN+n^D|Ka!SgI3IK}x zSH%CG;RYyY{cnaFAjkEeVz~dCsrmi7`p<>vl#nrwi1?EnR6|7&<}o>`JTwG;{( z&n1U;=cf;lNfcEX0UHi?0!hO?h^spytuTvI z=mV4aCjzzoxX?H>%KZCYul8Q5{+6K4z@3sL-|U^)Kgj2zJh=9Wxz+ZUu8f5&>?!P5 zu}Z0t@3B^{%;?yKMU3?s6BqOrd2E{0Q}8fZ661$walz`qqFXa}0e&_-_19GzMA}2f z^eS`3NSnsq8ke!94u;)tNd!S;9|ur&6KYBtQFR@N z(~MYM;Y`Q<3SR0o4$`G&EP;whz3h_2{sOKa%MvzGHs_FjSh*r=2fhcg%Dx+Pe!aZR$1-CQ(aQ)S&q){Q4$oPSAyeS`Zd^YX zSW0)fS%FR~T;h%|9ly=8_;ZlBfLTJUckf5#aD-NXyTv0%9__hmg-UBIOP&JZ?r9{= z_+h>OkYHeNAIF{1;r3lwnV=5Zk*(_EWrb^);P96%WwxN4@D4@4>@G*SR55`_kiz?& z`Ce#)PiM-4E`-*NF$ikPJWo60U4<{M)TI)_BxD6kGW}9V+@W4e+Ka*ky;#+L{OIAg zjed;Z+vOg}f#5O_*S-K=@veY=(rq7ZRQ>seE%;GM`62g{$0ktkkD2iu!qMp+Vo$3I zts>^WCIT*&s8mp^I8wqNJAP@`8$9Gu5pO0DP3tPI0(HwcHR*E$#v7+YV_<@xAlsSf zQF$j$#R>9D$THTY3#d@v7ZS28wmmZWpYUUvcq$#WzOSR+atD|3Xmx1-6K@Ffg{d4v zPwl_3CS}jKiRCER43>RNi@@47uOeAU%p&|T4I|A6gi)iJm4-rvh9b{h?uZ=?m-hXm1i`hXji2$kB2F`sWHSx zq&)S*ggy(3WwpcL;kvJoe~6GG3+ZK)qn}m%TFELQPfTp}eDqY_M3aEAso8~jGG{zK z9QiPa4TU8&_Jfp>#5B>M$|Lk%atte#+S%4erkt@4(_`H^KJ{DZ94lp7D`g>ke-C`w z^gBoAMDYe+U!GJVx*-MT=;ZyD)}?8-Qw1qs$T0%|f z`4h`>cMFsJ1!|0L_=oKFgwjScl{+78PkeS6ROzCI1bO&tZl2Bv>EpXKa%?>wiO(LV z?g#xy`YJl7htXWO*0&e|4`X^a2r6}7`6SFn5u6Wm1g+0SAuu@W89qQQCL2MO47s!3 z2Xrm36X1%%7YAWV+ps8IxssO9oXl2NWr=w_6muM7@(hv1?~;$bwn@C0$v)LBc<#y} z6MRTv0F`zzoVP{;H?J@3A{`=oMRu z10H4R?qD=>Rg4VPpn;uV2$$zt=@_(sg#r`$p{gp^Vouw5*z5;*Na-v zvIV@r)83F^(`+6so=tut(ak3*(Ff%mgXfgE4psjzR^(QumED=k1~V1WYlKaQrSr-2 zqgq?9kNV6C3>ej8J_KbP+xDsjO+{k`1o4hKmS?$+MqkoxK6u1+LqS&L9prN^;7DhA zU}=9rx-4~ojVQ=14Rnze?ue8TW8)x}kT!oKO%PZ#{kUag#p(_mDhVAUDp!BSEd{-I zB0rul_eDSebHpVi!FPSeDwp)2{y}5!M;+PH1d!VD)LtNIS1!H36u}!7S{j`>wE5DE zGqgb#c8?GY`(U4kfOx@tHWM(6JMER`H@D{PH75oE=ZexyI6Hw!T21CWrA0;q*F-8q z0;iJvb6I0-OfwwevF~fJ{Y0sRcs{#jTvTj!TKTSSSjZaNVlX;uEFzWTtA`0_$T-=$ ztIf$`_4iwsM}FjZ0&rH1DAVT*daLZtwAap5=Q~S8PuIL$m(;!sk-0RFC$H75@~<(@WK3AWao0#4WEe{ z5|?_n*k4TRAjlC;jAqlMAygs6@YLs2YQ+EPzL*_o%2GCTE>fx*_}eU3Uf1zlf|bAM z6FCIzVwCK4L?JNO=2n5xTY1m(8E||B;>!kQTLkw&VNTLcKS~fvDX3#tAqRK8SPZ<7 zh+eSjQLfo$`*0r#nnJ>aXo0PKd*AjnQlKw!X>2>uG!s+Xy*$Scj?>T4jvS%DWO_Rl zc<`qV%W99DvWW$!LyohzgNcp!{17IAa2YzdYHPuyjLfdcB~~7=`^0mMY8NQqUDtvK zPUScZ-t+c|Um2Ht?i>ZR5QcPVq)pRIGe;Lxa?MFG&us8N@t69W>D~P;b)CiS- zx`CMx1y&KsJ-vR5x}22??3zaqk0SeC&kOunfqw!)VrkQfByaaUIipLnn1Zd3wBzNQ z*@R6dTn*Nd2HD(-eoupP?@uyy2j97kR5}}7nuV-p?JAP=CNNUBSm95~yQF#J1esZP@A^qcFV}xj80NmQf(|L)= zhQ4N4fXRcr8?&Ey@HaHCV@S1^I<6HlyaiN54HP0K!5fyP>zDn9EpaWP*)mOt2ZrQ{ z)H6dC*$0kNJ6=XM$yUMF>v~5z(DR4}Q}UYXPB0qSue<_F1dtEQ_{6v^k4aaY&baz2Py_pz7e52?9Va!P) zzoHG=cW9n=NdxC6|Dp|AnL{$7?#-#qs(%j@e23i2j+1~aIE^&CO>*Q{K5*T2bRFH` z6;sssdY>%xff%l6J-q6vvtlX1(Dh4JBCK%qtL#s{&ySNbSvRvO;ims4` z%*XnIE4pYdNF^*XIGyHO&Rr)k$r=m(V^p`Y+CULcYvBXXy38 zGad#}VjPEMDw9l>Ssn>WvLgRETTcvy*J3=Zut#TYC(9zm2CVjK9N|ULyRx{hA0eJx zvH7`qwu;#~TE)Awzwe;;rWgWMggBiQn0I{R^XNm^kXzi%hlrr^S>sJU6y1TdSaQ>X7Ld`NH%yYX0PYy7clzCeS z-=Z_|X4*(jKN&3?+#wPxNk*zTATyD1oQ9mkS65Sc^?tdlZ*0=&tB=-!^_%-aVlh5Q zDBf`qDJT98H9YOA%Jcgv|K-SyH)! zlrUd$ThB(TyMOX0RA6R8r|Fm1`O%=J3iujEgdADfssY!@kYB|>H~=*keOl4`F=eCS zX|bZmzj<@jQLU?%@fpg5BADmDu4bdF?vM8OFrh(7u<7rQ6+y@O4dlKJ)40L)YmC73vD$ z4ySJv`{tbDSKm71g8Np;D|LO$r>XibYuHm+`MP;%l*0oh5nyUS^{4?jo#X;X>et!l-=T*Ix?~-xX$3b8{=Ldce zY%j3#Q+%|A)v&|5v;m!E){p0OS?<%%dis|+$c01j5t>yK5r}#-9b+O{c|ES!-QcJC zcpu?%Joe46r1gU^ki9KNst<wUKI5w z_qC?d@+puf$~KT8)4O+OK6OUzo>=B$@wD;W^dDDgI^9$D(#E#mGg4H}u6^L{3*zIa z*mzGV2J){{#cg7*)kRK=k`ae!kGBZBrh17eC0CT#K6EW>;8j849D-k1tia=v&MXNWO2Sc< z?T2+Xw?ZK=BlFxQ%jWD6v$}j&!dBKm3jef%StImM`MM4e{Ll^_fLjpsGuqK$V zASrqAiSpiD;1NW#ZBlo$pC;mzzcqdky?@d=z<#~gnM(l0#Ri4tN`>z7I#whQ*6Is@ z7k8dxeOKszok}6gRA3r1;Bx!a^aY>k8eeIQv(&->>1>6h$w@K}l8$#INACSR1J^-y z-MmT9Trkay?c$mhP#}i)ofF30m8qX*`!%ixX~2-=ho@J-b{tOjhfBDitAN6*~dB~#ms7EHsU)7jgb#ukfS z42GzWZn|4{bReiomRBU1dVKw0Xpk5`g31CSs|2hTernLc>K*S3=dh~oGsrOSd?5#= z1id%7f{Z6uipon< zl!#F@`#H`{Ba2T3%~h*tVP=r_gRlh|ZH~6^G|l|+FjAmmY%x1T6jY=dIg{dIXp*ViqoyU>W;(u;LapYmFKg6J8`Uv{q}; z@hWhx&<#(QG5ua15xgKqojNQSrU%jm4jkSh&?>v8E8nojBwc!_rSQFgp|9$KCzDjy zV`DR5QeM&(g6cF^*SS@?)j4s%0+v_!45{u&Hfx~IWLsASl~_1J9s;{-ful>ah;3o5)(wZLXvYITJ$_8O5P#f(ik?k`1y^{Q4b${+XLXHSU2m0f| zPcfFDmO}{m%9*HjBW&s?*s-LYw_@?D7GI;Z2af{PnX{l>2QIF%FsTLzR%-vK(BL!C z?*!WEk`#<$rdeP{_n8Xn!Y;3hk#xP1&8R(QL!q+Fm-H{*LuPT*`10?uZgw_4(ORWW z>IprmX^5C*sOU@_oI^7RknGWElrAA7c5Bik3Dl^9ds<($?&T@^ZGy)sB)-`Fl;w;N z$Bt5WcY8jFCguhYsX2!;M3me>c+(|6FyF}?rY=S4BuzqPNdwJB=fdd+X2pMDe#{+H z>Iyd2ylqR)@egfWyr~gr)RD`3-lhLCC#)^DuN)ME_SIr#$^X>_G((G*tL&zv; zp1pY)*PO&#z*LVua)z$+vvmh>L1~hUXXEx6D8w7ps~e3SxfXs1oYm_|*LQeRstD_N zr=J2iaH~4J{*lnrJ1YoB0(l}*N?3GJVIHqB?_hW-ds2q|FmmhE#mpT^#$L0Ykz%bQ z51)J$T`o6EfTSj{U)|R{38WYfaYdf8!53atM^(XGs|@OJ_Md^#mJV1e%6dvCJ}&SC zx3;(&;~!*q8K17kVZ037e*It;vn&a5zE-SqF%&sXn-8Shkr)lF3C`%PH}1@>YZT~L?i z=uX?xZorBX@-CGC&C}>cvx&Z0#JPf&naN0@KzMfrW%uEcWn!lt@@1gx z1tpS=qyArUe~_cveu7y8c<<{Yf7fKqM$%?NWTNntg4H2`7$SIGaKF$a`~q~QR(-38QxXC+`` zWBHH23IA`#nE!Rr|A`a-8)g2h!#}nE-{8#ue^$Ty|3BjVSCO^9o`C-&J^rhpm;qqx z0A(Nltw7taqG85>0;<1Wr2m_Z5kR~D?`PuwSi23-7f>zvzla|nhuGNa2#?k14`Xp6 z{qfDyOd2vxY{p(t&!_@(^sD@0Nyzkq*GJ0phY2^W?hOC+Wbte#Ad&tZ!AqK);m7N4 zQ)4_MTWr%wwy)tkNEdMmxCnZhV47qJY6~yHY&}c|mHYXx9gYW|IZgxMi8TLmFW44^_2|B%`6YE^ZEYxHp#Lk= zRjyQT6>CKZ3Kpt|Bw^NQ{2&%uT!v($BM_+|%bie3QY;ZxfprM!I;bAo`txk=Kx^C} zlXJbPtdKvfoX=Q;bFD4Q0#8=Y`W24uZo2X#9Xw`Je7G5P^;cp+k}4yhyOETODkiJ! zUNCe#0*Km%xdHv>P>i7vZH-}9_Z6iIQm$t;`xM(x}vFhz< zCw<3pjS?((b4aR`BCJj|Qa@}vbtz)9VrG36v$MeDTRX(KKJ#-dP7%eZG9lzBBmGd8 zJ^)IQh1TE<7Vw)z{D5M4UV>Y>T+TZ7jVGXqCyCvU-e+a%5?EN_GzPI|2Uely5nLzM zz~PdP5lTlYyW_K&UXd)Bq!V+jdBaKU%b}pgjQ=Iu!g{vgn~JY4O0kbtwn_B!m)nDz z`ipFJf!eUoR^f@AGrl{zd1JWkp9j9+q;yT4_O_EH9k_|tKiz>{q8N;baSjp%6%3d7&BBg5-Y)dw&x*w6x*nKZ!cTJcFOqvxJz5=S;gAk{vJ*bxs-lo+|gxhhOKBWu@z79gkivNo54aIJ|^pIbH?&&wS|AUds36d z$5l)dNxUjNOKpys1-W@9P25Sb!WVr<*YcG{0#P($sKgV^GWc0oG3iYeY6UO!piNL% zu+l>g6@=qrGH)A5WipAGA#-wuU+aBu#fM`^xgJJzUZLZwSiY}aY8|qRIA>lIBvmRm zJoAN60ygUV?Dyvb%v(jIH(jS$HLldov7ae}&iv$`N}VXjicn@@Rla3-dhOiaDtPNN z?THp!f&N92gOz`T%%5?J7grM~?y1=3swG@jU7vb`7it+n4OF$Q{kr1Pl64x-*HfE_ z&y|=_!!x?dOC2<@Q&iTWMO60Kkd%fot#}6Rq9~NKSOAuxAZ!MM^KtSR_UI(PKHq~`04W-aXVp!b6lHBl~DbVdX7B6Dh|5Ry2MP8!T#8Yab zWZV%u818&rqpB_EjPBH>J7!Wdr}=piuSuFjE{FdlRXi{x0hxPUp6rWc-sp<2OWZv5 z0C63WnM#oi-%afa-&TSh&l2;z%Zt*F=JZABv2G4?G%=29s?utC{_YAzE(oZde*PAneIYT331==>mVB#qj; zzS2fww@QlHZFFoV4GQX}i{0MVp-3ZC-s|(zhrb5dDnDPEs@+2OZ&xD9;fgs-dU4hP zQVNF=V7W?V734u$$#t<=Nmbr~sz{BgnQS8pp1vfYm&!VqelxAT0AT;A}jCR>-pMV6AKNPyu`7vs76$8$CG`Q;X3wB?w^au9IuA8N3!_n*dNn6wxL|flv_yqEUF(Xh8pfk{o}0#+3CPAD7rFZQLlP5{I!tu$f^*pAIWYq zCTphdN}QC6hw~AP_||IF(ZEp112q6yME91mYV{gjXQGSThl1X<$w!v8E4`2#if81@ z^OHJ^izJBjAObJ1r`AEOKv5G2M^;|efwr?lrzOl-3VSVR6+t=fnJ8WfG0QIa$QM*T zvH96}eTgFVhF<_0>7em411CS|D(-O6Pn;HmL0`m;(?XWyh3bx6WX}(X#8|!I3QytB zA+xiz>ltzcFk-u+5~;ins>yeoRp)Wb8L*XZ5CT{$h< zzqel1dT{^i7M6X{n5obRR@`;m#bQ@W8Zd_kc&J%4YMAq7-5I^wlWzXTI&1WKV6OQeNUWP*G?PQ^Kh* z$~@Z^pjmK>h&dYBXaBSDg7FI5EB2UvDOUy4wP?ExN(LR24*|3b5n-7VJtsAA(yHM; zH$(3)57zLgR{9h0+9ar_v_yq^v8^S#l?sjKIKJ4sc3pSFYjsGg6V+r#7};ZEPzkw*(Q`zgF%GvQM{ZlLfdk-30)JG&}T%Ch3yn)MWy z3kSJbqX`=}8`ylL8Bi0BK+39*r|O)y9S6LFZE2j8OHZk@P{zP3@34QWP2TJ|~@yMbYbYe2C5^-!V@9%y8 zGULVb9+d|8J=4P?=Oy0@ap;)F@v{i;i}&tc0woMCm8qS8A9Xc#H;{fABUSq>2s5v6f?G3B0y+~a9oYy%&@UKKgj!iGu~aW zw!1o)47IJ}uddln_J7yCJQkSoWh&ZMKs)Lb#8bWTA-?1g$!$T8wcvq?)aD~7JIwTS z1+UUYU}3s15Ir}Y?W|?a6ihwbO+OVVE<@gGxBotQIf{V4(X~F!Tn`z67n&bCbkg54<9nw=PWVik9h9tQfx|HdzWtXopf@$UGqUHYnxpziT8f+0|rzQ|f%d9gHJ;G2{nA*v5PzZ5;OE-k9jm|9annH;sK(jr@MRR7#a-_@TnDfjh^? zoy_{wkvmo8$e+WGP`3l5NTF@{c9*PBHeIalVhcQl_X9|O@pzYob{(?KHIq88WR3^l zlJJ=ykL*J*aJzvGJZ`k7J%)h>IWN%?JLO?y$MCpiu{+a)?RLZi&?vr>lcD^56`^Q+c6QggQBJpS=1-+53{!3U}sYtZMXsTNWX4p;{cOI6+mX^fY%qLZ7 zV3&p_O*v0hh^<0kYRUXpqu0+&nRj39@U0Z8z9lH^r-p+WY!#!?*@;*($;qFgZn4)ohm(&WzW)&h(&~L3V0cG z^rVg(Zp}9)2ZCi(7$Es#PwRp`IMZ!kx3^NRN#C1wK z6C=Cd7Sc*?v7-R1ptys0%h1J7L&~M7nI~_4N-wB~m62(Isjm%!w;ymJZKxW#7uwik zk_Bpz{_I%msx0s98HeuJ)-qZBAfFXUMUz=klA{v&wMO(-lZLj&5Xf4GEgqC@a0n+jB0xd9;Ilfhj0)&brEPTN>iH z1`G-H+pXe*o=vWSgNiyD(`i^AsA0Ylix$r%iwiGZsbcflT|v4}e{DvUUnddeX$|NZ z91skJxLdl*5tCY!H>>rLtQE@Sf4S0K7i()O-_t@@dwsp27Hx8 z7#1YS+FrNTi1oY`p&<|gAeVi$iv5tbWf?6^a`mrmoh8|rGJO$`>#kh3jyrFBrB>8D zGh}AhnfQLhM3=~1X+LtRVR4}%x!}hJBc_0>Z*zeM3F5~?hZm`%#L&ubNpSIH6DsG2 z5zxXmI-;L~-l=HsRtCoNOshw{!M?_`)OAJpIrzyq@w)R=g;4JJ8wi1R_~^j5JN17Q zaHz?#B5Qc)FHCy52G+W{U(6oHk@g2U3CxjCAZ2rMLIAmQ7W3eeGG$)Ao{q-jYILR` zI;!P*T2)F)?r~`!y?nV9@~P$PlniX8ix(wgRiUk>=RJS`xuIH>QkV^*$08b;Et}>! z@&D;~w0;)oW-F<^^`n$<%=Lv;ZjIJEGRx2DWYm`h=`vS!d$gpMsvN1HvAm+|1(z+N zR>d(Ot#YAc!2Muvq%Q$dIXg;-_@Rr-8z12^SWCt?({O>DbI~}ahVL#oWC!JQ zDl?u`m}w|jN&jJfPssrS3V&3Fa(N=bJemF-5y^m*m!5)@_h# z6}bt+fe#jpLe`oEn`Lrry#AJIPnHF_CG8-i>Q!Wc-_LOi(K8Uxdbm}JzWPbdu98@A~HJ7rx5KyT`QS6@m+E-E5&6#weSg->> z5wlu}!*{i{L%BIhB}^6Rlh0%m<+H_{?6Z(Z;Ml&ZAWH8x zO%RO8jGE|Ql0W})!zHMr5F=NT!1UNjDG19{8|ZA)3QF9#Au;gb_&r-!4#N0NZw>}O zg}7@&FTk6I15JUhuV7E6*4QtLZ?SuD_;{we9vBbt)NB`2JEG9wvJ?9CsP(u^_n47; z`e8hIfC>!p)Cs4jv|4jAqb3YXGUu&Cjz6D7CQc$?{RrNvuzt}6A~0lL3%i-lU}w7b zN=8)_ZG@iXeS*qTVvkXcgV!Y4yQGl-aq6M3;fBd6w4v<1CC8#Pq_EeEsHkrL<~()* zCVOyL6Kz&H!Ymu)iv}`UEybcO3!5d{##_QC5?@I1cr766a<>Vu8^(gdRG-{ubV?KaRNMe#TR^N~C6z{IO%I;;>>RXj^ zh7&)?v24ii2D$d?PKArmM-WP_Glfr$66x$sKbqRVanRS8hzyW(*%9%)jhGnzpiQ?F zb3B_D8a?sfiGY@S{CT2>JOWi@7oXzUv{5X?$UWlH$;EA+)7eNN4&C{)yDsW?Wh0`5(mVsIgKoJH z?M169w@oru*Q*^?_3uK6ox)Oha*$Zvp(g3%ru?qjCWWf0qdl6(zCI^W45E)mcsd9I zOfKcngWGcHE;Cg)4UE7pa4;TEd&*7gPowlpYp4dF?$UuZ(>>fLr=T-AX)|9<~_v&z;J)L;Kn=oRN0H1tfqKO;wCra_XCv!d@@j@fyU155ruZza$ZOhY{ zuS~?Gm`|ngY?O;>u9jPPVnkFd?x{m?8#+9J!VgpEhq`eUG@XjuZhKXFZOuw2`cZ0? zZg6?$!PQ)oBH=!-CGrEjd-OQm&Y{>+2Ck7Gg1^U@wCfvFQi@gYNVt>I{eB+_uKyXu zA)TG#;KTY-S1A!DW4$v>iimMM%L7&4Qnh2z=PNR7DAbzfqT7_s1A{Py@7On&)k;># z*%tkG1hH7y9*{0rK#1#p+dd?;C{i9;vZy%`K?g58_vj+WkkmWIs*E#8JTe%zC={qP z{*s1+s+;+oGuSFijMGiL!wg|Rh7yPnIu+Dfz6Hv?-cH9cQ_6Wfx6m3kU0WC?mT8c_ zY^*LWPNKw|9`l^AAt!2Jrq~wL%6!4`wn*}p7OE!A)+~YEg~fD`VH4JxgUMm z`%S#l`m>X5;%4mnG22L4$3|SXLe^ko$C80L?`p4 zqx>ihD&Q517!!{$og=h0PH8P>K{Gof@-s_22e6sfnoZ*src>#sJC-jWvCmDjU_HxR z=L=rzt6CgGEvK{k>&Y-Qey6EE8}mqrnmu*_l$nNYgD%3?q(I&rezo+Xe$41P z7HXD2Xv_O&2zgkJgCO>4#fvLQZzA~n-x6NC35&z3tcck_>y&@yZdN;mBF-$cFStLazj){TUBLpo~pKhp)!(o&% zpd=%;pm@7phsGTRsn|+|9*S9r_k~)aaPFk-u5(WdYb6!I05?sR>@6QSRZW}jTiiay zD>r{eXdn@Ua1*m6zxcd1V@IUE;FIDP_$5l2e?io<)Bg*io{^n}`Ol+vMtT;u-&*c} zXX+W5m>K^URS(0<3*+bnPz<()`Pb_0%F6$mssCmFAIjAK3hn<5rv9(P{ms<>h5oZl zJv}`;K<)g$8B;H;pen8Yi>d!BWd0z4 zFS36Sz!$mS2=E1=lmCMNz9{@b0ACdUAb>AQe-OYIKl{Ky57?wX8^8pJ-^kX= zO8-x300w%%A^zD47C;YUb5pZFf&a7I0s}oDdXwL)vH*fMF?adf9KV`vo&UZDpo{76 z0So}gO&#?AHsW8^EMTAqMDu5FnE`uf=5A+Z{3l!ndVtOR&$NJ4LOP4TLBNgpbDRwH zfK{!2xBgQ_1O|X837z%tb_T#t7`i`8u>j_>F}L{>BOoPV?19~% zX24{2`VPi6|8Osu0aN^C{l{wo_=eB{Zth?8BmOO0hZztWz-Dgy=Pa24d-_|);#cht z20(coI{V*iG6A;F-r3g4*vQ~d*h~OF|1$pLl7Ef-)z{J7#?S{&r3*fJq$9-F|z<3<&Vw{ow%e+vxsWIY1sCos*e^@gGNi zWiUCp{@HH^2EZK7zh~qCtm$lH1o(3|v~~D1is9EybNStifdSyK>mSGnnDmcV48Jm> z-2c`JI6;r!5Kxqb&coQ@e|hkKTrJ~&f@(-%)CSLwEP4uBppCJ9e6P_?!ZS`yX$fQu zdMk$|4zV#}@77v6fAwBC=!`ujJv++pb|)WxU{aa5x{8YB$~6`C>Foc108K!$zsQFP z_lR;UWKDLD2Tpl==Hb}{^;zrnOY7~j&s%!RTV~=33gQ*qw?f@S{fBXV6io&k^yWCg ze57idsU)#`!)nj$aMO6^cvHQ`t3~d04hjdPm6;C^6Qr89HzmoD^|2E)TnVo^yJ7$d zT)`<@$r;*4RogCc@#g+C?V-$Cm^e%OdUtmmwRvom&!$N=ViLC>YGaY@S{1AU4w;H9 zlQ*BF*2$_%u{!u8KuX(Wu0YYdM(hF2O^4_A!C$JO`(zO#XDhP$>pi#VKI@7E)LNZ~ zVSl){mscE$PW2RuNHtk6+T%Q0vc{z7q@jn!lK~bRMa`vK%g!dCjY$i_H0ag$_6>~W z29^&PXmD$0w}?(#t(+wmLj1|f@~=k1KW9>zOR2M6iOrBaQ`1m_xWNApkF2FV^{V1q z%pAj$*>Nfw5sH$WCtH$mJ@`%h2~iY_~j z-H?n($}4GxSh1cveX^4Ho)qS4#aUSOMb~w!AH1VA$GdRbkU~kkrs1KAQy>=nsh~G- zQN4{cFk=Bonbg%Z@O4}44R=|+!9O~a zxiOSt9DT%i(;F<9Afr~|Wf>|fJ$g211HHb!Ie?4w$ zzB1yy)dtpM6zGt5F$|6T_{``tfMTCXU5A{C!Fjl{I*!cb4QAG%sod&|ljZ91ru(R7 zXY3`vaH0D=Y4IOV9w;Y!sgKpN%MN#|{!`{tWt%5BME~*2(Hr8kGSAMy=6xRbMy-HC z)u?aNjk=NT6J7*^!I$n@rk@52>)HP&m5{B54gpVl(MFhw!(ri@SIB|;_|H2v-JGOQ zZ9&w?E1*`_%6i?(qmr9r79WQgU^8A+4ho-8b_ymMu(0F7>a3An_fk@uszaqi1YWN- z{W&A_LG9ryKgUArBhtQlFU@0hLzP8S!sX- z4}?N2Yn=nA=Oz$;&Z|Wtn|1NK*;(NFsbKFu5z$^?9ssl`m95h!25p)89Sch*4@=_H z4JSUI5u8QfP);m5P3U`yQ!__0QVu{iT%X`SE%4P|7FdlZfZOQxe?}HAacG#s1@~DS zpYr=`f?=wtcg)#Nu2pc&r(mtE^x~RLIk5)hUldAb(qeZZ;+G7}ymQ2X%2d*n0Ifv8 z17d>7I#+QaU4LoDp?ABJVE^c(sRRd%C*{Im;Amb3!VFYYk4dX;NQq@^cwaRhh~C|K|0|G7w zZ|#06#J!dh;kv#L%D-h4aQMr$3Nh}oeQytdO91RBmhXE(8qjl1;~ii>AQ23nwaa}O z5PTByoDu*Ms9w_Arzrc{F~4@7O#xW^*gc%FUS)uG{9@%&EhRb{x zs2H7wc0;d=P-S}KMg+0mjp<-UgW^gDPa(jo{(8ot$HSvVE-5&pL7a48E0@l1>e=d) z2(GOSfP;DzVCErw{(r4uDz43B=T!@k1P3WDbV(d&ago>lh#o311E6v4fV#1OuRiC5 zP8G*h3B@zUAIOj3HxI;sIZt%9TQhu(@HKKU1M|6X#@PP**fRS`f^Ljsc_y zJU8EauS{^>5ySUZDJ2sU;pl71+%toO?3q+=r2Io}eKbC|TK{s$uzS057r|9p|2ajf zpVrhzuHki&G&$Nn;9zeValXwjf~4Vo=?-|}mXA|~e4J)EAJ?ouz*zAvb;v?^W=CR0 z{4RG_JNt#1Z!EwG7o|c>Yimojdj~mY2xn*fECFoke5)qB8-UUn4o%2mDx=gS_K6+8 zb|c)jKI}JD>|^PF&BL|_s{kjr0u+aCxK0nyna(kcn&+lh-o~r`2dLTqR@@A!m`-&D zD>?t#4>UIsi+M*6DAB_H-`@?WfepgIiXyFg%Hj@hPr_f6e5_+y{v3Kjq~?P_w_1Qf zAKkwB;6P!cWq6k58)83@=RP9N6_o-1$p=}$h41d1))$HCRHkP_v}^{YL6a zuRkIZTX0>%3)%(BaL#Cq*ukLAz>=u(hE)PMfX~&FdZFjuzD$Ncvw->nlNbCt9!rZm zuJ!t%SN|oV5RHd`%JD(y5OoQ=_WSpZ-s zO||_f0}HJPukFfB6RS``BgSTtfK(!89E>6aKV|oq{#d6bl2X3JMaSz4U8pilfa-?C z05${+@jqxOI3~;$FG67uW`p*YlOY$nFo?DAbP%^qJjIIxSTF&4y)oY;HY63defxn| zJl`>DX24gaa->-NdSk49%pfMpoI^Y%I z5xJJ-5EgVJ9>d@kKP9=*_myXaic`O3TY8$GWz7JEeIUx;XepQaMC=R$YAyPO2!zD! zPlPsh^?G%rkU(OC35&%EX?V0_#@%3Y+Y%;nz~>wd4oU3l1`>}MkJ`CkJ`o6k4KY*d zQ)C7702t+2B<_V^DWt-!_0hx_*E$7?7Vf{55nT)TQW9OzMoF$zYk2URYG-1eNRwm; zE+{$*!Q$_$oE$EU&;pkwq;PS+s`Ne3Vo9+IwD-&0}41o8mTauD6D@x%HvQ z-mG*;lT_S8{m<7Rl}|g+apHkpIQb+LdAPSih;K}C4S;(+X27BTo9#r!Bt&>QI6#+P?S>d-9ZnzWB&wKo_ErAcb z`1%N*bpO(QQ2gwabi@^+r%HIUl{nYP(^4GU;Vu_kd&*#S-Tzw^h#McZr}QQ1xii6t zkNkx@T3`LI9-f;(;bbmIO$m2Z_nhoBm)P3GES%tJriWQz-?=Jf*j-sGjdAo%k)$fOoqoC-z^+U1~5pbWA<1u&GCa2fyY z{!H++lvuQ}4cgxMM3iAp2IW3sff91OG}n{WKpFXDzN(kOl;?J@H59V~>bjgYWfjCk zW>PD+V?9u50{?TX+gOn}9sZis&~0stfSTJoMXj$)>cm}~NPMkRlftmEhqoXj^~k>m zzo+o{%N?|*<>#=#yT%WyZ08R3vK#rC;~>cQsPcqUHVzi~istZTr0&7LAu|Dh2trv@ zXAqbK2HFO(eHK)qRAHFTh=PcptIq;v6`Ry&pQgLi{_t3)Un_K!F`+UkLDmj?->CTS z<70!@u%MBvsCrN;QOl{9Q`b`EWGWx$Y)bzjA&0~j1I-xxEc zU%zd`Jp(W3-+xi@^s{wl^x~ol@h3?MP6VR6;y=j~acZjZnJEg&j_aD!vMZjpp+OSI z(H+ooqT;)$HYP~WltVezZE^*C!#8rW67xs-B|3-lN^<_TJl-g)XGdPb#I&=1uXs@D z23~+m;@;F57s23J`dNiU%abDbxRfLmKW4W#9+%ph-+d9el32^+Z|I2UGyI$<;ww~z zWqddFexG>wIYz#c)&|OxAe9t#3e4}AlxgD#XaEX1PIM6&9g>APg1dETW9DTflu7OYF^6O$oDxbo?k1T@j{}7xu^`XIXO7>tV=B8s5dkZxtrgrx zS8im6O?}T&S#_CWPy@Gut#+E{V?SSKO=~q;Z^Uoi6yzMJpR<7aEhT>?co6SqGDn4j2SVTevIU~mSf59iL}=`u2D1E~6R%Lyni zTf{))d^Vzf4W{tjF)?n_|C|rcFy3mtlKiZ%dm==5Endgm1VTchzSd z@-vdb)s1|SQoeB=KN0Y&C;F)m<^fas)^ADHR$Rmf+g)kaRAOf8mp1rg#=R&shwPV6$xu_p#2# zWsUOh@2MhUbKq%lJ}krF4x=E96+(99^Mv1i8EZ~LYdydXU!>{9u+|DUz~ z+^qTqub(Fa;z~MWYN|7)f@U%bPLj1cGebj=J5LbGb|O4~7Ra+fKRG?W)Q4e`(-_Em z6#Dv2%e#uU_9lHy=5BSJrhgcvG~1t6Tg>1qE}~zBV(O?QboQ%|G3qY1eaY6x)4^lW z{I7fDt2{iLcI@}uxZf7cde-!ZJo*dG0P&W{(4*Y|Im~hf-WaukBAjA^bheqwm?U}W z(5lviRy`1kqizq320#cCL9)^x6DmjMG~l1A=rBx_Z%f-g?&PZk?unoo>u!+UUYT>c$vU52mrZ-aIYpDjw-nJF z0?atk-9qDZJla$6vL+X*w0eZmld=6+qzPC@>;_?CqDQXX_TxJD_n?(eSUEPSfgENr6fiQ|y4N>2hF5@BXS|-7*x5 zX7s&k>a49x(yfYBGO;i>$Q_eGJ9NTrs~iawPu8TJVzjEbQ)$p;#fo-2R407-w!gjb zc04tPL=aFogc*qG{jVmM+J6U>xv!I}p*}K`?)z7;JOMoWBN_mjoGiveqr}`zeAT-8 z*-zcA$XJNn1)aWue~{^&N5$9%F5KLFj`=fjUD@ca`s0UH5~TyiDiQ(Y*>?2#X_iH6 z*$DxZ)t=~j-G_zkRNs`@k-T6~mAb8zAP#FIOF3b$L%Z`vvbv4g? zJtv_-`#!9xCz(?JxD@_TwaTf5apO(itT?l%sc2WWap8n<8Q?J2UxX`m zm{8J@$=NJ}Wih-XQTp8LBF6T28_GvT9LSNK|CnjaF8&AShUkl1d#?3I#UvUc*5AVH5ESrIu#=SCliuF@3M&~^IOn~P|V zlB96DAm#c0=7>{XmRHO(f4&YYwgHj zQPxl`&q1!QD_gc3rY28v(k8ak@)F;NrjLs%}u=r~7P_wgkCE%&kWI9`wi&+&&q2^b&IViTc(EVf|VkZt4M&Y!=&f2?$(nM0=hCJQDR-Tw< zA^^rtIpR=xZJ>wkPfaRPLLMXgJyF`tfIu?brOa&}5xV{g$9CDx>jpngOd|D-#-`Q+ zNY~o>rq5ISgo^~bf89PnfE%TswCX>*yFh*l%vCtB-nmg$2vJypefA=@VMk2hp8oa@ z7BVwSG?A~yQkITHpf5{nMuFi)t@@D+p9k*!brAuFlFD8dvt@0SfnW#oMpS3Gzi~p5 z9N%^!2+SLD&r9SlgWh*J`69XEfwu6BJpT_}u1l}P4#by9|M2EN*1bjn_)4s$)-m>z z|6lKm_Kjg?Wk5I<#nDOBGoWRaVL!FL0Uup;M0qL8Y}7+J>T&%~0`Ci9r_@#E;JZ(OW~%cc__^!?FNNNH|W zu#0CZ5tzv{Umw@71Ae-+)Xp0})(mfClUmiOyf|9wzIWG14ZC6c8X$&)H-691SZp&= zoB}i`jzZ#79v2m%i}*n@EXB(OETp#CRx3@%!$BRzbsGFNlvGkIUE&14pq_^Y=*dBy z;Z&Zxu%{`E(;^uv3$HA>eT$!<#*aHrF<$mfjGA~1=Ug0BSE8H=asH^h@N+>|r2KOX zib^^^K9QCc2e0MJ4XlrYob+k45vIZ5K!I*L!Uu*_pi-~?oY4w&upvYdZMYbTUS)Ru ziiDTVlyhosGf6brdcM8Z{*V{W8Nr2(tmeZ06RwZl?Okwg>*{ynX=sM4z0~gw_|k~9 zy6=f^@LDfU>7G`a8}?KicxF8PaT-ZEURacUGk=}o9wNROKrz)s6LMSqMe$7o#Y&(7 zhYf=N&|2h(%Skp4Fpr6k+vNZ6iii+-9flLGVsO&|_nQ;zU1+phehtTag=Lo9aC$XQ zQIA|b2!E$m@>zhWWp82_2_om2ePFrIwqsf~Y!z7oiG68sm-(X+U zECd-ESL}Y)G>4PWKrSXiCu`fXVnk5JpN^jsVcY|y2%s$&H3j!VsU1{q*%{0VGD}kL zC&j+j!T>{_Qt+iq&Y^j>-QI+66G{z{CJg6E)B0NX#lCFo{}VDBr{khOuhS4s4bm0F zmK#g;USSts-_N7YY{e{s3mzmaSBW+9(v7I75jNq+Ea7-WAId=dx#(!|@8`lyY$t5xKBoMLv)*vv#DCE)^RhnA*_tF*cs-ep{9Sykf zpClURg8*q#iq?wvf*6M~31#!C&h}$JKE=ah+La-S@>C*jFbl^`O2>iYXIrZvAZ7+T z<#D~vs4xGKNHR_;5XiA`0%PG1u?GLlJa{uyF7H>nGfImZ&YVjDgBDtQJ>c$_tFD2g zy!;L2L^3KaU?@RMf6D6iVU|bK+5ath)~8yE#Q8+W!potm?AG=IAP-vkc@GoTIgFUw1@Tx+icAK{6fD zj;Hlj5GF04)N~S@`KIJ;HQ=kc9e42xIC{T~<;O)*uc)QVK$F5BZLvuR-wJT0q^G@7 z8xj8&2Gau>*~^e$cjf`U)|I84LJFTay1;^7^~JI}Xr1cl`i5;$>aCuY8$q;0EO7!-s=Z;d5UA@WHK=}9UTg;fS|;zLqiL&J{^z4$fWd+8zYPvc!YyQvqzrR8B5kF%na99{@Ul&ykmmJm;(8PZIAq?4o)Q zYbtCnObAdslGsme$jq|Pe2!<4XiQ=w>6fHijFnnWc>M8+)={aOn+&x97d|Lg#GB@2 z^KWbqEf#w^fPVd09fy&HzL=T1j51t-tCBf_K;LC;UXBDfG1_utVnS+8;PESv%@Z9UEG9%8&`n)fof9;f9CsQR z#>To4!AHoruj%B8$u)klb+15<{S~d~3&fhfFvO~E%{A{<844m9yb2-uUK>Dt^-B
+   
@article{DDF2021, -       author = {D’Ambra, Pasqua and Durastante, Fabio and Filippone, Salvatore}, -       title = {{{AMG Preconditioners for Linear Solvers towards Extreme Scale}}, -       journal = {arXiv e-preprints}, -       eprint = {2006.16147v3}, -       archivePrefix = {arXiv}, -       year={2021} -     } -@Misc{psctoolkit-web-page, -       author = {D’Ambra, Pasqua and Durastante, Fabio and Filippone, Salvatore}, -       title =  {{PSCToolkit} {W}eb page}, -       url =    {https://psctoolkit.github.io/}, -       howpublished = {\url{https://psctoolkit.github.io/}}, -       year = {2021} -     } -
+ 
       author = {D’Ambra, Pasqua and Durastante, Fabio and Filippone, Salvatore}, + 
       title = {{{AMG Preconditioners for Linear Solvers towards Extreme Scale}}, + 
       journal = {arXiv e-preprints}, + 
       eprint = {2006.16147v3}, + 
       archivePrefix = {arXiv}, + 
       year={2021} + 
     } + 
+ 
@Misc{psctoolkit-web-page, + 
       author = {D’Ambra, Pasqua and Durastante, Fabio and Filippone, Salvatore}, + 
       title =  {{PSCToolkit} {W}eb page}, + 
       url =    {https://psctoolkit.github.io/}, + 
       howpublished = {\url{https://psctoolkit.github.io/}}, + 
       year = {2021} + 
     } +

diff --git a/docs/html/userhtmlli5.html b/docs/html/userhtmlli5.html index d712d8cf..e7026c20 100644 --- a/docs/html/userhtmlli5.html +++ b/docs/html/userhtmlli5.html @@ -3,8 +3,8 @@ References - - + + diff --git a/docs/html/userhtmlse1.html b/docs/html/userhtmlse1.html index f0b32b47..7b3aac2e 100644 --- a/docs/html/userhtmlse1.html +++ b/docs/html/userhtmlse1.html @@ -3,8 +3,8 @@ General Overview - - + + diff --git a/docs/html/userhtmlse2.html b/docs/html/userhtmlse2.html index 03862797..02fa5af2 100644 --- a/docs/html/userhtmlse2.html +++ b/docs/html/userhtmlse2.html @@ -3,8 +3,8 @@ Code Distribution - - + + diff --git a/docs/html/userhtmlse3.html b/docs/html/userhtmlse3.html index 3184abfd..c806825f 100644 --- a/docs/html/userhtmlse3.html +++ b/docs/html/userhtmlse3.html @@ -3,8 +3,8 @@ Configuring and Building AMG4PSBLAS - - + + diff --git a/docs/html/userhtmlse4.html b/docs/html/userhtmlse4.html index 0a78b57d..c981fd8d 100644 --- a/docs/html/userhtmlse4.html +++ b/docs/html/userhtmlse4.html @@ -3,8 +3,8 @@ Getting Started - - + + @@ -243,7 +243,7 @@ class="cmcsc-10x-x-109">type e

string g

der




No preconditioner No preconditioner

’NONE’ ’

Considered to use the PSBLAS Krylov solvers with no preconditioner.




Diagonal Diagonal

’DIAG’L1-JACOBI’ ’

Diagonal preconditioner. For any zero diagonal entry of the matrix to be preconditioned, the corresponding entry @@ -309,7 +309,7 @@ of the preconditioner is set to 1.




Gauss-Seidel Gauss-Seidel

’GS’L1-GS’ ’

Hybrid Gauss-Seidel (forward), that is, global block Jacobi with Gauss-Seidel as local solver.




Symmetrized Gauss-SeidelSymmetrized Gauss-Seidel

’FBGS’L1-FBGS’ ’

Symmetrized hybrid Gauss-Seidel, that is, forward Gauss-Seidel followed by backward Gauss-Seidel.




Block Jacobi Block Jacobi

’BJAC’L1-BJAC’ ’

Block-Jacobi with ILU(0) on the local blocks.




Additive Schwarz Additive Schwarz

’AS’ ’

Additive Schwarz (AS), with overlap 1 and ILU(0) on the local blocks.




Multilevel Multilevel

’ML’ ’

V-cycle with one hybrid forward Gauss-Seidel (GS) sweep as pre-smoother and one hybrid backward diff --git a/docs/html/userhtmlse5.html b/docs/html/userhtmlse5.html index a7e1fb0e..d4546966 100644 --- a/docs/html/userhtmlse5.html +++ b/docs/html/userhtmlse5.html @@ -3,8 +3,8 @@ User Interface - - + + diff --git a/docs/html/userhtmlse6.html b/docs/html/userhtmlse6.html index 01eb6d6c..947c0d37 100644 --- a/docs/html/userhtmlse6.html +++ b/docs/html/userhtmlse6.html @@ -3,8 +3,8 @@ Adding new smoother and solver objects to AMG4PSBLAS - - + + @@ -170,33 +170,33 @@ cellspacing="0" cellpadding="0" >

smoother smoother

class(amg_x_base_smoother_type)

The user-defined new smoother to be employed in the preconditioner.

solver solver

class(amg_x_base_solver_type)

The user-defined new solver to be employed in the preconditioner.

pass it as follows: -

-  ! sparse matrix and preconditioner
-  type(psb_dspmat_type) :: a
-  type(amg_dprec_type)  :: prec
-  type(amg_d_tlu_solver_type) :: tlusv
-......
-  !
-  !  prepare the preconditioner: an ML with defaults, but with TLU solver at
-  !  intermediate levels. All other parameters are at default values.
-  !
-  call prec%init(’ML’,       info)
-  call prec%hierarchy_build(a,desc_a,info)
-  nlv = prec%get_nlevs()
-  call prec%set(tlusv,   info,ilev=1,ilmax=max(1,nlv-1))
-  call prec%smoothers_build(a,desc_a,info)
-
+
+ 
  ! sparse matrix and preconditioner + 
  type(psb_dspmat_type) :: a + 
  type(amg_dprec_type)  :: prec + 
  type(amg_d_tlu_solver_type) :: tlusv + 
+ 
...... + 
  ! + 
  !  prepare the preconditioner: an ML with defaults, but with TLU solver at + 
  !  intermediate levels. All other parameters are at default values. + 
  ! + 
  call prec%init(’ML’,       info) + 
  call prec%hierarchy_build(a,desc_a,info) + 
  nlv = prec%get_nlevs() + 
  call prec%set(tlusv,   info,ilev=1,ilmax=max(1,nlv-1)) + 
  call prec%smoothers_build(a,desc_a,info) + 
+

diff --git a/docs/html/userhtmlse7.html b/docs/html/userhtmlse7.html index df4dc649..8c41cbde 100644 --- a/docs/html/userhtmlse7.html +++ b/docs/html/userhtmlse7.html @@ -3,8 +3,8 @@ Error Handling - - + + diff --git a/docs/html/userhtmlse8.html b/docs/html/userhtmlse8.html index 76b8561f..822aeec9 100644 --- a/docs/html/userhtmlse8.html +++ b/docs/html/userhtmlse8.html @@ -3,8 +3,8 @@ License - - + + @@ -36,37 +36,42 @@ class="cmr-12">AMG4PSBLAS is freely distributable under the following copyright -

-                           AMG4PSBLAS  version 1.0
-              Algebraic MultiGrid Preconditioners Package
-             based on PSBLAS (Parallel Sparse BLAS version 3.7)
-  (C) Copyright 2021
-  Pasqua D’Ambra         IAC-CNR, IT
-  Fabio Durastante       University of Pisa and IAC-CNR, IT
-  Salvatore Filippone    University of Rome Tor-Vergata and IAC-CNR, IT
-  Redistribution and use in source and binary forms, with or without
-  modification, are permitted provided that the following conditions
-  are met:
-    1. Redistributions of source code must retain the above copyright
-       notice, this list of conditions and the following disclaimer.
-    2. Redistributions in binary form must reproduce the above copyright
-       notice, this list of conditions, and the following disclaimer in the
-       documentation and/or other materials provided with the distribution.
-    3. The name of the MLD2P4 group or the names of its contributors may
-       not be used to endorse or promote products derived from this
-       software without specific written permission.
-  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-  ‘‘AS IS’’ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS
-  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-  POSSIBILITY OF SUCH DAMAGE.
-
+
+ 
                           AMG4PSBLAS  version 1.0 + 
              Algebraic MultiGrid Preconditioners Package + 
             based on PSBLAS (Parallel Sparse BLAS version 3.7) + 
+ 
  (C) Copyright 2021 + 
+ 
  Pasqua D’Ambra         IAC-CNR, IT + 
  Fabio Durastante       University of Pisa and IAC-CNR, IT + 
  Salvatore Filippone    University of Rome Tor-Vergata and IAC-CNR, IT + 
+ 
  Redistribution and use in source and binary forms, with or without + 
  modification, are permitted provided that the following conditions + 
  are met: + 
    1. Redistributions of source code must retain the above copyright + 
       notice, this list of conditions and the following disclaimer. + 
    2. Redistributions in binary form must reproduce the above copyright + 
       notice, this list of conditions, and the following disclaimer in the + 
       documentation and/or other materials provided with the distribution. + 
    3. The name of the MLD2P4 group or the names of its contributors may + 
       not be used to endorse or promote products derived from this + 
       software without specific written permission. + 
+ 
  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + 
  ‘‘AS IS’’ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + 
  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + 
  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS + 
  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + 
  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + 
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + 
  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + 
  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + 
  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + 
  POSSIBILITY OF SUCH DAMAGE. + 
+

@@ -78,37 +83,44 @@ class="cmr-12">abide by its terms: -

-                           MLD2P4  version 2.2
-  MultiLevel Domain Decomposition Parallel Preconditioners Package
-             based on PSBLAS (Parallel Sparse BLAS version 3.5)
-  (C) Copyright 2008-2018
-      Salvatore Filippone
-      Pasqua D’Ambra
-      Daniela di Serafino
-  Redistribution and use in source and binary forms, with or without
-  modification, are permitted provided that the following conditions
-  are met:
-    1. Redistributions of source code must retain the above copyright
-       notice, this list of conditions and the following disclaimer.
-    2. Redistributions in binary form must reproduce the above copyright
-       notice, this list of conditions, and the following disclaimer in the
-       documentation and/or other materials provided with the distribution.
-    3. The name of the MLD2P4 group or the names of its contributors may
-       not be used to endorse or promote products derived from this
-       software without specific written permission.
-  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-  ‘‘AS IS’’ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS
-  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-  POSSIBILITY OF SUCH DAMAGE.
-
+
+ 
+ 
                           MLD2P4  version 2.2 + 
  MultiLevel Domain Decomposition Parallel Preconditioners Package + 
             based on PSBLAS (Parallel Sparse BLAS version 3.5) + 
+ 
  (C) Copyright 2008-2018 + 
+ 
      Salvatore Filippone + 
      Pasqua D’Ambra + 
      Daniela di Serafino + 
+ 
+ 
  Redistribution and use in source and binary forms, with or without + 
  modification, are permitted provided that the following conditions + 
  are met: + 
    1. Redistributions of source code must retain the above copyright + 
       notice, this list of conditions and the following disclaimer. + 
    2. Redistributions in binary form must reproduce the above copyright + 
       notice, this list of conditions, and the following disclaimer in the + 
       documentation and/or other materials provided with the distribution. + 
    3. The name of the MLD2P4 group or the names of its contributors may + 
       not be used to endorse or promote products derived from this + 
       software without specific written permission. + 
+ 
  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + 
  ‘‘AS IS’’ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + 
  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + 
  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS + 
  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + 
  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + 
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + 
  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + 
  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + 
  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + 
  POSSIBILITY OF SUCH DAMAGE. + 
+

AMG4PSBLAS is distributed together with (a small part of) the graph-matching @@ -127,48 +139,48 @@ class="cmr-12">here. -

+   
// *********************************************************************** -// -//        MatchboxP: A C++ library for approximate weighted matching -//               Mahantesh Halappanavar (hala@pnnl.gov) -//               Pacific Northwest National Laboratory -// -// *********************************************************************** -// -//       Copyright (2021) Battelle Memorial Institute -//                      All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. -// -// ************************************************************************ -
+ 
// + 
//        MatchboxP: A C++ library for approximate weighted matching + 
//               Mahantesh Halappanavar (hala@pnnl.gov) + 
//               Pacific Northwest National Laboratory + 
// + 
// *********************************************************************** + 
// + 
//       Copyright (2021) Battelle Memorial Institute + 
//                      All rights reserved. + 
// + 
// Redistribution and use in source and binary forms, with or without + 
// modification, are permitted provided that the following conditions + 
// are met: + 
// + 
// 1. Redistributions of source code must retain the above copyright + 
// notice, this list of conditions and the following disclaimer. + 
// + 
// 2. Redistributions in binary form must reproduce the above copyright + 
// notice, this list of conditions and the following disclaimer in the + 
// documentation and/or other materials provided with the distribution. + 
// + 
// 3. Neither the name of the copyright holder nor the names of its + 
// contributors may be used to endorse or promote products derived from + 
// this software without specific prior written permission. + 
// + 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + 
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + 
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + 
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + 
// COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + 
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + 
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + 
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + 
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + 
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + 
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + 
// POSSIBILITY OF SUCH DAMAGE. + 
// + 
// ************************************************************************ +

diff --git a/docs/html/userhtmlse9.html b/docs/html/userhtmlse9.html index 3db740b8..1f30b61b 100644 --- a/docs/html/userhtmlse9.html +++ b/docs/html/userhtmlse9.html @@ -3,8 +3,8 @@ Contributor Covenant Code of Conduct - - + + diff --git a/docs/html/userhtmlsu1.html b/docs/html/userhtmlsu1.html index 8022ba00..4db589e8 100644 --- a/docs/html/userhtmlsu1.html +++ b/docs/html/userhtmlsu1.html @@ -3,8 +3,8 @@ Prerequisites - - + + diff --git a/docs/html/userhtmlsu10.html b/docs/html/userhtmlsu10.html index 00a465ed..86ef89f6 100644 --- a/docs/html/userhtmlsu10.html +++ b/docs/html/userhtmlsu10.html @@ -3,8 +3,8 @@ Method hierarchy_build - - + + @@ -68,9 +68,9 @@ cellspacing="0" cellpadding="0" >

a a

type(in).

The sparse matrix structure containing the local part of the matrix 20].

desc_adesc_a

type(in).

The communication descriptor of a20].

info info

integer,out).

Error code. If no error, 0 is returned. See Section 7 for details. diff --git a/docs/html/userhtmlsu11.html b/docs/html/userhtmlsu11.html index 08501195..67cc3b6e 100644 --- a/docs/html/userhtmlsu11.html +++ b/docs/html/userhtmlsu11.html @@ -3,8 +3,8 @@ Method smoothers_build - - + + @@ -82,9 +82,9 @@ cellspacing="0" cellpadding="0" >

a a

type(in).

The sparse matrix structure containing the local part of the matrix 20].

desc_adesc_a

type(in).

The communication descriptor of a20].

info info

integer,out).

Error code. If no error, 0 is returned. See Section 7 for details.

amold amold

class( optional.

The desired dynamic type for internal matrix components; this 20].

vmold vmold

class( optional.

The desired dynamic type for internal vector components; this allows e.g. running on GPUs.

imold imold

class( optional.

The desired dynamic type for internal integer vector components; this allows e.g. running on GPUs. diff --git a/docs/html/userhtmlsu12.html b/docs/html/userhtmlsu12.html index 32e905c0..a29d4019 100644 --- a/docs/html/userhtmlsu12.html +++ b/docs/html/userhtmlsu12.html @@ -3,8 +3,8 @@ Method build - - + + @@ -90,9 +90,9 @@ cellspacing="0" cellpadding="0" >

a a

type(in).

The sparse matrix structure containing the local part of the matrix 20].

desc_adesc_a

type(in).

The communication descriptor of a20].

info info

integer,out).

Error code. If no error, 0 is returned. See Section 7 for details.

amold amold

class( optional.

The desired dynamic type for internal matrix components; this 20].

vmold vmold

class( optional.

The desired dynamic type for internal vector components; this allows e.g. running on GPUs.

imold imold

class( optional.

The desired dynamic type for internal integer vector components; this allows e.g. running on GPUs.

The method can be used to build multilevel preconditioners too. diff --git a/docs/html/userhtmlsu13.html b/docs/html/userhtmlsu13.html index 6f194dd5..0a54ef74 100644 --- a/docs/html/userhtmlsu13.html +++ b/docs/html/userhtmlsu13.html @@ -3,8 +3,8 @@ Method apply - - + + @@ -96,9 +96,9 @@ cellspacing="0" cellpadding="0" >

x x

type(kind_parameter), dimension(:), intent(in)—.

The local part of the vector x, single/double precision version of AMG4PSBLAS under use.

y y

type(kind_parameter), dimension(:), intent(out)—.

The local part of the vector y, single/double precision version of AMG4PSBLAS under use.

desc_adesc_a

type(in).

The communication descriptor associated to the matrix to be preconditioned.

info info

integer,out).

Error code. If no error, 0 is returned. See Section 7 for details.

trans trans

character((in).

If trans -1).

work work

type(kind_parameter), dimension(:), optional, target—.

Workspace. Its size should be at least 4, single/double precision version of AMG4PSBLAS under use. diff --git a/docs/html/userhtmlsu14.html b/docs/html/userhtmlsu14.html index 9dab129c..bb0aa353 100644 --- a/docs/html/userhtmlsu14.html +++ b/docs/html/userhtmlsu14.html @@ -3,8 +3,8 @@ Method free - - + + @@ -57,9 +57,9 @@ cellspacing="0" cellpadding="0" >

info info

integer,out).

Error code. If no error, 0 is returned. See Section for details. diff --git a/docs/html/userhtmlsu15.html b/docs/html/userhtmlsu15.html index 8c3cfa76..12056e79 100644 --- a/docs/html/userhtmlsu15.html +++ b/docs/html/userhtmlsu15.html @@ -3,8 +3,8 @@ Method descr - - + + @@ -75,9 +75,9 @@ cellspacing="0" cellpadding="0" >

info info

integer,out).

Error code. If no error, 0 is returned. See Section 7 for details.

iout iout

integer, optional.

The id of the file where the preconditioner description will be printed; the default is the standard output.

root root

integer, optional.

The id of the process where the preconditioner description will be printed; the default is psb_root_.

verbosity verbosity

integer, optional.

;E=cAA4>L55=ur)I8-t6l9WHPvgR@|FP?9laJQ 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�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 literal 0 HcmV?d00001 diff --git a/docs/html/index.html b/docs/html/index.html index 876b4291..ffb1cef4 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -3,8 +3,8 @@ - - + + diff --git a/docs/html/userhtml.css b/docs/html/userhtml.css index a5ede259..70c936b2 100644 --- a/docs/html/userhtml.css +++ b/docs/html/userhtml.css @@ -13,35 +13,33 @@ .cmbx-12{font-size:109%; font-weight: bold;} .cmbx-12{ font-weight: bold;} .cmbx-12{ font-weight: bold;} -.cmtt-12{font-size:109%;font-family: monospace,monospace;} -.cmtt-12{font-family: monospace,monospace;} -.cmtt-12{font-family: monospace,monospace;} +.cmtt-12{font-size:109%;font-family: monospace;} +.cmtt-12{font-family: monospace;} +.cmtt-12{font-family: monospace;} .cmcsc-10x-x-120{font-size:109%;} .cmr-8{font-size:72%;} .cmmi-12{font-size:109%;font-style: italic;} .cmmi-8{font-size:72%;font-style: italic;} .cmsy-10x-x-120{font-size:109%;} .cmsy-8{font-size:72%;} -.tctt-1200{font-size:109%;font-family: monospace,monospace;} .cmmi-10x-x-109{font-style: italic;} .cmsy-10x-x-109{} -.cmtt-10x-x-109{font-family: monospace,monospace;} -.cmtt-10x-x-109{font-family: monospace,monospace;} -.cmtt-10x-x-109{font-family: monospace,monospace;} +.cmtt-10x-x-109{font-family: monospace;} +.cmtt-10x-x-109{font-family: monospace;} +.cmtt-10x-x-109{font-family: monospace;} .cmcsc-10x-x-109{} -.cmtt-10{font-size:90%;font-family: monospace,monospace;} -.cmtt-10{font-family: monospace,monospace;} -.cmtt-10{font-family: monospace,monospace;} +.cmtt-10{font-size:90%;font-family: monospace;} +.cmtt-10{font-family: monospace;} +.cmtt-10{font-family: monospace;} .cmbx-10x-x-109{ font-weight: bold;} .cmbx-10x-x-109{ font-weight: bold;} .cmbx-10x-x-109{ font-weight: bold;} .cmcsc-10{font-size:90%;} .small-caps{font-variant: small-caps; } -p{margin-top:0;margin-bottom:0} -p.indent{text-indent:0;} -p + p{margin-top:1em;} -p + div, p + pre {margin-top:1em;} -div + p, pre + p {margin-top:1em;} +p.noindent { text-indent: 0em } +td p.noindent { text-indent: 0em; margin-top:0em; } +p.nopar { text-indent: 0em; } +p.indent{ text-indent: 1.5em } @media print {div.crosslinks {visibility:hidden;}} a img { border-top: 0; border-left: 0; border-right: 0; } center { margin-top:1em; margin-bottom:1em; } @@ -64,7 +62,7 @@ div.obeylines-v p { margin-top:0; margin-bottom:0; } td.displaylines {text-align:center; white-space:nowrap;} .centerline {text-align:center;} .rightline {text-align:right;} -pre.verbatim {font-family: monospace,monospace; text-align:left; clear:both; } +div.verbatim {font-family: monospace; white-space: nowrap; text-align:left; clear:both; } .fbox {padding-left:3.0pt; padding-right:3.0pt; text-indent:0pt; border:solid black 0.4pt; } div.fbox {display:table} div.center div.fbox {text-align:center; clear:both; padding-left:3.0pt; padding-right:3.0pt; text-indent:0pt; border:solid black 0.4pt; } @@ -97,16 +95,18 @@ td.td01{ padding-left:0pt; padding-right:5pt; } td.td10{ padding-left:5pt; padding-right:0pt; } td.td11{ padding-left:5pt; padding-right:5pt; } table[rules] {border-left:solid black 0.4pt; border-right:solid black 0.4pt; } -.hline hr, .cline hr{ height : 0px; margin:0px; } -.hline td, .cline td{ padding: 0; } -.hline hr, .cline hr{border:none;border-top:1px solid black;} +.hline hr, .cline hr{ height : 1px; margin:0px; } .tabbing-right {text-align:right;} +span.TEX {letter-spacing: -0.125em; } +span.TEX span.E{ position:relative;top:0.5ex;left:-0.0417em;} +a span.TEX span.E {text-decoration: none; } +span.LATEX span.A{ position:relative; top:-0.5ex; left:-0.4em; font-size:85%;} +span.LATEX span.TEX{ position:relative; left: -0.4em; } div.float, div.figure {margin-left: auto; margin-right: auto;} div.float img {text-align:center;} div.figure img {text-align:center;} -.marginpar,.reversemarginpar {width:20%; float:right; text-align:left; margin-left:auto; margin-top:0.5em; font-size:85%; text-decoration:underline;} -.marginpar p,.reversemarginpar p{margin-top:0.4em; margin-bottom:0.4em;} -.reversemarginpar{float:left;} +.marginpar {width:20%; float:right; text-align:left; margin-left:auto; margin-top:0.5em; font-size:85%; text-decoration:underline;} +.marginpar p{margin-top:0.4em; margin-bottom:0.4em;} table.equation {width:100%;} .equation td{text-align:center; } td.equation { margin-top:1em; margin-bottom:1em; } @@ -150,9 +150,10 @@ div.abstract {width:100%;} .shadowbox { padding-left:3pt; padding-right:3pt; border:solid thin; border-right:solid thick; border-bottom:solid thick; } .doublebox { padding-left:3pt; padding-right:3pt; border-style:double; border:solid thick; } .rotatebox{display: inline-block;} +.figure img.graphics {margin-left:10%;} .lstlisting .label{margin-right:0.5em; } -div.lstlisting{font-family: monospace,monospace; white-space: nowrap; margin-top:0.5em; margin-bottom:0.5em; } -div.lstinputlisting{ font-family: monospace,monospace; white-space: nowrap; } +div.lstlisting{font-family: monospace; white-space: nowrap; margin-top:0.5em; margin-bottom:0.5em; } +div.lstinputlisting{ font-family: monospace; white-space: nowrap; } .lstinputlisting .label{margin-right:0.5em;} #TBL-1 colgroup{border-left: 1px solid black;border-right:1px solid black;} #TBL-1{border-collapse:collapse;} diff --git a/docs/html/userhtml.html b/docs/html/userhtml.html index 876b4291..ffb1cef4 100644 --- a/docs/html/userhtml.html +++ b/docs/html/userhtml.html @@ -3,8 +3,8 @@ - - + + diff --git a/docs/html/userhtml0x.png b/docs/html/userhtml0x.png index f004430adb9751a9610cd765fec671d3449e8614..96c5cb9beb75e4e632a48b47125e66cf3a369f55 100644 GIT binary patch delta 875 zcmV-x1C;#y28jod7YY{$1^@s6P8`A^ks%m=J4r-AR9Fe^mw`(oRTcnNgYfzNw|3c6J%>14!9lg^4jNdnD-1ruPk zA>`)ca-F#+;>X=?$&az}w1Z-^1U~i;v2-nvy|!rQL_mSwG;QYX@$*sZ5V8QvZ6TT-i==tIr6 z_^qlQb|=z^B$IFXi81R^oQhX(5gGn1qtLIR=Dn&xrNV5>*OIry_=b0c^L^X4S%@Gg zWwiSn`@`3AEk!|-=vdLAR`p|JvmRq)Op*^Vj~<@6D-{TOb#;;{Jac7#wUmdRm+G;@ z&yADvec8Uw=Y}@ZQo(2d$xJIao{UM-J(8h)g>0&@tP7GawMhJc zf1i0wliu5!UKdwIIR!*kQPVFApcu3WIfFouFGdKo7B`dm2nh1le38v+4S`Lh)lli- z5oM;Z$4#X50Mx@iN_l#d(|X{UVH0H*fqU?p`~}DbB-Ei%jfMaK002ovPDHLkV1f?3 Bt2Y1u delta 862 zcmV-k1EKth2mA(*7YY^#1^@s6g+LL6ks%m=E=fc|R9Fe^nDI?pF%XAePzOM;LAn7I z8^8usouG6BqD~OO2G9v2x&ds^CL1&xkY0gA=c>-A1hzJxy(8|}CvN&1G11Nac0l(_qU zqNK6lkGN>RWbrqo6XGF(k0m}ACk>Q|uu)vpU3pJ*PB29%Gw7nEkua0w!gm@$?+s~Z z#8iYbgD*-Nde`s(_|7$gj-H#h{~7DFfjpE(^I@A}Ty##trcu|#Z9JaXT%dCr^|T$t zb-o~bf{&Ha?gEK2X@-x2L-HgI@v;4X$TG3<$${}hU5D`)UciTSdFmrKVHdTr`qsm1 zWzNBNPLfWSEq;iw?75+D%GUX{5ou)JVDI5N&Emk_$aVsK5qQd%)lnouecPpHiU@o} zC$mM?AlAD==#$_zG~qiw7Z`?mhVD($)i+}?e)_47r)jo)1JcmSP^KcBt=b|p z$^E*Vu}EvIQ`hOLk6$8cT`bCP+k9Jl5s+n*Q%4NLKzAi)=Fb zPi?4Y_?+FG#GYdFmqLSDk7qP;!9M*}qqJZ;ZmaXlF}A@e1esGyh3-4+-e+#K)LKGX zlZLXl$R~Cnp~?jU#YBjljW=k2RM#m>KZN3NAQ#roQLbNh(+b)75R%$zf`hBxD2TUw40~AHi zeOU_F_6gE>QXva}&!hu7f!NiM zFb1P2YHbKE9oY(lFY8aA9ww&2_wr0R2FOTO|?Y%n70QsFC33LFdAh0tjfV_{;YmQ`J+t=6LxtI9NXeFI5oi9nY?;d^r{Q24n`xSws zqob#?=#Fx8bH6M*Y-TlNiGkJDHg>?O!^)NdoAAfJDy}u$~4<@eb#@xfo z*G>6@%=%9K(JdaH~m86mwEm=>)^cz`djnIUU;uz{da^zPop#Pj~Qp3=yO9?vRVD>fQSCH z)+ro5zR!H{-+zldn)4`W-SnTJ3vQ^{f7V2{h*jppzZh56B2Mq)I+?e&xACRs^_(@W zPd)tDbjx)2!eNK~fCu}%9&)YNSa#c9x(0m~54pEJoBAR~;-8cY$=Oe@(-~Ls?Gz)) z&syJU(@81DVmO70ffNt(!ih{XFLaV@zBqpz6Dpp2nSak4-kZTP;EO~=`AuWVkSuhg z4;{_M(wOAiK748lR$~g&Ho$}5$YW1Yq?)6jW?lA$I1net>O9&hy!BZ>Ycxd?c^M0Q zP+_arYHaS{k3L{SJY;HH&^qS)$5I!2VK2Bi_dwBzPk3n(Fz}OjJD2& z^o)vY=6{+0ZGA9S>rV1n>pHH5A5nKb4l?-i zGSW3Ka#7PnM`kFlTg52roVC7-qKQs07LfcRVKq*3He$0WG)^amb!pCtg|ebZH6JWK z>lo^#%SBNHTzCriBFbxSdkVaHM90=5+0XuJ{dKEV=z&(`YhtFaKbrQy*^jL=dXyFqw`yz@w1cf-3r5+ib$=g7 zlAk@Eshz6vB=K6Y{-nk&u?wJ=*l`$j0r}W;xa_<)s-~eu$7}-$7SLNQY)PjX-zn?<9zcLM4BAU$mM3-!FqFmBe|NqH&E;c`!F@JK{pIb_%rHDCk4 z!LX^Y`x4VfON#j;JNOXA`c7PYDt~z@`bW|0+q{t<7$hI0gZIQPAJ~+m>>OBUEApH^ zOPBN5XTz2ISQ|sF$=2EHn@3r0MxS=|x^vBW^dg9C9>X&^#jP?6NS7aH&vT%-^1;qv4 zG6c@^^eJ0&bfC}px_^gOd}_v~sZF}DtM&U{mp<{~BmB0X7&M>lH6|{#y>Z_9X&}eb zK66NMs9_Is^u-#sEAT}9aoqg#M3BKg4m)CqZq_P(GRpSEJXxm?G0)w%e)siyeZAJ* z+Gp#-=4?AQI7ZFytl5XDxp3_5U)`s;YTZdOlAQgn^?E+3zJHIh)6%~T=rp15G5)sJ z;$})9Jb^w_BOoN^rs%v#b9&!Z>jQpUJ%o3UJ|Fg)w&r16dX}p1$u|=ldZ@`YHY6uU z?~N!rr&_vw)OVd+K7HIzI@O2lUFlzQy5`|)EH>4JVzgL&A4~a?z^w@My@x^Pee-(; z3Ibo^xXJrk^M4MA%nI{IV9mp*m@Zb|i*8IMmq*u2HNJq_iNa&yxgj}uUKE6NvPNLf zBd}zB^Hp|fxUB_#SK~ik_?hC*ykPu7$t~Hue`fmHtr0kc2rN?Hi+}tfviY{;i!Hw| xayxQ+`g1t{Y(4a-EA|!E2<&GBmZzd6=ZM+ zI29zg1Dpyl?f}oEfY@|EzMs&y(du^hw0pNVw|L)-PSTU~{y#}8*t@^K|6zvRvcTTn z-i0K3F5f)aEy<=W&6MoAKW$S#TIr9Z*^vV2;L&Or6_bv~Du1_I(seR+T|9QjPfxvQ%q{JfMb7IxY09$q)pghB@2W2b$rZmbPh|94 z6+SpAH!9~U2aLO@f2G2_H!7DZ-&DYH<>I?2^gTbVH3kppn*OQU&@j)-bbd)&Yo90U zq4Uk_)J|zLc7N_M*TNyQ^+vW+kGU2Ooh)OZuReUO3uDkY@*3B|VMEjRyuj0QTx(t~ zFMMnE_gvSEt5^r-L*v-vu7$(a$U$K~Clr1|Ce~ee?z**Tt<+g_j#X^aw)!TQMQeKd zLTifbs(EYKNb5Hm-y!J|g%OT|^X#-LIO3R%gOf>6&wm3?pSqR=5zjn~1pPE9=!0K! zMDCcTzSenDAyIfRu}(POdcdPf9NH>Q80L7R2{M`nwE+5-5d?up9THi!ZE%vUbK;tQ z%0pBC-|!+Ien1i zKhCS+BM)R!v!0k~U*iNVe3sUGp2mXxR971(V}EV)c&Z#wJnFwaUA>|Mg7ll66+Aw z@GLgitx}+Wp!+utT^IfofhJnW&R7NF2M(UE6CJ|1`tQ_0pWgza`R9w~y-kM_-HpZu zK!20%(7R^qFtf)`v>CL~0eMq+sSfr(OOaW-CcnmzmyLKG7**#M!AgA5vUDZ7)JCJk z_aYTf4rfQKROD@gMVCST7+cPH8;`MGKmgbnUmg?|l=Hf0@f!Y|Q@ys<&shQ}tF`>V;vz2w`1 z&Q0>H^hML60$d*(jS}DC#8mK{s&KXAnnhCLaFq5bsAdgF#uV~?I_BVECr=@qN^)o$ zk92NH`!7vmV==&w9W@U^8xmc)4(6pRDWP2?ulTa#K2 z$0MUCJW0xFT*D)6c`%Bi1$M?P% zg_BGSUbHwlmt{zwBqT`)Of~@$lue*1aWvE)L<{2(q$e^Id^j0v-iE?y$En3J79u- z59r2U{@)dQk}T+nT{(^6%{ONS2_JBNpn4@dbAg-}Hy!@$W54~YHh-ru^Yc#<>ZIa7P|4lmAZQ%)Y=n)j?XByN?JR+Yi8^Npg zPXlocw#7fJg*LpF^cF7lll5R73F^M4erYo%z92il1Ud=mT@@v3&>xI=N;a&q9*@E9XJZGWz!U2rX0V_b#1cz#!7 zvmeUbJyv{oo<82uhSpMz-Gt0v`cE3uOy-0gPyMEyE8Q7s58BnubFRB@9oT2~Ly?U} zi|~ven#s!{ry?(|0S)tzCsz_ctdMtuJV`bX-;Unwrf00000NkvXX Hu0mjfqcz}c diff --git a/docs/html/userhtmlli1.html b/docs/html/userhtmlli1.html index dcc83f43..08bb5dee 100644 --- a/docs/html/userhtmlli1.html +++ b/docs/html/userhtmlli1.html @@ -3,8 +3,8 @@ Abstract - - + + diff --git a/docs/html/userhtmlli2.html b/docs/html/userhtmlli2.html index 1d6a77b7..02c13fb5 100644 --- a/docs/html/userhtmlli2.html +++ b/docs/html/userhtmlli2.html @@ -3,8 +3,8 @@ Contents - - + + diff --git a/docs/html/userhtmlli3.html b/docs/html/userhtmlli3.html index e358a8db..a102ce70 100644 --- a/docs/html/userhtmlli3.html +++ b/docs/html/userhtmlli3.html @@ -3,8 +3,8 @@ Contributors - - + + diff --git a/docs/html/userhtmlli4.html b/docs/html/userhtmlli4.html index 2a339025..dba92584 100644 --- a/docs/html/userhtmlli4.html +++ b/docs/html/userhtmlli4.html @@ -3,8 +3,8 @@ Citing AMG4PSBLAS - - + + @@ -32,23 +32,24 @@ class="cmr-12">When use the library, please cite the following: -

The verbosity level of the description. Default value is 0. For a distributed multilevel preconditioner the size of the coarsematrices on every process. diff --git a/docs/html/userhtmlsu16.html b/docs/html/userhtmlsu16.html index 6b6ab93f..6f922637 100644 --- a/docs/html/userhtmlsu16.html +++ b/docs/html/userhtmlsu16.html @@ -3,8 +3,8 @@ Auxiliary Methods - - + + @@ -77,9 +77,9 @@ cellspacing="0" cellpadding="0" >

info info

integer,out).

Error code. If no error, 0 is returned. See Section 7 for details.

amold amold

class( optional.

The desired dynamic type for internal matrix components; this 20].

pout pout

type(out).

The copy of the preconditioner data structure. Note that x , single/double precision version of AMG4PSBLAS under use.

info info

integer,out).

Error code. If no error, 0 is returned. See Section 7 for details.

global global

logical, optional.

Whether the global or local preconditioner memory occupation is false.. Return memory footprint in bytes. @@ -333,9 +333,9 @@ cellspacing="0" cellpadding="0" >

info info

integer,out).

Error code. If no error, 0 is returned. See Section 7 for details.

vmold vmold

class( optional.

The desired dynamic type for internal vector components; this allows e.g. running on GPUs.

info info

integer,out).

Error code. If no error, 0 is returned. See Section 7 for details. diff --git a/docs/html/userhtmlsu2.html b/docs/html/userhtmlsu2.html index bccb1ca7..082299c8 100644 --- a/docs/html/userhtmlsu2.html +++ b/docs/html/userhtmlsu2.html @@ -3,8 +3,8 @@ Optional third party libraries - - + + diff --git a/docs/html/userhtmlsu3.html b/docs/html/userhtmlsu3.html index 98612f6f..efa45195 100644 --- a/docs/html/userhtmlsu3.html +++ b/docs/html/userhtmlsu3.html @@ -3,8 +3,8 @@ Configuration options - - + + @@ -42,9 +42,9 @@ class="cmr-12">As a minimal example consider the following: -

+   
./configure --with-psblas=PSB-INSTALL-DIR -
+

which assumes that the various MPI compilers and support libraries are available in  ‘--prefix=$HOME$HOME’. 
might be configured with: -

+   
./configure --with-psblas=/opt/psblas-3.7/ \ ---with-umfpackincdir=/usr/include/suitesparse/ -
+ 
--with-umfpackincdir=/usr/include/suitesparse/ +

Once the configure script has completed execution, it will have generated the file To build the library the user will now enter -

+   
make -
+

followed (optionally) by -

+   
make install -
+

diff --git a/docs/html/userhtmlsu4.html b/docs/html/userhtmlsu4.html index 8146ab12..d9e5c8c6 100644 --- a/docs/html/userhtmlsu4.html +++ b/docs/html/userhtmlsu4.html @@ -3,8 +3,8 @@ Bug reporting - - + + @@ -36,8 +36,8 @@ class="cmr-12">If you find any bugs in our codes, please report them through our on
https://github.com/psctoolkit/amg4psblas/issues
https://github.com/psctoolkit/psctoolkit/issues

To enable us to track the bug, please provide a log from the failing application, the diff --git a/docs/html/userhtmlsu5.html b/docs/html/userhtmlsu5.html index 2451872d..6033e14c 100644 --- a/docs/html/userhtmlsu5.html +++ b/docs/html/userhtmlsu5.html @@ -3,8 +3,8 @@ Example and test programs - - + + diff --git a/docs/html/userhtmlsu6.html b/docs/html/userhtmlsu6.html index 71c829cd..0fa4d4a6 100644 --- a/docs/html/userhtmlsu6.html +++ b/docs/html/userhtmlsu6.html @@ -3,8 +3,8 @@ Examples - - + + @@ -79,7 +79,8 @@ class="cmr-12">found in the example program file amg_dexample_ml.f90, in the directory samples/simple/fileread samples/simple/fileread of the AMG4PSBLAS implementation (see Section for details). If these versions are installed, the corresponding codes are available in samples/simple/fileread/samples/simple/fileread. @@ -131,58 +133,59 @@ class="cmr-12">. -

+
  use psb_base_mod -  use amg_prec_mod -  use psb_krylov_mod -... ... -! -! sparse matrix -  type(psb_dspmat_type) :: A -! sparse matrix descriptor -  type(psb_desc_type)   :: desc_A -! preconditioner -  type(amg_dprec_type)  :: P -! right-hand side and solution vectors -  type(psb_d_vect_type) :: b, x -... ... -! -! initialize the parallel environment -  call psb_init(ctxt) -  call psb_info(ctxt,iam,np) -... ... -! -! read and assemble the spd matrix A and the right-hand side b -! using PSBLAS routines for sparse matrix / vector management -... ... -! -! initialize the default multilevel preconditioner, i.e. V-cycle -! with basic smoothed aggregation, 1 hybrid forward/backward -! GS sweep as pre/post-smoother and UMFPACK as coarsest-level -! solver -  call P%init(’ML’,info) -! -! build the preconditioner -  call P%hierarchy_build(A,desc_A,info) -  call P%smoothers_build(A,desc_A,info) -! -! set the solver parameters and the initial guess -  ... ... -! -! solve Ax=b with preconditioned CG -  call psb_krylov(’CG’,A,P,b,x,tol,desc_A,info) -  ... ... -! -! deallocate the preconditioner -  call P%free(info) -! -! deallocate other data structures -  ... ... -! -! exit the parallel environment -  call psb_exit(ctxt) -  stop -
+ 
  use amg_prec_mod + 
  use psb_krylov_mod + 
... ... + 
! + 
! sparse matrix + 
  type(psb_dspmat_type) :: A + 
! sparse matrix descriptor + 
  type(psb_desc_type)   :: desc_A + 
! preconditioner + 
  type(amg_dprec_type)  :: P + 
! right-hand side and solution vectors + 
  type(psb_d_vect_type) :: b, x + 
... ... + 
! + 
! initialize the parallel environment + 
  call psb_init(ctxt) + 
  call psb_info(ctxt,iam,np) + 
... ... + 
! + 
! read and assemble the spd matrix A and the right-hand side b + 
! using PSBLAS routines for sparse matrix / vector management + 
... ... + 
! + 
! initialize the default multilevel preconditioner, i.e. V-cycle + 
! with basic smoothed aggregation, 1 hybrid forward/backward + 
! GS sweep as pre/post-smoother and UMFPACK as coarsest-level + 
! solver + 
  call P%init(’ML’,info) + 
! + 
! build the preconditioner + 
  call P%hierarchy_build(A,desc_A,info) + 
  call P%smoothers_build(A,desc_A,info) + 
+ 
! + 
! set the solver parameters and the initial guess + 
  ... ... + 
! + 
! solve Ax=b with preconditioned CG + 
  call psb_krylov(’CG’,A,P,b,x,tol,desc_A,info) + 
  ... ... + 
! + 
! deallocate the preconditioner + 
  call P%free(info) + 
! + 
! deallocate other data structures + 
  ... ... + 
! + 
! exit the parallel environment + 
  call psb_exit(ctxt) + 
  stop +

@@ -291,19 +294,19 @@ class="cmr-12">.

-

+
... ... -! build a V-cycle preconditioner with 1 block-Jacobi sweep (with -! ILU(0) on the blocks) as pre- and post-smoother, and 8  block-Jacobi -! sweeps (with ILU(0) on the blocks) as coarsest-level solver -  call P%init(’ML’,info) -  call P%set(’SMOOTHER_TYPE’,’BJAC’,info) -  call P%set(’COARSE_SOLVE’,’BJAC’,info) -  call P%set(’COARSE_SWEEPS’,8,info) -  call P%hierarchy_build(A,desc_A,info) -  call P%smoothers_build(A,desc_A,info) -... ... -
+ 
! build a V-cycle preconditioner with 1 block-Jacobi sweep (with + 
! ILU(0) on the blocks) as pre- and post-smoother, and 8  block-Jacobi + 
! sweeps (with ILU(0) on the blocks) as coarsest-level solver + 
  call P%init(’ML’,info) + 
  call P%set(’SMOOTHER_TYPE’,’BJAC’,info) + 
  call P%set(’COARSE_SOLVE’,’BJAC’,info) + 
  call P%set(’COARSE_SWEEPS’,8,info) + 
  call P%hierarchy_build(A,desc_A,info) + 
  call P%smoothers_build(A,desc_A,info) + 
... ... +


Listing 2: setup of a multilevel preconditioner based on the default decoup

-

+
... ... -! build a W-cycle preconditioner with 2 hybrid Gauss-Seidel sweeps -! as pre- and post-smoother, a distributed coarsest -! matrix, and MUMPS as coarsest-level solver -  call P%init(’ML’,info) -  call P%set(’PAR_AGGR_ALG’,’COUPLED’,info) -call P%set(’AGGR_TYPE’,’MATCHBOXP’,info) -call P%set(’AGGR_SIZE’,8,info) -  call P%set(’ML_CYCLE’,’WCYCLE’,info) -  call P%set(’SMOOTHER_TYPE’,’FBGS’,info) -  call P%set(’SMOOTHER_SWEEPS’,2,info) -  call P%set(’COARSE_SOLVE’,’KRM’,info) -  call P%hierarchy_build(A,desc_A,info) -  call P%smoothers_build(A,desc_A,info) -... ... -
+ 
! build a W-cycle preconditioner with 2 hybrid Gauss-Seidel sweeps + 
! as pre- and post-smoother, a distributed coarsest + 
! matrix, and MUMPS as coarsest-level solver + 
  call P%init(’ML’,info) + 
  call P%set(’PAR_AGGR_ALG’,’COUPLED’,info) + 
call P%set(’AGGR_TYPE’,’MATCHBOXP’,info) + 
call P%set(’AGGR_SIZE’,8,info) + 
  call P%set(’ML_CYCLE’,’WCYCLE’,info) + 
  call P%set(’SMOOTHER_TYPE’,’FBGS’,info) + 
  call P%set(’SMOOTHER_SWEEPS’,2,info) + 
  call P%set(’COARSE_SOLVE’,’KRM’,info) + 
  call P%hierarchy_build(A,desc_A,info) + 
  call P%smoothers_build(A,desc_A,info) + 
... ... +


Listing 3:

-

+
... ... -! set RAS with overlap 2 and ILU(0) on the local blocks -  call P%init(’AS’,info) -  call P%set(’SUB_OVR’,2,info) -  call P%bld(A,desc_A,info) -... ... -! solve Ax=b with preconditioned BiCGSTAB -  call psb_krylov(’BICGSTAB’,A,P,b,x,tol,desc_A,info) -
+ 
! set RAS with overlap 2 and ILU(0) on the local blocks + 
  call P%init(’AS’,info) + 
  call P%set(’SUB_OVR’,2,info) + 
  call P%bld(A,desc_A,info) + 
... ... + 
! solve Ax=b with preconditioned BiCGSTAB + 
  call psb_krylov(’BICGSTAB’,A,P,b,x,tol,desc_A,info) +


Listing 4: GPU example - - + + @@ -52,23 +52,24 @@ class="cmr-12">variables:

-

+
program amg_dexample_gpu -  use psb_base_mod -  use amg_prec_mod -  use psb_krylov_mod -  use psb_util_mod -  use psb_gpu_mod -  use data_input -  use amg_d_pde_mod -  implicit none -  ....... -  ! GPU variables -  type(psb_d_hlg_sparse_mat) :: agmold -  type(psb_d_vect_gpu)       :: vgmold -  type(psb_i_vect_gpu)       :: igmold -  -
+ 
  use psb_base_mod + 
  use amg_prec_mod + 
  use psb_krylov_mod + 
  use psb_util_mod + 
  use psb_gpu_mod + 
  use data_input + 
  use amg_d_pde_mod + 
  implicit none + 
  ....... + 
  ! GPU variables + 
  type(psb_d_hlg_sparse_mat) :: agmold + 
  type(psb_d_vect_gpu)       :: vgmold + 
  type(psb_i_vect_gpu)       :: igmold + 
+ 
  +


Listing 5: guides).

-

+
  call psb_init(ctxt) -  call psb_info(ctxt,iam,np) -  ! -  ! BEWARE: if you have NGPUS  per node, the default is to -  ! attach to mod(IAM,NGPUS) -  ! -  call psb_gpu_init(ictxt) -  ...... -  t1 = psb_wtime() -  call prec%smoothers_build(a,desc_a,info, amold=agmold, vmold=vgmold, imold=igmold) -  -
+ 
  call psb_info(ctxt,iam,np) + 
  ! + 
  ! BEWARE: if you have NGPUS  per node, the default is to + 
  ! attach to mod(IAM,NGPUS) + 
  ! + 
  call psb_gpu_init(ictxt) + 
  ...... + 
  t1 = psb_wtime() + 
  call prec%smoothers_build(a,desc_a,info, amold=agmold, vmold=vgmold, imold=igmold) + 
+ 
  +


Listing 6: GPU environment
-

-

+

+

  call desc_a%cnv(mold=igmold) -  call a%cscnv(info,mold=agmold) -  call psb_geasb(x,desc_a,info,mold=vgmold) -  call psb_geasb(b,desc_a,info,mold=vgmold) -  ! -  ! iterative method parameters -  ! -  call psb_barrier(ctxt) -  call prec%allocate_wrk(info) -  t1 = psb_wtime() -  call psb_krylov(s_choice%kmethd,a,prec,b,x,s_choice%eps,& -       & desc_a,info,itmax=s_choice%itmax,iter=iter,err=err,itrace=s_choice%itrace,& -       & istop=s_choice%istopc,irst=s_choice%irst) -  call prec%deallocate_wrk(info) -  call psb_barrier(ctxt) -  tslv = psb_wtime() - t1 -  ...... -  call psb_gpu_exit() -  call psb_exit(ctxt) -  stop -  -
-

+ 
  call a%cscnv(info,mold=agmold) + 
  call psb_geasb(x,desc_a,info,mold=vgmold) + 
  call psb_geasb(b,desc_a,info,mold=vgmold) + 
+ 
  ! + 
  ! iterative method parameters + 
  ! + 
  call psb_barrier(ctxt) + 
  call prec%allocate_wrk(info) + 
  t1 = psb_wtime() + 
  call psb_krylov(s_choice%kmethd,a,prec,b,x,s_choice%eps,& + 
       & desc_a,info,itmax=s_choice%itmax,iter=iter,err=err,itrace=s_choice%itrace,& + 
       & istop=s_choice%istopc,irst=s_choice%irst) + 
  call prec%deallocate_wrk(info) + 
  call psb_barrier(ctxt) + 
  tslv = psb_wtime() - t1 + 
+ 
  ...... + 
  call psb_gpu_exit() + 
  call psb_exit(ctxt) + 
  stop + 
+ 
  +
+


Listing 7: setup of a GPU-enabled test program part three.
@@ -175,25 +180,30 @@ class="content">setup of a GPU-enabled test program part three.

It is very important to employ solvers that are suited to the GPU, i.e. solvers that +

It is very important to employ smoothers and coarsest solvers that are suited to the do NOT employ triangular system solve kernels. Solvers that satisfy this constraint +class="cmr-12">GPU, i.e. methods that do NOT employ triangular system solve kernels. Methods that include: +class="cmr-12">satisfy this constraint include:

+

and their ℓ1 Method init - - + + @@ -54,9 +54,9 @@ cellspacing="0" cellpadding="0" >

contxt contxt

type(in).

The communication context.

ptype ptype

character(in) .

The type of preconditioner. Its values are specified in Table 1.

Note that strings are case insensitive.

info info

integer,out).

Error code. If no error, 0 is returned. See Section 7 for details. diff --git a/docs/html/userhtmlsu9.html b/docs/html/userhtmlsu9.html index c276983a..888ff957 100644 --- a/docs/html/userhtmlsu9.html +++ b/docs/html/userhtmlsu9.html @@ -3,8 +3,8 @@ Method set - - + + @@ -79,9 +79,9 @@ cellspacing="0" cellpadding="0" >

what what

character(len=*).

The parameter to be set. It can be specified through its name; the 8.

val   

integer or in).

The value of the parameter to be set. The list of allowed values and len=*), it is also treated as case insensitive.

info info

integer,out).

Error code. If no error, 0 is returned. See Section 7 for details.

ilev ilev

integer,in).

For the multilevel preconditioner, the level at which the 8).

ilmax ilmax

integer,in).

For the multilevel preconditioner, when both ilev The levels are numbered in increasing order starting from the fin one, i.e., level 1 is the finest level.

pos pos

character(in).

Whether the other arguments apply only to the pre-smoother not concern the smoothers, class="cmtt-12">pos is ignored.

idx idx

integer,in).

An auxiliary input argument that can be passed to the underlying objects. - +class="cmr-12">objects. +

A variety of preconditioners can be obtained by setting the appropriate @@ -563,7 +563,7 @@ id="TBL-4-3">






what a type e

val val

dfault t

cnts






’ML_CYCLE

character(len=*) =*)

’VCYCLE’

’ADD’ ’

’VCYCLE’ ’

Multilevel cycle: V-cycle, W-cycle, K-cycle, and additive composition.






’CYCLE_SWEEPS’

integer integer

Any integer

number ≥ 1

1 ≥ 1

1

Number of multilevel cycles.







Table 2:




what a type e

val val

dfault t

cnts






’MIN_COARSE_SIZE_PER_PROCESS’

integer integer

Any number

> 0

200 > 0

200

Coarse size threshold per process. The aggregation stops if the global number of variables of the computed coarsest matrix @@ -736,17 +736,17 @@ multiplied by the number of processes (see Note).






’MIN_COARSE_SIZE’

integer integer

Any number

> 0

-1 > 0

-1

Coarse size threshold. The aggregation stops if the global number of variables of the computed coarsest matrix is lower @@ -759,17 +759,17 @@ class="cmtt-10x-x-109">MIN_COARSE_SIZE_PER_PROCESS’.






’MIN_CR_RATIO’

real real

Any number

> 1

1.5 > 1

1.5

Minimum coarsening ratio. The aggregation stops if the ratio between the global matrix dimensions at @@ -777,23 +777,23 @@ two consecutive levels is lower than or equal to this threshold (see Note).






’MAX_LEVS’

integer integer

Any integer

number > 1

20 > 1

20

Maximum number of levels. The aggregation stops if the number of levels reaches this value (see Note).






’PAR_AGGR_ALG

character(len=*) =*)

’DEC’, ’SYMDEC’, ’COUPLED’ ’COUPLED’

’DEC’ ’DEC’

Parallel aggregation algorithm.

the SYMDEC option applies decoupled @@ -821,7 +821,7 @@ class="cmmi-10x-x-109">AT .






’AGGR_TYPE

character(len=*) =*)

’SOC1’, ’MATCHBOXP’’

’SOC1’ ’

Type of aggregation algorithm: currently, for the decoupled aggregation we implement two @@ -862,13 +862,13 @@ package [9].






’AGGR_SIZE’

integer integer

Any integer

power of 2, with @@ -876,8 +876,8 @@ with class="cmtt-10x-x-109">aggr_size ≥ -2

4

4

Maximum size of aggregates when the coupled aggregation based on matching is applied. For aggressive coarsening @@ -889,7 +889,7 @@ and ’MATCHBOXP’






’AGGR_PROL

character(len=*) =*)

’SMOOTHED’, ’UNSMOOTHED’ ’

’SMOOTHED’ ’

Prolongator used by the aggregation algorithm: smoothed or unsmoothed (i.e., tentative prolongator).






Note. The aggregation algorithm stops when at least one of the following criteria is met: the coarse size threshold,
the minimum coarsening ratio, or the maximum number of levels is reached.
Therefore, the actual number of levels may be smaller than the specified maximum number of levels.





@@ -964,7 +964,7 @@ id="TBL-6-3">




what a type e

val val

dfault t

cnts






’AGGR_ORD

character(len=*) =*)

’NATURAL’

’DEGREE’ ’DEGREE’

’NATURAL’ ’NATURAL’

Initial ordering of indices for the decoupled aggregation algorithm: either natural ordering or sorted by @@ -1022,7 +1022,7 @@ descending degrees of the nodes in the matrix graph.






’AGGR_THRESH

real(kind_parameter) )

Any real

number ∈ [0,1]

0.01 ,1]

0.01

The threshold θ in the strength of connection algorithm. See also the note at the bottom of this table.






’AGGR_FILTER

character(len=*) =*)

’FILTER’

’NOFILTER’ ’NOFILTER’

’NOFILTER’ ’NOFILTER’

Matrix used in computing the smoothed prolongator: filtered or unfiltered.






Note. Different thresholds at different levels, such as those used in [33, Section 5.1], can be easily set by invoking the rou-
tine set with the parameter ilev.






Table 4:




what a type e

val val

dfault t

cnts






’COARSE_MAT

character(len=*) =*)

’DIST’

’REPL’ ’

’REPL’ ’

Coarsest matrix layout: distributed among the processes or replicated on each of them.






’COARSE_SOLVE

character(len=*) =*)

’MUMPS’L1-FBGS’

See Note.’

See Note.

Solver used at the coarsest level: sequential LU from MUMPS, UMFPACK, or SuperLU (plus triangular solve); distributed LU from @@ -1261,7 +1261,7 @@ UMFPACK and SuperLU_Dist are available only in double precision.






’COARSE_SUBSOLVE

character(len=*) =*)

’ILU’

’AINV’

See Note.’

See Note.

Solver for the diagonal blocks of the coarsest matrix, in case the block Jacobi solver is chosen as coarsest-level solver: ILU(






Note. Defaults for COARSE_SOLVE and COARSE_SUBSOLVE are chosen in the following order:
single precision version – MUMPS if installed, then SLU if installed, ILU otherwise;
double precision version – UMF if installed, then MUMPS if installed, then SLU if installed, ILU otherwise.





what a type e

val val

dfault t

cts






’COARSE_SWEEPS’

integer integer

Any integer

number > -0

10

10

Number of sweeps when JACOBI, GS or BJAC is chosen as coarsest-level solver.






’COARSE_FILLIN’

integer integer

Any integer

number ≥ -0

0

0

Fill-in level p of the ILU factorizations and first fill-in for the approximate inverses.






’COARSE_ILUTHRS

real(kind_parameter) )

Any real

number ≥ -0

0

0

Drop tolerance t in the ILU(p,t) factorization and first drop-tolerance for the approximate inverses.






Note. Further options for coarse solvers are contained in Table 6.
For a first use it is suggested to use the default options obtained by simply selecting the solver type.





@@ -1499,7 +1499,7 @@ id="TBL-8-3">




what a type e

val val

dfault t

cnts






’BJAC_STOP

character(len=*) =*)

’FALSE’

’TRUE’ ’

’FALSE’ ’

Select whether to use a stopping criterion for the Block-Jacobi method used as a coarse solver.






’BJAC_TRACE

character(len=*) =*)

’FALSE’

’TRUE’ ’

’FALSE’ ’

Select whether to print a trace for the calculated residual for the Block-Jacobi method used as a coarse solver.






’BJAC_ITRACE’

integer integer

Any integer

> 0

-1 > 0

-1

Number of iterations after which a trace is to be printed.






’BJAC_RESCHECK’

integer integer

Any integer

> 0

-1 > 0

-1

Number of iterations after which a residual is to be calculated.






’BJAC_STOPTOL

real(kind_parameter) )

Any real

< 1

0 < 1

0

Tolerance for the stopping criterion on the residual.






’KRM_METHOD

character(len=*) =*)

’CG’

’RGMRES’ ’

’FCG’ ’

A string that defines the iterative method to be used when employing a Krylov method 20] for further information.






’KRM_KPREC

character(len=*) =*)

Table 1 1

’BJAC’ ’

The one-level preconditioners from the Table 1 can be used for the coarse Krylov solver.






’KRM_SUB_SOLVE

character(len=*) =*)

Table 5 5

’ILU’ ’

Solver for the diagonal blocks of the coarsest matrix preconditioner, in case the block Jacobi solver is chosen @@ -1777,7 +1777,7 @@ The same caveat from Table 5 applies here.






’KRM_GLOBAL

character(len=*) =*)

’TRUE’, ’FALSE’ ’

’FALSE’ ’

Choose between a global Krylov solver, all unknowns on a single node, or a distributed one. The default choice is the distributed solver.






’KRM_EPS

real(kind_parameter) )

Real < 1 < 1

10-6 6

The stopping tolerance.






’KRM_IRST’

integer integer

Integer

≥ 1

30 ≥ 1

30

An integer specifying the restart parameter. This is employed for the BiCGSTABL or RGMRES methods, otherwise it is ignored.






’KRM_ISTOPC’

integer integer

Integers -1,2,3

2

2

If 1 then the method uses the normwise backward error in the infinity norm; if 20] guide for the details.






’KRM_ITMAX’

integer integer

Integer

≥ 1

40 ≥ 1

40

The maximum number of iterations to perform.






’KRM_ITRACE’

integer integer

Integer

≥ 0

-1 ≥ 0

-1

If > 0 print out an informational message about convergence @@ -1899,23 +1899,23 @@ class="cmtt-10x-x-109">’ iterations. If = 0 print a message in case of convergence failure.






’KRM_FILLIN’

integer integer

Integer

≥ 0

0 ≥ 0

0

Fill-in level p of the ILU factorizations and first fill-in for the approximate inverses.






@@ -1950,7 +1950,7 @@ id="TBL-9-3">




what a type e

val val

dfault t

cnts






’SMOOTHER_TYPE

character(len=*) =*)

’JACOBI’L1-FBGS’ ’

’FBGS’ ’

Type of smoother used in the multilevel -point-Jacobi and Additive Schwarz. class="cmr-10">It is ignored by one-level preconditioners.






’SUB_SOLVE

character(len=*) =*)

’JACOBI’

’AINV’ ’

GS and and Additive Schwarz one-level preconditioners preconditioners

The local solver to be used with the . See class="cmr-10">Note for details on hybrid Gauss-Seidel.






’SMOOTHER_SWEEPS’

integer integer

Any integer

number ≥ 00

1 1

Number of sweeps of the smoother or , class="cmr-10">respectively.






’SUB_OVR’

integer integer

Any integer

number ≥ 00

1 1

Number of overlap layers, for Additive Schwarz only.







Table 7:




what a type e

val val

dfault t

cnts






’SUB_RESTR

character(len=*) =*)

’HALO’

’NONE’ ’

’HALO’ ’

Type of restriction operator, for Additive classical Addditive Schwarz smoother and class="cmr-10">its RAS variant.






’SUB_PROL

character(len=*) =*)

’SUM’

’NONE’ ’

’NONE’ ’

Type of prolongation operator, for Additive ’ for its RAS variant.






’SUB_FILLIN’

integer integer

Any integer

number ≥ 0 0

0 0

Fill-in level p of the incomplete LU class="cmr-10">factorizations.






’SUB_ILUTHRS

real(kind_parameter) )

Any real number ≥ 0 0

0 0

Drop tolerance t ) class="cmr-10">factorization.






’MUMPS_LOC_GLOB

character(len=*) =*)

’LOCAL_SOLVER’

’GLOBAL_SOLVER’ ’

’GLOBAL_SOLVER’ ’

Whether MUMPS should be used as a only on the part of the matrix local to each class="cmr-10">process.






’MUMPS_IPAR_ENTRY’

integer integer

Any integer number number

0 0

Set an entry in the MUMPS integer control optional class="cmr-10">argument.






’MUMPS_RPAR_ENTRY’

real real

Any real number Any real number

0 0

Set an entry in the MUMPS real control optional class="cmr-10">argument.







Table 8: Date: Tue, 8 Jun 2021 17:18:02 +0200 Subject: [PATCH 03/36] update --- docs/src/configureout.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/configureout.txt b/docs/src/configureout.txt index e1ae3914..29fdc72a 100644 --- a/docs/src/configureout.txt +++ b/docs/src/configureout.txt @@ -159,4 +159,4 @@ Some influential environment variables: Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. -Report bugs to . +Report bugs to . From ba854379e4b59edaf30b73050e35a8c2d818be1a Mon Sep 17 00:00:00 2001 From: Cirdans-Home Date: Tue, 8 Jun 2021 17:48:19 +0200 Subject: [PATCH 04/36] Fixed typo --- docs/amg4psblas_1.0-guide.pdf | Bin 1832169 -> 1832169 bytes docs/html/userhtmlsu3.html | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/amg4psblas_1.0-guide.pdf b/docs/amg4psblas_1.0-guide.pdf index c745f571106205cce8cb9a1225e6eda546f69eb9..670ece9e56696d400258b147cb0066b67abf6821 100644 GIT binary patch delta 185 zcmaF)GXLev{Dv0B7N!>F7M2#)7Pc1l7LFFq7OocV7M>Q~7QPn#7J(MQ7NHj5Eg~HL z(+v_uWZG5yMSxfoh{b?d9Ec@=SQ3b(wyXF{-z#M`H!(0Yn$CVyS`Nb8u60!Up@Ora tiK(Tjo1vSTv6GvNtAU}hiKD5Zxf2k&niyFan%ODX5K^+;@0s*$J^*#0G(`Xa delta 202 zcmaF)GXLev{Dv0B7N!>F7M2#)7Pc1l7LFFq7OocV7M>Q~7QPn#7J(MQ7NHj5Eg~HL zqQz;MIhh3o`FW}OiMi<}1;t4@iN)=*{vtpu3dCYSEDppHKr9KwQrl(yrJt6vni-lH z7*A(EDlG?LZr3_0{ZPT#*~!q^#mLp!$imUo#n8>k*vY`e#n{-@(A3b<%+0{rPQiwd MlI?!aq-XO10El%vn*aa+ diff --git a/docs/html/userhtmlsu3.html b/docs/html/userhtmlsu3.html index efa45195..0f309954 100644 --- a/docs/html/userhtmlsu3.html +++ b/docs/html/userhtmlsu3.html @@ -4227,9 +4227,9 @@ class="cmtt-12">github.com/sfilipponepsctoolkit/amg4psblaspsctoolkit/issues>. From 0fcbdd74cdfd7cb82f474edd7faddd4fd5a461cf Mon Sep 17 00:00:00 2001 From: Cirdans-Home Date: Tue, 8 Jun 2021 17:50:21 +0200 Subject: [PATCH 05/36] Fixed typo --- docs/amg4psblas_1.0-guide.pdf | Bin 1832169 -> 1832169 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/amg4psblas_1.0-guide.pdf b/docs/amg4psblas_1.0-guide.pdf index 670ece9e56696d400258b147cb0066b67abf6821..edff7f0a8933595aa3299dce0631c25860d93858 100644 GIT binary patch delta 156 zcmaF)GXLev{Dv0B7N!>F7M2#)7Pc1l7LFFq7OocV7M>Q~7QPn#7J(MQ7NHj57LgXw z7O@ub7Ks+g7O5@LEJv9wjf|(WAC*=BF}7F7M2#)7Pc1l7LFFq7OocV7M>Q~7QPn#7J(MQ7NHj57LgXw z7O@ub7Ks+g7O5@LEJv9Q42`C Date: Mon, 14 Jun 2021 12:26:04 -0400 Subject: [PATCH 06/36] Fix AS%FREE() --- amgprec/impl/smoother/amg_c_as_smoother_free.f90 | 1 + amgprec/impl/smoother/amg_d_as_smoother_free.f90 | 1 + amgprec/impl/smoother/amg_s_as_smoother_free.f90 | 1 + amgprec/impl/smoother/amg_z_as_smoother_free.f90 | 1 + 4 files changed, 4 insertions(+) diff --git a/amgprec/impl/smoother/amg_c_as_smoother_free.f90 b/amgprec/impl/smoother/amg_c_as_smoother_free.f90 index 77ae7e95..6c22e1d2 100644 --- a/amgprec/impl/smoother/amg_c_as_smoother_free.f90 +++ b/amgprec/impl/smoother/amg_c_as_smoother_free.f90 @@ -61,6 +61,7 @@ subroutine amg_c_as_smoother_free(sm,info) end if end if call sm%nd%free() + call sm%desc_data%free(info) call psb_erractionrestore(err_act) return diff --git a/amgprec/impl/smoother/amg_d_as_smoother_free.f90 b/amgprec/impl/smoother/amg_d_as_smoother_free.f90 index d6217e0f..b5e1aa6e 100644 --- a/amgprec/impl/smoother/amg_d_as_smoother_free.f90 +++ b/amgprec/impl/smoother/amg_d_as_smoother_free.f90 @@ -61,6 +61,7 @@ subroutine amg_d_as_smoother_free(sm,info) end if end if call sm%nd%free() + call sm%desc_data%free(info) call psb_erractionrestore(err_act) return diff --git a/amgprec/impl/smoother/amg_s_as_smoother_free.f90 b/amgprec/impl/smoother/amg_s_as_smoother_free.f90 index e245e17f..3085f485 100644 --- a/amgprec/impl/smoother/amg_s_as_smoother_free.f90 +++ b/amgprec/impl/smoother/amg_s_as_smoother_free.f90 @@ -61,6 +61,7 @@ subroutine amg_s_as_smoother_free(sm,info) end if end if call sm%nd%free() + call sm%desc_data%free(info) call psb_erractionrestore(err_act) return diff --git a/amgprec/impl/smoother/amg_z_as_smoother_free.f90 b/amgprec/impl/smoother/amg_z_as_smoother_free.f90 index 3fce8b8a..dc6c98b6 100644 --- a/amgprec/impl/smoother/amg_z_as_smoother_free.f90 +++ b/amgprec/impl/smoother/amg_z_as_smoother_free.f90 @@ -61,6 +61,7 @@ subroutine amg_z_as_smoother_free(sm,info) end if end if call sm%nd%free() + call sm%desc_data%free(info) call psb_erractionrestore(err_act) return From 988021ff24e8bf93ed5e1dd5ac8294bd6fdada25 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Tue, 15 Jun 2021 03:33:13 -0400 Subject: [PATCH 07/36] Fix uninitialized warning --- samples/advanced/pdegen/amg_d_pde3d_base_mod.f90 | 2 +- samples/advanced/pdegen/amg_s_pde3d_base_mod.f90 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/advanced/pdegen/amg_d_pde3d_base_mod.f90 b/samples/advanced/pdegen/amg_d_pde3d_base_mod.f90 index 7becb5a1..a6de1d87 100644 --- a/samples/advanced/pdegen/amg_d_pde3d_base_mod.f90 +++ b/samples/advanced/pdegen/amg_d_pde3d_base_mod.f90 @@ -64,7 +64,7 @@ contains b3=done/sqrt(3.0_psb_dpk_) end function b3 function c(x,y,z) - use psb_base_mod, only : psb_dpk_, done + use psb_base_mod, only : psb_dpk_, dzero, done real(psb_dpk_) :: c real(psb_dpk_), intent(in) :: x,y,z c=dzero diff --git a/samples/advanced/pdegen/amg_s_pde3d_base_mod.f90 b/samples/advanced/pdegen/amg_s_pde3d_base_mod.f90 index 7acac026..ed420eda 100644 --- a/samples/advanced/pdegen/amg_s_pde3d_base_mod.f90 +++ b/samples/advanced/pdegen/amg_s_pde3d_base_mod.f90 @@ -64,7 +64,7 @@ contains b3=sone/sqrt(3.0_psb_spk_) end function b3 function c(x,y,z) - use psb_base_mod, only : psb_spk_, sone + use psb_base_mod, only : psb_spk_, szero, sone real(psb_spk_) :: c real(psb_spk_), intent(in) :: x,y,z c=szero From 4bbba3ebd76d039952201474cb4975619665692c Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Mon, 21 Jun 2021 21:38:14 +0200 Subject: [PATCH 08/36] Fix interface inconsistencies --- amgprec/amg_c_base_aggregator_mod.f90 | 4 +- amgprec/amg_d_base_aggregator_mod.f90 | 4 +- amgprec/amg_d_parmatch_aggregator_mod.F90 | 16 +- amgprec/amg_s_base_aggregator_mod.f90 | 4 +- amgprec/amg_s_parmatch_aggregator_mod.F90 | 16 +- amgprec/amg_z_base_aggregator_mod.f90 | 4 +- .../aggregator/amg_c_dec_aggregator_tprol.f90 | 4 +- .../amg_c_symdec_aggregator_tprol.f90 | 4 +- .../aggregator/amg_caggrmat_minnrg_bld.f90 | 718 +++++++++--------- .../impl/aggregator/amg_caggrmat_smth_bld.f90 | 2 +- .../aggregator/amg_d_dec_aggregator_tprol.f90 | 4 +- .../amg_d_parmatch_aggregator_tprol.F90 | 2 +- .../aggregator/amg_d_parmatch_smth_bld.F90 | 2 +- .../aggregator/amg_d_parmatch_spmm_bld.F90 | 2 +- .../amg_d_parmatch_spmm_bld_inner.F90 | 4 +- .../aggregator/amg_d_parmatch_spmm_bld_ov.F90 | 2 +- .../amg_d_symdec_aggregator_tprol.f90 | 4 +- .../aggregator/amg_daggrmat_minnrg_bld.f90 | 718 +++++++++--------- .../impl/aggregator/amg_daggrmat_smth_bld.f90 | 2 +- .../aggregator/amg_s_dec_aggregator_tprol.f90 | 4 +- .../amg_s_parmatch_aggregator_tprol.F90 | 2 +- .../aggregator/amg_s_parmatch_smth_bld.F90 | 2 +- .../aggregator/amg_s_parmatch_spmm_bld.F90 | 2 +- .../amg_s_parmatch_spmm_bld_inner.F90 | 4 +- .../aggregator/amg_s_parmatch_spmm_bld_ov.F90 | 2 +- .../amg_s_symdec_aggregator_tprol.f90 | 4 +- .../aggregator/amg_saggrmat_minnrg_bld.f90 | 718 +++++++++--------- .../impl/aggregator/amg_saggrmat_smth_bld.f90 | 2 +- .../aggregator/amg_z_dec_aggregator_tprol.f90 | 4 +- .../amg_z_symdec_aggregator_tprol.f90 | 4 +- .../aggregator/amg_zaggrmat_minnrg_bld.f90 | 718 +++++++++--------- .../impl/aggregator/amg_zaggrmat_smth_bld.f90 | 2 +- amgprec/impl/amg_cprecset.F90 | 2 +- amgprec/impl/amg_dprecset.F90 | 2 +- amgprec/impl/amg_sprecset.F90 | 2 +- amgprec/impl/amg_zprecset.F90 | 2 +- .../impl/solver/amg_c_base_solver_csetr.f90 | 2 +- amgprec/impl/solver/amg_c_bwgs_solver_bld.f90 | 2 +- amgprec/impl/solver/amg_c_krm_solver_impl.f90 | 5 +- .../impl/solver/amg_d_base_solver_csetr.f90 | 2 +- amgprec/impl/solver/amg_d_bwgs_solver_bld.f90 | 2 +- amgprec/impl/solver/amg_d_krm_solver_impl.f90 | 5 +- .../impl/solver/amg_s_base_solver_csetr.f90 | 2 +- amgprec/impl/solver/amg_s_bwgs_solver_bld.f90 | 2 +- amgprec/impl/solver/amg_s_krm_solver_impl.f90 | 5 +- .../impl/solver/amg_z_base_solver_csetr.f90 | 2 +- amgprec/impl/solver/amg_z_bwgs_solver_bld.f90 | 2 +- amgprec/impl/solver/amg_z_krm_solver_impl.f90 | 5 +- 48 files changed, 1520 insertions(+), 1508 deletions(-) diff --git a/amgprec/amg_c_base_aggregator_mod.f90 b/amgprec/amg_c_base_aggregator_mod.f90 index 42d7d140..93250ba5 100644 --- a/amgprec/amg_c_base_aggregator_mod.f90 +++ b/amgprec/amg_c_base_aggregator_mod.f90 @@ -126,7 +126,7 @@ module amg_c_base_aggregator_mod & psb_c_coo_sparse_mat, amg_sml_parms, psb_spk_, psb_ipk_, psb_lpk_ implicit none type(psb_c_csr_sparse_mat), intent(inout) :: a_csr - type(psb_desc_type), intent(in) :: desc_a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: nlaggr(:) type(amg_sml_parms), intent(inout) :: parms type(psb_c_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr @@ -144,7 +144,7 @@ module amg_c_base_aggregator_mod & psb_c_coo_sparse_mat, amg_sml_parms, psb_spk_, psb_ipk_, psb_lpk_ implicit none type(psb_c_csr_sparse_mat), intent(inout) :: a_csr - type(psb_desc_type), intent(in) :: desc_a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: nlaggr(:) type(amg_sml_parms), intent(inout) :: parms type(psb_c_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr diff --git a/amgprec/amg_d_base_aggregator_mod.f90 b/amgprec/amg_d_base_aggregator_mod.f90 index ef87f42e..14e2cd64 100644 --- a/amgprec/amg_d_base_aggregator_mod.f90 +++ b/amgprec/amg_d_base_aggregator_mod.f90 @@ -126,7 +126,7 @@ module amg_d_base_aggregator_mod & psb_d_coo_sparse_mat, amg_dml_parms, psb_dpk_, psb_ipk_, psb_lpk_ implicit none type(psb_d_csr_sparse_mat), intent(inout) :: a_csr - type(psb_desc_type), intent(in) :: desc_a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: nlaggr(:) type(amg_dml_parms), intent(inout) :: parms type(psb_d_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr @@ -144,7 +144,7 @@ module amg_d_base_aggregator_mod & psb_d_coo_sparse_mat, amg_dml_parms, psb_dpk_, psb_ipk_, psb_lpk_ implicit none type(psb_d_csr_sparse_mat), intent(inout) :: a_csr - type(psb_desc_type), intent(in) :: desc_a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: nlaggr(:) type(amg_dml_parms), intent(inout) :: parms type(psb_d_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr diff --git a/amgprec/amg_d_parmatch_aggregator_mod.F90 b/amgprec/amg_d_parmatch_aggregator_mod.F90 index fdbf961a..5451e687 100644 --- a/amgprec/amg_d_parmatch_aggregator_mod.F90 +++ b/amgprec/amg_d_parmatch_aggregator_mod.F90 @@ -168,7 +168,7 @@ module amg_d_parmatch_aggregator_mod type(amg_dml_parms), intent(inout) :: parms type(amg_daggr_data), intent(in) :: ag_data type(psb_dspmat_type), intent(inout) :: a - type(psb_desc_type), intent(inout) :: desc_a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) type(psb_ldspmat_type), intent(out) :: t_prol integer(psb_ipk_), intent(out) :: info @@ -235,7 +235,7 @@ module amg_d_parmatch_aggregator_mod & psb_ldspmat_type, psb_dpk_, psb_ipk_, psb_lpk_, amg_dml_parms, amg_daggr_data implicit none type(psb_dspmat_type), intent(in) :: a - type(psb_desc_type), intent(in) :: desc_a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_dml_parms), intent(inout) :: parms type(psb_ldspmat_type), intent(inout) :: t_prol @@ -257,7 +257,7 @@ module amg_d_parmatch_aggregator_mod integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_dml_parms), intent(inout) :: parms type(psb_ldspmat_type), intent(inout) :: t_prol - type(psb_dspmat_type), intent(out) :: op_prol,ac, op_restr + type(psb_dspmat_type), intent(inout) :: op_prol,ac, op_restr type(psb_desc_type), intent(inout) :: desc_ac integer(psb_ipk_), intent(out) :: info end subroutine amg_d_parmatch_unsmth_bld @@ -275,7 +275,7 @@ module amg_d_parmatch_aggregator_mod integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_dml_parms), intent(inout) :: parms type(psb_ldspmat_type), intent(inout) :: t_prol - type(psb_dspmat_type), intent(out) :: op_prol,ac, op_restr + type(psb_dspmat_type), intent(inout) :: op_prol,ac, op_restr type(psb_desc_type), intent(inout) :: desc_ac integer(psb_ipk_), intent(out) :: info end subroutine amg_d_parmatch_smth_bld @@ -288,11 +288,11 @@ module amg_d_parmatch_aggregator_mod & psb_ldspmat_type, psb_dpk_, psb_ipk_, psb_lpk_, amg_dml_parms, amg_daggr_data implicit none type(psb_dspmat_type), intent(inout) :: a - type(psb_desc_type), intent(in) :: desc_a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_dml_parms), intent(inout) :: parms type(psb_ldspmat_type), intent(inout) :: t_prol - type(psb_dspmat_type), intent(out) :: op_prol,ac, op_restr + type(psb_dspmat_type), intent(inout) :: op_prol,ac, op_restr type(psb_desc_type), intent(out) :: desc_ac integer(psb_ipk_), intent(out) :: info end subroutine amg_d_parmatch_spmm_bld_ov @@ -306,11 +306,11 @@ module amg_d_parmatch_aggregator_mod & psb_d_csr_sparse_mat, psb_ld_csr_sparse_mat implicit none type(psb_d_csr_sparse_mat), intent(inout) :: a - type(psb_desc_type), intent(in) :: desc_a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_dml_parms), intent(inout) :: parms type(psb_ldspmat_type), intent(inout) :: t_prol - type(psb_dspmat_type), intent(out) :: op_prol,ac, op_restr + type(psb_dspmat_type), intent(inout) :: op_prol,ac, op_restr type(psb_desc_type), intent(out) :: desc_ac integer(psb_ipk_), intent(out) :: info end subroutine amg_d_parmatch_spmm_bld_inner diff --git a/amgprec/amg_s_base_aggregator_mod.f90 b/amgprec/amg_s_base_aggregator_mod.f90 index f1039639..2c07fc4a 100644 --- a/amgprec/amg_s_base_aggregator_mod.f90 +++ b/amgprec/amg_s_base_aggregator_mod.f90 @@ -126,7 +126,7 @@ module amg_s_base_aggregator_mod & psb_s_coo_sparse_mat, amg_sml_parms, psb_spk_, psb_ipk_, psb_lpk_ implicit none type(psb_s_csr_sparse_mat), intent(inout) :: a_csr - type(psb_desc_type), intent(in) :: desc_a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: nlaggr(:) type(amg_sml_parms), intent(inout) :: parms type(psb_s_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr @@ -144,7 +144,7 @@ module amg_s_base_aggregator_mod & psb_s_coo_sparse_mat, amg_sml_parms, psb_spk_, psb_ipk_, psb_lpk_ implicit none type(psb_s_csr_sparse_mat), intent(inout) :: a_csr - type(psb_desc_type), intent(in) :: desc_a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: nlaggr(:) type(amg_sml_parms), intent(inout) :: parms type(psb_s_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr diff --git a/amgprec/amg_s_parmatch_aggregator_mod.F90 b/amgprec/amg_s_parmatch_aggregator_mod.F90 index 32a3b711..fd1defa0 100644 --- a/amgprec/amg_s_parmatch_aggregator_mod.F90 +++ b/amgprec/amg_s_parmatch_aggregator_mod.F90 @@ -168,7 +168,7 @@ module amg_s_parmatch_aggregator_mod type(amg_sml_parms), intent(inout) :: parms type(amg_saggr_data), intent(in) :: ag_data type(psb_sspmat_type), intent(inout) :: a - type(psb_desc_type), intent(inout) :: desc_a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) type(psb_lsspmat_type), intent(out) :: t_prol integer(psb_ipk_), intent(out) :: info @@ -235,7 +235,7 @@ module amg_s_parmatch_aggregator_mod & psb_lsspmat_type, psb_dpk_, psb_ipk_, psb_lpk_, amg_sml_parms, amg_saggr_data implicit none type(psb_sspmat_type), intent(in) :: a - type(psb_desc_type), intent(in) :: desc_a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_sml_parms), intent(inout) :: parms type(psb_lsspmat_type), intent(inout) :: t_prol @@ -257,7 +257,7 @@ module amg_s_parmatch_aggregator_mod integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_sml_parms), intent(inout) :: parms type(psb_lsspmat_type), intent(inout) :: t_prol - type(psb_sspmat_type), intent(out) :: op_prol,ac, op_restr + type(psb_sspmat_type), intent(inout) :: op_prol,ac, op_restr type(psb_desc_type), intent(inout) :: desc_ac integer(psb_ipk_), intent(out) :: info end subroutine amg_s_parmatch_unsmth_bld @@ -275,7 +275,7 @@ module amg_s_parmatch_aggregator_mod integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_sml_parms), intent(inout) :: parms type(psb_lsspmat_type), intent(inout) :: t_prol - type(psb_sspmat_type), intent(out) :: op_prol,ac, op_restr + type(psb_sspmat_type), intent(inout) :: op_prol,ac, op_restr type(psb_desc_type), intent(inout) :: desc_ac integer(psb_ipk_), intent(out) :: info end subroutine amg_s_parmatch_smth_bld @@ -288,11 +288,11 @@ module amg_s_parmatch_aggregator_mod & psb_lsspmat_type, psb_dpk_, psb_ipk_, psb_lpk_, amg_sml_parms, amg_saggr_data implicit none type(psb_sspmat_type), intent(inout) :: a - type(psb_desc_type), intent(in) :: desc_a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_sml_parms), intent(inout) :: parms type(psb_lsspmat_type), intent(inout) :: t_prol - type(psb_sspmat_type), intent(out) :: op_prol,ac, op_restr + type(psb_sspmat_type), intent(inout) :: op_prol,ac, op_restr type(psb_desc_type), intent(out) :: desc_ac integer(psb_ipk_), intent(out) :: info end subroutine amg_s_parmatch_spmm_bld_ov @@ -306,11 +306,11 @@ module amg_s_parmatch_aggregator_mod & psb_s_csr_sparse_mat, psb_ls_csr_sparse_mat implicit none type(psb_s_csr_sparse_mat), intent(inout) :: a - type(psb_desc_type), intent(in) :: desc_a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_sml_parms), intent(inout) :: parms type(psb_lsspmat_type), intent(inout) :: t_prol - type(psb_sspmat_type), intent(out) :: op_prol,ac, op_restr + type(psb_sspmat_type), intent(inout) :: op_prol,ac, op_restr type(psb_desc_type), intent(out) :: desc_ac integer(psb_ipk_), intent(out) :: info end subroutine amg_s_parmatch_spmm_bld_inner diff --git a/amgprec/amg_z_base_aggregator_mod.f90 b/amgprec/amg_z_base_aggregator_mod.f90 index 84c52a9d..81858fb7 100644 --- a/amgprec/amg_z_base_aggregator_mod.f90 +++ b/amgprec/amg_z_base_aggregator_mod.f90 @@ -126,7 +126,7 @@ module amg_z_base_aggregator_mod & psb_z_coo_sparse_mat, amg_dml_parms, psb_dpk_, psb_ipk_, psb_lpk_ implicit none type(psb_z_csr_sparse_mat), intent(inout) :: a_csr - type(psb_desc_type), intent(in) :: desc_a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: nlaggr(:) type(amg_dml_parms), intent(inout) :: parms type(psb_z_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr @@ -144,7 +144,7 @@ module amg_z_base_aggregator_mod & psb_z_coo_sparse_mat, amg_dml_parms, psb_dpk_, psb_ipk_, psb_lpk_ implicit none type(psb_z_csr_sparse_mat), intent(inout) :: a_csr - type(psb_desc_type), intent(in) :: desc_a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: nlaggr(:) type(amg_dml_parms), intent(inout) :: parms type(psb_z_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr diff --git a/amgprec/impl/aggregator/amg_c_dec_aggregator_tprol.f90 b/amgprec/impl/aggregator/amg_c_dec_aggregator_tprol.f90 index cb8fb6a7..4efaf61d 100644 --- a/amgprec/impl/aggregator/amg_c_dec_aggregator_tprol.f90 +++ b/amgprec/impl/aggregator/amg_c_dec_aggregator_tprol.f90 @@ -83,8 +83,8 @@ subroutine amg_c_dec_aggregator_build_tprol(ag,parms,ag_data,& class(amg_c_dec_aggregator_type), target, intent(inout) :: ag type(amg_sml_parms), intent(inout) :: parms type(amg_saggr_data), intent(in) :: ag_data - type(psb_cspmat_type), intent(in) :: a - type(psb_desc_type), intent(in) :: desc_a + type(psb_cspmat_type), intent(inout) :: a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) type(psb_lcspmat_type), intent(out) :: t_prol integer(psb_ipk_), intent(out) :: info diff --git a/amgprec/impl/aggregator/amg_c_symdec_aggregator_tprol.f90 b/amgprec/impl/aggregator/amg_c_symdec_aggregator_tprol.f90 index 9974a233..4a71212e 100644 --- a/amgprec/impl/aggregator/amg_c_symdec_aggregator_tprol.f90 +++ b/amgprec/impl/aggregator/amg_c_symdec_aggregator_tprol.f90 @@ -86,8 +86,8 @@ subroutine amg_c_symdec_aggregator_build_tprol(ag,parms,ag_data,& class(amg_c_symdec_aggregator_type), target, intent(inout) :: ag type(amg_sml_parms), intent(inout) :: parms type(amg_saggr_data), intent(in) :: ag_data - type(psb_cspmat_type), intent(in) :: a - type(psb_desc_type), intent(in) :: desc_a + type(psb_cspmat_type), intent(inout) :: a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) type(psb_lcspmat_type), intent(out) :: op_prol integer(psb_ipk_), intent(out) :: info diff --git a/amgprec/impl/aggregator/amg_caggrmat_minnrg_bld.f90 b/amgprec/impl/aggregator/amg_caggrmat_minnrg_bld.f90 index e14001c6..612c2953 100644 --- a/amgprec/impl/aggregator/amg_caggrmat_minnrg_bld.f90 +++ b/amgprec/impl/aggregator/amg_caggrmat_minnrg_bld.f90 @@ -105,7 +105,7 @@ ! ! subroutine amg_caggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,& - & ac,desc_ac,op_prol,op_restr,info) + & ac,desc_ac,op_prol,op_restr,t_prol,info) use psb_base_mod use amg_base_prec_type use amg_c_inner_mod, amg_protect_name => amg_caggrmat_minnrg_bld @@ -117,8 +117,8 @@ subroutine amg_caggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,& type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_sml_parms), intent(inout) :: parms - type(psb_lcspmat_type), intent(inout) :: op_prol - type(psb_lcspmat_type), intent(out) :: ac,op_restr + type(psb_lcspmat_type), intent(inout) :: t_prol + type(psb_cspmat_type), intent(inout) :: op_prol, ac,op_restr type(psb_desc_type), intent(inout) :: desc_ac integer(psb_ipk_), intent(out) :: info @@ -171,6 +171,8 @@ subroutine amg_caggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,& filter_mat = (parms%aggr_filter == amg_filter_mat_) + !NEEDS TO BE REWORKED !! + ! naggr: number of local aggregates ! nrow: local rows. ! @@ -183,361 +185,361 @@ subroutine amg_caggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,& goto 9999 end if - ! Get the diagonal D - adiag = a%get_diag(info) - if (info == psb_success_) & - & call psb_realloc(ncol,adiag,info) - if (info == psb_success_) & - & call psb_halo(adiag,desc_a,info) - if (info == psb_success_) call a%cp_to_l(la) - if (info /= psb_success_) then - call psb_errpush(psb_err_from_subroutine_,name,a_err='sp_getdiag') - goto 9999 - end if - - do i=1,size(adiag) - if (adiag(i) /= czero) then - adinv(i) = cone / adiag(i) - else - adinv(i) = cone - end if - end do - - - - ! 1. Allocate Ptilde in sparse matrix form - call op_prol%mv_to(tmpcoo) - call ptilde%mv_from(tmpcoo) - call ptilde%cscnv(info,type='csr') - - if (info == psb_success_) call la%cscnv(am3,info,type='csr',dupl=psb_dupl_add_) - if (info == psb_success_) call la%cscnv(da,info,type='csr',dupl=psb_dupl_add_) - if (info /= psb_success_) then - call psb_errpush(psb_err_from_subroutine_,name,a_err='spcnv') - goto 9999 - end if - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & ' Initial copies done.' - - call da%scal(adinv,info) - - call psb_spspmm(da,ptilde,dap,info) - - if(info /= psb_success_) then - call psb_errpush(psb_err_from_subroutine_,name,a_err='spspmm 1') - goto 9999 - end if - - call dap%clone(atmp,info) - - call psb_sphalo(atmp,desc_a,am4,info,& - & colcnv=.false.,rowscale=.true.,outfmt='CSR ') - if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=am4) - if (info == psb_success_) call am4%free() - - call psb_spspmm(da,atmp,dadap,info) - call atmp%free() - - ! !$ write(0,*) 'Columns of AP',psb_sp_get_ncols(ap) - ! !$ write(0,*) 'Columns of ADAP',psb_sp_get_ncols(adap) - call dap%mv_to(csc_dap) - call dadap%mv_to(csc_dadap) - - call csc_mat_col_prod(csc_dap,csc_dadap,omp,info) - call csc_mat_col_prod(csc_dadap,csc_dadap,oden,info) - call psb_sum(ctxt,omp) - call psb_sum(ctxt,oden) - ! !$ write(0,*) trim(name),' OMP :',omp - ! !$ write(0,*) trim(name),' ODEN:',oden - - omp = omp/oden - - ! !$ write(0,*) 'Check on output prolongator ',omp(1:min(size(omp),10)) - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done NUMBMM 1' - - call am3%mv_to(acsr3) - ! Compute omega_int - ommx = czero - do i=1, ncol - if (ilaggr(i) >0) then - omi(i) = omp(ilaggr(i)) - else - omi(i) = czero - end if - if(abs(omi(i)) .gt. abs(ommx)) ommx = omi(i) - end do - ! Compute omega_fine - do i=1, nrow - omf(i) = ommx - do j=acsr3%irp(i),acsr3%irp(i+1)-1 - if(abs(omi(acsr3%ja(j))) .lt. abs(omf(i))) omf(i)=omi(acsr3%ja(j)) - end do -!!$ if(min(real(omf(i)),aimag(omf(i))) < szero) omf(i) = czero - if(psb_minreal(omf(i)) < szero) omf(i) = czero - end do - - omf(1:nrow) = omf(1:nrow) * adinv(1:nrow) - - if (filter_mat) then - ! - ! Build the filtered matrix Af from A - ! - call la%cscnv(acsrf,info,dupl=psb_dupl_add_) - - do i=1,nrow - tmp = czero - jd = -1 - do j=acsrf%irp(i),acsrf%irp(i+1)-1 - if (acsrf%ja(j) == i) jd = j - if (abs(acsrf%val(j)) < theta*sqrt(abs(adiag(i)*adiag(acsrf%ja(j))))) then - tmp=tmp+acsrf%val(j) - acsrf%val(j)=czero - endif - enddo - if (jd == -1) then - write(0,*) 'Wrong input: we need the diagonal!!!!', i - else - acsrf%val(jd)=acsrf%val(jd)-tmp - end if - enddo - ! Take out zeroed terms - call acsrf%clean_zeros(info) - - ! - ! Build the smoothed prolongator using the filtered matrix - ! - do i=1,acsrf%get_nrows() - do j=acsrf%irp(i),acsrf%irp(i+1)-1 - if (acsrf%ja(j) == i) then - acsrf%val(j) = cone - omf(i)*acsrf%val(j) - else - acsrf%val(j) = - omf(i)*acsrf%val(j) - end if - end do - end do - - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done gather, going for SYMBMM 1' - - call af%mv_from(acsrf) - ! - ! op_prol = (I-w*D*Af)Ptilde - ! Doing it this way means to consider diag(Af_i) - ! - ! - call psb_spspmm(af,ptilde,op_prol,info) - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done SPSPMM 1' - else - ! - ! Build the smoothed prolongator using the original matrix - ! - do i=1,acsr3%get_nrows() - do j=acsr3%irp(i),acsr3%irp(i+1)-1 - if (acsr3%ja(j) == i) then - acsr3%val(j) = cone - omf(i)*acsr3%val(j) - else - acsr3%val(j) = - omf(i)*acsr3%val(j) - end if - end do - end do - - call am3%mv_from(acsr3) - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done gather, going for SYMBMM 1' - ! - ! - ! op_prol = (I-w*D*A)Ptilde - ! - ! - call psb_spspmm(am3,ptilde,op_prol,info) - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done NUMBMM 1' - - end if - - - ! - ! Ok, let's start over with the restrictor - ! - call ptilde%transc(rtilde) - call la%cscnv(atmp,info,type='csr') - call psb_sphalo(atmp,desc_a,am4,info,& - & colcnv=.true.,rowscale=.true.) - nrt = am4%get_nrows() - call am4%csclip(atmp2,info,lone,nrt,lone,ncol) - call atmp2%cscnv(info,type='CSR') - if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=atmp2) - call am4%free() - call atmp2%free() - - ! This is to compute the transpose. It ONLY works if the - ! original A has a symmetric pattern. - call atmp%transc(atmp2) - call atmp2%csclip(dat,info,lone,nrow,lone,ncol) - call dat%cscnv(info,type='csr') - call dat%scal(adinv,info) - - ! Now for the product. - call psb_spspmm(dat,ptilde,datp,info) - - call datp%clone(atmp2,info) - call psb_sphalo(atmp2,desc_a,am4,info,& - & colcnv=.false.,rowscale=.true.,outfmt='CSR ') - if (info == psb_success_) call psb_rwextd(ncol,atmp2,info,b=am4) - if (info == psb_success_) call am4%free() - - - call psb_symbmm(dat,atmp2,datdatp,info) - call psb_numbmm(dat,atmp2,datdatp) - call atmp2%free() - - call datp%mv_to(csc_datp) - call datdatp%mv_to(csc_datdatp) - - call csc_mat_col_prod(csc_datp,csc_datdatp,omp,info) - call csc_mat_col_prod(csc_datdatp,csc_datdatp,oden,info) - call psb_sum(ctxt,omp) - call psb_sum(ctxt,oden) - - - ! !$ write(debug_unit,*) trim(name),' OMP_R :',omp - ! ! $ write(debug_unit,*) trim(name),' ODEN_R:',oden - omp = omp/oden - ! !$ write(0,*) 'Check on output restrictor',omp(1:min(size(omp),10)) - ! Compute omega_int - ommx = czero - do i=1, ncol - if (ilaggr(i) >0) then - omi(i) = omp(ilaggr(i)) - else - omi(i) = czero - end if - if(abs(omi(i)) .gt. abs(ommx)) ommx = omi(i) - end do - ! Compute omega_fine - ! Going over the columns of atmp means going over the rows - ! of A^T. Hopefully ;-) - call atmp%cp_to(acsc) - - do i=1, nrow - omf(i) = ommx - do j= acsc%icp(i),acsc%icp(i+1)-1 - if(abs(omi(acsc%ia(j))) .lt. abs(omf(i))) omf(i)=omi(acsc%ia(j)) - end do -!!$ if(min(real(omf(i)),aimag(omf(i))) < szero) omf(i) = czero - if(psb_minreal(omf(i)) < szero) omf(i) = czero - end do - omf(1:nrow) = omf(1:nrow)*adinv(1:nrow) - call psb_halo(omf,desc_a,info) - call acsc%free() - - - call atmp%mv_to(acsr1) - - do i=1,acsr1%get_nrows() - do j=acsr1%irp(i),acsr1%irp(i+1)-1 - if (acsr1%ja(j) == i) then - acsr1%val(j) = cone - acsr1%val(j)*omf(acsr1%ja(j)) - else - acsr1%val(j) = - acsr1%val(j)*omf(acsr1%ja(j)) - end if - end do - end do - call atmp%mv_from(acsr1) - - call rtilde%mv_to(tmpcoo) - nzl = tmpcoo%get_nzeros() - i=0 - do k=1, nzl - if ((naggrm1 < tmpcoo%ia(k)) .and. (tmpcoo%ia(k) <= naggrp1)) then - i = i+1 - tmpcoo%val(i) = tmpcoo%val(k) - tmpcoo%ia(i) = tmpcoo%ia(k) - tmpcoo%ja(i) = tmpcoo%ja(k) - end if - end do - call tmpcoo%set_nzeros(i) - call rtilde%mv_from(tmpcoo) - call rtilde%cscnv(info,type='csr') - - call psb_spspmm(rtilde,atmp,op_restr,info) - - ! - ! Now we have to gather the halo of op_prol, and add it to itself - ! to multiply it by A, - ! - call op_prol%clone(tmp_prol,info) - if (info == psb_success_) call psb_sphalo(tmp_prol,desc_a,am4,info,& - & colcnv=.false.,rowscale=.true.) - if (info == psb_success_) call psb_rwextd(ncol,tmp_prol,info,b=am4) - if (info == psb_success_) call am4%free() - - if(info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='Halo of op_prol') - goto 9999 - end if - - ! - ! Now we have to fix this. The only rows of B that are correct - ! are those corresponding to "local" aggregates, i.e. indices in ilaggr(:) - ! - call op_restr%mv_to(tmpcoo) - - nzl = tmpcoo%get_nzeros() - i=0 - do k=1, nzl - if ((naggrm1 < tmpcoo%ia(k)) .and. (tmpcoo%ia(k) <= naggrp1)) then - i = i+1 - tmpcoo%val(i) = tmpcoo%val(k) - tmpcoo%ia(i) = tmpcoo%ia(k) - tmpcoo%ja(i) = tmpcoo%ja(k) - end if - end do - call tmpcoo%set_nzeros(i) - call op_restr%mv_from(tmpcoo) - call op_restr%cscnv(info,type='csr') - - - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'starting sphalo/ rwxtd' - - call psb_spspmm(la,tmp_prol,am3,info) - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done SPSPMM 2' - - call psb_sphalo(am3,desc_a,am4,info,& - & colcnv=.false.,rowscale=.true.) - if (info == psb_success_) call psb_rwextd(ncol,am3,info,b=am4) - if (info == psb_success_) call am4%free() - - if(info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,& - & a_err='Extend am3') - goto 9999 - end if - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done sphalo/ rwxtd' - - call psb_spspmm(op_restr,am3,ac,info) - if (info == psb_success_) call am3%free() - if (info == psb_success_) call ac%cscnv(info,type='coo',dupl=psb_dupl_add_) - - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,& - &a_err='Build ac = op_restr x am3') - goto 9999 - end if +!!$ ! Get the diagonal D +!!$ adiag = a%get_diag(info) +!!$ if (info == psb_success_) & +!!$ & call psb_realloc(ncol,adiag,info) +!!$ if (info == psb_success_) & +!!$ & call psb_halo(adiag,desc_a,info) +!!$ if (info == psb_success_) call a%cp_to_l(la) +!!$ if (info /= psb_success_) then +!!$ call psb_errpush(psb_err_from_subroutine_,name,a_err='sp_getdiag') +!!$ goto 9999 +!!$ end if +!!$ +!!$ do i=1,size(adiag) +!!$ if (adiag(i) /= czero) then +!!$ adinv(i) = cone / adiag(i) +!!$ else +!!$ adinv(i) = cone +!!$ end if +!!$ end do +!!$ +!!$ +!!$ +!!$ ! 1. Allocate Ptilde in sparse matrix form +!!$ call op_prol%mv_to(tmpcoo) +!!$ call ptilde%mv_from(tmpcoo) +!!$ call ptilde%cscnv(info,type='csr') +!!$ +!!$ if (info == psb_success_) call la%cscnv(am3,info,type='csr',dupl=psb_dupl_add_) +!!$ if (info == psb_success_) call la%cscnv(da,info,type='csr',dupl=psb_dupl_add_) +!!$ if (info /= psb_success_) then +!!$ call psb_errpush(psb_err_from_subroutine_,name,a_err='spcnv') +!!$ goto 9999 +!!$ end if +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & ' Initial copies done.' +!!$ +!!$ call da%scal(adinv,info) +!!$ +!!$ call psb_spspmm(da,ptilde,dap,info) +!!$ +!!$ if(info /= psb_success_) then +!!$ call psb_errpush(psb_err_from_subroutine_,name,a_err='spspmm 1') +!!$ goto 9999 +!!$ end if +!!$ +!!$ call dap%clone(atmp,info) +!!$ +!!$ call psb_sphalo(atmp,desc_a,am4,info,& +!!$ & colcnv=.false.,rowscale=.true.,outfmt='CSR ') +!!$ if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=am4) +!!$ if (info == psb_success_) call am4%free() +!!$ +!!$ call psb_spspmm(da,atmp,dadap,info) +!!$ call atmp%free() +!!$ +!!$ ! !$ write(0,*) 'Columns of AP',psb_sp_get_ncols(ap) +!!$ ! !$ write(0,*) 'Columns of ADAP',psb_sp_get_ncols(adap) +!!$ call dap%mv_to(csc_dap) +!!$ call dadap%mv_to(csc_dadap) +!!$ +!!$ call csc_mat_col_prod(csc_dap,csc_dadap,omp,info) +!!$ call csc_mat_col_prod(csc_dadap,csc_dadap,oden,info) +!!$ call psb_sum(ctxt,omp) +!!$ call psb_sum(ctxt,oden) +!!$ ! !$ write(0,*) trim(name),' OMP :',omp +!!$ ! !$ write(0,*) trim(name),' ODEN:',oden +!!$ +!!$ omp = omp/oden +!!$ +!!$ ! !$ write(0,*) 'Check on output prolongator ',omp(1:min(size(omp),10)) +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done NUMBMM 1' +!!$ +!!$ call am3%mv_to(acsr3) +!!$ ! Compute omega_int +!!$ ommx = czero +!!$ do i=1, ncol +!!$ if (ilaggr(i) >0) then +!!$ omi(i) = omp(ilaggr(i)) +!!$ else +!!$ omi(i) = czero +!!$ end if +!!$ if(abs(omi(i)) .gt. abs(ommx)) ommx = omi(i) +!!$ end do +!!$ ! Compute omega_fine +!!$ do i=1, nrow +!!$ omf(i) = ommx +!!$ do j=acsr3%irp(i),acsr3%irp(i+1)-1 +!!$ if(abs(omi(acsr3%ja(j))) .lt. abs(omf(i))) omf(i)=omi(acsr3%ja(j)) +!!$ end do +!!$ ! ! if(min(real(omf(i)),aimag(omf(i))) < szero) omf(i) = czero +!!$ if(psb_minreal(omf(i)) < szero) omf(i) = czero +!!$ end do +!!$ +!!$ omf(1:nrow) = omf(1:nrow) * adinv(1:nrow) +!!$ +!!$ if (filter_mat) then +!!$ ! +!!$ ! Build the filtered matrix Af from A +!!$ ! +!!$ call la%cscnv(acsrf,info,dupl=psb_dupl_add_) +!!$ +!!$ do i=1,nrow +!!$ tmp = czero +!!$ jd = -1 +!!$ do j=acsrf%irp(i),acsrf%irp(i+1)-1 +!!$ if (acsrf%ja(j) == i) jd = j +!!$ if (abs(acsrf%val(j)) < theta*sqrt(abs(adiag(i)*adiag(acsrf%ja(j))))) then +!!$ tmp=tmp+acsrf%val(j) +!!$ acsrf%val(j)=czero +!!$ endif +!!$ enddo +!!$ if (jd == -1) then +!!$ write(0,*) 'Wrong input: we need the diagonal!!!!', i +!!$ else +!!$ acsrf%val(jd)=acsrf%val(jd)-tmp +!!$ end if +!!$ enddo +!!$ ! Take out zeroed terms +!!$ call acsrf%clean_zeros(info) +!!$ +!!$ ! +!!$ ! Build the smoothed prolongator using the filtered matrix +!!$ ! +!!$ do i=1,acsrf%get_nrows() +!!$ do j=acsrf%irp(i),acsrf%irp(i+1)-1 +!!$ if (acsrf%ja(j) == i) then +!!$ acsrf%val(j) = cone - omf(i)*acsrf%val(j) +!!$ else +!!$ acsrf%val(j) = - omf(i)*acsrf%val(j) +!!$ end if +!!$ end do +!!$ end do +!!$ +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done gather, going for SYMBMM 1' +!!$ +!!$ call af%mv_from(acsrf) +!!$ ! +!!$ ! op_prol = (I-w*D*Af)Ptilde +!!$ ! Doing it this way means to consider diag(Af_i) +!!$ ! +!!$ ! +!!$ call psb_spspmm(af,ptilde,op_prol,info) +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done SPSPMM 1' +!!$ else +!!$ ! +!!$ ! Build the smoothed prolongator using the original matrix +!!$ ! +!!$ do i=1,acsr3%get_nrows() +!!$ do j=acsr3%irp(i),acsr3%irp(i+1)-1 +!!$ if (acsr3%ja(j) == i) then +!!$ acsr3%val(j) = cone - omf(i)*acsr3%val(j) +!!$ else +!!$ acsr3%val(j) = - omf(i)*acsr3%val(j) +!!$ end if +!!$ end do +!!$ end do +!!$ +!!$ call am3%mv_from(acsr3) +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done gather, going for SYMBMM 1' +!!$ ! +!!$ ! +!!$ ! op_prol = (I-w*D*A)Ptilde +!!$ ! +!!$ ! +!!$ call psb_spspmm(am3,ptilde,op_prol,info) +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done NUMBMM 1' +!!$ +!!$ end if +!!$ +!!$ +!!$ ! +!!$ ! Ok, let's start over with the restrictor +!!$ ! +!!$ call ptilde%transc(rtilde) +!!$ call la%cscnv(atmp,info,type='csr') +!!$ call psb_sphalo(atmp,desc_a,am4,info,& +!!$ & colcnv=.true.,rowscale=.true.) +!!$ nrt = am4%get_nrows() +!!$ call am4%csclip(atmp2,info,lone,nrt,lone,ncol) +!!$ call atmp2%cscnv(info,type='CSR') +!!$ if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=atmp2) +!!$ call am4%free() +!!$ call atmp2%free() +!!$ +!!$ ! This is to compute the transpose. It ONLY works if the +!!$ ! original A has a symmetric pattern. +!!$ call atmp%transc(atmp2) +!!$ call atmp2%csclip(dat,info,lone,nrow,lone,ncol) +!!$ call dat%cscnv(info,type='csr') +!!$ call dat%scal(adinv,info) +!!$ +!!$ ! Now for the product. +!!$ call psb_spspmm(dat,ptilde,datp,info) +!!$ +!!$ call datp%clone(atmp2,info) +!!$ call psb_sphalo(atmp2,desc_a,am4,info,& +!!$ & colcnv=.false.,rowscale=.true.,outfmt='CSR ') +!!$ if (info == psb_success_) call psb_rwextd(ncol,atmp2,info,b=am4) +!!$ if (info == psb_success_) call am4%free() +!!$ +!!$ +!!$ call psb_symbmm(dat,atmp2,datdatp,info) +!!$ call psb_numbmm(dat,atmp2,datdatp) +!!$ call atmp2%free() +!!$ +!!$ call datp%mv_to(csc_datp) +!!$ call datdatp%mv_to(csc_datdatp) +!!$ +!!$ call csc_mat_col_prod(csc_datp,csc_datdatp,omp,info) +!!$ call csc_mat_col_prod(csc_datdatp,csc_datdatp,oden,info) +!!$ call psb_sum(ctxt,omp) +!!$ call psb_sum(ctxt,oden) +!!$ +!!$ +!!$ ! !$ write(debug_unit,*) trim(name),' OMP_R :',omp +!!$ ! ! $ write(debug_unit,*) trim(name),' ODEN_R:',oden +!!$ omp = omp/oden +!!$ ! !$ write(0,*) 'Check on output restrictor',omp(1:min(size(omp),10)) +!!$ ! Compute omega_int +!!$ ommx = czero +!!$ do i=1, ncol +!!$ if (ilaggr(i) >0) then +!!$ omi(i) = omp(ilaggr(i)) +!!$ else +!!$ omi(i) = czero +!!$ end if +!!$ if(abs(omi(i)) .gt. abs(ommx)) ommx = omi(i) +!!$ end do +!!$ ! Compute omega_fine +!!$ ! Going over the columns of atmp means going over the rows +!!$ ! of A^T. Hopefully ;-) +!!$ call atmp%cp_to(acsc) +!!$ +!!$ do i=1, nrow +!!$ omf(i) = ommx +!!$ do j= acsc%icp(i),acsc%icp(i+1)-1 +!!$ if(abs(omi(acsc%ia(j))) .lt. abs(omf(i))) omf(i)=omi(acsc%ia(j)) +!!$ end do +!!$ ! ! if(min(real(omf(i)),aimag(omf(i))) < szero) omf(i) = czero +!!$ if(psb_minreal(omf(i)) < szero) omf(i) = czero +!!$ end do +!!$ omf(1:nrow) = omf(1:nrow)*adinv(1:nrow) +!!$ call psb_halo(omf,desc_a,info) +!!$ call acsc%free() +!!$ +!!$ +!!$ call atmp%mv_to(acsr1) +!!$ +!!$ do i=1,acsr1%get_nrows() +!!$ do j=acsr1%irp(i),acsr1%irp(i+1)-1 +!!$ if (acsr1%ja(j) == i) then +!!$ acsr1%val(j) = cone - acsr1%val(j)*omf(acsr1%ja(j)) +!!$ else +!!$ acsr1%val(j) = - acsr1%val(j)*omf(acsr1%ja(j)) +!!$ end if +!!$ end do +!!$ end do +!!$ call atmp%mv_from(acsr1) +!!$ +!!$ call rtilde%mv_to(tmpcoo) +!!$ nzl = tmpcoo%get_nzeros() +!!$ i=0 +!!$ do k=1, nzl +!!$ if ((naggrm1 < tmpcoo%ia(k)) .and. (tmpcoo%ia(k) <= naggrp1)) then +!!$ i = i+1 +!!$ tmpcoo%val(i) = tmpcoo%val(k) +!!$ tmpcoo%ia(i) = tmpcoo%ia(k) +!!$ tmpcoo%ja(i) = tmpcoo%ja(k) +!!$ end if +!!$ end do +!!$ call tmpcoo%set_nzeros(i) +!!$ call rtilde%mv_from(tmpcoo) +!!$ call rtilde%cscnv(info,type='csr') +!!$ +!!$ call psb_spspmm(rtilde,atmp,op_restr,info) +!!$ +!!$ ! +!!$ ! Now we have to gather the halo of op_prol, and add it to itself +!!$ ! to multiply it by A, +!!$ ! +!!$ call op_prol%clone(tmp_prol,info) +!!$ if (info == psb_success_) call psb_sphalo(tmp_prol,desc_a,am4,info,& +!!$ & colcnv=.false.,rowscale=.true.) +!!$ if (info == psb_success_) call psb_rwextd(ncol,tmp_prol,info,b=am4) +!!$ if (info == psb_success_) call am4%free() +!!$ +!!$ if(info /= psb_success_) then +!!$ call psb_errpush(psb_err_internal_error_,name,a_err='Halo of op_prol') +!!$ goto 9999 +!!$ end if +!!$ +!!$ ! +!!$ ! Now we have to fix this. The only rows of B that are correct +!!$ ! are those corresponding to "local" aggregates, i.e. indices in ilaggr(:) +!!$ ! +!!$ call op_restr%mv_to(tmpcoo) +!!$ +!!$ nzl = tmpcoo%get_nzeros() +!!$ i=0 +!!$ do k=1, nzl +!!$ if ((naggrm1 < tmpcoo%ia(k)) .and. (tmpcoo%ia(k) <= naggrp1)) then +!!$ i = i+1 +!!$ tmpcoo%val(i) = tmpcoo%val(k) +!!$ tmpcoo%ia(i) = tmpcoo%ia(k) +!!$ tmpcoo%ja(i) = tmpcoo%ja(k) +!!$ end if +!!$ end do +!!$ call tmpcoo%set_nzeros(i) +!!$ call op_restr%mv_from(tmpcoo) +!!$ call op_restr%cscnv(info,type='csr') +!!$ +!!$ +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'starting sphalo/ rwxtd' +!!$ +!!$ call psb_spspmm(la,tmp_prol,am3,info) +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done SPSPMM 2' +!!$ +!!$ call psb_sphalo(am3,desc_a,am4,info,& +!!$ & colcnv=.false.,rowscale=.true.) +!!$ if (info == psb_success_) call psb_rwextd(ncol,am3,info,b=am4) +!!$ if (info == psb_success_) call am4%free() +!!$ +!!$ if(info /= psb_success_) then +!!$ call psb_errpush(psb_err_internal_error_,name,& +!!$ & a_err='Extend am3') +!!$ goto 9999 +!!$ end if +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done sphalo/ rwxtd' +!!$ +!!$ call psb_spspmm(op_restr,am3,ac,info) +!!$ if (info == psb_success_) call am3%free() +!!$ if (info == psb_success_) call ac%cscnv(info,type='coo',dupl=psb_dupl_add_) +!!$ +!!$ if (info /= psb_success_) then +!!$ call psb_errpush(psb_err_internal_error_,name,& +!!$ &a_err='Build ac = op_restr x am3') +!!$ goto 9999 +!!$ end if diff --git a/amgprec/impl/aggregator/amg_caggrmat_smth_bld.f90 b/amgprec/impl/aggregator/amg_caggrmat_smth_bld.f90 index 03029f40..53e740fe 100644 --- a/amgprec/impl/aggregator/amg_caggrmat_smth_bld.f90 +++ b/amgprec/impl/aggregator/amg_caggrmat_smth_bld.f90 @@ -116,7 +116,7 @@ subroutine amg_caggrmat_smth_bld(a,desc_a,ilaggr,nlaggr,parms,& type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_sml_parms), intent(inout) :: parms - type(psb_cspmat_type), intent(out) :: op_prol,ac,op_restr + type(psb_cspmat_type), intent(inout) :: op_prol,ac,op_restr type(psb_lcspmat_type), intent(inout) :: t_prol type(psb_desc_type), intent(inout) :: desc_ac integer(psb_ipk_), intent(out) :: info diff --git a/amgprec/impl/aggregator/amg_d_dec_aggregator_tprol.f90 b/amgprec/impl/aggregator/amg_d_dec_aggregator_tprol.f90 index e3d1e73c..2edcca6c 100644 --- a/amgprec/impl/aggregator/amg_d_dec_aggregator_tprol.f90 +++ b/amgprec/impl/aggregator/amg_d_dec_aggregator_tprol.f90 @@ -83,8 +83,8 @@ subroutine amg_d_dec_aggregator_build_tprol(ag,parms,ag_data,& class(amg_d_dec_aggregator_type), target, intent(inout) :: ag type(amg_dml_parms), intent(inout) :: parms type(amg_daggr_data), intent(in) :: ag_data - type(psb_dspmat_type), intent(in) :: a - type(psb_desc_type), intent(in) :: desc_a + type(psb_dspmat_type), intent(inout) :: a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) type(psb_ldspmat_type), intent(out) :: t_prol integer(psb_ipk_), intent(out) :: info diff --git a/amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 b/amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 index 8559fae0..16cc7b2e 100644 --- a/amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 +++ b/amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 @@ -58,7 +58,7 @@ subroutine amg_d_parmatch_aggregator_build_tprol(ag,parms,ag_data,& type(amg_dml_parms), intent(inout) :: parms type(amg_daggr_data), intent(in) :: ag_data type(psb_dspmat_type), intent(inout) :: a - type(psb_desc_type), intent(inout) :: desc_a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) type(psb_ldspmat_type), intent(out) :: t_prol integer(psb_ipk_), intent(out) :: info diff --git a/amgprec/impl/aggregator/amg_d_parmatch_smth_bld.F90 b/amgprec/impl/aggregator/amg_d_parmatch_smth_bld.F90 index 80022b73..2ad6388d 100644 --- a/amgprec/impl/aggregator/amg_d_parmatch_smth_bld.F90 +++ b/amgprec/impl/aggregator/amg_d_parmatch_smth_bld.F90 @@ -122,7 +122,7 @@ subroutine amg_d_parmatch_smth_bld(ag,a,desc_a,ilaggr,nlaggr,parms,& integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_dml_parms), intent(inout) :: parms type(psb_ldspmat_type), intent(inout) :: t_prol - type(psb_dspmat_type), intent(out) :: op_prol,ac,op_restr + type(psb_dspmat_type), intent(inout) :: op_prol,ac,op_restr type(psb_desc_type), intent(inout) :: desc_ac integer(psb_ipk_), intent(out) :: info diff --git a/amgprec/impl/aggregator/amg_d_parmatch_spmm_bld.F90 b/amgprec/impl/aggregator/amg_d_parmatch_spmm_bld.F90 index 0311f274..7faf408a 100644 --- a/amgprec/impl/aggregator/amg_d_parmatch_spmm_bld.F90 +++ b/amgprec/impl/aggregator/amg_d_parmatch_spmm_bld.F90 @@ -108,7 +108,7 @@ subroutine amg_d_parmatch_spmm_bld(a,desc_a,ilaggr,nlaggr,parms,& ! Arguments type(psb_dspmat_type), intent(in) :: a - type(psb_desc_type), intent(in) :: desc_a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_dml_parms), intent(inout) :: parms type(psb_ldspmat_type), intent(inout) :: t_prol diff --git a/amgprec/impl/aggregator/amg_d_parmatch_spmm_bld_inner.F90 b/amgprec/impl/aggregator/amg_d_parmatch_spmm_bld_inner.F90 index a2917e83..04d89b2f 100644 --- a/amgprec/impl/aggregator/amg_d_parmatch_spmm_bld_inner.F90 +++ b/amgprec/impl/aggregator/amg_d_parmatch_spmm_bld_inner.F90 @@ -108,11 +108,11 @@ subroutine amg_d_parmatch_spmm_bld_inner(a_csr,desc_a,ilaggr,nlaggr,parms,& ! Arguments type(psb_d_csr_sparse_mat), intent(inout) :: a_csr - type(psb_desc_type), intent(in) :: desc_a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_dml_parms), intent(inout) :: parms type(psb_ldspmat_type), intent(inout) :: t_prol - type(psb_dspmat_type), intent(out) :: ac, op_prol, op_restr + type(psb_dspmat_type), intent(inout) :: ac, op_prol, op_restr type(psb_desc_type), intent(out) :: desc_ac integer(psb_ipk_), intent(out) :: info diff --git a/amgprec/impl/aggregator/amg_d_parmatch_spmm_bld_ov.F90 b/amgprec/impl/aggregator/amg_d_parmatch_spmm_bld_ov.F90 index 2b35c797..e3d3b262 100644 --- a/amgprec/impl/aggregator/amg_d_parmatch_spmm_bld_ov.F90 +++ b/amgprec/impl/aggregator/amg_d_parmatch_spmm_bld_ov.F90 @@ -108,7 +108,7 @@ subroutine amg_d_parmatch_spmm_bld_ov(a,desc_a,ilaggr,nlaggr,parms,& ! Arguments type(psb_dspmat_type), intent(inout) :: a - type(psb_desc_type), intent(in) :: desc_a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_dml_parms), intent(inout) :: parms type(psb_ldspmat_type), intent(inout) :: t_prol diff --git a/amgprec/impl/aggregator/amg_d_symdec_aggregator_tprol.f90 b/amgprec/impl/aggregator/amg_d_symdec_aggregator_tprol.f90 index 35efe63d..e4b2fd6e 100644 --- a/amgprec/impl/aggregator/amg_d_symdec_aggregator_tprol.f90 +++ b/amgprec/impl/aggregator/amg_d_symdec_aggregator_tprol.f90 @@ -86,8 +86,8 @@ subroutine amg_d_symdec_aggregator_build_tprol(ag,parms,ag_data,& class(amg_d_symdec_aggregator_type), target, intent(inout) :: ag type(amg_dml_parms), intent(inout) :: parms type(amg_daggr_data), intent(in) :: ag_data - type(psb_dspmat_type), intent(in) :: a - type(psb_desc_type), intent(in) :: desc_a + type(psb_dspmat_type), intent(inout) :: a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) type(psb_ldspmat_type), intent(out) :: op_prol integer(psb_ipk_), intent(out) :: info diff --git a/amgprec/impl/aggregator/amg_daggrmat_minnrg_bld.f90 b/amgprec/impl/aggregator/amg_daggrmat_minnrg_bld.f90 index fc5728a6..f7b21847 100644 --- a/amgprec/impl/aggregator/amg_daggrmat_minnrg_bld.f90 +++ b/amgprec/impl/aggregator/amg_daggrmat_minnrg_bld.f90 @@ -105,7 +105,7 @@ ! ! subroutine amg_daggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,& - & ac,desc_ac,op_prol,op_restr,info) + & ac,desc_ac,op_prol,op_restr,t_prol,info) use psb_base_mod use amg_base_prec_type use amg_d_inner_mod, amg_protect_name => amg_daggrmat_minnrg_bld @@ -117,8 +117,8 @@ subroutine amg_daggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,& type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_dml_parms), intent(inout) :: parms - type(psb_ldspmat_type), intent(inout) :: op_prol - type(psb_ldspmat_type), intent(out) :: ac,op_restr + type(psb_ldspmat_type), intent(inout) :: t_prol + type(psb_dspmat_type), intent(inout) :: op_prol, ac,op_restr type(psb_desc_type), intent(inout) :: desc_ac integer(psb_ipk_), intent(out) :: info @@ -171,6 +171,8 @@ subroutine amg_daggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,& filter_mat = (parms%aggr_filter == amg_filter_mat_) + !NEEDS TO BE REWORKED !! + ! naggr: number of local aggregates ! nrow: local rows. ! @@ -183,361 +185,361 @@ subroutine amg_daggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,& goto 9999 end if - ! Get the diagonal D - adiag = a%get_diag(info) - if (info == psb_success_) & - & call psb_realloc(ncol,adiag,info) - if (info == psb_success_) & - & call psb_halo(adiag,desc_a,info) - if (info == psb_success_) call a%cp_to_l(la) - if (info /= psb_success_) then - call psb_errpush(psb_err_from_subroutine_,name,a_err='sp_getdiag') - goto 9999 - end if - - do i=1,size(adiag) - if (adiag(i) /= dzero) then - adinv(i) = done / adiag(i) - else - adinv(i) = done - end if - end do - - - - ! 1. Allocate Ptilde in sparse matrix form - call op_prol%mv_to(tmpcoo) - call ptilde%mv_from(tmpcoo) - call ptilde%cscnv(info,type='csr') - - if (info == psb_success_) call la%cscnv(am3,info,type='csr',dupl=psb_dupl_add_) - if (info == psb_success_) call la%cscnv(da,info,type='csr',dupl=psb_dupl_add_) - if (info /= psb_success_) then - call psb_errpush(psb_err_from_subroutine_,name,a_err='spcnv') - goto 9999 - end if - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & ' Initial copies done.' - - call da%scal(adinv,info) - - call psb_spspmm(da,ptilde,dap,info) - - if(info /= psb_success_) then - call psb_errpush(psb_err_from_subroutine_,name,a_err='spspmm 1') - goto 9999 - end if - - call dap%clone(atmp,info) - - call psb_sphalo(atmp,desc_a,am4,info,& - & colcnv=.false.,rowscale=.true.,outfmt='CSR ') - if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=am4) - if (info == psb_success_) call am4%free() - - call psb_spspmm(da,atmp,dadap,info) - call atmp%free() - - ! !$ write(0,*) 'Columns of AP',psb_sp_get_ncols(ap) - ! !$ write(0,*) 'Columns of ADAP',psb_sp_get_ncols(adap) - call dap%mv_to(csc_dap) - call dadap%mv_to(csc_dadap) - - call csc_mat_col_prod(csc_dap,csc_dadap,omp,info) - call csc_mat_col_prod(csc_dadap,csc_dadap,oden,info) - call psb_sum(ctxt,omp) - call psb_sum(ctxt,oden) - ! !$ write(0,*) trim(name),' OMP :',omp - ! !$ write(0,*) trim(name),' ODEN:',oden - - omp = omp/oden - - ! !$ write(0,*) 'Check on output prolongator ',omp(1:min(size(omp),10)) - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done NUMBMM 1' - - call am3%mv_to(acsr3) - ! Compute omega_int - ommx = dzero - do i=1, ncol - if (ilaggr(i) >0) then - omi(i) = omp(ilaggr(i)) - else - omi(i) = dzero - end if - if(abs(omi(i)) .gt. abs(ommx)) ommx = omi(i) - end do - ! Compute omega_fine - do i=1, nrow - omf(i) = ommx - do j=acsr3%irp(i),acsr3%irp(i+1)-1 - if(abs(omi(acsr3%ja(j))) .lt. abs(omf(i))) omf(i)=omi(acsr3%ja(j)) - end do -!!$ if(min(real(omf(i)),aimag(omf(i))) < dzero) omf(i) = dzero - if(psb_minreal(omf(i)) < dzero) omf(i) = dzero - end do - - omf(1:nrow) = omf(1:nrow) * adinv(1:nrow) - - if (filter_mat) then - ! - ! Build the filtered matrix Af from A - ! - call la%cscnv(acsrf,info,dupl=psb_dupl_add_) - - do i=1,nrow - tmp = dzero - jd = -1 - do j=acsrf%irp(i),acsrf%irp(i+1)-1 - if (acsrf%ja(j) == i) jd = j - if (abs(acsrf%val(j)) < theta*sqrt(abs(adiag(i)*adiag(acsrf%ja(j))))) then - tmp=tmp+acsrf%val(j) - acsrf%val(j)=dzero - endif - enddo - if (jd == -1) then - write(0,*) 'Wrong input: we need the diagonal!!!!', i - else - acsrf%val(jd)=acsrf%val(jd)-tmp - end if - enddo - ! Take out zeroed terms - call acsrf%clean_zeros(info) - - ! - ! Build the smoothed prolongator using the filtered matrix - ! - do i=1,acsrf%get_nrows() - do j=acsrf%irp(i),acsrf%irp(i+1)-1 - if (acsrf%ja(j) == i) then - acsrf%val(j) = done - omf(i)*acsrf%val(j) - else - acsrf%val(j) = - omf(i)*acsrf%val(j) - end if - end do - end do - - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done gather, going for SYMBMM 1' - - call af%mv_from(acsrf) - ! - ! op_prol = (I-w*D*Af)Ptilde - ! Doing it this way means to consider diag(Af_i) - ! - ! - call psb_spspmm(af,ptilde,op_prol,info) - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done SPSPMM 1' - else - ! - ! Build the smoothed prolongator using the original matrix - ! - do i=1,acsr3%get_nrows() - do j=acsr3%irp(i),acsr3%irp(i+1)-1 - if (acsr3%ja(j) == i) then - acsr3%val(j) = done - omf(i)*acsr3%val(j) - else - acsr3%val(j) = - omf(i)*acsr3%val(j) - end if - end do - end do - - call am3%mv_from(acsr3) - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done gather, going for SYMBMM 1' - ! - ! - ! op_prol = (I-w*D*A)Ptilde - ! - ! - call psb_spspmm(am3,ptilde,op_prol,info) - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done NUMBMM 1' - - end if - - - ! - ! Ok, let's start over with the restrictor - ! - call ptilde%transc(rtilde) - call la%cscnv(atmp,info,type='csr') - call psb_sphalo(atmp,desc_a,am4,info,& - & colcnv=.true.,rowscale=.true.) - nrt = am4%get_nrows() - call am4%csclip(atmp2,info,lone,nrt,lone,ncol) - call atmp2%cscnv(info,type='CSR') - if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=atmp2) - call am4%free() - call atmp2%free() - - ! This is to compute the transpose. It ONLY works if the - ! original A has a symmetric pattern. - call atmp%transc(atmp2) - call atmp2%csclip(dat,info,lone,nrow,lone,ncol) - call dat%cscnv(info,type='csr') - call dat%scal(adinv,info) - - ! Now for the product. - call psb_spspmm(dat,ptilde,datp,info) - - call datp%clone(atmp2,info) - call psb_sphalo(atmp2,desc_a,am4,info,& - & colcnv=.false.,rowscale=.true.,outfmt='CSR ') - if (info == psb_success_) call psb_rwextd(ncol,atmp2,info,b=am4) - if (info == psb_success_) call am4%free() - - - call psb_symbmm(dat,atmp2,datdatp,info) - call psb_numbmm(dat,atmp2,datdatp) - call atmp2%free() - - call datp%mv_to(csc_datp) - call datdatp%mv_to(csc_datdatp) - - call csc_mat_col_prod(csc_datp,csc_datdatp,omp,info) - call csc_mat_col_prod(csc_datdatp,csc_datdatp,oden,info) - call psb_sum(ctxt,omp) - call psb_sum(ctxt,oden) - - - ! !$ write(debug_unit,*) trim(name),' OMP_R :',omp - ! ! $ write(debug_unit,*) trim(name),' ODEN_R:',oden - omp = omp/oden - ! !$ write(0,*) 'Check on output restrictor',omp(1:min(size(omp),10)) - ! Compute omega_int - ommx = dzero - do i=1, ncol - if (ilaggr(i) >0) then - omi(i) = omp(ilaggr(i)) - else - omi(i) = dzero - end if - if(abs(omi(i)) .gt. abs(ommx)) ommx = omi(i) - end do - ! Compute omega_fine - ! Going over the columns of atmp means going over the rows - ! of A^T. Hopefully ;-) - call atmp%cp_to(acsc) - - do i=1, nrow - omf(i) = ommx - do j= acsc%icp(i),acsc%icp(i+1)-1 - if(abs(omi(acsc%ia(j))) .lt. abs(omf(i))) omf(i)=omi(acsc%ia(j)) - end do -!!$ if(min(real(omf(i)),aimag(omf(i))) < dzero) omf(i) = dzero - if(psb_minreal(omf(i)) < dzero) omf(i) = dzero - end do - omf(1:nrow) = omf(1:nrow)*adinv(1:nrow) - call psb_halo(omf,desc_a,info) - call acsc%free() - - - call atmp%mv_to(acsr1) - - do i=1,acsr1%get_nrows() - do j=acsr1%irp(i),acsr1%irp(i+1)-1 - if (acsr1%ja(j) == i) then - acsr1%val(j) = done - acsr1%val(j)*omf(acsr1%ja(j)) - else - acsr1%val(j) = - acsr1%val(j)*omf(acsr1%ja(j)) - end if - end do - end do - call atmp%mv_from(acsr1) - - call rtilde%mv_to(tmpcoo) - nzl = tmpcoo%get_nzeros() - i=0 - do k=1, nzl - if ((naggrm1 < tmpcoo%ia(k)) .and. (tmpcoo%ia(k) <= naggrp1)) then - i = i+1 - tmpcoo%val(i) = tmpcoo%val(k) - tmpcoo%ia(i) = tmpcoo%ia(k) - tmpcoo%ja(i) = tmpcoo%ja(k) - end if - end do - call tmpcoo%set_nzeros(i) - call rtilde%mv_from(tmpcoo) - call rtilde%cscnv(info,type='csr') - - call psb_spspmm(rtilde,atmp,op_restr,info) - - ! - ! Now we have to gather the halo of op_prol, and add it to itself - ! to multiply it by A, - ! - call op_prol%clone(tmp_prol,info) - if (info == psb_success_) call psb_sphalo(tmp_prol,desc_a,am4,info,& - & colcnv=.false.,rowscale=.true.) - if (info == psb_success_) call psb_rwextd(ncol,tmp_prol,info,b=am4) - if (info == psb_success_) call am4%free() - - if(info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='Halo of op_prol') - goto 9999 - end if - - ! - ! Now we have to fix this. The only rows of B that are correct - ! are those corresponding to "local" aggregates, i.e. indices in ilaggr(:) - ! - call op_restr%mv_to(tmpcoo) - - nzl = tmpcoo%get_nzeros() - i=0 - do k=1, nzl - if ((naggrm1 < tmpcoo%ia(k)) .and. (tmpcoo%ia(k) <= naggrp1)) then - i = i+1 - tmpcoo%val(i) = tmpcoo%val(k) - tmpcoo%ia(i) = tmpcoo%ia(k) - tmpcoo%ja(i) = tmpcoo%ja(k) - end if - end do - call tmpcoo%set_nzeros(i) - call op_restr%mv_from(tmpcoo) - call op_restr%cscnv(info,type='csr') - - - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'starting sphalo/ rwxtd' - - call psb_spspmm(la,tmp_prol,am3,info) - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done SPSPMM 2' - - call psb_sphalo(am3,desc_a,am4,info,& - & colcnv=.false.,rowscale=.true.) - if (info == psb_success_) call psb_rwextd(ncol,am3,info,b=am4) - if (info == psb_success_) call am4%free() - - if(info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,& - & a_err='Extend am3') - goto 9999 - end if - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done sphalo/ rwxtd' - - call psb_spspmm(op_restr,am3,ac,info) - if (info == psb_success_) call am3%free() - if (info == psb_success_) call ac%cscnv(info,type='coo',dupl=psb_dupl_add_) - - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,& - &a_err='Build ac = op_restr x am3') - goto 9999 - end if +!!$ ! Get the diagonal D +!!$ adiag = a%get_diag(info) +!!$ if (info == psb_success_) & +!!$ & call psb_realloc(ncol,adiag,info) +!!$ if (info == psb_success_) & +!!$ & call psb_halo(adiag,desc_a,info) +!!$ if (info == psb_success_) call a%cp_to_l(la) +!!$ if (info /= psb_success_) then +!!$ call psb_errpush(psb_err_from_subroutine_,name,a_err='sp_getdiag') +!!$ goto 9999 +!!$ end if +!!$ +!!$ do i=1,size(adiag) +!!$ if (adiag(i) /= dzero) then +!!$ adinv(i) = done / adiag(i) +!!$ else +!!$ adinv(i) = done +!!$ end if +!!$ end do +!!$ +!!$ +!!$ +!!$ ! 1. Allocate Ptilde in sparse matrix form +!!$ call op_prol%mv_to(tmpcoo) +!!$ call ptilde%mv_from(tmpcoo) +!!$ call ptilde%cscnv(info,type='csr') +!!$ +!!$ if (info == psb_success_) call la%cscnv(am3,info,type='csr',dupl=psb_dupl_add_) +!!$ if (info == psb_success_) call la%cscnv(da,info,type='csr',dupl=psb_dupl_add_) +!!$ if (info /= psb_success_) then +!!$ call psb_errpush(psb_err_from_subroutine_,name,a_err='spcnv') +!!$ goto 9999 +!!$ end if +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & ' Initial copies done.' +!!$ +!!$ call da%scal(adinv,info) +!!$ +!!$ call psb_spspmm(da,ptilde,dap,info) +!!$ +!!$ if(info /= psb_success_) then +!!$ call psb_errpush(psb_err_from_subroutine_,name,a_err='spspmm 1') +!!$ goto 9999 +!!$ end if +!!$ +!!$ call dap%clone(atmp,info) +!!$ +!!$ call psb_sphalo(atmp,desc_a,am4,info,& +!!$ & colcnv=.false.,rowscale=.true.,outfmt='CSR ') +!!$ if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=am4) +!!$ if (info == psb_success_) call am4%free() +!!$ +!!$ call psb_spspmm(da,atmp,dadap,info) +!!$ call atmp%free() +!!$ +!!$ ! !$ write(0,*) 'Columns of AP',psb_sp_get_ncols(ap) +!!$ ! !$ write(0,*) 'Columns of ADAP',psb_sp_get_ncols(adap) +!!$ call dap%mv_to(csc_dap) +!!$ call dadap%mv_to(csc_dadap) +!!$ +!!$ call csc_mat_col_prod(csc_dap,csc_dadap,omp,info) +!!$ call csc_mat_col_prod(csc_dadap,csc_dadap,oden,info) +!!$ call psb_sum(ctxt,omp) +!!$ call psb_sum(ctxt,oden) +!!$ ! !$ write(0,*) trim(name),' OMP :',omp +!!$ ! !$ write(0,*) trim(name),' ODEN:',oden +!!$ +!!$ omp = omp/oden +!!$ +!!$ ! !$ write(0,*) 'Check on output prolongator ',omp(1:min(size(omp),10)) +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done NUMBMM 1' +!!$ +!!$ call am3%mv_to(acsr3) +!!$ ! Compute omega_int +!!$ ommx = dzero +!!$ do i=1, ncol +!!$ if (ilaggr(i) >0) then +!!$ omi(i) = omp(ilaggr(i)) +!!$ else +!!$ omi(i) = dzero +!!$ end if +!!$ if(abs(omi(i)) .gt. abs(ommx)) ommx = omi(i) +!!$ end do +!!$ ! Compute omega_fine +!!$ do i=1, nrow +!!$ omf(i) = ommx +!!$ do j=acsr3%irp(i),acsr3%irp(i+1)-1 +!!$ if(abs(omi(acsr3%ja(j))) .lt. abs(omf(i))) omf(i)=omi(acsr3%ja(j)) +!!$ end do +!!$ ! ! if(min(real(omf(i)),aimag(omf(i))) < dzero) omf(i) = dzero +!!$ if(psb_minreal(omf(i)) < dzero) omf(i) = dzero +!!$ end do +!!$ +!!$ omf(1:nrow) = omf(1:nrow) * adinv(1:nrow) +!!$ +!!$ if (filter_mat) then +!!$ ! +!!$ ! Build the filtered matrix Af from A +!!$ ! +!!$ call la%cscnv(acsrf,info,dupl=psb_dupl_add_) +!!$ +!!$ do i=1,nrow +!!$ tmp = dzero +!!$ jd = -1 +!!$ do j=acsrf%irp(i),acsrf%irp(i+1)-1 +!!$ if (acsrf%ja(j) == i) jd = j +!!$ if (abs(acsrf%val(j)) < theta*sqrt(abs(adiag(i)*adiag(acsrf%ja(j))))) then +!!$ tmp=tmp+acsrf%val(j) +!!$ acsrf%val(j)=dzero +!!$ endif +!!$ enddo +!!$ if (jd == -1) then +!!$ write(0,*) 'Wrong input: we need the diagonal!!!!', i +!!$ else +!!$ acsrf%val(jd)=acsrf%val(jd)-tmp +!!$ end if +!!$ enddo +!!$ ! Take out zeroed terms +!!$ call acsrf%clean_zeros(info) +!!$ +!!$ ! +!!$ ! Build the smoothed prolongator using the filtered matrix +!!$ ! +!!$ do i=1,acsrf%get_nrows() +!!$ do j=acsrf%irp(i),acsrf%irp(i+1)-1 +!!$ if (acsrf%ja(j) == i) then +!!$ acsrf%val(j) = done - omf(i)*acsrf%val(j) +!!$ else +!!$ acsrf%val(j) = - omf(i)*acsrf%val(j) +!!$ end if +!!$ end do +!!$ end do +!!$ +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done gather, going for SYMBMM 1' +!!$ +!!$ call af%mv_from(acsrf) +!!$ ! +!!$ ! op_prol = (I-w*D*Af)Ptilde +!!$ ! Doing it this way means to consider diag(Af_i) +!!$ ! +!!$ ! +!!$ call psb_spspmm(af,ptilde,op_prol,info) +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done SPSPMM 1' +!!$ else +!!$ ! +!!$ ! Build the smoothed prolongator using the original matrix +!!$ ! +!!$ do i=1,acsr3%get_nrows() +!!$ do j=acsr3%irp(i),acsr3%irp(i+1)-1 +!!$ if (acsr3%ja(j) == i) then +!!$ acsr3%val(j) = done - omf(i)*acsr3%val(j) +!!$ else +!!$ acsr3%val(j) = - omf(i)*acsr3%val(j) +!!$ end if +!!$ end do +!!$ end do +!!$ +!!$ call am3%mv_from(acsr3) +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done gather, going for SYMBMM 1' +!!$ ! +!!$ ! +!!$ ! op_prol = (I-w*D*A)Ptilde +!!$ ! +!!$ ! +!!$ call psb_spspmm(am3,ptilde,op_prol,info) +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done NUMBMM 1' +!!$ +!!$ end if +!!$ +!!$ +!!$ ! +!!$ ! Ok, let's start over with the restrictor +!!$ ! +!!$ call ptilde%transc(rtilde) +!!$ call la%cscnv(atmp,info,type='csr') +!!$ call psb_sphalo(atmp,desc_a,am4,info,& +!!$ & colcnv=.true.,rowscale=.true.) +!!$ nrt = am4%get_nrows() +!!$ call am4%csclip(atmp2,info,lone,nrt,lone,ncol) +!!$ call atmp2%cscnv(info,type='CSR') +!!$ if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=atmp2) +!!$ call am4%free() +!!$ call atmp2%free() +!!$ +!!$ ! This is to compute the transpose. It ONLY works if the +!!$ ! original A has a symmetric pattern. +!!$ call atmp%transc(atmp2) +!!$ call atmp2%csclip(dat,info,lone,nrow,lone,ncol) +!!$ call dat%cscnv(info,type='csr') +!!$ call dat%scal(adinv,info) +!!$ +!!$ ! Now for the product. +!!$ call psb_spspmm(dat,ptilde,datp,info) +!!$ +!!$ call datp%clone(atmp2,info) +!!$ call psb_sphalo(atmp2,desc_a,am4,info,& +!!$ & colcnv=.false.,rowscale=.true.,outfmt='CSR ') +!!$ if (info == psb_success_) call psb_rwextd(ncol,atmp2,info,b=am4) +!!$ if (info == psb_success_) call am4%free() +!!$ +!!$ +!!$ call psb_symbmm(dat,atmp2,datdatp,info) +!!$ call psb_numbmm(dat,atmp2,datdatp) +!!$ call atmp2%free() +!!$ +!!$ call datp%mv_to(csc_datp) +!!$ call datdatp%mv_to(csc_datdatp) +!!$ +!!$ call csc_mat_col_prod(csc_datp,csc_datdatp,omp,info) +!!$ call csc_mat_col_prod(csc_datdatp,csc_datdatp,oden,info) +!!$ call psb_sum(ctxt,omp) +!!$ call psb_sum(ctxt,oden) +!!$ +!!$ +!!$ ! !$ write(debug_unit,*) trim(name),' OMP_R :',omp +!!$ ! ! $ write(debug_unit,*) trim(name),' ODEN_R:',oden +!!$ omp = omp/oden +!!$ ! !$ write(0,*) 'Check on output restrictor',omp(1:min(size(omp),10)) +!!$ ! Compute omega_int +!!$ ommx = dzero +!!$ do i=1, ncol +!!$ if (ilaggr(i) >0) then +!!$ omi(i) = omp(ilaggr(i)) +!!$ else +!!$ omi(i) = dzero +!!$ end if +!!$ if(abs(omi(i)) .gt. abs(ommx)) ommx = omi(i) +!!$ end do +!!$ ! Compute omega_fine +!!$ ! Going over the columns of atmp means going over the rows +!!$ ! of A^T. Hopefully ;-) +!!$ call atmp%cp_to(acsc) +!!$ +!!$ do i=1, nrow +!!$ omf(i) = ommx +!!$ do j= acsc%icp(i),acsc%icp(i+1)-1 +!!$ if(abs(omi(acsc%ia(j))) .lt. abs(omf(i))) omf(i)=omi(acsc%ia(j)) +!!$ end do +!!$ ! ! if(min(real(omf(i)),aimag(omf(i))) < dzero) omf(i) = dzero +!!$ if(psb_minreal(omf(i)) < dzero) omf(i) = dzero +!!$ end do +!!$ omf(1:nrow) = omf(1:nrow)*adinv(1:nrow) +!!$ call psb_halo(omf,desc_a,info) +!!$ call acsc%free() +!!$ +!!$ +!!$ call atmp%mv_to(acsr1) +!!$ +!!$ do i=1,acsr1%get_nrows() +!!$ do j=acsr1%irp(i),acsr1%irp(i+1)-1 +!!$ if (acsr1%ja(j) == i) then +!!$ acsr1%val(j) = done - acsr1%val(j)*omf(acsr1%ja(j)) +!!$ else +!!$ acsr1%val(j) = - acsr1%val(j)*omf(acsr1%ja(j)) +!!$ end if +!!$ end do +!!$ end do +!!$ call atmp%mv_from(acsr1) +!!$ +!!$ call rtilde%mv_to(tmpcoo) +!!$ nzl = tmpcoo%get_nzeros() +!!$ i=0 +!!$ do k=1, nzl +!!$ if ((naggrm1 < tmpcoo%ia(k)) .and. (tmpcoo%ia(k) <= naggrp1)) then +!!$ i = i+1 +!!$ tmpcoo%val(i) = tmpcoo%val(k) +!!$ tmpcoo%ia(i) = tmpcoo%ia(k) +!!$ tmpcoo%ja(i) = tmpcoo%ja(k) +!!$ end if +!!$ end do +!!$ call tmpcoo%set_nzeros(i) +!!$ call rtilde%mv_from(tmpcoo) +!!$ call rtilde%cscnv(info,type='csr') +!!$ +!!$ call psb_spspmm(rtilde,atmp,op_restr,info) +!!$ +!!$ ! +!!$ ! Now we have to gather the halo of op_prol, and add it to itself +!!$ ! to multiply it by A, +!!$ ! +!!$ call op_prol%clone(tmp_prol,info) +!!$ if (info == psb_success_) call psb_sphalo(tmp_prol,desc_a,am4,info,& +!!$ & colcnv=.false.,rowscale=.true.) +!!$ if (info == psb_success_) call psb_rwextd(ncol,tmp_prol,info,b=am4) +!!$ if (info == psb_success_) call am4%free() +!!$ +!!$ if(info /= psb_success_) then +!!$ call psb_errpush(psb_err_internal_error_,name,a_err='Halo of op_prol') +!!$ goto 9999 +!!$ end if +!!$ +!!$ ! +!!$ ! Now we have to fix this. The only rows of B that are correct +!!$ ! are those corresponding to "local" aggregates, i.e. indices in ilaggr(:) +!!$ ! +!!$ call op_restr%mv_to(tmpcoo) +!!$ +!!$ nzl = tmpcoo%get_nzeros() +!!$ i=0 +!!$ do k=1, nzl +!!$ if ((naggrm1 < tmpcoo%ia(k)) .and. (tmpcoo%ia(k) <= naggrp1)) then +!!$ i = i+1 +!!$ tmpcoo%val(i) = tmpcoo%val(k) +!!$ tmpcoo%ia(i) = tmpcoo%ia(k) +!!$ tmpcoo%ja(i) = tmpcoo%ja(k) +!!$ end if +!!$ end do +!!$ call tmpcoo%set_nzeros(i) +!!$ call op_restr%mv_from(tmpcoo) +!!$ call op_restr%cscnv(info,type='csr') +!!$ +!!$ +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'starting sphalo/ rwxtd' +!!$ +!!$ call psb_spspmm(la,tmp_prol,am3,info) +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done SPSPMM 2' +!!$ +!!$ call psb_sphalo(am3,desc_a,am4,info,& +!!$ & colcnv=.false.,rowscale=.true.) +!!$ if (info == psb_success_) call psb_rwextd(ncol,am3,info,b=am4) +!!$ if (info == psb_success_) call am4%free() +!!$ +!!$ if(info /= psb_success_) then +!!$ call psb_errpush(psb_err_internal_error_,name,& +!!$ & a_err='Extend am3') +!!$ goto 9999 +!!$ end if +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done sphalo/ rwxtd' +!!$ +!!$ call psb_spspmm(op_restr,am3,ac,info) +!!$ if (info == psb_success_) call am3%free() +!!$ if (info == psb_success_) call ac%cscnv(info,type='coo',dupl=psb_dupl_add_) +!!$ +!!$ if (info /= psb_success_) then +!!$ call psb_errpush(psb_err_internal_error_,name,& +!!$ &a_err='Build ac = op_restr x am3') +!!$ goto 9999 +!!$ end if diff --git a/amgprec/impl/aggregator/amg_daggrmat_smth_bld.f90 b/amgprec/impl/aggregator/amg_daggrmat_smth_bld.f90 index 20b24d60..82da3fc7 100644 --- a/amgprec/impl/aggregator/amg_daggrmat_smth_bld.f90 +++ b/amgprec/impl/aggregator/amg_daggrmat_smth_bld.f90 @@ -116,7 +116,7 @@ subroutine amg_daggrmat_smth_bld(a,desc_a,ilaggr,nlaggr,parms,& type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_dml_parms), intent(inout) :: parms - type(psb_dspmat_type), intent(out) :: op_prol,ac,op_restr + type(psb_dspmat_type), intent(inout) :: op_prol,ac,op_restr type(psb_ldspmat_type), intent(inout) :: t_prol type(psb_desc_type), intent(inout) :: desc_ac integer(psb_ipk_), intent(out) :: info diff --git a/amgprec/impl/aggregator/amg_s_dec_aggregator_tprol.f90 b/amgprec/impl/aggregator/amg_s_dec_aggregator_tprol.f90 index 0ab5274e..c52c04f7 100644 --- a/amgprec/impl/aggregator/amg_s_dec_aggregator_tprol.f90 +++ b/amgprec/impl/aggregator/amg_s_dec_aggregator_tprol.f90 @@ -83,8 +83,8 @@ subroutine amg_s_dec_aggregator_build_tprol(ag,parms,ag_data,& class(amg_s_dec_aggregator_type), target, intent(inout) :: ag type(amg_sml_parms), intent(inout) :: parms type(amg_saggr_data), intent(in) :: ag_data - type(psb_sspmat_type), intent(in) :: a - type(psb_desc_type), intent(in) :: desc_a + type(psb_sspmat_type), intent(inout) :: a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) type(psb_lsspmat_type), intent(out) :: t_prol integer(psb_ipk_), intent(out) :: info diff --git a/amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 b/amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 index 2cb3d842..cd28893c 100644 --- a/amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 +++ b/amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 @@ -58,7 +58,7 @@ subroutine amg_s_parmatch_aggregator_build_tprol(ag,parms,ag_data,& type(amg_sml_parms), intent(inout) :: parms type(amg_saggr_data), intent(in) :: ag_data type(psb_sspmat_type), intent(inout) :: a - type(psb_desc_type), intent(inout) :: desc_a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) type(psb_lsspmat_type), intent(out) :: t_prol integer(psb_ipk_), intent(out) :: info diff --git a/amgprec/impl/aggregator/amg_s_parmatch_smth_bld.F90 b/amgprec/impl/aggregator/amg_s_parmatch_smth_bld.F90 index a89ac411..a3f79fc5 100644 --- a/amgprec/impl/aggregator/amg_s_parmatch_smth_bld.F90 +++ b/amgprec/impl/aggregator/amg_s_parmatch_smth_bld.F90 @@ -122,7 +122,7 @@ subroutine amg_s_parmatch_smth_bld(ag,a,desc_a,ilaggr,nlaggr,parms,& integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_sml_parms), intent(inout) :: parms type(psb_lsspmat_type), intent(inout) :: t_prol - type(psb_sspmat_type), intent(out) :: op_prol,ac,op_restr + type(psb_sspmat_type), intent(inout) :: op_prol,ac,op_restr type(psb_desc_type), intent(inout) :: desc_ac integer(psb_ipk_), intent(out) :: info diff --git a/amgprec/impl/aggregator/amg_s_parmatch_spmm_bld.F90 b/amgprec/impl/aggregator/amg_s_parmatch_spmm_bld.F90 index b88930eb..3f9e385e 100644 --- a/amgprec/impl/aggregator/amg_s_parmatch_spmm_bld.F90 +++ b/amgprec/impl/aggregator/amg_s_parmatch_spmm_bld.F90 @@ -108,7 +108,7 @@ subroutine amg_s_parmatch_spmm_bld(a,desc_a,ilaggr,nlaggr,parms,& ! Arguments type(psb_sspmat_type), intent(in) :: a - type(psb_desc_type), intent(in) :: desc_a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_sml_parms), intent(inout) :: parms type(psb_lsspmat_type), intent(inout) :: t_prol diff --git a/amgprec/impl/aggregator/amg_s_parmatch_spmm_bld_inner.F90 b/amgprec/impl/aggregator/amg_s_parmatch_spmm_bld_inner.F90 index cb64c0e1..9f1c81f1 100644 --- a/amgprec/impl/aggregator/amg_s_parmatch_spmm_bld_inner.F90 +++ b/amgprec/impl/aggregator/amg_s_parmatch_spmm_bld_inner.F90 @@ -108,11 +108,11 @@ subroutine amg_s_parmatch_spmm_bld_inner(a_csr,desc_a,ilaggr,nlaggr,parms,& ! Arguments type(psb_s_csr_sparse_mat), intent(inout) :: a_csr - type(psb_desc_type), intent(in) :: desc_a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_sml_parms), intent(inout) :: parms type(psb_lsspmat_type), intent(inout) :: t_prol - type(psb_sspmat_type), intent(out) :: ac, op_prol, op_restr + type(psb_sspmat_type), intent(inout) :: ac, op_prol, op_restr type(psb_desc_type), intent(out) :: desc_ac integer(psb_ipk_), intent(out) :: info diff --git a/amgprec/impl/aggregator/amg_s_parmatch_spmm_bld_ov.F90 b/amgprec/impl/aggregator/amg_s_parmatch_spmm_bld_ov.F90 index a4fa85e7..442f4225 100644 --- a/amgprec/impl/aggregator/amg_s_parmatch_spmm_bld_ov.F90 +++ b/amgprec/impl/aggregator/amg_s_parmatch_spmm_bld_ov.F90 @@ -108,7 +108,7 @@ subroutine amg_s_parmatch_spmm_bld_ov(a,desc_a,ilaggr,nlaggr,parms,& ! Arguments type(psb_sspmat_type), intent(inout) :: a - type(psb_desc_type), intent(in) :: desc_a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_sml_parms), intent(inout) :: parms type(psb_lsspmat_type), intent(inout) :: t_prol diff --git a/amgprec/impl/aggregator/amg_s_symdec_aggregator_tprol.f90 b/amgprec/impl/aggregator/amg_s_symdec_aggregator_tprol.f90 index 5a9548eb..c148b89a 100644 --- a/amgprec/impl/aggregator/amg_s_symdec_aggregator_tprol.f90 +++ b/amgprec/impl/aggregator/amg_s_symdec_aggregator_tprol.f90 @@ -86,8 +86,8 @@ subroutine amg_s_symdec_aggregator_build_tprol(ag,parms,ag_data,& class(amg_s_symdec_aggregator_type), target, intent(inout) :: ag type(amg_sml_parms), intent(inout) :: parms type(amg_saggr_data), intent(in) :: ag_data - type(psb_sspmat_type), intent(in) :: a - type(psb_desc_type), intent(in) :: desc_a + type(psb_sspmat_type), intent(inout) :: a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) type(psb_lsspmat_type), intent(out) :: op_prol integer(psb_ipk_), intent(out) :: info diff --git a/amgprec/impl/aggregator/amg_saggrmat_minnrg_bld.f90 b/amgprec/impl/aggregator/amg_saggrmat_minnrg_bld.f90 index 670617fe..66514a66 100644 --- a/amgprec/impl/aggregator/amg_saggrmat_minnrg_bld.f90 +++ b/amgprec/impl/aggregator/amg_saggrmat_minnrg_bld.f90 @@ -105,7 +105,7 @@ ! ! subroutine amg_saggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,& - & ac,desc_ac,op_prol,op_restr,info) + & ac,desc_ac,op_prol,op_restr,t_prol,info) use psb_base_mod use amg_base_prec_type use amg_s_inner_mod, amg_protect_name => amg_saggrmat_minnrg_bld @@ -117,8 +117,8 @@ subroutine amg_saggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,& type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_sml_parms), intent(inout) :: parms - type(psb_lsspmat_type), intent(inout) :: op_prol - type(psb_lsspmat_type), intent(out) :: ac,op_restr + type(psb_lsspmat_type), intent(inout) :: t_prol + type(psb_sspmat_type), intent(inout) :: op_prol, ac,op_restr type(psb_desc_type), intent(inout) :: desc_ac integer(psb_ipk_), intent(out) :: info @@ -171,6 +171,8 @@ subroutine amg_saggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,& filter_mat = (parms%aggr_filter == amg_filter_mat_) + !NEEDS TO BE REWORKED !! + ! naggr: number of local aggregates ! nrow: local rows. ! @@ -183,361 +185,361 @@ subroutine amg_saggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,& goto 9999 end if - ! Get the diagonal D - adiag = a%get_diag(info) - if (info == psb_success_) & - & call psb_realloc(ncol,adiag,info) - if (info == psb_success_) & - & call psb_halo(adiag,desc_a,info) - if (info == psb_success_) call a%cp_to_l(la) - if (info /= psb_success_) then - call psb_errpush(psb_err_from_subroutine_,name,a_err='sp_getdiag') - goto 9999 - end if - - do i=1,size(adiag) - if (adiag(i) /= szero) then - adinv(i) = sone / adiag(i) - else - adinv(i) = sone - end if - end do - - - - ! 1. Allocate Ptilde in sparse matrix form - call op_prol%mv_to(tmpcoo) - call ptilde%mv_from(tmpcoo) - call ptilde%cscnv(info,type='csr') - - if (info == psb_success_) call la%cscnv(am3,info,type='csr',dupl=psb_dupl_add_) - if (info == psb_success_) call la%cscnv(da,info,type='csr',dupl=psb_dupl_add_) - if (info /= psb_success_) then - call psb_errpush(psb_err_from_subroutine_,name,a_err='spcnv') - goto 9999 - end if - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & ' Initial copies done.' - - call da%scal(adinv,info) - - call psb_spspmm(da,ptilde,dap,info) - - if(info /= psb_success_) then - call psb_errpush(psb_err_from_subroutine_,name,a_err='spspmm 1') - goto 9999 - end if - - call dap%clone(atmp,info) - - call psb_sphalo(atmp,desc_a,am4,info,& - & colcnv=.false.,rowscale=.true.,outfmt='CSR ') - if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=am4) - if (info == psb_success_) call am4%free() - - call psb_spspmm(da,atmp,dadap,info) - call atmp%free() - - ! !$ write(0,*) 'Columns of AP',psb_sp_get_ncols(ap) - ! !$ write(0,*) 'Columns of ADAP',psb_sp_get_ncols(adap) - call dap%mv_to(csc_dap) - call dadap%mv_to(csc_dadap) - - call csc_mat_col_prod(csc_dap,csc_dadap,omp,info) - call csc_mat_col_prod(csc_dadap,csc_dadap,oden,info) - call psb_sum(ctxt,omp) - call psb_sum(ctxt,oden) - ! !$ write(0,*) trim(name),' OMP :',omp - ! !$ write(0,*) trim(name),' ODEN:',oden - - omp = omp/oden - - ! !$ write(0,*) 'Check on output prolongator ',omp(1:min(size(omp),10)) - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done NUMBMM 1' - - call am3%mv_to(acsr3) - ! Compute omega_int - ommx = szero - do i=1, ncol - if (ilaggr(i) >0) then - omi(i) = omp(ilaggr(i)) - else - omi(i) = szero - end if - if(abs(omi(i)) .gt. abs(ommx)) ommx = omi(i) - end do - ! Compute omega_fine - do i=1, nrow - omf(i) = ommx - do j=acsr3%irp(i),acsr3%irp(i+1)-1 - if(abs(omi(acsr3%ja(j))) .lt. abs(omf(i))) omf(i)=omi(acsr3%ja(j)) - end do -!!$ if(min(real(omf(i)),aimag(omf(i))) < szero) omf(i) = szero - if(psb_minreal(omf(i)) < szero) omf(i) = szero - end do - - omf(1:nrow) = omf(1:nrow) * adinv(1:nrow) - - if (filter_mat) then - ! - ! Build the filtered matrix Af from A - ! - call la%cscnv(acsrf,info,dupl=psb_dupl_add_) - - do i=1,nrow - tmp = szero - jd = -1 - do j=acsrf%irp(i),acsrf%irp(i+1)-1 - if (acsrf%ja(j) == i) jd = j - if (abs(acsrf%val(j)) < theta*sqrt(abs(adiag(i)*adiag(acsrf%ja(j))))) then - tmp=tmp+acsrf%val(j) - acsrf%val(j)=szero - endif - enddo - if (jd == -1) then - write(0,*) 'Wrong input: we need the diagonal!!!!', i - else - acsrf%val(jd)=acsrf%val(jd)-tmp - end if - enddo - ! Take out zeroed terms - call acsrf%clean_zeros(info) - - ! - ! Build the smoothed prolongator using the filtered matrix - ! - do i=1,acsrf%get_nrows() - do j=acsrf%irp(i),acsrf%irp(i+1)-1 - if (acsrf%ja(j) == i) then - acsrf%val(j) = sone - omf(i)*acsrf%val(j) - else - acsrf%val(j) = - omf(i)*acsrf%val(j) - end if - end do - end do - - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done gather, going for SYMBMM 1' - - call af%mv_from(acsrf) - ! - ! op_prol = (I-w*D*Af)Ptilde - ! Doing it this way means to consider diag(Af_i) - ! - ! - call psb_spspmm(af,ptilde,op_prol,info) - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done SPSPMM 1' - else - ! - ! Build the smoothed prolongator using the original matrix - ! - do i=1,acsr3%get_nrows() - do j=acsr3%irp(i),acsr3%irp(i+1)-1 - if (acsr3%ja(j) == i) then - acsr3%val(j) = sone - omf(i)*acsr3%val(j) - else - acsr3%val(j) = - omf(i)*acsr3%val(j) - end if - end do - end do - - call am3%mv_from(acsr3) - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done gather, going for SYMBMM 1' - ! - ! - ! op_prol = (I-w*D*A)Ptilde - ! - ! - call psb_spspmm(am3,ptilde,op_prol,info) - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done NUMBMM 1' - - end if - - - ! - ! Ok, let's start over with the restrictor - ! - call ptilde%transc(rtilde) - call la%cscnv(atmp,info,type='csr') - call psb_sphalo(atmp,desc_a,am4,info,& - & colcnv=.true.,rowscale=.true.) - nrt = am4%get_nrows() - call am4%csclip(atmp2,info,lone,nrt,lone,ncol) - call atmp2%cscnv(info,type='CSR') - if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=atmp2) - call am4%free() - call atmp2%free() - - ! This is to compute the transpose. It ONLY works if the - ! original A has a symmetric pattern. - call atmp%transc(atmp2) - call atmp2%csclip(dat,info,lone,nrow,lone,ncol) - call dat%cscnv(info,type='csr') - call dat%scal(adinv,info) - - ! Now for the product. - call psb_spspmm(dat,ptilde,datp,info) - - call datp%clone(atmp2,info) - call psb_sphalo(atmp2,desc_a,am4,info,& - & colcnv=.false.,rowscale=.true.,outfmt='CSR ') - if (info == psb_success_) call psb_rwextd(ncol,atmp2,info,b=am4) - if (info == psb_success_) call am4%free() - - - call psb_symbmm(dat,atmp2,datdatp,info) - call psb_numbmm(dat,atmp2,datdatp) - call atmp2%free() - - call datp%mv_to(csc_datp) - call datdatp%mv_to(csc_datdatp) - - call csc_mat_col_prod(csc_datp,csc_datdatp,omp,info) - call csc_mat_col_prod(csc_datdatp,csc_datdatp,oden,info) - call psb_sum(ctxt,omp) - call psb_sum(ctxt,oden) - - - ! !$ write(debug_unit,*) trim(name),' OMP_R :',omp - ! ! $ write(debug_unit,*) trim(name),' ODEN_R:',oden - omp = omp/oden - ! !$ write(0,*) 'Check on output restrictor',omp(1:min(size(omp),10)) - ! Compute omega_int - ommx = szero - do i=1, ncol - if (ilaggr(i) >0) then - omi(i) = omp(ilaggr(i)) - else - omi(i) = szero - end if - if(abs(omi(i)) .gt. abs(ommx)) ommx = omi(i) - end do - ! Compute omega_fine - ! Going over the columns of atmp means going over the rows - ! of A^T. Hopefully ;-) - call atmp%cp_to(acsc) - - do i=1, nrow - omf(i) = ommx - do j= acsc%icp(i),acsc%icp(i+1)-1 - if(abs(omi(acsc%ia(j))) .lt. abs(omf(i))) omf(i)=omi(acsc%ia(j)) - end do -!!$ if(min(real(omf(i)),aimag(omf(i))) < szero) omf(i) = szero - if(psb_minreal(omf(i)) < szero) omf(i) = szero - end do - omf(1:nrow) = omf(1:nrow)*adinv(1:nrow) - call psb_halo(omf,desc_a,info) - call acsc%free() - - - call atmp%mv_to(acsr1) - - do i=1,acsr1%get_nrows() - do j=acsr1%irp(i),acsr1%irp(i+1)-1 - if (acsr1%ja(j) == i) then - acsr1%val(j) = sone - acsr1%val(j)*omf(acsr1%ja(j)) - else - acsr1%val(j) = - acsr1%val(j)*omf(acsr1%ja(j)) - end if - end do - end do - call atmp%mv_from(acsr1) - - call rtilde%mv_to(tmpcoo) - nzl = tmpcoo%get_nzeros() - i=0 - do k=1, nzl - if ((naggrm1 < tmpcoo%ia(k)) .and. (tmpcoo%ia(k) <= naggrp1)) then - i = i+1 - tmpcoo%val(i) = tmpcoo%val(k) - tmpcoo%ia(i) = tmpcoo%ia(k) - tmpcoo%ja(i) = tmpcoo%ja(k) - end if - end do - call tmpcoo%set_nzeros(i) - call rtilde%mv_from(tmpcoo) - call rtilde%cscnv(info,type='csr') - - call psb_spspmm(rtilde,atmp,op_restr,info) - - ! - ! Now we have to gather the halo of op_prol, and add it to itself - ! to multiply it by A, - ! - call op_prol%clone(tmp_prol,info) - if (info == psb_success_) call psb_sphalo(tmp_prol,desc_a,am4,info,& - & colcnv=.false.,rowscale=.true.) - if (info == psb_success_) call psb_rwextd(ncol,tmp_prol,info,b=am4) - if (info == psb_success_) call am4%free() - - if(info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='Halo of op_prol') - goto 9999 - end if - - ! - ! Now we have to fix this. The only rows of B that are correct - ! are those corresponding to "local" aggregates, i.e. indices in ilaggr(:) - ! - call op_restr%mv_to(tmpcoo) - - nzl = tmpcoo%get_nzeros() - i=0 - do k=1, nzl - if ((naggrm1 < tmpcoo%ia(k)) .and. (tmpcoo%ia(k) <= naggrp1)) then - i = i+1 - tmpcoo%val(i) = tmpcoo%val(k) - tmpcoo%ia(i) = tmpcoo%ia(k) - tmpcoo%ja(i) = tmpcoo%ja(k) - end if - end do - call tmpcoo%set_nzeros(i) - call op_restr%mv_from(tmpcoo) - call op_restr%cscnv(info,type='csr') - - - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'starting sphalo/ rwxtd' - - call psb_spspmm(la,tmp_prol,am3,info) - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done SPSPMM 2' - - call psb_sphalo(am3,desc_a,am4,info,& - & colcnv=.false.,rowscale=.true.) - if (info == psb_success_) call psb_rwextd(ncol,am3,info,b=am4) - if (info == psb_success_) call am4%free() - - if(info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,& - & a_err='Extend am3') - goto 9999 - end if - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done sphalo/ rwxtd' - - call psb_spspmm(op_restr,am3,ac,info) - if (info == psb_success_) call am3%free() - if (info == psb_success_) call ac%cscnv(info,type='coo',dupl=psb_dupl_add_) - - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,& - &a_err='Build ac = op_restr x am3') - goto 9999 - end if +!!$ ! Get the diagonal D +!!$ adiag = a%get_diag(info) +!!$ if (info == psb_success_) & +!!$ & call psb_realloc(ncol,adiag,info) +!!$ if (info == psb_success_) & +!!$ & call psb_halo(adiag,desc_a,info) +!!$ if (info == psb_success_) call a%cp_to_l(la) +!!$ if (info /= psb_success_) then +!!$ call psb_errpush(psb_err_from_subroutine_,name,a_err='sp_getdiag') +!!$ goto 9999 +!!$ end if +!!$ +!!$ do i=1,size(adiag) +!!$ if (adiag(i) /= szero) then +!!$ adinv(i) = sone / adiag(i) +!!$ else +!!$ adinv(i) = sone +!!$ end if +!!$ end do +!!$ +!!$ +!!$ +!!$ ! 1. Allocate Ptilde in sparse matrix form +!!$ call op_prol%mv_to(tmpcoo) +!!$ call ptilde%mv_from(tmpcoo) +!!$ call ptilde%cscnv(info,type='csr') +!!$ +!!$ if (info == psb_success_) call la%cscnv(am3,info,type='csr',dupl=psb_dupl_add_) +!!$ if (info == psb_success_) call la%cscnv(da,info,type='csr',dupl=psb_dupl_add_) +!!$ if (info /= psb_success_) then +!!$ call psb_errpush(psb_err_from_subroutine_,name,a_err='spcnv') +!!$ goto 9999 +!!$ end if +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & ' Initial copies done.' +!!$ +!!$ call da%scal(adinv,info) +!!$ +!!$ call psb_spspmm(da,ptilde,dap,info) +!!$ +!!$ if(info /= psb_success_) then +!!$ call psb_errpush(psb_err_from_subroutine_,name,a_err='spspmm 1') +!!$ goto 9999 +!!$ end if +!!$ +!!$ call dap%clone(atmp,info) +!!$ +!!$ call psb_sphalo(atmp,desc_a,am4,info,& +!!$ & colcnv=.false.,rowscale=.true.,outfmt='CSR ') +!!$ if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=am4) +!!$ if (info == psb_success_) call am4%free() +!!$ +!!$ call psb_spspmm(da,atmp,dadap,info) +!!$ call atmp%free() +!!$ +!!$ ! !$ write(0,*) 'Columns of AP',psb_sp_get_ncols(ap) +!!$ ! !$ write(0,*) 'Columns of ADAP',psb_sp_get_ncols(adap) +!!$ call dap%mv_to(csc_dap) +!!$ call dadap%mv_to(csc_dadap) +!!$ +!!$ call csc_mat_col_prod(csc_dap,csc_dadap,omp,info) +!!$ call csc_mat_col_prod(csc_dadap,csc_dadap,oden,info) +!!$ call psb_sum(ctxt,omp) +!!$ call psb_sum(ctxt,oden) +!!$ ! !$ write(0,*) trim(name),' OMP :',omp +!!$ ! !$ write(0,*) trim(name),' ODEN:',oden +!!$ +!!$ omp = omp/oden +!!$ +!!$ ! !$ write(0,*) 'Check on output prolongator ',omp(1:min(size(omp),10)) +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done NUMBMM 1' +!!$ +!!$ call am3%mv_to(acsr3) +!!$ ! Compute omega_int +!!$ ommx = szero +!!$ do i=1, ncol +!!$ if (ilaggr(i) >0) then +!!$ omi(i) = omp(ilaggr(i)) +!!$ else +!!$ omi(i) = szero +!!$ end if +!!$ if(abs(omi(i)) .gt. abs(ommx)) ommx = omi(i) +!!$ end do +!!$ ! Compute omega_fine +!!$ do i=1, nrow +!!$ omf(i) = ommx +!!$ do j=acsr3%irp(i),acsr3%irp(i+1)-1 +!!$ if(abs(omi(acsr3%ja(j))) .lt. abs(omf(i))) omf(i)=omi(acsr3%ja(j)) +!!$ end do +!!$ ! ! if(min(real(omf(i)),aimag(omf(i))) < szero) omf(i) = szero +!!$ if(psb_minreal(omf(i)) < szero) omf(i) = szero +!!$ end do +!!$ +!!$ omf(1:nrow) = omf(1:nrow) * adinv(1:nrow) +!!$ +!!$ if (filter_mat) then +!!$ ! +!!$ ! Build the filtered matrix Af from A +!!$ ! +!!$ call la%cscnv(acsrf,info,dupl=psb_dupl_add_) +!!$ +!!$ do i=1,nrow +!!$ tmp = szero +!!$ jd = -1 +!!$ do j=acsrf%irp(i),acsrf%irp(i+1)-1 +!!$ if (acsrf%ja(j) == i) jd = j +!!$ if (abs(acsrf%val(j)) < theta*sqrt(abs(adiag(i)*adiag(acsrf%ja(j))))) then +!!$ tmp=tmp+acsrf%val(j) +!!$ acsrf%val(j)=szero +!!$ endif +!!$ enddo +!!$ if (jd == -1) then +!!$ write(0,*) 'Wrong input: we need the diagonal!!!!', i +!!$ else +!!$ acsrf%val(jd)=acsrf%val(jd)-tmp +!!$ end if +!!$ enddo +!!$ ! Take out zeroed terms +!!$ call acsrf%clean_zeros(info) +!!$ +!!$ ! +!!$ ! Build the smoothed prolongator using the filtered matrix +!!$ ! +!!$ do i=1,acsrf%get_nrows() +!!$ do j=acsrf%irp(i),acsrf%irp(i+1)-1 +!!$ if (acsrf%ja(j) == i) then +!!$ acsrf%val(j) = sone - omf(i)*acsrf%val(j) +!!$ else +!!$ acsrf%val(j) = - omf(i)*acsrf%val(j) +!!$ end if +!!$ end do +!!$ end do +!!$ +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done gather, going for SYMBMM 1' +!!$ +!!$ call af%mv_from(acsrf) +!!$ ! +!!$ ! op_prol = (I-w*D*Af)Ptilde +!!$ ! Doing it this way means to consider diag(Af_i) +!!$ ! +!!$ ! +!!$ call psb_spspmm(af,ptilde,op_prol,info) +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done SPSPMM 1' +!!$ else +!!$ ! +!!$ ! Build the smoothed prolongator using the original matrix +!!$ ! +!!$ do i=1,acsr3%get_nrows() +!!$ do j=acsr3%irp(i),acsr3%irp(i+1)-1 +!!$ if (acsr3%ja(j) == i) then +!!$ acsr3%val(j) = sone - omf(i)*acsr3%val(j) +!!$ else +!!$ acsr3%val(j) = - omf(i)*acsr3%val(j) +!!$ end if +!!$ end do +!!$ end do +!!$ +!!$ call am3%mv_from(acsr3) +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done gather, going for SYMBMM 1' +!!$ ! +!!$ ! +!!$ ! op_prol = (I-w*D*A)Ptilde +!!$ ! +!!$ ! +!!$ call psb_spspmm(am3,ptilde,op_prol,info) +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done NUMBMM 1' +!!$ +!!$ end if +!!$ +!!$ +!!$ ! +!!$ ! Ok, let's start over with the restrictor +!!$ ! +!!$ call ptilde%transc(rtilde) +!!$ call la%cscnv(atmp,info,type='csr') +!!$ call psb_sphalo(atmp,desc_a,am4,info,& +!!$ & colcnv=.true.,rowscale=.true.) +!!$ nrt = am4%get_nrows() +!!$ call am4%csclip(atmp2,info,lone,nrt,lone,ncol) +!!$ call atmp2%cscnv(info,type='CSR') +!!$ if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=atmp2) +!!$ call am4%free() +!!$ call atmp2%free() +!!$ +!!$ ! This is to compute the transpose. It ONLY works if the +!!$ ! original A has a symmetric pattern. +!!$ call atmp%transc(atmp2) +!!$ call atmp2%csclip(dat,info,lone,nrow,lone,ncol) +!!$ call dat%cscnv(info,type='csr') +!!$ call dat%scal(adinv,info) +!!$ +!!$ ! Now for the product. +!!$ call psb_spspmm(dat,ptilde,datp,info) +!!$ +!!$ call datp%clone(atmp2,info) +!!$ call psb_sphalo(atmp2,desc_a,am4,info,& +!!$ & colcnv=.false.,rowscale=.true.,outfmt='CSR ') +!!$ if (info == psb_success_) call psb_rwextd(ncol,atmp2,info,b=am4) +!!$ if (info == psb_success_) call am4%free() +!!$ +!!$ +!!$ call psb_symbmm(dat,atmp2,datdatp,info) +!!$ call psb_numbmm(dat,atmp2,datdatp) +!!$ call atmp2%free() +!!$ +!!$ call datp%mv_to(csc_datp) +!!$ call datdatp%mv_to(csc_datdatp) +!!$ +!!$ call csc_mat_col_prod(csc_datp,csc_datdatp,omp,info) +!!$ call csc_mat_col_prod(csc_datdatp,csc_datdatp,oden,info) +!!$ call psb_sum(ctxt,omp) +!!$ call psb_sum(ctxt,oden) +!!$ +!!$ +!!$ ! !$ write(debug_unit,*) trim(name),' OMP_R :',omp +!!$ ! ! $ write(debug_unit,*) trim(name),' ODEN_R:',oden +!!$ omp = omp/oden +!!$ ! !$ write(0,*) 'Check on output restrictor',omp(1:min(size(omp),10)) +!!$ ! Compute omega_int +!!$ ommx = szero +!!$ do i=1, ncol +!!$ if (ilaggr(i) >0) then +!!$ omi(i) = omp(ilaggr(i)) +!!$ else +!!$ omi(i) = szero +!!$ end if +!!$ if(abs(omi(i)) .gt. abs(ommx)) ommx = omi(i) +!!$ end do +!!$ ! Compute omega_fine +!!$ ! Going over the columns of atmp means going over the rows +!!$ ! of A^T. Hopefully ;-) +!!$ call atmp%cp_to(acsc) +!!$ +!!$ do i=1, nrow +!!$ omf(i) = ommx +!!$ do j= acsc%icp(i),acsc%icp(i+1)-1 +!!$ if(abs(omi(acsc%ia(j))) .lt. abs(omf(i))) omf(i)=omi(acsc%ia(j)) +!!$ end do +!!$ ! ! if(min(real(omf(i)),aimag(omf(i))) < szero) omf(i) = szero +!!$ if(psb_minreal(omf(i)) < szero) omf(i) = szero +!!$ end do +!!$ omf(1:nrow) = omf(1:nrow)*adinv(1:nrow) +!!$ call psb_halo(omf,desc_a,info) +!!$ call acsc%free() +!!$ +!!$ +!!$ call atmp%mv_to(acsr1) +!!$ +!!$ do i=1,acsr1%get_nrows() +!!$ do j=acsr1%irp(i),acsr1%irp(i+1)-1 +!!$ if (acsr1%ja(j) == i) then +!!$ acsr1%val(j) = sone - acsr1%val(j)*omf(acsr1%ja(j)) +!!$ else +!!$ acsr1%val(j) = - acsr1%val(j)*omf(acsr1%ja(j)) +!!$ end if +!!$ end do +!!$ end do +!!$ call atmp%mv_from(acsr1) +!!$ +!!$ call rtilde%mv_to(tmpcoo) +!!$ nzl = tmpcoo%get_nzeros() +!!$ i=0 +!!$ do k=1, nzl +!!$ if ((naggrm1 < tmpcoo%ia(k)) .and. (tmpcoo%ia(k) <= naggrp1)) then +!!$ i = i+1 +!!$ tmpcoo%val(i) = tmpcoo%val(k) +!!$ tmpcoo%ia(i) = tmpcoo%ia(k) +!!$ tmpcoo%ja(i) = tmpcoo%ja(k) +!!$ end if +!!$ end do +!!$ call tmpcoo%set_nzeros(i) +!!$ call rtilde%mv_from(tmpcoo) +!!$ call rtilde%cscnv(info,type='csr') +!!$ +!!$ call psb_spspmm(rtilde,atmp,op_restr,info) +!!$ +!!$ ! +!!$ ! Now we have to gather the halo of op_prol, and add it to itself +!!$ ! to multiply it by A, +!!$ ! +!!$ call op_prol%clone(tmp_prol,info) +!!$ if (info == psb_success_) call psb_sphalo(tmp_prol,desc_a,am4,info,& +!!$ & colcnv=.false.,rowscale=.true.) +!!$ if (info == psb_success_) call psb_rwextd(ncol,tmp_prol,info,b=am4) +!!$ if (info == psb_success_) call am4%free() +!!$ +!!$ if(info /= psb_success_) then +!!$ call psb_errpush(psb_err_internal_error_,name,a_err='Halo of op_prol') +!!$ goto 9999 +!!$ end if +!!$ +!!$ ! +!!$ ! Now we have to fix this. The only rows of B that are correct +!!$ ! are those corresponding to "local" aggregates, i.e. indices in ilaggr(:) +!!$ ! +!!$ call op_restr%mv_to(tmpcoo) +!!$ +!!$ nzl = tmpcoo%get_nzeros() +!!$ i=0 +!!$ do k=1, nzl +!!$ if ((naggrm1 < tmpcoo%ia(k)) .and. (tmpcoo%ia(k) <= naggrp1)) then +!!$ i = i+1 +!!$ tmpcoo%val(i) = tmpcoo%val(k) +!!$ tmpcoo%ia(i) = tmpcoo%ia(k) +!!$ tmpcoo%ja(i) = tmpcoo%ja(k) +!!$ end if +!!$ end do +!!$ call tmpcoo%set_nzeros(i) +!!$ call op_restr%mv_from(tmpcoo) +!!$ call op_restr%cscnv(info,type='csr') +!!$ +!!$ +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'starting sphalo/ rwxtd' +!!$ +!!$ call psb_spspmm(la,tmp_prol,am3,info) +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done SPSPMM 2' +!!$ +!!$ call psb_sphalo(am3,desc_a,am4,info,& +!!$ & colcnv=.false.,rowscale=.true.) +!!$ if (info == psb_success_) call psb_rwextd(ncol,am3,info,b=am4) +!!$ if (info == psb_success_) call am4%free() +!!$ +!!$ if(info /= psb_success_) then +!!$ call psb_errpush(psb_err_internal_error_,name,& +!!$ & a_err='Extend am3') +!!$ goto 9999 +!!$ end if +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done sphalo/ rwxtd' +!!$ +!!$ call psb_spspmm(op_restr,am3,ac,info) +!!$ if (info == psb_success_) call am3%free() +!!$ if (info == psb_success_) call ac%cscnv(info,type='coo',dupl=psb_dupl_add_) +!!$ +!!$ if (info /= psb_success_) then +!!$ call psb_errpush(psb_err_internal_error_,name,& +!!$ &a_err='Build ac = op_restr x am3') +!!$ goto 9999 +!!$ end if diff --git a/amgprec/impl/aggregator/amg_saggrmat_smth_bld.f90 b/amgprec/impl/aggregator/amg_saggrmat_smth_bld.f90 index 30532e9c..d96176b2 100644 --- a/amgprec/impl/aggregator/amg_saggrmat_smth_bld.f90 +++ b/amgprec/impl/aggregator/amg_saggrmat_smth_bld.f90 @@ -116,7 +116,7 @@ subroutine amg_saggrmat_smth_bld(a,desc_a,ilaggr,nlaggr,parms,& type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_sml_parms), intent(inout) :: parms - type(psb_sspmat_type), intent(out) :: op_prol,ac,op_restr + type(psb_sspmat_type), intent(inout) :: op_prol,ac,op_restr type(psb_lsspmat_type), intent(inout) :: t_prol type(psb_desc_type), intent(inout) :: desc_ac integer(psb_ipk_), intent(out) :: info diff --git a/amgprec/impl/aggregator/amg_z_dec_aggregator_tprol.f90 b/amgprec/impl/aggregator/amg_z_dec_aggregator_tprol.f90 index 5a90fcd5..a64e3ebb 100644 --- a/amgprec/impl/aggregator/amg_z_dec_aggregator_tprol.f90 +++ b/amgprec/impl/aggregator/amg_z_dec_aggregator_tprol.f90 @@ -83,8 +83,8 @@ subroutine amg_z_dec_aggregator_build_tprol(ag,parms,ag_data,& class(amg_z_dec_aggregator_type), target, intent(inout) :: ag type(amg_dml_parms), intent(inout) :: parms type(amg_daggr_data), intent(in) :: ag_data - type(psb_zspmat_type), intent(in) :: a - type(psb_desc_type), intent(in) :: desc_a + type(psb_zspmat_type), intent(inout) :: a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) type(psb_lzspmat_type), intent(out) :: t_prol integer(psb_ipk_), intent(out) :: info diff --git a/amgprec/impl/aggregator/amg_z_symdec_aggregator_tprol.f90 b/amgprec/impl/aggregator/amg_z_symdec_aggregator_tprol.f90 index 84de6849..dd4ac4be 100644 --- a/amgprec/impl/aggregator/amg_z_symdec_aggregator_tprol.f90 +++ b/amgprec/impl/aggregator/amg_z_symdec_aggregator_tprol.f90 @@ -86,8 +86,8 @@ subroutine amg_z_symdec_aggregator_build_tprol(ag,parms,ag_data,& class(amg_z_symdec_aggregator_type), target, intent(inout) :: ag type(amg_dml_parms), intent(inout) :: parms type(amg_daggr_data), intent(in) :: ag_data - type(psb_zspmat_type), intent(in) :: a - type(psb_desc_type), intent(in) :: desc_a + type(psb_zspmat_type), intent(inout) :: a + type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) type(psb_lzspmat_type), intent(out) :: op_prol integer(psb_ipk_), intent(out) :: info diff --git a/amgprec/impl/aggregator/amg_zaggrmat_minnrg_bld.f90 b/amgprec/impl/aggregator/amg_zaggrmat_minnrg_bld.f90 index c8a6e227..89d6d89d 100644 --- a/amgprec/impl/aggregator/amg_zaggrmat_minnrg_bld.f90 +++ b/amgprec/impl/aggregator/amg_zaggrmat_minnrg_bld.f90 @@ -105,7 +105,7 @@ ! ! subroutine amg_zaggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,& - & ac,desc_ac,op_prol,op_restr,info) + & ac,desc_ac,op_prol,op_restr,t_prol,info) use psb_base_mod use amg_base_prec_type use amg_z_inner_mod, amg_protect_name => amg_zaggrmat_minnrg_bld @@ -117,8 +117,8 @@ subroutine amg_zaggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,& type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_dml_parms), intent(inout) :: parms - type(psb_lzspmat_type), intent(inout) :: op_prol - type(psb_lzspmat_type), intent(out) :: ac,op_restr + type(psb_lzspmat_type), intent(inout) :: t_prol + type(psb_zspmat_type), intent(inout) :: op_prol, ac,op_restr type(psb_desc_type), intent(inout) :: desc_ac integer(psb_ipk_), intent(out) :: info @@ -171,6 +171,8 @@ subroutine amg_zaggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,& filter_mat = (parms%aggr_filter == amg_filter_mat_) + !NEEDS TO BE REWORKED !! + ! naggr: number of local aggregates ! nrow: local rows. ! @@ -183,361 +185,361 @@ subroutine amg_zaggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,& goto 9999 end if - ! Get the diagonal D - adiag = a%get_diag(info) - if (info == psb_success_) & - & call psb_realloc(ncol,adiag,info) - if (info == psb_success_) & - & call psb_halo(adiag,desc_a,info) - if (info == psb_success_) call a%cp_to_l(la) - if (info /= psb_success_) then - call psb_errpush(psb_err_from_subroutine_,name,a_err='sp_getdiag') - goto 9999 - end if - - do i=1,size(adiag) - if (adiag(i) /= zzero) then - adinv(i) = zone / adiag(i) - else - adinv(i) = zone - end if - end do - - - - ! 1. Allocate Ptilde in sparse matrix form - call op_prol%mv_to(tmpcoo) - call ptilde%mv_from(tmpcoo) - call ptilde%cscnv(info,type='csr') - - if (info == psb_success_) call la%cscnv(am3,info,type='csr',dupl=psb_dupl_add_) - if (info == psb_success_) call la%cscnv(da,info,type='csr',dupl=psb_dupl_add_) - if (info /= psb_success_) then - call psb_errpush(psb_err_from_subroutine_,name,a_err='spcnv') - goto 9999 - end if - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & ' Initial copies done.' - - call da%scal(adinv,info) - - call psb_spspmm(da,ptilde,dap,info) - - if(info /= psb_success_) then - call psb_errpush(psb_err_from_subroutine_,name,a_err='spspmm 1') - goto 9999 - end if - - call dap%clone(atmp,info) - - call psb_sphalo(atmp,desc_a,am4,info,& - & colcnv=.false.,rowscale=.true.,outfmt='CSR ') - if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=am4) - if (info == psb_success_) call am4%free() - - call psb_spspmm(da,atmp,dadap,info) - call atmp%free() - - ! !$ write(0,*) 'Columns of AP',psb_sp_get_ncols(ap) - ! !$ write(0,*) 'Columns of ADAP',psb_sp_get_ncols(adap) - call dap%mv_to(csc_dap) - call dadap%mv_to(csc_dadap) - - call csc_mat_col_prod(csc_dap,csc_dadap,omp,info) - call csc_mat_col_prod(csc_dadap,csc_dadap,oden,info) - call psb_sum(ctxt,omp) - call psb_sum(ctxt,oden) - ! !$ write(0,*) trim(name),' OMP :',omp - ! !$ write(0,*) trim(name),' ODEN:',oden - - omp = omp/oden - - ! !$ write(0,*) 'Check on output prolongator ',omp(1:min(size(omp),10)) - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done NUMBMM 1' - - call am3%mv_to(acsr3) - ! Compute omega_int - ommx = zzero - do i=1, ncol - if (ilaggr(i) >0) then - omi(i) = omp(ilaggr(i)) - else - omi(i) = zzero - end if - if(abs(omi(i)) .gt. abs(ommx)) ommx = omi(i) - end do - ! Compute omega_fine - do i=1, nrow - omf(i) = ommx - do j=acsr3%irp(i),acsr3%irp(i+1)-1 - if(abs(omi(acsr3%ja(j))) .lt. abs(omf(i))) omf(i)=omi(acsr3%ja(j)) - end do -!!$ if(min(real(omf(i)),aimag(omf(i))) < dzero) omf(i) = zzero - if(psb_minreal(omf(i)) < dzero) omf(i) = zzero - end do - - omf(1:nrow) = omf(1:nrow) * adinv(1:nrow) - - if (filter_mat) then - ! - ! Build the filtered matrix Af from A - ! - call la%cscnv(acsrf,info,dupl=psb_dupl_add_) - - do i=1,nrow - tmp = zzero - jd = -1 - do j=acsrf%irp(i),acsrf%irp(i+1)-1 - if (acsrf%ja(j) == i) jd = j - if (abs(acsrf%val(j)) < theta*sqrt(abs(adiag(i)*adiag(acsrf%ja(j))))) then - tmp=tmp+acsrf%val(j) - acsrf%val(j)=zzero - endif - enddo - if (jd == -1) then - write(0,*) 'Wrong input: we need the diagonal!!!!', i - else - acsrf%val(jd)=acsrf%val(jd)-tmp - end if - enddo - ! Take out zeroed terms - call acsrf%clean_zeros(info) - - ! - ! Build the smoothed prolongator using the filtered matrix - ! - do i=1,acsrf%get_nrows() - do j=acsrf%irp(i),acsrf%irp(i+1)-1 - if (acsrf%ja(j) == i) then - acsrf%val(j) = zone - omf(i)*acsrf%val(j) - else - acsrf%val(j) = - omf(i)*acsrf%val(j) - end if - end do - end do - - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done gather, going for SYMBMM 1' - - call af%mv_from(acsrf) - ! - ! op_prol = (I-w*D*Af)Ptilde - ! Doing it this way means to consider diag(Af_i) - ! - ! - call psb_spspmm(af,ptilde,op_prol,info) - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done SPSPMM 1' - else - ! - ! Build the smoothed prolongator using the original matrix - ! - do i=1,acsr3%get_nrows() - do j=acsr3%irp(i),acsr3%irp(i+1)-1 - if (acsr3%ja(j) == i) then - acsr3%val(j) = zone - omf(i)*acsr3%val(j) - else - acsr3%val(j) = - omf(i)*acsr3%val(j) - end if - end do - end do - - call am3%mv_from(acsr3) - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done gather, going for SYMBMM 1' - ! - ! - ! op_prol = (I-w*D*A)Ptilde - ! - ! - call psb_spspmm(am3,ptilde,op_prol,info) - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done NUMBMM 1' - - end if - - - ! - ! Ok, let's start over with the restrictor - ! - call ptilde%transc(rtilde) - call la%cscnv(atmp,info,type='csr') - call psb_sphalo(atmp,desc_a,am4,info,& - & colcnv=.true.,rowscale=.true.) - nrt = am4%get_nrows() - call am4%csclip(atmp2,info,lone,nrt,lone,ncol) - call atmp2%cscnv(info,type='CSR') - if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=atmp2) - call am4%free() - call atmp2%free() - - ! This is to compute the transpose. It ONLY works if the - ! original A has a symmetric pattern. - call atmp%transc(atmp2) - call atmp2%csclip(dat,info,lone,nrow,lone,ncol) - call dat%cscnv(info,type='csr') - call dat%scal(adinv,info) - - ! Now for the product. - call psb_spspmm(dat,ptilde,datp,info) - - call datp%clone(atmp2,info) - call psb_sphalo(atmp2,desc_a,am4,info,& - & colcnv=.false.,rowscale=.true.,outfmt='CSR ') - if (info == psb_success_) call psb_rwextd(ncol,atmp2,info,b=am4) - if (info == psb_success_) call am4%free() - - - call psb_symbmm(dat,atmp2,datdatp,info) - call psb_numbmm(dat,atmp2,datdatp) - call atmp2%free() - - call datp%mv_to(csc_datp) - call datdatp%mv_to(csc_datdatp) - - call csc_mat_col_prod(csc_datp,csc_datdatp,omp,info) - call csc_mat_col_prod(csc_datdatp,csc_datdatp,oden,info) - call psb_sum(ctxt,omp) - call psb_sum(ctxt,oden) - - - ! !$ write(debug_unit,*) trim(name),' OMP_R :',omp - ! ! $ write(debug_unit,*) trim(name),' ODEN_R:',oden - omp = omp/oden - ! !$ write(0,*) 'Check on output restrictor',omp(1:min(size(omp),10)) - ! Compute omega_int - ommx = zzero - do i=1, ncol - if (ilaggr(i) >0) then - omi(i) = omp(ilaggr(i)) - else - omi(i) = zzero - end if - if(abs(omi(i)) .gt. abs(ommx)) ommx = omi(i) - end do - ! Compute omega_fine - ! Going over the columns of atmp means going over the rows - ! of A^T. Hopefully ;-) - call atmp%cp_to(acsc) - - do i=1, nrow - omf(i) = ommx - do j= acsc%icp(i),acsc%icp(i+1)-1 - if(abs(omi(acsc%ia(j))) .lt. abs(omf(i))) omf(i)=omi(acsc%ia(j)) - end do -!!$ if(min(real(omf(i)),aimag(omf(i))) < dzero) omf(i) = zzero - if(psb_minreal(omf(i)) < dzero) omf(i) = zzero - end do - omf(1:nrow) = omf(1:nrow)*adinv(1:nrow) - call psb_halo(omf,desc_a,info) - call acsc%free() - - - call atmp%mv_to(acsr1) - - do i=1,acsr1%get_nrows() - do j=acsr1%irp(i),acsr1%irp(i+1)-1 - if (acsr1%ja(j) == i) then - acsr1%val(j) = zone - acsr1%val(j)*omf(acsr1%ja(j)) - else - acsr1%val(j) = - acsr1%val(j)*omf(acsr1%ja(j)) - end if - end do - end do - call atmp%mv_from(acsr1) - - call rtilde%mv_to(tmpcoo) - nzl = tmpcoo%get_nzeros() - i=0 - do k=1, nzl - if ((naggrm1 < tmpcoo%ia(k)) .and. (tmpcoo%ia(k) <= naggrp1)) then - i = i+1 - tmpcoo%val(i) = tmpcoo%val(k) - tmpcoo%ia(i) = tmpcoo%ia(k) - tmpcoo%ja(i) = tmpcoo%ja(k) - end if - end do - call tmpcoo%set_nzeros(i) - call rtilde%mv_from(tmpcoo) - call rtilde%cscnv(info,type='csr') - - call psb_spspmm(rtilde,atmp,op_restr,info) - - ! - ! Now we have to gather the halo of op_prol, and add it to itself - ! to multiply it by A, - ! - call op_prol%clone(tmp_prol,info) - if (info == psb_success_) call psb_sphalo(tmp_prol,desc_a,am4,info,& - & colcnv=.false.,rowscale=.true.) - if (info == psb_success_) call psb_rwextd(ncol,tmp_prol,info,b=am4) - if (info == psb_success_) call am4%free() - - if(info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='Halo of op_prol') - goto 9999 - end if - - ! - ! Now we have to fix this. The only rows of B that are correct - ! are those corresponding to "local" aggregates, i.e. indices in ilaggr(:) - ! - call op_restr%mv_to(tmpcoo) - - nzl = tmpcoo%get_nzeros() - i=0 - do k=1, nzl - if ((naggrm1 < tmpcoo%ia(k)) .and. (tmpcoo%ia(k) <= naggrp1)) then - i = i+1 - tmpcoo%val(i) = tmpcoo%val(k) - tmpcoo%ia(i) = tmpcoo%ia(k) - tmpcoo%ja(i) = tmpcoo%ja(k) - end if - end do - call tmpcoo%set_nzeros(i) - call op_restr%mv_from(tmpcoo) - call op_restr%cscnv(info,type='csr') - - - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'starting sphalo/ rwxtd' - - call psb_spspmm(la,tmp_prol,am3,info) - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done SPSPMM 2' - - call psb_sphalo(am3,desc_a,am4,info,& - & colcnv=.false.,rowscale=.true.) - if (info == psb_success_) call psb_rwextd(ncol,am3,info,b=am4) - if (info == psb_success_) call am4%free() - - if(info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,& - & a_err='Extend am3') - goto 9999 - end if - if (debug_level >= psb_debug_outer_) & - & write(debug_unit,*) me,' ',trim(name),& - & 'Done sphalo/ rwxtd' - - call psb_spspmm(op_restr,am3,ac,info) - if (info == psb_success_) call am3%free() - if (info == psb_success_) call ac%cscnv(info,type='coo',dupl=psb_dupl_add_) - - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,& - &a_err='Build ac = op_restr x am3') - goto 9999 - end if +!!$ ! Get the diagonal D +!!$ adiag = a%get_diag(info) +!!$ if (info == psb_success_) & +!!$ & call psb_realloc(ncol,adiag,info) +!!$ if (info == psb_success_) & +!!$ & call psb_halo(adiag,desc_a,info) +!!$ if (info == psb_success_) call a%cp_to_l(la) +!!$ if (info /= psb_success_) then +!!$ call psb_errpush(psb_err_from_subroutine_,name,a_err='sp_getdiag') +!!$ goto 9999 +!!$ end if +!!$ +!!$ do i=1,size(adiag) +!!$ if (adiag(i) /= zzero) then +!!$ adinv(i) = zone / adiag(i) +!!$ else +!!$ adinv(i) = zone +!!$ end if +!!$ end do +!!$ +!!$ +!!$ +!!$ ! 1. Allocate Ptilde in sparse matrix form +!!$ call op_prol%mv_to(tmpcoo) +!!$ call ptilde%mv_from(tmpcoo) +!!$ call ptilde%cscnv(info,type='csr') +!!$ +!!$ if (info == psb_success_) call la%cscnv(am3,info,type='csr',dupl=psb_dupl_add_) +!!$ if (info == psb_success_) call la%cscnv(da,info,type='csr',dupl=psb_dupl_add_) +!!$ if (info /= psb_success_) then +!!$ call psb_errpush(psb_err_from_subroutine_,name,a_err='spcnv') +!!$ goto 9999 +!!$ end if +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & ' Initial copies done.' +!!$ +!!$ call da%scal(adinv,info) +!!$ +!!$ call psb_spspmm(da,ptilde,dap,info) +!!$ +!!$ if(info /= psb_success_) then +!!$ call psb_errpush(psb_err_from_subroutine_,name,a_err='spspmm 1') +!!$ goto 9999 +!!$ end if +!!$ +!!$ call dap%clone(atmp,info) +!!$ +!!$ call psb_sphalo(atmp,desc_a,am4,info,& +!!$ & colcnv=.false.,rowscale=.true.,outfmt='CSR ') +!!$ if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=am4) +!!$ if (info == psb_success_) call am4%free() +!!$ +!!$ call psb_spspmm(da,atmp,dadap,info) +!!$ call atmp%free() +!!$ +!!$ ! !$ write(0,*) 'Columns of AP',psb_sp_get_ncols(ap) +!!$ ! !$ write(0,*) 'Columns of ADAP',psb_sp_get_ncols(adap) +!!$ call dap%mv_to(csc_dap) +!!$ call dadap%mv_to(csc_dadap) +!!$ +!!$ call csc_mat_col_prod(csc_dap,csc_dadap,omp,info) +!!$ call csc_mat_col_prod(csc_dadap,csc_dadap,oden,info) +!!$ call psb_sum(ctxt,omp) +!!$ call psb_sum(ctxt,oden) +!!$ ! !$ write(0,*) trim(name),' OMP :',omp +!!$ ! !$ write(0,*) trim(name),' ODEN:',oden +!!$ +!!$ omp = omp/oden +!!$ +!!$ ! !$ write(0,*) 'Check on output prolongator ',omp(1:min(size(omp),10)) +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done NUMBMM 1' +!!$ +!!$ call am3%mv_to(acsr3) +!!$ ! Compute omega_int +!!$ ommx = zzero +!!$ do i=1, ncol +!!$ if (ilaggr(i) >0) then +!!$ omi(i) = omp(ilaggr(i)) +!!$ else +!!$ omi(i) = zzero +!!$ end if +!!$ if(abs(omi(i)) .gt. abs(ommx)) ommx = omi(i) +!!$ end do +!!$ ! Compute omega_fine +!!$ do i=1, nrow +!!$ omf(i) = ommx +!!$ do j=acsr3%irp(i),acsr3%irp(i+1)-1 +!!$ if(abs(omi(acsr3%ja(j))) .lt. abs(omf(i))) omf(i)=omi(acsr3%ja(j)) +!!$ end do +!!$ ! ! if(min(real(omf(i)),aimag(omf(i))) < dzero) omf(i) = zzero +!!$ if(psb_minreal(omf(i)) < dzero) omf(i) = zzero +!!$ end do +!!$ +!!$ omf(1:nrow) = omf(1:nrow) * adinv(1:nrow) +!!$ +!!$ if (filter_mat) then +!!$ ! +!!$ ! Build the filtered matrix Af from A +!!$ ! +!!$ call la%cscnv(acsrf,info,dupl=psb_dupl_add_) +!!$ +!!$ do i=1,nrow +!!$ tmp = zzero +!!$ jd = -1 +!!$ do j=acsrf%irp(i),acsrf%irp(i+1)-1 +!!$ if (acsrf%ja(j) == i) jd = j +!!$ if (abs(acsrf%val(j)) < theta*sqrt(abs(adiag(i)*adiag(acsrf%ja(j))))) then +!!$ tmp=tmp+acsrf%val(j) +!!$ acsrf%val(j)=zzero +!!$ endif +!!$ enddo +!!$ if (jd == -1) then +!!$ write(0,*) 'Wrong input: we need the diagonal!!!!', i +!!$ else +!!$ acsrf%val(jd)=acsrf%val(jd)-tmp +!!$ end if +!!$ enddo +!!$ ! Take out zeroed terms +!!$ call acsrf%clean_zeros(info) +!!$ +!!$ ! +!!$ ! Build the smoothed prolongator using the filtered matrix +!!$ ! +!!$ do i=1,acsrf%get_nrows() +!!$ do j=acsrf%irp(i),acsrf%irp(i+1)-1 +!!$ if (acsrf%ja(j) == i) then +!!$ acsrf%val(j) = zone - omf(i)*acsrf%val(j) +!!$ else +!!$ acsrf%val(j) = - omf(i)*acsrf%val(j) +!!$ end if +!!$ end do +!!$ end do +!!$ +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done gather, going for SYMBMM 1' +!!$ +!!$ call af%mv_from(acsrf) +!!$ ! +!!$ ! op_prol = (I-w*D*Af)Ptilde +!!$ ! Doing it this way means to consider diag(Af_i) +!!$ ! +!!$ ! +!!$ call psb_spspmm(af,ptilde,op_prol,info) +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done SPSPMM 1' +!!$ else +!!$ ! +!!$ ! Build the smoothed prolongator using the original matrix +!!$ ! +!!$ do i=1,acsr3%get_nrows() +!!$ do j=acsr3%irp(i),acsr3%irp(i+1)-1 +!!$ if (acsr3%ja(j) == i) then +!!$ acsr3%val(j) = zone - omf(i)*acsr3%val(j) +!!$ else +!!$ acsr3%val(j) = - omf(i)*acsr3%val(j) +!!$ end if +!!$ end do +!!$ end do +!!$ +!!$ call am3%mv_from(acsr3) +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done gather, going for SYMBMM 1' +!!$ ! +!!$ ! +!!$ ! op_prol = (I-w*D*A)Ptilde +!!$ ! +!!$ ! +!!$ call psb_spspmm(am3,ptilde,op_prol,info) +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done NUMBMM 1' +!!$ +!!$ end if +!!$ +!!$ +!!$ ! +!!$ ! Ok, let's start over with the restrictor +!!$ ! +!!$ call ptilde%transc(rtilde) +!!$ call la%cscnv(atmp,info,type='csr') +!!$ call psb_sphalo(atmp,desc_a,am4,info,& +!!$ & colcnv=.true.,rowscale=.true.) +!!$ nrt = am4%get_nrows() +!!$ call am4%csclip(atmp2,info,lone,nrt,lone,ncol) +!!$ call atmp2%cscnv(info,type='CSR') +!!$ if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=atmp2) +!!$ call am4%free() +!!$ call atmp2%free() +!!$ +!!$ ! This is to compute the transpose. It ONLY works if the +!!$ ! original A has a symmetric pattern. +!!$ call atmp%transc(atmp2) +!!$ call atmp2%csclip(dat,info,lone,nrow,lone,ncol) +!!$ call dat%cscnv(info,type='csr') +!!$ call dat%scal(adinv,info) +!!$ +!!$ ! Now for the product. +!!$ call psb_spspmm(dat,ptilde,datp,info) +!!$ +!!$ call datp%clone(atmp2,info) +!!$ call psb_sphalo(atmp2,desc_a,am4,info,& +!!$ & colcnv=.false.,rowscale=.true.,outfmt='CSR ') +!!$ if (info == psb_success_) call psb_rwextd(ncol,atmp2,info,b=am4) +!!$ if (info == psb_success_) call am4%free() +!!$ +!!$ +!!$ call psb_symbmm(dat,atmp2,datdatp,info) +!!$ call psb_numbmm(dat,atmp2,datdatp) +!!$ call atmp2%free() +!!$ +!!$ call datp%mv_to(csc_datp) +!!$ call datdatp%mv_to(csc_datdatp) +!!$ +!!$ call csc_mat_col_prod(csc_datp,csc_datdatp,omp,info) +!!$ call csc_mat_col_prod(csc_datdatp,csc_datdatp,oden,info) +!!$ call psb_sum(ctxt,omp) +!!$ call psb_sum(ctxt,oden) +!!$ +!!$ +!!$ ! !$ write(debug_unit,*) trim(name),' OMP_R :',omp +!!$ ! ! $ write(debug_unit,*) trim(name),' ODEN_R:',oden +!!$ omp = omp/oden +!!$ ! !$ write(0,*) 'Check on output restrictor',omp(1:min(size(omp),10)) +!!$ ! Compute omega_int +!!$ ommx = zzero +!!$ do i=1, ncol +!!$ if (ilaggr(i) >0) then +!!$ omi(i) = omp(ilaggr(i)) +!!$ else +!!$ omi(i) = zzero +!!$ end if +!!$ if(abs(omi(i)) .gt. abs(ommx)) ommx = omi(i) +!!$ end do +!!$ ! Compute omega_fine +!!$ ! Going over the columns of atmp means going over the rows +!!$ ! of A^T. Hopefully ;-) +!!$ call atmp%cp_to(acsc) +!!$ +!!$ do i=1, nrow +!!$ omf(i) = ommx +!!$ do j= acsc%icp(i),acsc%icp(i+1)-1 +!!$ if(abs(omi(acsc%ia(j))) .lt. abs(omf(i))) omf(i)=omi(acsc%ia(j)) +!!$ end do +!!$ ! ! if(min(real(omf(i)),aimag(omf(i))) < dzero) omf(i) = zzero +!!$ if(psb_minreal(omf(i)) < dzero) omf(i) = zzero +!!$ end do +!!$ omf(1:nrow) = omf(1:nrow)*adinv(1:nrow) +!!$ call psb_halo(omf,desc_a,info) +!!$ call acsc%free() +!!$ +!!$ +!!$ call atmp%mv_to(acsr1) +!!$ +!!$ do i=1,acsr1%get_nrows() +!!$ do j=acsr1%irp(i),acsr1%irp(i+1)-1 +!!$ if (acsr1%ja(j) == i) then +!!$ acsr1%val(j) = zone - acsr1%val(j)*omf(acsr1%ja(j)) +!!$ else +!!$ acsr1%val(j) = - acsr1%val(j)*omf(acsr1%ja(j)) +!!$ end if +!!$ end do +!!$ end do +!!$ call atmp%mv_from(acsr1) +!!$ +!!$ call rtilde%mv_to(tmpcoo) +!!$ nzl = tmpcoo%get_nzeros() +!!$ i=0 +!!$ do k=1, nzl +!!$ if ((naggrm1 < tmpcoo%ia(k)) .and. (tmpcoo%ia(k) <= naggrp1)) then +!!$ i = i+1 +!!$ tmpcoo%val(i) = tmpcoo%val(k) +!!$ tmpcoo%ia(i) = tmpcoo%ia(k) +!!$ tmpcoo%ja(i) = tmpcoo%ja(k) +!!$ end if +!!$ end do +!!$ call tmpcoo%set_nzeros(i) +!!$ call rtilde%mv_from(tmpcoo) +!!$ call rtilde%cscnv(info,type='csr') +!!$ +!!$ call psb_spspmm(rtilde,atmp,op_restr,info) +!!$ +!!$ ! +!!$ ! Now we have to gather the halo of op_prol, and add it to itself +!!$ ! to multiply it by A, +!!$ ! +!!$ call op_prol%clone(tmp_prol,info) +!!$ if (info == psb_success_) call psb_sphalo(tmp_prol,desc_a,am4,info,& +!!$ & colcnv=.false.,rowscale=.true.) +!!$ if (info == psb_success_) call psb_rwextd(ncol,tmp_prol,info,b=am4) +!!$ if (info == psb_success_) call am4%free() +!!$ +!!$ if(info /= psb_success_) then +!!$ call psb_errpush(psb_err_internal_error_,name,a_err='Halo of op_prol') +!!$ goto 9999 +!!$ end if +!!$ +!!$ ! +!!$ ! Now we have to fix this. The only rows of B that are correct +!!$ ! are those corresponding to "local" aggregates, i.e. indices in ilaggr(:) +!!$ ! +!!$ call op_restr%mv_to(tmpcoo) +!!$ +!!$ nzl = tmpcoo%get_nzeros() +!!$ i=0 +!!$ do k=1, nzl +!!$ if ((naggrm1 < tmpcoo%ia(k)) .and. (tmpcoo%ia(k) <= naggrp1)) then +!!$ i = i+1 +!!$ tmpcoo%val(i) = tmpcoo%val(k) +!!$ tmpcoo%ia(i) = tmpcoo%ia(k) +!!$ tmpcoo%ja(i) = tmpcoo%ja(k) +!!$ end if +!!$ end do +!!$ call tmpcoo%set_nzeros(i) +!!$ call op_restr%mv_from(tmpcoo) +!!$ call op_restr%cscnv(info,type='csr') +!!$ +!!$ +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'starting sphalo/ rwxtd' +!!$ +!!$ call psb_spspmm(la,tmp_prol,am3,info) +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done SPSPMM 2' +!!$ +!!$ call psb_sphalo(am3,desc_a,am4,info,& +!!$ & colcnv=.false.,rowscale=.true.) +!!$ if (info == psb_success_) call psb_rwextd(ncol,am3,info,b=am4) +!!$ if (info == psb_success_) call am4%free() +!!$ +!!$ if(info /= psb_success_) then +!!$ call psb_errpush(psb_err_internal_error_,name,& +!!$ & a_err='Extend am3') +!!$ goto 9999 +!!$ end if +!!$ if (debug_level >= psb_debug_outer_) & +!!$ & write(debug_unit,*) me,' ',trim(name),& +!!$ & 'Done sphalo/ rwxtd' +!!$ +!!$ call psb_spspmm(op_restr,am3,ac,info) +!!$ if (info == psb_success_) call am3%free() +!!$ if (info == psb_success_) call ac%cscnv(info,type='coo',dupl=psb_dupl_add_) +!!$ +!!$ if (info /= psb_success_) then +!!$ call psb_errpush(psb_err_internal_error_,name,& +!!$ &a_err='Build ac = op_restr x am3') +!!$ goto 9999 +!!$ end if diff --git a/amgprec/impl/aggregator/amg_zaggrmat_smth_bld.f90 b/amgprec/impl/aggregator/amg_zaggrmat_smth_bld.f90 index dc289067..2f944699 100644 --- a/amgprec/impl/aggregator/amg_zaggrmat_smth_bld.f90 +++ b/amgprec/impl/aggregator/amg_zaggrmat_smth_bld.f90 @@ -116,7 +116,7 @@ subroutine amg_zaggrmat_smth_bld(a,desc_a,ilaggr,nlaggr,parms,& type(psb_desc_type), intent(inout) :: desc_a integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(amg_dml_parms), intent(inout) :: parms - type(psb_zspmat_type), intent(out) :: op_prol,ac,op_restr + type(psb_zspmat_type), intent(inout) :: op_prol,ac,op_restr type(psb_lzspmat_type), intent(inout) :: t_prol type(psb_desc_type), intent(inout) :: desc_ac integer(psb_ipk_), intent(out) :: info diff --git a/amgprec/impl/amg_cprecset.F90 b/amgprec/impl/amg_cprecset.F90 index 818d51a8..ff96f6cc 100644 --- a/amgprec/impl/amg_cprecset.F90 +++ b/amgprec/impl/amg_cprecset.F90 @@ -45,7 +45,7 @@ subroutine amg_cprecsetsm(p,val,info,ilev,ilmax,pos) implicit none ! Arguments - class(amg_cprec_type), intent(inout) :: p + class(amg_cprec_type), target, intent(inout):: p class(amg_c_base_smoother_type), intent(in) :: val integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), optional, intent(in) :: ilev,ilmax diff --git a/amgprec/impl/amg_dprecset.F90 b/amgprec/impl/amg_dprecset.F90 index 607e038f..16928156 100644 --- a/amgprec/impl/amg_dprecset.F90 +++ b/amgprec/impl/amg_dprecset.F90 @@ -45,7 +45,7 @@ subroutine amg_dprecsetsm(p,val,info,ilev,ilmax,pos) implicit none ! Arguments - class(amg_dprec_type), intent(inout) :: p + class(amg_dprec_type), target, intent(inout):: p class(amg_d_base_smoother_type), intent(in) :: val integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), optional, intent(in) :: ilev,ilmax diff --git a/amgprec/impl/amg_sprecset.F90 b/amgprec/impl/amg_sprecset.F90 index 1e5daed4..2b2c1c98 100644 --- a/amgprec/impl/amg_sprecset.F90 +++ b/amgprec/impl/amg_sprecset.F90 @@ -45,7 +45,7 @@ subroutine amg_sprecsetsm(p,val,info,ilev,ilmax,pos) implicit none ! Arguments - class(amg_sprec_type), intent(inout) :: p + class(amg_sprec_type), target, intent(inout):: p class(amg_s_base_smoother_type), intent(in) :: val integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), optional, intent(in) :: ilev,ilmax diff --git a/amgprec/impl/amg_zprecset.F90 b/amgprec/impl/amg_zprecset.F90 index f5ef7fd7..0337b3c3 100644 --- a/amgprec/impl/amg_zprecset.F90 +++ b/amgprec/impl/amg_zprecset.F90 @@ -45,7 +45,7 @@ subroutine amg_zprecsetsm(p,val,info,ilev,ilmax,pos) implicit none ! Arguments - class(amg_zprec_type), intent(inout) :: p + class(amg_zprec_type), target, intent(inout):: p class(amg_z_base_smoother_type), intent(in) :: val integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), optional, intent(in) :: ilev,ilmax diff --git a/amgprec/impl/solver/amg_c_base_solver_csetr.f90 b/amgprec/impl/solver/amg_c_base_solver_csetr.f90 index f5751876..b78209a4 100644 --- a/amgprec/impl/solver/amg_c_base_solver_csetr.f90 +++ b/amgprec/impl/solver/amg_c_base_solver_csetr.f90 @@ -42,7 +42,7 @@ subroutine amg_c_base_solver_csetr(sv,what,val,info,idx) Implicit None ! Arguments class(amg_c_base_solver_type), intent(inout) :: sv - integer(psb_ipk_), intent(in) :: what + character(len=*), intent(in) :: what real(psb_spk_), intent(in) :: val integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(in), optional :: idx diff --git a/amgprec/impl/solver/amg_c_bwgs_solver_bld.f90 b/amgprec/impl/solver/amg_c_bwgs_solver_bld.f90 index 68b87e3a..f760c80f 100644 --- a/amgprec/impl/solver/amg_c_bwgs_solver_bld.f90 +++ b/amgprec/impl/solver/amg_c_bwgs_solver_bld.f90 @@ -44,7 +44,7 @@ subroutine amg_c_bwgs_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) ! Arguments type(psb_cspmat_type), intent(in), target :: a - Type(psb_desc_type), Intent(in) :: desc_a + Type(psb_desc_type), Intent(inout) :: desc_a class(amg_c_bwgs_solver_type), intent(inout) :: sv integer(psb_ipk_), intent(out) :: info type(psb_cspmat_type), intent(in), target, optional :: b diff --git a/amgprec/impl/solver/amg_c_krm_solver_impl.f90 b/amgprec/impl/solver/amg_c_krm_solver_impl.f90 index 12e6f039..3c93488f 100644 --- a/amgprec/impl/solver/amg_c_krm_solver_impl.f90 +++ b/amgprec/impl/solver/amg_c_krm_solver_impl.f90 @@ -77,7 +77,7 @@ ! This is the implementation file corresponding to amg_c_krm_solver_mod. ! ! -subroutine amg_c_krm_solver_bld(a,desc_a,sv,info,b,amold,vmold) +subroutine amg_c_krm_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) use psb_base_mod use amg_c_krm_solver, amg_protect_name => amg_c_krm_solver_bld @@ -85,13 +85,14 @@ subroutine amg_c_krm_solver_bld(a,desc_a,sv,info,b,amold,vmold) Implicit None ! Arguments - type(psb_cspmat_type), intent(inout), target :: a + type(psb_cspmat_type), intent(in), target :: a Type(psb_desc_type), Intent(inout) :: desc_a class(amg_c_krm_solver_type), intent(inout) :: sv integer(psb_ipk_), intent(out) :: info type(psb_cspmat_type), intent(in), target, optional :: b class(psb_c_base_sparse_mat), intent(in), optional :: amold class(psb_c_base_vect_type), intent(in), optional :: vmold + class(psb_i_base_vect_type), intent(in), optional :: imold ! Local variables integer(psb_ipk_) :: n_row,n_col, nrow_a, nztota integer(psb_lpk_) :: lnr diff --git a/amgprec/impl/solver/amg_d_base_solver_csetr.f90 b/amgprec/impl/solver/amg_d_base_solver_csetr.f90 index 5c4affd9..8cae84ee 100644 --- a/amgprec/impl/solver/amg_d_base_solver_csetr.f90 +++ b/amgprec/impl/solver/amg_d_base_solver_csetr.f90 @@ -42,7 +42,7 @@ subroutine amg_d_base_solver_csetr(sv,what,val,info,idx) Implicit None ! Arguments class(amg_d_base_solver_type), intent(inout) :: sv - integer(psb_ipk_), intent(in) :: what + character(len=*), intent(in) :: what real(psb_dpk_), intent(in) :: val integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(in), optional :: idx diff --git a/amgprec/impl/solver/amg_d_bwgs_solver_bld.f90 b/amgprec/impl/solver/amg_d_bwgs_solver_bld.f90 index 88b56731..859c8ebe 100644 --- a/amgprec/impl/solver/amg_d_bwgs_solver_bld.f90 +++ b/amgprec/impl/solver/amg_d_bwgs_solver_bld.f90 @@ -44,7 +44,7 @@ subroutine amg_d_bwgs_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) ! Arguments type(psb_dspmat_type), intent(in), target :: a - Type(psb_desc_type), Intent(in) :: desc_a + Type(psb_desc_type), Intent(inout) :: desc_a class(amg_d_bwgs_solver_type), intent(inout) :: sv integer(psb_ipk_), intent(out) :: info type(psb_dspmat_type), intent(in), target, optional :: b diff --git a/amgprec/impl/solver/amg_d_krm_solver_impl.f90 b/amgprec/impl/solver/amg_d_krm_solver_impl.f90 index 63331533..dd308157 100644 --- a/amgprec/impl/solver/amg_d_krm_solver_impl.f90 +++ b/amgprec/impl/solver/amg_d_krm_solver_impl.f90 @@ -77,7 +77,7 @@ ! This is the implementation file corresponding to amg_d_krm_solver_mod. ! ! -subroutine amg_d_krm_solver_bld(a,desc_a,sv,info,b,amold,vmold) +subroutine amg_d_krm_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) use psb_base_mod use amg_d_krm_solver, amg_protect_name => amg_d_krm_solver_bld @@ -85,13 +85,14 @@ subroutine amg_d_krm_solver_bld(a,desc_a,sv,info,b,amold,vmold) Implicit None ! Arguments - type(psb_dspmat_type), intent(inout), target :: a + type(psb_dspmat_type), intent(in), target :: a Type(psb_desc_type), Intent(inout) :: desc_a class(amg_d_krm_solver_type), intent(inout) :: sv integer(psb_ipk_), intent(out) :: info type(psb_dspmat_type), intent(in), target, optional :: b class(psb_d_base_sparse_mat), intent(in), optional :: amold class(psb_d_base_vect_type), intent(in), optional :: vmold + class(psb_i_base_vect_type), intent(in), optional :: imold ! Local variables integer(psb_ipk_) :: n_row,n_col, nrow_a, nztota integer(psb_lpk_) :: lnr diff --git a/amgprec/impl/solver/amg_s_base_solver_csetr.f90 b/amgprec/impl/solver/amg_s_base_solver_csetr.f90 index a7dcf1a4..74f59e0e 100644 --- a/amgprec/impl/solver/amg_s_base_solver_csetr.f90 +++ b/amgprec/impl/solver/amg_s_base_solver_csetr.f90 @@ -42,7 +42,7 @@ subroutine amg_s_base_solver_csetr(sv,what,val,info,idx) Implicit None ! Arguments class(amg_s_base_solver_type), intent(inout) :: sv - integer(psb_ipk_), intent(in) :: what + character(len=*), intent(in) :: what real(psb_spk_), intent(in) :: val integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(in), optional :: idx diff --git a/amgprec/impl/solver/amg_s_bwgs_solver_bld.f90 b/amgprec/impl/solver/amg_s_bwgs_solver_bld.f90 index 3df9df7b..e96e1229 100644 --- a/amgprec/impl/solver/amg_s_bwgs_solver_bld.f90 +++ b/amgprec/impl/solver/amg_s_bwgs_solver_bld.f90 @@ -44,7 +44,7 @@ subroutine amg_s_bwgs_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) ! Arguments type(psb_sspmat_type), intent(in), target :: a - Type(psb_desc_type), Intent(in) :: desc_a + Type(psb_desc_type), Intent(inout) :: desc_a class(amg_s_bwgs_solver_type), intent(inout) :: sv integer(psb_ipk_), intent(out) :: info type(psb_sspmat_type), intent(in), target, optional :: b diff --git a/amgprec/impl/solver/amg_s_krm_solver_impl.f90 b/amgprec/impl/solver/amg_s_krm_solver_impl.f90 index c51aaccb..1b0efd1b 100644 --- a/amgprec/impl/solver/amg_s_krm_solver_impl.f90 +++ b/amgprec/impl/solver/amg_s_krm_solver_impl.f90 @@ -77,7 +77,7 @@ ! This is the implementation file corresponding to amg_s_krm_solver_mod. ! ! -subroutine amg_s_krm_solver_bld(a,desc_a,sv,info,b,amold,vmold) +subroutine amg_s_krm_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) use psb_base_mod use amg_s_krm_solver, amg_protect_name => amg_s_krm_solver_bld @@ -85,13 +85,14 @@ subroutine amg_s_krm_solver_bld(a,desc_a,sv,info,b,amold,vmold) Implicit None ! Arguments - type(psb_sspmat_type), intent(inout), target :: a + type(psb_sspmat_type), intent(in), target :: a Type(psb_desc_type), Intent(inout) :: desc_a class(amg_s_krm_solver_type), intent(inout) :: sv integer(psb_ipk_), intent(out) :: info type(psb_sspmat_type), intent(in), target, optional :: b class(psb_s_base_sparse_mat), intent(in), optional :: amold class(psb_s_base_vect_type), intent(in), optional :: vmold + class(psb_i_base_vect_type), intent(in), optional :: imold ! Local variables integer(psb_ipk_) :: n_row,n_col, nrow_a, nztota integer(psb_lpk_) :: lnr diff --git a/amgprec/impl/solver/amg_z_base_solver_csetr.f90 b/amgprec/impl/solver/amg_z_base_solver_csetr.f90 index 80875820..5c14d396 100644 --- a/amgprec/impl/solver/amg_z_base_solver_csetr.f90 +++ b/amgprec/impl/solver/amg_z_base_solver_csetr.f90 @@ -42,7 +42,7 @@ subroutine amg_z_base_solver_csetr(sv,what,val,info,idx) Implicit None ! Arguments class(amg_z_base_solver_type), intent(inout) :: sv - integer(psb_ipk_), intent(in) :: what + character(len=*), intent(in) :: what real(psb_dpk_), intent(in) :: val integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(in), optional :: idx diff --git a/amgprec/impl/solver/amg_z_bwgs_solver_bld.f90 b/amgprec/impl/solver/amg_z_bwgs_solver_bld.f90 index 3db433fe..dec629f5 100644 --- a/amgprec/impl/solver/amg_z_bwgs_solver_bld.f90 +++ b/amgprec/impl/solver/amg_z_bwgs_solver_bld.f90 @@ -44,7 +44,7 @@ subroutine amg_z_bwgs_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) ! Arguments type(psb_zspmat_type), intent(in), target :: a - Type(psb_desc_type), Intent(in) :: desc_a + Type(psb_desc_type), Intent(inout) :: desc_a class(amg_z_bwgs_solver_type), intent(inout) :: sv integer(psb_ipk_), intent(out) :: info type(psb_zspmat_type), intent(in), target, optional :: b diff --git a/amgprec/impl/solver/amg_z_krm_solver_impl.f90 b/amgprec/impl/solver/amg_z_krm_solver_impl.f90 index e4c4e308..33972c4b 100644 --- a/amgprec/impl/solver/amg_z_krm_solver_impl.f90 +++ b/amgprec/impl/solver/amg_z_krm_solver_impl.f90 @@ -77,7 +77,7 @@ ! This is the implementation file corresponding to amg_z_krm_solver_mod. ! ! -subroutine amg_z_krm_solver_bld(a,desc_a,sv,info,b,amold,vmold) +subroutine amg_z_krm_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) use psb_base_mod use amg_z_krm_solver, amg_protect_name => amg_z_krm_solver_bld @@ -85,13 +85,14 @@ subroutine amg_z_krm_solver_bld(a,desc_a,sv,info,b,amold,vmold) Implicit None ! Arguments - type(psb_zspmat_type), intent(inout), target :: a + type(psb_zspmat_type), intent(in), target :: a Type(psb_desc_type), Intent(inout) :: desc_a class(amg_z_krm_solver_type), intent(inout) :: sv integer(psb_ipk_), intent(out) :: info type(psb_zspmat_type), intent(in), target, optional :: b class(psb_z_base_sparse_mat), intent(in), optional :: amold class(psb_z_base_vect_type), intent(in), optional :: vmold + class(psb_i_base_vect_type), intent(in), optional :: imold ! Local variables integer(psb_ipk_) :: n_row,n_col, nrow_a, nztota integer(psb_lpk_) :: lnr From 7319dab30fd3ada920c3218fbf5c669a4610b857 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Mon, 21 Jun 2021 21:44:09 +0200 Subject: [PATCH 09/36] Deactivate MINNRG --- amgprec/impl/aggregator/amg_caggrmat_minnrg_bld.f90 | 3 +++ amgprec/impl/aggregator/amg_daggrmat_minnrg_bld.f90 | 3 +++ amgprec/impl/aggregator/amg_saggrmat_minnrg_bld.f90 | 3 +++ amgprec/impl/aggregator/amg_zaggrmat_minnrg_bld.f90 | 3 +++ 4 files changed, 12 insertions(+) diff --git a/amgprec/impl/aggregator/amg_caggrmat_minnrg_bld.f90 b/amgprec/impl/aggregator/amg_caggrmat_minnrg_bld.f90 index 612c2953..f8223877 100644 --- a/amgprec/impl/aggregator/amg_caggrmat_minnrg_bld.f90 +++ b/amgprec/impl/aggregator/amg_caggrmat_minnrg_bld.f90 @@ -154,6 +154,9 @@ subroutine amg_caggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,& ctxt = desc_a%get_context() icomm = desc_a%get_mpic() + info=psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 call psb_info(ctxt, me, np) diff --git a/amgprec/impl/aggregator/amg_daggrmat_minnrg_bld.f90 b/amgprec/impl/aggregator/amg_daggrmat_minnrg_bld.f90 index f7b21847..aaa1c52f 100644 --- a/amgprec/impl/aggregator/amg_daggrmat_minnrg_bld.f90 +++ b/amgprec/impl/aggregator/amg_daggrmat_minnrg_bld.f90 @@ -154,6 +154,9 @@ subroutine amg_daggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,& ctxt = desc_a%get_context() icomm = desc_a%get_mpic() + info=psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 call psb_info(ctxt, me, np) diff --git a/amgprec/impl/aggregator/amg_saggrmat_minnrg_bld.f90 b/amgprec/impl/aggregator/amg_saggrmat_minnrg_bld.f90 index 66514a66..50d85713 100644 --- a/amgprec/impl/aggregator/amg_saggrmat_minnrg_bld.f90 +++ b/amgprec/impl/aggregator/amg_saggrmat_minnrg_bld.f90 @@ -154,6 +154,9 @@ subroutine amg_saggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,& ctxt = desc_a%get_context() icomm = desc_a%get_mpic() + info=psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 call psb_info(ctxt, me, np) diff --git a/amgprec/impl/aggregator/amg_zaggrmat_minnrg_bld.f90 b/amgprec/impl/aggregator/amg_zaggrmat_minnrg_bld.f90 index 89d6d89d..90adcf9b 100644 --- a/amgprec/impl/aggregator/amg_zaggrmat_minnrg_bld.f90 +++ b/amgprec/impl/aggregator/amg_zaggrmat_minnrg_bld.f90 @@ -154,6 +154,9 @@ subroutine amg_zaggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,& ctxt = desc_a%get_context() icomm = desc_a%get_mpic() + info=psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 call psb_info(ctxt, me, np) From 8482067b52d135be6cdf6e989455aa9e8351b6f0 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Mon, 28 Jun 2021 18:42:34 +0200 Subject: [PATCH 10/36] Deactivate MINNRG --- amgprec/impl/aggregator/amg_caggrmat_minnrg_bld.f90 | 3 --- amgprec/impl/aggregator/amg_daggrmat_minnrg_bld.f90 | 3 --- amgprec/impl/aggregator/amg_saggrmat_minnrg_bld.f90 | 3 --- amgprec/impl/aggregator/amg_zaggrmat_minnrg_bld.f90 | 3 --- 4 files changed, 12 deletions(-) diff --git a/amgprec/impl/aggregator/amg_caggrmat_minnrg_bld.f90 b/amgprec/impl/aggregator/amg_caggrmat_minnrg_bld.f90 index f8223877..612c2953 100644 --- a/amgprec/impl/aggregator/amg_caggrmat_minnrg_bld.f90 +++ b/amgprec/impl/aggregator/amg_caggrmat_minnrg_bld.f90 @@ -154,9 +154,6 @@ subroutine amg_caggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,& ctxt = desc_a%get_context() icomm = desc_a%get_mpic() - info=psb_err_internal_error_ - call psb_errpush(info,name) - goto 9999 call psb_info(ctxt, me, np) diff --git a/amgprec/impl/aggregator/amg_daggrmat_minnrg_bld.f90 b/amgprec/impl/aggregator/amg_daggrmat_minnrg_bld.f90 index aaa1c52f..f7b21847 100644 --- a/amgprec/impl/aggregator/amg_daggrmat_minnrg_bld.f90 +++ b/amgprec/impl/aggregator/amg_daggrmat_minnrg_bld.f90 @@ -154,9 +154,6 @@ subroutine amg_daggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,& ctxt = desc_a%get_context() icomm = desc_a%get_mpic() - info=psb_err_internal_error_ - call psb_errpush(info,name) - goto 9999 call psb_info(ctxt, me, np) diff --git a/amgprec/impl/aggregator/amg_saggrmat_minnrg_bld.f90 b/amgprec/impl/aggregator/amg_saggrmat_minnrg_bld.f90 index 50d85713..66514a66 100644 --- a/amgprec/impl/aggregator/amg_saggrmat_minnrg_bld.f90 +++ b/amgprec/impl/aggregator/amg_saggrmat_minnrg_bld.f90 @@ -154,9 +154,6 @@ subroutine amg_saggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,& ctxt = desc_a%get_context() icomm = desc_a%get_mpic() - info=psb_err_internal_error_ - call psb_errpush(info,name) - goto 9999 call psb_info(ctxt, me, np) diff --git a/amgprec/impl/aggregator/amg_zaggrmat_minnrg_bld.f90 b/amgprec/impl/aggregator/amg_zaggrmat_minnrg_bld.f90 index 90adcf9b..89d6d89d 100644 --- a/amgprec/impl/aggregator/amg_zaggrmat_minnrg_bld.f90 +++ b/amgprec/impl/aggregator/amg_zaggrmat_minnrg_bld.f90 @@ -154,9 +154,6 @@ subroutine amg_zaggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,& ctxt = desc_a%get_context() icomm = desc_a%get_mpic() - info=psb_err_internal_error_ - call psb_errpush(info,name) - goto 9999 call psb_info(ctxt, me, np) From 2542c0fda45fae79d0b8d007c9b88ab74ec86dc9 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Mon, 28 Jun 2021 18:42:56 +0200 Subject: [PATCH 11/36] Do not print matching statistics --- amgprec/amg_d_matchboxp_mod.f90 | 11 +++++++---- amgprec/amg_s_matchboxp_mod.f90 | 11 +++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/amgprec/amg_d_matchboxp_mod.f90 b/amgprec/amg_d_matchboxp_mod.f90 index ddbcd591..5847e97f 100644 --- a/amgprec/amg_d_matchboxp_mod.f90 +++ b/amgprec/amg_d_matchboxp_mod.f90 @@ -118,6 +118,7 @@ module dmatchboxp_mod module procedure dPMatchBox end interface PMatchBox + logical, parameter, private :: print_statistics=.false. contains subroutine dmatchboxp_build_prol(w,a,desc_a,ilaggr,nlaggr,prol,info,& @@ -421,11 +422,13 @@ contains nlpairs = v(3) end block - if (iam == 0) then - write(0,*) 'Matching statistics: Unmatched nodes ',& - & nunmatched,' Singletons:',nlsingl,' Pairs:',nlpairs + if (print_statistics) then + if (iam == 0) then + write(0,*) 'Matching statistics: Unmatched nodes ',& + & nunmatched,' Singletons:',nlsingl,' Pairs:',nlpairs + end if end if - + if (display_out_) then block integer(psb_ipk_) :: idx diff --git a/amgprec/amg_s_matchboxp_mod.f90 b/amgprec/amg_s_matchboxp_mod.f90 index 08c598af..5d3f2266 100644 --- a/amgprec/amg_s_matchboxp_mod.f90 +++ b/amgprec/amg_s_matchboxp_mod.f90 @@ -118,6 +118,7 @@ module smatchboxp_mod module procedure sPMatchBox end interface PMatchBox + logical, parameter, private :: print_statistics=.false. contains subroutine smatchboxp_build_prol(w,a,desc_a,ilaggr,nlaggr,prol,info,& @@ -421,11 +422,13 @@ contains nlpairs = v(3) end block - if (iam == 0) then - write(0,*) 'Matching statistics: Unmatched nodes ',& - & nunmatched,' Singletons:',nlsingl,' Pairs:',nlpairs + if (print_statistics) then + if (iam == 0) then + write(0,*) 'Matching statistics: Unmatched nodes ',& + & nunmatched,' Singletons:',nlsingl,' Pairs:',nlpairs + end if end if - + if (display_out_) then block integer(psb_ipk_) :: idx From 12704981701a5d3b510e21257f64f0c6da0ae3e9 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Fri, 16 Jul 2021 09:16:44 +0200 Subject: [PATCH 12/36] Fix examples --- samples/simple/fileread/amg_cexample_ml.f90 | 29 +++++++++++---------- samples/simple/fileread/amg_dexample_ml.f90 | 29 +++++++++++---------- samples/simple/fileread/amg_sexample_ml.f90 | 29 +++++++++++---------- samples/simple/fileread/amg_zexample_ml.f90 | 29 +++++++++++---------- samples/simple/pdegen/amg_dexample_ml.f90 | 2 +- samples/simple/pdegen/amg_sexample_ml.f90 | 2 +- 6 files changed, 62 insertions(+), 58 deletions(-) diff --git a/samples/simple/fileread/amg_cexample_ml.f90 b/samples/simple/fileread/amg_cexample_ml.f90 index e22734dc..7a05c4b3 100644 --- a/samples/simple/fileread/amg_cexample_ml.f90 +++ b/samples/simple/fileread/amg_cexample_ml.f90 @@ -37,7 +37,7 @@ ! ! File: amg_cexample_ml.f90 ! -! This sample program solves a linear system by using CG coupled with +! This sample program solves a linear system by using FCG coupled with ! one of the following multi-level preconditioner, as explained in Section 4.1 ! of the AMG4PSBLAS User's and Reference Guide: ! @@ -50,8 +50,8 @@ ! (with ILU(0) on the blocks) as pre- and post-smoother, and 8 block-Jacobi ! sweeps (with ILU(0) on the blocks) as coarsest-level solver (Sec. 4.1, Listing 2) ! -! - choice = 3, W-cycle preconditioner based on the coupled aggregation relying on matching, -! with maximum size of aggregates equal to 8 and smoothed prolongators, +! - choice = 3, W-cycle preconditioner based on the coupled aggregation relying +! on matching, with maximum size of aggregates equal to 8 and smoothed prolongators, ! 2 hybrid forward/backward GS sweeps as pre/post-smoother, a distributed coarsest ! matrix, and preconditioned Flexible Conjugate Gradient as coarsest-level solver ! (Sec. 4.1, Listing 3) @@ -103,7 +103,8 @@ program amg_cexample_ml integer :: ierr, ircode real(psb_spk_) :: resmx, resmxp real(psb_dpk_) :: t1, t2, tprec - character(len=20) :: name, kmethod + character(len=20) :: name + character(len=20), parameter :: kmethod='FCG' integer, parameter :: iunit=12 ! initialize the parallel environment @@ -216,7 +217,6 @@ program amg_cexample_ml ! solver call P%init(ctxt,'ML',info) - kmethod = 'CG' case(2) @@ -227,15 +227,16 @@ program amg_cexample_ml call P%init(ctxt,'ML',info) call P%set('SMOOTHER_TYPE','BJAC',info) call P%set('COARSE_SOLVE','BJAC',info) + call P%set('COARSE_SUBSOLVE','ILU',info) call P%set('COARSE_SWEEPS',8,info) - kmethod = 'CG' case(3) - ! initialize a W-cycle preconditioner based on the coupled aggregation relying on matching, - ! with maximum size of aggregates equal to 8 and smoothed prolongators, - ! 2 hybrid forward/backward GS sweeps as pre/post-smoother, a distributed coarsest - ! matrix, and preconditioned Flexible Conjugate Gradient as coarsest-level solver + ! initialize a W-cycle preconditioner based on the coupled aggregation + ! relying on matching, with maximum size of aggregates equal to 8 + ! and smoothed prolongators, 2 hybrid forward/backward GS sweeps + ! as pre/post-smoother, a distributed coarsest matrix, + ! and preconditioned Flexible Conjugate Gradient as coarsest-level solver call P%init(ctxt,'ML',info) call P%set('PAR_AGGR_ALG','COUPLED',info) @@ -244,10 +245,10 @@ program amg_cexample_ml call P%set('ML_CYCLE','WCYCLE',info) call P%set('SMOOTHER_SWEEPS',2,info) call P%set('COARSE_SOLVE','KRM',info) - kmethod = 'CG' - end select + call P%set('COARSE_MAT','DIST',info) + call P%set('KRM_METHOD','FCG',info) - ! build the preconditioner + end select call psb_barrier(ctxt) t1 = psb_wtime() @@ -269,7 +270,7 @@ program amg_cexample_ml call x%zero() call psb_geasb(x,desc_A,info) - ! solve Ax=b with preconditioned CG + ! solve Ax=b with preconditioned Krylov method call psb_barrier(ctxt) t1 = psb_wtime() diff --git a/samples/simple/fileread/amg_dexample_ml.f90 b/samples/simple/fileread/amg_dexample_ml.f90 index a8a4b4d3..ddc1c021 100644 --- a/samples/simple/fileread/amg_dexample_ml.f90 +++ b/samples/simple/fileread/amg_dexample_ml.f90 @@ -37,7 +37,7 @@ ! ! File: amg_dexample_ml.f90 ! -! This sample program solves a linear system by using CG coupled with +! This sample program solves a linear system by using FCG coupled with ! one of the following multi-level preconditioner, as explained in Section 4.1 ! of the AMG4PSBLAS User's and Reference Guide: ! @@ -50,8 +50,8 @@ ! (with ILU(0) on the blocks) as pre- and post-smoother, and 8 block-Jacobi ! sweeps (with ILU(0) on the blocks) as coarsest-level solver (Sec. 4.1, Listing 2) ! -! - choice = 3, W-cycle preconditioner based on the coupled aggregation relying on matching, -! with maximum size of aggregates equal to 8 and smoothed prolongators, +! - choice = 3, W-cycle preconditioner based on the coupled aggregation relying +! on matching, with maximum size of aggregates equal to 8 and smoothed prolongators, ! 2 hybrid forward/backward GS sweeps as pre/post-smoother, a distributed coarsest ! matrix, and preconditioned Flexible Conjugate Gradient as coarsest-level solver ! (Sec. 4.1, Listing 3) @@ -103,7 +103,8 @@ program amg_dexample_ml integer :: ierr, ircode real(psb_dpk_) :: resmx, resmxp real(psb_dpk_) :: t1, t2, tprec - character(len=20) :: name, kmethod + character(len=20) :: name + character(len=20), parameter :: kmethod='FCG' integer, parameter :: iunit=12 ! initialize the parallel environment @@ -216,7 +217,6 @@ program amg_dexample_ml ! solver call P%init(ctxt,'ML',info) - kmethod = 'CG' case(2) @@ -227,15 +227,16 @@ program amg_dexample_ml call P%init(ctxt,'ML',info) call P%set('SMOOTHER_TYPE','BJAC',info) call P%set('COARSE_SOLVE','BJAC',info) + call P%set('COARSE_SUBSOLVE','ILU',info) call P%set('COARSE_SWEEPS',8,info) - kmethod = 'CG' case(3) - ! initialize a W-cycle preconditioner based on the coupled aggregation relying on matching, - ! with maximum size of aggregates equal to 8 and smoothed prolongators, - ! 2 hybrid forward/backward GS sweeps as pre/post-smoother, a distributed coarsest - ! matrix, and preconditioned Flexible Conjugate Gradient as coarsest-level solver + ! initialize a W-cycle preconditioner based on the coupled aggregation + ! relying on matching, with maximum size of aggregates equal to 8 + ! and smoothed prolongators, 2 hybrid forward/backward GS sweeps + ! as pre/post-smoother, a distributed coarsest matrix, + ! and preconditioned Flexible Conjugate Gradient as coarsest-level solver call P%init(ctxt,'ML',info) call P%set('PAR_AGGR_ALG','COUPLED',info) @@ -244,10 +245,10 @@ program amg_dexample_ml call P%set('ML_CYCLE','WCYCLE',info) call P%set('SMOOTHER_SWEEPS',2,info) call P%set('COARSE_SOLVE','KRM',info) - kmethod = 'CG' - end select + call P%set('COARSE_MAT','DIST',info) + call P%set('KRM_METHOD','FCG',info) - ! build the preconditioner + end select call psb_barrier(ctxt) t1 = psb_wtime() @@ -269,7 +270,7 @@ program amg_dexample_ml call x%zero() call psb_geasb(x,desc_A,info) - ! solve Ax=b with preconditioned CG + ! solve Ax=b with preconditioned Krylov method call psb_barrier(ctxt) t1 = psb_wtime() diff --git a/samples/simple/fileread/amg_sexample_ml.f90 b/samples/simple/fileread/amg_sexample_ml.f90 index 8f9b3f1c..3f3e3071 100644 --- a/samples/simple/fileread/amg_sexample_ml.f90 +++ b/samples/simple/fileread/amg_sexample_ml.f90 @@ -37,7 +37,7 @@ ! ! File: amg_sexample_ml.f90 ! -! This sample program solves a linear system by using CG coupled with +! This sample program solves a linear system by using FCG coupled with ! one of the following multi-level preconditioner, as explained in Section 4.1 ! of the AMG4PSBLAS User's and Reference Guide: ! @@ -50,8 +50,8 @@ ! (with ILU(0) on the blocks) as pre- and post-smoother, and 8 block-Jacobi ! sweeps (with ILU(0) on the blocks) as coarsest-level solver (Sec. 4.1, Listing 2) ! -! - choice = 3, W-cycle preconditioner based on the coupled aggregation relying on matching, -! with maximum size of aggregates equal to 8 and smoothed prolongators, +! - choice = 3, W-cycle preconditioner based on the coupled aggregation relying +! on matching, with maximum size of aggregates equal to 8 and smoothed prolongators, ! 2 hybrid forward/backward GS sweeps as pre/post-smoother, a distributed coarsest ! matrix, and preconditioned Flexible Conjugate Gradient as coarsest-level solver ! (Sec. 4.1, Listing 3) @@ -103,7 +103,8 @@ program amg_sexample_ml integer :: ierr, ircode real(psb_spk_) :: resmx, resmxp real(psb_dpk_) :: t1, t2, tprec - character(len=20) :: name, kmethod + character(len=20) :: name + character(len=20), parameter :: kmethod='FCG' integer, parameter :: iunit=12 ! initialize the parallel environment @@ -216,7 +217,6 @@ program amg_sexample_ml ! solver call P%init(ctxt,'ML',info) - kmethod = 'CG' case(2) @@ -227,15 +227,16 @@ program amg_sexample_ml call P%init(ctxt,'ML',info) call P%set('SMOOTHER_TYPE','BJAC',info) call P%set('COARSE_SOLVE','BJAC',info) + call P%set('COARSE_SUBSOLVE','ILU',info) call P%set('COARSE_SWEEPS',8,info) - kmethod = 'CG' case(3) - ! initialize a W-cycle preconditioner based on the coupled aggregation relying on matching, - ! with maximum size of aggregates equal to 8 and smoothed prolongators, - ! 2 hybrid forward/backward GS sweeps as pre/post-smoother, a distributed coarsest - ! matrix, and preconditioned Flexible Conjugate Gradient as coarsest-level solver + ! initialize a W-cycle preconditioner based on the coupled aggregation + ! relying on matching, with maximum size of aggregates equal to 8 + ! and smoothed prolongators, 2 hybrid forward/backward GS sweeps + ! as pre/post-smoother, a distributed coarsest matrix, + ! and preconditioned Flexible Conjugate Gradient as coarsest-level solver call P%init(ctxt,'ML',info) call P%set('PAR_AGGR_ALG','COUPLED',info) @@ -244,10 +245,10 @@ program amg_sexample_ml call P%set('ML_CYCLE','WCYCLE',info) call P%set('SMOOTHER_SWEEPS',2,info) call P%set('COARSE_SOLVE','KRM',info) - kmethod = 'CG' - end select + call P%set('COARSE_MAT','DIST',info) + call P%set('KRM_METHOD','FCG',info) - ! build the preconditioner + end select call psb_barrier(ctxt) t1 = psb_wtime() @@ -269,7 +270,7 @@ program amg_sexample_ml call x%zero() call psb_geasb(x,desc_A,info) - ! solve Ax=b with preconditioned CG + ! solve Ax=b with preconditioned Krylov method call psb_barrier(ctxt) t1 = psb_wtime() diff --git a/samples/simple/fileread/amg_zexample_ml.f90 b/samples/simple/fileread/amg_zexample_ml.f90 index 265f2931..e6c48d79 100644 --- a/samples/simple/fileread/amg_zexample_ml.f90 +++ b/samples/simple/fileread/amg_zexample_ml.f90 @@ -37,7 +37,7 @@ ! ! File: amg_zexample_ml.f90 ! -! This sample program solves a linear system by using CG coupled with +! This sample program solves a linear system by using FCG coupled with ! one of the following multi-level preconditioner, as explained in Section 4.1 ! of the AMG4PSBLAS User's and Reference Guide: ! @@ -50,8 +50,8 @@ ! (with ILU(0) on the blocks) as pre- and post-smoother, and 8 block-Jacobi ! sweeps (with ILU(0) on the blocks) as coarsest-level solver (Sec. 4.1, Listing 2) ! -! - choice = 3, W-cycle preconditioner based on the coupled aggregation relying on matching, -! with maximum size of aggregates equal to 8 and smoothed prolongators, +! - choice = 3, W-cycle preconditioner based on the coupled aggregation relying +! on matching, with maximum size of aggregates equal to 8 and smoothed prolongators, ! 2 hybrid forward/backward GS sweeps as pre/post-smoother, a distributed coarsest ! matrix, and preconditioned Flexible Conjugate Gradient as coarsest-level solver ! (Sec. 4.1, Listing 3) @@ -103,7 +103,8 @@ program amg_zexample_ml integer :: ierr, ircode real(psb_dpk_) :: resmx, resmxp real(psb_dpk_) :: t1, t2, tprec - character(len=20) :: name, kmethod + character(len=20) :: name + character(len=20), parameter :: kmethod='FCG' integer, parameter :: iunit=12 ! initialize the parallel environment @@ -216,7 +217,6 @@ program amg_zexample_ml ! solver call P%init(ctxt,'ML',info) - kmethod = 'CG' case(2) @@ -227,15 +227,16 @@ program amg_zexample_ml call P%init(ctxt,'ML',info) call P%set('SMOOTHER_TYPE','BJAC',info) call P%set('COARSE_SOLVE','BJAC',info) + call P%set('COARSE_SUBSOLVE','ILU',info) call P%set('COARSE_SWEEPS',8,info) - kmethod = 'CG' case(3) - ! initialize a W-cycle preconditioner based on the coupled aggregation relying on matching, - ! with maximum size of aggregates equal to 8 and smoothed prolongators, - ! 2 hybrid forward/backward GS sweeps as pre/post-smoother, a distributed coarsest - ! matrix, and preconditioned Flexible Conjugate Gradient as coarsest-level solver + ! initialize a W-cycle preconditioner based on the coupled aggregation + ! relying on matching, with maximum size of aggregates equal to 8 + ! and smoothed prolongators, 2 hybrid forward/backward GS sweeps + ! as pre/post-smoother, a distributed coarsest matrix, + ! and preconditioned Flexible Conjugate Gradient as coarsest-level solver call P%init(ctxt,'ML',info) call P%set('PAR_AGGR_ALG','COUPLED',info) @@ -244,10 +245,10 @@ program amg_zexample_ml call P%set('ML_CYCLE','WCYCLE',info) call P%set('SMOOTHER_SWEEPS',2,info) call P%set('COARSE_SOLVE','KRM',info) - kmethod = 'CG' - end select + call P%set('COARSE_MAT','DIST',info) + call P%set('KRM_METHOD','FCG',info) - ! build the preconditioner + end select call psb_barrier(ctxt) t1 = psb_wtime() @@ -269,7 +270,7 @@ program amg_zexample_ml call x%zero() call psb_geasb(x,desc_A,info) - ! solve Ax=b with preconditioned CG + ! solve Ax=b with preconditioned Krylov method call psb_barrier(ctxt) t1 = psb_wtime() diff --git a/samples/simple/pdegen/amg_dexample_ml.f90 b/samples/simple/pdegen/amg_dexample_ml.f90 index c9c18fbd..757d19ec 100644 --- a/samples/simple/pdegen/amg_dexample_ml.f90 +++ b/samples/simple/pdegen/amg_dexample_ml.f90 @@ -173,7 +173,7 @@ program amg_dexample_ml case(1) ! initialize the default multi-level preconditioner, i.e. V-cycle - ! with basic smoothed aggregation, 1 hybrid forward/backward + ! with decoupled smoothed aggregation, 1 hybrid forward/backward ! GS sweep as pre/post-smoother and UMFPACK as coarsest-level ! solver diff --git a/samples/simple/pdegen/amg_sexample_ml.f90 b/samples/simple/pdegen/amg_sexample_ml.f90 index e3d023e1..8a00af88 100644 --- a/samples/simple/pdegen/amg_sexample_ml.f90 +++ b/samples/simple/pdegen/amg_sexample_ml.f90 @@ -173,7 +173,7 @@ program amg_sexample_ml case(1) ! initialize the default multi-level preconditioner, i.e. V-cycle - ! with basic smoothed aggregation, 1 hybrid forward/backward + ! with decoupled smoothed aggregation, 1 hybrid forward/backward ! GS sweep as pre/post-smoother and UMFPACK as coarsest-level ! solver From af75364c54c8355f0892498a4df665243aacc3d5 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Fri, 16 Jul 2021 09:16:54 +0200 Subject: [PATCH 13/36] Fix matchbox internal interface names. --- amgprec/amg_d_matchboxp_mod.f90 | 76 +++++++++---------- amgprec/amg_d_parmatch_aggregator_mod.F90 | 74 +++++++++--------- amgprec/amg_s_matchboxp_mod.f90 | 76 +++++++++---------- amgprec/amg_s_parmatch_aggregator_mod.F90 | 74 +++++++++--------- .../amg_d_parmatch_aggregator_tprol.F90 | 2 +- .../amg_s_parmatch_aggregator_tprol.F90 | 2 +- 6 files changed, 152 insertions(+), 152 deletions(-) diff --git a/amgprec/amg_d_matchboxp_mod.f90 b/amgprec/amg_d_matchboxp_mod.f90 index 5847e97f..f66fb174 100644 --- a/amgprec/amg_d_matchboxp_mod.f90 +++ b/amgprec/amg_d_matchboxp_mod.f90 @@ -68,7 +68,7 @@ ! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ! POSSIBILITY OF SUCH DAMAGE. ! -module dmatchboxp_mod +module amg_dmatchboxp_mod use iso_c_binding use psb_base_cbind_mod @@ -94,34 +94,34 @@ module dmatchboxp_mod end subroutine dMatchBoxPC end interface MatchBoxPC - interface i_aggr_assign - module procedure i_daggr_assign - end interface i_aggr_assign + interface amg_i_aggr_assign + module procedure amg_i_daggr_assign + end interface amg_i_aggr_assign - interface build_matching - module procedure dbuild_matching - end interface build_matching + interface amg_build_matching + module procedure amg_dbuild_matching + end interface amg_build_matching - interface build_ahat - module procedure dbuild_ahat - end interface build_ahat + interface amg_build_ahat + module procedure amg_dbuild_ahat + end interface amg_build_ahat - interface psb_gtranspose - module procedure psb_dgtranspose - end interface psb_gtranspose + interface amg_gtranspose + module procedure amg_dgtranspose + end interface amg_gtranspose - interface psb_htranspose - module procedure psb_dhtranspose - end interface psb_htranspose + interface amg_htranspose + module procedure amg_dhtranspose + end interface amg_htranspose - interface PMatchBox - module procedure dPMatchBox - end interface PMatchBox + interface amg_PMatchBox + module procedure amg_dPMatchBox + end interface amg_PMatchBox logical, parameter, private :: print_statistics=.false. contains - subroutine dmatchboxp_build_prol(w,a,desc_a,ilaggr,nlaggr,prol,info,& + subroutine amg_dmatchboxp_build_prol(w,a,desc_a,ilaggr,nlaggr,prol,info,& & symmetrize,reproducible,display_inp, display_out, print_out) use psb_base_mod use psb_util_mod @@ -214,7 +214,7 @@ contains end if if (do_timings) call psb_toc(idx_phase1) if (do_timings) call psb_tic(idx_bldmtc) - call build_matching(w,a,desc_a,mate,info,display_inp=display_inp,symmetrize=symmetrize) + call amg_build_matching(w,a,desc_a,mate,info,display_inp=display_inp,symmetrize=symmetrize) if (do_timings) call psb_toc(idx_bldmtc) if (debug) write(0,*) iam,' buildprol from buildmatching:',& & info @@ -312,7 +312,7 @@ contains ! Should be a symmetric function. ! call desc_a%indxmap%qry_halo_owner(idx,iown,info) - ip = i_aggr_assign(iam, iown, kg, idxg, wk, widx, nrmagg) + ip = amg_i_aggr_assign(iam, iown, kg, idxg, wk, widx, nrmagg) if (iam == ip) then nlaggr(iam) = nlaggr(iam) + 1 ilaggr(k) = nlaggr(iam) @@ -516,9 +516,9 @@ contains write(0,*) iam,' : error from Matching: ',info end if - end subroutine dmatchboxp_build_prol + end subroutine amg_dmatchboxp_build_prol - function i_daggr_assign(iam, iown, kg, idxg, wk, widx, nrmagg) & + function amg_i_daggr_assign(iam, iown, kg, idxg, wk, widx, nrmagg) & & result(iproc) ! ! How to break ties? This @@ -560,10 +560,10 @@ contains iproc = iown end if end if - end function i_daggr_assign + end function amg_i_daggr_assign - subroutine dbuild_matching(w,a,desc_a,mate,info,display_inp, symmetrize) + subroutine amg_dbuild_matching(w,a,desc_a,mate,info,display_inp, symmetrize) use psb_base_mod use psb_util_mod use iso_c_binding @@ -612,7 +612,7 @@ contains if (iam == 0) write(0,*)' Into build_ahat:' end if if (do_timings) call psb_tic(idx_bldahat) - call build_ahat(w,a,ahatnd,desc_a,info,symmetrize=symmetrize) + call amg_build_ahat(w,a,ahatnd,desc_a,info,symmetrize=symmetrize) if (do_timings) call psb_toc(idx_bldahat) if (info /= 0) then write(0,*) 'Error from build_ahat ', info @@ -703,7 +703,7 @@ contains ! if (debug) write(0,*) iam,' buildmatching into PMatchBox:' if (do_timings) call psb_tic(idx_cmboxp) - call PMatchBox(nr,nz,vlptr,vlind,ewght,& + call amg_PMatchBox(nr,nz,vlptr,vlind,ewght,& & vnl, mate, iam, np,ictxt,& & msgis,msgas,msgprc,ph0t,ph1t,ph2t,ph1crd,ph2crd,info,display_inp) if (do_timings) call psb_toc(idx_cmboxp) @@ -767,9 +767,9 @@ contains val(1:n) = tmp(1:n) end subroutine fix_order - end subroutine dbuild_matching + end subroutine amg_dbuild_matching - subroutine dbuild_ahat(w,a,ahat,desc_a,info,symmetrize) + subroutine amg_dbuild_ahat(w,a,ahat,desc_a,info,symmetrize) use psb_base_mod implicit none real(psb_dpk_), intent(in) :: w(:) @@ -1005,9 +1005,9 @@ contains end block end if - end subroutine dbuild_ahat + end subroutine amg_dbuild_ahat - subroutine psb_dgtranspose(ain,aout,desc_a,info) + subroutine amg_dgtranspose(ain,aout,desc_a,info) use psb_base_mod implicit none type(psb_ldspmat_type), intent(in) :: ain @@ -1128,9 +1128,9 @@ contains end if end if - end subroutine psb_dgtranspose + end subroutine amg_dgtranspose - subroutine psb_dhtranspose(ain,aout,desc_a,info) + subroutine amg_dhtranspose(ain,aout,desc_a,info) use psb_base_mod implicit none type(psb_ldspmat_type), intent(in) :: ain @@ -1297,9 +1297,9 @@ contains end if end if - end subroutine psb_dhtranspose + end subroutine amg_dhtranspose - subroutine dPMatchBox(nlver,nledge,verlocptr,verlocind,edgelocweight,& + subroutine amg_dPMatchBox(nlver,nledge,verlocptr,verlocind,edgelocweight,& & verdistance, mate, myrank, numprocs, ictxt,& & msgindsent,msgactualsent,msgpercent,& & ph0_time, ph1_time, ph2_time, ph1_card, ph2_card,info,display_inp) @@ -1434,6 +1434,6 @@ contains end if where(mate>=0) mate = mate + 1 - end subroutine dPMatchBox + end subroutine amg_dPMatchBox -end module dmatchboxp_mod +end module amg_dmatchboxp_mod diff --git a/amgprec/amg_d_parmatch_aggregator_mod.F90 b/amgprec/amg_d_parmatch_aggregator_mod.F90 index 5451e687..95e6ceea 100644 --- a/amgprec/amg_d_parmatch_aggregator_mod.F90 +++ b/amgprec/amg_d_parmatch_aggregator_mod.F90 @@ -118,7 +118,7 @@ module amg_d_parmatch_aggregator_mod use amg_d_base_aggregator_mod - use dmatchboxp_mod + use amg_dmatchboxp_mod #if defined(SERIAL_MPI) type, extends(amg_d_base_aggregator_type) :: amg_d_parmatch_aggregator_type end type amg_d_parmatch_aggregator_type @@ -143,18 +143,18 @@ module amg_d_parmatch_aggregator_mod procedure, pass(ag) :: mat_asb => amg_d_parmatch_aggregator_mat_asb procedure, pass(ag) :: inner_mat_asb => amg_d_parmatch_aggregator_inner_mat_asb procedure, pass(ag) :: bld_map => amg_d_parmatch_aggregator_bld_map - procedure, pass(ag) :: csetc => d_parmatch_aggr_csetc - procedure, pass(ag) :: cseti => d_parmatch_aggr_cseti - procedure, pass(ag) :: default => d_parmatch_aggr_set_default - procedure, pass(ag) :: sizeof => d_parmatch_aggregator_sizeof - procedure, pass(ag) :: update_next => d_parmatch_aggregator_update_next - procedure, pass(ag) :: bld_wnxt => d_parmatch_bld_wnxt - procedure, pass(ag) :: bld_default_w => d_bld_default_w - procedure, pass(ag) :: set_c_default_w => d_set_prm_c_default_w - procedure, pass(ag) :: descr => d_parmatch_aggregator_descr - procedure, pass(ag) :: clone => d_parmatch_aggregator_clone - procedure, pass(ag) :: free => d_parmatch_aggregator_free - procedure, nopass :: fmt => d_parmatch_aggregator_fmt + procedure, pass(ag) :: csetc => amg_d_parmatch_aggr_csetc + procedure, pass(ag) :: cseti => amg_d_parmatch_aggr_cseti + procedure, pass(ag) :: default => amg_d_parmatch_aggr_set_default + procedure, pass(ag) :: sizeof => amg_d_parmatch_aggregator_sizeof + procedure, pass(ag) :: update_next => amg_d_parmatch_aggregator_update_next + procedure, pass(ag) :: bld_wnxt => amg_d_parmatch_bld_wnxt + procedure, pass(ag) :: bld_default_w => amg_d_bld_default_w + procedure, pass(ag) :: set_c_default_w => amg_d_set_prm_c_default_w + procedure, pass(ag) :: descr => amg_d_parmatch_aggregator_descr + procedure, pass(ag) :: clone => amg_d_parmatch_aggregator_clone + procedure, pass(ag) :: free => amg_d_parmatch_aggregator_free + procedure, nopass :: fmt => amg_d_parmatch_aggregator_fmt procedure, nopass :: xt_desc => amg_d_parmatch_aggregator_xt_desc end type amg_d_parmatch_aggregator_type @@ -320,7 +320,7 @@ module amg_d_parmatch_aggregator_mod contains - subroutine d_bld_default_w(ag,nr) + subroutine amg_d_bld_default_w(ag,nr) use psb_realloc_mod implicit none class(amg_d_parmatch_aggregator_type), target, intent(inout) :: ag @@ -330,9 +330,9 @@ contains if (info /= psb_success_) return ag%w = done !call ag%set_c_default_w() - end subroutine d_bld_default_w + end subroutine amg_d_bld_default_w - subroutine d_set_prm_c_default_w(ag) + subroutine amg_d_set_prm_c_default_w(ag) use psb_realloc_mod use iso_c_binding implicit none @@ -342,9 +342,9 @@ contains !write(0,*) 'prm_c_deafult_w ' call psb_safe_ab_cpy(ag%w,ag%w_nxt,info) - end subroutine d_set_prm_c_default_w + end subroutine amg_d_set_prm_c_default_w - subroutine d_parmatch_bld_wnxt(ag,ilaggr,valaggr,nx) + subroutine amg_d_parmatch_bld_wnxt(ag,ilaggr,valaggr,nx) use psb_realloc_mod implicit none class(amg_d_parmatch_aggregator_type), target, intent(inout) :: ag @@ -358,14 +358,14 @@ contains !write(0,*) 'Executing bld_wnxt ',nx call psb_realloc(nx,ag%w_nxt,info) - end subroutine d_parmatch_bld_wnxt + end subroutine amg_d_parmatch_bld_wnxt - function d_parmatch_aggregator_fmt() result(val) + function amg_d_parmatch_aggregator_fmt() result(val) implicit none character(len=32) :: val val = "Parallel Matching aggregation" - end function d_parmatch_aggregator_fmt + end function amg_d_parmatch_aggregator_fmt function amg_d_parmatch_aggregator_xt_desc() result(val) implicit none @@ -374,7 +374,7 @@ contains val = .true. end function amg_d_parmatch_aggregator_xt_desc - function d_parmatch_aggregator_sizeof(ag) result(val) + function amg_d_parmatch_aggregator_sizeof(ag) result(val) use psb_realloc_mod implicit none class(amg_d_parmatch_aggregator_type), intent(in) :: ag @@ -390,9 +390,9 @@ contains if (allocated(ag%base_desc)) val = val + ag%base_desc%sizeof() if (allocated(ag%desc_ax)) val = val + ag%desc_ax%sizeof() - end function d_parmatch_aggregator_sizeof + end function amg_d_parmatch_aggregator_sizeof - subroutine d_parmatch_aggregator_descr(ag,parms,iout,info) + subroutine amg_d_parmatch_aggregator_descr(ag,parms,iout,info) implicit none class(amg_d_parmatch_aggregator_type), intent(in) :: ag type(amg_dml_parms), intent(in) :: parms @@ -406,7 +406,7 @@ contains call parms%mldescr(iout,info) return - end subroutine d_parmatch_aggregator_descr + end subroutine amg_d_parmatch_aggregator_descr function is_legal_malg(alg) result(val) logical :: val @@ -437,7 +437,7 @@ contains end function is_legal_nlevels - subroutine d_parmatch_aggregator_update_next(ag,agnext,info) + subroutine amg_d_parmatch_aggregator_update_next(ag,agnext,info) use psb_realloc_mod implicit none class(amg_d_parmatch_aggregator_type), target, intent(inout) :: ag @@ -470,9 +470,9 @@ contains ! What should we do here? end select info = 0 - end subroutine d_parmatch_aggregator_update_next + end subroutine amg_d_parmatch_aggregator_update_next - subroutine d_parmatch_aggr_csetc(ag,what,val,info,idx) + subroutine amg_d_parmatch_aggr_csetc(ag,what,val,info,idx) Implicit None @@ -514,9 +514,9 @@ contains ! Do nothing end select return - end subroutine d_parmatch_aggr_csetc + end subroutine amg_d_parmatch_aggr_csetc - subroutine d_parmatch_aggr_cseti(ag,what,val,info,idx) + subroutine amg_d_parmatch_aggr_cseti(ag,what,val,info,idx) Implicit None @@ -556,9 +556,9 @@ contains ! Do nothing end select return - end subroutine d_parmatch_aggr_cseti + end subroutine amg_d_parmatch_aggr_cseti - subroutine d_parmatch_aggr_set_default(ag) + subroutine amg_d_parmatch_aggr_set_default(ag) Implicit None @@ -579,9 +579,9 @@ contains return - end subroutine d_parmatch_aggr_set_default + end subroutine amg_d_parmatch_aggr_set_default - subroutine d_parmatch_aggregator_free(ag,info) + subroutine amg_d_parmatch_aggregator_free(ag,info) use iso_c_binding implicit none class(amg_d_parmatch_aggregator_type), intent(inout) :: ag @@ -618,9 +618,9 @@ contains call ag%rwdesc%free(info); deallocate(ag%rwdesc,stat=info) end if - end subroutine d_parmatch_aggregator_free + end subroutine amg_d_parmatch_aggregator_free - subroutine d_parmatch_aggregator_clone(ag,agnext,info) + subroutine amg_d_parmatch_aggregator_clone(ag,agnext,info) implicit none class(amg_d_parmatch_aggregator_type), intent(inout) :: ag class(amg_d_base_aggregator_type), allocatable, intent(inout) :: agnext @@ -640,7 +640,7 @@ contains ! Should never ever get here info = -1 end select - end subroutine d_parmatch_aggregator_clone + end subroutine amg_d_parmatch_aggregator_clone subroutine amg_d_parmatch_aggregator_bld_map(ag,desc_a,desc_ac,ilaggr,nlaggr,& & op_restr,op_prol,map,info) diff --git a/amgprec/amg_s_matchboxp_mod.f90 b/amgprec/amg_s_matchboxp_mod.f90 index 5d3f2266..36d9a726 100644 --- a/amgprec/amg_s_matchboxp_mod.f90 +++ b/amgprec/amg_s_matchboxp_mod.f90 @@ -68,7 +68,7 @@ ! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ! POSSIBILITY OF SUCH DAMAGE. ! -module smatchboxp_mod +module amg_smatchboxp_mod use iso_c_binding use psb_base_cbind_mod @@ -94,34 +94,34 @@ module smatchboxp_mod end subroutine sMatchBoxPC end interface MatchBoxPC - interface i_aggr_assign - module procedure i_saggr_assign - end interface i_aggr_assign + interface amg_i_aggr_assign + module procedure amg_i_saggr_assign + end interface amg_i_aggr_assign - interface build_matching - module procedure sbuild_matching - end interface build_matching + interface amg_build_matching + module procedure amg_sbuild_matching + end interface amg_build_matching - interface build_ahat - module procedure sbuild_ahat - end interface build_ahat + interface amg_build_ahat + module procedure amg_sbuild_ahat + end interface amg_build_ahat - interface psb_gtranspose - module procedure psb_sgtranspose - end interface psb_gtranspose + interface amg_gtranspose + module procedure amg_sgtranspose + end interface amg_gtranspose - interface psb_htranspose - module procedure psb_shtranspose - end interface psb_htranspose + interface amg_htranspose + module procedure amg_shtranspose + end interface amg_htranspose - interface PMatchBox - module procedure sPMatchBox - end interface PMatchBox + interface amg_PMatchBox + module procedure amg_sPMatchBox + end interface amg_PMatchBox logical, parameter, private :: print_statistics=.false. contains - subroutine smatchboxp_build_prol(w,a,desc_a,ilaggr,nlaggr,prol,info,& + subroutine amg_smatchboxp_build_prol(w,a,desc_a,ilaggr,nlaggr,prol,info,& & symmetrize,reproducible,display_inp, display_out, print_out) use psb_base_mod use psb_util_mod @@ -214,7 +214,7 @@ contains end if if (do_timings) call psb_toc(idx_phase1) if (do_timings) call psb_tic(idx_bldmtc) - call build_matching(w,a,desc_a,mate,info,display_inp=display_inp,symmetrize=symmetrize) + call amg_build_matching(w,a,desc_a,mate,info,display_inp=display_inp,symmetrize=symmetrize) if (do_timings) call psb_toc(idx_bldmtc) if (debug) write(0,*) iam,' buildprol from buildmatching:',& & info @@ -312,7 +312,7 @@ contains ! Should be a symmetric function. ! call desc_a%indxmap%qry_halo_owner(idx,iown,info) - ip = i_aggr_assign(iam, iown, kg, idxg, wk, widx, nrmagg) + ip = amg_i_aggr_assign(iam, iown, kg, idxg, wk, widx, nrmagg) if (iam == ip) then nlaggr(iam) = nlaggr(iam) + 1 ilaggr(k) = nlaggr(iam) @@ -516,9 +516,9 @@ contains write(0,*) iam,' : error from Matching: ',info end if - end subroutine smatchboxp_build_prol + end subroutine amg_smatchboxp_build_prol - function i_saggr_assign(iam, iown, kg, idxg, wk, widx, nrmagg) & + function amg_i_saggr_assign(iam, iown, kg, idxg, wk, widx, nrmagg) & & result(iproc) ! ! How to break ties? This @@ -560,10 +560,10 @@ contains iproc = iown end if end if - end function i_saggr_assign + end function amg_i_saggr_assign - subroutine sbuild_matching(w,a,desc_a,mate,info,display_inp, symmetrize) + subroutine amg_sbuild_matching(w,a,desc_a,mate,info,display_inp, symmetrize) use psb_base_mod use psb_util_mod use iso_c_binding @@ -612,7 +612,7 @@ contains if (iam == 0) write(0,*)' Into build_ahat:' end if if (do_timings) call psb_tic(idx_bldahat) - call build_ahat(w,a,ahatnd,desc_a,info,symmetrize=symmetrize) + call amg_build_ahat(w,a,ahatnd,desc_a,info,symmetrize=symmetrize) if (do_timings) call psb_toc(idx_bldahat) if (info /= 0) then write(0,*) 'Error from build_ahat ', info @@ -703,7 +703,7 @@ contains ! if (debug) write(0,*) iam,' buildmatching into PMatchBox:' if (do_timings) call psb_tic(idx_cmboxp) - call PMatchBox(nr,nz,vlptr,vlind,ewght,& + call amg_PMatchBox(nr,nz,vlptr,vlind,ewght,& & vnl, mate, iam, np,ictxt,& & msgis,msgas,msgprc,ph0t,ph1t,ph2t,ph1crd,ph2crd,info,display_inp) if (do_timings) call psb_toc(idx_cmboxp) @@ -767,9 +767,9 @@ contains val(1:n) = tmp(1:n) end subroutine fix_order - end subroutine sbuild_matching + end subroutine amg_sbuild_matching - subroutine sbuild_ahat(w,a,ahat,desc_a,info,symmetrize) + subroutine amg_sbuild_ahat(w,a,ahat,desc_a,info,symmetrize) use psb_base_mod implicit none real(psb_spk_), intent(in) :: w(:) @@ -1005,9 +1005,9 @@ contains end block end if - end subroutine sbuild_ahat + end subroutine amg_sbuild_ahat - subroutine psb_sgtranspose(ain,aout,desc_a,info) + subroutine amg_sgtranspose(ain,aout,desc_a,info) use psb_base_mod implicit none type(psb_lsspmat_type), intent(in) :: ain @@ -1128,9 +1128,9 @@ contains end if end if - end subroutine psb_sgtranspose + end subroutine amg_sgtranspose - subroutine psb_shtranspose(ain,aout,desc_a,info) + subroutine amg_shtranspose(ain,aout,desc_a,info) use psb_base_mod implicit none type(psb_lsspmat_type), intent(in) :: ain @@ -1297,9 +1297,9 @@ contains end if end if - end subroutine psb_shtranspose + end subroutine amg_shtranspose - subroutine sPMatchBox(nlver,nledge,verlocptr,verlocind,edgelocweight,& + subroutine amg_sPMatchBox(nlver,nledge,verlocptr,verlocind,edgelocweight,& & verdistance, mate, myrank, numprocs, ictxt,& & msgindsent,msgactualsent,msgpercent,& & ph0_time, ph1_time, ph2_time, ph1_card, ph2_card,info,display_inp) @@ -1434,6 +1434,6 @@ contains end if where(mate>=0) mate = mate + 1 - end subroutine sPMatchBox + end subroutine amg_sPMatchBox -end module smatchboxp_mod +end module amg_smatchboxp_mod diff --git a/amgprec/amg_s_parmatch_aggregator_mod.F90 b/amgprec/amg_s_parmatch_aggregator_mod.F90 index fd1defa0..f8ea7bfa 100644 --- a/amgprec/amg_s_parmatch_aggregator_mod.F90 +++ b/amgprec/amg_s_parmatch_aggregator_mod.F90 @@ -118,7 +118,7 @@ module amg_s_parmatch_aggregator_mod use amg_s_base_aggregator_mod - use smatchboxp_mod + use amg_smatchboxp_mod #if defined(SERIAL_MPI) type, extends(amg_s_base_aggregator_type) :: amg_s_parmatch_aggregator_type end type amg_s_parmatch_aggregator_type @@ -143,18 +143,18 @@ module amg_s_parmatch_aggregator_mod procedure, pass(ag) :: mat_asb => amg_s_parmatch_aggregator_mat_asb procedure, pass(ag) :: inner_mat_asb => amg_s_parmatch_aggregator_inner_mat_asb procedure, pass(ag) :: bld_map => amg_s_parmatch_aggregator_bld_map - procedure, pass(ag) :: csetc => s_parmatch_aggr_csetc - procedure, pass(ag) :: cseti => s_parmatch_aggr_cseti - procedure, pass(ag) :: default => s_parmatch_aggr_set_default - procedure, pass(ag) :: sizeof => s_parmatch_aggregator_sizeof - procedure, pass(ag) :: update_next => s_parmatch_aggregator_update_next - procedure, pass(ag) :: bld_wnxt => s_parmatch_bld_wnxt - procedure, pass(ag) :: bld_default_w => s_bld_default_w - procedure, pass(ag) :: set_c_default_w => s_set_prm_c_default_w - procedure, pass(ag) :: descr => s_parmatch_aggregator_descr - procedure, pass(ag) :: clone => s_parmatch_aggregator_clone - procedure, pass(ag) :: free => s_parmatch_aggregator_free - procedure, nopass :: fmt => s_parmatch_aggregator_fmt + procedure, pass(ag) :: csetc => amg_s_parmatch_aggr_csetc + procedure, pass(ag) :: cseti => amg_s_parmatch_aggr_cseti + procedure, pass(ag) :: default => amg_s_parmatch_aggr_set_default + procedure, pass(ag) :: sizeof => amg_s_parmatch_aggregator_sizeof + procedure, pass(ag) :: update_next => amg_s_parmatch_aggregator_update_next + procedure, pass(ag) :: bld_wnxt => amg_s_parmatch_bld_wnxt + procedure, pass(ag) :: bld_default_w => amg_s_bld_default_w + procedure, pass(ag) :: set_c_default_w => amg_s_set_prm_c_default_w + procedure, pass(ag) :: descr => amg_s_parmatch_aggregator_descr + procedure, pass(ag) :: clone => amg_s_parmatch_aggregator_clone + procedure, pass(ag) :: free => amg_s_parmatch_aggregator_free + procedure, nopass :: fmt => amg_s_parmatch_aggregator_fmt procedure, nopass :: xt_desc => amg_s_parmatch_aggregator_xt_desc end type amg_s_parmatch_aggregator_type @@ -320,7 +320,7 @@ module amg_s_parmatch_aggregator_mod contains - subroutine s_bld_default_w(ag,nr) + subroutine amg_s_bld_default_w(ag,nr) use psb_realloc_mod implicit none class(amg_s_parmatch_aggregator_type), target, intent(inout) :: ag @@ -330,9 +330,9 @@ contains if (info /= psb_success_) return ag%w = done !call ag%set_c_default_w() - end subroutine s_bld_default_w + end subroutine amg_s_bld_default_w - subroutine s_set_prm_c_default_w(ag) + subroutine amg_s_set_prm_c_default_w(ag) use psb_realloc_mod use iso_c_binding implicit none @@ -342,9 +342,9 @@ contains !write(0,*) 'prm_c_deafult_w ' call psb_safe_ab_cpy(ag%w,ag%w_nxt,info) - end subroutine s_set_prm_c_default_w + end subroutine amg_s_set_prm_c_default_w - subroutine s_parmatch_bld_wnxt(ag,ilaggr,valaggr,nx) + subroutine amg_s_parmatch_bld_wnxt(ag,ilaggr,valaggr,nx) use psb_realloc_mod implicit none class(amg_s_parmatch_aggregator_type), target, intent(inout) :: ag @@ -358,14 +358,14 @@ contains !write(0,*) 'Executing bld_wnxt ',nx call psb_realloc(nx,ag%w_nxt,info) - end subroutine s_parmatch_bld_wnxt + end subroutine amg_s_parmatch_bld_wnxt - function s_parmatch_aggregator_fmt() result(val) + function amg_s_parmatch_aggregator_fmt() result(val) implicit none character(len=32) :: val val = "Parallel Matching aggregation" - end function s_parmatch_aggregator_fmt + end function amg_s_parmatch_aggregator_fmt function amg_s_parmatch_aggregator_xt_desc() result(val) implicit none @@ -374,7 +374,7 @@ contains val = .true. end function amg_s_parmatch_aggregator_xt_desc - function s_parmatch_aggregator_sizeof(ag) result(val) + function amg_s_parmatch_aggregator_sizeof(ag) result(val) use psb_realloc_mod implicit none class(amg_s_parmatch_aggregator_type), intent(in) :: ag @@ -390,9 +390,9 @@ contains if (allocated(ag%base_desc)) val = val + ag%base_desc%sizeof() if (allocated(ag%desc_ax)) val = val + ag%desc_ax%sizeof() - end function s_parmatch_aggregator_sizeof + end function amg_s_parmatch_aggregator_sizeof - subroutine s_parmatch_aggregator_descr(ag,parms,iout,info) + subroutine amg_s_parmatch_aggregator_descr(ag,parms,iout,info) implicit none class(amg_s_parmatch_aggregator_type), intent(in) :: ag type(amg_sml_parms), intent(in) :: parms @@ -406,7 +406,7 @@ contains call parms%mldescr(iout,info) return - end subroutine s_parmatch_aggregator_descr + end subroutine amg_s_parmatch_aggregator_descr function is_legal_malg(alg) result(val) logical :: val @@ -437,7 +437,7 @@ contains end function is_legal_nlevels - subroutine s_parmatch_aggregator_update_next(ag,agnext,info) + subroutine amg_s_parmatch_aggregator_update_next(ag,agnext,info) use psb_realloc_mod implicit none class(amg_s_parmatch_aggregator_type), target, intent(inout) :: ag @@ -470,9 +470,9 @@ contains ! What should we do here? end select info = 0 - end subroutine s_parmatch_aggregator_update_next + end subroutine amg_s_parmatch_aggregator_update_next - subroutine s_parmatch_aggr_csetc(ag,what,val,info,idx) + subroutine amg_s_parmatch_aggr_csetc(ag,what,val,info,idx) Implicit None @@ -514,9 +514,9 @@ contains ! Do nothing end select return - end subroutine s_parmatch_aggr_csetc + end subroutine amg_s_parmatch_aggr_csetc - subroutine s_parmatch_aggr_cseti(ag,what,val,info,idx) + subroutine amg_s_parmatch_aggr_cseti(ag,what,val,info,idx) Implicit None @@ -556,9 +556,9 @@ contains ! Do nothing end select return - end subroutine s_parmatch_aggr_cseti + end subroutine amg_s_parmatch_aggr_cseti - subroutine s_parmatch_aggr_set_default(ag) + subroutine amg_s_parmatch_aggr_set_default(ag) Implicit None @@ -579,9 +579,9 @@ contains return - end subroutine s_parmatch_aggr_set_default + end subroutine amg_s_parmatch_aggr_set_default - subroutine s_parmatch_aggregator_free(ag,info) + subroutine amg_s_parmatch_aggregator_free(ag,info) use iso_c_binding implicit none class(amg_s_parmatch_aggregator_type), intent(inout) :: ag @@ -618,9 +618,9 @@ contains call ag%rwdesc%free(info); deallocate(ag%rwdesc,stat=info) end if - end subroutine s_parmatch_aggregator_free + end subroutine amg_s_parmatch_aggregator_free - subroutine s_parmatch_aggregator_clone(ag,agnext,info) + subroutine amg_s_parmatch_aggregator_clone(ag,agnext,info) implicit none class(amg_s_parmatch_aggregator_type), intent(inout) :: ag class(amg_s_base_aggregator_type), allocatable, intent(inout) :: agnext @@ -640,7 +640,7 @@ contains ! Should never ever get here info = -1 end select - end subroutine s_parmatch_aggregator_clone + end subroutine amg_s_parmatch_aggregator_clone subroutine amg_s_parmatch_aggregator_bld_map(ag,desc_a,desc_ac,ilaggr,nlaggr,& & op_restr,op_prol,map,info) diff --git a/amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 b/amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 index 16cc7b2e..5e32fbe3 100644 --- a/amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 +++ b/amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 @@ -264,7 +264,7 @@ subroutine amg_d_parmatch_aggregator_build_tprol(ag,parms,ag_data,& ! if (debug) write(0,*) me,' Into matchbox_build_prol ',info if (do_timings) call psb_tic(idx_mboxp) - call dmatchboxp_build_prol(tmpw,acv(i-1),desc_acv(i-1),ixaggr,nxaggr,tmp_prol,info,& + call amg_dmatchboxp_build_prol(tmpw,acv(i-1),desc_acv(i-1),ixaggr,nxaggr,tmp_prol,info,& & symmetrize=ag%need_symmetrize,reproducible=ag%reproducible_matching) if (do_timings) call psb_toc(idx_mboxp) if (debug) write(0,*) me,' Out from matchbox_build_prol ',info diff --git a/amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 b/amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 index cd28893c..a396384f 100644 --- a/amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 +++ b/amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 @@ -264,7 +264,7 @@ subroutine amg_s_parmatch_aggregator_build_tprol(ag,parms,ag_data,& ! if (debug) write(0,*) me,' Into matchbox_build_prol ',info if (do_timings) call psb_tic(idx_mboxp) - call smatchboxp_build_prol(tmpw,acv(i-1),desc_acv(i-1),ixaggr,nxaggr,tmp_prol,info,& + call amg_smatchboxp_build_prol(tmpw,acv(i-1),desc_acv(i-1),ixaggr,nxaggr,tmp_prol,info,& & symmetrize=ag%need_symmetrize,reproducible=ag%reproducible_matching) if (do_timings) call psb_toc(idx_mboxp) if (debug) write(0,*) me,' Out from matchbox_build_prol ',info From 9bc8b540b3b366a97fc81c220db5e121fa670b09 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Fri, 27 Aug 2021 11:42:01 +0200 Subject: [PATCH 14/36] Fix settings in samples/PDEGEN --- samples/advanced/pdegen/amg_d_pde2d.f90 | 8 ++++---- samples/advanced/pdegen/amg_d_pde3d.f90 | 8 ++++---- samples/advanced/pdegen/amg_s_pde2d.f90 | 8 ++++---- samples/advanced/pdegen/amg_s_pde3d.f90 | 8 ++++---- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/samples/advanced/pdegen/amg_d_pde2d.f90 b/samples/advanced/pdegen/amg_d_pde2d.f90 index d4e5ad68..92cc0a2d 100644 --- a/samples/advanced/pdegen/amg_d_pde2d.f90 +++ b/samples/advanced/pdegen/amg_d_pde2d.f90 @@ -338,12 +338,12 @@ program amg_d_pde2d call prec%set('sub_prol', p_choice%prol2, info,pos='post') select case(trim(psb_toupper(p_choice%solve2))) case('INVK') - call prec%set('sub_solve', p_choice%solve, info) + call prec%set('sub_solve', p_choice%solve2, info) case('INVT') - call prec%set('sub_solve', p_choice%solve, info) + call prec%set('sub_solve', p_choice%solve2, info) case('AINV') - call prec%set('sub_solve', p_choice%solve, info) - call prec%set('ainv_alg', p_choice%variant, info) + call prec%set('sub_solve', p_choice%solve2, info) + call prec%set('ainv_alg', p_choice%variant2, info) case default call prec%set('sub_solve', p_choice%solve2, info, pos='post') end select diff --git a/samples/advanced/pdegen/amg_d_pde3d.f90 b/samples/advanced/pdegen/amg_d_pde3d.f90 index b80e14df..9d3028a2 100644 --- a/samples/advanced/pdegen/amg_d_pde3d.f90 +++ b/samples/advanced/pdegen/amg_d_pde3d.f90 @@ -342,12 +342,12 @@ program amg_d_pde3d call prec%set('sub_prol', p_choice%prol2, info,pos='post') select case(trim(psb_toupper(p_choice%solve2))) case('INVK') - call prec%set('sub_solve', p_choice%solve, info) + call prec%set('sub_solve', p_choice%solve2, info) case('INVT') - call prec%set('sub_solve', p_choice%solve, info) + call prec%set('sub_solve', p_choice%solve2, info) case('AINV') - call prec%set('sub_solve', p_choice%solve, info) - call prec%set('ainv_alg', p_choice%variant, info) + call prec%set('sub_solve', p_choice%solve2, info) + call prec%set('ainv_alg', p_choice%variant2, info) case default call prec%set('sub_solve', p_choice%solve2, info, pos='post') end select diff --git a/samples/advanced/pdegen/amg_s_pde2d.f90 b/samples/advanced/pdegen/amg_s_pde2d.f90 index 9211441a..799c9b8f 100644 --- a/samples/advanced/pdegen/amg_s_pde2d.f90 +++ b/samples/advanced/pdegen/amg_s_pde2d.f90 @@ -338,12 +338,12 @@ program amg_s_pde2d call prec%set('sub_prol', p_choice%prol2, info,pos='post') select case(trim(psb_toupper(p_choice%solve2))) case('INVK') - call prec%set('sub_solve', p_choice%solve, info) + call prec%set('sub_solve', p_choice%solve2, info) case('INVT') - call prec%set('sub_solve', p_choice%solve, info) + call prec%set('sub_solve', p_choice%solve2, info) case('AINV') - call prec%set('sub_solve', p_choice%solve, info) - call prec%set('ainv_alg', p_choice%variant, info) + call prec%set('sub_solve', p_choice%solve2, info) + call prec%set('ainv_alg', p_choice%variant2, info) case default call prec%set('sub_solve', p_choice%solve2, info, pos='post') end select diff --git a/samples/advanced/pdegen/amg_s_pde3d.f90 b/samples/advanced/pdegen/amg_s_pde3d.f90 index a743b3d6..7af11945 100644 --- a/samples/advanced/pdegen/amg_s_pde3d.f90 +++ b/samples/advanced/pdegen/amg_s_pde3d.f90 @@ -342,12 +342,12 @@ program amg_s_pde3d call prec%set('sub_prol', p_choice%prol2, info,pos='post') select case(trim(psb_toupper(p_choice%solve2))) case('INVK') - call prec%set('sub_solve', p_choice%solve, info) + call prec%set('sub_solve', p_choice%solve2, info) case('INVT') - call prec%set('sub_solve', p_choice%solve, info) + call prec%set('sub_solve', p_choice%solve2, info) case('AINV') - call prec%set('sub_solve', p_choice%solve, info) - call prec%set('ainv_alg', p_choice%variant, info) + call prec%set('sub_solve', p_choice%solve2, info) + call prec%set('ainv_alg', p_choice%variant2, info) case default call prec%set('sub_solve', p_choice%solve2, info, pos='post') end select From 9d11a99ed4afc5730958b449a5e80a74507aa4d0 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Fri, 27 Aug 2021 11:42:01 +0200 Subject: [PATCH 15/36] Fix settings in samples/PDEGEN --- amgprec/amg_d_matchboxp_mod.f90 | 355 ++---------------- amgprec/amg_d_parmatch_aggregator_mod.F90 | 2 +- amgprec/amg_s_matchboxp_mod.f90 | 355 ++---------------- amgprec/amg_s_parmatch_aggregator_mod.F90 | 2 +- .../amg_d_parmatch_aggregator_tprol.F90 | 2 +- .../amg_s_parmatch_aggregator_tprol.F90 | 2 +- samples/advanced/pdegen/amg_d_pde2d.f90 | 8 +- samples/advanced/pdegen/amg_d_pde3d.f90 | 8 +- samples/advanced/pdegen/amg_s_pde2d.f90 | 8 +- samples/advanced/pdegen/amg_s_pde3d.f90 | 8 +- 10 files changed, 72 insertions(+), 678 deletions(-) diff --git a/amgprec/amg_d_matchboxp_mod.f90 b/amgprec/amg_d_matchboxp_mod.f90 index f66fb174..a18d62d6 100644 --- a/amgprec/amg_d_matchboxp_mod.f90 +++ b/amgprec/amg_d_matchboxp_mod.f90 @@ -68,7 +68,7 @@ ! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ! POSSIBILITY OF SUCH DAMAGE. ! -module amg_dmatchboxp_mod +module amg_d_matchboxp_mod use iso_c_binding use psb_base_cbind_mod @@ -95,33 +95,24 @@ module amg_dmatchboxp_mod end interface MatchBoxPC interface amg_i_aggr_assign - module procedure amg_i_daggr_assign + module procedure amg_i_d_aggr_assign end interface amg_i_aggr_assign - interface amg_build_matching - module procedure amg_dbuild_matching - end interface amg_build_matching + interface amg_par_build_matching + module procedure amg_d_par_build_matching + end interface amg_par_build_matching - interface amg_build_ahat - module procedure amg_dbuild_ahat - end interface amg_build_ahat - - interface amg_gtranspose - module procedure amg_dgtranspose - end interface amg_gtranspose - - interface amg_htranspose - module procedure amg_dhtranspose - end interface amg_htranspose + interface amg_par_build_ahat + module procedure amg_d_par_build_ahat + end interface amg_par_build_ahat interface amg_PMatchBox - module procedure amg_dPMatchBox + module procedure amg_d_PMatchBox end interface amg_PMatchBox - logical, parameter, private :: print_statistics=.false. contains - subroutine amg_dmatchboxp_build_prol(w,a,desc_a,ilaggr,nlaggr,prol,info,& + subroutine amg_d_matchboxp_build_prol(w,a,desc_a,ilaggr,nlaggr,prol,info,& & symmetrize,reproducible,display_inp, display_out, print_out) use psb_base_mod use psb_util_mod @@ -214,7 +205,7 @@ contains end if if (do_timings) call psb_toc(idx_phase1) if (do_timings) call psb_tic(idx_bldmtc) - call amg_build_matching(w,a,desc_a,mate,info,display_inp=display_inp,symmetrize=symmetrize) + call amg_par_build_matching(w,a,desc_a,mate,info,display_inp=display_inp,symmetrize=symmetrize) if (do_timings) call psb_toc(idx_bldmtc) if (debug) write(0,*) iam,' buildprol from buildmatching:',& & info @@ -422,13 +413,11 @@ contains nlpairs = v(3) end block - if (print_statistics) then - if (iam == 0) then - write(0,*) 'Matching statistics: Unmatched nodes ',& - & nunmatched,' Singletons:',nlsingl,' Pairs:',nlpairs - end if + if (iam == 0) then + write(0,*) 'Matching statistics: Unmatched nodes ',& + & nunmatched,' Singletons:',nlsingl,' Pairs:',nlpairs end if - + if (display_out_) then block integer(psb_ipk_) :: idx @@ -516,9 +505,9 @@ contains write(0,*) iam,' : error from Matching: ',info end if - end subroutine amg_dmatchboxp_build_prol + end subroutine amg_d_matchboxp_build_prol - function amg_i_daggr_assign(iam, iown, kg, idxg, wk, widx, nrmagg) & + function amg_i_d_aggr_assign(iam, iown, kg, idxg, wk, widx, nrmagg) & & result(iproc) ! ! How to break ties? This @@ -560,10 +549,10 @@ contains iproc = iown end if end if - end function amg_i_daggr_assign + end function amg_i_d_aggr_assign - subroutine amg_dbuild_matching(w,a,desc_a,mate,info,display_inp, symmetrize) + subroutine amg_d_par_build_matching(w,a,desc_a,mate,info,display_inp, symmetrize) use psb_base_mod use psb_util_mod use iso_c_binding @@ -612,7 +601,7 @@ contains if (iam == 0) write(0,*)' Into build_ahat:' end if if (do_timings) call psb_tic(idx_bldahat) - call amg_build_ahat(w,a,ahatnd,desc_a,info,symmetrize=symmetrize) + call amg_par_build_ahat(w,a,ahatnd,desc_a,info,symmetrize=symmetrize) if (do_timings) call psb_toc(idx_bldahat) if (info /= 0) then write(0,*) 'Error from build_ahat ', info @@ -767,9 +756,9 @@ contains val(1:n) = tmp(1:n) end subroutine fix_order - end subroutine amg_dbuild_matching + end subroutine amg_d_par_build_matching - subroutine amg_dbuild_ahat(w,a,ahat,desc_a,info,symmetrize) + subroutine amg_d_par_build_ahat(w,a,ahat,desc_a,info,symmetrize) use psb_base_mod implicit none real(psb_dpk_), intent(in) :: w(:) @@ -1005,301 +994,9 @@ contains end block end if - end subroutine amg_dbuild_ahat + end subroutine amg_d_par_build_ahat - subroutine amg_dgtranspose(ain,aout,desc_a,info) - use psb_base_mod - implicit none - type(psb_ldspmat_type), intent(in) :: ain - type(psb_ldspmat_type), intent(out) :: aout - type(psb_desc_type) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! - ! BEWARE: This routine works under the assumption - ! that the same DESC_A works for both A and A^T, which - ! essentially means that A has a symmetric pattern. - ! - type(psb_ldspmat_type) :: atmp, ahalo, aglb - type(psb_ld_coo_sparse_mat) :: tmpcoo - type(psb_ld_csr_sparse_mat) :: tmpcsr - type(psb_ctxt_type) :: ictxt - integer(psb_ipk_) :: me, np - integer(psb_lpk_) :: i, j, k, nrow, ncol - integer(psb_lpk_), allocatable :: ilv(:) - character(len=80) :: aname - logical, parameter :: debug=.false., dump=.false., debug_sync=.false. - - ictxt = desc_a%get_context() - call psb_info(ictxt,me,np) - - nrow = desc_a%get_local_rows() - ncol = desc_a%get_local_cols() - if (debug_sync) then - call psb_barrier(ictxt) - if (me == 0) write(0,*) 'Start gtranspose ' - end if - call ain%cscnv(tmpcsr,info) - - if (debug) then - ilv = [(i,i=1,ncol)] - call desc_a%l2gip(ilv,info,owned=.false.) - write(aname,'(a,i3.3,a)') 'atmp-preh-',me,'.mtx' - call ain%print(fname=aname,head='atmp before haloTest ',iv=ilv) - end if - if (dump) then - call ain%cscnv(atmp,info) - call psb_gather(aglb,atmp,desc_a,info) - if (me==psb_root_) then - write(aname,'(a,i3.3,a)') 'aglob-prehalo.mtx' - call aglb%print(fname=aname,head='Test ') - end if - end if - - !call psb_loc_to_glob(tmpcsr%ja,desc_a,info) - call atmp%mv_from(tmpcsr) - - if (debug) then - write(aname,'(a,i3.3,a)') 'tmpcsr-',me,'.mtx' - call atmp%print(fname=aname,head='tmpcsr ',iv=ilv) - !call psb_set_debug_level(9999) - end if - - ! FIXME THIS NEEDS REWORKING - if (debug) write(0,*) me,' Gtranspose into sphalo :',atmp%get_nrows(),atmp%get_ncols() - call psb_sphalo(atmp,desc_a,ahalo,info,rowscale=.true.) - if (debug) write(0,*) me,' Gtranspose from sphalo :',ahalo%get_nrows(),ahalo%get_ncols() - if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=ahalo) - - if (debug) then - write(aname,'(a,i3.3,a)') 'ahalo-',me,'.mtx' - call ahalo%print(fname=aname,head='ahalo after haloTest ',iv=ilv) - write(aname,'(a,i3.3,a)') 'atmp-h-',me,'.mtx' - call atmp%print(fname=aname,head='atmp after haloTest ',iv=ilv) - end if - - if (info == psb_success_) call ahalo%free() - - call atmp%cp_to(tmpcoo) - call tmpcoo%transp() - !call psb_glob_to_loc(tmpcoo%ia,desc_a,info,iact='I') - if (debug) write(0,*) 'Before cleanup:',tmpcoo%get_nzeros() - - j = 0 - do k=1, tmpcoo%get_nzeros() - if ((tmpcoo%ia(k) > 0).and.(tmpcoo%ja(k)>0)) then - j = j+1 - tmpcoo%ia(j) = tmpcoo%ia(k) - tmpcoo%ja(j) = tmpcoo%ja(k) - tmpcoo%val(j) = tmpcoo%val(k) - end if - end do - call tmpcoo%set_nzeros(j) - - if (debug) write(0,*) 'After cleanup:',tmpcoo%get_nzeros() - - call ahalo%mv_from(tmpcoo) - if (dump) then - call psb_gather(aglb,ahalo,desc_a,info) - if (me==psb_root_) then - write(aname,'(a,i3.3,a)') 'atran-preclip.mtx' - call aglb%print(fname=aname,head='Test ') - end if - end if - - - call ahalo%csclip(aout,info,imax=nrow) - - if (debug) write(0,*) 'After clip:',aout%get_nzeros() - - if (debug_sync) then - call psb_barrier(ictxt) - if (me == 0) write(0,*) 'End gtranspose ' - end if - !call aout%cscnv(info,type='csr') - - if (dump) then - write(aname,'(a,i3.3,a)') 'atran-',me,'.mtx' - call aout%print(fname=aname,head='atrans ',iv=ilv) - call psb_gather(aglb,aout,desc_a,info) - if (me==psb_root_) then - write(aname,'(a,i3.3,a)') 'atran.mtx' - call aglb%print(fname=aname,head='Test ') - end if - end if - - end subroutine amg_dgtranspose - - subroutine amg_dhtranspose(ain,aout,desc_a,info) - use psb_base_mod - implicit none - type(psb_ldspmat_type), intent(in) :: ain - type(psb_ldspmat_type), intent(out) :: aout - type(psb_desc_type) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! - ! BEWARE: This routine works under the assumption - ! that the same DESC_A works for both A and A^T, which - ! essentially means that A has a symmetric pattern. - ! - type(psb_ldspmat_type) :: atmp, ahalo, aglb - type(psb_ld_coo_sparse_mat) :: tmpcoo, tmpc1, tmpc2, tmpch - type(psb_ld_csr_sparse_mat) :: tmpcsr - integer(psb_ipk_) :: nz1, nz2, nzh, nz - type(psb_ctxt_type) :: ictxt - integer(psb_ipk_) :: me, np - integer(psb_lpk_) :: i, j, k, nrow, ncol, nlz - integer(psb_lpk_), allocatable :: ilv(:) - character(len=80) :: aname - logical, parameter :: debug=.false., dump=.false., debug_sync=.false. - - ictxt = desc_a%get_context() - call psb_info(ictxt,me,np) - - nrow = desc_a%get_local_rows() - ncol = desc_a%get_local_cols() - if (debug_sync) then - call psb_barrier(ictxt) - if (me == 0) write(0,*) 'Start htranspose ' - end if - call ain%cscnv(tmpcsr,info) - - if (debug) then - ilv = [(i,i=1,ncol)] - call desc_a%l2gip(ilv,info,owned=.false.) - write(aname,'(a,i3.3,a)') 'atmp-preh-',me,'.mtx' - call ain%print(fname=aname,head='atmp before haloTest ',iv=ilv) - end if - if (dump) then - call ain%cscnv(atmp,info) - call psb_gather(aglb,atmp,desc_a,info) - if (me==psb_root_) then - write(aname,'(a,i3.3,a)') 'aglob-prehalo.mtx' - call aglb%print(fname=aname,head='Test ') - end if - end if - - !call psb_loc_to_glob(tmpcsr%ja,desc_a,info) - call atmp%mv_from(tmpcsr) - - if (debug) then - write(aname,'(a,i3.3,a)') 'tmpcsr-',me,'.mtx' - call atmp%print(fname=aname,head='tmpcsr ',iv=ilv) - !call psb_set_debug_level(9999) - end if - - ! FIXME THIS NEEDS REWORKING - if (debug) write(0,*) me,' Htranspose into sphalo :',atmp%get_nrows(),atmp%get_ncols() - if (.true.) then - call psb_sphalo(atmp,desc_a,ahalo,info, outfmt='coo ') - call atmp%mv_to(tmpc1) - call ahalo%mv_to(tmpch) - nz1 = tmpc1%get_nzeros() - call psb_loc_to_glob(tmpc1%ia(1:nz1),desc_a,info,iact='I') - call psb_loc_to_glob(tmpc1%ja(1:nz1),desc_a,info,iact='I') - nzh = tmpch%get_nzeros() - call psb_loc_to_glob(tmpch%ia(1:nzh),desc_a,info,iact='I') - call psb_loc_to_glob(tmpch%ja(1:nzh),desc_a,info,iact='I') - nlz = nz1+nzh - call tmpcoo%allocate(ncol,ncol,nlz) - tmpcoo%ia(1:nz1) = tmpc1%ia(1:nz1) - tmpcoo%ja(1:nz1) = tmpc1%ja(1:nz1) - tmpcoo%val(1:nz1) = tmpc1%val(1:nz1) - tmpcoo%ia(nz1+1:nz1+nzh) = tmpch%ia(1:nzh) - tmpcoo%ja(nz1+1:nz1+nzh) = tmpch%ja(1:nzh) - tmpcoo%val(nz1+1:nz1+nzh) = tmpch%val(1:nzh) - call tmpcoo%set_nzeros(nlz) - call tmpcoo%transp() - nz = tmpcoo%get_nzeros() - call psb_glob_to_loc(tmpcoo%ia(1:nz),desc_a,info,iact='I') - call psb_glob_to_loc(tmpcoo%ja(1:nz),desc_a,info,iact='I') - if (.true.) then - call tmpcoo%clean_negidx(info) - else - j = 0 - do k=1, tmpcoo%get_nzeros() - if ((tmpcoo%ia(k) > 0).and.(tmpcoo%ja(k)>0)) then - j = j+1 - tmpcoo%ia(j) = tmpcoo%ia(k) - tmpcoo%ja(j) = tmpcoo%ja(k) - tmpcoo%val(j) = tmpcoo%val(k) - end if - end do - call tmpcoo%set_nzeros(j) - end if - call ahalo%mv_from(tmpcoo) - call ahalo%csclip(aout,info,imax=nrow) - - else - call psb_sphalo(atmp,desc_a,ahalo,info, rowscale=.true.) - if (debug) write(0,*) me,' Htranspose from sphalo :',ahalo%get_nrows(),ahalo%get_ncols() - if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=ahalo) - - if (debug) then - write(aname,'(a,i3.3,a)') 'ahalo-',me,'.mtx' - call ahalo%print(fname=aname,head='ahalo after haloTest ',iv=ilv) - write(aname,'(a,i3.3,a)') 'atmp-h-',me,'.mtx' - call atmp%print(fname=aname,head='atmp after haloTest ',iv=ilv) - end if - - if (info == psb_success_) call ahalo%free() - - call atmp%cp_to(tmpcoo) - call tmpcoo%transp() - if (debug) write(0,*) 'Before cleanup:',tmpcoo%get_nzeros() - if (.true.) then - call tmpcoo%clean_negidx(info) - else - - j = 0 - do k=1, tmpcoo%get_nzeros() - if ((tmpcoo%ia(k) > 0).and.(tmpcoo%ja(k)>0)) then - j = j+1 - tmpcoo%ia(j) = tmpcoo%ia(k) - tmpcoo%ja(j) = tmpcoo%ja(k) - tmpcoo%val(j) = tmpcoo%val(k) - end if - end do - call tmpcoo%set_nzeros(j) - end if - - if (debug) write(0,*) 'After cleanup:',tmpcoo%get_nzeros() - - call ahalo%mv_from(tmpcoo) - if (dump) then - call psb_gather(aglb,ahalo,desc_a,info) - if (me==psb_root_) then - write(aname,'(a,i3.3,a)') 'atran-preclip.mtx' - call aglb%print(fname=aname,head='Test ') - end if - end if - - - call ahalo%csclip(aout,info,imax=nrow) - end if - - if (debug) write(0,*) 'After clip:',aout%get_nzeros() - - if (debug_sync) then - call psb_barrier(ictxt) - if (me == 0) write(0,*) 'End htranspose ' - end if - !call aout%cscnv(info,type='csr') - - if (dump) then - write(aname,'(a,i3.3,a)') 'atran-',me,'.mtx' - call aout%print(fname=aname,head='atrans ',iv=ilv) - call psb_gather(aglb,aout,desc_a,info) - if (me==psb_root_) then - write(aname,'(a,i3.3,a)') 'atran.mtx' - call aglb%print(fname=aname,head='Test ') - end if - end if - - end subroutine amg_dhtranspose - - subroutine amg_dPMatchBox(nlver,nledge,verlocptr,verlocind,edgelocweight,& + subroutine amg_d_PMatchBox(nlver,nledge,verlocptr,verlocind,edgelocweight,& & verdistance, mate, myrank, numprocs, ictxt,& & msgindsent,msgactualsent,msgpercent,& & ph0_time, ph1_time, ph2_time, ph1_card, ph2_card,info,display_inp) @@ -1434,6 +1131,6 @@ contains end if where(mate>=0) mate = mate + 1 - end subroutine amg_dPMatchBox + end subroutine amg_d_PMatchBox -end module amg_dmatchboxp_mod +end module amg_d_matchboxp_mod diff --git a/amgprec/amg_d_parmatch_aggregator_mod.F90 b/amgprec/amg_d_parmatch_aggregator_mod.F90 index 95e6ceea..cfe5e874 100644 --- a/amgprec/amg_d_parmatch_aggregator_mod.F90 +++ b/amgprec/amg_d_parmatch_aggregator_mod.F90 @@ -118,7 +118,7 @@ module amg_d_parmatch_aggregator_mod use amg_d_base_aggregator_mod - use amg_dmatchboxp_mod + use amg_d_matchboxp_mod #if defined(SERIAL_MPI) type, extends(amg_d_base_aggregator_type) :: amg_d_parmatch_aggregator_type end type amg_d_parmatch_aggregator_type diff --git a/amgprec/amg_s_matchboxp_mod.f90 b/amgprec/amg_s_matchboxp_mod.f90 index 36d9a726..9061344f 100644 --- a/amgprec/amg_s_matchboxp_mod.f90 +++ b/amgprec/amg_s_matchboxp_mod.f90 @@ -68,7 +68,7 @@ ! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ! POSSIBILITY OF SUCH DAMAGE. ! -module amg_smatchboxp_mod +module amg_s_matchboxp_mod use iso_c_binding use psb_base_cbind_mod @@ -95,33 +95,24 @@ module amg_smatchboxp_mod end interface MatchBoxPC interface amg_i_aggr_assign - module procedure amg_i_saggr_assign + module procedure amg_i_s_aggr_assign end interface amg_i_aggr_assign - interface amg_build_matching - module procedure amg_sbuild_matching - end interface amg_build_matching + interface amg_par_build_matching + module procedure amg_s_par_build_matching + end interface amg_par_build_matching - interface amg_build_ahat - module procedure amg_sbuild_ahat - end interface amg_build_ahat - - interface amg_gtranspose - module procedure amg_sgtranspose - end interface amg_gtranspose - - interface amg_htranspose - module procedure amg_shtranspose - end interface amg_htranspose + interface amg_par_build_ahat + module procedure amg_s_par_build_ahat + end interface amg_par_build_ahat interface amg_PMatchBox - module procedure amg_sPMatchBox + module procedure amg_s_PMatchBox end interface amg_PMatchBox - logical, parameter, private :: print_statistics=.false. contains - subroutine amg_smatchboxp_build_prol(w,a,desc_a,ilaggr,nlaggr,prol,info,& + subroutine amg_s_matchboxp_build_prol(w,a,desc_a,ilaggr,nlaggr,prol,info,& & symmetrize,reproducible,display_inp, display_out, print_out) use psb_base_mod use psb_util_mod @@ -214,7 +205,7 @@ contains end if if (do_timings) call psb_toc(idx_phase1) if (do_timings) call psb_tic(idx_bldmtc) - call amg_build_matching(w,a,desc_a,mate,info,display_inp=display_inp,symmetrize=symmetrize) + call amg_par_build_matching(w,a,desc_a,mate,info,display_inp=display_inp,symmetrize=symmetrize) if (do_timings) call psb_toc(idx_bldmtc) if (debug) write(0,*) iam,' buildprol from buildmatching:',& & info @@ -422,13 +413,11 @@ contains nlpairs = v(3) end block - if (print_statistics) then - if (iam == 0) then - write(0,*) 'Matching statistics: Unmatched nodes ',& - & nunmatched,' Singletons:',nlsingl,' Pairs:',nlpairs - end if + if (iam == 0) then + write(0,*) 'Matching statistics: Unmatched nodes ',& + & nunmatched,' Singletons:',nlsingl,' Pairs:',nlpairs end if - + if (display_out_) then block integer(psb_ipk_) :: idx @@ -516,9 +505,9 @@ contains write(0,*) iam,' : error from Matching: ',info end if - end subroutine amg_smatchboxp_build_prol + end subroutine amg_s_matchboxp_build_prol - function amg_i_saggr_assign(iam, iown, kg, idxg, wk, widx, nrmagg) & + function amg_i_s_aggr_assign(iam, iown, kg, idxg, wk, widx, nrmagg) & & result(iproc) ! ! How to break ties? This @@ -560,10 +549,10 @@ contains iproc = iown end if end if - end function amg_i_saggr_assign + end function amg_i_s_aggr_assign - subroutine amg_sbuild_matching(w,a,desc_a,mate,info,display_inp, symmetrize) + subroutine amg_s_par_build_matching(w,a,desc_a,mate,info,display_inp, symmetrize) use psb_base_mod use psb_util_mod use iso_c_binding @@ -612,7 +601,7 @@ contains if (iam == 0) write(0,*)' Into build_ahat:' end if if (do_timings) call psb_tic(idx_bldahat) - call amg_build_ahat(w,a,ahatnd,desc_a,info,symmetrize=symmetrize) + call amg_par_build_ahat(w,a,ahatnd,desc_a,info,symmetrize=symmetrize) if (do_timings) call psb_toc(idx_bldahat) if (info /= 0) then write(0,*) 'Error from build_ahat ', info @@ -767,9 +756,9 @@ contains val(1:n) = tmp(1:n) end subroutine fix_order - end subroutine amg_sbuild_matching + end subroutine amg_s_par_build_matching - subroutine amg_sbuild_ahat(w,a,ahat,desc_a,info,symmetrize) + subroutine amg_s_par_build_ahat(w,a,ahat,desc_a,info,symmetrize) use psb_base_mod implicit none real(psb_spk_), intent(in) :: w(:) @@ -1005,301 +994,9 @@ contains end block end if - end subroutine amg_sbuild_ahat + end subroutine amg_s_par_build_ahat - subroutine amg_sgtranspose(ain,aout,desc_a,info) - use psb_base_mod - implicit none - type(psb_lsspmat_type), intent(in) :: ain - type(psb_lsspmat_type), intent(out) :: aout - type(psb_desc_type) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! - ! BEWARE: This routine works under the assumption - ! that the same DESC_A works for both A and A^T, which - ! essentially means that A has a symmetric pattern. - ! - type(psb_lsspmat_type) :: atmp, ahalo, aglb - type(psb_ls_coo_sparse_mat) :: tmpcoo - type(psb_ls_csr_sparse_mat) :: tmpcsr - type(psb_ctxt_type) :: ictxt - integer(psb_ipk_) :: me, np - integer(psb_lpk_) :: i, j, k, nrow, ncol - integer(psb_lpk_), allocatable :: ilv(:) - character(len=80) :: aname - logical, parameter :: debug=.false., dump=.false., debug_sync=.false. - - ictxt = desc_a%get_context() - call psb_info(ictxt,me,np) - - nrow = desc_a%get_local_rows() - ncol = desc_a%get_local_cols() - if (debug_sync) then - call psb_barrier(ictxt) - if (me == 0) write(0,*) 'Start gtranspose ' - end if - call ain%cscnv(tmpcsr,info) - - if (debug) then - ilv = [(i,i=1,ncol)] - call desc_a%l2gip(ilv,info,owned=.false.) - write(aname,'(a,i3.3,a)') 'atmp-preh-',me,'.mtx' - call ain%print(fname=aname,head='atmp before haloTest ',iv=ilv) - end if - if (dump) then - call ain%cscnv(atmp,info) - call psb_gather(aglb,atmp,desc_a,info) - if (me==psb_root_) then - write(aname,'(a,i3.3,a)') 'aglob-prehalo.mtx' - call aglb%print(fname=aname,head='Test ') - end if - end if - - !call psb_loc_to_glob(tmpcsr%ja,desc_a,info) - call atmp%mv_from(tmpcsr) - - if (debug) then - write(aname,'(a,i3.3,a)') 'tmpcsr-',me,'.mtx' - call atmp%print(fname=aname,head='tmpcsr ',iv=ilv) - !call psb_set_debug_level(9999) - end if - - ! FIXME THIS NEEDS REWORKING - if (debug) write(0,*) me,' Gtranspose into sphalo :',atmp%get_nrows(),atmp%get_ncols() - call psb_sphalo(atmp,desc_a,ahalo,info,rowscale=.true.) - if (debug) write(0,*) me,' Gtranspose from sphalo :',ahalo%get_nrows(),ahalo%get_ncols() - if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=ahalo) - - if (debug) then - write(aname,'(a,i3.3,a)') 'ahalo-',me,'.mtx' - call ahalo%print(fname=aname,head='ahalo after haloTest ',iv=ilv) - write(aname,'(a,i3.3,a)') 'atmp-h-',me,'.mtx' - call atmp%print(fname=aname,head='atmp after haloTest ',iv=ilv) - end if - - if (info == psb_success_) call ahalo%free() - - call atmp%cp_to(tmpcoo) - call tmpcoo%transp() - !call psb_glob_to_loc(tmpcoo%ia,desc_a,info,iact='I') - if (debug) write(0,*) 'Before cleanup:',tmpcoo%get_nzeros() - - j = 0 - do k=1, tmpcoo%get_nzeros() - if ((tmpcoo%ia(k) > 0).and.(tmpcoo%ja(k)>0)) then - j = j+1 - tmpcoo%ia(j) = tmpcoo%ia(k) - tmpcoo%ja(j) = tmpcoo%ja(k) - tmpcoo%val(j) = tmpcoo%val(k) - end if - end do - call tmpcoo%set_nzeros(j) - - if (debug) write(0,*) 'After cleanup:',tmpcoo%get_nzeros() - - call ahalo%mv_from(tmpcoo) - if (dump) then - call psb_gather(aglb,ahalo,desc_a,info) - if (me==psb_root_) then - write(aname,'(a,i3.3,a)') 'atran-preclip.mtx' - call aglb%print(fname=aname,head='Test ') - end if - end if - - - call ahalo%csclip(aout,info,imax=nrow) - - if (debug) write(0,*) 'After clip:',aout%get_nzeros() - - if (debug_sync) then - call psb_barrier(ictxt) - if (me == 0) write(0,*) 'End gtranspose ' - end if - !call aout%cscnv(info,type='csr') - - if (dump) then - write(aname,'(a,i3.3,a)') 'atran-',me,'.mtx' - call aout%print(fname=aname,head='atrans ',iv=ilv) - call psb_gather(aglb,aout,desc_a,info) - if (me==psb_root_) then - write(aname,'(a,i3.3,a)') 'atran.mtx' - call aglb%print(fname=aname,head='Test ') - end if - end if - - end subroutine amg_sgtranspose - - subroutine amg_shtranspose(ain,aout,desc_a,info) - use psb_base_mod - implicit none - type(psb_lsspmat_type), intent(in) :: ain - type(psb_lsspmat_type), intent(out) :: aout - type(psb_desc_type) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! - ! BEWARE: This routine works under the assumption - ! that the same DESC_A works for both A and A^T, which - ! essentially means that A has a symmetric pattern. - ! - type(psb_lsspmat_type) :: atmp, ahalo, aglb - type(psb_ls_coo_sparse_mat) :: tmpcoo, tmpc1, tmpc2, tmpch - type(psb_ls_csr_sparse_mat) :: tmpcsr - integer(psb_ipk_) :: nz1, nz2, nzh, nz - type(psb_ctxt_type) :: ictxt - integer(psb_ipk_) :: me, np - integer(psb_lpk_) :: i, j, k, nrow, ncol, nlz - integer(psb_lpk_), allocatable :: ilv(:) - character(len=80) :: aname - logical, parameter :: debug=.false., dump=.false., debug_sync=.false. - - ictxt = desc_a%get_context() - call psb_info(ictxt,me,np) - - nrow = desc_a%get_local_rows() - ncol = desc_a%get_local_cols() - if (debug_sync) then - call psb_barrier(ictxt) - if (me == 0) write(0,*) 'Start htranspose ' - end if - call ain%cscnv(tmpcsr,info) - - if (debug) then - ilv = [(i,i=1,ncol)] - call desc_a%l2gip(ilv,info,owned=.false.) - write(aname,'(a,i3.3,a)') 'atmp-preh-',me,'.mtx' - call ain%print(fname=aname,head='atmp before haloTest ',iv=ilv) - end if - if (dump) then - call ain%cscnv(atmp,info) - call psb_gather(aglb,atmp,desc_a,info) - if (me==psb_root_) then - write(aname,'(a,i3.3,a)') 'aglob-prehalo.mtx' - call aglb%print(fname=aname,head='Test ') - end if - end if - - !call psb_loc_to_glob(tmpcsr%ja,desc_a,info) - call atmp%mv_from(tmpcsr) - - if (debug) then - write(aname,'(a,i3.3,a)') 'tmpcsr-',me,'.mtx' - call atmp%print(fname=aname,head='tmpcsr ',iv=ilv) - !call psb_set_debug_level(9999) - end if - - ! FIXME THIS NEEDS REWORKING - if (debug) write(0,*) me,' Htranspose into sphalo :',atmp%get_nrows(),atmp%get_ncols() - if (.true.) then - call psb_sphalo(atmp,desc_a,ahalo,info, outfmt='coo ') - call atmp%mv_to(tmpc1) - call ahalo%mv_to(tmpch) - nz1 = tmpc1%get_nzeros() - call psb_loc_to_glob(tmpc1%ia(1:nz1),desc_a,info,iact='I') - call psb_loc_to_glob(tmpc1%ja(1:nz1),desc_a,info,iact='I') - nzh = tmpch%get_nzeros() - call psb_loc_to_glob(tmpch%ia(1:nzh),desc_a,info,iact='I') - call psb_loc_to_glob(tmpch%ja(1:nzh),desc_a,info,iact='I') - nlz = nz1+nzh - call tmpcoo%allocate(ncol,ncol,nlz) - tmpcoo%ia(1:nz1) = tmpc1%ia(1:nz1) - tmpcoo%ja(1:nz1) = tmpc1%ja(1:nz1) - tmpcoo%val(1:nz1) = tmpc1%val(1:nz1) - tmpcoo%ia(nz1+1:nz1+nzh) = tmpch%ia(1:nzh) - tmpcoo%ja(nz1+1:nz1+nzh) = tmpch%ja(1:nzh) - tmpcoo%val(nz1+1:nz1+nzh) = tmpch%val(1:nzh) - call tmpcoo%set_nzeros(nlz) - call tmpcoo%transp() - nz = tmpcoo%get_nzeros() - call psb_glob_to_loc(tmpcoo%ia(1:nz),desc_a,info,iact='I') - call psb_glob_to_loc(tmpcoo%ja(1:nz),desc_a,info,iact='I') - if (.true.) then - call tmpcoo%clean_negidx(info) - else - j = 0 - do k=1, tmpcoo%get_nzeros() - if ((tmpcoo%ia(k) > 0).and.(tmpcoo%ja(k)>0)) then - j = j+1 - tmpcoo%ia(j) = tmpcoo%ia(k) - tmpcoo%ja(j) = tmpcoo%ja(k) - tmpcoo%val(j) = tmpcoo%val(k) - end if - end do - call tmpcoo%set_nzeros(j) - end if - call ahalo%mv_from(tmpcoo) - call ahalo%csclip(aout,info,imax=nrow) - - else - call psb_sphalo(atmp,desc_a,ahalo,info, rowscale=.true.) - if (debug) write(0,*) me,' Htranspose from sphalo :',ahalo%get_nrows(),ahalo%get_ncols() - if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=ahalo) - - if (debug) then - write(aname,'(a,i3.3,a)') 'ahalo-',me,'.mtx' - call ahalo%print(fname=aname,head='ahalo after haloTest ',iv=ilv) - write(aname,'(a,i3.3,a)') 'atmp-h-',me,'.mtx' - call atmp%print(fname=aname,head='atmp after haloTest ',iv=ilv) - end if - - if (info == psb_success_) call ahalo%free() - - call atmp%cp_to(tmpcoo) - call tmpcoo%transp() - if (debug) write(0,*) 'Before cleanup:',tmpcoo%get_nzeros() - if (.true.) then - call tmpcoo%clean_negidx(info) - else - - j = 0 - do k=1, tmpcoo%get_nzeros() - if ((tmpcoo%ia(k) > 0).and.(tmpcoo%ja(k)>0)) then - j = j+1 - tmpcoo%ia(j) = tmpcoo%ia(k) - tmpcoo%ja(j) = tmpcoo%ja(k) - tmpcoo%val(j) = tmpcoo%val(k) - end if - end do - call tmpcoo%set_nzeros(j) - end if - - if (debug) write(0,*) 'After cleanup:',tmpcoo%get_nzeros() - - call ahalo%mv_from(tmpcoo) - if (dump) then - call psb_gather(aglb,ahalo,desc_a,info) - if (me==psb_root_) then - write(aname,'(a,i3.3,a)') 'atran-preclip.mtx' - call aglb%print(fname=aname,head='Test ') - end if - end if - - - call ahalo%csclip(aout,info,imax=nrow) - end if - - if (debug) write(0,*) 'After clip:',aout%get_nzeros() - - if (debug_sync) then - call psb_barrier(ictxt) - if (me == 0) write(0,*) 'End htranspose ' - end if - !call aout%cscnv(info,type='csr') - - if (dump) then - write(aname,'(a,i3.3,a)') 'atran-',me,'.mtx' - call aout%print(fname=aname,head='atrans ',iv=ilv) - call psb_gather(aglb,aout,desc_a,info) - if (me==psb_root_) then - write(aname,'(a,i3.3,a)') 'atran.mtx' - call aglb%print(fname=aname,head='Test ') - end if - end if - - end subroutine amg_shtranspose - - subroutine amg_sPMatchBox(nlver,nledge,verlocptr,verlocind,edgelocweight,& + subroutine amg_s_PMatchBox(nlver,nledge,verlocptr,verlocind,edgelocweight,& & verdistance, mate, myrank, numprocs, ictxt,& & msgindsent,msgactualsent,msgpercent,& & ph0_time, ph1_time, ph2_time, ph1_card, ph2_card,info,display_inp) @@ -1434,6 +1131,6 @@ contains end if where(mate>=0) mate = mate + 1 - end subroutine amg_sPMatchBox + end subroutine amg_s_PMatchBox -end module amg_smatchboxp_mod +end module amg_s_matchboxp_mod diff --git a/amgprec/amg_s_parmatch_aggregator_mod.F90 b/amgprec/amg_s_parmatch_aggregator_mod.F90 index f8ea7bfa..90c76bd9 100644 --- a/amgprec/amg_s_parmatch_aggregator_mod.F90 +++ b/amgprec/amg_s_parmatch_aggregator_mod.F90 @@ -118,7 +118,7 @@ module amg_s_parmatch_aggregator_mod use amg_s_base_aggregator_mod - use amg_smatchboxp_mod + use amg_s_matchboxp_mod #if defined(SERIAL_MPI) type, extends(amg_s_base_aggregator_type) :: amg_s_parmatch_aggregator_type end type amg_s_parmatch_aggregator_type diff --git a/amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 b/amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 index 5e32fbe3..56ec02b5 100644 --- a/amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 +++ b/amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 @@ -264,7 +264,7 @@ subroutine amg_d_parmatch_aggregator_build_tprol(ag,parms,ag_data,& ! if (debug) write(0,*) me,' Into matchbox_build_prol ',info if (do_timings) call psb_tic(idx_mboxp) - call amg_dmatchboxp_build_prol(tmpw,acv(i-1),desc_acv(i-1),ixaggr,nxaggr,tmp_prol,info,& + call amg_d_matchboxp_build_prol(tmpw,acv(i-1),desc_acv(i-1),ixaggr,nxaggr,tmp_prol,info,& & symmetrize=ag%need_symmetrize,reproducible=ag%reproducible_matching) if (do_timings) call psb_toc(idx_mboxp) if (debug) write(0,*) me,' Out from matchbox_build_prol ',info diff --git a/amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 b/amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 index a396384f..c91c2862 100644 --- a/amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 +++ b/amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 @@ -264,7 +264,7 @@ subroutine amg_s_parmatch_aggregator_build_tprol(ag,parms,ag_data,& ! if (debug) write(0,*) me,' Into matchbox_build_prol ',info if (do_timings) call psb_tic(idx_mboxp) - call amg_smatchboxp_build_prol(tmpw,acv(i-1),desc_acv(i-1),ixaggr,nxaggr,tmp_prol,info,& + call amg_s_matchboxp_build_prol(tmpw,acv(i-1),desc_acv(i-1),ixaggr,nxaggr,tmp_prol,info,& & symmetrize=ag%need_symmetrize,reproducible=ag%reproducible_matching) if (do_timings) call psb_toc(idx_mboxp) if (debug) write(0,*) me,' Out from matchbox_build_prol ',info diff --git a/samples/advanced/pdegen/amg_d_pde2d.f90 b/samples/advanced/pdegen/amg_d_pde2d.f90 index d4e5ad68..92cc0a2d 100644 --- a/samples/advanced/pdegen/amg_d_pde2d.f90 +++ b/samples/advanced/pdegen/amg_d_pde2d.f90 @@ -338,12 +338,12 @@ program amg_d_pde2d call prec%set('sub_prol', p_choice%prol2, info,pos='post') select case(trim(psb_toupper(p_choice%solve2))) case('INVK') - call prec%set('sub_solve', p_choice%solve, info) + call prec%set('sub_solve', p_choice%solve2, info) case('INVT') - call prec%set('sub_solve', p_choice%solve, info) + call prec%set('sub_solve', p_choice%solve2, info) case('AINV') - call prec%set('sub_solve', p_choice%solve, info) - call prec%set('ainv_alg', p_choice%variant, info) + call prec%set('sub_solve', p_choice%solve2, info) + call prec%set('ainv_alg', p_choice%variant2, info) case default call prec%set('sub_solve', p_choice%solve2, info, pos='post') end select diff --git a/samples/advanced/pdegen/amg_d_pde3d.f90 b/samples/advanced/pdegen/amg_d_pde3d.f90 index b80e14df..9d3028a2 100644 --- a/samples/advanced/pdegen/amg_d_pde3d.f90 +++ b/samples/advanced/pdegen/amg_d_pde3d.f90 @@ -342,12 +342,12 @@ program amg_d_pde3d call prec%set('sub_prol', p_choice%prol2, info,pos='post') select case(trim(psb_toupper(p_choice%solve2))) case('INVK') - call prec%set('sub_solve', p_choice%solve, info) + call prec%set('sub_solve', p_choice%solve2, info) case('INVT') - call prec%set('sub_solve', p_choice%solve, info) + call prec%set('sub_solve', p_choice%solve2, info) case('AINV') - call prec%set('sub_solve', p_choice%solve, info) - call prec%set('ainv_alg', p_choice%variant, info) + call prec%set('sub_solve', p_choice%solve2, info) + call prec%set('ainv_alg', p_choice%variant2, info) case default call prec%set('sub_solve', p_choice%solve2, info, pos='post') end select diff --git a/samples/advanced/pdegen/amg_s_pde2d.f90 b/samples/advanced/pdegen/amg_s_pde2d.f90 index 9211441a..799c9b8f 100644 --- a/samples/advanced/pdegen/amg_s_pde2d.f90 +++ b/samples/advanced/pdegen/amg_s_pde2d.f90 @@ -338,12 +338,12 @@ program amg_s_pde2d call prec%set('sub_prol', p_choice%prol2, info,pos='post') select case(trim(psb_toupper(p_choice%solve2))) case('INVK') - call prec%set('sub_solve', p_choice%solve, info) + call prec%set('sub_solve', p_choice%solve2, info) case('INVT') - call prec%set('sub_solve', p_choice%solve, info) + call prec%set('sub_solve', p_choice%solve2, info) case('AINV') - call prec%set('sub_solve', p_choice%solve, info) - call prec%set('ainv_alg', p_choice%variant, info) + call prec%set('sub_solve', p_choice%solve2, info) + call prec%set('ainv_alg', p_choice%variant2, info) case default call prec%set('sub_solve', p_choice%solve2, info, pos='post') end select diff --git a/samples/advanced/pdegen/amg_s_pde3d.f90 b/samples/advanced/pdegen/amg_s_pde3d.f90 index a743b3d6..7af11945 100644 --- a/samples/advanced/pdegen/amg_s_pde3d.f90 +++ b/samples/advanced/pdegen/amg_s_pde3d.f90 @@ -342,12 +342,12 @@ program amg_s_pde3d call prec%set('sub_prol', p_choice%prol2, info,pos='post') select case(trim(psb_toupper(p_choice%solve2))) case('INVK') - call prec%set('sub_solve', p_choice%solve, info) + call prec%set('sub_solve', p_choice%solve2, info) case('INVT') - call prec%set('sub_solve', p_choice%solve, info) + call prec%set('sub_solve', p_choice%solve2, info) case('AINV') - call prec%set('sub_solve', p_choice%solve, info) - call prec%set('ainv_alg', p_choice%variant, info) + call prec%set('sub_solve', p_choice%solve2, info) + call prec%set('ainv_alg', p_choice%variant2, info) case default call prec%set('sub_solve', p_choice%solve2, info, pos='post') end select From 5768238f666acbbb4cad3e5c2b72ca159b584e73 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Wed, 22 Sep 2021 05:02:12 -0400 Subject: [PATCH 16/36] Typographical fixes. --- amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 | 2 +- amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 b/amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 index 56ec02b5..5ae47718 100644 --- a/amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 +++ b/amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 @@ -48,7 +48,7 @@ subroutine amg_d_parmatch_aggregator_build_tprol(ag,parms,ag_data,& use amg_base_prec_type use amg_d_inner_mod #if defined(SERIAL_MPI) - use amg_d_parmatch_aggregator_mod + use amg_d_parmatch_aggregator_mod #else use amg_d_parmatch_aggregator_mod, amg_protect_name => amg_d_parmatch_aggregator_build_tprol #endif diff --git a/amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 b/amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 index c91c2862..28b63272 100644 --- a/amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 +++ b/amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 @@ -48,7 +48,7 @@ subroutine amg_s_parmatch_aggregator_build_tprol(ag,parms,ag_data,& use amg_base_prec_type use amg_s_inner_mod #if defined(SERIAL_MPI) - use amg_s_parmatch_aggregator_mod + use amg_s_parmatch_aggregator_mod #else use amg_s_parmatch_aggregator_mod, amg_protect_name => amg_s_parmatch_aggregator_build_tprol #endif From 49777a379bf0140785ead62094e5ea98aadb84cb Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Mon, 27 Sep 2021 14:22:34 +0200 Subject: [PATCH 17/36] Cosmetic change in sample source code --- samples/advanced/pdegen/amg_d_pde3d.f90 | 2 +- samples/advanced/pdegen/amg_s_pde3d.f90 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/advanced/pdegen/amg_d_pde3d.f90 b/samples/advanced/pdegen/amg_d_pde3d.f90 index 9d3028a2..f332589f 100644 --- a/samples/advanced/pdegen/amg_d_pde3d.f90 +++ b/samples/advanced/pdegen/amg_d_pde3d.f90 @@ -630,6 +630,7 @@ contains call psb_bcast(ctxt,prec%mlcycle) call psb_bcast(ctxt,prec%outer_sweeps) call psb_bcast(ctxt,prec%maxlevs) + call psb_bcast(ctxt,prec%csizepp) call psb_bcast(ctxt,prec%aggr_prol) call psb_bcast(ctxt,prec%par_aggr_alg) @@ -645,7 +646,6 @@ contains end if call psb_bcast(ctxt,prec%athres) - call psb_bcast(ctxt,prec%csizepp) call psb_bcast(ctxt,prec%cmat) call psb_bcast(ctxt,prec%csolve) call psb_bcast(ctxt,prec%csbsolve) diff --git a/samples/advanced/pdegen/amg_s_pde3d.f90 b/samples/advanced/pdegen/amg_s_pde3d.f90 index 7af11945..a40011e2 100644 --- a/samples/advanced/pdegen/amg_s_pde3d.f90 +++ b/samples/advanced/pdegen/amg_s_pde3d.f90 @@ -630,6 +630,7 @@ contains call psb_bcast(ctxt,prec%mlcycle) call psb_bcast(ctxt,prec%outer_sweeps) call psb_bcast(ctxt,prec%maxlevs) + call psb_bcast(ctxt,prec%csizepp) call psb_bcast(ctxt,prec%aggr_prol) call psb_bcast(ctxt,prec%par_aggr_alg) @@ -645,7 +646,6 @@ contains end if call psb_bcast(ctxt,prec%athres) - call psb_bcast(ctxt,prec%csizepp) call psb_bcast(ctxt,prec%cmat) call psb_bcast(ctxt,prec%csolve) call psb_bcast(ctxt,prec%csbsolve) From af178daa84ce08eb58b649fdce2b49e745464c25 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Mon, 27 Sep 2021 14:50:46 +0200 Subject: [PATCH 18/36] Modify dump method to print base level matrix. --- amgprec/impl/level/amg_c_base_onelev_dump.f90 | 26 ++++++++++--------- amgprec/impl/level/amg_d_base_onelev_dump.f90 | 26 ++++++++++--------- amgprec/impl/level/amg_s_base_onelev_dump.f90 | 26 ++++++++++--------- amgprec/impl/level/amg_z_base_onelev_dump.f90 | 26 ++++++++++--------- 4 files changed, 56 insertions(+), 48 deletions(-) diff --git a/amgprec/impl/level/amg_c_base_onelev_dump.f90 b/amgprec/impl/level/amg_c_base_onelev_dump.f90 index aba4bfa6..14b4c9b6 100644 --- a/amgprec/impl/level/amg_c_base_onelev_dump.f90 +++ b/amgprec/impl/level/amg_c_base_onelev_dump.f90 @@ -101,7 +101,13 @@ subroutine amg_c_base_onelev_dump(lv,level,info,prefix,head,ac,rp,& end if if (global_num_) then - if (level >= 2) then + if (level == 1) then + if (ac_) then + ivr = lv%base_desc%get_global_indices(owned=.false.) + write(fname(lname+1:),'(a,i3.3,a)')'_l',level,'_ac.mtx' + call lv%base_a%print(fname,head=head,iv=ivr) + end if + else if (level >= 2) then if (ac_) then ivr = lv%desc_ac%get_global_indices(owned=.false.) write(fname(lname+1:),'(a,i3.3,a)')'_l',level,'_ac.mtx' @@ -126,7 +132,12 @@ subroutine amg_c_base_onelev_dump(lv,level,info,prefix,head,ac,rp,& end if end if else - if (level >= 2) then + if (level == 1) then + if (ac_) then + write(fname(lname+1:),'(a,i3.3,a)')'_l',level,'_ac.mtx' + call lv%base_a%print(fname,head=head) + end if + else if (level >= 2) then if (ac_) then write(fname(lname+1:),'(a,i3.3,a)')'_l',level,'_ac.mtx' call lv%ac%print(fname,head=head) @@ -146,16 +157,7 @@ subroutine amg_c_base_onelev_dump(lv,level,info,prefix,head,ac,rp,& end if end if - if (level >= 2) then - if (allocated(lv%sm)) then - call lv%sm%dump(lv%desc_ac,level,info,smoother=smoother, & - & solver=solver,prefix=trim(prefix_)//"_sm",global_num=global_num) - end if - if (allocated(lv%sm2a)) then - call lv%sm2a%dump(lv%desc_ac,level,info,smoother=smoother, & - & solver=solver,prefix=trim(prefix_)//"_sm2a",global_num=global_num) - end if - else + if (level >= 1) then if (allocated(lv%sm)) then call lv%sm%dump(lv%base_desc,level,info,smoother=smoother, & & solver=solver,prefix=trim(prefix_)//"_sm",global_num=global_num) diff --git a/amgprec/impl/level/amg_d_base_onelev_dump.f90 b/amgprec/impl/level/amg_d_base_onelev_dump.f90 index 32fe1e55..c1013d41 100644 --- a/amgprec/impl/level/amg_d_base_onelev_dump.f90 +++ b/amgprec/impl/level/amg_d_base_onelev_dump.f90 @@ -101,7 +101,13 @@ subroutine amg_d_base_onelev_dump(lv,level,info,prefix,head,ac,rp,& end if if (global_num_) then - if (level >= 2) then + if (level == 1) then + if (ac_) then + ivr = lv%base_desc%get_global_indices(owned=.false.) + write(fname(lname+1:),'(a,i3.3,a)')'_l',level,'_ac.mtx' + call lv%base_a%print(fname,head=head,iv=ivr) + end if + else if (level >= 2) then if (ac_) then ivr = lv%desc_ac%get_global_indices(owned=.false.) write(fname(lname+1:),'(a,i3.3,a)')'_l',level,'_ac.mtx' @@ -126,7 +132,12 @@ subroutine amg_d_base_onelev_dump(lv,level,info,prefix,head,ac,rp,& end if end if else - if (level >= 2) then + if (level == 1) then + if (ac_) then + write(fname(lname+1:),'(a,i3.3,a)')'_l',level,'_ac.mtx' + call lv%base_a%print(fname,head=head) + end if + else if (level >= 2) then if (ac_) then write(fname(lname+1:),'(a,i3.3,a)')'_l',level,'_ac.mtx' call lv%ac%print(fname,head=head) @@ -146,16 +157,7 @@ subroutine amg_d_base_onelev_dump(lv,level,info,prefix,head,ac,rp,& end if end if - if (level >= 2) then - if (allocated(lv%sm)) then - call lv%sm%dump(lv%desc_ac,level,info,smoother=smoother, & - & solver=solver,prefix=trim(prefix_)//"_sm",global_num=global_num) - end if - if (allocated(lv%sm2a)) then - call lv%sm2a%dump(lv%desc_ac,level,info,smoother=smoother, & - & solver=solver,prefix=trim(prefix_)//"_sm2a",global_num=global_num) - end if - else + if (level >= 1) then if (allocated(lv%sm)) then call lv%sm%dump(lv%base_desc,level,info,smoother=smoother, & & solver=solver,prefix=trim(prefix_)//"_sm",global_num=global_num) diff --git a/amgprec/impl/level/amg_s_base_onelev_dump.f90 b/amgprec/impl/level/amg_s_base_onelev_dump.f90 index ba70a1a1..d30c0bf7 100644 --- a/amgprec/impl/level/amg_s_base_onelev_dump.f90 +++ b/amgprec/impl/level/amg_s_base_onelev_dump.f90 @@ -101,7 +101,13 @@ subroutine amg_s_base_onelev_dump(lv,level,info,prefix,head,ac,rp,& end if if (global_num_) then - if (level >= 2) then + if (level == 1) then + if (ac_) then + ivr = lv%base_desc%get_global_indices(owned=.false.) + write(fname(lname+1:),'(a,i3.3,a)')'_l',level,'_ac.mtx' + call lv%base_a%print(fname,head=head,iv=ivr) + end if + else if (level >= 2) then if (ac_) then ivr = lv%desc_ac%get_global_indices(owned=.false.) write(fname(lname+1:),'(a,i3.3,a)')'_l',level,'_ac.mtx' @@ -126,7 +132,12 @@ subroutine amg_s_base_onelev_dump(lv,level,info,prefix,head,ac,rp,& end if end if else - if (level >= 2) then + if (level == 1) then + if (ac_) then + write(fname(lname+1:),'(a,i3.3,a)')'_l',level,'_ac.mtx' + call lv%base_a%print(fname,head=head) + end if + else if (level >= 2) then if (ac_) then write(fname(lname+1:),'(a,i3.3,a)')'_l',level,'_ac.mtx' call lv%ac%print(fname,head=head) @@ -146,16 +157,7 @@ subroutine amg_s_base_onelev_dump(lv,level,info,prefix,head,ac,rp,& end if end if - if (level >= 2) then - if (allocated(lv%sm)) then - call lv%sm%dump(lv%desc_ac,level,info,smoother=smoother, & - & solver=solver,prefix=trim(prefix_)//"_sm",global_num=global_num) - end if - if (allocated(lv%sm2a)) then - call lv%sm2a%dump(lv%desc_ac,level,info,smoother=smoother, & - & solver=solver,prefix=trim(prefix_)//"_sm2a",global_num=global_num) - end if - else + if (level >= 1) then if (allocated(lv%sm)) then call lv%sm%dump(lv%base_desc,level,info,smoother=smoother, & & solver=solver,prefix=trim(prefix_)//"_sm",global_num=global_num) diff --git a/amgprec/impl/level/amg_z_base_onelev_dump.f90 b/amgprec/impl/level/amg_z_base_onelev_dump.f90 index 0c111355..5d0b8f27 100644 --- a/amgprec/impl/level/amg_z_base_onelev_dump.f90 +++ b/amgprec/impl/level/amg_z_base_onelev_dump.f90 @@ -101,7 +101,13 @@ subroutine amg_z_base_onelev_dump(lv,level,info,prefix,head,ac,rp,& end if if (global_num_) then - if (level >= 2) then + if (level == 1) then + if (ac_) then + ivr = lv%base_desc%get_global_indices(owned=.false.) + write(fname(lname+1:),'(a,i3.3,a)')'_l',level,'_ac.mtx' + call lv%base_a%print(fname,head=head,iv=ivr) + end if + else if (level >= 2) then if (ac_) then ivr = lv%desc_ac%get_global_indices(owned=.false.) write(fname(lname+1:),'(a,i3.3,a)')'_l',level,'_ac.mtx' @@ -126,7 +132,12 @@ subroutine amg_z_base_onelev_dump(lv,level,info,prefix,head,ac,rp,& end if end if else - if (level >= 2) then + if (level == 1) then + if (ac_) then + write(fname(lname+1:),'(a,i3.3,a)')'_l',level,'_ac.mtx' + call lv%base_a%print(fname,head=head) + end if + else if (level >= 2) then if (ac_) then write(fname(lname+1:),'(a,i3.3,a)')'_l',level,'_ac.mtx' call lv%ac%print(fname,head=head) @@ -146,16 +157,7 @@ subroutine amg_z_base_onelev_dump(lv,level,info,prefix,head,ac,rp,& end if end if - if (level >= 2) then - if (allocated(lv%sm)) then - call lv%sm%dump(lv%desc_ac,level,info,smoother=smoother, & - & solver=solver,prefix=trim(prefix_)//"_sm",global_num=global_num) - end if - if (allocated(lv%sm2a)) then - call lv%sm2a%dump(lv%desc_ac,level,info,smoother=smoother, & - & solver=solver,prefix=trim(prefix_)//"_sm2a",global_num=global_num) - end if - else + if (level >= 1) then if (allocated(lv%sm)) then call lv%sm%dump(lv%base_desc,level,info,smoother=smoother, & & solver=solver,prefix=trim(prefix_)//"_sm",global_num=global_num) From 92f7cde375ff59e5cb66ecb0d89be40905480a73 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Mon, 27 Sep 2021 10:38:49 -0400 Subject: [PATCH 19/36] Make test program to dump preconditioner controlled from input file. --- samples/advanced/pdegen/amg_d_pde2d.f90 | 44 ++++++++++++++++++++- samples/advanced/pdegen/amg_d_pde3d.f90 | 45 +++++++++++++++++++++- samples/advanced/pdegen/amg_s_pde2d.f90 | 44 ++++++++++++++++++++- samples/advanced/pdegen/amg_s_pde3d.f90 | 45 +++++++++++++++++++++- samples/advanced/pdegen/runs/amg_pde2d.inp | 10 +++++ samples/advanced/pdegen/runs/amg_pde3d.inp | 12 +++++- 6 files changed, 191 insertions(+), 9 deletions(-) diff --git a/samples/advanced/pdegen/amg_d_pde2d.f90 b/samples/advanced/pdegen/amg_d_pde2d.f90 index 92cc0a2d..4e72981f 100644 --- a/samples/advanced/pdegen/amg_d_pde2d.f90 +++ b/samples/advanced/pdegen/amg_d_pde2d.f90 @@ -119,7 +119,7 @@ program amg_d_pde2d character(len=10) :: ptype ! preconditioner type integer(psb_ipk_) :: outer_sweeps ! number of outer sweeps: sweeps for 1-level, - ! AMG cycles for ML + ! AMG cycles for ML ! general AMG data character(len=16) :: mlcycle ! AMG cycle type integer(psb_ipk_) :: maxlevs ! maximum number of levels in AMG preconditioner @@ -174,6 +174,17 @@ program amg_d_pde2d real(psb_dpk_) :: cthres ! threshold for ILUT factorization integer(psb_ipk_) :: cjswp ! sweeps for GS or JAC coarsest-lev subsolver + ! Dump data + logical :: dump = .false. + integer(psb_ipk_) :: dlmin ! Minimum level to dump + integer(psb_ipk_) :: dlmax ! Maximum level to dump + logical :: dump_ac = .false. + logical :: dump_rp = .false. + logical :: dump_tprol = .false. + logical :: dump_smoother = .false. + logical :: dump_solver = .false. + logical :: dump_global_num = .false. + end type precdata type(precdata) :: p_choice @@ -392,6 +403,12 @@ program amg_d_pde2d write(psb_out_unit,'(" ")') end if + if (p_choice%dump) then + call prec%dump(info,istart=p_choice%dlmin,iend=p_choice%dlmax,& + & ac=p_choice%dump_ac,rp=p_choice%dump_rp,tprol=p_choice%dump_tprol,& + & smoother=p_choice%dump_smoother, solver=p_choice%dump_solver, & + & global_num=p_choice%dump_global_num) + end if ! ! iterative method parameters ! @@ -530,6 +547,7 @@ contains ! preconditioner type call read_data(prec%descr,inp_unit) ! verbose description of the prec call read_data(prec%ptype,inp_unit) ! preconditioner type + ! First smoother / 1-lev preconditioner call read_data(prec%smther,inp_unit) ! smoother type call read_data(prec%jsweeps,inp_unit) ! (pre-)smoother / 1-lev prec sweeps @@ -580,6 +598,17 @@ contains call read_data(prec%cfill,inp_unit) ! fill-in for incompl LU call read_data(prec%cthres,inp_unit) ! Threshold for ILUT call read_data(prec%cjswp,inp_unit) ! sweeps for GS/JAC subsolver + ! dump + call read_data(prec%dump,inp_unit) ! Dump on file? + call read_data(prec%dlmin,inp_unit) ! Minimum level to dump + call read_data(prec%dlmax,inp_unit) ! Maximum level to dump + call read_data(prec%dump_ac,inp_unit) + call read_data(prec%dump_rp,inp_unit) + call read_data(prec%dump_tprol,inp_unit) + call read_data(prec%dump_smoother,inp_unit) + call read_data(prec%dump_solver,inp_unit) + call read_data(prec%dump_global_num,inp_unit) + if (inp_unit /= psb_inp_unit) then close(inp_unit) end if @@ -626,6 +655,7 @@ contains call psb_bcast(ctxt,prec%mlcycle) call psb_bcast(ctxt,prec%outer_sweeps) call psb_bcast(ctxt,prec%maxlevs) + call psb_bcast(ctxt,prec%csizepp) call psb_bcast(ctxt,prec%aggr_prol) call psb_bcast(ctxt,prec%par_aggr_alg) @@ -641,13 +671,23 @@ contains end if call psb_bcast(ctxt,prec%athres) - call psb_bcast(ctxt,prec%csizepp) call psb_bcast(ctxt,prec%cmat) call psb_bcast(ctxt,prec%csolve) call psb_bcast(ctxt,prec%csbsolve) call psb_bcast(ctxt,prec%cfill) call psb_bcast(ctxt,prec%cthres) call psb_bcast(ctxt,prec%cjswp) + ! dump + call psb_bcast(ctxt,prec%dump) + call psb_bcast(ctxt,prec%dlmin) + call psb_bcast(ctxt,prec%dlmax) + + call psb_bcast(ctxt,prec%dump_ac) + call psb_bcast(ctxt,prec%dump_rp) + call psb_bcast(ctxt,prec%dump_tprol) + call psb_bcast(ctxt,prec%dump_smoother) + call psb_bcast(ctxt,prec%dump_solver) + call psb_bcast(ctxt,prec%dump_global_num) end subroutine get_parms diff --git a/samples/advanced/pdegen/amg_d_pde3d.f90 b/samples/advanced/pdegen/amg_d_pde3d.f90 index f332589f..a7965873 100644 --- a/samples/advanced/pdegen/amg_d_pde3d.f90 +++ b/samples/advanced/pdegen/amg_d_pde3d.f90 @@ -120,7 +120,7 @@ program amg_d_pde3d character(len=10) :: ptype ! preconditioner type integer(psb_ipk_) :: outer_sweeps ! number of outer sweeps: sweeps for 1-level, - ! AMG cycles for ML + ! AMG cycles for ML ! general AMG data character(len=16) :: mlcycle ! AMG cycle type integer(psb_ipk_) :: maxlevs ! maximum number of levels in AMG preconditioner @@ -175,6 +175,17 @@ program amg_d_pde3d real(psb_dpk_) :: cthres ! threshold for ILUT factorization integer(psb_ipk_) :: cjswp ! sweeps for GS or JAC coarsest-lev subsolver + ! Dump data + logical :: dump = .false. + integer(psb_ipk_) :: dlmin ! Minimum level to dump + integer(psb_ipk_) :: dlmax ! Maximum level to dump + logical :: dump_ac = .false. + logical :: dump_rp = .false. + logical :: dump_tprol = .false. + logical :: dump_smoother = .false. + logical :: dump_solver = .false. + logical :: dump_global_num = .false. + end type precdata type(precdata) :: p_choice @@ -388,7 +399,7 @@ program amg_d_pde3d call psb_amx(ctxt, thier) call psb_amx(ctxt, tprec) - + if(iam == psb_root_) then write(psb_out_unit,'(" ")') write(psb_out_unit,'("Preconditioner: ",a)') trim(p_choice%descr) @@ -396,6 +407,12 @@ program amg_d_pde3d write(psb_out_unit,'(" ")') end if + if (p_choice%dump) then + call prec%dump(info,istart=p_choice%dlmin,iend=p_choice%dlmax,& + & ac=p_choice%dump_ac,rp=p_choice%dump_rp,tprol=p_choice%dump_tprol,& + & smoother=p_choice%dump_smoother, solver=p_choice%dump_solver, & + & global_num=p_choice%dump_global_num) + end if ! ! iterative method parameters ! @@ -534,6 +551,7 @@ contains ! preconditioner type call read_data(prec%descr,inp_unit) ! verbose description of the prec call read_data(prec%ptype,inp_unit) ! preconditioner type + ! First smoother / 1-lev preconditioner call read_data(prec%smther,inp_unit) ! smoother type call read_data(prec%jsweeps,inp_unit) ! (pre-)smoother / 1-lev prec sweeps @@ -584,6 +602,17 @@ contains call read_data(prec%cfill,inp_unit) ! fill-in for incompl LU call read_data(prec%cthres,inp_unit) ! Threshold for ILUT call read_data(prec%cjswp,inp_unit) ! sweeps for GS/JAC subsolver + ! dump + call read_data(prec%dump,inp_unit) ! Dump on file? + call read_data(prec%dlmin,inp_unit) ! Minimum level to dump + call read_data(prec%dlmax,inp_unit) ! Maximum level to dump + call read_data(prec%dump_ac,inp_unit) + call read_data(prec%dump_rp,inp_unit) + call read_data(prec%dump_tprol,inp_unit) + call read_data(prec%dump_smoother,inp_unit) + call read_data(prec%dump_solver,inp_unit) + call read_data(prec%dump_global_num,inp_unit) + if (inp_unit /= psb_inp_unit) then close(inp_unit) end if @@ -652,8 +681,20 @@ contains call psb_bcast(ctxt,prec%cfill) call psb_bcast(ctxt,prec%cthres) call psb_bcast(ctxt,prec%cjswp) + ! dump + call psb_bcast(ctxt,prec%dump) + call psb_bcast(ctxt,prec%dlmin) + call psb_bcast(ctxt,prec%dlmax) + + call psb_bcast(ctxt,prec%dump_ac) + call psb_bcast(ctxt,prec%dump_rp) + call psb_bcast(ctxt,prec%dump_tprol) + call psb_bcast(ctxt,prec%dump_smoother) + call psb_bcast(ctxt,prec%dump_solver) + call psb_bcast(ctxt,prec%dump_global_num) + end subroutine get_parms end program amg_d_pde3d diff --git a/samples/advanced/pdegen/amg_s_pde2d.f90 b/samples/advanced/pdegen/amg_s_pde2d.f90 index 799c9b8f..5fbd1864 100644 --- a/samples/advanced/pdegen/amg_s_pde2d.f90 +++ b/samples/advanced/pdegen/amg_s_pde2d.f90 @@ -119,7 +119,7 @@ program amg_s_pde2d character(len=10) :: ptype ! preconditioner type integer(psb_ipk_) :: outer_sweeps ! number of outer sweeps: sweeps for 1-level, - ! AMG cycles for ML + ! AMG cycles for ML ! general AMG data character(len=16) :: mlcycle ! AMG cycle type integer(psb_ipk_) :: maxlevs ! maximum number of levels in AMG preconditioner @@ -174,6 +174,17 @@ program amg_s_pde2d real(psb_spk_) :: cthres ! threshold for ILUT factorization integer(psb_ipk_) :: cjswp ! sweeps for GS or JAC coarsest-lev subsolver + ! Dump data + logical :: dump = .false. + integer(psb_ipk_) :: dlmin ! Minimum level to dump + integer(psb_ipk_) :: dlmax ! Maximum level to dump + logical :: dump_ac = .false. + logical :: dump_rp = .false. + logical :: dump_tprol = .false. + logical :: dump_smoother = .false. + logical :: dump_solver = .false. + logical :: dump_global_num = .false. + end type precdata type(precdata) :: p_choice @@ -392,6 +403,12 @@ program amg_s_pde2d write(psb_out_unit,'(" ")') end if + if (p_choice%dump) then + call prec%dump(info,istart=p_choice%dlmin,iend=p_choice%dlmax,& + & ac=p_choice%dump_ac,rp=p_choice%dump_rp,tprol=p_choice%dump_tprol,& + & smoother=p_choice%dump_smoother, solver=p_choice%dump_solver, & + & global_num=p_choice%dump_global_num) + end if ! ! iterative method parameters ! @@ -530,6 +547,7 @@ contains ! preconditioner type call read_data(prec%descr,inp_unit) ! verbose description of the prec call read_data(prec%ptype,inp_unit) ! preconditioner type + ! First smoother / 1-lev preconditioner call read_data(prec%smther,inp_unit) ! smoother type call read_data(prec%jsweeps,inp_unit) ! (pre-)smoother / 1-lev prec sweeps @@ -580,6 +598,17 @@ contains call read_data(prec%cfill,inp_unit) ! fill-in for incompl LU call read_data(prec%cthres,inp_unit) ! Threshold for ILUT call read_data(prec%cjswp,inp_unit) ! sweeps for GS/JAC subsolver + ! dump + call read_data(prec%dump,inp_unit) ! Dump on file? + call read_data(prec%dlmin,inp_unit) ! Minimum level to dump + call read_data(prec%dlmax,inp_unit) ! Maximum level to dump + call read_data(prec%dump_ac,inp_unit) + call read_data(prec%dump_rp,inp_unit) + call read_data(prec%dump_tprol,inp_unit) + call read_data(prec%dump_smoother,inp_unit) + call read_data(prec%dump_solver,inp_unit) + call read_data(prec%dump_global_num,inp_unit) + if (inp_unit /= psb_inp_unit) then close(inp_unit) end if @@ -626,6 +655,7 @@ contains call psb_bcast(ctxt,prec%mlcycle) call psb_bcast(ctxt,prec%outer_sweeps) call psb_bcast(ctxt,prec%maxlevs) + call psb_bcast(ctxt,prec%csizepp) call psb_bcast(ctxt,prec%aggr_prol) call psb_bcast(ctxt,prec%par_aggr_alg) @@ -641,13 +671,23 @@ contains end if call psb_bcast(ctxt,prec%athres) - call psb_bcast(ctxt,prec%csizepp) call psb_bcast(ctxt,prec%cmat) call psb_bcast(ctxt,prec%csolve) call psb_bcast(ctxt,prec%csbsolve) call psb_bcast(ctxt,prec%cfill) call psb_bcast(ctxt,prec%cthres) call psb_bcast(ctxt,prec%cjswp) + ! dump + call psb_bcast(ctxt,prec%dump) + call psb_bcast(ctxt,prec%dlmin) + call psb_bcast(ctxt,prec%dlmax) + + call psb_bcast(ctxt,prec%dump_ac) + call psb_bcast(ctxt,prec%dump_rp) + call psb_bcast(ctxt,prec%dump_tprol) + call psb_bcast(ctxt,prec%dump_smoother) + call psb_bcast(ctxt,prec%dump_solver) + call psb_bcast(ctxt,prec%dump_global_num) end subroutine get_parms diff --git a/samples/advanced/pdegen/amg_s_pde3d.f90 b/samples/advanced/pdegen/amg_s_pde3d.f90 index a40011e2..949371f4 100644 --- a/samples/advanced/pdegen/amg_s_pde3d.f90 +++ b/samples/advanced/pdegen/amg_s_pde3d.f90 @@ -120,7 +120,7 @@ program amg_s_pde3d character(len=10) :: ptype ! preconditioner type integer(psb_ipk_) :: outer_sweeps ! number of outer sweeps: sweeps for 1-level, - ! AMG cycles for ML + ! AMG cycles for ML ! general AMG data character(len=16) :: mlcycle ! AMG cycle type integer(psb_ipk_) :: maxlevs ! maximum number of levels in AMG preconditioner @@ -175,6 +175,17 @@ program amg_s_pde3d real(psb_spk_) :: cthres ! threshold for ILUT factorization integer(psb_ipk_) :: cjswp ! sweeps for GS or JAC coarsest-lev subsolver + ! Dump data + logical :: dump = .false. + integer(psb_ipk_) :: dlmin ! Minimum level to dump + integer(psb_ipk_) :: dlmax ! Maximum level to dump + logical :: dump_ac = .false. + logical :: dump_rp = .false. + logical :: dump_tprol = .false. + logical :: dump_smoother = .false. + logical :: dump_solver = .false. + logical :: dump_global_num = .false. + end type precdata type(precdata) :: p_choice @@ -388,7 +399,7 @@ program amg_s_pde3d call psb_amx(ctxt, thier) call psb_amx(ctxt, tprec) - + if(iam == psb_root_) then write(psb_out_unit,'(" ")') write(psb_out_unit,'("Preconditioner: ",a)') trim(p_choice%descr) @@ -396,6 +407,12 @@ program amg_s_pde3d write(psb_out_unit,'(" ")') end if + if (p_choice%dump) then + call prec%dump(info,istart=p_choice%dlmin,iend=p_choice%dlmax,& + & ac=p_choice%dump_ac,rp=p_choice%dump_rp,tprol=p_choice%dump_tprol,& + & smoother=p_choice%dump_smoother, solver=p_choice%dump_solver, & + & global_num=p_choice%dump_global_num) + end if ! ! iterative method parameters ! @@ -534,6 +551,7 @@ contains ! preconditioner type call read_data(prec%descr,inp_unit) ! verbose description of the prec call read_data(prec%ptype,inp_unit) ! preconditioner type + ! First smoother / 1-lev preconditioner call read_data(prec%smther,inp_unit) ! smoother type call read_data(prec%jsweeps,inp_unit) ! (pre-)smoother / 1-lev prec sweeps @@ -584,6 +602,17 @@ contains call read_data(prec%cfill,inp_unit) ! fill-in for incompl LU call read_data(prec%cthres,inp_unit) ! Threshold for ILUT call read_data(prec%cjswp,inp_unit) ! sweeps for GS/JAC subsolver + ! dump + call read_data(prec%dump,inp_unit) ! Dump on file? + call read_data(prec%dlmin,inp_unit) ! Minimum level to dump + call read_data(prec%dlmax,inp_unit) ! Maximum level to dump + call read_data(prec%dump_ac,inp_unit) + call read_data(prec%dump_rp,inp_unit) + call read_data(prec%dump_tprol,inp_unit) + call read_data(prec%dump_smoother,inp_unit) + call read_data(prec%dump_solver,inp_unit) + call read_data(prec%dump_global_num,inp_unit) + if (inp_unit /= psb_inp_unit) then close(inp_unit) end if @@ -652,8 +681,20 @@ contains call psb_bcast(ctxt,prec%cfill) call psb_bcast(ctxt,prec%cthres) call psb_bcast(ctxt,prec%cjswp) + ! dump + call psb_bcast(ctxt,prec%dump) + call psb_bcast(ctxt,prec%dlmin) + call psb_bcast(ctxt,prec%dlmax) + + call psb_bcast(ctxt,prec%dump_ac) + call psb_bcast(ctxt,prec%dump_rp) + call psb_bcast(ctxt,prec%dump_tprol) + call psb_bcast(ctxt,prec%dump_smoother) + call psb_bcast(ctxt,prec%dump_solver) + call psb_bcast(ctxt,prec%dump_global_num) + end subroutine get_parms end program amg_s_pde3d diff --git a/samples/advanced/pdegen/runs/amg_pde2d.inp b/samples/advanced/pdegen/runs/amg_pde2d.inp index d3ef6b1d..8e538001 100644 --- a/samples/advanced/pdegen/runs/amg_pde2d.inp +++ b/samples/advanced/pdegen/runs/amg_pde2d.inp @@ -55,3 +55,13 @@ DIST ! Coarsest-level matrix distribution: DIST REPL 1 ! Coarsest-level fillin P for ILU(P) and ILU(T,P) 1.d-4 ! Coarsest-level threshold T for ILU(T,P) 1 ! Number of sweeps for JACOBI/GS/BJAC coarsest-level solver +%%%%%%%%%%% Dump parms %%%%%%%%%%%%%%%%%%%%%%%%%% +F ! Dump preconditioner on file +1 ! Min level +20 ! Max level +T ! Dump AC +T ! Dump RP +F ! Dump TPROL +F ! Dump SMOOTHER +F ! Dump SOLVER +F ! Global numering ? diff --git a/samples/advanced/pdegen/runs/amg_pde3d.inp b/samples/advanced/pdegen/runs/amg_pde3d.inp index 0a600df4..f9ff0d5d 100644 --- a/samples/advanced/pdegen/runs/amg_pde3d.inp +++ b/samples/advanced/pdegen/runs/amg_pde3d.inp @@ -41,7 +41,7 @@ VCYCLE ! Type of multilevel CYCLE: VCYCLE WCYCLE KCYCLE MUL SMOOTHED ! Type of aggregation: SMOOTHED UNSMOOTHED COUPLED ! Parallel aggregation: DEC, SYMDEC, COUPLED MATCHBOXP ! aggregation measure SOC1, MATCHBOXP -4 ! Requested size of the aggregates for MATCHBOXP +8 ! Requested size of the aggregates for MATCHBOXP NATURAL ! Ordering of aggregation NATURAL DEGREE NOFILTER ! Filtering of matrix: FILTER NOFILTER -1.5 ! Coarsening ratio, if < 0 use library default @@ -55,3 +55,13 @@ DIST ! Coarsest-level matrix distribution: DIST REPL 1 ! Coarsest-level fillin P for ILU(P) and ILU(T,P) 1.d-4 ! Coarsest-level threshold T for ILU(T,P) 1 ! Number of sweeps for JACOBI/GS/BJAC coarsest-level solver +%%%%%%%%%%% Dump parms %%%%%%%%%%%%%%%%%%%%%%%%%% +F ! Dump preconditioner on file +1 ! Min level +20 ! Max level +T ! Dump AC +T ! Dump RP +F ! Dump TPROL +F ! Dump SMOOTHER +F ! Dump SOLVER +F ! Global numering ? From 939d7c9a89f4ef5ba4f52ace9fd401609c46889a Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Sat, 16 Oct 2021 08:37:25 +0200 Subject: [PATCH 20/36] Do not invoke default() after setting KRM for coarse solver. --- amgprec/impl/amg_ccprecset.F90 | 1 - amgprec/impl/amg_dcprecset.F90 | 1 - amgprec/impl/amg_scprecset.F90 | 1 - amgprec/impl/amg_zcprecset.F90 | 1 - 4 files changed, 4 deletions(-) diff --git a/amgprec/impl/amg_ccprecset.F90 b/amgprec/impl/amg_ccprecset.F90 index 3fb97bf3..32f58ce6 100644 --- a/amgprec/impl/amg_ccprecset.F90 +++ b/amgprec/impl/amg_ccprecset.F90 @@ -571,7 +571,6 @@ subroutine amg_ccprecsetc(p,what,string,info,ilev,ilmax,pos,idx) type(amg_c_krm_solver_type) :: krm_slv call p%precv(nlev_)%set('SMOOTHER_TYPE',amg_krm_,info,pos=pos) call p%precv(nlev_)%set(krm_slv,info) - call p%precv(nlev_)%default() call p%precv(nlev_)%set('COARSE_MAT',amg_distr_mat_,info,pos=pos) end block end select diff --git a/amgprec/impl/amg_dcprecset.F90 b/amgprec/impl/amg_dcprecset.F90 index 4fe1dc0b..08da6c78 100644 --- a/amgprec/impl/amg_dcprecset.F90 +++ b/amgprec/impl/amg_dcprecset.F90 @@ -599,7 +599,6 @@ subroutine amg_dcprecsetc(p,what,string,info,ilev,ilmax,pos,idx) type(amg_d_krm_solver_type) :: krm_slv call p%precv(nlev_)%set('SMOOTHER_TYPE',amg_krm_,info,pos=pos) call p%precv(nlev_)%set(krm_slv,info) - call p%precv(nlev_)%default() call p%precv(nlev_)%set('COARSE_MAT',amg_distr_mat_,info,pos=pos) end block end select diff --git a/amgprec/impl/amg_scprecset.F90 b/amgprec/impl/amg_scprecset.F90 index e82df5ba..4603c4e3 100644 --- a/amgprec/impl/amg_scprecset.F90 +++ b/amgprec/impl/amg_scprecset.F90 @@ -571,7 +571,6 @@ subroutine amg_scprecsetc(p,what,string,info,ilev,ilmax,pos,idx) type(amg_s_krm_solver_type) :: krm_slv call p%precv(nlev_)%set('SMOOTHER_TYPE',amg_krm_,info,pos=pos) call p%precv(nlev_)%set(krm_slv,info) - call p%precv(nlev_)%default() call p%precv(nlev_)%set('COARSE_MAT',amg_distr_mat_,info,pos=pos) end block end select diff --git a/amgprec/impl/amg_zcprecset.F90 b/amgprec/impl/amg_zcprecset.F90 index 4e27ac15..88a9f1a2 100644 --- a/amgprec/impl/amg_zcprecset.F90 +++ b/amgprec/impl/amg_zcprecset.F90 @@ -599,7 +599,6 @@ subroutine amg_zcprecsetc(p,what,string,info,ilev,ilmax,pos,idx) type(amg_z_krm_solver_type) :: krm_slv call p%precv(nlev_)%set('SMOOTHER_TYPE',amg_krm_,info,pos=pos) call p%precv(nlev_)%set(krm_slv,info) - call p%precv(nlev_)%default() call p%precv(nlev_)%set('COARSE_MAT',amg_distr_mat_,info,pos=pos) end block end select From 818f7a78a0140d9c4383b527bae860c7352df149 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Mon, 18 Oct 2021 14:47:28 +0200 Subject: [PATCH 21/36] Do not call %default on setting coarse_solve --- amgprec/impl/amg_ccprecset.F90 | 1 - amgprec/impl/amg_dcprecset.F90 | 1 - amgprec/impl/amg_scprecset.F90 | 1 - amgprec/impl/amg_zcprecset.F90 | 1 - 4 files changed, 4 deletions(-) diff --git a/amgprec/impl/amg_ccprecset.F90 b/amgprec/impl/amg_ccprecset.F90 index 32f58ce6..5a917d10 100644 --- a/amgprec/impl/amg_ccprecset.F90 +++ b/amgprec/impl/amg_ccprecset.F90 @@ -728,7 +728,6 @@ subroutine amg_ccprecsetc(p,what,string,info,ilev,ilmax,pos,idx) type(amg_c_krm_solver_type) :: krm_slv call p%precv(nlev_)%set('SMOOTHER_TYPE',amg_krm_,info,pos=pos) call p%precv(nlev_)%set(krm_slv,info) - call p%precv(nlev_)%default() call p%precv(nlev_)%set('COARSE_MAT',amg_distr_mat_,info,pos=pos) end block end select diff --git a/amgprec/impl/amg_dcprecset.F90 b/amgprec/impl/amg_dcprecset.F90 index 08da6c78..ad02a364 100644 --- a/amgprec/impl/amg_dcprecset.F90 +++ b/amgprec/impl/amg_dcprecset.F90 @@ -772,7 +772,6 @@ subroutine amg_dcprecsetc(p,what,string,info,ilev,ilmax,pos,idx) type(amg_d_krm_solver_type) :: krm_slv call p%precv(nlev_)%set('SMOOTHER_TYPE',amg_krm_,info,pos=pos) call p%precv(nlev_)%set(krm_slv,info) - call p%precv(nlev_)%default() call p%precv(nlev_)%set('COARSE_MAT',amg_distr_mat_,info,pos=pos) end block end select diff --git a/amgprec/impl/amg_scprecset.F90 b/amgprec/impl/amg_scprecset.F90 index 4603c4e3..43aa85db 100644 --- a/amgprec/impl/amg_scprecset.F90 +++ b/amgprec/impl/amg_scprecset.F90 @@ -728,7 +728,6 @@ subroutine amg_scprecsetc(p,what,string,info,ilev,ilmax,pos,idx) type(amg_s_krm_solver_type) :: krm_slv call p%precv(nlev_)%set('SMOOTHER_TYPE',amg_krm_,info,pos=pos) call p%precv(nlev_)%set(krm_slv,info) - call p%precv(nlev_)%default() call p%precv(nlev_)%set('COARSE_MAT',amg_distr_mat_,info,pos=pos) end block end select diff --git a/amgprec/impl/amg_zcprecset.F90 b/amgprec/impl/amg_zcprecset.F90 index 88a9f1a2..ab6fde91 100644 --- a/amgprec/impl/amg_zcprecset.F90 +++ b/amgprec/impl/amg_zcprecset.F90 @@ -772,7 +772,6 @@ subroutine amg_zcprecsetc(p,what,string,info,ilev,ilmax,pos,idx) type(amg_z_krm_solver_type) :: krm_slv call p%precv(nlev_)%set('SMOOTHER_TYPE',amg_krm_,info,pos=pos) call p%precv(nlev_)%set(krm_slv,info) - call p%precv(nlev_)%default() call p%precv(nlev_)%set('COARSE_MAT',amg_distr_mat_,info,pos=pos) end block end select From 794080e386bc2d0fd42683736d912f4fd3eb208b Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Fri, 22 Oct 2021 08:14:26 -0400 Subject: [PATCH 22/36] Fix target coarse size handling. --- .../amg_d_parmatch_aggregator_tprol.F90 | 26 +++++++++---------- .../amg_s_parmatch_aggregator_tprol.F90 | 26 +++++++++---------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 b/amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 index 5ae47718..1356845b 100644 --- a/amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 +++ b/amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 @@ -68,7 +68,7 @@ subroutine amg_d_parmatch_aggregator_build_tprol(ag,parms,ag_data,& real(psb_dpk_), allocatable :: tmpw(:), tmpwnxt(:) integer(psb_lpk_), allocatable :: ixaggr(:), nxaggr(:), tlaggr(:), ivr(:) type(psb_dspmat_type) :: a_tmp - integer(c_int) :: match_algorithm, n_sweeps, max_csize, max_nlevels + integer(c_int) :: match_algorithm, n_sweeps, target_csize, max_nlevels character(len=40) :: name, ch_err character(len=80) :: fname, prefix_ type(psb_ctxt_type) :: ictxt @@ -128,10 +128,10 @@ subroutine amg_d_parmatch_aggregator_build_tprol(ag,parms,ag_data,& write(debug_unit, *) 'Warning: AGGR_SIZE reset to value ',2**n_sweeps end if end if - if (ag%max_csize > 0) then - max_csize = ag%max_csize + if (ag_data%target_coarse_size > 0) then + target_csize = ag_data%target_coarse_size else - max_csize = ag_data%min_coarse_size + target_csize = ag_data%min_coarse_size end if if (ag%max_nlevels > 0) then max_nlevels = ag%max_nlevels @@ -141,14 +141,14 @@ subroutine amg_d_parmatch_aggregator_build_tprol(ag,parms,ag_data,& if (.true.) then block integer(psb_ipk_) :: ipv(2) - ipv(1) = max_csize + ipv(1) = target_csize ipv(2) = n_sweeps call psb_bcast(ictxt,ipv) - max_csize = ipv(1) + target_csize = ipv(1) n_sweeps = ipv(2) end block else - call psb_bcast(ictxt,max_csize) + call psb_bcast(ictxt,target_csize) call psb_bcast(ictxt,n_sweeps) end if if (n_sweeps /= ag%n_sweeps) then @@ -156,7 +156,7 @@ subroutine amg_d_parmatch_aggregator_build_tprol(ag,parms,ag_data,& end if !!$ if (me==0) write(0,*) 'Matching sweeps: ',n_sweeps n_sweeps = max(1,n_sweeps) - if (debug) write(0,*) me,' Copies, with n_sweeps: ',n_sweeps,max_csize + if (debug) write(0,*) me,' Copies, with n_sweeps: ',n_sweeps,target_csize if (ag%unsmoothed_hierarchy.and.allocated(ag%base_a)) then call ag%base_a%cp_to(acsr) if (ag%do_clean_zeros) call acsr%clean_zeros(info) @@ -242,7 +242,7 @@ subroutine amg_d_parmatch_aggregator_build_tprol(ag,parms,ag_data,& if (debug) then call psb_barrier(ictxt) - if (me == 0) write(0,*) 'N_sweeps ',n_sweeps,nr,desc_acv(0)%is_ok(),max_csize + if (me == 0) write(0,*) 'N_sweeps ',n_sweeps,nr,desc_acv(0)%is_ok(),target_csize end if ! @@ -300,11 +300,11 @@ subroutine amg_d_parmatch_aggregator_build_tprol(ag,parms,ag_data,& if (debug) then call psb_barrier(ictxt) - if (me==0) write(0,*) me,trim(name),' Done mat_asb:',i,sum(nxaggr),max_csize,info + if (me==0) write(0,*) me,trim(name),' Done mat_asb:',i,sum(nxaggr),target_csize,info csz = sum(nxaggr) call psb_bcast(ictxt,csz) if (csz /= sum(nxaggr)) write(0,*) me,trim(name),' Mismatch matasb',& - & csz,sum(nxaggr),max_csize + & csz,sum(nxaggr),target_csize end if if (psb_errstatus_fatal()) write(0,*)me,trim(name),'Error fatal on entry to tmpwnxt 2' @@ -342,10 +342,10 @@ subroutine amg_d_parmatch_aggregator_build_tprol(ag,parms,ag_data,& call move_alloc(tmpwnxt,tmpw) if (debug) then if (csz /= sum(nlaggr)) write(0,*) me,trim(name),' Mismatch 2 matasb',& - & csz,sum(nlaggr),max_csize, info + & csz,sum(nlaggr),target_csize, info end if call acv(i-1)%free() - if ((sum(nlaggr) <= max_csize).or.(any(nlaggr==0))) then + if ((sum(nlaggr) <= target_csize).or.(any(nlaggr==0))) then x_sweeps = i exit sweeps_loop end if diff --git a/amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 b/amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 index 28b63272..734f68da 100644 --- a/amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 +++ b/amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 @@ -68,7 +68,7 @@ subroutine amg_s_parmatch_aggregator_build_tprol(ag,parms,ag_data,& real(psb_spk_), allocatable :: tmpw(:), tmpwnxt(:) integer(psb_lpk_), allocatable :: ixaggr(:), nxaggr(:), tlaggr(:), ivr(:) type(psb_sspmat_type) :: a_tmp - integer(c_int) :: match_algorithm, n_sweeps, max_csize, max_nlevels + integer(c_int) :: match_algorithm, n_sweeps, target_csize, max_nlevels character(len=40) :: name, ch_err character(len=80) :: fname, prefix_ type(psb_ctxt_type) :: ictxt @@ -128,10 +128,10 @@ subroutine amg_s_parmatch_aggregator_build_tprol(ag,parms,ag_data,& write(debug_unit, *) 'Warning: AGGR_SIZE reset to value ',2**n_sweeps end if end if - if (ag%max_csize > 0) then - max_csize = ag%max_csize + if (ag_data%target_coarse_size > 0) then + target_csize = ag_data%target_coarse_size else - max_csize = ag_data%min_coarse_size + target_csize = ag_data%min_coarse_size end if if (ag%max_nlevels > 0) then max_nlevels = ag%max_nlevels @@ -141,14 +141,14 @@ subroutine amg_s_parmatch_aggregator_build_tprol(ag,parms,ag_data,& if (.true.) then block integer(psb_ipk_) :: ipv(2) - ipv(1) = max_csize + ipv(1) = target_csize ipv(2) = n_sweeps call psb_bcast(ictxt,ipv) - max_csize = ipv(1) + target_csize = ipv(1) n_sweeps = ipv(2) end block else - call psb_bcast(ictxt,max_csize) + call psb_bcast(ictxt,target_csize) call psb_bcast(ictxt,n_sweeps) end if if (n_sweeps /= ag%n_sweeps) then @@ -156,7 +156,7 @@ subroutine amg_s_parmatch_aggregator_build_tprol(ag,parms,ag_data,& end if !!$ if (me==0) write(0,*) 'Matching sweeps: ',n_sweeps n_sweeps = max(1,n_sweeps) - if (debug) write(0,*) me,' Copies, with n_sweeps: ',n_sweeps,max_csize + if (debug) write(0,*) me,' Copies, with n_sweeps: ',n_sweeps,target_csize if (ag%unsmoothed_hierarchy.and.allocated(ag%base_a)) then call ag%base_a%cp_to(acsr) if (ag%do_clean_zeros) call acsr%clean_zeros(info) @@ -242,7 +242,7 @@ subroutine amg_s_parmatch_aggregator_build_tprol(ag,parms,ag_data,& if (debug) then call psb_barrier(ictxt) - if (me == 0) write(0,*) 'N_sweeps ',n_sweeps,nr,desc_acv(0)%is_ok(),max_csize + if (me == 0) write(0,*) 'N_sweeps ',n_sweeps,nr,desc_acv(0)%is_ok(),target_csize end if ! @@ -300,11 +300,11 @@ subroutine amg_s_parmatch_aggregator_build_tprol(ag,parms,ag_data,& if (debug) then call psb_barrier(ictxt) - if (me==0) write(0,*) me,trim(name),' Done mat_asb:',i,sum(nxaggr),max_csize,info + if (me==0) write(0,*) me,trim(name),' Done mat_asb:',i,sum(nxaggr),target_csize,info csz = sum(nxaggr) call psb_bcast(ictxt,csz) if (csz /= sum(nxaggr)) write(0,*) me,trim(name),' Mismatch matasb',& - & csz,sum(nxaggr),max_csize + & csz,sum(nxaggr),target_csize end if if (psb_errstatus_fatal()) write(0,*)me,trim(name),'Error fatal on entry to tmpwnxt 2' @@ -342,10 +342,10 @@ subroutine amg_s_parmatch_aggregator_build_tprol(ag,parms,ag_data,& call move_alloc(tmpwnxt,tmpw) if (debug) then if (csz /= sum(nlaggr)) write(0,*) me,trim(name),' Mismatch 2 matasb',& - & csz,sum(nlaggr),max_csize, info + & csz,sum(nlaggr),target_csize, info end if call acv(i-1)%free() - if ((sum(nlaggr) <= max_csize).or.(any(nlaggr==0))) then + if ((sum(nlaggr) <= target_csize).or.(any(nlaggr==0))) then x_sweeps = i exit sweeps_loop end if From a8f4009cb12e804b1552158c2173e08c6899c737 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Fri, 22 Oct 2021 09:39:18 -0400 Subject: [PATCH 23/36] Take out spurious csize and maxnlev from parmatch aggregator object. --- amgprec/amg_d_parmatch_aggregator_mod.F90 | 18 ++++++------------ amgprec/amg_s_parmatch_aggregator_mod.F90 | 18 ++++++------------ .../amg_d_parmatch_aggregator_tprol.F90 | 8 ++------ .../amg_s_parmatch_aggregator_tprol.F90 | 8 ++------ 4 files changed, 16 insertions(+), 36 deletions(-) diff --git a/amgprec/amg_d_parmatch_aggregator_mod.F90 b/amgprec/amg_d_parmatch_aggregator_mod.F90 index cfe5e874..d50280d3 100644 --- a/amgprec/amg_d_parmatch_aggregator_mod.F90 +++ b/amgprec/amg_d_parmatch_aggregator_mod.F90 @@ -132,8 +132,6 @@ module amg_d_parmatch_aggregator_mod type(psb_dspmat_type), allocatable :: prol, restr type(psb_dspmat_type), allocatable :: ac, base_a, rwa type(psb_desc_type), allocatable :: desc_ac, desc_ax, base_desc, rwdesc - integer(psb_ipk_) :: max_csize - integer(psb_ipk_) :: max_nlevels logical :: reproducible_matching = .false. logical :: need_symmetrize = .false. logical :: unsmoothed_hierarchy = .true. @@ -452,10 +450,10 @@ contains & agnext%matching_alg = ag%matching_alg if (.not.is_legal_nsweeps(agnext%n_sweeps))& & agnext%n_sweeps = ag%n_sweeps - if (.not.is_legal_csize(agnext%max_csize))& - & agnext%max_csize = ag%max_csize - if (.not.is_legal_nlevels(agnext%max_nlevels))& - & agnext%max_nlevels = ag%max_nlevels +!!$ if (.not.is_legal_csize(agnext%max_csize))& +!!$ & agnext%max_csize = ag%max_csize +!!$ if (.not.is_legal_nlevels(agnext%max_nlevels))& +!!$ & agnext%max_nlevels = ag%max_nlevels ! Is this going to generate shallow copies/memory leaks/double frees? ! To be investigated further. call psb_safe_ab_cpy(ag%w_nxt,agnext%w,info) @@ -540,10 +538,6 @@ contains case('AGGR_SIZE') ag%orig_aggr_size = val ag%n_sweeps=max(1,ceiling(log(val*1.0)/log(2.0))) - case('PRMC_MAX_CSIZE') - ag%max_csize=val - case('PRMC_MAX_NLEVELS') - ag%max_nlevels=val case('PRMC_W_SIZE') call ag%bld_default_w(val) case('PRMC_REPRODUCIBLE_MATCHING') @@ -569,8 +563,8 @@ contains ag%matching_alg = 0 ag%n_sweeps = 1 ag%jacobi_sweeps = 0 - ag%max_nlevels = 36 - ag%max_csize = -1 +!!$ ag%max_nlevels = 36 +!!$ ag%max_csize = -1 ! ! Apparently BootCMatch works better ! by keeping all entries diff --git a/amgprec/amg_s_parmatch_aggregator_mod.F90 b/amgprec/amg_s_parmatch_aggregator_mod.F90 index 90c76bd9..d5b3b04f 100644 --- a/amgprec/amg_s_parmatch_aggregator_mod.F90 +++ b/amgprec/amg_s_parmatch_aggregator_mod.F90 @@ -132,8 +132,6 @@ module amg_s_parmatch_aggregator_mod type(psb_sspmat_type), allocatable :: prol, restr type(psb_sspmat_type), allocatable :: ac, base_a, rwa type(psb_desc_type), allocatable :: desc_ac, desc_ax, base_desc, rwdesc - integer(psb_ipk_) :: max_csize - integer(psb_ipk_) :: max_nlevels logical :: reproducible_matching = .false. logical :: need_symmetrize = .false. logical :: unsmoothed_hierarchy = .true. @@ -452,10 +450,10 @@ contains & agnext%matching_alg = ag%matching_alg if (.not.is_legal_nsweeps(agnext%n_sweeps))& & agnext%n_sweeps = ag%n_sweeps - if (.not.is_legal_csize(agnext%max_csize))& - & agnext%max_csize = ag%max_csize - if (.not.is_legal_nlevels(agnext%max_nlevels))& - & agnext%max_nlevels = ag%max_nlevels +!!$ if (.not.is_legal_csize(agnext%max_csize))& +!!$ & agnext%max_csize = ag%max_csize +!!$ if (.not.is_legal_nlevels(agnext%max_nlevels))& +!!$ & agnext%max_nlevels = ag%max_nlevels ! Is this going to generate shallow copies/memory leaks/double frees? ! To be investigated further. call psb_safe_ab_cpy(ag%w_nxt,agnext%w,info) @@ -540,10 +538,6 @@ contains case('AGGR_SIZE') ag%orig_aggr_size = val ag%n_sweeps=max(1,ceiling(log(val*1.0)/log(2.0))) - case('PRMC_MAX_CSIZE') - ag%max_csize=val - case('PRMC_MAX_NLEVELS') - ag%max_nlevels=val case('PRMC_W_SIZE') call ag%bld_default_w(val) case('PRMC_REPRODUCIBLE_MATCHING') @@ -569,8 +563,8 @@ contains ag%matching_alg = 0 ag%n_sweeps = 1 ag%jacobi_sweeps = 0 - ag%max_nlevels = 36 - ag%max_csize = -1 +!!$ ag%max_nlevels = 36 +!!$ ag%max_csize = -1 ! ! Apparently BootCMatch works better ! by keeping all entries diff --git a/amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 b/amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 index 1356845b..f23869b7 100644 --- a/amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 +++ b/amgprec/impl/aggregator/amg_d_parmatch_aggregator_tprol.F90 @@ -68,7 +68,8 @@ subroutine amg_d_parmatch_aggregator_build_tprol(ag,parms,ag_data,& real(psb_dpk_), allocatable :: tmpw(:), tmpwnxt(:) integer(psb_lpk_), allocatable :: ixaggr(:), nxaggr(:), tlaggr(:), ivr(:) type(psb_dspmat_type) :: a_tmp - integer(c_int) :: match_algorithm, n_sweeps, target_csize, max_nlevels + integer(psb_ipk_) :: match_algorithm, n_sweeps + integer(psb_lpk_) :: target_csize character(len=40) :: name, ch_err character(len=80) :: fname, prefix_ type(psb_ctxt_type) :: ictxt @@ -133,11 +134,6 @@ subroutine amg_d_parmatch_aggregator_build_tprol(ag,parms,ag_data,& else target_csize = ag_data%min_coarse_size end if - if (ag%max_nlevels > 0) then - max_nlevels = ag%max_nlevels - else - max_nlevels = ag_data%max_levs - end if if (.true.) then block integer(psb_ipk_) :: ipv(2) diff --git a/amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 b/amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 index 734f68da..b68531d3 100644 --- a/amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 +++ b/amgprec/impl/aggregator/amg_s_parmatch_aggregator_tprol.F90 @@ -68,7 +68,8 @@ subroutine amg_s_parmatch_aggregator_build_tprol(ag,parms,ag_data,& real(psb_spk_), allocatable :: tmpw(:), tmpwnxt(:) integer(psb_lpk_), allocatable :: ixaggr(:), nxaggr(:), tlaggr(:), ivr(:) type(psb_sspmat_type) :: a_tmp - integer(c_int) :: match_algorithm, n_sweeps, target_csize, max_nlevels + integer(psb_ipk_) :: match_algorithm, n_sweeps + integer(psb_lpk_) :: target_csize character(len=40) :: name, ch_err character(len=80) :: fname, prefix_ type(psb_ctxt_type) :: ictxt @@ -133,11 +134,6 @@ subroutine amg_s_parmatch_aggregator_build_tprol(ag,parms,ag_data,& else target_csize = ag_data%min_coarse_size end if - if (ag%max_nlevels > 0) then - max_nlevels = ag%max_nlevels - else - max_nlevels = ag_data%max_levs - end if if (.true.) then block integer(psb_ipk_) :: ipv(2) From a9182021bb96702a68be83b893d728098ec00093 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Mon, 25 Oct 2021 14:13:25 +0200 Subject: [PATCH 24/36] Sample programs adapted for position of ATHRES in control files. --- samples/advanced/fileread/amg_cf_sample.f90 | 2 +- samples/advanced/fileread/amg_df_sample.f90 | 2 +- samples/advanced/fileread/amg_sf_sample.f90 | 2 +- samples/advanced/fileread/amg_zf_sample.f90 | 2 +- samples/advanced/fileread/runs/amg_cfs.inp | 2 +- samples/advanced/fileread/runs/amg_dfs.inp | 8 ++++---- samples/advanced/fileread/runs/amg_sfs.inp | 8 ++++---- samples/advanced/fileread/runs/amg_zfs.inp | 2 +- samples/advanced/pdegen/amg_d_pde2d.f90 | 2 +- samples/advanced/pdegen/amg_d_pde3d.f90 | 2 +- samples/advanced/pdegen/amg_s_pde2d.f90 | 2 +- samples/advanced/pdegen/amg_s_pde3d.f90 | 2 +- samples/advanced/pdegen/runs/amg_pde2d.inp | 4 ++-- samples/advanced/pdegen/runs/amg_pde3d.inp | 4 ++-- 14 files changed, 22 insertions(+), 22 deletions(-) diff --git a/samples/advanced/fileread/amg_cf_sample.f90 b/samples/advanced/fileread/amg_cf_sample.f90 index c881fb40..0077a4af 100644 --- a/samples/advanced/fileread/amg_cf_sample.f90 +++ b/samples/advanced/fileread/amg_cf_sample.f90 @@ -678,6 +678,7 @@ contains call read_data(prec%aggr_ord,inp_unit) ! ordering for aggregation call read_data(prec%aggr_filter,inp_unit) ! filtering call read_data(prec%mncrratio,inp_unit) ! minimum aggregation ratio + call read_data(prec%athres,inp_unit) ! smoothed aggr thresh call read_data(prec%thrvsz,inp_unit) ! size of aggr thresh vector if (prec%thrvsz > 0) then call psb_realloc(prec%thrvsz,prec%athresv,info) @@ -685,7 +686,6 @@ contains else read(inp_unit,*) ! dummy read to skip a record end if - call read_data(prec%athres,inp_unit) ! smoothed aggr thresh ! coasest-level solver call read_data(prec%csolve,inp_unit) ! coarsest-lev solver call read_data(prec%csbsolve,inp_unit) ! coarsest-lev subsolver diff --git a/samples/advanced/fileread/amg_df_sample.f90 b/samples/advanced/fileread/amg_df_sample.f90 index a43a654e..eb4d9e46 100644 --- a/samples/advanced/fileread/amg_df_sample.f90 +++ b/samples/advanced/fileread/amg_df_sample.f90 @@ -678,6 +678,7 @@ contains call read_data(prec%aggr_ord,inp_unit) ! ordering for aggregation call read_data(prec%aggr_filter,inp_unit) ! filtering call read_data(prec%mncrratio,inp_unit) ! minimum aggregation ratio + call read_data(prec%athres,inp_unit) ! smoothed aggr thresh call read_data(prec%thrvsz,inp_unit) ! size of aggr thresh vector if (prec%thrvsz > 0) then call psb_realloc(prec%thrvsz,prec%athresv,info) @@ -685,7 +686,6 @@ contains else read(inp_unit,*) ! dummy read to skip a record end if - call read_data(prec%athres,inp_unit) ! smoothed aggr thresh ! coasest-level solver call read_data(prec%csolve,inp_unit) ! coarsest-lev solver call read_data(prec%csbsolve,inp_unit) ! coarsest-lev subsolver diff --git a/samples/advanced/fileread/amg_sf_sample.f90 b/samples/advanced/fileread/amg_sf_sample.f90 index 650ca0ea..e0a1c3c3 100644 --- a/samples/advanced/fileread/amg_sf_sample.f90 +++ b/samples/advanced/fileread/amg_sf_sample.f90 @@ -678,6 +678,7 @@ contains call read_data(prec%aggr_ord,inp_unit) ! ordering for aggregation call read_data(prec%aggr_filter,inp_unit) ! filtering call read_data(prec%mncrratio,inp_unit) ! minimum aggregation ratio + call read_data(prec%athres,inp_unit) ! smoothed aggr thresh call read_data(prec%thrvsz,inp_unit) ! size of aggr thresh vector if (prec%thrvsz > 0) then call psb_realloc(prec%thrvsz,prec%athresv,info) @@ -685,7 +686,6 @@ contains else read(inp_unit,*) ! dummy read to skip a record end if - call read_data(prec%athres,inp_unit) ! smoothed aggr thresh ! coasest-level solver call read_data(prec%csolve,inp_unit) ! coarsest-lev solver call read_data(prec%csbsolve,inp_unit) ! coarsest-lev subsolver diff --git a/samples/advanced/fileread/amg_zf_sample.f90 b/samples/advanced/fileread/amg_zf_sample.f90 index 7ea18464..28703f25 100644 --- a/samples/advanced/fileread/amg_zf_sample.f90 +++ b/samples/advanced/fileread/amg_zf_sample.f90 @@ -678,6 +678,7 @@ contains call read_data(prec%aggr_ord,inp_unit) ! ordering for aggregation call read_data(prec%aggr_filter,inp_unit) ! filtering call read_data(prec%mncrratio,inp_unit) ! minimum aggregation ratio + call read_data(prec%athres,inp_unit) ! smoothed aggr thresh call read_data(prec%thrvsz,inp_unit) ! size of aggr thresh vector if (prec%thrvsz > 0) then call psb_realloc(prec%thrvsz,prec%athresv,info) @@ -685,7 +686,6 @@ contains else read(inp_unit,*) ! dummy read to skip a record end if - call read_data(prec%athres,inp_unit) ! smoothed aggr thresh ! coasest-level solver call read_data(prec%csolve,inp_unit) ! coarsest-lev solver call read_data(prec%csbsolve,inp_unit) ! coarsest-lev subsolver diff --git a/samples/advanced/fileread/runs/amg_cfs.inp b/samples/advanced/fileread/runs/amg_cfs.inp index 195be4a4..b41704a0 100644 --- a/samples/advanced/fileread/runs/amg_cfs.inp +++ b/samples/advanced/fileread/runs/amg_cfs.inp @@ -43,9 +43,9 @@ DEC ! Parallel aggregation: DEC, SYMDEC NATURAL ! Ordering of aggregation NATURAL DEGREE FILTER ! Filtering of matrix: FILTER NOFILTER -1.5 ! Coarsening ratio, if < 0 use library default +-0.0100d0 ! Smoothed aggregation threshold, ignored if < 0 -2 ! Number of thresholds in vector, next line ignored if <= 0 0.05 0.025 ! Thresholds --0.0100d0 ! Smoothed aggregation threshold, ignored if < 0 %%%%%%%%%%% Coarse level solver %%%%%%%%%%%%%%%% SLU ! Coarsest-level solver: MUMPS UMF SLU SLUDIST JACOBI GS BJAC SLU ! Coarsest-level subsolver for BJAC: ILU ILUT MILU UMF MUMPS SLU diff --git a/samples/advanced/fileread/runs/amg_dfs.inp b/samples/advanced/fileread/runs/amg_dfs.inp index 221dfecd..68210fa4 100644 --- a/samples/advanced/fileread/runs/amg_dfs.inp +++ b/samples/advanced/fileread/runs/amg_dfs.inp @@ -1,8 +1,8 @@ %%%%%%%%%%% General arguments % Lines starting with % are ignored. -mld_mat.mtx ! Other matrices from: http://math.nist.gov/MatrixMarket/ or -mld_rhs.mtx ! rhs ! http://www.cise.ufl.edu/research/sparse/matrices/index.html +amg_mat.mtx ! Other matrices from: http://math.nist.gov/MatrixMarket/ or +amg_rhs.mtx ! rhs ! http://www.cise.ufl.edu/research/sparse/matrices/index.html NONE ! Initial guess -mld_sol.mtx ! Reference solution +amg_sol.mtx ! Reference solution MM ! File format: MatrixMarket or Harwell-Boeing CSR ! Storage format: CSR COO JAD GRAPH ! PART (partition method): BLOCK GRAPH @@ -43,9 +43,9 @@ DEC ! Parallel aggregation: DEC, SYMDEC NATURAL ! Ordering of aggregation NATURAL DEGREE FILTER ! Filtering of matrix: FILTER NOFILTER -1.5 ! Coarsening ratio, if < 0 use library default +-0.0100d0 ! Smoothed aggregation threshold, ignored if < 0 -2 ! Number of thresholds in vector, next line ignored if <= 0 0.05 0.025 ! Thresholds --0.0100d0 ! Smoothed aggregation threshold, ignored if < 0 %%%%%%%%%%% Coarse level solver %%%%%%%%%%%%%%%% UMF ! Coarsest-level solver: MUMPS UMF SLU SLUDIST JACOBI GS BJAC UMF ! Coarsest-level subsolver for BJAC: ILU ILUT MILU UMF MUMPS SLU diff --git a/samples/advanced/fileread/runs/amg_sfs.inp b/samples/advanced/fileread/runs/amg_sfs.inp index d7388521..6301d925 100644 --- a/samples/advanced/fileread/runs/amg_sfs.inp +++ b/samples/advanced/fileread/runs/amg_sfs.inp @@ -1,8 +1,8 @@ %%%%%%%%%%% General arguments % Lines starting with % are ignored. -mld_mat.mtx ! Other matrices from: http://math.nist.gov/MatrixMarket/ or -mld_rhs.mtx ! rhs ! http://www.cise.ufl.edu/research/sparse/matrices/index.html +amg_mat.mtx ! Other matrices from: http://math.nist.gov/MatrixMarket/ or +amg_rhs.mtx ! rhs ! http://www.cise.ufl.edu/research/sparse/matrices/index.html NONE ! Initial guess -mld_sol.mtx ! Reference solution +amg_sol.mtx ! Reference solution MM ! File format: MatrixMarket or Harwell-Boeing CSR ! Storage format: CSR COO JAD GRAPH ! PART (partition method): BLOCK GRAPH @@ -43,9 +43,9 @@ DEC ! Parallel aggregation: DEC, SYMDEC NATURAL ! Ordering of aggregation NATURAL DEGREE FILTER ! Filtering of matrix: FILTER NOFILTER -1.5 ! Coarsening ratio, if < 0 use library default +-0.0100d0 ! Smoothed aggregation threshold, ignored if < 0 -2 ! Number of thresholds in vector, next line ignored if <= 0 0.05 0.025 ! Thresholds --0.0100d0 ! Smoothed aggregation threshold, ignored if < 0 %%%%%%%%%%% Coarse level solver %%%%%%%%%%%%%%%% SLU ! Coarsest-level solver: MUMPS UMF SLU SLUDIST JACOBI GS BJAC SLU ! Coarsest-level subsolver for BJAC: ILU ILUT MILU UMF MUMPS SLU diff --git a/samples/advanced/fileread/runs/amg_zfs.inp b/samples/advanced/fileread/runs/amg_zfs.inp index d0c48861..f37407e7 100644 --- a/samples/advanced/fileread/runs/amg_zfs.inp +++ b/samples/advanced/fileread/runs/amg_zfs.inp @@ -43,9 +43,9 @@ DEC ! Parallel aggregation: DEC, SYMDEC NATURAL ! Ordering of aggregation NATURAL DEGREE FILTER ! Filtering of matrix: FILTER NOFILTER -1.5 ! Coarsening ratio, if < 0 use library default +-0.0100d0 ! Smoothed aggregation threshold, ignored if < 0 -2 ! Number of thresholds in vector, next line ignored if <= 0 0.05 0.025 ! Thresholds --0.0100d0 ! Smoothed aggregation threshold, ignored if < 0 %%%%%%%%%%% Coarse level solver %%%%%%%%%%%%%%%% UMF ! Coarsest-level solver: MUMPS UMF SLU SLUDIST JACOBI GS BJAC UMF ! Coarsest-level subsolver for BJAC: ILU ILUT MILU UMF MUMPS SLU diff --git a/samples/advanced/pdegen/amg_d_pde2d.f90 b/samples/advanced/pdegen/amg_d_pde2d.f90 index 4e72981f..dbbd1303 100644 --- a/samples/advanced/pdegen/amg_d_pde2d.f90 +++ b/samples/advanced/pdegen/amg_d_pde2d.f90 @@ -583,6 +583,7 @@ contains call read_data(prec%aggr_ord,inp_unit) ! ordering for aggregation call read_data(prec%aggr_filter,inp_unit) ! filtering call read_data(prec%mncrratio,inp_unit) ! minimum aggregation ratio + call read_data(prec%athres,inp_unit) ! smoothed aggr thresh call read_data(prec%thrvsz,inp_unit) ! size of aggr thresh vector if (prec%thrvsz > 0) then call psb_realloc(prec%thrvsz,prec%athresv,info) @@ -590,7 +591,6 @@ contains else read(inp_unit,*) ! dummy read to skip a record end if - call read_data(prec%athres,inp_unit) ! smoothed aggr thresh ! coasest-level solver call read_data(prec%csolve,inp_unit) ! coarsest-lev solver call read_data(prec%csbsolve,inp_unit) ! coarsest-lev subsolver diff --git a/samples/advanced/pdegen/amg_d_pde3d.f90 b/samples/advanced/pdegen/amg_d_pde3d.f90 index a7965873..0db43766 100644 --- a/samples/advanced/pdegen/amg_d_pde3d.f90 +++ b/samples/advanced/pdegen/amg_d_pde3d.f90 @@ -587,6 +587,7 @@ contains call read_data(prec%aggr_ord,inp_unit) ! ordering for aggregation call read_data(prec%aggr_filter,inp_unit) ! filtering call read_data(prec%mncrratio,inp_unit) ! minimum aggregation ratio + call read_data(prec%athres,inp_unit) ! smoothed aggr thresh call read_data(prec%thrvsz,inp_unit) ! size of aggr thresh vector if (prec%thrvsz > 0) then call psb_realloc(prec%thrvsz,prec%athresv,info) @@ -594,7 +595,6 @@ contains else read(inp_unit,*) ! dummy read to skip a record end if - call read_data(prec%athres,inp_unit) ! smoothed aggr thresh ! coasest-level solver call read_data(prec%csolve,inp_unit) ! coarsest-lev solver call read_data(prec%csbsolve,inp_unit) ! coarsest-lev subsolver diff --git a/samples/advanced/pdegen/amg_s_pde2d.f90 b/samples/advanced/pdegen/amg_s_pde2d.f90 index 5fbd1864..a86dd415 100644 --- a/samples/advanced/pdegen/amg_s_pde2d.f90 +++ b/samples/advanced/pdegen/amg_s_pde2d.f90 @@ -583,6 +583,7 @@ contains call read_data(prec%aggr_ord,inp_unit) ! ordering for aggregation call read_data(prec%aggr_filter,inp_unit) ! filtering call read_data(prec%mncrratio,inp_unit) ! minimum aggregation ratio + call read_data(prec%athres,inp_unit) ! smoothed aggr thresh call read_data(prec%thrvsz,inp_unit) ! size of aggr thresh vector if (prec%thrvsz > 0) then call psb_realloc(prec%thrvsz,prec%athresv,info) @@ -590,7 +591,6 @@ contains else read(inp_unit,*) ! dummy read to skip a record end if - call read_data(prec%athres,inp_unit) ! smoothed aggr thresh ! coasest-level solver call read_data(prec%csolve,inp_unit) ! coarsest-lev solver call read_data(prec%csbsolve,inp_unit) ! coarsest-lev subsolver diff --git a/samples/advanced/pdegen/amg_s_pde3d.f90 b/samples/advanced/pdegen/amg_s_pde3d.f90 index 949371f4..322a84c8 100644 --- a/samples/advanced/pdegen/amg_s_pde3d.f90 +++ b/samples/advanced/pdegen/amg_s_pde3d.f90 @@ -587,6 +587,7 @@ contains call read_data(prec%aggr_ord,inp_unit) ! ordering for aggregation call read_data(prec%aggr_filter,inp_unit) ! filtering call read_data(prec%mncrratio,inp_unit) ! minimum aggregation ratio + call read_data(prec%athres,inp_unit) ! smoothed aggr thresh call read_data(prec%thrvsz,inp_unit) ! size of aggr thresh vector if (prec%thrvsz > 0) then call psb_realloc(prec%thrvsz,prec%athresv,info) @@ -594,7 +595,6 @@ contains else read(inp_unit,*) ! dummy read to skip a record end if - call read_data(prec%athres,inp_unit) ! smoothed aggr thresh ! coasest-level solver call read_data(prec%csolve,inp_unit) ! coarsest-lev solver call read_data(prec%csbsolve,inp_unit) ! coarsest-lev subsolver diff --git a/samples/advanced/pdegen/runs/amg_pde2d.inp b/samples/advanced/pdegen/runs/amg_pde2d.inp index 8e538001..d1281e7e 100644 --- a/samples/advanced/pdegen/runs/amg_pde2d.inp +++ b/samples/advanced/pdegen/runs/amg_pde2d.inp @@ -43,11 +43,11 @@ COUPLED ! Parallel aggregation: DEC, SYMDEC, COUPLED MATCHBOXP ! aggregation measure SOC1, MATCHBOXP 8 ! Requested size of the aggregates for MATCHBOXP NATURAL ! Ordering of aggregation NATURAL DEGREE -FILTER ! Filtering of matrix: FILTER NOFILTER +FILTER ! Filtering of matrix: FILTER NOFILTER -1.5 ! Coarsening ratio, if < 0 use library default +-0.0100d0 ! Smoothed aggregation threshold, ignored if < 0 -2 ! Number of thresholds in vector, next line ignored if <= 0 0.05 0.025 ! Thresholds --0.0100d0 ! Smoothed aggregation threshold, ignored if < 0 %%%%%%%%%%% Coarse level solver %%%%%%%%%%%%%%%% BJAC ! Coarsest-level solver: MUMPS UMF SLU SLUDIST JACOBI GS BJAC ILU ! Coarsest-level subsolver for BJAC: ILU ILUT MILU UMF MUMPS SLU diff --git a/samples/advanced/pdegen/runs/amg_pde3d.inp b/samples/advanced/pdegen/runs/amg_pde3d.inp index f9ff0d5d..62ca9b2d 100644 --- a/samples/advanced/pdegen/runs/amg_pde3d.inp +++ b/samples/advanced/pdegen/runs/amg_pde3d.inp @@ -43,11 +43,11 @@ COUPLED ! Parallel aggregation: DEC, SYMDEC, COUPLED MATCHBOXP ! aggregation measure SOC1, MATCHBOXP 8 ! Requested size of the aggregates for MATCHBOXP NATURAL ! Ordering of aggregation NATURAL DEGREE -NOFILTER ! Filtering of matrix: FILTER NOFILTER +FILTER ! Filtering of matrix: FILTER NOFILTER -1.5 ! Coarsening ratio, if < 0 use library default +-0.0100d0 ! Smoothed aggregation threshold, ignored if < 0 -2 ! Number of thresholds in vector, next line ignored if <= 0 0.05 0.025 ! Thresholds --0.0100d0 ! Smoothed aggregation threshold, ignored if < 0 %%%%%%%%%%% Coarse level solver %%%%%%%%%%%%%%%% BJAC ! Coarsest-level solver: MUMPS UMF SLU SLUDIST JACOBI GS BJAC ILU ! Coarsest-level subsolver for BJAC: ILU ILUT MILU UMF MUMPS SLU From 45fabb5214b27d6c67cdf8f6a82277374a059e34 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Mon, 25 Oct 2021 14:46:43 +0200 Subject: [PATCH 25/36] Move reading aggregation ratio above filtering option. --- samples/advanced/fileread/amg_cf_sample.f90 | 2 +- samples/advanced/fileread/amg_df_sample.f90 | 2 +- samples/advanced/fileread/amg_sf_sample.f90 | 2 +- samples/advanced/fileread/amg_zf_sample.f90 | 2 +- samples/advanced/fileread/runs/amg_cfs.inp | 2 +- samples/advanced/fileread/runs/amg_dfs.inp | 2 +- samples/advanced/fileread/runs/amg_sfs.inp | 2 +- samples/advanced/fileread/runs/amg_zfs.inp | 2 +- samples/advanced/pdegen/amg_d_pde2d.f90 | 2 +- samples/advanced/pdegen/amg_d_pde3d.f90 | 2 +- samples/advanced/pdegen/amg_s_pde2d.f90 | 2 +- samples/advanced/pdegen/amg_s_pde3d.f90 | 2 +- samples/advanced/pdegen/runs/amg_pde2d.inp | 2 +- samples/advanced/pdegen/runs/amg_pde3d.inp | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/samples/advanced/fileread/amg_cf_sample.f90 b/samples/advanced/fileread/amg_cf_sample.f90 index 0077a4af..e18079ae 100644 --- a/samples/advanced/fileread/amg_cf_sample.f90 +++ b/samples/advanced/fileread/amg_cf_sample.f90 @@ -676,8 +676,8 @@ contains call read_data(prec%aggr_prol,inp_unit) ! aggregation type call read_data(prec%par_aggr_alg,inp_unit) ! parallel aggregation alg call read_data(prec%aggr_ord,inp_unit) ! ordering for aggregation - call read_data(prec%aggr_filter,inp_unit) ! filtering call read_data(prec%mncrratio,inp_unit) ! minimum aggregation ratio + call read_data(prec%aggr_filter,inp_unit) ! filtering call read_data(prec%athres,inp_unit) ! smoothed aggr thresh call read_data(prec%thrvsz,inp_unit) ! size of aggr thresh vector if (prec%thrvsz > 0) then diff --git a/samples/advanced/fileread/amg_df_sample.f90 b/samples/advanced/fileread/amg_df_sample.f90 index eb4d9e46..8c29eff8 100644 --- a/samples/advanced/fileread/amg_df_sample.f90 +++ b/samples/advanced/fileread/amg_df_sample.f90 @@ -676,8 +676,8 @@ contains call read_data(prec%aggr_prol,inp_unit) ! aggregation type call read_data(prec%par_aggr_alg,inp_unit) ! parallel aggregation alg call read_data(prec%aggr_ord,inp_unit) ! ordering for aggregation - call read_data(prec%aggr_filter,inp_unit) ! filtering call read_data(prec%mncrratio,inp_unit) ! minimum aggregation ratio + call read_data(prec%aggr_filter,inp_unit) ! filtering call read_data(prec%athres,inp_unit) ! smoothed aggr thresh call read_data(prec%thrvsz,inp_unit) ! size of aggr thresh vector if (prec%thrvsz > 0) then diff --git a/samples/advanced/fileread/amg_sf_sample.f90 b/samples/advanced/fileread/amg_sf_sample.f90 index e0a1c3c3..e195d4ff 100644 --- a/samples/advanced/fileread/amg_sf_sample.f90 +++ b/samples/advanced/fileread/amg_sf_sample.f90 @@ -676,8 +676,8 @@ contains call read_data(prec%aggr_prol,inp_unit) ! aggregation type call read_data(prec%par_aggr_alg,inp_unit) ! parallel aggregation alg call read_data(prec%aggr_ord,inp_unit) ! ordering for aggregation - call read_data(prec%aggr_filter,inp_unit) ! filtering call read_data(prec%mncrratio,inp_unit) ! minimum aggregation ratio + call read_data(prec%aggr_filter,inp_unit) ! filtering call read_data(prec%athres,inp_unit) ! smoothed aggr thresh call read_data(prec%thrvsz,inp_unit) ! size of aggr thresh vector if (prec%thrvsz > 0) then diff --git a/samples/advanced/fileread/amg_zf_sample.f90 b/samples/advanced/fileread/amg_zf_sample.f90 index 28703f25..6d7e6f9c 100644 --- a/samples/advanced/fileread/amg_zf_sample.f90 +++ b/samples/advanced/fileread/amg_zf_sample.f90 @@ -676,8 +676,8 @@ contains call read_data(prec%aggr_prol,inp_unit) ! aggregation type call read_data(prec%par_aggr_alg,inp_unit) ! parallel aggregation alg call read_data(prec%aggr_ord,inp_unit) ! ordering for aggregation - call read_data(prec%aggr_filter,inp_unit) ! filtering call read_data(prec%mncrratio,inp_unit) ! minimum aggregation ratio + call read_data(prec%aggr_filter,inp_unit) ! filtering call read_data(prec%athres,inp_unit) ! smoothed aggr thresh call read_data(prec%thrvsz,inp_unit) ! size of aggr thresh vector if (prec%thrvsz > 0) then diff --git a/samples/advanced/fileread/runs/amg_cfs.inp b/samples/advanced/fileread/runs/amg_cfs.inp index b41704a0..44ca86bf 100644 --- a/samples/advanced/fileread/runs/amg_cfs.inp +++ b/samples/advanced/fileread/runs/amg_cfs.inp @@ -41,8 +41,8 @@ VCYCLE ! Type of multilevel CYCLE: VCYCLE WCYCLE KCYCLE MUL SMOOTHED ! Type of aggregation: SMOOTHED UNSMOOTHED DEC ! Parallel aggregation: DEC, SYMDEC NATURAL ! Ordering of aggregation NATURAL DEGREE -FILTER ! Filtering of matrix: FILTER NOFILTER -1.5 ! Coarsening ratio, if < 0 use library default +FILTER ! Filtering of matrix: FILTER NOFILTER -0.0100d0 ! Smoothed aggregation threshold, ignored if < 0 -2 ! Number of thresholds in vector, next line ignored if <= 0 0.05 0.025 ! Thresholds diff --git a/samples/advanced/fileread/runs/amg_dfs.inp b/samples/advanced/fileread/runs/amg_dfs.inp index 68210fa4..9e0606b2 100644 --- a/samples/advanced/fileread/runs/amg_dfs.inp +++ b/samples/advanced/fileread/runs/amg_dfs.inp @@ -41,8 +41,8 @@ VCYCLE ! Type of multilevel CYCLE: VCYCLE WCYCLE KCYCLE MUL SMOOTHED ! Type of aggregation: SMOOTHED UNSMOOTHED DEC ! Parallel aggregation: DEC, SYMDEC NATURAL ! Ordering of aggregation NATURAL DEGREE -FILTER ! Filtering of matrix: FILTER NOFILTER -1.5 ! Coarsening ratio, if < 0 use library default +FILTER ! Filtering of matrix: FILTER NOFILTER -0.0100d0 ! Smoothed aggregation threshold, ignored if < 0 -2 ! Number of thresholds in vector, next line ignored if <= 0 0.05 0.025 ! Thresholds diff --git a/samples/advanced/fileread/runs/amg_sfs.inp b/samples/advanced/fileread/runs/amg_sfs.inp index 6301d925..a73415ab 100644 --- a/samples/advanced/fileread/runs/amg_sfs.inp +++ b/samples/advanced/fileread/runs/amg_sfs.inp @@ -41,8 +41,8 @@ VCYCLE ! Type of multilevel CYCLE: VCYCLE WCYCLE KCYCLE MUL SMOOTHED ! Type of aggregation: SMOOTHED UNSMOOTHED DEC ! Parallel aggregation: DEC, SYMDEC NATURAL ! Ordering of aggregation NATURAL DEGREE -FILTER ! Filtering of matrix: FILTER NOFILTER -1.5 ! Coarsening ratio, if < 0 use library default +FILTER ! Filtering of matrix: FILTER NOFILTER -0.0100d0 ! Smoothed aggregation threshold, ignored if < 0 -2 ! Number of thresholds in vector, next line ignored if <= 0 0.05 0.025 ! Thresholds diff --git a/samples/advanced/fileread/runs/amg_zfs.inp b/samples/advanced/fileread/runs/amg_zfs.inp index f37407e7..1868d64c 100644 --- a/samples/advanced/fileread/runs/amg_zfs.inp +++ b/samples/advanced/fileread/runs/amg_zfs.inp @@ -41,8 +41,8 @@ VCYCLE ! Type of multilevel CYCLE: VCYCLE WCYCLE KCYCLE MUL SMOOTHED ! Type of aggregation: SMOOTHED UNSMOOTHED DEC ! Parallel aggregation: DEC, SYMDEC NATURAL ! Ordering of aggregation NATURAL DEGREE -FILTER ! Filtering of matrix: FILTER NOFILTER -1.5 ! Coarsening ratio, if < 0 use library default +FILTER ! Filtering of matrix: FILTER NOFILTER -0.0100d0 ! Smoothed aggregation threshold, ignored if < 0 -2 ! Number of thresholds in vector, next line ignored if <= 0 0.05 0.025 ! Thresholds diff --git a/samples/advanced/pdegen/amg_d_pde2d.f90 b/samples/advanced/pdegen/amg_d_pde2d.f90 index dbbd1303..c036aa6d 100644 --- a/samples/advanced/pdegen/amg_d_pde2d.f90 +++ b/samples/advanced/pdegen/amg_d_pde2d.f90 @@ -581,8 +581,8 @@ contains call read_data(prec%aggr_type,inp_unit) ! type of aggregation call read_data(prec%aggr_size,inp_unit) ! Requested size of the aggregates for MATCHBOXP call read_data(prec%aggr_ord,inp_unit) ! ordering for aggregation - call read_data(prec%aggr_filter,inp_unit) ! filtering call read_data(prec%mncrratio,inp_unit) ! minimum aggregation ratio + call read_data(prec%aggr_filter,inp_unit) ! filtering call read_data(prec%athres,inp_unit) ! smoothed aggr thresh call read_data(prec%thrvsz,inp_unit) ! size of aggr thresh vector if (prec%thrvsz > 0) then diff --git a/samples/advanced/pdegen/amg_d_pde3d.f90 b/samples/advanced/pdegen/amg_d_pde3d.f90 index 0db43766..1f6118ca 100644 --- a/samples/advanced/pdegen/amg_d_pde3d.f90 +++ b/samples/advanced/pdegen/amg_d_pde3d.f90 @@ -585,8 +585,8 @@ contains call read_data(prec%aggr_type,inp_unit) ! type of aggregation call read_data(prec%aggr_size,inp_unit) ! Requested size of the aggregates for MATCHBOXP call read_data(prec%aggr_ord,inp_unit) ! ordering for aggregation - call read_data(prec%aggr_filter,inp_unit) ! filtering call read_data(prec%mncrratio,inp_unit) ! minimum aggregation ratio + call read_data(prec%aggr_filter,inp_unit) ! filtering call read_data(prec%athres,inp_unit) ! smoothed aggr thresh call read_data(prec%thrvsz,inp_unit) ! size of aggr thresh vector if (prec%thrvsz > 0) then diff --git a/samples/advanced/pdegen/amg_s_pde2d.f90 b/samples/advanced/pdegen/amg_s_pde2d.f90 index a86dd415..a81d16ff 100644 --- a/samples/advanced/pdegen/amg_s_pde2d.f90 +++ b/samples/advanced/pdegen/amg_s_pde2d.f90 @@ -581,8 +581,8 @@ contains call read_data(prec%aggr_type,inp_unit) ! type of aggregation call read_data(prec%aggr_size,inp_unit) ! Requested size of the aggregates for MATCHBOXP call read_data(prec%aggr_ord,inp_unit) ! ordering for aggregation - call read_data(prec%aggr_filter,inp_unit) ! filtering call read_data(prec%mncrratio,inp_unit) ! minimum aggregation ratio + call read_data(prec%aggr_filter,inp_unit) ! filtering call read_data(prec%athres,inp_unit) ! smoothed aggr thresh call read_data(prec%thrvsz,inp_unit) ! size of aggr thresh vector if (prec%thrvsz > 0) then diff --git a/samples/advanced/pdegen/amg_s_pde3d.f90 b/samples/advanced/pdegen/amg_s_pde3d.f90 index 322a84c8..7542c3a2 100644 --- a/samples/advanced/pdegen/amg_s_pde3d.f90 +++ b/samples/advanced/pdegen/amg_s_pde3d.f90 @@ -585,8 +585,8 @@ contains call read_data(prec%aggr_type,inp_unit) ! type of aggregation call read_data(prec%aggr_size,inp_unit) ! Requested size of the aggregates for MATCHBOXP call read_data(prec%aggr_ord,inp_unit) ! ordering for aggregation - call read_data(prec%aggr_filter,inp_unit) ! filtering call read_data(prec%mncrratio,inp_unit) ! minimum aggregation ratio + call read_data(prec%aggr_filter,inp_unit) ! filtering call read_data(prec%athres,inp_unit) ! smoothed aggr thresh call read_data(prec%thrvsz,inp_unit) ! size of aggr thresh vector if (prec%thrvsz > 0) then diff --git a/samples/advanced/pdegen/runs/amg_pde2d.inp b/samples/advanced/pdegen/runs/amg_pde2d.inp index d1281e7e..c3fc58e1 100644 --- a/samples/advanced/pdegen/runs/amg_pde2d.inp +++ b/samples/advanced/pdegen/runs/amg_pde2d.inp @@ -43,8 +43,8 @@ COUPLED ! Parallel aggregation: DEC, SYMDEC, COUPLED MATCHBOXP ! aggregation measure SOC1, MATCHBOXP 8 ! Requested size of the aggregates for MATCHBOXP NATURAL ! Ordering of aggregation NATURAL DEGREE -FILTER ! Filtering of matrix: FILTER NOFILTER -1.5 ! Coarsening ratio, if < 0 use library default +FILTER ! Filtering of matrix: FILTER NOFILTER -0.0100d0 ! Smoothed aggregation threshold, ignored if < 0 -2 ! Number of thresholds in vector, next line ignored if <= 0 0.05 0.025 ! Thresholds diff --git a/samples/advanced/pdegen/runs/amg_pde3d.inp b/samples/advanced/pdegen/runs/amg_pde3d.inp index 62ca9b2d..eb254780 100644 --- a/samples/advanced/pdegen/runs/amg_pde3d.inp +++ b/samples/advanced/pdegen/runs/amg_pde3d.inp @@ -43,8 +43,8 @@ COUPLED ! Parallel aggregation: DEC, SYMDEC, COUPLED MATCHBOXP ! aggregation measure SOC1, MATCHBOXP 8 ! Requested size of the aggregates for MATCHBOXP NATURAL ! Ordering of aggregation NATURAL DEGREE -FILTER ! Filtering of matrix: FILTER NOFILTER -1.5 ! Coarsening ratio, if < 0 use library default +FILTER ! Filtering of matrix: FILTER NOFILTER -0.0100d0 ! Smoothed aggregation threshold, ignored if < 0 -2 ! Number of thresholds in vector, next line ignored if <= 0 0.05 0.025 ! Thresholds From 87cdd76f8d5631153e3fbc91252d57b818bca959 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Mon, 7 Feb 2022 10:41:45 +0100 Subject: [PATCH 26/36] Fix spurious error notification with prec%descr --- amgprec/impl/level/amg_c_base_onelev_descr.f90 | 2 ++ amgprec/impl/level/amg_d_base_onelev_descr.f90 | 2 ++ amgprec/impl/level/amg_s_base_onelev_descr.f90 | 2 ++ amgprec/impl/level/amg_z_base_onelev_descr.f90 | 2 ++ 4 files changed, 8 insertions(+) diff --git a/amgprec/impl/level/amg_c_base_onelev_descr.f90 b/amgprec/impl/level/amg_c_base_onelev_descr.f90 index 6fe7aef3..41a0f0c0 100644 --- a/amgprec/impl/level/amg_c_base_onelev_descr.f90 +++ b/amgprec/impl/level/amg_c_base_onelev_descr.f90 @@ -83,6 +83,8 @@ subroutine amg_c_base_onelev_descr(lv,il,nl,ilmin,info,iout,verbosity) write(iout_,*) if (il == ilmin) then call lv%parms%mlcycledsc(iout_,info) + end if + if (((ilmin==1).and.(il==2)).or.((ilmin>1).and.(il==ilmin))) then if (allocated(lv%aggr)) then call lv%aggr%descr(lv%parms,iout_,info) else diff --git a/amgprec/impl/level/amg_d_base_onelev_descr.f90 b/amgprec/impl/level/amg_d_base_onelev_descr.f90 index 880d5f3d..60e49464 100644 --- a/amgprec/impl/level/amg_d_base_onelev_descr.f90 +++ b/amgprec/impl/level/amg_d_base_onelev_descr.f90 @@ -83,6 +83,8 @@ subroutine amg_d_base_onelev_descr(lv,il,nl,ilmin,info,iout,verbosity) write(iout_,*) if (il == ilmin) then call lv%parms%mlcycledsc(iout_,info) + end if + if (((ilmin==1).and.(il==2)).or.((ilmin>1).and.(il==ilmin))) then if (allocated(lv%aggr)) then call lv%aggr%descr(lv%parms,iout_,info) else diff --git a/amgprec/impl/level/amg_s_base_onelev_descr.f90 b/amgprec/impl/level/amg_s_base_onelev_descr.f90 index 94b776eb..b96c005b 100644 --- a/amgprec/impl/level/amg_s_base_onelev_descr.f90 +++ b/amgprec/impl/level/amg_s_base_onelev_descr.f90 @@ -83,6 +83,8 @@ subroutine amg_s_base_onelev_descr(lv,il,nl,ilmin,info,iout,verbosity) write(iout_,*) if (il == ilmin) then call lv%parms%mlcycledsc(iout_,info) + end if + if (((ilmin==1).and.(il==2)).or.((ilmin>1).and.(il==ilmin))) then if (allocated(lv%aggr)) then call lv%aggr%descr(lv%parms,iout_,info) else diff --git a/amgprec/impl/level/amg_z_base_onelev_descr.f90 b/amgprec/impl/level/amg_z_base_onelev_descr.f90 index a92cb79e..913289f7 100644 --- a/amgprec/impl/level/amg_z_base_onelev_descr.f90 +++ b/amgprec/impl/level/amg_z_base_onelev_descr.f90 @@ -83,6 +83,8 @@ subroutine amg_z_base_onelev_descr(lv,il,nl,ilmin,info,iout,verbosity) write(iout_,*) if (il == ilmin) then call lv%parms%mlcycledsc(iout_,info) + end if + if (((ilmin==1).and.(il==2)).or.((ilmin>1).and.(il==ilmin))) then if (allocated(lv%aggr)) then call lv%aggr%descr(lv%parms,iout_,info) else From 873f1909610ba19ad1fb678a160b554169ef165d Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Tue, 15 Mar 2022 10:25:58 +0100 Subject: [PATCH 27/36] Configry checks for OpenMPI cxx libs --- configure | 28 ++++++++++++++++++++++++++-- configure.ac | 10 ++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/configure b/configure index cedf2c1e..c8992a38 100755 --- a/configure +++ b/configure @@ -726,6 +726,7 @@ infodir docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -837,6 +838,7 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -1089,6 +1091,15 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1226,7 +1237,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1379,6 +1390,7 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -5126,6 +5138,16 @@ fi +# Check if we need extra libs (e.g. for OpenMPI) +xtrlibs=`mpicxx --showme:link`; +if (( $? == 0 )) +then + EXTRA_LIBS="$EXTRA_LIBS $xtrlibs"; +fi + + + + ############################################################################### # Sanity checks, although redundant (useful when debugging this configure.ac)! ############################################################################### @@ -10598,7 +10620,9 @@ $as_echo X/"$am_mf" | { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments - for automatic dependency tracking. Try re-running configure with the + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE=\"gmake\" (or whatever is + necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } diff --git a/configure.ac b/configure.ac index 8cd0797b..f5eaecc3 100755 --- a/configure.ac +++ b/configure.ac @@ -230,6 +230,16 @@ PAC_ARG_WITH_FLAGS(module-path,MODULE_PATH) # we just gave the user the chance to append values to these variables PAC_ARG_WITH_EXTRA_LIBS +# Check if we need extra libs (e.g. for OpenMPI) +xtrlibs=`mpicxx --showme:link`; +if (( $? == 0 )) +then + EXTRA_LIBS="$EXTRA_LIBS $xtrlibs"; +fi + + + + ############################################################################### # Sanity checks, although redundant (useful when debugging this configure.ac)! ############################################################################### From 23a39a6c54dac5fbe9f15991cb82d81b756c9fde Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Tue, 15 Mar 2022 11:00:22 +0100 Subject: [PATCH 28/36] Fix configry redirect check to dev/null --- configure | 2 +- configure.ac | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index c8992a38..3581cf71 100755 --- a/configure +++ b/configure @@ -5139,7 +5139,7 @@ fi # Check if we need extra libs (e.g. for OpenMPI) -xtrlibs=`mpicxx --showme:link`; +xtrlibs=`mpicxx --showme:link 2>/dev/null`; if (( $? == 0 )) then EXTRA_LIBS="$EXTRA_LIBS $xtrlibs"; diff --git a/configure.ac b/configure.ac index f5eaecc3..76696199 100755 --- a/configure.ac +++ b/configure.ac @@ -231,7 +231,7 @@ PAC_ARG_WITH_FLAGS(module-path,MODULE_PATH) PAC_ARG_WITH_EXTRA_LIBS # Check if we need extra libs (e.g. for OpenMPI) -xtrlibs=`mpicxx --showme:link`; +xtrlibs=`mpicxx --showme:link 2>/dev/null`; if (( $? == 0 )) then EXTRA_LIBS="$EXTRA_LIBS $xtrlibs"; From 90657b706f22f7d0895a540383ffa4af80a089df Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Tue, 15 Mar 2022 11:00:52 +0100 Subject: [PATCH 29/36] Fix Makefile: mld -> amg --- samples/advanced/pdegen/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/advanced/pdegen/Makefile b/samples/advanced/pdegen/Makefile index 79c2d89e..0720b6f3 100644 --- a/samples/advanced/pdegen/Makefile +++ b/samples/advanced/pdegen/Makefile @@ -44,7 +44,7 @@ check: all clean: /bin/rm -f data_input.o *.o *$(.mod)\ - $(EXEDIR)/mld_d_pde3d $(EXEDIR)/mld_s_pde3d $(EXEDIR)/mld_d_pde2d $(EXEDIR)/mld_s_pde2d + $(EXEDIR)/amg_d_pde3d $(EXEDIR)/amg_s_pde3d $(EXEDIR)/amg_d_pde2d $(EXEDIR)/amg_s_pde2d verycleanlib: (cd ../..; make veryclean) From 4f9254ebb0e7ffe4b0c799758c188c6657402475 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Fri, 18 Mar 2022 18:31:42 +0100 Subject: [PATCH 30/36] Add log entry for configure check on MPICXX libs --- configure | 7 +++++++ configure.ac | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/configure b/configure index 3581cf71..f22332bc 100755 --- a/configure +++ b/configure @@ -5139,10 +5139,17 @@ fi # Check if we need extra libs (e.g. for OpenMPI) +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Extra mpicxx libs?" >&5 +$as_echo_n "checking Extra mpicxx libs?... " >&6; } xtrlibs=`mpicxx --showme:link 2>/dev/null`; if (( $? == 0 )) then EXTRA_LIBS="$EXTRA_LIBS $xtrlibs"; + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xtrlibs" >&5 +$as_echo "$xtrlibs" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } fi diff --git a/configure.ac b/configure.ac index 76696199..e3869c3d 100755 --- a/configure.ac +++ b/configure.ac @@ -231,10 +231,14 @@ PAC_ARG_WITH_FLAGS(module-path,MODULE_PATH) PAC_ARG_WITH_EXTRA_LIBS # Check if we need extra libs (e.g. for OpenMPI) +AC_MSG_CHECKING([Extra mpicxx libs?]) xtrlibs=`mpicxx --showme:link 2>/dev/null`; if (( $? == 0 )) then EXTRA_LIBS="$EXTRA_LIBS $xtrlibs"; + AC_MSG_RESULT([$xtrlibs]) +else + AC_MSG_RESULT([none]) fi From 7e48a0a742a7266bf38321119fc7bec3c8746561 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Wed, 6 Apr 2022 09:02:20 +0200 Subject: [PATCH 31/36] Fix defines for SLUD v7 --- amgprec/impl/amg_dslud_interface.c | 20 ++++++++++---------- amgprec/impl/amg_zslud_interface.c | 20 ++++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/amgprec/impl/amg_dslud_interface.c b/amgprec/impl/amg_dslud_interface.c index b3f0138f..c7b4f3c6 100644 --- a/amgprec/impl/amg_dslud_interface.c +++ b/amgprec/impl/amg_dslud_interface.c @@ -94,7 +94,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define HANDLE_SIZE 8 -#if defined(SLUD_VERSION_63) +#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) typedef struct { SuperMatrix *A; dLUstruct_t *LUstruct; @@ -135,7 +135,7 @@ int amg_dsludist_fact(int n, int nl, int nnzl, int ffstr, SuperMatrix *A; NRformat_loc *Astore; -#if defined(SLUD_VERSION_63) +#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) dScalePermstruct_t *ScalePermstruct; dLUstruct_t *LUstruct; dSOLVEstruct_t SOLVEstruct; @@ -148,7 +148,7 @@ int amg_dsludist_fact(int n, int nl, int nnzl, int ffstr, int i, panel_size, permc_spec, relax, info; trans_t trans; double drop_tol = 0.0, b[1], berr[1]; -#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_6)||defined(SLUD_VERSION_5) +#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) || defined(SLUD_VERSION_6)||defined(SLUD_VERSION_5) superlu_dist_options_t options; #elif defined(SLUD_VERSION_4)||defined(SLUD_VERSION_3) superlu_options_t options; @@ -174,7 +174,7 @@ int amg_dsludist_fact(int n, int nl, int nnzl, int ffstr, SLU_NR_loc, SLU_D, SLU_GE); /* Initialize ScalePermstruct and LUstruct. */ -#if defined(SLUD_VERSION_63) +#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) ScalePermstruct = (dScalePermstruct_t *) SUPERLU_MALLOC(sizeof(dScalePermstruct_t)); LUstruct = (dLUstruct_t *) SUPERLU_MALLOC(sizeof(dLUstruct_t)); dScalePermstructInit(n,n, ScalePermstruct); @@ -183,7 +183,7 @@ int amg_dsludist_fact(int n, int nl, int nnzl, int ffstr, LUstruct = (LUstruct_t *) SUPERLU_MALLOC(sizeof(LUstruct_t)); ScalePermstructInit(n,n, ScalePermstruct); #endif -#if defined(SLUD_VERSION_63) +#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) dLUstructInit(n, LUstruct); #elif defined(SLUD_VERSION_4) || defined(SLUD_VERSION_5) || defined(SLUD_VERSION_6) LUstructInit(n, LUstruct); @@ -245,7 +245,7 @@ int amg_dsludist_solve(int itrans, int n, int nrhs, */ #ifdef Have_SLUDist_ SuperMatrix *A; -#if defined(SLUD_VERSION_63) +#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) dScalePermstruct_t *ScalePermstruct; dLUstruct_t *LUstruct; dSOLVEstruct_t SOLVEstruct; @@ -259,7 +259,7 @@ int amg_dsludist_solve(int itrans, int n, int nrhs, trans_t trans; double drop_tol = 0.0; double *berr; -#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_6) ||defined(SLUD_VERSION_5) +#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) || defined(SLUD_VERSION_6) ||defined(SLUD_VERSION_5) superlu_dist_options_t options; #elif defined(SLUD_VERSION_4)|| defined(SLUD_VERSION_3) superlu_options_t options; @@ -331,7 +331,7 @@ int amg_dsludist_free(void *f_factors) */ #ifdef Have_SLUDist_ SuperMatrix *A; -#if defined(SLUD_VERSION_63) +#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) dScalePermstruct_t *ScalePermstruct; dLUstruct_t *LUstruct; dSOLVEstruct_t SOLVEstruct; @@ -345,7 +345,7 @@ int amg_dsludist_free(void *f_factors) trans_t trans; double drop_tol = 0.0; double *berr; -#if defined(SLUD_VERSION_63)||defined(SLUD_VERSION_6)||defined(SLUD_VERSION_5) +#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7)||defined(SLUD_VERSION_6)||defined(SLUD_VERSION_5) superlu_dist_options_t options; #elif defined(SLUD_VERSION_4)||defined(SLUD_VERSION_3) superlu_options_t options; @@ -368,7 +368,7 @@ int amg_dsludist_free(void *f_factors) // we either have a leak or a segfault here. // To be investigated further. //Destroy_CompRowLoc_Matrix_dist(A); -#if defined(SLUD_VERSION_63) +#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) dScalePermstructFree(ScalePermstruct); dLUstructFree(LUstruct); #else diff --git a/amgprec/impl/amg_zslud_interface.c b/amgprec/impl/amg_zslud_interface.c index c3120aa6..95b9f4fa 100644 --- a/amgprec/impl/amg_zslud_interface.c +++ b/amgprec/impl/amg_zslud_interface.c @@ -94,7 +94,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define HANDLE_SIZE 8 -#if defined(SLUD_VERSION_63) +#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) typedef struct { SuperMatrix *A; zLUstruct_t *LUstruct; @@ -142,7 +142,7 @@ int amg_zsludist_fact(int n, int nl, int nnzl, int ffstr, SuperMatrix *A; NRformat_loc *Astore; -#if defined(SLUD_VERSION_63) +#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) zScalePermstruct_t *ScalePermstruct; zLUstruct_t *LUstruct; zSOLVEstruct_t SOLVEstruct; @@ -155,7 +155,7 @@ int amg_zsludist_fact(int n, int nl, int nnzl, int ffstr, int i, panel_size, permc_spec, relax, info; trans_t trans; double drop_tol = 0.0,berr[1]; -#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_6)||defined(SLUD_VERSION_5) +#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) || defined(SLUD_VERSION_6)||defined(SLUD_VERSION_5) superlu_dist_options_t options; #elif defined(SLUD_VERSION_4)||defined(SLUD_VERSION_3) superlu_options_t options; @@ -181,7 +181,7 @@ int amg_zsludist_fact(int n, int nl, int nnzl, int ffstr, SLU_NR_loc, SLU_Z, SLU_GE); /* Initialize ScalePermstruct and LUstruct. */ -#if defined(SLUD_VERSION_63) +#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) ScalePermstruct = (zScalePermstruct_t *) SUPERLU_MALLOC(sizeof(zScalePermstruct_t)); LUstruct = (zLUstruct_t *) SUPERLU_MALLOC(sizeof(zLUstruct_t)); zScalePermstructInit(n,n, ScalePermstruct); @@ -190,7 +190,7 @@ int amg_zsludist_fact(int n, int nl, int nnzl, int ffstr, LUstruct = (LUstruct_t *) SUPERLU_MALLOC(sizeof(LUstruct_t)); ScalePermstructInit(n,n, ScalePermstruct); #endif -#if defined(SLUD_VERSION_63) +#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) zLUstructInit(n, LUstruct); #elif defined(SLUD_VERSION_4) || defined(SLUD_VERSION_5) || defined(SLUD_VERSION_6) LUstructInit(n, LUstruct); @@ -257,7 +257,7 @@ int amg_zsludist_solve(int itrans, int n, int nrhs, */ #ifdef Have_SLUDist_ SuperMatrix *A; -#if defined(SLUD_VERSION_63) +#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) zScalePermstruct_t *ScalePermstruct; zLUstruct_t *LUstruct; zSOLVEstruct_t SOLVEstruct; @@ -271,7 +271,7 @@ int amg_zsludist_solve(int itrans, int n, int nrhs, trans_t trans; double drop_tol = 0.0; double *berr; -#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_6) ||defined(SLUD_VERSION_5) +#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) || defined(SLUD_VERSION_6) ||defined(SLUD_VERSION_5) superlu_dist_options_t options; #elif defined(SLUD_VERSION_4)|| defined(SLUD_VERSION_3) superlu_options_t options; @@ -343,7 +343,7 @@ int amg_zsludist_free(void *f_factors) */ #ifdef Have_SLUDist_ SuperMatrix *A; -#if defined(SLUD_VERSION_63) +#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) zScalePermstruct_t *ScalePermstruct; zLUstruct_t *LUstruct; zSOLVEstruct_t SOLVEstruct; @@ -357,7 +357,7 @@ int amg_zsludist_free(void *f_factors) trans_t trans; double drop_tol = 0.0; double *berr; -#if defined(SLUD_VERSION_63)||defined(SLUD_VERSION_6)||defined(SLUD_VERSION_5) +#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7)||defined(SLUD_VERSION_6)||defined(SLUD_VERSION_5) superlu_dist_options_t options; #elif defined(SLUD_VERSION_4)||defined(SLUD_VERSION_3) superlu_options_t options; @@ -380,7 +380,7 @@ int amg_zsludist_free(void *f_factors) // we either have a leak or a segfault here. // To be investigated further. //Destroy_CompRowLoc_Matrix_dist(A); -#if defined(SLUD_VERSION_63) +#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) zScalePermstructFree(ScalePermstruct); zLUstructFree(LUstruct); #else From 425743939ca87dd84c4aec16e073f83e24067ffc Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Wed, 6 Apr 2022 11:02:32 +0200 Subject: [PATCH 32/36] Fix for new SuperLU_Dist version, change configure --- amgprec/impl/amg_dslud_interface.c | 30 +++++++++++++++--------------- amgprec/impl/amg_zslud_interface.c | 30 +++++++++++++++--------------- configure | 10 +++------- configure.ac | 10 +++------- 4 files changed, 36 insertions(+), 44 deletions(-) diff --git a/amgprec/impl/amg_dslud_interface.c b/amgprec/impl/amg_dslud_interface.c index c7b4f3c6..2831c6f1 100644 --- a/amgprec/impl/amg_dslud_interface.c +++ b/amgprec/impl/amg_dslud_interface.c @@ -94,7 +94,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define HANDLE_SIZE 8 -#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) +#if (SLUD_VERSION_>=63) typedef struct { SuperMatrix *A; dLUstruct_t *LUstruct; @@ -135,7 +135,7 @@ int amg_dsludist_fact(int n, int nl, int nnzl, int ffstr, SuperMatrix *A; NRformat_loc *Astore; -#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) +#if (SLUD_VERSION_>=63) dScalePermstruct_t *ScalePermstruct; dLUstruct_t *LUstruct; dSOLVEstruct_t SOLVEstruct; @@ -148,9 +148,9 @@ int amg_dsludist_fact(int n, int nl, int nnzl, int ffstr, int i, panel_size, permc_spec, relax, info; trans_t trans; double drop_tol = 0.0, b[1], berr[1]; -#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) || defined(SLUD_VERSION_6)||defined(SLUD_VERSION_5) +#if (SLUD_VERSION_>=50) superlu_dist_options_t options; -#elif defined(SLUD_VERSION_4)||defined(SLUD_VERSION_3) +#elif (SLUD_VERSION_>=30) superlu_options_t options; #else choke_on_me; @@ -174,7 +174,7 @@ int amg_dsludist_fact(int n, int nl, int nnzl, int ffstr, SLU_NR_loc, SLU_D, SLU_GE); /* Initialize ScalePermstruct and LUstruct. */ -#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) +#if (SLUD_VERSION_>=63) ScalePermstruct = (dScalePermstruct_t *) SUPERLU_MALLOC(sizeof(dScalePermstruct_t)); LUstruct = (dLUstruct_t *) SUPERLU_MALLOC(sizeof(dLUstruct_t)); dScalePermstructInit(n,n, ScalePermstruct); @@ -183,11 +183,11 @@ int amg_dsludist_fact(int n, int nl, int nnzl, int ffstr, LUstruct = (LUstruct_t *) SUPERLU_MALLOC(sizeof(LUstruct_t)); ScalePermstructInit(n,n, ScalePermstruct); #endif -#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) +#if (SLUD_VERSION_>=63) dLUstructInit(n, LUstruct); -#elif defined(SLUD_VERSION_4) || defined(SLUD_VERSION_5) || defined(SLUD_VERSION_6) +#elif (SLUD_VERSION_>=40) LUstructInit(n, LUstruct); -#elif defined(SLUD_VERSION_3) +#elif (SLUD_VERSION_>=30) LUstructInit(n,n, LUstruct); #else choke_on_me; @@ -245,7 +245,7 @@ int amg_dsludist_solve(int itrans, int n, int nrhs, */ #ifdef Have_SLUDist_ SuperMatrix *A; -#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) +#if (SLUD_VERSION_>=63) dScalePermstruct_t *ScalePermstruct; dLUstruct_t *LUstruct; dSOLVEstruct_t SOLVEstruct; @@ -259,9 +259,9 @@ int amg_dsludist_solve(int itrans, int n, int nrhs, trans_t trans; double drop_tol = 0.0; double *berr; -#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) || defined(SLUD_VERSION_6) ||defined(SLUD_VERSION_5) +#if (SLUD_VERSION_>=50) superlu_dist_options_t options; -#elif defined(SLUD_VERSION_4)|| defined(SLUD_VERSION_3) +#elif (SLUD_VERSION_>=30) superlu_options_t options; #else choke_on_me; @@ -331,7 +331,7 @@ int amg_dsludist_free(void *f_factors) */ #ifdef Have_SLUDist_ SuperMatrix *A; -#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) +#if (SLUD_VERSION_>=63) dScalePermstruct_t *ScalePermstruct; dLUstruct_t *LUstruct; dSOLVEstruct_t SOLVEstruct; @@ -345,9 +345,9 @@ int amg_dsludist_free(void *f_factors) trans_t trans; double drop_tol = 0.0; double *berr; -#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7)||defined(SLUD_VERSION_6)||defined(SLUD_VERSION_5) +#if (SLUD_VERSION_>=50) superlu_dist_options_t options; -#elif defined(SLUD_VERSION_4)||defined(SLUD_VERSION_3) +#elif (SLUD_VERSION_>=30) superlu_options_t options; #else choke_on_me; @@ -368,7 +368,7 @@ int amg_dsludist_free(void *f_factors) // we either have a leak or a segfault here. // To be investigated further. //Destroy_CompRowLoc_Matrix_dist(A); -#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) +#if (SLUD_VERSION_>=63) dScalePermstructFree(ScalePermstruct); dLUstructFree(LUstruct); #else diff --git a/amgprec/impl/amg_zslud_interface.c b/amgprec/impl/amg_zslud_interface.c index 95b9f4fa..6170772a 100644 --- a/amgprec/impl/amg_zslud_interface.c +++ b/amgprec/impl/amg_zslud_interface.c @@ -94,7 +94,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define HANDLE_SIZE 8 -#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) +#if (SLUD_VERSION_>=63) typedef struct { SuperMatrix *A; zLUstruct_t *LUstruct; @@ -142,7 +142,7 @@ int amg_zsludist_fact(int n, int nl, int nnzl, int ffstr, SuperMatrix *A; NRformat_loc *Astore; -#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) +#if (SLUD_VERSION_>=63) zScalePermstruct_t *ScalePermstruct; zLUstruct_t *LUstruct; zSOLVEstruct_t SOLVEstruct; @@ -155,9 +155,9 @@ int amg_zsludist_fact(int n, int nl, int nnzl, int ffstr, int i, panel_size, permc_spec, relax, info; trans_t trans; double drop_tol = 0.0,berr[1]; -#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) || defined(SLUD_VERSION_6)||defined(SLUD_VERSION_5) +#if (SLUD_VERSION_>=50) superlu_dist_options_t options; -#elif defined(SLUD_VERSION_4)||defined(SLUD_VERSION_3) +#elif (SLUD_VERSION_>=30) superlu_options_t options; #else choke_on_me; @@ -181,7 +181,7 @@ int amg_zsludist_fact(int n, int nl, int nnzl, int ffstr, SLU_NR_loc, SLU_Z, SLU_GE); /* Initialize ScalePermstruct and LUstruct. */ -#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) +#if (SLUD_VERSION_>=63) ScalePermstruct = (zScalePermstruct_t *) SUPERLU_MALLOC(sizeof(zScalePermstruct_t)); LUstruct = (zLUstruct_t *) SUPERLU_MALLOC(sizeof(zLUstruct_t)); zScalePermstructInit(n,n, ScalePermstruct); @@ -190,11 +190,11 @@ int amg_zsludist_fact(int n, int nl, int nnzl, int ffstr, LUstruct = (LUstruct_t *) SUPERLU_MALLOC(sizeof(LUstruct_t)); ScalePermstructInit(n,n, ScalePermstruct); #endif -#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) +#if (SLUD_VERSION_>=63) zLUstructInit(n, LUstruct); -#elif defined(SLUD_VERSION_4) || defined(SLUD_VERSION_5) || defined(SLUD_VERSION_6) +#elif (SLUD_VERSION_>=40) LUstructInit(n, LUstruct); -#elif defined(SLUD_VERSION_3) +#elif (SLUD_VERSION_>=30) LUstructInit(n,n, LUstruct); #else choke_on_me; @@ -257,7 +257,7 @@ int amg_zsludist_solve(int itrans, int n, int nrhs, */ #ifdef Have_SLUDist_ SuperMatrix *A; -#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) +#if (SLUD_VERSION_>=63) zScalePermstruct_t *ScalePermstruct; zLUstruct_t *LUstruct; zSOLVEstruct_t SOLVEstruct; @@ -271,9 +271,9 @@ int amg_zsludist_solve(int itrans, int n, int nrhs, trans_t trans; double drop_tol = 0.0; double *berr; -#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) || defined(SLUD_VERSION_6) ||defined(SLUD_VERSION_5) +#if (SLUD_VERSION_>=50) superlu_dist_options_t options; -#elif defined(SLUD_VERSION_4)|| defined(SLUD_VERSION_3) +#elif (SLUD_VERSION_>=30) superlu_options_t options; #else choke_on_me; @@ -343,7 +343,7 @@ int amg_zsludist_free(void *f_factors) */ #ifdef Have_SLUDist_ SuperMatrix *A; -#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) +#if (SLUD_VERSION_>=63) zScalePermstruct_t *ScalePermstruct; zLUstruct_t *LUstruct; zSOLVEstruct_t SOLVEstruct; @@ -357,9 +357,9 @@ int amg_zsludist_free(void *f_factors) trans_t trans; double drop_tol = 0.0; double *berr; -#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7)||defined(SLUD_VERSION_6)||defined(SLUD_VERSION_5) +#if (SLUD_VERSION_>=50) superlu_dist_options_t options; -#elif defined(SLUD_VERSION_4)||defined(SLUD_VERSION_3) +#elif (SLUD_VERSION_>=30) superlu_options_t options; #else choke_on_me; @@ -380,7 +380,7 @@ int amg_zsludist_free(void *f_factors) // we either have a leak or a segfault here. // To be investigated further. //Destroy_CompRowLoc_Matrix_dist(A); -#if defined(SLUD_VERSION_63) || defined(SLUD_VERSION_7) +#if (SLUD_VERSION_>=63) zScalePermstructFree(ScalePermstruct); zLUstructFree(LUstruct); #else diff --git a/configure b/configure index f22332bc..7f1305d8 100755 --- a/configure +++ b/configure @@ -9307,14 +9307,10 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "x$amg4psblas_cv_have_superludist" == "xyes" ; then - pac_sludist_version="$amg4psblas_cv_superludist_major"; - if (($amg4psblas_cv_superludist_major==6)); then - if (($amg4psblas_cv_superludist_minor>=3)); then - pac_sludist_version="63"; - fi - fi + pac_sludist_version="$amg4psblas_cv_superludist_major$amg4psblas_cv_superludist_minor"; + SLUDIST_FLAGS="" - SLUDIST_FLAGS="-DHave_SLUDist_ -DSLUD_VERSION_$pac_sludist_version $SLUDIST_INCLUDES" + SLUDIST_FLAGS="-DHave_SLUDist_ -DSLUD_VERSION_="$pac_sludist_version" $SLUDIST_INCLUDES" FDEFINES="$amg_cv_define_prepend-DHAVE_SLUDIST_ $FDEFINES" else SLUDIST_FLAGS="" diff --git a/configure.ac b/configure.ac index e3869c3d..7e185bc9 100755 --- a/configure.ac +++ b/configure.ac @@ -707,14 +707,10 @@ fi PAC_CHECK_SUPERLUDIST() if test "x$amg4psblas_cv_have_superludist" == "xyes" ; then - pac_sludist_version="$amg4psblas_cv_superludist_major"; - if (($amg4psblas_cv_superludist_major==6)); then - if (($amg4psblas_cv_superludist_minor>=3)); then - pac_sludist_version="63"; - fi - fi + pac_sludist_version="$amg4psblas_cv_superludist_major$amg4psblas_cv_superludist_minor"; + SLUDIST_FLAGS="" - SLUDIST_FLAGS="-DHave_SLUDist_ -DSLUD_VERSION_$pac_sludist_version $SLUDIST_INCLUDES" + SLUDIST_FLAGS="-DHave_SLUDist_ -DSLUD_VERSION_="$pac_sludist_version" $SLUDIST_INCLUDES" FDEFINES="$amg_cv_define_prepend-DHAVE_SLUDIST_ $FDEFINES" else SLUDIST_FLAGS="" From 58d00b16c61de0642ad02a82a0e31186a591c915 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Thu, 7 Apr 2022 10:36:28 +0200 Subject: [PATCH 33/36] Add message to configure --- configure | 3 ++- configure.ac | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/configure b/configure index 7f1305d8..a8e4de6f 100755 --- a/configure +++ b/configure @@ -9308,7 +9308,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "x$amg4psblas_cv_have_superludist" == "xyes" ; then pac_sludist_version="$amg4psblas_cv_superludist_major$amg4psblas_cv_superludist_minor"; - + { $as_echo "$as_me:${as_lineno-$LINENO}: Configuring with SuperLU_DIST version flag $pac_sludist_version" >&5 +$as_echo "$as_me: Configuring with SuperLU_DIST version flag $pac_sludist_version" >&6;} SLUDIST_FLAGS="" SLUDIST_FLAGS="-DHave_SLUDist_ -DSLUD_VERSION_="$pac_sludist_version" $SLUDIST_INCLUDES" FDEFINES="$amg_cv_define_prepend-DHAVE_SLUDIST_ $FDEFINES" diff --git a/configure.ac b/configure.ac index 7e185bc9..826a199d 100755 --- a/configure.ac +++ b/configure.ac @@ -707,8 +707,8 @@ fi PAC_CHECK_SUPERLUDIST() if test "x$amg4psblas_cv_have_superludist" == "xyes" ; then - pac_sludist_version="$amg4psblas_cv_superludist_major$amg4psblas_cv_superludist_minor"; - + pac_sludist_version="$amg4psblas_cv_superludist_major$amg4psblas_cv_superludist_minor"; + AC_MSG_NOTICE([Configuring with SuperLU_DIST version flag $pac_sludist_version]) SLUDIST_FLAGS="" SLUDIST_FLAGS="-DHave_SLUDist_ -DSLUD_VERSION_="$pac_sludist_version" $SLUDIST_INCLUDES" FDEFINES="$amg_cv_define_prepend-DHAVE_SLUDIST_ $FDEFINES" From 697f325df629ecb6d206d3fdd1343e33f614f957 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Wed, 13 Apr 2022 16:36:32 +0200 Subject: [PATCH 34/36] Fix use of SuperLU_Dist, configure checks and ifdefs --- amgprec/amg_d_sludist_solver.F90 | 43 +++++++++++++++++++++++--------- amgprec/amg_z_sludist_solver.F90 | 42 ++++++++++++++++++++++--------- config/pac.m4 | 4 ++- configure | 8 ++++-- 4 files changed, 70 insertions(+), 27 deletions(-) diff --git a/amgprec/amg_d_sludist_solver.F90 b/amgprec/amg_d_sludist_solver.F90 index a196bbfa..40c4925f 100644 --- a/amgprec/amg_d_sludist_solver.F90 +++ b/amgprec/amg_d_sludist_solver.F90 @@ -52,7 +52,7 @@ module amg_d_sludist_solver use iso_c_binding use amg_d_base_solver_mod -#if defined(LPK8) +#if (!defined(HAVE_SLUDIST_)) || defined(IPK8) type, extends(amg_d_base_solver_type) :: amg_d_sludist_solver_type @@ -270,11 +270,13 @@ contains ! Local variables type(psb_dspmat_type) :: atmp type(psb_d_csr_sparse_mat) :: acsr - integer :: n_row,n_col, nrow_a, nztota, nglob, nzt, npr, npc - integer :: ifrst, ibcheck + integer(psb_lpk_), allocatable :: gia(:), gja(:) type(psb_ctxt_type) :: ctxt - integer :: np,me,i, err_act, debug_unit, debug_level - character(len=20) :: name='d_sludist_solver_bld', ch_err + integer(psb_lpk_) :: lfrst + integer(psb_ipk_) :: n_row,n_col, nrow_a, nztota, nglob, nzt, npr, npc + integer(psb_ipk_) :: ifrst, ibcheck + integer(psb_ipk_) :: np,me,i, err_act, debug_unit, debug_level + character(len=20) :: name='d_sludist_solver_bld', ch_err info=psb_success_ call psb_erractionsave(err_act) @@ -293,19 +295,37 @@ contains n_col = desc_a%get_local_cols() nglob = desc_a%get_global_rows() - call a%cscnv(atmp,info,type='coo') + ! + ! Strategy here is as follows: because a call to SLUDIST + ! as a gobal solver is mostly done at the coarsest level, + ! even if we start from a problem requiring 8 bytes, chances + ! are that the global size will be suitable for 4 bytes + ! anyway, so we hope for the best, and throw an error + ! if something goes wrong. + ! + if (nglob > huge(1_psb_ipk_)) then + write(0,*) me,' ',trim(name),': Error: overflow of local indices ' + info=psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 + end if + + call a%cscnv(atmp,info,type='csr') + ! This in case we are dealing with AS call psb_rwextd(n_row,atmp,info,b=b) - call atmp%cscnv(info,type='csr',dupl=psb_dupl_add_) call atmp%mv_to(acsr) nrow_a = acsr%get_nrows() nztota = acsr%get_nzeros() + call psb_loc_to_glob(ione,lfrst,desc_a,info) + ! Fix the entries to call C-base SuperLU - call psb_loc_to_glob(1,ifrst,desc_a,info) - call psb_loc_to_glob(nrow_a,ibcheck,desc_a,info) - call psb_loc_to_glob(acsr%ja(1:nztota),desc_a,info,iact='I') + call psb_realloc(nztota,gja,info) + call psb_loc_to_glob(acsr%ja(1:nztota),gja(1:nztota), desc_a, info, iact='I') + acsr%ja(1:nztota) = gja(1:nztota) acsr%ja(:) = acsr%ja(:) - 1 acsr%irp(:) = acsr%irp(:) - 1 - ifrst = ifrst - 1 + ifrst = lfrst - 1 + info = amg_dsludist_fact(nglob,nrow_a,nztota,ifrst,& & acsr%val,acsr%irp,acsr%ja,sv%lufactors,& & npr,npc) @@ -318,7 +338,6 @@ contains end if call acsr%free() - call atmp%free() if (debug_level >= psb_debug_outer_) & & write(debug_unit,*) me,' ',trim(name),' end' diff --git a/amgprec/amg_z_sludist_solver.F90 b/amgprec/amg_z_sludist_solver.F90 index 50cd39b4..1414353c 100644 --- a/amgprec/amg_z_sludist_solver.F90 +++ b/amgprec/amg_z_sludist_solver.F90 @@ -52,7 +52,7 @@ module amg_z_sludist_solver use iso_c_binding use amg_z_base_solver_mod -#if defined(LPK8) +#if (!defined(HAVE_SLUDIST_)) || defined(IPK8) type, extends(amg_z_base_solver_type) :: amg_z_sludist_solver_type @@ -270,11 +270,13 @@ contains ! Local variables type(psb_zspmat_type) :: atmp type(psb_z_csr_sparse_mat) :: acsr - integer :: n_row,n_col, nrow_a, nztota, nglob, nzt, npr, npc - integer :: ifrst, ibcheck + integer(psb_lpk_), allocatable :: gia(:), gja(:) type(psb_ctxt_type) :: ctxt - integer :: np,me,i, err_act, debug_unit, debug_level - character(len=20) :: name='z_sludist_solver_bld', ch_err + integer(psb_lpk_) :: lfrst + integer(psb_ipk_) :: n_row,n_col, nrow_a, nztota, nglob, nzt, npr, npc + integer(psb_ipk_) :: ifrst, ibcheck + integer(psb_ipk_) :: np,me,i, err_act, debug_unit, debug_level + character(len=20) :: name='z_sludist_solver_bld', ch_err info=psb_success_ call psb_erractionsave(err_act) @@ -293,19 +295,36 @@ contains n_col = desc_a%get_local_cols() nglob = desc_a%get_global_rows() - call a%cscnv(atmp,info,type='coo') + ! + ! Strategy here is as follows: because a call to SLUDIST + ! as a gobal solver is mostly done at the coarsest level, + ! even if we start from a problem requiring 8 bytes, chances + ! are that the global size will be suitable for 4 bytes + ! anyway, so we hope for the best, and throw an error + ! if something goes wrong. + ! + if (nglob > huge(1_psb_ipk_)) then + write(0,*) me,' ',trim(name),': Error: overflow of local indices ' + info=psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 + end if + + call a%cscnv(atmp,info,type='csr') + ! This in case we are dealing with AS call psb_rwextd(n_row,atmp,info,b=b) - call atmp%cscnv(info,type='csr',dupl=psb_dupl_add_) call atmp%mv_to(acsr) nrow_a = acsr%get_nrows() nztota = acsr%get_nzeros() + call psb_loc_to_glob(ione,lfrst,desc_a,info) + ! Fix the entries to call C-base SuperLU - call psb_loc_to_glob(1,ifrst,desc_a,info) - call psb_loc_to_glob(nrow_a,ibcheck,desc_a,info) - call psb_loc_to_glob(acsr%ja(1:nztota),desc_a,info,iact='I') + call psb_realloc(nztota,gja,info) + call psb_loc_to_glob(acsr%ja(1:nztota),gja(1:nztota), desc_a, info, iact='I') + acsr%ja(1:nztota) = gja(1:nztota) acsr%ja(:) = acsr%ja(:) - 1 acsr%irp(:) = acsr%irp(:) - 1 - ifrst = ifrst - 1 + ifrst = lfrst - 1 info = amg_zsludist_fact(nglob,nrow_a,nztota,ifrst,& & acsr%val,acsr%irp,acsr%ja,sv%lufactors,& & npr,npc) @@ -318,7 +337,6 @@ contains end if call acsr%free() - call atmp%free() if (debug_level >= psb_debug_outer_) & & write(debug_unit,*) me,' ',trim(name),' end' diff --git a/config/pac.m4 b/config/pac.m4 index c26ec2a4..745bbfa6 100644 --- a/config/pac.m4 +++ b/config/pac.m4 @@ -852,6 +852,7 @@ if test "x$pac_sludist_header_ok" == "xyes" ; then dnl Maybe lib? SLUDIST_LIBS="$amg4psblas_cv_superludist -L$amg4psblas_cv_superludistdir/lib"; LIBS="$SLUDIST_LIBS -lm $save_LIBS"; + AC_MSG_CHECKING([for superlu_malloc_dist in $SLUDIST_LIBS]) AC_TRY_LINK_FUNC(superlu_malloc_dist, [amg4psblas_cv_have_superludist=yes;pac_sludist_lib_ok=yes;], [amg4psblas_cv_have_superludist=no;pac_sludist_lib_ok=no; @@ -861,12 +862,13 @@ if test "x$pac_sludist_header_ok" == "xyes" ; then dnl Maybe lib64? SLUDIST_LIBS="$amg4psblas_cv_superludist -L$amg4psblas_cv_superludistdir/lib64"; LIBS="$SLUDIST_LIBS -lm $save_LIBS"; + AC_MSG_CHECKING([for superlu_malloc_dist in $SLUDIST_LIBS]) AC_TRY_LINK_FUNC(superlu_malloc_dist, [amg4psblas_cv_have_superludist=yes;pac_sludist_lib_ok=yes;], [amg4psblas_cv_have_superludist=no;pac_sludist_lib_ok=no; SLUDIST_LIBS="";SLUDIST_INCLUDES=""]) fi - AC_MSG_RESULT($pac_sludist_lib_ok) + AC_MSG_RESULT([$pac_sludist_lib_ok $SLUDIST_LIBS]) fi if test "x$pac_sludist_lib_ok" == "xyes" ; then diff --git a/configure b/configure index a8e4de6f..1c335534 100755 --- a/configure +++ b/configure @@ -9107,6 +9107,8 @@ rm -f core conftest.err conftest.$ac_objext \ if test "x$pac_sludist_lib_ok" == "xno" ; then SLUDIST_LIBS="$amg4psblas_cv_superludist -L$amg4psblas_cv_superludistdir/lib"; LIBS="$SLUDIST_LIBS -lm $save_LIBS"; + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for superlu_malloc_dist in $SLUDIST_LIBS" >&5 +$as_echo_n "checking for superlu_malloc_dist in $SLUDIST_LIBS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -9137,6 +9139,8 @@ rm -f core conftest.err conftest.$ac_objext \ if test "x$pac_sludist_lib_ok" == "xno" ; then SLUDIST_LIBS="$amg4psblas_cv_superludist -L$amg4psblas_cv_superludistdir/lib64"; LIBS="$SLUDIST_LIBS -lm $save_LIBS"; + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for superlu_malloc_dist in $SLUDIST_LIBS" >&5 +$as_echo_n "checking for superlu_malloc_dist in $SLUDIST_LIBS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -9164,8 +9168,8 @@ fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pac_sludist_lib_ok" >&5 -$as_echo "$pac_sludist_lib_ok" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pac_sludist_lib_ok $SLUDIST_LIBS" >&5 +$as_echo "$pac_sludist_lib_ok $SLUDIST_LIBS" >&6; } fi if test "x$pac_sludist_lib_ok" == "xyes" ; then From ac42d7b1dd8d369cfd496116d61e6823f6f4348b Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Thu, 14 Apr 2022 20:33:02 +0200 Subject: [PATCH 35/36] Sync configure with configure_n --- configure | 1232 +++++++++++++++++++++++++++++++++++++++++++++++- configure.ac | 81 +++- configure_n | 75 ++- configure_n.ac | 16 +- 4 files changed, 1384 insertions(+), 20 deletions(-) diff --git a/configure b/configure index 1c335534..4d7ac45a 100755 --- a/configure +++ b/configure @@ -658,9 +658,16 @@ LAPACK_LIBS EGREP GREP CPP +MPICXX MPIFC MPILIBS MPICC +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE @@ -758,10 +765,12 @@ enable_silent_rules enable_dependency_tracking enable_serial with_ccopt +with_cxxopt with_fcopt with_libs with_clibs with_flibs +with_cxxlibs with_library_path with_include_path with_module_path @@ -797,8 +806,12 @@ LIBS CC CFLAGS CPPFLAGS +CXX +CXXFLAGS +CCC MPICC MPIFC +MPICXX CPP' @@ -1447,6 +1460,8 @@ Optional Packages: Specify the directory for PSBLAS library. --with-ccopt additional [CCOPT] flags to be added: will prepend to [CCOPT] + --with-cxxopt additional [CXXOPT] flags to be added: will prepend + to [CXXOPT] --with-fcopt additional [FCOPT] flags to be added: will prepend to [FCOPT] --with-libs List additional link flags here. For example, @@ -1456,6 +1471,8 @@ Optional Packages: to [CLIBS] --with-flibs additional [FLIBS] flags to be added: will prepend to [FLIBS] + --with-cxxlibs additional [CXXLIBS] flags to be added: will prepend + to [CXXLIBS] --with-library-path additional [LIBRARYPATH] flags to be added: will prepend to [LIBRARYPATH] --with-include-path additional [INCLUDEPATH] flags to be added: will @@ -1516,8 +1533,11 @@ Some influential environment variables: CFLAGS C compiler flags CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory + CXX C++ compiler command + CXXFLAGS C++ compiler flags MPICC MPI C compiler command MPIFC MPI Fortran compiler command + MPICXX MPI C++ compiler command CPP C preprocessor Use these variables to override the choices made by `configure' or to help @@ -1676,6 +1696,44 @@ fi } # ac_fn_c_try_compile +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. @@ -1835,6 +1893,119 @@ fi } # ac_fn_fc_try_link +# ac_fn_cxx_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_link + +# ac_fn_cxx_check_func LINENO FUNC VAR +# ------------------------------------ +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_cxx_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_cxx_check_func + # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes @@ -4366,6 +4537,393 @@ fi CFLAGS="$save_CFLAGS"; +save_CXXFLAGS="$CXXFLAGS"; +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in CC xlc++ icpc g++ + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in CC xlc++ icpc g++ +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + +CXXFLAGS="$save_CXXFLAGS"; # Sanity checks, although redundant (useful when debugging this configure.ac)! @@ -4388,6 +4946,307 @@ if eval "$FC -qversion 2>&1 | grep XL 2>/dev/null" ; then # since (as far as it is known to us) -WF, is not used in earlier versions. # More problems could be undocumented yet. fi + +if test "X$CC" == "X" ; then + as_fn_error $? "Problem : No C compiler specified nor found!" "$LINENO" 5 +fi + case $ac_cv_prog_cc_stdc in #( + no) : + ac_cv_prog_cc_c99=no; ac_cv_prog_cc_c89=no ;; #( + *) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 +$as_echo_n "checking for $CC option to accept ISO C99... " >&6; } +if ${ac_cv_prog_cc_c99+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +#include + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +#define debug(...) fprintf (stderr, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} + +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + your preprocessor is broken; +#endif +#if BIG_OK +#else + your preprocessor is broken; +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; + +struct incomplete_array +{ + int datasize; + double data[]; +}; + +struct named_init { + int number; + const wchar_t *name; + double average; +}; + +typedef const char *ccp; + +static inline int +test_restrict (ccp restrict text) +{ + // See if C++-style comments work. + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\0'; ++i) + continue; + return 0; +} + +// Check varargs and va_copy. +static void +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); + + const char *str; + int number; + float fnumber; + + while (*format) + { + switch (*format++) + { + case 's': // string + str = va_arg (args_copy, const char *); + break; + case 'd': // int + number = va_arg (args_copy, int); + break; + case 'f': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); +} + +int +main () +{ + + // Check bool. + _Bool success = false; + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + test_varargs ("s, d' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' + || dynamic_array[ni.number - 1] != 543); + + ; + return 0; +} +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c99" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c99" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +$as_echo "$ac_cv_prog_cc_c99" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c99" != xno; then : + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 +else + ac_cv_prog_cc_stdc=no +fi + +fi + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO Standard C" >&5 +$as_echo_n "checking for $CC option to accept ISO Standard C... " >&6; } + if ${ac_cv_prog_cc_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +fi + + case $ac_cv_prog_cc_stdc in #( + no) : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; #( + '') : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; #( + *) : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_stdc" >&5 +$as_echo "$ac_cv_prog_cc_stdc" >&6; } ;; +esac + +if test "x$ac_cv_prog_cc_stdc" == "xno" ; then + as_fn_error $? "Problem : Need a C99 compiler ! " "$LINENO" 5 +else + C99OPT="$ac_cv_prog_cc_stdc"; +fi ############################################################################### # Suitable MPI compilers detection ############################################################################### @@ -4420,6 +5279,7 @@ if test x"$pac_cv_serial_mpi" == x"yes" ; then FAKEMPI="fakempi.o"; MPIFC="$FC"; MPICC="$CC"; + MPICXX="$CXX"; CXXDEFINES="-DSERIAL_MPI $CXXDEFINES"; else @@ -4941,9 +5801,253 @@ $as_echo "#define HAVE_MPI 1" >>confdefs.h : fi +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +if test "X$MPICXX" = "X" ; then + # This is our MPICC compiler preference: it will override ACX_MPI's first try. + for ac_prog in mpxlc++ mpiicpc mpicxx +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MPICXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MPICXX"; then + ac_cv_prog_MPICXX="$MPICXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MPICXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MPICXX=$ac_cv_prog_MPICXX +if test -n "$MPICXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MPICXX" >&5 +$as_echo "$MPICXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$MPICXX" && break +done + +fi + + + + + + + for ac_prog in mpic++ mpicxx mpiCC hcp mpxlC_r mpxlC mpCC cmpic++ +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MPICXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MPICXX"; then + ac_cv_prog_MPICXX="$MPICXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MPICXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MPICXX=$ac_cv_prog_MPICXX +if test -n "$MPICXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MPICXX" >&5 +$as_echo "$MPICXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$MPICXX" && break +done +test -n "$MPICXX" || MPICXX="$CXX" + + acx_mpi_save_CXX="$CXX" + CXX="$MPICXX" + + + +if test x = x"$MPILIBS"; then + ac_fn_cxx_check_func "$LINENO" "MPI_Init" "ac_cv_func_MPI_Init" +if test "x$ac_cv_func_MPI_Init" = xyes; then : + MPILIBS=" " +fi + +fi + +if test x = x"$MPILIBS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MPI_Init in -lmpi" >&5 +$as_echo_n "checking for MPI_Init in -lmpi... " >&6; } +if ${ac_cv_lib_mpi_MPI_Init+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmpi $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char MPI_Init (); +int +main () +{ +return MPI_Init (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_mpi_MPI_Init=yes +else + ac_cv_lib_mpi_MPI_Init=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpi_MPI_Init" >&5 +$as_echo "$ac_cv_lib_mpi_MPI_Init" >&6; } +if test "x$ac_cv_lib_mpi_MPI_Init" = xyes; then : + MPILIBS="-lmpi" +fi + +fi +if test x = x"$MPILIBS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MPI_Init in -lmpich" >&5 +$as_echo_n "checking for MPI_Init in -lmpich... " >&6; } +if ${ac_cv_lib_mpich_MPI_Init+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmpich $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char MPI_Init (); +int +main () +{ +return MPI_Init (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_mpich_MPI_Init=yes +else + ac_cv_lib_mpich_MPI_Init=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpich_MPI_Init" >&5 +$as_echo "$ac_cv_lib_mpich_MPI_Init" >&6; } +if test "x$ac_cv_lib_mpich_MPI_Init" = xyes; then : + MPILIBS="-lmpich" +fi + +fi + +if test x != x"$MPILIBS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mpi.h" >&5 +$as_echo_n "checking for mpi.h... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + MPILIBS="" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +CXX="$acx_mpi_save_CXX" + + + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x = x"$MPILIBS"; then + as_fn_error $? "Cannot find any suitable MPI implementation for C++" "$LINENO" 5 + : +else + +$as_echo "#define HAVE_MPI 1" >>confdefs.h + + : +fi + +ac_ext=${ac_fc_srcext-f} +ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' +ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_fc_compiler_gnu + FC="$MPIFC" ; CC="$MPICC"; +CXX="$MPICXX"; fi ac_ext=c @@ -4989,6 +6093,24 @@ fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether additional CXXOPT flags should be added (should be invoked only once)" >&5 +$as_echo_n "checking whether additional CXXOPT flags should be added (should be invoked only once)... " >&6; } + +# Check whether --with-cxxopt was given. +if test "${with_cxxopt+set}" = set; then : + withval=$with_cxxopt; +CXXOPT="${withval} ${CXXOPT}" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: CXXOPT = ${CXXOPT}" >&5 +$as_echo "CXXOPT = ${CXXOPT}" >&6; } + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether additional FCOPT flags should be added (should be invoked only once)" >&5 $as_echo_n "checking whether additional FCOPT flags should be added (should be invoked only once)... " >&6; } @@ -5062,6 +6184,24 @@ fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether additional CXXLIBS flags should be added (should be invoked only once)" >&5 +$as_echo_n "checking whether additional CXXLIBS flags should be added (should be invoked only once)... " >&6; } + +# Check whether --with-cxxlibs was given. +if test "${with_cxxlibs+set}" = set; then : + withval=$with_cxxlibs; +CXXLIBS="${withval} ${CXXLIBS}" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: CXXLIBS = ${CXXLIBS}" >&5 +$as_echo "CXXLIBS = ${CXXLIBS}" >&6; } + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether additional LIBRARYPATH flags should be added (should be invoked only once)" >&5 $as_echo_n "checking whether additional LIBRARYPATH flags should be added (should be invoked only once)... " >&6; } @@ -6007,6 +7147,36 @@ if test "X$CCOPT" == "X" ; then fi fi #CFLAGS="${CCOPT}" +if test "X$CXXOPT" == "X" ; then + CXXOPT="$CXXFLAGS"; +fi +if test "X$CXXOPT" == "X" ; then + if test "X$psblas_cv_fc" == "Xgcc" ; then + # note that no space should be placed around the equality symbol in assignements + # Note : 'native' is valid _only_ on GCC/x86 (32/64 bits) + CXXOPT="-g -O3 $CXXOPT" + + elif test "X$psblas_cv_fc" == X"xlf" ; then + # XL compiler : consider using -qarch=auto + CXXOPT="-O3 -qarch=auto $CXXOPT" + elif test "X$psblas_cv_fc" == X"ifc" ; then + # other compilers .. + CXXOPT="-O3 $CXXOPT" + elif test "X$psblas_cv_fc" == X"pg" ; then + # other compilers .. + CXXCOPT="-fast $CXXOPT" + # NOTE : PG & Sun use -fast instead -O3 + elif test "X$psblas_cv_fc" == X"sun" ; then + # other compilers .. + CXXOPT="-fast $CXXOPT" + elif test "X$psblas_cv_fc" == X"cray" ; then + CXXOPT="-O3 $CXXOPT" + MPICXX="CC" + else + CXXOPT="-g -O3 $CXXOPT" + fi +fi + # Honor FCFLAGS if they were specified explicitly, but --with-fcopt take precedence if test "X$FCOPT" == "X" ; then @@ -6055,7 +7225,8 @@ fi ############################################################################## FC=${FC} CC=${CC} -MPCC=${MPICC} +CXX=${CXX} +CCOPT="$CCOPT $C99OPT" ############################################################################## @@ -6207,6 +7378,61 @@ fi if test "X$FLINK" == "X" ; then FLINK=${MPF90} fi +# Custom test : do we have a module or include for MPI Fortran interface? +if test x"$pac_cv_serial_mpi" == x"yes" ; then + FDEFINES="$psblas_cv_define_prepend-DSERIAL_MPI $psblas_cv_define_prepend-DMPI_MOD $FDEFINES"; +else + PAC_FORTRAN_CHECK_HAVE_MPI_MOD_F08() + if test x"$pac_cv_mpi_f08" == x"yes" ; then + FDEFINES="$psblas_cv_define_prepend-DMPI_MOD $FDEFINES"; + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran MPI mod" >&5 +$as_echo_n "checking for Fortran MPI mod... " >&6; } + ac_ext=${ac_fc_srcext-f} +ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' +ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_fc_compiler_gnu + + ac_exeext='' + ac_ext='F90' + ac_fc=${MPIFC-$FC}; + cat > conftest.$ac_ext <<_ACEOF + + program test + use mpi + end program test +_ACEOF +if ac_fn_fc_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + FDEFINES="$psblas_cv_define_prepend-DMPI_MOD $FDEFINES" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + FDEFINES="$psblas_cv_define_prepend-DMPI_H $FDEFINES" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + fi +fi + +FLINK="$MPIFC" +PAC_ARG_OPENMP() +if test x"$pac_cv_openmp" == x"yes" ; then + FDEFINES="$psblas_cv_define_prepend-DOPENMP $FDEFINES"; + CDEFINES="-DOPENMP $CDEFINES"; + FCOPT="$FCOPT $pac_cv_openmp_fcopt"; + CCOPT="$CCOPT $pac_cv_openmp_ccopt"; + FLINK="$FLINK $pac_cv_openmp_fcopt"; +fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working installation of PSBLAS" >&5 $as_echo_n "checking for working installation of PSBLAS... " >&6; } @@ -9543,6 +10769,10 @@ if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 diff --git a/configure.ac b/configure.ac index 826a199d..03fb8bd1 100755 --- a/configure.ac +++ b/configure.ac @@ -133,6 +133,9 @@ FCFLAGS="$save_FCFLAGS"; save_CFLAGS="$CFLAGS"; AC_PROG_CC([cc xlc pgcc icc gcc ]) CFLAGS="$save_CFLAGS"; +save_CXXFLAGS="$CXXFLAGS"; +AC_PROG_CXX([CC xlc++ icpc g++]) +CXXFLAGS="$save_CXXFLAGS"; dnl AC_PROG_CXX dnl AC_PROG_F90 doesn't exist, at the time of writing this ! @@ -158,6 +161,16 @@ if eval "$FC -qversion 2>&1 | grep XL 2>/dev/null" ; then # since (as far as it is known to us) -WF, is not used in earlier versions. # More problems could be undocumented yet. fi + +if test "X$CC" == "X" ; then + AC_MSG_ERROR([Problem : No C compiler specified nor found!]) +fi +AC_PROG_CC_STDC() +if test "x$ac_cv_prog_cc_stdc" == "xno" ; then + AC_MSG_ERROR([Problem : Need a C99 compiler ! ]) +else + C99OPT="$ac_cv_prog_cc_stdc"; +fi ############################################################################### # Suitable MPI compilers detection ############################################################################### @@ -171,6 +184,7 @@ if test x"$pac_cv_serial_mpi" == x"yes" ; then FAKEMPI="fakempi.o"; MPIFC="$FC"; MPICC="$CC"; + MPICXX="$CXX"; CXXDEFINES="-DSERIAL_MPI $CXXDEFINES"; else @@ -190,9 +204,17 @@ if test "X$MPIFC" = "X" ; then fi ACX_MPI([], [AC_MSG_ERROR([[Cannot find any suitable MPI implementation for Fortran]])]) +AC_LANG([C++]) +if test "X$MPICXX" = "X" ; then + # This is our MPICC compiler preference: it will override ACX_MPI's first try. + AC_CHECK_PROGS([MPICXX],[mpxlc++ mpiicpc mpicxx]) +fi +ACX_MPI([], [AC_MSG_ERROR([[Cannot find any suitable MPI implementation for C++]])]) +AC_LANG([Fortran]) FC="$MPIFC" ; CC="$MPICC"; +CXX="$MPICXX"; fi AC_LANG([C]) @@ -217,10 +239,12 @@ fi dnl NOTE : no spaces before the comma, and no brackets before the second argument! PAC_ARG_WITH_FLAGS(ccopt,CCOPT) +PAC_ARG_WITH_FLAGS(cxxopt,CXXOPT) PAC_ARG_WITH_FLAGS(fcopt,FCOPT) PAC_ARG_WITH_LIBS PAC_ARG_WITH_FLAGS(clibs,CLIBS) PAC_ARG_WITH_FLAGS(flibs,FLIBS) +PAC_ARG_WITH_FLAGS(cxxlibs,CXXLIBS) dnl candidates for removal: PAC_ARG_WITH_FLAGS(library-path,LIBRARYPATH) @@ -409,6 +433,36 @@ if test "X$CCOPT" == "X" ; then fi fi #CFLAGS="${CCOPT}" +if test "X$CXXOPT" == "X" ; then + CXXOPT="$CXXFLAGS"; +fi +if test "X$CXXOPT" == "X" ; then + if test "X$psblas_cv_fc" == "Xgcc" ; then + # note that no space should be placed around the equality symbol in assignements + # Note : 'native' is valid _only_ on GCC/x86 (32/64 bits) + CXXOPT="-g -O3 $CXXOPT" + + elif test "X$psblas_cv_fc" == X"xlf" ; then + # XL compiler : consider using -qarch=auto + CXXOPT="-O3 -qarch=auto $CXXOPT" + elif test "X$psblas_cv_fc" == X"ifc" ; then + # other compilers .. + CXXOPT="-O3 $CXXOPT" + elif test "X$psblas_cv_fc" == X"pg" ; then + # other compilers .. + CXXCOPT="-fast $CXXOPT" + # NOTE : PG & Sun use -fast instead -O3 + elif test "X$psblas_cv_fc" == X"sun" ; then + # other compilers .. + CXXOPT="-fast $CXXOPT" + elif test "X$psblas_cv_fc" == X"cray" ; then + CXXOPT="-O3 $CXXOPT" + MPICXX="CC" + else + CXXOPT="-g -O3 $CXXOPT" + fi +fi + # Honor FCFLAGS if they were specified explicitly, but --with-fcopt take precedence if test "X$FCOPT" == "X" ; then @@ -457,7 +511,8 @@ fi ############################################################################## FC=${FC} CC=${CC} -MPCC=${MPICC} +CXX=${CXX} +CCOPT="$CCOPT $C99OPT" ############################################################################## @@ -492,6 +547,30 @@ fi if test "X$FLINK" == "X" ; then FLINK=${MPF90} fi +# Custom test : do we have a module or include for MPI Fortran interface? +if test x"$pac_cv_serial_mpi" == x"yes" ; then + FDEFINES="$psblas_cv_define_prepend-DSERIAL_MPI $psblas_cv_define_prepend-DMPI_MOD $FDEFINES"; +else + PAC_FORTRAN_CHECK_HAVE_MPI_MOD_F08() + if test x"$pac_cv_mpi_f08" == x"yes" ; then +dnl FDEFINES="$psblas_cv_define_prepend-DMPI_MOD_F08 $FDEFINES"; + FDEFINES="$psblas_cv_define_prepend-DMPI_MOD $FDEFINES"; + else + PAC_FORTRAN_CHECK_HAVE_MPI_MOD( + [FDEFINES="$psblas_cv_define_prepend-DMPI_MOD $FDEFINES"], + [FDEFINES="$psblas_cv_define_prepend-DMPI_H $FDEFINES"]) + fi +fi + +FLINK="$MPIFC" +PAC_ARG_OPENMP() +if test x"$pac_cv_openmp" == x"yes" ; then + FDEFINES="$psblas_cv_define_prepend-DOPENMP $FDEFINES"; + CDEFINES="-DOPENMP $CDEFINES"; + FCOPT="$FCOPT $pac_cv_openmp_fcopt"; + CCOPT="$CCOPT $pac_cv_openmp_ccopt"; + FLINK="$FLINK $pac_cv_openmp_fcopt"; +fi PAC_FORTRAN_HAVE_PSBLAS([AC_MSG_RESULT([yes.])], [AC_MSG_ERROR([no. Could not find working version of PSBLAS.])]) diff --git a/configure_n b/configure_n index 42999ca0..08c0b135 100755 --- a/configure_n +++ b/configure_n @@ -753,6 +753,7 @@ infodir docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -877,6 +878,7 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -1129,6 +1131,15 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1266,7 +1277,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1419,6 +1430,7 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -8087,6 +8099,44 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking support for Fortran ISO_C_BINDING module" >&5 +$as_echo_n "checking support for Fortran ISO_C_BINDING module... " >&6; } + ac_ext=${ac_fc_srcext-f} +ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' +ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_fc_compiler_gnu + + ac_exeext='' + ac_ext='f90' + ac_fc=${MPIFC-$FC}; + cat > conftest.$ac_ext <<_ACEOF + +program conftest + use iso_c_binding +end program conftest +_ACEOF +if ac_fn_fc_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + : +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + as_fn_error $? "Sorry, cannot build PSBLAS without support for ISO_C_BINDING. + Please get a Fortran compiler that supports it, e.g. GNU Fortran 4.8." "$LINENO" 5 + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ISO_FORTRAN_ENV" >&5 $as_echo_n "checking support for ISO_FORTRAN_ENV... " >&6; } ac_ext=${ac_fc_srcext-f} @@ -10706,6 +10756,8 @@ rm -f core conftest.err conftest.$ac_objext \ if test "x$pac_sludist_lib_ok" == "xno" ; then SLUDIST_LIBS="$amg4psblas_cv_superludist -L$amg4psblas_cv_superludistdir/lib"; LIBS="$SLUDIST_LIBS -lm $save_LIBS"; + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for superlu_malloc_dist in $SLUDIST_LIBS" >&5 +$as_echo_n "checking for superlu_malloc_dist in $SLUDIST_LIBS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -10736,6 +10788,8 @@ rm -f core conftest.err conftest.$ac_objext \ if test "x$pac_sludist_lib_ok" == "xno" ; then SLUDIST_LIBS="$amg4psblas_cv_superludist -L$amg4psblas_cv_superludistdir/lib64"; LIBS="$SLUDIST_LIBS -lm $save_LIBS"; + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for superlu_malloc_dist in $SLUDIST_LIBS" >&5 +$as_echo_n "checking for superlu_malloc_dist in $SLUDIST_LIBS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -10763,8 +10817,8 @@ fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pac_sludist_lib_ok" >&5 -$as_echo "$pac_sludist_lib_ok" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pac_sludist_lib_ok $SLUDIST_LIBS" >&5 +$as_echo "$pac_sludist_lib_ok $SLUDIST_LIBS" >&6; } fi if test "x$pac_sludist_lib_ok" == "xyes" ; then @@ -10906,14 +10960,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "x$amg4psblas_cv_have_superludist" == "xyes" ; then - pac_sludist_version="$amg4psblas_cv_superludist_major"; - if (($amg4psblas_cv_superludist_major==6)); then - if (($amg4psblas_cv_superludist_minor>=3)); then - pac_sludist_version="63"; - fi - fi + pac_sludist_version="$amg4psblas_cv_superludist_major$amg4psblas_cv_superludist_minor"; + { $as_echo "$as_me:${as_lineno-$LINENO}: Configuring with SuperLU_DIST version flag $pac_sludist_version" >&5 +$as_echo "$as_me: Configuring with SuperLU_DIST version flag $pac_sludist_version" >&6;} SLUDIST_FLAGS="" - SLUDIST_FLAGS="-DHave_SLUDist_ -DSLUD_VERSION_$pac_sludist_version $SLUDIST_INCLUDES" + SLUDIST_FLAGS="-DHave_SLUDist_ -DSLUD_VERSION_="$pac_sludist_version" $SLUDIST_INCLUDES" FDEFINES="$amg_cv_define_prepend-DHAVE_SLUDIST_ $FDEFINES" else SLUDIST_FLAGS="" @@ -12275,7 +12326,9 @@ $as_echo X/"$am_mf" | { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments - for automatic dependency tracking. Try re-running configure with the + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE=\"gmake\" (or whatever is + necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } diff --git a/configure_n.ac b/configure_n.ac index bdf31b21..da5ee5e7 100755 --- a/configure_n.ac +++ b/configure_n.ac @@ -673,6 +673,12 @@ PAC_FORTRAN_TEST_VOLATILE( [AC_MSG_ERROR([Sorry, cannot build PSBLAS without support for VOLATILE])] ) +PAC_FORTRAN_TEST_ISO_C_BIND( + [], + [AC_MSG_ERROR([Sorry, cannot build PSBLAS without support for ISO_C_BINDING. + Please get a Fortran compiler that supports it, e.g. GNU Fortran 4.8.])] +) + PAC_FORTRAN_TEST_ISO_FORTRAN_ENV( [], [AC_MSG_ERROR([Sorry, cannot build PSBLAS without support for ISO_FORTRAN_ENV])] @@ -856,14 +862,10 @@ fi PAC_CHECK_SUPERLUDIST() if test "x$amg4psblas_cv_have_superludist" == "xyes" ; then - pac_sludist_version="$amg4psblas_cv_superludist_major"; - if (($amg4psblas_cv_superludist_major==6)); then - if (($amg4psblas_cv_superludist_minor>=3)); then - pac_sludist_version="63"; - fi - fi + pac_sludist_version="$amg4psblas_cv_superludist_major$amg4psblas_cv_superludist_minor"; + AC_MSG_NOTICE([Configuring with SuperLU_DIST version flag $pac_sludist_version]) SLUDIST_FLAGS="" - SLUDIST_FLAGS="-DHave_SLUDist_ -DSLUD_VERSION_$pac_sludist_version $SLUDIST_INCLUDES" + SLUDIST_FLAGS="-DHave_SLUDist_ -DSLUD_VERSION_="$pac_sludist_version" $SLUDIST_INCLUDES" FDEFINES="$amg_cv_define_prepend-DHAVE_SLUDIST_ $FDEFINES" else SLUDIST_FLAGS="" From e02df3725eae763ac3727b86bc528beaab49e4c5 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Sat, 16 Apr 2022 17:20:14 +0200 Subject: [PATCH 36/36] Bump version 1.0.1 --- amgprec/amg_base_prec_type.F90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/amgprec/amg_base_prec_type.F90 b/amgprec/amg_base_prec_type.F90 index 69ebf0ab..d96cdccb 100644 --- a/amgprec/amg_base_prec_type.F90 +++ b/amgprec/amg_base_prec_type.F90 @@ -81,10 +81,10 @@ module amg_base_prec_type ! ! Version numbers ! - character(len=*), parameter :: amg_version_string_ = "1.0.0" + character(len=*), parameter :: amg_version_string_ = "1.0.1" integer(psb_ipk_), parameter :: amg_version_major_ = 1 integer(psb_ipk_), parameter :: amg_version_minor_ = 0 - integer(psb_ipk_), parameter :: amg_patchlevel_ = 0 + integer(psb_ipk_), parameter :: amg_patchlevel_ = 1 type amg_ml_parms integer(psb_ipk_) :: sweeps_pre, sweeps_post