kFibbby nameby nameBUILDd k_Abb./AA kDmbbb&./lpp_namemm4 R S cluster.es.client { cluster.es.client.lib 7.2.6.1 01 N B en_US PowerHA SystemMirror Client Libraries [ *ifreq cluster.es.server.rte (7.2.0.0) 7.2.6.1 % /usr/es/lib/ksh93/OEMVeritas 64 /usr/lpp/SAVESPACE 15576 /usr/lib/objrepos 120 /usr/es/lib/ksh93/aix 176 /usr/es/lib/ksh93/availability 400 /usr/es/lib/ksh93 272 /usr/es/lib/ksh93/ezupdate 352 /usr/es/lib/ksh93/hacmp 8928 /usr/es/lib/ksh93/util 32 /usr/es/lib/ksh93/util/list 48 /usr/es/lib 4552 /usr/es/lib/perl 224 /usr/es/lib/python 32 /usr/es/sbin/cluster/reports/templates 496 INSTWORK 320 272 /lpp/cluster.es.client 48 /etc/objrepos 1 % % % IJ39105 2 SVCPPRC change volumes not supported error appeared IJ39972 5 ANHP support in Cloud ROHA % SYSTEM PRIVATE % % BUILDDATE 0743 ] } ksAbb./usrAA kRAbb./usr/lppAA k_Abb./usr/lpp/cluster.es.client/cluster.es.client.lib/7.2.6.1AA lPDmbbb&:./usr/lpp/cluster.es.client/cluster.es.client.lib/7.2.6.1/liblpp.amm  es /=cilprt._abhmnouy",13469ABIKLMdgk02578:CEFHPvwzfOTVX\x#DGRSU $-N &[]`j|!(>Jq{})WY%; 4b,@E  0X/ 4`,W \FU>y98'B` {+CRyмdJj$ -x (@cBqVO,)Nzi (szUxBrp0!CL_ Y<9< `( P8^>NUԃh,L64 W9=Ӣ ʩ=M饧,Nԕ/\N竀@ǀ8fNB Jr9ß42$ a &,@E  , g(h !Ç 0!A0_tԌ1}%3 ̌P`l=0Ȑ(h`b` @h>rYM4Nt Z:+I2koXcEDd6@w'2'8Ū)s2)=\)sVcJfAQhb0Q7ou%tW(tO:# qM]0DM` lj'tW(tO:Ȑ)` `P "`"I7)oJ9W'( (VjAWXz !0ڒHS.WM\NN`t'*`76U'jJUOtzPx`(!4#<9C"@f6DCC$hH@<56`@ (3+99-VAKIltIMyRAKHʳS2<ʍP@O9N4TK@d (f( (V(P808e% Z!й X D73 * RqK8<|3J,4)%Ž|(zx%kTtԍ:Xs:tܝ" p (GIO:I* @`5tޚ[s%lI'Xς/'IAKKkW*tZisAZ3!G]w4_ӐO)swR {˚{ҹ="}aJI_ |K>@Ȁ$ H`@, # I~ZkΤm<p3[qs@( L$F@ I/u$^sB+ZG#KI2@ PȀKYSs*ؙJDO P1RR J ;I2Rxbb _x)4+s_IFp &V9` JL$r4I27BB$KK}3 i&VA5 W>ruʦςw'`&@J@Q''Q\ai&V>#/-*&V9R+ kR )J, I\i%I4s @{s%(OH$4o,g> xK;s:u 6wBtF  "! #l/ 9@D!4)%9"ZFDzE/oX yXA2!  |%4p ( `B_:f:dyH6rT@Xɕla{@p`"l$L@0I@R|γJS\$_Ko$ӚR;{VHLm Qa+@뽹ьi)%D \FU>yx}m܅8@b)re[ ^-$>g[ "@ PT30}&BSVΑ_Ko$ӚR;{VHLm Qa+@뽹ьi)%D \FU>yx}m_ q{QC  [2y/h PT3 h (*OijˀDR 3@Òms_jGoj)V5 "L%w:1^m%4䨗AKHʳS2=oA!N/j#(P+K*l%EI:H`"f;콅' }&A%R4-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[qB^Gn p _B.Ld{ 'a"dHJuZUsl)9;I5"L9*I5i&vΑ_Zی15c[p$W{s*%SNJtԌ1}%3 ۊ1)Dv )re[ ^-$>g[ "@ PT30F)9;I5"L9*I5i&vΑ_Zی15c[p$W{s*%SNJtԌ1}%3 ێ5)Dv ;Zإɕla{@p`"l$L@0I@R|γ^S\$_Ko$ӚR;{VHLm Qa+@뽹ьi)%D \FU>yx}m _ q{Q!@X\V< ` (*ODȐ4'6T:0[y&多ڷ:Eekn0`Սmˆ _]Ό`IM9*%RR2Ã_n 5)Dvb)re[ ^-<2$ D7 ٥^ԁ%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n(pk!N/j#8X 7Zإɕla{@pDȐ4yhrTMV%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n(bSڈ )re[ ^-<2$ DqR4M*.L9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[qC/܅8@`OK*l9- h $ӊ44lNÒmzKMH["E20bjƶDIF0TK )sVcJfAr;q`B [2y/hÞH"M-S4fUq9L9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[q@E܅8@F [2y/hÞH"M-S6!+`ÒmzKMH["E20bjƶDIF0TK )sVcJfA0rSڈ4-lRʶA簽8[x a"dH< 4L؆zuaTM9I5#nthjƶDIF0TK )sVcJfA,jSڈ 0gZإɕla{@pDȐ4yij]HפLrU-IZIsWVF _X(0u zAӒ].u#*tIL<>`@@!N/j#,hK*l9- h $3Ti&A%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n(Xۈ)re[ ^-<2$ DZhicOTүÒmzKMH["E20bjƶDIF0TK )sVcJfA8P"Sڈ ;-lRʶA簽8[x a"dH< 4Lƞ:hJ=/I5#nthۅ&t۝Q/H6rTKΤeY) jSڈ;Zإɕla{@pDȐ4yj)٠4iWʝ4:0[y&多ڷ:Eekn4 5c[p$W{s*%SNJtԌ1}%3 ہr;qō)re[ ^-<2$ P0@I7%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n( PSڈ  )re[ ^-<2$ P0@I7i`uaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ۊ r;qcF [2y/hÞH(h $X%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n(P(*Sڈ)re[ ^-<2$ P0@IJ=/I5#nthۅ&t۝Q/H6rTKΤeY)P0ۈ0wZإɕla{@pDȐ4,xA@G&KJ=/I5#nthۅ&t۝Q/H6rTKΤeY)PB^Gn `_!kb&U=s[ "@б Dj%0uaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ۊ()DvG  [2y/hÞH(h $ʢL9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[qB _ q{QFx\V< al$LBDŽ 4yjS_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o@`!N/j#(X/K*l9- hX"M :J_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o@!N/j#(PK*l9- hX"M :Ji`uaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ۊr;q [2y/hÃN|=|ci烯J=/I5#nthۅ&t۝Q/H6rTKΤeY)P B^Gn h@)re[ ^-{@ӑRoJ=/I5#nthۅ&t۝Q/H6rTKΤeY)P0(!!N/j#0 po -lRʶA簽8[(5tޚVa{@puaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ۂ r;q-lRʶA簽8[(=H:t)s0uaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ہr;q+ ^!kb&U=ADӦ%2l%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n(X ᢗB^Gn P? Zإɕla{@pPz*tMSHrU-IZIsWVF _X(0u zAӒ].u#*tIL<>܅8@_B.Ld{ ԉSLe%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n4X ۈ0 -lRʶA簽8[j$^Z_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o0!bB^Gn P`_ Zإɕla{@p s "@б 8SNQM'9J=/I5#nthۅ&t۝Q/H6rTKΤeY) p2Sڈ  + K*l@#&Dc qRH6L9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[qCAB^Gn  XLB.Ld{ XH(iJy.A%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n4h!N/j#, `/ Zإɕla{@p s "@б 8SO9ԉ`7%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n0P!!N/j# 0V!kb&U=؁F,$LBDŽ 4Mtԁ%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n  r;q@)re[ ^-bDȐ4,xA@N*T&TrU-IZIsWVF _X(0u zAӒ].u#*tIL<>↍ r;q(K*l@#&Dc qREi'*L9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[p1BE/܅8@ _b [2y/hr1a"dH< a*mrU-IZIsWVF _X(0u zAӒ].u#*tIL<>AB^Gn P/@X\V< b92$ P0ӊ6i)J=/I5#nthۅ&t۝Q/H6rTKΤeY)h(!N/j#( XK*l@#&Dc qR΄9͛ѩJ=/I5#nthۅ&t۝Q/H6rTKΤeY)PF/܅8@р)re[ ^-bDȐ4,xA@N*TFڷ:DrU-IZIsWVF _X(0u zAӒ].u#*tIL<>_ q{Q@aŁb)re[ ^-bDȐ4,xA@N*TNNML9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[q@B _ q{Q!€Zإɕla{@p s "@б 8SKI5"L9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[qC r;qC [2y/hr1a"dH< a*jrU-IZIsWVF _X(0u zAӒ].u#*tIL<> r;q +K*l@#&Dc qR)Ԁg:%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n(Pa!N/j#4XB [2y/hr1a"dH< a*l ]S_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o(cWB^Gn `6!kb&U=؁F,$LBDŽ 4MSmԃj@ÒmzKMH["E20bjƶDIF0TK )sVcJfA0X(2Sڈ (K*l@#&Dc qR2q458(J=/I5#nthۅ&t۝Q/H6rTKΤeY)XAbB^Gn PCEZإɕla{@p s "@б 8SQPuaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ۊ9)Dv (v!kb&U=؁F,$LBDŽ 4MEr4R ÒmzKMH["E20bjƶDIF0TK )sVcJfA,`%ۈ(`B.Ld{ XH(iJ$lN|%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n4Pk!N/j#(W7K*l@#&Dc qRI9Ӏ:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}m r;q`-lRʶA簽8[9ń hXTTÓpuaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ۊ_ q{Qb)re[ ^-bDȐ4,xA@N*Tԓ+@ÒmzKMH["E20bjƶDIF0TK )sVcJfA0`ۈ0p `\V< b92$ P0ӊ5$ѳLMHJ=/I5#nthۅ&t۝Q/H6rTKΤeY)`—B^Gn hP/K*l@#&Dc qRiÒmzKMH["E20bjƶDIF0TK )sVcJfA4Xۈ,`Cq [2y/hr1a"dH< a*ljV%3_uaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ۊ_ q{QB? -lRʶA簽8[9ń hXTorTrU-IZIsWVF _X(0u zAӒ].u#*tIL<>/܅8@G Zإɕla{@p s "@б 8SeVujDrU-IZIsWVF _X(0u zAӒ].u#*tIL<>E _ q{Q1CA?ł)re[ ^-bDȐ4,xA@N*T۩kL9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[p00 Q!N/j#,P`x\V< b92$ P0ӊ6:_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o0ۈ0p7B.Ld{ XH(iJiA9J=/I5#nthۅ&t۝Q/H6rTKΤeY)P00ۈ 8WX\V< b92$ P0ӊ6朎-FZ:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}m r;qE-lRʶA簽8[9ń hXT4qj6չ ÒmzKMH["E20bjƶDIF0TK )sVcJfA0RSڈ / K*l@#&Dc qR:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}m r;q-lRʶA簽8[9ń hXT]HrU-IZIsWVF _X(0u zAӒ].u#*tIL<>_ q{QAAF -lRʶA簽8[9ń hXTDhMHJ=/I5#nthۅ&t۝Q/H6rTKΤeY)XAK!N/j#(g,B.Ld{ XH(iңbmt:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}mŊ r;q`1 [2y/hr1a"dH< a:<*ʭuaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ۍr;q 7-lRʶA簽8[9ń hX \FʐgB%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n0P"Sڈ+Zإɕla{@p s "@б rp:f2L9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[p@1CB^Gn Xႀ񸅭\V< b92$ P0&N)sJ=/I5#nthۅ&t۝Q/H6rTKΤeY)`2Sڈ 0Zإɕla{@p s "@б rhQѴ:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}m _ q{Q!c)re[ ^-bDȐ4,xA@J*tiъ) uaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ۍ-)Dv -lRʶA簽8[9ń hXTӣԁ%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n4 XSڈ )re[ ^-bDȐ4,xA@J*ti862LP:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}m _ q{QcZإɕla{@p s "@б +PѮ::0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}mŁ_ q{Q! [2y/hr1a"dH< aj:5ɕ_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o(@!N/j#0w Zإɕla{@p s "@б +Pѥj4ZIʃJ=/I5#nthۅ&t۝Q/H6rTKΤeY)PQBB^Gn p@\V< b92$ P0ҵ @;_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=oB^Gn h((3K*l@#&Dc VSh6:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}mA܅8@ lB.Ld{ XH(iZNs7R_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=oѣB^Gn PEฅ\V< b92$ P0ҵ |(VHJ=/I5#nthۅ&t۝Q/H6rTKΤeY)h(Uۈ8PK*l@#&Dc VS@o98B7:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}mƁ_ q{Qbłq [2y/hr1a"dH< aj:4R ÒmzKMH["E20bjƶDIF0TK )sVcJfA r;q@… [2y/hr1a"dH< aj:5\L9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[qB _ q{QAZإɕla{@p s "@б +PѯJu ΠuaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ێ1)DvG [2y/hr1a"dH< aj:6N)J=/I5#nthۅ&t۝Q/H6rTKΤeY) bSڈ (Zإɕla{@p s "@б +PѰ*tMmHrU-IZIsWVF _X(0u zAӒ].u#*tIL<>`B^Gn p ^!kb&U=؁F,$LBDŽ 4BF2q458(J=/I5#nthۅ&t۝Q/H6rTKΤeY)`(2Sڈ,_ Zإɕla{@p s "@б +PѨL:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}mAB^Gn hlB.Ld{ XH(iZNEr4R ÒmzKMH["E20bjƶDIF0TK )sVcJfA))Dv q [2y/hr1a"dH< aj:5I؜J=/I5#nthۅ&t۝Q/H6rTKΤeY)h×B^Gn h`.!kb&U=؁F,$LBDŽ 4BFI9Ӏ:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}m 4jSڈ  0wLB.Ld{ XH(iZNJJ=/I5#nthۅ&t۝Q/H6rTKΤeY)h "Sڈ -lRʶA簽8[9ń hXTԓ+@ÒmzKMH["E20bjƶDIF0TK )sVcJfA8bSڈ ,P!kb&U=؁F,$LBDŽ 4BFiÒmzKMH["E20bjƶDIF0TK )sVcJfA -)Dv [2y/hr1a"dH< aj:65+}Β:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}mE_ q{Q b)re[ ^-bDȐ4,xA@J*tl)朕_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=oQ܅8@(?@؅\V< b92$ P0ҵ *ԓR ÒmzKMH["E20bjƶDIF0TK )sVcJfA(ZSڈ )re[ ^-bDȐ4,xA@J*tmԃ^5_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o((ۈ4h_.!kb&U=؁F,$LBDŽ 4BF@ÒmzKMH["E20bjƶDIF0TK )sVcJfA(` ۈ( P@x\V< b92$ P0ҵ iA9J=/I5#nthۅ&t۝Q/H6rTKΤeY)h0k!N/j# 8-lRʶA簽8[9ń hXTۚr8qjJ`ÒmzKMH["E20bjƶDIF0TK )sVcJfAr;qq [2y/hr1a"dH< aj:6朎-Fڷ:DrU-IZIsWVF _X(0u zAӒ].u#*tIL<>B^Gn ` /;K*l@#&Dc VSfthrU-IZIsWVF _X(0u zAӒ].u#*tIL<>/܅8@@q [2y/hr1a"dH< aj:5KJ=/I5#nthۅ&t۝Q/H6rTKΤeY) PSڈ7Zإɕla{@p s "@б +PѡDhMHJ=/I5#nthۅ&t۝Q/H6rTKΤeY)RSڈ ,Xn!kb&U=؁F,$LBDŽ 4ɆԍI2`ÒmzKMH["E20bjƶDIF0TK )sVcJfA 8)Dv1 [2y/hr1a"dH< a*ӣR9_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o@CB^Gn h@B.Ld{ XH(ijF(服:sRu`ÒmzKMH["E20bjƶDIF0TK )sVcJfA,rSڈ (PB.Ld{ XH(ijF7R J=/I5#nthۅ&t۝Q/H6rTKΤeY)Xk!N/j#4Pof!kb&U=؁F,$LBDŽ 4Lӣԍ:sRu`ÒmzKMH["E20bjƶDIF0TK )sVcJfA, )DvZإɕla{@p s "@б -S4]H&|(ӧ9<'VL9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[qC܅8@cFZإɕla{@p s "@б -S5RR4O=IՃJ=/I5#nthۅ&t۝Q/H6rTKΤeY)pcWB^Gn  K*l@#&Dc ZkΤjG#@ÒmzKMH["E20bjƶDIF0TK )sVcJfAr;qx\V< b92$ P03].u#RLX:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}mB^Gn  h^!kb&U=؁F,$LBDŽ 4LAKHۙӠuaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ہ4)Dv -lRʶA簽8[9ń hXʚt'%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n( hۈ8 PB.Ld{ XH(ijj4ZIʚt'%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n(p`k!N/j#4 K*l@#&Dc Zmӧ9<'VL9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[p@1K!N/j#,P/7K*l@#&Dc ZmS4O=IՃJ=/I5#nthۅ&t۝Q/H6rTKΤeY)P (ۈ,XCq [2y/hr1a"dH< af΄9͛ѩt'%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n( bSڈ /K*l@#&Dc Zh m["iӜz_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=oaB^Gn X0oC [2y/hr1a"dH< af rp:oM#NԝX:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}m 1)Dv(^!kb&U=؁F,$LBDŽ 4LMHt'%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n(`(0"Sڈ (K*l@#&Dc Zii&MI2`ÒmzKMH["E20bjƶDIF0TK )sVcJfAr;q@… )re[ ^-bDȐ4,xA@KT-$ԉNrÒmzKMH["E20bjƶDIF0TK )sVcJfA r;qb)re[ ^-bDȐ4,xA@KTAt'%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n(X(!N/j#,PC1 [2y/hr1a"dH< afӧ9<'VL9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[qB _ q{Q !`@b)re[ ^-bDȐ4,xA@KTA;H:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}m 5)Dv +K*l@#&Dc ZkҝHsӧ9<'VL9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[p1ÀB^Gn XѣA?1 [2y/hr1a"dH< af)Ԁg:JJ=/I5#nthۅ&t۝Q/H6rTKΤeY)XK!N/j# -lRʶA簽8[9ń hXDA:sRu`ÒmzKMH["E20bjƶDIF0TK )sVcJfA,jSڈ  b)re[ ^-bDȐ4,xA@KT́SmԃjF9:uaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ی9)Dv\V< b92$ P03`IuaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ہ1)Dv -lRʶA簽8[9ń hXtޚFEi'*i5c@ÒmzKMH["E20bjƶDIF0TK )sVcJfA r;qbŁ1 [2y/hr1a"dH< af2Ɲ9:uaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ۊ_ q{QAAZإɕla{@p s "@б -S6 {Dhӧ9<'VL9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[q@ _ q{Q@b)re[ ^-bDȐ4,xA@KTFeM:sRu`ÒmzKMH["E20bjƶDIF0TK )sVcJfA, XSڈ  3PB.Ld{ XH(ijRNFjDӧ9<'VL9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[q@…/܅8@-lRʶA簽8[9ń hX$lN|:sRu`ÒmzKMH["E20bjƶDIF0TK )sVcJfA(hۈ /PB.Ld{ XH(ijRNF4iӜz_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=ocE/܅8@EZإɕla{@p s "@б -S5*Ϛץ: UJ=/I5#nthۅ&t۝Q/H6rTKΤeY)`!k!N/j# b)re[ ^-bDȐ4,xA@KTJt'%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n(Xk!N/j#0`0?@\V< b92$ P03R'"X:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}mŋr;q@-lRʶA簽8[9ń hXehӧ9<'VL9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[q`B^Gn h` [2y/hr1a"dH< afZ6trU-IZIsWVF _X(0u zAӒ].u#*tIL<>⁆ _ q{Q;K*l@#&Dc ZjIiӜz_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o1K!N/j#4X)re[ ^-bDȐ4,xA@KT͍JskiӜz_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o0 eۈ 0p'`BB^Gn h7/K*l@#&Dc ZlEi'*lN%0uaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ہ r;q@B )re[ ^-bDȐ4,xA@KTͺkF&9:uaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ہr;q`C Zإɕla{@p s "@б -S6AuX:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}mŊr;q`†1 [2y/hr1a"dH< afF9:uaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ۊr;qAZإɕla{@p s "@б -S6:6trU-IZIsWVF _X(0u zAӒ].u#*tIL<> _ q{Q +K*l@#&Dc ZmtmiӜz_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=oB^Gn `0_b)re[ ^-bDȐ4,xA@KT͹#QiӜz_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o@c/܅8@01@b)re[ ^-bDȐ4,xA@KT͹#QΑ4O=IՃJ=/I5#nthۅ&t۝Q/H6rTKΤeY)P(@5ۈ(p'\B.Ld{ XH(ij:4iӜz_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o A×B^Gn `P!b)re[ ^-bDȐ4,xA@KTQ%.u ׺,rU-IZIsWVF _X(0u zAӒ].u#*tIL<>cAWB^Gn hQ?x\V< b92$ P03TNryNrU-IZIsWVF _X(0u zAӒ].u#*tIL<>⁆_ q{Q@a@c?-lRʶA簽8[9ń hXF-$ԉNryNrU-IZIsWVF _X(0u zAӒ].u#*tIL<>bŎr;q@BŁ-lRʶA簽8[9ń hX.atbi>irU-IZIsWVF _X(0u zAӒ].u#*tIL<> r;q+Zإɕla{@p s "@б }]$Ò4A uaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ۋr;qCEb)re[ ^-bDȐ4,xA@_fI0reA%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n0X0ۈ3-lRʶA簽8[9ń hX.aVI:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}m -)Dv3K*l@#&Dc 4I$mrU-IZIsWVF _X(0u zAӒ].u#*tIL<>cAB^Gn h0^!kb&U=؁F,$LBDŽ 5itH L9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[qCB^Gn P`B.Ld{ XH(k&3qsfj@ÒmzKMH["E20bjƶDIF0TK )sVcJfA(RSڈ1 [2y/hr1a"dH< aKrF 6չ ÒmzKMH["E20bjƶDIF0TK )sVcJfA(rSڈ q [2y/hr1a"dH< aKrF rp:oM uaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ۋ0 )Dvb)re[ ^-bDȐ4,xA@_fI0-$Ԉ:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}mŋr;q1 [2y/hr1a"dH< aKrF%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n-)Dv-lRʶA簽8[9ń hX.aR_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=oBB^Gn X0K*l@#&Dc 4I$l ]S_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o@A!N/j#0` _f!kb&U=؁F,$LBDŽ 5itH:&H6L9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[q`B^Gn ``B.Ld{ XH(k&L:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}mŁ܅8@ !B.Ld{ XH(k&Lt N #@ÒmzKMH["E20bjƶDIF0TK )sVcJfA4 )Dv-lRʶA簽8[9ń hX.aMʃJ=/I5#nthۅ&t۝Q/H6rTKΤeY)X0k!N/j#0 o3K*l@#&Dc 4I$j/_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o уB^Gn h`B.Ld{ XH(k&RNFrU-IZIsWVF _X(0u zAӒ].u#*tIL<>Ƌ_ q{Q1 [2y/hr1a"dH< aKrFI9Ӏ:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}mŌr;q@B1 [2y/hr1a"dH< aKrFSNE%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n,ZSڈ -lRʶA簽8[9ń hX.aehrU-IZIsWVF _X(0u zAӒ].u#*tIL<>ł/܅8@ 0a&!kb&U=؁F,$LBDŽ 5itHԓ 8rU-IZIsWVF _X(0u zAӒ].u#*tIL<>Ɗ_ q{Q1@_B.Ld{ XH(k&[t|A%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n0`02Sڈ,-lRʶA簽8[9ń hX.aF%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n0X*Sڈ +Zإɕla{@p s "@б }]$Ò6U0uaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ۍ_ q{Q0A``.!kb&U=؁F,$LBDŽ 5itHTS9*L9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[q@C܅8@? -lRʶA簽8[9ń hX.a"ÒmzKMH["E20bjƶDIF0TK )sVcJfA r;q`@B.Ld{ XH(k&R {rU-IZIsWVF _X(0u zAӒ].u#*tIL<>k!N/j#,Zإɕla{@p s "@б }]$Ò6:_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o/܅8@ c1 [2y/hr1a"dH< aKrFGFN`ÒmzKMH["E20bjƶDIF0TK )sVcJfA,PSڈ 7Zإɕla{@p s "@б }]$Ò6朎-FZ:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}mō_ q{Q``@B.Ld{ XH(k&4qj6չ ÒmzKMH["E20bjƶDIF0TK )sVcJfA4pۈ0W Zإɕla{@p s "@б }]$Ò6gF%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n,X!N/j#4Pу?񘅭\V< b92$ P0٥L9#T:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}mŋ5)Dv-lRʶA簽8[9ń hX.aF-$Ԉ:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}m_ q{Q0a@B.Ld{ XH(kԓ+F#KI5"L9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[qcAB^Gn X0`Of!kb&U=؁F,$LBDŽ 6tbi>i%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n (`Sڈ/-lRʶA簽8[9ń hX3NnRuaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ۃ 1)Dv [2y/hr1a"dH< a}qu"h _Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=oCB^Gn h@x\V< b92$ P0>i862LP:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}mƍ9)Dv 3-lRʶA簽8[9ń hX3\PuaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ۃr;qE-lRʶA簽8[9ń hX3Ji"VL9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[qC _ q{QC@ 3K*l@#&Dc ͠JvL9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[q/܅8@PPo@X\V< b92$ P0>h @\ٽJ=/I5#nthۅ&t۝Q/H6rTKΤeY)PUۈ 7-lRʶA簽8[9ń hX3@oj_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o0 !N/j#0 w;K*l@#&Dc  tޚ@ÒmzKMH["E20bjƶDIF0TK )sVcJfA(jSڈ 8w Zإɕla{@p s "@б fjF%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n 4)Dvb)re[ ^-bDȐ4,xA@`"_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o0A!N/j#(P ?K*l@#&Dc A;J=/I5#nthۅ&t۝Q/H6rTKΤeY)PCB^Gn X1 [2y/hr1a"dH< a}ץ: UJ=/I5#nthۅ&t۝Q/H6rTKΤeY)jSڈ 4w;K*l@#&Dc ́SmԃjVL9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[p`@PEۈ -lRʶA簽8[9ń hX3`gFrU-IZIsWVF _X(0u zAӒ].u#*tIL<>B^Gn P0K*l@#&Dc ͂erU-IZIsWVF _X(0u zAӒ].u#*tIL<>ࠀ!N/j#( g Zإɕla{@p s "@б fSA2L9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[q@C@B^Gn P``b)re[ ^-bDȐ4,xA@`RNFjF%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n 4 )Dv [2y/hr1a"dH< a}_)'#bs`ÒmzKMH["E20bjƶDIF0TK )sVcJfA()DvF [2y/hr1a"dH< a}_)'#bpuaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ۃ/܅8@ C؅\V< b92$ P0>jU0^%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n (Xۈ0XK*l@#&Dc I2`ÒmzKMH["E20bjƶDIF0TK )sVcJfA r;qcE؅\V< b92$ P0>jI`ÒmzKMH["E20bjƶDIF0TK )sVcJfA r;q [2y/hr1a"dH< a}ԭ:Jf ÒmzKMH["E20bjƶDIF0TK )sVcJfA( )Dv [2y/hr1a"dH< a}ؠ@4L9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[q@C_ q{Q@@`? -lRʶA簽8[9ń hX3eQN4uaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ۊr;qB-lRʶA簽8[9ń hX3eVujF%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n 8)DvA؅\V< b92$ P0>mԃ^5_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o0!K!N/j#0W Zإɕla{@p s "@б fVL9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[p` @eۈ4-lRʶA簽8[9ń hX3m3N}%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n,hۈ  -lRʶA簽8[9ń hX3m#h';_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o( (2Sڈ 4w Zإɕla{@p s "@б fӑŨӋRSuaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ۃ  r;q [2y/hr1a"dH< a}ۚr8j_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o!C܅8@`B-lRʶA簽8[9ń hX3ftj%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n ( )Dvƌb)re[ ^-bDȐ4,xA@`]J%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n(p0ۈ0wX\V< b92$ P0>hjpQ4R6L9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[qB^Gn `b-lRʶA簽8[9ń hXW4|Ӑ:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}mŁr;qZإɕla{@p s "@б E2iэԃj@ÒmzKMH["E20bjƶDIF0TK )sVcJfA4X!N/j# (o\V< b92$ P0S*sc$oJ=/I5#nthۅ&t۝Q/H6rTKΤeY)`܅8@0! -lRʶA簽8[9ń hXW5RR_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=oŁ/܅8@b)re[ ^-bDȐ4,xA@QLj)s&Y&ÒmzKMH["E20bjƶDIF0TK )sVcJfA8 PSڈ ;PB.Ld{ XH(j)x S].u#PEÒmzKMH["E20bjƶDIF0TK )sVcJfA, `ۈ(wx\V< b92$ P0S* \FiÒmzKMH["E20bjƶDIF0TK )sVcJfA,)DvAE+K*l@#&Dc e^TAKH&ÒmzKMH["E20bjƶDIF0TK )sVcJfA0P(ۈ (f!kb&U=؁F,$LBDŽ 5ʼ:NROÒmzKMH["E20bjƶDIF0TK )sVcJfA,PSڈ 8 n!kb&U=؁F,$LBDŽ 5ʼL:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}m-)Dv-lRʶA簽8[9ń hXW4F+I9PuaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ہ r;q@` [2y/hr1a"dH< aU5MJ=/I5#nthۅ&t۝Q/H6rTKΤeY)peۈ0Zإɕla{@p s "@б E2mS_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o@B^Gn `(0Cq [2y/hr1a"dH< aU5Ms7R_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o@k!N/j#0`'B.Ld{ XH(j)x S@o tޚ@ÒmzKMH["E20bjƶDIF0TK )sVcJfA,Xۈ0p/\V< b92$ P0S* 6չ ÒmzKMH["E20bjƶDIF0TK )sVcJfA,)Dv(n!kb&U=؁F,$LBDŽ 5ʼ_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=oCE/܅8@c@-lRʶA簽8[9ń hXW5\L9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[q _ q{Qb@ -lRʶA簽8[9ń hXW5N9L9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[qB/܅8@Q [2y/hr1a"dH< aU5Mn:oM#Ji"_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o!@K!N/j#(p?f!kb&U=؁F,$LBDŽ 5ʼL:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}m r;q(f!kb&U=؁F,$LBDŽ 5ʼLt N #@ÒmzKMH["E20bjƶDIF0TK )sVcJfA4p2Sڈ 4X`\V< b92$ P0S*SA2ÒmzKMH["E20bjƶDIF0TK )sVcJfA4`ۈ0PCq [2y/hr1a"dH< aU5MEr4R ÒmzKMH["E20bjƶDIF0TK )sVcJfA,hۈ(X( [2y/hr1a"dH< aU5MEr6'>@ÒmzKMH["E20bjƶDIF0TK )sVcJfA4jSڈ )re[ ^-bDȐ4,xA@QLj$lSNÒmzKMH["E20bjƶDIF0TK )sVcJfAr;q-lRʶA簽8[9ń hXW5*rr.L9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[qCF _ q{Q@1)re[ ^-bDȐ4,xA@QLjehrU-IZIsWVF _X(0u zAӒ].u#*tIL<>܅8@0A` [2y/hr1a"dH< aU5MI2kqziJ=/I5#nthۅ&t۝Q/H6rTKΤeY)P0eۈ0pK*l@#&Dc e^Tԓ 8rU-IZIsWVF _X(0u zAӒ].u#*tIL<>Er;q`A-lRʶA簽8[9ń hXW65+}Β:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}m 1)DvƃZإɕla{@p s "@б E2lPVhjpQ_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=oA/܅8@Pa -lRʶA簽8[9ń hXW6Ui'Qi&A%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n r;qZإɕla{@p s "@б E2lEi'*L9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[qc܅8@ AB.Ld{ XH(j)x SnQ:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}mB^Gn P(`O0,B.Ld{ XH(j)x SmuaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ہ r;q Zإɕla{@p s "@б E2mtkqziJ=/I5#nthۅ&t۝Q/H6rTKΤeY)P0eۈ8`0Zإɕla{@p s "@б E2mtmL9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[paÁB^Gn XC?؅\V< b92$ P0S*ӑŨӋRS_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o(0!N/j#0h_K*l@#&Dc e^Tۚr8juaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ۊr;q/K*l@#&Dc e^Tٝ_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=oCG/܅8@Zإɕla{@p s "@б E2jR_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o CB^Gn X0_X\V< b92$ P0S*KI5"L9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[q`@B^Gn X/lB.Ld{ XH(j)ѱ[t|A%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n -)Dv b)re[ ^-bDȐ4,xA@QL6ZjIZIuaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ہ _ q{Q@`Cb)re[ ^-bDȐ4,xA@QL6kF ÒmzKMH["E20bjƶDIF0TK )sVcJfAr;q b)re[ ^-bDȐ4,xA@SAKHrU-IZIsWVF _X(0u zAӒ].u#*tIL<>`bE܅8@@`B [2y/hr1a"dH< apzTjIuaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ہ-)Dv@q [2y/hr1a"dH< apzTlRNMHJ=/I5#nthۅ&t۝Q/H6rTKΤeY)P1K!N/j#(p¿-lRʶA簽8[9ń hXQ:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}mŁ _ q{QC Zإɕla{@p s "@б M(=*5RR_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=oA—B^Gn `!@cq [2y/hr1a"dH< aFZ_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o1!N/j#0pcq [2y/hr1a"dH< aFʭ5$-$Ԉ:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}mŁ/܅8@@ŋ-lRʶA簽8[9ń hXoJ=/I5#nthۅ&t۝Q/H6rTKΤeY) ha!N/j#0`0`\V< b92$ P0S )sJ=/I5#nthۅ&t۝Q/H6rTKΤeY)`!N/j#4 o Zإɕla{@p s "@б 90ڑ&V%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n 8)Dv [2y/hr1a"dH< a&R6:_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o(bB^Gn ` K*l@#&Dc *ʭQ|-$Ԉ:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}mŊ_ q{Q@1?񘅭\V< b92$ P0R)ѩ&V4M-$Ԉ:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}mōr;q1 [2y/hr1a"dH< aQRNFjDrU-IZIsWVF _X(0u zAӒ].u#*tIL<> _ q{Q!A -lRʶA簽8[9ń hXʣFʢiPuaT%i&vΑ_Zۍ15c[p$W{s*%SNJtԌ1}%3 ی8)Dv 0K*l@#&Dc *::0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}mŁ/܅8@ AB.Ld{ XH(lEM΁%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n0p Sڈ  b)re[ ^-bDȐ4,xA@eW4FGFN`ÒmzKMH["E20bjƶDIF0TK )sVcJfA r;qlB.Ld{ XH(lF:15|ӓ,L9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[qCr;q  Zإɕla{@p s "@б D䊃J=/I5#nthۅ&t۝Q/H6rTKΤeY)P0"Sڈ  -lRʶA簽8[9ń hXD*ra%A%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n(heۈ 0_\V< b92$ P0RI4SINOH:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}m (bSڈ7P&!kb&U=؁F,$LBDŽ 6Iƀ 54%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n0`Sڈ (P/ Zإɕla{@p s "@б Q"c\_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o1!N/j#4P B.Ld{ XH(jA75RR_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=o`5ۈ4Zإɕla{@p s "@б <$TU'J=/I5#nthۅ&t۝Q/H6rTKΤeY) )Dv -lRʶA簽8[9ń hXԞTjh&V%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n4hۈ 4Zإɕla{@p s "@б }J=/I5#nthۅ&t۝Q/H6rTKΤeY)p(Sڈ  ( K*l@#&Dc 5IMHJ=/I5#nthۅ&t۝Q/H6rTKΤeY)XCB^Gn `(B.Ld{ XH(hk8TS%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n, hۈ4P/``\V< b92$ P0qѴ:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}m_ q{QA [2y/h&XJrTrU-IZIsWVF _X(0u zAӒ].u#*tIL<>AWB^Gn P007K*lRo "@ Iti,4rU-IZIsWVF _X(0u zAӒ].u#*tIL<>F r;qcA\B.Ld{ I $L@,&lH!4Q9"S :_Kn{_jGoj)уV5 "L%w:1^m%4䨗AKHʳS2=oB^Gn p ^!kb&U=ؤ&Dȓ4995ɨ%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n(`(*Sڈ [2y/h&22$ DȀP4HMV*L9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[p0AcB^Gn X ^!kb&U=ؤA6&Dȓ4 )L⦞L$L9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[qCB^Gn `0a!kb&U=ؤA6&Dȓ4 utr:gQԁ%R۞多ڷ:Eekn4`Սmˆ _]Ό`IM9*%RR2Ã_n(h ۈ4 -lRʶA簽8[>DȐ49f"@ٯH>L9*-$Ԏչ+S+[q/knDJ:ntcD JiQ.:f:dz[qB܅8@0A_!kb&U=ؤA6&Dȓ4 ʑL6ftJ=/I5#nthۅ&t۝Q/H6rTKΤeY)P@5ۈ4hZإɕla{@p)7}̈́ hr$&D9$QS`:0[sޒR;{VHLmƌQa+@뽹ьi)%D \FU>yx}m _ q{QAbcB^Gn `ax\V r;qC@Zإɕld{sJ=/I5#nt`ۅ&t۝Q/H6rTKΤeY)h1@cWB^Gn `ߍZإɕld{s0uaT%i&vΑ_Zی15c[p$W{s*%SNJtԌ1}%3 ۋ,p*Sڈ 4hłb)re[ ԇ0uaT%i&vΑ_Zی15c[p$W{s*%SNJtԌ1}%3 ہ_ q{Q [2y+V+p:0[sޒR;{VHLm Qa+@뽹ьi)%D \FU>yx}m r;q``C?b)re[ M0uaT%i&vΑ_Zی15c[p$W{s*%SNJtԌ1}%3 ی0 bSڈ0f!kb&U=AtR2(J=/I5#nthۅ&t۝Q/H6rTKΤeY)P`!!N/j#0P'yx}m -)Dv(`!kb&UzLtԙ*rt`tvl)fΑ_Ko$ӚR;{VHLm Qa+@뽹ьi)%D \FU>yx}mr;qP.!k 70Q`ↂ (W 4`7.u#*tIL<-Jإɕla{@p`"xыb&B1` < ' 5lR<&xRx0%K*l9/ 5lRʶA簽8[ 98W)re[ ^/[2y/hR%Nb.Ld{ pa`b&U=ؤ Xإɕla{@p)7} )re[ 񀀀kb&U=C)re[ fib.Le)s2U;d X`A(X((7 3CA +0 :f:dy@.Ld{ 'a"dHJuV$Ԋb&U=Ju2$ %EI:-SwpjD)9>j.Ld{ 'a"dHJuZ$ԈLb&U=Ju2$ %EI:-Sw{ N@.MH)re[ ^-$>g[ "@ PT30­[#aIe"I.Ld{ 'a"dHJuZՅ' }&Vc2y/h PT3 h (*OkъrˀDR+1\V< ` (*ODȐ4'6Tb&U=s[ "@@I}@U0If1K*l9- h $ -S52}@)re[ ^-<2$ DqR4M*.ɕla{@pDȐ4yiJX6'M.Ld{ 瀶&DȀKT٠9U\Nu,)re[ ^-<2$ DZlC^Vc2y/hÞH"M-S6!+ff1K*l9- h $3THb&U=s[ "@@Ifu"MH)re[ ^-<2$ DZhicOTү1\V< al$LG&X6'M.Ld{ 瀶&DȀQMDh#JT%Vc2y/hÞH(h $YΛhk1\V< al$LBDŽ 4yl,MYf1K*l9- hX"Mf1K*l9- hX"M5f1K*l9- hX"MYRʶA簽8[x a"dH< aȀQMDɕla{@pDȐ4,xA@G&U.Ld{ 瀶&Dc < 5DSQ))re[ ^-<2$ P0@IIT`01\V< al$LBDŽ 4yhiU4K,)re[ ^-{@ӑYRʶA簽8[ 98U" YRʶA簽8[(5tޚVa{@p.Ld{ ԉSL:YRʶA簽8[(=H:tVb&U=ADӦ94QM%.Ld{ ԉSLec2y/h8פ(Vc2y/hr1a"dH< a*iъ)%.Ld{ XH(iJtcu ڒb&U=؁F,$LBDŽ 4M<R+1\V< b92$ P0ӊ4]H&|)f1K*l@#&Dc qR \K1\V< b92$ P0ӊ5ɕYRʶA簽8[9ń hXTj4ZIʬ)re[ ^-bDȐ4,xA@N*Tb&U=؁F,$LBDŽ 4MJk1\V< b92$ P0ӊ4t y.lލIf1K*l@#&Dc qR 6չ+1\V< b92$ P0ӊ4S)zi,)re[ ^-bDȐ4,xA@N*TMH)re[ ^-bDȐ4,xA@N*Trb&U=؁F,$LBDŽ 4MzSu,)re[ ^-bDȐ4,xA@N*T:&ɕla{@p s "@б 8S`Tu ڒb&U=؁F,$LBDŽ 4MehjpQYRʶA簽8[9ń hXTLb&U=؁F,$LBDŽ 4MEr4R+1\V< b92$ P0ӊ5I؜,)re[ ^-bDȐ4,xA@N*T_)'#bpYRʶA簽8[9ń hXTTÓu.Ld{ XH(iJeif1K*l@#&Dc qRZ6iZI.Ld{ XH(iJa,)re[ ^-bDȐ4,xA@N*Tԭ:Jf+1\V< b92$ P0ӊ6UNJ)re[ ^-bDȐ4,xA@N*TUEYRʶA簽8[9ń hXTR {f1K*l@#&Dc qRK1\V< b92$ P0ӊ6:6sYRʶA簽8[9ń hXT4qj4Ԕc2y/hr1a"dH< a*m9Zntb&U=؁F,$LBDŽ 4Mѥ.Ld{ XH(iJԖc2y/hr1a"dH< a*hjpQ4R+1\V< b92$ P0ӥF5l@QU.Ld{ XH(kΤl9ʀrAf1K*l@#&Dc )s*B YRʶA簽8[9ń hX8B3`kYRʶA簽8[9ń hX4btAKIf1K*l@#&Dc щңm#h'5.Ld{ XH(iZN:1E44ɕla{@p s "@б +PѧF7R ,)re[ ^-bDȐ4,xA@J*ti862LRb&U=؁F,$LBDŽ 4BF \K1\V< b92$ P0ҵ ʬ)re[ ^-bDȐ4,xA@J*tiZ$Vr1\V< b92$ P0ҵ @;YRʶA簽8[9ń hXT ɕla{@p s "@б +PѠ3qsfjK1\V< b92$ P0ҵ |(VH)re[ ^-bDȐ4,xA@J*th 'SYRʶA簽8[9ń hXTMH)re[ ^-bDȐ4,xA@J*tjf1K*l@#&Dc VS^@3K1\V< b92$ P0ҵ DAc2y/hr1a"dH< aj:6NR ,)re[ ^-bDȐ4,xA@J*tl,CSb&U=؁F,$LBDŽ 4BFSA21\V< b92$ P0ҵ $ii&Vc2y/hr1a"dH< aj:5I؜,)re[ ^-bDȐ4,xA@J*tj/M8,)re[ ^-bDȐ4,xA@J*tjU0]f1K*l@#&Dc VSRL,)re[ ^-bDȐ4,xA@J*tjIɕla{@p s "@б +Pѱ[t|Vc2y/hr1a"dH< aj:6UNJ)re[ ^-bDȐ4,xA@J*tlRNMH)re[ ^-bDȐ4,xA@J*tmԃ^5YRʶA簽8[9ń hXT|f1K*l@#&Dc VSm#h'5.Ld{ XH(iZN#Qɕla{@p s "@б +Pѷ4qj6չ+1\V< b92$ P0ҵ 3K1\V< b92$ P0ҵ Ԗc2y/hr1a"dH< aj:458(ZI.Ld{ XH(iWۓ ejc2y/hr1a"dH< a*ӣR9YRʶA簽8[9ń hXtbi>iӧ9<'Vɕla{@p s "@б -S4A%.Ld{ XH(ijF7R t'c2y/hr1a"dH< afsc$ot'c2y/hr1a"dH< af \F9:.Ld{ XH(ij:,)re[ ^-bDȐ4,xA@KTtԍI2k1\V< b92$ P03].u#ngNc2y/hr1a"dH< af29:.Ld{ XH(ijj4ZIʚt'c2y/hr1a"dH< af:sRuk1\V< b92$ P03h6NryNf1K*l@#&Dc Zh @\ٽNryNf1K*l@#&Dc Zh m["iӜzYRʶA簽8[9ń hX|)4:sRuk1\V< b92$ P03KI5"iӜzYRʶA簽8[9ń hXZIRLZb&U=؁F,$LBDŽ 4LMH*ɕla{@p s "@б -S5\iӜzYRʶA簽8[9ń hXw3NԝZb&U=؁F,$LBDŽ 4Li)re[ ^-bDȐ4,xA@KTzSut'c2y/hr1a"dH< af)Ԁg:J)re[ ^-bDȐ4,xA@KT́SkJf9:.Ld{ XH(ij*tMmHӧ9<'Vɕla{@p s "@б -S6 $ZYRʶA簽8[9ń hXtޚFEi'*i5cK1\V< b92$ P03`cNԝZb&U=؁F,$LBDŽ 4L&Y:NԝZb&U=؁F,$LBDŽ 4Ljh&Tӧ9<'Vɕla{@p s "@б -S5IMHt'c2y/hr1a"dH< afI9#NԝZb&U=؁F,$LBDŽ 4L_)'#bp4O=Iլ)re[ ^-bDȐ4,xA@KTJhs恨s5N9k1\V< b92$ P03R'"9:.Ld{ XH(ijTÓsfif1K*l@#&Dc ZjINԝZb&U=؁F,$LBDŽ 4Lԓ+FΝ,)re[ ^-bDȐ4,xA@KTI0Ӎ:sRuk1\V< b92$ P03cR)t'c2y/hr1a"dH< afm:NԝZb&U=؁F,$LBDŽ 4LTS9*iӜzYRʶA簽8[9ń hX*ԓR&Ν,)re[ ^-bDȐ4,xA@KT͑cNԝZb&U=؁F,$LBDŽ 4L+QNT $ɕla{@p s "@б -S6Ei"6'Jb&U=؁F,$LBDŽ 4L۩kiӜzYRʶA簽8[9ń hXu ׺-f1K*l@#&Dc ZmtiӜzYRʶA簽8[9ń hXos:tɕla{@p s "@б -S6:6s4O=Iլ)re[ ^-bDȐ4,xA@KT͹#QiӜzYRʶA簽8[9ń hXsNGm["iӜzYRʶA簽8[9ń hX3F9:.Ld{ XH(ij$SnQ8)re[ ^-bDȐ4,xA@KTRF9:.Ld{ XH(ijDhMHt'c2y/hr1a"dH< aKrFOrYRʶA簽8[9ń hX.atcu ڒb&U=؁F,$LBDŽ 5itH&Uf1K*l@#&Dc 4I$iZ$Vr1\V< b92$ P0٥L9#hk1\V< b92$ P0٥L9#h6b&U=؁F,$LBDŽ 5itHЁ8z5%.Ld{ XH(k&7ntb&U=؁F,$LBDŽ 5itHNNM餳ɕla{@p s "@б }]$Ò4R+1\V< b92$ P0٥L9#PE1\V< b92$ P0٥L9#^@3K1\V< b92$ P0٥L9#`T>b&U=؁F,$LBDŽ 5itH:&H6ɕla{@p s "@б }]$Ò6 YRʶA簽8[9ń hX.a=@4ɕla{@p s "@б }]$Ò5 YRʶA簽8[9ń hX.a$ii&Vc2y/hr1a"dH< aKrFI9%.Ld{ XH(k&RNF4ɕla{@p s "@б }]$Ò5*rr.ɕla{@p s "@б }]$Ò5$b&U=؁F,$LBDŽ 5itHԓ 9f1K*l@#&Dc 4I$ljV%3_.Ld{ XH(k&A[{Dif1K*l@#&Dc 4I$l)k1\V< b92$ P0٥L9#eQN4b&U=؁F,$LBDŽ 5itHYRʶA簽8[9ń hX.au ׺|Vc2y/hr1a"dH< aKrFK1\V< b92$ P0٥L9#m#h'5.Ld{ XH(k&4qj4Ԕc2y/hr1a"dH< aKrFӑŨVH)re[ ^-bDȐ4,xA@_fI0䍙ѥ.Ld{ XH(k&]If1K*l@#&Dc 4I$hjpQ4R+1\V< b92$ P0٩&VzFjEf1K*l@#&Dc :1E44k1\V< b92$ P0>iэԃjVɕla{@p s "@б fs@oZb&U=؁F,$LBDŽ 6y.Mɕla{@p s "@б f21\V< b92$ P0>iZ$Vsc2y/hr1a"dH< a} k1\V< b92$ P0>h @\ٽ)re[ ^-bDȐ4,xA@`7nt)re[ ^-bDȐ4,xA@`7œ!NIf1K*l@#&Dc -$ԍ)re[ ^-bDȐ4,xA@`"YRʶA簽8[9ń hX3PNk1\V< b92$ P0>kҝHsc2y/hr1a"dH< a}:&H6k1\V< b92$ P0>l,CSլ)re[ ^-bDȐ4,xA@`L)re[ ^-bDȐ4,xA@`L)re[ ^-bDȐ4,xA@`RNFjFc2y/hr1a"dH< a}_)'#bsk1\V< b92$ P0>j/M8Zb&U=؁F,$LBDŽ 6L99.Ld{ XH(ls5$լ)re[ ^-bDȐ4,xA@`&u)re[ ^-bDȐ4,xA@`[t|Vc2y/hr1a"dH< a}ؠ@4ɕla{@p s "@б fʢik1\V< b92$ P0>lRNMHb&U=؁F,$LBDŽ 6u ׺|Vc2y/hr1a"dH< a}|c2y/hr1a"dH< a}DLӮs.Ld{ XH(ls6:6s.Ld{ XH(ls6朎-FZ)re[ ^-bDȐ4,xA@`4qj6չ6ɕla{@p s "@б fլ)re[ ^-bDȐ4,xA@`]Jc2y/hr1a"dH< a}4ii&mf1K*l@#&Dc e^TӣSINK1\V< b92$ P0S*H6ɕla{@p s "@б E2i862LRb&U=؁F,$LBDŽ 5ʼ:b&U=؁F,$LBDŽ 5ʼ:jhɕla{@p s "@б E2kΤjf1K*l@#&Dc e^TAKHԓ 9f1K*l@#&Dc e^TAKH&1\V< b92$ P0S* \F9I>j)re[ ^-bDȐ4,xA@QLjʬ)re[ ^-bDȐ4,xA@QLjVIb&U=؁F,$LBDŽ 5ʼ.Ld{ XH(j)x Sh6b&U=؁F,$LBDŽ 5ʼ3qsfjK1\V< b92$ P0S* 54c2y/hr1a"dH< aU5MmsVc2y/hr1a"dH< aU5M-$Ԋb&U=؁F,$LBDŽ 5ʼ".Ld{ XH(j)x S^@3K1\V< b92$ P0S*77j4ZIʬ)re[ ^-bDȐ4,xA@QLj,)re[ ^-bDȐ4,xA@QLj=@4ɕla{@p s "@б E2j54*ɕla{@p s "@б E2j/YRʶA簽8[9ń hXW5I؜,)re[ ^-bDȐ4,xA@QLj$lSN 1\V< b92$ P0S*SNEc2y/hr1a"dH< aU5MI2ɕla{@p s "@б E2jI\ If1K*l@#&Dc e^Tԓ 9f1K*l@#&Dc e^Tԭ:Jf+1\V< b92$ P0S*m:.Ld{ XH(j)x SeVujEf1K*l@#&Dc e^T+QNUf1K*l@#&Dc e^T۩kɕla{@p s "@б E2mtɕla{@p s "@б E2mtkqzi,)re[ ^-bDȐ4,xA@QLjiA9)re[ ^-bDȐ4,xA@QLjsNGN-IMf1K*l@#&Dc e^Tۚr8j.Ld{ XH(j)x Sftif1K*l@#&Dc e^T.ɕla{@p s "@б E2hjpQ4R+1\V< b92$ P0S cR))re[ ^-bDȐ4,xA@QL6ZjIZI.Ld{ XH(j)ѷR {f1K*l@#&Dc  F \K1\V< b92$ P0`8=*5$b&U=؁F,$LBDŽ 50JZjIZI.Ld{ XH(j`0o,)re[ ^-bDȐ4,xA@SJJtԖc2y/hr1a"dH< aFZYRʶA簽8[9ń hX*ԓR+1\V< b92$ P0҃ңm.Ld{ XH(lɆԍtԖc2y/hr1a"dH< a&R5$b&U=؁F,$LBDŽ 6TjFK1\V< b92$ P0PUh$ii&Vc2y/hr1a"dH< aS RLhZI.Ld{ XH(l09j/YRʶA簽8[9ń hXʣFʢiU.Ld{ XH(lf \K1\V< b92$ P0U4o,)re[ ^-bDȐ4,xA@eW4FGFNk1\V< b92$ P0Utbj)'Yf1K*l@#&Dc %5ɢYRʶA簽8[9ń hXD*ra%Vc2y/hr1a"dH< aƒ*iщ朞e.Ld{ XH(mk)zi,)re[ ^-bDȐ4,xA@THfX rEc2y/hr1a"dH< a%\AKIf1K*l@#&Dc Rx SNHNYRʶA簽8[9ń hXԞTjh&Vc2y/hr1a"dH< a`e.Ld{ XH(hk8_)'#KI5"ɕla{@p s "@б }*rb&U=؁F,$LBDŽ 45mtmɕla{@pA2S1\V< b|HX"L؝+Nek1\V< b|HX"L(BhrE@"uɕla{@p)7 hr$NEMrj%5.Ld{ I l$L@,&i2 :R9S@oJ,)re[ ^-Mdsa"dH`3Iiґʛ*i4K1\V< b|HX"Ld@(ցґʚTUDcRYRʶA簽8[>DȐ49f"@ٯH>ɕla{@p)7}̈́ hr$&D9S `#k1\V< b|HX"Ld@(O^6)re[ rb&U=y0.Ld{ y%.Ld{ yb&U=yba1\Vyʝ3@$r5"X@@1s!9"ՆN})^$Ң4Սmk0 CΤeY) `LKtԌ2]Jt `LKZi:zEAKK <7P P ^HaDj4Þn$Ң KCjOm1riX &I9\P ^MH(@@0P0 #@9"( H/ DjzTTԺzIϵ#:+( H/ L:?ntGIP ^( H/&d7 rE N #[#:+uH,x@R@)|Ю$Qэ'X X$r5"Xk1sԌSA5 ǬV57®{q:f:dx8)f 0P H-RR2˩Ԍ*`R.u#*̺mH `4@) AKHʳ.R2SpS` [ΤeYR  0 IXTc4ۈ p c H9L$!kPQcPBAAP@A`€xWFRR2Ã0$N@bEY X1@,acXO B/ / X70a((?F8p  eTtT].u#*tIL<U!0tԌ1}%3 ̌RR2Ã1SNJ+ΤeY)e>RR2Ã0+ΤeY)` ,8].u#*tIL<D(S* kFLQ@Abb^e,4Ax*./usr/lpp/cluster.es.client/cluster.es.client.lib/7.2.6.1/inst_root^TAA kDm#bbb&#./usr/lpp/cluster.es.client/cluster.es.client.lib/7.2.6.1/inst_root/liblpp.amm 8692 0 68 7608 0 1929 2118 0 1654099948 203 1 750 28 cluster.es.client.lib.post_u` #!/bin/ksh # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61pkgha_r714 src/packages/cluster/es/client/lib/root/cluster.es.client.lib.post_u.sh 1.4.1.1 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)58 1.4.1.1 src/packages/cluster/es/client/lib/root/cluster.es.client.lib.post_u.sh, pkghacmp, 61pkgha_r714 12/1/11 11:27:53 HAPATH="/usr/es/sbin/cluster" if [[ -z "$INUCLIENTS" && -z "$INUBOSTYPE" ]] then # If the "cllsif" command is not present then the "rc.init" script does not # do any thing and simply returns. This is ok for PowerHA SystemMirror server but since we # might be running this script on a stand-alone machine, we should restart # clcomdES here (if the clcomd binary is present on the system). if [[ ! -f /usr/es/sbin/cluster/utilities/cllsif ]] then if [[ -f /usr/es/sbin/cluster/clcomd ]] then startsrc -s clcomdES > /dev/null 2>&1 if [[ $? != 0 ]] then echo "ERROR: Unable to start the clcomd daemon. Try running the following command manually:" echo "startsrc -s clcomdES" fi fi else # Start cluster services ${HAPATH}/etc/rc.init >/dev/null 2>&1 if [[ $? -ne 0 ]] then echo "ERROR: Unable to start cluster daemons. Cluster daemons must be" echo " restarted before attempting to start cluster services." echo " Try running the following command manually:" echo " ${HAPATH}/etc/rc.init" fi fi fi exit 0 2372 4608 68 1654099948 203 1 750 27 cluster.es.client.lib.pre_u` #!/bin/ksh # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2020,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61pkgha_r714 src/packages/cluster/es/client/lib/root/cluster.es.client.lib.pre_u.sh 1.3.1.1 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b packages/cluster/es/client/lib/root/cluster.es.client.lib.pre_u.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM HAPATH="/usr/es/sbin/cluster" CLSTRMGR="clstrmgrES" function if_failed { status=$1 errmsg=$2 if [ $status -ne 0 ]; then echo Failed $errmsg exit 99 fi } function get_cluster_state { clstate=$(lssrc -ls $CLSTRMGR | grep "Current state:" | cut -f2 -d":") } function stop_cluster_services { for service in $service_list do LC_ALL=C lssrc -s $service | grep -w inoperative >/dev/null 2>&1 if [ $? -ne 0 ] then stopsrc -s $service >/dev/null 2>&1 fi done # Clean unused shared libraries /usr/sbin/slibclean } if [[ -z "$INUCLIENTS" && -z "$INUBOSTYPE" ]] then get_cluster_state # If the cluster is running, the state will be forced down # and the clstrmgr should be stopped using clRMupdate. All # other services should be stopped normally. if [[ $clstate = " ST_STABLE" ]] then /usr/es/sbin/cluster/utilities/cl_subsys_ctl clstrmgrES stopdaemon if (( $? != 1 )) then echo Failed stopping clstrmgr daemon. exit 99 fi service_list="clinfoES clcomdES" stop_cluster_services else # If the cluster is not running, all services should be # stopped normally service_list="clstrmgrES clinfoES clcomdES" stop_cluster_services fi sleep 4 # Check to make sure clstrmgr stopped get_cluster_state if [[ $clstate != "" ]] then echo "\nERROR\nCluster services are active on this node. Please stop all" echo "cluster services prior to installing this software.\n" exit 1 fi fi # INUCLIENTS exit 0 2880 7608 2118 1654099948 203 1 750 30 cluster.es.client.lib.unpost_u` #!/bin/ksh # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2020,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61pkgha_r714 src/packages/cluster/es/client/lib/root/cluster.es.client.lib.unpost_u.sh 1.3 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b packages/cluster/es/client/lib/root/cluster.es.client.lib.unpost_u.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM CLSTRMGR="clstrmgrES" function if_failed { status=$1 errmsg=$2 if [ $status -ne 0 ]; then echo Failed $errmsg rcstatus=99 fi } function get_cluster_state { clstate=$(lssrc -ls $CLSTRMGR | grep "Current state:" | cut -f2 -d":") } function clstrmgr_running_fail { echo "\nERROR: Cluster services are active on this node. Please" echo "restart cluster services prior to using this software.\n" rcstatus=99 } function stop_cluster_services { for service in $service_list do LC_ALL=C lssrc -s $service | grep -w inoperative >/dev/null 2>&1 if [ $? -ne 0 ] then stopsrc -s $service >/dev/null 2>&1 fi done # Clean unused shared libraries /usr/sbin/slibclean } if [[ -z "$INUCLIENTS" ]] then HAPATH="/usr/es/sbin/cluster" get_cluster_state if [[ $clstate = " ST_STABLE" ]] then # Determine the node name nodename=`ODMDIR=/etc/es/objrepos odmget HACMPcluster | grep -w nodename \ | cut -f3 -d " "` # Remove the quotes nodename=${nodename#\"} nodename=${nodename%\"} # If the clstrmgr is stable, the node should be forced down or fail lssrc -ls $CLSTRMGR | grep "Forced down node list" | grep -w $nodename \ >/dev/null 2>&1 if [ $? -ne 0 ] then clstrmgr_running_fail else /usr/es/sbin/cluster/utilities/cl_subsys_ctl clstrmgrES stopdaemon if (( $? != 1 )) then echo Failed stopping clstrmgr daemon. rcstatus=99 fi service_list="clinfoES clcomdES" stop_cluster_services fi # If clstrmgr not in not running, not configured or init, fail elif [[ -n $clstate && $clstate != " NOT_CONFIGURED" && \ $clstate != " ST_INIT" ]] then clstrmgr_running_fail else service_list="clstrmgrES clinfoES clcomdES" stop_cluster_services fi sleep 4 # Check to make sure clstrmgr stopped get_cluster_state if [[ $clstate != "" ]] then echo "\nERROR\nUnable to stop the cluster daemons on this node.\n" rcstatus=99 fi fi # INUCLIENTS exit 0 961 8692 4608 1654099948 203 1 750 29 cluster.es.client.lib.unpre_u` #!/bin/ksh # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61pkgha_r714 src/packages/cluster/es/client/lib/root/cluster.es.client.lib.unpre_u.sh 1.3.1.1 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2009 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)60 1.3.1.1 src/packages/cluster/es/client/lib/root/cluster.es.client.lib.unpre_u.sh, pkghacmp, 61pkgha_r714 2/23/09 13:53:39 if [[ -z "$INUCLIENTS" && -f /usr/es/sbin/cluster/clcomd ]] then # Start cluster services startsrc -s clcomdES >/dev/null 2>&1 if [[ $? -ne 0 ]] then echo "ERROR: Unable to start the clcomd daemon. Try running the following command manually." echo " Run: startsrc -s clcomdES" fi fi exit 0 178 0 7608 0 0 0 0 0 ` 4 68 2118 4608 7608 cluster.es.client.lib.post_ucluster.es.client.lib.pre_ucluster.es.client.lib.unpost_ucluster.es.client.lib.unpre_u kd0+$b՝ab& # ./usr/es/lib/ksh93/OEMVeritas/KLIB_OEMVeritas_deportDiskGroup$$#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/OEMVeritas/KLIB_OEMVeritas_deportDiskGroup.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)07 1.4 src/43haes/lib/ksh93/OEMVeritas/KLIB_OEMVeritas_deportDiskGroup.sh, hacmp.utils, 61haes_r714 11/28/11 15:06:02 function KLIB_OEMVeritas_deportDiskGroup { . /usr/es/lib/ksh93/func_include typeset dg=$1 if [[ -z $dg ]]; then return 1 fi REQUIRED_COMMANDS="/usr/sbin/vxvol /usr/sbin/vxdg" for cmd in $REQUIRED_COMMANDS; do if [[ ! -x $cmd ]]; then return 1 fi done /usr/sbin/vxvol -g $dg stopall /usr/sbin/vxdg deport $dg }  k00+$b՝ab& # ./usr/es/lib/ksh93/OEMVeritas/KLIB_OEMVeritas_getDiskGroupForFilesystem$$#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/OEMVeritas/KLIB_OEMVeritas_getDiskGroupForFilesystem.sh 1.5 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)08 1.5 src/43haes/lib/ksh93/OEMVeritas/KLIB_OEMVeritas_getDiskGroupForFilesystem.sh, hacmp.utils, 61haes_r714 11/28/11 15:03:23 function KLIB_OEMVeritas_getDiskGroupForFilesystem { . /usr/es/lib/ksh93/func_include typeset filesystem=$1 typeset dgs=$(KLIB_OEMVeritas_lsdg) typeset dg typeset fs for dg in $dgs; do # If DG is active, read off of disk filesystems=$(KLIB_OEMVeritas_getFilesystemsForDiskGroup $dg) for fs in $filesystems; do if [[ "$fs" == "$filesystem" ]]; then echo $dg return 0 fi done done # If DG is inactive, try /etc/filesystems dg=$(LANG="C" lsfs -v vxfs | grep -w $filesystem | awk -F"/" '{ print $5 }') if [[ -n $dg ]]; then echo $dg return 0 fi # If dg not found, failure return 1 }  kZ0+$b՝ab& # ./usr/es/lib/ksh93/OEMVeritas/KLIB_OEMVeritas_getDiskGroupState$$#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/OEMVeritas/KLIB_OEMVeritas_getDiskGroupState.sh 1.6 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)09 1.6 src/43haes/lib/ksh93/OEMVeritas/KLIB_OEMVeritas_getDiskGroupState.sh, hacmp.utils, 61haes_r714 11/28/11 15:02:08 function KLIB_OEMVeritas_getDiskGroupState { . /usr/es/lib/ksh93/func_include typeset dg=$1 if [[ ! -f /usr/sbin/vxdg || ! -x /usr/sbin/vxdg ]]; then return 1 fi LC_ALL=C /usr/sbin/vxdg list | while read name state id; do if [[ "$name" != "NAME" && "$name" == "$dg" ]]; then echo $name fi done return 0 } for  kF0+$b՝ab& # ./usr/es/lib/ksh93/OEMVeritas/KLIB_OEMVeritas_getDisksForDiskGroupstem$$#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/OEMVeritas/KLIB_OEMVeritas_getDisksForDiskGroup.sh 1.7 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)10 1.7 src/43haes/lib/ksh93/OEMVeritas/KLIB_OEMVeritas_getDisksForDiskGroup.sh, hacmp.utils, 61haes_r714 11/28/11 15:00:51 function KLIB_OEMVeritas_getDisksForDiskGroup { . /usr/es/lib/ksh93/func_include typeset dg=$1 if [[ ! -x /usr/sbin/vxdisk ]]; then return 1 fi LC_ALL=C /usr/sbin/vxdisk list | while read device type disk group status; do if [[ "$group" == "$dg" ]]; then echo $disk fi done } fi  k0+$b՝ab& # ./usr/es/lib/ksh93/OEMVeritas/KLIB_OEMVeritas_getFilesystemsForDiskGroup$$#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/OEMVeritas/KLIB_OEMVeritas_getFilesystemsForDiskGroup.sh 1.8 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)11 1.8 src/43haes/lib/ksh93/OEMVeritas/KLIB_OEMVeritas_getFilesystemsForDiskGroup.sh, hacmp.utils, 61haes_r714 11/28/11 14:59:42 function KLIB_OEMVeritas_getFilesystemsForDiskGroup { . /usr/es/lib/ksh93/func_include typeset dg=$1 if [[ -z $dg ]]; then return 1 fi typeset l_mountpoint typeset l_device typeset l_vfs typeset l_nodename typeset l_type typeset l_size typeset l_options typeset l_automount typeset l_acct typeset l_type typeset l_minor typeset l_bdev typeset l_cdev typeset l_path typeset device typeset device_paths REQUIRED_COMMANDS="/usr/sbin/vxprint /usr/sbin/lsfs" for cmd in $REQUIRED_COMMANDS; do if [[ ! -x $cmd ]]; then return 1 fi done # Get a list of device paths for this diskgroup LC_ALL=C /usr/sbin/vxprint -l -g $dg | while read l_type l_minor l_bdev l_cdev l_path ; do if [[ "$l_type" == "device:" && -n $l_path ]]; then l_path=${l_path/path\=/} device_paths="$l_path $device_paths" fi done if [[ -z $device_paths ]]; then return 0 fi LC_ALL=C /usr/sbin/lsfs -c -v vxfs | while IFS=':' read l_mountpoint l_device l_vfs l_nodename l_type l_size l_options l_automount l_acct; do for device in $device_paths; do if [[ "$device" == "$l_device" ]]; then echo $l_mountpoint fi done done return 0 }  k$]0+$b՝ab& # ./usr/es/lib/ksh93/OEMVeritas/KLIB_OEMVeritas_getVolumesForDiskGroupoup$$#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/OEMVeritas/KLIB_OEMVeritas_getVolumesForDiskGroup.sh 1.7 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)12 1.7 src/43haes/lib/ksh93/OEMVeritas/KLIB_OEMVeritas_getVolumesForDiskGroup.sh, hacmp.utils, 61haes_r714 11/28/11 14:58:48 function KLIB_OEMVeritas_getVolumesForDiskGroup { . /usr/es/lib/ksh93/func_include typeset dg=$1 if [[ -z $dg ]]; then return 1 fi if [[ ! -x /usr/sbin/vxprint ]]; then return 1 fi LC_ALL=C /usr/sbin/vxprint -h -g $dg | while read type name assoc kstate length ploffs; do if [[ "$type" == "v" ]]; then echo $name fi done return 0 } l_b k0+$b՝ab& # ./usr/es/lib/ksh93/OEMVeritas/KLIB_OEMVeritas_importDiskGroupkG$$#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/OEMVeritas/KLIB_OEMVeritas_importDiskGroup.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)13 1.4 src/43haes/lib/ksh93/OEMVeritas/KLIB_OEMVeritas_importDiskGroup.sh, hacmp.utils, 61haes_r714 11/28/11 14:57:52 function KLIB_OEMVeritas_importDiskGroup { . /usr/es/lib/ksh93/func_include typeset dg=$1 if [[ -z $dg ]]; then return 1 fi REQUIRED_COMMANDS="/usr/sbin/vxdg /usr/sbin/vxvol" for cmd in $REQUIRED_COMMANDS; do if [[ ! -x $cmd ]]; then return 1 fi done /usr/sbin/vxdg import $dg /usr/sbin/vxvol -g $dg startall } o $ k1+$Xb՝ab&X # ./usr/es/lib/ksh93/OEMVeritas/KLIB_OEMVeritas_lsdgtDisk$$#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/OEMVeritas/KLIB_OEMVeritas_lsdg.sh 1.7 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)14 1.7 src/43haes/lib/ksh93/OEMVeritas/KLIB_OEMVeritas_lsdg.sh, hacmp.utils, 61haes_r714 11/28/11 14:56:49 function KLIB_OEMVeritas_lsdg { . /usr/es/lib/ksh93/func_include if [[ ! -x /usr/sbin/vxdg ]]; then return 1 fi LC_ALL=C /usr/sbin/vxdg list | while read name state id; do if [[ "$name" != "NAME" ]]; then echo $name fi done return 0 }  k1+b՝ab& # ./usr/es/lib/ksh93/aix/KLIB_AIX_ODM_fields_differtDisk#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/aix/odm/KLIB_AIX_ODM_fields_differ.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)70 1.4 src/43haes/lib/ksh93/aix/odm/KLIB_AIX_ODM_fields_differ.sh, hacmp, 61haes_r714 11/28/11 15:13:43 # #=head1 NAME # # KLIB_AIX_ODM_fields_differ - Compare two ODMs field by field and # report the fields that are different # to the third list argument # #=head1 SYNOPSIS # # typeset different_fields # KLIB_AIX_ODM_fields_differ "HACMPcluster" "/etc/es/objrepos" \ # "/usr/es/sbin/cluster/hacmp/etc/objrepos/" different_fields # echo $different_fields # #=head1 DESCRIPTION # # For the specified class, the ODM is compared between two # separate directories # #=head1 ARGUMENTS # # 1: [scalar] ODM class name # 2: [scalar] first odm directory to obtain the first copy of the ODM # 3: [scalar] second odm directory to load the second copy # 4: [by ref] list variable to add the differing fields to # #=head1 RETURN # # 0: success # 1: failed # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_AIX_ODM_fields_differ { . /usr/es/lib/ksh93/func_include typeset -n list=$4 list='' typeset -A ar1 ar2 typeset strip_quotes=true ODMDIR=$2 odmget $1 | KLIB_UTIL_LIST_array_load_by_token ar1 $strip_quotes "$IFS" '$1' '$3' ODMDIR=$3 odmget $1 | KLIB_UTIL_LIST_array_load_by_token ar2 $strip_quotes "$IFS" '$1' '$3' KLIB_UTIL_LIST_array_fields_differ ar1 ar2 list }  k1+b՝ab& # ./usr/es/lib/ksh93/aix/KLIB_AIX_ODM_get_odm_fieldstDisk#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/aix/odm/KLIB_AIX_ODM_get_odm_fields.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)71 1.4 src/43haes/lib/ksh93/aix/odm/KLIB_AIX_ODM_get_odm_fields.sh, hacmp, 61haes_r714 11/28/11 15:14:41 # #=head1 NAME # # KLIB_AIX_ODM_get_odm_fields - Print value of qualified ODM fields # #=head1 SYNOPSIS # # ip_label=$(KLIB_AIX_ODM_get_odm_fields "name=SERVICE_LABEL and group=rg1" "HACMPresource" "value") # if (( $? == 0 )); then # echo $ip_label # fi # #=head1 DESCRIPTION # # Prints the values of any field in a stanza that matches the supplied query string. # #=head1 ARGUMENTS # # arg1 - predicate literal scalar, string to pass to odmget -q predicate # arg2 - literal odm class name # arg3... literals field names extract # #=head1 RETURN # # 0 - success, found the fields from the class # 1 - failed, unable to find the class, or invalid predicate # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_AIX_ODM_get_odm_fields { . /usr/es/lib/ksh93/func_include typeset -i result=0 odmget -q "$1" "$2" 2>/dev/null | { shift 2 typeset field eq rest arg while read field eq rest; do [[ -z ${rest} || " $* " != *\ $field\ * ]] && continue eval echo $rest # eval strips extra quotes (( ++result )) done } (( result )) } '  kH1+b՝ab& # ./usr/es/lib/ksh93/aix/KLIB_AIX_add_vg_by_diskl#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/aix/KLIB_AIX_add_vg_by_disk.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)75 1.4 src/43haes/lib/ksh93/aix/KLIB_AIX_add_vg_by_disk.sh, hacmp, 61haes_r714 11/28/11 14:54:59 # #=head1 NAME # # KLIB_AIX_add_vg_by_disk - Add a volume group to a list given the raw # disk device /dev/rd* # #=head1 SYNOPSIS # # KLIB_AIX_add_vg_by_disk listvar /dev/rdevtbsp1 "vg1 vg2 vg3" # #=head1 DESCRIPTION # # This function adds the volume group attached to device (2nd arg) # to an array of volume groups if that vg does not already exist # in the thirds argument to this function. # #=head1 ARGUMENTS # # 1: [by ref] list to add volume group to # 2: [scalar] device name to obtain volume group name for # 3+ [scalar] list of volume groups to not duplicate in the arg1 list # #=head1 RETURN # # 0: the device was found, and the list was updated # 1: the device was already present in the provided list of volume groups # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_AIX_add_vg_by_disk { . /usr/es/lib/ksh93/func_include typeset -n setlist=$1 disk_device=$2 shift shift existing_vgs=$* VG=$(KLIB_AIX_get_vg_by_disk $disk_device) if [[ -z $VG ]]; then return 1 fi for evg in $existing_vgs; do if [[ "$VG" == "$evg" ]]; then return 1 fi done setlist="$setlist $VG" return 0 }  k 1+b՝ab& # ./usr/es/lib/ksh93/aix/KLIB_AIX_add_vg_by_pathl#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/aix/KLIB_AIX_add_vg_by_path.sh 1.6 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)69 1.6 src/43haes/lib/ksh93/aix/KLIB_AIX_add_vg_by_path.sh, hacmp, 61haes_r714 11/28/11 15:23:49 # #=head1 NAME # # KLIB_AIX_add_vg_by_path - Add a volume group to a list given a # filesystem path # #=head1 SYNOPSIS # # KLIB_AIX_add_vg_by_path listvar /dev/rdevtbsp1 vg1 vg2 vg3 # #=head1 DESCRIPTION # # This function adds the volume group containing path (2nd arg) # to an array of volume groups if that vg does not already exist # in the third and following arguments to this function. # #=head1 ARGUMENTS # # 1: [by ref] list to add volume group to # 2: [scalar] filesystem path to find volume group for # 3+ [scalar] list of volume groups to not duplicate in the arg1 list # #=head1 RETURN # # 0: the filesystem path was found, and the list was updated # 1: the filesystem volume group was already present in the # provided list of volume groups # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_AIX_add_vg_by_path { . /usr/es/lib/ksh93/func_include typeset -n setlist=$1 typeset filesyspath=$2 shift shift existing_vgs=$* [[ -z $filesyspath ]] && return 1 typeset VG=$(KLIB_AIX_get_vg_by_path $filesyspath) if [[ -z $VG ]]; then return 1 fi for evg in $existing_vgs; do if [[ "$VG" == "$evg" ]]; then return 1 fi done setlist="$setlist $VG" return 0 }  kn 1+b՝ab& # ./usr/es/lib/ksh93/aix/KLIB_AIX_get_fs_freespacestDisk#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/aix/KLIB_AIX_get_fs_freespace.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)75 1.4 src/43haes/lib/ksh93/aix/KLIB_AIX_get_fs_freespace.sh, hacmp.assist, 61haes_r714 11/28/11 15:09:59 # #=head1 NAME # # KLIB_AIX_get_fs_freespace - Determine the amount of freespace for # a filesystem in 512 blocks # #=head1 SYNOPSIS # # freespace_in_mb=$(KLIB_AIX_get_fs_freespace /tmp) # #=head1 DESCRIPTION # # This function determines the amount of freespace for the # specified filesystem and echos that result to stdout # #=head1 ARGUMENTS # # 1: [scalar] name of filesystem to determine free space # #=head1 RETURN # # 0: success, freespace is echo'd to stdout # 1: unable to determine filesystem freespace # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_AIX_get_fs_freespace { . /usr/es/lib/ksh93/func_include typeset fs=$1 df -m $fs | tail -n 1 | while read tmp available freespace pcnt_used; do freespace=${freespace/\.*/} echo $freespace return 0 done return 1 }  kl 1+b՝ab& # ./usr/es/lib/ksh93/aix/KLIB_AIX_get_pvidsespace#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/aix/KLIB_AIX_get_pvids.sh 1.5 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2013 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)67 1.5 src/43haes/lib/ksh93/aix/KLIB_AIX_get_pvids.sh, hacmp, 61haes_r714 6/13/13 08:23:40 # #=head1 NAME # # KLIB_AIX_get_pvids - Determine the pvids associated with a volume group # #=head1 SYNOPSIS # # vg_pvids=$(KLIB_AIX_get_pvids rootvg) # #=head1 DESCRIPTION # # Function echo's to stdout the list of PVIDs associated with the specified # volume group. # #=head1 ARGUMENTS # # 1: [scalar] volume group name # #=head1 RETURN # # None # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_AIX_get_pvids { . /usr/es/lib/ksh93/func_include VG=$1 typeset hdisk="" pvid="" rvg="" state="" PVIDS="" lspv | while read -r hdisk pvid rvg state; do if [[ $rvg == $VG ]]; then if [[ " $PVIDS " != *\ $pvid\ * ]]; then [[ -n $PVIDS ]] && PVIDS="$PVIDS " PVIDS="$PVIDS$pvid" fi fi done echo $PVIDS } reesp k1+jb՝ab&j # ./usr/es/lib/ksh93/aix/KLIB_AIX_get_pvids_by_vgsstDisk#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/aix/KLIB_AIX_get_pvids_by_vgs.sh 1.2 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2009 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)31 1.2 src/43haes/lib/ksh93/aix/KLIB_AIX_get_pvids_by_vgs.sh, hacmp.assist, 61haes_r714 1/13/09 16:24:52 # #=head1 NAME # # KLIB_AIX_get_pvids_by_vgs - Determine the pvids associated with a list of volume groups # #=head1 SYNOPSIS # # vg_pvids=$(KLIB_AIX_get_pvids_by_vgs rootvg was60_vg) # #=head1 DESCRIPTION # # Function echo's to stdout the list of PVIDs associated with the specified # volume groups. # #=head1 ARGUMENTS # # 1: [list] volume group names # #=head1 RETURN # # None # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_AIX_get_pvids_by_vgs { . /usr/es/lib/ksh93/func_include VGS=$1 PVIDS="" for VG in $VGS; do lspv | while read -r hdisk pvid rvg state; do if [[ "$rvg" == "$VG" ]]; then PVIDS=${PVIDS/$pvid/} PVIDS="$PVIDS $pvid" fi done done echo $PVIDS } ="$PVI k1+b՝ab& # ./usr/es/lib/ksh93/aix/KLIB_AIX_get_user_infogs#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/aix/KLIB_AIX_get_user_info.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)68 1.4 src/43haes/lib/ksh93/aix/KLIB_AIX_get_user_info.sh, hacmp, 61haes_r714 11/28/11 15:22:29 # #=head1 NAME # # KLIB_AIX_get_user_info - Get the user group, UID and GID properties # of an AIX user # #=head1 SYNOPSIS # # typeset user_struct_var # user_struct_var ( # user="" # group="" # uid=0 # gid=0 # ) # KLIB_AIX_get_user_info user_struct_var "mattg" # #=head1 DESCRIPTION # # Obtains the user group, UID and GID of the provided user name and populates # the data structure passed in (by reference) as the first argument to # this function # #=head1 ARGUMENTS # # 1: [by ref] user data structure # 2: [scalar] user name to obtain info on # #=head1 RETURN # # 0: success, structure was completely populated # 1: failed, unable to determine part or all of the user # info given the user name provided to this function # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_AIX_get_user_info { . /usr/es/lib/ksh93/func_include typeset -n userinfo=$1 typeset user=$2 typeset group typeset uid typeset gid if [[ -z $user ]]; then return 1 fi userinfo.user=$user uid=$(lsuser -a id $user 2>/dev/null) if [[ -z $uid ]]; then return 1 fi group=$(KLIB_AIX_get_usergroup $user) if [[ -z $group ]]; then return 1 fi gid=$(lsgroup -a id $group) if [[ -z $gid ]]; then return 1 fi userinfo.uid=${uid/*=/} userinfo.gid=${gid/*=/} userinfo.group=$group userinfo.user=$user return 0 } $ k1+.b՝ab&. # ./usr/es/lib/ksh93/aix/KLIB_AIX_get_usergroupgs#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/aix/KLIB_AIX_get_usergroup.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)74 1.4 src/43haes/lib/ksh93/aix/KLIB_AIX_get_usergroup.sh, hacmp, 61haes_r714 11/28/11 14:53:55 # #=head1 NAME # # KLIB_AIX_get_usergroup - Obtain the group name for a user # #=head1 SYNOPSIS # # group=$(KLIB_AIX_get_usergroup "mattg") # #=head1 DESCRIPTION # # This function will echo to stdout the group name for the specified user # the group is the parent group, not the list of groups the user belongs to # #=head1 ARGUMENTS # # 1: [scalar] user name to determine parent group (pgrp in lsuser) # #=head1 RETURN # # None, echos output to stdout # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_AIX_get_usergroup { . /usr/es/lib/ksh93/func_include user=$1 group=$(lsuser -a pgrp $user) group=${group/*=/} echo $group } ov k.1+{b՝ab&{ # ./usr/es/lib/ksh93/aix/KLIB_AIX_get_vg_by_disks#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/aix/KLIB_AIX_get_vg_by_disk.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)72 1.4 src/43haes/lib/ksh93/aix/KLIB_AIX_get_vg_by_disk.sh, hacmp, 61haes_r714 11/28/11 15:24:58 # #=head1 NAME # # KLIB_AIX_get_vg_by_disk - Obtain the volume group name for the # specified device name # #=head1 SYNOPSIS # # vg=$(KLIB_AIX_get_vg_by_disk "/dev/rdevtbsp1") # #=head1 DESCRIPTION # # Echo's to stdout the volume group name for the specified raw disk device # #=head1 ARGUMENTS # # 1: [scalar] raw disk device name # #=head1 RETURN # # 0: success, stdout contains the name of the volume group # 1: failed, unable to find the volume group info in the local AIX odms # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_AIX_get_vg_by_disk { . /usr/es/lib/ksh93/func_include typeset disk=$1 if [[ -z $disk ]]; then return 1 fi # If the disk device is /dev/rdevtblsp1 then the CuDv entry is devtblsp1 typeset CuDvDisk=${disk/\/dev\/r/} typeset name typeset value odmget -q name=$CuDvDisk CuDv | while IFS='=' read name value; do value=$(eval echo $value) # strip the "" from any values in CuAt name=$(eval echo $name) # strip any whitespace if [[ "$name" == "parent" ]]; then echo $value return 0 fi done return 1 } ${uid kXO1+ b՝ab& # ./usr/es/lib/ksh93/aix/KLIB_AIX_get_vg_by_paths#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/aix/KLIB_AIX_get_vg_by_path.sh 1.7 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)73 1.7 src/43haes/lib/ksh93/aix/KLIB_AIX_get_vg_by_path.sh, hacmp, 61haes_r714 11/28/11 15:26:04 # #=head1 NAME # # KLIB_AIX_get_vg_by_path - Get the volume group name for the specified path # #=head1 SYNOPSIS # # vg=$(KLIB_AIX_get_vg_by_path "/tmp") # if (( $? == 0 )); then # echo $vg # fi # #=head1 DESCRIPTION # # Obtains the name of the volume group for the specified file system path # #=head1 ARGUMENTS # # 1: [scalar] Filesystem path # #=head1 RETURN # # 0: success, stdout contains the name of the volume group # 1: failed, unable to determine the volume group name for # the specified path # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_AIX_get_vg_by_path { . /usr/es/lib/ksh93/func_include typeset path=$1 typeset filesystem typeset tmp typeset free_mb typeset pcnt_used typeset inode_used typeset pcnt_iused typeset mounted [[ -z $path ]] && return 1 typeset logical_volume= if (( $(df -m $path 2>/dev/null | wc -l 2>/dev/null) > 2 )); then df -m $path 2>/dev/null | tail -n 2 | head -n 1 | read -r filesystem tmp free_mb pcnt_used inode_used pcnt_iused mounted else df -m $path 2>/dev/null | tail -n 1 | read -r filesystem tmp free_mb pcnt_used inode_used pcnt_iused mounted fi odmget -q value=$mounted CuAt 2>/dev/null | while IFS='=' read name value; do value=$(eval echo $value) # strip the "" from any values in CuAt name=$(eval echo $name) # strip any whitespace if [[ "$name" == "name" ]]; then logical_volume=$value break fi done 2>/dev/null if [[ -z $logical_volume ]]; then return 1 fi odmget -q name=$logical_volume CuDv | while IFS='=' read name value; do value=$(eval echo $value) # strip the "" from any values in CuAt name=$(eval echo $name) # strip any whitespace if [[ "$name" == "parent" ]]; then echo $value return 0 fi done 2>/dev/null return 1 }  kNo1+b՝ab& # ./usr/es/lib/ksh93/aix/KLIB_AIX_mount_fs_for_directoryk#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/aix/KLIB_AIX_mount_fs_for_directory.sh 1.3 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2009 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)60 1.3 src/43haes/lib/ksh93/aix/KLIB_AIX_mount_fs_for_directory.sh, hacmp.assist, 61haes_r714 1/13/09 16:24:51 # #=head1 NAME # # KLIB_AIX_mount_fs_for_directory - Determine the pvids associated with a list of volume groups # #=head1 SYNOPSIS # # KLIB_AIX_mount_fs_for_directory vg directory # #=head1 DESCRIPTION # # Attempt to mount the filesystem on a volume group containing # the directory path # #=head1 ARGUMENTS # # 1: [scalar] volume group name # 2: [scalar] directory path # #=head1 RETURN # # 0 - success # 1 - failure # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_AIX_mount_fs_for_directory { . /usr/es/lib/ksh93/func_include typeset VG=$1 typeset DIRECTORY=$2 if [[ -z $(lsvg -o | grep $VG) ]] ; then varyonvg $VG 2>/dev/null if (( $? != 0 )) ; then KLIB_WAS_log_message "WAS ERROR: Unable to vary on volume group $vg." return 1 fi fi # Look for an existing FS on the volume group that might contain the directory and mount it typeset mountpoint for mountpoint in $(lsvg -l $VG | awk '$2 == "jfs" || $2 == "jfs2" {print $7}') ; do if [[ $mountpoint == ${DIRECTORY:0:${#mountpoint}} ]] ; then if [[ ${#mountpoint} == ${#DIRECTORY} || ${DIRECTORY:${#mountpoint}:1} == "/" ]] ; then if [[ -z $(mount 2>/dev/null | awk '$3 ~ /jfs2*$/ {print $2}' | grep $mountpoint) ]] ; then mount $mountpoint 2>/dev/null if (( $? != 0 )) ; then KLIB_WAS_log_message "WAS ERROR: Unable to mount filesystem $mountpoint." return 1 fi fi fi fi done if [[ -e $DIRECTORY ]] ; then return 0 else return 1 fi } hen  kҋ1+b՝ab& # ./usr/es/lib/ksh93/aix/KLIB_HACMP_AIX_lsactivefsctoryk#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/aix/KLIB_HACMP_AIX_lsactivefs.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)20 1.3 src/43haes/lib/ksh93/aix/KLIB_HACMP_AIX_lsactivefs.sh, hacmp, 61haes_r714 11/28/11 14:56:49 # #=head1 NAME # # KLIB_HACMP_AIX_lsactivefs - List all active filesystems # #=head1 ARGUMENTS # # None. # #=head1 RETURN # # 0: success # 1: failure # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_HACMP_AIX_lsactivefs { . /usr/es/lib/ksh93/func_include typeset ERROR_IF_ARGS=$1 if [[ -n $ERROR_IF_ARGS ]]; then return 1 fi LANG="C" FSS=`mount 2>/dev/null | awk '$3 ~ /jfs2*$/ {print $2}' 2>/dev/null` if [[ $? -ne 0 ]]; then return 1 else for FS in $FSS; do echo $FS done fi return 0 } /func_ k 1+b՝ab& # ./usr/es/lib/ksh93/aix/KLIB_HACMP_AIX_lsactivevgctoryk#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/aix/KLIB_HACMP_AIX_lsactivevg.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)21 1.3 src/43haes/lib/ksh93/aix/KLIB_HACMP_AIX_lsactivevg.sh, hacmp, 61haes_r714 11/28/11 14:57:43 # #=head1 NAME # # KLIB_HACMP_AIX_lsactivevg - List allactive LVM volume groups # #=head1 ARGUMENTS # # None. # #=head1 RETURN # # 0: success # 1: failure # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_HACMP_AIX_lsactivevg { . /usr/es/lib/ksh93/func_include typeset ERROR_IF_ARGS=$1 if [[ -n $ERROR_IF_ARGS ]]; then return 1 fi LANG="C" VGS=`/usr/sbin/lsvg -o 2>/dev/null` if [[ $? -ne 0 ]]; then return 1 else for VG in $VGS; do echo $VG done fi return 0 } do k"1+b՝ab& # ./usr/es/lib/ksh93/aix/KLIB_HACMP_AIX_lsfsivevg#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/aix/KLIB_HACMP_AIX_lsfs.sh 1.4 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)22 1.4 src/43haes/lib/ksh93/aix/KLIB_HACMP_AIX_lsfs.sh, hacmp, 61haes_r714 11/28/11 14:58:49 # #=head1 NAME # # KLIB_HACMP_AIX_lsfs - List all JFS* filesystems # #=head1 ARGUMENTS # # None. # #=head1 RETURN # # 0: success # 1: failure # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_HACMP_AIX_lsfs { . /usr/es/lib/ksh93/func_include typeset ERROR_IF_ARGS=$1 if [[ -n $ERROR_IF_ARGS ]]; then return 1 fi LANG="C" FSS=`lsfs | grep -v "vxfs" | awk '{ print $3 }' 2>/dev/null` if [[ $? -ne 0 ]]; then return 1 else for FS in $FSS; do echo $FS done fi return 0 } 0 } do kH!1+b՝ab& # ./usr/es/lib/ksh93/aix/KLIB_HACMP_AIX_lspvivevg#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/aix/KLIB_HACMP_AIX_lspv.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)23 1.3 src/43haes/lib/ksh93/aix/KLIB_HACMP_AIX_lspv.sh, hacmp, 61haes_r714 11/28/11 14:59:42 # #=head1 NAME # # KLIB_HACMP_AIX_lspv - List all physical volumes (hdisks) for given # volume group # #=head1 ARGUMENTS # # 1: [scalar] volume group name # #=head1 RETURN # # 0: success # 1: failure # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_HACMP_AIX_lspv { . /usr/es/lib/ksh93/func_include VG=$1 if [[ -z "$VG" ]]; then LANG="C" PVS=`lspv | grep -vw "None" | awk '{ print $1 }' 2>/dev/null` else LANG="C" PVS=`lspv | grep -w $VG | awk '{ print $1 }' 2>/dev/null` fi if [[ $? -ne 0 ]]; then return 1 else for PV in $PVS; do echo $PV done fi return 0 } (lsvg k~#1+}b՝ab&} # ./usr/es/lib/ksh93/aix/KLIB_HACMP_AIX_lsvgivevg#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/aix/KLIB_HACMP_AIX_lsvg.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)24 1.3 src/43haes/lib/ksh93/aix/KLIB_HACMP_AIX_lsvg.sh, hacmp, 61haes_r714 11/28/11 15:00:50 # #=head1 NAME # # KLIB_HACMP_AIX_lsvg - List all LVM volume groups # #=head1 ARGUMENTS # # None. # #=head1 RETURN # # 0: success # 1: failure # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_HACMP_AIX_lsvg { . /usr/es/lib/ksh93/func_include typeset ERROR_IF_ARGS=$1 if [[ -n $ERROR_IF_ARGS ]]; then return 1 fi LANG="C" VGS=`/usr/sbin/lsvg 2>/dev/null` if [[ $? -ne 0 ]]; then return 1 else for VG in $VGS; do echo $VG done fi return 0 } if  k%1+^b՝ab&^ # ./usr/es/lib/ksh93/aix/KLIB_HACMP_AIX_mountvevg#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/aix/KLIB_HACMP_AIX_mount.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)25 1.3 src/43haes/lib/ksh93/aix/KLIB_HACMP_AIX_mount.sh, hacmp, 61haes_r714 11/28/11 15:02:07 # #=head1 NAME # # KLIB_HACMP_AIX_mount - mounts given filesystem via AIX mount command # #=head1 ARGUMENTS # # 1: [scalar] file system name # # #=head1 RETURN # # 0: success # 1: failure # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_HACMP_AIX_mount { . /usr/es/lib/ksh93/func_include typeset FS=$1 if [[ -z $FS ]]; then return 1 fi LANG="C" /usr/sbin/mount $FS 2>/dev/null if [[ $? -ne 0 ]]; then return 1 else return 0 fi }  k '1+xb՝ab&x # ./usr/es/lib/ksh93/aix/KLIB_HACMP_AIX_odmtvevg#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/aix/KLIB_HACMP_AIX_odm.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)26 1.3 src/43haes/lib/ksh93/aix/KLIB_HACMP_AIX_odm.sh, hacmp, 61haes_r714 11/28/11 15:03:08 # #=head1 NAME # # KLIB_HACMP_AIX_odm - List volume group hosting the given filesystem # #=head1 ARGUMENTS # # 1: [scalar] file system name # # #=head1 RETURN # # 0: success # 1: failure # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_HACMP_AIX_odm { . /usr/es/lib/ksh93/func_include typeset FS=$1 if [[ -z $FS ]]; then return 1 fi LANG="C" /usr/es/sbin/cluster/events/utils/cl_fs2disk -v $FS 2>/dev/null if [[ $? -ne 0 ]]; then return 1 else return 0 fi }  k$)1+gb՝ab&g # ./usr/es/lib/ksh93/aix/KLIB_HACMP_AIX_umountevg#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/aix/KLIB_HACMP_AIX_umount.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)27 1.3 src/43haes/lib/ksh93/aix/KLIB_HACMP_AIX_umount.sh, hacmp, 61haes_r714 11/28/11 15:05:48 # #=head1 NAME # # KLIB_HACMP_AIX_umount - unmounts given filesystem via AIX umount command # #=head1 ARGUMENTS # # 1: [scalar] file system name # # #=head1 RETURN # # 0: success # 1: failure # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_HACMP_AIX_umount { . /usr/es/lib/ksh93/func_include typeset FS=$1 if [[ -z $FS ]]; then return 1 fi LANG="C" /usr/sbin/umount $FS 2>/dev/null if [[ $? -ne 0 ]]; then return 1 else return 0 fi } t kX,1+b՝ab& # ./usr/es/lib/ksh93/aix/KLIB_HACMP_AIX_varyoffvg#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/aix/KLIB_HACMP_AIX_varyoffvg.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)28 1.3 src/43haes/lib/ksh93/aix/KLIB_HACMP_AIX_varyoffvg.sh, hacmp, 61haes_r714 11/28/11 15:07:10 # #=head1 NAME # # KLIB_HACMP_AIX_varyoff - deactivates given volume group via AIX varyoffvg # command # #=head1 ARGUMENTS # # 1: [scalar] volume group name # # #=head1 RETURN # # 0: success # 1: failure # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_HACMP_AIX_varyoffvg { . /usr/es/lib/ksh93/func_include typeset VG=$1 if [[ -z $VG ]]; then return 1 fi LANG="C" /usr/sbin/varyoffvg $VG 2>/dev/null if [[ $? -ne 0 ]]; then return 1 else return 0 fi } -n kX.1+~b՝ab&~ # ./usr/es/lib/ksh93/aix/KLIB_HACMP_AIX_varyonvg#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/aix/KLIB_HACMP_AIX_varyonvg.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)29 1.3 src/43haes/lib/ksh93/aix/KLIB_HACMP_AIX_varyonvg.sh, hacmp, 61haes_r714 11/28/11 15:08:15 # #=head1 NAME # # KLIB_HACMP_AIX_varyon - deactivates given volume group via AIX varyonvg # command # #=head1 ARGUMENTS # # 1: [scalar] volume group name # # #=head1 RETURN # # 0: success # 1: failure # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_HACMP_AIX_varyonvg { . /usr/es/lib/ksh93/func_include typeset VG=$1 if [[ -z $VG ]]; then return 1 fi LANG="C" /usr/sbin/varyonvg $VG 2>/dev/null if [[ $? -ne 0 ]]; then return 1 else return 0 fi } f ky21+T<b՝ab&T< # ./usr/es/lib/ksh93/availability/cl_amlibyonvg#!/bin/ksh93 #---------------------------------------------------------------------------- # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2018,2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # #---------------------------------------------------------------------------- # @(#) 7d4c34b 43haes/lib/ksh93/availability/cl_amlib.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #---------------------------------------------------------------------------- # Global Definitions: #---------------------------------------------------------------------------- PATH=$(/usr/es/sbin/cluster/utilities/cl_get_path all) export PATH # For Availability metrics tool, log file by default is /var/hacmp/availability/clavailability.log export CLAM_LOG_FILE_NAME="clavailability.log" # Fetch the CLAM_LOG_DIR from HACMPlogs ODM CLAM_LOG_DIR=$(clodmget -q "name = $CLAM_LOG_FILE_NAME" -f value -n HACMPlogs) [[ -z $CLAM_LOG_DIR ]] && CLAM_LOG_DIR="/var/hacmp/availability" # Create a log directory, if it does not exists export CLAM_LOG_DIR [[ ! -d $CLAM_LOG_DIR ]] && mkdir -p $CLAM_LOG_DIR > /dev/null 2>&1 export CLAM_LOG_FILE="$CLAM_LOG_DIR/$CLAM_LOG_FILE_NAME" #Exporting the tags related to Availability Metrics # Tags related to ROHA Assesment, acquire and release export AM_ROHA_ASSESSMENT_BEGIN="" export AM_ROHA_ASSESSMENT_END="" export AM_ROHA_ASSESSMENT_FAILURE="" export AM_ROHA_ACQUIRE_BEGIN="" export AM_ROHA_ACQUIRE_END="" export AM_ROHA_RELEASE_BEGIN="" export AM_ROHA_RELEASE_END="" #Tags related to application start & stop export AM_APP_START_BEGIN="" export AM_APP_START_END="" export AM_APP_START_FAILURE="" export AM_APP_STOP_BEGIN="" export AM_APP_STOP_END="" export AM_APP_STOP_FAILURE="" #Tags related to Service IP alias & dealias export AM_SERVICEIP_ALIAS_BEGIN="" export AM_SERVICEIP_ALIAS_END="" export AM_SERVICEIP_ALIAS_FAILURE="" export AM_SERVICEIP_DEALIAS_BEGIN="" export AM_SERVICEIP_DEALIAS_END="" export AM_SERVICEIP_DEALIAS_FAILURE="" #Tags related to Volume Group export AM_VG_VARYON_BEGIN="" export AM_VG_VARYON_END="" export AM_VG_VARYON_FAILURE="" export AM_VG_VARYOFF_BEGIN="" export AM_VG_VARYOFF_END="" export AM_VG_VARYOFF_FAILURE="" export AM_VG_SYNC_BEGIN_RG_MOVE="" export AM_VG_SYNC_END_RG_MOVE="" export AM_VG_SYNC_FAILURE_RG_MOVE="" export AM_VG_SYNC_BEGIN_RG_MOVE_COMPLETE="" export AM_VG_SYNC_END_RG_MOVE_COMPLETE="" export AM_VG_SYNC_FAILURE_RG_MOVE_COMPLETE="" #Tags related to Filesystem mount & unmount export AM_FS_MOUNT_BEGIN="" export AM_FS_MOUNT_END="" export AM_FS_MOUNT_FAILURE="" export AM_FS_UMOUNT_BEGIN="" export AM_FS_UMOUNT_END="" export AM_FS_UMOUNT_FAILURE="" #Tags related to Network Filesystem activate & deactivate export AM_NFS_ACTIVATE_BEGIN="" export AM_NFS_ACTIVATE_END="" export AM_NFS_ACTIVATE_FAILURE="" export AM_NFS_DEACTIVATE_BEGIN="" export AM_NFS_DEACTIVATE_END="" export AM_NFS_DEACTIVATE_FAILURE="" #Tags related to WPAR activate & deactivate export AM_WPAR_START_BEGIN="" export AM_WPAR_START_END="" export AM_WPAR_START_FAILURE="" export AM_WPAR_STOP_BEGIN="" export AM_WPAR_STOP_END="" export AM_WPAR_STOP_FAILURE="" #Tags related to site_up start & stop export AM_SITE_UP_BEGIN="" export AM_SITE_UP_END="" export AM_SITE_UP_FAILURE="" #Tags related to site_up_complete start & stop export AM_SITE_UP_COMPLETE_BEGIN="" export AM_SITE_UP_COMPLETE_END="" export AM_SITE_UP_COMPLETE_FAILURE="" #Tags related to site_down start & stop export AM_SITE_DOWN_BEGIN="" export AM_SITE_DOWN_END="" export AM_SITE_DOWN_FAILURE="" #Tags related to site_down_complete start & stop export AM_SITE_DOWN_COMPLETE_BEGIN="" export AM_SITE_DOWN_COMPLETE_END="" export AM_SITE_DOWN_COMPLETE_FAILURE="" #Tags related to node_up start & stop export AM_NODE_UP_BEGIN="" export AM_NODE_UP_END="" export AM_NODE_UP_FAILURE="" #Tags related to node_up_complete start & stop export AM_NODE_UP_COMPLETE_BEGIN="" export AM_NODE_UP_COMPLETE_END="" export AM_NODE_UP_COMPLETE_FAILURE="" #Tags related to node_down start & stop export AM_NODE_DOWN_BEGIN="" export AM_NODE_DOWN_END="" export AM_NODE_DOWN_FAILURE="" #Tags related to node_down_complete start & stop export AM_NODE_DOWN_COMPLETE_BEGIN="" export AM_NODE_DOWN_COMPLETE_END="" export AM_NODE_DOWN_COMPLETE_FAILURE="" #Tags related to rg_move_acquire start & stop export AM_RG_MOVE_ACQUIRE_BEGIN="" export AM_RG_MOVE_ACQUIRE_END="" export AM_RG_MOVE_ACQUIRE_FAILURE="" #Tags related to rg_move_release start & stop export AM_RG_MOVE_RELEASE_BEGIN="" export AM_RG_MOVE_RELEASE_END="" export AM_RG_MOVE_RELEASE_FAILURE="" #Tags related to rg_move start & stop export AM_RG_MOVE_BEGIN="" export AM_RG_MOVE_END="" export AM_RG_MOVE_FAILURE="" #Tags related to rg_move_complete start & stop export AM_RG_MOVE_COMPLETE_BEGIN="" export AM_RG_MOVE_COMPLETE_END="" export AM_RG_MOVE_COMPLETE_FAILURE="" #Tags related to rg_move_fence start & stop export AM_RG_MOVE_FENCE_BEGIN="" export AM_RG_MOVE_FENCE_END="" export AM_RG_MOVE_FENCE_FAILURE="" #Tags related to swap_adapter start & stop export AM_SWAP_ADAPTER_BEGIN="" export AM_SWAP_ADAPTER_END="" export AM_SWAP_ADAPTER_FAILURE="" #Tags related to reconfig_topology_start start & stop export AM_RECONFIG_TOPOLOGY_START_BEGIN="" export AM_RECONFIG_TOPOLOGY_START_END="" export AM_RECONFIG_TOPOLOGY_START_FAILURE="" #Tags related to reconfig_topology_complete start & stop export AM_RECONFIG_TOPOLOGY_COMPLETE_BEGIN="" export AM_RECONFIG_TOPOLOGY_COMPLETE_END="" export AM_RECONFIG_TOPOLOGY_COMPLETE_FAILURE="" #Tags related to reconfig_resource_acquire start & stop export AM_RECONFIG_RESOURCE_ACQUIRE_BEGIN="" export AM_RECONFIG_RESOURCE_ACQUIRE_END="" export AM_RECONFIG_RESOURCE_ACQUIRE_FAILURE="" #Tags related to reconfig_resource_release start & stop export AM_RECONFIG_RESOURCE_RELEASE_BEGIN="" export AM_RECONFIG_RESOURCE_RELEASE_END="" export AM_RECONFIG_RESOURCE_RELEASE_FAILURE="" #Tags related to reconfig_configuration_complete start & stop export AM_RECONFIG_CONFIG_COMPLETE_BEGIN="" export AM_RECONFIG_CONFIG_COMPLETE_END="" export AM_RECONFIG_CONFIG_COMPLETE_FAILURE="" #Tags related to configuration changes in a cluster export AM_CONFIG_CHANGES_NODES="" export AM_CONFIG_CHANGES_RG="" export AM_CONFIG_CHANGES_VG="" export AM_CONFIG_CHANGES_FS="" export AM_CONFIG_CHANGES_APP="" export AM_CONFIG_CHANGES_SERVICEIP="" #Tags related to split-merge events export AM_SPLIT_BEGIN="" export AM_SPLIT_END="" export AM_MERGE_BEGIN="" export AM_MERGE_END="" export AM_QUORUM_BEGIN="" export AM_QUORUM_END="" #Tags related to FFDC events export AM_FFDC_BEGIN="" export AM_FFDC_END="" export AM_FFDC_FAILURE="" #Tag for process monitoring export AM_AIX_MON="" #Tags related to SAP Smart Assist export AM_SA_SAP_START_BEGIN="" export AM_SA_SAP_START_END="" export AM_SA_SAP_START_FAILURE="" export AM_SA_SAP_STOP_BEGIN="" export AM_SA_SAP_STOP_END="" export AM_SA_SAP_STOP_FAILURE="" #Tags related to ORACLE Smart Assist export AM_SA_ORACLE_START_BEGIN="" export AM_SA_ORACLE_START_END="" export AM_SA_ORACLE_START_FAILURE="" export AM_SA_ORACLE_STOP_BEGIN="" export AM_SA_ORACLE_STOP_END="" export AM_SA_ORACLE_STOP_FAILURE="" #Tags related to DB2 Smart Assist export AM_SA_DB2_START_BEGIN="" export AM_SA_DB2_START_END="" export AM_SA_DB2_START_FAILURE="" export AM_SA_DB2_STOP_BEGIN="" export AM_SA_DB2_STOP_END="" export AM_SA_DB2_STOP_FAILURE="" #Tags related to Verification Assist export AM_VERIFICATION_BEGIN="" export AM_VERIFICATION_END="" export AM_VERIFICATION_FAILURE="" #Tags related to network up/down events export AM_NETWORK_DOWN_BEGIN="" export AM_NETWORK_DOWN_END="" export AM_NETWORK_DOWN_COMPLETE_BEGIN="" export AM_NETWORK_DOWN_COMPLETE_END="" export AM_NETWORK_UP_BEGIN="" export AM_NETWORK_UP_END="" export AM_NETWORK_UP_COMPLETE_BEGIN="" export AM_NETWORK_UP_COMPLETE_END="" export AM_NETWORK_UP_FAILURE="" export AM_NETWORK_DOWN_FAILURE="" #Tags related to Synchronization Assist export AM_SYNC_BEGIN="" export AM_SYNC_END="" export AM_SYNC_FAILURE="" #Tags related to RG Failover export RG_FAILOVER_BEGIN="" export RG_FAILOVER_END="" export RG_FAILOVER_FAILURE="" #Tags related to RG ACQUIRE export RG_ACQUIRE_BEGIN="" export RG_ACQUIRE_END="" export RG_ACQUIRE_FAILURE="" #Tags related to RG RELEASE export RG_RELEASE_BEGIN="" export RG_RELEASE_END="" export RG_RELEASE_FAILURE="" #Tags related to application monitoring export AM_APPMON_BEGIN="" export AM_APPMON_END="" export AM_APPMON_FAILURE="" #Tags related to config too long export AM_CONFIGTL_BEGIN="" export AM_CONFIGTL_END="" export AM_CONFIGTL_FAILURE="" #Tags related to AIX shutdown and reboot export AM_AIX_DOWN_BEGIN="" export AM_AIX_DOWN_END="" #---------------------------------------------------------------------------- # Functions: # # amlog_trace # amlog_warn # amlog_err # #---------------------------------------------------------------------------- ############################################################## # # NAME: amlog_trace # # FUNCTION: Writes INFO message to CLAM_LOG_FILE # # PARAMETERS: # Trace Tag used to generate AM report # Trace information # # RETURNS: NA ############################################################### function amlog_trace { [[ "$VERBOSE_LOGGING" == "high" ]] && set -x # # call clcycle to cycle the log file when its size reaches # maximum size limit before logging the trace # clcycle $CLAM_LOG_FILE_NAME >/dev/null 2>&1 DATE=$(cltime) echo "$1|$DATE|INFO: $2" >> $CLAM_LOG_FILE } ############################################################## # # NAME: amlog_warn # # FUNCTION: Writes warning message to CLAM_LOG_FILE # # PARAMETERS: # Trace Tag used to generate AM report # Trace information # # RETURNS: NA ############################################################### function amlog_warn { [[ "$VERBOSE_LOGGING" == "high" ]] && set -x # # call clcycle to cycle the log file when its size reaches # maximum size limit before logging Warning # clcycle $CLAM_LOG_FILE_NAME >/dev/null 2>&1 DATE=$(cltime) echo "$1|$DATE|WARN: $2" >> $CLAM_LOG_FILE } ############################################################## # # NAME: amlog_err # # FUNCTION: Writes ERROR message to CLAM_LOG_FILE # # PARAMETERS: # Trace Tag used to generate AM report # Trace information # # RETURNS: NA ############################################################### function amlog_err { [[ "$VERBOSE_LOGGING" == "high" ]] && set -x # # call clcycle to cycle the log file when its size reaches # maximum size limit before logging ERROR # clcycle $CLAM_LOG_FILE_NAME >/dev/null 2>&1 DATE=$(cltime) echo "$1|$DATE|ERROR: $2" >> $CLAM_LOG_FILE } RIFI l41+b՝ab& # ./usr/es/lib/ksh93/availability/cl_amutilsnvg    etacdinors "=Tfglmpu(),.:ADEMNORS[]_hvy-CFGILPbkw#%'014UV$2<>BH\jx{}+/WYq3589Kz|!*67QXZJ^; 8p#Pq# 0 $a=/*(:IN֔Tc?GnOLBEc2r *3` ,`0, )陹ԍSy8Q(8I HyG8@%%(Ex&"HX''a^nu*gzFWg=U+ng=U+G%(VkzFWVh窴ez53G Uj٘5RT U)00%La|`ap 8f!vf٘5RoUh\˧iJ*1j70,sU)0|Vz /oQUaE18&АST0G`` `Ge٘5C } u):wZ2ZCIoUh,2%fYCNV.]J1+Zf1fYAЕfE5Z21{z&4RR\b VU+QcL#c y6Ŏ V.]J1+BfE ;Xu+CzFV/oPbrQLMjhMw֦R,uHe ˩BUR3s\2˩F h\wה5bԯڡ>SAYfD2e7fc /oQ(QJ*튊Smey9:NJ*PoUhV'p FCئ>|o&p (qr!t32i/;e>S>k(tKFV3 ƙV";̰oT"%FN|Cm;uܞ;V# js1m0d-!FOZ R;DJ^fu;֯*hLQz>֣|Rlhz*zV#+\ު[!Q^j;V#\{o#{c c'Q֯*kԎ3R}F]Nʠ;^ϳ5%}Z;ޭv ޭlUB7TW—mY*@U GՒF T.bEVTEsU Gy|f (EIСy/'o1&_=%|aGEO5ZT>3)vfMuj?U(ܔaGyΔHd"$iEI @|D`@B:Q!5PΔHdX1k{m8;tCc1l`u%VJF2,@B&tBj[tءy/udc!r T.ymַ/m0b  jsҌV#]cvV]F]OXd Xso#x[.b1B:IB݆LN-_qӨTuIqKU ֯*jgtV] 9̺.wJ(?;̶hjF"1'¬F20Nj<_:Q!g-LNA;̶ [ NHd"$h @U eU(d 8RZudc!U ҉ anekbyo?ՒF T.gOZctLzKkRz88J2υXd a h @|D`@B Egs-Q @â#T.gkP7a#)KFWt&]l5RbuuC\RBʠڙ]welBs.RyC ;;̶hjF"1'¬F20gJ$2ub,ŰIз25Gai҉ ]D;tC!V#\s-ʭyC%Qӫ*"Ň9]HLDIз25CN< ^ tʈabR js;}Mze^ XԌD T.zQ|X9kw֊˨˩bsU 2F̶ٝF\XŮѪMuj?5Rbue)hB˭LN.}K]_yTS25#-;d̺Pst\k7%QyeCR15P>b,XŮx1Zyj[tأbeDB.LV:Q!bÜŮ=a^PFqc1l`U ҉ anekbyo?Մ =4c23'o1&_=%|a)=H@@Bg =4c3AYuu<&0I {m$o}ae =4c>T.gkP7a#)KFWt&]l5RbuuC\RBʠڙ]welBs.RyC ;;̶hjF"1'0I阸‘g<_:Q!g-LNA;̶ [ NHd"$h$ьCcǽl;Uk(³u%V9hLDIз25CN< ^ t< 5P>=k|a2/ QIF"=(=L:"0"0E[bLLD_;4<|a7NFZ+lUiOZctLzK{SvkU-x<\Z*jgR:5P샹R5Sn]e]LMuj?0etGծvVâ#T.|aEuO|6s}*ה?nծvVqkW K:"0Bww#AGW7]nT,_7tDaѪrziʝ1xEվt0FV"g5뷫\튭>)s}чDF\{3\+j>v0FfksJ*k|;zت=J2q@%v)pM>m&TCzOZPmli=^;+UٚfjZRGد @w[b,@M5ACNzI Z/VlUaI*A&fxYqw06+(0ޖ&=%`(i0Js |b, ;^T0aN3Zx ^;LeNj>wzj}ZlUa_;*5R wה;kgKZT%E_tP=)hΔH[ T s._;4<|a7ZT%E_tP=)hSl0|m[LfzV%*|ar,N-jA>)s}хs}чDF\A2[7Uu-Bo2F:IB݆LN-_qӨTuIqKU ֯*jgtV] 9̺.wJʭyB{5WR߹-H"3+8]Bj2w'yJڟlâ#T.|R.<U[Lf%}ZvkT4-F]N֯*jg8F[dFtjssʷtƙ*n{m$la}&+HNHdtI5'J$2uL2}i"0Eֆ/V08;̶h`pwl-7b]8;̶1Z.X(ai*0ˠΔHe1J{-LV<#"yt<҉ 4WetIrǕDqҌEվ" |i*{3]Z|*|R Ѫ7b F"1'FXs}&+BPU&'Bˠ[ MD,yTGDQt&rl-e]ޭqKZPmqK.F=F _fxEվ FJoȽZHÿޖ@LtX{-Qq@@,iF\Z*k|9[ B.(ĊwCe".Z-jA\,묋բ2"8FV=ޭj>>)s}чDFY}[R15P>o0s}&+BPU&'Bˠ[ MD,yTI\".t=Ћ2Wfk\R֯)T\R:5PF _fxEվ FJo[|`wԨ ZuƝeŭ^R6ÛZu!F$Pӿzt=ЋhUr"0Ek}uw#+_fk\튭>)lQNj=Y[|`;o,Мet+աG@员QHec+vkU-)ҔB#^n{m$lF;N\튭s}ãU 󌮜_;Bqӄ"0EУ3BtC*/VZbg]9v([5(:w7]nT.{l%_t=ÿz,.tY;mCAʘ w"AuzZ\.-jAl-7b\QQ˖]EQ4LQzai*∞\".Z-jA\1E,ӿJ$2%_t=}&+EUSl0|m>>[5iPٚڣ'3I5ը\. VU(ܔaYyΔHe1IE=Ћy1ZBubwD(˩H`怕*b:Q!2vR&XRN؁bΔHbh ]ӝNj,X@ł˝:Q!2vR&XRNNu9PcCO .q*{3\q^M9Eu0I*vlV8F>ٚH*\%PÿJ$2U0Eu J.Ћ.wyWhgHTa i+.uONQ]` NT#f-^D.LV;e1rNhPM^&*8Ijwl4RDf1S[Ly6֞pn y|Q1', |'sYH1Zw('1ΔHdar@]EQ&+EВs5}p 8RZҥ*%PMB+:Q!l5Rbt-̺ |Pӿ<—miR̕&r{JRѕ>=k|a2/ *vkQJ2UJ2MYZPmO\"0 utDaѪd*e|5WR߹&n{m$la㤚.W+Bjs._;2ӶJˡu9E)VyU(Of[=Z0b|`_fy%}ZkT4-F]N֯)TS.;]Fjsuyªg5+;]Bj2w'yTS;.u]nT/d*{d]ClHÿTe. ۾ FJ S$kd.LVI5ը\w#)\ZKza͊ÿQ&+HNHd"$hE=D T.bO]FXppg-LNA;tC)2J.]D,yTGDB.]D8FV=v_oVAݽZ (QS8ʠڙ)pâ#T/d*{d]ClH{-)\ğ:"0<\"$h\"$hYanekb(cL{-Q&+EUaǗBue"$h0sJzliFZ ŭ^UqKI'7lTRo7æ4(ٹ P[R15P=$.LV.LVx1:]v(҉ 4(Zub\ACO."ahEIsZ:Q!ƙ%P[ B.LVw-iR̕&)KFV&tBj[tءy/ҥ*(L R6[ nIx6iUfkZoQQ.{ TڅkWA>)e C4V;)Ltjssʻ3Gl UԷz 0b|`w& v1:2e}NReU&'\T>.T/Z ekxFZv[t.2*ה?nHqy'J$2ubwh ]=D T.bOLW|g.ub,ŰIз25G-JD4QU ahEIqXƝ:Q!2vR&X9%wʇ؄eW|e"$h`YsL)L5P b  js|e%JS'GRbO|(l5Rbt-̺ |QKR&Q2+T:sZeV`ΔHbh ]ӝNj,(`怕*9BDzw)ӝNj,{-NHbue"e:ըX=I>)$GanekbzZ2)ӝNj,{-#;tCeL)LsVd T- D RΧ5j=ÿu%VR&X:sZcԘ҉ &[l5Rbt-̺ |Pӿ<—m:2ӝNj,}[Sl0|m[L3]Z|+|e0Ҍu;sV{ƀ*.T2t0Muj?Z|ag >g$|(LN-_qӨTuIqKU ֯*jgtV] 9̺.wJZv^թX]Zy&X@BDz؁`Q phh(X,Ex9):;u!:Q!ޗLg >xӿQU F"1'. xE.u Ċ, .(F[L XsVsp]PULtS jsAH@@B$D 2sZ,.g-V"e:ը\ŞxҌEM^R6Ä]D T.eQqnbE ;u4T!QU hE\"&֯)TE˝AȕBu5P]EB.mjA\ \DNu9P^" ,9B*e&XM^R6ÔLtS js-s(i4T%,9B\B.,&֯)TE˝LD5fj]|U':ը^e-Pab5PphEa;]FXbU]FlUYJ;m3ME[b ]@M&"T\"!"T\eM&"TPӿ,9Bz* DNu9P2ЋiD Ur&X:sZU DMDuv'%zZkW )e CNu9Plz*ҊqEx9dwZ|`դgrkW ,&I̴".0BH&XMj-IBQ2kTo\B.,&֯)TE˝LD5fj[W|Re-Pn^O}|ʠ.]F"hU.&|*.u*.Q2kToMD&XMj-/VL&[2ЋiD Ur&XMj-Z|`@BZu-(a6yJ.X.wlh ]2JS'Y,B/5 0(pJ*TH HFE0ؕԱ @&jTeBrcmOc@Jq*R:֔q)&9Bzwe:ըZ/V`A DNu9P^" De֩2"hDX[-(`Χ5jQrsVhZE-( ;>TZ(aU aKU,&=2L{-S`y/Yg1>=k|a2/ V->oV|+|e0*WkNQ]nT.xoV|+|e0*Wj{cwU8&֜$Vso$Dzلc|`_f{z[d-}\TDzلc|`_f{z[d-T⼛[ ;Zǽ7iGº5PJ2UÊ\q^MV,;5Py0˦4P/U Ż3]ZQKN+ɵѪ-u1 s(iLVդ˫z2w%Й&=σ .X\^ J" H H(&V/Vs.ܖBd[ >4` B.D  *0(Q-u8*eS`C|T%hZA̺C'rZޭ L{-P\, B.D  *0(Q򩕸դ˫z2w%ЙTDzYuH r (h$IQBavf%`wz.U8&V#Uv^;nޭP,^$!ٚPy䣏evMWfkJ> FJqKB{3\( u1.L+lhLVՠIխw$%hZS+qY@<+qYB7E @Lclw[@y(ie] TDzZo;oʦ=xQt D Dz   %/`(^PSa5FNyJWh.Q]aynR WX6[eڣ'<'[5iPAKct8f_=2s^}m2QLiN+ɵ+w[5iPq^M@Ycʐ( `4p@4F2zKHX`t =5NP,SmL2&"@YB`>w,VEu0I*vvfg*Wja(X@ATH<L|RžL'ٚq^M@YcD0#>w,r(m.QQJ =5NP,SmL2H( d;H('ٚq^M@Yc8p "@F2xSl`^TeSm"h\q^Mi$HZ1m0d/9FuAоU8&&֭w*WkQz5;_f{z;blz* T"h^U&'DIG‘zc|`_fs"|q^MM[ U8&+GآcTvkT;BpQ^ &J>լ#H"2wѼ#]Pbw=/XGoV`@SmYb1/VB.9d&H1e.YX1m0d/'=8E+Gآc|`_fNz7cCG"L$"L(a2FٓQe0Ռq+Gآj>w.ޭL|a?ue*q^M@Y*Ye)hQˤclQGy|f (&Iж1:]v(iyKn`0`6[ nIx6oQSneVL]2s;t]Z@ VI]welBs.RyC <(&ILJ$2U8& P-8;tC%SmL2T@x`I@sJ$2U8& P,a$ &<:Q!y6e TDˠX*Wja(X# &H,\҉ N+ɵ0 ,xȆ$`2A(yt ;tC%SmL2H(,\҉ N+ɵ0 ,xP!H](ř+{^-L]S@sJ$2uM6b0|j>w-fJ׬|Tٗ(wb=EʧW9EuCH'('(&IZe iUY ޭv e ;bqqQJ$2lP|)Hyq(M$|)HyV#"h\*c!i$HZ9z*R4`tó/P/|(E$|(G;"h\2btM$|)XG5oV`C|آ>*.+=v*ftó/P/|(E$|(FŖQe0' Eж,k-4Q^aW]ZOblYe[ f_<_(PI(Q @|)Hy;"i8;tC=HZ@;tC!V#I% EpwDN&'DIG‘z:Q!Ye[i$HZ@;I8(R/V5RbtM$|)[so#xhYJWkkPN+ɵodb5Rbuծ!PҌ}lU0Q2J>wD0I8(R/VJ$1LN"i8;G*Wh|)BT⼛DIG‘z{7=7 V*q^MM[ U8&+['Qvi/[ٚ|}튭l:Q!y6G‘z:Q!y6"i8;2pQ^ dIG‘z{7=7f;9اA{b@0Q QޭNت ޭv $G‘zΔHd&J>դ?;;BpQ^ wbIG‘z{7=7f;q)ծ!PҌ|`@)$GΔHd' Ep:Q!NlPI(R/VF.dHZ.dIG‘z{7=7f;▣.|풾T/ZQP/|(E$|(҉ QSpQ^ ΔHbI% Epw#l5RbtN >աrMLN"k|n{m$o}j>w-LNz*QP/|(E$|(҉ l5RbtN >դ<҉ l5RbtM$|)Hy*WhrzwQÝ(E4b: PPӿJ$2U8&8(R/VB.y*Wh|)EQrǕ P@h$iJ$2U8&8(R/VB.  `,0pqJ$2U8&8(R/VB. TDˠΔHdq^MpQ^]E88840$r!<pwDJ' EhE\䂊]8;tC%Sm"h".X8C<pw*WhI(R/VB.y*WhI(R/VB.*@<0$IˠΔHdq^Mi$HZ-<L4DǗ@(T⼛DIG‘zZu,xP`i $]8;tC%SmI% EhE\ッCG"LSˠΔHdq^Mi$HZ-բЋ(UBHZ- ;tC'qpQ^]E:Q!Ye[pQ^]EwDBF2&J>բЋJ$2w1:&J>բЋJ$1,|`M$|)EQtg:Q!5RbtN >բЋpwD0I8(R/VB.J$2Ib]YU&'DHZ-<G$O.:Q!5RbtN >բЋcAH (Lyt<҉ apQ^]E@*'@(1:' EhE\ッCG"LSˠΔHc T"h".XAEO.:Q!5RbtN >բЋc8p "@yΔHc TI% EhE]8;tCjI(R/VB.J$2Ib]YU&'DIG‘zZu,yR$ H]8;tCjI(R/VB.  `,0pqJ$1LN"h".X@ATH<pwD0I4Q^]E88840$r!<pwD0I4Q^]EH(J$1LN"h".X8C<pw$G‘zZu@(&M$|)EQt<҉ wbHZ-$6 "h".ΔHb"h".ΔHbI% EhE]8(&U&'DHZ-ΔHdai$HZ-ΔHdq^M,F0EhE]8;tC%SmYb1/VB.9d&H1e.w# Q]m0dS<2ޭj> FJqHGL֩%+NUsز=;tC2'Ga,D44@1"wʎ0ŖJ0ΔHcTq@wD(˩QmkTo'TmwD(˩Qn+Z|a= R{lHJ$1LN+lZ|a= R{lHJ$1LN+qX&[ d8{bETq[d&[ d8{bEgV5L*pĊ;A(L֤%iy|ddŖQe0;eGb G4FTAvfj--,|aAQ @;ٚ7U7RJ2V0o:Q!Lv $T7DI2LVTq[d&[ <ˠXAEqƘf,T{ 쭲W{hgJ򣃷v6.wQn+Z|a2Ǖyt H(8ޣ4ŞVTpvNzX(IPWs$1ZwQmkTo&X򣃏.1-PpTAuË *xޖ *TDI2LV(TDI2LVTq[d&[ <ˌbT$W[燮xIӿʎ+lZ|a2Ǖyt ;Re0cʎ<g0>ٚIzԔd;7(8$4jWs|b(1e@elX풳ΔHd$h\"Lj[tأGy2CH4cLZ|`=D T.bO(풳ΔHd$h\"Lj[tأGx$ FJiFY@0QJ2U҉ dHZ-b  js||(s$1Zx1:]v(".w#[S;J{z[d-e J> FJ:Q!LI(R/VB.)\ğ$J>x҉ d ]B<[ T s._;Zu8Ff!3RR4=OMySó5 ;jTΔHdq^M@Ycʐ( `4p@4#;tC%Sm"h".X H  <pw# b]F]vkT0}1r#OmabdAܩX03.Ҍԍ=DJژd <G$O.4cLy6zVت@lUUrΤil,0;C6LUUpت GΤi9@08dQ$EbAWeX(g`UVAᵓu#OmfY=أ3R4`s!:HdexŞx2RE[bM#pqU R4`q4Qԍ=:BE,ŰIз25G.uoLi8&/VZc(Ċw#"Ż3\F5P/=eK(ѪTDz؂Yg1 (&N >բЋcLy6zVت-(T⼛DHZ-<G$O.Zu#OmBU1w1JT⼛HZ+lUib  js|F 1*R:<_:H_x1:]v(.2RE[bL`CNdXfkHX`wF eLDI2pQ^]EdN+ɴբVhE\VwDJ' EhE\ッCG"LS˖bBU1w1JT⼛HZ+lUib  js{X+/b PU&'BˠEվ1JT⼛HZ+lUis(ilYe[T.xfY|Rjs;U1 YL{-gJ$2II% EhE\]1JT⼛HZ+lUi]E:Q!y6"h".X# &H1e*[;b&jԳQQukNQ]imzkʝ_KR&tC%SmL2&"@YB`ˊ4Kj2뷫]BEEխ9Eui7 2F[ 쩸41xE0FX\ٖO&[ բЋcLy6zVت-(T⼛DHZ-<L4DǗ-LixYrǃ <eKj2뷫]BEEխ9Eui37JYHa1xEw"X wT3\Z*jzQFL$bjV ګR15P "֯)T\Rn 4(;d+$+TaUe*;5g,`3ŭ^R6æ4JWiEm2ЋҌM')N=fJ3 -jAw E)3piE)'_&aX )WGyF]0Z*k|92 Е*mUQqnbE 4/VE^R6Ó R&X-s(P.XZu-j 1yJ.X!ګšQr֪1Ur\iƙ)Sm"hUZueА9umUQr֪kW xPPLi8&/VZeQq] P6X-VE^R6|@h@w|.uoLi8&/VZc(Ċw# 2* {m$o7.%*q^M^*,[4-wdN+ɴբVhE\PӿJ$2U8&8(R/VB.  `,0pqSd\@A ˡLi8&/VZeQs2RE[bM#pqU &bT2tx |"yj[tأޗæ4JWiEm1nbE ;bݙT]ZӔW[U "3ٖ_}\L{-*Ŗ|`҉ dIG‘zZuLi8&/VZeQqGΔHdq^Mi$HZ-<L4DǗ-LixYt%Sa0||ZORnwJ|&V ;'S7;fb*9ԙҞ ~ d(-yITYtW yUd(Pԩҳ4L =J+1YGؓ(ҌcL 'S7;f4cLy6zVت@4JWiEm4D T.bOJfG2T_x1:]v(.2RE[bL`CNdXfkIW3sWU "3ٖ_}\L{-*Ŗ|`҉ dHZ-4JWiEm2Ћ҉ N+ɴN >բЋcƒHQ D婍2Te;cLy6zVتAH@@B$bT2tx!EEYanekbz\"%*q^M^*Q4FEvfs7;z5P/=eK(ѪTDz؂Yg1 (&M$|)EQqtƙ)Sm"hUZuwDJ&J>բЋcƒHQ D婍2Teޖ@LDJژd  Lée"(F+Yanekbz\"%*q^M^*Q4FEvfAEz5P/=eK(ѪTDz؂Yg1 (&M$|)EQqtƙ)Sm"hUZuwDJ&J>բЋcբЋcLy6zVت-(T⼛DHZ-<(`$.Z 8qBJ=ÿ4JWiEm4D T.bOY1;Nj2Ç.g-LNA;p|:cLy6zVت!F$Pӿ-ٚ8p\̲ٞ BwclAV,[ΔHd&J>բЋcLy6zVت-;tC%SmI% EhE\8qC yrƙÊBU1w-QˤclQBgJ$(iyKn(e1(գ'o1&_=%|a5uu>q)ծ!Pl5Rbuծ)tƙSm샲8&(㤚.FwJ(<.uo:Q!y6G‘z0BHP:Q!L|)EQqnbE bªg5mvkT4,_(V;}QST/Wլ҉ wbHZ-:Q!L|)EQr偅(u;' EhE] ҉ dHZ-, .w@LDI2i$HZ-s(P 4FV=lS]Belu;B%}Z;tC$ء4Q^]EН(&M$|)EQr偅(u;&J>բЋ$ɤ"h".X\,L|*k,Uֆ@LDI2pQ^]EQ+;(˦4Z*k|9҉ dHZ-;IMuPdS]P :Q!L|)EQrƙZPm, .wyJbªg5IoV`CJ2񂏅:Q!MLNG‘zZuBIMu@4Z*h4Q𩮪Uֆ@LDI2i$HZ-s(VwQLiUs$ɤ"h".4&M$|*k&J>5$ɤ"h".Z1kW 偅zBb֯)T@@,PӿU[Lf1:liFY@)$GΔHdai$HZ-$ɤMu@4Z*hҌT6oX8CբЋiT6!F$Pӿ6 T⼛DHZ@wءJWhI(R/Vw!T⼛]ZO  `,0pv#Ym0dSҌcLy6%e@A vP&Kw(LNG‘zZu-*&֢Sm;"3*HKMkVe  `,0pqƝ:Q!5RbtN >բЋiT6-*WhpwQyJtC%Sm"h".ZU4MEJ.0BH.U4M[<L4DǗwءJWh|)HlW ;(ˊ&[mjADJ' EhE\hZN+ɴ\Z*h 71"9ø3Mg=ܟso#{ 7jٚg2kT]ٗlWJ*fRe0&֯)TX[XWQ'ٚj|+CբЋiT6-*WhhUIӿhz\Z*kA 4҉ ' EhE\:Q!y6G‘zZu-*&֢Sm, .X\ʦA H  բЋiT6-*WhiU&'DHZ-MkQrҩy6 ;.-jADJ&J>բЋiT6-*Wh 71"د @w֯)TZ`ΔHeء4Q^]E :Q!y6"h".ZU4MEJ.X\0KMkVH08 xӿJ$2b14Q^]E :Q!y6"h".ZU4MEJ.X\0SDՠxբЋi҉ dNHc TI% EhE\hZN+ɴ\Rt4҉ ai$HZ-MkQrҩy6 8R[X`ա3U&'Bˠ ;;)x6زc^>=k|a2/ =wfT⼛CX`խm0dz> Ed񽙮T/re0:IB݆LN RyImO]T/δ.*Z2ekxFZv[t.2wJ+ĊLi8&/VZh)\Ğ=k|atL{Tdd|f*R;Ix6La2|RFNxS];J23y6Euf*R7N+ɴ6qKN+ɵe ʐ( `4p@7y0qq88840$r!wy61Z2LVٚSm$k^b&^=|T⼛X})'>w2Vf[(a̕Y'.K5 ;E4b: PV{ሙ{L77ϙQʧ' EjvVvkT4.U8&qk|(SmI% EjvVvkT4.U8&qkI(QI8(R/Vqޭv eʧ;bq TI% E5Rbuծ!PҌT⼛]lU)$GwRm0iR̕y6RѕyK0a}0&tBSD.U2LVIз25CN< ^ sكOZctLzK|obfks-}JgRmQ㤚.T⼛Z&֡|q^M{ TekxFZv[t.2*ה?nJ0<҉ N+ɴ T6:Q!y61ZBU2LVhDq5fj\q^M$ו;|2|e6/;ŠH(CZ "*Wk&<c)T֌',(d[LӶA6S5fj]e' ..U4MZg* @eʦA AEOwb=EʧWC9( +XJʦIZLV6LUUpت G*9ԚL ӕ-y0qYB`Q'P&+Gk\W( tUd$Ŷ*8Q$ik/c&" *&֤  `,0pqʦI$hUd)EʧWC8| ;43ӔW[N+ɴ 8T6 LGk\DI2LV6LUUpت GªeO5+{^-O]Sf_v&ubgJ$1fJ׬|%T |.:m0_;( T"h^U&'DIG‘z{7=7 Vy66 T⼛\l!FA٦(oU&']Z ((vZ .)$GΔHc T"i8;tCjI(R/Vry6G‘z/N+ɴM$|)[so#xh^RDղSmpbxf}GٞޭNت ޭv *Wh|)Hy*WhI(R/VJ2VsGAwDJ' EhE]@PYsJ$2U8&4Q^]E, $  ;tCj|)EQtgΔHc TI% EhE]YΔHbҥ*)Sm+U&'Bˠw-iR̕y6Rѕ(1:]v(iyKnfJT⼛E)hSl0|mb!=(ˣU mQf)w;}ޭv q'ʧ .)$GkP7a#)KFWt&]l5RbuuC\RBʠڙ]welBs.RyC ;;F-O]Be*q^M*(QK(T⼛HZ*@<0$IƝ(QU @ԍ=a+TyI% jh:JN;{k k|j{zN{C 4Ǩ7̲x`v:U9V'{k kTwbvS0"$2k(xLD;3ZORnwJzkʝ@EgY;s*WhҚ;tC%Smb(L 3+2Xҙ1Z;%*q^M^*R15P|(J$2U8&&+BE,ŰIз25G-JcLy6zVت-s(V`.uoLi8&/VZc(ĊjTdN+ɴբVhE\`B 4.-j6æ4JWiEm2Ћ 71"ʠC;qkWAx,^"e3L2fkQSޭv *Wh|)EQt)2RE[bL".X\BpQ^T)2RE[bL".Z-j6;tCj|)EQt.6 G‘z 4JWiEm2Ћ 71"w1JT⼛HZ+lUi0ĹT⼛Z&֭*ftCde^I% BUӧg1ٝHjx^_ UZ)E\ D:U8&Ly0˕NٚSmvmjU8&+[Νu#pqU K(T⼛HZ$T*9S$CSm`*[["LIA #Nl GΔHdq^MLVטk/hPM^&*8IlUUpԋX B+ɬI(0ɬI, .w1JT⼛HZ+lUib  jsQ/R-bb,_x1:]v(Rt4cLy6zVتAH@@B&)$D T,_:Q!y61Z.g-LNA;jTdN+ɴբVhE\`B#;p|:cLy6zVت!F$PӿҌʠ%*q^M^*B.(Ċw#3P֯*k|XDgV e>֣.}ZޗyTZ`ΔHdq^Mi$HZ-Li8&/VZeQrmI% EB%*q^M^*B.֯*h`asJ$1LN"h".ء4Q^e*i2RE[bL".0BH_KIqU &֯*jbTaOR˺ʧ$h[mַxˤ<\Dz4<|a7IqU &֯*jgOZctLzKIt3]\Uó5žg Ukj>w-G§uCS;t]ZK,"ԬZ̻Cd3\q^MyOZqK5ѪlkPG^Pk|R|+ԧ.-jA32w'$P 42؀ 5}<w"T2]J7*ם;ckױMY&6SwM̺BT2k(H #@$ p@e(,Ź& Ee1BT2k(H 4B$ p@e(,{.Ctd P,@$hIf@ˀ P(Y狡w!io:2|*s,5IB2|6c`{}ԊgQwWfkQvf}0eOd^(>T/|;3\hzZ4=B^;}H] ; vf}0leʙu+2sZލT/s.a=FGٽHw uvf ޗfkl` V[LA E:ҋjsBó5ʖP1ADz5"t4/Gjg|9Pğ>BVeJ 4.U8&&+Zg45P¦1-PpP`IӿS<ʧ$hiKR%G†MebO Ɲ* C&'IsS%S=a .GT⼛DlT'o2ւq^MLVA۪mַPѪ1Yj4J=.U8&&+CNzXTkAU8&&+BFT1e: w(T'o.OZoBFT1e: wה:5P¦qΤ)/VlUa*>(iyKn%:E튬wd7D礼o5)3]ZU{3ZlU(LMuj?OQU(UkdN튭OzQ6z%R6ٝWM=iS_7ʭyCu)lq(bt(Im3ME[b J9B*(iyKn4^*mַ/m0f!jo%vAAȕ;;>|*L< eսZ;hH}&"T^ J" H H(*L< eսZ;hMAȕ @%Ȃ@#A%FR ;T-m][ա-oVѪT^ J" H H(ޖI&SoB*L< Rae6Ɲ* /GғʭyC b9ԖXs.PFIСy/ua̻@6[ nIx6oQSk2 ;:5P V$VsoF*ה?nJ0IV&ĩJd$ $ Di@I(@4$ @ÑDBZ9yH(40yT804PȢ@- <$F D<H*@hPqBAҏKU $kA &aX h ]Ɲ $`8r((KC<  IƑ& `pH „$ @ÑDBZ9yH(40y@ 4!A  `8r((KC<  IƑ& `pH „  w(5PLVϒf0AxӿaE hg "4X$ $@h@,0y 09H%$ҁcH0@I ;(p`h8ÑDBZ9yH(40yD 804PyB1ZC>IV&$ $ Di@I H;!"3rP,i`HwPqB"3rP,i`B;z]Y&+ZgFX$ $ DiPH  H;!"3rT1AI  ; HPqB"3rT1AB;!09H%$ҡ0LpiH (@ LéeNH09H%$AEF 8%xH H;!"3rH( ;(p`h8ÑDBZ9yH$ThQ DСFIւ+2F'l4$Xa#ÑDBZ9yHÊ *∍H;!"3rÇU@ ‡09H%$8Ҩ(СFIւ+2F'qX$ $ DhPiTI H;!"3rÇUaHwPqB"3rÇUaB;z]Y&+ZgEcԏw@,0Ȣ@- <$F &Pƕヌ89$ @ÑDBZ9yH$AL*lX+4$Xa#ÑDBH$ң`$Æ$ @ÑDBH$ң`$Æ$<< E x@@#JTpq804PyB1ZA&5J1;d$ $ @<$F4A! DqDF$ @ÑDBH$ң(8$4(804PȢ@$DiQI@TGDhPqBAҏKU $i(+4$Xa#ÑDBH$ң(8$4 $wCE x@@#JL L8iC (@pQ P "4 `$Æ  w(5PLV@'l4$Xa#ÑDBH$ң@cQQI@A$# vT'o0}MzÊ]T/$Vb25#-;d̺Pst\k7H"3N 7|q^M VA鱃 7]'RҔUaEg4l |9cLVeٖ_yTG7mN}Z (˄]F[7.E ?J2||ZPmQB8&DzXE <`Ys<ޖ&ub(i5!Q&+Gғk\" |C6LUUp{T]Pbxޗ;e143c)N5.GxEՂf 3"aPr!L w햼{Y{ tUd$ū4] *@Lwk.ٚ^ 絊)N .p :"0;zBhB1Z I .υXd a ;%V#5Pw):wJF2 jh1I6(JWjcl=m0d_ft)!FO]\lcbodʠມ#i/['ծ!Pt;(Rژ[ҌEվ" |dQ$.wPN+ɵ1]E1JT⼛Cl=|`cl|)QLiu(kWAuC[ ^Ϸ]B鱃w1JT⼛Cl@lW ;]I]WLmSaޣޤSz>0٬[ںJ2Ԋ{ɐNŀ(-H wL)R0<0<f 10=>͌R)q0QiE0H"D8€ j4Ǩ61H03N&u JLPaoKIW@ks;přfF>i=JS z(iJNOC {xWfkYu);;3]_+GV˺Ѫb(eCt |a4COH3+|˭wPv]og-J25@@,iˤˠ˝*\ˠ 4ˤˠ Ѫb|X9]H2B1ZC=OL&uCSa/8^ǨU @BOY6yTSS z, HpQ PE-6[t=B=B85Pmj6%H(YCE ]BSl0Ct.ct(5PM^Uĩž (@pQ PE-6[t=B=B'CNaO3\Z*jbT|+Ԧ+J27_Pp>|  c^UѪM jsA' T,Z R)=J $`8r((H\d uMz]eйeУ jsA' T,Z R)=J@ÑDBBS$h[mַ{.{. &TC}iEjPwF=)E^PqU g dz,>|6AA^ت2lR0qӨTu-_Ѫb{tD`xi XFY)J!@B(PӿҌLQzLt%J\ w js,i/E#2Ƙqi bT&2Ƙ\QPqU b,MY&+[>u]cş:"0|xZ2@B.$ T/|0M c^T@Bgĉ4U @M&5P[ M1H^^R!5P(1/* SdF]1H^u1/* jsޖ$M1H^m^Ri7bi2@Bj8̰,EsQKd 1/*BU*BaBzZ!Ǩ&+`F -JxXcNIF''CNIQyPLWZ$ T/J22@BIQyQU K&$ T/6)4@Bl4ƙ jxyH@BX\P9(tjs*֕Nx}XT0Mutjg-JxXcNIF';G1s[ l&=E[u*vwQ!PqU R5BZB js, .(bh'CNaa.j>4oJu" ມ-)E]H(M |) kf'VBTaOR^Ri7;<S>+TBd>)p81Z;b_2Ub1U 4-J"qU ӿ7Xd }&2k( P'rzA@\0P|) kf'VBTaORQGJF2AG†MebA@ X\dOXH( wIc!8Xd (i*`i53CQ*E0B)\ˊ;%9;U Ҍ3X}&tjzQ^ٚ%%V#5PwPpkH y0zJ%:E튬$>|_ wAȕAfJtթXMA ;ޭ" բjvVTBC7D2RafxYt o%EդX!PPr%KT1ZC<,MY&+[>b1|_ 5}H(Q`.2w'$ ;u#OmzokC&  ,B'rzA@\0PUdc;3?{h;v^bR41+ZbxUY ;u#OmA{iYGؓ&x8$sŮ ;u$;v^b $!@m5{ '-Qƙ)Smeb,7, 9V#s{j VRI1Z.w):w1JT⼛Cl,د .`MDz*DUB hѪb{cL)&xѪ75YGؐP2'rzA@\0P2RafxYt o%EդX!PPr%EѪҏKFIւxa↝Li8&[ 6+ˠX>|*.ޭ" *\QbhB1ZC=̕60I(ig5yJ*Wkl`^Le =5|a0I! {m$olNҌٞU8&'o6Al`^L„T|))\ˀPay6$ו;CSmL =5NE3@mj |) kf'VBTaOR w*C ThI2AAg nPpkCs Ufk$ד-񆔢fkN+ɵʛ$ו;Q⣛$TR652k( P1qYGؐQ0;[LfP'o4{3\q^MT'ڏ l`1PpkHB۸PɬH(ABqYGؐQ"Pe*crLRtwR> 'G9ø3Mry6 =5|aZl`^L,J1Q͌zf* |(VT„[$TPCN60Is-B[$TQe*b$TPNs#%Rt4Sc2؄Tsc_ ,@L(EOLA \dOXH(X(QJR2^44C5ʛ$-}\e6w*C ThI2AAcG( A ;e*cpӿN+ɵ0'ŏ9d.OLÙl;QoJR4SmL =5N,xȆ$yt%Mzfa*C ThI2AAcJ( A ;e*cpӿN+ɵ0'ŏ(@0q@] Sc2w21]8iʧژ: zkʜX  `,0pqЕ60Is-ҏK<# *`IQ$ *~p654ޖsNU8&c<(04 $] Sc2w21]8iʧژ: zkʜX "yt%Mzfa*C ThI2AAcAg nPpkCNoJ:4SmL&0I*qcAH (Lyt%MzfaҏK|Tҕt*Wj`60I*qcAH (Lyt%Mzfa*C ThI2AAcJ( ~p654ޖsNU8&c<.OLÙl;QoJR4SmL =5N,yR$ ] Sc2w):w Q!B*>A0I'AdN+ɴ=͊JHB.U8&c N+ɵ0t$ו8iƙ)Smeb,7, †MebO; ;mdYL>T.xpwqܺtj|ObT>wѪb&bfL±5G|*.ޭ" M |(dQ$ |*.ޭ" M |(dQ$ |\;;mC|,LZPmxX2P w|ғ9=mJoKV2̲a]A^Ex;J2ڼP>|:5P[xU;OH oiNԊzOR F1:֯)TS;(Rژ[ B.SdN+ɴ=ÿޖد 7ŭ^ULWw|ʭyCby6=Î9ԖBˡHg ]Aزө |^]v(iyKnBˡHg>=k|a2/zm2f2FAڴdl^lN-֦'Ӷ,k-:5 E)ּl[0%Iz0Muj?5#Q)p}lTR{lZu#AKb(spb>*)Mfd0s._;4L;ds.AA̺;bfd0k7%Pÿ<زөfHQ -:5Rh^i/Z"fP[408|` 7. V昢¬Ue+s`yeYJ?F2F8Bm𺐼^5jQk(df $ŃAϛdcTIFWWOX12M=ԊaORc4|@Bɵʠژ"Sԡy8 @C Tx-:y{.ˡG5#3(֔W"*lde7|92 Е*X4P0RO@%S*e{Yo%iEJҋu VJ! Hp82VMcL|(JL)PH\>4Ԋh*e5YGؐP;  wLr [_ 5}H(Q`ܞPPYGؐV X\G1-Hʛ;|F.̾{[HHeR5 H9eG1-Hʛ;|Fٗs.2 *+w &05R>LzzzOU ˭(V^` cA``XtKԎR)e\Ă,4 .(P1ADz5"] ; KR&P t=XDzi-^R)c#h9†MebA@ X p ;H Yt`kC&  ,B'rzA@\BR) Yt`kC&  ,R'rzA@\BVOl,SDUұjE0pJˋR) Yr¬Ue(b, `w#!jE='Z-^4E=ЋeYJ;̶b)Hy.ujF+*aP[`F wZu#Cl,ŖHt!P[]Cl@d )lYnu#U-Hc֓b@LKZu#Cl(u%YFVǩN)KFV&Tecl[(i~wRm0YFVǩN)KFVwd7D礼o7>k(sVǩNiQQo-^vd%Yc$Vsi*Z2a2Fٞޭj> FJqHd:5P2Is-Q^0^2پ{ 10=J H(^ ޗPf4Ǩ(-Ϛ0P;s-^P(Ž<c5a=Jw*Z2ٚםHa4 j|eZ|aRJ2V7Yw5a3LIE6\5x#4ʖ{-&@C <ޖ[ w *∘D0Õ-X[Q4RDfke&^:j|Z*w7YwKFV=džDTLDqDL"D$ k(df >mֹk,` H*Z2<4r$ `#"a$.(9Q0a hDz0BH.Tecl,xhHD!HDp$y|cNu$Fiz/V`CJ2j2wѪ@(i#J gelygͲz1e,-ԑ-1*Z2<4r$ a$ "8k(df >mֹk,` An1m T60tшRѕeᣑ U a@ ; ;ԑZ (˳5˩F gelygͲz1e,bIbD9Ž'CNu$Fiz/V^"e3˩Fŭ^RpH0YF#4Ğxh4YlcYg0XRDfCDpIh8IoV`CJ2M_yJڟpH0YF#4Ğxh4YlcYg``RDfCDpV(In|QRѕ-X[ w矝o?|QRѕ>=k|a2/ Ϛ0c`{}KFW=u#(VXÿI5ը\wʖ{-F= EgZoQR;T/Re0;`TW-̶oLzRR)=J8ٚG^P(Ž<c5a*Z2ٚםHa4 j|eZ|aRJ2V7Yw5a3LIE6\5x#4ʖ{-&@C R2^Ku[;-^u8H fjB/5Rbue)hB˭LN.}K]_yTS;ˠ2ӶJˡu9E)VrQy.em^ ˩/V`A8;E, ŭ^R6w# Q]TeclH+bpwhDzX򡈐<whDzXa D0#ˠyʖ{- *∘D0ˠyʖ{- D0r.,Rѕef "@##ˠ ;Tecl,y0qB *ytg5@wQ7o7e`CNs-Q^FŭyWfks-Q7]mw7tDaѪ-J7et\`CNZPmL/P7et\.0BHG.-jA2ϺT`}ҥ0Y4/V`@/QSZ/V>R.hZEϺTyXWQ]lS]BvUtau˛:"0Bj2w'yJڙF]1Iʠoaig*\i]T&oaig*\1Iʠ.X\[5+оޭv e˩yJj뷫]Bs}хs}чDF\gQSZ/V>Rbxc0x{-tre NQ]a"QS^" g*_CZo.YJ, .X\MHBYJ溠-jA2ϺT]Tgғ}ҥ0a{沌7[j'-_qםH7<#"y~2`TWUaǗw"3M} fy|Q1', |'sY H7 ;|Q3]Z|*{d-eF[U :*Z2 FJqKN+ɴw$ו;|8Ew&X=#H"3ե %Yo8&@T2tweg]G>Rhz-lzTe{© T6f"^P(³R(Ċw֯)TS,KF wl qg*_CIiT >R,u;+lh/y2vդX!P,Kgq%5uuٚ6;z*lUYJ;. \"0ãU e˩Z*jgtƙ&֯*k|72Zu,K;kTЋg*\1Iʠ.X\[5+оޭv e˩yJj뷫]BplEaF>0.e쭲VբϺT*-D0`X-p -̶]E>ReˊE.hZEϺT[ B.tr偅az*t}k֯)TS,K5@w):wl qg*_C+y6oWA O-J!*l`u[8-J!j4RѕeÈa2G5RzOk--J!3piN-X[ L8AȆ$y} L0x2wt =7USwcbh^ zfQ ; R%̶]E>R X10fkZO|e0ҌSc)ry6b/<"ҌUSRѕH@.A,;Ϛ0$ŃAϛdcR(Ċw"3M5P2ɭRe0֩%+NA,;Ϛ0$ŃAϛdck(df >mֹk,`IbSm ;ԑ*q^M VA,;Ϛ0$ŃAϛdck(df >mֹk,`0u$Fi]Bz[l qg*_A 4Rѕeᣑ UQQ y} F]N%hZ,K*Z2<4r$ a$ "8<( IHĨ˩/V`@.(X (Rѕef "@##rp,K &դX!P,K ;Tecl,y0qB *y}-jA2ϺT|QRѕ-X[}ҥJNF2ǕDqDO/\#{l qcʢL8Nu$FixQu gelygͲz1e,Qn1pQ10fkZO|e0Ҍsz5P:(u[;][j'-YK|ձSђ4RѕeÈa2G |`^Ǩ Dz,Zוw`TW<$`ʖ{- *∘D0j2vV+Ec‚\Rѕeᣑ U a@9Ex8JJE%F]Nz* yqBaGʖ{- 0a _CWYbXi4^" c‚\PQ+acɄ H$SqkW <((xIs沌6RLhDz-̶Ex8ACO.(eo5խG§ FJiF\"0_qםHRѕeÈa2G+l{T^wRԍ=3z[l qcʢ8'C;Tecl,xhHDTGD!H_CQSZ/VU<+acG"@& "@##rp,JiT U<`0KFV=ǎD0r/+RR,,4/V`@QQˊ -X[ L$$PA$ _CZPmLQQ˝el-XRѕe[l qcʢ8'q{沌7֣ٚS%Yo4.utDaѪyԎ-X[ L8AȆ$y} /;|Fڙ-̶Ex8Q&y}0XӿKFV=džDTLDqDL"D5u;+lhQ&ysKFV=džDTL"DG9G))Xu;E,<$Ï.(X (Rѕef "@##rp,K &դX!P,yTI\PVwhDzXa!  TZ*je*0˝el-XRѕe[l qcʢL8;|Q3]Z|*{d-eʧڞ9ůeӎb/<"ҌUSRѕ}[;A /CNu$Fixlz-Xs沌6Fi<`h=kƲ`-ԑ(FV; Ϛ0fkJ>>)tƙSmi+8EwQÒs (Q4RDfp%W fy|Q1', |'sY`He= J.ЋӿVǩN)KFV= u$FiyJWk W[` 3s沌6Fi<`h=kƲ`n1rLQ-^e >j-C(w)l v ;lz┴ecl,y0"L3T⼛@^_(Q04֣.dHZHodٚS5O^yKR&Ie.1F]NG‘zZu 4US w))hDzXȐ*C0 H%%"$DzZI$6 G‘zZu,w))hDzX a@9Ex8JJE&Ie.2II8(R/VB.⅀Žu[8-X[ 9Q0U0a[ I2e|)EQrBs沌6>RRK))hDz-lzEx8Q-^e$|+&[)lP,US w))hDzXa D0#gy69Eu)$GLD;3ZI% E2FτoV{ 4rxzSzZ2L{-q2vM$|)EQqXcNu[8{-Q^gRR{- D0r/+RR,2L{-qNlPI(R/VB.⅀Žu[8-X[ 8a$ "8<( IH1eI61:&J>բЋ`0VǩN)KFV=džDTLDqDL"D9&=Lu;&J>բЋaYFVǩN)KFV%lz┴ecl=Jp[(emO(L %wʶAܩJds-QLiu=JqJZ2h`pw)l v ;P(`[ B.c@JsVg,icԧe*+,USRѕe8;lz┴ecl,y0"L3xΧ5j^O`^9%wʏ;lz┴ecl,xhHD!HDp$y}Q^eL{-QrDZ%wʇNu9P˖,w))hDzXȐ*(C<(`[ B.c@JsVg, .w5alz┴eb]VǩN)KFV=ncԧe*+Ž;p|9D0BHv@Lel-=+TyqXƝ=Jp[RR{-ycԧ+acɇ(9d/P8 4QRR{- D0r/+RR,2e".X4Q  ;lz┴ecl,xhHDTGD!H_CL{-QrDZ%wʏ.X\USRѕe)ZV26 .=JqJZ25eE=JqJZ2,(VǩN)KFV=K ;F2t<ޗ(`[ B.c@J\ _;F2tДL{-QrDZ%wʏ.X.2Tm    R"5!"MebEեc#g#:cNu[8-X[ c#`Na: iX(P@0K=iE9 ^#:cNu[8-X[ \],#:cP$ڜ/BzY!韾d;lz┴ecl, j˂#:ec'LcDC ;g|v(aiE9S?|1w))hDzXi`Qtc'Ld|@hQb[Se0Pass沌6>RRK))hDz-lzEx8Q-JDZu,|JdtS <cNu[8{-Q^gRR{-ycԧ+acɇ(9d/P8 Nu9P/r|2tycԧ+acG"@& "@##rp,Lel->T2t:sZ\0`0VǩN)KFV=džDTLDqDL"D9DZu,|JdtS <`Ys cԧ+=JqJZ2 u[8{-Q^w.uo(`[QԨ L{-QrʔN.+0XӿVǩN`TW0USRѕe8;lz┴ecl,y0"L3yJR:աxU&'\RIG»z0Muj?ɇ۞{m$o}(1Zbmƙ( h]_+To00Q2J>wRyC k(df >mֹk,` Qn1m T60tш1:E1 w):w"3M1:liF\ ֯)TSn <>k(df >mֹk,` H@r Ȏq: Yb1JZ2%ɇۘ&ط{Pӿ<—mϚ0#+;}Mze^ 5af,k-`3e.On=Jw*Z2kP7(2s1ڏK5 TdSҌ3\"fRѕL5#3Y@T]r+;LQ(<#@P.zQ^8}o(q7U $ד-ÿVǩN4doK^u.kS^xCo)N:FMzFqZRyC ;;F]N%hZ@QS^" pw &դX!P@ZPmM8;̶Ex98;Fأ"3\hDzٹ KFV=k(df >mֹk,`Ib9d2A(;(˄][ &Sne2P,ř+{^-L]Sw!iuo@k{ٚHط=kJ-v5#ޗ(L< SdYqy6,CN]E*q^M,F0EɇۙjcL .2U8&#"h".wQyJuy6,C(ĊwQŖZPmoT⼛CX`բkW (Ċwb=EʧWC8z2@ +d$"L@@qV;kR# &H( ?K4 D9Xv,Z*h-yV0DԅbxUY ;sZw"3M,k-`H0fkl`^Lw5a3LIE6\5x`0-ԑ--yJw#s沌7P|թ͉"f;YGV0}[%[cl_x 5$("mjC=iE94/Ge]QJWhrzZ-jA\Z-jA\`CNu$FixQu gelygͲz1e,Qn1oTQ4)Smpb fy|Q1', |'sYn1lYhUУUdR.U:"@ ՌqL[ V&H1e  Lx+dٵPȆ$T%b "`;Z-jAw햼ūbbxUY ;sZw"3M,k-`H0fkl`^Lw5a3LIE6\5x`0-ԑ--yJw#s沌7P|թ͉"f;YGV0}[%[cl_x 5$(RDfqY` 3s沌6Fi<`h=kƲ u$FiV0$hQe*+pwZ*jet} JERc^ZPm,ŖZPm,Ks(QKZPmL/,ie*+şt} w &դX!P,K`e쭲VբϺTy˩/V`@/yF]1Iʠuy6,E֯)TE1e֯)TE>RN5N+ɴ9eZ-yJ.Y-yJ.YJ-Limj6;F]N%hZ,KrdI#yQJWhrzZ-jA\Z-jA\.X\,+$Q2vդX!P,KpN+ɴ9eZ-yJ.Y-yJ.YJ, .X\MHBYJ溠-jA2ϺT]Tgғ}ҥ0aKs-Q^,K!Ɲ*Z2<4r$ `#"a$/˩[dEtsKFV=džDTL"DG9G))Xu;E,}ҥ *Z2)$Gw5ae)hĔ &Snb2P,\"L;UVA\uxD0g(샸1Z@($Q2 <~i/X8$tq^MV dXl.2uI iUY I% Ij-I% y$|(M;ʦA H  xɞwRIGŠܟ<+Ty4JF2zH*TW fyK(L< SdYq G‘zZu qZ|a|`G;Ϛ0$ŃAϛdc y[ǝdm̵1JŖQe0' EhE_,i49e{Yo4^b@(i#J7YwIA Gw5a3LIE6\5x`,-ԑ-1( (L< SdYqYe[pQ^]Eŀ… ; ;Ϛ0$ŃAϛdcV&HRHen ҌG¸Re0<V<>Q]37 >N3PžL;eɇۙjcL .2w1:' EhE_,i4V&'Z/V P4JA,;qZ|a|`G;Ϛ0$ŃAϛdcj-ORnwJ(J>N3PQukNQ]cޖP,xM4@'qi$HZ-C;ԑ\ dE$ "4Q_pH0.+To4ϊI(QNs沌6Fi<`h=kƲ #4Ŷ05RF"e%ɇۙjcL .2w1:&J>բЋPGғ#4< [hZA,;Ϛ0$ŃAϛdc xcmtySDՠxP!H4GŠܟ'x{'NZ0fI2aʮOT|ҊDEOso#x!FO4L ^O;(W;qs沌7NTec;m> 쑸,T 0  7@yFYɭRe0 Y02s-LieJ' EhE\hZN+ɴ\`CNu$Fiy5L$%i fy|Q1', |'sYn1n{l|(LɭRe0.(L&[ ĞP&HCNu$Fiz/V^"e3˩Fŭ^RpH0YF#4Ğxh4YlcYg0XRDfdm̵1J*Wh|)EQrҩmj.ZU8&rƓ&I`YrH{沌6$Y02s-LieJ' EhE\hZN+ɴ\ɭRe0.X\0Qzتs沌7i>S-j6]Z (IFk(e*q^Mebm[b H{沌6-LNzGk(bc5aoV|*|Rز=bsU{YGg.U4MZg a2EOeɇۙjcL .1*8XӿҌMj-eɇۙjcL .1F]Nʎ+lZ|a2Ћ 71"H@֩2kTpH0YF#4Ğxh4YlcYgRDfMj-R1$(Q4ELyj-yJ7Yw5a3LIE6\5xh4["3LY@ae6Z%ˌQS%d֩2L".ZkZ|`\,Ihծ!PҌ3\ICHT$ bOk(df >mֹk,``RDf> ;ԑ*q^M VA,;Ϛ0$ŃAϛdck(e*q^Mebm[b H{沌6-LNzGk(bc5aoV|*|Rز=bsU{YGg.U4MZg a2EOeɇۙjcL .1*8XӿҌMj-eɇۙjcL .1F]Nʎ+qX&[ ]EQ4RDf\?&IZd;A,;Ϛ0$ŃAϛdck(df >mֹk,`X -ԑ-1( (L< SdYq2vTq[֩2L".ZkZ|`\0PG#4)e*q^M.Q]l*Z2ӨTt(˳5:Tp<>k(df >mֹk,` H  E92E1B2P,WI Pa&iLQdM' /g-4swQLi{P.cNu$FiyJWh.Q]l < f|#{coԸ|FL0xSj ;J2(noYF#4Ğxh4YlcYg["3L]1J8In|QT⼛E)hբVoVel[ T"i|Q ;;)x6 y6Rѕ>=k|a2/ Ϛ03YJWku[$VsooVlUl#S*3ZkWAwդb=YF;z*˩yTG T"i|Qqޭv *ה?nJ0k(df >mֹk,` H@r ȎwjH{沌7,i4j뷫]Br/ZPmOCHT` 3s沌6Fi<`h=kƲHJcMa^#0ءGғ#4k(e*q^M)KFVwd7D礼o7>k(se*q^Mlz;t]Zq^MMXF\q^MU8&02s2ae6 x>U8&+BLQz>!e6{T⼛S5;bw*Wjg^P(³<ޗ*WhxM;ԑ*q^MkWpH0YF#4Ğxh4YlcYg0H*WikP|(M;)$EnOhy.U8&&֭3ʐ( `4p@4 >V&{&yI% +r|@MQJ=.U8&&֭3D0";0Q'4+lwRIGŠܟV&H`yI% +r|@{$n)$yҏKN+ɴA @ATH y <> x: xYJ=.U8&&֭3 x2J>V&鍷eJ=.U8&&֭38p "@ >V&mI(Q[yF\q^MSm)1nbE ;(˄][ʧ&SneSmGAw"3M` 3s沌6Fi<`h=kƲ(RDfE(.+To7,|`G>)$Gw"3MɭRe0֩%+N` 3z\V2h!(QNs沌6Fi<`h=kƲ  u$Fi|(LQU8&8(R/VB.OQҌe튬.ޭ[*Emq^Mae6ZU8&qy6G‘zZu, .wZF#5a%2y6ۙiT⼛EJ' EhE\0Q5Rbtդb=YFBQ^*WhxMN+ɴ\c T"h".,w):w5a3LIE6\5xh0["3L\RIGŠܟSmI% EhE_2>wQZUի`@hUN+ɴL< J.2U8&4Q^]E˝oVem Ex8Lq^Mae6ZU8&qy6"h".X\X (1:E1 ( N+ɴL< J.1LN"h".,w4)Smpb fy|Q1', |'sYn1ry6elN+ɴRMZ+lUavi|QŰI/VelQ04 o(eUU ޖbqJWjcNJ22R 48&ƝH@8& >fj\#{cqFR0O쁼N+ɵ+y|Q1', |'sY Ib2Rw:PMB+-VǩN}MBMw(ŰIз25CN< ^ xEP=)hSl0|mB˩mB+;n|QGkP4EQeӸEը=Jw/B-lzum\Teg1Iн(˄aR. ʖ̫j'%^E)Rur{yRѕ'Bvf"td ҌRѕ*L Rd%Yg1Iмtw T7)KFWt&]l5RbuuC\RBʠڙek7-;d̺Pst\k7%Qy5"3LOd^tOMySwQÄ]A;Q2]E,ahE\h ]ˠX@łŞHys,ahE\h ]ӝNj,<844`g\DZu,|Jd<844`g\DZu,|JdtS <$ w0I*vtƙҌ|95YGؐPPCl-7;˜zZnOoפow Q2^F\h&]o2ZQ˜^NԄ_:;jRѕ:I[ Tp]P5P-j6wAi%neкˢRyC <i)d*{%Za>k(zKԈ{Pkg.UbtQuLdQ$g;IvbP.h.w12̌| <3N8$x*9ɏ"<0R.U:!-9Eu`P!+~ ; ;UVA"SӔW[ "ǝw햼{Y{BjA1UVAO<[b*b4(@edQ$.; ;ԑܔr8&(J =5N /; (no( bOk(x%=Z؝b&j#y6EuU0I*v;5X(_bAb;e1HԄC=(xӿkh1E Rt4e\(1YGؓŞ(Fbs-O|^s;-Y{(=s\>u|Rآ@Cla7E7e\-bՉ|^VάKP\ ;IvXe\ ; ;f;, "e3U70I*vmQyH{;:/@9Չb G2M> ( , L5|Lľ /e("ub_LQ(1B; &Sn{so#xP/(;xM1Edm8;X#)4<.%Òa;Y02s-Lie)Sm+&%ŰIз25G &Sne2P,ťK2TP,-X1:]v(dm̵1J(e1(ա"(9em̵1J@N+ɴ(cL U&'BˠP,r ۙjcL .1,F0EЖ1:]v(1 fm0d)p%I£%Yg-5CFKӿ08;(˦4@kcNc-Lie2c-Lie1eP,xM4@ sf ;Ϛ0Z)KFV&I{lQi|Q.OiJZ2%ɇۘ&ط{[>R(c) YFcebJYb102s$_;bq@;Uk(Ž9ԖBˢ8&JZ2* NJ.|^T⼛HZ /e*q^MMw(ŰIз25CN< ^ t&]y6Rѕ>=k|a2/ :ISKFWry6.U8&&֣I5ը\IйT⼛Z&֭v|RSmO(]welBs.RyC 3PU8&V' "3`nc( }8| /e*q^MDjBEh!j*.i+튪@*^ 1Z@L4D ^%( "*WhLl.IW yUd(FWٚzk̓kO5ʧӔW[UdR.U:"@ PbP`i $샴@0Vi/X8$tq^MO$h-yJpbbxUY ;8472P$ו;|2cP!ҩy6%aA #vf'+Bf!.,y6Pó5*ft&< "*WkJ2e=.ifkIT\E)ouJ-_JNF Kdmzkʝ1p(pIT⼛ZQ@*'3\֓ԩҸS;J2KFW81Zx ; |^T⼛[81Z5}p 4eN+ɵLIӿ8&ֆi2LVޖ,y6FÕN+ɵ04{T⼛SŖ8KRwq^Mb"Q3,y6(#X{T⼛S(q^Mae6{7=7y61ZNCJԄ_:;jRѕ:I[ Tp]P5P-j6wAi%neкˢ^P(³<jD=f'=JVyϚ0ޒm0;A(*Z2n{m$li)d*{%Za>k(zKU!hd8{bEjJ.hd8{bEgJ.hd8{bEgpd8]S5}  w[ B.LV`pw(Zub_Cn %P[ B.LV`pw#[S;J{z[d-e=' wPpU! b  jsy{Yo1Z1Zyj[tجU"Que"$hcTˠj=Ћ0E9샴gJ> FJiF\e<o0Mu 5Rb F"1'fQ!ppg-LNA;fQue"$hcn <Cl-1Z.w &05R>= !e62XTd,”bzhzw5aRI((U(d ;|QN%Yo4.<";ԑ\T^wR'e)hƞw5a3LIE6\5xh u$Fi;Ϛ0(j'-XU"QueX`p,)Ng10޴ڜd-eg]G#4< JYSpiF[ -Xs沌6Fi<`h=kƲPHw5aQu.OiJZ237{-k(sV#kr+;Ҍ3\"Lu< 2sl& ;t]ZxM#xM)vfQu.OhJk7%Qy4J.$ bO"0 js-yJ.X\Q4EliF]T/CHT` 3s沌6Fi<`h=kƲ E#4Ŷ05RF"aQ02c!V#\E^R6(Rt4RDf1F=( <>k(df >mֹk,`  u$Fi;;jT.ae6BF2,@B0BH@@,iF\Z*k|8EL< UB\Q4RDfp%V#d7Yw5a3LIE6\5x RDfEL< UB\E^R62u$FiyU ,&[ jQ$ bO=k|a2/ Ϛ0f9]JT/-YeٚV"f3!e6Y;dI5ըY㤚.;]Dm2Fٞb,[cԹ-~wJ(<@eo5ElsFʖRDfp%W fy|Q1', |'sY`H1ZwԨ ]Dm-u!ms(P wQyJu)2b,Xsԇ0BH#4< *C$kn <>k(df >mֹk,`An1pxMbÜŮ=kW Ih@B&IZd;n <>k(df >mֹk,`0 u$Fi>b,XŮxIhխ{Lj|ZN` 3s沌6Fi<`h=kƲ-ԑ.u)2b,XsԇZ-jA\,B[դ%))XEL< ɈabRhUr⅀³Ihծ!PҌ3]^$ "4Q_ gelygͲz1e, u$Fil`jeiDѪBH@]I&61Z$ bOk(a1OM60L]DmwwRm0YF zh!d T,6[ nIx6n|QYF zh!d T/-YeٚV"f3!e6Y;dI5ըY㤚.;]Dm2FٝϚ0L`F1  j|3U(ܔaGyk(}&0I8l`FʖRDfp%W fy|Q1', |'sY`H1Zw"3M_d֩2kT gelygͲz1e,an1g =4c3*aQ02cc1l`Q(;(ˋZPmo$ьCcǽ0BH#4< L`1q#5P Vn <>k(df >mֹk,`X u$Fi]Dm zh!c-yJ.Xˊ;ԑZxFŭ^Tn <>k(df >mֹk,`IbQ02cc1l`E^R6wYz%%"$ьCcǽZ-jA\0`0Ihծ!PҌ3]^$ "4Q_ gelygͲz1e, u$Fil`jeiD.ae6 =4c1mZPm, .(Qi4 zf.10`F=(w5a3LIE6\5x`0IbZJ0u%YF4|D`@B.ae6 ;;)x6 x>"0 jgOZctLzKs沌7=Ϛ0灣#ʖJ2p32{Ν{$,Muj?Ɲ.ae6{o#xelsU lٝRyC ;;=YFlx"0BRѕ5@w"3Mn <>k(df >mֹk,`0u$Fi]Dm]D ;ԑ T/kTo5IFJӿ` 3s沌6Fi<`h=kƲ0RDfw TlW@L"&Sl`灣#ms(QKa 4.-jA"&Sl`灣#ms(i]T&u)0sE^R6;ԑZxFŭ^Tn <>k(df >mֹk,`IbQ02c< {lZ*h`YqGѪHJ+RR,0xMZ-jA\0`0Ihծ!PҌ3]^$ "4Q_ gelygͲz1e, u$Fil`jeiD.ae6x>"0hUrH@ƪLNz*Q*mBH0wyJڞ$ "4QX<>k(df >mֹk,` Ibjb,[cU++M4b&k(Qғ#4k(df >mֹk,``u$Fi;Uk(Ž8R[5a/iE )KFV&u)1p5CN< ^ w>k(d_6Ҋ2R;}Mze^ 5amd*+ϕ-YokQOsJPϚ0ޒm0eٚRѕ2* ӶOY)vf_6Ҋ2ʖ;t]Z5#_;i="꘽yԱB繖(u)<#H3\CmJ2p{.)VrQyH@.c! )KFV4 bOE9H@.DX9ZYU RiYF#4Ğxh4YlcYg@HwQÄ]A;Ϛ0X1k5P0xM]E f =3R0O|e0ҔUl4Ǩ7w"3M =3R0O jsRѕ<>k(df >mֹk,``,["3LQF\"uv4>k(a1OM60L]Dm̴".(@eo5iDFd-񆔢fka=FGٽH3Ihp`[#T.|hƞw5a3LIE6\5x`0IbJ2Vp5YF4|D`@B.ae6Zuwה2QKNReͥ)hĪ1:q(-LNAwwRm0P2Ҕeymַ/m0ӨTu=WʹEy+;n|QGkP4UbtQuO_;i="꘽yԱB繖(;jRѕ:I[ Tp]P5P-j6wAi%neкˢ^P(Ž<]A*1:q(2k(  w#]Dm|n{m$o}W+['Qw2{'bxMp|8EӿQ02s-EiU J.G.ae6ZuY*@U 1:]v(EL< B.%V#\İIз25G.ae6ZuYQ,9ZD T.bXj[tأQ02s-N&0I 5Panekb]Dm̴".1:GF T.bXj[tأ |J(TWJZ20xM]A;Uk(Ž@ k 51+b՝ab& # ./usr/es/lib/ksh93/common_functions.ksh93nvg#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/common_functions.ksh93.sh 1.3 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)27 1.3 src/43haes/lib/ksh93/common_functions.ksh93.sh, hacmp, 61haes_r714 7/7/12 14:59:27 # Load the common clmgr/clvt functions library . /usr/es/lib/ksh93/func_include [[ -z $SCRIPT_NAME ]] && SCRIPT_NAME=${0##*/} # Name: abort # # Description: Reports the error message indicated as the first # argument to this function, then exits the shell # provides a single point of exit # # Arguments: errno, # # Returns: n/a exits with errno as exit code # # Global Refs: None # function abort { typeset errcode=$1 errmsg $* exit $errcode } # Name: critical # # Description: If command fails, prints the command in the abort output. # Don't use this if a special message exists for this case # # Arguments: command line to execute # # Returns: 0 or exits program on error # # Global Refs: None # function critical { "$@" && return 0 abort 1 "$@" } # Name: errmsg # # Description: calls dspmsg with our catalog and default msgs # is tolerant of empty arg lists for ease of coding # # Arguments: [msg_number] # [args] # # Returns: Return code of dspmsg # # Global Refs: MSG # # Usage: errmsg [msg_number [arg ...] # function errmsg { typeset msgid=$1 shift if [[ -z $KLIB_MSGSET || -z $KLIB_MSGCATALOG ]]; then echo "Fatal Error: KLIB_MSGSET & KLIB_MSGCATALOG need to be set!" return 1 fi if (( $# )); then typeset -A arg index=0 for a in $*; do if [[ ${a:0:1} == "!" ]]; then name=${a:1:${#a}} typeset -n klist=$name arg[$index]=$klist else arg[$index]="$a" fi (( index=$index+1 )) done 2>/dev/null dspmsg -s $KLIB_MSGSET $KLIB_MSGCATALOG $msgid "${MSG[$msgid]}" "${arg[0]}" "${arg[1]}" "${arg[2]}" "${arg[3]}" "${arg[4]}" "${arg[5]}" "${arg[6]}" "${arg[7]}" "${arg[8]}" "${arg[9]}" "${arg[10]}" "${arg[11]}" "${arg[12]}" "${arg[13]}" "${arg[14]}" "${arg[15]}" else dspmsg -s $KLIB_MSGSET $KLIB_MSGCATALOG $msgid "${MSG[$msgid]}" fi return 0 } # # Name: logmsg # # Description: This function will log a message to a log file pointed # to by global KLIB_LOGFILE and to the console, # if KLIB_OUTPUT_CONSOLE=true # # Arguments: [msg_number] # [args] # # Global Refs: MSG # KLIB_MSGSET = message set # (1) # KLIB_MSGCATALOG = message catalog name db2sa.cat # KLIB_OUTPUT_CONSOLE = true / false # KLIB_DEFAULT_LOGFILE = fullpath to log file name # KLIB_HACMPLOG_ENTRY = HACMPlog entry to obtain path for # log file # # Usage: logmsg 100 "abc" 123 # function logmsg { typeset ARGS=$* if [[ -z $KLIB_DEFAULT_LOGFILE && -z $KLIB_HACMPLOG_ENTRY ]]; then echo "Fatal Error: KLIB_LOGFILE and KLIB_HACMPLOG_ENTRY not set!" return 1 fi LOGFILE=$KLIB_DEFAULT_LOGFILE if [[ -n $KLIB_HACMPLOG_ENTRY && -z KLIB_HACMPLOG_VALUE ]]; then odmget -q name=$KLIB_HACMPLOG_ENTRY | while IFS='=' read name value; do name=$(eval echo $name) if [[ "$name" == "value" ]]; then value=$(eval echo $value) KLIB_HACMPLOG_VALUE=$value fi done 2>/dev/null fi if [[ -n $KLIB_HACMPLOG_VALUE ]]; then LOGFILE=$KLIB_HACMPLOG_VALUE fi # Return the status code from calling errmsg (last statement is the ret code) touch $LOGFILE >/dev/null 2>&1 if [[ ! -f $LOGFILE ]]; then echo "Fatal Error: Unable to create log file $LOGFILE" return 1 fi if [[ "$KLIB_OUTPUT_CONSOLE" == "true" ]]; then errmsg $ARGS | tee -a $LOGFILE else errmsg $ARGS >> $LOGFILE fi } # # Name: dbgmsg # # Description synonym for logmsg, provides debug logging # by default this function ignores console logging # no console logging is enabled # # Arguments: [msg_number] # [args] # # Global Refs: MSG # KLIB_MSGSET = message set # (1) # KLIB_MSGCATALOG = message catalog name db2sa.cat # KLIB_OUTPUT_CONSOLE = true / false # KLIB_DEFAULT_LOGFILE = fullpath to log file name # KLIB_HACMPLOG_ENTRY = HACMPlog entry to obtain path for # log file # # Usage: dbgmsg 12 "foo" "bar" # function dbgmsg { logmsg $* } # Name: require # # Description: If command fails, calls abort with the rest of its args # # Arguments: command line to execute # optional about arguments # # Returns: 0 or exits program on error # # Global Refs: None # function require { eval $1 && return 0 shift abort 1 "$@" } # Name: require_dir # # Description: Special case of require because it is so common. # This also has is a special error message. This is to # simplify calling and reduce errors # # Arguments: Directory to create or ensure exists # # Returns: 0 or exits program on error # # Global Refs: None # function require_dir { mkdir -p $1 || abort 1 21 $1 } e l,c1+$Zb՝ab&z5 # ./usr/es/lib/ksh93/ezupdate/Cluster_th9  #e norst"$ERST_acdilmu().:=CDINOUfhpy{}'-01AFGLMP[]gv&/Y\bkx!,2347?KXZjqz|569;*+@8 at  &%( H:2KbZnpiYgUS@(^x0g_OHh`ԆHPX!@HX e, ܮ"SD0((Ȩ`sՒDy@Q0զ]lKU +6UL0ՀYunJD BE`PV eh("6aug` )TƁ{X{ [k ¬ c[$nud $|/VlA곁ɇܥ*vrB&HPX1tX/9hܮ"VU,:oVWhܧy v2͈?wVYIӵi9 0vټ8ED %(2*&Հ ] 1p-`( X][)t  م՝2ܧqRcd\$ .7 , BAXUUUUUUUUUUUUUUUN56 %1ίZ6FvؑU23j *(ѹuUUUUUUUUUUUUUUU92bsX17Տ6umQ{4үTRQ^m]v*;k\L+1޿h We:hz*֞]lK}r3[[oU|YVYڹ̻փF VbN ړn1̜PkHmQbfw65v$aLx>orH*0;N`h܋XiRd$PȾA;VjZ!S$P0@% M1Lh$9.eȾY6 #ګneY;ӿEPD12E w;!i&R E; Vww#_eNN*4b|;H $U0GX~eY#Uaer.9^ 4&Z'ӿ(U1wUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU;oZlAlnEN<A8H(P880(\LOy\{Ą"T9AP;?8LOy\{3&.W=fq+iJsn+Ka8ɋϛFɈAǚPkj͝yj͜seM4  -^sـ^xPG&2bI H`sfK]H73 yY$B;+<; )8YDž $xy"h(&, PփM*ۋv|V9QIU <(X#@A1gȤ0viWncYԃs0wb±2HEA$`&I4Q5A< EփM* Y;, A=f9by 440yTP6;^eLy4nfXuD;eM4  -7(7AH; )8YDž $xy"h(&, Pk7;iq4Yԃs0Ǟ,_@($,c3ـ^xPG&2bI H`h4ү_͸Z^gcUZ…<<4 zH(LCkAz< ]H73 [/>+`8+1/owTH;<ЂA& @joۋ⳿Z6XÜw;af2..waILBc_Azڄ|ր@T'L$BbLs( w~J{r`U k,rer,ʑ|#ڄ|֊ " bdwdC M* w\2,vPb%S s^73 ρneZ 4k76 H^z^Ĺ| s/{̽AzڲUs VwY`Z3̽AzQUds )TeQ&[2UA{w;S*Pb%Sփ2n| s/zi^ꪪzbf2./wqA@ĉ]Bbbx$焃$%y"nGbbx$焃1r/LDc wZ` 1rjǞ`2bsiq3&.W<%fR+;fL\z.{8f# +;w#_eNN*4b|;H @@E0ZI#,ůBLN3mi&v%F&e@hha Na ,mw?Nk-r*T;Y6 چ# +;;HK8A@ y@DÎǏ.s1< sA<qP @x7#1< sAw̘\DyDž1r,Jc]3&.W=fq+Ka81KiWnn+/j=Vy;fL\xi=1r$w̘\z#92bsH8;P޻ʲ/[{K$$D  6[@fzDI#e" gH9Db( AM*h"j$x^c Ůmi&wՌؗm\h1͸<$*Y;UVe8ee³/VG./ G{U|%``$%xi=Gbbn{{"ID.enL$G,"D#L$AGD.,ÝY;-щb6.`$%ų,$3=2$v&&B*$hA 5Q7@Gea\h1Ǭ;76HH<(wfY۝YhGV/a2Ħk@,1k0Y_|;#a~xeHww!,$zdI" < &&# ڏU~{ཨ׃- giAeYQ^zY~qG՛;wyHD 0 ڏUzdI" < ۿ-~B*$hA 5Q7@|q#n|Ŭc<޲^ʰq?L/zi^av/} qUeYxHNq4nfD<1BTAJ"mwཨiu 77;; ^k2_Z 4YYE!4 rPHiRMTMDO , {X2Ў+AM/r4h1-O,JfN/k70lzi͈?- ۿF o\x[B8|dxP4hA  0c׃iqA@ / Mg;A3Qf7<{=f9ŋV0c^s<)ڠ,ŋ8x{{ٌ-w}ر{Q` wE!4 rP( U$EDIEʽPk7łx70lz̭փM6VlA  c34/fwnm 440yTP69;a6M~Z|ӿO<-Xq2<(yx`Q4I  1E ? ~{@=%UG՛M kZ ^AOmp$BlX c;emA{ +6 `"a| <޸cjl[/Ln;e7f0a b'` wE!4 rP( U$EDI3AJ";*A8b x6 }fVKA{ +6 pvϐ1ǚ|g;76HH<(wfnwTH;<ЂA& @i"aI4Q5A<, #fVKj_|e_a2~6+{W)*)r x1͸<$or`rs9ΰyFy&*&I@zdI" lNe1+b՝ab&9 # ./usr/es/lib/ksh93/ezupdate/Node_t_th9   e #-ainorst"$E_cdlmpu().:=NORSTfgh{}'/0ACDGILMPU[]bkvy &1F\wx|!%,2?BVYz45>HKWXZjq+3678;*9Q(!c}% JJNQITNYGb+jK+c~^ec~^;XVKƨ ;iJoe 䢂H]E3iJV7WΨHsloҲYՒ1ƵkZֵkZֵkZֵkZTekעSՋղ' k@mi&xhyCa)IUe4 D@< D4<$acZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵnX)ek.֢>wXZU*QֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵeFV]wI;FF+].wGgFV]w ʕl#ʕF/VȜs?2% m:BQgFV]w#$1]QkGΐQ\Ȝs?2!(F.tDQ]p\ D#'!(8ekq PΐB?#:BQ"qK8@0IJү8ekq 0,/_[iWȜs?2h3&-0xf)Zhe1t"qK8BJ/JڐB?a!J8ekq"ԁ )y@HRڐ1e-gFV]w`1y@HRҬ-gFV]w-H(qP#ԁ )h('t3=*b5Ҭ-0DQ]p;ԒOR{ D#ԒOR{ D Aab,,y2C "LQ]pA:na`*8ekq xR%I'G ;*I"'t3B)\I/4#[U!J8ekq ]u!J%zIyaK*B"qK8D  W/9+K+9!J8ekq"x W/9+K+xQ֡gFV]w K׬MQe]d["qK8Ax)t;B?,-4T*DQ]p;FzH4P3+]./wYsd1a !"qK8D \Y XG"ŭDk$aU(DQ]pRu-u}oRI xүQDTB*B"qK8Ax)t;u$ /pGiU$Hs?2$#W-d<ЈY &D"T`5lK8DZU|^bdiU_UvDB!dÐDDj$hyRbE +].ՒvEY'dN<ЈY &D lekq"ԒB]zz(2/r*I!xD/YeHs?2jI!xD^ ].eePEI$/Fv-*8ekq pyyOPY N"qK8@U!J>2NҕT*DQ]p*'t֐6eR3'tEinf^R'FGkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵk?P! ,Y ,L Q=Lޒƹ)'hא )2hC$""$LH3nQ`j옒$AgpвyR @Yz[3$,3vY(a2(? kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵk?˯ GNYG()x@0T&H800dTWz]w()xj`r"$P;"G8fv*+A=.gӄkdslǚD|^gӄkeJzD"<̩Tbl?֜#]_["qJmNgdN<#{ѥ_[6s.tD"i$a^xP‡@1Q@0 ңiIU_/UU4dV^3s±ÙS7DDvyȖBʖ@%*la(L )*p >e-1ȄgWs  (?ԒOQ2bl*2^/VuRI=N2N[gJD&L@4<TTOQ;ճ#Y+³ 8PH&*4$Tq֒%S!M/UƞP3i< g0f <(hC HʠLiQ4|4ҒvC>i$a^xP‡@1Q@0 ңiIU_/UU4dV^3s±ÙS7DDvyȖBʖ@%*la(L )*p >e-1ȄgWs  (?ԒOQ;ղ'hzY+w[MNޘKI9x(3 dV¦z/)QJ3yyO׌()4[7n,D|^<ҒI#'qzm$a^ <(hC HʠLiQ3">/V͏ղ Ï4[6 8XE+f^x5ޤ࢖86k^grQNfRNѮ^Sf-i@-=zaS=L?%5_XJ9yO׌c7+`OJ:BQgw=xf)Z|"^rUS7$?I1)n`/JQ/ &"8{?ۖ3xΐx|SVZҸx/9+ͳ^'zLse[Ғ)џUdblfۼbPO=->ggg0f <(hC HʠLiQ:1zDqUdblqITȜx`qDCCw$U&T  TYd5CɒD ` $\s$<#lRFޕYDž (xy$ yT *8`IzޒITgJԉOIT(AC4IFzWg4p$LTiP &H4RUW>wUiI;!4g0f <(hC HʠLiQ4|ԈA*2^/PѹKX?J""T;<ЉPKH@CyeK Qȕ@0 &PUO8CdB3ITg9hBgx33,M/UeHoODyRވU=үAiьDDvyȖHo<0,T ` ɐ2N`@(pd0 >ǚD|^;8H_[6v()izo"G<ҒI#'qzogLY$ԀQ"yDPD@`Xx ,LabjR$ԀQ"yDPD@`Xx ,L,?ԑk7x+8𡣅$"bO*a2AG4[6=I$ H<#ԒOR{ D0^o Z1je%yڲwxbm*WEQKg0f <(hC HʠLiQ;ZKLzJs?E%SU4dV^Ǥg3i< g0f <(hC HʠLiQ4|4ҒvC>i$a^xP‡@1Q@0 ңiIU_/UU4dV^3s±ÙS7DDvyȖBʖ@%*la(L )*p >e-1ȄgWs  (?U4dV^RFޕ†<@<<C<#lΐH<#r#:BQ6 8uש -\ G/9+Օo/VǣlITȜ&AhD&tJ0* BRΐNg0f <(hC HʠLiQ;ZKLzJs?E%SU4dV^Ǥg3i< g0f <(hC HʠLiQ4|4ҒvC>i$a^xP‡@1Q@0 ңiIU_/UU4dV^3s±ÙS7DDvyȖBʖ@%*la(L )*p >e-1ȄgWs  (?:%TF.tD񶑙ghzp{A< 69H5ҼxP‡@1Q@0 ңgD|^:%TF.tDq:%TF.tlqgpS7:BQJe[$մ?U2'IB!*QE!NťA(+s:RFޕYDž (xy$ yT *8`IzޒITg#RzJ8L"'lRFޕYDž (xy$ yT *8UOyƚRNg##Y+³ 8PH&*4$Tq )*%"zJ 4n|r8V8s?fҢH4"T9p(Px`RD%P-L! !%U|SG०<U3;yaae6g#{Fe%#\(@#oJVqCG  IDFUdJ!izlzOz#:BQ" 8HIDbHJ&3x0\ G\YV;m/V̈́n/\ Gtp"%'g3IFzWg4p$LTiP &H4%zJC=%S9IH"*2^/\U34IFzWg4p$LTiP &H4RUW>wUiI;!4g0f <(hC HʠLiQ4|ԈA*2^/PѹKX?J""T;<ЉPKH@CyeK Qȕ@0 &PUO8CdB3ITg9 @?1]QkU4dV^RFޕ†<@<<C<#l!(yG\ E0()i0MHn,ITȜx`qDCCpgK+D3IFzWg4p$LTiP &H4%zJC=%S9*2^/R'=%S g"x$a^xP‡@1Q@0 ңiIU_Wi$|9H5Ҽ+8𡣅$"bO*a2AGҒ)^/R!hzBg F,#c3n, *$PB%C, =  ,DK"U(PBRUW< }˾ Zc=%S98(/V͏T*Dq3 T0^ g#ޕ`1hs?^Scs">fR&dN<0@D8!!*0LD D0 J (XLH I qBbb@I"aJLhY@80 5{;VuL#Y+³ 8PH&*4$Tq֒%S!M/UƞP3i< g0f <(hC HʠLiQ4|4ҒvC>i$a^xP‡@1Q@0 ңiIU_/UU4dV^3s±ÙS7DDvyȖBʖ@%*la(L )*p >e-1ȄgWs $  E 6gfY*2^/\ʑ!ޞƨIJӨүW[h[!J1;?`#m!~w psү3q |PS8U^dH P2b?J""T;<ЉPKH@Cy䉆dJ[`+@BeeP8 pJCy6vqWz9D*hDr%$$L5K"UHL$)үS7W>wY3wUE mgd Tǚ!J5KJQM9n pFf) WzkzFx;ford!,|PS>}WDq2B;gLY^S$s^s;grg ₙw#izogLY#Y+.qCG  IDFUdJ!41YfX Z31MHR3JfbO4X Z31ByG*bљ͞jf l/. )=RљjBkzFx;2Nԅ+) @YKE)E$F jB]pƸU󮴔C90C^S$s$HRNL|PS2NfS<#ť* T;yɀl7B)/,LhkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵk?P!egpX g^wC9)'hM{?%H (LgYܑ2 D bH ,LBK ,&Qgnt !e%%#I*Xũ;F}Waүg HYg%$nQe !j9hBnĤ p)*s!ǕLywKM&?ݕ]$gYܘa!2ֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵgua(3PS85a2" L88/V͜g?_ϝ4JK^ΙF #JTU3qg0f <(hC HʠLiQ;ZKLzJs?U4dV^OzJ@ D-H5Ҽ+8𡣅$"bO*a2AGҒ)8JI s?ԑk7xVqCG  IDFUdJ!%U|SV^BITђYzs±ðH'y<@@-P(PClg ₙFIkȑΌTPTU3qgfY*2^/\ʑ!ޞ!(ԁ|PS>v^wC()-y9ђv*CQVşghzp~ *D;zz#WGJ=xf)Zhe1tgKgfY*2^/\ʑ!ޞU=үAiџ$a^ <(hC HʠLiQ3">/V͏_[" 8H_[6 8#oJVqCG  IDFUdJ!izlzOz4dAi=үs?ԑk7x+8𡣅$"bO*a2AG4[6v^wC()-y9ђv1jFIkȑzn,nufc^rW*'|^F/V8%zL$Z P=% JhzsITgѹ^±ðH'y<@ర2g#r#:BQ"zJ՟H5ҼxP‡@1Q@0 ңgD|^aǚD{DbHJ&3yB!(%yڲwxbm*Wh-ΉT&^"ЈJUDzJAOITђYzs#c`O;yaae6GΉU!(2N$s">/V⢬?Ff(DHzUţ36y Y0m/ gүW["G8XY#QVşzUŢ#iJRRD` IEմLNK@$&'%6gx39F^ NQ#oJVqCG  IDFUdJ!izl{Ҭ-aǚD{Ҭ-a3IFzW 8PH&*4$Tq Hճcޕ`1h( Ï4X Z)J)"0`0L+a4BT9II)*%(0c8L9+;yWs  (K\QH`5%(0`yGڐ1e-0l. V灡L|}R5g#ޕ`1h('8-qE!`O' 00dB0IN?^0g"a#Y+YDž (xy$ yT *8yGٱJRRD`aǚD{Ҭ-0lq/h`` ?Њ|NdhkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkY$"k?ۂ&H?f p2NkpQfVKj;2NUk?۠ ,L 4<2B(,AgrD T?Hͤ/NSIՐʦn{Ҭ/}/{?ť*1k?۔@0@;&$@gY4,^TA0e*A|ޭB o뢬tR/_+!8teS&ՀŜ:RSNJ)9)!gAjD $T6(VIk9s9s9s9s9s9s92^od;Z"cz'$s9s9s9s9s9s9s3AM4X Z31C~**}뢬B!dÐDDj$o]dH $"$P"L @iUFvW mёrB6lᛡب3q`  BSzU1L/|wX _'}L3)ڐ1e/kՐŧC>v^wC9ђv*CBIEY [?4n|r9& 3n,7>idH(}lDq2B;">}lDq"eBEYS7>ȫ$B 0 m ₞yGүȑ& @TU3qg#Y,NȞhD,Xr @y"d6g0fg4p$LTiP &H4fҲYdyGҲYds?s9s9s9s9s9s9sC+Y-w6s9s9s9s9s9s9s3">ȫ$4"H,9DI<2HEYS70iyGF.toತG󷧁nP"#l0Xx .t™sex+Jno1 ƺN!6oL^^SV'3n}%fr4bgYѹ `c3n,gyO19E)E$F grgiQ$DJg*`8If Aȕ@ kޕ`1zRK\ !=[VIdB83%S"pJMfQ1x ^/\U3ѹ^±ÙS7DDvyȖB Aȕ@XB (C Z}e*bƸCGӄz)vȄqgѼȑ4P0y0o;yDE mŮyNNXE{gx39F^1g dЉJ@ۘ QzV1IyGټ B DHd*;64"%CD$@y䉆dJ[ak%LbR8^ҷ>1%t2N`@(pGVI3">/V͝yGҲYd9* (`oJn2N">/V$Hd B DHd*;6s?ԑk7xVqCG  IDFUdJ!`IzޒU3zJ@ g"x$a^xP‡@1Q@0 ң%%U|Su^qHs°H'>i`9.8vܱQSҒ)8@ :O/_8&S7ҢB%C7;N'oLgNQC""DE m-H& y FI4gx18&ۡΥd1kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֳnH,E*՟gpX g|Hszv8D(3}*VIH &K@P!  "e*A& H;UyՒv;Noy~2S7$'|*´f;LJx)HszJ/J\ |1k?۔@0@;&$@gY4,^TA0e*A|ޭB o뢬t#gz|Wz^*/1gΑrB6s?VCp<( Mu8u ƧΜR0s?RBP?)'h՟gr(H l#QoP0x,,<@Ls `Tť*=*IJVj@aF gă"Bnm>KB&,@JtP(POwX+i^IIŔ(<ݕ]$gYܘa!2ֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵgua(\?3P(*"Ã#f OKs?3 @ DDjdH EpH'p9K8ekt9DEQ]%SFKeDQ^VItTUvDQ^KeD㙂*2뤥+5LMU'#Y+.qCG  IDFUdJ!VI*+A=뢬'DzZ*;6#oJ xP‡@1Q@0 ңvNS>VI|PS>VIDyAa""L5 7n,k9s9s9s9s9s9s92-)W$<#l_ >wJug\9s9s9s9s9s9s9D|ZRrU{)JS@DO4n|r9& `O;|gx3s9s9s9s9s9s9sC*3Jگz<|뤥+5LMoes9s9s9s9s9s9sL+a"ЈJM%)Ybh_7G (=%'C(|8L+5LMU'>KeEKNx69|PS8fJvzUŝn, *$PB%C, <<,y"a"Y.VaJ/J_ՔHi)JS@gԉ3%S"pJH"JuM%)Ybh9II)*%=%S9/9+93qgiQ$DJg*`8I(o<0,T `a(L )iJuQzVM+5LMI @dB8Hճg3i<@ర2gx3g?ԑk7x+8𡣅$"bO*a2AG4[6>ȫ$0">ȫ$0ALHd*;7#hD,Xr @y"d7O;yɀlg ₛEY'x<`z$"G<ЈY &d o3ϰ=tUw#hD,Xr @y"d *PLHxx?>VIDyAa""L5C$X g<`z$"G<ЈY &EYS7()iEY'f$s Aa$"H,9x?fU*;"yAa""L5begyGҲYdȑ4"H,9DI<, Ix?fU*;"yAa""L5!d ԁ|PS<#Y,NH $"$P"L @**|ꊲNȞhD,Xr @xXbf^ )l_:'*;|L_`z$3sm uůZ@ۘ Ւv9$a^ <(hC HʠLiQ3">/V͏_: Ï5JuEY'f()9TUwn,D}*)n`/>|ꊲN4`#3,H|Ȍ\ DeHoO@ܡLDGa+ f'oϩQ஦n=*ש pՒvG %=u}obr93s-#6(3)?ƍ(S+93qg\9s9s9s9s9s9s9!/]V(5pMW(5Ւvs9s9s9s9s9s9s^S pyG*bJQITIJ"X@xy YDPD%P-&VXDҔR^whq N)4ƺNǃ" gnj9*Wh->c20s?RU>KezJs?_7< r8V8s?fҢH4"T9p(Py"a"Y+@Be`KO]wX ^C`@(pMW(5Ւv<c?<`7Y9& `O4h`XXxD ҽ/) Ҕkl/(?gx3菝tdJwU{t""ԫQg?ֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵk?ے @JuDJ@ۘ gY&H0y2DS7ϱu_'zv8D"LJuՒv=gtReɒ$&HEE3nHd gYܢ 1$ &H?e (R on:gՒwz|Wz3oaI =B o䤝V XL"1G3@ర2nsU"c$&?UJFɉ,AkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZ^)VJuDJ@ۘ 3PS85a2" L88.5|^b礥*biWx;4[7aS8Y s9s9s9s9s9s9sҢH4"T9p&%*lp|Ĥ p%n}.cJi`9+s@P?S7ҢB%C7;N'oLgNQC""DE m-H& Ws?Њ|RQ6Ǝ9=kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZCHͤ. ҷ4isWDfcgY&H0y2D B 3zJ/J\ |"cz2Ndzn @0Ly2ZH,R k?۔@0@;&$@gY4,^TA0e*A|ޭB k?RBP?D $T? kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵk?˯ GHͤ. ҷ4isWDfc1ₙǁ Aa䃎ȑ3NEpH'p9ₙdž ""L5$snb$ekITȜs?2zHs?2ү808∆Hcs[iWIITȜzJizo|Dԉlagx _["xH̳V^?x4_p/!Zpsaupg ₙү#HAQVşH5Ҽ+8𡣅$"bO*a2AG^A+޺5D(w4[6s?J[?ԑk7xVqCG  IDFUdJ!(+ssWM9c/VS7ү>}lDDvyȖB7HjD\ $H8ϥb ^ޜ2N }8GWQ Fqf>}l?Њ|$fFIE[4A+3^1L v͞kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵk?P!fEM e8P]gpX g^}o̧ 1qMYu3y)'c@ &X<-@hyBdP$X?䉖@ L @@Y`d3nX/*Xaa2 >oVs0 XL"``#ݕ]$gaae݂(ȅ3+].REBuH3+].NFSZueN+ A:8ek2(.L3+].JDK0`0Q]*DL HD)Tek(.Hs?2/2(.TAtV|&]u!J/ ӡJ/JdN ^ Z IE[JTZIXb hzH4O0$9H[ѹK(<7wUEpCCQ@Be |4SNOiq*2^/S/  -8Fa#Y+³ 8PH&*4$Tq HR2zp9GHճ|)C/pXb 0^SӅG<#̧ `!91Lɧ`$I‚j iIxԈ\ NbGeOITђYzD-|hs LgLYTIJ"X@z $L5K"UXB (CGӔx; GӅ8ʻJH )cTNg ₙSѥ_[ȑzUŝn,ITȜ**FKn+Sыճ *2^/\U34/4yɀxGiQ$DJg*`8I(o<0,T ` B (CŔ^eK }2򞑛H^1JU$^Ş B2NQ(Yjwケ 4<4 N;8Hճg3TIJ"X@z $L5K"UaJ[}Ʒ=L)‚yO >ǚD|^9Ws  (9s9s9s9s9s9s9s3aH_3y}ib yyOPY ?iT*wNS*gp>¼)i3qVPgt+aS=rҏ1lk9s9s9s9s9s9s9sq2h  ȑqSXb TU3qg 4"%CD$ 7HjDIEվQ(g(.vq挧 -)U8P] (.*l(?u^q4P0x,,<@LRJUN"xH̳"/VyGN6s?dNR `mrF GeOITђYzD-ѹK(<74"%CD$ 7HjDa(L 1񌫗S)T`e8P_x; 2!ǚD|^98(< &Ql/3rF "e8P\m#2ITђYzEKNx(@4:RHKJQaLQaU0A|Stp?3oOtpQDzJNQITM/Uq*DO9JRI "xH̳U4dV^?x4_58Fl sk 0c^$%A%u( gJD(|*Dp)86s?RU=%SFKezJs?REB}c gCA~gyONH2(.mɟ*]RK@B%CZJv0zpDzJNQITM/Uq*DOe8P]@)*2^/V#oJ†<@<<C2(.C=8P_NFUzNFNF6#oJ†<@<<C-*LpH;!izo>Dp4g1gKpH̗Qs)T`4x?J""T;<ЉPKH@Cy䉆dJ[P+@Be`8P_MK:|zrF fS@_YTʦnyAph`XXxD Ws LgO|B)1sqL wkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵk?P!ť*n $X<" o,ZR:2N) g~2S7$'`K?k\,-)T ,ZR>n=(e[?k\(1ϥ->|ޭXJR駾=Ƴm>Fn0^-v-)W8Fi}y* Vi(묛} Lyf *dfk(9zS1+Wwd fs|yo@JpZ>^<@H,;)2hC$""$LH3=E.} u|^bd:W~7ic(a05vLIeɒ hY`ba T?[΄D:\ #KP>1%`PV}W0VQ]ֹI-#6{࠮Q^PfHwzYRKJJzYQ^}l:^)4|՟ZuWΨ$Y'}eWκJRT*tزՄDز9-XJ9yOJJ<# YRFޕ8𡣅$"bO*a2AGЍnv;s?()xj`r"$P;"G8fv*+A:v,da(93/ gDzI@}a(ȑ4Hj aeɒ L0,@1NyGҲYdr9B 0&Ix?f?G >:O/J(,GRI=N2NCJK 3z,Md[e/9+R?u,[QVQQ b-e;fشV?`#s-#x?>b8H5Ҽ4p$LTiP &H4ZuҒ0&oH2*-VQQI">/V͜#oJ xP‡@1Q@0 ңe+ҨRQ4[7œ 3"KeD M/UAg F,E o93qgiQ$DJg*`8I$,#y䉆dJ[PHYBA䃈a]Dʸ5+ҨRҒ:,Md[ԑr'd0 }34[6s? _7>idH(<7GCp1>n:S+Wwgqg.*_;M/ LzȑX?m!}54Ϭ&L# x)|#:"cQ]a _ 'oLg3q.7if3<# ƳgYbvtҷ3TaT&L# S "'lRFޕYDž (xy$ yT *8RUW>wUiI;!4c?_7>i`9+93qcGJz|ꊲNzYt^oIE[K3S/|tKf\ |x1şҒw`e^vnw)p+WwgEkzw:O(+ssWM25DJuEY'dO4"H,9DI<,L3lgxf;L $]Ƴ-7G>|ꊲNQVŌ1;[pu띄Jҡ7TaV6UV aZYH[?ԑk7xVqCG  IDFUdJ UOyƚRNg#VdN=rQ E+ &t "ҷ0!X]RQY7TUwF0/IUPbk&J,Md[t# pc? 0zJ Y7Pbk&ۡVsgfY L# DO#Y+³ 8PH&*4$Tq|4ҒvC>idNTc 0^-Jҡ7TaV9H5Ҽ+8𡣅$"bO*a2AGuoITy*ITђYzKeD M/UA*d8^ /C2K 3z,Md[e%yU1[Ԭ#J9JdNIl$a 2X%&oMH*#J>a&^MXɾ=I9H5Ҽ+8𡣅$"bO*a2AGuoITy*ITђYzKeD M/UAg F,E o93qgiQ$DJg*`8I$,#y䉆dJ[PHYBA䃈a]DʺRXg@cԑŞ[Q7XFFrF 3K׬)v%FrF 3ITȜ**FKn+Q4g)T`&Sg0f <(hC HʠLiQ,i/[U2zJs?U4dV^OzJ@ D-H5Ҽ+8𡣅$"bO*a2AGJJM)'d3RFޕYDž (xy$ yT *8UOYz=%SFKesѹK"G<@ర2gLYTIJ"X@x (Hy"a"YPy dQ>2.]J430cx;!yGٳ^ g^ /lk9s9s9s9s9s9s92qf$$ vYj/1}Lޒҷ>.5g W.||뼽n|ZRs9s9s9s9s9s9s3">ȫ$DyAa""L5$ ⢬?WΨ$B 0&m-TUvDB!dÐDDjB gx3 3|d& @ .Yg ₛJuEY'x?f 3i /=Ƴ_CQzVaS<^^ PPW l'oLg3qf|)\n-)}mƳjf+a4BT*lU` 6u 3s#c3n CO|{f3`zuS7R aZ[/,{?0 B!*Rx`zS 4nx#c~Yz?fAf3I V#R aZX k(G&AhD&j¯_)LWQL S?/9+94"%CD$ 7 ,LH4,DPVBoYsd1x >ƳJ7TaVK_AȄ:ޚx >Ƴ,&L# x)|vC<c?GYz2N/;i8̗|y*שĤ p%n}.cJ 1@#k0gc?ΰ=s5'clx`qDCCzU'yf$F2!dÐ"}*d` ^ /?9s9s9s9s9s9s9s?e,ZRS7 g\9s9s9s9s9s9s9 *$PB%C, <<,y"a"Y)bҕad@(<">/V͜$a^xP‡@1Q@0 ңe,ZR"cHճcgJD 3 ^ ";s?RU>KezJs?ܱSY 'Uůum>QԒOS\^v-)Vg FxG /P5יּشP'IIΓW1u?fҢH4"T9p(Py"a"YʼZR'x ><#ly<@ర2gKg KI+}`Juf|شQk`?K\v-zЉ)cǏgY^Sƍj ܗ_ ~v;Uk$8s?ӓ?nܐ+p4pyf u 3h/"G  Zvv8F<֜NNN >?Ӕm/|##c?S7DDvyȖB Aȕ@ !e ! |-e;$GӅ92e/^dB8Hճgg-9H5Ҽ+8𡣅$"bO*a2AGm>Kwizo5RǜWs $H9 &P?H5Ҽ+8𡣅$"bO*a2AG|x$<#l_ >o'kRt2e,xk?xѼW9[~va@|#jݭsgrgtUץ):E%SLzrEpk^N>ůNYGl<0,-@>D|^, `%; )@ gѹ^DA8kgsgӄki)9FѼW98V8p3qgiQ$DJg*`8I(o<0,T ` Py `z^S2N }8S#/R(D 4[6vqah*g0f <(hC HʠLiQ:[OŬ|dD|^NvYK%'C#g9*TBgx3IFzWg4p$LTiP &H4Oy3IyGټ Rt2<3AM~qA+ب?fDEjRK\(11u-{Ҭ,xk?U2'IB!*RKs~bvxЕ0hD%:, tC}wS`V8yگr9%W8€G#|#Z '.Lޤ)^EʻҬ/*i[UII)*%=%S9/9+93qgiQ$DJg*`8I$,#y䉆dJ[d@HYBA䃈ae\ץ_[" >.cJ%ozUŃ" g1gizl#oJ†<@<<C/\Zw1A+(wizo|zUŏ9-H5Ҽ+8𡣅$"bO*a2AGsWL\ Ӕx;4[7w*bǜgx3IFzWg4p$LTiP &H4dD|^bҕt]m138&ۡΝJU81kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZCII)*?2Aɒ :^JJ;$>v|dgY``d  @b k?ے&YK&t "ҷ0!X]RQ^SjʷI L @@Y`d3nX/*Xaa2 >oVsQ a!2ezKeȿS7%U|Si/XJ,oQ |Fu7u |kiE(floaI =B o䤝V XL"1G3LޔUOyJI? ҔjFL%_Ғ)kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZ*QRt2JgqjePD@ppy $sQ\ ugqaȈ @ᛡب 3Zua!2O3`^t* Ki*3IZuU4dV^N9*IT(AG3ₙzXJ&$s&"XY`d@Dd ⢸$dN<0@P9fU0#Y+³ 8PH&*4$Tq֒%S!9s9s9s9s9s9s9s9s9sC}Lޝ.`"c;ŔKe뗜fպ|(RUgZU3Օo|SԒOS3i 23zRn5]9Ҥ+)G|Jx;i)zv,/Rgo/^QԒOSޚv L:}a(0H 3W}/yڲv? yWS|y/U(ꑝM4FM.rmRYs!4ְm4|3sk9s9s9s9s9s9s9s9s9s?_P &UD ;"G8 ;PÑ&97Cب?f]p3M/UIT3%SFi< c B/RYs!>N(e-=i$,שҔiWYzALnqjePD@ppy $s<<50L9a#3t;n,p9#oJ†<@<<CJJM)'dITњG3IFzWg4p$LTiP &H4RUW>KeD M/UA&&XHLU4dV^y=%SFi3ȾrJNQITƎ9kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֳnH,EJAMgpX g@i/[ߥ%U|SIr;VU2NR(IH &K@P!  "e*A>a+a7@ B!)(+s JI 21vD bH ,LBK ,&Qgnt !,$&[S7zyf}% E !IU_˰um)!gAjD $T6Ғ)8I;gYܘa!2a!2R_өV^3zRUW6kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkY]xXJ:JAO4AL ʠ0AdH'b$ALPÑ&97CQ\ ug?2912Be gFV]tLǁG3+].h&ekITђYz8ekת#dO4[7xi#=+8D?()iI'=o"G<"a" L0,@<&HyDI@*+A:JD&IDP4[7i%S6s?#Y+³ 8PH&*4$Tq֒%S!*-ii5yV=LޤzdIU_yG$D0XoVsQ a!2ezHRu[V JI5gYܢ*Cs? HdAd$#1sҔK` AȠP2ʺЉ0WU͟ C`[WzI])e-&?eWI+&&XHL&&XHLW4f!J/Yn^i[?ֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵ.R%#611s3PS85a2" L88rq{Bo@dB8;JǚD|^98(<2Ȃɉ 6g?ۆjQ8NҬ2L+a"ЈJ'iVS9II)*%=%S9/ gxG ~|gLYTIJ"X@z $L5K"U(pPy l'iVSQNZ Ȅg'iVS98(="r! Ws LgO|B s?kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵk?P!fFf(O*b ,L6SzU=L'zO-zQU3s$gtReɒ$&HEE3nHd gxS]nf>et3w%5_XJ,o/9@] @YK$zUŁ;nyM8Qe3inQ`j옒$AgpвyR @Yz[3$,3vY(a25D0,"e&}u-(P;I񌫋^-6(<ݕ]$gYܘa!2ֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵgua(љ"⊲?3P(*"Ã#f OKs?3 @ DDjdH EpH'p9K3N9Zu$["qKi>(!"t3UEY YekITȜs?2뤪hzHw,JJzYQ^2NRg?u׌HR!O~WnwYf;QzVITȜx`qDCCpg$a^xP‡@1Q@0 ңv* LhzH4O0$9H[?ԑk7xVqCG  IDFUdJ!%U|Su^qH#oJ†<@<<CJJzH%9/44"%CD$ 7 &T,T `@BeiIU_Q;.)iD#8Lh` `j((L?$!J=%SFKeHzUţ36Uő gyObos$!J93PS>2NыռHճx J5Wtdԁ )h ǀi08xqQVş/ y$}*ټd v g<j2Nүȑ$LXب?fUő3Zvv?6ƍ|QVC#c3n, *$PB%C, <$o<0,T `ʺK+ç%!關$G -LX ^,[Ȅq`ǚD|^90OeTUŀS?6)>1QVCpp u^q4P0y@C&Y`j;yɀlgO|BIEY X1kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֳnH,E0DKJI/4gpX g 3i 3z-Ydi%'iVSgY``d  @b k?ے&Y(a05vLIeɒ hY`ba T?[΄D5YIy| UY’zI;Fo𭪊YK!Jȩ Ugr(H l#QoP0x,,<@LxŔr$Ҷ(<eWI+&&XHL HRLI/4kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZ^)Vb+jK+3PS85a2" L88vs?II)*%=%S9H[?q^/S$p}g88?fҢH4"T9p(Py"a"Y0 &Pg(Iyc%-#61h`XXxD ?ƍϚY8+93qg ₙJ$s A e-1Ȅg$a<踵+3;yaae6g{x6S|Sg#[U!J8/UDyx)t)R'8R^/SgEFk|oprcZӄkfaALIyy9ăB Rbe L0,@**/r*B"xH̳5%6p?x4_p/!f"G9٭i5ys?J[?ۘ/v^rWs%S"pJMTƻ́nEQiTK" 9HRK7wI/4C ^/\U34sD/r*B"xH̳5%6p?x4_p/!fଉf< 1D|+j)R'8HmTT*l">EHRRҢH4"T9p(Py"a"Y@ G)xyx$Ҳ >I dB8SCggizl"'(< &Ql/?J[?J""T;<ЉPKH@Cy䉆dJ[ !e !G)|+j%zIyd0 }9GBȄqkJ<#lDO4P0x,,<@L^ RFޕ†<@<<C<#lRuEHRAiꊐM9H5ҼxP‡@1Q@0 ңgD|^")R Ï49!Js?ԑk7x+8𡣅$"bO*a2AG4[6>QRaǚD|+j)S`Îg9IE>E]QmZ"^rUIycGkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZ bDхmZ#Y#үQFbd $A ^ 'B_/.^_\ůiW#JE֜PS0)];Z(3{ԝ1^^ ].?ΐh=gtReɒ$&HEE3nHd gYܢ 1$ &H?e (R on:gԅ+ȾuүQF0RNѫ?,&PRF`XXxD7w9x63K)/wYp*gɀvUtQgrbegGHoJ5|#NoR"-Z&?ֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵ.R%Yx(0Dk$aU)gqjePD@ppy $sQ\ ugqaȈ @ᛡب 3ZuV^N9ZuU2't4h`` ?Q]I$N"qK"&DQ\.R'tTgFV]q"C"qKV8ek,28ek %8-XJ$N9ZuD$Dt/qgFV]u-j8ekׁxQ֢50*"qK"ŭDk$gp*"qKy"qgFV]uZ$2't,*I!{Lekp_lKGZekgFV]yږYgFV]u_dN9ZuDQ]pүQKOGF.tDQ]pүQKOopFvDQ]pүQKOUn/WԷ8"_3+].^^83H5Ҽ4p$LTiP &H4%$DхmZ#Y#үQK9|PSts">EHRQVş菁xQ֡FeyGȩ T}~<g"a#Y+YDž (xy$ yT *8yGٱ/r*oR"x)t4S|S s9s9s9s9s9s9sׄiWK8%zL$Z R, 9II)*%=%S9/9+93qgiQ$DJg*`8I(o<0,T `0 &P |1uKR(vCGc?<#ly<@ర2gx3g%;0RYR';oR"x)t;yOJJ s9s9s9s9s9s9s=,-4T*DHz) M!J#"=,-4T*o6y\]MPS84SK|S1/V͝yȨԱPP\]EMDE mJ5Wڐ/j\ DDy!(gLYjvo<oEYS7s9s9s9s9s9s9s9sC |c**K}/<.Rk"#WR-ACpRu6s9s9s9s9s9s9s9s?J""T;<ЉPKH@Cy䉆dJ[@ .R >)I -(vC үQNo/.]Ow|#ږY Dc?<. ].<.l">/V͝yȨԱPP\]EMDE mJ5Wڐ/皝oȑ5gj[fÙS7hPEW5)YgUn/Vo;t+?jF+7iW5)YTU3qg ₙǚK9Ҡ4PTU3qg\9s9s9s9s9s9s9s9s9s9sCBsny./)녇ɾœe^[O^%=u}ms9s9s9s9s9s9s9s9s9s9g?J""T;<ЉPKH@Cy䉆dJ[@Vɾ+W-)]dXDFc%$`gR-JlDO4P0x,,<@LXE{gx3sA_f$s*F+7A9栉xy )Fgx3t,<"!$6()zr9Gb?YdTB[<.QR'G4Q$Hi*EI$/i)RyG4Q$M4 K?9s9s9s9s9s9s9s9g -4Ru.oR"-Z&?9s9s9s9s9s9s9s9Dz,d&"=EFEu}li,5+fgK?9s9s9s9s9s9s9s9g ש|^a[ud=,%o%s9s9s9s9s9s9s9s()jv*,5x.X)tȑSQeŇtJKTDpب UyEY'dO4"H,9DI<1A()i/1h$DyAa""L5 7NXE{gyȨj%b*o"G8; /1h$B 0@cl4_Uvo"G<ЈY &,o )FALnq)t#ҷ1A\ζvǂvDrJ/J.5b$=W-d<ЈY &D"T`5lNQ#oJVqCG  IDFUdJ!izl{YHZh T0"=,-4T*lqRFޕ†<@<<C<#l H^EHRAiiU$M9H5ҼxP‡@1Q@0 ңgD|^үQDTB*B" 8HiW*I!{M!Js?ԑk7x+8𡣅$"bO*a2AG4[6=W-dyGŢ`Îg?_7>i`9EÙS74^ g?9s9s9s9s9s9s9s9!DHRI!xDe>^e]Vyx$"c]Gs9s9s9s9s9s9s9s7G<#U(H^EHRx?ts">v-*RTU3qgJD0 B!6|!DzJNQIT/Uq*|h/X?J""T;<ЉPKH@Cy䉆dJ[ P20[१Yyԅ+^$4T*ogLY^Sӄs">^$4T*mɟ菁xRI &z(2DHxRI &z(2@49$"a&gQeRI cx(yz gr/r*I!xD/YeH63,HxRI &z(2oaȄ`x0o`W^_]IH^1`FzZ{*}a(EGZHU(D񶑙gi/r*I!xD/YeMD|  0dB0}%:xLx@2!F9nH_}jbҕw>^oW-dI)M8Dƒ,/)/wD| H^0YAlNLITȜ&AhD&1=n=/qDzJNQIT/Uq*|h/X?J""T;<ЉPKH@Cy䉆dJ[@BebqxY^;`@(e%H`@}" gg;ZTe14h`XXxD )FgZRFe|hx+"G8a2e +"G8(iKNx3bҕr$snb?NȞhD,Xr @yBb䃍Zvv?Ӕm/4yɀx?u^qϚL/?ԑk7x+8𡣅$"bO*a2AG4[6>EI$/E,aǚD| H^0YA`Îg?9s9s9s9s9s9s9s?`bQ>oR"yxe4Q7>^oUyEY'| bҕxS;Ms9s9s9s9s9s9s37]GZe;oxQ֦,xʼ#ȨkQڲ|IU)iEGZH4Pm#2<#^TxdY YHxQ֡YF F)7r?dB0 s?۽4<N_^dU)iEGZH4Pm#2< iWP/r*Kevx4_<#$Ð vii5`w/9 B ^vW̿k\/ gD|Q;+Hs2d\ȑΌEYS7ΉUB mёrB6D񶑙g%;'kn D(TD pIbƍ$ppş菝3'tEinf^R' ` #Y+YDž (xy$ yT *8yGٱUFvW mёrB6Dq:%Tg`5xN̽.#fgx3`#s9s9s9s9s9s9s9s9s!3xx,<ti0_")]X3])FX!Lf ӗW%e#:H],$]h=|z}tKf^0^ iJ5|#qjVpl)_S7%U|SԢ-zH].6 )|i`?o}L `e\Z]Lޤ)^E;Fz09s9s9s9s9s9s9s9s9lbD񶑙gbZxEIJ6` s6Hͤ/=!wU)i%S"pJH"Ym5DzB1t9II)*%=%S9_SJJ|aN*s1zWN\e^^L˜yxѹ^DGZOi|   vii5-j^i^Dy1 в"T@7n,n^5y$Ҷ=udj`33h/(<7A<9 @?g\9s9s9s9s91/x$"c`2ҫ?9s9s9s9s9|PSts">v-*RTU3qgyO/N4 H^EHR9$"a DHxRI &JHxRI &JgQeRI cx(yz gr/r*HxQ֢53d1f8%zL&ЈMb{0{3^ ^/\U3ѹ^±ÙS7DDvyȖB Aȕ@Be/\<wWJQJ(D x>v c'3i<@ర2gRaشR'8/U=| VDqDdA9VDqD&Qf#\69/ gť*H EYS7>v-*NȞhD,Xr @yBb䃍Zvv?aH_|P jZ@ۙ-|R/ gD|Q;+Hs2d\ȑΌEYS7ΉUB mёrB6D񶑙g%;'kn D(TD pIbƍ$ppş菝3'tEinf^R' ` #Y+YDž (xy$ yT *8yGٱUFvW mёrB6Dq:%Tg`5xN̽.#fgx39FܔW{>7iy(3#!)(FRFޕ†<@<<C<#l9$"a Dq"L#;M9H5ҼxP‡@1Q@0 ңgD|^"ŭDk$gjbȃ<#^TxdY Ya3IFzW 8PH&*4$Tq Hճc`2Ҫ*/1h$0">v-*N̓9y>i3ȾpQ4a[VH4PhkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkY$" Y/*k?ۂ&H?ZI'=Y/^i_(I' UY@ &X<-@hyBdP$X?䉖@ L @@Y`d3nX/*Xaa2 >oVsQ 8OS7$'iVSץZ^5f$Ҷ0RNѨ֕!YLegr(H l#QoP0x,,<@L<f ^aLH0URIEYS7dN ^ "*rϝ*BDzJNQIT/Uq*|h/X?J""T;<ЉPKH@Cy䉆dJ[ &P')}e,4J`@(e%z\.d0 >3N֕!YLdǚD|`*98(< &Ql/>0URI0URIs?I'^wI/4yڲHVSgJD0 B!1) wKzI'?QeVDҤ+)GeOYzƍ4"%CD$ 7HjD( P218YK-)$[Ydi%敐QJ\`@}" gǚ*Bɳ4TU}+s6s?u^q4P0x,,<@L^ N"pMUX$SHVS6*nfg?ۥ;}oԒOSN)zv c,ITȝOKezJs?_7< r8V8s?fҢH4"T9p(Py"a"Y( P218YK-)zpYLgGӔx;!Q @1i8LǚD|^9H @?J[?ԑk7xVqCG  IDFUdJ!;}m=8NҬ3i8L(vC<#l/^5kJ3;$ӄ*c,ITȜ&AhD%Y/D|`* yG ;*I#y擄͜GeOYzƍ4"%CD$ 7HjD( (PB^,uYIyd0 }2.c2AȄqkJ2l">0U_J͜Ws  (?ԑk7xVqCG  IDFUdJ!%[OQeVC0U_J'd3">/V͜4onS_9Y/*GkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZ k%TcQџgpX gVKƻS7;sRI>tJ@ &X<-@hyBdP$X?䉖@ L @@Y`d3nX/*Xaa2 >oVs0RNѨ֕!YLegr(H l#QoP0x,,<@L6(<eWI+&&XHLkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkY]xXJ:xTgt3PS85a2" L880U_J%; )@ |n81+a4BW^5RI=DS3)x1p=%'C(|8L4nxppşD*hDr%$PDPD%P-@ P218YK-udkK+!關s(D 5;ZTe1ggi񂨪Vl"'(< &Ql)lRFޕYDž (xy$ yT *8U񭧨K+!jv c&.c2*nfGfgx3ӷ=E$|`;VL+a4BcRRE${K+"|iRNg#Rt2JzsITg FxG gLYTIJ"X@z $L5K"UL! !_YiRI>K+!關s(D 5;ZTe1ggi񂨪Vl"'(< &Ql)lRFޕYDž (xy$ yT *8)$[OQeVC0U_J'd3">/V͜g?u^qϚL7B)/^5F0U9kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZCPY ;,La`d3\j3|ZRүt^A+^>rQAg/=L'lk?۠ ,L 4<2B(,AgrD T? &Pɉ P,y2D ,,PL0D g7uЃ?RBP?,&PRF`XXxD7w9loP0y0ʮWJ3nLLbZR:2NϜPY kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZ*Q%zBť*` PS85a2" L88v-)W9*T=fT"'l7>i`9EðH'y>iC\9s9s9s9s9s9s9!mW =AwJuR&]7ڲ?9s9s9s9s9s9s9giQ$DJg*`8If Aȕ@p|QzVMCIJVjG C?V^N9*WEU&i)JS@DzJNQIT/Uq*|h/X?J""T;<ЉPKH@Cy䉆dJ[@Be`KOU󮒋ҷ=W.zoe%)Ybh2N`@(" gǚD|^9H @?)#oJVqCG  IDFUdJ!izl}+%VIaǚD}+%VIٰa3ₙJdUvo"G<ЈY &D o wUE7Nx?>VIDyAa""L5@ g<`z$"G<ЈY &D"T`5x1~}뢬B!dÐDDjʇ Hx?>VIDyAa""L5 7n,|PS<#Y,NH $"$P&HD,XrQVşTUvDB!dÐDDj6RALHd*;7#hD,Xr @y0X,@<QVşTUvDB!dÐDDjB gyGҲYdȑ4"H,9DI/V͏d*;" 8Hd*;6 8d,D"4SucnE;/9+֕!YLegtReɒ$&HEE3nHd gYܢ 1$ &H?e (R on:g%HVSjQz’zI;FoHVSgYܢ*Cs?  (9M&?UJFɉ,CR"-%敳kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZ*QU(ӱX74AL ʠ0AdH'b$ALPÑ&97CQ\ ug?2֕x(ekגYz8ekq䤪x63[ϬFzj,4JITȜs?2"t#43+]. DQ]I$N"qK"&DQ]sU)Q)%U|S;U(%y9(s?2t#JEŗj^^SRRSD'kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵk?۹k,.|)I5i5ҭ9O]d[S:;.Ԯ D{?c0]G|qkץaS=Lum8<{?۸WYi)ts)0iJ)\֜]*.).^kYp+;~X)Q7r=eOQgwZ.>)^ _AVզ 3snwœ#E˗PעJN]LүQGaNKV`闂fi>(/9kaQ_E} t}nLzӐao޴WY ŏg%*S/ 𦴩H )}e8ץw> S❧=LGyx)}i[Vk1<#JEXJ#Ԥʷ#uϟ qwY*'β)i+d׋ w@ fr<kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵk?#Y+.qCG  IDFUdJ!RNѯүQDVB3ₛҦ*+Af$U`Xɾ Y7ǩ#x)yyOVS;"g?_ϤW#hLH4,&&P1M⢬?U2'M\hx)g3):E%SV^Ǥg3s#c3n, *$PB%C, = &%*l.B$C Z}ej]o//GӔx;!Q @1-/,">/V͜gxD| d#JE ⢬?9s9s9s9s9gr^o|e/xNfS=eLxSe;Ms9s9s9s9sȧ 8ҡgudk Iyl|PS>^i^Dy1 в"T@7n,Dz^5F0U5$E8MFxG<@Ap u^q4P0x,,<@L"&D)$)fmS Ydgx3D*hDr%$$L5K"UүQHD^N!`Y'|I Aǃ" gǚD|^9H& #i/r50*6L+a4BmSy^S̈́nX=%'C(|8L9+;yDE on-teut+?Ӕm/4$s LgLYTIJ"X@xy YDPD%P-]$Ӵ˄iWb t2N`@(D 4[6s?J[?J""T;<ЉPKH!e $L5K"UB$C Z}e4SZv1 r'd0 }" gǚD|^9D*hDr%$&%*l.R˩F0/IUPbk&J,Md[e=YN C?n^5y$Ҷ()I/4"G<ИhYd*LLbEYS7=udj`33h/(<7A<ȑ4P0y0o;yDE mg?u^qϚL7B)/үQDVBGkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZCiW/YeY ,LүQMEJHVSgY``d  @b k?ے&Y(a05vLIeɒ hY`ba T?[΄D:Iy|iRqZ^0RNѫ?iRq/U赥3nQe !j9 CwsLKU)Kה9&?UJFɉ,AkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZ^)VүQD^ ()x@0T&H800dTWz]w()xj`r"$P;"G8fv*+A=.gFV]yҡt^/R't*gFV]wCDO4P0y0mZuԒOQ2't/r)dN9Zu^'t3UO¦u7uүQMEF^iY*gFV]w΄iW]GULiWȗQ(D@әQ]sU(,SR*Ţ%॑83IFzW\†<@<<CB5䤝^^e9kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZsYH]9FOVS/PkzӒkZrɾAc0 u3zv]]VaL1ׯKO¦zey޲ zRUXWI5i5ҮɾLxFzZc?I->U)zRUXT f˨׬}`PgiW9OJJ tZҬ-A%"w9&U)묛te;`5xRr/ZҁxZ}$^$JI->jbOJ$^aL1zW =Eyڲr;ik\S֜3}^I5ouc8ʸԂx4^ L3{yu`{?ےlX)Q7Io^UOQAeR#\i&5Mi.5oVӃf-i@-=u}o8ʺӺ\j=S.i=z]:6 W]d[,ZFzZyyO~b]@iS7;;]Je/\i&5Me>oռ]yGU(Qմn]etӹS_8&)(s"cZrMtL"cFzi}e4 BAc0]G޲B* < =G=[UjӬ,#9x)}i[V4 p.^ B^=+-9u3|#JEXJ#9-XJ=|S^ _AVզ,Z|qG)}zW)}ҰUu2NCNņz/PkzӒk]g.=}L+šҥ ,`/^0(e/Nҽ5^%.< 3{V]GNZP/ L g-iA(3*|DƔOrϊv3}mZi8D*}a(g R*S/e[K3Jڴ|c*9g;L{?۸ 1;u;vI5H%q1;n5^S"wX*™uc9EAaA< f?.gwet*(Ox. ].}L™uc/9+XWWTU)No/.]#2|S*3yx)tөUH)z)`O̗3)RC[rNj>|)U޽d:˨ Np '^,3e޺pl*fKש ˨ֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵg\9s9s9s9s9s9s9!:W!ԒB<ܣizms9s9s9s9s9s9s3AM49$"a&QVş>HxRI &z(2mɟD*hDr%$$L5K"UL !D^ >I i`9EðH'y>i3s9s9s9s9s9s9s3 묛t2N">/Vͳs9s9s9s9s9s9s nkJ B'֕!YLe/ nyGHoEYS7()I/4"G<ИhYd*LLbEYS7E4KK"pMUX$SHVS6*nfNjE3:]#9MRg ^/\U3^SKHQe]d[6L֑g< Ţ%ड़GeOYz7< r8V8s?fDE mD*hDr%$PDPD%P- (PB-R-)xMKK2N`@(D 4[6s?J""T;<ЉPKH@Cy䉆dJ[` >f$U`Xɾ Y7ǩ#x)yyOVS;"gr%S"pJMTƻ+#JED1B'4QdK%kU ƗB#7MYdi%救^"]GkJ#Y"ɾlȧ 8ҡ/iQ$DJg*`8If Aȕ@` Yea&9G >ǏD#8Hճg3g ^/\U3ѹ^±ÙS7DDvyȖB Aȕ@` P20[१[YAu}nI AȄqfgiQ$DJg*`8I(o<0,T ` p^]L0zJ Y7Pbk&$c///)wu|dB'RI &0]7ڲnwYyN86ʼ䢂H]f[X~VX ^Է_9ch`XXxD TIJ"X@xy YDPD%P-aWI+>޲ 묛t2N`@(D 4[6s?}$ҼBbAeD12$"ogLY:jE4KK9II)*%=%S9.4nxppşD*hDr%$PDPD%P- HYBA䃈`KOK@(r'd0 >3Ţ%ढ़yGٳ^ /?9s9s9s9s9s9s9s?a^yxIyGٶs9s9s9s9s9s9s7G<#^k$aU(ogLYs9s9s9s9s9s9Y7fR9< fަoY3X4;:VSs9s9s9s9s9s9g?^SȜ|iP/ gK+ȑ4&$YJ(A&QVşVKƨ ;z h/(<7A<9 @?^SȜy$E8LMba+,/i<@ADDvyȖHo<0,T `X@|iW"c/uӔx;!I dB8P/q4[6s?63%H ,%I @y x?fGQFwF9+sDyɀx$"'(< &Ql/?u^qϚLgO|Fz"PdhkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkY$"v-*n $X<" o,ZUU)i{YHZz-=L'{S/޴S6;ZTe1k?۠ ,L 4<2B(,AgrD T? &Pɉ P,y2D ,,PL0D g7uЃ?(I/4*B6KV JI5g*B6ʽ^ XL"1G3@ర2nsi)|ZULe| %t? kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵk?˯ GJ gP &UD ;"G8 ; ] g&0ȑOKs?Q^vDG3+].ԉ3+].%%U|Sgn}e4SQeVwJDQ] LgFV]x83H5Ҽ4p$LTiP &H4%$iTkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkY)`2ҭ7E(E |]d[S/ޒƪ Ye!i׌%UkiI/Pkz& siVU3s"w9&UeF;ZƼ¸ڙ}xP fT/PkzӒkZu2^1}LE(E |ZrMt ^lv),Z i2<Ɠ^->g`2Ү%_X$ӵ)kE |]d[d)E8S=H'aS=L;r<5=c.v/ E | f˨׬}`Pg!)iVv;iȿS7kJiz_;X1Q8S=H'LuiTS7Q)Ve™ucz%_X$]E);.Ζ"c]d[֝^Qfm8?~o֔ Y7S;ƣ2<Ɠץө`ۥuMůiW 1qK g3sUԬR.Ζ"c]d[^Sf=[Kהz^%[NUZwJ];:ox5"bRW8&5$J˾ B&:˄iW\#Jj+t3 ey,.Yaa+S}nc+.V:˰rϊ{3fiL者r.5ҾӗS74Q=SՄ9g:emZbϥ:Kw|xg{H+_[S/޴1*^UOQAeR'}8WuůӲ]J863%ykZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZxNjb$"cx>.v->HxQ֢53d1fTIJ"X@xy YDPD%P-@VRՐ"c/q NQ$G9II)*%=%S96()9R*B7n, *$PB%C, <<,y"a"Y -*&7Mr'd0 } FqfgJD0 B!0*[tnyGeMGeOYzƍ$ppşD*hDr%$$L5K"U *I]i;uMr'd0 }" gǚD|^9-D*hDr%$PDPD%P-@! !->`2ҮɾNQ$dB8Hճg34"%CD$ 7HjDAK/s.o |L%V @a(5}lz1e;Ӻ Px2! DO4P0x,,<@L^ /4{t""ӰiThkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkY$" )**,La`d3IUa]NޘүQKO|S޲BYnQf;e;ޥ$S7֕!YLd{?%H (LgYܑ2 D bH ,LBK ,&Qgnt !K+kJ3Մ3$,3vYkJ3~2E(9gr(H l#QoP0x,,<@L< Ғ¬oP0y0ʮWJ3nLLb kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֳJtiₙǁ Aa䃎ȑ3NEpH'p9ₙdž ""L5$snb$ekם*<t^/R't*gFV]wCDO4P0y0mZug9)* L>oVs.^,$ҳU2'#oJ xP‡@1Q@0 ңhFV N_]ib xS7E |ZrMtbdzoׅxSZTeһ,‚zW4Qǁ~op ˨)kJi,oE(=ExS7<oҝ)YNoռ4M5^%ojR\e[evyx)}i[VOe\Z,igwet*(Ox. ].}L™uc/9+XWWTU)No/.]#2|S*3yx)tөUH)z)`O̗3)RC[rNj>|)U޽d:˨ Np '^,3e޺pl*fKש ˨ֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵg ₛiYe!i)Sx?fҢH4"T9p&%*l.%UaYHZz&9G >ǏD#8Hճg3%S"pJMFz- nyGeMGeOYzƍ$ppşD*hDr%$$L5K"Ul %vZRUXW]d[(vCGx2!yGٳjRTIJ"X@z $L5K"UBoYiIUa]u}nI AȄqv^ҢH4"T9p(Py"a"Y,Ϭ$a 2X%&oMH^ ^^SՔN)AȄ3i<@ర2gx3;|g?Њ|%%UF9kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֳnH,EJ[k?ۂ&H?bS7I?⬗zJuA<^i^u՟gtReɒ$&HEE3nHd gYܢ 1$ &H?e (R on:g HYg%$nQe !j9 Cws%t?kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵk?˯ GIK|W[4AL ʠ0AdH'b$ALPÑ&97CQ\ ugfs $HdCDDqy"gFV]y/UgFV]tL3+]."'(<6()9")Sx$I/4"G<ИhYd*LLbEYS7^*xשIyzpYLe]Y/*DO^ g9IE>ER8c,\0,jH1lM'< kuh1+b՝ab& # ./usr/es/lib/ksh93/ezupdate/common_th9#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r721 src/43haes/lib/ksh93/ezupdate/common.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2016 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/ezupdate/common.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM typeset scriptname=${0##*/} typeset scriptargs="$*" ############################################################################## # Global variables for log ############################################################################## export PS4='EZUpdate:$scriptname[$LINENO]:${0##*/}:($SECONDS) ' # log level, by default 0 export CLEZUPDATE_LOG_LEVEL=5 # log file, by default /var/hacmp/EZUpdate/EZUpdate.log export CLEZUPDATE_LOG_DIR="/var/hacmp/EZUpdate" export CLEZUPDATE_LOG_FILE="${CLEZUPDATE_LOG_DIR}/EZUpdate.log" # log mode, either append or wrap # append if CLEZUPDATE_LOG_APPEND=1 # wrap if CLEZUPDATE_LOG_APPEND=0 # By default wrap mode export CLEZUPDATE_LOG_APPEND=0 ############################################################################## # Global variables for accessing utilities ############################################################################## typeset TOOLDIR=/usr/es/sbin/cluster/utilities typeset CLMGR_CMD="$TOOLDIR/clmgr" typeset CAA_CLRSH=/usr/sbin/clrsh typeset HA_CLRSH=${TOOLDIR}/cl_rsh typeset CLRSH=$HA_CLRSH #CLRSH -n typeset CLRCP=${TOOLDIR}/cl_rcp typeset CLHANDLE="${TOOLDIR}/clhandle -a" typeset GET_LOCAL_NODENAME="${TOOLDIR}/get_local_nodename" typeset CSPOCDIR=/usr/es/sbin/cluster/cspoc typeset CLI_ON_NODE="/usr/es/sbin/cluster/cspoc/cli_on_node -N" export PATH=$PATH if [[ -f $TOOLDIR/cl_get_path ]]; then export PATH=$($TOOLDIR/cl_get_path all) export OP_SEP=$(${TOOLDIR}/cl_get_path -S 2>/dev/null) export OP_SEP=${OP_SEP:-\~} fi ############################################################################## # Global variables for msg catalogs ############################################################################## typeset EZUPDATE_MSGS=ezupdate.cat typeset CLUSTER_T_SET=1 typeset NODE_T_SET=2 typeset CL_EZUPDATE_MAIN_SET=3 typeset CL_EZUPDATE_USAGE_SET=4 typeset CL_EZUPDATE_USEREXIT_SET=5 typeset CL_EZUPDATE_CHECKNIM_SET=6 typeset CL_EZUPDATE_CHECKLPPS_SET=7 typeset CL_EZUPDATE_CHECKIFIX_SET=8 typeset CL_EZUPDATE_INSTALL_SET=9 typeset DSPMSG="/usr/bin/dspmsg $EZUPDATE_MSGS -s" typeset CANNOT_INT_MSG="$($DSPMSG $CL_EZUPDATE_USEREXIT_SET 4 'Cannot interrupt, please retry later.\n')" ############################################################################## # Global constants ############################################################################## typeset -r ACTION=( Q="QUERY" P="PREVIEW" C="COMMIT" R="REJECT" A="APPLY" B="BOOT" QUERY="QUERY" PREVIEW="PREVIEW" COMMIT="COMMIT" REJECT="REJECT" APPLY="APPLY" BOOT="BOOT" ) typeset -r MODE_TYPE=( H="HELP" A="AUTOMATIC" ) typeset -r MSG_TYPE=( ERR="ERROR" WARN="WARNING" INF="INFO" ) typeset -r UPDATE_SOURCE=( LOCAL="LOCAL" NIM="NIM" ) typeset -r NODE_LOCALIZATION=( LOCAL="local" REMOTE="remote" ) typeset -r MANAGE_MODE=( ONLINE="online" AUTO="auto" MANUAL="manual" UNMANAGE="unmanage" OFFLINE="offline" MOVE="move" NON_DISRUPTIVE="non_disruptive" SILENT="silent" ROLLING="rolling" NONE="none" ) typeset -r RC=( OK=0 FAILURE=1 PARAM_ERROR=2 PING_ERROR=3 SSH_ERROR=4 EMPTY_DIR=6 PHA_CMD_ERROR=7 NOT_FOUND=8 RG_CANNOT_MOVE=9 WARNING=127 QUIESCE_REBOOT=200 QUIESCE_NO_REBOOT=201 UNKNOWN=-99 ) ##################################################################### # # NAME: DSP_MSG # # FUNCTION: # Display an error message with internationalization to stderr. # Log the message into the logfile with the right prefix. # # EXECUTION ENVIRONMENT: # # NOTES: # # RECOVERY OPERATION: none # # DATA STRUCTURES: # parameters: # 1: the MSG_TYPE can be ERROR | INFO # 2: parameter for DSPMSG function # global: # # RETURNS: none # # OUTPUT: display messages ##################################################################### function DSP_MSG { [[ "$VERBOSE_LOGGING" == "yes" ]] && set -x [[ "$DEBUG_MODE" == "yes" ]] && set -x typeset msg="" typeset msg_type="$1" typeset msg_set="$2" typeset msg_no="$3" typeset msg_def=$4 shift 4 msg=$($DSPMSG $msg_set $msg_no "$msg_def" "$@") print -- "$msg" if [[ $msg_type == ${MSG_TYPE.ERR} ]] then log_error "$msg" elif [[ $msg_type == ${MSG_TYPE.WARN} ]] then log_warn "$msg" else log_trace 0 "$msg" fi } # End of "DSP_MSG()" ##################################################################### # # NAME: WALL_MSG # # FUNCTION: # Displays the message on the wall. # # EXECUTION ENVIRONMENT: # # NOTES: # # RECOVERY OPERATION: none # # DATA STRUCTURES: # parameters: # 1: parameter for DSPMSG function # global: # # RETURNS: none # # OUTPUT: display messages ##################################################################### function WALL_MSG { [[ "$VERBOSE_LOGGING" == "yes" ]] && set -x [[ "$DEBUG_MODE" == "yes" ]] && set -x typeset msg="" typeset msg_set="$1" typeset msg_no="$2" typeset msg_def=$3 shift 3 msg=$($DSPMSG $msg_set $msg_no "$msg_def" "$@") wall -- "$msg" } # End of "WALL_MSG()" t k&j1+b՝ab& # ./usr/es/lib/ksh93/ezupdate/log#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r721 src/43haes/lib/ksh93/ezupdate/log.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2016 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/ezupdate/log.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM typeset scriptname=${0##*/} # This integer to be set to 1 or 2 only for log debugguing typeset -i debug_log=0 typeset -i debug_log_max=9 . ${EZU_LIB_DIR}/common typeset DATESTR=$(/usr/bin/date '+%Y_%m_%d %H:%M') ######################################################## # This function to init log characteristics ######################################################## function log_init { (( debug_log == 1 )) && print -u1 "log_init" if [[ $VERBOSE_LOGGING == high ]]; then set -x fi log_verify_and_init } ######################################################## # If append mode, we just write at the end of the file # If wrap mode, we just wrap log file and start anew a # new log file ######################################################## function log_verify_and_init { (( debug_log == 1 )) && print -u1 "log_verify_and_init" if [[ $VERBOSE_LOGGING == high ]]; then set -x fi if [[ ! -d ${CLEZUPDATE_LOG_DIR} ]]; then /usr/bin/mkdir -p ${CLEZUPDATE_LOG_DIR} if (( $? != 0 )); then print -u1 -- "$scriptname: ERROR! Cannot create $CLEZUPDATE_LOG_DIR log directory!" >&2 fi fi if [[ -e ${CLEZUPDATE_LOG_FILE} ]]; then if (( CLEZUPDATE_LOG_APPEND == 0 )) ; then (( debug_log == 1 )) && print -u1 "CLEZUPDATE_LOG_APPEND == 0" (( debug_log == 1 )) && log_wrap || log_wrap 1>/dev/null 2>&1 /usr/bin/touch ${CLEZUPDATE_LOG_FILE} 2>/dev/null else (( debug_log == 1 )) && print -u1 "CLEZUPDATE_LOG_APPEND == 1" /usr/bin/touch ${CLEZUPDATE_LOG_FILE} 2>/dev/null fi else /usr/bin/touch ${CLEZUPDATE_LOG_FILE} 2>/dev/null fi exec 2>>${CLEZUPDATE_LOG_FILE} exec 3>>${CLEZUPDATE_LOG_FILE} print -u 3 -- "### $DATESTR - Running script: $scriptname $scriptargs" } ######################################################## # To wrap log files ######################################################## function log_wrap { (( debug_log == 1 )) && print -u1 "log_wrap" if [[ $VERBOSE_LOGGING == high ]]; then set -x fi for (( i=${debug_log_max}-1 ; i>0 ; i-- )); do /usr/bin/ls ${CLEZUPDATE_LOG_FILE}.$i >/dev/null 2>/dev/null (( $? == 0)) && /usr/bin/mv ${CLEZUPDATE_LOG_FILE}.$i ${CLEZUPDATE_LOG_FILE}.$((i+1)) done if [[ -e ${CLEZUPDATE_LOG_FILE} ]]; then /usr/bin/mv ${CLEZUPDATE_LOG_FILE} ${CLEZUPDATE_LOG_FILE}.1 fi exec 2>>${CLEZUPDATE_LOG_FILE} exec 3>>${CLEZUPDATE_LOG_FILE} } ############################################################## # # NAME: log_cleanup # # FUNCTION: performs cleanup on exit # # DATA STRUCTURES: # parameters: # global: # # RETURNS: (int) # # OUTPUT: ############################################################### function log_cleanup { typeset end_date="" set +x /usr/bin/rm -f ./CMD_* 2>/dev/null /usr/bin/rm -f ${CLEZUPDATE_LOG_DIR}/lcd.*.$$ 2>/dev/null /usr/bin/rm -f ${CLEZUPDATE_LOG_DIR}/clvd.$$ 2>/dev/null end_date=$(/usr/bin/date '+%Y_%m_%d %H:%M') print -u 3 -- "### $end_date - Leaving script: $scriptname $scriptargs rc=$rc" # Since this was called from an "exit" trap, whatever # return code that was exited with will be returned # to the shell from here. } # end of log_cleanup ####################################################### # Write to stdout # All what is written to stdout is appent to log file ####################################################### function log_write { print -u 1 -- "$1" | /usr/bin/tee -a ${CLEZUPDATE_LOG_FILE} } ######################################################## # Write to error ######################################################## function log_error { print -u 2 -- "ERR: $1" } ######################################################## # Write warning to log ######################################################## function log_warn { print -u 2 -- "WARN: $1" } ######################################################## # Write to log # Filehandle 3 is used for log ######################################################## function log_trace { (( debug_log == 2 )) && print -u1 "log_trace $1 ${CLEZUPDATE_LOG_LEVEL}" if [[ -n $VERBOSE_LOGGING && "$VERBOSE_LOGGING"=="high" ]] \ || [[ "$1" == +([0-5]) ]] \ && (( ${CLEZUPDATE_LOG_LEVEL} >= $1 )) then print -u 3 -- "INF: $2" fi } ######################################################## # This function to display log characteristics ######################################################## function log_short_display { print -u1 -- "out CLEZUPDATE_LOG_LEVEL=$CLEZUPDATE_LOG_LEVEL" print -u1 -- "out CLEZUPDATE_LOG_FILE=$CLEZUPDATE_LOG_FILE" print -u1 -- "out CLEZUPDATE_LOG_APPEND=$CLEZUPDATE_LOG_APPEND" } ######################################################## # This function to display log characteristics ######################################################## function log_display { print -u1 -- "out CLEZUPDATE_LOG_LEVEL=$CLEZUPDATE_LOG_LEVEL" print -u1 -- "out CLEZUPDATE_LOG_FILE=$CLEZUPDATE_LOG_FILE" print -u1 -- "out CLEZUPDATE_LOG_APPEND=$CLEZUPDATE_LOG_APPEND" print -u2 -- "err CLEZUPDATE_LOG_LEVEL=$CLEZUPDATE_LOG_LEVEL" print -u2 -- "err CLEZUPDATE_LOG_FILE=$CLEZUPDATE_LOG_FILE" print -u2 -- "err CLEZUPDATE_LOG_APPEND=$CLEZUPDATE_LOG_APPEND" print -u3 -- "log CLEZUPDATE_LOG_LEVEL=$CLEZUPDATE_LOG_LEVEL" print -u3 -- "log CLEZUPDATE_LOG_FILE=$CLEZUPDATE_LOG_FILE" print -u3 -- "log CLEZUPDATE_LOG_APPEND=$CLEZUPDATE_LOG_APPEND" } PPEND = lk1+Yb՝ab&2 # ./usr/es/lib/ksh93/func_include  =e #ainrst"$_cdhlouCDEILMNORST[]fmpv()-./:AGP\bgkwy%&*,012;>FHUx{}!'+4BKV|35?WXYqz689Y Ϲ${UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU17*FoIE&!Šuո[\s=x 2~ W%St,nVLe9P h+Z<7|I@jK\SR%)|@fj>٨oI[tmsȬW W5ٵ۠2f-Dg4nAk!&,9crMhXsnkDŽ9c`sUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTK)hnU6<(\"YX`o| ̙,/00K?ުxzvt> ?=|ccUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTn?sEʺ&7rJ/97W9n]{K\V^ Q 1\ i-1j05@41ſ.\حX+Ih'.kc|[4o7[s'A[OY+i˫9s[VNAk(7^@vj^r+%r5\riWDsŅ6\حX#>Pݪ㒹1ӗVr5/9K ;X5/Ix5FX>ܒL9c,@H˩|-+nW(7yj^]{/x[ì;sbc\ZO4O,j"קiӗVy-aaП5Y8- @d9IwroZbyeeەTgt'`^S:Rc Nj:{UyrW,.0)BrVƱ[?f\Խʺ&KskMKx/ w!j^;`j^|m.'7p]U[.gY޴aSv3K)h1oix%7 .U6c rܖ7sQԸppsa*.9Eʺ&4EW4\oiZKA9E3a ykUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTK)hr]xQ`n9pZ<c?2rsPԀ19reJ ˕,@H@3c'.WbL`h&TޫA ɐw5. ,@H+Rn`pji-*Pi41ŏ gY uX`9+2d32dK?g h41Ű ,,23naJ[ -@0&T tʔՁf &g@ɐɜʔH -VaJ[3Qm|lN·uU(0h,%3ȾWAE {?ުl &"G@LA4?0C?07>63c'.W<5*34#n9q ,,23X_qˎ``;Lџqˋ?7MyP-׌4%7My0*1UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUULnMC%mEʺ&7rJ/97 CrGK++ix%7 Z./OX1"Vn85<ۆuv[nI>j15/Šs>kr]aak!,@H# czrsR ?6V 0@# 1Z201aqѓqOXzJۢtM1kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֱnMCu|-65\M@Cs|.[nUyNbpӳOj>\e;6Ʊ^r~B 'NGOr/35Q/EU67K905/3B5akHC5IU;i)z娴3yj\o|-Z| vl9cZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵa޴7jwi?ô"$HEJ.'aa4\t1˕ Q,4ybgre /^V5{IUdOԸ+^|t[Is?Ȭ*k0El=c\Խ%W:K@ŗ0iۅ0캗IYN:K6',pZ.+6wYpi)i[vmh? gm]Eg$59Uz+tܪ iۅ6^S˚حkÙ1+@u &lZ 5<""4J)ph<=;:T1RBMaVH<<* ;@fd;`ƀ$&T1C6-&AԸ397!l6ZH*a$$UE`@yR p[IU;i٧@5HJg,nkzHaaD1׌43qOX{5U;4ZaakZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkqUadcs^0D܅7rJ/97 V:[6mh-nU./M|/^ktޓTgM8e<01, &4pjRp\mVn1j\nSZ/5/,9U_lJoZk!_u/IdnY޴Y,nkXa7tv59t7$tQUj_8z\حX5-ܔrՒt޴7Úix%7V0SEU0N+lo9yۈ U tTdG9.j[Dx@ \Bg󋒹\ح[IxvƱm/u/6ot\,ƱEqyC kUaag[|U[ȏ"cK(LW n' [1wkeTv@5/\W|,ǚz  cj\9|nkK'{Y-EÚb㇕*Ʊ[?ЊG|ZO4OxIdcZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵa޴5VF75M[ 3c'.W<5R˕4 gN\zNU[*\oz@ c?UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUULn"ug'[ix%7 ςmryo||j^Ţg'a9eԼLZ&='B OYwEНlnsQt ,kWjppvmVgj h p@HH LGRc?@^n&p@#4 j gf aDTK"PK2dK?k0cB)`5`@ ,,22"O \)Tشww9^1"nBOn {?=51V⊯l 0`A7>bLfLpgȾW@0|46-Whj,nk`m-Usb-K(8݆ @{?= h| X$, rV dfdfz `ƀ$Db]V VM`jP 6fd?9rE|'!`"T1E@pD&<@rQU,g@z@(P$\ Uadcs^0D܅cֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkX7&v!,ƱQyɽhn; G^oU/+O4qk|k.)^,-n=;\[7r;5/g}|^ViusKGNګZ ޼=楱WkNW|Nò6-I׾Zo\3iC,\pCIF7ܤk,lӒc㇁A!! "cQ&"Hx[`:kBZ Yۈ+|9yd6jpJ|=w VU`snkʍDHho5a,kGeyQ*TP5kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵSzŮhNU,m\(QR 7 g=XXa "~m63c'.W<5HKP$^urύxÔU` fd;dUdNc?Ղ!U.,= [?Y[?2rsY'+<{1+)RF&(ɱ9rH*T$\Ly4 "HH$J `hiI DA, p DTH̙sRI DA*=Y3b<4pq^oVAʬ-ιU HMU9Ug h "HH$J fLF4!"(%G^oVAʬ,{?&qhDTHg-HȔ$$U%AhH\aNZK8Uc,43_ 0Ǔ(d-Ɣ&8`-sEUrd7gzH*^EQ Uam%t?Y'+@, T (Xz$J &%G\Ud0Y; DTH gȾ@a$ &PZ(Lq` Z披$QnD40;UdNPY'+C$$U%K6'亳gf h*NV '}V 0`BG22"O=XXa&9M_Kr[IhIm\UyhU:ZoNv+i9y^Iӹd΀M8ܥr-I-O\~0k Nܘs qyC),7ыx٫+k񆛦7wipY;-s M9+tݚ|'qrWio&[/ƱEqyC+s^05/|'q4[K),7ыx٫+cj:xå^[snkʍDHho5rWtK/ZY^Tj#ʕ(T9cZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵa޴1k/& 3;@""DTB,q@~zHpM˕ 8D gN\|Nk?2rs M9+#1+)RF&(ɳc'.W=tG\Ihx)nc?@^;%y8 rWG` ,FN"Ee̙sRIhx)nD`NiK@Ŵ M9+? "HH% ($VVIhx)niK@Ŵ M9+ g,/@uYQ 5l4q̙sR0h03FB8 ."af03FB"\D ."afPri{?= c?XY׌7!l"@cɔ=hfvk/&,01kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵcrn7bNr/n:^roZw;)sR ONUQܪXfSd7䱩:7XNr/|޴7!BLZ&C?˩|nsR,[ak^g?kBØ7+s^0 k NE|޴ZxX ƱkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZְJoZ>xQ$ UadnzDۂlgN\y23c'.W<5eǕ*@qIswX1%GoփYh EDJ̙gԸ3_ 0Ǔ(d-Ɣ&8`*%NUK=%W!4Á" "HH% (%Up̵VXٷA934 ?!f H㒱&C04 PAq@HW (4D$B,(S0RIU;pM0I<=;:Wڲ4ReהC_dØjg8&p$꫃Ac?=9r `F9y D1 @ ,!%NʍЊGzH*rBdJ {qF3-U6mOufڲ<aa"@e Xx҄ ţg0@Ba4є֋JAeV?@12KCEDJY3gzH*rBdJ 3h4g""4M4e5kFvYUD,LDLDq1D12ÖL?ɗTLOgȾ@a$ &PZ(Lq` y2ʉ XxeǕ*@x=I D!2%ig #&-eǕ*@Ǔ({?s^0 qOX{>aakZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkq71n:^roZ[_)BEc{,5/XY;r+zv5I%AN<zvi˫675/UdƱ\ԽWzƴ!yfpV9wd9cr5 sR,QS,i梱VV0KtݾrM1k!ܿ.w.j:y ⷯ+Onq}7Bn5q%|q|ZaKvtK]Yۧj%J#K_gmzo7%|Gkn8yZ|s^0Bo黚0qvcnroZWޱՕ\YsaEzotoFur棧^0Onkk^g?kBØ7+s^0 ]`湩zoaI\iuUs ֋Z.ⶴԸ>VƱkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZְJoZL  3;@""DTB,q@~zHpM˕ςܩc?2rsadc'.W<68D 1+tZ7tu{>orwUs*ɟd*@BDe96d&.#Lgf a"PhI?2dK?k0c?@)UE4"Ee9 j\@A$Q&Pp<aa"@e Xx҄ הC*#O$$UȔg8D !W=Y:Hf<aa"@e Xx҄ ՑøZY; ʍЊGzH*rBdJ 3ՕC/Y;ܒN7}%rI\iuUgd|4Y;xx(? gȾ@a$ &PZ(Lq` JAd^Q?DTK"PI``4ZH,Ђ!W=Y;A$$UȔ gR3?Ez Ly2B,XFϚ9gJD <NhA8u +gɗ  j^ؘ@s?#G+jNh+7 g"LQ: p igY&\@tF7b$&ïLA]w ̙sRUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU3u/IyMcwV:=vu_w5/6گpBӸMq/QW)>j^miOXT^[t֏56=D!v䲧n\ݦF7 B&PpW5.lћ?GOԽ%5Cڪ*TTI@A$&nIM^ : L` ]w&\@H$A]w ̙gԸ3E*e'KyW[ gX^Dxp"IM8݅p#@(ԝ8up#pB$ɏ+H+¬gYl4tDק&\@H : pLj\"exѫ-3,/"B76crn7bͱn:^roZorܪ`U|G梱7q|[mʼܷ*Nn{lo(܎9+i-nO㒼61nB?r |ԾS-GO|8ٻL9cr]K7i_ms^0.8HsnksUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU0JoZxQ$ UadnzDۂlgN\ybHgV*䯛d c  V']Y gЛŗYyr8XO㒰.T1*@(XRă$qX!UǪo{2Uշ& c >w#JXRĩbHk@$qX!V3C;{W\_laGq[?*@ ,\b@p8`9+2d0*<47=ʐ&${` `aaD1׌43qOX|aamUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUSn?nJ"r+&5\M@C))r"קi"ˌrד-Kҋq{goRR܏tcX܄/9 ^#\n _5A=Ғ=yd(1&;tOS g5[nx‹J:WooIӼaGOܭILUڣ 7bkngS-i"D$?8@VqtY޴1gn j^yȬr7܏tMi1nVa!sR[åtH1{sR[=[L9cjix%7V褢'"ˌrŒ (Pz #pFs'c?2rsa/Rd9\f gN\xʐgjIWFA=|^:ªܙڪgN\xknJ\*@BDe96dsb3Y**]v8'i4\D^kP1+tRP r`0 ^I@/q}$Wy8 34RܺaXh49Lj\ڪdVX^Zܧ[X+tRR:YȬu`MGIMc\IKv5hϚO۵%ڪd"ThDyj@/q}ɟW</q}ɟ9r8 ^?-^@B#gf hrUh2뤈CU{g ^I{3G:Wh*{?= gg<'8)R_)Ec Ţ- "ˌr:Wj35~|5KnJiEګ,qy,/B)uYQ"ThE#aj\+p?=mUUUUUUUUUUUUUUUUUUUUUUUUUUUS?2|6+q5tRYx'\`)w+nj[?8.lVk))r9ٳ\ԸsR[?3Nzv:չ5/qÑX^ްm)5R%ڪmIKF/ ၀j\ih3@V9qF&B5Y3` b!e?{J `c7g/c=V 0"P Lp(0 ş1&C8g(J x d`'2eR+r+# ɖ{?Z+@ xDʔ,aXU0h ̳&AԸ3c'.W<5t ghcXo gf h UL849<g(J ?@QX$Ã@Xh@1@p`o| h3(&8xMϘ!ɖK?,[?-t ̃AT?k0c@^zD^A9 j\ie+p?= gX^f^ ၘ  \Xo@^Lж{пn> \窲"UHL'pgX^Q"ˌr0 2/ )RFX$4hŰ4 Tj%D "@43UxrB),,0& ϕ)(Ȭr7܂cڪcXܛ؇ȯ ENw&5\M@CqKEcN),7ыys|-9ing#rNZTgZ*[Ja\sR\_mN|6+qևnIMӜ^*|-=yY1'yO6{5/MvǚsR{TgZ*[J{Kt 楛󋞫,.lV\lm0캏dr7+ۖ*Icg7Wg|6tNAk!QS{%{1p5[&o c]+6o4McW ڿ5/U¶5{4kX5woR.lV-9o5/tbur\&"Hyk^g?\oto݄*=eqy5Q/Ʊ[?^+9i<=W ڻYx'ԽыALo5.#,I.@H5^ MC9h N"@ *PpVF8 ?=O͸&dQR3c'.W=W ڴ50c z V̙W ڴy1CgN\xkHHL&j&B?၀j\1+P$Lih3@GIC!Pv0c@^zBx dfdaay@(K4Hp 4#J3 V6v-y,/(bL f &g@ɐg/c=V MϘ! @^p 0`A7>bLfLj\uʯtQGIC ɐ?ׄz,y{ LRX.< ` ̙sR{2f &g@ɐ?t0P^BI@^j2MϘ!S4*iMh[?WP#ƗDi@2V Ը3)RFLtBD3jQ,4yb43UxrB),,0& 9h N{UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUSn?|o7rJ/97 sqW MsRKDۦ!$?,$ 9cr8!MAʇeԾ7zƷpY;quUSc5 5 i+(ƱEqyC.B|*OZbzorX)ÚZ&j^&AijOVò^2VYAć+bps?ۻI枖:oZ%޴Ը c j\5|tU{gY1+0% V(8YYh (8p4 (8zŢEptQis&Y5. HyPAć+H .Ać*OgAć+H $< DCUk1MZ3Epp`(.)R7.hYiel@i:47VGpz "HH% ($7U`ѣԸ3'O@@`h?'/:qr;MfȾQ7_@קtZ7lօh Ef@@4Re"X=%Q!y`x=I D!2%7ў+@p5Jel4ցp3@@Og51l ,e|w#ܮMzޛ/,V7$4<"@Љ ѽ\\*C|1#^zkpZz;{HW0«a꫊fLd9:zpg+gi 3Mᦴ #?k0c 5\ 6ZMhp@# p72dK? ᆻapfp3@@.4{!Z3/3|7f֍ªmЅ;.Fq/&f) )$F/g^q+)Y& 30Z0hLɐw5. y6a⯀xlw<& \ 3&AԸ3'O@@3Օ'O@@`o%<4\pgW>&Znp|UV3UxrB),,0& U)B =cjcrn7b4BfEӜX7rJ/97 x[i/^w,^QX7O|9yȬux$GMps qyCK+ԽӜ^*Qi^uʯ{lV׌-07ǑHy2RV'GOIhMτ|ZO4Ot;c#K` հVtJx$GMpv]G|kbK|/n8—旂Sz-'*"@e7(/9Խ%6-'*)!}|*OZb㇕+SXbIG쁮j^*汰f%7N`7[<5pnzH*b#@7+s^0 knH_9f[禵˂cX%' XQae7$/D11mUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU0JoZXaM Fd熿"L$J3,/$Dȓ PV3c'.W?$ gN\xk#I_Q ɔDTK5`$qX! j\r/as5ʫnH_t_ ځa"[$ E$X, 竆r/&<%bLDc?E$X, 竆E0վ6$ i𰼈e#x`fi- ?E7ksR2$h4ehe|˅v5*䦒,m67Xٵ7 aS8,-GOMIc'C75KcNØ7U%i,lzN,4 ֏5^S-O^.ր+qÖɍ|0A*qJrcjw%W:K@ŗhzJ|nv/ vƱ^r6l㦧*<a"G3 ck:oZMMc\Ծ '|t˚oӴØ7`r 3 cv'75ť(&\Bb$L%8X)Fx]i59>wYJVs!a3'Yy^r֚j:3bX7r\toRxNcXܭxBu/ugk9qt޴6Szܚh"䒹K 3;@""DTB,q@~zH 10r3c'.W=%8H1+'k?2rsg 4$$U%ݦLG+H*3.J󎋍\&3UUUUUUUUUUUUUUUUT u{>orwt^UnLmUUUUUUUUUUUUUUUUU3c'.W=%D㦢0qr'у~n1+͢qQg;J*50,@MQiOA%8驁m,l'56m͢qQ,l'5y8(*@-%VLص 5 HM%W!gj!f-DgIT6ͯhKY;5=7%Ft V"O=XXa&  Lx cǵ*0h L~deZ@h LyMh[?,@V 0`BG23bǖȔ"Dڲ \yj= >v J|ZO4Ol4{ڪg]KcnLgv4DGIU;grVR!k:oZML+{N5/"" %W;<4$;qgj5#Cudw5,N·uUF-98ۢ3ܚqK4x,XٴN:j#4@<aa"@e Xx҄ 9i<> '`6l㦠+r+{N5/"#8@iBEQ.HLA&3c'.W>Oq7G\ŤD{?2rsQ%W(KG,@,@5r/@cɔ2aJX0C"5$hnUyNㆥlCn@Ori,wIcf8騌n¢H*rBdJ 151XqVyDH2|<ۍӳN]Y˚ܟ;ꬓw[U4 .<%H<&p@# "5$hnUyNㆥA.Fg]Y'Jy7K T3``;7qVr%W?={yj^U0E65E.@KX5(P^S *qgԸ3#Q"F%W8jX4꫁@Vx^m M8ܥZ<N,l'5Tp dK?1ݤk:oZԍ< '|U%|',,0HL PlnJaU%~4!"$&D?frS ,m<@iBEQ.HLA, |',,0HL PlnJeFhE#x=I D!2%,KXR DyR 5K*5!G-pgj :7sy7 U54t6mx='MA1dܦZ"+ګ,s4wb5!=gj9rT  =[gnq} iq01"O y5PXٴN:j#C6mx='MC{PFCx=I D!2%%KtXٴN:j# riJ 6crn7b6Nr.I+7rJ/97 XwV7Kƈ*qQX5-2$h-O^.ր`s qyCXٳ`8bS,e^ͯhg55sR,Q.k1+|lm05>w(&\Bb$L%8X)Fx]i59>w[+cXܢ8!R{|&qW/3ZRGCt{VRp˚mOiakHC..sR":..րsUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU0JoZMJ,(QR 7 g=XXa "{?2EhX\6l㦥 gN\|;gH*BD uXn&p@#~ܤ%yEU{ڪg:UѽO|7Wκ/p&1+͢qQ8N?J7ty|'b)RF&([?2rsQ%W(Xٳܞ͢qQ8MA IU6-sMpqaDFIU;c?k^QU*q|UyNpgdF"D ՒJ)p԰h<=;:WE-98ۢ3ܚqK4x,XٴN:j#4@!kj_#>wx%W,mUUUUUUUUUUUUUUUUUUUUUUUU30hIɐw5. nIcwqVi:W1{{ᤴdkIU;1mW^gr.,梱ܟ;t [f;iQ%W KkIU;s?Ez Ly2B,n\M -' VW_ 0Ǔ(d-Ɣ&8`4HqQ(*T3rQ%W8l4o @(͢qQ8݅OI D!2%*qEeH",\yTJʕ 8} ܴIU; wP $htF7aP*@3<aa"@e Xx҄ ʍЊG~$\L9yQ%W(§o;5H*rBdJ 1a|RjʍDHha *@G*P?UyN5@3$$UȔc?UUUUUUUUUUUUUUUUUUUUUUUUUUUUUULƫn5/Icf׃t޴9ryG˂j+U% x,krsRK)p>StgȬtXo6o {fZSy棡͜V٨ܔgj"O>SX䢖-%RXgzH*rBdJ 3SX䢖-%RXx<$\X43,(;xa5Y#Cue(IT6lcMlK?cngJݜMh[?k#Q"FQK ,m< ţg0 o;`j\r/5J)aKIT6<$\L9(-%RXx<$\X4{rݛZ7Z)YY6[5|')3ReKL@iBEQ.HLA&ni*.<$\X43,(;xa5Y#Cue(IT6l%7w5. ]+vs35lg0k?Y[?3Icf8騌n-ܘԼhw*@KX?=1"nBE#Ǔ({?s^0 =cY6Nr.I+cڪcXܛ؇ۋ #^IE&!M 5/9;O:Wki& k|˂/H9nj^ɽh9\~qqo0Lovn %g&Uo/K:W-hŁ\,[Z 8`s qyCιU^uʯ|t˚ح\t05Czr\#>nuʽ> ,^|$ ]7[w'Y[Ӵm|&Iq|qѾj_Iah<y*Ac H*3UVŝ7 1bL`@ ,,2?@^^d?pgo;|6+q|Up951uʯx X`o| b@Y Y2d03@#grV(0 ş1&C0Xp`o| Quʯx X/2eԸ3T"TZJ-I DH*"E$0Rʕ(TC< BG/K:WH @@^ gi yR Ri*r8nBl$$U "HH$ (8*PN+bw;qy_$` UU{]k<1s?NIy6ʕ$XK2dK?a98 *Ta*@(ܪV^wkCahcw 4Áa.\2-ܧjaSb*XL UeqӍAJV5\6g\ܪBa+/;ahcw 4ÁaR*ri %+Oܮ 8m4MoZiܞ-NZ\+7pAHp,8u/*@O;qֆ Ţ7&nRR-MC^O5/*@O9K+mʫ 'aѾ+/;ahcw 4Áa_EDhɧ>kr' $TOKDۦmʫ $TO-hnsZ"Xln !Xp0%=h`,N+MdW!;K7L1$8 'w+YyrMHgY%cph4 Á  d -vcph4 ÁD2' ad!;.xV\IpOY% cph4 ÁoUeqIep2' h @(3K7OLӍLn !Xp4" NW$zNn7y[ʯ7 ɧ CagN0E7xV,ӍLn !`p_Kb+`Ңa0+ܚqI$8 A_$WDG>I,v34rAHp,8?!1'N\t$;qܚqH3i@cɔ^heg@\qK=U{=az*5!G-`GQ LiBG.ba"gj!ko5/6zNUUUUUUUUUUUUUUUUUUU3c'.W<)SCU{!V`ƁSEds ,,22HHLvC(sw]k4hx4y,/@`5`00K?Up܅h "HH%DTI- ^@yR o*k7O '4rx.ޓ=ɧY ;qy_$Mޓ4\qH,015ɸ݈/.ʯ;D㦣IE&!QXٵ כ|sUoZ޴3no^V5;qyj:|ԼV:<^|7 eW53KDۦCzr 8Nqxaו 棧bZO4Oٷ 5/hRpv5o6o^ViuCVKӹ>6+rޓޒZ;U S%zꬓvƱ^rU{.\GO|uʽ7NcX9~#g\ 'Mkt; S%zJZBoQeOr[7icӗVr8ak97*R8Ux*;L9cr#VV>,z\xc? @Y8@ɐ?a98 ,%GH8|' @a!H*@HPQK@H?=y,/9aj\Y ށ*Lpg"TZJ-I DH*"E`,8)J*!KryyM@OVֹpZ{G݄)C< BG`pb|U"Ee<1 RBEp , rV d`U atɜ$XK AӜCgȾWHc? Tj$D P$Ls?=KʍD$L &P0@#TQ ZK6Zzuʽ7MC4ֆm8n/43GO^rf^ V:0S\nI+97 y*;.坸t޴7ɍKDݧ+ |%pt!qfg"MWb097+aw9;O :1mAX`+݄: .ksRuʽ<^òKt; l5/^Wc'.LoIG@Zc(꧊iQL:.7sOͺi(Լ |ni5/5--)*et!B\Խ%5sXӽlUˬ2 >K.yM%3v~ssZ"3UUUUUUUUUUUUUUUUUUUUUUUUTab]e26*e^Tz6*e^@ \:Wjb]eGuʽ4NU+'\{?=\D^UnV5|ԽhYr*)RF@҅J]Ei4/ۏzƹ\U{c?k VTj%CF,[ sRab]e2*r8nBl$$U "HH$  TBpb?|CqW.ιU4s$x+tYuSͺi):ƹrғU^ )Hr:s0_ ᫃s&)4lUˬ {?Y[?IU{Ƒ& O7וƱ^r ieԾ7`L 8$ ;X5/M棦5[ιWakCzru/I林kg.&j^uʽ7MAրv:9ug.ksR٫+wai<Զ7|:n /ƱEqyCr+ fYxNiQpNK|༜*UV7oM8m=heTsnkxX 5/Mt1[ו ֏+o5zN05^ MC;qyS|?ô"$HEJ.'aa4\ t3ەic'.Wܡɽh9Vd爑"P@!"8`ff a8 "P@!" փc?UUUUUUUUUUUUUUUUULZJ7 *yEVUUUUUUUUUUUUUUUUS? صNJTQdrl|'b#iQ ɔ1+Zxo)Ey˕ 8y2-G*@I tzgN\y2 =9r㇁IH<2c'.W=cFs𚮝- 'G](1+Da!@H4ygf a/@q^d;*@I,X1$H g+gh &Ppٓ8 (8yj@-%`w#H Ly2s.9vz@(L$qX!TːT%:$ ,=MHfъ]VTj%CF,[ sR|'@pe*X gjnO< &"H~&DeG ?361KʍDHha 1@p0! j\Yl"#ˍITS|ћ2pgj^\tnJsR^oZsROV( O%'qzVKG^W38d9Ş*.Q|/u .HLqP:zi ?ţg0ӸFƇ)BVSFh Ef3%熚j`>xUS|J/c?UUUUUUUUUUUUUUUUUUUUUUUUUUUUUULƩi [\|!}GKvmC|/r6ogyhr˩zN]^68WӾj:|Լʪ-Qem).nGO}5[nJZyn 0TfwtFA[p[6o X+t3|o+4t!ykFrrJ"XT09`ƁQe"Ee̙sR  *DGKFNTӳ$<1@T.#H4R!W=Pd5L=;:a1CzH*rBdJ 3r/ $< "\D4QYA3 5l hp>Ş*.Q|/vQrzƍJ礴'pUӶ?jwHjv֊V`ƀMWNKBw A9,!Q-ȭ;Jv.[וs?UUUUUUUUUUUUUUUUUUUUUL˕"\yRb%`a0c(T#&p@#"\yRb%IgJ-I DH*"E`Rʕ(TCO!pVxPိUVKG^V)H*@I g"DK?*@G*P?cng5lgaazKʍD$L &P0@# &X/ gԸ3\q h *< LVDHL j\8`-} -sIh,Xӳ$<1,@h "TG@2燯(4qZ%8=;:a1CzH*rBdJ 3!X0@#$" qQe "HD"XgaaxKqd,@h X DB 3j\#-@iBEQ,<$HlJ9i<=7\!#$x`+|->xUו @R>zI?=H "8`,Y#-@iBEQ,<$Hl ʕ(TCO!pVxPိ@Vrx V*kx1`p%@V'* 䀭aa1C@RH X ?= h @e8$" qx HcJ*Y޴4\Ծ 'y(/t'l7KR.j^9^ 'zLn'g. 棧\..RYI,l۠5[ܺJZBKBu ӝ9>kq^Ԋˋ)JsR6mOtև5/&|9q4Mak.7sɍd+d4qZ&zJZBo ,\Ep :/1xá>ki)i R$\Ԋˋ)J1. 'r|&wZ8IM% Jo:+=Wz75 OԽ'*9RX5/&* Q/t'm%rs]) -sRkr5jd:/(x(νbV7d< BBcTCD$(~g\Ʃi R󋊪{-P84Q VZ1δ1CD$(xv5KH_4w@gahkGʯ7 VVZ9Ȭ*p@@0E" P'Lx HJgJ-I DH*"E`09!iM_1V1w P80Q dtE5/fm1H22`$D@O@5B#Ɓh( (8xxx(? c'.W<"Hj$D@i4<BzJ)C{a3FxDDyqrwLţ<""X NהCA|UyN!W>DD$\ۥ{+O|3nδԸ枭Ry/J$lţ<"".@j^QUIU;zzLţ<""< Lj^QUIU;}NLţ<""4Arwqda3FxDD@(܃*>N Z3" p$(=yD>!W=%W!4\^xM4RU찙ţ<""rA! *q |m)WJ^oVLţ<""DTBrUP@#1+8x@D$D%@XTI a/@C̙g V< ""] Uţoa3FyQ XbH&<ƀkqG-'}9|ͺi):na3FyQ"ThE#PqgkoZåi* J'De8g\1E,kq-+7uʯ{MG/)lţK8gix f853  )8g&P$D@ ۀP`7$2gDD@H`_@ @+.,,c[1qe;6Iւ;JNXH]sl|֋Lk|79qUyNZ92wA<%W 5|4r#t^S1$.6qi>kE-ѽyZx"6,ZO\O *T1nix%7*2gB !`R%B#@%G,@Bc#qD$XyTJ,P$Th*7 3QXHD*Tyb"GιU|4^S)zƷ$" U vaUyNA.y62:WHLў4HqQ.D冟s?`ga3Fx!"ǕD G v8g",\yTK1y2Oܜ?=^k0cA'g4"%uY*q?2eRaDy01E"c̅s&AԸ3gBE*p&>@(`b"%D.DǙ U3CQ*$gX$S.Dȁe`ɐw5. ţDHPUbv{}%,3;BYy!*+467ѥ_umV/ɣ4- OG#AQ rcJujvm)ƔiiaH(84p# dδ5H+8|15./Z4nsZEVNnx̛jv{ܕ2 үɺP\@@K]p٘;:uTƐ5=_x3G#H"K*IR,,##A~86 0 ai 0cL4٧bIY bL㌴Ɲ0 $ a(8 `dE0@ ']#`rΙ2)mhgXe}m%2VOL11*ef8$I&| u܈`Xa\ٛ2g YB `@DH -8-lh 0h4̅l@1$A1&ZqZyNUuflRAX8Q/AÁX$ dMx Ypr.ٓEqͧ3&ڬ&iʮ8I}Je!6,eٗ|)iVGj`_)IePEu^xӳ pPӳ!j"Ɣt_fmyHBD@ *ɂy| 8<!`5"Ir $p03!er"aDb 1era IU,ZnEftV/r(AQ8v !Ev,J0iVp03!er*@`94XTBѷFѳv,;+O@$MUm=QtkfbͼvW)+AfED,,m~OTm]iVyXClɢ8mVN͓NUu 4W_C`$ntRj#b]wrpFixvUDUd`EQ 8m~OTm]iʮvR<$ JmU1)y6cmٖsoY;=թ?:S?tPqnOyR.rWz2d! 1k)a~źgSz/Y;=OӫcF3mJ6fYx/ganٷߋÇtz-ȴhێ㱧7k* mf\qH77!tws7\jRx`@k9MumnQ\܋ћ`cNn׈!*V?knE:E1jFbWsMUS5V 19d 9d:Y;6tJiىN4u0  LHZ4rF-* 0jlgV'f@"hGbIY bL㌴ƝF!6*u1R+0#76'gUNStEPdwwi6dU;9Uv̛b۳-"jvaF7Z#EDl(,챹Y;0VУ D5Mu}עefTufZ\ 1ٙ_7W֛O_}Q/u0sR.by.E@#Z56?}E~Or5u1R <`vcL_whɸjmh]b9"-Nn#EDl(,챹Y;0VУeSqߍM8nU&A2:ٓE D.X۬$ dD 2ӎ2vr$a$ $ YUXeu|xhPYǠHb$,YAd(4P0f$ dD 2ӎ2vrP+V82ц$@; n$?($&hCH=z/Q:Fg6F4EC-PgC-XCH= )2Z3'64M/Ӕ2mcZ4) ڛۯƛ2 )2;8NmNjvshF&@` *4\pxHt?nYRQVYe%؇iBFO=gލ#]ͣQAF2[O&Rgg >qZWM  J " -(CEdxȮAQ5*/!,5] 0j0T_o‰ʣʕ ʕLFpnƹGP2L̮L̦Çg+,G>߈nOƛ[UA\XFM0LdW` cCvz2*Ƞ)($&?fEd'#I&Rgg0$v8<$: J " -(plɪmF*^wwwwwwwwwwwwwwwwwwwwwwwwwލ#]NYLja"KlN8vpj6yg6F+&¬0PŞ&@HHHa%T\ѠC(UK<ӳ]}7\? !5d $x Y0jDIUIFX JxI AP?dW`2j1g^ɓ4W_`{*Tgi890̰F}J]~2ο8ܟO6j3:jc~-8#혋`".C"7'YT]tWj"?vR$ JY *&0DD $C>_߈nO3qȶL0^8㳌!٧,4$"j",5@ DV*.t?4{fĖUW]Nj&Rgg1A J " -(C"9v4ib:jOǣnEWvҮ;9Űdvrz=BMRΦ#8CNYǶi5TIVep6n|C"?@[g_b;O6j3:jc~-8#혋`".C"@r~.|,Q&Y4XTBHa%TYQA"Bk"AUCP{ѤkjT^aY/y7'?[&OsŞ&{O*/* b3t|h5" 4ƛͿ*M]Ed4PRΦ#8\`BɞI%QRG X8vz",&$IR>2en4ܤ?*ќ9۳ ?)38Fj9͚p apdxyL̰%HF@>KhSs~46fFg(C‚ooYWAW_ u1eUh7GƊJc\ƨ_L &EfWE &EfS\phEeX~Y]~-V9C#BIyg6DpxHt?J-nYMu1*nڬMJVj+UEEeq4EugS?[ $QXax"'$ȬY|PgS?%gIDTWĒ"Aę/vrj 4<ӳFv(҇iC"YESxx{T܍bb+yEdz:j9x= /VNΐȶ}޲ 뤡RPHMsoAAUEIA!60$')ɓ@dVd]&>4G*++uhu|Re4RSi4]NiJeο8P;sA I8mVN͓NUua I $j <$YR*M!-(C˥~565BǾdžy$EENP4fl I k"$LIqxӳ]|(,0 kEr1+9b|bb&9 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_appserveroryk#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2018,2020,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2013 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_add_appserver.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_add_appserver =head1 VERSION Version Number: 1.11 Last Extracted: 1/31/14 04:40:48 Last Changed: 8/6/13 16:54:47 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_appserver.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr add application_controller \ STARTSCRIPT="/path/to/start/script" \ STOPSCRIPT ="/path/to/stop/script" \ [ MONITORS=[,,...] ] \ [ STARTUP_MODE={background|foreground} ] \ [ CPU_USAGE_MONITOR={yes|no} ] \ [ PROCESS_TO_MONITOR_CPU_USAGE= "/absolute/path/to/application/process" ] \ [ CPU_USAGE_MONITOR_INTERVAL="1 .. 120" ] NOTE: aliases for "application_controller" are "ac" and "app". =head1 DESCRIPTION Attempts to create an application controller that conforms to the provided specifications. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. appname [REQUIRED] [string] The label to apply to the new controller object. 3. start_script [REQUIRED] [string] The absolute/full path to the executable file that will be used to start the application associated with this controller object. 4. stop_script [REQUIRED] [string] The absolute/full path to the executable file that will be used to stop the application associated with this controller object. 5. monitors [OPTIONAL] [string] A list of application monitors that are to be used to monitor the application associated with this controller object. 6. startup_mode [OPTIONAL] [boolean] Indicates if the application should be started in the background (default behavior), or in the foreground. 7. cpu_usage_monitor [OPTIONAL] [set] This attribute controls the monitoring of cpu and memory usage of an application configured in a cluster. Default value is "no" and valid values are yes and no. 8. process_to_monitor_cpu [OPTIONAL] [string] Absolute path to application process for which CPU usage shall be monitored. 9. cpu_usage_monitor_interval [OPTIONAL] [integer] Indicates the interval at which CPU usage shall be monitored for an application process. Default value is 10 minutes and valid range is 1 minute to 120 minutes. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_add_appserver { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_add_appserver.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset -n properties=$1 typeset appname=${2//\"/} typeset start_script=${3//\"/} typeset stop_script=${4//\"/} typeset monitors=${5//\"/} typeset startup_mode=${6//\"/} typeset cpu_usage_monitor=${7//\"/} typeset process_to_monitor_cpu=${8//\"/} typeset cpu_usage_monitor_interval=${9//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset existing CL=$LINENO KLIB_HACMP_list_appservers existing 2>>$CLMGR_TMPLOG #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #======================================================================= : Validate input. : Must have a name, start and stop script - claddserv will do the rest : of the checking for valid names, etc #======================================================================= elif [[ -z $appname ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif [[ " ${existing[*]} " == *\ $appname\ * ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 229 "\nERROR: the specified object already exists: \"%1\$s\"\n\n" "$appname" 1>&2 rc=$RC_INCORRECT_INPUT elif [[ -n $appname && -n "${appname//[a-zA-Z0-9_]/}" ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 105 "\nERROR: one or more invalid characters were detected in \"%1\$s\" (\"%2\$s\").\n\nValid characters include letters, numbers, and underscores only.\n\n" "$appname" "${appname//[a-zA-Z0-9_]/}" 1>&2 rc=$RC_INCORRECT_INPUT elif (( ${#appname} > $MAX_NAME_LENGTH )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 1463 '\nERROR: Application Controller name %1$s should not be more than %2$d characters.\n' "$appname" "$MAX_NAME_LENGTH" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -z $start_script ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 101 "\nERROR: this operation requires the \"%1\$s\" attribute.\n\n" STARTSCRIPT 1>&2 rc=$RC_MISSING_INPUT fi if [[ -z $stop_script ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 101 "\nERROR: this operation requires the \"%1\$s\" attribute.\n\n" STOPSCRIPT 1>&2 rc=$RC_MISSING_INPUT fi if [[ -n $start_script && $start_script != /* ]]; then MSG=$(/usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 106 "\nERROR: the specified path does not appear to be in absolute format:\n%1\$s\n\n" "$start_script") MSG="$MSG (STARTSCRIPT @ $LOCAL_NODE)" CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS -1 "${MSG//+([[:space:]])/ }" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $start_script && ! -e ${start_script%%+([[:space:]])*} ]]; then MSG=$(/usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 107 '\nERROR: the specified path/file does not appear to exist on "%2$s": %1$s\n\n' "$start_script" "$LOCAL_NODE") MSG="$MSG (STARTSCRIPT)" CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS -1 "${MSG//+([[:space:]])/ }" 1>&2 rc=$RC_NOT_FOUND fi if [[ -n $stop_script && $stop_script != /* ]]; then MSG=$(/usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 106 "\nERROR: the specified path does not appear to be in absolute format:\n%1\$s\n\n" "$stop_script") MSG="$MSG (STOPSCRIPT @ $LOCAL_NODE)" CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS -1 "${MSG//+([[:space:]])/ }" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $stop_script && ! -e ${stop_script%%+([[:space:]])*} ]]; then MSG=$(/usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 107 '\nERROR: the specified path/file does not appear to exist on "%2$s": %1$s\n\n' "$stop_script" "$LOCAL_NODE") MSG="$MSG (STOPSCRIPT)" CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS -1 "${MSG//+([[:space:]])/ }" 1>&2 rc=$RC_NOT_FOUND fi if [[ -n $startup_mode ]]; then case $startup_mode in @(B|b)*) startup_mode=background ;; @(F|f)*) startup_mode=foreground ;; *) /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" STARTUP_MODE "$startup_mode" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "background, foreground" 1>&2 rc=$RC_INCORRECT_INPUT ;; esac fi # Valid values of cpu_usage_monitor are yes, no. Default value is 'no'. if [[ -n $cpu_usage_monitor ]]; then case $cpu_usage_monitor in @(Y|y|T|t|1)*) cpu_usage_monitor="yes" ;; @(N|n|F|f|0)*) cpu_usage_monitor="no" ;; *) /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" CPU_USAGE_MONITOR "$cpu_usage_monitor" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "no, yes" 1>&2 rc=$RC_INCORRECT_INPUT ;; esac else cpu_usage_monitor="no" fi # process_to_monitor_cpu is a absolute path of an application process to be monitored if [[ -n $process_to_monitor_cpu ]]; then if [[ $process_to_monitor_cpu != /* ]]; then MSG=$(/usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 106 "\nERROR: the specified path does not appear to be in absolute format:\n%1\$s\n\n" "$process_to_monitor_cpu") MSG="$MSG (PROCESS_TO_MONITOR_CPU_USAGE @ $LOCAL_NODE)" CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS -1 "${MSG//+([[:space:]])/ }" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ ! -e ${process_to_monitor_cpu%%+([[:space:]])*} ]]; then MSG=$(/usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 107 '\nERROR: the specified path/file does not appear to exist on "%2$s": %1$s\n\n' "$process_to_monitor_cpu" "$LOCAL_NODE") MSG="$MSG (PROCESS_TO_MONITOR_CPU_USAGE)" CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS -1 "${MSG//+([[:space:]])/ }" 1>&2 rc=$RC_NOT_FOUND fi else process_to_monitor_cpu="" fi # Valid values of cpu_usage_monitor_interval is 1 minute to 120 minutes. # Default value is 10 minutes. if [[ -n $cpu_usage_monitor_interval ]]; then if [[ $cpu_usage_monitor_interval != *([[:space:]]) ]]; then CL=$LINENO verify_numeric_range "$cpu_usage_monitor_interval" 1 120 CPU_USAGE_MONITOR_INTERVAL (( $? != RC_SUCCESS )) && rc=$RC_INCORRECT_INPUT fi else cpu_usage_monitor_interval=10 fi #====================================================================== : Create the application server if no input errors have been detected #====================================================================== if (( $rc == RC_UNKNOWN )); then [[ -n $startup_mode ]] && startup_mode=" -O $startup_mode" if [[ -n $monitors ]]; then print -- "$0()[$LINENO]($SECONDS): $HAUTILS/claddserv -s $appname -b \"$start_script\" -e \"$stop_script\" -m \"$monitors\"$startup_mode -C \"$process_to_monitor_cpu\" -i \"$cpu_usage_monitor_interval\" -E \"$cpu_usage_monitor\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/claddserv -s $appname \ -b "$start_script" \ -e "$stop_script" \ -m "$monitors"$startup_mode \ -C "$process_to_monitor_cpu" \ -i $cpu_usage_monitor_interval \ -E "$cpu_usage_monitor" else print -- "$0()[$LINENO]($SECONDS): $HAUTILS/claddserv -s $appname -b \"$start_script\" -e \"$stop_script\"$startup_mode -C \"$process_to_monitor_cpu\" -i \"$cpu_usage_monitor_interval\" -E \"$cpu_usage_monitor\"">>$CLMGR_TMPLOG # Always log commands $HAUTILS/claddserv -s $appname \ -b "$start_script" \ -e "$stop_script"$startup_mode \ -C "$process_to_monitor_cpu" \ -i $cpu_usage_monitor_interval \ -E "$cpu_usage_monitor" fi rc=$? print "claddserv RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 201 "\nERROR: failed to create \"%1\$s\".\n\n" "$appname" 1>&2 fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_appserver_attributes "$appname" properties fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "add application_controller -h" "APPLICATION CONTROLLER:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_add_appserver()" IN kt1+(b}bb&( # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_backupe#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2019,2020,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # @(#) 5f56dbd 43haes/lib/ksh93/hacmp/KLIB_HACMP_add_backup.sh, 726, 2147A_aha726, Mar 08 2021 04:44 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_add_backup =head1 SYNOPSIS For creating a cloud backup: clmgr add backup add => create, make, mk backup => ba, backup =head1 DESCRIPTION Attempts to create a cloud backup for backup profile in PowerHA SystemMirror. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. backup_profile [REQUIRED] [string] Backup Profile name should be single backup profile. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. #============================================================================ # # Name: KLIB_HACMP_add_backup # # Description: This is the main, FPATH function that is invoked by clmgr # to add/create backup in cloud. The cl_cbm_backup utility is # invoked to create the backup in cloud. # # Inputs: See the "devDoc()" function at the top of this file. # # Outputs: The properties hash is populated. The only other outputs are # any error messages that might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the top of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_add_backup { . $HALIBROOT/log_entry "$0()" "$CL" typeset -n properties=$1 typeset bp_name=$2 [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset available_bps="" # To store the backup rg's typeset backup_type="" # To store the backup method, which is cloud or remote typeset cloud_bps="" # To store the backup rgs which are configured for cloud typeset output="" typeset bOpt="" #==================================== : Check python is installed or not #==================================== LANG=C cl_get_python_version 2>&1 >>/dev/null rc=$? if (( $rc != 0 )); then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1315 "\nERROR: Python must be installed for using backup feature.\n\n" 1>&2 log_return_msg "$rc" "$0()" "$LINENO" return $rc fi #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY elif [[ -z $bp_name ]] then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else print -- "$0()[$LINENO]($SECONDS): cl_cbm_list" >>$CLMGR_TMPLOG # Always log command result available_bps=$(LANG=C cl_cbm_list 2>>$CLMGR_TMPLOG) rc=$? print -- "$0()[$LINENO]($SECONDS): cl_cbm_list RC:$rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS ));then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1197 "\nERROR: No resource group configured for backup.\n\n" 1>&2 rc=$RC_ERROR fi fi # Get the list of backup rgs which are configured for cloud storage. for bp in $available_bps do backup_type=$(LANG=C cl_cbm_list $bp | grep -w Backup_method | cut -f2 -d'=' | sed -e 's/^ *//') if [[ $backup_type == "cloud" ]] then cloud_bps="$cloud_bps $bp" fi done # Validate inputs if (( rc == RC_UNKNOWN || rc == RC_SUCCESS )) then : # Checking the given rg is configured for cloud backup or not : echo $cloud_bps | grep -wq $bp_name if (( $? != 0 )) then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1204 "\nERROR: The provided resource group, %1\$s, is not configured for cloud backup.\n\n" "$bp_name" 1>&2 cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1208 "Available resource groups which are configured for cloud are:\n\n" "$cloud_bps" 1>&2 output=$(echo "$cloud_bps" | tr " " "\n") print -u2 "$output" rc=$RC_INCORRECT_INPUT fi fi # Invoking Backup utility for creating Cloud backup if (( rc == RC_UNKNOWN || rc == RC_SUCCESS )) then print -- "$0()[$LINENO]($SECONDS): cl_cbm_backup -b $bp_name &" >>$CLMGR_TMPLOG # Always log command result LANG=C cl_cbm_backup -b $bp_name & pid=$! print -- "$0()[$LINENO]($SECONDS): cl_cbm_backup -b $bp_name & PID:$pid" >>$CLMGR_TMPLOG # Always log command result cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1221 "Backup process has been triggered in background with the pid %1\$s for a backup profile %2\$s.\n" "$pid" "$bp_name" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $rc } # End of "KLIB_HACMP_add_backup()" #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================  lu1+b}bb&a # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_backup_profilek   e=_ainorst "$CRcdglpuAEGILMNOST[\]bfhmv#&()-./12:>PUky%0BDHKw{}!+,39;Q/q伖JL f1z$W(08v" 8(@ AB D" _7Zs\ڡxOLa' &L1H?xNXHgC@e\t^CŨl ͽC1""ze19C`>" DsͼD@(|PAB"(0<_:5>ud'.5}a(`t,ѕV .k%0, @i!FIQ!\5L GHagTFW S RJ $03*"n4y&yba(d`XZ58zt>,"& y7oTC$0 G=U\e 2ØA{t3RDDp 8TQF4 Qy2\(Tc q!F ҲַE,LҲַE,$DL0˟TJ#Z̲y4HaQ4 V+)D Pj`p!'eDȊ&4A4!qyPEXQWB9[H*(51Ti$C@Pppp:c.c 8@ѠRZADH2ly$ 8TQjc@;@Pppp93: ˟Dʏ@AAC ʰ4.'˟層L LB 2"(~z,VVSzי}-\e#8e 2ØA{\fj[`L@G.$0@kc 4 /tc \"5Ó&*(ЀugE,LYy Ã#Ɗ£ALiBb4B\jwI35,L^ >t3RDDp 8TQF4 mԬO.*M1#ZYM[&Xe7nXH`#?d#JIIA`h\O0yWh8k^,9y|e0%19y"eFof=]&XC4qݽQ 4I*<#VqӬ'o̽AfX؜A{ԔMAffQJ|fj^#Hs Ҷp'9L8nި11¤F*Pɋat&4Lh0Xo0~2;I)o|| py(oU~2fMd;RfYm^n0C$Է-92Y1TzcA2Ԭt3R&Xo"&fNL~0V >M&fNLN$Fe[8F9JV̽AfXQ̽AfX؜A{󗾜*YNF.֜c^hNRՐ<ƒ 5E2ɍ 1g`̽AfX؜SQqyaG^|*nLV׺+jJ&3}a(~ð8R#\92bdƀqQRV0~IvN^^rV^O8 vKr&Xv0V >M믝윽iɖ);MIj޵PHl/[WLKMIFn* NLyc 8Ҡ`̲c@8ƃ eY+?*n|f^,s޵T8&\HadƀqQRV0~V[+}MJoZ`lJ&w/&z+9ꚋJ~X@\HadƀqQRV0~ eAkŮ̽AfXA{7zɕC6S)eAkvjNnFeǟ!QU 0d &HajVpʛ5a;RW7L"/PY3P^*7to찼ZɕC?i&* qA&(Ty2CRV0~ P7zɕz\K؜[7sUCreus7z֮8/'t}aNqDȊ&4AeL2Ԭ7zDȊ&4Aj>9/2z̯j`}[4W (+ڡǟ`E4$*νvnx+$ C?Xā¢(4h0Tܱ1Bɒ@Zskk\s/PY91s}a(E ڬ}`rñR "D8ճOez^7˜($sV0Xymxq ;I'$p&(Ty2CB5f(ne{'g.5z,>7bԁ)/ks:Ïʛ3]N't93:7zi\fSc^@W:ٺoல$ <@d#JI2 &HajVp)81^qW2c_ViU(Q<@cI$*<,1Bɒ@Z"d(+qRbV(^,f̯}IXJ8>74֔Sg(~T٧s]MXQWizcJHPw9t;պڕ@7Νeyǣ*)tW?߭q~9O6rQFg;TDKF-H&fU*򞤙]^2fRf*]$r'j R K^ԭ,3\pJIs%vqV⠾e^RKF-H5 ^>}W'y MJgZںQC<%kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkO <'$% <hĈ9/PYj 'ˢ%7 pSw|"h 1Rz}xSNZ̋.qiU̽AfXs/z,XJ!Sw2qU]xT_8D셭S.|_W_58qaK]7z d C4T%nɎF3P^Ï <'&Xfʛɋat;SbL2jeM(/ʦ| ֛g/).zN\7\V<$;3 .9Nz[RvN`R}gesu|)ji٫Yu7z **$:ZxOSwI@3LJQ^﬘kS55)7}*%o:ٺZOQsL8ZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZִLJQ G=U\e 2ØA{hF L2g\k1}AAah" Ex4*Um@d,Q50+ Vm4R Drn(4DMJ)@F4ıAzsҹUj=B+f^,ffv^% &"YӺ8Fj!(,1 H$44ՙFjjֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZP[5)ճP4;%.7jXE3^QZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkOHQ t3R e QbF OKZֵkZֵkZֵkO_[ӺIxɖ kZֵkZֵkZֵi5-0MOQw+FQl6)"97WE"G&%@d,=wҹ؜[T8K @L(DSIG(<$(*T^ ehA뮆`7q?m,XJ=K0`f Sw]у[ DMHɸA1 #^#SLbYW^$Խiɖ)wU޺ڡ^(baB'FNI"i5"HPTgN[A 4 [RQQ^wI35/Zreou%A[/PY  ](qjXX^4'^vN^+j=1F^(h#5„Ol6:5f Sw]у[ DMHɸA1 ï2td&Xx„ObppDta@SI$M4ƤU ?61ך+YP?ׁmtV=u‚ŴWQVt92HQ 7ẕ9@ ]@8K U:A{C ?j5pIM1pBO5 }o)YM[ ea'F޵/9yr`i#qAtR Drn"PqLD /M1,)HEnv ڻ'.5Hth^(e L`$0@L(DSIG(<$(*T^OVVSzKT j`E(04y@l^e{@5 $O p4bDE 8Z2Ԭl4e@@1 p& 4@nN(*CJ0DH*(DɁ V ̯hf ]MOVm4R Drn(4DMJ)t jiLK.$@4.e]1oYvBKļPFY @L(Dh-E"G&J@D☀z (/J x Eغ]w|y)\e7yAzVSRQ5+<eƧAHi"x8["(J޵2౉E O P D 2F WYYb!|y00V,a*0,H+NȎzyw^#5ՔlSIĉpLT03j(y8}WẕɊQ?Űqy^,f Sw]у[ DMHɸA1P+@F4ij!'j̜K"ѡx$0@kc baB'FN"|;bTI"@y<!xpf`7q?Eܭ9Eh@Pi]S0^#SLbYWk}a(iœe\ׂآ^v u^]y(QJzɕs/PY3SrT8K#Wk%10QM'$4W$(*T^Ű WFW/%XJ9r`i#qAtR Drn"PqL@D@G%54ɦ%bԁZ 5et*a|˰B(DQE^ Ak]\}a(i DP„OE4)84$D)O DeQCv+ҍoW7:g!k,[ cr?'AHi"yۜ tY9s&L@ 8TQ 5聛[ ҅0nD䆒'л˜tAs+=Xā¢(4h0T,/D V₩$4L00 QHiH*kE4t3RQ5- Gtfj]3.h-E"G&J@D☈(^#SLbYRfwfN\j%мPН}mWN&f @L(DSI$M4ƤU ?ׁ,/FjmnN(*CJ8\fj[c7q5-[C0`@y!nH*$Ե&X2kQv.]9xRA.Y,J,/D 4PU$)SwJxX_Z!|yX06?ŴB:.+ۦd``#YbTaXt92HQ <"j p_58' DY $LZ%L0`P=Utf)"97"(@'=גڒ8qWѕ ըHsR]8窮wI35-NLf@l^e{q, F+یAfX@]&Xj'V@'l/[UӺItj3$Ժ!RַP^F޵/9h?[* ]]eZ,9u7%Z,9u7%P._5^J>Z_5^J>PIy2s;-UԹsJGҐZ8- 2ÍNn* /PYjvqP] z̰(ne{j&^,:Y^.⣌AfXqae 2ÍN4 J4.SrUUw?RbVQ1v+ EQbppAAa *2O,/Fj`+tqATPT' DY $LZ%L0`P=UtfBHLdXfFLՆj&&DMH&; .x5䶤|UtezVm4R Drn(4DMJ)` ^#SLbX/jGeIDfo%/10QM' M2ijkZֵkZֵkZֵkZֵkZֵkZֵkZֵ?Kk5a#Mœp{n@~wY ֵkZֵkZֵkZֵkZֵkZֵkZֵkZִᩂɔ`#-E"G&JS0`@y!nHe19ֳktFk!91s.5MIRHiB`a7q?ŴLAfXq˩+ /&UC0`Vm4R Drn(4DMJ) "k&AH\kҲ־u]Wuג%кeҲ^,fx_5^J>P„ObppAAa '^ԔMAffQ/C ??i8I (S ?'(M +#qb"AfX؜A{"ѧ oU[W*)tW\\8K fP5-qy^,mn nKZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵiZFAn MIDfv)s"ۜ +`щLK5XX,b@QG $0@h3b)*/Rv ֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZ̰!JѨ8 "Xā¢H`,f03Zre5Mg^7HfjXa5-,:RnNT7 :.+ I$ԾYUc 8i!A`{7/8~2f'&&ϤM޻^ dᛞUqS̰*B^JZ놚1""IaaUچeA\= CzJuc=g^(hhWAVjpGFk0G ?wҮD,-J 8Fhn ȐHi"f(5"d" 8TQI  5щLKԧ5HɸB᡺щLK/Zre5ĽbXā¢H`,ax׮ʹ] Ľ`Q]#SUS؜#\47APXadH$43h2@[V[H*(ᤆ w_phĈN&fTjSњ6&&DMH&8P?5ZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵiX[issM[[T؜[#4Yka(𖵭kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZ aaz3Sktq $9 GFjmnNI"i5"HPTem ,%F00MOQw+FQl6)"97WE"G&%@@ L Gy3]_e{a(|U/\K4`Q ŧD Bc)%s52# S>;ZyDŽiW YxAhRQsO 6t\@=L<"q\.`^4Cp٩O.$D4.7z ^`CļP˟W2aNFE"G&DɎ$010@גΝՙ(3Q AAah"@y!: aqWqF$DQUWz̰'#P^<𖵭kZֵkZֵkZֵkZֵkZֵkZr5%א>Xԑ×ںRMI+xOJ*j7 fj¶vq-kZֵkZֵkZֵkZֵkZֵkZֵ`pJ3JɆ1*MX ^dJ:O kZֵkZֵkZֵkZֵkZֵkZֵ<^ lw1+kb|bb&B # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_cluster  =aeinorst #AEIRST_cdhlu"$.CGLMNOP[\]fmp-/2:DUVYbgvy{}(),01;<>BFHw%&*3KQkx|!'45679?WXqz+8@Zj^<B!`mQUMkL"A"k*Y8Stw7Yu`hW|_7Uf&&;??ج&p@NU=]APv pP`,`X`, k٭9U4 U2JYa*88 %PB  5@qœ);:]4+/3sR~Z`0k@)>m@H, e˚6H I䊬Yv_1g3wƏc$psT²΢ gVp^c$psTgH K88yB)@$jՄ氃t_Jd0鏔͎` 6q 56kM7{d$(\>4J iM Vfڂ%S?b]QYzHW ue6fVt ,U2JYa* `(2- dAlsF) ԫ^FrfZ.٧Ʈ%؄D6&&VN?;m1%pE"(@ r`2/)Dx\)|()y0H$$<ܘ fMH2W%I|Xvux<-Ŷ@0㭗fMHvH I䊬Yv_3^$Q%;]Bs7Jys9v_5p2eRʕ*x`<8pmQر5ea$PMP(*%QfJj]Ԩc.w[D=EQMd9" }(eiT*Q4RBh<($ͬ(C1˝#PD&) F?1;-AeUR) F?1;-@$YT#g~c.w[$ Y2 LTQ"dU"H矘˝ÐHE!*Bv,\$áG 4s؂)Hz P#b2ڨx<_1;-"AE (`Ã~c.w[E4)ATX9y !bM=<:pO`_1;-A5B&u(_1;-A&HʤI88p`0p`P˝ȈXhQM4CM97'!(D2IMy L0?1;-M%VAE **jA4TSHuc@X?1;-UdD&S(=H MHr6-Y<˚(!j'() t0]!W '<"1AqVo콌{MүoH6 pkչ̧P؅*Um.Q iT Ğw0w# kǴ*[i/u[3u+6׫sx+sGOjQ؅*Um.Q iT Ğw0vLe7J}EM]ь?5& fcWV_t™hTyEnb3`^=!Wt߹ 8EQ "EFf+- Oۣp;n|#8jw1A(!*QD(H34^QhW~YݮtTPxÿ;',Ԧ9$Z @xUd*QD(H9p5yHVS؅f+?aa|3t8EQ YDUTD,DE]Lzӛ&9ɳt;*tټܚ⼌ EEHNtpOɇvLe*Lb q3EAUT8+W7ZuvVA7$*D9z7J}Yuu2YueR =޼ wVu0 Ly$I`ٹX>dMf]FyɃЎRKՀNnp0f pV^w{9 ]ğnq{e՗빦1O&hRD/p-ʹ+]Yn|v16>5V]\'&ci4+ٶz˫/2+t0|XJ:,I|X{/[7fqDW:plZnnBe՗ ѧEl4T=2gx|) o}^^7/mua(6m:eĞmuJm`nM|Su9.s; ׁ=oؓUBri2$̛`PoI77&ۮu3P!3Fz6p+sz4&S cpyŇq]>e]t)S 0{eiui]u\qֻu8_?F,r3(fS4lIv>5ua(8<<<<<<<<<<<<<<<<<<<<8<78N2œwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwgznfSa=RqV_͙R}fT|k1[ &%ƤUpn|̩Z6eJgƳ$lʕύf++`H7/mabPXo #ɹt ]v9G{gx#)hO 8, .6`x .6kTiy`ѧ WNU5^F8a봳6jxU1Ȓ "4yDX iP-\-v_0*V"*MH HɌ 0@#79 4T  08{/\ Uٕ+CϻTxHgكO1H ݉E"hb)DE,[E"hx,X6ܻL `@(mH64XD<,Cn] EEQ"*EUCH#bQ~ }W fTEQ"*,EUC .&%5"&3 }W fTƀ^ oV_*m}tSL,a)ӌ"&sPc|k1^BD33;B;Y80fe=]2a#՗*EtR#՗W3;1^2aY~"t$Fz̦hrEV@894TP `q0~P$Q5IIyqqm<4`,p  2G.+#O$iЈksfTZ{yFaE j :}e՗dR "}e՗iO5ɹ+/7Үu^F 8,080Ҳ7IS]ioFx`7]:kTiy`P٪ TƏ"Hk(IMbJS 60j)IB0peJ5"' QRhGQ`xw y`I`qݝe끺/#LrnRn,kѦXJ'wwwwwwwwwwwwwwwwwwvw Fnri e;-L.PZNc&B!lʕ? @X08 8A ެ'T覙%XÀSDL7]ь#Fu_\dpaq.0v0WٹIp=Y~K*CN_ѹxPm0(h\`{/\ ү5(sua(OV]]Lz+ }W ]W.lʕ豅*V2i~p}32&Nn|h5I( >|JuD~!0ӎY©47Oy0Үi5k0pÿif(lcG$A5E\h$&%)@5$@a`ww 79 4T sO5L ;E8 79 4T^ zQSo뢚d!c',$S o}^^(f&;(g^MΏueؓU=˫Gyn^wХ@R- e( oɸY7ӫB >o9~}`nYusPf/h+&M43)W0nriw86鿫/ڒk }W fT7E-\-v_0*V4a8U;y7f:ӔzUe&N)miU*VO&n]17ҜmBcnj`6eJqe=]2a=Y~MүV_*V4ooV_Ws M+2M ̩^.4VљN2x2.0n|w9'- ^FKNm0+tX˫¼)՗&A(D-vstžg9޻KLNo6q_32ٖkWN"2o37ѐO#:/#Lmݯ#F64VF5k0 o ZM|*/#L0(lcG$A5E\h$&%)@iP{Ty l008&VPO54I`X 34D&Pa}[q$|18N2qwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwgq7xoE $*aen|\ 6(-.hXE $*aen|QV0+ @e0V `Xh Lz@£ucATq`&K,s&K-0.qcG$A5 A"d;{0c@wBfߛtksM}ݝ=v7# @t&Cϻ*m}ps^Ʀ=``Y2(6>R7}#cHMe0,AH$Ua7en|֋? Ə"Hk*H'}ݝgvMү njos3V)NwwwwwwwwwwwwwwwwwwwwgXkR7~`7/P٪ TƏ"Hk(IMbJS E4&՗6fc޽w57]t)Zh\ax`ׁХa2n405jcE4&wwwwwwwwwwwwwwwwwwwwwwwwwwwwg 7QR2a xg ;7t)Vyڬšm6\lλi z+ue)p*1Ρ$wwwwwwwwwwwwwwwwwwwwwwwwwwwgs_Ʀ=``Y2( zԗsQg,[ ɇ0`՗} 5%ѓY =IjKɇ Lh$&D$0(cSDL7"ˌ}0޼ fe>š7J`ܢɇ*84$y{Ng0AZUrpaq.0FcL>3ϻt7KGiUObp e\id,Mү(&dd N3 ҼdG/څ*8€n6.4oV_*m}xɇ,hd.w\i0Xld88 Yv_1Cf'S<" *G$A5(AL00 N0oHEwӄu3s{2ڮӄMbO/)#NsM h\ax GYbj : r+)7JzExDu+WeĞ!H0}6>nTe8>4YdI,d,%J(I 7!YNʐ,,QSo7TD64YdI,d,TL 9bTq*`7/뺏ƏTD<"w$"%QGh4N~9XJ=YupG}ݝ8 ޘɁdx$ w5‚A`IaR&2TDyBaCu5&jl\iPK 762a.0fDTR%y +M ѧEFR£? aFc&A{N78F@$)DC"<0! JLxn6kȒ ʒ*D?Ai!=y4mw F6kzcP7&'A>Yn| u1':{[(1]S{#F}^ϻ;qN"2@64D&S}VjK&N{@ˢ&zi*r(MdQTUb =E^Qb̹w5H7JaVa5(7ҮVz8IɃK艿 @y"*5h ;;p@#5zcP;7{+t4Ю꽀0noc]WliLH I䊬}^7Jx<-Ŷ@00;;p@#51(Yv_<{Tymao]n|۬`dn3#08#<뙜ufmua(7Sco^+8`<-Ŷ;3ڐ}[V5A<`ٮ34 "4IwVh 8_?F,r3ȤX$EVs ,Mү 0@u l,y1+:Ab|bb&/) # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_codter   =eainorst $R_cdhlmpu"1ACEILMNOPST\fgv#&(),-./02:GU[]bwy;>BDHV|!%'*3456Kkx{}+789xjx䉑*<QSCS`HAAf䉑*<QzstgAOİ zM(=K:V[;D"O?\d?*/ ~MDZA/ 8q\OpM[)aǟXvXEHqLTs$L[s,|<սρqIe1q vGF00?v -;<սR{7)3ssU?Mt0YkqeWK,\"ɤ@u3zm3+|ճ0E a" εfot\?̪gZ7\̭N.X®M^L#=-7A  a2KQɶv`Nyx)a#|t_>%[>Mm֠f^h03)8Ö[@r1N,qv2Nn;|վ7(3920WH 96~8e<RÏ?s$&qLTs$L[61cq^ | F ܤ{,. N(b|egyG ^/f6nyj[Xag&ٺ? -q?̪e$Py4gZ7z87[ HD$HVfKϜ0p`Ny͗rŦn6nڶW!iv,AZy` 8C1, ],VfKٕUɫɖgef?;9nqesn%[Sb0N'<j[W/yqInOfu?03)8ÖX:ܠS`m8Nn;|վ7(3920WH 96~8e<RÏ?s$&8*XE&-?Ⱦwjuћ-[ \RYx \A2Qь#9ejA6p5o|^7mt0lZU2HiZ7z87[?CR0I VfKϜ0pʮu3{ R* B3ڲMt`Nye7XvLx7?'rs^ XqH5]-ρ6Z@K|'ɳt b e;\Grsh|nPf)r0e6FO|^ob#X5yXag&ٺӃ,ǜ6V XqҶh2(S-1e\oRiV1qlale;x2w)ecpջaV˂iڇLZn6S ;ԅ|'L3to{"\eѵ7=g6Z% ޥӝ3Jg%mjNplWku6}+mPv@p!0iI L;7A['>,SUϹd!,0D@pYmVrѹ\NڇI3#"8˖WljjA6Wͳtye~$ H!ÃraPnA8\< UxL- h I8(%C5Z6Rtm(10 UHqC&+r1.W=0l8e4 "hhx"X\ei)rtmJ@C O+&ڲK 1.W> M˵da@ O+&ڲL3H`xybsܻVH O?TW@2hL"}Vj ?2XgZ6-_:ՙEUUUUUUUUUUUUUUUUU%-57=sVp b拭r?"+)HPT1.W<5$$T< bEH<?c,\xkH$H8y2@ċXBI08y1B41.W<5$$T< bE,A!AD 2a$Hd1 pbLPX\hHPpdD 2a pbh <IJ `vn۩fSMfe;vV 8>n{7:j}UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTt2EH-DfS,۟jxPV`-hHL<շH$P "\PaAUUUUUUUUG`;UUUUUUUT~*+Mtp|jfQsԓ - &t(&E cM<(DKna4^fSb0:-@O4PHNDE 0HD2+?:@"JdiG(]'I 9zMa\Nq5rm,i7h։  D,,[y!xzaye@A4R0D΁eH3iEȉfÍ!#Cu!r alyð=Ҙ i7Xag&ٺI8>q\FA"'(Is eH: E"c hrZ0l -qxp($D2\Eֳ *Dl &H4yYҚMa\Ne\Eֳ8PV :,uTA;:?Q]AZ.`GkEDS!a`XX[yEϞȎ4uYXFmEϞȎ4iNDEKH* &ڲL3-bcEpAv<$'B M˵d-bco иa`jfQsԓ - &t(&E 4ȢdDÕk17.ճY `Λ^OfWrtmMk;kfy2، k… HD$H5ٔ{s Ұ44,8A"':A *@( e"EK?ۏ6͸ij>jލ ;17.j`WuYYsr[ajoԹso Њ}V K 歼rbuYf'YNfV'FśŅN㱸<Y5@i⢸k ܻVI{_ ЃrY%|@8@CBu1:&ڲKpx?\EpAvl3Avl3b!:e SЃrY$dnbt717.Ւa ЃrY&Z1ao ,nƄj0 1:?TW ~jcBt ܻVH X,-K1:ЃrY# x?:Yi>xhn5T *Da`  X0Xɫ+65rm,,\A2M 14bcpP) ɖ?5VWl15rm,j bh.Yf&K13 G>xhn5T *Da`  X0Xɫ+)Ln  @A4R2P2gxPVSH$H8y2@Ċ(8y1B8XX' *Dm5RL/#l(&F L)0&c8O"%bn]m^ | XEHzxei@8D 4OH$HȢD.(dg‚"UA"EAɒ$]*HɄɊ<շ@ LR%Kiaye@A4R0D΁eH3qEK"%[ܻV#RslӖXEH^2/{uZnakoi7DOt$$TdQ"@D2yAZO ".b $d@a`j N&HII0a L)"g@2hPxO"%bn]oeq{{w)96^ ,\"ɤ\P/]OֶxpͼWw)B9GP{EַܤVfM[5ZaɋMjy  YH2" xPVSZ B1yo?:@"JY%$9@2h` Cf0xO"%v'mϽwbn]&8<\Eܳ37Vئs7憀&[tY6;i74֨U X$7eH%ʏ(Dn8"y@QcPcqƠLR%K ?76b<2/ShL- h I8(4@ l{1+Rb|bb&4 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_dependencyilek   e =ainrst"$/LRcdhlop)-:ACEGIMNOPST[\]_fgmuy#&(,.12;>bw{}%*+04bCY0P .$=2lAc(H8 _"B#*\tm}Xb`XfيЬZƋ2N+8[_C.; -Y]7jU' ڛa}9 ʕP GpNaa" Wk& 6b$M,} ,r q{nd!`3b l6iPbCh {{{{{{iZk4|ʶe}SZ$&16.]X3fӵ[_FB'\{{{{{{!k*U F"vq^<6CpX 8%{{{{{{ ܱP`íL+[_]VR 6'bԨ5?͕[$ Pq2. \>+[$ Pq2. \>+[1fPA'ip*}PA -X-{[w YBp\;(8;$L.%bv.HG;["Բ\ph)ڐr"յr`0ra  ݩ W$zIp4 Bc>RT3VٸR5,!lY0P .$=2lAc(H8 S82۹/rY'r1WfO׶KܖCwXr x.gCsNǃI( z 2 \D444.vb϶ KܖCҰSZoŻYu%0TDʘx.gCsN&*\ڍ- ũ`nd8Z2ЬZk2|.r^ӿ㉐xB;"PqbD3!2 EihV-K[w%K!*b2ЬZk2|.r^ӿ $$ P…A I\xMWZӸVhK.j|4i5ueX-{nd!v M 2TEJP)J2ѤZit, pb1fihV-K^۹/rYg /B{<Үa:onqjq;xʷ3a[̕,`R7Rw/fV6Jjw y鴁uke˄JL+mܗ,3D!|e[^0ꁽũƨC\'*X"(og6 ^mڕO>ѤZit, pb1fihV-K^۹/rYg /B{- *V s V̕,`R7Rw/fV מH+Ŗq+VnwՋݭG&*;H&\'\R (9Cx+8b`%l y鴁BYgkksn։#GѤZiav v`Rɖ98r^0 R4f1 ɀ@S.7H wK'rM3H*nub,;M3H*nu d4b\@)4"ꅻb'zB 4"؉l؇V.NM&dlc)=BdU8\!"eȗÃ:&AUJ7f+27kDm|S"4 "7"4 "jF\q2)R8D(=頤^e4L 1=BdU8L f+27JjH* $`8pP{TyEUR$P8ÿɜdB8iHlwd2ZFaAZF`+ (T@"\ǕQB$Tlۿ頤^e4L 1=BdU8LxpvURmܗ,hT-i0qiS3.Fhj_'Yq+j7ծ ѭ{;_ 4#[4r^R2n ũ#yb!AIQ*U]v.wNL%H(+tM 6os&q'J?xPV2ZG6!ՋAI%&?CiPN cHzȪpr%R UծX 314 ~F^#mܗ,3 wwj_mܗ,>įvNV/.8$KhԿjy| מH}+_Fh#^ERV i8pP{Tyd$PE ;\̙KH@0#itWs&FѸ-cM͈ubRiFIF2C&ES2*&\|8jDTzm7sbԹ3ubH%CHg$R5$r*/k=%G&HrE$P8ÿɜd0G-(ʷ3a[!dhO6o ;2gH< ~ *G0HDsfV.NM&dlc)=BdU8\!"eȗÀmR U^۹/rYި[ `IP;gp]%w.;\4Կ%\N,ɪW)&o\Zv2Wӷ;y4:{MK˫i+jFF#k=%G$PyUU dNif$tfg~_5wwPtjFw(W$LcJ^۹/rZ7M{mHҮ:/q(iS sbAX vdΐڑLb 8x*@r >lԫ NR wK!E#JJ&]!H, 26klذ83)bx8i7 mٱ\K`T-.)UzJ(@\ Pp8y2*rwFMk=67Ng*O HZB3~_5w,9R  $1nnqq4R2(TZE*P\X hqJMffy{nd8H<H!o4Mw*Gib,;QDR2*0LHN98!G>~^H8`Y^۹/rY2) 2RnUb),Y^w$]5ws3~^H8`Y^۹/rY2) 2ŴRa:oE(g*/mܗ,Tx)"" Te*Gq̉ 6Z=Ty/sY*<U*ae K0@X(TxW3E HX)(HM\ō$tfgKܖCi42sHzm nGHzȪp2#8D-hIz; hqJMffy{nd8`X8cH@wz@2{uGҚ")PN&YB|'Ȝe? /聚,/Jk`+G.~^H8`Y^۹/rY2) 11Iad[E(ʷ3a[GhBhk= WEffy{nd:MdqL ,R>dNift@]5@|X(+IQ*U] 84bQkѳ= Tr4L "_mR UA3%g$bw;ݭMHԑÄB5$\"N(XaAgMmpW/ AI%&?CiPN cHzȪpr%H5" UQXpZ۸NZ؀B6i8pP{ {{{{{{{{{;AK6mO5mp͹ѣlu==tZ{{{{{{{{{X^Q .\B' ,1B:S[{G$PyUU 3Z&WBfLuR / hMH)GPk2|0qiu8HԠnrb'zyf`t4'ͩ-l@!xܸʕ,dh٩E hqJMfO1pE4bQg-fOE.YuJ.^h0CkPR5$sNF mܗ,: (<5L *TA#\Z$b|bb&>$ # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_efsnden#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r721 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_efs.sh 1.4 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)20 1.4 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_efs.sh, hacmp.assist, 61haes_r721, 1618A_hacmp721 4/28/16 05:58:28 #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_add_efs =head1 VERSION Version Number: 1.4 Last Extracted: 5/3/16 18:54:04 Last Changed: 4/28/16 05:58:28 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_efs.sh, hacmp.assist, 61haes_r721, 1618A_hacmp721 =head1 SYNOPSIS clmgr add efs \ MODE=ldap \ [ PASSWORD= ] clmgr add efs \ MODE=shared_fs \ VOLUME_GROUP= \ SERVICE_IP= \ [ PASSWORD= ] =head1 DESCRIPTION Attempts to enable EFS for securing file systems. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. mode [REQUIRED] [string] The manner in which the keystore will be created. More specifically, the location; either "ldap" or "shared_fs". 3. vg [OPTIONAL] [string] The volume group where the keystore is to be stored. This option is required for mode "shared_fs", but does not apply at all to a mode of "ldap". 4. service_ip [OPTIONAL] [set] The service IP that can be used to access the keystore. This option is required for mode "shared_fs", but does not apply at all to a mode of "ldap". 5. password [OPTIONAL] [string] The EFS administrative password. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_add_efs { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_efs.sh, hacmp.assist, 61haes_r721, 1618A_hacmp721 : INPUTS: $* typeset -n properties=$1 typeset -l mode=${2//\"/} typeset vg=${3//\"/} typeset service_ip=${4//\"/} typeset password=${5//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN #================= : Validate input #================= if [[ -z $mode ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 200 "\nERROR: missing required argument: %1\$s\n" MODE 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "ldap, shared_fs" 1>&2 rc=$RC_MISSING_INPUT elif [[ $mode != @(l|s|f)* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" MODE "$mode " 1>&2 rc=$RC_INCORRECT_INPUT else typeset -u modeUC=$mode case $modeUC in LD*) mode="ldap" ;; LO*) mode="shared_fs" ;; F*) mode="shared_fs" ;; SH*) mode="shared_fs" ;; *) /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 '\nERROR: invalid value specified for "%1$s": "%2$s".\n' MODE "$mode" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "shared_fs, ldap" 1>&2 rc=$RC_INCORRECT_INPUT ;; esac fi if [[ $vg != *([[:space:]]) && $mode == "ldap" ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 36 "\nERROR: conflicting options were provided,\n \"%1\$s\" versus \"%2\$s\".\n\n" "MODE=$mode" VOLUME_GROUP 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ $service_ip != *([[:space:]]) && $mode == "ldap" ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 36 "\nERROR: conflicting options were provided,\n \"%1\$s\" versus \"%2\$s\".\n\n" "MODE=$mode" SERVICE_IP 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ $vg != *([[:space:]]) ]]; then CL=$LINENO KLIB_HACMP_is_known_volume_group $vg if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$vg" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 160 "Available Volume Groups:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_volume_groups available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND fi elif [[ $mode == "shared_fs" ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 200 "\nERROR: missing required argument: %1\$s\n" VOLUME_GROUP 1>&2 rc=$RC_MISSING_INPUT fi if [[ $service_ip != *([[:space:]]) ]]; then CL=$LINENO KLIB_HACMP_is_known_service_ip $service_ip if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$service_ip" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 156 "Available Service IPs:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_service_ip available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND fi elif [[ $mode == "shared_fs" ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 200 "\nERROR: missing required argument: %1\$s\n" SERVICE_IP 1>&2 rc=$RC_MISSING_INPUT fi #=================================================== : Enable EFS if no input errors have been detected #=================================================== if (( $rc == RC_UNKNOWN )); then typeset mOpt= vOpt= sOpt= [[ $mode == "ldap" ]] && mOpt=" -m 1" || mOpt=" -m 2" [[ $vg != *([[:space:]]) ]] && vOpt=" -v $vg" [[ $service_ip != *([[:space:]]) ]] && sOpt=" -s $service_ip" [[ $password != *([[:space:]]) ]] && aOpt=" -A $password" print -- "$0()[$LINENO]($SECONDS): $HACSPOC/cl_enable_efs$mOpt$vOpt$sOpt$aOpt" >>$CLMGR_TMPLOG # Always log commands $HACSPOC/cl_enable_efs$mOpt$vOpt$sOpt$aOpt rc=$? print "$0()[$LINENO]($SECONDS): cl_mkefs RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 40 "\nERROR: failed to enable %1\$s.\n\n" "EFS" 1>&2 rc=$RC_ERROR fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_efs_attributes properties fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "add efs -h" "EFS:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_add_efs()" [  k,~1+Nb|bb&N # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_eventen#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_event.sh 1.2 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2012,2013 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_add_event =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:42:01 Last Changed: 5/8/13 14:25:05 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_event.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr add event \ FILE= \ [ DESCRIPTION= ] NOTE: an alias for "event" is "ev". =head1 DESCRIPTION Attempts to configure a new, custom cluster event in the cluster configuration. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. event [REQUIRED] [string] The label that is to be applied to this event. 3. file [REQUIRED] [string] The executable file for this event. 4. description [OPTIONAL] [string] A description of the event. If not description is specified, a default will be provided. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_add_event { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_event.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset -n properties=$1 typeset event=${2//\"/} typeset file=${3//\"/} typeset description=${4//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset existing CL=$LINENO KLIB_HACMP_list_events existing 2>>$CLMGR_TMPLOG #================= : Validate input #================= if [[ -z $event ]]; then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 '\nERROR: a name/label must be provided.\n\n' 1>&2 rc=$RC_MISSING_INPUT elif [[ " ${existing[*]} " == *\ $event\ * ]]; then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 229 '\nERROR: the specified object already exists: "%1$s"\n\n' "$event" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -z $file ]]; then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 101 '\nERROR: this operation requires the "%1$s" attribute.\n\n' FILE 1>&2 rc=$RC_MISSING_INPUT else if [[ $file != /* ]]; then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 106 '\nERROR: the specified path does not appear to be in absolute format:\n%1$s\n\n' "$file" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ ! -e $file ]]; then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 107 '\nERROR: the specified path/file does not appear to exist on "%2$s": %1$s\n\n' "$file" "$LOCAL_NODE" 1>&2 rc=$RC_NOT_FOUND fi if [[ $file == *[[:space:]]* ]]; then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 108 "\nERROR: the \"%1\$s\" attribute's value contains whitespace, which is not allowed: \"%2\$s\"\n\n" FILE "$file" 1>&2 rc=$RC_INCORRECT_INPUT fi fi #========================================================= : Create the event if no input errors have been detected #========================================================= if (( $rc == RC_UNKNOWN )); then [[ -z $description ]] && description="$event, running $file." print -- "$0()[$LINENO]($SECONDS): $HAUTILS/claddcustom -t event -n \"$event\" -I \"$description\" -v \"$file\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/claddcustom -t event \ -n "$event" \ -I "$description" \ -v "$file" rc=$? print "claddcustom RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 201 '\nERROR: failed to create "%1$s".\n\n' "$event" 1>&2 rc=$RC_ERROR fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_event_attributes "$event" properties fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "add event -h" "EVENT:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_add_event()" nt ld1+DBb|bb&* # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_fallback_timerk  =aeinrst "$CLRS\_cdhlmo-/1AEGIMNOTUfpuy#(),.02:;>DPY[]bgkvw%&346BFH579^`1_I< i.iɚ\>>uxPVNrӧg :3C,\ C78RbcOl8m›;!Ӂ>X ~ vUk.&`rSc*b?PvUkji.B}tl!F`a勘$ըf BLCtVLi휇 SX ip}iP͗]K*\LB刦-U&,󻦺 eV.Fb'ѧN6/2tf XAZnp$7Muj4ƞqpq7V^p7֛ʭ6t0`fήTL[LX CewMuj 3 uj4!>:qqxqӣ0d03s!&!kQ4Cی)\>Ά~m:rx E b`1 am:rxPVNrӧg :3C?P(!!lV2!1c5 a uj4!>:qqxqӣ0d0=P9:cp6aX1X2!ըnX-Wv5 ^C1 P!(Mݞ'82~1Q->5Gv_W}CH zE(Lc)*r}b 9HU5BNf qxpwwwwwwwwwwwwwwwwvN!\tyhKEp+$K^$ /"&H^-xe;ș'z.$SHW*\zHx{461@͆Rc@.U "nae^t, 9 $adN aeبYgFĠ ?*h"TcPNP%q nT52E0$l 2D=RBytex$ ?M9 "YtҴ@%p+oV847 BT]4T?M9DMCt) ʑ]4Ep+oL]4$ct) )Ve3t) ș&iZ$L?M9RBk!3t) ˤatҴK`7 BJ,\ ?M9HK$I#t) ,$DR J $$XDE/02DE/(PH0eA""N!\HHx{461@͆Rc@5NI *yг!F^t, 2yг yаt΅/:78ʸU _8=S%eK")2IQ""HH%DfTTHPMR& $DSPSt) 2XHhdCt) ʗ,$DQtҴJ,$DP7 BI*$DQtҴL$Ct) BE*$DQtҴ@BE*$DP7 B**$DQtҴL̨Ct) "(iZ ?M9R& $DQtҴU"`ʂDEp+㲫V85㥢㲫JxV#kqUk>"b5 Ņ: XHN㲫Jx0H'qUk<v!ըHeVqUkob8Ɇ3 Vp^^30vp:.Bhh"V.BcNJp"8:2 ŢK,u$2`Ma!: pEb&:%H rJ]2EABZfܠ:)&THƊI&U&@ p(usl] "'CFtlv7:`Yi{5"%*It&`@DشTIr.0BfLj'X8hZr/fܠ:)&THƊI&U&@4$in}bNCYAogsbZH`TC.T,Mr̘<7XN"b5 Ņ: <&<^2 Au4RL5T*MEʪM\IE COn,Ol:53vz,@?@4YŤ̩NHqbQ%HH 0MbdrŅ: <&<^2 Au4RL5T*MEʪM\i IE ըt&s9Z #EZ"+Ťʔ,d,$8hJ*B(XLɃq50x f#xV,,!ըH)1hm ceIhRj.URj-"J(]@2{qg{g!ӳ@Adh呢-%Tc& h"drC " ?lZ*$BQBI\a3&5TW-|H'D<^BEECوj,, uj?yLxd=rhRj.#)&TT HP?Yƞt7"j0g4Y, 9dhIi!"'`6-\d$.P*+>x ⢸㲫Jx 8ήvUk$x{461I2]RF4RL5*5r7AiQB  4Yp#8SP:nCd@4 ZKI P4 ,`\9r6-\EU(X 0Ma!;ʭb7AX$F/:qUXXCPRc!۔SE$ʓQuII2\`IE  d9NC4m7 n]M@r1i-$2DE.\rHqbQ%ʔURP*+/:Ual Bv^uwM.7 Fuj?yLxd=rhRj.#)&TT HP?Yƞt7"j0g4Y, 9dhIi!\9p0 +A^uwM.7 Y6-\d$.P]ݟ8>3Omw3.B|Mrw iP l°bdk ћޢK,.‚: X:Z'`Zr/fܠ:)&THƊI&U& Jp}c!ػ!>>0r;& ?*h"*e ,\X%I$\A &LMQ7X uw쳎옆:Z58>x4\vUk΋/:qUsZ-:rx.FG+1RL50TM2#"mэ\qf"dDu[q::{b:Z5;vsEeVs:,]eVsZ-:rz87XHN㲫XPPV#ǜNjC١(1I&1eIUI Nd14{=b'է׀Vl``b@shHP),Hq`U$rJș0Q5Gb&ms:y>mKFr9㲫XtYy4ʭciӓr29X!eIi'vnl:㏓4?y& &\ͺX;~Y?lb'qUc΋/:qUc֋N+dr? *+/:qUXXCPRc!۔SE$ʓQuII2\à Nd14{=b'է׀VvUiI28v!!BP"łQTE *"dDu[q8;*tk!LAL(nr6q`9gXOelb'iӓ?t\Vb#2 .Bfn,H?Fl!eIi'vnl:㏓l5 f呢qVm`X ZKI c{,b`ezO) "(Th"eIɖ"THqy0SPcA!!Hh"Bċ@§'-<2Rgtր@j)]첹ػ^r @@i{ l,1+ub|bb&K # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_file_systemerk   =e inst"$O_acdflopr12:CEGILMNRST[\]bghmuvy&(),-./046;APUz|#%*3589>BVw{}!7DFHKZkqx'm0(K.X G;X9܆AcGG;O9k"\3 XO9kPX5 [bŹ!vݵl%CrkE`7];r7Z+~ h&\ s4rfqO(ۻlc mg'.bY S6ycr 6#l?rsPB7S~&c 2MB¥fs8'/m\<'-x3 cCN[Z"yoAg:w h6o3+عۨ!~@bH;@j hi ~ ;:wi,Q厣߀JPn2(,dJJq.r~-eۼH;@l'6k0 v PcDHnCB8[a; o vcn-# {`~ۓqiAc$,*PjW32~Z]ч;m-;c@m?*۷ۍ'Yv9k[t.qHA!ܐ-h$0cŝW˰6C87y\hz ?q: lg-hc0-h;v\g-.WS{֭P1 sYTO4j(s5+r׃0s>`EMd5 N ;o@#5cZ,mA'.nlgQ?{0j#mmŝBb4n^ۻ-\ѹr̟li [H=,,-4nVnyиP[nN DŽ=A# '֊5|vA~4H?uVٖiAc$,*PhmkDv;\+jrpn;-%G) ,`0=,,7l7u֋H~rpn<%j aLq>WS{H Uem g(,dJmh8֝vk;=H ]vpg-5|v7bY SOsoaAfƉf܇l7Gr{(dg-'\[fE{aH;A &ǐ\f1yPC#30ar~`G) V<>PΣ=5(D3ǐ\gliM,HD'G;fM6 5iso;z4N~ll;hu֏+3ǐ\gƎ ƈ vĄAysكWh knRtm!9kz.y|1{l4pn4Dpn۸ fuA l˛x4L=,,HD&Ǝ ƈ "?KmZGY1ۼXY5v8VH;A Q䫖갋l^iAc$,*PjW32~Vgf _$r 9܃yBع⻶(ۻlQnl[ʼnlZҹs?|ۚqB˄u`տH;@j hi ~ 87"8H7"$ ĄAa0h4pkh($`L  ACD@Q~4M[BⲀ2MB¥fs8'iZpn9'[B( ^Aܹfl#lnʼni eu`G) em!~m4F=cXU]im ^X,O.OXౣq#q"@HD&GD@'4L~4Dpn8DHDp`hh($` ?"$ ĄAa0h4pn4L  CQ0`n& HD&GD@ 8`X(L7 "{ 54K4?DpPLIƃC=iTM2MB¥f7a+JpAu6ͽwmi3;0j#0D?&^ aAu6ZӶiui{?k07.Dȹr~"?}n۷sl s?{n[N Y-geͼȯ;wHW^&PhlYusKmuкpnNZfɴ.{ ܸ>Jan붅8<춆,? ݰ1 8E3+KA JGppn8h *G ;cG Ǝ8aas&^rsãn[ʓrsكVv 6MFm(-SζL$ 6MF5I ѹrc ʓ  ѹrŪ庪tHL@@B7+庂0 m!˕kmʓ  ѹrZmp-Y@b04@@B7+%YmZl&" m!˕τZmV<1tHhi4n\xs]UiYm N  m!˕kuT BUCAB hܹ\滊ZmRa!B hܹ\! -U]1"z H@&rsuc.3VPL$4L@@B7+uJna!(o7.W=fmuO:. H@&rslYQ6ID {h֙IT,K `gaA\xԋH ,k]h0jY,uUUUUUUUUUUUUUUUUTrsá&\倒b7.WWyMh북nRs<49&\Pr$ L ?obN :Zd $]SL(TuJ$c"7HH.q[n[N v0v 69gan)f@8h8(sؓ${IT:d $]R ZA%CrNFn)i\OSZ,,q۔%e*TTaas/fg4kM4&B9JL2K)% HVT ag*6=iTM az`ːTL9 ahi Ts8pSvb!a(L L Lɖ]ZHlYQ6aۙ *G$]AqaK P"*,QBODHPZm Z`@y2 RiM4&B@" ysH ArrEcvb!a(L L iV,`SMAuUm!Az&BζΫ6hi TpI`rd $]S%E(Ii Tr "m(-Sζ8PR9" FŗO:)0&BN,8p38pSvvYicYp&كn6g!r Pʠ:gڕ~Jmn?z&Bζ4MyиrsÅtGm?JL2K)% HTTMyиӛ:w-4Myй<,nK&@RE2TXعRa$Gm, DككsF鴉V[uV=8)g4kMJ۪"e,E,Ng/ R(L`IB`@REF*.Jm(/MJ۪,/L`%e*`\& a_ĜA#t*H P"0H4Dv.]BiNFnŹ86a)n)i&%YmZlXpP'H-2 .&t*HL1DXWlY HP\{˕Yic[,DP=P TQeZM4&B嬉h4֯(P\IP\ZDHPZm ep")h4֬$LS)h֘IdKAfV 4h|Y{pfp3#<9#sL$%ZIM'm;B;I'2,@ufffi6{&X2R~35ڭ6yY@bh8WكWhh1uՔ/8s δZА4MӚ7-Vs9H֋ :[0j#Æ4uc.3VP0V<5e!hÆ4iTqY@b0fmuO:.4k:w%\U[b(+:w%\U[bHD&j iKZNg> JKf _$rXpƛ.yjpǐ\f1t 9ak4kyи1yØPVM6m @5 iG;[-~pG;[-t 9 MQIaknRROh֜ѹjUPNs9HΞ`G)5 iM[BⲀaAZ4u.+( ] ?Ѭ8cL9ܕrVm09ܕrVm!h-nQʒÖγSu `ꪪ?&uݖ}dWם<a-rZpn/UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU? a{Yr K(a_4n\y$G'IaȰfIhrtZrQI`:NÀ|[9:I'+vJ9:I-&ҎNKiNKjJ9:I.eG'I$rs-e$lG'I%G'I%ǔrt\N$$˕aG'I$ѭ9ri~'8pSh֛.yj`Fŗg s?q.yjBB 7ѭ4MyйB'^ǜ89grt{Mm!Aju.$FU?pQXr,ِh֛0jՒ9N`%`FŗyØPVG'Ia4كVv'50HYC?‚1䣓@b41rA J X X$,ѡqeyÁp4ܷPBRqXNÜFrpn2J!f/c 0&ܜ6ܜZm"UU`%`Fŗ~pG'Iam6z+ MJ۪h֝cZ̺$w$‚fJ9:K[eHI? abYuC'9ѭ6! -U]1"{GrK0j9:Km23G'IaOf4kNjZl%`Fŗ~p%%-@b8EFiӸuT BUJ!f/c ‚1 sYG'Ia`b'qXV&eՏ Y@bHYC?0V<]X&˫AqŤFΣW-aؼh8<‚r 9:K[!IG;[-i?ѭ5i+DŽe5j Mvn&L2L@y8#iamHA ; Z: <鴃MVOlm @i\#BN4;c7qK6a5jh0isHd $]Qb,*TXpP* Ui&i&"e "YD |XgH (L*@0¬VH;@UUUUUUUUUUUUUUUUUUUUUUUOOm4F<P[u{lB'5α,"~%b4P[EUUUUUUUUUUUUUUUUUUUUUUU<X۔$>G0bgH}-&@^x Mh kP1+I(b|bb&I( # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_filecollectionk#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2018,2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_filecollection.sh 1.9 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2013 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_add_filecollection.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_add_filecollection =head1 SYNOPSIS add file_collection \ FILES="/path/to/file1,/path/to/file2,..." \ [ SYNC_WITH_CLUSTER={no|yes} ] \ [ SYNC_WHEN_CHANGED={no|yes} ] \ [ DESCRIPTION="" ] NOTE: the aliases for "file_collection" are "fc" and "fi". =head1 DESCRIPTION Attempts to create a file collection within the cluster that conforms to the provided specifications. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. fcname [REQUIRED] [string] The label to apply to the new file collection. 3. files [OPTIONAL] [string] A list of files to be referenced by (a.k.a. "included within", although not literally!) the new file collection object. 4. sync_with_cluster [OPTIONAL] [string] A Boolean-style indicator of whether or not the file collection should propagate its files to all the cluster nodes every time a cluster synchronization is performed. 5. sync_when_changed [OPTIONAL] [string] A Boolean-style indicator of whether or not the file collection should propagate its files to all the cluster nodes whenever any of those files gets changed. 6. description [OPTIONAL] [string] A description to apply to the new file collection. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. function KLIB_HACMP_add_filecollection { . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_add_filecollection.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset -n properties=$1 typeset fcname=${2//\"/} shift; shift typeset -n files=$1 files=${files//\"/} typeset -l sync_with_cluster=${2//\"/} typeset -l sync_when_changed=${3//\"/} typeset description=${4//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -A tf tf=( [_DEFAULT_]="no" [true]="yes" [false]="no" [yes]="yes" [no]="no" ) typeset existing CL=$LINENO KLIB_HACMP_list_filecollection existing 2>>$CLMGR_TMPLOG #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= elif [[ -z $fcname ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif [[ " ${existing[*]} " == *\ $fcname\ * ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 229 "\nERROR: the specified object already exists: \"%1\$s\"\n\n" "$fcname" 1>&2 rc=$RC_INCORRECT_INPUT elif [[ -n $fcname && -n "${fcname//[a-zA-Z0-9_]/}" ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 105 "\nERROR: one or more invalid characters were detected in \"%1\$s\" (\"%2\$s\").\n\nValid characters include letters, numbers, and underscores only.\n\n" "$fcname" "${fcname//[a-zA-Z0-9_]/}" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $sync_with_cluster && \ $sync_with_cluster != @(y|t|n|f)* ]] then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" SYNC_WITH_CLUSTER "$sync_with_cluster" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "no, yes" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $sync_when_changed && \ $sync_when_changed != @(y|t|n|f)* ]] then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" SYNC_WHEN_CHANGED "$sync_when_changed" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "no, yes" 1>&2 rc=$RC_INCORRECT_INPUT fi #=================================================================== : Create the file collection if no input errors have been detected #=================================================================== if (( $rc == RC_UNKNOWN )); then typeset swcl= swch= if [[ $sync_with_cluster == *([[:space:]]) ]]; then swcl=${tf[_DEFAULT_]} else swcl=${tf[$sync_with_cluster]} fi if [[ $sync_when_changed == *([[:space:]]) ]]; then swch=${tf[_DEFAULT_]} else swch=${tf[$sync_when_changed]} fi print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clfilecollection -o coll -a \"$fcname\" -\"$description\" $swcl $swch" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clfilecollection -o coll -a "$fcname" \ -"$description" $swcl $swch rc=$? print "clfilecollection RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 109 "\nERROR: the operation appears to have failed.\n\n" 1>&2 elif [[ -n $files ]]; then print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clfilecollection -o file -a \"$fcname\" ${files//,/ }" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clfilecollection -o file -a "$fcname" ${files//,/ } rc=$? print "clfilecollection RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 215 "\nERROR: an error occurred while attempting to add \"%1\$s\" to file collection \"%2\$s\".\n An attempt will be made to remove the file collection, since it was\n only partially created.\n\n" "${files//,/ }" "$fcname" 1>&2 : Clean up the failed addition print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clfilecollection -o coll -r \"$fcname\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clfilecollection -o coll -r "$fcname" typeset -i cmd_rc=$? print " RC: $cmd_rc" >>$CLMGR_TMPLOG # Always log command result if (( $cmd_rc != RC_SUCCESS )); then print -n " " /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$fcname" 1>&2 fi fi fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_filecollection_attributes "$fcname" properties fi else /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 201 "\nERROR: failed to create \"%1\$s\".\n\n" "$fcname" 1>&2 fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "add file_collection -h" "FILE COLLECTION:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_add_filecollection()" #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ ======= kN1+Mb|bb&M # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_groupll#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r721 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_group.sh 1.6 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)48 1.6 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_group.sh, hacmp.assist, 61haes_r721, 1618A_hacmp721 4/29/16 05:30:52 #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_add_group =head1 VERSION Version Number: 1.6 Last Extracted: 5/3/16 18:54:15 Last Changed: 4/29/16 05:30:52 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_group.sh, hacmp.assist, 61haes_r721, 1618A_hacmp721 =head1 SYNOPSIS clmgr add group \ [ RESOURCE_GROUP= ] \ [ ID=### ] \ [ ADMINISTRATIVE={false|true} ] \ [ USERS=[,,...] ] \ [ ADMINS=[,,...] ] \ [ PROJECTS=[,,...] ] \ [ KEYSTORE_MODE={admin|guard} ] \ [ KEYSTORE_ENCRYPTION={RSA_1024|RSA_2048|RSA_4096} ] \ [ KEYSTORE_ACCESS={file|none} ] \ [ REGISTRY={ldap|local(files)} ] NOTE: the alias for "group" is "gp". =head1 DESCRIPTION Attempts to add a new AIX group to either all the nodes in the cluster, or to just those nodes within the specified resource group. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. group [REQUIRED] [string] The label that is to be applied to this group. A group represents one or more system users who can access and work with protected resources. The system uses groups to control access to files and resources by users who do not own them. When a user starts a process, the system associates the process with the user's ID and the group IDs of the groups the user belongs to. If the user owns the resource or is a member of a group that can access it, the system grants read write, or execute access to it according to the access control list of the resource or file. A group name is specified as a string. The maximum length depends on the configuration of the individual nodes, and can be queried using the lsattr command to view the max_logname attribute of the sys0 device, but all AIX systems will accept a length of up to 8 characters. See the documentation on the AIX mkuser command for more information. You can use letters, numbers, and some special characters in the name. The string cannot start with a hyphen (-), plus (+), tilde (~), or at sign (@). The string cannot contain any spaces or any of the following characters: colon (:), double quote ("), pound sign, comma (,), asterisk (*), single quote ('), equal sign (=), newline (\n), tab (\t), backslash (\), forward slash (/), question mark (?), back quote (`), or the key words "ALL" or "default". 3. rg [OPTIONAL] [string] A resource group within the cluster. If specified, the new group will only be added to the nodes that this resource group is able to run on. If no resource group is specified, the new groups will be added to all nodes within the cluster. 4. id [OPTIONAL] [posint] A unique ID number associated with this group. If an ID number is not specified, AIX will automatically assign one for you. 5. administrative [OPTIONAL] [boolean] Indicates if the group is an administrative group. Only the root user can modify the attributes of an administrative group. This field is displayed with False or True as its value. True indicates that group is an administrative group. False indicates that it is a nonadministrative group (its attributes can be modified by the group's specified administrators and the root user). 6. users [OPTIONAL] [string] Specifies the names of the users that belong to this group. The members of a group can access (that is, read, write, or execute) a resource or file owned by another member of the group as specified by the resource's access control list. To enter the user members of this group, type in their names (separated by commas), or use the List box and select the users from the choices displayed (the users are displayed in the field in the correct format. Note: A user cannot be removed from the user's primary group unless you first redefine the user's primary group. 7. admins [OPTIONAL] [string] Specifies the members that can modify this group (for example, add new members to the group, or remove members from it) if the group is a non-administrative group. Note: The group attributes of an administrative group can be modified by only the root user; so if the group is an administrative group (specified in the ADMINISTRATIVE group attribute), no administrators can be defined in this field. 8. projects [OPTIONAL] [string] 9. keystore_mode [OPTIONAL] [set] The efs_initalks_mode of admin allows for root or other security privileged system users to reset the user's key store password. Otherwise, if the user forgets their key store password, they will not be able to access their Encrypted File System files. If the guard mode is selected, then root cannot reset the user's key store password. Allowed values: admin, guard 10. keystore_encryption [OPTIONAL] [set] This option specifies the algorithm for the user's key within the key store. This key will protect the encrypting key of files the user creates within the Encrypted File System. Allowed values: RSA_1024, RSA_2048, RSA_4096 RSA_1024 = 1024 bit RSA key RSA_2048 = 2048 bit RSA key RSA_4096 = 4096 bit RSA key 11. keystore_access [OPTIONAL] [set] The key store will allow the user to utilize files in Encrypted File System. The selection of file will create a key store file associated with this user. It is recommended that file is selected. Select none for no key store to be created. All other EFS (efs_*) attributes will not have any effect. Allowed values: file, node 12. registry [OPTIONAL] [set] Indicates where the new group's information is to be stored. If the group is being defined locally, within AIX, than the value "LOCAL" should be used. If the group is being defined remotely, on the LDAP server, then "LDAP" should be used. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_add_group { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.6, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_group.sh, hacmp.assist, 61haes_r721, 1618A_hacmp721 : INPUTS: $* typeset -n properties=$1 typeset group=${2//\"/} typeset rg=${3//\"/} typeset id=${4//\"/} typeset -l administrative=${5//\"/} typeset users=${6//\"/} users=${users//,/ } typeset admins=${7//\"/} admins=${admins//,/ } typeset projects=${8//\"/} projects=${projects//,/ } typeset -l keystore_mode=${9//\"/} typeset -u keystore_encryption=${10//\"/} typeset keystore_access=${11//\"/} typeset registry=${12//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -u registryUC=$registry typeset existing CL=$LINENO KLIB_HACMP_list_groups existing 2>>$CLMGR_TMPLOG if [[ $registryUC != *([[:space:]]) ]]; then case $registryUC in LD*) registry="LDAP" ;; LO*) registry="files" ;; F*) registry="files" ;; *) /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 '\nERROR: invalid value specified for "%1$s": "%2$s".\n' REGISTRY "$registry" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "files, LDAP" 1>&2 rc=$RC_INCORRECT_INPUT ;; esac fi #================= : Validate input #================= if [[ -z $group ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif [[ " ${existing[*]} " == *\ $group\ * ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 229 "\nERROR: the specified object already exists: \"%1\$s\"\n\n" "$group" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $group && $group == [\-\+\~\@]* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 103 "\nERROR: one or more invalid characters were detected in \"%1\$s\": \"%2\$s\".\n\n" NAME "[-+~@]" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ $rg != *([[:space:]]) ]]; then CL=$LINENO KLIB_HACMP_is_known_rg $rg if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$rg" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 154 "Available Resource Groups:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_resourcegroups available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND fi fi if [[ $id != *([[:space:]]) && $id != +([[:digit:]]) ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 111 "\nERROR: \"%1\$s\" requires a positive, integer value.\n\n" ID 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $administrative && $administrative != @(y|t|n|f)* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" ADMINISTRATIVE "$administrative" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "true, false" 1>&2 rc=$RC_INCORRECT_INPUT fi CL=$LINENO KLIB_HACMP_is_known_efs >>$CLMGR_TMPLOG 2>&1 typeset -i EFS_ENABLED=$? if [[ $keystore_mode != *([[:space:]]) ]] && \ (( EFS_ENABLED == RC_ERROR )) then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 9999 '\nERROR: EFS is not enabled on this system, so no attributes related to EFS may be used: %1$s\n\n' KEYSTORE_MODE 1>&2 rc=$RC_INCORRECT_INPUT elif [[ $keystore_mode != *([[:space:]]) ]]; then case $keystore_mode in a*) keystore_mode="admin" ;; g*) keystore_mode="guard" ;; *) /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" KEYSTORE_MODE "$keystore_mode" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "admin, guard" 1>&2 rc=$RC_INCORRECT_INPUT ;; esac fi if [[ $keystore_encryption != *([[:space:]]) ]] && \ (( EFS_ENABLED == RC_ERROR )) then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 9999 '\nERROR: EFS is not enabled on this system, so no attributes related to EFS may be used: %1$s\n\n' KEYSTORE_ENCRYPTION 1>&2 rc=$RC_INCORRECT_INPUT elif [[ $keystore_encryption != *([[:space:]]) ]]; then case $keystore_encryption in *24*) keystore_encryption="RSA_1024" ;; *48*) keystore_encryption="RSA_2048" ;; *96*) keystore_encryption="RSA_4096" ;; *) /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" KEYSTORE_ENCRYPTION "$keystore_encryption" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "RSA_1024, RSA_2048, RSA_4096" 1>&2 rc=$RC_INCORRECT_INPUT ;; esac fi if [[ $keystore_access != *([[:space:]]) ]] && \ (( EFS_ENABLED == RC_ERROR )) then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 9999 '\nERROR: EFS is not enabled on this system, so no attributes related to EFS may be used: %1$s\n\n' KEYSTORE_ACCESS 1>&2 rc=$RC_INCORRECT_INPUT elif [[ $keystore_access != *([[:space:]]) ]]; then typeset -u kaUC=$keystore_access case $kaUC in L*) keystore_access="LDAP" ;; F*) keystore_access="file" ;; N*) keystore_access="none" ;; *) /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" KEYSTORE_ACCESS "$keystore_access" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "file, none" 1>&2 rc=$RC_INCORRECT_INPUT esac if [[ $registry == "LDAP" && $keystore_access != "LDAP" ]]; then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 36 '\nERROR: conflicting options were provided, "%1$s" versus "%2$s".\n\n' "REGISTRY=$registry" "KEYSTORE_ACCESS=$keystore_access" 1>&2 rc=$RC_INCORRECT_INPUT elif [[ $registry != "LDAP" && $keystore_access == "LDAP" ]]; then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 36 '\nERROR: conflicting options were provided, "%1$s" versus "%2$s".\n\n' "REGISTRY=$registry" "KEYSTORE_ACCESS=$keystore_access" 1>&2 rc=$RC_INCORRECT_INPUT elif [[ $registry == "LDAP" && $keystore_access == "LDAP" ]]; then unset keystore_access # LDAP is implied fi fi if [[ -n $users ]]; then for user in $users; do CL=$LINENO KLIB_HACMP_is_known_user $user if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$user" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 162 "Available Users:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_users available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND fi done fi if [[ -n $admins ]]; then for admin in $admins; do CL=$LINENO KLIB_HACMP_is_known_user $admin if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$admin" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 162 "Available Users:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_users available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND fi done fi #======================================================== : Create the group if no input errors have been detected #======================================================== if (( $rc == RC_UNKNOWN )); then typeset rgOpt= adminOpt=" -A" idOpt= usersOpt= adminsOpt= ksMode= typeset ksEnc= ksAcc= regOpt= [[ $rg != *([[:space:]]) ]] && rgOpt=" -cspoc-g $rg" [[ $administrative == @(y|t)* ]] && adminOpt=" -a" [[ $id != *([[:space:]]) ]] && idOpt=" id=$id" [[ $users != *([[:space:]]) ]] && usersOpt=" users=${users//+([[:space:]])/,}" [[ $admins != *([[:space:]]) ]] && adminsOpt=" adms=${admins//+([[:space:]])/,}" [[ $keystore_mode != *([[:space:]]) ]] && ksMode=" efs_initialks_mode=$keystore_mode" [[ $keystore_encryption != *([[:space:]]) ]] && ksEnc=" efs_keystore_algo=$keystore_encryption" [[ $keystore_access != *([[:space:]]) ]] && ksAcc=" efs_keystore_access=$keystore_access" [[ $registry != *([[:space:]]) ]] && regOpt=" registry=$registry" if [[ $registry == "LDAP" ]]; then print -- "$0()[$LINENO]($SECONDS): mode=LDAP $HACSPOC/fix_args nop cl_mkgroup$rgOpt$adminOpt$idOpt$usersOpt$adminsOpt$ksMode$ksEnc$ksAcc$regOpt $group" >>$CLMGR_TMPLOG # Always log commands mode=LDAP $HACSPOC/fix_args nop cl_mkgroup$rgOpt$adminOpt$idOpt$usersOpt$adminsOpt$ksMode$ksEnc$ksAcc$regOpt $group else print -- "$0()[$LINENO]($SECONDS): $HACSPOC/fix_args nop cl_mkgroup$rgOpt$adminOpt$idOpt$usersOpt$adminsOpt$ksMode$ksEnc$ksAcc$rgOpt $group" >>$CLMGR_TMPLOG # Always log commands $HACSPOC/fix_args nop cl_mkgroup$rgOpt$adminOpt$idOpt$usersOpt$adminsOpt$ksMode$ksEnc$ksAcc$rgOpt $group fi rc=$? print "$0()[$LINENO]($SECONDS): cl_mkgroup RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 201 "\nERROR: failed to create \"%1\$s\".\n\n" "$group" 1>&2 rc=$RC_ERROR fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_group_attributes "$group" properties fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "add group -h" "GROUP:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_add_group()" dm l1+]yb|bb&F # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_hmcpll  = einst$CERS_acdhlopr"-AHILMNOT\fmuy#().1:>DGPU[]bgvw&,/02;BKYk!%3@ , pQS-䈃 a(~+v))M wb !@UΫEq="E(c7jrΫoRo4`b[ L`za5kdenSypm[wL@\jN 1Ԝ"/3FlLo2N z6A<'qgJL&0YYԊ[ A8޳(iqx[zzg*=n.aCLO LlBS1wjS{a LԔV MbaCLOa,lX5)N,j|'qgԔV Mc01ŕ-7ن[3JL'c>k&=KT,II`޶3 iō= fԔV N R|{,=dLs]*I1~`|g O5ߩ)21~,{{#m,s]1~1~P08U}|YRnV Jooa`1 *V~3پldɨU&f_33͝aLmWʵ8z R (-!3{-='c : Ǣ"&Msͦi("I}v>:*Iaf^W)555>kڭIm`zR83MsgQc2@"dQ@@WۄE] ٔ⡗췑Yf)fo<1! "C0fT6KQ4L7`PfX4 "TB#1Wee욟'f9gԜ^`KxiO[s0A R:̟wq4lUI6ɬeHϛ9=5߬ b|e욞0ԟ5ߐ&3QPYiF2v[ͲkUH4q4̣8Œ~eFYMfkY4hYg([*$XR ␌]4dY|ۃَ@-='c e~@-='cW/d1gms^hȳ1_ aMjUfOŒ6xEh*ߛd2g͜Ԟy 1=ͳz4O3>[J6mZE'6ɦFc(e`/R2Ͳk5']0&`3EȄ@(TH!4ړ117>c/|y˓3Z{jN A/ c 0i%4'<1ZA.3Z{jN ^ ^ɩ b|ۃ(D D\M{nLsk  "LAC f+K|^QU6͆;2kUH25ߎ `+AU&&#>l|~(im{ `>zj* 0m(چ_7 NyMj|<&0gQO̽H6ɬԟw<†cp̡Q "TB".*؄c+>\Rxc5'^<1@f%,DAqIMD\Ue߱ Od(M溓`?@ᛲZDK S1.,Q-eM)ml Joo P"QBo`Ԧg@zd ,DAq@|2]1Yb7>c/|x̚g3v[̚g 3%ޤY mI󁗆`z0'wB<%^f1z&oUw-fbIc/aI#qUvٌz1/ s)M Pb%J$+Jm"e[<3w^A&S1,ʑYIټ-蠑lxYI=mVL5*qM|3嗄4E2ɡxK3b foI"zڬ2j0UI0g9h,3@aTD1BE(<))RRe &xc$=$¨l83b foEcĈIjdɨU'ck "c@aTD8K3Ձ=l-蠑`N3ş&Z2Ғ-sg|f%![X1YxK@aTD6Z qfxŒAl-$CRO[U&MF 83f_ L: *PDyb%J@1RQ`]{jM~D00yM7"+<9C5V ;r/6.㧷%3mM~pRo/7Adےz[hгWnJ4hX,1c[6ɦ 1pg<KI"aÜ43kVf`0 LIpR-d/7 f D 90z5T0Pd* &ܔ hжeQg$&LA'`Pg%ZS2(3&@ mf (jk{L"r;fq0T̴ LĄɃ$e)džrUY oVoXwԜM=F͝u=iU_)4ðL]{j1o]Ilzڜz12i_řД;-i+>*eJn8v& ArzaH0RjzMG: *$DvyQ $DHon*N F0qB/j*"gA0 `,4;0^r|s? Њ&1"2ٕ'7ʦ3Rpf!qQVpf8<rdLI5Y5̫$D f@y" J, atop,(,n4 wv0c@`PH_*P() 2\@T@y" OٴdgN@((\h(wʹ>{ofY(n`P(Pi|؄N@8(\h(wYYBSeg L =6%:p@A@{ Jt6P؄ AXi|jB)eZpA@A@{mIC/( .4f|=%![Z@A@{()y"b(H=2*+< Ń|QW(چq496mmmmbU~VN 1aF࠳mmmmm' iȞ@yBaGO玆y@頊%Q' UިEȞBgI9璧"QxH JolA!‚^]HLI,,,wNDɑI"%S@I< smmb )7Fmm;\ʩwʹ>ygHx9U1 c~rUM** S(B&3!|t$LE@q䉈4RA`ix%QԎ2T2#Yf)fMJxdb =`/hx է"zdȤ)($&YbOwĈ@\H92&$$F,5̫eTPY;0ۢzi z %yTDJ P &_,E4-y"b(M!`0cKQ*w5ɧz"goQc{t%9eƁ!Αq^#q.eTPY C9"P򨢁"PHLĞLr˙U6{13m>O:JL@I ʔ(`Xec":8/Vpf)O*l\- yR,Ca`k.PSR{qP8G9%![[]wh̅<1SIǒ&"dK F]K B%Cz1)M !$DC qfxRzن[?U Ǚ).\hax4< w;=wMmm/dmC/wMmm',DDW()te욞** 3/dqF⢠k.,DDQ{1 gN^ɩE PrÅEBQPowI2K8DQM$ gH)HE,V4PEl-Ym"0[UuQYc/mϛ՛$4.7 .4 :EƅxAnhEV ,o.4piq-m3(N] 0i^#qN^ɩƊ cPcV(yTQ@ɑ($&YbOwb$*&Z8{&wؓX4 ]bwMmmͳzmC/wMmmi|P,A3ʉ-]:9;mMVMFx7cmljj3Ǝ y "Le Q{1 g6m5Y5E PrÅEBQ^k.ZM:Yǒ&"i [8DQLB)`$(D;f/o2oګڊ{o|ެ޷Ɓ!ΑqQqH0.4,0Kb pF*ig{yqK`[fP3x` ļFNmljj3 PC9"P򨢁"PHLĞP,A3ʉ-Nmljj3w;IEȄpñ‚$D ( Xv U%!է*x<<E2ĉXd_U&To'0WzOzi z %yTDJ P &_,E4-y"b(M!(KQ*vaH0ćU -Ɓ!ΑqgxƜ@@4< wjӑ=4D.{1 c~sJJC,)) ݸ J*QPTTw璧"QuXMi4fBgH)lE2i@^("TC A͞O$=$¨fo.4 .t<0Kn4LrcV(yTQ@ɑ($&YbOw !N iFy)) +=Fb1A mmmmmmmmm] J{J6ŃxŒAl-G mmmmmmmmm]PVsj螘@yBaL,,w1 gJ{" (PP:M(ÅEBQPo5()y!4 eHvJ$xTTw璧"QuXMi4fBgH)lE2i`nQ*w5ߤD-N DŽ=Fm~a8:PX5)/mZr'DQE&DgA ڽ'&PPS ]wMmmmmmmmmm(MBSQ om.&X7mmmms^n 0"%(TA s]YYwwWf1zg2'f,2޳ō &mmmmwʹ>zDK P WePӋ+?s 8 e7;T"UMVc8 BfN,BoN,Lr@Q$D <<E2ĉwPkU5Y^1 Lf]8 8=2C"YDK8M$Lhg I 0"UwDp wM3ƪSUa5Ӌ+?:PӋ+?83$<-"%(TA,B%9UިEH)&$Hc UwD/ ]w<g(U woP"w1y@頊%Qpo56.{{"YjDK p9"%KΔ&f/wؓmmmm;~XQ oox c3m6!))"YYwwak=FϖdɓQM&5߮ePNVōA~%=YY," jDecM"~1՜!3zP'3R,,eg0j/ c 7~P lŃ|eJ{&8bg5߮eWmmmmmmmmmm'(TA:9eg O]w[貳؄ e璧"Qpy" N mmm]P SbA w91g6n鉔*|]mmmmmmmkò&8؄(MBS-ZN,jx&=UިGR{öbgL,M6>,HxK\ʮ mmmmmmm1 c~tYYBSpΔ&!)⢠k.(+8L3p,,w6@z * wI"$Bp*'7wd]jx-A:[UHI;cU]S\ʩbgLc0ŕH&P ! g@z * 8@A2Dy"b(X".UwMs*1՜!3ikV~q"$Bg&zd%A&Pi eC8HzIQwP'Ӏ[n8v5UިE5̪/Vpͦ3 YYĊoVoY6mmmmmmmy@頊%Qa`k. mmmmmmm;yE~@ qgUrPag;&mmmmmmmmmmmmmm]7)lie&k L`zwMmmmmmmm6*2NjwXSNjuₘ@@*+ īSqq*ts=2CALp,DDb ̫Sqcp8UѸ"MePS@!*&P*+eZW;lSq"dB TLaP,A1 b UѸX:7r(D PSIC/Ep@#4Uѣp8jtn8q=e]()CH **+EZ7N5$=$¨ sn8v4XPXĈ@QP@ aE\ʹ*ΙVseZjg*hSy"b(X".UYs*DS:eZ͕jg,UhS9MNniFxӁaAb"QEBIʔH,;UYs*DS:eZ͕jg,UhS9OmZsj<1S,LHQ'ʆȾ&L#LM(+9p"螚BgIaa`k.<8+&_,E4-y"b(M!`,7^("TC A͝EˍCK"C ļFN L Hn;iȞU=6mmmmmmme45ŕ-`züvaYYeRiJ{&5̫-Fz&mmmmmmm‚WD<K ]w b* X7mmdeeg6mk2P#P uwʹ>yBNNf|{EZju6bB g]3m>Ox(Pd wM3Ɯ 8**rHTAaڬ1)Bo%cp$LE$TG ǰ2l2/ɓ*Eg&(,gN U%(M䳒"Y8cNHD  9$*PA V7Hd6է6<<E2ĉq n[ dʑ[m4PVsj螚BgIy-牢 &@#x(Pd 7Y,d 8 Y= p&@@E L31{Ą@A2J,d p8LH@yd L y ! ;N5 wNY=!iFxӁaAb"QEBIʔH,;UW&抵<Z<<E2ĉw*74U*ڴg8(q"%(TT(Sz͸&2 rc=$RC_MISSING_INPUT else CL=$LINENO KLIB_HACMP_is_known_interface $address if (( $? == RC_SUCCESS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 229 "\nERROR: the specified object already exists: \"%1\$s\"\n\n" "$address" 1>&2 rc=$RC_INCORRECT_INPUT fi fi if [[ -z $network ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 101 "\nERROR: this operation requires the \"%1\$s\" attribute.\n\n" NETWORK 1>&2 rc=$RC_MISSING_INPUT else CL=$LINENO KLIB_HACMP_is_known_network "$network" >/dev/null 2>&1 if (( $? != RC_SUCCESS )); then rc=$RC_INCORRECT_INPUT dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$network" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 150 "Available Networks:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_networks available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi fi if (( $rc == RC_UNKNOWN )); then if [[ -z $type ]]; then if [[ -n $network ]] then typeset -A nw_props CL=$LINENO KLIB_HACMP_get_network_attributes "$network" nw_props [[ -n ${nw_props[TYPE]} ]] && type=${nw_props[TYPE]} fi [[ -z $type ]] && type="ether" elif [[ $typeUC != @(E|XD_D|XD_I)* ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" TYPE "$type" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "ether, XD_data, XD_ip" 1>&2 rc=$RC_INCORRECT_INPUT fi [[ -z $node ]] && node="$LOCAL_NODE" if [[ -z $node ]]; then node="$(hostname)" node=${node%%.*} fi [[ -n $nw_interface ]] && nw_interface=" -I $nw_interface" if (( $rc == RC_UNKNOWN )); then print "$0()[$LINENO]($SECONDS): claddnode -a\"$address\":\"$type\":\"$network\"::: -n\"$node\"$nw_interface" >>$CLMGR_TMPLOG # Always log commands claddnode -a"$address":"$type":"$network"::: -n"$node"$nw_interface rc=$? print "$0()[$LINENO]($SECONDS): claddnode RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR dspmsg -s $CLMGR_SET $CLMGR_MSGS 201 "\nERROR: failed to create \"%1\$s\".\n\n" "$address" 1>&2 fi fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_interface_attributes "$address" properties fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "add interface -h" "INTERFACE:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_add_interface()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_add_interface =head1 SYNOPSIS clmgr add interface \ NETWORK= \ [ NODE= ] \ [ TYPE={ether|XD_data|XD_ip} ] \ [ INTERFACE= ] NOTE: the "interface" may be either an IP address or label NOTE: the "NODE" attribute defaults to the local node name. NOTE: the "TYPE" attribute defaults to "ether" NOTE: the "" might look like "en1", "en2", ... NOTE: the aliases for "interface" are "in" and "if". =head1 DESCRIPTION Attempts to create a new interface object within the cluster that conforms to the provided specifications. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. address [REQUIRED] [string] The address to use when creating the new interface. 3. type [OPTIONAL] [string] The type of interface being added, defaulting to "ether" (Ethernet) 4. network [REQUIRED] [string] The label of the network to add this interface to/within. 5. node [OPTIONAL] [string] The label of the node upon which the IP label/address will be bound. Defaults to the local node. 6. nw_interface [OPTIONAL] [string] The network interface associated with this interface (e.g. en1, en2, etcetera...). =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #==============================================================================  kBB1+ b|bb&  # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_ldap_clientonk#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_ldap_client.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)90 1.3 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_ldap_client.sh, hacmp.assist, 61haes_r714 8/6/13 16:54:51 #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_add_ldap_client =head1 VERSION Version Number: 1.3 Last Extracted: 1/31/14 04:41:41 Last Changed: 8/6/13 16:54:51 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_ldap_client.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr add ldap_client \ SERVERS=[,] \ BIND_DN= \ PASSWORD= \ SUFFIX_DN= \ SSL_KEY= \ SSL_PASSWORD= \ [ PORT={636|###} ] NOTE: the alias for "ldap_client" is "lc". =head1 DESCRIPTION Attempts to configure one or more LDAP clients for the cluster to use for federated security. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. servers [REQUIRED] [string] The label of one or more LDAP servers that the clients should connect to. 3. bind_dn [REQUIRED] [string] The administrative distinguished name for the LDAP servers. 4. password [REQUIRED] [string] The password to use to contact the LDAP servers. 5. suffix_dn [REQUIRED] [string] The suffix distinguished name for the LDAP servers. 6. ssl_key [REQUIRED] [string] The full path to an SSL key used for communications. 7. ssl_password [REQUIRED] [string] The password associated with the specified SSL key. 8. port [OPTIONAL] [string] The port number of the LDAP clients (defaults to 636). =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_add_ldap_client { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_ldap_client.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset -n properties=$1 typeset servers=${2//\"/} typeset bind_dn=${3//\"/} typeset password=${4//\"/} typeset suffix_dn=${5//\"/} typeset ssl_key=${6//\"/} typeset ssl_password=${7//\"/} typeset port=${8//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN #================= : Validate input #================= if [[ -z $servers ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 242 "\nERROR: one or more LDAP servers must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT fi #================================ : Check for all required inputs #================================ for PAIR in "BIND_DN|$bind_dn" \ "PASSWORD|$password" do typeset ATTR=${PAIR%%\|*} typeset VALUE=${PAIR##*\|} if [[ $VALUE == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 101 "\nERROR: this operation requires the \"%1\$s\" attribute.\n\n" "$ATTR" 1>&2 rc=$RC_MISSING_INPUT fi done if [[ -n $port && $port != +([[:digit:]]) ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 111 "\nERROR: \"%1\$s\" requires a positive, integer value.\n\n" PORT 1>&2 rc=$RC_INCORRECT_INPUT fi #=============================================================== : Define the LDAP client if no input errors have been detected #=============================================================== if (( $rc == RC_UNKNOWN )); then typeset port_opt= key_opt= keypw_opt= [[ -n $port ]] && port_opt="-p $port" || port_opt="-p 636" [[ -n $ssl_key ]] && key_opt="-S $ssl_key" [[ -n $ssl_password ]] && keypw_opt="-W $ssl_password" print -- "$0()[$LINENO]($SECONDS): $HACSPOC/cl_ldap_client_config -h \"${servers//+([[:space:]])/,/}\" -a \"$bind_dn\" -w \"$password\" -d \"$suffix_dn\" -S \"$ssl_key\" -W \"$ssl_password\" $port_opt" >>$CLMGR_TMPLOG $HACSPOC/cl_ldap_client_config -h "${servers//+([[:space:]])/,}" \ -a "$bind_dn" \ -w "$password" \ -d "$suffix_dn" \ $key_opt \ $keypw_opt \ $port_opt rc=$? print "$0()[$LINENO]($SECONDS): cl_ldap_client_config RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_ldap_client_attributes properties fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "add ldap_client -h" "LDAP CLIENT:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_add_ldap_client()" ACMP kC1+*8b|bb&*8 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_ldap_serveronk#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_ldap_server.sh 1.4 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)32 1.4 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_ldap_server.sh, hacmp.assist, 61haes_r714 8/6/13 16:54:52 #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_add_ldap_server =head1 VERSION Version Number: 1.4 Last Extracted: 1/31/14 04:41:43 Last Changed: 8/6/13 16:54:52 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_ldap_server.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS # Configuring one or more LDAP servers for the cluster clmgr add ldap_server [,,...] \ ADMIN_DN= \ PASSWORD= \ BASE_DN= \ SSL_KEY= \ SSL_PASSWORD= \ VERSION= \ DB2_INSTANCE_PASSWORD= \ ENCRYPTION_SEED= \ [ SCHEMA= ] \ [ PORT={636|###} ] # Adding one or more already-configured LDAP servers to the cluster clmgr add ldap_server [,,...] \ ADMIN_DN= \ PASSWORD= \ BASE_DN= \ SSL_KEY= \ SSL_PASSWORD= \ [ PORT={636|###} ] NOTE: if more than one server is specified, they must be in a peer-to-peer configuration, sharing the same port number. NOTE: the alias for "ldap_server" is "ls". =head1 DESCRIPTION Attempts to configure one or more LDAP servers for the cluster to use for federated security. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. servers [REQUIRED] [string] The hostname of the LDAP servers to be used by the cluster. If a replica, referral, or proxy server is used, a comma separated list of the respective hostnames is required. 3. admin_dn [REQUIRED] [string] The LDAP server administrator distinguished name (DN). Examples: cn=admin cn=administrator cn=user. 4. password [REQUIRED] [string] The test-only password for the administrator distinguished name (DN). 5. base_dn [REQUIRED] [string] The base distinguished name for the LDAP servers. The suffix, or base, distinguished name (DN) to search on the LDAP server for users, groups, and other network information entities. Examples: cn=aixdata o=ibm. 6. ssl_key [REQUIRED] [string] The full path to an SSL key, to be used for communications. 7. ssl_password [REQUIRED] [string] The password associated with the specified SSL key. If a password is not specified, it is assumed that a password stash file exists with the same file specification as the SSL key path, but with an extension of ".sth". 8. port [OPTIONAL] [string] The port number to connect to on the LDAP server(s). Defaults to 636. 9. schema [OPTIONAL] [string] The LDAP schema used to represent user/group entries in the LDAP server. rfc2307aix - Sets up the LDAP server using RFC 2307 and auxiliary AIX schema. It is recommended that you use this schema because of its interoperability through RFC 2307 and full AIX attribute support. This is the default value and not editable. 10. version [OPTIONAL] [string] The version of the LDAP servers. Must be at least 6.2.0.0. 11. db2_pswd [REQUIRED] [string] The password for the DB2 instance, which is always same as the TDS instance ("ldapdb2" by default). 12. enc_seed [REQUIRED] [string] Alphanumeric and length should be minimum 12 characters. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_add_ldap_server { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_ldap_server.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset -n properties=$1 typeset servers=${2//\"/} typeset admin_dn=${3//\"/} typeset password=${4//\"/} typeset base_dn=${5//\"/} typeset ssl_key=${6//\"/} typeset ssl_password=${7//\"/} typeset port=${8//\"/} typeset schema=${9//\"/} typeset version=${10//\"/} typeset db2_pswd=${11//\"/} typeset enc_seed=${12//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN #================= : Validate input #================= if [[ -z $servers ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif [[ " ${existing[*]} " == *\ $servers\ * ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 229 "\nERROR: the specified object already exists: \"%1\$s\"\n\n" "$ldap_server" 1>&2 rc=$RC_INCORRECT_INPUT fi #================================ : Check for all required inputs #================================ for PAIR in "ADMIN_DN|$admin_dn" \ "PASSWORD|$password" \ "BASE_DN|$base_dn" do typeset ATTR=${PAIR%%\|*} typeset VALUE=${PAIR##*\|} if [[ $VALUE == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 101 "\nERROR: this operation requires the \"%1\$s\" attribute.\n\n" "$ATTR" 1>&2 rc=$RC_MISSING_INPUT fi done #============================================================== : If the VERSION attribute is specified, then the customer is : configuring a new LDAP server, not an existing one. That is : the only operation that requires the VERSION attribute. #============================================================== typeset -i newConfig=0 if [[ -n $version ]]; then newConfig=1 fi #==================================================================== : If configuring an existing LDAP server, the SSL info is required. : For new LDAP server configurations, it is not, since the SSL key : is automatically generated. #==================================================================== if (( ! newConfig )); then if [[ $ssl_key == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 101 '\nERROR: this operation requires the "%1$s" attribute.\n\n' SSL_KEY 1>&2 rc=$RC_MISSING_INPUT elif [[ -n $ssl_key && $ssl_key != /* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 106 '\nERROR: the specified path does not appear to be in absolute format:\n%1$s\n\n' "$ssl_key" 1>&2 rc=$RC_INCORRECT_INPUT elif [[ -n $ssl_key && ! -e $ssl_key ]]; then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 107 '\nERROR: the specified path/file does not appear to exist on "%2$s": %1$s\n\n' "$ssl_key" "$LOCAL_NODE" 1>&2 rc=$RC_NOT_FOUND fi if [[ $ssl_password == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 101 '\nERROR: this operation requires the "%1$s" attribute.\n\n' SSL_PASSWORD 1>&2 rc=$RC_MISSING_INPUT fi fi if [[ -n $schema ]] && (( ! newConfig )); then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 37 "\nERROR: option \"%1\$s\" is required when any of the following option(s) are used: %2\$s\n\n" SCHEMA VERSION 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $db2_pswd ]] && (( ! newConfig )); then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 37 "\nERROR: option \"%1\$s\" is required when any of the following option(s) are used: %2\$s\n\n" DB2_INSTANCE_PASSWORD VERSION 1>&2 rc=$RC_INCORRECT_INPUT elif [[ -z $db2_pswd ]] && (( newConfig )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 200 "\nERROR: missing required argument: %1\$s\n" DB2_INSTANCE_PASSWORD 1>&2 rc=$RC_MISSING_INPUT fi if [[ -n $enc_seed ]] && (( ! newConfig )); then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 37 "\nERROR: option \"%1\$s\" is required when any of the following option(s) are used: %2\$s\n\n" ENCRYPTION_SEED VERSION 1>&2 rc=$RC_INCORRECT_INPUT elif [[ -z $enc_seed ]] && (( newConfig )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 200 "\nERROR: missing required argument: %1\$s\n" ENCRYPTION_SEED 1>&2 rc=$RC_MISSING_INPUT fi if [[ -n $enc_seed ]] && (( ${#enc_seed} < 12 )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 9999 '\nERROR: %1$s must be at least %2$d characters long.\n\n' ENCRYPTION_SEED 12 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $port && $port != +([[:digit:]]) ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 111 "\nERROR: \"%1\$s\" requires a positive, integer value.\n\n" PORT 1>&2 rc=$RC_INCORRECT_INPUT fi #================================================================ : Define the LDAP servers if no input errors have been detected #================================================================ if (( $rc == RC_UNKNOWN )); then typeset port_opt= schema_opt= version_opt= key_opt= keypw_opt= [[ -n $port ]] && port_opt="-p $port" || port_opt="-p 636" [[ -n $schema ]] && schema_opt="-s $schema" || schema_opt="-s rfc2307aix" [[ -n $version ]] && version_opt="-V $version" [[ -n $ssl_key ]] && key_opt="-S $ssl_key" [[ -n $ssl_password ]] && keypw_opt="-W $ssl_password" if (( newConfig )); then print -- "$0()[$LINENO]($SECONDS): $HACSPOC/cl_ldap_server_config -h \"$servers\" -a \"$admin_dn\" -w \"$password\" -s rfc2307aix -d \"$base_dn\" -X \"$db2_pswd\" -E \"$enc_seed\" $key_opt $keypw_opt $port_opt $schema_opt $version_opt" >>$CLMGR_TMPLOG $HACSPOC/cl_ldap_server_config -h "$servers" \ -a "$admin_dn" \ -w "$password" \ -d "$base_dn" \ -X "$db2_pswd" \ -E "$enc_seed" \ $key_opt \ $keypw_opt \ $port_opt \ $schema_opt \ $version_opt rc=$? print "$0()[$LINENO]($SECONDS): cl_ldap_server_config RC: $rc" >>$CLMGR_TMPLOG # Always log command result else print -- "$0()[$LINENO]($SECONDS): $HACSPOC/cl_ldap_server_existing -h \"${servers//+([[:space:]])/,}\" -a \"$admin_dn\" -w \"$password\" -d \"$base_dn\" $key_opt $keypw_opt $port_opt" >>$CLMGR_TMPLOG $HACSPOC/cl_ldap_server_existing -h "${servers//+([[:space:]])/,}" \ -a "$admin_dn" \ -w "$password" \ -d "$base_dn" \ $key_opt \ $keypw_opt \ $port_opt rc=$? print "$0()[$LINENO]($SECONDS): cl_ldap_server_existing RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_ldap_server_attributes "$servers" properties fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "add ldap_server -h" "LDAP SERVER:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_add_ldap_server()" port ! l\1+mb}bb&` # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_logical_volumek   e =ailnorst"$_cdhmpuACEILMNORST[\]fgvy),-./12:;GPbw#&(*>DUVk{|}!%0346@BFHKYjqxz'578<+9?WJXZQ ψxJW XH&@ XA,0S`+(o^UzN77V֜#aWdټڕB`PCD@;BmJӝr0x $Bd "8=?`+ ǁdQ(L1D@ƒ"X`VYG}7Grt w7q  JKO"S g%u;< #e.ҭunot)< #cI.CףtE(1؈ ""XC(jVK姰a\ƸB:e.ҭy+L7R4ZI|{ZoPVoJ,w*3ʤ/(nJ< # YEJ LQā)@P_Q` u`@xxJU`8-4`"4ф'Au (b.QD DC H@XSZֵkZֵkZֵkZֵkZֵkZֵkYe/5(BB)*ƶM+|MҮntԸQ>yǻ8C kZֵkZֵkZֵkZֵkZֵkZֵ`+8DjVK45QwU X$\,%E]:5kZֵkZֵkZֵkZֵkZֵkZֱ]:5uki%ո|_b7t 0\8:1w zN'%ռ1Rɒ@^l?)|$m:Auoe/N9xW钔l9唽WOUuz<Fy \3- L@D%7%[RcuRHt3f&^-=݂^qt-<}Ҷ  P,3[?kfpOVS^uבK>+jU/'C9(.<^v٫+c0;9(.nr]lA3f2_+|uRnr]nܚ}T}8HtrP][ 3HtYӫFr(8g/J6e唽Wꮯ5Fޓ|NI'VYuRHt3vYK|^UzW"\N:=TWOUuCk(vID䠺LA3f2_+`5KPV ,Yw>>'C9(.v*='C9(.rMӾVzN5sM G\wC;׋]QkvYGӋJ;[?P|NFpg%հT}TWꮯJx/JQ[qwNUR7+u;,(=#ӑǧtnҼp gꤗ9NҒϺf=$m:Aul9}Ӣ֓> ޓt꣪SU;='C9(.u:sӽ),E$ŭKaTWꮯ5='C9(.џJx/t^YjJ :zt5:h?uz@Ϊ^JύiUKO;ʪ\7+utD`? ޓt꣫KP|NF36 䠺I/k9sMWDhV麚ҥ- (okMWE+ qjQgE$ů^.%t-98Y}Nc3$m:Auo}8ʺRY觾=NTօe:AunT9t3ޔW>/YCzNWjrW zNrP][N%ͩLI|$m:Auokкstq^%U p$WU ;U+&4cbYrb$0[7s2ZuR\ =U⺢>F;Gg%պf>6.BI|RI/kŮqlq]Qk#Zt37ǪVs1 gN%t˓,wrSn#oIJ zk7SUgzӒWJ>&ØA-U,3YԣXg#F@D;Νh-dV9L1Rɒ@^S,+p,ԡ Y*$GZPzGCYFpk:u}_(:1z(U/e: 9(.1nsH*H_wJWt!$W:҃:YLԧ'CYӫGI裧}TV;G3䠺nsʮΕҩe!!}ZҳzUI'U?֔UӫF $yOoU󜧤U裧lvh 䠺uR:iUK9L9O8/t 3\Y*$[˓,H_$W[?%nҒByO;8/Me: YӫGRWU/|z˪*Q3 ۓ|@Ϊ^ޫwJKNvñ溩|ɳK\W;.WJ^T6 WJKNvò[?֛tIcKi'kEe|qwMGM1wN$G֓>gKt!]Te:vq^rn.oJuU/|sRC='A:u}_(|wpk:u}_(U/VðRx[|]Te:Ν_W=Tuz%tgTzJJ KgU/|Y;A-gMЅ3+j@3Yt!p+j@1B9/Yc1 E2K&Ha9z]L֓>鋩uRY˛b}neK#oIgAuo}Tݚ!!pnL;٧/ Ӭ90vBI:QUeɊLrΪY>(ϋo$䫬='CYӫFeN3U/NI.ƮQꄠsJJ觚e;gjSU|:[4]@úVoZѣ;˓,&4\<u_(UOzqr,oN|eV;hI 7D|>&x{ 3nMi+-=}^deJYh='U4_CMOMptӗKng.ot z)%-}Wm>F`4Zu1viQ "|2K&Ha9qiJg)77usnr]juQ_(oIպ3:T6 䠺(r- $qy$gTJВA.F|$m:Aul;,JvKgrW9p/5)Yh='U򎛪f+N 3ZR)Icrb$0+7ٖn4:WJKkFޓV˪-i<=Wr섍'C9(.Ig:ԣ-گ=iJQЄuoYӫF59+KPV=Tuu_9zҔ>Zr8Tσw+7^^U]'C9(.IcN,9@pU(":#&*Xy2Cҳ|MgQN_KJQOJKkFޓV˪-i<=Wr섍'C9(.Ig:ԣ-گ=iJQЄuoYӫF59+KPV=Tuu_9zҔ>Zr8Tσw+7^^U]'C9(.IcN,9@U(":ɊLrfY2yӪG=),w_ zNrP][.[?赤O_9zҔ6 䠺%t꣫vR7Ojs(b9FwBIսgN3U/YCzNrP][Q|)JP(3iӺuR >޲tޕzzoJTuw36 䠺%::3ٹuK&Ha9zVo,*Of%ǃRU/'C9(.Z{|,9@k(.LTd3?iKܒWJk\}(Gۓ |ܘlgEzyA{xY[:{JMk(;ra}l;g4}eҲRdk'ƼuRO;JڼGU𑷤g%ռԧ^٫+c1 FI\a g/J6e9٫+$וּ}e(;kIi(vIgAunf"aC Dq!Rɒ˓,7Llv"0D2<ڕRs9iIz+OT<4Ԧ[ONI.Ʈ1U|hEɦ$m:V?$86hɖq@i%$*,TK@Kik_tj ծ^6NJ m@&"`?uk9(.nr]fgNt𑷤"WL0xxU:묡='AL<<*Zuukj0$<H䔰ZRfff$l3 PF6o·h~  Dy!4# 3LMG$Oc?k._ J h[2dOE6H(QŴ"(Q%E 0y(PA.>y"tD !Cfea"b'dG"(P@WY4ATB$*,-H5$OF "*J2'%մMKrP][D8=;8 h&7(5G+R`3|N:M;貴7@i"*8E "D\@1 (%<0 +Wr[]O@C19(.nr]cp,Eeho E "TqmDQBg8м#(.ⓒPHLD@ c?ukq>i@y!ĉqZ hEQTNJ hZ9p-< Ox@& q> ˗  Bˠ!\n .%E22'K?֛\5q@&|- .̅Og9F᫈&Pj$D &$c?b^_'tJ}T䠺[@䠺uS].hYj3i@y!ĉqZ hEQ7uD䠺uuk7/[Aumsg KQwF8lVrZ*d*Og5/Ae:V2'K?IJq7ifw@7N-i<>%Xge᠞d2dO/zQw3|dƌ "` q{tt-5/Bvj2N&DqgE+流kIiwAqw@+4'f$ ̙şH5$OJE6H(QŴ"(Q%E b#&PKkIiW;WIfx  ӕӌe-IRT\snr]`E b&"Н9(.nr]cp,Eeho E "TqmDQBqσy)'t1?YS].djS$|tqw@*'&7Ƹj9*dg|k#{?P(5䆓(Ppȏ$*,Og–٨;j ADYr8;xx`~F AD`ɑ>\Y;5'm@''t@PhWX%5)RkCi4{?=y|4Є'A:i2'K?ӢMDH(qCTdf$0 9GP,< ) hRժD ᡹$*,~ǁZs',X@ ;&P8?k._ Da  aХB  LR貴7@i"*8E "D\@@1 (%'tZO4O5)D !CyQP"~z (~zE6H(QŴ"(Q%E >xEzyA{B"b'L.VAz:  4$nl._ |($m<ɜ gP^BIn놂9rJ t$l4֝ro 4$nlJ 0S|ڀM(/WˆFM <<U`HV3(/WˆFڀM(/WˆFM P:6貴7@i"*8E "D\@"8Be@ܽT:wӌui'x "a w B@ܽT:wE>w5KҒ) R px BOVS; ~z ADA(/WˆF\- FέThJui YM@H*Ty!DAG$4g4{ kZֵkZֵkZֵkY%]U/|V^g)kZֵkZֵkZֵgNt*Xp=,XO? gNt 8Tz$ȐgOHT [|rx) Z@T &,o@!#aF"R** Pyaȍ&HH RhV)U,1gR9a4k0…L%G (0EB%@ Z#(KYP ;t (:VoJF "*LxREiAt\)` Yt!pFqŝ7Bg%3gTA⣑*<c)YkF a@$ @$@0"80CHC1$`"D0 b,NLZop? c­ۓ,S 4pa3`ѣKG @? 8Tz$F,8Ky jS#oL"0@pxx`~ӓ?#"@kP ˗ @`ѣK@haDaH LR貴7@i"*8E "D\@@1 (%'tZO4O5)D !CyQP"~z (~z$@x= 4(X0$@x? şH5$OJE6H(QŴ"(Q%E >xEzyA{B"b'0h¥&Pj# &PᥑHT YcS].l7/UVꤓF 5/UVꤓgerQnI< иZ)Zu뵹~ \\- FέW;[@áJs&DşH5$O9sy(zU$z^"I&?<%gis9uRI h&7(5G+_4A$4BDy!Pf{ kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵ#sy 6tYԥέW^̙gTOADU$&DşA貴7@i"*8E "D\@&Ht3qJgVz>&@ܽT:unI>v0D07Vx+;K X &D#"8L}*<|)p,EI"e Hpz$,)lծ]iJ޴Ng|k9ۓ֔\JPD)AڀMiJ6 0 iJ6kJPDXUN+Cxm4"(Qh DP$J@0 3P2Y(?1wGvkVsg(P14V~z JPDp,EICI(8idGglg`fHpz$-R貴7@i"*8E "D\@9p/"Se(PHLD@ c?ukq>i@y!ĉqZ hEQTU|) n8м"L@E  &%gO7 qσeB{=93n8вů|w RP^uDD0 DOAЄu_(?Y4A$4BDy!Pf3Yr ރ $QEW-2'K?ƐjHN+Cxm4"(Qh DP$J` 3P2]TZO4OYP\Yz JgWq5ibl|csEW,/q5oTLMnhf/Z? v?gL݅kUg^p֫O]ige,q&AˉQg%bFLLRKX3tMW5? h_d֫Oo16?=y}yRJR;Ĩ#&B&DqgN RhVgx5~'?֫OE16Z? igeAgNFQF+7 JČ ̙ş::EZȬrо֫Oi?h_BkUо֫Oig3˗ТJZh(=# .\J9+2d/2dO^REiAZ? OXg,^WMj5>?t\+j@/&Z~BSFr|BɭV316?=y}VRX7 JČ ̙şZ? [JKj )Aiy}VRX7 JČ ̙şZ=\5m),tE*RDOgZR)Ic>7 JČ ̙şZ=\5m),tj )A{\ ٨;̙`5ҚQv{S].Fέ[MS?ıKrP][K9-sJv&|$m:Aul;g+gNt3g%'hD&%Eլ,n%մMK6+9-FDn)LմڀLYjHi@zJtRK=G6/SV#oIJ }e|Sz|\5r+{Uu)i3[?(VkNK\rA2# #oID䠺p9D\j0 rV$m:VڀN6NJ aVi4\дn)L| :X7BFޓAuo2eRi5@@C2 @ʅiAhRժG v꣓O $m:VӚ%մMKSY5d֮MjSp9DR<ӄIU](#qp-S:_(ܽTriЄ'As@䠺u*uk&tLtI]5i5gn.qJgV- ~ 4B"*@qp)*;? ! D@hJax,/E3VC&DqgtYZi4B[@i""TP P b 0!1υ[OrRWQJyQP"}'GB a eÃ?D /nd$m:FP][NJ(a jW0YkNGR/U.5zN0溩zӐ-]kJ3Z^W%\xG-)8OB6NJ gMVIϢNA?Y{?5/qp-S:_(#p(t)Pn Є'Ad >Dn)Lմ<ɑ:qgV`8A:b 0!JgVԧVsfD !Cqp-0YzRHt3`D0~q{S:m00.RS:_(>6 䠺b&}'GBpAPbw%&*,0;DU!'345G0(⊰ȠDL HE5Y6.g lp p &(p]`' `I55UUUUUUUUUUUUUUUUUUUUUUUM ^nynb;[]ϾjVm 5ZX3ivkgy&902j Jpf8Sr9@@YQMA!aHj 4& HρD@0"“Not7<#ܦ>CWZ P@b'قӰFxb"8! `t L@0X8_G$8=Yֳ+M@P J Z yÃb9j,/& Hs[$:``B)ɱs99j,/G$TBmnd?&u+"g3ŊŊ` `,`8nEIOqGP,ŀAH0 EI`0}`+^ԕr6z QTPR)w p( HtSQebr 782LAg' ,kh娰LRZU7EعMuppfG!<,X#jKfHb X̷Uv Qe.g 1s9]A+\?0":\\ha@NA%3N^ JR:)+30Oy@qQ,@:+37AUv Qe.g 1s9]A+\?0": R "XBt-rV.fn GP`vj /iro42KP \SY."MEA*[\Y|CU%9e-aSൄ@k xx4444g0F~g0X!% ~eɔ,8g3jbr !Z Zm kD';a˜5cjN7؞33NٜRzyEs3rַ&mWrM|Z9j,/HxDeݘrˤ8B$38qF[ IJ IF*3~&qʜRjj @Rv ZQ񹝋nprT]{k[Qˤ8B$32/]A+_'\^mǭ㥱s9Z }ˤ8B$3gپ.g 8bWRvk[(ې|&GL29 > rW.PDqs͙oXkع[rV.fnKf0<`kru+;80ܪ7o;X5ӗC"A!9uʓ8eNA%4'u+lH3 kpEgHpH$8!eɔ,@ 8̷Ճ梳P MxnIOGŽ_Qer7eCwX{nC{=oP0,Y2`q<ٖ9}*A|r׾q* @n&r|Td Yr%& G%(Xqs͙oc \R|^MƜtu+oj0`1t"!nx.PDYDe 9va'>f[X:ǁnbÕng/|&NUIĬ#ysY kq`nbvyr%& G%(X˳ 92/a@Ecy< r`QS7rM~%f͸o:k[b P (He_3Y/z|s|^zNUIׁ* z݂6٨$朽*MIX zښޣW^ ,(U ]QR' kr;rRV.f`%w EH9j,/Hq`D3|;abwֹڳ_n*M~,ڑ8g=xU[]}EaધcYpNLڮ4[bBt X]m%yzq@kn{'g-JNy@Pbvmd5%1gjn`Fֶm[? OEқp3S6:jES MS?kh娰iA9"h҂ rDMzJ*qϹcaCpp8  N6rrҹ\OZm*vmsk( 5kkAS[4u~遂I&& Lq2聂Ht,)xN8D#H댝XT 8RQV遂I& nC 7Q8 ,x8 A؉&*3D7+rEgٹ\ pF gٹ\fH(67+ZD 0M>rH@HF gٹ\`H a@NNq3Z\EgHJQY mnW>[*D@P'7?s9oϳr*DF NNq3Z\7+O (? n4br K>fs.gHB…@P'NNq3Z\7+(HBŊa@?s9k˗D"PxX ŬfL_+ =s⢷Tc;CS˗ZU&TV23}Q}k/mq}N^\20ɐ 7љof ᆱGeW!Rs*N*J0!Ln*J00Fy-{9{GeW!Rs*N*J0!Ln*J00Fm4&3,q.g/]ҟ\#;[˙'Zc|?R+7f>pUwJGm j^<ܻ떴7z{j-`'x %`+R|&r|剹ux"yA1;(zf0<寙'yra 7+T"""Q" G,Vo൦u|ր-ie5`+|րV 2-ie5ઋ Zk@MT]֙S^ jW֚zkUMX0;o൦ulBw൦ޜmN-ie8e{൦ޜmNV 2:vN:vSV 2:vzjWgYMx*t5&ׂ.:vS^ jWt5&ׂ.av:vS t5&lBv:vS jWӴրӍ jW["us@ր"uՃ s}NZoMX0;oe5QMFSQe5`+*tm9\O9[MET:sPGUw q&oic^VӔԝn^VӔԝnV 2iG.;jVMh 9 ok:@zgj_Ӵ(=qM|fzn|&VV4iqRnV 2ڰyN7(]omX<Ӎ[MEAjޭ`N6nP;m56X=e"}`N6nP;m5`+jm8ܠv*jWr`Ճ8q@Ukڒjm8ܠv*qIZfjm8ܠv*qIZl)Ճ8q@Ukڒj)q` MX0;ڰyNpf 5#6׵%i676+NWVQe׵%i@>z⚋-MgHMonP;m9MIjQ7(5N(vavM؁MEA&b5`+؁Lս[oMZqI[q=qMh q=qMh 5`+򸞸Ԍ8ܦfav:vԛnRnV 2'Nbniq7i^m+iq7i0Ԍӕſ򚑚gVbNWpe3FVڃ[UUUUUUUUM.唝{'f𚪪oeF/Eˌ*+c ̙9oo'[vnQsaX!%aZE!&4IY2B%ioT%g@X&Pg=ooehHcZ (qeEla!h|Qr$ʊ&B-{E 9▓,H-II2h"HzI*<,hx([@,20oN6Ygkf9U&?br H4= Xx,9"KI$o $QŴF$=$Wr;rx(Yda%B""%,8 4q2PŇÛi@҉$8ido7h>˗|uX0(qeEla!y g-|R$J "2m óZo6:.4'ԍ{&Z7+T>;Qu|&j^ oG|BE`?Z ._CESkhuX0Ƌ൘8,;mo-P>֤T/փƑH&8L ML|ޛ"-ha△žuuXx ZCS*4qRXX?{"Q$ ,b!Qu|&j^((IbFh"HzI[DiCLQq`E@,20.[=FY#.S04|1asփq(+u]7kfuaa`g-vQ$ZL#xdF$=$ʎ-4!&H$^KN \y7gٹ\(^4"D1`  4kSMZyG.PR Jr /eA0~~Yr r /eqOk.2L2d/2d彿Ϟt;@ \ aEˌ*+c  i4וƲU梳ZEˌ*+c ̙9oo4)kI$o $QŴF$=$W0$Q!h z+3dix (L`8Du>qXs"Q$ ,b!4ƲlrZEˌ*+c ̙9oo4)kI$o $QŴF$=$W0$Q!h z+3dix G,W,n4 oURcJ$ᥓ LD"Y\k.2L2d/2d彿H$HL&X2Z#HeGD$Ty\p$Dh$6?į;+[tha6L@q\": Xx,9VHjd (CL1fs[Yr1 .\dQ[d^d?{ƑH&8MUZL#xdF$=$ʎ-4!&H1I"  FHl(?^vV&#$L[ ̙9oo-H*{&}ωFg\3:orccsɜ QdQ'orcf.g3|3:C 3sAϞ8(,$HLJP@X0@"X]=q b!-AJC ~a_F EX>j+3a"iل0 FF%3(D,HDA.&kެaG&K"TRn8cF- ŴZEZaa=U梳C00ւ&oz|1(љFfNoU@ Ϟ*њ1U <=II2ĄH8j znGW[XPVUZPѣ[i9$$GeBNx7KDiCL#Hd+x(Ҏ^ XړfLAPUbk%'*,0-AHM Py4l"l$uvBzwbe&@ ,[$ Ȋ$(LLAA@H0 "*Px(889]W0FQۚƦۮ`ƣ95M\ZK,Dk.4($>+VM/'Wd'TDǤPyR+`Uj P+)@ PpprwbDX6!&r"f&bf0]bɐK$V$$2" ( $Px Ȋ$ WU2ѩg6汩1mcSm@K.2cK@1"IH$0N=MO0!ѥuqZ\!3!F!g+D_0HnѥuY5ngOD_CqcE!QƨkMHR-CXQqÁyiLC.X.˰ D`e. !B/#C,K=-S@pX{ƻIGe4"HzkH$IMbEG\1vbqv]08Pi `+ns:~8H,=1h& Q4D E? Vr9 n=iB[ґcC`s*r]ɶbdi:) KP2 /\yⴄ N BrZQƨkLB@kLiX4xkuR3X(jl$az8ns(xkgQMRD-S@Sp4N =Bg ΢K4NN=MOh:,`13ewz Z\'UQ'ijr|t[iGe4"HzkH$IMbEG痒IQ1281c8.ã11<8.x<] <8X/$LbqPɓ7i0jo</"iU esXcJ^Gp Š+&DI&(*Y Qc-&,1 035ecݓhhSpƻIGe4"HzkH$IMbEG0^xe֡nA/#Aa!HW\eqf`HHHL "@ X&!E*u,jm5/Wf26  @"@J1 8hhoE4+^,,B*HbQ@AUCuUnt?/$LbqPOaSuƕmύ97]~k6#Ap/ FznKF㄂3h@%M$K,@gkhkqSA$Th"D$Ty\p牜^,,1Cgi Py Pj$H 0ƕZlF 8ʸCf$m$ LaP2$=5[A$"(iLCmŹg!CӜ3-y33-aەr iyH0!Сy#&PHX/$LbqPɓ7i0jo</"dXU`i^y!%s5ngO f-X4J&HX1AR3&uh:;3#$S-tY_UQ'됤+edłSBėjy,<? Щ!#$ ʱ]ƋFCXP2$=5[A$"0 $(xr?isrd- A!CËȼ/ZM Up؅C0{S hIqf`В=qf`QL`0ܩVnT+ V; }tY8ՋPm꫅賲q۵ c>aUg!3{K=);#{K=E44N=Bg#$}tYŹƧuUtYŹƧlPb.{L)ѥuwxC N7Hչ TGI)賓sN꫅賓sN6{"/b@ƚ c>aW  V^0{SmX^lBϡ=)#JUW 7*Fgƫ70nfZj _U\,/64bvoQL`qxhbva{k@%U۵o c>aW  b}bvF؜E1Bp0L꫅Bglݫm/X=) 6?U\,/i!g} ʑa*꫅#JU‡DEf/U4g͹ۮq3ɾ2q۝3k-Kb]ݿ&p XTL'7 ?\!\ # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_add_mirror_pair =head1 VERSION Version Number: 1.5 Last Extracted: 1/31/14 04:41:52 Last Changed: 10/24/12 17:26:21 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_mirror_pair.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr add mirror_pair \ FIRST_DISK= \ SECOND_DISK= NOTE: the alias for "mirror_pair" is "mp". =head1 DESCRIPTION Attempts to create a new mirror pair. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. pair_name [REQUIRED] [string] The label that is to be applied to this mirror pair. 3. disk1 [REQUIRED] [string] The first disk in the pair. 4. disk2 [REQUIRED] [string] The second disk in the pair. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_add_mirror_pair { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.5, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_mirror_pair.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset -n properties=$1 typeset mirror_pair=${2//\"/} typeset disk1=${3//\"/} typeset disk2=${4//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values CL=$LINENO isEnterprise if (( $? != 1 )); then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 184 "\nERROR: this operation requires IBM PowerHA SystemMirror for AIX Enterprise Edition.\n\n" 1>&2 log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset existing CL=$LINENO KLIB_HACMP_list_mirror_pairs existing 2>>$CLMGR_TMPLOG #================= : Validate input #================= if [[ -z $mirror_pair ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif [[ " ${existing[*]} " == *\ $mirror_pair\ * ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 229 "\nERROR: the specified object already exists: \"%1\$s\"\n\n" "$mirror_pair" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -z $disk1 ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 101 "\nERROR: this operation requires the \"%1\$s\" attribute.\n\n" FIRST_DISK 1>&2 rc=$RC_MISSING_INPUT fi if [[ -z $disk2 ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 101 "\nERROR: this operation requires the \"%1\$s\" attribute.\n\n" SECOND_DISK 1>&2 rc=$RC_MISSING_INPUT fi #================================================================= : Create the storage agent if no input errors have been detected #================================================================= if (( $rc == RC_UNKNOWN )); then print -- "$0()[$LINENO]($SECONDS): $HAXDWIZ/clxd_create_mdp_director -s svc -n $mirror_pair -d $disk1 -D $disk2" >>$CLMGR_TMPLOG # Always log commands $HAXDWIZ/clxd_create_mdp_director -s svc -n $mirror_pair -d $disk1 -D $disk2 rc=$? print "$0()[$LINENO]($SECONDS): clxd_create_mdp_director RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 201 "\nERROR: failed to create \"%1\$s\".\n\n" "$mirror_pair" 1>&2 rc=$RC_ERROR fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_mirror_pair_attributes "$mirror_pair" properties fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "add mirror_pair -h" "MIRROR PAIR:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_add_mirror_pair()"  lX1+Rb|bb&3 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_mirror_poolek    = aeinorst"$_cdhlmpu#-ACEGILMNOPRS[\]fgv(),./12:DTbwy%&'0;>BHKUVk{}!*34@T<'E@8]2@㇔.Q%9i1),Eq gfN 4zGU󃖦7/90_ܐ8ўљҳuzGU󃖧# qM=1勁 dW.%-"S(Մ_L|v"  Fc[1֙>6&r2>wƸF3g3QܝqhU\8>S`;hh̐8E&XD (8ј H@*Uɮx@ r@I(4$\@(n5 4Mg:BQ @%0 !W>@T<'E@8]2@㇔.Q%9i1),ECp "Cq$IʸP x ,DCq  ˔oHp-덎X>.sbRZ @<*>,HP6xUa}u!@-mԅtBB:V]YMǞMՄh xy­[^J> Ph[QvGuI5^6xUa}wP^)U*,N xy­oZ#ɔ"a"e$Twz x̴V7&Mܳ/[2%57# @>«>wwwwwwwwwwwwwwwwwmjϟ4,o#W|BF 0rʼn!wwwwwwwwmNZ :]w4k9i1)-8 >8pCBsbRX<<ӆ@ 8oh"&xPkpFÓxÁÀΪ-Md 6#ɔ"a#$4G(DE 3& 7 0%/=yM"}AM5]7'WΘGp A!FUru|)ʏ}j7+t 6bD7ӔV7qh"'9M&%%D('9M&%%8h 4XӁT1h$E,ʲ٥d9:/+Uru|>o\7><L ,PaM0L(HT [Y7AAG7E(EGƯSNKF<&@'9M&%%;)ax3$"{ܚUru|wEMroيzRS_F5PLI yBi0d<<6lNg`NcdG@!~cdGCAJ/ob|k :ru1W;os޵'k": ;(N5qAv*<$Hpz{.Ɏ2f bpqtG(DC(8 ࠣkJQ{M0#ɔ"a"HXF@JB'B ˿;)S@ 7V#Ɏ2e @ kij*[_UU_sS(Μ*.>vPy2L$謅e_7US^"yN5lqtDyA3qDPp9Œ,~T|j4jϞJm;)ax3$"6#%Ɏ 3`h4蟒̮NL8 >X"TN N&H2@㇔.(N2KsbR[A9i1),cw G d '7A0DS^,H ?%]b ̮NL0XU+#ӓ,Z!CYޑɖ;j=$ T&HyɊ7y;D" PGTfWzG&XIլ*_MOfWzG&XC>yɊ7sFB191CFE (BF 0rʼn8(ÀΪ-덆 '&c[> ;):!C瘜,a"2p<<4? 5$FWcMGg`NIɘ<01J/oaz$pm0`,L IJ0cip_ER S?%]ɖt(twV]YlUQeE8T888AZ !,H75==y),ḪNL8LNDI5d"NLQ$ T&H,U9,NLF?%]a @ oӴLH#&I""";ѬltWuUonW[8f}OAt̆QAxcpJ0ci,U`R!A>,Uh8p` jI;5qAg HWMGg:5Ʋ#n}Y«<08A`%5Ʋ#杢`zD,`*\"(o5;5/MɪIwL'8 d*[>PQew 躂M$ܚIQdtxǪyObT`}#W|5d"zz+) GUÓ}9ONK7sFѥe7zKI7Vp hҲ=% GsFÓxÀ>4Ii&Qi8qUok$^L  )yba(UܲU{Fk.zx\p?:S%p]^5>Ղ޸Q4g^5p K~Obœ"vS]Մœag4g9ryMwT7tTtqWg;,zl<џ\YIjfdx"{'>LXS:S%U2ƴguj8D즻 Gt$э>k)$( $LQZ3ؒ5x 5<   TqB֌$^O59(   TqB֌$]l   TqB֌hY0ު^Sؔf}U8D즻 G:g¼)bk.z}e 0VvS)Q?L>n%QWMwVU@⥋$eNxSfQ?XSa*<;VνfoŝNSE,/vz^F4OuUÏ?NkC|} rQ~VgSbP^&kWWSWzs4{FlҲ]󦤸ʺ>U-W;<آo џ*GQ>*>)򎻣%ZL+7'WgwV f3uYYs˪́K2HGXJ:ҭ٣UP93.X⢂Xn2y(¼)v7VWWh;)Q™8bI_xGShZWtvy"vS]Մ+NBzU!1>rљ(h%e4cFe ւ_YEљՙƂ_C݅U*=N_'zїwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwm:S%GxQX6j <|YYlD kmWA  L9 x IxNrLJK5ܠd*XFZ5==) SIIl bRY(wsmEJH=.nm<2Hxi f`ARL`44888YB 2 ,VŠSiMMGs+Wo[=ṷ\U%0$堦}2nĵṷP΢ Bx4;o[Py(bℋLj"x~'9N=% ks%%z 5g(ɚrAx3@$堦}2nij qQ qQnP^)U,4X"G9g8E_˿Ax3Lya5_#Mg+;)U^)-[4~vSAx3MxNr"x;U=ܳfW~4*GzВI5_]Ҽe^o^),M$ܚIQdty *8#S2Ӂ>U~H<ܚՁqgU] b> uUaM# nMW x3y2sY UPC0@P"`[ĸ|)|ߨ:@gU_ɇՄӬ\}C@Kvy|ܶSu9&3n"%N`9fiROWx *zree8ʸf*7Iwx fz"5ŝMxRHI.Gp u8E9NoN#Kpp%K0{b}8ʻT)VKwFt{AgZjf 2S|NI ִeFb;%"x7NKZIV]Ӭ즛"{]5)*Vh oRz;zNآ* .*{U~}3ު;}U~!YOqs**p-_e7їwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwmn[ :ppϠFpF´x,ѝ\*4Z UQ, h̄Th˻q.dŁ=ڋAJ`Nâ\*їwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwm(P2Z kx21+.b|bb&. # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_network#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2018,2019,2020,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r721 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_network.sh 1.13 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2016 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_add_network.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_add_network =head1 SYNOPSIS clmgr add network \ [ TYPE={ether|XD_data|XD_ip} ] \ [ {NETMASK=<255.255.255.0> | PREFIX=1..128} ] \ [ PUBLIC={true|false} ] \ [ UNSTABLE_THRESHOLD=<1...99> ] \ [ UNSTABLE_PERIOD=<1...120> ] NOTE: the TYPE defaults to "ether" if not specified. NOTE: when adding, the default is to construct an IPv4 network using a netmask of "255.255.255.0". To create an IPv6 network, specify a valid prefix. NOTE: the aliases for "network" are "ne" and "nw". =head1 DESCRIPTION Attempts to add a network object that conforms to the provided specifications. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. name [REQUIRED] [string] The label to apply to the new network. 3. type [OPTIONAL] [string] The type of network to create, defaulting to Ethernet (i.e. "ether"; see the HACMPnim ODM for all types). 4. netmask [OPTIONAL] [string] The netmask to enforce within this network, defaulting to 255.255.0.0. IPv4 only. 5. prefix [OPTIONAL] [string] The IPv6 prefix length to enforce within this network. 6. public [OPTIONAL] [string] A Boolean-like flag indicating is this network is public or private. 7. unstable_theshold [OPTIONAL] [integer] Integer specifying the event threshold for network stability. 8. unstable_period [OPTIONAL] [integer] Integer specifying the event period for network stability. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. function KLIB_HACMP_add_network { . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_add_network.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset -n properties=$1 typeset name=${2//\"/} shift; shift typeset type=${1//\"/} typeset netmask=${2//\"/} # optional typeset prefix=${3//\"/} # optional typeset -l public=${4//\"/} # optional typeset unstable_threshold=${5//\"/} # optional typeset unstable_period=${6//\"/} # optional [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset args= typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset -u typeUC=$type typeset existing CL=$LINENO KLIB_HACMP_list_networks existing 2>>$CLMGR_TMPLOG #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= elif [[ -z $name ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif [[ " ${existing[*]} " == *\ $name\ * ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 229 "\nERROR: the specified object already exists: \"%1\$s\"\n\n" "$name" 1>&2 rc=$RC_INCORRECT_INPUT elif [[ -n $name && -n "${name//[a-zA-Z0-9_]/}" ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 105 "\nERROR: one or more invalid characters were detected in \"%1\$s\" (\"%2\$s\").\n\nValid characters include letters, numbers, and underscores only.\n\n" "$name" "${name//[a-zA-Z0-9_]/}" 1>&2 rc=$RC_INCORRECT_INPUT fi #========================================================= : Check for maximum limit of networks allowed in a cluster #========================================================= if (( ${#existing[*]} == $MAX_NETWORKS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 1448 "\nERROR: The number of configured PowerHA SystemMirror Networks in the cluster has already reached its maximum limit(%1\$d).\n" "$MAX_NETWORKS" 1>&2 rc=$RC_ERROR fi if [[ -n $typeUC && $typeUC != @(E|XD_D|XD_I)* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" TYPE "$type" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "ether, XD_data, XD_ip" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $netmask && -n $prefix ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 36 "\nERROR: conflicting options were provided,\n\ \"%1\$s\" versus \"%2\$s\".\n\n" NETMASK PREFIX 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ $prefix != *([[:space:]]) ]] && \ ( [[ $prefix != +([[:digit:]]) ]] || (( prefix < 1 || prefix > 128)) ) then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 113 "\nERROR: an invalid IPv6 prefix length was specified: %1\$s\n\n" "$prefix" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "1 .. 128" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -z $public ]]; then public="public" else case $public in @(t|pu)* ) public="public" ;; @(f|pr)* ) public="private" ;; * ) /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" PUBLIC "$public" 1>&2 /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 3 "Valid values: %1\$s\n\n" "true, false" 1>&2 rc=$RC_INCORRECT_INPUT ;; esac fi typeset Eopt="" Lopt="" if [[ $unstable_threshold != *([[:space:]]) ]]; then CL=$LINENO verify_numeric_range "$unstable_threshold" 1 99 UNSTABLE_THRESHOLD (( $? != RC_SUCCESS )) && rc=$RC_INCORRECT_INPUT || Eopt="-e $unstable_threshold" fi if [[ $unstable_period != *([[:space:]]) ]]; then CL=$LINENO verify_numeric_range "$unstable_period" 1 120 UNSTABLE_PERIOD (( $? != RC_SUCCESS )) && rc=$RC_INCORRECT_INPUT || Lopt="-l $unstable_period" fi #=========================================================== : Create the network if no input errors have been detected #=========================================================== if (( $rc == RC_UNKNOWN )); then if [[ -z $type ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 114 "\nWarning: \"%1\$s\" must be specified. Since it was not,\n a default of \"%2\$s\" will be used.\n\n" TYPE ether 1>&2 type=ether else case $typeUC in E*) type="ether" ;; XD_D*) type="XD_data" ;; XD_I*) type="XD_ip" ;; esac fi if [[ -n $netmask ]]; then typeset nodots=${netmask//\./} if (( ${#netmask} - ${#nodots} != 3 )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 115 "\nERROR: an invalid IPv4 netmask was specified: %1\$s\n\n" "$netmask" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "<###.###.###.###>; \"###\" must be in the range 0 .. 255." 1>&2 rc=$RC_INCORRECT_INPUT else typeset value=$netmask for (( i=0; i<4; i++ )); do typeset octet=${value%%.*} value=${value#*.} if [[ $octet == *([[:space:]]) || \ $octet != +([[:digit:]]) ]] || \ (( octet < 0 || octet > 255 )) then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 115 "\nERROR: an invalid IPv4 netmask was specified: %1\$s\n\n" "$netmask" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "<###.###.###.###>; \"###\" must be in the range 0 .. 255." 1>&2 rc=$RC_INCORRECT_INPUT break fi done fi fi if (( $rc == RC_UNKNOWN )); then if [[ -n $netmask ]]; then args="-s $netmask" # IPv4 network elif [[ -n $prefix ]]; then args="-s $prefix" # IPv6 network else args="-s 255.255.255.0" # Default value; IPv4 network fi print -- "$0()[$LINENO]($SECONDS): clmodnetwork -a -n \"$name\" -i \"$type\" $args -t \"$public\" $Eopt $Lopt" >>$CLMGR_TMPLOG # Always log commands clmodnetwork -a -n "$name" -i "$type" $args -t "$public" \ $Eopt $Lopt rc=$? print " RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 201 "\nERROR: failed to create \"%1\$s\".\n\n" "$name" 1>&2 fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_network_attributes "$name" properties fi fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then print -u2 "" CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "add network -h" "NETWORK:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_add_network()" #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ be u l?1+b|bb&R # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_noderk   =eainorst "$CR_cdhlmp#-/AEILMNOST\fu().12:>GP[]bgvwy%&,0;DHUk|!'*34569"ơ9ںPn0A0r6,-r7ٸ H 8oC``h$LR7قӰFx1Ô2%H" pf -6 H 8ѷ7A.$w~5(n`6 =[kN: P`y2@raMଡ଼u-mT7.ʖ.Hj.v+x+b= 05̦UI)1F*bdOH"U0y"MLWxdO"rE*a2BTʑ0 }b $T @P`p@P`7 IĀCC 'fN$a2S1@+ &3'xbH0b0A# N&&iB[E*5|f׫69MHnNq){&XH"H8‡A{k.zQxq𞫤#6j\،u(ngx܋k,ja of<0UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTpӆZŇɄ"PI6opӆs3tY.k^\ffIg[/.NU۾ 8sZ7)u N7xfH5|8o۞-Um^pJnx34muu N7WQsr pe7!NboB,ZWQg5y -b_k^+|<`5D Ew8oAFVMURﱍV0:lo͟5-ۀ[f0R g(f޽\Ŝ7ٌW8(QsrǐZ0{Kf?r_KpkU^k^+|k\ܧq 8irOdWpb(~hԛfX aN76MAf0f7\%Kf ]C3 _3k\x&-^3c\k5= -]Ws75w4U{jrjJ1nW95h\$S.E%a`k[^n/M g)$\")ȉ*"U~zР&H;73q~;ӎ;mUUUUUUUU ]ʶw웙jUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU7X栺sűVwܧ-T|#d>YGwV/kԃ {lk4ᡛo+ok:a[5cw+j;awӿn5^-s۩eXo`q7(./|ֳamϜ6BS{Xg5_5ЌP sZД/l{୽XaNn5|-]ڠTR 0f3kY|v `>+|nP\]fb= ;iƱXMm୽^׫R 0f`.mPf֠HfϚשe[tܠEW̑V/t(7ܠEWf׫ O 5Xԃ 2٬ ;o< Rf͖V7ڡ;mUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUQF1 ;Ʊ1

^9 Al]5dKAeRL("e ÀpFx~kV-]ڹGΖ+ag9u[j_5f0r`ܣf?eX BG9VqaϽ11sg{Vnpar]q/R 0f<ܢ łFCpLk|Zp102,y%8^VwbBh"LI"cAeRLqp`1I"炃P67(./j<ּBS2~aT0Ⱥk\vcw+{u 7Al|#ɛQƆv_5>7(./r mUXܤe> )*d";ווk\!-R 0f MP0nWf$%Ucrmԃ 2٬wwѹ%c@yYj`ܣf>[-͖+v^Fyy\NUUUUUUUUUUUUUUUUUUUUUUUUUUUTw`.M'HBSR 0f =[kUm0 `򻥩LmUXLo;EVL!lt(j.nS(XF 0mQt-l)eXڻ 2Sk \Tgי=hJfOԃ 5y)eX4@wTE2EQ,DQ0"AUUUUUUUUUUUUUUUUUUUUUUUUUUU^En.ܮ`ܣf>[-Q+n7f=ԃN[-ٓR 0f񅜢nP\^!-'a2BIUbd/?=[{X| &U)eX &HI6ODaJA$S$U$E *$0wiqwiX9x;'H$TRL@%t >MV|?y;ư h$e(D|,,k~wrWz J@^2~ ;yDx=Y2ąDA.DƂ$B%#<jWjA(42/?>q7`WÎHH%H&$TH"`N8}b bk[D LR%K`y2@raML$ =7!zB!#ظ]|8@waAZkI˄QDrXX; )*d";yDx=Y2ąDA.DƂ$B%hvyI"OBFOՅ|'mJ`)y>1Da<ܢLK ַ\㍇gE*@L8`; 6\J2vMVHE2: FZV;Rvj7+fMWH%GwaAZSE0P<`+o8R 0f((浼UUUUUUUUG;wڪً şÎ;qLOtylN"3HFلd]ʟ*‹5׎] IӰM9:*As(%'EH.wi6l@]!N7lj;k\ܧql#|t3ql7l=sgj6q(+r"@$U4HMxXX; _#qk^+{xsz$j.nSX9a$tX;'H$TRXMF6Z AlГg'H$TRXMF6Z Al;ӎ4yY.e c2)&\II2K`^E$$ky÷U{ԃ {l炃P^e6zg8N;ӎ;mUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUQ f|Uy{5Qsrtցfq<[tw~`ܣf?eX30c0w`?otd0UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUGً7 FemH0^Qw[{Xss|7 FemH0^waAZSkI˄QDrXX;ǛGՓ,H[-II2Lh"LI."_ ^E$$kųtm8k4^Mrayh,8H$dRHGqq5hENI˄QDrXX;UUUUUUUUUUUUUUUUUUUUUUUUUUUUQ#\ ͓sF sYųt6\lNq/{wڪ;ưi"p(._ sZwaAZ$ E 8r8X^ bx"LI0a";'H$TRL@%+isM垃୽Y17wiqqj\ܧqqr.W9.7ɛQƝj6k[/Ζmc U[W|f,^ y\sZgfnnSoVWFԚ<kcୃ7OtNw~R&g9 Nk^;3y|n.i\񸭨rk^oY Rfں8#mUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUG:$S.E%ax,wbxF6xL'~`Tlx(jZw$d*[ɒDq6tgymuD LR%K`y2@raL^C)!&4|nq(+@ZH\"$Kַ1nW> 7WfU+Y5㟠ybk[QsCs ИNa`8_fsp8 P, u%ܚwbbxF6x;lB7)3(4&2XKn@fXhAbfi@AII33-x jAdwsb D-34Ѓ3LWB 7g>y.M d23t-$C)("f ,#r 4fZԃ 5^gًXhAbfi@AII33-x jAdwHCAV/@ @"`2]6e'f>XhAbfi;@(UDEzsb DI ~ $D܂  znFיw+;t2EH-jɖ$-$r&4&PE$/ NyI"sԾk_!`~i^sZ7r )36f<*Az{7 FemH0^Qv㟞୽Y3q;| THzB! n2toxxz4 Nf.|]+zHEC&PE$&XGh̵-kr6;ו<ܢGk ЊV)$\")*$1zSE2EQ,DQ0"AX^ NLOAeRLD"Kp102, # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_add_node_to_group =head1 VERSION Version Number: 1.6 Last Extracted: 1/31/14 04:40:14 Last Changed: 6/10/12 15:00:19 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_node_to_group.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_add_node_to_group "resourceGroup" "nodeA" =head1 DESCRIPTION Add the specified node name to the HACMP resource group =head1 ARGUMENTS 1: [scalar] resource group name 2: [scalar] node name to add =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_add_node_to_group { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.6, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_node_to_group.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset rg=${1//\"/} typeset node=${2//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset startup= fallover= fallback= nodes= typeset -A newnodes typeset -i rc=$RC_UNKNOWN #================= : Validate input #================= if [[ -z $rg ]]; then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 121 "\nERROR: missing required argument: %1\$s\n" "resource group" 1>&2 rc=$RC_MISSING_INPUT elif [[ -z $node ]]; then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 121 "\nERROR: missing required argument: %1\$s\n" "node" 1>&2 rc=$RC_MISSING_INPUT else CL=$LINENO KLIB_HACMP_get_group_policy "$rg" startup fallover fallback if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 245 "\nERROR: failed to retrieve the policies for resource group \"%1\$s\".\n\n" "$rg" 1>&2 rc=$RC_ERROR else CL=$LINENO KLIB_HACMP_get_group_nodes "$rg" nodes if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 246 "\nERROR: failed to retrieve the node list for resource group \"%1\$s\".\n\n" "$rg" 1>&2 rc=$RC_ERROR else #============================================================ : Make sure we are not adding the same node more than once, : clchgrp does not correctly protect us against this. #============================================================ nodes="$nodes $node" for node in $nodes; do newnodes[$node]=: done print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clchgrp -g \"$rg\" -n \"${!newnodes[*]}\" -S \"$startup\" -O \"$fallover\" -B \"$fallback\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clchgrp -g "$rg" -n "${!newnodes[*]}" -S "$startup" -O "$fallover" -B "$fallback" rc=$? print "clchgrp RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 247 "\nERROR: adding node(s) \"%1\$s\" to resource group \"%2\$s\".\n\n" "${!newnodes[*]}" "$rg" 1>&2 fi fi fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_add_node_to_group()" 10/12 kꘃ1+?b|bb&? # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_novato_#!/bin/ksh93 # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_add_nova.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 SYNOPSIS clmgr add nova [NovaLink] \ USER_NAME=<###> \ [ TIMEOUT=<###> ] \ [ RETRY_COUNT=<###> ] \ [ RETRY_DELAY=<###> ] =head1 DESCRIPTION Attempts to create the specified NovaLink object within the PowerHA SystemMirror configuration. When creating a NovaLink into PowerHA SystemMirror configuration, it can be associated with nodes that belongs to same managed system. Each node will try to communicate with its own NovaLink to perform Resource Optimized High Availability operations. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. NovaLink [REQUIRED] [string] Host Name or IP address for the NovaLink. IPv4 and IPv6 format address are supported. 3. TIMEOUT [OPTIONAL] [int] Timeout set on NovaLink operations. This value is expressed in minutes. The default TIMEOUT value is 10. 4. RETRY_COUNT [OPTIONAL] [int] Number of retries set on NovaLink operations. The NovaLink operation which gets times out then will be retried this number of times. The default RETRY_COUNT value is 5. 5. RETRY_DELAY [OPTIONAL] [int] Duration of delay between two retries set on NovaLink operations. This value is expressed in [seconds]. The NovaLink operation which gets times out, then will be retried 'RETRY_COUNT'number of times, with 'RETRY_DELAY' seconds between each retry. The default value is 10. 6. USER_NAME [REQUIRED] [string] User name for NovaLink. This USER_NAME option is mandatory for communication with NovaLink. 7. PASSWORD [OPTIONAL] [string] Password for NovaLink. This PASSWORD option is not mandatory for SSH based communication with NovaLink. =head1 CONFIGURATION/SETUP 1. If necessary, generate the SSH keys for your AIX node: 1. cd ~/.ssh/ 2. ssh-keygen -t rsa This will create the private key (id_rsa) and public key (id_rsa.pub). 2. Add your node's public key to the NovaLink's SSH "allow" list: 1. scp USER_NAME@:.ssh/authorized_keys2 /tmp/NOVA_PUB_KEYS 2. cat ~/.ssh/id_rsa.pub >> /tmp/NOVA_PUB_KEYS 3. scp /tmp/NOVA_PUB_KEYS USER_NAME@:.ssh/authorized_keys2 4. rm -f /tmp/NOVA_PUB_KEYS 5. Verify it (i.e. ssh USER_NAME@ date). No password should be required. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. function KLIB_HACMP_add_nova { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : INPUTS: $* typeset -n properties=$1 typeset nova_label=${2//\"/} typeset timeout=${3//\"/} typeset retry_count=${4//\"/} typeset retry_delay=${5//\"/} typeset username=${6//\"/} typeset password=${7//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== # Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i CHECK_NOVA_ERROR= typeset -i checkRC=$RC_SUCCESS #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY fi #=============== : Validate input #=============== : nova_label typeset NOVA_LABEL= if [[ -z $nova_label ]]; then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: IP address must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else CL=$LINENO KLIB_HACMP_is_known_nova nova_label if (( $? == RC_SUCCESS )); then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 229 "\nERROR: the specified object already exists: \"%1\$s\"\n\n" "$nova_label" 1>&2 rc=$RC_INCORRECT_INPUT else NOVA_LABEL=$nova_label fi fi if (( $rc == RC_UNKNOWN )); then #=================== : username parameter #=================== typeset USER_NAME= if [[ -n $username ]]; then if [[ $username == [\-\+\~\@]* ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 103 \ '\nERROR: one or more invalid characters were detected in "%1$s": "%2$s".\n\n' $username "[-+~@]" 1>&2 rc=$RC_INCORRECT_INPUT else USER_NAME=$username fi else dspmsg -s $CLMGR_SET $CLMGR_MSGS 1143 \ "\nERROR: USER_NAME must be provided for NovaLink Creation.\n\n" 1>&2 rc=$RC_INCORRECT_INPUT fi #=================== : password parameter #=================== typeset PASSWORD= if [[ -n $password ]]; then PASSWORD=$(print $password | clencodearg) fi #================== : timeout parameter #================== typeset TIMEOUT= if [[ -n $timeout ]]; then if [[ $timeout == "-1" ]]; then TIMEOUT=-1 elif [[ $timeout != +([[:digit:]]) ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 809 "\nERROR: one or more invalid characters were detected in \"%1\$s\" (\"%2\$s\").\n\nValid input include either \"-1\" or a positive integer value.\n\n" "$timeout" "[-1|[0-9]*}" 1>&2 rc=$RC_INCORRECT_INPUT else TIMEOUT=$timeout fi else TIMEOUT=-1 fi #====================== : retry count parameter #====================== typeset RETRY_COUNT= if [[ -n $retry_count ]]; then if [[ $retry_count == "-1" ]]; then RETRY_COUNT=-1 elif [[ $retry_count != +([[:digit:]]) ]] then dspmsg -s $CLMGR_SET $CLMGR_MSGS 809 "\nERROR: one or more invalid characters were detected in \"%1\$s\" (\"%2\$s\").\n\nValid input include either \"-1\" value or a positive integer value.\n\n" "$retry_count" "[-1|[0-9]*}" 1>&2 rc=$RC_INCORRECT_INPUT else RETRY_COUNT=$retry_count fi else RETRY_COUNT=-1 fi #====================== : retry delay parameter #====================== typeset RETRY_DELAY= if [[ -n $retry_delay ]]; then if [[ $retry_delay == "-1" ]]; then RETRY_DELAY=-1 elif [[ $retry_delay != +([[:digit:]]) ]] then dspmsg -s $CLMGR_SET $CLMGR_MSGS 809 "\nERROR: one or more invalid characters were detected in \"%1\$s\" (\"%2\$s\").\n\nValid input include either \"-1\" value or a positive integer value.\n\n" "$retry_delay" "[-1|[0-9]*}" 1>&2 rc=$RC_INCORRECT_INPUT else RETRY_DELAY=$retry_delay fi else RETRY_DELAY=-1 fi fi if (( $rc == RC_UNKNOWN )); then #=================================================================================================================== : This NovaLink should be reachable and password less SSH communication should work from the local node. : Get associated managed system for this NovaLink and build the list of nodes from this managed system. : If any error during the connectivity check, just break unless we ask to force. #=================================================================================================================== typeset NODES= managed_system= nodelist= nova_cmd= print -- "ssh -l $USER_NAME -o BatchMode=yes -o ConnectTimeout=3 $NOVA_LABEL date" >>$CLMGR_TMPLOG ssh -l $USER_NAME -o BatchMode=yes -o ConnectTimeout=3 $NOVA_LABEL date >>$CLMGR_TMPLOG 2>&1 if (( $? == RC_SUCCESS )); then nova_cmd="pvmctl sys list --hide-label -d mtms_str" print -- "$0()[$LINENO]($SECONDS): ssh -l $USER_NAME -o BatchMode=yes -o ConnectTimeout=3 $NOVA_LABEL $nova_cmd" >>$CLMGR_TMPLOG # Always log commands managed_system=$(ssh -l $USER_NAME -o BatchMode=yes -o ConnectTimeout=3 $NOVA_LABEL $nova_cmd) checkRC=$? print -- "$0()[$LINENO]($SECONDS): ssh -l $USER_NAME -o BatchMode=yes -o ConnectTimeout=3 $NOVA_LABEL $nova_cmd rc=$checkRC" >>$CLMGR_TMPLOG # Always log commands if (( $checkRC != RC_SUCCESS )) || [[ -z $managed_system ]]; then CL=$LINENO dspmsg -s $CLMGR_SET $CLMGR_MSGS 1164 "\nERROR: failed to get managed system for NovaLink \"%1\$s\".\n\n" "$NOVA_LABEL" 1>&2 rc=$RC_ERROR fi else cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1165 "\nERROR: could not communicate with NovaLink \"%1\$s\" via SSH from local node. Check \"%1\$s\" is valid. Check the public key for local node installed correctly on \"%1\$s\". Check for any network issues or name resolution problems or firewall problems.\n" "$NOVA_LABEL" 1>&2 rc=$RC_ERROR fi if (( $rc == RC_UNKNOWN )); then for node in $(clnodename); do print -- "$0()[$LINENO]($SECONDS): cl_dynresop -n "${node%%\.*}" -C 2>/dev/null" >>$CLMGR_TMPLOG # Always log commands if [[ $managed_system == $(cl_dynresop -n "${node%%\.*}" -C 2>/dev/null) ]]; then nodelist="${nodelist:+$nodelist }${node%%\.*}" fi done fi if [[ -n $nodelist ]]; then if (( $rc == RC_UNKNOWN )); then for node in $nodelist; do print "check_nova_connectivity_with_node $node $NOVA_LABEL NODES=$NODES" >>$CLMGR_TMPLOG check_nova_connectivity_with_node $node $NOVA_LABEL NODES $USER_NAME $PASSWORD checkRC=$? print "check_nova_connectivity_with_node $node $NOVA_LABEL NODES=$NODES rc=$checkRC" >>$CLMGR_TMPLOG if (( $checkRC != 0 )); then CHECK_NOVA_ERROR=1 break fi done fi fi fi if (( $rc == RC_UNKNOWN )); then #=========================================================== : Define the NOVA if no input errors have been detected #=========================================================== if (( $CHECK_NOVA_ERROR != 1 )); then #============================================================= : Define the NOVA if no connectivity errors have been detected #============================================================= #=========================================================== : Firstly, update the NOVA object #=========================================================== typeset nOpt= tOpt= rOpt= dOpt= uOpt= pOpt= mopt= [[ -z $NOVA_LABEL ]] && nOpt=" " || nOpt=" -n $NOVA_LABEL" [[ -z $TIMEOUT ]] && tOpt=" -t 0" || tOpt=" -t $TIMEOUT" [[ -z $RETRY_COUNT ]] && rOpt=" -c 0" || rOpt=" -c $RETRY_COUNT" [[ -z $RETRY_DELAY ]] && dOpt=" -d 0" || dOpt=" -d $RETRY_DELAY" [[ -z $username ]] && uOpt="" || uOpt=" -u $username" [[ -z $PASSWORD ]] && pOpt="" || pOpt=" -p $PASSWORD" mopt=" -m $managed_system" print -- "$0()[$LINENO]($SECONDS): claddnova $nOpt$tOpt$rOpt$dOpt$uOpt$pOpt$mopt" >>$CLMGR_TMPLOG claddnova $nOpt$tOpt$rOpt$dOpt$uOpt$pOpt$mopt rc=$? print -- "$0()[$LINENO]($SECONDS): claddnova $nOpt$tOpt$rOpt$dOpt$uOpt$pOpt$mopt rc=$rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then CL=$LINENO dspmsg -s $CLMGR_SET $CLMGR_MSGS 201 "\nERROR: failed to add \"%1\$s\".\n\n" "$NOVA_LABEL" 1>&2 rc=$RC_ERROR else #=============================================================== : Now update the nodes objects : - for each node, we must update the list of novas already set #=============================================================== if (( $rc == RC_SUCCESS )); then if [[ -n $NODES ]]; then #============== : Loop on nodes #============== for NODE in $NODES; do typeset NOpt= kvOpt= kvOpt="-c NOVA_MANAGED_SYSTEM=$managed_system" NOpt=" -n $NODE" print -- "$0()[$LINENO]($SECONDS): clchnovaparam $NOpt $kvOpt" >>$CLMGR_TMPLOG clchnovaparam $NOpt $kvOpt rc=$? print -- "$0()[$LINENO]($SECONDS): clchnovaparam $NOpt $kvOpt rc=$rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1144 "\nERROR: failed to associate \"%1\$s\" NODES and \"%2\$s\" NovaLink.\n\n" "$NODE" "$NOVA_LABEL" 1>&2 rc=$RC_ERROR break fi done fi fi fi #========================================================= : If output from this operation was requested, retrieve it #========================================================= if (( $rc == RC_SUCCESS )); then if (( $CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_nova_attributes "$NOVA_LABEL" properties fi fi else rc=$RC_INCORRECT_INPUT fi fi #============================== : If a user input error was detected, provide some helpful suggestions #============================== if (( $rc == $RC_MISSING_INPUT || $rc == $RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]]; then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "add nova -h" "NOVA:" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_add_nova()"  k1+<b|bb&< # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_persistent_ipk#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_persistent_ip.sh 1.10 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)40 1.10 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_persistent_ip.sh, hacmp.assist, 61haes_r720, 1511A_hacmp720 2/25/15 14:15:07 #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_add_persistent_ip =head1 VERSION Version Number: 1.10 Last Extracted: 3/9/15 17:40:44 Last Changed: 2/25/15 14:15:07 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_persistent_ip.sh, hacmp.assist, 61haes_r720, 1511A_hacmp720 =head1 SYNOPSIS clmgr add persistent_ip \ NETWORK= \ [ {NETMASK=<255.255.255.0 | PREFIX=1..128} ] \ [ NODE= ] NOTE: the alias for "persistent_ip" is "pi". =head1 DESCRIPTION Adds a persistent IP label/address to the cluster configuration. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. ipLabel [REQUIRED] [string] The IP address or label of the persistent IP that is to be created. 3. network [REQUIRED] [string] The label of the network that this address will be bound to. 4. node [OPTIONAL] [string] The label of the node that this address will be bound to, defaulting to the local node. 5. netmask [OPTIONAL] [string] An alternate netmask to use for the service IP (the netmask of the underlying network is used by default). 6. prefix [OPTIONAL] [string] An alternate prefix length to use for the service IP (the prefix of the underlying network is used by default). =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_add_persistent_ip { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.10, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_persistent_ip.sh, hacmp.assist, 61haes_r720, 1511A_hacmp720 : INPUTS: $* typeset -n properties=$1 typeset ipLabel=${2//\"/} shift; shift typeset network=${1//\"/} typeset node=${2//\"/} typeset netmask=${3//\"/} #optional typeset prefix=${4//\"/} #optional [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset NET_FAMILY="UNKNOWN" typeset ADDR_FAMILY="UNKNOWN" typeset ODM_MASK="" #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= elif [[ -z $ipLabel ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n" 1>&2 rc=$RC_MISSING_INPUT else CL=$LINENO KLIB_HACMP_is_known_persistent_ip $ipLabel if (( $? == RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 229 "\nERROR: the specified object already exists: \"%1\$s\"\n\n" "$ipLabel" 1>&2 rc=$RC_INCORRECT_INPUT fi fi if [[ -z $network ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 101 "\nERROR: this operation requires the \"%1\$s\" attribute.\n\n" NETWORK 1>&2 rc=$RC_MISSING_INPUT else CL=$LINENO KLIB_HACMP_is_known_network "$network" >/dev/null 2>&1 if (( $? != RC_SUCCESS )); then rc=$RC_INCORRECT_INPUT /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$network" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 150 "Available Networks:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_networks available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi fi if [[ -n $netmask && -n $prefix ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 36 "\nERROR: conflicting options were provided,\n\ \"%1\$s\" versus \"%2\$s\".\n\n" NETMASK PREFIX 1>&2 rc=$RC_INCORRECT_INPUT fi #==================================================================== : If the specified address and the targeted network are of the same : type, no netmask/prefix is needed. If they differ, then a netmask : or prefix is *mandatory*. In the latter case, make an effort to : infer the intentions of the customer, in the case where a typo : has occurred, such as using PREFIX instead of NETMASK. #==================================================================== if [[ -n $ipLabel ]]; then # : find the family of the underlying network # print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clodmget -n -q name=$network -f net_family HACMPnetwork" >>$CLMGR_TMPLOG if [[ $($HAUTILS/clodmget -n -q name=$network -f net_family HACMPnetwork) == 1 ]] then NET_FAMILY="AF_INET" else NET_FAMILY="AF_INET6" fi ODM_MASK=$(clodmget -n -q name=$network -f netmask HACMPnetwork) print -- "$0()[$LINENO]($SECONDS): Network $network is $NET_FAMILY, netmask/prefix is $ODM_MASK" >>$CLMGR_TMPLOG # : find the family of the specified ip or label # typeset NAME=\"\" IS=\"\" ADDR=\"\" REM=\"\" LC_ALL=C /usr/bin/host $ipLabel | read NAME IS ADDR REM ADDR=$(echo "$ADDR" | sed "s/,//g") if [[ $ADDR == +([0-9])\.+([0-9])\.+([0-9])\.+([0-9]) ]] then ADDR_FAMILY="AF_INET" else ADDR_FAMILY="AF_INET6" fi # # Check (any) user specified netmask or prefix in a foregiving manner: # accept either input and just match it to what's required, e.g. # if a netmask argument is provided with an ipv6 address, just treat # the input as a prefix length (assuming the netmask argument is # a decimal) # if [[ -n $netmask || -n $prefix ]]; then if [[ $ADDR_FAMILY == "AF_INET" && $NET_FAMILY == "AF_INET6" ]]; then : The address, $ipLabel, is IPv4 if [[ $prefix != *([[:space:]]) ]]; then netmask=$prefix prefix="" fi elif [[ $ADDR_FAMILY == "AF_INET6" && $NET_FAMILY == "AF_INET" ]]; then : The address, $ipLabel, is IPv6 if [[ $netmask != *([[:space:]]) ]]; then prefix=$netmask netmask="" fi elif [[ ($ADDR_FAMILY == "AF_INET" && $NET_FAMILY == "AF_INET") || \ ($ADDR_FAMILY == "AF_INET6" && $NET_FAMILY == "AF_INET6") ]] then #==================================================== : The network and address are of the same type so we : silently ignore any Netmask/Prefix provided, as : long as it is the same as whats already in use. : But if they do give us a different netmask, let them : know that their input is being ignored. #==================================================== if [[ (-n $prefix && $prefix != $ODM_MASK) || (-n $netmask && $netmask != $ODM_MASK) ]] then typeset TYPE="IPv4" [[ $ADDR_FAMILY == "AF_INET6" ]] && TYPE="IPv6" CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 779 'The specified address "%1$s", is of the same family (%2$s) as network "%3$s". The specified netmask/prefix will not be used, and will instead be taken from "%3$s".\n' "$ipLabel" "$TYPE" "$network" fi netmask="" prefix="" fi elif [[ -z $netmask && -z $prefix ]]; then # : Caller did not specify a netmask or prefix - we do not need one : as long as the incoming address is the same family as the : underlying network # if [[ ($ADDR_FAMILY == "AF_INET" && $NET_FAMILY == "AF_INET6") || \ ($ADDR_FAMILY == "AF_INET6" && $NET_FAMILY == "AF_INET") ]] then typeset TYPE="IPv4" [[ $ADDR_FAMILY == "AF_INET6" ]] && TYPE="IPv6" CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 780 '\nERROR: the specified address, "%1$s", is of a different type (%2$s) than the specified network, "%3$s". So either a netmask (IPv4) or prefix length (IPv6) must be provided.\n\n' "$ipLabel" "$TYPE" "$network" 1>&2 rc=$RC_MISSING_INPUT fi fi fi # : Validate the netmask and or prefix length # if [[ $prefix != *([[:space:]]) ]] && \ ( [[ $prefix != +([[:digit:]]) ]] || (( prefix < 1 || prefix > 128 )) ) then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 113 "\nERROR: an invalid IPv6 prefix length was specified: %1\$s\n\n" "$prefix" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "1 .. 128" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $netmask ]]; then typeset nodots=${netmask//\./} if (( ${#netmask} - ${#nodots} != 3 )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 115 "\nERROR: an invalid IPv4 netmask was specified: %1\$s\n\n" "$netmask" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "<###.###.###.###>; \"###\" must be in the range 0 .. 255." 1>&2 rc=$RC_INCORRECT_INPUT else typeset value=$netmask for (( i=0; i<4; i++ )); do typeset octet=${value%%.*} value=${value#*.} if [[ $octet == *([[:space:]]) || \ $octet != +([[:digit:]]) ]] || \ (( octet < 0 || octet > 255 )) then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 115 "\nERROR: an invalid IPv4 netmask was specified: %1\$s\n\n" "$netmask" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "<###.###.###.###>; \"###\" must be in the range 0 .. 255." 1>&2 rc=$RC_INCORRECT_INPUT break fi done fi fi if [[ -z $node ]]; then node=$LOCAL_NODE if [[ -z $node ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 101 "\nERROR: this operation requires the \"%1\$s\" attribute.\n\n" NODE 1>&2 rc=$RC_MISSING_INPUT fi else # : If a node was specified, verify that they it is a known node. # CL=$LINENO KLIB_HACMP_is_known_node "$node" >/dev/null 2>&1 if (( $? != RC_SUCCESS )); then rc=$RC_INCORRECT_INPUT /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$node" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 151 "Available Nodes:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_nodes available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi fi #================================================================= : Create the persistent IP if no input errors have been detected #================================================================= if (( $rc == RC_UNKNOWN )); then typeset netarg="" if [[ -n $netmask ]]; then netarg=$netmask elif [[ -n $prefix ]]; then netarg=$prefix fi typeset NETTYPE=$(clodmget -q name=$network -n -f nimname HACMPnetwork) print -- "$0()[$LINENO]($SECONDS): $HAUTILS/claddnode -a \"$ipLabel\":\"$NETTYPE\":\"$network\"::\"persistent\":::$netarg -n\"$node\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/claddnode -a $ipLabel:$NETTYPE:$network::persistent:::$netarg -n"$node" rc=$? print "claddnode RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 201 "\nERROR: failed to create \"%1\$s\".\n\n" "$ipLabel" 1>&2 #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== else if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_persistent_ip_attributes "$ipLabel" properties fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "add persistent_ip -h" "PERSISTENT IP/LABEL:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_add_persistent_ip()"  l)1+\vb|bb&H # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_repositoryipk   =eainorst #$RS_cdlp"ACDEILMNOPTbfhkmuy(),-./12:BGKU[\]gv%&04;>Fw'3HVYqz{}!*5679> bqkj P3`Pp8Px(<  1.7+ͮ##㉘LqUKXa%H _?9!L2J$UStKknY0[;_f0b8nJr nA8i@iu2dUG(]Va'N>#xp`xGG&bX^^0f3 dJh##,\ Lc$^ٺk9)e>叄Y AA 940nrӹ\Fm}}qE1( ^vd3AAEKXa%H ZD'2ീYm5 9#` 6Վ&LH V6$'$l++aʴ@0x gL<8e 5UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUH"9V2dUG(]Va'N>(#-37Ans7yֹX8Nh֛f=':1j7|i־p+se^ˁDfRe8wftnnlOeff0rqSm}ϓL3-3wff0f?=4Kk9۔1rmθ`, E Ʒø޽֝=Ұ11sgh#ی1zK_ki٫8s7xȘLV3w^HA`Zn³6YG6v~73z"5UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUH hh=?Et($ *%`9\H'qjײش2\CCC!k0ׯÀ[4$?Ѫ?} 3qH7++RITPR(>煻unW<%L"%*8PMRQ"$VqR֙ϳrt3v7 ګG(h?} 7+YҝƁH7+c$Ǫ(TL`UfsݵuuY'Ս P)fsݵuuLcV6%@nWnybUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU!<$LR%KnJwiϵ81('o!4Hu&bk]tCM5X C&Nc eUB&4($ScEE4&!-a-`fqZGJBD֩N\U]9I,:1s߅0arㅚZ,:gn#bSuf6ӗWtuZD (&p( \\ݽUy2vC\($1c0-6ki,0Y.A!jI1,aPqaB%hDe(H2;YW=f/h'I$TRƏsJ \ $@n5$ȃ DndKQR "WV+R@%4:[ǑQL$$ݽ#|UTt D*`8Cؕ%VCӐ4?9bVV:Y1CӐ^%hu#r@x!<$LR%Kc2 q.HbT D@DSQVJ5i,uubU=U"HH3zϞH%L"p, r!ھ@jP@jPMQABD4ȃ GLD?EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEqcsu]9Z [oft?EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEfsTm.*b o͘0fcm9qc-`H ɖ3 CƱQ])3iˊG:"TH.. nއ*;!.ZCɔMULjPIL88|hȦd1ad,7tN=_lu]957n6$'#xjKGHzZLz,dGTR3i?9tȗ, UB@Gt\?4y*"d*[WtcR IA5KD ƤqRLr*PUT$dPXjHX@FWV+uZcPPx*)9ptOzH%L"?$ՊrĭI,uubcm8!hr*+<,Lx\\ݽ?kғ}VED$Vqp\\ݽUy2vC\($1'N ^C^yq #H ǪTS s7oC+RITc  d0i&PI5T"cHy2IQA%0P~4YSLb@pR Ok,cJ`YJNÁ?ד'd1Hy2ICɔMR )@ 20,^rxHz7+іbN&H2dUG(]V)'NeaX?B8@F7Z20,XpfqTWHh\Lb8\` TTBLk f.|i4eaXT.CӐ^?ً<,~4j朇 X;` TTBLk qTWHy1E MSYr8i1qqpg3v?aU arLjDƐeTJa;ŞE4&!a9k0zS0rlN"fӰG=km`qO^9msZ![l0zS>5%![΍ل8Ds57}n0zSf ޡ#x37A11sgyGK0y|,b"FHzZLz,dGTR4?9?Ѫ?0*GlwH`\lmt?Ѫ?kҊVE ,! fE ,mw2qTWIwIXFZ×l 9jtn~rAA ׂ+@jLunW<,v@jLuN&H2dUG(]Q?',ڭ'rƤpn@jLu1,@Pq #HD%.b 1p?XHH3{Eٌ\6qI&=REGM2#*HqC*+JNf«ɓ煻4F(5.Uf.a?Id~ \Y˘tr݂POCPư `$'qQ\-K5.Uf.a?҈k2;k;X@F `$$ݽF `qͶ[zEAxTT "cX$iuXvi,ÕȘ$$3v?fPXHki.NCNCCjC.4]9,X'~UUUUUUUUUUUUUUUUUUUUUUUURwH.3^2 q.HbT D@DSQc X@FWV+uZcPPx*)9>xX^5"D0HHj h r!ھ@jP@jPMQABD4ȃ GLD??ps3w̱rp|ɛYƝk'NkL8bz"e&RfX8$ '$G"lJ̰qY8 H!foL8bp҈m6F\՘=)Clf9j*dg 3@jPJ*+FX8.. nއ\R$劐P$CY@ftPMR X'ֻsH%*8ʊ&`ۥZ篜3Ms{ aFCjCɔMS ,%«ɓwHzNxGfb 6,ԈPMRHA!ZLz,dGTR5Abd#eaX #,VNoU@N+'* p~ nއ\R$劐P$CY@ftPMR X'ֻsH%*82d6³';Yg,Y.ṯrp| `=_eضiϾf]91YgkX98 4eTB !«ɓ4YcDC{L|ھs]njK\C?2F3wɛYƝkG%7.q5n>HUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTaQ[Q2Q\$$ݿQ2Q\FYUUUUUUUUUUUUUUUUUUUUUUUHds7xõ=)smO3vhgkaHk٧>M7ل8Dp1jQ]):w*@j ..O'N3:'NơզUwH$. !eXHnW>p­ZnWtRMZnWt!rTrHզUwHg`3|޻s5n)rTrH!eXH ŵwzKG% A4T TDp1BDe0nA-R**"8xuS"\L0?nއbCɊ(`jˑ걤ǍYW'd1Hy2ICɔMR )A,)Y1 y_YҝY|'\6AHne<ft\n<;&nx>x@zRj3ل8E _?=8m]|h JCs-Xx0,gԊjT9Q $`d7TER*"8xuS"\xj@qQJJ&(]Tȗ,7C%h«ɓSwK5yn:f`1қ1j3ل8DX):w9XDG.dKRY.tb煿 7@t;ՓfZ̫ft8yBtV(? bLrRA 1Ό\f-XU :p (",a# &jJBC1g^ٸf·n@ڇ;:Qь#kZ1rʹf7oM1knxXņ0H0tb8YaD# =(sNАgGJBw?ta~v&,gŐlN" 67$``XjCɔMR*8p4X@FVǪTS Cf*+<,Lx\\ݽk\u>mK ?ד'd1Hy2ICɔMR )`jZ#G`׵[mIӄOG3P'Nad,40YqIӱm]{]S-XU a!8$d0i&PI5T"cHy2IQA%0X,;喹H?u~7j3ل8DrYGx@pR,Ԥ?ZW^Ub}X0A(&Nc eUB&4($SP\h ںݘb :pwH`ơuuLcV6%JɓmKke<ʱa,$'P^L-! &Li&PI5J($ ]`fZYbzy f?6$'#J,5fG\Oa'N>,7qa0tb8ˬلgل8DgCӐC +SƥRƤLR%K C73~ @Ƚ~dP]uclN"| $j UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURUlC{!Er%fErǦC+b_! |ᙽ\%PFG-` 45{ yvòA L!@UmIӄODSPb!W:ʞ:f! e< Zq@hpÀ@ɶSǛk-qXhxphp@@<2e3aXf+Nضv3l!+m!$lڱCDɒT pZ×lͬN# CK:W^7on# ͬN=Q"# !NfOOt}Ŭ0|'ɦ3Ҽnއ޻p"A;c|i־˖;yD ͮD$1?{4OktĬhbQjdL &U0Pw2׹ӵn-m6ћݿ喹HÄ6X1sm=ay3k8ӭ~7(ׯ OL+uyy@C9@0k{','f렏\iXW7}8=19Vׯx=1mpAkعX o\fAg`os#ͦB^f0Z^UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU 2fS4 mƦr7@c-zi@ l*1+b|bb&qY # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_resourcegroupk   =aeinorst "$R_cdfhlpu-:ACEILMNOPST[\]bgmvy#(),./12FGU{}&'0;>BDHYkw!%*344tƓPePϥf`p?S>.<(m8%;HC@ާ}\Xg6z b`p?S>.;Yu}- @ާ}\XլmOzI*~*O>Nr'&ڴ(pqCPC!I &BD wx f`p?Gg"rtw<[}C&C^SݬtnՔk# &/ C&m"$ &S2*^"PV%P]X|PfGI1 XbJGL-T>9}S>,oJumw2̏>zenT *ն)V@q4P0PLբPM?LբPDi4P0PhfFEMZ%QC-&ܨB0 5hIb V1b(5hIZ빖dy?MZ"$ʓE$ʓ5h*M?I5hIE†aDP A𛻻CfA}?~?VQU7MW'&ړ0V鿣OV !3U֙}^x2aRͩ3`k}X~ta_0cE!IPqJf)WNhTbB8Д.YШą&qCoaǡ)]̲mʄ 4!V?qCoaǡ)]̳#ϙDQ?qCoaǡ)]̲mʄ Z$A``ƊB8ДR[hШą&qCoaǡ)]̳#ϙQ LÏBS0dەG (1Ѥ?(m8%3V5h4(ÏBS0dەICx ŀ>BV0(m8%3V4*hUѠWV?qCoaǡ)]:ѫHRtF&P{4z^V btFP btF&R*C bE!E&ܨ@B8Д.Y6BM 4 (m8%3 MPHQw2ɷ*0 4*٣mU*2(m8%3 MPT?qCoaǡ)]̲mʄ ZM^Uŀ>Bdy0(m8%3 dy4*hUѠWV?qCoaǡ)]̳#ϙHQw2̏>f&P{4z^V aw2̏>fP aw2̏>f&R*A𛻻Cf9הduV*6^aenT ͩ3OX~dەuϣXDj7wwwwwwwwwwwwwwwwwwwwwwv aw2ɷ*4+#?\tZ۫`Di 4+4X|PUGhsM!I &a$$ pb=4&3VQ]+XD& FE~z =`=*#|4@Qi#DCӴZ۫`Di 4*$AGVLD !5m$(@≦gZBϡAت_0c!HgSL\ѠWV?הgdb2Y4* ֒ h FK>g x gJ2Yp4ke-gSLE!HgSL](gҋ{4zϡVBϡgЪ(?%CzΙVdbVQY>h880;C}^2Y•R} FK>t#%C N]3t#%CzΙB,aJAOUi FK=R(iʼaAaLWzJuŶdم+i=V%),aJ$Lv*>!J'F"@e0(bᣉQRMsU'&ڦ2"sDj$TA$ ?`[ΫEMݡ1`3q4hՇHqBIXy}!I &"EH'DGDneuW6zbf(8VLr,@ .A/1(m8%3V4+?!IPqJf)WNhW/@`iA҃FJ J!V?֣GhsM!I &a$$ 8 GDp3eix=myODJ@Qi2Ʀ\LB8ДR[hЪ8x, hb8!$,<$Pa"-s-0eHRg6z2<K(DR`h4P4P/4i;Ci"HI5 /8!$$XH b=4&3O9-s-OV kz (zTDg%DCL"D==&qCoaǡ)]̳#ϙTpXAHqBIXy}!I &"ED s0[<[}`(yf&b210i208x, մc& Lt?ׂ|(g W`Q*;Ci"HI5 /8!$$XH b=4&3&7V73pՇ耡Qլm4L( [c$@bĔ Lt{4z(/K>EF >p\V^<FAϠj(O닆YR2YQy7=>2Y#,aJ6Ǔ)DH H##%daaUpXAjIP1Lx&TL !9T?ׂ?P_z T|ѧ3Ϝ?ՇW?oF=3U C%/1(p6_C=B#AȚK`Q*S>H5h Ruk8nM H5KHRjت>ṖTɸaO눐&4-hH5:TTkIi}r#A(8D1`QG*(B2J>gԃZ)R # G,mqX=/i^ ṦVMƶ C}\\74EF5J+&[S>.h좢n5J{ktTkI4EF5J+&[8D1`QG*(B2G43ϞNipXr<gPV%P]X|PZ]4$$Dj,$[`1eDuqw4>B A)9`q?此Q4ǎ.eDˡYQ5EqZ(=4EF5J+&[H)Vdӏ,bLybir(LrIseGvQe<4q"eVS"-?‚4EEdkKGe|sM(p?‚4ҊɸL,-ҋC AX TsMQEV]X|PZ]4$$Dj,$[:#O: /ƴ0UՄk92Abf(8><2lm"$ &S(8U*jΛ: /CyO `W%!@tq^`4* & ֒_0cHQǝ\mJp(iʼaAy@>(8F4L!Gtq^a(EҋjpqmhA/i9VMƸ/HPLLybi[ C>(2B=P nYg]+&>|~喦vSV=X/yOsM3]XJ:g&Y|;nj996n]qg3(8Uh.}InjA`7-૫ F1&[s4m "@8hET;%&Imр?nYQj4v1tDj_HqBIHl<1ea[:m侬77R7MW(2fbeMbz[ipفT(̤^sUɶLJ 8ir 82"DzhQY7! a騘<([I1&8i]BʉCx!‚Geq $4T,=5Xc7wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwv̻T!›YuJɮ?neՇGOV l*yOsM3]XJ9F;nj996n]qg3(8Uh.}InjA`7-૫ F1&[s4m "@8hET;%&Imр?nYQj4v1tDj_HqBIHl<1ea[:m侬77R7MW(2fbeMbz[ipفT(̤^sUɶLJ 8ir H2&Niɸ UMDǖ(&CjIP1Lx&TLCx J2 g_jEF >p\V^<B2=&[:T C%/1(p6_CYB"d$A2p(iʼaAy@>(O9y㔴Z۫` (DL(&Tpp`v*O>neɸaO닆xɸ()pkIm"$ &S(8U!EF*-z'&HpXr<gPV%P]X|PZ]4$$Dj,$[`1eDuqw4>B A)8 !5m$(@≦: /CqHcɔ$$UFaJzLuj: /CyO `W%!@tq^`4* & ֒_0cHQǝ\mJp(iʼaAy@>(8F4L!Gtq^a(EҋjpqmhfC&'ѹՔkb]Oۣה i!wwwwwwwwwwwwwwwwwwwwwwwwwvO>TO@DPI2eQC*Uӫmwz%&h)S>P4LYB"d$A2p6_C&cɗP (DL(&Tբgm0"&HzI*jE<oěemY3f [p(bᣉP얂ԛ&NMFP ?eEHqBIXy}!I &"E 4LziLf]lϒ8޶JI75_@@Ku7=nudwfaP2{O7MW'& 3t@DPI2eQHq:) ,PM1"մc& Lt?ׂ?P_^ Ui_7ix=`ͧN θ فU?`ƐYu} "</^3 VODD勏$':t{NaJeѧ*iu^(0m!GVIz)S C(+^+&P0?PVY ^(?Y^ ]X|PUGhsM!I &a$$  CDH(3q[C̤m3]Wgӄp@Tم*eXy1GE%ʹKJiC AZKEdk UMDǖ(&尰WV?nv!MVC7,.]X~> ?rS;)FفUCӄws}$~rrmܻՒM=nCf P4q"\}$yɶhn6'Z WV67bMi,3]W8D1@pĊvKAsMsU'& 겢hb8!$,<$Pa"x&b=4&3.t}YExno[C̥NoP e% :^ :2[;P I`ϛ&m:)/E*}QY7! a騘<([I1&8i]BʉCx!C&qڜ%8TԙL=X/Fڲ:ӫl]̳#ϞԙD?nfͽwwwwwwwwwwwwwwwwwwwwwwwvuk8ne*.PB$ ^029W4h/(Bgm0L4zS Q2(Dy_KY빶j?!E2{Rf 3侈4TpD\2ݡ4Z۫`@h @d *P LR/F4?!E2eHQw2̏>f aw2̏>fM %舉IG4i;Ci"HI5 /8!$$XH`1eڜ%8TԙxSY?GaV7kdyړ0T}0i2HdyW'%%8T!abf <CjIP1Lx&TL?nqڜ%8Tԙ/Jz'eJfix=`?g\}:779-&` Wa%{ѧP ?`ƐYu} ( TLpzJ 8hW(iʼaAxCuk8ne*.PB$ w S/u**4X|PBgm0L4zS Q2(Dz&@sB029W4h/@buk8ne*.PB$,92KC>(F.CMB"HI5 - GDn%8Jp3O_EGNʕGM3Ԥ3f tVpjeFۤ"s3&P=B( "@p=BÓ T<%13F !5m$(@≦g"!Iب+ZH1})4ke-?`ƎR1]L\up4hՇHqBIXy}!I &"Eb=4&3Ղz܍kB=*"f&bJg"Gc LqD8 .f b3qp>.:) L\u,Ƌ,4*h+Q9$PCMBEa ziLg(Dڬ:nV0gp ‘D!abf [ڬ:nV8EV[Y/_:ql΁V|謦r'LA)L\u)3qׇp, HPp8x, մc& Lt{0_  ȸp^! 1Dy1",,ՇHqBIXy}!I &"E @f#Lc4I75_NM_Smʹe7aQar|f r.:tR$4T&4&$\ !5m$(@≦VY𛻻?5{1 WV?`.:T^Rf 7!Hg|Юh+ bJjLSXzI*~r2jptRHcɔ4a ˖XŜ̢E^eY) FK>g GR} Q+:g G[2BV0(m8%3V4*hT8R]̳#ϙ&qCoaǡ)]̳#ϙSBQŃ3((dەHRg6z&ܨ@ЩS(E*BQ3OE HqBI\R%'E#:uZ˖XŜJg"G2) FK>g CX),ՔVtϚG2) R[hB8ДR[hЩTs()e|$)3{= Le| G2fBMP&qCoaǡ)]̲mʄ G2hHU5&`P{4z># V} 58tϚC b,0p8!Hg|Юh+# VJ2YaJ FK>(e3QCx! 0Ǔ(h)"& ,3U,ɵ9E)8QJ2YaJG[2BV0(m8%3V4*hT8R]̳#ϙ&qCoaǡ)]̳#ϙSBQŃ3((dەHRg6z&ܨ@ЩS(i"HI5 *DY6dsVGN+QYrX)L\uP%F9?ŖHRtF btFM CYMs,a!IPqJfs,hTЪ9?Ń4R]̲mʄ $)3{= LenT hTЪ(?此h8F)B$D1 H Ke,rmi5Q`$$"PKq\~29#]TPVKa1Ç-5m$(=4&hb8!$,<$Pa"؀$?(wAZ{=*"f&bJg"GCf9;mnNs,՛W77sUɶF"@e0(bᣉQgInjZ)L\ux:- h?nD*}$~rrmM_WΘEF CfgIY-૫ GU-իεT?uG׫:bzPZ=m`Y,êΊ WnB?n/1p6_C1Ts9968 x `4^0ѠѠRaCqHcɔ$$UCZ Ro996X>)L\ugmH'9MCm"մ /iM\18ybXX+VLrLhF.CMB"HI5 -CAM2tze7CҢ!bf r.:pXA?c{Ve8޷7MW'&CqHcɔ$$UE&Imh3qףÖy8,Cx!C&_uiGz riua(SүX38?ׂ?‚^ eDj (iʼaAyHՇYQj4v1tDj_HqBIHl<`O;)Wκwuye& FCγ>f(&\ʲt=*"虋V~?+ ?J(Nruqaǟ{4epf(&\ʲtlG CÍ!]VN!acGjה@QaУL2bf enjCmbGE1 8~$A2HqBIU2Dƒ !CRoshsE)@tR"@eCos+%@$$UG,}$yɶAn @'&d(YQbM^yY 6j^fin*V]̳ՇtKۊNZe_)~޲Yfwܫdp"p7.)+g]XJ<)LWO9RyL+j9[:mqm8O( )3@ܴ=a8q%k}X5ۊT4Z?uի3%xP 6V"@cIIa -\  Dy1 ^W,ZY"@cIIa*u  Dy1 @'Շe7:ԧWFt~ՈSWκxS? ӧG?ӓ-hQ\~5p)b׃/QO D7.EyL Gze YVxSnY^S)ڕb{߄]NSE̲֙yƯYnά?:8EyL D7H"ϘgՒxGP (F[uëՈSsMNNU-YzٷVY|.2Ï?Fs,aGi@.7n@'ͷj.{OϊG:8EyL GɶVuaWa쵮U90ܴaMʬ ̡q2(PL ("4Ph`iA0iQ_Y?$JcӱAeI"`e@aA_Y?$AGV(LDI̡ɔPd &@=BEfiםUi7Р@ e@ӲEeL4zS Q2(Dz&@{CuXA̡ɔPd &@=BPC Y?adP`7Gzh$o`,SOVpjnqV \mRb,>o`,SOVpjnqV>9ނXq(Dx?#)/ r2^Vo]]3hUVaBCʬbŋ0hUA Bh80hGGtV,@ "@p=Qdda ?VQ^0VtLq: GtV,ǀ&A1YF9sHRJՁ¬B8E*Ƴz?՛WoVmV]X~e A @7ȸLx"d 5g4vofe?]Xynj996PCxg0D&<k0è7i?f%gӫVsUɶg6M>ng6z`R DaQo\cu`y7ë+AWUUӫmkdy ]̲mʄ6?ՇW7MW'&ěem0PCYu}3 P& :szԤ9V]YFi*TZ{ G;%ua(Ӧ㯫MyOIA v }eXupeljr=Yh\7MWrrmCPCސjLSK(LiYVpH]YOXHURf ,40zeՈS&ms5NM(TƑ5g4oi*noëe~uqǭ?ՈS&m,+r_EgPPAr?^L "p3VGN5ͳ%BWj-^SUZ9ҮΚ,>=X ׃/MB[=o:iy ˱ fْ CҪni{Շ3<9O޴+)2W^[C7En0eP @'#%\pq_AύE,x0e6,#@' wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvNzFuqVMXш/PotVwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvDGOP\bkwy%',05;FHKUYx!*+34672X .@BJ $&Y#$?;̬on=6oMˮ7\];Sf,.EFO "^qt2L`~ @Xx ^qiˍ~ .@BJ $HFH GGd (*(HPd;2[:7.rqtM:@_(:drgY& DNQDq>'>Ka=;Lq{En3W&;;/r^Lq{¹0,Q`rb98NMAY>)e\υ"Y`@(@ ; wZrܮ'MQO,qzs28X+P+7MCb;Gj>IďFܧ;S  fZkd"`YTHa4;XTqu9w `,β(L H@QdJ}Od|`H p$NYH 1,@?!`/*֎h8 "TY'(RzvhI@G2\ּV dz CΞomL`oMs"67(WNbzS^p]782zr|ֽ, !z @Z hOMӐM^k^)n-}Z.7 .-jnGڷv 7.Xf7ܷ 0z|ֽ}ZG|mMԽw~+5'\ b XMI('ޝA9 &eA ˊ]\'Aaah"D d!@ J:`012ι.,`圙C i*,Q)\O;I쏒 XxI8 X:0X3" [#,,2`GDk6f,3qT{6}OfD1nW>1"3H0pp{6u@88]?06U:D  9f 1nW=a(i4@8s A˷clܮ|;@$88]?3{roZ$J.AQABe:vA\x ج'{.ܹ[:#k7 o. yE^UUUUUUUUUUUUUUUUTH"D@-;MwF0rc|>'+i=\,/DYr)"H00kԓ'ds E `% HC"$\qk_&m7S``N{Ao#FH ^eq>'$ H"2EK$DD LWWW4k 01ٰo5 RL6Z$J.FtH*(]" a/Eˊ{`ysZ Ӝ^0zv<^xP"\EI0LD LI9DB0HΉE T< }] Z4Fd"/x!5fs}] ȔJ,H(L H@Qd|.cLDf[a{oG @n)4sa{4P 05Hufɗ'b&͆f̓ypo1|' ka{4́7WF!mf/5JR% $XW& DOC0`j B4Fti)gàyu \,/DeȤ`"D#0o5 tr),DTrDLLDԓ'ds E `% HCx,Crt F.\YG)b'A\ƘxP[;#lH*(]#(TPEL 0cLDfB"xP6)H&Xa\ P<.M(\Ƙ̷spX`R hsph6w. aW4kD q=w /fy?.NM ͛ZbO -@P?@dzZdx $d X q0ĂR&Xr䈙Ha`uUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUSrjZ3iWڛR7)n־n˝4FwFqo1l3s1^.jZjZW5\κC-؎mW :lDl5]ӝMҰVu76# y{;%5Lۈ+|9znK\ow1XogPknzOX q0 Nܦ¹bFJ0UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUMzXl4eq>'6 #)kq׮75=.+8\Ƙ7Di,*l-0# 9saF1"3撮:y%Esb#(bBH(TPFJo Mv:r >;t.cLDg W%\uJB4FC:?6mZČ T@ @2Č^VČ T@ @2Č7WTLEHR!i‡N\anitpy%Esb#!f/D2ċ D""cLDgF1"3Z%H@2 W Hd9گ T0CDB2TX[9㳮GzˍɅϸa{-V#x؃7clܮybIRdRdeoB)(R1)}Og۔*K&c &&_.Hޮ^pok;#lH*(]#(TPEL  "$\qF-qFWN{"ibx0P~EkLg׾ )oɅMCqqπxteq>'7)%ȤXT@Pa6oKz:J؆rqrD &&] q䉖$dAW4kD~B@q(YXh6.< 4 Fǀfa` fͷk\@LL@I R,H UUoa Hg6,xO6lkޮh։12&P%h$L#(aAZ%H@2.@9"e͛Z׹E#r+FWN{ ɋsFY4#&\66 ticj&cj'H ^W4kDt (&X! (+D#)&P%h$L#(f̓ypoekܢH+i=Vdŏ zZ0tp,ѡ2Dٰٰo5 f6t.g]!uoosFH H@2.@9"eC‚K28Re]VrD2fػ &&] q䉖$dC ,H@I uZ,Hfl㪪#Z\Ƙ)E#r¼־N;|پLcVO^5\κC!ѵ^ًޥ &{k㷺XΜ/r{ផoyczg~ݨU'ukg[#k:|ַ|==-9=㪪sFhU<(+Eگ hHaх3hu:*Rmm2%H>FH H@2.@9"e͛‚!!bT1cB Mt'ds E `% HC,ekͦ_jnQHܥFHa^k_'WzxX An 6}uf6x_/=+P cO]}c7 Xw@#$'ޝPDHX4FPok[ HfAxNA꽭ޮhtas: AXhf6yxPV.ѭbe*LK HbFPČ T@U@2Č`pbe*LK HbF@0Č T@U@2Č6poٹ\be2%H>FH H@2.@9"e͛‚be2%H> rHHX LX,H@I uZ,Hl$e#!!bT1cB zZ$ˤd$,K&,|C6lk]%$eDQB$gDB*`P `x.\T56}E#r+@o»xX AsYfz8\Ƙ+@#$0@6cj'p95b&͆fp𰽄svsX07k\&N-% H#:$J.S0f "KrS&,|s: N&m7PG!x .g]!0 I9DB0HΉE T cz.z#ѐ wufɗ'b&͆f̓ypo"P"`" :`Pfl7&N-% H#:$J.S1 "$\qk^ =!7˃1aӽV#Msҝǘ7 A <^ %IHHXxP"\D.\),,2W4kFOh<6 JR% $XW& DOC0`j Idr|:]W xYr)"H00kԓ'ds E `% HCx,Crt F.\YG)b'A>v$ $eDQB$gDB*`P tsp|B"xP[1nW=0JD2ċ IwiIn>,/}@>l@\00ޮhֈz^"`~4#&\66 xC@^h>/6^Oh :D H*,&^^^oF65Ӽx1 q1w K;Q㪪peȤ,,* ak\sFhu͛ZraF'*D 2.<8o@йt@7D br Z$eDQB$gDB*`P "$\q]dŏ.g]!iͦ_jd/xt2$ $eDQB$gDB*`P`1˽L=r^C8p8p n.ÅΞk_@x@ $ H"2EK$DD Lוclܮy.z\κC-Ua{ ( uoٹ\ΑOsr箑Os8h}V4#&\6v.Es:PFTyDٰټvx8Nw\p@z2:PÇ8xÇ8H8pt3'$UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTҸ'bqKRilŃR0vvU<#\!&\,/F)Yr)&`2‰,,3vSR&Xr䈙Ha`03 Z$J.DUfɗ'b&͆fͷk\)&N-% H#:$J.S0XAG:o|b']7 z^؄ANCp`qL(`95ΜFHKtq ޯ5`j!W,G:lYJn]{Px k^{ Zw;;ƘΫ׼ig|)qX;k]):t렣G4vN  B9Sd#{GňV,])ha! B9'7 %a7'(Rzv\,/F)Yr)K B``7\Ѭ5]%EɗMs"< t>gY9`k\zQ|tL&\95Μ=xdz(AB =( >;d2ɮtG#E꽿&""KWdº A+ i9EӴXb kGUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4sGevԳl&ܓٛ؀eg|pٰ1au@V52T؇5=˯khMs#Ꞃs{gn qƳԾΌZZՋy޻>V|V"u{-Y^'j4w:邷AM7Cj +8nY>;ŅD`cOGMBZGϖ'7LaQ0֎XNv*Nobb-uO,@!&XPBv$XRBM찠'<5<456 (H;aAu| (H9՟y#{βfO=+b<|V"u{.k:ml215Μ65&Wp5&&ob+^*Nobk0,*,`9Zs{,FX5-eXϖgxӥ|{βNh='5:lD ?5g ݦ—ϾƷͣia𝩰z|tner/Mg@婌Zn=+hLی~_םt6\rVڬF[;=yKc{κ.9{:齈cL]Lb6k[GMֵշLoa]5ΜּHf9Zs{Ξ;/=+S|%;r9QaRH2#7#a^k>@-Yo?|tm ؆sY &cfٞrm>ksZˎ^*Nobigl Bh`oדn:=;'ONB?YXhT=9嘅hF. O|'pR1{}P1:s{Գl'(I'Rχ@AAm-nP?,@&& DNQDq>'"¢ kt:r;SӴJ}OdKoX*\!@T.cLDdKokK2TB``0x0<رr@`ALJf %@T;J;bY,*d5rtX'ޝP- =m-nP?$`rbIkHNvu˛qNrzwƟ5k^;UE{֭nP? \P"Tc&<~Xf7ܳE "L!3y%ڦB&{1p4cK=57n`mN6ڛst1s=Zu#@+i=r@.HLjSp̭y1m)#_a^k_+y1nk:{͌bn=a.cLDg4\$˒76+^-}y|.cLDgΟ5-)1x6?32LTR_Btyk_+y1l.k_ HgaVkAKo1"3YZޥ0{[xO4*,db 8 7/;;ٍzWy|'ޝŰ{1^o ZRsizV07j @OE,@ԧZ8+k67JL&Nnk>\'ޝb䌄KkpX;X\9ڀk^7MCs,ۣ.lk8py4RTwg./bu-=ڍwrfz8ܘ=Q'M+b:l]N OVAF0&3ύ 4g_)><;z;Nv2zxӥ sLim;|mMKf1F.\a7mܙޫNV覶͌릚۠7鹭M~;%6RωXb kGUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4vekau|:vAU[]bvw%&;BDHk!'349KYx{|}*567K`HjT!ai*VYI:v% B( (^ 0/À+*H*˯y0\Az6n;[aϾfVGr^bt.bK;[sq <"afyN #%fc.Zk#`s-zh3E<3( f6ւ ٺ Se5W)ŅI#$xG'`t"8!G0XBvO4jZHLL#?, ͱp@bd d՛k\?GNLăVלa@Hy`!ǟH HYe$Ճ92 <\d?&pؽGȶSӋU#Ph8p@-kZ?4aD<"l ҁ`|l$/#cPhېk p, ]d4 "@8M"ETj)'N$^U6ce'Jax]%"ϥe XX6j;V[xoi( Z;൉ wk ͜bnUYhܤ%ft$PL Pd &@@y!2bdA@@ųc,@D-@gH$*ڨ<*,Ăcɔ.8G@ U N{q{J]5rS:3E$%.x>`qA(\pc,@D,mx=%kc.uX9)yf"NFB` iTLqR(űv8ftmq{ֳ.}q;t%;aՃh&@r xfٜV63Ӿ jtsz'vV38s^c-krfq*ٺaՃ4NJLc6cn3uLp&8-/̋&sf2+U6^V6՞_ȾkޫXbyg'Nw8B e8慏.4^g\Yaַ8s^'N -0Zt8B e8慏.:Sg|s]\1q}ﱞN~rtG3*\BbdEYN.ycgl+er8g%yGy:vy jbuFbE;*\BbdEYN.yctXwָxkެ 8*ٺ?]7ZmY|t\r^:Bbx˘`{3W%q{Հ'N13pЋwtN4[;jt3ֳ-88ipk]gwKϜ0q^׭{2׽{3Ybkq`1q2潟e| dw{;U/|^{?N.׽ ܧ ^@2(gft\RK(LL+)4,Gtg1{ڲֶqa'N;˦{a%є ~s^7 _ft{^f 1<ܶja'Nu3'_E (T  Q1J \d?]3ل8E-lٸt0ϥ.(3Äwø3qk;X{ųtm8kb{8)8xվ;av˂mc\eַE[օ|'L/u`qx`q" $ +*7r a.!SlH HYe$d 0  &Whx'À@8@?DC#rʊ,#?b'TUN*I4ž Z\hurCnW>NCL 3ܮ{൰N' [=Zt'7+'Ns4@4?gY\ڰQt x 0h"γra'Nuʑ(hiAlN""ل8E а*H"D1nL 20PI,[ ^USIBD  LzG&yUUUUUUUTÖls93*aqQ\h ѓoiŅ|׷7#XhD,8DIMBEà G75-bgq3qk;[sC##a&FF 0MajصYeqkع dgJ7.`azӷݡ'Nv*Ѡ4LhÆj (a@"J&Du*(\.<Bt@)@#aPP/֓&k-H!H؀xhx(1rt[c{Xcy9[tsjrSFFD ##y`s7<Шp" }ΔBx(@HLgq#3 \fqZxN]潝ka*+-l:S**#&Z bkZLlR"Hzj_E"$"aaLb ZYk[_5lFڱ3 ^mYk[2`.4^{V[k5;g|5X9)qznKZr2˞k|kekoå0Ճ眳̸`qun =ȥi rS:S׭zwiY?5lvUǙoV~n~`j7)sÞX9)C6}`jGr8)7aFʒt/}fʏm0bw}'NM}2mIE 8vz6lܫf<0gHbPTwUE$1al BtBH4ĕ`qƫ c8!Hr0'N e\k]Vo?qQ]0` $TTFL[ Ņ|׷7#XhD,8DIMBEà &Dypfٺ`0rCђg8\0<Tb&@ql-{enpfՃ̸f^Ojm|&}ל|3xNz܎X{`q?2൨Ֆ<4avfZ:xN1SklV <ks:*+B&p4@Hb(_X٫4h=oiwV1t"靠0pDӰXX{y8VJwgYXz D1 XrE KՖziT1!$R"Hzj$TA2Ӳ؁X6׭q8HNUzIB‰$8l(({yVM%&D2̸.?h>2qTWڰQtkqTWF6.'Tf.]3Va$a@^mX \N]gh;2MyƱՀÌ⢺1`1q:1t"z $8a`_5F"@e5XQi2nFH!Xq}-`AM2xXrX9|\eֶf$}H2@01CT*.#V3B.0 PIr5DIMBËD$Xyl Mac `GFFah&(&D/ āBZE4 M"9"&TP\+?L*+~JAcfxL&FbE;&FbE;HY:v {ymX \N]gh@ˏ2qTW:vŅ|׷⢺),\rjJz"/#H Lq2(7#XhD,8DIMBE(vx(N6\&[) Yhܥ\a9l#mVJwetX9)qZ̹md%;^2_;p mbgl+ersmrSXŰah#'Ns(a@"J&Du*(\_`)9f|;͜bnUՖGF"@e1QP&[)ՖZ2tG2HNzIB‰$8l(+IiM1P22̸gƿF6$.`V4 [a`_5‹Ir5DIMBËD$Xyl<88 elN"mx=fqZی-Lڮ2X0<āBZE4 M"9"&TP\y3_ft\P+E""MBiQZRC^(7#XhD,8DIMBE$`AM2a'Nu6Ӽ^3j˭m'N?nÞX9)C <`qk yFFFڨ<z D1 XrE KՖziT1!$R"Hzj$TA2Ӳ؁X6׭q8HNUzIB‰$8l(({yIr5DIMBËD$Xyl@8?@&Ds-s8j; 0 a2t7ha@"JM2eq^M% $Ű ?Q].95 GuZ$,,׷UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUG׾N-#r0wjZwKX9)C]5|׽VJwgYp8^6eV|l:w#vgZ̹aUUUUUUUUUUUUUUUUUUUUUUUUUUUUUT1s砈pHP$HLJ%$P4PlrtFBUb 5sƙ͜bnRN¸8M"EU`q CE"$rEH1s砈pHP$HLJ%$P4Pj 4UG6qI:v q0C]5x`4U HI"PyϞ8M"EU`q͜bnRN´pXګ &"rS\"*(,a& ,#8ܤ;QzX\sgj0HUX9)BĄH!\R%(7#XhD,8DIMBEÃ' ؎ ]ӽv~ՖÚN{`qul{98lܫX`y[36fnp8^ 022PYNa'Nu/qÕhEUUUUUUUUUUUUUUUUUU8HNUPPL 'UPI,[ ^FXx0ka4Ֆ Ux0Fg\g*+~mIӄ]r@h э fx/g }U ^γrDŘDc$$UFa'N;, A0䆂2t7hi8ft\CBAɖb"X/#H Lq2D1@pDejFل8D |mIӄ]rp;{MZDeq\yUUUUUUUUUUUUUUUUUUUUUUUUUUUUT@d1k\nˍ×)|nqu^UUUUUUUUUUUUUUUUUUUUUUUUUUUUUGz4,(C‚|׷8HNCPLP(+ TWe˦[^Di$ &S(HU \ԓj6sN堌;{M17eqUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUQ9;s{''c-՝ 9kwl2d5rUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUGz4$@bǨ@QB h^M%HiH /`V`EtR"Hzj!` $TTFL[ Ņ#H Lq2(7#XhD,8DIMBEÀ0~xц|mz܎m釘AprKQ!19my^ٸb`3q vlG6]ݿs6ŬهAprKQƮ0a & rQ sM5|Uw&2 rc=$RC_MISSING_INPUT fi #============================================================ : Create the snapshot if no input errors have been detected #============================================================ if (( $rc == RC_UNKNOWN )); then [[ $description == *([[:space:]]) ]] && description="$(cllsclstr -N), $(LC_ALL=C date)" # clsnapshot can create a .info file with the output of various # system commands (lsvg, netstat, etc) - there is nothing in PowerHA # that utilizes this information, but for compatibility we force it # if called from the gui or the user requests it typeset iOpt="" [[ $CLMGR_GUI == "SMUI" ]] && iOpt="-i " [[ -n $misc_info && $misc_info == @(y|e|t|1)* ]] && iOpt="-i " # Output from any user specified method(s) goes in the .info # file, so if they have specified custom method(s) then we automatically # assume they want a .info file [[ -n "$mOpt" ]] && iOpt="-i " print "$0()[$LINENO]($SECONDS): clsnapshot -c $iOpt -n \"$snapshot\"$mOpt -d \"$description\"" >>$CLMGR_TMPLOG # Always log commands : Provide escaping for some characters that are not safe in an eval description=${description//\$\(/\\\$\(} description=${description//\`/\\\`} description=${description//\"/\\\"} : Provide character entity replacement, a la HTML description=${description//\&apos\;/\'} description=${description//\"\;/\\\"} description=${description//\<\;/\<} description=${description//\>\;/\>} description=${description//\&\;/\&} description=${description//\&excl\;/\!} eval "clsnapshot -c $iOpt -n \"$snapshot\"$mOpt -d \"$description\"" rc=$? print "$0()[$LINENO]($SECONDS): clsnapshot RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc == RC_SUCCESS )); then # command succeeded, but check the file was created anyway [[ ! -s $SNAPSHOTPATH/$snapshot.odm ]] && rc=$RC_ERROR fi if (( $rc != RC_SUCCESS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 201 '\nERROR: failed to create "%1$s".\n\n' "$snapshot" 1>&2 rc=$RC_ERROR fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_snapshot_attributes "$snapshot" properties fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "add snapshot -h" "SNAPSHOT:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_add_snapshot()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose, even if the man pages are installed. # As a result of this, it is imperative that the information in # this SYNOPSIS be kept in sync with the man page information. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_add_snapshot =head1 SYNOPSIS clmgr add snapshot "" \ [ DESCRIPTION="" ] \ [ METHODS="method1 method2 ..." ] \ [ MISC_INFO={false|true} ] NOTE: the alias for "snapshot" is "sn". =head1 DESCRIPTION Attempts to create a snapshot of the cluster configuration. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. snapshot [REQUIRED] [string] The name of the snapshot. 3. description [OPTIONAL] [string] A description of the snapshot. If no description is provided, then one will be automatically generated. The string can be up to 255 characters. 4. methods [OPTIONAL] [string] One or more custom snapshot methods that should be executed when capturing this snapshot. 5. misc_info [OPTIONAL] [boolean] Collect miscellaneous information from various system commands like lsvg and netstat in a separate file with a .info extension. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== $rc == kb1+G#b|bb&G# # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_storage_agentk#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_storage_agent.sh 1.6 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)91 1.6 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_storage_agent.sh, hacmp.assist, 61haes_r714 8/6/13 16:54:58 #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_add_storage_agent =head1 VERSION Version Number: 1.6 Last Extracted: 1/31/14 04:41:41 Last Changed: 8/6/13 16:54:58 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_storage_agent.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr add storage_agent \ TYPE={ds8k_gm|xiv_rm} \ ADDRESSES=[,...] \ [ USER= ] \ [ PASSWORD= ] \ [ ATTRIBUTES=@[,@,...] ] NOTE: the alias for "storage_agent" is "sta". =head1 DESCRIPTION Attempts to create a new storage agent. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. agent_name [REQUIRED] [string] The label that is to be applied to this storage agent. 3. type [REQUIRED] [set] The type of storage technology that this storage agent will be working with, from the set ds8k_gm and xiv_rm. 4. addresses [OPTIONAL] [string] One or more (maximum of 4) IP addresses to be associated with this storage agent. 5. user [OPTIONAL] [string] The user ID to be used for communication with this storage agent. 6. password [OPTIONAL] [string] The password that is to be used with the provided user ID. 7. attributes [OPTIONAL] [string] One or more storage-specific configuration attributes. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_add_storage_agent { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.6, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_storage_agent.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset -n properties=$1 typeset storage_agent=${2//\"/} typeset -l type=${3//\"/} typeset addresses=${4//\"/} typeset user=${5//\"/} typeset password=${6//\"/} typeset attributes=${7//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values CL=$LINENO isEnterprise if (( $? != 1 )); then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 184 "\nERROR: this operation requires IBM PowerHA SystemMirror for AIX Enterprise Edition.\n\n" 1>&2 log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset existing CL=$LINENO KLIB_HACMP_list_storage_agents existing 2>>$CLMGR_TMPLOG #================= : Validate input #================= if [[ -z $storage_agent ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif [[ " ${existing[*]} " == *\ $storage_agent\ * ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 229 "\nERROR: the specified object already exists: \"%1\$s\"\n\n" "$storage_agent" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -z $type ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 101 "\nERROR: this operation requires the \"%1\$s\" attribute.\n\n" TYPE 1>&2 rc=$RC_MISSING_INPUT else case $type in *8*g*) type=ds8k_gm ;; x*) type=xiv_rm ;; *) /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" TYPE "$type" 1>&2 print -u2 "" /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "ds8k_gm, xiv_rm" 1>&2 rc=$RC_INCORRECT_INPUT ;; esac fi if [[ -z $addresses ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 101 "\nERROR: this operation requires the \"%1\$s\" attribute.\n\n" ADDRESSES 1>&2 rc=$RC_MISSING_INPUT fi if [[ $user == *([[:space:]]) && $password != *([[:space:]]) ]]; then password="" fi #================================== : Check for external dependencies #================================== case $type in ds8k_gm) if [[ ! -f "/opt/ibm/dscli/dscli" ]]; then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 9999 '\nERROR: the DSCLI utility was not found in its expected location, "/opt/ibm/dscli/dscli". DSCLI is required, and must be installed in that location on all cluster nodes.\n\n' 1>&2 rc=$RC_MISSING_DEPENDENCY fi ;; xiv_rm) if [[ ! -f "/opt/xiv/XIVGUI/xcli" ]]; then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 9999 '\nERROR: the XIV CLI utility was not found in its expected location, "/opt/xiv/XIVGUI/xcli". The XIV CLI is required, and must be installed in that location on all cluster nodes.\n\n' 1>&2 rc=$RC_MISSING_DEPENDENCY fi ;; esac #================================================================= : Create the storage agent if no input errors have been detected #================================================================= if (( $rc == RC_UNKNOWN )); then typeset userOpt="" pswdOpt="" attrsOpt="" [[ $user != *([[:space:]]) ]] && userOpt=" -u $user" [[ $password != *([[:space:]]) ]] && pswdOpt=" -p $password" if [[ -n $attributes ]]; then for pair in ${attributes//,/ }; do attrsOpt="$attrsOpt -o${pair//@/ }" done fi print -- "$0()[$LINENO]($SECONDS): $HAXDWIZ/clxd_create_sa_director -n $storage_agent -s $type -i $addresses$userOpt$pswdOpt$attrsOpt" >>$CLMGR_TMPLOG # Always log commands $HAXDWIZ/clxd_create_sa_director -n $storage_agent -s $type -i $addresses$userOpt$pswdOpt$attrsOpt rc=$? print "$0()[$LINENO]($SECONDS): clxd_create_sa_director RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 201 "\nERROR: failed to create \"%1\$s\".\n\n" "$storage_agent" 1>&2 rc=$RC_ERROR fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_storage_agent_attributes "$storage_agent" properties fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "add storage_agent -h" "STORAGE AGENT:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_add_storage_agent()"  l1+EWb}bb&6 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_storage_systemk   =e ainrst"$R_cdlop-/1CEGILMNOST[\]fghmuy#().2:;>APUbvw%&*,09W.1avB^=POO /8p p4p Ã|Iuˍ-kB^$LbETL2T T "?Цd Xb*$*"- |t7 7C\];[f,.օ4+c:@ *@9\Q)O9SɒTQ,\vԒNφ84p5M ɽ[lq{3 f`H (Цc "Bw:ob_PIK(O>,{d7ЬIutrZ hV(_"%qqzt%`d ]7 +YUv$78Yتq,H 'T{DZ |d"kBJ(&be@ACDZЬx@!rFx#0f8A%y804ÁñĊ4*Yלau|5X>~;[]qragBMYZX3ϖqvkbv, hV,p4y&.z}tC}ќ*Ъ+/7F{12Nv ?p _bHMBA n+¸<&@B- XX:v1\ TH,,; 0b-x<&@B- XX8ϯ9"d  "ӈ 5X ¸TX ]|8D9eDkp, %@(HyA5JlEmI![GˁK $]\YnSb.;jI g|\vԒNϩh ֐P@&e"|7.H "$ /@LD0 CCMHMBA kq8+@v" kR -jAG7og0a2@HTH  "d*$PPpD ͷUsceM$2qRHe;>~sMd)i%WAe7.H ɨH!@p>#og¥h.WYAwjAH8MF &H 0@ʉ ""bLD 1BA y|w,)$S>Sb.;jI gԃ؎i4LHY\|;7L2tP@ztP9Ad ^L CCM&`bw3G4PW8ČL(`z(@D"Dʉ ""bAmn`[Z1U@*BHϺ;gIl5;-lEmI!؋ڒC) #o` !RW4H Lr hrD5aǦHL"Z)ϳ9scV6/lEoNφzܰI2"0]ņn3}2 L@d{6(nUůtb8y=SΛ |[Սv] VF69W.5Ãy!q̦@B 76]¶3Ξsc̲nls[.g"gZ@@ICJ>> O<YPfx>7qۄ,&`bDe8M/b9#|\vN\ot¯tl]=lEoNφ|2XL"Dq|og>g.Sb.;|vzⶻ;ַ̀af"̖0HQ"f2_`H!s˔؋$2 kpf *$LfSt b+Z-yWy6" gZ ,&`bDe8MDx es-Yw,\|wfKHo]z%;n]qo.q\Ŝ ~^}B ܀&kppn喍W,a3&o3):m#1(&=y!=-s=ypUJwv#Z' lz:|2e#AAmwN b 7/;7^HOrF&b<^\"?UtUoNk0uσo)[ Lk;[|A<]XmY&.-?w>6pZf.\a7m~Lگ8[*9Ϻj:Λ=nXv<" Qya052D@(NMAJ >)eb,h]}7=9iܮ"ֳ[JA+!be1mf@~7M@5iVobL$8DI&=BEGM2(Hyɜd4R6"㶤v|h.D 0cAsf@̙H؋ڒC)FA QZҔ؋ڒC)ٱg ZLd(E5 11 ƒC IH!` !гhAAj Dh5i2~GqL.@ƐeBK>E˽lYˠƒ:+H (t3Z@@IGUYCT|ܩ9 * oR'U"&$TLPrrmUҽ)f4,HY_ ]EKHy2SPCɔ" / 5 Y0r[r/6>1 ƒC IH!` !гhAAWQi2~GqL.@ƐeBK>E˽lYˠƒ:2Up(9T`I1*- $*,MDfl؇3d0 \b*=lٱg Q* ZLd(E5 1w6!PJ#E_I;er4(E5 "_ jLa>[ ]76 |n\^iHIH;8U4 A#1 ZI1$\"T$TLPs2g )>w6!3'I$TRL$<(0/$ފR|Dj,6_oX^ZqA/`Wi$ǨT9aB0(iPc r…B``3A(|&O2ZCɔ"L(\|p4;D&dHGJFbetyM jR|p(9PJ#E_I;er4(E5 "_@DHY]«]#5BY]«Ǔ*@l &H P PME)'Y]«1,/}D7œ,U,"! 5o:@{*Id|rlfl؇31vY]«ٔlEǷf!mf/QoǷofL! 6lC1n =nѠ"!Ǔ*@l &H P PMG@qQnInE9\1 nֳlEoN<-W[XZ?{4A#!j6B8Ps=1v$.@HѦAPEoǵUUUUUUUUUUUUUUUUUMǞBY#Nw9}kfWܛUUUUUUUUUUUUUUUUT]+Қo|O73&psDk kOZJIUގl؇3'I$TRګ?#i&Pj cHy2SPr%p8cP ezqh&48A|MVv ob31>5i*ƭ%Wz!@dˍX gJx׵ÙO]]7 n]}UJw -r 5P ZI1$\"T T @5,O73&psDk hM@ D!5Wz9b\<$LRKjd% HtP 8.@ztP7PJ#E_I;er4(E5 "_8jLa,޶,_&mW}b9A#%#HA!ƒCMA2hq A(|&O2ZCɔ"L(\|w9t 8R5PGEMB8DI&=BEGM2(H7[k<$LRKjd%L[6l36obΑ i \b*=d[dΔX^d|rlfl q,dt̙eќ.?̙.V͛ ͛@Α3ˣ8\Qo:B̙.V͛ ͛@\3qB-ofL! 6lC1Yˠv9  "7řY!g.oBqofL!/A;l؇3b8A{sPN4h0nk0 39R)0Y@xAcFa"bks2g ',nRf͈s=poгrdu"CxܧHbO3E',nR# ^modvCܦ&q{#fP+yfgHG"&q{!ٳx(,a-'=yɜd4Jٱ 7fgHi ?h\I*3={n!3x)B LRK H劄 B@ jQXۧjJJ,ڳb8iJlEmI!2ZSB'',,qfg$YH3J%Lfi0Y$8Cɔ" ,G±%܆Z`Ai7 (Ha Up+tIIEVlG )M$2KJhYdBřB噚N,34fiD3I& 39$3oU+ً=aR&H\BW NԔYftLJETq(E5 &XbK ;nHy[ً<`aR&H\BWQQS9e؋ڌŃ^HqR?t\vԒNϚG4y&4iI\`I ?f"HMG,nRѹJiq(E5 &XbK ;o1"h~**}G,qQqމy IJlEmI!:%\vԚnmI\`I ?hQ-',nR"IVz)B LRK H劄 ꮢr))Ҋ")&Pj(&L ėrkwUܐ/=pǨ\Px၂\54U?#i&Pj cHy2SPr%hP e9ՍwD8R4i:)JlEmI!8Ps$&dqoUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU7?$saA # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_add_tape =head1 VERSION Version Number: 1.5 Last Extracted: 1/31/14 04:41:46 Last Changed: 8/6/13 16:54:59 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_tape.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr add tape \ DEVICE= \ [ DESCRIPTION= ] \ [ STARTSCRIPT="" ] \ [ START_SYNCHRONOUSLY={yes|no} ] \ [ STOPSCRIPT="" ] \ [ STOP_SYNCHRONOUSLY={yes|no} ] NOTE: the alias for "tape" is "tp". =head1 DESCRIPTION Attempts to add a new tape device to the cluster configuration. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. tape [REQUIRED] [string] The label that is to be applied to this tape device. 3. device [REQUIRED] [string] The name for this tape device. 4. description [OPTIONAL] [string] A description of the tape device. If no description is provided, then one will be automatically generated. 5. start_script [OPTIONAL] [string] The start script for the tape device. 6. start_sync [OPTIONAL] [string] A Boolean-like indicator of whether or not that tape device is to be started synchronously. 7. stop_script [OPTIONAL] [string] The stop script for the tape device. 8. stop_sync [OPTIONAL] [string] A Boolean-like indicator of whether or not that tape device is to be stopped synchronously. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_add_tape { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.5, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_add_tape.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset -n properties=$1 typeset tape=${2//\"/} shift; shift typeset device=${1//\"/} typeset description=${2//\"/} typeset start_script=${3//\"/} typeset -l start_sync=${4//\"/} typeset stop_script=${5//\"/} typeset -l stop_sync=${6//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset start_script_opt= start_sync_opt= stop_script_opt= stop_sync_opt= typeset existing CL=$LINENO KLIB_HACMP_list_tapes existing 2>>$CLMGR_TMPLOG #================= : Validate input #================= if [[ -z $tape ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif [[ " ${existing[*]} " == *\ $tape\ * ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 229 "\nERROR: the specified object already exists: \"%1\$s\"\n\n" "$tape" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -z $device ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 101 "\nERROR: this operation requires the \"%1\$s\" attribute.\n\n" DEVICE 1>&2 rc=$RC_MISSING_INPUT fi if [[ -n $description && $description == *:* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 103 "\nERROR: one or more invalid characters were detected in \"%1\$s\": \"%2\$s\".\n\n" DESCRIPTION ":" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $start_script && $start_script != /* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 106 "\nERROR: the specified path does not appear to be in absolute format:\n%1\$s\n\n" "$start_script" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $start_script && ! -e $start_script ]]; then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 107 '\nERROR: the specified path/file does not appear to exist on "%2$s": %1$s\n\n' "$start_script" "$LOCAL_NODE" 1>&2 rc=$RC_NOT_FOUND fi if [[ -n $start_script && $start_script == *[[:space:]]* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 108 "\nERROR: the \"%1\$s\" attribute's value contains whitespace,\nwhich is not allowed: \"%2\$s\"\n\n" STARTSCRIPT "$start" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $stop_script && $stop_script != /* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 106 "\nERROR: the specified path does not appear to be in absolute format:\n%1\$s\n\n" "$stop_script" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $stop_script && ! -e $stop_script ]]; then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 107 '\nERROR: the specified path/file does not appear to exist on "%2$s": %1$s\n\n' "$stop_script" "$LOCAL_NODE" 1>&2 rc=$RC_NOT_FOUND fi if [[ -n $stop_script && $stop_script == *[[:space:]]* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 108 "\nERROR: the \"%1\$s\" attribute's value contains whitespace,\nwhich is not allowed: \"%2\$s\"\n\n" STOPSCRIPT "$stop" 1>&2 fi if [[ -n $start_sync && $start_sync != @(y|t|n|f)* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" START_SYNCHRONOUSLY "$start_sync" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "yes, no" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $start_sync && $start_sync != @(y|t|n|f)* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" STOP_SYNCHRONOUSLY "$stop_sync" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "yes, no" 1>&2 rc=$RC_INCORRECT_INPUT fi #======================================================== : Create the tape if no input errors have been detected #======================================================== if (( $rc == RC_UNKNOWN )); then [[ -z $description ]] && description="$tape at $device." [[ -n $start_script ]] && start_script_opt=" -p $start_script" [[ -n $stop_script ]] && stop_script_opt=" -P $stop_script" [[ $start_sync == @(y|t)* ]] && start_sync_opt=" -s1" # Sync [[ $start_sync == @(n|f)* ]] && start_sync_opt=" -s0" # Async [[ $stop_sync == @(y|t)* ]] && stop_sync_opt=" -S1" # Sync [[ $stop_sync == @(n|f)* ]] && stop_sync_opt=" -S0" # Async print -- "$0()[$LINENO]($SECONDS): $HAUTILS/claddtape -n \"$tape\" -D \"$description\" -d \"$device\" $start_script_opt $start_sync_opt $stop_script_opt $stop_sync_opt" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/claddtape -n "$tape" \ -D "$description" \ -d "$device" \ $start_script_opt \ $start_sync_opt \ $stop_script_opt \ $stop_sync_opt rc=$? print "claddtape RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 201 "\nERROR: failed to create \"%1\$s\".\n\n" "$tape" 1>&2 rc=$RC_ERROR fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_tape_attributes "$tape" properties fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "add tape -h" "TAPE:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_add_tape()" format l21+mb}bb&"~ # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_userge_   et=ainors $O_cdfhlmpu".AEILRST[]gwy#(),/12:CGMNP\bkv!&'*-0;>DUx{|}3468rH<uL=gMP `< &H D &*.MgR5C\tv*2"؀ Iv(6 "$A qkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵig^d@b4fu# 4-YW|V`P^0Jv|n#T2oIeM=(]ǵkIfgu!ekbO]7oYofteگ*NIdWfu! 8/%Zլrt6AV;hyg3l3s+[+}OUW|"+:1ek7թqffTp_-zfڮwVT&<ೂlԣNRUWI]&?Bթ|;t70ĢĞ룂0u(nY>Ul)R=XKJ I[*vcR -Aڑj;ttV̠p_rקA3=HIeygkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵi3$Eɦ3a3ɒ",DqYd X=hFr7<;x1cu)0hxrH<uL=gMP `< &H D &*.MgR5C\tv*2"؀ Iv(Y!apbY೎lTd6%*VO;ͱSٝICNlTi0<<`pxT6Nzm<& fةTnwR.I*xL fةMw7;$Nm<& fةTnwR+:i0 08<*wbWܲ4NIW@408<*wbWƨ2j H0xxm^ gQR5m|`bS:Tei1S:ڵ zN <& "08<*wbWYbm<&  fQeE&NlT$#m<&  fةMw2,M xxMw2,Mܚ&eXxxp~;ͱSm<&  (Si9Ejxxp~;ͱSi:O PS:lfQe08<*wD̢i9E&NlTb4;ͱS,O CNlTH𘈀xxm_A&'[;ͱSkE!M@@S:L <&" fةŹREh|xLD fةIZM@`S:wQZEh|&b <<`pxT6NrD&ٹ08<*wbWsF≧J <&"NlT9Dm=7[WV)ͧ@hxxm^ç3Qh6NlTXtj2Nm<& fةgHצ@S:h5mgi0;ͱSpI9Ei@08<*wbW"ç3Qh4 fةd+T ڭ<&PS:w9E0` 08<*wbW"ç3QhթM@ 08<*wbW,:s5&uh6A§ٶ*uz,:s5&oQJBxL;ͱS]i0D<<`pxT6Ns)IgNu6@@S:EZ<&§ٶ*u{z\ͪ`(;ͱSIF Fs6O 0xxm^ĢͧP 08<*wbWܚrunxLNzrdE "MABB›[bECAyը:^=ZLH=Nf$'c"8ʀ]bWdBlT9i0 \x1QB@PPQP^` $wbWU3H‚V24 fةw,M"ç3QhfxL wrdE "MABB›[Y$ί Ac}Vä,LֵkZֵkZֵkZֵkZ֝%)%*,6=+T kZֵkZֵkZֵkZֵkZwbW&PM,,wbW$Qٶ*ux1TeQl:ON&ɒ",$Egfu)|3牓(aQrh wNgʌw#a=;@ʌw#mL @\w@ʌw#m֩(ʌw#m֩L|Qo7.%6 00Zsay&*(QKg(QB7 @B,,sbz#,p>cp>c@"(Hb~8Qlv 6<2b*Dx1QB+( rOrİ | 1V9GSɄ $ HXMDD;nHֵkZֵkZwga;-kZֵkZֵL|FNz`fxCrh*W v@3'<P%H&*(QRqh (%bvj|#{b.I@ ##x$D3'<P%H&*(QRq 8ejT̒RQe @bx$D:nzZ&ɒ",$EgѕN,*fu)spwv [2 a82nsp\ ĦÒ#sݫP;> Y7 8ej.{GN0ؓx1pM<"D @",;G;-kZֵkZֵkZֵkZӿİ5=7]nYn RzXۖfw[ZֵkZֵkZֵkZֵb  q P;;pD H$$,T(z "&2Lv0w<%D PX(zn74n(t;;p!dE* P T(z,:s5'1"bBBʙ#o^c&D!$C֊CQfNqH"" (D$FI4;;p!dE* P B!C|aә4\fc$,@ &DXP=w9EjTv0wRBȋ*T@AB"ç3Qhftc$,@ @DPd1jS8T".@P9J"@"`YB,:s5&uh1I ".@P9B(B"ł"ç3QhT,q6N XF Hc@XT6NHi1rS˗H\rT$`n` F3G2$pCp@0q$e$`n`;jͅgOԌ @ D1V8< L"Dv ^fpdɊDdE "*TP`5=QZ,0q)HwjNl/382ydE "Tl2b*(WpP(A-woT|=2  | @x$D3'<P%H&*(QRpYnY *\vڮEx;UȍcǏ"'&PMREJDD<ަ\{jo0CpXarSaPըfةw3jD{jozrfnL v@3j-:4q0qӣY3'<P%H&*(QRpC"PzVž0j[Ӥñ @Sfx"|XE ,Pi/DDX!2 ,ͫP|a"'&PMBh(DL$%QӣͫP|`QֵkZֵkZֵkZֵkZֵkZֵkZֵkZw'*uj[aRjWI]&w[ZֵkZֵkZֵkZֵkZֵkZֵkZֵiS ϒ[[D",  aըfة2ŷr [w 9-1mܺH1mƩ-H1m;ͱSͪ [vb۸ [y,lŷ&Pb۫-ٶ*u|եAn)a- ŷZ&PbhAo4Aim^ ŷ6;4݁b۰ [usH1m [NlTgAnD [ui-: [u 0ӿ:w V4$QAnz ŷe-Aoh1mr [NlT-ŷrk1m8g7.%6 01A<Ŵv JlE, 3# /CpXarSaP$4ޛOzc._Tewrfը[u0 aˉM%BF  `NmTʁKifը[u0wreXn .\Jl9*0`70cs(1mYbm<&fQearSaPQ/Ğo7.%6 01A;1mfL4$#c._=ɮ"fQeĦÒ#s0H'qܚeXO 5L,0 .\Jl9*0`4<8*8x!,0q)H [Gr6VarSaPQL|},Υ J v@/3OEԶ0aK  VwAhl;6Pb;-QNQ/6Q3(CpXarSaP$͓(1m͓2,M&eXxx.%6 0wrz aˉM%BF  `NWՊՊ8,n .\Jl9*0`70cyK,եiVXq G7.%6 01A;Pb;3IFm{F;| 0:`ĦÒ#s0H'1mIʦ$|`8/RCpXarSaPը2֊CTl)awjY!ܒQfHjmɚw-:;db;rIEZ+E!M9iyi+I`ĦÒ#s0H'JŴvLm>i+I;|EG=jMen .\Jl9*0`70cuY-e\Si$zԚ+D1/喉Ms aˉM%BF  `Ovm-siYhѻ71/&(`ĦÒ#s0H'N Ŵv:PM=77M:Pwr:s5&ۖznVSn .\Jl9*0`70cvAhI$56ç3Qhg|`j9;|9EGu)ĦÒ#s0H'aDzVg{FIֺ\z,:s5'<\rT$`n` b;Ut|aә9;|S3mn .\Jl9*0`70cy2گIʚ|6q͢,x!,0q)H ӥm-&֊CQfNq/FI5 J  wAhwi"ç3Qh;|Xtj2Mm\\rT$`n` 1m-Pid+T ڣ._=w9E0 J  w*ŴvU=w9E08|aә4cjԧ J  w V4|#jԚz,:s5&mZ\z "ç3Qhʘ]&JS aˉM%BF  `NEpJT:pI9FT:4RUҘ˗]ENf$M)R^n .\Jl9*0`70cuQ-ޢ=w9E7Jc._=1\rT$`n` ŴvOewLhq織h:n .\Jl9*0`70cw$ۙMΜm=̦E%9\}ə&pCpXarSaP$ [GvíVrfwIíQ/Ğm3jĦÒ#s0H'a1mTA'Eڣ._>t`m3jĦÒ#s0H'b;s6O%&Eڣ._=Di+n .\Jl9*0`70cv%AhDi+ObQZJ8/!|;u0Z:u|;uaw&ۓ]mɚa ( ܚ [GnMw9ip8;Gw˗ϕ|F"{[& .;0`ڵؓx0<\d `0D ׊taY2 .K"3#(1g4Ɯ{x1gtbԤ{Pb2{1g YY,|2z^bϚ1g E, 0z ŞLş%e, Y먲 YfbN Ş1g Ybϓ(1gK8 Y$@ Ş@ ŞNzUA=w V4pHzA({(1g$,|܃{Ş|bٝHv<P%Eɠ(wNL @_< &T]0E3>cȮ4G YM, Ş Ş4 Y]$Ʃ,), ŞmT̠Ş Y2|A>lş6LŞW, YA>L ŞCH1g(1ghA>i*z,}ٴӳH1g6 Y(z Y6z 3H1g3H1g ŞAftb]BթM,(ŠŞz Ş YI,A= ş7 ŞĢ1g5Τw-:;>&HX*DM`P,,QtxIHE%\iԏޚ YNA=NAlA=XH1gZYd"}A=dbZ&Pbϒ2|U,Y,h1gfb`mtQ,sH1gɔӥm, fb] fb]'PA=w*ŞR Y$QA=w A=ܒ Y{A>nA=DPbrk1yΤ;&*(Q¢;,QtxIHErK"3#(1g4Ɯ{x1gtbԤ{Pb2{1g YY,|2z^bϚ1g E, 0z ŞLş%e, Y먲 YfbN Ş1g Ybϓ(1gK8 Y$@ Ş@ ŞNzUA=w V4pHzA({(1g$,|܃{Ş|bg:<$w|/x404 @aH,*%+3:PLK>IɊD4;aK7(&PpwjNl/382ydE "Tl2b*(W`(QZzԟqҕ:+{3O(&(qmkZֵkZֵkZֵkZֵkZֵkZֵkZwIMFI>lROQw:ծkaә3ֵkZֵkZֵkZֵkZֵkZֵkZִYyr!"j$ . 0mn * P 1jٶ*uzSb) ŷAiS._C>FsݫP;JlE$MbdE " PLA:Sb) ŴqMw\x1QB@PPyGf `N؊H1mzSb) 0RAhқI/ϑPyS._=%]4`(%h/RwjAh48w˗&*(Qh ̪ v@𼴍hZfw@:s5&8/ç3Qx!,0q)HwjbODqNjD@B,Jg6" YH1yΥ;ğ *gd $YaәJlE$ƐbٝHqI`*"TZͅgOT٩&w[ZֵkZֵkZֵkZֵkZֵkZֵkZֵL03>ImnPM12%Jᡸ$/喉Xtj2Mt  Ayըğ q$,DY"&@hx@"X2,ӖZ&ti<gR牓(aQrh x@"X2,ӖZ&ti<gR;I4ğ q$,DY"&@hȮ89eiNf g!<x1QB&<ֵkZֵkZֵkZֵkZֵkZֵkZֵkZ֝%S67(گ*NOvjwIrnmkZֵkZֵkZֵkZֵkZֵkZֵkZֵkNz`f|ܠ%B"bdJCAݫP;a1QBJ(#@\ x1QB,X\wj&ɒ",$DZ,Τn=ԇlJ,T3y<qmkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZִ,gR(4WIlJ#oNzեQdNL𶵭kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZw3$T!aDI Ka@|ܠ$(PdI Ka$rdE "(%,0q)HZ,say&*(QKg(QB4@TeV).|af,=g \X$܍@qYbDʇe18~B{1-u(:7AZjʛ⯔-wCajzf;rRa7ĉIe*6; A/z˙N$| FX"|oj֛7IA+194gRJ($;x1QB@PX؀<"w8eU("㏒CǃCGc&HX[2x y'LpL@LT]&,Τ8 kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZӂ Ŝ CapYxBž0*7R\A4 I-Ifj3j,j˙ ,3ԽBÌwW].3II7 pKRQ_9*։/e_=R2]|ԽB3jFK÷A='Cmj \fLӍfo]q>ydNOR2WQ%oS #%wIBGTN)`@HbALF%x1,",@TutI&\̻7ڵ--H˵_=G@b|`?,oڵ* .TQ+|a{3 #.|*SVi'|ԽB3{V R2]~ ԃvST65 N_ }Ws J.I]W'qU3I43;)DŽoUuwvZt6f+R#*p_i  wCak|u0EeNZ8/w[եԧ[2*i,ǵk* T^t0fvp_=ӓpYHT] Ow*+_;U{v*NjV #%o7õ_<,REqƩfڽZÌ).|`U+|MB8/7ڵ;.<ೂPaF<ೂх8,༥[2Ŀ o|.'qRaֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵ(t6XL,MI`l> "sU&!"qL@LT]&,ΤqV(T)0ř\f%qɺw \b^`B ( ɺwĿ@<@DP$N;uv# e)jt0;'Cthx *zU.xL@LT]&,Τ>jj%U4dDD@A\Qj2xI8%3-ɧ:3:0r*DE h*YTE|Aaay`@ *HXR$hMG-: \c;/*T@A`CFIQٌ`&"ȋBȓ@PBw&h(s|\!ReX1D"ZY`,@\83(X<8x3|@T"hfQeyp ̢b ǘc"UDˇ"U8$3(j2"E8@~ĢJS˔""HC)=)8iU+vᘳ}G*u|F@'CUlqZrTv"?fu,B $0w h|89zW^SWfu-%a|aڵwek/:j\wu}ZQ+o`BtܒU9IoZ#.խԴٓgZ&_Cfu.^ϛ}'{ܟ#e}jT銂sխ(GfNTZ6r"L;ttR}'7jִw-(qFVEhw'uNծf ӡA7e/<[rISwm^*lpIWI]JcWj֜Rezqj &3iEu#-xʷHw[ŝ'CfuWu)peq÷A>q^I=i*9+O|kek3B7+>ݪmj`04;afghq002|f`+\O'B(nl9*j֤VZ&:JNJSҊц$FV0phqE'`vwR|ưXhw7ՀvcuCc0,V13 Xhv2䆦0t泦fo5!0A˒;1C˵ky9&8(V;3@\$12`qfIVfQeWõkIfgu!%9I=Gaݫ\(GzqܚtqZ}WϕN,*,{V<)|;VfwRq ?zyt@X3v#7 <Ztrtf;8]fjw3nI( ծft%{X*J+PN:}\|BխԁS;CQ,j:I>ܞ0' -]z77sqf\qhnVI]GkS_>,[ eg@hy`~5Fq"䒩.bH &c/:V7*=e,MvlΥvm<u{ᑂR6OZtΖ5fR]nƨ;QQtij{3^򤢺>u=j3KRWI%|# ԌG|2֔I,jY(JMXnէ|2Nf$ûVi-7ᕫI*V,.YSs_QTǜw%;V,I:>t%twj9F7B7ʧWڵ:*gQwVç3Qc;D'fjb[]̲&q?rD+:E%]5@\$1V@䠛uگ[ej:Jkksʵ8ƨ2j H.bH &c/:Už0$SZܱj@To4U;լjʇ|7zlJ7I_jPJFط5Fgڵ:S>|;V0JFغOeMqAejܳ51,RD@PR@P;(T (4PD .@"HcTlH"" @}4_yB16wBAۀ  HcTlhGH-]rĐ L^ufnPJFغOQVJtnF HIS֬.wbsbznXdU}O^)fzJj=j;[t 5InY@TD@tD0DòJ QDÎ D"E"`Hv@TD@ &"U"DL 8J "&&6%I`o2&'}g6vboaZ5\>u8J "D ېLmJ)bemMO4W5FmPȭI\:k^) D"E0$OnA1A*O#m|aA7I<\@/jT ڡችjXRs׊t<*D ۠'R6ž0۠i q5FmPȭI\:k^) D" DL ېLmJ)bemMO4W62ƨ@ͪV+E!MW>xC;@"`N܂cnTF H+nnyڸ5FmPȭI\:k^)/]rĐ L^uf%ޓV]\(@qq&tG“֊NYca٧گ@vڴwۖf Lw5b5:L~INխԷΝ(Rgʗøõk& /Τ7RZ8@jŕkftGfը[u0ˠ.X άX}Zj9ɕsJ%{VgRfvwju͔FVX3JFUsܒU9գnwK+ZtZQzQ]^&u>ur2Ģ&̪y3ZYh啩RiEv{Z&x"3OrIT{V;eX]rĐ L^w'Ƀ+YE'^[3oz\f?Yb{G:UפsUҭ%SmXoģt|qfIT⒋,OIkR2^ԌgRiX䒩ϵk0u0jItN,*vIHs޳ۦ502pszYT#-R2]~Cfu#t1ݯKԷe.fQe+YE'rҧ&l >w\qZ<ؤխԁS,ά;lVw'Δan|'ڵYc,֓[0̫g0:kjEu02ٝvd;b;O-I_j/SԔWZV/Jxc'Ζ;k3N^zo 8'ZգҌI^d4~ILYӏ6)'ot eXwj3s\No3 lΥ{VG2eX6)'O|;VfrY!󤙓zLΤ=:Q̭zZv ؓt,Iber| ;YcխԳOYmW iZjZ3=ԌkQ~)(Jԕ06gRjjTwJ=ڱqؔnON,*RQe:jFKglΥ<ұܒU9srzN-WI3N*YU0튒޻ttƦZo]:\*dwdZN3[qlp,1q5Cu Yt9I=C|`0=wHfQeHvC;yI=C}[z̢vmZ늛IeX-jMf!-O-I_jfQeIE~խ%bgcJfΜxFI=C|e,0ծftfZٝKlIFG2eX$IjAt2}\iԇJ9QP ɮ"fQe,Iber| ;}Ok` rk,=H4Wkfu-ܚruC;Of|T095xfeXt1׊oQ2l&ܝqA>ծQΤ?,zoQJBUZ;rx7SnMw:7YE3J%t f}';0Xj(gRq6gRt1Zܚru\T׌]0̢eX3JOj3s\yPjfQevm O(>{V2,pr3+Yc'CJ0>a]ǧVwSs']v/S>Ҋae:Zɾw% +Zg(ڵ^OMagO7yԕvs>x|6qO|;VK'ZQ+Ԍu;):qR-g@fQevs7;ڴwtZX}ZA󤙓{3j=jԌG2|;2ӥ ^FsxڮխԵolru]|Nˊo3(ǜv yt@X3y՘;WkU+TUگ\X:yگWVRU;Ҿծ,To'ڮխԷrD&wbd 5InYrkڮF,jW"64q؀%Qfu, ,@b:*$SZٝJ{^qqڵ-ԁSܒQf<ԕLvlΥXxnfՌ:O4IP2;twB6Kfu T$YԕrӡZٝK|os6d}Ǚڽt#jԶgROrIEXqD̢ˠ.X άX}YE'ڮ'C8d>Wfu گ@䒋0uo4^fQese%wOvfQe]ɮ>w'[$Fja+WqܒU9:*{J, VgRO/(,Ìt 8[n,L8'3S-X9z]0̢N6{Է$Y+YE'-*rf >w\qZ=B\,0ͱ[ờ3[jfQe^w9%s2,priFÌ+*2n`täգyںQ]wL4;g]Y7񘄷A>t%}\L%Vҩl,t:Zծw'89z7Ij֣dõkJ2%zŝ'C7ڵQQyd&ue2,OrTwI%_ IFMٙE89z|գ},q$̧[I=GY`yS7t7.Zϝ̢ZnwKYhjeXtҎekfQejV|&d6G4I^گ[J,O{VtqZ&,LKt ҏ'Y`;VI=cnY&Lp0XYt@X3uYfj;fqYZǵkٝH=XZo%qGV[.bH &c/;dXխ}lJ&dA*IҵխԶ*JFKkD?,}a9e,ĢfN\;)+xx55Gv" ?|]rĐ L^w'ɃʱI=Czu4-u FKn7ڵ:DGau0ˠ.X ˎUu͛`ROQ=$|aH˵kfu T9ٛgh#%xQPAUW\ٱcxqX w:Avtau0uA&*wjY3\Rgtt jڵd@AHjˠ.X ˌ+S`PM:yjթvlΤ 䒋0֊CTviWĨns;խԵ%dg|ooISZܒQfzHj;Okfu-'Bh|SooISZܒQf|#g=Okfu-'CZ&_YWϋ4قHkv@I( W^i֊CTU6V*w=h|7]\ǜwnقHkv@I( W^i֊CT3I9uzzԞLZnwKMw:-'@fuڵԁS=jO'/'azw/GXFu)t;V2}8Fu)q؈ ?Z&_  ,@b:%ޓVZjZNLǵk/}ڴwetq؈ʗ+D@\$1V@䠛uJիRZٝKI։s7;%*^7\q&՗@\$1***68X}]z⦛zn7>*vfVgR3ܲ5Ih|;j3s\~B]_qܒU93s_77\TZv{7ejV,oҊ:auzϝSMA>޽lT?!I,ob/ IFNծ޽ooISZٝK|FrD'ug|4ٓg]}zS_=rx7[6wؤ0խԴ h ׹ez1JR{VIVgRҊ &W[eV1 Xj'@OtvW]II>wMKt"51#.**e`1UW\ESL0TU4UU*;ypA拃 0$ UU;ypAEUU*;+RTW|kWak@ttb RTH4;M3Zq*vkvڵeNխ7wjֻ;Vb̃A޽t nYhǜv"G$zԚ+D< ,@f,peq4 Lfe$sQewKsZٝHrD&?$j|\f}NZܒQfzHj;Okfu-'Bh|͊I>WRlʷ7 I8h eԁSܒQfڮӧwL`>{ڵIԹI=G{گdtйI*j䒋0ڵNŀuﳿuL~INծftޣwZJvlΥB6w3ǵkrIE^ju%,ݥphЖB|Ռ&naݛbõkf$M:]g[,X5qZnwKcnYF][J,ÎbT[ŀTjj($]b/I,u%k>wNr}L~ŝ'CW|(kQei3sQA'.Caf קB};ܲb| 8ej=\}'CrITگGJ, %L^eݛ8JfΜxFԷk>wLm=<`>aݫ\}VNs+\%VI3'ٰgRz< ?MN2 $f2;}Ok+Ըsؓ.ڵIÊG:*{FI敨n:P| 5{6i1ekr:Im3Rr| +Z9natӒWGڵ:L|4ٓg_<ӥIL;t̼nڴwn+PZٝH=Nf$ 0TǜvG:s5&ۖznVS]rĐ L^w'ɃɾwMɮ>w'\d ,0=zb#-%i!j@ 5d2| tj2OIW@+XۖfvW]ÿL:NOY*lJ&d9zviW3fI=G{3| fnjví^Tupg 2?$j:s5'޽UrK.|TܲݫZj96)'L;kaә=%]5zp5ejq ?aә4TzR]rĐ L]FVYZ&4ޕ0t=jan|99IЄog{FI~YZܳ5{Ntt|Tz0*fw6)'Ofo3l:Ճ8"ç3Qsˠ.X ˾`WqSbT6=Nf$ڮխԳOYnfpyS3ekrӤ 5.w'wu&%V|aN|,kޝ1PO;V,qShJD!R#],)wϛ}&%Co3;Nf$ fS3OZ03}XB%HXڮ&<ʙ#o^ $f2;j\TU O]z94e[gR=+Wq;Tvç3Q{ts+Okfu TIJ{FI+Xۖfv$ܶ]s>CtZIEu |\fLPɼ%Z V|.Īo8گ6噭wӦ* j6噮*v,HrJiHʹS3rx7CJ`;lROQvؕ ,aә='CT=֌ bP$M+ T@\f3:w'u5P;nGc;QHj,)7@\$1|,啮 3Rjj{j@:s5'Iʦwd+SspI벾4̟9^[3i:,wJkkaә1%;UIOaӝO4V,tj2OIW@vlΥ$/u5--S։g zۡ5댹Tڵdfk|$ܶ]s>G͊I>։y3G*]'VzڵdA&*0C|}&گ:ٕoᕩ1%1¤rJ"@P<,u Rz*=aRc; waә4\f $f2;!J>>խw+3Xcᚪneڵ:*{FI;Vڵd*rJUfVTft x)WjZNLV,oӤ 5.w'͊IGvNeGzoV|Yt9I=C{2KRQ_8d.3Yt@X3w jֻ_q Pu#.խԁStj2LR2c5fV,o:Im3R;w'͊IGvl:s5'c5fgz?Γ͊IjZ7Dy` "ç3QhP3j,Ibe 0wek]zj\TUrWRjVgROaә3fw[ekrӤ 5.w'wjJݫRw벾@ͪ?ΓΖqeq 8?8d.Y]< ,@f,k]2KaW ս-%]'%u)]3G ,tvlΤ ç3Qc6噭ݧI=w,wtfS7yԕっG]zj\T;0jޖϕv_*L~ŝ'C-I^ 3R;IE|py` "ç3QhթO.bH &c.Y+Ze~ 3R⦒ڵ.t7,®UrWR]3[̧Ij@:s5&?,cnY=I=w-Fj\O%3qg7w벿W8ڵ-%]'%u)*T:N:Z\f(w78Phwaә4eLSE%]),Ibe 0wek]'\fN޽O]{tԴ fS4UZٝH=Nf$啬m3[Nz[|.Ԏ2?$n,bz87j\TUrWR)Is+jZ78Q,:s5&oQJB $f2;=vW5.*i*9+Ov_*O|;VgRO;Nf$UךWvqY=Nf$啬m3['K2?$n,bz#=vW; 3R⦛RP%]'%u)*T:N:ZjZ78Q+cYt@X3yܟ&ROk*wiZz1 ̦E%9 $f20q L4Xu@\$1YʱI=Gcn2vN|*}[3$s=Gܙ{G啮ft}n2fvlΤw>qծ,nL=E*øԧڵΒfUo17 A*qZ&Lv&ܝo ,@b:%ޓNխԷt7&ܝoԇvaFI,Iber| ; 5dq =\ؤ=ԇvt 10Lt@X3qjt J ']OzΥzc5ʀ;/'tt jdv>G‚W/ -Hd)* ,@b:%ޓN|gR=-TqU3]Oç3Q|`w[kSj֒C9ӓ,(,q4Kz)UWI]&ZIs S>j͔FV;ݙTReI&e*LDKw6)'ON,*ӍOoaeVOoHA.q^Peo4s| \iWI i)RWfl n@ʓӦ* 7A'a-ؤ>t$'ui+n8NLC@\(HP ,qh ePo7§(nns+PWG[oO{]O?,猭WfvKucu#}A3ڵ;VMf#z{;ty3[2ǜֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵiy85{V ,n1xB\}diڢX p^F ֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵix3R=;U/A&'kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZp5zp l01+vb}bb&RI # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_add_volume_groupmk   = aeinorst"$_cdflpu-/ACEILMNORST[\]ghmvy#&(),.12:;DGPUb|%*0>@BHVkw{}!34674zGU󃗦7|ꇒ iM^Ьa`0!PqjՄk4_JeEJl  X.>hЯhV.c'|}+8)Wզ7õYax(Q=ZʌJ UqSم=VW~BQܥp*{$ ) J&,\2©*(B``Po#0`8 yϠ08!Cy`p&H8yɹUSA%>LC"b"8=7p"f (DCa!'(ִ+1WNŋ ZS>FO5ua(<#ӯa(I_溲SDȕP-_ĕT,2%G" hW%Dj:1T,2%G" hW%DOT&DAmYXJ:@)%0İ( V5X,r@:," klܨTyB-nɒ@nUTIvO3,5yTC0,,`QsgUt]L @v.>^s6aB&-*2UB*2UB Aೈ&<1rLZ R@(@h8 VÃ#ok2 њ(0Wy('ͷ5"`rS.X\ZL.@b aa̦`2 2"2FDDdD@(Ȉ@ Ȁ(D 3meXeEHmy$̑LTˑ0dys6Y5/ 3m` \qr"DP6^2yY3"$dl((+9ok(HT$Sǒ&DQ1BF9 ,E,JKZ9Y䌒 0܇ԑ1p-sfʊ>YC;Wuudqs@p |afs|j0uy5=ڒ>~Q]]O'>Qo]~2UCΉDSЧGְ*X-ܼMiOEd;92<)!m{ \EWb-ʫ: .g&Xklܨ;I)Vsr# p({Uv3^&U/R0o3.|D?A%>L,,dbɜRNopyN.Md,*z۵^^zF ?fW {P"0*f䋑9g8)7񒯧YjM4]L!n f䋑9g8)7<\0ayzZW}ua@:uwMdUW]OB .g&Xkp 2HQfY'N7B-~vreԛWjg2aeZp;tC ` .\8r]u! hE&s5J:qfj?;92YnU^Md,uw);^^{u^^$  .\S@M͗]O?&f,pԛW!zԑF ?Rou^nԔTfs|jfj?;92Tt^ !Xxn0:@~hE&s5_32y O?`AG/M=\# z~K}ɖs+;X˙$db$dl$P 8p " " mnC2hE&s5_32yO'>J@z˩SA%>n)X u_,,dbɜ JK8QV :~K}ɖ:+?rUZS膕yœJuzn e6O $Xg3CtN7UO>>S*e6O[ pSIvO;92齿{ze:~K}ɖ9ExEn S{E,Ty3F:o֝O?^G`7(L{øG'>Ka/!5}@D??u_,,dbɜRNo(W}O>|U-GX(CٺtzBo{z.%9zPrC:>NQ}:~~}t'>KlCH(:°i)<d,l:c Ӓ؀(D^,a@~D .çXVC@ϸMt2HQfq\aG.ގK}ɖ:aЇu= t}k`u<<dO>|ב(]領]L=g2h@{[@ ߚ,,dbɜRNoSs%%Rou^@~}YJhE&s5J:q!9{+8)X'GG~YoҚ}+8)XJ4o)JKHNrĤJ V/5?_n%אF:ߠr쾂\X;C2H~X(E,Ty3Iw'J*GUSЧ nԜ+K}ɖz=^‹!yY?k0Ͼ5%r.<{[(YhCOF2D=(~3znRsE,Ty3Iw'(өRz˫bQו)m(S~K}ɖ{.o9zq`gGt>gZ@`ϾhE&s5J:qZ}:~+-=Fj߭`"yzͿgAvfV u|ި{[`".\eȏ2HQfY'N72zZ g%+ɇՄL"yy~? Sؔ{'NLVԂ=jI=IG){Nn%0Ner|z2ev[ry䢌oU=H-3Q}8ʻRܧ&WW?ZLV0I7oWXfE”NĺH_WW,3\"pޥxG p%a7_*JtaAh=^t=.z>{tP꺮kmFjОŋ ZS>FO5ua( hSB>/L50prK}靜aM E'+ DK2zNt"b̃œ"A!\ٴ+-ʫA%>e0 ү*)Y(h% I@ubHЦe ւ_؜|<M0̞(O>| ֛|)J8󫟁Uꇴ)YwՙƂ_ro:n_WW# <;tw0꽡_Dh@ s}Y^~]>}eK2.\=a(+SU$`j:JQ1$֔J*j}YZIW/ta֔>va hUVf*Vɒ@nUTIvO3,a&$ .XofE P`j:)&Ĵ!(00(7s0K}靜b m6CZoP>di6%_KH%* QG X}]XP!KH$"8qG(VPpMBB 8qGT,>3H8#mGaN{ 8#mG>)A ph X}\j:@HoP>5MHm6 S{ 8#mG?u_iCDpMB&ii6ꅇϸMtB#DpMBN.>H$ m6 _>tbR DpMBWԜ+DpMBWtfoMV6ꅇ*d)}OI[H$ m6 77[H$ G6ꅇƯ*M i0oZD .2¢x>@pYhܣ79v_F*%=E7# ~Ӄ}wwwwwwwwwwwwwwwwwmGjZE&.T,GתY2V%1[ŋ1[bYꅇb,of+x,oqf+mG$TX\̙/x:"u D"Tɒ@k•Md;927Хa,eKd2­oUIJ?3S膕yoY!Wtߟ}[wwwwwwwwwwwwwwwwwwwwv cWS] @AR(,L" o4o.A30c yo`i@AR"gH2(`T6ĉr勉gJB'y f_GKD 7J.{{jZE&P(DXQB%HZ oUݷKx*꿄Xf lѬlt dBa(N2US֔WJ2U88vՓ*Dl$ L] N&HL50p^q]ZS8X(OH)0N0ɿ[4kH$]撁 4hJ9G88''ȎrAw .I@M(N5[-5 .vre,/GH$:"t$OG&IvO3,9Â}O>-Vm4(*]3L&PTe D@6.\q.чy ]U:h Ch .vreqXX楤\d,\S$TX\փ[F~BÂ}O>-Vm4(*]3L&PTe B&Drĺ90y f}:~m@mլ0^n&,  <`1[5-"(HEES$TX\޽𫻻cWberU~؜AW (y+&jJ(:<#YbBҙ q{z oP>{VR &<ɐLy2vCHC6hyG> }W_(񒯧*Aђ9uzBB oS²S+ 8SqRr:~vxR%_A&7+a˯4J oUꅇɒ*F`y!KoaඒC7/7T;`y!F8FѺ)-75a@M"z ܮLR"zo&HIXP o !W)[H0s4u!.*f^9E5n.>lpp 5[4k*BMxRÂ}O>-ZS t 5JY72U•3I}PbүkX>^J:@Ҥ*qq^688yԅ^-5ckdׅ*3f1;7*Cs|[LR6ck{VQsms4DqٽhGE%a@8mf1;7E(WE*BG~u oփՔ^G"m '7E%(?i1{ЎJq&8bvoc~QG~u ooX$Tp ZA"d QGBmZ oHXHS8pOſBR<-z{ız?IXP!aF'i$TRڋ?Ci&PTf Lt16ӌ"tKf.]e|\ iP<)7s: awn:oW}B/|zF%_@ iP!⎊JtR}ab-<4h7YEZ oUݷK$oL]L>!+ra+Lm\a:<CP!)ե3V/wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwm٣ZS;C QG < fccJgG4x 88&pSϋգwM" L:D .C1P7%˖.%/<@஡MU|ߪJ^͢6 D"m*D4*<;d·g: oԴLR"@d oG(lѭ#;7U x$0ѡ*0$pnpSϋu~f꿄[ Xf!}q16$2  W(QCs;7Uq16 vn1LMvn1LMɌ vnHn?Ci&PTf Lt1Mĉr勉p/t]aAh=]iO6 @T6D"m*D xr^ͷ \D$X(9z<:eJ"0zdJ. $X1'IbArѿɿN4nD Gf,Wd|<qB%F&.G &.Go!FV  wz ^٣ &)Ba(<`iPszUɿN4nD Gf,Wd|<lѬltɋyov2EH-jу;eK`" LS 蛉a(JNoYޮ<Ku'i$TRڋ?Ci&PTf Lt1yzZWa<9h.Y>e]0OХyGD" PMhV !LzJ2LaB(KHʖ2X\փ[F*d)}OI\hЕr8p78s oc@%' G/)8V 9~,3Npyov2EH-jу;eK`" LS 蛉a(JNoYޮ<Ku\U3G2.,bdb@I09E4 ;92ť3c[]:lM` `5[4kHf .d\Y1b;ǕG8pOſZor酪g&XoΧJue؛ִFEAA*X=v&9^or%9x+|eP ne)чC]ݷ fi|SܨOo4%FĎ yo[4kH1sHL,G*`9Â}O>; N&HB"\Q.*"d*[@d))Ƀ&,\Dr""-r *@rHLQas-hmZ𫻻d-L?{JSv洦aua(*[ Қ\b@9R+<ѭ)[! Q(#s?bL-4kId;92 4hJ9G89azVId;92-4kHLFÔxÁßX^}&S `X.LFM:ӻaBJ*$pnpX^,Y#EM:5}rkw0FTH5ɮѭ%' G/#5 aybVY5 :uNߜ9X_BVM&t 5}[! Q(#s? ,mia8oX>*M >*M #5 aax@F4(Ѭlt&Q&Q`dFV aax@F8-5}YJ 4hJ9G8a:VpR})#8|[PF>tbQWwwwwwwwwwwwwwwwwwwwwwwwwwv,jQ}8GB[wwwwwwwwwwwwwwwwwwwwwwwwwwm 0ѡ*0$ph䊓 d5BBB84%FĎ '7E P`i*Dc"@QCZ@QtτƭPWFJ2U61]$% 1\h<)p ͣX(Y0YWr~ΧJue؛,tbAWHXHRZD . V=p^Gu$|8yi"]3qccT,<ͷQ)6:Q9S,smbT,smR>)oXͷ(Y0YWr~mΧJue؛ͷ,smbAW6HXHR/HAaBE( r:M5Hi"d*XbF,TPh ; %5`(*]3%z!HE^o+տ:FJ .9Eϝx9{Uk®Y%A%>\}E0WCчCV>zɿZ~Sd}Ղ]t;HSoUݷ fi zgg&XHaBTa 2> &8bd"\هpsUPI,D H22PXaP2> 2<((o@t&AGA!AGBm٣ZB̏[! Q(#s|[K}靜b@u!AGc!?[HAaBE( r:Mo4\f"`'-5K}靜c! Q(#s|[K}靜b@t()KHȗ.X[wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwmH1XJ45MO?Qt<tU-(p=H--W9uQtτ.FTQ̮(ҳeJPH -I>諞|𫻻oׂ٣X褽NHH fSdNR@#;7U177Ts|[LQAf+hQb-oX/S{?𰼙f+h'NHEil!h'8s Af+hqb5+f,/qf+hvdgqf+hw[h6:Gvn?,/szUF 42EH,p1#H*(`4KH<4Q.ƩF$mҌ} LWJe .vrepX-" LAbe|+Ei#>}VH<4Q.ƩF$FJ2W6Af+oG1\ҙf+oH$'ޙɖ5- ok(04D"TČ X-EPrZSQ H22PXa_ ǮrktU2[-iML D44OſR.A2%˖.x-5΂JQFqҌ}=%s|[T,>oX,.ޛ%,/Yֈ<1rS@"m%ٛrJ2B0'2,)iFUS>N4n@I$TR0DbD̒&`ry0~Q*HbԬ=5@,(ﴐIvO3,#i&PTfJ ,+X.CMyԑo@I09E<?( $dt́n]V]y |vOqH$'ޙɖ5- okyܹ-) @AR(,Lc 5wRGϺ*}^Z o4\f"`'hH20DΑeKPD!n$K,\KY]6 @T6y:) zgg&XGjZE&Dr𫻻oInLՆk9zQ.7zY­ z=[ (*]0yᡸh6:D .&Kyo D"Tɒ@g_TIvO3,&pfH$'ޙɖ؜|ѿAAA dݳGτXf9Oԫ؜AW瞻 2FN}+ F l03Jjwyr $`"*,.gҚ\d,\S$TX\ZD ..4%FĎ oO>- N&HMZ0~q Lt3@AR0*c \+JgXJ;$w tpa(tU5phM)$L>vx @T6~>n.^]X xw~- CJHNr}q<*z"AR2H.|G hf1>.|͢n4{DD"m*Gz~(Bzy9UIvO3,cO#,L\Taqa$tR Ltŋ*<qXXփ[7ՙ3;GE P`j:)$TRȷo3'db%@92@Mʪ .vreZЫfO?ZK "t;RGϾ5ziMGRJ'ZҮ'Mh.ެ*tvwwwwwwwwwwwwwwwwwwwwwwwvЭUJB0Vxâ\0%Cjᆅ]ݴS k U1+K b}bb&K # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_are_pvids_sharedmk#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_are_pvids_shared.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)32 1.4 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_are_pvids_shared.sh, hacmp.assist, 61haes_r714 6/10/12 15:00:28 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_are_pvids_shared =head1 VERSION Version Number: 1.4 Last Extracted: 1/31/14 04:40:23 Last Changed: 6/10/12 15:00:28 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_are_pvids_shared.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_are_pvids_shared =head1 DESCRIPTION Searches through /usr/es/sbin/cluster/etc/config/clvg_config to determines if the all PVIDs in the list can be accessed from more that one node in the cluster. =head1 ARGUMENTS 1. pvids [REQUIRED] [string] A list of one or more PVIDs to use for the search. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_are_pvids_shared { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_are_pvids_shared.sh, hacmp.assist, 61haes_r714 : INPUTS: $* pvids=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i nodes_found=0 rc=$RC_UNKNOWN typeset conf_dir="$HAETC/config" if [[ $pvids != *([[:space:]]) ]]; then rc=$RC_SUCCESS for pvid in $pvids; do print "$0()[$LINENO]($SECONDS): /usr/bin/grep -c \$pvid\" \"$conf_dir/clvg_config\"" >>$CLMGR_TMPLOG # Always log commands nodes_found=$(/usr/bin/grep -c "$pvid" "$conf_dir/clvg_config" 2>>$CLMGR_TMPLOG) print "nodes_found: $nodes_found" >>$CLMGR_TMPLOG # Always log command result if (( $nodes_found <= 1 )); then rc=$RC_ERROR break; fi done else rc=$RC_MISSING_INPUT fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_are_pvids_shared()" es/li kh1+2bbb&2 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_cluster_rbac_refreshroupkG#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_cluster_rbac_refresh.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #============================================================================ # # Name: KLIB_HACMP_cluster_rbacrefresh # # Description: This is the function that is invoked by clmgr rbac_refresh # It uses the "cl_rbac_cmds" utility to generate list of # commands and refresh the Power HA commands by setting the # innate privileges and inherit privileges for the identified # commands. # Inputs: # NA # Outputs: # NA # Returns: # 0 -- success # 1 -- failure #============================================================================ function KLIB_HACMP_cluster_rbac_refresh { . /usr/es/sbin/cluster/cspoc/cl_federatedsec_source fsec_init . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_cluster_rbac_refresh.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* # Declare and initialize variables typeset -i rc=$RC_UNKNOWN typeset FSECFUNCNAME="run_on_allnode" # File to fetch PowerHA SM commands to categorize roles CMDS_FILE=${HA_BASE_PATH}/cspoc/cl_rbac_cmds #reading POWERHASM commands file while read LINE do [[ $LINE == \#* ]] && continue if echo $LINE |grep -qw "ADMIN" ; then CMD_AUTH="PowerHASM.admin" elif echo $LINE |grep -qw "OPERATOR" ; then CMD_AUTH="PowerHASM.op" elif echo $LINE |grep -qw "MONITOR" ; then CMD_AUTH="PowerHASM.mon" elif echo $LINE |grep -qw "VIEW" ; then CMD_AUTH="PowerHASM.view" fi CMD_PATH=$(echo $LINE | cut -f2 -d":") [[ -z $CMD_PATH ]] && ret_fail "Command not found." 1 # Skipping the further process if command is listed in cl_rbac_cmds but it #is not found on the node in any path, as there may be a case #that the fileset is not installed. # In that case we will continue to enable RBAC for other commands instead of #exiting with an error. if [[ ! -s $CMD_PATH ]];then fileset=$(lslpp -wc $CMD_PATH | grep $CMD_PATH | grep -v "#" | cut -d: -f2) if [[ -z $fileset ]];then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1438 "\nWARNING: Failed to enable \"%1\$s\" for RBAC because fileset is not installed. Please run the operation after installing the missing fileset.\n\n" "$CMD_PATH" else cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1439 "\nWARNING: Failed to enable \"%1\$s\" for RBAC because \"%2\$s\" is not properly installed. Please run the operation after installing the fileset properly.\n\n" "$CMD_PATH" "$fileset" fi continue fi # This can be made more secure with respect to privileges by running each command with all #the options. Get a unique list of all the privileges for a particular command. # Basically each command has to run for all code paths using "tracepriv" just like truss to #get complete list of privileges required to run a particular command. # Get innate and inherit privileges for each command in cl_rbac_cmds file CMD_PRIVS="" INHERIT_PRIVS="" CMD_PRIVS=$(echo $LINE | cut -f3 -d":") INHERIT_PRIVS=$(echo $LINE | cut -f4 -d":") # Privilege "PV_LIVE_UPDATE" is introduced to support live update feature of AIX. # Remove this privilege from inherit privilege list on older version of AIX, where # lvupdate feature is not supported. lspriv -v | grep -wq "PV_LIVE_UPDATE" if (( $? != 0 ));then if echo $INHERIT_PRIVS | grep -wq "PV_LIVE_UPDATE" ; then INHERIT_PRIVS=$(echo "$INHERIT_PRIVS" | sed "s/,PV_LIVE_UPDATE//g;s/PV_LIVE_UPDATE,//g") fi fi # Set security attibutes and innate privileges identified for the command if [[ -z $CMD_PRIVS ]] then STD_ERR=$(setsecattr -R LDAP -c accessauths=$CMD_AUTH secflags=FSF_EPS $CMD_PATH >/dev/null 2>&1) if [[ -n $STD_ERR ]]; then log_return_msg "$RC_ERROR" "$0()" "$LINENO" return $? fi else STD_ERR=$(setsecattr -R LDAP -c accessauths=$CMD_AUTH innateprivs="$CMD_PRIVS" secflags=FSF_EPS $CMD_PATH >/dev/null 2>&1) if [[ -n $STD_ERR ]]; then log_return_msg "$RC_ERROR" "$0()" "$LINENO" return $? fi fi # Set inherit privileges identified for the command. if [[ -n $INHERIT_PRIVS ]] then STD_ERR=$(setsecattr -R LDAP -c inheritprivs="$INHERIT_PRIVS" $CMD_PATH 2>&1) if [[ -n $STD_ERR ]]; then log_return_msg "$RC_ERROR" "$0()" "$LINENO" return $? fi fi # Command "cl_mkvg" requires effective user ID as 0 in order to execute successfully. # Set euid to 0 for this utility if echo $CMD_PATH | grep -wq "cl_mkvg" ; then STD_ERR=$(setsecattr -R LDAP -c euid=0 $CMD_PATH 2>&1) if [[ -n $STD_ERR ]]; then log_return_msg "$RC_ERROR" "$0()" "$LINENO" return $? fi fi done < $CMDS_FILE # Changing file permission so that other users cannot access it unless they have required role run_on_allnode "find /var/hacmp -type f|xargs -i chmod o-rwx {}" >/dev/null || ret_fail "chmod failed." $? # Setting read auths for all hacmp log files hacmp_FILES=$(find /var/hacmp -type f) || ret_fail "finding other log files failed." $? for X in $hacmp_FILES do STD_ERR=$(setsecattr -R LDAP -f readauths="PowerHASM.view" $X 2>&1 1>/dev/null) if [[ -n $STD_ERR ]]; then log_return_msg "$RC_ERROR" "$0()" "$LINENO" return $? fi done log_return_msg "$RC_SUCCESS" "$0()" "$LINENO" return $? } #End of "KLIB_HACMP_cluster_rbac_refresh()" stalle k1+'b}bb&' # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_cluster_rehearsalsh#!/bin/ksh93 # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_cluster_rehearsals.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # #===================================================== # The following, commented line enforces coding # standards when this file is edited via emacs or vim. #===================================================== # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #===================================================== # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_cluster_rehearsals =head1 SYNOPSIS clmgr manage cluster rehearsals RESOURCE_GROUP="[,,,...]" NOTE: The alias for "rehearsals" is "reh". =head1 DESCRIPTION Retrieves the Failover Rehearsals for resource group. =head1 ARGUMENTS 1. resource_group_name [REQUIRED] [string] Get failover rehearsals of Target storages and mirroring of resource group. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of "devDoc()" function KLIB_HACMP_cluster_rehearsals { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : INPUTS: $* typeset rgs=${1//\"/} rgs=${rgs//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_SUCCESS #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? else # : Check the cluster type, return if not Linked Cluster # typeset -i cluster_type=$(clodmget -n -f multi_site_lc HACMPcluster) if (( $cluster_type != 1 )) then dspmsg -s $CLMGR_SET $CLMGR_MSGS 1163 "\nERROR: Failover rehearsals are supported in linked cluster only.\n\n" 1>&2 log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi fi #================= : Validate input #================= if [[ $rgs != *([[:space:]]) ]]; then for rg in $rgs; do CL=$LINENO KLIB_HACMP_is_known_rg "$rg" >/dev/null 2>&1 if (( $? != RC_SUCCESS )); then dspmsg -s $CLVT_SET $CLVT_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$rg" 1>&2 rc=$RC_NOT_FOUND fi done if (( $rc == RC_NOT_FOUND )); then dspmsg -s $CLVT_SET $CLVT_MSGS 154 "Available Resource Groups:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_resourcegroups available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi else dspmsg -s $CLMGR_SET $CLMGR_MSGS 200 "\nERROR: missing required argument: %1\$s\n" RESOURCE_GROUP 1>&2 rc=$RC_MISSING_INPUT fi if (( $rc == RC_SUCCESS )) then print -- "$0()[$LINENO]($SECONDS): cl_get_rehearsals -r \"$rgs\"" >>$CLMGR_TMPLOG cl_get_rehearsals -r "$rgs" rc=$? print -- "$0()[$LINENO]($SECONDS): cl_get_rehearsals -r \"$rgs\" rc=$rc" >>$CLMGR_TMPLOG # Always log command result fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT )) && [[ $CLMGR_GUI == *([[:space:]]) ]] then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "manage cluster -h" "CLUSTER:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_cluster_rehearsals()" E k>1+^b}bb&^ # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_collect_logsrsalsh#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2020,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_collect_logs.sh 1.4 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_collect_logs.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_collect_logs =head1 VERSION Version Number: 1.4 Last Extracted: 1/31/14 04:41:03 Last Changed: 10/28/13 16:42:16 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_collect_logs.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr collect logs \ [ DIRECTORY="" ] \ [ NODES=[,,,...] ] \ [ RSCT_LOGS={yes|no} ] \ =head1 DESCRIPTION Collects the PowerHA logs and various other service information. =head1 ARGUMENTS 1. DIRECTORY [OPTIONAL] [string] An alternate directory into which the collected logs will be placed. 2. NODES [OPTIONAL] [string] One or more nodes from which to retrieve the logs (defaulting to the local node). 3. RSCT_LOGS [OPTIONAL] [string] A Boolean-like indicator of whether or not the RSCT logs should also be collected (along with the PowerHA logs). =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function on_exit_collect_logs { /usr/bin/rm -f $TMPDIR/clmgr.KHcl.$$ } function KLIB_HACMP_collect_logs { trap 'on_exit_collect_logs' EXIT LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version= @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_collect_logs.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM typeset DIRECTORY=${1//\"/} typeset NODES=${2%%+([[:space:]])} NODES=${NODES##+([[:space:]])} NODES=${NODES//+([[:space:]])/,} NODES=${NODES//\"/} typeset -l RSCT_LOGS=${3//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset dopt= sopt= nopt= [[ -n $DIRECTORY ]] && dopt="-d $DIRECTORY" [[ -n $NODES ]] && nopt="-n $NODES" [[ $RSCT_LOGS == @(n|f)* ]] && sopt="-s" #============================================================== : The return code from clsnap is unreliable. So we are forced : to parse the output information to determine if there is : enough space to run this operation. #============================================================== print -- "$0()[$LINENO]($SECONDS): LC_ALL=C LANG=C $HAUTILS/clsnap $dopt $nopt $sopt -p 1" >>$CLMGR_TMPLOG # Always log commands LC_ALL=C LANG=C $HAUTILS/clsnap $dopt $nopt $sopt -p 1 |\ /usr/bin/tee $TMPDIR/clmgr.KHcl.$$ if [[ ! -s $TMPDIR/clmgr.KHcl.$$ ]] || \ ! grep -q "kb Required" $TMPDIR/clmgr.KHcl.$$ || \ grep -q "not enough" $TMPDIR/clmgr.KHcl.$$ then log_return_msg "$RC_ERROR" "$0()" "$LINENO" return $? fi print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clsnap $dopt $nopt $sopt -p 2" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clsnap $dopt $nopt $sopt -p 2 rc=$? print "clsnap -p 2 RC: $rc" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_collect_logs()" == k,1+,"b}bb&," # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_compare_clusterlsh#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_compare_cluster.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #============================================================================ # # Name: KLIB_HACMP_compare_cluster # # Description: This is the main, FPATH function that is invoked by clmgr # to compare clusters. It uses the "clccv" utility to # generate a json report. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: None - generates a json file. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_compare_cluster { . $HALIBROOT/log_entry "$0()" "$CL" : version="@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_compare_cluster.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM" : INPUTS: $* typeset hosts=${1//\"/} typeset DIRECTORY=${2//\"/} typeset DISABLE_EXPECT=${3//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset MSG="" typeset dOpt="" typeset eOpt="" #=================================== : Validate inputs #=================================== # clccv takes 1 or 2 host names: # 1) if one name is given it is assumed the local cluster configuration # will be used for comparison and the provided name is a node in a remote # cluster. # 2) if two names are given, they are both assumed to be nodes in # a remote cluster, though the clever user might give the hostname # of a cluster node in the same cluster as this one, thus achieving the # the same as (1) above. # # no matter what they must be comma separated, so we begin by checking # for that if [[ $hosts == *([[:space:]]) || $hosts != *,* ]] then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 200 "\nERROR: missing required argument: %1\$s\n" "," 1>&2 rc=$RC_MISSING_INPUT # additional help message will be printed below fi : Directory arg must be a directory if [[ -n $DIRECTORY ]]; then dOpt="-d $DIRECTORY" if [[ $DIRECTORY != *([[:space:]])/* ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 106 "\nERROR: the specified path/file does not appear to be in absolute format:\n %1\$s\n\n" "$DIRECTORY" 1>&2 rc=$RC_NOT_FOUND else if [[ ! -d $DIERCTORY ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 136 "\nWarning: the directory in \"%1\$s\" does not yet exist.\n An attempt will be made to create that directory.\n\n" "$DIERCTORY" mkdir -p "$DIERCTORY" if [[ ! -d $DIERCTORY ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 201 "ERROR: failed to create \"%1\$s\".\n\n" "$DIERCTORY" 1>&2 rc=$RC_NOT_FOUND fi fi fi fi [[ -n "$DISABLE_EXPECT" ]] && eOpt="-E" #=================================================== : Invoke clccv for the comparison - clccv takes care of : all additional input validation #=================================================== if (( $rc == RC_UNKNOWN )) then print "$0()[$LINENO]($SECONDS): clccv -n $hosts $dOPT $eOPT" >>$CLMGR_TMPLOG # Always log commands clccv -n $hosts $dOpt $eOpt 2>>$CLMGR_TMPLOG rc=$? print "$0()[$LINENO]($SECONDS): clccv RC=$rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then # clccv will have shown detailed error information dspmsg -s $CLMGR_SET $CLMGR_MSGS 109 "\nERROR: the operation appears to have failed.\n\n" 1>&2 rc=$RC_ERROR fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then print -u2 "" cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "compare cluster -h" "CLUSTER:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose even if the man pages are installed. # As a result of this, it is imperative that the information in # this SYNOPSIS be kept in sync with the man page information. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_compare_cluster =head1 SYNOPSIS clmgr compare cluster , \ [ DIRECTORY="/absolute/path/to/store/results" ] \ [ DISABLE_EXPECT ] NOTE: the alias for "cluster" is "cl". NOTE: aliases for "compare" are "comp", "diff". =head1 DESCRIPTION Compares the cluster configuration on the cluster nodes specified by host name. =head1 ARGUMENTS 1. hosts [REQUIRED] string Comma separated list of two hosts to compare. Either can be: o host name of a node in a remote cluster o host name of a node in a the same cluster as where this command is being run If only one host is given, it is assumed the local cluster will be used for the comparison. All remote hosts must be accessible using ssh and scp. The user may be prompted one or more times to enter that password. 2. DIRECTORY [OPTIONAL] string Path to use when saving the results of the comparison. Default is "/tmp". 3. DISABLE_EXPECT [OPTIONAL] PowerHA will use "expect" by default to reduce the number of times the user must enter a password. This flag specifies that expect should not be used, even if it is available. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== ]])  k'1+ ,b}bb& , # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_compare_snapshotsh#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_compare_snapshot.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #============================================================================ # # Name: KLIB_HACMP_compare_snapshot # # Description: This is the main, FPATH function that is invoked by clmgr # to compare snapshot. It uses the "clsnapshot" utility # with the "preview" option to generate a report. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: Output from the clsnapshot preview. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_compare_snapshot { . $HALIBROOT/log_entry "$0()" "$CL" : version="@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_compare_snapshot.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM" : INPUTS: $* typeset snapshots=${1//\"/} typeset SNAPSHOTPATH=${2//\"/} typeset SECTION=${3//\"/} typeset PAGER=${4//\"/} typeset SDIFF_OUTPUT_WIDTH=${5//\"/} typeset SDIFF_FLAGS=${6//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset MSG="" typeset Sopt="" #=================================== : Validate inputs #=================================== # "clsnapshot compare" takes 2 names which can be keywords, full path # names, snapshot names or a combination - see the devDoc for details - # no matter what they must be comma separated, so we begin by checking # for that if [[ $snapshots == *([[:space:]]) || $snapshots != *,* ]] then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 200 "\nERROR: missing required argument: %1\$s\n" "," 1>&2 rc=$RC_MISSING_INPUT # additional help message will be printed below fi # Oddly, clsnapshot takes a few things from the env where there is no # command line equivalent to do the same thing - so we shall take the # clmgr inputs, verify them as best we can, and export them to the shell # before invoking clsnapshot # SNAPSHOTPATH must be an absolute path if [[ -n $SNAPSHOTPATH ]] then if [[ $SNAPSHOTPATH != /* ]]; then MSG=$(dspmsg -s $CLMGR_SET $CLMGR_MSGS 106 "\nERROR: the specified path/file does not appear to be in absolute format:\n%1\$s\n\n" "$SNAPSHOTPATH") MSG="$MSG (SNAPSHOTPATH @ $LOCAL_NODE)" cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS -1 "${MSG//+([[:space:]])/ }" 1>&2 rc=$RC_INCORRECT_INPUT else export CLSNAPSHOT_SNAPSHOTPATH=$SNAPSHOTPATH fi fi # clsnapshot itself will check if any specified section is valid # and exists in both snapshots, so we do no explicit check of the optional # SECTION input here [[ $SECTION != *([[:space:]]) ]] && Sopt="-S $SECTION" # According to the man page for sdiff the output width must be in the # range of 20 - 2048, but in reality it will throw an error if 20 is # used, so we go with 21 here if [[ -n $SDIFF_OUTPUT_WIDTH ]] then CL=$LINENO verify_numeric_range "$SDIFF_OUTPUT_WIDTH" 21 2048 SDIFF_OUTPUT_WIDTH if (( $? != RC_SUCCESS )) then rc=$RC_INCORRECT_INPUT else export CLSNAPSHOT_SDIFF_OUTPUT_WIDTH=$SDIFF_OUTPUT_WIDTH fi fi # Check "pager" and "flags" for shell execution characters, otherwise # we just export them as is if [[ -n $PAGER ]] then if [[ $PAGER == *@(\`|\$\(|\|)* ]] then dspmsg -s $CLVT_SET $CLVT_MSGS 133 "\nERROR: the \"%1\$s\" option contains a shell execution character: %2\$s\n\n" PAGER "$PAGER" 1>&2 rc=$RC_INCORRECT_INPUT else # make sure it exists if [[ ! -x $PAGER ]] then MSG=$(dspmsg -s $CLMGR_SET $CLMGR_MSGS 107 '\nERROR: the specified path/file does not appear to exist on "%2$s": %1$s\n\n' "$PAGER" $(hostname)) MSG="$MSG (PAGER)" cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS -1 "${MSG//+([[:space:]])/ }" 1>&2 rc=$RC_NOT_FOUND else export CLSNAPSHOT_PAGER=$PAGER fi fi fi if [[ -n $SDIFF_FLAGS ]] then if [[ $SDIFF_FLAGS == *@(\`|\$\(|\|)* ]] then dspmsg -s $CLVT_SET $CLVT_MSGS 133 "\nERROR: the \"%1\$s\" option contains a shell execution character: %2\$s\n\n" SDIFF_FLAGS "$SDIFF_FLAGS" 1>&2 rc=$RC_INCORRECT_INPUT else export CLSNAPSHOT_SDIFF_FLAGS=$SDIFF_FLAGS fi fi #=================================================== : Invoke clsnapshot for the comparison - clsnapshot takes care of : all additional input validation #=================================================== if (( $rc == RC_UNKNOWN )) then print "$0()[$LINENO]($SECONDS): clsnapshot $Sopt -p $snapshots " >>$CLMGR_TMPLOG # Always log commands clsnapshot $Sopt -p $snapshots 2>>$CLMGR_TMPLOG rc=$? print "$0()[$LINENO]($SECONDS): clsnapshot RC=$rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then # clsnapshot will have shown detailed error information dspmsg -s $CLMGR_SET $CLMGR_MSGS 109 "\nERROR: the operation appears to have failed.\n\n" 1>&2 rc=$RC_ERROR fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then print -u2 "" cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "compare snapshot -h" "SNAPSHOT:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose even if the man pages are installed. # As a result of this, it is imperative that the information in # this SYNOPSIS be kept in sync with the man page information. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_compare_snapshot =head1 SYNOPSIS clmgr compare snapshot , \ [ SNAPSHOTPATH="/absolute/path/to/search/for/snapshots" ] \ [ SECTION="list,of,sections,to,compare" ] \ [ PAGER="pager_command" ] \ [ SDIFF_OUTPUT_WIDTH="21 .. 2048" ] \ [ SDIFF_FLAGS="flags_for_sdiff" ] NOTE: the alias for "snapshot" is "sn". =head1 DESCRIPTION Compares the specified snapshots. =head1 ARGUMENTS 1. snapshots [REQUIRED] string Comma separated list of two entities to compare. Either entity can be: o a snapshot name. o full path (begins with "/") to a snapshot file including the ".odm" suffix. o the keyword "DCD" to compare the configuration in the Default Configuration Directory. o the keyword "ACD" to compare the configuration in the Active Configuration Directory. If the first entity is not specified, it defaults to the DCD. If the second entity is not specified, it defaults to the ACD. 2. SNAPSHOTPATH [OPTIONAL] string Path to use when searching for snapshots. Must begin with "/". Default is "/usr/es/sbin/cluster/snapshots". If a full path to a snapshot is given, this input is ignored. 3. SECTION [OPTIONAL] string Comma separated list of sections to compare between the 2 snapshots provided. Note this is only valid with the "compare" action of clmgr. 4. PAGER [OPTIONAL] string Compare snapshot uses "sdiff" to generate differences and the sdiff output is then displayed using "pg" by default. This argument can be used to specify a different command other than "pg". 5. SDIFF_OUTPUT_WIDTH [OPTIONAL] integer The sdiff command can produce results with a specific width which defaults to 200 columns. This input can be used to sepcify a different width, between 21 and 2048 columns. 6. SDIFF_FLAGS [OPTIONAL] string Any additional flags to be passed to the sdiff command. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== rom t kh1+b}bb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_appmonitorh#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_appmonitor.sh 1.7 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)65 1.7 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_appmonitor.sh, hacmp.assist, 61haes_r714 6/10/12 15:11:22 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_appmonitor =head1 VERSION Version Number: 1.7 Last Extracted: 1/31/14 04:40:52 Last Changed: 6/10/12 15:11:22 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_appmonitor.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr delete application_monitor {[,,,...] | ALL } =head1 DESCRIPTION Deletes one or more application monitors from the cluster configuration. =head1 ARGUMENTS 1. MONITORS [REQUIRED] [string] One or more (comma or space separated) application monitors to attempt to delete. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_appmonitor { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.7, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_appmonitor.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset MONITORS=${1//\"/} MONITORS=${MONITORS//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset MONITOR= #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= elif [[ -z $MONITORS ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset -u uctext=$MONITORS if [[ $uctext == "ALL" ]]; then MONITORS= typeset available CL=$LINENO KLIB_HACMP_list_appmonitors available for (( i=0; i<${#available[*]}; i++ )); do MONITORS="$MONITORS ${available[$i]}" done if [[ $MONITORS == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 321 "Warning: there are no application monitors to delete.\n" rc=$RC_SUCCESS fi fi fi #======================================================================= : Delete the application monitor if no input errors have been detected #======================================================================= if (( $rc == RC_UNKNOWN )); then for MONITOR in $MONITORS; do CL=$LINENO KLIB_HACMP_is_known_appmonitor "$MONITOR" if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$MONITOR" 1>&2 /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 141 "Available Application Monitors:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_appmonitors available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done rc=$RC_NOT_FOUND else print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrmappmon \"$MONITOR\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrmappmon "$MONITOR" rc=$? print "clrmappmon RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$MONITOR" 1>&2 break fi fi done (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete application_monitor -h" "APPLICATION MONITOR:" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_appmonitor()" "$0( k61+Xb}bb&X # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_appserverh#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_appserver.sh 1.3 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)18 1.3 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_appserver.sh, hacmp.assist, 61haes_r714 6/10/12 15:11:22 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_appserver =head1 VERSION Version Number: 1.3 Last Extracted: 1/31/14 04:40:48 Last Changed: 6/10/12 15:11:22 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_appserver.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr delete application_controller {[,,,...] |\ ALL} =head1 DESCRIPTION Deletes one or more application controllers from the cluster configuration. =head1 ARGUMENTS 1. APPLICATIONS [REQUIRED] [string] One or more (comma or space separated) application controllers to attempt to delete. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_appserver { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_appserver.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset APPLICATIONS=${1//\"/} APPLICATIONS=${APPLICATIONS//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset APPLICATION= #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= elif [[ -z $APPLICATIONS ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset -u uctext=$APPLICATIONS if [[ $uctext == "ALL" ]]; then APPLICATIONS= typeset available CL=$LINENO KLIB_HACMP_list_appservers available for (( i=0; i<${#available[*]}; i++ )); do APPLICATIONS="$APPLICATIONS ${available[$i]}" done if [[ $APPLICATIONS == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 320 "Warning: there are no application controllers to delete.\n" rc=$RC_SUCCESS fi fi fi #====================================================================== : Delete the application server if no input errors have been detected #====================================================================== if (( $rc == RC_UNKNOWN )); then for APPLICATION in $APPLICATIONS; do CL=$LINENO KLIB_HACMP_is_known_appserver "$APPLICATION" if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$APPLICATION" 1>&2 /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 140 "Available Application Controllers:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_appservers available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done rc=$RC_NOT_FOUND else print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrmserv \"$APPLICATION\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrmserv "$APPLICATION" rc=$? print " RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS)); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$APPLICATION" 1>&2 break fi fi done (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete application_controller -h" "APPLICATION CONTROLLER:" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_appserver()"  k1+'b~bb&' # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_backup_profileoupkG#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2018,2019,2020,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # @(#) 5f56dbd 43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_backup_profile.sh, 726, 2147A_aha726, Mar 08 2021 04:44 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_backup_profile =head1 SYNOPSIS clmgr delete backup_profile {[,,...] | ALL} \ [ CANCEL_BACKUP={no|yes} ] backup_profile => bp, backup_p, replication_profile =head1 DESCRIPTION Attempts to delete backup profile configuration and backup data for specified resource group or All resource groups. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. resource_group [REQUIRED] [string] Resource group name can be single or multiple resource groups All resource group can be deleted if 'All' is specified. 3. CANCEL_BACKUP [OPTIONAL] [string] Cancels running backup process. Default value no. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. #============================================================================ # # Name: KLIB_HACMP_delete_backup_profile # # Description: This is the main, FPATH function that is invoked by clmgr # to delete backup configuration. The cl_cbm_list utility is # used to query backup configuraton and cl_cbm_delete utility # is invoked to delete data from xml file. # # Inputs: See the "devDoc()" function at the top of this file. # # Outputs: The properties hash is populated. The only other outputs are # any error messages that might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the top of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_delete_backup_profile { . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 5f56dbd 43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_backup_profile.sh, 726, 2147A_aha726, Mar 08 2021 04:44 PM : INPUTS: $* typeset rgs=${1//\"} rgs=${rgs//,/ } typeset cancel_backup=${2//\"} [[ -z $TAB ]] && TAB=$'\t' [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_SUCCESS typeset rg= available= output= unknown_rg= typeset -l lc_rg=$rgs typeset nodelist="" #==================================== : Check python is installed or not #==================================== LANG=C cl_get_python_version 2>&1 >>/dev/null rc=$? if (( $rc != 0 )); then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1315 "\nERROR: Python must be installed for using backup feature.\n\n" 1>&2 log_return_msg "$rc" "$0()" "$LINENO" return $rc fi #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY else #================= : Validate input #================= if [[ -z $rgs ]]; then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else print -- "$0()[$LINENO]($SECONDS): cl_cbm_list" >>$CLMGR_TMPLOG # Always log command result available=$(LANG=C cl_cbm_list 2>>$CLMGR_TMPLOG) rc=$? print -- "$0()[$LINENO]($SECONDS): cl_cbm_list RC:$rc" >>$CLMGR_TMPLOG # Always log command result if [[ $lc_rg != "all" ]] then for rg in $rgs do echo "$available" | grep -wq $rg || unknown_rg=${unknown_rg:+$unknown_rg,}$rg done if [[ -n $unknown_rg ]] then available=$(echo "$available" | sed "s/^/$TAB/g") cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1191 "\nERROR: Resource group \"%1\$s\" not configured for backup.\n\n" "$unknown_rg" 1>&2 cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1192 "Configured resource groups for backup:\n\n" 1>&2 print -u2 "$available" print -u2 "" rc=$RC_NOT_FOUND fi else # Delete all configured RGs rgs="" for rg in $available do rgs="${rgs:+$rgs }$rg" done # If no RG to delete, consider it is ok if [[ -z $rgs ]]; then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1197 "\nERROR: No resource group configured for backup.\n\n" 1>&2 fi rc=$RC_SUCCESS fi fi # Validate cancel_backup value. if [[ -n $cancel_backup ]] then CL=$LINENO verify_in_set CANCEL_BACKUP "$cancel_backup" "yes no" cancel_backup if (( $? != RC_SUCCESS ));then rc=$RC_INCORRECT_INPUT fi else cancel_backup="no" fi if (( $rc == RC_SUCCESS )) ; then for rg in $rgs; do if [[ $cancel_backup == "yes" ]] then #Even if cancellations fails log error and continue with delete print -- "$0()[$LINENO]($SECONDS): cl_cbm_cancel_backup $rg" >>$CLMGR_TMPLOG # Always log command result LANG=C cl_cbm_cancel_backup "$rg" 2>>$CLMGR_TMPLOG rc=$? print -- "$0()[$LINENO]($SECONDS): cl_cbm_cancel_backup $rg RC:$rc" >>$CLMGR_TMPLOG # Always log command result fi print -- "$0()[$LINENO]($SECONDS): cl_cbm_delete $rg" >>$CLMGR_TMPLOG # Always log command result output=$(LANG=C cl_cbm_delete "$rg" 2>>$CLMGR_TMPLOG) rc=$? print -- "$0()[$LINENO]($SECONDS): cl_cbm_delete $rg RC:$rc" >>$CLMGR_TMPLOG # Always log command result # If rootvg_profile is removed from backup configuration, then coresponding timer should be removed if [[ $rg == "rootvg_profile" ]] then cl_cbm_rootvg_timer -r odmdelete -o HACMPtimersvc -q "name = cbm_rootvg_timer" >>/dev/null fi if (( $rc != RC_SUCCESS ));then print -- "$0()[$LINENO]($SECONDS): cl_cbm_delete $rg RC:$rc \noutput=$output" >>$CLMGR_TMPLOG # Always log command result cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1198 "\nERROR: failed to remove backup configuration for resource group \"%1\$s\".\n\n" "$rg" 1>&2 rc=$RC_ERROR break else # if backup profile got deleted then remove the corresponding HACMPresource entry print -- "$0()[$LINENO]($SECONDS): odmdelete -o HACMPresource -q "group=$rg AND name=BACKUP_ENABLED" " >>$CLMGR_TMPLOG odmdelete -o HACMPresource -q "group=$rg AND name=BACKUP_ENABLED" >>/dev/null print -- "$0()[$LINENO]($SECONDS): odmdelete -o HACMPresource -q "group=$rg AND name=BACKUP_ENABLED" RC:$?" >>$CLMGR_TMPLOG fi done fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]]; then cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete backup_profile -h" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_backup_profile()" #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ in  lM1+9vb}bb&C # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_clusterrofil    =enorst $CEL_acdil"#():ADGIMNORSTfhmpu-./01>P[]gv&,2;HU\bwy%'3?BFKk!*+4567VYx{}9WfM<k3d#/ %f +x5:̝e b,9&'+;^|M::_<'ax'`ΫB lɘVHmr WX'[:̝e&'+s/qVYVxYbۄ}Xq5;*<#'1M-sx4ehVF_N!@k,y&;Yp@sUNjv`nUk edؓxmmmmmmmmmm<֭L0z$^Yʋ2v8S 51d#/t´$*T[.R[qH +)?v'/m`@T|F<,*`rd&TY*8 N (zTH'/'0A40p Ǔ?vHx4q90r   *9^` yh"2%L$rG oʵz5Y;0< S&D劑(<]6$X 6\^aGmmmm;!+2U5,4jAmmmmm?! wU90&TJ*A"kPy4Lp7P,ҀqBSX=jdTBTe* ?! Ƽ1e7N^Y-VY"ra1Xe ***#Ǩ1CDc$9E((ic@0`$Q"DF ]$J \h,F_Dv (<]8RM pXprLe L3a-Dib" &Py49ɤ,Py49ɤ,X :ZGPy49ɤ`Ui""4e3a ADA|MKODiT"A2E(W$( 0*,F^U78(89S&D T̰yg`XF^Vd#/?8^. jZmmmmmmmm;0ju;Jk[sFb j:bGsY;e*μaE4+ ip*Q70**QmmmmmmmB"/U~ Ne*=XD k3Q,8Ѡ&ʋ a0E2dK(]#Le "_@$% ju; b,9( BqH&UPq68HN)DLDt*Pq &\-f^mfaÃE2dK(`zeH0x4$˅ͬ"89S&D T q68 A2E(TDbDBƎef~YX89S&D Tfd buYn #p|ڳ34v^dƹy+ dv:E90ׁpadȖPF4L.DP9,TfN26nngrV`/0@@h9u_; cYsDmmmmi\# l7@b..\ؔ ngjD|H$"*$prĦ8KpT 0gkXp`I3bqBLsa`p kvq_R@̰lmmmmmmm?vX;xbjvUvyoSmmmmmmNL&8Kc˘PR P̹Bn(TI.`,,^kH%FvO?v^g`ή'a 5FP` !Pt*(TX/ic@0`$Q"DF ]$J \h`iI Y`0𕋊ÃE2dK(`zeH0x4$˅0YEJL-YgOa'{ )DLDt*PqLpfB$pf 3 X89S&D T"bH%  0I2k2f~|8-y iYA̰QT=`&HE @H(@̳_DvQ ÃE2dK(`zeH`"pj(\4h/i̝eד,6WH$c˘PR P@XS6\0eF_&Xka 2_st  QX?w6|^Wg^a< i.aBH%זf2\4Դ*Q.HT4e8\&UP?`yfc***51Oi&T#Ǩ`-CO2mmmxsBYa|F_mmm@CA^{t*(TX,eEYeFy4i5-?DʀDxL\EiX< e&T#Ǩ`-8&T#Ǩ\A|MKOy$΁a  YbO @CA^{t*(TX/ic@0`$Q"DF ]$J \h,;j̝eL&R'`'ax[ Yfǰ 4AHQI;AbkXY<-k2vՙ;a"2%0L=2OAbkXY<-k2vՙ;2Lp6'azZq68 A2E(TDbDBƎj̝edGh0ՙ;z°L&R'`'az[ ƍ5-?]mmmmm\|MN̝e65Y?]mmmmmg3,2-%=DS0lh_ReEph"2%.S&Dˑ/@ `HM msF_{  (((('\?Y*/%Aɑ,th"2%&\| 'G2lXhon&Dx Fs/qPkG`NL&9判b n%HQe&T#Ǩ\p@#0<QA% 0=`&HE @H(@#Ǩ,J$PxD(nk2v&t ,E#L&R'0d#/Z_e}VB ayirʳ'Utx{eGQT)(AbiͬF_0<a&@`6$8H!{ )DLDt*PqY,,V)"YC*Dmmmm`.^S<~'a~1'6OmmmmO8R "*"1"TGag`XF^Vd#/ dȖP0ʑ?,;j̝ejǰ 4AHQI;a2va"2%0L=2O`0f"pj(\4h/i28nXL4LHƂ)"YBeȗHhf(ԋ*Xvy{,uXM ms2v^x@ €r ̹Xf@惚+'b0 eB@( & $X-fM<(.Rb"8 t  HZ̛xP ]`CYpadȖPF4L.DCC1@XRõ[Yc| 02lXhon&Y2ǒP8Veט0 4X;S. dȖP0ʑ?@C a  YbO k+,&ĞX)0L&R'g@0ɱ' AzȨbK#Ǩ`,dcP I4PIZY QE"2XzM_q&DxfN2mjViXVsga+"kY mmmmmmmQx7,&Le cAɑ,2KP` 9%vy@Ve72vkG{ @0`$Q"DF ]$J \hS,\dM# (`,+Aɑ,a"Y IR r+ iIDS0l89,&ĞX)0Pp 4a 0h (B#.%J.4v)HRG A^A² &E0is ";@  dȖP0ʑVT$EvG4vaYgͪS 5/.|uO3'%VnmVsͫ 㬯*MISqb٩dfU:̛xV]MN\*\~Xssga>sʫ,HyR0; ]q&'b;6r^X&Rxs݆ͫ420P9c"kͪS.ybÚ X7+/xeSaG<^I!G<^TN Wiñ 6 D87:Z2NV Y|q O@]3>Wדu0XOH^%f +^ʬ3+vmXkUubR%CabDA=0" &^bÚ8v 6a a  # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_cod =head1 VERSION Version Number: 1.3.1.4 Last Extracted: 2/9/15 16:43:08 Last Changed: 1/27/15 08:42:07 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_cod.sh, hacmp.assist, 61haes_r720, 1507A_hacmp720 =head1 SYNOPSIS clmgr delete cod { | ALL} NOTE: the aliases for "cod" are "cuod", "dlpar" and "roha". =head1 DESCRIPTION Attempts to delete all currently specified Resource Optimized High Availability configuration settings from the specified application_controller. =head1 ARGUMENTS 1. APPCTRL [REQUIRED] [string] One or All already-configured application controllers to delete. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2015 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_cod { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3.1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_cod.sh, hacmp.assist, 61haes_r720, 1507A_hacmp720 : INPUTS: $* typeset application_controllers=${1//\"} application_controllers=${application_controllers//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN i=0 typeset application_controller= typeset -u uc_val=$application_controllers #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= elif [[ $application_controllers == *([[:space:]]) ]]; then CL=$LINENO dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else if [[ $uc_val == "ALL" ]]; then application_controllers="" typeset available CL=$LINENO KLIB_HACMP_list_cod available for (( i=0; i<${#available[*]}; i++ )); do application_controllers="$application_controllers ${available[$i]}" done else for application_controller in $application_controllers; do CL=$LINENO KLIB_HACMP_is_known_cod "$application_controller" >/dev/null if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 317 "\nERROR: \"%1\$s\" is not configured for Resource Optimized High Availabity services.\n\n" "$application_controller" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 169 "Available Application Controllers Configured for Resource Optimized High Availabity:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_cod available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND else CL=$LINENO KLIB_HACMP_is_known_appserver "$application_controller" if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$application_controller" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 140 "Available Application Controllers:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_appservers available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND fi fi done fi fi if (( $rc == RC_UNKNOWN )); then for application_controller in $application_controllers; do print -- "$0()[$LINENO]($SECONDS): clchserv -o \"$application_controller\" -u 0 -m 0.0 -c 0 -p 0.0 -v 0" >>$CLMGR_TMPLOG clchserv -o "$application_controller" -u 0 -m 0.0 -c 0 -p 0.0 -v 0 rc=$? print -- "$0()[$LINENO]($SECONDS): clchserv -o \"$application_controller\" -u 0 -m 0.0 -c 0 -p 0.0 -v 0 rc=$rc" >>$CLMGR_TMPLOG if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 318 "\nERROR: failed to remove the Resource Optimized High Availability settings from \"%1\$s\".\n\n" "$application_controller" 1>&2 break fi done fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]]; then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete cod -h" "COD:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_cod()" $CLM k41+w9b}bb&w9 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_dependencyil#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_dependency.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)01 1.3 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_dependency.sh, hacmp.assist, 61haes_r714 6/10/12 15:11:24 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_dependency =head1 VERSION Version Number: 1.3 Last Extracted: 1/31/14 04:41:46 Last Changed: 6/10/12 15:11:24 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_dependency.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr delete dependency { | ALL} \ [ TYPE={PARENT_CHILD|STOP_AFTER|START_AFTER|\ SAME_NODE|SAME_SITE|DIFFERENT_NODES} ] =head1 DESCRIPTION Deletes the specified dependency from the cluster configuration. =head1 ARGUMENTS 1. dependency [REQUIRED] [string] The dependency that is to be deleted. 2. explicit_type [OPTIONAL] [string] The type of dependency that is being deleted. This is strictly a performance optimization, to eliminate having to divine the type from the dependency string itself. From the following set: PARENT_CHILD STOP_AFTER START_AFTER SAME_NODE or NODECOLLOCATION SAME_SITE or SITECOLLOCATION, DIFFERENT_NODES or ANTICOLLOCATION 3. rg [OPTIONAL] [string] A specific resource group to target for dependency removal. If this value is specified, every dependency that involves the specified resource group will be removed. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_dependency { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_dependency.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset DEPENDENCIES=${1//\"/} # Required typeset explicit_type=${2//\"/} # Optional typeset rg=${3//\"/} # Optional [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset dependency= implicit_type= typeset -u type= #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined (( $? != RC_SUCCESS )) && rc=$RC_MISSING_DEPENDENCY #================================================================ : Assuming an object was specified, see if it is a known object #================================================================ if (( $rc == RC_UNKNOWN )); then if [[ $DEPENDENCIES == *([[:space:]]) && -z $rg ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif [[ -n $DEPENDENCIES && -n $rg ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 36 "\nERROR: conflicting options were provided,\n\ \"%1\$s\" versus \"%2\$s\".\n\n" "$DEPENDENCIES" RESOURCE_GROUP 1>&2 rc=$RC_INCORRECT_INPUT else typeset -u uctext=$DEPENDENCIES if [[ $uctext == "ALL" || -n $rg ]]; then DEPENDENCIES= typeset available CL=$LINENO KLIB_HACMP_list_dependencies available for (( i=0; i<${#available[*]}; i++ )); do dep="${available[$i]}" [[ $dep == *@(SERIAL|PARALLEL)* ]] && continue dep=${dep// /} DEPENDENCIES="$DEPENDENCIES $dep" done if [[ $DEPENDENCIES == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 322 "Warning: there are no resource group dependencies to delete.\n" rc=$RC_SUCCESS fi fi fi fi #============================================================== : Delete the dependency if no input errors have been detected #============================================================== if (( $rc == RC_UNKNOWN )); then for dependency in $DEPENDENCIES; do if [[ $dependency == *\(*\)* ]]; then implicit_type=${dependency##*\(} implicit_type=${implicit_type%%\)*} type=$implicit_type dependency=${dependency/\(*\)} fi if [[ -n $explicit_type ]]; then if [[ $explicit_type == *\(*\)* ]]; then explicit_type=${explicit_type##*\(} explicit_type=${explicit_type%%\)*} fi type=$explicit_type fi #================= : Validate input #================= if (( $rc == RC_UNKNOWN )); then if [[ -n $implicit_type && -n $explicit_type && \ $implicit_type != $explicit_type ]] then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 314 "\nERROR: the specified implicit dependency type, \"%1\$s\", does\n not match the specified explicit dependency type, \"%2\$s\".\n\n" "$implicit_type" "$explicit_type" 1>&2 rc=$RC_INCORRECT_INPUT fi fi if [[ -z $type ]]; then CL=$LINENO KLIB_HACMP_is_known_dependency "$dependency" : "DEPTYPE" gets set by KLIB_HACMP_is_known_dependency if [[ $DEPTYPE == *[[:space:]]* ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 315 "\nERROR: the specified dependency, \"%1\$s\", is ambiguous\n and could be referring to any of the following dependency types:\n %2\$s\n Please specify which dependency type you intended to delete by\n using the \"TYPE\" attribute.\n" "$dependency" "$DEPTYPE" 1>&2 rc=$RC_INCORRECT_INPUT else type=$DEPTYPE fi fi if [[ $type == @(ACQ|REL)* ]]; then typeset ERRMSG="\ ERROR: the specified dependency cannot be deleted: %1\$s It is a resource group processing order dependency (its type is \"%2\$s\"), so it can only be modified, not removed. If your intention was to remove a different dependency, of a different type, then you will need to specify the type using the \"TYPE\" option. This can happen when a dependency uses the same nodes as one of the resource group processing orders.\n " CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 352 "$ERRMSG" "$dependency" "$type" 1>&2 rc=$RC_INCORRECT_INPUT break fi CL=$LINENO KLIB_HACMP_is_known_dependency "$dependency" "$type" typeset -i is_known=$? if (( $is_known != RC_SUCCESS )); then if [[ -n $type ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 312 "\nERROR: no \"%1\$s\" dependencies involving \"%2\$s\"\n could be found.\n\n" "$type" "$dependency" 1>&2 else /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 313 "\nERROR: no dependencies involving \"%1\$s\" could be found.\n\n" "$dependency" 1>&2 fi /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 142 "Available Dependencies:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_dependencies available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND else #========================================================= : If a specified resource group was provide, only delete : the dependency if it contains that resource group. #========================================================= if [[ -n $rg ]]; then typeset split=${dependency//\+/ } split=${split//,/ } [[ " $split " != *\ $rg\ * ]] && continue fi case $type in "PARENT_CHILD") current_parent=${dependency%%\+*} current_parent=${current_parent//,/ } current_children=${dependency##*\+} current_children=${current_children//,/ } for child in $current_children; do print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrgdependency -t \"$type\" -d -p \"$current_parent\" -c \"$child\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrgdependency -t "$type" -d \ -p "$current_parent" \ -c "$child" (( $rc == RC_UNKNOWN || $rc == RC_SUCCESS )) && rc=$? done ;; "STOP_AFTER") current_after=${dependency%%\+*} current_after=${current_after//,/ } current_stop=${dependency##*\+} current_stop=${current_stop//,/ } for child in $current_stop; do print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrgdependency -t \"$type\" -d -c \"$current_after\" -p \"$child\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrgdependency -t "$type" -d \ -c "$current_after" \ -p "$child" (( $rc == RC_UNKNOWN || $rc == RC_SUCCESS )) && rc=$? done ;; "START_AFTER") current_after=${dependency%%\+*} current_after=${current_after//,/ } current_start=${dependency##*\+} current_start=${current_start//,/ } for child in $current_start; do print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrgdependency -t \"$type\" -d -p \"$current_after\" -c \"$child\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrgdependency -t "$type" -d \ -p "$current_after" \ -c "$child" (( $rc == RC_UNKNOWN || $rc == RC_SUCCESS )) && rc=$? done ;; @(SAME_NODE|NODECOLLOCATION)) print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrgdependency -t \"NODECOLLOCATION\" -d -l\"${dependency//,/ }\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrgdependency -t "NODECOLLOCATION" -d \ -l"${dependency//,/ }" rc=$? ;; @(SAME_SITE|SITECOLLOCATION)) print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrgdependency -t \"SITECOLLOCATION\" -d -l\"${dependency//,/ }\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrgdependency -t "SITECOLLOCATION" -d \ -l"${dependency//,/ }" rc=$? ;; @(DIFFERENT_NODES|ANTICOLLOCATION)) # Only one of these print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrgdependency -t \"ANTICOLLOCATION\" -u -hp \"\" -ip \"\" -lp \"\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrgdependency -t "ANTICOLLOCATION" -u \ -hp "" \ -ip "" \ -lp "" rc=$? ;; *) rc=$RC_ERROR ;; esac print "clrgdependency RC: $rc" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS && $rc == RC_UNKNOWN )) && rc=$RC_ERROR fi done fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete dependency -h" "DEPENDENCY:" "$CLVT_PROGNAME" 1>&2 fi (( $rc == RC_UNKNOWN )) && rc=$RC_SUCCESS log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_dependency()" \ k1+Zb}bb&Z # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_efsn#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_efs.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)49 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_efs.sh, hacmp.assist, 61haes_r714 6/10/12 15:11:25 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_efs =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:30 Last Changed: 6/10/12 15:11:25 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_efs.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr delete efs =head1 DESCRIPTION Disables EFS in this cluster. =head1 ARGUMENTS None. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_efs { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_efs.sh, hacmp.assist, 61haes_r714 : INPUTS: $* [[ $CLMGR_LOGGING == "med" ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN #============== : Disable EFS #============== if (( $rc == RC_UNKNOWN )); then CL=$LINENO KLIB_HACMP_is_known_efs if (( $? != RC_SUCCESS )); then CL=$LINENO cl_dspmsg -s 129 cspoc.cat 75 "EFS Keystore is not configured.\n" 1>&2 rc=$RC_NOT_FOUND else print -- "$0()[$LINENO]($SECONDS): $HACSPOC/cl_delete_efs" >>$CLMGR_TMPLOG # Always log commands $HACSPOC/cl_delete_efs rc=$? if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 41 "\nERROR: failed to disable %1\$s.\n\n" EFS 1>&2 fi fi (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete efs -h" "EFS:" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_efs()"  kJ1+b}bb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_eventencyil#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_event.sh 1.5 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2012,2013 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_event =head1 VERSION Version Number: 1.5 Last Extracted: 1/31/14 04:42:01 Last Changed: 4/29/13 13:18:08 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_event.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr delete event {[,,,...] | ALL} =head1 DESCRIPTION Deletes one or more custom cluster events from the local system. =head1 ARGUMENTS 1. events [REQUIRED] [string] One or more (comma or space separated) event devices to attempt to delete. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_event { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.5, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_event.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset events=${1//\"/} events=${events//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset event= #================= : Validate input #================= if [[ -z $events ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset -u uctext=$events if [[ $uctext == "ALL" ]]; then events= typeset available CL=$LINENO KLIB_HACMP_list_events available for (( i=0; i<${#available[*]}; i++ )); do events="$events ${available[$i]}" done if [[ $events == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 334 "Warning: there are no events to delete.\n" rc=$RC_SUCCESS fi fi fi #======================================================== : Delete the event if no input errors have been detected #======================================================== if (( $rc == RC_UNKNOWN )); then for event in $events; do CL=$LINENO KLIB_HACMP_is_known_event "$event" if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$event" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 170 "Available Events:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_events available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done rc=$RC_NOT_FOUND else print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrmcustom -t event -n \"$event\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrmcustom -t event -n "$event" rc=$? print -- "$0()[$LINENO]($SECONDS): clrmcustom RC: $rc" >>$CLMGR_TMPLOG if (( $rc == RC_SUCCESS )); then typeset predef CL=$LINENO KLIB_HACMP_list_events predef TYPE=PREDEFINED for (( i=0; i<${#predef[*]}; i++ )); do typeset -A eProps CL=$LINENO KLIB_HACMP_get_event_attributes "${predef[$i]}" eProps TYPE=PREDEFINED for key in PRE_EVENT_COMMAND POST_EVENT_COMMAND; do if [[ " ${eProps[$key]//,/ } " == *\ $event\ * ]] then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 9999 '*** Removing "%1$s" from "%2$s" in event "%3$s".\n' "$event" "$key" "${eProps[NAME]}" typeset NEW_EVENTS=" ${eProps[$key]//,/ } " NEW_EVENTS=$(CL=$LINENO trim ${NEW_EVENTS/ $event / }) NEW_EVENTS=${NEW_EVENTS// /,} case $key in PRE_EVENT_COMMAND) $HAUTILS/clmgr -T $CLMGR_TRANSACTION_ID modify event "${predef[$i]}" PRE_EVENT_COMMAND="$NEW_EVENTS" ;; POST_EVENT_COMMAND) $HAUTILS/clmgr -T $CLMGR_TRANSACTION_ID modify event "${predef[$i]}" POST_EVENT_COMMAND="$NEW_EVENTS" ;; esac cmd_rc=$? if (( $rc == RC_SUCCESS && $cmd_rc != RC_SUCCESS )); then rc=$cmd_rc /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 9999 '\nERROR: failed to remove "%1$s" from "%2$s" in event "%3$s".\n\n' "$event" "$key" "${eProps[NAME]}" 1>&2 fi fi done unset eProps done else rc=$RC_ERROR /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$event" 1>&2 break fi fi done (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete event -h" "EVENT:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_event()" _SUC k궕1+b}bb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_fallback_timeroupkG#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_fallback_timer.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_fallback_timer.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_fallback_timer =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:03 Last Changed: 6/10/12 15:11:26 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_fallback_timer.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr delete fallback_timer {[,,,...] ] | ALL} =head1 DESCRIPTION Deletes one or more fallback timers from the cluster configuration. =head1 ARGUMENTS 1. timers [REQUIRED] [string] One or more (comma or space separated) fallback timers to attempt to delete. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_fallback_timer { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_fallback_timer.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset timers=${1//\"/} timers=${timers//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset timer= #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= elif [[ -z $timers ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset -u uctext=$timers if [[ $uctext == "ALL" ]]; then timers= typeset available CL=$LINENO KLIB_HACMP_list_fallback_timers available for (( i=0; i<${#available[*]}; i++ )); do timers="$timers ${available[$i]}" done if [[ $timers == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 323 "Warning: there are no fallback timers to delete.\n" rc=$RC_SUCCESS fi fi fi #================================================================== : Delete the fallback timer if no input errors have been detected #================================================================== if (( $rc == RC_UNKNOWN )); then for timer in $timers; do CL=$LINENO KLIB_HACMP_is_known_fallback_timer "$timer" if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$timer" 1>&2 /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 143 "Available Fallback Timers:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_fallback_timers available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done rc=$RC_NOT_FOUND else print -- "$0()[$LINENO]($SECONDS): $HAUTILS/cltimerpolicy -a remove -n $timer" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/cltimerpolicy -a remove -n $timer rc=$? print "cltimerpolicy RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$timer" 1>&2 break fi fi done (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete fallback_timer -h" "FALLBACK TIMER:" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_fallback_timer()"  k(u1+=b}bb&= # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_file_systeme#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2018,2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r721 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_file_system.sh 1.6 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2012,2016 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_file_system.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_file_system =head1 SYNOPSIS clmgr delete file_system {[,,...] | ALL} \ [ REMOVE_MOUNT_POINT={false|true} ] =head1 DESCRIPTION Deletes one or more file systems from the cluster. =head1 ARGUMENTS 1. file_systems [REQUIRED] [string] One or more (comma or space separated) file systems to attempt to delete. 2. rm_mount_point {OPTIONAL] [boolean] Indicates if the mount point should be removed, too. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_file_system { . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_file_system.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset file_systems=${1//\"/} file_systems=${file_systems//,/ } typeset -l rm_mount_point=${2//\"/} typeset non_existent_fs="" [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset file_system= #================= : Validate input #================= if [[ -z $file_systems ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset -u uctext=$file_systems if [[ $uctext == "ALL" ]]; then file_systems= typeset available CL=$LINENO KLIB_HACMP_list_file_systems available for (( i=0; i<${#available[*]}; i++ )); do file_systems="$file_systems ${available[$i]}" done if [[ $file_systems == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 342 "Warning: there are no file systems to delete.\n" rc=$RC_SUCCESS fi fi fi #================================================================ : Delete the file systems if no input errors have been detected #================================================================ if (( $rc == RC_UNKNOWN )); then for file_system in $file_systems; do CL=$LINENO KLIB_HACMP_is_known_file_system "$file_system" if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$file_system" 1>&2 non_existent_fs="true" else typeset rOpt="" [[ $rm_mount_point == @(y|t)* ]] && rOpt=" -r" typeset nodes="" typeset -A fsAttrs CL=$LINENO KLIB_HACMP_get_file_system_attributes "$file_system" fsAtrs nodes=${fsAttrs[NODES]} print -- "$0()[$LINENO]($SECONDS): _CSPOC_CALLED_FROM_SMIT=true _CSPOC_MODE=both $HASBIN/cl_rmfs -cspoc "-n $nodes"$rOpt \"$file_system\"" >>$CLMGR_TMPLOG # Always log commands _CSPOC_CALLED_FROM_SMIT=true _CSPOC_MODE=both $HASBIN/cl_rmfs -cspoc "-n $nodes"$rOpt "$file_system" rc=$? if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$file_system" 1>&2 break fi fi done (( $rc != RC_SUCCESS )) && print -u2 fi if [[ $non_existent_fs == "true" ]]; then printf "\n" #A new line to make console output more structured and spacious. /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 145 "Available File Systems:\n\n" typeset available CL=$LINENO KLIB_HACMP_list_file_systems available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u1 "\t${available[$i]}" fi done rc=$RC_NOT_FOUND fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete file_system -h" "FILE SYSTEM:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_file_system()" /\" k1+]b}bb&] # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_filecollectionoupkG#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_filecollection.sh 1.3 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)74 1.3 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_filecollection.sh, hacmp.assist, 61haes_r714 6/10/12 15:11:27 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_filecollection =head1 VERSION Version Number: 1.3 Last Extracted: 1/31/14 04:40:58 Last Changed: 6/10/12 15:11:27 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_filecollection.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr delete file_collection {[,,,...] | ALL} =head1 DESCRIPTION Deletes one or more file collections from the cluster configuration. =head1 ARGUMENTS 1. fcnames [REQUIRED] [string] One or more (comma or space separated) file collections to attempt to delete. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_filecollection { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_filecollection.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset fcnames=${1//\"/} fcnames=${fcnames//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset fcname= #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= elif [[ -z $fcnames ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset -u uctext=$fcnames if [[ $uctext == "ALL" ]]; then fcnames= typeset available CL=$LINENO KLIB_HACMP_list_filecollection available for (( i=0; i<${#available[*]}; i++ )); do [[ ${available[$i]} == @(Configuration_Files|HACMP_Files) ]] && continue fcnames="$fcnames ${available[$i]}" done if [[ $fcnames == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 324 "Warning: there are no file collections to delete.\n" rc=$RC_SUCCESS fi fi fi #=================================================================== : Delete the file collection if no input errors have been detected #=================================================================== if (( $rc == RC_UNKNOWN )); then for fcname in $fcnames; do CL=$LINENO KLIB_HACMP_is_known_filecollection "$fcname" if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$fcname" 1>&2 /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 144 "Available File Collections:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_filecollection available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done rc=$RC_NOT_FOUND else print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clfilecollection -o coll -r \"$fcname\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clfilecollection -o coll -r "$fcname" rc=$? print "clfilecollection RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$fcname" 1>&2 break fi fi done (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete file_collection -h" "FILE COLLECTION:" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_filecollection()" .as kꮜ1+,b}bb&, # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_groupllectio#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_group.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)06 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_group.sh, hacmp.assist, 61haes_r714 6/10/12 15:11:27 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_group =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:57 Last Changed: 6/10/12 15:11:27 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_group.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr delete group \ [ RESOURCE_GROUP= ] \ [ REGSITRY={files|LDAP} ] =head1 DESCRIPTION Deletes one or more AIX groups from either all the cluster nodes, or from those nodes that the specified resource group can run on. =head1 ARGUMENTS 1. groups [REQUIRED] [string] One or more (comma or space separated) groups to attempt to delete. 2. rg [OPTIONAL] [string] A resource group label that, if provided, will be used to limit which nodes the groups will be removed from. 3. registry [OPTIONAL] [set] Specifies which registry to remove the user from, FILES or LDAP. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_group { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_group.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset groups=${1//\"/} groups=${groups//,/ } typeset rg=${2//\"/} typeset registry=${3//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset group= #================= : Validate input #================= if [[ -z $groups ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT fi if [[ $rg != *([[:space:]]) ]]; then CL=$LINENO KLIB_HACMP_is_known_rg $rg if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$rg" 1>&2 /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 154 "Available Resource Groups:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_resourcegroups available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND fi fi if [[ $registry != *([[:space:]]) ]]; then typeset -u registryUC=$registry case $registryUC in LD*) registry=LDAP ;; LO*) registry=files ;; F*) registry=files ;; *) /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 110 '\nERROR: invalid value specified for "%1$s": "%2$s".\n' REGISTRY "$registry" 1>&2 rc=$RC_INCORRECT_INPUT ;; esac fi #======================================================== : Delete the group if no input errors have been detected #======================================================== if (( $rc == RC_UNKNOWN )); then for group in $groups; do CL=$LINENO KLIB_HACMP_is_known_group "$group" if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$group" 1>&2 /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 161 "Available Groups:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_groups available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done rc=$RC_NOT_FOUND else typeset rgOpt= [[ $rg != *([[:space:]]) ]] && rgOpt=" -cspoc-g $rg" typeset -u source= if [[ $registry == *([[:space:]]) ]]; then source=$(/usr/sbin/lsgroup -R LDAP -a registry $group 2>>$CLMGR_TMPLOG) source=${source##*=} [[ -n $source ]] && registry=$source source=$(/usr/sbin/lsgroup -R files -a registry $group 2>>$CLMGR_TMPLOG) source=${source##*=} if [[ -n $source ]]; then [[ -n $registry ]] && registry="$registry " registry="$registry$source" fi fi typeset -i cmd_rc=$RC_UNKNOWN for source in $registry; do if [[ $source == "LDAP" ]]; then print -- "$0()[$LINENO]($SECONDS): mode=LDAP $HACSPOC/fix_args nop cl_rmgroup$rgOpt \"$group\"" >>$CLMGR_TMPLOG # Always log commands mode=LDAP $HACSPOC/fix_args nop cl_rmgroup$rgOpt "$group" else print -- "$0()[$LINENO]($SECONDS): $HACSPOC/fix_args nop cl_rmgroup$rgOpt \"$group\"" >>$CLMGR_TMPLOG # Always log commands $HACSPOC/fix_args nop cl_rmgroup$rgOpt "$group" fi cmd_rc=$? print -- "$0()[$LINENO]($SECONDS): cl_rmgroup RC: $cmd_rc" >>$CLMGR_TMPLOG if (( $cmd_rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$group" 1>&2 break else (( $rc != $RC_ERROR )) && rc=$cmd_rc fi done fi done (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete group -h" "GROUP:" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_group()" in  l 1+{4b}bb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_hmcp = est"$CEMS_acdhilmnor#-:ADGHILNOPRT\fpu()./012;>FU[]bgvy&,w!+346789o dz/}Vgno=:#T B`hXh`OmY(-`2e :+,l,Mj\XjqcilY`2mmmmmm1f5%7Pth16h: ŝbk ?9)mmmmmmImZs.uȻ5΄Q#y9a0@DM 08sƯ$Tzigy5|hb8 LEG|ǘ fn7$TziWO;b/`˜S[o BfTziBP!]V"gYqxB (LXC"yܩ" C@e9 ƒ084 QiOE((0  dv.qZQe"-C3+FAM( I, ee8&*Hz)UV\\&L6V]Á+JMJ` ehWfee8Bf*XԄ5pUeP $!ǔ( fA%0Le.8f9Fz4蔨&U"<09RCL)ˋXYfXQT,;h @6q`v C@e8A ,,M(DhL;ɛ{$<؋qA;&Sږ%BXe剉sf.UAQIE!mŹF9Fy$R|?ͼˋ;ˋ;aRPTIE2%A'^./xS tmx8>0J)sf.rBh"Q2&Q#:LSP`XnyR0`٣a$h-קpVA60Ӧ?=\\0<$q eDȘUD"Q2&MB*`P`^xemaFM4OaFQ6q%* Hl(LTS.mJjYn068> ,,M(D *@@vh$% ,,M(DhLK@q!!8&&sf.;xzLL\b0Fp}KEUQE%aCrBh"Q2&Q#:LSPiԌ,`vmfߋ G1 !#GD$Ӧ?=\\0<G%(emmmm-86U#,hLBgCemmmm9FyRQR Ms @2,&"Xkܙqs>4q|k"Q2&2r{`Յ8JKIEK*I4jܙqs>4q|k}z;t $8׏DdL*e2  m]wqgX?.r2HEKnaTEP ;1v$*Tb m;I4TTKH;ammmmvǔV}vso?{./-|َD6;qhylmO1q|R-:+0mmmmmF!-IaJ ]\_]mmm3{ 768%ڜ?[mmm ӳƍ]&kg"Q2&2r{`Յ8J9Fz̤Tzi)a3)JTmID?^;UPERQL ;1vPM-t&e"I@퇡1sg xzLL\b>35aym+,ߌ8yhXAU KiIPF!-IaT&e, &&͘HEJ("\)Th8@DR $P I4U, ̥mC?>ӳƍ]S4悄̤TzicIf@DR $P"Q2&2r{`Յ8J붻"jqƜPM,i,Ke" M}gk+&i Hƒr̤ARIר>x~%"aS)(XǶ X^[o :dux8>%"(aً}zUH!Ď9!\l( J&D©EL 4F 0;6MŎooDž͘AIiN..~ ڄ?[mmm؉rCL..qgr-mmmvxѹ PTAD,Tۊ䇢v\\ϬmeDdL*e2 mmmmvF3:v{6./%[jSmmmmb#(b&:emJviF8+]ƛ؉5Yqy*RHz)e,DȘTe#1Vº8α(knjU::Â5iXsU)䇢v\\ϬD?^;%"(aً}zUH!Ď9!\l( J&D©EL 4F 0;6MŎooDž͘AIiN..~ [a1sgHTBJThBjo?knjN1knjU0퇡ѼHKAXsUKˋbaً*"2$QR3P A!% I4TT5 P*"2$QR31knj6?yemmmm~MJ{6./%[jSHTBJThBjmmmml?>ӳƍ8i\S.ˋYMXsU) A!% I4TT5 "Q2&2r{`Յ8oG[?>ӳ$=˲}gAXsU) A!% I4TT5 }]5S.ˋYo}|UPERQL ;1vHA0DdL*TмN`ck4X\xZ<َhi ?$9s$=˲}gM:iea}zUH!\eI=P@yJ:Â5iXsU)䇢v\\ϬD!$%$*"2$QR3^( "F 1mCP6?yP?[mmmmmmmmmfN;>/5ilFq^q`}f'[8l|SiemmmmmmmmmFp}"dPR**\D>TTK0&U&T #PD eR"$p$$:G^#110lRPTmV$q e@@ʪ$gASP`X ?MMxiɴuB`LsN=CL(R* !#GVnq}զдAFؾH~iqgs [+ G]vSY3ig(t"dEmW?yGdPN8*V}vZtW6i$hyq8s 4OC"gƲ~y$~z \b%G`x,6ڄ?xUW3A@, *RqNo<(LTS.n38A kZ1+#b}bb&# # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_interfacetio#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2020,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_interface.sh 1.3 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_interface.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_interface =head1 SYNOPSIS clmgr delete interface {[,,,...] | ALL} =head1 DESCRIPTION Deletes one or more interfaces from the cluster configuration. =head1 ARGUMENTS 1. interfaces [REQUIRED] [string] One or more (comma or space separated) interfaces to attempt to delete. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_interface { . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_interface.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset interfaces=${1//\"/} interfaces=${interfaces//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset interface= #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= elif [[ -z $interfaces ]]; then dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset -u uctext=$interfaces if [[ $uctext == "ALL" ]]; then interfaces= typeset available CL=$LINENO KLIB_HACMP_list_interfaces available for (( i=0; i<${#available[*]}; i++ )); do interfaces="$interfaces ${available[$i]}" done if [[ $interfaces == *([[:space:]]) ]]; then dspmsg -s $CLVT_SET $CLVT_MSGS 325 "Warning: there are no interfaces to delete.\n" rc=$RC_SUCCESS fi fi fi #============================================================= : Delete the interface if no input errors have been detected #============================================================= if (( $rc == RC_UNKNOWN )); then for interface in $interfaces; do #================================================================== : If the interface is in IP address format, convert to its label. : clrmnode will not accept an interface in address format. ~sigh~ #================================================================== if [[ $interface == *@(\.|:)* ]]; then interface=$(/usr/bin/odmget -q identifier=$interface HACMPadapter | /usr/bin/grep -w ip_label) interface=${interface#*\"} interface=${interface%\"} fi CL=$LINENO KLIB_HACMP_is_known_interface "$interface" if (( $? != RC_SUCCESS )); then dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$interface" 1>&2 dspmsg -s $CLVT_SET $CLVT_MSGS 146 "Available Interfaces:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_interfaces available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done rc=$RC_NOT_FOUND else print -- "$0()[$LINENO]($SECONDS): clodmget \"$interface\"" >>$CLMGR_TMPLOG # Always log commands clodmget -q "ip_label=$interface" -nf network,nodename,function,interfacename -d' ' HACMPadapter 2>/dev/null| read network node function intrface #======================================================================= # If a network holding a service IP with only one network interface # then exiting with error message. #======================================================================== service_function=$(cllsif -pcS | grep -w "service:$network" | wc -l | sed 's/ //g') if (( $service_function != 0 )); then boot_function_value=$(cllsif -pcS | grep -w "$function:$network" | wc -l | sed 's/ //g') if (( $boot_function_value == 1 )); then rc=$RC_ERROR dspmsg -s $CLVT_SET $CLVT_MSGS 1461 "\nERROR: Modifying or removing last network interface '%1\$s' not allowed\n\ as the network '%2\$s' holds a service IP.\n\ You can remove the service IP from the network, then try the operation again.\n" $interface $network fi fi if [[ -n $function && $function == "boot" ]]; then print -- "$0()[$LINENO]($SECONDS): cllsif" >>$CLMGR_TMPLOG # Always log commands persistent=$(cllsif -J "~" -Spi $node | egrep -w "persistent.*$network" | awk -F"~" '{print $7}') if [[ -n $persistent ]]; then print -- "$0()[$LINENO]($SECONDS): cl_rsh -n $node netstat -in" >>$CLMGR_TMPLOG # Always log commands pintrface=$(cl_rsh -n $node netstat -in | grep -w $persistent | awk '{print $1}') if [[ -n $pintrface && $pintrface == $intrface ]]; then dspmsg -s $CLVT_SET $CLVT_MSGS 1423 "\nManually remove aliased persistent IP:%1\$s on interface:%2\$s on node:%3\$s before removing the interface.\n" $persistent $intrface $node 1>&2 rc=$RC_ERROR fi fi fi if (( $rc == RC_UNKNOWN || $rc == RC_SUCCESS )); then print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrmnode -a \"$interface\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrmnode -a "$interface" rc=$? if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR dspmsg -s $CLVT_SET $CLVT_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$interface" 1>&2 break fi fi fi done (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete interface -h" "INTERFACE:" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_interface()"  kr1+ b}bb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_ldap_cliento#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_ldap_client.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)04 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_ldap_client.sh, hacmp.assist, 61haes_r714 6/10/12 15:11:29 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_ldap_client =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:47 Last Changed: 6/10/12 15:11:29 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_ldap_client.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr delete ldap_client =head1 DESCRIPTION Deletes all the currently defined LDAP clients from the cluster. =head1 ARGUMENTS None. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_ldap_client { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_ldap_client.sh, hacmp.assist, 61haes_r714 : INPUTS: $* [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN i=0 #========================== : Delete the LDAP clients #========================== if (( $rc == RC_UNKNOWN )); then print -- "$0()[$LINENO]($SECONDS): $HACSPOC/cl_ldap_client_del" >>$CLMGR_TMPLOG # Always log commands $HACSPOC/cl_ldap_client_del rc=$? print -- "$0()[$LINENO]($SECONDS): cl_ldap_client_del RC: $rc" >>$CLMGR_TMPLOG # Always log commands if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_ldap_client()"  k1+ b}bb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_ldap_servero#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_ldap_server.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)53 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_ldap_server.sh, hacmp.assist, 61haes_r714 6/10/12 15:11:30 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_ldap_server =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:04 Last Changed: 6/10/12 15:11:30 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_ldap_server.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr delete ldap_server =head1 DESCRIPTION Deletes all the currently defined LDAP servers from the cluster. =head1 ARGUMENTS None. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_ldap_server { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_ldap_server.sh, hacmp.assist, 61haes_r714 : INPUTS: $* [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN i=0 #========================== : Delete the LDAP servers #========================== if (( $rc == RC_UNKNOWN )); then print -- "$0()[$LINENO]($SECONDS): $HACSPOC/cl_ldap_server_del" >>$CLMGR_TMPLOG # Always log commands $HACSPOC/cl_ldap_server_del rc=$? print -- "$0()[$LINENO]($SECONDS): cl_ldap_server_del RC: $rc" >>$CLMGR_TMPLOG # Always log commands if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_ldap_server()"  ks1+6b~bb&6 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_logical_volumeoupkG#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_logical_volume.sh 1.1 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 2fc42d2 43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_logical_volume.sh, 726, 2147A_aha726, Jul 14 2021 11:53 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_logical_volume =head1 VERSION Version Number: 1.1 Last Extracted: 1/31/14 04:42:06 Last Changed: 7/3/12 11:06:08 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_logical_volume.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr delete logical_volume {[,,...] | ALL} =head1 DESCRIPTION Deletes one or more logical volumes from the cluster. =head1 ARGUMENTS 1. logical_volumes [REQUIRED] [string] One or more (comma or space separated) logical volumes to attempt to delete. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_logical_volume { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 2fc42d2 43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_logical_volume.sh, 726, 2147A_aha726, Jul 14 2021 11:53 PM : INPUTS: $* typeset logical_volumes=${1//\"/} logical_volumes=${logical_volumes//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset logical_volume= #================= : Validate input #================= if [[ -z $logical_volumes ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset -u uctext=$logical_volumes if [[ $uctext == "ALL" ]]; then logical_volumes= typeset available CL=$LINENO KLIB_HACMP_list_logical_volumes available for (( i=0; i<${#available[*]}; i++ )); do logical_volumes="$logical_volumes ${available[$i]}" done if [[ $logical_volumes == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 341 "Warning: there are no logical volumes to delete.\n" rc=$RC_SUCCESS fi fi fi #=================================================================== : Delete the logical volumes if no input errors have been detected #=================================================================== if (( $rc == RC_UNKNOWN )); then for logical_volume in $logical_volumes; do CL=$LINENO KLIB_HACMP_is_known_logical_volume "$logical_volume" if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$logical_volume" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 148 "Available Logical Volumes:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_logical_volumes available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done rc=$RC_NOT_FOUND else # Check if the lv has authentication methods, if so then remove authentication methods before removing lv typeset -A lvProps CL=$LINENO KLIB_HACMP_get_logical_volume_attributes $logical_volume lvProps isLV_encrypted=${lvProps[ENCRYPTION]} vg_name=${lvProps[VOLUME_GROUP]} if [[ $isLV_encrypted == "yes" ]];then print "$0()[$LINENO]($SECONDS): cl_enable_encryption -l $logical_volume -v $vg_name -r all" >>$CLMGR_TMPLOG cl_enable_encryption -l $logical_volume -v $vg_name -r all rc1=$? print "$0()[$LINENO]($SECONDS): cl_enable_encryption -l $logical_volume -v $vg_name -r all RC:$rc1" >>$CLMGR_TMPLOG if (( $rc1 != RC_SUCCESS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 1487 "\nWARNING: Failed to remove authentication method name(s).\n" 1>&2 fi fi print -- "$0()[$LINENO]($SECONDS): _CSPOC_CALLED_FROM_SMIT=true _CSPOC_MODE=both $HASBIN/cl_rmlv \"$logical_volume\"" >>$CLMGR_TMPLOG # Always log commands _CSPOC_CALLED_FROM_SMIT=true _CSPOC_MODE=both $HASBIN/cl_rmlv "$logical_volume" rc=$? if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR dspmsg -s $CLMGR_SET $CLMGR_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$logical_volume" 1>&2 break fi fi done (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete logical_volume -h" "LOGICAL VOLUME:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_logical_volume()"  k1+b}bb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_method_volum#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_method.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2009,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)70 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_method.sh, hacmp.assist, 61haes_r714 6/10/12 15:11:31 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_method =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:45 Last Changed: 6/10/12 15:11:31 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_method.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr delete method {[,,] | ALL} \ [ TYPE={notify|snapshot|verify} ] =head1 DESCRIPTION Deletes one or more custom methods from the cluster configuration. =head1 ARGUMENTS 1. methods [REQUIRED] [string] One or more (comma or space separated) methods to attempt to delete. 2. type [OPTIONAL] [string] The type of method(s) to be deleted. Valid values: {notify|snapshot|verify} =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_method { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_method.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset methods=${1//\"/} methods=${methods//,/ } typeset -l type=${2//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset method= typeset -i delete_all=0 #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= elif [[ -z $methods ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif [[ -n $type && $type != @(sn|ve|no)* ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\"\n\n" TYPE "$type" 1>&2 /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 3 "Valid values: %1\$s\n\n" "notify, snapshot, verify" 1>&2 rc=$RC_INCORRECT_INPUT else typeset -u uctext=$methods if [[ $uctext == "ALL" ]]; then delete_all=1 methods= typeset available CL=$LINENO KLIB_HACMP_list_methods available for (( i=0; i<${#available[*]}; i++ )); do methods="$methods ${available[$i]}" done if [[ $methods == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 326 "Warning: there are no methods to delete.\n" rc=$RC_SUCCESS fi fi fi #========================================================== : Delete the method if no input errors have been detected #========================================================== if (( $rc == RC_UNKNOWN )); then for method in $methods; do if [[ -n $type ]] && (( ! delete_all )); then CL=$LINENO KLIB_HACMP_is_known_method "$method" else (( delete_all )) && type= CL=$LINENO KLIB_HACMP_is_known_method "$method" type fi if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$method" 1>&2 /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 149 "Available Methods:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_methods available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done rc=$RC_NOT_FOUND elif [[ $type == *,* ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 34 "\nERROR: \"%1\$s\", is ambiguous, and could match any of the following:\n %2\$s\n\n" "$method" "$type" 1>&2 rc=$RC_INCORRECT_INPUT else typeset cmd="clrmcustom" if [[ $type == sn* ]]; then print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrmcustom -t snapshot -n \"$method\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrmcustom -t snapshot -n "$method" elif [[ $type == ve* ]]; then print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrmcustom -t verify -n \"$method\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrmcustom -t verify -n "$method" elif [[ $type == no* ]]; then cmd="clrmpgr" print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrmpgr -m \"$method\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrmpgr -m "$method" fi rc=$? print " RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$method" 1>&2 break fi fi done (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete method -h" "METHOD:" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_method()" T_INPUT k6-1+b}bb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_mirror_group#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_mirror_group.sh 1.5 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)05 1.5 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_mirror_group.sh, hacmp.assist, 61haes_r714 1/18/13 12:51:14 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_mirror_group =head1 VERSION Version Number: 1.5 Last Extracted: 1/31/14 04:41:57 Last Changed: 1/18/13 12:51:14 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_mirror_group.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr delete mirror_group {[,,...] | ALL} =head1 DESCRIPTION Deletes one or more mirror groups from the local system. =head1 ARGUMENTS 1. mirror_groups [REQUIRED] [string] One or more (comma or space separated) mirror groups to attempt to delete. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_mirror_group { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.5, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_mirror_group.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset mirror_groups=${1//\"/} mirror_groups=${mirror_groups//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values CL=$LINENO isEnterprise if (( $? != 1 )); then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 184 "\nERROR: this operation requires IBM PowerHA SystemMirror for AIX Enterprise Edition.\n\n" 1>&2 log_return_msg $RC_MISSING_DEPENDENCY $0 $LINENO return $? fi #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN cmd_rc=$RC_UNKNOWN typeset -i i=0 typeset mirror_group= #================= : Validate input #================= if [[ -z $mirror_groups ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset -u uctext=$mirror_groups if [[ $uctext == "ALL" ]]; then mirror_groups= typeset available CL=$LINENO KLIB_HACMP_list_mirror_groups available for (( i=0; i<${#available[*]}; i++ )); do mirror_groups="$mirror_groups ${available[$i]}" done if [[ $mirror_groups == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 336 "Warning: there are no mirror groups to delete.\n" rc=$RC_SUCCESS fi fi fi #=============================================================== : Delete the object group if no input errors have been detected #=============================================================== if (( $rc == RC_UNKNOWN )); then for mirror_group in $mirror_groups; do typeset TYPE="" CL=$LINENO KLIB_HACMP_is_known_mirror_group "$mirror_group" TYPE if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$mirror_group" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 167 "Available Mirror Group:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_mirror_groups available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done rc=$RC_NOT_FOUND else #======================================= : Detect any resource group membership #======================================= typeset -A mgProps CL=$LINENO KLIB_HACMP_get_mirror_group_attributes "$mirror_group" mgProps if [[ ${mgProps[RESOURCE_GROUP]} == *([[:space:]]) ]]; then print -- "$0()[$LINENO]($SECONDS): $HAXDWIZ/clxd_remove_mg_director -n \"$mirror_group\" -s \"$TYPE\"" >>$CLMGR_TMPLOG # Always log commands $HAXDWIZ/clxd_remove_mg_director -n "$mirror_group" -s "$TYPE" cmd_rc=$? print -- "$0()[$LINENO]($SECONDS): clxd_remove_mg_director RC: $rc" >>$CLMGR_TMPLOG # Always log commands if (( $cmd_rc != RC_SUCCESS )); then (( rc <= RC_SUCCESS )) && rc=$RC_ERROR /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$mirror_group" 1>&2 fi else (( rc <= RC_SUCCESS )) && rc=$RC_ERROR CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 9999 '\nERROR: "%1$s" is currently a member of resource group "%2$s". Therefore "%1$s" cannot be deleted.\n\n' "$mirror_group" "${mgProps[RESOURCE_GROUP]}" 1>&2 fi fi done (( $rc == RC_UNKNOWN )) && rc=$RC_SUCCESS # No errors detected (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete mirror_group -h" "MIRROR GROUP:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_mirror_group()" be kS1+7b}bb&7 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_mirror_pair#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_mirror_pair.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)85 1.3 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_mirror_pair.sh, hacmp.assist, 61haes_r714 8/15/12 08:58:26 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_mirror_pair =head1 VERSION Version Number: 1.3 Last Extracted: 1/31/14 04:41:06 Last Changed: 8/15/12 08:58:26 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_mirror_pair.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr delete mirror_pair {[,,...] | ALL} =head1 DESCRIPTION Deletes one or more mirror pairs from the local system. =head1 ARGUMENTS 1. mirror_pairs [REQUIRED] [string] One or more (comma or space separated) mirror pairs to attempt to delete. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_mirror_pair { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_mirror_pair.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset mirror_pairs=${1//\"/} mirror_pairs=${mirror_pairs//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values CL=$LINENO isEnterprise if (( $? != 1 )); then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 184 "\nERROR: this operation requires IBM PowerHA SystemMirror for AIX Enterprise Edition.\n\n" 1>&2 log_return_msg $RC_MISSING_DEPENDENCY $0 $LINENO return $? fi #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset mirror_pair= #================= : Validate input #================= if [[ -z $mirror_pairs ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset -u uctext=$mirror_pairs if [[ $uctext == "ALL" ]]; then mirror_pairs= typeset available CL=$LINENO KLIB_HACMP_list_mirror_pairs available for (( i=0; i<${#available[*]}; i++ )); do mirror_pairs="$mirror_pairs ${available[$i]}" done if [[ $mirror_pairs == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 337 "Warning: there are no mirror pairs to delete.\n" rc=$RC_SUCCESS fi fi fi #=============================================================== : Delete the object pair if no input errors have been detected #=============================================================== if (( $rc == RC_UNKNOWN )); then for mirror_pair in $mirror_pairs; do typeset TYPE="" CL=$LINENO KLIB_HACMP_is_known_mirror_pair "$mirror_pair" TYPE if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$mirror_pair" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 166 "Available Mirror Pairs:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_mirror_pairs available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done rc=$RC_NOT_FOUND else print -- "$0()[$LINENO]($SECONDS): $HAXDWIZ/clxd_remove_mdp_director -n \"$mirror_pair\" -s \"$TYPE\"" >>$CLMGR_TMPLOG # Always log commands $HAXDWIZ/clxd_remove_mdp_director -n "$mirror_pair" -s "$TYPE" rc=$? print -- "$0()[$LINENO]($SECONDS): clxd_remove_mdp_director RC: $rc" >>$CLMGR_TMPLOG # Always log commands if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$mirror_pair" 1>&2 break fi fi done (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete mirror_pair -h" "MIRROR PAIR:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_mirror_pair()"  kF1+8b}bb&8 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_mirror_pool#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_mirror_pool.sh 1.3 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_mirror_pool.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #============================================================================ # # Name: KLIB_HACMP_delete_mirror_pool # # Description: This is the main, FPATH function that is invoked by clmgr # to remove mirror pools from the cluster configuration. # # Inputs: See the "devDoc()" function, below. # # Outputs: Any error messages that might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function, below, for the standard return # code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_delete_mirror_pool { . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_mirror_pool.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset MIRROR_POOLS=${1//\"/} MIRROR_POOLS=${MIRROR_POOLS//,/ } typeset VOLUME_GROUP=${2//\"/} typeset PHYSICAL_VOLUMES=${3//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset mirror_pool= VG= #================= : Validate input #================= if [[ -z $MIRROR_POOLS ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset -u uctext=$MIRROR_POOLS if [[ $uctext == "ALL" ]]; then MIRROR_POOLS= typeset available CL=$LINENO KLIB_HACMP_list_mirror_pools available for (( i=0; i<${#available[*]}; i++ )); do MIRROR_POOLS="$MIRROR_POOLS ${available[$i]/ /_}" done if [[ $MIRROR_POOLS == *([[:space:]]) ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 334 "Warning: there are no mirror pools to delete.\n" rc=$RC_SUCCESS fi fi fi if [[ -n $VOLUME_GROUP ]]; then CL=$LINENO KLIB_HACMP_is_known_volume_group "$VOLUME_GROUP" if (( $? != RC_SUCCESS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$VOLUME_GROUP" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 160 'Available Volume Groups:\n\n' 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_volume_groups available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND fi fi #=============================================================== : Delete the mirror pool if no input errors have been detected #=============================================================== if (( $rc == RC_UNKNOWN )); then for mirror_pool in $MIRROR_POOLS; do print -- "$mirror_pool" | IFS=\( read mirror_pool VG [[ -n $VG ]] && VOLUME_GROUP=$VG mirror_pool=${mirror_pool%_} VOLUME_GROUP=${VOLUME_GROUP%\)} CL=$LINENO KLIB_HACMP_is_known_mirror_pool "$mirror_pool" "$VOLUME_GROUP" >/dev/null if (( $? != RC_SUCCESS )); then if [[ -n $VOLUME_GROUP ]] then dspmsg -s $CLMGR_SET $CLMGR_MSGS 357 '\nERROR: "%1$s" does not appear to exist in volume group "%2$s"!\n\n' "$mirror_pool" "$VOLUME_GROUP" 1>&2 else dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$mirror_pool" 1>&2 fi dspmsg -s $CLMGR_SET $CLMGR_MSGS 173 "Available Mirror Pools:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_mirror_pools available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done rc=$RC_NOT_FOUND else typeset FOUND=$(CL=$LINENO KLIB_HACMP_is_known_mirror_pool "$mirror_pool" "$VOLUME_GROUP") typeset -i COUNT=0 print -- "$FOUND" |\ while read mirror_pool VOLUME_GROUP; do (( COUNT++ )) done if (( COUNT > 1 )); then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 277 "\nERROR: more than one object matches the provided information:\n\n" 1>&2 print -u2 "$FOUND" rc=$RC_INCORRECT_INPUT else print -- "$FOUND" | read mirror_pool VOLUME_GROUP VOLUME_GROUP=${VOLUME_GROUP#\(} VOLUME_GROUP=${VOLUME_GROUP%\)} fi fi if (( $rc == RC_UNKNOWN || $rc == RC_SUCCESS)); then if [[ -z $PHYSICAL_VOLUMES ]]; then typeset -A vgprops CL=$LINENO KLIB_HACMP_get_volume_group_attributes "$VOLUME_GROUP" vgprops print "$0()[$LINENO]($SECONDS): cl_rmmp -cspoc -n"${vgprops[NODES]// /,}" $VOLUME_GROUP $mirror_pool" >>$CLMGR_TMPLOG cl_rmmp -cspoc -n"${vgprops[NODES]// /,}" "$VOLUME_GROUP" "$mirror_pool" >>$CLMGR_TMPLOG rc=$? print "$0()[$LINENO]($SECONDS): cl_rmmp RC: $rc" >>$CLMGR_TMPLOG if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR dspmsg -s $CLMGR_SET $CLMGR_MSGS 300 '\nERROR: failed to delete "%1$s".\n\n' "$mirror_pool" 1>&2 break fi else : Determine if this operation will result in the removal : of the entire mirror pool. If so, tell the user. print "$0()[$LINENO]($SECONDS): LC_ALL=C cl_lsmpvgs -m $mirror_pool $VOLUME_GROUP" >>$CLMGR_TMPLOG # Always log commands typeset OUTPUT=$(LC_ALL=C cl_lsmpvgs -m $mirror_pool $VOLUME_GROUP) cmd_rc=$? print "cl_lsmpvgs RC: $cmd_rc; OUTPUT == \"$OUTPUT\"" >>$CLMGR_TMPLOG # Always log command result if (( $cmd_rc == RC_SUCCESS )); then typeset AIO_CACHE AIO_HWM DISKS REM typeset -u MODE SUPER_STRICT print "$OUTPUT" |\ while IFS=: read NAME VG MODE AIO_CACHE AIO_HWM SUPER_STRICT DISKS REM; do [[ $NAME == \#* ]] && continue DISKS=" ${DISKS//,/ } " break done fi if [[ $DISKS != *([[:space:]]) ]]; then for DISK in ${PHYSICAL_VOLUMES//,/ }; do DISKS=${DISKS//\ $DISK\ / } done if [[ $DISKS == *([[:space:]]) ]]; then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1404 '\n*** Warning: this removal operation, when completed, will leave no disks in\nmirror pool "%1$s", resulting in its automatic removal.\n\n' "$mirror_pool" sleep 5 fi fi : Removing $PHYSICAL_VOLUMES from mirror pool $mirror_pool in $VOLUME_GROUP print "$0()[$LINENO]($SECONDS): cl_mp_disks -cspoc -n\"${vgprops[NODES]// /,}\" -P $VOLUME_GROUP ${PHYSICAL_VOLUMES//,/ }" >>$CLMGR_TMPLOG cl_mp_disks -cspoc -n"${vgprops[NODES]// /,}" -P $VOLUME_GROUP ${PHYSICAL_VOLUMES//,/ } >>$CLMGR_TMPLOG rc=$? print "$0()[$LINENO]($SECONDS): cl_mp_disks RC: $rc" >>$CLMGR_TMPLOG if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 358 '\nERROR: failed to delete "%1$s" from "%2$s".\n\n' "$PHYSICAL_VOLUMES" "$mirror_pool ($VOLUME_GROUP)" 1>&2 break fi fi fi done (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete mirror_pool -h" "MIRROR POOL:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_mirror_pool()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_mirror_pool =head1 SYNOPSIS clmgr query mirror_pool clmgr delete mirror_pool { [,,...] | ALL } \ [ VOLUME_GROUP= ] clmgr delete mirror_pool \ [ VOLUME_GROUP= ] \ PHYSICAL_VOLUMES="[,,...]" NOTE: when physical volumes are specified for a delete operation, the list of disks will be removed from the mirror pool. If all disks are removed, the mirror pool is removed. NOTE: aliases for "mirror_pool" are "mp", "mi", and "pool". =head1 DESCRIPTION Deletes one or more mirror pools, or deletes physical volumes from the specified mirror pool. =head1 ARGUMENTS 1. MIRROR_POOLS [REQUIRED] [string] One or more (comma or space separated) mirror pools to attempt to delete. 2. VOLUME_GROUP [OPTIONAL] [string] The label of the volume group that the targeted mirror pool is managed by. This is only needed if more than one mirror pool in this cluster shares the same name, resulting in ambiguity. 3. PHYSICAL_VOLUMES [OPTIONAL] [string] One or more disks to remove from the specified mirror pool. If all disks in the mirror pool are removed, then so is the mirror pool itself. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== script k$1+b}bb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_networkool#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_network.sh 1.3 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)87 1.3 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_network.sh, hacmp.assist, 61haes_r714 6/10/12 15:11:35 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_network =head1 VERSION Version Number: 1.3 Last Extracted: 1/31/14 04:40:43 Last Changed: 6/10/12 15:11:35 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_network.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr delete network {[,,,...] | ALL} =head1 DESCRIPTION Deletes one or more neworks from the cluster configuration. Interfaces that reside on each network are also removed. =head1 ARGUMENTS 1. networks [REQUIRED] [string] One or more (comma or space separated) networks to attempt to delete. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_network { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_network.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset networks=${1//\"/} networks=${networks//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset network= #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= elif [[ -z $networks ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset -u uctext=$networks if [[ $uctext == "ALL" ]]; then networks= typeset available CL=$LINENO KLIB_HACMP_list_networks available for (( i=0; i<${#available[*]}; i++ )); do networks="$networks ${available[$i]}" done if [[ $networks == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 327 "Warning: there are no networks to delete.\n" rc=$RC_SUCCESS fi fi fi #=========================================================== : Delete the network if no input errors have been detected #=========================================================== if (( $rc == RC_UNKNOWN )); then for network in $networks; do CL=$LINENO KLIB_HACMP_is_known_network "$network" if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$network" 1>&2 /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 150 "Available Networks:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_networks available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done rc=$RC_NOT_FOUND else print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clmodnetwork -d -n \"$network\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clmodnetwork -d -n "$network" rc=$? print "clmodnetwork RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$network" 1>&2 break fi fi done (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete network -h" "NETWORK:" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_network()" a k51+&b}bb&& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_node#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_node.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_node =head1 VERSION Version Number: 1.2 Last Extracted: 2/10/17 20:08:09 Last Changed: 11/4/16 09:17:51 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_node.sh, powerha, 61aha_r722 =head1 SYNOPSIS clmgr delete node {[,,,...] | ALL} =head1 DESCRIPTION Deletes one or more nodes from the cluster configuration. If the specified node(s) are assigned to a site, then they are first removed from that site, then deleted. =head1 ARGUMENTS 1. nodes [REQUIRED] [string] One or more (comma or space separated) nodes to attempt to delete (specified as node labels). =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. #============================================================================ # # Name: KLIB_HACMP_delete_node # # Description: This is the main, FPATH function that is invoked by clmgr # to remove a node from the cluster configuration. If # just one node is removed, and other nodes remain, then # the node is removed from the SystemMirror definitions only, # but not CAA. The CAA removal will occur when a synchronization # is performed, at which time the other nodes in the cluster # will also be notified of the removal, and updated accordingly. # # Inputs: See the "devDoc()" function, above. # # Outputs: None. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function, above, for the standard return # code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_delete_node { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_node.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset nodes=${1//\"/} nodes=${nodes//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== integer rc=$RC_UNKNOWN i=0 typeset node="" #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= elif [[ -z $nodes ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset -u uctext=$nodes if [[ $uctext == "ALL" ]]; then nodes= typeset available CL=$LINENO KLIB_HACMP_list_nodes available for (( i=0; i<${#available[*]}; i++ )); do nodes="$nodes ${available[$i]}" done if [[ $nodes == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 328 "Warning: there are no nodes to delete.\n" rc=$RC_SUCCESS fi else for node in $nodes; do CL=$LINENO KLIB_HACMP_is_known_node "$node" >/dev/null 2>&1 if (( $? != RC_SUCCESS )); then typeset MSG=$(/usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$node") MSG=${MSG##+([[:space:]])} print -u2 "${MSG%%+([[:space:]])}" rc=$RC_NOT_FOUND fi done if (( rc == RC_NOT_FOUND )); then print -u2 "" /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 151 "Available Nodes:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_nodes available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done fi fi fi #======================================================================= : Validate if given node is offline. If any node is online, we exit. #======================================================================= if (( $rc == RC_UNKNOWN )) then for tempnode in $nodes do # : Find what nodes $tempnode thinks is active # clgetactivenodes -n $tempnode 2>/dev/null 1>&2 returncode=$? # : clgetactivenodes return code is the number of active nodes, : or -1 or 255 in case of an error # if (( $returncode == 255 || $returncode == 0 )) then continue # $tempnode has no clue about active nodes else dspmsg -s $CLMGR_SET $CLMGR_MSGS 351 "\nERROR: cluster services on one or more of the specified nodes, \"%1\$s\", are in a state that prevent the cluster configuration from being removed. A cluster cannot be deleted from a node while cluster services remain active. Please consider running \"%2\$s offline node \" for each active node.\n" "$nodes" "$CLMGR_PROGNAME" 1>&2 rc=$RC_ERROR # Should have an active node list. Mark as error. break fi done fi #======================================================================= : Validates if any system mg exists with this node ID, if yes then : stop here #======================================================================= if (( $rc == RC_UNKNOWN )); then for node in $nodes; do is_entry=$($HAUTILS/clodmget -n -q "field_type=NODE and value=$node" -f identifier HACMPxd_ext_attr 2>/dev/null) if [[ -n $is_entry ]]; then rc=$RC_ERROR /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 769 "\nA system mirror group with name \"%1\$s\" exists for node \"%2\$s\". Please remove it first.\n\n" "$is_entry" "$node" 1>&2 break fi done (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================== : Delete the node if no input errors have been detected #======================================================== if (( $rc == RC_UNKNOWN )); then for node in $nodes; do CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 307 "Attempting to delete node \"%1\$s\" from the cluster...\n" "$node" print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clnodename -r \"$node\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clnodename -r "$node" rc=$? print "clnodename RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$node" 1>&2 CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 9999 'Use the "lssrc -ls clstrmgrES" command on node "%1$s" to ensure that PowerHA SystemMirror cluster services are not running. Also, remove node "%1$s" from all resource groups, site definitions, collocation and anticollocation lists.\n' "$node" 1>&2 break fi done (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete node -h" "NODE:" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_node()" we ex k1+/b}bb&/ # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_nova#!/bin/ksh93 # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_nova.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_nova =head1 SYNOPSIS clmgr delete nova {[NovaLink] | ALL} =head1 DESCRIPTION Attempts to delete the specified NovaLink, from its name, or All NovaLinks. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. NovaLink [REQUIRED] [string] Either hostname of IP address for the NovaLink. IPv4 and IPv6 format address are supported. All NovaLinks can be deleted if 'All' is specified. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_nova { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : INPUTS: $* typeset novas=${1//\"} novas=${novas//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset nova= typeset -u uc_val=$novas #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= elif [[ $novas == *([[:space:]]) ]]; then CL=$LINENO dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset -u ALL=$uc_val if [[ $ALL == "ALL" ]]; then novas="" typeset available CL=$LINENO KLIB_HACMP_list_novas available for (( i=0; i<${#available[*]}; i++ )); do novas=${novas:+$novas }${available[$i]} done # If no NOVA to delete, consider it is ok if [[ -z $novas ]]; then rc=$RC_SUCCESS fi else typeset NOVAS="" for nova in $novas; do CL=$LINENO KLIB_HACMP_is_known_nova nova >/dev/null if (( $? != RC_SUCCESS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$nova" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 1146 "Available NovaLinks:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_novas available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND else NOVAS="${NOVAS:+$NOVAS }$nova" fi done novas=$NOVAS fi fi if (( $rc == RC_UNKNOWN )) ; then typeset NODES_OF_NOVA= managed_system= for nova in $novas; do #===================================================== : Get managed system attribute from nova #===================================================== print -- "$0()[$LINENO]($SECONDS): managed_system=$(clodmget -q name=$nova -f managed_system -n HACMPnova)" >>$CLMGR_TMPLOG managed_system=$(clodmget -q name=$nova -f managed_system -n HACMPnova) print -- "$0()[$LINENO]($SECONDS): clrmnova -n \"$nova\"" >>$CLMGR_TMPLOG clrmnova -n "$nova" rc=$? print -- "$0()[$LINENO]($SECONDS): clrmnova -n \"$nova\" rc=$rc" >>$CLMGR_TMPLOG if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR dspmsg -s $CLMGR_SET $CLMGR_MSGS 1147 "\nERROR: failed to remove the \"%1\$s\" NovaLink.\n\n" "$nova" 1>&2 break else #=========================================================== : Remove this nova managed system entries from HACMPnode ODM #=========================================================== if [[ -n $managed_system ]]; then NODES_OF_NOVA=$(clodmget -q "object=NOVA_MANAGED_SYSTEM and value=$managed_system" -f name -n HACMPnode) rc=$? if (( $rc == RC_SUCCESS )); then if [[ -n $NODES_OF_NOVA ]]; then for NODE_OF_NOVA in $NODES_OF_NOVA; do print -- "$0()[$LINENO]($SECONDS): clchnovaparam -n \"$NODE_OF_NOVA\" -r NOVA_MANAGED_SYSTEM=$managed_system" >>$CLMGR_TMPLOG # Always log commands clchnovaparam -n "$NODE_OF_NOVA" -r NOVA_MANAGED_SYSTEM=$managed_system rc=$? print -- "clchnovaparam -n \"$NODE_OF_NOVA\" -r NOVA_MANAGED_SYSTEM=$managed_system rc=$rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR dspmsg -s $CLMGR_SET $CLMGR_MSGS 1147 "\nERROR: failed to remove the \"%1\$s\" NovaLink.\n\n" "$nova" 1>&2 fi done fi fi fi fi done fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]]; then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete nova -h" "NOVA:" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_nova()" 1 kj1+b}bb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_persistent_ipoupkG#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_persistent_ip.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)27 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_persistent_ip.sh, hacmp.assist, 61haes_r714 6/10/12 15:11:37 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_persistent_ip =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:42 Last Changed: 6/10/12 15:11:37 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_persistent_ip.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr delete persistent_ip {[,,,...] | ALL} =head1 DESCRIPTION Removes one or more persistent IP labels from the cluster configuration. =head1 ARGUMENTS 1. persistent_ips [REQUIRED] [string] One or more (comma or space separated) persistent IPs to attempt to delete. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_persistent_ip { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_persistent_ip.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset persistent_ips=${1//\"/} persistent_ips=${persistent_ips//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset persistent_ip= #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= elif [[ -z $persistent_ips ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset -u uctext=$persistent_ips if [[ $uctext == "ALL" ]]; then persistent_ips= typeset available CL=$LINENO KLIB_HACMP_list_persistent_ip available for (( i=0; i<${#available[*]}; i++ )); do persistent_ips="$persistent_ips ${available[$i]}" done if [[ $persistent_ips == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 329 "Warning: there are no persistent IPs to delete.\n" rc=$RC_SUCCESS fi fi fi #================================================================= : Delete the persistent IP if no input errors have been detected #================================================================= if (( $rc == RC_UNKNOWN )); then for persistent_ip in $persistent_ips; do #=========================================================== : Retrieve the cllsif data to ensure that any IP addresses : are converted to their matching names/labels. #=========================================================== $HAUTILS/cllsif -pcS |\ while read LINE; do : Handle possible IPv6 address typeset IPv6= if [[ $LINE == *\[* ]]; then IPv6=${LINE##*\[} IPv6=${IPv6%%\]*} LINE=${LINE/\[$IPv6\]/[${IPv6//:/_}]} fi print -- "$LINE" | IFS=: read name type nw nettype attr node ipaddr haddr if gname netmask hb_addr site prefix family remainder : Handle possible IPv6 address ipaddr=${ipaddr//_/:} ipaddr=${ipaddr/\[/} ipaddr=${ipaddr/\]/} [[ $LINE != *:persistent:* ]] && continue if [[ $persistent_ip == @($name|$ipaddr) ]]; then typeset pi_label=${LINE%%:*} [[ -n $pi_label ]] && persistent_ip=$pi_label break fi done CL=$LINENO KLIB_HACMP_is_known_persistent_ip "$persistent_ip" 2>/dev/null if (( $? != RC_SUCCESS )) || [[ -z $persistent_ip ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$persistent_ip" 1>&2 /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 152 "Available Persistent Node IPs:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_persistent_ip available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done rc=$RC_NOT_FOUND else print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrmnode -a \"$persistent_ip\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrmnode -a "$persistent_ip" rc=$? if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$persistent_ip" 1>&2 break fi fi done (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete persistent_ip -h" "PERSISTENT IP/LABEL:" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_persistent_ip()"  lr1+#Db}bb&' # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_repositoryip  =e inorst_acdlp"#$ACEINOPRSTfhmuy(),-./01:DGLM[]bgv&2;>HKU\kw{}!'*346BFVx%+89w"%O?#/HyI9z)G'2`IT;XX,sK Lk<,D D8D" $32 E#EJ.rP|2.y "C`Xf<"!@1uP< "PXmmmmmmmmmmXʢvDI A9Rc(>Ut<Ǭ~'0IV,sDG rs\flR'lhۂ2ICOX ΎUd\lC6rt=lc Ck_@K *)ۀe0?,z)N/D6 _mmmmjı9ID_:-OcY"q^FT/}mmmmldj_*@$AK(Dq4 .X_O0]E?piR  ,d 3pn&L*DXˁ}Y #,&Mb%ֿmmmmmmmm?GNMxvUfS'6,i,rmmmmmmmm *P2@xce5 s2$H8XX+jޕ ` (TQ2eɕ&T ZHJ  *[$,]Ud\L0iR  ,d 3,&Mb%ֿmmXMƪz+mmWxyʮ"a 8*vXl2E d!QaC 3c&`cZ;Q;!"3*gOB8lNS؈, _Ҥ @X% PpqT'՘Lp |iʮ"` q|523 ۟Ut<@1Rd"\\ 7/q|Ha2h ..Aȹx p B  T4 Ud\ 6ͱk|2.{&H*XLK5 *XLK>C q9-_pTd @3YB†2(g@N8"B\NKEWAs09Rc!_Ҥ @8"fLm6b>mmmmmmmm_'*Lg* aOGφqf[1)}mmmmmmmڿ‚K0IqPiR  rZn~Ud\|2.{&7/ȹWAsϏ@&Va1((PT .X Ud\_mmmmmmmdc:xa^rtRHHz'FX4yǡL%7vC=͜1Hfzy9mmmmmmW&8k2EMQ +6A[(+`  *X@2匔4XBfE+`xXX+MUlpq4`U˖2Pc  4W AWAsϯ𠬀@8"fLa`'% 448 bse7dp@ҥAT .XCE&d\XTL`x]E?HK&\(Lȹ48# ȹWAsϏUd\Iȹ<,&lZ}Y2P:8v&P52&×FGSAR * *X_ B&@ .O*Hv00 rZ 00 rZBBʖJ'H5 ( "HX "* AȹcAؙC Ț#Aa{O(:J!+a\_ n@$T4@WAsόW(h *XLKAȹk2P:@$dcǁ̔4N (hx܁F_ L noj'g$,^ //v@? d`2 @L4Ha2h ..ʮ" LjdMBe P"hx<(mmmmmmڿBBʖJ'H5 ( "HX "* Aȹc(hLjdM l=QMHud:K0I D3F2D _/*BWHV(TR4T0!b2P|2.yqʮ"2 @L8$/#lZo$u4\H$Lɜ$:51[QH yT* $,^ zNP/* |&c'%mmmmmmmmmK4ruFؘWAsτCkk-* Mj2OE\a0!bcr;!hF؟-χk{tv`Aĉ2gE9cONmӕ&,sW>mmmmmmmmm#2$H+a\_ HTd3%I\NKWFPbtRJ93S5i+2AʠUd\N >Ut܀HPL' /'%"H@8 ,f7`zJejJej:J0II0`#H*\i(pT`'=(Ȳa"8Itw X7;WAs p=>8(08ba *DU˖2;+6ʐ$hM˖3Dm6ů𠬂GSAv dH3&pW UAQ'H>UtUtvUϊ-zsd64۞u'#2ICO6AU?>آ'  V^XfNƛsΣ9㌀(dw J,svC= Mc۟!y8f|acQQCSX=4k΢TFcMQ67GIdvEc"5\Sz NFyE0H,"Ӓb9R"ְh@1aBNT]E>Ӓb8Lx/ܩ2/W)xC@D B@-x0H-Ŀ(x$@wʮ"a{9:JeNi z1c1* Ɇ-P"c3NnS OG{WAsϭ$[g|pܧ"GICЌI6F,ssk̵i>Q-t䢘D8XSFVD;|2.{&`&&1/cFY>pt;TR/F2^Ud\L8F1NjI-x$;#8b*DTc^ƍ /ljC|2.y%0Z$;|k\sE "*1/cFh"3*n7g:0&ԧ69A4kତl ډـvh!$6ӑ%;Q;0|VRaJ{)qA8e v';! 9L3El۟΢v1bHcSyDeI&ԧk宜S40UkφΜR rw+/F,stUVQ|883-y$6yE"Z8Զ^~qnI#|%YI)8ҝ7L6mmmmmmmmmmXmD3Zp8q8W z82mmmmmmmmmjUt kx<1+b}bb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_resourcegroupoupkG#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_resourcegroup.sh 1.3 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)89 1.3 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_resourcegroup.sh, hacmp.assist, 61haes_r714 6/10/12 15:11:38 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_resourcegroup =head1 VERSION Version Number: 1.3 Last Extracted: 1/31/14 04:40:43 Last Changed: 6/10/12 15:11:38 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_resourcegroup.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr delete resource_group {[,,,...] | ALL} =head1 DESCRIPTION Deletes one or more resource groups from the cluster configuration. =head1 ARGUMENTS 1. rgs [REQUIRED] [string] One or more (comma or space separated) resource groups to attempt to delete. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_resourcegroup { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_resourcegroup.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset rgs=${1//\"/} rgs=${rgs//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset rg= #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= elif [[ -z $rgs ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset -u uctext=$rgs if [[ $uctext == "ALL" ]]; then rgs= typeset available CL=$LINENO KLIB_HACMP_list_resourcegroups available for (( i=0; i<${#available[*]}; i++ )); do rgs="$rgs ${available[$i]}" done if [[ $rgs == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 330 "Warning: there are no resource groups to delete.\n" rc=$RC_SUCCESS fi fi fi #================================================================== : Delete the resource group if no input errors have been detected #================================================================== if (( $rc == RC_UNKNOWN )); then for rg in $rgs; do CL=$LINENO KLIB_HACMP_is_known_rg "$rg" if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$rg" 1>&2 /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 154 "Available Resource Groups:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_resourcegroups available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done rc=$RC_NOT_FOUND else print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrmgrp -g $rg" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrmgrp -g $rg rc=$? if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$rg" 1>&2 break fi fi done (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete resource_group -h" "RESOURCE GROUP:" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_resourcegroup()" GHT CO k,!1+b}bb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_service_ipup#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2020,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_service_ip.sh 1.3 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_service_ip.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_service_ip =head1 VERSION Version Number: 1.3 Last Extracted: 1/31/14 04:40:43 Last Changed: 6/10/12 15:11:39 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_service_ip.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr delete service_ip {[,,,...] | ALL} =head1 DESCRIPTION Removes one or more shared or node-bound service IP from the cluster configuration. =head1 ARGUMENTS 1. service_ips [REQUIRED] [string] One or more (comma or space separated) service IPs to attempt to delete. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_service_ip { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_service_ip.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset service_ips=${1//\"/} service_ips=${service_ips//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset service_ip= #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= elif [[ -z $service_ips ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset -u uctext=$service_ips if [[ $uctext == "ALL" ]]; then service_ips= typeset available CL=$LINENO KLIB_HACMP_list_service_ip available for (( i=0; i<${#available[*]}; i++ )); do service_ips="$service_ips ${available[$i]}" done if [[ $service_ips == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 331 "Warning: there are no service IPs to delete.\n" rc=$RC_SUCCESS fi fi fi #============================================================== : Delete the service IP if no input errors have been detected #============================================================== if (( $rc == RC_UNKNOWN )); then for service_ip in $service_ips; do #================================================================== : If the service_ip is in IP address format, convert to its label. : clrmnode will not accept a service_ip in address format. #================================================================== if [[ $service_ip == *@(\.|:)* ]]; then service_ip=$($HAUTILS/clodmget -q identifier=$service_ip -n -f ip_label HACMPadapter) fi CL=$LINENO KLIB_HACMP_is_known_service_ip "$service_ip" if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$service_ip" 1>&2 /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 156 "Available Service IPs:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_service_ip available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done rc=$RC_NOT_FOUND else print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrmnode -a \"$service_ip\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrmnode -a "$service_ip" rc=$? if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$service_ip" 1>&2 break fi fi done (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete service_ip -h" "SERVICE IP/LABEL:" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_service_ip()" ======= k1+,b}bb&, # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_site#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_site.sh 1.8 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)88 1.8 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_site.sh, hacmp.assist, 61haes_r720, 1520B_hacmp720 5/8/15 10:48:44 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_site =head1 VERSION Version Number: 1.8 Last Extracted: 5/14/15 17:39:14 Last Changed: 5/8/15 10:48:44 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_site.sh, hacmp.assist, 61haes_r720, 1520B_hacmp720 =head1 SYNOPSIS clmgr delete site {[,,,...] | ALL} =head1 DESCRIPTION Deletes one or more sites from the cluster configuration. =head1 ARGUMENTS 1. sites [REQUIRED] [string] One or more (comma or space separated) sites to attempt to delete. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. #============================================================================ # # Name: KLIB_HACMP_delete_site # # Description: This is the main, FPATH function that is invoked by clmgr # to delete a cluster site. If the last site is removed from # a stretched cluster, the cluster is automatically changed # to a standard cluster. # # Inputs: See the "devDoc()" function, above. # # Outputs: Warning messages are emitted if a cluster type change is # performed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function, above, for the standard return # code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_delete_site { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.8, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_site.sh, hacmp.assist, 61haes_r720, 1520B_hacmp720 : INPUTS: $* typeset sites=${1//\"/} sites=${sites//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset site= #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= elif [[ -z $sites ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset -u uctext=$sites if [[ $uctext == "ALL" ]]; then sites= typeset available CL=$LINENO KLIB_HACMP_list_sites available for (( i=0; i<${#available[*]}; i++ )); do sites="$sites ${available[$i]}" done if [[ $sites == *([[:space:]]) ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 332 "Warning: there are no sites to delete.\n" rc=$RC_SUCCESS fi fi fi #======================================================================= : Validates if any repos mg or storage system exists with this site ID, : if yes then stop here #======================================================================= if (( $rc == RC_UNKNOWN )); then for site in $sites; do is_entry=$(clodmget -n -q "field_type=site and value=$site" -f identifier HACMPxd_ext_attr 2>/dev/null) if [[ -n $is_entry ]]; then rc=$RC_ERROR dspmsg -s $CLVT_SET $CLVT_MSGS 770 "\nA repository mirror group with name \"%1\$s\" exists for site \"%2\$s\". Please remove it first.\n\n" "$is_entry" "$site" 1>&2 break fi is_entry=$(clodmget -n -q "xd_storage_system_site_affiliation=$site" -f xd_storage_system_name HACMPxd_storage_system 2>/dev/null) if [[ -n $is_entry ]]; then rc=$RC_ERROR dspmsg -s $CLVT_SET $CLVT_MSGS 771 "\nA storage system with name \"%1\$s\" exists for site \"%2\$s\". Please remove it first.\n\n" "$is_entry" "$site" 1>&2 break fi done (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================== : Delete the site if no input errors have been detected #======================================================== if (( $rc == RC_UNKNOWN )); then for site in $sites; do CL=$LINENO KLIB_HACMP_is_known_site "$site" >/dev/null 2>&1 if (( $? != RC_SUCCESS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$site" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 157 "Available Sites:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_sites available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done rc=$RC_NOT_FOUND else #===================================================== : If removing sites from a linked cluster, then warn : that cluster synchronization will not be possible. #===================================================== if [[ $CLUSTER_TYPE == "LC" ]] then print cl_dspmsg -s 63 cluster.cat 55 "\ Warning: you are removing sites from a Linked Cluster. You will not be able to verify and synchronize these changes until you add site(s) for a total of 2 sites.\n" sleep 5 # Provide a little Ctrl+C time else #====================================================== : If this removal will leave just one site, then warn : that cluster synchronization will not be possible. #====================================================== if (( $(clodmget -n -f name HACMPsite | wc -l) == 2 )) then print cl_dspmsg -s 63 cluster.cat 54 "\ Warning: you are removing a site which will leave only 1 site configured. You will not be able to verify and synchronize these changes until you add site(s) for a total of 2 sites or delete all sites.\n" sleep 5 # Provide a little Ctrl+C time #======================================================== : If removing the last site, and this is a stretched : cluster, then warn that the cluster will be converted : to a standard cluster. #======================================================== elif (( $(clodmget -n -f name HACMPsite | wc -l) == 1 )) && [[ $CLUSTER_TYPE == "SC" ]] then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1016 " Warning: you are removing the last site (\"%1\$s\") from a stretched cluster. This will result in the cluster automatically being converted to a standard cluster.\n" "$site" sleep 5 # Provide a little Ctrl+C time fi fi print "$0()[$LINENO]($SECONDS): claddsite -d -s $site" >>$CLMGR_TMPLOG # Always log commands claddsite -d -s $site rc=$? print "$0()[$LINENO]($SECONDS): claddsite RC: $rc" >>$CLMGR_TMPLOG # Log the result if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR dspmsg -s $CLMGR_SET $CLMGR_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$site" 1>&2 break else #========================================================== : The site was successfully removed. If there are no more : sites, and this is a stretched cluster, then change the : cluster type to standard. #========================================================== if [[ -z $(clodmget -n -f name HACMPsite) && $CLUSTER_TYPE == "SC" ]] then print "$0()[$LINENO]($SECONDS): multi_site_lc == $(clodmget -f multi_site_lc HACMPcluster)" >>$CLMGR_TMPLOG print "$0()[$LINENO]($SECONDS): echo \"HACMPcluster: multi_site_lc=-1\" | odmchange -o HACMPcluster" >>$CLMGR_TMPLOG print "HACMPcluster: multi_site_lc=-1" | odmchange -o HACMPcluster print "$0()[$LINENO]($SECONDS): multi_site_lc == $(clodmget -f multi_site_lc HACMPcluster)" >>$CLMGR_TMPLOG cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1015 "\nNote: now that the last site has been removed from the cluster, the cluster type has been automatically changed from stretched to standard.\n" fi fi fi done fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete site -h" "SITE:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_site()" tha k:1+b~bb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_snapshotpup#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_snapshot.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_snapshot.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_snapshot =head1 SYNOPSIS clmgr delete snapshot {[,,,...] | ALL} =head1 DESCRIPTION Deletes one or more snapshots from the local system. =head1 ARGUMENTS 1. snapshot [REQUIRED] [string] One or more (comma or space separated) snapshots to attempt to delete. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. #============================================================================ # # Name: KLIB_HACMP_delete_snapshot # # Description: This is the main, FPATH function that is invoked by clmgr # to delete a cluster snapshot. # # Inputs: See the "devDoc()" function, above. # # Outputs: None. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function, above, for the standard return # code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_delete_snapshot { . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_snapshot.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset snapshots=${1//\"/} snapshots=${snapshots//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset snapshot= #================= : Validate input #================= if [[ -z $snapshots ]]; then dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 158 "Available Snapshots:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_snapshots available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_MISSING_INPUT else typeset -u uctext=$snapshots if [[ $uctext == "ALL" ]]; then snapshots= typeset available CL=$LINENO KLIB_HACMP_list_snapshots available for (( i=0; i<${#available[*]}; i++ )); do snapshots="$snapshots ${available[$i]}" done if [[ $snapshots == *([[:space:]]) ]]; then dspmsg -s $CLVT_SET $CLVT_MSGS 333 "Warning: there are no snapshots to delete.\n" rc=$RC_SUCCESS fi fi fi #============================================================ : Delete the snapshots if no input errors have been detected #============================================================ integer PROBLEMS=0 if (( $rc == RC_UNKNOWN )); then # loop through the list of snapshots - since this is a loop we # dont preserve specific errors (e.g. not found or failed to delete) # since rc could be overwritten in the next loop iteration - instead # we simply record that there were problems and throw RC_ERROR later for snapshot in $snapshots; do CL=$LINENO KLIB_HACMP_is_known_snapshot "$snapshot" if (( $? != RC_SUCCESS )); then dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$snapshot" 1>&2 (( PROBLEMS++ )) else print -- "$0()[$LINENO]($SECONDS): clsnapshot -r -n \"$snapshot\"" >>$CLMGR_TMPLOG # Always log commands clsnapshot -r -n "$snapshot" rc=$? if (( $rc != RC_SUCCESS )); then dspmsg -s $CLVT_SET $CLVT_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$snapshot" 1>&2 (( PROBLEMS++ )) fi fi done if (( PROBLEMS )) then # add an extra space after error messages print -u2 # if there were problems, list the available snapshots dspmsg -s $CLVT_SET $CLVT_MSGS 158 "Available Snapshots:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_snapshots available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done rc=$RC_ERROR fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete snapshot -h" "SNAPSHOT:" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_snapshot()" #==== k1+ob~bb&o # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_storage_agentoupkG#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_storage_agent.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)29 1.3 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_storage_agent.sh, hacmp.assist, 61haes_r714 8/14/12 13:26:05 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_storage_agent =head1 VERSION Version Number: 1.3 Last Extracted: 1/31/14 04:41:43 Last Changed: 8/14/12 13:26:05 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_storage_agent.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr delete storage_agent {[,,...] | ALL} =head1 DESCRIPTION Deletes one or more storage agents from the local system. =head1 ARGUMENTS 1. storage_agents [REQUIRED] [string] One or more (comma or space separated) storage agents to attempt to delete. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_storage_agent { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_storage_agent.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset storage_agents=${1//\"/} storage_agents=${storage_agents//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values CL=$LINENO isEnterprise if (( $? != 1 )); then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 184 "\nERROR: this operation requires IBM PowerHA SystemMirror for AIX Enterprise Edition.\n\n" 1>&2 log_return_msg $RC_MISSING_DEPENDENCY $0 $LINENO return $? fi #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset storage_agent= #================= : Validate input #================= if [[ -z $storage_agents ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset -u uctext=$storage_agents if [[ $uctext == "ALL" ]]; then storage_agents= typeset available CL=$LINENO KLIB_HACMP_list_storage_agents available for (( i=0; i<${#available[*]}; i++ )); do storage_agents="$storage_agents ${available[$i]}" done if [[ $storage_agents == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 338 "Warning: there are no storage agents to delete.\n" rc=$RC_SUCCESS fi fi fi #========================================================== : Delete the object if no input errors have been detected #========================================================== if (( $rc == RC_UNKNOWN )); then for storage_agent in $storage_agents; do typeset TYPE="" CL=$LINENO KLIB_HACMP_is_known_storage_agent "$storage_agent" TYPE if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$storage_agent" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 163 "Available Storage Agents:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_storage_agents available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done rc=$RC_NOT_FOUND else print -- "$0()[$LINENO]($SECONDS): $HAXDWIZ/clxd_remove_sa_director -n \"$storage_agent\" -s \"$TYPE\"" >>$CLMGR_TMPLOG # Always log commands $HAXDWIZ/clxd_remove_sa_director -n "$storage_agent" -s "$TYPE" rc=$? print -- "$0()[$LINENO]($SECONDS): clxd_remove_sa_director RC: $rc" >>$CLMGR_TMPLOG # Always log commands if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$storage_agent" 1>&2 break fi fi done (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete storage_agent -h" "STORAGE AGENT:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_storage_agent()" / k`1+ b~bb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_storage_systemoupkG#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2018,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_storage_system.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # # @(#) 5f56dbd 43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_storage_system.sh, 726, 2147A_aha726, Mar 08 2021 04:44 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_storage_system =head1 SYNOPSIS clmgr delete storage_system {[,,...] | ALL} \ [ BACKUP_PROFILE={yes|no} ] =head1 DESCRIPTION Deletes one or more storage systems from the local system. =head1 ARGUMENTS 1. storage_systems [REQUIRED] [string] One or more (comma or space separated) storage systems to attempt to delete. 2. backup_profile [OPTIONAL] [string] Flag to delete the storage systems either from ODM or from XML. Only delete the storage systems from backup management XML if yes. Allowed values: yes,no =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_storage_system { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 5f56dbd 43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_storage_system.sh, 726, 2147A_aha726, Mar 08 2021 04:44 PM : INPUTS: $* typeset storage_systems=${1//\"/} storage_systems=${storage_systems//,/ } typeset backup=${2//\"/} typeset -i backup_profile=0 if [[ -n $backup ]]; then CL=$LINENO verify_in_set BACKUP_PROFILE "$backup" "enable, true, yes, 1" backup if (( $? == RC_SUCCESS )); then [[ $backup == @(t|y|1|e)* ]] && backup_profile=1 else log_return_msg "$RC_INCORRECT_INPUT" "$0()" "$LINENO" return $? fi fi [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset storage_system= #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #================= : Validate input #================= if [[ -z $storage_systems ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset -u uctext=$storage_systems if [[ $uctext == "ALL" ]]; then storage_systems= typeset available if (( $backup_profile == 0 )); then CL=$LINENO KLIB_HACMP_list_storage_systems available 2>>$CLMGR_TMPLOG else CL=$LINENO KLIB_HACMP_list_storage_systems available BACKUP=1 2>>$CLMGR_TMPLOG fi for (( i=0; i<${#available[*]}; i++ )); do storage_systems="$storage_systems ${available[$i]}" done if [[ $storage_systems == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 339 "Warning: there are no storage systems to delete.\n" rc=$RC_SUCCESS fi fi fi #========================================================== : Delete the object if no input errors have been detected #========================================================== if (( $rc == RC_UNKNOWN )); then for storage_system in $storage_systems; do typeset TYPE="" BACKUP_PROFILE="" if (( $backup_profile == 1 )); then BACKUP_PROFILE="Enable" fi CL=$LINENO KLIB_HACMP_is_known_storage_system "$storage_system" TYPE BACKUP_PROFILE if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$storage_system" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 164 "Available Storage Systems:\n\n" 1>&2 typeset available if (( $backup_profile == 0 )); then CL=$LINENO KLIB_HACMP_list_storage_systems available 2>>$CLMGR_TMPLOG else CL=$LINENO KLIB_HACMP_list_storage_systems available BACKUP=1 2>>$CLMGR_TMPLOG fi for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done rc=$RC_NOT_FOUND else if [[ $BACKUP_PROFILE == "Enable" ]];then print -- "$0()[$LINENO]($SECONDS): cl_cbm_delete_storage_profile \"$storage_system\"">>$CLMGR_TMPLOG LANG=C cl_cbm_delete_storage_profile "$storage_system" rc=$? print -- "$0()[$LINENO]($SECONDS): cl_cbm_delete_storage_profileRC: $rc" >>$CLMGR_TMPLOG else CL=$LINENO isEnterprise if (( $? == 1 ));then print -- "$0()[$LINENO]($SECONDS): $HAXDWIZ/clxd_remove_ss_director -n \"$storage_system\" -s \"$TYPE\"" >>$CLMGR_TMPLOG # Always log commands $HAXDWIZ/clxd_remove_ss_director -n "$storage_system" -s "$TYPE" rc=$? print -- "$0()[$LINENO]($SECONDS): clxd_remove_ss_director RC: $rc" >>$CLMGR_TMPLOG # Always log commands fi fi if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$storage_system" 1>&2 break fi fi done (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete storage_system -h" "STORAGE SYSTEM:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_storage_system()" OG  k2+'b~bb&' # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_tape#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_tape.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)94 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_tape.sh, hacmp.assist, 61haes_r714 6/10/12 15:11:43 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_tape =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:21 Last Changed: 6/10/12 15:11:43 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_tape.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr delete tape {[,,,...] | ALL} =head1 DESCRIPTION Deletes one or more tape devices from the local system. =head1 ARGUMENTS 1. tapes [REQUIRED] [string] One or more (comma or space separated) tape devices to attempt to delete. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_tape { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_tape.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset tapes=${1//\"/} tapes=${tapes//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset tape= #================= : Validate input #================= if [[ -z $tapes ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset -u uctext=$tapes if [[ $uctext == "ALL" ]]; then tapes= typeset available CL=$LINENO KLIB_HACMP_list_tapes available for (( i=0; i<${#available[*]}; i++ )); do tapes="$tapes ${available[$i]}" done if [[ $tapes == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 334 "Warning: there are no tapes to delete.\n" rc=$RC_SUCCESS fi fi fi #======================================================== : Delete the tape if no input errors have been detected #======================================================== if (( $rc == RC_UNKNOWN )); then for tape in $tapes; do CL=$LINENO KLIB_HACMP_is_known_tape "$tape" if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$tape" 1>&2 /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 159 "Available Tapes:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_tapes available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done rc=$RC_NOT_FOUND else print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrmtape \"$tape\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrmtape "$tape" rc=$? if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$tape" 1>&2 break fi fi done (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete tape -h" "TAPE:" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_tape()" p k2+ b~bb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_user#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_user.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)82 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_user.sh, hacmp.assist, 61haes_r714 6/10/12 15:11:44 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_user =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:05 Last Changed: 6/10/12 15:11:44 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_user.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr delete user \ [ RESOURCE_GROUP= ] \ [ REMOVE_AUTH_INFO={true|false} ] \ [ REGISTRY={files|ldap} ] =head1 DESCRIPTION Deletes one or more AIX users from either all the cluster nodes, or from those nodes that the specified resource group can run on. =head1 ARGUMENTS 1. users [REQUIRED] [string] One or more (comma or space separated) users to attempt to delete. 2. rg [OPTIONAL] [string] A resource user label that, if provided, will be used to limit which nodes the users will be removed from. 3. remove_auth_info [OPTIONAL] [boolean] 4. registry [OPTIONAL] [set] Specifies which registry to remove the user from, FILES or LDAP. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_user { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_user.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset users=${1//\"/} users=${users//,/ } typeset rg=${2//\"/} typeset -l remove_auth_info=${3//\"/} typeset registry=${4//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset user= #================= : Validate input #================= if [[ -z $users ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT fi if [[ $rg != *([[:space:]]) ]]; then CL=$LINENO KLIB_HACMP_is_known_rg $rg if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$rg" 1>&2 /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 154 "Available Resource Groups:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_resourceusers available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND fi fi if [[ $registry != *([[:space:]]) ]]; then typeset -u registryUC=$registry case $registryUC in LD*) registry=LDAP ;; LO*) registry=files ;; F*) registry=files ;; *) /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 110 '\nERROR: invalid value specified for "%1$s": "%2$s".\n' REGISTRY "$registry" 1>&2 rc=$RC_INCORRECT_INPUT ;; esac fi #======================================================== : Delete the user if no input errors have been detected #======================================================== if (( $rc == RC_UNKNOWN )); then for user in $users; do CL=$LINENO KLIB_HACMP_is_known_user "$user" if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$user" 1>&2 /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 162 "Available Users:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_users available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done rc=$RC_NOT_FOUND else typeset rgOpt= rmOpt=" -p" [[ $rg != *([[:space:]]) ]] && rgOpt=" -cspoc-g $rg" [[ $remove_auth_info == @(f|n)* ]] && rmOpt="" typeset -u source= if [[ $registry == *([[:space:]]) ]]; then source=$(/usr/sbin/lsuser -R LDAP -a registry $user 2>>$CLMGR_TMPLOG) source=${source##*=} [[ -n $source ]] && registry=$source source=$(/usr/sbin/lsuser -R files -a registry $user 2>>$CLMGR_TMPLOG) source=${source##*=} if [[ -n $source ]]; then [[ -n $registry ]] && registry="$registry " registry="$registry$source" fi fi typeset -i cmd_rc=$RC_UNKNOWN for source in $registry; do if [[ $source == "LDAP" ]]; then print -- "$0()[$LINENO]($SECONDS): mode=LDAP $HACSPOC/fix_args nop cl_rmuser$rgOpt$rmOpt \"$user\"" >>$CLMGR_TMPLOG # Always log commands mode=LDAP $HACSPOC/fix_args nop cl_rmuser$rgOpt$rmOpt "$user" elif [[ $source == "FILES" ]]; then print -- "$0()[$LINENO]($SECONDS): $HACSPOC/fix_args nop cl_rmuser$rgOpt$rmOpt \"$user\"" >>$CLMGR_TMPLOG # Always log commands $HACSPOC/fix_args nop cl_rmuser$rgOpt$rmOpt "$user" fi cmd_rc=$? print -- "$0()[$LINENO]($SECONDS): cl_rmuser RC: $cmd_rc" >>$CLMGR_TMPLOG if (( $cmd_rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$user" 1>&2 break else (( $rc != $RC_ERROR )) && rc=$cmd_rc fi done fi done (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete user -h" "USER:" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_user()" ;;  k2+Eb~bb&E # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_delete_volume_group#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_volume_group.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)62 1.3 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_volume_group.sh, hacmp.assist, 61haes_r714 7/3/12 11:33:23 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_volume_group =head1 VERSION Version Number: 1.3 Last Extracted: 1/31/14 04:41:19 Last Changed: 7/3/12 11:33:23 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_volume_group.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr delete volume_group {[,,...] | ALL} =head1 DESCRIPTION Deletes one or more volume groups from the cluster. =head1 ARGUMENTS 1. volume_groups [REQUIRED] [string] One or more (comma or space separated) volume groups to attempt to delete. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_delete_volume_group { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_volume_group.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset volume_groups=${1//\"/} volume_groups=${volume_groups//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset volume_group= #================= : Validate input #================= if [[ -z $volume_groups ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset -u uctext=$volume_groups if [[ $uctext == "ALL" ]]; then volume_groups= typeset available CL=$LINENO KLIB_HACMP_list_volume_groups available for (( i=0; i<${#available[*]}; i++ )); do volume_groups="$volume_groups ${available[$i]}" done if [[ $volume_groups == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 340 "Warning: there are no volume groups to delete.\n" rc=$RC_SUCCESS fi fi fi #================================================================ : Delete the volume group if no input errors have been detected #================================================================ if (( $rc == RC_UNKNOWN )); then for volume_group in $volume_groups; do CL=$LINENO KLIB_HACMP_is_known_volume_group "$volume_group" if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$volume_group" 1>&2 /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 160 "Available Volume Groups:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_volume_groups available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done rc=$RC_NOT_FOUND else print -- "$0()[$LINENO]($SECONDS): $HASBIN/cl_rmvg \"$volume_group\"" >>$CLMGR_TMPLOG # Always log commands $HASBIN/cl_rmvg "$volume_group" rc=$? if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 300 "\nERROR: failed to delete \"%1\$s\".\n\n" "$volume_group" 1>&2 break fi fi done (( $rc != RC_SUCCESS )) && print -u2 fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "delete volume_group -h" "VOLUME GROUP:" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_volume_group()" 4 k2+7b~bb&7 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_discover_nodesroup#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_discover_nodes.sh 1.5 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)98 1.5 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_discover_nodes.sh, hacmp.assist, 61haes_r714 6/10/12 15:11:45 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_discover_nodes =head1 VERSION Version Number: 1.5 Last Extracted: 1/31/14 04:40:14 Last Changed: 6/10/12 15:11:45 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_discover_nodes.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_discover_nodes =head1 DESCRIPTION Using communication paths add nodes to the cluster definition. This routine will also define the cluster if no cluster definition is available. If the name of the cluster passed in does not match the actual configuration cluster name, then this function uses the existing cluster name =head1 ARGUMENTS 1. cluster_name [OPTIONAL] [string] The name to use for the cluster if no cluster is defined. 2. NODES [REQUIRED] [string ref] A list containing the nodes to add to the cluster. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_discover_nodes { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.5, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_discover_nodes.sh, hacmp.assist, 61haes_r714 : INPUTS: $* cluster_name=${1//\"/} typeset -n NODES=$2 [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i found=0 typeset -i rc=$RC_UNKNOWN typeset cluster_name= node= addnode= #============================================== : Check to see if the cluster name is already : defined. If so, use that name. #============================================== existing_cluster_name=$(CL=$LINENO KLIB_HACMP_get_cluster_name) if [[ -n $existing_cluster_name ]]; then cluster_name=$existing_cluster_name fi for node in $NODES; do CL=$LINENO KLIB_HACMP_is_known_node $node >/dev/null 2>&1 (( $? != RC_SUCCESS )) && addnode="$addnode $node" done if [[ -n $addnode ]]; then print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clmodclstr -n \"$cluster_name\" -p \"$addnode\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clmodclstr -n "$cluster_name" -p "$addnode" >/dev/null 2>>$CLMGR_TMPLOG rc=$? print "clmodclstr RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi for node in $NODES; do if [[ $(CL=$LINENO KLIB_HACMP_is_known_node $node) ]]; then AVAILABLE_NODES="$AVAILABLE_NODES $node" fi done print -- $AVAILABLE_NODES log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_discover_nodes()"  ku2+ b~bb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_generate_nameroup#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_generate_name.sh 1.4 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2005,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)30 1.4 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_generate_name.sh, hacmp.assist, 61haes_r714 6/10/12 15:22:11 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_generate_name =head1 VERSION Version Number: 1.4 Last Extracted: 1/31/14 04:40:28 Last Changed: 6/10/12 15:22:11 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_generate_name.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_generate_name =head1 DESCRIPTION Generate a unique name for a given PowerHA ODM that also adheres to length requirements. =head1 ARGUMENTS 1: sa_key [REQUIRED] [string] 2: len [OPTIONAL] [integer] The maximum key length. 3: suffix [OPTIONAL] [string] 4: odm [OPTIONAL] [string] 5: field_name [OPTIONAL] [string[ =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_generate_name { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_generate_name.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset sa_key=${1//\"/} integer len=${2//\"/} typeset suffix=${3//\"/} typeset odm=${4//\"/} typeset field_name=${5//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset temp_name= integer count=0 integer sub_length=$len-${#suffix} name="${sa_key:0:$sub_length}${suffix}" while true ; do if [[ -z $(/usr/bin/odmget -q "$field_name=$name" $odm) ]] ; then # name not found, so it is a good one. break; fi count=$count+1 if (( count >= 100 )) ; then # after 99 times, quit with error log_return_msg 1 "$0()" "$LINENO" return $? fi sub_length=$len-${#suffix}-${#count}-1 name="${sa_key:0:$sub_length}_${count}${suffix}" done echo $name log_return_msg 0 "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_generate_name()"  k 2+ 5b~bb& 5 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_appmonitor_attributeskG#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_appmonitor_attributes.sh 1.10 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_get_appmonitor_attributes.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #============================================================================ # # Name: KLIB_HACMP_get_appmonitor_attributes # # Description: This is the main, FPATH function that is invoked by clmgr # to collect application monitor information. It invokes the # "odmget" utility on the HACMPmonitor ODM to extract the # necessary data. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The properties hash is populated. The only other outputs are # any error messages that might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_get_appmonitor_attributes { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_get_appmonitor_attributes.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset monname=${1//\"/} # Get the "properties" associative array reference, and initialize it if [[ -z $2 ]] || [[ -n $CLMGR_LOGGING && $2 == "|" ]]; then monname= typeset -n properties=$1 else typeset -n properties=$2 fi [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== for k in ${!properties[*]}; do unset properties[$k]; done typeset name= value= setKey= MONS= DATA= typeset -A monEntries typeset -i INDEX=0 rc=$RC_SUCCESS typeset key= typeset -i matches=0 typeset -u attr= uc_key typeset -A queries typeset -i i=0 #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done monEntries=( [MONITOR_TYPE]="TYPE" [RESOURCE_TO_MONITOR]="APPLICATIONS" [INVOCATION]="MODE" [FAILURE_ACTION]="FAILUREACTION" [RESTART_METHOD]="RESTARTMETHOD" [NOTIFY_METHOD]="NOTIFYMETHOD" [CLEANUP_METHOD]="CLEANUPMETHOD" [STABILIZATION_INTERVAL]="STABILIZATION" [RESTART_COUNT]="RESTARTCOUNT" [RESTART_INTERVAL]="RESTARTINTERVAL" [PROCESSES]="PROCESSES" [PROCESS_OWNER]="OWNER" [INSTANCE_COUNT]="INSTANCECOUNT" [MONITOR_METHOD]="MONITORMETHOD" [MONITOR_INTERVAL]="MONITORINTERVAL" [HUNG_MONITOR_SIGNAL]="HUNGSIGNAL" [MONITOR_RETRY_COUNT]="MONITORRETRYCOUNT" [AM_LOGGING]="AMLOGGING" ) #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #======================================= : Make sure we have something to query #======================================= elif [[ -n $monname ]]; then [[ $monname != *,* ]] && unset INDEX for monname in ${monname//,/ }; do CL=$LINENO KLIB_HACMP_is_known_appmonitor "$monname" 2>/dev/null if (( $? != RC_SUCCESS )); then if [[ $CLMGR_PROGNAME == "clmgr" ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$monname" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 141 "Available Application Monitors:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_appmonitors available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi rc=$RC_NOT_FOUND else MONS="$MONS $monname" fi done elif (( CLMGR_VERBOSE || ${#queries[*]} > 0 )); then print -- "$0()[$LINENO]($SECONDS): clodmget -n -f name -q \"name = MONITOR_TYPE\" HACMPmonitor" >>$CLMGR_TMPLOG # Always log commands MONS=$(clodmget -n -f monitor -q "name = MONITOR_TYPE" HACMPmonitor) print "$0()[$LINENO]($SECONDS): clodmget RC: $?, MONS == \"${MONS//+([[:space:]])/ }\"" >>$CLMGR_TMPLOG # Always log command result MONS=${MONS//+([[:space:]])/ } else if [[ $CLMGR_PROGNAME == "clmgr" ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 fi rc=$RC_MISSING_INPUT fi (( $rc != RC_SUCCESS )) && unset MONS #================================================================ : Populate the return hash with the retrieved attributes/values #================================================================ for monname in $MONS; do print "$0()[$LINENO]($SECONDS): odmget -q \"monitor=$monname\" HACMPmonitor" >>$CLMGR_TMPLOG # Always log commands DATA=$(odmget -q "monitor=$monname" HACMPmonitor) print "$0()[$LINENO]($SECONDS): odmget RC: $?" >>$CLMGR_TMPLOG # Always log command result print -- "$DATA" |\ while IFS='=' read name value do name=${name##+([[:space:]])} name=${name%%+([[:space:]])} [[ -z $name || $name == 'HACMPmonitor:' ]] && continue value=${value##+([[:space:]])} value=${value%%+([[:space:]])} value=${value//\"/} case "$name" in "monitor") properties[NAME$INDEX]="$monname" ;; "name") value=${value//\"} setKey=${monEntries[$value]} ;; "value") value=${value//\"} if [[ $setKey == "APPLICATIONS" ]]; then if [[ -n ${properties[$setKey$INDEX]} ]]; then properties[$setKey$INDEX]="${properties[$setKey$INDEX]} " fi properties[$setKey$INDEX]="${properties[$setKey$INDEX]}$value" else properties[$setKey$INDEX]=$value fi ;; esac done #============================================================== : Even if there is no value for a given attribute, we want to : display a placeholder for it, so the customer always sees a : consistent, complete set of attributes. #============================================================== for key in ${_COLON_ATTR_ORDER[application_monitor]}; do if [[ ${properties[TYPE$INDEX]} == "process" ]]; then if [[ $key == @(MONITORMETHOD|MONITORINTERVAL|HUNGSIGNAL|MONITORRETRYCOUNT|AMLOGGING) ]] then continue fi else if [[ $key == @(PROCESSES|OWNER|INSTANCECOUNT) ]] then continue fi fi if [[ -z ${properties[$key$INDEX]} ]]; then properties[$key$INDEX]="" fi done (( INDEX++ )) [[ $INDEX == *0 ]] && (( INDEX++ )) done #========================================================== : If any searches/filters were specified, handle them now #========================================================== if (( $rc == RC_SUCCESS && ${#queries[*]} > 0 )); then CL=$LINENO search_properties queries properties rc=$? fi (( $rc == RC_SUCCESS )) && CL=$LINENO prune_indexes properties log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_appmonitor_attributes()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_appmonitor_attributes =head1 VERSION Version Number: 1.10 Last Extracted: 6/16/15 17:51:03 Last Changed: 6/1/15 13:20:37 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_appmonitor_attributes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query application_monitor [,,...] clmgr -v query application_monitor NOTE: the aliases for "application_monitor" are "am" and "mon". =head1 DESCRIPTION Retrieves the configuration data for one or more application monitors. =head1 ARGUMENTS 1. monname [REQUIRED] [string] The label of one or more application monitors (comma or space separated) that are to be queried. 2. properties [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2006,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== rc=$? kR 2+ b~bb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_appserver_attri#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_appserver.sh 1.6 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)07 1.6 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_appserver.sh, hacmp.assist, 61haes_r714 6/10/12 15:22:13 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_appserver =head1 VERSION Version Number: 1.6 Last Extracted: 1/31/14 04:40:16 Last Changed: 6/10/12 15:22:13 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_appserver.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr query application [,,,...] clmgr -v query application NOTE: the aliases for "application" are "as" and "app". =head1 DESCRIPTION Gets the application server name for the specified resource group. This function will only return the first app server found. =head1 ARGUMENTS 1. rg [REQUIRED] [string] The label of one or more resource groups (comma or space separated) that are to be queried. 2. properties [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_get_appserver { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.6, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_appserver.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset rg=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset rgs="" #================= : Validate input #================= if [[ -z $rg ]]; then rc=$RC_MISSING_INPUT else print "$0()[$LINENO]($SECONDS): /usr/bin/odmget -q \"name=APPLICATIONS and group=$rg\" HACMPresource" >>$CLMGR_TMPLOG # Always log commands /usr/bin/odmget -q "name=APPLICATIONS and group=$rg" HACMPresource | \ while IFS='=' read name value; do name=${name//[[:space:]]/} if [[ "$name" == "value" ]]; then apps="$value $apps" rc=$RC_SUCCESS fi done || rc=$RC_ERROR print "odmget RC: $rc" >>$CLMGR_TMPLOG # Always log command result echo $(eval echo $apps) fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_appserver()" 51:0 kH 2+5b~bb&5 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_appserver_attributeskG#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2018,2020,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) aaaa1a8 43haes/lib/ksh93/hacmp/KLIB_HACMP_get_appserver_attributes.sh, 726, 2147A_aha726, Jun 22 2021 10:44 AM #============================================================================ # # Name: KLIB_HACMP_get_appserver_attributes # # Description: This is the main, FPATH function that is invoked by clmgr # to collect application controller information. It invokes # the "odmget" utility on the HACMPserver ODM to extract the # necessary data. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The properties hash is populated. The only other outputs are # any error messages that might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_get_appserver_attributes { . $HALIBROOT/log_entry "$0()" "$CL" : version="@(#) aaaa1a8 43haes/lib/ksh93/hacmp/KLIB_HACMP_get_appserver_attributes.sh, 726, 2147A_aha726, Jun 22 2021 10:44 AM" : INPUTS: $* typeset appname=${1//\"/} # Get the "properties" associative array reference, and initialize it if [[ -z $2 ]] || [[ -n $CLMGR_LOGGING && $2 == "|" ]]; then appname= typeset -n properties=$1 else typeset -n properties=$2 fi [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== for k in ${!properties[*]}; do unset properties[$k]; done typeset name= value= APPS= DATA= start= stop= typeset cpu_usage_monitor= process= interval= typeset monitor= start_mode= typeset -i INDEX=0 rc=$RC_SUCCESS typeset key= typeset -i matches=0 typeset -u attr= uc_key= typeset -A queries typeset -i i=0 #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #======================================= : Make sure we have something to query #======================================= elif [[ -n $appname ]]; then for appname in ${appname//,/ }; do CL=$LINENO KLIB_HACMP_is_known_appserver $appname 2>/dev/null if (( $? != RC_SUCCESS )); then if [[ $CLMGR_PROGNAME == "clmgr" ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$appname" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 140 "Available Application Controllers:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_appservers available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi rc=$RC_NOT_FOUND else APPS="$APPS $appname" fi done elif (( CLMGR_VERBOSE || ${#queries[*]} > 0 )); then print "$0()[$LINENO]($SECONDS): clodmget -n -f name HACMPserver" >>$CLMGR_TMPLOG # Always log commands APPS=$(clodmget -n -f name HACMPserver) print "$0()[$LINENO]($SECONDS): clodmget RC: $?, APPS == \"${APPS//+([[:space:]])/ }\"" >>$CLMGR_TMPLOG # Always log command result APPS=${APPS//+([[:space:]])/ } else if [[ $CLMGR_PROGNAME == "clmgr" ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 fi rc=$RC_MISSING_INPUT fi (( $rc != RC_SUCCESS )) && unset APPS #================================================================ : Populate the return hash with the retrieved attributes/values #================================================================ for appname in $APPS; do print "$0()[$LINENO]($SECONDS): cllsserv -csm -n $appname" >>$CLMGR_TMPLOG # Always log commands DATA=$(cllsserv -csm -n $appname 2>> $CLMGR_TMPLOG) print "$0()[$LINENO]($SECONDS): cllsserv RC: $?, $appname DATA == \"$appname\"" >>$CLMGR_TMPLOG print -- "$DATA" | IFS=: read name start stop monitor start_mode cpu_usage_monitor process interval properties[NAME$INDEX]=$name properties[STARTSCRIPT$INDEX]=$start properties[STOPSCRIPT$INDEX]=$stop properties[STARTUP_MODE$INDEX]=$start_mode properties[CPU_USAGE_MONITOR$INDEX]=$cpu_usage_monitor properties[PROCESS_TO_MONITOR_CPU_USAGE$INDEX]=$process properties[CPU_USAGE_MONITOR_INTERVAL$INDEX]=$interval if [[ -n $monitor ]]; then monitor=${monitor%%*([[:space:]])} if [[ $CLMGR_PROGNAME == "clmgr" ]]; then properties[MONITORS$INDEX]=$monitor else properties[ASSOCIATEDMONITORS$INDEX]=$monitor fi fi typeset -u STATE="" integer APP_IDX=$(clodmget -f name -n HACMPserver | grep -nw "$appname" | cut -d: -f1) for RG in $(clodmget -q "value=$appname" -f group -n HACMPresource) do integer RG_IDX=$(clodmget -q "group=$RG" -f id HACMPgroup) properties[RESOURCE_GROUP$INDEX.$APP_IDX$RG_IDX]=$RG STATE=$(LC_ALL=C clRGinfo -c -m $RG 2>/dev/null | grep -w $appname | cut -d: -f5) if [[ -n ${properties[MONITORS$INDEX]} && $STATE != *NOT\ MONITORED* ]] then properties[RAW_MONITORING_STATUS$INDEX.$APP_IDX$RG_IDX]=${STATE// /_} if [[ $STATE == *MONITORED* ]] then properties[MONITORING_STATUS$INDEX.$APP_IDX$RG_IDX]="ACTIVE" properties[RAW_MONITORING_STATUS$INDEX.$APP_IDX$RG_IDX]="ONLINE_MONITORED" elif [[ -z $STATE || $STATE == *OFFLINE* ]] then properties[MONITORING_STATUS$INDEX.$APP_IDX$RG_IDX]="OFFLINE" properties[RAW_MONITORING_STATUS$INDEX.$APP_IDX$RG_IDX]="OFFLINE" elif [[ $STATE == *SUSPENDED* ]] then properties[MONITORING_STATUS$INDEX.$APP_IDX$RG_IDX]="SUSPENDED" elif [[ $STATE == *FAIL* ]] then properties[MONITORING_STATUS$INDEX.$APP_IDX$RG_IDX]="ERROR" elif [[ $STATE == *UNKNOWN* ]] then properties[MONITORING_STATUS$INDEX.$APP_IDX$RG_IDX]="UNKNOWN" else properties[MONITORING_STATUS$INDEX.$APP_IDX$RG_IDX]="ACTIVE" fi else properties[MONITORING_STATUS$INDEX.$APP_IDX$RG_IDX]="NOT_MONITORED" properties[RAW_MONITORING_STATUS$INDEX.$APP_IDX$RG_IDX]="NOT_MONITORED" fi done #============================================================== : Even if there is no value for a given attribute, we want to : display a placeholder for it, so the customer always sees a : consistent, complete set of attributes. #============================================================== for key in ${_COLON_ATTR_ORDER[application]}; do if [[ -z ${properties[$key$INDEX]} ]]; then properties[$key$INDEX]="" fi done (( INDEX++ )) [[ $INDEX == *0 ]] && (( INDEX++ )) done #========================================================== : If any searches/filters were specified, handle them now #========================================================== if (( $rc == RC_SUCCESS && ${#queries[*]} > 0 )); then CL=$LINENO search_properties queries properties rc=$? fi (( $rc == RC_SUCCESS )) && CL=$LINENO prune_indexes properties log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_appserver_attributes()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_appserver_attributes =head1 VERSION Version Number: 1.11 Last Extracted: 6/16/15 17:51:10 Last Changed: 6/2/15 13:39:46 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_appserver_attributes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query application [,,,...] clmgr -v query application NOTE: the aliases for "application" are "as" and "app". =head1 DESCRIPTION Retrieves the configuration data for one or more application servers. =head1 ARGUMENTS 1. appname [REQUIRED] [string] The label of one or more application servers (comma or space separated) that are to be queried. 2. properties [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2006,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #==============================================================================  kLh2+7b~bb&7 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_backup_profile_attributesupoup#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2018,2019,2020,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # @(#) 5f56dbd 43haes/lib/ksh93/hacmp/KLIB_HACMP_get_backup_profile_attributes.sh, 726, 2147A_aha726, Mar 08 2021 04:44 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_backup_profile_attributes =head1 SYNOPSIS clmgr query backup_profile {[,,...]} query => get, list, ls, show backup_profile => bp, backup_p, replication_profile =head1 DESCRIPTION Retrieves the backup profile configuration data for one or more resource groups =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. resource_group [REQUIRED] [string] Resource group name can be single or multiple resource groups. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. #============================================================================ # # Name: KLIB_HACMP_get_backup_profile_attributes # # Description: This is the main, FPATH function that is invoked by clmgr # to get backup_profile configuration. The cl_cbm_list utility is invoked # to extract the necessary data from backup configuration xml file. # # Inputs: See the "devDoc()" function at the top of this file. # # Outputs: The properties hash is populated. The only other outputs are # any error messages that might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the top of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_get_backup_profile_attributes { . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 5f56dbd 43haes/lib/ksh93/hacmp/KLIB_HACMP_get_backup_profile_attributes.sh, 726, 2147A_aha726, Mar 08 2021 04:44 PM : INPUTS: $* typeset rgs=${1//\"/} [[ -z $TAB ]] && TAB=$'\t' # Get the "properties" associative array reference, and initialize it if [[ -z $2 ]] || [[ -n $CLMGR_LOGGING && $2 == "|" ]]; then rgs= typeset -n properties=$1 else typeset -n properties=$2 fi [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== for k in ${!properties[*]}; do unset properties[$k]; done typeset -i INDEX=0 rc=$RC_UNKNOWN typeset enable_backup= rg= volume_group= replicated_resources= target_location= backup_method= cloud_service= compression= storage="" typeset bucket_name="" typeset backup_schedule= notify_method= encryption= RGS= output= resource_group= unknown_rg= available_rg= backup_progress= next_backup_schedule= typeset -i backup_frequency= typeset -i inc_backup_freq= typeset -A queries #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done #==================================== : Check python is installed or not #==================================== LANG=C cl_get_python_version 2>&1 >>/dev/null rc=$? if (( $rc != 0 )); then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1315 "\nERROR: Python must be installed for using backup feature.\n\n" 1>&2 log_return_msg "$rc" "$0()" "$LINENO" return $rc fi #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY else print -- "$0()[$LINENO]($SECONDS): cl_cbm_list" >>$CLMGR_TMPLOG # Always log command result available_rg=$(LANG=C cl_cbm_list 2>>$CLMGR_TMPLOG) rc=$? print -- "$0()[$LINENO]($SECONDS): cl_cbm_list RC:$rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS && $rc > 2 ));then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1197 "\nERROR: No resource group configured for backup.\n\n" 1>&2 rc=$RC_ERROR else rc=$RC_SUCCESS fi fi #======================================= : Make sure we have something to query #======================================= if (( $rc == RC_SUCCESS )) && [[ -n $rgs ]]; then [[ $rgs != *,* ]] && unset INDEX for rg in ${rgs//,/ } do echo "$available_rg" | grep -wq $rg rc=$? if (( $rc != RC_SUCCESS ));then unknown_rg=${unknown_rg:+$unknown_rg,}$rg else RGS="${RGS:+$RGS }$rg" fi done if [[ -n $unknown_rg ]];then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1191 "\nERROR: Resource group \"%1\$s\" not configured for backup.\n\n" "$unknown_rg" 1>&2 cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1192 "Configured resource groups for backup:\n\n" 1>&2 output=$(echo "$available_rg" | sed "s/^/$TAB/g") print -u2 "$output" print -u2 "" rc=$RC_NOT_FOUND fi elif (( $rc == RC_SUCCESS )) && (( CLMGR_VERBOSE || ${#queries[*]} > 0 )); then for rg in $available_rg do RGS="${RGS:+$RGS }$rg" done fi (( rc != RC_SUCCESS && rc != RC_UNKNOWN )) && unset RGS #================================================================ : Populate the return hash with the retrieved attributes/values #================================================================ for rg in $RGS do print -- "$0()[$LINENO]($SECONDS): cl_cbm_list $rg" >>$CLMGR_TMPLOG # Always log command result output=$(LANG=C cl_cbm_list "$rg" 2>>$CLMGR_TMPLOG) rc=$? print -- "$0()[$LINENO]($SECONDS): cl_cbm_list $rg RC:$rc" >>$CLMGR_TMPLOG # Always log command result # Resource group configured in CBM if (( $rc != RC_SUCCESS ));then print -- "$0()[$LINENO]($SECONDS): cl_cbm_list $rg RC:$rc output=$output" >>$CLMGR_TMPLOG # Always log command result cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1191 "\nERROR: \"%1\$s\" Resource group not configured for backup.\n\n" "$rg" 1>&2 rc=$RC_ERROR else resource_group=$(echo "$output" | grep -w "Resource_group" | cut -f 2 -d '=') resource_group=${resource_group// /} # removes space enable_backup=$(echo "$output" | grep -w "Enable_backup" | cut -f 2 -d '=') enable_backup=${enable_backup// /} # removes space volume_group=$(echo "$output" | grep -w "Volume_group" | cut -f 2 -d '=') replicated_resources=$(echo "$output" | grep -w "Replicated_resources" | cut -f 2 -d '=') storage=$(echo "$output" | grep -w "Storage_system" | cut -f2 -d '=') bucket_name=$(echo "$output" | grep -w "Bucket_name" | cut -f2 -d '=') bucket_name=${bucket_name// /} # removes space bucket_name=${bucket_name//\"\"/} # removes quotes target_location=$(echo "$output" | grep -w "Target_location" | cut -f 2 -d '=') target_location=${target_location// /} # removes space target_location=${target_location//\"\"/} # removes quotes backup_method=$(echo "$output" | grep -w "Backup_method" | cut -f 2 -d '=') backup_method=${backup_method// /} # removes space cloud_service=$(echo "$output" | grep -w "Cloud_service" | cut -f 2 -d '=') cloud_service=${cloud_service// /} # removes space cloud_service=${cloud_service//\"\"/} # removes quotes compression=$(echo "$output" | grep -w "Compression" | cut -f 2 -d '=') compression=${compression// /} # removes space compression=${compression//\"\"/} # removes quotes backup_frequency=$(echo "$output" | grep -w "Backup_frequency" | cut -f 2 -d '=') backup_frequency=${backup_frequency// /} # removes space backup_schedule=$(echo "$output" | grep -w "Backup_schedule" | cut -f 2 -d '=') backup_schedule=${backup_schedule// /} # removes space inc_backup_freq=$(echo "$output" | grep -w "Inc_backup_freq" | cut -f 2 -d '=') inc_backup_freq=${inc_backup_freq// /} # removes space notify_method=$(echo "$output" | grep -w "Notify_method" | cut -f 2 -d '=') notify_method=${notify_method// /} # removes space notify_method=${notify_method//\"\"/} # removes quotes encryption=$(echo "$output" | grep -w "Encryption" | cut -f 2 -d '=') encryption=${encryption// /} # removes space # Get backup_progress and next backup schedule print -- "$0()[$LINENO]($SECONDS): cl_cbm_backup_progress $rg" >>$CLMGR_TMPLOG # Always log command result output=$(LC_ALL=C cl_cbm_backup_progress "$rg" 2>>$CLMGR_TMPLOG) rc=$? print -- "$0()[$LINENO]($SECONDS): cl_cbm_backup_progress $rg RC:$rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS ));then print -- "$0()[$LINENO]($SECONDS): cl_cbm_backup_progress $rg RC:$rc output=$output" >>$CLMGR_TMPLOG # Always log command result else # grep for 'copying', if any of the backup process in copying state. backup_progress=$(echo $output | grep -w "copying") # Get next backup schedule in date,hrs:mins:secs format #f5 - date,hrs f6 - mins f7 - secs next_backup_schedule=$(echo $output | cut -d':' -f5,6,7) fi if [[ $backup_method == "cloud" ]] then properties[BUCKET_NAME$INDEX]=$bucket_name properties[TARGET_LOCATION$INDEX]=$target_location properties[CLOUD_SERVICE$INDEX]=$cloud_service properties[COMPRESSION$INDEX]=$compression properties[BACKUP_FREQUENCY$INDEX]=$backup_frequency properties[BACKUP_SCHEDULE$INDEX]=$backup_schedule properties[INC_BACKUP_FREQ$INDEX]=$inc_backup_freq properties[ENCRYPTION$INDEX]=$encryption fi properties[RESOURCE_GROUP$INDEX]=$resource_group properties[ENABLE_BACKUP$INDEX]=$enable_backup properties[VOLUME_GROUP$INDEX]=$volume_group properties[REPLICATED_RESOURCES$INDEX]=$replicated_resources properties[STORAGE_NAME$INDEX]=$storage properties[BACKUP_METHOD$INDEX]=$backup_method properties[NOTIFYMETHOD$INDEX]=$notify_method properties[NEXT_BACKUP_SCHEDULE$INDEX]=$next_backup_schedule if [[ -z $backup_progress ]] then properties[BACKUP_PROGRESS$INDEX]="None" else properties[BACKUP_PROGRESS$INDEX]="in progress" fi rc=$RC_SUCCESS fi #============================================================== : Even if there is no value for a given attribute, we want to : display a placeholder for it, so the customer always sees a : consistent, complete set of attributes. #============================================================== for key in ${_COLON_ATTR_ORDER[backup_profile]}; do if [[ $key == "BACKUP_SCHEDULE" && $CLMGR_GUI == "SMIT" ]]; then # Appending #! to : to escape : while parsing to smit backup_schedule=${backup_schedule//:/#!:} properties[$key$INDEX]=${backup_schedule} fi if [[ -z ${properties[$key$INDEX]} ]]; then properties[$key$INDEX]="" fi done (( INDEX++ )) [[ $INDEX == *0 ]] && (( INDEX++ )) done #========================================================== : If any searches/filters were specified, handle them now #========================================================== if (( $rc == RC_SUCCESS && ${#queries[*]} > 0 )); then CL=$LINENO search_properties queries properties rc=$? fi (( rc == RC_SUCCESS )) && CL=$LINENO prune_indexes properties log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_backup_profile_attributes()" #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ ion=$ lڇ2+ 5b~bb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_cluster_attributesibute  = eorst"$ACELMORST_acdilnp#)-:DGINP[]fghmuy(./;>HU\v&,01FVYbw!*2?BKkx{|}%'+34737 k6^A}`– X0X0A@H,$@H, y¥Nqf# &|T UD$&p+@'1[`Y$< `8"XՆ1Jl3ZƁT, H { d  fxH, `09@MNA$< `8"XՆ1Jl3ZƐ8ѩ\59Mu-.< O\;(aYSqotYO[Ruص]LRq⒙vj ǔxF@l[{`'ɸv]Ĵ^1fIb\۔ۓsfD\xDc3;E)IL5rO`k-LRVg)?:FKf6q!*G#38KQ tYpb33 M=F33H"ӥii@rѤv]Ĵ^1mai82y" +8 0RSu+?RtY˦Ӧ)XϜ_0yV%#>Z9Dl nPU=^%Zȿ"K9L*`'P_1Z -ήFfh[r|ì-%=<,F3Ja*)1BT FnF']U{l՝e%2ֱoe'rɘ]20'6j xA r04zHdUƦ&W4PaUQSsN74䇐DqCՋnN-WjE˲t.F'7YzFmIVf[3qp/WG~]jT? su4zi,S$Ks y\`! y\dɆu-ȬO\:Raq]<Ӧ)X.2 JG!JzSYs^zSDNE=er;.=5=j/+-ΙINzWq/7VY[XVQr'r 0ȬRlm,3f.!8ޠ\W$ꢲ-#dF<@Zp'xpgLgԴzUeۏ1{/q=Ɣܦg9Nŀ窾 7 [ʢ2phz~ i$EU=4Fj On.]yIO9bX9ED*Mޕr0aBEU=4s y\=$p`h$ *Sy+r0ErC"ACa8QCN{`1JwFt-8RZu-1?Bu窸ءP $GA MqzSYs_*< H,ɓ $'< p^(T?Z/Cf:5rSh OiiH~Ouż"K8R/д8(  ((@j†ex$,@+( 9XVQp6_:㸷pC+8PdI2,L pqf CNA$*IAHPjkY%x$,@+( 9XVQp6_:㸷pC+8PdI2,LpqfCsN$rC"ABa', S[agH,&ᡧ catȤS$KrS[&N-HrS[A24r2dH'PjkYzSX`9ApA D8#G+Ftz;mYXשh.L5S2z V^n/4fg(55 8#2^h'A:SZ1 Mc !Ǡn/FA2i N6%=A=ևrOqAq\_,G a!9WwBRz4f#Դvbh1JF--%ߩbqT?ߛW4XHG$<$&rȠ ɲ8g L MCNA$*IAeۋqrᡧ catȤ !iKz1o/f - s6_y'-ʅCXn\]3I1ʰ+ ca5-80 *0;ړzhCr;I4(A.h\j\h g@&朲 04bqz9TEUTTӁa"9! jbogP(?ۓф?ߛW4XHG$<$&rȠ -PjhȬO\8,abX9E¤|ˎ< MeCNA$*IA'=Ћ&i"R.]?Eog(54H XVQr'r 0ȬRlueqog  &˲xhi$X]2)(;CA CL?k8QZDEUTTf=]q2 JGPPf,yIL5 ћ ,zQcYb3Դv1J}esq*d(A.i<.DÂA& y\*M7@"N517/B*p,$Q$<$6LM*?# oF-ӱeZrfC5W$qvP +r &9VE|Lr&`0QUUxE\o̿BҮQc@a.RS.BtfC=K3^qi8X -LRG~\\uʙ xA r"r=p೐IE`74`hM&ȫLM Юiʠ* ni  S{8 G!L,[yZU [,?jŷ'"yu#ߛ,=#^E6+3 V- NPy8EYG̿BҮ5d*51ճNYfTrpH, .ŚD+Z[,zUߕ(AmD#0UrO.g#7YԌ[/7MWnM/kԳxCM˜HNIUr*j,(PgRz%g$<$ơǍfbqz8 74XHsNHyH(l?T?9ŧYv^oq*.c7;CMg;\ ͹fk9?Бi0͹=k3yf^m%x.O\LF2բѥg* EbmYʠy0,?e5Ř٭gybf8(  ((@j†rlX=ȴV37 9 E%xB,Hv^nP=r!2lX=ȴV3gP~n=\Ӂa"PI"(g&˕uP6CNA$*IA'=Ћ&i"R.]vp6Pa`EeB:Vr0?#ŋ9@ȇnC"Yc`/8%㈲鈆m2^6p%$H $Hee&LP#/8y$2F&(.鈉IGj# ELFYt@ $ Ɋa"˦#g,b!ab0L9ly7EC dgx3&L3hߜhIaTH 5vlDbMvOur4$簪$TY;5R302DKR3[bqeE~gW#BI`QUTF''gၐkSr6K'UՂef4W9?В ]U=U"Uvp.͠DF/VI %bhL,]1dɆu-\ ," H.TA@s @ȰQ'ff"l??~r~3%XD""a39Pj$ҌH9!іܞ?9-ޥ%q>E:7Z;Nc>^2Cg"KDYg0 il[,c@yM)ԴKԴ^q~ShyDowf"nRSZ8DӦ)X*nŀLrQQMEɓ Z/C™"Y{\ XAFq"0G(˴2aKE7iDHyH(L$ABV3iפ^dMCNA$*IA'=Ћ&i"R.]?e5(5aAAgn/2^8r &9VLJ8(  ((@j†m:̗3VAAAA ihi$X]2)(;d7dWjE˲tIOzMq E`͹C,{@ rdH'jOUnjFǫp,$Q#A  9dPPՅ A%VzM4m;&˕qobeycdZt+IU"N{LvEv\/7HJiLJ=%vM+Ŕ2n=ȴV37 9tȍ[N+008LzG! catȤae™"X˦DhBtYZd( 80Υ?f˦DhBtYZd( 8DǜYo0 [ ۔?)%ay@I"C(-Da2bd@!HNqewBRzOur4$A`yǐMBqd G!ܞ?_S9tȍ[N+008LzGC(!&3Sh:b)R˸nǑMf\yŗ]3r7\"13tqٯRȼ^T??ߛW4XHG$<$&rȠ w44Lr.sf+"yCKxh[q xîHh$~4qnnqe77$z :*ǫp,$Q#A  9dPPՅ vM+38 ȢxEQ ae444Lr.sf+"yqk dgEQ ae H,ɓ Z/C_#\[UQTz{ȢxBNYw1XOur4$ A`yTzD(=A(!L,X A$*U]0Υ?)%$"r?f z<-*pVˮQL G!Qr~r~3%L,D۔ed6 i6\k{S-'5]R/ 2X=ȴV3̙0Υ?ߜhItS"r.@'fBa3]oEҌYm@nRSYev8B.^qt v1JaM3\ 5X%*FB=qj䞦yZfuyX%*\!cV3֌\j41Y Zλ/7Sp@BX+YoV! J(Aر2a*r :bؤf"Q VgXC˜HNsE^(PgRzOur4$+PȰAF48%*.0~r~3%QXE5aQr?fhRޓq0O^0fAl›.Դwi8;# m48Bn6nN/E:6gdax;үfl9<,]D›zOlRޓq"KGig~4sQ3 EEDGh^6Our4$xz&zaTHT¨HM YeY;aRSޓq{8%^qy(1Yf5G+)ՋK2!rFD?ߛW4XHG$<$&rȠ J jH0zIZYL.4 Aǂt+W#@`jLA\-nr &9VLJN{LvEv\/7IUqII+C 1IƁt8[Nc0q*hӬXi8r4ŹpӐI1ʰdRPvAhlM8 q H䇐DNY 5aC3IUqAJu 2!rF hlMpӐI1ʰdRPwt"ɚnȮԋeƆ?)4]& (3h':<=u=q0$TXz*aTHz٦dEd MBqd G!ܞ?9S$K9]X\EԐ7&L3h~4yQnFiA+9! $< `8"îRN/ʎVSr4G+)CELFG+) 0~r~3%Q"QQN8e  `(!&3V5RkkW+H7iDHyH(L$ABV3i6\k{Sn%0X#ÏA2%3dhi$X]2)(;d7dWjE˲|C2iۉFL;V*xlX2ģ&pdbpKNɲc\[زq(ɇj\/z ,]ٛ%CsN$rC"ABa', Nɲc]Tg@dõbW 9dõbT@pӐI1ʰdRPwt"ɚnȮԋeƆ?)%{9dõbW&O Z/CήF <=%M*Nn%0X#G!8(  ((@j†m;&˕qobmģ&feaǠ}\44Lr.sf+"yqk~4qnmģ&feaذd?ۉFL;V' HճZvM+ŔۉFL;V' HÏA2%3d7iDHyH(L$ABV3i6\k(vN5J2aڱ8fXjFᡧ catȤE4ݑ]. ;XS$Ksq(ɇjYaz2xgRzOur4$5i.rh0+a.Nn%0Xk3,5#V?ߛW4XHG$<$&rȠ .V5Ž)vN5ÏA2%3dhi$X]2)(;d7dWjE˲|C2iۉFL;V' Lذd?ۉFL;V' L-;&˕qobmģ&fe&pLb>.*ǫp,$Q#A  9dPPՅ vM+38 mģ&fe&{@ӛFL;V' Lnr &9VLJ9Y3Mڑr8õ2Dog7vN5ɓ:~r~3!OIvAQ]P{QHy;9dõbq̰]d?97iDHyH(L$ABV3i6\k{Sn%0X,]0딮z ,]ٛ%CNA$*IA'=Ћ&i"R.]vHn%0X,]0딭l?ۉFL;V j:+g.V5Ž)v.uW=Ȗ.͒zE9! 0E XPͧdr3VJ2aڰXTa)^4QՂڣJnr &9VLJ9Y3Mڑr8õ2Dog7v.uW&O Z/CήF <=%MHz˓FL;V j:+Bǫp,$Q#A  9dPPՅ vM+ŔړE'dKifspӐI1ʰdRPwt"ɚnȮԋeƆ?e5Ź'UrOT\?ړE'e-;&˕qobmI\TÏA2%3d7iDHyH(L$ABV3i6\k('UrO1S/ǻ 9p=E}\44Lr.sf+"yqk~4qnlS}( C bbZvM+Ŕl)V(Q8#9efqP~n=\Ӂa"PI"(fӲlXUP+eXGl{@әl)V(QMCNA$*IA'=Ћ&i"R.]vpHs-*}8c༙0Υ?ߜhH "vQiFOur4$x]aa;F?ߛW4XHG$<$&rȠ .V5Ž)ڋ2LN.ŚG=E}\44Lr.sf+"yqk~4qne%6 f`ڋ2LN.ŚF i6\k{S))(e昜]4z 23d7iDHyH(L$ABV3i6\k(ڋ2LN.ŚG 8Xbqv,"IU"N{LvEv\/740aL,⒛Qb^iسHx/&L3h':< *H$.0?ߜhH"0)"zȓaQCsN$rC"ABa', Nɲc\[ز%gY0ԛaRÏA23f_fl7 9 E%xB,Hv^oha_#\[%gY0ԛaR`Vq I+K8%dr-YMXjMԩZaǠȳ/6Kq H䇐DNY 5aC6eƺ [%gY0ԛaRNd+&l5*VIU"N{LvEv\/740aL,J1ba6Ri༙0Υ?ߜhHʢ a]bvQiFOur4$xQEa.;FG!8(  ((@j†m;&˕qobrzE 0&idg"̾.nr &9VLJ9Y3Mڑr8õLF9="m4`(lӲlX,'P fq&Fr,͒zE9! 0E XPͧdr3W'P f izE 0&h ihi$X]2)(;d7dWjE˲|COur4$X'P fq H䇐DNY 5aC6eƸe9ƒ16.&yM=E}\44Lr.sf+"yqk~4qns$bmE]vM3W$qCqMˮɦjbSn3ZvM+ŔHڋ fI%6<8#9efqP~n=\Ӂa"PI"(fӲlXUP+i#j,2i'ی@ӧHڋ fI%61MCNA$*IA'=Ћ&i"R.]vpHtIQa]L<ĦgNLgRzOur4$+(zI(P *5I.^fܤX~RuJJq`]pHtIQa]L<Ħg̙0Υ?ߜhITVP=T`QTj*XHI,?);HήFEeAI%=qaEF;)8Ň'XD"c7"(!&4DbN8SzX.RSʸ#kY1Xp/W3m>&vweyIOrZ;F)Y]f#lfԞ^+jEv5HבMn V4 6&wAD 뮫 *5I4V3&mŀ=ήFbd#&Դ^\ ;4rn3Sg)MbӦ)XԴ^ۖu:9?nL,YtUapy{Ԑ7&L3hR5ߜhITHTz+Our4$A."Nk9?ВǪX X?2D':DW=vD#懐.nLgRzk9?В *<8rwwwwwwwwwwwwwwwwwwwwwwwwwwwpZ-IOe;>bY]-q#JžF*M_#\Yưz"AvAQW`G,H0@4^dzLk9`͹C_#\hx>63HǡzI I1ʰz몵l?@%.9ÃDhrdH'N,22Dog,GA8Y [˦DhpH'9e=^9tȍX'|\f (N)'X+5(Bn&r qY08ѩ\4$jf%=]פ{X+9|UuR4u-'rɚnWq˳^q#Jż gh)QNJ=.YIL5 Ǽgcaq颠z?W$.hՌeLwZ<^rrx^VkN?a= ^,\Դyl'6j-}!Pu,7\.w),Z-^9{rɘ{Ҁhafql*`'I1ʰcXXXx?rO2VX]tHq''k?(i?ZA/uSm5e޲F.Tl\ZJFn-MFjZ&y{f.gR=Գ5~rj4rSedRߜ)Ր.-W`'ړ՜v-* y^vR-SF̤]YtxĬ C|h3\vjomM(|\j=Դv_~r~n3XO˳P Xޠ9nޗSŪŰJ.R OGrSz-O[6L=K3] KӓMTM y'qY8͗ 'X+5t@=xg-U\-b/VfsN7461ΎI4!"Ex, @,h6e=ȰV5aLR ֳp bU  +A % Hٞ8 A, NE3a3@z !DI1ʰ ;)xrdH'k`;<鞳e6K,b4?e5Ź40lP`<A@Bg caq颠zx $ dNIUǦp A$*E@ /+tLr.=4T^DI1ʰcXXXx`@` LVL $XA1U@,,<ѰHNr &9VLkP< tp1BH'A$* `raa!9N &9VLkP< taS/Ƒ-ư\?e555THY&5fi iJMLmnMLF  =sq}ncV`ifS$KsIE`ɓKESr:bģES Pa`EeB:jbog* Ya05((?9~S88.dFV9tȍ[N+008L,Qq ˠG:L="9V ơǍf9Nk (:8pqX]ȍ[fq ˠG:L=B/0v*9f88.dFT.e[fq ˠG:L=B/0v*2i, (:8pqX]ȍYiRVMLF *Ӈ5LꅴlՓaS/ƑPupư)=P5dk=tXIAiÃDhBV٫&_#\Qa%YA[/7*}בM.+9|*n2iI@ ȭf.  &8pqX]ȍ QL0Υ?!ht8A104&ハ$3NxE`Yh6?)%{8pqX@8zCUDLgRz0 dbnr 0Ȭ2p7wwwwwwwwwwwwwwwwwwwwwwwwwwwwp}#Դz~3QW@ZTCjE˲}eppഁ`շ) {2\xr ˮ.:ˮ#Դt'0UrOR3Rf*ZF+Ŗeqe-?fԋe+-5d+]le%2a9?W Yx*n2i뢙x4zH٧. ifӬ;FJ"RMVB8LFEUI4"4zm:\šuhWDJP*3QqĬg(`yTzV}ffpflY@f@0 ۔?sN$rC"ABa', N*Jbڣk4[熜)zG)EUAD44Lr.i%])L[T~Mf{8QX\ӗE2#O\hӗE2(4zH.jǫp,$Q#A  9dPPՅ uhWDJSUmnr &9VLJ?˜HNsEbm}ު ,(V 9tS"4I |]3E2(4zHZ/CŔ]Ȣ#'AE.3AE.k 8 (;IA=&$+ 9 s (;(zh9UȬ0pPvUQVK 92,$qa UaTVIuI2Dog$M5THdɆu-\r@@8zCUD!2iaTZfaTVIuIPŽr@UCNxE`Yh?,YLL<=$rdH'|YLL<=$abg.dQUPhɓ ee3E2(4zH9@5h z `jbXqf@cH,:DḠ:\.=ȧI5gk7""˰-y^i40\x;IL/5!)RPwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwp]UYBa3#95Si#j9Yk catȤ9 E%C_#]EGaJI1ʰ~SIU"ǍatS"4zm:\€28F&X+9|(9N &9VUTgwzˬf]Ǚv^3%q* j~rj4h 朂IUǦ뛃A L?J{7pưp􆪉͹`kHh[q xîH';?J{7pưp􆪉͹`kloCBۈ[w@͹=_#\[l1"D$H"D$H"D$H"D$H"D$H"D$H"D&0˕J{.Դp-g#7&JFe"((*\pưp􆪉kVNY~3"QL0Υ?e5TaTZfè0 "L,EUU dɆu-&16]w#7#L.;\g9OL?vr0?#0)]سJz8 12[nQY3K3\̌m2?qkg* +-C.0haʠ C|YLǍaTVIuIC_#\[ M4=e;g ,>$z=4l=YbF3H ,@zCYbpGD9&M!Sh$z=4lӀ=e ၐjpH,pư)=P.Va@`qV 9YbQd?ߛW 9 E%Ck88.dFT-KPUBA#Xqhi$X]2)(:/)88.dFT-KPUBA#Xq(?ۓчG! a!9Ӎ ;^UAV[(3h7wwwwwwwwwwwwwwww(uޥYT^nBtLr1BRzǫ= kN+1F`yj:-ai7h AB=q xUל^.ļ^?9Jz.zL ,pKq ,?4`0XbV3Ha/`#^p))O\dzH`i($z0*ǫp<ǃVz JLnHNG(A~]EI=e[+tY{C(aji$zrJ74Ysa dbg$Uy2aKE%rJ [N5IATq`h$ g$Up(?ۓч0, PԴ^q"&t#zY0?ߛW4hꞸvT9J]xXr?Jx?q=ezmǫp<ǃVz JLn2De3PpU*g<0Υ?9%RsdH'i$Ux04ee3PpU*g8r(!슱8` 8õ74XHsNHyH(l?TN)V56!: &9VYB$G(V (g٠azy =sAD<r }, P ߛV'Em>&Xm(Bn&r >E. &qSq'jzKGv٫b&5fZEfb딯"l՝\[R.ܤ[LGMр)%0 !@Lưp􆪉 ĤgYlx"d s}e517'Z;Q1yZ8Aҳ{QP^n-xRE.0>2i&5fp22i55THYL?e55QX=%`=$l_#\if4٦Y 4kwA#Z62ia0Gl!RSƞg ՘zmǫp<ǃVz JLn?fA#[qF=eӀ=e#"d02E&zC/U;)),2; H ?W$Vh # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_cluster_name =head1 VERSION Version Number: 1.5 Last Extracted: 1/31/14 04:40:14 Last Changed: 6/10/12 15:22:16 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_cluster_name.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr -cSa cluster_name query cluster =head1 DESCRIPTION Retrieves the name/label of the locally defined cluster (if any), and displays it on STDOUT. =head1 ARGUMENTS None. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_get_cluster_name { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.5, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_cluster_name.sh, hacmp.assist, 61haes_r714 : INPUTS: $* [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset name= typeset -i rc=$RC_UNKNOWN rc=$RC_MISSING_DEPENDENCY # Assume the worst until proven otherwise! print -- "$0()[$LINENO]($SECONDS): $HAUTILS/cllsclstr -cS" >>$CLMGR_TMPLOG # Always log commands name=$($HAUTILS/cllsclstr -cS) print "cllsclstr RC: $?; name == \"$name\"" >>$CLMGR_TMPLOG # Always log command result if [[ -n $name ]]; then name=${name#*:} name=${name%%:*} if [[ -n $name ]]; then print -- $name rc=$RC_SUCCESS else rc=$RC_ERROR fi else rc=$RC_ERROR fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_cluster_name()"  kꚞ2+" b~bb&" # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_cluster_nodesut#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_cluster_nodes.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)33 1.4 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_cluster_nodes.sh, hacmp.assist, 61haes_r714 6/10/12 15:22:17 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_cluster_nodes =head1 VERSION Version Number: 1.4 Last Extracted: 1/31/14 04:40:23 Last Changed: 6/10/12 15:22:17 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_cluster_nodes.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_get_cluster_nodes =head1 DESCRIPTION Function prints to STDOUT the list of nodes in the cluster. =head1 ARGUMENTS None. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_get_cluster_nodes { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_cluster_nodes.sh, hacmp.assist, 61haes_r714 : INPUTS: $* [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset node= nodes= typeset -i rc=$RC_UNKNOWN print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clodmget -q \"object = VERBOSE_LOGGING\" -f name HACMPnode" >>$CLMGR_TMPLOG # Always log commands for node in $($HAUTILS/clodmget -q "object = VERBOSE_LOGGING" -f name HACMPnode) do [[ -n $nodes ]] && nodes="$nodes " nodes="$nodes${node//\"/}" done rc=$? print "clodmget RC: $rc" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR [[ $nodes != *([[:space:]]) ]] && print -- "$nodes" log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_cluster_nodes()"  ld2+Ub~bb&l2 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_cluster_stateut    =e inrst$AENOSTacdhlo"#()-CDGILMRU_fgmpu,.0:>FP[]bvwy*+/12;BHKW\|!&'k3479?@Vqxz{}%56oY֋jUUUUUUUUUUUUUUUUT\XLqqb.W<4$ȣZe.`V(*h,UBT\uATh@\L&&]%h/QTDˤ&4Hi%Az%&Zz&* wN\x 4J,UH`/.T@$h-y@C,3g lL.NbSZwpwȾŞ4p I=DH&kNvl\Miec|6,Hڰ3g lL.NbSZv/ VL6ZZa S4QO͛nS8r֌^|,';x *HJL>x hi $X¥C&K m^yhslYb.@*) "OxX&)&"4 DT MEvv05a:c|7>7#6.mWdO CO P"*Q2NQTFPHw+wȾŞ4p I=DH&eఓW;787v1O֝)٨#R5J+ږRM*ųyT+nRxWٳg`֛ۀ!vl-(^yI0Pw4,@-^/w_ 8@E$F$H3֝g / S b".7n:IG|3qBi"0 ^n"Q@R%$M"T,^F!S0I2(wW"b" l* .T@$EJ6/w ea[2jמւ ;,[7˳-*8ѹ_0rQLp q |*D`B5p4 8s3UQ0 2Xe_6n7DdgQTG $M"@lDD͛ƍHD|pO3g ``5EPD"ɓHD%QT& b$M"AbDDi"8 pwѺI*@89*XEPIHb" l4n]"$$Hn7.9$2R !*UHiT"pqBi"8 pwѺa iq ATz j A,6"" F AgQTG$hr"D"bɖDA|ٸ;hœ,;y@C=EPU*0!LD$. (D&4KI"i,X%$SIlDD͛ƍLT gQTG*HDfrA$ "Dw+wѹt&Hwpon 5,JlSͭ9d6\wÛ7.+Eg aB"l*H`iq ATp"4dH"bɖ&q2E"D"]"$$HDp$ 3*HEX &/wٸ;_ 8@E$F$H5\ Lmfx;+A vSl<PB*HJLislgP.2i |0j NゃCO P"*Q2XG59x m^9xƎ<4I1"lXfz1ᡧ(Tc (';quͰb+Yb.@*) ڵ=pmZZ8V XMfٜ[ wf+O|zN͕`1nƻ+@ea;ĮY w4,dH[̽^GXW7VXf[6_,ڰ*N휸7Vo| kM|9x$&V7;+a?q;µY|6E|i]5f35͛ͭ Ư| kM+)bwmboMpZY gg͕͗Xȶ6+eh1+]c ma ea;Jk46o63lqg #jc 9pbฮ3kC8-{p:m`/6ٶmi}hf֙ٝvV|ٽ@H=5 כۆl%y[)8c2U Ж֧g/Ng.+Mw͕͛p2M7 &51+9=+3|ֆqcW[2-H[ fdH󵍅8cdp7 p ;3g &aNkA c`w-mWmv pʪ;bd[_ @\4ʼn uPh sYNQsqB`0javwӷnmf:aQh٨QmEPUvSͬ'" Ti9'n/v'qٽvwq9kn5x O[RWǵ-v85T;Z k54\پ7#NAZ۵7 +plR s0M"jQS 4IQTw  "EL&'*`yHDbD0Xc0u87KX\qx{}79?FYz|%5V8@QW Zj8&d0Xa4ɕ@<٤ gb㋋Z z)j8`;[!sM`,۟8ќaKa<آأ"7^2f{@PEqc.l^b`(PT0cȔ0FJ @Pș@0+bRr \X\ؽ)/E6n~b`FrŇ%,"+bb؈=X F՘Lu,]I?J<2҄H.PEk[X? AXHrV.?`a'x<XآԑQ8XZ2",, -?WNp>#%,]I`L(l?'6OUlpӠ((G"RƐłED!')G&TRPA"d MAj x̿ UQ,sPE͋ܢo ǀ\( "Hɜ009iASa"PPLIǑ((&aC"fq`70`(+I UY{@PEqc.l^b`(PT0cȔ0FJ @Pș@ aDV.UF"ȹ{R_={B0 <0[XyBeI- "(]Uf_ c+bRO6a{(0  XآԑPX00oǂK[X*= FDE1a`68inx$E", m꽍thP*XH$˔&DeDSF (H;2bS(ttiK+/&H L 8Z \BdH&XK4`BɀH$&`eDyJ LHUV_LK4LPD &TH-GX@?{œR Q%Cɕ$ QV,8ESr`*Xb \$+HC `L$(H'd "hLT $$-/cF4,^Tosgs|UU7E͋ܢahşUh Uo\e ):<]R<+/&@ 0HH[MpO|?uEg[ޱiMƓb).+.✟R.h{e..E%ǟS!$h$`sKJc(RNw+/\XUY[k^eΨ~ #֧/{nE|~ YE)o8ѝ'L6<,A{%6H 㓾A|4g1P)KcU;ip\198G^򖔫-JZޓ]AB'|Xm [O6))qvqqE=m\Vy9ZB9baGDp`DMqc01bE66ash, L )`qba/Ϩ;$ԷIHȓ ͝j1cy玶mmmmmmmmmONsnQG 19-. dⱇrnz3ю[R[҆4llRvCKb8afd1uO@E j+~Nqx-HۍNslRA{9&EƘ]Ȃ-Ƙk):mmmmmmmmmmGMPXbvw{}'*,.01;FH\|!%34BUYkq579ei/=;*G0`(z [Ӹfebw5n*"H<cJi,r  I ``$0 {Yg,g',)lnE.0;pJ,qz26rr`Ty^{Pڎ#Ѿ7)I9lfMBqYy⯙ $C$[n,TP(Lɂ!4Fp Os\xX# 8[ LȒ2nensV3ӹp@ 2ŀ `pu,0^" p X&AI7s2ŷpb+Nqxܜ5rw%8o3Y&^oj-=Fc?qpZ2ͯ>7&E{ţ[w. MD{PL7ۋKܤڋ-3if&ڋ ƻ16ŷpbo|-mvg3 ^%ai p ҃g /wBm.8x/7 i9xSGvs8f͂5r70rwZG7m2V`AS9q=6NZѷ ŨnRX˙ŧy)\7-s=H7\1j2֍\y\E_+CYqzӷ 5 qkY׾\ng `Wms9xȘ&37 s9x,PK34z CZ|^&ݣ\>Yy3kA]/Y r5vN)\6ƏAy` @IyB&M̱m.|Ӝ^&zw,Yy%0F'c H=PG !p ^&H,AD $Lb۸1p\8L@08`0Lq`@bx,ူf ;7I1(pC3ܮ{``XX@`X79xw3ZRiw7^b6jp^:c|75@t5U!E2$P@~d_ČDww+@ Omv-rMjw-rњƧqbۓ},dȘ#NW2;7HִFMƥ|^z`{77x݆(' S@QfO_U(7˃֜H ,j bӜFgV.\>Y۸iJ hb‹2zƂ(\c=8Sw BUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUN QسON kj|^*h`w"DE2Iҝĝ|-8vZ2\ $I\Č$\I&)E2@[6,_#ѼV _&>'6l֢h1m.UPo3)HI4S+&AI|hVX \?Ans12h4S$%,P.e5ČD|xo3&BZ2]2 \< `p,X`` BC6pjzͷkG]`(B1m.|f  wl%Hyc%1Hyc" 3DQg7 \}4!`;g۹\{+ n$R(hWLȒ23,[w. (XMw`a ,Vf*.  i5‹=ٵz X rɵU7˃ۋ<`Bh ,(XMQ.1 wW 2SA@ɻeòE%!aiJð^;Tپ67a֢h1m;nb me5UGEMS&dD$4D1m㋑Dt"ƴ78 {`nYtLk [;;ˢ`857 q^ojfXyW,Y>D2;g۹\ ;mUUUUUUUUUUUUUUUUU;7'koZ ox(^7'w+D)4t"!0 4S]Ϋ40Cj r D`X^Fqena[iZojlۄ *O4N0NZ⏱[c|5:'q5~Y>7JLh⏱W#ܦ,Qq{P*LuiMD{P֍kwXi|(dDpm'`&y H)D9 ]/"C7iÓ:E2"8k=[yQ[j3ZJMG| 5MC|Znm[vN6&X3& 5g,ٰ<7nYզ^0Qכچgl8oj<>[gRV`嚵z7-,ulvÆ>Xui{B)qL_}i𝱴z|->g-fۋK.s8\7lbvǥn랔;q\qaKJk23Zk4l&ỹm.jաMD{PZ<m`3pX:޾ro5kLohֻ'Mkˁi.~V37 ;J N`,`fr2rg-Q:7Ù.TDE;n{pU9V| 5M@z7hVÆg"dANPl 8kOMӐoPSnZz0oj{;6;F`{mUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUS{PرBm/;7K bypcG-fdDsQ $ei/=;G-fp-2%.ktp4ŷpb1m.|97ض \>i0o3֖i \>3|XSG-f4K,)rrځ=5g/v>ض \> s3"X< E3 ض \?Y,5u%8wqXN 5[w. .ӫmEmeV?ŧ\O\_l0-BȀdIqifwkJM.K֌V?g T9h/6k]hbwz097SG-fdLEsXoZ[\yg/i{PmZ2qaKܤh.ٻf{Zqim.vɻ]lq4z+W. OLv2iaɣύ *nM;c|=v(:ڎ(eҙf۵>g/ 8nѮg/4lg/6x5 # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_efs_attributes =head1 VERSION Version Number: 1.3 Last Extracted: 1/31/14 04:41:39 Last Changed: 6/25/12 13:56:04 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_efs_attributes.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr query efs [,,...] clmgr -v query efs NOTE: the alias for "efs" is "gp". =head1 DESCRIPTION Retrieves the information for one or more user efss. =head1 ARGUMENTS 1. efs [REQUIRED] [string] The label of one or more efss (comma or space separated) that are to be queried. 2. properties [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_get_efs_attributes { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_efs_attributes.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset efs=${1//\"/} # Get the "properties" associative array reference, and initialize it if [[ -z $2 ]] || [[ -n $CLMGR_LOGGING && $2 == "|" ]]; then efs= typeset -n properties=$1 else typeset -n properties=$2 fi [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== for k in ${!properties[*]}; do unset properties[$k]; done typeset -A list MODES MODES=( [1]="ldap" [2]="shared_fs" ) typeset -i rc=$RC_UNKNOWN typeset DATA= CL=$LINENO KLIB_HACMP_is_known_efs if (( $? != RC_SUCCESS )); then CL=$LINENO cl_dspmsg -s 129 cspoc.cat 75 "EFS Kesytore is not configured.\n" 1>&2 rc=$RC_NOT_FOUND fi #================================================================ : Populate the return hash with the retrieved attributes/values #================================================================ if (( $rc == RC_UNKNOWN )); then print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clodmget -q \"group=EFSKeyStore AND name=mode\" -f value HACMPLDAP" >>$CLMGR_TMPLOG properties[MODE]=$($HAUTILS/clodmget -q "group=EFSKeyStore AND name=mode" -f value HACMPLDAP 2>>$CLMGR_TMPLOG) print -- "$0()[$LINENO]($SECONDS): clodmget RC: $?" >>$CLMGR_TMPLOG DATA=${properties[MODE]//\"/} [[ -n ${MODES[$DATA]} ]] && DATA=${MODES[$DATA]} properties[MODE]=$DATA print -- "$0()[$LINENO]($SECONDS): $HAUTILS/cllsres -c -s -g EFS_KeyStore | /usr/bin/tail -n 1 | /usr/bin/cut -d: -f2" >>$CLMGR_TMPLOG properties[VOLUME_GROUP]=$($HAUTILS/cllsres -c -s -g EFS_KeyStore | /usr/bin/tail -n 1 | /usr/bin/cut -d: -f2 2>>$CLMGR_TMPLOG) print -- "$0()[$LINENO]($SECONDS): cllsres RC: $?" >>$CLMGR_TMPLOG properties[VOLUME_GROUP]=${properties[VOLUME_GROUP]//\"/} print -- "$0()[$LINENO]($SECONDS): $HAUTILS/cllsres -c -s -g EFS_KeyStore | /usr/bin/tail -n 1 | /usr/bin/cut -d: -f15" >>$CLMGR_TMPLOG properties[SERVICE_IP]=$($HAUTILS/cllsres -c -s -g EFS_KeyStore | /usr/bin/tail -n 1 | /usr/bin/cut -d: -f15 2>>$CLMGR_TMPLOG) print -- "$0()[$LINENO]($SECONDS): cllsres RC: $?" >>$CLMGR_TMPLOG properties[SERVICE_IP]=${properties[SERVICE_IP]//\"/} rc=$RC_SUCCESS #============================================================== : Even if there is no value for a given attribute, we want to : display a placeholder for it, so the customer always sees a : consistent, complete set of attributes. #============================================================== for key in ${_COLON_ATTR_ORDER[efs]}; do if [[ -z ${properties[$key]} ]]; then properties[$key]="" fi done fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_efs_attributes()" =hea k~ 2+<b~bb&< # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_event_attributesuteste#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2018,2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r721 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_event_attributes.sh 1.4.1.3 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2012,2016 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_get_event_attributes.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #============================================================================ # # Name: KLIB_HACMP_get_event_attributes # # Description: This is the main, FPATH function that is invoked by clmgr # to collect event information (both custom, and pre-defined). # The cllscustom utility is used for retreiving data for # custom events. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The properties hash is populated. The only other outputs are # any error messages that might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_get_event_attributes { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : INPUTS: $* typeset events=${1//\"/} # Get the "properties" associative array reference, and initialize it if [[ -z $2 ]] || [[ -n $CLMGR_LOGGING && $2 == "|" ]]; then events= typeset -n properties=$1 else typeset -n properties=$2 fi [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== for k in ${!properties[*]}; do unset properties[$k]; done typeset EVENTS= event= OUTPUT= typeset -i INDEX=0 rc=$RC_SUCCESS typeset key= value= typeset -i matches=0 typeset -u uc_attr= uc_key= uc_value= typeset -A queries typeset -i i=0 #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then uc_attr=${value%%=*} if [[ $uc_attr == "TYPE" ]]; then uc_value=${value#*=} queries[$uc_attr]=$uc_value else queries[$uc_attr]="${value#*=}" fi fi shift done #======================================= : Make sure we have something to query #======================================= if [[ $events != *([[:space:]]) ]]; then #============================================ : If they did not specify a particular type : of event, we need to check them all. #============================================ [[ -z ${queries[TYPE]} ]] && queries[TYPE]="ALL" #===================================================== : For convenience, support wildcards in the provided : name list. This is equivalent to using wildcards : filtering via something like NAME=some_search. #===================================================== if [[ $events == *[\*\?]* ]]; then typeset object= newList= for object in ${events//,/ }; do if [[ $object == *[\*\?]* ]]; then unset available typeset available CL=$LINENO KLIB_HACMP_list_events available ${queries[TYPE]} NAME=$object for (( i=0; i<${#available[*]}; i++ )); do if [[ ",$newList," != *,${available[$i]},* ]]; then [[ -n $newList ]] && newList="$newList," newList="$newList${available[$i]}" fi done elif [[ ",$newList," != *,$object,* ]]; then [[ -n $newList ]] && newList="$newList," newList="$newList$object" fi done [[ -n $newList ]] && events=$newList fi [[ $events != *,* ]] && unset INDEX for event in ${events//,/ }; do typeset TYPE=${queries[TYPE]} CL=$LINENO KLIB_HACMP_is_known_event "$event" "" TYPE if (( $? != RC_SUCCESS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 465 '\nERROR: "%1$s", of type "%2$s", does not appear to exist!\n\n' "$event" "${queries[TYPE]}" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 171 'Available %1$s Events:\n\n' "${queries[TYPE]}" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_events available ${queries[TYPE]} for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND dspmsg -s $CLMGR_SET $CLMGR_MSGS 172 'Available Event Types:\n\n' 1>&2 for type in ALL CUSTOM PREDEFINED; do print -u2 "\t$type" done print -u2 "" else [[ -n $TYPE && -z ${queries[TYPE]} ]] && queries[TYPE]=$TYPE EVENTS="$EVENTS $event" fi done elif (( $CLMGR_VERBOSE == 1 || ${#queries[*]} > 0 )); then #=================================================== : Since there are so many pre-defined events, only : display them if specifically asked to do so. #=================================================== if [[ ${queries[TYPE]} == *([[:space:]]) ]]; then queries[TYPE]="CUSTOM" fi typeset available CL=$LINENO KLIB_HACMP_list_events available ${queries[TYPE]} for (( i=0; i<${#available[*]}; i++ )); do EVENTS="$EVENTS ${available[$i]}" done else dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT fi (( $rc != RC_SUCCESS )) && unset EVENTS #================================================================ : Populate the return hash with the retrieved attributes/values #================================================================ for event in $EVENTS; do properties[NAME$INDEX]=$event #======================== # CUSTOM CLUSTER EVENTS #======================== if [[ -z ${queries[TYPE]} || ${queries[TYPE]} == @(\*|A|C)* ]]; then print -- "$0()[$LINENO]($SECONDS): cllscustom -c -t event -n $event" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$(cllscustom -c -t event -n $event 2>>$CLMGR_TMPLOG | grep -v '^#') rc=$? print "$0()[$LINENO]($SECONDS): cllscustom RC: $rc; OUTPUT == \"$OUTPUT\"" >>$CLMGR_TMPLOG # Always log command result if (( $rc == RC_SUCCESS )) && [[ $OUTPUT != *([[:space:]]) ]]; then print -- "$OUTPUT" |\ while IFS=: read name type desc file relation status; do [[ $name == \#* ]] && continue properties[NAME$INDEX]="$name" properties[TYPE$INDEX]="CUSTOM" properties[FILE$INDEX]=$file desc=${desc%%+([[:space:]])} properties[DESCRIPTION$INDEX]="${desc//+([[:space:]])/ }" done fi fi #==================== # PREDEFINED EVENTS #==================== if [[ ${queries[TYPE]} == @(\*|A|P)* ]]; then print -- "$0()[$LINENO]($SECONDS): clodmget -q\"name = $event\" -f \"name,cmd,notify,pre,post,,desc,catalog,setno,msgno,error_on_fail\" -n HACMPevent" >>$CLMGR_TMPLOG OUTPUT=$(clodmget -q"name = $event" -f name,cmd,notify,pre,post,desc,catalog,setno,msgno,error_on_fail -n HACMPevent 2>>$CLMGR_TMPLOG) rc=$? print "$0()[$LINENO]($SECONDS): clodmget RC: $rc" >>$CLMGR_TMPLOG if (( $rc != RC_SUCCESS )) && [[ $OUTPUT != $event:* ]] then dspmsg -s $CLMGR_SET $CLMGR_MSGS 466 '\nERROR: the specified object, "%1$s", could not be found.\n\n' "$event" 1>&2 rc=$RC_NOT_FOUND break fi if [[ $OUTPUT != *([[:space:]]) ]]; then print -- "$OUTPUT" |\ while IFS=: read name cmd notify pre post desc catalog setno msgno error_on_fail; do properties[NAME$INDEX]="$name" properties[TYPE$INDEX]="PREDEFINED" properties[COMMAND$INDEX]="$cmd" properties[NOTIFY_COMMAND$INDEX]="$notify" properties[PRE_EVENT_COMMAND$INDEX]="$pre" properties[POST_EVENT_COMMAND$INDEX]="$post" properties[PREPOSTFAILS$INDEX]="False" (( error_on_fail )) && properties[PREPOSTFAILS$INDEX]="True" if [[ $setno == +([[:digit:]]) && \ $msgno == +([[:digit:]]) && $catalog != *([[:space:]]) && \ $desc != *([[:space:]]) ]] then desc=$(dspmsg -s $setno $catalog $msgno "$desc") desc=${desc%%+([[:space:]])} properties[DESCRIPTION$INDEX]="${desc//+([[:space:]])/ }" fi done fi fi #============================================================== : Even if there is no value for a given attribute, we want to : display a placeholder for it, so the customer always sees a : consistent, complete set of attributes. #============================================================== for key in ${_COLON_ATTR_ORDER[event]}; do if [[ -z ${properties[$key$INDEX]} ]]; then properties[$key$INDEX]="" fi done if [[ ${properties[TYPE$INDEX]} == "CUSTOM" ]]; then #======================================================== : Remove attributes that do not apply to a custom event #======================================================== for key in COMMAND NOTIFY_COMMAND PRE_EVENT_COMMAND \ POST_EVENT_COMMAND PREPOSTFAILS do unset properties[$key$INDEX] done elif [[ ${properties[TYPE$INDEX]} == PRE* ]]; then unset properties[FILE$INDEX] fi (( INDEX++ )) [[ $INDEX == *0 ]] && (( INDEX++ )) done #========================================================== : If any searches/filters were specified, handle them now #========================================================== unset queries[TYPE] if (( $rc == RC_SUCCESS && ${#queries[*]} > 0 )); then CL=$LINENO search_properties queries properties rc=$? fi (( $rc == RC_SUCCESS )) && CL=$LINENO prune_indexes properties log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_event_attributes()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_event_attributes =head1 SYNOPSIS clmgr query event [,,...] clmgr -v query event NOTE: the alias for "event" is "ev". =head1 DESCRIPTION Retrieves the configuration data for one or more PowerHA SystemMirror cluster events. =head1 ARGUMENTS 1. events [REQUIRED] [string] The label of one or more events (comma or space separated) that are to be queried. 2. properties [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== fi l0"2+1b~bb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_fallback_timer_attributesupoup =e airstcdhlmnop"#$ACDEIMNRS_bfuy(),-./1:GLOPTUY[]gkvw025;>BFH&'*+346JKX\qx{}!79w"!G84K$PS4R&{P:襖ɬv˛2&$&"lI!@(  |pـrn87 PQp4H%fXGZ|, "fEl^j9c $/4P 0TBBDXɢ (H]>ci3 g(f"hXBB03G.&`!qEE(H\{?<*PSE g3G4Ph!%,f"hdz)>c\ Trܐ$/p0Xa+&+s` F 2&zXBNk.>T, cYXJ%<HBA0 ȗ$d{?n-8Ж#0A^.YQqhYINTk z^}-mmmmMq1\\JUg՟K+%a& Yĩ" "aDˊt ε45qr\O&?w Ȁl\3f*h ┪`!&$\DɳEEr$ċ6\Љ< `=RLǀyZavVt"@@lyIx<RXd2$ċ6hDq&˚5@N<\N'8Aq R_=P=Qx8>cqMD*`OD̈́I.(m7B&ε45qrmkiV~)HGq9A0n ‚+3q$ƹ6NFdp.$@dd+JUgr|HMki`A1:cdzR&I0&*l &,`?8K?K*dDTrMdb%uEeew ɉ2l24W '" K0A<oV+03D0DHBH*LLCAB KY7  n08Dq&K TrMR!(')/]d܁1npúnBܬpyPHP"  "h13 h')/]d܁1 H.Tɠ8Dq&K %u 5C"LHfI2lXx(*dș RCiOP#w8e=P=Qx8R&I.XѢM0(,*c?Br/CW2L١bdʚ5`( VTrM1-mmmmmmmY!,zMX뢗|Glb=pS=0g mmmmmmmmY\rRʙ4 Y Ǒ ,`1&0PPqrMG ;GG W#)/I2lT&:XkAej BPN.R^ɹctx(b%L]V8`f<($(`cL 4T4n@d"% I2lT&:XkAej]V8`fmcYXvdl-?9Sј3^_L .Tc 4RY^_L *HT iU gEUB{q*FpzI "XBpKdzw. DŌ,`P8fIcgYy|]0.XR%* *9Sј1-mmmmmmk?3NU dO!sц?53 JsчqIZ9J;c4󇣧-G *tֱz!lՔ&k[YTJwr8c53mmmmmmmAyU V^_Lʒ2D@Dzq3%* +0EEC ?E@@3]// M.D@EELzBBˉ,`P8fEͬtڋ+  ޲`0\LDc 4$( Qeb&$'QebaALzq3f,`P8fQeb?޲`0P0fB$K(TQik6&AQebgµ޲`0P0fB$K(TQik6&!:+# g^_L 0,\c 4+ vdm3^^_L 6&6 H0P3HH̍EA6et`!sba` P4فbK(TGfF͢Y0j Eee (T() p( *FVVXmmmmmmmC,wjK^SN2c༠㮔B)MUYBmmmmmmmzf &TѬr @d+ JUg1*DHK^Fza D3𐜋̓6hX2aAX ĩ" ydەFA^_L6mH cȽ "E0&=z O!Uc4Hu&sKqJsB5PWP"rsДw+Q å0*!X //l\9!|GFWQP?Uhfm༠㮔xK^Yֹ9Gڍ mTb2-D?&&(.dDU&&(.dDW,e.YVA!j 9YMgA`Px1O2ᤣ ^9(`'ʪz28QdB!mmmmmmmmmm*VM5\^)*8 eE+r՞,^1ԥ^): !rs8ʍBn*MdjM]ykNJSK,!wSrr)O(+?riGtBM<Ug!!mmmmmmmmmm$ O{q9nUV!i(2!CN!L!UmmmmmmmmmXCrZrYzpIb:bWjŧBmmmmmmmmmm` l$2+Hb~bb&+ # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_file_system_attributese    =e inorst$EL_acdfhlp"#ACDIMNOPRSTgmu(),-./:;FGUV[]bvwy&*012>BHX\k{}%'4KZq|!+35679#w?<$!`@LGV3qBDŽEu`oٹ\֓9t8v2nEJ$H8v&U ː&b1nW<52+y)"E&sET TwP%fsNqm !n.7clܮy $@"hC4P"f`ḇ(LI!l SaǞ9fs P E y0 9FbI `ei\byr(@zU(G"P(`Jꪪ@#LڎY֮ l7C&z:C3kWv7{vlsUUUUUUUUUUUUUUUUUUUUUUUUSƗsg' ՃS`Cal;}VF..#{{ӜGS`=~?7.kYYaۋBǧ9^M<A1YZmVoMnk[zlxO3DO;+& s^M7UoM;Ea&$ɶVf4_Q6 1!ag |&AQv`aۋ\׽ ޣe;ot`i\c\׾OM/ 4ùA)jWb~4sƯQ7F9|2^9[ s^v/o)*@qc[ f&oŅE#%H2,ko׷bh 2Ts Ƌ47XjJ.dXrظ52Ts Ƌ4}>Cxz!zlxNMYrذ,%H2,h@Ȣ 4NbocHs]Nk#jF9x0j@JHe4mFzV?ܢrzlxO<f9(nx7&k"L87sIFwჳjA[ 짰^?qMܢlj0vSa@ޮ.AQ~inMnLpØtHps؂~(cVv8cPF vzsoNz of`oLo9 cK=g1|;9,jxŹ3v07{oe;|r=6d''.iotb|[ @B@T"Nxrr#jF9|2^omωrpHBt8v&ޙ ճqp8rةxt-FR”b 7sVS`@q4|M3*Kzg.K"(Q.;"PnP;,-B:zg/s”b 7sVS`@q4|M3*Kzg.d`JbX7r*@*Ixo17,a% A!3 L$|M3cn3uXbH* =eP*Xss;瀦}UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUS2+ځhGOVs]Fw7ݫ|:k>Û>Q&UHe;+Yϵ[尠*Hȡ(3^G"BfL*&$ TH}UUUUUUUUUUUUUUUUUUU7C(FW˚yp÷[_˖..#{{ܶ,-EJ$H5rذճ P" E \\Gm|QJ0+oLX[ ~z" *FsHTLsً ܃c؞Bx0H.HDC4B0$MRx o1s<,z$ʠTQP"X#!b$Ē6PEA0yJ HBo,H.DC}Di0`H(`aQ(&a#E XMQ@QB o+oJ*QdP okܶqTU"B$P2g 潽[ ȢkD4B Q9@rD &m5lH.HDAÖŅ*..#{{("QFlDDU!Q1(\D[[("QJ'Car ͧp:SAcZOL@8-ɓ7<%$eYQ(&a"D$Ac ^$/27)xp[[\ᡸ("ЃƗsWDTu`alICUb;mDT($ʠpo 찚Vg(s^p9q`i1r5 :S3Rb||Ӝჳ7}UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUSքp~xI"%,U"HHYZRLGV UP4PLD\_ mrذsL f됱UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUMY ޥilkF5]&XLl3N7ec [9Úv1Y_!NsfÛ>[ 33qBƀYt&TpUQ4X#潽B:sw?&UePIy2*HH0- y4a!" 5RPH  A2 4&(@,b RFIh7X7sٌ!cӜy2X>ab&cn3uX .ʒ@.5ZӜ"f@"XPeD# TFIh`i)@Dʖ$oQ,E!3 dՃξW=r=9'*IxՃ9 ɕ$<<,-ʒ@`N./PVL$ amV}UUUUUUUUUUUUUUUUUUUUUUUUUUUUS2kio'q5qLڎY֨foU潜o‚U"B$P2gC÷\<pkE=eP*[Ir÷\cn3uɿRMYoPV|TR2(DLaxFDT ىNz.[17iFv/H㏊ǂBcDT )<~8 D5 q% nbҐܧgNs9hhg,C[%=W%"fvs滥1j/^ݫZvSˌaLfs4cM),Z6ba~oVޠ~fsքN'7A1L#{hLq9M{akNgc|`ḇfa{̀&g7AòGej|i,`2r:-wH3tKqn)7t{hZ85, *Xfq6?hi_M)Z8cKEKVy2Dg=od!`h'g!aؾBŸ |ڼ^#j{GUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU5cRnldMH )C0`z21pS[Kj R$(]#w4s;8s\0vw&f@YR̓20pp0oYZRVs;8  #&ǂ$dۨqFp0oYZR[,ikޛNZЎ9g1iHnSK5+$& 4LV.5RY9NiB<|#oN^n0:̃^T0&(Q(;ZOL0 0!|ZSl]旽- p}rf 9y2oR8q>j_+e8;T/N7aۋPl f,a&aB~6?NRNn81i]Ɨr4 v|׶n.x 9j&b8s^as[Kj0U"cޭԝ#{9eN2 to#)rXn )c. (v1[43j9gZnP;/V-`1Ҙg@ ցתr`aFNNYJNyH([;Ws;&Gq0;)6t{n#}V5YXg^Uӄq0OYWt4ޮNab|#j4}UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUSGDSb aLbA os 1ѧ+50%GUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4~2FHUk{}'*+3456"׻dx8ޏ ! P`KJuz[0d G}6FNc N&;)JCed?U^za L84q2vN,b *j;ʪXlVsB2t;1QC6;b*k#+!{@uI f ݴAk!mmmmmmm_,RGEp%;1U'4mF5X/UجgLrf (L`Vmmmmmmmm%=C3)՘ULXbVbdnNUhؙ[mmmmmmmmzv"Lb 0\3:]47D@(,K.`Q% .&d,󧆦8h#܊(9ĉ"h42¢Ecƴxv Bt qaE?EM9B-{tqD,TB 2PfBo:xjc%h42¢EcƴxwV`}8*G Ǒ`js%5ew0lLD$`FAF!$ =4I= FBI6_Xhȹ:L/E)1ڌ,a)VQzd?dSk]%evy`r/T"׻y*ux, J EwV`97> 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" if [[ $attr == "REGISTRY" ]]; then typeset -u registryUC=${queries[$attr]} case $registryUC in LD*) queries[$attr]="LDAP" ;; LO*) queries[$attr]="files" ;; F*) queries[$attr]="files" ;; *) dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 '\nERROR: invalid value specified for "%1$s": "%2$s".\n' REGISTRY "${queries[$attr]}" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 'Valid values: %1$s\n\n' "files, LDAP" 1>&2 rc=$RC_INCORRECT_INPUT ;; esac fi fi shift done #======================================= : Make sure we have something to query #======================================= if [[ -n $groups ]]; then [[ $groups != *,* ]] && unset INDEX for group in ${groups//,/ }; do CL=$LINENO KLIB_HACMP_is_known_group "$group" 2>/dev/null if (( $? != RC_SUCCESS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$group" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 161 "Available Groups:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_groups available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND else GROUPS="$GROUPS $group" fi done elif (( CLMGR_VERBOSE || ${#queries[*]} > 0 )); then typeset available CL=$LINENO KLIB_HACMP_list_groups available for (( i=0; i<${#available[*]}; i++ )); do name=${available[$i]} name=${name##+([[:space:]])} name=${name%%+([[:space:]])} name=${name/ \(/@\(} GROUPS="$GROUPS $name" done else dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT fi (( $rc != RC_SUCCESS )) && unset GROUPS #======================================================================= : If there are multiple groups, often the result of a verbose listing, : then dump all group data to a temporary file, for faster access. In : testing, this dropped the execution time of "clmgr -v query group" : from 24 seconds to 8 seconds. #======================================================================= if [[ $GROUPS == *+([[:space:]])* ]]; then print "$0()[$LINENO]($SECONDS): lsgroup -R files ALL > $TMPDIR/clmgr.KHgga.files.$$" >>$CLMGR_TMPLOG lsgroup -R files ALL > $TMPDIR/clmgr.KHgga.files.$$ print "$0()[$LINENO]($SECONDS): lsgroup (LOCAL) RC: $?" >>$CLMGR_TMPLOG print "$0()[$LINENO]($SECONDS): lsgroup -R LDAP ALL > $TMPDIR/clmgr.KHgga.ldap.$$" >>$CLMGR_TMPLOG lsgroup -R LDAP ALL > $TMPDIR/clmgr.KHgga.ldap.$$ 2>>$CLMGR_TMPLOG print "$0()[$LINENO]($SECONDS): lsgroup (LDAP) RC: $?" >>$CLMGR_TMPLOG fi #================================================================ : Populate the return hash with the retrieved attributes/values #================================================================ for group in $GROUPS; do typeset -i TYPE_SPECIFIED=0 typeset -u TYPE= TYPES= if [[ $group == *@* ]]; then TYPES=${group##*@} TYPES=${TYPES#\(} TYPES=${TYPES%\)} [[ -n $TYPES ]] && TYPE_SPECIFIED=1 || TYPES="FILES LDAP" group=${group%%@*} else #=============================================================== : Since no group type was specified, check all supported types #=============================================================== TYPES="FILES LDAP" fi typeset OUTPUT= FOUND= for TYPE in $TYPES; do OUTPUT= if [[ $TYPE == "LDAP" ]]; then if [[ -f $TMPDIR/clmgr.KHgga.ldap.$$ ]]; then print "$0()[$LINENO]($SECONDS): grep \"^$group \" $TMPDIR/clmgr.KHgga.ldap.$$" >>$CLMGR_TMPLOG OUTPUT=$(grep "^$group " $TMPDIR/clmgr.KHgga.ldap.$$) print "$0()[$LINENO]($SECONDS): grep RC: $cmd_rc" >>$CLMGR_TMPLOG if [[ -n $OUTPUT ]]; then cmd_rc=$RC_SUCCESS FOUND=$TYPE else continue fi fi elif [[ $TYPE == "FILES" ]]; then if [[ -f $TMPDIR/clmgr.KHgga.files.$$ ]]; then print "$0()[$LINENO]($SECONDS): grep \"^$group \" $TMPDIR/clmgr.KHgga.files.$$" >>$CLMGR_TMPLOG OUTPUT=$(grep "^$group " $TMPDIR/clmgr.KHgga.files.$$) print "$0()[$LINENO]($SECONDS): grep RC: $cmd_rc" >>$CLMGR_TMPLOG if [[ -n $OUTPUT ]]; then cmd_rc=$RC_SUCCESS FOUND=$TYPE else continue fi fi fi #================================================ : If the no data was found for this group, then : program execution will not reach this point. #================================================ properties[NAME$INDEX]=$group for PAIR in $OUTPUT; do [[ $PAIR != *=* ]] && continue case ${PAIR%%=*} in id) properties[ID$INDEX]=${PAIR##*=} ;; admin) properties[ADMINISTRATIVE$INDEX]=${PAIR##*=} ;; registry) properties[REGISTRY$INDEX]=${PAIR##*=} ;; users) properties[USERS$INDEX]=${PAIR##*=} ;; adms) properties[ADMINS$INDEX]=${PAIR##*=} ;; projects) properties[PROJECTS$INDEX]=${PAIR##*=} ;; efs_initialks_mode) properties[KEYSTORE_MODE$INDEX]=${PAIR##*=} ;; efs_keystore_algo) properties[KEYSTORE_ENCRYPTION$INDEX]=${PAIR##*=} ;; efs_keystore_access) properties[KEYSTORE_ACCESS$INDEX]=${PAIR##*=} ;; esac done #============================================================== : Even if there is no value for a given attribute, we want to : display a placeholder for it, so the customer always sees a : consistent, complete set of attributes. #============================================================== for key in ${_COLON_ATTR_ORDER[group]}; do if [[ -z ${properties[$key$INDEX]} ]]; then properties[$key$INDEX]="" fi done (( INDEX++ )) [[ $INDEX == *0 ]] && (( INDEX++ )) done # End of the "TYPES" loop if [[ -z $FOUND ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 471 '\nERROR: the specified group, "%1$s", could not be found.\n\n' "$group" 1>&2 rc=$RC_NOT_FOUND fi done # End of "GROUPS" loop #========================================================== : If any searches/filters were specified, handle them now #========================================================== if (( $rc == RC_SUCCESS && ${#queries[*]} > 0 )); then CL=$LINENO search_properties queries properties rc=$? fi (( $rc == RC_SUCCESS )) && CL=$LINENO prune_indexes properties log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_group_attributes()" function on_exit_get_group { rm -f $TMPDIR/clmgr.KHgga.files.$$ rm -f $TMPDIR/clmgr.KHgga.ldap.$$ } #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_group_attributes =head1 VERSION Version Number: 1.8 Last Extracted: 6/16/15 17:51:04 Last Changed: 6/1/15 13:53:40 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_group_attributes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query group [,,...] clmgr -v query group NOTE: the alias for "group" is "gp". =head1 DESCRIPTION Retrieves the information for one or more user groups. =head1 ARGUMENTS 1. group [REQUIRED] [string] The label of one or more groups (comma or space separated) that are to be queried. 2. properties [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2011.2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== fi  k*2+ b~bb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_group_nodesutes#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_group_nodes.sh 1.5 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)03 1.5 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_group_nodes.sh, hacmp.assist, 61haes_r714 6/10/12 15:22:24 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_group_nodes =head1 VERSION Version Number: 1.5 Last Extracted: 1/31/14 04:40:15 Last Changed: 6/10/12 15:22:24 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_group_nodes.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_get_group_nodes =head1 DESCRIPTION Obtain a list of participating nodes for the specified resource group =head1 ARGUMENTS 1: [scalar] resource group name 2: [by ref] nodes the participate in the resource group =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_get_group_nodes { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.5, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_group_nodes.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset rg=${1//\"/} typeset -n nodes=$2 [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values typeset -i rc=$RC_UNKNOWN print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clodmget -q \"group = $rg\" -f nodes HACMPgroup" >>$CLMGR_TMPLOG # Always log commands nodes=$($HAUTILS/clodmget -q "group = $rg" -f nodes HACMPgroup) rc=$? nodes=$(echo ${nodes//\"/}) print "clodmget RC: $rc; nodes == \"$nodes\"" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_group_nodes()"  kF+,2+ b~bb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_group_policytes#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_group_policy.sh 1.5 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)00 1.5 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_group_policy.sh, hacmp.assist, 61haes_r714 6/10/12 15:22:25 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_group_policy =head1 VERSION Version Number: 1.5 Last Extracted: 1/31/14 04:40:14 Last Changed: 6/10/12 15:22:25 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_group_policy.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_get_group_policy =head1 DESCRIPTION Obtain the settings for the resource group policy, startup, fallover, and fallback. =head1 ARGUMENTS 1: [scalar] resource group name 2: [by ref] startup preference 3: [by ref] fallover preference 4: [by ref] fallback preference =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_get_group_policy { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.5, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_group_policy.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset rg=${1//\"/} typeset -n startup=$2 typeset -n fallover=$3 typeset -n fallback=$4 [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN startup="" fallover="" fallback="" print "$0()[$LINENO]($SECONDS): /usr/bin/odmget -q \"group=$rg\" HACMPgroup" >>$CLMGR_TMPLOG # Always log commands /usr/bin/odmget -q "group=$rg" HACMPgroup | \ while IFS='=' read name value; do name=$(eval echo $name) if [[ $name == "startup_pref" ]]; then startup=$(eval echo $value) fi if [[ $name == "fallover_pref" ]]; then fallover=$(eval echo $value) fi if [[ $name == "fallback_pref" ]]; then fallback=$(eval echo $value) fi done rc=$? print "odmget RC: $rc" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_group_policy()" f k~Q.2+5b~bb&5 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_hmc_attributess#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_get_hmc_attributes.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #============================================================================ # # Name: KLIB_HACMP_get_hmc_attributes # # Description: This is the main, FPATH function that is invoked by clmgr # to collect HMC information. The cllshmc utility is invoked # to extract the necessary data. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The properties hash is populated. The only other outputs are # any error messages that might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_get_hmc_attributes { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_get_hmc_attributes.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset hmcs=${1//\"/} # Get the "properties" associative array reference, and initialize it if [[ -z $2 ]] || [[ -n $CLMGR_LOGGING && $2 == "|" ]]; then hmcs= typeset -n properties=$1 else typeset -n properties=$2 fi [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== for k in ${!properties[*]}; do unset properties[$k]; done typeset -i INDEX=0 rc=$RC_UNKNOWN typeset key= hmc= HMCS= typeset hmc_label= timeout= retry_count= retry_delay= nodename= sitename= username= password= typeset -i matches=0 typeset -u attr= uc_key= typeset -A queries typeset -i i=0 typeset -i CONN_TYPE=0 typeset -i incluster=0 /usr/lib/cluster/incluster 2>/dev/null (( $? == RC_SUCCESS )) && incluster=1 #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #======================================= : Make sure we have something to query #======================================= elif [[ -n $hmcs ]]; then [[ $hmcs != *,* ]] && unset INDEX for hmc in ${hmcs//,/ }; do CL=$LINENO KLIB_HACMP_is_known_hmc hmc if (( $? != RC_SUCCESS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$hmc" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 174 "Available HMCs:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_hmcs available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND else HMCS="${HMCS:+$HMCS }$hmc" fi done elif (( CLMGR_VERBOSE || ${#queries[*]} > 0 )); then typeset available CL=$LINENO KLIB_HACMP_list_hmcs available rc=$? for (( i=0; i<${#available[*]}; i++ )); do HMCS="${HMCS:+$HMCS }${available[$i]}" done else dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT fi (( rc != RC_SUCCESS && rc != RC_UNKNOWN )) && unset HMCS #================================================================ : Populate the return hash with the retrieved attributes/values #================================================================ for HMC in $HMCS; do typeset NODES= typeset HMC_PROPERTIES= print -- "$0()[$LINENO]($SECONDS): cllshmc -c -u $HMC" >>$CLMGR_TMPLOG # Always log commands HMC_PROPERTIES=$(cllshmc -c -u $HMC) rc=$? print -- "$0()[$LINENO]($SECONDS): cllshmc -c -u $HMC rc=$rc" >>$CLMGR_TMPLOG # Always log commands result if (( $rc == RC_SUCCESS )); then print -- "$HMC_PROPERTIES" |\ while IFS=: read hmc_label timeout retry_count retry_delay user passwd rem do [[ $hmc_label == \#* ]] && continue # Skip the column headers properties[NAME$INDEX]=$hmc_label properties[TIMEOUT$INDEX]=$timeout properties[RETRY_COUNT$INDEX]=$retry_count properties[RETRY_DELAY$INDEX]=$retry_delay properties[USER_NAME$INDEX]=$user properties[PASSWORD$INDEX]=$passwd typeset -i cmd_rc= #NODES typeset NODENAMES= print -- "$0()[$LINENO]($SECONDS): cllshmcparam -m $HMC -o" >>$CLMGR_TMPLOG # Always log commands NODENAMES=$(cllshmcparam -m $HMC -o) rc=$? print -- "$0()[$LINENO]($SECONDS): cllshmcparam -m $HMC -o rc=$rc" >>$CLMGR_TMPLOG # Always log commands result if (( $rc == RC_SUCCESS )); then for NODENAME in $NODENAMES; do NODES="${NODES:+$NODES }$NODENAME" done properties[NODES$INDEX]=$NODES fi #SITES if [[ $CLUSTER_TYPE != "NSC" ]]; then typeset SITES= typeset SITENAMES= print -- "$0()[$LINENO]($SECONDS): cllssite -H $HMC" >>$CLMGR_TMPLOG # Always log commands SITENAMES=$(cllssite -H $HMC) cmd_rc=$? print -- "$0()[$LINENO]($SECONDS): cllssite -H $HMC cmd_rc=$cmd_rc" >>$CLMGR_TMPLOG # Always log commands result if (( $cmd_rc == RC_SUCCESS )); then for SITENAME in $SITENAMES; do SITES="${SITES:+$SITES }$SITENAME" done properties[SITES$INDEX]=$SITES fi # Continue even if no site, having dumped cmd_rc to log. fi print "$0()[$LINENO]($SECONDS):CONN_TYPE=$(clodmget -n -f connection_type HACMPhmcparam)" >>$CLMGR_TMPLOG # Always log command result CONN_TYPE=$(clodmget -n -f connection_type HACMPhmcparam >> $CLMGR_TMPLOG 2>&1) cmd_rc=$? print "$0()[$LINENO]($SECONDS): clodmget RC: $cmd_rc connection_type = $CONN_TYPE" >>$CLMGR_TMPLOG # Always log command result typeset hmccmd= if (( $CONN_TYPE == 1 )); then hmccmd="clrest" else hmccmd="clhmccmd" fi #hmc version typeset VERSION= print -- "$0()[$LINENO]($SECONDS): $hmccmd -o query -a hmc_version -H $hmc_label" >>$CLMGR_TMPLOG # Always log commands VERSION=$($hmccmd -o query -a hmc_version -H $hmc_label 2>>$CLMGR_TMPLOG) cmd_rc=$? print -- "$0()[$LINENO]($SECONDS): $hmccmd -o query -a hmc_version -H $hmc_label cmd_rc=$cmd_rc" >>$CLMGR_TMPLOG # Always log commands result if (( $cmd_rc == RC_SUCCESS )); then properties[STATUS$INDEX]="UP" properties[VERSION$INDEX]="$VERSION" else properties[STATUS$INDEX]="DOWN" fi # Continue even if VERSION is DOWN, having dumped cmd_rc to log. done #============================================================== : Even if there is no value for a given attribute, we want to : display a placeholder for it, so the customer always sees a : consistent, complete set of attributes. #============================================================== for key in ${_COLON_ATTR_ORDER[cod]}; do if [[ -z ${properties[$key$INDEX]} ]]; then properties[$key$INDEX]="" fi done (( INDEX++ )) [[ $INDEX == *0 ]] && (( INDEX++ )) fi done #========================================================== : If any searches/filters were specified, handle them now #========================================================== if (( $rc == RC_SUCCESS && ${#queries[*]} > 0 )); then CL=$LINENO search_properties queries properties rc=$? fi (( rc == RC_SUCCESS )) && CL=$LINENO prune_indexes properties log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_hmc_attributes()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_hmc_attributes =head1 VERSION Version Number: 1.5.1.9 Last Extracted: 8/9/16 14:12:29 Last Changed: 7/28/16 10:20:32 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_hmc_attributes.sh, hacmp.assist, 61haes_r721, 1631A_hacmp721 =head1 SYNOPSIS clmgr query hmc [[,,...]] clmgr -v query hmc =head1 DESCRIPTION Retrieves the data for one or more HMCs defined within the cluster configuration. =head1 ARGUMENTS 1. HMC [REQUIRED] [string] The label of one or more HMCs (comma or space separated) that are to be queried. 2. properties [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2012,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #==============================================================================  k֪/2++b~bb&+ # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_host_attributes#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_get_host_attributes.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #============================================================================ # # Name: KLIB_HACMP_get_host_attributes # # Description: This is the main, FPATH function that is invoked by clmgr # to collect host information. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The properties hash is populated. The only other outputs are # any error messages that might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_get_host_attributes { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : INPUTS: $* typeset -n properties=$1 typeset nodes=${2//\"/} nodes=${nodes//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN for k in ${!properties[*]}; do unset properties[$k]; done #======================================= : Make sure we have something to query #======================================= if [[ $nodes == *([[:space:]]) ]] && (( CLMGR_VERBOSE )); then nodes=$($HAUTILS/clnodename 2>>$CLMGR_TMPLOG) fi if [[ $nodes == *([[:space:]]) ]]; then nodes=${LOCAL_NODE%%\.*} fi if [[ $nodes == *([[:space:]]) ]]; then nodes=$(/usr/bin/hostname) nodes=${nodes%%\.*} fi typeset DATA= #======================================================================== : Collecting OS levels is slow. So those retrievals are launched first : as backgrounded processes, so they can run while the rest of the host : data is being collected. 35% performance improvement. #======================================================================== typeset OSLEVEL_PIDS="" typeset OSLEVEL_DATA="$TMPDIR/clmgr.KHghi.oslevel.$$" typeset -A NODE_IDS for node in $nodes; do #===================================================================== : Retrieve the ID number of node "$node". Note, however, that if the : cluster has never been synchronized with this node in it, then the : ID will likely be zero. In that case, a faux number will have to : be temporarily assigned to avoid having overwritten data. #===================================================================== print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clodmget -q \"name=$node and object=COMMUNICATION_PATH\" -f node_id HACMPnode" >>$CLMGR_TMPLOG # Always log commands NODEID=$($HAUTILS/clodmget -q "name=$node and object=COMMUNICATION_PATH" -f node_id HACMPnode) print "$0()[$LINENO]($SECONDS): clodmget RC: $?; NODEID == \"$NODEID\"" >>$CLMGR_TMPLOG # Always log command result if [[ -z $NODEID ]] || (( NODEID == 0 )); then NODEID=$(print -- "$node" | /usr/bin/sum) NODEID=${NODEID%%+([[:space:]])*} if [[ $NODEID != +([[:digit:]]) ]]; then NODEID=$RANDOM fi fi NODE_IDS[$node]=$NODEID if [[ ${node%%\.*} == ${LOCAL_NODE%%\.*} ]]; then ( print "properties[AIX_LEVEL$NODEID]=\"$(/usr/bin/oslevel -s)\"" 2>>$CLMGR_TMPLOG >> $OSLEVEL_DATA )& else ( print "properties[AIX_LEVEL$NODEID]=\"$($CLRSH $node /usr/bin/oslevel -s)\"" 2>>$CLMGR_TMPLOG >> $OSLEVEL_DATA )& fi OSLEVEL_PIDS="$OSLEVEL_PIDS $!" done #================================================ : Collect the host data for each node in $nodes #================================================ for node in $nodes; do typeset NODEID=${NODE_IDS[$node]} #================================================================ : Populate the return hash with the retrieved attributes/values #================================================================ if [[ ${node%%\.*} == ${LOCAL_NODE%%\.*} ]]; then print "$0()[$LINENO]($SECONDS): LANG=C LC_ALL=C /usr/bin/host $(/usr/bin/hostname)" >>$CLMGR_TMPLOG # Always log commands DATA=$(LANG=C LC_ALL=C /usr/bin/host $(/usr/bin/hostname)) else print "$0()[$LINENO]($SECONDS): $CLRSH $node LANG=C LC_ALL=C /usr/bin/host $(/usr/bin/hostname)" >>$CLMGR_TMPLOG # Always log commands DATA=$($CLRSH $node LANG=C LC_ALL=C /usr/bin/host $($CLRSH $node /usr/bin/hostname)) fi rc=$? print "$0()[$LINENO]($SECONDS): host RC: $rc; DATA == \"$DATA\"" >>$CLMGR_TMPLOG # Always log command result typeset FQDN=${DATA%%+([[:space:]])*} if [[ $FQDN != *\.* ]]; then : The first component of the /usr/bin/host output does not : look fully-qualified. This might mean there is an incorrect : /etc/hosts configuration. Checking aliases... typeset ALIASES=${DATA##*:} for FQDN in ${ALIASES//,/ }; do [[ $FQDN == *\.* ]] && break done if [[ $FQDN != *\.* || \ $FQDN == +([0-9])\.+([0-9])\.+([0-9])\.+([0-9]) ]] then : None of the aliases were fully-qualified either. There : is definitely something wrong with this configuration. : Defaulting to the output of the hostname utility. HOSTNAME=${DATA%%+([[:space:]])*} else HOSTNAME=$FQDN fi else HOSTNAME=$FQDN fi properties[HOSTNAME$NODEID]=$HOSTNAME DATA=${DATA%%,*} properties[IPADDRESS$NODEID]=${DATA##*+([[:space:]])} if [[ ${node%%\.*} == ${LOCAL_NODE%%\.*} ]]; then properties[LOCALHOST$NODEID]=true else properties[LOCALHOST$NODEID]=false fi #============================================ : Get the version information for the node, : plus its current synchronization status #============================================ if [[ ${node%%\.*} == ${LOCAL_NODE%%\.*} ]]; then print "$0()[$LINENO]($SECONDS): /usr/bin/lslpp -L | /usr/bin/grep cluster.es.server.rte" >>$CLMGR_TMPLOG # Always log commands typeset VRMF=$(/usr/bin/lslpp -L | /usr/bin/grep cluster.es.server.rte) else print "$0()[$LINENO]($SECONDS): $CLRSH $node /usr/bin/lslpp -L | /usr/bin/grep cluster.es.server.rte" >>$CLMGR_TMPLOG # Always log commands typeset VRMF=$($CLRSH $node /usr/bin/lslpp -L | /usr/bin/grep cluster.es.server.rte) fi cmd_rc=$? print "$0()[$LINENO]($SECONDS): lslpp RC: $cmd_rc; VRMF == \"$VRMF\"" >>$CLMGR_TMPLOG # Always log command result (( $rc == RC_SUCCESS )) && rc=$cmd_rc VRMF=${VRMF//+([[:space:]])/ } VRMF=${VRMF# } VRMF=${VRMF#* } VRMF=${VRMF%% *} properties[HAVERSION$NODEID]="$VRMF" properties[VERSION_NUMBER$NODEID]=$(/usr/bin/grep CLUSTERVERSION= $HAETC/rc.cluster | /usr/bin/cut -d= -f2) properties[HAEDITION$NODEID]="STANDARD" CL=$LINENO isEnterprise $node (( $? == 1 )) && properties[HAEDITION$NODEID]="ENTERPRISE" #==================================================================== : An invalid node name was provided. Delete the data. Report error. #==================================================================== if [[ -z ${properties[HOSTNAME$NODEID]} ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$node" 1>&2 rc=$RC_NOT_FOUND typeset key= for key in ${!properties[*]}; do [[ $key == *$NODEID ]] && unset properties[$key] done fi done #===================================================================== : Make sure the OS retrievals are complete, then collect any results #===================================================================== if [[ -n $OSLEVEL_PIDS ]]; then wait $OSLEVEL_PIDS if [[ -f $OSLEVEL_DATA && -s $OSLEVEL_DATA ]]; then typeset OSLEVELS=$(cat $OSLEVEL_DATA) [[ $OSLEVELS == *=* ]] && eval "$OSLEVELS" fi fi rm -f $OSLEVEL_DATA log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_host_attributes()" function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_host_attributes =head1 SYNOPSIS clmgr query host [ [,,...] ] =head1 DESCRIPTION Retrieves data for various components on the local host, by default, or all specified nodes. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. 2. node [OPTIONAL] [string] A specific node whose host information is to be retrieved. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== === k12+(b~bb&( # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_host_infobutes#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_host_info.sh 1.16 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)42 1.16 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_host_info.sh, hacmp.assist, 61haes_r720, 1542B_hacmp720 9/29/15 17:42:35 #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_host_info =head1 VERSION Version Number: 1.16 Last Extracted: 10/15/15 19:21:00 Last Changed: 9/29/15 17:42:35 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_host_info.sh, hacmp.assist, 61haes_r720, 1542B_hacmp720 =head1 SYNOPSIS clmgr query host [ [,,...] ] =head1 DESCRIPTION Retrieves data for various components on the local host, by default, or all specified nodes. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. 2. node [OPTIONAL] [string] A specific node whose host information is to be retrieved. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_get_host_info { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.16, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_host_info.sh, hacmp.assist, 61haes_r720, 1542B_hacmp720 : INPUTS: $* typeset -n properties=$1 typeset nodes=${2//\"/} nodes=${nodes//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN for k in ${!properties[*]}; do unset properties[$k]; done #======================================= : Make sure we have something to query #======================================= if [[ $nodes == *([[:space:]]) ]] && (( CLMGR_VERBOSE )); then nodes=$($HAUTILS/clnodename 2>>$CLMGR_TMPLOG) fi if [[ $nodes == *([[:space:]]) ]]; then nodes=${LOCAL_NODE%%\.*} fi if [[ $nodes == *([[:space:]]) ]]; then nodes=$(/usr/bin/hostname) nodes=${nodes%%\.*} fi typeset DATA= #======================================================================== : Collecting OS levels is slow. So those retrievals are launched first : as backgrounded processes, so they can run while the rest of the host : data is being collected. 35% performance improvement. #======================================================================== typeset OSLEVEL_PIDS="" typeset OSLEVEL_DATA="$TMPDIR/clmgr.KHghi.oslevel.$$" typeset -A NODE_IDS for node in $nodes; do #===================================================================== : Retrieve the ID number of node "$node". Note, however, that if the : cluster has never been synchronized with this node in it, then the : ID will likely be zero. In that case, a faux number will have to : be temporarily assigned to avoid having overwritten data. #===================================================================== print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clodmget -q \"name=$node and object=COMMUNICATION_PATH\" -f node_id HACMPnode" >>$CLMGR_TMPLOG # Always log commands NODEID=$($HAUTILS/clodmget -q "name=$node and object=COMMUNICATION_PATH" -f node_id HACMPnode) print "$0()[$LINENO]($SECONDS): clodmget RC: $?; NODEID == \"$NODEID\"" >>$CLMGR_TMPLOG # Always log command result if [[ -z $NODEID ]] || (( NODEID == 0 )); then NODEID=$(print -- "$node" | /usr/bin/sum) NODEID=${NODEID%%+([[:space:]])*} if [[ $NODEID != +([[:digit:]]) ]]; then NODEID=$RANDOM fi fi NODE_IDS[$node]=$NODEID if [[ ${node%%\.*} == ${LOCAL_NODE%%\.*} ]]; then ( print "properties[AIX_LEVEL$NODEID]=\"$(/usr/bin/oslevel -s)\"" 2>>$CLMGR_TMPLOG >> $OSLEVEL_DATA )& else ( print "properties[AIX_LEVEL$NODEID]=\"$($CLRSH $node /usr/bin/oslevel -s)\"" 2>>$CLMGR_TMPLOG >> $OSLEVEL_DATA )& fi OSLEVEL_PIDS="$OSLEVEL_PIDS $!" done #================================================ : Collect the host data for each node in $nodes #================================================ for node in $nodes; do typeset NODEID=${NODE_IDS[$node]} #================================================================ : Populate the return hash with the retrieved attributes/values #================================================================ if [[ ${node%%\.*} == ${LOCAL_NODE%%\.*} ]]; then print "$0()[$LINENO]($SECONDS): LANG=C LC_ALL=C /usr/bin/host $(/usr/bin/hostname)" >>$CLMGR_TMPLOG # Always log commands DATA=$(LANG=C LC_ALL=C /usr/bin/host $(/usr/bin/hostname)) else print "$0()[$LINENO]($SECONDS): $CLRSH $node LANG=C LC_ALL=C /usr/bin/host $(/usr/bin/hostname)" >>$CLMGR_TMPLOG # Always log commands DATA=$($CLRSH $node LANG=C LC_ALL=C /usr/bin/host $($CLRSH $node /usr/bin/hostname)) fi rc=$? print "$0()[$LINENO]($SECONDS): host RC: $rc; DATA == \"$DATA\"" >>$CLMGR_TMPLOG # Always log command result typeset FQDN=${DATA%%+([[:space:]])*} if [[ $FQDN != *\.* ]]; then : The first component of the /usr/bin/host output does not : look fully-qualified. This might mean there is an incorrect : /etc/hosts configuration. Checking aliases... typeset ALIASES=${DATA##*:} for FQDN in ${ALIASES//,/ }; do [[ $FQDN == *\.* ]] && break done if [[ $FQDN != *\.* || \ $FQDN == +([0-9])\.+([0-9])\.+([0-9])\.+([0-9]) ]] then : None of the aliases were fully-qualified either. There : is definitely something wrong with this configuration. : Defaulting to the output of the hostname utility. HOSTNAME=${DATA%%+([[:space:]])*} else HOSTNAME=$FQDN fi else HOSTNAME=$FQDN fi properties[HOSTNAME$NODEID]=$HOSTNAME DATA=${DATA%%,*} properties[IPADDRESS$NODEID]=${DATA##*+([[:space:]])} if [[ ${node%%\.*} == ${LOCAL_NODE%%\.*} ]]; then properties[LOCALHOST$NODEID]=true else properties[LOCALHOST$NODEID]=false fi #============================================ : Get the version information for the node, : plus its current synchronization status #============================================ if [[ ${node%%\.*} == ${LOCAL_NODE%%\.*} ]]; then print "$0()[$LINENO]($SECONDS): /usr/bin/lslpp -L | /usr/bin/grep cluster.es.server.rte" >>$CLMGR_TMPLOG # Always log commands typeset VRMF=$(/usr/bin/lslpp -L | /usr/bin/grep cluster.es.server.rte) else print "$0()[$LINENO]($SECONDS): $CLRSH $node /usr/bin/lslpp -L | /usr/bin/grep cluster.es.server.rte" >>$CLMGR_TMPLOG # Always log commands typeset VRMF=$($CLRSH $node /usr/bin/lslpp -L | /usr/bin/grep cluster.es.server.rte) fi cmd_rc=$? print "$0()[$LINENO]($SECONDS): lslpp RC: $cmd_rc; VRMF == \"$VRMF\"" >>$CLMGR_TMPLOG # Always log command result (( $rc == RC_SUCCESS )) && rc=$cmd_rc VRMF=${VRMF//+([[:space:]])/ } VRMF=${VRMF# } VRMF=${VRMF#* } VRMF=${VRMF%% *} properties[HAVERSION$NODEID]="$VRMF" properties[VERSION_NUMBER$NODEID]=$(/usr/bin/grep CLUSTERVERSION= $HAETC/rc.cluster | /usr/bin/cut -d= -f2) properties[HAEDITION$NODEID]="STANDARD" CL=$LINENO isEnterprise $node (( $? == 1 )) && properties[HAEDITION$NODEID]="ENTERPRISE" #==================================================================== : An invalid node name was provided. Delete the data. Report error. #==================================================================== if [[ -z ${properties[HOSTNAME$NODEID]} ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$node" 1>&2 rc=$RC_NOT_FOUND typeset key= for key in ${!properties[*]}; do [[ $key == *$NODEID ]] && unset properties[$key] done fi done #===================================================================== : Make sure the OS retrievals are complete, then collect any results #===================================================================== if [[ -n $OSLEVEL_PIDS ]]; then wait $OSLEVEL_PIDS if [[ -f $OSLEVEL_DATA && -s $OSLEVEL_DATA ]]; then typeset OSLEVELS=$(cat $OSLEVEL_DATA) [[ $OSLEVELS == *=* ]] && eval "$OSLEVELS" fi fi rm -f $OSLEVEL_DATA log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_host_info()" #  l22+HXkw{!16BKUqx|%'+347W⤺ N.sT5ҋwQH-~t%-5a0r3&epVw;yeat's0MΓb5aI=O0wIުSI ?Ktcj1poV8׎}y`:-;T5;&p13Iƥ"UD(,n**O_Md5;,~+'Z 0}FXR ̩::1&׌s+ E~*69 )Vw̥)se'3w'^a`NQVYh*x` +ܿ >R s*Rq (ʽT8Ԥ\>b_3ڌai^c?Z 0z:# J1Ui]+MgZ 8P2==)<ټטg:̓Ob:~Wc?[mmmmYNn{p ]sENmmmmmgj~LZ 0s@c %s^cVEҹ&JYyR$r 0aZW2I@-+pc8Tevai^c;<آAlҼ ?1Ϣp##ZW4һ?01yd2 &\9ŜCQ:uw&&# JN8TTh3?2럄FNJ1OWrhĥ~`_l%ȴx^RVRKk*Z`عW-+p&Kg&KL4LE$Tx#ti2I@㭶mmmmmm)(tՆ׌k(7J[c8Tfkk?ixNސ+>QU犸~`1I?5㭶mmmmmm (㳅h/ *v?4j@<ѭv?=&sfT*1v? PHώƶ1B2}eyg~`\ `n@&.ӧp&gng98%_,gmmmmmmmmB:jnZ'OnU])qWEW?8IQS|ummmmmmmk?&TRۗ tIO 8r$` ⤽F\"f *"p!2EH*@3㭶mmmmI? SyTG<[~`0mmmmmgryXcj36 ⤽h9&g sf@#>92IF.p& $&pZbqyXc8TepNl?⤽Uw̥\]\c w=⤯;mFWS j[8*{w#91=RVץ% b:H5ʙ$\@yF*7>3ڌ ό6;s0Mpp(;** $T& $&q˜P9&gAό680@A! ,"'hr 0c R^'5@se$K6 ⤽.Ű.p#: 8$`Dy"ƀ !++V;VZ[*9xxƠ`Q\[ _@A! 3@sFL`@q;97`Q(-+vZ*vY@@2r8`QZ*vY‚PX7p@&9q֊@c aa`%YFmkTApFYyay`*KHh\ud625鹟*gscF73 8T¤Y'W*dq P&T"1`QMIW?s'\($"\ $\ ,`1is@c8;a`*KP@26D "`,?Dܞ&r 8dHLatO Y0@A! ,# (Zuϖ?ܞh7@S$ H7  s HȦ ͛R^eL. <#jʙ$\@yF4g\@<25鹟*c?'5@se$K6 ⤽.Ű.p#: 8$`DxG.\pzCVN珯VuE(j&`2'  71AZG\a@#>92I@3# J0~LA|#& 3 X1<Ѭ0(pQfͳ*KF &\9ŜԛٶI{?.*NQRRlZijH:Dȓ. hjMX3ummmmmmmY; Ӳu=;mFuXʿIoY;MN'3ڌ6-Vܼe^`.ebkTlx80r_UF8LOUᑃ^g&Š8*{ $&Ԛf=\8La<`׮|AZ-{?bT^Rӂ>3ڌWs0M+1XXJL3ڌ6-'Dhn|f j*K?&TRشmFWɈ.ՆɈ.hle*LAsHda(51 E"BdIDh`g45&ş*g^YUJ\Tό6:Mt*NQRYPy' *X*B8TLg|1}"BdIDh`g&N]ɆٶI{?փjH&TR0HbL:D@A! ,"QQ|f lZN]"c d2`8B%(XEAώ5XPY *HcaH$@R&N]8B%(XEuyg~eIj3طQ; jCZ?s'WS詠d2O!2$ˇ"t@xbmmmmmmmmm2qRpqW_ETrTy\mT,J.ii]sEN+pgUi]+*HȐZʑ$7P Z`w iQiQ X(j+d &`Xj `IG( &(A…9pA@(,3ڌpp9K2$&P?Ɉ" LAu1FX1 gngJY'5*3ڌ6-ܾ:LmmmmmmmYFkAUth $2I  ^`.dZ`!x 3 VEҹ@R$p,@yCK% 3(<,DUi]+*X$ "H lg6mR^I? "Ij3髧OqRtU%U)gʒ*[s0M1kAUthb$&T `b "JZ 0sEK$2I ua(<,Dh`b "KB8TYlfR :RUEw>3ڌzjb^* $T-18`Qb N8TU(pb$FZ 0sDʙ$\@yH*D@l7ai^cN5aOs`91MtgɈ.i>)M,Ԓ ͛R^W4LE$2I XKB,MIW?s?s:mmmmmmmmg~H^_>*L'rt c8Td 5?Z1XQ:MXn+]^*Nӡ&/2ܼehycט꧶1OW gmmmmmmmm ##8@BN2dȒ.iό6&AJa7@&ZaJʑ$636 ⤽AUti LAthmmmmmmmmm?,N]cʒ2$<2bbjIBW^W EII+IˬurBmmmmmmmmmhւL"\11H@R${pHx'6lI{?ϽyZaJ抒2$<2I N,>:Ui]+.H@AeHgnc?[mmmmmm|Trެv$N~` g%$ܓ0Z^CZQrnGlc mmmmmmJBeI-rOh9ygPV {X^g޼Z 0sF $Tx$ "H mryXc8`3sf%T^x;c8Te~*6:-{Վ+:k)iSu՗QXv%-{, ⤌p4;s׌5F@s̙.c6lI{?VFF7?0dyX<"D?U޼Z 0sHdaeHgJY𠬙R$aal4k@R$$7PVLA0d|Tό6+UUf3ummmmmmmɧ"`Nҋt k;*9}MXl\/FŃܾ`h<-*9uc0VTrn; vV6.Uṕ'sV*L¥07^Q~L*9}cYU72Ӗ' 5}X8Yiӣ,vOK)0w]fN禬6.U=P[ETB[jʹONJՖEMF\VtTkť,VQi僿Sެu/ sizRF5_k-;<عW%OK#I`iyr:um9lOuS:xZx9TLf5W珯Yϯ)nzĄ2*9pV_q 犍%=5`yr*9| *XL3Z;0X; :*qRs~EsV*VQȩ}P&F892$xOsdޱU|sec\?*5;/1?9SՎ^\Vw<]PmmmmmmmmmmLы~U&Q?p:wCTeGc0,0(3ڌ!ό6 @< 6 i`Q3*X *NӮj򾚰ƹ&dnN5c\2-HȒ0@13$c `:*7 b_طMXjuaV&ep2-HǗ2aό69 $Dix6*NuwU=Wά3w>3ڌ"gYμ62_*ⳁXVEҾh e7QS6ںhtTsEM&ŻEU?*K?JZJ1_Eg)qWӧfeRZ$d .UaV )Le@*NʿjK`u/8ϢgγN+ F' I0?nҋtWT%e}ǐ9 OKzgMSIT4)nzㄚyˮ3ꞝ)Ks?$=a F;MfAxH}ДizRF4@/`H~u&K^[Tk\U6(MXʉgzZRr*5`mmmmmmmmmm*NNsŁZ*=/*uTB;c # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_interface_network =head1 VERSION Version Number: 1.6 Last Extracted: 10/27/15 18:41:21 Last Changed: 10/16/15 01:41:56 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_interface_network.sh, hacmp.assist, 61haes_r720, 1544A_hacmp720 =head1 SYNOPSIS KLIB_HACMP_get_interface_network =head1 DESCRIPTION Returns the HACMP network name for the provided HACMP interface =head1 ARGUMENTS 1: [scalar] interface name =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_get_interface_network { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.6, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_interface_network.sh, hacmp.assist, 61haes_r720, 1544A_hacmp720 : INPUTS: $* typeset interface=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN #================= : Validate input #================= if [[ -z $interface ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clodmget -q \"ip_label = $interface\" -f network HACMPadapter" >>$CLMGR_TMPLOG # Always log commands typeset network=$($HAUTILS/clodmget -q "ip_label = $interface" -f network HACMPadapter) rc=$? network=$(echo ${network//\"/}) print "clodmget RC: $rc; network == \"$network\"" >>$CLMGR_TMPLOG # Always log command result print "${network}" # Print it , so that calling script/function will have the network name (( $rc != RC_SUCCESS )) && rc=$RC_ERROR fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_interface_network()" $ kƼ72+b~bb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_ldap_client_attributese#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_ldap_client_attributes.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)95 1.3 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_ldap_client_attributes.sh, hacmp.assist, 61haes_r714 6/25/12 14:03:40 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_ldap_client_attributes =head1 VERSION Version Number: 1.3 Last Extracted: 1/31/14 04:41:21 Last Changed: 6/25/12 14:03:40 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_ldap_client_attributes.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr query ldap_client NOTE: the alias for "ldap_client" is "lc". =head1 DESCRIPTION Retrieves the configuration data for one or more SystemMirror LDAP clients. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_get_ldap_client_attributes { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_ldap_client_attributes.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset -n properties=$1 [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== for k in ${!properties[*]}; do unset properties[$k]; done typeset key= LINE= typeset -A list typeset -i rc=$RC_SUCCESS matches=0 i=0 typeset -u attr= uc_key= typeset LINE= ATTR= VALUE= typeset group= type= value= typeset -u name= typeset -A TRANS TRANS=( [SERVERLIST]="SERVERS" [AUTHTYPE]="AUTH_TYPE" [BINDDN]="ADMIN_DN" [SSLPORTNUMBER]="PORT" [CLIENTKDBPATH]="SSL_KEY" ) #================================================================ : Populate the return hash with the retrieved attributes/values #================================================================ /usr/bin/odmget -q "group=LDAPClient" HACMPLDAP |\ while read LINE; do [[ $LINE == HACMPLDAP: ]] && continue if [[ $LINE != "" && $LINE == *=* ]]; then ATTR=${LINE%% =*} VALUE=${LINE#*= } VALUE=${VALUE//\"} case $ATTR in group) group="$VALUE" ;; type) type="$VALUE" ;; name) name="$VALUE" ;; value) value="$VALUE" ;; esac else [[ -z $name ]] && continue [[ -n ${TRANS[$name]} ]] && name=${TRANS[$name]} if [[ ${properties[$name]} == *([[:space:]]) ]]; then properties[$name]="$value" elif [[ ${properties[$name]} != *$value* ]]; then properties[$name]="${properties[$name]};$value" fi group= type= name= value= # Reset these variables fi done # Make sure the last stanza gets processed if [[ -n name && -n $value ]]; then [[ -z $name ]] && continue [[ -n ${TRANS[$name]} ]] && name=${TRANS[$name]} if [[ ${properties[$name]} == *([[:space:]]) ]]; then properties[$name]="$value" elif [[ ${properties[$name]} != *$value* ]]; then properties[$name]="${properties[$name]};$value" fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_ldap_client_attributes()"  kꢧ92+3b~bb&3 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_ldap_server_attributese#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_ldap_server_attributes.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)69 1.3 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_ldap_server_attributes.sh, hacmp.assist, 61haes_r714 6/25/12 14:03:59 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_ldap_server_attributes =head1 VERSION Version Number: 1.3 Last Extracted: 1/31/14 04:41:45 Last Changed: 6/25/12 14:03:59 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_ldap_server_attributes.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr query ldap_server clmgr -v query ldap_server NOTE: the alias for "ldap_server" is "ls". =head1 DESCRIPTION Retrieves the configuration data for one or more SystemMirror LDAP servers. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_get_ldap_server_attributes { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_ldap_server_attributes.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset -n properties=$1 [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== for k in ${!properties[*]}; do unset properties[$k]; done typeset key= LINE= typeset -A list typeset -i rc=$RC_SUCCESS matches=0 i=0 typeset -u attr= uc_key= typeset LINE= ATTR= VALUE= typeset group= type= value= typeset -u name= typeset -A TRANS TRANS=( [ADMINDN]="ADMIN_DN" [BASEDN]="BASE_DN" [BINDDTNAME]="BIND_DTNAME" [SERVERLIST]="SERVERS" [SERVERKDBPATH]="SSL_KEY" [SSLPASS]="SSL_PASSWORD" [SSLPORTNUMBER]="PORT" [SCHEMATYPE]="SCHEMA" ) #================================================================ : Populate the return hash with the retrieved attributes/values #================================================================ /usr/bin/odmget -q "group=LDAPServer" HACMPLDAP |\ while read LINE; do [[ $LINE == HACMPLDAP: ]] && continue if [[ $LINE != "" && $LINE == *=* ]]; then ATTR=${LINE%% =*} VALUE=${LINE#*= } VALUE=${VALUE//\"} case $ATTR in group) group="$VALUE" ;; type) type="$VALUE" ;; name) name="$VALUE" ;; value) value="$VALUE" ;; esac else [[ -z $name ]] && continue [[ -n ${TRANS[$name]} ]] && name=${TRANS[$name]} if [[ ${properties[$name]} == *([[:space:]]) ]]; then properties[$name]="$value" elif [[ ${properties[$name]} != *$value* ]]; then properties[$name]="${properties[$name]};$value" fi group= type= name= value= # Reset these variables fi done # Make sure the last stanza gets processed if [[ -n name && -n $value ]]; then [[ -z $name ]] && continue [[ -n ${TRANS[$name]} ]] && name=${TRANS[$name]} if [[ ${properties[$name]} == *([[:space:]]) ]]; then properties[$name]="$value" elif [[ ${properties[$name]} != *$value* ]]; then properties[$name]="${properties[$name]};$value" fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_ldap_server_attributes()" aes_r k°;2+ b~bb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_localnoder_attr#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_localnode.sh 1.3 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)59 1.3 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_localnode.sh, hacmp.assist, 61haes_r714 6/10/12 15:22:31 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_localnode =head1 VERSION Version Number: 1.3 Last Extracted: 1/31/14 04:40:52 Last Changed: 6/10/12 15:22:31 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_localnode.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_get_localnode =head1 DESCRIPTION Gets the label of the locally configured PowerHA node and displays it on STDOUT. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_get_localnode { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_localnode.sh, hacmp.assist, 61haes_r714 : INPUTS: $* [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values print -- "$0()[$LINENO]($SECONDS): $HAUTILS/get_local_nodename" >>$CLMGR_TMPLOG # Always log commands VERBOSE_LOGGING="" $HAUTILS/get_local_nodename typeset -i rc=$? print "get_local_nodename RC: $rc" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_localnode()" ====== k>:=2+ b~bb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_location_dependency_by_typeoup#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_location_dependency_by_type.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)20 1.4 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_location_dependency_by_type.sh, hacmp.assist, 61haes_r714 6/10/12 15:22:32 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_location_dependency_by_type =head1 VERSION Version Number: 1.4 Last Extracted: 1/31/14 04:40:53 Last Changed: 6/10/12 15:22:32 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_location_dependency_by_type.sh, hacmp.assist, 61haes_r714 =head1 DESCRIPTION KLIB_HACMP_get_location_dependency_by_type =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_get_location_dependency_by_type { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_location_dependency_by_type.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset mode=${1//\"/} typeset -n list=$2 [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i index=0 rc=$RC_SUCCESS typeset -A DependencyModes DependencyModes=( [SAME_SITE]="SITECOLLOCATION" [SAME_NODE]="NODECOLLOCATION" ) typeset cmd_mode=${DependencyModes[$mode]} #================= : Validate input #================= if [[ -z $mode ]]; then rc=$RC_MISSING_INPUT elif [[ -z $cmd_mode ]]; then rc=$RC_MISSING_INPUT else print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clodmget -q \"loc_dep_type=$cmd_mode\" -f group_name HACMPrg_loc_dependency" >>$CLMGR_TMPLOG # Always log commands for rg in $($HAUTILS/clodmget -q "loc_dep_type=$cmd_mode" -f group_name HACMPrg_loc_dependency) do list[$index]=${rg//\"/} (( index += 1 )) done print "clodmget RC: $?" >>$CLMGR_TMPLOG # Always log command result fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_location_dependency_by_type()" e l&?2+P2b~bb&= # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_log_attributese  =e aiorstcdhlnp"#$CEILRS[]_fgmuv()-./12:ADGMNOPTbwy&',0;>HU\k{}%*+3457BFKVXqx|!69Lj!s:q mmmmmmmmmڳgB-rTh &HXdɉp#lfQJ 8vD &TX``h=75*E а$_~_J 8=$I6@IT<*P 4$,2hn8i6z3$ bUd D104,D (LL@X5YAqq, uYM)xxHxxU"M«_ Vc)Ǫ+/fBAOǽܾTBAGjX@Lo0c 9ɜ02$ 4T`TT dD{qɐwEVa1T{ų DA%Va1T{ų DEڵ1$TXT{pYD3\&8 y aDxNù&z`mmmmKcbQkh  0_ mmmmj͹OjUV_ BgUV_  hI_GULpڌ;74T`V#&9QR>Mk ܠ0BrA: ޅ"XD.uY _GULpYPj:c4ڿ0x"z^ق:cmXM*@Rdx;#lf-vQڦa-ʑj ONzm؊;G:ZlwrER ' ,,&3B`\LX<\LX&\b#E˒,Pdh&J ,f&J_Jra٤B0 0%X2_;4QFBD 4Ta0O"n  *0*\H3ZR-PؙBؙ @ 0`J 2d0*L!CL(`b$d`UؙBؙ   adBcCELQdW2g^elaa1Ta2"P\P f>JȨóۏʄI̙@P;HbgIZ˔ho0c 7"_(E"̙qJT_&ziᆧ"_(E" _&zi&zCp#&C͹X^``;E>M">I(*$HɐrA:D(}BD 6+/f Ȕ&KֿȦ㝸Cz#&ARyjʚ'2┨^#ȃB *P\%ɒ.%pUa5 5L$by;/@~<4,0~(Ad1Ijkƒl6frNQcbgB-rRdv&d?Μ~3gB-ruTnz2.j3ѹEEd?Em;BtpT8$mP۞uk UNNʑVCڦ20)sβ ͊#1϶G%lj88raHf)6!@\1@ՐnyF2 YM%YV^.CiBʼnCr"1J8jJ&.&,LQPCPr3P4Rbb!u< &Y$)ι|XsМ۟&j\qIYlvU&tEU6JxY?Mm. !V^ȵcIN YMqJq8r")J+!)6!MnYϜqjM1ݧUNNʑVCAXN Y@ ?/mSf}9+!㌆eǣ&GMU{ZLGIqA+!\v_ j::L?<]HE)αMV,i)|sd?lSkTѕeDeDw)b9;T6dZ1Mmd?㬋PҔ"yނgN<;.)N\(_LEd?nsДvY#Ƅ8l0A,DC&qRa!aG&&qL^ѳј-u)b"Lr^):7/-yVB90J/bD0+Ā h^UI&(rQaV  @$"eHq\fZSBBY?) /@0Ma8$CA2B&LM&㆙g0@& uPB AIOA@ $V .Pנӏ7*n80 x0^gN?OKpn8ԥb˒,PdhZbj\mܤ~uϜeÒfڜ9kK EZ7&0B !CW4nSor>qKzn9js -:bUcD3Lcs'CD;UV_3 "P1C9ɳ+Sd ȴ{;6)5Lq&"̓n=)J;# )(wA/ZRD2Ƃ%ּ%^>tf2ewrESb.aTy&6y5[3L<+DpVPi;<'E GGI3sy4unsn<+.;;<;TTqC:A^pqјv㌆s(GjvqoD_(ʲ2.j:ruCs:$cihDU?dx9x*"JsmNA)zm# ͊#8SOs吶mmmmmmmmmVC*`s%ڢ2Cbr2%CGRɨ[mmmmmmmmmm!i.,\x$qj1JU\kw{}%'3467BHXYqz|!59/D %on@P8P0E"ҬZ AY%Vb >Y|7Ap{,u,=/_pp_<',6޾ZX2O @},n$1߶M-7 ae6Zx>c"EỆ@J,Q2$LMCw (h_ PCB`*!2 Z`uQʲVsn&ɀ C1 *!%[@yȷ;oeUjzufnD6*3%e k5v-Ugh֛ ؈=^g6qKNktz~0՚ު͇z838>l?NsbAkL G0ۜ-d g}*6>rm/y_.l+<l?}{s3VRVpBVT_mYᚭ/N A&"x"c !R&PTT1\$'DC͛w(ZT]1sk>O򨇻5n'TDrwZ$$*YD &+ۀǞ 7|>7("UgmSY@9mmmmm޳*V'Y Qf_'mmmm[3ۜ#@a-xn'DlK^-=>>iSϣhUex|t̗i$C"LM 6Q,A@a0Lb'Vsnb'?=>N$HEDȖY[ YNWVj\$U"ŅEDȖY[ YN^a1jo: <0k]F֨ 0&PDmmmmmmz[h_zpA7*`܃]#9оoEKh$lFO@(&}]6mmmmmm{ePV-x }xh֊Y@A9b\{NVsnB(g6g>\؄Ͻh֊}A ͛Bu~ΪnDQm놻@EYͳtb!*A4"1 1wiwmmmmmmmmz[y4A)ܜvZ-N ~؊ immmmmmmm S"M"e8H(%7&i0; pa /sa;%(HrI&TLmmmmkrJoU D;8틻mmmmm]`s4k֋(ZT6%͇mmmmmmmm]7-\9*~p=AY-jo<~|㜃KaEƙG޴ANsa^*y=ʵ^Ld]soof1@|7"sm%o­qiP͈ޅmGe>we( 2mmmmmmmm|=3*;[Bҧ(ZTDdPބ9 9d`Ib i;3FdI6%̨͇dVfި;$ 1efOwdIQ&DCFLLI,T@aQHQB2>6l,"ȓJL4PVxa`s4kheC"HN9ȓK6lKiPȭE2$wفѬsZ)PȮkE2$BtS"M,̨dW6lKiPȭ1ͽPw7%ͅZ"̨̔Bu'%@4iv^w;x;3FfI(&<ٱ.l=h4L$Hlؗ6ӿ.}|Q YTѬsZ)PȮleC"f9fT2*1ۃS" 4dILK@12b:̨̔Bu'%ZG 9Q] FcE3*hLe *A_dbwZ'*w̨̔Bu'%ZG0sZ!"m̨dWa"EDǘ(E4Z&$U"Ņ8v1PPYS"M"e "]" eFd9,.k `H&HT LDzT^[1; frwXhHT"YxHN0",(E4X- ,ES(* <0wفѬtL$HE M,ٱ.l=L$HE M, DdK(`T c˨HbdyuZX$\A(+X6nX$\%͇‚ <0%͇̒PLy`x wg4L$HfcLʆEsfĹJ 0>uE3*a"EDǘ(E4ddc,L$H[AfOw>zGq !RHƉ PqR\`5(XG@Ң̿u/Z|~޻2KG"g h< F0",(E4fega"ER,XPia఑D,Xg‚ <00",(E4rwfcL%ǘ6%͇|};L%0 h E-*y0XHב; PF4H&HTaU*28ʳ(>B ցx,$A>8v1̒PLy0D{eoU}2$׋L4ẗsfh84L4!ȓHjfDB.>904B & B#Z{Ϸ@!D 0@a176A9`s &HTR,.:!z$G,,Ki954S2IA1͉sa;3F9a"EDǘ(E4fĹ1s*R̵ҧX-ۃS" 4dILK@12b:̨̔Bu'%ZG 9Q] FchLe *A_dbwZ'*w̨̔Bu'%ZG0sZ!"oa"EDǘ(E4Z&$U"Ņ8v1PPYS"M"e "]" eFd9,.k `H&HT LDzT^[1; frwXhHT"YxHN0",(E4X- ,ES(* <0wفѬtL$HE M,ٱ.l=L$HE M, DdK(`T c˨HbdyuZX$\A(+X6nX$\%͇‚ <0%͇̒PLy`x wg4L$HfcLʆEsfĹJ 0>uE3*a"EDǘ(E4ddc,L$H[AfOw>zGq !RHƉ PqR\`5(XG@Ң̿u/Z|~޻2KG"g h< F0",(E4fega"ER,XPia఑D,Xg‚ <00",(E4rwfcL%ǘ6%͇cL%ǘ3s0̈kAE =-*yoĵ̗L}Pwi9;^GH:Z$$*YB !R.*_֒,Xa]O<9Ey?>Pw h< ֨ "%ˑ&*eArѭ̗!F1D14uP[ʏ"[Z!ȓH88D;kG "Xh$"#TBGTp̏N*}I@}D)1#d.`68x[AYY?DwfT"&3EX/>O4DM"fH$I$$Xy*dۉ8>F@ Q2(TP5]"0LD@iBN Px$/ۜ#BK0@ ,Xe ($I$$ B>O4]" @P9BDK(YB &bi&G ;Br8$/ۜ#F% P"%,RD14u#Ą2& q>D"P$I$$( ,A%K wZ&Gۃ@0'6o ̏Nۜ#E.PXJ ( *bi&G!'Bۜ#HY$MLOw^-=2=:PS'Ԕ%Aan>O4\ndzn. A",;x;mmmmmmmm$/kl=t*ȷ9dxf~Uu#/eUY]" r6S緪=Qyr{h(Joja<}>'5g6,okmmmmmmmm9s5PDPy(XM"ƙ,*!( 狢D@ilؗ6ӿϷnp|"x$I;Z{XCD }{si"d L(M$MsfĦw},0D4HH 7F59;(+"LM 4 wZ$IVldIaan^-=mmmmmmmkr'5Z[Y8ۖ{o}@f­.Qmmmmmmmm(+Er. A"=ۃhl#V%͇ S"M"e9=VaCۜ,@gۉ8>Nmjw9AZ-ۖ pa /!9)&24 /}{s6mH1D3dILm7Iȁj*Fbv *ʈbQY͸ 1pmmmmmmmmmmp ɪy?Vp %-KWi^p,,pڧϽ"6,a2xxQ"Ը>=kkq؂xY7.9{j;4r-Vp\%^yMoA<[<5Z_YVg`{֮oG\7ʔ ܼO?CH|,[%@ӄZ(&9[<4r-VpZE\7ϽW"DǒH~+M&x (E4$-WLc-߀aB)Ly$n⸃<1k{нl?=5ZOElB\9+8E³pK>rz':U 5@Nr-bAps ?G"gl?\&Pr%rzӄZ-ȷ͈K>s BYǫ4 .-UE>=w Gyg: g"nD/l3Z]oCMSzPO ϛUU~qş­zU N'ܵ*MVYʵT =o pAf: k],/Ŭg: g"Wśzl=Tg՚'6(\~OZpYzުDR&`G-]3sg ڳaYalZ6!,LRK?> rig ~yVEh3. ~DLO<h GŧkL G'|6Ԅš57YCs p mmmmmmmmm@ӄZz8#` ULa˽sHgՇ~Ly$&D P @Uj3YVTCPzmY':W̤X۔"Mg#;ՔLUiqC B Aua,* $3<7e J|E0d6n0U{궬޸_6oY놹؀n}{s,AK$&o4²cm {ZVڢ>b ` ]Qh6=ۃ,79k*,m=~qeVd sPw[{o|޴޸6VpZϽV; ~,>R8a:״g{mŽee6v #ց=}(Y|=&g  ։jx1X9˜wr-h.k 8nr } yUŽ fb;P MMSޫz/l_{Ko~r 3|~8;Qr /a/x> ?֢ pmmmmmmmmmmtⲬUn 2o{S5E8Wxpjy#.mmmmmmmmmmny-)91y@$/5E6mmmmmmmmmmp iT lB2+3bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_method_attributesribute   =e iorst$acdhlmnp"#CEINORS[]_fuy&(),-./:ADGLMPTbgvw*012;>BHUX\k{}!+34w"K;2)Rr.Z/A㭊y0pE\Caa 8\bEM((hdLWa   `@4"`MU\D &4".0hnbiYnH4r3&`X`  A40,`T` V @ -mmmmmmmmmC(%47147$i90)0E^-rXmqNuPj0&2͜YqMՇ**6E)(jP\ӎGVbғmYk2訤{ %D"sjf8')qw t^1J3 !!A2k.r0EK.Hg'Wz՘~6_#՘䄇R4i!뽫Gx$04(Ta*PPhAET=4yaqRƆE MAQz.UTK|gy:8*(.(LG%hفE ô\qDjp4佲I`zܐ 4Hb4@&mc?[mmmmmmmmJMN_;aqNm9+hF/hv;8 G%.t5AM%/͹bS(:p?Ĵ\r1#hf !mmmmmmmm۟ճ†*PИcEK ,aYnHT`|N= x䆂0Hay I3&ASV9,6`El9:y2&B )]^_ ((H"fmgNZX3uy[H#2g - ܼ-.T X#ɔ$21;p@KfLax`fL aC8Z9ic?uy8X^((H"hk?&PPGs&p03&PPD奌!mmmmmmmk?IJf;Pz)MHMRAd)ʺg mmmmmmmYx`f{4\ D"4佳!\pgf(H^Lra%kك?ލ<3Xۖ"h@EᡸX^DZ,L"uqi4Ւ:a//f g4ǬiX z#CG&PBǭdKqx,Lh&D\`ҳܑ#hfmmmmmmmmma ȗR8(XA1I/jkSl6CZG%pxԇJA]y~lŮ[hGAE8,!訨(`Ld81kWRUmJ_mJyTjRJRaբ{G a e6jP\mUu%YZ2V fPvh58dvRڶFr Xm?`9Heܬ㍑֬7-r͹Sl3gF-rQ@nzF2Սmȓ0/Q'# Q1bEXCr@= (&.H@)("b䁬! ZqUL (&.H !;sWsBsn sB-ra4"톺QQv`:Pn T//B-rscnzE[jSyp0Qˏ(Ů[l3C͹Sl5=wBD1 ܡun{Fڲ (wj*єCA NuP[]ڱ=T",!;#hh)#ݱaBjєЏ {E=4jtSAaKP9 aD"evvաSs \e9|s;A?hT{VҕddN[UsB-r(4@'9a@\j:rB';訨2ƒK/Q\E?js 01qD bp08w`;aUE4#9asB-rVa .L58NWոY[:-X۞kSj)ե&ƎNrbeDA2k.r0ZDA2"K(AC-18%"hJ\]NՇXA-mmmmmmmmm,Z崤pQF`H'"hR8"`аSSe1,Lh&D\`ҳܑ#hf eNPH .LoӒܖ1ML*SrD`%YnH,QQr^wVbc2FI qNtj͹f)!aVG19A V(HI(90cm8"-P͹sp&NB.WVbSbeB c0P7%,H3^Ն̳e9@jTorӹ|SrPr#<%te )cS%프!//fĀ L!C9Ђ{ٖ9NށuMcN9)?Ӓ[((-Nǭ)qwE19A VX@F3k;φ;/)H9ܼh.qvL( lBZܭ/AN^?MnE|%yE)o8ѝ'L5@!۟%SqŒfpr@Ӎ|eGB0 K)Kj˜:6F;Vg@0%@Ӎ|+JȝtYl"hp^Qi\%m)qvE=!ʉȰ+,xpQȆcBmmmmmmmmmma e9͹E:Նô\qOB1W8΋j|" +qMa T&R*7?jm4 9]yA󼬓n79͵I))6.~:tsmY-Y-ZYϔBmmmmmmmmmma YȠ= )0a %+D>( @=W%"ZQ84:Ԣ0IdBmmmmmmmmmma qq@jrMuE:r.EmmmmmmmmmX lLD2+Ebbb&+ # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_mirror_group_attributes    = eiorst$EINRS_anp"#ACDGMOPT[]cdfghlmu()./:HLUXYbvy,-012;BKV\kw{}!&*45>Wqx|%'+367<@F89?zQZ^ j h q%(LDȑI5#nTZk/7\|ۘtW`l7hh.- r$]:P8̇R, 8y"t<X`}StdsFF/0$9%s9HFb im&PQDbn as8å,=K@X  [F㎝y8ѾѸ :,sĤQҜ^bn3g',IN|s/8gȪ;@2|bq\sHKon8&"LȦAb  >Q0cA^*0yx@$Qcnǟ+^*~nl3geyѭ' Uq.!a3G17y8Vp5ykF͓Tc]/#O^n28 3d4o:R\ۥ `H5>1V7ee8T,(E2tH2eCbq @xΌ(,4 r$]:P8̇R, 8y"t<X`}Stdp\CW)0 8@@0`P0 dMLUCbNy"5,88"08*Ⱥ|;`ˣ7C5(zxӢ 8>o\ ˗?,[̃[k]}x5gg!'stEwd[6mmmmmmǝv7V ˝>1XXO(. q7y5O:|n1y#3˄.g,,&t^Ay%˝>E oGjm3mmmmkK]ݜ\Yܠy8 tE6mmmmmylƁ0˃ys ,[@Ecqp@ ˗p>ĝ=$"&Py"; |cn0>pp ; s0oI<"9aYX$l,y"8>1V7df ÌX9N氰k=eDEUpo3ad2"H*]$%H@XEE `$33Kbe/p>S,X>1V7df pcɓ7ẽ,X]I]W:)) fQqeuqS,˅F7f 9Oc7&* Y2eVdē EBbE"1"|cn0>{5:XX^1V7ef/bx$@YE2eU `~2b@0t2k6'!xDf0~n.g+F -$REI5坁]2o88_)x_#Lh|cn0>q@Ecq@RE$q4 lPAZ&*b'@YE2eU `~`ec̛Ā@f`ˣ7EXDPI2'osn`2ayP IAAj 6c],HE "IDL@,̙=#x&Xsq F1QyMdž 0 ٌtfH"+( &A22d`NmCL/< ,bf|C0h5H~y#&y 3f0eћ"ĈTP($Dц yIp o  6c],HE "IDLe0k%5 3{X@P**()A z1B8Ȧ8"f0eћ"QP0qE(5*(IDLDTT Qb$MD oeh &PDriAaV*$I@p. q7I2#M *T"LH@-3#4("94 H$Ċ7`ˣ7E("94 H$Ċd/F $AɦXD&$TcٌtfH@$V"1"d/F &"$ILH`ˣ7E,A%Aꠒd/F 1b *TcٌtfHHɓ &A2b *"+&L#`ˣ7ED5R*MAEYT &A2b "P&ĈEQTcٌtfH&EI("+*d/F % Rj ,H A%A`ˣ7ED5R*MAEY2i*d/F QH5$Edɦ Txc], MAI5JLz($DшPy%MR2aj$T"LH &A2bIbDQf0eћ"$ȄLR$1"$Dш"E2H$Ċo0TB (`q Laˆe˃ys f0eћ"E "IDLq\njof0eћ"E "IDL7 32bDV*(QL"e½X|\Ã˗ ˗8YbFc],TP($D˅{qdA%XrgٌtfH"+( &A2a:#5-f0eћ"E "IDLWe˃ys f0eћ"ĈTP($Dц yIp{=ym1.*(QL"e½ . q7FotIE A( &A21.T &A2V2aJ8H*d/F o 3{YDU&$V"1"$D< q˝>QFot&8($D˅F`Y8Eҁpc[6mmmmmmmmo~kE Ysݚuos^*~na7a5؟87?22uq}}q2r3y:\^\k?1$MLNn59mmmmmmmmPp4&"M5* >1V7dTk,[.QFot p &A2\po3a 3{YI27f 9ym1.*(QL"e¸ qdA%XrgmmmmmmmkztU & לSt؄v]BkpmmmmmmmPp1B8Ȧ8" @P**(E&EE0LD U"H+ Eb*(1b *WEX&ADJU"XH*% Rj ,H A%A&EI("+&M1V ϱ'Of0eћ".IDL7^k,[@(`ˣ7EXDPI2 . q7mmmmmmm[w3לSt^ylBzt_5%QS$EmmmmmmmPp0)&UbDVLu(MTPQbDVU"[&EI("+*"P&Ĉ4XJf >ĝ=Fot p &A23ym1.$EbA$"&\+ی29mmmmmmmq ;kqx\/<6!=vY:/DHmmmmmmmpL5H% Rj ,HʤUuL ("D5R*MAEXAU$?QH5$Edɦ T0o$ 3{YI2o0ehtfH"+( &A2^d\$"29mmmmmmmGvbeᯨBjT"-mmmmmmmm$}ab"DXĊ+8 XJ@$CTQUY2d-DG"ؓ2dNA$"&]`Ûiym1.*(QL"e¸ pf@Y xf\70IٌtfH"+( &A24XQFot( &A2\ . q7tc],I%&$$D˷dbN`ˣ7E@$A v{k,[@(`ˣ7EE pn>k8>B29bN`ˣ7EMT*ePI2oŴ 3{XDPI2 5PYI` <x<. q7tc],Rj"ʊ*UJd.OoehtfHQBd.k8`e˃ys >ĝ=FotPy%MR &A2>ĝ=FotPy%IbEPI2o$ 3{XY)XD&$U v{[D(XIDOYrazIDL\01`Úmmmmmmm?HֻLt<a7Eܙq{3d빜q6mmmmmmmTHxUW}4H\+x+ 8lۥ7fg, M`K(L%"yywj<5he:f0E1đ7فdOH HED hfAp<cL@˰E1đ7فaɞ;)$ѭ Ys8"癄f٨G{c|^ml8*/:xy22uq~g]fg,θI +`7*q5^oqE&QT&1Y8FGdY8fMypͽΝy<&- 8lm5^ontA@˸Y FMylMx3ϙ]c.g1Wf.\assF:2b.,pĦӼ;<+tlEơ57O/c2\0`_\۷j<03˄sF3:i]`q Շ3L5RWMc<~Shv~N3M˙ h֍&QɕK_|qoo<ˢ,g3hO/7s8j&L+ 9c7 g9vyv6W6O/7F87ˀMhT_i!˞ h֍aѭ?6OApaѺ !=Mqp]hd1Z6mmmmmmmmmZh&1pH L 2`;ӎ\/Lq$Z"9aXۦ0쬼ӎ\/"M4ϞtC 7^SMC8p, ` < Cq1V7g'+όa ۘ:xpHtEόaktɕD?kzB8όaX2 "(U"i:q{.glWeyx0B.@&xE9% ֶrAxE2,7<X`}I% _-).\UxøG=<ٖb/-+w'2Ws8p]k[vc](DQ.4]הa׌WoDZ<_\Vt^<@8]U]3ayÙf:u ki.dQ%kpP~7F0˦qo3ˢ5e\\Yث# :R4|pX~m:+9񋌷ei3ҁvf'|3 @[`P<.O.3O ,'mtbn3O -b(v\]is.es0t!=s6?_.0OqN^&fy 0s]|]^d7`@0 8G99j:N+`X.!a֍mmmmmmmmmZ7*q٨;6@1g:"2Ѽ s8θ<;qo:wb=;`7;y! hmmmmmmmmmmq\^/\Tѻ2& &2 log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== for k in ${!properties[*]}; do unset properties[$k]; done typeset PAIRS= typeset -A list typeset -i INDEX=0 rc=$RC_SUCCESS typeset key= typeset -i matches=0 typeset -u attr= uc_key= typeset -A queries typeset -i i=0 #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done #======================================= : Make sure we have something to query #======================================= if [[ -n $mirror_pair ]]; then [[ $mirror_pair != *,* ]] && unset INDEX for mirror_pair in ${mirror_pair//,/ }; do CL=$LINENO KLIB_HACMP_is_known_mirror_pair "$mirror_pair" 2>/dev/null if (( $? != RC_SUCCESS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$mirror_pair" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 166 "Available Mirror Pairs:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_mirror_pairs available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND else PAIRS="$PAIRS $mirror_pair" fi done elif (( CLMGR_VERBOSE || ${#queries[*]} > 0 )); then CL=$LINENO KLIB_HACMP_list_mirror_pairs list for name in ${list[*]}; do name=${name##+([[:space:]])} name=${name%%+([[:space:]])} PAIRS="$PAIRS $name" done else dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT fi (( $rc != RC_SUCCESS )) && unset PAIRS #================================================================ : Populate the return hash with the retrieved attributes/values #================================================================ for mirror_pair in $PAIRS; do properties[NAME$INDEX]=$mirror_pair print -- "$0()[$LINENO]($SECONDS): $HAXDWIZ/clxd_list_mdp_director -s svc -d\"|\" $mirror_pair | grep \"^$mirror_pair|\"" >>$CLMGR_TMPLOG # Always log commands $HAXDWIZ/clxd_list_mdp_director -s svc -d"|" $mirror_pair | grep "^$mirror_pair|" >$TMPDIR/clmgr.KHgmpa.$$ cmd_rc=$? print "$0()[$LINENO]($SECONDS): clxd_list_mdp_director RC: $cmd_rc" >>$CLMGR_TMPLOG # Always log command result if (( $cmd_rc != RC_SUCCESS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$mirror_pair" 1>&2 rc=$RC_NOT_FOUND break fi cat $TMPDIR/clmgr.KHgmpa.$$ |\ while IFS=\| read name disk1 disk2 type rem; do properties[NAME$INDEX]="$name" properties[MODE$INDEX]=$type properties[FIRST_DISK$INDEX]=$disk1 properties[SECOND_DISK$INDEX]=$disk2 done rm -f $TMPDIR/clmgr.KHgmpa.$$ #============================================================== : Even if there is no value for a given attribute, we want to : display a placeholder for it, so the customer always sees a : consistent, complete set of attributes. #============================================================== for key in ${_COLON_ATTR_ORDER[mirror_pair]}; do if [[ -z ${properties[$key$INDEX]} ]]; then properties[$key$INDEX]="" fi done (( INDEX++ )) [[ $INDEX == *0 ]] && (( INDEX++ )) done #========================================================== : If any searches/filters were specified, handle them now #========================================================== if (( $rc == RC_SUCCESS && ${#queries[*]} > 0 )); then CL=$LINENO search_properties queries properties rc=$? fi (( $rc == RC_SUCCESS )) && CL=$LINENO prune_indexes properties log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_mirror_pair_attributes()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_mirror_pair_attributes =head1 VERSION Version Number: 1.9 Last Extracted: 6/16/15 17:51:07 Last Changed: 6/1/15 14:06:46 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_mirror_pair_attributes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query mirror_pair [,,...] clmgr -v query mirror_pair NOTE: the alias for "mirror_pair" is "mp". =head1 DESCRIPTION Retrieves the configuration data for one or more PowerHA SystemMirror mirror disk pairs. =head1 ARGUMENTS 1. mirror_pair [REQUIRED] [string] The label of one or more mirror pairs (comma or space separated) that are to be queried. 2. properties [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2011,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #==============================================================================  kH2+4bbb&4 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_mirror_pool_attributes#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2018,2020,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2012,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 430442e 43haes/lib/ksh93/hacmp/KLIB_HACMP_get_mirror_pool_attributes.sh, 726, 2147A_aha726, Feb 15 2021 09:46 PM #============================================================================ # # Name: KLIB_HACMP_get_mirror_pool_attributes # # Description: This is the main, FPATH function that is invoked by clmgr # to collect mirror pool information. The cl_lsmpvgs utility # is invoked to extract the necessary data. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The properties hash is populated. The only other outputs are # any error messages that might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_get_mirror_pool_attributes { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.4, @(#) 430442e 43haes/lib/ksh93/hacmp/KLIB_HACMP_get_mirror_pool_attributes.sh, 726, 2147A_aha726, Feb 15 2021 09:46 PM : INPUTS: $* typeset mirror_pool=${1//\"/} # Get the "properties" associative array reference, and initialize it if [[ -z $2 ]] || [[ -n $CLMGR_LOGGING && $2 == "|" ]]; then mirror_pool= typeset -n properties=$1 else typeset -n properties=$2 fi [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== for k in ${!properties[*]}; do unset properties[$k]; done typeset MIRROR_POOLS= OUTPUT= typeset -i INDEX=0 rc=$RC_SUCCESS typeset key= typeset -i matches=0 typeset -u attr= uc_key= typeset -A queries typeset -i i=0 #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done #======================================= : Make sure we have something to query #======================================= if [[ -n $mirror_pool ]]; then [[ $mirror_pool != *,* ]] && unset INDEX for mirror_pool in ${mirror_pool//,/ }; do typeset FOUND=$(CL=$LINENO KLIB_HACMP_is_known_mirror_pool "$mirror_pool" ${_ENV_ARGS[VOLUME_GROUP]//\"/} 2>/dev/null) if (( $? != RC_SUCCESS )) || [[ -z $FOUND ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$mirror_pool" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 173 "Available Mirror Pools:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_mirror_pools available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND else FOUND=${FOUND// /_} MIRROR_POOLS="$MIRROR_POOLS ${FOUND//$NL/ }" fi done elif (( CLMGR_VERBOSE || ${#queries[*]} > 0 )); then typeset available CL=$LINENO KLIB_HACMP_list_mirror_pools available for (( i=0; i<${#available[*]}; i++ )); do MIRROR_POOLS="$MIRROR_POOLS ${available[$i]/ /_}" done else dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT fi (( $rc != RC_SUCCESS )) && unset MIRROR_POOLS #================================================================ : Populate the return hash with the retrieved attributes/values #================================================================ for mirror_pool in $MIRROR_POOLS; do typeset VG="" print -- "$mirror_pool" | IFS=\( read mirror_pool VG mirror_pool=${mirror_pool%_} VG=${VG%\)} properties[NAME$INDEX]=$mirror_pool properties[VOLUME_GROUP$INDEX]=$VG print -- "$0()[$LINENO]($SECONDS): LC_ALL=C $HASBIN/cl_lsmpvgs -m $mirror_pool $VG" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$(LC_ALL=C $HASBIN/cl_lsmpvgs -m $mirror_pool $VG) cmd_rc=$? print "$0()[$LINENO]($SECONDS): cl_lsmpvgs RC: $cmd_rc; OUTPUT == \"$OUTPUT\"" >>$CLMGR_TMPLOG # Always log command result if (( $cmd_rc == RC_SUCCESS )); then typeset AIO_CACHE AIO_HWM DISKS REM typeset -u MODE SUPER_STRICT print "$OUTPUT" |\ while IFS=: read NAME VG STORAGE MODE AIO_CACHE AIO_HWM SUPER_STRICT DISKS AIO_STATE AIO_CACHE_VALID DIVERGENCE AIO_CACHE_EMPTY REST; do [[ $NAME == \#* ]] && continue properties[MODE$INDEX]=$MODE properties[ASYNC_CACHE_LV$INDEX]=$AIO_CACHE properties[ASYNC_CACHE_HW_MARK$INDEX]=$AIO_HWM properties[SUPER_STRICT$INDEX]=$SUPER_STRICT properties[PHYSICAL_VOLUMES$INDEX]=${DISKS//+([[:space:]])/,} properties[STORAGE_LOCATION$INDEX]=$STORAGE properties[ASYNC_MIRROR_STATE$INDEX]=$AIO_STATE properties[ASYNC_CACHE_VALID$INDEX]=$AIO_CACHE_VALID properties[ASYNC_DATA_DIVERGENCE$INDEX]=$DIVERGENCE properties[ASYNC_CACHE_EMPTY$INDEX]=$AIO_CACHE_EMPTY if lslpp -l "glvm.rpv.client" >/dev/null 2>&1; then properties[ASYNC_CACHE_UTILIZATION$INDEX]=0 properties[CACHE_FREE_SPACE$INDEX]=0 nodes=$(clodmget -n -q object=COMMUNICATION_PATH -f name HACMPnode) for node in $nodes;do # Get the rpvstat from the node where VG is varied on. is_vg_variedon=$(LC_ALL=C cl_rsh $node lsvg -L -o | grep -w $VG 2>/dev/null) if [[ -n $is_vg_variedon ]];then print -- "$0()[$LINENO]($SECONDS):cl_rsh $node rpvstat -C | grep -w $VG | awk '{ print \$4 }' " >>$CLMGR_TMPLOG # Always log commands ASYNC_CACHE_UTILIZATION=$(LC_ALL=C cl_rsh $node rpvstat -C 2>>$CLMGR_TMPLOG | grep -w $VG | awk '{ print $4 }') if [[ -n $ASYNC_CACHE_UTILIZATION ]];then properties[ASYNC_CACHE_UTILIZATION$INDEX]=$ASYNC_CACHE_UTILIZATION fi CACHE_FREE_SPACE=$(LC_ALL=C cl_rsh $node rpvstat -C 2>>$CLMGR_TMPLOG | grep -w $VG | awk '{ print $8 }') if [[ -n $CACHE_FREE_SPACE ]];then typeset -i cache_val=$((CACHE_FREE_SPACE/1024)) properties[CACHE_FREE_SPACE$INDEX]=$cache_val break fi fi done fi done rc=$RC_SUCCESS else rc=$RC_ERROR fi #============================================================== : Even if there is no value for a given attribute, we want to : display a placeholder for it, so the customer always sees a : consistent, complete set of attributes. #============================================================== for key in ${_COLON_ATTR_ORDER[mirror_pool]}; do if [[ -z ${properties[$key$INDEX]} ]]; then properties[$key$INDEX]="" fi done (( INDEX++ )) [[ $INDEX == *0 ]] && (( INDEX++ )) done #========================================================== : If any searches/filters were specified, handle them now #========================================================== if (( $rc == RC_SUCCESS && ${#queries[*]} > 0 )); then CL=$LINENO search_properties queries properties rc=$? fi (( $rc == RC_SUCCESS )) && CL=$LINENO prune_indexes properties log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_mirror_pool_attributes()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_mirror_pool_attributes =head1 VERSION Version Number: 1.4 Last Extracted: 6/16/15 17:51:07 Last Changed: 6/1/15 14:09:00 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_mirror_pool_attributes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query mirror_pool [,,...] clmgr -v query mirror_pool NOTE: the alias for "mirror_pool" is "mp". =head1 DESCRIPTION Retrieves the configuration data for one or more mirror pools. =head1 ARGUMENTS 1. mirror_pool [REQUIRED] [string] The label of one or more mirror pools (comma or space separated) that are to be queried. 2. properties [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2012,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== p kJ2+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_net_with_most_interfaceseoup#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_net_with_most_interfaces.sh 1.8 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2013 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)05 1.8 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_net_with_most_interfaces.sh, hacmp.assist, 61haes_r714 5/10/13 11:23:52 #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_net_with_most_interfaces =head1 VERSION Version Number: 1.8 Last Extracted: 1/31/14 04:40:15 Last Changed: 5/10/13 11:23:52 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_net_with_most_interfaces.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_get_net_with_most_interfaces =head1 DESCRIPTION Get the network name that has the most number of interfaces defined this is used in the two node configuration assistant to determine which network to place a service IP alias on. =head1 ARGUMENTS None =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_get_net_with_most_interfaces { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.8, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_net_with_most_interfaces.sh, hacmp.assist, 61haes_r714 : INPUTS: $* [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i IFCNT=0 LOCAL_IF_ON_NET ALL_IF_ON_NET rc=$RC_SUCCESS typeset NETWORKS= OUTVAL= nw= print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clodmget -f name HACMPnetwork" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clodmget -f name HACMPnetwork | \ while read nw; do nw=${nw//\"/} [[ -n $NETWORKS ]] && NETWORKS="$NETWORKS " NETWORKS="$NETWORKS$nw" done print "clodmget RC: $?; NETWORKS == \"$NETWORKS\"" >>$CLMGR_TMPLOG # Always log command result if [[ -z $NETWORKS ]]; then rc=$RC_MISSING_DEPENDENCY elif [[ -z $LOCAL_NODE ]]; then rc=$RC_MISSING_DEPENDENCY else #=========================================== : Loop through each network in the cluster #=========================================== for nw in $NETWORKS do : Count all the interfaces in the cluster and all on the node ALL_IF_ON_NET=$(/usr/bin/odmget -q "network = $nw" HACMPadapter | /usr/bin/grep "HACMPadapter:" | /usr/bin/wc -l) LOCAL_IF_ON_NET=$(/usr/bin/odmget -q "network = $nw and nodename = $LOCAL_NODE" HACMPadapter | /usr/bin/grep "HACMPadapter:" | /usr/bin/wc -l) : remember the network that has the most interfaces on this node : that is also present on the other node if (( $IFCNT < $LOCAL_IF_ON_NET )) && (( $ALL_IF_ON_NET >= $LOCAL_IF_ON_NET )) then IFCNT=$LOCAL_IF_ON_NET OUTVAL=$nw fi done : Are there any networks that meet the needs of SystemMirror? if [[ -z $OUTVAL ]] then rc=$RC_MISSING_DEPENDENCY else : This is the best network to use print -- "$OUTVAL" fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_net_with_most_interfaces()" @(#)0 lL2+Cbbb&Y) # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_network_attributesfaces   =eainort $cdlps"#ACDEILNOPRST[]_fhmuw()-.:GMbgkvy&,/012;>BHU\q{|}!%*+467FKWx'359Ctʒz#QL> Le8ʁX!j -2ssU_*Ëar&BE ה׹ON1I FgP98'|b)F6mmmmmmmmmQ:ův$8ȦzW.1Ðlat zE֕8p(`]+pQ̞jtdx&2WYV ʛ]L+섣!ItZ'33QE0dZ.E֕8pq%ćGq%ćdsta`@!4PADMц@Ib# E+rq(_TQmmmmmmmGCzSξ/ӭ6F0hb'YdpNu'@< ӽVAmmmmmmQBy744Ř  GsF z̓# A 0 @p21e~'e yG(`\L`nH*,PH#uybtmmmmmmmm11\RNҦ?(*q~[Ammmmmmmm)1ÂLc~jN|Bc0㻦(_SS$Y/Hy1! &TGBu^)G bjC8)sI/8TT#t *kHi"d(TbF*P 5^I\xdv1 3LHD"EP]}Wi9NbNၚDv44D*AAI/-j?T0hЂ196l4 ӹZD`-Fhb lnl;r?T(@?Z֣u6mmmmmmm vτX~xdxjDbU_{GCy3T_M:D:L0GC :-Wp'ت>U} UWGcD7`J?%LN'$A}pr4(CmmmmmmmڏkHi"d(TbF*P 5U]5W0 .pȑbeD|n9T,_Uo>}QtUj Ut^0Ó0kHi"d(TbF*P 5U]5W248;MT `qv1&08c`zCɉ8dH2>7 M7>)W@Q$BMT `q0Hփ֘ED$@HDQZ tqM$LB% HJ0!C8)9T&3$Y/Hy1! &TGBu^)G#AP cRt *3$Y/j?A1 X`i(DSa"7 M7>)W@QGh5Ãdp,G 9 0Tp)stYr?=aNh 0ѡbr lh]aNFYȁat:c}?#3f@#:d"?E N1T4hhЂ196l4.f*jASU0hЂ196l4.f*jASUA1(h֑0-G,T@fa:ٰw&pVEG\Xs.$8&pVEͅf@#@YG2\HqcI Lଋ Nc@YیL3fOKZZa@YHu k8,PJ:,PI?zW4 ȺDb%GQQQҼ*d"\B&>)1ÂLP'LPu^&fwsԗ0#bZ3Ȥ*d"\"jAAH T,ds "`fЧ*zW4*T2D7R*d"\"Qk" $P((T ŠG$*T2D…H03 kÐam xr0esF &D"\B&@ԉ7Fbw J88H8)1ÂLP'LPu^vtFavqV ʸsE hSÕ EmmmmmmQ 59A ^$\7?q΋CU^"׹qUWȵGo)1Â1Vy_BC9M/t1B ÝڱX'*ċ1F-Hy1! &TEEԃULaX!!WN|FaÎXpE5G,04D"PČTjC 'ۄ$H0<bB%,L*SMϱp+εؼ a`hozW4\"Ȝ H$@8xG a0esEȘ*.<8X1"D уzW4`H' Hu"E# lhBEǑ8@' "$H0xG AL"\r& "p#N.D Ht`ZZa D" nH40esEȘ*.<8X1"D у@` ZZa拑0T$\y 2pr bD,Lf# -"`H'0db@ĉ7FX0esF "pd7R$X?r?,@փ֘EL DF ,\"…G$1p97փ֘EL DF ,\"8GsF.pD$Kn4 ND ͛q=.G"JRoK_UFu,Sdg^`,$[F ҼnH "Gh5$ 42E*l1#G(@hӸrf.pȑbeD|n9T,_Uo>}Qt2:ӸrfH"J6#ʔ `4CMUWiܸ 3LHD"EP]}Wi9Nb?AH#a`?O5Y,S&HvGC+:]v9"V?ZW U&H fOK$XX I(Dh&h."UH*H3`8]dI(D4"PL(AREP(@p.l.֢kc&H[$%na.Ccudc Rvy) qG0b3QHk3 :?:T_c\0h,,lQHJ՘ZRQP]H*՘f(*AV(&lEFr,rN|p[HR{p'Fh֔E֞bf#3f@#sԚ?AL"\"H""(@7Rs?AL"\"H"PpHB@AN-,8 "u&?AL"\BHzD" Ԝ%lh#$J""(@7R]փ֘EE .D ,E"D$Pnulh"8 "u#QH"щ*P~q(@45F Dv8/6o0̑B@@aJ?Ztr 0HCǑ0ammmmmmmڏH \u`a:Jm:PcVxmmmmmmmӸ`fˏ8`$1(&3,04f1"d(Tb?𘠃:!|nEo;I$X(_S`4F"#mmmmmmmmmm0"#QӃV^ 毵}Z` rlUYPZa@׻Gb=(>) ,8G:ůrOGkI皤|NTRTDo.Ϋ@毵_^>~]QeξN)bs6Pʛ]rs t,_@\(,TU?8e \)PRW^_:ůp_,Tr#}_^퐑F7֘*0H=@ldDȔ$DYc |pޤ $LADA4O`02% 5zx;OEyξO5}:dZm_E_Y^T>)/j*~'\]`|8j֫ tF֘2-{'k] K$`fW/*"7ξO5}dY~dW"bF/teDFN'>k0Rv}k^E٦'6P# {]Sz<<,gsy19MFh~k0RWs'uNFRV).L_{v'kULN^'yEUȠ;HIBL1)ův}Do΁ySk@F7 *\D1+V;<;c}֘2-''\u>ȵ'`*X#Ⲵv\]ɢ7B؞zsv'k {jкTDo&/,>F䜲!Dj#r"!{=PAˈ3 sї)*q~';\,YP5mmmmmmmmmNrqkݩ"GCTD`R, rU@1ib̠"(G,pRbq/F0hOKfIB0:jA01B /<$:b @3(_QCͣHaQ_t *9BHq=;k1/͐cf)rOKd\c$E6E~'M:DdZj2,ξ;|',3/OKc2ap`~W4\"@ix6Ӫ9WyϾzDvU|17> ũ#*<~'8Qz(h=i[+拑"HbIhvzmdZ-;! [vS=ȳ`GG(`Sx2Wc91AJ_UfOKeș (8,Cs3 ԘqON ^-,_`s.@rP* يK WA1}馂5֔u ] >WxwMSsu8y!D ںp8!1*mr#b\ N;]`8B SRV).L_Qǐ= ٮӭ5LuVT"dX54D/ȹMqH1Qmmmmmmmmmm72zsUWk:o>~]MW+1E~/_M5šcd_Bz]WDnuQ1fM}Ś|?2yj1\ ŖCdxZ`/˔DnONu'|8Tl_ UWskN):';EJ荶mmmmmmmmmQzlW&AVWDn).tX&q"#xL9 T DnE"6mmmmmmmmmmDn,X&^u4PHO zr`#mmmmmmmmmm@1!  kTN2+% bbb&% # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_network_typebut#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_network_type.sh 1.5 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)06 1.5 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_network_type.sh, hacmp.assist, 61haes_r714 6/10/12 15:22:39 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_network_type =head1 VERSION Version Number: 1.5 Last Extracted: 1/31/14 04:40:15 Last Changed: 6/10/12 15:22:39 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_network_type.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_get_network_type =head1 DESCRIPTION Get the network type, either aliased or non-aliased network. Reports whether the network can have aliased service IP labels or whether the network has IP via replacement service labels on the network. =head1 ARGUMENTS 1: [scalar] network name =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_get_network_type { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.5, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_network_type.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset network=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset value= #================= : Validate input #================= if [[ -z $network ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clodmget -q \"name = $network\" -f alias HACMPnetwork" >>$CLMGR_TMPLOG # Always log commands value=$($HAUTILS/clodmget -q "name = $network" -f alias HACMPnetwork) print "clodmget RC: $?; value == \"$value\"" >>$CLMGR_TMPLOG # Always log command result value=$(echo ${value//\"/}) if [[ $value != +([[:digit:]]) ]]; then rc=$RC_ERROR elif (( $value == 1 )); then print "alias" rc=$RC_SUCCESS else print "ipat" rc=$RC_SUCCESS fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_network_type()" C l@P2+abbb&Z # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_node_attributes  =enot $CELNO_acdilprs"#ADGIMRST[]fhmu()-./:>HPUbgvwy&*,02;BFV\1?KWkq{|}!%+349jxz'567]][0xvT.e"8`׋0+Geݗ 11}v 8p5Rwy8ihhb@ ݗ0~˧ Re5-b( cm/.._ьnN;lk1=Ĕ@rC2@#|zJ 9%SPz'6mmmmmmmm2av2f7̱|YyřammmmmmmmNA*zDSE56]An\&|w&0#A@&e< "P*=ShImmmmmwvDƳw'u] Ufah2hmmmmmN1-=brL;mmmmmmmӿð|׃eאVۃřiqv_VXޱe؆eL˼Y|x6/řiqN2e^) LLM@I J.d0mmmmmmNdX{HD. ˗3/;"˳`.W"2i 0+ekĆp<1-0+ǷB ApN\7yXUfZXM;"˳aUia6E4SSR"T@rUibĻ*-,&灠aqtP D84 ^'HNv@4j«2mI`Ip<> ؁|$˱ - ՅVeڒDz\rL,[ ~{Y&]\odv4adv EeчEe؞*-,&Ԗ=xÿ2w|-2c,[ =,.3 ˃xXȲL|"2h"2AC|$˱|$˱>`.Wÿ2w|XȲL|&IbwN;'ekĆp<&T􈦊j`JDAʈ@ =W1#0`xy$H5JIBGc 0 rh*PI(S 3/;b$H5DIA1đ.ѡGe˃xítS w=&DJ砑"$PL0d&9؄mY02@(E0a:٧E0sHjDz  MREpVeڝ81.^x;"˳aUia6E4SSR"T@rUibĻ*-,&ԝba!;4 cѫ K %%nPP7bc,[< XUfZXM,{%Xs.. f^wn2fOVYjKpNm_,30 h*U$dJ0LwNbmmmmmmmmmӿò&5YpN]嗊lA ɍg.f]ťnWd2(&eYfskick K ;ĺwmmmmmmmmm-2c Hj&P8g@r2`Ip?xPP7y<X􈦊j <((A> K58Z0Hj$"MA蔧ĽcSwjD< MA  qx,$(M.yDPQ1|jrhg0Hj$";ZvNdXz  MQjLq${qhQr&eJSQ*0LYbN^MI(Pd"S2wN q|ܚ &1Pz%;mmmmmmmmmii^,SPԊN컺2fdUfrv6\v'k;( cm/..a̋oŌ3;xfs0v'l-]嗊kx0 .zi +& ;mmmmmmmmmin]I)*"DyJ0an]I)*N;bn p8'nKQp` , E‚!$,, p\+.\LγL컋K6B`ad2,̸3.I.I^e}e☳x,L2˺yE YɅ^)Lqlxfs0v/XL\0 Lq$ih 8 pŃme8pHw B$<;'N *H=32qȳ.PTDh 8 ,k/!˂@2qmmmmmmmmm1\38vV1 N0ww`\v<\r/fv4YMb];;dLm:F݌Yf%V\ ixck|NX3"c]iqh8NEeqc2䂸Z9Y3;ĺww992ft݊ѝu%}ُc ;;L3"c烙9:/LlV `s 2+38q9nُbI)&wmmmmmmmmm;"˳ÕMAуeIsMA誂IÕ($Z ;mmmmmmmmNLxô&g ;|jq1}uik 2õ)1ft'v+FsnMWh۱mmmmmmmmӿYe_%Wji!I((@Q5U~{ąw98r=礢U5ONbKxXzJ 9%SPz!@݈ی8a!EHhp"(砑2jGIG$C 6끮֝]n\g5 xD`<<$@Ir ˑf],ʔ*8'H/O =@pSPz8ĐTrIT0n/ i6e,x*1*cR砑"*HE%`v(䷌)< o0(e ,zDSE5 QLy@Wh۱2hg0Hj$"dX5 ܹeBzjD~\7yȳ.@pJUPz$Gȳ.@pJUPz$G r ˑf],ʔ*8'H/O[r ˑf],ʔ*8'H.6 rV0Aw&2Ű"̺YÕ(TqTOMA\˗3/;E%PJTHbhjGe+1/Xԅv wHNU*>wn2=")O( &0zRcô($^($PVʏP MTLnz*=@)5PPI2"̺YÕ(TqTOMA^ítS w6eL M@)1Gdmmmmmm380~AKE?171#Gmmݘm%z\E?v+Dۡmmmmmm;"˳ L>ז)|@rJrLm_aఐǤE4SPIADǔ u\ h۱%eYp1<<$@IhYawv)F{&HO i֛o Ip3]n\ Ce#!G/0XHQc")\$򈠢cm:m@ nx@ xD`<<$@IhYawv)F{鶢q<X􈦊j <((Ad ˃0Hj$" K54{ I>/1 gLdԄFaob4nqai53DT! wAYqX&gbL,mC0˜˱.wQmNYx݊5,k=x<"ܖ@5O =|`i\ e`Ф!quYv"63DT! w$L{Mh/ i֛o i}vp2] \Q\1ĊM`@3DT! wuۧaPp*Pep qp܌˗MAP&B ,Ӳ0Leg*j*8^d\7*AWM@N}/v;,[=QUTQ"U mF`Fs! e˝2N˙iVr2,L6pr LtlPxwݗjXaCnKRvc\7 Lqfbfw.,ۃ ;QUTQёp܌;'c,[=QUTQŃme8ppo2H`Q5JLafd܃rYK*8UTMPr=5DyzyBUD(Sr ˑf],&(UUTQʞ"<<MAP&B; ܹe$E0z &T$E0z &Tmmmmmmi9Ȭ38$ f 18$ammmmmmm.qH$8E)n]M.rӴe ,zDSE5 QLy@vtɥYōao|.<<$@IhYawv)F{d,'-;O ]2ivqcX[' Q/Om_aఐǤE4SPIADǔ iL]Xḽ=a砑"*HE%xsB Mx4wr]6NdT"P f^w94K [/2iv@Leao2ivL$CȤR< $CȤP8 IHd,'- ;'ȳ.$CPz$GA!R(wN;mmmmmmm̊3Ue[9 N0wmmmmmmm;"˳5E".wUf/0XHQc")\$򈠢ckWUeZe N  bEC^mxy$H5JIB7в@S^,;Yi+WUeZe N  bEC^mqzxwn2=")O( &b-S&t 6@,e݃x'eȃPYCȥQꈹ&vF-;'J T8#a2wnAr,˥IA!ꃇDy=#IA!ꃇDygmmmmmmmmLxw+jܗbYyۗ9 Immmmmmmmmی8a!EHhp"(4)1"1{=`.W@%T% &UR ("-YUf 9B/3=&RB)(CX]ݨ kѥç"̺YdJ S],;M.5+ @ÿmmmmmmmi 1;/MA@֎z  MTIIB NDUdPg"D4 {ĝ'Ɍl,xGȤ\7yYjr `#7%f51U7 ݈ېn\2c֌\/OYrw| xGȤgTpPSPDѡG00ܸ/ N3ć(|P``as4(+}bN;MBq3:29|.LJ LR*&q.3"3dPۋE?ah<A`-.%Îef|q2DLCpbrq"$_,\e*fvjN#ip@v1.+ѥk8e&Vaq`0`fېn\2X $D#匬0\u.dVuqa|YeW3V3'e`.W?ɉ,q3MKL4JLXvrqZ\`n\Z,ͷ+8fVNe^]tplR_.,.93+;u͸v nWd2n/;w<]+6Ns6@v N䁆rX{f,i]e`$;vbc+X{f,׃J~ N,knHm%n^Ľq}K@c.[0̱+8̵,qihgY Ec~7Ep1bEGppmmmmmmmmmmS3M@YhԾ8P\ ֌dqw9y8^)0,f_.70S,3cenM,Y42˸P\ 4mثrfqYp_p8-H+L,392[/cf gYdQrX 8mmmmmmmmmmp(.XAgXMt8/b_&Y1!hV eIt^qmmmmmmmmmmӆ⬚ⰛtdEb&h 6؊g mmmmmmmmmNh lfR2+1Hbbb&#+ # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_node_stateutes   =e ainorst"$EN_cdfhl#ACDILORSTgmpu(),-./1:GMPU[]bvy&'*02;>BFHW\kw|3469KVx!%57 ZRglqqˬn52<7.6?͞nxv27`8k^;ei)w5iWZnSys)cD`Xaڦޜ6Cs4nr˭{g{n/8?,\Abṷr5jJmtQӔw? ,lm)6fl\ѕ?.z|&ǁ79mxq"f&sY̸o}ږ{0vVn/F[cz;Nv~Rk\B~FQsglÀ]W7{n/ǜ9yP.,UZstyyX&v7Aͯn#k6FN73q{pRn f<ĵa5̘{0uUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU1SoNn, rAR1sIRҔ;c?ɒEJP/&HTB Vo8PXaǐ&s?ıЈx f܄pȀNK@8Lɡ, rAR1sIRҔ;LɠNp$Efܒ H $S2hY%DTXa,K1W+)tx   X\bŐHr%Џڭ66sx3l?;l;(DA"Ȕ/@vVn/Ɯ6ޝq೷>S^V\|,@'3W1 HA12HX ͨ08㲏\oZƚ:%lokM].^UUUUUUUUUUUUUUUUT\qN*A" Xb-6\{f5r5swZiUUUUUUUUUUUUUUULǮ'4u7yǂ&I(0ydD`,'D4MkL&#W581 A&(&U"₤ &A! 5Z +MyN&LEk; ܮLKsjٸj]O7'<MtִiJ5q^S@!㰴MkL&#Wfj7SoNnڻ7r j.| L("P`,(^yeK3/ LCɓ, iҕj㦼&"``i H2~;Qrׁ82ש&@R ,dL.HaMkL&#W581 \Gv){?A;MtִiJ5qs7nW̆;3[WViw@mđ(*QG ab,[gg]50R\xw+klfCr-V0 q6妼&"`@~M7m5swL89ښF͸b振xZkJW.[<`4-㹬nz )wG "P"r/ sɔ xpvq6m; YHZ@67M\ H33tx {L؀ Y4i n \ܧq k_)v,%mu8"PD "$&,U'䧙h3x%8gjCqs Kmu:pz0n6~Rk\B%mu1,]"H.p{?UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUS?ܮ./4UZ% @ BbP",]"H. 9ogpPɋKIP+ (*)x, <3\_<..%#MNĆ1ƚH$BW7tr% @ BbP"s?s)wG5sviwB,gqq|YH D@("2E 9ogƚHK=RX'sZM8YA@1 gt"BlUUR3ayL;ַ)H$XX c?ܮ./)w* ,"<$ TBTJHDAŊD*,GD3sZ>vbP D"+/=RW,yz\(lhJwN[vb*UK)WEB(uYM$JCgַR"^ 5q_j.|jl,0 g+gbPDFKg IP;8|:AW  l,081까rX^*UK(P,]!Bp`@P+ gַK'ƚnp~N.k5,ց˂cfW=HEHQ3@t(EG=RAp[?6d@JQ9!2lY@RY^Vە^S-ρf —ѫ 妼&"nf7gP—7qƭ—.7e{ 8>mN|ֽR\\_>SlUI\?浽Hљå@]" L .a2؈O@RDohnqu_5Msr2״ǔ3rՄwKb'Ǿ Y؈4 g6<8/=Fͧ1gtp Z%(iwB,tyR TBUUgX^iwOU ab,[ ~SlD DE+A"Ȕ/9ogÃ6on {jy Ů]1Sj\P3r|UBĤiؐf00 浽gtp Z%(\ Fn/Ȟg<vq"%gnfzɒ$@PU#4-)MØ`/4-)Mbe;#rN.57AYu--5m~# ϕl`miu9;/3r˭{;|WΖsj65ofpzX7JZŦK\`EЋklۧ״?NM/sssdh%73F!/׾ _)w\nfSȔ.z)sZt۞hK5 9KP7sMm6|r#j0wl^93q|3q|xp j=*m~b॥)vWlL1gtp Z%(X .D|03Qs|_UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUT6%lqqˬn5ql96"F:ޜYںֶ2b8SjZ-~i.@ .Մl7kɷ/0?R[Է74&[7ARS'k`ifsZٛWMs&"5,Q(XnVMl7@`$(*Pqo^k:A[nk6|ֶa-泥(,H3xNOs 6Žּ_ia-([tj0w27k#d=;$F!/F`졹79 %A[=ϝKS1@`ꪪ*m~x g0"70F RƄmuX4"RtG `Y2@ b॥)vRp1Eˌ23qS2mũ q $A!&O ^b'@$f*٬P}a[^+ ծ$QL@mAw ,̚ɒ$@PU#4-)M,̚lL7DVm(PXn"rK53&(,EJ%K,idp7;Q)x3ृBLgK gKhhxxx0Rr( TrEc0kjr7KԵZmy9Úׯھ)aLco9Myɮ֘M)\F:kq2b(;tr9Rq2tהdP,Fd7)ٝڜ5|#5ql5aWMyN&LE܍nS;5ql5|r?DG$ d^S@#c2mNnk_)w\nquZޛW]19yJ)MyN&LEֽ3qk7(Sl[cbLgXD$]b$I"&t&?Dqh3,] 0rH,]"EH,] pI UbH<4,]"J@?"QPD "$&,U,ő4uQNWS;.73q}ֽ6srȔ.Z=qSl홨;lKRں-WSlDtDHLXN-K;P?zP3zpzY6fB3;Z-k/js6.'NU 9-kmSL[;\o6jYŋIE C `lViuMXEhNL<ֽRW\o@JHDAŊD2#*&,(%1~)xT ,HF1yN.yZ3kW׾ _8c7wZf 6rDy1^Scqc =ysg[yN.y6ޝgtK5 9KP7׾ _)w\nfSs5qxb振a[5HUVXkq{}!*+4?BFKY\x'37&gA4̭|ܜ, HT3JƩˤI_ɀB"g R1aq79|Y0(0.&T"x3JƩ^t6ث79|Y0(0.((H "&x@"ΗFRY'/&!˞HT3JƩpMN_LEIHHriaD(M-K#&Na1ÙiB_*"Pu9CX bg > W.l_-mmmmmmmW&c[N3Q%|1|NPaJ ڊS̚mmmmmmm_1d^n.L`2e XTܽh/^fZb+V MN_L0{&orr`H*0+03z2$ɔ,[ "(&yCd 79|Y0RpwM@sEǑǑvMϊ'02li<7d8\TC[(gt48.dIgx[?C0ĤAD?9yŎn38iE PݐQQ02iznY Į&8cVGvM)5-n h3[t9;a4Nr3N2GvED?upsGq22kM7h̭.@9(rTC7Ծ.Vrxca3[t90q20'Zٶ%7FS-@5NƘs.,sqIm2qqňfe$|1LJŊ-PѸED?nspv6 !bE 0!iGq&YNI&W&eD?4ÞiqcL`4ńcs%8oAD?D3[t9;a4X:ED?L&"#Vh=DCjf=͐Q n0sd=DC{`!1Zi%Q mmmmmmmmmmQmB,std p P7 HSM U3+DHT`Qp"b&%.7Leʋ,h$hqTܼ^2{,Q +A#CÎaSr\qjU3+D,L\LX`LP쓓&gEq^aqŊ1E#&GdLL΂F~a޸RZ ̐DTcBȹ@Dc0%[gЧ+csM(X4?MN_L1rLwɁnA1qa:șcq,@Ίcn7&e_SrJ;P4nwMq3: I)xzLb"X,Ck{cјALi+|82̷@5zs+6*'(0%zG='sm$v8mjwT(jf㎮B h CNP:lj{ougU6:2jt]0V'(0%g0%(viq@ζ\VT A|Q1FNR[mmmmmmmmmm!ÒIìh'AƍKc4aܴÞ94sVVa2(aNr#(M-n~q,6 eKM9[ljKTCq&g0ĤL(.~:ĒvD:Ē`\D=D-mmmmmmmmmK{6AD65lCr2!(5mmmmmmmmmTC8BV7:p2b13@@bmmmmmmmmmTp惍 k%X2+.bbb&. # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_persistent_ip_attributeseoup#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_persistent_ip_attributes.sh 1.6 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)47 1.6 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_persistent_ip_attributes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/1/15 14:14:30 #============================================================================ # # Name: KLIB_HACMP_get_persistent_ip_attributes # # Description: This is the main, FPATH function that is invoked by clmgr # to collect persistent IP information. It invokes various # network related utilities, at both the SystemMirror and # AIX levels, and mines their output for all relevant info. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The properties hash is populated. The only other outputs are # any error messages that might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_get_persistent_ip_attributes { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.6, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_persistent_ip_attributes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset persistent_ip=${1//\"/} # Get the "properties" associative array reference, and initialize it if [[ -z $2 ]] || [[ -n $CLMGR_LOGGING && $2 == "|" ]]; then persistent_ip= typeset -n properties=$1 else typeset -n properties=$2 fi [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== for k in ${!properties[*]}; do unset properties[$k]; done typeset key= PERSISTENT_IPS= DATA= typeset -i matches=0 rc=$RC_SUCCESS INDEX=0 typeset -u attr= uc_key= typeset -A queries typeset -i i=0 #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #======================================= : Make sure we have something to query #======================================= elif [[ -n $persistent_ip ]]; then [[ $persistent_ip != *,* ]] && unset INDEX for persistent_ip in ${persistent_ip//,/ }; do CL=$LINENO KLIB_HACMP_is_known_persistent_ip "$persistent_ip" 2>/dev/null if (( $? != RC_SUCCESS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$persistent_ip" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 152 "Available Persistent Node IPs:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_persistent_ip available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND else PERSISTENT_IPS="$PERSISTENT_IPS $persistent_ip" fi done elif (( CLMGR_VERBOSE || ${#queries[*]} > 0 )); then print -- "$0()[$LINENO]($SECONDS): clodmget -q \"function=persistent\" -f ip_label HACMPadapter" >>$CLMGR_TMPLOG # Always log commands DATA=$(clodmget -q "function=persistent" -f ip_label HACMPadapter) print "$0()[$LINENO]($SECONDS): clodmget RC: $?" >>$CLMGR_TMPLOG # Always log command result print -- "$DATA" |\ while read name; do [[ -n $PERSISTENT_IPS ]] && PERSISTENT_IPS="$PERSISTENT_IPS " PERSISTENT_IPS="$PERSISTENT_IPS${name//\"/}" done print "$0()[$LINENO]($SECONDS): PERSISTENT_IPS == \"$PERSISTENT_IPS\"" >>$CLMGR_TMPLOG # Always log command result else dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT fi (( $rc != RC_SUCCESS )) && unset PERSISTENT_IPS #================================================================ : Populate the return hash with the retrieved attributes/values #================================================================ for persistent_ip in $PERSISTENT_IPS; do integer NEED_DATA=1 if [[ -n $IF_LOG && -f $IF_LOG && -s $IF_LOG ]]; then typeset ATTR_DATA=$(grep -p 'TYPE="persistent"' $IF_LOG | grep -p "NAME=\"$persistent_ip\"") if [[ -n $ATTR_DATA ]]; then typeset PAIR="" VAL="" print -- "$ATTR_DATA" |\ while read PAIR; do VAL=${PAIR#*=} VAL=${VAL#\"} VAL=${VAL%\"} properties[${PAIR%%=*}$INDEX]="$VAL" done unset PAIR VAL NEED_DATA=0 fi unset ATTR_DATA fi if (( NEED_DATA )); then typeset -A attributes CL=$LINENO KLIB_HACMP_get_interface_attributes $persistent_ip attributes for key in ${!attributes[*]}; do uc_key=$key properties[$uc_key$INDEX]=${attributes[$key]} done unset attributes fi unset NEED_DATA #============================================================== : Even if there is no value for a given attribute, we want to : display a placeholder for it, so the customer always sees a : consistent, complete set of attributes. #============================================================== for key in ${_COLON_ATTR_ORDER[persistent_ip]}; do if [[ -z ${properties[$key$INDEX]} ]]; then properties[$key$INDEX]="" fi done #====================================================================== : Only display NETMASK for IPv4 addresses. Otherwise, display PREFIX. #====================================================================== if [[ ${properties[IPADDR$INDEX]} == *:* ]]; then unset properties[NETMASK$INDEX] else unset properties[PREFIX$INDEX] fi (( INDEX++ )) [[ $INDEX == *0 ]] && (( INDEX++ )) done #========================================================== : If any searches/filters were specified, handle them now #========================================================== if (( $rc == RC_SUCCESS && ${#queries[*]} > 0 )); then CL=$LINENO search_properties queries properties rc=$? fi (( $rc == RC_SUCCESS )) && CL=$LINENO prune_indexes properties log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_persistent_ip_attributes()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_persistent_ip_attributes =head1 VERSION Version Number: 1.6 Last Extracted: 6/16/15 17:51:08 Last Changed: 6/1/15 14:14:30 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_persistent_ip_attributes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query persistent_ip [,,,...] clmgr -v query persistent_ip NOTE: the alias for "persistent_ip" is "pe". =head1 DESCRIPTION Retrieves the configuration data for one or more persistent IPs. =head1 ARGUMENTS 1. persistent_ip [REQUIRED] [string] The label of one or more persistent IPs (comma or space separated) that are to be queried. 2. properties [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2010,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #==============================================================================  l eZ2+bbb&ca # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_physical_volume_attributesoup   =e $adilnorst"#CELN[]_cfhmpuv():ADIMOPRSTbgky&*,-./0;>GH\w{}%+12BFKUVXqx!'4?YZz|379<@W56j8Q `B  I s)M*8Ƒe2訠etYjSk ? 20l=FWEXyx4<, `H<@X@n2W:ԁ<~H\T" $&, ,.>.e6)EZ'X,]V-JmuXd<~x(ˀpp#(r22sFa!(LQP\r@2O$@y"NBi4c,U[&[QeBJY2OYew@,u4"+DiY2͵rJx B ,TX$.ƟƮX(,WX*hSa3%iwwwwwwwwwwwwwwwwwwwwwwwws:"bVIB] fj@EE#JV5{BY&w `%TlP-Tk1J HDbeC"@LhtUDGB! $& 6Ee4iR`VI".auY&EBą O6j<04I&&T1b$Ɉ K5TM6*@:UY&(A*MIQ P HH$*X\HPKP*XѤUJX8'bPuVI"1x(@ ]J$&@@H" :Tՠ4ieJIcrb46u4@XP,YëValҮG6M&$Eb@9Q46M@IʸM!6MDKDDIʸ?ͮm`" 1 yW@,li,U*,3.HvqFO0EXXbQAetuRECX*Y@`( 6j# $".(@E*aC¦SQ,Yë*6u4Tj\ՄSk,bP :WzΦP-TkmX(,"H"L@Ua06ڻ)ɐEEH@DJ `dD<ᡧue5N4 t MTf&[I6 ,#j&-UXj[66?,u`l&*EBą dlXk0bu˖.@`e˖. 2eXWe6PXbQ"("q!?&bAr勢n!LSj ,@U*,3.HD $*ј0=tD`HEq!APp6ujƮ6tdDCO6j<04I&&T1b$Ɉ T5q8% @B($$,.$(HL%Dm ˬh*]Q6 "D  kb `%Th\,T‚΀X "D  L(.#fY $]X@<\ @@ .:@HT!0>U*,3.HvqFO?ڣ ?:(ifZvm:ԩ"! ]cI.]0VIՠ]BHueK阔)bDEY&0P ʕ?2O$bauPUdUၥ$"L12  &L@X4:B8Pr B Pe:TP HH$*X\HPKP*XѤUI D Ud@h(.U @!Q`r GG  ,(&@]AliP$Ht P HH$*X\HPJUၥ$"L12  &L@X4:B8Pr B Pe:QR8D"BA!RBXzTFب̺ƍ"L<6j# $".(@,4P\\tlD pE*JiM)u.quګ65a04阔),FΦށ*T!dU?ͮm` "1 yWASO?ͮm`2dQR$& D*Q阔)@ʗ8UqҥBLSͮm`2dQR$& D*q?ͮm`a0d &L**Da!1("sOJ tP-TkmX(DL<" &.XHL@$]40Dh ,O?ͮ  (!dI @X2b HTX' AUhPtq &9@@W6v !ATM4t"@! aq!BBa,|=@#lTXf]cFU&@W6u @xybEq*Maps P8͝PUM! K  MVc@2$ʆ ,D1`ꀁƮ6lTuٳxPrƮ6lPpD"BA!RBXzTFب̺ƍ"U?1(R q; T6TBɖtDœ-MvWMQRaj@+fYvLO6j<04I&&T1b$Ɉ P HTX' AUhPtq &9@@W6v !ATM4t"@! aq!BBa,|=@#lTXf]cFU&5qg] 4tq &9@@W6v !ATM6B($$,.$(HL$Uၥ$"L12  &L@X4: q; @ Ʈ6l q::@HT!0>U*,3.HvqFO(R q; T6T ٳ?&ymtf9x`iD "LLbH  @<<B8Pr BA Aq &8e4P̭ ƒB! $& 6Ee4iR``M$ @<<B8Y&(R `.`a5A,P餥J-.ehQ:B($$,.$(HL$]5Y@QB$ȓ*dC,P餭SatUJ-.qFhD"BA!RBXzTFب̺ƍ"U?1(R2uJlP-T艋&[03]N)ԁvWe[4mtf9x`iD "LLbH  @N$РPqB`#aps `M%*T!is+BpЈEBą QauET?e4B8Y&(R `.`a5A,P餥J-.ehQ:B($$,.$(HL$Uၥ$"L12  &L@X4:2uJE6`ETh"DaFB($$,.$(HL%Dm ˬh*]Q]CG**V X.I8<0f% A*Xj &@ "L]b@yR &ZmeZœ($ XDm+]eK]v̺&Q?3wٳЅ-T6ڻ)ɐEEH@D< 86ڻ)Iɐ" X2hb億"L@UyeSaf,leuΦ]H"K+Mæk U\eTm)3.0ԩDu.quګ3(pc+pjAx:i(hhBɖ]cm]BdI"L@U]cm]B$a,@L4TT1rBbP& D*@t=QLͪ0tUUfc aMZ2*\VgVPWXǟimuvSk &.1 yWLqmuvSk D@2dQR$ @D<&8 <DLY2 \j&]Z*+ MSTfl 0 VL63F`FX*8phQHneeZ]0te*RZkR(Tnie M:MbW0Tgu3FXM5VA3($$,,.@ @a!(LJ `dD<ᡧYVSTO @Jie`jb1Fl2YuqmN]h(,u`l&*EBą F͵'\bt9`e˖. 2emuvSk  ("1 yW&bAr勢n!LSͮm`aARDP& D*㉬8j4kmX(,@XDPT@(Iʸ5QV 80|ElUiv+ZY ̵v,-E¦ZO1!YX5jI++QkF]bL뵆V]L.6DVd1 VfL.ɖM; #U55Fh(+L&VL(|L@Ja5 ?ǟ A*Ji`M%Q4ATM46j#@2$ʆ ,D1` A*M  9,05mf .`a5A0NPITM6 A̍h5mTxEB($$,.$(HL%Dm ˬh* Dt HTX'$1!W5Mq &9Fi1J *\s#fe@HDbv̖6ڻ) q&XWe6L02R CC`L'@2$8K&MZj?ǻ1FqMSgu^EMej@:M̵Cf)`Xe5`f!/w,$",,"L$XD/`.RI"@\1@4^aC)@! `#w `%TlS-TIf@HTz K @<@(K.jYsHX4N(MeXVeDeq $42`p6B-]TYLAtY2آV M &/4hN0֫MVEE.VhQQqB^ 2tt1e\0H.ŠW.e5Ff^8P`u5lm$6#mJAAEBXPƮ76dmˢc(p`#` XDy(&H ":9BDDĈHL{-.qV2Xe6&^M5VZ]j묻&ZMU(8\X`k6LY8$%ˬI24`erxi00 R e,i.:9x`h "LLqY89xRb8 $" ,2K26ePՔ8ie8X ywwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww*N.-]jf*j묻Wm& lM-\* VkmteU*m6+ԁVjVe¤ERc4)Xœ-ID.:`MeAtF:\2 HvquOul*kMETbae424wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwETQ6,m]5vGyx4M4;&XkL)t\lSbVjV 4]j@UtMj.k+d,QK&Zx˨hex(.8vSYV)6M5ViYtSIjI5#ڬ.+]MQl\lST˚EVQ-HPLBae".Ka*ԩFC ^U'MQ(&!ee`XgShU5Flk L,)0qR즲0YsHR4)xں,^X"$ĈOY %, "LLL\u-h0̍tT,uekli繖",@TDP\DL狙Me5Dj&[Q6bLmJ5bE(a =R-4m,.]Q.f6ɕ82f]BJՆE5hDٵ6hMSTf&[6dmˢ4++d,a̬j&,Q]6Hz*YUlّ.(pXehuYZ%Y(-m0R=Uk+0TR5jїP z+qLu0W&MV=]]V <2R! 4H1qcρ؀-(&(."&LfXWe6(*D"*D@X3] kmX"eWk'V6 <jX&H %OcVIYZj`M0MQ+QQ@i06. $VQT2#fX$ba\equDaF*jT`i+l2ԃOEE?MXLZu1dFsYPn44ShDiM,E+DaF,0Qj"2s-E "*D\ &yxuU]ubjZ]etYMeh6Wb(laV(|j]-]uE˜]v| `Ka6],qrX6).Q*3lHXXk8J3 l0'0u6YivZ5MfEjYu]jXaTFπ:v]RiU.7IfUfmSa`Ka6a\)Ԭ4%Tn,y\'UJtAbၣ<珋l(U5FAr4Y(q,Fb֪ae˶]dTf(+*e2MFbԓeN.eS4 M‹4qKQ6mE&[:U#1dfQ2RMSQJ30SdET Ueڐ4珒X*@WMq骓Ud#  ,C0 &C*xwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwsΦh:# 2 ai2e5UIFxIՠ l4P[2+cbbb&39 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_repository_attributesut  =e iorst$ESanp"#ACDILNOPRT[]_cdfhlmuy()-./0:;MUbgv{}&*,12BFGHKV\kqw!%+4>WY'35679vj UE A'#Wt=u XXe|w`ڱ= k ־NE=q>g,r-rV;*c9 9;^'UX;}qT @ vA8Ё2@`\84 $2mXE`ˢI'vEȸX`%E[V^?C0'Վδ:z ^UO­uV]wwXX4K݋''Cz_O4f NEYǸi"asȖ9mX?8!{<s;~xEU(qgU)zUf- @YmmmmmmmmmȖ9l L0 ƞlՌ^TQ.S_jUr%tP' (^܊+s?[mmmmmmY>C ιE4j@iɝ!uP"AB\OV1}H`]T( gcU^7BNaa]yya, "`e%cRU)#Yy?ιigOfLiAѡ.'fK02# A(sjL i$țP)mmmmmmmmg@ \jw8#/;ZdgZ)­"9㭶mmmmmmmY@H"+"edVi,/H=ː6 % lL(6E2ɔ"Bk?5iɝ(632#9"&f q?+3:2E(W$ 6@LMgV7qAvED?{ 8r (@j) q?+3Cl6D Q3D P $e˕.#I@nu gGUuWw -X$ƥF, g.l46f46&9L64x@ lf!%K @X @ gu"d&P&Hlr-Q?[mmmmm=3]l\3F^a1 LU *\jx]uj5X^u^Q:2E(W$ 6@L MWt= PPtP&:mmmmmmmr!cOO6NlUVS#iXqIȵam *v͗9㭶mmmmmmmjёi~ ~ o |UUA-H3]l\tjCj2 gQ0K(<*Iعٓ:OGہ!fLdHDM a $,ɑP,A Ѧ^a1I >Wt=@H,e$Ԇ IA,i,/H`q`"#=(၂\OՎNX"H5_:>x/'y8Ul싴*` g'I U?{vN3عE$YygmmmmmmmBxjy~uNDN#{UE90){f~_;a TP#ܴU'I=xV!mmmmmmm^a1[*(PgQ0ҢS?9X^ %$08 PPtP&A-H g\գR*6]2T$`rIe&Г?ş+@wAsѳ ۗ mABQL00KYay  NiQBjMg떖*(Pn 082g [H` PPtP&E 483'fWt=H` PPtP&E 48عCF8$2b磩 >Wt= g江8F^VWt=jPldn ȸzȐ g'MHPBYk&:'Yy$a=i@E8jieP@L ι=30m2c˃2# vC(6<9C*0J0h?~Vg-Yygmmmmmmk?`CS._?/Orp'y9'x@ڨa5[c0Xyd-;q?(Y;  Vs{@}7φyC|5_;3vPNpP 9cȡ*T&ZYy'R&He d 6 + wAsэg'MHYX^'Mܹj  a\Oiɜ5m(634%] i&&.mDi&&.lM@r(<Lrq@)( κaꮼ.­h JA;Ύ]l\a%K,jEK(<*jPldn K?t0a@81@85`PY2ʗƁ7:醳DaFX$ƤT q"ɛ.b @Xg.l46f46&9L@.P**rع ,7`p[k&:% ԉ(B@ axel"mعj s𰽴@KhH`r$ Ȗ$ gOfL *.P**LC8p@Y"0]S"hfhЗ?{V E!EjEPIhdk?5\whᨁxѬyʑr0lTPK?y$E2 I&]J̙ LQC 6` ,n4B\O5BFAd'4%HH,B-1VOk8l#5C5% O &Z 1㭶mmmmm~tP^N4dN"@vA,|]r|L"mmmmmd0E/lBS43I7H`R) q %0E/lBS42LY MJQ% L?5 ԉ(Bċ`"UƤ]l\cq*E5䈦P i$˩襟=ܹj  a\O5򹵕C7|mqvsh4gjCq"C.䁪Q򹵕C;sk\$M:^a1ʑ"g(TjCon i K02P Fh?~VgBSR0E/lBS42c?[mmmmmmY;"r|x5cd>sy;^U@ ppvsO Gi{BUbs'"|3r'tOy㵝uV;ZqE ~s!3ummmmmm ԉ(Bċ`"UƤ]l\cq*E5䈦P i$˩ad\=dH3 ۗ mABQL00KYFcW6fͮ.ӷ|m&]Z8hn5"DS(`4eܐ5J#U;W6g|mqv+DYk&9R"dGR 8PLpհЦf0# ^q0xeלrdR"dGEH`nHatd4P͉,dOͮ.ӦԊ"Yy<rc?%㭶mmmmm~tP^N4dN"@vA,|]r|L"mmmmm ]0iBSF&pմ(TfsF]0iBS K02P PBY]0iBS*@y3e M^a1+YT3wi۾W6N'R&He -LWwAsэƤ]0iBS"C.47")0HI2 nH*+YT3W6N͢DӬ(Tfǖ2m'iTjE MA<k6dL O ~ ѣ|v^a1g->;Mcq?:(K`iعrgi,/ LL\E2ª'08(^فA 0.'f @ gu"d&P&Hli2sF@H"+  &X&5 MFs𰽴@KhH`r&A-H g\ R 8PLpհЦfHaBFPM42n y +  &Z y g S  `E03<@P u [ k*hԆ$a5 C&לriUS4K|6.z< 8b@ V1{EQFaIعGHR)7L?9NQ[H`"< C"Y3wy|[02NQHY"'Z,؈42"SFԆ0i2sF#>mMA(F^ ŦoFmmmmmmm̙ ,UBF $Aq %HelD~Vgr`d<@PDL;(⪜ \KTZ/;wAsѳPBYk&:!=3@.lY>i2sFk&< .//fT$a4" 42 (CCH"<)AC,`y@R*DLH1E &\ـ4fYyg0ye*AkG ƤxϕЮ*%;Wt=c? )R ,@Hh? )R ,c?AL<*v0 @ (Y@H~2%s?{2gHaeP 3ۤ]2T6X"HhЗ?{ų $P`(I|g,/h၌<rc?[mmmmmmmmk?rEWt=PΫsr'Uuc:;,mmmmmmmmm&bL5 .?H`҅H&@d =V"ei"* "HyE=P gOaaz@'.@ڂ&``?0bp= ]Aj vEE,UCexEX`LE B,<]VTU3F8 ]^_  HB)C8a\OPTt0aZ(bن ƊA gRv   E0^4P0k?%`QJY.l0X+El[0h@BaA<k?އ =`LE B,X;U𓸪<"`Q?<@^y}5(0wyzksЫmq?8҅K(IA$ZE :y}D l3ҬQ>p5eP G % : X[Ъӵczb,yx'jڹ. UXkFNE'Տ톪ʜ?Tb>wwE k:9E狶UmuE>`O9 `D j^V;+Gm k-;Vxڱ= kڷ토Pe )n8U?U[]Qiڱ= kS8l7V~rDHP0sd]`#0seQEtQQHs0v^b@GX=\-gGjѕ.gj `mmmmmmmmmmaK\vEȸ0N".$0X1t&  &XشwAsћV1{EQF`SVLc0 rDHEe> 3&#NFNPP@DD̚@ I  L03,OrB V ȼ gf*Ϫq d 6-16]l\fՌ^TQ@'>++6}Y`X'@Xlb e?*j PfqgDR{wAs `̂@A&8@A&9`,iEDR{wAsѱtMB0HF0yrǚ,Ů[:U9йWt=u 9Syppe (`ع%BE"k3 gTVPn=i ;wAs[0B]gTzOWbK'C//f"5>ƙ=mXAZ/:zb}aS8:Ur(?, "N99g[OZNwU xsOʧAYt (b:se.'rb-E[#&<0P-+KAՆ=u,GWq'w':醳 l" ;Ⳟr%b<wQ_'v(Ual ՅB<s9;eG s'#nC8UTl "kvW]0tymYQ^ ƞl*A'xBNYuXSV@`4 p<@`4 p#LmmmmmmmmmX;j*.^\B; b[mmmmmmmmmmr'U l P^2+Cbbb&* # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_resourcegroup_statesut     = enrst"ENORS_acdiop#$():ACDILMPTfghlmu-0FGUY[]y&*+,./123;>HK\bvw{}47BVWk|!%'569+Mmţm&MODv@2Kh @@(_6o&MN\_',~~@t"d("IR?,w p, 4K.q`L0%P%K*eV/Gbţ)7h  Ɩ+l xsmmmmmmmmmk^?L)7[%se->\?\b [Gfka|N34/Gb1h`N띌_ x+Z asLkLO]0Ex4dɩnj 0dƴGkA/Gb1h|߭_;=j$}s4Q8i ֛p |Lkr;-r:6lWel{|Bh |Z[mmmmmmmmmkef_5beYMi ; (L M$ eWq4q=&Z1x< 8<ϐ0!P`#@  4U "T_5b4v+Z:ڲx.FX  i` X{¸pn`WɢXD;bO,T`` ]1V'σL>T`` ]1V'ϓj -Z00.w0B Q!hv|H zP6++.,.mmmm'mhZ l@ke`mmmmo8̦xL>yˮv1|&afyǔ֙QUI?3OFSga6MŠ3O]<M_I5(vxyBhC(M(v"MhsلeB$&@&M4QU#C@P4ɢ fyMP" Bh؊%H"@AT;DH IU#CvmmmmmmmmmV0(M84Ox :msjktU1-Oaəw5IodٽsO\ ۋ'&fv{mmmmmmmmmkلe@H .RD@H &;,2UBeTB(dɕ &9n,xhnxșf?B daQ^LcfSZof 0/8i'"fSZoك &d&''Z"Mi(F((|4nRDĕPt"% p$A1%R(M pܞvmmmmmmmmm]?j:Z -5͝zfxyBhOx :mmœDW3~Ga7mmmmmmmmmۻhܲdʐLIU AR)\ wѹdɕ &N8s2AM$ɌLO 2O]0Ep82nQ PQ4;hI5Q N8smqzA+ș֛pBbF&I ;.DH H9c$ڃ DW3)7"3OƍQ*AUDA8\bMX4O\bMX4<1s5`0id&'dPahp>2&e5AiwѸ%H"@A@N8s;V 0S;V 0\bMX4FDa. DL"d&''Z"Mi(F((|4n@ &4DQ N8s;V 0S;V 0\bMX4FDa17'Z"Miw(F((|4n@ &4D pv1|&a .v1|&a i 4w]; 4DɌLO 2O]0Ep82nQ PQ4;h4 ABh*A pv1|&a .v1|&a i 4wͲc@n2O]0Ep82~Q PQ4;h4 ABhA8\bMX4O\bMX4<1s5`0i w!$JE@caj -\D̦ۂ@#w>7IAU" ;s5`<`as5`H/ՃL>XddL{mqzA+ș֛pBbF"P(A8\bMX4O\bMX4<1s5`0i w v4n"MA p wa=n,xl0񋝌_ |ɌhI51Â>n,y&Id4n"R@8pCŘOk2mfٔفV֔]/|-͖ V9~yJuP1xXK{^lVUnzGf\o|KH̶l鵦ysOځ]|vͳ~w-G8Ic/3KO8ɓS¯nzoC>-lŨZ/|޼/Jf2x+Zͷ+Mj5k ,le;=^>x$x(~XXmmmmmw6_6`X 5YhTvmmmmUN枳w[|>&Y*3>bO2}w[|>&`o[}w[|>/9]1V' @ P(WUY6mX4A!m|y37F<9m|vŢ+A>xk&',XiwqilBeċ )F n,xhnxșf?yɼ67u `~c;00Zm/dɕ )AA@&&>MNJ >aiF "R(MK2*kM"eho|&LđH Oo|.@`a`wqilBdDSMKD -5  ˝ɌLOn-6͗MBeTE  f E₁f֣)F&|Չe52 4~xqilBj E$ILI dO]0EG;6_!5"$&$@R 0,C.n-6͗LiuT@H IJ00X@ .waiF \ٹEWe'nf/o g(7\,lڰisZkQH ER̾jʲ~xșf?Zm/q" Sj _ wP0Nl6oL>Z~уكy3r|)7khlɘ֋5=`k\t3O[37_igE -n>y"QW63rWM\ܧb8" a`d7'c|<$@ 00Hr`"v1|'kM5BDp5E$CɈ!21f3LY˚,6-/c u띔8a O4Yل|?862<ZSk0{oP- fŦP69{fŦo0v/1lᘂiHIBjrzegnWd6a)fnLd.A7=3 Veqi3KO_ 5Mf)PUB]35Cmc/فqiX\+ٖ^a3Oɒ%[ p ;6CZnzoCocXU0 4=vmmmmmmmmm`j i|0  v`xXSOYn92BD,XM3SOYn EL -)e80pp(4  4 ȴqLoZO <,cWK>@lAdx0˜l(L T$@Rʙ|Ջخ1hjkMf\`&e0V| h< 8 `$E&(L T$@Rʙ|Ջخ1hjkMu4\E4\8-FX]~?ii5mF\,~{R0t۰hlo|bsKKiu/a8~&޻&{_&w4pj{c2+j:6_hvɣu6vx]ig`8M~6`uڌ^aɣ f/ca > 4pj{c2?[o] OZ+,ɷͬ\ִvu4R,$1w:vn ь$G8]mmmmmmmmmysO4lAv`dÏ𩶗57nrj+]SZ -%>3' 2m23{YYymG 2p4̰5Nmi4,c6Vy~Q73kAvM¯3nmmmmmmmmmm^Q7KE! `N4dۅX*e]mmmmmmmmmxYn2bavX&Ummmmmmmmm%  l`2+Ubbb&3 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_rg_attributesst    = aeirst$ERS_dlnopu"#ACDILNOPT[]cfghm()-.:;GMUXbvy&,/012>HY\kw{}!*+49BFqz|367YH l.*oP;,q*/33at^ѿ+:I.g< *gGѭ~n7L ܶF7]`9_rlgO5~1 Lg'Ys\?ň.d,0fi |?^s\g!,~ixoM(f+fWQe{^9NsFmmmmmmmmmm+[i*8MӜ`*,(xD@J, Usii_x,,0f07?|e֣,hgU qϐ)X R80Q:("&@`( qϙ>33t:p~^iz^ ܲ`?Yrh ?._ [Tcެ>xj]p|[\xBB(Hb=z1<~7(/t\wrMommmmk2)hNVsgFUommmmk/%l Wa"9+I؊>3\ E{.6X*ύ9UE\d%uQS:9V_xK/Y_[1v' D(/z#HLxIa|WQuo|<6LʂP[.vLxo|<4vo;OgAW %O$D` -0xESVq|f&^n+ķ : UWPX xPk\*ˀ# ]5/pUys`+˗239zb0Zxk `Fg,*U^\ o7E{،71=2e &&AVOo")Q"|MoX_i]`cA.XX^<)$Ak/"9x``3YF O  .y"$&PY <2 U]C<4n+`F|$ (\g$DHP`q7mmmmmmmmm[]U^fpXވ)o rUpv/'|9Yn\N=L#)?tW 쬣؊_)>@K8|˖L3O\3o~_WUW,K2X:mmmmmmmmmo|="Ë R$7b>OaŐLè  EQNpDqd o;8" (&Lo舤!1v' ۧ8ɿS&2$D L8xT;i]y n&9Mb0Zx"&(,2<2 "mӜd\x(Ld@T"0faŐLÛ`Ev.X Uȓ xR&9E `*3H&@qab0Zx"HD P‘62.aŐ0ǤXqd 8]a$D˗HM""`T0 yDHL&P oD 26ᦵuj7M\es\_&UƒX>3\0x`fb{Mo]p|$I@P>&Eq=U5uo .y"$&PY <2 UVQ|8lxDa6"0cB#`q a"r7 UsyΝrI:nUYELM h-7M\es\_&UtO (hDhU""D J<Oz5o8ȹ1O <]a|# o#<\DIL@yBd ̪apal"3q{h10p8䄄QLRE|n9P媹Ne$7S̪apaa#<\DIL@yBd ̪hpt3HHE $PG ^Z̮tSʳo9V_l7j.g*Ag*@PUU‚U.&e [,Y}<(,Yx\|q0kk._<(2.| {q)=f/,Y~`lEv.@@ $ (b,Y{ެ e9Eρn0yBcEe% %ʌq7|5lg*0@#b+pP PLI@PEɔ eQ"Q% (He PLI@PF^;,(鿙UnjUNKίW?2qfl30o e9Eρn0 "I @Hf`q7;3\8ȹ0<2 9V^PkFY"%FQ"$@Ćxk?QʳA:.k̺Ob+re THD`eJ"< yd0fU36qpQWeCWa"A2(ʔ$Dx@$ (b2# *7i fBb+re THD`eJ"< yd1F) 7@AUL |y|gȹ2L$J"DA2 <2 7ʩeIq2"&P DDH&T"#&ACa1oSUp4]`9]6T!b+re THD`eJ"< yd1F*Jc 3؊>3\B&U%"X RD Q<әVc1N2^:(X U b( (M(&4$&SE = "HQ(M(&4 &SE = $SEEodDǔ*M Dza颁TA"hA.>x<,ʫt熭q])7e5uQL@0Xe&{tG$g0|;၂=f%O$Dr{dlEv_>[]p|4PkgDzi Ia %O$DlEQ-؊>3;#xdf0XX`a䈓@AV tS\0" g^/u7-=?4y,ixt%ѿ ã'U:n<ԄU?p /g!,xɣvN 8 ^']8.~1 2R"O38. l4o^ M(9˄cFmmmmmmmmmm+[Q3` t3< QU\qP$[D@㇉LM0fo[N=0)(MK(.M-:Ss PP0`@x0ܓ\?2Ơmp]mGM٥㮳^/.L7bAm8( ""&$250;(L(1ocp5^/.L7bXYΝv[&eâ@g=5Wk/s[C"e@BdQ@H0n3N_ g 9'57n]80zrثlg~gr!o B+uOt`U_HHEljLEeSH @f]v'r2/(-3 I>Yy,/HWeeW2IU\'~,Or?;"k]&U^kelf1zT\>|'}82tU|5~eܪ=:n]p,KY9UEò!,YуU~U\'.g"\*ag|U֜WUW;S2+%*=Nkeg>&,e<^涜{hXMmn _|be>o37!|]8.{.k,U[&LR4ʭoYrt̙f1z005]~)u]T^xK%οaftH%οQyN 0c+/3> r\ۀ ~/Y^z=c"Zx '&Nf^5󮙓tӏryBH5"DD["8.e)bN2r >Xv  $ #G* _'Y53hW汊 # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_rgdependency_children =head1 VERSION Version Number: 1.5 Last Extracted: 1/31/14 04:40:53 Last Changed: 6/10/12 15:22:47 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_rgdependency_children.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_get_rgdependency_children =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. function KLIB_HACMP_get_rgdependency_children { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.5, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_rgdependency_children.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset name=${1//\"/} typeset -n list=$2 [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset child typeset -i index=0 print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clodmget -q \"group_parent=$name and dependency_type=PARENT_CHILD\" -f group_child HACMPrgdependency" >>$CLMGR_TMPLOG # Always log commands for child in $($HAUTILS/clodmget -q "group_parent=$name and dependency_type=PARENT_CHILD" -f group_child HACMPrgdependency) do list[$index]=${child//\"/} (( index++ )) done print "clodmget RC: $?" >>$CLMGR_TMPLOG # Always log command result log_return_msg 0 "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_rgdependency_children()"  kDe2+/ bbb&/ # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_rgdependency_parentnut#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_rgdependency_parent.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)03 1.4 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_rgdependency_parent.sh, hacmp.assist, 61haes_r714 6/10/12 15:22:48 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_rgdependency_parent =head1 VERSION Version Number: 1.4 Last Extracted: 1/31/14 04:40:58 Last Changed: 6/10/12 15:22:48 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_rgdependency_parent.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_get_rgdependency_parent =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. function KLIB_HACMP_get_rgdependency_parent { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_rgdependency_parent.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset child=${1//\"/} typeset -n list=$2 [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i index=0 rc=$RC_SUCCESS #================= : Validate input #================= if [[ -z $child ]]; then rc=$RC_MISSING_INPUT else print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clodmget -q \"group_child=$child and dependency_type=PARENT_CHILD\" -f group_parent HACMPrgdependency" >>$CLMGR_TMPLOG # Always log commands for parent in $($HAUTILS/clodmget -q "group_child=$child and dependency_type=PARENT_CHILD" -f group_parent HACMPrgdependency) do list[$index]=${parent//\"/} (( index++ )) done print "clodmget RC: $?" >>$CLMGR_TMPLOG # Always log command result fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_rgdependency_parent()" $ lh2+Qbbb&n1 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_service_ip_attributesut    =e ainorst$I_cdfhlp"#.ACDELMNOPRSTgmuv(),-:G[]bwy&/012;>FHU\k{}!'*BKVXqx|+34579\n  4 m1-qg,v33 vv\eN.Jv]ƕ#+ 8It;iI- N.Jv&+ [0ů-JxO7``$%$TA%"dpxL(@"Vp$'%@@ԍ  P`/ g~B&3bܮ|'\, XϚ^0^7\픠7ExڗzV{{)/< `xHtI@g:X/V\N+E?*?^0^7\[?i[?*?^0^7\c?s"#<1* A`>$%xfU RvŦXɌUUUUUUUUUUUUUUUUULZK67{yZUUUUUUUUUUUUUUUUT!'@x{r8g+`nr;ZȢcduq5L+f*qJ.=Ș1P2L+sl$Ni^sÇ`iˋL+ c?*]G#rg[9g'rtYiˋ[clܝnIs5a+JԄvקnPW|bܮxpq%Ɏ,L&8DHL 0"մz׊^rqpj/]?AMԁǦVpӗ^j\ƳeUUUUUUUUUUUUUUUUUUUUUUUUU3QW-xX^xnux,[?ܦ"#u(Ąշh֬r [g8ʹ'r櫥]{M 9quDqgc0W)62m #Ns=%JwHoO4/tՁ}gʪ%G@wHz%; Qϴ0jˏDDx& aj&DJ"Px c?UUUUUUUUUUUUUUUUUUUS?m #RZv@W<8`iˈ?UUUUUUUUUUUUUUUUUUUS?g)ϕ뒴\$$ 歽"9rVj#s(@!WJr뒴\$  83y*<+DQL.!7QuZ._|'\p%;: yŖg.=Ș1yogDsǒ& ]ʈLUIcf/V乹å<1"gxAa'@D0DyR E 감.<(0/HtL,HkJ1䉈Dr#bX٨Ąշ9.nFg$L@&HtI1@XIK*\?nJg%xpv,LD#xI*寍< tĨaPUcQ@,q!!aV%GĀ$,*׌!… \  D gc g>W< XLg GP+dG#xxAa'@D0DyR -͚À$,V9t|'\oiKh"!IA!xr@perȥbp8䉈D2Ċxr i@ٶ93Z 5sßXrV!.<$$I ÔF-E+ gϞ,PX`(DQ TKA3fyq kBωx8xD dbED&! o5mc?S. "j9n5],Q zP7l?ո,lt8'xI%"jK(sN5Z{e^"mJ/7p lgDpDQ å\AED1! o5mbܮxxYrh$,^yqIm|XȔ2Bа<P`AV<P YDp) yog f됉BB@*Ly*<+Rh^0^7\J D " YM " ApgSD>j q}VܻSN!,Ąշ3uEHD " Q|gqg>W=|c?UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUT'mK|3XB;sN;o9g'a|K]5+V 'qԄwL79zG%8XQw-?J;|tmuwM\&rw!eUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUS?Rv+DG$T#.R뒴\T18!v*z7`nS(@%BųӃeUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUS?ʽa]7Iu+"dV#XښqJ7+5n"K\r eUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUS?rxQx{r@ B@ UF$$ 歽|z"PcGP0IҶq f됉bAP0I3?ezmu!WJ guZ._sX9k[?ԄM{:عkXʶR.8sVٵWMny9於R.⊹%x(\qf's^"mJ׳M\ƭEӹ gW\Ð.bgB8Dn~xP^0^7\@ ?N … \x< < 3uD( ‹ f됉Q$ Ӄ>xpv,Ð.`^ aÑ 8A"C? Xr# \J<( aÑ@J3 Xr# \L*x  D ` gz:bBX  D ` c?ʏDyPC ၌rX^XQ*(gV<1"XQ0[{?kUFybGjZK8H,$y%E7I\͝ O|46⍖Zҝx9f\ն# Xr$=Du[,a 歿 sb⑃ g~e[lۥ?~e-iz{w.73{?(ů5G3&3 Xr$=DXSky[b JZwb佤i|ճ{(rX^|R0< " pv շy*<+Ex{rӗ\3uɟJF3,/>)uYqD031H"PN>sӰ:/qLg5osqQ^fG-aQ5\ $@pe5sEϝFhsN9L$@%%( ifÔ2L RX٨FrWH #Ƚr5>) Ş <*-񹜋\fES@ D 8y2Ț+%ht[9g'r 0eUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUS0fQ?Q*B(%rɃ3!rJ.^n*Zt׌;OςW)\?(]kv#|ng"< YnXWk ǒ& ]("T"g jCyo,䉈Dȕcȧ%,䉈D9.30 Xӝ^nypq6wl\jNN7%k/m46j#sQBL c7A%i|mLk0gLRG27#OtwOt^ٸU歰gl5], (T bwy!W5o6zxn(Wt >`LW@;i\ 95NAH>ưceg" |'i'{v;L12zStgHA,(90SYlVژ/(83 G7+%zf,JZgisU N4֘3 ׌,DP.D"dPI㟶RNlv-5\QW$fݢp9>j?ӗZ|-&73}ս&k^nڶE]<ݾxعk\UUUUUUUUUUUUUU3HtLLPk;Ya^W=n0LFZr +JN[WKQr˚]{|5Ԅvӎ\) ӴRs {CXy"b&8 Dr3{_`t/j 5ot`vg'j4ӗ8`S?׌J71s5o69p؝ǂPzG#|q65zv?׌JVϚ$4WlW4n7cXVژ/.DDF3q#,Rzw;Jv7{f?jc.piI\řc\Hci佤i@R8\}ΔxGJO|'ޤ=6`? N:6rxetfC@){⍖Ҟ*`iFӵӅ|'M佤i%u>pͶi+mXHd^1iH,0[UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUULV s@ٻ|5Olfל÷zPM5mzmrU`G-{ns{6ԥ9UւA=g%4v;g[E{zlNjޣYm𞣞z{9e;i5*3%.h Dn ~,&(~X3"236͢r W)1G'5h.ק6eUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUSXn kuj2+D bbb&D # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_service_labelsi#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_service_labels.sh 1.6 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)08 1.6 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_service_labels.sh, hacmp.assist, 61haes_r714 6/10/12 15:22:50 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_service_labels =head1 VERSION Version Number: 1.6 Last Extracted: 1/31/14 04:40:16 Last Changed: 6/10/12 15:22:50 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_service_labels.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr query service_ip [,,,...] clmgr -v query service_ip NOTE: the alias for "service_ip" is "se". =head1 DESCRIPTION Returns a list of shared service IP labels defined within the local cluster. =head1 ARGUMENTS N.one =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_get_service_labels { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.6, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_service_labels.sh, hacmp.assist, 61haes_r714 : INPUTS: $* [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset name= value= print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clodmget -q \"function=shared\" -f ip_label HACMPadapter" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clodmget -q "function=shared" -f ip_label HACMPadapter |\ while read name; do print -- ${name//\"/} done print "clodmget RC: $?" >>$CLMGR_TMPLOG # Always log command result print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clodmget -q \"function=service\" -f ip_label HACMPadapter" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clodmget -q "function=service" -f ip_label HACMPadapter |\ while read name; do print -- ${name//\"/} done print "clodmget RC: $?" >>$CLMGR_TMPLOG # Always log command result log_return_msg 0 "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_service_labels()" er/u kNm2+7bbb&7 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_site_attributes#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_site_attributes.sh 1.18 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)81 1.18 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_site_attributes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/1/15 14:37:32 #============================================================================ # # Name: KLIB_HACMP_get_site_attributes # # Description: This is the main, FPATH function that is invoked by clmgr # to collect site information. The odmget utility is invoked # to extract the necessary data from the HACMPsite ODM. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The properties hash is populated. The only other outputs are # any error messages that might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_get_site_attributes { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.18, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_site_attributes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset site=${1//\"/} # Get the "properties" associative array reference, and initialize it if [[ -z $2 ]] || [[ -n $CLMGR_LOGGING && $2 == "|" ]]; then site= typeset -n properties=$1 else typeset -n properties=$2 fi [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== for k in ${!properties[*]}; do unset properties[$k]; done typeset SITES= ID= name= value= DATA= typeset key= typeset -i matches=0 rc=$RC_SUCCESS typeset -u attr= uc_key= typeset -A queries typeset -i i=0 #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #======================================= : Make sure we have something to query #======================================= elif [[ -n $site ]]; then for site in ${site//,/ }; do site=$(CL=$LINENO KLIB_HACMP_is_known_site "$site" 2>/dev/null) if (( $? != RC_SUCCESS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$site" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 157 "Available Sites:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_sites available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND else SITES="$SITES $site" fi done elif (( CLMGR_VERBOSE || ${#queries[*]} > 0 )); then typeset SITENAMES= print -- "$0()[$LINENO]($SECONDS): clodmget -n -f name HACMPsite" >>$CLMGR_TMPLOG # Always log commands SITENAMES=$(clodmget -n -f name HACMPsite) rc=$? print -- "$0()[$LINENO]($SECONDS): clodmget RC: $rc" >>$CLMGR_TMPLOG # Always log commands result if (( $rc == RC_SUCCESSS )); then for SITENAME in $SITENAMES; do SITES=${SITES:+$SITES }$SITENAME done fi else dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT fi (( $rc != RC_SUCCESS )) && unset SITES #================================================================ : Populate the return hash with the retrieved attributes/values #================================================================ for site in $SITES; do if [[ $SITES == *\ * ]]; then print -- "$0()[$LINENO]($SECONDS): clodmget -q \"name=$site\" -f id HACMPsite" >>$CLMGR_TMPLOG # Always log commands ID=$(clodmget -q "name=$site" -f id HACMPsite) print "$0()[$LINENO]($SECONDS): clodmget RC: $?; $site ID == \"$ID\"" >>$CLMGR_TMPLOG # Always log command result fi print "$0()[$LINENO]($SECONDS): odmget -q \"name = $site\" HACMPsite" >>$CLMGR_TMPLOG # Always log commands DATA=$(odmget -q "name = $site" HACMPsite) print "$0()[$LINENO]($SECONDS): odmget RC: $?" >>$CLMGR_TMPLOG # Always log command result print -- "$DATA" |\ while IFS='=' read name value do name=${name##+([[:space:]])} name=${name%%+([[:space:]])} [[ -z $name || $name == 'HACMPsite:' ]] && continue value=${value##+([[:space:]])} value=${value%%+([[:space:]])} value=${value//\"/} attr=$name # Make uppercase if [[ $attr == ID* ]]; then typeset CID=$(clodmget -f id HACMPcluster) properties[G$attr$ID]="$CID$value" else [[ $attr == "DOMINANCE" ]] && continue # NOTE: the "NODES" attribute is what is used to actually # set the node list, so that is what should be # displayed via queries. [[ $attr == "NODELIST" ]] && attr=NODES properties[$attr$ID]=$value fi done properties[STATE$ID]=$(CL=$LINENO KLIB_HACMP_get_site_state "$site") print "$0()[$LINENO]($SECONDS): clodmget -n -q name="${properties[NAME$ID]}_sircol" -f ip_address HACMPsircol" >>$CLMGR_TMPLOG # Always log commands properties[SITE_IP$ID]=$(clodmget -n -q name="${properties[NAME$ID]}_sircol" -f ip_address HACMPsircol) print "$0()[$LINENO]($SECONDS): clodmget RC: $?, ${properties[NAME$ID]} IP == ${properties[SITE_IP$ID]}" >>$CLMGR_TMPLOG # Always log command result #======================================= : Get the site merge/recovery priority #======================================= print "$0()[$LINENO]($SECONDS): clodmget -n -q name=$site -f merge_priority HACMPsite" >>$CLMGR_TMPLOG value=$(clodmget -n -q name=$site -f merge_priority HACMPsite) print "$0()[$LINENO]($SECONDS): clodmget RC: $?; $site merge_priority == $value" >>$CLMGR_TMPLOG [[ $value == 0 ]] && value="MANUAL" properties[RECOVERY_PRIORITY$ID]=$value print "$0()[$LINENO]($SECONDS): odmget RC: $?" >>$CLMGR_TMPLOG #========================= : Get the site dominance #========================= print "$0()[$LINENO]($SECONDS): clodmget -n -q name=$site -f dominance HACMPsite" >>$CLMGR_TMPLOG properties[DOMINANT$ID]=$(clodmget -n -q name=$site -f dominance HACMPsite) print "$0()[$LINENO]($SECONDS): clodmget RC: $?, $site dominance == ${properties[DOMINANT$ID]}" >>$CLMGR_TMPLOG unset repositories # Make sure no previous results exist typeset repositories CL=$LINENO KLIB_HACMP_list_repositories repositories SITE=$site value=${repositories[*]} properties[REPOSITORIES$ID]="${value//\) /\), }" #================================== : Get the site HMCS for site $site #================================== typeset HMCLABELS= typeset hmclabels= print "$0()[$LINENO]($SECONDS): cllssite -S $site" >>$CLMGR_TMPLOG # Always log commands hmclabels=$(cllssite -S $site) (( rc |= $? )) print "$0()[$LINENO]($SECONDS): cllssite RC: $rc, $site HMCs == ${hmclabels//+([[:space:]])/ }" >>$CLMGR_TMPLOG # Always log commands result if (( $rc == RC_SUCCESS )); then for hmclabel in $hmclabels; do if [[ -n $hmclabel ]]; then HMCLABELS="${HMCLABELS:+$HMCLABELS }$hmclabel" fi done properties[HMCS$ID]=$HMCLABELS fi #============================================================== : Even if there is no value for a given attribute, we want to : display a placeholder for it, so the customer always sees a : consistent, complete set of attributes. #============================================================== for key in ${_COLON_ATTR_ORDER[site]}; do if [[ -z ${properties[$key$ID]} ]]; then properties[$key$ID]="" fi done if [[ ${properties[HEARTBEAT_TYPE]} == "UNICAST" ]]; then unset properties[SITE_IP$ID] fi [[ $CLUSTER_TYPE != "LC" ]] && unset properties[REPOSITORY$ID] done # End of the sites loop #========================================================== : If any searches/filters were specified, handle them now #========================================================== if (( $rc == RC_SUCCESS && ${#queries[*]} > 0 )); then CL=$LINENO search_properties queries properties rc=$? fi (( $rc == RC_SUCCESS )) && CL=$LINENO prune_indexes properties log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_site_attributes()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_site_attributes =head1 VERSION Version Number: 1.18 Last Extracted: 6/16/15 17:51:09 Last Changed: 6/1/15 14:37:32 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_site_attributes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query site [,,,...] clmgr -v query site =head1 DESCRIPTION Retrieves the configuration data for one or more sites. =head1 ARGUMENTS 1. site [REQUIRED] [string] The label of one or more sites (comma or space separated) that are to be queried. 2. properties [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2010,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== = k궠o2+p*bbb&p* # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_site_stateutes#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r721 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_site_state.sh 1.5 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)14 1.5 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_site_state.sh, hacmp.assist, 61haes_r721, 1642B_hacmp721 10/14/16 14:14:11 #============================================================================= # # Name: KLIB_HACMP_get_site_state # # Description: This is the main, FPATH function that is invoked by clmgr # to retrieve the aggregated cluster manager state for a given # site. The "worst case" status wins. # # Inputs: See the "devDoc()" function, below. # # Outputs: The node state is returned on STDOUT, unless the optional # "state" input is provided, in which case the state is stored # in that variable. The only other outputs are any error # messages that might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function, below, for the standard return # code values/meanings for clmgr. # #============================================================================= function KLIB_HACMP_get_site_state { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.5, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_site_state.sh, hacmp.assist, 61haes_r721, 1642B_hacmp721 : INPUTS: $* typeset site=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset LINE= NODE= NODELIST= typeset -u STATE=UNKNOWN typeset -i NODE_COUNT=0 OFFLINE=0 UNCONFIG=0 UNMANAGED=0 typeset -i ERROR=0 NORMAL=0 UNKNOWN=0 rc=$RC_SUCCESS #================= : Validate input #================= if [[ -z $site ]]; then rc=$RC_MISSING_INPUT else print "$0()[$LINENO]($SECONDS): clodmget -q \"name=$site\" -f nodelist HACMPsite" >>$CLMGR_TMPLOG # Always log commands NODELIST=$(clodmget -q "name=$site" -f nodelist HACMPsite) NODELIST=${NODELIST//\"} print "$0()[$LINENO]($SECONDS): clodmget RC: $?; NODELIST == \"$NODELIST\"" >>$CLMGR_TMPLOG # Always log command result #================================================ : Collect and analyze the status from each node #================================================ for NODE in $NODELIST; do (( NODE_COUNT++)) STATE=$(CL=$LINENO KLIB_HACMP_get_node_state "$NODE" 2>>$CLMGR_TMPLOG) if [[ $STATE == *@(INIT|INOPERATIVE)* ]]; then (( OFFLINE++ )) elif [[ $STATE == *NOT_CONFIGURED* ]]; then (( UNCONFIG++ )) elif [[ $STATE == *FAILED* ]]; then (( ERROR++ )) elif [[ $STATE == *@(JOINING|UNSTABLE|VOTING|RUNNING|BARRIER|DONE)* ]]; then (( NORMAL++ )) elif [[ $STATE == *STABLE* ]]; then (( NORMAL++ )) elif [[ $STATE == *UNMANAGED* ]]; then (( UNMANAGED++ )) else (( UNKNOWN++ )) fi done #================================================================== : Aggregate the collected node states to arrive at a relatively : appropriate, overall cluster state. The goal here is to provide : the most useful indicator to the customer. #================================================================== if (( NODE_COUNT > 0 )); then if [[ $CLMGR_GUI == "SMUI" ]]; then if (( ERROR )); then STATE=ERROR elif (( UNCONFIG )); then STATE=NOT_CONFIGURED elif (( OFFLINE == NODE_COUNT )); then STATE=OFFLINE elif (( NORMAL == NODE_COUNT )); then STATE=STABLE elif (( UNMANAGED == NODE_COUNT )); then STATE=UNMANAGED elif (( NORMAL && NORMAL != NODE_COUNT )); then STATE=WARNING else STATE=UNKNOWN fi else if (( ERROR )); then STATE=ERROR elif (( UNCONFIG )); then STATE=NOT_CONFIGURED elif (( OFFLINE == NODE_COUNT )); then STATE=OFFLINE elif (( NORMAL == NODE_COUNT )); then STATE=STABLE elif (( UNMANAGED == NODE_COUNT )); then STATE=UNMANAGED else STATE=UNKNOWN fi fi fi fi print -- $STATE # Do not quote! Avoids leading/trailing whitespace! log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_site_state()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_site_state =head1 VERSION Version Number: 1.5 Last Extracted: 10/21/16 17:05:34 Last Changed: 10/14/16 14:14:11 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_site_state.sh, hacmp.assist, 61haes_r721, 1642B_hacmp721 =head1 SYNOPSIS clmgr -cSa state query site [ [,,,...] ] =head1 DESCRIPTION Queries every node in the cluster for its current state (retrieved by calling "lssrc -ls clstrmgrES") and aggregating the results. The currently known statuses are: ST_INIT ST_JOINING ST_STABLE ST_UNSTABLE ST_VOTING ST_RP_RUNNING ST_BARRIER ST_RP_FAILED ST_CBARRIER ST_DONE NOT_CONFIGURED UNMANAGED These raw states are aggregated into seven possible statuses: NOT_CONFIGURED OFFLINE ERROR NORMAL WARNING UNMANAGED UNKNOWN NOT_CONFIGURED indicates that the node has not yet been configued into a cluster. If *any* node in the cluster has this state, then the entire cluster is considered to be "NOT_CONFIGURED". ST_INIT indicates cluster services are inactive, but AIX is running. If all the nodes have this state, the cluster state is set to "OFFLINE". ST_JOINING, ST_UNSTABLE, ST_VOTING, ST_RP_RUNNING, ST_BARRIER, ST_CBARRIER, and ST_DONE all indicate that cluster services are active, and something is happening. If *any* of the nodes in the cluster possess this state, then the cluster state is set to "NORMAL". ST_RP_FAILED indicates a PowerHA error has occurred on that node (other nodes in the cluster may be in *BARRIER in this case). If *any* node in the cluster possesses this state, the cluster state is set to "ERROR". ST_STABLE indicates that cluster services are operating normally. If all nodes in the cluster have this state, the cluster state is set to "NORMAL". However, if any of the nodes in the cluster report "OFFLINE", while the rest report "NORMAL", then the cluster state is set to "WARNING" to indicate a degraded condition within the cluster. If *any* node in the cluster reports an unrecognized state, or cannot be contacted, the state of the cluster is set to "UNKNOWN". =head1 ARGUMENTS 1. site [REQUIRED] [string] The label of one or more sites (comma or space separated) that are to be queried. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #==============================================================================  l4q2+Kbbb&- # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_snapshot_attributessut  =e iorst$ENahnp"#ACDILOPST[]_cdflmu(),-./:GHMRXbgvwy{}*012;>FU\k!%&'+BYqx|34579{E7%t5?0&A3eʔ* m$0@A?H@!pR`}*r@p (L 6"@cbpYEૢmHCl 0,X(bU@ 0"$H,@8x儘0,Ha2 &6*mڈb E>|gFN,~`TxxP 9U \8& DHi,U6b6 P??(Ӓ$$eP0̳ܼ#;d-%KdLd֌e", C0$Z" HX, ,a%w``_pdp|%{NFNmV00|$/:s8Z?``pad*3!$[.qY:\^ 0,K"~L 6XLBL60}mmmmmmmmm{騂CQB`YD/]jF/h=Sjk*mg@V ň!XZ帪vjTg8}?㏟ಋWGA1PS>Ќe gabp5?&c/]ŮYCṅgYDs|eYEૣ.\N6'p5 d5wy|[09Pt7!OKcښAP $oz,3bȼڱ=kZk~U WCwy|[0R 톻B}H³c;r0|/{AAiTit5?zigr|f2r2t7+e -rj`݋} 'Cq9=/*8M#4pk`q*8싒q+\^/`mmmm?%'X՛} 8j mmmmmg?[Dh]^_ 3Э ܼ-D"hr0 XS]20l`ⵟ^a1LBDL$R._8鷜6L&Ti#+&8FFk?2c7@N+0ey CNgFWLp^ك?2c7mಋWG8NuKhvܴO6N[.׹dpLQ /D0ճBYd% XS#.J,@CL*ՃCàWF gmmmmmmk?*yXgq'u#U f} 53ڋ >sBн 'vVw!bmmmmmm*' g\u9PdΈnѠgef4.27F/P#0a]yy!,P02Qȍ } Q<V?ιic?mmmmmN&*an.2mmmmk?{2g [F (tsFUdΌQx*5`Ѭ4+BcLB}=耜eH\ ⬬]h($ &lF4H6$\@ $ BbeD8)κa..l",㑂/](v  %͗HƉBfċ@8>ˬUрxA`ðP4^a1Q?,"RPi&WE fH,lapYEૣ Au}AS~A@B#CQ?&A@+ g\̙P]FPTE&Cງ$<ѠѠgef1/#J (k?ιigjÙ2&*`8=2LLb%L.J/^ #y:奌=J  B`YR`x4< C/l 8PP3?2c.O*~YDD4L͈"$X&ಋWF4$'m6F.O*~L 6@V ι XSK@q (.O*~LCcuK',;@[ BfˤcDA!3bE H'Y!12a Gw]dhA`ðP4*"dM.\bɦXak6\DEAXhV.J.mmmmmmmmg~Yˡ>gbjq^*"wR1{EP`.3mmmmmmmmgú% XSgj" 2BiSA(HT  p DA!3f*!} @`,\Dd,r (&I4tLp12! $Lb%L&8n]20l`ðh5%͘,PPf g0B~,WH,pF^Dd *`!ek|0cYDl6$&$ TF{ų$J˘HLdDd4WH,pF^Dd *`!ek|0c@Zn >p)(.a!3fՙ {ų$J˘HLـ0HLBˑ!Zr`d@ys 0IiHP\l6` ,$$8 3`3}mmmmmmk?Ce;: gUl8,U>mmmmmmmϕ$Ydz;+4 ?i*M fuiɜ1mlȉR M2I qVVgr`dDs&$ Qȍ.//fDJ0]iHPXkPiTFM!gBiQ(M4g>է8ܶ*Yt"'siհͧ9=-gX^_*}H_V*Ds?2c.a2ITJM&dΉBiA@* HpdΉBiۢ4P T@8  8+3whD4LKDd P#GUЊ 4Bf (TC(3 @E!Q (D)WB:!*YDK?8^3>*գDeI2Q..DqK(D)9 *Ճt#!ÅZrVQH6`HB? |aAg-r ,v i0BetJM, (D)9 *Ճt#jʺYDh5%͘,PS?⬬,T9Kjna9P?A;>-rzrs8!]Z8A!!FQ(M4*h%*"AB&)H(M4`j$J  0$XQ>039; `D$d u]&X, DA!3f* k?5뽫G$$(% eM]"%S$\(?UЎ&D?E"vȒ `@p DA!3f*!} @w'Q$@LFliɝp $\ f8+3?0G8 iZ;qVu]C:?!>|d0 Bl *h,tUj,s'#LN*F,y^Zr*V>!0 gFWLr .z"g?I[DhBd \88,;g\&tA,} #|g-,gOfL胀Y$h# D'ہA&A!P@4 2 悂PIH`4 LC9ѦYYnZwjc!>|d0 BlV^² j͌Z0,-6*Ug~qh`ܔQ an.Cq*?] ŧ.a2ITF0@&Cງ$<Ѡ@?%%KLUp $?5~&@I*8Mgr`dDs&$ Qȍ.//fDJ0]iHP"%KLCuK3 (@ H9=34ܼ-"P\BfDd47ۀ$P(h3?ş+H-Cc.J,@r0YEૢ`xA,_ r ,}qg­?;CBi ι Dh4gOfL&] B#4hYYɘHBZE*#E &pŴF{ų%ɘH$$Ѡgef//fK0tII!CTr#Kف$]iHPXk?{ų%ɘH$$9lrf.4$(hm$l-"',]^_ $l-"LB#E wy|[02TK0M2I .//f@ rf6P@II!CApX?5\XmmmmmmY(PsFB*gԄt:8Z帵~aY|>qYez>uB#8ƒ0븪~*mmmmmmYܼ-"@xF0$$H|p(PMR3Gc.J,@r0YEૢ3&pŴF{ų$H0H"Dd474 ⬬l6H&$ TF{ų$H0H"Dd4<Fyiɝl6H&$ &Cງ$<ѠѠgef03t."Ti?i*M fu :5lɀ0HLBٓ:% nhej2G4hYY Dh40YEૢgBiQ(M4&Cງ$<Ѡ($ɐlC gBiQ(M4&Cງ$<Ѡ($ɐlC LFܼ-"@xF0$$BiWʁk?ιig江ف$ m2Dd5Q |/"$X0?t."TbC/]@;g`Ƴ //fH,`&ʒIiHPDiwy|[02Dc4THLBܼ-"@xF*I$II!CUl6RI"M2I ٓ8`.//fH,`&ʒIiHPh3?{2g4ܼ-L$M2I  p@CDR$ L$#4hYYف$ m2Dd5Q]^_ TE&$ OYܼ-"@xF*I$II!CUH(m2gXmmmmmȫ'9?QaE8,ULUqc ľs?'Y++g*E qUಋWEmmmmYٓ8ar% XSF (tCZqVVg%+P|;'q]LUE V8} &*?(pZcYTYi~aC 'S:eK?2c(bE*!'` aq^0X'ū g.AebpR0~*u : .>Tci{NTYi{?H""lH?YǑyx*KZu;Ay&*%ϕE!D. ;t."TbC/]֬yð< Z~wʇrHs?M*Bi΢ܠ^#8$^ H pF_dΈr`d@ys 0IiHPn92Gf8+3 Иف$]iHP?5rLsF/h7#'xr|\?Э ܼ-.H8l<`y`&H$$Zwy|[02\0p88LBhLult."TbQ&$ 3 ИفDd46 r-rڷ[ (tYܼ- "$lDL*tII!CUಋWG .J,@r0YEૢ0?88a^tu?rӌ6*Uܴ$'&$+ g:$$n`@$aAL:sಋWF gmmmmmmmY= QiKq'BTX⬠p?mmmmmmmBt^s"l<#Dhx^فApgef)Q(M4+TyM//f^نܼ-3* %n&Dpy)/`@)Q(M4++Iv@醻ܼ-1,m/X cyA!!CȔ&IPm~wb$6-17^ &Ԍ^T1c>mmmmmmmmmX=A!d\0{,U MiEqC^0^_BȵqUH?Y`8}qbsV9hm@A+Gj۞v_ڭ;<dVvyAnaVjǜ E[l6\'X?ڶX,H,w8ج푉;mMd(ec C,X..q܂qvVXZahg*+\ RA F2wjǜ E[QϝqI2IX?q\dseL@t8 LIHՊ(d{$^^Y9|TZ:Nyacz"-UR,kITg8}:.}A*sg~@0yzk +;V~N{^ ԋE犪Gcz"-feʖ.L+8FWո slU[]Aiڱ=k `ɬ?rCnZCX=9`0FV;'x #'B=mmmmmmmmmr-r$?q @vEÖB| 2*iIQB`YD/]jF/hUeCRɗc3 ?Px,UDQx*L,U fpg^3eTAUCR?^ #YP+$r"d&U60NbȼÊrǚ,E[:T99pļD^ 0 c*V@L@$f (7/]Ț@,LM"F0ڰVs Ƿ-;s/]a'.+#'Bu<]N,7]^_3"iy14̪'3ڐ5H^uqV*ӊTC*?2  '# bbI.>~^UeCM#4^>ľs9: ^^Z^T|8UAyfVɄ!>JCqÈ^:y8͓BtYl"!>wYg<+f95 _'v C@A 3s9;eRV8NGjqYPMkvWsk:<̈́Y~O6Nq\?'x@N+uHSb~wrN89`mmmmmmmmmm yϸa Tu#@aܬy99j"Tyc Ul?<ld.9@n~.[ Tsh&^T~x8g~UO^Vy:عOtsX؅,wlq?e:mmmmmmmmmkqC{T?0``d?Y? ;CK`mmmmmmmmmmv⠬"ODab˨ب*mmmmmmmmmk kХr2++bbb&+ # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_storage_agent_attributessoup#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_storage_agent_attributes.sh 1.10 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)97 1.10 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_storage_agent_attributes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/1/15 14:47:22 #============================================================================ # # Name: KLIB_HACMP_get_storage_agent_attributes # # Description: This is the main, FPATH function that is invoked by clmgr # to collect storage agent information. The clxd_list_sa_director # utility is invoked to extract the necessary data. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The properties hash is populated. The only other outputs are # any error messages that might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_get_storage_agent_attributes { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.10, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_storage_agent_attributes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset storage_agent=${1//\"/} # Get the "properties" associative array reference, and initialize it if [[ -z $2 ]] || [[ -n $CLMGR_LOGGING && $2 == "|" ]]; then storage_agent= typeset -n properties=$1 else typeset -n properties=$2 fi [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values CL=$LINENO isEnterprise if (( $? != 1 )); then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 184 "\nERROR: this operation requires IBM PowerHA SystemMirror for AIX Enterprise Edition.\n\n" 1>&2 log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== for k in ${!properties[*]}; do unset properties[$k]; done typeset AGENTS= typeset -A list typeset -i INDEX=0 rc=$RC_SUCCESS typeset key= typeset -i matches=0 typeset -u attr= uc_key= typeset -A queries typeset -i i=0 #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done #======================================= : Make sure we have something to query #======================================= if [[ -n $storage_agent ]]; then [[ $storage_agent != *,* ]] && unset INDEX for storage_agent in ${storage_agent//,/ }; do CL=$LINENO KLIB_HACMP_is_known_storage_agent "$storage_agent" 2>/dev/null if (( $? != RC_SUCCESS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$storage_agent" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 163 "Available Storage Agents:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_storage_agents available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND else AGENTS="$AGENTS $storage_agent" fi done elif (( CLMGR_VERBOSE || ${#queries[*]} > 0 )); then CL=$LINENO KLIB_HACMP_list_storage_agents list for name in ${list[*]}; do name=${name##+([[:space:]])} name=${name%%+([[:space:]])} AGENTS="$AGENTS $name" done else dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT fi (( $rc != RC_SUCCESS )) && unset AGENTS #================================================================ : Populate the return hash with the retrieved attributes/values #================================================================ for storage_agent in $AGENTS; do properties[NAME$INDEX]=$storage_agent print -- "$0()[$LINENO]($SECONDS): $HAXDWIZ/clxd_list_sa_director -d\"|\" -n $storage_agent" >>$CLMGR_TMPLOG # Always log commands $HAXDWIZ/clxd_list_sa_director -d"|" -n $storage_agent >$TMPDIR/clmgr.KHgsaa.$$ cmd_rc=$? print "$0()[$LINENO]($SECONDS): clxd_list_sa_director RC: $cmd_rc" >>$CLMGR_TMPLOG # Always log command result if (( $cmd_rc != RC_SUCCESS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$storage_agent" 1>&2 rc=$RC_NOT_FOUND break fi cat $TMPDIR/clmgr.KHgsaa.$$ |\ while IFS=\| read name type user password systems ips attrs rem; do [[ $name == *\ * ]] && continue properties[NAME$INDEX]="$name" properties[TYPE$INDEX]=$type properties[USER$INDEX]=$user properties[PASSWORD$INDEX]=$password properties[SYSTEMS$INDEX]=$systems properties[ADDRESSES$INDEX]=$ips properties[ATTRIBUTES$INDEX]=$attrs done rm -f $TMPDIR/clmgr.KHgsaa.$$ #============================================================== : Even if there is no value for a given attribute, we want to : display a placeholder for it, so the customer always sees a : consistent, complete set of attributes. #============================================================== for key in ${_COLON_ATTR_ORDER[storage_agent]}; do if [[ -z ${properties[$key$INDEX]} ]]; then properties[$key$INDEX]="" fi done (( INDEX++ )) [[ $INDEX == *0 ]] && (( INDEX++ )) done #========================================================== : If any searches/filters were specified, handle them now #========================================================== if (( $rc == RC_SUCCESS && ${#queries[*]} > 0 )); then CL=$LINENO search_properties queries properties rc=$? fi (( $rc == RC_SUCCESS )) && CL=$LINENO prune_indexes properties log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_storage_agent_attributes()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_storage_agent_attributes =head1 VERSION Version Number: 1.10 Last Extracted: 6/16/15 17:51:09 Last Changed: 6/1/15 14:47:22 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_storage_agent_attributes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query storage_agent [,,...] clmgr -v query storage_agent NOTE: the alias for "storage_agent" is "sta". =head1 DESCRIPTION Retrieves the configuration data for one or more PowerHA SystemMirror storage agents. =head1 ARGUMENTS 1. storage_agent [REQUIRED] [string] The label of one or more storage_agents (comma or space separated) that are to be queried. 2. properties [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2010,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== fi  lꄅt2+Cbbb&( # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_storage_system_attributesoup   =eaiorst $_cdlmnp"#CEINRST[]fghuy()-./:ADGLMOPbvw&,012;>BHKUX\kq{}!'*4FYx|%+3678mmmm')(œڳb(ikT>mmmm? m[@,.//fpfBc//f ii?'WLrYREuyl"N0"T DD%J&8RNuyn"&8q͑q$Bv&8p9/l^a1ÛOf+mmmmmmOi}T佳倱& p N (@a,*E 8IDS …*DQaB+ 5(.PG༤-Ea)Y8F8FΏsBpڷ5<2k%,0pYJP$(PȒ&0,yL%,0'E dUQ@,9/le 5`sXE8. a *,(QKh(QB."PA&LS=mg(GA Bnk:<.sjv5|r`{fcL`hҨ "d"@$K ?'WLv QÏi}T佳BI*`/ JDL q7+&; JѣejVմS &X@i Q0]xf JnZO2]Z8pv9H`itI"L\bH&&T4G@$ *HA%MIRa &9T佳倱&1ra1hLr ^0A(aaQqO(6ðq'*NDHTVDR RB (&mNc NK0.X "`.;Lp9 ` ( xx@j`zja Ҩi03Av"T"@pgr:ce-G?lTVGo'*X˗$'ہ<}'-rO]^_ $"HMDȄT &&D$&nZpaa2EQSOB RML=zqd$zX\jƸLbՍCjf\g.6?@E "T"00PR D: ?O2QƑ|EX c *Hb|Gimmmmi8jƸ ?}mmmmOi|9mEaFaW0`ܬrR2\Z12!#uy F(.#G?˟.{ J0;ʻV B.{ J0;ʢ . q3h pV nV?$@ D`HTEf #2 I"L_ " ,0`Qg "ԣBsjQFU"#BpX4A9X8`f k PJCAMՁ:E "Tm…*(WAxXBq ia]yc1 X&BsjQFUpYu`kQaB"[@DE@ 10eIaʝeX ;@LjROi}pDaQ!R=+0eI0 nV?@T2$ r "EEaFaV2"*BO +P$L1| *HqhLrYREmmmmmmmmq.qFFx[6|M#R990?}mmmmmmmi\sjQFUڶP,b"An?wy|[0.LHX B.{ J0;ʧ ]2&l2?4XP+ q7+\jD) %HeTTl""ԢeN9EaFaTv P *,(Qi*/Ji03A%SE`5DD%Jᡠ&cӂ …*DQaB+  DAr8 B0tv.]D X!5(#*@8,P(Ab$|(5(f)v9";sOqX5(dvg=O\VbP B.{ J+1Y򫆦bR"ԣ@2R6r9Dv+xsjQvg=O\buy=^D1?|ᩇؔr%#n \G`ni7^r8q' ?%1YB^ @/*jav%'tXoB)v9";sOq!Xo@vg=ObACeMEf #NTjp8գBsjQYdFBsjQrU NTjtʍT.Y9Q '*5P ]&@,B]rU rNTjtXPjY9QЀHF^SP,,0&HJ*iyAz*BO +P$L1}"e뽰g ]+ DܬjÃCK*Hb*D12: JaaSk(ra1hLvo[BsjQFUA(aaQqO(6ðq'*N ! $*6FE6R&8 ÖЄ\`vpjIEM<< 50>AU4^@ڴqCK*Hb*D12:JaaSk(B: */HK Kv1 K K DĔaj8֓U'`qHe"T"@pgru`kQaB"[@DE@^"PAp!nk:;^X. l" 㐄\`vG`hҨ 1rȁBbgX?O2͵IEhL ,OY5+&񱵖Ra1|7Icⴿ9 zVq$8+ZI9j{Pf._Af+=\bR"`n`9hcyفrbBP$LLHVGܼ-,@12!#^O]^_ $"HMDȄTdZفpBd$LLH@lme]^_ $X A{ųBI*"bdBF* 5+F9r:5@i!ك&c{ųE$"UDȄTʐ{ųBbe*D 21|]^_ ""bdBF*rr`\`HbdJ H|Vܼ-"QDȄTB^{ų"#BP$LLH@e.q'//fʀ,D$$LLHBI"!z-L-?7-8 @" ( Ì$PA%4< @=?}mmmmmmmDjVg|톳(rs.~Fm2r2btaݚ1)6\pwsrr 8La:NZ eh4Lgq2r3mmmmmmmmsڶY,X"Ȕ/5(#* 4L ]^_ &&D$`/0 nV?wy|[0.RNH8qZnZO?}mmmmmmm;EslγT-˟SmmmmmmmOi}r`\0EDȄ4gr]^_ "T&&D$`Bc//f @12!#Zwy|[0.0$P2%$LLH]^_ J("bdBF8&:r`\$@ D`HT ?Иفr,$B%K(!4 "1e\Ywy|[0.X ""bdBF p N (@1AF`3XBc//fą,UDȄe&&D$&r v@'0c̑12! 0rymmmmmmm?G$gbxK|1|^Ri`MInUpmmmmmmm?p۔ PJ}{f|pgrj&/X􍢻ܼ-aS5lPGih=.ܡJH"TZ"dIҋVN@Ɇܼ-4'*9;$04v9RDȓ' .gjN Ja<}mmmmmmmmmdE[NFܖ?G $D( GMdą~$D$@XaSa=eTY'#0& ȕ PbB<푩s匴Dz-rl3.~s\7/eN2^x*r^L.dR7cl>r'g Ǟxmmmmmmmmmmcsr8mi9Ueh*9 U^0V2:NM,1rm-RvÔOk9UCs6c*9 !v.#R󼬙ns-RAbmQMgG2ՓFœm)K9ymmmmmmmmmI`-kT?j`fx,jq6#'ȬmmmmmmmmmMTGa/@f#mN&N,<}mmmmmmmmmx D kv2+g)bbb&g) # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_tape_attributes#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_tape_attributes.sh 1.7 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)76 1.7 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_tape_attributes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/1/15 14:57:19 #============================================================================ # # Name: KLIB_HACMP_get_tape_attributes # # Description: This is the main, FPATH function that is invoked by clmgr # to collect tape information. The cllstape utility is invoked # to extract the necessary data. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The properties hash is populated. The only other outputs are # any error messages that might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_get_tape_attributes { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.7, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_tape_attributes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset tape=${1//\"/} # Get the "properties" associative array reference, and initialize it if [[ -z $2 ]] || [[ -n $CLMGR_LOGGING && $2 == "|" ]]; then tape= typeset -n properties=$1 else typeset -n properties=$2 fi [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== for k in ${!properties[*]}; do unset properties[$k]; done typeset TAPES= OUTPUT= typeset -i INDEX=0 rc=$RC_SUCCESS typeset key= typeset -i matches=0 typeset -u attr= uc_key= typeset -A queries typeset -i i=0 #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done #======================================= : Make sure we have something to query #======================================= if [[ -n $tape ]]; then [[ $tape != *,* ]] && unset INDEX for tape in ${tape//,/ }; do CL=$LINENO KLIB_HACMP_is_known_tape "$tape" 2>/dev/null if (( $? != RC_SUCCESS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$tape" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 159 "Available Tapes:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_tapes available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND else TAPES="$TAPES $tape" fi done elif (( CLMGR_VERBOSE || ${#queries[*]} > 0 )); then typeset available CL=$LINENO KLIB_HACMP_list_tapes available for (( i=0; i<${#available[*]}; i++ )); do TAPES="$TAPES ${available[$i]}" done else dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT fi (( $rc != RC_SUCCESS )) && unset TAPES #================================================================ : Populate the return hash with the retrieved attributes/values #================================================================ for tape in $TAPES; do properties[NAME$INDEX]=$tape print -- "$0()[$LINENO]($SECONDS): cllstape -c -n $tape" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$(cllstape -c -n $tape) cmd_rc=$? print "$0()[$LINENO]($SECONDS): cllstape RC: $cmd_rc; OUTPUT == \"$OUTPUT\"" >>$CLMGR_TMPLOG # Always log command result if (( $cmd_rc != RC_SUCCESS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$tape" 1>&2 rc=$RC_NOT_FOUND break fi print -- "$OUTPUT" |\ while IFS=: read name desc device start_sync stop_sync start_script stop_script; do properties[DESCRIPTION$INDEX]="$desc" properties[DEVICE$INDEX]=$device properties[STARTSCRIPT$INDEX]=$start_script properties[STOPSCRIPT$INDEX]=$stop_script properties[START_SYNCHRONOUSLY$INDEX]="yes" [[ $start_sync == 0 ]] && properties[START_SYNCHRONOUSLY$INDEX]="no" properties[STOP_SYNCHRONOUSLY$INDEX]="yes" [[ $stop_sync == 0 ]] && properties[STOP_SYNCHRONOUSLY$INDEX]="no" done #============================================================== : Even if there is no value for a given attribute, we want to : display a placeholder for it, so the customer always sees a : consistent, complete set of attributes. #============================================================== for key in ${_COLON_ATTR_ORDER[tape]}; do if [[ -z ${properties[$key$INDEX]} ]]; then properties[$key$INDEX]="" fi done (( INDEX++ )) [[ $INDEX == *0 ]] && (( INDEX++ )) done #========================================================== : If any searches/filters were specified, handle them now #========================================================== if (( $rc == RC_SUCCESS && ${#queries[*]} > 0 )); then CL=$LINENO search_properties queries properties rc=$? fi (( $rc == RC_SUCCESS )) && CL=$LINENO prune_indexes properties log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_tape_attributes()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_tape_attributes =head1 VERSION Version Number: 1.7 Last Extracted: 6/16/15 17:51:10 Last Changed: 6/1/15 14:57:19 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_tape_attributes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query tape [,,,...] clmgr -v query tape NOTE: the alias for "tape" is "tp". =head1 DESCRIPTION Retrieves the configuration data for one or more PowerHA tapes. =head1 ARGUMENTS 1. tape [REQUIRED] [string] The label of one or more tapes (comma or space separated) that are to be queried. 2. properties [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2010,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #==============================================================================  k x2+ bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_unused_service_labelste#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_unused_service_labels.sh 1.5 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)09 1.5 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_unused_service_labels.sh, hacmp.assist, 61haes_r714 6/10/12 15:22:57 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_get_unused_service_labels =head1 VERSION Version Number: 1.5 Last Extracted: 1/31/14 04:40:16 Last Changed: 6/10/12 15:22:57 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_unused_service_labels.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_get_unused_service_labels =head1 DESCRIPTION Get a list of unused service IP labels (i.e. that are not already part of a resource group, but are defined within HACMPadapter). =head1 ARGUMENTS None =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_get_unused_service_labels { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.5, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_get_unused_service_labels.sh, hacmp.assist, 61haes_r714 : INPUTS: $* [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i found= typeset service= for service in $(CL=$LINENO KLIB_HACMP_get_service_labels); do found=0 print "$0()[$LINENO]($SECONDS): /usr/bin/odmget -q \"name=SERVICE_LABEL and value=$service\" HACMPresource" >>$CLMGR_TMPLOG # Always log commands /usr/bin/odmget -q "name=SERVICE_LABEL and value=$service" HACMPresource | while read; do found=1 done print "odmget RC: $?; found == \"$found\"" >>$CLMGR_TMPLOG # Always log command result (( found == 0 )) && echo $service done log_return_msg 0 "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_get_unused_service_labels()" eg. T lΎz2+Hbbb&v+ # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_user_attributes   =eirst #$EIanopu");ACDLMNOPRST[]_cdfghlm(*./1:GUXbvy{}&,-02>HKY\kw%'345BFWqx!+679=e9H 01H X bsrL (bb0h z #  B8aS: .p%tN=.~)|a"rDGAĿ qb .'(XD_8r_Υ}r_BK,JImmmmmԿko':'((\,srTӶmmmmj_?5nf͎XKѭF/ ͛!1(EQ$ϲK1,% ̥@P(WX 8@c 8%f @D/‚F\$*`4h(eApA@1 *gP"b0 c1.\p"03 cRDX3pÁb_8 P Hs3@1 1@f0xD)a/xE0h _ja1]ȗE)%T$EJ&X'B'⋹h/ Acu\Qw"\M 6.;pxѣ̥Zˊ.KJ8ؾh|\쇛676lw2_=G6 b⋹hҎ6.1/K,J_=G6 Kj(T0B)(J_&.bPD¥j7 xĿϹ/̱)%( & \ TT¸ zɁ04l_hP U\Qw"\M@P(WX 8@cnk.Kϲ(+uMqE܉q4Rh,ظ F2 ⋹hҎ6. aFycEatsTatr (Ѡ46lh_.j.CpPhB0sb&.cQĿ2Ĥz #  B8aS: .pp,rK.CQ.'(m8=G, Áb_;T.@5XŊ2%r  Ѹ &8KI/mmmmmmmmԿC/w΍QsHnvOXwEMNЋ@ K?c<6"ۄ .vC͛6;a/#P4҄(B”0p^@EL0ne\4$h mpE0 QA4D 2L" p^@EL0ne\4$h mpE0 QD{1@XPJX P¤ "`h~ _r)ܹ@3T HsI$TA${1@XPJX P¤ "`h~ _$Kz[DGI"pӨx`<]A$L@$* (7 ~<,-o^+I[&XNFr DyvSA$L@$* Os( iBKTSaJTRL AKDG `j .p2Ċ%}%mmmmmmmj_fZm(g|ŷ^p1{ROk/pq._mmmmmmmm}_A 0;<_ja1N̄ *peH,, K"L&8)@2,j7 nAyc2,pX d YSAc!ʘL".eLU *`KѬơeLfFd YS *A`1eH@(1bJXb__Tn t%/mmmmmmmԿ`3 V  ItPЖ$\i_=U_mmmmmmmmT,IS"# KK"L&9Q%L *"PK/̄ +C!ʘe/&Kh֡e{q,36lw2_?5&XNFr DyvS6lw2_=G,(i ,QRM(aRJ04?@k52LD ( P"b&XQʈ,"f0nfe\4$h mpGh1Eq†P(TR TCϹ$Ӷmmmmmj_s|&3/ۄ ~@XnDaΡeD1/mmmmmڗOe|]04Py5TXD/,=b*"dR4kP t/6o30ܤ:Ň\X\[b'2t%'=t"QbU7T,=bEKs=ڀR`hyk8 \c ,PFŇ]4yj_L "Mb2\yJ,PFŇ]4pR`hu.8">"bOe|]04@0">" Òm K"L&81Ab.at]/u&<<_s  I0`Z$ǘK7&<>&<"LyxK`Կ{-K遡cXDI0Kp K,JImmmmmmmm),n? wCaQtM}),k/pqN&_AK"\e~}'OC8 03D-$vmmmmmmm]^Ρr(: ER$̰C;>ѯ28aB,`g ;2mO$ePMa!.~Wo&6^atHw#i#'OۃA cits,`Br)/c_:"褟׆.b2{eBxt5iusY:vINN%$p(3t+Ow13]Le O뤟Q9,챣]NḵmMKI?]xQ5du4 3  0v.epIOnb$I.dyC!k6;'t;/^.(W2>ѯ28t3KX'8JZ8 u$𛢇Ѯ'sz5X4.:t6BlIxb$xM$i?2Ć$I[MFXēI<ŷ#,YsԓI;mmmmmmmmmmHlc="Y;%pӭP5"@rIT2j$p<2LN7 yMJ`%R*Q$/c(19xdK:|^48 À(x K$#B$  (</ (eb !@J!py$B5BPB+FhlK2w۟'0qkFA KC2s;=^:'c &X@=\3 cE,jN ]Pr)=ŝ:]\]$\v@`uRHR1{ ̰, nba PAa`,8 Hz$Yw CeI+n=!zI;mmmmmmmmmm$G#⸜"T q衠O {Kz+mmmmmmmmmڐ` l|2+_[bbb&|5 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_get_volume_group_attributes   =e ainorst$E_cdlp"#-ACDILMNOPRST[]fghmuv().:;GUVbwy&*,/012>FHX\k{}!%'BKYq|+3469 OO ZqkG `A`A`X$ |rqqӗ .8e$TA4L``̈M2ʒ* !fd[_}rYa\ں:gfrN  򊀠 6 Y`p < SLgnigc .A;l`h33$-rmZXܴ`bd@{{cʖˑȾwnڶrMsXEp  X01-qӖ^qCj 2/r\\uf?v tZAr\\LW0;@aC֪-Rx{"+IXREDH̎`}p6@!܁K8LG@Q" JaɖL40YL`t9h'r N #i4rm 4 ``p4`ʪ `̣OwH@pe;sM @~; ]6qp ܘ12%"<;2y.g><2 ztg[;WXذgYkRz,c yDf<72y zt`0gƘ,T~nYY5VBrB;oVz>˂ yGjq _= @~[6Ns=l,MC!9-V͹jѶ+ݿR -jN)hn g?7A[A+Wj]Vͻ)U ` ȽtwzjP,0^qԛz8Np?3ΖqXk0fUA9O^`ng#ۥ,ڡ ]6׊9vgq}ڶk0f^/wn90nvPܬ\E+~׌;`|4aj/tEn^\yÙŗHȉrZt^-[BB  zt|^' y9kB,=|תث/Ԃj.@׹eu>v!UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUL8M~"v!,M ՐjCQD[?*Hd$ D2( Qd֒hNn1 Elsgn8I("ZzN*R%Ǧ"P (T2gʪgv<B;^+{Qj4BՐ^];"skv@A: _3Е =|Mt gʪg-xX^X3 VAt-`h֊@ٰglD( @Wb9^};3Ζu*6VF[9ǪŃ2/6o -b Flt-(*-qɳX>Ȝy,#ڼB|mxF`Rz ^}s6VVj@YEZI:⇜FMi!: ~;g2⇜`b \^ޢ%;oBzByOj= m n|mW⇛pgׄ[Vrzrʐ&@~p׃>pyւ.P-?V'^p! ;s<6+~Xt'^!j-O@[~H!i& \axNhZ -EK gghi"D&'^/qF`q& \dH D"T۞4v0@53 E ״BEII1DK -EK gfc_^0^7\HQL@Qȑ(A l?z3uB0BZ ;sƜnX@YQx{r4]#DKI1DK"D&¢/ 1 f둢H$a%$7H#E H$JH"lYqgW\g.1SZD-EY2R$H] NB9?s 8 Yq=#0gq"` HE$PxdH#x皆@w01U*fc_~65lۺZYkRv9kt M;XWWsBD 8h4&Gf͇=ogW\%W FP{Oܰ@@07΅P: c?s4k4LLGȒK6l?{?* ܩ|T gsDiDJ$PL$}VLQd֒hN䱪Ix) BE U烑22"I,DD$\<$S gsDiDJ$PL$ Δp?v D@HXU;H"t hV FlN"~1:'_nFBu?f[Yқ*"P'hM`gaax ~3xƍŢ 4"%(TZ&Tڋ&Bud'%RKL$,kB P(8 b/Ht̓,H,(Yk@kՓ?Y5!9,j^ bƿD(+r@lpr&R&X#I%AșHd$?>qR,^.|qh "HD6(@`vɭ$НY eLJh}T⠼Dy"b2L"3EenHh6Z&R&Y"I%7HpyI`r#.egI("ZlPJD 830C:``3&GR!j6z&R&X#I$y$-`p?Ӛ&R&X#I$ZVdDy"b0䉈LzE˕.{D־pԂZzݫj䄉yDf<4$pF4LLE˃ȒK6o=),r$85R.=4*]y$-`p?Ӛ&R&Y"I$c?k!?ٷlF-{^jZ 5m b扭xF gokw9Ym 3xƍŢHHd/s`hI⇜A(;^7)N|);0X3H@ DH@Ɗi[Yҝ"|)Y+k:SB0$,*B:0gN!HB¬gZ1;Ղ@ 7;#H:tN [P{OٺEVt`c?i[?o\R{W9}`b ~ ?Ւw-䉈LFtG& ]2f `X/zE˕.{O)f'z+jxY)&D%"Ps?bV\zfGH030hֈ4%ڥ66@q?#bZ xI(BDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUULAt 6w񹠋͑Q=ֆ9h'r!j.LUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUT󐎄~?DH@~\F$$M2&rڮ69"%Ճ?$DX Xr(N87|"Q*D(HD2~o&yHDYHD"% !gړ䈔H5䈔J "Q P+AÇ|fZ7+vr3uADB M(Nz0Y,u2to ^j5q6lQe BwE ״p9䉈L2Ċ3bܮxqQ5"YX^TMF`00>g^0^7\`bXpI$H D Bk8QX3 {?׌#F"XcI%$7B@[?i[?׌#F"XcI%$7B^|-sV͹]ж.h׽[^3Rl] VArյ}ӵqGL팯kgx.fZ/lb\Q=mB=C9/!BDJ$ ~$8",8p@UC!A!t@$*!ĩaKC!ĩ@8HXUCR!A!ā@0Xp@Vc?s4kDHq~ &JAeJ3fѭ!ĺ[/͛|Hq*qJųѭ!ĺX^lCPg㙣Z"CX2 ,͛z!ĩ@>Ag@ЛuZ&+; $g19@A5OBعk\a϶jz=Hsmg?r VAr׍Z¸Xmxm\W];?lDHq}g``ē*HDAh@ 0DxI$"M#(A DHq,<=B C$AR./qFH )DB M"C,Y3@ ^0^7\,8D"PAt_S),8AYDеjDHq&^&n{? ׌#DȈe$㈒Hd"D&Yƭ+ 3^0^7\" \q"I" "` 0qCb53u2"I0x$ &(A ؿ`x{r4LqRL8$&@($JH"n,/ܚ?8DTʔ ׌#CLLp$DI%$7H%HA2eH$M VDgfhhZUf͇=oghyRKH(A qJų֕x{r4~s0gqYX)yIM sT;SƩyIM sT;SƩȒHi3ׂ>I$Pq4y#{ͯWyt<"}t\6lk2q1]E8jK^gytZ0g{f<72z<"}t^,PcL jM~h%jgytExJs',h#xe.:ew]k?oNyg>yDf<7@RA;R B6 F^|^'gu{SI*\Ci9 =}{f7gg眄On?K0*X;^{U0g(z~N眄On8({t >`LWȐ!|53"NAR `̪ rA-ޭzP `ʪ@&?VАQE(`F+hAO@41zڨ3(8Lf""AW<)*=oy`㖽WNйj O:XP'}׶l Ws=y-`zUӄqG,O8竺`WtG,'{CX22PQbM&97=[|͢r~ v,&4QvX3I0eUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUSh\|;D8/@f6 `Xx k-}2+, bbb&, # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_appmonitor#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_appmonitor.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)28 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_appmonitor.sh, hacmp.assist, 61haes_r714 6/10/12 15:32:23 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_appmonitor =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:43 Last Changed: 6/10/12 15:32:23 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_appmonitor.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_appmonitor =head1 DESCRIPTION Determines if the specified application monitor is configured within the cluster. =head1 ARGUMENTS 1. monitor [REQUIRED] [string] The label of the application monitor that is to be be searched for. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_appmonitor { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_appmonitor.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset monitor=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset line= #================= : Validate input #================= if [[ -z $monitor ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else print "$0()[$LINENO]($SECONDS): /usr/bin/odmget -q monitor=$monitor HACMPmonitor" >>$CLMGR_TMPLOG # Always log commands /usr/bin/odmget -q monitor=$monitor HACMPmonitor |\ while read line; do rc=$RC_SUCCESS break done (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print "odmget RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_appmonitor()" 26/2 k2+! bbb&! # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_appserver#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_appserver.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)02 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_appserver.sh, hacmp.assist, 61haes_r714 6/10/12 15:32:24 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_application =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:46 Last Changed: 6/10/12 15:32:24 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_appserver.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_application =head1 DESCRIPTION Determines if the specified application controller is configured within the cluster. =head1 ARGUMENTS 1. server [REQUIRED] [string] The label of the application controller that is to be be searched for. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_appserver { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_appserver.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset server=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset line= #================= : Validate input #================= if [[ -z $server ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else print "$0()[$LINENO]($SECONDS): /usr/bin/odmget -q name=$server HACMPserver" >>$CLMGR_TMPLOG # Always log commands /usr/bin/odmget -q name=$server HACMPserver |\ while read line; do rc=$RC_SUCCESS break done (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print "odmget RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_appserver()" HA/61ah k@2+ bbb&  # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_coderver#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_cod.sh 1.2.1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2012,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)68 1.2.1.4 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_cod.sh, hacmp.assist, 61haes_r720, 1507A_hacmp720 1/27/15 08:41:57 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_cod =head1 VERSION Version Number: 1.2.1.4 Last Extracted: 2/9/15 16:43:08 Last Changed: 1/27/15 08:41:57 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_cod.sh, hacmp.assist, 61haes_r720, 1507A_hacmp720 =head1 SYNOPSIS KLIB_HACMP_is_known_cod =head1 DESCRIPTION Determines if the specified application controller is configured for Resource Optimized High Availability services. =head1 ARGUMENTS 1. application_controller [REQUIRED] [string] The name of the application controller to test for Resource Optimized High Availability settings. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2015 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_cod { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2.1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_cod.sh, hacmp.assist, 61haes_r720, 1507A_hacmp720 : INPUTS: $* typeset application_controller=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset name= start_script= stop_script= typeset use_desired= optimal_mem= optimal_cpu= optimal_pu= optimal_vp= #================= : Validate input #================= if [[ -z $application_controller ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset APPLICATION_CONTROLLER_PROPERTIES= typeset -i index=0 print -- "$0()[$LINENO]($SECONDS): cllsserv -cl -n $application_controller" >>$CLMGR_TMPLOG # Always log commands APPLICATION_CONTROLLER_PROPERTIES=$(cllsserv -cl -n $application_controller) rc=$? print -- "$0()[$LINENO]($SECONDS): cllsserv -cl -n $application_controller rc=$rc" >>$CLMGR_TMPLOG # Always log commands result if (( $rc == RC_SUCCESSS )); then print -- "$APPLICATION_CONTROLLER_PROPERTIES" |\ while IFS=: read name start_script stop_script use_desired optimal_mem optimal_cpu optimal_pu optimal_vp rem do [[ $name == \#* ]] && continue # Skip the column headers optimal_mem=$(CL=$LINENO trim $optimal_mem) optimal_pu=$(CL=$LINENO trim $optimal_pu) # An application controller is a cod if at least one of the cod fields is set if [[ $use_desired != 0 || \ $optimal_mem != +(0)\.+(0) || \ $optimal_cpu != 0 || \ $optimal_pu != +(0)\.+(0) || \ $optimal_vp != 0 ]]; then list[$index]=$name (( index++ )) fi done fi (( index == 0 )) && rc=$RC_NOT_FOUND fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_cod()"  k2+5bbb&5 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_dependency#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_dependency.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)52 1.3 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_dependency.sh, hacmp.assist, 61haes_r714 10/10/12 10:30:17 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_dependency =head1 VERSION Version Number: 1.3 Last Extracted: 1/31/14 04:41:03 Last Changed: 10/10/12 10:30:17 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_dependency.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_dependency =head1 DESCRIPTION Determines if the specified dependency is configured within the cluster. =head1 ARGUMENTS 1. dependency [REQUIRED] [string] The clmgr label representing the dependency to be searched for within the cluster. 2. type [OPTIONAL] [string] An indicator of what type of dependency this is, from the set: PARENT_CHILD SAME_NODE or NODECOLLOCATION SAME_SITE or SITECOLLOCATION, DIFFERENT_NODES or ANTICOLLOCATION =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. #================================================================ # Returns: 0: if no non-whitespace differences were found. # 1: if SET1 contained an item that SET2 did not # 2: if SET2 contained an item that SET1 did not #================================================================ function set_differences { typeset SET1=${1//,/ } typeset SET2=" ${2//,/ } " [[ $SET1 == $SET2 ]] && return 0 typeset ITEM= for ITEM in $SET1; do if [[ " $SET2 " == *\ $ITEM\ * ]]; then SET2="${SET2// $ITEM / }" else return 1 # SET1 contained an item that SET2 did not fi done [[ $SET2 != +([[:space:]]) ]] && return 2 # SET2 contained an item # that SET1 did not return 0 } # End of "set_differences()" function KLIB_HACMP_is_known_dependency { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_dependency.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset dependency=${1//\"/} # Required typeset -u type=${2//\"/} # Optional type=${type#\(} type=${type%\)} [[ -n $3 ]] && typeset -n DEPENDENCIES=$3 [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset line= rg= parent= child= ODMDATA= id_list= typeset -A list pcdeps stopafterdeps startafterdeps typeset RESULT=1 typeset -i INDEX=0 I=0 rc=$RC_UNKNOWN typeset -i return_list=0 [[ -n $3 ]] && return_list=1 unset DEPTYPE : Remove all whitespace dependency=${dependency//+([[:space:]])/} : See if a dependency type was also provided if [[ $dependency == *\(*\)* ]]; then type=${dependency##*\(} type=${type%%\)*} dependency=${dependency/\(*\)} fi #================= : Validate input #================= if [[ -z $dependency ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else #================================================================ : Load all known dependencies, avoiding the "list_dependencies" : function. Using that function here would result in a circular : reference, which will cause ksh93 to core dump! #================================================================ ## ## ACQUIRE/RELEASE ORDER ## print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrgorder -s | /usr/bin/grep -v '#'" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrgorder -s | /usr/bin/grep -v '#' |\ IFS=: read sel_acq par_acq ser_rel par_rel for rg in ${par_acq//,/ }; do [[ -n $dep ]] && dep="$dep," dep="$dep$rg" done print "clrgorder RC: $?" >>$CLMGR_TMPLOG # Always log command result if [[ $dep != *([[:space:]]) ]]; then list[$INDEX]="$dep (ACQUIRE_IN_PARALLEL)" (( INDEX++ )) fi dep= for rg in ${sel_acq//,/ }; do [[ -n $dep ]] && dep="$dep," dep="$dep$rg" done if [[ $dep != *([[:space:]]) ]]; then list[$INDEX]="$dep (ACQUIRE_SERIALLY)" (( INDEX++ )) fi dep= for rg in ${par_rel//,/ }; do [[ -n $dep ]] && dep="$dep," dep="$dep$rg" done if [[ $dep != *([[:space:]]) ]]; then list[$INDEX]="$dep (RELEASE_IN_PARALLEL)" (( INDEX++ )) fi dep= for rg in ${ser_rel//,/ }; do [[ -n $dep ]] && dep="$dep," dep="$dep$rg" done if [[ $dep != *([[:space:]]) ]]; then list[$INDEX]="$dep (RELEASE_SERIALLY)" (( INDEX++ )) fi ## ## PARENT/CHILD ## if [[ -z $type || $type == "PARENT_CHILD" ]]; then print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrgdependency -t PARENT_CHILD -sl | /usr/bin/grep -v '#'" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrgdependency -t PARENT_CHILD -sl |/usr/bin/grep -v '#' |\ while read parent child; do if [[ -n ${pcdeps[$parent]} ]]; then pcdeps[$parent]="${pcdeps[$parent]},$child" else pcdeps[$parent]=$child fi done print "clrgdependency RC: $?" >>$CLMGR_TMPLOG # Always log command result for parent in ${!pcdeps[*]}; do list[$INDEX]="${parent}+${pcdeps[$parent]} (PARENT_CHILD)" (( INDEX++ )) done fi ## ## STOP AFTER ## if [[ -z $type || $type == "STOP_AFTER" ]]; then print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrgdependency -t STOP_AFTER -sl | /usr/bin/grep -v '#'" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrgdependency -t STOP_AFTER -sl 2>>$CLMGR_TMPLOG |/usr/bin/grep -v '#' |\ while read source target; do if [[ -n ${stopafterdeps[$target]} ]]; then stopafterdeps[$target]="${stopafterdeps[$target]},$source" else stopafterdeps[$target]=$source fi done print "clrgdependency RC: $?" >>$CLMGR_TMPLOG # Always log command result for target in ${!stopafterdeps[*]}; do list[$INDEX]="${target}+${stopafterdeps[$target]} (STOP_AFTER)" (( INDEX++ )) done fi ## ## START AFTER ## if [[ -z $type || $type == "START_AFTER" ]]; then print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrgdependency -t START_AFTER -sl | /usr/bin/grep -v '#'" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrgdependency -t START_AFTER -sl 2>>$CLMGR_TMPLOG |/usr/bin/grep -v '#' |\ while read source target; do if [[ -n ${startafterdeps[$target]} ]]; then startafterdeps[$target]="${startafterdeps[$target]},$source" else startafterdeps[$target]=$source fi done print "clrgdependency RC: $?" >>$CLMGR_TMPLOG # Always log command result for target in ${!startafterdeps[*]}; do list[$INDEX]="${target}+${startafterdeps[$target]} (START_AFTER)" (( INDEX++ )) done fi ## ## SAME SITE ## if [[ -z $type || $type == @(SAME_SITE|SITECOLLOCATION) ]]; then print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrgdependency -t SITECOLLOCATION -sl | /usr/bin/grep -v '#'" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrgdependency -t SITECOLLOCATION -sl | /usr/bin/grep -v '#' |\ while read dep; do dep=${dep//+([[:space:]])/,} list[$INDEX]="$dep (SAME_SITE)" (( INDEX++ )) done print "clrgdependency RC: $?" >>$CLMGR_TMPLOG # Always log command result fi ## ## SAME NODE ## if [[ -z $type || $type == @(SAME_NODE|NODECOLLOCATION) ]]; then print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrgdependency -t NODECOLLOCATION -sl | /usr/bin/grep -v '#'" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrgdependency -t NODECOLLOCATION -sl | /usr/bin/grep -v '#' |\ while read dep; do dep=${dep//+([[:space:]])/,} list[$INDEX]="$dep (SAME_NODE)" (( INDEX++ )) done print "clrgdependency RC: $?" >>$CLMGR_TMPLOG # Always log command result fi ## ## DIFFERENT NODES ## if [[ -z $type || $type == @(DIFFERENT_NODES|ANTICOLLOCATION) ]]; then print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrgdependency -t ANTICOLLOCATION -sl | /usr/bin/grep -v '#'" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrgdependency -t ANTICOLLOCATION -sl | /usr/bin/grep -v '#' |\ while IFS=: read high int low; do high=${high//+([[:space:]])/,} int=${int//+([[:space:]])/,} low=${low//+([[:space:]])/,} list[$INDEX]="${high}+${int}+${low} (DIFFERENT_NODES)" (( INDEX++ )) done print "clrgdependency RC: $?" >>$CLMGR_TMPLOG # Always log command result fi INDEX=0 for (( I=0; I<${#list[*]}; I++ )); do [[ -n $type && ${list[$I]} != *\($type\)* ]] && continue [[ $dependency == *\+* && ${list[$I]} != *\+* ]] && continue [[ $dependency == *,* && ${list[$I]} != *,* ]] && continue ################################################################# ## TEMPORAL DEPENDENCY (order matters; location is irrelevant) ################################################################# if [[ $type == @(PARENT_CHILD|STOP_AFTER|START_AFTER) || \ $dependency == *\+* ]] then parents=${dependency%%\+*} parents=${parents//,/ } children=${dependency##*\+} children=${children//,/ } DEPTYPE=${list[$I]} DEPTYPE=${DEPTYPE##*\(} DEPTYPE=${DEPTYPE%%\)*} list[$I]=${list[$I]%%*([[:space:]])\(*} group_parents=${list[$I]%%\+*} group_parents=${group_parents//,/ } set_differences "$parents" "$group_parents" if (( $? == RC_SUCCESS )); then group_children=${list[$I]##*\+} group_children=${group_children//,/ } set_differences "$children" "$group_children" if (( $? == RC_SUCCESS )); then rc=$RC_SUCCESS if (( return_list )); then DEPENDENCIES[$INDEX]="${list[$I]} ($DEPTYPE)" (( INDEX++ )) fi break fi else unset DEPTYPE fi #################################################################### ## LOCATION DEPENDENCY (order is irrelevant; only location matters) #################################################################### else DEPTYPE=${list[$I]} DEPTYPE=${DEPTYPE##*\(} DEPTYPE=${DEPTYPE%%\)*} dependency=${dependency//,/ } list[$I]=${list[$I]%%*([[:space:]])\(*} set_differences "$dependency" "${list[$I]//,/ }" if (( $? == RC_SUCCESS )); then rc=$RC_SUCCESS if (( return_list )); then DEPENDENCIES[$INDEX]="${list[$I]} ($DEPTYPE)" (( INDEX++ )) fi break else unset DEPTYPE fi fi done export DEPTYPE (( $rc != RC_SUCCESS )) && rc=$RC_ERROR fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_dependency()" TIO k~2+\ bbb&\ # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_efsndency#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_efs.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)85 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_efs.sh, hacmp.assist, 61haes_r714 6/10/12 15:32:26 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_efs =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:32 Last Changed: 6/10/12 15:32:26 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_efs.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_efs =head1 DESCRIPTION Determines if EFS is configured within the cluster. =head1 ARGUMENTS None. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_efs { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_efs.sh, hacmp.assist, 61haes_r714 : INPUTS: $* [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset OUTPUT= #================= : Validate input #================= print -- "$0()[$LINENO]($SECONDS): /usr/bin/odmget -q \"group=EFSKeyStore AND name=mode\" HACMPLDAP" >>$CLMGR_TMPLOG OUTPUT=$(/usr/bin/odmget -q "group=EFSKeyStore" HACMPLDAP 2>>$CLMGR_TMPLOG) print "$0()[$LINENO]($SECONDS): odmget RC: $?" >>$CLMGR_TMPLOG [[ $OUTPUT != *([[:space:]]) ]] && rc=$RC_SUCCESS || rc=$RC_ERROR log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_efs()" H$ k 2+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_eventency#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2018,2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r721 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_event.sh 1.3 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2012,2016 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_event.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_event =head1 SYNOPSIS KLIB_HACMP_is_known_event =head1 DESCRIPTION Determines if the specified event is configured within the cluster. =head1 ARGUMENTS 1. event [REQUIRED] [string] The name of the event to search for on this node. 2. type [OPTIONAL] [set] The type of the event: ALL, CUSTOM, PREDEFINED =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_event { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : INPUTS: $* typeset event=${1//\"/} typeset -u type=${2//\"/} if [[ -n $3 ]]; then typeset -n DISCOVERED_TYPE=$3 DISCOVERED_TYPE="" fi [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -A list typeset LINE= #================= : Validate input #================= if [[ -z $event ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else if [[ $type == *([[:space:]]) || $type == @(\*|A|C)* ]]; then print -- "$0()[$LINENO]($SECONDS): $HAUTILS/cllscustom -t event -n $event" >>$CLMGR_TMPLOG if [[ $($HAUTILS/cllscustom -t event -n $event | /usr/bin/grep -v '^#') != *([[:space:]]) ]] then rc=$RC_SUCCESS [[ -n $3 ]] && DISCOVERED_TYPE="CUSTOM" print -- "$0()[$LINENO]($SECONDS): cllscustom RC: $rc" >>$CLMGR_TMPLOG else print -- "$0()[$LINENO]($SECONDS): cllscustom RC: $RC_NOT_FOUND" >>$CLMGR_TMPLOG fi fi if (( $rc != RC_SUCCESS )) || [[ $type == @(\*|A|P)* ]]; then print -- "$0()[$LINENO]($SECONDS): clodmget -q\"name = $event\" -f name -n HACMPevent" >>$CLMGR_TMPLOG OUTPUT=$(clodmget -q"name = $event" -f name -n HACMPevent 2>>CLMGR_TMPLOG) rc=$? print -- "$0()[$LINENO]($SECONDS): clodmget RC: $rc" >>$CLMGR_TMPLOG if [[ -n $OUTPUT ]] then rc=$RC_SUCCESS if [[ -n $3 ]]; then if [[ -n $DISCOVERED_TYPE ]]; then DISCOVERED_TYPE="ALL" else DISCOVERED_TYPE="PREDEFINED" fi fi else rc=$RC_NOT_FOUND fi fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_event()"  k\2+O bbb&O # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_fallback_timertes#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_fallback_timer.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)10 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_fallback_timer.sh, hacmp.assist, 61haes_r714 6/10/12 15:32:27 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_fallback_timer =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:52 Last Changed: 6/10/12 15:32:27 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_fallback_timer.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_fallback_timer =head1 DESCRIPTION Determines if the specified fallback timer is configured within the cluster. =head1 ARGUMENTS 1. timer [REQUIRED] [string] The label of the fallback timer that is to be search for within the cluster. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_fallback_timer { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_fallback_timer.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset timer=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset line= #================= : Validate input #================= if [[ -z $timer ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else print -- "$0()[$LINENO]($SECONDS): $HAUTILS/cltimerpolicy -a list -f smit -n $timer" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/cltimerpolicy -a list -f smit -n $timer |\ while read line; do rc=$RC_SUCCESS break done (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print "cltimerpolicy RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_fallback_timer()" i k2+-bbb&- # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_file_systemertes#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2020,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r721 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_file_system.sh 1.12 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_file_system.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_file_system =head1 VERSION Version Number: 1.9 Last Extracted: 6/13/16 11:34:43 Last Changed: 3/19/15 15:53:46 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_file_system.sh, hacmp.assist, 61haes_r720 =head1 SYNOPSIS KLIB_HACMP_is_known_file_system =head1 DESCRIPTION Determines if the specified file system is configured within the cluster. =head1 ARGUMENTS 1. vgname [REQUIRED] [string] The label of the volume group that is to be search for within the cluster. 2. rg [OPTIONAL] [string] A reference to use for returning the resource group for this file system. 3. nodelist [OPTIONAL] [string] A reference to use for returning the nodes for this file system. 4. vg [OPTIONAL] [string] A reference to use for returning the volume group for this file system. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_file_system { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_file_system.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset fsname=${1//\"/} [[ -n $2 ]] && typeset -n rg=$2 [[ -n $3 ]] && typeset -n nodelist=$3 [[ -n $4 ]] && typeset -n vg=$4 [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN cmd_rc=$RC_UNKNOWN typeset name="" rem="" FS_FILE="$TMPDIR/clmgr.KHikfs.$$" typeset -i try=0 tries=5 typeset RG="" VG="" #================= : Validate input #================= if [[ -z $fsname ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else if [[ $FS_COUNT != +([[:digit:]]) ]] || (( FS_COUNT <= 1 )); then while (( $try < $tries )); do print "$0()[$LINENO]($SECONDS): $HASBIN/cl_showfs2" >>$CLMGR_TMPLOG $HASBIN/cl_showfs2 >$FS_FILE 2>>$CLMGR_TMPLOG cmd_rc=$? print "cl_showfs2 RC: $cmd_rc" >>$CLMGR_TMPLOG # Always log command result if (( $cmd_rc == RC_SUCCESS )) && \ [[ -f $FS_FILE && $(head -1 $FS_FILE) != \#* ]] then cmd_rc=$RC_ERROR # Found unexpected, error output fi (( $cmd_rc == RC_SUCCESS )) && break (( try++ )) if (( $try <= ( $tries - 1 ) )); then sleep $try fi done (( $cmd_rc != RC_SUCCESS )) && rc=$RC_ERROR elif [[ -f /var/hacmp/tmp/chocls.try_out ]]; then cp /var/hacmp/tmp/chocls.try_out $FS_FILE else rc=$RC_ERROR fi if (( rc == RC_UNKNOWN )); then while read name vg rg nodelist rem; do [[ $name == *([[:space:]]) || $name == \#* ]] && continue if [[ $name == $fsname ]]; then if [[ -n $rem ]]; then rem=${rem%%+([[:space:]])} nodelist=${rem##*[[:space:]]} fi RG=$($HAUTILS/clodmget -n -q "name=FILESYSTEM AND value=$fsname" -f group HACMPresource) if [[ -z "$RG" ]]; then VG=$(/usr/es/sbin/cluster/events/utils/cl_fs2disk -v $fsname) RG=$($HAUTILS/clodmget -n -q "name=VOLUME_GROUP AND value=$VG" -f group HACMPresource) fi if [[ -n "$RG" ]]; then rg=$RG fi rc=$RC_SUCCESS break fi done <$FS_FILE fi /usr/bin/rm -f $FS_FILE (( $rc != RC_SUCCESS )) && rc=$RC_ERROR fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_file_system()" vg kv2+D bbb&D # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_filecollectiontes#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_filecollection.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)93 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_filecollection.sh, hacmp.assist, 61haes_r714 6/10/12 15:32:31 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_filecollection =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:21 Last Changed: 6/10/12 15:32:31 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_filecollection.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_filecollection =head1 DESCRIPTION Determines if the specified file collection is configured within the cluster. =head1 ARGUMENTS 1. fc [REQUIRED] [string] The label of the file collection that is to be search for within the cluster. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_filecollection { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_filecollection.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset fc=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset line= #================= : Validate input #================= if [[ -z $fc ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else print -- "$0()[$LINENO]($SECONDS): /usr/bin/odmget -q name=$fc HACMPfilecollection" >>$CLMGR_TMPLOG # Always log commands /usr/bin/odmget -q name=$fc HACMPfilecollection |\ while read line; do rc=$RC_SUCCESS break done (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print "odmget RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_filecollection()" er/u kN2+" bbb&" # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_groupllect#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_group.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)08 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_group.sh, hacmp.assist, 61haes_r714 6/10/12 15:32:31 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_group =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:12 Last Changed: 6/10/12 15:32:31 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_group.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_group =head1 DESCRIPTION Determines if the specified group is configured within the cluster. =head1 ARGUMENTS 1. group [REQUIRED] [string] The name of the group to search for on this node. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_group { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_group.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset group=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -A list typeset LINE= #================= : Validate input #================= if [[ -z $group ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else print -- "$0()[$LINENO]($SECONDS): /usr/sbin/lsgroup -a ALL" >>$CLMGR_TMPLOG # Always log commands /usr/sbin/lsgroup -a ALL 2>/dev/null |\ while read LINE; do if [[ -n $LINE ]]; then [[ $LINE == *([[:space:]])\#* ]] && continue [[ $LINE == *+([[:space:]])* ]] && continue LINE=${LINE##+([[:space:]])} LINE=${LINE%%+([[:space:]])} if [[ $LINE == $group ]]; then rc=$RC_SUCCESS break fi fi done (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print "odmget RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_group()" st=$3  k\2+gbbb&g # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_hmcpllect#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r721 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_hmc.sh 1.1.1.6 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2012,2016 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_hmc.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_hmc =head1 VERSION Version Number: 1.1.1.6 Last Extracted: 8/9/16 14:12:29 Last Changed: 7/29/16 10:31:33 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_hmc.sh, hacmp.assist, 61haes_r721, 1631A_hacmp721 =head1 SYNOPSIS KLIB_HACMP_is_known_hmc =head1 DESCRIPTION Determines if the specified HMC is configured within the cluster. =head1 ARGUMENTS 1. HMC [REQUIRED] [string] The name of the HMC to search for on this node. Either hostname or IP address for the HMC. IPv4 and IPv6 format address are supported. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2015 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_hmc { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_hmc.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset -n hmclabel=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i found=0 typeset -A list #================= : Validate input #================= if [[ -z $hmclabel ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset HMC="" rest="" typeset HMC_PROPERTIES= print -- "$0()[$LINENO]($SECONDS): cllshmc -c -u $hmclabel" >>$CLMGR_TMPLOG # Always log commands HMC_PROPERTIES=$(cllshmc -c -u $hmclabel) rc=$? print -- "$0()[$LINENO]($SECONDS): cllshmc -c -u $hmclabel rc=$rc" >>$CLMGR_TMPLOG # Always log commands result if (( $rc == RC_SUCCESS )); then print -- "$HMC_PROPERTIES" | while IFS=: read name timeout retry_count retry_delay rem; do [[ $name == \#* ]] && continue # Skip the column headers rc=$RC_SUCCESS done else #================================ : Convert Host name/Ip to Name # print -- "$0()[$LINENO]($SECONDS): host $hmclabel" >>$CLMGR_TMPLOG # Always log commands HMC=$(LC_ALL=C host $hmclabel 2>>$CLMGR_TMPLOG) rc=$? print -- "$0()[$LINENO]($SECONDS): host $hmclabel output=$HMC rc=$rc">>$CLMGR_TMPLOG # Always log commands result if (( $rc == RC_SUCCESS )); then print -- $HMC | IFS=' ' read hmclabel rest print -- "$0()[$LINENO]($SECONDS): cllshmc -c -u $hmclabel" >>$CLMGR_TMPLOG # Always log commands HMC_PROPERTIES=$(cllshmc -c -u $hmclabel) rc=$? print -- "$0()[$LINENO]($SECONDS): cllshmc -c -u $hmclabel rc=$rc" >>$CLMGR_TMPLOG # Always log commands result if (( $rc == RC_SUCCESS )); then print -- "$HMC_PROPERTIES" | while IFS=: read name timeout retry_count retry_delay rem; do [[ $name == \#* ]] && continue # Skip the column headers rc=$RC_SUCCESS done fi fi fi (( $rc != RC_SUCCESS )) && rc=$RC_NOT_FOUND fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_hmc()" F k2+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_interfacet#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_interface.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)67 1.3 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_interface.sh, hacmp.assist, 61haes_r714 6/10/12 15:32:32 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_interface =head1 VERSION Version Number: 1.3 Last Extracted: 1/31/14 04:41:44 Last Changed: 6/10/12 15:32:32 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_interface.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_interface =head1 DESCRIPTION Determines if the specified interface is configured within the cluster. =head1 ARGUMENTS 1. interface [REQUIRED] [string] The label of the interface that is to searched for within the cluster. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_interface { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_interface.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset interface=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset value= if_names= if_addr= LINE= typeset name= type= nw= nettype= attr= node= ipaddr= haddr= if= typeset gname= netmask= hb_addr= site= prefix= family= remainder= #================================================== : Convert the provided interface into its network : names and aliases, as well as its IP address. #================================================== value=$(LANG=C LC_ALL=C /usr/bin/host $interface) if_addr=${value%%,*} if_addr=${if_addr##*+([[:space:]])} if_names=${value##*:} if_names=${if_names//,/} #================= : Validate input #================= if [[ -z $interface ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else #===================================================== : Make sure to use the label of the interface, since : it might have been passed in as an IP address. #===================================================== print -- "$0()[$LINENO]($SECONDS): $HAUTILS/cllsif -pcS" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/cllsif -pcS |\ while read LINE; do : Handle possible IPv6 address typeset IPv6= if [[ $LINE == *\[* ]]; then IPv6=${LINE##*\[} IPv6=${IPv6%%\]*} LINE=${LINE/\[$IPv6\]/[${IPv6//:/_}]} fi print -- "$LINE" | IFS=: read name type nw nettype attr node ipaddr haddr if gname netmask hb_addr site prefix family remainder : Handle possible IPv6 address ipaddr=${ipaddr//_/:} ipaddr=${ipaddr/\[/} ipaddr=${ipaddr/\]/} for value in $interface $if_addr $if_names; do if [[ $value == @($name|$ipaddr) ]]; then rc=$RC_SUCCESS break fi done (( rc == $RC_SUCCESS )) && break done (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print "odmget RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_interface()" ACMP_ k ?2+ bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_ldap_clientontes#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_ldap_client.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)44 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_ldap_client.sh, hacmp.assist, 61haes_r714 6/10/12 15:32:34 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_ldap_client =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:49 Last Changed: 6/10/12 15:32:34 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_ldap_client.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_ldap_client =head1 DESCRIPTION Determines if the specified LDAP client is configured within the cluster. =head1 ARGUMENTS 1. ldap_client [REQUIRED] [string] The name of the LDAP client to search for. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_ldap_client { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_ldap_client.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset ldap_client=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -A list typeset LINE= #================= : Validate input #================= if [[ -z $ldap_client ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clodmget -q \"group=LDAPServer and name=ServerList\" -f value HACMPLDAP" >>$CLMGR_TMPLOG # Always log commands typeset DATA=$($HAUTILS/$HAUTILS/clodmget -q "group=LDAPClient and name=ServerList" -f value HACMPLDAP 2>/dev/null) rc=$? print "clodmget RC: $rc" >>$CLMGR_TMPLOG # Always log command result print -- "$DATA" |\ while read LINE; do LINE=${LINE//\"/} LINE=${LINE##+([[:space:]])} LINE=${LINE%%+([[:space:]])} if [[ -n $LINE ]]; then LINE=${LINE//,/ } if [[ " $LINE " == *\ $ldap_client\ * ]]; then rc=$RC_SUCCESS break fi fi done (( $rc != RC_SUCCESS )) && rc=$RC_ERROR fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_ldap_client()" LINE;  kh2+ bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_ldap_serverontes#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_ldap_server.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)77 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_ldap_server.sh, hacmp.assist, 61haes_r714 6/10/12 15:32:35 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_ldap_server =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:51 Last Changed: 6/10/12 15:32:35 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_ldap_server.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_ldap_server =head1 DESCRIPTION Determines if the specified LDAP server is configured within the cluster. =head1 ARGUMENTS 1. ldap_server [REQUIRED] [string] The name of the LDAP server to search for. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_ldap_server { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_ldap_server.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset ldap_server=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -A list typeset LINE= #================= : Validate input #================= if [[ -z $ldap_server ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clodmget -q \"group=LDAPServer and name=ServerList\" -f value HACMPLDAP" >>$CLMGR_TMPLOG # Always log commands typeset DATA=$($HAUTILS/$HAUTILS/clodmget -q "group=LDAPServer and name=ServerList" -f value HACMPLDAP 2>/dev/null) rc=$? print "clodmget RC: $rc" >>$CLMGR_TMPLOG # Always log command result print -- "$DATA" |\ while read LINE; do LINE=${LINE//\"/} LINE=${LINE##+([[:space:]])} LINE=${LINE%%+([[:space:]])} if [[ -n $LINE ]]; then LINE=${LINE//,/ } if [[ " $LINE " == *\ $ldap_server\ * ]]; then rc=$RC_SUCCESS break fi fi done (( $rc != RC_SUCCESS )) && rc=$RC_ERROR fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_ldap_server()" LINE;  kfa2+ bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_log_server#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_log.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)41 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_log.sh, hacmp.assist, 61haes_r714 6/10/12 15:32:35 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_log =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:48 Last Changed: 6/10/12 15:32:35 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_log.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_log =head1 DESCRIPTION Determines if the specified log is a recognized/known PowerHA log. =head1 ARGUMENTS 1. log [REQUIRED] [string] The name of the log to search for on this node. 2. directory [OPTIONAL] [string] A reference to use for returning the current directory of the specified log file. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_log { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_log.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset log=${1//\"/} [[ -n $2 ]] && typeset -n directory=$2 [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset line= #================= : Validate input #================= if [[ -z $log ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else print "$0()[$LINENO]($SECONDS): $HAUTILS/clodmget -q \"name=$log\" -f value HACMPlogs" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clodmget -q "name=$log" -f value HACMPlogs |\ while read line; do directory=${line//\"/} rc=$RC_SUCCESS break done (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print "clodmget RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_log()"  k\2+)bbb&) # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_logical_volumetes#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_logical_volume.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)84 1.3 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_logical_volume.sh, hacmp.assist, 61haes_r714 7/3/12 12:09:18 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_logical_volume =head1 VERSION Version Number: 1.3 Last Extracted: 1/31/14 04:41:32 Last Changed: 7/3/12 12:09:18 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_logical_volume.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_logical_volume =head1 DESCRIPTION Determines if the specified logical volume is configured within the cluster. =head1 ARGUMENTS 1. lvname [REQUIRED] [string] The label of the logical volume that is to be searched for within the cluster. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_logical_volume { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_logical_volume.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset lvname=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset LV_DATA= lv= rem= #================= : Validate input #================= if [[ -z $lvname ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset VGS= CL=$LINENO KLIB_HACMP_list_volume_groups VGS 2>>$CLMGR_TMPLOG for (( i=0; i<${#VGS[*]}; i++ )); do VG=${VGS[$i]} [[ $VG == *([[:space:]]) ]] && continue print -- "$0()[$LINENO]($SECONDS): $HASBIN/cl_lsvg -l $VG" >>$CLMGR_TMPLOG LV_DATA=$(LANG=C LC_ALL=C $HASBIN/cl_lsvg -l $VG 2>>$CLMGR_TMPLOG) print "cl_lsvg RC: $?" >>$CLMGR_TMPLOG print -- "$LV_DATA" |\ while read lv rem; do [[ $lv == *: || -z $lv ]] && continue [[ $lv == LV && $rem == NAME* ]] && continue if [[ $lvname == $lv ]]; then rc=$RC_SUCCESS break fi done # End of the LV data loop done # End of the VG loop (( $rc != RC_SUCCESS )) && rc=$RC_ERROR fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_logical_volume()" t IPv6= kDB2+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_method_vol#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_method.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2009,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)07 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_method.sh, hacmp.assist, 61haes_r714 6/10/12 15:32:37 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_method =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:57 Last Changed: 6/10/12 15:32:37 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_method.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_method =head1 DESCRIPTION Determines if the specified custom method is configured within the cluster. =head1 ARGUMENTS 1. method [REQUIRED] [string] The name of the custom method to search for. 2. type [OPTIONAL] [string] A reference to use for returning the type of the specified method. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_method { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_method.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset method=${1//\"/} [[ -n $2 ]] && typeset -n type=$2 [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -A list typeset name= #================= : Validate input #================= if [[ -z $method ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else # # SNAPSHOT / VERIFY # print -- "$0()[$LINENO]($SECONDS): $HAUTILS/cllscustom -c -n \"$method\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/cllscustom -c -n "$method" 2>/dev/null |\ while IFS=: read name newtype rem; do [[ $name != $method ]] && continue [[ -n $type ]] && type="$type," type="$type$newtype" done print "cllscustom RC: $?" >>$CLMGR_TMPLOG # Always log command result # # NOTIFY # print -- "$HAUTILS/cllspgr -m \"$method\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/cllspgr -m "$method" 2>/dev/null |\ while read name; do [[ $name == *([[:space:]])\#* ]] && continue rc=$RC_SUCCESS [[ -n $type ]] && type="$type," type="${type}notify" break done print "cllspgr RC: $?" >>$CLMGR_TMPLOG # Always log command result fi [[ $type != *([[:space:]]) ]] && rc=$RC_SUCCESS || rc=$RC_ERROR log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_method()"  kz2+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_mirror_groupetes#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_mirror_group.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_mirror_group =head1 VERSION Version Number: 1.7 Last Extracted: 1/31/14 04:41:15 Last Changed: 5/15/13 17:07:07 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_mirror_group.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_mirror_group =head1 DESCRIPTION Determines if the specified mirror group is configured within the cluster. =head1 ARGUMENTS 1. mirror_group [REQUIRED] [string] The name of the mirror group to search for on this node. 2. TYPE [OPTIONAL] [reference] A string reference which can be used to return the discovered type of the specified mirror group. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_mirror_group { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_mirror_group.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset mirror_group=${1//\"/} [[ -n $2 ]] && typeset -n TYPE=${2//\"/} TYPE="" [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -A list typeset LINE="" name="" mode="" cg="" rec="" vid="" ss="" rest="" #================= : Validate input #================= if [[ -z $mirror_group ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else print -- "$0()[$LINENO]($SECONDS): $HAXDWIZ/clxd_list_mg_director -d\"|\" -h $mirror_group" >>$CLMGR_TMPLOG # Always log commands $HAXDWIZ/clxd_list_mg_director -d"|" -h $mirror_group 2>>$CLMGR_TMPLOG |\ while read LINE; do if [[ -n $LINE ]]; then print -- "$LINE" | IFS=\| read name mode cg rec vid ss rest if [[ $name == $mirror_group ]]; then $HAXDWIZ/clxd_list_mg_director -d"|" $mirror_group | grep "^$mirror_group|" >$TMPDIR/clmgr.KHikmg.$$ if (( $? == RC_SUCCESS )); then typeset STORAGE_SYSTEMS="" HORCM_INSTANCE="" REM="" /usr/bin/cut -f6,20 -d\| $TMPDIR/clmgr.KHikmg.$$ |\ IFS="|" read STORAGE_SYSTEMS HORCM_INSTANCE REM if [[ $STORAGE_SYSTEMS != *([[:space:]]) ]]; then typeset -A ssProps CL=$LINENO KLIB_HACMP_get_storage_system_attributes "${STORAGE_SYSTEMS%% *}" ssProps TYPE="${ssProps[TYPE]}" elif [[ $HORCM_INSTANCE != *([[:space:]]) ]]; then TYPE="hitachi" else TYPE="emc" fi rc=$RC_SUCCESS else TYPE="" rc=$RC_ERROR fi if [[ -f $TMPDIR/clmgr.KHikmg.$$ ]]; then /usr/bin/rm -f $TMPDIR/clmgr.KHikmg.$$ fi break else TYPE="" fi fi done (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print "$0()[$LINENO]($SECONDS): odmget RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_mirror_group()" l 2>&1  kz)2+3bbb&3 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_mirror_pairetes#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_mirror_pair.sh 1.4 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)32 1.4 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_mirror_pair.sh, hacmp.assist, 61haes_r714 10/24/12 17:29:23 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_mirror_pair =head1 VERSION Version Number: 1.4 Last Extracted: 1/31/14 04:41:18 Last Changed: 10/24/12 17:29:23 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_mirror_pair.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_mirror_pair =head1 DESCRIPTION Determines if the specified mirror pair is configured within the cluster. =head1 ARGUMENTS 1. mirror_pair [REQUIRED] [string] The name of the mirror pair to search for on this node. 2. TYPE [OPTIONAL] [reference] A string reference which can be used to return the discovered type of the specified mirror pair. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_mirror_pair { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_mirror_pair.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset mirror_pair=${1//\"/} [[ -n $2 ]] && typeset -n TYPE=${2//\"/} TYPE="" [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -A list typeset LINE="" name="" rest="" #================= : Validate input #================= if [[ -z $mirror_pair ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else TYPE="svc" print -- "$0()[$LINENO]($SECONDS): $HAXDWIZ/clxd_list_mdp_director -s $TYPE -d\"|\" -h $mirror_pair" >>$CLMGR_TMPLOG # Always log commands $HAXDWIZ/clxd_list_mdp_director -s $TYPE -d"|" -h $mirror_pair 2>>$CLMGR_TMPLOG |\ while read LINE; do if [[ -n $LINE ]]; then print -- "$LINE" | IFS=\| read name rest if [[ $name == $mirror_pair ]]; then rc=$RC_SUCCESS break fi fi done (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print "$0()[$LINENO]($SECONDS): odmget RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_mirror_pair()" T  kRH2+ bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_mirror_pooletes#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_mirror_pool.sh 1.2 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_mirror_pool =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:42:03 Last Changed: 7/7/12 16:03:42 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_mirror_pool.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_mirror_pool =head1 DESCRIPTION Determines if the specified mirror pool is configured within the cluster. =head1 ARGUMENTS 1. mirror_pool [REQUIRED] [string] The name of the mirror pool to search for on this node. 2. volume_group [OPTIONAL] [string] The volume group that the specified mirror pool is configured within. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_mirror_pool { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_mirror_pool.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset mirror_pool=${1//\"/} typeset volume_group=${2//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN i=0 typeset available #================= : Validate input #================= if [[ -z $mirror_pool ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else CL=$LINENO KLIB_HACMP_list_mirror_pools available for (( i=0; i<${#available[*]}; i++ )); do if [[ -n $volume_group ]]; then if [[ ${available[$i]} == "$mirror_pool ($volume_group)" ]]; then rc=$RC_SUCCESS print -- "$mirror_pool ($volume_group)" # Return these values fi elif [[ ${available[$i]} == $mirror_pool\ * ]]; then rc=$RC_SUCCESS print -- "${available[$i]}" # Return these values fi done (( $rc != RC_SUCCESS )) && rc=$RC_NOT_FOUND print "odmget RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_mirror_pool()" $rc" > khX2+ bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_networkool#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_network.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)73 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_network.sh, hacmp.assist, 61haes_r714 6/10/12 15:32:41 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_network =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:50 Last Changed: 6/10/12 15:32:41 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_network.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_network =head1 DESCRIPTION Determines if the specified network is configured within the cluster. =head1 ARGUMENTS 1. network [REQUIRED] [string] The label of the PowerHA network to search for within the cluster. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_network { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_network.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset network=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset line= #================= : Validate input #================= if [[ -z $network ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else print "$0()[$LINENO]($SECONDS): /usr/bin/odmget -q name=$network HACMPnetwork" >>$CLMGR_TMPLOG # Always log commands /usr/bin/odmget -q name=$network HACMPnetwork |\ while read line; do rc=$RC_SUCCESS break done (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print "odmget RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_network()" r/bin/s k22+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_noderkool#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_node.sh 1.6 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2013 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)99 1.6 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_node.sh, hacmp.assist, 61haes_r714 7/18/13 11:42:20 #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_node =head1 VERSION Version Number: 1.6 Last Extracted: 1/31/14 04:40:14 Last Changed: 7/18/13 11:42:20 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_node.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_node =head1 DESCRIPTION Determines if the specified node is configured within the cluster. =head1 ARGUMENTS 1. node [REQUIRED] [string] The label of the node that is to be searched for within the cluster. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_node { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.6, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_node.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset node=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset line= id= #================= : Validate input #================= if [[ -z $node ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else : See if a node ID was provided, instead of a label typeset cmd="odmget" if [[ $node == +([[:digit:]]) ]]; then if (( ${#node} > 10 )); then # Received a "GID" id=${node:10} # Remove the cluster ID, leaving only the node ID fi print "$0()[$LINENO]($SECONDS): /usr/bin/odmget -q node_id=$id HACMPnode" >>$CLMGR_TMPLOG # Always log commands /usr/bin/odmget -q node_id=$id HACMPnode |\ while read line; do rc=$RC_SUCCESS if [[ $line == *([[:space:]])name\ =\ * ]]; then line=${line##* = \"} node=${line%\"} break fi done else cmd="clnodename" print "$0()[$LINENO]($SECONDS): $HAUTILS/clnodename" >>$CLMGR_TMPLOG # Always log commands typeset NODES=$($HAUTILS/clnodename) node=$(CL=$LINENO escape $node) if [[ " $NODES " == *+([[:space:]])$node+([[:space:]])* ]]; then rc=$RC_SUCCESS fi fi (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print "$cmd RC: $rc" >>$CLMGR_TMPLOG # Always log command result print -- "$node" fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_node()" is_kn k>|2+"bbb&" # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_novarkool#!/bin/ksh93 # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_nova.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_nova =head1 SYNOPSIS KLIB_HACMP_is_known_nova =head1 DESCRIPTION Determines if the specified NovaLink is configured within the cluster. =head1 ARGUMENTS 1. NovaLink [REQUIRED] [string] The name of the NovaLink to search for on this node. Either hostname or IP address for the NovaLink. IPv4 and IPv6 format address are supported. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_nova { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : INPUTS: $* typeset -n novalabel=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i found=0 typeset -A list #================= : Validate input #================= if [[ -z $novalabel ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset NOVA="" rest="" #================================ : Convert Host name/Ip to Name #================================ print -- "$0()[$LINENO]($SECONDS): LC_ALL=C host $novalabel" >>$CLMGR_TMPLOG # Always log commands NOVA=$(LC_ALL=C host $novalabel 2>/dev/null) rc=$? print -- "$0()[$LINENO]($SECONDS): host $novalabel output=$NOVA rc=$rc">>$CLMGR_TMPLOG # Always log commands result if (( $rc == RC_SUCCESS )); then novalabel=${NOVA%% *} fi if [[ -n $novalabel ]]; then typeset NOVA_PROPERTIES= print -- "$0()[$LINENO]($SECONDS): cllsnova -c -u $novalabel" >>$CLMGR_TMPLOG # Always log commands NOVA_PROPERTIES=$(cllsnova -c -u $novalabel) rc=$? print -- "$0()[$LINENO]($SECONDS): cllsnova -c -u $novalabel rc=$rc" >>$CLMGR_TMPLOG # Always log commands result if (( $rc == RC_SUCCESS )); then if [[ -n $(cllsnova -c -u $novalabel | grep -v "^#") ]]; then rc=$RC_SUCCESS fi fi (( $rc != RC_SUCCESS )) && rc=$RC_NOT_FOUND fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_nova()" lse  k2+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_persistent_iptes#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_persistent_ip.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)08 1.3 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_persistent_ip.sh, hacmp.assist, 61haes_r714 6/10/12 15:32:44 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_persistent_ip =head1 VERSION Version Number: 1.3 Last Extracted: 1/31/14 04:41:52 Last Changed: 6/10/12 15:32:44 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_persistent_ip.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_persistent_ip =head1 DESCRIPTION Determines if the specified persistent_ip is configured within the cluster. =head1 ARGUMENTS 1. persistent_ip [REQUIRED] [string] The persitent IP that is to be searched for within the cluster. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_persistent_ip { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_persistent_ip.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset persistent_ip=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset value= pip_names= pip_addr= LINE= typeset name= type= nw= nettype= attr= node= ipaddr= haddr= if= typeset gname= netmask= hb_addr= site= prefix= family= remainder= #========================================================= : Convert the provided persistent label into its network : names and aliases, as well as its IP address. #========================================================= value=$(LANG=C LC_ALL=C /usr/bin/host $persistent_ip) pip_addr=${value%%,*} pip_addr=${pip_addr##*+([[:space:]])} pip_names=${value##*:} pip_names=${pip_names//,/} #================= : Validate input #================= if [[ -z $persistent_ip ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else print -- "$0()[$LINENO]($SECONDS): $HAUTILS/cllsif -pcS" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/cllsif -pcS |\ while read LINE; do : Handle possible IPv6 address typeset IPv6= if [[ $LINE == *\[* ]]; then IPv6=${LINE##*\[} IPv6=${IPv6%%\]*} LINE=${LINE/\[$IPv6\]/[${IPv6//:/_}]} fi print -- "$LINE" | IFS=: read name type nw nettype attr node ipaddr haddr if gname netmask hb_addr site prefix family remainder : Handle possible IPv6 address ipaddr=${ipaddr//_/:} ipaddr=${ipaddr/\[/} ipaddr=${ipaddr/\]/} [[ $type != "persistent" ]] && continue for value in $persistent_ip $pip_addr $pip_names; do if [[ $value == @($name|$ipaddr) ]]; then rc=$RC_SUCCESS break fi done (( rc == $RC_SUCCESS )) && break done (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print "cllsif RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_persistent_ip()"  kG2+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_physical_volumees#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_physical_volume.sh 1.6 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)60 1.6 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_physical_volume.sh, hacmp.assist, 61haes_r714 3/21/13 14:23:52 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_physical_volume =head1 VERSION Version Number: 1.6 Last Extracted: 1/31/14 04:41:19 Last Changed: 3/21/13 14:23:52 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_physical_volume.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_physical_volume =head1 DESCRIPTION Determines if the specified physical_volume is configured within the cluster. =head1 ARGUMENTS 1. physical_volume [REQUIRED] [string] The name of the physical_volume to search for on this node. 2. refnode [OPTIONAL] [string] A reference node where the specified physical volume is expected to be valid. 3. data [OPTIONAL] [reference] A reference to a return vehicle for cllspvids output. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_physical_volume { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.6, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_physical_volume.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset physical_volume=${1//\"/} typeset refnode=${2//\"/} typeset -i return_data=0 if [[ -n $3 ]]; then nameref data=$3 data="" return_data=1 fi [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset ALL_DISKS= cand_name= cand_pvid= cand_vg= cand_uuid= rest= #================= : Validate input #================= if [[ -z $physical_volume ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else if [[ -n $refnode ]]; then ALL_DISKS=$(CL=$LINENO list_disks $refnode 2>/dev/null) else ALL_DISKS=$(CL=$LINENO list_disks 2>/dev/null) refnode=$LOCAL_NODE fi if [[ $ALL_DISKS != *([[:space:]]) ]]; then print -- "$ALL_DISKS" | /usr/bin/grep -w "$physical_volume" | read cand_name cand_pvid cand_vg cand_uuid rest if [[ $physical_volume == $cand_name || \ $physical_volume == $cand_pvid || \ $physical_volume == $cand_uuid ]] then rc=$RC_SUCCESS (( return_data )) && data="$refnode:$cand_name:$cand_pvid:$cand_uuid" else rc=$RC_NOT_FOUND fi else rc=$RC_ERROR fi fi [[ -n $data ]] && data=${data//[[:space:]]/} log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_physical_volume()"  k(2+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_reportl_vo#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_report.sh 1.5 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2009,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_report.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #============================================================================ # # Name: KLIB_HACMP_is_known_report # # Description: This is the main, FPATH function that is invoked by clmgr # to confirm that the provided input represents a supported # report type. # # Inputs: See the "devDoc()" function, below. # # Outputs: None. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function, below, for the standard return # code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_is_known_report { . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_report.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset -l report=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset line= #================= : Validate input #================= if [[ -z $report ]]; then dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else typeset orig_report=$report case $report in ap*) report=applications ;; av*) report=availability ;; ba*) report=basic ;; cl*) report=cluster ;; de*) report=dependencies ;; ev*) report=event ;; fs*) report=fsinfo ;; lv*) report=lvinfo ;; ne*) report=network ;; nw) report=network ;; no*) report=nodeinfo ;; rg*) report=rginfo ;; ro*) report=roha ;; rp|rep*) report=repositories ;; rs|res*) report=resources ;; sn*) report=snapshot ;; so*) report=software ;; st*) report=status ;; to*) report=topology ;; vg*) report=vginfo ;; *) unset report ;; esac if [[ -n $report ]]; then rc=$RC_SUCCESS else rc=$RC_ERROR report=$orig_report fi print $report fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_report()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_report =head1 SYNOPSIS KLIB_HACMP_is_known_report =head1 DESCRIPTION Determines if the specified report is a recognized/known PowerHA report. =head1 ARGUMENTS 1. report [REQUIRED] [string] The name of the report to validate. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== ;  k2+*bbb&* # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_repository#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r721 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_repository.sh 1.15.1.1 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2012,2016 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_repository.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #============================================================================ # # Name: KLIB_HACMP_is_known_repository # # Description: This is the main, FPATH function that is invoked by clmgr # to determine if the specified disk, in device name or PVID # format, is a CAA repository disk. # # Inputs: See the "devDoc()" function, below. # # Outputs: If the third argument is provided, it is established as # a reference, and all data about the provided disk is # stored inside of it. Other than that, the only output # is any error messages that might occur. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function, below, for the standard return # code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_is_known_repository { . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_repository.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset cand_disk=${1//\"/} typeset site=${2//\"/} if (( $# >= 3 )) && [[ -n $3 ]] then typeset -n disk_data=${3//\"/} disk_data="" else typeset disk_data="" fi if (( $# >= 4 )) && [[ -n $4 ]] then typeset DISK_INFO=${4//\"/} fi [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset line= id= ALL_DISKS= junk= typeset cand_name= cand_pvid= cand_uuid= typeset repos_name= repos_pvid= repos_uuid= typeset IDENTIFIERS="" REM="" #================= : Validate input #================= if [[ -z $cand_disk ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else if [[ $DISK_INFO != *:* ]]; then typeset NODES=$REFNODE # Can be set in external env if [[ -z $NODES ]]; then if [[ -n $site ]]; then NODES=$(clodmget -n -f nodelist -q name=$site HACMPsite) else NODES=$(clodmget -n -f name -q object=COMMUNICATION_PATH HACMPnode) fi NODES=$(CL=$LINENO trim "$NODES") fi #====================================== : Extract the data for the given disk #====================================== CL=$LINENO getDiskData "$cand_disk" "$NODES" IDENTIFIERS 1 print -- "$IDENTIFIERS" |\ IFS=: read cand_name cand_pvid cand_uuid REFNODE REM else #====================================================== : As a performance optimization, if the data for disk : "$cand_disk" has already been collected by : the caller, also via getDiskData, then there is no : reason to invoke it again to collect the same info. #====================================================== print -- "$DISK_INFO" |\ IFS=: read cand_name cand_pvid cand_uuid REFNODE REM fi ALL_DISKS=$(CL=$LINENO list_disks $REFNODE) if [[ $cand_name == *([[:space:]]) ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$cand_disk" 1>&2 log_return_msg "$RC_ERROR" "$0()" "$LINENO" return $? elif [[ $cand_vg != *([[:space:]]) && $cand_vg != "None" ]]; then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 256 '\nERROR: disk "%1$s" is already in use within volume group "%2$s".\n\n' "$cand_disk" "$cand_vg" 1>&2 log_return_msg "$RC_INCORRECT_INPUT" "$0()" "$LINENO" return $? fi #===================================================== : Create a list of all, already-defined repositories #===================================================== # Create the right filter # For NSC or SC: repositories are in a unique HACMPsircol which id=0 # For LC: repositories are in two HACMPsircol, one for each site, the id of site has to found first. typeset FILTER_SITE="" if [[ $CLUSTER_TYPE == "LC" && -n $site ]] then typeset FILTER_SITEID=$(clodmget -n -q "name=${site}_sircol" -f id HACMPsircol) FILTER_SITE="-q id=${FILTER_SITEID}" # # For NSC or SC, the 'id' qualifier can be dispensed # fi typeset KNOWN_REPOSITORIES=$(clodmget -n $FILTER_SITE -f repository HACMPsircol) typeset backups=$(clodmget -n $FILTER_SITE -f backup_repository HACMPsircol) [[ -n $backups ]] && KNOWN_REPOSITORIES="$KNOWN_REPOSITORIES $backups" KNOWN_REPOSITORIES=${KNOWN_REPOSITORIES//0000000000000000/} for disk in ${KNOWN_REPOSITORIES//,/ }; do #=========================================================== : Extract the remaining data for the given disk, so that a : complete comparison can be done. In other words, if a : device name was provided, then the PVID and UUID need to : be collected so they can be compared, too, if needed. #=========================================================== print -- "$ALL_DISKS" | grep -w "$disk" |\ read repos_name repos_pvid repos_vg repos_uuid REM [[ -z $repos_name ]] && continue if [[ $cand_name == $repos_name || \ $cand_pvid == $repos_pvid ]] then rc=$RC_SUCCESS break elif [[ $cand_uuid != *([[:space:]]) && \ $repos_uuid != *([[:space:]]) && \ $cand_uuid == $repos_uuid ]] then rc=$RC_SUCCESS break fi done if (( $rc == RC_SUCCESS )); then disk_data="$repos_name:$repos_pvid:$repos_uuid" fi (( $rc == RC_UNKNOWN )) && rc=$RC_NOT_FOUND fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_repository()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_repository =head1 SYNOPSIS Determines if the specified disk is already in use as a repository. If so, a zero is returned, otherwise a non-zero is returned. In addition, the various identifiers for the disk are returned in the format: NAME:PVID:UUID =head1 DESCRIPTION Determines if the specified repository is configured within the cluster. =head1 ARGUMENTS 1. cand_disk [REQUIRED] [string] The label of the candidate disk that is to be identified as a repository (or not). 2. site [OPTIONAL] [string] A site label, that limits which nodes the repository is validated against. 3. disk_data [OPTIONAL] [string reference] A reference to a string in which the disk device name, PVID, and UUID will be stored/returned. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #==============================================================================  kfi2+ bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_rg#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_rg.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)47 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_rg.sh, hacmp.assist, 61haes_r714 6/10/12 15:32:47 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_rg =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:54 Last Changed: 6/10/12 15:32:47 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_rg.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_rg =head1 DESCRIPTION Determines if the specified resource group is configured within the cluster. =head1 ARGUMENTS 1. rg [REQUIRED] [string] The label of the resource group to search for within the cluster. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_rg { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_rg.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset rg=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset line= #================= : Validate input #================= if [[ -z $rg ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else print "$0()[$LINENO]($SECONDS): /usr/bin/odmget -q group=$rg HACMPgroup" >>$CLMGR_TMPLOG # Always log commands /usr/bin/odmget -q group=$rg HACMPgroup |\ while read line; do rc=$RC_SUCCESS break done (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print "odmget RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_rg()"  kh2+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_service_ip#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_service_ip.sh 1.4 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)78 1.4 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_service_ip.sh, hacmp.assist, 61haes_r714, 1439A_hacmp714 8/26/14 13:54:18 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_service_ip =head1 VERSION Version Number: 1.4 Last Extracted: 9/25/14 17:45:42 Last Changed: 8/26/14 13:54:18 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_service_ip.sh, hacmp.assist, 61haes_r714, 1439A_hacmp714 =head1 SYNOPSIS KLIB_HACMP_is_known_service_ip =head1 DESCRIPTION Determines if the specified service IP is configured within the cluster. =head1 ARGUMENTS 1: service_ip [REQUIRED] [string] The service IP to search for within the cluster. 2: LABEL [OPTIONAL] [string reference] A return vehicle for returning the network name for the service IP that was passed in. If the network name was already passed in, then LABEL should be identical to it. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. #============================================================================ # # Name: KLIB_HACMP_is_known_service_ip # # Description: This is the main, FPATH function that is invoked by clmgr # to confirm that the provided input represents a service # IP/label within the cluster configuration. # # Inputs: See the "devDoc()" function, above. # # Outputs: If the optional LABEL input is passed in, it will be # populated with the network name of the service IP, if # that name differs from what was passed in. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function, above, for the standard return # code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_is_known_service_ip { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_service_ip.sh, hacmp.assist, 61haes_r714, 1439A_hacmp714 : INPUTS: $* typeset service_ip=${1//\"/} integer RETURN_LABEL=0 if [[ -n ${2//\"/} ]]; then nameref LABEL=${2//\"/} LABEL="" RETURN_LABEL=1 fi [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset value= service_ip_names= service_ip_addr= LINE= typeset name= type= nw= nettype= attr= node= ipaddr= haddr= if= typeset gname= netmask= hb_addr= site= prefix= family= remainder= #====================================================== : Convert the provided service label into its network : names and aliases, as well as its IP address. #====================================================== value=$(LANG=C LC_ALL=C /usr/bin/host $service_ip) service_ip_addr=${value%%,*} service_ip_addr=${service_ip_addr##*+([[:space:]])} service_ip_names=${value##*:} service_ip_names=${service_ip_names//,/} #================= : Validate input #================= if [[ -z $service_ip ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else print -- "$0()[$LINENO]($SECONDS): $HAUTILS/cllsif -cS" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/cllsif -cS |\ while read LINE; do : Handle possible IPv6 address typeset IPv6= if [[ $LINE == *\[* ]]; then IPv6=${LINE##*\[} IPv6=${IPv6%%\]*} LINE=${LINE/\[$IPv6\]/[${IPv6//:/_}]} fi print -- "$LINE" | IFS=: read name type nw nettype attr node ipaddr haddr if gname netmask hb_addr site prefix family remainder : Handle possible IPv6 address ipaddr=${ipaddr//_/:} ipaddr=${ipaddr/\[/} ipaddr=${ipaddr/\]/} [[ $type != "service" ]] && continue for value in $service_ip $service_ip_addr $service_ip_names; do if [[ $value == @($name|$ipaddr) ]]; then rc=$RC_SUCCESS (( RETURN_LABEL )) && LABEL=$name break fi done (( rc == $RC_SUCCESS )) && break done (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print "cllsif RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_service_ip()" 3: som k2+7bbb&7 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_sitece_ip#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_site.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)09 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_site.sh, hacmp.assist, 61haes_r714 6/10/12 15:32:49 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_site =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:57 Last Changed: 6/10/12 15:32:49 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_site.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_site =head1 DESCRIPTION Determines if the specified site is configured within the cluster. =head1 ARGUMENTS 1. site [REQUIRED] [string] The label of the site that is to be searched for within the cluster. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_site { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_site.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset site=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset line= id= #================= : Validate input #================= if [[ -z $site ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else if [[ $site == +([[:digit:]]) ]] && (( ${#site} > 10 )); then id=${site:10} print "$0()[$LINENO]($SECONDS): /usr/bin/odmget -q id=$id HACMPsite" >>$CLMGR_TMPLOG # Always log commands /usr/bin/odmget -q id=$id HACMPsite |\ while read line; do rc=$RC_SUCCESS if [[ $line == *([[:space:]])name\ =\ * ]]; then line=${line##* = \"} site=${line%\"} break fi done else print "$0()[$LINENO]($SECONDS): /usr/bin/odmget -q name=$site HACMPsite" >>$CLMGR_TMPLOG # Always log commands /usr/bin/odmget -q name=$site HACMPsite |\ while read line; do rc=$RC_SUCCESS break done fi (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print "odmget RC: $rc" >>$CLMGR_TMPLOG # Always log command result print -- "$site" fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_site()" e kn2+ bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_snapshotp#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2019,2020,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_snapshot.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_snapshot.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_snapshot =head1 SYNOPSIS KLIB_HACMP_is_known_snapshot =head1 DESCRIPTION Determines if the specified snapshot exists on the local node. =head1 ARGUMENTS 1. snapshot [REQUIRED] [string] The name of the snapshot to search for on this node. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_snapshot { . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_snapshot.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset snapshot=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -A list typeset name= #================= : Validate input #================= if [[ -z $snapshot ]]; then dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else # Smit is not able to parse snapshot name when name has colon, # hence escaping : with readable characters. if [[ $CLMGR_GUI == "SMIT" ]];then snapshot=$(echo $snapshot | sed 's/:/#!:/g') fi print -- "$0()[$LINENO]($SECONDS): clsnapshot -l" >>$CLMGR_TMPLOG # Always log commands clsnapshot -l |\ while read name; do [[ $name == *([[:space:]])\#* ]] && continue if [[ -n $name ]]; then name=${name##+([[:space:]])} name=${name%%+([[:space:]])} if [[ "$name" == "$snapshot" ]]; then rc=$RC_SUCCESS break fi fi done (( $rc != RC_SUCCESS )) && rc=$RC_ERROR fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_snapshot()"  k02+]bbb&] # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_storage_agentees#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_storage_agent.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)06 1.3 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_storage_agent.sh, hacmp.assist, 61haes_r714 8/14/12 13:38:18 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_storage_agent =head1 VERSION Version Number: 1.3 Last Extracted: 1/31/14 04:41:47 Last Changed: 8/14/12 13:38:18 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_storage_agent.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_storage_agent =head1 DESCRIPTION Determines if the specified storage agent is configured within the cluster. =head1 ARGUMENTS 1. storage_agent [REQUIRED] [string] The name of the storage agent to search for on this node. 2. TYPE [OPTIONAL] [reference] A string reference which can be used to return the discovered type of the specified storage agent. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_storage_agent { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_storage_agent.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset storage_agent=${1//\"/} [[ -n $2 ]] && typeset -n TYPE=${2//\"/} TYPE="" [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -A list typeset LINE="" name="" rest="" #================= : Validate input #================= if [[ -z $storage_agent ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else print -- "$0()[$LINENO]($SECONDS): $HAXDWIZ/clxd_list_sa_director -d\"|\" -h $storage_agent" >>$CLMGR_TMPLOG # Always log commands $HAXDWIZ/clxd_list_sa_director -d"|" -h $storage_agent 2>/dev/null |\ while read LINE; do if [[ -n $LINE ]]; then print -- "$LINE" | IFS=\| read name TYPE rest if [[ $name == $storage_agent ]]; then rc=$RC_SUCCESS break else TYPE="" fi fi done (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print "$0()[$LINENO]($SECONDS): odmget RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_storage_agent()" ue= k`2+Ubbb&U # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_storage_systemes#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2018,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_storage_system.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # # @(#) 5f56dbd 43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_storage_system.sh, 726, 2147A_aha726, Mar 08 2021 04:44 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_storage_system =head1 SYNOPSIS KLIB_HACMP_is_known_storage_system =head1 DESCRIPTION Determines if the specified storage system is configured within the cluster. =head1 ARGUMENTS 1. storage_system [REQUIRED] [string] The name of the storage system to search for on this node. 2. TYPE [OPTIONAL] [reference] A string reference which can be used to return the discovered type of the specified storage system. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_storage_system { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 5f56dbd 43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_storage_system.sh, 726, 2147A_aha726, Mar 08 2021 04:44 PM : INPUTS: $* typeset storage_system=${1//\"/} [[ -n $2 ]] && typeset -n TYPE=${2//\"/} TYPE="" [[ -n $3 ]] && typeset -n BACKUP_PROFILE=${3//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -A list typeset LINE="" name="" rest="" #================= : Validate input #================= if [[ -z $storage_system ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else if [[ -n $BACKUP_PROFILE ]]; then # Check Storage System exist in backup management XML file output=$(LANG=C cl_cbm_list_storage_profile "$storage_system" 2>>$CLMGR_TMPLOG) if [[ -n $output ]]; then rc=$RC_SUCCESS fi storage_type=$(echo "$output" | grep -w "Storage_type" | cut -f 2 -d '=') storage_type=${storage_type// /} # removes space TYPE=$storage_type BACKUP_PROFILE="Enable" else isEnterprise if (( $? == 1 ));then print -- "$0()[$LINENO]($SECONDS): $HAXDWIZ/clxd_list_ss_director -d\"|\" -h $storage_system" >>$CLMGR_TMPLOG # Always log commands $HAXDWIZ/clxd_list_ss_director -d"|" -h $storage_system 2>>$CLMGR_TMPLOG |\ while read LINE; do if [[ -n $LINE ]]; then print -- "$LINE" | IFS=\| read name TYPE rest if [[ $name == $storage_system ]]; then rc=$RC_SUCCESS break else TYPE="" fi fi done fi fi (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print "$0()[$LINENO]($SECONDS): odmget RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_storage_system()" B_H k02+ bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_tapege_sys#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_tape.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)46 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_tape.sh, hacmp.assist, 61haes_r714 6/10/12 15:32:53 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_tape =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:54 Last Changed: 6/10/12 15:32:53 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_tape.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_tape =head1 DESCRIPTION Determines if the specified tape is configured within the cluster. =head1 ARGUMENTS 1. tape [REQUIRED] [string] The name of the tape to search for on this node. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_tape { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_tape.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset tape=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset LINE= #================= : Validate input #================= if [[ -z $tape ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else print -- "$0()[$LINENO]($SECONDS): $HAUTILS/cllstape" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/cllstape 2>/dev/null |\ while read LINE; do if [[ -n $LINE ]]; then [[ $LINE == *([[:space:]])\#* ]] && continue [[ $LINE == *+([[:space:]])* ]] && continue LINE=${LINE##+([[:space:]])} LINE=${LINE%%+([[:space:]])} if [[ $LINE == $tape ]]; then rc=$RC_SUCCESS break fi fi done (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print "odmget RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_tape()" e_prof k@2+ bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_userge_sys#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_user.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)72 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_user.sh, hacmp.assist, 61haes_r714 6/10/12 15:32:54 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_user =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:09 Last Changed: 6/10/12 15:32:54 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_user.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_user =head1 DESCRIPTION Determines if the specified user is configured within the cluster. =head1 ARGUMENTS 1. user [REQUIRED] [string] The name of the user to search for on this node. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_user { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_user.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset user=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -A list typeset LINE= #================= : Validate input #================= if [[ -z $user ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else print -- "$0()[$LINENO]($SECONDS): /usr/sbin/lsuser -a ALL" >>$CLMGR_TMPLOG # Always log commands /usr/sbin/lsuser -a ALL 2>/dev/null |\ while read LINE; do if [[ -n $LINE ]]; then [[ $LINE == *([[:space:]])\#* ]] && continue [[ $LINE == *+([[:space:]])* ]] && continue LINE=${LINE##+([[:space:]])} LINE=${LINE%%+([[:space:]])} if [[ $LINE == $user ]]; then rc=$RC_SUCCESS break fi fi done (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print "odmget RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_user()" CLMGR_ k42+#bbb&# # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_known_volume_groupmes#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_volume_group.sh 1.4 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)15 1.4 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_volume_group.sh, hacmp.assist, 61haes_r714 5/15/13 17:09:33 #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_known_volume_group =head1 VERSION Version Number: 1.4 Last Extracted: 1/31/14 04:41:35 Last Changed: 5/15/13 17:09:33 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_volume_group.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_known_volume_group =head1 DESCRIPTION Determines if the specified volume group is configured within the cluster. =head1 ARGUMENTS 1. vgname [REQUIRED] [string] The label of the volume group that is to be search for within the cluster. 2. rg [OPTIONAL] [string] A reference to use for returning the resource group for this volume group. 3. nodelist [OPTIONAL] [string] A reference to use for returning the nodes for this volume group. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_known_volume_group { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_known_volume_group.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset vgname=${1//\"/} [[ -n $2 ]] && typeset -n rg=$2 [[ -n $3 ]] && typeset -n nodelist=$3 [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset name= rem= errfile="$TMPDIR/clmgr.KHikvg.err.$$" rg= nodelist= [[ -f $errfile ]] && /usr/bin/rm -f $errfile #================= : Validate input #================= if [[ -z $vgname ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else #====================================================================== : Added a retry loop around "cl_ls_shared_vgs" after testing revealed : that it could potentially fail due to intermittent clcomd glitches. : The loop masks the user from the unfortunate consequences of clcomd. #====================================================================== typeset -i try=0 tries=5 no_data=1 cllsrc=$RESULT_UNKNOWN for (( try=0; try>$CLMGR_TMPLOG # Always log commands cl_ls_shared_vgs_DATA=$($HACSPOC/cl_ls_shared_vgs -c -C 2>>$errfile) cllsrc=$? else cllsrc=$RC_SUCCESS # Already have the data fi print "cl_ls_shared_vgs RC: $cllsrc" >>$CLMGR_TMPLOG # Always log command result if (( $cllsrc == $RC_SUCCESS )); then print -- "$cl_ls_shared_vgs_DATA" |\ while read line; do [[ $line == \#* ]] && continue name=${line%%[[:space:]]*} if [[ $name == $vgname ]]; then line=${line##${name}+([[:space:]])} nodelist=${line##*[[:space:]]} line=${line%%+([[:space:]])${nodelist}} if [[ $line != *([[:space:]]) ]]; then [[ -n $rg ]] && rg="$rg " rg="$rg$line" fi rc=$RC_SUCCESS break fi done no_data=0 break elif (( try < (tries -1) )); then if [[ $cl_ls_shared_vgs_DATA == *cl_ls_shared_vgs:* ]]; then print -- "$cl_ls_shared_vgs_DATA" >>$errfile unset cl_ls_shared_vgs_DATA break else sleep 3 fi fi done if (( no_data )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 461 "\nERROR: unable to list shared volume groups.\n\n" 1>&2 /usr/bin/cat $errfile 1>&2 rc=$RC_ERROR fi if [[ -f $errfile ]]; then /usr/bin/cat $errfile 1>&2 /usr/bin/rm -f $errfile fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_known_volume_group()" use f k2+`bbb&` # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_is_node_in_grouprou#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_node_in_group.sh 1.5 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)96 1.5 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_node_in_group.sh, hacmp.assist, 61haes_r714 6/10/12 15:32:55 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_is_node_in_group =head1 VERSION Version Number: 1.5 Last Extracted: 1/31/14 04:40:13 Last Changed: 6/10/12 15:32:55 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_node_in_group.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_is_node_in_group =head1 DESCRIPTION Determines if a node participates in the specified resource group. =head1 ARGUMENTS 1. group [REQUIRED] [string] The name of the resource group to check. 2. node [REQUIRED] [string] The node to search for within the specified resource group. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_is_node_in_group { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.5, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_is_node_in_group.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset group=${1//\"/} typeset node=${2//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset name= value= gnode= #================= : Validate input #================= if [[ -z $group ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 125 "\nERROR: no resource group label was specified.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif [[ -z $node ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 126 "\nERROR: no node label was specified.\n\n" 1>&2 rc=$RC_MISSING_INPUT else print "$0()[$LINENO]($SECONDS): /usr/bin/odmget -q group=$group HACMPgroup" >>$CLMGR_TMPLOG # Always log commands /usr/bin/odmget -q group=$group HACMPgroup |\ while IFS='=' read name value; do name=$(eval echo $name) if [[ $name == "nodes" ]]; then for gnode in $value; do gnode=$(eval echo $gnode) if [[ $gnode == $node ]]; then rc=$RC_SUCCESS break fi done fi done (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print "odmget RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_is_node_in_group()"  kP 2+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_appmonitorsrou#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_appmonitors.sh 1.7 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)75 1.7 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_appmonitors.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/10/15 15:54:01 #============================================================================ # # Name: KLIB_HACMP_list_appmonitors # # Description: This is the main, FPATH function that is invoked by clmgr # to collect application monitor names. It uses the "cllsappmon" # utility to generate the list of names unless a search is # being conducted. In the case of a search, the associated # FPATH function, KLIB_HACMP_get_appmon_attributes is invoked # in verbose mode. The resulting data set is then passed # through the "search_properties()" function to arrive at # a set of outputs that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one application monitor per # entry. The only other outputs are any error messages that # might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_appmonitors { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.7, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_appmonitors.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset item= OUTPUT= value= typeset -i index=0 matches=0 rc=$RC_UNKNOWN #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all print "$0()[$LINENO]($SECONDS): cllsappmon -c" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$(cllsappmon -c) rc=$? print "$0()[$LINENO]($SECONDS): cllsappmon RC: $rc; monitors == \"${OUTPUT//+([[:space:]])/, }\"" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR for item in $(print -- "$OUTPUT" | cut -d: -f1); do list[$index]=$item (( index++ )) done else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_appmonitor_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_appmonitors()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_appmonitors =head1 VERSION Version Number: 1.7 Last Extracted: 6/16/15 17:51:11 Last Changed: 6/10/15 15:54:01 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_appmonitors.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query application_monitor NOTE: the aliases for "application_monitor" are "am" and "mon". =head1 DESCRIPTION Displays the currently configured set of application monitors. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2006,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== O  k2+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_appserversrou#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_appservers.sh 1.7 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)91 1.7 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_appservers.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/10/15 15:58:17 #============================================================================ # # Name: KLIB_HACMP_list_appservers # # Description: This is the main, FPATH function that is invoked by clmgr # to collect application controller names. It uses the # "cllsserv" utility to generate the list of names unless a # search is being conducted. In the case of a search, the # associated FPATH function, KLIB_HACMP_get_appserver_attributes # is invoked in verbose mode. The resulting data set is then # passed through the "search_properties()" function to arrive at # a set of outputs that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one application controller # per entry. The only other outputs are any error messages that # might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_appservers { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.7, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_appservers.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset item= OUTPUT= value= typeset -i index=0 matches=0 rc=$RC_UNKNOWN #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all print "$0()[$LINENO]($SECONDS): cllsserv -c" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$(cllsserv -c 2>>$CLMGR_TMPLOG) rc=$? print "$0()[$LINENO]($SECONDS): cllsserv RC: $rc; controllers == \"${OUTPUT//+([[:space:]])/, }\"" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR for item in $(print -- "$OUTPUT" | cut -d: -f1) do list[$index]=$item (( index++ )) done else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_appserver_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_appservers()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_appservers =head1 VERSION Version Number: 1.7 Last Extracted: 6/16/15 17:51:11 Last Changed: 6/10/15 15:58:17 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_appservers.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query application NOTE: the aliases for "application" are "as" and "app". =head1 DESCRIPTION Displays the currently configured set of application servers. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2006,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #==============================================================================  kD2+,bbb&, # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_backup_filesou#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2018,2019,2020,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # @(#) 5f56dbd 43haes/lib/ksh93/hacmp/KLIB_HACMP_list_backup_files.sh, 726, 2147A_aha726, Mar 08 2021 04:44 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_backup_files =head1 SYNOPSIS clmgr query backup_files \ BUCKET_NAME= \ RG_NAME= \ [ START_TIME= ] \ [ END_TIME= ] clmgr query backup_files \ BUCKET_NAME= \ [ RG_NAME= ] \ [ START_TIME= ] \ [ END_TIME= ] clmgr query backup_files \ RG_NAME= \ [ BUCKET_NAME= ] \ [ START_TIME= ] \ [ END_TIME= ] backup_files => bf, backup_f* =head1 DESCRIPTION Displays the cloud backup files. =head1 ARGUMENTS 1. bucket_name [OPTIONAL] [String] Bucket Name to list the files in the bucket. For aws, bucket name refers to S3 bucket. 2. rg_name [OPTIONAL] [String] It is used to list the files which are specific to provided Resource Group. 3. start_time [OPTIONAL] [String] If you provide the start time it will list the files which are uploaded only after start time. 4. end_time [OPTIONAL] [String] If you provide the end time it will list the files which are uploaded from start time to end time. =cut } # End of POD-formatted documentation. function KLIB_HACMP_list_backup_files { . $HALIBROOT/log_entry "$0()" "$CL" typeset bucket_name=$1 typeset rg_name=$2 typeset start_time=$3 typeset end_time=$4 [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset available_rgs="" # To store the backup rg's typeset backup_type="" # To store the backup method, which is cloud or remote typeset cloud_rgs="" # To store the backup rgs which are configured for cloud typeset output="" typeset service="" # To store CLOUD service information typeset bOpt="" rOpt="" sOpt="" eOpt="" cOpt="" typeset configured_bucket="" # To store the bucket name which is configured for rg typeset service_list="" #==================================== : Check python is installed or not #==================================== LANG=C cl_get_python_version 2>&1 >>/dev/null rc=$? if (( $rc != 0 )); then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1315 "\nERROR: Python must be installed for using backup feature.\n\n" 1>&2 log_return_msg "$rc" "$0()" "$LINENO" return $rc fi #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY elif [[ -z $bucket_name && -z $rg_name ]] then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1202 "\nERROR: Provide resource group (RG_NAME) or bucket name (BUCKET_NAME) or both.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif [[ -z $start_time && -n $end_time ]] then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1203 "\nERROR: Provide start time with end time.\n\n" 1>&2 rc=$RC_MISSING_INPUT else print -- "$0()[$LINENO]($SECONDS): cl_cbm_list" >>$CLMGR_TMPLOG # Always log command result available_rgs=$(LANG=C cl_cbm_list 2>>$CLMGR_TMPLOG) rc=$? print -- "$0()[$LINENO]($SECONDS): cl_cbm_list RC:$rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS ));then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1197 "\nERROR: No resource group configured for backup.\n\n" 1>&2 rc=$RC_ERROR fi fi # Get the list of backup rgs which are configured for cloud storage. for rg in $available_rgs do backup_type=$(LANG=C cl_cbm_list $rg | grep -w Backup_method | cut -f2 -d'=' | sed -e 's/^ *//') if [[ $backup_type == "cloud" ]] then cloud_rgs="$cloud_rgs $rg" fi done # Validate inputs if (( rc == RC_UNKNOWN || rc == RC_SUCCESS )) then if [[ -n $rg_name ]] then : # Checking the given rg is configured for cloud backup or not : echo $cloud_rgs | grep -wq $rg_name if (( $? == 0 )) then : # If bucket name not provided then take the bucket name from the xml file where we are storing the backup configuration : output=$(LANG=C cl_cbm_list $rg_name 2>>$CLMGR_TMPLOG) service_list=$(echo "$output" | grep -w "Cloud_service" | cut -f 2 -d '=' | tr -d ' ') if [[ -z $bucket_name ]] then bucket_name=$(echo "$output" | grep -w "Bucket_name" | cut -f 2 -d '=' | tr -d ' ') else configured_bucket=$(echo "$output" | grep -w "Bucket_name" | cut -f 2 -d '=' | tr -d ' ') if [[ $bucket_name != $configured_bucket ]] then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1209 "\nERROR: The provided bucket, %1\$s, is invalid because the given resource group, %2\$s, is configured with a different bucket name, %3\$s.\n\n" "$bucket_name" "$rg_name" "$configured_bucket" 1>&2 rc=$RC_ERROR fi fi else cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1204 "\nERROR: The provided resource group, %1\$s, is not configured for cloud backup.\n\n" "$rg_name" 1>&2 cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1208 "Available resource groups which are configured for cloud are:\n\n" "$cloud_rgs" 1>&2 output=$(echo "$cloud_rgs" | tr " " "\n") print -u2 "$output" rc=$RC_INCORRECT_INPUT fi elif [[ -n $bucket_name ]] then # Get the list of rgs which are configured with provided bucket for rg in $cloud_rgs do output=$(LANG=C cl_cbm_list $rg 2>>$CLMGR_TMPLOG) configured_bucket=$(echo "$output" | grep -w "Bucket_name" | cut -f 2 -d '=' | tr -d ' ') service=$(echo "$output" | grep -w "Cloud_service" | cut -f 2 -d '=' | tr -d ' ') if [[ $bucket_name == $configured_bucket ]] then echo $service_list | grep -q $service if (( $? != 0 )) then service_list="$service_list $service" fi fi done if [[ -z $service_list ]] then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1319 "\nERROR: The provided bucket %1\$s does not exist in any of the cloud configured backup profiles.\n\n" "$bucket_name" 1>&2 fi fi # Verify whether the provided start and end times are in proper format. if [[ -n $start_time ]] then validate_time $start_time if (( $? != RC_SUCCESS )) then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1206 "\nERROR: The provided start time format is invalid.\n\n" 1>&2 cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1205 "\nERROR: Provide time in yyyy-mm-ddThh format.\n\n" 1>&2 rc=$RC_ERROR fi fi if [[ -n $end_time ]] then validate_time $end_time if (( $? != RC_SUCCESS )) then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1207 "\nERROR: The provided end time format is invalid.\n\n" 1>&2 cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1205 "\nERROR: Provide time in yyyy-mm-ddThh format.\n\n" 1>&2 rc=$RC_ERROR fi fi fi # Calling list utility if (( rc == RC_UNKNOWN || rc == RC_SUCCESS )) then [[ -n $bucket_name ]] && bOpt="-b $bucket_name" [[ -n $start_time ]] && sOpt="-s $start_time" [[ -n $end_time ]] && eOpt="-e $end_time" [[ -n $rg_name ]] && rOpt="-r $rg_name" for service in $service_list do cOpt="-c $service" print -- "$0()[$LINENO]($SECONDS): cl_cbm_cloud_utils -o query $rOpt $bOpt $sOpt $eOpt $cOpt" >>$CLMGR_TMPLOG # Always log command result LANG=C cl_cbm_cloud_utils -o query $rOpt $bOpt $sOpt $eOpt $cOpt rc=$? print -- "$0()[$LINENO]($SECONDS): cl_cbm_cloud_utils -o query $rOpt $bOpt $sOpt $eOpt $cOpt RC:$rc" >>$CLMGR_TMPLOG # Always log command result if (( rc != RC_SUCCESS )) then rc=$RC_ERROR break fi done fi log_return_msg "$rc" "$0()" "$LINENO" return $rc } # End of "KLIB_HACMP_list_backup_files()" #============================================================================== # # Name: validate_time # # Description: This function will validates whether the user provided time is # proper format or not. # # Inputs: start_time or end_time # # Outputs: None # # Returns: Zero if the provided time format is correct. # Otherwise a non-zero value is returned. # #============================================================================== function validate_time { . $HALIBROOT/log_entry "$0()" "$CL" [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset usertime="" typeset datedelimiter="" usertime=$1 if (( ${#usertime} != 13 )) then return $RC_ERROR fi # Check for 'T' in the timestamp format datedelimiter=$(echo $usertime | cut -c11) if [[ -z $datedelimiter || $datedelimiter != 'T' ]] then return $RC_ERROR fi # Extract year, month, date and time to perform validation echo "$usertime" | cut -f1 -d'T' | IFS=- read year month day time=$(echo "$usertime" | cut -f2 -d'T') if [[ -z $time || -z $day || -z $month || -z $year ]] then return $RC_ERROR fi # Check if all the data provided like day month time etc are digits or not if [[ $year != +([[:digit:]]) || $month != +([[:digit:]]) || $day != +([[:digit:]]) || $time != +([[:digit:]]) ]] then return $RC_ERROR fi } #End of "validate_time()" ed_b kl2+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_backup_profile#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2018,2019,2020,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # @(#) 5f56dbd 43haes/lib/ksh93/hacmp/KLIB_HACMP_list_backup_profile.sh, 726, 2147A_aha726, Mar 08 2021 04:44 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_backup_profile =head1 SYNOPSIS clmgr query backup_profile backup_profile => bp, backup_p, replication_profile =head1 DESCRIPTION Displays the currently configured set of resource groups for backup_profile. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. #================================================================================== # # Name: KLIB_HACMP_list_backup_profile # # Description: This is the main, FPATH function that is invoked by clmgr # to collect resource group which are configured for backup_profile. # It uses the "cl_cbm_list" utility to generate the list of # names unless a search is being conducted. # In the case of a search, the associated FPATH function, # KLIB_HACMP_get_backup_attributes is invoked in verbose mode. # The resulting data set is then passed through the # "search_properties()" function to arrive at a set of outputs # that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one resource group per # entry. The only other outputs are any error messages that # might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #================================================================================== function KLIB_HACMP_list_backup_profile { . $HALIBROOT/log_entry "$0()" "$CL" typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset item= groups= value= typeset -i index=0 matches=0 rc=$RC_UNKNOWN #==================================== : Check python is installed or not #==================================== LANG=C cl_get_python_version 2>&1 >>/dev/null rc=$? if (( $rc != 0 )); then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1315 "\nERROR: Python must be installed for using backup feature.\n\n" 1>&2 log_return_msg "$rc" "$0()" "$LINENO" return $rc fi #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all #============================================== : List the resource groups. If there are no : resource groups, cl_cbm_list returns an error. #============================================== print "$0()[$LINENO]($SECONDS): cl_cbm_list" >>$CLMGR_TMPLOG # Always log commands groups=$(LANG=C cl_cbm_list 2>>$CLMGR_TMPLOG) rc=$? print "$0()[$LINENO]($SECONDS): cl_cbm_list RC: $rc; groups == \"${groups//+([[:space:]])/, }\"" >>$CLMGR_TMPLOG # Always log command result #Display error only in case of XML parse error if (( $rc != RC_SUCCESS && $rc > 2 ));then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1197 "\nERROR: No resource group configured for backup.\n\n" 1>&2 rc=$RC_ERROR else rc=$RC_SUCCESS fi for item in $groups; do list[$index]=$item (( index++ )) done else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_backup_profile_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_backup_profile()" #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ t k,12+"bbb&" # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_codup_#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_cod.sh 1.3.1.7 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2012,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)69 1.3.1.7 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_cod.sh, hacmp.assist, 61haes_r720, 1539A_hacmp720 9/17/15 10:47:38 #============================================================================ # # Name: KLIB_HACMP_list_cod # # Description: This is the main, FPATH function that is invoked by clmgr # to collect a list of COD-enabled application controllers. # It uses the "cllsserv" utility to generate the list of names # unless a search is being conducted. In the case of a search, # the associated FPATH function, KLIB_HACMP_get_cod_attributes # is invoked in verbose mode. The resulting data set is then # passed through the "search_properties()" function to arrive # at a set of outputs that matches the provided search # parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one application controller # per entry. The only other outputs are any error messages that # might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_cod { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3.1.7, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_cod.sh, hacmp.assist, 61haes_r720, 1539A_hacmp720 : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset -i index=0 matches=0 typeset -i rc=$RC_UNKNOWN typeset name= start_script= stop_script= value= typeset use_desired= optimal_mem= optimal_cpu= optimal_pu= optimal_vp= #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all typeset ROHA_PROPERTIES= print "$0()[$LINENO]($SECONDS): cllsserv -cl" >>$CLMGR_TMPLOG # Always log commands ROHA_PROPERTIES=$(cllsserv -cl) rc=$? print "$0()[$LINENO]($SECONDS): cllsserv RC: $rc" >>$CLMGR_TMPLOG # Always log commands result if (( $rc == RC_SUCCESS )); then print -- "$ROHA_PROPERTIES" |\ while IFS=: read name start_script stop_script use_desired optimal_mem optimal_cpu optimal_pu optimal_vp rem do [[ $name == \#* ]] && continue # Skip the column headers optimal_mem=$(CL=$LINENO trim $optimal_mem) optimal_pu=$(CL=$LINENO trim $optimal_pu) if [[ $use_desired != 0 || \ $optimal_mem != +(0)\.+(0) || \ $optimal_cpu != 0 || \ $optimal_pu != +(0)\.+(0) || \ $optimal_vp != 0 ]] then list[$index]=$name (( index++ )) fi done fi (( ${#list[*]} >= 0 )) && rc=$RC_SUCCESS else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_cod_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_cod()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_cod =head1 VERSION Version Number: 1.3.1.7 Last Extracted: 9/22/15 20:16:51 Last Changed: 9/17/15 10:47:38 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_cod.sh, hacmp.assist, 61haes_r720, 1539A_hacmp720 =head1 SYNOPSIS clmgr query cod NOTE: the aliases for "cod" are "cuod", "dlpar" and "roha". =head1 DESCRIPTION Displays a simple list of the application controller names for which Resource Optimized High Availability services have been configured. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2012,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== rtie kV;2+6bbb&6 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_dependenciese#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_dependencies.sh 1.4 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)04 1.4 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_dependencies.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/10/15 16:20:10 #============================================================================ # # Name: KLIB_HACMP_list_dependencies # # Description: This is the main, FPATH function that is invoked by clmgr # to collect resource group dependency names. It uses the # "clrgdependency" utility to generate the list of names unless # a search is being conducted. In the case of a search, the # associated FPATH function, KLIB_HACMP_get_dependency_attributes # is invoked in verbose mode. The resulting data set is then # passed through the "search_properties()" function to arrive at # a set of outputs that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one dependency per entry. # The only other outputs are any error messages that might be # needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_dependencies { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_dependencies.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset -n list=$1 shift if [[ -n $2 && $2 != *=* ]]; then typeset -n id_list=$2 shift fi [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset -i INDEX=0 i=0 j=0 longest=0 rc=$RC_SUCCESS typeset -A pcdeps stopafterdeps startafterdeps typeset parent= child= dep= value= OUTPUT= #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all ## ## ACQUIRE/RELEASE ORDER ## print "$0()[$LINENO]($SECONDS): clrgorder -s | grep -v '#'" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$(clrgorder -s) print "$0()[$LINENO]($SECONDS): clrgorder RC: $?" >>$CLMGR_TMPLOG # Always log command result print -- "$OUTPUT" | grep -v '#' |\ IFS=: read sel_acq par_acq ser_rel par_rel for rg in ${par_acq//,/ }; do [[ -n $dep ]] && dep="$dep," dep="$dep$rg" done if [[ $dep != *([[:space:]]) ]]; then list[$INDEX]="$dep (ACQUIRE_IN_PARALLEL)" (( INDEX++ )) fi dep= for rg in ${sel_acq//,/ }; do [[ -n $dep ]] && dep="$dep," dep="$dep$rg" done if [[ $dep != *([[:space:]]) ]]; then list[$INDEX]="$dep (ACQUIRE_SERIALLY)" (( INDEX++ )) fi dep= for rg in ${par_rel//,/ }; do [[ -n $dep ]] && dep="$dep," dep="$dep$rg" done if [[ $dep != *([[:space:]]) ]]; then list[$INDEX]="$dep (RELEASE_IN_PARALLEL)" (( INDEX++ )) fi dep= for rg in ${ser_rel//,/ }; do [[ -n $dep ]] && dep="$dep," dep="$dep$rg" done if [[ $dep != *([[:space:]]) ]]; then list[$INDEX]="$dep (RELEASE_SERIALLY)" (( INDEX++ )) fi ## ## PARENT/CHILD ## print "$0()[$LINENO]($SECONDS): clrgdependency -t PARENT_CHILD -sl | grep -v '#'" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$(clrgdependency -t PARENT_CHILD -sl) print "$0()[$LINENO]($SECONDS): clrgdependency RC: $?" >>$CLMGR_TMPLOG # Always log command result print -- "$OUTPUT" | grep -v '#' |\ while read parent child; do if [[ -n ${pcdeps[$parent]} ]]; then pcdeps[$parent]="${pcdeps[$parent]},$child" else pcdeps[$parent]=$child fi done for parent in ${!pcdeps[*]}; do list[$INDEX]="${parent}+${pcdeps[$parent]} (PARENT_CHILD)" (( INDEX++ )) done ## ## STOP AFTER ## print "$0()[$LINENO]($SECONDS): clrgdependency -t STOP_AFTER -sl | grep -v '#'" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$(clrgdependency -t STOP_AFTER -sl) print "$0()[$LINENO]($SECONDS): clrgdependency RC: $?" >>$CLMGR_TMPLOG # Always log command result print -- "$OUTPUT" | grep -v '#' |\ while read source target; do if [[ -n ${stopafterdeps[$target]} ]]; then stopafterdeps[$target]="${stopafterdeps[$target]},$source" else stopafterdeps[$target]=$source fi done for target in ${!stopafterdeps[*]}; do list[$INDEX]="${target}+${stopafterdeps[$target]} (STOP_AFTER)" (( INDEX++ )) done ## ## START AFTER ## print "$0()[$LINENO]($SECONDS): clrgdependency -t START_AFTER -sl | grep -v '#'" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$(clrgdependency -t START_AFTER -sl) print "$0()[$LINENO]($SECONDS): clrgdependency RC: $?" >>$CLMGR_TMPLOG # Always log command result print -- "$OUTPUT" | grep -v '#' |\ while read source target; do if [[ -n ${startafterdeps[$target]} ]]; then startafterdeps[$target]="${startafterdeps[$target]},$source" else startafterdeps[$target]=$source fi done for target in ${!startafterdeps[*]}; do list[$INDEX]="${target}+${startafterdeps[$target]} (START_AFTER)" (( INDEX++ )) done ## ## SAME SITE ## print "$0()[$LINENO]($SECONDS): clrgdependency -t SITECOLLOCATION -sl | grep -v '#'" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$(clrgdependency -t SITECOLLOCATION -sl) print "$0()[$LINENO]($SECONDS): clrgdependency RC: $?" >>$CLMGR_TMPLOG # Always log command result print -- "$OUTPUT" | grep -v '#' |\ while read dep; do dep=${dep//+([[:space:]])/,} list[$INDEX]="$dep (SAME_SITE)" (( INDEX++ )) done ## ## SAME NODE ## print "$0()[$LINENO]($SECONDS): clrgdependency -t NODECOLLOCATION -sl | grep -v '#'" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$(clrgdependency -t NODECOLLOCATION -sl) print "$0()[$LINENO]($SECONDS): clrgdependency RC: $?" >>$CLMGR_TMPLOG # Always log command result print -- "$OUTPUT"| grep -v '#' |\ while read dep; do dep=${dep//+([[:space:]])/,} list[$INDEX]="$dep (SAME_NODE)" (( INDEX++ )) done ## ## DIFFERENT NODES ## print "$0()[$LINENO]($SECONDS): clrgdependency -t ANTICOLLOCATION -sl | grep -v '#'" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$(clrgdependency -t ANTICOLLOCATION -sl) print "$0()[$LINENO]($SECONDS): clrgdependency RC: $?" >>$CLMGR_TMPLOG # Always log command result print -- "$OUTPUT" | grep -v '#' |\ while IFS=: read high int low; do high=${high//+([[:space:]])/,} int=${int//+([[:space:]])/,} low=${low//+([[:space:]])/,} if [[ -n "$high$int$low" && "$high$int$low" != "::" ]]; then list[$INDEX]="${high}+${int}+${low} (DIFFERENT_NODES)" (( INDEX++ )) fi done else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_dependency_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$INDEX]=${allProperties[$key]} (( INDEX++ )) done fi fi if (( $rc == RC_SUCCESS )); then for (( i=0; i longest )) && longest=${#dep} done (( longest += 3 )) for (( i=0; i # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_dependencies =head1 VERSION Version Number: 1.4 Last Extracted: 6/16/15 17:51:12 Last Changed: 6/10/15 16:20:10 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_dependencies.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query dependency NOTE: the alias for "dependency" is "de". =head1 DESCRIPTION Displays the currently configured set of resource group dependencies. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2010,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== ( l k2+C%bbb&C% # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_events#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r721 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_events.sh 1.5 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2012,2016 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG #============================================================================ # # Name: KLIB_HACMP_list_events # # Description: This is the main, FPATH function that is invoked by clmgr # to collect event names. It uses the "cllscustom" and clodmget # utilities to generate the list of names unless a search is # being conducted. In the case of a search, the associated # FPATH function, KLIB_HACMP_get_event_attributes is invoked # in verbose mode. The resulting data set is then passed # through the "search_properties()" function to arrive at # a set of outputs that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one event per entry. The # only other outputs are any error messages that might be # needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_events { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.5, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_events.sh, hacmp.assist, 61haes_r721, 1613A_hacmp721 : INPUTS: $* typeset -n list=$1 shift if [[ -n $1 && $1 != *=* ]]; then # Not a search. Must be a type. typeset -u evtype=$1 shift fi [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== typeset -A queries typeset -u uc_attr= uc_value= typeset value= while (( $# > 0 )); do value="$1" shift if [[ $value == *=* ]]; then uc_attr=${value%%=*} if [[ $uc_attr == "TYPE" ]]; then uc_value=${value#*=} [[ -z $evtype ]] && evtype=$uc_value case $evtype in P*) evtype="PREDEFINED" ;; C*) evtype="CUSTOM" ;; A*) evtype="ALL" ;; esac value=$evtype fi queries[$uc_attr]="${value#*=}" fi done [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset LINE= OUTPUT= typeset -i index=0 matches=0 rc=$RC_UNKNOWN if (( ${#queries[*]} == 0 )) || ( (( ${#queries[*]} == 1 )) && [[ -n ${queries[TYPE]} ]] ) then # List all #======================== # CUSTOM CLUSTER EVENTS #======================== if [[ $evtype == *([[:space:]]) || $evtype == @(\*|A|C)* ]]; then print "$0()[$LINENO]($SECONDS): cllscustom -t event" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$(cllscustom -t event) rc=$? print "$0()[$LINENO]($SECONDS): cllscustom RC: $rc" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print -- "$OUTPUT" |\ while read LINE; do if [[ $LINE != *([[:space:]]) ]]; then [[ $LINE == *([[:space:]])\#* ]] && continue [[ $LINE == *+([[:space:]])* ]] && continue list[$index]=$LINE (( index++ )) fi done fi #==================== # PREDEFINED EVENTS #==================== if [[ $evtype == @(\*|A|P)* ]]; then print "$0()[$LINENO]($SECONDS): clodmget -f name -n HACMPevent" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$(clodmget -f name -n HACMPevent 2>>$CLMGR_TMPLOG) rc=$? print "$0()[$LINENO]($SECONDS): clodmget RC: $rc" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print -- "$OUTPUT" |\ while IFS=: read LINE; do if [[ $LINE != *([[:space:]]) ]]; then [[ $LINE == *([[:space:]])\#* ]] && continue [[ $LINE == *+([[:space:]])* ]] && continue list[$index]=$LINE (( index++ )) fi done fi else # Searches were provided typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_event_attributes "" allProperties TYPE=$evtype CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_events()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_events =head1 VERSION Version Number: 1.5 Last Extracted: 3/29/16 17:47:11 Last Changed: 3/21/16 11:16:51 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_events.sh, hacmp.assist, 61haes_r721, 1613A_hacmp721 =head1 SYNOPSIS clmgr query event NOTE: the alias for "event" is "ev". =head1 DESCRIPTION Displays the currently configured set of customer cluster events. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An array within which data about the queried objects can be returned to the caller. 2. evtype [OPTIONAL] [string] The type of events to list. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2012,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== NO se k=2+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_fallback_timersmes#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_fallback_timers.sh 1.4 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)79 1.4 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_fallback_timers.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/10/15 16:35:17 #============================================================================ # # Name: KLIB_HACMP_list_fallback_timers # # Description: This is the main, FPATH function that is invoked by clmgr # to collect fallback timer names. It uses the "cltimerpolicy" # utility to generate the list of names unless a search is # being conducted. In the case of a search, the associated # FPATH function, KLIB_HACMP_get_fallback_timer_attributes is # invoked in verbose mode. The resulting data set is then # passed through the "search_properties()" function to arrive # at a set of outputs that matches the provided search # parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one fallback timer per # entry. The only other outputs are any error messages that # might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_fallback_timers { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_fallback_timers.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset item= TIMERS= value= typeset -i index=0 matches=0 rc=$RC_UNKNOWN #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all print "$0()[$LINENO]($SECONDS): cltimerpolicy -a list -f list" >>$CLMGR_TMPLOG # Always log commands TIMERS=$(cltimerpolicy -a list -f list) rc=$? print "$0()[$LINENO]($SECONDS): cltimerpolicy RC: $rc; TIMERS == \"${TIMERS//+([[:space:]])/, }\"" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR for item in $TIMERS; do list[$index]=$item (( index++ )) done else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_fallback_timer_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_fallback_timers()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_fallback_timers =head1 VERSION Version Number: 1.4 Last Extracted: 6/16/15 17:51:12 Last Changed: 6/10/15 16:35:17 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_fallback_timers.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query fallback_timer NOTE: aliases for "fallback_timer" are "fa" and "timer". =head1 DESCRIPTION Displays the currently configured set of fallback timers. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2010,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== $LINE k62+B!bbb&B! # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_file_systemsrs#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r721 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_file_systems.sh 1.7 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010,2016 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_list_file_systems.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #============================================================================ # # Name: KLIB_HACMP_list_file_systems # # Description: This is the main, FPATH function that is invoked by clmgr # to collect file system names. It uses the "cl_showfs2" # utility to generate the list of names unless a search is # being conducted. In the case of a search, the associated # FPATH function, KLIB_HACMP_get_file_system_attributes is # invoked in verbose mode. The resulting data set is then # passed through the "search_properties()" function to arrive # at a set of outputs that matches the provided search # parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one file system per entry. # The only other outputs are any error messages that might # be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_file_systems { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_list_file_systems.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset line= OUTPUT= vgname= value= typeset -i index=0 matches=0 rc=$RC_SUCCESS typeset fsname= vgname= rgname= nodelist= #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all print "$0()[$LINENO]($SECONDS): LC_ALL=C cl_showfs2" >>$CLMGR_TMPLOG OUTPUT=$(LC_ALL=C cl_showfs2 2>>$CLMGR_TMPLOG) print "$0()[$LINENO]($SECONDS): cl_showfs2 RC: $?; list == \"${list[*]}\"" >>$CLMGR_TMPLOG print -- "$OUTPUT" |\ while read fsname vgname rgname nodelist; do [[ $fsname == \#* ]] && continue [[ $fsname == *([[:space:]]) ]] && continue #cl_showfs2 returns error string on stdout. #Consider only valid fs names starting with "/*" if [[ $fsname == /* ]]; then list[$index]=$fsname (( index++ )) fi done else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_file_system_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_file_systems()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_file_systems =head1 VERSION Version Number: 1.4 Last Extracted: 6/13/16 11:36:21 Last Changed: 6/10/15 16:39:49 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_file_systems.sh, hacmp.assist, 61haes_r720 =head1 SYNOPSIS clmgr query file_system NOTE: the alias for "file_system" is "fs". =head1 DESCRIPTION Constructs a list of the shared and/or concurrent logical volumes within the cluster. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2010,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== es  k2+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_filecollection#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_filecollection.sh 1.7 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)72 1.7 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_filecollection.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/10/15 16:43:11 #============================================================================ # # Name: KLIB_HACMP_list_filecollection # # Description: This is the main, FPATH function that is invoked by clmgr # to collect file collection names. It uses the "clodmget" # utility to pull data from the HACMPfilecollection ODM to # generate the list of names unless a search is being conducted. # In the case of a search, the associated FPATH function, # KLIB_HACMP_get_filecollection_attributes is invoked in # verbose mode. The resulting data set is then passed through # the "search_properties()" function to arrive at a set of # outputs that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one file collection per # entry. The only other outputs are any error messages that # might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_filecollection { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.7, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_filecollection.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset item= value= typeset -i index=0 matches=0 rc=$RC_UNKNOWN #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all for item in $(clodmget -f name -n HACMPfilecollection); do list[$index]=$item (( index++ )) done (( index > 0 )) && rc=$RC_SUCCESS else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_filecollection_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_filecollection()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_filecollection =head1 VERSION Version Number: 1.7 Last Extracted: 6/16/15 17:51:13 Last Changed: 6/10/15 16:43:11 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_filecollection.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query file_collection NOTE: the aliases for "file_collection" are "fc" and "fi". =head1 DESCRIPTION Displays the currently configured set of file collections. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2006,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== LINE k2+x!bbb&x! # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_groups#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_groups.sh 1.5 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)39 1.5 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_groups.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/10/15 16:48:21 #============================================================================ # # Name: KLIB_HACMP_list_groups # # Description: This is the main, FPATH function that is invoked by clmgr # to collect user group names. It uses the "lsgroup" utility # to generate the list of names unless a search is being # conducted. In the case of a search, the associated FPATH # function, KLIB_HACMP_get_group_attributes is invoked in # verbose mode. The resulting data set is then passed through # the "search_properties()" function to arrive at a set of # outputs that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one user group per entry. # The only other outputs are any error messages that might # be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_groups { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.5, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_groups.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset LINE= LDAP_GROUPS= LOCAL_GROUPS= value= typeset -i index=0 matches=0 rc=$RC_UNKNOWN #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all #===================== : Display all groups #===================== print "$0()[$LINENO]($SECONDS): lsgroup -R files -a ALL" >>$CLMGR_TMPLOG # Always log commands LOCAL_GROUPS=$(lsgroup -R files -a ALL 2>>$CLMGR_TMPLOG) rc=$? print "$0()[$LINENO]($SECONDS): lsgroup (files) RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR else print "$0()[$LINENO]($SECONDS): lsgroup -R LDAP -a ALL" >>$CLMGR_TMPLOG # Always log commands LDAP_GROUPS=$(lsgroup -R LDAP -a ALL 2>>$CLMGR_TMPLOG) print "$0()[$LINENO]($SECONDS): lsgroup (LDAP) RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi print -- "$LOCAL_GROUPS" |\ while read LINE; do if [[ -n $LINE ]]; then [[ $LINE == *([[:space:]])\#* ]] && continue [[ $LINE == *+([[:space:]])* ]] && continue list[$index]="$LINE (files)" (( index++ )) fi done print -- "$LDAP_GROUPS" |\ while read LINE; do if [[ -n $LINE ]]; then [[ $LINE == *([[:space:]])\#* ]] && continue [[ $LINE == *+([[:space:]])* ]] && continue list[$index]="$LINE (LDAP)" (( index++ )) fi done else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_group_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_groups()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_groups =head1 VERSION Version Number: 1.5 Last Extracted: 6/16/15 17:51:13 Last Changed: 6/10/15 16:48:21 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_groups.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query group NOTE: the alias for "group" is "gp". =head1 DESCRIPTION Displays the current set of AIX groups. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2011,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #==============================================================================  kn2+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_hmcss#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_hmcs.sh 1.3.1.6 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2012,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)68 1.3.1.6 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_hmcs.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/10/15 16:51:54 #============================================================================ # # Name: KLIB_HACMP_list_hmcs # # Description: This is the main, FPATH function that is invoked by clmgr # to collect HMC names. It uses the "cllshmc" utility to # generate the list of names unless a search is being # conducted. In the case of a search, the associated FPATH # function, KLIB_HACMP_get_hmc_attributes is invoked in # verbose mode. The resulting data set is then passed through # the "search_properties()" function to arrive at a set of # outputs that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one HMC per entry. The # only other outputs are any error messages that might be # needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_hmcs { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3.1.6, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_hmcs.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset -i index=0 matches=0 typeset -i rc=$RC_UNKNOWN typeset hmc= name= timeout= retry_count= retry_delay= value= #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all typeset HMC_PROPERTIES= print "$0()[$LINENO]($SECONDS): cllshmc -c" >>$CLMGR_TMPLOG HMC_PROPERTIES=$(cllshmc -c) 2>>$CLMGR_TMPLOG rc=$? print "$0()[$LINENO]($SECONDS): cllshmc RC: $rc" >>$CLMGR_TMPLOG if (( $rc == RC_SUCCESS )); then print -- "$HMC_PROPERTIES" |\ while IFS=: read hmclabel timeout retry_count retry_delay rem do [[ $hmclabel == \#* ]] && continue # Skip the column headers list[$index]=$hmclabel (( index++ )) done else rc=$RC_ERROR fi else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_hmc_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_hmcs()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_hmcs =head1 VERSION Version Number: 1.3.1.6 Last Extracted: 6/16/15 17:51:13 Last Changed: 6/10/15 16:51:54 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_hmcs.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query hmc =head1 DESCRIPTION Displays the currently configured set of HMCs. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2012,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== pese kv2+9bbb&9 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_hosts#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_list_hosts.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #============================================================================ # # Name: KLIB_HACMP_list_hosts # # Description: This is the main, FPATH function that is invoked by clmgr # to list host names from within the cluster. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one host per entry. The # only other outputs are any error messages that might be # needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_hosts { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset -l TYPE="" typeset item= hosts= value= typeset -i index=0 matches=0 rc=$RC_UNKNOWN while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase if [[ $attr == "TYPE" ]];then TYPE="${value#*=}" shift continue fi queries[$attr]="${value#*=}" fi shift done #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all if [[ -n $TYPE ]] then CL=$LINENO verify_in_set TYPE "$TYPE" "CAA CANDIDATES POTENTIAL SMIT" TYPE fi if (( $? == RC_SUCCESS )); then case $TYPE in caa) print "$0()[$LINENO]($SECONDS): lscluster -m | grep \"Node name:\"" >>$CLMGR_TMPLOG hosts=$(LC_ALL=C lscluster -m | grep "Node name:") rc=$? print "$0()[$LINENO]($SECONDS): lscluster -m | grep \"Node name:\" RC == $rc ($hosts)" >>$CLMGR_TMPLOG print -- "$hosts" |\ while read item do list[$index]=${item#*: } (( index++ )) done ;; @(candidates|potential|smit)) list_candidates $TYPE rc=$? ;; *) CL=$LINENO isClusterDefined if (( $? == RC_SUCCESS )); then print "$0()[$LINENO]($SECONDS): clnodename" >>$CLMGR_TMPLOG # Always log commands hosts=$(clodmget -q "object=COMMUNICATION_PATH" -n -f value HACMPnode) rc=$? print "$0()[$LINENO]($SECONDS): clnodename RC: $rc; hosts == \"${hosts//+([[:space:]])/, }\"" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR for item in $hosts; do list[$index]=$item (( index++ )) done fi ;; esac else rc=$RC_INCORRECT_INPUT fi else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_host_attributes allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != HOSTNAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_hosts()" #============================================================================ # # Name: KLIB_HACMP_list_candidates # # Description: This is a helper function that lists -potential- hosts # for the cluster. This is done by finding the intersection # between /etc/hosts and /etc/cluster/rhosts, and filtering # out addresses that are already known to be in use in the # cluster. # # Inputs: See the "TYPE" description in the "devDoc()" function, below. # # Outputs: The results are displayed directly on STDOUT. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function list_candidates { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : INPUTS: $* typeset -l TYPE=$1 # : The communication path for a new node cannot : be the communication path for an existing node, : or an interface on any existing node. Concatenate : existing values into a string to use with egrep # current_paths=$(clodmget -q 'object = COMMUNICATION_PATH' -f value -n HACMPnode | paste -s -d'|' -) current_ips=$(clodmget -f identifier -n HACMPadapter | paste -s -d'|' -) if [[ -n $current_ips ]] then current_paths=${current_paths:+$current_paths\|}$current_ips fi host $(hostname) | read localname is localip rest if [[ "|$current_paths|" != *\|$localname\|* ]]; then current_paths=${current_paths:+$current_paths\|}$localname fi if [[ "|$current_paths|" != *\|$localip\|* ]]; then current_paths=${current_paths:+$current_paths\|}$localip fi # : The communication path for a new node must exist in : /etc/cluster/rhosts. Since rhosts can contain IP : addresses or labels, we must form the list as follows: # rhost_paths=$(cat /etc/cluster/rhosts | while read i; do [[ -z $i ]] && continue host $i 2>/dev/null | sed 's/,//' | read ip is label rest [[ -n $ip ]] && echo "$ip#$label" done | paste -s -d'|' -) # : And finally gather everything in /etc/hosts # etchosts_paths=$(clgetinterfaces -h | cut -f3,5 -d'#' | \ grep -vw loopback | paste -s -d'|' -) if [[ $TYPE == @(candidates|smit) ]] then # # The rhosts and etc hosts entries are all formatted # into a string like label#ip|label#ip|... # : Now for the presentation: : show everything in rhosts that : is not already in the HA config # for path in ${rhost_paths//\|/ } do echo ${path%%#*} | egrep -qvw "$current_paths|loopback" && \ echo ${path#*#} | egrep -qvw "$current_paths" && \ echo $path | sed 's/\(.*\)#\(.*\)/\1 (\2)/' done if [[ $TYPE == "smit" ]] then # : In case the above code did not produce the expected results, : give some clues by displaying "potential" entries below. : This should provide the same output as the SMIT panel pick list. # print " # $(dspmsg -s 40 cluster.cat 201 "# Don't see what you are looking for ?\n") # $(dspmsg -s 40 cluster.cat 202 "# To add a node, you must first create entries in\n# /etc/hosts and /etc/cluster/rhosts.\n") #" # : Show the potential entries in comments, where "potential" means the : entries are defined in /etc/hosts, but not /etc/cluster/rhosts, and : are not already known to the cluster. # integer banner=1 typeset rhosts_egrep=${rhost_paths//#/'|'} for entry in ${etchosts_paths//\|/ } do if echo ${entry%%#*} | egrep -qvw "$rhosts_egrep" && \ echo ${entry#*#} | egrep -qvw "$rhosts_egrep" && \ echo ${entry%%#*} | egrep -qvw "$current_paths" && \ echo ${entry#*#} | egrep -qvw "$current_paths" then if (( banner )) then dspmsg -s 40 cluster.cat 203 "# The following entries in /etc/hosts do not exist\n# in /etc/cluster/rhosts:\n#\n" banner=0 fi echo "# $(echo $entry | sed 's/\(.*\)#\(.*\)/\1 (\2)/')" fi done fi elif [[ $TYPE == "potential" ]] then # : For "POTENTIAL" hosts, we are looking for entries that are : defined in /etc/hosts, but not /etc/cluster/rhosts. # typeset rhosts_egrep=${rhost_paths//#/'|'} for entry in ${etchosts_paths//\|/ } do if echo ${entry%%#*} | egrep -qvw "$rhosts_egrep" && \ echo ${entry#*#} | egrep -qvw "$rhosts_egrep" && \ echo ${entry%%#*} | egrep -qvw "$current_paths" && \ echo ${entry#*#} | egrep -qvw "$current_paths" then echo $entry | sed 's/\(.*\)#\(.*\)/\1 (\2)/' fi done fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "list_candidates()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_hosts =head1 SYNOPSIS clmgr query node NOTE: the alias for "node" is "no". =head1 DESCRIPTION Displays the currently configured set of hosts. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. 2. TYPE [OPTIONAL] [set] An optional indicator of what type of hosts to list. By default, the communication paths from the cluster are listed. But the following types will change the output: * "CAA" Lists the CAA host members. * "CANDIDATES" Lists the entries that are common to /etc/hosts and /etc/cluster/rhosts, but are not already in use in the cluster. * "POTENTIAL" Lists the entries that are defined in /etc/hosts, but not in /etc/cluster/rhosts, and are not already in use in the cluster. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2006,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== e khS2+:!bbb&:! # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_interfacesion#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_interfaces.sh 1.8 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)98 1.8 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_interfaces.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/10/15 16:59:19 #============================================================================ # # Name: KLIB_HACMP_list_interfaces # # Description: This is the main, FPATH function that is invoked by clmgr # to collect interface names. It uses the "cllsif" utility to # generate the list of names unless a search is being conducted. # In the case of a search, the associated FPATH function, # KLIB_HACMP_get_interface_attributes is invoked in verbose # mode. The resulting data set is then passed through the # "search_properties()" function to arrive at a set of outputs # that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one interface per entry. # The only other outputs are any error messages that might # be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_interfaces { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.8, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_interfaces.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset line= value= OUTPUT= item= typeset -i index=0 matches=0 rc=$RC_UNKNOWN already_found=0 i=0 #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all print "$0()[$LINENO]($SECONDS): cllsif -pcS" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$(cllsif -pcS) rc=$? print "$0()[$LINENO]($SECONDS): cllsif RC: $rc; interfaces == \"${OUTPUT//+([[:space:]])/, }\"" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print -- "$OUTPUT" |\ while read line do : Re-initialize these variables already_found=0 item= for (( i=0; i # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_interfaces =head1 VERSION Version Number: 1.8 Last Extracted: 6/16/15 17:51:13 Last Changed: 6/10/15 16:59:19 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_interfaces.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query interface NOTE: the aliases for "interface" are "in" and "if". =head1 DESCRIPTION Displays the currently configured set of interfaces. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2006,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== "" all kL2+!bbb&! # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_ldap_serversn#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_ldap_servers.sh 1.4 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)13 1.4 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_ldap_servers.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/11/15 09:56:17 #============================================================================ # # Name: KLIB_HACMP_list_ldap_servers # # Description: This is the main, FPATH function that is invoked by clmgr # to collect LDAP server names. It uses the "clodmget" utility # to retrieve data from the HACMPLDAP ODM to generate the list # of LDAP server names unless a search is being conducted. # In the case of a search, the associated FPATH function, # KLIB_HACMP_get_ldap_server_attributes is invoked in verbose # mode. The resulting data set is then passed through the # "search_properties()" function to arrive at a set of # outputs that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one LDAP server per entry. # The only other outputs are any error messages that might be # needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_ldap_servers { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_ldap_servers.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset LINE= OUTPUT= value= typeset -i index=0 matches=0 rc=$RC_UNKNOWN #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all print "$0()[$LINENO]($SECONDS): clodmget -q \"group=LDAPServer and name=ServerList\" -f value HACMPLDAP" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$(clodmget -q "group=LDAPServer and name=ServerList" -f value HACMPLDAP 2>/dev/null) rc=$? print "$0()[$LINENO]($SECONDS): clodmget RC: $rc; ldap_servers == \"${OUTPUT//+([[:space:]])/, }\"" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print -- "$OUTPUT" |\ while read LINE; do LINE=${LINE//\"/} LINE=${LINE##+([[:space:]])} LINE=${LINE%%+([[:space:]])} for SERVER in ${LINE//,/ }; do if [[ -n $SERVER ]]; then list[$index]=$SERVER (( index++ )) fi done done else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_ldap_server_attributes allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != SERVERS@(|+([0-9])) ]] && continue for NAME in ${allProperties[$key]//,/ }; do list[$index]=$NAME (( index++ )) done done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_ldap_servers()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_ldap_servers =head1 VERSION Version Number: 1.4 Last Extracted: 6/16/15 17:51:13 Last Changed: 6/11/15 09:56:17 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_ldap_servers.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query ldap_server NOTE: the alias for "ldap_server" is "ls". =head1 DESCRIPTION Displays the current set of AIX LDAP servers. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2011,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== r k C2+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_logical_volumesmes#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_logical_volumes.sh 1.5 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)92 1.5 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_logical_volumes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/11/15 10:01:12 #============================================================================ # # Name: KLIB_HACMP_list_logical_volumes # # Description: This is the main, FPATH function that is invoked by clmgr to # collect logical volume names. It uses the "cl_lsvg" utility # to generate the list of names unless a search is being # conducted. In the case of a search, the associated FPATH # function, KLIB_HACMP_get_logical_volume_attributes is invoked # in verbose mode. The resulting data set is then passed through # the "search_properties()" function to arrive at a set of # outputs that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one logical volume per entry. # The only other outputs are any error messages that might be # needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_logical_volumes { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.5, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_logical_volumes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset LV_DATA= value= typeset -i index=0 matches=0 rc=$RC_SUCCESS i=0 #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all typeset VGS= CL=$LINENO KLIB_HACMP_list_volume_groups VGS 2>>$CLMGR_TMPLOG for (( i=0; i<${#VGS[*]}; i++ )); do VG=${VGS[$i]} [[ $VG == *([[:space:]]) ]] && continue print "$0()[$LINENO]($SECONDS): LC_ALL=C cl_lsvg -l $VG" >>$CLMGR_TMPLOG LV_DATA=$(LC_ALL=C cl_lsvg -l $VG 2>>$CLMGR_TMPLOG) rc=$? print "$0()[$LINENO]($SECONDS): cl_lsvg RC: $rc" >>$CLMGR_TMPLOG (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print -- "$LV_DATA" |\ while read lvname junk; do [[ $lvname == *: || -z $lvname ]] && continue [[ $lvname == LV && $junk == NAME* ]] && continue list[$index]=$lvname (( index++ )) done # End of the LV data loop done # End of the VG loop else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_logical_volume_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_logical_volumes()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_logical_volumes =head1 VERSION Version Number: 1.5 Last Extracted: 6/16/15 17:51:14 Last Changed: 6/11/15 10:01:12 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_logical_volumes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query logical_volume NOTE: the alias for "logical_volume" is "lv". =head1 DESCRIPTION Constructs a list of the shared and/or concurrent logical volumes within the cluster. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2010,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== op k72+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_logsal#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_logs.sh 1.7 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)99 1.7 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_logs.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/11/15 10:05:33 #============================================================================ # # Name: KLIB_HACMP_list_logs # # Description: This is the main, FPATH function that is invoked by clmgr to # collect log names. It uses the "cllog" utility to generate # to generate the list of names unless a search is being # conducted. In the case of a search, the associated FPATH # function, KLIB_HACMP_get_log_attributes is invoked in # verbose mode. The resulting data set is then passed through # the "search_properties()" function to arrive at a set of # outputs that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one log per entry. The only # other outputs are any error messages that might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_logs { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.7, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_logs.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset item= OUTPUT= value= typeset -i index=0 matches=0 rc=$RC_UNKNOWN #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all print "$0()[$LINENO]($SECONDS): cllog -s" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$(VERBOSE_LOGGING="" cllog -s) rc=$? print "$0()[$LINENO]($SECONDS): cllog RC: $rc; logs == \"$OUTPUT\"" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print -- "$OUTPUT" | sort |\ while read item; do item=${item%%[[:space:]]*} list[$index]=$item (( index++ )) done else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_log_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_logs()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_logs =head1 VERSION Version Number: 1.7 Last Extracted: 6/16/15 17:51:14 Last Changed: 6/11/15 10:05:33 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_logs.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query log =head1 DESCRIPTION Displays the currently configured set of logs. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2010,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== es kN2+*bbb&* # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_methodsvolumes#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r721 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_methods.sh 1.6 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010,2016 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_list_methods.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #============================================================================ # # Name: KLIB_HACMP_list_methods # # Description: This is the main, FPATH function that is invoked by clmgr # to collect method names. It uses the "cllscustom" and "cllspgr" # utilities to generate the list of names unless a search is # being conducted. In the case of a search, the associated FPATH # function, KLIB_HACMP_get_method_attributes is invoked in verbose # mode. The resulting data set is then passed through the # "search_properties()" function to arrive at a set of outputs # that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one method per entry. # The only other outputs are any error messages that might # be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_methods { . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_list_methods.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset -n list=$1 shift [[ $1 != *=* ]] && typeset -u type=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset item= OUTPUT= value= typeset -i index=0 matches=0 rc=$RC_UNKNOWN #================= : Validate input #================= if [[ -n $type && $type != @(NO|SN|VE)* ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 '\nERROR: invalid value specified for "%1$s": %2$s\n\n' TYPE "$type" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 'Valid values: %1$s\n\n' "notify, snapshot, verify" 1>&2 rc=$RC_INCORRECT_INPUT else #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all case "$type" in NO*) if [[ -s $ODMDIR/HACMPpager ]] then print "$0()[$LINENO]($SECONDS): cllspgr" >>$CLMGR_TMPLOG # Always log commands cmd="cllspgr" OUTPUT=$(cllspgr) fi ;; SN*) if [[ -s $ODMDIR/HACMPcustom ]] then print "$0()[$LINENO]($SECONDS): cllscustom -t snapshot" >>$CLMGR_TMPLOG # Always log commands cmd="cllscustom" OUTPUT=$(cllscustom -t snapshot) fi ;; VE*) if [[ -s $ODMDIR/HACMPcustom ]] then print "$0()[$LINENO]($SECONDS): cllscustom -t verify" >>$CLMGR_TMPLOG # Always log commands cmd="cllscustom" OUTPUT=$(cllscustom -t verify) fi ;; *) if [[ -s $ODMDIR/HACMPcustom ]] then print "$0()[$LINENO]($SECONDS): cllscustom" >>$CLMGR_TMPLOG # Always log commands cmd="cllscustom/cllspgr" typeset name= rem= cllscustom -c |\ while IFS=: read name type rem; do if [[ $type == @(SN|VE)* ]]; then [[ -n $OUTPUT ]] && OUTPUT="$OUTPUT$NL" OUTPUT="$OUTPUT$name" fi done fi if [[ -s $ODMDIR/HACMPpager ]] then print "$0()[$LINENO]($SECONDS): cllspgr" >>$CLMGR_TMPLOG # Always log commands OUTPUT="$OUTPUT$NL$(cllspgr)" fi ;; esac rc=$? print "$0()[$LINENO]($SECONDS): $cmd RC: $rc; OUTPUT == \"$OUTPUT\"" >>$CLMGR_TMPLOG # Always log command result if (( $rc == RC_SUCCESS )); then print -- "$OUTPUT" |\ while read item; do [[ $item == *([[:space:]])\#* ]] && continue if [[ -n $item ]]; then list[$index]=$item (( index++ )) fi done else rc=$RC_ERROR fi else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_method_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_methods()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_methods =head1 VERSION Version Number: 1.6 Last Extracted: 5/3/16 18:53:58 Last Changed: 4/6/16 06:32:06 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_methods.sh, hacmp.assist, 61haes_r721, 1618A_hacmp721 =head1 SYNOPSIS clmgr query method \ [ TYPE={notify|snapshot|verify} ] NOTE: the alias for "method" is "me". =head1 DESCRIPTION Displays the currently configured set of cluster snspshots. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. 2. type {OPTIONAL] [string] The type of method to be queried. Valid values: {notify|snapshot|verify} =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2010,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== s[*]}; kt2+!bbb&! # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_mirror_groupss#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_mirror_groups.sh 1.7 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)58 1.7 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_mirror_groups.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/11/15 10:15:56 #============================================================================ # # Name: KLIB_HACMP_list_mirror_groups # # Description: This is the main, FPATH function that is invoked by clmgr # to collect mirror group names. It uses the XD utility, # "clxd_list_mg_director", to generate the list of names # unless a search is being conducted. In the case of a search, # the associated FPATH function, # KLIB_HACMP_get_mirror_group_attributes is invoked in verbose # mode. The resulting data set is then passed through the # "search_properties()" function to arrive at a set of outputs # that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one mirror group per entry. # The only other outputs are any error messages that might # be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_mirror_groups { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.7, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_mirror_groups.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi CL=$LINENO isEnterprise if (( $? != 1 )); then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 184 "\nERROR: this operation requires IBM PowerHA SystemMirror for AIX Enterprise Edition.\n\n" 1>&2 log_return_msg $RC_MISSING_DEPENDENCY $0 $LINENO return $? fi #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset LINE= value= typeset -i index=0 matches=0 rc=$RC_UNKNOWN #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all print "$0()[$LINENO]($SECONDS): $HAXDWIZ/clxd_list_mg_director -d\"|\" -h" >>$CLMGR_TMPLOG # Always log commands $HAXDWIZ/clxd_list_mg_director -d"|" -h >$TMPDIR/clmgr.KHlmg.$$ rc=$? print "$0()[$LINENO]($SECONDS): clxd_list_mg_director RC: $rc; mirror_groups == \"$OUTPUT\"" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR cat $TMPDIR/clmgr.KHlmg.$$ |\ while read LINE; do if [[ -n $LINE ]]; then [[ $LINE == *errno* ]] && break list[$index]=${LINE%%\|*} (( index++ )) fi done rm -f $TMPDIR/clmgr.KHlmg.$$ else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_mirror_group_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_mirror_groups()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_mirror_groups =head1 VERSION Version Number: 1.7 Last Extracted: 6/16/15 17:51:16 Last Changed: 6/11/15 10:15:56 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_mirror_groups.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query mirror_group NOTE: the alias for "mirror_group" is "mg". =head1 DESCRIPTION Displays the currently configured set of mirror groups. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2011,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== Pr kx2+!bbb&! # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_mirror_pairss#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_mirror_pairs.sh 1.5 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)88 1.5 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_mirror_pairs.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/11/15 10:19:34 #============================================================================ # # Name: KLIB_HACMP_list_mirror_pairs # # Description: This is the main, FPATH function that is invoked by clmgr # to collect mirror pair names. It uses the XD utility, # "clxd_list_mdp_director", to generate the list of names # unless a search is being conducted. In the case of a search, # the associated FPATH function, # KLIB_HACMP_get_mirror_pair_attributes is invoked in verbose # mode. The resulting data set is then passed through the # "search_properties()" function to arrive at a set of outputs # that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one mirror pair per entry. # The only other outputs are any error messages that might # be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_mirror_pairs { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.5, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_mirror_pairs.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi CL=$LINENO isEnterprise if (( $? != 1 )); then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 184 "\nERROR: this operation requires IBM PowerHA SystemMirror for AIX Enterprise Edition.\n\n" 1>&2 log_return_msg $RC_MISSING_DEPENDENCY $0 $LINENO return $? fi #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset LINE= OUTPUT= value= typeset -i index=0 matches=0 rc=$RC_UNKNOWN COUNT=0 #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all print "$0()[$LINENO]($SECONDS): $HAXDWIZ/clxd_list_mdp_director -s svc -d\"|\"" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$($HAXDWIZ/clxd_list_mdp_director -s svc -d"|" 2>/dev/null) rc=$? print "$0()[$LINENO]($SECONDS): clxd_list_mdp_director RC: $rc; mirror_pairs == \"$OUTPUT\"" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print -- "$OUTPUT" |\ while read LINE; do (( ++COUNT == 1 )) && continue # Skip the column header line if [[ -n $LINE ]]; then list[$index]=${LINE%%\|*} (( index++ )) fi done else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_mirror_pair_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_mirror_pairs()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_mirror_pairs =head1 VERSION Version Number: 1.5 Last Extracted: 6/16/15 17:51:16 Last Changed: 6/11/15 10:19:34 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_mirror_pairs.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query mirror_pair NOTE: the alias for "mirror_pair" is "mp". =head1 DESCRIPTION Displays the currently configured set of mirror disk pairs. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2011,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== lPrope kDn2+P!bbb&P! # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_mirror_poolss#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_mirror_pools.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2012,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)51 1.4 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_mirror_pools.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/11/15 10:58:44 #============================================================================ # # Name: KLIB_HACMP_list_mirror_pools # # Description: This is the main, FPATH function that is invoked by clmgr # to collect mirror pool names. It uses the XD utility, # "cl_lsmpvgs", to generate the list of names unless a search # is being conducted. In the case of a search, the associated # FPATH function, KLIB_HACMP_get_mirror_pool_attributes is # invoked in verbose mode. The resulting data set is then # passed through the "search_properties()" function to arrive # at a set of outputs that matches the provided search # parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one mirror pool per entry. # The only other outputs are any error messages that might # be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_mirror_pools { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_mirror_pools.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset LINE= OUTPUT= NAME= VG= REM= value= typeset -i index=0 matches=0 rc=$RC_UNKNOWN try=0 #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all for (( try=0; $try<5; try++ )); do print "$0()[$LINENO]($SECONDS): cl_lsmpvgs -p" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$(cl_lsmpvgs -p 2>/dev/null) rc=$? print "$0()[$LINENO]($SECONDS): cl_lsmpvgs RC: $rc; Mirror Pools == \"$OUTPUT\"" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR || break (( try < 4 )) && sleep 3 done if (( rc == $RC_SUCCESS )); then print -- "$OUTPUT" |\ while read LINE; do if [[ -n $LINE ]]; then [[ $LINE == *([[:space:]])\#* ]] && continue print -- "$LINE" | read NAME VG REM list[$index]="$NAME ($VG)" (( index++ )) fi done fi else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_mirror_pool_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_mirror_pools()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_mirror_pools =head1 VERSION Version Number: 1.4 Last Extracted: 6/16/15 17:51:16 Last Changed: 6/11/15 10:58:44 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_mirror_pools.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query mirror_pool NOTE: the alias for "mirror_pool" is "mp". =head1 DESCRIPTION Displays the currently configured set of mirror pools. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2012,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #==============================================================================  k2+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_networksolss#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_networks.sh 1.5 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)99 1.5 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_networks.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/11/15 15:31:04 #============================================================================ # # Name: KLIB_HACMP_list_networks # # Description: This is the main, FPATH function that is invoked by clmgr to # collect network names. It uses the "odmget" utility to pull # information from the "HACMPnetwork" ODM to generate the list # of names unless a search is being conducted. In the case of # a search, the associated FPATH function, # KLIB_HACMP_get_network_attributes is invoked in verbose mode. # The resulting data set is then passed through the # "search_properties()" function to arrive at a set of outputs # that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one network per entry. # The only other outputs are any error messages that might # be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_networks { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.5, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_networks.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset name= value= OUTPUT= typeset -i index=0 matches=0 rc=$RC_UNKNOWN #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all print "$0()[$LINENO]($SECONDS): clodmget -n -f name HACMPnetwork" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$(clodmget -n -f name HACMPnetwork) rc=$? print "$0()[$LINENO]($SECONDS): clodmget RC: $rc; networks == \"${OUTPUT//+([[:space:]])/, }\"" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR for name in $OUTPUT do list[$index]=$name (( index++ )) done else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_network_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_networks()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_networks =head1 VERSION Version Number: 1.5 Last Extracted: 6/16/15 17:51:17 Last Changed: 6/11/15 15:31:04 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_networks.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query network NOTE: the aliases for "network" are "ne" and "nw". =head1 DESCRIPTION Displays the currently configured set of networks. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2006,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== _at kp2+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_nodesk#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_nodes.sh 1.5 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)00 1.5 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_nodes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/11/15 15:34:43 #============================================================================ # # Name: KLIB_HACMP_list_nodes # # Description: This is the main, FPATH function that is invoked by clmgr # to collect node names. It uses the "clnodename" utility, # to generate the list of names unless a search is being # conducted. In the case of a search, the associated FPATH # function, KLIB_HACMP_get_node_attributes is invoked in # verbose mode. The resulting data set is then passed # through the "search_properties()" function to arrive at a # set of outputs that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one node per entry. The # only other outputs are any error messages that might be # needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_nodes { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.5, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_nodes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset item= nodes= value= typeset -i index=0 matches=0 rc=$RC_UNKNOWN #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all print "$0()[$LINENO]($SECONDS): clnodename" >>$CLMGR_TMPLOG # Always log commands nodes=$(clnodename) rc=$? print "$0()[$LINENO]($SECONDS): clnodename RC: $rc; nodes == \"${nodes//+([[:space:]])/, }\"" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR for item in $nodes; do list[$index]=$item (( index++ )) done else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_node_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_nodes()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_nodes =head1 VERSION Version Number: 1.5 Last Extracted: 6/16/15 17:51:17 Last Changed: 6/11/15 15:34:43 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_nodes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query node NOTE: the alias for "node" is "no". =head1 DESCRIPTION Displays the currently configured set of nodes. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2006,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== _V kJB2+Wbbb&W # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_novask#!/bin/ksh93 # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_list_novas.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # #============================================================================ # # Name: KLIB_HACMP_list_novas # # Description: This is the main, FPATH function that is invoked by clmgr # to collect NOVA names. It uses the "cllsnova" utility to # generate the list of names unless a search is being # conducted. In the case of a search, the associated FPATH # function, KLIB_HACMP_get_nova_attributes is invoked in # verbose mode. The resulting data set is then passed through # the "search_properties()" function to arrive at a set of # outputs that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one NOVA per entry. The # only other outputs are any error messages that might be # needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_novas { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== # Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset -i index=0 matches=0 typeset -i rc=$RC_UNKNOWN typeset nova= name= timeout= retry_count= retry_delay= value= #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all typeset NOVA_PROPERTIES= print "$0()[$LINENO]($SECONDS): cllsnova -c" >>$CLMGR_TMPLOG NOVA_PROPERTIES=$(cllsnova -c) 2>>$CLMGR_TMPLOG rc=$? print "$0()[$LINENO]($SECONDS): cllsnova RC: $rc" >>$CLMGR_TMPLOG if (( $rc == RC_SUCCESS )); then print -- "$NOVA_PROPERTIES" |\ while IFS=: read novalabel timeout retry_count retry_delay rem do [[ $novalabel == \#* ]] && continue # Skip the column headers list[$index]=$novalabel (( index++ )) done else rc=$RC_ERROR fi else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_nova_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_novas()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_novas =head1 SYNOPSIS clmgr query nova =head1 DESCRIPTION Displays the currently configured set of NovaLinks. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== e kJm2+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_persistent_ips#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_persistent_ip.sh 1.4 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)26 1.4 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_persistent_ip.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/11/15 15:39:28 #============================================================================ # # Name: KLIB_HACMP_list_persistent_ip # # Description: This is the main, FPATH function that is invoked by clmgr # to collect persistent IPs. It uses the "cllsif" utility, # to generate the list of names unless a search is being # conducted. In the case of a search, the associated FPATH # function, KLIB_HACMP_get_persistent_ip_attributes is invoked # in verbose mode. The resulting data set is then passed # through the "search_properties()" function to arrive at a # set of outputs that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one persistent IP per entry. # The only other outputs are any error messages that might be # needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_persistent_ip { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_persistent_ip.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset name= value= OUTPUT= typeset -i index=0 matches=0 rc=$RC_UNKNOWN #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all print "$0()[$LINENO]($SECONDS): cllsif -pcS" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$(cllsif -pcS 2>>$CLMGR_TMPLOG) rc=$? print "$0()[$LINENO]($SECONDS): cllsif RC: $rc; interfaces == \"$OUTPUT\"" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print -- "$OUTPUT" | grep ":persistent:" |\ while IFS=: read name rem do list[$index]=$name (( index++ )) done else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_persistent_ip_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_persistent_ip()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_persistent_ip =head1 VERSION Version Number: 1.4 Last Extracted: 6/16/15 17:51:17 Last Changed: 6/11/15 15:39:28 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_persistent_ip.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query persistent_ip NOTE: the alias for "persistent_ip" is "pe". =head1 DESCRIPTION Displays the currently configured set of persistent IPs. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2010,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== pe k꼎2+*bbb&* # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_physical_volumemes#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r721 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_physical_volume.sh 1.9.1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010,2016 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_list_physical_volume.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #============================================================================ # # Name: KLIB_HACMP_list_physical_volume # # Description: This is the main, FPATH function that is invoked by clmgr to # collect physical volume names for disks that are common and # unused across the given set of nodes. If a search is being # conducted, the same FPATH function is invoked, but this time # in verbose mode. The resulting data set is then passed through # the "search_properties()" function to arrive at a set of # outputs that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list hash is populated. The only other outputs # are any error messages that might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_physical_volume { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_list_physical_volume.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset -n list=$1 typeset NODES=${2//\"/} typeset -l TYPE=${3//\"/} shift 3 [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset dname= OUTPUT= indexes= value= typeset -i index=0 matches=0 rc=$RC_UNKNOWN while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase if [[ $attr == @(TYPE|NODE|NODES) ]];then shift continue fi queries[$attr]="${value#*=}" fi shift done #======================================================== # If no nodes are specified, default to the local node. # This behavior differs from the verbose listing of # physical volumes, but is now a legacy requirement. # NOTE: if the type of disk listing requested is # tiebreaker, then go ahead and default to # all nodes. #======================================================== if [[ $NODES == *([[:space:]]) ]]; then [[ $TYPE != t* ]] && NODES=$LOCAL_NODE || NODES=$(clnodename) fi if [[ $TYPE != *([[:space:]]) ]]; then if [[ $TYPE == "tb" ]]; then TYPE="tiebreaker" else CL=$LINENO verify_in_set TYPE "$TYPE" "available, all, tiebreaker" TYPE (( $? != RC_SUCCESS )) && rc=$RC_INCORRECT_INPUT fi fi if (( rc == RC_UNKNOWN )) && (( ${#queries[*]} == 0 )); then # List all typeset -A props #================================ : Retrieve the disk information #================================ CL=$LINENO KLIB_HACMP_get_physical_volume_attributes "" props "${NODES//+([[:space:]])/,}" "$TYPE" rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!props[*]}; do [[ $key != NAME* ]] && continue [[ -n $indexes ]] && indexes="$indexes$NL" indexes="$indexes${key##+([[:alpha:]])}" done indexes=$(print -- "$indexes" | sort -n -u) if [[ -n $indexes ]]; then for index in $indexes; do [[ -n $OUTPUT ]] && OUTPUT="$OUTPUT$NL" OUTPUT="$OUTPUT${props[NAME$index]}:${props[PVID$index]}" [[ $CLMGR_GUI == "SMUI" ]] && OUTPUT="$OUTPUT:${props[SIZE$index]}" done else [[ -n $OUTPUT ]] && OUTPUT="$OUTPUT$NL" OUTPUT="${OUTPUT}${props[NAME]}:${props[PVID]}" [[ $CLMGR_GUI == "SMUI" ]] && OUTPUT="$OUTPUT:${props[SIZE]}" fi else rc=$RC_ERROR fi if (( rc == RC_SUCCESS )); then index=0 print -- "$OUTPUT" | sort |\ while IFS=: read dname pvid size rem; do [[ -z $dname || -z $pvid ]] && continue if [[ $CLMGR_GUI == "SMUI" && $size == +([0-9]) ]] then list[$index]="$dname ($pvid) [$size]" else list[$index]="$dname ($pvid)" fi (( index++ )) done fi elif (( rc == RC_UNKNOWN )); then # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_physical_volume_attributes "" allProperties "${NODES//+([[:space:]])/,}" "$TYPE" CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_physical_volume()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_physical_volume =head1 VERSION Version Number: 1.9.1.2 Last Extracted: 5/3/16 18:54:04 Last Changed: 4/6/16 06:57:04 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_physical_volume.sh, hacmp.assist, 61haes_r721, 1618A_hacmp721 =head1 SYNOPSIS clmgr query physical_volume \ [ NODES=,[,,...] ] \ [ TYPE={available|all|tiebreaker} ] NOTE: "node" may be either a node name, or a network- resolvable name (i.e. hostname or IP address). NOTE: the alias for "physical_volume" is "pv". =head1 DESCRIPTION Displays the physical volumes for the specified node(s). If no nodes are specified, defaults to the local node. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. 2. NODES [OPTIONAL] string A list of nodes/hosts to query. Defaults to all defined nodes, if not provided. 3. TYPE [OPTIONAL] [set] The type of disks to list, from the set: available (only unused disks are listed) all (lists disks even if they are currently in use) tiebreaker (disks that are suitable for tiebreaker usage) =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2010,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== TH  kM2+x/bbb&x/ # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_repositoriesme#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_repositories.sh 1.13 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2012,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)18 1.13 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_repositories.sh, hacmp.assist, 61haes_r720, 1531B_hacmp720 7/29/15 10:54:43 #============================================================================ # # Name: KLIB_HACMP_list_repositories # # Description: This is the main, FPATH function that is invoked by clmgr to # collect repository names and PVIDs. It uses the "clodmget" # utility to read data from the "HACMPsircol" ODM to generate # the list of names unless a search is being conducted. In the # case of a search, the associated FPATH function, # KLIB_HACMP_get_repository_attributes is invoked in verbose # mode. The resulting data set is then passed through the # "search_properties()" function to arrive at a set of outputs # that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one repository per entry, # with the active repository first, followed by any backup # repositories. The format of each repository entry is # " ()". The only other outputs are any # error messages that might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_repositories { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.13, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_repositories.sh, hacmp.assist, 61haes_r720, 1531B_hacmp720 : INPUTS: $* typeset -n list=$1 shift typeset -i RETURN_NODES=0 if [[ -n $1 && $1 != *=* ]]; then typeset -n NODE_MAP=$1 shift RETURN_NODES=1 fi [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset -i index=0 rc=$RC_UNKNOWN count=0 typeset REPOSITORIES= value= typeset disk= DISK_DATA= BACKUPS= NODES= SITE= REQ_SITE="" typeset DISK_NAME= DISK_PVID= DISK_UUID= REFNODE= REM= #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase if [[ $attr == "SITE" ]]; then REQ_SITE=${value#*=} else queries[$attr]="${value#*=}" fi fi shift done if (( ${#queries[*]} == 0 )); then # List all if [[ $CLUSTER_TYPE == "LC" ]]; then for SITE in $(clodmget -n -f name HACMPsite); do [[ -n $REQ_SITE && $REQ_SITE != $SITE ]] && continue NODES=$(clodmget -n -f nodelist -q name=$SITE HACMPsite) NODES=${NODES//+([[:space:]])/ } : Retrieve the name of the active repository disk for $SITE for disk in $(clodmget -n -f repository -q name="${SITE}_sircol" HACMPsircol); do if [[ " $NODES " == *\ $LOCAL_NODE\ * ]]; then lspv | grep -w $disk | read DISK_DATA junk elif [[ -n $NODES ]]; then $CLRSH ${NODES%% *} "/usr/sbin/lspv | /usr/bin/grep -w $disk" | read DISK_DATA junk fi if [[ -n $DISK_DATA ]]; then REPOSITORIES[$count]="_$disk:$DISK_DATA:$NODES:$SITE" (( count++ )) fi done : Retrieve the names of any backup repository disks for $SITE BACKUPS=$(clodmget -n -f backup_repository -q name="${SITE}_sircol" HACMPsircol) for disk in ${BACKUPS//,/ }; do if [[ " $NODES " == *\ $LOCAL_NODE\ * ]]; then lspv | grep -w $disk | read DISK_DATA junk elif [[ -n $NODES ]]; then $CLRSH ${NODES%% *} "/usr/sbin/lspv | /usr/bin/grep -w $disk" | read DISK_DATA junk fi if [[ -n $DISK_DATA ]]; then REPOSITORIES[$count]="_$disk:$DISK_DATA:$NODES:$SITE" (( count++ )) fi done [[ -n $REQ_SITE ]] && break done else NODES=$(clnodename) NODES=${NODES//+([[:space:]])/ } : Retrieve the name of the active repository disk for disk in $(clodmget -n -f repository HACMPsircol); do # Want to show the name of the active repository disk # as it appears on the local node lspv | grep -w $disk | read DISK_DATA junk REPOSITORIES[$count]="_$disk:$DISK_DATA:$NODES:" (( count++ )) done : Retrieve the names of any backup repository disks BACKUPS=$(clodmget -n -f backup_repository HACMPsircol) for disk in ${BACKUPS//,/ }; do lspv | grep -w $disk | read DISK_DATA junk REPOSITORIES[$count]="_$disk:$DISK_DATA:$NODES:" (( count++ )) done fi integer ridx=0 for (( ridx=0; ridx < $count; ridx++ )); do print -- "${REPOSITORIES[$ridx]}" |\ IFS=: read disk NAME NODES SITE junk disk=${disk#_} [[ $disk == *([[:space:]]) ]] && continue list[$index]="$NAME ($disk)" (( RETURN_NODES )) && NODE_MAP[_$disk]="$NODES($SITE)" (( index++ )) done if (( rc == RC_UNKNOWN )); then (( index > 0 )) && rc=$RC_SUCCESS || rc=$RC_NOT_FOUND fi else # Searches were provided typeset -A allProperties CLMGR_VERBOSE=1 CL=$LINENO KLIB_HACMP_get_repository_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue typeset NAME=${allProperties[$key]} typeset IDX=${key#NAME} typeset PVID=${allProperties[PVID$IDX]} typeset SITE=${allProperties[SITE$IDX]} if [[ $SITE == *([[:space:]]) ]]; then NODES=$(clnodename) else NODES=$(clodmget -n -f nodelist -q name=$SITE HACMPsite) fi NODES=${NODES//+([[:space:]])/ } list[$index]="$NAME ($PVID)" (( RETURN_NODES )) && NODE_MAP[_$PVID]="$NODES($SITE)" (( index++ )) done else rc=$RC_SEARCH_FAILED fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_repositories()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_repositories =head1 VERSION Version Number: 1.13 Last Extracted: 7/30/15 19:50:43 Last Changed: 7/29/15 10:54:43 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_repositories.sh, hacmp.assist, 61haes_r720, 1531B_hacmp720 =head1 SYNOPSIS clmgr query repository =head1 DESCRIPTION Displays the names of the currently configured repository disk(s). =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An array within which data about the queried objects can be returned to the caller. 2. NODE_MAP [OPTIONAL] [hash ref] An associative array that is used to return the list of nodes that the disks were found on. The key is the PVID of the disk, and the value is the node list. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2012,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #==============================================================================  kY2+i bbb&i # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_resourcegroups#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_resourcegroups.sh 1.5 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)01 1.5 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_resourcegroups.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/11/15 16:27:12 #============================================================================ # # Name: KLIB_HACMP_list_resourcegroups # # Description: This is the main, FPATH function that is invoked by clmgr # to collect resource group names. It uses the "cllsgrp" # utility to generate the list of names unless a search is # being conducted. In the case of a search, the associated # FPATH function, KLIB_HACMP_get_rg_attributes is invoked # in verbose mode. The resulting data set is then passed # through the "search_properties()" function to arrive at # a set of outputs that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one resource group per # entry. The only other outputs are any error messages that # might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_resourcegroups { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.5, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_resourcegroups.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset item= groups= value= typeset -i index=0 matches=0 rc=$RC_UNKNOWN #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all #============================================ : List the resource groups. If there are no : resource groups, cllsgrp returns an error. #============================================ print "$0()[$LINENO]($SECONDS): cllsgrp" >>$CLMGR_TMPLOG # Always log commands groups=$(cllsgrp 2>>$CLMGR_TMPLOG) rc=$? print "$0()[$LINENO]($SECONDS): cllsgrp RC: $rc; groups == \"${groups//+([[:space:]])/, }\"" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR for item in $groups; do list[$index]=$item (( index++ )) done else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_rg_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_resourcegroups()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_resourcegroups =head1 VERSION Version Number: 1.5 Last Extracted: 6/16/15 17:51:18 Last Changed: 6/11/15 16:27:12 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_resourcegroups.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query resource_group NOTE: the alias for "resource_group" is "rg". =head1 DESCRIPTION Displays the currently configured set of resource groups. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2006,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== s  kjq2+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_service_ipups#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_service_ip.sh 1.7 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)02 1.7 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_service_ip.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/11/15 16:30:46 #============================================================================ # # Name: KLIB_HACMP_list_service_ip # # Description: This is the main, FPATH function that is invoked by clmgr # to collect service IP names. It uses the "cllsif" utility # to generate the list of names unless a search is being # conducted. In the case of a search, the associated FPATH # function, KLIB_HACMP_get_service_ip_attributes is invoked # in verbose mode. The resulting data set is then passed # through the "search_properties()" function to arrive at # a set of outputs that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one service IP per entry. # The only other outputs are any error messages that might # be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_service_ip { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.7, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_service_ip.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset name= value= OUTPUT= typeset -i index=0 matches=0 rc=$RC_UNKNOWN #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all print "$0()[$LINENO]($SECONDS): cllsif -cS" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$(cllsif -cS) rc=$? print "$0()[$LINENO]($SECONDS): cllsif RC: $rc; interfaces == \"$OUTPUT\"" >>$CLMGR_TMPLOG # Always log command result (( $rc != $RC_SUCCESS )) && rc=$RC_ERROR OUTPUT=$(print -- "$OUTPUT" | grep ":service:" | cut -d: -f 1 | sort -u) for name in $OUTPUT; do list[$index]=$name (( index++ )) done else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_service_ip_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_service_ip()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_service_ip =head1 VERSION Version Number: 1.7 Last Extracted: 6/16/15 17:51:18 Last Changed: 6/11/15 16:30:46 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_service_ip.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query service_ip NOTE: the alias for "service_ip" is "se". =head1 DESCRIPTION Displays the currently configured set of service IPs. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2006,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== ttr kZ3+zbbb&z # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_sitese#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_sites.sh 1.6 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)15 1.6 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_sites.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/11/15 16:35:04 #============================================================================ # # Name: KLIB_HACMP_list_sites # # Description: This is the main, FPATH function that is invoked by clmgr # to collect site names. It uses the "cllssite" utility to # generate the list of names unless a search is being # conducted. In the case of a search, the associated FPATH # function, KLIB_HACMP_get_site_attributes is invoked in # verbose mode. The resulting data set is then passed # through the "search_properties()" function to arrive at # a set of outputs that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one site per entry. The # only other outputs are any error messages that might be # needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_sites { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.6, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_sites.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset item= OUTPUT= value= typeset -i index=0 rc=$RC_UNKNOWN matches=0 #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all print "$0()[$LINENO]($SECONDS): cllssite -c" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$(cllssite -c) rc=$? print "$0()[$LINENO]($SECONDS): cllssite RC: $rc; sites == \"${OUTPUT//+([[:space:]])/ }\"" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print -- "$OUTPUT" |\ while read item; do [[ $item == *([[:space:]])\#* ]] && continue item=${item%%:*} if [[ -n $item ]]; then list[$index]=$item (( index++ )) fi done else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_site_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_sites()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_sites =head1 VERSION Version Number: 1.6 Last Extracted: 6/16/15 17:51:18 Last Changed: 6/11/15 16:35:04 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_sites.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query site =head1 DESCRIPTION Displays the currently configured set of sites. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2010,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== allPro k83+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_smart_assists#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_smart_assists.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)04 1.3 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_smart_assists.sh, hacmp.assist, 61haes_r714 6/10/12 15:39:47 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_smart_assists =head1 VERSION Version Number: 1.3 Last Extracted: 1/31/14 04:41:56 Last Changed: 6/10/12 15:39:47 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_smart_assists.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr query smart_assist \ [ TYPE={SA|COMP|PROP} ] \ [ NODES=[,,,...]] \ [ SAID= ] \ [ COMPID= ] \ [ INSTANCEID= ] \ [ ENV="..." ] =head1 DESCRIPTION Displays the currently configured set of Smart Assists. =head1 ARGUMENTS 1. type [OPTIONAL] [String] Indicates what type of Smart Assist object is to be queried. The default is to list the available Smart Assists themselves. But if type is "COMP", then components will be listed, and if type is "PROP", then properties will be listed. 2. nodes [OPTIONAL] [String] One or more nodes to pass to clvtsa. 3. sa_id [OPTIONAL] [String] A Smart Assist identifier. 4. comp_id [OPTIONAL] [String] A component identifier. 5. inst_id [OPTIONAL] [String] An instance identifier. 6. env [OPTIONAL] [String] A misellaneous properties string to pass to clvtsa. =head1 RETURN The exit code from clvtsa is returned. =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_list_smart_assists { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_smart_assists.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset -u type=$1 typeset nodes=$2 typeset sa_id=$3 typeset comp_id=$4 typeset inst_id=$5 typeset env=$6 [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i errors=0 typeset cmd= var= #================================================================= : Some of the Smart Assists incorrectly attempt to add quotes to : their values, resulting in those quotes getting interpreted as : literal parts of the values. Not the intent. So it is safer to : remove leading/trailing quotes here, just to be safe. #================================================================= for var in type nodes sa_id comp_id inst_id env; do eval "$var=\${$var##+(\\\")}" eval "$var=\${$var%%+(\\\")}" done if [[ $type == @(C|P)* ]]; then if [[ $nodes == *([[:space:]]) ]]; then print -u2 "\nERROR: missing the \"NODES\" argument.\n" (( errors++ )) fi if [[ $sa_id == *([[:space:]]) ]]; then print -u2 "\nERROR: missing the \"SAID\" argument.\n" (( errors++ )) fi if [[ $type == P* ]]; then if [[ $comp_id == *([[:space:]]) ]]; then print -u2 "\nERROR: missing the \"COMPID\" argument.\n" (( errors++ )) fi fi fi if (( errors == 0 )); then if [[ $type == P* ]]; then print -- "$0()[$LINENO]($SECONDS): $HASABIN/clvtsa -q queryPROPs -n \"$nodes\" -s \"$sa_id\" -c \"$comp_id\" -i \"$inst_id\" -e \"$env\"" >>$CLMGR_TMPLOG # Always log commands $HASABIN/clvtsa -q queryPROPs \ -n "$nodes" \ -s "$sa_id" \ -c "$comp_id" \ -i "$inst_id" \ -e "$env" elif [[ $type == C* ]]; then print -- "$0()[$LINENO]($SECONDS): $HASABIN/clvtsa -q queryCOMPs -n \"$nodes\" -s \"$sa_id\" -e \"$env\"" >>$CLMGR_TMPLOG # Always log commands $HASABIN/clvtsa -q queryCOMPs \ -n "$nodes" \ -s "$sa_id" \ -e "$env" else print -- "$0()[$LINENO]($SECONDS): $HASABIN/clvtsa -q querySAs" >>$CLMGR_TMPLOG # Always log commands $HASABIN/clvtsa -q querySAs fi rc=$? print "clvtsa RC: $rc" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR else print -u2 rc=$RC_ERROR fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_smart_assists()" OMPID=< k3+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_snapshotssts#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2018,2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_snapshots.sh 1.4 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_list_snapshots.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #============================================================================ # # Name: KLIB_HACMP_list_snapshots # # Description: This is the main, FPATH function that is invoked by clmgr # to collect snapshot names. It uses the "clsnapshot" utility # to generate the list of names unless a search is being # conducted. In the case of a search, the associated FPATH # function, KLIB_HACMP_get_snapshot_attributes is invoked # in verbose mode. The resulting data set is then passed # through the "search_properties()" function to arrive at # a set of outputs that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one snapshot per entry. # The only other outputs are any error messages that might # be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_snapshots { . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_list_snapshots.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset item= OUTPUT= value= typeset -i index=0 matches=0 rc=$RC_UNKNOWN #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all print "$0()[$LINENO]($SECONDS): clsnapshot -l" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$(clsnapshot -l) rc=$? print "$0()[$LINENO]($SECONDS): clsnapshot RC: $rc; snapshots == \"${OUTPUT//+([[:space:]])/, }\"" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print -- "$OUTPUT" |\ while read item; do [[ $item == *([[:space:]])\#* ]] && continue if [[ -n $item ]]; then list[$index]=$item (( index++ )) fi done else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_snapshot_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_snapshots()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_snapshots =head1 SYNOPSIS clmgr list snapshot NOTE: the alias for "snapshot" is "sn". =head1 DESCRIPTION Displays the current list of cluster snspshots. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== "$OUTP kV3+!bbb&! # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_storage_agents#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_storage_agents.sh 1.4 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)71 1.4 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_storage_agents.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/11/15 16:56:20 #============================================================================ # # Name: KLIB_HACMP_list_storage_agents # # Description: This is the main, FPATH function that is invoked by clmgr # to collect storage agent names. It uses the XD utility, # "clxd_list_sa_director", to generate the list of names # unless a search is being conducted. In the case of a search, # the associated FPATH function, # KLIB_HACMP_get_storage_agent_attributes is invoked in verbose # mode. The resulting data set is then passed through the # "search_properties()" function to arrive at a set of outputs # that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one storage agent per entry. # The only other outputs are any error messages that might # be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_storage_agents { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_storage_agents.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi CL=$LINENO isEnterprise if (( $? != 1 )); then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 184 "\nERROR: this operation requires IBM PowerHA SystemMirror for AIX Enterprise Edition.\n\n" 1>&2 log_return_msg $RC_MISSING_DEPENDENCY $0 $LINENO return $? fi #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset LINE= OUTPUT= value= typeset -i index=0 matches=0 rc=$RC_UNKNOWN COUNT=0 #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all print "$0()[$LINENO]($SECONDS): $HAXDWIZ/clxd_list_sa_director -d\"|\"" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$($HAXDWIZ/clxd_list_sa_director -d"|" 2>/dev/null) rc=$? print "$0()[$LINENO]($SECONDS): clxd_list_sa_director RC: $rc; storage_agents == \"${OUTPUT//+([[:space:]])/ }\"" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print -- "$OUTPUT" |\ while read LINE; do (( ++COUNT == 1 )) && continue # Skip the column header line if [[ -n $LINE ]]; then list[$index]=${LINE%%\|*} (( index++ )) fi done else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_storage_agent_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_storage_agents()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_storage_agents =head1 VERSION Version Number: 1.4 Last Extracted: 6/16/15 17:51:18 Last Changed: 6/11/15 16:56:20 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_storage_agents.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query storage_agent NOTE: the alias for "storage_agent" is "sta". =head1 DESCRIPTION Displays the currently configured set of storage agents. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2011,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #==============================================================================  k*3+'bbb&' # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_storage_systemsmes#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2018,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_storage_systems.sh 1.5 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # # @(#) 5f56dbd 43haes/lib/ksh93/hacmp/KLIB_HACMP_list_storage_systems.sh, 726, 2147A_aha726, Mar 08 2021 04:44 PM #============================================================================ # # Name: KLIB_HACMP_list_storage_systems # # Description: This is the main, FPATH function that is invoked by clmgr # to collect storage system names. It uses the XD utility, # "clxd_list_ss_director", to generate the list of names # unless a search is being conducted. In the case of a # search, the associated FPATH function, # KLIB_HACMP_get_storage_system_attributes is invoked in # verbose mode. The resulting data set is then passed # through the "search_properties()" function to arrive at a # set of outputs that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one storage system per # entry. The only other outputs are any error messages that # might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_storage_systems { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 5f56dbd 43haes/lib/ksh93/hacmp/KLIB_HACMP_list_storage_systems.sh, 726, 2147A_aha726, Mar 08 2021 04:44 PM : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset LINE= OUTPUT= value= PROFILES= typeset -i index=0 matches=0 rc=$RC_UNKNOWN typeset -i backup=0 #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase if [[ $attr == "BACKUP" ]]; then if [[ ${value#*=} == "1" ]]; then backup=1 fi else queries[$attr]="${value#*=}" fi fi shift done if (( ${#queries[*]} == 0 )); then # List all case $backup in 1) print "$0()[$LINENO]($SECONDS): cl_cbm_list_storage_profile" >>$CLMGR_TMPLOG PROFILES=$(LANG=C cl_cbm_list_storage_profile 2>>$CLMGR_TMPLOG) rc=$? print "$0()[$LINENO]($SECONDS): cl_cbm_list_storage_profile RC: $rc; storage_systems == \"$PROFILES\"" >>$CLMGR_TMPLOG if (( $rc != RC_SUCCESS && $rc > 2 )); then rc=$RC_ERROR else rc=$RC_SUCCESS fi print -- "$PROFILES" |\ while read LINE; do if [[ -n $LINE ]]; then list[$index]=$LINE (( index++ )) fi done ;; *) CL=$LINENO isEnterprise if (( $? == 1 ));then print "$0()[$LINENO]($SECONDS): $HAXDWIZ/clxd_list_ss_director -d\"|\" -h" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$($HAXDWIZ/clxd_list_ss_director -d"|" -h 2>/dev/null) rc=$? print "$0()[$LINENO]($SECONDS): clxd_list_ss_director RC: $rc; storage_systems == \"$OUTPUT\"" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print -- "$OUTPUT" |\ while read LINE; do if [[ -n $LINE ]]; then list[$index]=${LINE%%\|*} (( index++ )) fi done fi esac else # A search was specified typeset -A allProperties if (( backup == 1 ));then CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_storage_system_attributes "" allProperties BACKUP=1 else CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_storage_system_attributes "" allProperties fi CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_storage_systems()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_storage_systems =head1 VERSION Version Number: 1.5 Last Extracted: 6/16/15 17:51:19 Last Changed: 6/11/15 16:59:20 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_storage_systems.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query storage_system clmgr query storage_system BACKUP=1 NOTE: the alias for "storage_system" is "sts". =head1 DESCRIPTION Displays the currently configured set of storage systems. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2011,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== erie kb 3+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_tapese#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_tapes.sh 1.5 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)81 1.5 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_tapes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/11/15 17:02:45 #============================================================================ # # Name: KLIB_HACMP_list_tapes # # Description: This is the main, FPATH function that is invoked by clmgr # to collect tape names. It uses the "cllstape" utility # to generate the list of names unless a search is being # conducted. In the case of a search, the associated FPATH # function, KLIB_HACMP_get_tape_attributes is invoked # in verbose mode. The resulting data set is then passed # through the "search_properties()" function to arrive at # a set of outputs that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one tape per entry. The # only other outputs are any error messages that might be # needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_tapes { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.5, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_tapes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset LINE= OUTPUT= value= typeset -i index=0 matches=0 rc=$RC_UNKNOWN #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all print "$0()[$LINENO]($SECONDS): cllstape" >>$CLMGR_TMPLOG # Always log commands OUTPUT=$(cllstape 2>>$CLMGR_TMPLOG) rc=$? print "$0()[$LINENO]($SECONDS): cllstape RC: $rc; tapes == \"${OUTPUT//+([[:space:]])/, }\"" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR print -- "$OUTPUT" |\ while read LINE; do if [[ -n $LINE ]]; then [[ $LINE == *([[:space:]])\#* ]] && continue [[ $LINE == *+([[:space:]])* ]] && continue list[$index]=$LINE (( index++ )) fi done else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_tape_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_tapes()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_tapes =head1 VERSION Version Number: 1.5 Last Extracted: 6/16/15 17:51:19 Last Changed: 6/11/15 17:02:45 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_tapes.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query tape NOTE: the alias for "tape" is "tp". =head1 DESCRIPTION Displays the currently configured set of tape devices. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2010,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== E= k| 3+*bbb&* # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_userse#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_users.sh 1.5 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)66 1.5 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_users.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/11/15 17:07:29 #============================================================================ # # Name: KLIB_HACMP_list_users # # Description: This is the main, FPATH function that is invoked by clmgr # to collect user names. It uses the "lsuser" utility # to generate the list of names unless a search is being # conducted. In the case of a search, the associated FPATH # function, KLIB_HACMP_get_user_attributes is invoked # in verbose mode. The resulting data set is then passed # through the "search_properties()" function to arrive at # a set of outputs that matches the provided search parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one user per entry. The # only other outputs are any error messages that might be # needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_users { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.5, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_users.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset -n list=${1//\"/} shift if [[ -n ${1//\"/} && ${1//\"/} != *=* ]]; then typeset -u type=${1//\"/} shift fi [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset LINE= LDAP_USERS= LOCAL_USERS= base= idx= value= typeset -i index=0 matches=0 rc=$RC_UNKNOWN #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all case $type in AV*) print "$0()[$LINENO]($SECONDS): cl_manageallowpasswd -V" >>$CLMGR_TMPLOG # Always log commands LOCAL_USERS=$(cl_manageallowpasswd -V 2>>$CLMGR_TMPLOG) rc=$? print "$0()[$LINENO]($SECONDS): cl_manageallowpasswd RC: $rc" >>$CLMGR_TMPLOG # Always log command result print -- "$LOCAL_USERS" |\ while read LINE; do if [[ -n $LINE ]]; then [[ $LINE == *([[:space:]])\#* ]] && continue [[ $LINE == *+([[:space:]])* ]] && continue list[$index]="$LINE" (( index++ )) fi done ;; AL*) print "$0()[$LINENO]($SECONDS): cl_manageallowpasswd -L" >>$CLMGR_TMPLOG # Always log commands LOCAL_USERS=$(cl_manageallowpasswd -L 2>>$CLMGR_TMPLOG) rc=$? print "$0()[$LINENO]($SECONDS): cl_manageallowpasswd RC: $rc" >>$CLMGR_TMPLOG # Always log command result print -- "$LOCAL_USERS" |\ while read LINE; do if [[ -n $LINE ]]; then [[ $LINE == *([[:space:]])\#* ]] && continue [[ $LINE == *+([[:space:]])* ]] && continue list[$index]="$LINE" (( index++ )) fi done ;; "") #==================== : Display all users #==================== print "$0()[$LINENO]($SECONDS): lsuser -R files -a ALL" >>$CLMGR_TMPLOG # Always log commands LOCAL_USERS=$(lsuser -R files -a ALL 2>/dev/null) rc=$? print "$0()[$LINENO]($SECONDS): lsuser (files) RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR else print "$0()[$LINENO]($SECONDS): lsuser -R LDAP -a ALL" >>$CLMGR_TMPLOG # Always log commands LDAP_USERS=$(lsuser -R LDAP -a ALL 2>/dev/null) print "$0()[$LINENO]($SECONDS): lsuser (LDAP) RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi print -- "$LOCAL_USERS" |\ while read LINE; do if [[ -n $LINE ]]; then [[ $LINE == *([[:space:]])\#* ]] && continue [[ $LINE == *+([[:space:]])* ]] && continue list[$index]="$LINE (files)" (( index++ )) fi done print -- "$LDAP_USERS" |\ while read LINE; do if [[ -n $LINE ]]; then [[ $LINE == *([[:space:]])\#* ]] && continue [[ $LINE == *+([[:space:]])* ]] && continue list[$index]="$LINE (LDAP)" (( index++ )) fi done ;; *) CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 '\nERROR: invalid value specified for "%1$s": "%2$s".\n' TYPE "$type" 1>&2 rc=$RC_INCORRECT_VALUE ;; esac else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_user_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_users()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_users [ TYPE={AVAILABLE|ALLOWED} ] =head1 VERSION Version Number: 1.5 Last Extracted: 6/16/15 17:51:19 Last Changed: 6/11/15 17:07:29 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_users.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query user NOTE: the alias for "user" is "ur". =head1 DESCRIPTION Displays the current set of AIX users. If the "TYPE" parameter is provided, then the display will include only those users who may or may not change passwords. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. 2. type [OPTIONAL] [set] Indicates which type of users to list, with respect to who is allowed to change passwords. Valid values: AVAILABLE, ALLOWED =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2011,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== e k 3+f&bbb&f& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_list_volume_groupss#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_volume_groups.sh 1.6 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)76 1.6 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_volume_groups.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 6/11/15 17:12:11 #============================================================================ # # Name: KLIB_HACMP_list_volume_groups # # Description: This is the main, FPATH function that is invoked by clmgr # to collect volume group names. It uses the "cl_ls_shared_vgs" # utility to generate the list of names unless a search is # being conducted. In the case of a search, the associated # FPATH function, KLIB_HACMP_get_volume_group_attributes is # invoked in verbose mode. The resulting data set is then # passed through the "search_properties()" function to arrive # at a set of outputs that matches the provided search # parameters. # # Inputs: See the "devDoc()" function at the bottom of this file. # # Outputs: The list array is populated with one volume group per entry. # The only other outputs are any error messages that might be # needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function at the bottom of this file for # the standard return code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_list_volume_groups { trap 'on_exit_listvgs' EXIT LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.6, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_volume_groups.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 : INPUTS: $* typeset -n list=$1 shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -A queries typeset -u attr= typeset line= OUTPUT= value= typeset -i index=0 matches=0 rc=$RC_UNKNOWN # Declare globally, so it is visible in the exit function errfile="$TMPDIR/clmgr.KHlvg.err.$$" # Global, for visibility in on_listvgs_exit()! #=================================================== : Check for any specified attribute=value pairs. : If any are found, use those to query the output. #=================================================== while (( $# > 0 )); do value="$1" if [[ $value == *=* ]]; then attr=${value%%=*} # "attr" makes this uppercase queries[$attr]="${value#*=}" fi shift done if (( ${#queries[*]} == 0 )); then # List all #====================================================================== : Added a retry loop around "cl_ls_shared_vgs" after testing revealed : that it could potentially fail due to intermittent clcomd glitches. : The loop masks the user from the unfortunate consequences of clcomd. #====================================================================== typeset -i try=0 tries=5 found=0 for (( try=0; try>$CLMGR_TMPLOG # Always log commands OUTPUT=$(LC_ALL=C cl_ls_shared_vgs -c -C 2>>$errfile) rc=$? print "$0()[$LINENO]($SECONDS): cl_ls_shared_vgs RC: $rc; OUTPUT == \"$OUTPUT\"" >>$CLMGR_TMPLOG # Always log command result if (( $rc == RC_SUCCESS )); then [[ $OUTPUT == *cl_ls_shared_vgs:* ]] && unset OUTPUT found=1 break elif (( try < (tries -1) )); then if [[ $OUTPUT == *cl_ls_shared_vgs:* ]]; then print -- "$OUTPUT" >>$errfile unset OUTPUT break else sleep 3 fi fi done if (( ! found )); then grep -q "cl_ls_shared_vgs: No shared volume groups were found." $errfile if (( $? == 0 )); then rc=$RC_SUCCESS else dspmsg -s $CLMGR_SET $CLMGR_MSGS 461 "\nERROR: unable to list shared volume groups.\n\n" 1>&2 cat $errfile 1>&2 rc=$RC_ERROR fi fi rm -f $errfile if (( $rc == RC_SUCCESS )); then print -- "$OUTPUT" |\ while read line; do [[ $line == \#* ]] && continue typeset item=${line%%+([[:space:]])*} [[ $item == "caavg_private" ]] && continue list[$index]=$item (( index++ )) done fi else # A search was specified typeset -A allProperties CL=$LINENO CLMGR_VERBOSE=1 KLIB_HACMP_get_volume_group_attributes "" allProperties CL=$LINENO search_properties queries allProperties rc=$? if (( $rc == RC_SUCCESS )); then for key in ${!allProperties[*]}; do [[ $key != NAME@(|+([0-9])) ]] && continue list[$index]=${allProperties[$key]} (( index++ )) done fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_list_volume_groups()" function on_exit_listvgs { if (( $rc == RC_UNKNOWN )); then if [[ -n $errfile && -f $errfile ]]; then cat $errfile 1>&2 fi exit $RC_ERROR fi [[ -n $errfile && -f $errfile ]] && rm -f $errfile } # End of "on_exit_listvgs()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_list_volume_groups =head1 VERSION Version Number: 1.6 Last Extracted: 6/16/15 17:51:19 Last Changed: 6/11/15 17:12:11 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_list_volume_groups.sh, hacmp.assist, 61haes_r720, 1525A_hacmp720 =head1 SYNOPSIS clmgr query volume_group NOTE: the alias for "volume_group" is "vg". =head1 DESCRIPTION Constructs a list of the shared and/or concurrent volume groups within the cluster. =head1 ARGUMENTS 1. list [REQUIRED] [hash ref] An associative array within which data about the queried objects can be returned to the caller. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2010,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== (  lz3+ubbb&I # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_appmonitors   =einst "$CEIMNORST[]_acdmopr/1AGL\fghlu#&()-.02:DHPUbvy{}%,;>BYw!*+34yαw-)njɿ e VpLV3VTȴyS]Ť-'L0#lV~ (VD+`P@\ ڶ*!GlT ֫p|&a7y.w:Y?0AN+'A?Y1(&=$X`X?@]p0v8"EǤ0C"EǤ0edb,"+p@ E̹bx0$qYX1 aEkBCHMvDn~renY04.afEW@ܬ](h8 Ç#fEWQΰniǑ4 Z0O8P@_ *PUii T*@[qQ$_0Q8Fm8` 8QcRͧS4Oi$VY4" sN 74(jg1xg'# ?yL{U~v6m*5/,gWIcfRf8^_'ݍY)7p?.҅ޔm|Tqr=t.H+cȟ*>{3"c96ގ^0 mȈ2^ c3?#gE4SH hHy *4>m7?9UsNyͷiAYT<[ Bx\=]1ADL'# ?09uǔ/S?.c 3~sm V33izB4VS z0gE" E" f |z#K6+\V<-'bi)`Hyg*{I"ȦAS\?ZD\Oi5h PQ1,,Ԭfgh5@ a0ǤrDAXa1~[Rۆ&`*ou~uţ L3F FѳM3F- yai iζgE#\2[p@iζgE#]Śn(Ԧ%,Lk JmBR4c8bD뢢k23׀L0!Hr" /XFpA{pAK8bD뢢k22gpAK8a Ѡɟ4pm,pAF^n?ɿrspA@^F"h&DАjThM|n)Ei0k2aȞOiaCAe_RKi)S8)U_8)U 88?4UU H7uӛۂWR1)7ぁ!圩"*).ge4QogKR&Ql >#\0͛oGxO*&ś,^=7^ Hy >^"g1O:M/Xӏl8i RP,p?6m&&EǮLG) ೡ(z&f$</ 3RP<i RPgp@jp@ӏl8/:N}׊F`6ޏz,4ś,^=7 JmBP0_zBo?9UpG 3(+n~m8y/n~mAZnqg&]ٟeM±prۮޯu+#"yX7=J>E]IT i8d4=/7\z6wv<]3?04 քMMU~ _ydNN7Y?:ec z|gvQV&pqS(ZzBm67?9UChT43Dӏpe$<AVAe=_Ri@ aXc~)G:Jf1 `9$PEBIbi,C ME 8"ȴ(gl(jni@ a i%Y DuHË6XCILQ4WQUP]Pq &8g.Yʞ)z"Ĵ1O8bQ4WQUP]Pq &#;,!8PVp $hMvFpf8; RKi)S8)U_8)U 8pvi)*!b͖eǤrDroÒ48$h4H44Q4WQUP]Pq &i0ꃏPQ57 3izB4VS z0gE" E" 9wlxC$u LCqぁ!圩"*).g9gEٟc'*iV{^&0='*ps)Uk@gEݙ"{ ayʯ“ yʯ“ǻͥ[7eY+ (+.8]3 ?4vDOyʯȟ7N /LbcƱrt3D\OhQ055BxXX/XQM(ZzBmZn~rk K496މo7ZC =0C8bD뢢k23/Xc78`i懪AfvFs{%"ED%,bdQ쉋-i(+iBNqSA5 9dQ17 ySZQHq(FrWlj͖/84CqlӜy%EuiTT &g9NFoJ4%)!<.YʞH)i0‚s=D a`c3?. {_rDA[VOͲ Ѭawwwwwwwwwwwwwwwwwwwvg1O8bAeǪ)p, V33ǝNquPYq)p6p *ˏUtS]@Y4r3D'1 `9$PEpD ap &聀\IAFpAq%I`> c3?y4wME$J#N]0 ("#M3=0 @PH.$#;,#3 <IĔdg A09Yg@zbi $e_RSqnnƅTr0‚sT<[ +4!+)v=Be3"ZY"ZIb `Ppvi)*!nEWvDFG: %2S74矜z&ぁ!圩 *g9g1tjm{vY+wwwwwwwwwwwwwwwwwwwwwwwwwwwwwfh/X ' u+*o[n1ƕDZSqnn Bp@96މ0k2a,l^gn>йj p3e:Zиn y* PcY򛏼sw4.Z L<(+:0OiaCAe_RC) 88(- Q z!XHӞ~sm4 8)U"ǖ/L7y pj7?<1Ӟ~sm蛃a.X g.Y!bn~zgB0qR K&EB,l^gn>йj"xPVt.wz砲XX/X9,_(wbZ5*PA)V<~rs/iC) 88(- Q z!ZHӧ{Sm4 8)U"ǖ/L7y p/7?<ӧ{Sm蛃a.X |< gc?Sky y! aǑH.xF<=ze)77xcBgAYйת{K z -^ƻHL2ǑH,ǑH$Pj KF~{n~{U~Ď#yS&܋ES$`hHĴkcu~r),Hwy=w2ᤦniӈ=M3^ƻHL2ǑH,ǑH$(8;4UUɷ"wϻ"b#A#BF)smq?rTUU3'#?r3'# ?4IyN /Ãۦk+A\-'ch -йBdgEݙ"xPVt.wz+,dE11ED΅TLUi𐜑qR D))nDABY3c3?#gE4SpNS qR K qR I,Alpp?ǔɿ OlUnE-+'M^ul.Jd8HxXk) H47Mefd-W"}J|D ұy)C 7>FVţ3:UŢ+şQ%2F$ # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_modify_appserver =head1 VERSION Version Number: 1.6 Last Extracted: 1/31/14 04:41:11 Last Changed: 9/27/13 17:56:03 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_appserver.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr modify application \ [ NAME= ] \ [ STARTSCRIPT="/path/to/start/script" ] \ [ STOPSCRIPT ="/path/to/stop/script" ] \ [ MONITORS={[,,...]|None} ] \ [ STARTUP_MODE={background|foreground} ] \ [ CPU_USAGE_MONITOR={yes|no} ] \ [ PROCESS_TO_MONITOR_CPU_USAGE= "/absolute/path/to/application/process" ] \ [ CPU_USAGE_MONITOR_INTERVAL="1 .. 120" ] NOTE: the aliases for "application_controller" are "ac" and "app". =head1 DESCRIPTION Attempts to modify the specified application controller to conform to the provided specifications. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the modified object can be returned to the caller. 2. appname [REQUIRED] [string] The label of the controller that is to be modified. 3. new_name [OPTIONAL] [string] The new label to attempt to apply to the specified controller. 4. startscript [OPTIONAL] [path] The full path to a new start script to be used for this controller's application (i.e. to launch it). 5. stopscript [OPTIONAL] [path] The full path to a new stop script to be used for this controller's application (i.e. to shut it down). 6. monitors [OPTIONAL] [string] A list of application monitors to use with this controller. Specify "None" to disable the monitoring for this application controller. 7. startup_mode [OPTIONAL] [boolean] Indicates if the application should be started in the background (default behavior), or in the foreground. 8. cpu_usage_monitor [OPTIONAL] [set] This attribute controls the monitoring of cpu and memory usage of an application configured in a cluster. Default value is "no" and valid values are yes and no. 9. process_to_monitor_cpu [OPTIONAL] [string] Absolute path to application process for which CPU usage shall be monitored. 10. cpu_usage_monitor_interval [OPTIONAL] [integer] Indicates the interval at which CPU usage shall be monitored for an application process. Default value is 10 minutes and valid range is 1 minute to 120 minutes. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_modify_appserver { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_appserver.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset -n properties=$1 typeset appname=${2//\"/} typeset new_name=${3//\"/} typeset startscript=${4//\"/} typeset stopscript=${5//\"/} typeset monitors=${6//\"/} monitors=${monitors//,/ } typeset startup_mode=${7//\"/} typeset cpu_usage_monitor=${8//\"/} typeset process_to_monitor_cpu=${9//\"/} typeset cpu_usage_monitor_interval=${10//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 #================================================================ : Assuming an object was specified, see if it is a known object #================================================================ if [[ $appname != *([[:space:]]) ]]; then CL=$LINENO KLIB_HACMP_is_known_appserver "$appname" (( $? != RC_SUCCESS )) && rc=$RC_NOT_FOUND fi typeset existing CL=$LINENO KLIB_HACMP_list_appservers existing 2>>$CLMGR_TMPLOG #================= : Validate input #================= if [[ -z $appname ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif (( $rc == RC_NOT_FOUND )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$appname" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 140 "Available Application Controllers:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_appservers available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" elif [[ " ${existing[*]} " == *\ $new_name\ * ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 229 "\nERROR: the specified object already exists: \"%1\$s\"\n\n" "$new_name" 1>&2 rc=$RC_INCORRECT_INPUT elif [[ -n $new_name && -n "${new_name//[a-zA-Z0-9_]/}" ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 105 "\nERROR: one or more invalid characters were detected in \"%1\$s\" (\"%2\$s\").\n\nValid characters include letters, numbers, and underscores only.\n\n" "$new_name" "${new_name//[a-zA-Z0-9_]/}" 1>&2 rc=$RC_INCORRECT_INPUT elif [[ -n $new_name && $newname == *[[:space:]]* ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 108 "\nERROR: the \"%1\$s\" attribute's value contains whitespace, which is not allowed: \"%2\$s\"\n\n" NAME "$new_name" 1>&2 rc=$RC_INCORRECT_INPUT elif (( ${#new_name} > $MAX_NAME_LENGTH )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 1463 '\nERROR: Application Controller name %1$s should not be more than %2$d characters.\n' "$new_name" "$MAX_NAME_LENGTH" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $startscript && $startscript != /* ]]; then MSG=$(dspmsg -s $CLMGR_SET $CLMGR_MSGS 106 "\nERROR: the specified path does not appear to be in absolute format:\n%1\$s\n\n" "$startscript") MSG="$MSG (STARTSCRIPT @ $LOCAL_NODE)" CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS -1 "${MSG//+([[:space:]])/ }" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $startscript && ! -e ${startscript%%+([[:space:]])*} ]]; then MSG=$(dspmsg -s $CLMGR_SET $CLMGR_MSGS 107 '\nERROR: the specified path/file does not appear to exist on "%2$s": %1$s\n\n' "$startscript" "$LOCAL_NODE") MSG="$MSG (STARTSCRIPT)" CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS -1 "${MSG//+([[:space:]])/ }" 1>&2 rc=$RC_NOT_FOUND fi if [[ -n $stopscript && $stopscript != /* ]]; then MSG=$(dspmsg -s $CLMGR_SET $CLMGR_MSGS 106 "\nERROR: the specified path does not appear to be in absolute format:\n%1\$s\n\n" "$stopscript") MSG="$MSG (STOPSCRIPT @ $LOCAL_NODE)" CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS -1 "${MSG//+([[:space:]])/ }" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $stopscript && ! -e ${stopscript%%+([[:space:]])*} ]]; then MSG=$(dspmsg -s $CLMGR_SET $CLMGR_MSGS 107 '\nERROR: the specified path/file does not appear to exist on "%2$s": %1$s\n\n' "$stopscript" "$LOCAL_NODE") MSG="$MSG (STOPSCRIPT)" CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS -1 "${MSG//+([[:space:]])/ }" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $startup_mode ]]; then case $startup_mode in @(B|b)*) startup_mode=background ;; @(F|f)*) startup_mode=foreground ;; *) dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" STARTUP_MODE "$startup_mode" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "background, foreground" 1>&2 rc=$RC_INCORRECT_INPUT ;; esac fi # Valid values of cpu_usage_monitor are yes, no. Default value is 'no'. if [[ -n $cpu_usage_monitor ]]; then case $cpu_usage_monitor in @(Y|y|T|t|1)*) cpu_usage_monitor=yes ;; @(N|n|F|f|0)*) cpu_usage_monitor=no ;; *) dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" CPU_USAGE_MONITOR "$cpu_usage_monitor" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "no, yes" 1>&2 rc=$RC_INCORRECT_INPUT ;; esac fi # process_to_monitor_cpu is a absolute path of an application process to be monitored if [[ -n $process_to_monitor_cpu ]]; then if [[ $process_to_monitor_cpu != /* ]]; then MSG=$(dspmsg -s $CLMGR_SET $CLMGR_MSGS 106 "\nERROR: the specified path does not appear to be in absolute format:\n%1\$s\n\n" "$process_to_monitor_cpu") MSG="$MSG (PROCESS_TO_MONITOR_CPU_USAGE @ $LOCAL_NODE)" CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS -1 "${MSG//+([[:space:]])/ }" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ ! -e ${process_to_monitor_cpu%%+([[:space:]])*} ]]; then MSG=$(dspmsg -s $CLMGR_SET $CLMGR_MSGS 107 '\nERROR: the specified path/file does not appear to exist on "%2$s": %1$s\n\n' "$process_to_monitor_cpu" "$LOCAL_NODE") MSG="$MSG (PROCESS_TO_MONITOR_CPU_USAGE)" CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS -1 "${MSG//+([[:space:]])/ }" 1>&2 rc=$RC_NOT_FOUND fi fi # Valid values of cpu_usage_monitor_interval is 1 minute to 120 minutes. if [[ -n $cpu_usage_monitor_interval ]]; then if [[ $cpu_usage_monitor_interval != *([[:space:]]) ]]; then if [[ $cpu_usage_monitor_interval != +([0-9]) ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 1312 'CPU usage monitor interval "%1$s" is not an integer. Provide an integer value in range of 1 minute to 120 minutes.\n' $cpu_usage_monitor_interval 1>&2 rc=$RC_INCORRECT_INPUT else CL=$LINENO verify_numeric_range "$cpu_usage_monitor_interval" 1 120 CPU_USAGE_MONITOR_INTERVAL (( $? != RC_SUCCESS )) && rc=$RC_INCORRECT_INPUT fi fi elif [[ " ${!_ENV_ARGS[*]} " == *\ CPU_USAGE_MONITOR_INTERVAL\ * ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 1313 'CPU usage monitor interval is empty. Provide an integer value in range of 1 minute to 120 minutes.\n' 1>&2 rc=$RC_INCORRECT_INPUT fi #====================================================================== : Modify the application server if no input errors have been detected #====================================================================== if (( $rc == RC_UNKNOWN )); then typeset CMD="$HAUTILS/clchserv -o$appname" [[ -z $new_name ]] && new_name=$appname # cllsserv always requires new name and old name,hence same name is passed when it is empty [[ -n $new_name ]] && CMD="$CMD -s$new_name" [[ -n $startscript ]] && CMD="$CMD -b'$startscript'" [[ -n $stopscript ]] && CMD="$CMD -e'$stopscript'" [[ -n $startup_mode ]] && CMD="$CMD -O $startup_mode" [[ -n $cpu_usage_monitor_interval ]] && CMD="$CMD -i $cpu_usage_monitor_interval" [[ -n $cpu_usage_monitor ]] && CMD="$CMD -E $cpu_usage_monitor" #=========================================================== : Allow user to reset PROCESS_TO_MONITOR_CPU_USAGE to empty string #=========================================================== if [[ -n $process_to_monitor_cpu ]]; then CMD="$CMD -C $process_to_monitor_cpu" elif [[ " ${!_ENV_ARGS[*]} " == *\ PROCESS_TO_MONITOR_CPU_USAGE\ * ]]; then CMD="$CMD -C ''" fi if [[ -n $monitors || " ${!_ENV_ARGS[*]} " == *\ MONITORS\ * ]]; then print "$0()[$LINENO]($SECONDS): $CMD -m \"$monitors\"" >>$CLMGR_TMPLOG # Always log commands # If monitor list input as case-sensitive "NONE",then consider it as "None" # None : Disable the monitoring for application controller typeset -l mon_list=$monitors if [ "$mon_list" == "none" ];then monitors='None' fi eval $CMD -M \"$monitors\" else print "$0()[$LINENO]($SECONDS): $CMD" >>$CLMGR_TMPLOG eval $CMD fi rc=$? print "$(basename ${CMD%% *}) RC: $rc" >>$CLMGR_TMPLOG if (( $rc != RC_SUCCESS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 400 "\nERROR: failed to modify \"%1\$s\".\n\n" "$appname" 1>&2 rc=$RC_ERROR fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_appserver_attributes "$appname" properties fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "modify application_controller -h" "APPLICATION CONTROLLER:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_modify_appserver()"  l:3+ڣbbb&c # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_backup_profilemes   = _einrst"$CERacdflopuAGILMNOST[\]bghkmv#&()-./12:>PUy%*,0BDKVqw{|}!39;?FHQYx'+46p-X C˄L`ԞDa"Vf>JPHY`(rBB<,YjEDa"6UPy|AHǒDaAĈZ3fb|# M$ÑJ10p$B8ی4pF}9 hV qM)N2U ׌2rAAw`'8-%%E93^liW`OSPV+ tTֺb ug8U5!}e*jW)-*H38kUTY{wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvdT9?hC *aEMڛ+ň8)X2VqjfByCQu5 ⑐'EFے2iJd pg8\_0iM5Y2ԬY~P5Xz=һu8+ۤnfKsم6Ojl!%Xz<+Eq}ň]_qMnP:q`S4b pV:M7Z 8CgU ?]+X-J5SQX{n7Z Cjl 0iJMZm+򆡳&jjn7ZjN $/sfyR:Rș5\9B A`8+Nnr ~Lٝ5' hV jFKQSL8lTaq8U xO=MC=4 &DVfN Wj@1COnJ,RMC-li!5RK)5­Z 7 ]pૻ.ܕY 8(b$^q({Sex "(`( &_ VbOAO; ,U-@Ґ0 n`@Ҋh@JT*(rUI^*X$a}!3V*Ƨ R, *mnT]Ta aEM詨,B2UTm=y059 ed!%f.b̰:Z3.9C8u4@jo&MGOI4&'ɜEl+Exb̩!8tj xmvg<"Y <flQvHWelQvHW5g Br7&By6yP+1ΙwEڅ!\:=5b0innP+GlATm<1hz(?<^$ *m#/MEC@z5mx(M4(EE;xx@V:5 PphRC0|9 w$ٟJ- Uf wEڅ!\*~ 4XU⩒GJJJbR"K x1nL$Uf+RO`E^* $p#/MECpK*W@1hS$^zRP?.\jwh DyE4@jo Liث w$GH,'>BǓI0pRAVmg;`~z b`2Ϥ&v*_ 0y1dQH<44jwմE㈢I4D(1H;+!=0/ehS=VmnثMASn %f.b̵2SG5i!#S\a ΨpwWʕÀ? +1ve.ta}!3V|L? QSm2T*Pq"%}y?.]5 ;V9C8u4@jo&MGO I4&'%f.b̵2SG2ǁK!B&kQǁċ!BktX9F"uF5' p,xyiL(Z̪DQL (83U[YXh 3@'[A4^8$M$J8DIga8.t*Pq"9BJ]řh!H$ڬY GH,'>SJ$G=IYX#֍00ixĉJ]ř;xwW44^LYR&O 5mx(M4(EE;xxX9F"aEMלJX'|\:ZTm=y$Ψp˗wMBND}8DIga8.6r3 (z=IQsV7 4XUJibD =_ 0y1dQH<455 ;j Q$i"Q㈊www5mx(M4(EE;x E|\􈃞11ʂ [D,*%4drIéSy4h"<@x(ZI&$##<n3ړ2J~, H1hŒ";j Q$i"Q㈊ws°rEe+ ŠmSPY!b̝phQSm*j 62SP.) G]RFN ӁNÀYѥ5ŠmSPY!M7WQSm*j 6-*i *mEMAf؀K J+2 `V6]5bN2(L f0iTma,pNESr2wWʕåjthSPhE"$W|h6rLD 4XU H|03@y1dQH<455 ;R"K; qwɳU|ԑgjt?b@/ 4XU H|03@KEőE"d'[A4^8$M$JѨ+"593]F64̳HP2- TU22?==I? wմE㈢I4D(1t (yT+wykҬC0?.]5 ;] 5:eM˗Xzh DyE4@jo LifjaEMr4ZGdAyEİj Q$i"Q㈊ws°rEe+L+*iZYT- 3X.󐩦V˗wMBNRrIqwM2r?SPµMAS|WxӀ[{Tanzf\]!SL~\jw=j4rp`(Eg@T$f\_9 elqPiɚgTb+p`uPuZGIqwM2"($h&M2I R ¹6]*[&k⪕2ۤdg59 e`hM^MECpUFPMGɤSAƓD@ H5T+eBMAna\ŠmRѨ+593]F64̳HP<" Hzf\]!SL~z"0{Ȓ$~"($h&DiG"*,Q  ͙4f! kBV[4A=; VdL5+eX"wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwn`fy1dQH<44IX k(sVY6Ojl!̗b̵ 8{TDŠmʀO.\jwWʕÀ>$ *mSPT~DzDAeAy-D`,zOD,*[e˻'֣G(g# M)SycI@Vyi$dF= jLg!*D-#IైEq@'[A4^8$M$JTU22˗wMBNRTm<*iXe˗wMBNRͱ =6C+YD,*hI\&{(}5bDŠmSPY  ]\hFJŠm88G wMBNy6O^pL(Z̨(1h˄wsT$bB[._ ʕH9L O?/Ȓ(8 $P $ -2SPbBZ@"aEMeH(8 $P $ .=RpЄU2˗wMBNRp-XS hRC0|9 w$p84URYnj™rX_84URYnj–z *mV*B"0@Ǧ2Bɢ23T)Vf>J\ҬC0|9 =6C+Y&Pc#$\&{ʕÀ>9rX^t͞DŠmʃ ƦHXTL;UÃ@x)$\1i"H0hT 1T|F[384URYnjšTm<*iХY`(r 57 *<+AAzl2gUU`V >p-XS= ?=OBpi` 2Յ@ŠmM2RC0|95m!N2(04H"IDADVb*X,Œ5aM :gBpi` 2Յ4 (yT+hRC0|9 ~((# M $7 0P^ d$8Q*hM\4^LYR&O wMBNUFPMGɤSAƓDB9夒iLON 1T 2Յ31Yb X歠/I4&1H;pi` 2Յ,&Tm fU4GDaDM"dE"egfjYL(Z̩25'A"3t͞DŠmʃ ƦHXTL 1T|F[M384URYnj˜K]J5 P-*i Uf![@5LT:L.Ö wwwr+QSm2 bȢ2xhhSP°%3:b,FT!K6Il`XBEFuY3Xqx8ʸpvzҨE"$ M$I a8&dPQGHn` 63ÊInplUVp-XPufj/JJ5 P,mn|9 @j_%@ZmM2aEMBX<3 URfVTU22?=mg;ah*-Bgb,dS)eh*Ƨ R,Zm8ۄ (z=IQs;ZmSPY!hQSm*j 6,IWQSm}* *m?<59 ekBL+*i,ҒjfV$ڬY 57 *<[@wSg *R"HbDa0=V8\_BftBj SyB ±&uY8qI-m+ၚW/MEC@z*JPj *mEMAf؆6Ol@5V*Ja1|"YL:id(zliZZ ¸p?>J" zDFǤ ffmZ2~uF, YŒ5`+ (a<Šm<^? À>642SP®'_D,*HUp8Eg+5wUݻ+aUMFFy@ "† DF[*_:-" zDFǤ wVHۄqA~L1 ڄ3z”6p'%[Oրb20`PH eiZ 0FHV{|}!'*34?BKYqx%567?DPU&I̧qvQʛ8*オ 8+$GKg\Ktﱫt1aɵe@F7U7A6{V[8+Ys1£Yzst-˰op9KqQKP͠~`8;ց.yKsՄWlZ׷8+T"f4bXݩwǂMfNyT8Ai`N<&LM|af-V^I+s7=XEv~؉Gx"fV]t:YP41R Fޙ_ۦkkf=XEvx#4nڇ;j{ B?J ɳ6P}pVR_!  |Z^@f 8(પe~ A<"w8 I0)cBeeX4,qjڠ+$8Py`aZ@Ȋ rMfe;QjHRN;Me^ 9Szk3)qs!ƒMfe;K4b1s"bC5 L\BS A3|*>$*O1,Y"h&L$+MɶS 1s$EQ" 9E#r71&Tbe+@GHd\,$2 br)I"E#AAY\PM""@E .w_RHE .w_R(&Bh*T!4AAAY\$85 X2T-j&-j| <qG LDVH X4'"8d)@ .w_(@Aň$,XLL!:{FBNFy\8`,xAah燇<e"=!Q@nc;/ XzBȐD H8bbPEV!'nTO1ʐ,=!RdH"Hb5!AĨ"E!QŁ&8 H-3 Xվa<.w_Dp&H@M"-@    B P$%@0eFxIVB)a):vUs3`.w_D (LE,8dDzB&%@ A .w_*Hx@y" &HHPq!c&$>36UJy,1gjyO"ښ+3)OjfmMV-sf6ܥcXGZ3MN6rmruٔ|b-W>;$LfMfe;zm{ ani=4'G<*X!4d@"n|y\(GrpM6bq9˓,@!Les0w7ӽ,3ڜX8s5zk3)p+ӹޜSt9^wF`3WUj@j|&M;0AL1R D^Sd'N 7rf8lLӟ̧q'Nwczpz2mLm45zk3)CC;C8 \rK&HqyN.yAkkÖp+_8nzMfp]r`Fcxʹ6y5VSy`P~gO&*X2Cqs̘;s=G&<93[nlf񫋕rm@WAɊ L&2\&,jPf8٫3WvW*7AA/Y3Vy` ?k3%,a9rb$8<Ƀ`\ 8fɕ7=G&y nOW&ٺ;FcŗnKdɗ6wSe6$.xFkA%"@ZDcR(Xۦi;fMfe;y` cɊ L&2BN|Xӥs3Wotcff|ն3G8Rjf] Zlg[fb?!=6q^\jǂYgJӃԗ3Mf;ޜ')q;RDA-N5r N sVb9j ;fW.f-\04 s5z9zf+RsSw^&cf[;S5m-׹Ioxgcm75q96̧qcve|#M[lLն3jaLi;nLg*8ש*^V4ՙ`ƚיrel[s~8 Ʈ2t3W5fotNkћy @?|Ri1R D]Iϙtqp38>qj4ѧB<jK׃8G4Qɵe4ՙl\_+v7 6vjٹyAr;pԹWs5s5q۾ ^b¼#Ɲ-\0uςܽ~YҴ%gp26L;f\+훠f=\wK,H%Z%7<$LKU嚀cz#cpee1ظ 96|mg4ak׹Io8t?,ijswKo$ڳgUnpee1s  ZeinZ7\( tӿظ 9={f2Ϝ96'|;Vjoy5{;fؾ ܤ7=h&Ֆ6q(:v;I\b"c.$:\m[YJn^?DpK?,i9 Kk ,Sln63W _7/pfz)ri6'|;~Xg@jK׃8Grcmt-){3猥7/pfg%Z⻞iׄ|ĉAcVFnYlmQGM{V;RRoIKYZpz-XF!)yl6'{$L8 m˓,@!Les0wy"#J*ފwӹcnYlb-W>;*9gfM'99vr7=XS)͘#rյarMN6rmruٔ|b-W>;"9\SEfe;VVX9[lٍŲYNlgQқ^6ml,7AWN)Z}w"e5zk3)ybxG*SӾfMfe;j-W>9zfmMt[c{VC{+8 [c1lҙ/.LTd1:Z;}5s5q;rl^)+MɶS;ն3σ5!v^)Jj՝w[ٕq1GeM#])v H%7{; ZD>&hkܹ\9ATfSsrmgrv!jڽkܰ~45y)k j 1{VZvyuUUUUUUUUUUG~U0K=g#XɅ4L\b"c/+L,sAg&ou˙rbfy0l~ӝtfS3Prw\P}ͣ7-ڜ3W3Prw.V=_7)o7rf!5zk3)q,7=8VrVfʖ#G7Xm7F^V8+U9s{<n{7Yy{8VrVfʖ#.F>cAՐ#]ewV=vt͞q,s-fLAg&l8۔lZV^X Sr(;h3Ws57O22p(,ݗ' ^)g4mjgыڶRbq,lFƝd`?N.jD ;XՄqNL3Wִj`bϼV 93gpee1 96-a[r1NRsgjcnf, ;XcwiQkS7bϼV 93|6xe,8Xڜy^?afR\1rj7A3of|n3VwWnwf_7-q3{F@GI ZI̧qJW'rIc<;%._5zЄ; 7Aec@F^VFt[Ե9gYN51ShmwVG5zܻ+eqy{8qe^Mʛ׹ū\4`< 6jӆ)IӳN48cpտb675nq{|Vn6㍚5z7s "E6x~Xӥ+qFNR;6iɚ&b4᫐y`@ JpI"ShjqK\b"c/)2`v+,1q1 ^=XGYN3)k՝ڶ)a11R D^W35yQM,brs5{Sp/Fm\'"[nH 9gL.-vlkZsY̧qqrw-S Zۦkag״.Pf)'2Āc3<3W[7Aj"ns5qt8;\Qь#e8k#Ay$Yɶn54agLyƚ7-MfTvlZӗ8g״͞qa.lf1m\b"c.$:[g8a&XԹs5xVf+歱Ŷ{g8a3<3Wv\5xc7M~),،I2wV4ՙ($qk`HpC{\8=@H~J ^kf7\99{;Kl 3;ԹWs\^^n^Gcmt.cpΫ\1rm.SlMq^\;w,iH<ԵZƚ7X(XMYqkޣV#Զ-9x?@W:ƚ7Z5hͼcHy`H(?MI JmR9rb$8<ɃDpl _8v-b :MZP,a7)ormbtzdugQlqijl<$֥bIx)yrb$8<Ƀtqp38>q/Mt#̧qlBN"l[ L?Zƚ7Y5o^4՜4ՙmJ=S|;@6$\e){3˓,@!Leٛtqp38>qj{3Մtvyk܃+U[9czj#r Y-iKkjp]{z4ՙֹK<8=I%j5fotNשů3{C`H$<【 e%cV(=%1R D\bZ4j<,8rs^o|#Rsfk3)y\FMYyN 03\^kfpSyrb$8<Ƀc)x){Wlտ :z7Ӄqcjme@V*$\ [ڽ3l\z͔3(yQHq4I),8WARtP,(*$@k.f!`=t֘ wS8E"Ȣ<\47 aAQ"Ys1A4寍Mg>;(k9/`iHvXjP#Ž.W=)Gws瞂}T26!0wNR4g4)NP;(NA6 jw$0Msr.fWGHglFƝdGIntAntyl2巍5{Yɛ*Q+Y8j ;,M#0( Z 9Ljwsg?¹5{tAU[{ڽkJ.W=h&Ւ42ڽ3sÀqp3ש5foY7`isw{ß醝rIs0i0SØZ d( x4AK{+-`jwQ9Q16CmcakSQGfE#HIpr A6!ojb 93xK3cRXVw[ ;G&WKRƜe!ojb 93gW(̜5{z 4ݨwQEϞ/4slADti\w}‚D &bL=i(|9]‚D &bL=i( 1zKzL!D!䉞wnlQ<+8+4Hb6ћJ:C2 < 8(ଓWMzZRagM%&lࣂ+qst#WkagL9{k+6n7nS:G9-ͩE\?!=a7AjJK _O ̯*(@.[vɵepVA39YI,M\">SuF3q =Ykj0{I,M\">Kpl$^V M1h$d8+ڜ7plbIGI ZQ3$)3 (4akI5)J4I5Slf8+ެY])\F9Joj^ffVHTh qA6"(sM%⭙ 5~F mRNp6'i,8D8bPY*ٚ3W:Fn9[GFӜ"llZYɛYN㍹Ků{Yɛ8+ӋڲQ3Ax`6iɚjZ֜LlZpWg&o+)^Yɴak8+f~Ѧf-z#MڲsfSܩ93h5[agOi )ᅍMʛxF.f3A{<5q75Lek [@6;VL1q+NRXn3\mlCM\"n|a){WZ 2Ϝ1NL3WSf8+Fly_eDqrwSi`4.;ڽҰ=қe!S܁2iZ) #N672tc 3sI^ 8+&frTD 3l\zYZiI8i2; &wͱra8$M)f5q $&wͱr 3sI^(.W=5ʉJ4(Lbsٕ`{7xpvz,@@yB!sЏj"bC"@ĈǑĈĈ %T6 H}yEϞb? 6i_j5 wsgD!.62ZD i  e,w˗ T HT @K...`@'0 jwch%B  w8!*1h ;ၘ CA[RL/#8t"(&Q"h"DPLBDH0ǔ(Lx!#Ŷ2 b^Ѧf-ax cO@аYN(D "LAH!Qbq\03x YDR$& af&:Z(Q"(&Q!BepP3 54akMjB 2D]?Bg>xs 8;=e*.Uq\|9ܩF`3y葤$<GA$D  *yၚVQ"p,/tDR Ie DD ;Ww˗ßVRf#Ns̥'N[D D!aZ@Ȋ $2 ):wYZiI8i2;?)cBeeMutw4Q(E"Ȣ<\44ռ$3KA"e*<$E$(TL ]&PG<oŶ<LxlZJLiNy( ;I0DD-A2 + 4,х*܄E.P4,q6iY Y葤$<< "@ H9ATt;Ѧf-gၛ 4iY YpL CA;Z4,х0ZpdSs[b.|Ay@"Ѧf-eqԃ"dy:@)&Y q1bBGq\|9 a8$M)f5qs5o;4'\\s R,M!QRXp<@yL JpI"Shj~xrd~XSL1қFnW4)EJᡸX_@$d,w8+/?@ekLAg&o0`3V#H Hy"xʛIJW<HC&D nzs-_7>b 93g4ako0F7<5i6I[zny9ůi14)EJᡸX_@$d,w8+/?A5ʉJ40`3V#H Hy"xʛIJW=$ń*<@#Mh2R9;?= 7#փ*%+ӓ+k(EEDyRhn:@)$2Y"E;fV) 20`3V#H Hy"xʛIJWb 93}V{।iLd[LQm''QyW._@ekLAg&oVޛdd[䜝G#LQyW._@ekLAg&o4զۦi%mOLռ4܏;ru܏;Y̶-|I,Y:MZLռGI ZLAg&nnG;Ww8eHXH%9UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTwJe3>FX.v@tk>fxyUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUG+lN?q6'GM&bty+2lN?&lN?ɱ:<$؝y6猓btylN?` :rsqj aa{:?v7*m'>wy]{et W&ٺ1y6'G~ܻ+Mʹ6|;|9 Zei&b4@jHSZst^f=Ka<bVpQY6f3XF \fi5[a;P?,j=c|&j6pWa{fg&^-@ \ً#qwøޥӝۥ`sggjqځKV^yA兊?7AjԱ(&~/NnF 5`XG6FN76bs8)xVf yj:k.f!UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTr9$Ix(Mw"w~!H$ nB 8`@fF 4`@ "@ H9ATTI̧qF`@HM4(#ix, ` D E,TG@8bsß1qT(𬥯j#.3uV0_t]2r8bs}tD .xLbsU4m4թ,@@\6)J5)M  3l\xrL4L D 3l\JƭJn^<@&wͱr=(I;)M .W<9mV7AD ;fع\޽  .xLm[k3Ɛ3mW.".W?8 \R5cHA@sg+gJX&i( .xLm6$.RP .xLlBN"  :pB &wͱr2'1HA@H3mն3ΐ 3mRRoIKY( ;fع\FŶi&m503mNf-Nb)HA@ .xLbsÙm <@&wͱrfŶiLHA`sg+;]BS{W@"  8 :aLwͱrragM& 7HA`sg+ͤrf,<@&wͱrY$3R\i, <@&wͱrڲ@s0+i7HA`@@\6^aWIGFӜ"n(3mekLAg&n03m8nM%4DB.W<9mzL,X ;fع\fH@H3m63PRsg+7*m'>wH@X3mv]|&\f>TD 3l\Zei&b4n{7f> ;4'Ḩq\P+hX YDR*,#ʕCA[ZR͘%g=(@R*wܻ+Mʹ6|s=-Vғ1pӞe):v~.wXSL1қFnWs=Sgz TJW'gz Ұ=қe!S(\qY(/y}ūi̧q9 6w3V̎D D!]+;fع\cPT$@d(HHHA2ɕ@ "@ H9ATMfe;MgrYdqZ&1XG@"gqƮ2t. pw\nW3¹1De%T6^хbsÝ8 PbsÝ7I6х'%cY08qH=5!-6g*a 6j8!`L; R;+h `$4:p 448vi-g7I6х@ÿqUUUUUUUUQ8A9F=g#ª+/UˈɆb&  9)&:Z(Q"(&Q!Bep$ x  i9Mx(\f>X1iWZ.x !s. MeҜp-6g(#* ?Bg:@) *T!4,q˗ßI^9_ci=؀v(A!f&:Z(Q"(&Q!BepPxǔ(L7MYilZ27sjn~.x !ss,] .w4ص9eʗs@1q#e\d#rmzl<]?=Oj~zOj ] 88Hp`@&~ tDR Ie DD ;Ww˗ßj[fͱyf\|8t$'ZG"$`3y.lf1mPH$]w˗ßj[gXsat[c1l[.W[fFa Nw`fcكdA3x`H$rc 9ͱrCʣGǎ(X 8@Xy$@|9( ,/U@1I0(2=6PRs\1Ji~Y@CƮ.TOe{J-y@ն3}3̌ Yc1l2h ՙD TYG+a|S "H(Pz% HTX+/?AfHն30`ռ²=YZxVf+sM1vˆp]#Vb>ᡠf)&:Z(Q"(&Q!BepP(Y HLG,j6R5a,ostrg\9QM l;YZxVf  .lf1mPH$q+$<4xz w֤j[gP( ᡧ6;}nIvmjFŶaHipRx&"2O443Vb.|@C0Q$$T4G%sFps\1Ji~4ՙFczO8=Ip |an$E$XPT13Md -H H(Q2(yBcpkf7\9ƚ7YLbZ).8c/4<]P4,wN(D "LAH!Qbၚ#)*ncpKCA5o;@]$ $LbGLPMVnr+7Ag/dٞoZ)O+NRZ)s4䠥fcxӛ}3V63oLj c"(&Q"‚Ik$^Fph"DPLEGDD @$&PG,j7 [W1Dg53Įv圽f{=kl<8=Ik\_䠥fcxӛ}3V63oLh!.VXcpkf7\99{&n?יshK,a8?f1%/53Įv圽MYxlkR5m-?=h~ tDR Ie DD ;U;؋<!"@D Tz$  Ȣ$i5Væ#7?PDD &&wE!H:k'8MG}nIU'17RxKNC.c˘\05fo%sFA2h ՙC.`Mutw>yCKD!䉘 @I*#鬜QQ(~ A2"LLr`fkSN jw#$`6j!@H$dcp=M7P( ᡧ葤$<ڰMY6ny8nMj6׃ܦ3{A@F5qryfs6*lj'A?&Xb餣mx=(ܦ#1jvAM\0waG\|9 IFzQMFb&..f+P%*,**LaI*@*<@I6*d L Y H%H'1-6gKW`6iBH &hkܰxESYN4ՙ44ռII0DD-A2 + @aw(PAak l1q;|PL^f2?| BG]6zI8D?Bg:@)(PCiY鬒ayåA2[A"e*&W1cNnYl7>pUm9~Ֆ.[UǙYN\3Qxc؋0eFyUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTw˗ßKm[mDmPg3Vܮ\$EQ"hEQ?0`ռ¹:vUs3|4,х7tlM5!@CƮ.TNzRB P$%Km[mDmP 9VB)`NU\LKm[mDmPZVw葤$<0eFy rƯRk+Ojt\e){3j 1||OoQsڢk3)OųtwUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUrMI8=WJn^H HaȁVHi"(*TQ$fSfmjISrg@$w8+/?A6$\e){3s5o;fع\!Q&H@M",yDDňf aaxIg@5!x3уqn^ ;4'\\&Z7mjISrf~ `$ P$g$<'`-eH(*W HE"&PK$@cqߝUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTwVS|^wfؾpsj:wSwUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUQW._A"K(`4TUH' $EQ"h<' aayrs$Fb&..fJIg$E$TymH HP\&PG*f-N..mo3MySsSMfe;x`hX,HE"&PK$@cqUUUUUUUUUUUUUUUUTwVY3W2^63rwUUUUUUUUUUUUUUUUUpeHXH%ZO"QdQT jw˗ßj[g0 jwUUUUUUUUUUUUUUUUUUUUU#3 ^j[gcٞwUUUUUUUUUUUUUUUUUUUUU\"(*w-){3 [c1l\]3Myá"(*wm#H&\~)iMk3)CN #hcᡸX_TYG+\S " ;Wr`fS겈,H $LA-eH(*W s5o;|Rig3Vª/3{ANpARRoIKY;*"<9ATfS)i)t।ޒM(f7CDPU5'+F Mh(9]RRoIKYxESYNw`f@qARRoIKY,/tDR*,#ʕA.)HyBU\03B)YDR$& a S겈TYG+94sFRUIXh`443V}nIU'0 jwUUUUUUUUUUUUUUUUUUUUUUUUTw#373Թst8g"2L𪪪DPU5"'>7sFRUI(f7CDPU5'ͱriւÕsFRUIȊ 24 #h>7Cp)H(*W HE! (wUr`fS겈,H $LA-eH(*W s5o;ГiS f 9UUUUUUUUUUUUUUUUUUUUUUUUUTwV7<'N1jwqt $Fb&..UUUUUUUUUUUUUUUUUUUUUUUUUTwsk3)DNYJn^ :v;IKi3xt0xESYNwͱriւÕsR3<9ATfSGГiS aX_TYG+\S " ;Wr`fS겈,H $LA-eH(*W s5o;Гic٤ּg3Vªj[gm53Гic٤ֳ ;@]$ $LbGLP .Mfe;T kv< IV8Fic٤ֳh5H Hbg>yȊ 2DU$FŶi&m5%E4י:(BĀDA,$Њ}VQ"pg3Vܮ\x[0`ռ𪪪qfl[c1lb=xXF#lF-Jfس ;@]$ $LbGLP .Mfe;T 5-t fŶs6,4$E$XPT13؋(BĀDA,$Њ}VQ"pg3Vܮ֤wt,47 ˗ßI^[Md -H H(Q2 yB5z#i̧qڴmt G(s5zk3)w{) 4י.=k6sDXa$8Py( ;)H$I(=$*,XY}yfUUUUUUUUUUUUUUUUUUUUUUU#0kczk3)w{gI^;*"=H`it$<32BECDt^ &9 A"e,(*Dcik@Μ]RG,*,Z MekJqßI^X4,wS؋<!"@D Tz$  Yx(ҜrE0fLXn=bŅE ~ A2"LO± ܵgN ש;ၚOk(EEDyRhh3yEϞ1b¢ŏ@аYN(C&P\w;Ww4"UE!b@a"`  hE>(EEDyRhh3yW._~#oM'>w0 jw˗U4m4պ!ˈ.fUUUUUUUUUUUUUUUUUUUUUUUUUUUQ89^Zӛ nOb0a[7Af1ϝiUUUUUUUUUUUUUUUUUUUUUUUUUUUG>yCKD!䉘 @I*#ZӂZstC9=SJFޚN|#MX A"e,(*Dcik@Μ]RGZӂZstC9=SJFޚN|#MXHG>yCKD!䉘 @I*#ZӂZstDGB)A"DPLEHrm7-hӂq2 Њx YDR*,#ʕCp)HyBws瞀$04HH D!":kAE;r֒pYkNnYb0`Õظ `Ȋ d44$E$XPT1? ,6rց8.^.Wpsٝ"=Tґ;V@TyBď;WkJRL/#8t"(&Q"h"DPLBDP+<]&PG<Аleѹm؄7 X#sfn8Vf.r)I"E#` QDB,BŎUq\03B)YDR$& a S겈TYG+9rDRgfN0rf ;|8tjst19)2.Ta "A5 pEHr%$`&wrp={)1^j Rl*@I "eԅ08"=H`it$<32BECDtLXax? ;H`"PR XzE&",PzC,@*=Z&X8 HPy`y1*=s5?PDD &'XnZ3kԑ鬙v+;^ʕH(&0\pEHr%%GSs,@(<<׹("=H`it$<32BECDtLXax?(S?PDD &'XnZ3kreiTYG+a|S " ;W;ၚO" 00K "UE"Ȣ<\44ռ+/?=8 \Pk3'KAWAgJX&Os5o;*ŘQfk3훓j5Ʈ.Uɶn\癐#rԵ mk3%Vi;k30`ռ5q(T$$48 \RUfÔ?;A-WYhb! 0c 5qIUfPq+gO)63"Z RL/#8tVw<('Z ;k3'Ks5o;W-&S5qIR._@Hx8pVY)> ZL aa{/k3'K 8 \R|<9 fp)gkJk3'KIk6s  H1!gjĭV;}!KuZ fp)i21W=W/;$5qIRSYd\ <qG LD0<\qW._~Y)1s5o;WAƴ5qHҳ5qHk@"͜""8d(`&ymk3%,a)*LW._~Y))c s5o;}8 \RR3` P$I Hh1fp2e%Vi<\Kk3%,a)*LGkJk3%,a)*LG\E59Eć"P8#&HOHH48 \RR24y؋<!"@D Tz$  Y {5j⒫4΃Y)> ^Y)1k3%,a)*LA"DPLEHrm7-hӂHk3pz2: fp3gOgFt5qIKdJ':@ ;@]$ $LbGLP5pQ~ A2"LO± ܵgN ש;W;ၚO" 00K "UE"Ȣ<\44ռ𪪪;G5zl6̧q𪪪;@]$ $LbGLP5kJqÓ~63p0JXnb.|a0 A"e,(*Dcik@Μ]RG I58ɿ mÁ8 HP,7>z ws瞀$04HH D!":k-$֔DG@ ojbb矃A"DPLEHrm7-hӂq2Up6$fS`{9aX^\ b[Md -H H(Q2( ^"2,4י9`$ ݩf>S%p]w2Nxx ͱghX,YЙ/0`ռbsʐ,< Qs7<9rڽȊ Ӱӿܮ\ͱ}Vy"*@fJIg$E$TymH HP\ x . (#禳2NUYf?N\rt@P9s6s EQ<<]P4,wS "H(Pz% HTX\qW._~mIӄ]r",TEGYQ?0`ռII0DD-A2 + @aw(PA6$.k)ɋMʺظts96ww@аYN(D "LAH!Qb;(bsÝ$<$D HRei"B6$.a,m<8l4$HxH ,*A aay -"CB@X@aT&V8H%d cR((BĀDA,$Њ}VQ"pg3Vª2p砚wjSjF#ªrHyB$ DyUUUUUUUUUUUUUUUUUUUUUUUQ9yôfS-1v8gjf`uZֶe7t@W& ܮmjI̧qJJrCA[b.|@C0Q$$T4GMh(9]$XyCKD!䉘 @I*#E4י:(BĀDA,$Њ}VQ"pg3V˗ÀBfؼ,/.DR$X wͱrei):vp(+Й/s*o벴ܔ;IdgegfM5',P ei):v' 74Zk3)N"o벴ܔ;Idgd\SMfe;HΆ+MIӴN^ xVE4fSrRt%V xVJzk3)N53 r9tfS6z ܔ;Idj9`4T}ͱgUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUG>xpvz Hy"f*=dQt5ok3)CZnJNt7%'NY3h5H Hbg>yȊ 2DZnJNt7%'NY3L^f`Ȋ 2HG>xpvz Hy"f*=dQt5o(S?PDD &&wͱriւÕei):vȊ 24Z ܔ;Id0)H(*W HE! (qX<\ģq p!\03MI5)XNXhn/GYf>xpvz Hy"f*=d0̧qӃƮ2tyCKD!䉘 @I*#E!H:k'8M Hoh֥O"(&Q"‚IE#H鬜6_xt5" Z ;5J)QEϞz Hy"f*=d鬜QQ(~ A2"LL\w8𪪪;+,iӂ\j26ة-8.f,;*r`fS겈,H $LA-eH(*W s5o;Ѝ :pYf\03tԓYN╁円93l\xpb0bGHi"(*TQ(#%mIӄ]r -XGYNכ;G|rbr9lzl6os5;c|w1{TR-72|㞦כ.\6{czl6ljfS4;0u^t7׀թ/̧q;G$L5zMo[=jKtj1ql#m{>LڀSka{f,1};*bsf1'K ςacoO*@"1i> \\jv"`h8bs.?j$)rnظʏ \V/sf1'K3R\|K~> X 9\.YX_^VʏB6'Ky5i> \#kj| )gRrrs#kj|aax~mx ZO,Dq/X^.w?@f틌y鬒ayåA2[A"e*&W@'+ﱽR.w|b1sb矞h""bC=l6)rb?Bg:@)$2Y"Ek9\|8sj$)rB6'KfJIg$E$TymH HP\ @. yB5|ܫMR) u!r k5nZ^1zk3)wKhH4<]@")rb?<\)@C<< (@R HTXmMe$R<ܮ)  KB)YDR*,#ʕCA[rrs#kj|f 9@C$IKZi> ^F6'K  (ܮ>(EEDyRhh3y葤$<=Efe;ژ, A"e,(*D r`feH(*W s5o;G g|6|^we]L^f;DPU5"9E'. .Mfe;UUUUUUUUUUUUUUUUUUUUUUUUU#0g|^5o\nXEvvcVz򷩵[ħjb9\F 5glesb6σL𪪪Ys1I5ԣYs1Եw Y>yCKD!䉘 @I*#R.Jƭh""bC$&?=KZ{F׀դ)r?T,\k3)t\en5ol.*+ڜ2<]HHH Fni&2'{ ?Me$SB6'Kj(aAR$MdoQ&\[&$?=$E"DćHL~zKЍIR~*8QYfS1lk6l\UW8?Mfe;.z$<< "@ H9ATMfe;Oj.~#˙Imx ZO#b.|@C0Q$$T4GMdoQ&\[DG@ ?PDD &&w;WUpeHXH%ZO"QdQT jw;3qڢNV/s> \;4'Hi"(*TQ'Kh> ^y͝(4"Q"p,/dͪ)j8hiAqW ڢ jw$i$ $OtYN%j PDD &'`ܮuYDR*,#ʕCA[=G&3M3W24co4יb.|Mfe;iQkIKi3xt0xESYNwUUUUUUUUUUUUUUUUUUUUUUUUUQ8 6wcVU^6ՄWljv5oרw+z_վ{,Jq^&,Cjܯ3Vw)yo^<&,Ci|?t ;53]J=53) Y>yCKD!䉘 @I*#R.Jƭh""bC$&?=) ^TQ'KGbYN,ųti3xeqV^58"F"@D0- xER3sI5)=hk.f)& QD.B矃A"DPLEH;5DrV5oHDq~ \G*3+@a,oh\FG3V6ч,.W>pG03tE6%"maY6LU\03A6ч,V yEϞx(BĀDA,$Њ}VQ"pg3Vܮ\ԣlBI//0`ռ𪪪r9xpB6$yUUUUUUUUUUUUUUUUUUUUUUUUUUG>yȊ 2DKK#lBG. .Mfe;6Z .f?W $9ATfSGЍ aX_TYG+\S " ;W;ၚO" 00K "UE"Ȣ<\44ռ+/?A6$\e){3s5o;*ny8=W Ϝ3MI8=WJn^;*"<9ATfS7/pftmjISrf~k 9ATfS3l\x@q@15nxs}8=WJn^xESYNw`f@qA6$\e){3Cp)H(*W HE! (w;Ww4"UE!b@a"`  hE>(EEDyRhh3yW._~Km[mDmS0`ռ ;r9uIڷډFڧ8g1VQ(T< ;؋GUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUQW Њ}VQ*@D A-eH$I(=$*,[ s._A"e!`8ar2a؉ռII0DD-A2 + Nx:ׄosՄWl34,хt-S͠x#M\e fS37, ˙BH\t]ZwnFyVwx쩹Ntc 3r4j|Ֆ5x "! 9 ̧qfnYuA538йd# ̢ 0.鬹|LӞgV`t$.~5z 4ݩ]rfSƏDR˙( ;Ww2nl/#9E3&yG{xDADPUbvwy&025H|!%,?BKVWYkz{}'*3468ܪ+T/?ЏhGb㧧HfCKX0˯ON\nW;X'E(lA260,89"bg6wjV(#N”<080 y@p'/€> , q6"sלQ:|mw>yE[xyքrYH,PK8tYӵ7)KB*\`qɊ9i `5 #9$Њ#-5#>1NB'Ԝmh*|ԛ u9y2tnЏbW (! hGg೎:$YJًnpzT]{K[p䋑*S0"Mܵ+7A@BGL3ɖ]ֶ&܂Z%`?0"M.y-Ffz7*9[QU`',=04C Q)4-z`}g|"nV-o:!K[tઓ[+[t@=04% (!ԍ.j/VroUI/Z&l%:D "Tq#MH!+^ U\o )qKgT{k>(],L%8N\1DK "Tq#Y>vviqFW73<#[&>[s{3KQvotF+[s{3 .[j0UA%5_ -V:)GIӰ "EDC.?0"Q=4M^!K8;{?{NRVwbn_9YH2PC5㯄mm6#7-k֢ZcˈQa{c޵՝b0ũsyA;ĮɕUH+ */c甗Uf191jn7(3oZ-`5Ҙ:eux nB@ˣkn{ RYJNy/޵՝3 NʐAbs>;*AUSna&^eaAc"Fɑ,XBLj(<@{[UUUUUUUUM rN=fo㙃,maX`\Q[ 4hfh㙔G 9㖓w- H͓,@aZ^=4ʦlq*&-Wus(FQLDZ%WT3(s*N!i&Db%"P@D9qXilDPS03{s0ct4VM#dȖ,DdJo+㙃0b=`YraEl,ѡA[*D.8*m7+r%Jh#.*Mz ,~ 8னv ޵s81qRn,^)$xAf$]A%.4 o}Ʋ AEϞ c "HA a(X`^X۞4fPzUx2;25ӛ൮O$LBN"d6\"-kSE>vP*VhcNoֻ<1 :v1EϞ c "HA a(X`^X۞Az Pf-rk]Қhj)&A3eɈ*Aoan4,DMEܲt`4|)s=oo`e"d6Xy} e2U0A&+ ^<#̧qNA F ݭ:g+iju7A&^ 7*)lň lF:{Q˨$1^W7+r 2/CA%ٔ: 9F$"X͔&<& 7*)lziMVsy[s0c3<Ѭ Ƃ:"Sу3MW+IӱA[?#hH͖_E"D&lb ^=4ʦ@ 2[=X<㎳[9ܠUq6qp]A'.򸉹[Iz;Ux2;C i6=4ʦًb9`Ƃ0b`,qPzy4+7APo+o} 6(7qk`أ{QYyf*M~vу&?Z,?pTvfs=okƿEFXh jYH R'e6 D *0BPo`VR}e"vXP8z`ici&RV/A c_eiyX(}e"vT*YH TXD*VƿFn?pfyX(}e"vT*YH TXr$Ǖ/H #.!x 1zM@RWRjj,?8^r#|^qq%㙃0b=h(fs=ooFÕ5+:לSoX\*-tT4_wJx?UNcVC@c؋=AbD4-*P Zhj)&A3eɈ*A]e"vTW3AEG ^$Y@=045Ր18 V`Hx89"b1EϞ c "HA a(X`^X۞Az PgR'eZ0]e"vHaH͗& Hs[9eqb|y1oG||)kAEϞ c "HA a(X`^9Dutʮ̧qܻWTEEf?kTDCQH2 .L@R ̢::BNxWfSfn]ury \D墢t~}e"vM"AX$DM D,0/UuO1K ъaH͗& H,^UzHaX0`g3&6Z)&A3eH2 &XlA^=4ʦNv}~ 83קr1VM9Oaj9u+7<쳐e (22yIgrIz/ׅ͘F*moCظOf7LW|᪼[?)+[Za=mXQvnA- Þ{Ux2&s5Z\j.wt|7!EϞ c "HA a(X`^9Dutʮ̧qܻWUx2`yLl0WnY 45  r|RjR"3(9Uٔ#trV)c7PSl 6 {+1V\" 0$PhRꮪehiC7>K)5)>K)5CQH2 .L@R of c_%f`V,^USHaX0`g37#Ix2Vnty2)a-V_)o".pz \Aڰyf*M{rs_wJaoX\>NZj.|Rj!1/׃Y5d41\" 0$PhR㙔G\HIw˺nUuO1KTVn|@=04% (!',DLrboe!s*2s3rC]S@R'-k_*L ,lBÊ$<}"7X*\" 0$PhRꮩ )qAz1U 45  ŋъZi,"C zE"D&l)&A3d-h7@ǦTIϱ>pgzPf*U[88MG.ty\睖r̠FFP),^ 2/CEZP1Vsփ ^ ՛1\^ ȼ"fWG tr]}cqVmieSk3(s-&6Z)&A3eH2 &Xl( x*^emX=&rN! IKRP|#af^eWfS'Nko|'[I$̴H', .[.[,=04C5f j.L@3c KTj=mD3tuG<$̽ (4 k1 Dc8r9{[Qw,# ^ Z5"AX$DM D,0/̢::BNxWfSfn]ury \D华5/ֆDLrboe!s*2s3rC]S@R',lq|}cqV,_p}h}cqW1EϞ c "HA a(X`^b9iT0R$Lf˓$Ts/ESZi,"C zE"D&l)&A3d-h7@ǦTIϱ>pgzPf*U[88MG.ty\睖r̠FFP),^ 2/CEZP1ks0cA1qRnzQe ziQo&?88ܧ3u|8b`:TX89"bו&1 9׹/ֻ0h7D,aI(zŌ0"%*hZ%Tyazy \D妐^7PCQH2 .L@R qXOn*=ilI,[03{֓w- H͓,@/eS z';>?pWӹAyV&ml㧰5N]svYG2eC<9{X$̽ kƒA@sփ_[qo+`ICZֽMqkTa~5*M{֓w- H͓,@ +@R/s΅⇭^e (22KfV(]s2 2. bnfos]j=lQ˯^:VL 9"Jу&=wkk]Ҙf\" 0$PhR㙔G\HIw˺nUuO1KTVn|0R$Lf˓$T3(9Uٔ#trb9h_-m"AX$DM D,0/UuO1K ъaH͗& H,^UzHaX0`g3&6Z)&A3eH2 &XlA^=4ʦNv}~ 83קr1VM9Oaj9u+7<쳐e (22yIgrIz/ׅ͘F*moan5{bHNRx. X<㎳&?tXYIT;fփks/VFű9"=zz\$s1WfSꮤp9srNRz|^yGk9n{9Uٔ:yf*MxNobQl}s=oose䉈*2-fyG- fQ$玂<689"b ̧qo7o^Df3Ft1qRnE%c7)O]bwm,^U6XE$-9H́ʖH͇.lѠg"ϙYk[.*yv!^Ny|`]қ*WkEڧ-kSp+1V.W=H"-U;z)qHb CA ʐ(LzPh(kׁq?#T4$P ͘D h'c޷a" YprD 8*mUٔ&^ PX Þ k>:3+3bbb&3 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_cluster_hmcd#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_cluster_hmc.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #================================================ # The following, commented line enforces hmcing # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --hmce # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_modify_cluster_hmc =head1 VERSION Version Number: 1.8 Last Extracted: 10/29/15 19:42:04 Last Changed: 10/28/15 07:21:01 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_cluster_hmc.sh, hacmp.assist, 61haes_r720, 1544B_hacmp720 =head1 SYNOPSIS clmgr manage cluster hmc \ [ DEFAULT_HMC_TIMEOUT= ] \ [ DEFAULT_HMC_RETRY_COUNT= ]\ [ DEFAULT_HMC_RETRY_DELAY= ]\ [ DEFAULT_HMCS_LIST= ] [ CONNECTION_TYPE={ssh|rest} ] NOTE: the alias for "cluster" is "cl". =head1 DESCRIPTION Attempts to modify the cluster hmc configuration. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the modified object can be returned to the caller. 2. DEFAULT_HMC_TIMEOUT [OPTIONAL] [integer] The default value for timeout for DLPAR acquisition/release HMC operations. This value is expressed in minutes. For memory release operations, 1 minute per GBytes is added to this value. The timeout value can also be set on each HMC separately. 3. DEFAULT_HMC_RETRY_COUNT [OPTIONAL] [integer] The default value for the number of retries on HMC operations. The HMC operation which timeouts will be retried this number of times. The retry count value can also be set on each HMC separately. 4. DEFAULT_HMC_RETRY_DELAY [OPTIONAL] [integer] The default value for duration of delay between two retries set on HMC operations. This value is expressed in seconds. The HMC operation which timeouts will be retried 'default_hmc_retry_count' number of times, with 'default_hmc_retry_delay' seconds between each retry. The retry delay value can also be set on each HMC separately. 5. DEFAULT_HMCS_LIST [OPTIONAL] [string] The default list of HMCs to be used by all nodes of the cluster. HMC list can be set at cluster level, at site level or at node level. We cannot modify the list of HMCs set on this DEFAULT_HMCS_LIST parameter. We can only change the precedence order of the HMCs of this list. For example we had 'DEFAULT_HMCS_LIST=HMC1 HMC2 HMC3', we can change this list to 'DEFAULT_HMCS_LIST=HMC2 HMC3 HMC1', to indicate that HMC2 has to be tried first. 6. CONNECTION_TYPE [OPTIONAL] [integer] The connection type is used to establish passwordless SSH vs REST API based connection to HMC for DLPAR,EPCoD and OnOff CoD operations. Default value for this parameter is SSH. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2015 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_modify_cluster_hmc { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_cluster_hmc.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset -n properties=$1 shift typeset user_input=$* typeset default_timeout=${1//\"/} typeset default_retry_count=${2//\"/} typeset default_retry_delay=${3//\"/} typeset default_hmcs_list=${4//\"/} typeset connection_type=${5//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -A clattrs CL=$LINENO KLIB_HACMP_get_cluster_attributes clattrs #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ if [[ -z ${clattrs[CLUSTER_NAME]} ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 35 "\nERROR: no cluster is defined yet.\n\n" 1>&2 rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= elif [[ $user_input == *([[:space:]]) ]] ; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 401 "\nERROR: no valid modifications were specified for \"%1\$s\".\n\n" "$(cllsclstr -cS | /usr/bin/cut -d: -f2)" 1>&2 rc=$RC_MISSING_INPUT fi if [[ -n $default_timeout && $default_timeout != +([[:digit:]]) ]] ; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 111 "\nERROR: \"%1\$s\" requires a positive, integer value.\n\n" DEFAULT_HMC_TIMEOUT 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $default_retry_count && $default_retry_count != +([[:digit:]]) ]] ; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 111 "\nERROR: \"%1\$s\" requires a positive, integer value.\n\n" DEFAULT_HMC_RETRY_COUNT 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $default_retry_delay && $default_retry_delay != +([[:digit:]]) ]] ; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 111 "\nERROR: \"%1\$s\" requires a positive, integer value.\n\n" DEFAULT_HMC_RETRY_DELAY 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ $connection_type != *([[:space:]]) ]]; then CL=$LINENO verify_in_set CONNECTION_TYPE "$connection_type" "ssh,rest" connection_type (( $? != RC_SUCCESS )) && rc=$RC_INCORRECT_INPUT fi #===================================================== : We cannot modify the contents of the list of HMCs, : we can only modify the precedence order of the HMCs. #===================================================== if [[ -n $default_hmcs_list ]]; then #==================================================== : First, verify that the list of hmcs passed is the : exact list of hmcs already set on this cluster. #==================================================== typeset -i error_found=0; print "$0()[$LINENO]($SECONDS): clodmget -f default_hmcs_list -n HACMPhmcparam" >>$CLMGR_TMPLOG # Always log commands if [[ $(clodmget -f default_hmcs_list -n HACMPhmcparam | tr ' ' '\n' | sort -u) != \ $(print -- "$default_hmcs_list" | tr ' ' '\n' | sort -u) ]]; then error_found=1 fi #=========================================================== : If verification step is not ok, then display error message #=========================================================== if (( error_found == 1 )); then typeset VALIDVALUES=$(clodmget -f default_hmcs_list -n HACMPhmcparam | sort -u) /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" DEFAULT_HMCS_LIST "$default_hmcs_list" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "$VALIDVALUES" 1>&2 rc=$RC_INCORRECT_INPUT fi fi #================================= # Tune the cluster, if requested #================================= if (( $rc == RC_UNKNOWN || $rc == RC_SUCCESS )); then if [[ -n $default_timeout ]]; then #================================================ : Setting default_timeout to "$default_timeout" #================================================ print "HACMPhmcparam: default_timeout=$default_timeout" | /usr/bin/odmchange -o HACMPhmcparam typeset VAL=$(clodmget -n -f default_timeout HACMPhmcparam) [[ $VAL == $default_timeout ]] && rc=$RC_SUCCESS || rc=$RC_ERROR fi fi if (( $rc == RC_UNKNOWN || $rc == RC_SUCCESS )); then if [[ -n $default_retry_count ]]; then #================================================ : Setting default_retry_count to "$default_retry_count" #================================================ print "HACMPhmcparam: default_retry_count=$default_retry_count" | /usr/bin/odmchange -o HACMPhmcparam typeset VAL=$(clodmget -n -f default_retry_count HACMPhmcparam) [[ $VAL == $default_retry_count ]] && rc=$RC_SUCCESS || rc=$RC_ERROR fi fi if (( $rc == RC_UNKNOWN || $rc == RC_SUCCESS )); then if [[ -n $default_retry_delay ]]; then #================================================ : Setting default_retry_delay to "$default_retry_delay" #================================================ print "HACMPhmcparam: default_retry_delay=$default_retry_delay" | /usr/bin/odmchange -o HACMPhmcparam typeset VAL=$(clodmget -n -f default_retry_delay HACMPhmcparam) [[ $VAL == $default_retry_delay ]] && rc=$RC_SUCCESS || rc=$RC_ERROR fi fi if (( $rc == RC_UNKNOWN || $rc == RC_SUCCESS )); then if [[ -n $default_hmcs_list ]]; then #================================================ : Setting default_hmcs_list to "$default_hmcs_list" #================================================ print "HACMPhmcparam: default_hmcs_list=$default_hmcs_list" | /usr/bin/odmchange -o HACMPhmcparam typeset VAL=$(clodmget -n -f default_hmcs_list HACMPhmcparam) [[ $VAL == $default_hmcs_list ]] && rc=$RC_SUCCESS || rc=$RC_ERROR fi fi if (( $rc == RC_UNKNOWN || $rc == RC_SUCCESS )); then if [[ -n $connection_type ]]; then if [[ $connection_type == "ssh" ]]; then connectiontype=0 else connectiontype=1 CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1142 "\nWARNING: HMC Connection type is updated to REST API,make sure USER_NAME and PASSWORD is set for all HMC(s).\n" 1>&2 fi #============================================================== : Setting connection_type to "$connectiontype" \(0=ssh,1=rest\) #============================================================== print "HACMPhmcparam: connection_type=$connectiontype" | /usr/bin/odmchange -o HACMPhmcparam typeset VAL=$(clodmget -n -f connection_type HACMPhmcparam) [[ $VAL == $connectiontype ]] && rc=$RC_SUCCESS || rc=$RC_ERROR fi fi if (( rc == RC_SUCCESS )); then #=========================================================== # Set the "handle" attribute in the HACMPcluster class # to zero to indicate that an unsynced change exists in # the cluster configuration. #=========================================================== if [[ -n $default_timeout || -n $default_retry_delay || -n $default_retry_delay || -n $default_hmcs_list || -n $connection_type ]]; then print "\ HACMPcluster: \thandle=0" | /usr/bin/odmchange -o HACMPcluster fi fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_cluster_attributes properties fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "manage cluster -h" "CLUSTER:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_modify_cluster_hmc()" L == $d k&3+(bbb&( # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_cluster_nova#!/bin/ksh93 # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_cluster_nova.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # #================================================ # The following, commented line enforces hmcing # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --novae # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_modify_cluster_nova =head1 SYNOPSIS clmgr manage cluster nova \ [ DEFAULT_NOVA_TIMEOUT= ] \ [ DEFAULT_NOVA_RETRY_COUNT= ]\ [ DEFAULT_NOVA_RETRY_DELAY= ]\ [ CONNECTION_TYPE={ssh} ] NOTE: the alias for "cluster" is "cl". =head1 DESCRIPTION Attempts to modify the cluster NovaLink configuration. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the modified object can be returned to the caller. 2. DEFAULT_NOVA_TIMEOUT [OPTIONAL] [integer] The default timeout for DLPAR acquisition/release NovaLink operations. This value is expressed in minutes. For memory release operations, 1 minute per GBytes is added to this value. The timeout value can also be set on each NovaLink separately. 3. DEFAULT_NOVA_RETRY_COUNT [OPTIONAL] [integer] The default value for the number of retries on NovaLink operations. The NovaLink operation which timeouts will be retried this number of times. The retry count value can also be set on each NovaLink separately. 4. DEFAULT_NOVA_RETRY_DELAY [OPTIONAL] [integer] The default value for duration of delay between two retries set on NovaLink operations. This value is expressed in seconds. The NovaLink operation which gets times out,then will be retried 'default_nova_retry_count' number of times, with 'default_nova_retry_delay' seconds between each retry. The retry delay value can also be set on each NovaLink separately. 5. CONNECTION_TYPE [OPTIONAL] [string] The connection type is used to for passwordless connection to NovaLink to perform DLPAR,EPCoD and OnOff CoD operations. Default value for this parameter is SSH. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. function KLIB_HACMP_modify_cluster_nova { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : INPUTS: $* typeset -n properties=$1 shift typeset user_input=$* typeset default_timeout=${1//\"/} typeset default_retry_count=${2//\"/} typeset default_retry_delay=${3//\"/} typeset connection_type=${4//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -A clattrs CL=$LINENO KLIB_HACMP_get_cluster_attributes clattrs #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ if [[ -z ${clattrs[CLUSTER_NAME]} ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 35 "\nERROR: no cluster is defined yet.\n\n" 1>&2 rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= elif [[ $user_input == *([[:space:]]) ]] ; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 401 "\nERROR: no valid modifications were specified for \"%1\$s\".\n\n" "$(cllsclstr -cS | /usr/bin/cut -d: -f2)" 1>&2 rc=$RC_MISSING_INPUT fi if (( $rc == RC_UNKNOWN )); then if [[ -n $default_timeout && $default_timeout != +([[:digit:]]) ]] ; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 111 "\nERROR: \"%1\$s\" requires a positive, integer value.\n\n" DEFAULT_NOVA_TIMEOUT 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $default_retry_count && $default_retry_count != +([[:digit:]]) ]] ; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 111 "\nERROR: \"%1\$s\" requires a positive, integer value.\n\n" DEFAULT_NOVA_RETRY_COUNT 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $default_retry_delay && $default_retry_delay != +([[:digit:]]) ]] ; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 111 "\nERROR: \"%1\$s\" requires a positive, integer value.\n\n" DEFAULT_NOVA_RETRY_DELAY 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ $connection_type != *([[:space:]]) ]]; then CL=$LINENO verify_in_set CONNECTION_TYPE "$connection_type" "ssh" connection_type (( $? != RC_SUCCESS )) && rc=$RC_INCORRECT_INPUT fi fi #================================= # Tune the cluster, if requested #================================= if (( $rc == RC_UNKNOWN || $rc == RC_SUCCESS )); then if [[ -n $default_timeout ]]; then #================================================ : Setting default_timeout to "$default_timeout" #================================================ print "HACMPnovaparam: default_timeout=$default_timeout" | /usr/bin/odmchange -o HACMPnovaparam typeset VAL=$(clodmget -f default_timeout HACMPnovaparam) [[ $VAL == $default_timeout ]] && rc=$RC_SUCCESS || rc=$RC_ERROR fi fi if (( $rc == RC_UNKNOWN || $rc == RC_SUCCESS )); then if [[ -n $default_retry_count ]]; then #================================================ : Setting default_retry_count to "$default_retry_count" #================================================ print "HACMPnovaparam: default_retry_count=$default_retry_count" | /usr/bin/odmchange -o HACMPnovaparam typeset VAL=$(clodmget -f default_retry_count HACMPnovaparam) [[ $VAL == $default_retry_count ]] && rc=$RC_SUCCESS || rc=$RC_ERROR fi fi if (( $rc == RC_UNKNOWN || $rc == RC_SUCCESS )); then if [[ -n $default_retry_delay ]]; then #================================================ : Setting default_retry_delay to "$default_retry_delay" #================================================ print "HACMPnovaparam: default_retry_delay=$default_retry_delay" | /usr/bin/odmchange -o HACMPnovaparam typeset VAL=$(clodmget -f default_retry_delay HACMPnovaparam) [[ $VAL == $default_retry_delay ]] && rc=$RC_SUCCESS || rc=$RC_ERROR fi fi if (( $rc == RC_UNKNOWN || $rc == RC_SUCCESS )); then if [[ -n $connection_type ]]; then connectiontype=0 #setting the connection type to ssh and is only valid. else connectiontype=0 #setting the connection type to ssh and is only valid. fi #============================================================== : Setting connection_type to "$connectiontype" 0=ssh #============================================================== print "HACMPnovaparam: connection_type=$connectiontype" | /usr/bin/odmchange -o HACMPnovaparam typeset VAL=$(clodmget -f connection_type HACMPnovaparam) [[ $VAL == $connectiontype ]] && rc=$RC_SUCCESS || rc=$RC_ERROR fi if (( rc == RC_SUCCESS )); then #=========================================================== # Set the "handle" attribute in the HACMPcluster class # to zero to indicate that an unsynced change exists in # the cluster configuration. #=========================================================== if [[ -n $default_timeout || -n $default_retry_delay || -n $default_retry_delay || -n $connection_type ]]; then print "\ HACMPcluster: \thandle=0" | /usr/bin/odmchange -o HACMPcluster fi fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_cluster_attributes properties fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "manage cluster -h" "CLUSTER:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_modify_cluster_nova()"  kЩ3+]7bbb&]7 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_cluster_roha#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r721 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_cluster_roha.sh 1.7 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2014,2016 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_cluster_roha.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_modify_cluster_roha =head1 SYNOPSIS clmgr manage cluster roha \ [ ALWAYS_START_RG={YES|NO} ] \ [ ADJUST_SPP_SIZE={YES|NO} ]\ [ FORCE_SYNC_RELEASE={YES|NO} ] \ [ AGREE_TO_COD_COSTS={YES|NO} ] ] \ [ ONOFF_DAYS= ] \ [ RESOURCE_ALLOCATION_ORDER={free_pool_before_enterprise_pool|enterprise_pool_before_free_pool|all_enterprise_pool_before_free_pool} ] NOTE: the alias for "cluster" is "cl". =head1 DESCRIPTION Attempts to modify the cluster Resource Optimized High Availability (aka roha) configuration. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the modified object can be returned to the caller. 2. ALWAYS_START_RG [OPTIONAL] [string] If the cluster should always start resource group even if resources are insufficient. 3. ADJUST_SPP_SIZE [OPTIONAL] [string] If the cluster should adjust shared processor pool size when acquiring resources. 4. FORCE_SYNC_RELEASE [OPTIONAL] [string] If the cluster should force release of resources synchronously. 5. AGREE_TO_COD_COSTS [OPTIONAL] [string] If the cluster may use available On/Off CoD resources. 6. ONOFF_DAYS [OPTIONAL] [integer] The amount of days for On/Off CoD request. 7. RESOURCE_ALLOCATION_ORDER [OPTIONAL] [string] Tunable to define the order of resource allocation. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. function KLIB_HACMP_modify_cluster_roha { . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_cluster_roha.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset -n properties=$1 shift typeset user_input=$* typeset -l always_start_rg=${1//\"/} typeset -l adjust_spp_size=${2//\"/} typeset -l force_sync_release=${3//\"/} typeset -l agree_to_cod_costs=${4//\"/} typeset onoff_days=${5//\"/} typeset -l resource_allocation_order=${6//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -A clattrs CL=$LINENO KLIB_HACMP_get_cluster_attributes clattrs #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ if (( $rc == RC_UNKNOWN )) && [[ -z ${clattrs[CLUSTER_NAME]} ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 35 "\nERROR: no cluster is defined yet.\n\n" 1>&2 rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= elif [[ $user_input == *([[:space:]]) ]] ; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 401 "\nERROR: no valid modifications were specified for \"%1\$s\".\n\n" "$(cllsclstr -cS | /usr/bin/cut -d: -f2)" 1>&2 rc=$RC_MISSING_INPUT fi if [[ -n $always_start_rg ]] ; then if [[ $always_start_rg == @(1|y|t)* ]]; then always_start_rg=1 # yes and true (lowercase or uppercase), 1 elif [[ $always_start_rg == @(0|n|f)* ]]; then always_start_rg=0 # no and false (lowercase or uppercase), 0 else dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" ALWAYS_START_RG "$always_start_rg" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "true, false" 1>&2 rc=$RC_INCORRECT_INPUT fi fi if [[ -n $adjust_spp_size ]] ; then if [[ $adjust_spp_size == @(1|y|t)* ]]; then adjust_spp_size=1 # yes and true (lowercase or uppercase), 1 elif [[ $adjust_spp_size == @(0|n|f)* ]]; then adjust_spp_size=0 # no and false (lowercase or uppercase), 0 else dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" ADJUST_SPP_SIZE "$adjust_spp_size" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "true, false" 1>&2 rc=$RC_INCORRECT_INPUT fi fi if [[ -n $force_sync_release ]] ; then if [[ $force_sync_release == @(1|y|t)* ]]; then force_sync_release=1 # yes and true (lowercase or uppercase), 1 elif [[ $force_sync_release == @(0|n|f)* ]]; then force_sync_release=0 # no and false (lowercase or uppercase), 0 else dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" FORCE_SYNC_RELEASE "$force_sync_release" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "true, false" 1>&2 rc=$RC_INCORRECT_INPUT fi fi if [[ -n $agree_to_cod_costs ]] ; then if [[ $agree_to_cod_costs == @(1|y|t)* ]]; then agree_to_cod_costs=1 # yes and true (lowercase or uppercase), 1 elif [[ $agree_to_cod_costs == @(0|n|f)* ]]; then agree_to_cod_costs=0 # no and false (lowercase or uppercase), 0 else dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" AGREE_TO_COD_COSTS "$agree_to_cod_costs" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "true, false" 1>&2 rc=$RC_INCORRECT_INPUT fi fi if [[ -n $onoff_days && $onoff_days != +([[:digit:]]) || $onoff_days == 0 ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 111 "\nERROR: \"%1\$s\" requires a positive, integer value.\n\n" ONOFF_DAYS 1>&2 rc=$RC_INCORRECT_INPUT elif [[ -n $onoff_days ]] && (( $onoff_days > 90 )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 175 "\nERROR: \"%1\$s\" maximum value is \"%2\$d\".\n\n" ONOFF_DAYS 90 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ $resource_allocation_order != *([[:space:]]) ]]; then CL=$LINENO verify_in_set RESOURCE_ALLOCATION_ORDER "$resource_allocation_order" "free_pool_before_enterprise_pool,enterprise_pool_before_free_pool,all_enterprise_pool_before_free_pool" resource_allocation_order (( $? != RC_SUCCESS )) && rc=$RC_INCORRECT_INPUT fi #================================= # Tune the cluster, if requested #================================= if (( $rc == RC_UNKNOWN || $rc == RC_SUCCESS )); then if [[ -n $always_start_rg ]]; then #================================================ : Setting always_start_rg to "$always_start_rg" #================================================ print "HACMProhaparam: always_start_rg=$always_start_rg" | /usr/bin/odmchange -o HACMProhaparam typeset VAL=$(clodmget -n -f always_start_rg HACMProhaparam) [[ $VAL == $always_start_rg ]] && rc=$RC_SUCCESS || rc=$RC_ERROR fi fi if (( $rc == RC_UNKNOWN || $rc == RC_SUCCESS )); then if [[ -n $adjust_spp_size ]]; then #================================================ : Setting adjust_spp_size to "$adjust_spp_size" #================================================ print "HACMProhaparam: adjust_spp_size=$adjust_spp_size" | /usr/bin/odmchange -o HACMProhaparam typeset VAL=$(clodmget -n -f adjust_spp_size HACMProhaparam) [[ $VAL == $adjust_spp_size ]] && rc=$RC_SUCCESS || rc=$RC_ERROR fi fi if (( $rc == RC_UNKNOWN || $rc == RC_SUCCESS )); then if [[ -n $force_sync_release ]]; then #================================================ : Setting force_sync_release to "$force_sync_release" #================================================ print "HACMProhaparam: force_sync_release=$force_sync_release" | /usr/bin/odmchange -o HACMProhaparam typeset VAL=$(clodmget -n -f force_sync_release HACMProhaparam) [[ $VAL == $force_sync_release ]] && rc=$RC_SUCCESS || rc=$RC_ERROR fi fi if (( $rc == RC_UNKNOWN || $rc == RC_SUCCESS )); then if [[ -n $agree_to_cod_costs ]]; then #================================================ : Setting agree_to_cod_costs to "$agree_to_cod_costs" #================================================ print "HACMProhaparam: agree_to_cod_costs=$agree_to_cod_costs" | /usr/bin/odmchange -o HACMProhaparam typeset VAL=$(clodmget -n -f agree_to_cod_costs HACMProhaparam) [[ $VAL == $agree_to_cod_costs ]] && rc=$RC_SUCCESS || rc=$RC_ERROR fi fi if (( $rc == RC_UNKNOWN || $rc == RC_SUCCESS )); then if [[ -n $onoff_days ]]; then #================================================ : Setting onoff_days to "$onoff_days" #================================================ print "HACMProhaparam: onoff_days=$onoff_days" | /usr/bin/odmchange -o HACMProhaparam typeset VAL=$(clodmget -n -f onoff_days HACMProhaparam) [[ $VAL == $onoff_days ]] && rc=$RC_SUCCESS || rc=$RC_ERROR fi fi if (( $rc == RC_UNKNOWN || $rc == RC_SUCCESS )); then if [[ -n $resource_allocation_order ]]; then if [[ $resource_allocation_order == "all_enterprise_pool_before_free_pool" ]]; then allocation_order=2 elif [[ $resource_allocation_order == "enterprise_pool_before_free_pool" ]]; then allocation_order=1 else allocation_order=0 fi #================================================ : Setting resource_allocation_order to "$resource_allocation_order" #================================================ print "HACMProhaparam: resource_allocation_order=$allocation_order" | /usr/bin/odmchange -o HACMProhaparam typeset VAL=$(clodmget -n -f resource_allocation_order HACMProhaparam) [[ $VAL == $allocation_order ]] && rc=$RC_SUCCESS || rc=$RC_ERROR fi fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then #=========================================================== # Set the "handle" attribute in the HACMPcluster class # to zero to indicate that an unsynced change exists in # the cluster configuration. #=========================================================== if [[ -n $always_start_rg || -n $adjust_spp_size || -n $force_sync_release || -n $agree_to_cod_costs || -n $resource_allocation_order || -n $onoff_days ]]; then print "\ HACMPcluster: \thandle=0" | /usr/bin/odmchange -o HACMPcluster fi if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_cluster_attributes properties fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "manage cluster -h" "CLUSTER:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_modify_cluster_roha()" #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ === lL3+fbbb&? # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_cluster_securityes   =eainrst "$CS_cdfhlmopAEGILMNORT\guvy#&(),-.1:;DHPU[]b|%*/02>Fkw!'34BKV5678 39W|׼lГJf M@3pFP39嗽okKMaӵC75;Ffٙtlt bwOe1|.յC8#+s3HCqkz1j2չړC^|3t76Zn/tP wN`ms^ʎ,*TI-{V 4PY`1axfQ򛠫Qo4 ܁,۠Qa8 3&HiDl6)3DTB0q7((,"y(T P 0( ] K ܣ-@$ƢHQ6ZUMF wjl:K`0Xx` 3 X, @ X#2K$!8nsa*@<.q6癕73w+gb[ K w+gs4 A%ӿmf]|` <NW=K޳tP$\H ;f۹\Nt @Is 4Ņ"HyTȔ<1V3j 7.R3snGUUUUUUUUUUUUUUUUUGbV<i{UUUUUUUUUUUUUUUUUGw+*RQLTL'Fg@P+}W<5-FT @7497@m ~D ""cI%@DDLi1ㄨ"=4DƓ8JGw+gf]|Ff]|;f۹\!ѢK&⥈H"4<sP+P_3`3)A*9KÕwͷrCEHLP4iaɁM f/J aO;4WGvZ!6]ͭF7vjwEUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUQ葤&8ME2J|-S޶(I,,,GՓl-HU4D!S$$gJ֣e;jυxAgJ@) D LHpbCN,-fWϪBmX^..#{ɶdc $I*Ch"DHzX TB9үY:ojݨj58z<8 @)FJqTK3<5Q 5`XYx0$wT " $@,w+;"5|׽C1|C1|1#*nsF02;$LDʎ$PLމ@c$ƢHQ34`̧qMӜ^0fw-F9G^ 7 Y` )f@(ç8X4qpw,ձ\Z4m^k7JO1 2ó޶,-A5lb<׸D ""cI%A^jā{jأĈ$4 "8H; /b[y DD@5lQ $& سV&@x""wl=lX[ z Yc,ձG$@T- E]ѧj^ᘹ^0akۍ{Fey1t7{-5'k9,`ޭ,L;;bl4..#{HM1ǎtAj/@j/C?DNA{0_5٣!4 E]V ~./ڋ4|dL<׸z ڋ"ڋ4yF $DDN$@^ͨ3GnDODDHp /f]|l,'ڋ4|rrzذ=GNqqkzذ6UXh "Y4G,@Ab<׸oY:wH "Y4G,@AYlX[ z ;Lfqqkzذ6UXh "Y1Bѥ&85t0uF,RhÓy<޶,-#IFt&?8R#7L,^wA5ja|Ә3r j3:|j;;ZR'6wA6熙,V4RyZkq5R7;k^iӳ0uv6ݨjmGkC30b.k/v}wn.mc{յe{doݨjc Ms51fm2G0ڡAzGJX5'wEUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUQ[f]|[ 1qqkb \f}VhR%DqRXv;AӧiրhR%*@ Xr``#9sX[AK޳t@Hp4hɢ8b,; ˝^iӴo *DbHKL qqsMY6̌aD!SHqmHU2IK`gJ;otԸ=GNḑ騸v9^㙕 M}[YXعmGkC UDR,bYUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTwAn O3'ƕjO1 T3 aR7;wm;l 27,b7j=gڡؕ,N[{P`Z4m]fl,wB;"abl4t&qqqk޶,-Nx΃qyNY< FrqyNY@Hp4hɊ ,900p ˝h R7;Ft=GN ,0 ?˝ \f}VhR%DqRXv..w׸@ca5d21A$M!Ŵ"HyT$=, ^(TCv˦ӧx:gޣL>چəOiںGf/QwAg.x<.xqx3j.>LAgJ@)&BG"Y2KY-f-wb;RvUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUGl(+B*uYTS&( #:SʢB9$kzذj  b<׸am )fD5&ّ6Z$kټ\..6S +r ׸)x>.і̶{Fc8=_Vq'snAqzCEHMKDiat0uF,RhÓۋ5/ȼ "/0BDHV|!%'*345679Kkxz{}+8JA9 iDXa4DH<ʮm~g7&Ֆ;[--<'*ےQGrbHnB 8\@h S]8 j@ Ix(gRN \px8xNqrs2Z\ 䁥3|bB`9'{VϹK(sYED8D4D8 ǬnWxOr%qqrs4\0bFXYɶnG<'QMhIjbq3յZ|猺j䁥2>xNHQ"&XM"%A'XH` 8< 8G!V܄p%@ AVq2@ԁ.QΤMv):S ʶ@,H$S]0Dvp$8 <'16| +s5 +ٺ;D"O?\d?*/"~MDZA/  8 @!!4e5ZIyb합:eǢd r1Nt@~(`@& "D.dbɋb\cqc q-|Veǣ M?f;񶦭˚g-nܠSnzM1sճ'Fֳ|nPf)܀ny2، k?/܀`gYz'Fֳy2?#nZ6Vݩ.f;Xag&ٺӃ,<"pٻoǰAσr[8ՙG^ׄN/qob0N(FX[j96?#Rs5ॆ/qob0N'q\CvNpsY[7(3G8begjsv k ,7Ap|!bIM"Jb$Xbث1cq^ | ܼn Qь#ej`Fp5o|^7mjGYɶn -q?̪e$Py4)jޛ_qj"8Hg7\|`_;5o8ՙeip $7qؘ4<,# Z2mܭb`@44 V3VSx+8D@f b7+|P+8 44`lFo8< 0o4G( ?櫥x27k'wK|'ɳt fvGF02>ܠSb0e6\NNn_5o ;#X]5ymaf?N`6V Xy.dA \S,\"G\_;5ojeo \RYx Ae;\Grg;]Ֆmj)xot0lZU2Hi.)jޛ_qj"8Hg7\|`UtY.X̭N.XʮM^L#=-7A  a2n~;Sb0N'ܠSb0e6\NNn9|վ7(3ct櫤af?N`pM[)aX~XEH _,\"G\_;5ojeo8͖.),n Qь#ejA6p5o|^7mjGYɶn -q?̪e$Py4Yk=c7[?CR0I VfKϜ0`ʮq3{ٕUɫɖgef?;ew~LxV،Iׂ7WKjeo8͖.)- l#nrǟQь#e7(3c>\[r1N1M^jGYɶn -q ոyA$L"TPw2n7sj|nŶ2 V^M;-žջaV˂iڇ"[y1iۭN7(3R-`0Ӄ+)7^% 6]ғ0~rsjn{ l=8F6?eO-lښŽKzgu!r :S?ĶbqZM\\jyFͧJT,\"HLd.$&3|/ll̜MW>各XA@(4D8 q\iHD@@Lbsٕѵ)H44@?gX\17.Ւ^פ $@@LbsܻVI6 (@@LbsܻVIiH 44@?gX\17.Ւ8 g*+@A4R&XLLQ>lX[ s!9gwZ6-_8ՙMUUUUUUUUUUUUUUUUU%57=sVp#yZMUUUUUUUUUUUUUUUUU3\xsH"A!BqRTbs "(DAЉ:A"EBɒ$]*HɄɊ bs ".b *H%$(T "D$A"buDD$H%$(T "#@QUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU%VpK6ښk3)Cv8isټeV σ<𚪪 *Dm 2fP+DF"` 歼H"A"$TM qJ ?& Y6w33jYTWt 96zIZ o?AD@]RL/!:Z E#L&PM1EK"%{W/kk)ryxp0(DH"A"$TM"EK?֕@ LR%K`q2@ԁ. &Į'.8 96zIZ4+DF"` 歼ewb.|DqOt$*X@Pqҳ *Dl&Hq\M &PM.LNDF"`azO P8`+o?&, ՜g|վS1j5UUUUUUUUUUUUG*+̭%.N`8Xjv$,, o?'lBRp9{jޭfV'FԣmZV+?& Y6w [_j5UUUUUUUUUUTG.<;0E q"̭%.N4RNA[L=V㝹N,+?ud4$\y$@PDbsÖɊH @.,, 歼fV'FԣmZVqm:E2:6R͸ ?K5g(Ֆ8ՙUUUUUUUUUUUUUUTG.<;,\"ɤ@E17.ՒMFXEH \"j`ibsǙ2 I43gX\biHH xbqa`_5m⢺%`,TTIG :bB/AD@]RL/!:Z E#L&PM1;iQD"Y(HH6tn[v!'M,7scVfNc7olZMUUUUUUUUUUUUUUUUUUx2:6UjҼXX[y7517.Ւ^B M˵da ܻVIPrY# Ņ|շ@ LR%Kiay a L)"g@2hPcM<(DKM[̯Rښr Veǣrׅ"8Hrhh<|jܮss6Z))i7 ?)H# HRO6iY'lRڛg^3zm~Ӷ&vqg7#ļ;w5fn[c|aշzpVg7#O.W<90ß&ڲKPVj/k%`P+‚a17.ՒMp17.ՒMpV,-w48Q\9bn]$>&ڲL3%`P+F*+?B M˵d1AZbn]$q+bPWq#Cq,/BGo?AD@]RL/!:Z E#L&PM10P+iQD"\jƬ͆`Λ^OfWrtmMk9kfy2، k HD$Hٔ{s Ұ440<ぁB':A *@( e"EK?ۏ6͸j,Ϛr1NM˸0{ǜkht{3>FZ9x.vCj"UA!BqRW VαrbuYf'YNfV'FśŅN㱸D#Y94Q\9bn]$ aAZ嘝 ×ЃrY%qD#Yi⢸s ܻVI6Ņ2NAvl27t1:?TW~j0ϋ aA[ ØЃrY&f'CqЃrY#x,nsB M˵d07!f'CqscP LR%K `AMY\Na A0l8e&f&嘚 bh0Yp&PM.Lik@cN רk&'0cPk ,7A'0Yk,\A2M 14bg:@Ob.|jT *Da`  X8`ɫ+:5rm,,\A2M 14b|S" @2hdre'NZp]vN7&V *L9"J$LP 歼d*[Md ceH: E"` #4(Y.j&ڶ޽2Hi"P3]O707@O4`PNDD,$HHRO?q,/B)Z$$T < rE,A!BH <00[y "T)&- &t(&E (ƚyQ,5or[{+x،I{,,s$&q@ve<^벴 4OぁB':A *@( e"EKpԳn}ܠSrmLq.3'7憀!#Cu[,\i7Xag&ٺI8>q\FぁB':A EȞMUUUUUUUUUUUUUUUUUUUUUUUUUUUUU%7qt1ql-ܧjrL𚪪?q,/B)Z$0(@0_5m&PMQ0G !TW~eHy(Ņ|շ@ LR%K`q2@ԁ.$MvgrƠYɶnN`mqUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUQY#{veqq#Z;Nvn`q_(/z[#)5UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTazO BF *&" SH$HȢD.(g ‚G&PM uX**%& b[y "T)&- &t(&E hup훠f{N54]kkuh 'M< &`A54 k=N,7qj^7xN(k1ri߹VZ  @Dv!34wnڶ r sYEp 80  ǬYǕ+N// ^~< YkjeyYD 7A#^ВjbHp!jڈ89n C!_^H8"X2 0jZykCn;0.v@ܬոVW^0^.lxqj/tEnZyÚX0DyZstս,&aAhP=9 ĭh gaj)6*q/ӂڲ ׹祝t>z!uUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUL:~$8~ 8Z-&H,T@|E pPZ:)&?a;  @0`V܆!t(ZƁdN:▽KzhCdf3`Y. D"PYq Y>gAZ@+,@p0%aaշh9H$PM94+$(oRޚbY3BB>M94+$h,*^']g&霚Z-顤[B4P0X?ι;3~ 3B͇sVYɺg&{,]g&霚XaV M94+$)`97LЯ`I`?{]g&霚\̙?JW5lٰj+$)+ѡqVI J4h4(ɑ]fZXX4(ɑ]fY+$)+$d.qab:d1K-Yk[6l;صejHQvū-k 7gVZ֤lZְѠУ&GIvc vū-kRB-YkXX4(ɑ]fYbՖ!E 2:K;lX?ι;3~퍾yaշv:HQv1C]Β]hhQ#SͅYco$(cohQ#Sͅv:HQv0H4(ɑ]fYuqɜcU)~lw5mMW,mje#o40n*rFI &R6AFLN67gje#oU)xhQ#Sͅ5\B唍 2dtjv8ٰVs?w2g#т6[{?F$(z0@ `yRB hhQ#SͅYz0@!Cт,d.qab= ^TB%ڝ6l,U\̙?IWW6l;BF Y+I *ʍ 2dtjv8ٰ?qi!E\yQ`У&GIvc g<$(* 2:K;lX?ι;3~;Q͇͝sV>w;Oڎlh?Oڎlsq?j9AFLN67g;Q͝B|'G6v,d.qabsq?j9HQϝ У&GIvc g3s&qZyaշh B@Lh?ր$(ƍ2:K;lXU@NZbFLN6*'I -0H4(ɑ]fYuqɜc8/6[{?8/I Jp\h?8/I Jp\hhQ#SͅY)zHRSFLN6*N BB%ڝ6l,U\̙?JSlg6[{?6th?6thhQ#SͅY)3%6bFLN6*M$))3B%ڝ6l,U\̙?Igq͛歽;;$(ӳ7gNI 4#FB%ڝ6l,n*ƒiEB%ڝ6l,U;;$(ӳAFLN6*c?UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU3v>R@}=牶\u֠g+wOts&@sgdΒKzhp`Q#S͇ͅsV"d(WɒCtπ)kԷE%-{zТ p@ $X…LJL:3]UUUUUUUU3v6;Mꪪ;3JZ-@)^ <, ͛歽Is=b"cH1 v,XawYV}^`riz8<" 3)E$\"  1AZQO8PIP0K 歽Is=b"cH1 Px x SHQ6f-fRqTYuR>x XYs&qqrnɡ^P++Yɺg&{@?qrnɡ^]g&霚6mV$KH1 1@yc08fDbsV/iMYɺzKzhy^4A f.Fo8oRޚdΐH4DU %ڝ6l6[{?$XE,X  3I.~G L@$ A^,}M]C5o;xq %#O4^JZ-GE hpxDc?{hMYK[?(D\ &H8 "qgJg[uhMYK[?8PVnЛ\D bہ,,;R qɝ!F$Ip`Q#S͇ͅsV!ji 4&,%N6*?ιA!?i[?{DDL$Yug㹓8J歂X.صelٰj?#i& Xr&4,p@y|X,Ȗ,T82:K;l36l;%2ZD 8\"._,Ȗ,TYE;Fϵ%|u֦sV|?i퍾cSU(oRޚ؈JA x/E%|PAN,@" ,DYs&qipP+Igqa#S̓3fùog\c%@ycȘ L@<<ءryD'&GR׷oM"ZҒ&ivwpxDgS8H `" a3qɜc8/ZRa#S̓3fùog\c%@ycȘ L@<<6WI )kte'gmklmA У&GIvc  6WI Fֶƍ ;3~VZ͛歽BAN]jZZ̙@Vd͛歽B7Jl N&Hp, <ŝ)"/.'SgG @:Bx3 bہ,,;R qɝ!E4h`WG+n̤bfl?歽L+l rR)J止\\թqsVHR'S2g}Ys&qҕ[6l; +1:JW5fdΒɣ6[{?qsV +):H"JdP'tr7( vz0@&Ma(+u ñ npH3ɜcqsV͛@W5jE)\\մY+".j D7JfRqTYl:s\ 22E*l)"H(.;MhT74B 7429RmE"H1 * {NϵIЊbx)+ѡqTqJ6V?$Y\ 22E*l)"H(.;MhTҊhD 8`@DPXMep>}Sgps?4+ܮz7Jl N&Hp, <ŝ)R׷oM-K\6p(-K\3 bہ,,;R 2gHQK\3)8خV @@a"N"Xdfl is[?ģmlW=ɺS2ѰH$d.qa`V0=tS:64h`UqɜclZֶlw5mW'Sgt2E+dN,LnPA`yqש&OB*\qS:62:) J4h`U:HxHe"d(TREȐ*P$\,v=q!,p2/PZ|^"< "F6]ΒR׷oM$h gh#|.I &1퍾cF Y3唍R׷oM`@V1je#oAq5\7c?̙}%|fP+]ΒMco|d0&R6ټ U)}$3唍UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTyw=;࣎Ӂzo ]xFy M˭zje#og)ϰAuDBZmA+QM8>ש Xf'zmx.z [?rObwН󆥭sj`7ټ 8/I&1y!(c(Tս5yK^ޥ4<hz# ,vxNճ^5mgש&O)kԷ={G4AtRMcoN gJS&Im8ӳgIgqEN^.|RH"J6r$  O)kԷ,@vSGR L@<$ʇzmC-hӁznH?Ãs8< 0D!lMcoƝƒR׷oM$h gh#|44h#|4#F Y3c:HQK^ޥ4"Ń EY3c:HQ4g%6cF X&qIgq͛@gqAqgqg8)3͛@SlgI&1͌*X2L[Z'[Cy.ש2 l@ |jw\[?sVڲ  pm9V1+Za#ZbQt E pPY(DSaI"@@pkD򖽽Kzhq"Яf A3H3c3H"8.iAqgq41|)4&GR L@<$ʇzmC-hӁzgkD򖽽KzhqJhWq3LdE$F6gJSlfi褚3;;91}vwY E pPY(DSaI"@@pkD򖽽KzhriE4pE"0 "LǬ&2ց8>שi89('  J  T2$TX[?J0SJ'v7N[by|VA`&^ 碜#NhU ĭh ^.|RH"J6r$  O)kԷ<%"@2eH0HCHc RR׷oMѡqSH4G (D 8`@DPXMep>}RLMhR׷oM2z%"@2eH0HDq3LdE!E-{zЍ7G4,G :HxHe"d(TREȐ*P$\,v}Sgps?MM Ҋx Yb ._ @)E"XR:3]UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU3vH; 8esjk7)|~meΠ[ǮSt&$P<" atU pBK"@E@X^ f:D 8`Q#Sͅͳj{-".DƑb/6~( Л\D |NH_6"< 0Hq|pH[^iZwn fռFw(~] g9]Z %vϔڲ֠fYE (x`2SX G sHA(sƟk>z& 4[by#D4#սGIu`M<3QPZ-*H"%H1K(<@8<" 3xnh"{E(@࠴tR&HQgnh" \^Ep;$8~ 8Z- E` `O,&lxJ\*n Xڲ֠f':5[=-[`Mc磁"#YNnY|?T󆫔ωZZBũ޴st<"}t[`s,"} 4JN; s0_ sn^ ܐ=rgajYNnrJ0_Os7<"}t69/׸p$2%_Bx $LAB,@1<`8HX/ׂf}lI"Px_P3oqJ5]-;l5[6 OtZ58j:K<վH_6GuX.L^ٺ +{v>ٺjމp4Q䋣ӛJ`;UA+ *gmA.q=,qֳڌ$v;lT'q pRM'lmڜO5]-55uZ8bW^zĭ6_S!hNs65o>+qm`@1Ե[C]s'7A,%h[`j fme٠; ÚJ.H+Nn%6 +JNڠk_*Xc巍wf[75m<"}ttiB%įy$/M7M^j}ixf&Wt `I5o$ s ` =t)k^UA9Al;xO>v-Npįsp@ `@?Ra('3vMxDj - {JTcdP'GBqK^ޥ4,e+mPJ.HY{zK6A5\lX࣎Ե[C6MW,-{zЄsL4"< fL#(bxLDT!|Яl;Z-8NV VYh \1#(`(0?ˏ"pP  T2$T?ˏ"p#xG.HI*@yEJ3$H H"P…BDKw;̕0HA⒜\a[h.x>G?E;F8nzk R~MtkԷ3k8'{;Q͝Slf}xtІCu'*"`Rɛ%8獳·+Z\}~7( w/.p@'f?R׷oMfשpNzMc4 Ћ5 o)|QL))Kn:SVx[N0=j mVZ¦Y֠ZxЛ3VZ̕0HA⒜\¬04J֗|#o" ˚83JPlmkls86vϚɧXk?ǽz0@|u֦7,%{S:6ZYd![.:񰛠K!佦㮵XVڠ?,DXoq#,Nz;Nvw5o~׶\НWo4R:f`sV1u[. 1m佦㮵8ܠ)ޤ.[>Ja# )į;Q ;:6箂xetfsjnz'[#N{j`;o:6oRޚH\}ـ!y/iNVئuZ f^QkIqy A0X `·@M<Ė`vϯ9so;zpQ=mzշU`떽GNnogڜG naWKZ %3W^;ޣ;[ιk jj:p& \7L3k # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_modify_efs =head1 VERSION Version Number: 1.4 Last Extracted: 5/3/16 18:54:04 Last Changed: 4/28/16 05:58:06 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_efs.sh, hacmp.assist, 61haes_r721, 1618A_hacmp721 =head1 SYNOPSIS clmgr modify efs \ [ MODE={ldap|shared_fs} ] \ [ VOLUME_GROUP= ] \ [ SERVICE_IP= ] \ [ PASSWORD= ] =head1 DESCRIPTION Attempts to enable EFS for securing file systems. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. mode [REQUIRED] [string] The manner in which the keystore will be created. More specifically, the location; either "ldap" or "shared_fs". 3. vg [OPTIONAL] [string] The volume group where the keystore is to be stored. This option is required for mode "shared_fs", but does not apply at all to a mode of "ldap". 4. service_ip [OPTIONAL] [set] The service IP that can be used to access the keystore. This option is required for mode "shared_fs", but does not apply at all to a mode of "ldap". 5. password [OPTIONAL] [string] The EFS administrative password. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_modify_efs { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_efs.sh, hacmp.assist, 61haes_r721, 1618A_hacmp721 : INPUTS: $* typeset -n properties=$1 typeset -l mode=${2//\"/} typeset vg=${3//\"/} typeset service_ip=${4//\"/} typeset password=${5//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -A efs_attrs CL=$LINENO KLIB_HACMP_get_efs_attributes efs_attrs #================= : Validate input #================= CL=$LINENO KLIB_HACMP_is_known_efs if (( $? != RC_SUCCESS )); then CL=$LINENO cl_dspmsg -s 129 cspoc.cat 75 "EFS Kesytore is not configured.\n" 1>&2 rc=$RC_NOT_FOUND fi if [[ $mode != *([[:space:]]) ]]; then if [[ $mode != @(l|s|f)* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" MODE "$mode " 1>&2 rc=$RC_INCORRECT_INPUT else typeset -u modeUC=$mode case $modeUC in LD*) mode="ldap" ;; LO*) mode="shared_fs" ;; F*) mode="shared_fs" ;; SH*) mode="shared_fs" ;; *) /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 '\nERROR: invalid value specified for "%1$s": "%2$s".\n' MODE "$mode" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "shared_fs, ldap" 1>&2 rc=$RC_INCORRECT_INPUT ;; esac fi fi if [[ $vg != *([[:space:]]) ]]; then if [[ ${efs_attrs[MODE]} == "ldap" || $mode == "ldap" ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 36 "\nERROR: conflicting options were provided,\n \"%1\$s\" versus \"%2\$s\".\n\n" "MODE=$mode" VOLUME_GROUP 1>&2 rc=$RC_INCORRECT_INPUT fi fi if [[ $service_ip != *([[:space:]]) ]]; then if [[ ${efs_attrs[MODE]} == "ldap" || $mode == "ldap" ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 36 "\nERROR: conflicting options were provided,\n \"%1\$s\" versus \"%2\$s\".\n\n" "MODE=$mode" SERVICE_IP 1>&2 rc=$RC_INCORRECT_INPUT fi fi if [[ $vg != *([[:space:]]) ]]; then CL=$LINENO KLIB_HACMP_is_known_volume_group $vg if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$vg" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 160 "Available Volume Groups:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_volume_groups available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND fi fi if [[ $service_ip != *([[:space:]]) ]]; then CL=$LINENO KLIB_HACMP_is_known_service_ip $service_ip if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$service_ip" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 156 "Available Service IPs:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_service_ip available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND fi fi #=================================================== : Enable EFS if no input errors have been detected #=================================================== if (( $rc == RC_UNKNOWN )); then typeset mOpt= vOpt= sOpt= aOpt= [[ $mode == "ldap" ]] && mOpt=" -m 1" || mOpt=" -m 2" [[ $vg != *([[:space:]]) ]] && vOpt=" -v $vg" [[ $service_ip != *([[:space:]]) ]] && sOpt=" -s $service_ip" [[ $password != *([[:space:]]) ]] && aOpt=" -A $password" print -- "$0()[$LINENO]($SECONDS): $HACSPOC/cl_change_efs$mOpt$vOpt$sOpt$aOpt" >>$CLMGR_TMPLOG # Always log commands $HACSPOC/cl_change_efs$mOpt$vOpt$sOpt$aOpt rc=$? print "$0()[$LINENO]($SECONDS): cl_change_efs RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 400 "\nERROR: failed to modify %1\$s.\n\n" EFS 1>&2 rc=$RC_ERROR #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== else if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_efs_attributes properties fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "modify efs -h" "EFS:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_modify_efs()"  k(3+,?bbb&,? # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_eventencyur#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2018,2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_event.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2012,2013 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_event.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_modify_event =head1 SYNOPSIS clmgr modify event \ [ NAME= ] \ [ FILE= ] \ [ DESCRIPTION= ] clmgr modify event \ [ NOTIFY_COMMAND= ] \ [ PRE_EVENT_COMMAND= ] \ [ POST_EVENT_COMMAND= ] \ [ PREPOSTFAILS={false|true} ] NOTE: the alias for "event" is "ev". =head1 DESCRIPTION Attempts to modify the specified cluster event to conform to the provided specifications. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the modified object can be returned to the caller. 2. event [REQUIRED] [string] The label of the event that is to be modified. 3. new_name [OPTIONAL] [string] A new label to attempt to apply to the specified event. 4. file [REQUIRED] [string] This is the command or script to be executed when the custom event happens. It is a required field for each custom event and cannot be changed for predefined events. 5. description [OPTIONAL] [string] A description of the event. If not description is specified, a default will be provided. 6. notify_command [OPTIONAL] [abs_path] This is an optional command to run both before and after the event command is executed. The main purpose for this command is to notify the system administrator that a certain event has happened. 7. pre_event_command [OPTIONAL] [custom_event_or_abs_path] This is an optional command to run before the event command is executed. This is used to provide pre-event processing by the PowerHA SystemMirror administrator. Multiple commands are allowed and must be delimited by a comma. You can also specify custom events, and mix absolute path and custom event names. 8. post_event_command [OPTIONAL] [custom_event_or_abs_path] This is an optional command to run after the event command is executed. This is used to provide post-event processing by the PowerHA SystemMirror administrator. Multiple commands are allowed and must be delimited by a comma. You can also specify custom events, and mix absolute path and custom event names. 9. prepostfails [OPTIONAL] {false|true} If set to true, failure of any user supplied pre or post event will fail the event and skip any remaining processing for the event. Default is false: failure of any user supplied pre or post event is ignored. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. function KLIB_HACMP_modify_event { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : INPUTS: $* typeset -n properties=$1 typeset event=${2//\"/} typeset new_name=${3//\"/} typeset file=${4//\"/} typeset desc=${5//\"/} typeset notify_command=${6//\"/} typeset pre_event_command=${7//\"/} typeset post_event_command=${8//\"/} typeset -l prepostfails=${9//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset -i PREDEFINED_EVENT_MODS=0 typeset key="" TYPE="" for key in COMMAND NOTIFY_COMMAND PRE_EVENT_COMMAND \ POST_EVENT_COMMAND PREPOSTFAILS do if [[ " ${!_ENV_ARGS[*]} " == *\ $key\ * ]]; then PREDEFINED_EVENT_MODS=1 break fi done #================================================================ : Assuming an object was specified, see if it is a known object #================================================================ if [[ $event != *([[:space:]]) ]]; then CL=$LINENO KLIB_HACMP_is_known_event "$event" "" TYPE (( $? != RC_SUCCESS )) && rc=$RC_NOT_FOUND fi if [[ $TYPE == "CUSTOM" ]] && (( PREDEFINED_EVENT_MODS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 9999 '\nERROR: one or more of the specified options is not compatible with "%1$s", which is a "%2$s" event.\n\n' "$event" "$TYPE" 1>&2 rc=$RC_INCORRECT_INPUT fi #================= : Validate input #================= if [[ -z $event ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif (( $rc == RC_NOT_FOUND )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$event" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 170 "Available Events:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_events available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi if [[ -n $description && $description == *:* ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 103 "\nERROR: one or more invalid characters were detected in \"%1\$s\": \"%2\$s\".\n\n" DESCRIPTION ":" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $file ]]; then if [[ $file != /* ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 106 "\nERROR: the specified path does not appear to be in absolute format:\n%1\$s\n\n" "$file" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ ! -e $file ]]; then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 107 '\nERROR: the specified path/file does not appear to exist on "%2$s": %1$s\n\n' "$file" "$LOCAL_NODE" 1>&2 rc=$RC_NOT_FOUND fi if [[ $file == *[[:space:]]* ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 108 "\nERROR: the \"%1\$s\" attribute's value contains whitespace,\nwhich is not allowed: \"%2\$s\"\n\n" FILE "$file" 1>&2 rc=$RC_INCORRECT_INPUT fi fi if [[ -n $pre_event_command ]]; then typeset cmdEvt="" for cmdEvt in ${pre_event_command//,/ }; do CL=$LINENO KLIB_HACMP_is_known_event "$cmdEvt" CUSTOM if (( $? != RC_SUCCESS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$cmdEvt" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 170 "Available Events:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_events available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_INCORRECT_INPUT fi done # End of the event loop fi if [[ -n $post_event_command ]]; then typeset cmdEvt="" for cmdEvt in ${post_event_command//,/ }; do CL=$LINENO KLIB_HACMP_is_known_event "$cmdEvt" CUSTOM if (( $? != RC_SUCCESS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$cmdEvt" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 170 "Available Events:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_events available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_INCORRECT_INPUT fi done # End of the event loop fi if [[ "$new_name$desc$file$notify_command$pre_event_command$post_event_command$prepostfails" == *([[:space:]]) ]] && (( ! PREDEFINED_EVENT_MODS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 401 "\nERROR: no valid modifications were specified for \"%1\$s\".\n\n" "$event" 1>&2 rc=$RC_MISSING_INPUT fi #======================================================== : Modify the event if no input errors have been detected #======================================================== if (( $rc == RC_UNKNOWN )) && [[ "$new_name$desc$file" != *([[:space:]]) ]] then if [[ -z $desc || -z $file ]]; then : Preserve any pre-existing values typeset -A eProps CL=$LINENO KLIB_HACMP_get_event_attributes "$event" eProps [[ -z $desc ]] && desc=${eProps[DESCRIPTION]} [[ -z $file ]] && file=${eProps[FILE]} fi [[ -n $new_name ]] && new_name_opt=" -N $new_name" [[ -n $desc ]] && desc_opt=" -I \"$desc\"" [[ -n $file ]] && file_opt=" -v $file" print "$0()[$LINENO]($SECONDS): clchcustom -t event -n\"$event\"$new_name_opt$file_opt$desc_opt" >>$CLMGR_TMPLOG # Always log commands eval clchcustom -t event -n"$event"$new_name_opt$file_opt$desc_opt rc=$? print "$0()[$LINENO]($SECONDS): clchcustom RC: $rc" >>$CLMGR_TMPLOG # Always log command result #===================================================== : If a custom event was successfully renamed, update : it in the predefined events, too, as needed. #===================================================== if [[ -n $new_name && $TYPE == "CUSTOM" ]] && (( $rc == RC_SUCCESS )); then typeset predef CL=$LINENO KLIB_HACMP_list_events predef TYPE=PREDEFINED for (( i=0; i<${#predef[*]}; i++ )); do typeset -A eProps CL=$LINENO KLIB_HACMP_get_event_attributes "${predef[$i]}" eProps TYPE=PREDEFINED for key in PRE_EVENT_COMMAND POST_EVENT_COMMAND; do if [[ ${eProps[$key]} == $event ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 9999 '*** Updating "%1$s" in event "%2$s" from "%3$s" to "%4$s".\n' "$key" "${eProps[NAME]}" "$event" "$new_name" case $key in PRE_EVENT_COMMAND) clmgr -T $CLMGR_TRANSACTION_ID modify event "${predef[$i]}" PRE_EVENT_COMMAND=$new_name ;; POST_EVENT_COMMAND) clmgr -T $CLMGR_TRANSACTION_ID modify event "${predef[$i]}" POST_EVENT_COMMAND=$new_name ;; esac cmd_rc=$? if (( $rc == RC_SUCCESS && $cmd_rc != RC_SUCCESS )); then rc=$cmd_rc dspmsg -s $CLMGR_SET $CLMGR_MSGS 9999 '\nERROR: failed to update "%1$s" in event "%2$s" from "%3$s" to "%4$s".\n\n' "$key" "${eProps[NAME]}" "$event" "$new_name" 1>&2 fi fi done unset eProps done fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_event_attributes "$event" properties fi fi fi if (( $rc == RC_UNKNOWN || $rc == RC_SUCCESS )) && (( PREDEFINED_EVENT_MODS )) then typeset sOpt= nOpt= bOpt= aOpt= pOpt= typeset -A eventAttrs CL=$LINENO KLIB_HACMP_get_event_attributes "$event" eventAttrs if [[ $notify_command != *([[:space:]]) ]]; then nOpt=" -n $notify_command" elif [[ " ${!_ENV_ARGS[*]} " != *\ NOTIFY_COMMAND\ * && \ ${eventAttrs[NOTIFY_COMMAND]} != *([[:space:]]) ]] then nOpt=" -n ${eventAttrs[NOTIFY_COMMAND]}" fi if [[ $prepostfails != *([[:space:]]) ]]; then [[ $prepostfails == @(y|t)* ]] && pOpt=" -p 1" elif [[ " ${!_ENV_ARGS[*]} " != *\ PREPOSTFAILS\ * && \ ${eventAttrs[PREPOSTFAILS]} != *([[:space:]]) ]] then [[ ${eventAttrs[PREPOSTFAILS]} == @(y|t)* ]] && pOpt=" -p 1" fi if [[ $pre_event_command != *([[:space:]]) ]]; then bOpt=" -b $pre_event_command" elif [[ " ${!_ENV_ARGS[*]} " != *\ PRE_EVENT_COMMAND\ * && \ ${eventAttrs[PRE_EVENT_COMMAND]} != *([[:space:]]) ]] then bOpt=" -b ${eventAttrs[PRE_EVENT_COMMAND]}" fi if [[ $post_event_command != *([[:space:]]) ]]; then aOpt=" -a $post_event_command" elif [[ " ${!_ENV_ARGS[*]} " != *\ POST_EVENT_COMMAND\ * && \ ${eventAttrs[POST_EVENT_COMMAND]} != *([[:space:]]) ]] then aOpt=" -a ${eventAttrs[POST_EVENT_COMMAND]}" fi print "$0()[$LINENO]($SECONDS): clchevent -O $event$sOpt$nOpt$bOpt$aOpt$pOpt" >>$CLMGR_TMPLOG clchevent -O $event$sOpt$nOpt$bOpt$aOpt$pOpt rc=$? print "$0()[$LINENO]($SECONDS): clchevent RC: $rc" >>$CLMGR_TMPLOG fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "modify event -h" "EVENT:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_modify_event()" $s"  l>\*3+Sbbb&4 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_fallback_timeryes  = eirst"$CELNR_acdfhlmnop)-1AGIMOST[\]uy&(,./2:;DHPUYbgkvw#%034>F{}6Yo `wr.,muitZ~YZZ6dySX$1'XVyQ3Q1VαUCӭVj$P@s/MūX朋Zyм FdCBѥdߌaI$S Md &I$S Md &×y04H@  j7I"h ɧWwb#/0801:i`@Bڊ MCR$"AbJdڬb..dg[QYINΒy3N a<, %]Ybw   XHԮK:-8` <C0  $Z yv.+R-jD$+J#lht:MpX)@*/F@(1q%"@:$&$1&MͶ*NFath+ie|-jRTVihY\!mEfE($TXC]dͶ*NFx Y93∐R`p?2<,,xnB΅Epx33_ (@j&XF`pPx33_ (@jZ(6!a`.M:Uj?A5,BA@fg1Lbe  !DI  6q„f€]aDv6l(R+M`ff(Yf#MͶ*NFgkN9̬vgVNFgV`~ T$$XD\~I}ZG⼙XYV\_WuW1&"G⼙VO;@Bڊ(DL)+ceeD(KQqd?;J<#9oZR]ƫըǘ2 YVܣMnr3iiap,mWTf1˔,Hd3ff嚎q_j.jT'#>V:qXކ^4&<;[ޞ]sSX&e9Əz4z@LPi7^+:0PwG8)N,ruUVI:- #zŎNjNq^V7 ks_E=n^ &T0;[^L,t]X]gM-U j+0?@($(""%N3ujVoRNƔɬRv4zo᠐H mHYR4"!kE7Ċe鸵k6\ӑvVO:ANY<HTDĕq$ɵYYV\]ZC"IK H$HPB,] vq$t?ñΒy 5``Ɩ]ꈐ@<ę6+6تˋY9ѠqIRX =EfCp&$&Xvx?m5;7(~4z805&jѩ3XCߍ#\V`|?m5yڴV ߍ#]*j MF UUEvx8`|?m5xp 0p`>6iIUC MFV,p80/DȨE$"L#\lYw֚c 6j4?wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwpj+=m'bƻfX/MŎkd2O %gI4S)ʈ6j"̝8HNxT"T4hV?xYYƦP[8T"I&EQDLA;8HHӳHhP557s?ñӎrvU 0䰫q?wwwwwwwwwwwwwwwww~4q潞 P N6iuVߍ#\tX&6iALRd/ӼJdo*-zeBSoƑLeJ!0Y:r`]Tfǀl@ T( ‰l(4Pi)7"%ˇ1!iT8ɑ!Z8HNբ ~hg׏ ƍ]HNծyڴVca$LjGܠ:$LDz "ʑ+ 0*(Q@N,ܘlz?̢`8; 0} a(ayڴV;  YMk} cDȨTKg2**L+8 Y1,٨;0} :aӳaX(+`+B 8Vxxi`@l?潞 M($h(źF6iyڴVUvԎ{;Vj'axA5R@nիx|?wvX(H yڵa (H yڵ` *wvX/x& 7qjՀo@JǝVx|? &ETj yTDI;Vx|?(eR@nի(*wvXNATjǏ%gI4S)ڬQ(-z "Q-DȨ2Jǂs:P; 7&15y3(>LCtçd&XG8vǃa YMk} cDȨTKg2**L+8 Y1,٨;0} :aӳ& D &A@Jg (  @LVyTD X+=2PVx(g@"eI&$&Z^6iD )y2%D ^ %D ^XDMB/H@HP@ߍ#\@[<$0&+'CP[LjZacaDu50.,;0XP6racaEV'kxB`nHV¹f2iɔL@XM0-* @S,"&Q5BB2 @SQpHTM1TM1HLbI %ˇ1!iT8ɑ!Z8HNyFcr l,mWTf1+Y5.4hV?Xگ2b/g^eQ\gH&e5U>A"dTT%H&T\xNqQQBrtaf0f&e6^`@`@i`t@hyFcr`@l?JHhS]XP[L&EEJ[=QReHYRɌafF ya DžaX(+`+Nǃa5ThQDP,$ĄCC-0H*yFcr?Za[_0N *P Nq,mWTf1+Y$)mV(S=QRA"dTTR%pVprcYQv`tçgTM1Y& @P+<%D gh&QYD* @P+<!YHP@`@l?z*I4 ((TbBee̡̡SoƑ R*Y!0Y:rg2**U$L*D 'H I!K<$0&+'CP[LjZhZM8l?m5QRC Rat1>@.fX-u\b.ٳߍ#\D)gdc} c]vRZW ,o;V6pk"AD,T` bAlu0P ٪V3 ]j8R+Mg MFQTD EHko I!ERB I!HkoD HQTQRMFe,"!g(a!SoƑ9Q $(HY∐Q!Hɜ|sZ̙]˗Ϝ_էwPØdɐE#8NN7_եF#3V,f<>yZY1fZyڴٳZil$LjGܠ:$LDz "ʑ+ 0*(Q@N,ܘlz?̢`8; 0} a$ >q~+Vc&e5U>A"dTT%H&T\,ܘlh>0xVY`@l?z*I4 ((TbBe,?#~4qZUZCuZ*" 7ZYb3; @Big06w< E%!ER@o/jE6we," 7_եզ͝DH( 7igl7A+="IMvbAlu3H*l&EEI"W<aTPܝY1,٨~+əE8<0pw8`8æ;Q$H+|Vǃa YMk} cDȨTKg2**L+8 Y1,٨;0} :aӳM)HP+< E%!@e,"Vx$HPx0 6{=D$Q *I1!2hfPfP PӒt[YPz+S^L,ty3ʼ˻ g._>r3$p>2dndV?JHhSR$"AbJʊ˪mq <ޢ AJƍ9g,4bfPK7&y:wwwwwwwwp9r3>r3̙]aL0VN1Gܠ:$LDz "ʑ+s:P;[ug"±op+~o Iak 2EJL-Ź3~QS(YPiA41Caj Q(-z "Q-DȨ2J!EE (8<0vѦ}>q2@L:vq`@l? Rat1>A"dTT%H&T\x,@ai6q6تˋg@tx0 6HXai6q YM`JDuDH LIVJͶ*NFtZM*aByX$? x8maV\4?aɜ|r I[sd; Ir}edɐE9;\q<maV\ev0~rvACBg._8ww@è8ɑ!Z 5I (S=QRA"dTTR%pX$~qQQBn,ܘy3%֬vgy3(> 0N>r3;  ׳ARd$I&$&Z9rsx5<BKbBҨq#s&Caj Q(-z "Q-DȨ2Jǂs:P; 7&15y3(>LCtçb%=Lx0 6^QI&EEʒLHL?ٔ!&r'MV8@F{tc;(IrHZU2dndV? Rat1>A"dTT%H&T\xNqQQBrtaf0f&e6^`@`@i`t$#{tbv<g@"eI&$&Z9rsix .\9 JL̙]aL0VN1Gܠ:$LDz "ʑ+ 0*(Q@N,ܘlz?̢`8; 0} a"ALik $(YRI 2?\96̪լ #=*kwPØdɐEdc} cDȨTKg2**LɌafG^L,l<f0؁EJU&Q29ǰ^eWvk $(YRI 2?wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwpɼę7ըb./NF|{iaⱋWXg Ϛޢ P O4?Qv%gI4S)) 1%EUYYV\]ZUYTcL'#3UYZfLV,udfլ]DD X|!&ri;ɐE/3iL;<Y9k:DA._gk2gyڵg'#5VgB&XD>6̪լɜ #acjʮՎ:{ίs8yAmmwqgX? &XECnr3}乼r٧ZCux!s'#n,/UsqZm s>֭g!SUWG⼙X 02ǃa5T"I&ERI 2˗,mWUǝY8!; UUqj`hE$LjGܠ:$LDz "ʑ+A9EE (ǘ&*uW*Z;V6ը0} ZBT+y3(aӱLeq{=D&HRITbBe̡3~QDS(ը'kx$$is$)2yTP(Q$HbNFoܗ7[4 V87w>r39լs,mWUǝXxܓ`0&EEKHX6yuCe$T1v'#7nK-}?n,/Uwv6l+Q`;ZMV;\V=fQ`,çb( TDz*LR"$ĄCBg Ϛޢ P O4?QvN8HHI4S(d$Q1CH $P۬y.oiqyڴټs96̪լsYՎbզ!s'#֭g!SUWG⼙X 0؁EJUD ǃa5T"I&ERI 2?5DL L4hV?ߜqHhPIQ@bFg,I"Y9r\9l-X㧌";Y9sXگ2b/k=OO=:j;A"dTT1$>AmmwqgX? &XECnr3}乼r٧ZCcv!s'#kz*I4 ((TbBep?._=QR"d.G^!L̙ZA+="IMvbAlu3H*l&EEI"W ^ӏ'Yzn-Y<ƫ0XU?Y<5cj 3f0q$Hb-<<0p^BΘufd1Lj81 V.w}ahiaⱋVmчa"@L$.ۂ40`% 5I w]`FVIm8`;ZĨkbja<ę7m9H $M=QQ% L4Nǃa̡Vq>kx$$iǤI4S(t?~usꈐ@<ę6+6تˋY9:@k2 kbM,3+4bbb&4 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_file_collectiones#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_file_collection.sh 1.4 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_file_collection.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_modify_file_collection =head1 SYNOPSIS clmgr modify file_collection \ [ NAME="" ] \ [ ADD="/path/to/file1,/path/to/file2,..." ] \ [ DELETE={"/path/to/file1,/path/to/file2,..."|ALL} ] \ [ REPLACE={"/path/to/file1,/path/to/file2,..."|""} ] \ [ SYNC_WITH_CLUSTER={no|yes} ] \ [ SYNC_WHEN_CHANGED={no|yes} ] \ [ DESCRIPTION="" ] NOTE: the aliases for "file_collection" are "fc" and "fi". =head1 DESCRIPTION Attempts to modify the specified file collection to conform to the provided specifications. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the modified object can be returned to the caller. 2. fcname [REQUIRED] [string] The label of the file collection that is to be modified. 3. new_name [OPTIONAL] [string] The new label to attempt to apply to the specified file collection. 4. new_desc [OPTIONAL] [string] A new description to apply to the specified file collection. 5. files_to_add [OPTIONAL] [string ref] A list of files to be add to the specified file collection. 6. files_to_remove [OPTIONAL] [string ref] A list of files to be removed from the specified file collection. 7. files_to_replace [OPTIONAL] [string ref] A list of files to be replace the existing set of files referenced by the specified file collection. 8. sync_with_cluster [OPTIONAL] [string] A Boolean-style indicator of whether or not the file collection should propagate its files to all the cluster nodes every time a cluster synchronization is performed. 9. sync_when_changed[OPTIONAL] [string] A Boolean-style indicator of whether or not the file collection should propagate its files to all the cluster nodes whenever any of those files gets changed. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. function KLIB_HACMP_modify_file_collection { . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_file_collection.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset -n properties=$1 typeset fcname=${2//\"/} shift; shift typeset new_name=${1//\"/} typeset new_desc=${2//\"/} typeset -n files_to_add=$3 files_to_add=${files_to_add//\"/} typeset -n files_to_remove=$4 files_to_remove=${files_to_remove//\"/} typeset -n files_to_replace=$5 files_to_replace=${files_to_replace//\"/} typeset -l sync_with_cluster=${6//\"/} typeset -l sync_when_changed=${7//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -A fc_attrs= typeset -i i=0 #================================================================ : Assuming an object was specified, see if it is a known object #================================================================ if [[ $fcname != *([[:space:]]) ]]; then CL=$LINENO KLIB_HACMP_is_known_filecollection "$fcname" (( $? != RC_SUCCESS )) && rc=$RC_NOT_FOUND fi #================= : Validate input #================= if [[ -z $fcname ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif (( $rc == RC_NOT_FOUND )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$fcname" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 144 "Available File Collections:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_filecollection available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" elif [[ -n $new_name && -n "${new_name//[a-zA-Z0-9_]/}" ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 105 "\nERROR: one or more invalid characters were detected in \"%1\$s\" (\"%2\$s\").\n\nValid characters include letters, numbers, and underscores only.\n\n" "$new_name" "${new_name//[a-zA-Z0-9_]/}" 1>&2 rc=$RC_INCORRECT_INPUT elif [[ "$*" == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 401 "\nERROR: no valid modifications were specified for \"%1\$s\".\n\n" "$fcname" 1>&2 rc=$RC_MISSING_INPUT elif [[ -n $sync_with_cluster && $sync_with_cluster != @(y|t|n|f)* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" SYNC_WITH_CLUSTER "$sync_with_cluster" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "true, false" 1>&2 rc=$RC_INCORRECT_INPUT elif [[ -n $sync_when_changed && $sync_when_changed != @(y|t|n|f)* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" SYNC_WHEN_CHANGED "$sync_when_changed" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "true, false" 1>&2 rc=$RC_INCORRECT_INPUT #=================================================================== : Modify the file collection if no input errors have been detected #=================================================================== else CL=$LINENO KLIB_HACMP_get_filecollection_attributes "$fcname" fc_attrs [[ -z $new_desc && " ${!_ENV_ARGS[*]} " != *\ DESCRIPTION\ * ]] && new_desc=${fc_attrs[DESCRIPTION]} [[ -z $sync_with_cluster ]] && sync_with_cluster=${fc_attrs[SYNC_WITH_CLUSTER]} [[ $sync_with_cluster == @(y|t)* ]] && sync_with_cluster=yes || sync_with_cluster=no [[ -z $sync_when_changed ]] && sync_when_changed=${fc_attrs[SYNC_WHEN_CHANGED]} [[ $sync_when_changed == @(y|t)* ]] && sync_when_changed=yes || sync_when_changed=no # NOTE: the seemingly odd, out of place leading dashes in the # command below are apparently *required* by the # clfilecollection command. So they are *not* the typos # that they appear to be! I suspect it was an attempt to # preserve them as positional parameters, although there # are other, better ways to accomplish that task. print "$0()[$LINENO]($SECONDS): $HAUTILS/clfilecollection -o coll -c \"$fcname\" -\"$new_name\" -\"$new_desc\" \"$sync_with_cluster\" \"$sync_when_changed\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clfilecollection -o coll -c "$fcname" -"$new_name" -"$new_desc" "$sync_with_cluster" "$sync_when_changed" rc=$? print "clfilecollection RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc == RC_SUCCESS )); then [[ -n $new_name ]] && fcname=$new_name else rc=$RC_ERROR fi fi if (( $rc == RC_UNKNOWN || $rc == RC_SUCCESS )); then # # REPLACE # if [[ -n $files_to_replace ]]; then typeset existing_files= for attr in ${!fc_attrs[*]}; do if [[ $attr == FILE* ]]; then existing_files="$existing_files ${fc_attrs[$attr]}" fi done if [[ -n $existing_files ]]; then files_to_remove=$existing_files fi [[ " $files_to_replace " != *\ ALL\ * ]] && files_to_add=$files_to_replace fi # # REMOVE # if [[ -n $files_to_remove ]]; then [[ " $files_to_remove " == *\ ALL\ * ]] && files_to_remove=${fc_attrs[FILES]//+([[:space:]])/ } if [[ -n $files_to_replace ]]; then print "$0()[$LINENO]($SECONDS): $HAUTILS/clfilecollection -o file -r \"$fcname\" ${files_to_remove//,/ }" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clfilecollection -o file -r "$fcname" ${files_to_remove//,/ } >/dev/null 2>&1 else print "$0()[$LINENO]($SECONDS): $HAUTILS/clfilecollection -o file -r \"$fcname\" ${files_to_remove//,/ }" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clfilecollection -o file -r "$fcname" ${files_to_remove//,/ } fi rc=$? print "clfilecollection RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 404 "\nERROR: an error occurred while attempting to remove file(s)\n \"%1\$s\" from file collection \"%2\$s\".\n\n" "${files_to_remove//,/ }" "$fcname" 1>&2 rc=$RC_ERROR fi fi # # ADD # if (( $rc == RC_UNKNOWN || $rc == RC_SUCCESS )); then if [[ -n $files_to_add ]]; then print "$0()[$LINENO]($SECONDS): $HAUTILS/clfilecollection -o file -a \"$fcname\" ${files_to_add//,/ }" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clfilecollection -o file -a "$fcname" ${files_to_add//,/ } rc=$? print "clfilecollection RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 405 "\nERROR: an error occurred while attempting to add file(s)\n \"%1\$s\" to file collection \"%2\$s\".\n\n" "${files_to_add//,/ }" "$fcname" 1>&2 rc=$RC_ERROR fi fi fi fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_filecollection_attributes "$fcname" properties fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "modify file_collection -h" "FILE COLLECTION:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_modify_file_collection()" #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ o_ k$ .3+<bbb&< # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_file_systemi#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # @(#) 5d6dd76 43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_file_system.sh, 726, 2147A_aha726, Sep 09 2021 10:49 AM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_modify_file_system =head1 SYNOPSIS clmgr modify file_system \ UNITS=### \ [ SIZE_PER_UNIT={megabytes|gigabytes|512bytes} ] \ [ NEW_FS_NAME= ] \ [ PERMISSIONS={rw|ro} ] \ [ EFS={yes|true} ] NOTE: the mininmum size for an enhanced file system is 16MB. NOTE: an alias for "file_system" is "fs". =head1 DESCRIPTION Attempts to add a new file system. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. file_system [REQUIRED] [string] The mount point for this file system. 3. units [OPTIONAL] [posint] The number of units of the specified unit size (which defaults to megabytes). Combined, these determine the size of the file system. 4. size_per_unit [OPTIONAL] [set] The size of each of the specified units defaulting to megabytes. Combined, these determine the size of the file system. Valid values: 512bytes, megabytes, gigabytes 5. new_fs_name [OPTIONAL] [string] Enter the new filesystem name 6. permissions [OPTIONAL] [set] Sets the permissions for the file system, defaulting to "rw" (read/write). Valid values: rw (read/write), ro (read only) 7. enable_efs [OPTIONAL] [boolean] Enter "yes" to enable encryption for this file system (EFS). Valid values: yes, true, enable and 1. NOTE: this option is only valid with enhanced file systems. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. function KLIB_HACMP_modify_file_system { . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 5d6dd76 43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_file_system.sh, 726, 2147A_aha726, Sep 09 2021 10:49 AM : INPUTS: $* typeset -n properties=$1 typeset file_system=${2//\"/} typeset units=${3//\"/} typeset size_per_unit=${4//\"/} typeset new_file_system=${5//\"/} typeset -l permissions=${6//\"/} typeset -l enable_efs=${7//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset INPUT="" ATTR="" VALUE="" typeset volume_group="" vg_disk="" rg_name="" typeset primarynodes="" secondarynodes="" nodes="" if [[ -z $file_system ]];then dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT log_return_msg "$rc" "$0()" "$LINENO" return $? else print "$0()[$LINENO]($SECONDS): lsfs -c "$file_system" | tail -1 | cut -d: -f2 | cut -c6- 2>/dev/null" >>$CLMGR_TMPLOG lv_name=$(lsfs -c "$file_system" | tail -1 | cut -d: -f2 | cut -c6- 2>/dev/null) typeset lv_name_rc=$? print "$0()[$LINENO]($SECONDS): lsfs command to get filesystem $lv_name RC: $lv_name_rc" >>$CLMGR_TMPLOG if [[ -n $lv_name ]];then print "$0()[$LINENO]($SECONDS): clodmget -q "name=$lv_name" -f parent -n CuDv" >>$CLMGR_TMPLOG volume_group=$(clodmget -q "name=$lv_name" -f parent -n CuDv) typeset volume_group_rc=$? print "$0()[$LINENO]($SECONDS): clodmget command to get volume group name RC: $volume_group_rc" >>$CLMGR_TMPLOG volume_group=${volume_group##*VOLUME GROUP:+([[:space:]])} volume_group=${volume_group%%+([[:space:]])*} fi fi if [[ -n $volume_group ]];then print "$0()[$LINENO]($SECONDS): clodmget -q "name=GMVG_REP_RESOURCE and value=$volume_group" -f group HACMPresource" >>$CLMGR_TMPLOG gmvg_type=$(clodmget -q "name=GMVG_REP_RESOURCE and value=$volume_group" -f group HACMPresource 2>/dev/null) typeset gmvg_type_rc=$? print "$0()[$LINENO]($SECONDS): odmget command to get volume group $volume_group type $gmvg_type RC: $gmvg_type_rc" >>$CLMGR_TMPLOG if [[ -n $gmvg_type ]];then typeset -A rgAttrs print "$0()[$LINENO]($SECONDS): clodmget -q "name = VOLUME_GROUP and value = $volume_group" -f group -n HACMPresource" >>$CLMGR_TMPLOG rg_name=$(clodmget -q "name = VOLUME_GROUP and value = $volume_group" -f group -n HACMPresource) typeset rg_name_rc=$? print "$0()[$LINENO]($SECONDS): odmget command to get Resource group name $rg_name associated to volume group $volume_group RC: $rg_name_rc" >>$CLMGR_TMPLOG if [[ -n $rg_name ]];then CL=$LINENO KLIB_HACMP_get_resourcegroup_state "$rg_name" rgAttrs primarynodes=${rgAttrs[PRIMARYNODES]} secondarynodes=${rgAttrs[SECONDARYNODES]} nodes="$primarynodes $secondarynodes" fi # For GLVM volume groups, we should not allow changing filesystem when cluster services are running. for node in $nodes do clstate=$(LC_ALL=C cl_rsh $node lssrc -ls clstrmgrES | grep "Current state:" | cut -f2 -d":") if [[ ${clstate//[[:blank:]]/} == "ST_STABLE" ]] ; then print "$0()[$LINENO]($SECONDS): ERROR: Failed to modify filesystem,cluster state stable in one of the node $node" >>$CLMGR_TMPLOG CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1470 "\nERROR: Failed to modify filesystem \"%1\$s\". Cluster services are still active on at least one node in the cluster: %2\$s.\n\n" "$file_system" "$node" 1>&2 log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $RC_MISSING_DEPENDENCY fi done fi else print "$0()[$LINENO]($SECONDS): filesystem $file_system is not configured or its not associated to any volume group" >>$CLMGR_TMPLOG CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1471 "\nERROR: Filesystem \"%1\$s\" is either not configured or not associated with any volume group.\n\n" "$file_system" 1>&2 rc=$RC_INCORRECT_INPUT fi #============================== : Validate the integer inputs #============================== for INPUT in UNITS@$units do print -- "$INPUT" | IFS=@ read ATTR VALUE if [[ $VALUE != *([[:space:]]) ]]; then CL=$LINENO verify_is_numeric "$VALUE" 2 "$ATTR" (( $? != RC_SUCCESS )) && rc=$RC_INCORRECT_INPUT fi done #========================== : Validate the set inputs #========================== if [[ -n $permissions ]]; then typeset -l permissions_lc=$permissions CL=$LINENO verify_in_set permissions_lc "$permissions" "rw ro" permissions_lc (( $? != RC_SUCCESS )) && rc=$RC_INCORRECT_INPUT fi if [[ -n $enable_efs ]]; then typeset -l EFS=$enable_efs CL=$LINENO verify_in_set EFS "$enable_efs" "yes true enable 1" EFS if (( $? == RC_SUCCESS )); then [[ $enable_efs == @(y|e|t|1)* ]] && enable_efs="yes" else rc=$RC_INCORRECT_INPUT fi fi if [[ -n $size_per_unit ]]; then typeset -l spu_lc=$size_per_unit if [[ -n $size_per_unit ]];then CL=$LINENO verify_in_set size_per_unit "$spu_lc" "megabytes gigabytes 512bytes" spu_lc (( $? != RC_SUCCESS )) && rc=$RC_INCORRECT_INPUT fi fi #====================================================================== : If no errors have been detected in the input, perform the operation #====================================================================== if (( rc == RC_UNKNOWN )); then typeset gOpt="" vOpt=" -v jfs" mOpt="" unitsOpt="" FOpt="" pOpt="" typeset bsOpt="" optOpt="" ilOpt="" lvOpt="" lsOpt="" eafOpt="" typeset quotaOpt="" efsOpt="" tOpt="" fragOpt="" nbpiOpt="" agOpt="" typeset dOpt="" [[ $new_file_system != *([[:space:]]) ]] && mOpt=" -m $new_file_system" [[ $units != *([[:space:]]) ]] && unitsOpt=" -a size=$units" [[ $permissions != *([[:space:]]) ]] && pOpt=" -p $permissions" [[ $enable_efs != *([[:space:]]) ]] && efsOpt=" -a efs=$enable_efs" if [[ $size_per_unit != *([[:space:]]) ]]; then typeset uos_lc=$size_per_unit [[ $uos_lc == "megabytes" ]] && FOpt=" -FM" [[ $uos_lc == "gigabytes" ]] && FOpt=" -FG" [[ $uos_lc == "512bytes" ]] && FOpt=" -FH" fi # Bring rpvserver and rpvclients to available state in all the nodes if file system is associated with GLVM volume group. # This is used to avoid errors during varyon the volume group. if [[ -n $gmvg_type ]];then change_rpv_state "$primarynodes" "$secondarynodes" "$volume_group" "mkdev" change_rpv_state "$secondarynodes" "$primarynodes" "$volume_group" "mkdev" fi nodes=$(echo $nodes | tr ' ' ',') case $file_system in /*) ;; *) file_system=/$file_system ;; esac print "$0()[$LINENO]($SECONDS): cl_chfs -cspoc \"-n'$nodes'\"$gOpt$dOpt$mOpt$pOpt$bsOpt$optOpt$ilOpt$lvOpt$lsOpt$eafOpt$quotaOpt$efsOpt$tOpt$fragOpt$nbpiOpt$agOpt$mandatoryOpts$unitsOpt$FOpt $file_system" >>$CLMGR_TMPLOG cl_chfs -cspoc -n"$nodes" $gOpt$dOpt$mOpt$pOpt$bsOpt$optOpt$ilOpt$lvOpt$lsOpt$eafOpt$quotaOpt$efsOpt$tOpt$fragOpt$nbpiOpt$agOpt$mandatoryOpts$unitsOpt$FOpt $file_system rc=$? print "$0()[$LINENO]($SECONDS): cl_chfs RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 400 "\nERROR: failed to modify \"%1\$s\".\n\n" "$file_system" 1>&2 rc=$RC_ERROR #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== elif (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_file_system_attributes "$file_system" properties fi # Bring rpvserver and rpvclients to defined state in all the nodes if file system is associated with GLVM volume group. if [[ -n $gmvg_type ]];then change_rpv_state "$primarynodes" "$secondarynodes" "$volume_group" "rmdev" change_rpv_state "$secondarynodes" "$primarynodes" "$volume_group" "rmdev" fi if (( $rc == RC_SUCCESS )); then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1474 "\nFilesystem \"%1\$s\" modified successfully.\n\n" "$file_system" 1>&2 fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "modify file_system -h" "FILE SYSTEM:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_modify_file_system()" #============================================================================ # # Name: change_rpv_state # # Description: This function change the rpvserver/client to available to defined state and vice-versa # # Inputs: siteA_nodes - nodes where to change the rpvservers state # siteB_nodes - nodes where to change the rpvclients state # vg_name - volume group # cmd - mkdev/rmdev # # Outputs: None. # # Returns: None # #============================================================================ function change_rpv_state { typeset siteA_nodes=$1 typeset siteB_nodes=$2 typeset vg_name=$3 typeset cmd=$4 typeset node="" for node in $siteA_nodes do print "$0()[$LINENO]($SECONDS): cl_rsh $node lspv | grep -w $vg_name | awk '{print $1}'" >>$CLMGR_TMPLOG typeset vg_disk=$(cl_rsh $node lspv | grep -w $vg_name | awk '{print $1}') print "$0()[$LINENO]($SECONDS): cl_rsh $node lspv command with VG disk list : $vg_disk" >>$CLMGR_TMPLOG for disk in $vg_disk do print "$0()[$LINENO]($SECONDS): lsrpvserver | grep -w $disk | awk '{print $1}'" >>$CLMGR_TMPLOG server=$(cl_rsh $node lsrpvserver | grep -w $disk | awk '{print $1,$2}') print "$0()[$LINENO]($SECONDS): lsrpvserver command with server list : $server">>$CLMGR_TMPLOG if [[ -n $server ]];then typeset ser=$(echo $server | cut -d' ' -f1) typeset pvid=$(echo $server | cut -d' ' -f2) if [[ -n $ser ]];then print "$0()[$LINENO]($SECONDS): cl_rsh $node $cmd -l $ser" >>$CLMGR_TMPLOG typeset ch_ser=$(cl_rsh $node $cmd -l $ser) typeset ch_ser_rc=$? print "$0()[$LINENO]($SECONDS): $cmd RC : $ch_ser_rc">>$CLMGR_TMPLOG fi if [[ -n $pvid ]];then for noden in $siteB_nodes do print "$0()[$LINENO]($SECONDS): cl_rsh $noden lsrpvclient | grep -w $pvid | awk '{print $1}''" >>$CLMGR_TMPLOG client=$(cl_rsh $noden lsrpvclient | grep -w $pvid | awk '{print $1}') print "$0()[$LINENO]($SECONDS): lsrpvclient command with client list : $client">>$CLMGR_TMPLOG if [[ -n $client ]];then print "$0()[$LINENO]($SECONDS): cl_rsh $noden $cmd -l $client" >>$CLMGR_TMPLOG ch_clt=$(cl_rsh $noden $cmd -l $client) typeset ch_clt_rc=$? print "$0()[$LINENO]($SECONDS): $cmd RC : $ch_clt_rc">>$CLMGR_TMPLOG fi done fi fi done done } # End of "change_rpv_state()" _ lr03+uJbbb&s/ # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_groupystemi   =e ainorst$cdhlpu"/ACEGILMNORST[\]_bfgmy#(),-.12:Pvw&*0;>DUk{}!%'3469jBW ܱWMG?kIǝiAxyuRژ41 c1hkr̖0*6Jq5e($—1jUQTrJimv Ϛm oxj^UVb!u% Dy̧<RZvg\᝽,>p棥X?[rg|#oNk,UHi5RJ-OB8a;Jv?rJHe;A+~0]is8]%r8gkrJuq*4*jZԷוǔn`AԶ h6PI͝˚%r*KוDR3>\sRK+vՃ˜'z|l +۠n<m FIڒW)no5-C) ZˍqAx|#r /t-i8=qsχ/@IAo?5oN\K҃8l=K(j7kkv֞ԽY6s k Q+K48-C f9+ ί="vXWjIZgumslZ2|Խ8$ |7AKg + kB:F<"t/ns7zd 䵤櫤bԧqj^—qs5M*驷Q [eWY7*`q`RN.y&6^JGk=KAU`*QjSKJ X`n:-xNaZ >N>( @,407lqt8X,07}[Z`@`o`-v8 bx`o6L07:Ԃ2US 4E[*(𱁁 ^7A#pR-xNCxGm+,XDŧg`Hf(4̧<rJb5/IU;~D%'uKbu*UPoji|K\lqAxyuKim.KZNqRqZp=GK?.o4+^RArg\fųtd:j^IҞvקմKוL= )%rtUm<.j^2tUm=j?Ҟz@ه!;׾AKO= KZ.@ء ޭZ/te>6s+-hb?.{Ps*&`RIqsϛgu'u˚n2g !棥[ = 5k?ښ{WAheԼ`#@RYn5.,]4:p$2ו\sKp6RSKasRqB'r楺8FгSoY"o5-*U oio6\ԷEޔP;Oܭv6P{?D\E.!ԷƉU<c)Kjba10K|;abӹSԾ \[7AVZsE/;vKGU{aF˂I/lDZqZ|nP^)^.[>'Ja#O|'zl.PA|l{[-'<0(K^ҝ/喹\E-62^l X&Tz@ӂKͳt0JnD8 4q13 !8~0]l$DJ(Vp@i" qbL V[8Aah$-XN@<C%F܆*2P F(Ԑ,0$D8 LL&NX>J5$ Rtb 6r D@70ӊ5$ QdJ B?Z0Z7\ +~0]jD$"0aclW>'0aclW=! (`B4+\xrS@SfKB@`B4+\zʑ c0&q"^W 3 hV\ϕ"0&ϕ"jh 3 hV\iNTH hX?֌U9R!%iNClW<#he8F wH gЭrC)6rޔP7AH@0aclW<#he8F5$RBB0&Zsg) "0б63ɝĉ,pR!`B L͛@W<^zyũ^bU^UUUUUUUUUUUUUUUUUS?İ}c{^nj[4&UUUUUUUUUUUUUUUUUS?kwÎ % F3ɝJqCbՂMT^ z1⇪Œ*8i!yx(ϺSy܅UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUULKs*Ҟ*rZqZa=ۄ_W:)*=3~0]ldȔjV$lfl7%H"PyB"Hp8HEyb?.|._ @)R%(T<@=UUUUUUUUS?İ\g{gUUUUUUUUU3dz&p?.l7^QuA#tG&@h$Lcː/OXR[wUm]vG'iy*Dȗ.DJ 1aaz1K8PyP@~ 楽Fs'%H-ĉ,p# X2 Y,Xa,а@24/N-Ֆǜ;)ƞihX^ bîx å82cDq"d &\|@ ōkio!.<P4+\{EZu[gT"%+$UҙKh\Nl=a{  h\NfAf` ၀83dz&tBMkil.6jafLIfbF͆f̓yogs.#54BMkil.6gp}h×ŋg1UUUUUUUUT,5W&笼UUUUUUUULqɝjafLIfbF͆f̓yogT"%+$t_Wgaaz ,8p˗Էbîx å82cDq"d &\|@#4,%FFڲ`0<^-B,019,Gh$LcǘH _V,h\NykWZBFip(EW=r:q*DD@ *LnP^)YuQUUp Q 4QUU a0nnٓ:!&5ʴe 5`&DR#f3fԷh׌!&5ʴe g38>\ˈűJ,8BB<sٓ:.O2%%6Z.OafL&a`j[1yDaVXqÇ/yog\d?KDq"d .<ƈD8L0Gi*XK4,4 Ӆ|'e'J`1xZ+/Y1yDaygUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUS?ıZ|ssR|ԾKZNN(Yygaaz1K8(*e0o5-Z.|Z ("PyB.N(tO /H $T?k$TpTX:VGËgo>N(tO Ȏ$Lc *@1EϞ-`XaI(Ui9VnLӭy\dUi9*LV 2dJK5+6l36o*^Ab|[?̙jhJql)}VAhA9fP+jhNMS-L4{8n gyx(4yUBϣVV-L<dȔjV$lfl nLӡ{\32jafLIfbF͆fV2*^2BK!Y"RYXaBbd΋S@2%%67[S@Ȫӡ{SA*D$902%%604&-qɝAx}V,Ui9V.LEy\dUi9*O /H $TcUjj kӓ?A;@z ʎym%N$uM*reV+"MϑU~0]fڲ>xpv-`XaI(Ui9V.LEy\dUi9*O gR@;?֋H_6A D0Dq*p@24,?-4;7 XnԼN@n] h 1t ~Oܵ)y۷|Uw`" q@hbgA7Bp`ah$L l13+bbb&X # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_hmcp   = einst$CES_acdhlopr"-AHILMNORT[\]fmuy#().1:;>DGPUbgvw&,/02BKk!%FWY{|}'*+345789R8JL&xM}FϖɭNPCOl-Eu%&U1ԟ5~Ş%zG~ʰRo[ً4`j egv٦[7JL'c>kV~Ş[II`xKYRz4i3xؐ'ԔV N YR|V{=g|YR|(M{]x*ȳn >\~__7|~%7g_+? sl6uY6l`~/ r<4f'UN޶>ㅔ ALOmI-ΫE1DD"LNv-=˕D2Q3]I/F]ʰRp~mwׄquMMAFNOvoRo[dPT(qzTa`y$2QLTD 6S.ф{zqP[ j,oLw 쀐Ԋ!`2ٵ';Rm4- $A2rE&8#3.@9>Oqi83,%(o|݁R:̟wC1e8lUI:]Hϛ9=5߬Jb|m윞,ԟ5ߏ$3PQiF6v[βsUHY8ȼqe8;yTK@2rE&8#3.ɜ6(MmmI ړ1[˿I ړ1ׂ󁷲rr6 q8lQo[1GUvYhf,͞Z 7Y9g9'iCOml'#kIg"ҍm{r췝d檑wβqx0qnv*& f\b "g/˱83ZaC.ǘ;op|>{1ǒCed,[sMRz#ǒCequm윜x0(͸=lDP14 ,6(o'TKD0zib*з`c'5T']YF?<"RoβsR3rOww<҇gYF?>kIg"ҍm{r췝d檑wβqx0qnv!y2($XBcm"]]Mqeg˚O g$kXHJɔE*0g5ߜR;owBS5ŕ,^kXH Y(Lq9yMDT˲˿bɮPu'35,y$݃N%,T`k9'v'Ϛ؄k&g%^ǒ@-e-"Keg(2ަԊ6%7SS&ԡ70rS{aAnv91˔,@1L08dv@֪TbghL(ϖVǒC6rS^ o6rS,zzf&*q'cN<҇5ߪ1x[˿UЙUި?%5'M;Wm83p6;axHLH  P&rpbr{|T6- / bi"U2c#xK6VRlw4yTR-!)'ɳg#T/ $[&%S&8;-N DŽM=X2Uqx0(6޶im`xnl5ߴ.k/ bCH (TCeg(2ޒCE$Y6l`15 sQ`"eG P)$K 9y\^%: _w$?Ldx8\0/Ul IpS`_).4󢯎6{rQ/ baVޤw7e&LM( 1p{0Y6[G`^9eo+<hW6yy$Q L5*ּmf@0y$B%J쁘*f$bB`ȁ;< IpTM(LoVoX;i83Fz˛: ?{⪾R4qac{m޺USu94`j[mdjYˋ3)v[d qfxL0o&Mm r nhu%Ἑ6gpG'.UzL~.` 7Sm r mgwYˋ3)NM=XU|Ґasg6_R'uu],PH *@Dyg;@TI 9(EIEW_-[h/`  cc+U,ŞU97FV5iͩ9mfU8m񚓃1 sG"pqǎ@fZp5HDJ ǎ"@TBMgqBc@nPf4BSu S T@qǎ@fZB' G&`p),`X03 ĉ;7 LHLA֟'i<1:U6{4  3>O8{''O@0(``(wδ>{ogSU< Q=:mMgx@@{ub< P(P؄Obb( `{u Jt4F{l7 L =:X]\ڴ4FO眓ۊO@X(``(wδ>{JJB춵< F;|*"$ y8 (X;͵~ҍoQmmmmmwn XQEnŔn 0;"mmmmi|ǒA4J(VgZ|NX6*mhsgW6X$J ![Ͳ 6l$A20d"1mmmmmmkum|ɲAn|hϋ+=Jx @&i*"pdvL)&dw5>dY5;"mmmmmmmwFYhJpI~k9XaxDWUI>NX6*mhsgW6X$J ![Ͳ 6l$A20i,T`[mmmmmmm֟' J|-5/%<gBh4H2;pcHdR1Lɐk.m|҄*Ps-mkpQ,--mk5ͪ =O$dGQ#]YrSaAG2w Me5ѹ eB%SI$"U2IxDRCu#̧ eHYY(X,LDf;iPL LE2Ą;I@<h)Fk2qfz4 L1=sj‚`f;i4nBgDTDzILB)`(0,PQ! 1`x O,PQ4$ L"@MJimYj )a4xHO BR ((ˀC xw pf]YrjAysd@dҊ4ɐɐk.iFxӀa,PQ>@5^g8 wjʠ2 wؓ<  D=sj‚aPs3>O6 L$w L$<%VXث獎4֫1՜s:$$ZQ 9$'={r&&LLO [mm]ۊߴj|ۿ-mm֟'II˗p6NO2d;k._>p6NO40fdw5 Ie˗Ϝ PV&dVdwwIr=$J%"HDdK@1J(T7f/o6oeګڊ{o|ެ޷!IH000(,LDb pG'*qg{yC oSiBpoQ 1>p6NLf08,h 2`x էA2(T(L1!2{{$A297Ammm |;iF6[mmmODP14 -]Yru5Y9Ls]w eu5Y9 ̙*&A2e˗mljr3PV&dVd5&W,*H@!HE,^0Q*TPݘe-Eb jj+7,]Yzz#>Fa& 1Q--ş] 03QoSiBpoQ 1>p6NLf08,h 2`x էA2(T(L1!2{{ʢXɖu5Y9jwEmmmwngݥPmmm]3>OU@"8 |ls|:aC!|]YrmMg`!|]U@"8 C iu5‡p"$pՠ+ 23wIr=$J%"HDdK@1J(T7f/o6oeګڊ{o|ެ޷!IH000(,LDb pG'*qg{yC Ŕ`[fP3xŔ`DFc .40. ̀@F"b#1c ɲ3 ڴ&@ Eɐ&$&YbOw e窻{p  !|]P&<1b]\ڽƂ&dw5=ɏ$jwEmmmmmmmmm7I %!v[[alQA~iY^S֟MmmmmmmmmmBsW*bdd@#=ɦX G ‚Ly$(c-mmmmmmmmwn"]JJB춶iM$dZ ?4{o1՜-mmmmmmmmw ecrOn*~c@~{JJB춶dw5I ,Q xJ2WT6xH&Dp58[JJBcc!%ͪ˗ƀ!$*!2w77x,$(HDC!' $iIH]lfzIL!"%]Ғ-O UͪҒS]ʡOiFxѸa!E"@$ =$P(LA V6JJBmOUw*<<*bBDJ 2+ɳjEmw a!9APA4A‚4$ L &W,*H@!HE,00|ÿ%J*R =nl|!$*!e$003I1ǒA2#mZyTDR] k._RRe8iIH] IriE^dVdw5FD4Ia5ѹ eB%SI$"U2I`wDRCsJA͞O$9$D3L>Fc b&"3xH&Dp5#0@1O*d PTP,bBe$I ,Q xKM3iIH]VYY6*Pw;YrrOn*~c@~{JJB춶dw5I ,Q xJ2WT6xH&Dp58[JJBcc!%ͪ4*1đ+| Co$dGQ#59BKT)PsAmmmmmmmmm] J{J6ŃAl-!(nmmmmmmmmm]XHN{jPLL8@,w5/(MBS@dҊ4ɐɐk.|YI!|]y&SU֓F+zIM$KgDT$"1J(T7 Yc\YM6MI4zY(MY< &BQ@d w;jw a!9ەA12`exPPw5[mmmmmmmmmmBobҍm{n uԞl䧊?Y] woUި?&b|xGiF6:',iZfO؄kx'Ş 溓a,laP媤uY6l`~/ wTCagwBS5|?7oZ;oXp5ߪbghLT 䧊6ȰK~2گwkrXAF@)lŃeJ{&Bo.2V|Y^Aͪmmmmmmmmmm]3>Oȥ\˗>P؄2wo&ϔ&!)k2Ȑ&28jc HI8I0|Yrߌ< &@ .\6M(L ̙g8 jAysdPwiFxӀ`< (Y0(1f/w a!9ەA12`exPPw5P&<fwo&ϔ&!)k291MJ+An֟'ϔ&ϕ15/|7Ls]wδ>xܡ7ۓ#O"@$`$!$_4 5'6(ro|7:snN&ϕx(M6\AR2 AX1#'ϔ&ӛrw95/|7V|&C"mmmmmm7,pPQ,2͝vX[ϖ.]ᾫ1՞?<~A;1`i(pUmmmmmm:,2]iBoN,ϔ&ϐv.iFxѸWz6jYZ:&qegzqeg$dGQ#@$"="&PAaDT"PEAmTf1z&u1xMtϔ&IȎGHdIE,4*1đ@YBUw*<F]\کbghLbŕ(Mŕ<  Dȓ( TDARVTUxy$"U2Ąw a!9APk.@z(I*TB09⍽@{A3XHNz@H&R PPw56{{ YjD "h="Kϔ&f/wؓmmmmmm]Y,Uwf1z&t0(MwEmmmmmmwD "|7 LcAPw95綯nUɃAA|]mmmmmmmmmm]eg OiF6͜G3뽷 eg;J6Д< qf{M2~%=[t%8DW+>N =;u'YYR:6r0UIͪ Ԋء05߱ Odӿϗ6qG7kR'w-nY^- ]8Fޠ?9)bԐ?9[U wnYxKQ((eKf,λ,-wBS5ŕ-Vc=6ysj"mmmmmmmmmmgZ|zA{#O"@$`$!$؄YYR ((i(,PQ@AA̻ 0%ˆɥxi!Y!|]p< PYH0.| jY7pէA2e && Pw$'={r&&LLO BsǒC ‚-eg|YYBSe77TMVc8 BgSN,ǒA2#ɔE*y23=$JX.UwMsj1՜3kV~|YY H"xHLHI ,QB]pqAmTf1z&u1xMtϋ+?oVoYmmmmmmmmmmmmmm7ܦNqy$6EmmmmmmmgZ|>%QݲNjw8QݢN|hIȎG2g@#FFc08Qј$dGQ"1@~yb(&[2g9jtf3eyb(&Xc˗ƀ*&A2e&p@#lS1mjtf5\*&A2e;|h*bbbfLFFFc08(jQ,T LA#._ICo̙FFc08jtf4y=m\4紤.kfLFFFc08(kYCH (T@cpqBD4I2zHPAA*ωF|53(XSXQ oof/{{1x'[w2Zr+s]YYwoaA5wWm,w]eO6rSYmmmmmmm-#9"v.֟'&Q,QO牉,c wδ>xkT dVO$1đJF<h(d$@1uXbKUP69#dfzIL!"%ps"6VwHI*ė6J6lsɔGSV]pqBD4I2zHPAA1%ͪҍoeƳ=FaDT"PG0.l2+ɳjEmw[ǒ@HxHIwEmmmmmmm z\~xKQޢuLxK+?e,mmmmmmmǒ@H$dGQ#2wT dV5[mmmmmmm܄u"wUI<9_bɬy$$mmmmmmm]&$ 8" $T4LH@qdDI@)bB" H$ Ic"mmmmmmm]5wWR\Y E|<|u[cxK+=mmmmmmmͪ2r+v((;ĄDA1J,c h<#j|ۿ|h]Ͳ,k\ڼ p.mmmmmmm]3>OaAFȐ&28jc HI6!)V| 0e$'p )a!<;PPv.֟'ϋ+< dVeg˷AA|]ieeH;Y[mmmmX8YԖҍm{nmmmm|5Ae ‚<2( dw5ŕ2r+P65^',)Zjw a!9egLݸ/ i|1!őLy$֟'\ڠS'"gZ|:Q ommmmmoHdxG="H;YOQyF]3>O&$ 8" $U:amP)Z3>O<E*g<\$ LE aJ~5,DfzIL!"%ps"6VwHI*ĥ zD "է#OȓIn4n0XHQsȐ&2BOI H(7U%(MaDT"PG0.l2+ɳjEg@$E*xJ1)Boưէ#O&$ 8" $U:jwQOLi|&8)W#F㥩Q8 <5߉2.ǎ;)(6-Ԏ҂ =`O2yxeH[Ʈ,`fyl)V ``P$dUxDW4yH003yhI:L,LDf0+@sjWIј`x PsdU633rڣ1Bc"@$ wo\#F+l: k/33+,bbb&, # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_interfacemi#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2020,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_interface.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2013 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_interface.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_modify_interface =head1 VERSION Version Number: 1.4 Last Extracted: 1/31/14 04:40:46 Last Changed: 8/6/13 16:56:50 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_interface.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr modify interface \ NETWORK= NOTE: the "interface" may be either an IP address or label NOTE: the aliases for "interface" are "in" and "if". =head1 DESCRIPTION Attempts to modify the specified PowerHA interface to conform to the provided specifications. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the modified object can be returned to the caller. 2. interface [REQUIRED] [string] The address/label of the interface that is to be modified. 3. network [REQUIRED] [string] The label of the network to assign this interface to. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_modify_interface { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_interface.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset -n properties=$1 typeset interface=${2//\"/} shift; shift typeset network=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset nodename= typeset -i i=0 #================================================================ : Assuming an object was specified, see if it is a known object #================================================================ if [[ $interface != *([[:space:]]) ]]; then CL=$LINENO KLIB_HACMP_is_known_interface "$interface" (( $? != RC_SUCCESS )) && rc=$RC_NOT_FOUND fi #================= : Validate input #================= if [[ -z $interface ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif (( $rc == RC_NOT_FOUND )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$interface" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 146 "Available Interfaces:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_interfaces available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi if [[ -z $network ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 101 "\nERROR: this operation requires the \"%1\$s\" attribute.\n\n" NETWORK 1>&2 rc=$RC_MISSING_INPUT else CL=$LINENO KLIB_HACMP_is_known_network "$network" >/dev/null 2>&1 if (( $? != RC_SUCCESS )); then rc=$RC_INCORRECT_INPUT /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$network" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 150 "Available Networks:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_networks available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi fi #============================================================= : Modify the interface if no input errors have been detected #============================================================= if (( $rc == RC_UNKNOWN )); then #============================================================= : Retrieve the cllsif data to first, obtain a node name, and : second, convert any IP addresses to its matching the name. #============================================================= print "$0()[$LINENO]($SECONDS): $HAUTILS/cllsif -pcS" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/cllsif -pcS |\ while read LINE; do : Handle possible IPv6 address typeset IPv6= if [[ $LINE == *\[* ]]; then IPv6=${LINE##*\[} IPv6=${IPv6%%\]*} LINE=${LINE/\[$IPv6\]/[${IPv6//:/_}]} fi print -- "$LINE" | IFS=: read name type nw nettype attr node ipaddr haddr if gname netmask hb_addr site prefix family remainder : Handle possible IPv6 address ipaddr=${ipaddr//_/:} ipaddr=${ipaddr/\[/} ipaddr=${ipaddr/\]/} if [[ $interface == @($name|$ipaddr) ]]; then typeset new_interface=${LINE%%:*} [[ -n $new_interface ]] && interface=$new_interface nodename=$(print -- "$LINE" | /usr/bin/head -1 | /usr/bin/cut -d: -f6) break fi done print "cllsif RC: $?" >>$CLMGR_TMPLOG # Always log command result if [[ -z $nodename ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 406 "\nERROR: could not determine the node name for interface \"%1\$s\".\n\n" "$interface" 1>&2 rc=$RC_MISSING_INPUT else : First see if the network was changed. If not, do nothing. print "$0()[$LINENO]($SECONDS): $HAUTILS/cllsif -ci $nodename | /usr/bin/grep ^$interface | /usr/bin/cut -d\":\" -f3" >>$CLMGR_TMPLOG # Always log commands typeset NW=$($HAUTILS/cllsif -ci $nodename |\ /usr/bin/grep ^$interface |\ /usr/bin/cut -d":" -f3) print "cllsif RC: $?; NW == \"$NW\"" >>$CLMGR_TMPLOG # Always log command result if [[ $NW == $network ]]; then : Nothing to do rc=$RC_SUCCESS else #======================================================================= # If a network holding a service IP with only one network interface # then exiting with error message. #======================================================================= service_function=$(cllsif -pcS | grep -w "service:$NW" | wc -l | sed 's/ //g') if (( $service_function != 0 )); then boot_function_value=$(cllsif -pcS | grep -w "boot:$NW" | wc -l | sed 's/ //g') if (( $boot_function_value == 1 )); then rc=$RC_ERROR dspmsg -s $CLVT_SET $CLVT_MSGS 1461 "\nERROR: Modifying or removing last network interface '%1\$s' not allowed\n\ as the network '%2\$s' holds a service IP.\n\ You can remove the service IP from the network, then try the operation again.\n" $interface $NW fi fi if (( $rc != $RC_ERROR )); then print "$0()[$LINENO]($SECONDS): $HAUTILS/clchnode -n \"$nodename\" -l \"$interface\" -w \"$network\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clchnode -n "$nodename" \ -l "$interface" \ -w "$network" rc=$? print "clchnode RC: $?" >>$CLMGR_TMPLOG # Always log command result fi fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_interface_attributes "$interface" properties fi else rc=$RC_ERROR fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "modify interface -h" "INTERFACE:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_modify_interface()"  kL 53+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_location_dependency#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_location_dependency.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2013 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)04 1.4 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_location_dependency.sh, hacmp.assist, 61haes_r714 8/6/13 16:56:50 #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_modify_location_dependency =head1 VERSION Version Number: 1.4 Last Extracted: 1/31/14 04:40:58 Last Changed: 8/6/13 16:56:50 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_location_dependency.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_modify_location_dependency =head1 DESCRIPTION =head1 ARGUMENTS =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT =cut } # End of POD-formatted documentation. function KLIB_HACMP_modify_location_dependency { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_location_dependency.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset mode=${1//\"/} typeset -n rgs=$2 [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -A DependencyModes DependencyModes=( [SAME_NODE]="NODECOLLOCATION" [SAME_SITE]="SITECOLLOCATION" ) typeset DPMode= #================= : Validate input #================= if [[ -z $mode ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 101 "\nERROR: this operation requires the \"%1\$s\" attribute.\n\n" MODE 1>&2 rc=$RC_MISSING_INPUT else DPMode=${DependencyModes[$mode]} if [[ -z $DPMode ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\"\n\n" MODE "$mode" 1>&2 rc=$RC_INCORRECT_INPUT fi fi if (( $rc == RC_SUCCESS )); then print "$0()[$LINENO]($SECONDS): $HAUTILS/clrgdependency -t $DPMode -a -l \"$rgs\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrgdependency -t $DPMode -a -l "$rgs" rc=$? print "clrgdependency RC: $rc" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_modify_location_dependency()" > kH63+ 4bbb& 4 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_logt#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_log.sh 1.9 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_log.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_modify_log =head1 VERSION Version Number: 1.9 Last Extracted: 4/1/15 00:23:42 Last Changed: 3/16/15 09:15:17 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_log.sh, hacmp.assist, 61haes_r720, 1514A_hacmp720 =head1 SYNOPSIS clmgr modify log {|ALL} \ [ DIRECTORY="{|DEFAULT}" ] [ FORMATTING={none|standard|low|high} ] \ [ REMOTE_FS={true|false} ] NOTE: when "DEFAULT: is specified for the "DIRECTORY" attribute, then the original, default PowerHA directory value is restored. NOTE: the "FORMATTING" attribute only applies to the "hacmp.out" log, and is ignored for all other logs. NOTE: the "FORMATTING" attribute only applies to the "hacmp.out" and "clstrmgr.debug" logs, and is ignored for all other logs. NOTE: when "ALL" is specified in place of a log name, then the provided DIRECTORY and REMOTE_FS modifications are applied to all the logs. NOTE: when "EVENTS" is specified in place of a log name, then an events summary report is displayed. =head1 DESCRIPTION Attempts to modify the specified PowerHA log file to conform to the provided specifications. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the modified object can be returned to the caller. 2. log [REQUIRED] [string] The name of the log that is to be modified. 3. directory [OPTIONAL] [string] The directory in which the specified log should be stored. 4. formatting [OPTIONAL] [string] The style of formatting to apply to the specified log (only applicable to "hacmp.out"): none, standard, low, high 5. trace [OPTIONAL] [string] The trace level to apply to the specified log (only applicable to clstrmgr.debug): low, high 6. remote_fs [OPTIONAL] [string] A Boolean-like value indicating whether or not to allow the specified log to be stored on a remote/mounted file system. Valid values are "yes" and "no". =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_modify_log { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_log.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset -n properties=$1 typeset -l log=${2//\"/} shift; shift typeset directory=${1//\"/} typeset -l formatting=${2//\"/} typeset -l trace=${3//\"/} typeset -l remote_fs=${4//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset ropt= attr= typeset -i i=0 typeset -A logAttrs typeset -u uc_directory=$directory #================================================================ : Assuming an object was specified, see if it is a known object #================================================================ if [[ $log != *([[:space:]]) && $log != "all" ]]; then CL=$LINENO KLIB_HACMP_is_known_log "$log" (( $? != RC_SUCCESS )) && rc=$RC_NOT_FOUND fi #================= : Validate input #================= if [[ -z $log ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif (( $rc == RC_NOT_FOUND )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$log" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 147 "Available Logs:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_logs available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi if (( $# == 0 )) || [[ $* == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 401 "\nERROR: no valid modifications were specified for \"%1\$s\".\n\n" "$log" 1>&2 rc=$RC_MISSING_INPUT fi if [[ $log == "all" && -z $directory ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 101 "\nERROR: this operation requires the \"%1\$s\" attribute.\n\n" DIRECTORY 1>&2 rc=$RC_MISSING_INPUT fi if [[ -n $directory && $directory != /* && $uc_directory != "DEFAULT" ]] then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 106 "\nERROR: the specified path/file does not appear to be in absolute format:\n %1\$s\n\n" "$directory" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $directory && $uc_directory != "DEFAULT" && ! -d $directory ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 107 '\nERROR: the specified path/file does not appear to exist on "%2$s": %1$s\n\n' "$directory" "$LOCAL_NODE" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ $log != "hacmp.out" ]] && [[ -n $formatting ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 1156 "\nERROR: the \"FORMATTING\" attribute is \n only valid for the \"hacmp.out\" log.\n\n" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $formatting && $formatting != @(none|standard|low|high) ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" FORMATTING "$formatting" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "none, standard, low, high" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $remote_fs && $remote_fs != @(y|t|n|f)* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" REMOTE_FS "$remote_fs" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "yes, no" 1>&2 rc=$RC_INCORRECT_INPUT fi #======================================================= : Modify the log if no input errors have been detected #======================================================= if (( $rc == RC_UNKNOWN )); then if [[ -n $directory || -n $remote_fs ]]; then #================================================================ : If we need to know any current/existing values, retrieve them #================================================================ if [[ -z $directory || -z $remote_fs || $uc_directory == "DEFAULT" ]] then if [[ $log == "all" ]]; then CL=$LINENO KLIB_HACMP_get_log_attributes "hacmp.out" logAttrs else CL=$LINENO KLIB_HACMP_get_log_attributes "$log" logAttrs fi fi #============================================================ : Make sure that we have a valid directory. It is required. #============================================================ if [[ -z $directory || $uc_directory == "DEFAULT" ]]; then if [[ $uc_directory == "DEFAULT" ]]; then directory=${logAttrs[DEFAULT]} else directory=${logAttrs[DIRECTORY]} fi fi #============================================ : Make sure to preserve the current setting #============================================ [[ -z $remote_fs ]] && remote_fs=${logAttrs[REMOTEFS]} [[ $remote_fs == @(y|t)* ]] && ropt="-r" if [[ $log == "all" ]]; then print "$0()[$LINENO]($SECONDS): $HAUTILS/cllog -C -v $directory $ropt" >>$CLMGR_TMPLOG # Always log commands VERBOSE_LOGGING="" $HAUTILS/cllog -C -v $directory $ropt else print "$0()[$LINENO]($SECONDS): $HAUTILS/cllog -c $log -v $directory $ropt" >>$CLMGR_TMPLOG # Always log commands VERBOSE_LOGGING="" $HAUTILS/cllog -c $log -v $directory $ropt fi rc=$? print "cllog RC: $rc" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR fi if [[ $log == "hacmp.out" ]]; then node=$LOCAL_NODE if [[ -n $node ]]; then CL=$LINENO KLIB_HACMP_get_log_attributes hacmp.out logAttrs typeset new_format=${logAttrs[FORMATTING]} typeset new_trace=${logAttrs[TRACE_LEVEL]} [[ -z $formatting && -n $new_format ]] && formatting=$new_format if [[ -n $formatting ]]; then case "$formatting" in "none") new_format=Default ;; "standard") new_format=Standard ;; "low") new_format=Html1 ;; "high") new_format=Html2 ;; esac else new_format="Standard" fi new_trace="high" print "$0()[$LINENO]($SECONDS): $HAUTILS/clchparam -n $node VERBOSE_LOGGING=$new_trace DEBUG_LEVEL=$new_format" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clchparam -n $node VERBOSE_LOGGING=$new_trace \ DEBUG_LEVEL=$new_format print "clchparam RC: $?" >>$CLMGR_TMPLOG # Always log command result fi elif [[ $log == "clstrmgr.debug" ]]; then if [[ -n $trace ]]; then print "$0()[$LINENO]($SECONDS): $HAUTILS/cl_clstrmgr_debug_level -c $trace" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/cl_clstrmgr_debug_level -c $trace print "cl_clstrmgr_debug_level RC: $?" >>$CLMGR_TMPLOG # Always log command result fi fi fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_log_attributes "$log" properties fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "modify log -h" "LOG:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_modify_log()" ory lt<73+"bbb&Z # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_logical_volumeency    e=ailnorst "$O_cdghmpuv-CEGILMNRST[]fy&().1:>AP\b#,/02;DHUVkwx|!%'*4jqz{}378?@BFY69r !"Ժ7fbjt0׉BI|HYlR+)QS]S4zNW9Gvh A84O8y"CIAÆI'V|NCc='CfPakʫtwNjwJnnR]k' Ըtb>wEYzLħ&w.G.U7#N$4Dx8@iؽЄun_W4q䱿VMK#UuL:2 ^Ɋ1[ҸVfҳumG7BIվvJ.II>I|Lħ|CoԔ\+:{KvRuV]ӫF]S4zN̠׺w>%=Єu_(:tj>i HgbBIպku}_(ӬzWZU|T(0eU^W5\Vn7ܥ uz@NU+q3+=UVSt^QzטD׃u_(UإӪvU[bw=wNruL:2 _U]^`Ul $Ti3VngbS5TeJNNPzFz)yOIYJꙣt4헥t-Єuo='@:iQ:2 XDy!BN7\?JK轤;unUuA;GF53Gl -tJ|l&o $Qʫ{.Y1[n;}U*XXVƺh A[ٔZ'&4k8(tLeGHH|[R\ZuVz-Ņn|pItQU]]'GI'V. ( A8p %m4WeGHH|.*I[M>*kHYlRUoYiIw1<4IGl -bR.5{׹֦}޼䕦i ^oY2 iJ)fA=nu{d;*(=#8Mϭ3Ul[|ZRYx]o1)VlLS]S4zNu}_(bSt[s}o7UYuVR6i*SnO7U=UygLΔ3ɇcuVۓ7KW;0WJb WJKNvòٿ:ft0𥧊[nO7Ue KW8MWUL&;u_(^yf=U'Be[Tl+ӛٹoBWN9{G1):zꙣt ]ӫF㻄zNWV9k;en&[s}o7UYuV3Gku}_(U|%.-),.|_En|MՉƁƛtˠC]t!p1^u7BU, bWwMЅ91U4ø8V@L /f\ZuVIGl -|+pʫzvaB+pC%(UoYG#Uo JnJ:JU y ( A}5$XRMrbqt-<} Ҷ0P4[Uo )lRa˥e;I^Oy fGIٔZa;f.w8Xw (WtQY2$$@Ys.oK:|$t5:z< F8IGl -ao$t6eon&'nItQ64<<;HH#I &ʏ@Y2$$@XVR% [u]RG||$t6e˸V[)L| UEkOb ⷮR4`v$*DҠdʏ@au:{'UY'Mӽp9O Y\7Jz*nbjW H TA$$DoEdo]ԥo 𕙥͝U[^DT9pҢC Pz$FDOwRq@Ҡȃ@Y2$$@a+3K;(zNMU:u:M Y6nxwEdo]ԥ]U}7VxM Pz$FDdʏ@A-}OwRbSeUuT𕙥͓U:u:hxcH@=#Je*=BD UW0{KOf/i7! aKtW0-gU%wDΛMj cʚhY1q.C,QS"|nMp  2oQZ'tikRb# 1)ӒL-qD8M0RH(ĆEi&QzN, -xo䆒A;<$@x &APk39ǂNZxBe{]fm<((p(7W]uEvhMMBI   ]gh   ^+i8Be{׃n <0P(PPoLtIEwN48<   \\;ahREP<^usU6@C@y2uVIυx@C@y2빊Ud1r( 8S+.i3hUdO   ^XZ7ezF^SNس]&& f%H[7 \´"`R@i2~ E@(`M,[j#-{I$V-ARra|eT_&0C>j#-h#"8%H@q1-|F.ZVo j#-gsPJ ^oY3'titgBdǑ& Po-)E7LdѧPJ 1@"`, Iq:fc$31wC0M`*SٔZ'&%ЄzJ*>*pIٔZ< &J R>6^t⡿%>2N>2Nor7(R A4|d&.҅+5ҘWRvp';zUձŘb8@c,[<J`QbtBB˂(UDIeުMyl\s%_W4`n}LxX^, ^T}_(ax7=vQax7=g]"bSF6EЄ`nz #: ŁI[Mg `n|+p`n}°n)L|7=UTV$XY&wW>`n{uVI-xX^, ϝ&m1UQZꬓ˗7M^os6^trU{6v""xGD27a@y!҂)u.MJ Dq4HS0d&! #eIɅCpC(vίi:1q[URUn}UtxIGl -}V)[K/Jw*N=A'&;  (N(E3&1#Hr cI<vqIՉWu/>W`$7ӱu"V@WNwAf(S+ էbf(wiYӱuiY@ ^^;\ 1HIC@ e{Az]p,~ iغGC2Zv. 6\a@y!҂)u.MJ Dq4HS Di2h]1}abS(p > D }Lga!`AHi$4t]j)xGDҹM%&pEz{.A >|I+`VR'Pf( YBJp,w( fa!`MإC #S2_($<(}")I*Bٸzϊ31nga!`.qJfW4au:,O&1#Hr cI0c,[=UTV$9p˗[,^qǐHi$ Ph i+iJ]yN–|TҒ:)j̯UJVA3"8%H@q넨*FiLYI넩EdDO@h"&A0D,<43>7ᡠګq7A1.oPbE7ͧ% &\X-{t_ BJ11x!D%(obذ7=(1WˆJ"/Da%MiBIgE^(1WВbiه1 ĆiAFQ6%*QIDS| e*\ (piAFQAFQ0<@ICӢQL]3"8%@h(8`H&Mb(}71Un5zN*au:|I'VsVWQ؏UoJK,)CF+iILxbS֔N‘;9p<"IpӳJ U0a!`.qJfW4au:,O&1#Hr cI077W]qpוW(&Q4=yQ|. iI EF]yQ|zE$vtpLV捦\ksY ѴԳG0HɌD@` aX_4y1$1dƌ*BayK.7EKF 4Fnoeb㞻(RVo /Yz,v(R ܘJ PIC&Lh¨$&*ooLt%m4W`OJh(=#&X.9I[Mg.\Un& $4772.VEyA>+i]t!p`ct\\jC]t!pFrb)9 'tI[Me$o`fxf"P 0`҅0,/Mf2Nvq:fc$g̠֊ I;d)NKx|pIٔZylIG"W0XrV \nz252˃zq7b=+qN oNپ2Nӌ;Ơ9r $qwfUofPakԜ\8F% Hbw]+qOJ='CfPakJxVIGl -t7IF2Nx`)LtPU%)[).I:I\6"iVeoeb{ٴc$,/8%WhI $c$pmU6"iVe%gEsܕ^ͣ'ga6]32̠ש90V)[K/JNʼ،_ ylXm;˗7Me3({2 Z*NL.oa8X`ic$4(4bD0-Ḷ(0NL/{2 Z*NL.(pq؈MD 8ɌDy!&4aTG70כ\a XZ7ezF^SVlYr[2뾄(Ri!V o{S2m3K,K"s7a@y!wL>YUpNDiPzai"< 0# aX.9bY'/g\+ F̯W;[B7ez{[.oUSQL]3"8%@h(8Pd&!/qu_(fV+t8x謘x7\8R'g $$H DEbeGHaayppmU p(8VqASL&As"8$J)@"$+IA޻qu1)IٔZ8V ո{|TWE7M=wU]pC)na!`< kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZo<w9ts7NiW|z{JkuV/su_(kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZc Ϛ[[@@aP|ܘJ P ^u̠ZqP^8/Vwh/Vv է^8/Vw4N8^u ZqQӎP^84N;eӎAz㲈/VvUӎ7W]u^8r է^8MӎɠZqIӎe{Az㵓AzEӎ4ų[7C J ˗/V! 7lF u ,XB+.\7._ ˆ/V g0]ӭ7l^n,!Eܕ./Az]se{8ų.qJfW@aC@|,/ Zv,%8ų.qJfW@dB@|,/ Zv,%ųUEkO!Qw%bˆa}Lh/V{uVIob]UhusLn,!Eܕ./&iصֺ$N‡X{uVI-x ,XB+.\7._ N=UTV$ы4YDWfэt!$XrV \n\7Az[8(1.$y1- tfHab]XrrުM,[=D'7鵸 2h/젽Zv-T+iضxooeg*>pXrV \n\7u/=yQ|&q7 Zv-Gx4o+=4a^;A1iaӱng`ib4m5,7 Zv-ݝib4Vziw Zv-x4oab벌/!Qw%bˆ˃zq7'Re*^iػ;pP ӱwh4772ų蒶+H7C J ˗VoN%m4W7wMЅ7Mӱii1^ էbwA#Koiشv BSFr|Ct^;H4< OAz ^ /S/S OYz/S^}^AzTP^=4DP^rުM7y5<X $p  q@ Z+*RV Az/SAz Az9xAy O]x O /S< ^<&<(< <zN, -`P$b"' Dq4J bP 8IM), DaA4"Ep֊ʪA9^x ^>^AzAzAz/SAz&>h/S< O*=젽O O O2%2 X( `yIsכ\a XZ7ezQ¡\\sUEkO qqsU4b qqZꬓE; aP.9͢*+]UxT+|$tfPak˗[BJ*1jyFx2qJfWլ*nzfo+]7USՉebS %tI@J770ɌD@` aުMNE1t@hWQ:(0fPakEIɅe{Az笚 =Az焐^ ^os7 Ѹ3+L`|;i3rc(0iBhh7ӢQL]3"8%@h(8P )&Hy! siU:s(p(} N6#LpqqCLR"/IGaA19-Pk\X;&^V1Un5zNHwF!Sc ϚA ܘJ P SL&As"8$J)@g DHpZ}e8V)L|kIU:u>.Z()ao2ű`n{uVIax7>XZ7ezQ˗ųbhʐn/=g7Q:(0 00M`&of6n{5J֝efO][Ї't70& 6CpmUeUռכtI>f2Nvq -h90Y;dURњJ}-)E7LdכtI=A'&;:k'loo!kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZ֛!1b=]9xMӺU:/NIkո.ataE.|C kZֵkZֵkZֵkZֵkZֵkZֵkZֵkZֵkZִ3"DyBDy!0\*Ϛ[[C&Lh¨$&+Un& $4PE:.bTH{6 c'se Ҷr.f[*B2 XE<$*<@RPYIdP2S1I_RΎRbE#KtUS1)C(vVE6[ T8R";7夛%2 ^-S 8x"E#D2NQvtΊxMW}\J쨊oHDD&R"doOM o{*"79 ,y䆒@a@8h Mvisfu'ky龁,+&9y5"8%H@qsiA\;I.l|XO=7%wX/7ƹxo|kx,04Iᇔ1@⁢)5٥͛YO sWϥ͛"' Dq4J c,[\ٹ˃j^usiᖒϥ͛bŘ 7W]uzm<2VYsºLWc,[\Vo|kx,04Iᇔ1@⁢PFtW>2NY<\3s;Q^osi k93+>bbb&> # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_method_volum#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_method.sh 1.7 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2009,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)37 1.7 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_method.sh, hacmp.assist, 61haes_r714, 1415A_hacmp714 1/13/14 16:46:13 #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_modify_method =head1 VERSION Version Number: 1.7 Last Extracted: 4/18/14 01:31:41 Last Changed: 1/13/14 16:46:13 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_method.sh, hacmp.assist, 61haes_r714, 1415A_hacmp714 =head1 SYNOPSIS clmgr modify method \ TYPE={snapshot|verify} \ [ NAME= ] \ [ DESCRIPTION= ] \ [ FILE= ] clmgr modify method \ TYPE=notify \ [ NAME= ] \ [ DESCRIPTION= ] \ [ FILE= ] \ [ CONTACT= ] \ [ EVENT= ] \ [ NODES=[,,,...] ] \ [ RETRY= ] \ [ TIMEOUT= ] NOTE: the alias for "method" is "me". =head1 DESCRIPTION Attempts to modify the specified custom method to conform to the provided specifications. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the modified object can be returned to the caller. 2. name [REQUIRED] [string] The label of the method that is to be modified. 3. type [REQUIRED] [string] The type of method to be created. Valid values: {notify|snapshot|verify} 4. new_name[OPTIONAL] [string] A new label for the method. 5. new_desc [OPTIONAL] [string] A new description for the method. 6. new_file [OPTIONAL] [string] A new executable file for the method. 7. contact [REQUIRED FOR NOTIFY] [string] The contact information. Might be an email address, pager number, etc... 8. events [REQUIRED FOR NOTIFY] [string] The event(s) to provide notification about (i.e. when that event occurs). 9. nodes [OPTIONAL FOR NOTIFY] [string] The nodes that the notification will be sent from, in priority order. 10. retry [OPTIONAL FOR NOTIFY] [string] The number of times to attempt to send the notification before giving up. 11. timeout [OPTIONAL FOR NOTIFY] [string] The maximum number of seconds to attempt each notification before giving up. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_modify_method { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.7, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_method.sh, hacmp.assist, 61haes_r714, 1415A_hacmp714 : INPUTS: $* typeset -n properties=$1 typeset name=${2//\"/} shift; shift typeset -l type=${1//\"/} typeset new_name=${2//\"/} typeset new_desc=${3//\"/} typeset new_file=${4//\"/} typeset contact=${5//\"/} # Notify methods only typeset events=${6//\"/} # Notify methods only typeset nodes=${7//\"/} # Notify methods only typeset retry=${8//\"/} # Notify methods only typeset timeout=${9//\"/} # Notify methods only [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset dopt= Nopt= typeset -i i=0 #================================================================ : Assuming an object was specified, see if it is a known object #================================================================ if [[ $name != *([[:space:]]) ]]; then CL=$LINENO KLIB_HACMP_is_known_method "$name" (( $? != RC_SUCCESS )) && rc=$RC_NOT_FOUND fi #================= : Validate input #================= if [[ -z $name ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif (( $rc == RC_NOT_FOUND )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$name" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 149 "Available Methods:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_methods available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi if [[ -n $new_name && -n "${new_name//[a-zA-Z0-9_]/}" ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 105 "\nERROR: one or more invalid characters were detected in \"%1\$s\" (\"%2\$s\").\n\nValid characters include letters, numbers, and underscores only.\n\n" "$new_name" "${new_name//[a-zA-Z0-9_]/}" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $type && $type != @(no|sn|ve)* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" TYPE "$type" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "notify, snapshot, verify" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $new_file && $new_file == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 101 "\nERROR: this operation requires the \"%1\$s\" attribute.\n\n" FILE 1>&2 rc=$RC_MISSING_INPUT fi if [[ -n $new_file && ! -e $new_file ]]; then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 107 '\nERROR: the specified path/file does not appear to exist on "%2$s": %1$s\n\n' "$new_file" "$LOCAL_NODE" 1>&2 rc=$RC_NOT_FOUND fi # : If nodes were specified, verify that they are known nodes. # if [[ $nodes != *([[:space:]]) ]]; then typeset checked= typeset -i all_nodes_found=1 for node in ${nodes//,/ }; do [[ " $checked " == *\ $node\ * ]] && continue checked="$checked $node" CL=$LINENO KLIB_HACMP_is_known_node "$node" >/dev/null 2>&1 if (( $? != RC_SUCCESS )); then rc=$RC_INCORRECT_INPUT all_nodes_found=0 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$node" 1>&2 fi done if (( ! all_nodes_found )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 151 "Available Nodes:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_nodes available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi fi if [[ -z "$new_name$new_desc$new_file$contact$events$nodes$retry$timeout" ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 401 "\nERROR: no valid modifications were specified for \"%1\$s\".\n\n" "$name" 1>&2 rc=$RC_MISSING_INPUT fi #========================================================== : Modify the method if no input errors have been detected #========================================================== if (( $rc == RC_UNKNOWN )); then if [[ -n $type ]]; then CL=$LINENO KLIB_HACMP_is_known_method "$name" else CL=$LINENO KLIB_HACMP_is_known_method "$name" type fi if [[ $type == *,* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 34 "\nERROR: \"%1\$s\", is ambiguous, and could match any of the following:\n %2\$s\n\n" "$method" "$type" 1>&2 rc=$RC_INCORRECT_INPUT else typeset CMD= CL=$LINENO KLIB_HACMP_get_method_attributes "$name" properties TYPE=$type case "$type" in no*) [[ -z $new_desc ]] && new_desc="${properties[DESCRIPTION]}" [[ -z $new_file ]] && new_file="${properties[FILE]}" [[ -z $contact ]] && contact="${properties[CONTACT]}" if [[ -z $events ]]; then events="${properties[EVENTS]}" else events=${events//,/ } fi [[ -z $nodes ]] && nodes="${properties[NODES]}" [[ -z $retry ]] && retry="${properties[RETRY]}" [[ -z $timeout ]] && timeout="${properties[TIMEOUT]}" CMD="clchpgr" if [[ -n $new_name ]]; then print "$0()[$LINENO]($SECONDS): $HAUTILS/clchpgr -m \"$name\" -c \"$new_name\" -d \"$new_desc\" -f \"$new_file\" -N \"$contact\" -e \"$events\" -n \"$nodes\" -r \"$retry\" -t \"$timeout\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clchpgr -m "$name" \ -c "$new_name" \ -d "$new_desc" \ -f "$new_file" \ -N "$contact" \ -e "$events" \ -n "$nodes" \ -r "$retry" \ -t "$timeout" else print "$0()[$LINENO]($SECONDS): $HAUTILS/clchpgr -m \"$name\" -d \"$new_desc\" -f \"$new_file\" -N \"$contact\" -e \"$events\" -n \"$nodes\" -r \"$retry\" -t \"$timeout\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clchpgr -m "$name" \ -d "$new_desc" \ -f "$new_file" \ -N "$contact" \ -e "$events" \ -n "$nodes" \ -r "$retry" \ -t "$timeout" fi ;; sn*) [[ -z $new_desc ]] && new_desc="${properties[DESCRIPTION]}" [[ -z $new_file ]] && new_file="${properties[FILE]}" CMD="clchcustom" if [[ -n $new_name ]]; then print "$0()[$LINENO]($SECONDS): $HAUTILS/clchcustom -t snapshot -n\"$name\" -N\"$new_name\" -I\"$new_desc\" -v\"$new_file\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clchcustom -t snapshot \ -n"$name" \ -N"$new_name" \ -I"$new_desc" \ -v"$new_file" else print "$0()[$LINENO]($SECONDS): $HAUTILS/clchcustom -t snapshot -n\"$name\" -I\"$new_desc\" -v\"$new_file\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clchcustom -t snapshot \ -n"$name" \ -I"$new_desc" \ -v"$new_file" fi ;; ve*) [[ -z $new_desc ]] && new_desc="${properties[DESCRIPTION]}" [[ -z $new_file ]] && new_file="${properties[FILE]}" CMD="clchcustom" if [[ -n $new_name ]]; then print "$0()[$LINENO]($SECONDS): $HAUTILS/clchcustom -t verify -n\"$name\" -N\"$new_name\" -I\"$new_desc\" -v\"$new_file\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clchcustom -t verify \ -n"$name" \ -N"$new_name" \ -I"$new_desc" \ -v"$new_file" else print "$0()[$LINENO]($SECONDS): $HAUTILS/clchcustom -t verify -n\"$name\" -I\"$new_desc\" -v\"$new_file\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clchcustom -t verify \ -n"$name" \ -I"$new_desc" \ -v"$new_file" fi ;; esac rc=$? print "$CMD RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 400 "\nERROR: failed to modify \"%1\$s\".\n\n" "$name" 1>&2 rc=$RC_ERROR #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== else [[ -n $new_name ]] && name=$new_name if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_method_attributes "$name" properties fi fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "modify method -h" "METHOD:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_modify_method()" ;;  lp;3+bbb&"g # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_mirror_group = einrst"$ER[]_acdlmopu/CGILMNOST\bfghvy#&()-.12:;>APUkw!%'*,0iX4~g6皛nGѩ6Lڌ56s5͹jmY e$%Z56qY,52EQ+`ÍPTuD@ÆEAjeH2k h0((h0"( SS.<@j6 l@SS.pqFQ۞jmF2wj3sTug6橩f)LT6 Uj3sTudP˿O*@6 l@SS.#-ͮ7 ɶr,AAxV-ʁ}b$2^@?rm 0H\HT6 +-jQbrӚqevM V m뮴 9A7 uf{mSSm4D"D+8ҏ,n+;fzg6皛nռ6b&cdP(,XBbTӥgQÔv9ӌ°{?qhXbve(LTn7Hʪ?m,ŧZie]=b\e &)1+:c#Ox`WV\snF|BUVc#Za-FVCzN3 ?,nFp9Q]vii0vczSpU6- V-ZL?i1g;%͹DV[2n,Z5f[Spm8+2kMV,7 ţ81mZJWh]N,BU3սnAxU]MO]f0ȇ?*A>mc+Ffr240~q]j nM2ň&*EM:VqX3PM\ n e7pqbܺB ?b4Ab "+8ҏ,n؍(H1n}MÜf+X.XIc 2ň&*EM3 FKf 0) eg@W'(,XBbTӤ*S0q!: ېՋr{332(%"@M{ 'TZnLb SMUG7Nb3 &)n}MvN23g\2mMjŹbVu} rb~" (,XBbTӥgQÓlCvc288WZn]!W\{4  P4YFcp2.Ұ88#Vwj3sM\cp1bMM-CkK5&zeVMn*1˴&sٌ eVζ3Y1սfeVjοm56sbZ,2,:AŦ`ܕ7EX4  P4YFcp܃\ʌh1n}M]iXOns:9'vb2jh"HzJD$"^yy"EP ӴblX^Gb/C$@RǪ@gAHDL "@ T*8UZ56qUYõ3j3sTu ֳg *T\pJCDf*T5?=X`i MeWg- 3H?\hЭk:&X ,7&tåѥjuj('$OB\w?QA>'!ѥjuqCA!F!gmͷ\?H 4N <ۮbo5Likqé8!*U+(YYa/1< ] (H$H ('$,sr9 n=iՍB[ёcC`s*rYɶ)HuRÙPLB@[\y N Bs9Rdm(T5SsPzW&yS<5:)  #h1G: Z j bЙֶԀteHJNC]Zqr+qfmFkY2C,E@gM=rd{WT('$+SBv13Rd{WT('$+SBϡV 3:i$X ,wYEѥjuY5ngO hҵ:-FkY2C,E@b13M x$14ĨIEunUݿKXZ/1"s2m?*:iT 2 .7VmqpEԆM2HT4bz;%iT 2 .7)6,RcC_lBϡ.{OB\wipe7QL,/i!g{ cLFCXPMIIRD$Ty\@@^HDŌ̻Ax̷dX潠HQ$YRŅ?^3:iЩ!SpƻI1 b5CXu4$=%J[@qCTQqIHK< nuq[CȼQ?= rb/C LqDDqeH,13ʑa*k!%G^J(Sp®X=fbՌu7Ax&TRȓ-Y`%riXJ Κz:; b8±­4K('$OAvHҰ{ :, POI駡SCσKܩVDH%ܩVv=f&t]R4%^$&2 N}MOM= r|\E0vHҰleK]R4%[>M3H?k(T5S@qCT%$=%IW痒)$Q!.281c8.ã^&c3-.x@.x<"] <<&TRȓ-ʑa* k(T5S@qCT%$=%IW3332(% B/#€M k T1Iŕ LX\13- r 7 ?k(T5S@qCT%$=%IWL^HDPNMY;ռ8<<82 DcЩ ~ ("h$9RI$GT1ar3:iRcPViX5L x$14ĨIEunUݿKXZ/1RBK"Hqf]*5hvTUݿ&tЩ!@e.qYb8¦ 1@aXaV POI[qf]hiV汨+CѠLOařv M1*8Q@E0vX?q@h)DH*GV4TbMZUj +8.5Tȕ+7 ?k(T5S@qCT%$=%IW痒)$Q!,qP œAioT ^E~ze k(T5S@qCT%$=%IW`.xŢVcPʝ`ȼ^ru-V08D4I$A£ *iUiV汨+CŢ̷<03,qh`%@44OaΚz-V0B*5/% POIN2yzXec 4"LnP:#{5*@$ʐ&,.Yb3H?k(T5S@qCT%$=%IW@l^HDPɓn c18<<,Q!QT T$ #a.'A&(*iX潠HQ$YRŅ?_f/L駠g6櫋FtׂCLJ,P7QA>']İzŅn31 ETXTEs2qhΏ Κz:;\ESB HeeqEmW4h(nm駠qf]wCLJ,P7QL,/]V2vF"@$`QJQąc2UmW8.5Tȕ+7 ?k(T5S@qCT%$=%IW痒)$Q!,qP œAioT ^E~ze  H?_r8`fU$@[ ni1#!Qƨk$TKh"HzJ*< xŢJ3sŖ$^E~ ("됤+qh`m$ L HYVcJg6櫋Ft8YX0qXb-V0 6O@"ŢhE@bTqe$ 7 ?UÝ/T+Z,a&T 1 rqpDs{潠HQ$YRŅ?^3:iЩ!SpƻI1 b5CXu4$=%J[@qCTQpIHK< Xܙ; 3Cȼ" $Q%EH$W,Fq|@P,E^Hr (H,bf/3&t7Ea%305/% POIWwwwwwwwwwwwwwwwwwwwwwwwwwwwv,1ajFG L `⪢LT "78.K@0Uݿ&tЩ!@aXaV?QA>'Κz$`w  T4SpXIc >X0`O@0 1FCA: 7 ?0؍0=fi1#!Qƨk$TKh"HzJ*< /$RHB\dqfbqf]G L f[\8t(\/.xD.xyyȤT*1P$ XIc @vb2jh"HzJD$"&x=fbqf]8t(^E~|gaC@{A!ʐ&8I"8 fi1#!Qƨk$TKh"HzJ*< I" gKۓ'sݤcSyq(xyy#UbIA-&i@{A!ʐ&8I"8 ^O@rqnq x$14ĨIEunUݿKXZ/18( ̻-tUŹƧ_wwwwwwwwwwwwwwwwwwwwwwwwwwwwwo4*uwyPV20UPOIHhN-5;O  諓sN]hLM@a84N-5;ghvb2jh"HzJD$"E$$%Gf,getr `eBKB燗8 ,E@8( W'? i1#!Qƨk$TKh"HzJ*<gf,gePKB^G"@M? ״c$#*@gYw &4d58 aD*mIIREGP)$Q!,8?icrdbjo<"/"`⪋$@D 3(+ZL*Gb/C LqDDqeH,13*eZŨ6p5/% POIWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwo3dktr `.LX2hUTH-Y`%n'Vj W]ݿ&tЩ!@aXaV?QA>'#h Me3LV4VN | Wd*-Aj~#"*L AU,@%?03@`kQqÑ*W h$9RI$GT1ar5Likqé8!*U+6/$RHBYq(~v7i1xE ^Eɋ&Mj⪖ I(+ZL*Gb/C LqDDqeH,13u*jm05/% POIWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwv,1ajFG L `E" ,˰8.MM\®3N= F 7 ?&thҵ:;3('$cLFCXPMIIRD$Ty\Ay"E!C;&N!H1Ʀ(P/ F(D\*H\C,F. P+gb/C LqDDqeH,A:) Y\!\::̲TTnɋ5ZPTu  L駠pw6۩G('$OAJןC?QA>'G:Q-8!*H `E$$%B,wnLCvcMP^@?mȼ_SBŢ&2D8Tq!eY*u*jm5-V0eၜl'D)cE3*ᡢ{ &tqh`P'&Yx (n}MOrqpDs+f g_rܜe\9f/3 &4d58 aD*mIIREGP)$Q!,8?icrdbjo<"/"`E" ,Fؠ0dai0M k T1Iŕ LX\bΚz FׂCLJ,P7QA>']İzŅn31**,˰b4®3N= F 7 ?&thҵ:;3('$cLFCXPMIIRD$Ty\Ay"E!C;&N!H1Ʀ(P/ FT@W'Κz V\` 7 ?k(T5S@qCT%$=%IW@l^HDPɓn c18<<( G'8ʸs9EcE3Њ3f/aAN2y3ivb2jh"HzJD$"( (xA ݹ2w1 Af57By2e #lPV20U_5*@$ʐ&,.Yb1{gM= FׂCLJ,P7QA>']İzŅn31 Y̻- FUݿ&tЩ!@aXaV?QA>'Κz V\3('$cLFCXPMIIRD$Ty\Ay"E!C;&N!H1Ʀ(P/ FTdsT@Yns:~ ("AHDL "@ T*8lfJ5#XbXu_8`fפ9R"T'$h$9Re *EɃ_5Likqé8!*U+s(\8t(\NMY */"?= F? i1#!Qƨk$TKh"HzJ*< LSE3 k y :) Z,a?q@h)DH*GUҪ55-V0eၜl'D)cE3*ᡢ{ &tqh`P'&Yx (n}MOrqpDs+f g_rܜe\9f/3 &4d58 aD*mIIREGP)$Q!,8?icrdbjo<"/"eHG<@Yb8±­4~ ("h$9RI$GT1ar3:iI*n `k!%G^J(Sp®X=fbՌu7Axɔ&8@̻- 7%MV#A]gM= r{-&inL駠ѥju`kϜns:~}MO&4d58 aD*mIIREGP)$Q!,8?icrdbjo<"/"dTUPiVy! #s5ngO^3H?\!\:9ݓ N BYY:XDrH숩1;@*`H ]-Y*؍0w0ؒCab84'OA,;lExܫ;Ywx$14ĨIEuەc'`OA,; 7%MV#A$˿abw&䩺*h1nŞsr9 ׫xk̶옱nP{g ٖݓhhSpƻI1 b5CXu4$=%J[@qCTQqIHK< 97^\iPVӓuh0^EBMStU`@P,E^Hr (H,bcLFCXPMIIRD$Ty\@3N-V01cgig˭BE^Gb/@*`H ]-Y*؍1@8ʸs9_f/5Likqé8!*U+6/$RHBYq(~v7i1xE ^Eɔ&8@dm F X潠HQ$YRŅ?_f/L駠n `k!%G^J(Sp®X=fbՌu7AxU*ge hF Κz:;(+ZL*G('$OAJן88#VtE5Likqé8!*U+6/$RHBYq(~v7i1xE ^EU*g`788#Vt@P,E4uRãm1`됤+%~îŋ4u3 y37EX_5*@$ʐ&,.Y&4d58 aD*mIIREG`'vb2jh"HzJD$"( (xA ݹ2w1 Af57By4PA C,Fݤ&~ ("h$9RI$GT1ar5Likqé8!*U+6/$RHBYq(~v7i1xE ^EDq@z)3-&i4J .@\N+6gb/C LqDDqeH,13C_^ M1*8Q@E:iTؠ0dai0M4iZr 1ДA:?'vb2jh"HzJD$"( (xA ݹ2w1 Af57By4PA C,Fݤ&~ ("h$9RI$GT1ar4gM= ‡dbTqe$ 7 ?q@h)d걒t*&;= ‡d-'Vd[ijs‡d46!ʕ9p,/C LqDDqeH,1^𫻻d oX3!X/X1۴̭0Vk1洎eS36Spm56sX97\!-~XiƏv3MvLBl` ݬYN*3hM~Hre9<44OI:) eYa9,͞{uRÝsŅH%Zʑa*ۚ+RIxfۚ+Xݮ]sXV S7Ea%3dR*EDEn]諓sNȤT*,,˿8ʦbvBň&5PqUK$ArwFI",P*Hz⪃HrTb4IbH(ARC&P8@p/M ţ5`rPm휄`$" ,Q TdJ&؀PUIT@j9IX6˭ASSm) PI!P4P(ma9,͠ $ ]a9,͠ PP$H&ÀB]a9,΢X_.fЌ f^Y2,FU'&tÀ@̻ ,/EB fT ('$Y#*rY.z ֳh@ '%P&\f/aAb]ݿK$2wmFsnyLov'6L!% z]ݿ&p T\L'7 ?\!\G+K'!SCn5Ysq r~ 9 0ՋboK 9[?njŃ17C8Qq X~&&Qef/M<:Z *F(l8ւʑa*ålC9[?kA؁M<:Z휄X_2Vç8.LM<:ZE0"VÒМ(vKåmұ*X^@ۚ+RIxåmҵPmaax8vJ-Aj{OFj%Uk۵S Ŋ9[?qhXbv4haaxQpnKf åeStVj _r~]d*Pmڞån88aax@*S4hI!aa| 9[?b4hR5)(l::`{OaaxG+g:nJF4hF)r~Ɓ*h0{OF!X^t V\L駇KAjq0aMEeeqEjq0aAACpole0Y`4h7 f/L駇KBnk;Jj('$-8.Ì4sXV PhP&'ʔr*Q+qf]aAbΚxtqhΚ 7 ?s,˰-Qۚ-hP&'(igG+L92 3&tåh1MEeeqEbF1=G+K=9ZahY`{nP3-PTuj('$-8.Ì'e֠47 6J9ZY2Qg@̻rrqpaD4IP1(LT4K@*`@֑*ѥX[-95MM\éSA9T(PG*EJ9Z pAŽV(P Qʠ(P(Pl rAbVDB% re(Pr₈"HzJ$,D YX6[5M-&(   [ miU չj3sTu:::QʠLAU r$QʠT 9T(hUUbU9Z G+D(hJ9T Qʠ2QʠG*QʡRUG*hg8ʹS@h(bQP4h [ miU չК₈"HzJ$,D YX6[5M-&9ŽW&p HrED\44OI]ƘG:Q-8!*H E$$%Z,6L!Cȼ5͹jmX潠QI"?^𫻻@۵qf]MƛnBkV-Z•pW]g КސJRhhSpg $=%A*ZiD,Y" 7 ?q@h)DH*GT*Qۚۮ*k8vz Fsnjn~raGb]IJui ׄ񕩱 zV9!Ѷ.u5 V-ʏ 5!ʒ Tc LX\ hM~Hr (H,b,/.O@qCTx&Yx (nIHDMvUb5CXu4$=%J[@qCTQqX MiÌ6[ݮŢەrvUX u.zQr-. ZE5br&z,&ʝ`(miin,jͬrB\eJ0`Gy=pbJ]O6pcs˞5LikKK]Lᠢ#Y<"] ?h+` # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_modify_mirror_pair =head1 VERSION Version Number: 1.4 Last Extracted: 1/31/14 04:41:37 Last Changed: 10/24/12 17:32:19 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_mirror_pair.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr modify mirror_pair \ [ NAME= ] \ [ FIRST_DISK= ] \ [ SECOND_DISK= ] NOTE: the alias for "mirror_pair" is "mp". =head1 DESCRIPTION Attempts to create a new mirror pair. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. pair_name [REQUIRED] [string] The label of the mirror pair that is to be modified. 3. new_name [OPTIONAL] [string] A new label to apply to the specified mirror pair. 4. disk1 [REQUIRED] [string] The first disk in the pair. 5. disk2 [REQUIRED] [string] The second disk in the pair. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_modify_mirror_pair { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_mirror_pair.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset -n properties=$1 typeset mirror_pair=${2//\"/} typeset new_name=${3//\"/} typeset disk1=${4//\"/} typeset disk2=${5//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi CL=$LINENO isEnterprise if (( $? != 1 )); then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 184 "\nERROR: this operation requires IBM PowerHA SystemMirror for AIX Enterprise Edition.\n\n" 1>&2 log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset existing CL=$LINENO KLIB_HACMP_list_mirror_pairs existing 2>>$CLMGR_TMPLOG #================= : Validate input #================= if [[ -z $mirror_pair ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT fi #================================================================= : Create the storage agent if no input errors have been detected #================================================================= if (( $rc == RC_UNKNOWN )); then typeset nameOpt= ssOpt= vidOpt= pvidOpt= [[ -n $new_name ]] && nameOpt=" -N $new_name" [[ -n $disk1 ]] && d1Opt=" -d $disk1" [[ -n $disk2 ]] && d2Opt=" -D $disk2" print -- "$0()[$LINENO]($SECONDS): $HAXDWIZ/clxd_change_mdp_director -n $mirror_pair$nameOpt$d1Opt$d2Opt" >>$CLMGR_TMPLOG # Always log commands $HAXDWIZ/clxd_change_mdp_director -n $mirror_pair$nameOpt$d1Opt$d2Opt rc=$? print "$0()[$LINENO]($SECONDS): clxd_change_mdp_director RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 201 "\nERROR: failed to create \"%1\$s\".\n\n" "$mirror_pair" 1>&2 rc=$RC_ERROR fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_mirror_pair_attributes "$mirror_pair" properties fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "add mirror_pair -h" "MIRROR PAIR:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_modify_mirror_pair()" fied s l*?3+Xbbb&7 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_mirror_pool   = aeinorst"$_cdfhlmp#-ACEILMNORST[\]guvy(),./12:DGPbkw&*0;>BFHU{|}%'+347/6g%p7hh)aWI+9^X!964  C1( p C0spPB(@V(Mwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvэs ahS:B!8Pq~اXJ=VuxSOHYb`3-)OBse%=V~iWNQVՄэ'kA.Y < CTS%U\53*v ?freMgQnٓ'Wu^nagUgϑڲv7g'rG}:@_QcFeS9pWr7Mӫ g^xfeə{Fe <ο9gzYuY(GXJ-WQ焤PZba(b^BᚲUҮSFrQ.ua"rkF4eU; G4  C1( p C0spPB(@V(M9tA-oO>Luh}]NrLK!HS쾏zKah@HS쾏>AƐ }^q;D" oO>$4pM>WՔzT?i}CM$ܚIsֈDC oO>~)Y,.Ɛ }]HPZVI9E-x(886 Q*'(RUNQ@ (ɑ2"lXp`M>BJJobGhCà oؑ!!Aj%Y%7# mo:#,"bdJ xf@#/ebroty˝}wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwmǬŵe=ڏVzk_0ܤuXDxUi(5.sN,= @8PQ>aMo˻ox(꿄Y;V\ɜh SII|ٶgſ>.^ fpqtG&&Y!IPK np3k`8[]%(9D$\䉉Hq2x j$ *XGb"s*oN\e=5JhQHqra@[#ZBV{ϛeE4tS_GLJ$LLCʓ&8v4ƈD$`0DD<LH9.CM@4 @4LL'1)z]GϬ-!|]gV~؅)o3k:!4n&QLHQ08ġFWq?T|j4jFMVS‚^D D"0y1 /"X[ԓdΈDy1!HmϋptN?ew&nRBب/]YO{ BfpqD4P @(P 5+7[bRp7Gdμ"s[8FNhh7X7IEoӴKHȔHA@z=Z$ P" H8y1DD!x'9M&e%b2h"zKa Q烢uu` =W pya@|,,gſQ(sM䉉H#,2ePŊѢ}8ʻeYop@4Cb1Hd1<12.&_ǝ*p?%N:ҥzNr̤zKa-e}qI`h!(8 A (TH{Al)L9GD:99g g&qx9 %Ƌ ]8*$C8.pST1ARM(Pq2RkF>А:Ʉ 8`(%r_h*L1sLR2Qm2g% &C6o2!hG&LPqx  *$@ \DD(THp% &AJ/k]ݷGZkY/W]}z7Va':ɿ:rνV{eDe68+Qed6:*BJI)X Q*)~l/ϋ}ԅh"(-D$*BJJobG}8IHPZA>a‰M;D@AF)B#Rpp`vIL wx$(ɑ2"l^li5N$(-h"(,[3R/N bۺ2%"sՔo Rp22Q>V~YɎ:d8+ї`s&tT9`>-fpqtRC dA{ԅGW2gCD"*$@pp`vZ15sfUJQ(sM䉉H#,2e(9,Xa%ї`8G@FpUgτO9x(|e]`UzKa:04@4@}e8IHPY OIs=#P;DTb$D@aD4+7Y^oV"%+}DAa'U !dȉ(`8 %45^o̙e .;kDQ$PX'6lgſZ$ PqWh"(,$I"D! Pq׷6Ji kՃՃ[pQ);H@xa`>-va*a qPA/C jTofz=8D^"AF"DHCAH.ȃ؏7MG~);9XG}*\ɜltTdS6mYo̙RUNQMQX'6mYorZ!!Aj%Y$FSĔd X7X5W2g!Aj%Y%7#͛oV|[s&t4Tdď?C&Ty蹇F8$, ͛oV|[(-D$$yEHPZVIMHÑq%!A`Y=mV V V RQ{Ճ[s&qы6 e}ph$/hbxp4P a6\ɝAXdȍro6l/6lgſ鮒eDy"be.@ƈD$L|<0H,T(%7/4tܝ_:bWW:0z4C @F^ i:t:Zt uW΁v*>tNS}9Esᦢj >1x\D#<88ˆ(d  o֐Uv]h&ΛL]~*1>ɉZ!䉉HyRdƘHdP( ٜ#\i lqt08bFJ3Q5APSI7&\x0 (9D$\䉉Hq2x:: Uwr |X}MDP/󠻅W{ǒI(@\$D: UwYO `_1tp2 6,,&\ɝ: UwFxdȍro6l/6lgſ4膁qAw (M(4膂 va(GU sf@#T51+3+)גymϋ*ZkJn8 V fptD 6rʔ.#,="%,X ((1Fi3<12 x$(ɑ2"l^lIJ2ci<12 cDy"be&\L ҞĦVSaՄVGk󠻅W&k FCXgY5H"0Dp`<44n:j.^]XxgzRB5zi)Q y3wiGy<_Z3MB5zתίUM̳995YbY81W{FgiY0R\e]gYp*}ago џ*v l#_ãe6XJ8+7[hqɇV =vu^ꝛ+&U% "_Ӭ%Fz#JcFbKP:W%z p paՁY3Uua(UL (TPg^~)g/ g:;.8VSaՄNBz"B]^Z121dh#%cFeNՓRQxkF4fY;8Gsʼ#WGXD􅞠[F4eU; GQ焤o=v> Q烢uu` =򃉐kp8j@Ɋ$Ĕb2m(% "]]ؒT'9M&e%1It 73LxLK0fo4$&A!2B90fo48HJ!Aa!BCCMM*1HPX`x0by9sK ""TTz:BJ-Jn8HUsyreDXFI?y88a.J^ Vg^%?u)$M |:5Me:*:X=u7b"ܧg򚚏UWU\uzYǡ){.u7=W^R<3*7kp %*(`RҳNo SNlIG}V6!9{25(9Mk[x)r_Mx\.Jkp,7VSMPS̕0DAčEe%o:SMݱ Sٔ՜CMi2;MNr"sCMi2;MNr"p3yǂV7*"WMɬœe]ɦR57u4rk=%fJ"TF4agsD8ܚב&\Ք Sٔ,)'9N8Y9ܻIs?`+V~I$ܚ}i^27 ?[U Sٔkp I50fJ"TF,ʐM/N !F~-nag眹U_4W"WMɬWG<ο0P( kpPn(-D$(8+8DObS~(-NܢegBse%g&::CZ<<7RUS{e].g)qqWTn; NdqwSb"q#L?Qzuz")ׄzI>; MGROWx *ӂz馶-U5D;V]xJIִeFf~^B90\Uy&-{ ֝e*iNJB':UQRϏUFՂMBS=oaӔ`70)$Ŵ;J^U|^?V 3B/**pf¸_ޠkF]ݴfJI|tUAh5(0]:Th8љ"їwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwm=\+Jɛ-j/*[[.pF]ݴ.u lA3+Abbb&( # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_networkool   =e inorst"$C_acdlp/AEILMNOPRST[\]bfhkmuw#&()-.12:;GUgvy,0>BDH{|}!%*34579Н2e1Q`f=V0b 9)dUXrӄY, Xc*SVqBqB؜/?o)+)NʸT⒰NXr tbAr\|ؾ&Xn4S,]*= w #'PRd 85BD XHgK AΫrÍ=#X0d`@x1@pȔPqusCN@N CTTPm@N @X kBrV3s(Lr>kdVnðusy M|ZX^ ``qAa+-eG&(U1G.BL 52 &P@jeP`"cH-eLrP+!ҝj9^k2(Hq.*88mX f[ .4@rL@`xpppx(krDˎv{8'.pѹO6:nHq:UsA<޽U.pփ8Zzǔha 9⺻gՑ4D$8@ C$8v^ hڳW M40O&mgŕa8nHq8걯S Aef=LX tt堂+[OӃ Aef=[N 1 w-ZeU~;ҝyM je}V5pjpa,]3K)TݰƦPn580Vn.ܥN*nzh @U]%Mxjdܑ2tK*G>Sޯ+MhXT( X Qo+8v靸YdC&\p3Õ9;}uf[K B8N99& 9Vs7AkN zt LEwQ40 pI.1 oER#do-q@xV1zG@aV>8bᩑ(.><# @<@ 7@ $"y"oٹ\ f$r=I 2.BhaԐ<0#-7+ٺH e]3$F 2.l H 2.熱ZCD`Efs@0#-7++ZfcD`Efs@MSlZ;0$ e]5Mj3qtD`G4 DL $'`~Ѭ(+ Cro`_UZUeXArkj#v=uuk0Sd~pփ砽 v'𚪪B 2/ 9@h(TpWe< 7+,[5?ƾn N 1b +7AL N 1 w)q;| 520S Aef?B\dN<[J# '+I2DʨXq}$*eDUaʰ#Rz:) *đaB $U5LR.E HI%Vo55UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUMH⺯liU&mgu wyB֛j㙃OO`%`0Y2eUDѠѡ.gmL$@y!ĉqS"QGICςDOO" MB‰8l03 $U5 .LP5UUUUUUUSpU.sA6UUUUUUUSs0c tsCv%ɓe"eT,8dPa2x(e㊕&TGWzc 3%<^2/G7+RESPŇPy"a0(eSP2 p.gmQm?!\6ZI"&UBË&@U-4LqRʈQC̥#(eV< L2/GE''aB Qm?!\6ZI"&UBË&@U- ʹMy+DLaB oٹ\Es b HCD:SQ40j*6ŷ#P1 xJʹMfcA-X``㙃@Es b$A 0`FL44%ϞCD,Ta'o}Phks0c ~ OaAXkRШD F 40"hЗ3A(6^L-$*a DLK @N*TQ7ʰVZiD2D2e^V[2@|@Wz-ܸ=p/2tR}Q40tRШD F 40" oVI*TreHvs[㙃k.͊'iL]O+@<4 Tf s;oonx L2_I2DʨDl<<e㊕&TGsŕaʰ3k8|#D2#QD #(z9p PvSfaB Qm?!\6ZI"&UBË&@U- _U!2ѹp<PNTs(డjHj$2G&]A o5fsA( [㙃H)mRgcr;J`dʫXAB\ HCŮ.8.e"oE$6ũ3 X,\h0 ,&@ MB‰8l03 $U5LR.E : Α $6ũ3 of i |-Fn. X `Uk4h34hK{!IHq"xz,Ux褁ص PbA(PqQ YT,(c0+RESPy$ɕ*92$PPd 4>ST7At[qoMUUUUUUUUUUUUUUUUUUUUUUUUUUUUU7G#p_sCs|7=1eTZwo׹ӵUUUUUUUUUUUUUUUUUUUUUUUUUUUUUMq,/J+uYT$&İ.gmoMUUUUUUUUUUUUUUUUUUUUUUUUSq9@9ѵg8 ܵcyJNx%<A)%|`7<\mZ)><*qs0c t. s;ooG=bY20k91z(8 0`Ew b&f s;ooٺH*qX}Y‚GIPVEvsFv%ɓe"eT,8dPa2 =/T2=gn9@P)H<#D2A)6:2/GDFtJ b8x,(AZ*G,<.of a}=af6qhД10۞1y2~Bl DLL2,&[&*TQh<Znxf>Z^y̢JFQŮ2A, (e/2rCXXP$U5LR.E 㙃h#l9l(+ t9B\10۞1y2~Bl DLL2,&[xIuY`rv(Rug8 qz9A@aడjHjXBj$PP991J+4%5UUUUUUUUUUUUUUUUUUUUUUUUUM;kuY;|q־DuYj9kǔoMUUUUUUUUUUUUUUUUUUUUUUUUUS.熻U/@],>M7+7Vs HCD:SRWg-j970 xIa0 s;ooG @-b@`4@ k91,>FqV0#&UZM vRDH P52%+ʊqqh,>Fq:dz?H+9FcA-x734XU\`Wp"hfhЗ31Vs$zz''FYVmS89oaax *×b Da=5oORO*><0J"4k ftsJPAG2[\ 0&h-"Ó&HX0GH4P,.D ~esC2e&QH6f "eT.Db~a ؀Uɿ@Ř?sCOI40ptR좑lͿZf.|V`} "{*VGL2"P1? ưQyl@WZϪܐ16XQ4- s;oonx L2_I2DʨDl@< 2J*#UZAVwJqqt9qyG} "{2 e)G3(RCIꟴtR죇„q8s[UUUUUUUUUUUUUUUUUUUUUUUUUUUUUMǜlr0?tV\lN-{𚪪oaazQ[ʦaDX% a}Q40Ѭ(+} "z}Q40@UqPa2ð _"eT\R٣B\ HCD5sCQY.6w-sCGf0f7\q8 sA>GBvpN`,vd9 M|UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUMq,/J+uYT"Eь#U*ܳ^n)'sŠz̼)@Ř>+4豔pG2nxY2`$jcxr̢JFQgo]eE~vL8̽?p_} "{ :!P8E DL $4pXP9bF/PtR GE"$M/8@x1@pȔPqusC E5UUUUUUUUUUUUUUUUUUUUUUUM ˝b\PNs﷜VkAwg5M& lC3+}bbb&O # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_node   =eainorst "$CR_cdlp-/AEGILMNOST[\]fhmu#().12:;>PUbgvwy|%&,0DHk{}!'*345N&_#k[-Kk8T`s7A#,$~78iDx4K.\-Zxw$ӄY r@iED,LH`y\ X 0( :ې(8# udpL8ze=paW{ ^À/ Zu 8:0`p`D @'0va ⠽h=oo9rւx<׮د,\K8/t]ӵg7qj Ŝx>mA:r;@P},͢x 0Pyp>, , c8@"CC#!˘KT ,X5X~9 Pjc˘TUKN'dXsy?:d*XP5X~VN0o4gLO,"d=w,<bngn<#SlgN"Zκ[?8lܳX`c;ok3bSۧ+`!5/5-Y~8%c3 #exk,;ۙۏÔ;zd!#.v߬N,\9ζy/|mtCk_k[װ qJg2'JvPC  ΞZYF *<̧[95{_ħg n+Z^[^3ց|YعKֿ r64Ś,kot`(vڸnjA 0{in-m:k.\paq[}Ŭw9˂mt0qֿkׅ|'"L:>P=|ltm}dvC0 ըLrXX3?؀=!]MR$TD HL0(-*@dP_P8 ?mc{^nk;ś4Q5UUUUUUUUUUUUUUUUT\$jʖP7+5ۨ5UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUH#](i&mgu w MUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUR93/x Xd|jl^l؇3?'I$TRL8zetU^R|qذa8DPVjMRi@|,/I(KT,&T MUUUUUUUU! a˶w쟚5UUUUUUUTfL@I^f988Q=!\l&P cI2eBKfQB9[){1 |tR(<*TyB Tr8h(;C+RJ&"QB TQ!3raLRAI*@l&H T=2JYYM?s2gI2!`@Q!eXyaxΒe0C*,ʣ6!Uy2zBi&L.@ƒdQRȗ(eh;>c|Xc[0~SfY[|r=pcփ8T[7AԤiFI.ཚD-4DVMR (YD?̙L`5`($TRLP85Bf9 &OHW-$ɔ"LB**P` <P?sЍ-v?)v7 Xf`륞h>yɧ/3]9hib ٤BDAAjID(HrEH $@4TJMUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUR\Qϳuf=M+{7A|Y3\គ81 ?jq(+J+uZ&T*XFtULrXX3?mVY (f Y.xV~4PZӤ$aPh UBP¤TD(H7kI> 8ӘX?x8ze-CC3&tR (ɐ2լ<ٰٱgm?(s/&OHW-$ɔ"LB**P 4 (Y@Ś×Awr͛bͬ㎵iHiiO4tR|pPrZQ5J.\R**$&aA̙ƿI1xD6!D T$A%]%A}^"GyÄAApTi._ vއVMRES,0"Bf~Q(^L6ZI(EEK12TTr%`vQBJFׅ|'mJ`1z:)>/DAA!88Q=!\l&P cI2eBKX3Dx\E^<=4D\54QC2t2EH-PIV)"f1hp $ h\E A,,C^dΐAs b̤a 2d>Lk6l/6lCzϞ4vh\E)8E?9CƟECC3&q}d@kp#6!Žx e2TTI(EEJ"_@QBArsx37A7 9{\i4$4R4-qfJF 4OG*@AIBq ԒHePf$THL93l 2d>Lk6l/6oHY:L8j(ɐ*釛67A[1p3 Fvcg8hpaaxZ;oCqDp9y2zBi&L.@ƒdQRȗC@O k_$$,cg[fwl3k8pi)y1QDAA?(s/&OHW-$ɔ"LB**P5/5 i)ya" C+RJ&"QB TQ!3rd5Olb7+/ ʒ>yh0pE‚/ln@%^Gpgm?(s/&OHW-$ɔ"LB**PhhiP_a䄅3͐?l3k8pi)yg z8h(9Žx e2TTI(EEJ"_tAf~CM%#O4t@ !!!&Kgo^+x3 À,14DVMRES,0"Bf%hak}dC#n`0  k3rZw:H ,$Pk 5Pqɝ(-;UFLɖaͅ#9?(-;V!FLWL<ٰټdg4A\0f23i8 ?vއ88Q=!\l&P cI2eBKᡠ^QB~5/6@]ͬ㎵Hii枎Ol ?Žx e2TTI(EEJ"_tAf~CM%#O4t@ !!!&Kgo^+x3 À,14D%TT(*H?HAr!q!㙓8F6ybqɝ(ܦA X6!Žx e2TTI(EEJ"_ hy,~5/5ɛYk! IH!iHqiOG.`z,UP4c)F6h ?G 9㗓'+dQR i&L(\| ׌~ 4<8%`q?h ?$j*e I0!q!㙓8 F ]fybqɝ!HOA X6!Žx e2TTI(EEJ"_ hy,~5/5ɛYk! IH!iHqiOGT,<,URcE!HM4DGgoaҟKe\`Vå>3#m\cσt{C&3r≓&^Tz!1nWV*Ϟ@)$TR’.A2AbGO,b> 6V8I(EEL&XhĶ +ǚ}(1ie b7E#ađy<7+tVPzH)ƍH夎38i>34Z93t4RؖVIYB3f9q"z 5UUUUUUUUUUUUUUUUUUUUUUT~㘵f?81 _36i;zZ[C&q(+JES>7 vއGp~4GG ϞhD C3&qlΦv͈s;oCy2zBi&L0r4&Tr%Z&AE (xXrJoi" 4#uxf~ftŶWvz1Y9|%7ye;ԒHePf$THLÎ`6Q4L'%?)qV64_D=h8mh Ih1( A?)w{͚y%==|s:ۈ``q4k9f~yƹ_HH@~ptavz>9l( A{ 4OGI^̶gpPr fL_ohbqɝ+{EXj0Ph0e'Fff͈s;oCqDp9y2zBi&L.@ƒdQRȗCA&AE (a`fqZG4$4R4Di)D0 2@DāJF-VDAA?(s/&OHW-$ɔ"LB**P5/5 i)y8^qJDAAjID$U2(A3 *$&aC 93~Z5*l؇3?s2gJF-UZrwO\EoA X6!Žx e2TTI(EEJ"_ hy,~5/5ɛYk! IH!iHqiOG TxL8(AB$4RQUfVS[G !88Q=!\l&P cI2eBKN ,܃Hii枎~yƱ+G !%TT(*H?9A? a˶nx]7,5g7)3bկf. Ů.80;{)-}BŮ2t,3]5WmՍmVY C !fL_]5WmՍmVY ͈s;oCc ܮz0q1!" T rE H`p` E3rL  ,U aP@+I-1k:獖4_-X4.A $X3!񶯂LC0 A%(0 =!\l0~S, 4 (Y@6ů]3~iHii >0|## G(X.`z"*$ABEg8P0 Qq cg_9eFzj04yaR*LD$XYA!ƒQPf(\b0q1!" T rE ?$j*e I0+C3rӤSPA,UU0=C Pzd "Pɜk&P%7X4t e 'Y1f`]7,0klrc ٤q"]W{45)-ǙlΚEDE$ɔ" ,Gq b[ցzC p3l4R|qI.ལgE%x-P%h>xѺ)̤LRK H 0Hq0/oi4OikHU^"""dQS#81- @y!8xDˎY{{O^6)> 8U^CԐCY{{O_(""dQS#81- @~7#M‚ULrXX3?}/h?$jQB!qGZ2ٝs2g%x-ٱgm>z)̤LRK H 0Hq0/oi4Oik9RZ2ٝ48I(EEL&XhĶ +ǚ@f .9f=xh/hYIhs;oCIZCca?ً=AfR&H$\eK0ӧeik(#""dQS#81- @y! :yf[ƿI^`≪HJH夊Z>z)̤LRK H acO,b> 5lQ5I RGO-.+RQYDE$ɔ" ,G ǰ.щl@WZ5ˍC0(ըLrXX3?$jQB!qr5UUUUUUUUUUUUUUUUUUUUUUUUUUUUUT~H׌k0~S9k+Ybͬ㎵y l؇3?ً=AfR&H$\eK$LUE2z6ZPfjfGI2eD{ux^H`]؀kג&MB'{0Hq0O \d03t,lSJ QM(35]qjH\­?8*-qV |Ҋ")&L0PHb>`]؀kr> Ҋ Z\M4/W%TQA𚪪C?$sk6n2toHKX^+r7ɛYk3y𚪪C0(j&P<`WҊVjM2abqɜkҝdf9㙓8>/f9\ 22EH,l)",T\,?H`]؀kr>C'El?YF"o jfw11fCƽD< l0"d s-]xbZƜs"l<t]hd5L8͛vއ1s碐0(,D TLPip p3 ]w{ƿ4Oiktҝd `  8qFI1xDNI(")&L0PHb>`]؀kג$Lj 5)> 83q;| *@$@pH"f'Jvl?ZϞ@)$TR’.A2A&\r5u)> ٤qf'JvH T$HƍDpD='xx{7:S<<='6@q&P($L ǰ.щl@WZ5&\r5uktҝd `  8qGC}^q;|}dCԐCY&DRLB**`2|'F%]h<ׯ}Ti._ @+RJ&,?G 9㗓'+dQR i&L(\|4iPκ\n >ܹ IH;g8P0=~" C+RJ&BE˒*ERED!q!l8d5O ٱgm?(s/&OHW-$ɔ"LB**Ph07D(et3ql}ѹs;yA!vqpaz8 .`S DAAjID(HrEHH?9A𚪪?G;{EsG.4Q0|PcH!PVVs;oCy2zBi&L.@ƒdQRȗ@榙 ސ8xDˎY{Ea)ɖ=(35XGI2eD{ux^I2ji> ސ8xDˎY{Ea)ɖ=(35XDRLB**`2pPjV*Ϟ[(ų NLZ")&L0PHb>`]؀kr> Ҋ Z\M4/W%TQA𚪪C?qͯ1,`9bqZi;oC?X^+|!UUUUUUUUUUUUUUUUUUUUUUUUUUUUUHD*,#:Q[MRi@|,,Cz939$9faҚsfP)ؒ8ձ&P($L8D'N |`̙ƿJ .ཫ6!̙ƿI.ཫ6!3r0I$$9faҚqͮc8Dr,9`-̙ƿIUff9\胇PH][fg8xX?t]W{Ud\Z[L"VqƀVc , !`Pau_Tpذa?$P~Q(^L6ZI(EEK12TTr%ôM<qHC$C |pP+(0l؄3&q]5WmՍmVY V5KAūZ]6!7+/jٵ|WlI,<+sƀ ZtbʒLyE$<;kI>|q7{U˂SzX,Z'A8ze-f.|tR|Wlڎ3jεxf.|A($/az'{4 Z}iH  * H=2 P`i5I.=+jqtTPɧ ڮ^r/jkb#zY\d>\W_yC$P‚VjM2ab;oCaU e2TTI(EEJ"_ '<P?Gm|\똽h 5UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUHD*,#:Q[MRi@|,/Hd5KEUv=XܦQXkUl!0KMQXkUKMQXkU$\h р IH  * H=2 P`nׯ|q1f~p > Zd4%Z_6lBgm1nW=^]j ګmb @^U:LBeI&<"U`i뤟i^r{T^ ~A'{ Cb7E'{Uvͨ9 8񶯹|^\PLཇi뤟(i# G(X.`z"*$ABE,$]5WmՍmVY {ཪ'.iֽv.:׮ŚxN!k85uذa?ԐC‚VjM2ab;oCaU e2TTI(EEJ"_ '<P?Gm|\똽h ׯPZӤ$aPh UBP¤TD(H5l0p > jHaAZQ[Q5K *=!\l&P cI2eBKP9QBcYc񍯋sptܳXmܦVrD 4OR|pPr?f^L6ZI(EEK12TTr%( M[^!͠/F <)$L<+i)D3-4;7 X/qgo?.1)⎌a_[u׊]s6Ů h"8xDˎY±Ɲ4~Q(<0xV& |X+sHC%#H32F-~v0=螂81 4:%KHdQQ% *<pPr@UXꞐQYAhLRK"ng G =~4@dA($. PZ(q(+J k7E3+0bbb&0 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_node_collocationcy#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_node_collocation.sh 1.3 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)18 1.3 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_node_collocation.sh, hacmp.assist, 61haes_r714 6/10/12 15:48:21 function KLIB_HACMP_modify_node_collocation { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_node_collocation.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset name=$1 [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values print "$0()[$LINENO]($SECONDS): $HA_UTILS/clrgdependency -t NODELOCATION -a -l $1" >>$CLMGR_TMPLOG # Always log commands $HA_UTILS/clrgdependency -t NODELOCATION -a -l $1 typeset -i rc=$? print "clrgdependency RC: $rc" >>$CLMGR_TMPLOG # Always log command result log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_modify_node_collocation()"  lBlG3+Cbbb&r) # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_nova   =aeinot $ENOR_cdlprs"-ACLMST[\]fhmuvy#()./1:>DGIPUbgkw%&02;BHVY!,34;nKAӁia302f tݸZFi,OZzΎ,Qzh0`f8"1Q|sj.~sqkܺ=kH#b_8hӧu{miffMM~e"LbHyXFe@n{o(H#{N%y0mYiG5 ?(e0lO(&IJgo~j"Q@HU1Bi<|#24,|ڃ|GJGFt(~PqaLN2f 6n|̾8c~30oBkp43_6(ER S8 x <j"Q@(ʦ(PM4/f\DN%F5ÎϘc2|ڃ|GJGFt(~P9oOm9V޴e3_##re:pq0X.#s9|q0,ͨ=|(E*LU" & =F91LDDQ"<"޴x2{3t3?(e0lO8 xp,0 EERIbHyV".\UƟZR80f~PI$&g GyEwNMIi4n0YӄftqabɓSPG*A4DU?smɥkJGF ?(f ɓSPG32i]ӓGsk&L9#F :pqLΔ8"0yܸvA4X i4J xpf&c{mF.M̿&Lohmmi:|RhC#O\tt O˗2R{QqK, `\˃y|O]M6/o@BJ*MQRDĉ',x-TQ5EI1-72i~ƂClhlhahIiQQqp(KT DQDHTM!AR4TU!䑨mEƞbmmm??eͶ3&sN4mmm/m&?2qeͶ3&˗2(<055jLA6̚_5|VsBgA4TDQy|O\ttsmɥ̾'&7@!%&MI ("bD(rǍ-4z $e@(<055q0O~mZR80ƴ8J<β2Xhah8@ ?1 mmm\Ӎ>ohmmmβ<$S)O\tt'O˃y|O] n}r̾'$b( eJN#s{@C׀&\^\7e?v4ؾ9I (4Jh"HIEI',cKEM@Q&Ri"qA}c.iM7oZo_rA!Ől(H0 Z%s_Y7>Yk|&ee,7[d']ghơ8|n4@,p.p(KT DQDHTM!ARA2H*R8|??&mmmwZF=4O?&mmm3QU E)1+OGUZFF7Tpp T8`8@ ? TM" $ *&Co?DJ(Tb4uUn3?1 mmm>m{;i{Gmmmu"Q@(T:: >mUwrf_c*WAͣw88n\7(EQHʕih꫽{@C׀&\^\3/ɦ"HIEIS@BJ*H<A`#Z(j5Ob sNZoie?]zz# ,eEAlа-"ɹ]3/k,4pqa0mݳ&8k8 0KDn5 ncqGAcApÄ@ZD "@i ?6DDQ"<#Pih꫽?1\pm~\7ZgY.h].4IDx98:8F@Tr$u7"HIEJ" PV 1R&O 2r^dᥦ ÌwacjfU4Zg@U"i"e&&ٜsQTG,d}:J1z)O'A$"<Xq$$ LK ǰ2H_ZF:+E]Vη76ٜsQTG,d}:J1z)O'A$"<Xge (BOeFxaAeP"&)&\)hM!aam1*MHy$qΚIIwӯo,24tL =R#ȑЌ9U/Ac/XaBq$$ LK ǰ2H_ZF:+ aAZ z {ARb"LT84]Yrf_ImM DD$T1"xpp&~aa. }kJGF AC DFPI0H"Dn *& m«ɦ"HIEIS@BJ*H<88\ih#l/S֑F70)qDc,4Y A2`R5%.́1 ,eo8 f@e&Ř$ĖsdEiM ,ed aĚ_141ͽMqq=0npvZ4&i.a,6Z#q$@zG"7ijEEP<‚[P&y|O1&wRFK.4neFxaAeP"&)&\)hM!aa*ش:8wA%"7C6q$$ LK ǰ2H_ZF:+ eJt\.lsyUsiɜtqK0Dn8  ]bm̾'K7:5>2]AD#%K ,/<?2qЌ{nyrf_c inB $ e?Ě%:b #j8v5c/XaXZQ֜BgU̫.w$@zG#$ &"1QR$^±*8Ϊ3 V2]I0H"GI1I EERIAɁ"^„*$ZgXV28VbFa3*KB2] &H&":IOij^„"HIEJ"1h,e (C ̾'@ U$EER,0@??0 @bIaa`f_mmmmmmmm??yE̿I08˄Y7=5&̸g:֛?&mmmmmmm(+@=b&*(p,,Mmmmmmmm/1&kJ1zӁLM\qwMmmmmmmmimmmmmmm~s`ewM̿I0BMmmmmmmm/m3fwi6gufw63):R;A$"<@):7ٝIDx9#O*Wh$b2P+l΍!6gF㧠PL)R;ADJ(Tb˗@ٝCi6gFQU ET8QUD\ kn:7P"$GFT86ڋ?._i:7m6gFmEƞ4qv.m4\ ln):7΀d3:7k@Ӣwg[ ok_EGdžc/ؔԍ~f_Kpe9m s228 asMp1ym~zmmmmmmm5<#b(ezI;M83G-@z&2 rc=$RC_MISSING_INPUT elif (( $rc == RC_NOT_FOUND )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$persistent_ip" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 152 "Available Persistent Node IPs:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_persistent_ip available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi if [[ "$*" == *([[:space:]]) ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 401 '\nERROR: no valid modifications were specified for "%1$s".\n\n' "$persistent_ip" 1>&2 log_return_msg "$RC_MISSING_INPUT" "$0()" "$LINENO" return $? fi if [[ -n $new_network ]]; then CL=$LINENO KLIB_HACMP_is_known_network "$new_network" >/dev/null 2>&1 if (( $? != RC_SUCCESS )); then rc=$RC_INCORRECT_INPUT dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$new_network" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 150 "Available Networks:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_networks available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi fi if [[ -n $netmask && -n $prefix ]]; then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 36 '\nERROR: conflicting options were provided, "%1$s" versus "%2$s".\n\n' NETMASK PREFIX 1>&2 rc=$RC_INCORRECT_INPUT fi #================================================================= : Modify the persistent IP if no input errors have been detected #================================================================= if (( $rc == RC_UNKNOWN )); then #======================================================== : Need to retrieve existing data for this persistent IP #======================================================== print "$0()[$LINENO]($SECONDS): cllsif -pcS" >>$CLMGR_TMPLOG # Always log commands typeset DATA=$(cllsif -pcS) print "$0()[$LINENO]($SECONDS): cllsif RC: $?" >>$CLMGR_TMPLOG # Always log command result print -- "$DATA" |\ while read LINE; do : Handle possible IPv6 address typeset IPv6= if [[ $LINE == *\[* ]]; then IPv6=${LINE##*\[} IPv6=${IPv6%%\]*} LINE=${LINE/\[$IPv6\]/[${IPv6//:/_}]} fi print -- "$LINE" | IFS=: read name type current_network nettype attr nodename ipaddr rem : Handle possible IPv6 address ipaddr=${ipaddr//_/:} ipaddr=${ipaddr/\[/} ipaddr=${ipaddr/\]/} [[ $type != "persistent" ]] && continue if [[ $persistent_ip == @($name|$ipaddr) ]]; then break fi done [[ -n $netmask ]] && typeset save_nm=$netmask [[ -n $prefix ]] && typeset save_px=$prefix eval $(clodmget -q ip_label=$persistent_ip HACMPadapter | tr ':' '\n') [[ -n $save_nm ]] && netmask=$save_nm [[ -n $save_px ]] && prefix=$save_px if [[ $new_name == *([[:space:]]) ]]; then new_name=$persistent_ip # The name was not changed elif [[ $new_name == +([0-9])\.+([0-9])\.+([0-9])\.+([0-9]) ]]; then print "$0()[$LINENO]($SECONDS): The specified new label appears to be in address format: \"$new_name\"" >>$CLMGR_TMPLOG print "$0()[$LINENO]($SECONDS): Attempting to convert \"$new_name\" to a label." >>$CLMGR_TMPLOG typeset NAME="" IS="" ADDR="" REST="" print "$0()[$LINENO]($SECONDS): LC_ALL=C host \"$new_name\"" >>$CLMGR_TMPLOG LC_ALL=C host "$new_name" 2>>$CLMGR_TMPLOG | read NAME IS ADDR REST ADDR=${ADDR%,} if [[ $ADDR == $new_name ]]; then print "$0()[$LINENO]($SECONDS): \"$new_name\" was converted to \"$NAME\"." >>$CLMGR_TMPLOG new_name=$NAME if [[ $new_name == *\.* ]]; then print "$0()[$LINENO]($SECONDS): The specified new label appears to be in FQDN format: \"$new_name\"" >>$CLMGR_TMPLOG new_name=${new_name%%\.*} print "$0()[$LINENO]($SECONDS): Stripping off the domain results in a new label of \"$new_name\"." >>$CLMGR_TMPLOG fi else cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 9999 '\nERROR: the specified IP label, "%1$s", could not be resolved by the "host" command. Make sure that "%1$s" is valid, and that it is properly defined in /etc/hosts. If so, confirm that local name resolution is in effect by checking that "local" is the first "hosts" option in /etc/netsvc.conf.\n\n' "$new_name" 1>&2 rc=$RC_INCORRECT_INPUT fi elif [[ $new_name == *\.* ]]; then print "$0()[$LINENO]($SECONDS): The specified new label appears to be in FQDN format: \"$new_name\"" >>$CLMGR_TMPLOG new_name=${new_name%%\.*} print "$0()[$LINENO]($SECONDS): Stripping off the domain results in a new label of \"$new_name\"." >>$CLMGR_TMPLOG fi if [[ $new_network == *([[:space:]]) ]]; then new_network=$current_network fi print "$0()[$LINENO]($SECONDS): cl_harvestIP_scripts -u $persistent_ip | tail -1 | cut -d: -f4" >>$CLMGR_TMPLOG # Always log commands nettype=$(cl_harvestIP_scripts -u $persistent_ip) integer cmd_rc=$? (( cmd_rc != RC_SUCCESS )) && rc=$RC_ERROR nettype=$(print -- "$nettype" | tail -1 | cut -d: -f4) print "$0()[$LINENO]($SECONDS): cl_harvestIP_scripts RC: $cmd_rc (nettype == $nettype)" >>$CLMGR_TMPLOG # Always log command result typeset netarg=$prefix if [[ -n $netmask ]]; then netarg=$netmask fi if (( rc == RC_UNKNOWN )); then print "$0()[$LINENO]($SECONDS): clchnode -n $nodename -a ${persistent_ip}:${new_name}:${nettype}:${new_network}::persistent::${hwaddr}:${netarg}::${site}:" >>$CLMGR_TMPLOG # Always log commands clchnode -n $nodename \ -a ${persistent_ip}:${new_name}:${nettype}:${new_network}::persistent::${hwaddr}:${netarg}::${site}: rc=$? print "$0()[$LINENO]($SECONDS): clchnode RC: $rc" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR fi fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then [[ -n $new_name ]] && persistent_ip=$new_name if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_persistent_ip_attributes "$persistent_ip" properties fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 'For more information about available options and syntax, try\n"$HAUTILS/clmgr %1$s". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n"$HAUTILS/clmgr -hv" (or "/usr/bin/man clmgr"),\nsearching for "%2$s" in the displayed ext.\n\n' \ "modify persistent_ip -h" "PERSISTENT IP/LABEL:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_modify_persistent_ip()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_modify_persistent_ip =head1 VERSION Version Number: 1.5 Last Extracted: 10/20/15 18:14:19 Last Changed: 10/16/15 14:31:26 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_persistent_ip.sh, hacmp.assist, 61haes_r720, 1543A_hacmp720 =head1 SYNOPSIS clmgr modify persistent_ip \ [ NAME= ] \ [ NETWORK= ] \ [ {NETMASK=<###.###.###.###> | PREFIX=1..128} ] NOTE: the alias for "persistent_ip" is "pe". =head1 DESCRIPTION Attempts to modify the specified persistent IP to conform to the provided specifications. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the modified object can be returned to the caller. 2. persistent_ip [REQUIRED] [string] The IP address or label of the persistent IP that is to be modified. 3. new_name [OPTIONAL] [string] A new address to apply for this persistent IP. 4. new_network [OPTIONAL] [string] The label of a new network that this address should be bound to. 5. prefix [OPTIONAL] [string] A new prefix length for this persistent IP. 6. netmask [OPTIONAL] [string] A new netmask for this persistent IP. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2011,2015 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== #  kꦉJ3+3<bbb&3< # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_physical_volumecy#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2018,2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r721 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_physical_volume.sh 1.4.1.5 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_physical_volume.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #============================================================================ # # Name: KLIB_HACMP_modify_physical_volume # # Description: This is the main, FPATH function that is invoked by clmgr # to modify physical volume names in the cluster configuration. # The C-SPOC utility "cl_rendisk" is what is used. # # Inputs: See the "devDoc()" function, below. # # Outputs: The properties hash is populated. The only other outputs are # any error messages that might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function, below, for the standard return # code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_modify_physical_volume { . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_physical_volume.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset -n properties=$1 typeset disk=${2//\"/} shift; shift typeset new_name=${1//\"/} typeset -l scsipr_action=${2//\"/} typeset refnode=${3//\"/} typeset -l all_nodes=${4//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN i=0 typeset data= #================================================================ : Assuming an object was specified, see if it is a known object #================================================================ if [[ $disk != *([[:space:]]) ]]; then CL=$LINENO KLIB_HACMP_is_known_physical_volume "$disk" "$refnode" data if (( $? != RC_SUCCESS )); then rc=$RC_NOT_FOUND dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$disk" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 153 "Available Physical Volumes:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_physical_volume available "" "" for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi #================= : Validate input #================= else dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT fi if [[ -n $all_nodes ]]; then case $all_nodes in @(t|y)*) all_nodes=true ;; @(f|n)*) all_nodes=false ;; ?) dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 '\nERROR: invalid value specified for "%1$s": "%2$s".\n' ALL_NODES "$all_nodes" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 'Valid values: %1$s\n\n' "false, true" 1>&2 rc=$RC_INCORRECT_INPUT ;; esac fi if [[ "$new_name$scsipr_action" == *([[:space:]]) ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 401 '\nERROR: no valid modifications were specified for "%1$s".\n\n' "$disk" 1>&2 rc=$RC_MISSING_INPUT fi #=================================================================== : Modify the physical volume if no input errors have been detected #=================================================================== if (( $rc == RC_UNKNOWN )); then typeset nodes= n= name= p= pvid= uuid= rest= print -- "$data" |\ while IFS=: read nodes n p uuid rest; do name=$n pvid=$p for node in ${nodes//,/ }; do if [[ " $disk_nodes " != *\ $node\ * ]]; then [[ -n $disk_nodes ]] && disk_nodes="$disk_nodes " disk_nodes="$disk_nodes$node" fi done done # # Find all the nodes that this disk is visible on within the cluster # print "$0()[$LINENO]($SECONDS): LC_ALL=C cllspvids" >>$CLMGR_TMPLOG data=$(LC_ALL=C cllspvids) print "$0()[$LINENO]($SECONDS): cllspvids RC: $?" >>$CLMGR_TMPLOG print -- "$data" | grep -w "$pvid" |\ while read line; do if [[ $line == *"on all cluster nodes"* ]]; then for node in $(clnodename); do if [[ " $disk_nodes " != *\ $node\ * ]]; then disk_nodes="${disk_nodes:+$disk_nodes }$node" fi done elif [[ $line == *" on node "* ]]; then line=${line#* on node } line=${line%% *} if [[ " $disk_nodes " != *\ $line\ * ]]; then disk_nodes="${disk_nodes:+$disk_nodes }$line" fi elif [[ $line == *" on nodes "* ]]; then line=${line#* on nodes } line=${line%% *} for node in ${line//,/ }; do if [[ " $disk_nodes " != *\ $node\ * ]]; then disk_nodes="${disk_nodes:+$disk_nodes }$node" fi done fi done if [[ -n $scsipr_action ]]; then if [[ $scsipr_action == "clear" ]]; then # #Check if given disk is resrved or not , if not then throw an error else go ahead and clear the reservation # typeset reservstate="" reservstate=$(LC_ALL=C devrsrv -c query -l $name|grep 'Device Reservation State'|awk 'NR==2'|cut -f2 -d:|sed -e 's/^[[:space:]]*//') if [[ -z $reservstate ]];then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 397 "\nERROR: Unable to read the reservation state of disk \"%1\$s\".\n\n" "$name" 1>&2 rc=RC_ERROR else if [[ $reservstate == "NO RESERVE" ]];then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 398 "\nERROR: Disk \"%1\$s\" is not reserved , this operation must be run to clear the reservation of disk if it is reserved.\n\n" "$name" 1>&2 rc=RC_ERROR else # : Clearing the registrations from the physical volume # print "$0()[$LINENO]($SECONDS): clpr_clear $name" >>$CLMGR_TMPLOG clpr_clear $name 2>>$CLMGR_TMPLOG rc=$? print "$0()[$LINENO]($SECONDS): clpr_clear RC: $rc" >>$CLMGR_TMPLOG if (( $rc == 14 ));then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 396 "\nERROR: Unable to open the disk \"%1\$s\" ,please check if disk is already being opened by some other process.\n\n" "$name" 1>&2 rc=RC_ERROR elif (( $rc == 12 ));then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 395 "\nERROR: Given disk \"%1\$s\" is a remote disk so can not perform this operation.\n\n" "$name" 1>&2 rc=RC_ERROR elif (( $rc != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 109 "\nERROR: the operation appears to have failed.\n\n" 1>&2 rc=RC_ERROR fi fi fi else dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 '\nERROR: invalid value specified for "%1$s": "%2$s".\n' SCSIPR_ACTION "$scsipr_action" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 'Valid values: %1$s\n' "clear" 1>&2 rc=$RC_INCORRECT_INPUT fi fi if [[ -n $new_name ]]; then typeset yOpt= [[ $all_nodes == "true" ]] && yOpt=" -Y $pvid" print "$0()[$LINENO]($SECONDS): cl_rendisk -cspoc \"-n ${disk_nodes// /,}\" -N \"$new_name\"$yOpt $disk $pvid" >>$CLMGR_TMPLOG cl_rendisk -cspoc "-n ${disk_nodes// /,}" \ -N $new_name$yOpt \ $disk rc=$? print "$0()[$LINENO]($SECONDS): cl_rendisk RC: $rc" >>$CLMGR_TMPLOG if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR elif [[ -n $new_name ]]; then physical_volume=$new_name fi fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_physical_volume_attributes "$disk" properties fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 'For more information about available options and syntax, try\n"$HAUTILS/clmgr %1$s". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n"$HAUTILS/clmgr -hv" (or "/usr/bin/man clmgr"),\nsearching for "%2$s" in the displayed text.\n\n' \ "modify physical_volume -h" "PHYSICAL VOLUME:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_modify_physical_volume()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_modify_physical_volume =head1 SYNOPSIS clmgr modify physical_volume \ NAME= \ [ NODE= ] clmgr modify physical_volume \ SCSIPR_ACTION= \ [ NODE= ] NOTE: a reference "NODE" may be required if the specified disk is provided via a device name, such as "hdisk#". If the disk is specified via its PVID, then no reference node is needed. NOTE: the alias for "physical_volume" is "pv". =head1 DESCRIPTION Attempts to modify the specified SystemMirror physical volume to conform to the provided specifications. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the modified object can be returned to the caller. 2. disk [REQUIRED] [string] The label of the physical volume that is to be modified. 3. new_name [OPTIONAL] [string] A new label to attempt to apply to the specified physical volume. 4. SCSIPR_ACTION [OPTIONAL] [string] To clear the disk of scsi persistent reserve registrations. 5. refnode [OPTIONAL] [string] The reference node for this physical volume. 6. all_nodes [OPTIONAL] [boolean] A flag indicating whether or not to update all nodes in the cluster with the new disk name, as appropriate. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== t in  lJK3+,bbb&~ # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_resourcegroupecy   = aeinrst"$CER_cdflopuAILMNOPST[\]bghmy#&()-./12:;DFGUvw!*,0>BHKVYk{}%'4x|+34yTƑPdP*-*n4MY8W% [jlɠpO'eu ƱYXJA"P8 DxFNp&1?"  m"`|kSA DC ݸ%90xR&VT(sVm8%8(b̄N4n@|TҠvb̺}xӌlVZ+ 2Նjl!ASpUC#S x>cPV+ j|BYnB\F[MpOd5MFMW3 Ґ[өF{#2 ndu˂Mvb̀33N!m5 !XN q17 ֳ } JAn2̝8IX8%84h%!឴T,0vb̲̀1'$ZnʛjaLo6iX,7 0wf=u?9<)G:}s4nr pN*A/M+gpօ``vJ1}SeL4laq8U ixO=M=4DVfN Wn@`QBnJ,#>үϚV' a7 3`ᩇ8%7wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwn]+X,8DIq,7Jb^2X^`[EB袑B``Spdғ[9CY&(8HDQ ,0"Gps;x7wwwwwwwwwwwwwwwwv,R |(/b &bwMݻZ!\6<մEAr $9P+ǍSB8Q)g<5bJL94i2c"4DJe $<\J &H\*I4RP50q"84YAI(82IGH8Te*QZH*H4$ I0r* $)P$Pq1d** &UAQ((U" @|!r%T="R!*4=% $d&4/Ʀ˸ETLM!E &PhSP4(838(*4U$DHPIG"L$@ȍ*8" )q&S`y $""SdEAAFDJLq$(Lȃ$Pc&89BdDDSL]I $4LqPr9B$H\"(DJ $<\J &H\]P)&UBcJIQ*Q$.W(b "PhS 4dLPq@f]&*&5H!tK(MD(H]4RŒ"M"j&BB颖UHPhpңT I1d jIhĈ@qB(.LPiTdɦMD(H]4R=:) 2U:$1g*52Qǒ*4xPAARP!jwֳS>fz%Tm{uRFV3a/T6gu Bcfw "Jum;an,1g=ȘȞąF1gD$4iy!Hą =]0e텻 Ş* "{ȊwaPP,x(L waF!1;an,1g&D"LLXPCQ(4G DdEAG[A4TEI%TDW-@!3CkYаCQ(4`-jS(X `#oF 1AKl r Ae…F 1ALsSphE"$XQj4rh"x !:7LE ^EgA$ gB£G DҦ'犍<5eB]5mPqI&HPqb]\1ŰhZ&[(XThࡨTG ˻ gB£G D`#ea/TogdРxx?+ajq8+B}MNjq8+Bz N'3ehSBL 1H;vL YIC]H*̖|ɕK@!H*̖|ɕ@8~wN BZ FГ+B N'3ehSBU,+B7wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwnҍoɐAZ/FW8ƼiɑlnŴ&k ,XJ=X 00'$GH,,<w#㈤D 8,j$ iU' 2ՁT0,A<,/d/|Xy X `"'L00OY|meB&80YbTiH>'8ʸkb9A2 !]2ڜe\5\-BPRO9 (+ z @eI<<4 0'$01zh aDyd(]GMBb/$Lb[2d0"3 Ze<. <. ^E {[Tk ӌa g trZٓCȼBPRO9J*I Y$hh PxD@"h&I4D*|l6ZV‚)Wέop@ I!Q@CFI  nw{ty=j4rh"}YFyZ̠|,/a$Тܖ&f2Z6 ,+ɨ@L@3ƌ>,<Ȳ($^E~ wN Be;R"K P5b4ehSx̱6aaX`10=f]Ŵ|Xy Y[e Q#3*ᭈ痪>,<,LOwwjqpswww]%_Z4ٞAy^0XBq\SoXni6gɝ0u.bֳ  4dLPq@a Xz0`30`OIg-,@i(Ae… "4Y%P`O5 x20FPMGMBDyd PX /$Lb\d0"0FWfysQP^\D.xqyDhJ&(83=Nj|jQ5APEt@Y5)\k؊nQP'VMDiU&.U w9~U8LfFWW;0|HLb*N wW>LXPDE%$'-@Tq(8L(+Dh &R@Tq(8L"4z)g*8LƂ{ Űh "4z)1bAY "4z)QFPe,G=BBh̠|,/a)%>'I֣G(k # &D",<w#㈤D 8,j$ iU) EX)>,<w `> Ke e_,[@ Ňb Xz0`30`OIN2؎yzx̱DD̠W lG<; E|l6ZAf 7 ;2 Bx4hŠb֡HW(9DŬֳwϤZ-QFPewMۿIJãsSoHLb*OBk93Wo"jP[9g-C(sVA wA&-h+5 @0H")!eL94SeXH(sVwWePraAZ5o@nw(9CXm4@Y5 $WAPAb1y$dn^0[&1a0`!Ci-C2w(sVY(<8Bh Q1cHP歠*"$I"L\GP;xfe;,/8QB(+}k8nb& J Hy@ *8Lx~RGPZ w9}4U}b̵Yf Bta8tj x`>1 sMMX>L{M1_X-VeY-}k8naɏң(`#o,%F nwN Bj-Yu &LxFHChTP+{ (ܖP+{M(-ʶwN BlwdPieV֡HW 8̔U[;vgA5A=f]8̔jQ4*!菴"X0xR&h>LG!1O=$=h ɶA!BX^`[EB袑B``SpۤAQ5APEt@Y5)s$$\@.~0&kgT ^E~ziHP歠*"$I"L\ =%1H;4q(&iEYnUap!ޚE J$DG$40zi5fx,j$ fQ3e\5iEYnU%iF5J*r4*@ ;xfe;+ax{ (ܖ9CXm4@Y5 $WAPAb0,CLEW,EVl'A"/#HPuR0,A菴"X0xR&T{MRaaXfxX_ ^0,@DO``.b>,<,Lp-`ńՀ}MNjqpseB&'xfe8ʸkb9x_ {M(-ʸ'@DQ4MaI7wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwv,TYVZntqéˣPV+ lDj-vgY2aNe(sVASpehq nD5NeSel;#VU2nClأ9;Kb*[`cQ MGnjmwMݻVZ6 ,+ɨ@L@|I4&%7M3 쯪̗@ 2ՅQ,^Em+-֙ǁ8͈BP ]6>p-XfmI9G"$L&~zieT  I5H!tHh8$M$J81r^._ {MfJ*r 4(.Q$M"E"`cnwMݻK*n47AieVzU!>+efpm9K]i"efQ3o 2ՆjlvT:<5YZiH-ND5NeSel;#VU2nClأ9;Kb*[`cQ MGnjmwMݻVZ6 ,+ɨ@L@|I4&%7M3 쯪̗@ 2ՅQ,^Em+-֙ǁ8͈BP ]6>p-XfmI9G"DG$=3%eT  I5H!tHh8$M$J81r^;׋,r,6rTa8tj x`>1 sMMX>LeC56[j wW>LXP4r (,!rf80YbTiH>'P+`-Yu I ɒ&`<<]SB0(-kwN BlqJ*r3 q 2GH,'I֣G(k # &D":3 uq 3n4wMۿuR )SB.A%$.L-Jum<ѤO‚JTP$EtHUIAd =g-,"(DJ $<\J &H\<LXP4r (,!rf,3 q 2-}k8nd )S@G?/0hnwWe}k8nd )S@G0`OIg-,*u>LXP֠`#ֳ @`ҕ: YZ&[(YJTP0@`wJ&>25:Umm2U;(sVm>9~5LѤzMP~3ڬʯ#N ^,CVWٷ^M͑sfabV D>'^Z)ClA 2`S"'585  wWe0izf 7 ;j4rh",<Рg8Q3Se瀢%СsȾf C.x ] ?UU7ňt;Jqy ?= ?j (M4*$ʻxxxfe|,/@`Ҋܫt  I5H!tH'$𛻻wTin zAn-u7 B|WzS8Ѩ+"r5w3aMڧo 2ՆjlvT:<5YZiH-ND5NeSel;#VU2nClأ9;Kb*[`cQ MGnjmwMݻVZ6 ,+ɨ@L@|I4&%7M3 쯪̗@ 2ՅQ,^Em+-֙ǁ8͈BP ]6>p-XfmC$dɟeT  I5H!tHh8$M$J81r^.wb*51b9/I ɒ&_f 7 ;e…$EtHUIAd 1gֳ .A%$.LŞ{׋,rbҰ9LfFW>tSp9KcW;x]Ŵg-,*8zE @G ,XJ=X 00'$jpEYnUFYjuzQҷE*uY⣇PPDwuY']VNH4[b4U=XtOeE+hZ&[(YNp":CmMRz-՚T-ʼXmhֳm1_XP.+d^,1LXP*jo{[^,BiX̘:ֳ Az)S@Ş{fz-DwW>LXP Jj91}_f 7 ;+a>LXP Jj9}MN}k8nd: YZ&[(YNLXP Jj,g-,RZ EYnU wEm0̠|,/Az(m` 7 ;VZ6 ,+ɨ@L@sqRBX-l.ʹU}aUaN2QSb4v n6/E*u|,/Az(-ʸ'@DQ4Ma}MN eMƚ?7JSpۤ'|73M]^0[b'#Wk=xiXo 2ՆjlvT:<5YZiH-ND5NeSel;#VU2nClأ9;Kb*[`cQ MGnjmwMݻVZ6 ,+ɨ@L@|I4&%7M3 쯪̗@ 2ՅQ,^Em+-֙ǁ8͈BP ]6>p-Xfm/E*uQV[O@DQ4Mh&I4D*ۿıYϙL 附%Ѩ+< tnpߪƟXb7J}N -Q!.v𛻻wWeH*̖|ɕL(+..PITM.U>25 B{LNGoba tCwwwwwwwwwwwwwwwwwwwwwwwv-}k8nb$Pc&89BdD`#o,%F ‚g-,DJLq$(Lȃp-?‚{ 21 ["L$01zh aDyd(]GMBb ^I&$ķehmN,5;Tqvd6w#,ES+"LYs^ Bx##X7q&XaOi"-Q!.snŴg-,DJLq$(Lȃ*8Dʘ Xz0`3 ˻.db,Bf3o3,aLDGxg ;'FPMGMBDyd PX bI4&%ehmN,5;TX-׍6dݺAlf57]0'Ty2xggzFFCyȫehdg<08!B.h8$M$J81r^.wMۿı뽆b*LP0;ijãs+CjqfqݦXsoķFs0B wW>LXPB(M1ēT2C"00YbTiH(+@!3CkYбB(M1ēT2C"00YbTiH(+.@ aL P b,̲aF!3qtnpnw؊woڬbSp9՞(Npq̝nSefըsnŰhZ&[(XPq@a`SpZ&[(XPq@a@ q2aBƒ .}k8naA-Yu ( 0.֡HWZ4ʋFY=hZֳ P`"'˿uR $DQ&R=菴"YTR4>Ah~zehPpDJeP(Pea(G$L>'P+A+<4p~..8R?M"yjqp $DQ&P .pzɃG b4 |m@wL8S0`OI_,[ 2Ѡ>}MN+hJ*-bl>'@x)%‹Q5APEt@Y5)$$7Fgw3AX-0hJl)L-@b*ÓB|dU7uY'X-՜\\pɚY/ h&I4D*ДTZ4=TZ4BPQhD G -@\\p`SpXѠ?ހL>'>8DIjh aDyd(]GMBb `0#B[۫'X;̆!:FQ(Vx֘@>x "/ =@y =bl%nw_,[BPQhL xh0`OI>8DIjh aDyd(]GMBbiLKu@}3;FWL4p6g2y3\56^Eb5mPqI&HPqb]]2Ѡ>zʋFgxʋFYJ*-耸C\1H;j (M4*$ʻx3(a:R[e~:Ѡ?aZsX- @eE@}3Ŵ%0h0`OIg-,2Ѡ>}k8naA,)LXP2Ѡ>}k8ndƀuwwwsnXehmN,5;TA38*~mwg:78oVewU;أ9B]^0X97wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwv-}k8nb$Pc&89BdD`#o,%F ‚g-,DJLq$(Lȃ{ lAqT mj+8P6`SpuREZ}k8nb$Pc&89BdDDSLEZMVqj( OVF .bh ГMVqj\5} 4Eg0'$01zh aDyd(]GMBb CLXPB(M1ēT2C"P)&TG ,XJ=X 00'$ֳ ((DLq2Tb>LXPB(M1ēT2C"P)&TEʐq2aBI $4LqPr9B8S^.bֳ "HQ% 8c&HxAA"BLp-`ńՀ}MN}k8nbIQ*Q$.TŠ}k8nb$Pc&89BdDQ$.TEʐq2aBI $4LqPr9B$H\;+a>LXPB(M1ēT2C"0nw3>LXPB(M1ēT2C"0?aYu $(I1A$LXP&55  @eI<3SphE"$XQj4rh"'ݻKERmZ7 eҳ;&=@ }k8n`1.֡HW -k9>p-XqF[.bgNe >'rZfpx=3(;+ax]'$h&(8*3^.wW}k>p& J Hx41Tq"%i!PY2BAJc@:Q((U"J@ $ʨ*8zE @ H$UGH8T( ȕPTpH.Q$E!EH!tHLhDM"E $ֳ AZֳ A.}k8ndZŠ}k8ndZxx?b+h>w8Y@j$ɦMD(H]4RJ&iQ4MdEHPhED&i$.)f a&%t9#9LXPf`$wYu f-Yu fE#95 Mڳ56[h"@g6fB@}k8ndZD̫7Y5K=N,Yֳ AOwwW9͙jl Xz0`30`OI7wwwwwwwwwwwwwwwwwwwwwwwwv,RFPnN r33M7 oYgu7 56Z_XoBUSpdndh97wwwwwwwwwwwwwwwwwwwwwwwwvٟmCٚmq\6΁lCSe'Ϡx?4xff1 3So̡Se.֡HW 4NlG>8DI`JƢ@UFsfj-Yu3Ѓ6lCSe'6Z  -PPq4O'⡞Q5HPhgQ5HPhmCٚmƠ`̪*&5H!tJ@*&5H!tKBTڇ#95 M?17aP( D4Q4E Vz&*&5H!tKBTڇ#95 M?w3Y" QD&i$.)Y $D (DM"E-=Sj56[hLMw5mPqI&HPqb]]25p-&I4D+ 7 nTϙY*qg2DM"E+@j&5H!tK*MD(H]4R iQ4MIMHPhhLhDM"E,Y" QD&i$.)Z&5H!tH-jS(X `#bɦI5$.Lnwt'!Ǎ"-h' i%J ,HH[q 65ÏFثڜe\47=AF%2n,C*Rϳrycas=f]Xt$' :a1j*Mgg-,01} < l(+UV2n,[?AS>fwI!`o0VeXɸ;a7 @ 0xys.w|RAS>f'0YA cV[sQ?T`u7f`ۤ:IJ|Ƴ0nMVV(Ajug3+BU`97wwwwwwwwwwwwwwwwwwwwwwwwwwwwvٟ'hNe 2-ş3T?/'ş3TTϙhI!gxfe;&YVz8Q3Seɞ2iٝ3of+kwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvM^Mȃp>'|l%$Г+B`LNR[kAw#a/T~,%F nwN B-V,[2o$UUU-BPRO90YgʒyŰhIO‚,[? \$Сswbl)Wέ1ej~S@!Jum&iC062ԫV00=a]0'`ei-aF!2&iC062˽LOwbl{ z0UVAw,Bf3o3,`|,/6aL00OI_,[ SZ‚H*̖|ɕL rl458|ɕL(+ 2Y;&V3SpuRF46@x)%( jT(sVm)JBfhmk:;+a'AvL f 7 ;vL Z Z΅8I $PE_,[ :gZnw 2Y;&V- gBDAH׋׋X-2)PVugrq;&V {eH*̖|ɕL(+,[? 9sФfK>gdСswbl)Fb*0c UhR52U:{׋* ,R"HZDBZ*lMeBf-U,T 2P$U@UBTP,SH%GMB $-8^v dj;c=V6jma3E@YZje eFZYjZ;U@Y㈤D $""XT٩?PDyd*@B`eiɭVN| 6] oM E a}MNn3FPMGMBDyd PXiLK]b ug8\\@.xqyL$(EVMM2I E|l6Zʒyf 7 ;f @eI<]]\M^M E a}MNb Y5L x,a*4`$`f`Spڜe\a8DI @H"(P0KUL4\&hpT9sTϙ<0 APc xN5&Y8qZUL4z4~\6z Y5C0H%GMB $-P*@`ᩇg&h:r;j W=@Xad"F($ a-8SM- ~ ɨT1䅼'aZ8-m_,[ R& L8 93AМÐC0`OI7wwwwwwwwwwwwwwwwwwwwwwwwwwv-d1 ׌ c^eryS9Sz5>O9 ;&SBLhH~H\Ivg9>2 &DSLƕ$(I1A$'FPMGMBDyd PX ^I&$ĵ Vs瀢P/ = ?j II7;&%_euΦM7,}9m•~pqn_ Кޚ*EX- @eI<30O9 BPRO9|,/Dyd(D rŰh"37'ܕYSon X8jx1AzZřSƘJe5>83 ^k͓faɣQ쩸ӌfgX.4q rpOY2B%_,1f qM3 쯌6pO$)ՖXvQ#F+eMvgiܕY L!@X-K3YI. 6e\ 'eaGH \2`W W UaQ"4@L"n0A K\F`1 qÉƙ_*ϩӌfgX.4mpOƼi fNp47eWϩ^,@7,;*nd38řqSp("HAkeƛt ٟSqsi@;*n4׃ጾ30wƘJY?##]M8m<8vfq2lbVV8 FCc-h5 - *wfYiK3Y2l-n VN>W7׃Ჾ L;(Sp$PqNVfYWm q+&TiXo 6vWn4q8&bMM?d38řqSqPD2faxˡ*f573CfgX >2n*MAgN7 pX EX)D  EX)D@?w層ɏң)oijD JՉÃ˻-I ɒ'`, ,`H888ة$HQ@hĈBnJb˻-E.T$[Vm ]ReGH8TXzb P+"ň)CÃ˻-( 7hieE@xH$c]lTI&NpW{G1w[ƦZ|ԓ@]m LeT="R!a^"^" p@ $ʨ*8zE A@ha^"^" pc.PP(TcEPҠ<=zSeȊPE@9$|FY<]l!r%T="R!a^/A0 /A8|DLɦI5$.N4UNeOبCQ(4aQǂ P & wHIDX@(ɐc..Q$E!EH!tHepŒ5`"1;"HB]MgdЦX2j|XY>#ϫZ'JKlT,097wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwn ʛ,0dhÐs,2?}kVY%ٚehJK>kS7 u78'^,C8-lb/qfxNeMƙTqUM5}z1 %Sp׋ϩpZ5fxXc5׌P>-ƸXc3&sneW_8xhJyeh r !1Zİ:RXI7wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwn "pKҬ`?Cq^1Z4-WpMۀ9. 7V khL3+w bbb&w # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_rgdependency#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_rgdependency.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)95 1.4 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_rgdependency.sh, hacmp.assist, 61haes_r714 6/10/12 15:48:24 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_modify_rgdependency =head1 VERSION Version Number: 1.4 Last Extracted: 1/31/14 04:40:53 Last Changed: 6/10/12 15:48:24 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_rgdependency.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_modify_rgdependency =head1 DESCRIPTION =head1 ARGUMENTS =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT =cut } # End of POD-formatted documentation. function KLIB_HACMP_modify_rgdependency { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_rgdependency.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset parent=${1//\"/} typeset -n children=$2 [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN #================= : Validate input #================= if [[ -z $parent ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 101 "\nERROR: this operation requires the \"%1\$s\" attribute.\n\n" PARENT 1>&2 rc=$RC_MISSING_INPUT elif [[ -z $children ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 101 "\nERROR: this operation requires the \"%1\$s\" attribute.\n\n" CHILD 1>&2 rc=$RC_MISSING_INPUT else print "$0()[$LINENO]($SECONDS): $HAUTILS/clrgdependency -t'PARENT_CHILD' -a -p\"$parent\" -c\"$children\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clrgdependency -t'PARENT_CHILD' -a -p"$parent" -c"$children" rc=$? print "clrgdependency RC: $rc" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_modify_rgdependency()" w ktiN3+xNbbb&xN # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_service_ipy#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2018,2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_service_ip.sh 1.4.1.1 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_service_ip.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #============================================================================ # # Name: KLIB_HACMP_modify_service_ip # # Description: This is the main, FPATH function that is invoked by clmgr # to modify service IPs. It primarily uses the "clchnode" # utility to make all specified changes. # # Inputs: See the "devDoc()" function, below. # # Outputs: The properties hash is populated. The only other outputs are # any error messages that might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function, below, for the standard return # code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_modify_service_ip { . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_service_ip.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset -n properties=$1 typeset service_ip=${2//\"/} shift; shift typeset new_name=${1//\"/} typeset new_network=${2//\"/} typeset netmask=${3//\"/} typeset prefix=${4//\"/} typeset hwaddr=${5//\"/} typeset site=${6//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset nodename= current_network= nim_name= #================================================================ : Assuming an object was specified, see if it is a known object #================================================================ if [[ $service_ip != *([[:space:]]) ]]; then CL=$LINENO KLIB_HACMP_is_known_service_ip "$service_ip" (( $? != RC_SUCCESS )) && rc=$RC_NOT_FOUND fi #================= : Validate input #================= if [[ -z $service_ip ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif (( $rc == RC_NOT_FOUND )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$service_ip" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 156 "Available Service IPs:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_service_ip available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi # # make sure new label is resolvable before we go on # if [[ -n $new_name ]]; then typeset NAME="" IS="" ADDR="" REM="" LC_ALL=C host $new_name 2>/dev/null | read NAME IS ADDR REM if (( $? != 0 )) then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 767 '\nERROR: Address or name \"$new_name\" cannot be resolved. Check the input and name resolution then try again.\n' $new_name 1>&2 rc=$RC_NOT_FOUND fi fi #====================================================== : Make sure the customer provided something to change #====================================================== if [[ "$*" == *([[:space:]]) && \ " ${!_ENV_ARGS[*]} " != *\ SITE_IP\ * ]] then typeset ERRMSG=$(dspmsg -s $CLMGR_SET $CLMGR_MSGS 401 '\nERROR: no valid modifications were specified for "%1$s".\n\n' "$service_ip") print -u2 "$ERRMSG" # This strips off one of the newlines unset ERRMSG rc=$RC_MISSING_INPUT class="service_ip" display_operation_syntax 0 2>&1 | sed "s//$service_ip/g" 1>&2 fi if [[ -n $new_network ]]; then CL=$LINENO KLIB_HACMP_is_known_network "$new_network" >/dev/null 2>&1 if (( $? != RC_SUCCESS )); then rc=$RC_INCORRECT_INPUT dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$new_network" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 150 "Available Networks:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_networks available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi fi if [[ $site != *([[:space:]]) ]]; then if [[ $CLUSTER_TYPE != @(SC|LC) ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 267 '\nERROR: the "%1$s" option is not appropriate for a cluster type of "%2$s".\n\n' SITE "$CLUSTER_TYPE" 1>&2 rc=$RC_INCORRECT_INPUT elif [[ $site != "ignore" ]]; then CL=$LINENO KLIB_HACMP_is_known_site "$site" >/dev/null if (( $? != RC_SUCCESS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$site" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 157 "Available Sites:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_sites available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND fi fi fi if [[ -n $netmask && -n $prefix ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 36 '\nERROR: conflicting options were provided,\n "%1$s" versus "%2$s".\n\n' NETMASK PREFIX 1>&2 rc=$RC_INCORRECT_INPUT fi if (( $rc == RC_UNKNOWN )) && [[ -n $netmask || -n $prefix ]]; then typeset ifName="" ifType="" network="" rest="" DATA="" print "$0()[$LINENO]($SECONDS): cllsif -cS" >>$CLMGR_TMPLOG # Always log commands DATA=$(cllsif -cS) integer cmd_rc=$? print "$0()[$LINENO]($SECONDS): cllsif RC: $cmd_rc" >>$CLMGR_TMPLOG print -- "$DATA" |\ while IFS=: read ifName ifType network rest; do [[ $ifName == $service_ip ]] && break done print "$0()[$LINENO]($SECONDS): clodmget -n -q name=$network -f net_family HACMPnetwork" >>$CLMGR_TMPLOG typeset NET_FAMILY=$(clodmget -n -q name=$network -f net_family HACMPnetwork) print "$0()[$LINENO]($SECONDS): clodmget RC: $? (NET_FAMILY=$NET_FAMILY)" >>$CLMGR_TMPLOG print "$0()[$LINENO]($SECONDS): cllsif -J \\\\\| -Sn $service_ip 2>/dev/null | cut -d\\\\\| -f 15" >>$CLMGR_TMPLOG typeset AF=$(cllsif -J \| -Sn $service_ip 2>/dev/null | cut -d\| -f 15) print "$0()[$LINENO]($SECONDS): clodmget RC: $? (AF=$AF)" >>$CLMGR_TMPLOG if [[ -z $AF || $AF != AF_INET* ]]; then # # address/label is not yet defined in the cluster - make sure # it is at least resolvable before we go on # typeset NAME="" IS="" ADDR="" REM="" LC_ALL=C host $service_ip | read NAME IS ADDR REM if (( $? != 0 )) then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 767 '\nERROR: Address or name \"$service_ip\" cannot be resolved. Check the input and name resolution then try again.\n' $service_ip 1>&2 rc=$RC_NOT_FOUND else # # determine family based on general format # AF="AF_INET6" if [[ $NAME == +([0-9])\.+([0-9])\.+([0-9])\.+([0-9]) || $ADDR == +([0-9])\.+([0-9])\.+([0-9])\.+([0-9])?(,) ]] then AF="AF_INET" fi fi fi if [[ -n $netmask || -n $prefix ]]; then if [[ $AF == "AF_INET" && $NET_FAMILY == 2 ]]; then : The address, $service_ip, is IPv4 if [[ $prefix != *([[:space:]]) ]]; then netmask=$prefix prefix="" fi elif [[ $AF == "AF_INET6" && $NET_FAMILY == 1 ]]; then : The address, $service_ip, is IPv6 if [[ $netmask != *([[:space:]]) ]]; then prefix=$netmask netmask="" fi elif [[ $AF == "AF_INET" && $NET_FAMILY == 1 || \ $AF == "AF_INET6" && $NET_FAMILY == 2 ]] then #==================================================== : The network and address are of the same type. : Netmask/Prefix is not needed, and cannot be used. #==================================================== typeset TYPE="IPv4" [[ $NET_FAMILY == 2 ]] && TYPE="IPv6" cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 271 'The specified address, "%1$s", is of the same type (%2$s) as the specified network, "%3$s". So the netmask/prefix information specified for "%1$s" is not needed, and will instead be taken from "%3$s".\n' "$service_ip" "$TYPE" "$network" netmask="" prefix="" fi elif [[ -z $netmask && -z $prefix ]] && \ [[ $AF == "AF_INET" && $NET_FAMILY == 2 || \ $AF == "AF_INET6" && $NET_FAMILY == 1 ]] then typeset ADDR_TYPE="IPv4" [[ $AF == "AF_INET6" ]] && ADDR_TYPE="IPv6" typeset NET_TYPE="IPv4" [[ $NET_FAMILY == 2 ]] && NET_TYPE="IPv6" if [[ $ADDR_TYPE == "IPv6" ]]; then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 272 '\nERROR: the specified address, "%1$s", is of a different type (%2$s) than the specified network, "%3$s" (%4$s). A prefix length must be provided.\n\n' "$service_ip" "$ADDR_TYPE" "$network" "$NET_TYPE" 1>&2 else cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 273 '\nERROR: the specified address, "%1$s", is of a different type (%2$s) than the specified network, "%3$s" (%4$s). A netmask must be provided.\n\n' "$service_ip" "$ADDR_TYPE" "$network" "$NET_TYPE" 1>&2 fi rc=$RC_MISSING_INPUT fi fi if [[ $prefix != *([[:space:]]) ]] && \ ( [[ $prefix != +([[:digit:]]) ]] || (( prefix < 1 || prefix > 128 )) ) then dspmsg -s $CLMGR_SET $CLMGR_MSGS 113 '\nERROR: an invalid IPv6 prefix length was specified: %1$s\n\n' "$prefix" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 'Valid values: %1$s\n\n' "1 .. 128" 1>&2 rc=$RC_INCORRECT_INPUT fi #============================================================== : Modify the service IP if no input errors have been detected #============================================================== if (( $rc == RC_UNKNOWN )); then typeset netarg="" if [[ -n $netmask ]]; then netarg="$netmask" elif [[ -n $prefix ]]; then netarg="$prefix" fi #===================================================== : Need to retrieve existing data for this service IP #===================================================== print "$0()[$LINENO]($SECONDS): odmget -q \"ip_label=$service_ip\" HACMPadapter" >>$CLMGR_TMPLOG # Always log commands odmget -q "ip_label=$service_ip" HACMPadapter |\ while IFS='=' read name value; do name=$(echo $name) value=${value//\"/} [[ $name == "nodename" ]] && nodename=$(echo $value) [[ $name == "network" ]] && current_network=$(echo $value) done eval $(clodmget -q ip_label=$service_ip HACMPadapter | tr ':' '\n') if [[ $new_name == *([[:space:]]) ]]; then new_name=$service_ip # The name was not changed fi if [[ $new_network == *([[:space:]]) ]]; then new_network=$current_network fi print "$0()[$LINENO]($SECONDS): clodmget -q name=$network -f nimname HACMPnetwork" >>$CLMGR_TMPLOG # Always log commands nim_name=$(clodmget -q name=$network -f nimname HACMPnetwork) print "$0()[$LINENO]($SECONDS): clodmget RC: $?; nim_name == \"$nim_name\"" >>$CLMGR_TMPLOG # Always log command result print "$0()[$LINENO]($SECONDS): clchnode -T service ${nodename:+-n $nodename} -a ${service_ip}:${new_name}:${nim_name//\\\"/}:${new_network}::service::${hwaddr}:${netarg}::${site}:" >>$CLMGR_TMPLOG # Always log commands clchnode -T service ${nodename:+-n $nodename} \ -a ${service_ip}:${new_name}:${nim_name//\"/}:${new_network}::service::${hwaddr}:${netarg}::${site}: rc=$? print "$0()[$LINENO]($SECONDS): clchnode RC: $rc" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then [[ -n $new_name ]] && name=$new_name if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_service_ip_attributes "$name" properties fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 'For more information about available options and syntax, try\n"$HAUTILS/clmgr %1$s". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n"$HAUTILS/clmgr -hv" (or "/usr/bin/man clmgr"),\nsearching for "%2$s" in the displayed text.\n\n' \ "modify service_ip -h" "SERVICE IP/LABEL:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_modify_service_ip()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_modify_service_ip =head1 SYNOPSIS clmgr modify service_ip \ [ NAME= ] \ [ NETWORK= ] \ [ PREFIX= ] \ [ HWADDR= ] \ [ SITE= ] NOTE: the alias for "service_ip" is "si". =head1 DESCRIPTION Attempts to modify the specified service IP to conform to the provided specifications. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the modified object can be returned to the caller. 2. service_ip [REQUIRED] [string] The IP address or label of the service IP that is to be modified. 3. new_name [OPTIONAL] [string] The new IP address or lable that is to take the place of the specified service IP. 4. new_network [OPTIONAL] [string] The label of a new network bind this address within. 5. netmask [OPTIONAL] [string] A netmask to use with the service IP. 6. prefix [OPTIONAL] [string] A prefix length to use with the service IP. 7. hwaddr [OPTIONAL] [string] The hardware address to apply. 8. site [OPTIONAL] [string] The label of the site to use this service IP within. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #==============================================================================  lP3+Zbbb&6 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_site   =einorst $_acdhlp"#CEILMNORSfmuy(),-./12:AGPT[\]bgvw&'0;>BDHKUk!%3457Sp+{"wqVZ b9/:cȝT6geSp+{"vU&Im%Ok|yW{D\!@@@ FAUȩo E "dE "Tȡ@@H4q%8' 2T9A80V`e8)r^u=:?DOR  % D!m% DC8:K1Lq%LA 4ayQ2!2f"?DOzuQ&Xs DaP bkt ,_qVZ4wT'KIf)8XPLW4J')P(L"{ EDŢ҄QIE0Ed$D#&p ޝ0Ee0`dI iBmmmm)1{ƚsͥ9mmmmD@2ċ%  **22Q4r3 zddFQQ(5lFpH' n==:H4QG# *OR  % D!m% DC8, C $`s[;scGYiN2cԘq67!PE h@:K1M5RzI_ McN2m8lj_&j&75c h+du22?F @ #h$DP0Ee0`dI iBmmmmmmm?K*Nx|VtB.7/{*|]Mmmmmmm./@PI9 `Ȓ,0(d\ 8̓$1Qc#'YiAspaDQC$-DQC2(gAb(a.`KkĖb(LM(͆;/ l4S4q <8a cЃ##h$DP0E̙&XQeBBammmmmmmOɚ&x/)%@r^Gxx't8Mn)0?K,\H%L%&<]"L7rSsϔ;cL7![mmmmmmmm XWt=  @^bFQ.d,ddYi鬊\h(TP&I h(TP%L`' 4 oEd6X5<i[\IyM* 4a@ ? Db%$DYeBBa./Aȹ`N#"Č",EI`5ǔ"?qVZk"76J0BJ0S"p$PI0\]d\L3iՎSyM*k23ZhNTX#/hAX4"Ө"2K0H$ 4!mmmmmm?K"8lj_4a3Ed8mmmmmܿ,D 8LD$*B{"aB()Hᣡg/@9ĀB 2!& 3NXb@!pHUK09ĀB 2!& 2Da(+@9ĀB 2!& 3t %ȗQ Q0HTb$g qVZk"76J0BJ0S"qX,C 4 ik19SMcM&9>xq8$LwAs0¢q|q ?I0"`39vcp!ƒL&q}ȹ 4azD KȄBB$*\1b 2? @,D 8LD$*B̂#h$DP0Ee0`dI iFz&qQk[ጌ8-?mmmmmiX**γ!ƵM t ScvC%qd#֩ᤳ%oY Bmmmmmm^a1H(fcc@.Be.2DK YhA4΄jJ0QR<&Ga76TJ 3P MeFp:dg89NPbE dBĴZdg 3FA@vJ 2…ĠIȐXxf*(ab y MaԎYzn6m&`qh&:ӂ0s*T{47ӀPAX!ώp,q}R%ĊTpF|eLdgy{M8T9{M8TBmmmmmmiY3X但Qc2i&-*w8VtIr mmmmmmm/{j ⬴ "PL"PJ3PI0\Ǝ$X^SaJ?!^<BÆ HǠ?DOR  % D!m% DC8:K1Lq%LA 4azx@`E 0qq(.r$22#h$DP0Ee0`dI iammmmmm?K"`gk:2I6mmmmmm?\_ ndu23OƏ du22R VO!'+/q֚wg2K 2L N,ssg!!*ll#)(y2 ᥾`qh5V@3dvCaETY<ƚsͥ9VC2K2L58NW:!*Vsi7]!Ny43U[*C;YɃe#aǐ)(!"`2a.BsN~DLOM͜kJ,sOdUcx91=5B2ӟYq;|yW{D.\TXreqxEhqVx23 jSqqK@uYogM͜kJ,sO]ZM솛N2gYzM(5\;XuV&Fx*)Og6MÒir'9ݐ҄6SI5x22I-⫎ Y{Dpv jU 㬊YIs8lj_֒q`r )r_*dY?4;iqdPH8lj_֒q`r*x'uWلvIɃl~oEd.*,La28"4ld͹TeQISJwAs28:ȪVt9ÏXGQ gI8rw" j,Xѽ͘i>OI0"`sn|U&D KȄBB$*\1b 2I/Wt= 'Βi5<M \2 ѱ)B)(!.*L y$1@M(Ilr lTUd\ñX,0D &ن f&Pg"x#5MƱH=Ʌ<[mmmmmmmmmmŕӖYìhfYɄ6aܴӞF4oRj=HcxC4ŧd9Q1%ɴ6*cK90:K)?J>$CLMGR_TMPLOG # Always log commands $HA_UTILS/clrgdependency -t SITELOCATION -a -l $1 typeset -i rc=$? print "clrgdependency RC: $rc" >>$CLMGR_TMPLOG # Always log command result log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_modify_site_collocation()"  kpU3+##bbb&## # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_snapshotocat#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2018,2019,2020,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_snapshot.sh 1.5 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) c93cc36 43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_snapshot.sh, 726, 2147A_aha726, Feb 25 2021 03:14 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_modify_snapshot =head1 SYNOPSIS clmgr modify snapshot \ [ NAME="" ] \ [ DESCRIPTION="" ] NOTE: the alias for "snapshot" is "sn". =head1 DESCRIPTION Attempts to modify the specified PowerHA snapshot to conform to the provided specifications. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the modified object can be returned to the caller. 2. snapshot [REQUIRED] [string] The name of the snapshot that is to be modified. 3. new_name [OPTIONAL] [string] A new name to use for the snapshot. Note that the .odm suffix of the snapshot file itself is preserved. 4. new_desc [OPTIONAL] [string] A new description to apply to the specified snapshot. Note that this option modifies the "description" section within the snapshot file itself but does not rename the snapshot. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. #============================================================================ # # Name: KLIB_HACMP_modify_snapshot # # Description: This is the main, FPATH function that is invoked by clmgr # to modify a snapshot of the cluster configuration. Since # a snapshot is primarily a backup of the SystemMirror ODMs, # the only things that can be modified are the names of the # snapshot files, and the description associated with them. # # Inputs: refer to the "devDoc()" function, above. # # Outputs: No explicit outputs, other than the normal clsnapshot # output, along with any error messages that might be needed. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function, above, for the standard return # code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_modify_snapshot { . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) c93cc36 43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_snapshot.sh, 726, 2147A_aha726, Feb 25 2021 03:14 PM : INPUTS: $* typeset -n properties=$1 typeset snapshot=${2//\"/} shift; shift typeset new_name=${1//\"/} typeset new_desc=${2#\"} new_desc=${new_desc%\"} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset dopt= Nopt= typeset -i i=0 #================================================================ : Assuming an object was specified, see if it is a known object #================================================================ if [[ $snapshot != *([[:space:]]) ]]; then CL=$LINENO KLIB_HACMP_is_known_snapshot "$snapshot" (( $? != RC_SUCCESS )) && rc=$RC_NOT_FOUND fi #================= : Validate input #================= if [[ -z $snapshot ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 158 "Available Snapshots:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_snapshots available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_MISSING_INPUT elif (( $rc == RC_NOT_FOUND )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$snapshot" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 158 "Available Snapshots:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_snapshots available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" elif [[ -z $new_name ]] && [[ " ${!_ENV_ARGS[*]} " == *\ NAME\ * ]]; then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1422 "\nERROR: Cannot modify name of a snapshot as an empty string. Please provide a valid input.\n" rc=$RC_INCORRECT_INPUT elif [[ "$*" == *([[:space:]]) && " ${!_ENV_ARGS[*]} " != *\ DESCRIPTION\ * ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 401 "\nERROR: no valid modifications were specified for \"%1\$s\".\n\n" "$snapshot" 1>&2 rc=$RC_MISSING_INPUT fi #============================================================ : Modify the snapshot if no input errors have been detected #============================================================ if (( $rc == RC_UNKNOWN )); then : Provide escaping for some characters that are not safe in an eval new_desc=${new_desc//\$\(/\\\$\(} new_desc=${new_desc//\`/\\\`} new_desc=${new_desc//\"/\\\"} : Provide character entity replacement, a la HTML new_desc=${new_desc//\&apos\;/\'} new_desc=${new_desc//\"\;/\\\"} new_desc=${new_desc//\<\;/\<} new_desc=${new_desc//\>\;/\>} new_desc=${new_desc//\&\;/\&} new_desc=${new_desc//\&excl\;/\!} [[ -n $new_desc ]] && dopt="-d \"$new_desc\"" [[ -z $new_desc && " ${!_ENV_ARGS[*]} " == *\ DESCRIPTION\ * ]] && dopt="-d \" \"" # This is to handle DESCRIPTION="" case [[ -n $new_name ]] && Nopt="-N $new_name" print "$0()[$LINENO]($SECONDS): eval clsnapshot -R -n $snapshot $Nopt $dopt" >>$CLMGR_TMPLOG # Always log commands eval "clsnapshot -R -n $snapshot $Nopt $dopt" rc=$? print "clsnapshot RC: $rc" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then [[ -n $new_name ]] && name=$new_name if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_snapshot_attributes "$name" properties fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "modify snapshot -h" "SNAPSHOT:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_modify_snapshot()" #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ ]]) ] kTcW3+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_storage_agentoncy#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_storage_agent.sh 1.6 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)46 1.6 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_storage_agent.sh, hacmp.assist, 61haes_r714 12/3/12 09:10:01 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_modify_storage_agent =head1 VERSION Version Number: 1.6 Last Extracted: 1/31/14 04:41:03 Last Changed: 12/3/12 09:10:01 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_storage_agent.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr modify storage_agent \ [ NAME= ] \ [ ADDRESSES=[,...] ] \ [ USER= ] \ [ PASSWORD= ] \ [ ATTRIBUTES=@[,@,...] ] NOTE: the alias for "storage_agent" is "sta". =head1 DESCRIPTION Attempts to modify a storage agent. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. storage_agent [REQUIRED] [string] The label of the object to be modified. 3. new_name [REQUIRED] [set] A new label to apply to this object 4. addresses [OPTIONAL] [string] One or more (maximum of 4) IP addresses to be associated with this storage agent. 5. user [OPTIONAL] [string] The user ID to be used for communication with this storage agent. 6. password [OPTIONAL] [string] The password that is to be used with the provided user ID. 7. attributes [OPTIONAL] [string] One or more storage-specific configuration attributes. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_modify_storage_agent { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.6, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_storage_agent.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset -n properties=$1 typeset storage_agent=${2//\"/} typeset new_name=${3//\"/} typeset addresses=${4//\"/} typeset user=${5//\"/} typeset password=${6//\"/} typeset attributes=${7//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi CL=$LINENO isEnterprise if (( $? != 1 )); then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 184 "\nERROR: this operation requires IBM PowerHA SystemMirror for AIX Enterprise Edition.\n\n" 1>&2 log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -A saAttrs CL=$LINENO KLIB_HACMP_get_storage_agent_attributes "$storage_agent" saAttrs typeset type=${saAttrs[TYPE]} typeset existing CL=$LINENO KLIB_HACMP_list_storage_agents existing 2>>$CLMGR_TMPLOG #================= : Validate input #================= if [[ -z $storage_agent ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif [[ " ${existing[*]} " != *\ $storage_agent\ * ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$storage_agent" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 163 "Available Storage Agents:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_storage_agents available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND fi #================================================================= : Create the storage agent if no input errors have been detected #================================================================= if (( $rc == RC_UNKNOWN )); then typeset nameOpt= addrOpt= userOpt= pswdOpt= attrsOpt= [[ $new_name != *([[:space:]]) ]] && nameOpt=" -N $new_name" [[ $addresses != *([[:space:]]) ]] && addrOpt=" -i $addresses" [[ $user != *([[:space:]]) ]] && userOpt=" -u $user" [[ $password != *([[:space:]]) ]] && pswdOpt=" -p $password" if [[ -n $attributes ]]; then for pair in ${attributes//,/ }; do attrsOpt="$attrsOpt -o${pair//@/ }" done fi print -- "$0()[$LINENO]($SECONDS): $HAXDWIZ/clxd_change_sa_director -n $storage_agent -s $type$nameOpt$addrOpt$userOpt$pswdOpt$attrsOpt" >>$CLMGR_TMPLOG # Always log commands $HAXDWIZ/clxd_change_sa_director -n $storage_agent -s $type$nameOpt$addrOpt$userOpt$pswdOpt$attrsOpt rc=$? print "$0()[$LINENO]($SECONDS): clxd_create_sa_director RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 400 "\nERROR: failed to modify \"%1\$s\".\n\n" "$storage_agent" 1>&2 rc=$RC_ERROR fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_storage_agent_attributes "$storage_agent" properties fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "add storage_agent -h" "STORAGE AGENT:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_modify_storage_agent()" requi lX3+@0bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_storage_systemncy     =e ainrst"$O_cdmop/ACEGILMNRST[\]bfghluy#&()-.012:>Pvw*,4;WenS՝yӖ`d z؆Z*} N/Vvm@h4W,Y1 |dAE4+" &T&AAAM 8`Po%ck`C`a*#DA&*,T؋ڒC)< ĄA j<$2n q!!@& ЬSb+sU ob|@tobhWq> DIhWSpX"HyANJ4+aa)Fxrpr-x,$v)̷1 g;[`ڳt3w0{[qRHe;_0TxJJq|osןq?s6vvynu 0r)HbW3M7gO3ϖfna1RS(4ħ ؎Sb.;{'.lft¯tl]=MC)n[0r)HbSt˞Zȃvs=|^q)He;\=\^&*\e54,D zהak9{1g6>6" ka1RS(4ħ=|;yz3jnSb.;|v# >nI^ػx=(~喍W,bȦPi#YN/M,b(' 9KLF_X PNAn" bȦPi#YN/M,b(' 9NLT $k1):iq6=]V qPE{t\ JLT $k1):i2y#Y^6ە d=q?6BQq0r)H` @1۠} CgNY]S%;|7 k;͹PZ=nXG*<,sd?B" |UONY[ZkiThO m`EwNv ^7M@=iVobH1@pT]q qRHe;_ 7'BX~8i" ©\apP C"c<q(8!RSb.;jI k#@H#A8 ɺ8ĄqH$oD#sA(TrȖ,DG(8`j:)"PyDonh# )ݿB?6BQqt4PsF\\8$HAŮ/8GI\`Xeyå82T,Y{7*4,ܮxsI<Q0QnW>/y03Hە eFbǟCA\\6%I"PyD,bᣉ}򚒛qRHe;^]_)q!AD&@ɊLRDQ< $D8hb|\vԒNחao4pHPQ!ĉ*rb kªxYӽeUUUUUUUUMy8t6"㶤vh+ F|-&W:ZC UB$LU [3JTOw/cݟA)f, =kX< DP,IV*9BdK"PJ ˵}34tV|04jt6"㶤v4 z%IwDPC UBeDLyR̢L#(1r2ͺ<"L30GE)M$2"($%IwDPC UBe@Ng<؋Y kL DP,I8p H$aosA0V k0 XEtO4j ɗ+bf7Ð hA+S|Ihxr-[i"(uB`91CJ.z`ƎJ/z=V3 R^|Ѭ,/0cJ.5iJlEmI!|ѠW3&W:ZC UB$LU [4LyR6" kg6>b?r{Se"e)D>];6"p_r>f`Pu DP,KoUPAɕ*v]ҝ`r&hnh6gH]ҝ1ˣ8\0'&\459&][t4v9f7Ŝ}InLܛ3"frÝ,--` 'Nqyf7Ŝ}IӜ^mCa0V a6g*E&frØH$,,`3 á喍W,ѠW3 7+Diw%H:ExpvNYhܥrGr 8ۖȎDܦ0i=Ѭ,/zlΑßDQot4ȖhM8q'$=91CI0r4 &9 \`{s0cHە eFbǟL`i(.2ϰwUt @D*|"tڒ>6؎ )M$2KJhY3Hl!dٚB43QMl'"3Iٜ@3oUz)H&h1"&PX4OTEe<%%|mY=(((DP1RIiw!}.o(XrՁ .V i:D/t,]H9{E arF+hM)METrF*I-H:H%qѬ,/63R63$W9{E`i( :v7 7*`fU겣&Db%(D<QWʎPAɕ*sG22^!Fa`f[[؋ڒC)qtKL,qHq"d *U2"($kϰuHF /#)ETtR GE"DJ(-a4'c,bᣉ <%6"㶤v`j-HP kZ3+-bbb&- # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_tape#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r721 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_tape.sh 1.6 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)74 1.6 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_tape.sh, hacmp.assist, 61haes_r721, 1618A_hacmp721 4/29/16 06:30:11 #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_modify_tape =head1 VERSION Version Number: 1.6 Last Extracted: 5/3/16 18:54:04 Last Changed: 4/29/16 06:30:11 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_tape.sh, hacmp.assist, 61haes_r721, 1618A_hacmp721 =head1 SYNOPSIS clmgr modify tape \ [ NAME= ] \ [ DEVICE= ] \ [ DESCRIPTION= ] \ [ STARTSCRIPT="" ] \ [ START_SYNCHRONOUSLY={yes|no} ] \ [ STOPSCRIPT="" ] \ [ STOP_SYNCHRONOUSLY={yes|no} ] NOTE: the alias for "tape" is "tp". =head1 DESCRIPTION Attempts to modify the specified PowerHA tape device to conform to the provided specifications. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the modified object can be returned to the caller. 2. tape [REQUIRED] [string] The label of the tape that is to be modified. 3. new_name [OPTIONAL] [string] A new label to attempt to apply to the specified tape. 4. device [REQUIRED] [string] The name for this tape device. 5. description [OPTIONAL] [string] A description of the tape device. If no description is provided, then one will be automatically generated. 6. start_script [OPTIONAL] [abspath] The start script for the tape device. 7. start_sync [OPTIONAL] [string] A Boolean-like indicator of whether or not that tape device is to be started synchronously. 8. stop_script [OPTIONAL] [abspath] The stop script for the tape device. 9. stop_sync [OPTIONAL] [string] A Boolean-like indicator of whether or not that tape device is to be stopped synchronously. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_modify_tape { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.6, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_modify_tape.sh, hacmp.assist, 61haes_r721, 1618A_hacmp721 : INPUTS: $* typeset -n properties=$1 typeset tape=${2//\"/} shift; shift typeset new_name=${1//\"/} typeset device=${2//\"/} typeset description=${3//\"/} typeset start_script=${4//\"/} typeset -l start_sync=${5//\"/} typeset stop_script=${6//\"/} typeset -l stop_sync=${7//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 #================================================================ : Assuming an object was specified, see if it is a known object #================================================================ if [[ $tape != *([[:space:]]) ]]; then CL=$LINENO KLIB_HACMP_is_known_tape "$tape" (( $? != RC_SUCCESS )) && rc=$RC_NOT_FOUND fi #================= : Validate input #================= if [[ -z $tape ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif (( $rc == RC_NOT_FOUND )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$tape" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 159 "Available Tapes:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_tapes available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi if [[ -n $description && $description == *:* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 103 "\nERROR: one or more invalid characters were detected in \"%1\$s\": \"%2\$s\".\n\n" DESCRIPTION ":" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $start_script && $start_script != /* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 106 "\nERROR: the specified path does not appear to be in absolute format:\n%1\$s\n\n" "$start_script" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $start_script && ! -e $start_script ]]; then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 107 '\nERROR: the specified path/file does not appear to exist on "%2$s": %1$s\n\n' "$start_script" "$LOCAL_NODE" 1>&2 rc=$RC_NOT_FOUND fi if [[ -n $start_script && $start_script == *[[:space:]]* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 108 "\nERROR: the \"%1\$s\" attribute's value contains whitespace,\nwhich is not allowed: \"%2\$s\"\n\n" STARTSCRIPT "$start" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $stop_script && $stop_script != /* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 106 "\nERROR: the specified path does not appear to be in absolute format:\n%1\$s\n\n" "$stop_script" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $stop_script && ! -e $stop_script ]]; then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 107 '\nERROR: the specified path/file does not appear to exist on "%2$s": %1$s\n\n' "$stop_script" "$LOCAL_NODE" 1>&2 rc=$RC_NOT_FOUND fi if [[ -n $stop_script && $stop_script == *[[:space:]]* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 108 "\nERROR: the \"%1\$s\" attribute's value contains whitespace,\nwhich is not allowed: \"%2\$s\"\n\n" STOPSCRIPT "$stop" 1>&2 fi if [[ -n $start_sync && $start_sync != @(y|t|n|f)* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" START_SYNCHRONOUSLY "$stop_sync" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "yes, no" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ -n $stop_sync && $stop_sync != @(y|t|n|f)* ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" STOP_SYNCHRONOUSLY "$stop_sync" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "yes, no" 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ "$*" == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 401 "\nERROR: no valid modifications were specified for \"%1\$s\".\n\n" "$tape" 1>&2 rc=$RC_MISSING_INPUT fi #======================================================== : Modify the tape if no input errors have been detected #======================================================== if (( $rc == RC_UNKNOWN )); then [[ -n $new_name ]] && new_name_opt=" -N $new_name" [[ -n $device ]] && device_opt=" -d $device" [[ -n $start_script ]] && start_script_opt=" -p $start_script" [[ -n $stop_script ]] && stop_script_opt=" -P $stop_script" [[ $start_sync == @(y|t)* ]] && start_sync_opt=" -s1" # Sync [[ $start_sync == @(n|f)* ]] && start_sync_opt=" -s0" # Async [[ $stop_sync == @(y|t)* ]] && stop_sync_opt=" -S1" # Sync [[ $stop_sync == @(n|f)* ]] && stop_sync_opt=" -S0" # Async print "$0()[$LINENO]($SECONDS): $HAUTILS/clchtape -n\"$tape\" $new_name_opt $device_opt $start_script_opt $start_sync_opt $stop_script_opt $stop_sync_opt" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clchtape -n"$tape" \ $new_name_opt \ $device_opt \ $start_script_opt \ $start_sync_opt \ $stop_script_opt \ $stop_sync_opt rc=$? print "clchtape RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR elif [[ -n $new_name ]]; then tape=$new_name fi if (( $rc == RC_SUCCESS )) && [[ -n $description ]]; then print "$0()[$LINENO]($SECONDS): $HAUTILS/clchtape -n\"$tape\" -D\"$description\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clchtape -n"$tape" \ -D"$description" rc=$? print "clchtape RC: $rc" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR fi #=========================================================== : If output from this operation was requested, retrieve it #=========================================================== if (( $rc == RC_SUCCESS )); then if (( CLMGR_VERBOSE )) || [[ -n $CLMGR_ATTRS ]]; then CL=$LINENO KLIB_HACMP_get_tape_attributes "$tape" properties fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "modify tape -h" "TAPE:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_modify_tape()"  lޮ\3+bbb&w~ # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_user    et=ainors $O_cdfhlmpu"./ACEILRST[]gwy(),1:GMNP\bk!#&*-02;>DUvx{|}'3469 bH@(dDI Xxp',{7TtĢLU4dAU1ftܲܳ5{L:NOYzYh༸ q!$. M3UuBI\$$f *Uu ˂ 4\hU]pb༸ F *UuiZbB[^0x2K Zˤl;hFŪAii;V T;U]ZՋ2j֛n 0hv}Z7\TZՋ2[5T.֕f v4dàK9w[ xlΓ;ujkrIT̟=\ؤ>޽rt nYhƝX0Hx"ǒ&D"4I ʢY@c (U8$3(ӎjBBDD8" I^W*e Oi9eCN; ٝK.P "B&2>L?Z&_^U׽:GUٝKrIE_vs7;ƝYZnwKΧڵ:/]ǝ_j֔e*JMY{J=<&OR2ZٝKM>ueqgR|I=G{27+Z =vW֨NN'>0ZҌyd|aNխM7˖a۠w`%={ViEu}ZpQf^uܞ,;V7NoJforc'3s^y䒦,kT ڼTcIWI]Jc|Wj֜Rezqj&3iEu#-xʷHw[ŝ'CfuWu)peqj÷A>q^I=i*9+O|kek3B7+>ݪmj`04;afghq0hwno3 0F啮w'Γޔan|7@6Lt SkR+-O%]'%u)iEh  Ӌ"VY048"0Ҋ  ;>b`,4;ejK1PK.X0ƆpK> 4; a9!y髆 jFF$w`S Y %aeڵѼdɓweNs+Xyˠ(Xcɘ0wU8$3(iڵ3ܒؤ0ծkfu#=ecxnM:Opu>uʧdfeX=QLÌU8$3(bzûVQԧz-[N;[SjZK3; 8< &<fҏOvY:Im3Rr| ӜR{O{U;Է$Yj3s\ir o%ר'IjծftfRuj@,$;dd-ڵΒfO|w'o' F:0]0n,˙.7-Wk/Tuڴw v8']bb:N;qz7;$Nyt @Ly3y՘;ѾwVi-ekkfu.oYGS .;jʛr:ZTz՚ziJu|2GGsOuyڽΤ7%{ʒUר|-I]&7ԕ+R2^ʻ-ZR]&7թd@9\2 rx7S=eF\7ҊRV4ǬMRxM3Sz0]D^*E%S]BĐL^uf%ޓV]])4\/FeZN-Zf 敨\XO}|2e_='CGA|zN;uZCI3'ٱԤREɮ|2=ejnY֠vFnwR+:ˠ(Xcɘά啮/ qSrkZ&roڵ.t2};<&'ٝJ}ǕNkfu xql:s5&4-Z΃ڵ:df}O/Fe[FIv;[oWqܒU9>Y%#l]'wYSs_QTƜw%;V,I:>t%twj9F7B7ʧWڵ: 3;aә1=ejnY|,IvYhExHf $f2ъ;zN;UٝK|,MR}IW@vbnwVS#qz7;R6ž0ˠ(Xcɘά|o9I=GV,f2}eڵ: <^jڵѾwPܲ/FOYmF+Z H5LVgRҕ:yگjF HIVTqZ&<&噩e D<òG;(Tz 84 ;Q臃A><şyBz6wB@p @p ,ѳ @ @gP^v R6ž0ˠ(Xcɘάr HI=j=)S )b<jʛگ-6)'jOWoiWj֣֣=ej HI8-Tr1JȐcȕD<"Ǒ*xD@8J"@ Ǒ*8cȕDH;y2$q<-V$Oppşx;֨C `ZH_ μSv,@ͪ+`N.1׊t4Ǒ*8mǦt0JFط[tt>şx;֨C `ZH_ μSխzbVQdʹ^[3k;;ڵ zNIT+,o#*̹| I*j7;啭:Q̭y=(ï|zNjFKmh|bQJfU<[HMRcrԩHʃ-S֊NXAU8$cqE'bթ/IF[3O4NrITڵY:O]$:UʧdL;bdzYwj'\޻tU'=H|u0ٝH Zk-c@YbcrfQe;ܴɛ;j3s\i6)'okfu yE9ՇvmҌ-σdV2,pr<2E89zt4 szylcwS']vpr<]([3լxB +ZzZJT6qO tqdԕvs>xMagõkQ{ڴwQ+Ԍu):q$ ̢ZnwKa>խԻj֝(V̢$Ij㙜,aӤٝHjtZ 8<'ˠ(Xcɘ0wek3(/][3fڮ iZjZ3=ԌkQn#(Jԕ06gRjjTwJ=ڱqؔnON,*FQe:jFKglΥ<ұܒU9srzN-WI3N*YU0튒޻ttZ 7.IR2;R2]n?fu-'CK|6X8eXӿȚH;7tlROP,o+bO]7YcR2ݳ:ӎ-lROPjĞo3(/AݛbV9zt|2wEfuڵ|StKRWڵYcRQ_kIX*l,tܒlROPk>w2,L;k.w7VgR=[z:Q̭yE9I=G{ڴw3,:t2}3 Ns+^֡A]D̢ˠ(Xcɘ0wV)'j|;:,=H4Wkfu-ܚruCN;Of|T095xN2,i:k7O6w{]|N{j(gRU=7J}vլ̢LrJeXIҌ-χWqUXI]GOthwlλVo n|jJV9zJ+i+S|Y<1Şt%aݫ\O*pr3=7ͅnխGj֔e*J#%aNJfΜxFԸY7Ybaݫ\}%i!y(Vj:!ӤgRzթiҎek;ɮ>w'\eJ>،e]}[3kծt7&ܝq7@fQe8<+T $f20w2׌V_=ԸRuO_$(GΤU;Ҿծ,To'ڮխԷrD&wbdӎ5I7,LCUȹ5W#\v vF4ITYK.bH &c.-NʱI=GVgRg7ywB6Kfu {J,ƜwZZeɚNխԹVOڱIfi*G#FթlΤrIEXܭ-I^1G-:NխԷF3jO'y}wB6Kfu {J,Ɯve2,O.bH &c/:bzfeXjl4I]ԃ{j{3;%acp>,iм̢J̢ڻ]|N$֣50VeI*UٝH䒋0n;խԀY7;e:quܞ,rÎ)+{|/,5>2Ռ8(ʻU ,sgٝKrIEXܲYbzrҧ&o|aڵq.̢͜ܟ:Q| feXgӒW3(/ZNan|8»O2L:NZ;^}tCfuڵ|StKRWڵRQ_kIX*7I᎞n,+Zr| Sl,tvj>O|;V)RW. q|Yt9I=C}X5'&OoI[[3(ag%GY˺lEԔa|TݙYcg=Z;G,uzYEw%3qgN<#}B\e,0ծft喉fQe>wI(VleXvc:I>͎fu#zy}qWfu-%ayڽ\Ҋ 8-XM3SztIeX.ծlROrM3XɌqx7V+]BĐL]FVYZ,nVfa֯qZFgRgM264p4o5ie $f2>LUIZܶĢfN_+PZٝKbdvLrʾ{ٶXjlJ&dù| Qˠ(Xcɘ0wV)'oNż'[dh}[3 8Q.bH &c.0HH"UU6laʱI=GC񆛮#.խԀY:s5'7jFKBAc0ǍaڱfA7AٺtF+PZ(|a뮂>U0խԳOYlZP e*է˵kaә1aH^ˠ(XcɘˋF+S`PM:yjթvlΤrIE^E!zL;4WbT\kfu-IE}h2i3[uV$YRtZٝKIЄoZ&_rӭM:}[J,τl' lΥkD4*bf#{0Z) ٝH䒋0u=h/ISekqoQZ։u.iC--lΤrIE_jNRjIθwcs֤ewj3s_rki:3լN NzԞN&_ Yta)ԧPg}TZLoa)ԧPdi`nLt @Ly3qhjt J ']O4Z.խԴ h j3s_4WhD3J+&4pʗ+D@P$Ǔ1V@䠛uJիRZٝKI։s7;%*^7\qVejˠ(XcɘˌUUu͛`ROQ>ծ޽qSMA=7;VUB[3oYhLǵk.7{v/I*V/śӮ*vNz=ܲ5I+XM3[wNtt|TqO['9àK9w[؋awRQSk[uVgR>ܲ5Ih 6dW_o^Wuܞ,6)'L;kfu-'CZ&wuYn޽LnRwգUԴzqI|aiչLoqh"!ڵ3S*ݥw:auzϝS}=HML@ &p`i0 UU;ypA!$. M3Uu^\`F *Uu^\`paUuJԫ=ŪX`4]#ax{B4.-R L|VoZjřqSkMh74;]}Z|j֬Yv'=٪tl 0Mð!]l7 ADr|/]jٝ&ww7unI*ٓgk}'ףN=7-TӎnILˠ(Xcɘ˾`WqSJ0$ͼ'[0)%S/]jG{Z&1%;U-(Rtwj䒋0֊B}[3i:D7$ >lROQjzfUgYjLiC--lΤrIE_jNRjIθbws֤ewj3s_rki:3գN NzԞN&_ Ytva)ԦwPg}TZLoa)ԧPdi` 7rD&ٹ,I1er| ;}OkY*wR]rW^$sWfu#ܒQf7nٝK>w$N}[J,ûVbui+ڵIwjJ+zJnI*P fgzNOwwR]rϝ{گd啮ftj2ɕ{V;X=Z$\ؤ=WQg d\$N}ǵkrIE_qZ|ybjV7$j3s_IЄoQOv%CVgRt!;hڵ$/RQ_kq.Y*a7,ŀF]Υ$,;lVj֣+-Wԗ|:auzrJ:OwiEu4t!5c+IwfحZ٨aݫ\}VNs+\%Vi$̟f3:֡n74n(t@P$Ǔ1|,X}\\ZM7ğwծ>NTZ;ԀY:s5'V4A3S٤啬&噣=trtfVsqO$o^kfu-hi'jyJv'xNڴwn+PZٝHç3Q}|cN;v9D&垛+ի@P$Ǔ12`oSrk& ,O^X=HIZH]3ڵ: 3F9fOFI*ek fk|iEu ;tä;ĢfN_fzJ;ū}'7Vfa֬Ol:K:frņZ;Nf$SתծTY|zϊ[k^X3$Ivl:s5'fOYnZ,MRcN;:s5&ZSˠ(Xcɘ˨0T;⦛ҷGSҌ-σg5'>u:ճ:LOaә9+XM3[J+dII>wMGS;үI]vgxsbzf-8íX9zӎ`pw9]BĐL]V2K9jVgR=eFj;WqLΆ啬&噭ݧI=w-Fj\OehLJÊ7,kޝ1PO;Vfڴw„BEHXfn͊I>{aә='CT=֌ j0R($$Dfw,'I8gH׬ &ծTW^'Ū\TU |pMMx՘hܲwu&%V|aN|foN'XM3\TZ;L$$)AJũHʹS3rx7CrJ`;lROQvؕgdW*ftFwLV0D* P"W#*Lη]jxTQӎ`nR6t,I1e 0wek+T.ڵ: =Nf$ 0T 9%j{z =vWftٓg4Wkfu-'CeIW@vl:s5&7$j}zة>):sjśwFI*խԷ$Y`fejz2Lao[t7&ܝq*\V9VfqO]oњ;dnIL|ؤ0h|'zbwB=ڵ׮խNf$ 0Twؤ0|)̫|7 -I)*T@E$F7ܳ5.Iԫ|eI8uENf$qˠ(Xcɘ˾`(TVz쯸aj^aj@,9wCkaә>T䕩vs7;P eﳿ8i*jR2խԴ h|7s7,a7,oӤ 5.w'ܒ͊IFvNeGzo|Yt9I=C{2KRQ_vuXtj2M &FŞt%xh|+eqjr*j䮥=@%ʓgIKRW+TRQ_ 8Fd1jSˠ(Xcɘ˾`ֻ_+T䮥>6K] 0tԦwfwV$){ڵ: =Nf$啬&噭wtrtfS7yI=Cxh|+eqjSRUrWRIs+ŪZ{vF(FI*bt)*O.bH &c.Y+Z =vW.*v}ݤ䮥bʘ]&wگj@,9Vfv$ܶ];dnILY$ 07Ū\TUrWRQ)Is+ŪZ7i`8xw9E7Jyt @Ly3wYZ|+eqj4tԧʀK/'[3Faә>uU7\VOaә1ek fk|$ܶ]s>FŞlROP00;uŪ\TzT䮥=@%ʓgIKRVw2KRQ_ 8 ]ˠ(Xcɘ0wF|*}XHHyPvgYjR[gQTƜvw2tSˠ(Xcɘά`873;a֮]BĐL^uf*$S݄'YjW^(TVgRg$s=Gܙ{F啮ft}7IZJ;VgR;qEk3;K-[3ObQJ02;u)sn[ ^GtY%CN;zD'ܳ51ø;njnXӍ_eG|,'nYmE*|,ohgR+WϋzΥܝ RσoMuޔan|;VG:,Ju-'B ^V3Oa3Oa֮'z2f⢛ZٝHԧڵ4ٓgkIJ|s|`4ܱ Si:`7]ə'(SO t;z,j@,-(>գ3Oej]ə'(Shӎ0fKUnn}ə'WIWI]I3A='C|qծ,ijTxqQ̭xM3B#7 vAz\ͫ@P$Ǔ12`Βtm\ &[FIYnծNZK3; 8NL?(DH`RV]%t?k'[ 1NuUC)%Sv!3P9n(ULT8Cw6)'ON,*ӍOoaeVOoHaq^P eo4s| iWI i)RWfln@%ʓӦ* 7AG ؤ>t$'ui+n8NL? PX ($"BPu0r '$SFL hCYl̫sTA:L㚓6p_`1D #%wI&W[ӎ9F`0A2@Z `BޡYK L4灃ɒ aD5 aјwMCƇC!8 cxyÕrK8$ $(MEԆPW$]9v꺦(8<;z*%2Bb"D3gfةlJ,T6wbW:O 8.wbWO Ç ;ͱSޛO ;ͱS2\U98T`m^|sʑrIT @£lTz7;48T`m^ [rD+:E%]4 pQٶ*ux1^*FoxT 8T`m^ gQR5m|`¡ÅF fة/O *0p\6Ns6BޓO 8.wbWYbm<**0p\2,ML,1Ãas:=wHO ;ͱSܚ&eXO AÅF |3(xUɮ"fQe; fة68.wMecٶ*u|>UgRiP 8ps:lfQex8T`e2,Mf&eXðm^WG8.wbWZYfG8.wbW EA ;ͱS(|` p£lTbH^iPp 8ps:L <*8.wbWKeiPp8T`m_4ZxT*0p\6N]DTs֤Z&_ 8*0p\6NrD&ٹ8*0p\6NMNxT*0p\6Naә4BnY"ZNm<*G8.wbWd*=kM@`ÅF fةdxT*0p\6N3:F޽4 *0p\6NZ) śE:YxT8.wbW,:s5&O pQٶ*uz,:s5&O @£lTXtj2MmV(£lTXtj2M,®O pQٶ*uz,:s5&mZxTG8.wbW,:s5&uh6 ;ͱS|aә4SzT 8x£lTWtxT*0p\6Ns)IgNu6aÅF fة>,:iP8T`m^Ğm3j8.wbWΒtmVÅF fةJ I\xT ;ͱSܚru'M<*aÅF 2(4DI na  Vw x'-#|#}Z&{Vz =Nf$'c a@qͱStj2MH$ A#Qٶ*u{FI*0p\(4DI na  `W:ٶ*ux1m%]4`()h/O @h£lTc;Z&aә4RU3M<*8.q&$"Qh^s0P+^AOAc}VäfqkZֵkZֵkZֵkZֵaIgJA=}<u'YjkZֵkZֵkZֵkZֵٶ*ux1i"hgٶ*uxEwbW(XeZ3<*D%K(XeZxUBĐ*;(D"&bV1ۘx@;I4$T!1I ;|QokqE',3 F_;@c30P+|F1GSqkZֵkZ֝!Y|fkZֵkZִ/Yը9p99&$"QKg&$"Q"%ph7+% PCw/Cp-D&1< $yB*T$E;2ٝK7<4BEH*30`ڵi Ch "/,ΥGL03<X!B  D\44ڵ39|'6<ĄJ"TlĄJ"$TD c`DD bxK|+X C0(wg!π3'@DJ-@DDv0xMYVJb< wbW&ey2BdDA2@Z `B,Υ=7=g -Ga  \sp\`.@w˗ &e0 aˈM%B  Vw|/2 W,=QQI;0O(A4 " NQyL| aˈM%B  Vwmb4Sw`+df8Y^fpd(R%(QxnzZ8$Ybb< wbW&ey2BdDA2@Z `B2ř%LΥ=7=g -Ga  \sp\`.@w˗ &e0 aˈM%B  Vw|/2 W,=QQI;0O(A4 " NQkZֵkZֵkZֵkZwg-OK fjgZֵkZֵkZֵkZֵ;HHc Bǽ1" y"dB(@DP(zԚ+D1#A8yA0ѸiҀTDT@Pdb(D$T%  *ftz0B"ȄHZ) śE:Yb*T@E$BǮ,:s5&TDT@#H]ENf$q0H"ʕ(D1`XXtj2MmQ (b&HL*DaK"4喉9O(@C>I (a!BhKNkZֵkZֵkZֵkZֵkZ֝!ԳٝKRQ_krDֳgZֵkZֵkZֵkZֵkZֵkNbOf0h`isɒ"&ʑ Dhx<$X2Y,M0x2YΤ3 LHD% "w`bDʎIdWtf4ç3Ig:I$^ cTe ɄAar6ф#`y/F(c<;TehLfs3grsay LHD%H LHD"EDJ(!7,fI=Gz010rDI,P*2܍qg!π3'@DJ-@DDl`垞r0*|`+L;&(3I !2(DdI y7$w`f|ܡBB` M8O "T$@p ٝIř%M>Te;G0%B@p g-DH%Jᡠըğ a$&DM"A0P s3>3`r/<<-1 gRFal̩TejZ3 LHD% "wbW@m<0s3>3`r/<<-1 gRal̩TejZ(a!Bhğ  .y2BdD0yR$ ֛3a=jnPxa D4N;>&HL*Dag!|-6gRF_;y2x[3*cΥٙSr6a0@ĄJ"XHP'ٶ*uyB"H"399i: w*2܍ɓٙSfu,fʘF_; D4CNbOc7ϕ|IѵuX'ʗS[3լaB"$(ž0;uiW(>qSϘY:u64V.0gR@39|'6<ĄJ"TlĄJ"$TDc,f!0S+X (a0Ax@;I4$T!1I KNYTٝIř%Gg/!M Vw̒& [BL| gRFqfIV g:32JCsdf VwmqfIV`?j&ɒ"&ȧ6<ĄJ"TlĄJ"$TD H"P1 <>Te'ùǵk}'""Hb:| c8=eFQX C1ʌw#c0(wi"HL  YBb"y<qkZֵkZֵkZֵkZֵkZֵkZֵ;C$Nf$N6)'L;_j 5dkZֵkZֵkZֵkZֵkZֵkZֵ;aKkr 4<,ϒ[[ PJCpP+;,I2[qAJZ $V@P$ʎ* P#fةM]-L| @)b3%6"003 LHD ᡸ(6" [F؊H1x1A&$"Qhb2 қI-JlE$0)b0RAsda ybB%*DybB%*"W(!Ix y4Vq:< $yB(QyZֵkZֵkZֵkZֵkZֵkZֵkZֵkNĢ7ڵ:8G|f)'XT4+kZֵkZֵkZֵkZֵkZֵkZֵkZ֝fة`4$b$JwbW "ӿԌ4yA1Dw<*D%Kq;|4yA1Dv(D"a *T,&>N!,0q @ ( [Fta 0: ;e<\rT `n`?jL|' Xh/0`ڵH]-7$YRrfKNY!tܒQfH^jZt0w;e/n .\Bl9*0`70`ڵަ\z2mna @e-5emɚw-:;hAhh| ;Gzrt2`&ÒsP;eʗ+Dᵸ Xh/0`ڵLŴg%emɚw-:;KD [FrZ&_CQ˗ϚJlX!,0q @ 撨1m/zOJlC._=wQZEh|' J  @uAhh|%W'z "&2LaejFCpXaraP(ݛAh{Z&4nasF≧J!,0q @ ӳH1mi3N-OMN\{FIrMՊs aˈM%B  `VMt4JBi:s5&M=7[WV)ad*=kO7.!601[ Ŵfҷ >vtj2MԦ0|aә9&Òs0P+]4њFIaʙ#o^CpXaraP(ɔ|>TLΑC._=h/mg aˈM%B  `V,h1m|6R6t;|Xtj2M\rT `n` k [Fk3M=w9Eha"ç3QhP3j&Òs0P+]'PAhwjO]ENf$Zfwrd.Y]<\rT `n` kaWM-5,®id.Y]1/FIV<\rT `n` kZ)ŴfV|aә4cjԦ0pQ9FT:4RUҞn .\Bl9*0`70c(ŠŴf)6d2)I\z,:s5&oQJBCpXaraP(^1m&id)E*U wr&Òs0P+e-6Wt{+b._=̦E%9CpXaraP($otSie7),Φ0L4Xu J  @b3j3Mj;|$#hW7.!601[Ahڡ==wH.fwr#hW7.!601\܃ћA>t`m3j;|%x!,0q @ ؔ@-6%m=Di+ÿަ\ {]|N0`ڵt=ɮ>w'[uaw&ћ]mɚa ( ܚ [FnMw9ix<;Gw˗ϜYUa3P;>&HL*DaNL"K ş6Pbϛ&PbV+ YVY,HşAFbY!t։Lş4A=uA> Y٤ { Ş(i,2ztŞ Y Y1gY]4|jSA=w 1h1g^1g{A>ba1g1g(* YMw/=Ԇa D4N^)IGg@E3>cȤ3#(1g4܃{܃x1gtbԤͪyA=Pbϒ1g͔ɔՊ|եA=R(1gQH],e,-(1g%Pb]Ebϻ6zvi,kވ1g A>LŞ,h1g4z4z: YaWM,-Zb]BZ Y YŞbϴr Yr YJ {]AGӣؓx0<\dȉ`0H &*! TQxQHE%IVgR>FPbzh1g, ,ubr Ş/H1gH1gU,(1g{ş%bϛ(1g͓(1g,K,{PbϠ1g YD YZ&PbϚJŞ şvm, YA=b]4|A=:Yb]Ai,i,u|® YZ)Ş|/QDA= şh1gؔ@,&C0@ĄJ"XHP' TQxQHEbK"Τ|Şbr Yr YŞA<^bRbs6 YPba,A>K ş6Pbϛ&PbV+ YVY,HşAFbY!t։Lş4A=uA> Y٤ { Ş(i,2ztŞ Y Y1gY]4|jSA=w 1h1g^1g{A>ba1g1g(* YMw,f{3M<G'CKL4 T%CD4E%YK(@C>I (a!Bhw3nP%BD*W @CͅgO<1!"[<1!+nBs֤Sz <+XٝHfM<H(CyZֵkZֵkZֵkZֵkZֵkZֵkZֵkZ֝!S67(گ*NOjwIr'[KZֵkZֵkZֵkZֵkZֵkZֵkZֵkZӿަ$(A"+Vw2ĄJ"(Tr2 Dyb VwmR 'XT7v喤÷'z"ĉ˙ T&*3 Q >t4\̅F t$gR2F0pZo 8',h`3;cOfu,`H1&$"QB"3Z&Q[2+0$3x404f0dȉ0U(g >*cA2@Z `BޡYH04a ^ l^3+bbb&Z # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_modify_volume_group   =einorst "$R_acdflmpu-ACEILMNOST[\]ghvy#&()./1:;GPUbk|%*,02>DFVw!34@BHqx{}'67: 83eCF    ( F.7+X7 |i &ELy0re'IPA$D XhxNXۥZnpeIU`jqRv` 868``(Թ0Pi@8ڊp "@ L 8lg.u3am3Qms|𜋕);bXN0j3D|qA0 ,AIQ nN}Y%6ܱЋA0a'79i\'-l<'+@J-+gki8ѹJZʹÕRnG<'YUIgkbq"q eYRslXE5ɳFSt! A\Li!, +py#ɍ$<xO6xq׀py#ɍ$<xO"fcjN*Vz?76[9Uby079f56\b "g/)4dzmF ړ.pof 9wZẋ-(&XBcHqs?vat-r 6n_M0[z&W.yS|W3vf^eItH|hnI&昰VeCm)'kv-Hޣ @#k~`r(Li9yN.y'}#zΐÍ3 lj0mfMjrW57ks7onT`gHXwk~A-&A2 D^Sh 7{.aApYmgHZ\y au˔,@1L8挟ܧ.fԟ3w y[Ճ\gks3w9U'ks:ՂL@ q8G@0i7QY⓼A2 D\Vby=g*[nao56#pm[Vn8mEqn.7)n7\b "g.+1j<Rw,"nn;=L nm 7zΐ?Aټ`Zv\r 6 <v&i98\b "g.\LV.fbsf`" bgr <<QRw(&XBcHqs?rNMxG|' 7* q;QZΐO?jS0CQXbB ف<<<7e@56R3\b "g.\Lt hg lj0mgZp{A\ͺ\ssnzUIܹ2;dV}gdTciHt-xGAټ`@9m/@nm˜0GX 7A <<%(&XBcH˹W'‚Z07k֮\W3n+[Rw.f?fe@5̶_bg lܵf9fQm]F؜0`Ppݖf(Li9yN.y'tcB r\rͨr>/ ss77r|Yې+BMq@47o8Y- kwbg l7y07keO?ڇ/eь#1.ޠ#ˉX4w 9UAٳzڌ1~fbg lܷ?Aټ`[-{rF0 ăO&ڸqra*A*wVu˙')nUI<{.aUO#zFʨr 6L3wf`v]!tܪe P&rⰃ̟A9U'rܿ3njjr1 yqIZIKn6;rR** y]F؜Au 7]G0m5A2 D\Vbyֻrnp栵BRྡྷܥr 6 <9l7rԍfb`: ׷`SQ4 فˉ(nM˝M-(&XBcHqs?k.f]RfQsPUsړ.aV"ng.'9z~s`JE5A2 D^ShhjjGAټ`\䬝q;|ܮ'/t&>AooV'ZA2 D\VbyPU3wStf9fQmubynK@ݨ~‰<!0vafW&?QH˜3jVU[m Lվ0mIpUVX!ɫU˺rqVr Spam+zm1FR[.G@(3z;VvaڳPfOCS6oZީh\}(&W.[M-npRjye&ҭ? ǽn eYRslyf?$HIcGM,Φr 6ͦj0m?7D DBAaah"8d *! aNVLi5UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUG#H Ly29;:scܾ0&TPpJ၂gZN2Nmju(FXjuQDSu LLPcKJ"(8zU \HHCZ=Fn9jrεrG ("Ƒ %YQH!jsȐ&> ZM3#X`@&jOzlҊEƜʪ h\h"D1bȏ8e $@8@K*8iQC3\x0(dGR Q#uTp#@#":*8iQ|}#IuX.8^ޘPɑfD":O*8iQR?wεr&,HLYcyZp@0js;eN6&r@` ?'+s #z?s@Zdۛtrۓk.)b ?|` LqQ24$RD fLAZcH&H$ʒ ZZg8AɎDr`L"?& l.yG <"5jwZW{=ş ՙ5UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUG|}am3Qm`5`$Ҋ؁!"<F"@e0D4q!4$ş9f56ւ' lf@դ92*W ‚H92e &((L<𚪪?C(ÖRw73j//z' lf̙niKDqBI&TymI $"EpX/@ǤD57͇0ܧ`qZaaРaVHrd*@d j.|4x LzQl᧨ H~-r֬R&4ɜ(+HHC9!"cIL;|R s88B˗J+bLcj ZqwQe!isˣGj`ktN9os7q=F%q[tɫU˺?IFo‚` Qe&DyfFDI[DqBI&H\@ǤD gHZXF|\mxG0 <20-&0hP0H92I!&@cq||c_au̙nN9F9sjgZfʍs7{sf&D`cn83\x9jaZENgZRW3Zl+LHgVQ1*8iQ u(Hb"'C525$L#I2EDE0峊0jra@020Bc}S֭ < ?25$L#I2ED>AFqF`= @@ URc$œ LLP"'ܔTy5UUUUUUUUUUUUUUUUUUUUUUUUUUUGcg;eqFFڌ9k[Y+RsZkՃ\gݳ3w>pֳQ+rֵO ?bف̙nεr:BҤQeclεrZE!Ɋ$13ׄu!mt h\ΐUB˗J+bLfLAZ|u!ijV5jwZE7ɫU˹]ZnO :ΐ4 ?'5sn<ͩ=Z[ժkVts&Dy\h",/'- Y$HLjtMMVtEZ,@@zEyŻ?VVN*1TbVN<ϙRjk 7{UF7k?hς PvuX$ƉL@p'2dGy$HLjtMMVtDAHL8zpeH8gZDYY8դ92*W nURc$œ LLP겲qV?w]|,/EVVN*5iLʕyi&Ld ''MoY׃oXXڂun!lfʂɸ,_ͺ[ൟ\h"@x&&(Y _ +@OQlibaE "(?  "(?qL@ɐɑf&dG$$eGDI*$W0$Q! l mѹjmBNX+sf9nLx&&(Y _ +@OQlibaEH//~@iAPV@iA Xt^b\02#ݼ25$L#I2EDE0峊0jra@020iŒCA"@֓L2Z#I2h"HI$+rn!##04(8zHaРaVHrd (CL11Bփj Sv#79q8oV'Z M~mFMUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUmSt`HYys&Dfn֦ˌ!dG&4&kGFsk+O`j.|Ax ?^֦ˌ*&,局}\`bg.9'ݼ25$L#I2ED@ D Kbu,i4= Un)LYa YsӍBZE!ɒ TbI&Lp ?w?$ s3wco3_T ,ԟ3wsYII:I!&X  eW+p& ,6F"@e3W109I k᥆蜃 ih//~@4ɑf>xK C0Dۘ s:p90 \h ?D]$ &PZ%G(LT0C"91H1ӆf֊q3xj61لBBCQDI$&DR!dG&47q:p0lZ=Fo0mc@0@m! G$40G$a0h5I $bBdJ ʀjm"2G$ $Ҋ؁!y_._E9.qL@ɐɑfE9-?cHy2ɖBc Li1f8Q$,`&> !"'x,cHy2ɖBc""EO]qT[^amm,ܪt-xG05,.8ڰf* xr#zSj<Ӟku ?VQZG $e,5h4(3&Dy#&&([sC@10, 8iƤXb Qe@56R3`LA"L P!@YP M,œ$A$$BJ(r\r`(be LCYi7Ȅ &&xM!AJ-F׸N6ڋ<`H,/'4d"rr!E5`$Ҋ؁!".G3w \TCA$%G "4 "= < ?*)L1Hxɐ&&(X}?&:1v7eOV^g9x0.y-r?CwV|hڏm6TVw!rMx\ڏc06TVw!rMxcwr 6 ?&rr,fHYriEl@ɐɑf||ci7͇P` 0XLa= ɑfkIdk-I $QG$$d`aHB|#Q-mH27ֹڳ?0 <20a@020`ixAF"sab;[dV Vz+ܸ=ah"IFm @ZM3aƌ0d8CC LqD8d ?w8%zpy &dG$$eGDI*$W|I"h#$3jK5[nfe@5̶Σ @#kl[L@02 0oQC,< ?*)L1Hxɐ&&(X<7.wfn fԖ+vMZ]ְ+Tݪ-ړ>Jrf#wkjr0ƩT[rZ>G^73`UoN󆪓Tޣs-1}0na_ ss7HYriEl@ɐ(+n7.u6nfdȏ3va525$L#I2ED CEn5jwZJLrbr 4թp tadFFaAn\ld4"Pp)( i&Ld ]ǟܹݛ-=jrXnUF3˗|&Φj!eˈI&C3&p._UTcV.QBx`'2d3\xb,dV˗bU&Dy $mHɜ5,b˜j60"h ih`03 TY5`Ȭ(z !PG$$e (%8* jTznM3q|,/F*ZC&Ibxz!ɕ8yR`f/~tܪfL7o?' n`3wf7n70Y˹U&>\#jrv`rM|6).Sv#mGs]7*AU-GNqpsSmlT' oR7?'b[yʋ^6bAQ`ܾ\tܪuXt^aɑfܿ3w5ZFXʑ%Mʨ갛NFԍR+)mc f06rX^^#ݼH92*WqFXʑ%Hb?ؕՃn18j[ѤܠU`Z?"-kMʨ3MZ]ֶpjjܾj5snam3Qm`XĄrqV|m`D PDLaE LI"h3va525 5d UI8Ey sg lj0majKV3tQ 06+coh7- "-%Mʨ+Qe8jj 049f56ZE!ɐ&8IY2 lJ 6_3wrq7AfOr fM\fqFDmL`X4q!8ܠU_~7t&8Q$,@BCHp 8iAkC(wsB!XĄrqVÚQen&fFF<#! sg lj0m 0? [F sRX 8iuŬ ' lfCA$= < ?*)LzIHbVN' Zy[snXnSz_8zSڋ=,hBjܧqͨYMWHMV' &d ՓPT5U'@aeޫ wX=wn*M~mIbo6Z 0@afԖ+vE|Ճq)7=. KTڏ5}7Ec KaN $@H07F 49f56ZE!ɕ8yRqY:tܪa%ɫU˺Ԗ37n1̓k[RZtܪ $mHɜ5,b˜j60"h ih/而7o?*)Lʕk;$@HlJ 7ݕ"-kjKV.Qfsf'Or fV.w4(w։06,@p)CƎ$'3vH&zXĄaN!Q1t C*Q 87)O?VZM3#X`#VMAPT#! aNMIͩ,Vy[#- x LzQmk8[8i3|nS?}am3Qm`5h4ɜ(+VݟVtfq}!nE[2dGy1Qccj Z ETYmgHZZiIU:gCO ʛl-ֵ!ik:[ 7[q7 Kr#zFXґL H4/6:A,00Gy2ғp@ڋ<`U-)7 `HZHbDۘ2{hC ik0 <20itwLKSZrNt*oUGonV8v޷3wڑ6k:BۥmE)_7qAah",' lf@`wb6H< %7o?$J穜Q-׸սZΐT~+|\l"?'Sq{5,gHXwkεrrr+:BV A9"< b6sjN6ޭ׌\e&3w? EgHY _ +@OQmgH[-g#H Ly29)54YCAֆ@z -&--!1U  DqBI&XGփ݄AygHZ\5Z<4gHZZx D1 D i*&Prc"<="*Hj[Vڶp1Y5s ~fF6൘CDmL`Z+:B`j#I2ĄȔ s7ze*&Prc"<="*Hj[Vڶp1Y5t?EZ`F6ൡ?NAٴF ?!c"j.|a8ͫg iъ`j#I2ĄȔr05YQq6 ъ ZC*(8pp(+,}?$ qT[^ie'r ;s7G]G0oQY?$/^HrbI2 OъVʊ<\03 r讣n6~./~7.u6nfd7o?gZ\ԭaj+7A8PVG-k;Xr niv٣W)5UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTbU92D LI2 b1Wc$œ LLPf}I $.!&V ̙?f#H Ly2&fFDI[DqBI&H\<hF=xE&?PV PaAV/St-G Ɗ Dr2j8 <20n6Zbw7VN7*vSI:1vT~҆Y^+vϔaX -yƊ Dr2j8g !9C\T~ \Hm5 ##n3w4‡mnv4= (06"(H~$AA14DIPHC@qI^25UCAXXb Ly2q~<q[$)0,hBiAٴF UUUUUUUUUUUUUUUUUUUUUUU7za\@X2;vß}xE[sj=e"3ngN9L <& BFܼ.Zf5*FsPT𚪪 k^_3++bbb&+ # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_move_persistent_ip#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_move_persistent_ip.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)57 1.3 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_move_persistent_ip.sh, hacmp.assist, 61haes_r714 6/10/12 15:48:34 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_move_persistent_ip =head1 VERSION Version Number: 1.3 Last Extracted: 1/31/14 04:41:25 Last Changed: 6/10/12 15:48:34 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_move_persistent_ip.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr move persistent_ip \ INTERFACE= NOTE: the alias for "persistent_ip" is "pe". =head1 DESCRIPTION Attempts to move the specified persistent address from its current interface to the specified new interface. =head1 ARGUMENTS 1. service_ip [REQUIRED] [string] The name of the service IP to be moved. 2. new_interface [REQUIRED] [string] The name of an interface to move the service IP to. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_move_persistent_ip { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_move_persistent_ip.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset persistent_ip=${1//\"/} typeset new_interface=${2//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset -A properties #========================================================================== : Verify that each specified object exists before attempting the operation #========================================================================== if [[ $persistent_ip != *([[:space:]]) ]]; then CL=$LINENO KLIB_HACMP_is_known_persistent_ip "$persistent_ip" >/dev/null 2>&1 if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$persistent_ip" 1>&2 rc=$RC_NOT_FOUND fi fi #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= elif [[ $persistent_ip == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif (( $rc == RC_NOT_FOUND )); then # The specified object was unrecognized /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 152 "Available Persistent Node IPs:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_persistent_ip available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" elif [[ $new_interface == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 101 "\nERROR: this operation requires the \"%1\$s\" attribute.\n\n" INTERFACE 1>&2 rc=$RC_MISSING_INPUT fi #=============================================================== : Move the persistent IP if no input errors have been detected #=============================================================== if (( $rc == RC_UNKNOWN )); then CL=$LINENO KLIB_HACMP_get_persistent_ip_attributes "$persistent_ip" properties #============================================================ : This operation requires an IP address or label... not an : interface name, such as "en3". In testing this has proven : very confusing for new users. So an attempt is made here : to automatically convery any "en#" specifications to a : suitable IP address. #============================================================ if [[ $new_interface == en+([[:digit:]]) ]]; then /usr/sbin/lsattr -El $new_interface 1>/dev/null 2>>$CLMGR_TMPLOG if (( $? == RC_SUCCESS )); then typeset -A IFs CL=$LINENO get_interfaces IFs "${properties[NODE]}" "$new_interface" if (( ${#IFs[*]} > 0 )); then if [[ ${IFs[$new_interface]} != *([[:space:]]) ]]; then new_interface=${IFs[$new_interface]} new_interface=${new_interface%%+([[:space:]])*} else /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 611 "\nERROR: no usable IP addresses were found on interface \"%1\$s\".\n\n" "$new_interface" 1>&2 rc=$RC_INCORRECT_INPUT fi fi fi fi if (( $rc == RC_UNKNOWN )); then print "$0()[$LINENO]($SECONDS): $HAUTILS/clswapaddress \"${properties[NETWORK]}\" \"$persistent_ip\" \"$new_interface\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clswapaddress "${properties[NETWORK]}" \ "$persistent_ip" \ "$new_interface" rc=$? print "clswapaddress RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 128 "\nERROR: failed to move \"%1\$s\" to \"%2\$s\".\n\n" "$persistent_ip" "$new_interface" 1>&2 rc=$RC_ERROR fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "move persistent_ip -h" "PERSISTENT IP/LABEL:" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_move_persistent_ip()" *([[ lꆲ`3+Qbbb&0 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_move_resourcegroup  =einorst "$acdlp#-:CEGILNORST_fghmuv()./1ADMP[\]by,02;>BHUw{%&'*+34KVkx|}!5679Ǧe6s:m @emmmmmmmmmhT&Hd -@r5i\%#ǐ._ 9-CX.vL0dCɁ "_0$Q *XvtkEh@m8z"̔*` *( !(bmmmmmmmmCv<f=Y4ʺeGmWر 2'z;!mmmmmmmmCy:2E+=$*XPV2\"S4?se?.c$`DEטLq_?kƷJ ⢠'%'R&Hp8 yx#&&`ɔXfPdg#!rF(T@zN /B pOELA‚L(LBXX7jFXhԾ[VC`p^TaJΓ͡X5MrFb&J!n\%![Fp .H% /ہBE(T@bGmW?:O6iMQ}ruf |?Ղ`o !H2\!H2"\|8 (,PB#z{/‰Cd4|9;\80Q(;]`Rsoq?'e yy<(tRytRkPCVaLO&YEANKP]ltRLB $\ X?8bƝƳoE'GQdQpp9!H2`DHR>3X$5oQN`@ B`ؼXd6COlHYiTGX8t[@goPyhTl:v[e]biUYUv0G4ԝg6ƛ d64Ӟu8 WZNc*3Hi:AZmWQ6ӟd]x贿q$3cM3Ċqsf]g> 16na99N2R,s@bED39Se]4N,st#^^S(2HPdd5LD @gAF81TrpH$ ܨ0NpH$ @gWsa9?CcM9Sݐq83Mqa}Ej ]L9N2- L^^XfNƚsΧ9e $]Xz?ӟ!y8f8|$6ƦU@goΦtƚsΧ9A)?/ln}I8kxNN7?>á,3'OB&t^S~x_ƸV9<ȹI-1+MbbӰ\T1mmmmmmmmmj2nQ5=71eb6)@i+#dqLXhI @fA@emmmmmmmmmڀ☴" D$br+b-mmmmmmmmm kib3+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_move_service_ipup#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_move_service_ip.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)19 1.3 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_move_service_ip.sh, hacmp.assist, 61haes_r714 6/10/12 15:48:36 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2ht-ml function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_move_service_ip =head1 VERSION Version Number: 1.3 Last Extracted: 1/31/14 04:41:28 Last Changed: 6/10/12 15:48:36 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_move_service_ip.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr move service_ip \ INTERFACE= NOTE: the alias for "service_ip" is "se". =head1 DESCRIPTION Attempts to move the specified service address from its current interface to the specified new interface. =head1 ARGUMENTS 1. service_ip [REQUIRED] [string] The name of the service IP to be moved. 2. new_interface [REQUIRED] [string] The name of an interface to move the service IP to. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_move_service_ip { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_move_service_ip.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset service_ip=${1//\"/} typeset new_interface=${2//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -A properties typeset -i rc=$RC_UNKNOWN typeset -i i=0 #========================================================================== : Verify that each specified object exists before attempting the operation #========================================================================== if [[ $service_ip != *([[:space:]]) ]]; then CL=$LINENO KLIB_HACMP_is_known_service_ip "$service_ip" >/dev/null 2>&1 if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$service_ip" 1>&2 rc=$RC_NOT_FOUND fi fi #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= elif [[ $service_ip == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif (( $rc == RC_NOT_FOUND )); then # The specified object was unrecognized /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 156 "Available Service IPs:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_service_ip available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" elif [[ $new_interface == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 101 "\nERROR: this operation requires the \"%1\$s\" attribute.\n\n" INTERFACE 1>&2 rc=$RC_MISSING_INPUT else CL=$LINENO KLIB_HACMP_get_service_ip_attributes "$service_ip" properties if (( $? != RC_SUCCESS || ${#properties[*]} == 0 )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$service_ip" 1>&2 rc=$RC_NOT_FOUND fi fi #============================================================ : Move the service IP if no input errors have been detected #============================================================ if (( $rc == RC_UNKNOWN )); then #============================================================ : This operation requires an IP address or label... not an : interface name, such as "en3". In testing this has proven : very confusing for new users. So an attempt is made here : to automatically convery any "en#" specifications to a : suitable IP address. #============================================================ if [[ $new_interface == en+([[:digit:]]) ]]; then print "$0()[$LINENO]($SECONDS): /usr/sbin/lsattr -El $new_interface" >>$CLMGR_TMPLOG # Always log commands /usr/sbin/lsattr -El $new_interface 1>/dev/null 2>>$CLMGR_TMPLOG cmd_rc=$? print "lsattr RC: $cmd_rc" >>$CLMGR_TMPLOG # Always log command result if (( $cmd_rc == RC_SUCCESS )); then typeset -A IFs CL=$LINENO get_interfaces IFs "${properties[NODE]}" "$new_interface" if (( ${#IFs[*]} > 0 )); then if [[ ${IFs[$new_interface]} != *([[:space:]]) ]]; then new_interface=${IFs[$new_interface]} new_interface=${new_interface%%+([[:space:]])*} else /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 611 "\nERROR: no usable IP addresses were found on interface \"%1\$s\".\n\n" "$new_interface" 1>&2 rc=$RC_INCORRECT_INPUT fi fi fi fi if (( $rc == RC_UNKNOWN )); then print "$0()[$LINENO]($SECONDS): $HAUTILS/clswapaddress \"${properties[NETWORK]}\" \"$service_ip\" \"$new_interface\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clswapaddress "${properties[NETWORK]}" \ "$service_ip" \ "$new_interface" rc=$? print "clswapaddress RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 128 "\nERROR: failed to move \"%1\$s\" to \"%2\$s\".\n\n" "$service_ip" "$new_interface" 1>&2 rc=$RC_ERROR fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "modify service_ip -h" "SERVICE IP/LABEL:" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_move_service_ip()" {#avail lxd3+eWbbb&J4 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_offline_clusterup   =e ainorst$C_cdfhlmu"#AEILMNORSTgp(),-./01:DGPU[\]bvwy&2;>H|'*3459BFKWkx{}%+67qj3Ɲ52@aLDf 0e,$( %~a|#(ېj $V6$  yA4 j*)C$VA`+  Q60+,@ 1lg'RHsRI"XP\0Jj\ᇂùZ0zR fT"ԽӄqȪqXURԃ&.HL"X j\ԽW:PxVץ. Rરs3j3t,iS F 5=+ygAi߅sKU϶B&/Z7.j_77.pMKw誼qgYir RܠQc p#e=)4ճ|z.yj_%PTښv-J ,&db |]TAwς|ܵU5/( ?4`1i7p˞iٸFnymr2x°)W誱3r6r [_FCJ KEѾvliaL66yX<ǚ5//>pтչ1וJ-#v\2WV5{ִTk%n6r猵Ul.]9Vǁf>\#W<3Է誼qqr7-Sv4Kz{M^j^՟7-p^{+H12Zm]YrXx,; 39NEK $Xb !ׅB='":p#vscJ\ԸO;M]5F+z[yN ^>p!1-ș.UÄ7ø5q+;HKnٺlݶ2 F1vKI0 }Ū:Q^167h7Z\nP^(ޔ.[>Ja\#K|'^zLPZ ]Ѵ<ƛ-gJNy`H(-zW;Fv^xe1gMfm`)wFҳvBtmnrn[bmr8k6hzMYQ ӆm [7AemUQM0*BVnZ񖪽`^SEy^2!i+6s[ٺ cFn= ]4 j*)pIOΊ=V\ Kpg5-7>lE.zK,]鹀UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUULVbq2@bB h"Ń?# ʎsR`h 5ތQ-!icz*j,1<֊wW#rjUW|n5-W!%{z*Z '{f?=Q7 \[緔oF ,פO \?ڬm U^ a\ԷRN6jClSVץrs^/2R4XW5-N`z[R^ӄy{Qo|0sRܗVrs^/2S,jssQ`YKmו-=7^-Vk 0rL5!Ǖeܶ(c#)> aLQ-(>RrQь#Ǖeܶ?y.7)&`'4s3,rΛf?14.j6{\n8G8cl ^j6[Qo<W#r `AHCUcQNQo<W#r`*^8h@?tUTosoJӄu|K5ݢ܈W`6nnڮ>AXEfVRт[Ҵ;ҴIѴf޳^k5-9M`ͯ9j^9+!#z3tb6^fל?*_7y^rkjc qt)j6z4vC q#-+;H3-5.#Nm~fqsgl]U^Kx wp㋑2(\V>j^9+!#z3tb6RMIKx%xU^yi:*j!UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUULMw7AL8Ђiq&-7zhA4sU^S2qd V#xヂGc<c7:<'*@J @1 BBJ`@jEcaq2@bB h"2J`XxH A`+lcXp,?Ld0!7rJ[H<44Xph&\8 1w+15$[),84g;5q Ύa?6ns8Aa*+y2E&XHHQ.l\_\yūc-U{>!*7n{xb+rggܮx[iPv2h ו kA5Zj'gM\BAԷy\P/4U;Joq˒kgܵyx,;ҴںZ8 FUҰjr28a[j_`ћlm%r3}UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUS?3ԴA 8GnZ*)C2v8hs׼iR σ1ꪪy:8"J#^Sn}'g|.z<HH3(9H58e`ɔ.CF0 j^LLpgEskjpZcqpg5-ٻ*DISUEdч<4X8@P"fQV ,j照פEU; JC^f0~j6o a#YQ\,"DE$3dƯ5s ӌU R5`UTl+  yOs[+ gV ,j照פEU;F`(kgԷ"(%OV ,j煀thΏ,PRG2HTd jGj> [ڵ߅U<7371OߜT j[=U[F|ԽWJ|{VsQv8cmL\C$`,"E Ùn.|qH@ *x,񶥓$T?҃?ɒ*F*Dx**!#mF?\n\OT*XDH#G"X X ѝXAB db 2ZG$T-Z{ڵ|GZW;AH'Ex5F3z*Fp /~yf(smUyN ^o-棥X`lq 0d44Y@< XB75q@r勎;q2EH,9F.zXr'@Q1C,x:(737371ꪪ!s+R\-JXRh誼qqr7&n{Ql3$(sRGKF ,ץ[=iZZp5!+A[^?1*s/.OF _gܮ{i+UҝrgtJ?8|3J ;'G$TRL85sAJД;| y2E2PLa ?|gÀxJm,8Ŏgh 湨W-KJOt,v8Mel} %jS>Ɛ|])%cl|Qi+UҘMrx+./X@FtQ(T*X+9oc?UUUUUUUUUUUUUUUUUUUUUUUUUUUUU3C$:OEɺ\2Wfi9))8a[ l.]ųt&`l#( <+V,1MM+M>nZ>O^W& iBpP+Yi iԷ7rnr3/:c?Ϟ8S*Dap \CBpLlShŦm-p)ފwW#rӄ{j*oV*іV9WLo4ᛖћM_7-zp`a>-1w+"@ 8 &NUʴaʺcx[fŦm-64`0$n.|󊁠 a,gEp2CH!`8 j[?F 0cNYÕ&l煻*8"R$ F , `H\8 X@&\ 8"J80!r͠N]墪ǕeܹNn> ^gJуҗ+FJCh4ɔ.d 1`9+5/Y]le{VmU]JZ0zRi9HM\YNFvrGJуғ?s?҃O(oW=r3t- khÕtµnzҳv?EU;76jrt).TrFmzXxw+FJ\ᛌIO7IBnZ; sRqs88 $Td*X\ O,TDHޣFo|'o7I~`іV9WLoZ#!4q @A2e1w+7$IcW<@qAxx?G T%NFvrQ |p$%pp@H"TAX N6Ul.UyNw"`Bi9HM\+FJCh4ɔ.d 3Օ\ 8"J80!r3 mkhÕtqr2! q$& ϕ!4q @A2e.s-U{ ͵-Ɲ50g=y޴#ar3/:7IBnZBX7A[Ư5sۚr3tsזjӦ3~EYXV՟7-p^xӕWyZArx@FqNFvrs sRkr3/63\ 8"J80!{U̒(De{!7-p^|=)ӏ&PHJ ,$3 #9y\P/4U; @PJF֑.YǓ($]LLt 1 Py"ia ,tK|'ݢih7 ޵^-fi9X:Tb$,ْE37-p^lg*q2EH,.q'*"`$C@cK<q <57(6&UAe8R߅#pD-Bó#e<4q @A2e~AQV`zRg"\ ,` *%C3e@ ,\4s0&XؚUUo8iK~|-kjhqsETVSDv y2E2PLa/TirՁ,^͟G*˞C"`\Qc?UUUUUUUUUUUUUUUUUUUUUUUUUUUUU3C2emim #yf!"şp5/F>Slח8c_inonRlF!KmzY*5/EU;^W̲z0^2m]%ڮ[7A\RW+!Kk]Qj9KQA;kUF™!^4U8fͅmz\l#=a[[Z&g3U=D$$K{hdB% \`Dl+]rfj\F+c?ӄpyZT וnnZ[;UBAPgy:8"Jd(&qBSl%OΔ;,"*X*.DD(T,&D$A\\K{?5i`; @\⢹қg}V8PBH 9ogjhÞ#X\&PHj^wF5ޚ74sYDԼ`[nU]6C0=;sם+g5UFTAj^w\޼XUXpoEU;gx\V;M.pVg5/ȵ*;XGmU9>7reQ@2t~UyNㅭӏ&PHJ ,%řf`j!QxX AHL8,`!gܮyR$P$#C3⢹euX qq| 120g5-*XDhg@:?VHq57$#V!Rږ206\,<%鹟 %yǐ R$s"!4 Dᨪs*+8*XD\_@a&(qǐ R$Lg T8@a&< "9鹟A # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_offline_nodeerup   =e ainorst$_cdfhlmu"#()ACEILMNORSTgp,-./1:DGPU[\]bvwy&02;>FHk|!%*+45BKWx{}'3679 X\ (,(A4 NlP,7`,c;56|L'҂+of|1 0"h3EUGi%x|hH|hH|8LF7)3Bj8(O,DtA4s""krWg'L$DѺ'"U8(O6P3FуҒ tNA,u[n+30""$h|#7 Gc2 M,Lg8Yyޕ՜ Z0zR f\aԽӄqV7tж24HAe c23vr Z.y͸. ;@a;^v">'KfVyͨ|MN7(/o9.v\l8?7+c?jX\D%4s@^Љ ր˚#˜6R ^RU^Sw״ZPoNy|nP^(܂qeȒ,#yˎ2gx|nP^(r0\? ^i9ņylD eale)mH7"d@H21h^%xe "TWg/{VZ-jO _5= ZhsOi[iug.p X[-e "TWgzNEx')oFn)KBU[Zڪ-EUҰ|1MDZPc0״fM0\Q\NSpU_95/Y}s^3#YiI5/Eɺ]TkkV c?KUrXU^誺VM5\{EZ0jHS(`nzZp.gv.6vsn\z0^2הkEUXskgPogb# NץKJhQ^;^20ѐTgByX<ǚ5//>pтU O^W(\|.Lgo7-p^xU^tUXt`qZQtgNFr\.WY?;t',[n-pU^Sp RߢǕ]ܶNNXæ5/]59{?vnyzVWV|ܵy 3ڗiug\aW+FJAlfNPE(` #ׅ*zNEtGm&2q83MQV|K#|i,ioV>DRڐnd#%0\@j_~ӧm8j4^k]nRMuYm[-Wl"EɺrFr S .[p/%ל[0wO"GEU;+mVPŭ9F R|MW>X;gZP}CSe;XGEU;+mw]nRMuU1hsOi^a68b״a'\lOt=Q%' +zp%|p;"G;MK%{ ^j6[Q$D"F=Ը  ܞ}誱;ql0]Sܑ<K`U7+ `0U ״Y[<<;Zqt+|ܫ"$y\E܍lopB! ,4;^Wd8q]*r<KkBw \;D wõ`ssÚք|mz\W~[.)o!stqi\'KUyNW 4fZ{g|Եz6B! , ڨFe״R`UU[0wR񦍘@#xmUQϝ+KNוz,/<#r!=ٺj0zN!;LMKF -oJJ 'Fњ:{g|ԶDHgalG^rW|ԼjV.Gћ`:R=Q ׌\ӗ GxMKåa,Qq'^ `xA 7'0v Ը:VN͝w wbU{.75H/3iyÚ2LؑyZ3txԬ\> 7Mw7A;E/a:p5/׋;тWUA[^眖#"UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTz3tJȒ,"MW>|gӸа=B h> XɀP?J 0l1XB8O 7y"Yd><"l j6P0CҥIB h> X\ (,(A4 NlP,7`,q#f3c'nW=JGCd)oX``E;r59tx ,ە-@ ϝrGX``E;r[G00Ph`"*X@L.!` kHb$ =Qqj7lZ.W1㪪}c{^njw.h&d;^V>wv@^(M\ Ӕ \C0D(YH0mq"j[,%#H,EK@3y䊖2cBP/(fL2 E(\{Nǜ;)xiV7 Al ^Q sդs y" hEK@Xh".*eo/Ax4 ;rkhEh .cJ$XE])%r.*em8 4]Uؘ*7 N@3J rxx vV+bgTjba:l8TT** 楽b \EZ,PDk?s?҃b \ڲ^ӗCB g+g"yRɗ1\z列" Oz{NXlMW>/zYi״瀎2IBD4k @K{?l=f/s ^ӗCB `15r#p`15rj,el4yH.H$@q#lMMgF Ix3+G(\sɌ+0D<FF Icq7.q^{E7|4ڬIhуRE?ܞ<~x$4$H3FԷLOj^> W\K1k2m&gNܮx 4n˘&r%Ѭ;>xPV4ɇhE06Բ gPgRRɎäup#S˂iK&5@9s€V6hΉ,XHBDM0]&U^ ? O{VDa+ 'O.`<Ȗ'j[$i #H(hpx 4l$(737371O?>(YH K9ogꪪ`FS Rs+R\-JXRh誼qgw+n{Q/((RGKF ,ץ[=iZZp?ù ^%r *s/.OF _ж`5.!:_%{Q|mM@Ѳ aRcBxGEYNq*?ôqkE'F-㪪1+AJt\p %rLNǏו@f,r iAە4ltyd5o[-ˈ \oV0]WjC(#:38G|A!" ҃?Ǐ`9 g"yRɗ1JȒ,"˚V4+mB(!Oϔ; G.PDh0\P@H0rK&(\3$M$bj[%#H,EK@3y䊖2cB, Ɓ͋*)y\E܍loj34s+(4 >Bqg{ bPiGmh 9W-KJt(n4M?!16ih@DRaqQPg5-ţg*#T, eD*X@PƊ<& hqqr7-F`yۋ[sV(ᢇPn0SQմKs6fv?rRm tgcem`GSlh 9og'|])j$EAԷ0NAJt{gnc?W'BO} %jS Ձ' XH9oga+Uҝ =0L$+RA. N@?s?҃|Qa+UҘEbyW.HQQR ѶVdE$FgV0]mHe`!A8m3>>nZϝ]sR\uh#3x<8VydLgǏ(`sqjj[<~PsqjVxy@p; AVxy@p9Eڮ@?Y[?Ǐו5Pgng+g&>wv gnc?ܞ<~|Q$.0 LO=JՁäup TTK{:Dql|.M֖nZv;g\eo/ \C0DlShŧ/m[SW<"FTUArrq-nZѳ<[7AgK3c'nW<<4x"TUʴYʺc8S#gpD^ӗ_6- `;>y

VZ0zRA*X@0 у<ԽfYuvZ9Uw+?Ǐϕ,v6ܵy`Nv6ܵy`c?e/J[vrntUXt`qZQtl, >TH,Qse 0$o>nZUUUUUUUUUUUUUUUUUUUUUTk8rxY{sj3pW&(5fI hH"fd`Oh$&dɃ,gꪪfԽ,^`}-!`/ 7?R;N1gm Z׋ -M?ùV;qK;U誼qkrOF VUf?tj^?ùc:-+j6|G Zgxo)w, eeJg6G6B K6#,Da2D@L** 楽+ Css'mX"列" L \&&#FÅEHbj[sR %rgQ̒@Б"Dgm3rx|U4m"(*L' ^(4 >Bu,|MW>KtMʫтUkN5r 楼QzUQ-5/|.Sl^NyPj*r8 ^3 ^!AbxiV7y" "dr%gnc?UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUS?òוsί>Glv `.䯔KTks.St&j^#SjA;/xPV4+$D.`<BEnx<3dUc <3LO ~y"$P.`DUYkvw{}!'+34<@BFHKV567qxz89?W^Q Ŝ ~4rI*T"ǐ"MH/ˮnNқI[)Nٌпh_'b嗞87僆A" X0D@" 1/9q\BVw/I*4"J(AȗC ȁb(H@DB[#aS6c vпh^J@ ):\pxFKId<$D D 8PU*}E;Z08tпh^IjbN䘖3r Xпh^V89ژS&%\)/(**D_"^r(k,t"v" 0X0@Gh^52Yy+rM~м[!+r\L^r`X/P,94?v:I N.Nv,w Xn4+M{PtȁbE~м(RDy0r%ƐAaEp @W ,fFF ßhN֌2%xIt`DDA "` $ (мҌ+ V6jjA3Jnð=sqeSt!&7x$VhП59(9Ir[-Ā_@q <"0̼yR iObҔ>ܠr)޴`qOLnU֠qy4"Hň 8x`bV+1\m((2b΋AX$+NQ((2b΋AX$~ܫD_.YB|׷<,燩&MldˢXy}Ā [@82J*% ^Jn/)ůe)J Z.zڐ JT!2&T e^{ Tr"K"L Ƀos0f.6NN1qw+&.\\@4+NQ( ZpzDVL\ph(74hO\c$\m(Jɋ:. f ^x7%H.aˢ(Xl@@eʕ(TKsI00LLnU֦#< e ks1ARN f {{-!lJ)h(-ƄV=깿Õ?A50àhП5rOV B+Foop|\blEe-z'&\℉4`_Z60'[\gP\T\_Z60%`..e5@%S]/؀LOR r Z)>nN Q> Z)>nN h.b3lJ)h81G)h81_AϞ \ o\lWi(ɔ\cKE'ѡ>k)h81H-7'`IؑAV Z)>nN RGKE'@ `I;4h4*\bV+1^oR23FoolԷ̩ B+7ؕԶm[TlԷ̩ {ssԃ pW؄%!,&ůiJk-l@'*\[%B.@H &_t\ښR.o]gq"0M}Ӄr#jiKJ6=M5ًL!FҖQͿ[1t""a5ܚFIR-zro]gp$T]ɯZpzXmMrm/RٷoM&lЋwbEHn+ciJEKoRޙҤ(](",S])QEJzpcARIrp`lWi( Þ&RN_7WIu2ÓJw!-ܭlԷ̩mNgb2w-ͽK|ʐnLWICs1RٷoLRB|׷Kfޥ3HRE-zΕ 0%&RNč Kfޥ3HRE-zΕ  )'bF[oRޙҤ)Mxh)lԷt _H&PpD70np#8 Ϛ$  BϚyP5[6-*B ׆ͽKzgJZ UҤKfޥeH7 cE[6-*C4hOq\\"f0N'=mJW\t9P9A)؊Њd[\gP\T\@_Z60%`..eD -B\m%9[J(qF6QF6qEKfBWTt%qF6rJ⊖hП5VEi7H7 c>gi \QRlzX74hOdgf٣Њͳoo}+JBWTt"3lٸbQ[)'zOSRszܙI;o?B+K4hOiRH 0)2v$hhUZTR+H0%&RNč W5깿깿zp|RٷoLRaLX+cT ܤ\Զm[TGoRޙҤ4"o^V$筱i(筤9'0ɔ8ٸ6q/)'rŮa;HH9ZTe4"~V2A0%&RNčҤ-58 VBnh& ܮ$a`ݘT0D<`a`ШQT0/<4*+J ׆V/Y(?X ozⴴ״-of.6NX1rEѡ>kFgGLJo+o%2\ron+1+NQ((2b΋AYB|׷E2\ro+o3:pŢIUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTa+n~V^+nOf7+|?.YI+l:Sk5)Z׷;I.gtÛs1@3׆V0lz[ 潽s[s״;ʐ-P"$P"$凎(L4C ޚOs8\yR 9RL"(*4crȧkFFSJwV?Nqܮ`ƀR+%9F \yVyBd~ "Sd`qǚ %g&H1a *?tY)20XxJ,\iq悸 Y "L~XxJ潽Ir[,@ Ӂi=@Ҟy@S`q(H2/?={Ӄ眶R[ܮ`1fr|f ^+1&m7*QKU5'.H萌2~./ofr|`%`0)2v$hh+4i^K!&m7*QK[ & \/­R/"rWtɛMʺt]&-`q/Lk "N \s!g4*@VJRZi0ÞHJgbɿmr.0%&RNč 潽*?|(H^eARoof.6NX1rE ЕNX1rEѡ>k# ^> \ ); Di"T;MaVa`%Vx ीFb@D* hEiM)UP"$ǟ4'{{(IY`ƄVҝY "L~XxJo׷Ώ.q9gW7 hEiM)Vy@0 $DFoo1s瞀004L P8hHJ(c[2zXOAR̞~ 8$PX v[[Nͤ$ YtQȏ*TVW0cBVQ;`PdˋH'=);?+<2DIP8iPB|׷I2nKc%p6m'S2(w3< e ?tyBd80pҡ/2x D2xqyEc|TB%m Ţ{UaϾ`wOt?(LcM) "L~XxJ9M)ܮ`+NQ((2b΋AX$Vҝg&H1a *? "<2DI? 潽Ϟz"Ly2,*9B%&A$Aq}eG"DJ]$A ̷4ˢ@GA I#FsF5J$De4EI2nKc%8]$DP؀0!#{"m)s 1|i=NG_40/NyFˑ$X=6  e <;-'zLN+{`re;6(ͤkZ)/sPٗ=4h<E`.2~O9(9~։Af_+J)筫OBFOkޣ 9qyUaϾ7(vсqTyb @ytEJ Lhh$E깭b #Ƚr[=~z$Deong"hW ǽN ĈhG UaϴcrȧkF =@'Bn7p lk3+Ybbb&5 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_offline_sitercegrou   =e ainorst"$_cdfhlmu#ACELMNORS\bgp(),-./1:DGIPT[]vwy&02;>BHUk{|}%'*345FKWx!+679V\f?vtV^78YLx]-%ռ8N4B6wv( &bD(p_T@(*6$Cj+I P LU&}'NäfA@3@z Q02/AB$`Ty3*TH58Efv]k|7A u9.hn"nPG`"%" `7S>xj8 (<c$ QCQWp0Pɑ0w@& (<c]~A"p^`> JC޺` A-e"`i!@j Uϴ$J[RˀB *j<MW>:wy:v`?|)Ah%j?|F a%3a%޳^V3 ibĈ.-A{ &ea/Hn̡Qb"<ԼaBdJŎ9WZm]Y˜1P' 2!.@Rf j[UWkWԾF&K?|MW>f)+K|Խ8*[QcNnP^(j0\ܙFlo{ktEi߆b皗5/,'. lZ6Mxnn\Ծ7(/o5.n\N5/EU;?z{M^ Oo32pwV5qփ8FL5/ F R:wZNFm楳c#s;c)KjB`dJ c1N刀,DHcgXz3jOӾj6{ R|MW>Ø)oʊ (K@fKf&`Pvf0jHSʊ (ГxEO ϊ=VXiBqL,,K{?ϛ?t@bK370&0uUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUS0vQXHP8ybA4s :v\x,\Խf* aQ-(>!sRrMь#Ǖeܶ;.7)&sJOivU68fohclOtpzyJN2<{)@x`k5.;OZ%z+67mFn򸌹v*R4l3r{ƣųtvN5/-T3ӕW|'Upkj;^7>j_ZJ-GK|w`eܶܧAt"l`uz*JsߢƣԾ6'{9B zX(GV?9|mhN+ץw誱0wЈAKDq-"scNy.fW> RU^Sw3jM^k5-m|0wЈAKv4ѹk55|ԽX"w+l^qqb<?tUTosoJӄu|K5ݢ܈g`z6nnڮ>AHEffRт[Ҵ;ҴIѴf޳^k5-s0v(kB?^Az3tl9;*ͯ9_7y^rkjc qt1j6z47+H9;-s^/F[czW;FvvVj\F+ ;1}ГxEM<M5\BN 3;<<4Ro8HPYǐ$s?q8/*@R HgrUCP!5&*MW>ГaP3 = fpH @N*LAs3cfW>N1w+4gܮz{M]Cgܮy"NA ϝrG@1w+)xD8<&$LLkH0@#`ʽQqj7lZ2W1㪪8c{^njw.inLUUUUUUUUUUUUUUUUULٻ v*|#-Vy\P/4UArxPV|ܵyN 楽ܵy5@vQ %isrkP'ҴںZ<҅@;Ulo4 UF9CtKte[j_`{ћl熻uY1w+)wLgꪪ%sm g6\.M֐g+m6gdm؈^00 楽 Q (WI P LUI4$qtuU@@?‚F,A/Gh(TY0j_#vu \jCzW,qr7-j3p͇bg5-t`z[vGW ͯKr.?k`t`OgꪪlƐ|]))w\"H> \+?ӄw+<<0? M<(*?|>F¥6K0p 0|akZ.yj6{ sR(Ҁ])yǾ YmVVV:8V0?TxE4Lp`Mrx+01PV|QJaa`j[UUUUUUUUUUUUUUUUUUUUUUUUUUUUULוQ 7h7Z[ykZV6f<%'Vk̶Vc.nٺ?tw״@iᚷ=yf:jiZm]YrUUUUUUUUUUUUUUUUUUUUUUUUUUUUULrxPVz7-p^h&MuX' \_=fU/cfW<5ٸNFvr@\ j_oI7rCŇD <*! ki*|%q7nZ!oѠMϞy@0&.mrh[?q|5CŇFxaV F00 楽`p8D1=Ϝ9Z0zRgܮxkZ0zR­!$V&&Ybb732ۙ㌵U36ԷOt5zЍ3(+7IBnZm'#;I k`h nOnjK7Ixf^YcNeaVWV|ܵyNU\g‚r3/<7-p^xXX/\n6ܵy738HPX (T`(H($\,G "T-Uts ϕ#`0@X"lgng?‚ו kA5Zk8X^hR6a Hd  Hd /@X0BaQ|@-#vuƣOt3z֊{egi`0@0(yذ2%ArnfsqͿԸ:VAZ ו~nZz[;UzPg?ټ>wWh|M<(*Sl&<2"Gcj[eJF֑6Y ,r" ,2e,W80|;#n kf ;8+;8:vs?Y[?הC̹H5<"be.D[<"be&\L9  #n'Nۥ\MW>Ì<MEKD ʏAJ%x~gR %r (\\FFڍ j[sR %rgQ@<%˳mڮOϔ;곋 XU0x""Gcj[vRm \Zqt+K`,/3qsUA)ZFg$LLȋg$LLˉ+8Ȗ,TwW#rhލ7VJ??y`Q`iG"eiϚӳG;ɵ]ϝf7AӕW3|l.FрN0[n02avqVvqt@3w碥AJG ŊgB MJ3\_ ~z*Z!Xf ~pqH% g+gQ@bK371%r0@# ϊ=VXiBqL,,K{?q꫾ \4PƯQ7Kҹ:6oK;g*#Xl&&YE&&YeX!,W-8Gy0;loj74s8|4yb Dv3AY7-p^xX^aAYGUX._ R\ETk yD \yD L| <l^{L|s+>FN``;QA4s KtMʫ0,m[`s]=v5;g5-zUQ-5/`SjA3y .ɃG0pzy<=fEUDa+lQQ5F?Uv00 : |;T;8 HdK(<` <(+>(Yb D|,/1q|5 [kAJ ogꪪg,)keR)\l yg+|Ú?EU;R+#ӼUUUUUUUUUUUUUUUUUUUUUUUUUUUULٻ Py24xQ"$JjW8j8( <"be&*HF (լG8- &F(<@gL01ɑ‘V ,j熿 O{V<1TU^SkL00 楽[ O<<UXC=7r@Q"4q(THz8WEƐ|0^@x #G%K@Q11Btq*~{kBDq_5-UUUUUUUUUUUUUUUUUUUUUUTmj^rF+;M.p2j_%kQUˍv7F0qW4睧gꪪl犕/G DUyNㆭQy j#QxhBDB*T*\@?6ns"<(%G'犕/` (\‚R_5-(THxHEU;FZp%b9KRږR6\4@-鹟 =JBDs"<($v g q籟kBDK =D yǂB$(PBG"@A"b:*8p7j^NU]𞛞mz[9Us7H9;%Z[4ʷ! L5h%b;ܫsiѧ%5p)/HE;rDHUkx|'*349?BKW{}!%+567@FVYqzk;h6I;6vf>C96l7m6iowݥisch{NNk6N,jO:xĬ\Bif<3a Xܪ:R=+3[#{9r ܃;a5.'+ XqԞjݥiXՍ\Ջqøޕѝ;+5.'+ NbN7ی1v9[.75bHvZӸ5/Xb9Z3lxĬ\Bif<3a f#K6=&E.75b`r Qcrӄt\pG,jUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU-5^q! 4vs6NEzpmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUR Z!8GfZ.VSC}\ͯV͚V|c6 R(Wl9YNIO 0YbK"\!KzґӒ7@"b%"c@"b%."_@.0UK*X?|4\q-+M1¯x8 /(&$\A "dJ ֿtb,(,QBE*,r$  s,f @1L$TGy`p%rs,-b9yb`%rQ> \F &"Xɂbd{0@ތcrU_mZUUUUUUUR5&N_ڪ_S0%rŅ9o_R:rFh$LDLh$LDeKH/*%,F ,WlkhYN8UA @$ċ("dDL@qZҵȔ<t R(W3Z2x ^ P Hc& *"z.pH䩩m|Y6f6Fyܦl9C|4ՌԸFmˍ[Hrڞ())w*$PHLSH(DBaǔ"Dǖ($PD&$P !x ₚ a0U Ņ9o_S4%6N`@PPf,,!Kz|*L@)A#xh =.|y@w@gD &($@y" 0 Oc<17+ _.26Z ,d ,dqp`8Ȗ,T~i08qWN͚a@ `*QWYZv=-͢sQr08gcуicilz\U{|c$yӬv&r CEKD#KX#lzXũ'Ks=vMW6y9 U>1+@RdǘÁb X%,tR:rFh$LDLh$LDeK{"~<"F7Ѷ$V*`BC0M0b8Uk9v5=JԾSdf͔  %c1Jl_m_V/Vt1/Va> XT 6Mo8sRYNJ9j3nW ^"e; #$o DK.DƁDK&\D@ "XRԼ8̍ĀEwWvrt<ᚾ ?Яga)4ӯ@x%cct&\Q3$vm IdY+ ]*e{|Լպ`p8| <~ǥp=qqj7!¯+)r0d8b EHỞ1aˤPɄ `HC"caSo LMJ#$o DK.DƁDK&\DX*%,uUEf0!!P! 3d{v6ݏKb3hlz\d\%Y`mX[^I>j^v049ɲ6:PRRA;EA/qjgRB!UͰ{^o|"qq¯xAJc T110h$H dbK/6(>V hJl̢uX=bԷ?0 .GmK<٩K0<$Ug(p{? <~sjMze;+Q*5k> \bXiפ0Ӯ\Խ89<כ+f[9W*1kjx+,-A8PVQ  0j[+-b,(,QBE*,r$  ̗*@ *Xzm dM|Q: ~*1+{ ށ"OBSdfe5A8EM!4DK0LLQqсÌzR_ "X *\EDDD2\L $bh$e7,U#r_ FG`05 B:ls_c`j ,d12EDWv-|‚$$PBH"@@qp$$ LLb;A$LD_T!"JB@ixknPV(ٸS@ _ص @B%  \8d<130{36n0TX~QA$LD_Vk@(!"J @Joe;)3Tq/zKfv048K`1[-+sY=|rFqek^c`j ,d12EDWWWn("XRM_ₘh |`N,fX[peaabԷ?oW-SF 5/JZ.VSM#$o DK.DƁDK&\D@^8mFؑs_c^ J$$PBHH 2@w3(YNe9aci  Duկ6f75b'$oQ@3!"JՋł8܋0$$ LL̢e;PXŭcj5cr9ay 6f`5e+)V5cpulz3l[^/Rbj6\Nϰg!ؔ7R˚co13c͏Kj{g\;cpxEG9#Sm%r’ثכj^"oV;"TlMc-{eb3hʽ͢ \F7oSdgbIR+Fؑwōo\Kltm$NAJK+.75bHvVj\O6VKt`v-d=%lR͢ \6=.j_F7sV/bS,#53kQe8u?%jMui˂ jZyXՍ$y\qqj7-3VכF R|7'ZP}AN#?)ma+)y\Eڍdmc`'kvU6M8faF'\dcRi^# _8r#<J7ڟ5/tc+V1-͢?]܇bjcԸ|3jy|'^?,p Xf~ ok^Np17y?c񳐝W-8l+|"F78F!F ,8?VWNp\px?Bw \,oEKj_9 %r7|"d`"k56rTԮ|YNⱿW ͎<1:;楜lc7D"WAycn{ ^Jc5c—.`ycH3ٶ.68ޕ=7V-yGmC; #gf=уlvR88fRсÖ-.plmqi\5-cXIU5/PX5^f<9cV7*Ϋ9q 곖ǟ\w GxMK7'i'iZC5cr5ba=1e7sgiK6?aӱص6 ]VˍXj^1+Aj [x3N"z0Jv9[(yi:.8n#5cjFm\pAH0pSs`4ҖăɑZ8d<130{2+])lH;..$]kqq5e;*SJP  6Fa3P-ɏ(sg.pE7,ᫎ%r5/Ews_cRؐv<@ xpP"%8ŗ=^Qd 男R#6K7s_ c.+r\VnSdf5 x0vqa *Py!lRS^lYߵ5N5/8Ǿ  qaI5j^y&:kyRYuaKҴثͧ. l$ hH3:e`$ٶcZ0zRӄWlEMJV~Kу hFO=\r8 %i/VfoWe;XSdfe3*&`HA䅱I\ŗ=^Qd8GEk甹q8v:ٸ+zKg)3`1[Ú?Ew*ysR+ׯj^#ggibr-qV4Xg宔$"` XׂøzzW;Fv5/ۋ&?aӶ˜5/yUnRMW/ٛXGQ*6`~GmK ҅|'IgW%^zKP9|l*[^uY,e&(?^ѝUya3P9y^CqciiYzVOB$MxirE4Z\dSc2lZfGz\%b"1kXڪ)zpsy6-:vNvp8EтMyScdRyK5%klIvF\#iD#8gaӶ5/,ozmup5/8G<;|'ץafi6卪XܔcȵrXݯJ0ٰԃNA+,o6 <Ԧ~,nEmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUR8͆8+NgԠ+=)UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU, lo3+fbbb&< # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_online_node   =e ainorst"$_cdfhlu#.ACELMNORSTbgmpy(),-/1:;GIP[\]vw&02>DHUkx{|}%'*49BFKW!+3567qjS]5q00B8;``L &b"D1Ķ XPп (PU d8%@ R6p8$&" @0z}'cf@3@ z-U 0 P$@(UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUULF84yb9k˒Qqɺ*n5o6<3E.?nxdEp5Ǖa\=g>?sp9i9GZlw,);Q7<8sVV,vE+ j:2J@O9]StKsԦzw=M ܶ7oSlgfbjsV;գmLՖ `jޝѴz|գmLaJr ]$R`J qcV2Xg5oiÑȹSlgf7-Ғ#[7 ^'r |nK9mo_iX#5svssU櫥f6qhuq JQƗL|nh^jC5MNj@x%<#J7iC3ny`g95[=ӃLڐ<ռN͓tc,qqrW- 1敟Y68fohc|.j{pzsekԄx>;Slg?V A& ޒkl7 ^@xW%r/6 V㌴f2OjSp5oVMX 3;7\<2mi^w|jF7櫥 ޻9+Ls. y^ђw,lx?w ܇0o=Ok@5o|mz|W~Ds. !oa{kts2SŃAVif]ffzV9Azx!amiA& ޳e1a[.`yc<&?tVXޝ=c<#rAtմ7AMen0o5naCB@* @V܃q|(rH84yb9pVP ( @P~ =A@qK3.W=NHCà gN\xʶ@" <8&9r@"C gN\yNALJ3.W=%!H@0pp6˕RJ<8&9r8!H@@pp6Wn7p^tDC gN\|@" c?Et&$YED uXn1q|s C^qjWlZojܘUUUUUUUUUUUUUUUUT i,ק2ɟj:rs]+N;;V cʁ;|H pqK2Y2Ֆ:Xä+^V:z)gΜ\nK?tm)3E%![6Isnyd-)-#ur[p{2@қ?UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU3bw, HRqp\\Gw;pp`vӃ?ܦ*+'x ƥbx5m J$&PBHL D<1D]$A|=u@@{?ܦYb D|,,G*@J0TP1kJ )AwL,-99ZV; H(TE9UUUUUUUULcVrmyUUUUUUUT) 'ryogr8nFh$LH%Ș HdI/`HyŊ=kl myO3|ZNQ֘g<<3)R"LLq2Hc?g)hE.,AL"aab<շ97#Xl&$YLh$LH$ˉ yŊБpo9m8vtŞ,#=;?LNG -D ,2E X*+)3E&XQДV qqqj)3E&;r=c4RkhkJ(@bHDL8?s?s52j{yMܧrϜ9y^S5o|jB<;BN9j:rsL H#Ie;  HdL$TK fg3YyNi gɑ$ &Dh!*+.ɑ@# Py24RKA3fxk7 $-S_@dqqqj3.W<* #G=AKHG| ܃@xJaaRQ$THHL~Ƚ_'alrǢP0..#[{?Ep=AK =AK=AKǢP0z=ǢP0tB'G38>;zLIcf9r.|HLE.DRbK%8m(<4ށ(TD,Dċ"`"LIdM# .yj sV^S= ޴YyNㆥh$LH& *%`L(+@`N#[{? HpnI%8jXx, gK"6Z ,r&4&$YeċlyŊ^S[ljwW%rp<ᙾ (|!c ^S,a⽋KbŏIcf9 _7`"@xWcY3|X H Ŋgg+gΜ\I`H$6j熀w( d-)Ƀ `LDE Sj @%NG -D ,2E, g,Xa wP6mw&M\= $;(w5o|@fi7 XfקVIdm=F.+҃qiz|W{\c59yo9q9mZPVVVY(L3k..P5[>j"-Eޔ&ڲG zJwjB<ս(F6M^\ᙾ75L3tK}rbuոfקsV^Sʩ+ ga]nznItYaz5oIyN!j&5[>P7sU5Z8rz}[VXc?1\٧ ^ͯOg9ZRiUUUUUUUUUUUUUUUUUUUUUUUUUUUUULrPVR. @rXX5mTb xk)aK&0Ղ]aSqp,,GeܤWվwn{Vוş" \E97#Xl&$YLh$LH$ˉ3Ş/skVpӹMMNcpd$,~ew9M[6kF \ol;Oj8A>V`{]=3sם3^VX? ذ.Sl^NyX,0GNwHXy> $LH"LM <1W=%m z/w/n9e=h@?‚i ~p9-yu3h=‚yở;V M`,,Gn|# [n7p^xn0հ? gg90ՙx܋'rք38>Nn7p^zЁҶ*@H,T?s?s6!^W8aeӹS3ÓP7z[\>LUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUULrPVR&&\A$D a R(@bHDL8? HdD}V HRqp\]VE97#Xl&$YLh$LH$ˉ VnR6ٺf h\L|M|>G_69@<`Lp6j8׋=NNj)4~\fɺ1sm~qZ>SjZa1}<Icf0~/(sÍK5+lRU5$~V#4,g?σs|5S?=DPQ"ɑ?LQg4nk蛑"B@B% ׋Sx܋xHL D<1D`EN‚c6X7(v!aM=g>| `rJ.97A]-Eޔ@i*bWKQqt;J@sVmB)5e3kܦ)e\7 wvt区jq#sn&BRrNG` 3R?l\+^q9X7*/9 C) V󑁨aNC5jJn=:h9L(+B)uYb 0jr.|aO@H,T?slcUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU0kn?ӱd` $t!U-b8Ԛ֘f39q]M5[=-[`IcfuzSt--fNN6fN`͡ H8+ցNyم]-R6ٺ--f7P3R6نmzzM~fXͧwlǂN^Ny Bpc.yK5rjBpޒyO3i5y[Kp7q7zpM-[͵ƚ<·RͬWr s;zGx?6j=HDf?'[`jj5-^7M%9yp((T~Vה7޼=ϔ` 2bKP>[xܗZ|櫤{ˋfg[`R6ٺjYp(TP|9=u0o2[͵ƚR6ٺ UrJl;[vc5q7^r}` ʯ3BH>0kk)ޝ0 `ڪ(қ;A," "^`F N`X =m"`q!01hs;c)[jap(TPv3Icf9 _*_h(_kařx4J!(ܦ$fT'rc#A8`/3G.b*5iXJq^x,W HLV*5iXJq^IAtoOřiREF+ N+OřhPE Z1k sdȕ+JNHEHEl7A_g+0 sq -j)3\8iAs׼ͩiyskg!5/SJ V"fj%i-sN-njxn pmz|վSlfNI%FZt1q{kZ5q_[wP6qk63·j5u t Yy`X'jinڷ+JNZ?+ fVZPz{Nc0]dv ښv?iAsV'zK/)B1;[0&TBbM6p#汕njxG|',5c>6WO9y^S]sp5oI:gH,v=$DMPUkvw{|}!'*,0BFHVY%+35<@K4679?qxz8W^JQ pIc  ą *$DXXRF֦P4h.(2n]k]UzT. MEM2DD",   @A`P, Č2Zׄڐ'831!aBD "<qQ!P,T H@A 0֠PmE&M˵z *Pʅ33  0V*Us5a)0@ Ņ@h< UGM*PҠA@ &\R]M+C^X>pfpdV]颻R]M+T-3"dBy!QhU˵Atr`YsVZA Dz,  @82$d̒e.VkmJpfpd"/Mp\"^V]颻RLև+4 iS)ꏜI52ƞڲMڔhxHa2ؚ]"("X>& `DE*(@T`H| i  Մ 4 Xq"6 ʁB`Ue74ڲKCJV0`L *`LF`\P(@82.^h@8<Auڕ%46.LMD^ڲN VJ# ` x4Q ZH*,(@H( 83TH@!xz0TI N U\l„Ӌr+4&QTKhM 8ѓ0X4 8j b YP4HL*{VPiwiSa* "@s^j:@^# :,!wHGQXD ΋ 38RP@Pt jp&IZ b p՞s5a)0@ Ņ@h< UGM*PҠ3"6%Me Պ`PYS"6a*."8$Ȑ$(@bHP\Dy"!L}GMͽ(i贩wiXV^Ք4ZT44^\0 @Kˆ8A HXZrAŒ.Q&e#' HT$H`Uwh^R2wȐ ]8aD I $D":)e =. + KڲJz@KˆH yp@H$R B'p%$i0$D  H$- FN8"@{B D`PF2 K(e =. *:.8q0A‚dBHtIu6WR4^UY6{VPl4je74-BE2ɢu$kUz4j@Ms us (i]VLɘk.jU\ ܢM"(km&@ѕ.4U Q3&cMYN9@!xs7ZL!@qI5zn.P"|mGwiUli.az2 8,YVdڑW(V""@HX˽7(wlM3PG6j=>D/$=j2l:jТkMzDɥkAz{VPl4c 2ih8nmGN:5I""@HX˽7(wlM3P EG$ܢM\naLYva{ڲeޡkPєM=CE/QSsj8q0I I8#r=hQm&Wj@QVQU=jL liucHՖ,hP v@ͯzAjijGAb4+*S,R(i趒ZYp&hW(irG@8e{@ojTܩDɸi5vRM/ 7"W @#B9ԩ5V&tj(˝1j)MVjDIJ jUԍ&(8$@a$ G&D E\^MG fY75e0MG ( ($d̒e.VkmH㘉 "Jh@8<Auڕ%46.IXӑ]5b YP4HL*{VPiwiXT (@pL4HXT $D kylj;`(40;h 0V2ЀIc  ڢ,XT * Tqүjz-. * X@X0X(H@X0MpX @$;bqAzj^0(@@dp\\ڭYUY6U$՘xT 28@.w=jHҦSEڴi{h8E5^-Yd^&T*S,R*j՗zn.wZL=UY6U$ե +kYVdڑW(VaD“UY6U$աjGG t-YG5 W|pˇGGE2ɵ"Q&«*S,R*j41A(;eZejE\MYVUY6U$Հ(ɈD@Y3sjfU鍠l<*Gͪ՚fAxTG8㼙9b䊋e5zu6e5ZUAe4I/B^j7Ps Z\ S^W$Z;1c1c1c1c1c1c1c1c1c1;7OyuIC D$kaᨙQ!^Z]T=^㋽CJU˰DI5ț;0BHLL<5*$6]KCJUqwiRLL=@!0xAjrMr&Îih9LMUID=y A2"DĆHf{U'qr鉨eeD˵xx. *U .: .TʈI5ț;-&Nj!%P{\z&I JP2**̤ǼUPyTL&e).8iIz&IT/(P\\we&z<^P2U2˰;Vi*e5`AL\q;e2dDfR( a;2d= H^P2DfR*e5a.wLӿ H]DfR*e5,)'tih9W0i2p iTT3(Pr4*a.wLӿ$Ҩer4*,)'tL5LMC25ZL(JEC62D@es q]7i;D` aᨙyt\\z"dE !XZ]Vܼ<>8!D`t-. p;(a3-%0sܼʁ@e%IM7/(P(JEC,{IPr颡.byYDU.*`ܢM*M 0sr̨wLsN {F e$U[AWz M*-XIiThfP2r4]4T2®Q&A˦C0i2b+*-(P8.wDU.*aW(JEC &""Liwe&xjrMrW0I5˒\YjrMr䇰qI5˒=Y3p\BԚRk7yz&IcQ͆ZM.c1c1c1c1c1c1c1c1c1c1c1c#$=hQ3&cMMJM2RkzkI &kUArTqd˚{RT/A\a3)SuUkk6wW\"H|(a4LSZ,sOjT(=^a3)#U7$Qœ.iJ3 HMG M֢&\ڕ7V@m(i5V&ڱ5^Msp"H|(a4LSZ,sOjTYܢMZSj1c1c1c1c1c1c1c1c1c1c1c1;Z`AL\<&2L&e"SYyQ&EC3ܢM*M ;2djrMr;s qMP&ٖn.z M*-7m@it*e4P]C֪/MsUkk$<wdU2-2jmePEStZ\d\k*-ZN5V&rCxkQ0sUkk$>ԡ 1A(\\!<5Rx95˒ P 8TP10`10 =2Uzn\h Xpz`H. ܹ`.Î5V&rCxkQ0sUkk$>Ԡ:!.Y3L8{&$.H|C0$ѵmj &Mw^"erMUI\\Ukk$= OrMUI\ZR 2dVUZ"P Y3 c1c1c1c1c1c1c1c1c1;F7Z䇭"@XTW}YUcIMsu;F -U*ZMj(,Ic1c1c1c1c1c1c1c1c1ZL=UI\Ba; , ʍ^1`8`1`8`<\xp2=CSYVdڕ&$/. *te#((dGWR44\$H F\AJ&I7Z4]Q*"Q3&cM pˇGjrMr䇎8,/MUI\% ;FZH}5{PH7Tqˠh9*eRQQ t]]֪iԣFkMZZHy0aRXT  j^Ք4Z]TˠcyqחAuް(Iyt]  $H j*9$n2W "P2EG.4ɜwe=eZejE\MZP2L9*S,R*j28HɒIMGCJѓYVdڑW(V́41A(J;0ADUI\E2ɵ"Q&w;LY  FŅ@h< TW*P]w4iv{ˎ;5`1G\\!<*뼙 Arx,Q&tj)Mr5`e% $ՀjrMr䇰jb5V&rC'DIG4ÿ"kZE2ɵ*)B a(V&M,^YJ$dR $ՊޡkD!j ;20a5M%dn/D!j4et2鍵cL9I<Z 41A((P\\wQ&(sUkk$=*ADTT{4efI<Za*S,R*jL,2Na¤aP,$&.ʼT]]G.L9T] B28҅5jb5V&rC8HɒIMGCJ;ViADUI\AuLp@ @0i2b+*-(P8 Y31c1c1c1c1c1cwd`kQ0BT֠MJ6A9*EG$ܢMZc/jz͗z;1c1c1c1c1c1c1ZL^7c (5pXX DIX`,l,5Lmr5P]w 56k &.(&D8H@8P\\ MX Q$.H{AܢMQQ nQ&;"ͨZkSDreܣ:QSsj:4+&VwBrTrɤƞ^e76QQ uAv間'AuL\T`P@P/c#\X-<*뼘PaQ0<^G&]= +kU鍠nQ&q1m$56hj*9$m$wLɝi2p ADUI\B@M ,O O Nj@, p{qq 4eԦ\euS.іܢMt(amYCOEPұ2z#cOPs qHˆ\:8wHLAʹDMzch<۔I.aeD'D!鸲-@(04c#szche76(60ܢM(,څ UC)n"$$@I.c# (8Ht, &.0$H`"(̎"$$@txUy10"B "(JW0qY3zn^8(48¤(xphD`TX\A$l<=8yx\dt=ёǹD28p SD5Qy!"Izn/$>H  $i2qǼˠGX$H EȐ AT] BD( a;ƞGe.c# )"@$H'P]w$0 "BDJW0qY3gM6]L liu7,L &j2ǁAQaqL| # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_online_site   =e ainorst"$_cdfhlu#.ACELMNORSTbgmpy(),-/12:GIP[\]vw&0;>DHUkx{|}%'*349BKW!+567YϱW޳mpі)\lM!)8ש}w <|&| )[ւM[|%|;mJn#J;^l|&id-Ԧj fv oeyek ^W?7 'rԌ oWK|wdqrW-7)6 >0]:%%yÊX٨5o|`{cޞ #[վ6nN]K5|"l`e[~3X˦Kςս%,'r ڰN6׸6w[7eσұ|"l` m{M_5oZ 5mN)` ysD97Aڲw>v=HG^W`Mx "m,t3tIqi@ٻzvG}v8i6;kqu;歰o?;c$~Jn6Ŏ` ʯ3B?o;y^r󹻔jc qt1jyVyv9X7-s^/F[czw;JvոVNE͝o c Y{.75LvZԸ5o<iM{c$~Jn6ņjB<վSklSs^/`J 0՗5-HGIcf9X6.? G&(hӼ"ŧ0"F0z}'N ghB`ibL-HB@##\d>!CB0`VJ*ԍ G&(hӱT330Z@0 ]l@ "$ .(Le ,gΜ\:wHCà gN\xʶ@" ,xpM:rs͵5tD <8&9rce:@" gΜ\sԅ LJ3.W=HE+ 88X?t LJ\yy gΜ\M)5D <8&$LH$  ݦb 0ʽcԯ8ش0՗1j82YOs75g4&˕ v:|# Z'q#*)R"(*2Y2Ֆ:Xä+^V:z)gΜ\nK?tm)3E%!LgEt$BEDdqX^.. 歽w*@)%;RBNÓ箲K59g4%FsГg-%熦#!Ó箲l|R;**##JEl|R;…EDdqXXMw*@"'raB28ԬD\\,80&g>R\۞kk;Jxeirܦ UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUULr;`HP5+ \շ*@B% q!05ht/FN'NasYl@gPVe"\@ X% D3G1j8 jM861Q\4IӼ\\[{?ӑr5@"bE.DƁDċ"L|xj@"цfZPpL?EϞyg1Q\4> ܱqpW5mNG -D ,2E!"XR98z?J\o'r,gIӳX AJ,AbeˉDDP@aҶ3bk%6hj@ HLq:ysDJmI?>Xv+oi F+tek'c4RkY0e"\@W5mrޫog>X*+)3E&HQДV qqpW5m[GZVM)5yQlTb Tb$ "&PPa99 0՜gxn 5sqyr܀<)35SД[*σ:~.. 歽S@nʶ\\[{?Yp܍a HdK1@1"ȓ.$_ Y{b<Ўxͯ)oI:sҽ[-`n֟3q$~2޼1x%7e*҇֕*@B% (u=\<Dz*(T.`ycT4e[{?ܦ:K"\ 歽*#*A"!3kJ(@bHDL8?s?s1Q\4kjqpW5mIdSr5@"bE.DƁDċ"L|<< gB98z?6G-'(Lv]JOlavWZ|˖[3z w7 Y(t%0pB !LB gɩ3֕)R"&PRň0A@q3rUmi@`lK9A!Bn7p^gjȧ#k Dċ"\Dq"x@ؽ4#oH8K^V2髷j3q$xfՖ5n<MxT.-,3IiM26{ᨼfjSt\l.c1Q] MV2fE DR(LHX0$(LyADA!2E`L \շbg}Vx8PP\\[{?t*L@)%W<4g|y@g iN&LPLeJ"(<45jV^h-,r8nFh$LH%Ș HdI/^ QN ܩe;YҘ1Q\5w,\_0e"(*\շbk%6hj6#Vnqv5[=ύS?y[ռK/)x? ܵ!N'NUUUUUUUUUUUUUUUUUUUUUUUUUUUT9r &F $AQ i$ K HdL$TK fg3 (v##HHL$G TW  &GAI-͚TwG&(wLTW ~ɑ\շgN\y(TF? J,fr.|HLE.DRb: . |i$ H @"bE0LPQ&@b;֒K/)p԰X-D1BEDX =S og . |i$ Kȧ#k Dċ"\Dq"& ܅x<c? X$K*Y9:rs&LPym L٫3wH> <3D &(&@y2`~5La/x4ybvE97#Xl&$YLh$LH$ˉ/Dbu+_8i@ٵ;]5sp$~! Cl{r7O\ק)b6>jzK%ir09qX/Ok[FVyˌ)3j҆?@a^1qryVa~j.=56Ֆ:8Y3| T1A@? X$K*Y9LTWBSlfMoUt\\[{?s |errM^jysDy.p)37xn K/)y\FvQussV#'r?l\+^+\zYh ;6zPNYvgʏ=9r;./PVRaa`j+"=HPX(T\)H( .#\P@QRE5-91HrK/)tUH ~,zw!c 5zce= M), !AG`&$Y ZvZ5fDTI(%GK *X&391HrK/)qf2gjR9_Ykjff0ji6SřsԆ,RY(? r.|Y9%9b:H @"bE0LPQ/XeeZP6mOu\c?UUUUUUUUUUUUUUUUUUUUUUUUUUUUU3G0@ٶ>zJwB<ս(F6M^\ᙾ75L3tK}rbu<ոfקsV^Sʩ+ ga]nznItYaz5oIyN!j&5[>P7sU5Z8rz}[VXc?q\٧ ^ͯOg9ZRiUUUUUUUUUUUUUUUUUUUUUUUUUUUUULrPVR. @rXX+*@H,TKj3aFV2[?t i+i|Q;pp`vc?ԄpyZt k?7/0V<0հV# $EN Ӄ?6Be+ĄAD;FSl=;? HdL$TH-SД;˘Di"'j+O,/3sp܍a HdK1@1"ȓ.$_R xNHYϱ3|Гg%m z/w*@"=;pvMSI[H˪QQjV"..ogI[HɟJ,A.1k9LTWBSlHQsD$D(TPaY\\[CkR07WIy%\;IiN&GQZSlgi-)٨^.ySlf(ͩޫFXϴ+O,/3sE97#Xl&$YLh$LH$ˉ x"XR:K/)y\FU@=o;Hx UrJZ֤|;~<^VF-te7b,6.:jYlpŞg'g'N`\ ܙf6{?i[?EϞdzaA[;Vu W5m9>lIdSr5@"bE.DƁDċ"L|g<l^{L|ssrǀHXسcqd$,~ew9M[F \\ ?J-sOnr 歿6׮Ֆ;tMy9cX٨1{N8xllTb,Xf3rtX )3E&Ut\_0e"(*\շGlo\g(c7ыܝOm)R"\@)qK,A/ogr8nFh$LH%Ș HdI/@(Ca[Z'Np$~գmLgIӳUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTMMyc-ҝյ(ܗ4j7Agڪg‚"U 12 "&PPc "U BK"@"e0řDċ"$$(TTFG)e@1"ȗ"c@"bE&\H  B9F=HDf?i/= r297A| =hq2EÒX٨8z[^,;7 Xf9xn s&͵ƚjb7oM-inx,$\9%T#e6,lO |IW<֤#!#?Ym>vg<ř||;U?<"'@1"Ȋ*$Py2'@?s #z&k=~z$&PB757")Q LQ=g>ѓaAgUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTiѰhӶ `rJ.97A9]-Eޔ@i*bWKQqt;J@sVmB)5e3kܦ)e\7 wvt区jq#sn&B?RrNG` 3R?l\+^q9X7*/9 G) V󑁨aNC5jJn=:h9;,rPVRaa`jr.|aO@H,T?slcUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU0knB`j #/v.IE&YϱW޳mpі)\lM!)8ש}w <|&| )[ւM[|%|;mJn#J;^l|&id-Ԧj fv oeyek ^W?7 'rԌ oWK|wdqrW-7)6 >0]:%%yÊX٨5o|`{cޞ #[վ6nN]K5|"l`e[~3X˦Kςս%,'r ڰN6׸6w[7eσұ|"l` m{M_5oZ 5mN)` ysD97Aڲw>v=HG^W`Mx "m,t3tIqi@ٻzvG}v8i6;kqu;歰o?;c$~Jn36G0kW!·/9myM5r 1xGոV5[<ۍ+:wy:v^,)Ad%jfǔ$F-^p kj1e[~*TPR Ⲝ\BM6p1mսM%`h>5+񆬽sYtG!(ܦ$fT'Cm{M^*TPR Ⲝ\BM6p9yUrJy7(/5.rY6jվG-'(O|'V51g jOjܷ=%NpWFڰM٘O*(`LAYN.yvAkkVp>=7$<Uq8fce=j׾ '<5osjJQKJv'cYRQCeJ$/qs {=7$<Uq>Slf% dsڳ-Ieӱ"V$'JvԄRT2e8?a YܓgBpYyNw5սN?>NǤ5e[cb<⽆j5iXgtsJS0,Q";cޝҝ 9ql8rsF/3vKJ.0}ūw:^1وrrܠR8\})pY=f f`1wFlnLP7zw;Jv^xeB1nfvizv Mi%u>pͶi+t6`Oz|NH(,1j70Ae2 ҁvV@99soRJk匫o櫤ZK;Os{6ԥ8Í*fV@kh8r6 5oQXgVMӄq,OQOt6=\ٛi9j7%4! L4Yyh˓8"UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUL8؏6rJI9@_azsi ` kju3+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_recover_clusterroup#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2018,2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_recover_cluster.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2009,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_recover_cluster.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_recover_cluster =head1 SYNOPSIS clmgr recover cluster [ CANCEL_EVENT={false|true} ] NOTE: the alias for "cluster" is "cl". =head1 DESCRIPTION Attempts to recover from an event failure on every node with the cluster. =head1 ARGUMENTS 1. cancel event [OPTIONAL] [string] A Boolean-like value indicates whether the administrator wants to cancel or continue with the remaining event processing. Valid values include: {false|true} =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. function KLIB_HACMP_recover_cluster { . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_recover_cluster.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset -l cancel=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset nodelist= node= typeset node_data #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= else CL=$LINENO KLIB_HACMP_list_nodes node_data for (( i=0; i<${#node_data[*]}; i++ )); do nodelist="$nodelist ${node_data[$i]}" done if [[ $nodelist == *([[:space:]]) ]]; then dspmsg -s $CLVT_SET $CLVT_MSGS 600 "\nERROR: no nodes are defined within this cluster!\n\n" 1>&2 rc=$RC_NOT_FOUND fi fi #============================================================ : Validate the recovery mode #============================================================ if (( $rc == RC_UNKNOWN )) && [[ -n $cancel ]]; then if [[ $cancel != @(1|0|n|f|y|t)* ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" CANCEL_EVENT "$cancel" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "false, true" 1>&2 rc=$RC_INCORRECT_INPUT fi fi #============================================================ : Recover the cluster if no input errors have been detected #============================================================ if (( $rc == RC_UNKNOWN )); then CL=$LINENO KLIB_HACMP_recover_node "$nodelist" $cancel rc=$? fi if (( $rc == RC_ERROR )); then dspmsg -s $CLVT_SET $CLVT_MSGS 601 "\nERROR: the recovery effort has failed.\n\n" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_recover_cluster()" BM kw3+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_recover_nodeerroup#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2018,2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_recover_node.sh 1.4 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2009,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_recover_node.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_recover_node =head1 SYNOPSIS clmgr recover node [,,,...] \ [ CANCEL_EVENT={false|true} ] NOTE: the alias for "node" is "no". =head1 DESCRIPTION Attempts to recover from an event failure on the indicated node(s), defaulting to the local node. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. nodelist [OPTIONAL] [string] The list of nodes that will be recovered. 3. cancel event [OPTIONAL] [string] A Boolean-like value indicates whether the administrator wants to cancel or continue with the remaining event processing. Valid values include: {false|true} =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. function KLIB_HACMP_recover_node { . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_recover_node.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset nodelist=${1//\"/} nodelist=${nodelist#+([[:space:]])} nodelist=${nodelist//,/ } typeset -l cancel=${2//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset node= typeset runcmd_flag= #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= elif [[ $nodelist == *([[:space:]]) ]]; then nodelist=$LOCAL_NODE if [[ $nodelist == *([[:space:]]) ]]; then dspmsg -s $CLVT_SET $CLVT_MSGS 602 '\nERROR: no node could be identified on "%1$s".\n\n' "$(hostname)" 1>&2 rc=$RC_NOT_FOUND fi else for node in $nodelist; do node=$(CL=$LINENO KLIB_HACMP_is_known_node "$node") if (( $? != RC_SUCCESS )); then dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$node" 1>&2 rc=$RC_NOT_FOUND fi done fi #========================================================= : Validate the optional recovery mode #========================================================= if [[ -n $cancel ]]; then if [[ $cancel != @(1|0|n|f|y|t)* ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" CONTINUE_EVENT "$cancel" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "false, true" 1>&2 rc=$RC_INCORRECT_INPUT elif [[ $cancel == @(1|y|t)* ]]; then runcmd_flag="-c" fi fi #========================================================= : Recover the node if no input errors have been detected #========================================================= typeset -i recoveries=0 if (( $rc == RC_UNKNOWN )); then for node in $nodelist; do typeset state=$(CL=$LINENO KLIB_HACMP_get_node_state "$node") if [[ $state == *FAILED* ]]; then dspmsg -s $CLVT_SET $CLVT_MSGS 604 "Attempting to recover from event failures on \"%1\$s\"...\n" "$node" print "$0()[$LINENO]($SECONDS): clruncmd \"$node\" $runcmd_flag" >>$CLMGR_TMPLOG # Always log commands clruncmd "$node" $runcmd_flag rc=$? print "clruncmd RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then dspmsg -s $CLVT_SET $CLVT_MSGS 605 "\nERROR: failed to recover from script failure(s) on node \"%1\$s\".\n\n" "$node" 1>&2 rc=$RC_ERROR else (( recoveries++ )) fi else dspmsg -s $CLVT_SET $CLVT_MSGS 606 "Node \"%1\$s\" is not in a failed state at the moment; no recovery needed.\n" "$node" rc=$RC_SUCCESS fi done elif (( $rc == RC_NOT_FOUND )); then dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$node" 1>&2 dspmsg -s $CLVT_SET $CLVT_MSGS 151 "Available Nodes:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_nodes available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed ext.\n\n" \ "recover node -h" "NODE:" "$CLVT_PROGNAME" 1>&2 elif (( $rc == RC_ERROR )); then dspmsg -s $CLVT_SET $CLVT_MSGS 601 "\nERROR: the recovery effort has failed.\n\n" 1>&2 elif (( $rc == RC_SUCCESS )); then if (( recoveries > 0 )); then dspmsg -s $CLVT_SET $CLVT_MSGS 607 "Any current event script failures have been recovered from.\nWarning: more may occur if the underlying problem has not been corrected.\n" else dspmsg -s $CLVT_SET $CLVT_MSGS 608 "At the moment, there are no known event script failures\non the following node(s): %1\$s\n" "${nodelist// /, }" fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_recover_node()" #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ at kLz3+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_recover_siteerroup#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2018,2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_recover_site.sh 1.4 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2009,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_recover_site.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_recover_site =head1 SYNOPSIS clmgr recover site [ CANCEL_EVENT={false|true} ] =head1 DESCRIPTION Attempts to recover from an event failure on the indicated site(s), defaulting to the local site. =head1 ARGUMENTS 1. properties [REQUIRED] [hash ref] An associative array within which data about the created object can be returned to the caller. 2. site [REQUIRED] [string] The site whose nodes are to be recovered. 3. cancel event [OPTIONAL] [string] A Boolean-like value indicates whether the administrator wants to cancel or continue with the remaining event processing. Valid values include: {false|true} =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. function KLIB_HACMP_recover_site { . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_recover_site.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset site=${1//\"/} typeset -l cancel=${2//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 typeset -A site_data typeset nodelist= typeset -u uc_attr= #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #================= : Validate input #================= elif [[ $site == *([[:space:]]) ]]; then dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else CL=$LINENO KLIB_HACMP_is_known_site "$site" >/dev/null (( $? != RC_SUCCESS )) && rc=$RC_NOT_FOUND fi if (( $rc == RC_UNKNOWN )); then CL=$LINENO KLIB_HACMP_get_site_attributes "$site" site_data for uc_attr in ${!site_data[*]}; do if [[ $uc_attr == NODE* ]]; then nodelist=${site_data[$uc_attr]} fi done fi #========================================================= : Validate the optional recovery mode #========================================================= if (( $rc == RC_UNKNOWN )) && [[ -n $cancel ]]; then if [[ $cancel != @(1|0|n|f|y|t)* ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" CONTINUE_EVENT "$cancel" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 3 "Valid values: %1\$s\n\n" "true, false" 1>&2 rc=$RC_INCORRECT_INPUT fi fi #========================================================= : Recover the site if no input errors have been detected #========================================================= typeset -i recoveries=0 if (( $rc == RC_UNKNOWN )); then for node in $nodelist; do typeset state=$(CL=$LINENO KLIB_HACMP_get_node_state "$node") if [[ $state == *FAILED* ]]; then dspmsg -s $CLVT_SET $CLVT_MSGS 604 "Attempting to recover from event failures on \"%1\$s\"...\n" "$node" CL=$LINENO KLIB_HACMP_recover_node "$node" $cancel if (( $? != RC_SUCCESS )); then dspmsg -s $CLVT_SET $CLVT_MSGS 605 "\nERROR: failed to recover from script failure(s) on node \"%1\$s\".\n\n" "$node" 1>&2 rc=$RC_ERROR else (( recoveries++ )) fi else dspmsg -s $CLVT_SET $CLVT_MSGS 606 "Node \"%1\$s\" is not in a failed state at the moment; no recovery needed.\n" "$node" fi done elif (( $rc == RC_NOT_FOUND )); then dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$site" 1>&2 dspmsg -s $CLVT_SET $CLVT_MSGS 157 "Available Sites:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_sites available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed ext.\n\n" \ "recover site -h" "SITE:" "$CLVT_PROGNAME" 1>&2 elif (( $rc == RC_ERROR )); then dspmsg -s $CLVT_SET $CLVT_MSGS 601 "\nERROR: the recovery effort has failed.\n\n" 1>&2 elif (( $rc == RC_SUCCESS )); then if (( recoveries > 0 )); then dspmsg -s $CLVT_SET $CLVT_MSGS 607 "Success. Any current event script failures have been recovered from (NOTE: more may occur).\n" else dspmsg -s $CLVT_SET $CLVT_MSGS 608 "There are no known event script failures in site \"%1\$s\" at the moment.\n" "$site" fi fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_recover_site()" el k|3+V bbb&V # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_refresh_mirror_groupncy#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_refresh_mirror_group.sh 1.1 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2ht-ml function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_refresh_mirror_group =head1 VERSION Version Number: 1.4 Last Extracted: 10/18/12 17:50:40 Last Changed: 10/8/12 12:21:43 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_refresh_mirror_group.sh, hacmp.assist, 61haes_r712, 1242B_hacmp712 =head1 SYNOPSIS clmgr refresh mirror_group [,,...] \ [ NODE= ] clmgr refresh mirror_group \ NODES=[,,...] \ [ SYSTEM_GROUPS={yes|no} ] clmgr refresh mirror_group \ SITE=[,] \ [ SYSTEM_GROUPS={yes|no} ] [ REPOSITORY_GROUP={yes|no} ] NOTE: the "refresh" action is only valid for DS-Series Inband (HyperSwap) NOTE: the alias for "mirror_group" is "mig". =head1 DESCRIPTION Attempts to refresh the specified HyperSwap mirror groups. =head1 ARGUMENTS 1. mirror_groups [OPTIONAL] [string] One or more HyperSwap mirror groups to refresh. 2. nodes [OPTIONAL] [string] The label of one or more cluster nodes. 3. sites [OPTIONAL] [string] The label of one or more cluster sites. 4. system_groups [OPTIONAL] [boolean] Indicates whether or not to include system mirror groups in the refresh. Defaults to "yes". 5. repository_group [OPTIONAL] [boolean] Indicates whether or not to include the repository mirror group in the refresh. Defaults to "yes". =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_refresh_mirror_group { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_refresh_mirror_group.sh, hacmp.assist, 61haes_r712, 1242B_hacmp712 : INPUTS: $* [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values CL=$LINENO OPERATION="refresh" KLIB_HACMP_replace_mirror_group "$@" log_return_msg "$?" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_refresh_mirror_group()" 3/ k~3+0bbb&0 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_remove_node_from_groupcy#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_remove_node_from_group.sh 1.5 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)04 1.5 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_remove_node_from_group.sh, hacmp.assist, 61haes_r714 6/11/12 09:03:50 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_remove_node_from_group =head1 VERSION Version Number: 1.5 Last Extracted: 1/31/14 04:40:15 Last Changed: 6/11/12 09:03:50 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_remove_node_from_group.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS KLIB_HACMP_remove_node_from_group =head1 DESCRIPTION Removes the specified node from a resource group, if the last node from a resource group is removed, then the entire resource group is removed from the HACMP configuration. This is as defined in libclres/clwritecf =head1 ARGUMENTS 1. rg [REQUIRED] [string] The name of the resource group that is to be modified. 2. rmnode [REQUIRED] [string] The name of the node that is to be removed from the specified resource group. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_remove_node_from_group { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.5, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_remove_node_from_group.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset rg=${1//\"/} typeset rmnode=${2//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -A newnodes typeset -i rc=$RC_UNKNOWN CL=$LINENO KLIB_HACMP_get_group_policy $rg startup fallover fallback (( $? != RC_SUCCESS )) && rc=$RC_ERROR if (( $rc == RC_UNKNOWN )); then CL=$LINENO KLIB_HACMP_get_group_nodes $rg nodes (( $? != RC_SUCCESS )) && rc=$RC_ERROR fi if (( $rc == RC_UNKNOWN )); then for node in $nodes; do if [[ "$rmnode" != "$node" ]]; then newnodes[$node]=: fi done print "$0()[$LINENO]($SECONDS): $HAUTILS/clchgrp -g $rg -n \"${!newnodes[*]}\" -S $startup -O $fallover -B $fallback" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clchgrp -g $rg -n "${!newnodes[*]}" -S $startup -O $fallover -B $fallback rc=$? print "clchgrp RC: $rc" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_remove_node_from_group()"  k@3+:<bbb&:< # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_replace_mirror_grouppcy#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_replace_mirror_group.sh 1.8 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2012,2013 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)53 1.8 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_replace_mirror_group.sh, hacmp.assist, 61haes_r714 5/15/13 17:23:58 #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2ht-ml function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_replace_mirror_group =head1 VERSION Version Number: 1.8 Last Extracted: 1/31/14 04:42:06 Last Changed: 5/15/13 17:23:58 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_replace_mirror_group.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr swap mirror_group [,,...] \ [ NODE= ] clmgr swap mirror_group \ NODES=[,,...] \ [ SYSTEM_GROUPS={yes|no} ] clmgr swap mirror_group \ SITE=[,] \ [ SYSTEM_GROUPS={yes|no} ] [ REPOSITORY_GROUP={yes|no} ] NOTE: the "swap" action is only valid for DS-Series Inband (HyperSwap) NOTE: the alias for "mirror_group" is "mig". =head1 DESCRIPTION Attempts to swap the specified HyperSwap mirror groups. =head1 ARGUMENTS 1. mirror_groups [OPTIONAL] [string] One or more HyperSwap mirror groups to swap. 2. nodes [OPTIONAL] [string] The label of one or more cluster nodes. 3. sites [OPTIONAL] [string] The label of one or more cluster sites. 4. system_groups [OPTIONAL] [boolean] Indicates whether or not to include system mirror groups in the swap. Defaults to "yes". 5. repository_group [OPTIONAL] [boolean] Indicates whether or not to include the repository mirror group in the swap. Defaults to "yes". =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. ############################################################################## # # Name: display_active_path_info # # Description: Formats the output from the "activepath" operation to # make it resembel the default clgr output format. # # Inputs: FILE A file containing the active path output # # Outputs: The formatted output is displayed on STDOUT. # # Returns: n/a # ############################################################################## function display_active_path_info { typeset FILE=$1 cat $FILE |\ while read LINE; do if (( ++COUNT % 2 )); then ATTRS=${LINE#*:} ATTRS="NODE:${ATTRS# }" else for VALUE in ${LINE//:/ }; do ATTRS=${ATTRS/:/=$VALUE$NL} done ATTRS="${ATTRS}=$VALUE" (( COUNT > 2 )) && print print -- "$ATTRS" fi done /usr/bin/rm -f $FILE } # End of "display_active_path_info()" function KLIB_HACMP_replace_mirror_group { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.8, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_replace_mirror_group.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset mirror_groups=${1//\"/} mirror_groups=${mirror_groups//,/ } typeset nodes=${2//\"/} nodes=${nodes//,/ } typeset sites=${3//\"/} sites=${sites//,/ } typeset -l system_groups=${4//\"/} typeset -l repository_group=${5//\"/} typeset OPERATION="$OPERATION" [[ -z $OPERATION ]] && OPERATION="swap" [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN cmd_rc=$RC_UNKNOWN typeset -i i=0 COUNT=0 typeset mirror_group="" node="" LINE="" ATTRS="" VALUE="" #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then log_return_msg "$RC_MISSING_DEPENDENCY" "$0()" "$LINENO" return $? fi #================= : Validate input #================= if [[ $mirror_groups != *([[:space:]]) ]]; then for mirror_group in $mirror_groups; do typeset TYPE= CL=$LINENO KLIB_HACMP_is_known_mirror_group $mirror_group TYPE if (( $? != RC_SUCCESS )); then rc=$RC_NOT_FOUND /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$mirror_group" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 167 "Available Mirror Groups:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_mirror_groups available TYPE=ds8k_inband_mm for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" elif [[ $TYPE != ds8k_inband_mm ]]; then rc=$RC_INCORRECT_INPUT /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 9999 "\nERROR: \"%1\$s\" is not a DS-Series Inband (HyperSwap) mirror group!\n\n" "$mirror_group" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 151 "Available Mirror Groups:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_mirror_groups available TYPE=ds8k_inband_mm for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi done fi if [[ $nodes != *([[:space:]]) ]]; then for node in $nodes; do CL=$LINENO KLIB_HACMP_is_known_node $node >/dev/null if (( $? != RC_SUCCESS )); then rc=$RC_NOT_FOUND /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$node" 1>&2 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 151 "Available Nodes:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_nodes available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi done fi if [[ $sites != *([[:space:]]) ]]; then typeset site="" typeset -i ERR=0 for site in $sites; do CL=$LINENO KLIB_HACMP_is_known_site $site >/dev/null if (( $? != RC_SUCCESS )); then rc=$RC_NOT_FOUND ERR=1 /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$site" 1>&2 fi done if (( ERR )); then /usr/bin/dspmsg -s $CLMGR_SET $CLMGR_MSGS 157 "Available Sites:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_sites available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi fi if [[ -n $system_groups && $system_groups != @(y|t|n|f)* ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" SYSTEM_GROUPS "$system_groups" 1>&2 /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 3 "Valid values: %1\$s\n\n" "yes, no" 1>&2 rc=$RC_INCORRECT_INPUT else case $system_groups in @(y|t)*) system_groups="yes" ;; @(n|f)*) system_groups="no" ;; esac fi if [[ -n $repository_group && $repository_group != @(y|t|n|f)* ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" REPOSITORY_GROUP "$repository_group" 1>&2 /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 3 "Valid values: %1\$s\n\n" "yes, no" 1>&2 rc=$RC_INCORRECT_INPUT else case $repository_group in @(y|t)*) repository_group="yes" ;; @(n|f)*) repository_group="no" ;; esac fi #===================================================================== : Perform the operation, $OPERATION, if no errors have been detected #===================================================================== if (( $rc == RC_UNKNOWN || $rc == RC_SUCCESS )); then typeset XD_CLI="/usr/es/sbin/cluster/xd_generic/xd_cli" if [[ $mirror_groups != *([[:space:]]) ]]; then for mirror_group in $mirror_groups; do typeset -A mgAttrs CL=$LINENO KLIB_HACMP_get_mirror_group_attributes "$mirror_group" mgAttrs if [[ ${mgAttrs[MG_TYPE]} == "system" ]]; then typeset node_list="$nodes" node_list=${node_list/${mgAttrs[SYS_MG_NODE]}/} [[ -n $node_list ]] && node_list=" $node_list" node_list="${mgAttrs[SYS_MG_NODE]}$node_list" : Swapping SYSTEM mirror group $mirror_groups via node $node_list print -- "$0()[$LINENO]($SECONDS): $XD_CLI/cl_clxd_manage_mg_smit -t sys -m \"$mirror_group\" -n \"$node_list\" -o $OPERATION" >>$CLMGR_TMPLOG $XD_CLI/cl_clxd_manage_mg_smit -t sys -m "$mirror_group" -n "$node_list" -o $OPERATION >$TMPDIR/clmgr.KHrmg.op.$$ cmd_rc=$? (( rc == RC_UNKNOWN || rc == RC_SUCCESS )) && rc=$cmd_rc unset node_list elif [[ -n ${mgAttrs[MG_TYPE]} ]]; then : Swapping ${mgAttrs[MG_TYPE]} mirror group $mirror_group print -- "$0()[$LINENO]($SECONDS): $XD_CLI/cl_clxd_manage_mg_smit -t ${mgAttrs[MG_TYPE]} -m \"$mirror_group\" -o $OPERATION" >>$CLMGR_TMPLOG $XD_CLI/cl_clxd_manage_mg_smit -t ${mgAttrs[MG_TYPE]} -m "$mirror_group" -o $OPERATION >$TMPDIR/clmgr.KHrmg.op.$$ cmd_rc=$? (( rc == RC_UNKNOWN || rc == RC_SUCCESS )) && rc=$cmd_rc print -- "$0()[$LINENO]($SECONDS): cl_clxd_manage_mg_smit RC: $rc" >>$CLMGR_TMPLOG else print -u2 " Usage error: clmgr $OPERATION mirror_group [,,...] \\ [ NODE= ] clmgr $OPERATION mirror_group \\ NODES=[,,...] \\ [ SYSTEM_GROUPS={yes|no} ] clmgr $OPERATION mirror_group \\ SITE=[,] \\ [ SYSTEM_GROUPS={yes|no} ] \\ [ REPOSITORY_GROUP={yes|no} ] " rc=$RC_MISSING_INPUT fi if [[ $OPERATION == "activepath" ]]; then display_active_path_info $TMPDIR/clmgr.KHrmg.op.$$ else cat $TMPDIR/clmgr.KHrmg.op.$$ /usr/bin/rm -f $TMPDIR/clmgr.KHrmg.op.$$ fi done # End of the mirror groups loop elif [[ -n $nodes ]]; then : Swapping mirror groups by nodes ${nodes// /, } [[ -z $system_groups ]] && system_groups="yes" print -- "$0()[$LINENO]($SECONDS): $XD_CLI/cl_clxd_manage_mg_smit -t node -n \"$nodes\" -s $system_groups -o $OPERATION" >>$CLMGR_TMPLOG $XD_CLI/cl_clxd_manage_mg_smit -t node -n "$nodes" -s $system_groups -o $OPERATION >$TMPDIR/clmgr.KHrmg.op.$$ cmd_rc=$? (( rc == RC_UNKNOWN || rc == RC_SUCCESS )) && rc=$cmd_rc if [[ $OPERATION == "activepath" ]]; then display_active_path_info $TMPDIR/clmgr.KHrmg.op.$$ else cat $TMPDIR/clmgr.KHrmg.op.$$ /usr/bin/rm -f $TMPDIR/clmgr.KHrmg.op.$$ fi elif [[ -n $sites ]]; then : Swapping mirror groups by sites ${sites// /, } [[ -z $system_groups ]] && system_groups="yes" [[ -z $repository_group ]] && repository_group="yes" print -- "$0()[$LINENO]($SECONDS): $XD_CLI/cl_clxd_manage_mg_smit -t site -i \"$sites\" -s $system_groups -r $repository_group -o $OPERATION" >>$CLMGR_TMPLOG $XD_CLI/cl_clxd_manage_mg_smit -t site -i "$sites" -s $system_groups -r $repository_group -o $OPERATION >$TMPDIR/clmgr.KHrmg.op.$$ cmd_rc=$? (( rc == RC_UNKNOWN || rc == RC_SUCCESS )) && rc=$cmd_rc if [[ $OPERATION == "activepath" ]]; then display_active_path_info $TMPDIR/clmgr.KHrmg.op.$$ else cat $TMPDIR/clmgr.KHrmg.op.$$ /usr/bin/rm -f $TMPDIR/clmgr.KHrmg.op.$$ fi fi fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then typeset ACTION="swap mirror_group" [[ $OPERATION == "activepath" ]] && ACTION="view mirror_group" [[ $OPERATION == "refresh" ]] && ACTION="manage mirror_group refresh" CL=$LINENO cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "$ACTION -h" "MIRROR GROUP:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_replace_mirror_group()" p  lR3+bbb&` # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_replace_repositoryp   =einorst $E_acdlp"CILMNOPRSfhmuy#()-.:>ADGTU[\]bgkvw&,/012;BFHKV!%'*4?Wqz{|}356x+79WtWY5%'"N` RL` !#8,X4<<*mmmmmmmmmO <+( "H""@d+wAsΞxV%0Q^,sCCLq59N,"(̜jcq pܫX 6N&w&5:lui)5"+ t8²-\`&xz8$N5H2C <+*r+CS//&kd5ܹœX蚗9Fo¿6ss&50i84j8VU<(9{^>oYT;+RBA:m]ww8_44 Mc'T;/&e]ˢ(*\X3Ց'(?2qEh': ̹MOSz'¿G+8kmcFs64 mmmmmmmmm̜jc LOMIIȹp4" JpRؼ=XX`z ??mp N` Y @ 4 LOMIIȹCh4ph014@0'H 4 `3% ?'WLvOE;PAPPN0dfA@q<^a1&Zf@P(\x( c&GR|2.yڀ ,`A 8du'"睨ԟ+ t((ŅjHx`du'"睨ԟ+ t@,XX> yX~"r.6X^Wt<^WY5$ܶ! ԟ+ t,<Ņ#>Wt uy [Po4(qƃ0h)Y4 M s>00jZIjF5@ $D% ?nemmOiSj"Umm?pۗ @BQL00ԴŅ#>Wt<\ !;iBs\MNIȹx* Lܟ6OE;q&"%T.yu +#fUiV@ojf狱Wt< *$rK|ڑ cz$D% ?2 ?? jT̹驉~tt23 ʌ2TqSR??k *ʡءC< 882eϞ&Q5" "$ IHmjOE:i8c3-͹Vd])mnpicih'9bmtq1\]ΘkʜRq9]F"i#dgMc5TqG,-@DK(ǒ ??&,-F{p,XX> cԴIX.nXl4&&]#h$LLD j%˕.ƍʺe 876w"d-)s&0DQŎoljQ8:ȚcqLPFs9*v]dԞ&|2.yv~ Oz&D%"PX ?qam23ŅjHxf00MKOaX[@!SHP#ۏ0@~00MKOQd5@"be0DˤL@xQ.\p>|CR!~w|g]d\󺬀ejylXX#/tu N`;ݐ鮻ܻ؜g24r=7-pE?Jr (@rHB¢ГY%` a Ht")@120&cP j%˕.F_&r<w|g]d\󺬀ejylXX#/ N`;ݐ鮻ܻ؜g24r=7-pE?Jr (@rHB¢aX azS.A!R"@h=Nܹ ``;i3 hA !;i T (BHzA$$6'"ǠIȹG+BO JHDJD&Y&A!u>Wt<=OE:?&8k5 Ԩ'Rzr  A0wR­mmmm~D솞2gdWtWGt#>Wt<i06:aX[B,_)Ul]d\.8qwRY%` a Ht")@120&c 1Drq(0] G4>UӆHh1~ 7uk]fu :8iE; ]6GR|2.y0@ ?T HBKDDJ?2̰,?n\BE E08zr  A0wRg HT%r @@+ LLCmpR#:dg+#Ycg p$`TLMKOz(TQ QRGk DˤaMH30 av\Ra]yM]d" ]6=22?k DˤaMH30222C$LLB*&$76 .E4&&]"f`h4j%˕.eg(7d3 (0]lET@DGU h@HH4b$@ZG%`Ҝ'|&XjuYѭ>]ό0 v~=OE:?iAdiR\DJ*\$"P azdLq6,ۃ0@#@ea2p@,6h 6N\``;i뽍=XX`Z TEKή96GR|2.yP+9A 'qV@oA:wAs솀iAdq8|a\Yc'nTUmmmmmmm;r((T )vːH1P&*-r dgŅjHxf00jZ h2+8;i "bT n@2b"TEE8i""@fY ?P-OE;P Qg*ljc 3Wt< La[mmmmmmmm~&S.|\iŎnm8ja.y48ÍXnadDjw"Ʀ04F܀qVmmmmmmmm8ɖYɖYKHI*$00jZ#i@sɖYG TXR\sQ<2Ƃ+᣺84`qhI TTRi;cI.' ?aX[ n#iMKO]lpz TTP~o*P%D H%HL!R#g[Q)"*a"2"X Q)"*a"2"X t8bwAs&68aa"QF0↧ "#WtWGuLpi%!a3 a$`M";i뽍@4JIDS  *P$ kt "$]L$X&DK4 "$]L$X&DK.lR|2.y``Դ,,0YDJ"PZ TPDw"ȉf\ Ѓ#"IPms/q\z {IȹEv.=IDS  qcF""@h19l>.&V#!i6Hp@AHPbED]lq$D% aJ  CNDŽDH-=G,Wt<@ RE,TEdDvMi6N""@h19l4 ǵ3sP` .2Ċ"$ + vQ)"*a"2"C;r4F v LڙddJ zXy뽍=XX`DQ "@A#I"$ '&&]!Be?ʛ^=F@ǨAQb$LLB*&cc @12 ,Hf'MQ"xp.qA<&WtbqH=Aaa"QGǷ@ ?2̰­mmmmmmxq7!YlXef\&lE:Ummmmmmȉ"PP@%Q JHDJƦ"LؒqOdu'"@Q$Lȉ"PP@%qy?Tg zr "\R``;iR\E $**PK²qCZek DˤaMH30LxlY1,hka7,p<]1زc+I T (BHzA$!4v Q5r ΘlY1.~4)1زc+H0aW8lY1Y  p,XX> c&68in<^(&œZE`<,?W6O]lpӀxg zr  A0wR{47$J D.SW(tK0Ah.b,"%D H%HTT]BH&V]L$LD 1ƨ"Qq{ IV@oD@XȉǠ]BH.b&DFU'PO Pک=Lr  A0ޥACj2g z r0*@& a&᤟18nXz (B|۠e8hD H%H4p83@ RE,TEdDjZ$76 .E4&&]"f`@ NjʗqŕejvntڮX&DKq&|jIlw"dñV2vܤʡh |ڑ c.A$K*\~=XX`zDQbqO2a,/Av$`TL;Av$*P$PS q5-?pQ<AJ,r9iVmmmmmm??&8jwqv4˞m8SeVmmmmmm?qal4 *HI"*a"$;?@.b,"% RY%` a Ht")@120&cF<].T~,GVc/6S3sr2"[5:lw"dñV2vܤʡh |ڑ c.A$K*\~=XX`zDQbqO2 mmmmmmmO`7Wq5:jDkuMmɩ& N6m6GsM3mLjMb if~Wt2@AHPbED?pۗ R0c q5-?*mmmmmmOk59EB2YmmѝVaq??MqcñCLjV^UN, nܤʬh:Ț0WGuLpi%!a3 a$`M";i뽍@4JIDS  *P$ea;r0*@& `p;r((T )mmmmmmiy]dԞ&|2.yݍjsa6M{'­mmmmmm?wǠ @*0H($`0?Qci1|a Q)"*a"2"Xkt (TI U?@"be&XQ3XmLj_+haD H%HL E22Ux*I뽍=Eƥ򻡗 $LLB*'XélmW|<Uju#qiN]d\p#j _|2.y5c VU.y7d4bɌ!8X^ːH18.b,"% 823 T@!RDSrƦ8kp/jf=(19l42gIȹpeǨ'$$M7?aP!􍜄R]yMqjqyZ[59- jyUs,G2ƫ 68[MsP­mmmmmmmmm²NQ5obc+L e c0 6d?k<+c!V& xUmmmmmmmmmxV8aS\8aXG tڬS<*mmmmmmmmmm< k 3+ bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_reset_clustertoryp#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_reset_cluster.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)59 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_reset_cluster.sh, hacmp.assist, 61haes_r714 6/11/12 09:03:53 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_reset_cluster =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:19 Last Changed: 6/11/12 09:03:53 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_reset_cluster.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr reset cluster =head1 DESCRIPTION Resets all the tunables (customizations) made to the cluster, returning all options to their default values, but not changing the configuration. The cluster will need to be synchronized after this operation. =head1 ARGUMENTS None. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_reset_cluster { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_reset_cluster.sh, hacmp.assist, 61haes_r714 : INPUTS: $* [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN #=============================== : See if a cluster even exists #=============================== CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #========================================================== : Reset the cluster if no input errors have been detected #========================================================== else print "$0()[$LINENO]($SECONDS): $HAUTILS/clsnapshot -t" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clsnapshot -t rc=$? print "clsnapshot RC: $rc" >>$CLMGR_TMPLOG # Always log command result (( $rc != $RC_SUCCESS )) && rc=$RC_ERROR fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_reset_cluster()" < kR3+Vbbb&V # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_respond_sitetoryp#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r721 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_respond_site.sh 1.2.1.1 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2013,2016 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)77 1.2.1.1 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_respond_site.sh, hacmp.assist, 61haes_r721, 1612A_hacmp721 3/10/16 01:03:26 #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_respond_site =head1 VERSION Version Number: 1.2.1.1 Last Extracted: 3/23/16 01:09:00 Last Changed: 3/10/16 01:03:26 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_respond_site.sh, hacmp.assist, 61haes_r721, 1612A_hacmp721 =head1 SYNOPSIS clmgr manage site respond {continue|recover} =head1 DESCRIPTION Allows a manual response to a split or merge event. =head1 ARGUMENTS 1. response [REQUIRED] [set] The response to take for a split or merge event. Valid values: continue, recover =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2013 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_respond_site { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2.1.1, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_respond_site.sh, hacmp.assist, 61haes_r721, 1612A_hacmp721 : INPUTS: $* typeset -l response=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== # Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN #================= # Validate input #================= if [[ $response == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 101 "\nERROR: this operation requires the \"%1\$s\" attribute.\n\n" NETWORK 1>&2 rc=$RC_MISSING_INPUT else CL=$LINENO verify_in_set RESPONSE "$response" "Continue, Recover" response (( $? != RC_SUCCESS )) && rc=$RC_INCORRECT_INPUT fi if (( rc == RC_UNKNOWN )); then #============================================ : Handle the response, $response, if needed #============================================ typeset continue=$(dspmsg -s 58 cluster.cat 77 'Continue\n') cl_smm_check >$TMPDIR/clmgr.KHrs.$$ 2>&1 rc=$? if (( $rc != RC_SUCCESS )); then if (( rc == RC_NOT_FOUND )); then # No manual response was required rc=$RC_INCORRECT_INPUT cat $TMPDIR/clmgr.KHrs.$$ else rc=$RC_ERROR cat $TMPDIR/clmgr.KHrs.$$ 1>&2 fi elif [[ $response == $continue ]] then # : This node *is* part of the chosen surviving site # CL=$LINENO cl_dspmsg -s 58 cluster.cat 79 "You have chosen for this side of the partitioned cluster to continue. You must now specify, on a node on the other side of the partitioned cluster, that it recover for PowerHA SystemMirror to completely recover from the split or merge." /usr/es/sbin/cluster/utilities/cl_sm_continue # you win some rc=$? else # : This node is *not* part of the chosen surviving site # CL=$LINENO cl_dspmsg -s 58 cluster.cat 80 "You have chosen for this side of the partitioned cluster to recover. You must now specify, on a node on the other side of the partitioned cluster, that it continue for PowerHA SystemMirror to completely recover from the split or merge." /usr/es/sbin/cluster/utilities/cl_sm_recover # you lose some rc=$? fi [[ -f $TMPDIR/clmgr.KHrs.$$ ]] && rm -f $TMPDIR/clmgr.KHrs.$$ fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_respond_site()" == kC3+bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_restore_snapshotyp#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_restore_snapshot.sh 1.4 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_restore_snapshot.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_restore_snapshot =head1 SYNOPSIS clmgr manage snapshot restore \ [ CONFIGURE={yes|no} ] \ [ FORCE={no|yes} ] clmgr manage snapshot restore \ NODES=, \ REPOSITORIES=[,][:[,]] \ [ CLUSTER_NAME= ] \ [ CONFIGURE={yes|no} ] \ [ FORCE={no|yes} ] NOTE: for "REPOSITORIES", any disks specified after the colon will be applied to the second site. This only applies to linked cluster. NOTE: the alias for "snapshot" is "sn". =head1 DESCRIPTION Apply the specified snapshot to the local cluster, blowing away the current configuration in the process (i.e. replacing it with the contents of the snapshot). =head1 ARGUMENTS 1. snapshot [REQUIRED] [string] The name of the snapshot that will be restored. 2. configure [OPTIONAL] [string] A Boolean-like indicator that indicates (yes*/no) whether or not to configure resources during the restore, as needed. 3. force [OPTIONAL] [string] A Boolean-like indicator that indicates (yes/no*) whether or not to force the restoration to continue even if a verification error is detected. 4. nodes [REQUIRED] [string] This option should only be used when a cluster copy operation is intended (i.e. restoring a snapshot from a different cluster to the local cluster). This is the list of nodes that will be used to replace the nodes defined within the snapshot. 5. repositories [REQUIRED] [string] This option should only be used when a cluster copy operation is intended (i.e. restoring a snapshot from a different cluster to the local cluster). This is the repository disk list that will replace the disk(s) defined within the snapshot. 6. cluster_name [OPTIONAL] [string] This option should only be used when a cluster copy operation is intended (i.e. restoring a snapshot from a different cluster to the local cluster). This value will replace the cluster name defined within the snapshot. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. function KLIB_HACMP_restore_snapshot { . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_restore_snapshot.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset snapshot=${1//\"/} typeset -l configure=${2//\"/} typeset -l force=${3//\"/} typeset nodes=${4//\"/} typeset repositories=${5//\"/} typeset cluster_name=${6//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset Copt= fopt= HOpt= DOpt= LOpt= typeset -i rc=$RC_UNKNOWN #===================== : Validate the input #===================== if [[ -z $snapshot ]]; then dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 dspmsg -s $CLMGR_SET $CLMGR_MSGS 158 "Available Snapshots:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_snapshots available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_MISSING_INPUT elif [[ -n $configure && $configure != @(y|t|n|f)* ]]; then dspmsg -s $CLVT_SET $CLVT_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" CONFIGURE "$configure" 1>&2 dspmsg -s $CLVT_SET $CLVT_MSGS 3 "Valid values: %1\$s\n\n" "yes, no" 1>&2 rc=$RC_INCORRECT_INPUT elif [[ -n $force && $force != @(y|t|n|f)* ]]; then dspmsg -s $CLVT_SET $CLVT_MSGS 110 "\nERROR: invalid value specified for \"%1\$s\": \"%2\$s\".\n" FORCE "$force" 1>&2 dspmsg -s $CLVT_SET $CLVT_MSGS 3 "Valid values: %1\$s\n\n" "no, yes" 1>&2 rc=$RC_INCORRECT_INPUT else [[ $configure == @(n|f)* ]] && Copt=" -C" [[ $force == @(y|t)* ]] && fopt=" -f true" || fopt=" -f false" [[ $nodes != *([[:space:]]) ]] && HOpt=" -H ${nodes//+( )/,}" [[ $repositories != *([[:space:]]) ]] && DOpt=" -D ${repositories//+( )/,}" [[ $cluster_name != *([[:space:]]) ]] && LOpt=" -L $cluster_name" print "$0()[$LINENO]($SECONDS): clsnapshot -a -n \"$snapshot\"$fopt$Copt$HOpt$DOpt$LOpt" >>$CLMGR_TMPLOG # Always log commands clsnapshot -a -n "$snapshot"$fopt$Copt$HOpt$DOpt$LOpt rc=$? print "clsnapshot RC: $rc" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "restore snapshot -h" "SNAPSHOT:" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_restore_snapshot()" be used k"3+)9bbb&)9 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_resume_app_monitoringcy#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2018,2020,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_resume_app_monitoring.sh 1.4 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 6fdea0a 43haes/lib/ksh93/hacmp/KLIB_HACMP_resume_app_monitoring.sh, 726, 2147A_aha726, Jun 09 2021 09:12 PM #============================================================================ # # Name: KLIB_HACMP_resume_app_monitoring # # Description: This is the main, FPATH function that is invoked by clmgr # to resume application monitoring for a specific application # running within a specific resource group. # # Inputs: See the "devDoc()" function, below. # # Outputs: Informational messages are written to STDOUT, and any error # messages that might be needed are written to STDERR. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function, above, for the standard return\ # code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_resume_app_monitoring { . $HALIBROOT/log_entry "$0()" "$CL" : version= @(#) 6fdea0a 43haes/lib/ksh93/hacmp/KLIB_HACMP_resume_app_monitoring.sh, 726, 2147A_aha726, Jun 09 2021 09:12 PM : INPUTS: $* typeset application=${1//\"/} typeset rg=${2//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i LIST_APPS=1 typeset -i BAD_RG=0 typeset -u APP_UC=$application [[ $CLMGR_TIMEOUT != +([[:digit:]]) ]] && CLMGR_TIMEOUT=60 (( $CLMGR_TIMEOUT < 10 )) && CLMGR_TIMEOUT=10 #===================== : Validate the input #===================== if [[ -z $application ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif [[ $APP_UC != "ALL" ]]; then CL=$LINENO KLIB_HACMP_is_known_appserver "$application" >/dev/null 2>&1 if (( $? == RC_SUCCESS )); then LIST_APPS=0 else dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$application" 1>&2 rc=$RC_NOT_FOUND fi fi if [[ $APP_UC != "ALL" ]] && (( LIST_APPS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 141 "Available Applications:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_appservers available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi if [[ $APP_UC != "ALL" ]]; then if [[ -z $rg ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 101 '\nERROR: this operation requires the "%1$s" attribute.\n\n' RESOURCE_GROUP 1>&2 rc=$RC_MISSING_INPUT BAD_RG=1 else CL=$LINENO KLIB_HACMP_is_known_rg "$rg" >/dev/null 2>&1 if (( $? != RC_SUCCESS )) then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$rg" 1>&2 rc=$RC_NOT_FOUND BAD_RG=1 fi fi if (( BAD_RG )) then dspmsg -s $CLMGR_SET $CLMGR_MSGS 154 "Available Resource Groups:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_resourcegroups available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi fi # : Make sure the cluster is up and running # typeset CSTATE=$(CL=$LINENO KLIB_HACMP_get_cluster_state) if [[ $CSTATE != "STABLE" ]]; then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1300 '\nERROR: The cluster is not online, so this operation cannot be performed.\n\n' 1>&2 rc=$RC_MISSING_DEPENDENCY fi #================================================================== : Only proceed with the operation if the result is still unknown, : which means no input errors have been encounter. #================================================================== if (( $rc == RC_UNKNOWN )); then #========================================================== : Create an array populated with all application/RG pairs #========================================================== typeset -i index=0 typeset -A rgattrs typeset arr= if [[ $APP_UC == "ALL" ]]; then for pair in $(clodmget -n -q "name=APPLICATIONS" -f value,group HACMPresource); do arr[$index]="$pair" (( index++ )) done else arr[$index]="$application:$rg" fi for (( index=0; index<${#arr[*]}; index++ )); do application=${arr[$index]%:*} rg=${arr[$index]#*:} # : Make sure resource group "$rg" is up and running # CL=$LINENO KLIB_HACMP_get_resourcegroup_state "$rg" rgattrs if [[ ${rgattrs[STATE]} != "ONLINE" ]] then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1301 '\nERROR: Resource group "%1$s" is not online, so this operation cannot be performed.\n\n' "$rg" 1>&2 rc=$RC_MISSING_DEPENDENCY continue else # : Make sure that monitoring for application "$application" : is in a suspended state for resource group "$rg" # typeset -u MSTATE=$(LC_ALL=C clRGinfo -c -m $rg 2>/dev/null | grep -w "$application" | cut -d: -f5) if [[ $MSTATE != *SUSPENDED* && $MSTATE != *FAILED* ]] then dspmsg -s $CLMGR_SET $CLMGR_MSGS 1460 '\nERROR: Application monitoring is already active.Current state is "%1$s" for application "%2$s" in resource group "%3$s".\n\n' "$MSTATE" "$application" "$rg" >&2 rc=$RC_ERROR continue fi fi print "$0()[$LINENO]($SECONDS): cl_RMupdate resume_appmon \"$application\" \"$rg\"" >>$CLMGR_TMPLOG # Always log commands cl_RMupdate resume_appmon "$application" "$rg" >>$CLMGR_TMPLOG 2>$TMPDIR/cl_RMupdate.$$ rc=$? print "$0()[$LINENO]($SECONDS): cl_RMupdate resume_appmon RC: $rc" >>$CLMGR_TMPLOG # Always log command result # : Load all the known, translated error strings from cl_RMupdate. # These strings match those found in clRMupdate.sh. # typeset CL_RMUPDATE_ERRORS CL_RMUPDATE_ERRORS[0]=$(cl_echo 9665 "cl_RMupdate: Failed to resume monitor(s) for application $application.\n" cl_RMupdate $application 2>&1) CL_RMUPDATE_ERRORS[1]=$(cl_echo 5002 "ERROR: cl_RMupdate: Unable to update the Cluster Manager with parameters resume_appmon and [0-9]+! Manual intervention may be required!\n" cl_RMupdate resume_appmon '[0-9]+' 2>&1) # : Check the STDERR file for known error messages. This is done : because it is not possible to trust the return code from that : utility. We can only check for error strings in the output. # for (( i=0; i < ${#CL_RMUPDATE_ERRORS[*]}; i++ )) do if [[ -n ${CL_RMUPDATE_ERRORS[$i]} ]] then grep -q "${CL_RMUPDATE_ERRORS[$i]}" $TMPDIR/cl_RMupdate.$$ if (( $? == 0 )) then rc=$RC_ERROR # Display on STDERR grep "${CL_RMUPDATE_ERRORS[$i]}" $TMPDIR/cl_RMupdate.$$ 1>&2 fi fi done cat $TMPDIR/cl_RMupdate.$$ >>$CLMGR_TMPLOG rm -f $TMPDIR/cl_RMupdate.$$ # Remove the temporary data file if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR break else # These changes don't happen instantly, so wait for the state to change cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1307 'Beginning the process of resuming monitoring. Waiting up to %1$d seconds for the state change to take effect...\n' "$CLMGR_TIMEOUT" typeset -u MSTATE="" for (( TRY=0; TRY/dev/null | grep -w "$application" | cut -d: -f5) if [[ -n $MSTATE && $MSTATE != *SUSPENDED* ]] then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1306 'Monitoring for application "%1$s", running in resource group "%2$s", has resumed successfully.\n' "$application" "$rg" break fi sleep 1 done if [[ -z $MSTATE || $MSTATE == *SUSPENDED* ]] then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1304 'Warning: the state change has not completed in the allotted time (%1$d seconds).\n' "$CLMGR_TIMEOUT" 1>&2 rc=$RC_ERROR fi fi done fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2$s\" in the displayed text.\n\n" \ "manage application resume -h" "APPLICATION:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_resume_app_monitoring()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_resume_app_monitoring =head1 SYNOPSIS clmgr manage application resume \ RESOURCE_GROUP= CLMGR_TIMEOUT Optional. Externally set in the environment. Sets the upper limit to wait for the overall operation to complete. If this limit is reached, an error is displayed and no results are returned. =head1 DESCRIPTION Resumes application monitoring for the specified application. =head1 ARGUMENTS 1. application [REQUIRED] [string] The name of the application whose monitoring will be resumed. 2. rg [REQUIRED] [string] The resource group that manages the application. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== GR_SET  k3+Abbb&A # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_run_command#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_run_command.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)05 1.3 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_run_command.sh, hacmp.assist, 61haes_r720, 1542B_hacmp720 9/30/15 12:00:04 #============================================================================ # # Name: KLIB_HACMP_run_command # # Description: Allows arbitrary commands to be run within the clmgr context, # including logging into the clmgr log file. # # Inputs: See the "devDoc()" function, below. # # Outputs: None. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function, below, for the standard return # code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_run_command { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_run_command.sh, hacmp.assist, 61haes_r720, 1542B_hacmp720 : INPUTS: $* [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values typeset -i rc=$RC_UNKNOWN if [[ -n "$@" ]]; then print "$0()[$LINENO]($SECONDS): $@" >>$CLMGR_TMPLOG # Always log commands eval "$@" rc=$? print "$(basename ${1%% *}) RC: $rc" >>$CLMGR_TMPLOG # Always log command result else print -u2 "\nERROR: no command was specified!\n\n" rc=$RC_ERROR fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_run_command()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_run_command =head1 VERSION Version Number: 1.3 Last Extracted: 10/15/15 19:21:01 Last Changed: 9/30/15 12:00:04 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_run_command.sh, hacmp.assist, 61haes_r720, 1542B_hacmp720 =head1 SYNOPSIS KLIB_HACMP_run_command =head1 DESCRIPTION Runs the specified commands. =head1 ARGUMENTS "$@" The commands and arguments to be run. =head1 RETURN The return code from the last command is returned. =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2010,2015 All Rights Reserved =cut } # End of POD-formatted documentation. #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== unction krk3+=bbb&= # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_run_discoveryitorin#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2019,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_run_discovery.sh 1.6 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2013 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_run_discovery.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_run_discovery =head1 SYNOPSIS clmgr discover cluster clmgr discover interfaces clmgr discover volume_groups =head1 DESCRIPTION Runs discovery on the cluster, and returns the discovered IP and volume group information to the caller. =head1 ARGUMENTS 1. vginfo [OPTIONAL] [hash ref] A reference to an associate array that will be used to return all discovered volume group information. 2. ipinfo [OPTIONAL] [hash ref] A reference to an associate array that will be used to return all discovered IP information. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. function KLIB_HACMP_run_discovery { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_run_discovery.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset -u disc_type=$_CLASS if [[ -n $1 ]]; then typeset -n vginfo=$1 if [[ -n $2 && $2 != $1 ]]; then typeset -n ipinfo=$2 else typeset -A ipinfo fi else typeset -A vginfo ipinfo fi [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset NO_CLUSTER=0 typeset STDOUT_FILE=$TMPDIR/clmgr.KHrd.out.$$ typeset STDERR_FILE=$TMPDIR/clmgr.KHrd.err.$$ typeset NODES="" CL=$LINENO isClusterDefined >$STDOUT_FILE 2>&1 NO_CLUSTER=$? if (( NO_CLUSTER )) && (( ! CLMGR_VERBOSE || ! CLMGR_FORCE )); then /usr/bin/cat $STDOUT_FILE 1>&2 /usr/bin/rm -f $STDOUT_FILE log_return_msg "$RC_MISSING_DEPENDENCT" "$0()" "$LINENO" return $? elif (( NO_CLUSTER && CLMGR_VERBOSE && CLMGR_FORCE )); then NODES=${_ENV_ARGS[NODES]} [[ $NODES == *([[:space:]]) ]] && NODES=$(/usr/bin/hostname) #=================================================================== # On the rare possibility that the host dies before this script # is done operating, meaning no HACMPnode cleanup would occur, # add an entry to the inittab to make sure that the cleanup takes # place when the host is brought back up. Note that if this script # completes normally, the inittab will be removed. #=================================================================== typeset ODMFILE="$TMPDIR/odm_nodes.$$" rm -f $ODMFILE print '\ if [ -z `/usr/bin/odmget HACMPcluster` ]; then /usr/bin/odmdelete -o HACMPnode fi rmitab hadisccln rm -f $ODMFILE rm -f $0 ' >$TMPDIR/hadisccln mkitab "hadisccln:2:once:/bin/ksh $TMPDIR/hadisccln >/dev/null 2>&1" typeset node="" host="" typeset cversion=$(grep CLUSTERVERSION= $HAETC/rc.cluster) cversion=${cversion##*=} for node in ${NODES//,/ }; do host $node | read host rest if (( $? != 0 )); then cl_dspmsg -s $CLVT_SET $CLVT_MSGS 9999 '\nERROR: "%1$s" could not be resolved via the /usr/bin/host command. Please make sure that "%1$s" is correctly defined in the /etc/hosts file.\n\n' "$node" 1>&2 return $RC_INCORRECT_INPUT fi print " HACMPnode: ${TAB}name = \"${node%%\.*}\" ${TAB}object = \"COMMUNICATION_PATH\" ${TAB}value = \"$host\" ${TAB}node_id = 0 ${TAB}node_handle = 0 ${TAB}version = $cversion" >>$ODMFILE done # Add the temporary HACMPnode entries odmadd <$ODMFILE rm -f $ODMFILE print "$0()[$LINENO]($SECONDS): $HADIAG/clver -Nv" >>$CLMGR_TMPLOG $HADIAG/clver -Nv >$STDOUT_FILE 2>$STDERR_FILE rc=$? print "clver RC: $rc" >>$CLMGR_TMPLOG print "$0()[$LINENO]($SECONDS): $HAUTILS/clharvest_vg -w" >>$CLMGR_TMPLOG $HAUTILS/clharvest_vg -w >$STDOUT_FILE 2>$STDERR_FILE rc=$? print "clharvest_vg RC: $rc" >>$CLMGR_TMPLOG elif [[ $disc_type == "INTERFACE" ]]; then print "$0()[$LINENO]($SECONDS): $HADIAG/clver -Nv" >>$CLMGR_TMPLOG # Always log commands $HADIAG/clver -Nv >$STDOUT_FILE 2>$STDERR_FILE rc=$? print "clver RC: $rc" >>$CLMGR_TMPLOG # Always log command result elif [[ $disc_type == "VOLUME_GROUP" ]]; then print "$0()[$LINENO]($SECONDS): $HAUTILS/clharvest_vg -w" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clharvest_vg -w >$STDOUT_FILE 2>$STDERR_FILE rc=$? print "clharvest_vg RC: $rc" >>$CLMGR_TMPLOG # Always log command result else print "$0()[$LINENO]($SECONDS): $HAUTILS/clmodclstr -K" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clmodclstr -K >$STDOUT_FILE 2>$STDERR_FILE rc=$? print "clmodclstr RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi (( $rc != RC_SUCCESS )) && rc=$RC_ERROR if (( $rc == RC_SUCCESS )); then if [[ $disc_type == "INTERFACE" ]]; then if [[ -r $HAETC/config/clip_config ]]; then typeset node="" interface_description="" iplabel="" ip_int="" typeset ip="" netmask_int="" netmask="" subnet_int="" subnet="" typeset logical_interface="" logical_adapter="" typeset hardware_address="" state="" nim_type="" attr_type="" typeset discoveredNet="" macaddr="" pair="" network="" rest="" while IFS='#' read node interface_description \ iplabel ip_int ip netmask_int netmask \ subnet_int subnet logical_interface logical_adapter \ hardware_address state nim_type attr_type discoveredNet \ rest do [[ -z $ip ]] && continue LC_ALL=C lscfg -vl $logical_adapter |\ grep -w "Address" | read hardware_address hardware_address=${hardware_address##*\.} macaddr="" for (( i=0; i<${#hardware_address}; i+=2 )); do pair=${hardware_address:$i:2} [[ -n $macaddr ]] && macaddr="$macaddr:" macaddr="$macaddr$pair" done if [[ $discoveredNet == +([[:digit:]]) ]]; then (( $discoveredNet == 0 )) && discoveredNet=1 if (( $discoveredNet < 10 )); then network="net_ether_0$discoveredNet" else network="net_ether_$discoveredNet" fi fi ipinfo[${ip%%/*}]="${node//:*/}|$iplabel|$nim_type|$subnet|$netmask|$logical_interface|$logical_adapter|$macaddr|$state|$nim_type|$network|$attr_type" done < $HAETC/config/clip_config fi fi if [[ $disc_type == "VOLUME_GROUP" ]]; then if [[ -r $HAETC/config/clvg_config ]]; then typeset node="" pv="" pvid="" vg="" major="" ecm="" typeset status="" quorum="" local="" type="" size="" while IFS=':' read node pv pvid vg major ecm status \ quorum local type size do [[ -z $vg ]] && continue pv=${pv# } node=${node//:*/} [[ $node != $LOCAL_NODE ]] && continue [[ $quorum == "0" ]] && quorum="false" || quorum="true" [[ $ecm == "0" ]] && ecm="false" || ecm="true" [[ -n ${vginfo[$vg]} ]] && vginfo[$vg]="${vginfo[$vg]}$NL" vginfo[$vg]="${vginfo[$vg]}$node|$pv|$pvid|$major|$ecm|$status|$quorum|$local|$type|$size" done < $HAETC/config/clvg_config for vg in ${!vginfo[*]}; do vginfo[$vg]=$(print -- "${vginfo[$vg]}" | sort) done fi fi if (( CLMGR_VERBOSE )); then case $disc_type in INTERFACE) typeset -A props typeset -i INDEX=1 for ip in ${!ipinfo[*]}; do print -- ${ipinfo[$ip]} | IFS=\| read node iplabel nim_type subnet netmask logical_interface logical_adapter macaddr state nim_type network attr_type rest props[NAME$INDEX]=$iplabel props[TYPE$INDEX]="boot" props[INTERFACE$INDEX]=$logical_interface props[IPADDR$INDEX]=${ip%%/*} props[NETMASK$INDEX]=$netmask props[NODE$INDEX]=${node//:*/} props[STATE$INDEX]=$state props[NETTYPE$INDEX]=$nim_type props[NETWORK$INDEX]=$network props[ATTR$INDEX]=$attr_type props[STATE$INDEX]=$state props[HADDR$INDEX]=$macaddr (( INDEX++ )) done # End of the IP address loop CL=$LINENO SerializeAsAssociativeArray props interface ;; VOLUME_GROUP) typeset -A props typeset -u type="" typeset VGS="" for vg in ${!vginfo[*]}; do [[ $vg == "None" ]] && continue [[ " $VGS " != *\ $vg\ * ]] && VGS="$VGS $vg" done typeset -i INDEX=1 for vg in $VGS; do typeset -i DISK_CNT=1 for vglabel in ${!vginfo[*]}; do [[ $vglabel != $vg ]] && continue print -- "${vginfo[$vg]}" |\ while read LINE; do print -- "$LINE" |\ IFS=\| read node pv pvid major ecm status \ quorum local type size rest if (( DISK_CNT == 1 )); then props[NAME$INDEX]=$vg props[PHYSICAL_VOLUMES$INDEX]="$pv@$pvid" props[CONCURRENT_ACCESS$INDEX]=$ecm props[QUORUM$INDEX]=$quorum props[MAJOR_NUMBER$INDEX]=$major if [[ $type != "UNKNOWN" ]]; then props[TYPE$INDEX]=$type fi else props[PHYSICAL_VOLUMES$INDEX]="${props[PHYSICAL_VOLUMES$INDEX]},$pv@$pvid" if [[ $type != "UNKNOWN" ]]; then props[TYPE$INDEX]=$type fi fi (( DISK_CNT++ )) done done if [[ ${props[TYPE$INDEX]} == "" ]]; then for pv in ${props[PHYSICAL_VOLUMES$INDEX]//,/ }; do pv=${pv%%@*} /usr/sbin/lqueryvg -Atp $pv |\ while IFS= read LINE; do if [[ $LINE == MAX\ PVs:* ]]; then LINE=${LINE##*+([[:space:]])} if [[ $LINE == +([[:digit:]]) ]]; then if (( $LINE < 128 )); then LINE="ORIGINAL" elif (( $LINE < 1024 )); then LINE="BIG" else LINE="SCALABLE" fi fi props[TYPE$INDEX]=$LINE fi [[ -n ${props[TYPE$INDEX]} ]] && break done done fi (( INDEX++ )) done # End of the volume group loop CL=$LINENO SerializeAsAssociativeArray props volume_group ;; esac fi fi if (( ! CLMGR_VERBOSE || $rc != RC_SUCCESS )); then [[ -s $STDOUT_FILE ]] && /usr/bin/cat $STDOUT_FILE [[ -s $STDERR_FILE ]] && /usr/bin/cat $STDERR_FILE 1>&2 elif (( CLMGR_VERBOSE || $rc == RC_SUCCESS )); then [[ -s $STDOUT_FILE ]] && /usr/bin/cat $STDOUT_FILE >>$CLMGR_TMPLOG [[ -s $STDERR_FILE ]] && /usr/bin/cat $STDERR_FILE >>$CLMGR_TMPLOG fi [[ -f $STDOUT_FILE ]] && /usr/bin/rm -f $STDOUT_FILE [[ -f $STDERR_FILE ]] && /usr/bin/rm -f $STDERR_FILE if (( NO_CLUSTER && CLMGR_FORCE && CLMGR_VERBOSE )); then # Time to clean up odmdelete -o HACMPnode >>$CLMGR_TMPLOG 2>&1 rmitab hadisccln >>$CLMGR_TMPLOG 2>&1 rm -f $TMPDIR/hadisccln >>$CLMGR_TMPLOG 2>&1 rm -f $HAETC/config/clip_config $HAETC/config/clvg_config fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_run_discovery()"  k>3+9bbb&9 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_suspend_app_monitoringcy#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2018,2020,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_suspend_app_monitoring.sh 1.4 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#) 6fdea0a 43haes/lib/ksh93/hacmp/KLIB_HACMP_suspend_app_monitoring.sh, 726, 2147A_aha726, Jun 09 2021 09:12 PM #============================================================================ # # Name: KLIB_HACMP_suspend_app_monitoring # # Description: This is the main, FPATH function that is invoked by clmgr # to suspend application monitoring for a specific application # running within a specific resource group. # # Inputs: See the "devDoc()" function, below. # # Outputs: Informational messages are written to STDOUT, and any error # messages that might be needed are written to STDERR. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function, above, for the standard return\ # code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_suspend_app_monitoring { . $HALIBROOT/log_entry "$0()" "$CL" : version= @(#) 6fdea0a 43haes/lib/ksh93/hacmp/KLIB_HACMP_suspend_app_monitoring.sh, 726, 2147A_aha726, Jun 09 2021 09:12 PM : INPUTS: $* typeset application=${1//\"/} typeset rg=${2//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i LIST_APPS=1 typeset -i BAD_RG=0 typeset -u APP_UC=$application [[ $CLMGR_TIMEOUT != +([[:digit:]]) ]] && CLMGR_TIMEOUT=60 (( $CLMGR_TIMEOUT < 10 )) && CLMGR_TIMEOUT=10 #===================== : Validate the input #===================== if [[ -z $application ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 RC=$RC_MISSING_INPUT elif [[ $APP_UC != "ALL" ]]; then CL=$LINENO KLIB_HACMP_is_known_appserver "$application" >/dev/null 2>&1 if (( $? == RC_SUCCESS )); then LIST_APPS=0 else dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$application" 1>&2 rc=$RC_NOT_FOUND fi fi if [[ $APP_UC != "ALL" ]] && (( LIST_APPS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 141 "Available Applications:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_appservers available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi if [[ $APP_UC != "ALL" ]]; then if [[ -z $rg ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 101 '\nERROR: this operation requires the "%1$s" attribute.\n\n' RESOURCE_GROUP 1>&2 rc=$RC_MISSING_INPUT BAD_RG=1 else CL=$LINENO KLIB_HACMP_is_known_rg "$rg" >/dev/null 2>&1 if (( $? != RC_SUCCESS )) then dspmsg -s $CLMGR_SET $CLMGR_MSGS 102 '\nERROR: "%1$s" does not appear to exist!\n\n' "$rg" 1>&2 rc=$RC_NOT_FOUND BAD_RG=1 fi fi if (( BAD_RG )) then dspmsg -s $CLMGR_SET $CLMGR_MSGS 154 "Available Resource Groups:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_resourcegroups available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi fi # : Make sure the cluster is up and running # typeset CSTATE=$(CL=$LINENO KLIB_HACMP_get_cluster_state) if [[ $CSTATE != "STABLE" ]]; then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1300 '\nERROR: The cluster is not online, so this operation cannot be performed.\n\n' 1>&2 rc=$RC_MISSING_DEPENDENCY fi #================================================================== : Only proceed with the operation if the result is still unknown, : which means no input errors have been encounter. #================================================================== if (( $rc == RC_UNKNOWN )); then # : Create an array populated with all application/RG pairs # typeset -i index=0 typeset -A rgattrs typeset arr= if [[ $APP_UC == "ALL" ]]; then for pair in $(clodmget -n -q "name=APPLICATIONS" -f value,group HACMPresource); do arr[$index]="$pair" (( index++ )) done else arr[$index]="$application:$rg" fi for (( index=0; index<${#arr[*]}; index++ )); do application=${arr[$index]%:*} rg=${arr[$index]#*:} # : Make sure the cluster is up and running # CL=$LINENO KLIB_HACMP_get_resourcegroup_state "$rg" rgattrs if [[ ${rgattrs[STATE]} != "ONLINE" ]] then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1301 '\nERROR: Resource group "%1$s" is not online, so this operation cannot be performed.\n\n' "$rg" 1>&2 rc=$RC_MISSING_DEPENDENCY continue else # : Make sure that monitoring for application "$application" : is actually active for resource group "$rg". # typeset -u MSTATE=$(LC_ALL=C clRGinfo -c -m $rg 2>/dev/null | grep -w "$application" | cut -d: -f5) if [[ $MSTATE == *SUSPENDED* ]] then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1302 '\nERROR: Application monitoring has already been suspended for application "%1$s" in resource group "%2$s".\n\n' "$application" "$rg" >&2 rc=$RC_ERROR continue fi fi print "$0()[$LINENO]($SECONDS): cl_RMupdate suspend_appmon \"$application\" \"$rg\"" >>$CLMGR_TMPLOG # Always log commands cl_RMupdate suspend_appmon "$application" "$rg" >>$CLMGR_TMPLOG 2>$TMPDIR/cl_RMupdate.$$ rc=$? print "$0()[$LINENO]($SECONDS): cl_RMupdate RC: $rc" >>$CLMGR_TMPLOG # Always log commands # : Load all the known, translated error strings from cl_RMupdate. # These strings match those found in clRMupdate.sh. # typeset CL_RMUPDATE_ERRORS CL_RMUPDATE_ERRORS[0]=$(cl_echo 9664 "cl_RMupdate: Failed to suspend monitor(s) for application $application.\n" cl_RMupdate $application 2>&1) CL_RMUPDATE_ERRORS[1]=$(cl_echo 5002 "ERROR: cl_RMupdate: Unable to update the Cluster Manager with parameters suspend_appmon and [0-9]+! Manual intervention may be required!\n" cl_RMupdate suspend_appmon '[0-9]+' 2>&1) # : Check the STDERR file for known error messages. This is done : because it is not possible to trust the return code from that : utility. We can only check for error strings in the output. # for (( i=0; i < ${#CL_RMUPDATE_ERRORS[*]}; i++ )) do if [[ -n ${CL_RMUPDATE_ERRORS[$i]} ]] then grep -q "${CL_RMUPDATE_ERRORS[$i]}" $TMPDIR/cl_RMupdate.$$ if (( $? == 0 )) then rc=$RC_ERROR # Display on STDERR grep "${CL_RMUPDATE_ERRORS[$i]}" $TMPDIR/cl_RMupdate.$$ >&2 fi fi done cat $TMPDIR/cl_RMupdate.$$ >>$CLMGR_TMPLOG rm -f $TMPDIR/cl_RMupdate.$$ # Remove the temporary data file print "$0()[$LINENO]($SECONDS): cl_RMupdate suspend_appmon RC: $rc" >>$CLMGR_TMPLOG # Always log command result if (( $rc != RC_SUCCESS )); then rc=$RC_ERROR break else # These changes don't happen instantly, so wait for the state to change cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1308 'Beginning the process of suspending monitoring. Waiting up to %1$d seconds for the state change to take effect...\n' "$CLMGR_TIMEOUT" typeset -u MSTATE="" for (( TRY=0; TRY/dev/null | grep -w "$application" | cut -d: -f5) if [[ -n $MSTATE && $MSTATE == *SUSPENDED* ]] then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1303 'Monitoring for application "%1$s", running in resource group "%2$s", has been successfully suspended.\n' "$application" "$rg" break fi sleep 1 done if [[ -z $MSTATE || $MSTATE != *SUSPENDED* ]] then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 1304 'Warning: the state change has not completed in the allotted time (%1$d seconds).\n' "$CLMGR_TIMEOUT" 1>&2 rc=$RC_ERROR fi fi done fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLMGR_GUI == *([[:space:]]) ]] then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2$s\" in the displayed text.\n\n" "manage application suspend -h" "APPLICATION:" "$CLMGR_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_suspend_app_monitoring()" #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_suspend_app_monitoring =head1 SYNOPSIS clmgr manage application suspend \ RESOURCE_GROUP= CLMGR_TIMEOUT Optional. Externally set in the environment. Sets the upper limit to wait for the overall operation to complete. If this limit is reached, an error is displayed and no results are returned. =head1 DESCRIPTION Suspends application monitoring for the specified application in the specified resource group. =head1 ARGUMENTS 1. application [REQUIRED] [string] The name of the application whose monitoring will be suspended. 2. rg [REQUIRED] [string] The resource group that manages the application. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #============================================================================== or k3+Fbbb&F # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_sync_file_collectiongcy#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_sync_file_collection.sh 1.3 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)30 1.3 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_sync_file_collection.sh, hacmp.assist, 61haes_r714 10/17/13 09:15:02 #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_sync_file_collection =head1 VERSION Version Number: 1.3 Last Extracted: 1/31/14 04:41:43 Last Changed: 10/17/13 09:15:02 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_sync_file_collection.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr sync file_collection =head1 DESCRIPTION Change the specified PowerHA file_collection, using the specified parameter(s). =head1 ARGUMENTS 1. fcname [REQUIRED] [string] The name of the file collection that is to be propagated throughout the cluster. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_sync_file_collection { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.3, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_sync_file_collection.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset fcname=${1//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN #================================================================ : Check for a defined cluster. No need to continue without one. #================================================================ CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #===================== : Validate the input #===================== elif [[ -z $fcname ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else print "$0()[$LINENO]($SECONDS): $HAUTILS/clfileprop -m \"$fcname\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clfileprop -m "$fcname" rc=$? print "clfileprop RC: $rc" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed ext.\n\n" \ "offline file_collection -h" "FILE COLLECTION:" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_sync_file_collection()" Re k:3+ bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_undo_cfg_changesion#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_undo_cfg_changes.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)36 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_undo_cfg_changes.sh, hacmp.assist, 61haes_r714 6/11/12 09:18:22 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_undo_cfg_changes =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:13 Last Changed: 6/11/12 09:18:22 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_undo_cfg_changes.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr manage node undo =head1 DESCRIPTION Restores the cluster configuration to its state as of the last synchronization. Effectively, this "undoes" any current, unsynchronized configuration changes. =head1 ARGUMENTS None. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_undo_cfg_changes { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_undo_cfg_changes.sh, hacmp.assist, 61haes_r714 : INPUTS: $* [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN #=============================== : See if a cluster even exists #=============================== CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #======================================================================= : Undo the configuration changes if no input errors have been detected #======================================================================= else typeset a= b= c= d= junk= NAME= /usr/bin/date | read a b c d junk d=${d//:/.} NAME="Restored_From_ACD.$b.$c.$d" print "$0()[$LINENO]($SECONDS): $HAUTILS/cl_dcd_acd -d'Restored_from_ACD' -n\"$NAME\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/cl_dcd_acd -d'Restored_from_ACD' -n"$NAME" rc=$? print "cl_dcd_acd RC: $rc" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_undo_cfg_changes()" -m \"$f k3+ bbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_unlock_clustersion#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_unlock_cluster.sh 1.2 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)69 1.2 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_unlock_cluster.sh, hacmp.assist, 61haes_r714 6/11/12 09:18:23 # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_unlock_cluster =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:15 Last Changed: 6/11/12 09:18:23 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_unlock_cluster.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr unlock cluster =head1 DESCRIPTION Issuing this command will force any locks set by a Dynamic Reconfiguration (a.k.a. DARE) event to be released. =head1 ARGUMENTS None. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_unlock_cluster { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_unlock_cluster.sh, hacmp.assist, 61haes_r714 : INPUTS: $* [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN #=============================== : See if a cluster even exists #=============================== CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_MISSING_DEPENDENCY #=========================================================== : Unlock the cluster if no input errors have been detected #=========================================================== else print "$0()[$LINENO]($SECONDS): $HAUTILS/cldare -u" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/cldare -u rc=$? print "cldare RC: $rc" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_unlock_cluster()" ma l)3+Vbbb&4 # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_verify_and_syncion  =einorst acdfhlp"#$ACELNORS[]_gmuvy&()-./:>DGIMPT\bw,012FHUk|}!'*4;BYx{367ԐF`ؼXʲ!Y"Ƃ0``n֥9UF;!K6]RUklVu+i,v90ף9)=І ;YX#/ Y{ˊ kAUdjQcgQ#9# ]X#qi,/YTc]9ZK9{>]Ja*qQɢYg V[;yǥ@v&ZTwgrAAcu(cCPخv0ŕd5(M8mvi,sQ[qخv;SUVPZciX"Ɇǥ%ED*Vy59{i.ijڐl`,RU 'A`^*(~&PT,\?O0p>Ԩ<.48"O0j9MÃƇP1l.48"b*"UE?}y [ITZnaGq?}y [:Ţx,88\hpE^a1LUrp.48"ɊNxrbpp ;&8b'bQ(88\hpE^a1qli<0q?}yYbG88\hpE^a1(pp DPDPp8Z cȓ,hQ!!2]rS3&p wʵc^S9EcmmmmmC?E5b+0ymmmm&8c7G"hP*!&9BM **h"B$hѨ1@Bɜ$'Z }S?Ǩ8p D, ̙Bu@!4)1=/b (hA@'2g0Kء$' n4x72e-CД?Kء!0cA98HNµ@!-701:Ţ=@P$ Ђ`NdbcicXX!`=rN{( (>X3蝋s)F!`=rN{( )`Ndv.I|^QaCz'bQ{A98HNع'=k\>c-70*ncM^7D\J%WC'טLuɊNWq^7ρUP0c÷~`72g U^4h` 96(Lj cqli38ٶ4UF CzzSۍ?039IUF0j aǜ3&*8^4hayɊNP0cع'={qs&prN{(^4haz'bQN9ۍcc/E(̙BtN9Uxѡq蝋s)Dj aǬj1i̙BumF-%W[Ťj a2g ‚{baxHO/{ƍ ||ty12+e2)0x{"h8Ea`_ef1:9x刚.\LB(D  LL"F׷(68ɉ$P*PDX~&($Xа2H68cq,qqx&($Xа2Hǥ$&TKcc&h ͣ:뽍4x$(,be *d(yrDJ.ǥb!4z1c7DcB‚ʉ ‚4z1cۂ/?Xp\ I^0 IH .?$XR-Ԝqu3F_a9nR.tvQ#9>ԕ{X"ֺ8sJyŋqVE.z1cN8OE謶'0|:ֱ<99|拴])Y{:CE7CybE *$P,  Cg4״Ə,D"Ŋ LL"F׷Q!GB&&PBB$DAaK-_$\n <1A"ƅIC'טLw"矣F5FCaPpA%bȓ,hXPTQ ?ޕ]lq!Af(HS!C˒"Tp%KB//"zXP"&AcqI 4,(*LS ޗn *P]lqyAEA `;1@X @x7)5Wt<1)1|2.y 0`> 2"ƔsdndVZKN 2,I^0 IhI,T~E}*56t;E"GIc|2.y9QE.Ѹ(@$6ii7XA2 $*H"@Ѹ(Tj{qAmm"F3㭶mjS0cK BqPn52VZp\ Ǒ&($XrB$.$_0V bKVq҄F-rsG$8nckR"TPPPLa2 <+Q4': C11<ɜ$'|MDȚ L#| +*'<]YȐ!F^qUVs(đ$[ILmmmmmm$be +fEH%EH qʼnc+dc>ܱEH._ BwG"hbK!CaA[4(Je0Cz]b&$\VZRƟ ̙-CummmmmmmC?DGId|`[*?(bklS|Zܺ&ьŦmmmmmmmL1&p @R4AU喔4/2d ⬵QJrdzTxCwAmmmmmmjUwtM90u$P2K&犨tke>.wg]]hŎnX?[mmmmmmmcޗnX$I/!9BM **h"B$h`?b1?ئ`=rN{(^=^Qas&P?!;Vt=/J,=9':l"~# wńI,=/i,pN"NaqaEqz*(Ķ7E0"EP1pb,XF(Q^'_!zZx;^0|/dc-Cwe󱰌1cMU-*y5ae9L5زQϐFVCsg[IH#$t^'_;fS㸻2qw=cyjrht=/Z퍌ұܫR%Kqu3F XEϔPҖ  v]ӣS6Ƣ\XDbڌZt =CF!GB&&PBB$DAai2A,z_>8llǤ-70*q蝋s)DǬj1i*q&*8^#qI 4,(*L,2k8ޓEHT#Dʉ FD $~qliǢv.I|/{ŤǜUxcc 0'9IUYͱʯzJsPaB(H!$&TKdD5oI"˹ȓ,hXPTQ,vbshug6ƛC,.H2BBeѺK& |OcsҒcM^8EWQVr$i,vb ?ޕXE,CF!CummmmmmmP˦gZqE]G<1lAj)VAehPcыYYRyz1cId|UbJ86F`OKc^|s88MF8;\ Z4$7-j㭶mmmmmmmڇR{?02VZ‚K,Dpq$*PIcPh IlrDIcG*D3E En*@rB8Hi,v90ף9{bHŎnŎn*@rB;.4y2H4P!q-);IOcqqeDDRX YoQ'!P(KS4u9B$ɕ"@DI Q"`7&HG&HGCIcIQνKأF,sw//F,spa2dw7k\heH&hQBCq,ZSv+-'QZGʉ{>*NCFQ!|h G!(Tj{q;$)$@EMCjf}A[mmmmmmmmmjD'\{YVCd4vxd\1!"Ҙ#z+/:Ԣ7Ee(8m0T7PRl8r[]瓃r@G8ٶ4n,!9ݐqu2J9#E"bs̑Octv81/ܦ2g`ƛ@w-ܻNy2ƛtٹXQ!uEh TbG<19zM`&LB0\dd (HA@a9900L"  ;r`bqlɒ(@P x#saa:Y Q8XQ t_ O?o6Au?Y}Dsj1i rb47Vv5G<1cUip4QRe7d39Ud5νwBCqeY IF'_80cQYc.S@woE蛝Q8X x#ctt̑@w w1QY {I]TSbtE/Z2L5?Ir` 7=/bEEʔ Lb{l01ZQhbƦđLeYvG<Q#9YX#/sTaF,sCqeY Ŏj"u?NËO?Y1orUV_x̀! =1+8d5?I!AJs QQa23^ƛ2 sZ󱩱$bSVbs<]/Q9C*F$XFUF:+.*M8PUӌL8rKviE"0F!"H@LX?kl4V[D,Y0 A qZ,n`R B/cMC9J- Yؒ1s)1V_].u+-YCȱdFF0uEKأF,sx#$ &, s\3EEʔ Lb{l5S=/bILUrzȌJljlIxJ&*8pUVO[ t_qVs(đ(nع'=sEEʔ Lb{l01ZQhbƦđLeYvc'!ظ1bH'=tEsOLy{bHŎhj` qliQQa23^ƛ2fzzV$(4^z_K A@b"SE順6QQa23^ƛ2 F-<]Z/Oqخv:q*ŎnYbӢ2#dq,1:+-NSMN*Λ)E>^*༤)ad"e-Na!!|3EEʔ LaCYY"0ӛNSχhqQϝ>,i*ŎhjUeYbBCw/{ f_:sJ2Yܼ]yETON12RJa e $ua<%=zSG9#sud88SCarw :{(8A6qӘQ5sQƤRqQ>a;c=9^Z#nmty@ LQ E+8RWEъ(!R;8Sܦ59<"䂂ƠmmmmmmmmmbΣY,iFYc8aܵG=)rliEጫ- F-;!lb # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_verify_methods =head1 VERSION Version Number: 1.2 Last Extracted: 1/31/14 04:41:15 Last Changed: 6/11/12 09:50:18 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_verify_methods.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr verify methods =head1 DESCRIPTION Verifies that the specified method will be executed when any of its registered events occur. =head1 ARGUMENTS 1. method [REQUIRED] [string] The method to be tested. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_verify_methods { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.2, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_verify_methods.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset method=${1//\"/} shift [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i rc=$RC_UNKNOWN typeset -i i=0 #===================== : Validate the input #===================== if [[ -z $method ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT fi if (( $rc == RC_UNKNOWN )); then typeset type= CL=$LINENO KLIB_HACMP_is_known_method $method type if (( $? == RC_SUCCESS )); then if [[ $type != *notify* ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 1170 "\nMethod \"%1\$s\" is not a \"notify\" method.\n\n" "$method" 1>&2 fi else rc=$RC_NOT_FOUND /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$method" 1>&2 /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 149 "Available Methods:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_methods available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi fi #=========================================================== : Verify the methods if no input errors have been detected #=========================================================== if (( $rc == RC_UNKNOWN )); then typeset -A attrs CL=$LINENO KLIB_HACMP_get_method_attributes $method attrs typeset EVENTS= for key in ${!attrs[*]}; do if [[ $key == EVENTS* ]]; then for event in ${attrs[$key]}; do if [[ " $EVENTS " != *\ $event\ * ]]; then EVENTS="$EVENTS $event" fi done fi done for event in $EVENTS; do /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 139 "Verifying with event \"%1\$s\"...\n" "$event" print "$0()[$LINENO]($SECONDS): $HAUTILS/clissuepage \"$event\"" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clissuepage "$event" rc=$? print "clissuepage RC: $rc" >>$CLMGR_TMPLOG # Always log command result (( $rc != RC_SUCCESS )) && rc=$RC_ERROR done fi (( $rc == RC_UNKNOWN )) && rc=$RC_SUCCESS #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "verify method -h" "METHOD:" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_verify_methods()" oc kꌓ3+6$bbb&6$ # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_view_logtho#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_view_log.sh 1.4 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1990,2010 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)00 1.4 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_view_log.sh, hacmp.assist, 61haes_r714 5/15/13 14:22:11 #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_view_log =head1 VERSION Version Number: 1.4 Last Extracted: 1/31/14 04:41:46 Last Changed: 5/15/13 14:22:11 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_view_log.sh, hacmp.assist, 61haes_r714 =head1 SYNOPSIS clmgr view log [ {|EVENTS} ] \ [ TAIL= ] \ [ HEAD= ] \ [ FILTER=[,,,...] ] \ [ DELIMITER= ] \ [ CASE={insensitive|no|off|false} ] =head1 DESCRIPTION Displays the contents of the specified PowerHA log, in the indicated manner. If one or more filters are specified, then they are applied first, before limiting the number of lines. If both TAIL and HEAD are provided, TAIL is applied first, then HEAD. =head1 ARGUMENTS 1. log [REQUIRED] [string] The shortname of the PowerHA log file that is to be viewed. 2. tail [OPTIONAL] [integer] The number of lines to display from the bottom of the file. 3. head [OPTIONAL] [integer] The number of lines to display from the top of the output. 4. filters [OPTIONAL] [string] One or more search strings. 5. delimiter [OPTIONAL] [string] The string separator to look for in the specified filters. Defaults to a comma. 6. case [OPTIONAL] [string] An indicator of whether or not the specified filters should be used to search the log in a case sensitive manner (the default). Valid values include: {insensitive|no|off|false} =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function on_exit_view_log { [[ -n $EVFILE && -f $EVFILE ]] && /usr/bin/rm -f "$EVFILE" (( $rc == RC_UNKNOWN )) && exit $RC_ERROR } function KLIB_HACMP_view_log { trap 'on_exit_view_log' EXIT LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_view_log.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset log=${1##*/} shift typeset -i tail=${1//\"/} typeset -i head=${2//\"/} typeset filters=${3//\"/} typeset delimiter=${4//\"/} typeset -l case=${5//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i default=500 status=0 rc=$RC_UNKNOWN # Declare globally, so it is visible in the exit function typeset -i i=0 typeset DIRECTORY= GREP= EVFILE= # Declare globally, so it is visible in the exit function typeset -u UC_LOG=$log [[ -z $delimiter ]] && delimiter=',' #===================== : Validate the input #===================== if [[ -z $log ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT elif [[ $UC_LOG != EV* ]]; then CL=$LINENO KLIB_HACMP_is_known_log "$log" DIRECTORY 2>/dev/null if (( $? != RC_SUCCESS )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$log" 1>&2 rc=$RC_NOT_FOUND elif [[ ! -f "$DIRECTORY/$log" ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$DIRECTORY/$log" 1>&2 rc=$RC_NOT_FOUND fi fi if (( $rc == RC_NOT_FOUND )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 147 "Available Logs:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_logs available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" fi if [[ -n $1 ]] && (( tail <= 0 )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 111 "\nERROR: \"%1\$s\" requires a positive, integer value.\n\n" TAIL 1>&2 rc=$RC_INCORRECT_INPUT elif [[ -n $2 ]] && (( head <= 0 )); then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 111 "\nERROR: \"%1\$s\" requires a positive, integer value.\n\n" HEAD 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ $filters == *@(\`|\$\()* ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 133 "\nERROR: the \"%1\$s\" option contains a shell execution character: %2\$s\n\n" FILTER "$filters" 1>&2 rc=$RC_INCORRECT_INPUT fi if (( $rc == RC_UNKNOWN )); then if [[ "$*" == *([[:space:]]) ]]; then /usr/bin/dspmsg -s $CLVT_SET $CLVT_MSGS 134 "Warning: no options were provided for log \"%1\$s\".\n Defaulting to the last %2\$s lines.\n" "$log" "$default" tail=$default fi #================================================ : See if an events summary report was requested #================================================ if [[ $UC_LOG == EV* ]]; then DIRECTORY=$TMPDIR log=clmgr.KHvl.evs.$$ EVFILE=$DIRECTORY/$log print "$0()[$LINENO]($SECONDS): $HAUTILS/clevsummary" >>$CLMGR_TMPLOG # Always log commands $HAUTILS/clevsummary >$EVFILE 2>/dev/null rc=$? print "clevsummary RC: $rc" >>$CLMGR_TMPLOG # Always log command result fi #=========================== : Display the log contents #=========================== if [[ -n $filters ]]; then IFS=$delimiter for filter in $filters; do GREP="$GREP | /usr/bin/grep" [[ $case == @(i|f|n|off)* ]] && GREP="$GREP -i" GREP="$GREP \"$filter\"" done GREP=${GREP# \| } #====================== : Insert the log file #====================== if [[ $GREP == *\|* ]]; then GREP=${GREP/\|/ $DIRECTORY/$log \|} else GREP="$GREP $DIRECTORY/$log" fi if (( tail && head )); then eval $GREP | /usr/bin/tail -n $tail | /usr/bin/head -n $head elif (( tail )); then eval $GREP | /usr/bin/tail -n $tail elif (( head )); then eval $GREP | /usr/bin/head -n $head else eval $GREP fi else if (( tail && head )); then /usr/bin/tail -n $tail $DIRECTORY/$log | /usr/bin/head -n $head elif (( tail )); then /usr/bin/tail -n $tail $DIRECTORY/$log elif (( head )); then /usr/bin/head -n $head $DIRECTORY/$log fi fi (( $? != RC_SUCCESS )) && rc=$RC_ERROR fi [[ -f $EVFILE ]] && /usr/bin/rm -f "$EVFILE" #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then CL=$LINENO cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "view log -h" "LOG:" "$CLVT_PROGNAME" 1>&2 fi (( $rc == RC_UNKNOWN )) && rc=$RC_SUCCESS log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_view_log()" r  kP3+/ bbb&/ # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_view_mirror_groupon#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_view_mirror_group.sh 1.1 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # Start of POD-formatted documentation. Viewing suggestions: # perldoc # pod2text -c # pod2text -c --code # pod2ht-ml function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_view_mirror_group =head1 VERSION Version Number: 1.4 Last Extracted: 10/18/12 17:50:40 Last Changed: 10/8/12 12:21:43 Path, Component, Release(, Level): src/43haes/lib/ksh93/hacmp/KLIB_HACMP_view_mirror_group.sh, hacmp.assist, 61haes_r712, 1242B_hacmp712 =head1 SYNOPSIS clmgr view mirror_group [,,...] \ [ NODE= ] clmgr view mirror_group \ NODES=[,,...] \ [ SYSTEM_GROUPS={yes|no} ] clmgr view mirror_group \ SITE=[,] \ [ SYSTEM_GROUPS={yes|no} ] [ REPOSITORY_GROUP={yes|no} ] NOTE: the "view" action is only valid for DS-Series Inband (HyperSwap) NOTE: the alias for "mirror_group" is "mig". =head1 DESCRIPTION Attempts to view the specified HyperSwap mirror groups. =head1 ARGUMENTS 1. mirror_groups [OPTIONAL] [string] One or more HyperSwap mirror groups to view. 2. nodes [OPTIONAL] [string] The label of one or more cluster nodes. 3. sites [OPTIONAL] [string] The label of one or more cluster sites. 4. system_groups [OPTIONAL] [boolean] Indicates whether or not to include system mirror groups in the view. Defaults to "yes". 5. repository_group [OPTIONAL] [boolean] Indicates whether or not to include the repository mirror group in the view. Defaults to "yes". =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of POD-formatted documentation. function KLIB_HACMP_view_mirror_group { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" : version=1.4, src/43haes/lib/ksh93/hacmp/KLIB_HACMP_view_mirror_group.sh, hacmp.assist, 61haes_r712, 1242B_hacmp712 : INPUTS: $* [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values CL=$LINENO OPERATION="activepath" KLIB_HACMP_replace_mirror_group "$@" log_return_msg "$?" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_view_mirror_group()" 2 l\k3+Jbbb& # ./usr/es/lib/ksh93/hacmp/KLIB_HACMP_view_report  = Eert"$AILOPRST_acilnops#()-/:>CDMN\dfhm%,.1Nhv}_S8w 7wmmɚ r}'8>V{PAA? ӡZOq8w uQf8w!N)3QϬ@'~X: ;3]'<::#Bkr{P@덵W{h]hQ\I+X``dG\{ ӡZ=\;8j:CNhpG`- oqN6\xWwg zv}'9uo TaԂ>Nj==g_j>=_yEOqI* _S.ۢt8wt`+ m4/4v~4v{`iᎯ<ۢƧS8b;5:i|Ux`nrfv5ؤ_hDwS(>'r=]'rhbfhTGouWhmw_|S| <0ǛtXI+F@#}NOuWyO6ƱAg@'xcy:)<ӐC4-X ?8w!r_r|0M 3YNGfNN!w!r_` DtGkNz7:QCIYY ԩ3 {j(q#"NOri:֓ ?mވ|S51r϶`{͋<\}b :\ܰT1wūoTn?;uK$&:+@4<^H!m֩c:?6г\3mBQmvOSWr5}N4yaS\;0PZvm_4g -ENr3;}' npE3AX{΁;+qgMpQyy§#O68_;>j r}\;=]'tPzNO!'Lr̰y( Ŏ;mӢܘ?~‚O`voWm~Lгs5M oj8*pa"PA&iW*LLL&'Tˇ,  X GxY/%0$!Tˇ,  X ",$^J1hLr̰y( ǎ֛P_ޘ?j4(E>U6uޯ d=dVueEU?8wƞStZq|NXv>iF1GBsoөش5|8pTZ>'hpcj78Bq p|{v<o;3`t h] u8Bp|Y_yMg}NOhW|vg_Ӯqx(sq @I1# AyPeŝpȚ?(QY qVt/ @xrD#zA4H‚c^ET0Yr]uڬf\3;71e~PS.,U5HK@x(&Cx0X |ޏq @I1# AyPeѭfv Wnj9?",$^J1#NCZq 8r/h4T:E0]R,IN( SNCP8h)#=+ӭPmMCEr0Lr̯&4 \9fKX<*ORzNU50=nV]~`|óDŽ }P 2 ",$^J0~P BY \9fJ\& bbx GDXe5@deÖdˢ`,S.,,*Je"f^>1xF Y%6Z Rbbq&*UfJebU`XnP/@(p Cz TKmӢ Cn܏Ą/h*%CL1Y5 aàU22*p.rѭfv W·\yi᎓:ӏ8Nup^|} 2@ Y/%? (oӁ[h*%CL1?Pck<Ɲ?u۔|foi82 ЁQ&=\C F$aA1/",xP]Lqt pBLr̰]TsL\λ#ޜ  #Ǵ Y&Yi柏M T Anfŝv?oX'D8j?ޏQǫ(y$HČ(&=UC Ou܈B we09]ȁ8hD \9fX.jG9]ȁ8k(H<,Y@@.?r?}nF? d^.FUe bx :D .FUe ಄L\λWڂtU"ր]-:ᦫ>'Տ뻻!,Rp?Jb`Χ&CEr0Lr̯&4 \9fK gzK,;2N)7spxeb :ɋ>?A6\}cлN:УQ5 ESo͹8c1yXcn6qocߏ'W\xuIQhcW}F#.*ߏ85 aàU22*p.r "ӮtZp̡ ~z Ƀ𲀀\ݠVKe# 1 I+h*F$aL M k!..B~BTPxYHGxwU :$- 8#Pv\:S.+ɍY/Fy,O66tҡ9̡ w!~X_΁CY.(:NP/x)8Oq$- 8#Pv\:S.+ɍY/Fz"8BZp?JL^? ( 8r"13Vj>13VqօuʌDEf- gH7Mܜ13Y57 ~&j軏~&j~t13W576L֓\rph*߉ڤf~3XjEuQ~&kG5FaF P@hr?܌7F ` 01 roGxEn;yשmgkmr1wwwwwwwwwwwxtޝI+wwwwwwwwwwqp<~ ` 01 roF?BY6@#6㳴*vn;8zҧ=ѻAb T^?zqĄ*1NGzY96NBq?Q' s96N*1(@< bF*ː' &&40(Tˇ,M@F 3 1h@=MrMi`!lhݠ#Qǫ(y$HČ(&=UC OmNCRz 4?(QY 7^gM3F#=\aQƌvzAIkuǦ ?p$%OAÇ8p:h G}܌x5:CRhx5:C༁ ࣏W=\zg mg4ӌHKBOT븘pQǪʝuoY(Qn;8h\B?FR]xq^ mgШ:&'qr]d5:e mgF 3Cq BZj= $$Nndbb`Χ& 8s $iǠ`  II]_" U22uSP:?Q' ¢ ZDA\n 3EΚf?zA4H‚c^ET0YrvgA}b:i6~PS.,U5oΚfF?z9( ¢ 8M[=0fiPA PAˮ=0`zq ߧV+:=3V+:HI,l~?U;A4H˜@C*]V\92C: ΙU Χಅ*p`p<~R]|gSz?CgCV+:?U;A4H˜@C*]V\93A\*gSYBLr̰]To?@wzY\@Y.@3ɽuȣV ?1 bFR+:AVZh࠵gzj`Cj!j!~DUT* (aq1܏r?i6c?]\;0ʹ,z-JM暬Ą&' 72bbd110gSz?7Z CBBuqP uګ}*!2|гsry!q5V3S5~N9I*e܌HKBOT븘pQǪʝuoY(Qn;8hB?FR]xq^ mgШ:&'qr]d5:e mgq @I1# AyPeDA\nx U22uSP:?#%/&SP89#y0kmڿ(Qn;8gM3F =\C F$aA1/",{nxI6t4lD \9fX.jGǏ5z 4HKBOT븘pQǪʝuoY(Qn;8^m7h,U 7 hRp?Jy~bq BYЅ栄NM`;FYƁTˇ,u×@/IeXGfIօ&tZ/x, `;FYƁTˇ,u×/=vuGgPBqL^? (1vqօvi054T5fvuGg61, @dsB8BH&6 @\fi!-qօ H!"ps&&&Cu97Qǫ癪- ;1$>?mޜ 8r"uVi:QN+Y.`9* ?=1# -G$n8T1# `jiYDuYr@/5'z~಄L\λp<~eqdΧ&0W#Tˇ,c@eÖd`^zK,ЄyAڧWCPe/BPBq5 aàU22*p.rX.ӎ(jN?XIxeF 3лN:УNM#05JU\PBqô.ӎ(ߦ<~傁 h]hQىD( ?p$%2лN:УA1 $$Nndbb`Χ& 8r"5@evuGf$cg͹4ӏGDX|c*'QjᅚѧY4Z@z0km xlc#]TV*e0@*gXO@ێ?Lѻ@G࣏W=PH&PLz Ȫ .@۴58&ƱRz 4?(QY 7^gM3F#Qǫ(cLրBА5 aàU22*p.raEYD5-xm k-Fy`fb#1%P$q^̎@ێ}࣏W<ߠ D,~Pvqo?r@GQ0bK H3pr(Ƚ(34ӏGPvq(@< bF*ː' &&ݠ7M25aEYD5-*p`8af;iM5Vz" $v57]e$F0YBLr̰]T ~zj' mglhݠ#Qǫ(y$HČ(&=UC Om xlcX=Κf(Tˇ,M@ƯAy(@ێ1j& Ik@y!hhHQlja*p^LhLr̗\9|lQVQ bKe57rp PVu<ǏܰP3p1L`( @\fi 8r/fGe mf >Qǫe`Ė?(Qn;8`fb#1%P$q^̎@ێ}࣏W(Qn;8q @I1# AyPeDA\nTƦc밢ĖBLr̰]TGۜ0Y4&Y@=MrMASSo͌dkŠk[# x,D \9fX.j?= AY6㳏t4n(@< bF*ː'MN jo61TgM3F@eÖeꦠtxWLѼq mg5$<4$(čCEr0Lr̯&4 \9fK>z" ĖN jo6 5s<ǏܰP3p1L`( @\fi 8r/fGe mf >Qǫe`Ė?(Qn;8`fb#1%P$q^̎@ێ}࣏W(Qn;8q @I1# AyPeDA\nTƦc밊2k[# g U22uSP:?npfvӬjg=DI56MN jo61(%0@eÖeꦠqЫTa?(Qn;8gM3F =\C F$aA1/",{nTƦcI6t4lD \9fX.jGǏ5z 4GPvqQ0bKZ CBB&Y( ¢ Z -"&Qa% (HKPAD!"ps&&'GzBq?HK"pJV+23ɽ`Ėx`;FYƁTˇ,u×p ]&$UDP,$ƦnNGͿLx7 D,6 f࣏W"dvPv`N?z^j& Ic6㳏~ n 28XlA( ?GED ޜ 8r6㳌 8s $iǠ`  IIh*jpMSyubETM5 JBLr̰]T ¢ ZDA\nTƦcĊjE1Κf?zA4H‚c^ET0Yrݠ7M5lhBLr̰]TѼj:i7!} .Uq4ZAA`*gXO]&$UDP,$6㳏 j0$$Nnd1<࣏W(Qn;8#`Ėx`;FYƁTˇ,u×p D Q4* (c-8&#ߦ<~傁 `Ė@f 3OQǫ{2;(Qn;0fi=\/~5$BqͿLx7 D,6 f࣏W"dvPv`N?zBq࣏W=PH&PLz Ȫ .@z" $v57D Q4* (c# U22uSP:? 1h@=MrMASSo͌dkajE1Κf?zA4H‚c^ET0Yrݠ7M5lhBLr̰]TѼj:i7!8aej>&Y( ¢ Z a"&Qa% (HKPAD!"ps&&'GzBq?$%Q'*uLO8(dNɷ߬(\B?FR]xq^ mgШ:&'qr]d5:e mgq @I1# AyPeDA\n^cZBLr̰]T &&ݘ"NAD 4$ 8s $iǠ` 1xEjI6t4lD \9fX.jGǏ5z 4HKBOT븘pQǪʝuoY(Qn;87$ eqd(Ƚ@ێ?$%Q'*uLO8(dNɴjt@ێ1(@< bF*ː'Ԍma8< *p`p$%V+:À;#ĄM̘ LLޏԌma8< k$- 8!ZN 4Z "@(!"ps&&&@6㳏g@=$۬qyAyBq͹lhݠ#Qǫ(y$HČ(&=UC Oma8< b:i6~PS.,U5oΚfF?zBq࣏W=PH&PLz Ȫ .@z+R0IYvp(Tˇ,M@!- AY $$Nndbb`Χ&W`n&ƲBА<1jgXIG 112 (n8 H&eMÔ(ۑΚf?zA4H‚c^ET0YreMìTgM3F@eÖeꦠtxWLѼĄ*1NGzY626㳏0E$#nX++%׏GEvq!- A>9Sbx G'*uNMSPvqb :Q^?Q' VE?zA4H‚c^ET0Yra$$ۮBLr̰]T &&vEYBLr̰]Tƌv}&Ѯ BYЫTaƆ*gXsgAs8'u97鈮$v6N?Lѻ@G࣏W=PH&PLz Ȫ .@ۮ辱Rz 4?(QY 7^gM3F#p<~W0V@3ɽ67;=Ǵ@b+DQǫ(ǏܰP3p14vc`( @\fi 8r/fGe mf >Qǫ#ey?(Qn;8`fb#hP$q^̎@ێ}࣏W(Qn;8q @I1# AyPeEpjF 6.较BLr̰]TԌm]};(Qn;8gM3F =\C F$aA1/",{nq}'Rz 4?(QY 7^gM3F#vͿNPVu{@fPVu X34 8s $iǠ`  IIa8>"+= AY U22uSP:?z" $v8r"U Χ mglhݠ#Qǫ(y$HČ(&=UC OmN>*OAg U22uSP:?<Flh@N?mĄ*1NGzY626㳏0@5I !uȹ ѻ"vY\@Y.HKBOT븘pQǪʝuh(N]&$,UD׳ϏGzM#0U \=_4tVuȽ7..Q?(QY bLTM{@{nh{"oy*]X\oB?Lѻ@G࣏W=PH&PLz Ȫ .@ۯ:+:^țhJV(I6t4lD \9fX.jGߦLIX=2LIX6 ?]&$,UD3 mI ࣏W"G=\g mg<:ur{C]{Ϛ=_'иjtqx\ouI2aB^>?HK@b %`#.Tir118NM=GEE- wmhk:o>jpGI2aB^ۯ>jo4vd#ę0i/h d…"@(!"ps&&&@7?:?O.,\QGmhk:B- \pۍ>jpGI2aB^ۯ:+:^ț|r@=ϽbLTL !Hz%K 1&L(ZK+ę0i.HI,n?m1ubLPbLP#qyWvm4 vߡ֪fާ'~ 8gG1tTEϏo]&$Ʌ K?&tP)aB3q18NMq @I1# AyPe CBP8'a\D \9fX.jG]QTbHZQlj; #v࣏W=PH&PLz Ȫ .@T\?At&-,4%v@eÖeꦠt5eA-MeI2aB CBP8'a\ۑa]7hHq @I1# AyPe݆}bvhޚꈲk"ʂ (Tˇ,M@ƯA`fF?:?O*ͺ9Sbx G'*uNMSPvq`2? !vY\@Y. 8r/e6㳏 hTb yʝw 8Y9Srm26㳏u!96x6 um]uN 8aܬ;hܩΧ'4vy{T¶kmhk:s܆robr;9:܆q>xC]vm7G9=iN?:?Q' Lr{nt mΚ CBBn|ΊӤ-G o?m>pR{CVvfl^2Bvqq=n(S@ێ?6?wwwwwwwwwwwwwwwwwwwwwv~Pvq TngEiw(Qn;<PͿL^t~_5=F"4?:?;HSE܇qjӮN+F:@wqoG7 Aw=E8B:,P$#S$ಀgSz?6?e/]ݟ)mggPZ W7GOr ѓ(S@ێ?6?wwwwwwwwwwwwwwwwwwwwwv~Pvq TnȀ#YBqಀۑFʹ4mC]NO;3 Q ޏa*p^LhLr̗\9|,!,OG;3-JLZ 8Wuٷ^'uٺ>tϽ=g_58B9I+hcy|γ 2 ( fK,nF?$%Q'*uLO8(dNɷ߬( $ eqd(Ƚ@ێ?$%Q'*uLO8(dNɴjt@ێ1(@< bF*ː' &&4,v*p`@=MrMhXBq:i7hHq @I1# AyPetб5lhBLr̰]TѼj:i7!=\/(cQǫ(y$HČ(&=UC O@=MrM _".~PS.,U5 IIa8> E6㳏t4n(@< bF*ː''A}b:i6~PS.,U5oΚfF?$%Q'*uLO8(dNɷ߬(I*JuQǫ{(HKBOT븘pQǪʝuh(cQǫ(y$HČ(&=UC O@=MrMWqo[?(QY , Qy2DA\nx6e U22uSP:?Lѻ@G࣏W=PH&PLz Ȫ .@۵~6Rz 4?(QY 7^gM3F#Ą/h|YDuar!:(@ێ?zA4H‚c^ET0Yra$$ۮ BLr̰]T &&v\6e U22uSP:?Lѻ@G࣏W=PH&PLz Ȫ .@ۮ Rz 4?(QY 7^gM3F#܌ 8r6㳏GzM#0U \=DI56_ǍxD \9fX.jGd5Ej$`:?@=MrMWqo^@ێ(Tˇ,M@gM3F =\C F$aA1/",{nxI6t4lD \9fX.jGǏ5z 4 8r6㳏GzM#0U \=DI56밼?(QY a$$ۮ?(Qn;8gM3F =\C F$aA1/",{n b:i6~PS.,U5oΚfF?zBq࣏W=PH&PLz Ȫ .@z" $u\6~PS.,U5 II]yBq:i7hHq @I1# AyPeu\7TgM3F@eÖeꦠtxWLѼĄ*1NGzY626㳏0qPI*JuQǫ{(HKBOT븘pQǪʝuh(cQǫ(y$HČ(&=UC O@=RM˰ Ʃ3LÑo"TD \9fX.jG1rȰ=JI6.'2.+E\PS.,U5G:i7hHq @I1# AyPeuafRfX=Κf(Tˇ,M@ƯAyoЫTaBDၦLLL&& roG࣏W"G=ȰHZqBg8iAYDQBDၦLLL##Cg mg?z9EO@ێ?m1r(!1w;;|r 8r$s,8MZi34HKA4K̎bx qih1!ÀQBDၦLLLyG 112ϚC[@e4H $$Nnd |r/>jn GĄM̘!,U ΰCYj9 3Gfgb`Χ&D9q$h57\nG>p<~ā"cyL roG67;=Ǵ@r@1fiGPvq61, @ds 7P @=\ّBqك3O8GDyAD mcX(;1 n.@34z#6fzq=\D (@< bF*ː'Ԍm]qXjEȷ <"!ˉ Gf&6d;3*p`\M˰.+ Z9Ƚ2"4vbcg< mgΚf?Qǫ(y$HČ(&=UC Om]qXjE*OAg U22uSP:?oΚfF?Qǫ(࣏W=PH&PLz Ȫ .@z+R0IYvq\4vg U22uSP:?5#uaȻGg(:i7hHGzM#0U \=YvEaUX=Κf(Tˇ,M@Ѽj:i7!GPvq=\C F$aA1/",y!hhJG$-V;3*p`BД"qzBLr̰]Tb :0ݤ~׬t4n(@< bF*ː''8FfX=Κf(Tˇ,M@ƯAy(ȑAA`hqgF\z` BZ8pÇ83ɽmӏr?z:?(Qn;8ޜcBZ}r]@#=VNT묛}ΙBq࣏W=PH&PLz Ȫ .@BqDžuG~q]ǪBLr̰]T0HG dŒ2$- 8#Pv\:S.+ɍY/Fy,O66tҡ9̡ w!~X_΁ҡF^2Rp?JHZqF"t \9fWS.%_ Eqօ~~P qEybfA6\}bf 85 [tZΑ3SSo͹8bfՆ&jn6Lw6Lbf>jnB`6n;-]vuGg\}v50Zz`O@=MrMtV@Y!2xV;Oyk:<\Nᾧ'>tG\bw)GigqyⓛۏCVvfw|z" $t2'̟~ CBB?E;Ʒ灩 d=d]Ƀ٤~@#:# ?f`{d]Ƀ٤~NqrzѨ3b7W{ƫӠ!ifk}`{ Үitvm¢:#Qj= ?j:N{mSCr5ܩzNzfu#ð:nUрCy柜;ט6]:Q*qDžb;&Br=gMbyL:#lYo*ȻI+ d^Щ @#"oB`6@#$- 8*țЩ '96rxM´|YS5y8ym7>'hpݧ]|3Q'Y5p\:qwʦ\9fXH`+oФڂtU"bbx CkȀ ?Bj TG&࣏W=PH&PLz Ȫ .@8빔)6HvSu M'ER,~PS.,U58PN[(H<,, .?܏.p`X BYt.d$ۧEh)ZШ4roGNE4V.ʩt.d$ۧEh)ZШ4#HKAX*[Q@ ` LO31r37b"+eTG&࣏W=PH&PLz Ȫ .@8빔ME"+eT(Tˇ,M@:)vUHPxYpY@@\͹nF?OZg_<+:8Y5Aێ醤*Yd5$堺LIԓ Iԓ̆ IVU*jI3 IVWaEԓi*(, IVW0i2rU-&CRNZ+d5$`2r]%Y I9h$jI3C I9h&"jI@Wd5$堨!'-rd5$\9ԓ"jIAvd5$]TRYԓ%Y I9fc% I9hHEԓ^LYvCRNZ2Y`=B˲r 2^LYvCRNZY I9h$`5FCRNZ 2^@jI3Uԓ,ětz4T:C3.d$ۧEh* >!H!Or&RNQ4ӌǏУ}ޱVD 20@#t*̖YE7y*ȻI* 8Y9Srm>19 1 ZxT5]<ێ6":&Şn>zY61G|C *D05B $tw'oς=VNT묛}΃uGDva'npfvӬjDtGe tr hsg`~;xlcT¸ީ&8頞&t !uQO@-XIdXG`45VO8aAY`NŨZ>-; n=So͌DtGj VjO0 ֝E$:?oytjNn4S=fQ(UGϼDgGv='Qj=3AZ7:u&0 ۫'jblyb7Wx'hQyߧSOjNz#OiiHyDžaͿMN*#:&Şn>npfvӬjc1u"6zgN׫Tab :\z F 3 1qqHY?3yjmHāHKA4K&@@N&& roGx * ' 72bbd110gSz?Ą*gXpx$x8`i!:6:AYq AYfioPADJj'u97<~@\  8cz9( ¢ JM:?܏ޜaQ,Hď݆q?mꀠ.Sd`Gz=\aQ * Şi63 * Şi63 * Ş * PM#>?܏ޜcHKAAcwG 1123ɽ BZj8?܏"7yQ ,g`~:ɦ1wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwhά5Nq(1np˯\}M5V?Ѧ\;|x]Ekqj>jpMSy'$4KO4Z)> >f;1`A={\}ƦcQڂՀZ>¢:#Qj= ?Ώ(!ڤS۬jTr=~ 8gY]EIZLVΝ_ryI6Dwo皘g@س |^a9jƚmStZp;6qXsomӢ 莻gά5cQ' 릑YA8g^N@|cQ' 5xF waB*iUP3ɽwwwwwwwwwwwwwwwwwwwwwyit:l'ӯua9>j7j{h:5f!,ZB$aB\Lo?&t|LLޏ5z`\>jgۑ4ӏ!-ukBDၦLLL&'ukq7arL?܏#7ar-VH…͹nGN1Ą*1bETM5 J?u97HK"pJV+23ɽA8g]vuGg bFR՘\iZvx,D \9fX.jGǏܰP3p1 ;1 H3prA!B8BIϏޜ͹ BZ}z&HTXICb`Χ&Hĭ1"Dmt{A4H~?pιvZC bFR+:AVZh࠵gz?j8,D \9fX.jGx*JuNM~Ϛ-VH…34ĄrI538'!C]53inGN?܌7 h:5BDၦLLL&& roG 8r$trۑrxY՗\uGDva'np˯\}M5V:#Ӆ9\}z} }f57Ǹ0yS h\pTGDv VY9>MUfh*#PVu9>j7Şn>NУ ͿN'V4 tEGo.Ӣӄٴ Û~nTGDuM<\} >ᅗ_m̚jc1u"6zgN׫TaA8g^N@>1uȹlGDza1q}&ѭ4H~?Ą*gXpx$x8`i!:6:AYq AYfioM#Jj'u97Q' 릒\ĄHİyLO4]@xˮC\HďBLȽKFKgM%$K$6@GDz bH&nGN?vNM%ظ h&`#8iY՗\&F #$%{A4c4bǠ2KHH$l=\HĐM%>?܏ޜFܞ5o> >ᅗ_m̚j |cwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwqن̟tU'*ui8b:#Ӆ9\}yZMIи/=Ep?J=]<:B:#Z I9r{'qϩһU7x(h'һ9ZYA";qk6Dwxa;?`;=}NOm4WmcS{ұrmn*<0M 3A;OiR{jf;Pc| \9 13[CYh*# j6ӻov ͺ,j{DwNO~MSV'm<'|YXGQ|3OS| <1wi`u Մһ9Z9>&ۆܙێ'pࣳ R'@{r9ZYA:#Qj= ?Ώ(!ڤS۬jTr=~ 8gY]EIZLVΝ_ryI6Dwo皘g@س |^a9jƚmStZp;6qXsomӢ 莻gIYr]fWVz) YE$c=PU3OH¢ .O@b :0rQ' xa;;@A8g] A8g^gN d@a@ cPdU P@kGNM#^Qu"6yraCRNVz TKmӢ C`|Һ1&CRNVz TKmӢ C R?J-&CRNVz TKmӢ C`|Һ̆.d$ۧEh)*H |+Uԓ,ětz6q R?J夫+"jIAIbMtV@hx8NaAH |+ŠjIAIbMtV@hx8Na>?~IVW0i2r`XnP/@7@S^|@W-%Y,aBd5$guK$&:+@4<^MnF&|@W-%Y]t!'+= Y%6Z lt 58+0>?~eU*ԓ,ětz6qAGf R?J3!'+= Y%6Z lt x`|Һ*jIAIbMtV@hx8r>?~ d5$guK$&:+@4<^MnN A0>\D9ԓ,ětz6q !'+= Y%6Z lt t\)rr`XnP/@7@>H |+jIAIbMtV@hx8`|Һ,.d$ۧEh)*p>?~֒.jIAIbMtV@hx88)vd5$guK$&:+@4<^MnUj \9ԓ,ětz6qH |+,.d$ۧEh)*+P>?~avCRNVz TKmӢ C a)rꢒ̆.d$ۧEh)( 9@>?~*jIAIbMtV@hx8R?Jd5$guK$&:+@4<^MnMA A0>^B,.d$ۧEh))f.`|Һ^LYvCRNVz TKmӢ C 'M #%/&,!'+= Y%6Z lt AH |+a`=B˲r`XnP/@7@tR?JY I9Y0]R,IN( SgQ@WHj.d$ۧEh))Ǎ`|Һʲr`XnP/@7@Y uʇU&Yiόc:?6rz!حøCuUVY@ !."]z @00(,@`(  HP @`H 0 0  HP @`HXX`$  X @88X( ,, p p 2`(( p p 0P@( ,, $ `^X( `X! @P, , @P@@(,,0  > @,, @|X( p @p  @P@@P, @6 @ $    @P@ p* @p , @$a`$ 0 Ba@P`3  8HXa`X/* @p((`,!@H( X+  `Pa VT,@,XX(  ((`,@H HHXa`X/* $@`$$, X P`0H 0 @H``XH 0 0sѧ6OBU!`$Ȁ$R!(GN#Lj/"̦P6@C ,,  >T,,@ $@@P@ @P( @6 p XH NXX( A`P((|XX( X`H(`0 ,$€$ @,,(, XX( @PP 8aa`$(  @ XXX( 0,$aa`0P( A ,@H HH, `0#  Xa`XX  X (@|,,, `($X( 𰰰(, a (0, p,, ,(@`$p !@`(  $  XX( @`(  HPa`^ `H! $ ,,a`XX @ʅH @a@P, A $ `,, a@P, A $  0XP `PH, p,@|XXX(( `X @P,a`,( @$aA`XxXX( @`(  `PX0PP @  9hЛ~lѧuyP 9a%C!,~roGt_uٷ]pQ =NOB)Ǎqمk =SCTifr:1yF_Μ/5'i{o۫p54Tά5j՜h֙U Dhi<~˱`@G Ȫ w`@yN@Y!Z!uqrm]j\v`!D \& fA C32H00"2dóӐC}逅 Rz9$`5C@e3B?`5K@|qH砑Ƹfk=Ԗ]F 4{$H#&L B?`5K@|qH砑Ƹfk=UC$P%FCJZx&UB`j)P2aqvYHUZEXe# 1 U;A4H™Tˇ,Ȍ/SHz%KȬnCYіZ8(-YØM< T,"jI?n6cxzY\@Y.@3ɽA8g]i*YHę I9YxE^jN?\LN?97OG栄8cċ,IԓHZ$qM- gBTҰU$NVk3:frO݆q'5:NX"ꦋd5$g (ExnCYЕ'$3:g &fUYmNa? h,zLI~W{|S8c뻻wwwwwwwwwwwwwwwwwwwwwwwѮ'ju8w!ޜLmu8=''zۧEi΂=E-X]uI2Y d^BAė(H$aKė(J@dXEԓ5pdEt:?֍7^'g`u7G9=yѧ]8cQ' 릈6IYT4fvZϏpκ1&XuSEZᙬMlfJ$H0!1f񠂄?AU4X!',kȋ &y >i9>gTj7G9>;Vqtrzyb:-0Rn ΋C\R|3WI|Nx{ӏhfk67+SǶ0fUYێ5u81v Tlmu91t'srxTqGgSWΓsoӅ=Q!7f3 ~;OUрzjNOƫjf(sng]pޫN1q{r6~'MGgsaa%e%s *2(LVH+!-1.'u97(h X$n?"viMz*"DI27h*"g'vOsx]>ٽ\]8У܏z~;Ʒ9<K"'=vzYI+_3?F1qߦU8(sqH砺LI0~QbL@VdzIZF,JY&Yi&T<̕I2H6>?܌wwwwwwwwwwwwwwwwwwwww_zY9<…6or}'wwwwwwwwwwwwwwwwwwwwwq?}]NO4ZqC9qzNXO7G9=N{nCY|Z V?Q' P,f/`!   2H…BPK",V"/-% >?b :bKVLEl3YbF  2I# I`Jr4 EY I9cX'D_0Ė D(@Q' dXF@|35{ -%XYAW(H$aKIu+&CPAU*Yd5$b|ZK Y2 Q<,H5kF_;=օ&1tNmEg5 a#Tˇ,ʰc@eÖdc]X]zjГ?3a.Kɔ\GfL PuQ`=_:tYj>U8L X9vS8_sè?3ɤa,Y.`=':i~f?ɪ5?gH\zJ5I &~f?HNB2M@1yL ɮe0jY;2gcXL=Ee4AMzj54vd!?MשjNO|^tizNX:?b : v{Ϛ-CLg`uQ' PbEM%hf/g @e4ALmj*PI SD$ٛƂ $]TbLV"/hd#G|Ѧ> QL;Yv勴qI<':- qIν_r{E'M{=8wN?šܮNOۣPANVk3:frsn;8BL'mQPڧSySeiY7uhT+`\Y|Y[6豩9<=ja<C0ۍVfΝՄ*?=YΙ I+"‹2@V pι I+"‹Z࣏W"G= ,Hďƺ (ZL%QYY!(ZL%QYZ0i2EdXQbDdHH2Pߎ֙o;7 0i2EdXQk@d…UaE̼@n?P^J,(2aBey*Ȱy ?uy9> rou9>;Va9>w΍:I+GgM4I{@|qHaBeU4Xo"aBeU4X> 8r$s0i2ċ,Hk96d^?M#_#y I+"‹2@Y# I$]TbVz&-&XuSEĄM̘1s +IUb>?b :\(ZLP@ Qǫ# IȰƱZN K1qgmHģOGu jUn1+0i2ċ,HUZ%QX"FC|y2P/!wwwwwwwwwwwwwwwwwwwwwwwwwww?EmQǫ#̖EOƹpdgaL(ZKYK"$ 2a1 K0i/cq 8r$s,;>h֚F$ ?1u0yZ)bA$n?b :2aB^M# d%h ɄKp&̘D0y$dCq`L(ZK+2aB\p&̘PVd…"FO$7HK?A`L(ZKx$΁K NM$%{@…bx PX9{= +.(ZL IA`L"^GnGO8wwwwwwwwwwwwwwwwwwwww?PH5{= ))͹QN>?g^zN?2F$8cqES$H#ޜc!-.Ėer\3ɽ]''g>jx}Xz]uI2Y d^BAė(H$aKė(J@dXEԓ5pdEt1ubLPGDz ę,<x&-% 8r$s]&$Ʌ IrD0م I{%P1qgmHāF 3LJM# 2x]&%h 2x$n?b :-%1!Á6daB^0i.dHK?@d…"A$0y83ɽ(ZLIGJM:?r?}nF?EbրTV,H56aUE2P+ 50ccq+JbD< Z!J@evbDȑ*ŭX#!>jlfˢ(IbL L p$%{@…1,LN?ޏ-&WIY0ٓq8Lݙ?}Z*ʼn2ˆ2P)` \#cqQX2U$d0!Mjߡ]t BH 2d)S&67ʢk@d+$H`CϚ0:MCJ@e #$ɑ"67aBei*YPZJMXIϩQƅ=N5\:OuͿMO=Q!7f3 ~;OUрzjNOƫjf(sng]pޫN1q{r6~'MGoEmdzDkD2,˪]% fc2Yt0Ɂ-ȲL$ #$ fJ`:Kc밊2A( YDKEvP+eSHjaEf31bY I|…1-4K0i2r IWH2 '?ŞuEhi7\7 h&wx&83ɽEk@e4H "#qQSSHćln?]sTE"IAQS?W>'{QQƅ64ܞ5oP,F?S}kAf3]'kmg~Vt\xV?Qǫ# I0~Q !'(GyU*e=VdzIZF *%CL1όwwwwwwwwwwwwwwwwwwww_zY9=`W{|S8c뻻wwwwwwwwwwwwwwwwwwwwwwwqrySWrfߧSCp?Jy>wtV(3tZΛՀZuA8g]`K"6zᙬH1i.dr*BA$ ZK Y2 P&RȰ!',kȋ"]AɐUrFS3:gzӮұtuD$ T4fvZϏpκ̱"ꦋ3Y 2 &65j(H$`B) clA @~.h&CRNX+I A4AL>@}hur}_nr}fvZ;`tZa8|g^9=c; bmnWq'mѨa '5j 9S!Xkqc6ry(~OzmSUڡk3:f4|աPpgqgMn<ۢƧ :-Pn5Y:voV:?f+:k2EdXQfWHQNX9+"‹Z࣏W"G=bEM$~5էȠs+TVEet rou9>;Va9>w΍:I+GgM4I{@|qH砰s,Hďư{yHGbEM%h=\eU4XrmȽ<~F$F^J,(+ B?.h+=bEM$' 72bbdόuei*YA8g\̕P@ Qǫ#̖EL~5pd`"^W;>h֚F%?Gz8<ngTjqN6gSTG_l7暫Qtp$%F%BDၦLLL&'roG*P B?U 10@#X91gs+IUa a4ey*ȰLA8g\+X9$]TbGZ*ʼn2AV^h $Kn1t'8if]Zr{Ҹ=ʜ5Vv1t62Ȱeh%4K>4aB\i UjE]X ?3Ϡ Pa58FU E`q IqU E`q Is1 xTZUCX"Ć^ET0Y̮,H<إ\;: `J5k(~f? B4HMlAy,"Y2 &~f?B4TXIC TXIC 狊4"br*4!( ygjIprH'%˱"c4 t#E\ @KIeYTi,2 ը'"̰ei.d 2*ɕ cd,R%TYCRNKbEƐ*2r\.~f?0>Mȸ5 UEd5$9v$]i ,!'%˱"숀cաGf5~ iv&WaE*x 592 ,tUŞ#E0!'%˱"HP@ .ċn^A0&$Q`4ibLeO*Ϛ0QF(ZLJ,UQ40i2(LUD*?3υ͚MѥbLi LITM"qHY? ^̍tFQ[E1 G!,1<QLBVy7 hwzXE"e4ALh…*Ȭ0i.4TXIC y2 .ċP@ .ċ ]`(4z+H,"ZK Y.C97F 3UEAz(!# *"(!"DIcqx "`ȟx+`HjIprH'PdUz)~&'roG*J8$Y`vjl\x?9I 4ȫ( " $8664ӌ*ŭX#!0pA*ln?= QPt?EbրTV,HD8 BH nF?N}NOj4(q|3mt/Q|Z "^GG{ݛP;3`'uOpҭ=WFw+E8c>iwޞͺ柜;vmSz: Gx=ʜy7ޘTĄ/h&'κ(>ei*Y,UE@hEb?b :밲Fa}EU0/=Gq=vyOQFTyk"8B0=jyg!60θuvuGg|<mgGEfGDz F?D^DI  `(ȑAvHr[bțM(!+0 > 8r$s]0صr&|0, vYmQǫ#,ƶū6dM8Zn?UEVei*$d0"VQh $" ?^j+SmW^xkNb`}uhrOI탓r믋Θ.<+y7|hr 8𮡳n=ʔ~OQFB?3 E4ۏG !ᨦ2Zz9.\klZayA$0`2?0 5PFKZ࣏W"G=Y#˟mW"l4C#5Bᨦ2Zz9.\klZ`6DI  ̭%TY@e`V,"FC(*ɶuy BHjaY#CEr0>ۢt m`g뢍6l?*rtգʌf5='OMjbbӮ4yP@5T z? 5T GDz F?D/"h$ Ghza5m> 8r$s]0صr&&H`d-7ei*Z+2Qf 2AVM뢍6(ISLP4n1vHrPv\85j &&ntգZƻJ:{9:kY==Gk9g #mC=bLin=yLeUH:z9.\klZayA$0`2?GA1&UQ4Qǫ#,ƶū6 Ț !nTCI2Th=\ad.~5-\"h$ GGp1&UQ4Qǫ#,ƶū6M8Zn?UEVei*$d0"+6i7B $1&UQ4!-1.'u97(h X$n?"viMz*"DI27h*"g'vOsx]>ٽ\]8У܏z~;Ʒ9<,F?"Ug@eÖeeXey1U22]p1 6Mѧt6Wxbo>jp|&~f?9: NŨ>-'cj ͷ43$ & xTZ=yƚƽZ$ &lR?Ӯ/:?3Q3m:MxkN(`q31 &q9Q`}~T`f&j>'a;<:A 31 Ӑ@Г?3 Zp$}rp덹8OƌyIkM#f"h X$n?u2!ê1q!րdn14ANM# 'h 6I2xMlSD$ 7 'g2 &Ll!-]wCeGc̭%TY@e`V,"FCa% &7HKAC#1ơUiNpqXFi@F.;3gSW8м<1vUqGa]tmm_yE>?6I) d<) A s+IUbX90HD8 BH&6InGO8Br{o h,fk~zuT͸ouΜ} 8r$sX90~Q I9G"?CʬP,Y *%CL0L@yU*em|c>?OMu9@}hur|3AiWw58&Y֫8st|SuޓV?pκhdAV`jzqM3Gg`uQ' U̱"ꦋ3Y 2 &65j(H$`B) clA @~.h&CRNX+I A4AL4ANϠ0ժUtf٬UN]VaCX̬eU4X>ȽH0!1aTABA$Mlfo(JuSE2rƱZN x`B g v}YF:3Gg`uQ' ŠkY̱"ꦋ3Y 2 &65j(H$`B) clA @~.h&CRNX+I A4AL>@}hur{\}ƦcfvZNO|^tizNX:?6If͗56h=Y1u/&L(ZLeU4X>ȽH0!1aTABA$Mlfo(JuSE2rƱZN x`B g v}Y4sޫ/>jl{5j>?b : 0&-&VP2ċ,J d^$hd0ժT A 6I7% Hę I9cX'D_<0!3G;>ٳ 4|fvZϏpκ藓+ęY@ .h+@|35{<`B) clVPI 2 &64P1"ꦋd5$b|D$!:?֍7^'Gۜ0 Zo7>;Vy>w΍:I+G;>Gf#4|fvZϏpκYbEM%hf/g @e4ALmj*PI SD$ٛƂ $]TbLV"/hd#uFMCEr3àU222*p.r+ -6?=iGŠEr5Tif31  Vi7Y~zӅj7<:AݛPڭQ], 'AXYif֜/Q|Zt[Ag)3Z:31 Vi7Yt nxui6yƝt`ј86ib@C1 XD8uF 37D:a̍?6I)bC67D$1O vhdAD$SD$ $%!ˢbx u2!l(Uy ,HĭWċ,H#!0pAMlzqpκ̰ZJQf,Lei*Y2+H I2̖%TY?b :2%1&KIVV,Ş|qVtPdU P@kjdV(%*,ŠkYbQǫ1Y]d…j X+]et!-`APd5Az4J `i&+X+D%$ג Qǫ#i*dXDX'F %xј86ib@xiwG 1123ɽ1t0gͿM@hV7YAW$H$7?HiW&Fqvjl\x?9I 4ȫA@hV "PiÖPAUH +-ǣ%@+HGJ aqU,"ꦋU^@.h"DPVZl(IUq GJ%y, !*+k eU4X2XuSE$d0"`3AYAWdZIUE`IU.?$]TbVʫYbEM$H &05@%  7%$#My-aqU,"ꦋU^@.h"DPVi7Yt2P( q ꢴ0P,B?4ȫ ( !Ǐ*U 0xEUaJfKIVV,&& roGUaJfKIVV,Ş̪0%CL%+IUa ͹eTV*e-%YZJz 2+H I2̖%TY*fXuSE a3̪0%CL%+IUbX9QZFdzIdei*$d0"&B $d1Z=Rf*0J +HC "dciWϏߦ4ȫh I2ĉiWM#jTHN6ۭC )3vxY`( *a$J>P-gFϏ2+H I2̖%TY@e`UEia&YU0H 5Id$ a GEfD5,B?4ȫ ( !Ǐae$%T0 G BYevYQ bK2ZJQf110gSz?" Ėdei*Y," Ėdei* a3#̮+0!IfKIVV,Ş̮+0!IfKIVV, 2kY̱"ꦋ@g?5{"z ` \s+2kYU1h " Ėdei*$d0"VVZ7Yј_s2P ?" Ėdei*Z+2(%-%YZJ 0ժUtfPVu2Pvjl\x?9I kX%D5,d0&J `2?ŠkX?a@hVd5AP B?ŠkY`r#!, 2 *!IfKIVV,&& roG]e$%+IUbA`WaEYD5,i*UE@gnG]e$%+IUbA`WaEYD5,i*UEAvUCX̬eU4X>14oPdUǴWaEI %O0g2Fɀ&5pl1Z=Rf( *PdUH>?}Q[=0|X9QVQ bK2ZJQf-]e$%+IU`#!f-/Q(IQQ]e$%+IUbX9QVQ bK2ZJQf 2AVa2ѺΌժ ΡJ2ۭC )3vx bKd%DA G/&L(ZD#藓&-&CT0Z!, 2%Ʌ IU1:`WD0i2ZJQf,etKɓ %+IUa ͹etKɓ %+IUbA`WD0i2ZJQf]d…fXuSE a3̮y2aBdei*Z+2%Ʌ IU0H GfϚAYAWd]et%1&CT0Z!, 2%1&KIVV,&& roG]et%+IUbA`WD]&$i*UE@gnG]et%+IUbA`WD]&$i*UEAtKɕbLeU4X>?藓+ę-%YZJ̮y2LIU0H Gf.VaJ@9e\n?AZFd…Y L(ZK7 d^X9ia %+IUcu97̖H46KH P-%YZJz 2Y -# 2aBdei* a3#r*f!e<) '2py"A$q'V$R)bKdb@!e C0 a,^EE$H'2x`5bE"0,!H`=ĉ ̞|X9ia %+IUbA`K$%aL(ZL%TY $%aL(ZLeU4X>?dCd0Ʌ IU1h dCd0Ʌ IU0H ifIV^| $r*#iIϩQƅ=N5\:OuͿLƦcD 9I6'{QQƅ64rx'xlc8aq]߂1t'h'U7<:Oy ޫ;xmþn?z}F 6~'@ \uӐCOs;F:> JUA wx+ B?ޏ2+H I2̖%TY=J$]TbGUaJfKIVV,Š2s*0P,i*UE$H`EYM(Hs*0P,i*UEVeTV*e-%YZJ -qTJ"Dn?r?o?]VaCX̕P@ 97̮+0!IfKIVV,Ş" Ėee3,Hď2(%-%YZJ̮+0!IfKIVV,"FC(*5jeuj70% "7evYQ bK2ZJQf-]VaCX̖%TYDPUj*F:3V+:(HmxvUCX̕P@ 97̮ŠkYU1g *!IfVP2ċ,Hs+Ėdei*Z+2 *!IfKIVV,"FC(*5~Z7Yј_s2P#q`WaEYD5,i*UEVevUCX̖%TYDPUj n5jA܌-I8w <1mUN jo6- G}N5\>빧!ֆ:y'|5qsNC u9<$OxӍWGTUEl ^@.h+@eU,"ꦋ$H`EaeAD%0@#Uy ,HĭWċ,H#!Fa $D?zMTVU,"ꦋU^@.h"DPVi7Y(H<~[ C5Wċ,JUy ,Hĉ2AXYf BDH?GDz 2+H I2̖%TYUԓ=\evYQ bK2ZJQf ZJ,qH砰s+Ėdei*@evUCRNQ 8r$sX9/&L(ZL%TYaBd5$࣏W"G=,hl0i2ZJQf ZJX…jI?GDz 2%1&KIVV,D IVW]&$jI?GDz eU4XDeU*ԓ#T<̕I2HŞP2T=$-#T Y&Yig?뻻 h,zbLeWuq9>V?wwwwwwwwwwwwwwwwwwwwwwwѮ'ju8w!ޜLmu8=''zۧEi΂=E-X]uI k%a=E$bLeW(H$aF$Q`5r4 EY I9cX'D_ I j:?֍7^'g`ui\35W難zӮұtuD$P{mf;VgA8g\Ę,ċ,J d^$hd0ժT A 6I7% Hę I9cX'D_<0!3F?Mש|8U~>wj탓HiiuxNtZzN\zp.C3Y]Ǻ=F4Ҭg`u(Nvpaө!ޘO ڣg3oө眡==N'~s-CLg`u͙h;B['τΚyEOOmS tZ6j5mtެ!QtqVtI k+TVEet< pι0X ey*Ȱր(ȑ@Ę,ċ,HkN;@Ę,EdXQfWHȄ1&2%QYZ1&2%QYX#!@ $L$7㵦uy:NI k+TVELI k+TVE8? 2bLeY^J,(2bLeY^J,(@@$~@eq=i|^}NOp5FzNOUNnr{Np?Jǫ1YM#^z9EXuSE`.$Q`5$]TbV(ȑ@Ę,ċ,Hk96d^?M#_#y0X ey*Ȱ̮@bLeYbEM%g2bLeYbEM$' 72bbdόuad/h5 aÀVۢt m0pWuګpWuګܩwŨJ믶\}W{SQ}_m=ʜ՝!r)7BQz*Uq{9:B5hRn\"U]}`*sVtk7ФxֻnguI k+IUb>?b :\I k%T0łqHbLeY,xkD3v}&ѭ4J?~?qGZxq_Ɯm'V]{[⎾oyS5VHKA4K#ĄM̘ LN?ޏ$Q`5`r#0X day EV,Ş0X ei* a4 &0X ey*ȰLچz Iu+&K$ w!PAbdKʫH6z9.\klZayA$0`2?Ur%X,2 GDz F?D/"h$ G? %]UZA(ȑAvHr[bț&H`d* %]UZA(ȑAvHr[bț&H`d*d?ZK Y2Y%eUh=\ad.~5-\#"h$ GJZK Y2Y%eUh=\ad.~5-\'"h$ GJ5 %]UZA(ȑAvHr[bț&H`d-7UYEXuSEUZ%QX"FCh $Kn?EbրTV,HA0% 29Y"Dln?EbրTV,HSB(I`+ȑQX2U$d0"̈́(I %]UZAȑĄ^TX'97TV-h Ebĉ ruʌ(ISPx!H`ʢ*L7a*ŭX#!B࣎Q% U5fSPx!H`ʢ*Lm`(UE1&2%TY &TV,|cO vB':ߦ~vz/#£=Cnͨg g0 W:'vV;"Ԝ1SW4ZO|PsOλM᩽Vtc<Nmwj탓HiiuxNtZzN\zp.C3Y]Ǻ=F4Ҭg`u(Nvpaө!ޘO ڣg3oө眡==N' .semf;VlGZ 9>|'tͺ,j}NO`{oO<1 /U;mfa VbHIVW ,yX1u䰊EdJEdXQk@|qH砼HIVXuSEuir(/%R+&RU+"‹2@D#XE"e%Y^J,(2HIVW ,H I&J:wmfaaɔey*ȰրXE"e%Y^J,(y 䰊EdJEdXQk@ey,"Y2%QYX ? 2ξ/>'8U~=NM'g`u'7G9=yѧ]8c՘馑/h=\))*.h#Ey,"Y2"ꦋGDz aɔeU4XrmȽ<~F$F䰊EdJEdXQfWH @^KVL,HĬW))*.h x8`i 6|cF 3HIVV,Ş|uȹ%R+&RUbQ 8r$s]%Y,xkD3v}&ѭ4J?~?qGZxq_Ɯm'V]{[⎾oyS5VHKA4K#ĄM̘ LN?ޏaɔd@\<~HIVJ a!XE"e%YZJz aɔei* a4 &XE"e%Y^J,(>1+^KVL,Hď*ŭX#!4vaJ@%7ʢk@d+$H`CӭF A1&+"dHZ*ʼn2= BH EdHZ*ʼn2d$L(ZDȑQX2U$d0!ǫ:i(I1%Q+"dHZ*ʼn2ѣT0(IDe"67ʢk@d+$H`Cө֡ $ɉ0]dH?%R+&RU1gHIVV,@+>1t'srxTqGgSWΓsoӆtq+KO`jfu οIUNy' 'U5Vt|9\yⳮmjoU]8=OSO?S ιKHX5UŖI$Q`70if$e9Yhى0_M@j)DK[ P EdLcp$%F%b`Χ&TE1 DQNM# 1v@eQV$H&FDQLv_.Ӣ{io G;7GvqۑOrx'HIVK"'=vzYI+_3?F1qߦU8(sqH砼HIVV,DIVCRNQ P2T=$-#z%CʬP,P*UfJec@|wwwwwwwwwwwwwwwwwwwwwwwww_zY9=# I`Jm7NX:1uzok暫]N5]w3S5~N9I+ާ'Zbmhk:oVjwwwwwwwwwwwwwwwwwwwwwww1t1%Q+&K"6zᙬH1# I`JrI$$j%dBPK",V"/bKVK@ |cOZ4zY֫<;Fw~F 3 'ggCm76[jUNHX5eU4X>ȽH0!1aTABA$Mlfo(JuSE2rƱZN x`B gFS?p5F3t|S3:gG'.Ӣ &5': 77]8;foru9<{nC i8YUQʝ͸ _SCo0FfߧS9C\z{jNO=ǫ:iT4fvZٛƏ㺴*r|.,N>,ǛtXt50Excj_mƫ3QvNGgM# I`Jɕ+"‹2@VA8g]# I`Jɕ+"‹Z࣏W"G=1%Q+&XuSEuir($a,Y2EdXQfWHȄHX5ey*ȰրF+TVE$HaD$% i|^{Nӳz1%Q+&W -h a,Y2EdXQaÁ#(/bKVL%QYZHX5ey*Ȱy ?uy9> rou9>;Va9>w΍:I+GgM4I{@|qH砑$j%d.h#E# I`Jɖ$]TbV(ȑA# I`Jɖ$]TbGYɴk"i0Ė D^J,(+ B?a,Y2ċ,J@e# I`Jɖ$]TbA(!"ps&&&@lA8g]# I`Jɕ1g1r.ibKVLP@ Qǫ#F%a/b3Fc<Ϥ5GO(Oۮ=>xӍYj+okz`Q>jy7 h&wx$x8`i!HKArngbx qi탓{Ti`u{kp5F>Wz?a,Y2UA .@?HX5day a,Y2Qf,0Ė DZJM $j%dUaE0QXF,Hď*ŭX#!4vaJ@%7ʢk@d+$H`CӭF A1&+"dHZ*ʼn2Q&d$X+"dHZ*ʼn2= BH EdHZ*ʼn2d$L(ZDȑQX2U$d0!ǫ:i(I1%Q+"dHZ*ʼn2ѣT0(IDe"67ʢk@d+$H`Cө֡ $ɉ0]dH BZ hBHbbq&*ŭX#!ժ BH*+,eq C0Wa$L7a*ŭX#!ժ BHPeP2q!z+&D6cF+IUbA# I`Jɕ0*ŏᴜ.hQUg\zz/#£=Cnͨg g0 W:'vV;"Ԝ1SW4ZO|PsOλM᩽Vtc<Nmi9>;Vy>w΍:I+GA8g]4ANeiY1qXuSEZᙬMlfJ$H0!1f񠂄?AU4X!',kȋ &y >i9>gTj7G9>;Vqtrzyb:-0Rn ΋C\R|3WI|Nx{ӏhfk67+SǶ0fUYێ5u81v Tlmu9|'tͺ,j}NO`{oO<1 /U;mfa Vb"UaE] +F 3"UaEQǫ#s,HďƺC^J,(+B?2EdXQk@dD9+"‹$d0"DDvξ/=]|ٽXcs+TVEDC^J,(y W -h 2EdXQ`H <Gz: jU97Y֫0;Fw~VbF$> 8r$seU4Xo"".h+@|qH".h#5{@x4I|!̯%QYY!CbEM%g2".h x8`i 6|cF 3"UEϏpι1J aG(ȑ@D9ȰƱZN K1qgmHģOGu jUn1+JbD<ل(I*ŭX#!aJ@er&D*ŭX#!2P+Iu+&CPARdHZ*ʼn2u~J@d E0 \%"67ʢk@d+$H`A}anNB $,V.(*k"Dln14oPdUǴL(ZK$K柏` ^@e4PM#j#a0~r7gA@hV( "DN?EbրTV,H58B $iW&DciWϏߦ4ȫh rEQM/% %O0g2Fɀ&5pvjl\x?9I 4ȫA@hV "Piʢk@d+$H`C(I0L0gͿM@hV7.(*k$K柏` ^@e4PM#j#a0~r7gA@hV( "DN?EbրTV,H>(I0LA8g\4TE{<4o,=2x9t"*& ^K$KfQǫ#dXDkH5{Iky|5p?5{=0LA4V$Pl1Z=Rf <4v`AO IO8UZ%QX"FC  BH 5rdHgrȰGg kcs+IUb@D90*ŏᴜ.hQUg\tXZ>-z/#£=Cnͨg g0 W:'vV;"Ԝ1SW4ZO|PsOλM᩽Vtc<Nmw'ory!̖EO}#Gz ϩ5uWq꿵g`~Pc6ͿM֫:pQ .<+G(ȑ@D90~QCRNQ P2T=$-#z%CʬP,P*UfJec@oȀ.T\*roG|wwwwwwwwwwwwwwwwwwwwwwwwwww_zY9=5*x3n>'p?Jwwwwwwwwwwwwwwwwwwwwwwwwwwq?}]NO4ZqC9qzNXO7G9=N{nCY|Z V?Q' "dXF@|35{ &rEQM/% $dj$UQ1\(MaCRNX+IDH)"bDB?MשjNO|^tizNX:?b : v{ 3Y֫3F 3,HĭEA 6I ZB  $hd3xABPċ,Iԓ5pdEMl׫NOxXouǧ=ش35~{tjH3I*fvZŽTmgV:r;}ͪ6s6:yޛTryT4fvZٛƏ㺴*r|.,N>,ǛtXt50Excj_mƫ3QvNGgM1W ,yX1tY^J,(> 8r$sLE$]TbG]Zq܊ EdXQfWHȄLE+"‹Z)EdXQbDdHH2Pߎ֙o;7 LE+"‹Z)EdXQaÁ#(/鈲EdXQk@e1W , GxcOZg_S Q@&S3:fzӮұtqVtHėGDz ċ,HktLE$]TbV(ȑA1XuSEg&ѬbKoLE+"‹2@Y#b,"ꦋLE$]TbA(!"ps&&&@lA8g]1V,Ş|uȹ"U 1`z9&"dXDX'F %xј86ibQt':vOp5F74mVp9>Jޘ?u{ϚiG BZ b] $$Nndbbq&uKYDWϏߦY{@ePrE6DTL@$H$6 ?࣏W"G=Ȱ֐jhGg kȽ]̪"&'iv 2z,ʢ+V$P]̪"iv 2<ـ5z?T£,3a+,…"br+%XYAs1˨ aUQ# i zXK1Wa%""IJ)f?UJK骾ykreUW21&DdA,2I2UC 0Ta,TaUD*ZIU,AUd  *"̪i`k*EA٘D{)U2Qey*ȱ&Uג"@Lia Ԥcp$%F%b`Χ&TE1 DQNM# 1v@eQV$H&FDQLv_.Ӣ{io G;7GvqۑOrx'%a_~Br{o h,fk~zuT͸ouΜ} 8r$sLE0~QY I9G"?CʬP,Y *%CL0L@yU*em|c>?O*ւשYeQDuq9>V?wwwwwwwwwwwwwwwwwwwwwwwѮ'ju8w!ޜLmu8=''zۧEi΂=E-X]u˪dXF@|35{ IeYTQ5 $dtYEUE\(MaCRNX+IB,2&DB?MשjNO|^tizNX:?b : vymf;VgA8g\"ꦋ3Y 2 &65j(H$`B) clA @~.h&CRNX+I A4AL>@}hur}_nr}fvZ;`tZa8|g^9=c; bmnWq'mѨa '5j 9S!Xkqc6ry(~OzmS睁ڡk3:f4|աPpgqgMn<ۢƧ :-Pn5Y:voV:?f+:eey*Ȱ̮qN.+TVEGDzeU4XVw"uY^J,(+B?U+"‹Z%ey*Ȱĉ 2ȑ"d!3iv:voV]VW -h U+"‹ Gx.+TVEKUaE#(/Lr|35Wr}fvZst|SuޓV?=YΚi(ȑ@"ꦋ?]!˪.h+@|qH]VXuSEg&ѬbKo.+TVEet<Gċ,J@d"ꦋG 112g?b :ei*YA8g\uY*,࣏W"G=Y2+I0y^4f?8MZi4⎴ QMǍ8U=NOR};|槚jGxiwG 112ɽǏ˪U 0xP@L/ C2겴Qf, UE@hM겼EdXQd &|cTV-g]VXuSEUZ%QX"FCh $Kn?EbրTV,HqP% 2"br*LUZ%QX"FC!nJ@eqd+EX&D*ŭX#!_50% 2]B&D*ŭX#! B0lAEpqD|LD#cq+JbD5ͲyЃ% 2Y*P2.i2$F1t0gͿM@hV7T<EQM/% %O0g2Fɀ&5pvjl\x?9I@. @,yDY`0%zq+JbD@/AM#jȑ.+IUb@%TY &TV,|cO vB':ߦuQp>D 9I6ȽH0!1aTABA$Mlfo(JuSE2rƱZN x`B gFS?p5F3t|S3:gG'.Ӣ &5': 77]8;foru9<{nC i8YUQʝ͸ _SCo0FfߧS9C\z{jNO<, 3Y֫6f l >:kq5>']=L'hvچqӳzGǫ1Y ]+"‹2@VA8g\5vW -h=\WeU4XVw"j%QYY!Wey*Ȱրj%QYX#!@ $L$7㵦uy:NWey*Ȱրj%QYXpH <j%QYZ ]+"‹GQ^ 7:?֙gTj'ɽYާ'/:4'z41%Qǫ#j"ꦋ?]!WeU4X> 8r$s ]$]TbGYɴk"iWey*Ȱ̮@,HĬCWeU4X@@ 1N ]1g1r.aUA X*?GDzY2+I0y^4f?8MZi4⎴ QMǍ8U=NOR};|槚jGxiwG 112ɽǏWd@\<~%T0S 5vV,Şj%TY & ]+"‹ a3ʢk=bEM$|c!-wi%g1 |6cTV-h Ebĉ y2P/!UZ%QX"FC*1 $dIɑ"67ʢk@d+$H`@AQ1d9e&D*ŭX#!2P+Iu+&CPARdHZ*ʼn2 0% 2@DȑQX2U$d0 AJ@fF&@AFdqv "67ʢk@d+$H`Dd$d2$FTV-h Ebĉ :j $u 0 ʼn"67Q' 릑5{?}Z*ʼn2AM#jȑ ]1g+IUa U:?i99<]8УƫIιqCY@%xT'qzMٵ |:qAj_*t`'rބZ?q暫Y>w}ۮiüqYi57Ӯp|'ܩͧ}GYg\%VXj I|ED ɐWZK Y2 "Yfc$DPT etwtV(3tZΛՀZuA8g]QK"6zᙬH1PrE6DTL@(H$aJH)"bBPK",V"/H)"bDB?MשjNO|^tizNX:?b : v| 3Y֫3F 3,HĭEA 6I ZB  $hd3xABPċ,Iԓ5pdEMl׫NOxXouǧ=ش35~{tjH3I*fvZŽTmgV:r;}ͪ6s6:yޛTry T4fvZٛƏ㺴*r|.,N>,ǛtXt50Excj_mƫ3QvNGgMQW ,yX1uDY^J,(> 8r$sTE$]TbG]Zq܊ EdXQfWHȄTE+"‹Z*EdXQbDdHH2Pߎ֙o;7 TE+"‹Z*EdXQaÁ#(/ꈲEdXQk@eQW , GxcOZg_S Q@&S3:fzӮұtqVtHėGDz ċ,HktTE$]TbV(ȑAQXuSEg&ѬbKoTE+"‹2@Y#,"ꦋTE$]TbA(!"ps&&&@lA8g]QV,Ş|uȹ"U 1`z9*"dXDX'F %xј86ibQt':vOp5F74mVp9>Jޘ?u{ϚiG BZ b] $$Nndbbq&?TE`r#,P@L/ C5DYZJz Qf0AQW ,ό*ŬeU4XQX2U$d0! BHDTV-h Ebĉ ]AJ@eQ"Dln?EbրTV,HqP% 2"br*LUZ%QX"FC*1 $dLUZ%QX"FC!pfd$WHș#cq+JbD4.ӎ(IDQI4Aș#cqꈲQf,ei* a4 cGxm'>'Gvp8p|>68 Bm;a<*?8=&چpvyٝ~8s{`~i0^oB-I8sMU;m4~niF8N>z?T£,3aH lED ɐW`\*JH3RMjrʨ`H`2UCDZFd,/7\7 h&wx&83ɽEk@e4H "#qQSSHćln?]sTE"IAQS?W>'{QQƅ64ܞ5o"dXD߂1t'мCZ 7Y8w]fv3n;1t'nNOUnr{Np?JNMl8ʿA[jUNZJL(9$]TbVfk"y SD$نR  @e4ALmh (bEM$jIi82"&6IB1t'nNONOUl@XNL's ',tRt7Ӈ|tZͿM=5 $~f;VaG*w6㳄+ ~N9 xf9~NO<qMu9 8r$sZJL(9$]TbGX=#UEaE̱"ꦋGDz IUI2ċ,Hk96d^?M#_#zUEaE̯%QYY!֒. ,eU4XUEaE̱"ꦋG 112g?"Ug@eÖeeXey1U22]p1D0=8( &18ӄhqF1 fi!րi@EFZ,":N"h pFD$1! vhd';@e4AL q vz) aόN!dD$̞|4ӌu֒. ,ei*YA8g\UEaE̕P@ Qǫ#UEaE̖EL~5pd`"^W;>h֚F%?Gz8<ngTjqN6gSTG_l7暫Qtp$%F%BDၦLLL&'roG‹*P B?%T]&XU 10@#ZJL(91gQtQ`s+IUa a4. ,ey*ȰLZAi*0XuSEUZ%QX"FCh $Kn?EbրTV,H4d$UH2$FTV-h Ebĉ 2P"*& ^L,ȑQX2U$d0"L BH VDȑQX2U$d0"aJ@et<"67ʢk@d+$H`CB8ADED"67ʢk@d+$H`D5jЄ(IEɑ"67HK@P4A^<~&'roGZ*ʼn2(`pJ@eɑ"673QX2U$d0 Qh $&D6cUEaḘ%TY=‹ZJMXIϩQƅ=N5\:OuͿN\@%xT'qzMٵ |:qAj_*t`'rބZ?q暫Y>w}ۮiüqYi57Ӯp|'ܩͧ}GYg\%"l@A"؊!( 9YeUU1f?"( PQ9DYd ,0u K]X_3P4AXHKA4K6 NM+Z)bA ꈢ2F$8cqb;ʢ(HL zI9<]ErvoWj4(#ޟ}NO=i*0K"'=vzYI+_3?F1qߦU8(sqH破QtQ`s+IU` IUd5$*%CL1g2T<̕I2H0VdzIZF1:?ʾ5ur{%f\}}NO~]'FiU܇zs53Yұnr{n/: ? `wwwwwwwwwwwwwwwwwwwwwwwqNaVK"6zᙬH1U  2IU @h,rƱZN 0\!G|ѦYާ'/:4'1t;>2T4fvZϏpλ ċ,J d^$hd0ժT A 6I7% Hę I9cX'D_<0!3F?Mש|8U~>wj탓HiiuxNtZzN\zp.C3Y]Ǻ=F4Ҭg`u(Nvpaө!ޘO ڣg3oө眡==N'Xmf;VlGZ 9>|'tͺ,j}NO`{oO<1 /U;mfa Vb¬%QYY.?b :*UaEQǫ# ċ,HkN;AY^J,(+B?+TVEXU+"‹$d0"DDvξ/=]|ٽXc EdXQk@eY^J,(y ey*Ȱր EdXQ`H <Gz: jU97Y֫0;Fw~VbF$> 8r$saVXuSE`.*.h+@|qH¬"ꦋ?MYHė¬%QYY!U$]TbVz,*.h x8`i 6|cF 3¬%TYٽ\]8У܏z~;Ʒ9<d,"~:?h^}NOmtһU;jmnYӂ8aqX:?GDz *UE?( rDʇY&Yi*UfJe` P2T=$-# xDt UpSz?뻻 h,z]%Ql9euq9>V?wwwwwwwwwwwwwwwwwwwwwwwѮ'ju8w!ޜLmu8=''zۧEi΂=E-X]uˇ2Y d^BAYed9e\ AIIeYUr4 EY I9cX'D_ ,r*DB?hSιJ?LV@Fu h°wwwwwwwwwwwwwwwwwwwqb;=Yjd0W#<:S.+*+ɍY/$I25?=w+31X L`˾jgc0Mre0j A2gcP LD9vS爾|ZI@95.`圄0i25?X( &s)S֜/Q|Z1$ &\9ɔr~u`b @kH2X`Zm/: AdavS_B; X &UC 0)Sʾ.CYS1(&##Y3x57'C1(&2059e0j~xx׫U,  ʫ$0e0jyNڃV?G*0~f?$d@©Œ Ot\:LÇfO(zIp5燌A:.j c`PL†].5<D 8r$s..h#Es,HĭQǫ#pXuSEg&ѬbKo.UaE] ,s,HĬK2ċ,H $$Nnd Q' ei*YA8g\pJ aG(ȑ@s%a/b3Fc<Ϥ53O(Oۮ=>xӍYj+okz`Q>jy7 h&wx$x8`i!:uz&u9<딣hDS8c뻻Ù*P B?day ei*Yei* a4 &pW ,όuʢk=̱"ꦋ>1ǫ1YDkGo,=d`Ɛ`.d`Ɛ.d4j,eDžx'NcGc,`ƐZK Y2 ]Be0jcHP*]a UC 0z )SAvY29v$]qP`s"BMB̸OdИE fO,`Ɛ,EB̊ N9V8H4:~f?2059e0jcHˀdUfF"F\xQ2tz벪(LLdYUdY&F\xQ2tz aTaFS4SDd=vXH`h Xˏ 4N?3@D9vS4!( F\xQ2t#gBEX Li.4j,eDžx'NB1 ft$Z=UA,e0jcH-"`pѨ@9S&\xQ2tLζqʴal$p]t?3@…`Ɛ0i  qF4ӣPCY?3At)SAi*0K2LIqP`s.<(ƙ:tj\?3@†].51. ,ds&0%\ 527d0_wNM;*ϩ|ˇ2Qf, 2Qf0QXn8\91g\900ۑ<6Sڣ ;8zj>t ~)Gh30yrvmC8x_;<οAPZ=ð?J] ܯ7jnz{6~p?\Vum M'*sirtzaQt61V{0ylPAbd9e˨ZZ*fc(!eprHU .HQfR- $ bKÙ`1<\"2059e2*(L ,z찑y( f?y2 dK냗ds&--i*0K2LI|ZJL(9̇du‹.Ʌ ds1K,̪K/Rav0VXz.  fc2a"PAi,3+GO8HKA4K6 NM+Z)bA ꈢ2F$8cqb;ʢ(HL zI9<]ErvoWj4(#ޞ;Ʒ9<딣h} =vzYI+_3?F1qߦU8(sqH\90~S@s!'(GyU*e=VdzIZF *%CL1όwwwwwwwwwwwwwwwwwwwwwwwwww_zY9=vYhH ͺI+]c뻻hS5VjNfk6:rV?NOmӢAGۢtՏ?b :밋%a=E$ ,tD:F\ AI.‹"&Q(J@dXEԓ5pdEvY2t0DB?MשjNO|^tizNX:?b : v|5iڡk3:f|uaXuSEZᙬMlfJ$H0!1f񠂄?AU4X!',kȋ &y >i9>gTj7G9>;Vqtrzyb:-0Rn ΋C\R|3WI|Nx{ӏhfk67+SǶ0fUYێ5u81v Tlmu9:kq5>']=L'hvچqӳzGǫ1Y]Y^J,(+`\uaW -h=\aXuSEuir(.,%QYY!aW -h ,%QYX#!@ $L$7㵦uy:NaW -h ,%QYXpH <"UaEE+"‹GQ^ 7:?֙gTj'ɽYާ'/:4'z41%Qǫ#".h#EveU4X> 8r$s]YbEM$~5F/h/vey*Ȱ̮@ċ,J@eveU4X@@ 1N]YZJyN"UA X*?GDz %a/b3Fc<Ϥ5GO(Oۮ=>xӍYj+okz`Q>jy7 h&wx$x8`i!xvd@\<~UA e0 aV,Ş"UE@hME+"‹ a3ʢk=E$]TbG?EbրTV,H;0% aQX2U$d0"L BH VDȑQX2U$d0!F8a!J@eŖrdHZ*ʼn2- d$DȑQX2U$d0" (IQ]p ʼn"67Qf,aV,@+>1t'srxTqGgSWΓsoӆѡY a<*?8=&چpvyٝ~8s{`~i0^oB-I8sMU;m4~niF8N>z?T£,3a+-Ŗ|Ay-e- $ bK? BZ b] N&& roGDQZM#HTE1!iUEbDdnTEkO:-=Ƕ}zTqGg͹>w'ory밋%a_~Br{o h,fk~zuT͸ouΜ} 8r$s]YZJ]Y I9G"?CʬP,Y *%CL0L@yU*em|c>? h,z ,t˱"ͺI+]?OMu9mP5j>?b :밻,HĭEA 6I ZB  $hd3xABPċ,Iԓ5pdEMl׫NOxXouǧ=ش35~{tjH3I*fvZŽTmgV:r;}ͪ6s6:yޛTry[jU3xwVBO ŝ5nS.;O mC fj?|ٽXB՘%QYY.?b :밻+TVEGDz ,HďƺavW ,y밻+TVEWavW ,H I&J:wmfa밻+TVEWavW ,8p$~@eqvey*Ȱր.UaE#(/Lr|35Wr}fvZst|SuޓV?=YΚi(ȑAveU4Xo" ċ,Jz9."ꦋ?MYHė޻ EdXQfWH @]bEM%g2 ċ,H $$Nnd Q' %TYz?T£,3a+,FF ()00c]&%‹"&Qa1%!-1.'u97(h X$n?"viMz*"DI27h*"g'vOsx]>ٽ\]8У܏z~;Ʒ9<]ȰcO]y9=ކn5p?J=WѪ fvygN >Džcz9.%TY.솤@VdzIZF,JY&Yi&T<̕I2H6>1]'}kAf,jͺI+]c뻻hS5VjNfk6:rV?NOmӢAGۢtՏ?b :E%,f/`! ,2),BA$ .(*˔% T,"jIi82"]%QfUE%(@ >i9>;Vy>w΍:I+GA8g]4AN;NQڡk3:f|u˪K2ċ,J d^$hd0ժT A 6I7% Hę I9cX'D_<0!3F?Mש|8U~>wj탓HiiuxNtZzN\zp.C3Y]Ǻ=F4Ҭg`u(Nvpaө!ޘO ڣg3oө眡==N'v-CLg`u͙h;B['τΚyEOOmS tZ6j5mtެ!QtqVt˪K2EdXQfWHQ' Uey*Ȱր(ȑ@,Hďƺ K2EdXQfWHȄ.),UaEꢒ̯%QYX#!@ $L$7㵦uy:N˪K2EdXQk@d+TVE8? 2]TRY+"‹Z%E%^J,(@@$~@eq=i|^}NOp5FzNOUNnr{Np?Jǫ1YM#^z9UeU4Xo"]TRY$]TbV(ȑ@,HďƳhE1%7Uey*Ȱ̮@]TRY$]TbVz%E%bEM$' 72bbdόu˪K2Qf,F 3E̺%T0łqH]TRYȰƱZN K1qgmHģOGu jUniwޞͺ柜;vmSz: Gx=ʜy7ޘTŞu"^XjK.%\ בU dKuxiwl:QVSHĂ,7E;@e4Hp&w=DQX"$E3~rxNOq.xޮ.hQnGO?[yuQIe,F?S}kAf3]'kmg~Vt\xV?Qǫ#uQIfV,D K2rDʇY&Yi*UfJe` P2T=$-# r1]yWކnNOEUSH,$YDӒͺI+]?OMu91t'nNOUnr{Np?JNMlmڡk3:f|u*.h+@|35{<`B) clVPI 2 &64P1"ꦋd5$b|D$!:?֍7^' jUfާ'g`u?O] ,]EM9hkOuS:):oqþo`qv- fߦwrx p?JY֫0;qN?za<3jͿN'r:{MT4fvZٛƏ㺴*r|.,N>,ǛtXt50Excj_mƫ3QvNGgM%QYY.?b :ey*Ȱր(ȑA"ꦋ?ӎPD+TVEeth֚F%?Gz8<ngTjqN6gSTG_l7暫Qtp$%F%BDၦLLL&'roGJUA .@cTV-gVXuSEUZ%QX"FCh $Kn?EbրTV,H_!J@daE&D*ŭX#!ժU[T BH +0UUdHZ*ʼn2 _[T BH ŠUd`#cqei*Y"U0*ŏᴜ.hQUg\ڂ\moZ>볦z/#£=Cnͨg g0 W:'vV;"Ԝ1SW4ZO|PsOλM᩽Vtc<Nm QL;Yv勴qI<':- qIν_r{E'M{=8wN?šܮNOۣPANVk3:frsn;8BL'mQPڧSh-CLg`u͙h;B['τΚyEOOmS tZ6j5mtެ!QtqVt.UaE] +F 3vW -h=\..h#8EKEdXQfWHȄD+TVEQ.UaE2d" "DBC~;Zg_Ӯtެ1%QYZD+TVE8? 2vW -h ]+"‹GQ^ 7:?֙gTj'ɽYާ'/:4'z41%Qǫ#%bEM$~5ȺB?]$]TbV(ȑA"ꦋ?MYHėމvW ,ydeU4X%bEM$' 72bbdόu.UEϏpι4KUA X*?GDzd,"eV#ahqF1(i:?i;uǧ8U~q8z ZwoL:`vO4Z!-1.' 72bbd118Sz?]`r#jPd$2<0W# SmW < _yʿG ^ReyʿG S[bț Ț !#\$]BҴa`>ۢt mర=7#Agq\9W¡+ժTZ 9W¡ pklZ`0ٽ\]8У܏z~;Ʒ9'ւfN]ǪY5Aێ67ZGۜ0࣏W"G=KQf vCRNQ P2T=$-#z%CʬP,P*UfJec@V?wwwwwwwwwwwwwwwwwwwwwwwqrySWrfߧSCp?Jy>wtV(3tZΛՀZuA8g^B,El3Ydda $dda*Yd5$b|0DB?MשjNO|^tizNX:?b : v|mf;VgA8g^B,"ꦋ3Y 2 &65j(H$`B) clA @~.h&CRNX+I A4AL>@}hur}_nr}fvZ;`tZa8|g^9=c; bmnWq'mѨa '5j 9S!Xkqc6ry(~OzmS]ڡk3:f4|աPpgqgMn<ۢƧ :-Pn5Y:voV:?f+:rey*Ȱ̮qNא+TVEGDzeU4XVw"Y^J,(+B?E+"‹Z2ey*Ȱĉ 2ȑ"d!3iv:voV!W -h E+"‹ Gx+TVEd"UaE#(/Lr|35Wr}fvZst|SuޓV?=YΚi(ȑBB,"ꦋ?]!".h+@|qH!XuSEg&ѬbKo+TVEet<Gċ,J@fB,"ꦋG 112g?b :ei*YA8g\Y*,࣏W"G= Y2+I0y^4f?8MZi4⎴ QMǍ8U=NOR};|槚jGxiwG 112ɽǏ"U 0xB,P@L/ C9Qf,$"UE@hM EdXQd &|cF 3V>?5o|a'ID!šv)=ΝiQu,t2"s++=UZAcGGDza1ba3Ui3!a.yVB6Y$ɄZLFFdˢ`ZLFFdˢ`(ȑ@OƱZN zI PtL'bz "^[;\]ΝiQuGDza1ba3UEfB20%T.]m$I 3!a.KUEfB20%T.]n?GDzd"~5pdEQv0U Dk2yƌyIkM#f꨻i PtLh $dXp$%:/#8'u97EW]Bhl]u V$PF%h V?wwwwwwwwwwwwwwwwwwwwwwwѮ'ju8w!ޜLmu8=''zۧEi΂=E-X]uɀ 2Y d^BAz(H$aEz(J@dXEԓ5pdEP:?֍7^'g`u7G9=yѧ]8cQ' 릈6I~N>iڡk3:f|u]$]TbVfk"y SD$نR  @e4ALmh (bEM$jIi82"&6IB1N]vV,Ş|uȹ%T0łqH^LYȰƱZN >Fc<Ϥ53O BZ b] $$Nndbb`Χ&?]vJ aU 10@#]vV,Ş벴Qf0Au^J,(>1+]vXuSEUZ%QX"FCh $Kn?EbրTV,Hn;0% 2r&D*ŭX#! aJ@d*J "67%TY=ei* a4 cGxm'>'Gvp8p|>68^jN?\qYD 9I6'p?Jwwwwwwwwwwwwwwwwwwwwwwwwwwwww:=75MU;әͿN~t|St1yQg57ūc뻻pιy0fK"6zᙬH0P  2HP @h,rƱZN \!G|ѦYާ'/:4'D$yc N>iڡk3:f|ud,HĭEA 6I ZB  $hd3xABPċ,Iԓ5pdEMl1t'srxTqGgSWΓso6mUΧ5KO`jfu οIUNy' 'U5Vt|9\yⳮmjoU]8=OSO?S ιK I9k YeUU17\7 h&wx&83ɽEk@e4H "#qQSSHćln?]sTE"IAQS?W>'{QQƅ64ܞ5o痓d,#dA_~Br{o h,fk~zuT͸ouΜ} 8r$s̭%TYfKɀ .jI?*UfJeb@dyU*e`*CʬP,ch3uyWކnNO0 UP^LY~W{|S8c뻻wwwwwwwwwwwwwwwwwwwwwwwqrySWrfߧSCp?Jy>wtV(3tZΛՀZuA8g\P%a=E$^LYrI$^LYr4 EY I9cX'D_ ɀ .Q>@}hur}fvZt|SuޓV? v{c N>iڡk3:f|u0.h+@|35{<`B) clVPI 2 &64P1"ꦋd5$b|D$!Q' a1g1r.fdT=\ ɀ 2Y2+I=r'\60d1qgmHā!-1.' 72bbd110gSz?a`r#*2^@fei*Ya00ey*ȰLZ@ "ꦋ>1+JbD<ل(I*ŭX#!vaJ@d5$LUZ%QX"FC N $i.Uda% "Dln?EbրTV,Hz7P% 2UC "UdHZ*ʼn21yXB $̄daɑ"67ʢk@d+$H`E'Z (IdHZ*ʼn2Wj(I/%&DcF 3F *&-% %O0g2Fɀ&5pvjl\x?9I 4ȫA@hV "Piʢk@d+$H`CϚ!J@e4"Dln1 %TY= 2Qf0QX<6Sڣ ;8zj>t ~n6\}qYD 9I6w'oryz,s 0h8߂1t'мCZ 7Y8w]fv3n;1t'nNOUnr{Np?JNMlͶmP5j>?b :YbEM%hf/g @e4ALmj*PI SD$ٛƂ $]TbLV"/hd#G|Ѧ> QL;Yv勴qI<':- qIν_r{E'M{=8wN?šܮNOۣPANVk3:frsn;8BL'mQPڧS6-CLg`u͙h;B['τΚyEOOmS tZ6j5mtެ!QtqVtJEdXQfWHQ' 놕ey*Ȱր(ȑ@4,HďƺJEdXQfWHȄ *UaEҬ%QYX#!@ $L$7㵦uy:NJEdXQk@d4+TVE8? 2U+"‹Z!Y^J,(@@$~@eq=i|^}NOp5FzNOUNnr{Np?Jǫ1YM#^z9eU4Xo"U$]TbV(ȑ@4,HďƳhE1%7ey*Ȱ̮@U$]TbVz!YbEM$' 72bbdόuJQf,F 3E4%T0łqHUȰƱZN K1qgmHā!-1.' 72bbd110gSz?d@\<~Uc)`FU1gU00Y^J,(>1u']ry$9IWͿMvm@%|wwwwwwwwwwwwwwwwwwwwwwwwwwww1pԓy5A࣏W"G=ҬEOƹpdgaCRNW;>h֚F$ ?7<5ANM"vyHKA4K"^V @#E;@e4Hp&Ȋ)$dC}ށK5A.?gĄHĻ%`LO1JM;f&yS >£))bC67QNE2DHn? d^ I9/Fr^@5$N| I9/gr]S>?r?}!,@# I9/gaQXiVXuSEUZ%QX"FCh $Kn?EbրTV,HS% 2ZKY%XICȑQX2U$d0"f ?A\` &*IbdHZ*ʼn2е_f ?A\` >F*&D*ŭX#!vpiBd$CRNK"Dln14+IUb@4+IUa U:?i99<]8УƫIιqn>z/#£=Cnͨg g0 W:'vV;"Ԝ1SW4ZO|PsOλM᩽Vtc<NmDžcz9ei*@4!'(GyU*e=VdzIZF *%CL1όA8g]i*Zj Hę I9wwwwwwwwwwwwwwwwwwwwwwwwwwwwwquϼF;V{ MޭPVuS=NX:n([8ɨ`;Fyt \9fVUWS.%_3` qozti'CU?3`$nCYї;?CY0ٓ?3`(F {Ld49W{iʸ &qEH\}!q8(ɵJMQ'jUd,nCYї CYI]F8a&~f?m- gF\5]bgcTZ^TZgcz[8³f?dޝA<~t'c &u@Z8^0r~`5bEnNOPL@?.LI3Dξ,Y]gT ' Rz!qjr>'cXX,5J ?T.6ӺRU H,5J*m;*\}O5J98s|UwUUʸՉ*N1  Z8Š5G?3g_5?˾jgcXXMFmayM`5bE|Uw}c?3mB0lpwFʴɆV$P=Sj]c)VfRm `Q8\Y 31,L_"լO4+3z ? _ ;3@ ξ,EEBz0n5Wz1,I-ZpG ~f?`0Lpʾn>'cX aقGhU q XBq]qcX hZVЫU㳄0"ʜiYcX &mg &9;8Irn~f?`8Y60ͱj9QCY^mQʌ`8,3lZTaf/7=9gcXmQʌ2Ӣʜ;*ä' f7Is=i8L pͱj9QNͳ<'<8Bt$br :Un6gVtm̙Dbr V Yl cXmhk:3QgxW*56qS1, &0<>mRjm&ygcX &+F0N>k4gG4L ɜeݟYjUʌ6ɟ`@,.VlѦܬ4gG4L30:Y;: $$,"p]DžY-3m ;]qj .ºVd$N(5huUU4>/:?3$&ۢtd^t*51n6\}1, ɚiF3ZqьtgG Uq$&/:2槞#:8mګ|$ &/:2qjgΎqaP @b&(,+#:8mګ cXPMSq{ AjgG UqB~f?`I7;:|?~qeSp-FzQ8XMޫMʾZncެ?^oV1uzӭN;7Ū~f?Y6&vl@iDZj7 5Yθg gFc<Ϥ53OSHĂ,7D:apθa@eC27 'h MlSD$jpp 5CNBB5V$tQLN?ޏ靜0+8zjƅ絝q鋵Gm_x*?u2裣lo̺(4ANMl$L!H`2 $d0 1h %TYD !JA4ALn?r?}?hStZ΄i7Znx]>ٽX:?ZN S],PaCRNX+I1v@E>1Nפ~fUCEr0Lr̬ &4 \9fK W6ਵgU1̘ؒD!8Yvvz@@u!Ηr~ՉBUWf|ZJUE$H`E'5r BHRp?JW*8Yvv'5ȓ#!B1*,&$@BX:j PI*\i8Yvd G4DQ"D@$(HoNNݙcUEV,"FC(>њWfd$)8YvcqĄ/h6xa_u97]oy8(_mw!vh mnLNƶE8;C/7x`nryvgQЋRqwt9 0]m4.*2`i]|UD$Hoe_x^txxc!-;O 269Z4r8 ;O 2xG4DQ"ɒ$@ y2Dm4.*"FL$6|6couWċpѻ2z ve_2yxE;O 2Gg: z ve_vd| <0WgfOA ٙwҽN5X;j~PAG࣍Vy- gH:!-"",w a" TbK29Y~=2bq&ZJUE$H`CnCYї eGB $7ʦ YϏ܏Ą Y˻0S10gSz?%TY@ei*2 ,VP%&C!rh @H!"ps&&&@ZJUE$d0"+6M5VنRJLBfɦ[3xABDၦLLL!Qf-0H`D.VljنRJLBfɦ-h @H!"ps&&&@ZJUE$d0"+6M5VfaTA!Yi37( $$Nnd]&$|Yla>?d9dJɕdJϏęUD*d5ZLU1gI2TɅH4y0kԋ$JBEa% iyxhFK.ˤtZΌhhb %HS],EMTRmUA1"",EfEX+#1gye<+8F .0VE*.4 ȳ%C0%δ1yVjٍD0 &d## 2E~f?pU.U  (j@Ree5 hfGft@ Ue u0 &VeU+%Hs,$^Gc- gF\hb %IQ Y?34ӎ2/: E$̈dR* (`iȤ9,jEQa% ΌdR* (a 2Y ԊJd…~f?/:2qj dR* (a@FK$TXIC xɩ dR* (a$`8i,jEQa% 2Z@5VcKAvbGcfeǫ: iVW*F(4iVW*F(~f?AVaj Wi`W &XHX9 `9/#1 ijcK2Y%eUH8i,2T~f?6ŨFvbti91S&D|3lZTa~TѤSQd.4)(L&D|3lZTaL' @ei%ɑ"6~f? d8Btha%ˍ 2^EC0ɑ"6~f? eҮq1YR*@da Ԋĉ"6~f? dҫ$"d 8iVHE$ q2$F1jUd&y""!HD$`8i""!HD$`8#gci憃DVK$aCDVK$bdHfɵJMnit!EfEJ!WI2$V`$Xd8r&D|.VlѦ]&$rȕ*d,41&CDVK$bdHcY&qjM4LITM"CQI1%XICH.eUH9RLAi2VP|.Vl60c N>hit*EA̘QA̗At*EA̘QA̗?3*cKL2T4ꦓ i"Dl<+6`}/%ʪ&Pp%tUD*&D{MfZxi$UMH U0ʩ`#gc~Yt(vW2Xi" , ]䰌&D{Ӭ :ɧ)6P)" , ]-"(8i*ldKH ,&D}&u͐~Y4&_.dDX@%ZEXQ`p+HIQaIiaEȑ?3ϫdRhJ@դ%a)V l&D{c N>hhŒ$dP&a s%z"6~f?p.=Y]F(AR0ĖE1L(AR0ĖE2dHhe᱁E aF H,$Ɛ.$\@&a ԊJ\#gcP]wf+1 DA6\AaR01!KH5eqRHs+Ĉ?3ς 6Z4eUU lH aFUUb%d2$Fy!8Yy栄Biz9EOƴW#]&ѭCVQLBQHK"(!,LO1SxR?%TY@ei*$d0!2P(!!xm'>;3`'hvpuDžcz9-%TY,!'(GyU*e=VdzIZF *%CL1ό7 d^*UfJecNM<4soiz(`pxpQ 3oaAAQ(ȑ@yU*e TKmӢ Cn=+T<̕I2H͹%TY@{mWAeY I9M,!'(t_zY9=Y,U:)tmiiǫO Y<=hGws7\G'CoO70*4 oM:1>o7>'mBٷBºY<=ǡ5ot*?$H t=NOUN3j'p?J暫QuՒɲUBҰƅ{ y8bHBƅ;<GN, vyjI>?ߦY{̚ ę I9fcM !',*M I9fcAV`jzqM@eR10ժUt&i*"rWeu ZJ *!',*-/>jd-%Y\…jI3 ifIV^|ɠZJX…jI3 Gf.Vd-%Y]t!',*}aA`UYBY I9fc~q4 fCRNY: rh.1qΆndH5ԓf?d5$噏LEԓf?`&uY I9fcnhjI3ɠ!',8ʿAh-%T]ԓf? *jI3.jI3j4aCRNYXI r 9BhUd5$噏Z@M̆1ih"Uԓf?&% I9fc1rhHEԓf?~N>h y0e I9fc/:8la@FK2^LYvCRNY\60扠aKɀ .jI3m@4!'(~?Qǫ#dXDkH5{'mD$ԓ7 dgrv# a<.<|3]_3ϩ:s8N ÛzY֫=V8cSz?ĄD$q18ޏ<ƦnNZf6ntͿCW6:Ь1VK&U JAY,%T--&tc28"' B` @€ͷ_y fP`8I3 hd4|fvZنR! 6IGg`u͙h "Ga BZ } 3@N&';V8aq]#MY6JZY+FLPU(sf na 2e(PAn?xmdlPɲUB̡^p2f0!1MN jo6(Hɓ/B >?܌!-> Sz?W_i֮<+- N7:Mߡ֫~NMuhV%dgM{:1@ pԓ ̡N}ǰ l@fۯ<3(W$ @e4ALmj*P(hd3xABD ̡^p2f0!12(H  MY6JZ[Megp0 DRN@ 32; @' 2n (8 ̡^p2f0!1[jU0ժT P$0!1[jU3xABD ̡^p2f0!1[j(Hɓ/B >?܌ؑuY I9/h "r\ .!'%RNQ6> BY UpSz?d*iY+%dΌfP6p'@A#2r)o8a ( ug@fe 0~m7P(H $%FTd5$剉FċjI{@eUԓTuY I9/ I9GۑmV}NO~%TY@|qH破QfƸ'Gr3AY,%T-. 8s(Ty d^bEd5$&'MċjIsvUٴ-c:OZg_5C8Ћ CW*-Y8igXB;Kfdyͪ6pO#IM~ Ѫ1Mp{Pimk:u8ش.<+МlܨT]֒,Š> 8r$sZJ\' C!*]e-I<1ۛÜh^{UݛP}nqS:@tV 6¹>uGui*Z+IU`#!2PaL2P (d0 $c%(ȑAi*AARNQ6cCzK",_fd"Q ~z bF>?E;ƷIYr]fTy4vdL\tGe tr 9;[""N3A8>AyN5]]rqtVjyٝ{~N5>gE&hDw0Zt|Z4_qPCuېٝՙPmj;OiRx[E'Mx=qh\xV#U u}a |w&q^aQYWzqsb7WxUBb;ͿCV5uT8ttၩ'#H4 [RNF/">hYȷ"槆"^E";|,N"^E":#=|@'~;OWy=N5X+TfANӫ!ֆ:hͿN6!~ Ѫ['uۏu9<Ut?m܇f;ͿNZ? ¶9nmTZCG\y];;73QиSδBx:\}=|@Ƕ5>r`wڇoWƫAiƍuƞRm- ;!?s ϫCVwZ{YN6&(,"٩7M7δBx:\}JM;w-WεWM3sjԞN+]'0 ۫šǡ4UEDa8E'rtj ϩƫ;qoUqquUt'ӂpN8g7!3Q u9="źͣQO@-XIޘTGDv`$0iZBOxX՛Ʀk|wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwq6,uqS,x၀%-P(H<,, .1h^ap54T0{4ұFUtv:+L]ɃN\H2Tf?rQ`=eAaԓLO3K`f4r]Nr`Wmhk:F;n.'ۢt`N%1TXePADd5$Sʨ]TL0yYՒk,$r(~'%P2YIu jIȡcZbLp?J~EUb0&/"XjIEXQTACRNE18mӢܘ?~^|xTqo:.qo ƍN jo6E`0U ΥC*gQ!j yXjIEXQTACRNE1<-rʝtov:+L]ɃN^\rpcl`}FTxcZbLp?Jn<-rʝtov:+L]ɃN]vuGr[&Ơj>A Ơp,HcP@9!AABxf?rQ`=eAaԓLO3K`f4r]1İl0 ˗&Xf?#a"p8r?v:+L]ɃN^k3K`f4r]ŒHS&]Y8aڤ mhk:φTZs9A6\}O h]hQ\1xN{Ϛ|NrxN}\x:ߠ 1qW69 7 |So͹8O υuI>q£' NXx(/::8ߡ֪ՏiNpܬ;qgAiN8>nŒHyrE) >.ᩚ QV]ƅxjIj><0M 3A=NM'k3V.ChgN^8sn;<$qPOSW67X&ѡ`{'jmC0ūw!r_` i`666s53m ;XzN=`}BzNO~܇40:EǶoUqC9\)GΙ97:0ɴh/E`0p?JKHDZE(kG'Ф7_΁ҽN5]zOOܘ>fqJ*JE1 ?mjkQVP)P֎<*'^߂>NxW'ƫNCPN)> ?mjBAYIEXIC'CZ8rmmj>;|ӠVZfv:Tcg&Ѡi0 (!S۬:UqmR)9,sb 'ѧyҏ8;-JLpY=&ۆܙj7 # pod2text -c # pod2text -c --code # pod2html function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_view_log =head1 SYNOPSIS clmgr view snapshot \ [ TAIL= ] \ [ HEAD= ] \ [ FILTER=[,,,...] ] \ [ DELIMITER= ] \ [ CASE={insensitive|no|off|false} ] =head1 DESCRIPTION The PowerHA snapshot feature captures information about the cluster configuration which can be used later to restore the configuration, create a similar configuration on other nodes, etc. As part of that data capture, PowerHA can optionally collect data from various system commands like lsvg, netstat, etc and store that output in a separate "info" file. The "view snapshot" command displays the contents of the specified snapshot's ".info" file, if that file exists, in the indicated manner. If one or more filters are specified, then they are applied first, before limiting the number of lines. If both TAIL and HEAD are provided, TAIL is applied first, then HEAD. =head1 ARGUMENTS 1. snapshot [REQUIRED] [string] The name of the PowerHA snapshot file that is to be viewed. 2. tail [OPTIONAL] [integer] The number of lines to display from the bottom of the file. 3. head [OPTIONAL] [integer] The number of lines to display from the top of the output. 4. filters [OPTIONAL] [string] One or more search strings. 5. delimiter [OPTIONAL] [string] The string separator to look for in the specified filters. Defaults to a comma. 6. case [OPTIONAL] [string] An indicator of whether or not the specified filters should be used to search the log in a case sensitive manner (the default). Valid values include: {insensitive|no|off|false} =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =cut } # End of POD-formatted documentation. function KLIB_HACMP_view_snapshot { . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 7d4c34b 43haes/lib/ksh93/hacmp/KLIB_HACMP_view_snapshot.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM : INPUTS: $* typeset snapshot=${1##*/} snapshot=${snapshot//\"/} shift typeset -i tail=${1//\"/} typeset -i head=${2//\"/} typeset filters=${3//\"/} typeset delimiter=${4//\"/} typeset -l case=${5//\"/} [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values #=================================== : Declare and initialize variables #=================================== typeset -i status=0 rc=$RC_UNKNOWN typeset -i i=0 typeset GREP= [[ -z $delimiter ]] && delimiter=',' if [[ -z $SNAPSHOTPATH || ! -d $SNAPSHOTPATH ]]; then SNAPSHOTPATH=/usr/es/sbin/cluster/snapshots fi #===================== : Validate the input #===================== if [[ -z $snapshot ]]; then dspmsg -s $CLVT_SET $CLVT_MSGS 100 "\nERROR: a name/label must be provided.\n\n" 1>&2 rc=$RC_MISSING_INPUT else CL=$LINENO KLIB_HACMP_is_known_snapshot "$snapshot" 2>/dev/null if (( $? != RC_SUCCESS )); then dspmsg -s $CLVT_SET $CLVT_MSGS 102 "\nERROR: \"%1\$s\" does not appear to exist!\n\n" "$snapshot" 1>&2 dspmsg -s $CLVT_SET $CLVT_MSGS 158 "Available Snapshots:\n\n" 1>&2 typeset available CL=$LINENO KLIB_HACMP_list_snapshots available for (( i=0; i<${#available[*]}; i++ )); do if [[ ${available[$i]} != *([[:space:]]) ]]; then print -u2 "\t${available[$i]}" fi done print -u2 "" rc=$RC_NOT_FOUND elif [[ ! -f "$SNAPSHOTPATH/$snapshot.info" ]]; then dspmsg -s $CLVT_SET $CLVT_MSGS 137 "\nERROR: the specified snapshot's information file could not be found.\n\n" 1>&2 print -u2 " $snapshot.info\n" rc=$RC_NOT_FOUND fi fi if [[ -n $1 ]] && (( tail <= 0 )); then dspmsg -s $CLVT_SET $CLVT_MSGS 111 "\nERROR: \"%1\$s\" requires a positive, integer value.\n\n" TAIL 1>&2 rc=$RC_INCORRECT_INPUT elif [[ -n $2 ]] && (( head <= 0 )); then dspmsg -s $CLVT_SET $CLVT_MSGS 111 "\nERROR: \"%1\$s\" requires a positive, integer value.\n\n" HEAD 1>&2 rc=$RC_INCORRECT_INPUT fi if [[ $filters == *@(\`|\$\()* ]]; then dspmsg -s $CLVT_SET $CLVT_MSGS 133 "\nERROR: the \"%1\$s\" option contains a shell execution character: %2\$s\n\n" FILTER "$filters" 1>&2 rc=$RC_INCORRECT_INPUT fi #======================================== : Display the snapshot ".info" contents #======================================== if (( $rc == RC_UNKNOWN )); then if [[ -n $filters ]]; then IFS=$delimiter for filter in $filters; do GREP="$GREP | /usr/bin/grep" [[ $case == @(i|f|n|off)* ]] && GREP="$GREP -i" GREP="$GREP \"$filter\"" done GREP=${GREP# \| } #====================== : Insert the log file #====================== if [[ $GREP == *\|* ]]; then GREP=${GREP/\|/ $SNAPSHOTPATH/$snapshot.info \|} else GREP="$GREP $SNAPSHOTPATH/$snapshot.info" fi if (( tail && head )); then eval $GREP | /usr/bin/tail -n $tail | /usr/bin/head -n $head elif (( tail )); then eval $GREP | /usr/bin/tail -n $tail elif (( head )); then eval $GREP | /usr/bin/head -n $head else eval $GREP fi else if [[ "$*" == *([[:space:]]) ]]; then /usr/bin/cat $SNAPSHOTPATH/$snapshot.info elif (( tail && head )); then /usr/bin/tail -n $tail $SNAPSHOTPATH/$snapshot.info |\ /usr/bin/head -n $head elif (( tail )); then /usr/bin/tail -n $tail $SNAPSHOTPATH/$snapshot.info elif (( head )); then /usr/bin/head -n $head $SNAPSHOTPATH/$snapshot.info fi fi (( $? != RC_SUCCESS )) && rc=$RC_ERROR || rc=$RC_SUCCESS fi #======================================================================= : If a user input error was detected, provide some helpful suggestions #======================================================================= if (( $rc == RC_MISSING_INPUT || $rc == RC_INCORRECT_INPUT )) && \ [[ $CLVT_GUI == *([[:space:]]) ]] then cl_dspmsg -s $CLVT_SET $CLVT_MSGS 104 "For more information about available options and syntax, try\n\"$HAUTILS/clmgr %1\$s\". As an\nalternative, if the PowerHA SystemMirror man pages have been installed, invoke\n\"$HAUTILS/clmgr -hv\" (or \"/usr/bin/man clmgr\"),\nsearching for \"%2\$s\" in the displayed text.\n\n" \ "view snapshot -h" "SNAPSHOT:" "$CLVT_PROGNAME" 1>&2 fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_view_snapshot()" kj3+7b՝ab&7 # ./usr/es/lib/ksh93/log_entry_HA#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/log_entry.sh 1.3 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG ############################################################################## # # Name: log_entry # # Description: # # This file is intended to be sourced in, not directly executed. At the # top of the file/function that you want to add tracing support to, # insert something like this: # # . /usr/es/lib/ksh93/log_entry "$0()" $CL # # Inputs: # # LE_FN The name of the function being entered. For a file, "$0". For # a function, "$0()". # # LE_INV_LINE The line number from the *previous* function, that invoked # the function being entered (i.e. the function name in # "$fn"). This is optional, but helps make the call stack # more useful. # # As an alternative to passing in the value as an argument, # to your functions, it can also be passed in via the # environment variable "CL". This is a bit less invasive for # existing code. In order to make this work, the "CL" # variable from the example must be passed in to the function # that is being traced. So for example, if I am invoking # function "bb()" from function "aa()", in "aa()" I would do # this: # # CL=$LINENO bb # # LE_MIN_TRC The minimum CLMGR_LOGGING level which will initiate # tracing. # # Outputs: # # There are direct outputs from this function; nothing gets printed to # STDOUT/STDERR. However, the side effect of this function is to update # the global call stack, "CLMGR_STACK", the PS4 variable, and to invoke # tracing (i.e. "set -x") as needed based upon the current value of the # "CLMGR_LOGGING" variable. # ############################################################################## #=============================================================== # Avoid using this function if it not being called from within # the clmgr/clvt context. The PS4 format cannot be guaranteed # in that case, and might get a little... mangled. #=============================================================== [[ $PS4 != CL@(MGR|VT):* ]] && return set +x typeset LE_FN=$1 # The new function that is being entered typeset LE_INV_LINE=$2 # Line number that the new function was invoked from typeset -l LE_MIN_TRC=$3 # Minimum tracing level if [[ $LE_INV_LINE != *([[:space:]]) && \ $LE_INV_LINE != +([[:digit:]]) && \ $LE_MIN_TRC == *([[:space:]]) ]] then LE_MIN_TRC=$LE_INV_LINE unset LE_INV_LINE fi [[ $LE_MIN_TRC == *([[:space:]]) ]] && LE_MIN_TRC="low" if [[ $LE_INV_LINE == *([[:space:]]) && \ $CL == +([[:digit:]]) ]] then LE_INV_LINE=$CL fi unset CL # Since this is global (if used), it has to be removed each time if [[ -n $CLMGR_TMPLOG ]]; then if [[ $LE_INV_LINE != +([[:digit:]]) && $0 != */sa/* ]]; then print "\nWarning: clmgr internal error (log_entry): missing invoking line number ($0; $LE_FN; $*)\n" >>$CLMGR_TMPLOG fi fi #===================================================== : Update the call stack, and the PS4 trace formatter #===================================================== [[ -n $LE_INV_LINE ]] && LE_INV_LINE=" at line #$LE_INV_LINE" if [[ $LE_FN != *([[:space:]]) ]]; then CLMGR_STACK=${CLMGR_STACK%%+([[:space:]])} if [[ ${CLMGR_STACK##*${NL}} != $LE_FN* ]]; then CLMGR_STACK="${CLMGR_STACK}${LE_INV_LINE}${NL}$LE_FN" : If we updated the stack, we should update PS4, as well print -- "$PS4" |IFS=: read LE_SENTINEL LE_TID LE_RC LE_FUNC LE_REM LE_FUNC=${LE_FUNC#*\[} # Remove old function LE_FUNC="${LE_FN}[${LE_FUNC}" # Insert new function PS4="$LE_SENTINEL:$LE_TID:$LE_RC:$LE_FUNC:$LE_REM" unset LE_SENTINEL LE_TID LE_RC LE_FUNC LE_REM fi #======================= : Update the FFDC file #======================= if [[ -n $FFDC_DIR && -d $FFDC_DIR ]]; then print "\ ===================== clmgr Call Stack: ===================== $CLMGR_STACK" >$FFDC_CS_FILE fi fi if [[ $CLMGR_LOGGING == @(low|med|high|max) ]]; then LE_INV_LINE=${LE_INV_LINE##*\#} typeset OUT=$(print -- ${PS4/\$?/0}) if [[ $LE_FN == *\(\) ]]; then OUT=${OUT/\$LINENO/1} else OUT=${OUT/\$LINENO/$LE_INV_LINE} fi OUT=${OUT/\$SECONDS/$SECONDS} typeset LE_SPACER=$NL typeset LE_LAST_LINE=$(/usr/bin/tail -n 1 $CLMGR_ERRLOG) [[ $LE_LAST_LINE == +([[:space:]]) ]] && LE_NEED_SPACER="" if [[ $LE_FN == *\(\) ]]; then print -u2 -- "${LE_SPACER}${OUT}${TAB} ENTERING FUNCTION \"$LE_FN\" at $($HAUTILS/cltime)" else print -u2 -- "${LE_SPACER}${OUT}${TAB} ENTERING FILE \"$LE_FN\" at $($HAUTILS/cltime)" fi unset OUT LE_SPACER LE_LAST_LINE #if [[ $CLMGR_LOGGING == "med" && $LE_MIN_TRC == @(low|med) ]] || \ # [[ $CLMGR_LOGGING == "high" && $LE_MIN_TRC == @(low|med|high) ]] || \ # [[ $CLMGR_LOGGING == "max" ]] if [[ $CLMGR_LOGGING == @(med|high|max) ]] then unset LE_FN LE_INV_LINE LE_MIN_TRC set -x else unset LE_FN LE_INV_LINE LE_MIN_TRC fi fi  k ;3+ b՝ab&  # ./usr/es/lib/ksh93/util/KLIB_UTIL_parse_argumentsoupon#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r721 src/43haes/lib/ksh93/util/KLIB_UTIL_parse_arguments.sh 1.9 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2015 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)60 1.9 src/43haes/lib/ksh93/util/KLIB_UTIL_parse_arguments.sh, hacmp.assist, 61haes_r721, 1607A_hacmp721 12/28/15 10:52:49 #================================================ # The following, commented line enforces coding # standards when this file is edited via vim. #================================================ # vim:tabstop=4:shiftwidth=4:expandtab:smarttab #================================================ #============================================================================ # # Name: KLIB_UTIL_parse_arguments # # Description: Parses the "name=value" input pairs for clmgr, and stores # them in an associative array. # # Inputs: list A reference to an associative array. This is # where the parsed results are stored. # # The remaining arguments are whatever pairs were passed # in to clmgr for this invocation. # # Outputs: Nothing is output to STDOUT/STDERR. # # Returns: 0, if no parsing errors occur. Otherwise, a non-zero. # #============================================================================ function KLIB_UTIL_parse_arguments { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" max : version=1.9, src/43haes/lib/ksh93/util/KLIB_UTIL_parse_arguments.sh, hacmp.assist, 61haes_r721, 1607A_hacmp721 : INPUTS: $* typeset -n list=$1 shift typeset OPT_ARG=$* ORIG_ARGS=$* typeset name="" value="" value_regex="" typeset -u nameUC="" typeset -i argCnt=0 rc=$RC_UNKNOWN ORIG_SIZE=0 NEW_SIZE=0 typeset -i brake=50 # Just to be *sure* there are no hangs...! while [[ -n $OPT_ARG ]]; do OPT_ARG=${OPT_ARG##+([[:space:]])} # Remove leading whitespace (( argCnt++ )) #================================================= # Search for the first variable name in OPT_ARG. # It can be found by simply removing everything # after the first equals sign from OPT_ARG. #================================================= name=${OPT_ARG%%=*} if [[ -n $name ]]; then OPT_ARG=${OPT_ARG#${name}=} #================================================================== # If there is another variable assignment, the current values ends # where that next assignment begins. Otherwise, all the remaining # values are assumed to belong to the current variable. # # Starting with an OPT_ARG of --> abc=123 def=456 ghi=789 # The line of code, above, extracts the first/leading variable # name, then removes it from OPT_ARG. In this case, that is "abc", # leaving a remaining OPT_ARG of "123 def=456 ghi=789". # # Case 1: # OPT_ARG -------> 123 def=456 ghi=789 # Match/Remove --> ^^^^^ # Remainder -----> 123 # The remainder is the value assign to the current variable. # So on the first pass in this example, list[abc]=123. # # Case 2: # OPT_ARG -------> 789 # All other variable assignments (if there were multiple) # have already been processed. Therefore, whatever value(s) # remaining in OPT_ARG must be the values for the last # extracted variable name. So in this example, list[ghi]=789. #================================================================== if [[ $OPT_ARG == *+([[:space:]])+([[:alnum:]]|_|-)=* ]]; then value=${OPT_ARG%%+([[:space:]])+([[:alnum:]]|_|-)=*} if [[ -n $value ]]; then value_regex=${value//\(/\\\(} value_regex=${value_regex//\)/\\\)} value_regex=${value_regex//\*/\\*} value_regex=${value_regex//\]/\\\]} value_regex=${value_regex//\[/\\\[} # The odd quotes are for ksh93 -n! value_regex=${value_regex//'|'/'\\|'} value_regex=${value_regex//'&'/\\'&'} ORIG_SIZE=${#OPT_ARG} OPT_ARG=${OPT_ARG#$value_regex} # Remove the value from OPT_ARG NEW_SIZE=${#OPT_ARG} # Make sure the removal was successful if (( $NEW_SIZE == $ORIG_SIZE )); then rc=$RC_ERROR break fi fi elif (( argCnt == 1 )); then value=${OPT_ARG#*=} unset OPT_ARG # Kill the loop. All input has been processed. else value=$OPT_ARG unset OPT_ARG # Kill the loop. All input has been processed. fi if [[ $name != -@(c|x|d|h|v|D|E|S) ]]; then nameUC=${name//-/_} # Convert dashes to underscores list[$nameUC]=$value # Store the name/value pair in the return list fi fi if (( --brake <= 0 )); then rc=$RC_ERROR break # Avoid hangs, please! fi done if (( rc == RC_ERROR )); then typeset CLMGR_LOG=$CLMGR_TMPLOG if [[ -z $CLMGR_LOG || ! -f $CLMGR_LOG || ! -w $CLMGR_LOG ]]; then CLMGR_LOG="$(ODMDIR=/etc/objrepos $HAUTILS/clodmget -q name=clutils.log -f value -n HACMPlogs)/clutils.log" [[ ! -w $CLMGR_LOG ]] && CLMGR_LOG="/tmp/clutils.log" fi print "$0()[$LINENO]($SECONDS): ERROR: an internal error occurred within KLIB_UTIL_parse_arguments(). Original Args: $ORIG_ARGS Problem parsing this: \"$name=$value\" Unprocessed Input: $OPT_ARG " >>$CLMGR_LOG else rc=$RC_SUCCESS fi log_return_msg $rc $0 $LINENO return $? } # End of "KLIB_UTIL_parse_arguments()" the k꼔3+ b՝ab& # ./usr/es/lib/ksh93/util/KLIB_UTIL_runCommandGetHashpon#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/util/KLIB_UTIL_runCommandGetHash.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2013 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)39 1.4 src/43haes/lib/ksh93/util/KLIB_UTIL_runCommandGetHash.sh, hacmp.assist, 61haes_r714 1/16/13 13:55:20 function KLIB_UTIL_runCommandGetHash { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" max : version=1.4, src/43haes/lib/ksh93/util/KLIB_UTIL_runCommandGetHash.sh, hacmp.assist, 61haes_r714 : INPUTS: $* typeset -n data=$1 shift typeset headings="" key="" value="" values="" typeset OUTPUT_FILE="$TMPDIR/.clmgr.rcgh.$$" typeset -i rc=0 try=0 tries=5 if (( $# == 0 )); then rc=1 else #================================================== : Run the command, retrying a few times if needed #================================================== for (( try=0; $try < $tries; )); do print "$0()[$LINENO]($SECONDS): $*" >>$CLMGR_TMPLOG "$@" >$OUTPUT_FILE 2>>$CLMGR_TMPLOG rc=$? if (( $rc == RC_SUCCESS )) && \ [[ -f $OUTPUT_FILE && $(head -1 $OUTPUT_FILE) != \#* ]] then rc=$RC_ERROR # Found unexpected, error output fi (( $rc == RC_SUCCESS )) && break || rc=$RC_ERROR (( try++ )) if (( $try <= ( $tries - 1 ) )); then sleep $try fi done if (( $rc == RC_SUCCESS )) && \ [[ -f $OUTPUT_FILE && -s $OUTPUT_FILE ]] then headings=$(head -n 1 $OUTPUT_FILE) values=$(tail -n 1 $OUTPUT_FILE) while [[ -n $headings ]]; do key=${headings%%:*} headings=${headings#${key}:} value=${values%%:*} values=${values#${value}:} data[$key]=$value [[ $headings != *:* ]] && break done fi fi [[ -f $OUTPUT_FILE ]] && /usr/bin/rm -f $OUTPUT_FILE log_return_msg $rc $0 $LINENO return $? } # End of "KLIB_UTIL_runCommandGetHash()"  k-3+b՝ab& # ./usr/es/lib/ksh93/util/KLIB_UTIL_word_countetH#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/util/KLIB_UTIL_word_count.sh 1.5 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2012 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)19 1.5 src/43haes/lib/ksh93/util/KLIB_UTIL_word_count.sh, hacmp, 61haes_r714 6/10/12 14:05:15 # #=head1 NAME # # KLIB_UTIL_word_count - Count the number of words in a string # #=head1 SYNOPSIS # # typeset string="HACMP v5.3 on AIX 5.3" # typeset -i word_count=0 # KLIB_UTIL_word_count word_count $string # echo "Number of words: $word_count" # #=head1 DESCRIPTION # # Counts the number of words in a string # #=head1 ARGUMENTS # # 1: [by ref] counter returns the number of words counted # 2+ [scalar] strings to count # #=head1 RETURN # # None # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_UTIL_word_count { LINENO=2 . $HALIBROOT/log_entry "$0()" "$CL" max : version=1.5, src/43haes/lib/ksh93/util/KLIB_UTIL_word_count.sh, hacmp, 61haes_r714 : INPUTS: $* typeset -n result=$1 shift result=$# log_return_msg 0 $0 $LINENO return $? } # End of "KLIB_UTIL_word_count()" ad  kꮤ3+ b՝ab& # ./usr/es/lib/ksh93/util/list/KLIB_UTIL_LIST_array_fields_differ#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/util/list/KLIB_UTIL_LIST_array_fields_differ.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)18 1.4 src/43haes/lib/ksh93/util/list/KLIB_UTIL_LIST_array_fields_differ.sh, hacmp, 61haes_r714 11/28/11 15:19:22 # #=head1 NAME # # KLIB_UTIL_LIST_array_fields_differ - Return a list of fields that are different # #=head1 SYNOPSIS # # typeset -A array_1 # typeset -A array_2 # typeset differences # array_1( \ # [test]="foo" # [abc]="def" # ) # # array_2( \ # [test]="123" # [abc]="def" # ) # # KLIB_UTIL_LIST_array_field_differ array_1 array_2 differences # for $key in ${differences[*]}; do # echo "field: $key is different" # done # #=head1 DESCRIPTION # # Determines the differences between two KSH93 hash arrays # and places those differences into a third hash array # #=head1 ARGUMENTS # # 1: [by ref] first hash array to use in comparison # 2: [by ref] second hash array to use in comparison # 3: [by ref] resultant diff, this list will contain those field elements # that are different between the first and second arrays # #=head1 RETURN # # None - see 3rd array as output # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # # Name: KLIB_UTIL_LIST_array_fields_differ # # Description: Make a list of fields that differ # # Arguments: First array variable # # Second array variable # # String variable to return list in # # Returns: True if there are array fields that differ # # Results: String list of differing fields # # Global Refs: None # # Usage: KLIB_UTIL_LIST_array_fields_differ array1 array2 string_var # Return: list of fields that differ function KLIB_UTIL_LIST_array_fields_differ { . /usr/es/lib/ksh93/func_include typeset -n arr1=$1 typeset -n arr2=$2 typeset -n errlist=$3 errlist= typeset keylist KLIB_UTIL_LIST_unique_key_list keylist ${!arr1[*]} ${!arr2[*]} typeset key for key in $keylist; do [[ "${arr1[$key]}" != "${arr2[$key]}" ]] && errlist="${errlist:+$errlist }$key" # clean append idiom done [[ -n "$errlist" ]] }  kI3+b՝ab& # ./usr/es/lib/ksh93/util/list/KLIB_UTIL_LIST_array_load_by_token#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/util/list/KLIB_UTIL_LIST_array_load_by_token.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)17 1.4 src/43haes/lib/ksh93/util/list/KLIB_UTIL_LIST_array_load_by_token.sh, hacmp, 61haes_r714 11/28/11 15:17:24 # #=head1 NAME # # KLIB_UTIL_LIST_array_load_by_token - Loads an array by tokens name = value # #=head1 SYNOPSIS # # typeset -A array # cat file | KLIB_UTIL_LIST_array_by_token array '=' '$1' '$3' # #=head1 DESCRIPTION # # Receives text on its stdin and splits each line # using the second argument as the delimiters. The # 3rd and 4th arguments are simply used as assignment # descriptors to save data to the array using the 3rd # as the key to store the 4th as the data # #=head1 ARGUMENTS # # 1: [by ref] array to load data into # 2: [scalar] IFS value to use in splitting data # 3: [scalar] single quoted string used to determine name field '$2' # 4: [scalar] single quoted string used to determine value field '$3' # #=head1 RETURN # # None, see the first argument for the array output # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_UTIL_LIST_array_load_by_token { . /usr/es/lib/ksh93/func_include typeset -n arr=$1 typeset do_strip=$2 typeset _ifs="$3" typeset key="$4" typeset value="$5" while read line; do # ignore empty key values IFS="$_ifs" set -- $line eval [ -z \"$key\" ] \&\& continue eval tmp=\"$value\" $do_strip && { tmp=${tmp#\"} tmp=${tmp%\"} } eval arr\[$key\]=$tmp done } R k3+{b՝ab&{ # ./usr/es/lib/ksh93/util/list/KLIB_UTIL_LIST_hasharray_datadumperoup#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/util/list/KLIB_UTIL_LIST_hasharray_datadumper.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)12 1.4 src/43haes/lib/ksh93/util/list/KLIB_UTIL_LIST_hasharray_datadumper.sh, hacmp, 61haes_r714 11/28/11 15:13:43 # #=head1 NAME # # KLIB_UTIL_LIST_hasharray_datadumper - Similar to the perl Data::Dumper module, dumps ksh93 hash # tables as sourceable strings # #=head1 SYNOPSIS # # typeset -A data # array(\ # [test]="foo" # [bar]="123" # ) # # KLIB_UTIL_LIST_hasharray_datadumper data # # #=head1 DESCRIPTION # # Dumps ksh93 hash tables as strings that can then be sourced by another script # to internalize, used for persisting data between ksh93 sessions # #=head1 ARGUMENTS # # 1: [by ref] array to dump # #=head1 RETURN # # None # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_UTIL_LIST_hasharray_datadumper { . /usr/es/lib/ksh93/func_include typeset -n array=$1 if (( ${#array[*]} == 0 )); then return 1 fi echo echo "unset ${!array}" echo "typeset -A ${!array}" echo "${!array}=( \\" for key in ${!array[*]}; do echo "\t[$key]=\"${array[$key]}\"" done echo ")" echo return 0 } $"" kz3+ub՝ab&u # ./usr/es/lib/ksh93/util/list/KLIB_UTIL_LIST_is_in_lista#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/util/list/KLIB_UTIL_LIST_is_in_list.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)14 1.4 src/43haes/lib/ksh93/util/list/KLIB_UTIL_LIST_is_in_list.sh, hacmp, 61haes_r714 11/28/11 15:14:50 # #=head1 NAME # # KLIB_UTIL_LIST_is_in_list - Informs caller if a value is in the list # #=head1 SYNOPSIS # # typeset list="a b c d e f g" # KLIB_UTIL_LIST_is_in_list list "c" && { # echo "Element c is in the list" # } # #=head1 DESCRIPTION # # Informs caller if a value is in the list # #=head1 ARGUMENTS # # 1: [by ref] array to search (haystack) # 2: [scalar] value to search for (needle) # #=head1 RETURN # # 0: value is in the list # 1: value is not in the list # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_UTIL_LIST_is_in_list { . /usr/es/lib/ksh93/func_include typeset -n array=$1 value=$2 for element in $array; do [[ "$element" == "$value" ]] && return 0 done return 1 } == k a3+b՝ab& # ./usr/es/lib/ksh93/util/list/KLIB_UTIL_LIST_remove_list_itemser#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/util/list/KLIB_UTIL_LIST_remove_list_items.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)15 1.4 src/43haes/lib/ksh93/util/list/KLIB_UTIL_LIST_remove_list_items.sh, hacmp, 61haes_r714 11/28/11 15:15:49 # #=head1 NAME # # KLIB_UTIL_LIST_remove_list_items - Remove specified items from a list # #=head1 SYNOPSIS # # typeset list="a b c d e f g h" # KLIB_UTIL_LIST_remove_list_items list "a" "d" "e" # #=head1 DESCRIPTION # # Remove an unlimited number of items from a list # #=head1 ARGUMENTS # # 1: [by ref] is the name not value of original list # the original list will be rebuilt after its contents # are saved. The returned list will not have the same # order as the original list, just the same members # excluding those listed on the command line # # 2+: [scalar] Any number of items to be removed from the original list # #=head1 RETURN # # 0 - success, # 1 - failed, # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_UTIL_LIST_remove_list_items { . /usr/es/lib/ksh93/func_include typeset -n orig_list=$1 typeset -n remove_list=$2 typeset -A keep_set typeset -A remove_set typeset key shift for key in $orig_list; do keep_set[$key]=: done while shift; (( $# )); do key=$1 if [[ -n "${keep_set[$key]}" ]]; then unset keep_set[$key] remove_set[$key]=: fi done orig_list="${!keep_set[*]}" remove_list="${!remove_set[*]}" }  k3+b՝ab& # ./usr/es/lib/ksh93/util/list/KLIB_UTIL_LIST_unique_key_listser#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/ksh93/util/list/KLIB_UTIL_LIST_unique_key_list.sh 1.4 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2005,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)11 1.4 src/43haes/lib/ksh93/util/list/KLIB_UTIL_LIST_unique_key_list.sh, hacmp, 61haes_r714 11/28/11 15:12:31 # #=head1 NAME # # KLIB_UTIL_LIST_unique_key_list - Remove duplicates from a list # #=head1 SYNOPSIS # # typeset list="a b d e f b a a b" # KLIB_UTIL_LIST_unique_key_list list # echo $list # #=head1 DESCRIPTION # # Removes duplicate entries from a list # #=head1 ARGUMENTS # # 1: [by ref] list of elements to remove duplicates from # #=head1 RETURN # # None # #=head1 COPYRIGHT # #(C) COPYRIGHT International Business Machines Corp. 2005 #All Rights Reserved # #=cut # function KLIB_UTIL_LIST_unique_key_list { . /usr/es/lib/ksh93/func_include typeset -n list=$1 typeset -A array while shift; (( $# )); do array[${1}]=: done list="${!array[*]}" } th l3+$bs՝ab&g # ./usr/es/lib/libcl.ail/$$ $0%* e8_`aclrst,.0@AHKdgimnop| !%(/345:;NTbfhuy} $)+1267CDFIPkvx #-9[^ -e!h3OZֵkZֵf5kZֵkTkZֵkZֵFEJֵkZֵkZƕkZֵkZֵOZֵkZֵkZd3UkZֵkZcQ=kZֵkZ֩ZֵkZֵkZQyxkZӗֵkZeZֵkZjbcZֵkSֲFE%dTЃ Rvt wMn[饰_*M"A,nįPI?r |r gɢcG z %W̝S=ĀR@ HWI`R3d~V!@XBfSJPHhZfNV|tI\'A^4݃T)&HZ`;6,u?"&SJ<͋_mkϛ;>p|=`O,h}VﺁUa7N+bBPԞ)E@vou\* .9kPϿ-XD%̧DZ| ysa a ?dAݛdHߣ1@a8pNI"a+V L C EXDu2^ɔ菠a ̧DӺB/XDBИ\(znA;=qZAr3IGh@! 䖄K&5XB):ҕ>znA;=qZAr3IGh@! 䖄K&epl_U6NKiJO=D7J Mȭ # \ЅrKB%FuuRQ Һ'g f܎ЁrCB-%MJTy!uN\Ah@! 䖄K&S1K  UX'mrSϩ Ai.}V(̘&h1 yҼtvz B%FubzK\tp'̝%M <8  b?W=iąY8<{%M>7Rxt{ERx%Y8t{5'U|nt8IbY8rOҹIju4+q)<'O4+q<ʲpBOҹO(:U?t{=RyJ'|nt8TduX@o4+qTdX@4+qO3X@ iW=T}V>7Ja: Ou"Ry>W\AhD(n>W\AhD(ng +Gg "\i7W_ +Gg "\i7W_Sφn㣳Z.J4ᛥxK&A}% !j5%' ;ЩQ ~SPCj)?@P_5 rd :PPΠ(/N%`yr#Dw` D Uzw;f 'cB)`' ;';f 'cB ')W{0<>) :"`%V8Bi7WDÀ ARuBΠ @0=8 :)3I'T : R R :&j& FۣwGI,p:)>S ,. LJVCo)ѱٛm1z#G⬘,?/^yoҽA&u!Fg$`2:)~`BR k?݆t}{/D9NI-RofP"RD]& &G渢Ic{)4tS~I)@Ny)LSbM&C_Y9)LSbM&C_Y9Nb/гi2(1?0_f)qd5P?œay?0_f)qd5P?œc:)~`BR k?ٓ?+Ϗä BĮzDcuZv|/J纁JMg O4A[jctڃ̝yV#M&%O;cJdvz f 'VQ_gF%'mrQ ܎qXRta2qXCv}S1bt5P? a0]@( CWp5OPg BAp(&L@M8BRyA(Ro x>[i \ 0L>Ыh5 \'Je:'_*y]+3-'䆄+Z.J4dWp5~oA{9:I''?%7YMV|C4dϙ5C|L 'DЫ?>yKVg@ Q%[XAGSA [E4lX|-lY4lZ|-l[4w%y̵ҳ:{.HhB%w%ΆJPRxK*K@t7ɧjmPRxK KVL>!.Ybs6X%뗻-p~u0ACI,/w.i|+N\N\1sMBrx% Oe.uuuJ'.sBP)EuR .C4GC"\I`sLTΪ^+Nb5 O3SRHu<&i7W_&@i7W_uJI樹̝+N'Ū@c:L\EW{4W6ԇZ'_ :MM &Q_)%[7>k0@f.ۈ!,}{׺R((%<> uRyC)?n:<J)VYGU'| ^NzQG7p x| ( yGU!n:/e uR 0@aDJo.'wnܔi7PtInܔi7PVY{&GЧ$6:+RJC :MM/P,I`T\U'W9)C^y&uuI٤]>| e!ɴ-tybufGfje3{1K&!]~di7W_MJ4Muu&]~Ii7W_&u0I,A?"\~B$rA#I῟S'wX5 O0`btRݟ=hyu](? =v@Љ/>S7vmKٵ0υV̧D9%xh}TQ,g`T g."@+ +Js3J;=q# \ЅrKB%Fuqq"j ~GrΒJC' BW=A,u'ҳ7\AW{w$ttNrD:Vf*sgҳ7\Ai=$4!\ЉrRݛ f\IWp1!?jO.?WrD):fpYg bI2 ?h3w Hύub$ @I݃=vqq]Ȁ(\]dg_ Z6C0ҳ7&S2?mf= O-s$rc,YfN ' =43aI2qXGv}R R@y5N(5wS]?~n_]`;8@tWrxP\ sA8BRr;CI7Wr9[+/Wp5wc0XS'7g)P@# V̧Dpu2y+C?@[ b:xvqpP)\tPyN.\ *O1`AJS ,. LJs͑?0_f)qd5P?şA?"\~B$l.H?vo+0XOE!SPga9 ?Q;s;3bw/qWp ٔ蒹O:>VL3)>榡)v}S(-O@Y&H5N.5 V: o4 IDI/:yWp1J<ĥN~mh1yQABeC o>7t7]@e*b|no@ Q%w |AqQPتh16(mcylX|6, o3OųAc23-s1{fufN դ# \ЅrKB%Fut8|o0BP.\'JP̧D%MC23VgVd =UU܊@\'+IqpYh1W=Iw~䁃C23VgVd =U_5 g^YYw4W{:iUnTtJ'U`B'~hB34"]+3id\V1<"#%f%̝%G+NG?c7"{0X4<'ПS'7g)au"HHqh5 \ef/tάA;zSr+H.Fi=$4!\ЉrQU)B j9ҳ:'qiT9-MC45%wtC|jj&4a)Wq4Kfht*σ} 3|ME49:T`ϡoMC7O\$s8ب(lU4pqGChP56,> M"j#0bࡱhp2DbXrXPI<3-s1{fufN դ# \ЅrKB%Fuqp<=Wpx~{E&dP̶yՙ;'sOV܎ЁrCB-%M]N9kfu;=q# \ЅrKB%Fuuݤb#1cB!ҳ:M6P풰bym#%rONb/гi2(6gtS~I)@.J?!\fCә;h' ;dDa]K̇0Pn"O4L/O7s)vE\Nt7Ut S uBpɚtLE Pʺ S|3tЁrCB-%M*$tN :3N1 !LE1 ' +Gg \ЅrKB%Fut7ŊSvn`u@W&S}gmAҽA-W$"\i7_oD1h?~4D/ dz̛r+Cl OWr>b_ƒ͉0`+  /_sϚWd Sr+H.F;zv IhD(n'|ÈAitfv&3\df@`ٝ+LDRxKܖI7081=Q1Ke21/NfN oS'܂}gm?TDWr ̧ErDzDۯ?,0ٴPq`z3q9+abY \0ٴq`z3Mr6WptT_ 8=WaX8Wp.*_sϚW AhV\w4i=$4!\ЉrQ]t'f āӣ(~=4f 'f'?~ 8XS3`yfD WrZs40ao;8Wpt)%sG_>j̝w%F OCE^aiWĽ:fN /h 12q]*&}g=8WpIO4O;wKS}SzZIhD(nU36'㵞[Kdb^?̝%G+NG?c7" }04 T柿y>; !`ٝ+/N+N9]+LAi=$=ZIhD(n(`]ĵ/0QQ>0V$}@y]@+|S3`y>TGsr+Cl OWpOϘU{0fw!SL3|Ҽt~'qZAr1դ# \ЅrKB%Fuwt/4 4Gј+ȟEW{3@ R{3w蒹O bB?Q†^'&06',Ľ:d.J?!\w6$r9#[y>8 KL?t K*O &&RyA`=N,z>L$S6H-7 Ŝ k_΅a R0I}3?J_Έ4SDPyr FE230Qa`a YDIJ:눊yAφn㣳Z.HhB%IF 'xg1Ye21/Nٓ HWIa.C?+܊I=>,ɉw@f |E_0Y8S3uY&5hZ`j>:Fy`re:$z 3?(Lj3#PX9%wDhḿOϘOCf ж5!Lj L<:"Wpp.ޗ5bc"LfTբq0\#Qk GJ%Ze:$x{B'`!TIMC6b+hAxaqһ H~*f0>P0Jzf&ip%&t10CL(L[v`}лfj%5y X1'Cj 'B7H-X20Kaw Y3^8t|ģ%Ɣ ]nEi{& OWp-~|ҽOWR6w+-+;=q䆄+Z.J4-0gDjTdh )%sԞ\DBcP&sJ`c`kqY l  BcPxZ`Aɚ DI3.C3Q hȕr9[3_5RSVlshC GFQ7%w fSJZ ԞyP%5ӌو5UFP^*2g0 DV0B Ŧ F2 EFLIBu{=&Qi;Na3K8F PkMHj9~j'Th6Ԇ*2f" Am#tقX=0KawG&*K#̡1Bz4F}%wC2W=IJBcPY+?Cl~l }] 0 ж5!Lj L<:"Wp+ _awD}L{@=b"2%\3_53-5h30]Gl+)%s T ɀP2PBfb.:5là@]ă -AZZ`~$p"xd7:<٨*JzNttكW" :db` :>L3 )Q; MD  8͘,:bS4B7H!w/f zL.hDġbܟb&081=Q1 VY| Kӧٓ~D(rKL~}L~Wr P/| wyҤ''A|tSϪtPvz B-%Mf8oCC̒521/N%G+_~@ {fr1L,A?Ys`|} 2q]قfw@pV SJ<~gz󠟪`,}`)5?!a!(oa껈/'l?=:@1 z+ B0!z]ı9åfoMȭ # \ЅrKB%Fuqq"j ~Gޤ] ԇZw BW=A,u'ҳ7\AW{ O2ܑI" = b 10I!3S3?wRyBw?SvC,4NP)G>vص 4Wp(tv Sw ,.Rf򊦜\!)O1\!C1 h59?W=@sPyuy]+3-܊ Or;B W$"\i7Uwe:%w Ovp~0AJ<ŎfZYN\AW{we:'_3-tΧg Sr+H.Fi=$+ϝ;1Wp' BW=A,u^y]+3*sUwNy3-tΧg t\!%sԞ\CWqa2fZYN\AW{$s2Jvz E7"f܎ЁrBȮ{RfN2 4! ŮnU3 loCm*x,i̝%G+O$r;ك1#4}L~V"ԞPBf ݟT A;}GL4>O~D;1ބJltO !b+_5N. jC\P\ sA f\!)}ҡR. BW=Ay]+3- # \ЅrKB%FuWp(I̵ҳ: Or;B W$ćC|=Wp&_h5 \Hs2Jvz ~P2NHs2Jvz zo4 ]+%sԞ\CWp'):fZYN\AW{Wp+ws2Jvz H.Fi=$4!\-uݤe-'34 hB34"]+3f&C~T1<Ү7aO'mrQ ܎-`\^tnE>NbE!<1f" N )<|w0m&B>5NR~ @y &;8  BcApK7EC4 HuPP.P\! 3AJ<Ӻ9kfu;=qZAr3IGh@! 䖄K&0a2󙖺VgSZ)#4v ;GWpl9%sb_̵ҳ:>Wp&9~s2Jvz WC|Eqp(AJz]+#M&S6J1I6>VgMS ? a+= Qϩj_h5J ³΁cOPg D+ns5N.HRtJMC|IBT|A| DP)CC4G:-h59BQ4>ؙσz>d4+?W<,ɉ6J &p7I0TAfj*>5lm.:tFe:#ވ|j̙9ҡ8[H'LNf6R,'^GG|D6q(:* @F(T|,LP+4>T@APV"3},t92hd+1Ah26a30QB QYsB'?[̎fJ|=m,Xyz bb$S0$ 6딫#3PFn6 LF]2oDJ'j Arq7ѢWpd)Dz:L>w8AJ<9uZAr3IGh@! 䖄K&&Su3uҳ4g ew>%w}PRy29NhYsZAr3IGh@! 䖄K&=DӋ5w?jO.AW{J"?YsZAr3IGh@! 䖄K&H ŭ'3B̵+fi&L O-zt.J|(;h)\dTh0ҽAU2>ҽC'(%M%Mj7bǡ VYxc) cb?0_f)qd5P?œb!?0_f)qd5P?şA0qRWq `sH;hRtO>N?+P &`F1:Rx(/ĈZz? j0]5wp߷΄DWp /Pg ҹ P\ )< f\!L@%CA1)7<&"m SsP iu UPRy Suҳ7\Ai=$4!\ЉrQg͊:pLD"8bYff03QPWOs"n>x]p-Aw5G3&:@)ta ]|"gto1ApϚqp]@a I/:Bw@pi4+OR8#Ce !id 3DOHpt'GQt8&hp<75NtKfQq ZiofM&D"t!+M0MɽL"h*Wq<[4+:sPy3'q]cuwie:'_.jO9d ,2P,u#4Lhpt3DϬWq h1W=A,ufq}MS}VT+i7_?1<Ұb _cc,Y2vGw >}MS}V :W;=qnU3nbym`e@K@A܂{>s>a83:W;=qnU3hm*v/+,fN{5J0:W;=qnU3tK0KaK2vGw 5OXPyN\A4L9a[GaJο;h#_|_?+i7_0; OGeyfc*sdA|<_>ҽA&us,Cm,(1t_̝]/ϟSTU/>}SzM&S6YCm,2vGw 5OX&:W;=qnU3ma1<Ⱥ[/̝]/77M>>NrϪtPvz fPJ,dA| |9jC:W;=qnU3hU O--,R2'm~Wr {?7STU}SzM&S6F*'VCc%?fN}ϩ}u}ݣ>ҽA&us#'V 2vGw o}}MS}V5}SzM&S6Ya嶕ٓ?+ϩ}u}ƠT^ITͷam+ J_̝]/_j }SzM&S7O'㵞aiW;h#_Y+>ҽA&u\#'&0үA܂u>V yN\A4L?P!ImE'm~Wr =w§}SzM&S7O[iaImKX?ٓ?+}MRDϪtPvz fm,1-\qdA|9jC0^ϪtPvz f01>7g}SzM&S6Cm+(/3;h#_}*/ҽA&us ˤb@/dA| |9jCyN\A4L)'$9̝]/ϟSTWpyN\A4L۟0J݄ A܂5Ow>ҽA&us m++-ő'm~Wr >s> :W;=qnU3nm*x,ٓ?+}MRnϪtPvz f)'1Yg㵿;h#_Aß>>ϪtPvz fw('V V[;h#_Y+T^IT.Cm,La(b9[G̝]/_j§}SzM&S7OG O-s$rٓ?+}MR`ϪtPvz fpK G2KhfNß>>+i7_0[iaIm̝]/_jH^ϪtPvz f !xgIm'm~Wr =wqT^IT.E^#%ke2vGw 5OwT^ITͷaPJ/̝]/_j A>ҽA&u\#'㵞`edA}gST07:W;=qnU3tK"/0beA܂5O[_yN\A4L۟衉嶕llNY0bKdA|o}&jCķ}SzM&S6FCm*؜fN}ϩ}u} ?+i7_?bym[_'m~Wr ϟSTUg}SzM&S6嶕llNY/2vGw ϩWr7:W;=qnU3tKxg2vGw ϩWph?+i7_ʡ"/-%22vAIa.C;w܊1:IG'ПS'w]SPS0 ),|)biϕ/aNtji*O4%3@9 Q1ME0)Pyf -3-3 Z}Lɉ@rDiWJ 2wN枧K)rB܊ #M$Ĥύ\]dO3t4"Rd3B$&g04Ds)}&PRyŁ`wM&LЉ +c0g>i%imBb>kWrY(2@P2Ŧ h \,ucP)Fc:>?>,|]@#O>"WYw4WrY ,|]ASL><^AfN ա 䖄K&5&O>#:WN\AhB%I qT D + ݟ@ϟt80LϨ &&Wpho1P>LM4򻃲fJf] s&4"b#ynQ’oU'V VY lt#RoPyi7UZWGECm++,6:\n1/Nޠ)unuQa;J0}df%̝RB H.C?+~S.FIG'ПS'f ]Rxؐy4S5G,/wLD}: R _m<9OZϨ &&w! b,|]Ȁن9ҙ0ty|Wp4fhg7AQ"fME3)Ka3fP6i%k3\J &&Wp#ܑ53Ε3'qixBxDҗ!+Mȭ Or9f4* AtS5G \/+ 4a)7LV`"acpF(imB0KBb>bY]g.-0gDch @D'WpZD+O53Ε3'qiбbewm~Ly|A;z!\ЉrQOXg<|g !\ЉrQ]~hBǮM6"ކ'V VY lt#1/NB;h' q?Sr)#$#Iy>8Oux|@]L>iJ 'v}@X1331P>LMه9ҙAt{NO]'}B>fsPTf3@"QBRy3  А3G&3B%&}S7G3] Lj-fu]: *@Դd EѢ /uf>m]XLO &&Wp"dz^ə;'sOUw%BɉHJcgҽ2wN枭%Mե1JGg "\i7W_8+M6˕ O-qĽ:u G3ٓ~D(rI? \Mf`\^tiy>8 D}=))'wWp)AFsAH*B' i]HTcOFS(=twCJ+;@/Pg~j܌>LLw~䆄 Һ3'qiЉrQC"fZ vfFh)+1hQX13Ԡ{<WCd =Z.HhB%IjP̂صD7P4. 7~X>NjPt3AQ: .hYH3\H &&v}BX Һ3'qiij;>]p3gJ|̝CBR~̝J|w4hD(n qB(DWs &&z2A-BX ?W=IJh@jP=zٓi& ކ'U _cc VY b^?A?"\`j}:G! dN#n$M]πA{`ݟQ1$Ad$#HdLtSNS?W=1d8u+B*Z, yМ:VZ.J4LoDOCm-a)zt̝%G+O$r:T9C~-=ϩ҅3,t7Ŏ΅RP? ;1E/'d*Qwg(-v R晥N-ː[6庺b>衭&CmmhC\ErҲ -'䆄+Z.J4s]DCjݛj] btI\ԞbP)%rhXԞcC|V(i蝘+z蒹{y.s=I@B`N-0>n<2b gυ>c{}V(tI\_\T%9XYYwR0 Y@s.kt3w%fW>S9, K'WrX(K5:L,ޠ9~ygJ'g v IhD)]jDjcuw%9Bz,u!RrYjV#:VVA;=q#"PTNKO$SV#:VVA;=q# \ЅrKB%J'ͩt7Uk2W/u'PxI ChD+++ Md..z9a[GaJΌKӧٓ~D(rIGJ(|7oH|D>N?+J!ަw΅RkpT;ĈDWp ?Tv%Kt{|ra,׺_Jxf%7%YO02jBqi5#vnA;;>7|-=]I9fr)S6,u!hR|X{ZѵIe*KR˞jK 'Uܖ>K4S9K&+W_=rҲ -'䆄+Z.JWr[ h5%K0LTLJ,XV#:VVA;=q#$^w5Ш_*ygJ'g v IhD)] ٵ. SJ*_NV MEbB!XYYnU3!s'zWI-%`UF%9#)LSbM&C_Y9%)LSbM&C_Y9&)LSbM&C_Y9C>S ,. LJs̊|E1OY\A4 gQG<]~4Qa3K"llt5c])щztQG<]~4K"llt1/NJ(KuUTzXF1<Ⱥ[O2vOȗ%I? \=Aǟr1O?+Ho.'v}RߡU;?!a0]Ð.}] jT]@ApK7Edqp'5}йrϩJfj(v(k9 u55o Po3~&89E55ĸj)NKY4c5t'9,i Q5Nbךjj@g0d4D|{4c5h,> i Q5xfMMA3(QL O{ C8DFa霠'@.7 BW=Ay]+3 \AhV\{.HhB%ItfS󙖺VgSZ)]#{{3Of @0p'CjjQLB|C4b(9DuTMC(CDG(i h,>IAd8*0ujj GP)Gf9E3)>IB33 L҂[ATSAg9D]f^(E IbBgN],AJ7vj > }]À,7#Bq=7YD Ls!4 j @Y+|,votfbm ^Ry&K<<3@j܆5'ҷw4i'䆄+Z.J4NJ̜@aw+\ 'FWAk R|PiL.#࢈PX|PXp@wJ@fN ]P>ߠ|#B]!?4:(Wp }D BJ稞_bd?Їz[id]-Fk:1/NBï fN 's`|rA#r30':|y?} 2qY)(_Ws7#B8|gA;w ϨӸ>tWp|+}fHkA|&г@^g1RyAn':ȓQy+q;'sOV\{.HhB%IЉ`8Dhy~/iB x1Ws9wΐ5 I1J稞obd?LK"lb^:#;h' q?Sr)#$#sך~O>N?+%p||@pD! }٨W34 ]OwiL@p]كg3 j!4 j lstfM;SꝃTԞc|7*xpZ%'(3 3 zљO2= Ӹz'/{<`V6'!&fY<3N렟'R=u棂!:V̝J\ЮsE7"`e=ufp DhYw|_Ӽ ́Ӹ>tWp39f':Q=ǪK-'ClkK"llt1/NB;?3^X(8ȗ%I|8d.H?s.Fh 2;=5d`}>7Wpح[u4]9[t}2Aߙ>7zSGfzfLL'39Vi=D; a_faE كa$b.'Rn>6_=3%;- # \ЅrKB%Fuuf`:, bĿ_MtY=Iz r3ܒM_:6d-?@]Rܒ̝\bbo 'VI`Lzt3H$ q(.&%.C'ЂwÏ<p;h!X(8 ~{dfLL̮}>7AaY8'A 5Be36|Z`+')>|T 5&f ȕx C2@%(Q;t?<-7[ !ޮ⩅ T5w 'eP3C1f9V`p )=Lр8f6-Y& "tBt=LsB>'Wy[rضa)Q6*uachhcbw9oz|arod:#!Fh=L3|RKrK2wO'<ēģ%eK'M߂@]SnIfN LOWR6w)#)G;zMK3Rܒ̝ęО.&4m '4Sr+H.FS܎w44E Z3Ѣ5h*2g:Wq&Nݙjvj :w&E Z3Ѣ5h*2f4J= S|6@jL:5Ly~*2g0DC$PgQ@]iIp4Jlub^?w6LIH)!\J$KIK k7A Au}L,ɉ7sϧ T>lA 2g5h:(LfMGŦ `y g~j:PyVoS" (fPwGJ-'4Ӫ jP:Ʌs»?Y?GG*byz': 2g ~zMḘGi=2PӪ>/{<ZR0IS0LY*L3 3f#v`ف-0n"tyWvCtyBjv*Z-txضa-Q8lT43hhŊDl>tx|2`|@i83FCu3\~ =|RKrK2wO'<ēģ%eK'as  .Է$'qq*y'K)rB܊ #=M&%@]SnIfN TZR6w)#)G;zMբF L3+O2ٜ ,7IBq@Xxk0Pաi=#V&oD3)>t C Fi<"5FLȕݑȂJ 'F= O--,R2ztQG<]~4 =-Jқ0}KӧPyi7UZCoCm+ Jb^?2vOȗ%I;  ܊'Ad+0d1:Rx Gv}T w~BHAߟS ?Nݐr5vqps8k5 _ f\!%C' BPԇMfLL'̙̂'SP7Fs{xpS8൚1L~%>Wġ:jj&j'C ol' Qj)М'ȳOf"R3SSP39S!lT|Of>QLG9,4c5[Lj'CŪ jj@fAQ:6+K>N.+55R5WQ6,p1L늕fPPyOef/tάA;zSr+H.Fi=$4!\ЉrQUtSP̶yN.+32w_isOUwo3+7NROPpT+ff@0pNfAQ:hUxL)P)Fs CBsOf"R{6-P9& bTS!mN)3 Bذ'lY4b(j@Cf驨uMDt|/f M8B3WQ1-ItAfLk0[Gyʫwx&%sԞe*e2 93-iKfu;=q䆄+Z.J4Ӌ7Nw^0%sԞ\EW{j=iL󙖺VgSZ.HhB%I2#1cfu4m0Хʞ'V| Kӧ' ^nE|y>{'m+A2p&&fW>>m5  GWuq7u5w\?C0eP|nfbxm{zDIٮq򿘚"K"O2u!7t}m[οpzg>)w]KrK2wZ)#O># \ЅrKB%GsOSI39X84JOS6 .]GL N|PWBCzasbࡱSkbم͢> D4ŇCbw\DA[aa!u-,AhUw (A^B@YP(;.)wZ asbࡱSkbم͢> D4ŇCbw\+l>t7l>u]u3%;-܊OʟULX+П.C} Qn_]b@Y8fʳsL'j"F }ǡ嶕1/NB;?$K qO 'Y>}>7P|,ɜf稙$g} _G[oOmEJ`W+T LO ]"`':Q;n+&кuNju']L?W<8 Fb#Q6&Pӭ "wuÀ Fb#Q7S0C0MBwN0ޗԞ\LW{:$g>)uN%;'K)rZNhV\ ii7Vb!A3S6?tC ?$w'P]BwAm ];J#bsbAkbN̑G:2FŇŊn?ӶP9  .Է$'qq1]Lυކ> ̒ hR _] : [vضd>6i6,>6,Wsz?ӶP9^~T[YxDc2G*|.rfL0w;‡l<]*w%|RKrK2wZN} E7"f܎ЁrCB-%=M&g3Wq=9  36_Wu|=ڊ s*s3ᷫpD}]_+K&L)C O--)Ľ:u G!'m~V':@Q껮J穛cuw`Oͷ_';;cJdvz f :1RyA1bt򅮇])C Svo%:@:AS)L@mBW/s)<k&]itPye.uwX avR||-= Ri5WvNϨUЮe:'_lz[l\Ai=$4!\ЉrQ]1i+~lz[l\Ai=$4!\ЉrRGt8ilt Ki;o;cJdvz B-%MդЄB#q:V#I!6pЈNnU3!s3G嶖&0%yLNb/гi2((Nb/гi2(d+a!4E*n#.#'ـH`&N}Bc:"c'6byғSYғ# C ~ڄ_k`P&>t6ll"@L !'L} WpX?W=AHmWs$tNL/NOPԿE)ZbCg+w?&u/AY2bX 3$)M2uw e:(Fޮ$̧D&"90Y1 ;'sOYW"\D<'wOF<8Oq n͖%w2 &N'd3' 3|s7Nwb);>݋YgST)3i;mWp jj8!-YFc ?4hRx&: 3t6wSӲfP"a!Lu4/'37Gֆk6V2q2lt LBRyA)/Pyft3 &:3'3\DWpD)M]e:(Zz ,Ni7Jēģ%Ɣ ]nEi{&2WpN\ۚ nÇU]ւ覦7t=ŏӱEY@KCwb7J(>O2!2fa3W@iibB p(Pi 3)広ˉL)SBm7Pyq2p@NTh-f198͞3` a4ph-f  h1)M]Ciju2xvz I QcJ\ЮsE7"`e=ug%,m7RyS!Х* s+,.NL ` ?,/ nQ'giD?2 pFL? gO5_I CMq7d fynS5 ew!azW6<%q mӼ=I= :*ʌfS>4.eE)+b̧E OWp*Ny ҼA;=qZAr3IGh@! 䖄K&ۄUwctzZ& ʍNSJ>ʿᷪЂf sOԞdWNjaz_Ou?̈z"MO[4pS+f3B K<+50AB!A8(3 ?0q /'3:Ag 2@P͵ 2_B+50+AAPلަkp?2jne:(Zz+NisψN 2wN枳."R»n#Aqi7WNFf>9) fPIT8 f EacN77m#2U"?W>jjbL *g0'D $C3 jjPZ?`Fw tSAWqLE OWqe:'_sψN 2wN枪t.1 "WpR>2꒨ eSف(u >|qhe~CGJMC(!:W,A;z,^/!?wA^';])M]ҽA&uЎމ0D3x!KW$I῟.H?s4?c7"NhmAS2vZϟS'D7QqkWaJ_m,رI)h }IR\Iq*]LpY3g +Mȭ # \ЅrKB%Fu GCacn/Z)DIYBiaT2#dZry)WqS@EQ07]@BIWu@fLO8n$&,&N"?<ֆd`%UP6wVzέgҤJzX!yɎ+&|\{.HhB%IT7W91\[Fo6%G+O$4h*fN @$d3%y O}5ͩtLNf_ ɉde:&v Ν4N=PyB+&v}BӔ +x SJ<;3(;6 1;{q1:ˇοP!VP ЁrCB-%MN'bCz ;Пw*Va;ЇctL.Н\A\_OB|<xyKKչ~= guvbbyB가 &Sg`[c`&>P;11<(>ze:&v Δj0[+hu2691LDPxKn'g ,a2W=A,CuP!VP -Wp"N]BL}1>vbbxP}VS)3Nt4Wp s)+\)CLwӔ +v)%sԞUܖRW=I,^ =(ԞŊ'o U O.,aiCV1!NuXgnE?gP< 'AS2vO̓b`Pxؘ@N>>))v|@S3a,NpXe:$xH%fm2|̯=i7hP< +`0f Ɂ0HK6,Ry@P:[nQˉS@e:'_ = uҽAfoxg]$/,d.H?s.F?Sr+?0Acja2wNL=2y>0'& ϨLOLi '& L&G&&#@}BkPq )3NtP}m2u[aTtN,<:A!|+j=VU2 n.Nl;2LZ@BEWu6&'IfD©"L`5&N g3&& ~B&*&ot3,`3*'Ng'&-? TI0]0 ao90zY1NP*?gg Sr+H.Fi=$4!\ЉrQ]x2Mȭ # \gt>%w@%2=xJfx (aS@7G3O`< =|b 8Wp!O>7t'Y1W=L0'uaLDdЕ;ZTÓ۪,nQ?Vb_+лEԞcnG' 4 S}ަky`e:)KC>9nIfN QcJ\ЮsE7"`e=uu3(9nIfN RG9t=*`ًh%w29v32@9WјM&fAA߫ٔ J>)Nz̝:Ħw)#4v IhD(nsZh 8WpB SJO 'U3' O-cbrCc VXĽ:ٓ~D(rI? \=\'AdK0#) i!П:>hڕ}DhR|Цi!'i!#Q2 z &Q2 Oz fPWq36[4n̅yNؾi' fQ2O5&:>l]Ƣ[6 M>djL*2t|؀5t6q,@'BiNl8]Ơ Out|Wq+0uef/fN fu;zf܎ЁrCB-%M]̧DgU%sbɠsP̶yAW{w3̧E4j9;*sYN.ҧ BW=A,ulٓ}]́tNrT3-s1{2wUuwC23VgVd =U]%JA:2#1cB!ҳ:M6bym[F%2vOȗ%I? \=XRtw6Mȳhdb I2vaNu O?ONPty~348?N3gFF]lϪh (`o`~MT h}L3Wqot7i;@;.REd DӋ%')7bC!*y3|%J@yB9fFs{!*W|À5nQMMCLs C9I}C1d:%M>&t:<C`/$MMC9S!IN93 CAQNtS!# ȳOf>QL Of"Uw01C`0%MMC9S!l^|&i j) OISSQ0+PTd̂&t:l] *jj&~jDNM ^lG榡}j)Z|T4b(Ī^olI榡}MDtWr0Kj #0%J(hAJ<݄mP̶yՙ;'sOVnEi'䆄+Z.J4FS)B6f[:d3tP)FsS!I3Of>CAQ𺂩3S!#uM>  &PEUw't٩g0?E2Of>->nMDCQ2?Dtjv؁555EFL b;q,:O fPEJ 'NSP>̂:)Udf zMApgp,j@ Gf%KDofo4z̥]WLD%MC23VgVd v 枭W$"\i7WC}j34zˈq]Gef/tάAi=$=ZIhD(nP\: hArF8͞.ћ PwO;]~i9fu4m0ɦW嶕llNY/zt"8c$m++-J6',bym\oőm*v/1<Ұe O-s$bym`ebym\oő?'U _aK"l_^%a/K G2Khbym[KeK G2Kh,嶖dѮXlt#嶖dѮXlt݄ m,1-\q F4% Khʱ,YScm%`V[,I$ mY{Te`S"=YRŅk%ՉqpFteUEjZXaScm%M]&(b\ݍ`d.6Όc6:V jX=LQ K V%ѕCXKjưĹذ 1.`nư2]XGgFUZưĹذ k%ՉqpFteY-aX)l,P-mlt,XQĹub\mVleV;@.WIRŅ K V%ѕM]V;@s2bKT6+ K,Ĺub\mUs.YX#&,$c1ʛ}asv5Y`sv5ĸ8#:2ق,veXԴ`¦RJa+k 좴LQĹub\mVleV;@ʲZ+C)h±SYeBZ81*Xb\ݍ`d.6ΌYV&[0YeYVV[,ibZhT`1GĹub\mVU첬NekW0[Sv1;Hɋ -Sxد1.`nƫ , >07cX.K3*ʹ}U̵ `]* jn:i1a%o% d^ŅK$PZ+QK `^q.\b9[F] G2Kh%f4KQj Ɖj8Sff2p=GA K V%ѕW0A啎2bKVE7j /bʱ,X2`KX*X1GФ`4V$'kY# H]bCt1[iaImKX1c&9;Js , +hcKpK G2Kh,20ET݌u#%u,-auKQkJHQK G2Kh,6:\n20ET݌u\[Fo6dk KZ#^oUTBHµ0ڦZB!.#%es$1ZFcD^hU9Fic* ̌StpK G2Kh,6:\oő 1ͤT݌u\[Fo6ids^#,KXb]fyz|1<̒5 dfUKU*n:a-7TeKK$%8Wo{SA2[!*@ApA?gt<>o{ 'A^|AE{܉$#^!? B~_ K$2drʰ+GByQaaaFAXVb\9}FǏ]2lr% G/Hµ0ڦZB!.#%es$1ZFcD^hU9Fic* ̌Stj B+ Y# H]bCt1<4Хd%s$-F#-#эFF'.f5 LcS#bx;Y| Kӧ20ET5])G7djoRG Ok="lF%әV"*כԲD7֩`z7yllNY/ztUʆ85,-M㵪X=(z7zdѯztUʆ85,-M㵪X=(v1Ճbĵ(YRŕ-,YPARŕaiCV1깄m °KRGc+-RʼnkQ1 l*ZX*҆cs mA`ҏV VZc eKTeAKU X;3x! -K Ok[iXZU22v6ZiNcaemlcbŽ[iXZU22;C-VA,Ҝ*ZX=Tz0('V| Ee7caImK%1. j[iVV"*n:̒:YRʼnk KZ#^oUTBbym[FUʛs$Te``cbrʥ%1. j[iV唆La(c1-,YX,+-Rʼnk KZ#^oUTBHµ0ڦZB!.#%es$1ZFcD^hU9Fic* ̌StpJ6',1Yi%[V"*n:̒:YRʼnj6',Y%``K%1. j~&L'S/ LZ2P=S/z_/!_[_1@L*@Lebe=S/(LީLe!_z_Tz_~Tz_heCLu7e#_*=S/eLe(LeL2T2H~QT_T}S/72reTz_22S/8 _2?TMGe&LveeW2L"ez_2eL25Lީ!_Ge>edTS/TLjz_w_T毪e222!_L_L(L=S/2X2Y7eః0S/z_DTĄT~Sz_ P=S/{דC"$?rGU^ |(#xPGA'?K|bOC? 3/NAg _48B:Q? } V{F?![&2[PQ?ȵmPQ?c(.bm "? ?v(\SO`mm#(05tO ?OAG,?*Oa/AG6{/PQ?b;,ZPQ?PQ?'(O-E0YPQ Z8 ?omz%Y ?oa(0~1K? AGPQ(K ?o+?= WKi<(ʉ=4~vʉ'Al|F+-'}o‚FQ7:𠓶TMPJ*&פʉvʉ?*( 6lQcl>*(66ʊ?[eEmeEqa+l6ʊ?lʊ?yr}l |nlo]pUteEnQG7㭲r/eEeE+eEyʊ?lݲCOeE$񸃶TQBeEkqlЫ񸓶TQ@ rQGmB7$YjB Z**( nQG^4lɅ^*(`пlɂ C=& Vm2 Ym3? Y0 xZ{TQ|-0jQG_ AQG D=&"Z"1##lxZ&m] IeE(2ǶTQ_eE(

*(el TQTQeEJ*(p'm@ |pG*(8%m@@.ETQ@'\l^;TQ eENʊ? M' .8*(pvʊ?.lQTQ=*(KeE);eE)eE)x\#m ;eE)x\C*(H x\F*(H,𸓶TQz;eE) ʊ?RCBݲ=QnQG QQGTl ʊ?1AQG,K6ʊ?8JM8_C' '%=)K=)0IK=) ?{~R'#ߔIH_OoM{~R4IK=)YߊDߊDߊOocZIDߊ?X{~+?OobgI{~+$Dߋ?aOIY{~,DߋDߋbaId_'I}{~,>='$X!Dߋ?'$X%Dߋa$XJ= _'h{~6e{~6l$l>I$l}$ll{~6?{~6?'a 'a$lAIE== 'a+'a3$l'lE={~6$Dߍ_='rߍOo{~7Dߍ$n't'w{~7 ?OoߍDߍ_=DߍOߍ=oI_ߍǿ'y{~7DߍGOo'p'p$nn Dߍߍ/$n#n#Dߍğߍį'q;$nFI܏{~7$nJ= P-'= E_= QD߅߅= K{~= L?{~{~IZ7= B߅3IZD߅?{~D߅{~{~I[7IZ{D߅߅IZ?= AOo$-{~'hF= D߅OIZ&-!D߅_߅o{~8{~8C{~8)IU{~8p-= {~8-='I$pp$p'〿$pkg{~8'ㅟ'㈿{~8e{~8p$p>I$p}$pp{~8?{~8?' '$pAIE== '+'3$p'pE={~8$Dߎ _= 'qOI\'p$.OoI\'r߅gI\7I\$..5= O߅D߅= = I\== I\>= GOo=I\D߅Oo$.{~_'p{~= II\%D߅?߅wI\FI\G= ?= _'Q?IWOo"=T-IDߪ-I'?{~J?{~o{~/II'OK?{~$S/)=U/IBOo3"OoMNCʒ{~8@'ꏿP$P{FA{~ߪ{~@ߪ?{~A!I '? =T"~RDOo'oB?I#$P{~JbBgߪ!.I;$Q'ߦI?IG}'?ߪ%~Oo?IIOo%?{~9~^/{~9~bȷOo5=Oo%I=&I?I$rI,$IGIo/IWI/Oo#{~95'ߎCO'㕟'㓏_ߎY~\̿I{{~9g IozOo'=Ҥr}'= 'ԞߎP?rDߎD.92H]c"#.qtKd&L \mhSAqf?hbXAqf?f+4|XFqhbiӗC<䴾{张y#Qa)ǤV_(\ҽőBK%0}TҮd0}%TlIm`HbE Km,1-km+K˙-Qb>-?rŪ?p3-Q=HC=lb }H![T~G}HCEmQ۞G1jЅ$jІ~V>-QЄQ+GDB5Glb?&GcoB5Gq?& ;T~L%{cN!#T~(ߞnx/1j?}T~(z?}H ^Ū? H?pw۞N ڣv~7j7j ڣqQ8vvRSvR/T~) =nM}nbT~){ݪ?7j" ڣHv!#zkT~RX FGl~axGmѵx`KA:?†nxF8Fl?#s0(F`vdB?ZBl*j%-Q%AKT~{9jŪ?D }?D%{aST~MQT~+ Z8a3T~Olb}!?8#z[T~ >Ū?lb@T<&0pnxN~?l ?#nxZh mQHmQJڣqO5GlbϠ?@TT~.? ?lb? >c(UMQPG@)j€ H*-QCpHj(¦ iZ􌾂"1j >VԟG[TRߠ*j$;s$}B1j^T-QX)j-QXEmQXZ?Gd*j_B$(? Rc)QGJB+j–_@T#*j‘3ЊڣyFWx?7<^۞X!GQ`ИGMQ`Z)j CG|f!?Њڣ>'{c}?}T~%Ū?gMQBd@mQh nyhG塧5G嬽T~Z> Z3rz[T~0` {POjA71jMQ@ A1JЀcT~B7jҿ@1?K/GO?۞ЎZ`D/BQQЍڣ`DB9jҀO`PP nxT ?@ɪ? Bh۞,¦0G=?L;sˑz?.!G;nypMQpZ5G:olb![T~2 ЄMQȏڣ ۞3>¦f c?D:l*j^Ū?0-"~!nyB&ƾ ?1anyTT~4)!T~4_t;sƁ5GD;sƂ1jƩ}?[T~5>"j [T~5$z[T~B+j;s´"jµ ? ~۞MQVc+?0 ~"j̊}T~d}Z!;Њڣ5^"j6:C<{aST~f"{c~!nxXЄMQXCj+GЄMQ! =T~Gv BG?a۞D?B5GNmQ-Q?W1j0Њڣ v`B&E}T~:%¦@GJ}DT~H%mQuH@?g%GaZ UGST~1j4G"IV^Ū?,"l{@T~6>-QGaڣGbWR;sW!jYZ/RV%GhEmQGB+j1jz[T~8=.߈۞ T~EF-Q\>-Q\-Q\${CT~ЊڣAg1j,"Q1jބV? vO~ T~9}!?Ū?AKT~ʽ?1j9Њڣ}T~WGHX~a۞H-QO$5Gzl*jc/0 Z/j$jlbGGy#ЄMQa_pKj}? =T~3"0}T~@T}b?V{/B+j_G㢟QC6VVG"a۞(@?}??1j?AKT~ QbG#T~^"jT~<՗$5Gj$^V D ~T~_pHj^"jF }T~ȾVE>Ū? EmQdc2eMQfЊڣ nxf@G5G}ZH-Q$>-Q$#{cVSB+j(~!nx%gZJaST~ D/lbQ)jrpHjG$~<404g Z Qh#[T~CpHjHDQ >Ū?(EmQHŪ?xYEmQcЊڣŪ?x /lb$cj!G,MQO5Gg~*j5G{-Q>j =æ`{TaGj{?7ɪ?7%{?ZkQ ~&I5Gmƨp}5G^٪?7f_p juQ?vC{T5G {b"G.jך ڣr5G%T~I5?b{i#5GI@G-Q"/5Gp?'2jE9~G ?ЕGoJT1jA?A-QBlb7 ZI^q?90T~r =jGŪ?9@¦D-Qȏ[T~rC5GP BB1jP ՟1jSڣ@5GᨍZQ4#zGW ڣ!?:>T~t!q?%N{aST~ /lbqQmc6}q? lbG ڣj!?fq?g70v睬#_l*jŪ?;}KT~v#c75G/pHjy? ďBGO5Gl jÁ5G1jÁG~߈۟0 =T0n|ǾT0A?÷>w T<^T71jX .jGp=,j\T~x&z?~5G7;sßGO5G}T~},jÒWQtQ8[AcT~z\@÷<:gA?@jK},j@k((H2 7<$nx oPF瀨 C<CBMQ ^Ū?R7R>W%G3"O%G,{cz[T~1jXD!Gv ?¦'1jõ5G%G؏ڣC<;!aST~}T~| }T~|_>}?>=T~MCT~_pnxxJ¦-Q)T~ A;sI RJ-QQ~ڣڣ?!۞??>Ū?F۞ ¦ {c ЄMQ ?p#L?r1j\Z=(j#ڣNB&ڣz?Cj` `vȷЄMQ mQ _T?lbG2IT~;CT~P{[T~-?lDQڣVA!T~ ?&nx-)-Q--¦Ū??pKj{[T~>OEmQ_pKj?%G4:-Q ,"lbЃMQ.gڣ\۞ G5G?-Q~qCT~CT~pKj%G#(jxY mQ/{[T~ p ^ ?A۞75G!1jH7j!P(H?Q+ڣU mQ7??G%G%G{6G0;sl3¦{c `/Q0vGE&MQ0wVo1jwUz?1j}T~ @78#s 0(v!G8!G85G8c%]?Bd}LZT~pG:*&Q&Q?סG:{@T~Ū?B+jt[T~wQT~ڣcsz[T~QEmQB+j#Vdop"BV.cA~T~ߡGVEmQV0ڣ[T~Ёlb0G Ū?o Z~4?/%G -?i#G?$C / W+j%Ū?>T~!T~B+j|uEmQVZ=?Њڣ UEmQ[T~G@"{[T~pKjЊڣWЊڣ%"=-?qQ?pKj#cC?ǾG1C$[T~(}?WGB-"M}-?~GB }-?#GBfB'zFHV +Њڣ"KEmQ;MQ2 ?"nx26;ڣd7¦,-Q2v T~ Bb!'GȕvDQ{cD=?/B+jBGQ3T~ {c?@ժ?4>VЊڣ#[T~a5jZ$}V B?@Эj4" =?Dlb ƨ ;sF!T~w+j?1j!g5j!5j$?B+j$oB+j$B+jAg1jS{3T~B=?!}?!=?-Q4 h"z[T~ oB+jEmQ5T~ J?f4j}?}?[T~ b~FlZf~`֨+۞?Q'GJ'zŪ?`G&}&jA3T~# jag1jbBG1 ZQ>-QzLQ!cFT~# ^1j0v<Vv÷<>&<= Qž9j[B&p Z mQ}-j![T~W )K@T~!g?#s~A W #sp䐍;~D7 l*jC-QAKT~P~5Gv烁 ڣp$[T~ >hڣ-5" V{c AGGZ c DB+jMQ,mQQ+!GYG_@?aST~%-QkGX^ڣr[T~D?pKjȝ mQpKj"Њڣ[T~&}-?pKjڣ0 mQ =T~}?lbt@Tq!GQ' @IIo')~?)O?II'.~R}~R~'*?) ?)}~Rk?IHg?IHi?IKC~[/$I$V{?'$I"Ob$V""ObG$V&}"Od_$I?@HaO$X,D@Hb$I,D}"Oņ@Hc@Hd_@H` ~,}"OŇ@H`}?@H`?~' ~,'; ~,#"Oń$IL*-I/F/͒~6?3'a"Oǿ$l}9IO5Id~6?$l!}RO?~RO/?B䟍͒~6$͒~6?6I؏ ~6$~l+9I'rdO?Y'qg?n/'tBO6Iߠ.I,'qnd_@$nkO~7d>o?ğǿ$o7i?6I}y's͒~7~ I>'pO??@zO'?6IFzO??>~76I܇Ool'r??}'rW? Pb$-{i~'h ~dٚOԿ$-0 O6IZğ͒~ڔ͒~~'hiO՞Zd'l$-gR~OmZOQO$-6IZzOd? D?l1IZ"~lEOdG$-6IZ&{`'id_l? Hߛ$-${`$OO6Iہ'W? =R~8l۲O$pZ?䟎~l¯lv_O?͒~8b͒~8?2'"O 6I}휤p{Ojdl'͒~8='cOvOl8IE'۝'#dmOg? rd~8$~l+D? .)'r/l~ ?6I]_l;I\/'r_lBO ~'i?T {c$?B~BP'OӤQOCi?T#Q'ꄏ PPHBgm'O Ei?TE#~$Q ~:O0IW?E?O$@-I%r*bO(IYE@)I@ r/$K?~9O핤ra5'}jYXʏp~92ʯ4BG_rkԟC?*O!:O/$rTN='㘿~9eR~9~9Y*Iop)I}O}´AG~9>RO# ?$r~R㤟Cp'I?Oɿ_tO?a+Gۧҽ nfQa)tXQQO?G>nۧ{Ft ?=2A/!O |O Oqct-tȵmGݥGtLaGkO?ݔkJoO?%[idۧـۧ#(0nkmtVKt\ ۧY?(n2_oۧ2t͡^QO?,ZGoG'O?O??ۧE?CNIm~;[ily=?CN]?T@?CN(0Aߎ*s6wOS#(0@ot9&0vwOS LdB?CNP~ʜxoT"m?Qot9 U&vwOS15Rj9zot9 U&wOS15Rj9z#ot9 U&vwOSǪwOSP~ʜTC?CNIm?T+D]?T =Qot9 U&#?mz%Y~; VY?TI?CN0D?T/ MTF9wOS15Rj9xߎ*s= WKi?CNߎ*s&MG#o~;x^5r m?O%Eo-sA' ?xS_>[ :Gt|!@պ}oZ+C/ Q>Imx{17ox-nQG7] Ůk$?O@_V ӫt U&bokݿnQG`Aa߷Oܗl $?Tt<0ۿTt>oq>[c;@պ}?#=7N1"[-ǖ:O[15Rj9xotLM؏*(p |lJOcu[%ZO ?Oa;(:O"x^5$6wO,H;'&B->߷Ow%-sЁ ?OaROa~ t>/ MTF wOC/Ocu[qr^? OO BP:unF?EZNЉ^+!>~,Vc15Rj9x@:?gDmtʊ?Б|lmtʊ?1;/qk ?O?a@պ}1Nxbjr6vwOO66~SEtV7%-sɕ?o ~ALO7N15Rj9xBߎe170qa oۧ?TQEo\kL ?П?OU0ɁN  1VLE:O-a?J:un@[‗}:O-@ un@[ :O-@gzun@[>2N P{7N &MG#oF*=170t~?)`+~?)`{q߷Oq߷OP߷OP1߷OP6~?)@$~?)C/nQGߎ LM;poۧ?TQ*񸃷*(?~?)wqoۧ?TQEo例\ xW@n[O [O>>[O㩺unA?ɼ~[Oqg[OqN}oቪQ{axIOg{~?) |nFOVR?j=9@պ{c_o(o^[5?t= ܇ӫtƿPGN@[5պ{c_o(պ{c_o(pAպ{c_o(:Olk?պ{c_o(}qVj:un߀N@պ{c_o(պ{c_oB?zunw^[5cMӫtƿ~"NBרպ{c_oCO^ӫtƿ>[56=!߰ =!NBc7NB"NB=[5=:Olk?e:Olk!d[5w=|o=ImaVߎ$RxZ-OA~?)HZa*(_ Tmtʊ?+|- ~SE- ~SE▾O@k-nQGk=nQGZ{*(~SE2oۧ?TQPc*(({~?)xZ"tʊ?~~?)~?)ׅ]nQGD6~SEO v~SE>8mtʊ?nQG@6}nQG@〳oۧ?TQP'xV߷O pk*(?*(E^8oۧ?TQ8tʊ?8mtʊ?|p}*(B~?)p mtʊ?8~SE ?v~SE }nQGB p%mtʊ? v߷O!8#tʊ?-+oۧ?TQ~?)x\oۧ?TQR.߷O(.߷O?tʊ?1{ NOa7?Oպ{`i15Rj9yot&&) RnQG7];-sAO8?;) P:unRD[ImC/ ~SE v~SEtV,/qkRE'O@0%Mӫt U&wOp#"oT[*(Ta*((O~?)Ln+nKZp4ot>lx0V)x^5J>bo6Poۧ?TQEo%Zi t=(պ{x :Op06[ t=,V> =:Op0(]^Gto}wOp0x^59otCbo6 .6~SElCIO)FO \COWmnQGFSq'oۧ?TQEoܗk8?j=C:Op;P||Aպ{ImC=E17~?) I@v~SE?C)7BmnQG7]{\P*8ota9zun]:Op_Te[o* 5uW;oቪQKvwOlKY*(* <.mtʊ?ʌ.tʊ?1%ZQzx :Op ?&MG#o@~?)`ń rYM餖8Y~S7O Wi%G_ۧ#,pdOp nK)qnIc{/ʟaW\[XBg{tG&M'%Lm G_nn?S1Bőׁ{t!G&6 :{t!}6 :{t!}b;T( oROnlQb\vOЮ,ſEC.;T( Ć]=zb[~e.-$3t?-GH fЀ(.`;M'd,ſ?o ?BHۧc?lKIe.-.c Htʅse D= أĹ4;,ſ)$?-GHOOnؗ0'%"bym#%k.7bKӧ= O-s$rCm,1-\Ľ:u GaL\1rdɓ&L]$pAi \l]hb.'Xb9[G"htCm,La(b9[Fb^>bym#%rOL\1rdɓ&L]$pAi \l]hb.'kZ41=h_"2bɋ&.L2b# H]bCt1<4顉V61&L\1rdɓI%ZBD2X%hp*hyQS2N32ff2AF'1i%[i.X1H-,X%_)%[i&L\1rdɓI%ZBD2I`ɡC"\Ci%[i2I`dɓ&L\1rdG qy%.6"by| NdM_)%S4ɋ&.L2bɋ-!tK\m ED鞆'㵞t_#CE^t_#C0db^>bzc -*Oz7yllNY/ztg"/-%21/NL1byx;XĽ:u G$&L\1rdɓI%ZBD嶕_$鞆'V VY| Kӧ&.L2bɋ&.8K .6.q1C2D金7,k-&.L2bɋ&.8K .6.q1Cб^ SCVYSF#ʌ*9qiQqʺhbym`e@KX=41<Ұb _cc _m41<Ү7a0b _m411rdɓ&L\1t\`^q.qtK6[&L1bym[R0b%鞆'U9db^>bym[Kdb^>1rdɓ&L\1t\`^q.qtK[ibc .X3K`rɋ&.L2bɋ-!tK\m EJүhtCm+ K$Kcc VXĽ:}3Jlub^>bymaid6:镌Kӧ= O--)Ľ:}3JҘOz[iXZU21/NL1<Ұ%ӨR8'xL1<ҰL _c) Oi&L\1rdɓI%ZBD嶖E| Cz[id]-Fk:1/NL1<Ⱥ[0}Kӧ= O-.%鞆'YKe21/NL1<Ⱥ[2sJtb^:#^i'YKc)o鞆'YKcc/ztI&L\1rdɓI%ZBD,V e\nt2ʚ1TfaT̓̆cZӌU= O-Y%鞆'XGeyfc*sCj%vYʸĽ:}2bɋ&.L2b# H]bCt1<Ұb˖&L1<Ұb _cc,YL1<Ұb _cc _cCm++,6:\oőOz[iX1Yf/x,Ľ:u GWCm++,6:\n1/NBï ɋ&.L2bɋ-!tK\m EJ0}Cz[iW}1Yf/ztGI-Z1LҮd0}ehcAF'1i%[i.X1H-,X%_)%[p,X% O/-,I`hby| 96X% O rM me!ɴ-I,e$Js&bx;YKe21/NL1=Q1Ke21/NL1bzc Oz7zdѯztg"/C̒521/Nz7zE| Kӧކ'&0"lF%C0db^>1=Q1| Kӧކ'㵞[Kdb^>1=Q1山9dF%C0bdb^>1=Q1 VY| Kӧކ'㵞#%kdb^>1=Q1b9[FF%9[G&儶m&_.)5CM|KK'!EXra mM|н0D9a-7Iz[iW}g嶕q F4= O-@%鞆'U,YztJ݄ 4ކ'U,Yz[iW}Kӧކ'U,Yztg嶕\[Fo6Ľ:}3 X8.iz]#+-Oz]$ GOz`e71/NL1<Ұb%Cˤb@!1[iaImK@17zdѯ OALazdѯ O-pvpD1Ye2嶕llNY0bK嶕llNYHltpJ6',bym[Ke-%2"/-%2= O.dbym0DaztK`rCm+ K$Kcc VXĽ:}3Jlub^>bymaid6:镌Kӧ= O--)Ľ:}3JҘOz[iXZU21/Nz[iXZY%[0b%Cm+ K!ztJlu)+O O--)Ľ:}bymaiLKӧކ'V| Kӧ= O-.L\5ҝOz[id]-@%鞆'YKcCm,O O-.L\5ҝO O-.L _c嶖EĽ:}bymt_#Cm-a)ztgj%vYʸĽ:}3vZIma+27:1/Nz[il< LKӧsv//kм ,ކ'XGeyfc*sb\݋Ze7t;,V e\ntb^>bym`e@KX1bym`e@K@%鞆'V VY lt#1/Nz[iX1Yf/x,i O-qĽ:}bym`e@KX3Cm*v/+,1/Nz[iW}1Yf/zti%GZi%KYibLxm GZgZLdu_e؏-_eZ]1'lt1witm,xlt-0bL _m4,X02XKm4vfUU_Q1M Ld;[LZtm+ d lWz#.dKqnr2LـM Km,1-1X-+̠Lҽ Cm,iFcvQa)\ҽő鍡^L<(0LҼz#x6+ޒX\Lz#-I,o.dlWz#-.ai^bސم.c i2qLٔkJo)cLbW]$f+oKLҲ\LE<w_"նLE0Y{ l3+$4b՝ab&9 # ./usr/es/lib/libcl_r.a/$$  *4.,12:_t03468;acdefilrs -579=mnopu.@AHT`bg !(*DEIKLNORShkvxy| %/?JWZ]j{}~[^ )aI#J` 0` I#tX 0` H 0` 0`MS 0` 0`MS 0` 0` 0` 0` 0cI':0` 0`Hҫ0` 0` 0` 0` 0bjliTكI3 0`0` 0`F0` 0`Ȑdr Ĭx}ป%H`-!pqn![/ę Ȯ"~Y$h1 `.HDp8 _FDmr,9M")rW`c1JVaXM(ʰHf:%瑒b_#-"*l1 RQo6b(9 e0.0![ XElk0[ ,db@xK?0, 东>,,东\i,ODPJD VG东#$r!22(X0Alhldk1VVKd*Xa0%YbK Ȇ8bx%ġ-f0dx^KtDO9X t 0!F(eK#b @O60b9XC\) &+ q0`6.!Q?b\)&+X8q(rм y0lK%FI'2\K$l,G`;%@a b+kѱʖK`d^B I0X'%)'lKr2LV%+`5lcd(?ʰؘ>@&&p"f5 hǫya=I! 8=Y[Xl9eakcՄ?XF`/ 0?F[ !FdCd VȇP ђba .'?b\*a&+X8q `l$DDc p&+X0!5l`v C\*2LVV2Ձ`|Ky-bȗ VŁ d`;%c q@"#$k.B  l.'a?z6h#a`v8 L6 $')?XgH0X%8 FQb㈗! ;F$6hH6hvKp6%Qb㈗.;F&Xb\P ђb.;F$쌨6q"̂0<+a`b+a`쭅Y#a`b2LVa F6|^Cd ^``lXG%O60ؗ @&+X8r2l,!?X.&?XCFϕ %l,/v`~Bc#FX#=Y!p?ʰؘ>@&&p"f5 hǫya=I! 8=Y[Xl9eakcՄ?XF`-`ll,D1H@hY |ľ Id}a  IFp/FIѰ%n*XCX㈗,HpL2ѱĸd h\)$hʖ'bx^K9la1fq8b'F!225%X`lB$%06%8%$hXCFϒpEFIѕ,!OmzK6ѕ,N?d X;FTHE@ؗl,2[ 4Hʖ' el,:%"6ѕ,LdYR6с B).?b\1ZKDebar6G$`w? '_ ?aS/YtPr#ba]?cr\BCd P>X, Hʱ ĸ& 1Br\!#*KbDȇb|,ʱذvKf 1B- 2t6-r\"# b).YeX`lZ\ 1B(% Qc"\'D>F@ r\c@L'D>F@ I.XP, .BCd P>%#*Kl BCd P> |c!AQ?!2(X | Qc pCd P>)%Qc."# b1/, p\O|'9/Qc.'D>F@ _2t6.% ȇb|*%BKDe~&!Va|#`bſw?B폰y~&."Bb)[rVUhõr_*ðȜJ%+k#cF2;+kl~&!Vdcdy0H.[lTa tuD+$hkE#]KLJP [}T@dэq dbCC z1$rlHcwH@ľJK3 шH&Fdf2\=FI'24e0XFKtdĈGbaq> dy0H ()=HL\E!21HyYlL! #aq[>HD࠙Q.# 613"B!Hhtcɐ?\&+dĈaLB".`"F6G˖- Gr]OT@LVQƸ~ DQ1!P!3k X@i |~ #$ a| g#|."%7Hi`Hⵉl0?' ?A?ɰ %D Y&+F(c\H?"((/+$hkE#\T@+$hkE#\T@+$hkE#]K?(0G 6zT@+$hkE#\T@"LVQƸ~ DQ1!P!D z1$rlHcqQbbF5ăNB" .* ddэq dbCC b(9 "Fba\Bh|ԭeKȬD]$l/)!at>F@ .\BX%Xax0 IF2Ula6[vE䍌id|X`4,T AdHLVFD>H@hr?qZ6h?X%i daq  Tdbxr\IF-!1J6 |b"EƑaq  TOK  p5'D>F@FDa$XdHZaq  i&+X1,FZѰi rN߬ ѰD>FUQR\62+kѰ8Y?ʗHHĈĸ&DO2+k#aq"0#at$FD`HCŌ #`L' q"(YPX. "O6IRER̖ %0FDl*]"Q%hʗHl.$FpR\.FDl ѕ.[El.$F#&+X|HpLB".\RHx|#`r\̽bȠoM$b(.yYYbҶ eE+ `+1 .6 "$ blhôlc\J I1BFkcU2ʼnpO61rd R?\tKⅉA[H.:%"2ǣ1<$Gaez- aK~&."V[B|lV:F:+c#FF/!$X^MVŅcLD"(/k/OdO |6X0*F<`)%'&Kb_O |񀈗_OD&%"2r? > dy0Hbءy0]!t`ttVFD%Bldr!cTldr!Ą &fȇ,H@%r $^D8Tldr!0K#c#FH@629;FG"!+FG"!|~D&2B$ldr ldr 629œ ؐI|bD$y! H ѱH0H@lda\V'I|b|R_Ib|(%z&% b_ 'Ą)X|LKDe~&!Va|#`bſ R<.BFHEldhCI q!!V/FF1/`#c#}OH@Ò_ ѱȇ2Tldr!$ 2%ȇ0H@䍌D9!0D:2B+FG"!b|/V'_av ?\,O\>$%JKb_,.a<#G- c!Db1LBHᏐB"aH?48) y Bio` X-!7x,6#0x`- O^eyBhA,bL xb& |G,6#1;؏0H Ĺa` ؏0HV$X0H(G"o @ƑrˌG#H.1l0\2^e6G]?ALG!0V[B!el.=+*\~V".b+aq"6|Q1y1BKc%Y-'FSU #/' JV'˕(][vq1tk0,4xO.&YH4шфEѬe䄸P3FIѱȇb&F`m@j#8"TdldHhd>NT`lB5Fp7'aq"@,J4V1F11Z610O/D9b22Z!`'`l.$!aq 0B2LVH@(\H4 FI''!eC1rp"F6Gː2[/"E\aW&F#O+-!pE #a[ ʗ6bx%VJ6`$aqy[*b0RY;XC,XiHO|62Q`'Ev`l^HL IXD\HP-1# ` '| >H@(\H4Jc#F ` 'F-!0`Ă$ bl.$F2LV<`.%B6hB%"2˅1qH|# LG#De˖ٗRymZ4IL\E!21Hx9# 0V[BFòXp B# b㌗,Y*Ƒtl.[*r0 Hąla6 rl #ap>H.B bp%l.P}FJ4RO Od"9O A0J,T AdH@ +c#FG"$ bldcHq|?F-!5Є6,! #aq  "#$k| H,H@FT Bذ! #aq  $k|PZ|HEX\0"F6Gąb//X(.P>uiIPr#D'"쭅eK ^Cd PYi"O[629!c#F+'l"QP-Kbi l.$!aq 0 bQ/` ʁh@XƑĂ$ bl.$FP $k_#`"_#,\? 0q<$F\o,}z-ݗAvu`fI/* ddэq dbCC Edэq dbCC 謓z1$rlHcwL\E!21&%V.,Oldelc@Cld\2,Odp֑ar6 F\ #%Z6 F\0H?lH44d(`mP $kdk.%dbD9bB(X0X ؼi#4l.[l>X8la0N׬ FI,T Aa0L161|ѱF6hBXbcHFRѰ^C RH1ZdhD9b2)Fy5ІD\P6-q`# Fy1J6 ##$k#FlA`)A?!26#"HF$ bl.(F@DFI'G%IFHʱJ6YR[E#aqB6}R[^ăHPD*\2+k#aqB6q002'R[X Hʗ,⅙ e # l.#*\P~X*YRbHp=' \Rpȭl.(FqZ2"Ѱ%eKEm %eKEm Ѱi@O$FYqxLB".\|#`bQ2[a^E|i%L\E!21&%V.#ap^Cd PH@(\P4@#$h$&%"2ˋbar6G-VٗRym &_4%dэq dbCC 1Z1GA'!FĆ?@Pr#ba]?ʷ|H?c# l,d( |R620P?Z6BV: ,"#$r!2&%`1؄b`#$km"\QbeY^p= 1´a(,,K2LVV1X .X&#$r!2&%`1%CXC% ђblo#1 H$h%frldhq@ h # F 6ȇ%X|QbLK,FIq2xIrR2LVV1X .X0FICd LKrc AaB_dʱ1 #jcxľ$F[Gbav21l1 .[)e6)1Y&+F(c\H?"((z1$rlHcqQ1Z1GA'!FĆ?@1z1$rlHcqQz1$rlHcwL\E!21Hx9# e0. 0I+*(>& H%biREw<>,F4&1Y/HLB".8|"FOdb8c#!.[ z[}1qrؘBFF"1YV610Bb&ر0Tlo |Q42LVKDe~&!Va|#`b{ٗhgBi4Bdb9YlL! F"1YV?FU'D>FUV'. I|P9sldQ0t?"CF&++c#FF/!2(X8|*QƑtdb+cc `<1*G11 VV#cȇʱJ6126+heXl?Vg,V1F1F@0&2DqlcѤ`2O;^DQ`фL|F6i"FF/|H:DU8|#`b̽fy6eP]0i%1qrؘBFF"1YV610E`v6,HQѱ/!B)F0&+%"2r? > dy0Hr2}Ƞoa KBdb89ؘBF>lB+ceXOlcR0حVmz60|#G&2DeЬNX^V1Xc `E4R2LVV5F5,OdPѱQcv|~CF['>F|'?F"c`{0CF10Qlj6.FxKE2ч?!1, b0싁 iFIѕcTb&F~0XVj# V±y0i2LV2jDzX^?aaZ1^A1? .612/ Z6K ѕw LF?pb+hg,VtlwF@4aLdd1 CF2T`!lcTeY-Bµ`GFRO625c#F@0&2Dq4jRb%ā> HG&2DeЬNX^V1Xld(;Fp!# @X#c&,Odldʱ|;F?!#DcH d>Nד10?=!|L6!#F@O/'24ldh;FFF"dʲ0?,/Y[E2^ax>µ‚_,Olclcd CFF60|Dɑdax~X^?aaZ1`++hʲdlda{%Ap%hʱ^X~ZVaJ61HH? b2F!?bh&J>T[&FUBµp`4Q?g,VFh62deX.]e1+c%F1F@0싁 iCd6F |'2\OF#*!`? 4@JO60|4П@#y81ق0Qʋa؄i!KE2ч?!1,60VF偀>µ„ld?"CF$hʰ0Y[EhdeY^Ap%b# ar60i"Ddbx% ʲ0?, Z6K ѕdуƑd_,Ola60ч?!1ƨdeY^Ap%hʰ/˨?pb+hv9b0vhѕd1 CF2T`!la2  VTBXV6.0 FF9b24ldh;FH x6FU[^?b%"2:DUX|# LG#De˖L?Mz<l}Ma K&F#1 >lB+ccbVJz4$Y?z2?F1ظ<F~/!2&%F?+ccb+c#FFaLdh𔍌z#G&2Dzʲ0?,/ h,+! ѱZ6K Ƒp$d=F= HG&2Dzʱ620~, O$ az2~.di!a&+%Qdax~X´l|#Ap%cH ђbldk3+c#FFaLd610Cb_lt? p&F#?"2bWf^ݏi!4IL\E!21&шa#b[*[^{"#*+bpEldQ0x?"CF/FI("# b㌗)VJ x? 4O/'24ldhlB+co#c #O;^DX0ѱ/!B)F04dĈaLB".`&F#?"2 lq۱K!<I?ALG+-!tb|؄V=+*ʱVףcHĢQ )X2F%!╉Lbr*2?d\cH4u&++cc|'2\VJ |? 4 O/'24ldh>FFFbDѕd\++c C$bQ(H*eǡ1)Hc*bBeXl?\Vfrldhѐ0|? b610 Tv(0?=!*0Qlb6H, F1FUľ$F["*> dy0HrX b2y w<IPr#ba]?Ee[CH..'F"o, X?!cxi&+%"2r? > dy0Hre8mw<I1qrؘBF!ElcҲ~Omz61|NXC+c%%B[*62Td Q?d\cH8"$elclcy1BKb%FX?!#Db+c#FF0&24y:611#FUbcAp6F=blceXlV`v ' ѱX2FT 'kш*2 Q DQʋcKFEDc*mzKb_#-bavNq<$FXo-|ٗ f;v0i%Pr#ba\A|?+aqYR+ܬ&.=X\HǢ$ bl.^Cd LKl/qy1BKK0dy 0шF.&YH4&d|F"dkv4&B2LV4X%Xa0 Ѱ譌b|9Fh^l #*] 1{V4@ ,"a"eiI?*f2Q`x"V1F11Z610 D_D9b22Ző#Ă$ bl.$Fa2LV dy0H`̽b<ڿ1qrؘBP6\^VTE+!at>F@ .YeU!`?\^VJ>\9F+cѕ. ,!,4DõƑL7'aq"@,J4024ldr!B+FF4R| #`ʁhBX#l.$!aq 0BdbxTKlЁ"$ j#*`lXiF?\H/!B)FA`$k_ .ptY!#*]B"6 |Qi!db%"2˅1qH|#`a!o-*/X 4K&F#O+-!pE #`eKȬD]"]!y1J6P^Cd P dy0Hت̽b<٤K&F#"~VV".XD]B[ B$ bl.(]ay1BKib`mF,' V'˕(^Ela2Ye2ņhd0betcH"A'aq"@,J4!c#1Z621`K-ȇ,F@FT BذKF?\H/!B)FAa1Z񀨗6h@5Ѐ6.)Fl.$!aq 01Z񀨗H RL` >H@(\H4#0Od6Q B@BFMĂ$ bl.$F$k/\.DUˊC6G K`2[0O?ALG!0DHqYlL! (Kl.YRXXD\bV%Fᔈ|Q(\b/!2(X8r-b`mƑl.[*r0 Ela2`(Ya a`Y?D\> #Ew=`l\.FD".$XFTO[629!c#FIK`ʁhBXhi̟l.$!aq 0@j2LVZrdlЁ"aq ʁh@F".$XCH FAy1J6 #QblЄK  H* IFpY ް6,0>Ѱ^C RăH$k_#aq"6K BB1`2LVq[^(eK˃b"D`/A0aq"6K Q.JVףaq 02LV?e1sN$a<> dy0HJ[ˇ8,/X@no-i4b(9 "FȉN+-!p8|@+`jV"acY!`6d# b㌗U#%'dldÔlJôeDa ,!,4F!(0}zذHF#A?*f2Q`rVFD>H@hƑ`K$l"QP-Kl$# O6 |QiE1Z6hB%Ě6h@XQ^Cd de@ #, 2Ѱ^C RăH1Z6hB%B6dCeXdʈɊ, 8Q1[Xdʗ,ee #$Ĉ,(FTFLVףaq"6|i *#&+h XR”l#di^O|ĈX`i FAy1J6 #*2LV<`,%˂R6C$bQ(H#&FaH^&#Fn*#&+hdlHĤ#"<#`%!{%FH1Z22b |6ɑXR]A`|2LV´l.$Y#% D"i4b(.Yb[YQ`vV"!`xQ`vD,!21`,i[H,:1B6 |#b+`Hʋ<`22àb4eE$0pa &+0&# h,)+`l&FblC"Ol/'-tl/åXtäeEa o#`00=1Z_bLB".,l1 BXamzM>^4I?D!tEeeJ, D,V2У 21a<:+`R!B(Fa/#`00F@ _6 dC# bbxy[Fg|HaLB".,l1 %[f^@luI1qBDa謨;+ ea<+ 6 eE1DƑ<+`R!B(Fa/b_,Ol#`Q`~Bc#GH,L/Q`x?d`+Yq.X$r!2#`22à?cAp%%lBHђblC"Ol/'-tl/åXtäeEa wFba` 1Z_bLB".,l1 RX)/Yi0QEdэq dbCC C+$hkE#]?ALG!0DHqYlL! FbEeDohQF|QF^Cd PH@(\H4OKTl.$F$FO|ĈH6P0: FAy1J6 #p#$k#FĈ.)+aq26 #pxb+aqB6#*\L?!1dnCH"ѰF:+c%X.V`0 "D#y(0: d!`4DO"ⵊh>Yi@'|ѱ#\J#`ʁhBXcѤ` Fy1J6#@X`"\K`  >F@FT B1qZHD' >H@(\V4! blЄK6gƑ¢Cd dl.+Fz DaqX Ƒ#$k\H:F2F%LdhQ.( VVy/`t#LdhQ.( VVy/#Bq@^Apl.+F$FT^V$FD>FUQF:FT^V``eK2e2ņ@h,(FT^VףaqZ6|ieKm#aqZ6K Q.XR1dJ%╉1[ _`t#LdJ+ap`Kⅉ˨V ,+ (1 >p`?d\cH&+FT^VaZ6 ѲXV/!2 ^C RcH|ODpIFTF!gшCFz0?,+XCHdb+as\2!~Bc#Gap%hʗ0~ZVaJ609b0# b0&2Dqdl.+Y_,Ol.a FT^?,)ї#ap%hE#*\bcAp䍂1dJ%FT\fayfK~Ye1( $`t#LdJ6Hʗ[EFr2PF?d ѳ/" \sx~´leKȭHeK ~.d/"Ѱ\sx~´lIR+h.ee #1' eKȭFr2PF?d ѲYDeKȭ#*\.F3 ѰV%xh?0n\.FT? Z6q$q!QRX.*#BJ? Dx\D^K#˃n\2Vp ʗ0ACHd*^Emay#*\.F".`/A? fK F"Ѱl.aRz0~Bc$G ƑQbl.(Y[ Ra  IQľ$FX9DUa|"FOdb8c#!!- aez-<IL\EшeR0䬫LV0D'\_#-"*l1 %੗RϠil|41qBF#JÔeXr?# @RO/GbavF6GſS2y إa?D!tb1Yl9FU+0E?$F[%DUc#LRq۱K!<1JVa29F"aKBa?$F[%DUc#˖2C/X!1JVaX*Ôb&:KO/GbavF6GpR_@1qBF#JÒ;+2rQv"dfK_#-"*l1 BpR_@ o~&."Bb)[rVUeb&NQv"d. NKDeQEX]?"<V)n/D]1JV*ÕiGt_#-"*l1 )e0 6y??D!tb1Yl9FU+0L_#-"*l1 }}Ma1qBF#JÒ;FU(L;XƑq?$F[%DUc#˖2¦^Kw>01JV*Õi!O/GbavF6GſS Yz<lȠoa1qBF#JÔeXr?#̟_#-"*l1 2}ȠoaL\EшeR0䬫ѕa1'`l?$F[%DUc#˖2¦^KweP]! dla29XƑPbO/GbavF6GſS bȠo?D!tb1Yl9FU+0|HJ? 1<$G-V)n켊 ?D!tb1Yl9FU+1KDeQEX]?"b(.F+-(ʰbF NKDeQEX]?"?D!tb1Yl9+*ò'FU(L;F2uiKDeQEX]?"<P)nM?1qBF#JÒ;+2teXrDôa'XƑ(%"2(LB".`B[ z-a1JVaX*Ôb&:4,'Ĉd1##Dy o8Rp! dlaYV9XDFU(L;F2ta3ib%|HJ? 1<$G 5 b]1JVaX*Ôb&:4|HJ? 1<$Gc^0Ouo! dla29XƑ%"2(LB".`X`RymZ(: 41qBF#JÔeXr?%"2(LB".`Xb^2(.u~&."Bb)[rV'`_#-"*l1 y w<b(.F+-(ʰbF'Ĉd1##Dyb^ݏs!1JVa29F"aKl~&!Vdcdy0H.[2[y>?D!tb1Yl9+*ò'FU(L;F2u|HJ? 1<$Gcv^Kw>! dlaYV:29F"a0O؂O/GbavF6GpRϷr7L\EшeR0䬫L"m#*Ôb&:0?Ḩ_#-"*l1 BqK/Xn! dlaYV9XDFU(L;F2ta3ib%`7'Ĉd1##Dx\R)nۼ돐1qBF#JÒ;+2rQv"dfK0,'Ĉd1##Dx\V)nۼbi1JVa29F"aKQ?$F[%DUc#˖2¦^Kw۶y8L\EшeR0䬫LV0D'\;q?$F[%DUc#K1bo~&."Bb)[rVUeb&NQv"d.2 ?$F[%DUc#K1,bl|}L\EшeR0䬫LV0D'\:%"2(LB".`B[+exe/n>! dlaYV*Ôb&O%"2(LB".`\ z϶RmǍuL\EшeR0䬫ѕa1']l~&!Vdcdy0H.[ zȏK]6~]?D!tb1Yl9FU+/`NO/GbavF6GſS Yz-ݱgL\EшeR0䬫L"m#*Ôb&:0?̟_#-"*l1 BpT)n}͔io~&."Bb)[rVUeb&NQv"d.|HJ? 1<$Gc^Kw>ϰy`hPr#D'0>l"bL#L$$Olb60/!B)F>F@ .]EG #BRшGF0A`ne&++c+FW"$ fZc i&+FpO|0BF d>NU #9a(?`z dVHLBF('lpȇlp凨ʸV##8̟_,Ola60WFH$eX~Ap%!BѱCApcZ*ŇCH KE@F #*$b&~h‘ teXD~XVDb1~0XiL2LW"# dhJ2BF"a^K VF FUA8J4"'_#cg,V #cb1zX^?aaHH63+cѱʸG&2DqeXDH(ui~&."B$a<ؘBFV6J++^C R,Odq62lA`l1Y8x|"pc=B/b4'ba(?`)?*F"dcHXtO[D>F#c22j6a`\b+cc*ƣ2ѱ*!x~X^?d ѲXQ"$ %FVH4`,FIldhLbD~h̰ L6,0.8O/'2Tldʲ4b&1 ax? ч#<%#c#FUB~.dVJ~. 8/!2&%hѕc?,/ h,+FU* fKKxi"ȇ61 VFD!x=,/Z&XC,Xi<# ĢQ`| IX|tfrldQdhLb~0 G&2DqfrlclceX~Bc$G# ĢQadON%1/ǣ1B"F6GD>b̽b}M`e\a4I?ALG!0DHqYlL! +lbYW XLBFV/!B)F |'2\#+Nlb0Ew=`lX #,X#J%dii?*F"dcH I+ccȇlcR\V5X`i %"V1F1FUG&24eFF~h,(0+FF?f`fXR~k&X #%"VJVFD!x=,/Z0~Bc#Gldhʱ^´l*Bx ѕecF,+FPH'D>F@ѱHʲ4b&1 ax? 2bH@# ĢQ`Q?/X*2BzX^?aaHH6Vg,V1F1FUG&2DqeYdN%#̟Q/|H=DUD'0q<$FB$-p/X@g<@yI1qpr# e0.4>l#yVQ D>H@(]!y11/Q# b㌗.D>FU]E #@O/Ѱ# d4A X%Xax0pѰb|[rV*]% XC,Xi?D^HFD|XD X CH?bZc%FL24ldr!B+FF4Rrl"QP-Kl F` IF1!c#(xOK (D9b2)F1YP-Lb6,0, F1!c#(``"\(\_"#*(\^u dbFTmz616q"2+k#aucL8i8?(,(FTm#cdRXRb´eKVaZ616KʗPr616KʗPz6QV1X?,afKF'%2+h0F1FRB/F#*!`0=`fKƑd>FUQ&2\ #@JO616HEʗPz6QV1X?!̐a M#B!?]DeX`)̅2XCcHzO61i9db%"2˅1qH|# LG#DeąٗR_@ Kb(9 "FȉN%QҲؘBRVZʂ5+~VЀ@ C-PZed=B/ظFF FZjD A#F#ElF[yhċ[jlQh~Bc#G`-BLȦ`~\tD BH/~VKlVg,VZjeE#,O%"2h:DUiX|UMHp|# LG#DbA!o,)ez-ܥ@p]i4b(9 "Fba\BX|F+auʗ EѰe"$ bl.F/!2(X8r֑f2jCH?ar4d #/ # $V, x0Ѱlab2tl.E$la0pd|XcHO&1Xahѱȇ0%RF-R!5`m`V3'^C Rb41ZpZC$GQE>F@FT B1 ѱE>H@(#Hʑbr "#*+I|P8["1/'2TldʁhCї%FhʲTb&5Y[ Q!2RFTH(ʲP? d?d2%mz612/´lDeKJĈ\R2PZ&YLX0* F1FU[! V„eKJ,(F1FU[! V”eKJ,)F1FU[! V´eKJ,+F1FU[! Vr2%m V1F"dx= d?d2ņP''VJlZ6KeKJ. Qdx~~.d^qI[D"l.)FUQ(^A`0=~V~\^%H"} Qca% -0{SQAZp|%0c*B-\+FRⒶE\R2PZ dKbli (ʱ1% [!~02YKblic%Y[*62Te@!Ld^##c|QFXLFIѱĈ./DU˘$a<> dy0H omz-ܥa KBdb89r"FTa4%H$8Jr +-c @n+`fҰ?qX@03q03te`ѲdCeXbp"2R_,NȭVJ"CGDFIɌ-Yl/F`n?+7g>F@ .\~ W6`7gш(|@0w0nя/ԀxD.Õi7R&{q0&t#HD2Zw=`l\ #ܟCFUgс0с VO с0Fou100@#y8YV5FUd$4x\7#$hƤ`xKE2?!1,1FFeч#3´`B_#*,$. µbN4 JO/'1612/ԃ!,=F~@FH-IęMG aD,ÑZ6H D> ǣ~F@d`Ll0=th#ш(1#Z1% #pO 7FVU(侢61((ʲ0? R Lr?aC"8dldk3+c#FFaLdeF1001Xd6d ѣgCd P<`,%JKb_*P 1F !P|UMHp|# LG#Da@2[K!|}MM$&F#O"$a8FJba\#`V' Dr( P$+ @ ,(V%el D2`m lAy1J6@( # bb_`(|'2\T ad/'@PP)F@a%Ѱ% H:'{_'s&v F'*@X& F+A(4" I+`J5Fk"$ bl FHK+l%`e4db(Nד A2(;偱##BB|H?%IT VѐQ%hʄJ&FT%A)^A?`F\C26P ?XX(FF#H.H@hiq!dg 860&$FIѰ%cH2LV(4 2LV)iO/$layFBFV`JƑ)R2LV(4 Q#$k.%aD %h-a0f5a H CHƉd 4@Hh"`EhH"`#J'YP(Ee@(>cP`4z Q P/‚1 V 2X[P(F\Ѱ%!B:%R/!$h%2LV(;F? $hcHVOd$#`(#*HA)^B1~0Ya#B}lyFBF?#$hc1Z61dbx%ėFP(FT%R0c`+X?,#@PO/% bl A0$dQ i"2LV?C9b#`J2*"1'`JF9bh*G&2Db;ľ$X`JFJ1ѐl D$eBR0? "F@$ȇ.F@!'FBFT%# ~.gHF(CAp` CH+'ċ[T%IPa PvJ^deBQ D ,?d`+% eBTJ& b9bP"!`JCĄ !FP&4zHCH$h`ԩ&+FCF Q#$k.\!( `J>^µX?1 % #'*@9"уH?! L? р(EeBlR!V>" h _H /#G(4|1Z6i1Z61DFI'2\>@>TL?FƲ!(i"d =?!=ăAZ0@@VT& J0YP1`JB+*.8OX #E2|H(JFA\+,p(FF#H.H@hiq!EFP)4zHCHǠ(FIѰ%cHǠ`J!#"2LV dy0HH X`̽b]b(9 "FȉN+-!ta|!bL#L$$Ola[rVNV:+cy[la ^C R$|'2\LQ⑤hFdc +##HМ'>GLaw=B/biQ?22GX&dL6FnO[D>H@hƣHI%УcB4ATdbt?#A-&++cyD9b2  B67 JظKFu"QP! B3`;rCd V'˃ʰ, f*A[X`m\-1Z2$H&+F4@RO& deX!#7 vDÕH +c*ôlo#20uŁ#B|H?QQaFGF*!x~´lIF0D4 Ordr61^hÑZ0zYA V}a @F|H?c%FULdh𐍌9FUB(# h,1 dx~.2 #c "FI\FU(!xh@? x #*dldxhH? x #cF$haw1Z67db%ġ*Q*ɇ&2Dq9FUB(# hĒ!Ą60~ɂ!`<'D9r2eB(#F´l04 &+'oѱ(ʱ^c?´`YA V}`iO/'2Tldʲa (ʱ^cAp%F"a2/‚1=´`~F@laCH'D9r2Vcfc `+X?,~3h fc #`+X?,~3h9Fђbla7DdH*2LV?@*Q*ɇ&2Dqb9b1612;dla7h1Z60iQblo #~h1ZK^4Q?Ñy1J60iTdс72aQaDFIgeY:2^$25Fϓ4aUf(bX,F4#$haa&+F0 ђb !&FNh%6"# i#c'F1Z60ix3FIѱ4<:OdVذCFx I%"VJVL?!1,J6FUPF?d0ȇ.F@,(F#*B(# hĒ!ˑ06 k\6!Ƒb+c#FFh~Bc#G4ldʲ2`naTeXl"dx cx!yVN c `+ f V#c% (#FGV~X/ f 84 &+F #B*FIѱ4&+XrfrldhѕmLdc%Y[*62TeY0H!ċ[*62TeY0F*60VJACHǁ?!ˑ ʲP? Z6q$q!! a V}bF;q?$Xѱ* :2UV#(^A?`^?d`+%0"$ o#*ѱ6aTla ~cx #*dldxhH? x #c'F|bla3ncxizO625c#FU?!1#jfrldQd"8dldHχH1Z60i&+F31ZKb_#-!EX]D'0q<$FB%-k(n 4ID #bbF5ăNB" .&F#0~6 |Hy[621y4dN)+cc#Fydĭy/|H"*6db8c#-wm<b(9 "FȉN%Qr`V[B a$(>+*X%aJ'tf@f$E g0?1(#D VYHKpX%QU$C ^D#X`i6:pN#$kU丘1YQa(>X,#J&XF^&8c.&b2LV8.F;B2LVV$l R %,O丘ђb_ !%H>`J(Ʋ^%!$2O/{ U쁧1(`h%( qPJ  |J J` e ܟ1 $ (?f52ed 4`G &F8 1IP 0 (0FR IF P"l R+KDe~&!V J#0"F6GĢB\My,]6~b(9 e0. @>l$#/!B(X,K,O#ˬ!6:2LVVFD>F Kfђb/%[N 625LHa2Dȇİ;XpL QbldcH1ZK (ԭbKDl`^)F/ȇ4eXf2Q< Ġh 1El4l9D8\H@dOJ_OlY/rFUVcH3625L@ EDPAFICh,%e d1t#p'\:&d,/!2+F ||*+1H3625Lt#P Qb>K`GXq("$hƑ*2LV4X|Bl4l9D8\H@dOJq/'x\Kb_ Z0 Lzr4ȑVg0V1F/a,^)F/ȇ#) Qbľ&%"29DU6db8c#-+)ny,=gOݷa! dHZhi D$F[%DUc#ߋTGvy,=gOݷa&F#`V# 6y0iA1BKd$F 1(f1Ea(! $elb61D>H@#1`1, iblUVH:O624eBp"Q00CdD>F@)aЉ#bp(1X2zO1NH&FPt1(!D !0DU1be P,V4 (1\|'K/ѱdN)+c#FF/!2Ek/|H!"*8?db8c#,\Rv ?c=@b(9 "FȉN%Qr`V[BYP`>F@`-vD>F@ .YB_#Vb+`JF)(\)2,## D'21l1 K n?g2t}nʈJ+$hkE#\T@YY&+F(c\H?"((dэq dbCC $bbF5ăNB" .* `VIъ=96F$1?𸨁ҲLVQƸ~ DQ1!P!D 'bbF5ăNB" .&F#a#a<YQxJBk[[Ő[*b k.N|Q\^Cd PF#`D617^Ord R?\tKⅉi[H.:%"2ǣ1<$G-<Y xi$,&&F#O+-!pE a#eKEb"h\21J6#,Od Kdl/FѰldÔl.aD\2FJ4;N߬ <4D1@,J4lVFD>H@hƑ3'.Ѱ Ard De@!, fO61i*`"\Ѱ B|c|b&1XXilcy1J610#$h./FHĢQ )X]`~Bc$GV'!0Vb_,NBċ[ P-2 *\HD\L?!²au$bQ(H0bq ^ h! ѕ.)+h6X2F%!l.2%m(ʗ &.)+kѰV1F".$ ~0Eċe #bq ^ h,&FTdl.)FUQzB`~k 2XPX0bq ^ h.)FTlceK\+FqZ2%mc*\H&Z6Kʗ\.FeX/&V~\/YzirѰV1F".$ ~0k2\!Ƒ ܟl.$Y[ P-"8ѱE>H@(#HöblЀKb_#,~&!V.`>&F#?"2%@VesM&_L\E!21Hx9# 0X3bؘ~.`|Ņ<2ˀ}rV+V$+V&++ ! |L0+#`W#@'=o') HF+уpV$X #pJ(2!BPbKLeerWHĢQ )XAeFd1)HNB` ld$Xѱ*#<&EYea##24a%ق6F#dD1H@60%V&Y/'2dldʰ~\.la2j?d`+Fp2*,QPV(3a#Z6Ka+/#c&Y[262deXl?.Ld''X2b?!1#.X0|LKCY`PīJ0?P|UMHp|# LG#DbQ)o. ,)nۼbiI?ALG!0DHp9*&Gg!rؘ~.`|ŅL,4aYH* !3A<PT#|'2\v1Ya6APM D"9FG+kс0*ѕa$YH4y?dl#T#XL P  di4DO60%(mc \V PVqZ60%`` rʰ`^%=1)'?lV,k2\!Ƒ,䍌frldhѕc BKb_*.YiFb>*&$a8>&F#?"1 (/XnI/Bdb89r"FTa489#sF,( fY`JAPM''* `~ ta*O$ bl/!2(X8rɌ̣Q hdJ%╉A[)/1Ya6APM HG&2Dxbrld(X/+c%\Ô`L teY(1-'>T0A=4p?dy;6, CH d>TQpTH,lclc!V(F1%_,Oldhѕc d`<2ˀ}r##24eY(? ?d dla6K Cd#c * 3C"# hCG"+F#d0m ÔmbR$GQ j0mdlLFT#ʰ`,$F6c XL PVa20&B:26X?,(Yc`"'l`` rQ.+FG+hlr00B9[E`L teXl~\/YziT#*efK=1"?X2b?!1#@X0ćJ ZQE N$a<> dy0HH$-+ٗRϷr6i4Bdb89r"FTa489#sF,(:[,pL9+'* `~ rd~VUQ hdJ%a`x^0F82LVE1610 #'br`V1Ya6APM HG&2Dy|>FB`i2LVE16101$9 0ؗFQl^^4pq&++cc/F4r'! dlcy1BK'\ÐAPN`L h1tO N 4l?ʰF\hLb6X1!?GѶ j0n ri A9[*62Y!V(FJK d$Xѱ*G&24eLFLVbcAp9FdD1H@,5FTdi?Gp3 # D'21l1  `̽b}P> fI,~&."B$a<rUM:8B:e0\ #J@&Ca* `f yX YcTl#G&2Dy|>FB FIV1F1F^d?0ؗɌ̣Q hdJB?!1#>0&HFIV1F1F^FJ%'brla/i:FI(+#! Ƒ0 9^V#c|'"\&YpC=A8>Tс0* Hƃ?GѶ j0n ri [*62Y!V(FJK"_,Oldhѕd2dYfQ+&FDa=!񀬬Qa0BH$ YVˊQ* # ʱ0Ql?1~0a6APM D"HFd";~6i3"ch>YiEDc#1Z621csD$l"QP-Kl?F b/!B)F1FFI'G%D9b2bb/!22Z`maDc|QFdbxr\@FHʱJ2br쭅ľ$X\HVl.$FT BFlѕ.$F".&Y[ Ѱ!2RFTR@?,"FTF1FT/ VHqY[X ѕcb"@c`+X?3F2ѱQ.$ ~.dRⲶ ѱQ.$ ~.d\qY[El.+FUQzX`^%=11'R@?,Z6K .++hR@?,Z6K Q.++h g,Vl.$Y[ P-"861i(DFIѰľ$FYqxLB".\|# LG#DeK ,)n;v0i%?ALG!0DHqYlL! p>b’B1YQ!!"ly1BK$liVa!!de1dXV $`$,;FH X;+`"|"tlac RO N cZO6B22BXDF"|#`@%,KE2~Bc#FXR*2C? ?d !B!#gH8!#`BFaB2?!10"#*(!ʈBA[E6D$l2Vף`$#*!2ad`/'"6q"2V$F„eD! „lH,)FTB ,)F´eD! ´lH,#*! m BK,!Ƒ %'b%#c#Y[624eD"H ?Ĉ!EX\B0Hx|#`,/X(!}qK&F#O"$a8&8l1aI[!BVBB6B@bx%6B4|020 XV $`$,;F('br쭂CBABѰB =B/b?!ʈA a%FB #`@ble|H?c#FTB Ldh Vc%FUaY["6D$lI!$lHĈʈB8F@6B4|`##*! mh!ʈBA[^BX?3 8QH+k#`BFaB2VaB6D$l*! m`BFaZ2VaZ6D$l ! ʈD%z̖ cHi?/ѱ*!&2Dq &%"2!~&!VD'0q<$FB$-ٗRvM$&F#O"$a8&8l1aI[!BVBB6B@bx%liVa!!de1aXV $`$,;Fa?elBBB47'{_'sŇCHxFFFTBK(0!B H B6D\/'24ldhʈD `f2TeY1~ A ~.B!#`BF$ q0 QGYL4 0"#*(!ʈBA[E6D$l2Vף`$#*!2aaѰB!#g#*! mbDlH,(FTB ,(F”eD! ”lH,+FTB ,+Fr2V`!!Q~X/Yzi?X2~Bc$GMX0Kb_#,Bbaq?Hp|# LG#Dd"B^X)/X(`fI/~&."B$a<&.F,++`H=+*cCQ$#ё?_'ońH΃Bє ѳʲTa! bld|(X8|#c%FT$$XC, # X|Ht? D'21l1 .[l)n?sIPr#D'XVVJʅV" j6"NFU'.B K /FO|p$#;2N߬ (42:O/'1612p%LdhˣF&*!x~X/ hĒ!2Dx\pM hĒ!2(X1!i`~. y1Z64~ZV&F&*!x~X/`pCF!q r2GF!ȇbl ,FUK1^C`\f0/!ˑBpC q 4Ki`~.dD>H . Ap%2!#*eX/Ap%2!2B(X0rF&*!x~X/ h!#l h\+F&``\Qc?,´li!,O r |FF&*!x~X/ h,)#l h\+FaLtʱz65V1 x\+FaLc'"\F%65V1 x\+F&X#`\GZ6q4seX`~.gH8bxXKBK_,O$Ѱ.V`\ (ʅ5BzX/Y[ElcQQ (~Bc$F`mk# pJc% q1BK=*tKTdFPZEagCdd P&F#?"2%He>K]6~]ƓI/b(9 "Fba\F,++`\ %eBJ+5J'#* !U#F" )IFEv`lXz4KEbb\ C2heX/Ap8D9b4xbxr\dl j2b&4l !#*tl q)!V+F!reZľ .k3 E9 Qaz6 fc Qd(9!Df. ʱ^ Z6K dC?d ѲXS""2^pMFUB^?d ѲXS"$ b/tl j2b VM""<.F&´liʱz65V1 x\+F& q1B񀰗.`dl j2b V™"<.F&´lȇH`\Qc?,´lȆ8bx%b_#`\Qc?,´lir64~.gH0FUѰ. ʱ^ Z6q4c'd$)%BI.XIaz6\Q/~0X.F1Y[P&2D`/lBYHK2LVVJD1F@ /ld#.X(1Y;^FȆ8bx%6̗,y&++c%FK"# b㈗4ld#.X2LVNף(,ލ q1BKV'˕el . ʅzY05є6}PxX/X .X2LVVFD>F,OD)X|LKDe$~&!V 8|# LG#DeKOmzȏK]6~]ƓI/X.+$hkE#\T@,`z1$rlHcqQ0+$hkE#\T@,/+$hkE#\T@,Y&+F(c\H?"((Bdb89r"FTa4&!leEԬD,!`V $l$ az6 lAc12LVVk`ml6 \CY|"Q`5F`|47Id {_')F?ʋ1?X"d8J4I+ccȇė,*,"a%G@bO6 y0xKE2FB2/~V™,V~XVX0?d8J4z625c#FTX9*C"q(i&X0Kċ[624eE  6 hʲ0b4eE$0pa #H1\|`BFTX;F"dax=c`+X?,+XC,XiDUDQ(;)?/Hg,VFQ`~Bc$Gb2'FDO%ĈC1X|UMHp|# LG#DbA)o.ew\>46i4m~ky,<:A)n4߲[K!z-iz-y^Kw>0Rymz-<z-iRpW^Kw۶y?Af^uv nA>aA[/"[K!<e]7uev^E}ֶ^]ݻ<5o^`a >ev^E}֊θM?[/"E\>^KweP]h|4@a.y҇|}SFPh@5l`ц&1ճF@a.y҇|}Sy  u"/:}B針(}0y@ сx`10P>pb> !tΔ>_v혺 i >ay/:}B針(}0f./:}aq^m!?a tT 7tOmg# `Пy 0L>ǷlMahÌ:mHo}`04'^t 0:Pay> :|0eOL6y!?/:}B針(}0:чہ 6aa0ΟqlBeO]0ݳ6чa0/ & n(!yD'^t 0:Pa>m}yn/&n>F F} ;?a tTфl{vϴFbTc-v0/ 20l4`^4 H@a.y҇|}Stm@L8lÏ 0ΟqaJaL]ʹa+Xv)0>P>^t 4g )PaDL7bC^E|1eP]ȇR0n&K0:`Ѳ 1D3 ΟqaJaL:|xδaB jه@x/:}aрlzn.a؂`^ 0bdSXd1Q1 @b >aAdLO!"y҆^E~F桅P1Hᄔi{/:}B針(}0p!@~>>}8y 0 @~v^v0Áj ^vϷn: [05# |R0B Afa[04'ɇ 7.<ߺO0=0h`рXR 򜥻v nAcQ4j3Vn 0mMB &:aO(./"D:tVF)5 Y謌Hъ%IHM$`6 r1x/&12*1*&:a( ^t^+LO!"eOF桉4T1IS yo]y t`{/X(.ٗRоM$̽bȠoM$Rymth/"b v 1/X(.0a&็ۺ'϶цm>`0hO)n켊 L:}70`h0z D[/"S ʹaeP]:рe[?s8a  ^KweP]a h.04``1ta"(]F0@`0hObȠoņ >`8`0A# >>p] )PaDL7bC^E|1eP]ȇR0n&K0:`Ѳ 1D3 F/S@dJ1*&:a( ^t^v.20:aHtAvߑf:a,a@ƁJUJu5O. OOOO7OOOOOOOPm~<^ vnjT1MZoyo]y t`{/X(.ٗRymZ4I[/"E\>^KweP]h|4/X(.P>uiyv^E}֊θM>ev^E}֊θM>-ä\=gO{0Oev^E}֊θ}͚M$)n켊 q|i%)n켊 p7>>}0|oBev^E}֊θ}ç@s >Rɇۺ'϶сx`="ev^E}֊θM?S"n }|m`})n켊 q~>maL>>} 1/X(.P>uit(}naY0wD0/ ObȠo@iթ7>>}0|oB}RymZXy02(.$al<`0@'^KweP]h|ame0ζ~pð x10`J2Ltp.d1eP]^E|u#謌Rj$ Y (0J0ʚHlbȠo@iթ7:ч>amec#:~0yׇal<`0@'^KweP]h|40a&็Z0:~ `0h0ue[?s8a  ' @!nJ(eŗRymZ"fFL2y Δ2(.0L775 &bfjqj1>m~k)n켊 bȠowd1n@ٗRym &]z- /"i4z-ݗAv߂ajFyvev^E~>`0hO/XeP]ayal<`0@'^aȠo퇈n>F>a@?bXyAvߩOfb}|mb`^A0mMB &:aO(./"D:tVF)5 Y謌Hъ%IHM$`6 r1x/& Dpd1Q1 @b [/"20:aHtAvߑf:a,a`Ɠ RTVg*>m}ߺO0=L}L}l}-ݫPp: [f|xδ`w0^3>>0}Mi>X"}7"B` q#Ϗy֌>>f _@ } E!?3u6y#ab?Ϗy֌>>f _@ o0>:~ `f10t`g>>1e'?W`&>au >Rg/h|vame<ߍzهOݷaAs u o0>:~ a} f|xδ`# a6~>yaEvǶy#x 2ocȮ:t_jǑ]@^L+=&0у͞@ lCm0p: [ktl5cȮȏؼy߱Wlz L:a- OVvՋ"0:b\Cm0<^I{y ] 0m<@IÌ:m_3`.aYn @:a0y0dva o:}菟tOdymq瘻`xï0PdF7>> 0#>REF/m(jQ1 }ŗAv Yym!Ԍ1Il7Ed`4lFQ*LG*i#kx1Q`O2%C0Δ/:P/Y=I20:aHtAvߑf:a,a0i3LG*GQx+q_<,b?8wP8oOG`,ǂJ88_Sqx+ Q%^ x'|qWF8S8X`(ATc0倃`%G`' <c0~ q_ς8/MG`< \GqB/HB8' ~XaQs?8#x\#0G #0 ~ 0F &x ~ B4q¿Ba_ t 7 d- mT/Y o&d<0E38pbIU4iCy!0mMB &:aO(./"D:tVF)5 Y謌Hъ%IHM$`6 r1x/*">bc1yҀJx1e!m>Ďd'(eP]aYn >njALhnfߺ@ٗcM&]z>v۶y&I/2y w<Iz>v>0i%f^<@<Ie8mإa K2y <Ie0K!<Iٗf^E|M&]z<lȠoa K̽gmnBi4Xy0qс0A#>fq۴ݳ!4IT,y0`0q۳/"y&I*em>y0`0> H<.F   >:~ 10? | 6`0jFy v04`^4```0h|vame.`0qiR0 eрFpo- L1sOz>v>0i%S ʹ`=v8`0F} >1~)0?z<l}Ma JahzFpa0b`0h0h`уnba ~̽fy6>0i%S ʹ`=v8`0Fy v04`^4```0h 710?f^<@gBi4Xy0qс0A# <Xm 0/ 0004`b蟳/Y@͠va JahzFpa0b`0h0h`шp \`=e0K!<IL26рێ< a2h`сx`с/Dba a3cM&U0Rq}_)n}ͫew\>2[0Oew\>&_ٗRq|i%Kw>Y4/X7S"n }|m`}/X7Se0K&n>F^Kwui}p\h604'z-ia}ٹ)dh0>)n}ͫS"n }|m`}b<ڵ0P>la`^ARq}Z}p\h604'ew\aV>maL>>} 1[0O0O@Oݷat^E|`ПRq}Z}|iÈ02ـ0Ƞo )n}`f@?g<F?vq[0@aymB}RpVn>`0@8^ 02ـ0Ƞo x10`J2Ltp.d1eP]^E|u#謌Rj$ Y (0J0ʚHlb^ M& D>bc1yҀJx1ew\"fFL2y Δ2(.0L775 (`%$M'ͳp]tz-^Kw>̽b}MM$2}z4ݜ}&_ٗ4xi%ٗ 4uIf^Kw>?vq[i%/X@u0:уlb ?/X@u0a&็ۺ'϶цm>`0hO/X@u0P>lL]tOmz L 1/X@no-S0>Av.فx`1/X@no-S"n }|m`}/X@no-Se40wD0/ 0?/X@u0y`0O)n4ۧ0pT,aAv05# g`x ;?x10`J2Ltp.d1eP]^E|u#謌Rj$ Y (0J0ʚHlb^ M"Xd1Q1 @b [ 6Ďd'(eP]aYn >njL1%%JJ6l@\~<^KweP]esl/X@gBi4^Kw>0>mia`^Ax`="^Kw>0i!`2: qF004`}v0?b}Ma L26ч>`0 0 e[?s8a  esljaRymem |/"a֌ H/:>y`0Ob^ L6ҌA0 YymŗAv"H+#,tVFF $h$r0KyN @!nJ(eŗRϠi!"fFL2y Δ2(.0L775 &bRo6 t5welRpW)n46P>ui[H 7g@zΟna)n46P>uli%ٗRϠil|4I.l`0h 7O 2(.~l`0h 7O 2(.~l`0h 7O 2(.}n)0@8`0hç0p@| 6`0O&@\  t}n> |È0@a+@o-a4ـ>)n46P>un [lÈ02ـ0Ƞo ^u0<|aesl(: 4Ls4ه>ame>aAv05# g`x ;>)n46P>ui)ni |ç0f :|/"`0jFyv|^ Q(0c1t!/"(.C7EdbP%0nhATTF`#bhك"Td1Q1 @b [ 6DLO!"y҆^E~F桄 RXTf6l@\~<^Kw)}$;/X!2[K!4IٗR_@ M$"B`0  >z-ܥP>>&]z-ܥ@p]i4R_@ L>x.aa} /X!7>>}0|oBz-ܥP>>`<mF n \`=)n/D>mia`^Ax`="}R_@ ç@s 1v >>} 10/ ObRHO0ahÈ0ȠouR0ζ~pð [K!Xy02(.h`ц` ^u0<|az-ܥP>>ay8 Z04a> H/:>y`0OF/m(jQ1 }ŗAv Yym!Ԍ1Il7Ed`4lFQ*LG*i#k[K!>nahÈ0ȠouR0RHL`FiR0ζ~pð x1 Lc }DL7bΔ2b)n/DH BD +1 gC 4H1ISZNyo]yt6DDSt6DDSt6DDSt6DDS t`{/X.Wm_z w"j(n W2EvŻbm ?b#}( /X.Wli%Kw۽iZ gPRfi8ւ?{Asn>>M?Ev`<0ʹ`\'^Cp]ڵ0y@ɇu0.b]< d  (] 8ï6ПP}+La2aaכhO/X.Wn.:m0f<02.#e7@S6f}F@t}n@al2ـa}.كnF@vay,y`0OEva ^E|ð 0/ &>ч2i`0O(n VahÈ0}M 0 >y`0O(n V@eP];bay,<`0}lç0f ;HL >a fiyه>a "b/l 7# @;0<0WlO(n ۩^u0}M@l/"#||a Oݷa"}lç0f >`wP>;04a "Ba qDç0f0g]4؟B.هOݷa@||v`0hðDa00 Oݷa >a fi>F/m(jQ1 }ŗAv Yym!Ԍ1Il7Ed`4lFQ*LG*i#kta t}n e@f 0}F?vq[.:lAv@fta t}n e@f 0}F?vq[.:lAv@fDPt}laxa10=@`ч`0 2aOao-@|Av@b} "dç0f nf;HL<x}#:}t}ll `b^ TT̉c }DL7bΔ2b(n "fFL2y Δ2(.0L775 (`%$R9Zmٿm`]ty v>y,]6~@~۸z/Y,p^Yng`>[>M?hn-Οnag2t}ny,]6~`>M?Kwa:~ L@w ">чOݷatom?- e20Fcp@n6 < ?vq[#1f ah5$c)ny,=gOݷaੁn1h6/Y,p㺘dt#Oy,bȠo, F Y6IfL06Pa#F(&a#45"Pd1Q1 @b t}n&d`t'2A# tpYsP(pJU4fߺ@-ݐŸFhPAf^Kwy,>}2(. <0}Mv|^ Q(0c1t!/"(.C7EdbP%0nhATTF`ew2εS=bgR@5 ymcRAq^m@& 0] ">1x/&0` )Ld1Q1 @b [aZ"fFL2y Δ2(.0L775 NaF$nV+ͳf^2(.uIx10`J2Ltp.d1eP]^E|u#謌Rj$ Y (0J0ʚHlb^ UL̉3 }DL7bΔ2bv^E}Ďd'(eP]aYn >njcEHfh 7.<ߺO0=RϷs!/XnI//XnBi4̽b}yIz-w|K2[@-M$/Xn]P>>&_[@< e (] 1sOb}P> u0y@m 0P>pbz-w<}p\h604'z-w<t(}na.ۺ'϶сx`=&z-w<em |/"`0jFyv}RϷzem |/"`0jF>у=@í ^u0<|aesܠ|},(\|em |/"`0jF>у=@[0A# g`x ;? )PaDL7bC^E|1eP]ȇR0n&K0:`Ѳ 1D3 )nۼ/way8 `Fp ^P ^u0<|a^Kw>l|}M,00$O:PȠo³0|0cCKJQ* 7.<ߺO0=RvaexfI.̽blM&_f^Kw۶P>>&_ٗRvݸi%/X<"n }|m`}/X<e40wD0/ 0?/X<em |/"a֌ H/:>y`0O[ݺem |/"`0jF>шfh`Ԍ2󭟹0[ݲ7S ʹaeP] H1la2󭟹0bl|P>0(./:}b `(tbȠo,a( [1/"A(|1nO, bΟqf^픻}g}p|i4D}]>>4I~)n?zq`Ԍ<`0@'e>K]6~]0e.vtI>`0hc e[?s8`0OdGl.?s.}`o|È04ag2󭟹0@'#b`e5 ( ]>bȠo, F Y6IfL06Pa#F(&a#45p0b TLtp/:PC/,fǍu20:aHtAvߑf:a,bs fbJTͳp]tt}lew\>46i4ɇMنl`чOݷa0@fb^ L6ҌA0 YymŗAv"H+#,tVFF $h$r0/X6P>>ϰy)n?vq[>8}4ـ0Ƞo ^u0<|a#bh"Td1Q1 @b [ 6}͑3#0P}+)n}[0Oi8m[ݳ!Rо~)n ek^KweP]esle8mw<e; 6^^0O)n۹@z<l}a)n켊 lgm@gC[ݲ7)nۼ돐)nۼ/wz<l}Ma/Yn/DzȠoBv^Kw>l|}M[K!>oRϠil|4)n46P>uoz-y 6}/Y]>>^KweP]h|4/X(.P>uoe">e.vlxAw\x1V`dFC0Δ/:P/Yr&d`t'2A# tpYsPa)14d~*7V7 7.#C#CZcqŤ~`CC\qḇ67 7qł7 ? Qn!7a/q~?7ḇ W6>DG+AwB*?-džwƁBO|/'׋rֱ@5m#ߖ/&0Mo#ߖ=O~[@F' J[ dv ?Ko<q1?2}?q -)nF'KwlOoݿOoֿ߿-#[ku7{#[Oo.wbٿb71?-O-=K?=L#[*1/ObP@/Rkh F'/]1?/"_F'#C_#C僿#C1?O,'^ 6\T%\T%u$eB_FxIˊ]px/ YqP G^qPGIˊXO츨Ož OFˊ\3?lr?c`Gˊ] n\T'a.*p{M Eh+ˊ\> eB.ˊB4[.*.* \T'?\T' h:ˊBKB!\T'LAa6\T'L&Bu2?` 4?`eB,a\T'0ɃlO`]\T'2L:ˊ&&kB??&.*L?.*L?#ɂ\T'0 |#eBoO%By0%eB& qP9OLOxn)ˊ _  qP8xn\T'N ?pxn5ˊ'nBYqPt9qPn?ˊ'72?/ ,OpxB/d!h |#oR|"SRW-_/H: AR!| [)/H| [)/HB B#|G$|W%|[P ?/Jo@No@-/P[*|BoSaoX[ X[/0兾_a兾_`ao?,-兾_`C 兾_`!~X[/兾_`#X[W兾_`,-;/aoQao.^ ?,-ao2^Kao/y?兾_,-,- ,- |/x@^,-oClž_`5l?ž_`aoF /兾_`B ?兾_`- |-O兾_`- |?4,- /Qaoh+w兾_oh ?,- %- 4[[_ohKaoh|Bo |@[X[ž_ߖ |D/?4[X[oh,- 4ߖ[ |@- o |@-  /$|@aohž_#X[W4 ?[ ?ž_o |?/_兾_兾_oĿ,-8S[p兾_/く兾__omaos-8,-8k[p:ž_,-8?ž_X[p!|兾_~X[p/aoB? |/#~X[pž_#/〕-8 O,-8 /〟ao-9~X[r(,-9 ž_!兾_ [r//oʟ_/? |Iž_#_ |Iž_!兾_$/㖿,-9{[r/ao-9?,-9+_oȇao>兾_![r,-9ž_!/B |BO%~X[r/I&|Bw兾_"?7aoa70/¿o`/?ž_Ɂ兾_ɥ-L兾_ɖ& ,-L1&%0m-LMao`[/ïog,-Moa兾_ɑ|&[/[X[| |o`ao`-L#~X[#|兾_ɂG0I0K& |W0M0O&,-?ž_q7兾_qOn+n|?,-ž_y~X[7S[7[/n1n5 o |nX[7k[7~X[7C-/[7Gao@ n!|/ḇ+ 兾_p}' hno ~/Bn|7[7ž_p( /GT-0n _pT-Pn"/$( +/Mn,- |?兾_ÏoM-? |xp~X[8 pcXp ?o_V-K| ~X[8S/ߦ-_-h[8pKok/mao/s,̋|p:p兾_Ä?_ËX[8|p/`-C\-!oB/兾_Àw.?o~p,-兾_Àao ~X[8_/C"/o",7ao/G\- |'.Ÿ(b(b Q@b!1yҏ(dH=Jz D$>M?PJ,GaKw۽iZ gP^R:Aϰy8tw 4gO{0OEۿO!۽i*@@셋*@{<Pq۳(n:}Wl{dG@7> X+=P]Py}n`z @ (tz߁- XݷaѪXxf~ ^ݻ<5o2[/"i4̽bO0i%S/X`E^j vP<.𭗬y0"(]YRymZ(: 4 l)n켊 M$ٗRymZ(: 4Kmz-ݗAvu`fI/ )n eymI)n켊 I/2}S/Xxε".Sf^ݠva Kez<lȠoa K2}Ƞoa KUz<l}Ma KMz>v>0i%̽fy6)}$'Bi4Uf^݊_@ M$ٗ f۹M$Wf^ݏs!4Ix*/Y@͠va K»2[`jYf^KwuiIew\>&^ٗRq}_ٗRϠiIe@vq4Ix̽g`a`xïM$Wf^@luIvi:ٗRϠi!4Ix+esl(: 4fy6)}$'C^݊_@ V)n/D|P)n/D^Kw)}$0i,bRHOi.S/Y@͏i!K/Yn4(esl|Va3f^E||-e8mٗAv< bȠoV)n켊 )ev^E}ּ-ew2̼ ,b}MT>S/X 4lb}MOT)n}T(n 𭗬 4u bXyּ2[< z}Mv>0¦^Kw>0b}RϷr7^Kw>(1{^Kw>(\|,b}v.@P)n;v0–^Kw۷^Kw۶P>>[ݲ@x+e>K]6~] zȏK]6~](evǍ^Kwul|}M`~ z->θ}_f^Kw>ϰy0OM$Wf^Kw)}$'Bi4Uz-ܥM$./X 4٤KŖer"B}Mv.٤K2Ev&^ٗR@:ѤK]zȠo&^ l)n۹@4Ix*/Xn4Ix*/Xn>B٤KŖes v4٤K2[ݳ!4Ix̽bli%̽bl|}͚M$Yf^Kw۶P>BvIe>K]6~]ƓI/2}`oui|TΟq@Sfl:׊y lŃZWk4ی"zdtP^*uޤәP iM9:%OӣbII^i폠iN^ݳ|}RihtVY46t:Jz[?vǨ]};&I@/_³5Ri("zԚ(XY@zԙáP 6"zԚ(j34O[N~k:e9(t0=tºs:.5mo4ΰKPTq@M5QƠCNIISFUu8ՠn .zfΙ"Pj ^Lһ0Ip \yhf7$Ƞmi'I'E=oIp𮷥K𦷢\34𮷡>.ms^' 6u]%O[c)pK5e2M{\|'3YzΟ0YMz&^KweP]a&g&^KweP]퇈z-ݗAvu>x/T)n켊 q~϶"n I2[/"E\>a&MIRq~϶"n Y2[`v}p^)n/D϶"n i2[K!<>x/Sesn϶"n iIRϠi!퇈)n۹MzΒexgCg74)n켊 q}[>x/Y&^Kwuila&fjLb<ڶ}p^VK[[C>/5\<y0MIL)I&^vΟ|g$el5NJSI$)PKi;ela&I4vf/;f^uiS3RNyҀp39'I'Ey>x/h䪒Nx/kT#:.هYtZIv^v>RP\|)3Yy:|xεgہ 7Tٷ@n(g&^v:|p!@~I2<뺅p!@~ꜗMnK[/;gہ 7Re;SUL6yp39%$/;gہ 7h$elp!@~q䪒Najfr8|yU))i*I$'4t`fs=n)XKExPIt8x(EfGL?[&TΟյsI2oHK^4h镼S[TK^):.4QYZ׭,tɯVaIy\ LGQMTJن}:TҲJSˢV4V)N.[0OSG$E_{ճ 4I&%lM?URR]tӥ[CV ijLg`:}[~4:}[8 RNNlM?Ug%T:}[@-֪%3t]*t^̟LII{1uUI*(DgCUTd0SS)tZSU{8rJjkAv@U39MT1u7)y#jTNf5V::.Jf)ͤu]%Qs~6L]'5ǖq UZII:.۪$$Qx|yfuҒԢǖ!lLGQI'ED퟽MfՒt]O(NYmꡩQD .K6x6pK+HKs~)D6n^"ydέOV(u]%QuXItKXlb*v4 4MRNM?d7~ VIS.:Ailܧ5Iq.PʛZSQU$ ^<7MjP%9%H iI3IQq.UZIPҲNv~g$(NA{0O UfQ)NtI{6[5UQ)'E@yOcRMUMTIEe~7$7De~6~g$6jNt mꡩ&t^ä^Ϸo)U I5NAvޤ;X%$<7Vtt\ufiS3I:.:͟)g#:.: 4v iNI:.up=nq#'Lfp@5n׭P/43Op dvM?Ri3MX͟攒Ŝ`9KIeb1v+9SVS_šsPsO¶XiztLVԙ@ a80ViRNqǐ0ՐΉ)'E𲷤:.e9S[t:0\O]i5&xug~ ֓t] kz$pf5&х9MoDp𦷢KQ#~H  kz$х5Z'O׭晳V֭zivi 7Rip !mrJSUrZZIIuW[DKmys}74ԙ&t()'E]j D$Qu)&)gFJxMԚ(v (MhrJIw\-vzI9'I'Ep<͟$Nyc^lL#:.}*frt]@Gu2RNMoD:ᙯMoDtaD𦷙ŎfkS[ã [šg:ᙯMo3Ό&q_ kyPf5:0<)q3 l?k93gY[cL[M-zg;5xY[eNK],z}McG`Y*e9%)!NTr0T$_,}Cx*M5ڮM<W9)u8ڬ9)u2ڬ9*QI'EB> .HiY'EBi6mViZIwP@ Ez#NI:.\@ mVif$軨]r϶6xڬ9$RIwP}͟mViVIwP8'?x+4IEt].fX?w`HY)'EB>f$u Xf|O+4HҊI:.\#M>2}YrF$軨]r3`eڂHIi'EB Ii~ #UDu YwH7I'EB@wH䍤u:|,At,2;H䍦u:|,At ݻYrFZIwP"XXdwf,RN,2@ۼG$tt].gO2B#+4IeTt].dP] 9%+$軨]r;(n9#ZJ;\^6'Er]fҒR8r &;jy.-g$Qw\V10|RJY0] ߬͛贓gPؽٹMTuA}՝RIw\ThfJRIt6>Uӕ +$Y3 O޷7?zj:eo kyS ׅ56u3_šjta5MS[SG\35)檧FTׅ5Lf5PjMo5fu3_šjjšfp𦷚L ky6u3_šf:0~4hf5*ta3F)5'3x}Ԛs4vG\7SrJIw\#ަSt],z4IU$u80Vidu]ͿS)tZSUw\5Rt],M>^ҙI:.t+*QI'Er] +f +$軮Z 5RZIw\HYI'Du:Y5I'ErϷwVI`:iMfRj:.u ۼ39(Nm?LJ,dXdvਖ਼$軮Yo*fr4N@ThڲN叶=g5dKI:.떸 u59*RYw\ 4͟U˺M>gjrTҲYw\l{SS%u<dt3T$(]*fr6N39Ui'ErΞe/LK$db S3Iw\OCLK*c*frXND]Qi'Er>!H*g\(DO5nThjfҢn659M%˺xDSaΞi(],iVIw\ڬRSIeu0,Gfr蔓g`>YiNf$軮Y39Nk)$M%)j:.tQi'Ep39N%$軮X' 44I'Era fpԦI:.떻Y՝6fBpVg j$fBcMEt],]>D)nN>hQw\ dwS*JjVIw\O]:'*($_šita4xp濅5фs, q~ә1fijI)'Eq5i9$$軮1c9%Tt]!欎+$軮1coYiNI:.Yx/Y)MTu,4ՔRIw\b蜒t] XwY9'I'E?a$-;l}YԕRIuICQNͰgCrJG]>:-$qU44IEE?c÷)$|t5$$QS)U%5W|1i%˾~44v $ 7fRJI,]g5$I:.m;7tu2{>یf$t]ǘ)HQi'E߽q g5dI:.VsZFI'E߽[>yuԑt]> Ήѵd~|MI*N.R۬VG(δu2* Ev [I:.AY9M*)$K<Ԥd~y#RSIe~tߩsRN{4 z5e9P<#OQYNk)$<39NVIwfPA{2:(O]?YnSJtYwgP jIi*ΡVmz3T7I'E߽)^g)II'E߽lfi9LjjmϲLS4NMo5:0nY46v }5RNzg$$CYRIt[}LGt] kyHjnVݱ_nIð,}3II)'E@frNNQ4H /cyv9C$5_OcȞ&v𲷤:.8͝aIsKzMc>.isS𦷥(taJOвI3`MTfιYԒ83azM?ZMYQCj ,46jTTҲN͏"zOZR-$ '@T )'Ef<jCf)e𦷥:0x߱O]ړR;l0O%%]M>:vQi(=f(+$gYe#9)i'E>z޴%5Rt] kzQ3F~ f rԚ4vYl5I)Qe\M!֜I:.یna6q֔RT9:I:.5(х(kšޔ6u3_šޔXsOšޔ8taJ-l^iiS[9p𦷢t:↗EoD:VL 5)蚧\PL Mc&8u]%,xSo6gL»Yi`P_ݷC5|Uk6=e7y/T3WEwO6ꆉxUk86CS^` 3wPhf~(}p^SW§ہ 7T*)ੱ>mYB Rl4PVf*}Vf~@ͳ{>L¦}>L!iSs8 L]VkT8Qo6=gm@5ngǷlMga͏nj϶V]3? ݳ6՟mgtL-njnT5c/YtP*D}Zx*e]fcnsK/;fcnUqmj %ୗln: [hfs[/;fg75|*D}ZkxZln: [j*eP]: T8TD T8g<60n:d׊]pw1^q~:%/ӣbI:%/ӣ@u&ZCclTC'IP *=B48t:JziMDI@/_nO]ړLI@/_'9RiCP Rlyv73P вICsOCo>ਖ਼J,͏x/kRdltj϶"n )2[/"g792[/"l0϶"n t/X<>x/Y&^KweP]h|4MzI2[0Og73Rew\>ճ퇈_5NK8qs4el5&LS4L?{0MLII:.ّهjJSI$)XKf}p^ɜ;TI/:4)'Ey<@p8 CJlPҦg$elp!@~պn(ݮ>BTJJ$/;f)fg#:.هGRr$KR9n"n (Σ f1R8$56 jC F@67 p Uil ʳVCf6S6U$9m`r2贇6 0ԐpVa"ػvypTEfula #a1 25d9rLH *IG6qURC͇ n6 `γ_CGX}%^\<,TKҫ3ymmI6vJ(6eP]jg$eAv.TNIIvY n)%Tt]lO0eD*,ʓ5IQ#J6>Co>ਖ਼JQI'Ef(m r/D deDxnpTZIvYG~ݸ*frQ:%$'8u3_5K\׉sS:ᙯzfk4 :ᙯzѣ'*u_g\S[8u3*աItY5´VySGL/ 2:a^T&-8^ZTߊuNaIyxgGl4&6& YSrJK/qμ>Ii, Y.U9))΋ࡖi^ZgM&gQ(@Vq `q 5d7~NII:..quMzfCTj;̇S))MUZrSՔ]ǘ)g$$cRilq `e lP!aꩩ'I'E>#uTԕRI{ǠLGt^족 6ꙜE}fj$Cg~*L$d=>fRIU YN.yItIs3𦷚:0xS[5fkS[3FMo :~kM3S5PiiKxTi:F<>Ӝt^ {!jI)'EEu.M4;裨]rAvu]HU5$$軨]r@x**nN,3vU5#i)$軨]rΟ<] દm5du Yb f jFZIwP"XXdwU5%JIwP"XwIwP>P] દI:.\W(e.GpUSRXN,Ӱ239E<Ӱ^Ρu.M4;賮Z z4ojLԎS[3gFM_\>&;jy.-g$Qw\V10|RJY0] ߬7)i'ErΡV {!f5Rt]aUig)$軮* lHk4JRIt6>U +$Q3 O޷:d߂Vty+x(EfGL?[X^󡳮F ky  kyS ׅ5  kyC ? kyg\35)3\35)3g\35)3G\35( :Rct;sX%$軮YoS):Jj=tUTԕRIw\0SU5#:.떻~S账cYj$軮Y}`MRIw\ݽg5eJ)$軮Y+EzkJt]-~ZIw\HYҒNI:.u7zL$u> ޳Me$u]H k:-%&gPS3-$軮Y}TI:.@Gm NN6g#J)$軮Y<?LF$軮XcrU%u\|ZJ],M>gmi*Yw\lM%M+%u:}ǵ6UI,Y #Y%T],@S3Ւt],}vਖ਼ګI:.t,Ax*frY$u <^ NN}*frYU$u@AS3t],P&brI:.a-> TԎ*g\(DO5n9I'Er;vլ椦],p6񶠩4JK.ⶁMO:z֔Qi,Y54gہǍYI:.aYT9)'Er}fҜRIw\7u*frRIvAYJSՒt]3SNfrJIw\O]i+3IiΒNѩM5t]-vw4ͫ$軮Yоr-$軮Yо4rSQDu0OEzYjhYi%%3]-ʒt],yv dwS*Jf贓"z eILکI:.ay/g2;%3g)$軮X֞v iRSZI:.u @y fƕt],}6(efҚ-$軮XHlP53JIw\>BgCTt],yu~k3igRIw\McEUMJMY'ErP=q[DZI{nYRT*Uw\mͫ*&N8jΟqflܨII:.}iʊ'I'E6 k傇\a1jŘinrJIw\bAviŏs@;U$u,jm9VIw\bަJtZIw\bMz7)şNRIw\bR-z^'cYjLq3(燶y#*rJIwlzrNNx{a,D~9I*ٱ_n)#:.mPS贓ϴ-%5Rt]AO))ާ)*QI'E<=rd|Gp6~9IQe_C.kgLyTygL»կ[t;9i(u]%h xNo4:f~d(u}744v j]> 2~I)'Eк}BYVi'$$O"l{YRIwY6=(d4dB'YEByNSU)'Eо?z$3t] Agi)*QI-3] kyф5vI(v $ 7VZII5]إ>5t]vne9)5e5W~}?zN{80USRQE~u56Y)'E߽q5#S-<(<Uiѵd~|-$!]5#ZIwgZyNGJSUwP"d-p$~B ӔҢN{z*JiVIwg2;%4ZIwgO:%$HRRIt(uAY5t]mI$( @}JjfrZIwd'7)d:,Ulzv4Jj$QwgPͶ=@U)nN{R:LS4N{uifVSUwd/o}frVt] kyф7d'IMSoYt\x39'I'Eߺ5%Tt]b?S3d_šsHinVݱ_nIð,}9$e#:I:.GjQ#$O]ړL "rV`I ]>"zԚfv𲷙K.mo"tӥ[æVayٛ9Oن~Zg`R 0Ok%$_U֡It4U[dΰKͭVtֵy&-q3>/3K<,EgOj$tɿ +yIt6%b+:~׭Leo5aItךxiRiP)[0OJcJSˢV4V99%)e+fi3)N.V4&G` 4fqI%)e𦷚Ό&} (Tk(vIl7I%*(qUfà~6e5R]liiʊVIvO]i+5ʊ3cȞy#RT7Daz4 ֤.a;YZJ,gYk5HN|mP"?z·%:-$gXckJIu8͠@٩4,vYl5I)Qe\M!ԜI:.یna6qg ʇ'I'E𦷢IQ[)p濊+z$ 5Sջ^J34O[#G\65Tfz$l뉯eoD:.\<ٗRymICC3PȠoPYymN!mAv. /"n 3(}?uR'e[y꨷VkT8M?vet/yƓI*gl~ ymNU4*D}Z(.ZY֪+O@0:C$Ya׳#MCMxz-CP S0OԙeI@/_K4ǘwRe^i폠i(Z?w&I^О+;&^Vݱ_nI3gCY4XtVDݩ4HtRx&I@/_KձO]ړLáP вIáP 6"zԚg&t:Jz'葳fy)5 aIz$3<޳o*MEfu F!n8iT#!Cqaܚ1̘fH5cY5FC[ @8Qd5$#!Cq`dH1f5 $!cT#!Cq`dH1n1 QTj7qŁ 10pc!Ʀ#!CqbBbb@̖ j2Yqkap7Xb2&$ l ƣ!M5FC[ ÒP ƣ!Vj7qŇ#  ƣ!NH5FC[ Ñj7  ƣ!fQd5p8,9#!ⳜQd5p8,9% l3QƳQd5p8, 6$1fQd5p8,9% l3#0!VjH5FC[ ÒP ؚp7 ԃQd5p8,8F`B25Րj7qŁ Án1cYj7qŁ p7 aƳZAb2d8 D D1frAb2d8 DFd!ƴJK2M{\|PάgOy֬a&R/X(.}p^/X(.YMzLbȠo՟lx/Srer"Cg7괙z-ܥa llx/Y%-HKC3O^v>SRdu$/;gO>SS3RNdta򚦔I.ktu]%]9;ela&ILQ&^v̼gPҦg$el5 *frNN}p^: [U$}p^!n9#:.هYtZIv^v>RPLtKB ֒elyu B 9/3GX}%]Eӟ[/;gہ 7Rd;SUL6yp39%$/;gہ 7h$elp!@~qꚒUI'Ey0K539VIv^v>RCo>ਖ਼J,c69hpTtJIuO[ (u]%+DzEN5l Y:׭6uE|RnæMBs(?tkt*tizgMSŮ 4I(v 4M'$_5GX}%\+@ 4?RcJj<8^UCrZK/5e5Wa$$IU$z\35S[8u]%U[Itkp dvM?Refv yQY%%8^UCrZK/iURՔEAvnL/:ᙯUNK .kUΰK.f'XfuNp=nm#'fsip=nmC*͜:.&xV >S[3fXizΛ*M5Dy Yǘ)NII:.@VCwrrJIuTmzk&tYCY? +yC>.S5Hfx,yu~jM5vY_I)'E𦷙g\35)mc 7Mo3ffkS[ڧF6kšf:ᙯZ'O׭摣V֭zi*vi 7Ril !mrJSUrZVIIuW[%Kmyo}748v E>frJIrZIi'I-3] kyфͥDIn`Xt Vf$ua׫3stt].quORiL 2L$5Wd=iʙNSVSUw` :号toIh U$(mgځ U$$CgdynNJ$Cc@ӏ^g#:/vPyLSN3N5Rt^졳?tZrI:.z}r/n4N.yItIs3𦷚&QSPфWNZԙ)U8u]%\<*M5:F<>9$^nf$"Pb&ktQ.kUi)'EB떺?z9'I'EB떺a窴䪒N,lӑdu Y)iPVEu Y)@ZrI:.\X}9L$u Y>VE$u X/ 9PҲN,o:2}U#FՒt].a2AU%RZIwPgRF|dNJu:}7nUiStt].dx*m%$u Yb aZr6N,̱3vVu Es̱а 9,RN,2@ۼZrY:I:.\b aZrYU$u Y+2B#*du Y`eg$rIU_y`B]Ԛj(v g\bkI)9En6fr8rNMo5 ME<]pwcԚf;jy.-g$Qw\V10|RJY0] ߬5)i'ErΡV {!5Rt]aT3t]y$5J)$iCd_šfta3Ix ~CM(EgO޷fΙ[B+2:ae5Mo4p𦷚ip𦷚s:ᙯMo4ta4Mo::ᙯMo4:0bP@uޤP Ύcn䔓dGݽL$)XUiU$u80UiNߩ:-)Xw}jfrI:.ay/UJg)$軮Y޳t],ТgEeCJ:.떂?z΋J-$軮Y۬JI)'ErΠfViIgہi$RIw\z4MY)5du:Gm Qi'Erζg%JIw\,2;nTjtt],@39QI'Er̠y`u*fr4mY'Erޫ'%RZIw\[IU˺ilVZJ],:i?U˺>cڬUI,Y #Y%T],@S3Ւt],}vਖ਼ګI:.t,Ax*frY$u <^ NN}*frYU$u@AS3t],P&brI:.a-> Zr8RNp?պ3r8rNvYҒTRSUw\ڂ-)RYwPl:yYiM%˺޳59M#J:.}|xUJi,f]LSt],VfjN!S3沒N ҝ&쎘?Y9)EuT:,cȞ4VjSNtt]-vj)NnNNSLڲN} YjSQ%u0VjQ)'Er>Q^T䦡I:.떀UJfRS9Er cR%$軮YO7SNNMo4:0IS[ k30OԙejŘi$Ś4VNN>1J$軮1g\CUdu,}걩NI:.Yx/Uj$軮1gYrNq `IRJjYde9QD5Wu,J]?S)ʆ]/j9*,Qw\b1!iYf%T]ʓP%<ǘwSRNym*q9%$=}LðMWXSRzȏfYwYǘ)-*)%|v RNNzϞESIU$|m*fr8T7qʙt]rNN~ÊNJ$&8h4l}SRN~rrNN~H[hvI:.*LpSl9S*}MJG]}t{cn(v (ĤNIIwآSJjbLK%%|y*Yi,슧 88It)P?{^8p~tI#x)fqi%)eن~I#MTJن~8rIJtYu)rF9?B&0͝rRIJUv=aVTPⲚ.6u 4M)**iY'EfǑ=wXiRTUeaDݳʒ%$ BhRTS[GFX+O crJJ,gY|tfQi(=f%#:.}@4tZIvϞǷRSU)'E𦷢S:ᙯMoDtaDm.Ig`MUf3YrIJ,i fQet]>l7rtt] kz$хOšމ:039Jp濊+z$ 5O[#\65&ٙšޓх&+zN\F𦷤:ᙯzޓP뉯eoI:.\<l)n켊 q}ZgaTC̠iO iغ(+E)}p^ہ 7T𥗬o=U).}S~Z">ͭPU|YRymZ4IT43?-TO=f^E~ VkT8YRymZ(: 4J} P7U# uz-ݗAvu`fI*gx.AS3qmj )ॗAv߰2P@0:CLׂYa׳#UCMxz4t:Jz*ui6t:Jz aG<M*^i폠iM#GCklTs6t:Jz+BzԚit:Jz[?vǨ]};&t:% ϴIgCO'Il(B'*M5^OcȞ&I@/_B&F·I@/_txR-zΙSKieni3>/:,xY[PK΋.fVaIyeUNK.f*:.4xY[XKҋX}%^\<,HKҋ:.4ienKiTΰKt\/:,xUS>/3K$Ĥj2(.&T(T䔓}|xU59'I'E/vGU59*SSd>jN@gj($>wO6jr*y۱(23t58:|wkySS5ERv>zRIq&lT\l1[)d<@r -$OX<WjRNyGTԦTNnvq3K$?fϰPmT3K(6G?cn)X$}( 7SSII'E@}JmwO6jr$Bn6gahJtYv_vi ?gۂ?{- oGt^ۨl)n):-$'fsjqU=nmc'͜: zdEWZ\39cGX}%]d3O Yku:fixVĎ5l Y:׭LļU[Itkp dvM?RcjŞlN%$1g<ꜜŚbT%5e9u+e~׭撇MQ$Q<URNqǐ0Ր%$,t8p-eo3ΰKkN~0uDaZL`Q՜u/Y5$_šg(u3_šg:ᙯMo3:0ļ)\35)ã h?{^:eo ]j׭I 7Ri҇`Y ov@~SRgI:I:.y3>/:^t)u.&oRiCM*,P7S3RNt9E𦷚ʝMc^xMԚk;uæjYY%$軮YYʒUI'Ep<6~Tdu> 39NI:.y#RSU)'E𦷚ɝp𦷚Md)θfkS[jMiS[î:`[ڇLv')UK^2m6 ڪJtZIwP}yUJIwP@zUe3t].fX?w>UYiRI:.\_AtYiPҲN,o:Hѵdu Xf|b PUeKI:.\jHO}UeI:.\3vVZJu Et ݻUt].gOe.GpUem5du Yb f u Es̱а I)'EB@b f NN,XXdwVZK*u ErXXdwVZKVIwPvPRfrIIUul][IU$CؽT:-$軮Y*v/d7~U)MTuA}՚JJg)$軮* lHk5i*QI'EMVj*VIuR?zi:d߂Vty+xV̎~S:dׅ5$u3_šj,u3_šj(u3_šjPf5Hf%n&8h Ύcn䔓dGݽL$)XUeNy*8kye9NJjf'Du:YnIgہjk)$軮X=b쎚@SYNB#LJ(g[}S3%$軮Yx*fr5:I:.@~ (fP<:396coSTt]-q4%TJK.ayS-%u}iNJVK.tMk4%URK.y.-g$IUu:P>pTm5du (]*fr6N<^ I)'Er2g%gCƟ@ UI'Er!}Tdu0ػu39N} OCVZGJIw\"ptYhjiҢn6SQ),GE6<)i(],iVIw\ڬ7)NEtdw#39NtJIw\AY3Tt], @~ 5t]LJVfӔ5ddtڒZIw\y1II%$YrIY%$I3 ONlyu&T;|*e9%)笈(ji)%|y+4*)%|v i'$$UF䪒Nz϶39VIujM#`?aT䔓ֳIY'I'E?afUI'EΤIcNѱfJIw5bfNN~H[hvIY*NiE:>~6ÕKI)Uw9$qUt{cnH(xv^I9%$솳IY'I'E?bNJ)Pyu3I,]q `ҜZK."攎+#3>/5摯"t&R[jSk"yk󙣦fw}`ړNjD<=YԒt]*f$|äY@9I:.u9d|϶ [jSNx{h>PYԦRNx{h Vs5)޳RI:.퟽nj?YԨiY'E<= g3RI:.]j׭暧LyTy3kL٦yItKkxNo:*tP<#.&oRicM#TBY謒t] Ad(ugEd$BYVtMk:+%Tt]VtMl?zΊN}y謧EBy謦RN}2~RIt.qYܩE$Qu)CFp ~ퟻNfD~>9%$Qwb.zk)$ rRjjn2~ԒSUwg` Qi'E߽q N+%JIwg\bIwbϞbN)#J)$:}JHѵd~|U%]ؤ=}+YiN{:r8Rp$)ng#)$]fTRIwbZy/YԦd~y#RSIe~tߩsRN{4 zkJs5I'EРyGΟqgCRIwkyfr&̠e)tQi'E߽'`~M)N%)e߽Bc.۰?YIMD.`yЇjLԦI:.H39LJI:.;e֫4Ք&_ml-3J$NgFM/=tVvM4;>sRNzg$$CYi*u+$M3 O6luԚi l{z4䔓D~39'I'EMTjv.iy? +z$It4ҟYZ׭3GL𶷤:.4&kVt歯[i2oޓPK^OVtӥ[s:eo +zNX}%]59iRjLSUaN$:,%lM?5kI$:,%lM>i5dE_OfiRkjV4)N.B&F0͝r I)QC64S8K͝BM?Z$daDaR-$ '@T )'Ef<kI*5IN.+O:vIY(YvϞ ։-#:.}@3T贓=coZM)MT_šޓ8u3_]R;j6a#rJTYd>Hk5TY)'Eq>3z҉J'I'E=oJ&ukS[ҊQ[҆fs_(lf\35O[҇VM#>.pi}z- /"i4hf~)y,< U[2[/"J)eP]: T8X׊ ejK]n0ّT^)uޤʛ:%: 4I8t:Jz _aG<PtNl}MԘٳP ~LC'IGC{Ulz۳?RiCP MTit:Jz+t"zԚj:%(DIh()t.ku:039ԙE,I)'E$C7U'%Tt^lHjqY'Er^:u2]P:LSU)'Ec퇥 @Mg)$轞@'*QI'E@h3u QOV,u]%qs4kaߩ2EyY)'E~7x*dܓ`{S&Қ^yUIMT_,z7~ƨvz*dܒ^Ǡ)y2nSVSU{ qL$$6,^RcJt 7$5W 7))!$ n=VI:.b<7/1N<ꛒRN'I'EUQY*5SIHNSF:-$轠n5Rt^̠D~39L$ZʔRI{ q jfrd_³Y.nicV >S[3fh0[CMx[qμ>uS:SkUcfh@|U,橳>.SrǑ=wXiVUS(:5$_B'O׭$tկ[ӉzE.}MԘ<:L$5W)uY[LKΆ9OL֠虽I(v E>frJIrZt9EMn4lQaҲJIw\-vz4YʒUI'Ep<6~Tdu> 39NI:.y#RSU)'E𦷙θfkS[҇F45Lf5PfMo5p𦷚θfkVo5:f~+`}S3贓Ӣu39MT(lUrNjMiRIU YrTYi'D_U6u]%\,D[Ί2<)CgF*EKkIEQG:)$^ngCrJIuc]r zNtQ.kUY)'EB떺?z9'I'EB떺a窬䪒N,lળdu Y)iPUEu Y)@VrI:.\X}9L$u Y>UE$u X/ 9PҲN,o:2}Ug#FՒt].a2AUg%RZIwPgRF|dJu:}7nUYStt].dx*m%$u Yb aVr6N,̱3vUu Es̱а 9,RN,2@ۼVrY:I:.\b aVrYU$u Y+2B#*du Y`eg$rIU_y`B]Ԛt8v g\bR8r RfrJQw\LFVIw\ۂg#j$軮Y̱ਖ਼dt],,Ax*frY:I:.t՜I:.>2y fr%$軮XW!n%3$軮X' 4 j)YI'Er7Տ]UՒt],کJje=g` NTRK.RNNzϞESg$Nz϶39VIuI'Gn39%$5$|6RIuLG`?acVII:.@;d$|(M%Tt]TjE:>~6ÕY)%#@uZrJG]}t{cn͝>~LJo;lԒt]CSkI:I:.TrUIMU?b@;Id0SM%˾~Ȫ$qYUuS[It׭P~ @:@uYOȞ@|:Zʝ34OǛԙcg`Q'lGpUedUed$|äY@겲UI'E<=c.VVGt]>#.n+)i'E<= i [j$燶 nVVS9I'E<=VVTNx{gqeeCJ:.퐎l겲I:.]j׭撧LyTy3kH٤gX}%^. ?tk:f~(u}71Ŏ4Q AfOާRNt,β>d$BYVtMjqY*"l{dP68_pdqYNI:.'Sj$?a'Sg)$O ߩr9Eˆݳ|}Re;I'$.RXUUdI:.m;7tu2{>یV5%"zԚjv𲷙aIy\~*DK^2 4[gfn.tiM3jH,M?YNII:.y4u]%.m?V6It4TΟֽo52kk*u]%iykVt歯[dΙ7eo5:.ךXΟty3V𲷚:.5I%lM>+5$:,%lM?5k5R]aZYY%)eن~YcMTJن~Xܒ:a,=Ri6vIlTܒ83azM?Ye5R]liڒt]lyu~ dEVZIvO]ͭP}EvǵKCoa CॗAv߰2P3(`u8Ya׳#4&R۽IXtT4&Q#P R := ԙCGCt{cn,t:Jz?vIHt-BzԘgC0luԘ٣P MTi*t:Jz+t"zԚsXtRx&:%.VǑ=wjM4͝^>M3I^>yv5CP 𦷢\39]oCGX}%\,It f*ItY5´Vy934+Dz4Ι5l Y:׭PiLItkp dvM?Rd;Ձ<Ŝ`ZK/iTJjs(e~׭6tߩRiJ qǐ0՜y*䔓q 5d7~RNO >SkRgL/ 39NI:.y#RSU)'E𦷝:ᙯMo:(u3_št  ky3 Ҟ:`[fΙdO >Ro9:eo lykg3^*:aIs?],z}Ns;̇S))MUZrSՔ]ǘ)g$$cRi3Uǘ)II:/vPϵnII{϶,2SRI{ǠLGt^족 6ꙜE}fj$Cg~*3t]U*QI*!a9TYi'D_UItIs3𦷚FΌ&HфSH?uTsN):.f04ҙJ4NRNv/d7~I)%$,u Av/RctQ.kU9)'EB떺?z9'I'EB떺a窜䪒N,lsdu Y)iPSEu Y)@NrI:.\X}9L$u Y>SE$u X/ 9PҲN,o:2}T#FՒt].a2AT%RZIwPgRF|dJu:}7nU9Stt].dx*m%$u Yb aNr6N,̱3vSu Es̱а 9,RN,2@ۼNrY:I:.\b aNrYU$u Y+2B#*du Y`eg$rIU_u`B]ԚiPιh.qY%#(ڬҜfǷ4X Y #YRUEq[<dt3UI*gPv/d7~I9NI:.u ] ߬NSU)'EqPkf}T7)5!5*QI'EMVi +$޷Y#MTΟnp+x(EfGL?[&O[Lfup=n'Lfuu3_=z&r^NS9I'ErΟvZt],ТVRT4h.ʋ-$軮Y۪I:%$軮Y JIgہ$I:.X#Rj:.u ۼ39(Nm?LJ,dXdvਖ਼$軮Yo*fr4N@ThڲN叶=S9%RZIw\[IU˺ilTRJ],:i?U˺>cڨUI,Y #Y%T],@S3Ւt],}vਖ਼ګI:.t,Ax*frY$u <^ NN}*frYU$u@AS3t],P&brI:.a-> Nr8RNp?պ5#)$軮ZnڵY)M*))YmmAUQ),GE6<ꨤIer͏oYrSHҲNn6g44ZIw\̎Dzg)ΉI:.v+9)$u CwPg)e$iՔ5ddtf:(yꙜEt],yu~ g%4I'Era gIikU iVIw\}+:')N} +:Q)'Er>Q^MCtt]-4Ҕ$ry#RSTN"z eILt]O]䔓jnIIwb mUCUI'EI&u<T䔎*}M$*44IXQ<;y/URN~j'I'E?bNJ)Pyu3I,]q `Ie*NGW_5KQotN7޷4l|Wk"yk:fix7wf l=1`Q'lGpTJIwlzii'I'E<=P"?zZJ$燶lz۩qY'E<=M3I5Ra:SZIJUv=aRTPⲚ.6u 4fQSJ:.6yv5CQFϞ 4+5RQe>z4k5IE˶|f59VIvϞGS:-$gXcfJIu8͠@٩4P نk3II)Qe\M!7*,RN'۽} fʇ'I'E=o5Mq5O[U 𦷚 ~U&,j$'S3tt^ @fUI'EPϴUiVI{852E5WL)iS3JI{XaC7SrI:/g2;9*QI'EP ƣ*fvf𶷙K/3s𲷙GX}%\3O z[}439Ry `7s"rW«YGٵPׂ^E~ë@0:C-ॗ@U Y֪LٯRe:%: 4ITtNlyu&5CP R := 7RcFI@/_>2·I@/_'IHtBc.ݝ-CP MTsLtVDݩ4htRx&fI@/_KձO]ړMEI@/_B&gCsOS[CfVPItMs)cȞ4+Rixug~ jRNk:eo ]j׭鴽"Z>Ln`Y ov@~SRMIIu,ͦu]%CkRP]Lޤ;ҢΟEu39%$KASi:Ii~&7RilQa5dZ:fNNyg?S*IU$uǘRGt]40T:-$軮 eIMT_¶GLyCgY[Δ:eo lykggJxaIsou2jӚ`Y*e9%)!NTr0T$_,}Cx*M:$vj0U3rJI{6}uLܓe mXenJ$Cc@ӏ^g#:/vPyLSN3N5Rt^졳?tLܦrNjҥ/nQe]V󙳬>.gMo9f5C ~"tR׭撧LOVIC>.i9RiJ4fJIx.iRNB]Ԛi&v GP宂=T)'EB떺?znIIwP宁ynJ$軨]r>I nGt].g`!BULܧEu Y)@LܦRN,jRIwP`@zU3rt].c*PҲN,o:HO}U3r4mY'EB,>LܕIi'EB Ii~ nJu:}7nU3rT$u Y+f nFRIwP>y Tj:.\2@ۼL܍u Es̱а nK$u Es̱3vS7%u:| TeTt].dP] fdu Y`eg$rIU_y`B]Ԛi;賮Z z$䔎ojIi9I'E9u͏oRiUAvGL)n9$y.-g$UErΡ^ng4:-$軮Y*v/d7~RI:.늃[0iIL$uA@v g:JRIt6>Uԕ +$޷X&"[*25Hfsp=nqC'Pfu:ᙯ@z(rpTmUu:y 39,RNe/LK'I'Er·> 39,N叠B c:.(aOvfr9Eu0@ nGJIw\"ptYI9I'Er;vժ4gہǍMNSID+htjrJ-%u6=g5e4+$軮YmmVs7)NEtdw#39NtJIw\AYrRIw\7u*frRIvAY9NVIvGL褧Et]=S3RN"zOYYM9Iw\CYiM5t]-vwiIM3j:.a/fR-$軮YоN%$軮Yк} +i)nN>fLJJg(Z2;%5N+$軮X'@Ti'Eq[DݳʒRt],M>^ dwS*JfRIw\K<RRIw\U̱4JkVIw\ءG՚Yi'ErCbO!NS9Duj-iRS8jN"zOfŔt],p:mXU3rSVIw\,\aꡩQ%t^~ۻVj':J],:g5Jd8AYJTQ$u>iIQD$:|iL`5G\b4Q9%$軮1f 4TNIIw\b۹ D䪒Nu5PԎ+$軮1coU tZIw\bMzJSU)'Eq?zrNq `J))1gqE])tL*VSUw\b̾m䨲UEq<D.frIQu*LhJ>y1RNym*iY%$=}Lj`EL$5W|EmT%5d0SMNTRK.$|dN *Sl9SKI)UwJG]}t{cnƍ>~LJo;i9%$솦tt](䪒~wS4Ie?g` ZK."H8VgX}%^k5P?{^U3M(EPD)׭4t?{n>{ReU;>x{g2;RNx{cEUMI:I:.HSRUI'E<=c.U5#:.mPUMJtZIwmgBꩩMT|Aq:3t]?{SRt]?{~ +$燶B;Et] u^YSMYkیURJ'IMU߽y*(N{:jJ,θT7#S-<(<TҒ4mY'E߽<=TtIwbUZG(δu2* Ev [I:.ASJJiQI'E߽]i`M4 dwS*Ji,Ο39NtJIwf!y/UVjN@󬏝> 9)e$~~g)j:./fPqҚEt] vRJS˿{:VǨ]}`~RSQ%{:Xm!ڪƥ5 Iw`JGWfRIwa.U&_ml-3J$5Bzԙd5O=Vt\x39'I'EߺRIt[}LGt]4luԙjcoURN$_£5Ri3$O]ړN "rL_OcȞ&%,jgX}%^g5?"tӥ[[Oن~׭i35O:~4&a'$_U:.5?V4It4?uzj:dׅTKTׅ[^2oju]%ͯ5S?tkVgLeo5hu]%^jJMSgQMTJن}:VjIJtYtJن~jj$:,%lM>fJS˯ყճ 4I` 4f%)etY@z4l *JTP⫰͇A 4fjrIvXi3JJVIvO]i+5RYi'EfǑ=wlGu2nI:.6yPYl%:,>yv4pQM> ѩ%%]M>:v4ZJ,gYk3KHN|mP"?z*JtZIvϞǷJSU)'Eh6f73&3fR$CYIQet]>l7ͥ*$_ͨu𲷙GX}%\kzuہ'n vnSYzǘCػu (nha:b43? gf֨qE2:% P+;&6htBc.ݝ6t:JziM%I@/_nO]ړN^O"rM#P RlyvL(XY@z5CP 6"zԚf:%I#SDQػu&g[3:cQh6کH3G6 Òb@d5Vr ƣ͇$Āj2$G# 3G6 14: j9l7&f70fCa"ػvypTl97 p UiG6 Òb@d5Vjr9䘐 FUNl2㊪#Al gEkz*u]%S[c>/5W5އKɮf陥Z&GL?ktɯ `b0yׇֽn5NK\<3#i&lV,gꚒJK/qμ>f^,b))΋ࡖi^P~I@ a80U:I)'E8jnT9$_H@|׭gL/ /:]S~KAw3z*pJ:} 䔓.UZIKL_\6M::yal5Y9%$軮Y9'I'Ep<͟$Nyc^lL#:.}*frt]@Gu2RNMo:,u3_¶GLy3]UR׭3gL[M-zsXoUIt8tṙک4d=uʙNIJjzӕ2XeI'I'E>#uNUI'Ez39VI{4frt]tNg)e @tRIvCVsNTUEBsRTYi'D_UC>.gb'OU-ziLì>.i M$΢QGp䒒t^ {!TRNPb&8'EB떺 St].kAttt].kAzJ$軨]r>I IVIwP}@ mU:JtZIwP}yT)u8ڪtRIwP`@zU:JRIwP叠B t +$軨]r6mIQeu Y WttJIwP4([jIu>@⇛jIu8'?vڪtVIwP8'?x*$I:.\,ST%JIwP叠}+T#Su ϒ?S(u ϒ4'@N4mY'EB,>NU%u Xf|5$iO*$I:.\3vS7I'EB@wFRIwP>y T#i$軨]rΟ<]7nU:HګI:.\W<] t%$軨]r\,At ݻT%u:| T%RIwP"C,At,2;KVIwPvPrS9I'EqPkg CYnTN9*VIu+EhHn7R+:~gL0nL=np |J\>Lð'::台yRNv2cET%Tt],T#:.떻~S账cYj$軮Y}`TrN>겒t],ТVVT4h.J-$軮Y۩Ĥt],nNRIgہMe$u]H jqY)5du:Gm Qi'Erζg%JIw\,2;nTjtt],@39QI'Er̠y`u*fr4mY'Erު%%RZIw\[U˺ilTVJ],:i?U˺>cڨUI,Y #Y%T],@S3Ւt],}vਖ਼ګI:.t,Ax*frY$u <^ NN}*frYU$u@AS3t],P&brI:.a-> N8RNp?պ7#)$軮ZnڵZTRSUw\ڂ+)RYwPl:yQYM%˺޳4+$軮YmmVsI:.aYT9)'Er}g5e9dnT96<>ҝ&쎘?YEt]=S3RN"zOYrskrj)$軮Z!fUCfՒt],_n Ά5ZIw\}gCr%$軮Yк} +t9)nN>f%3I))h@T8cȞy#RS7Eulyv dwS*JfJIw\ 4{2y fҙ%$軮XW!n g RIw\O]iԜqe$u4V=tUNSVIw\,\aRJ-$`w\Ԥ9T4a?YI:.@ a:}EJIw\nNNMn\39 4I Q 4SZII:.Y.M?T֒tt]yuMi*ŝq TJGt]Ƿ贓ş퇈PԦRN~U9L$u,U*QIMUq>یL*(Ő>Ke9PҲeػmVg%E.Y $-1v3L$9RcT:G" CJIw"ͰMNII:._aG<(lU(䔦#m]q `ʊIe=c÷Qi'I'E=g"IU$|m*fr8P7qʙt]$|59*Tg`?acrII:.@;$$|(MNJ$01GQNͰM'$qU?cnR8ӣ@u&4(xv^-$|$|*e9*A $RYwǘ)+%˾~ȪhԎ+#ksJaIyi/t7޷4p饼Wk"ykt?{n>{Refv| dwUJII:.]UJIIwl:@ު%Tt]6=BTqY'E<= 2~79%$OP<#ꛜ]> <ΟiMJ$Ȭ ~79VIt/~2~79NI:.'SsJIt/~æOަ)]> ?t7~*QI-3]|~LD~>੥dYE߽XaꦴYI'E߽m`fnSVSUwgqQ:JjT%ZIwg\CU%$1U)#S-<(<UC4mY'E߽<=-$!]Qi'E߽ie9U)MUB8@S3Ôt] .ҢN{zJSHҲN{t*mINk)$<39NVIwfPA{2:(O]?Sf:,E~u PnMIi*ΡVmzR$zۥ#3I)$ZӔ&_ml-3J$5BzԘ٣MSoSj)'Enj=S3tt]U$@ػqY'ENVݱ_nI;ަ֒RN$_£5Ri_O'ID "rM#$VǑ=wjM4%,梧X}%^gQ_"tӥ[CgLkM?kQcPߋ?fiMC`R 0Oj-$_U$u]%.*jgX}%\+Vtֵy&-ΰK/5R?yk4&,hIt6-b+:~׭iSV𲷙gX}%]5i_ *M5huDiӥfhܒ蕳 4լR]aZVrJS˯ყճ 4Ig` 4f$E_eL0͝rR]l:Xi58K͝BM?YrTTҲN͏"zOY5**N͏"z eIPt]lΡVU9P٪JtYu~~Ǒ=wjM3J6|iAYJIIEl0ONJ-%]5qY'E>z϶(N贓=coY5)4q@˳RiUg f$EIs4H䨲I:.یna6qjNNzj:kY[GX}%\K/Xxε".ۨhf~@ vꆊxZ<Av.CJ'ॗAv߰2PLC\a2k^i1(t:Jz _aG>LP ~Lh(ZY1^èUlz۳?Rcj^gjH(.kh534+Dz92ku[CUiaIyxgGl4&MCMX͟sRYxuSŚbU45e9u2M?k*tߩRiC@ a80V$q 5d7~+$_H@|׭GL/ Ro9t׭3Gg5`}S3贓Ӣu39MT(lhrS9I'EOY)RIU YrI:$*ì>.gMo4:ᙯNZŎN)*u]%\<Ԛi$u" ڭJtZIwP}yZJIwP@zV%3t].fX?w>URI:.\_AtPҲN,o:Hѵdu Xf|b PV$KI:.\jHO}V$I:.\3vhrJu Et ݻZt].gOe.GpV$m5du Yb f 䍪u Es̱а I)'EB@b f NN,XXdwhrK*u ErXXdwhrKVIwPvPL`Ntu`u7$u">e9'IMUrǮ9%Tt],Zdu]ͿS)tZSUw\5Rt],M>^RIw\ݽVE$u Et(U +$軮Z 걩Qeu4uXܓRN@ު$I:.}NNI`:iMN'%&gPS3-$軮Y}TI:.@Gm NN6g#J)$軮Y<?LF$軮Xc3rU%u\|Q),Y}D䪋IeræyQ9*iY,Y6=UT˺b :`Ku*nUErΔ39MY'Er n gO2g%JIw\̱ਖ਼d$軮Y!g%RIw\_At39,qY'Er "i.LG(fBZRt],<8rNvSg%4gہǍTNSID+ht󧪢rJ-%u6=fҚFt],p64Ji,f]LSt],VsNSI:.@?LSI:.c+95ddtjtQi'Ep39N%$軮X' 4֔ӝ$u]5QI'Era 7z+)mY'Er>IMDt],_lyYIMEt],]>:+)nN>gCQw\ dwS*JjVIw\O]2y fLt],}SJg RIw\O]iZS8Nn_m*䨔Ւt],1I:.Y3r8ŏ=S9)i'Eq?w7%5Rt]Jg)$軮1g` 9*QIMUq>یL*(Ő>Ke9PҲeػmVg%E.Y $-1v3L$9ReDXꢲJIw"ͰTZII:._aG<(&QS))MU=dG@U3IMY,U˾zLJo;ꡩ'I'E=g"$Nz϶39VIuIL7qʙt]E$|Qi*TG`?acꨬt] XwUtt]BCQi*¤ƨu<TRJG]>jrJG]}t{cn;|v CRJIw TZIIwآSJjbLK%%|y*rYi,슦#⫯gX}%^ko( ~nh&"t:h׊dO >R-zѳfw}`ړX $@ 7$|Ǯ:I:.Hѹ*ٱ_nNx{gdx-ѹNI:.lH]BMJIwm>7)ަʔRIwlf&6&!t,U]> !@󬏪NNt,+:}ǵUi*"l{dP6UqY'EоM7I'E߽)^g)II'E߽lM)MYMU߽ۍ[fZIujY1jl{zNII:."zԚiv𲷚aIy]DTNo5:eo ]?fi^E<\0OԚj*v 4f%$*桳>.iuUo5:.Q?"[ѳMx[[X}%^f~"5mzf2of:.י^"-zf:eo +yPK'IhSUaN$EDifiY%)e+fi3KI)N.V4&jV4JS˯вIð&L3g\j)QC64ʊVSU%fΡaVTTҲN͏"zOYI:.6 CrJJ,gY|tfQi(=f%#:.}@qINI:.>Jj$ f rԚjvYl5$.}i+*,RN'۽} fNNzju𲷚ΰKKzǘCغ(*^E~ë@0:C+s/X`EU Y֪MS~ fqO^̎~5EN5\>M4:% q~NCt{c@;46t:Jz aG>M5:% _g53P ZEg`~U3P *=B44t:JziLCO'IC5&()tϰyRTHҫAv.h5t]TIVIv^?g\J$~/:J(~϶<8mJ~;TDRIv^?a眩ʉV\35S[It5enX}%^\<,4u]%iUUNK *ew\4ITSg`4ymZ)'Ey@nS3tt] 6}SRUIQ#JmeZʓQI'EyAv.h3j:.ʔIiQ#Jن~%(ҝ] v>jg%N}rQEt]|vU39(I:.3/X4ITS`22(.S3RN@nS3tt]>ꪒUIQ#JػuRIv^?cS3&mY'Exr*Q%e)y֞ng*QDe}Yng*P$eiv(Eg*&NenngX}%^\<,KҫΰK *eS/Xwu!}FJ;VelȠoLII:.u폠in%T4?vq[u5t]b֊ʓ6폰yNTKJUv^v45I)Ef 6U39(Ւt]n(폷pZEJIv^v9S3I'E2i!}FJ;*ȠoLII:.}MLIIv^?clU%D*/b֊ʓQI'ExLTdeuʛ5*Q%e)y֞ng*QDe}Yng*P$eiv(Eg*&N/D5enGX}%^\2x|P<.IΡÀfXf6 1Rf51qFaeY3p k Qea4$$ cPd5Xl7Ic[maj3 Fc`garL8 ܘf7X6FauTl8aal2 kab2Ic[m`Аj5!ʼn 1fLXl7jAÀfX4$Fq`r3; FUf5CnQeSr ƶ0ap2X4$A f4 ƶ0 j 1%2Qf7 Ƀ NH3p kÁh2X6 RAua̘eY ka3 7 Fcak dģ!Ň#2ag9c[maj3 7X ɉl9 5$l8a`l7 9 5r_jaIzUs4UngX}%]9fy`Ae>>v]*L[3:c[sa8$51l9l5U1l94 1ʪH3p Û`7c`gY ka3l8 FD:H3p Û ⪩ ka3lL2 Ck ÒbBagEl8ca͆al2dAua1!0ʴ41l9l5V C!Ň$Ą*$l8ca͉0h13dAua1!0ʳJH3p Û`7c`g`d2XrLHL2Qic[saj2$Ñf7 IՇ$Ą*dl8ca͇!Ȑr3;!ÒbBaVH3p Û P!n8dAua1!0ʳU5f56qŇ# n6I UNZKXItNkʝaIsSgen>.js]e23/XԙeїlȠoLII:.6)}$6uScn%%T4Sd(uV5t]m~ d}U*LڲNMa~P<#9R-$/xGvBYUiʔQ)'Ex;vβ>ӕ(nNM@BYXԕIIQ#J6>i*frQ5t]l}M֠E&]l}M vƤiEҢM=gہ'n QU$e>>vuPⲚSgۂ]UʔYd5SYEx9S3g(NK( ksp濊ksaIzMs^V aIzUs48ItW3OD>I:ٙ3l2&!101pH5j1"kAn 0γf5dMb`6X6 ÂBai kaȚl2d8 jUnqc>.3?VaIt/XwuIG[3:c[ "k f1R ƶDVr ƶD֒ ƶD%f1r_, Yz۽IJ2f^E}֪frJIv^>}'IQ#J۽jg*Ntt]{\|VTJUv^>NNh.ۭ4}#439)Et]{@vu*qi(Ңcn]NRSJ.۽rg%SUi'ExwufRUDt]VHItKEo4:VHItx[[%K *}z;vP>&Gfu ƶɆV ; aRf5fL2l86 RAuY3r3&X6 9cqĐpV ƶɆV ; 2AuU$ n 2;DӚG[3:c[Fd+"@h * ka̘e`dHpdk9c[Fd+"@h1i%,9aIt湙Ne@۩4C)5YznݙymZ)'Eznݝjg$$/@۱7YRTHҫݻ!}qfRj)$/@۱C !攩3j:.;vػuZIv^۷c@pTJ(n4ۭAYr SJ.;v<|39'C:.yS>/Iklg5U[kaIz$VG\39ztٙ(uW𲷝:.&x@|:fixY[ΆΰK\.gb'OU-zk:e:xΰKkIrgQ(#LJ՚䔓] ߬%$_!6\^YSN:-taΊ)'EB떺?zΊ:I:.\ =YY*u8'?x+:+#:.\RmΊtZIwP}yYYMTu Y>gEe3t].fX?w>U(u@AYYPҲN,o:y n謍u Es̱а Ίdt].dy n謖NN,XXdwgEdI:.\W(e.GpVtVKVIwPvPUrd_(m#M(EgO޷Ǝ[´VdtT^73pw4H Ύcn䔓dGݽL$)XVtVJ$軮Yǘ)8kye9NJj ޳ZMe$u]H k5VIw\Xdvਖ਼Et],o*frQdu B#LFI'Er}S3t],vPg#FՒt],}4%RZIw\[VJ],M>g4Ւ-%u}i%M+%u:}ǵjUT˺b :`Ku*nUErΔ39MY'Er n gO2g%JIw\̱ਖ਼d$軮Y!g%RIw\_At39,qY'Er "i.LG(fBYYU)'ErθPΟjf9I'Er;vլͥ)E%5Wu> Q^MCtt]-J%)IILu@Gu2duDݳʒ-$軮+cȞy#RS6RNiv eILI:.)u5gPtb ֔dui @}ZQIMet],}6(dҊg(c\|cRTt],yu~kJ,fjǮSVIw\,\a4*$Nwu4IΒWuv:Jd8AZ&II:.}iNNiu3`P4&t;:arII:.Y.M?Y䓤ŏs@;rJ$軮1g\CY9VIw\b޳M9NI:.Yx/YjSU)'Eq?z%3t]0Sfm)RJjYde9QD5Wu,J]?S)ʆ]/j9*,Qw\b1!iYf%T]"4ԡJ>y1L䒒t]Ȭl9Y9%$?}M4͝jz2]D} S4Ւ˾zyf$Nz϶39VIujME:>~w)'E?af$|I:.u&t|4I)'E?`Ոug$$|(f䪒NjM5 E:>~6Õ)UwRIH⫯44IG`z5I:I:.TrUIMU?b@;Id0SfYi,슳PԎ+#TKy@:@zj:dߊQ@:@y٨oMS[CL/Cc퇵&O 9$|ǮP䓤t (f*ٱ_nP+$燶}G]BfNI:.lH]BfMT|Aq:9)޳PE$|9*VIwlwgYrTYi'EP˭Z8tɿ mg)UK^Ιwu^W[TK ^fO:Z:f~d(u}74ՙ&!t,fI)'Eк}BYVfI:I:. ȬfIU$y>c"O޳4rGt] ̟fhEByJIt/~æO޳4rS9I'Eк}~nfR9Eˇoݳ|}Ri(O4)&{v՝I5t]vne9)5e5W~}?zEt]ǘ)QE~u5s%$1YNN{|:t]> 34mY'E߽<=%%RZI%߽C"uHt]֞nSR]#!Ku399I'E߽+4JiQI'E߽]i`fiiM#J:.Gu2I:.S3D~iJs5I'EРyGΟqf%9to:MY'E߽A:SS3N{!=tNfrJS˿{:VǨ]}`~TԦKIU~u I)'Enj=S3tt]RJ$-@~g#:.u ~PvvM5McoYt]ަg$$iL`I ?cȞ&K%(DI5}[Dݩ5(l /moD:.8Wމ:.旚jY[5NK暾*EgOk^5moE:.45b+:~V׭gL𲷢aIskD,EgO:Z+xY[JaItעҤPSUaNR]aI)N.[0OZ(`lM?Rj(&%lM?Z(nIJtYu)GFL烦B&f0͝rM)%*(qUfà~MIQCj ,44daDaQ)QUt]lyv dwS*J蔓3gu JRS˯MoD:0f Z}o'IðQFϞ 4+DI)(=fiӵjE˶|fMiVIvϞGYjSN|=hRI:.58u3_šކ:0<8͠@٩5 L نkD)Qe\M!Y)'Eq>3zRIu)jF5? kzL (tEoCFCIކ:V4 5)h U#&It95Ŗe8mnM$*۶y5C9qmj la3f^E|M&U ¶^E|j:xAvߴVf~Z">ͭP5<ٗf^E|M&U ~(.CT)«YGٵ&oŖe0 6y&I*gljYT}MAu3?njL¤6BfI*K¤6Bf$Mqmj 2}}Ma J4 xZ&V>0 4V>0Uk86Cg<,a3b"By&I*gQK!<8"Ch*D}Zx Yb"By&I*g? _@  <*D}Z<Y f۹M$s!YGٵM#^ ,q۱y&I*g?nCT3J -gf֨q4̽fy6۶y&I*gTݳ!O vAu3?kT8TȠouhfZq:'fZqEgiDsk2ks:ᙯ:aIu\<)Pf'4u3_UfΰKW3O`z fga3me* £Fn 33Py3}$0TG]pT0=7x* 0Xx:A+ Xݷa33?gP23me* ]n0ّQcMxz,(iLP R := ԘGCt{cn:% _gICP ZEg`~ӚC{Ulz۳?RicP MTj:%~Ǒ=wjM5ft:Jz)ui>x/U$)n켊 p퇈5&^Kwui>x/Ud)n}Mz/X>x/U)n/Dla&NIRϠi>x/Y&^Kw>0϶"n s/XnCg7:IRva luila&fz-iճ퇈2[`jMzY/mngX}%^j8x2a(S4L?{0MLII:.ّهjrJSI$)4u]%]E<}p^*vf/;f^uiS3RNyҀp39'I'Ey>x/h䪒Nx/kU)#:.هYtZIv^v>R<5R$Ky>P\|(lfgV^vΟ0YB )2m?gہ 7Yɗ)y>PL"zy>P%S[ItQu+elp!@~Lð55Yy4giS3RN}?vjLIIv^vϷn!nI:.هYNaTZSU$Iu G7b8aMRcIl9l Fc!̓AcYs`6$9nj!̓ql7VpH5d9ca:HsaȐ8URC #*΋Hs`p3 IhiY/(݋`ᇑ7ILfgQh6ګHr9n6!ʳVC͇$Āj2tsap7UU$9p2 `f :-%,PKҫΰK *x C7Av߰fT҇`4f^E}֪frJIvYbRNN͠DQػu59*d/y5IVTHҫ͏yNTJUvYG~ 7LJRI:.6>Co)}$0T +$,# dXwP>;g%(N͏.uU:ᙯSgX}%^j.kUaIuT\SkYCfh@|Ǝe<,gX}%]5̧?:"zOIë8^ZrJIu)mS6  ky4ta3jxVy+xVRVo4J ]h4X !mrJSUrZ7$$+ì>/:^i-]j ԚsHJ:} 䔓.f'I-3]ptZIwfi:RNݔ6y{gRS9I'EOYRTUEBfJ-$ΰKK?uTyCSyItMs44P%DxQ)%$bCw5RNB]Ԛi;裨]rAvԒRN-t  ~ZNN-t UZI:.\,X}IRI:.\_AtZdu YtxU*,u<@ZNI:.\@ mUjI3Tt].gbԑt].aF|dRF$軨]r3`eڂRJu φ4?VQ)'EBtnԒ$軨]r]7nUjHJI:.\2B#*$m5du Yb f IUi'EB@b aZY$u Y+e.x*$tt].gO2B#*$I:.\W(e.GpUjIc:.\NH.N{: 44v g\bg$ojQI9I'E9u͏oRiUAvGL)n9$y.-g$UErΡ^nft],`YRN>ꜤrN @;DQiRI:.j4iY'EJ+@:@y3M(EgO޷k2Vdt5Mo4:ᙯAz,r^+)gOzΆJ)$軮Y+EzΆCJ:.떂?z·%Et],iI)'ErΠfVi$RIw\4I5t],vGM )7%&gPS3-$軮Y}TI:.@Gm NN6g#J)$軮Y<?LF$軮Xce$KI:.떸 uXQ),Y}cUEaOrJVK.tMj*Yw\AvGL)n9%MJYҁۂg#i$軮Y@S3Vt],XTII:.@y 39,$u:40T䲪I:.> .g%+$軮XM>۩t],Z}*$qTu:B':~AukHI:.떁۶gD4gہǍV9)RYwPl:yX䦒Ier͏oYdu> Q^6I:.떀U3I))h@T8cȞy#RS7Eulyv dwS*JfJIw\ 4{rIu)6u3`L4&X Q 4UJII:.Y.M?URtt]yuU)*ŝq VRGt]ǷtZIw\bMzRN~F3t]0SgDJ))1gqE])tL*VSUw\b̾m䨲UEq<D.frIQu*LpJ>y1)$|+<TJIuz := ԘG`EL$5W|EmT%5d0SV9*)%|v $|< IU$|m*fr86v LII:. jqI'I'E?aN)%Tt]T4l}SRN~rNN~H[hvI:.*LqcGrR8 7S䔎*44I&v ()'E?d58EL%T](<JK.80UcYi,슧dqUMnpItR(H[$7P?ziLKMS[*34ǛԚi&v| dwf$ViRIIwl:@޳JUI'E<=c.f$qY'E<= <Οig:IU$y>c"O޳$qY'EоÒJI,]UJI϶Ӱ3wO7S)I)iNJ'IMU߽y*$I:.jQd~u*5:I:.R@;HҊI:.ΟqNRF$燵ITtIwbfN{:r8Rp$)ng#)$]NRSJI:.RO;9SHҲN{539N-$DsVSJtYwgP sZSQ%{:Xm!ڬ9MCtt]=mґfrt]v˭Vti5e5W~Bn6gng)Ui'EEg`~Ӛ`޳%$frNNt5FNB]fr8Pg g`~Ӛ`Xcs9$e#:I:.GjP_O'I "r73$VǑ=wjM5;KY[cgX}%^gX犫yIt4fp䒔`lM?Rj%3MTJن~I)%)e.a,=RiH *rJTP⫰͇A 4fQCj ,4LԨdaDa8I:.6:vXZJ,gYk3dl>یD~kJtZIvϞǷ')S[*ph6fIC&3f%$EIs44I:.یna6q։'*$_šމ:0JxS[%N ~(葳EoDp_'3&'C>.rkew\>ըhf~(.u3?@5n 4PO ?vq[7T&RyMh.AU'K퇈Q_>Ps–^-M@>ꩯ gf֨p )nM>i4hf~'aCT)v^e^Z">ͭPѿVew\>&U 2[0OPP:AϰyVkT8T߂^E~ë@0:CV)nfm,U):x+m={2:aCj2kN}Ԛi*t:Jz: 4ICt{c@;4(*}4(Z?w& ^О+;&gI@/_Pg g`~RgCY4tVDݩ4PtRx&I@/_KձO]ړQ$·I@/_B&:% }o'I3GCzމ陧zjtt𲷢X}%^\<]PΡsa8$5JAs`j3r ƣi j9nj j9n6 @6 ƣ1 f2cQ̀|n3 Ϊ3l513cQ͆ck㑕Vf56 RAuS_(?yktɿ:~P?{^LJ'O:ZfΙ[N 4[a2gakI)'EMnGX}%\ށ#i:~LVO9),uS!@ꙩMYMUti'I'EtoIU$ht}nϠy)CC1cbkQc`j3)c[  ƣ+FCf5dl3Xp79&$ AuT kaؚÁe`d7UU$l3Xp79%d8aʳ ƶ8FV CrL2Vt9%S[It4x[[ItQs4kGl4`(hZAg?T$Ag;uQdel<|39(jtt] 4PԔ4I z4IX8//"U39%$/ 6U39'I'ExinVJ*$iUxn7*ME$e>39RfՒt]*R-$/Kδu39R%$/6z>u39R$/N;B(39Q4t]x*fri$'$u3_5aIy\\@oY@&5CCQd5p8,7U)qkap7Xl7&l3& F`B2r F!n8`g`n1 kIqkap7X lCq0p39qkap7X l6FCb@eU$#!Cq`dH1lL2f1qkap7X3%hH35VAb2d8 2[1cSr F!n85c"k1cU#!Cqa5c"k1cS F!n8dk1cY n1 l2Cp8 n1 l2IC[ f1 n1 l2"AsY n1 l2IC[ ÁFU F!n85fH6&3 5 n1 l2C9% k5d#!Cq`dH1d9d3f#!Cq`dH13 pf1֐j7qŁ a0cYj7qŁ Ñ0f1` }p^!nƓ:ٙ՗:՟lx/ZIRymZ퇈NLbȠo@ia&T/X(.P>un϶"n ԙz-ia&U/X7g7nLbRHla&V/X!퇈9&^Kw>a&fz-<>x/YLb}a lBM'#:.هYtZIv^v>RP\|XfgV^vΟ0YB )2m?gہ 7Yɗ)y>PL"zy>P%S[8u]%\ѯ^vϷnʤvf/;fl5 *frJIv^vϷn: [:I:.B -UI'Ey0K539VIv^v>R<$KR9n"n +3G6AcT9pH5k9lդ6mU$9n6 @6 1f6l3:Il513HsaeYila : +%,աItW3O +uS:.4i4݃6zʨvJ,}Av.Ut\6>jg$$l}M`uVUIQ#J}2(.S3&Nf(m rΟo-S3&mY'Eϳd-] 4UNTKJUsإZyI:.}>XgS3)'EϳfwbPfrQ3Tt] [pțʪu32$AʩH6 fr 0eZHr2 RKY[lKҫXݷa&UcMTuAv.Ut]mqꪲNN͞@T䪒N͝?vq[u+$軬uEu2(.S3JIwY7UMg)*$iUf4TCtf}MLTQ$u>frIwY|vU39QETt]lM>+U JVSI4]u]%ms^)͚:.4͝aIy\׉sgfkY#>/3UnΰK\<3#i-CMX͟sRYxuSŚbUijsWջ^X3K5ΰK\׉sθfk8(mVI#=o4tvf~'VI3>.kQYkyh陥[,4o9:oթ58uq 5g` #RJIt8YԒt]"y^FΙ^yމ,v𲷢JaIt2`.gMo3iL<)m#"tR׭橣SyItMs446u"I #RQEu Y)5%JIwP叠}+YjFI'EB%i~ #R4N,3>HO}Vij:.\a5%RZIwPgRF|dHԕQ)'EBtn5%MIwP"n5#i)$軨]rΟ<] 5#i$軨]rΟ<]7nViVt].dy YjK$u Es̱3vf,$u Y а #RYU$u Y+2B#+4Ic:.\NH.N{: 4Xιh.5i$p}|xUp$_nl{zLڇ`MW\R10|䒒. #YIUu: {!%:-$軮Y*v/d7~T䦪RN>f3t]y$5ʔRIt6>UCJ:.QZ[EN7?zj镼+EfGL?[t:d%7\>M4;sX%$軮YoS):Jj=tUFNy+4HNߩ:-)Xw}jfrI:.ay/YrS9I'ErΟvJRIw\WBCJ:.떂?z%Et],ftJIw\ՙdI:.}fii&N.5II$軮Y,2;nT䢋I:.u@39(RN!awg#Sd ਖ਼ҊI:.e;S3j:.>FKI:.떸 u%TJK.ay%TZK.4͟I*iY,Y6=I*Yw\AvGL)n9%MJYҁۂg#i$軮Y@S3Vt],XTII:.@y 39,$u:40T䲪I:.> .g%+$軮XM>۩t],Z}+4HI:.u„NtV5g#)$軮ZnڵiQIMUrϷoj tQ),GE6Ǖj(fB(YNSP$u@}ⲙQw\ dwS*JjVIw\O]rIYRsiUrë~IiQ5Vt],@Vt+DJ$gG%:-$軮1ga&g9j$軮1gYiL$u,YE%5Wu,n2~2R@.CJjYbYZJ1g萴۬I3T.TsX%<ǘwYԒt]Ȭl9Yܒt]Nlyu&;|*e9%)笈(ji)%|y+9TRK.椓VsZJ$nAS3d_֩4'Gn39%$5nIIwqYܕRIu34p4l}YԒt] XwYԓ>nJ$fӤ΢?gag$*}MtJIH⫯44I5NE?c÷ԒRN~k9tt](䪒~wS4Ie?g` tIe?dU'#⫯eo:PKy_"t&R[ΊSk"yk󡣦fw}`ړND<=YԒt]*Ά$|äY@:I:.u:d|϶ [jSNx{h>PYԦRNx{h Vt5)޳RI:.퟽nj?YԨiY'E<= gCRI:.]j׭档M[kc"O޳LԎ+$?g?z3Rt] O޳LԦRN}2~f3t] Agi*QI-3]|vICg`I?{@pVtk(Kl=`}Uk)$ rRjjn2~SUwg` #RQE~u5FI:.ViIwbϞbVNFRIwgt+9j:.gEdKI:$HzWn9E~uqT5Wu+HRLGRIwd/ f4.^MIM#J:.Gu2I:.S3D~ijN@󬏝> 59to:MY'E߽A:SS3N{!=tNfN%)e߽Bc.۰?Y9MD.`yЇjQIMCtt]=mґfrt]v˭Vj&_ml-3J$7BzԚi;>I)'Enj=S3tt]贕RIt[}LGt]6luԚjL l{zJI)'E@frNNQ4 /cyvYC$4(v'Ig`I kzM#>/3t𲷤u]%/9ޓIt4O"[ғ:dׅ)C>/3Kғ?ykæMY[҉aIskg<,EgO:Z&l镼,5Kkf45(SUaN֒R]aR]aZ$E_OfiRjV4R] kzMS L׃B&;j6u%dWaiiJVSU%fΡag%EM+$ ' 4ՕYi'EfǑ=wlGu2nI:.6yPZQIP٪JtYu)5)4 Z}o'I3G`=fiV.a;ZNQi(=f&+$gYe#՜Ell{zjj$ f rԚ6vYl5ӒR$CYNTYdmO{08J+*$_šޔ8t`fsEoD:(qVNg\39މu3M kz& L_މu]%&x ٗRϠiOݷa4IT43?:-Bn =f[y*~)<޴b蠩xRa&MCxe*D}Z^+/X@fI*gQ 6P5B ]qz s«YGٵ2i8mM$VkT87? vi:J} P[“lQo gf֨p^Y4xi%P*D}Z~ lvi: P: [,M?T+qmj TȠouhfZq4D T8j+m={2:aCI2k.}ԘI@/_NM?Rc^i1^i폠iM*^ݳ|}Ri3P ZEg`~ӡP *=B4lt+>U&I@/_nO]ړLGC4Ht}[Dݩ48t:Jz0P4:% }o'I·I@/_&p陧zf:e:x53>/55(݋`ᇑ7IΣ̓ql7Vs`l9&$CQf#IeT!!n8Hr9dtZK C7Av߰fTSG`4f^E}֪frJIvYbY:I:.6DbZIU$e!}>>ⲢF]l}U%IWeDx@pT(c69b"CLJPҲN͏͠nII:.}@nS3tt\6>ϰynJ*$iUϳf^E}֪frRIs# dYme*frͫ$lv ~aJIiQ#J}O7S3Yi'Eϳgal}frQ:%$lӰPLJ&jN0 vypTζfuD`6U)2:Af IFC ֪I|-o-3mLm3MTuAv.Ut]mqnrNN͞@T䪒N͝?vq[u+$軬uEu2(.S3JIwY7StRTHҫ͘iۂ 9R)ef3wGuII:.6}Ec=@֪fr$軬ن} V8i('͚:ᙯzdCkXItkp dvM?RcjŞlSŜ`$^,bՔEi^S:oTg Dy Yǘ)-$@ a!SRNO >Sk83K´O >S[fq? +yItMs)cȞ4+Rixug~ gRNMo5p𦷚ƎfkVy+xVRVo9vs5)unә,;?S))MU]jNNsXKΆלZf&iQgOt\֠洓."mu&;uæjZrJIw\-vzZrNNyg?S*IU$uǘRGt]40T:-$軮 eIMT_šfu3_¶GLypD*kT+xVc^U[UK[u2jU3,z2]*e9MYMUy*frNN>!&mW` t^존 j,2VZII{϶,2VZJ$Cc@ӏ^g#:/vPyLSN3N5Rt^졳?tYiL$d=>fr/nUIQe]VVX}%]%NZLj:.f&΢QG5I)'EYt]|X\^QcN:-taꬴt].kAI:I:.\ =UI:.\Ry-#:.\RmEu Y)@YiMTu Y>VZS9I'EBeqU(u@AU +$軨]r6mN,Xy+et].d > ڪI3Tt].gbMVZJ,u@Wn-#Su ϒ?VZFRIwPgi~ VIwPg.VZJu φ4?VZJu:}7nUeI:.\W@ۼYiII'EBtXXdwVZFVIwP>y nHګI:.\W<] Idt].dy nId$軨]rΟ(e.GpUeI:.\W(e.GpUedu Y`eg$rIU_y`B]Ԛf;賮Z zEoj4@u͏oRiUAvGL)n9$y.-g$UErΡ^nfhԧEu:X.fJj$軮* l>ҜrN @;D4nTN +$)EhHo4tɿP+x(EfGL?[X^P  ky  kyфOšjLf58u3_g\>Lr`Ntu`u7$u">e9'IMUrǮ-%Tt],Udu]ͿS)tZSUw\5Rt],M>^ Jg)$軮Y޳MIRI:.@Q^MYPҲN堻޳MiQeu4uI:%$軮Y JI3Tt],p7zE$I:.X#j+%&gPS3-$軮Y}TI:.@Gm NN6g#J)$軮Y<?LF$軮XcrU%u\|ZJ],M>gqi*Yw\lN-%M+%u:}ǵ8UI,Y #Y%T],@S3Ւt],}vਖ਼ګI:.t,Ax*frY$u <^ NN}*frYU$u@AS3t],P&brI:.a-> YiU)'ErθPΟjf9I'Er;vլӤ],p6񶠩ť4JK.ⶁMO:zQi,Y5g)iY'ErϷojVK-$軮YWAfGp"=S3Du;s5I'Erਖ਼sYI'Elx}fҝ&쎘?YrSI:.뇞tY)'ErǑ=wXiSNtt]-vfӔQI'Era 7zJrfՒt],_n ٩MDt],_lyY7)RN} Тfl䦡I:.떀UԔ$ry#RSTN"z eILt]O]VSYeui 1'%Tt]!qY'Eql{z5)i'Eq?w7pܦRN~ԔRIw\b~LJo;4RN~k4tt](䪒~wS4Ie?g` ZK-%|VidqU𲷚KaIy4P?{^G7P?zsH9D)׭934ǛԚsI<$|Ǯ$|äY@9J$燶lz۬9VIwlls贓ϴ-sRNx{h VsrNx{gzs(x*VIwlwgYrI:.]j׭Ι7m*kæg]j׭GgC+JaIz4槊]?tkΙY d}DM:&v j]> 2~'$BY d}YrNNt,+:}ǵ'%Tt]VtMl?zΓdB'Yrt] O޳5Rt] 9L$BY)*QI-3]|?vI4D~>ZII5]إ>5t]vne9)5e5W~}?ziID)0SVZJ(θ%$1Sjtt]إ瘀wSt]> )ѵd~|$KI:$HzWn9E~uqT5Wu+HRLGRIwd/ )iQI'E߽]i`gD4+$ʒK-$LSt]٤H^v sRSI:.β>t+:))e$~~g)j:./fPqҚEt] v:R]*=B j$QwgPͶ=@UiJjnS3$ö]jNrՔ] eiU_O]N5O=gEd:I:.sRJ$-@~g#:.u ~PvvM:;޳JIvP"?zT}M3K%,t"zԚf;K(.isx?uzމ:dׅXKH߅[^F7eoD:.עF,EgO:ZL镼,蒇X}%]5~T:jV4ҴII%)e+fiZ$蕳 4բKI)N.V4&;DiDI)N.seLð&L3g\I)QC64eE+)3gPO3t]lyu~ *J3cȞy#RT7DayvJg`=fiVg )(=fiӵŤQe>z3Z$+$gYe#7)i'E>z޴JI:.5'3 f rԚL نk3$.}fJ,fCgi:J'I'E𦷤Sջ^:fix͝r4+zMcEoJ$u3MVgX}%\]z-<ICC3A 6y5B-UWG 6o=L@f~(>mm/ ]qz SQ,U)D60nʝ2k.}ԙEI@/_NM?RcI^i1ƍ^i폠iXt,~ퟻHt-Bzԙd·I@/_a*=B2ƎI@/_³5RiSP [yvӢC4Xt}[Dݩ46t:Jz0P4Ht.iGcȞ&:%6l陧zi,tt𦷡îM#>.z97mnK955fK湯Vu]%Ms4UnX}%]d3O Yku&t#u:dׅ1g<^QC'CGX}%^if 4ITV,grJK/qμ>Ii, Y.T5))΋ࡖi^4lR4J qǐ0՜y*䔓q 5d7~)'ER')y3K´O >S[,i#>.SrǑ=wXiVPxug~ j-$_B'O׭ͦtկ[P"Z>LlB睂P䔦.SjI:I:.NKmsf2Zf&6lJ:} 䔓.M$%rDIG`Xt ViRNyk՚g$$u6~TI:.0=y2+$軮i`tZIw\-ʒI:.l?k󡳦gY[Ά[¶Z׊y҇X}%\Ou2jӤ!TrJSUvC֜5e5Wq `:I:.Xw@TtLq `RNݔ6@[tt^졳< U'%Tt^족 iǯS3d(l}Mg)i'EqDfrI:/vPퟺ 9L$d=>gIʔRJX}ΔZI%Uo:$u]%\,D[#LOVHItMs443i#rJIx.sJII:.B,u Av/Ri'EB떺 Tt].kAtt].kAzNJ$軨]r>I 9VIwP}@ mUItZIwP}yU')u8ڪRIwP`@zUIʔRIwP叠B +$軨]r6m9Qeu Y WtJIwP4([jNIu>@⇛jNIu8'?vڪVIwP8'?x*䢋I:.\,SU'%JIwP叠}+U'#Su ϒ?T(u ϒ4'@Rr4mY'EB,>RrU%u Xf|5$iO*䪉I:.\3vT7I'EB@wNFRIwP>y U'#i$軨]rΟ<]7nUIګI:.\W<] ઓ%$軨]r\,At ݻU'%u:| U'%RIwP"C,At,2;NKVIwPvPrI:.늃[<fJ)$ifCJ:.h$tɿH+x(EfGL?[P^Jg\35O[8u3_θ}ԙE>nII:.D}rN]TRIw\0ST+$軮ZmNSҚ7wfg)fi59L$u:}%J)$軮Y+EzRT4h.eEt],NI:.u7zI)&jNnYI&N.5JII$軮Y,2;nT䢋I:.u@39(RN!awg#Sd ਖ਼ҊI:.e;S3j:.>PIi'Er!n%%u0ORJ],:i?SJISJerΟiM)%URK.y.-g$IUu:P>pTm5du (]*fr6N<^ I)'Er2g%gCƟ@ UI'Er!}Tdu0ػu39N} OCT*g\(DO5nHԎhjRTRSUw\ڂQ),GE64jhYi%%3]-ʒt],yv dwS*Jf贓"z eILکI:.ay/g2;%3g)$軮X֞v ҚRIw\U̱5))iY'ErCbP!Vj))N叴 CYrI:.>[5)5I'ErǑ=wXiVPqe$u4V=tURrSVIw\,\aQ%t^~ۻVf':J],:g3TUi'Erq 5gO4II:.}ѹQD$u3a+0OԘG`5G\b4Pܒt]P]~tt]yuPܕRIw\bθdu,}jrt]}p^JIw\bަ)Ŝy*q)RJjYde9QD5Wu,J]?S)ʆ]/j9*,Qw\b1!iYf%T]ʓ*J>y1)'E<6Õ4rII:._aG<4v TrJSUwYP6LSVK.80TҒYwX`M+$$UU)*LGt]5Rehv LII:. jh䓤⦎IU$_z4l}SF䔓j7$$1DmhRIuaReS:t|m*䔎*}MZI)Uui폠iXQ<;y/SJ)'E?d54rIIwآSJjbLK%%|y*iI,]EUSdqUMnX}%^k[( ~nLP[lD)׭X陥"~x{g2;$|Ǯ$$燶 BGUVI:.u8!u uUiNI:.lH]BUZSU)'E<=\tpҙI:.퟽ҥt]?{~*VIwlwgUVZIu*e֭zcLyTu3? VnV7enGX}%^.n~~׭͜:f~(u}72;5D.q?z9$BY d}Sg$$BYVtMjlRIwY6=(dl+$?g?z9)i'Eоdl䦪RN}2~6rS9I'Eк}~nVJTZg(qlTG`I?{@pUU$YE߽XanI϶Ӱ3wO7S)I)SrQ:JjU'%ZIwg\CUIEt]$Kg1t]> 7#FՒt]ڪrJK{Evnr9E~uqT5Wu+HRLGRIwd/ 7)E$~)u6d~y#RSIe~tߩsRN{4 z3Tt] d|UjJsYI'E߽ߩtN{2 ٔtg)E~Bz蝁EΡU_mƥ5ZJUB}I:.H39LJI:.;e֪LjjmϲLS4NT'ILTce$:I:.䪒NB]fr8Pg g`~;ޫ+$e#:I:.GjӚ`I ?cȞ&;K(.isJxX}%\R+:~ZX^TIt"5mzjtɿ +ylK^jb+:~׭檇Leo5MaItךxiRiH)[0OJSRJSˢV4VTܒ蕳 4՚$E_OfiL5Q+fiRJS˯вIG`MTfιUR]l:Xi3JJVSU%fΡa43cȞ4Vj**N͏"z eIPt]lΡV79P٪JtYu Z}o'IE>z4 -$˶|iNfIE˶|fVr8=gq޳HԧEll{zT5Rt]3h9vjM3j5Vq0fRJTYd>Hk9Y)'Eq>3zrIuO[ڧ\6+yXf'G\M5n׭Ι^Z\35O[e 𦷚Ǝ ~U&ʝ:Y ߬RII:/fOަg$$轊e$Nءi f8q je9NJjgyNSQIMUh.Өjg)҆ n3t^ dwYjTN4FU6vk+mo3aIy^k𲷙ɝaIu\/9k5aIy(u3_5K\׉u:ᙯCgX}%^jkšEfs_5K.k5aIy:.8 ksJp濊ksFK\׊ksFΰK\׊ksGK\׉uR:ᙯYaIy\׊kuS:.Ys^'PfkuMaIy:.+DzSL,x}k:t歯[&T!@zgM(?tk2?fi^6fZ0OԘٳ)imY%$)ͬu]%ͮz i8v g%%qμ>^O SijjM?Sf$֒IU_5:.S[ItMnX}%^t\׊ku:.S[HKEx9C>/45X}%^ik5NK\׊ksaIz&VI#>/D5iPKU[%K.k4u3*撧X}%^j.kši:ᙯi,u]%ExS[#\35S[iaIsUo9K)4θfk:.Us^*5NK\׊y#>/45tPK%x:.Us^*EK\׊yIt5iKExjaIys^*暧X}%^\׊yIt5j$u]%ExS[fkS[dfkS[efk@|34,ì>/43O@ 4Iq#MX͟$^,x}SiIi, Y.fMYNt] az%3ZPᣨ@ a80Vk-$@ a!SRNO >Sk83K´O >S[hq? +zItMs)šއ:0<`MI;[|@2\֫I$$+5KmzLߚ)u.&oRjL&t()'E]j kI:IiS[iQd?uh5(6UӒRNykբӒtt]`}S3贓Ӣu39MT(lfҙI:.z}TJ)%T^,>hI:$US *kUItIs3𦷡F45 *u3_šކPҾ"tR׭jgLOVPItMs45 &u"fҥt].c+5 +$軨]r6meEt].g2^Yi'Du YOB5f$軨]r϶6xڬZIu8'?vڬZJMY'EB@lZJ(u25IEt].c@k-#Su ϒ?f4N,3>HO}Vk-#FՒt].a2AYIi'EB Ii~ eI:.\3vfT$u Y+f em%$u Yb aHj:.\2@ۼHګI:.\W<] ZK$u Es̱3vfY:I:.\b aIeTt].dP] ZKVIwPvPM3;sX%$軮YoS):Jj=tUIU$u80Vk-#:.떻~S账cYj$軮Y}`fpԦrN>Dԕ(dDՕ +$軮Z D֕ZIw\HZ(RN@ޭ5I'ErϷwRI`:iMhRj:.u ۼ39(Nm?LJ,dXdvਖ਼$軮Yo*fr4N@ThڲN叶=fq9*N>Bfqi*RYw\ 4͟-%TZK.4͟-%M+%u:}ǵŤIer10|7I*gJn dLFZIw\b S3%$軮YXTtt],xS3ʩ$軮X/ 8b4ng#ZIw\i`ZGJIw\"ptZ(nGRIw\ݵkD)E%5Wu> Ii'Er>Ǖr%$軮Yк} +ֆJjhZ-ILJJg(Z2;%5N+$軮X'@Ti'Eq[DݳʒRt],M>^ dwS*JfRIw\K<(t],n,Aze%5+$軮XHlP#ee5ZIw\ءkEQ)'Erڸ u3$軮X' 4 և')YI'Er7Տ]fҢSVIw\,\a3ʉ(}>r9IRsiUrë~8I:.@ a:}R%$軮YO7Z%9QD$(qS\a4(vTu,M?Yt]P]~99'I'Eqn瘀wYRIw\bθ8+$軮1coY5)i'Eq?w735Rt]&rNq `E%5Wu,n2~2R@.CJjYbYZJ1g萴۬I3T.T(uEc@;t]Ȭl9Z$t]Nlyu&Ç`EL$5W|EmT%5d0SfqiQI,xv^I)'I'E=g"RJ$nAS3d_֩5T7qʙt]։'$$8NJ$Ԛ; VNII:.@;>NJ$fHSl9Z$jIH⫾~4hJG]_aG>MDv (JII:.!NIIwآSJjbLK%%|y+3Ie*#r8*VIc>/5x{g2;䔓Vt (i9U$|͏Pu#:.mPZNrt]@sJIwm>sRIwlZNrt]?{~CJ:.퐎lITYi'EP˭Z&-@|U-zޔ8t+ZH(su)C>/CFK-zޔ3 !@󬏠虽ID4Q AfO޴䔓]> !@󬏫JNIIt.qEgO䪒NΟi@'ZRr8_pdJNSN}<֔RN}2~')]> ?t7~%J)%r߻gԚg`I?{@pV-$.RXVg'$RIwgiՔ]dI% ҊJsYI'E߽ߩtN{2 ٔtg)E~Bz蝁҆:,E~u PniCr-%T]*mP>hR$zۥ#3I)$Zi5e5W~Bn6gng)Ui'EEg`~ԡMSoZQY%$frNNt5ԒI:. owPNBc.ݝRǷ(t]ަg$$iP`I ?cȞ& "rY#$VǑ=wjME%-qS>/3V8lK^g𲷡ŎKqo"[Mx[[X}%^fM#~"5mz42o4:.M#^"-z4:eo +tPKi'IHSUaNM%$EDiSIY%)e+fiKI)N.V4&NijV4M#JS˯MnT:0M):a,=Rj8vIl땙I)QC64eE+)3gPOٹQSJ:.6yvɥ3QFϞ 4+C䔔YvϞ 4Qi(=fi%#:.}@E tZIvϞǷiRSU)'ENs:ᙯMnt`m.Ig`MUf3Z9$EIs44rTYdmO{08*$_š9t`En:ᙦ5s6u3_sX뉯enaIu\<z->θM?PNM>VKE#&^ z<lRHO0TRHO0hoS/Yn/Dj*)}$'CT4W«YGٵ'O Yz-ܥa CC3K/Xgk/Xԙ3GC^K!2fnM()}$%CT)ୗR_@ nZ)}$5&L(RHjLð$u(u3_“m֪N!'⒗"BGhVkT8Q?bRHOi.ۨhf~Z">ͭPC^ Yz<l}Ma CC3A 6y5CC~Z">ͭPC~ Yz>v>04 qmj 𱗬RϠi!hf~2y ٗAv<g[/"y5CC~Z">ͭP~2}Ƞoa CC3l  qmjxX)n켊 CC3𵗬Rym*YymN!+^KweP]jUk86CgୗR@2(. ¶^Kw>G4B' qmj S/XCC3S/X 4CC3qmj S^Kw>iVkT8YO2[`u «YGٵ,z w"u / eM>VKOy۳ 4Y/ gf֨p}P*D}Zļ,ew2εP+eP]i P_ 4ك z- aCC3𵗬4zT}M`uBf~Z">ͭP[/"E\>VkT88bȠo@iYGٵM$2Av`xïT43?kT8T[/Y@͏s!hf~nCT47qmjIO}}a CC3'۹ Qk86Cz-w<gqmjIo b}43?nT&gIPʡ -gf֨q9^Kw>߂YGٵNtR)nۼ/wv/wP}"q P߅Gۻ(P_kT8R)nۼ돐P)>>BPX)nۼbigx.۪+c/X<ggCT4WE#'D+exu ^ݺN:%2vԚt_˜nT&gTݲNU OkT8R)n;vBvꆆgR@U (D}Z跀/Y]>>hf~Dz϶AT&g`P_kT8ix-e">e.vlxAw\T43?kT8tK/XYGٵM5Q,UvM'fGL?[jLKn&Q3P S0OԙCGCt{c@;1^i폠iPt,~ퟻ*(ZY1C0luԙi^gjӝI@/_nO]ړN^O"rMCP RlyvQ3P вIiSP 6"zԚf:%ICSkz(u]%Ex9e-ػu&C11pH5j1 f1G6 jAsaNAs`l4 mU$G6c@eSR ƣf6Uf5j2$c`gSr ƣ #* j9l8$DQػu&[3:cQh6کH3G6 Òb@d5Vr ƣ͇$Āj2$G# 3G6 14: j9l7&f70fCV6u]%iU, Yz̼ IpY/"U39%$/3h.ۭ I:I:.E]Z+%Tt]<܎+*$iUy`uҤRTHҫ6>Co>ਖ਼JQI'EyDx*frRt]G~|wLJQeel}߲-n NI:.x*frQ3Tt]u_UiaIu\<+Eg)T陥Z&GL?ktɯ `b0yׇֽnéDK\<3#i)3MX͟kI), Y:YxL]:.XizgM&Q<TՒRNqǐ0ՐNII:.Ro:L镼+i[Δ;:OUIt8jfCTs6v]rSRL))0SLIIurۺ7әðUǘ)$(mgځ TՒtt^졳< TՒI:/vP4שNݔ6>`}S3贓Ӣu39MT(lSVS9I'EOYܩE$۬洨N.yS>.gb'OU-zi:e:xIaIt3OʓM#gQ(#LJ՚I)'EYt]|X\^J`u Z.MY%$軨]r@TՒtt].kAz%Tt].g`gSVGt].g`!BUMYNI:.\SwO6ꚲI:.\X}rN,j*QI'EB> .*VIwPmGUMYQeu Y Wj:%$軨]r}-TՒf$軨]r϶6xڪj5t].g`gUMY)5du YRy%ZIwP`}Y)'EB>SVFI'EB%i~ (u ϒ4'@MY6u ό]j Ii'EB Ii~ Q)'EBtnjStt].dx*6N,̱а u:|,At ݻTՑVt].dy TՒ%$軨]r\,At ݻTՒIwP>P] jeTt].dP] jc:.\NH.N{: 4Xιh.4$p}|xUFp$_{6=I5b :`Ku%%T]AvGL)n9%T.u bCw4JtZIw\U^nfMTuA}4rN @;DJ)$iiʆt] Z[&"[)2Vdt5@z(rN)$蔓gP3wqY&jNnSI5t],vGM )JJMY'ErΡawg%ZIw\ਖ਼Et], ۼ39$u m?LFRIw\(y@~ VIw\ǷITt]-qi)*RYw\ 4͟Ieræy44],RUU$g쎘>RfrJQw\LFVIw\ۂg#j$軮Y̱ਖ਼dt],,Ax*frY:I:.t2y f%3JIw\>Bf3$軮X' 4 j,fjǮ*%5duBn)*$NwuEeIΒWuvEDZIw\y Y 9*(RNDu4tt]|iL1fiI%$軮1f 4Tŏs@;I:.YE$qY'Eql{zEu,lx{g2;$|Ǯ$$燶 BGUTI:.uꪒ8!u uUINI:.lH]BURSU)'E<=\tpI:.퟽ꪒt]?{~*VIwlwgUTZIu*e֭zcGLyTu:f~]֭zeNK ]S~~׭͚:f~(u}71g`F 'Sf]> !@󬏪lԓ]> <ΟiMI:.+:}ǶElMdB'Sf:-$?c̟MJIt/~æOަJg)$O ߩeJ)%rvITI'cn k(Kl=`}U)$RIwgiՔ]drQ:JjTՒ-$!IEt]$Kg1RFRIwgt*i96ϞSRU%]ؤ=}+UMt]֞nSR]#!Ku399I'E߽*i9M*)$K<%4+$ʒK-$LSt]٤H^v SrRIt(uASkJsYI'E߽ߩtN{2 ٔtg)E~Bz蝁9)d:,Ulzv5ZJUB}I:.H39LJI:.;e֪LjjmϲLS4NT'I;>Y)%$frNNt5TܕRIt[}LGt]4luԙicoU$e#:I:.Gjӝ:~Ǒ=wjM:(vPx&j%-t/3KU<,EgOjա&,gX}%\V"-zjtVVgX}%]5^TjuDiӥf䔧EDifrJSˢV4VjR] >iM5MjV4)N.B&N0͝r'$E* tOf8K͝BM?YNTTҲN͏"zOY9**N͏"z eIPt]lΡVTܨl%:,>yv4(gY}$YvϞ 4ѩ(YvϞ fN|mP"?z)tZIvϞǷJIu8͠@٩4ͤvYl5d.}sNTYdmO{085NJ'I'E=o3iq5-mC>/4\<,v^E}i4hf~ ymNV<*D}ZRȠouhfZp~(`u6Ya׳#Y#MxzM*^M?Ri(*}M4^i폠iNt:% _gӢgC'IP *=B46t:JziMUI@/_nO]ړMdI@/_'9RiHt}[Dݩ4:% } (T:% }o'I9^zQcfy)sv.݃D&R[3:l3QƩHs`j3r7 Il1ڪHs`l4 mU93c*Ylqf6uNj2$c`gUT1qʳ6 RAuZVKdL>B݃D&Q3A Ę: UJAn 0γl8*CfH5_EK *xPIt4x[[ItQs4kGl4`(lZAg?ZRYx uhAd,5:jSVJ,aJO֒UI*Y R+)iM)%љ2݃6z,v Nh.۪RNͮ>BTNIIwYaꙜRIwY0nS3du@nS3贓f^E}֪frI:.6>ꢒJUwY 4pATʔ7IN.6a/CJfVK΋.f*աItNkuS:.\<,PK΋.f*4u]%is4ā3 Cf^E~ʪv %DU4t^Ϸojtt^2duSIIU$uJGt\tZSI:.}M`u5INj)lcީIt^ٳ͏zǠ)$(t^ٳg||?SF +)em!m퟽M+%YIN.^4ݝj 7% NJ$ґp^4ݝjJIw>PTTJ(JGM{nvuJK*RNݻ:4rK*nJ$ґp^;vU4%$L$ ك͆cM%)d<@r JSQUt]'}Mm+R蔓!=d(uURSP٪Ji'EϷp8i)L-$OٳRNv/d7~VJIunu.M3KtQ.kViNII:.\ tiNIIwP宁y)U$u Y)@⇛jJrMe$u Y)I )Et].fX?w`JrQdu X"uSIwPgZ|dJr4N,3>HO}ViNF$軨]r3`eڂJrU%u Xf|5$iO+4%TJIwP>x+4%MIwP"nҜu:|,At,2;Jr6N,̱3vfmUu Y+e.GpViNK$u Es̱3vftt].gO2B#+4%RIwP"C,At,2;JrXN,Ӱ239E<Ӱ^Ρu.M5T;賮Z zJGQwہǍY@u͏oRiH Y #YRUEq[<dt3UI*gPv/d7~TԧEu:X.jJIw\Tه`}YrI:.늃[<Srt] fPҲNVtRLPΟo3FΙ[´VdtXXpw4ҡrITt]-q4%%u0O%IeræyKISJerΟifUU$g쎘>RfrJQw\LFVIw\ۂg#j$軮Y̱ਖ਼dt],,Ax*frY:I:.tǕ5JIw\tW9)nN>frQw\ dwS*JjVIw\O]y1䔓Egai)'E4ǘwRipU(䔦#m]q `ZTRK.攓VsRJ$nAS3d_֩4'Gn39%$5朓ⳚrUI'EΤәNѱg9)'E?`Ոu$$1Dm9%Tt]3RiSl9YԒW|ij)Uu=}4CQG`g4i:I:.TrUIMU?b@;Id0SfYi,슳VG] +yc>/5:x׭3LJ(Ho:$vs9D)׭I34ǛԚtI<'$|Ǯ$|äY@:NJ$燶lz۬9VIwllΓ贓ϴ-tRNx{h VtrNx{gzΓ(x'*VIwlwgYrI:.]j׭Ι7m*kL3kQ#LyC>/CFK-ziyG]LޤM3M#TBYӜt] Ad(uf$BYVtMk4%Tt]VtMl?z9N}yӜEByӜRN}2~sRIt.qYIRIi~M:&v $ 7g5YE߽XaJI϶Ӱ3wO7S)I)tJJ'IMU߽y+4%ZIwg\CYY)'E߽q#R5:I:.R@;iE$~yOhڲN{>x{YҒU%]ؤ=}+YIN{:r8Rp$)ng#)$]g9iQI'E߽]i`fRFt] eIM%t]~g)ΉI:.$/;:))$BY:}jJsYI'E߽ߩtN{2 ٔtg)E~Bz蝁3RJS˿{:VǨ]}`~LܦKIU~u :vIi(YvϞ ֓JGt]n2ftZIvϞǷ'IMT_]R5Vq0h%*,Ki5%EJIvdw޴%CS[҆ ~(ENJ_(lg5Q[҇fiMoD:ᙯzމ뉯zމɯ*Q4,։II:/fOަg$$轊:IU$B'>:HNǘ):-)ue9ME%5WNuRNJRI{cڙ=g\e ~4ۭTDz e댶TP:Aϰy5m砳 6UP犞@Ym砪<+y,=fi*m_ E~Sa2(.3? gf֨pmOVe7@M$^@Y} Pl fi5B 4Mo, V`uxY֪Q560n:d׊3nɨt:Jz)uޤ$t:Jz*ui-CP R := ԙcgCt{cn:% g^О+;&t:Jz[?vǨ]};&:% ϴICO'IiSP INTjt:Jz ]>"zԚf^>M5:% }o'Iq#P =o4:e:xV:dׅ1g<^SU:.Ms4 iMCg`1g?Z)$1g<ԖŚbVjsM#>/5W59aIsKt:..f `@톚~]Rd;ִY֊I),Y:5%Y NSVJ,aJO֒UI*Y RSҚSKf}Mԙ5CK(<M%y0O44IIM$QwǷfDIi'EUnX}%]U3Ou]%S[It5zIpMnK\׊u:.4xD)׭4t ~2o5K3? U&4SUEfiܒ+5iCrJS˺Pa )N.돢0ST5$uXw}jfrJIw\}bUEd+@V-$5WuXUCRJIw\}D]t]EfGM; qǐ0T9$qʓ?cn'$:,?g\}M%)iN.I&u+"r+$uQYʚt]2&4ulgfrJIw\fθ*NIIu-:.8qs44lg5S[XKEx4pKiMnG\39]nΰKxT V͝aIu\<+Eg)͜:fiz&:D80SMRNqǐ0Րt]"y^L/ .SrǑ=wXiV6l <:3j)'EkJLYKZLҧХ֏iM%<:L$5W)u$$_u4u]%Ck%Xe9$$CgdynIU$(lzqqY'E@o0>tZIwfi:RNݔ6y{gJg)$!5JRJX}RI:$*X}%]%NZ6ttUo4aIt3OʓM3Q(#LJ՚f] ߬ZII:.B,u Av/Ri'EB떺 MRN-t  ~6rIIwP宁y9%Tt].g`gMdu Y)iPM贓u87th^Jj$軨]r |=alrN,jJRIwP叠B du YtxSg%Et].g2^I:%$軨]r}-Sg$I:.\ (ylYI'EBq O6~Sg$Ւt].d>I 9%ZIwP`}9%JIwP叠}+Sg$jtt].aV>ੳ4N,3>HO}T6u ό]j 9%RZIwPgRF|dIUt].gOf 9%MIwP"nੳ6N,̱а 9#i$軨]rΟ<]7nTUi'EB@b a6rK$u Es̱3vMIwP>P] ੳYU$u Y+2B#*l8u4 ?{yQi*4]r zMD:,떂^MI%#(ڬ9#)$.}ٱM5;jy.-g$Qw\V10|RJY0] ߬ԜEu:X.jNSU)'EqPkf}TVS9I'EqPkg CYE$Cc5YjT4(EgO޷i2Vdtʝ2kEz,r:%*QI'Er] +tiY'Er]YIQeu4utJIw\՝f$軮YniI5t],vGM )ӤNB#LJ(g[}S3%$軮Yx*fr5:I:.@~ (fP<:396coU%RZIw\[U˺ilVVJ],:i?U˺>cڬUI,Y #Y%T],@S3Ւt],}vਖ਼ګI:.t,Ax*frY$u <^ NN}*frYU$u@AS3t],P&brI:.a-> 6rGJIw\"ptYhjE4gہǍVVSID+ht󧪲J-%u6=fM#J:.}|xUJi,f]LSt],Vf)$u CwPg)e$i%:MY'E0~4jSI:.뇞tY)'ErǑ=wXiӝ$u]5j)$軮Z!fUEe4ͫ$軮YоIi'Er>Ǖj(fB(YjSP$u@}U3I))h@T8cȞy#RS7Eulyv dwS*JfJIw\ 4{BfrTt],yu~k3f3)$軮Yuڱ뢩SVIw\,\aDZI{nYZT*Uw\mJTMUu qǐ0՝> iʊ$gY9NI:.Yx/UJj$軮1gYrNq `JRSUw\b϶'S)ʊ%)1dRNT4ř}.UQey. L]5I*T΢QȬyuQY%$YrRNi1;|*e9%)笈(ji)%|y*YwX`VZIIwYȪrrUI'E=gr +$j; rg$|8I:.IP4l}URN~ꢲNN~H[hvI:.*LqCGr)$qU?cnR8ӣ@u&X(xv^-$|RNN~2RSUwؠfY),UIe?dU8+#ksKXQ@:@zLP[6t'cYjLqc(燶y#*%$燶=tUPԓt (T5%Tt]6=BCR8!u uPԧE|6}.nJIwm>jS9I'E<=T5*QI'E<=ꡩPҲNx{d#?zjTYi'EP˭Z&-@|U-zsTWwZy_HItK$RK^K3?: ԚsHH}d4RNt,β>ZIIt.qEgOIi*"l{dP6i-#:.O޳IiNI:.'YRN}2~KJg)$O ߬9*QI-3]|4~ퟻ8v $ 7NRMe~)b퇬EI:.m;7tu2{>یNSUwg` 9%ZIwg\CU%JIwg\b'#S-<iQI'E߽y ѵd~|-$!]$rI:.O7S)JjWl_AtQYM*)$K<7)iY'E߽@TYi'E߽?wfr蔓"B^I)Nf$: 9Nk)$<39NVIwfPA{2:(O]?YΒJS˿{:VǨ]}`~-%T]*mP>g3r$zۥ#3I)$Z洦i5e5W~Bn6gng)Ui'EEg`~ӝ5O=g4䔓:I:.i%%Tt]b?S3d_ͺ[?vǨ]};&;޳%$(LIIu*>U&%,t"zԚf;K(fpܒ`lM?Ri8v [0OgR]L>M5;j6uʬ83azM?YIQCj ,4ƥEM+$ ' 4ʊ3cȞy#RT7Da:vXܔZJ,gYk5HN|mP"?z4:-$gXcg')4q@˳Rj%C&3fZIJ,i fQet]>l7rtt] kz$ IS&6u]%(xVg ~!y]3^+a2۳g¦i<3? 16~L]:xUk86CKx,)ny,=gOݷahf~'B돶T<:퇖a(u,yu5? q80TN댠>M)i@ݞlLg۹  gf~Z">ͭPJx 2:mݞ@Yme*^Ynu ¤/ e~hH_l 4Pow@͏1=c@;i^wD<0pT43?a-QD~Bf~(#48t:Jz+BzԚt(^luԚtPt+>U&GCO'IP INTf͝^OcȞ&ʝ^yl^6BYu*MCg[3:c[ma8$5JAÀfXn6+ %+ g ka3 7 Fca`f8X8$Aeab2$l8aal2n9#10f ram`n5aSf51ăQqsU$l8aBAn &6 す0uab2c[m`Аj5!Ńql 1VAÀfXc`gah FcaM3p k Aq`Аj5DҫH3p kQ2$ Ɩ&ؔf FCÁp3&6FU9 ka3 Aq`p3 IՇ#2af16l5V2ɆUl8aal2m`d7&%fL2tf51p2fL2iV8u]%Ӛg^h.ۂɤu3f56AcY3p Û QeZH3p Û @j3 1l9 f qf6u ƶ1ÁdH9S1l9p8* ƶ1 6p8,9&$&VtZAÀf6n6+FAl1$V CJ3p Û Qe`d2XrLHL2AÀf6ؐ3p3;FAl1$V 41l9 f qf6v C!Ň$Ą*%f56 "Al 9cqĐpXrLHL2VAÀf6p2#13l2,9&$&Ui1l905 2FAl1$V 5SYIc[sap7Xr2 a :䘐eTmUtu]%ӚenKs3M3>.js]43/Xԙ5їlȠoLII:.6)}$6uScnVJ*$iUxP<#ܩ5t]m~ d}Z&mY'Ex0d(uhnTKI:.6q(aݐyGաR%$/nݐyGաR$/ d(uyiQ44ScXg%YI'Ex4ݝj RjiQEx4ݠn 9QD4ScY@[g%TUI'ExϷOݝjJqYMTQv^)h.۪iʔYd5SYEx9S3g(N3gX}%^g5g4m?IXfgPn1 l2 ƕJAb2d8  ɬ3 ɆdQ5Qd5p8,5FCZAb2d8 DcPrL2 5NAb2d8 D ؐ5UIqkap7X l3  f2jjAb2d8 $&&$ l ƣ!Uj7qņ#"b@̖ j2܃Qd5p8,9% AȚ j2iqkap7Xr2 AȚ j2Qd5p8,9p j2iH5FC[ Ðr2+95FC[ ÒP1pH5k:H5FC[ ȐcbA3i5FC[ ÒP0r3fQd5p8,9% l p H5FC[ Áf#+ICZYqkap7X l8F3 5qkap7X l p6k5#!Cq`dH1dL3g$#!Cq`dH1fL2kDX'l6@󬏬0&2l3QÒbA0nX6FauT7 FcakQqʳl5VArMb@f5CQqʴl5V #13f9& nL3 ƣ0:r1ăQqsU$ Fpd80f7 Ƀ MH4$Fq`r3; FU2 p4*d  PdH*BAcK J3d!Ńan8V #*VLKҫu(u]%Ӛg"}7b8aMRe:ٙp2f6 1g!saj3 IC @j3 !̓ql7Vd9 f qf6u 6 "Al $8l2㊪!͉Amap7XrLHL2贇!͆al2dAua1!0ʴ4!͆al2l2,9&$&T!sb@1l 9cqĐpXrLHL2Ң 6$ n3 d8䘐eZ$ 6 "Al 9cqĐpXrLHL2VCÁdH9aqa1!0ʫL$8lL2 Ck Ñf7 IՇ$Ą*TRC!n8dAua1!0ʩګHp27b@f2rLHL2)Ed9n6 IĀd1dAua1!0ʳIEVKQC>.Q? +u aIsSgenX}%\溉3}$6 y(l IblȠoLII:.R͊_@ jg$$K6>*W)fP<#ꨔ5t\Av$6BYUDIVIrli*frQ5t\@vuI(ՔҢcn]UJSJ.R͏=gہ'n QU$)fϷOݝjVSU5\>]EJSU5]|Yy>x/kReltj϶"n )2[/"g792[/"l0϶"n t/X<>x/Y&^KweP]h|4MzI2[0Og73Rew\>ճ퇈_GX}%^j8x2aS4L?{0MLII:.ّهji)%)$]u]%\}p^Ɠ;TI/:4)'Ey<@p8 CJlu:Sk83K´O >S[^VXItMs)cȞ4+Rixug~ kRNZ'O׭:2e.kgg:} ]h4B睂P䔦.Y9'I'E]o9:.5tZIwfi:RNݔ6y{g%)쇧ڬJTUEBjTYi'D_U:..f~"tR׭LOVQS>.i9RiH%DxQY%$bCw5I)'EEu.M5 tQ.kUdu]HVJIIwP宁yꬔRIwP}͟Y)VIwP}@ mUd:-$軨]r>M<WJj$軨]r |=aRI:.\,X}E$u X/ iY'EBi6mUdEt].g2^%$蔓u iPVJIu>@⇛j%$RIwP}͟mUdՒt].d>I Qi'EBeq jRQdu X"uY)$u Xf|O*R4N,3>HO}UdhڲN,3>1vX}*RU%u Xf|5$iO*RUDu Yw%%MIwP"nHJI:.\2B#*R6N,̱3vVJFZIwP"XXdwVJK$u Es̱3vVJK'I'EBtC,At,2;%%RIwP"C,At,2;%%+$軨]r;(n9#ZJ;\^53N:堻5$p}|xUp$_{6=IhUAvGL)n9$y.-g$UErΡ^nfjt],`YRN>VS9I'EqPkg CYRTN+*VIuR?zt8tɿQCVP̎~8&( :Re9,}ܒt],%5Wu*RIw\0SVJGt]-wO6L)iMUrǛS3JIw\ 4zJS9I'ErΟvs(d4ӕ +$軮Z 4J-$軮Y۬7$蔓gP3w4I3Tt],p7zI5t],vGM )NJMY'ErΡawg%ZIw\ਖ਼Et], ۼ39$u m?LFRIw\(y@~ VIw\ǷITt]-qq9*RYw\ 4͟䪋Ieræy84],rUU$g쎘>RfrJQw\LFVIw\ۂg#j$軮Y̱ਖ਼dt],,Ax*frY:I:.tU9Nf$軮Y39Nk)$M5)j:.tQi'Ep39N%$軮X' 4JiΒNRj)$軮Z!fTⲚfՒt],_n %5ZIw\}fmIMEt],]>3jjhY9)IILu@Gu2duDݳʒ-$軮+cȞy#RS6RNiv eILI:.)ukQI'ErΡV2֜dui @}YI:.>2y fLt],}Yp$uDaZe3)$軮Yuڱ뢪JMY'ErP=q[J(}>rX9T4a?YI:.@ a:}J$g1+%Tt]!HN>8Eu,lR-zi:fix 7wf l=4X $@ #rJIwlz4:I:.HiI:.u4Nx{gdx-i贓ϴ-iJIwm>#rI:.퟽4ʔRIwl 2~֒RNt,β>洓]> <Οig5NΟi@'YiVIt/~2~֔贓_p2~֔JIt/~æO޳ҙI:. Cw9(.\7~ퟻM#`I?{@pVi'$.RXUedI:.m;7tu2{>یfQ:JjU-$!IEt]Ĥjtt]إ瘀wUt]> VF$燵KITtIwbg4rI:.O7S)JjWl_At8t]إ֞v s7)iY'E߽@TYi'E߽?wfr蔓"B^RRIt(uAYrRIwkyfr&̠e)tQi'E߽'`~%:,E~u PngE%5ZJUB}Ά5 Iw`JGWfRIwa.YiLjjmϲLS4Nt'IJjl{zΉ)'Enj=S3tt]攕RIt[}LGt]6luԚtP l{zΆD~39'I'EMTf%,t"zԚj;K(yvJg`=fiVg )(=fiӵŤQe>z3Z$+$gYe#RSN|=h%5Rt]3h9vjMIvYl5ÒJTYd>Hk3Jʋ,fCgi:J'I'E𲷥:.\<ٗR_@ J()}$%CT)I 6ES[¢"Bo=UMzOn/Xn v&U K«Cb"CT̽bRHO0i%P*)}$'CT)PRHYm砪xަg}z-ܥP>>&U AK!(D4s%/D PE/DjUk86CiiDuT^) b*Li#P Kn&X(iLP R := ԘI@/_K44I(t:JzvIC'I3C{Ulz۳?RigCY4PtVDݩ4PtRx&I@/_KձO]ړMd·I@/_B&NI@/_tx/55e)׭p<,HK΋.fVK΋.fVK΋.fVu]%E3OVu]%is4Un>/3KjaIzQs4LIt3O +t:.4ienGX}%^tYs4UnΰKt\/EDΰKiEK.f#alȠoԙCG`TJεZRNmmV$$ V$NhrGt\iJtZSI:.}M`uNrJSI:/lǍT*L%46͞lx=MSNIҊJi'Em6}nMI)CJtYxf[~`gTIDRS˼ 7gZ% NJ$ґp^4ݝj9%M*1}֠f䩣Q%N>U,I:.^;vPU5*$K)7nεZ7D0}Ji5I'Eym~PJiYI'En6CKMY'En6+CK(ǭ"~YdD* :|tuNJIwlӰ]J]β>Jt8rIsEtuYb?ZIEeo@gRMEM+$ݺV%5Yi'EBz4ݮ"hrSPt]'β>j5IM$|wghrS4KI:.l6hrS4I:.l4ynII:. gfrNN~IU$iSr85S3贓ojJJ!ATMn䔓!ng$$䪒N5ng#:.u59NI:.nSU)'Et-3t\t~J)$tTCJ:.p6frI:.X\TG`Nj6R`jfrJIv^bytt^ 5ng%Tt\o6zg#:.͞:-$/O5Rt]3t\t4jTNةPҲNLTYi'ED퟽LI)'E}ZI3Tt\/zYI'E}w>SUSVTIE}|xU39QETt]X.S38t*L`5Ey >JTIDeoUJ(.}ꙜHNy֪frRtZIv^b*jrRj$)TK=nã31 sat!ַ6S=nn\T*͚:.&xV >S[X陥Z&GL?k$tɯ `b0yׇֽnάuu]%iOԙd5`b6~%$1g<9-%4تԔՔE*M5Dy Yǘ)֒RNqǐ0ՐnII:.NII:/ؽEd"Pb&;裨]rAvu]HM$$軨]r@x*mi*nN,3vM#i)$軨]rΟ<] ੵm5du Yb f ZFZIwP"XXdwM%JIwP"Xw֒IwP>P] ੵI:.\W(e.GpTXN,Ӱ239E<Ӱ^Ρu.M5;賮Z zJI)9En6f9I'E9u͏oRiP Y #YRUEq[<dt3UI*gPv/d7~PEu:X.jJIw\Tه`}U g)$軮* lHk3S(l}3Iʆt]޷:d߂Vty3VP̎~93MbP@uޤ;sX%$軮YoS):Jj=tU6RIw\0SM#:.떻~S账cYj$軮Y}`VZS9I'ErΟv(d4ҕ +$軮Z 4*,fnMI'Du:Y5I'ErϷwZI`:iMfRRj:.u ۼ39(Nm?LJ,dXdvਖ਼$軮Yo*fr4N@ThڲN叶=VVJkS%%u0OQi,Xt6~'%M+%u:}ǵ99*Yw\AvGL)n9%MJYҁۂg#i$軮Y@S3Vt],XTII:.@y 39,$u:40T䲪I:.> .g%+$軮XM>۩t],Z}*miU)'ErθPΟjfp$u@VTRSUw\ڂ')RYwPl:y99M%˺޳4jSHҲNn6fiYM%t],+#sRN址 T9dnT96<>V&쎘?YEt]=S3RN"zOYjSNtt]-vjQI'Era 7z6fBpVjIi'Er>Ǖj(fB(YNSP$u@}ڲQw\ dwS*JjVIw\O]y1RNym*pԒt]Nlyu&9CMWXSRzȏfYwYǘ)'*)%|v rNNzϞESU$|m*fr8X7qʙt]'I'E?aNI:.I; UCrJIw5bT7$$1DmpԕRIuaRc?gaʜ7$qU?cnR8ӣ@u&8(xv^RN~jpԓEL%T](<JK.80TYwNdqUUo4:.\*EyCM޷ITSk"ykICfw}`ړM#G`Q'lGpVi)$|ǮII'I'E<=P"?z%$Nx{fǨ]}%$qY'E<= <Οig3RUI'EEgOȠmjGt] ̟g3Rt] O޳MTB:d9RIt.qYYRIiw>4TI'cn $YE߽XaꬤYI'E߽m`fnSVSUwgqNJ'IMU߽y*mi(N{:Y)'E߽qNN{|겒4N{gE%5 Iw`JGWfRIwa.YԦi5e5W~Bn6gng)Ui'EEg`~әðMSoY)%$frNNt5F䪒NB]fr8Pg g`~ӤǷI%$(LIIu*>U&%,t"zԚjvPx&}[Dݩ4L /eo3aIy\TNo3:eo ]?fi^a4&v 4frJIuU[X}%\'g aIsKYZ׭蒇L𶷢FK/D?ykJL𲷢IaIsk*xXΟtz$+xY[)aItעIxiRj$SUaNSR]aI)N.[0OZ$jIJtYu0ta56v [0O։+$:,} (Tg;j6uʬjIJUv=a%*(qYMTa:~8daDa8rTUeaDݳʒ%$ BhP٪JtYu Z}o'IqcQFϞ 4+3I)(=fiӵRQi(=fdl>یD~贓=coY9)S[%fk4q@˳RjM#&3f+$EIs44I:.یna6q։NNޓLf'3G\M kzMS>/4f )n ehi%PRXx3ymv }UO tuS3ם3?, V`uxY֪RjzPtT4&8(*}M4t:Jz aG>M4:% _gӚC'ICC{Ulz۳?Ri3P MTjtVDݩ4ͨt:Jz)NF\wTIΒNn uL54۽ߪIJQI'EϷ{Av.Td>}n I:.}AU)%RTQs4ݠn &TQs0yׇQI*I:.X,lui>x/U$)n켊 p퇈5&^Kwui>x/Ud)n}Mz/X>x/U)n/Dla&NIRϠi>x/Y&^Kw>0϶"n s/XnCg7:IRva luila&fz-iճ퇈2[`jMzY/mnX}%^j8x2a(p)I&^vΟ|g$el5Qi%)$]:..llP&^v;p!@~92/7gہ 7ZIO]/7gہ 7T俊ksIaIuP[/;gہ 7RcJ٩٦Ĥ^,b'))΋[,4o4:oTgDy Yǘ)RNqǐ0Ր$䔓:fixVkyX𲷙NKkN~0uDaZLᣰ(:)$_šg&u3_´N[g[²Zy#ϡK@u&&v`e9%)KVtJIIuW[Δ:.IZf&;ҢΟEu39%$KAYҒNZg(xMԚk*v (Mf%$軮YjIIw\,geI*Xכ?S*HNyf@ Eu.gb'OU-zf2UXܩE$u X/ nT4u4Ώ}Qeu Y Wt].d > ڪ䙪I:.\ (y&N,ljVIwP8'?x*(N,crQdu X"uX܍NN,3>J'@X܍(u ϒ4'@X܍VIwPg.V7%RZIwPgRF|d%$軨]rΟ@ۼXܕ7I'EB@wt].gOe.GpUcr6N,̱3vV7#j$軨]r\,At,2;%$軨]r\,At ݻUd$軨]rΟ(e.GpUcrYU$u Y+2B#*,qY'EBi@~tuUEi/gPb&:,떂^5I%#(ڬÔt]}ٱM5T;jy.-g$Qw\V10|RJY0] ߬贓gPؽMTuA}՚Ig)$軮* lHk5g*QI'EMVj*VIuR?zitɿ53V0o4:d%n&8r4֕(d5 +$軮Z 5)*,fnQI'Du:Y5I'ErϷwZI`:iMfi))5du:Gm Qi'Erζg%JIw\,2;nTjtt],@39QI'Er̠y`u*fr4mY'Erާ ITt]-q4%%u0O$IeræyIISJerΟifRUU$g쎘>RfrJQw\LFVIw\ۂg#j$軮Y̱ਖ਼dt],,Ax*frY:I:.tfQw\ dwS*JjVIw\O]یL*(Ő>Ke9PҲeػmVg%E.Y $-1v3L$U&JDX4RNym+4I)'E4ǘwRi3MWXSRzȏfYwYǘ)I)QI,xv^JNNzϞEYRIwY܂g#:.Ri'Gn39%$55$$85%Tt] M4t|4RN~4tt]BC՚FNjM4E:>~6ÕF䔎*}Mi-$qUt{cnICQG`f$#RNN~2RSUwؠfY),YZK."9#⫯eo9u]%SH ~o9~)E4tSk"ykL/Cc퇵&D<=YI%$燶=tUԒtt]!e#椕RIwl YIVIwlljJtZIwmgB9).:}UԔRIwlYIRI:.퟽nj?YIPҲNx{d#?zjJ-$ u^f7m*kM3g]j׭暇f~+ENK ^s7O:ZhyG]LޤӡM#TBYjII:. :'I'Eк}y>cΆNΟi@'YԎ+$?g?zΆ:-$?c̟gCRI:.tt5)]> ?t7~9EˁlTsTI'cn iI)&{v8YI'E߽m`fnSVSUwgq朔N{80UcrQE~u58jJ,θNIwbϞbN'#J)$:}Iѵd~|*N.R۬nG(δu2* Ev [I:.AYt]إ֞v tRSHҲN{iI)'Enj=S3tt]nJ$-@~g#:.u ~PvvM4v=f$D~39'I'EMTj /cyv6_ANTk(v'Iq3$HKI/"tӥ[)2 4[*SsM?Rj$4TRNeoD:.旚IxY[#GX}%\I/"[j2kޓ4u]%izMO YoI~VgX}%\<,EgO:Z&+xY[s:.II5N 4t'9%)e+fiZM9%)e+fiIR] >iMI;DiI$:,} (T*vIl883azM?Z$e5R]li$EM+$ ' 4G%EVZIvO]z϶(fjrt]}DJj$\358͠@٩5(Ug ։+$EIs4U9Qet]>l7&rT9:I:.5)3 Q/ kzRFg?5n׭DΙ^(EJQ +z&It8i̽b}a JR}a PO iغ(*nUE|)}p^ہ 7SJxUk86C/Xn]P>>&U ]T*AD~3?nCStwꚞٗRϷsICC3w(DPϷs!~Z">ͭPҾ ,)n۹@4IT43?nCURez-w}q&U ۹B' we#isܡMOnCUV9 9Tez-w|Jwb~hϷs!(.ZY֪,/XnCfm,U(^)uޤLtT4&Y3P R := ԙeI@/_K44ILt,a,=RiLt.iGcȞ&GCzޓ3Oe@۲@Tζfu ƶɆV ; aRf5fL2l86 RAuY3r3&X6 9cqĐpV ƶɆV ; 2AuU$ /Zn݊dv IΡÑ0Ȑ3ᵆqʩH3r3&Xc@6AÑ0Ȑ3ᵇ mZI;/ZnIn̼ T䔓nεS3tt]vJUv^۷d/n> ʓQI'Ezn݊dv h3j:.;vػuR-$/@۱Gi*frJIv^۷cm֠iJ7IM*(/@۰T+$)PKee 6}Rdl#!CqaҩH5FC[ a5ca0̐j3Ƴj7qŀp7;qkZH5FC[ Ȑc`jICƩ5FC[ Ȑcab2* n1 l2"Acba4$ C1MH5FC[ Ąā-BAd1 F!n8dLH4$FCj7qŇ$3X4$FC n1 l2FA3X4$FCj7qŇ# nX4$FC)qkap7XrFCg9qkap7XrJf6 1gIqkap7X lH8c9qkap7XrJfF`B2Ԑj7qŇ$2A5nqkap7Xp2ea(kY n1 l2"A!7c!Ƴ7 n1 l2"An1fQd5p8, 6 cQd5p8, 6ɆC1hMS>/CJf۷`P>n &lfgQ̘e`p3l Fc!̘e`p3l8곐fL2l8r2 a :$9 v& dIhr۰2a$5&McG#2a f4 k f1RɆVD7 6U#2a f4 k Ah9$9 1nXr NKn۰pțɜ:ٙsa8$5JCQƳmZHsaRCanj!́3Vjs`13tQ p3:6FUfҲ_UaIt湙Dv&Rg`Rt2(.S3RN͠v֪frNN͏yRTHҫ͐ݸ&N͊dv SZTdAv.S9*Q%Dz439R%$ AU(nTQuela&཮>BILfgV^njx/YɗRym,a&i&^KweP]j϶"n 92[/"E\a퇈RLbȠo@y>x/SRew\a퇈VLb<ݟlx/Y/X6lSURI%MnX}%]E5헝퇈&P Ly8LII:.JjT$ela&འtS3I:.a&཮>BTNGt]S3贓|yUJJI.elp!@~qL[3:tjϷnIo>PLtKB ֒elyu B 9/CX}%]E5VB ԘG`6jji >PҦg$elp!@~պn(ݮ>BTZJ$/;f)fg#:.هGPEI$5C>/3KMni3>/5ӟksFK&:.]94Itx4pKtMn\39ΰKɮf:fixVN5l Y:׭͛:m_V:.Ms4 iLl& YڲJK/qμ>rZK/iSkJjs(e~׭$tߩRiJ qǐ0՜y*mI%$y Y ߩĤGX}%\@un Lҧ`60SM$(mgځ SjI:I:/vP@[$Nݔ6= 8fr8e iT:-$34LSU)'E<=ASjJg)$!3JJRJX}ѩQe]|X\^L'EB떺 M$u Z@:@mI'I'EB떺amI*u8'?x*mIVIwP}@ mTڒt].g`m+ڒI:.\X}RS9I'EBeqSjJRIwP叠B %CJ:.\MjԕZIwP@ EzRI)'EB@mRIu>@⇛jԒk)$軨]r>IݶmI)5du YRyԒ-$軨]r̰~>MM%JIwP叠}+SjH$軨]r3>2}SjHҊI:.\#M>2}SjHѵdu Xf|b PTڒU%u Xf|5$iO*mI*RN, ݻSjIStt].dx*mIII'EBtXXdwM#i$軨]rΟ<]7nTڒ6N,2B#*mI,RN,2@ۼ6NN,XXdwM%RIwP"C,At,2;Ԓt].fwO7Y-%T]\>&5]qK<dt3JJ+g쎘>RfrJ%T],.j+)i'ErΡV {!j$軮* l>ĥ3t]y$5JRIt6>UCJ:.VdtΙ5Az-3'::台yRNv2cESjIU$u80Tڒ8kye9NJjBV7%TJK.ayXܕQi,Xt6~˺>cڬnJ],][ISt.t}vਖ਼j:.@P>pTmUu:y 39,RNe/LK'I'Er·> 39,N叠B c:.(aOvfr9Eu0@ RGJIw\"ptYhjtNSJJj}|xPUcrJ%%u[@ç=Ui(],JiVIw\ڬ')NEtdw#39NtJIw\AY7)$u CwPg)e$i&쎘?YEt]=S3RN"zOYIM9Iw\CYI:.떻Y8du0ۂUYMDt],_lyYI:.a.B5 Iw\ڬͧ)IILu@Gu2duDݳʒ-$軮+cȞy#RS6RNiv eILI:.)u)E$u:[<^6jSXҲN叴 B>͛Yi'ErCbO!͜Q)'Erڸ ukJg RIw\O]i֤qe$u4V=tU6Ւt],IU$_&8Sl9SI)UwRJG]}t{cn&v ($EL%T](<JK.80UcrYi,슧dqUMnpIt'sLKѥ撙rg>4LI'cn 7$.RXUdI:.m;7tu2{>یfRQ:JjSjIEt]jIEt]H$Kg1%#J)$:}8VIwgk4%RZI%߽C"uJHt]֞nSR]#!Ku399I'E߽*q)M*)$K<9M#J:.Gu2I:.S3D~iJJs5I'EРyGΟqg3RRIwkyfr&̠e)tQi'E߽'`~JS˿{:VǨ]}`~Қ-%T]*mP>gIjnS3$ö]j%3I)q>u39LҫI:.О+;&;>)'Enj=S3tt]RJ$-@~g#:.6u]%qu-zk,t~4o5xa4$v 4f%$*rgX}%\Uo3:.XߊYZ׭Ι5moDu]%iz%? Yo37eoD:.יÞ"-zg 2,u]%^g iRj$SUaNŤEDihRJSˢV4VRIJtYu0ta5PUaNIJtYu0P4&vIlZrJTP⫰͇A 4fQCj ,4ĥEM+$ ' 4eEVZIvO]:v9I(YvϞ gdl>یD~kJtZIvϞǷ+)4q@˳Rj$l نk3)Qe\M!%*,RN'۽} fJʇ'I'E𦷢G ~(4fs_'CkY[fKk2[ݳ!4IT43?@<N)<޴b蠪f*۶o=T=hlT)}p^CO(Lf̽bl|P>ƓI*gR@U nB'*:xSljhP;v4ަgcW`S)n;v&U ˜gCSIUk86CTez-n@4IT43? `va M+ॗAv߰2P60o5:dׅ:.4ielaRj(v ,cεS3RN(.u4ݝjg%Tt\7Z'#ʉUsεS3&mY'EtY֪frZIq眩ʔQ)'EMoCgX}%^5N >RoECֽoChiaIyD3Ol@RP^I: u2t\ީ$%rx/ZIRymZ퇈NLbȠo@ia&T/X(.P>un϶"n ԙz-ia&U/X7g7nLbRHla&V/X!퇈9&^Kw>a&fz-<>x/YLb}a lBS+$/;f)fg)i'Ey0H򩚔JJI.kt:.8y6~Ǡ)LG`6yʙDt]&u]% [*xPItIs4=IB'*L`X[I)'E]ꡩ'I,,u]% f*(u]%Ms4=niS3p: [sG^ջ^VgLzZO['4u_UaIs3O6evǍJRT')B'*1f^픻}g}p|i4hf~(lv xRzV<)=M9TK퇈M_e">e.vlxAw\M$^E~ë@0:CJxS,U[K/:}=MxUfgॗ> XjIi,ީՔ^Oن~NIIx?`j*$UE4e:~ gyʙ5:I:.ن}ZnJQIM$Qu̽cnƒ;*ȠoLII:.}MLIIv^?clJUv^?h.ۭJQI'ExLTdeuʨrTKI:.Ryʙj:.ksJaIz\׊sFK\<3#iTV,grJK/qμ>jIi, Y.MՔEMnΰK\׊uhu]%Qs4g\a2ƎjŘihܒt]P]~:I:.Xw<7%Tt]!HN>YYNI:.Yx/UJIw\b޳HԦrNq `蜩E%5Wu,n2~2R@.CJjYbYZJ1g萴۬I3T.\~M4;II)&{v4nI϶Ӱ3wO7S)I)iNJ'IMU߽y*$I:.jQd~u*5:I:.R@;r4N{t+9沒N{]ͿS35d~e(MLSI:.;ՔR]*=B֔Ii*ΡVmz:NSP$~[tuzi%$~U))MYMU߽ۍ[fZIu } (Tg;j6uʬ83azM?YnTPⲚ.6u 4TdaDa8I:.6ਖ਼řz->θM>i4hf~'aCT&I 6y55? gf֨piO1f^Kw>ϰy`fI*gfZqI\>LáP S0OԘ·I@/_K4ǘwRcj^i폠i8t:Jz?vI$t:Jz+BzԚiPt/u ~PvvM4:% ϴIP [yvP(B'*M3F·I@/_KձO]ړMUNI@/_B&NI@/_tx/:\➙KAw3zTJ:} 䔓.Nt9EMn4pQaJIw\-vz4YʒUI'Ep<6~Tdu> 39NI:.y#RSU)'Ezj*tWk"yTy+xVc^E!&;\y*%$Ch>XejII{϶,2U5%Tt^족 iǯS3d(l}Mg)i'EqDfrI:/vPퟺ jS9I'EOYE$۬ԜN.ypKXUK^:e:x:.f&iDHVtVII:/ؽ·$"Pb& tQ.kUSRJIwP宁ުtt].kAzI:.\Rydu Y)iPU5)i'EBq n"U5)u8ڪ3t].fX?w>UTԩE$u X/ jT4u4Ώ}Qeu Y Wt].d > ڪI:.\ (y&N,ljVIwP8'?x*(N,SRQdu X"uTԍNN,3>J'@Tԍ(u ϒ4'@TԍVIwPg.U5%RZIwPgRF|d%$軨]rΟ@ۼTԕ7I'EB@wt].gOe.GpUSR6N,̱3vU5#j$軨]r\,At,2;%$軨]r\,At ݻUMId$軨]rΟ(e.GpUSRYU$u Y+2B#*,qY'EBi@~tuUEi/gPb&s;賮Z zΆojM)9I'E9u͏oRil Y #YRUEq[<dt3UI*gPv/d7~Nt],`YIMTuA}6rN @;DMIRI:.jMYPҲNVtH&"[Ί2VdtGLĠuޤʜ;sX%$軮YoS):Jj=tUTԕRIw\0SU5#:.떻~S账cYj$軮Y}`MS9I'ErΟv*QI'Er] +sNT4h.jTYi'Er >g3rNI:.u7z&jNnYrMe$u]H k:'%&gPS3-$軮Y}TI:.@Gm NN6g#J)$軮Y<?LF$軮XcRU%u\|5%TJK.ay6jJ],:i?SfdgOIUT˺b :`Ku*nUErΔ39MY'Er n gO2g%JIw\̱ਖ਼d$軮Y!g%RIw\_At39,qY'Er "i.LG(fBUMHI:.u„NtV:)#)$軮ZnڵG%4gہǍMQ),GE6<5)Yw\ci)iY'ErϷojL䦒I:.aYT9)'Er}frRIw\7u*frRIvAYjSՒt]5NfrJIw\O]i+5ӝ$u]54RIw\Bީ4ͫ$軮YоJj$fBcҒ%$軮Yк} +f7I'Erj4rS4.떁 eIMS:.miQD$:|P4&731fit]P]~$$軮1cUI'Eq:JGt]ǷJtZIw\bMzRSU)'Eq?zrNq `9*QIMUq>یL*(Ő>Ke9PҲeػmVg%E.Y $-1v3L$9ReuEc@;Egaʬt]Nlyu&6&QS))MU=dG@U3IMY,SfE$z7$$UZrUI'E=gr +$j&v LII:. jRNN~ÊRIuL:>~F6t] XwSkI:I:. Q!mcꬔRIuaRe:t|m*$*}Md䔎*44I;|v ٹ%$솫%$$QS)U%5W|1i%˾~R-ze^'cYjLð(燶y#*JIwlz課NNx{a,D~Yi*ٱ_n-#:.mPU贓ϴ-e5Rt]AO-)ޫ-*QI'E<=ҡd|Gp6~YiQe_C.kIcM[k/CF9? ?tk:f~P<#.&oRi&!t,JIt.qyG8]> <ΟiN-%Tt]VtMl?zZGt] ̟N-)i'EоdqiMTB:dqiL$BY8rTZg(qlTG`I?{@pUcRJI,]UZI϶Ӱ3wO7S)I)crQ:JjUMIEt]RQd~u*n5:I:.R@;HҊI:.ΟqM#FՒt]ڬrJK{Evrr9E~uqT5Wu+HRLGRIwd/ ZSJI:.RO;pܦd~y#RSIe~tߩsRN{4 z3Tt] d|ViNSI:.wO6LSՒt]ٔ^̠>539N-$DiRSJtYwgP i))UE߽B6Vi7I'E߽)^g)II'E߽lfҙՔ] eiU_O]M*jl{z$䔓:I:.䪒NB]fr8Pg g`~IC,}4I)'E@frNNQ44vf%)eن~X&%lM?Y0P4ͪvIlT䒕83azM?YNTPⲚ.6u 4S5**iY'EfǑ=wXi͜Yi'EfǑ=wlGu2nI:.6yPYnT6j]Vtx ڒJJ,gY|tflԔZJ,gYk3fqY'E>z϶(gE%:-$gXcfJj$ f rԚg;j6aڲJTYd>Hk4ՕY)'Eq>3zcIuQ[g\34=o3V8It8i,)n}͔ili%Pp7 ?H^.FA~\,%xgxA <.2 |\!EY# <>tg~. EX#xAy`0 <`Aypa& .ăY@8 *"Y |T߃@XC`ˁYb*r_" .- <,uY`?pA <," _Yj^*E E~*r׼TgT< <-& Ep-  Kr+ZA![# <\"hdgГAx-\"'g]' <RP,qiY2Ov"~*E ,~*E!#,hq:H|Z?DAxCrŠ@NAx"xAx$qiY? pE B/$gINg/pd ?Y E/ <+A|>.,p "ϑ@A|\Y >@kE G >@"ϐJp "ϐEdS"2Q> |?@́jYd>D?CN~?H|l,! <,  9YሯCx EoA!߁ЂCIpEA!.FAz@5$>:H}! @NAzB/t B7gq@H~d*r"Ϝ>.$g_!K8 >"Ϡ' > CCv o,Azav d.FAz`i$>;H}B/A!"QCA!/,MBH}@dgx "4g~4Q$>iY Y3$>h%xYv T ? *E B CpElB k"6@NAyĆA!`"6|\g/?'r2؂Cv $>sP,C BPEp!Og~, Y ~.$g!x EoC/Y7 A!+" CG A!*r '!$>~*Et, $>tNJ,xxAyѯ Y@ A! \g2DѯE~ #~ NPEGz P,C1p" .Dg'@NAxp ^*EE </"o@P, \H"`zAx"JpA <9x E,9YY:Ðv"BGg AxtcCå\H"oçT< <:\H"<\,!&1,!A!! .$pA <BA!)Y~b ؂Cا\A ;^.BAx=b YD\,".$g u "I"ϲ(EańgX "'+cg&bg="`$R gzAy@:D <'RDgO!Y/!Y$"h{PA{@X( =±Yo A{,,7B1Y!AyHFY?E:"w5 =Ā,BO,#|H"0VAx.D" "O,^ AQY^"<|/H">O2Y7g%rohAz?$gZ- <<[dgRb oA!WENpC >, xxA| x "πC)CY"π'xA}ɼ >\,R g&R gC,A@NAz Yw ~AxMYļT< .BAx'R gPH <H| %dg!E"$g$>*rxxAx/.- < G < wg.$gT< <~ E?.2.pE?BH| C"T~.EkYJ\> < B_ YL?, #PECCb `dg`?EQ,jx "FKYÿ.- =ExxAz0Az0GP,b? Y@Y\> <_!Y?"^.E/, ~OC8 .$gHPAx!YR.$gHM\( <BxAx.$gO(YYGY& E@YTMb YT\H"Ax.$gP%x|A|"o E |A| ,A Y ~.EAx\H"_ YVGYVx Eaߋ YV:pA < $gXGr2'!EB0P,pxxAx8_H"G Y]Ax1p,, Y .$g@Ax|\H"(_Y[,|\H"(mAxG.EX|\H"(:pA <,& Ebo"0;YE`AxMAx-,.<\> < 狂 Y\\H"AxWeY:pA <Gp,t ^.$gAyIAy/" EA EA|\H"  ,CpA <#$>pudgxY~*r*E!b YFP,S 2FpA < ,2 >.$g0pA < pA < / VCf@C/pA < A!x"b I\ "B_"x.sYY?\E@Y|\> g$;\E׋,|&\0 <\E0 < gw0 <Y [`AxuE"Eg#d>)²e?C .Eп,4A!9Y *Ek B^.FAxB/9YT< <# <.29p,;|Axk /E' <7CLj"b?,<.2g_giMH|HC{,=.FAxz Yz#Y ? "^.FAx^*r C ? !xAx/ 7,> ^.FAx=H|Y~)r2@NAxxAxD~*EJ\dgP# <"O"" HCcˁYK' <">\ZAx Cv"5P,@.$gOP, |\H"#|AxF|AxF~.$gNA! "_E05PE0Y"Y?)H|#"Mr2Q' <g#"mYo)H|xY \, =' <g\Ig\k# < 8qNH|#Y' <#xAxG?2²^XH .< "T< <V "BP,x Y(_X,V0 <%,<\,"P±Yq׉oH QoHvE"vE%~'d[R!xoH:;"wvE"-)'d[R'd[RNȷ xoHB;"vE?[$x O[%x _[LB`*(P@M0 P@O0 &oW`* [ (qo0-(qo05ſs@#(qo0€G [ 8(qo0!P` |(qo0(qo0|(qo0(qo0(qo0 >8 8ſ [^xPa@# ſᗅ-/%ſ8€G@# Ǿ8?ſ~8P}@# -/ ao;ᠷCt-6B з y oᰍvſзLEз$-6 _ E[l|H[l  [4x AGoW@|-ߎC%0t-KĠ-%[4[€ ocB_Bm ſBoBwH-: ^ߎKRBзh? B>@hW[4^Xh qo~: Xh?  oBFAo # . Oo%To P-BOB[IX(8~:8V08:8 +6-pcз°[_t-pGзߎ ,[;t-pׅ_Z _з`?B8зi:t-p!Z68!8 ?B7o』h68 WT-p O[  AOt-sZſDE1oOo㐻A9   A [_[/ A[OB!)9#t-rK[k[aXs[`[B/x`-rзfſGCEDB%~+ D/B aطȇ[xt-rB-r +F-r [#:9 >+@Jt-r+P$:9 +B!;зȏ & &xſ ? &"ɂBɌxſBɥऄ[2_-T-2t-cE:Lx)oߎ~ M&'t-u4Loɇ#a(`зh|X ſ:LX`w[0TÀ5Z bÀ bÀڋo[p 7o!x[p<]aoIRL-W~Gqo!ؗ?~ 8YN,~XaKb<B#[AF|Hb_KX:!6A!>1 H'! H7/ljD@) XB*~%<(A#x?(#PK 0 P++AK(%1@mo|(C{€u  <&xPX#xPPpx&&`wWM, O \4 $ܿ`Ssd?Z_ŷľ-7aŸXŠ-,UЛ+l.vaϘK0b0105kĀ]`#eHy<%`O|)pxWxOx,p;ck.X_.pIw'. /]px. >[p I"p!b# |Nx/b < Uk üx/`}g> [f<ǂ,ؿġ<`x0 XUO0aox` 0WX+2Ş-;ž5 /߆ay ןO%kx`#<__0%?|hu|/ <<4\  k4#c_B_v7aؿcq6M|ɼaexu6x?lGxMx&x |^xk^x _x|^xB/aB^1x^g^ F:^ Cn~ o׃$fo 0K0`G$<[pC|%(&owYo_ I¿2$>d.^dx&&DȄ<x PFx+ x[pW&9x\'OpK¯ '\p < `, w,ełLSFx ńo!,#O,oK1`M>  r$'xU01Og!'-M< pM. aW~)T*[x*#o\]6DP뗅"/|1><)?wd> xbG7!7)zJa_5H9I-+Wg0VR_1C2<)yo/d?AN}MO,Q[Bl+⯠ ~+\}^b}1~cSza 1zh~BK&o9Gԇ!jz7:_ YP^G_4 cO40myGhG>]zaǪި<ßT%c/TGݼاkͅ~lS,up#a{=̈́m xcX__YL =`_Y aް? <ˇ p+?<8' &> &OO,*x( ),U Y))x*q!,'&> p>O¯ x(XWWdaWHp } xdY?п-C,Β>txyo::q'|KBvxtMA^a_s|oaw,\x|S:pYFO%<4 B\+ |40U᠅ ,6 |4,hp%@J> <aW _,3 c̗x3 xTf >$f/&QN .Jc |_<2GY䣬-[%WxD)?]<aW)bx)^ > |N. .4Ɓ~ ߃Os_4[4p#h;hch2 nCxQ|p+7MY- ! p8 'ȣ.ŸGC+*5BnC!a&y0y00?K |xV_6[ɂNC0M ؛tr\Q6xn? )b !/E B:! ?W/w{`.Kp]7ñ~^/l߇b<;%aS-K"lA! y/"##+? ?@-e q'(C D8'P + 9xX o K,W,'-#' o F!xZ?|)򂼷&-IA[yЧ-h?i[ЇIxZ?o A[-h Yo![a_HBxxa:+7: o + oFeV:0]bXN[`x9x_-  YolC|!eV x)!@ E_Tx)!-?IJ M-4|.x*-o,lInGpM %e /P 9@%bO;x0 @ b @]EcBN-w?!v~+`9RMxx{H)}| B6xHKwr? <`dA6i <ÿ $BL/kTփpxP?ǞA| 6=*5* |"L/_ X|$>+A< x~w 8J0+`cV)?< ~dV5Xs+ < qׁXX< 6< NK/y_M5G7?Ex ~V&wK_-#Xma~Wrż~X2Go+?2+ł+%```VX,,0X-,a_b_a`[X5, | 0,߁aY`cX `B-/Xρ`G,EXKO&OG,kLY_Yc~ -Z/,hdX2-`iZ~'x9`ibß#CbqσX|߃J,?!``6.E\KB,>%蔰At?,B` &>&~ƹ/x;XE>V0 /u^1^px&/x v 6߁xK| %0灅< !Ǟk N | O ~I1)ae$71&;u"!x! J'a! 0{Xe'2\x`8 !a0+^"@D`y%= 0 ? E@o|~AvO%0 x p #1d <^A A#߁Kp x0 xp@319`f11.fx<o`&x1? -$>|(z 0Ol*zO|^G[W x5Ş"8 xOZg"//($OO|"xBM U <*a_$xZJ-pU W X xAA 1 p_ xa |_ π$'^/~m?y|߃> ;`;= d~ 4| 83| X> O|q /Rq #K>_- PB|h OBl(4G@w< xlWhq_c0_xa<x,_j5x5C< A&5,)5 $%_#PIXs8WX:W5 /Hb_@aboB\)$pQHO XYH | ,$ x|/$ xw _^ <~9l<~O/K=?-Ol׏N'7J&xJ)x%2?Pux 3%iJr_Pd9o`y< %&QLX&&|M?aF  Gdńe<`||(l Xщ0ъQUz9bFaw`z0111.b6z0ף_~/& |Q3@"Q.kʉʞ/*|*\$`ʂnQ|/^@᧐| c? qLmo. <>Cῇ >x|s?-wIKS?G6 u1 .nx~/9Ɨ?%~?'/ -n#W)8X(8 u~  Yp!1p x,/8'xV ~ D09`9r9~gl |F<F<Cm?֧<߁^<B_^!/;Ma@@ < lM14.ƾa o MtcBOtG>C\Qtx!¿xX `"$wJ&1o3C,/ XY^D /ce!8K{QB7 w!x>lxB Ybpg8sX_p].<F <^~`>jcmf|x+;~`k% '>+ | Q|Q|W| X&g)?1g x[.?_~/?X x|as(".~C.F~Z5Pu"_(K/7;`="^xZOgOI@K/ aOأ ag | WW0Y0@@,/@ J/!F Av <F1JX$ |C<Dc?^HfAW$ YnaXxFOxxF\30E^ <Aƹos Oؗ&?o`1x ^x+ <a?>" Y,A9o X  ØAx p]aXaA )(^@a2-Y<|+ <o$oO?<|kA |@ u 5 AA# JžB>c*(PY`*aT9R|GxCπXQ I% XQ,K -) xY\, ,> OŞq^ |0[>pɳvw^. 0 Xa xl6 |. Y 9>[8 <#xGX(Wp>+ 8]&šOxK0M0G`0QWd/̰Ux2 A'πhQ|F3x8. 7k1 X4 z^4x+O4<A?hG/ L@#/8@s|$= m Bo $8@E@K  ;s@ě?{65xɷaE|l&a?!M'C%maW(C XY8(~~ |`85_p xY1opf< xF +> |$q`9%N^V$21I ~GXH^AwH<{H !xI 3D|o$ɼ a$ DS/@ 'D<x"C!n"o| bO|/0M>&S Qثao?|Cgp1oX >}_q pIsz/3 ?C@/z I<ǂ** xbag x%`10k. =0Y@^|_K<7췏CaĞ=Xǡ |zUЛ^= WF*0=>YBŞ> x5 .jOxk^[7˖O\', ˖OX-@R#.[?rr)\ğ',7.[?f˖OpC~yI0 ? _e@/߉?TCXnIpoğ*!P>77I0 ? _e[gǟCOḍoğ*!:poğ*!n;-D? /߉?TC!}s#v['@~$Qv$v[''>7 YI}%v['<;-D?$v['rLHL3 7~$QI a7/߉?TCbBagNO䘐fn;-D?``9&$&~IuǗoğ*!wÁ&_el~$QI a~$Q`Soğ*!_~$QI av_e^I߿2;-D?RkÀaoğ*!XKw_oğ*!,7YI0 ?O䘐fp_eI_e $Ą0Àoğ*!1!03$v['ǖ8XBS8,Io]H`e^hȿ_q|?q|?/owq|? 8//zi34uM2_[P长z7:d_[3q|=oDΙtʟq|=npq|=n4zgL?8O,Q_[:;3O8TΌ /:07:kg}_q|?yta3_X#`_/8GF9_o8˧_?\r.8ˣ/p0/#$ow8MS{_Po_P./(PG_[тPzEN5_@(q|?,/L&_ ?7_=/LO/Lq|?5_`'5_[т ßG_z:07O;8/8Nq|?"_ AWq|?" MR8/Xc_TM_Q?q|?Aq|=nqCT _P_PT )_P?*_P  ? 8A?/Pq|?'/P+8@ + ?+9_Xi_[o /_X_XV#V 8 82/K?)C_%/Qq|??**q|??**q|?* T?**/w8X A7q|? E/8_ 8P  8X?c8XL/Vo`./M_p)/\\\3/8/ \8./\$8d @8Šw_ `I_ ]1/p\[8/8+/\O-/^/1__ q|?}_4W_4?M_6j q|? / _6:/x8q|?=_I/x%1%/b1(/b881 1wq|? 1  Bgq|?,!;-qP6lfe{yqop"(s[-8Yw^@`?qy"(G^ 0'I^ && o~-._€LMOW?G^2"?<[7XG?oOXC/ hP?zqyV:AqyWU3? ʶis^Uߏcʿ0ߘww@#/*`_qyWox`qyWO ʿG,qyV:Aڪb8t-M^UAp#/ Dqy^DPQ形倷pY1_X;/*bxp}fʿè򬉲4o"m16[-X|#f X&O¯/&G^2"?oȊ ?xo7^W6[6[0;/üH@[UWa8dE N[-8Ap#/ ybXo7^W6'eC9`Uo/C{e_88Ap#/)^ &&O|[O1!03췅/`Ȋ ?qx7FJ//5(K/p-B"qכCJHJ-˅_W/?q|?ȃ_ =_Gq|? ɏ2q|?%/6/0+/$zL:d_[&zU_2_[X8gL?zt:eO88t8Pq|=o3S_偧q|?(/_[t`ksgFiziq5X>/8:0,K/_[# /7_/. ?=/*s:0M/ @S__8@e_h q|?6?u:0Pq|?_Q_X ``_q|?zT8Vg\UX%'/q|?/?ss:06q|?o8?E//_'///`&/V 8o_oq|?,/^\_눿7q|?_\p_o  /k_ tֿy_@8΁Wq|?:ttM_?$?? CU/ͦt`n 82k8y_ Wq|? u_2 __?. !_&S8! S8D/zٳj(_[т/u:06s8`_>Gq|?F/ 4q|?@_P4/?jj 5_q|?/$lmO ?o 9_ ]_S_47_k_q|?Bq|?@4 8?Gq|?@*/o_q|?8 8)q|??9gq|?L_8ɂ&LLw8ɆL1Gq|=n&to'!Ff ^$@ <C/?DPG{ex*q|qyaהqy`1Ҏ/ LLLɀ?#ʲ"?!$8MM roB | | |w88> > Aq|?P(/$ ? C#/$@+8}_H@E/$'q|? u4t2;-cZc-._ˊ `āq9-彲假U M?T*?=tq#/*~4c^U%/*~~ AqyW$/*~ q4qyVDQ@?k^ &&Z${eOHقm$!/˘/CIox*q|qy>8S3/*~48~K^Uy#ʿO8"( Q"n8"m5!0!`p2 >B8dE`#e?ǏrLZ8^e^@~48~K^Uy#ʲ"?>8A AgG|?򼉷?eB hq Nω$?%8dE <[ 

/8:0,K/_[# /7_/7q|?-/q|? /q|?!7q|?8`&W8`K/b8a_[т/FA_ _8 ?K_AOq|?u:&/1/_!?S8d_!4`C_FS_q|? 8q|?8##q|?8D/68@q|?@88 8D'/k8bq|?S_& !Oq|=n//ÇF/q|=npсq|=npс?ΌS8¢_zΌ%_$?_[peu (q|?t` /$t` 84с_q|=ni3T/'q|?2//08s/?0 /?'q|?[8,ut`_}_[т/8y q|?8y?q|?_8x;/Gq|?Ooq|?*/b/8Xq|?.g8X?._hMAq|?pG/q|?5/_f8Po  $*ق& .=^2"?A-\?D8AcDqy^D۟-3H.#f ¼H&`* -w\Q y^ #98MM,K-QG|`V$ ljL__pq8dE Yol?D8Aqx7ț/+țs`]@cńylr?U/C ro:/ dE&Dqy^D۟!{eI a"6_emKE&Ow^ P^ &-B(U!eo* Y ICo]]_=Goǟ#_q|?'q|?u_8G[_/ q|?q|?tq|=nh&zDΙt:d_[3fq|=nGL*ægLy2, ?Gq|=nh?zS__[:03O8XH뉯_/q|?_XF/ф`__q|?zމLq|?.q|?_ q|?C?_E=/q|=nF /___g_Oq|?_/#q|?t 0_c8 l,/`5_[HS__gq|?A8(8( Bh倄ֿ/q|?v僰%/`}_Q_ #/倈 ?D`"_C_ ? . A Oq|?Xb?/g8,P/@ ̅?fLS8,/q|?YC_d?/2́q|?Y8,Л8,c_h2/4fC_l8,c`/6̀_lg?q|?YW_p0/9O;_[CKx췅/%W`$e|)?-Ȅ|[9T&g8? h8^ &&1彲P([0\υ uo,!wC<|BfcY5^@9G^US3c^Ucʲ"? , "n8"((%2o?h򬉲Cțsv[-dylrHA-'/C;{e/pyAG yoh#x򬉲'{EDPQ-LqyVDGꄬ[o"̈́l[]u3?ø򬉲 o9D۟o8[0\xK @)"(s-,K<|BfcX3?ʿHb,qyVDQ⁴qxA#xo7^W6륖/ قp bq"(solaU =/ aЫqyvgqyVc^UF?%/*Ȋ P6//ho7^W oMV9m^U6Qde&2 olb ; 

)DP<o&>yʡ3?Q,:G2"? ,: _"n8"mxo(<[0\ ɼP6 @WDPa[-\_˖I/qz<Ѳx!eoğ*YH/G`0^2\O ,N/G`z9v%eoğ*XğFxIr߉?T%¯//~$PF./G& /~$PFqz?2^ '/~$PF5/G8P !)!Lg\.倍7q|?XF`#c8,`"/_?ð/?ñq|?Xva`8,;:e?863q|=nΙ_t:eo8æM:d_[3fq|=o:2_[:f_[t?8)/8掎/:054u q|=o4Y,`u_ozjLq|?X%`K/фp/qq|?a?/'q|?Xva$`./<1_x8,8Mc%?/ _d $/!8,q|?X< g/>hh __kzѣJ ?Ȁk8,o!q|=nGFd@ /"q|?YȀ?_DU_q|?/͚:+/c8,<凋凃_;/8,<aX_,oq|?8,<Wq|?z)/8,/)/6q|?_5__ M_ .?  ai_q|?Xz{8,=o ? / _4?+_4 /dy_`% q|?8,_q|?X `&q|=nF '_bO$i--`/ֿ8- q|?P./q|?Py_;/Tc_`& /_Wq|=nF /88с_ɝK8, ï7q|?X `'倜=/88,//q|?X@a8, ? _q|??`*-_hFh@8- $ /B!8-Ђ?q|?Z_Gq|?X 倭OT;/Xq|?X_`p/_@c8, q|?XAau(pH#ev[0Kch|Ff Ā/ Cq9 $彲 ?ǏrLG? ~UKC^@z/ a =qqyʿcʿ%/*"-_XA#ʿq4qyVDQP$?X(o7^W6F{e>[0\ 'F .G^2"? [/眪3Ʉ^Q qyԎ/ a#/*G8 Gb8"(c,V2C/pyn2- 0/8:0,K/_[# /7_/. ?Z [?""q|?X/?`Z`- ?`-_ȧ8,g_!q|?Xq|?XB/8,!`ΌW8,`c_[pE\ ?\倸q|?X8,o/ ?`v?`v;8,-/ :0UO`1/8t`U_87CN:03?ba q|?XC?N/LjC``a* *%/8HQ_֧q|=npс??_://?  A8,"c8,@8,Aq|?X A_"O@8-/_Gq|?X /`2q|?X W_08΁q|?_1q|?8w_N? 8 )_0A/8 8,`/$/< ?q|?=q|?Xq|?XG/8S_q|?X/8,E_샿o8, _O_T_3_r 8\K/|_8W_//| gq|?`_AOq|? /0 ;_` /q|? ?q|?X /[8,'8,_r*/ȿ8,c8,s8,Oq|?X w8,џq|?`Rq|?X 8,BBGq|?X!`q|?X!`?_`&$/8./:_`_8,v v7/ @_ė8,`/ H`"/<2/<o8,8PٳCCx췊 bylr\@ĸ+`q9#彲眪3֎/ L qy,X?%/ `q_X8<,#ʶP"?zqyWպ^U1u3?8"(|_Q"n8"mƁ?-,|jG/[R߅cP _C ^2"?9T&gdɄ#? # X!#&/ `q_X8<,#ʿC&/*@f~8jL1YC7S3ʲ"? ^ `ߩ^ &"ro?C]^U6Q4[-%D۟Hro& |lrX +7 /co/C@$>yʡ3?Ø`8AWx7?cDqy^D۟%(02>[0\ )]Xk /hL#G[<|Bf~XG?&|;/ XC/ ` `y^@ oS3ʲ"? ^ `G^ &";-, FY qyVDG<[6-,&lr|JB`E /a#DP㐓E<|Bf~X@/ L hcg+/ `ʷ٩QYDw/CG|?򼉷?&k-,y0/q);`)DP6[-X9T&gqy Oqy,qya8 >/ `ʷ٩QYDw/ |?򼈠,[ FY qyVDG-,Mn#eE``9&$&~a?/B  »?Xgj8`<Q"n80L-B2^8o*?.[G`-B1)ON: !)!0g\.xx`<x`<`<q|?X/8,Gq|?XBe_8,:fi*tq|=nΙt:eo8M3Mi2k/3O8S/3?/:f_[`i_?sGGfizсF8G\M,q|?:/7q|=o5N&k8,%Hg? t8˃O8Ȁ8Ȁ%_ Oq|?X/q|?X BOq|?X @倴`r)/g_ o_8,! /Aq|?Xq|=n/:0QoWq|?X (&/!8,_`C_`/H/}z`0 8,t`q|?X-/86т?8,K_ _8,< a |q|?p8Y33/P늯_g_;/8,U_[сĿ||?~?~5`? ~?/`?$/`?7q|?X__J/R __` q|?-/净*/TzC_E?`=(?D`I.?`@ p9/o\`@ `@ >/L p&rq|?X@ _}__[L?`Aq|?XA8, '/K?`A0$/q|?q|?8?:?GF/P(q|?X#k88l`g__!q|?X 8,2` ` ?8, 4` H "/Gq|?X`8,?ÿ@U_92?$2I?"`D"S8,8,A_Aq|?X8,Y_@y_@`D `DA?q|?X8-/t{_ k_8, <`;_`__ A_q|?X%J#QJ!8'x췂`LJlr V%!'@)(:/C[-ǏrLQɄ#z8SF8`oX,FZʿJG#ʿJG`>8"(H,{8ME)eP>8ztqyV,1^UC\GdE"形P(򬉲e&? &b[rLHL3 9/_"(H05oP|!G|?s<-B"qכ@_Y I?w,_q|?X%8,Oq|?X@g8,5/)?q|?XQ `Ewq|?X@)_PF/( >tq|=nM:d_[3K8L):fs/3O8S/3?/:f_[`i_?sGGfizсF8G\M,q|?:/7q|=o5N&k8,%Hg? t8˃O.Q_>//|q|?Xq|?Xq|=ngGfg_[_8,q|?XK_f>W_>?q|?X/|ΌW8, @ @_`8,__./`A?q|?Y/%@ _`8,Y'q|=nmcfX8,ğH3/ӿ`Z`Z _;q|?A8,L 0b` 0?/d_`FC_lA/6o `F8,O_`9/@ o?D8, :0Qo'8, A+8,28,"Ŏ/!/*t`pq|?":08q|?Dq|=njgF/+/_`Jq|=ni3T/PsG -_($:04k8,`8,h& ğ`_8//*/M_[с@O_x8` (/ _xT^^A8,F/!/'@8-Q_q|?Z 8, '@8-?_@c_q|?Z _ !_q|?Xh @+/F'/dq|?Z0[_ѥ_F?h?2?aq|?h/#c #/ 8`Aq|??!/|q|?81/p5/|oq|?$p\O\F/q|?"\\ _p./@87q|?`&/D=剀8,@!__zC_/U_wq|?-/` ?р_8,S_%7q|?_/_N|g_8/oq|?_|  oq|?\8.Xq|?\8.XA_,`[-p1 I4qxˊcDqy^D۟ 'ea2ق(P B?pq9{e\'8A)&/ Lqx7ț/+țse:<`(P E`$xQDPo?A9/ pøDQच8A_|?򼉷?C{eN /-._% IlHqx8Ȋ?-ȿy^ t:0Lq|?Q_qy˅qy˅~O^@Ȋ G?U8MM80{e/9>[0\ġ@ -# # Gol?^p u:0Lq|=nΌK8.78ɄØ 'qy˅8qy"(RM^ p&qqx7ț/+țsp5{e'%bH^2"?' olkɄØ ø ' I4qxh˃o7^W6 [5|`üJ GCG. A/C-iqy"(RM^ pZ6"8MM[-N-._ag˂"q"(s>[-_p[ØDQच8Aഁo7^W6췶[ 'f `?pZBDP e0s^@q I4qx~ 1"n8"m[ق'Ġo?pZ|HG^2"?(+{e. @!s^@Ȋ G?\.O^ && egPق(& @,/\Ăqx8Ȋ&彲i,9/ dE I.".qx7ț/+țsEyolUOA0ZHdx/CM?&c\8A)&/X^ &&[-Ncقq(&<-`$2gĤ"(sA[-2 cDh%Yho7^W6섌[/kf ;ĠG.$%DP roo} 8A)&/ |?򼉷?iL['f ;Ġ,/\G/C-pZØDQच8A$. #Dqy^D۟!eῴ#e%A #-qx8Ȋ?1p8d '/ dE I. q"n8"meqv=<`ÜJ C #/Ceu39/ dE I,V Dqy^D۟|[NقbPL?X _ "(s[-ɄØ} 8` '/ dE I. #@/pyn#彲Nጶ`X) #x& q"(s{e&c7T&ø+8A)&/)o7^W65'pCf uA0x #%X,/\Z.8dE:S-Š9/ qh!~2"?$%F/pyn:o7OA0|Vo,/\ZB[-qyˋA 8A)&/wB/pyn:yol9㠗/>%"X,/\Zq"(sN{e?1.`Iw^@Ȋ G?\["n8"m oypylrA0 |V˘"(sCl[[-/\8A)&/B|?򼉷?t'eR <ق(OX _%G^2"?0-0s^@Ȋ G?\|^ &&)/wDw #0|PO^2"?0\cDh˘Xu^ &&F[-ߖ/sDhH"(sا-.`߇1 I4qx^ &&v[-G!ق'Ģb/_X _)qx8Ȋw|['?1.`߇q I4qx3s^ &&vo b6[0\bQ5|V?qqHDP㰓Wqyˋw8?({e oق'ĢaCG. /C&{e/a8p8A)&/."n8"mϏo )/XL@X%˂|RO^2"?>oC˂k_q|?@W_ A9/ p\_q. 9.[GH eo*#o.[GHwBrߊ?T' J|rr\ ‘A/~(P)'Bn_˖Q?Rr#o* ql-B"y0/~(P)rߊ?T' @Arߊ?T' A/ɖrߊ?T'^L1rߊ?T'ߓ.[G<;rߊ?T' |uON:*c!)!C?- p`S_ C/˃ G/ˆ8. ?q|?\0./X长zY2o/6t_[l_q|=nfq|=nL*ægLy2, ?Gq|=nh?zS__[:03O8XH뉯_/q|?_XF/ф`__q|?zމLq|?.q|?W_ 8.78.@?_?/ 9/ˀ?6oz9Pq|? )/ˀ 8./1/ˋ?qxPI8./_K/˃8, _" 8,G/8;_!q|?\pbq|?\wq|?\_[P`Zpb?8, Z/w/?@8-=/ˌ8.0  q|?\8F/6q|?8? @%_E/ˀM/;8._a8.c_H8.m_[тFC_@88с`?N/AOzF/89C/2/$t`H/Xc(k8.?q|=nU/:0Qo?sF )_6q|?\7q|?\ u/ˬ/?8.pO_8,/˜K8/P8/P/@8/P86сu/Hүzj-? t(/ˀ)/ˀ1/ˀ:Q__p'q|?\@_8./ˀ:pp7_q|?\q|??p\r2odA/Aq|?\_P#(?5_$q|=n΁_ov[(G/Q0#x*T<qx8Ȋ yol1>yʡ3?. G?&|1.Hq[GdE 8AW^ && 彲I a-o#`Ȋ Dqx^ G^ &&.[GD7Y I?w.H8.H?䀓__q|?\pdg8. ?2c8. /˃!8. _@o_@/˃ zi$tGL34ttq|=oCLz*tɯ8gL?zt:eO88t8Pq|=o3S_偧q|?(/_[t`ksgFiziq5X>/8:0,K/_[# /7_/. ?ð_OðI/]_x*/W8h>/F/``Ao[_ 088. G_l#l@/ˀ?p0/ˇv/ˇ`8.k8.C_8.0_q|?\`%/c_ ?8G_(?@8.Prv""+ _d{_f"q|?]I/q|?]8°m_h_aF/Wq|?]q|?'8.?8.yʡ3?@Ģ9_/ˇ_pp;/ˇ/ˇ38.8./~pq_8.q|?\??p?p7/˃p/'q|?\*!/P8.=_?p' _q|?\ /ԙàCx*0(.\/\ !^2"?0^vʿ1YD|qxdG|?򼉷?[-Bc¡yl%Cp~!B{eˀ{~hAqyˁ8% c  (?/ p(x G4/;TR/*~wĪGp( |JqyVDQ_^ p(qx7ț/+țs@{e˄ Dl`v_˄lJ*oC/.DP(H{eˇ_5S38.?1_\ cʿ78ˁB/.O>/*9SF^U/p(.x]^UA,?\ E/pyn|[?(Cf 6ġi\/\ Ģ4qx8Ȋ@k Ȋ  p_o7^W6 olp < <`.)ġj W\/\ GAq9ol`uN\@ NQ 3_qyW1_ GdE .wDqy^DPQl[q_\@WĠ8"lA[-XM  >2قGġh?X_p?qcb8q9ro d?._p3 fq|=nF /qq|? 8?:q|??倘8`Zw8, @8, @8?r/$t`/؁_QzO8./,t`pq|?\ ?GF/ˁ?8. ?8../ˁjԧ8.!/ˀ, p" @8.A_;/ˁ_p7w8._pw_p7/ˁnn_ p `D`Dwq|?X+_@_@K/t: ? +_ k___q|?g?r7/2/x&<J (P冡8, u L Dlx%1 5ق%X]ˁ$彲

yʡ3?]hG?@(\A8.1_\ ~K^U5ng5/*sqyWO^UA{^ bQ8ME形 S5cʲ&?形;"mc/ 0`X.'#/C[-XU j@80 &!?@ R.L8fcʿQqyWպ,qyWE/*oS3qyVDQqxJ{^ && {ebBag+췐G/A{^ q^ 0/p@o*@-`yO O#rߊ?T'&Y.[GD7BRCg\.DpEp_h8. oD/@8.?/ˀ4? _p:_p:K8.Aq|=o4:eoziLLsfΙ_NO/X8gL?zt:eO88t8Pq|=o3S_偧q|?(/_[t`ksgFiziq5X>/8:0,K/_[# /7_/. ?z*t`f@=__q|?\_ ?tp:q|?\8.A?8.E@$/˄pq|?\ ?Aq|?\ /TC_7q|?\!q|?\!8./˄0'/˄0?/աт/ˁc_[4t`iOp<sK7_[сxzgF_8. 8E/ˈƿuMpqaq|=nngF _/8.#q_8.#C8.#g8YC/˄@W_q|?\" y_  7/__q|?( 0/˄@7/˄@>/˄@ (q|?X=8,@!_=__(8:/B?q|?\;_p?-_8.q|?\?.g8.FN/p5/@G_p ?E_톿p 8q|?\#q|?\#78.#_[тƿ#`I_/#q|?t _0!/#)/d 8Yc0zGF /ˀX ?s)_:09O_q|?\#q|?\#gq|?\#g8./ˀaq|?\8.4/ˀ`"2?p 'q|?\ $/ˀk/ˀh,/4 __3-_q|?\ _0?/˂/!8.8.oq|?\/ˀp8p/q|?\pq|?\ 8.B/ˀp%8$M_ !q|?pc_AWq|?\ g?}_@_pD8.?q|=nf΁_ 1o, lrXA[^pDP #{e >yʡ3?. G?^+/ r~G^U:Gu8@5P8iU _\?m^U:p8ˀt˓dE/pR8MM?[-o䘐fr;-/A 8A8pW Dqy_=`ON:-JH?w  :q|?\{_!:op/ˀx8.<8.(/ˀx7q|?\ /5[8tɿze5*t/4tq|=nGL:fi*ægLy2, ?Gq|=nh?zS__[:03O8XH뉯_/q|?_XF/ф`__q|?zމLq|?.q|?pi_[_?/ˀx"Rp_J pq|?\COz5O8,_?p/?q|? ?,,G/ˁhJ/˄(/˄`u:0Pq|?\5_p!pH k8.%`"q|?\@_"/ՙтjȄO_p Fq|?\d(s8 #q|?\g8؟q|?X+/n0?/ˀq|=n8Y3*q|?\`W__Fps8.0:09O$?pI#/˂H{_$pq|?\@_$85/8 $B@;_8O q|?Z0>/8M_8P 8.AWq|?\8.E$HHA//?,//?p/ o 8 d#N K_8 s)_  `A  o8, _ a8sΌ+_ 8%88ppK_q|?\A;8 _p 8._ O <pp,/_`,/ˀQ_h__l-_p?pq|? /ˀe?p08.G/ K8/q|?^ 8/xq|?^ +/_x#_?8/_?xx/a#8!88 8!, C_)/K_8!,!o83_!/_[CoY?(q-._A%`xW!,DPnol ǏrLZ80Q!,#zq!,_ʿ? `K^U%[Gnq$qyWպ뉣ʲ"?G?B\Me^ &"u5MO\S^U6Q@ ohMIro ?5[0\kQxE ~B#Gox* pw^@.'/ p"x5^@ Q ڙq_B\3c^U%\VfYDգ,G|?򼈠:o%8"((N[-]#M^U6QAk-. ț( %"m@{eˀ`.(, W^__PG^2"?C[眪3.%/ L  c\\qyKohL8!.1/*O^U5ngK^UA-Z8AG|?򼈠)/h򬉲@{EG"m$e]E w^__|1{e ?ǏrL80\5/ qp!. 3?ʿg8K\VfYDգ~G|?򼈠G%8"l<o6x Yole+xf @`mUK["(s=eo眪3.%/ L  c\!.Oh qyvgqyVu3?i^U$ qyW %/*ϳS3qyWp: [YDգ,V 8ME@&形E/Ø򬈠-,!!dMYohrMYohr&"[±/ BUH@s$q"(s>%{e9T&g\K^@A.?!.Oh qyvgqyVu3?i^U$ qyW %/*ϳS3qyWp: [YDգ,V~:/pyAG~o~dEQ^[-X!!dM2o"[-XD۟DC{ebBag_e j/BB= 8M ɂF_˖Q?(dž✿-BP ^L\ @O2\ °c?/~(PȜuhJH+L˅_ /H@ _'8!!8,b?q|?Xv,/s8,;$/? $$"?q|?B$_ayʡ3?!Ʉ!(e!8 #yH/ n#/* F_B w8A*8Ax|@/*tS3򬈢dC/^ &" [-B S"qyVDG'{E6olπT%p@E2!ʟ_Sqx8ȊŒ[x*#G?&|\Gx!"8S38%/!ocʿDAu3?a/*Ȋ D8ˀȟ8MEX#形D(򬉲.oo9``9&$&~{KE"qx ^\M^ P%qx7ț/++~_˖Q?V xnGO-B xn_˖Q?8ьqd%$?&/B /,t/:fs/CTsLu:e9XbzٚF86t`fq|=nс/_8?_,_[S /8, :0.]?Wq|?B 8 )_?0 08! 0q|?B`8!;/@l*/3 ?x?@$/Ey_[3/˅ /Ag_8!- =/6t`1倸I_Gq|?bq|=nhсb88!  (/Y_DzSg\M`?ԙ!#v[8 G/MĦ??2"(sO)>yʡ3?cB0% 8qZZ!gQoƱYDi^ p&+/pyn6[-XU#f #ؔJhB!yn8dEo7q|?L/|q|?}_+8S_q|?X|倔0 J?`&倚,q|?X ?g_?8, Z/w/?@8Aq|?@8YS倘m_q|?X?_,o8!Hq|=nqC偼s:08q|?X_`nN4/8{_p`'q|?X ?`(`(9_%_/ ?Gq|?X@ /P?/68- o5/B3/B_hO 7q|?Zh@/_Є?Vc8,j倬_q|?B 8,/8q|?PF/ 1_8!Pq|?B8R_x췉ق!bP^~`1*qx8Ȋ5{eD>yʡ3?4qy O!G6i4o^@YI/  q[3?f_B qyW k^UAˀ(o7^W6[!pAQ /Bp^2"?E[-眪3@/ L qyT _? ( ?n`GS38TƱYD)/@Kqx7ț/+țs-@1<`.?Ġ`1&%DPײom<|BfɄ/ p`)8n~!G?@I8vg8:_B5/*Ȋ Lqxߵ^ &&olI av[F DQ c,V\B/Bh$|? Brߊ?T'7ɯO)φ-B"qכ1Ő[.Cq|?BiOi_H@Q_Gq|?Bh @/M D TC_P8UCfq|=ngL:fs/ӡ+2o/&zމ34y?z3zCiΙNq|?X84tvfq|=nс/͝_[t`oyu/`8,#TfG//8_q|=oD&s8ˀq|?O8ˌ4/q|?Xv?ðC/'8,;wq|?Y8,ğg?k&o8,D/Uo8.8!T=/M?ᘍ_1_/`+ /$t`:/8?q|?Y8.p///_[ٙ늯_X D/XS B_q|?CP__ ?8p _d,//? /W?q|?B=_z᳣\d ?.'q|?]_ 8h& dd2q|?B7q|?B_q|?Bv  Hi1/@t*/  :./@uOX/I85/I8eq|?B q|?B _[HS@8( ? f /6 _`9/6 +_lz 8!@893$:06q|?BJ>/HfU_[6t`m_fq|?Bq|?B_8!5_/_ __/Fj#P_@+_ P3/F_q|?B/Cclll"!! !"!M/Aq|?B K8!4&/A8!8M_@*?q|?B8C_N/G'/'r T ?m_Cz3΁_ yoT /-._ˈx0x#?"(s o9T&gqyaqy,8`^@SqyvgqyV53?g4MO8"(up_8MM"ro  $Ą0Ɓ_e,D^ c0y`a^ & o*<)Ƞ~x췖s(.(G߅(\__.'A(!)ȠCV!弹oc\q Jr(.P^[˖ 6xE8%9C(¢|-'Ȑ @}Q>[˖t_+@;"t1(!)Ƞ@';-AG@wN#弹o\(>;"pGPxR 2;-AG<)o.[W)y(?8%?^ ;-AGuP-x Q/:|vEG"e [e(&P>7eow ?OȠ\!"e7);-AG2o.[˅RdP~.(!)ȃݻ␕o* ?=}۷) Yo.[' ?OȠ\(!)Ȭ2}? 2;-AGXd~*eo\(>;"p#PBS> ev["}Ryr.˅RdP~.(!)ȏ0TMo* ?;"pF!A O0Co* ?@ `-x"p^t!A NDR><+'xDR><+'yr. ?OȠ\*-ߋTsyr. ?OȠ\*o_⠣T#x \5)y(?*'x y|-)y(?*o2 ev[P#y-xQ/:|vEGP%yo* ?@A[˖p#p^t#PBS2[d$v["ex;"\Gkmv[km弹o¿.KΟA.(!),)6v[_.KΟA.(!)șz[e(&^m ?OȠq J a[e( a[˖\ Q/:|vEQ(!)ȝ@a-ߋTl!弹o.KΟA.q J #ev[ < 6[˖\g˅RdP~ !A O`x?;-AGX<-ຟ\(>;"\q J Fx`?o.[q.KΟA.#!A NDRк;-AGt.|-2Gq Jr#;-AGGt_p^tp"rCl~/PQN]m\(>;"\7!A NDzGo_⠣ȏ@RR-x.p^t88%9 `>;-AG~-x. Q) f̼ 1 sKweP]h.Cg@zΟnaCg(ogg)ntw 4}Awt `vqfi4Ay >M?Z(y7|ֱ@ZǛȚl1}cwO6D:șz}0@"e:}ۺ΃V&^`a >&^]ݻ<5o"" H" Ĉ1"" `}DL7bΔ2b)n켊 9z-ݗAv4IdVet/yƓI,1"" H" Ĉ1C0Δ/:P/X(.DEf^KweP]h|4Vev^E}֍&Yz-ݗAvu0OM$+2[/"E\>&YbDD$DAc*&:a( ^t^KweP]"g"/XeP]&Yz-ݗAv߀i%$DAbDD0>bc1yҀJx1e6)"g"e6)bDD$DAc*&:a( ^t^}LLd-" Ĉ1"" H"  TLtp/:PC/,c!]&r&^i@[]y0]2DD$DAbDD!nJ(eŗRϠi&r+2[ 62I,̽b}MM$+2i8mM$+2}i4Ȭvmi4Ȭvi:bDD$DAc*&:a( ^t^Kw>0̽b}Ma K"" H" Ĉ1"" `}DL7bΔ2bEw^x)tNDD$DAbDD!nJ(eŗX9/X@g<@i&^<!șz>v)}$'C2[K!<R_@D)n/D 72[K!>o"e0 6y9/Yn4Lb}MaDa3f^E|r&^ݙym!șz-ݗAvșz-ݗAv߃"ev^E}ֲ&^Kwy,<ȠoLb}MLcn>y/X 4D)n4 4D)n}Lb] 4u쉗R@:D)n_t&^@lu쉗RymZ(:72[/"E\așzȠo y/Xn]P>>&^Kw۶y9/Xșz-n@șz-n@ }ۏ&^픻}g}p}2}`o&^Kw>ϰy`ybDD$DAc*&:a( ^t^2(.u&r+2Av`xïM$" Ĉ1"" H"  TLtp/:PC/,b]&r+2EvȬ(n 4IdDAbDD$DA ^t1y҆^ Yy:~ 9ݞv L<XvldE- e2# ?vq["e;|w>>~ e2bDD$DAc*&:a( ^t^Kw)}$'BDEf^Kw)}$&I,̽bRHOi.4IdVer"By&I,̽bRH`(@fI,1"" H" Ĉ1C0Δ/:P/Xu&r+2[aZ4IdDAbDD$DA ^t1y҆^ Yz-w<&r+2[y&I,̽b}v.@4IdVesi%YRϷr6i4Ȭ)nۼ돐i4Ȭ)nۼ/w&YbDD$DAc*&:a( ^t^Kw۶y$LVexgBi4Ȭ)n;v_u|i4Ȭ)n;v&Yz-n@4IdDAbDD$DA ^t1y҆^ Yz͏?s.&r+2[ci%Ye.vlxAw\M$+2}`ohh0UJPي%IȬ)n46P>uir+2[ 6}͔q|i%YRϠil|<٤K"" H" Ĉ1"" `}DL7bΔ2b)n46DEf^Kwul|}M`fI. }#(2+Yƭo6"o <ݟȊ[(`v")n <ݜ}:}ن"u t;D}Gw.:șx(.my +Y mE-̱v$7> X+=# dw2y >M? >Ö4q߳r'O{0OE-]:>>M?4PỎ-"gO{0OE۾D)ny/ h}_QS 0` 0` $,` 0` M5L0` 0` $` 0`0` 0 0`0` 0`F ' 0` 0`MS 0` 0`"ALF 0` 0` 0` 0` 0`IUc 0` 0a# 0` $` 0`0` 0 0`0`8 ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????z}0@"e:}ۺ΃V&^]ݻ<5oe:}ۺ΃V+2[/"i4Ȭ)n_t&]z-ݗAv4Ivet/yƓI,̽bȠo@iȬ)n켊 M$+2[/"E\a4IdVev^E}֊θ}͚M$2[/"E\aW/X(.i4)n켊 q|i%ٗRymZ(:6i4Ȭ)n eymIEf^KweP]4Ivew2̼ K/X(.M$&^oz?}@B"ey֟ne.șzǘCػy/Xxεػy/Xxεf^]0 v^j v&^jE]20E]v>0i%Y f/DM&Yz>v)}$'Bi4Ȭa3cM&Yz>v>0i%Y f;v0i%ٗhgBi4a3f^E|M&]z>veP]0i%ٗ f4M$2}}Ma K/Y@͊_@ M$2}RHO0i%ٗ f۹M$2}}a K/Y@͠va K<3ym3Fg0pg4`z9v`z6npXx:$-=o-`z5@ ݷaȬ)n}ͫYRq|i%YRp4IdVew\aW/X6f^KwuiIf^Kwuli%ٗRq}\̽b}M~ K"/X@fI,̽cn>fI,̽g`a`xïM$+2`xïM$+2}f^Kw>&]z4ݜ}&]zM>^4Ive; 6^4Ive; 4y\̽b}Ma K/X@gBi4Ț()=ND<||"esl(: 4Da3b"By9/Yn/Dr&^Kw)}$'C2[K!șz-ܥP>>&^Kw)}$'4bLfy6>0"e8m<RϠi!șz<lȠoaDq۳/"y9/X(./X(.dLbȠoD)n eymRϠi}Mo"ew\așz-așz-yP}+2}2[aZșz- aDvm2[/"E\>&^KweP]h|4/Yym:Da3cr&^ݏs!șz-w<RϷ|RϷr72[@RϷx !o"es v4D)n;v0"exy/X(`y/X(!}qD}`ouoesl(: 4a3b"By;/Yn/Dv^Kw)}$'C[K!z-ܥP>>^Kw)}$'4bfy6>0e8m<RϠi!z<lȠoaq۳/"y;/X(./X(.lbȠo)n eymRϠi}Moew\az-az-yP}+}[aZz- avm[/"E\>^KweP]h|4/Yym:a3cv^ݏs!z-w<RϷ}RϷr7[@RϷx !oes v4)n;v0ex{/X(`{/X(!}q}`ouo"/Yym:K/Yym:K"/X.Wm\̽b]If^Cp]ڽz w"fI,lXzΟo-2wP>;ȟn?g2t}n ̽bRHM&Yz-ܥ@p]i4Ȭ)n/DM&Yz-ܥP>>&]z-ܥM$2[K!>li%ٗR_@ M$2[K!|}MM$+2[aZ4Ivew2δi4Ȭ)n۹M$+2[ػeli%YRϷsIEf^Kw><٤K"/Xn>B٤K"/Xn4IvesM&]z-w] 6i4)n۹K/Xnli%ٗRϷx !li%ٗRϷx ^M$+2[ݳ!4IdVexe/n>4IdVexfI,̽bl|}͚M$2[ݳ!4Ivexe/n>4IvexfI.̽bl|}͚M$+2[ci%Ye.vlxAw\M$+2}`oθ}͚M$2[ 6}͔q}^̽b}M`e\a4Ivesl(:6i4Ȭ)n}͔ili%ٗRp(@g<٤K"ﲄ}Aw<"e"(eDxP#ǐl<ȏ6y#g 7l "("j6l"#x|xP>>DRH @(mL nEaA> dGy N>yKw>Y4lm#Nn?t dE-ݳ̉Gw.:șx(.my +Y mE-̱v&XKw"CqՏ"c">Gy_tȜBDP9'4_tȊ[>M?g@z]:"tw 4DR߳lY4E_tșzﳑ4P@DnDRfi@wȐ4z-;$ ݞv E- dG)}D#|0k? k3+$bbb& # ./usr/es/lib/libcljni.jarst/KLI$$PK6T META-INF/PKPK6TMETA-INF/MANIFEST.MFMLK-. K-*ϳR03r.JM,IMu (hx:*8%jrrPK֊=>PKRxSlibcljni/MsgCatalog.classmRMo@}4㦴M)8N@ BXB!Uzc99vv88QUPx3f~ PƑG' F&ev T|N,Z%[]?M\$HċSLKIn┡rc(5öCJOYkĄRQg M}ty)ۅ0]h~T+,E.4jja,i cg_/LC3,WWvo8ϴt:DC\ >r6oEvW7x-uu=c8m6(&oZD8c؉S1@ d8 = lp EV'AbB3o`_) V ULF^5o}Gi=c=С3PKt⥱PK6T META-INF/PK6T֊=>=META-INF/MANIFEST.MFPKRxSt⥱libcljni/MsgCatalog.classPK k3+mp b՝ab&p # ./usr/es/lib/libcljni.sost/KLImmaծ,H0 RE.text@ .dataN@.bss.loaderL|`~``!AHDL8Pf| FN!AP8aTcf| FN!AaXc8he| EN!A,aTA8H}AHLXHAa\HAa```c`e| EN!A,adAc8`\@h| dHN!Ac 8e| EN!A,ahA@8 8`dc`g| GN!A,``eAh`cdpg| GN!Adalc\e| EN!Ach\e| EN!ADcTf| FN!AcPXf| FN!Aal8!}N 8`8!}N A Java_libcljni_MsgCatalog_catgetsA L| N A L| N A L| N $Id$([B)Vjava/lang/String@(#)48 1.1 src/43haes/lib/libcljni/libcljni_MsgCatalog_catgets_impl.c, hacmp.libcluster, 61haes_r714 12/3/03 10:09:15;=strlen@ catopen@ catgets@  /usr/es/lib:/usr/lib:/lib:/usr/lpp/xlC/liblibc.ashr.o@VPDshr.o/5765E6200/520!Java_libcljni_MsgCatalog_catgets %*bBj  strlen catopen catgets TOCkcatopenkcatgetskstrlenk_$STATICk g.filegNhk@) _$STATICk  glink.s" g.catopen@k(.catopen@glink.s' g.catgetshk(.catgetsh#glink.s g.strlenk(.strlen(../../../../../src/43haes/lib/libcljni/libcljni_MsgCatalog_catgets_impl.cWed Nov 24 00:03:25 2021 IBM XL C Enterprise Edition for AIX, Version 9.0.0.0 --- .Java_libcljni_MsgCatalog_catgets lV3+$Pbs՝ab&1 # ./usr/es/lib/libclpp.ao$$!% _CLeit08FR`acdfglnors !.1@Ku ,367?MOQWYz"%+=ESUZ[]q{'GJVjw Bu s9s9ĆBC#9s909s9s8$29s9s@˜9s9s9s9s9$Ls9s8ɀ9s9sas9s9q >!%sC9s9s9+9s @ ~Eu^F[_/9Pq~_KH~ /J#Vű~p s'BTy8EpdDШ* #ͶΜ"P6EJT @|\ͶΜ"T N L0d U2TB@TB!ppW'jb\TA13m(sADHdJ.+) [[SӄiWH+.l4F2yѰ(?j*̔ G+eJGDM BȐJ# Dpttrc$2E%  cq*{m~R5IDNYP=BtJ# Bfb#̓qPQ"ʅHձ= 8FE V]Xh"t0yz6el#Vű~L G+YRcBP&2Rt<98e!)(`X1llR5ln%Op3`vc$2E% -Fĩ\ eIڢ0G0@F ! @xsf#~d.&lŇ9ADHdJ.+) [[SxfSfg8xƆAR# 626`9ŲPd"8::xBf9ɛleӄiWK.,4y:fJeeލ@h?-Tb5ln1 [a)́RӜHȉc%&ln9PN"ӝPQk6PQ N C#VT|4uK.BL:|W˽ 2Ѷb5lnd2Ӏ; 1heJG.TP:dJ+8#*Rk4T5 eC¡P6T9̅}g6 @@Jd2&l9txD*ΎL X9 B$Ce#VT|4u |eޅ@t˽ 2Ѷcqhaw*R<2"lhJBh{Ͷ̜ʇp'?"SܜdG#3cd̀/9ʅADHdJ.+)79eB% .(XٓPLeIg (GGNps&l3$2E%*bcq*{p:)uze3+.l4F[CN 0bP880'[9Ź,*EhP:3`r,9L"e!{aHbؤjJ#NY_a {Φ{̬ХHN*4mc'= TJ#V H7Npw2J Iqf s%R~!hr B\0,VR5ln%OwNPS]Xih=V]R'6-Tb5ln1 [2z2g9RqcB0'D1f2*EB&l4 "C$RQpYHbؤjJ#N\:$0<3L%4mbC<"t0-Tb5ln1 [ B1C`89[JGDMJ$̓qI-Xb#:pJL7- ؍=R'OP.sZu$@@'j"n&l68-PBF9DDptt< 2Tdp\0,VRP8) C#VTB$Sb̤1llR5ln%OqTdp\0,VR6)7*e!{a= 8Fpz:(${ ,"'L M +.im-Tb5ln1 [ B1C`89[JGDMJ$̀9ŲP DpttNIp89ŢaPJQ' I)#, pfXSt(N j#h;ar(3`nxe`XpR-Fĩ((FHe!{aHbؤjJ'%`X1llR5lnT.B1*{p8o а L@$0<3L%4&2B!8?J#VVd@xDpttHȉ3`-_DHbcq*{p:Ywaȉ4VO]iyRձ*R<2"!|P9N"8::L @ 9̔IJsD̀B$Je#VT|4u  .,44 C .ȉ4SF-T9N2"lhd ҥ"Bf$2E% SӄiK.,4*JȤQcHaey:fJh?-T9N2"lh"8::THL6PQ"ĩi4?.SeHaey:fJhWJ#Vű/l36 щU)6(6(Yӝ9D2sLO {IBpZ`'O9-:S"B S:L'upR&NAB,FdJ"8::L t" l6 B2űHձ=N6JBPPQ N ʅHձ= 8Fu_d+.,4u&QHYwDNgG+[YR9*2ĆJ$9Q6ÜD\Bs T8L&s("PT.+)7Ө YwaIDѶSoq\.ˁv\ \\e\39o 2ME 2 9,+܀ 9 d% 2kr ryyܿ/4K>/6KeĹ6e._Y||2@eѦ_"v_" ._#e2%!>w 6Q"'L B3ȉ4R0<H 8$$ D"7 BAyƘLHH:1 3x0EN3/ʸ11P3/41P3/0)| ꁧC2H̾XU̾8?ĀH[O!|pb3/+FxiV3/a|_!|p6з!|2K̾< xd3/a||{̾ |a̾C2l|6pp3/o2<p$-N| e 2>a|p ̾x0Ë`3/ !l8*f_ 89{R3/˃||2!j*3/Y83/Czxf_z2C2QjeD"|@|f_aN 1P -@f_=!l eH0FeH| eLCˎpI.DC˃.yp!ypMD<'8 zr\ Hyq\9Q.$"]~<\(q.+!i.sq.\*ఇEp0!B\+༇ HypCˌ8lc!\yp'yp<D<p@C˂h!Ú!D< 9\p<. r\2ypm\DTU8P,ʩW8 \5 ʗ*_ҥʩWwNrq`DTU8W2Z*_|*\Xa\X HrʩWP .㟇 &j8O  a@ZN~ x&<(B\-㟇 `uTÃ8; qÅp.2  e*88\. n\z(S~-!ˁu]U8o ˆ88lSeN9pྮ7pA6\ 㟇 2®7p@˄5qBso UuTÃ:2˺(S~-"˃jp%qBsogWUN8?x(S~-x#5uTÃ7U qÅ&uuTÃU qÅV@US KW)?<y& <N9pT<(S~-yp@1%㟇 :܀EWUN8?Yp 㟇 :7p,ˉ*8QWUN8? 2 qÅ]U8ojN9pⓡX!Rt+>lQW)?UuTÃ<|SW)?d]]U8o 2EW)?m]U8oʸN9p * "˟㟇 hGp U\P8[E9SheU qÅ47 uTÃN\UW)?dJpګ㟇 G7p5 8>U?+ qÅ|US28ߑi)Pf<*FJA[ )S|U?G|{U??SUO>T?STSOT3UOU?`U?`UOK?X ?/T UOoT S6/U?`ll_S<?UOx+UOx S220###4Oa(|*:`"p"sȂ3șF!0}T+ +C!#BpR0}H%pB3)H#1#{Φ{̬Ѱ( XOFLаDa+'+.l4FّаDa+'yz6el]XiOJYwaP6̍eޅ@t˽ 2Ѷdk.,4gE,=V]i#YwaP#:)`@YwaP6̍eޅ>ҽV]i#Ywait˽ 2Ѷdk.,4!'22FL4m˽ #H}gE, Ō=V]i#Yw(+.l4B˽EgYD {̬Ѱ( oyxeލ! XByѤ>če'a3IR!YwH}Fّ&i*Bv=z44m˽ 2GBF#Yw( ˽C+.)RXOB!8FBL@2B!8Ѷdoyy!yDa)k<i5z:(${ ,"'L M +.im˽ !JT4 C .ȉ4SBc+.)R#Ywaȉ4VO]i#YwaQHYwDN6̍eޅIYJ,{ ,"'L MfFe1YQ=]ir5z:(${ ,"'L M#YwaIDѶoyyz6ek {̬Ѱ( fBL:|W˽ 2Ѷk.,4ϥ{̬Ѱ( fBL:|Qeeލ@h5ze҈+.l4F٬а(YwaP6eޅ@襇˽ 2Ѷk.,4gE,+.l4F٬а( {̬Ѱ( fBH`^+.l4F٬а4:|W˽ 2Ѷk.,4!>@YwaP6eޅ>҈+.l4F٬а4FtRX˽ 2Ѷk.,4!'22FL4m˽ #H}gE, Ō=V]iYwai襁8˽ 2Ѷk.Seeeލ@hWYw(+.l4B˽EgYD {̬Ѱ( .Se2FL4+S=z44ma OFgBF!<b): 6JE'B!F Pk.,4*BqS(${ ,"'L M ХHN*6eޅHN*ey!yDa)1z F٬аDa+'C .ȉ4SF٬аDa+'C .ȉ4SF٬а(${ ,"'L MfBL@$0<3L%4m˽ ):XYwDN6eޅIYJ,{ ,"'L Mfe1YQ=]iu{)β$0<3L%4+аHF#hLHaey:fJm˽ Dh=Ć]iيNk"'L SE'Bi.,4!㨙>6eޅ$'2B`7D,4y:fJ8OJ <^'aP>}(L0bFȞ@t "ze3i襀>`č= 2K0|"ze37D,4!'2K0|"zFΊX@t0|"zFΊX@t "{)>(`7DS>})YQ$oxhR7D; J`7D; J7D,4!`7Di X`&1#yOe24:+: >`č= !JT'D!H}IPL0bFȞ>&1#yO@!'EA0|"yHz B>`č= !JT):* Hy%aJT):* HyаDa+'`7D,4y:fJ'aRVE'R`7DSDNeL0bFȞu$y:fJ):* HyаDa*`>`č=VyDa(&1#yOBH:0| @us9s9$2 9s9q Hes9s99ss9sas9q9s9$s9s9sHs9s9qL@&$s9s909s9s8ɀ9s9sas9q9s99ss9saq=?O?O?O?O?O?O?O?O?O?O?O?O?O?O?oyyz6ek@YwaP6̍eޅ@襇˽ 2Ѷdk.,4gE,+.l4Fّа4:|W˽ 2Ѷdk.,4!>@YwaP6̍eޅ>3P=V]i#Ywai襁8˽ 2Ѷdk.Seeeލ@hW#Yw(yz6e\:Ѥ>kO"z4ؑ&i*Bv{+.ih25x%HNBF#YwaQHV]`Ѷdk.Se!YwH}Bu3eeޅ*BqQk6:2FL4mc'= 2BGi{̬Ѱ( fBGi=V]iYwaP>}+eeލ@h5ze҈+.l4F٬а(YwaP6eޅ@襁eeލ@h5zFOJYwaP6eޅ>҈+.l4F٬а4FtRX˽ 2Ѷk.,4!'2@YwaP6ec{̬Ѱ( .Se2FL4+S=z44ma OFx%HNxeލ! f `@V]`Ѷk.,44  ˽C6ec{+.ihW{Φ{̬ХHN*4mc'= T˽ 2G˽ TFٽS=]iH`'DN]Xh$L@$0<3L%4&Ѥ>k.,4*BqS(${ ,"'L M ХHN*6eޅ"'L Y>YwDN6eޅF#Haey:fJh5z%dRu($0<3L%4m˽EgYDYwDN]Xh$L@4&$0<3L%6eޅ$?QWZ^qwjz~]{} 4cG%aaaa 0 0 0aaaaaO0 0 0 0 0paaaa 0 0 0 0GHaaaa#Ǐ 0 0 0aaaaaDDDĤ0t 0 0aaaR26aa0"rcSh@ G@H5þ@fK ]l-w0b 6k@fKqNT ~F0m=Y0-+£%ږ/+o1RZՠ.+ڔqk¡fxIq:6缨ZZ}xf +&-B&V_ f(e[PLpq[PY| ǑGkVe[PLk¥mA2K( 1p%֭\j+/cȌG! )JR&<ɳyǃ!ZՀmBN8xf<6JE|8\=){@ͺB'"JͺO32hnbx0, Z\-1/\f5 QIHLV::+ZLW<%|S+]rјfxHX6Zq:̯>卺:&*BnjahhbRb*1/ee[PLbV_ G Q¥mA2QqmBeLx/"k@bWյ 1pt%ցJPVR3 %"v>`Ne1#җ*. %z$ڏxf CeH-1/<_) GEkCp^W qY})⵫ QڥVN5 UBbZҾ(yP[PX+ qJ9UN@ fh@+Z[P*-BumBucH@/clDֆ!1XhnU8Pxl3<$FXÌ ծei@i*W$N N>蒪Rjf铣le1!) +ǃ d . [FAb /\+pVrf(땞jR+ZHAqk@p@1Gh-<_)<.@+Zp5+qZ@f<61j- Ŋ|8Y>卺dc:6ʐcC0R- W@F-%3T>jVZkh|-.:)< '\x&+< G ր!_D zg'!xVr)>Z3 ơXÌ ծ6q6 :+L}'FR?cC0R- WE&-A9|LF[PNkj i_)< 1Xh PW<H f @S+^dž3Ip6Zq:#>Ժ:[{ɏzd*BcC0H41^)1j+j+څG2l+ch @rW8⑘fxI)+uu)G=- q)+xm 0- WLZJڅJƺQ̄G\x&+\W8⑘fxI)+uuqKC&J>uąC/1!) +ǃ"\b%1K+Z\'V姑6q-茜1iqJ!Bqا卺:641l`8<}6 nj`6Z <-1CPt[CƺKOIV@Cµ3A_D zR/ Gk@fR): dž3Ah6Zq:'31CL "f CD3dRx2AP4:V8qZ JVZkh|-< E'ZLV::x րt3<_)|S+\|f<6Azj5 v>`N@q#HѨ%{@ͺB.CsiPNb_01Sm1Vڂs-< bZ_D y'јR3`#mLF`PH E8hxl3<$ Ce]\mXۮ$i5y\HT0-+£%:6q -茜1j)VRhndN4 ڊM !8lSյ-<ɳh |R41jsjږDdrZe|R41jqN8Nho [RS&bh3q_1jR)ͫjZxj@bq" GEkAe|ũH+ZũH6iJ9Ɛ&+`%+-JE8xZզ-JU)ׅC1-+us+">卺*.dy\HT "\b*1jZb_Jiᩐ%HJjFHQN4A1Xh_1jR)ͫjZxj@bq" GEk@a_1jR)NJ֭1jR[Rz"qZf<6Ev>`NeM@DR[P7Lۮ$*B^ Bbx|BbB_A!?@LB؈"@A6"!~"+Iq[F=q YSi^@~e)OO ei6ddyi2O9i;Oyi+OiYiOz$ڇ@@Ѷ6]#(LP҃dΒN)Liȼ+:HLLŶI4t!)9>Ϡ{F˧0"J]idsBH'@* 6hs 'dAk'M@.xNxXA`XxX ϊ$4}D`P)@(AP(d犅ApƏ]itᲁ6D [d^p@Vt$ U2l6hBRr|*DZ҇˧R41q(\Yt!A<TgN]8LP%&&yru]8x6*q3G^.8P%=LPYt҃0@gEYHeKFC'N6h9>2"'6NLNp D4yåYU %Tʗ=+i8Fh٣RghbP$i5F&(##tBB11>>ˤ JJP|}IH8O)҄bb|}IM$:FOJ$q3H&ޡ:V6%8 B(d)* ބ)@(x^'BDt B<B^)* ބ)@(xRp$2pG卺FPJ>uąH\d:JXۮ$LŷLۮ$*B$d*FOycn3C^=3n >卺:6FCxm!qRbu@#'uąC&I>)hdӉI^=3nd19>$ITJZuEO6%8sX+ 2lsX. . (B)B EB3G " EB vI tT0RN˧DOfz$ڄ [d^Dl+:HLLŶI4t!)9>>˧x!B|V}'TdgI Q@S)Si+HѨdLh٣ȍeCc4j#8lȍx!"|OzmyeY@%TTJ4j:Fh٣OeCc4j:FhƎ铣l dI^:6&$'T R2} uBuN@ѶTO'T R2} uBuNJ@ѶTO>卺dc:6ʐRu@#'=- q+L}'FPɓ>}'T\6]""(,PQrf-/"#( Β"*S41mcF6HJNO\I^ҸԲ/"$(lJq(T,tfzZXT,<)ˤg Pl9r3x.J']49rC Ȅ>ˢc (6Nlq)>ˢc (6Nl9l+'T\ȼLl+#:D蒪RjFȔfeRǖ(N#dJpDGI2)c41mcDf$%'T$.NAs$D##4DtS(=K(uQs˓q\! M'T$HTMyrt" "$4tƈeRǤi*QHǗ'J "CGN4DtS(=K\D2DHhceRǪRڇ'J 1F6HJNIKP铣mK"Sȏ":NIK:65,4FFpgH2)c'FԺӭdLp!G #'T$Lb NB&Բ%8huLJX NB&6DMM%".d^Dt+eӇ $$&'ìp℄uN&(HteӆJ]8l >eӆΔ$'UJ]mC"0+$#<D%T8)F'T$֝m1#eTOR`֝m":NIQˢc JKd^t+$"%D ULJ蒪RjFfeTORNf":NIQ=JZuN":NIQ.B' >卺*.oyg=UJ]mAR8lP%H,m$N6}%T!qɉT@.PťspDR[PTN蒪Rj L8leӆȊ1.>˧ !1:˧(H%8OÇJMYt"I ]8p Np)@X%;YtbDp.eӇ 8FOp͓"'ŊS FC"g T@S*ZzV2pѳG2hbP˧"c.:x7âbDxeӄF# (6Nl8>˧!1eӄDEx."$(BS."%(8DI"bJw#6>˧cp@R ]8FpJpeӄDe #'ìpBA)|:˧Ȋ N]8FHP8{2RDp22SuN(Gìp >eӄbbSuN(H%8OYt!„SuN(H%8OYt!BA)|:˧  N]8HHPJpBRSuN$'ìpBA)|<˧  8OYt)SuN(H%8OYt)҄SuN$'ìp >>˧ IJ9Yt)1@X%8sS)6>˧ D Oa]8JHPӄuN(H%8OYt1ҀDpeӄ  N]8LDPJp2b2S .&%(G a]8LHPJpbbSyN(H%8pa1BA)|:˧(H%8OYt  .eӇÇp.eӇ N]8xBCKyP&J#'.8p{ԝdm/y\HTI^\HQ!}3nBL@JI\F!q!{R6}%T!>p$DR[PPQ%T2\p@i*W$N N>蒪RjPJKRq%T Z.døN%{>蒪Rj L`>卺\J*. `qUJ]mC.8lM}u @IU)uH\d6蒴JT3%bl JK*HȘMXۨRjF6}%T!q-/yX:'"J 2Tx>X:KĘ#>卺X:$N6}%T O@ !q):X:,  Z.dL T1ybꋔ%9=2tm!>L+'F%DyXۭ%JdϠz$ڂi1Lh\dJsLjY."9'FŢN"ʆ/LjY'<\L;x(N VB۪&d卺dc:6ʐQL{%iJ-BfKd*H1.#>Ժ:[%{ɏzd*B%G}D*P .Jҕ([uR̗;O{Z4RWLۮ$*2THM@2iįy\HT2d,mѶcĄy\HTJ0}D*P .&74Jc"S >卺:641l`8<}6 Q&蒴JT3%>卺:6FA+xm!q16蒴JT3%ĤX6di5y\HTJމ+JTmJ2\Js`641l<}6 QØ>Jҕ([uR̗`qč#FXȔ#>卺D [{@ͺB.2Tp蒴JT3%Ĥ<\H4j ^=3n }D*P .%"g<\H4j=3n #VB۪&duąH\dQ%T0{" !7" ! D̆" "1x1aj08c`b  DFA C̆ D4ሃLn0cab AN6" $ q1d6" &A) o 3%B>@ 3 D#YP1̂A | 0̌|fR3̀#2G2Gmf@k$G|G< |B90G#ِP#d>!  ̀ #2# B>!c2f@G!.dÀ.#y|BG#ِْ2B| |B)̀pG(812&UZ#Mb>!-̉|B]h#s"a5 ȘG \xG&0C p@2&e@#(̉|B uG 2&k "a p 3"aqh@2&kG 2&4@2&k#kX3"aّ0-pGD0-K޸">"#̉|DkGE90:dL#!~>" "a끈D>"KQfD>" uq "a|ȘGF9<# 2&@|GAdL# Y!-̉~ ~Wu ~WQ3S[agǠp U_\ um4"s9cy9xd d4ضgѼl a|(6 6 l #'WB t7A:e3:Fa  x6W#l 4kz;A70p=s c8ø8C8@dkoǏWDž8&Űo G0M0UpG.>?(a[|B," űp|"0CѼQw :cp:p{`t p < X+_z fp3'-|  #oi0> a""= ̏xD &p=0;gFA 40kѼ@f@8 0@ `s|a5I$$xHDHG @!@#BH$G`?0$h!̐Hg cy@ 9Dzp#[`plo[ ]__ "!Fӭ|4̖#*m_ A ?}j$3GVfj*3 .(j?YfaeR)֬?3^fa VfcVfY\ՙN I>fapjzՙN Ifap =jeVf]:lJ{Vf j7Vf̉=j֬? j.3@eVf̀֬?~faeC֬,Lp!!?YYtLP֬?fae2R)Z06Z06&3bZ06Z06^fal>faqZ08ՙ֬?c֬,H&(HDOVf]$%(HDOVfzՙzՙICfaeBBBHGVf]$6PN}j6"3 .(GI=j6j˧IJϭYY#3֬?ՙfa8Yzՙ֬?oZ011@"$;Vf}jˤNJb_Z003 .fa:13 .#޵fa:zՙ13gVf{֬? }jYZ0fa߭YZ0 }j|֬?>fa> j}?YYtLFP ՙDąLGVf]fa# =jFfa#Z0YYՙ֬?>fa@fa@KVfCVfZ0 +3޵fa@֬??Y֬?3}j jZ0 ֬?֬?mVfkVfAZ0Z0Z03 jH+3 WVfDfa$SVfE~fa$7֬?zՙ33 fa$ =jHfa$oY eVf@43 ՙ7Vf=jzՙ_Z0@֬?w֬?֬?fa-3#3&3ՙ[Vfՙ=jˤGVfADN߆ =jHF ? k -Z ZH[I_&\{ &!֬D`0\tKVcO pLf4kUMWd [i? D`U_m2",51Cnt+Ve29_m22S^? pk?djHF ?_G-qK%d\*Zji!m' ƾ ?clWd`?=?l-Y' !Vƕ,*՘Rf_! ?Uk2%9'Z/06 +[Ip .8W^?qZ=p_B8Vf $# _t,pji!m'&pe^?ⱖ_B 1df $#Ҿ \FEVƟ@Jf4dJՙ|MW_\+`3]{LR2=?֬D`_-qK%IuVƟ|ֺU1K%ćr՘ҡY8s+Ve9J2gǰ9=?"Vf $# (O㤸Zf4 |ff4dխY*u17V#F2>:)Z/F/U3aH5|ea՘(0K\Rq^ ֬Ɵ|`f4d+VcJdV#F|Zf_!m'8&\gLH~g> +ZOk)d/-ZT\H{VcJd2>/ ֬-k/ Wd-Š$̉g> -Y' +oZKի1K%ćJf4mH)Z/[_m_/ O &p>?'p~9|oF=3?\/G fp~/#`-Y/ ՘-Y8Tfp~9|o (&ti38#S9{7 ,_~bs9{L &p~9|o{Ks+[3:B3̯߇u1+s@d]3:~!9{/|/?0̯߇t 0ø2̯߇@ p~9|oW /?67ŠXj̯?mN@s8X>7LW L8X>7 g2~pK/?8_85b0̯߇ 8X>7LWn!bs0 i3_8ɜ,_~;9{kLbsA=|ǀAC8X>7v"s+8@g2~g 㟇xDng2~ qE3&̯߇8sLbs؈S3_qB/?p_3_pB&p~9|oÀb"=|À4!,/?w%̯߇|8/?DW> Bng 㟇|.A|e~>?'$s8X>7 b#=|8X>72@O3_t%38X>7 b Y3_t! p~9|o.D\̯uBdEwSl?We+@(2t+@Ye_:WF-Q+2x_<02x.2x+_ _<WWCW@/et_̯?̯#et_+_ ̯HTWf̯?WdW62FBBHA #R##"-i +F$W$NB~Ѱ,N2`Ͳl$d6tPR3ζC[`P\N0'FRt M!7e'T6 AN>N} D#l-.NF\Mjn&DR6T8˔'Nm86 IN|ͨ8FZ\C8P)PL*m5.q1a lKyP) җLۮ$*B|$Lۮ$@JI\F!rB8lJK*B|I^*.B}u\L;T-8lJKBN%{>蒪Rj RXۥ.{>蒪Rj !>卺dϠz$ڂ.HOycnJKqpDR[PT җ,PQqR%ybꋤ'L+'F܄6IR"w*.ZL}'F$'<\L;x(N ▆M8&>铣le!>卺dc:6ʐ!>Ժ:[%{ɏzd*BRm&>铣l ▆M8<}6 R▆M8<}6 RX۩m3Cs ^=3n X۩m3Cs=3n X۩mh珠zfq!R$'卺*.dy\HT ,mIU)u#{@ͺB.Tp\ Q OuB"*E{R>uąHODuė/y\HTI^\I>卺:&*B6TJ7 /yg=UJ]mAR JIU)u/yg=UJ]mAR JIU)uXۭ%Jdig=UJ]mB')hdӉ^Ϡz$ڂ6r-( Ϡz$ڂ.Oycn(pbҀ8lJK*B6뉒'{>蒪Rj >卺dϠz$ڂ.OycnJKqpDR[PT,mIU)u#{>蒪Rj {R>.*B|$,PQuiKx(N ȒBuEXۥ.q2Dyg=UJ]mAP,PQr'L+'FiKL}'FRȒ2tm-ζ#HS:ڄ"mL6IR"w*.ZL}'F'卺dԺ:[%{ɏzd*BRm&>铣l 0mKuN.O{Z4RWLۮ$*O{Z4RWLۮ$*O{Z4WLۮ$*O{Z4WLۮ$*OycnN [$%{@ͺB.OycnN [$%{@ͺB.OycnN [${@ͺB.OycnN [${@ͺB.OycnNPJ>uąH\@Lm#F<}6 >卺:6FCxm!r}u2tmLۮ$*B641l<}6 >卺D [%{@ͺB.Oycn3C=3n Xۮ$LŷLۮ$*B6FA+xm!r}uč#F<}6 >卺FP>uąH\@q#HѨ{@ͺB.OycnJKq+xm!r}uUJ]mC^=3n XۨRjF>uąH\@DR[P7Lۮ$*B蒼RDW7!z$i*T螉*.bq!rJDR[Pٹ %zE IU)uWUJ]mCC&JHDl܅蒼K81i@\HDl܅蒼Q%T7!z$,mIU)u#$"6nBI^T卺\J*. Xۮ&H8lJK*B6$ڇ @IU)uH\){@ !>yW(NB}tBuE&H8lJK*>.BiKL}'FRȒ2tmOycn+'{>蒪Rj =2tmrB}u珠ybꋊ!>)hdӉ^c:6ʆRXۮ&H&>铣l 0mKuWN.HOx.Nc:6ʐ!>)hdӉI^=3ne!>)hdӉ^=3ne!>卺:641l`8<}6 !>卺:641l`8<}6 !>卺:6FA+xm!rB}u2tmLۮ$*B641l<}6 !>卺D [{@ͺB.HOycnh珠zfq!R$'<\H4j=3n XۨRjFJ>uąH\@DR[P7Lۮ$*BKyP+җLۮ$*B|$Lۮ$@JI\F!r8lJK*B|I^*.}u\L;T-8lJKBN%{>蒪Rj SXۥ.{>蒪Rj >卺dϠz$ڂ.OycnJKqpDR[PTҗ,PQqR%ybꋧL+'F6IR"w*.ZL}'F'<\L;x(N ▆M8&>铣le>卺dc:6ʐ>Ժ:[%{ɏzd*BRm&>铣l ▆M8<}6 S▆M8<}6 SX۩m3Cs ^=3n X۩m3Cs=3n X۩mh珠zfq!R'卺*.dy\HT,mIU)u#{@ͺB.@Ժ l~3+$ bŽbb&3 # ./usr/es/lib/libclstr.a$$ 9.7a ,128:;_cderst0346@AH`filnop $(-.579=DKPTbghmux| !#%*?CLNXkvwy ")/GJOQUYZ[]^jq{}~+W X }_Lmmmiu"TͶmmmmmmmu"fmmmmHmmmmmmmmmgљ$Fmmmiu6mmm6mmmmm Q&0Fo#Hmmۭmmى6mmmΦ/_!b` @0uԣj.H"cH]bgɴ8KC_/S?Ap I\*?/_0E& <|yK֯vpQIN`gW8~7q ɎIa,4~k)!ңD.LhE;ʕ&w};kASM!ȉWZnCvS>MMDWQ^XmE62Υq+XY%V'~7Lg|~ɟioa<ĭP>'hE :fZg};;:-Co-CWZSMYOMtӧ|LJo84S>MM:l>oQNտZ"X%s/;b;B(5%N$Bz͎|g};4;ic>ɓS|Җ99=OS|jXyA%*4TϙɓS|b>}"jyA-*4TgTsG>!NЧңEM|Z,sr}7i$"a; U<&w};k9 O ңEItBϟ2?F *4TNSK>Bޜ'S473g|қ!M76S4>?g|ڛ5fǓRR•*Xɩ}L~56ΏЈDQ^XmE6ja Ne#j)|NЊt͎LSNFP=7ӑ<8ӟ>ߏ;龜:SRңEKk9=]:&6Sj8MԱ"X'PhRS43Psl}WցjU}-7ӿKB9ʿULK;@z56DWW>oQM~tR;B(5%NHgrcnLt'j)KcS ~ɟUg|Њ+߾Os:ThOT!)HKP?m7ӟ\=M,I$ ٝJo~>"wSF=TC-)@1$^} b:&t"+rcb(Y,}NZb|c4qN?;B(5%Q6upoY lsdbnM>(}VR&}L{e}A SM4~Zq7Hj=P'S=#Gu )=#GpNP辶s7q?@zF%{NNRDrbXϪO1R>-jPiz8F>DCu:9O>NEt=SңE>Rzϐ 紱ӟF:SiQq?BMMXϣlѨ#S|:sEs% z)}Ly1jNM\CoR=>%D;VS )Q}Vҝ E7q?ۦ,sI:s8>! tZq7ic>tZT1=6jBr57ic>tZS|?ߦ.!e7)cIӟA"ndHSFZ;JiK}A7)cIӟ Š^$P7FObU7ic>tZ/NS|>rZoRIӾ! I pT iQ}V0SR.!t@{I'N|'!yiQSoN}`sǓߥ>}NN @'d{K}A7)cIӟ Š`ڜ}*4J|I,tѶPoSPZӟS~kM I:w!8)'b>+S~oR=>AN L)QS7q?iKNN-Tw"!P>8)*4OU>|:oP}9$9ZE@>FXJ};g}9M|N *4QU' zIt:&:񾨊&.EzcvMo&%DkbY8rwZCvPj+Kmb;d PNzgrsHŏ|0A&w}9jN"%_e{>Hju:ThުOT!RD=SԒt4~:iJjP/4Sp&w'4!:9YDd д?O"}Wfܜ$ڊu$Py>Db_/F3S*4QU'pP3F[J}k koKs)9C7өA*4Oߤ~􄵩JjN[tN9Ԩ>:&GDWꈢmbW>oQKVKqd̳1Y |W Dvy!;j͍6m^NjUٛ;696:wǬ3n3=P8Ω$jOǧSc Th:&IŚD69`h\CN3I8BψCY8 iQP~LFm |)P~ME7ņwŪoO]eru q0>DFy}I;jvD6ʔA8=$XH*S ңE>Rz$j JԑD6 yBC&ߧD:ԨFTCI6DFOdQ6;D5Rz$j)iQS"m%H KJ`I?a4)0&ٷȖj|!E(4FTCI6ðJ&ٷȖT_s|h (~6%>hElK yU~B YOgNrRE>Rz$jRDɈm|aEO &U{>Hu`QJ`I?SeԨS|~ZӟMo,*) ~B'OgVVJ`I?SP-FP3"m%<`W"q{>HʝX%F0}B(J7>NElK jxA2"Juc:ThުOT!%D*o ߿#䌈VWNZW+?~GN꿦jP_/ߑFDSPo m>HȊucu_}IjP_#")W '~2"Q]WQ6;D-Np ~BOgX+F0}BISޕ*o ~o}AjkX/g|X$Q6;DhNpOEZ@F0}BIN*4Oe>PSDWȢmbW>oQKHm 05Fu,de>'hEdj&.NАE~ؓSrs>rs8szThCQgODς::Srs"4Os5_E"OJ`I?~=:: QSȠ:|juA%W!|cJ`I?~=:9ThUN/FɟU"znNzޕ(~|=69,tѶ񆴨8u7'=6jq7'=6jCO`򛓞N}`E8ڛN}` 1GMic>tZq7'=6j=P'SؚN}`sOTܜ8=8ڛN}`\'SgOqOL*OgBThII_u8$cJ7'>q1ON#O;Uf$Og{jThުOT!Ε%>3ȍ).U |4FTCө͂M*4OBߏ;ȢnңE>Rzϐܜ8E8grsznNzF"껟!m:8֛8zNi9!m:8ڛ8'P(}Wfw'7!gO6SW"am{>Hr%R}$s~NlңDN j|!t?OgJP6F0}BNzThUNѥ'L~-|Bɟ"<T3iMB>REFF3SңE>RzߏNgt>5$_%Nʕ">ԩԨ397'6q?)9YDd Ii61N1*D$rsgj)ԑAtRN=$c5~Nh/֧B%*4E}9L)h'z'S؜ܝQM]"j)iFu,dU"zĆvS|q`j YOM|ct"+|}N)lKw,Knd"Q^X5kY'P)g{;ȢnJsRM*4QU' zzl}MXϣl)HoJ}A,|:sEtj):6jCObjoRN}`E8ڛTӟF:-Cu ru>*S|:sE{S|:sEpCO:6j9NoRN}`\'S:6j$:TӟF:-C'S(<Ο"4JS`d=$X)*4QU'Ntzu9&F]zo~>"zo)cJ`I?>Bޢ>:&6"Q^XmE-Zag c[sh. j?>'hEdj&.N:SϪwӑD=7ΔThުOT!JoRN}`N ThCJTӟF:-CQN6,tѶPJ|Z,tѶPSuK9m8'P'Se7Ωc>tZq7Ωc>tZT1MXϣlӟ|TӟF:-C'?:6j$:At!NAB|)8MJ`I??NJThUOwr(ҝHޕ(~|E5U|OSl~|NE|oD(Y,}Nodw,KndM*۞&|NЊ Ez`M]gl?$BuM, PmM,GS|s^ǤPy>DhKSr0 ߧ)S(I':~=:K>&6"Q^XmE-Z85O,g,Y'W8~7H"?g|k꽝8'Qg}=7ӸTN *4N!읎ңDO}WcjNE>Z*4L罹wZs^Ԝb,sI:8(S_Q^XmE6jXMәh\IvPj+Kgl?$Btg};N *4L罹wZJoSҕ'NrRDzoq u?U]j}:-|NSgiQg}=7Ӹӟ>5ic)R>MM:lE%Sk[;'lk/"Q^[;dޱ {;Uq1FNPMs@iJ{'cMq&FNN>-|TSݥFNN>ړU?Oe8W|ct"+|؊+KSַFH|W8~7H"?g|k꽝>ƕ&w};kAuMq1F=}:%*4J{6:zX&:ȈE8iQg}=7Ӹӟ>YIKuI'Z g|қ|ct"+|؊+KS[W(i̴Fz%ωAY-poXE~꽝8v iQg}=7ӸS}:48v;N5*4L罹wZsU֧өȄڜ;v&w};k9PSZN2],s8&*S_Q^XmE6kf;iK7W8~7H"?g|^wzThOM!NP )Qqdw)N A5*4L罹wZsU֧kBdJpJ*4L罹wZsU֧ԜdI9SS%_jmωЈb(Y,}NZDko$oKr{9U浄 q?U]j}7',5hP>֛)0ޕ'z&_"j)o}kfyh-NS J;龝5֠iQqdw)NQg}=7Ӹӟ>OD& $FNN>֓R:SP\>MM:lE%Sk[;va|NЊ Ezl퓇zĂ(CwΙ־NS@}J;龝5֠`?J{'cMpH Qg}=7Ӹӟ?"-|Llt3C]iWZ 85,s9 CWZRqbjI:W|ct"+|؊+KS[kta|NЊ Ezl퓇zĂ(CwΟU}Ẁ6&w};kA%7ө0F=ܦu9&w};k9PS|!4s`IJ;龝5֜(}Uu'&?Oe9&U&6"j)/$"Q^[;dޱ luwӾDFNPS}:F=}:RDO}WcjNE>ZNzThOM!CO8=,sI:9,U&6"j)VR'2y.‰f>'hEdvbA!;OwӾ FNPMxF'Nr*4L罹wZsU֧өȄ̔IJ;龝5֜(}Uu''tW|ct"+|؊+KSַvLwy.‰fωAY-poXE~꽝8p3C]j)Nd48v;Nt3C]iWZ4S寑 pRDzoq u?U]j|mIʼn$ONe_jmωЈb(Y,}NZIy.‰f>'hEdvbA!;L_U}WǢ%*4L罹wZ}*4N!읎ThIltӸM]iu>h_" *qoJ;龝5֜(}W'(uI'Zb56DWW>oQM19B_1'PS| 鬫z&6"j)e#hyc;_$"Q^[;d޲(Cw;66(}W79jP(?-CWZ u;%*4L Psj iQ}UuXv$zm*4L罹zX⡭`"3iMGZs{#~~:8$M߾N0^N *1)&g}M7)@LT57!m:zrU7Գ*|U}lkX c?|?S~NS|U/F]7Գ,|U#GSS|U#G,)e,),F"g}M7!m:k⢜|REMqRDS|b:-Ezcv٫hs--_ıu̮%H&> I V';5*J>L|!Gԓ7?ƿW8~7(C{;#,S ~辶uQ罹'N>Th:ӈ}A5rREM>,y)@ƴy)29`WߑN8>56DW$Q^XmE6jaDKKDWIW2󸧢h0ωCR3; tP"Pqu U/`ɟU/aM,El7>tZ |3"Ѷb/`|0D H/SM;SqxK{E}9bM7>bT^ H/Rz5$GU֧hr=IP?UOjr> ߾iLy9jN4ǓcPs]q'-CǓSLy9jN=<dC)azӟ#GNNZOOLy9jNo4<?~cPZsl1}AP|<~zcPs3~1}9NZӟgH}AP}O)u>MMct"+q}#v{+'r=^I&?$3?g|k꽝:-Co-Cvg}=7Ӹӟ>*S|?S}ijN7΋PskM}AP|A>Ա֑;!m:]7Έg|қ!PqOS|:2gɟ$dvM*4J}-7Ωc}'~]C)jmωЈa;ڊvK񝰉bhI7|NЊ Ezl퓇z"<A}W1cωD9(^Yߑ PkM?UٝZN>'~|)Wo/tpJ;T:q?ƴߑN}*4T:Si Rǒ kI')SWߑNThU|dct"+~(Y,}N5oFNe%+$+yGKu?$3?g|k2Ng};;:-CtZPS}jPiC}APS|>(}Uu4aKI9"n[̿2oy*4L罹wCOSl~|NE|oS[C2]sbW2.$|NЊt͎'`M}WJo:oq?)?ƴߡ>(}Wfw)hN>oE$7Z_7 Qg}=7ӸNU|ct"+|}NZs-OD,aıtEy$ 3cfI3zU辶jP>,}A5]SM.!CꫭObzo#Gٝ7Ǯ!P8AOTZZ)ONPS7SMKP2c~992jXO$ o-CӔ>%>Lg}=7Ӹ)ONoMӟF"#GǢNtF,sI:s!Lߏ;龝9Jkic>vS>PSύa;zrkDKKDWIty;B(~7bC; Ι^z͈G$NUB'*}WڛKPkMŨ}AP/6gsU֧^z&ݝNPS}:?}I>Ա3U| ΏЈj)ڷ^Ne%%w;X=D޶ ;2N$>NoŨ}9PS |H>/`|`jSfw|H>/`}w|Gg~oiKqNzo!좜CzSU]jv|G7`)c3꽝JoRR|=9)^vg~>Lg|!ө[@SFS~}Wfwg|!SXM,qNh|:D I|3iMJXO)>fg}S3"&}WuMXϐ~JXMa)mg~JXꩿ!cw>;S|3uMXϐ. X5$t@'Se7ćQNSM!;i>#S|G7`)cUٝw{;>Lg|ڛԱă-Ǵ7lV}h7?cw7͟;6$!oQMb]7frd|U֧U|}N KDKKDWItDeq0UkVʻvPn-g`’36!K&d14)$xIӿ}CUHD8W=E(I~R=N.U~xJ F&b P^H™)RF-Ct)dPSpjPiRC3S%7 dq?U]j{SM–o CZ^H##=X,߾ֱlH##=RqzZŰ\H#KH~ ֕&w USpS};M7 U8C3HxjGK<~&w G))1O)TNSM•N!P R8i9!HyI$)TMkp‘7 G!E7 G}(}UuE_$߸E测)p~PSp~ߦI!K'#gy9`hR?H>(HO>56 OOЈ–vc3hz&c<8]-;B(5%Q6upoXEyc;LYvwӑA[=&聊ulm3foJ`56DWM]"j)i V0jÈh.oX6:d17^o-Ctߠ?)tZZoq?Uٝ4RN>GMh3=;JT?|]9JzrWZ)˜jXRF&>@l]>p{K霙5,smvSE7֖U]j|ɟU罹w)},tц褓>@"# dѶ,z)$ϐH9bcx9$9&OMٝNE54ΟUD ;)vS>L6S&AƇ2h#|NЊ Ezl퓇z"<^vw,y(oN_}FX)J}Wfwͩ >&_$_ ƕ&wS}}9[M:P1oCSiQg}=7֩Ae*4TNɩF>'B"7"j)e#*"8!ĺr|NЊtg};;攱΋I9N)tF;i;JTRjqOit?L93䍥9HRDu>OӔHƪrF|^)OSl~|NE|oSxZ":_=#WI>'hEdvl(g|FfUS|G-C7b>(}WfwΩtN>#oq҃7ָ?e=>L꽝4SM0f``KN"`mN>UU~7ͩcdѶjNo_}Kg}M7Ǯ!}M,qO>OM!SӿM:sDhr=iڛߏ;龝9Jk1辶K9a"4y;;|XJ꽝7C)S|J3cg~@o% 0w~* U~7ͩcF}9Ninu7ٝ7C@XTfrz(}Uuz&؀|NE|o"`5ohlZ"tDiU=\XZ"M v^t#N^=N.U꾖"oNt?}9`X ^Ը>P| DWa;ڊ{[*Y(}We>7ӿfw}=,u[SXS|l>oONտ1|d$D2?v /"!G;?H%T"z]B{;ϙ_M7Ũ}ASM9jN>,!jn/#8iA!ƪ|[}GIF"5,E3궄 ;)Fvw?qzS>Lgq}4^|Z詸9Jzru>NR^|TQz鸼,/>}Wqz8ćJcAKxI$_I&OMfwMŨ}A-C'5"X@(}Uuz&^}N ^,E=DR,]-^I&vPj+Kgl?֨wħ{;N:8L}WI9N:oDh3ΛCEMn!ƪ>|JCɣ=P%?K꽝>Lg}7Sӛ}8I'd|:DF%dYAʑ?N5*4ONԨ3MOٝTdZ)QMbJ(}WONQSЈAW>oQMon2X)cC))??-C4LZӟ|Ly9jN|LyAjPicg'tcVr{O>&|oSj^s-+Ť8̼%)bX+$W8~7! ;@1cωG:P."hŏ>% 8$>%@9g}m7b>(}We>)S|F}ֺ]>(}We>$}k;~(?S~U51 >h@;;2ZŐq?UO8)a9}V5/Josg>&ccZŐ\P>vS>MMfE%SfO2M+yKRı4WIωAY-po[(Cwx}|~>CScRkXP>X;΍k>(}Uuc?}Ia >(}WvS|b:}N,ez&I7"z 3zg|{M8TyJ;|^oh|===6jb'S7ic>tZ/NoR}`8`@OMg|{M/ٝ4SK zk߾N7FOjm_j)oL(}P%>'hEmK; /$xIӿ}CUB'*}W&}W7>tZ^ R^6j2NΛ XF: M7~>/aM,El4^R'x KE_ֱT^P>fhr=IP?U})>Nɩ|NE|n/}N qbM?Ci&r- Oj4T}#ܘ&B"&o($X虨RQrc>5>VOO9![k(m?85PJw) ?Ƭh(G1LERLPH?h(G1LERLPH?fEIG=ɏd"(fGN+56l^p25*J>L|!Gԓ7?ƬOlh(G1LERLPHQ^X5kItJHKI;B(WR^(ݱ4(htl퓇zKm:6%AI.Ÿ^KMlKzYP!b[@ض'1Pp bX@8|PWԒj[Kz2ɉc6:zH83`XlȢn?"xKRٵ6жTA:%jZ(rrZI`Ur^5- $@HĽYu-tK!l[Xbx c-[v!;i),W @`P0CH+I`X5-=|nLH Ek~=b}A6 bXD~E}NMQ_`F PŎtT DVh|&.Ezcv3Th<ֺ1@CIbhbrq@ CtPGȢ n"c] ͩ=7c;inn…GĢG`tKc1,n|K,Itb[1.XܤtKN %-p"_--}N )k&M)K3-9K1PoXIƔLCx4jŴLC ̜7H4D9A0 &ɋRWP|b[_HqR#7'aOYY9,`$K@%ű@KQ8NK$(HyI-@8j~͒[`%TIg F:%FZ )r[XT@$($  I줖~t(f)+ ŒX ` 6iZAVD PE#\fâXe薀p=%q-q/'-%d薇 SK@(f-Kl@@p؜&a@ ,R-8,,d0K_%[,pk@K 1,pN:%NZK ^R:>of¦-^rrf{>'hE%0'@M[rMbV}WQ^T'"=(~7ؗ:mbfTRAP&[bb^NPZm-cE Ib0ISIap?a,`m9;g|z(_RKH|z&D$R̖ zZN&b]AHBMKB)86ly$ŶdPuQ77KAxTRKӟQ-6)1/&b%Im ( 3@mI^ ӭPPeb(|F7$'@[b2(|F7$'@[m"+xW`r@q$PX>A%2(|F5RksZf># 3["H% ."q,RZK&DtK:%İzK G#Zȗ6,q(|F-N 2tB`JL([`j2X% rC|H"Q^T}N/&bИ;t ACJzrY`JDQ7#E} nHN >7ā;dtEr1W<&$|HSK,Q7#E} nHN >7ā;b`&"+xW`r@q$NLZ9/h-Rq@ddؗeOap%6%r}A(-%S?Q-P7%T76B; AtK:v:tdYE} nHN >7ā;dŖdQ_d¾#x }Nڄ ł[e&Q_d¾#x }N,Y," ܐĜ@|ovLKONQM浒"^L n*[aM 4&x3S iQ1dJ_xMpL+ɉm%XP nHd"(q$EzQ;ba^LKl],bxW`r@.#!@x +*۬!3ٹ/&bay?M 4&x3PoPٱc@<+0 8qEGwPXF mlرĠܐĜ@|oEfkN%lRK'`[慂Oh(G1LERLPHf]$P z͑.8ѨTkImAzq7>l^8P"Q^[;dޱ8OiW ihogDR(Y,}NP8PO 4Q,cO5*J>L|!Gԓ7?ƬOfj4T}#ܘ&B"&o($7p TB##ʄJިO"bMhFٳ BZ2 *7`ě&AC8O1,#^M1&(q%Aa+7lF98.dTJ">F](hӋs@hQ1&Ls ECDG6]̓聡FNcXJ/ b`` b%G! F2SJ/ b`` b%G€m G-0p&ld%3^/2eѭuCiMݚ%H&> I V'%H&> I V'xF{DQ$[F >FA6d!N 1!;>5e@0T'WXxvS6|a=Fv%H&> I V'h(G1LERLPH?ֳQ2}I3A#j`F{DQ$j4T}#ܘ&B"&o($Xh(G1LERLPH"Q^X5kA&p[Zgl?̊w왒vl?f+4 AH2U$LjND8$L9 zuTRI&" 1 *2QEcRN$DIbU o X5$F:i|zԨ)Hm,r141}AReI'gH؂oD[1#I8Eq%Jc|K}V0ptMH4=SBzTh"cg&,r1RD-CHRI&" 1 *2QEcRN$DIb385s@hR /Mk J$M8L)jm_Z"["kmbW>oQHao'PωAY-poZ(CϙĶdL}Wɩc-t)%zooٝ.Q|B k 'k&'jFN Qq?Uӑ|0D IS}3M)S}R'x&iM)NhK /w)97ħ,ֲXS}R'mf@~>RU[SYE7㮶wo8 &r u@>bT[b7;ZwrtZac1 f@~>S}9Jv54@>bT^ IS|J|>!ad)u>MM$Ezcv 8:Cö;B(5%N>q?i"cWNREIp?ƴ7(}J꽙q^̉fDƬȘOSmI:񾜊+KSݿ>$8a2E)?'P3t͎^̉M>S| &Sm*4Lț|Y7)"nK3O>OM|ct"+|؊+KS[YL &X[/Q^X~7H"oOMU! .)%e[?;B(5%N>g|k2NWMk kMPD?fdM7ΘGRD?fdM$Lj}17ΘG(?i"cg̉$U~>k]A"&6q?ۤZӟ8Ο"UD8ӟ41}A5,vzSJ&6"j)Lu,\>'hEdvbA!S|v*4N!ڛF&dM)z&6"j)M!¹EW DjI\k'n̊wbLə$14?f+4bU GHLF|B7E*4Qu:/FjoCO,IRI&gHL+ lL &%nL#XRI0EI,I7&385s@hR /Mk0 Ft!*4Oɩ1:3-kȤ(XE%R/'HpP>'hEdj&.RMb;dޱ wΙD!In9H}AFD%v;t7)$i FOB|)ЀI&R"yS𜌽{)ԨF"|bwWꈾ5$REIqOcTh"hCH>_U]l理R:>Bޢ[LS崑2XG[ӔDƮ!C걃;龝5֠#RFD%v;tOI'[HXF%>nEtRN&FS꿤U'H)Lr2Jb''z~XOTh56DWXEkHd;ڊPopY_7?fEIG=ɏd"(fGՉF{DQ$F{DQ$5*J>L|!Gԓ7?ƬOlh(G1LERLPH?j4T}#ܘ&B"&o($X5*J>L|!Gԓ7?ƬO%H&> I V'!%H&> I _oX6:o3OS}i?-CΛH,tMٝN}OMh?Q}WOgm=;V'{W Dvd(Cvw_U罹jPizkX48ӟ/㮵=8ӟc=U֧ ңEM짰@FB(<ĪH1eicOǧ5NoRcqH3fDɩhB&zD, z罹zD, zv59Js^zN1*:stlO`*oOe>3hEM񖥥z| ʑ?ְ攒t!L%2gJzrH3fDɩh56ΏЈDQ6t+KS[,d2wOb h(G1LERLPH?Ėj4T}#ܘ&B"&o($X[5*J>L|!Gԓ7?ƬO9%H&> I V'F{DQ$QfEIG=ɏd"(fGՉ)3Q2}I3A#kn%nSz`tA0{]j@f@W_g_PRO nD>0.~'u@)Ap"+j>" 7%nSz B"muA@0'pvpðp'ȳ7p=8? 쁑g> nh=d,vD݁g`di#xdxd _`l4OAðp 6Dpn'҃p۰p6Dk!c2& ;#N ZAvS6 geޏ؟5*J>L|!Gԓ7?ƿW8~7H"OM֟!oONJ,v t 3Jk9Rq4ԩЀ*4O3CZ*a|ff%R}7ΩjDKְ/U֧},sP2sLﰦwzo zk^56DWW>oQM^2D|NЊ Ezl퓇p̊Y#3b&d;nl-3}WDjXʑ5"Fu*vzThOM!b1ZjTh"hk[c"ְ7*DjD<5TZ(^u֧Ūnҗs^JnҚXF'>nMk)Qg|қ慨}9&٭b?Og)FTMSI%5"&N}b_?^3ְdo}NթQ}Wu4OKҒKJiZ#R'#ְ%ʿ)LNJ/J756hݦQ^XmE6Coe%XvPj+Kgl?$B+3t͎T֩ iQq u?Rq4өF&`h ~B"sZ-FTMD<7[H}WUꫭO>56DWW>oQM>2U/8rD?ņj4T}#ܘ&B"&o($X5*J>L|!Gԓ7?ƬOm%H&> I V'F{DQ$]fEIG=ɏd"(fGՉj4T}#ܘ&B"&o($Xإ%H&> I V'DF{DQ$;B(5%Q6upoXEvt͎2U OI':Xv5Y UNO>EKkS_Q6t+KS0i9>'hEg|~͎S|K<5]*4J|jOЈv[Y=YG RQrc>5>'hEdvPfܘ^8cdD&ܘқ'qcSrcCZ*4TIYk'5H*4N!CꫭOTC)z&t"+rcb(Y,}NZX^2LZŲ)vPoXږw7@ keW|jOЈv[J|vvPoXږw7_@MkJ56ԟ_j)ڷuKωCbc;jYc(}(5 J56ԟ_j)ڷh;B(~7LgmK;lpX(}A`T ~}))jm>'B"7ӏSo1 %3W Dvba!ٺN3Ⱥwy`Z UI C;z͚A(f=$bboJ>r<^kXU]j|R" zqK8kXFXȌ=$a ְ2ThުOT!1R5 U]j~N,[L~yIjP5!ڕ">RϚ-_ X5 ңDOŴyCְ*;UꫭO>56ԟ_ȢmbW>oQK]`pu$h|NЊuM>:S:#G}AoM4~648|͐iQ7`)c}7Ο;T:#G}9bJ&6SMB %X I5Սb;dޡX;{;b,1cPO0i8Ο"U流XH>68揑,(!rC  MkĚThIkX{f!o'-< ,A5 pF QSϪw}="=>Bޞ]ŴǔN6@&0؎ZkD:ThPs3|aLְ00ELhENb[꽝:_NVJ&0.Dv #<ְW!gTe'OG|B ǧ5!*4O9P,[H/ic+%P}"~6_ְ)Dq?qR äO >Jf浄%>hIŋy`d ~M} >BtCꫭN|^M: 7>BޞRKN 0~E-e4taD|:Dv#b9`R7U}9zE"sZŠUf|ƵqJb/T"&SH "|D流KTh"f!ro*4O8\}'R!f[S[3wv9M7Z@ңEIŋi)lMAa'jP5UZThPs%cZ(HUd'?OgkXQU'qbci$!5ю>!؎5 A2U]jqzN,[HN6@&D >"!9(`^ HiIŋi)lMAa'B45 ɟUS|ґ 4>BޞE zXbsA )F ?P kA*~1;K/tǓF"~<)bw͔t4~>S|ґ 4>Bޢ"h|9nѭ`\|!  kThIXI:qMAcOx2}W:U]jp\SϪwjoԈZs-Rbdɩ$046)F#'@PkXU_ӟ}oٝ5" zk#R!iϐ?Ŵ:q5цCLkXCK hJ{>Hֱh1F0}BSI'N6 >tCֱT^WZ+k!_oMr>(}Uu±FPybASI'N6 |;17OH@B95T.U7M$8D&{3qHtg,G5ToH8i$!53qLtd`HMzASI'N6 |3qPt@hk@ U7)c$S|ސqIӍBj)Oǒ@`H MzASI'N6 |ODŽG2Z5UR XF"~6TBBF8=7`)cXS|ސqIӍBj2f&"٭a =HM$8D&t"$ݘ}g"4ta*P.vNN Ǔ4 4F"~<>!bAb6U}9,svlqd%0|mKݛZ#I`<=x@zSK8OK,**>EK] )XFJ|^7)C-(SM4Z-Rbdi$P2I:0R}ȏH(}(5 q?tR}SM4Z-)FD-IX_N6@&0\$RDZӟϑ&5":JK~ϒ015 R(LyM$8D&1'<^kXE_AiE,u#dTbX|ސqIӍBjOǏ_@h`W7e4taE ܖ|:Dm>E5U=D<:q5 `࿲ޒN#Rz=1'ц,J5 _ӟnm!|B*C>NԱٱFyTzsx@z5" zsUOS|Fg|zɟU[5֠|F=>Bޠ'S7#G`Nb(0Dx2|BZ0W!FMkaW ~ϒ1lְ Qz>c:DF =>TǩM F_H&a=Dy(|CɟU浄U]jp]~쎖86%X1*c47@)6P=70KPsc3HR}eh %}AFƵW +|f*齟;#aǧюSNhn"}i} bDL74 #ȟCL5S.UꫭN";x=>0ELx9LѶ^ZyMk9c:X0ǧц47@)6PM1,qlcTǩhnSm7g'|ޖ6~ #aǧTji$!L%7#G`h!W {>HְңDOLƵZvfDߦ~쎖86@a*c `>Xoҁdtql"Xt I'47 `>1/S$S|܍a+}A;xIjPNkXE_r3|)QU'|ސ m"&OH O&}W*U֧|dkXQ-C揑'|!|Z`5FTMw<]kW̉M1,qlcTǛR47@)6coK?JIac*P3jI9Sz|܍C">|܍c$?ȍkUb#?Og+ңDO bDL74 #ȟCL5R ~Sĺo k">h kW!=$`hkXBThI7|CɟUְ!_2&7dtaO S9LѶ_KݜMzXP,N# K R0Hwȍ05U_R#sZ*4JN,[LyM$8D&1'6_U流VWZM3#S|FBӟ!oQH#S|4|bVT$?OgkXңDOL5U]jrv |ߏ;4Bǧ[҄Z"]iQH7ihVE&@!~;@ֱD0C :#'hMk@5W@scO ?E*pz*ztFƵ8bX~ϒ2Y`P*8m14taHG}WW类8KAX59(`cO45BCFZ{>HI`P9F0}BSI'N6 >twy`?e_d,[Mhɨe4sAMAHHO`ְX~A`L?OgF4FTCci$!5ю>!؎5Q@"~6 CZuBCFZ@/U^h=$[5 e*4QU'I:qMAcOmGy`<*U֧" XF"~4#CZp">ʛѓQH8i$a  ?F4U}9?|МkXf3~ϒ-cZMF0}BSI'N6 >t ^kXu_4~>S|ґ !oQI,mMٝOHO JT3꽝OK?J>Bޞf3꽝JoR!f[҄X~쎖:q*ǧюS9LѶ^Zӟ S{?LvF}1Ѷ^ZSF#ZW {>HF(ңDO}Vѭ`8|ЪkXA *|! !5 XңDO~쎒Nlz}ȩ60FZ_I&"Y!ŴfN٠\N~|'(>"|CɟUkX*]7齟;#lcTǏc}e}A%>DhY5 |!Ek*4Jm("4.B_3|d&ThIIӍOy1I9Sel"%[HdmX"| 2|'<[F¯Uٙ~c:X=>0ELzX0FyjPO浄_{>Hְ$Ԩ*UkX j"!(5 /_!5 ThIIӍOy1I9Sel"%[HdmX"| 2|'<[FگUٙ}Obzogcz}1ic}ehLZ7dgюS?>>"!)ʫZ~ϒ,05 m*4Jv5O~ abBm{>HZ ңDO~쎒Nlz}ȩSI'47 `>MD:Bi̝@ DOfP|D>b|}WfdMo?fw)iH!oQI,ߏ;龞6~ 8|E n,:&->'B"7dV5dRMbM]"j)&lo ֬K %)"Q^[;dޱ $LS`ңD7 Pslk*}W-O>OMYqbcc 4F"~<ְz QiI'Nn"} b_MJX `>>>!tkzU}=7ӿfw}="h|E5cRD )^} b_ME>Nɩ?>'B"7͈d;ڊm60h!/]p{>'hEdj&.N$B8ӟ;NRq>EӾkW|^zoB'-<:qAa' P`+F?7Ȗ%j|!F k0mJ=^kX=J}UuAi=,tdOǃ%8 ~N|a ֱHU~B D#Z•(I'N6'>O2>t(}WBe_)SN}4"h|=8E-qm􃌞Nh6Ϥ*D|:DyCAbh$U}9?|a,ְ! *|! |a`Dƕ(Ly=$l"4F:D>kW类?%7;4Bߏ;龞 4>BޢqbcJADϒt>:&:񾨊&.Ezcv[ ֬Kh!/]p{ωAY,퓇zӑBg|Tf_=|B OB9}a6>% `C擌.^kX`oƄH-C3꽝OH!oON?LLhDcw|T?4"Ab*o*RB$S};g}=7!f[SXɟU罹zD, zzP &w}IjN>G)KK9>ic{9RE-dta{3vgOǓ>%ʯ龦qIӍFpt %E_ zX ц$RRLM4Nl"4p񘛈OLJdZİWSH8$#AA>@"~<aɭbX\odta{ ܐ|:DxSZM4Nl"4qqH@kX龦qIӍF퉙|:Dv&}q`AU72zI:q~=jMs'jBZvodta{``Mă'0}ְ(U`"tatԒu, 4rzI:q~|:EJL$Y'l~}`gKK9,)g{;4Bԟ!oONoM4ض Nh6 OHe`W!:nٝJoR!jO&攈Z-TR iQ-CGȈQÕ_QE{>HY`>*龥ZeW类>=ŴǔR4 F";RLVwzoBJ}Wu>MM@mbW>oQKM[ɏq h!/]p{ωAY,퓇zPfU理:|}W&e_D͜C%5JCߧcZ4*U6k~S g{;龞 6>BޞJŴz*XqtD R"e (01!N:|jMkXR|=$X"%R}'-CR&x]>EHS7>r{c/hְ }Uu,};g}=7!f[SY'-="mHLg|қ攈Y،ɩh}SM4YzE-c a*c)*I:7OH@?ϟ"Yb|! EA`:FTCI9D:EHR+FX7iD >P|P"| 2Hy`0IUꫭOض4TsA7O"1'JdF:ELc6Th$F ]>@"f zs3|aְ~B OE*4Jy`07UꫭOoB͏.ٝJoR!f[SU/>Nɩt|NE|o"Q^XmE-v.h7ZK,SX;B(5%Q6tk'0";6g|U')[LiQfr}7L~$ƵW51=!d浀HU7IU]l)jcȸ1f? _ZL*U֧+ k lON[I CTXְ 3FU֧+r3|浀 WN,Z̋=|$L>65 B#}=9$L3q?RqbcZ|Q88m1kFU֧ bN>kXzIX&>HJ>&-NOHnzְ4RD͜CTXFThU]jp$M;}9QDƵңEKoaIk_{PybAǪْl ְ2U (jP=7LH8<$+ FM#S=d>x`jkXB齄jcAǾ!d̓`2}F F?{2M  W51 %4 mhkX ԨF'}2}1KI&5"'Jdc&~MjDOg*45"g)^MjDOg*2}1)$FDr6O1zI6=M^=aʄLLczI6=Cdc FԒl#R"{9PO#F051(Fd?@k*oa/ M#RE{94JIʼnzZl7UX/)8C4~5˕@وy="P]gi詏'}ϐ9,[H/ZtRE=D,oPְEIŋi(5A5*4T3G'-<ְ3FU֧RDԸjH}ASM#R9a5ߍ:Z,foa,[H8Vߍ#BU %,jP=DA)J`g ASLz#Zq*H'-<ְԨRDCTXsZr>iNTlE-ԈZzAE/)ңE=cə)"iUٙNɟUٝOKN>Bޞ}86ԠdԒt6HTt2ZĀW!M$M;fD};g}=7E$M86Ƶ*4DPyb`&Ũ}9yD2B"DߧQbhcJb'I'7~[~=;`$,F_浊*4Qߦ=b[JꫭN|LŴdϒ!E_;|]OM-jo+ $e7ӿu xe\~7?)"dԉOhl|"<&O 34~>RiE_};g}=7TXw?OO~OŬȹ=1WYӨ?ԑ3GkXEbON AikX)Q"l7?iDkXRDԸ8m1ޕ*Hw'-<ֱ=*4T3G'-<ֱ>ZTh&'jThU]jp8ְ-cKN,L;ԿOȠŬ~QIʼnx|ְxv~̋!|/FA+ iӟIX_浃J`g ASLz#Z REIRPŴǔiQq?Rqbcɍk*H}ANkX>*4T1}ARkX> iQkX>2FU֧ T3꽝OHOgIŋi)lMAa'P#U}9SMOٝTXXF"~6_F>)x})3{I47wͩ"fh6~2bjD-8ǧцc0R!iϐ}`  RIXꏐ6@hR>0D7k~&w}9K"" k%_~ϒ,F`3J`I?^K~=;`5M*4DPybA@^(!fzFoJ$MK}APkX=cJ$M;}ALkX=*H}ANkX= Q\CTXZu*4T kzThU]jtE4ߒ9`7U7䥍fr}7L~E-z}&Ϡe&ΪF?{ Ylnx1}Qb0Noaqx$~x`jkXj齄jcAǾ!d̓`2}F`>U7LH8;d*~;,5 *1J4jP=r&=jP=KMzXFg齄jHg%{|CԳ$GԾCZ01U7LH8M%|BƆ#Jbw'l#R"{9Z4O2g$FDrSLLbl#R"{9Pi^iI&5"' 2}1IHBoLLb$ԈT#dcIHBS'J6aʅU2y1?ܦ@423$~kX*oa/ I6jP=DjND;浉`jR}'-fEƴqωS?ica$B&RD!*oa/ |^zoB[ӟAi֖:rUFȟ)|BBְ Dq?ܦ@Ư"c16OH k MٝOHϐTߑɉߒR5(D":&}Wc-B%S{ƄGlJ؊,[H8R&x]>&b <1'2ZB"齄jccB#N66h$ ]>>WѼtM9d0{tTtan. RRIHDzD8ODy04jP>"=$8D:D>>:q]>0De j"q?ܦ"龜l!l} 1d954XTӍa') :5Du_ӟ齄jcHDzovH:ELzQ>@"g&O8m1c OSSb%~NM#SEB#}8CA*cԪtN,[IEI'N6(6Tl#R"}""7N66>D>}J=,tbP]|BƧю? &wĕ>MM$?ė5U]l |^XF@[Ӡ@.Ŵ욖8Nhl|E蟾 ֲUު_T}?)&>0ELm$S{g|z}|{KԠ}(p zk@N_$_yb joJҀGR&QS#&rf;S6}WɅ*4L4KPs*oTJҀG 3};g}=7!f[RK6%$Lmцߒ<4hz}`oKԠ{9,O>OMJҁgT3JXF@:I:qc&rf511,tbUHŴ7N6P1^ǧ">t ֲALy5,tdцXF@:I:qc&rkT3꽝7Ǵ-ĺoǥbsCjO[JMI'N6F ?PPkX~NM00dkY$#*0}!zoa쎖:qcXa<,f+7 ?C k=~>i='!oQMcH}9NoR5(JIӍK 3:a&wΩuKԠ}(GI'N6,z|:DMM,soF"g|TJҁdttaǧLͩcS|0;T:jP> #=>@"g&97͏ 3uMٝOKԠ}(p zBHfDߦZ)g{;龞 4>BޞM#S".F?4"AbPJ7ĺXFȄHwzoB"Fr!icag""FsZ&F?5C}=9Cꫭ~F?~4"SMkf M#SAiJ$hT@/U %,jP=DA"*A~ְTh1`,S|L5*4TְԨR ZXQ&ңE=cƦ7FLȧɟU罹zXF@[NF?;#N,l#RфtOjMk2q?)jcc3TǭjP=OM#SN6@0Dg&R5(JIӍK 35(JIӍK 37SϪw)iH!oOHJlg|M:c X01X0F{;₟&Z)c!Hְd MI)(3(|P?g|PkX S{lO"<<~>Loߏ;o}9h7Ωca$%OH@sCqoa쎖:qO S?hnSm()g{;i8 zzu:~6&wΩuKPg'{dtӍV=(F:DK9MAF1;7Կfw}M,q |~P_U{;o7LLvGK8ǧцSK/g|PS P,y$4)Wߑߒ;7 cw o&!*4T51$[#qcHc&rcoߏ;o}9h7Ωca$%OH@I B K齄jcc:X=>0ELzX0F{;₟&}Wicϐ[MhRg|Tr}7LLvGK8ؕcXcL䳔i(S(S}Kg}M7!oQMb 7!M,qE^O}W?S{dtӍ,z}`jX0F{;₟&Z)c!Hְ?B;S|Pg|QL~MDְcJ7LI龜l!A*cߏ93zoߏ;o}9h7Ωca$%OH@ͩ$!L%511,td F"<ږ9LѶ^ɟU辶X-|:,qAM#SN6%X8}9,7woR}SM4[SXM}ASKQ}WU#;T511,td F"=U,sCtlAOS|P-C o|ФkYWߑߒ;7 cw o&)J7LI龜l!A*c~>L3?ZӟցM}AS|6@P,Nl"Xt U$D)@ľF?;#lcTǪhnSm()g{;i8 zzu:~6&wΩuKPg'{dtӍV=(F:DK9MAF1;7Կfw}M,q |~P_Uo?fw)iH!oQH%S};g}=75(J>Bޢ4)"oӢk*H|OSkDWfE$.D(Y,}N-[f3ay(׮V%k"Q^[;dޱ!luPC3"}7Ωc5 bdz^Ou>MM:lE%Sfyk+XseaKLi>'hEdvbA!ٶwΙ־2&S|:ZdLMM:lE%Sf ^i5땬9ZŲĭb"iK7~7Lg|~͎S|~QNX(p zzq7c:XO )z&|oSj:J{ ]svPoXluwөjo~>罹zXi@[ӣ,uY$8DaLOjo~>罹zXi@[ӣ,uY$8D`~PXM|OSl~|NE|oSoL']sb|KI)|NЊ Ezl퓇zPf=}WhK kp>D %6# >ɟU罹zX攠Y-Ω945QZ:S|Ҙ쎖:qO SOwzoiJ>Bޢ45Thְ Q}Uuu>MMt"+}QW>oQMo6]$P%d"Q^[;d޲A!ٶw_U>RCZ \CA2ThU]j|GSϪw}=,sJP,T4;#lcTǭz|9YMCZ[J7ԚBzThOwzoiJ>Bޢ45@*o5@~'WZ'S:>'B"7EzcvaJJH_J{8F{DQ$#fEIG=ɏd"(fGՉfEIG=ɏd"(fG';ԜY=$]lq1 >RɟU罹zO잔 kM$\!Aֲ8IU}9&S|8 ֲ8sɟUS|ғ')>BޞcXԠydrJCo6)5*>(}Wfw}K{'?:o?fw)lx՝joRde'[SZ7ԸsOwzo_)g|{M=(3-)[>Nɩt|NE|o"j)V2ƄY%%%vPoY!wYϩ}LhDwǪ|>UM,sɍkr>r05ThPv9M7ǯ``=?FSϪw}=,sP,@SϪw)iK #=>@"4>Bޞ)1,td F"<K/g}M7Ԗ= kX2~N}K)51,td F"<ږ9LѶ^o-C){KK(ְd>)r紱Ծkdq?io?fw)iK #=>@"4>Bޢo~>罹zXԠY-)Ojm_j)ڷhe}-wLxh|;B(5%N$B6w_U}V;=XZTpӟ|]k2CN,9'RzSZگM憵AU;龝>GI'N5WylE_76v詾lj-S8zX篈zVdzzSZP>[IœI_MkE)z)ߏJɩt|NE|o"j)7VEy$vPj+Kgl?!3gqx#ْt _^=N.U9{6wd tZMu=Jn/&5WS}?" 5@_g"Z)E*4Jn/gy` U]j{}vw4^ iAqxj'S@<"tt DL ֲ)U[M cib/gI'@D@ɍk!*O>DkX/UT~ϒ,@5A*4Jn/gy`CUꫭO@<1 'jo)HFFߧPkY $ٿ};浂W/鸼?q?" k_'~ϒ,@5#RDOA&}W Eu_m7q6"t浃5_56GDW +KSַ &uH2uy$'P`͝{;57΋PI;x*oStTФkY )Qg|қ慨}9YIt6_NkYE*4OkY$J7HֳЙW:h!Hֲ龞99>罹1;T:-C7u>Nɩ?>'B"7͈d;ڊmki!:Zz?>'hEdvLȡ;،͍3$ٛ161^ꫭw{;ٶw͔3꽝OKY-MFq u?ƴOK?&}WiMJX?$%OH@P}W(GI'N6,z|:EJ?0 c57}A&S|L~:eK~LkX|q?ϟUٝjo3|Lv cf `>b"g&ٷnjN:P,Nl"Xt I'47 `>1/S4Tr}7L?-CSMN6@a*c47@)657}A&S|L~UMʖ8 ִU}9|S|ٝ즛cgK6nS95TͿfwt Ps7X?$%OH@I B KM7X9>woeL?-CSMN6@a*cͩc}eU|>)??g{齙REU~N>;6g{)͛|0DMU7oٝ7>GM?P,Nl"Xt ڒNhn"} b^ir}7wc X01c}eU|>)??g{S{2?}&5*>>}WfwͩlSM137@)`ofߏ;ٺo}9ږ6@:I:qc*P5TsCq>SMmK47q u? oe.!*o`쎖:q*ǧюS?hnSmo`1*cԟFyjNS{dgюSl}e}9[MF:ELz/-Co3oMG7)c` #=>@"4>Bޢ7OMٝOKY-)aJ!'#8齃c:X،6@a*c `>>'S齃c:X،6@a*c47@)6POcb0ǧц6hnSm:GMaO S9LѶ^ZDG U~B #@oJ>M>lAU]jq47q u?B'>6SϪw}=,lҁg1,td F"<K/-Cvg|O41,td F"=M,sstl?_Uٝe>{dtӍ,z}`jX0FyjP;|<c X01c}e}AR)o~>罹zX?!oQMd6q?i7@SϪw}=,lҁgb&;i6@:I:qc*P3G+ zzl?;#lJcTǏc}LѶ_KY(ND)@ľ?;#lJcTǩ0F},lҁdgTji$MB K齃c:XīF:ELy,u/v7@)6c` #>@"67 `>1/cz}1c}LѶ_KY(I:qo~>辶X?$%OH@@-)L"7Ӎ;H:ELyY93Jo~>罹zX?!oQMJic`ٝ$D)C-/|L8nɩn}SMΖ:tl?Ǵc7@)6cftu/n"} b_M/ٝ4c7@)6PsĺXٝ7ԿuS@ľ@q?Uv |^Xٳ-h^&}Wc` 8|=-%SϪwoKY$8D(Scz}1X0FyjPϣ"<~}e`Ζ8!*P5G[ӟ/ic:XīF:ELzX0FyjPϣ"=Im:Xt@!oN;{S{dtӍV=>tjX0FyjPϣ"<6,qLCTj?_Uٝe> {dtӍV=>tT `>>OMF:ELz/;tǦ01 R>Bޜ)}Wfw͔ZofwoKY$8D(Ԗ!:,wzoP,NXٳ-) ,U|OSk_فW>oQMv\M) b,^>'hEg|~͎3$ꙉ)$yb&ړt"+}8mE95S;XXgMu2%glouP`3{>'ƒ5`@ّAyb=(OJ/,ٱ)cR3cg|z;TɟUS|3cPRg^3g H # K RfE唠Y$l"Xt ~͎mIRdtsc*P3flszcdtΆ=>0ELzw|^o zzI{;l{>  ۤ7 `>^ZkY*>'S|^4ߥ92zI)K; n/C)Pqe^(8iAiM⃈t*e?%7Ǵ֛}e|{MjXM `>w>֛}e|mM,u0F{;&S P4|<=K{'?{;Ā>)S!|PM7&}%AXs]^$)7Psn/C4T6P|(F"~:I^%S}Sg}U,pĥR2HK}&5pU7cԸӟF|;!~4~xJD8Wٱ /i?LkY\w)?=|Bɍk<~N)Z7)'gqxM⃈v7!ƪu>oMcib/)$C9r~ܦE14EDL ֹW|Ǔ0 Xֱ 7.!m$x!HkY1U=^kY p-TwaL`Љ SNZi8xy3(ֺ"Cvg}S}=1;龜?L'sNSϪwKQ^JGdψ}NLk\W!:nOٝn/%RT|E54^J zu4T6P|(F"~:I^&S}Sg}U,pR2HN}&5*1;7>F/ٝiKreMٝ[KIOٝol{> P,ɟUM)c>BޞF}Uu{MX 57 R /n)!$K C/F2UOg@f( =AcOtko}ߒRT|E5}Wu>LfDzBQ+OЈQ6t+KS6񀵢z׭Y%+vK4|NЊ Ezl퓇zP`͝lsdbng};;辶1Nɩ?)=/Ǔ %U}9N)Jo?g}=7ӖNZӟ@q?ӾDD |!){>HMk?Ԩ*$k8UꫭO>*e/Oa}9Dj|!oFlBM*4Jo|CɟU浂/U7 Psc3M浑%>74g'}9d`F!֛紱ϩ$;i>U֧_U|OSlTE%SbkL'SWKA |'P`͝lu;boC꽝̉a7ΩcM5$ʩ=^͎joS_Q^XmE6&cI;^At@,ωAY-poXEv :fZ̓f&3{;4jP~LMZ*ThPf:59 ~N~БMZ iQqeZoWJzSQ`8U/_ZȀ%R}$^kZ|ȃ8ְ\EZȀޕ%R{ֵWgZ{>HdCThIZʫWZ "_)vq?}k_ZaPֳU}AD ,UJ~ϒ, k_J=^kZWZ t`vvM7\C " Zςu_E5JThIZ_ ߠֵ">iCt浆r4}A \5U~B0ߧRkX/ңDO5pZWZzoq5P|浂Lb"Ԛ %R}$yg`W类;EߠַCRZhL|f&eJ>OCֳ*}Uu%$S|:sZU~7CtsG R|D_U浝WZi;JC@jkXz ~B+,~ϒ, k> *$OZցj"j|!"|`ֳ6%R{ֵ.ȁ*3ZНW!"JThIZփ_M k`">Ct浧 ~7CPֲ%W'IEiQU'I}Wִ-UꫭO};v"Mk!e_)~ϒ,D5E*4JI=ZW类>P|ct"+|؊+KS0ndX0 c hKA |vPj+Kmb;dޡXf2MlhWikAE齃:c6w}M1_U3nLg};S{tƄHg}:&r> 龞6Ny1k%U}9NOL~zo-Ci?ӾDkY U~B|ңDOdZ]~S:cB$3hɩhZ7)ccGɍk:_ӟ|mMJcw)hZӟ(|е?ƔsZ΁CB0Ur{>Hdž^%R}$>kX}Uu“oeTI66M"LN>Jzoa;7'PDj4wȸj͎'?!4ֹ@eW|"68xjֹA57jPtƵJThPccgBޞd1,y=>0ELzwͩ:c:X ,z}`;1,y=>0ELy;o`Θ쎖=,stlJ}-7΍ `>w)7XF0F{;2&>tUK'~gC}A}k}ASM!Ч?o~<ְW/wĪo~;ZZ[LJ|X՝*IjPLy;qs7ħTe7RN`x̓/`xwZ$N:oN!NS}U,tv8vXpWKPJT QSUK;2N-꿦cwS}QjN~Oi3\C($|3uMX-)%M;S~JX3!oQHtKPavIgu*4E}A0MgW!…7_n̓ǃsZ꿤σ%~5ɓRDWsU֧ SϪwS}"!oONoM=(5$D)>@"~<pU}9Nۦ'*oBS-)I*D+%>Bޜ4|/dk[__ZzThINwygWZJN,jX'ц4ӳY>UMdžM)5PIU}9h^ ּU~B?OgֹQU'}; U浜ʿ}UuQRC9ߏ _65P4U}Ah^J5yEFְX&ңDOw<kU֧ VD *|!#351FTM!ϪZv>Lg~JoKtY-h< c6@a*cԳmMǐlcTǏ7 c6@a*c͙{tdt X013꽝oR!oOM>Lg}m7ָ&OM슛}A7'PM;JJodN!Ш?͔6tnSmOioK/g}RKM,stlJ|mM9ѺLѶ^>Lɩ?ĪoJ5_ӟUK;  *>c|C#2N.@aWYkBBA|5y%R}7RIӾn>k꿦cwS}QjNY7ֿfw}kreʛOٝoR!oQMCo}ߒR(p zBHIœLkY'Fе?hF45ԨƆ*CWZm7Əy32NK~<ְPO>ߒR(p zzZ 齃:c:X ,z}`,S{tdt X01w齃:c:X ,z}`fw1,y=>0ELzw>Lg|Tǧ[ft:70F-k%Ubwӟ{>}e}&٭`.U&}W\C'Zog{"DPM={"q҃қt*e?%7ͩc}eSo:7@)6T|K/g}RS|S|8 zj=ٝ)%,lҁg$4jPS}=,l?. QW!:rܵ?)67~;_}oajP}=,l?~;pRo`Ζ:zI67M^=}AQM=)> 龞6 kU}A7.3$؝pְ_{gMְؘU~PMlPv&5jgM jq?ۦzX~`ՙ&/`ְ0U7ӈk9:whYaMO{RNK t\C]iTӾ aIO{-q u?iU|OSk_ٲ(XE%R=f ȱY t@ωAY-po[(Cf͎#$C17Y -`oF'>SM ֱU֧ tKPkM$ְThPsU֧u>MM}A}=,q!cZ U~N7Pso-CjJCC| k:QU'IćycWZ^.|Q$IĺDLWģZŗ\C]iWZ^)>¡cThOM,*1U7zcB$RNOzX;9OKH|Cəswɍk7_|Jg|!n!Pt**~Jo|W&浛_Jo|fW|"6:W&nf>MK;꽜"6<LJY9f5_}=,q%9ְ$*>|ְV+'g'D7sU֧&`g}J&}WiMJD+#>Bޞ4|/kCQ{>HfңDOw<k!W类:7+8sU7ӿ!4ֳuq?" ţZ ~B,#?OgsZAFTMx7}W AU]jvzN,ֵ4S}=,q-uNj@o%}A7_ v``kX$_|Q5ʿq?RN䰢ic}V9,(|L5:QJjPbo~<5|BhְW!AxkYW"[|5A%R}7Ӿ!^kY6UOa*jP|P|BC5_A1w__9r(FT5W=o&>!ؙ'LkY6U7$`ֳb龝b#?.)57>:Qa̪q?ͩ(>!e!¯C" MkT|!=$aqThIqA^kXt MHN k*4TC]jTcg%>SK;ꫭ))ӟc}VM7:XaN⣈k9:wa9,))oӳ“OjmDW2(Y,}NRcy$]-%?ωAY-pnK;b4,P!oOJ)kA5,Pϐ?Rg{;龞(URdtsAc*P3C-BMMЪ;#h6@a*cNnSmOS}IjPM4B?LkYpszkPu_=?Uvt|z!IN-U,q꽜MꝡNiSM%}9djnU1,sAO SmK9LѶ^>MM%}AM7xy1`W!֡h U~>(}WSKM7ǯ_niSM%}9djnU1,sAO S?/g}J&>ib<~<ֱDU}9=5Z0U;oKPs^KM7ǯ_춛iSM%}9djnU1,sAO S:stl*|KPocZΪ>X7ǥ}9PS,u4HhRShUKzg'|zĪo?g}M7Ԗ3bU(GI'4=>@"4>BޢMMG7)bU(p zIa$K6N`65<Og#ZPJ>J]k ^56B r(Y,}N!hXvPj+Kgl?$B6wΙֳ$Uٙ|:I;Z3^̉f龝OSl~|NE|oEzcv UebXr|,/vPoXښN2[qqRqjk8 q'SjN,P>kY>O8;g2zru>6ǯ浜U~ONNԜX|ֳW!|mIŏk8Xzru>6ԿOp*>O8g>O8|ֳW!|mIř?Op5U}=9:Rqfo ~ONNԜbwU~ONNԜX?~5"Cړ>O8>k]~ONNԜX>k]"CړkCړ-U}=9:Rqa|ֵA%W!|mIńZ q'SjN,$O֨*>O8>kZ U}=9CꫭO>56ԟ_j){B6Lwo'P`͝luZv45HңDZi-IΆ%OHv4|BCZԃJTh[I$CaǧTXv45L)jo3c>]g[ӏ龝 ;}m1,td CGю>HoU7ӿfw}=,uY+ zk)cfSLq뭜q^56DWW>oQMa1K|NЊ Ez`M]gl?lEv Ƞ[;Pf‹2M'XwdIʼn$_kaM!CꫭNM(7a1jPC]j͍X0 KXQfb4ʣɍKoaFE,l)RdtfWYFOD֚mJ;d'/1>ɁO1x9~= ^HM|UL_/1>ɁC>DƢ`τ2`r7>τ1x9L_/4‰;xQ,?Uٝt‰;xZP[LﳦH0KPZw٩g{;oc>Bޞڛ)cġXQ>t0kXjq?tfwZ|E5TaK~6@)>0ELv)q?}a*cCO6&wXQ~cW}NZS ThcaJQWٱ_ Y!*pUT4c /fJ_NdB /*0i}Ib|ɟU?*P,JJIaǧTfv>nMk B5*4LM)caJ #%OH@@} 3{M)caJ #%OH@@} JTh>JIaǧTfv>nMk oJ;~>)jNo:)%}9PS*|^yM6@:I8l"Xt zzqbR;#? X01icLіǠ@ľR;#? X01ԱpKcH{ Tdtd F"<K<7`>9}7LvGK~6@a*cR -/I}7yM6@:I8l"Xt zk,JIaǧL|6@:I8l"Xt7ϩcaJ #%OHɏM,l)RdtqD95Tfw•(p zBL|^yM6@:P3C-j{;O>|K TY-hR;#?z}1XLѶ^ZoaJ1*cѶ_K /ǒ@F_EX7wS};mM6YɒUٝz*R;#?z}1ic0FyjP齅*c3HR}ey) kZW|VNS|<rdvg{YM)SV=>tjXLѶ^ZoaJ1*c͏l6_%>kNpʰ;O*c:X*ǧюS8xnSmR;#>tGѶ_K /ǒ@F U~ϕ`x1N!q7XQg&H}Wfw,3?6@[REocO|<~>)caJ #4>BޢFSϪw•(p zzPS•1,qǧц4~:g}U7Ri*c:X*ǧюS?/*P,t I'TD)@ľR;#?z}1ic7@)6caJ #>@"SI'TD)@ľR;#?z}1Ա}eJ RRI>"v7 `>1/cīF:ELzX `>XRϐH@RI>"v7 `>1/cīF:ELx:;}e}A[M)SF:ELx{66eL!3$S{ TdtbUO"=M,uOv7@)6PR;#>t'Vٱ:dٜ"R;#?z}1Ա>/-CoaJ1*c͏c`2Cg&HcīF:ELzX@nSmm7LvF}1ꏈca2Cg&H㮶wS}U,p zzBIR;#? X0$\MRU%JIaǧTji$ḈS},l)RdtqD($<7 `>1/*P,N?=>@"UI' B K齅*HGMCTǚ?c&rffw•(p zIg|^7ͩcaJ 8|=$ƒkA5,l(!oPQFQ#G`wΩtZtFx12>{ $h#-C |O>D%57U_=$cSZǠ%R}7LvGI'6=>t4l("dqKgyanWZ%tZtFx1ZӟZoaDc$?)u>t`ְ*?OgZkYRDO$aǧюSMDLn"}i{L5 UꫭNS{ !7Fx1ZӟjXQf KQKoaJ쎖9ǧц( /-CvfD‰;xIjN‰;xPsRC]i•1,saO S?P2ALѶ^ZTФk\ڕ&wS})z齅X$4)c ,z}`4R `>X•1,saO RE}"H7 `>1/S‹꽜M)S6 X0$]M7H B KE7Fx0>ƒk9h`=5*7OgQa ңDO_gyf@WZ^[M( k1sGȃa%Og\kXo-*4JoaE&}Wd U~S T•1,saO SmK 4dtl6Y•1,saO REͩDOg^kZIJ>Q|CɟU浾W类:.R;#l6@a*cJH7@)6caEM)S6 X0$\M(!q>Lg}U7R•(p zzqBc!oNR;#lJcTǏcaF nSm•1cTǩ>>SM)SF:ELz/5%,l)Rdtsac*P54l("dq>YMOٝTUK TY-):ĪoaDC">7N>DhA#*4JoaE&}W֘DUꫭNt‹ִQJjN4|0#<U_|ThI‹L50pWZ…7LvGKlcTǪP2ALѶ^ZOcŊ|!~ϒ,}*4JoaJ쎒Nl6,z}1$QD!Lі!ϪZ]W类={ Tdt͆=>0ELzXQ$}eOc ,z}`.QC!L%6~>S|ږ6@[RoaA5֜)"YPgC]iZE|!b|f_J>Q|COZҁBf`#*A~ϒ065iQU'{ /y)^kZRJU]j|mM*4O>Nɩt"+{ Q6t+KS6E>'hEdj&.NlA儶wlr[2Mbm'C꽝FwǢhgCء>-C齷,lk[jq?ۦ'R2N$֌W}ocbcZ4w{R_fIēZW E:ocbcZ5辶kYH.U;齉&jPS|K ַ@qW!:'S7)4jPS|K ַACsZi>S{o[f*C$S}9jP4OLy;qsK1Qqd@ֱDU *"Ǧ)QU'Io>rgyoU_D U;_SOgMk QU'kxroS/JꫭN0[MJcڛ؞:R2N%^WNZ7NMJc@icN~ϒ,E5@6FTI'ih=ɟU浺WSZ@U2ZjThIZu9("RDS oSNcU/$YeWqy7kXT~N~ $$HdWye᪯龝NIZThU]jvS{ٱk O'T̓&r齲>{8"ap*=$Xf4*$ۤME|5U~M}Aʛ'q5N>D EZ_"3ZJ>MyeWQPָ5W"A{>HzkYu*4JyeÕ_}:>Zg|M%׀Jq҃ J,_Og?53Ԩ*$}W J-N19{>H-53*U浸 UMr@]JꫭOTNZ龞w'?|Ҙ(i97=,mْqHֲUaMOKJ}'k-ʿP{MPP|k2|!oEqp ThIm&"K}W"j龝N!ZThUOjm'DWEkHd;ڊZ[ĬtrK扄ҫX{Wu /D"Q^[;d$";l3$̐D"XF~ְ> ~F=-CNFS蟾=}>5U8tݦjlZ̕~oԿ|z&w}9e";I=tNkYhRDZs7i=.CZΖ:u8Sjn:XK-*5z3u/8 )Qg}=7ӖNkYhqJjrWZS}9eңDZs7it_vN_RSQ^&w}9jNX~{_UqK{ݩƵB2߽p&T͋GOֱ*4S4#G}A{MB4~F'oZ iQ7`)c}7_| JqhJjN>o?fw)hFPsv֕"8P(}Uuz'S٣t"+vEzcv K"":M|NЊ Ez`M]vGA儶w lBq$'$3BrSꫭw{;B;>%//mH9NQ09} Br($0 q"1;ωD8 PI1|J&/D//mH9g{ b]'&|_k$Tf6=pӟp[9!.=fĠZ~!hkjNH|&lJiֱ2U3uMq?_US詸N 9v&wԩg{;攱ԟ!oOHVmMqnNt3N Sp@-C,Bq^ I';7 >)}WO8kY`ңDo8-7CP|8JS|[5RDZӟtLh<'(cO!0>D>"(vi-CWZk%7 ŷɟ$iZ*9!cZPd"|$%J+H%T"z]B{; 4'$>EɟJ+^w(i@P>D''5U{>HRkY*4JngycʯU]jp8#pV5$U;\ Ps!:#Z|!_&ZThI'$>!ϪZqW类869"6)@<$]~<ֱW@0FɍkJs-7 Ǔ?N^CTh7Z4$8T%R'$> 0eMm|HjPS}i?Si*4N!K꽝>7ֿfw}i?-CtPR߾ֶU_'$>95*pO>7,qoR7 icgю?PkX`>'S|3oMzX-)K,qwȄ֌*_ MkHңDOoZ:U]jp?9"8Fd[ֲ,sqIa*cM,BrC95*qj@RU֧ 5>Lg}=7 X `>>6KA7 `>@-/5n>'SN}OMq:stl?J8K9LѶ^ZӟU7ųZR'i$B Kb4N})^} b_MrU$[#f'4~>)nPMjXdT/%8ӟ'$>Ei 6!93 >5/ ~ۦ9!+HY ߍ/]&!W{pLhDw>MM?)-@ɍk+~Pu>|0ELbS}9YMrCVbH_Zzt'$>Ei 6!:'i F5lMrCƵ_oap? oarwTMrC ±axA9!ְDU}AM7 DŽG+ &W!P Ο"kYs|!B|=$Xְ)QDRz$CK3k 5*4T4>QM7]*4TOKLMrE,qm%3$WFU'3꽝c>tZ|[6ҜX'otӟF:S&w E5>,tѶ%J)0źI:suMٝc>tZӟFkX#RDZӟE7 TƄHg|N|6ʿq?kPxZjXć0ֲ:REK[~kYP)Uć&5lvs=,BrC6!8؍%|DU>x@z!9!4ʣ7` ,! ֱZs=,BrC6!9aKX}k%,BrC6!9iKQ7` ,~! 1`t*>OK͈NKX}k%,BrC6!:24ʣ7` ,wȄ:0Ujz=$e*$6_JZo8pFx0>'PS};BsCZUn%?Og& )QU'I>k}UuEN13꽝c>tZ|[6ҜW8|[6ҜW*4L*}7źXϣl3J(pQ7`)ctt ߏ;-N}`?MrU157>-9"8xy) ֲW!:'SSS|<-Cn)cǒ@ɍk @qW!9uwhĩZRwhꛄɍjFjg{ 5-ʿU'&I!9!$'JFQ$`zHNHfI #ʐ2ct XFO%7ŷ$"ahZs)>@)'q5NM(sB(O ͍kW$[|b c(OU'HNHM&~=9ah%F\S eJꫭNQE7Z1!NM(i9!Ȅ`|&U+|cZeJb'I$'$R&~L?ֱREM.)Q}UuB7ZmM.SNj14I+(}CZPnش5~k=W7h>REKGOCQ!@kPJOU'浍CTh;+ңDSv~PD5_ꈠ>D':5r+d(?Og![-*4QOT!$BBH|DɟNkX)Q >:!9!3#I`D'ֲEOE5F1I?)p?&|DɟNkXX4S{ p >0M.7Ly;vS|<; .!NE!=&_ oE5Th=TCI!9"7gL浅ңEM.)e*4O8LmM.S{ Ǔ?E7LyM1,l.RJbֱxWhjPVwh꛴tP"^uI%!B1I?~=9aX4F\SFU֧'CSZ q?~ Mju_ꈠ>D' k|!@?~ϒ,B5rF"z=PBrC _2gӚS{ pbңDSK͈NhFx0I7` ,b ԑURoXR'$> 3j|ALzkX U~NNHf'7%MKXv$hd%BrQa_?Ogֲ/FTI'UִB齅>)e>)7Z4✌ңDBcԸ"W!3|ZQU'IŷyhWZ`,H,~xJD8WشQ2ɍjjgpN(Zӟ揑 ijZU?~ϒ,8*NH|CɟU浍U]jqyMQ:vw Bޞ?9"8O!X~|ȟ%>!oϣ SHNHg%:n)c$ F혳BuGOf/dZs%_#g~JoKQE78ӱi?5m*4T'$?LkXP&ңDZӟBqXְU~B,䌴ֶRDO}WcZL~S&SpxD5(fZ5.;UoF:5#RDO}WcZ-UꫭN n)$8ӟBqtְr#Z6%R{U~S[MrA;xlZӟnѴ2-C LLkX~B _ZÊThIkXRU֧MrA;xP?NH~<FcobZҪ䌸ְ iQU'a@WZT'$S>69 a( f&6 ~B,?Ogyax2FTƵU]j{Spy1A*.S{ }A(S{ Ǔ?ĪnVk(U_ 7 DŽG$"1e2nVMk($>y@ְ:?Og>5.Th=TCI!9!ɐD|DɟNkXNREM.)بFU֧i>)F>:&9'I\"Q^XmE(IB0;_"sQ^X~7H";lS|@tFt6|Ѐ|HSWȍKOb(_v[z(*ĺZ(!>'hEdvbA!3g|OMƵEu_ӟSo>!!kq?UOM&Z$_ӟS>MM:lE%Sk[ƵtPCa,T/Q7 Ezaޱ uM1 /3C(?ܦw龝9JC(?TcD"b-|Д|ce>5|PS/>NɈ=|ok[)mh_tKW8~7H";lS| kXLW!Ce>OM u_ӟOVYW!C겕>7Οq?Uz&6"j)Ƶbl%^&vP]NY,юL8~7H";l3cdW!ڛJltVTkXfo>!Xֲq7ΟֲpW~O>Uxu8xwQtfP~StD@z".ުOT!}NuF"qe3ȃ(ְW!/FFDThުOT!$k' Q}We=i k L~NT͎hL55$*_Ƶ_o|B&,5`~=gX7wS}Nu`_k z=P y87@D*o|Bhֱ6U`I?qϩN!Atb(~B/F k%*4QU'Nk}*4OU|ct"+9.ob(XE%ǔտ6Fu,d. j"3"Q^[;dܖQ"꽝Z崒PDjCZ=*4Oݩ j`W罹ws PsU֧&EK"$j:IU7B*SUMЊǚ3CnT<ѝ  ֶ"bT~ ` zk[@85ʯOM!CꫭN%5dXwBzam_}I@U_CWZ  &Nk[F Q;gt4{o4=5WRkP; ~zoq?U]jv7wB1`(U,P;#?{o!a5WRkP OM!CꫭN;d1-5bT~ 7`avX5JOM!CꫭNc;߾Z\XwB ?{o Ǧf5g}=7Ӹ=wB | >!"x@U,P;$?{o .5@=W罹wU֧ |^ddRz|=9В kJR(d7@N^&2J"~@ Mk~&bw};}APS7C#gt2St2RJJ=>Bޢ~@gt";NNkU`JXwB$?{ocZ_}IBXNP>7B*?ijP~@gt"KJSZQ;gt"SviUU_}IBXnw};}APS/>Nɩ@E%Sf(|IMׂ3@'&(CfwӳJݩ)8KenƵB*4J{6:zXRťNz9:&}WA7hMMMšֽ_ӟv-CJnҡxhk]RDIMڒ:zI-a*U+bkLH@ j "jZnԏXWݩ)cx6Dt NN~}W*4L?-C65 Qٝ)A,ZT|E5 NI`pREMڑOjlݪHd;ڊmk<%X!'&(CfwӳJݩ)87:ͧnƵ%R{꽛=,ZR͋Jbҧ COb>LgvnyK!oON*S}=,Zqt0֪RDvN&}*4LOSv}A?BU:s-7Šl7O ?RkPI3RSvk Thc >kThݡ7h~Zӟ vk -*4Tݠ3A7h_$"Q^[;d IP`͝<@$߾E*_`=+>).j5W0q>4|Mkʿ|! OEZ€%R}7!U5UꫭOKƵxWt^mgy9@>gq!m$D ZAʯIZH6U7E3b06~=CEMjP5U&}Wjl0:>'B"7*"j)6νiX^vvxdwb0S|NЊ Ezl퓇z(Cf::-Cz:c Z#RDZ%_!Nv jq*4L辶sZƀ#J7ԩz&_؊+KS̴ַ.YXq:vPj+Kmb5$.3NM$P`͝hA}WhIM PsN!28 Qg}=7Ӗ(<Ο"ɭa0\\{>H£ZDThުOT!ңDSn Ji87:ͧnƵA=*4LSvRSvqcT3꽝)A,Z zzZiK]>0Dx45 A5*4JwvZ7FP/nЀkPREު_T|>l0-BL;B(<Ο"dZAp=$cCZ(4FTCDքI9"A #!~Rvm oǧ5 A*4JvoRŠl7O ? jDThݣzoRŠl7O ? 9@[*FXÊThݡ꽝TɩJCiJ;攱h<*F:Dx4SeʿS4ݥOٝUMš֡t8U}A[MJX Cqv-ϣ"~<)~)iK(n.š1'jU^1Fv}9iiK]>0Dx45 )Q-C쩾9$7OH0&ңDNAtc0 ~B #NFTCDքI9"A #!~Rv$>_NkP*4O>nkXR4Svݠ-H|E!$zɩDct"+v"kmbW>oQJE\ic^ZÓɥQ,|NЊ Ez`M]gl?Ev ܜ~͉8yIKg}=7':ʩN}N!*4E}CIgO%|! # k A*4QU'v1=~=9@fQSۦ)c}ANŲ(N?A Jbw߸JZThCu>&Srp?"`j ңE}JZ~(<Ο"L*R=$ZZ(I$~zsZ-FN K_sZro}N%ZThC]i'֠)QS؝I::r(XE%RVX׮ViTPx;e"z 3z͎|g|UN,wөg{;4@OaMǔ=5\W!m7SKT̓}WٝJo~oQNտ0񄗢PC2%7vPj+Kmb;d޲A!3g|'=>nPMv}겖w|fw)zy;;TYK;zy3;=~<*|X՝=~MMsmKK꽜KќyM4!*oSMXϣZREKќMJc>:|2:5A|`*5ңE>Rz$ԉsЂd3֠)Q}Uu*ԱԳU|MJcXԒtA5#Thc3iL~ZӟgOGW!{>HkZ(I'>Mӟ&_N\֠ңDSZoRRO}Wjm_ꈢmbW>oQKHmK:Xp_>'hEdj&.NB2(CfgvLݪݣD+M9N}WfdKA哾 w jbrZ{_NPkP #i+'g&5}W-g&4lۦMre/ 8 RDzo|~|LֲyiQ~g|қ揠WYӧ?ǤPy>D j ~B oFPk]e*4QU'vL(֡lQ}UuɃ:nҦwij&}WL)L)b-h^6-2gvA "Kbw&6m 7@m1a&wiK D0kJ,svr}7)bT(F"~1@b7F992joRŦdQ>0Dc9MjJ,svrd4LP}``֠0ZThc(,Z`6@ (` B %?v8 ^&wiOSv P#"'/{RY;'5 1;()}0;4LP}`ZΕ*Xj j*XimLyM,Z@U/$DZWݦt͙ɢ3~>:oRŦdQ>0Dc3CZңEKٜ57)bT(F"~1xңEKٜ=7)bT(F"~105 *4T͙ɔ>!b3N.ңD Sv PsJn00KO$)hQbmJAN$JThSM/uOoݍkF7ǯWYӧ?ԑAt&#8S~ϒ2Z)Qz=PzsZRDڛZɟU n X zzqT,_|ڐ_ibHNdܥFu60;oibLF"~<֡hʕ*Xr}7Ǵi&ϣ ?Z*XrdŦd?>0Dv#B5*4T=L0~}`cɔSv?fwi7i,ZZ|E5MuFZ'z'Sb*_E"(XE%Roe3Kyg3/<`iz/W DjI\k'OB2(<㑫6#2Hbh䱘9- `@+@oĢ`r PI"1;ωD86>% gĠY bwp%>% gĠD kĢ`rġx9}lAȁ{L_c`L|J6ωA$Ģ`r  PI"*F|C&/J|!a$H _`OZ_p5gqٝ ౝbZn9FZZXQ|FNU7ZZX_~~#N }|ֱ\8/kZ6*n9,q u?)䱝Zn9q5֠(p6̵?֠-v%R{갴 iө"^tb*.~Bc|fJb'~zsZ#RDSjn9 PkKfQFگ)jPb9J?|SW|jKFNM)PkKwa:j|BkP]J7-C,G*_Gu8E_q?jn9,ԨK3bU>F 8WFҟ&N_KTH_rf/>bT^ HSroٝ!dzu*4LX7,p?M&Ũ}A5W9A#ZOMb(Yf jAvLPdhcZF2W@Ɇ@HU~ɟU辶O,ҁ!oOHJol0PY~ZJsg8-5B_iIŅcXF0Dg J=SϪwǴ6>BޞaB攱ǥdсr'PF5 =WNP H.XFpbmK Dcbao">@"~t ֡`+Ud$z6F:ELmJDHO MG34$z6F:ELm i@I: 3SMJXҲSCc&_"{}9qaf:R4>>)>GOa jRoRFȟOA4@ROq?:N,,R6jXT'1\7 ?C,W4=+%46> ? /,=> 8LKHN McSȟ#ba7 ? j`W4=+%46> ? *Mj=> 8LKHN McSȟa1\o">@"~2a jn攱ǥdсr'N55XuWNtXY?l'&ԱO`zW,f}ȏH^=}AB攱ǥdсr'IA@T꿌Ds31,u#a816h|O"| b`~}ȏH`=}AB_|Җ80.Dx2|BhR5 *1CafF16yTpN_K D S`ibOo">@"~0  WI龤l!&SJ=~>L G4=+%46> ? rZ1CΓ 4ԍږ9<,r7 ?6}AB_|Җ80.Dx2|B)RkPCXOq?:N,,R6jXT'٘XH>GOZlZaz=~>i=l|E n憵}J7Կfw}M'i@ɏ TNkPjThj s}&`ޛ[lkX3꽝4SIP2c-1,u#bPbmKgю+*>_qص?)l8֠f ~P>B5>Lgrn9Rr٭BW,-,"d87@ >%M#jO,ҁK F bl|:D#NF>@/:|1Mjb!q{>HģZ8OJb'I$r6~=9B%FU֧ 兯ٝ imKf NJam af&>@-ϩeQm'?ޛFŨ}A'icjXFtXJ>t֠)jP1,u#bPbmK3z:DY1cOǏMj|n9JZi8LKHؔRr>'zM,ϣ"~;Mjbn9|?qaf:(16z:DX$F:DmMjWrZN,,R6%&Աgt=X$F:DhG@Wr?qaf:(169="|O&KHzkP~E 4漏lJ MIcO/ (?Ii7?R6%&Ա>O14K>tZS_rĮ!e'ic &P꽜(Oܱ};A?JIԍ@t(O>|{Kg[IŅcXFĠږ89y> ב>'0D F:D|0Da) Mjq5WfwǴıJb>KIŅcXF"|D%qa'ϱ :_@. cjX[>tְ$OU'oPc &Pְ$r,G#cZSqfHbrP[lkXC)lZ3꽝 iam,G&Y-Sqɽ1,K JV=B>Ub'ӟroLvGK1'u9$$OSr兴ܰ#zP, >2o~>辶O,ҁ!oQH 8L7\CNF浄@dɟU辶O,ҁ!oOKDN,,R6%&Ա"5 2Cqְ&w, `fZȃt֠.b=$XW5 F"z=PG#jD *4Tܰ35\ Q}UuΩlkXvrP؊yA9@\3Ul=$X Mj*4QOT!$ڑ4ӚKJꫭNNLE 4=唂5 ңE+&~:g&LI:N,,Eɟ@{zNl"&d">t@blkPe_@. &~:f jAw ablkPjThyjNS jkPU~B "AiQ|b'ߤDɆ bldߏN3½*4O8JQK^kXSqɹjPM#jXMk AܰM!ZnX?ޔ 8|E9K3`xUXSr>nb975n97~龥3i?JL|E!$^r5qL8Ly3}9PS"^tdZkPAy|`֠.ԨF"z=PǶkP*4J|^o(1gDP KHؔR N"|OOCOHE5 HtFJo~>辶P2c-)I}Wr5q/N1!CꫭN/TɟU辶O,ҁ!oON=:"]AIԍ@:DǶkP)QR}SM4d[SXS tr5qd­'i&qszE Z*6m{>H`֠- iQDRzߏN#l֡R>̩lZr6~^kR%W!CꫭNLO>SM4Y&>Bޞ@㑵'i@I: >Hө.F>@/:|2RkPD |!e/F%,jTh=TCI#jBM*4O:F_;i 4d[S[(Yd!:AvL}욐]|l@֕(^OS@. &~>vMH.Ɇц&Ƶ 6F2WȠaf]}9Oȃ!B8Og j]J`=T"&L6g&_N3cZ RDS+@. 36%&Ա14P>t֠#MZA93%u@t7 H ψ6c&rjiH7ɟ@bl|!12I`}`ssZWϠWX16>O$ Gц~kP꿤} &}"|Dhz̒X)F"~6Z H.ALuc 0Dz̒X*F"~4#⡭@D꿤} &}"|D&$ цz Mj \Aw g+la'Ax$V>0Dbl A¯H7ɟ@bl|!d`0kPʿDnX2gJ9Q&}WibX zzsO,'ҁ>]cbPbmKIr|">"|O M">t`SgUM/ٝ4SKg[SY viH7ɟ@bl|!2I`}`C@7U 36@ M ?O2W'ҁ>]cd"}W}W>NɩsX-I5Q6t+KS5 ^ZÓɥ/_X8~7Ev =f>fIf& |^zo{J>BޞڛdtӍV=IcF~No~>罹zX素Y-)JzX素Y-)(<Ο" jOR=$Yi@T iQz=Pzis6FƵp%FObzoN6@a*c@7@)64S4-C4|y31@sOiL~7 Ps o*o%>{Mc:X=>0ELzX0F},sr}7ϩcҁdttaǧTji$!L%ϙ͈X0 K>Nɩt|NE|o"Q^XmE-[e'k2nq*uY?$3t͎O>OMҁg)쎖:qO S?tnSmiMB>(쎖:qO SmK/g|қ慨}AQME>ic X01ic}eS|е?)h};g}=7[J>BޢѾ:&|oӵo-̴t|KA | 3cSϪw}=,uY-S}m1,td F"=M,stlJoE7:o~>罹zXi@[SXS|l>oONտtG2K1drKA |>'hEdj&.NL";owh5gpQgpRgpSgpTgpUgpV|L*)Qg}=7ӾI 5*4OS| >Bt(<Ο"B W!=$eHIF0}BɅӚ*4Jpm7 w E>LgpUxKT>BޞM8r[+ /Nڤ|OSU~#ߤVT_g{;'OLC;nԠe'[ӈl$4a*OH@ j@W!zn6i"/ܬfWY=14 g;!oP|BwVKSʿx}/I~1-ңEMU3^*pU^*!oQHIhkP>DpңDDThHL~|Lk|VkPC 3kMƃW+ iӟH:| F(.U 3|*ڕ(~; Oǧ5zTh)^&3^*)g{;7 ZXh5^*`01I 3%q7 O SgpSx}/i^*/%O>/i^*/B&}W^+Rdɸa*(3-zn4/J?Jϣ蟏(5=W!7 ib6@ɏ蟎A@8 U>sn4l%RF:Dv#U}9NpV~>l%?Ra*'OJ zk)^+Rdhϐ'S=7 Q&j|!#a'OyC\R`֡BZThB`֡\&w *nN!(<Ο"q@Hvك|jPJ`I?f}zsZqThU]l*|gpUxKT>Bޢ|^xI&;nԠhϐ7 TǓ!f 5_ӟ{3꽝V,BP zzq R8&b6@:' j|sޛ TdфtO`֠$0}!h5J'>tG5jq?t/_;7 ZXֶ,BP zzru>*qI߸w--~G jU7 Trg\~j"Jt@ ߺ 5N_pSgqMM3^)q'؍5 CTh/^)8ӛAt&j*~ϒ1@HFTC@/i; ǧ5ThU]l4/;7 OǔJxIҁ>Bޢh5}L5 oJ7 >Nɩjt"+rQ6t+KSNi(9pC2땬94?$3?g|k꽝E>Lg|ғ'Mw|Ҕ izXFXs'T̓MjʿSh}4wYOMJO잔  :&6Sj^xK(!ys,&S{-;ωAY,퓇zӑB6wFlqU^wǬ3oIœPu>Lg|ڛԟ=(IO>SM4JP,)c{K=(IcF Õ_ӟ|_;i8J>BޢĚo*Rg?H:|2Mj dbP=$XtFTCI:zDL7OHǧ5N)QzHBh)U&;7@O7"'Cƴ9">tF55_'}7ߏ;7)>BޢĚN,.Ru!Ǔ O>7(g|қe'[ӛS|Ҙ8֠xq?:ofwhx՝Jode'[SXMzO잔 zsЊ3ȃ!t֠~*oEy@FIF0}BIǧ5m*4Fٝjo~6'OJ zzZmO>73iMzP6ϐ71,u4yB`*>'Sn}7,S|ޓ'l zkinEOH8>BޜUٝȅ @J~ϒ,D5*4QOT!$M"'&iwӚ&*4QߤREѾ]gm$Dm516">tFRkPz8zH7+-~<ֱD5S]7Eɟ" Mj`W!"i"r3ꫬֹ;oPs]At֠ ~Bw"Ƶ @(I'SH&i =*4O5&*O잔 I9c&rd6~>S}K,辶'OJ zBHM'S=>'B"7I5Q6t+KS VndPYמMFt@yf Q%[?;B(~7Hgl~6:{;45S|:Z3T֚Kʤ{69&6SjwZK(s,&SK>'hEdvlȡ;flvOwӳ=g|ޛjc! roSْ&}WiMJXjP, zzl)g{;i9 8|=6|LvGKHؕcHSK/-CFjc3HR}eh#-Cjc3HR}eǒjr&wͩF4"C;|}A|ޖ9Ƶ `2sOoL~7Psoe'$t%֠v'W[;龥3ic@[SPMG7)c@:P3C-)Gu>Nɩz|NE|o"j)V WԱ4^x@Y+#>'hEdvD$B6w*=fĨG$^=N.U꽝_K; kKMʏibT|kXI.!/kP@ԨRqbg8x>kP9U;ꩾ8ӟ8TSϪw)iKP,u>Lg}=7Ĩ # K R!oOH<}WnT{LhDwSߐ?~JXRIӛ0 LkP >'SjoL~ߐ?L}9B7Ĩְ-Vw}IjPcԸpɟU-ic[ӛS}U,BtlJ)1'@!@.q?t-_;7 EX%Sp]!oQN L*(*T*Og;5@֕%R}7Ծ!^kP jU֠#ԨS}=,JMk]7R-F'ц^Jq?ǯw*&i,?ۦi,ce}APTMMʉCvgq}*{Rw*'}WQC;}K U~NRwǦ -U;SrIQC,|3ʿU'jpo~;Z`5FʊibTOI$F0dw*(E!IQCff֠1U=^kP %GԒt!LĢ"u @'v5jTh7ԾE<~ѭGWTQMʊC$ ȃ1@~O}Wr8ΩbT}I'Nn"|J-/|B Ӛ%ZThU֠~ QSؗM)Cu8R'S~GŇ,H5s]_Jc꽝mr?@ ~P~Gȶ:5HU;7 EڒHZ.>!j_" 5IZ :#䬙.#?֠cJ)*4J{~G05Th-%1Qqsꛅۈ};-@tI|3>5U'j`h>HaE=T-C7 EcRI E?NѭLjgp\hPI E :*>D@U=^kP ʿSRqRǑVLؠzsZTRDƵ4Fqd#Src:Xd F"<ږ:stl*|KPXcwQ1,sAO S?/g|{M4*=$aǧTfԒt!L%ROXҁdtsAc*P1$9S},u,ؕ HX>HJ3_7` ,cfĨlFyTyIc@ I`=Mvw}IjNYe7*=;#h6@a*cNnSmOS}IjPX*NoXS}M1;i?SS>H/fE*T"z]B"@$D1AT"z]B{;$oQb2g}M7Ԗߤ^NkQ)_}K\zjW)RHq?Ωֲ]>]jIJ7ԾEǯ^֠^*’E7 I!m$f# WyBJ_&OE߸@~y9@*’E7 I!m$3_" ZT5I ~?|Ea#C6U}A0#HR(?p^@B'*|/ DJ!IOSU~Q(GI'4=>@"67 `>@-/fROS}IjP~'{;7ԿLkS2-)Z,CꫭN1eMbsx9Ё'jnǓ0 ENSL~7ԾEǯ) j>!7:|"sZ*’E7 I!m$>D#5_U1Q BZ,SNo>b v}@~#Z!W!Mʏic ,z}`,t0F{;oPs-7Ĩ # K RRIӛ0HTSLK~O:r}7Ĩ # K R$B KcfĨ%|DC>x@z:lJHX*)7` ,E7Գ?;iZ,)!=*4TRZӟr4 X01X `>wԾjo-C'}WZ*}KƵ0W-KPsU֧' Z*No>:$MVsx!H Iڛi7ȸ"AbHR(?tBj?_RHI!>- TXkPzIZRnǓ0D)vhLy9c@ I#j"Cf4 X01Աӛ}eS|~Zӟi%GY$l"Xt I'Nn"} b^S}M1,q9>ԱԳ龦%GY$l"Xt ڒND)@ľ:lJ#I`<#+ϣ-|1 $di,G0|Y|ݝ4RZӟթKMʏic ,z}`,t0F{;_U龤?J&c>UM,cfĩ)KX}k%,u,ؕ>FyTy9c@ I`=M4辶c>>:Gdt=>0ELy,t0F},q9>4 =>TǏc7`>%GYȩ@͏ K龦%GY$l"Xt I'Nn"} b^ŪnT{LvGKlcTǛRNnSmKPs.}'v5O QXҁdtsAc*P1$9S}$K2IPfFU3o XRIԳ$'#ʐ2t Xi@I%GGH "DͩtyLԳQ1,sAO S:stl4RZjo#G`>D(RkP9U_ӟSKy(;ƵU}9NpF~>^|yK;ϩR#Rdhϐ"5'OJ zrXY*4#I`<=9c@ I`=M, RqdǍ^zɟU)?zP6ϐ7cXi@ZȽW!:GM‘3R#qy,/=HIҁ|E54)?zP6ϐ-$i,G7` ,•'OLyC;SϪw Dn=(ISqy1,ERh$U}95)DNt);"E7x՝SpH@OU7 DO잔 zrXY*U1 $w{Sqy$\&K5F_qy$\%Ƶĕ_ӟM7LyM,Ji@:I9DB1CXY*6#I`SMzXr}7*=HDL7NkX@ Te,u,ؕU1 $w7g}M7Ԗߏ;龞%GY$l"Xt zEٝJoRĨ 8|E"xS|_*"j)VH VIz%7^z$3K>'hEdj&.RMb5cX oX TV,Qb;d޶ȡ;69-&16{KX R Y꽝x|CB(֢P.U ç&CZPdsOX֡W!,I~ u"&w)jo-CΖ;R)3%rH֢PWXSzThaM}9b HEZ[*>?qffZsN,P""hTB*#A6aѐ7p*|c7 @~Iœ8 ]DґJHT0*P4aaѐ7p*|c7 H~BޝQM,S}=1;龜?@Zi'>~8Ma'[ңDoh|;Y4g|қ攱-)(3iHTbtgӚv3FƵX)FOSlF>'B"7Q^XmE6aI̫J>?֩)KfIbn')g{;4'RgU,q: # K I_{ *|^zo'RdtsAc*P3C-7c:Xd F"<K9LѶ^%>MME}AE7R%I U~N'=~Wķ53U}9P{7MTﲦ">u1,sAO SmK9LѶ^%>MME}AE7R%Hq?}}K j!coRkQ!bCvSeL~*o-C龝3cԠY$l"Xt zj@g|қ攱P,NS|b1:HS&o$Y%)KGW DvHNEv b*3b1YF"14b,3"4Zq  En1*#G3=|'|?H%TOSU~#ߤ^z/_buK Ib-57ƄHg|ڛŨ}A+S|ږ#mcZ@U}97ͩ…,q*oSZs4b*R6~2&}bs<,F">X֠pW!gM",F"ک}$bkPEXEG<$bF~<&5A ~ T6?g|ڛŨ}9eqM",F"~̒1dy LkP3꽝b,b1i@ɏ oT~0TF5q?hmM4 ħF-W!%}M$ _U]fS|е?MJXEG# LkP7Ps Tb.8Q4b*>!bc* F(I'4M)a`lCu;RS|Җ#aQaA;O֪Bu_Ա?|~kQ6U;N>r9䬔ǧ5>jP]J)֦B*4Jߧ1 W1:N3X插SI~=9BңD5FSq^%?|~kP+_ӟb-Rb*>!F,ߏPHԂM",F"~̒1ߏ?} jAM",sER2H@}%Ԃ UM",u/x=fI/ǃ`t֤SصOSqLhDwͩlZoA o~0kPThުOT!:S|ژjot6-Cu>FSb,S!jooRRx7} j(U}AN|ژ(8ӟ}KDcZsJ,sfrXPSjoSmMb>ߏ;龥Ƃ;i#f zIb57b,ҁ!oN~ n1b1 #C@)cZWb-Rb*>!#S1@Sb,S!jo",F"&5 U~NaV``kP.Czo>E0~֩_ꛌNC)$N_"yu_UH?UǪ}U7֠͟b*߾?~jkRU~n1:q?ܤ1:|Bȁ:Z,R{֠ SkM"EꟌ^%>HF 1Pq u?}SCT6g%>aB8 zslzj9!>'S7!MX/ E8x/F0}BIͩF"&Lc0ְ3 \Cu>=}UuEXʥdLkP6 *j9YF"; 55BڛS|ص? "7b,ҁ!oNZ|lF"C X֠l ~EF",F"$z/=Zk!`I?U/$DZ&U'Sb(_D(XE%R= e%]- w/;B( 퓇p1ȡ;Ƭ،ϒ<@$͟?H%TOSU~#ߤ^A2_ܥ;'grȁٝɏil% P% jE*4OX֢POJ2%)"X?)8Οegψ@p@~=9@3F^t?~CY@+ңDZg Z RDRĘ4%aQ "yHB"" ¬-6 EHFhlR0&J I(a^L3@ +5@jR oAspj&hJqңD/ܘN Thܥ7)`ZX7U;r^&5JOb jK~'ܤ>(}WɄnME$؅"ģZa%WR{MO\Cz7&IIJ\~1kQ ~'ܤ>(}WɃnMC$?L~C`֣%_I7)=q?i$!b @Q5IZDU7&z/"cߤ^NkQOiI}A[I$*7| Ƶ0T5e_I߸RusZu_I7)=q?i$!bS@\5xT5꿦>EOܦZEOܦZ U~'ܤ>-RzϑCZU'j(nME$e« *4J}nMCPؔOY 65UKjUi5FcWȸj55 Y^Ԗ57i o-C잛)b/Ry3(֠hq?=7jy(ֶK;SrZq?ͩbRƵWR{MO\C)8Ωb/R+%>!6tzsZ&FUkP(FOܥ֦"%*4J/6~jkQɚܤRqR^VJ|B /ǧ5}*4OZDFP^%?qyQC5jb]J,v 䰠aL~ o-C)5 }O>56_kj)o I̴먖ewPr|NЊ Ez`M]gl?ԌHd;2Nh u/ ߧN.U)>DpzJ;NPsY:$ R=fAM*4Le4r QRZӟв/1;ThC$Py>D(*|!D F0}B֢8HF[J|66|R)*4N!H:|PtkP7_|aD֢@qJ`I?~=9DtThUO>56|NE|oaH&.EzcvFFu,d["rJw|NЊ Ezl퓇zĂ(Cfҟ&jNД| ٭@8U}9Z' HF@%;B7Ο# jq?_"F 2T~ϒ6FJ)QSJZ@U}9Z'=5AbQ3|3Z!}*4Jvta(֠ds NF5A U~Bߧr%;NS| a@>-|!2Ax=$dsZ2FOanOM6kP2>-|ƵP6䍙@RDM,Z5DU}9Z'jhߧTh=E2_ӟ寑q@֠ |!6 ?Og55-*4J{t:|B1L~ND CZ(-U'_jޕ%=o>!X֦N>-|H*R{>HZQSu7ΟPkP_ӟ寑sZ${>H@sJ#S| &( >-| MjU~B Og m*4J|{M$9@ ~ND MjW$$F J)|Mu>MM:lE%Sk[ЏzՑbRQrc>5>'hE :f[Mw}k;OK2Z*OSl~|NE|oSoͱh!/vPj+Kgl?Ev96$YI3If+KA= A:D,j%F )5_|?LzXRIӿ|N=>OIt ,FOSbq:9W>oQMeωAY,퓇zPa;=4_"3꽝OK-fɟUS|Җ9$8f&dω*P2c-Ūo>3SA9AMy5#ȏH@Bj>s97Ӿ"PN|AA\E&Ԓt􉹠. N!##%8D pJp! @%8D A>ÄG*B\*'5$)4~>S|Җ9$8f&dω*P2c-)mMٝOK-)Qzb(AOjm_ꈢmbW>oQKHmq‰$7\ gvPj+Kmb;d޼=g{ Yٙ&ͳlXg|6nM"Ƶ}7oe_\CI:!y#BG!W浒}]QS{6~kP,!ZPRI־!"4-p5 UNЧM TCEMi8A=S;D"7QJ_ŊpThުOT!Sfw~JXϣmw),53E$8֠ZPRI־!>DhkUW流?}We;CU>Lg|!ɓӿMy `>`1cQt`ٝo&QMb&}W{M|B"C SF>!&rjiz}=re(),lAkX짲>MM,l5a`n!rCEMw)g|ޛCGMzXϐ;mK7I&ŏe%]}F~ITm*4N!q,l$>D5 >);I#g~B(f"FTCZ%>?fw"mN &epBaJ`I?54S{7K i$lkX}9B,l@T5 Dz'SDWȢmbW>oQKD"6@S(IvPj+Kmb;dޢA!z=f6d{;ۥi$6ԾDD`j7=}j*OMNPRI;#GƵD3UbmI&Ǵ>~ j_齉CI6'|BBK|#ZP*ֱtt"qYƵ g{{唒lN0m#B @ֱvB{NkQNw=7;}AYI&CjAkFBoML66q҃7q\SrNh)Qg|T|ASThc Mi=*F57CxZPso񋠽RѼb/g|Zߏ;ۦoKQjPXKZ0;7JX>lcl6ѳ-S|ZK>pzElMiNheJ`I?5(F^hқ֠X3)$ءj8֠ ~''q?)$؝X|ЖkPx~kX)-g{;ئإ92zsJoby `>`Đ"%> E_>b"g&-{fwM7Kre')jobNMP}PPɟUbobߦ)7Ay91Zإ3i\C(J~>nء}>0DMQKgѶPɟUbob:oby `>`ZMQ1 3_;ئإ92kT3꽝SMR=;cgюY_;ئإ92k_cj:!e$! >DhQ5ʿ5\ iIz?5 U~S|XʈmbW>oQKDa' e48Q$ޱ!luw3꽝OKioRN2gJ ϐ}`jI9;7Ώ SL7ӿfw}=,u[SXME>Nɟv[ e8.‰fX8~7Evz͎}MXԃ* 3%y*4O cZɊ&}Wc!oOM=3$dψ}$\і! њF |^7)cIӆbfLA9A>@"&>Bޞ@qؙ>('>" 75=>%$G(">HP"D|!>P"D|!>"4|F"|!0ְIOo?fw)iKN>sЂ|:EJL|E5wzo||E5 j|^zo||=97ӆtϠPN|! 7OTdԃH} 5"*4TN}OMϏ%Ojm_ꈢmbW>oQKM[@jzz.9vPj+Kmb;dܖ̊=gt$flPfIB^G7B8St#XeI%P|?B#Z۪1?CBFGP>"| #O恣Bȁa9`b=n&#~64FB>KK$jnI% #'">D>h>!/|k\SK$jn$#ѰMAcOmB kKMЏb$#ѰMA䦀 &~6*4TX(Gp͍*4Lڛ6q?"%FE?Og֠QU' j!-*4Tb1P#RE>RzٱBmK&ǶkQ DF]4:sZMJ7BFTPF!5O',z*4O>fwB=GB zBHMЇ!CAkX>:&OOЈа"Q^XmE-!>ʏIz%Rp>@ ^vKYωAY,퓇r[2(CБBə% 6bj^;3꽝OK,@-&'HԱBʒNl"46>@"|N!)ZC:Th8;>&[|VkQRD7C]i$Py>D@'Ub.?Og`kQRE>Rzߏl֢RDt( ;i>7Bʖ:qږ(CD!fHɌ  p">o5xDO2'"g&MMЇB>"PN|'!9$HD&7?NkR*HԱ)$65 o>Ƶ0F#R *I:qt;(|C =5ңEIʼn$82cZ*4LS|5֜REK Ԁ|! ~ϒ0֠FTC5 Q}We;F ;i>bfL8 7B^EJL6 iI'R6 >D}ȟ'5PXMЇaA>t{S}Io">@"g&MMG֠dƕ*n?3$dψ !01!M7B?fwB)즛#R *I:qt;(|C|zkU*N,N&ϱǯ )Qg|қ!(<Ο"YDS_C# j5*4QU'j<3F]MЛ3\CeK8XhmK!"n3$dB τ8H}7H|"PN|'3&CX('>KҒNl"P}ȟ'51]W4}jdREMЇٝЇ|OS};g}=7 :P< zI}7BR 6r{Ojl (XE%R59/E>'hEdj&.NlȡwBF}WJX#>D ZŐI%  h<5`cJ''|>Š2cZ$RDzoq u?ԑAtMjb*1`=$aH5*4QU'jңDvSvSM.!3꽝7Ǵԟ!oONiMǣdj ?}F֫u_|z}|{KI'RqbzXңDCnRzߏl֠X>h;YCI5QN~AWW4~6Ө5WX9 J;)>3ȖZkQBE|MjbQU' jm*4Tb1P5*4QU'!,P~=ZJThUOh֢0oJOSd'DWXD(Y,}NoB?ˆy:8V^vPj+Kmb;dܖ+B{;4g|z;ݪ)bȃaΓU|>! oݍj3ThSM.!(<Ο"XA5~B # jңE>Rzߏl֥'vSEn;E'(|?O&h M*4LC]i$Py>DkP.J|! _䍳ZңE>Rzߏl֥ক'vSMGL|nMj^ Qg}U7(<Ο"XI5YW!x=$mDQz=PǶkRJ)aBb#&|DZHp>Lg|M,ss- 0"&H>0D(|/%K)RфtOa٭G`WPS|<>0Dv!eU}9NܦyK~6@h?>0Dv!hj;3U}9NܦyK~6@h?>0Dv!ov3U}9NܦyK~6@h?>0Dv!4֥W!0"&H>0D(| kgrtT)c:'㰒֥WPF"C`>Ia'ȹCB kau7XAa' kQ{}APS%T3,qXh?7T'N}kg@N5WwvSE7X𸱠2|Wh䖩|Bi'㰜 zThCNM8l~}`-ȁ9ѭb)4 1Dhq)@ QyK~6%4šL1'㰜#)5꿦yK~6@h?>0DsB0ֱX$}U,t流{QdֱX T3꽝JoRN|=6}U,s@̑>"PN|J B cTrjo>(|NnkX 3꽝7ǴRI13&|ODt R!oON S|v&dσ ψpM\8&ꏉ@:Dd/hj|JH1'% cO cO $Gц".|LֱX&Oo_;oic>'N|":OH@ɏ4~>S|Җ:s-)[Xk&}W=-!oOMoTMN=|MiO4/>Oa8ְ+Gݣ|_b7ȄijZ>Lg|қ攱ӟ!oOM:I9f&dω*P2c-)S}U,s@̑>"PN|I8l"P|:D}`ЃZf">'S7ROI')qOh?>D>h^%f>8gO,&Bʿ|!F֠ԨFTCI8yH{A'LjXeJ7hNL-3|/#oh2gJ ϐI'Bj#z' 阚t0OiJ꿦g|қ攱ӟ!oQMDo_;oib@Q`PISϪw)iK9kMT2FLA9(1'юREɩ2sЃHFy5#ȏH@$F>8At‰T_}{>H&-*4J~٭J6*N1f- 6(~͋GԱhX~=ZRD{-3=:I9f&dω*P2c-)mMT2FLA9bO'{92jo?fw)iK9#qbX$~6ϐH塭*4L7h>3Ȗ j*~ϒ1ɭDޕ%R{l֩A*4Tb1Z j>JThުOT!6-Ršaje*4OS|~}|K z@K>EM/΍j>)QxZ詾>:5ңD56BZ|NE|n(XE%Rխ! o<WDtq֬"Q^X5kA&qpoVEvCVlZ3$15bEwKZR&"ElkDDZSvӚ>MMLPRI3—țZwU`Jdq.6}+E_CI6&|B"gƵ5TWvSDI- iZmإu`WbjobgM_"dcZֱP_UN19IA)U;ؙؚ>,bg!j*5Tڑ5߽_PkT!WbjobgM"dZ$UbbpZ}$?{= g{S{8唒lL0"b9@fZ _UNݢ٭Clw573}AYI&ψA.j35 5]2niW4e$)Z-~)~AP}I-R&K j U~&&q?)$ؙȘkQ%U`H\rqm9!ؤ֣P%U;ؙؚ>,bg ȘkQVZH cbsZ*MMLPRI3kLU53 5 {)S{oae;JTˈq59:ȈDu8*MmN8FTCﰦKm,q7FﭦyKK>Btq7XYSfwU>],pA;7@>Btq7@>jlS}:4hkI'iqF]4@ְݢZԨ֛Z t3FS詻M iQg| -*4T MeM],vGѶ; &0>41tFo *.wZom3o j-Ccq P))m,qa&wzocl6ѳFKgѶ,mF6wZX$A|Mkic4O 3 |G F8=g|G" i#ຕ(~kP*ңDSݦj*4Lb{;IbaqIC_CI6&|B |&@7U`Fj|^i{ &}p1$0EHbAZ.FZ93oa$B"Cӟ\0ELv$F5O-|`oa%3oa%92k_c6|ThC&}Woa%92ztI0\0ELy$0EHҍMɊTKg{ 4Kre()&}Woa%92ztI0\0ELx|I R"fҍMɊTKg{ 4Kre(>=~ICГJ};jl|0DLL_;I\C(@&5|cw걫f^+*4JwIq1X3/S(ONJ]4@`SvMjZkPsJ;آMƦ:g{S{8唒lL>DZA*kϪh[SϪwM$&ONiM$STx}p1ؐ}]>!&rl齄i)NS #gMP}PPɟUa&IqLޛI7$.!&rdoa$B"t`"I~>a&IqL obX>lb>Lg{ 4Krd7o!L SHl2gCLI0\0ELxI&eϘɊTKg{ 4Kre#Iq1X3/SQT Mc}V5|La*4Qު_| kɟUa&IqLJoa$B"=$0EHю1 3gM$STǒ!*DM`z|0DLM$fwM$&QMdI- _cU_28cJOjl9:YXEkHd;ڊP! I‰$>'hE :fZɟU罹zXTY-i&}WiMJXTY$8D(N1,tbUO"<K/-CuLvF}1Ѷ^Z}7Ωc X01ic}e}A:;#lJcTǏc}e}ATdgюS?>X_%_ӟ|<1,tbUO"<ږ9LѶ^ZiuLvF}1Ѷ_KkZJCu>S|쎖:q*ǧюS9LѶ^Z|1*cԟF},uǒjU_ӟ4Sꩾh}4,sP,Nl"Xt zj4wzouJ>Bޢ.>:&6SjҬ(Vt..SvPj+Kmb5$.3N6";Yƒ66Yl)3l)*>N;oaFM*D t"ϑ(ְoaEn֛S5Q-C YX5}֠*6_lAQ|>!5|bgȁB#ZtP2cZa;7ZsmM(Eɟ""`:@Qrgȁ0kX4¡jPa:T1p֣pW!G$#cZ~Pft(fkXB&}W S|@ P,<)cd F"<K?7@)657r>KM(~|5x3U7zcwzo}9b7LvGK@ X01ԱtlOS|G-CߍsZ@ U7zcwzo}9b7LvGK@ X01ic0F{;:&Zi#E4M9jNXM3 S|@ P,#1&R-Ct•,l(bcZ*q?>D Ϫ8P;8ӓ>A9cpkPtƕ&w$(<Ο"XX5P/䍳ZFTC59ThUN3("6)@#&|DZ*^MO>) R…(p zzIŚoaB쎖86%X1*ctl?ۦ)ϣ"<6PO)cd F"=M,p/-CNƵ *XDA 3s< H}7J ϐ}e}93Ȗj0ߧ䍳ZFTC5ңDpK"8;2gjs F},l(Rdtql"X{3l#ZP;# ,z}`q>sЂ|Z^FiJ~>U…1,qlcTǏc0F{;:&Z[ME,qv&dπpbica`XP$D.@! ,#Dv HjME,qX0N&8|D|P"| , {)>D}@ǦX 5A9(14aME,q"< D4WDycO ֡X 5A9(14aME,q"< D4{">tg, jjH TKF Rς#ȏObbτGF:DhK@sZX 5A9(14aMC5>D}558ThH TKF Rς#ȏObtWDycOƄ>AFW}c) "PN|!!A*cɟ92joPs+S{ dtO SmK?7@)657r>o)c#3&|'>KF R…(GI'%Ap@hȞ`4>GѼ jX 5A9(14aME,q"< DXT|"<1'>MjAW$R_ ωAA# j)cGU'b>D}=5E_|KA|'>%!86#GTƀcGю?@L@8U7jsPbica8X9Dy@,B\WGю?,֠D*X 5A9(14aMCDycO֣V4S|KA|'>%!86#GT 阯f#ȏ"~4  j M3#R$S|A|DC B TǓ?c&rd#$V"82gJ ϐ}`gsS{ dtO S8~nSm#jo}AE$RGbfL PN|'!86 P,N Kr=ikP|'7?#ZX 5A9(14aME,q"< DX=>D}@Ǧ)"8 PN|J B ,ql'QKG>">> ||"<1'i zkRH TKF Rς#ȏOc@LW'#ȏ"~6 ZX 5A9(14aME,q"< D!.f+DycOƄ '5_|KA|'>%!86|BΏGF:Dm Mj J7jsPbica8X9Dy@,B#">tЃ(5j}7gKMs 1'SL}HɓS|G?g|GZӟZwoٝ,l(Rg "9(ְȄ>Lg|AK|=6|KA 3%Ġ F:EI& 2'N|":OH@ɏ) ̙qA9ni.QMA(">H O@:DD# t|# tD0T%ϑ Ƶ1Oo~>罹zXI8A9A>@"&>BޢS|A~>4icnXZg}J&}Wc>Bޞg{; 7X-.c)$f&dω*P2c-)iH ̙14ta#OƄThZڊo)c/ !Nl"P|:D|E ?|T}:5*QM>!5|bg0\8P5K."9*MW8kX wǴ57I'Nlkɝ7Ǯ!E7Ǫq{$R%RI>j' k\؊3Ȗ%nIUjP=$hj!*4QU'MLj REMꜘJ"82gJ ϐI'N6 >HȟЃbm F"~4 8kPB:&}i %!oQMEN}OMԟ!oQHI"O>i %!oOJjXfHɟ('>%!1*H57і! Z`g{;龞9"N bfLA9A>@"&>Bޞ!7Μ ψpMpo@:Dd/hj|JH1'% cO cO $Gц".|L !O>) R…(p zzZ#S{ dtO S?}e|9jP"82gJ Ȃpbic+%QKG>.D}@Ǧ5W>s7zXb">@"~6@BjP ~#|G-CBP;# ,z}`jXLѶ^ɩ#:o)c!#&|D'!:rQ5sGю?! zkPhEӟ#$>M3">@"~6@BjNW|mM9jNY7r>) c:XǧцSK?7@)657r>gME,q3$dψ NVJ&8|@\1'>Mj e_"`CtcG ?E!FEW|mM9jNY7M6)@[RiwzoH!>'N|":OH@ɏ(|KA 3%A>>EMAm ^*o/ٝ ,rQ$M7`'z'SQ:񽄂)&p&.Ezcv 8RxK,GG]j;B(~7;ϪwӳhɟU辶X素d[ӛ|:5ц:5viQ-Cvg}:,o{JL|E5*|^o}JL|=9,soFMAa'Bj*ThP]4SR}SM4ϩ@ɏ&c!oN11SK-/O>|~};}ARW[;7S|gGDW;ڊv#c#/X;a;B(~7;=}Ј*~P>MƄE51 ~P>MjPxZ͟FRkQx}J}=9CꫭO}l2ZJ};]O?ƴ PsU֧|zZӟZo}AP}o>~4#Mj3_jm_j)ڷPtq֬Fv؟ٚ%H&> I V'7fEIG=ɏd"(fGՉh(G1LERLPH?xF{DQ$3Q2}I3A#jRQrc>5ba1%H&> I V'RQrc>5`@Й" b*Ԍ~ρg`Ӭ[| +%.L cgpbl8l|&6|&ȁsjT)\)҂RQ0]܁DUda;x~`m,u4VK>gpbl8l6LfL cgpbl8l Y06 rc 6|&ȁsjH%. Mj \ApblCPX C@^n"'vNX>o(m?ټa=GzPfEIG=ɏd"(fGՉj4T}#ܘ&B"&o($ A۔^P8F]h:PP 1 d,vp%"v'Pț dY>ڃAd'vd,vD݁ggdO1v'PD|m@0Ǡ_|m@n9>OcBwfB`dMvpaD5 A݃NX"v :cviKS =NXb%F Lh(G1LERLPH?F{DQ$ h(G1LERLPH?F{DQ$ h(G1LERLPH?F{DQ$;B(5%Q6upoXEv:SϪw}="!oON,- :stl93Ƶ>1;C7Ω@I:sq>7ӿfw}="!oQMb 7!aRqR:|>! Ӛ'v5*4J|OSl~|NE|oD(Y,}No,XۜJ7\0Xs{-?&3?Sύv谢C,]@ZK zwaqɟio%B_1+D^K H}X[fEهLyB&Sߖaa̴DZK Ez(+v"Q^[;d "(CY'};@xUMhC-͍j0ԨSru4z,j~kQQibZZTh:c<_߽֣ƕ*nN',nkQOJ7'SL~`:v5(FF?|CjZ Th:cchѝM,L{MfwSru4ƄݝjnNЏ^ʛ?4*%Jt&Ar:cȨD|5 꿦i,ܝM142ڛ?|G0 jzU_ru4Ƅ;>ܜO8Q9ɩ8QA8ot֠~P>COSbwωЈёEzcv٫Uy$5,OE>'hEdvbA!Zg|m7΋Ps3|5AHMߧ<zThIZU]j|ޛ\CӾDύjN~BEsZ*$_U$XWZ(}WjmωЈb(Y,}N5o줃u$o>'hEdj&.N!ZSϪw}="!oOKB;ԿI5_A兺ANnSmE#j 꿤,t0F{\kPee_ :stl;%,t0F{V?rgj/_~c7@)Dl"X E~6i H=W! '~j/ȹ3\H/X `>4vƵ@QW֢|NnSmhdZCZȠ c7@)6"\ H/X `>ȶ QEW/|'\K9LѶ^ߺZj1,t0F{V05/U''|~Ƶ.zrWZrߏ;龞 ϐ$>Nɩ0|NE|nL)D(Y,}Nz $^KYo|NЊNI՛#jnkLhDwhVZjjgvZnЪ>u!m:sU֧ɩBjPa!^ *|^zoBnЫK8ؔKg2cH(5U~N;,龝3bа|E5ݡe>ȩB\pnЬ _ j%_vjc4ݡY.?|Z5B_vgȸ7~;5E꿦 ϑqa je_7hV|ijZAWݡY-E_vgȶ _ACU7hV|``fUM‹;)Svjc ݡZ)3B'(|~Ƶ'PzrWZKMݡZ+BF'z'S 9:}NOrIh!/z.=W DvIȡ;bmMЍPs^B&}WRNnSm8Ly5,tѶP~Z23꽝JoR!a,- 9LѶ_Ly"N n_Ѷ^%?|֢ЌA47@)6; c}elѭE.A47@)6"֢_~9LѶ^/`kQi1ݡUOSvR>61,sCtl- dǒjE_ӟ|mMiݡV*TݡT?ϩB[35zB\\~%WݡU-E|nЪh85B1Qgv*nЫLvݡR*&whSSԜX[?hnSmE<~3Z|B͟fJxv >B 6whS~3Z(HF5֜)}V;))vgv%>7;4B3-) "'&6ѭaqIU꽝.qb:kPf ~ONPSi3RNnSm$^56BN|NE|n"Q^XmE-5oCF^I"]-%"o|NЊ Ez`M]gl?r(CQ^7Ǔ#Z ңDNo21I]W&"AFFt*U& }UuQ7ǩq?R1cߏ5W!L?50%U /EMj| iQU'qx>j-_iOaGE*_c3b/MƵ *gqy*E}9h$`~BBN=$X)5ޕ%R}7y3֢%_TǓF;JΛgU:7U14$TC9AdSiLyM1,EI"U"&PLkPXf>PSZn/%SNoR^?$MZ)Th<~AA`I"Ө|Ltn/$8$M /,$`|R{֠>`n/$)n/b/8AU7ǃ#Z 'v8B4vjN>DsZU%`=$XfkR`}J>G<^kPE_¢&}W zzIP,->ND) cZ!2>VB4vԠ}$9Siyx iӟZn/0?"bQIj|!!q{>HTkQIFTML5r}UuɊiT(I'Nn"|Z^ F_揑18֤2A(=$XhkQ2FTML5r ~S$SqxLzsn/)?JIӛ0 _BCGȘkSW!|dF*鸼T|CɟU_[R.!^*Ran7 `>@-/}=5)*q?"bOʿ|! g"YIA*4Jn/gyEW类;Dn/)$Ran7 `>@-/$!oP>DœZ$/%ңDOQ&}WXU֧in/)ť}A›Jcm'@I:sqP,Z|/1p֧C_EI>%R}7!ϪZ*}Uu%;{鸼T=K}9J" t>)2cԸӟ^*R< zx֠ U~N|l֤aHD"SZԨFTM"'&DeL{>!yA*U֧M֡WJ};7Pyanqt!L`dkPW!Ȗ(52~BOg MjzZThުORtyL"2&L=ɟd502UꫭON}OMXf|E nF}9[M'@A0HD7̉o>NɩP>'B"7Q6t+KS[Qg :2W(oX I5Սb;d޴PaiQU}Uulg|ݝ kTf|T4"C;57m7ǯٝ7SPse>Lg}=7)@[)SϪw)iKT$%OH@'_UﰦLvGK8ؕcHSK/-C7Jc3HR}eﰦLvGK8ؕcH47@)6PmMR1*cѶ^ odtӍV=>tjX0FyjP*SF:ELym›1,tbUO"=U,sCtl?)ϣ"=Qm› PsNPH,qic}eJ}9mIŔӟ"XjkSW$"|`:kPdңDO>j+ ~SSM?)–8xJ~(}Wfw?L5$2tZӟ|~Fyx1 &HoP-7h#-C7h#-CJ|OnN_"X֡/=~ϒ,֢IJ>$D)C-/}W*U֧Zo0KPsmM1;xIjPu>=|df*L)?Og^kS%R}7ZI9SZ^5l}Uu-|L~ZUS|~Fx1Ũ}AYM1;xC3Ms%3ZJCoE%R}7ZI9SZ^5l4v>?#G`w!!K)5*E֠ QU'}8"|~d<ɁpOܔ|֠:U֧'#)joP?#G`<:>OMKȖ75__ jjTh"9mZqʯ2WW?|CɟU֢ʯ]ɓ|~Fx1Ũ}96zX⡭DPU,q9,[MJXrdokSM.!8J|L~>"1,td F"<K/g|MjP~e'&FZPso00dԒsCuIŅcɩcF:7`$K*5~B \~ϒ,VkQhIFTML5j}Uu *SN6@a*c47@)6Psoi @p5U}ASIvg&Nɩ?-C쎛4v#PyanqRI AӨ?ĊXlq%|DU>x@z8A#5"nh}0t}0ϑ,֡گDߧ j%@Ȭq &h}`ֱ 0%z~C<]j2}WfrdOKT5K~K|Җ8"ZWg}M7ԸӔ>7?-C)*SN6@a*cͩc}e?-C'2dԒsCAjNM;x Nh} b8Ly5,sCF>4|cZ*|!K|`֠<*?|CɟU*}UuɊ)*SN6@a*c47@)6Ps oLOS|~Z7hG & -P4ϒ=T2KXlrQ`=H/ɩsCу1 $|dZ |!0~ϒ,75r*Ec5,sCFʿ>^_&}WcZW龞8kQ1U,q9,[MJXrdokoq(}Uu)??g|MjNPMR쎖:qO S9LѶ^>zO-&MI'4>ta87`)@ɩ$ ꓋ tǓR4>toI-CGȖfkP ~B~ϒ,XkQ`,FTML5~SSLvGK8ǧцSK/-CO-92u>MMjPdta8" tNh|ZA$Rci,${%be0Ա9`=H/ɩsCу1 $|a֦JDć"sZ iQT  jXѶk >^_&}WcZ¯]ɓ}=,qP֣XrX攱4RONPS??Tg|қ攱JP,Nl"Xt zB9M7ӿfw}=,qR 8|E!L}Wu>MM@kȤ(XE%RLտ)o) j/DG$KVOG"Q^X5kY'Ev{;g|{Ird) }AS|@4&!(<Ο"XF5n:w" kPDF0}B֢J: iQI45 n!90ɩ tic7@)6PO龥3 jPM:tl?kRZA*4JN,-"Ǔ֛\CWZ{IŅcɩc5 5_|@ l꿦KA5:ʿSϪwͩmK@!oOM>Lg|ޛ P,Nl6,z|:EJh|=6%S|@;#l6@a*c77@)6joPcwfwǴ)c ,z}`jX0F{;>MMjP|L~>Z1,saO S?nnSm?Sm7=~>i?-C S6 X01c}e57}A[M1;o_;oPsjofwoK@$aǧTf[ST6~>S|ږ8J>BޢS|zoL%R}'ّ~?ƴ=oZš5>3" t5r iQƵCzTh^OfD6rdϪ=5_q$ *4q?U理%O8Pq'(~5p>O8;CW!>.Nְ!ZoZ`>Oi RMk.!|ְ&u>ޛPj,3F,- ֢Th1EzTh^OfD6rdϪ>?r>)sZ_JX[C(F_8F}}وXf̋SN56DW$Q6t+KS+YDFr1+X]j4T}#ܘ&B"&o($XؖF{DQ$j4T}#ܘ&B"&o($X5fEIG=ɏd"(fG?$3?g|k2NWAh74{;tJ!7`}4?-CtNo0Y$xQKI9"n}H:Th2[IE!yMp=97`}4?-CtNo0Y$xQKI9"n}H)QS|<ӈ}9mMF8=g}=' 6FP7ӛLIRǢN{HR+zTh2&6S'ƶsEh(G1LERLPH"z 3{M=Qq?joRjB8 *>(}W篱P q?U}7'?qߧ&|jE}J;CS叉_)|MBHJ;COۦn?~j#t5FNɩt|NE|oS%1ZA uv?i5*J>L|!Gԓ7?ƿW8~7H"6g|k2N›N!u4[L~8d6&w}9jPwu>SMSaL~zo-COM356DWW>oQM'O- &^rr͚%H&> I _vPj+Kgl?&BI"dŨ}A5iQ}W"d|jOЈQ^XmE6Ycr%>'hEdvbA!^zH1jNbwyCRM*4L罹wZj&ThPNGM Ae*4J{6:zX&;2&L_"bYCP֕&w};k9PfDɟwș1CXR{ zv:șCC_{>H5+zThI^kPN ~fDɩ"d}$L?ƴ2sZJ꽙'ShN_"lj _u{>Hɍj ZThIyB%_DɍjZThUș57Ӛ6QJ$LOSl~|NE|oEzcv۷G^i5|NЊ Ez`M]gl? Nk]A3;oKPs^_"ecJ;X{uN%I͟RkPU_S|>5NPRDSM`83?} >Bt֛@t'z&T3꽝4SK zzF)c ba'< ߐ֫JTh?|ǐ֠8T7qd|^zo=!oOKDe>Lg|қ攱ǴY$8D(7ǴdtӍ,z}`jX0F{;E>MM!jP{IKS7 j CTkQPOJ7ZJ7qңEM1,td F"S%7}9l=;#lcTǏc}ei57}A{M%,uOǏ_@5_ӟ龨֠S|<5-S|~ڕ*oic X0%)?g{IM!jN[:oic X01ic}ei57}A{M%,uOǏ_@5Ps=75JTh5Th?S*oic X0%EM%1;Joi Ps|3iMJXP,Nl"Xt zBHMٝOK{J>BޢM7XF}`(|B5 5*4TIckR#5_!O>OMǴY-hɟUS|Җ8 #=>@"4>Bޞ쎖:qO SmK/g{Hɩ-Coi)c~0D&-%7}9lh}4,q(GI'N6,z|:EJh|E!$Rwzo=!oQHIj 4S}Kg}M76>Bޢ6&xkR J BH+ңD/a1c߽k)Qg{ jNH:|& @W,X~ϒ1A9*4QU'MNjI`)JNORI#N֠*4E}ABs8dkX+ңD齅4~Z4$>Lg}=7ҁg&}WiMJXP,Nl"Xt zzZ'쎖:qO SmK/g{Hɩ-Coi9IqzCɝF\5[.Fc:X=>0DM%1;Joi PsN6@a*c `>w|B>:l#6Xs-7t ڕ*oapְ1S|{LvGK8ǧцSM%1;Joi PsN6@a*c47@)6)joi PGǯj@~NNңEM."*oic X0齤?g{IM!jNY"ٝJoRҁdttaǧTf[SWMٝOK{J>Bޢ$RI#N֡JjN~M)Z8FjF^56h~|NE|nѱM]"j)kC*9b\IW\_vPoXZ3iMB>E}AB&}WcRg7,sJP,Nl"Xt$Jq?)OMٝOKҔ 8|E5/>MM:l>oQOk%c%;I)W8~7Hg|ְv7 P7΋PO>OM)@[MX攠Y$9XD"5 h U!֛dgцOMٝOKҔ 8|E5U|ct"+|؊+KSַܴ/y u?hњ%H&> I _vPoXlu;boC1_=ϩPs:x&'S|$/F;U֧ĺoz3$_&5 dMXYߠ$ FJv9CꫭO}m,zFdzyI U7?ѨI t?;:_`٣䆐=NjThOMZ@P>COSl~|NE|oS-,…7u*R >'hE:g|'>>HZp FNN>>}Q5BHԨ3=?U]j{=~k*XX$FjoCꫭOa7͟ơ$"꿦,sr},qv=/{L95 d0ǢM2ThI69,saN6̓ߏh$`U7͟iNjThl{F$ RDoR6$o?ѨI 'g}M76S'zrWZ(u>MMt"+}PmE95–&J<^vv"Q^[;dޱ 7g|k2NOS|֡?FNNi8T!ɓ)};k9PSjo|Bć5BThIZ{GT5M*4E}A5S%>_iN0ZTh֡REM A*4O>Nɩ?>'B"7͈d;ڊlo M%Nj^ωCbC;cwΙֳ$ߡBHF;F4,uv m>&z^ Qg}=7`|APS>MM:l>oQNMo@u*^>'hE :fZ̓9CꫭOt:N3&w};}=9CꫭOS}:&6SCoXXAx:' 3c}VӾ )txjEREmS}iIJaI?>0DZbv9CꫭO,uljƵOӿ'`.z&6"j)VGJoqD|NЊ Ezl퓇zّBF3$Uwx|P-iQg|M,vlo?-CWZ7KH$!_|~8ְ_>HZPFNN>=}Q5BHңD>(}UuoMX$ Roic&I%FjoCꫭOdT6~k*Ա3c_U@7ǯv|B3P-*|$ #x8@=~=P%R{>͎iK@7͟"3c~=+'5 !MgS/FǴj@RDoR6$o?ѨIңD{L辶zXԒu*{JThCU]j|56OЈQ^XmE6Coi>&Je]A:'Pѻ;LYv ޅ>MMZ?J;龝5֜qC'?kSwZsU֧ϩ65 "NNi*4J}7ֿҟTh֢`J7L)Q-*4O>Nɩ?>'B"7͈d;ڊlMoܤYy 5 ʺkuORF{DQ$h(G1LERLPH?hٚ%H&> I V'٨RQrc>5b~xF{DQ$;B(5%Q6upnBJb#3b1ْF"CfIӑ@|TOSU~#ߦUHD8W=mH{)~ z_H@B'*|lDhz z_HP^;,N)RpԔ!e'"hFWCe,&$ ThG5!-*4N!ڛDw5-JjPcvg}=$%BHRqbw(MbωXkJ;TܜRqc?r`j@ʕ">oIRS唜gT\!>!!%?CBP=*4O&O4|kUS)G5Vʿgrq:Ũ}AoIRS崜gT$u"Ǿ!oǧ|Tj@ңEMHCP`{;龝=N>n4b#!ůǧ|^j@7FDgkKCP`W|[Jqybb#|EkXz8jJcN3 ߏN!BHRpcv-S};}9Z&}W8MO[J!oONHܜQvTC#P8s<)C8ΟsG$&ǧ|jjEIJ7’I86,Rf&X  ~SrqE38MO[J!oQMgO45 V3845 !&UhzkX9U_rqA38ɟUN(rqFҁ[Ӊ$Px nN(I$8*DTh>:)C)8Ω$#aʏ'`, iQ"RI'F%*WэF$X U~SSrqE38MO[J!oQMf5%1}A'nh0%?CR+ThUNР>D$1F!7};5>MI$b?pmcP:ThPR~1ZңD7P#@߸Ln$@ds' IL~PIt! ǧ|zj@+FDgsCn1I،O_b* ~SV}VҞ¥$xcw鵍BH}*4E}9o};}9?v BHCU~vWݡI)QgrqBC9H.FORI&7~X$kJjPO&7~bkX3M#>)~$I$Zpְ)Qq?8jJc\&7|MGӾHh BHSqOfb|$W>%I&7~X$iJjNY' IL~PIuH1cӾHhjEYJ 8jJc"bwN)HhF5 TңD3P,t>5%1}A'"hG|B DӾHh BHRD| Dt"+q2(XE%RJKƌ/<^2GK&vPj+Kmb5$.3Nƒ(CiQ4z"6%" 2II!RJf+Ϫꫭa8D0= p1x9~= $d8|!a$0q;mRHB'*|mBeHD8W=m8qC=Pqu ${~ N.U7)MBHJ;"bqI F7ǥ}AmKz $bZ4_J=] >4@W)_gӾH՚eJ͟ʍBH꿤jAIU꽝3TO}V/g{@-`%{͟${gq*4QOT!69'IJMXzs>iH>!XH|BH Q~ BH Q:|B&%?F|jEu)N3O[HVN#"\5F'ӱ`gT(3iMGM"nhcGa!FF5 !RD$XREItL05 "@Fq&R !4PPңEI*IiIqTh4};JN>n4A|BB)FI5 "Q&bR pP|5}@$-cZAWv)$/M oܜN5 R)Q_$$sge8"RD7CT5%1}AYIuHR +!ӾHL$!6*nLa9-o&$ik%}@$-cZF SXR !dN') iQIbN'>&vSCZTh4};J~Tj@ʕ">J)CN3DґT0T/N#$!Ԩ>I&~qI6*N1UKHbN'"3iMGv;ܙ;;sEƒ9b&UP1'|k!S$ ߹8j@ңEIʼn$>ĜN|L -*4LS|>%?qx*5 PңDZӱT5%1}A[IuHR X^  $`Hj@-FH>!5#'BHQ_$$qdSJ;4qcMɓL'>^ L(>HӚk~ I$ZƵX%U&ᥴ!I&CT3꽝OIKi@-=' 0leGцBHRDoH zOTܤAt`}eTJG"5CJThCt5%1}A'"iH$`ljEP/F)?i$8YU$Iȍk$_rQjPiI)!0#NkY$*Ũ}ASMa:%"39=^ Ji3?im(|E5)_Ƞ$+_!cW2(5B~"P3HO>OM>Bޞ[}Uwԑ@-N6ʩ$ρR'2(5*4Q>i8jJcN3DґNl"YQ:D0?EMBH*4TܤIL)$ʩ$ODkY WܤZZnRJ}L(>HӚH MDb>)0KS:o~>罹zO[J!oQMcZN>,:|W щ;R~=; BHڕ*nR RI)$>bNkX4}9iMIE}A5$؄ƒ9b"1jPpNHO}W{)0N&}W?im(|=8Mɓ~ I:qeGġ*DK)>B[?ON>rNl"YSL( äOA+ǧ|c#P:ThI"RIӍRIԟ <ְp MIE}A5$؄ƒ9`WܤF-Cn Ա)92Zo~>罹zO[J!oQMe5%1}AYIuH ω01m,BHޕ'vST"s}E8IRS唜gO01'|B#~=;f$ BThHI$9`^iMGsқPkMIO sZ.U7)Pu,JDfr{N3)C'-I*4T5%1}A'"iHN,@5 "Sr%" $Ab;4q?)I(?ƴܤP|5A_r?iL'RĤFg'HN~ѥ$ ܠ$F ?rZ*ThܤڛrE$g鵍BH Q-C.SrCZ (FMIjPĤ^ IܤZI ">TJIM /ܜN5 !+FU|7ؓωt3iMGv9' IL~PRqR&/oDǧ|`5 !#REMɓL'>Šƒ9`CUi$%ơ$ Th8;cgؓω43iMGv9!QI">ʓ?q?i8ΩJD+ SSA~=;f$ >I&rq8$}*4Tb䖑ĜN5A3iMGv;tܙ;;sEƒ9` MIE}A5$؄ƒ9` MDb>)0KS' IL~PIuHR !N"5 !REME>NɩIܦ)&p&.Ezcv„Lkb9pC\IGLh(G1LERLPH?jj4T}#ܘ&B"&o($X|F{DQ$;B(5%Q6upoZvwFlqU'EmSz^aJ4Ff & ?M I=H$s)Ŵ*}JH"XcKU|`FjAnoфD%)c,vjAr|Lj,_=NL3Cz)}Uuu>MM@mbW>oQKD\i)`"Q^X5kY' ljOڥ^#=[̿SjThOM!֓L~9Nk]be7ӸӔ>S};}9PS[DhSM.!R7Ը7Ը&PЧR(?yM.!A.){K0+ ;fkXIԜ5HEp?шsXOi)8j<c%=Px"0/\C99 &}WHfi=<N>-Sئ.!(}Vv\Ccw{fkXI3}V:S,sP|k #wabD`_H,zB_U1d=MMt"+}QM]"j)jSO-}Wfrz&Sߢe]s9O>9=OoaLpX\sG'|}N~Ȳ{-)ΗDTMICg{9=Ooe2, ej1Q4|NЊ$3ttU| iQpʰ I V' h(G1LERLPHv&xi 'Sp0U|xP-7a/.XwkwuWq)o$̴.Xwl.ʶX֝2Zvxi/N [5cf_?uEIy/4r%]ko$/9Υ=Pa ;w.AK~s- bI/%Q,s-(oSaxe],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_e],Z_[1kO'YΥۜJm5,9֞OD)JLu 9(gXkbY8rwZO.jWue05C@FA!!֭_jl7Ahe)|dṴKndkb]sbXu$[gR@z&X9hXˆRe,W4KDaK\Ұ_?e-R/8sJ|ᔴFK8d+Re,W4KDaK\Ұ_?e-R/8sJ|ᔴFK8d+Re,W4KDaK\Ұ_?e-R/8sJ|ᔴFK8d+Re,W4KDaK\Ұ_?kbY8s,A@_47ZF\Vp>^1uY#kw+`|s8/ ֬;>9pqVH9̴D|w[K2/ا3ɖPCb ֬4f7=̀60>1l-ŧ,nE(L 2hz&c̼%~zlD Ds )lͰ>9|| C9 ǐ7=̀60>1lK']sbXu$iVY?X,WeZ"Xz.lx%t<aks0( [3lcs< 7ZFécO0e, QO0dppdu6\=69@e$qխrØ7:;>9v,dli ?wZKбqs2-glu[Rx@rxn1ANdbe[@J@5bSx4Z|ebdmbe#j)#̍g ܭOCq]E.mz[_3gk數ί5Y}Bխܳvy= Jml׮ί5YZqx6;lS!,黷tK3`Ap'n)/rØ7:;>9]bXu$n3xi>!#`lV\Vp>kQul\=P\ Kq^kDN^1Mmun;\%n,AFK摹%Vt6sc#5CFٹԭܭ}׮NR"}ί5Y?rØ7:;>9]b۠VM>gW, C06nu+kw+`|s8n5먺ӶYF(F\d [^:%r ܭuƽuXF>f:k֭^BXί5Yls8b129.9nu쭯VK2+k6s-+W,N=1dls8 .>^۽ _:/\GZ&\qar!<cu:捳626em<] n5,}sCY#e-63Ջlͱ́5CFٹԭܭ}׮NRxIf5JtK1x6^xFpn6|(Xscnih1@n>P=6RcH۽ _:/\GZ&\qar!<cu:| C9 ǃe狤l۽ _:/\GZ&\qar!<cu:P:05֬e)fR= &|ͮܳv ۠VկZy be̲ F?H--ކ/e ls#-.X9bÐ|b1|D! .>9Z9= [ _:/\GZ&\qar!<cu:7jC*/<]#`|sn7=׫nz&X斃ɗ,\rj1Fn>10:|&nn!9AsfRr3_,_Csyl׮۠VկZy b:׎fQrAp'%V͗JâJv,e6r3NۚY嘃,#[-畸ΗV}R^1Ӗ1,i6!2Z2Z50eӵ_u)us8m)hyζmrbf2%"SҤ:KFFz%2iK1yӍu)us8m)hyζmmueV,dli'z.qymZŲf:Y2ܗ^y[Vl1 mueV,dli'z.qymZŲf:Y2ܗ^y[Vl1 mueV,dli'z.qymZŲf:Y2ܗ^y[Vl1 mueV,dli'z.qymZŲf:Y2ܗ^y[Vl1 rbd&t0*C8dadakg`5Y%蔼ί#Zy=i:1[ud@FѿWHcj6^Be*s)pi;ggĭކymz[^:%bzF^\gW,ӶZ wpz C\xvq,ӶZ %x,햁bHܗY-|1/mCdY#kw+w[:lQ6^Be*s)pi,dli ?wZF͗JâJv,e6r6q+wz^V:׎f^廮׮7tK4햂\K4햂e@1pbxIf5K;e~ >u7%:v@p KPVHνr8cv͗JâJv,e741Y!/B֬e)fR= &|ͮܳvy= Jml׮ί5Y+W9nn;n5먺uy;eAp'q1qLJg;eq) \.Y|h-tyΥ>\6AՒ6run;\%ݳe)fR= &|,AFK搼cwu$ly Yl:!Daɦ_3kw,흞OCgz[-硵n3xa[뛍z.sq^kDNh(P\ n) \mqijNh(F\d CHZxIf5J;r8bK(:n<;8fF16^Be*s)pi,dli/[dY#kw)xd/!K2 D98Y4mu坳lVCke6tuy1Zqw]#qsq]E.n3xi- ;ܸ=!<;8i-ˌHb1OI,ƾiC6r._Cg\ eMݵLJgH&R̥Caz%;M2Y嘃,#qr6q+wlu$mu/֬e)fR= &|ͮܳvy= Jml׮ί5Y+W9nn;n5먺uy;eAp'q1qLJg;eq) F7]#`~ >i%x(b^چ\VlS!,黶Yy Yl:!Daɦ_3sK<en;\%nndܥ;Ւ6l,T6Sd/;v'[ ҷtK0j-tuƽuXί5Yl(.7r.6Yl#.2!l-<]$O KPw\} Jrsd%7vK3w]#w/!K2 D98Y4nigb 6B_4u˗ĭݲ ֬;cRiJ"wyIyH2o<ȔLzI?ȭoʶXJzoS ~z&zûxد$|MHxvÌS4WI;aoh_DT/b=d.Y+$-XqM'u"M{,9h0sÅ⼒M,D]oDGKUDpCI6s-/WQ%;9.$Dq9.$E9h9h0\XZ"M̴DtEy$%s/;z&ce%%w;X=Ds-/;%s/;bhI6s-,]-^I&\:_= w.s-,`AK^I&\➉Xe)%"W20 c h$y̴DkW20 c h$|keh0CöP%+$2 &JaJ^wohbhI4S.̼&JaWkDaR4JFZ( [WueVx:/\( HK(:nY_3qV2 }9h1mƑ)iR^Y% Zy=Fz%^Lo:DW:ɜl6f [Fe6̓9h1J&t!{ny :KVKVFz& ZG,[9|n6uxXqgL)]JGC'Q7" |H!k?4 P J C0KR;" f;(%v`PJ A($*뮺ح| A(%v"PJ A(r`;b3 ñ5h@%p0N J D Br0[B-V=&T`V^T@bE" %8^#AA!v5XIp;Ss`1b3VtJ`7#h| A)%aXPD"=v)aPJ A([#NZ8 _Ln2m28_8dy PAXX 8B$`p 6Ш;v':A@aI`%Q i(QB  *CCe";- CawQ᩠ A Æ 7`AH 0  ; 0) , CBv)*&#`X5B S0 BQ v)Uv$اKN,,L HN*xp kD`v)BBN|;`5 MئWQ 0t;R$اO G`X@AB"Ba\r;0v@8 )p8Eq4"<=" |\PvX ;5MQH A` F @U`F;,1H<|%#mpp1`!e@nbFbh; BBa"8 v&/`a C)dؚ%p(v&V4h^Z%0LGexv- #8$0X@;f L>|v-Fˆ%Lг= v-;"VAشj`vU`!0Z*?lj{b`GbD0 M Cp"ñhVNЊ"">ش N 1v90t>ch t@tb ,Fb^PrH1@ BB`>;d +dS!8Zf#Kbflc @šd @28`ȂaPZ;:Ph 0;%D $v"; D b c JɃ [x`cq( (#Bؔv  [&@5/N] @[ +20rD!l,Sv H ֍E`<:VĚH G`^!I") #/!v[ v*!*^5v~@`^AJ0(`^'2;,)a O !;( A;tx#T6`v$R("08HA! &a@vx 2@' \^Ѓ°5n3рTDz;dP;5X0$ (x"1j6p `` <Dv0A``C*j@Z;0b``F`-Pv"+@BA0 < Db%`dvx@Tx"@z`X;\O.F $vuPx h``@^ lvk Lq'P``.B T 6B S P 0L`ް1b@!hpvUx&O&=4k,@p D 2`b@3ZD'`8;H@ - ݓ!CvdI,NJ/9 i$@#Yk0x']!İki8G( HXJ)X Du C1d`JIklZB`b+ #t]qT;$"v"0B Ǡv-*dDTŲ{3pv1Ť v-0/<"Z@0v-B&7dJ QH bea$SvEAv-X*Dr=tv- Rf'#!v-pA@ B;##Xi!a$v-T(1Ί[649 űR0@ a9v-p0vXbŵ*/ l(v  $ "d1<1(b`lqض~/!.!'Ruv-"ؽ'Vcl"pvuPx hb0V:p$#lC AH;0AD` tW5 b%`dv-@؋X! ñlKt%(Fك;j1. ɅV;3A@ .p[ sXAض<7؏DNGl |B` @l H[A4N"`h w@2; (_ź4 UXČ2bw`aؑHRR`v@HncJǁ#6TH"DB faCpV0 ꃳa R#<. G`'Avf `'HJ ch [ vFBP)Ē ;Ьv$@@R;tð\GaX` Vd`C ð"T @R;ǦLƀjaLZ!lJN;caؕg@; DzؕHJ%Ka<6<U";ĢczD v=lG`1 LtaQhTð"``# |`T)vlˀ`>;• pR0KB)#j!^;0CrXr`|5a",;">F @ Ea$<^;E퉂Aqhl`;0 ĐvB @(vȕ+.vƠS~v&hY;uBxHv&GR>;㩆@P ``#@`:;/ðapxv&V4ؚ%p8 bm"Fvp`K bh; BBa#ܘv1z¸#|v^N Gap!R0J!9k.v.;t-:|;8#Or< ;v ;`v,b; xvA!v8< r;IP#!GD@b!X;4aXhN" QGxN<aR` F$v'WP@ |;Lhn!] |vjG` G a Ax ;8vR.ap(%!؞;q; jm`d4-)$G`d6Bp1؟Y, ݈vczg`d1C@j;!,`vFTx`6& xXhC`j 禣2^< v(' A'F2,AP`:IvJ$I!ؠG0Gb`j- !,-A|?.Hj!rT2 1pxC2fw ^;  !N0(; E vAt) `dްd%tLx[L Z HLvBhNar%qXvԴ6 `dЄ xLB#$!/`v(! `d-v(H3š@cF K\GDNñp%b `D5c^Gb̌&4v72(: An;  \b@&L f QLɐ HAR;2Gb\B0v8$`bp|&`@&7Cp~1h0\8`|0S qi) % - &!ظAl xv"a8RnFF@V!-1b.hRn!ظ P)E!ؤ,"pB"bUPP5 !إKL@$V-b!,Qx\7b08 A<#pV;biF'1)>;%Lp C PhA(dC?N# !0n;Ȩ ?U`d Дv.30PtDZ؎A8p @ݘ<QH 9G~&T; p1?U@?J2Ga!H h;&ɑ 8 n`DRBCqH$y؁H;%XK$ð&+ a <dɁ(v.A4SLC"un`v& :8V!@.&3 qVHq,a ah "!v (-wXXc7nAx+#T%@E";2!,QP$Ad1^;2ExzDHTN.#-N;  B20Qb$( } 4veH2lH,8ASNv S~^`; `+t`;1-HP)SE1 ³ñLLð$= G`f4@@Dv)*&#`f P:; 0) b 7`AH 2k@PvuzKa(fC |#V P|qFP0 c` 3!0 *BH/| a#3fE@!FQPhAŒ E 6B9#; @b)Ŕ~HVA%@زmGa ) `, `cJ ;Xx`;Ȏp(@h1BF-,l tv. 8 H %KTdHh;dAKR`Zز)z!4 "|5 ;mY+0;01`BC:-)<b%AP@cj?pP;%` )`@J4Z;o-0 ( XxZ3P4}Q$Rf-g$v.@!DLrP D G`dpњ@-fLvXx; @1FuC- ePBYqO'XjE`:?Cpv@01pF! j.6 vG*`8Pv@slG`d @ \4b,Eh  vA GG>l HzG`d^=`6R$ HC! bx09vߎ8;+ * ؞2GX R ;|I υxvQc8#@؜*0 P"xG5cbpl A0+#h 20V~T`vD:=8 (x( 4k<0(bvaρ;@ -^%;7|XBh;|-hGap0xptv-#j8(;1T&"ţo ;YD`x g¨شqGc01tP`4b{شƢ#- @@%ñhHaT #w`S*XZ+*`|€X`R)0p; ;"|r\/)`q`<B(!!`^(` 2hrDy#-'`;Z0Z:a@dl;@TRLC1H0$q Z@;T7/<#>;ð8;4HEð/gvMPx;oʀT1R0@v!@j@Vzx; x#n! vl ԊGbH6"b<  c06:ض, )H;,"08,ضFh++`I0dQ3; @d #a``$x:bS H A؈ Dv! / v-p'@,X;Qp ``-X6P;p a;$T J|hd`B A#:``v9G`bJA([`( ;J`x v-`0$,_`gr `h1aPjcl7 /@.j;~3`[|Ob"'g~ 3av-K\`Zjtobſ;v-[طl0 H@Te@1&,$ŷ)^;h~ vB ŵ>-@@ v ;C1LCp( #l'pJ (l;μ`C10.)$Dp,ų @,ph"KbaضF!pv >-\[2b"0v;&4Tv`-x8b7ɋ``!r`vJp|?$ض%xT vZR ~|f5bv2Hv#RbP[<*T`a(ycðrDűg`Z0R0# G0 D$űwƁH H 3tB(:b G``VvlALBFV"!x aC^EPGv|**d;$ @.RhfCgfi`^%j'v@<;|+, @%vbQv4>V?bH@#xV^`^  A 3;Ǿ 8FAh9$= a$J`^=5%ð@:F<)AvhE P)CuOaƄdCjV`K*#QF)iA<` m`/ .;‡aZаG` ,0vO ;DN`0Z2-agKZ+bXQK|L0vv-X@>ЀL;%RaH h@@D Ã5𨊀;- ;:qxR;Ťa N! 0O1GƆ@Z;&1;+\\aO2Vv& 4!`8ƣP"hr!I0FaJ=P~0j;@ Bv|)(a3`x:&9ʀ,8RH G`Q$q8#%Pb{H vo  vA`vD`\h;WN('.a;0#S`vCAX'D4;XB#*xt a@b v' h!"#>5M` `).Rhv$Xl|Q0G`dOk T]+;Fd;!d%#.0#Tn.@VH# `6+ALq-q hG`duPð.89p%yb G`d{p^;/vpQvDovɂKp. n@Ttc(pG`d#yPFc.(0qZ`:AvBWbв;4 (!t@t)<0N;>`,vB@G`< ̀C`;!g@hA 0n`<v8 1  D0',7((! #d#pb(v \~;Aba(v. |l ;Z/@D&ର',jF3!3P:@2ð-@H'JAš8\bv `E 0 Dظ?&h 1j > @4v.z'@vpnGj`B@,hv.\Q@ð!0: %7Dv,c@G`BZKH- b'b(YDQP#Hh 7`;@rAR  v. ^xŐN5dAؤC3ظ(x*GbȆd ~;(<ՈcpT@v,bv)hgHYTІ~ n; `Y`FFdð~>2 !Xv /D;G,@~Dpg0ba k턄Cd5 4a 8e!ڐvaHHʅq(v,ˁvC1&AА; |j ;BPz*c"P Y$,, <@L@`; Yph~mAׅJ"@"!v; VT`X @ ? Š3aH#ydtL@;  G`XX7!p,4##{av0 `G0BX$ ^10<*q001a P@*Cc 4J`F D>>*x` c"QBu,`B<dFHILs4/w ( ƨB SJ^ xv`d;@|"k凁v;0;orab@"3Q vo1 Xb#E? 1\#+`n< 8jPB  X 4 @ μ va~;3 a v`8 4v`]%!̍膡@ \N 7vb+ `VV(F o Ҁ%$A6&3Rxv`U L#b ta *.T ғ`#F!>A 83  *QXv` Pp @;Bl"+ `;C`W f`V" $> CG`h[큈0XW3  4XN3 G`H)I8 a$ndv*`j.! Ga Yب 8׎vBF;(B084=QAH$.Ў0 Ԁ9K"±p @pb'0"@>"*AGEñP `ð4,v @";C% `p @tv(c%z@JG퀠N; 4 ;PRV!#Tx! C>%#F;AgaX"63( @`h.#" %'qMp]'4N;T!H;bs$>~~m*g 39Fgmgm9cʶX69cD/[&aeޏ#/pY_7 &XJ{!8VeW 疉MMBw=s< 4ls' &X=YG &X.YGxiA2%8[,QeQH2Ӗ1,i6!2X05,kO'YΜl6LTEsiNF`ufP#l8Ӗ$3ny :KVKVFz& 8a2gWzՇ@ܿw/?\_;uMr,_/5! \_l%]s\_;u]s!uYdxXw:erBלcl,K$2:\]trs55B_1]-wz"]szʼ򎅇r<\IW\_j^#f9I56P< ,;\IW\_"[sV<] :8V^Q*|ܿTc%eY=ZK DJ5*&zr%[/<2.9{֬x6X{,,z{*ǫG9Xz.9GLJ| bZ"l\x`z&9y^Yc$ric^AbL&^s u륢%PVb<^u*a-O<`|K$Gk=)_5ec:d{$Gk<[,Q9ZŲOBs,TKK$"\X3IDviDO=#Lhf^x%yOBs,TKK$,P(kVhrUy~5fA(Xt(%PVbڃՋV^bw",\~eO,q0_5Y0ni?@86`h^us3 HxX=YDJGz(*l%d{ bM˞z()%>IUmM-y9%WsŴE4LCIV܇*-)bQ<]G$xqI*ې,ycauDI8L& 桅M'RxNAiVޅNtOBs,Gk<[,K$=#-)WQ1%g=)_5erJw?dzsb=IJO";Y4e"]sdd/#0|ɦ_4G3/HD5?]u" c]uߔ~M]uTɿ뮺 _~o뮿$~5Eo?c]uO?]Dm#qg)k]u]uҟGa3(Gu_Fq뮺]u~S u_2oC/^M]u[`e뮿?&o뮿~MO]n_k]uv$]uv&]uv+~MG] ɿ)@7&MO_):[iԋ}뮿R)M(ԋbFSg뮿cohg뮿_yIu_~/]un&]uO]loi]ɽ] D?c]u?]?]uO؏])뮿7)No?&OߔM]uW+u__`u_u?[8y7]ux{7?]u)?Eu_]uꄯh,[H@?뮺~Q7u_d~S7u_cOɿE7u_?&k7u_7o뮺?`ڷu_(]j?Q7u_Coɾ?]u$?&"q5]C_]uOQ_]G]uS_]S¯cɿE7u_ ~Mo뮿6g7oɿ뮺z]ue뮿G뮺[Q]u)}뮿dhR]BQ]uY]u"]u]9]=$]uo]u?ٗ]uG]uʯ? 뮺~M[O]u_뮿5?]jO뮺_c]urs?c]u?]_Qu_U_/ ?)v^#x7u_Vx7u_>U_}&Hu7] (5q6[}]uH!]ɿ뮺|%S뮿Eoɿ&?ɿ?&뮿w뮺뮺H7]uoS뮿5i'_]?R뮺 SW뮿5dq#oÁlǥ}뮿}뮿6]u?}뮿doB}뮿!CɃ]u"03]o?]uR?] _3]usO/o*]u'(y?] ~0?)]un-M?ɿ뮺 M]uto&&qKo&?&&~u_i^ 뮿O?oóo D]uLɿ뮺k7?]u~o뮿"ɿM]uS] &ɿ뮺Y?] ɿ%~M]uPo뮿Q뮿/]up5F'JRGu_hg뮿5-*?hBGu__Э뮿 ? Q]uo?&Fo뮿ɾȿ&~MM]u ?}ߓ]uk]uoho뮿T~MM]u7]w?&M]uoǣGaS(oǣ}뮿)Gq] {u_{뮿o)e]뮺Xov(u_/]u/ɾ?]unɿ뮿 z/]un)~Mo뮿I&x7u_/$~M]uHɿ뮺^#~]uQx ~]uVxu_?o뮿9u_-뮿~u_D]=]uR _]uW(뮿N~u_h{]>:u_~u_ ?]usoÏД~u_"ߔ~M]uEc]u_O]up~Ño c]uH)vg?]_J)~MRM]um_뮿L]0g] Eoɼ^M]uo(7?&oÄɼ^=·;ɼ`o7u_`?u_ao ]ut뮿M)7] şɼ%'ÿo J?&IOM]u'#?ɼ%M]uɼ%~M]uѷo K?&T?Rɿ뮺سo \ c]u&J]u$$~M(7u_2oɼ%&rG]u&%)ExJ*M]uo Eoɿ뮺l5 WK5֗z3WK5֗z8֯Ye],Z_e],Z_$/8rDy+:'e%X9(gXnf]u4恳Z6׫ls#g:%wXY XV26[j-b9cY]kr2_gK#d%6C;y+- F+;ls;2%e 3 Ų eP G3pu̺[i?DߓQOH#7p! QF#71cՔ|Lw9*cj;2%8[,NZ8 LΗsd!2Z2Z50e,7:gl ֬8iK3t.m׃'RHFeDs?"SA34 +[֭_jh퇭S }\Ҟ[ʶX嘂9v, މy嘂9v, މyQ,gl53MBw=Nz%]Gƶio$j-Y|y.‰fD/<`YUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuތUuގ9P;cVPYPjK9|w-YBg/~rB.S.Sب_̴IE:_/UEB.Sb%=._$$)h2py+V ay(׮V%k%#DlOܦa%65( =2ĺZK E=\ay%B_1)Y%)Q,Su7ZK,K,Su7ZK,W(hY%%B_1)VIz%5,OE:2Gx&/VlJzz'Ǘ\mZ6|Fկ䕱O,Q\aJ-%kIkO'Y5e@%\@\B_1;5e@١#7y$Yls8ay(׮V%kÕ)f|^䕱t\h!/r^䕱t\h!/r^䕱t\h!/r^䕱t\h!/ry,\sfR+k'mrZy=ڵ狤/Lh4<`dwVί4++wIv3+̹b/mb%]pm%[;rJbd//NjO'YY#cY;gk'b^1 f|6/e2=leYBg/ f|6hxjD]D+rKnq*\V3 f|6 jXfWx U<] ls8 f|62lՑމ[eOcP9nh@Rځ`s;gWѱ̀c/Nj,,^u̮v/[^eֶZK 69cy,\scggGz/\nfWxls;qsk2uy!^i[M,|5e@yޅ6Y9[w\6q+k7<,KA |3|2勎`lxrB Q,gn;mr:Vί4++wIq\q K4۞Y+#ٵ8kd%7# mb%]㕼2勎`lYmd^AYͭī[!,ם.YXskQ,y,\sfR+k'mrb l76mm%Z eMiODmr%l76mm%Z@ '2ps(֞ODG,ZF(Zz .pٌcHᴩ,цQ9tp>w\} JܒXYݹyݹyP9a )q7<VG+w(fp>ڳбzN w]#s/<[#g<7Bb /Wr06nu,Ҷv/n5ggGz/\K2+k7Aԭs[t6BYAs^idnyf VsfU!#`l|IK.嘂9[aD63N6e%i E:F^\I\n[\IW\VNۮ |5e@ٹԳJەeR_$Ptk,,^ewVZknyf VsfU狤nu+k+νN܄5;Ys1dr6ls8bw\7y_+t/nm_$i[7Aԭ,ۜJstJkXlzaD79hnnR+k'nƼrBXfWxnIU],\W䔼c8tf$l%]sf^x ֞K:>z&zû@86YמM\Dw-KaO]u /]u ?`?]¯؏u_7M]uQ?&뮺{wwwoooow__e߷Oq#X9c5#c4͍@"SA3@pSp} p} ta}'tF(/_G(uKeF M |l>OYDu,ߏ"Xh:o,aֻֽlzg 2~SAh}kՑ̲~yfYujyfYu<,ߞY]o,.-Y,.ȱ\jyfYujyfYu9OK'ޤ8D|̲}Ցa_$%a%_4r,W?I+;\I|Z+)iOX-[,t{ MaKaK*-Uw<[F?4K|~iAY oDAY]t>z.C?4K}7]7^yf ^z.C<VG/=]!4]Ѯܦc0L9cEHpC(|}u,d&I6Qu^i?ê.K'g]s[3ls?TiQ/TiQ/ƴz%蚅{ fdJa,ӬWQ;YPCSHLLJ F<5: 8kBD`55K:ɣ;YמMޏlμh/|kfuG)|w[4<9K٥y_,&RG 3a֭8dlμh/|kfuG)|w[4<9K٥y_hbKBK:YDK?(|IMׂ3@uH2uy$ð9 t=`Car05z! j/DNxpZ3WK5}-9%Vג%0Lb̴먖ewPr2Y9Cu@nfWx +_s-%]7\̴먖ewPr2Y9Cu@nfWx +_s-%]7\ ۜJx#!.o̳04X׮ViCK?kV+X_oފ&,WA ]-K MkoEEBKE6<ap GAn(7SF|}u?Ա"Xu$F8P>PCSHL>aڈ54:ѸjaFFz%2|OM*flewtr ֬KKLsBsİrY_74k2Œx)ί4E98}-%Sd׮zՒ^baDO9uY#rJAYVIz%7^z$3KVIz%7^z$3KVIz%7^z$3KVIz%7^z$3KVIz%7^z$3KVIz%7^z$3KVIz%7^z$3KVIz%7^z$3KhbhI4S.VIz%7^z$3KhbhI4S.VIz%7^z$3KhbhI4S.hbhI4S.FjҶ6/ej/D/Ziz/j/D̳<9M/Ee:b >2J/}-%?exrB덯AkNj/D^KY9rm2K> ܭuF?5V.FeRtXJ/<] u, /DeJosaj: b0BCq!Υkc^w$SNCNyu˗93q._Ck;Z"Zz1Ǘ\} #hjls8]r6Ce%'2%e̼zkM/EzkO&A NjCfX5V.F+l|I[ke%+$+yS4K~s-OD,aıtEy$hz&c̼%+$߆7ZFԀwIx@pRu;qZswUN1s< xjD_$ܥ3܇JJ^1Z"XZ"M=D2h̼)%?9.$DeqOD,a̴DtEy$%s/;z&ce)%"W2.$~s-OD,aıtEy$hz&c̼%+$v\M) b,^ ֬K,`AMh!/h!/eJXcˮ\$gqiٛc> gmrVtéf VsfǷ8k`s8)nSՓ89Asa ֬wy ़cj 9qVHh;@pR^1Zt5ͨZ>_$9uY#kbwQ(e)%"W20 c h$y̴E=DJ^w,`AMok]+`saɧ>_$AՒ^Cg^y4r^%1e[jխXVAY_3cJ#\j 9qVH V9P9shbhI4S.̼&JaWar0uY#l&Zʸ惦@pR^1e%+$NxpZ"W2M*e]DKKDWItDeq0UkVʻ9.$E9h\a4vs-,]-^I&sÅiU=[*|xvq,ͯVK;qskĭ 3c ?ˮ\lJvלcY_3fmd.rU+c^p 厇 f|͙9c!#`l[{sKyfq9c]jflαqf5;YcJٴ̲8իl5e6sr0s,NA%'cgm@ѵ;63|hO%lͱK4OCgz[-硵mb%]cj 9J en흯<]C`8n5v3 WQ,ݲ ֬wy _3kbc>9sqc1g9sqc1g9s C06]bdngmr%ls;jv3|5CFmue9䕱_3c1 ֬J:ɣ^(ΈO,=īg;63|hW,tpQn Ca+kն> gn39F^rZyY7^S6bPCl|I[ 6nu+cՓr0uY#k&Jake\sA`s8)/r0uY#k&Jake\sA`s8)/RNppe`Z# ^ZÐ5ERNppe`Z# ^ZÐ5Er0\lн%Y.$;j?r0\lн%Y.$;j?r0\lн%Y.$;j?u ےZ%b[]-wڵ6ZK 69c W\lн%Y.wy _3kbc?֭8d׶aԳ6m2,|lVǫ'5]D7v7ZFͦZDz9kmt@lg f|6KY Ca+cY;kr2l}-% Ca+cY;kr>^Jڵ7# mb%]㕰P9q/V\Vկם.YXskQ,़cLhQ%Q,~vKA |!ly qxnjX^cC4VsKkVH1P9a e-Q7iV9kl76 mm%[;ggĭ\R5(tן%RliU=mlh:mZ ͈)[sV6q+k7Aԭu2 .uIx䕱˥uy8U) 8ҝ \rW2uG+g3/<`>Wr06> Ca+kնu̮-ī[K'-uu2 '%Hn>7|͆ͮ u+l&Zʸ惦'[Xnk9Ps> K:|oa ͈)]-%VM*qMOCgstJ\s+`^|u!e6RZK 7Aԭ@lz8`?/e.l#.x%!e6RZK 7Aԭ@lz8`?/e.l#.x%9Asch!/ۑ|} zz llVl7)XB_1cm2󅲝Ұ[x.9mJpmfלcn"`|el+` .7|͆īgn[a4U46fKA 6vy= J(t#6?/6Z?mbB2 HbXXAi c 6/؂8lu+l&Zʸ惦h;'[$xfxG\(F\) [YK 2!p9AsaXKCgw^lfsb VUKA 6vy= J%bwB_1P9v׫l76 n K?rØ7:!wIv@pRۺ. j_3k6Ry$Y/lVԆI&y;<%nndI&y>!#`lVԆI&yKk'nXu$m|ͮ_Cw\nlAJigs[R7y$Ylz8AՒ6Ry$Y/nf]uL9gbY_4 u˗ڵnKvկ䕱u̮vί;gʹ;^AF̼n5땬9<,^cr0ΥmHhigP9v/lr= I&y7:!wIvկ؂lV#7y$Y/r0Nj+Xry5XskնS6 $K<킁ॻ8^sfUig ͈)[]-%Kk'mrQ, C06<^ZÓɯB^؂8hey$Ylg-v66 $K<\nlALh!/( [Y;k/d/j 9d\r V9轰|͆ͭī[KUk[[)MOCg; cXd8mt@lg- ͈)[Q!#`lxr'^6[a3knq*I4( [ݹmͭīC+$;k6RZK 6 3N79 Y ?rØ/\aסbͯVnlAJۜJ2M, 3;wnz.Caknq*I4͆ͮ ॵ} xBr0ΥmHhigP9v7ZF7u͆I&y7:!wIv'[dY#gGyl76 nI4^19AsfR4nI4( [Y;w\Y#kmrsb f$K<훝Jڐѻ$;ggĭݲ ֬#6S7y$Y/k4恳i/y$X廷9Fb l76mm%Z ]-%wZם.YXskQ,stJAYxpZ;<=Y=5CFJ`9tpJ6ܧgmβ[ /N[mms[\I[/[U,.bPۚSdm\۠7:%/Jv'[Sdm\۠V^jFX䕵'۠QV!,\rs,&V NĪ+g\rҝ #j^vRh#?6p6nu+d' $h ndu,Jnligt@3ځk*f9F՞.EHpCKA |16|ܦcP>4mYXqAYmz.i`u @ ^vKYnyhbe%wy _3kbcۡ{c><_4D7u/xK*rm2]kbc:ݵwy(b0Uk[[*Csb `Ų ֞JmgUK2-KYmtrhnlAJL&Zʸ惢؂1ls8P9a Ƽl_Cj.lqigkl[Aķ ˷u/8ŵ]-%^1 VPu,,RY^vK4\K'mt@OX]tu+k{gk敻$<6q+wZ|wYa,xpZ >!#`n5dmrVtsg'F$K<_3gRj% V]Yy-\h!/rjfnidIge(Xw4xXtLh]-R CɯB뽄.pXҭ ,TF]u*g(]oE]uبH~u_bK)]%>M]u*?%)oR|T RSu_bG |T%~O]u&8o뮿t뮺Qk?]DT*~Mho뮿uɼ-~M]uبX𵿷]uB#le{65#7]s!|un_OʶX[z/]%%=PaYc /]ƽjc|$ԨўOBXG뮺?_V.&u_b+O[X1O[X7&V#~M8o뮿bG&7M]uجUɿ뮿'&ћܿн^j?UG]l3;L5 tfw/:<|,;^翩P< vJgG[ď^LS?u_+s0D~Z#`Oaד? :3'd_ \_N[,t|MBw=Jpm4<9h!ύ(u_g~忓}&p!@&u_ ֞K:>5qz&zû@86 NJ|xÃ@:5j!R>Pj; "#z-ī[3ls?Dlͱar05z! Y$Xd6f}dbٛcs-K| 56aAjl=P< |2(֞ODS/x/# uƶ Xy,8D@P9kbCnh2|kb9pC\IA@@SqK1 3؎e|\PP9ڵ狤umdg'kpĮ \Rqϻ\Ats-K|̀[,A[3ls;w]#k\ٛcF|}u?؎e|/PP9vN(PJ1lG2tzk(( `ls;k'n(mr%muGK8e9kO'Y#-YBg [.lf3؎e|/PP9v\N ͛[sV9cƶ#h:_=5d069v͗J/V\Qkb9pC\IA@@Sjװqhe-Q^K;sKA˥qK1 c؎e|\PP9vN7*&!saFFz%2|N1lG2tzk(( `l,Ӭ^KmdJs#g+2mumdg؎e|/PP9vNnlۜJ6^Be*\I[15A8!_$s )9ٵ8kk6l,T6|9ckb9pC\IA@@ScY;wls;awIv׮ly Ymr%ls8ǍlG2tzk(( `ls;k'n[|6r|͏(l|6r9c؎e|/PP9vNR9mumZ(Pmuls85A8!_$s )u˗ĭވΥc :_= ܣs-K|̀^y8dDL/Ak"V&c:_=0Fc?ƶ#h:_=5d069Aԭ(l|6wz#:Xe)fR䕱lG2tzk(( `ls;q<[#kĭވΥc \I[]sF(7 #e[Vf͗J/V3~5A8!ܠs )Ա.9laUͮܭgmZ;,\rBΗCkw(5A8!_$s )nsPڵ6KDakO'Y)Dʺmgƶ#h:_=5d069u͆I&y۠7Ų6} JνiY{wmuZA r%L gn5dmr8Բ6BYAw\ܫ͆Re`c8NZ8 [lDJpTWpb(֞ODQoN2P#/]_]u뮯]u_뮿ſ%u]u|Ƅl&eu_>S|LT]u'?뮺뮺뮺뮺뮺o~뮺·뮺>SB62)`>&W]u5]_ں?]a[]u]u) ]u0+]u1뮺뮺뮺뮺뮿ߧ[,t|Gz?85 (Q2>U8[,KW9Y=bh]s9d8[,S/?àx҂gns Dt壀 F%Huyg 8 8lLF/ί#Zy=i:1[u']mITbD13ɩC?aOb"Gb9# LI*$v!~13+o L13b؆&C?C?s!13؆&-; En13Bb+v!؆&p؆&x؆&d L"Gb఑؆&؆&؆&/En13ΩC?;Z&v!v L!؆&3 L 13تC? L!Eª13ȿb13!bC?;$bg؆&bg L7؆&"gb}bgx+v!HC?]bg`VC?]bg13ǟb# LYWb^&v!  E]bgb%13PHC?bة?bبVC?gbح13Tbgdn1313ʻ L D13%WbLo L bg` L)}bg`$¡# LD L?b}bgU؆&~13a3 Lf|؆&13}bgU؆&C?bg؆&~13h bgBGb?bu]bgn13j13 L]ObWb؆&M!T}bg~13h!DGbB L~13Uv!<;n13~13!H j Lv!@b $v!@+v!B}bg nʿND46R /,EOE{+"[?Z{?%'~&~ǃǃ6#Z^?7wb-pkظ2gn @.3oiHv /c;0x}'j}֞Ƥo~] FwM?E/" 'd>L~ 7EG/[/m? -%EV.%2roxyӌkW/c-Xc0u%8,]'oqdhf1ay(=c(zHd=cIJeGc;hf1}RdE]B7cghf1 v=6cb3 ;6cobhf1/ hf14{C1#C c(jvc( hf1jc("!8؆{3A hf1 Cg3@؆ ?P(v!C1?b3Q^?^~ׁ~ׁ_t^_?~ׂG+W}~F~R~]~ל78S8a8?_g+Y~SW|j_񑿱_دOW|+BW|د_?_ دW|_W|_bkgJ~+bkՓbkգ~׫bkV#bkՊ_دb+WyʟWyWyȁ9?_"+^t+W+:?_B+gX[XmX{XH~׬?_Wx+bkZWx+:~ׂدV%bkX bk_+O+#bk+.bkַZ^+hZ&bk֋?دWyد_د7+H~םد+qo+q+q+q#^P~׮_ƿد_ο_bk׉_د+?+?W{+?د7+`.bkcدX^ bk`g+ ?د_?W+b7+a#_0~[_9+rG+qC_8k?+W} _ _دoWy?++<^x#bk/Wy ~אXbk"+&bk"+S!?!*~אد! د^z[=6~מbkIدC^z-bkc_Wy ?+u!~אįWy V~ׇد+=bk_E/Wxz.bkkدZ^ Xbkhg+?دWyد_د7+H~ן د]bkqo+bkq+?_P~ׂo^ ƿد^^ ο_ཟ+_د^+bkȄد"?Wy"S"د " د[~ҧ_KW}"+3_HbSb+W{7+b*bkWyo+^~{?$bkWy"_Tد)+^E_Q[^O@G@bk)~נدK^.bk_Wx|^دL~ׇ+bkد`^ د`$bk?^eد6~׀+د?_-bk_Wy?+u#3~בWyV~׃Wx1G#Wx1^ DoWx1_]~׀#دSFد?_&bkY~׀)O+_~׀*Wx_ $bkT~ײ__썿__دB+C_Wx2OG_دd^ Wx2_̟^ bk^ ~׃1^ /Wx3_v_u?د;Wy@~בWyY~׳)~׳^W+^H~׳?_~׃BWx46~׃CWx4$bk+دOcWx3~׀0a[^ I_+_֟Wx5_R~׃Qw^bkد@~ׇg+?_ا^ ~׃e_دlF~׃a#^ OWxد-~׀9+_H~׀8qo^_Wx'~׀A+bk J~׀@ _?Wx?~׈bk^ _د]~נASAaA?_"g+Y~׀IO+_~׀JWx_$bk_+bkg _+B#bk_+(bkU^_P^%'~׉G_د)+J_PNV^.+]ttvkk7_/kΏWvPPX]_+_+_+_,o]?د0~`@~`L~`Y~`8SqWv__ دOWvد5-~a+ O_jH~aQo]ѯ+دbkUttH~`:*bk~ao+ _l{bG+ Wv د _.Oq+_._._/'~`++_د]O͝bkl_ٱ+]_nOtد7bkޟWvد7_رW+_ذH~bS]?+K_rmÓWv?_r(bk[~`<5~`<]+دWv·+Wv__|F~`>)bk%bki?+'د?_1?_1?_ubkbk?_EWvo]bkد\bkq+د _2O+A+DWvw~gK_WvuW+<(bk+$bkBWvJbkSWv0_F~d¯+&_+?O+>#bk+>+bkWvWvF~h/WvГbkgO+b7+b+b+bk?WvFد_zOgŸWvbkK~`F(bk/]!?+!+*_:>~`_+د IدbkدJ_~}7+a/]0F~co]Wv8_د7+FOєbke?د/Wv9o+N:_Wv3+N]SWv{ӛ]bkӭ+N]=+N}Ӡ]#bkӇد8Wvӈ~iWvI+N%bkg_q;]ӊ_د8WvU~iŏk+N-]?_r__ڏ]'+PQ"+P5~j+PY9Wv+P_ڀ]4+P]6+Po~jbk_~jbk]=~j)+P2+P]??دA+@ ~jWvK+P&bk_ځG] د@WvX~jk+P.]%bk7_] Lj_mWvrWvifWvP? kzkzWvD?+WvI_+7+?_=?~`I]+_=9+gY_=:+ ++~`S&++pد E~`Zkz-:++_Wv߇%~`ZO]iO~`ZDWv_ǥ~`Z68+_bk--"k-s]j?"k-Kҿk-k- _~`ZiO++o]i++]jWvbk-:y__]mWvWv~`[O㲿k-@1_.+_~`Z]hlWv I~`ZJJFk-_WvO++_~`Z&~8+;]hQ~`Z)bk- EOk-_ߌX)+g]h[]h]~`ZK¿k߂k?]?PWv>)'+"~ckRkد|YſrkWv>GE~c俥+?Wv> 8+'k]_{~coWv>73+ y)g 82<`jÈ% '2Zdzx-Xqae:XpCL^֬8iK1}Φ/_VO4e:SfƓL^201L`y0~1(;Zf#;̎py:I7HwSOxʺ\Fxb>? Kx2q:袈j)(Hs(I4TABDf>E9e>S dpKVt&gXcȯ$@uXcȤ$$F7yV+#K$$F7yV+%kns< qb";Gs#q#ЬW1R^#H+y(4 F㩡XcȎ<##q#ЬW1GgyŽK&13G d=8(L#)\1G 8S% 3w(x4%x Eλ8(L#)\` /X $3!c"]s`Ln<"\Z' q#НXx:၊g= ܑ.θ$z"Kg\LHOA\LbH%3JG;% sLG;&:u,W< p3$z"\YY=\}7= ܑ8 }#$z"\IbY$θd$z";+_1YXt.>dSBw$Gk/,Ӭ^ ySBw$Q;;:3<#0M >3;̎pK s3w(Lgw(tg L28Q™,%x dp2XKt|n`/#XxJ{D8ďB\.ܰ$q#<I56\)H+h <I4:ϸTW7= LJr̲5 V!K$ϸ= *%x*WLďBsKtj)d 8VNh V!K$ϸϸVN0rZy Y .}S#q#М.4| G q'H'éc 2,d%I<ϸ\H'\K(:^kD@\&q#w3#0hF7= Q\H#,q2W= G]#Fg= J::[,u*WM QOD\u27= Q.qyLq#ĵ|d y$z|6 ǡ>c.v)dp԰x 13V\>SgyŽLa0>dgyŽ1A35e0PdG 8]0¨(2x#.c s1$j˝`)G 8]00Pd`f| dpa0dpiLa.{0Pda(223G x FYs FG 8^0PP7՗;i 28Q&4%z* iL˒ F`gyŽ^~iLgyŽ^~i13G =Jpl|n70J%@4#q#41Y uWIo!DvI`uW0|= Ұ_3R3G 0:;̎p=H(u+w(u.{ACRdpo$ACRdpן Ԧw(uK J#. s4Rdpן*p9LIҸďC,di\H)FuҸ+uԮdQz%8J:#I&XFǝ1LGazu*Gy>аׁԩ\uThuG9ҸL8N&4:Wq#Cl:+`7= ע0i\uH2bTKLuҸ4e],# `u*gu34e],#uԦ.:鉓:#4qL򅋎`uWy8a:tW 0FfԦPL:`G 8SBa((t5e0PC;̎pBa((t)a(t#&x 0Lf| 013G hLgyŽ^~idpןACdpןAC3G ? s4S3Ldp(L<*LL28Q™,%xU>gyŽa.{PP鑑a<G 8^M gyŽQe#xYs FYs FYs F`f|e#Lf|e#13V\>2f|e#23V\>2Ff|e:隲a213V\>2|Ys tYs ya y;̎pe su-h y9~#\FGtSDM SA`.1q+:ZYy\LS#AC$3<Dw9 &璙Gs_qu41rUgM KիZ .}ď8aЮܰ<3dd3J,^\u2GҸWW<@\뎦Jg= 6\뎦J= \u2WѸa<1L}@mL@nTfsVGs#q#Ю^\H,Ӭ^\LďC䮙JpPW28Q%}xuD y֞]s`1q{ W@\q#НI4%u\H2^bg= .u^}ďC41Y y+:LO%I((y!䉼oď8aPPdp׌ay|d1t@n uϬ\y<:7= 'q#>((ycI((H)"TX,2Q$2$Hbf|e >f:HPP!a$Ht!"DcxSED$Hs(\r,TABD˟IH1Q :f"? #&w(2b!.t&3K\n:R+#qЫ[s.uď8aX%нn1LmghSʺI^9`xď8hSKvX01q2W= yV p3D|\uH3+ԏ$LďCDl"Z/2yďC t$y32̌I((H1a$Fbf:H7"4j˝PP"423V\>2#{PP35e((H1Dhe>f|e2PPc5e((xtoACɝ3</5KD>g:G^X%;V+r .HGu4+wA+b<`bg= qPY.H>㩡X#hdp:㩑V+I2Փɝq'H+ır xǞJGX%0<x3bQDn︑V+E륁"4$yb/$F`CH+4D $z!^Τ^sDfN%u3b0d h\J= q,i<θn$z^%x pלH+ľY_4:T$zzի'Xt:၊g= q.02q27H+A <+qV+I2W@d&J±\GRLU<+8+ıtd&LX%ήX2q1&K q,8!,:D$z^pCY.uϸV+aw.uѣq#ЬW=\돤yďB\Kd/a<θd$z\_s>dďB\GďB\RK:ɥ# xǑďB\D.zN<+$z&KBp$00q]ynjB\GT/ J.<3$z^Z%!<7= qLxX$qq#((x1&>Q&xYs((y2C1ɞ1XI4&Fg9+$%yn$zy$8= wtr ^q2W= wb<`dg= wt@g\uH+)PXy,@d:b5 #Y$TACFe>4%KPC2|)dQ%3x'LgyŽ !x)XED`d$z,]$O,k2LGa2-u<Dw yLďBek:u<dg;J{D#qu:GH3P_q2W= z/]s&q#((x1N OX,XO4:g;=q5狨,]@n"C9A %Hg:8|hrhвtΎABC#;̎pe ɒb=P232htWI &t"d~7X+$LgI4 :7= >ABD 28Qa ɒU %3G /&K3Ȗ.) ˌ7Jd I4 y)gLIHL`ďCx;<[B$3GqK=qH0 .vABCI L|+)׫8 Α31yºI@yѸeWh0\t@2u= >23$12$}5e((Hj˝PPj˝PPj˝0P5i!(Hc5eλ`#&jaD$}2Q >df|e .vABC'LվABC'՗;PP!G 8]0ABC$w(}$%y\gR@b[,ueع)VlDKw, |(%g(񤒜ĭPع|(%g(Lhz&c̼%@;< Ey$yDk|'%g(#hZfuNpx\Se z"`{,OJGPiL|(X,]Ds1`ihW'%g(~2 `t(cd\.يO)Saxع|'%g(F%w(wu$6.w2Jpxs|'%g(xYؖN<e$s(Ա".96.w‰/E⠆X?IVIgWx INNV.9U8[,;Sdpס0㩡ZŲ\RqHz .uS#q#HGX \t= KW@!<ďC5&ix .v)28QhLBTw(2PP1RCL%13G &1.v `)G 8L0#3G I s2L՗:>Aw(~AAC5eλ0P`#&Px 28Q™$%x .vAa>f|e .u$>1Ι.vBdw(t#o$@n)?VGs#q#ĺ)x \H󎦆)M J-[,&Hd:09aD139\hb;l.1q:W<@\q#製D錌u觖.1q%s<.:SC>GH1sA>d$z|C;ubYc sMܧpďCq#ĮH>d$z1IH1O-qןq#<\u27= Q<]Dθ$z,\y$z[s q$z|)\(DPbAG 8_I s1j˝0Pbbf|e/.u|e&Fj˝vAC՗:>CdpBc(}5e(})a>ZG>a>dgyŽL!Hc8(2FgyŽ$=D &Xpλe[|'%g(xS!ԧ6.u(`u,^|'%g(3Q(6.wxVx8;x¹LuO-+XXb|ZŲܰ01(.(ң &XAlλك2Zb C,]DKWıreW! .%be@;YLuI)Ke ʶ Lu ^yC ˝rWu`˝rWļ@;\kO'Y:xdf&28Y$ْ? "IUmFuy1q0PG 8SBa((y5eλ0PG 8SBa(HYs :f|c 3V\>1 ՗;`"S5e8(H#&I!.{%c` w‰A)fr feλ)u@Mr(]gW $x̸ 6/X ̟3- r%f&`XDCh!/>f [jTD. J#y7x&G9l>1 ˝I(ueΣgyŽИx 23V\H|)28QšBGLEΤ$xYs! $3G &S 28QHL<*%z* "c2ABC;̎p=T$|#.%xU 28Q%x P< /X ң3*8ID#q#41Y Hď8b9DgP$Ld$z;.&qiy+: H:#АnX8󩑸4¹|IJH&q+%q#Ю_$]te"g`ďBAi/]D%yH0 f|) 28Qc `*S5e0P#/#¨(J#.%x dp+FP=0P;̎p)Fw(2 G 8]yK:gyŽB\TiQ,c$,FGigb @3q#;c`0FDQzf9&,_2p$LC$H'GqՓ$02L&F|c L՗;0P``gyŽL< L28Q8L<*28Q\#.B\PPG 8]yK :gyŽ^~缦 = Jrb:H+DĎ<= бzFWJ= %]Bk%p<wy>&)0y'WI}#2LR±u̮ʺrW%JQze R\IN.}4n$zu/<3HuJrgF+H0 23V\>SH28Q8L2Q3:PP4w(L*Q3G d=T:;̎pc sAC3G d=T:G 8S%<Ksb])8ďB\.ܰ:ppWGXx̰QQq#ЬW+H Ai/]q&qН 4'^qНkazu2yF`|idgyŽ\ בdp=T:w(L*^x#)\PPL28Q‘K x#)\pi:%דgYD.ܰ:#ppβbY$θ`+uK9Q`bďC:%rK<θ$zQ,GW]"gג*7F`;c`uLd:%Ye̲θQa:דyx=}-;X .v%*"z Q#!bR!jol8 Ǡ |JTD> M DSt<{Sxen=)r@|*R>gyŽa.{¨(u!G 8S% ԉ28Q™,%xU03G =T:)G 8]0 ԉ 28Q™,%xUx#)\PPGL28Q%xUFgyŽa.{PPFc^zDCh!/>g:SJ{Dd7=  G hH8ºZK DH b+j]s`u#L\uԉu<$Ks:bdV^xH_y+'k,|A u!G^Fd񮖈 q"dWKDJviR83H' e,_$θלH' ez .uĆ)RaG wR3>2Rf:u*?C^3G З=T:!G 8S%xh|nTs%;'\FHIs%JGH/U;'01LH5e[GFdO,ke ʶ#`2J㩝LH8]6,^#u"gyc)&:u&q%qן9"\|s<7= rDw$}ǒyďC.Xx q䩒c)\%2LGHOL>GH/XIs<`9"[yr%dN<`d#JaԳK .uĩq#$Ko=.,xySң9":Xru,DZK DH q1H1HX q1$z5,eu@\뉌_JGHyf #%q3q#$SK<e c)墅Bù`.JgFGHв)Q,Kc+yďC1R,Pz/Z2뉌pp$KYD\)_}ďCN`u LFGZz"^%B_1xxH+VODK9hRቃ\H1ԷoE6W1LgK %)WarW S%}ďC(Y1HgѸ`8a:tT2R3V\>3Rdp䐘xU|#)\"j)D:̹- N=* fn2zqQ:f\Hi%8 0xwHs#q#$G Hen$yďC$+\H2I`.Jg= Dm`.J>GHLqH2Ig/VLq'H0Nh0PC7L:`tOEGW9L* eRrL L0M3ΗDTAC 023G =r,U@ndfs"^\ FG%運q#ƶU:`hduʺLqn:"]s`t$<+((u3cS#IH1Qx,]DTAC?'k* LLW-XPde<)㩑g)q'H3`ty+z" 0LGBùb]s<$zr鋉FGXw,K.uĆ8g(Xw,$z: q+H3`tRG<2q+H3\Ks:z" S$p*W= EA :#)H3̫u2G#}ďC=M,AH1FdyAC/dpo$ w(0I s4LRdpןAC&w(u.{ƐPc;̎p=蠡;̎p䐗=蠡28Q7B\Tiy&FsID#q#41Y Hď8b9DgP$Ld$z0&qi `t]yFW\X1LΦF= O%:dd+$"gu!$zPh|:b>((ufcLLeԦ2_Hf|g#.BaT:G 8LB\`~Cdppx }5e8(u#;̎pvACH՗;'L28Q‘&3LdpL=:d#/#}%xUdp2XK:dY>3LL28QHLf|gdpԐx F̀\n.vC3G x F#.Ba8(yc;̎pc dpo$AC:f|eK OhU̲8\XH]12yQz)Pq 8ϤyďC䉌O$0<#.%x HG 8]yK<#.%x J#.%xU%t#.B\PPW28Q%x J#/%ACRdp=H(y)G 8^0K s43G .{ƐPS;̎p=T<;̎pzg%23G З=H(xG 8]yK 0t#.B\L*)P< Zy=7IJH&q)Y2D$yďCz#:"g%q#Ь2LG]s`y!H+*qS#qiyclVC'tFg8AlGsTn$y:#,qJ9l(Xt%uį&qןycNz%]D%yĩJ? DK,K$q)84:Xru,D|IJH&q1dn$zKA |I<%Jc'yTp,9:z"]-%"Y$ 8dH+o=NbY$<ңaԳ(%@31y[, 83H1= E*-H&qңq#-;, 8/8f;_$$LHҸc^ZØXw* HL &q#Э iU4H0uL >? s,)/)M,^j"9 fXH&q̓8g ,aWQGPPC1x 0Jf|c<7x1@񁃈H1F q#$z/<<``d$zʺF<``g= J::[,u*WM QOD\u27= Q.qyLq#ĵ|dFǞJG€7P񁉛 e>f:x¨(x#.B\qKy%w#3;.un$zEGH0Qމw%3עZ/n:Dw9gM Gl y2G2Lk LɌ|c&23Vc dpKPP28Q7B\L28Q7B\2]3<[yfsu1ħ+Dws\H1ܰ= Lye%q#Юlp:g= e;:$z֞a/dn$z%]s:dIxǞJG^0LGW$θ︑c6 j/D.OE6.wxVx8;1{Ƴ܃,KbSu 9"Zz `Nq.:SAB_1^20t@_0(.(}/Y%)Q,Su (.( |,ay(׮V%kl\KD`.w;u;%LJq,W<s,;NaDʉND‰1uJ|I|'S w,xQDlE\.<;/Y.w‰A%x܃,K.w'X+#/ (K;dc 4DhFio$j)u@u/e #َg;yβg;0I= %xs7률biK<W|'iK4 <+ W/XNjO'Y%YRJh3 x 03V\S&3G &2L՗:>S>gyŽK Mu%*"z hpx=JA7h`9 H>328Q™,%x dp2XK$JgyŽa.{pP!G 8]0BG28Q%x :gyŽa.{pPG 8S%CFw(tg>gyŽa.{*"KA | Lg:SJ{DďBr$yz(00y^~B_1%@\i\H'+W]jDnL\u#:g G jl%12yďCu/< qJ? (_4GrtH$q#u՗#$@+#}#V^x"]-wCL#tr 8ב`8dYďBxz.pXK2@\ ]yďBxz.pX:YΗ\Hb+ABG՗:>S 28QXL< gyŽSBa8(L#)\3w(Lg 3G d=0PG 8La.{pP`dgyŽa.{pP`G 8S% )G 8^0M s1fc]:gyŽa.{,s1Lw$Kw,w$KKD:T$z"Kq#Н1\뉑G;)8!ı\3dp2XK%13G d=8(J#.\)G 8S%BTw(L綆l._$xsWR±\.:>ďB\.;.:ל0y+6}#<Q4<b;YGXx.Y9W\X \x27 G sry֮ܰ>DoppWgyŽK&23G &K sξ2h|9sfsĶU&L7yWsHp&1q(&>㩜J1E<]jÕS3G Ba8(}!G 8S%CL28Q™,%x 03G =8(}1G 8]0 ;̎p`*3G a.{pPG 8S%A3;̎pK s3'28Q‘K 'YD%3βb]s`2F7 G (%@\ RgYD+[s.u)H3X._$\뉑Geuu-x q2Tn:4+Dw,2dS&ppβb;cba2,sgyŽ.{pPddgyŽa.{BG,Fg;~9"]s`}`8c%@\ Rc%u01LH5e[ug G rE<*؎9:<ycUCaB|ǝH^~ycNz%]Dq%qן9"\|s<7= rDw$ y*GH1瀹J+9"`{,θS$$zd`nj}ďC._$,\x27= rDK'02yǑG rDtYr%d:TQc%KA |I<T/84HK=.,\Lb7= rDuu-\Lb`9"iK4Dfb:cҸc)Y2\LH1,dz&}+$zyhj1PX Ѹc#Ŵ,uK.Jc'^q#s'e,^& ֬N&2J.es}= rE:%Vt@\100yďBdD\S.21p$z[Aķ `2}Φqαqb\Ibv%p2WH1̲lSddgѸ`8a:1Ө F#.PP4cQHZqG F`f\ƐP3;̎p=H(uw(u.{ƐP3#;̎p=T:3;̎pa sACgyŽL!.{ƐPdp=H(uԆw(x,%x u)G 8^0K s4]03G .{¨(u;̎pzgG 8^ ѭ= Jr3u27Fg8Al}ǝ2yQz%e[0:ď? h!/ u7= ZrN:לuG\uԈy"T:#jq"C&K V먖b 3%0LG;^e Zq"WqןV^x"M830y7Ztqh;HĮL]-w J3#tDkuďBxz.pXK2@3 u3t\lPu4/[$0p䯸a:tD2R>f|g23G a((u*35e8(u+w(uL= JrT#$zQ*84\uGpP遁G 8]1 j˝vC&w(yLf|e.vAC.vAC3V\>2S2S&3V\>2S.vAC3V\>2S.vAC(՗;L՗;՗;j˝PPc5e((tYs 1|Ys 123V\>1_Ff:.0:j˝PP1M`10PL/x |t|eYs&w_|tD‰un#q# .uď8b8LďCWH_Fg= J::[,u*WM QOD\u27= Q.qyLq#ĵ|d \H0P |:dt^ACNdp(K#o$@nsGw9YθďC觖.1q#:\bWu41+Xl@铮&J㩑$cL#XQ4Gs_qu41rUgM KիZ .}ď8a:dt鑇EZ 7tw^yh\hb]3\b㩜u41$$yďC4&JGPPcL|"]j󘤖xX…@n鑑Dw).#q#ĺrbGH1+L+# t#IH1O-:d):㩑by .uLq#d:%q#ĽZۜ\&q#((y31ӦF^3\(DP7LF0P7՘H(yw(xЮܰGY嘃,2Jf|c<`f$>2Lf|edSBw$Gk/,Ӭ^ ySBw$Q;;:O>C*C;̎pK s3dp2XK%t#.\*3;̎pK s3Fw(L綆l._$13kOh##q#ЬWR±\.:>ďB\.;8G^ppWS 3G a0&x#)\:_=t yKw,.#q#НEu/<q#НEy$ `.u\H'Q-qP:g= WIZz }^}ďC'^he4+Ť8ɌyL&13G %x >gyŽ^L=|d $OBs,錌uߊ)lL`7yWsHp&L? QO>y0 QdpԐ=@Ms{ĶU&0q=WsHp&L? Kx Qgua3V| Rdp(LbgyŽa.{@84ensYQ,Kw,q#uK .u\H3X:$zQ,K/Y.uq#βb:<q2Tn:4+Dw,22Lew,2eYA\yH0x=}-;X3ؔ|(q&G#px=JA7hqjo)Q576PMn> M@JTD> M DniG!>gyŽa.{pPdbgyŽL!.{pPd`gyŽa.{pPd#.B\f TD>#3)˥='\FG]s`2yď8`8oE@du]-%"Y$\1FďBry֮ܰ%p"g G kw,F:g G jl%12yďCu/<Iuvrܴ/#20y^~Yy:8I4O7Ѹ`8ne%wy8dh0y+ u7:7 G 't@\%}ďBZ"WsHp:&}t\l0e䀹t\lPu4/[$θ*W= >4R t@n7Gi N{pP4w(z*Qdp2XKЅEwQ3o?.ܰ8,\0JďC._$w,)01LH5e[2LH5e[0㩝LH8]6,^'u"gyc)&:u>ǞL^~rK<θThH1ܐg= rE41Y+J9"Z(ZqT,;&}n$zm "eĶ8 לH3"a #!G%JHNg R9"e&#q#ЭY=/Wh!/<Nb``jz<8]-4>ďCKy8PCa,JgS8XgXl._$NB b+$zYB)`u)FPP31Өx Fa:#.Ba((ufj˝pP뮙dpԐx u!G 8^G PPL28Q™,%z((u;̎pB|eYs t#.ƑDz㔏ED:e|i#.%z((uL28Q7B\ מ3G ? sAC$3G B\PPL28QЗ=H(u;̎p=؀@86\w^Lg; uFGigb @미= S5]}\H+w,dgFdxun:ϸ4Cy$ `uy$z^uǞFd,/5uuThuG9㮥0LG:8K㮥}= d8㮘<ďBs5 uuH2bTK$qLJºS"9t,*l%ג멟}QtDs*fYKw,`㮘<= G(X]}^}#$z|ea:G 8]G Ԉ՗;ԎdppyL:;̎p ԉ 28Q%x H#/B\Ԇj?Cdp4&2RH>3R>gyŽL0(u*3;̎pBa((u+j˝`ԯdp4&2R3V\>SJgyŽL3R3G xU13G SK:5e0PS#;̎p¨(tG 8S% 28Q™,%x 0Hf|g%3G ɡ0:``f|g&3G Ga0:* 2,]QPnb=Pdfeb$ED:7S#^I&Ζx$@g\FGpPdw(11|d $,]i.lL`7uWsHp&L? D|@:SC:^I&8= D2L\L|*Sdp2XK(u1G 8SBaT:#.B\ fw(u.{ƐP鋦w(u.{pPw(1 w(t*LRdp2XK 103G d=T:b#)\aJplZK @n鉉#d:#q#41Y uH)Fud$z;S>gFoE@c'uu]-%"Y$7= Zr7H:#ЮXvr鋮<*WFneH3zա%u:$J`ďBvrܴ/LR8+u/2L_3:bcT:bdgyŽ!.{¨(ufw(LiG 8^00 3G d=T:C;̎p e3-[,:Gd)bMp3 "XED:sAC3G H]|£Ȗ.Qbf\cT:w(1|fy?PFe4Ldp]|h 2tljL}3u5X%)M%3t'#;̎pc '՗C8(t#.a(y35f0 FG 8]M o.0pP4w(u4&3dp0 F#)\ f&w(xi#|#/B\ fFw(xi:#/B\ ]3G =H(y׌28Q%x u!G 8^00ACΥ3G =H(y;̎pvKH(y;̎p`a sݩjKLys28¹|IJH `+,Ӭ^q#Аe|ĵy04LgyŽ !.{0P&ja(y28Qc PPDfw(H%xU$t#)E$x#)]22 L28Q‘K H`gyŽB\PPDw(H%xU$13G G.{ƐPG28QhKJpls2tK$_q)Y2GH1Oע3u%q#М̼3dpKꉖ.9-=]y֞]s`1q{ W@\q#НI4%}\H2^bg= .u^}ďC41Y y)Fd((x1ojXZ 013䱭ܰ<4e@WyTn<+<;2LG j .uĮ5xJĮFG0Pja<`dgyŽRaH(y23;̎p=蠡Ιdp+FP=8(y3w(K s3$3G %x L#.%z((y1G 8Rde sݵ*(w&3IY$H1M,AHu3L28Q8Lt4t#/B\3V\>3HgyŽRBaTG 8S$ ̌28Q™$%xU#3G d=H(x;̎p`a s43G GaxACI 28Q%x 2JgyŽ !.{ó{-܆X 203 pSr bey7 pSr b3/3ҙdppx #03V|g 3G 0$Fbf|g gyŽSBa`z:0p1$FdfT43G ? s4gyŽ^~i x#.%z((HC;̎p䐗=蠡#L28Q7B\ TiyGL y),]}n$zyf $q#Ga2,s:83/<`nCa,233/gyŽa.{h7]D+r땯!MA :7= K2,RK:4^I&yH$J:䰮Xw6):#Q4TKCn$0F G J>ܰ$0uĆ84pגIxt\a >`g:GaD$}+H1F q#$z/<$}+b8㩡ZŲ\RqHz .uS#q#HGX \t= KW@*gy+ `zBG|PP1Gz((Hw(u!.{¨(HG 8S% !3;̎pK sABC'L28Q™,%xU 3G d=T$2HgyŽa.{¨(Hd#)\PP#)\PP1G 8S$ABC#5e8(HdG 8^zABC##;̎p`a sފ(\r,TABTh˟IH1Q Qf? V._PiQb" Hf\XҙFW-XPrONtj" Lf\cI" 13J''+$(J4xPŽ˒(\r,TABWQ;C D%u4i5ED%u4 #/•N1=t3SODRJA*7\FG._To8= DvI`J+g%V. @Iu439*4::d%Fb>GVITodn$zi% :dz"`{, Q8\H3Xw,g= Ez qq#DGt,;L\H7= DwBùb]s$0yďC=GBù`tďq#DQаX@\]LG'XW]q*WH3'+8n$z舂zl% yďC=UTi0JďC=PCa, Qp3z"9t Qq27H3,d+L>0 `f|g ]LgyŽSBaP5eλ+dp䐘x dgyŽ^~i ^FgyŽ^~i ^t#.%x G 8]yK #.B\PPw(ti ^03G a.{ƐPw(x,%x bgyŽ\ +ϙdpЗ=H(JG 8]yK FgyŽB\*GL28Q%x x#.%xU R$3G =5,Hw%@미ďC,d_q#$zkVIg= WLuuG\IW\X]LQz%e[WqLqiyclVw9 ^yďGiYPx{ /]<Jr%E%I*ېuu*T8W/XXw* uu*T\H3JvbRDоhuJ3jXw* uu)ϸNв)Q,Kc_qԦ NKz(!qԦO8XgXl._$NBuJ$zo)+}sGW\s,::1g= (_4KS>k/XXw* uu)H+XzՑJJb`H+bJ]}LFIu$>Io!DvI`utH3J|Xu02FďCBùWQI8VNa4idio$ R$q$ϸ(KvtSK=frY/]}S#2LGRe]D/]\XuLϸa%H`fBT28QHL2LL՗;*W՗;*S#5e((J`Ys :f|e L3V\>2 ՗;)S5e((J``f|e L.vABS5e((J`a%023V\>2.vABTΙ.vABT.vABT ՗;*dj˝PP1a%LYs 13V\>F|Ig*g}r%2q5狨2/2K((JbYs 3V\>1&d|e LSx .vABS՗;)a%}a%}5i((Jj%PPj˝0Pja%|Ys Ys bf|e _|Ys df|e L.v )w(P'PP;̎p(^J¨(Jd#  %3G"<*Fw(P'PP1G 8A/%IT%213G"<*OdpBTABS##;̎p(^J¨(0F#  gyŽE RxU3G P=GRIfC9~#\FGtSDM SA`.1q+:ZY0F󉒸dp((0Ft`'r‰70F`g;r|.#qw9W@\b㩜u41/VyhAA 28Qy*O Ԧw(P'PP`遝G 8A/%IT:#  13G"<*_3G"<*L28Qy*O fw(P'PP`w(P'PP`w(P'PP`C;̎p(^J¨(0y)G 8A/%IT<`gyŽE Rx Lf| 13V>23<`c((0xZT #3V4>2.vAAG՗;"C5eT$JgyŽB\PP`#/AAC1s< >fԐD$23V\H| 3V\H|c ]3 ?P`5eλ`*C5f0 3Vcΰ=* )se S.vAS5f0 fAS#5f0 1 5f L!2c.vAAj˝PP``df| #3V|e 3V\>1I`2C5f0 %3V\>2j˝PP`1a&13V\>Q 3V|e ՗; G 8]0#*L28Q%xԃu$Ĺ|ıtS; 2*dSK:ɣ%#xYAÕ(/X.VDQ+<]Q@HNe}-wLxh|tw, |9:K,K`.w+%;=r%#v%B_1'|(%g( Mlc^I&Ub|WI&νiP6$@;LM^I&3ξ2WILe3\xwҝĺZIsE۩SyJ狤bKDBsĺS Hf;Xxb|'`8KD0.wQȵd@ "Yԩ|-z׭Y%+vK4O-Y=0u#h!/>ܰ01𦃶bN84\Ib#Y@|dcȃp:+P0FonP%pD _`9 `SAp:\I`Htn9yXtY6ׇ2 s_$<]DJh!/@\a̷u+DaD@\/]@s) ;aU4k2U"ӯZK, T}-%"a4 ҝ ʺZK D KDsE̼ۨu$ı,KSDZK @;!r |da/@v¥ V^u!$Y灁e(u,.6[s;:+Ť8 (.(0KQ+!T> ҐB_1}s``cR/:}-wD>/\tHXhxאeYB_1 ez `\ e,_$ l"KA |jgW\s,;EwyFuu2sEۮrùx¥B_1%w;XsIKA |b|b; yz .wˆVx8;u/Bs$&+ ̴,WOEl.wh:Y(מ.|(Z&]̲fYx} "Y/ 5땬9/(yH…Ґ/U'(nIO`.wˆVx8;Jo 5땬9U# :GGqy``ca\Y"=y``cx}܃,K,>K*Փ(uD;M ؗ/Y.we|ĵy0<_)SØAl>a;vr/|g9x!,M3Jwóf|uyf 4>{"`{,>er5ggGz/] uHhwu9H!Dp;%,PZK DH }-%; "Y"T~wZK) ֯9!^;9D\ HEHpCb@ LeNj,h!/sOr 'e;DQ+<]Q@JW,;aDXv$vJaW@\'b I4c/ b sÅc/E:^I&sÅc/ @:R]7\| xt@ +_<'S $h&2(.(&1i?CWK5}-lc%;>Q"]-0.wo=tlh\X8Xawu}s`.w…;{* Nw, ^(.(7ZK,S.b|'\Ib]s``c+0<)KD |bZ"Y$S=E9h!DtqEv/9+t.ܰλ%0HbuLJq.Xw< s׌|+:gYuwY`k`WKA |\XUyY=0.wK'Sy2D$1M)Oh wy=c/ "Y#Xs-%]7\|CP=;%u7*wz&XNxpZ Hd34S.=34KE!$z&trR!_E=E9hCö$20z&c>EGyLMh;&;Ա"lksÉs)sP$;#jF^EC'fljoTLqDtqEv"o2б\+(k4;.wʦyUB_1 XxZ˝5,E㩡ZŲ\RqHz .uS#q#HGX \t= KW@"7y+( qk 3H!G 8]27[,Lg;ws\H1.yh<㩡yh;.%}SCV4 LS#Q,(tFs+\b7M Gst.:SCj疈 q#$z|}wyh+sSBSC9L㩡 Q= Gs{D+]j󘤖xX…@n!Dw).#q#ĺrbGH1+LďCԐ$1p3)8ϸbZ{s:(מ.\t= LIs[wH(J`f/`*c5iL! dpLЮܰ$L<= ҭ L$z-:㩒ďCA :㩒}ďBwz#:Ln$z}8mL@nws\H+g:Trun$zl% 7LtD‰0L7= Q\H#, LďCWH&q#ĭm`.H>㩡ZŲ\RqHz .uS#q#HGX \t= KW@ǞJG`zBgL#&JgyŽL.{:K4 yr8 q%O-\bGu41O-w=įhbVjf2W%qDw9 &3s+\b7M Gst.:SCj疈 q#$z|}wyhй|.#qĺ#gS8hb;ac'`gyŽ#K$K\<s1m Q5狨sP)9cxgcŷplpt[)H4Ks$yďBZ\LďC:X p3j&qןq#ƽl.:j l%2yďBtl<ďBi. q$zY2s<$z| dp4/$(HG 8RBO)Fw(I < 3G h^I0P;̎p < gyŽ^I0P!G 8_S Rdp,/$(J`gyŽ`*c;̎p < dp^I0P;̎pBO)Fw(vyL#3G /$(0t#.O)28Q/$(0HgyŽ`)G 8L!y'AG 8L!y'1G 8]K < L28Q/$(0|#)y'AG 8RO)28Q/$(LG 8L!y'Bg28Qc < $3G /$(L#)y'Bc;̎p #)^Sdp) < LgyŽp0(|#(Ha0Pw(G C)̌28QŽSH28QŽSNdp) < 3G 8RyL$3G 8RyL%3G 8RyLdp) < dp) < L28QŽSOdp) < 28QŽ3Q3G 8Rx FG 8QpP728QŽ3Q3G 8Rx F#(Ha8(uG 8QpP4w(G CCL28QŽ3QgyŽp0:#(Ha8(ufw(G CCgyŽp0:w(G CC3G 8Rx u)G 8QpPw(G CC3G 8Rx t#(Ha8(u28QŽ3]23G 8Rx yG 8QpPΙdp) 1R%3V)P< 3ɖPCx!Te7aywm5[)GJplA^S0x!T˗om5[)T~6RxHC]4am5[)W|)P< x+)P< ^uvqyUIe*l/5-e;;J˔DzE= ̱l0aKm5[)S+RxEz(!8jSp@86=%. %u<[y VwvԨDzDa^&Ige(XtCŷplpi_Jpl{$Gk&|̼Sҭ x)DzDviD<[y Vwv`ѩP< dzsb̫cmXtCŷplpfTc"\X!DqOxmXtCŷplpfybH|9+ʺo28Y$^"IUmFuy1et|n0Lr|f._$:f [jTD>f [R t@nS0Lr|xS0Lr|fZh3-¥$@n30Lr|,,= 7t# &b\I`7t0Lr|i5b#23-0;%ΙdseE5Y4,h y0Lr|)]$`&G9l>bвw%3-NnS0Lr|+X4GghYϤ3-«5pd#2 Dvxd&G9l>13.HQPS2' M D GƣFC<ĥDC @pA4A57ؔ|(q&7y%*"z R @74# FgyŽa.{pPbG 8]0AG 8]0˔}-% 71xt/. R8ďBrbď8`8oE@b`၃:𮖂,JG9ZW\X S8b3#rõ;x3#I56\뎘g= rE41Y+J9"Z(ZqT,;&}n$zm "eĶ8 לH3"a #!IR`8c%ӬY.uGHYDቃH+VODKĺZK OG L q#ЭY=/W x0p$z[Aķ `}3)Lab㕲Ĺ|9 .Jdce #ئ9 S>`̡ 3G yL$3G a蠡iL28Q7B\Q3G I sHe@n39F)O%iF= ҸO8OC4oB.uS$}+zsDθdq#Ca,θd_q#НވΠ.uS%}ACFaNjoŃŷx ̒Α]VGs#q#ƶκrbGH31tN=\LďBU\IH2#y= kOW0o8dn$z%]s:dI22q璸dnj8Us<$z&U@\FGe@4$0yďB9Qs$}+9Q=,\s\JgFfyf $θT\H2#\y)g= > #C320Q-^#Q23.KT:w(t*]HgyŽL!.{¨(uԦw(t*]03G =T:c;̎pa sACdpK u;̎pa sACdpK y;̎pa s4^HgyŽ !.{ƐPL28Q%x x#/B\ דdpK:G 8^00AC>gyŽ !.{ƐPFw(x*R#3G SK 4 nGLt,Q8ďC,dfN$yďCz#:fN&JGXu3Ium]1q璸9ko<:$0y^~JadWѸ$@LyN/<$p"gM 爂H 8b`󎦆Ih:.pX 8bM gG3z'#/qМO@\ѣqЫ>gM d#ySC<._rGJs.H钸hcZ^uF? hyFyM%Vt:Gu"gFG+Xry4:W:WFGW\s,`qi_zkO&^Lϣqi_UkKdyW@ϸ S84PdǑ~2|8ZC#%1ySBx`,< `u"70J$},0 H#/%ACdpK'bk7u!%muԉFң9Q4yW\xws%FdďBAՒ@\]y= ko<8H0 HtC Ԇ&w(Jc s݊ H= uH1M,AHFdGH1Oע3Fdd$z;]FgygOrGy+3\ǒq"8gyV,^]HGҸJu+? k.!K4:郉qןCBtyϸM4 WDr:3FG6Ђ=]uCHK >2RHPPTfw(t*RgyŽL!.{ƐPW28Q%x J#&0=8(u*S;̎p\Ԧw(1 7u*c9㩡ZŲ\RqHz .uS#q#HGX \t= KW@<ďCn= `n=8(t1G 8]vC&ja:`G 8]I ACFj˝vCdppxU13G P=GRIfϙdp:7= KZ'ď8hbZ{q_qĭbղ\LS#ACNH9aDbw;r \F㩡sS8hb^\s$yďCLNhDg;E<._qu41.s.1q:@鋮$yďC4&JGPPC1Ӧ/xE1I,̱ sMܧpďCq#ĮH0Jd$zN&q#<@Gy= SA`.uS#q#@\뎙y$* #3Mϙ%^Z%kns<H+իZD‰tn$z|fxz㘨13.u'W9||*LgyŽ$wKvxIMϘΕiJM=2>f:y!j˝PPDj˝PPDc$<5e((y#c;((y#5e((y"31x y1 2tt<^V+]-su]s`1qb,$ySB\Gt@8+b:&q#ЬW ::;Gs:b$-Y=:d뎙%q#ЬWQg= qOE<ϾGX)%q#H+ı|t-䉜H`byh䏸$z!^Τ^sQ$zX%x q*WH+IJY_4:WѸV+{ @.u^q#ЬWf|\ RV+5Vb\)H+ĺS u'#}ďB\TKI\L±\WIʺL+? qI2W@W&qV+b%=$&LX%ήX2q1&K q,8!,:D$z^pCY.uϸV+aw.uѣq#ЬW=\돤yďB\Kd/a<θd$z\_s>dďB\G#xw^t@Z qe`tď8f]sFN&JGǐ9zeC#f]qy:dbGH3.%!鑓a Fצ]n7 C2/XF2M >B,=r%'y,ˢ; -Y=:dn$zDLHe@\\u43. .yѸ3.ZۜI\}e@4&p40U#JgyŽatNtj" F`f\c'/(yc7xWGW9HTACL˝Gj";GJB_1q#\H3QȲxXw,JgM E4]D#LT8hf%kns<RG+a8n$zb铮:j"9q @.%JGXZ21p3j"dopDG$)Q,:'q#DK$[,2LSBrTs,]@ndsƒpbtpb-d>tp 2FgyŽLt/.#Q:f\.I4TACOd.I4$3,^I&'FG¨(x)G 8L!t/PP񑁝G 8L!t/"X #Jf\aH(H#.B_ "XSED$FqPPC;̎p‘Du (HsABDndp$)t:4WI=Dn^~^I&u4 q'L 8^~|rrh$@n7= ]-^f+#2q'^q#((Hc$u5f0D$u!Q#L՗;`#jaD$u1s :bf#$u5eP#5n%PPfj˝0PLդ0P՘((HC5e((H񁚲a$y1G 8]0ABGL28Q=*X\I` wˆVx8;u2? ^i5pϙxXs--_Ĺ|ܰ>1E'̼Fy!|Fyz .w17b30:,#<:xYD,!l0h%/$@? Y'ܴ/XIO` BםP>EۦOCE/ #Zy=S$;tf)u@beX֜BqOs#>"IUmFuyx LfԐSdp O#:Qx{Įk #3xƐP;̎p.{dzy$#xwQa9ʺFx%w;XDn>x&gu(H`f| &3G a0$13V\>S 3G yL%FgyŽ^0P5e0P;̎pa BTw(uL< dpK(JG 8]A3;̎pI sAAw(uK 3G T0=ꎯ H28ssJ5=:Ks#q#ІWQ7<ჯBc `+y,! 8gH`Xa.v)w(u4&Sdp԰x ՗;23;̎pg 3G a.{0P5eLe(L̹/`1|)`{,TABg˝G8(LdgyŽRB\'_I4(u4lxn? ]-!3)/ELd㩜uסER=Pb̹~3|d(1Jfb0Pb`f2H|c)Eλ(113V$>1՗;`Lզ~C ՘PPS5eλj˝I3ԫ H2عr‰`c(\BeJ|e<Vʺ|'%g(h<[(y ul\+%kns<5[* (.(&FDcgl/AsGfJAعD2P[ &$-tJv5\AQ$z&aD01CɥWPmz ,(Vi,Le]A:6.wxVx8;0M\kO'Y:xdiYh8Y$g|c428Q40=8(HG 8S%BDw(Lg dpK$03G =8(0HgyŽ!.{pP`G 8S$)L28Qc s3fw(Lg L28Q™,%x whjKC9^F\.>7= sĺrď8`8V++$Ksq#ЬWCPP`G 8^0K sAAG 8^0K s3Ιdp2XK&HgyŽB\pi:%1>uKg\FeIJH p*W= (%kns<Σp3uKx q27H3XEd&JQ&zX%qI0y3XXL|(!\<Ch6Ť8 _3ؔ|(q&G#px=JA7hqjo)Q576PMn> M@JTD> M DniG!3G =8(1HgyŽL!.{pPbG 8S%A3;̎pa sݗ)QZK @nt/.>7= c'<M7 qןt@d%pW= Zrb)8`8W,;]s`1y^0LἒMA :&O8ne#WyN׮YB;@bLqןV^x"M#}#V^x"]-wgL#tr&.$un<Oh&JtDk1}ĉFG<]=8[,L%b .uĆ.G<]=8[,TM,Ks$1JďCJTD. LGCdpKЕ /X Hg;~9"]s`Hn<d:T$zr%]s`H)0y1ƶR `H2LH5e[0$H㩝LH8]6,^\yԉuH8K4'U@ǞL^~rK<θThH1ܐ%1qq#$K+\y*d$zu:L8c#S0y= rD|IJH qH1DK,K$xF1Óg%%@\S%FGHz"]-%"Y$81<*8c#'RDKbK$ďC]teg= rE41Y+J9"Z(ZqT,;&}n$zm "eĶ8 לH3"a #!pp$KYD\)_}ďCN`LVt@ϸb``jz<8]-7 LJGHKz(!p3y,3\rX/X!]\1L= s,dw[0>)F¨ZqG 13.KT>G 8]yK>dgyŽL!.{¨(2FgyŽ^~*'L28Q\Aw(1Ac;̎pK s݀JplZK @ndbg:dY$ďC,db2]ttg#/&ƐPw(x:c;̎p䐗=蠡׌ 28Q7B\f:uP<[yS$39x+#WIz/s$yďBAi/]s&JGPPΙyמ3G %,\r2]23:mw]Lg:GSJrtGw9YθďC:q#DǑ:X q2W= Vws&q#ʶSt^}ďC u:{ W@\뎙4L L28Q\ʕr%0J%@H1M,AH1q#$zk+u 84B:`:#АnX02qS#qi_r%d>bWJG\Ib:.%x3,Ӭ^\J︑aPPg28Q.BTIvK4!:W/XLH7(h^x q#$zvK4R^gLǒ$Jb8a:)3_03G Ba(uc|ebf|gG 8]vACdpK:dG 8]0pPw(I sACI 28Q™,%xU%3G =8(t1G 8]0PP4fj˝0P4c$n7HL(q(Qs$yďCq2W= G]#F$$zuu41+XX 8T:/Y$θdn$z])GH0QމwLg;E<._qu41.s.1q:@$yďC4&JGPP&cMwW$2/w|t;b]s`1q#$zΣq2W= GR@2LGyhL\uH1O-w=LďCkQs:d& $y+%\x3[wH(yfo:e(yL՘((ycL<񁚲aί4TAC&3.0{Įk xxU1f(3VTp JYs J`f| J[Q((y) J Jdf|,TAA&@F=鏌LNG((x5iL!<`Ys 003V\>1I5e((x5e((xYs LYs LG 8]0f^ACɞ3G \+bgl hvt=LL|']-Iz.ONZ"] (.(12CLuλh;Y%%B_1&0{w]"/D^I&yay-i]DWIx9Q[J$K<0@މt(<8]-rΣt($K<rΣt($K<0@h!/ D=lgM*"]-%"ayy4Ү+$S.dp#ЦūDf\? \s) ^3V\>S&w(Ha o^tz%]D)yKw,ďBu֬= WI!\LďBuWus&q#НEy$%'_qןq#(1|Y>S&Fw(t1љ11`L28Q) HgyŽ_7Cw(H)g3G W.{0PLa(};̎p)b=PdsSOdpL^I&(2Hfd]h ̒Ζx$@dn$z} ̌ u2V4O8$Ь`AKh dďC"XED&3.`#)!2M3Ȗ.QFFe>3Q3G &F^33^HgyŽR›pPL28Q’g#.7PP&w(He s3^23G  H#) .{PPGL՗;PPDw(}$%x H`f|e13 :ԏHc((u*35iL!:1sD:5nv(R3VWa:)|e03VbcԦ&j˝0PS#2T2LJe(t1S(L.u|etAC&cRyD:`RCP遑RCPdfj˝I`Ι :;̎p%x^s-,]-^I&\➉Xع/I4 %"`o $Dtu%MIYJc1X̼e=D‰.w2ZC\X%)Ml\RAMh:Įk`2M+yKRı4WI |S4K@( I4a^I&L|ps-,`AK^I&\➉Xع E=D 1|DSEy$1(.(tqz&I4s1Lc$@>Eۯ;I) Xb|(%g(^IJbMl\MyĹ|ndf`j%]D8 1t#DȖO4&G9l>6X4SQ)KҙdsJ$RdsbSfL29atHv{t-猌29ajIz/1ܫH H#DtGghYɌ 29a򓳃pb`f [k&m 7y`UyFw 29a, 4GghYF&` t̹Ԟ1Q3.uCϙdpИxUdpK&KP2xTxu+#P)D.adu4$13HgXrYyA`+eyL%x#&w"#ŒEDRj(%qrvHM dW]$Dfb$1q+:֯ȎEuE41Y J\~֯Ȗ!@/8+, ^qn%~|(<? YA#Œ@+%2L? YA)ΗB .uǓ<ďC*PCY\\y1g= YA*DH qϾ,AH8c$:8akbu (!D%13J¨(JG 8]x*%z* )r_ ;̎p=TP SyLdp(L<*љdpЗ=T>G 8^0M sACdpЗ=T>#/B\PPS;̎p%xUdpЗ=(}1a>dgyŽ”ƐP4w(x:G 8]FHKdpo$"&YDtwJA`22qd+w,F<= ҭ L$z-:㩒ďCA :㩒}ďBwz#:Ln$z}8mL@ndw^;.un$z^\q#Аeu@\뉒a(2LgyŽa.KC&XxtF&skOW.ܰďB.uď8N#%q#z/IH*䀹y= ,d3Fd&<[y VwsG*N\X \FGX q#$z-:d$z\IH+V. @d뎼5`1qH+V. PCa,θ$zdh \y$zHu\&q#,AH qq#p<[yLq)dp:7= koGi>㩑Wtθ$z&ǞJG^0LGW$θ︑c1]tY>1]xY>Q[a:S5f0D:c5eΤ±@tD`4c(u3'|e tYX| yG 8L1:c>3" dQ*_*(֞ODDrD:񁛯%򕋨HTAC&3.wV.Qbf\¨(u28Q.ƈ<]7u#9ңzkbaܫ(ד8ďB|"褕mp:g(ѯ;;^* Ԉx¨(u#w(I &<]ԏXם.YXtGkF,Ai .y~8 8gM SR,rG<㩡ew,2zՑ.yį3X^B]s&qgayԎ+0YDT.iED:!+(֞OA 7u"S9%KhI$q1bgyŽ$wPPcK㥊;<[B$ӦΕiJM=PPj˝PP񉑘)2]3V\>2^3uuQ&Jf\#ūKPg˟IH1Q&Hfg* 28Qe R+ t`BX#qB\u3Zۜs$yďCq.(w#329RqE<Rq#$z#aARq2W= yV p3D|\uH3+ԏ$LďCDl"Z/ԩ\t= d%@+c^yAw<JIH+,W'z(Xw,8d&K >;dDsz 7yqOEf#pfyf $#}#'H0ZhS 7xt+KDgW\s,8aX4Ko=]q̰:dd&K q,a=&MΣqןq#ЬW D‰yn:bWktLq#ЬV=j<GX%qz'FďB\KOs>= q,L:钸V+r/|θg= q\ID:ϸV+0e'ԩ\2LďB\K+;Xu<+FO8V+uJ_2qo%qЬW,dL84~)#t3J±\R ug= qM,AH01qoGX+P(\뎺7= q,rL뎺`bb\뎺W= W/uS8c:L^Jb:>ďB\GghYy$xLR:bLJďB\T]t-'HbďB\W(u*7H+yM)^qԩQV+0XLJGX)%d:+#u3b+\]Lqi_q#5DZ+\y^qЬW <3$z^Z%qѸV+cŲ道%HAC/1w j˝vACcL +M`wI42qb$^I&ԦN$yďB]]-wLLďB]X:g= wt@Gy= wj&K=:``㩑V+SQ/8$z9_2q璸hV+SJ5@\ǒqЬWx̰b 8gM w9N<&K wm񄗢X2q!&K >_32L3:`c^Eri8#u43xydLw9L8Wc VOD>GH31y\H34瀹 8a7u2S9ze5j.un$zD=θ= ˢ`u3&JGǐ!2e!道H3.802q#$zDhxYu3&JGˠ7u1L%\H7 C2/XLn&!MyĹ|ndfse0}n$zDS:GH3.&J㩡tGws>tJx0L3.S8d$T:1G 8]fy9(u1qNtj ϙ¸ #Y$TACf\cHZqdQ̹ hY$TACoEdp]1{#!DǑ3f0XZ]Dn$z +_VFCד8= iKI)\H+O"XIObG]$M,d#P:S#q#ЮH2 MP:Lq#ЮHK4S8\H+%/Z'r2q$zI-Ķr2qq#ЮHx!@c'<ďBI"^pCY[9 S8= $e Q4Gsu1JG]$b&l(LdWS8WI$KeOJ= $rsc'ďBI"=;Y@,<#c' yďBI"=;Y@,<%p:\H+%/Z'INq#ЮH^F-c'#}ďBI"^%x{LddH+#ӵbhLdcH+%;A;1FďBI"XP c(%u1)8WI$K3= 'r2p3$zI`;A[9 S84n$zI`;A;}#$zI`;A[9 S8d$zI^yf $%2q$M >4gyŽRBc/ .#W9L* 䎙;tk-% E=x(y"C7;k-% E%$Jg;z'FGV3\ď8hf3ɧXtRJƒ 8M >Q;`SؖS?kW@\Fd@CaxObZ2<䩼 JYs((y)|ul"^ HXvl-_wfx)֯q)֯ďCaö ejPTo%{ ՗:>2Lf:yAC%3tHv{t-猌G&!D|dsy<$H7= >:~%@\H+i]>GH0c]3<}u倹+H1-_%@Tn#q2Xa<#(.w$|Z2$yn$zZ2$J7%IQ-_8ďB|dJ{D$1q _)/EXz&<;uU ELlD%IqµdJx q2W= ,dN&q#ĵ|d;>dR-d&03>+9EDvxS9H(y#;̎pe fxu (xs4X+$Q:f?]h 2xty$q $w(0ACIL28Qa *3G 2$F#&0M8(x#)!Hh #xljL22q'Lh#F7yOEy$#un:㕋Ey$tc^I&"7F? >23GqK=qH0$WSWDpFtWWFϾHJϾďC*KDWJxלH0U gyŽB\"3#5f&0 :隴D$u5eλABGR.u|c JfABGL ՗;#՗;#&jLa :G 8]07 #Fw(uЗ=Vx/# ul\Dm``\K&>/\XbX+$<Py"]s`}NJDtz"]s`} #:2Kw,7(h.V3UDS20>'KU@.ܱ-tA1-XXKLKx],xW؎e|/Xb|(9XAtKw, |*ayr%u偁^y\IbY$ M1.ܱ-tA1-XX:K`sʶXz&Xɼbtz%]D>2\IbY$N|ĺrk,,^x^?DgR@u1Lq(eܑ/<Dl>SDrvA@ 7G{%۩x[h8Y$۩ |(!#Fa#;u*? "75xѼ۩RxYh8Y$DoD: :e2 /X 5RxNV.V!@t@R?0P#&PʔўOB󸇋oP< ʺu!H TekeD<[y Vwv*ezղBTA#S L28Q/$*լ[,Cŷplpi |,Rx+ZŲ< G.Rx+|,;!8jS>P< vJz:)9RJh3#3.0(x#.`;̎pa CFw(t)dpИxRy抈(H`f\aIZC(H!!G 8]I s<|d $|wSOxʺ#qgJvi}Iz/CL㮽 >BTfw(2¨(J#.I s=|d $.x Ҙ4Ӟ.lH`7s+Ť8&qs0P%L㩜}#0P;̎pg3&ihMSWay J}ďC!YXt}n:׮>dSC;̎pK s3w(x*w(xls0M5 _$$qy+X 8gM WD@`pp8kw, 00yǒjsW Lqi_M<+ ΔFu$#qN :>adp(K<8PYs}y+: .H7M b$q: 8M vJy+]s`01q2WJ}$G4s#90zy:h '^sÉ>ᓯ8XayD&Ff\0P1sS:X ˝G袈j)(L`f\?ξ2WED&Lf0P5i(1Ff|g) 28Qda sO4qM+8b|c5 O<0,b|,uK*&ع|+ubh w'b|ED:, ej1Q4pλLGklD ^I&#D4mGqOs'O4s0ZC;0M)s/O4gRM!0w*- ~UA*xGA* p+{Jph%^+4GCS《U8JCVU٢:hXEA*# %^]HA*d~8d&oɄVUWEɅ/ WXLU,A*V W"* Wz [ W《U#D yJ, yI* WAb W,A*[%^R."x̣%^3o%^3K《U5>,A*yD《U27 Jf `bG* WD xV WT }XUQg J*£D xTuD EA* A*L xT+xJiJhߎ1Ɖp%^46Ab W$ WpPJh%z Ƃ Jh,x"z #L<#LpPJ+%^J WpPJ#BǢ JD |pPJ+K%^X xX_hľ,A*O J,4GCcD x%^6@EA*%^&|.6d |&A*;4GCxy y`^8%^XLUi:+4)JhϽXUlhUb?* W~t>ol Jm W"2:lHB* W¯XJn Jno}XJn>^J0 : <x` J07>U 3#F@ U〫 #ÞXJp Jpy`A* WzGC'%^X~t>XY}a2 W`A*,%^X>:,%z A*U WSa2 WMx WAzGC2 W #U|}|B* Wi7-o J/-<yh/j-/E,%^ya2 W#_,%^>U؎DH%^|1e Wd%>U W؎DoD%^: ?,&A* W XJA9#gTXJK}<{Jq7.o J/.<yp/$t>\F@ U #,%^^Y%^^/ WB* W/ |2AJx*S#p% {7CtxN|ph%^ W@(Aag0 y?`A*|UU$%^#|3 {|r>A*$~9J~9J3[P5BӉ?#_N)~ }@6A*YGC x$A*|5?~aJH|~t>?Dt> ?҂U(%^ ?$t> OI |Ok.#x9 |3(%^pDt?4|gRpSŰ_pYWfXSRՁl`m,)C->r )C +”>r?b` >”>t!J:A X$d(%^ "x+OJؠ5A*o$Z_b:Z-y`#A*o, JoAX zؠؠׂ/Dt> Jx}}x候׋X Jؠ >Y W(A*Xb, Jؠ`}#X`E《U97ٲ:y= Wu《UQJ`.6GC`GCd(%_9o Jw͑t?:, |yd(%_8<J !J*AJ q ?@}JAJ `5 ”>xb: d y`y }Dt>A莇" H%^B/|`y{ W?tGC}RG_bХ?g>z(|(|~B>zɂ>Co>JB?-,U74#Z*A*Z=Ab W^X4A*Z} W_`@GCXh%^| Q y>,A*%^|$tU׎+A*\Oo, x.S W H%^ D>D{(| B>D? | }? P) >͑#J|`(%_HH%^0Jc7:b%^FJ呠{C WR W8% y"xUP3:"٢:@&H%^6Ab W# WxtUc:@=Ab W2 W0 z }}Rd@=XU J>}|>E WWx|)yd%^ W0Dt> 0 J >0 x8# >Dt>hU %^k}XUO JtUc:1[064GCbT#c:#~8% y;4GCjʈ|%^Fc:? H%^ BDt> F,A*b J8%^ hJX W1<O%^GH>t>pGCc:AGAwCWXU = W(' W(|EJQ8#E8% { %^%^dɅ%^t>S%J W'X4A*<`:A*%^ ~X4A*}8#oH%^ ya2 W J@hU WAb Wy`CDo,qED zDA|`:A* }|MpJA* =)$ $JAb WHD&0 x >t>Nx\+x'Ab WQ J(t>BW H%^B Jo, xQ W!OJA X4A*@+xUX4A*ny%^ UܕW J0 x8}XUP WSǢ J X4A* F0 x !%^! ^0 x'z !S%^H t>HK W(Ab WX4A*@ W ^,A*@D$QxtUD y% JH"? J&y` m8# xtU?xߌE19< x PJQ}#Q"A*P8(Kd% ^,A*PD% 0 x06D~,A*%^"tU 9)xU , xY Wt>"aHZ|U(Q`ah1DU x 8`pGC1 (%^#0%a+PJJ|pIA* pIA* :%4?%4L%i8#rxUF"_ J^X4A*r,tU t>+Dt>pJD x X4A*%^#y`p&xtU8}|GoXBA* t>ވ,A*gD[8#t ѷ J*@ |Odt>"A*U}@ J,%^wsA* A* ,H|Ho%^$|HaLā%^$X4A* Kā?+A* [ xxU"U"pGC"A*`##z!Dt>!pGC"*c%^!pGC".c%^CfGC$%^AH{ x }|"7+A*%xJWpGC$(xU'U&YJ WPJU&#A*&PJI_cb:DD"x>t>$܎đO%^WPk x %JPA*W8#[ x 8@y8#pPJ,qTA*c:W<PpGC*A*c:U`GC*H%^pGC**xU,5h%^Y7٢:`%^X4A*Z,qY8U,"|z WD8% xt>%8t>%2B* W@8#(>t>% ~X WBߖ8U.0 yc%^\A*c:sO,q\A*]6#=B* W\>Tp" X W x ~t>>X W 9 x c:>X W* I x 0J`J)` |JoVUDt>%^/%^[c: xQ x}|K-JKc:<?ĵ^X WdgX Wdo,qIJGaİ)xUXJ W^8$x 8$x Y WХJ W_aP?PJc:d~8% x;&xUh8#4L)6<c))?JUx x x |'A*<GA*<cA*_8UG8U℞8% xIA*g x#xX W$z Wo8U@(xJ,q&~X W򯰦GCkR W׎ H%^`EDt>b?,q5>X Wl,qUDt>`U8UAJ ^X WWA*} PAeaJ aJ EZGC ~ˈ| ?et>8% x')츎J J qq_ H%^* ~XLUJ UJ.ULoR W;et>8% xts:pqŠ W8p^UN*tUU\GCg (%^*\GC,P츎P-#TR(A\%^`W=Qx ,A*(hURO WJ?,%^)p%^#%^4z DGH%^"w (%^-#{J!7٢:B* W!J! ^8B=iH|W:)8% x*)ŀC%^b J ſJ WiR WbW H%^UO„d xF|pJA*KxG,xG7%^0 xG xGpJA*2Ud(xU, x+xtU"o: _ H%^e,A*3o%^i|`:A*3}#3:Ab W J J Ŀ,qUJ &-#t*-#t J]]: W|p%^.6A*t?Ab W7 J]`:A*tPAb W J]`:A*t]Ab WG J F0 x){R W8% x ՗ J DJ DJ E?D x>X4A*5|`:A*6(db (%^XUloDcJ ވ,A*6|hUl$xtUl'xق Wak%^H%^o (%^. J ͼ`:A*7at, x0 xXUn%y`PSAb WDqw%ya2 WNUJ Wd" (%]< v&GJ Wba' J ^8% v&X4A*~0 v :PRD v W`H%]+PPDP Wa츎ЧA*4sCPJ x]: Wa?,&A*4pJA*4=XUh)`Z"J",Ab WdO`%>0 vDȈ8$vD dh%] ~8% vD)Uȉ~X4A*tU+,JWi`S)X,y0)b58% v J;װ3){S(#^QookPF3%]O%]gAib0H{ Jч،GCz A*C`:[i`䎇4@4U v:t W`:fDt=i_`fGC>J3#E/DH%] v5{  v`#6,@4Um3#6Oi;t=iGCl{i:` Wa9:a# Wa$ >J { DH%]}Dt=oDH%]⯰GC.o W`7F#~J JEZGC.<^5JY W`@v+MZGCخGCج{TbwpJA*7| v>8$vX JxJw+A* 8Ñwxx])>,A*$, vqJ8FAb Wg, vpTpJ ~8ώ=x_ J~0 v/e d%]'<`:A* ~,A* ^X4A* >0 vGa2 WdhXUo J#O WgDD vtN WgE_J:.ya2 WgXUᷖ J< ̼hUC}XU#/, vHJA'%] X4A*VAsA*;-#r:DJ%pIA*aU%]8% v0pJA*`%UɊ|hU30 vL J&``Ɏ vL xU0Ʌ, v1`:A*bQ-`?J~X J%Ӡv1g6A*b) D$J>OύhU<`:A*X J>uJ WgX J?et=xU@%%]PJX%]? v8$vAA* pIA* W`@%]# J+ W`@(xAA*O,bUvSJ Wa~8PJ%%, Waة%]:WG# t=z!8$vQG (%]<O$~XLU47dԠv t%]AwkxʐJ %]H%]<.%]XUxH Wa WaJ Wat%]X! v4a儤Ƃ_ (%]RJD v Uy`kGH%]QԠv xU6:TU6pIA*J8$v$PJ)xUK'A*W H%]xUHR We e"G J)hUH《UHnQn, W`VdmR W`DxUpIA*^8$vBO H%]IpJA*jxUGAb WcQ3%]E?JQz %]H%]X%]? v ^8% vU|}#> W J8%]d"4GC|*z Z W`F#o W`G'=#5#f{1#|pPJ13 W`F)_dY 6XU J?《U WcbG H%]cac%], v"vy`6A* _٢: JD, v?* W`H%y`6A* ~8Gj W`}#/A*|pPJ#,%]sO v@`@Ab W`G W`REA*X JOU:=Ab W`闖 JDJBWdЩt. G J WcsO„cy<.NUޟD v7hUG%p%])o=%6 v^6JV^%]( W`J%xUX JQo%]o, vƾ0 v?PJlpIA*8$vD v?, vŏJU7#CoD"v#JJ Wa va2 Wag J WaJya2 Wa,A*?#y`@KAb WaD[k, vH%]1ז vވ,A* `&$xtU ,A* , vĿJt^'A* UR W`OO H%]8}# D v? JqO' vd-#')x>8% v촎)/:V)*pJA* )*OR W`T_et=PR W`T-U/")F8% v H%]f{DJAb Wh, vSEA*R WeE8$vT6)~8% vTʙxUP }#LAb WeB J*pPJ^o:|4J\V9A*p6%8$v84a%8$v8gJ WcɄ (%]PJ L$vѧ%c&PJF}J WhPJFJa%b (%]pIA*/Ʉ9J WiUC&PJHJ% (%]X% v:{촎"9cMЕ倩УPJ ~8% vXR WeX Wec ))ZGC~ { A* R W`Vz +aD W`VH vbWU/A* ůJ pIA*@o:+#A*@<YTU؀.c%]et=PJ-Dt=ވ,A*T We* Wct=<Ja2 Wc7 v;<؟hأb J."v\˃ We| WeO˅?J.%AA*콿(%](%]XLU}>XJ/oDt=,A*G Weǎ* We8Uـ`afw Wff J0hUx"v,4E,[%]e>8(%]`34GC,A* o, vw* W`X*U ^XJʾ츎\GCa/ 8$v(.#8+A*@ }#@ >X4A*@《Utǁ٢:ǃD v<[Dǂ* WbYZGC؂} xJUxJXxJD,GM > ,A*B' Wbg* Wb:!'R Wb倩倩~X J%v= = v=qZ Wcs2,H%]c,H%]l< v! WbR Wb2U؆-` vBDt=ѯ Jy`zzD,H%]cR W`ZO倩-`UOi`Z9cck7rU'9A* ya W`\Hd>g JO%]p《U9A* vo W`^}呠v W`^$a2 W`^*ycB@v"-9A*D>d@gt=7+A*Dp%]St='JR5dԁ<#M8% v>"W (%]pIA*W H%]~W (%]8% vb`xGC8% v?`xGCo (%]xUJ WcoQ"%PWt= (%]W H%]At= |pIA*oR WdWt=PJ ^8% v@<#K%|Y v0:`G)|)y0$A*pJA* ?`xGC0O傊 W``# ,A* `0#x"v? H%] }``8$v0{gJ W`~U1'`xGCſPJ`xGC، (%]ɾ#A*FeJ Wb0b0}`b0:? (%]`xGC8$v t=<) xv@: 1: Ut= H%]#XUh W`pPJ)#A*;h^,A*ǖ J2&EA*,:̋|́d{A*{2|p+vdf{2XUِD̉~8%]RU2 vB/@;t=C4GC >,A* ~X4A* x"ve`xGCDt=it=8%]`f`xGC7٢: ~3|pPJ}b8mh{u^X4A*G>EA*G$y0$A*G߰<#G<#GX% vFX(%]M dAb Wa%]7et=8% v H%]R W`nˈ{q`pi呠vXJf{=XUhUhGC8%]}|pJA*!8% v)#xUؑUؐ6%!PJ,(%]Dt=ވ,A*HgDā$ >8%]츎 ])$>ˈ{DJE?PJj.#d:et=,ˈ{Y/a %]3, v"v^8$vk츎et=1s&Uؔ%et=G^8% v%OqbP:.#JDt=Bw JO, v% 8%]@츎et=@&.#"U\GCE*.#"xUE @츎f{7 J_ Jǎ* W` o&U_et=0 %]0F W` pPJ`倩_qa츎?et=?,H%]̞8% v `r#"vH{pP5‡ v"W%]r7 H%]<%]>, vJä3taE:>/A*xtU>8dIvBz W`t,tUDt=@ |# op^U$.4GC8%]@?ä &xU A*$xR Wa!z Wa!?H%]Ehx"v}6A*$ ~6t@p^UH`:A*(l%]D W``@EA*, (A0kJ+ʐJH%]LXI?z Wa$k Wa%Iz Wa&OJ '8K/J "OBװ)~ {oJʐJ#Z W`. J W`( "lU|.NUO*A*ߍR/ QgH%]D0f{《UXtUK ˈ{ eet=>8% vμpJA*%Oqa,}qa.:26) ˈ{q`:2_et=dR) _et=h}>8d:(x JC4GCET=a W`Eb" W` pIA* (%]x< xU/ WaD‹ WaD\%%)t>}eH%]|p^UďJ6A*⯍~%]@=|lDA*oJPJ 7 (%]BB#xUR H{ I F#o„aH?J_f{ B* WaHY WaHJ| J~X?%xQA*? %]: W`"KqxGA*L. J W`"l%v!W ^0 v2o%] W`#] W`#ap^U>Y W`#<.bU? (%]]/A*)tUSGaop^US>8$v A*)~%]1G˜呠v8$v^8% v .@l@f{O@@p%] 7A (pPJJoJ W`$ >H{"?„`$O傲 W`$[TH}QA*+h ~,A* J 《UT J W٢: %]GԑWH%])A`HJPs7#D,4!#ED v, vx"vd J Bg H%]Jx呠v3 W`/oDt=VAb W`/X4A*-8%]^84؏R WalTJ a,4(4GC#"Ab W`[D?* W` JaS,G >`o&U#4GC#D《U v dj{ dh%]9#.~Xh%]apXJ#dD v1'%]NEA*`A { v1w`U ?j{9dt=KA*`4}XU , vIpPJ ܎M>4GC]7Ab Wat%]|pPJ @#.XBA*.8f{ J JG* W`5K)8% vQ+j,xU |pJA* H%]ٗ H%]<'A*,84"dDt=%]= Wj^8%]%U`䎇k mXchj>,A*ڱg JjYOTUcTw܎jĿ,%[Mfvz i~X4A*i?* V@4o m5G* VBO H%[M ^X% m!A VGz V/~UV/A*&&^UL[p^ULip?A*&:/A*&ephH/A*&|.%[D߅z Vм~U/Gp^U/S%[B %[B7xp^U/<.%[Bkh`OaEh`z Vm | VJa2 VJmJY< VKG3A*'#r7FUN JĿ: V8p^USJ*|s VkD_ m ,&A*0 m 6tp^UP'xhVɢ VN*h'|rhU94A*),)hJE_J`1h*&dk%[APgJ VTmJ VT)U ^8% m xJA* 8J'UR V!Om"Dt;HD mdX4A* EA* Ǿ8JmXiD* VX%xUxU/PJpIA*pIA*>8$m E,h-)%h-|pIA**s8$m >8$m 8$m,h%hluJ VG%hl-U%%h.=%h.4Z%i>XLU (%[Cx> hnoD8%[Cq3 H%[C#>8% mSJ VkR Vȷ m,qh ~XLU<hWh~UZ&xc0 m&8% m  (v(vB;CRht}”;CWJ}Rhta )C:p NӅ_` P8}ӔNp9RhPRh 0/ >XRh}h)C_7L PN#/oGC^.U?fv)8$m h3%ho (%[F$GCb#KoxU_Hv-@ UC>-z!hOJPJPJPJ~8$m@SJ VxUPJ7%jPJD%[P ~X V!N#ڄ~y"Waj) t;AO (%[APJ3PJ6^8$m`%v1K4^8$mUfUfmJ VљO#3|pIA*3pIA*3 V * t;@Hh%[@PJ"D%[@ q m}XU; hU;tU;=)hv%[CG JbWH%[C[k: Vq J Vu>0 m'|p%[Iz Vqo Vҏ0Ukai@gp^U{ V҃PJa2 V҂G J >X4A*P(tUGC |pJA* XUy`h4`:A* O# JAS%[AD7H%[CO#x\+m,A*- V9 t;C;]hx*z hx-y`hЛ@''Ab Vѡ JtUhay! qn[%[Aivq Ju^X4A* h7$xUϰGCU)h?GCj%[FX4A*5S Vѩ#%[FO JE?JXU=7 VJ%[A%[A?, m |`:A*''=XU>o%[CHh%[C/ A*agO#`'3D m3, m0F*U'ay$XU /, mAg}:}v%[AșDU VrKh:M: Vta8$mL.a2 V輰ju>8$mN?js,&A*ڝ J$x mP}: |2 Vٲ:(,>A*ڠGmP&xPJ|O,qhO,&A* FG¯Bh h >᷎* V.-\$]'FU }:\}RU ,&A*vp }#—* V.EA*`v:4GC T97 Vv{《UGhh%xm,i? %[L V3OH%[L|i呠m3`̎iRUO:a1khmF4h:$t;@ho%[@_B٢:hh4h4JrU8(%[@ _dt;@ >1* ViwNWPhjA:jA*5pIA* (%[@[,A*>XGCAA~ x䂂Uٲ: =h~PGC h(# t;@=h_98*:Oh(#v *@?GC '-A*/) P;" P(vJ/z,8uDB%z,9GK+z,9OK+H:Y"+5C #±<+>FO+◅by_|+8o±<>0O+@O+LO+YO+2 ±?XWү Έ  +X[XWo V'XWC±<߅by_kXW+OXW+:O+O+^[±<?by_~)O+#xV'@+ o±<|+Z±<by_D ֋>V'vby_j+;#xV'v$xV'v*xV'O+qoby_덼+\{XWGby_ ~V'?by_μ+^±SXWV'2 #xV'0XW§by_[XW{XW <+[O+by_'O+ gXWWby_ V'x±V'|by_ʼ+>#xV'|$xV'|*xV' qoby_±<\{XW.$xV'  pXW/V' V' μ++Wby_VO+OXWby_Aby_J|+"/ Ȃby_XW*|+by_&xV'HXW ؿXW^#xV'HO+XWXWoby_V'~HO+PO+[O+5O+±<)ׅby_V~D Ȣby_#O+XW> ^ V')O+>aXW| xV' υby_±<`by_Wby_XW0<+by_V'eby_{XW<+1C±<+# |+#'O+uXWby_a+±<0XW1'O+O++4V' Do XW1|+F+E># @O+ YO+J|+W+U^)±<<+QS±<_by_|+dmXW# <+d(xV'[O+ |+I+G^&~!+±1±g+ʼ+o XW6<+±<-O+ͼ+s XW8XW |+Aׅby_±<+[±<±<by_±< ±<RO+@|+Ao±<>O+@O+LO+YO+J|++^I±< <+I~r gXW8SXW}XWFO+%V'H<+Tmq_*\W5%'%{kkmq_P+]:4+][@hW€Яv B B B|( P<( H( :<+:|+PE`L"V?"WO XE`]"X߶>dW {a_,=ȯ dW l2+Ÿl2+ȯ{a_ȯl2+S _ Rl2+ Mȯ5="ԑEaEaE`kE`)J+>+xJ+@?WEhoEh/Eh ~7$7gOį7f)x Jp1+xV'V'by_xV'+by_8SXWxV'o #+PO++±<~`Oby_:>O+Do 򿱸XW7<+XW+V' Oby_~}XW+KO+aC±< ~Php-X+`VW8%X ѓyX'++FQ`VW/+垄Ӗ(G@Я:_៓ ӧQ+Nɛ+N=Q+NoӏJӪa_y?Jӭ`HW_s&VWD:NWWRW?Q+N 02+NHQ+N#y2 _qD8WJQ+N&y0WNQ+N(0WRQ+N*y0WUQ+N,y0JӋ~Li&J%j ^0+PQWƅj%jxܯAg_ڇ<^^W_ڇ^ Jx7+PDAò%jWW_ڃ+PDE6("WDC/DgW@B)_ځDA+_ځD@@WK@WP@WS_ځSD@ %j-+P-(|`%( `cOxDx6)+7W<-sҿ㟊%cľNǏ(%cO _Dx?FW<?Jǒy9$xuWR ǂ_\W+ %bDA(_؂SW |dEbDA,hW ((W Q+C? )J>bDA7A(*(Oo:W Q+O|(RDA@*+Hߊ%b ? K DA|)JW ?JدAJ'–%bW J;DA|)2RQ+EO A_؂*("Dž >W ?%bHW %b /J /DB'bG_؄@B(MI,B,Q+b? EbgW!xBSW!xTF%byP JJ# _؄DB 5+J*|h_؄W!2_؄DBb䢿 S1S Ub_؆,x^bυEb9+ſb \W!8ҿ +`%`e``x:+:+z?ϊ_Bz`3=+ O͊++߇``<¢{'%`E`?!_=>zWi~7J/Q_=g +(`A`WIW߉`G#(?e`JX3 aA_=<, J`LWE/ʊ"z*xJ:+0WEnrz,Lz-s`"+༯h _~"i?_x Q~`Z5JmW-,:e`Z[Wx-G-K`TWi3J?+iƥ`Z%`Z=#+o 2-7 G hyဤW"- _0+7-_VJƇE`[OjxW4+!_+fWI_?-%~?+ƀ"W? D_>2JJW_ Dԕh0W@W E/ -,BW`Z*hԯ E+g#-b_ \_i/NW>jXW>&?@+6+"rW>߈c ŞVſ_+ ecX+_?cO_{W>6zW>7=+ B_׷&N~uхe?cOB(oB*/ogO}}/?oĬЁg}nF״C7{Hy}eg>ЃBV3i Z/hZh\ƾ } F6#\.*rB='Xц ?Њ}"MɊr&h|e&SL/&y1+CFMf/aC'aS X>L-/&r&xkroӌ<^$a/%xZ0c/9y3 x]%/c _^a?Y0Q <%J-^N5o'KNoNac'@>NF9oc:qw wLtt*|&a1e3> xLJ~ y0xL,ᯄxğ>1)Fٯ_Ïx#mX$98u6? "F b$DXWEWE?<',>9aN'vQ8X|'xN.cO + 9A>5*.|( (2 (,2  u@P$P%i|( 33<)4SN” ‘3 |)>S῔c)ORiyM8$ DHgdy0>3O1+9񘝝x̗;> <*xTF^B6 |*s P<*r/BB|h#xз_%xNGі41Ƅ|h$`Ak|h.dOOJz*t>?ɽ#!WxV5|+oVY~agkp9X kX|+±k |+ ;an|,s ,+߅>,p[¿9p<9NKpQ񨱇>50Ը&3Gyk,xZ qxZ)QN kߕ'g)eBGo*6P4tm>G^N>Y|7/&:&b/:-cxKamOdMe8MaQfXO`Ž3jϷݼ.[qCpIɼ.ro l_y>/x^0 |/ |/  Ͳ QxG |/&_ao+[tdV$+ɐv0Of=¯l{tg s%`wɀ3n5vSslguUz1p^?(<g^ i%>M>|~U|<ƞagx@ ^0o-FO~Z=¯-7ƞZ?-Z}-g^4-{yh>O((!xb?*;6Ɯ/@^7 E:ClH񟎇U|ixx:D$SS<ƞ*(p }S#~ |iܣ}xo.ˆO#~\=¯.7ƞ\?.\}.ÿ_o/&Ÿ/o)U4XY x/]>׆E: xd"6M+d# %Po Quu̻/Sᗌ_Bwo:t>t-bXi=b%a7 S3|¯ci+;x+t> Ŝ_y |O2 <)UXxMN1Xm`?NZؿc&e13iW 8Y X<-\m 8_8l[?; u(SJ~HkCɾ_w"oVE=i&$_DaD؊MEleE("SEg~omy8~$Kk?T]kEQwh}kz }V1 1 8Q^3[ >a_Ř0oC|,d zQ -`CŒ&`? | Os cl-ooW c2Fxi.F#F>ï# `?0o# X'0aOWħ !1@bHϼ.b%l|9"=_B6G$lx` OK0KG)>x <E\ +b)/=F"' H&X!dJďd#'\IdO$ 2U%@_ǃ?4x x3'3b ĬQf)`G̗~G(y.G:_#`Qq#B87x{4XͱcٛUb׳/b p2hidБLh,Z v&([c Yb`?0G0y` a"ÏaV=^ Ol]֛%j#d Ex~X3K HR 2|x &m'GGx LL^b{&,d?1w|I(o-$w*r'#iȾ$I0$G" Ii) (S_B?G P? Qx (HVIrWx qTR*SlG:=ďZp#`)*-*#WǀN^Ÿ;K؝,' 0GXUĦ *LQ*J$aġ'>% 8x+bB*x.K.M/, ]UQ.\W_g>  .` qka>-x `_0`_0 |)ſ <]05_OOm |x~E`;%mY=%][v KG`İc?_gVoĺ,߉hb>%%6-,TcY.ï>&sd'/e`dA? v{dVOk%i&Oc{?4uc/A4 g4$x Q4-Xy4Kkme>7vڛ|x;,cob5'Jصav‹ ,x%O=W0e^&Z&lqi4i4>AF#abWV']_,'axy`sz?O,$x#|O,^'?[ >'vO%66 x `x a7lla;mU؃aGlHx vB—ا`6+XūػaO{X -_`4kpXiKB͡vG41`uEA?)1EQ[:,U<5hm(m)&hxk>5h{>Xq>G?#@}AπA׀%F@|' 'hxx#hm* 0i_G>u@$4 G~K m0 % <K@3hKD=!$4C!%4 |DEw/!"xڧ"voE|RFA!#恏Df!g!?ƽh|_r _ovKX&x b&XjSD+h||ϱL TF+db/O)/eMn1Me♦Q♶x Se^)2V1 &ky7|aN@7c2 e XOGo3*aWcx@^1(RQhKxM Q-R ImphR =R#MR,f)h[ ; 0A}MȣC7mE$>dm%Q>2 21ei=bi#&$dNdN~өqӦKܟi6m:J;NiW(tZ}IxQF<6vs<Vi<{veONm<%†8xV6Blm$)A[ v%[I{m$/H}[I;ImNi H+f;Ie\KR>RFTyWQ~QQki(m%i(7 pho&0рm&'}FcL*M&4L{I m&¶ag&ͤш.1S[F2hh14F"VhT6IzmOm>g m>+a.OdQ r"(2G){FTcM#ѕ9Nѐl.2hR]!o@MP q P%;P)a@};PF]m@)ivtP B+{mB{ڄ@ɶ1~"v0ڄU]1mhfm:2?̕1#* lbmb3 {{Fdhm4ynљ:3mɗmϰhΝ6љ+13s-1/hL30hRqf-ј{Fda& O ;@nh36 q@hvMdC|a;0hvhv&aFPvbhv-a^\]ݤi8 e{Ii=8NJ6qG [IM&qkK]6鶔#Po{Jm(am(#aҁ x!P*v i@Ah46i&m8uh4c,m U2_% =B0!3#!6@V^!=(_Ch8hv!piJ-җ7vm)tJDiH)s-ܛ2 vwh7S h7gA=R6 ,m&h'N"4F(Aq."em"Vh ݠD)g{@XmsmdQ`h>5r&Ѩ}j.`hzSC#mOg=gR 詠!m#h8䝠Ch8͠#mFAX;h|OCm`%>@Oh| NFWh|$VL_h|(` xmlMhy#S@L@#GhXm1wFKѱ>[F`Gl==f@6ShTh[]b^;@",WlX?p.XE$p1V-Ao@]͠=A\ vm2`odFNtOմAm؛h:Oa~t=h:7M*h:[`h:$Xh:3;"{F7,Wnuf07=hAfѸaѸ`= S1l%UbJ%=@mVV0 JJ[@Sv(hv).{mdmvC]@;A؍+((/m- hq9Twh .!# J@({h]͠:MgfC0hN6 h~)`h~*v<h7mg3}L v1m &>>&#`hy '>h @hx:>MNs ǹ'5@n =hv9w 3Nc Yh'6'c Ŭ6A6@g (mPm]Pa(:QF B@?#h8 (%` |+@N-P)䍠P,dP-` CJD ;^E^/$DKHo>2FxG¯A'EH&a_ ><_⣘]\/;*>* 7/PX* xAs < })Nx(y| P2Vx%J EloJ-a1>YL[L | < YL&h x':_zpA>''0X| ŬiNx*7O/ +xb|.?b7o+bFOⰗ+ a[(\ ;*G* N7*%fBF=*qPOo| 4`Xs/7y X[łFqx-kg[?+]g,(\x%V | n x4V  X7,0qX*I dYEOR|FdXb?$Y0--Gn~F# x\[N^pw\'<  LP.1GR||"◄S|E/F<"XA%KYš-7OEѶZ-+i- Xx,_зB)xa^p!/7x;owk€%y7 6O`#7 *0q1a_Yb?ʼ X`w+1%mg| Ixl-m>-xxG٦c'aŵYkpųŴ 4lA<[űC>-Z<ű[4lZï0gxF7Uc_V # ߄rmr~d:G[F$ L8/ #X4. dMO,B2s$x*/#E2egBed,.yWl*qN.*WìJp@_V. 8 xH&߄L* $2C ? X@xHp@H1cxHA/ < 9f^f_f=193b:33< Pbxp s?FAIg v4e4oA' XL_ R]GԸ|'t ]gtN狢`w054YkF IXGهy>m0c< x wl)r|<7)7Ex7 g^pWnH -y,cl>[%K@<%do%?%46 #dC$&}$ӌ<$a/62( $/ $,$`sH|$X[$U "6.aw[#?R|Cܷ:n:p? ePB,f?Y6efZac"vh"i.vh{dn`dzKp˳Dl٠g١'ݚ0ХGfLvh\+H섳._O~d {!#`5DMRd"{!%bb|"\{?=2bcl1~'LJba;N¶݉x^5]_N p^},vD/gY/a>=\[0KnaFv070: k[J݂^(gb~(7` {2 (b(abqbtk؜{`;؝U݉_bs7؜~q؝;݉ =ś]b%%L=a4 X%LJ`N! =aZǰm`Gb M ; XX91gc~b)Xb-XvvUdMk'}Fc%:2abaA"Ega* Q Y{d.Z~v((Kab{ })C+=@`P)ٟbrװO v YN'A Xv ؑ'lIV8aN+X;݀7NK9[`#(G`v{O X`S(rn@v %pR2~Hg ÇRu1``I`KH Es)0=ؤ-R5%bXi;)gR#=D˱HؤRbWQؤ]; aa<װ3ǽf63:'a=d:3%f݆bf]b Dy*)v IPyv o`Ag`G B4'AE4Ka|h`˰ц )2БOaWaB^!DO"o;"63!"ș%+>Ȅl;"pvD(_dB]{n`9+ZQ`Vl0#b`X'`݂~Xnb}`yIX%7`P=cv '&} i9Me] maw`8 a`8Jo Yg`8(pT`8+a`8-cnp]˻ K0˰{j?vɥ5[ӿj25ϰԑ]>TNQcv |ӰZQ݂Ѯ{Z5ǽ8#`V/-0K-Z-ho @O*بkQRMة/bk`:MC<va^tGC cx˰mv?Ql { e=636VƝĽ`k}Y.6` e]R.{v ͮyf/dM/$d;v L^+a?"+S۱Ybv+a+>}1bV+X.6l37Ff|0ؙ;6(`{b6,c͋a a/7:vi{ ðF7.q3R} { 0E0$c<v?=a 8wp(`p.cō Qرnv,#`a+],8I;Ju}.g=#ga;IÑ;9"7`<o<r`毰˰8 vOF6Z`ش-1bq1:.,1O`V/ tmGv8t&`t,`Ӱ?`s]NLH'XO"6&'P`0}8p`C pV> 8p\q>q=v.[/bXظKžŽ G\-eؽ$v/Sb݋/ =:n⭚^,X_ؼa`-^ga`m;A~`d#اd%Xg2v },Mdfadb=P߲1R~[{:Q`=tնo_vGEg:,Xó՟5<3}<)X5`߲B{.Ck$:#쒋vH$X:Yd݀ B]7dRQ۲SdݒK)# %dS(] 𯱁N6`0G>v0 1c0`Fl1`(Y`.;&K40Q1vLHnɄ{0cKpy4wb{b v1s"W?c;>MKϧgó0iVݟϒ ,N!2=3#v2eB  v2+hh 1? h`; 0",S+W;CYvL BО4,4hE, _`̢`^; & tY`͕`f)0yIw3U۱/f{{]SJ{xӱ}xYc^k< O [}8߰ ð rH=R]˻k]e>ôaٶev?ČvZ~ñ;2;aسvxmv.Sd;vN{잜c8'g8;(_eYAn5 {(UvP}(@}}8㲁,Hev(rlu@`Л.Av ݃G3n`@A' ; ~mGa><C{߰\GcB`c5$d^v Dv E<v El6c6,l[v `ڜ60m64W`\;X#\;{{0 Y8:D;3{GNY[lJ줟),e/e&K ;)ee"6(R.`E7#nNx7 %`O7Uq/~qo}F;$vIc""aw`D}^-vA=}`D##"3 ;"^.56j5߱/{5[o+[*v5/j*%j,Xc[˰6)=4Uz=Wzoaa Հa.w``v  lسpa``?8lp-Yb.ݒ la|ɻ,a;6ī'>,R#YO`F[`߰#Ga`F=`F#ec~Kw.R&ŋ~]y={cWm{ X뱳;,l6,ñ`YQݍ[Q؇%{v> ݁!Ո dL} NX.5`&nʫ^Ձ`9gar*XEȵbO`:XCؕ:r'`3t7`U7tt:t#XH 6Й` {BSt+X{Bńй`v7- 7GaCs=<7a` n}aK`"n% 7,)=^Svl;Q%](`1 EnRV `o;Sjl`g bC؂M;Ķ~شQ;0=Zv"ւ;͠;M ]6-7D 9~HhFiaӽOvmv& 4c4`L=jϰ&3 cJ;aMӰ'&hy4v{p߰͠'z5 ٴvA`N,om`NKh ?(=+& %  ' ,(0C?۰xm<݃x{{`@~# <`]v&7`R=^!2e=J*oH۰)w& q`T5^O?{le*UR [k*qhe!W ;D,cN]"ƽ X]PO<ϻv0vxK䬟ĜeQxU agcpm̫Ę] _c8pñ{ xp-~v]72ѩ.я{G&h@vH̻F%vNF*b;!>Ӵl5"\6!{H H]=Î>H)ݤ0紂v]Îҍp*<Q J`XyV]UQiD㴢w'iE.^ҊҊϔVnݕb/el1egOZVVJ®iX}8YƽJ0yWc8r=ݎC.r}¾"YF}D9"Hcv:Ov:4/c˱:@~LcVv:cW  8Ygƽ9#ݖa_e_e3 ;,#cR`۰+{/ Xvl+0+`V)aW`V.a_bNv "byI/݈&@0Sn[ ˲(촟)촧̣-@k,xò {-$a7e^1촗v;&že8ϱ<+v;c^jp Ɇ={.o/츳0Mteǻ aegp˅?eƣl4켟v^[ݗz潗ÎŬv^.fx]ـ0 0fN0J= x˰,E` i^* _`Y&`XFc,,q`X,ea/ {LSdYwQ۴ݻLF10=r xMq59fG۴➇Mqg\p1AF2@(@ {PY3@g]O}gjBkډ0;ڄ mڂFHx>"c:xs]Fv<ta {v ۱b n&A C< GӱE؃Nv 9؂ WbD/AvEo؄8BK$obv!*s n؄HBBΗFac2{Gcyc=pӱ譏;ױ v!0S؇N!b#-C QbN2^o=)/`. z{q=8ѯ'`Z;l-U;ӭo7nś]{dݏbñ{ x˱g]w_"o%NY.:`]F[c`\ +G ݁q/0 ݁x/-̻=yg`_F/@ǝ{<Ӱ/%a`^$a`^'`/s^R݁xv"" pK؈ Q؈;(؈FD$rv" ZAG9DW؈-k{RS]ړMjCvڑ3"Gf-睘{1!b#ݘ.~S3?@~HFE&b(gE:b)#g؊(Ӳn `@p l;| ܓ>>Y+|{݃[𳃞𵃮;x vO^V[/`10f;t`} Ob(v#`9،`c;#0"F#F0،(K،-`Ob`b~LV Xb`bH'`b)`[8"]G`(ϰ r_`-O`4:#+[3O`,0V"AR+X'ՂKϰlvT (s5 (`;DQ.~ (X0Ȣŝ"dYb̒ؿ$ 24ݙIٕ61ɝFgِc>Ț`dQ`C l"{'> l$ vA}`2 ;!B`d*XB ۱`f>ͅ;6V9 - ; ċ. Ļ0 Krk0Gnv#؇؎݈E;ī݈]T2k,l}33̍`iٙ*׳1٘`Rvf+XA ؑ?bW`i%Nқa4l.9`~  -H Jl]mO5a` YX{Q2165EĿvm}0 `lm=yʴ],, vV5 - , "B%`B*`Bp! X v$WbAf H7ăv$Qā/݉v $ xv$v$CPS4vI {IXQؒ&aObHI$]YF{Z,mP_.݀,h{[=` ǰ'a?` Qp ;f!qa @a H^v% bSJ1bQ=GobPġ/J˱(D#n"\¤Dv݄AKaS" ,c Jqa.M𳰊?ƝVUE@(vI"x߰a` -` O=0s*˻a_0˰2S0[FGPoa'aK# MF)GaZ0 C݀6Muvոða/` #a7` ` ..a_`r53ʻ6G]хWcnv"8D99q`?v]8q+v#v;E,k #a7a{;aagG0AGuq N&c8mGIG0K0}<3/`unH#/u y`t[H.:೰:a`t#a`t(࿰:=A;fAN ݟ`gN  v#{{_`1 {wa#?Ya!N}1'^E  v V% ; ' x P%8vv@,D W$ N"*WE {N݀H3/`S]IIHF˰ DB^HY߰ / Z݀Lk`,?`-˰ X X'kl3gv25`,5b]&(qK&K밒݃.JvVwIa`㰓M " H`밒*;.(Q`MQQ-O`Ohv@F Yg`gePJ݀PU`A!vQw`4 Z*}c+M*n* Q: E/`%ٟ` {=`)a7`-ckW`, Ձ`aa XbW`"va2/`l{`% NX{ I݄{a)mP`yJ$XPaC+X BՅ.?;Ÿ`6vq 7l] ]\a_ ;` _`lc ,,vð  {7`eaw 6^0%XkUk  {+DnM Z @h)CC^*e[hoK&hqK)hvh=E݄փ.YAa,?h#4%eKڃ*a,VhwKQJ4.4vmeKJ;x",}dѷ`f$!@ .2&4 Ȭ("A` 6Ү4{}hݣ4?h[ ;Ж mU`hZhjj;,hva@ǰ;N47`v`wF;%f؜ bBO@3Ž h{ ðv YGa0K~`[ { SM(ŽhEMG}8&8㰚%`{<1 7* Kk<<~݁Ѯrp=7;XWƽ6DK詎;g,E/Ix]N'qf:'''e݄a:M/a:ð} ˰#pxT v>&@;–Q XQO'Ɲ𯰞[{ qa=>WO[ 㰞x aSP1aAv.€}C[p NQ_`oLŸYw`pNvK1i xm_~:`6&yI*>:+k;/ v}`,g`4sr`$d.I'`/`a݀|?;X/>&`%{` K` 4` 17`-` A@#`AgBQB!B{y݀O7!n‘aH<^’&OR: L1aH HSRg*) .}!O!W!wv]^`~'pg Cm?`",v!<Fk"Vk,}۰w'd13`#3F-rvs˜YSS; dlvtvČS˜vżk{x1 g ~#{3W$!;LX v' './`w` `J{AGƆ #}!f`$AAO c.H{vD (U i `$qaP { ܫo݅@ haPJT=ACCTqaPX +xǰa?`%0ӌ(]K¾J)g`%p].vaf߰ð vr̻y`'U w8Na L˰{^xuy/ aވ,<% 61 fy4g~AgU`s4_ 9WIX] %mZ !f['0F#ܻDlA_"FB6o[Z6Z-S P1XO഑h-ϛŻ^|&yy|uyyP¿>υ\kUป * ̰?@|cH^x۷78y <O[ .@X^M60ڈmQa6HFFAD}D#h%c]|-~ҥ]-TCiPJ iPv Ajm]j/8+W%v h?6¬+8SGl.8hVGm Yfv&eF6ڌ/ڌJmJ{ԢԤjQ#/ڔK-E=ݩElu(V56if;Jͷҳ tҶYұ+J-Fұo 6>ir v\}LюvCYȥMWvElhý1GR`hGLhANЍ3Ut(hTXMɴib=^9X:XoX m,=XX$k { 6 č-F#6;pkvKK0\/Ƥm'CRɶ i^1^[j~;m/>^ hv96[/4;La610m0 M\;L xO han,*h^,,s }͠X$5jammL -6[;Se;S4ژژG^5ژP{&mph=@z-IXh=qz&eA裎vSA譖P#­ ]T _U$c*_ v vC7`(4;BQTwX `))ɻJ|_ iHs&t=4] `(v,a! Ga[Ž°)+7}d+𷰬v1aXI; v †=aS Ľº-/a\mv>º\ϰm}u~½:¹+OWװ&`(¸qS7+x&+O!j1q!ripW!g}_!svks  6}=Cc!Xv7C\ 0i ʄB7nT$bT'eXŽTK{ YXs { ,v qaacXX݂'" s.?`;E8i"VDav^A#6<v?e8(e)hU ZZV `݀Kb7`+VK| p[ ϻb|vY`,>= >}[`,p, #\P '<%bȡ,?adZo* S懰b[N0Nvc re `.=@ʻp\,e]/@E*n`62El6Žf3-xUZ4Ɲ5-Waj )~/-w`/:v;x<i 5=" q`0S6U X(Fv+ ? M`1W`1vFv3*"{ d][)-pðYvǸ簶u[%aalI-ه`]1G` clw#4FC# Xo# G&Îv~>?a`=8#`%rvvGdOv$k{w  CH{ `ʉ } ]|&."~nNᾋ ;  . _\2൅A>7H-;E9o` {.m`%v H3f2o`36 g~f ;;݀[`4=ПA>OC݀`4#h{-`4g6AC ҝv[|= mau f]#E4.^j6T#۰cj#`8' ;fva ڌ0W `6u[vas!vb^C.`݀n {Nn#` `7p v%%p KbY!%',ZIN=K$cII@`$@I!Dg>$ZETm0+PojZPjɰ![x;V#jp4Z]Xj%ip7mg'X`k%اjX3-*Wf 6{aՐ,1ڰ`j,0hÍXi6M-nG v@Dm4#ػi.M /hTetvB?Hh!3B#M"N!k &a2\uL]j4D &%j64&;DkLKÍy6m 0K/ `h^?h^{ɴ/y#{B+ m m n}xm <=7m ~>ha&F-+#  ;CgCw$ _č{J=A)mAJ#fJ%bnJ'`h%{; EO Ixm`hm;x@'KN`QN[D[h@hFŝq# qOD[D.m/h&( ٭<{A5' va-Qh& { K, C;" 6,,6!͡`;1,6VC"k72u2[g6G.,hd%YdC!:ɶBv;&(Y>AmMiP=mPu`CPcMhF}&A.h')w% ǶA:?* ěQV: l@ _0PFAA"ǛA@b(m)t;AKh)m,򍠤H}U{E$URhL+)9R&c]kmK3̳C3G346cstbmhf*C1[ x c]* 0;h*aAR8 AQ#AP;AP[AP m 3-o =6g4g xi41V6m ","GHiii8#DFýA[Hm"QLm"Hh+-h|h+:nVH~V)dM 6p X.`hx45pm@;CQ U`hjJCQOmD Gmm`?h-puxT-I*%mx mK {@tI?hEm p Chlݡ;Caw 3-#w;Ay6AynAz\p[b_FA}8^6`eVElkhGhLSV*gV.Yck{M`iśMlGvbU6)iZm6KܞƛCrCw, ߱`hn(m + Ղmh0r;A6va ==vC6>3hp%Xhp%hp(X; b6aE` Xhf{EEa*hHm 6 QA!mCv'V64XhrhrHݡȡ` 6ݡȻe{@ynh9a#h% x?@xAĬ_a%O_e@}|(YFmxYk-:EXmmvChAENmXhT6E(-%;A6h1a^bYAg͠. Uhloy.׼0a1c/x@xLŸxQ}O o{Ľ&¿0H÷g/NAC'zAcRleQe *<қc?J?¯J cOJHzQ[ (]x0-ʼ`y`%e~`&m؉oLkdޙfY?%c/L#O Y(;#lK6l^b c10E,&c{谣o }gaWm=_o|Nɼȣ,%%8̍2?!/ &cN|6{|>O|( *[? gaWFƟEQc |5pR^1؛() 61h.ᰥaSkaW&Y XK1B >GUQV zHxG¿蕍|z(oEpM8)_[­cqχ{Op.,_񇏋2qaO||F¯ / OL,𫅾>0;sx\$1ocj# )F(ag1K o67c-l{<ڜ)` A626p;žl.lK|aD[ ?3Hi$  =· <9I.aG)TOM^W,e^_ȕr%ᇇ"v9Q¿tJv:6tbd a7Dlcxt#a?BFxt'aOBSЭ:qB\ͻyk| OqP |?Q ؿ(O>xvS>|; ;OphZ;G2>2\Mqf5[ ^.[ hVp;@Z[@\h @{hm./Sc 1/O 46vx^xM^(` \mkDB~DB]!hus " X+" DA[h-mST[[Ty'Yj=ڤmR'`jG!mR-a$m1m-i\`i6шLiv'i+"N 1qY-$mN v3hG?S~[GXmF;G6GNGfG%mX J1/hYH"ݢ(DZ0}E=whF{h Fh$bLUh,b@ aF;A6S%ƻAU*|X]f|%㝠Q|*h>2ݠ[˶ nh'a&hf@œh8v֣h ie9phshhǹ`h0OlQd<1';@%qɴb.͢16 Śݢ3>ho#nB#ݢ0V\h-hhț@mӴ Qv T Cvh2"6 " 66`h 0h%h-SvQ@$`h X;@*%{@ 5ĝ,Sh_WhM0SlJQ@ {@ Fݠ0y>vP}OdQ$m27wiQ;Li,6=d$KNiL 66;@ȧ[@ȳא-7೰zQ ~M4?=Po=)&P&ʻ] [oC=myߓ-֭_=okhLomyߓıy`kh[ ._=skhb[`א-7XrzkhVyߓX7 ǝkhrW`>א-7kO':א-7Lu`Nא-7axݯ [o֯U{^@3CZyzo ~M4?{ W=yߓa*~y ~M4?xyzkhY\^@3CtM=:&:7Pn;voɿf=^@3Cޅ%]h&.א-7w5痰z} ~M4?$ӵ ~M4?9א-7א-7&^@3Cvoɿf, G^@3Cv^@3Ccyߓ ~M4?Svא-75 Umyߓ6oɿf =iא-7#voɿfv6oɿfѵ ~M4?@-=& Ooɿfivoɿfj?-@&Y9m [o3-e ~M4?r/k= [o0n?&y jvא-7. D [om6oɿfeѝVא-7h|6א-7EѺpy^@3C`e^@3CX D [o JJ&ah ~M4?=-6oɿfKDgl?-oɿfYDCkhЁ`Z(yߓ_$KkhɊ;OkhPSkhɃU&V&skhɇyߓ) b?] [oyߓƶ Xy,>א-7v>O ~M4?<0,|i ~M4?<ѝI7>S ~M4?<3{ ~M4?`tn7v>6&א-7杏^@3C ^bx]Z?LqLoG_we]^4e eu{/u]^Neu{/Ww{ e_(}2u{. LL˟pP`sW"S2 3.uu{. Lf\aW׌˒(23.wpP̹eCee.eA F]^˂1su{. 3u{. Ff$?2eu{/WcL?`]^u{/)eCNW_h]^wu{/g]^?hWQ]^%BC__/_W!#&[]^c\%xtu{/ɀ-]^˂cL&?\%|t\u{/es]^{W^ /a]^ye/\t\a]^!3> eWd2_()e@a]^( ?Po]^_(]^k]^%]^}]^"e@De@W' W'2eOWu{/u{/€@W(@"eP_ W( u{/@ W( 'u{/€6eRW),eRe]^}]^Iu{/eR??]^@%]^@耋'u{/_b_aWu{/±u{/¸??_rW+?_`]^ ?eWO_U]^8pW_u]^8O_/eկ_@u{/Ơ]^PS_O5*C]^_*w@F*?*a]^H?*_**?*_U]^:W__u{/ `]^e\4e\u{/  e]?u{/e\W._3]^'u{/cpFe]Wu{/u{/u{/u{/o_]^_xW/_Ou{/CmW``bu{/l؉]^Gu{/_l"WoWnWnu{/pWoWu{/u{/ဃ]^8U]^u{/5]^"e`W 9WrU]^˟]^e9999_@xx+e ?WWW?_}]^<_ ~__ȟ__e?| /u{/m]^Ы{W1  Au{/_$_ ]^?_ I]^_O__?^u{/WGu{///:eyu{/^Gex]^ ex WWRexW ^    ao_LU]^郿____/_0e_|d[]^'dWWʏ__Wu{/0eeou{/]^63@e]^0 e WW o__O_M]^@w]^@Wou{/Fek]^3equ{/ӂo_W]^/]^u{/Ӂu{/ӊNNP0e_Pu{/=]^_W@&ePW!'otLkC IB(@3yy¿oICɎO]^njHFu{uyo Yy|-nm5JNSux3=[suyWz/_*soxgoM&a):BDkPf^p%_Uh?4 O]^ou{uy2x]^eWW-O߰mžz4B%_h>µux3b_o䁁suy\p0Ja}]^h7=u{C+G9y?ބ]^eWW][ /B&viļ% _Kя+^p"o?u]^h ?[]^%kcz9y?7\g<_l.5=kVߓ ЉMMux3Lm _rA?U_,u{Wi]^[* '4cO>#<L(WW|U[_?m5 F@]rEux3ݾ[ hk]^?ںW$ Kf/a<+Gs,WWx]^/8x}]^Gx^ux}?]^/_vm?m% Kɕx}zg+-?\XN{]^KsdJ9 5rǀ9 u_,u{<#ol.wں_)C^%ЁUU'oF/TH_P(iЉ<<]^  [w, ΫO]^/8x}]^Gx/_*ʅN-AxmSHjЉ< >zg+|Bd^q?аgl,mOOm(R$y02B%_asu/8W\m/;?U =u{uy@ux}?]^/_x/+oM+a)I 9^pϷo(w, Ϋ=ux}?]^/_bo@Uko JC&"_{}ux3۷o +g/ux}?]^/_][?m5! ?Dk4oW<_qo@cUg//_*woB >m5!Ʉ"_O :g+0mU@uyz9y?᭿kYy| -Ё_o Fc_&ЉqW<_ぷo~u]^~@ =u{@G+/h[gp*mL8>m55~LDk L<yy¿[~u]^~^q?j}B>gʯ;o`~m51ɀx箯yy¿#^-ɇΫ4W'^WW H>Э]^eWWPxmɅ"_]^ ][Gxְԏ~NY]^\xwsrROW|U~-Ɉ2йaxV_XJ?ЉZ ľ-ɀ+UWk4W'^WW A/_*0 vamTiK|/8W{|&4_WWhcO>#?W|UZJ :\L_b|% Dk B//8Wh02꺼 ?[]^~^q?lu_,u{Yy|#ox[M,a(?xoK9^p{|_4_WWhcO>#~)WW|U+o{opV_8J4>/ЉM /8Wo_Ϋ4W'^WW b/_*˄n- |V_xJk?Љ^\+WW<_ľ-UWk4W'^WW G5gH^0^+vi* ODk /^pwoxXWW/IUWW|Uvm/0?Wm0/ЉgJ^po{+'?Q]^$z?+5x-Xwy$L6c! STcW4 V^q?!/_*m0"An<-y?+o'UO B}Bz/Yrͯjߔc/~Q1tR3G?Iu;^տ(_~ӛ{Vc}U[i{Vc >Ym{VbB ^ݧ=G?^տ(^$׵o?f1ijߔc/;N#m{Vclk/iĝjߔc/^Ӊ^տ(`MqGkڷ3ӊ^տ(`Wqckڷ3 N-{Vc9佯jߔcXwj ~Q1taE[Hajߔc0vͯjߔc0}kڷ3?j 6~Q1_j ~Q1n^տ(`EA׵o?f1k'(`C@S ?W3e?u{. ˝I]^˂eΤeBDe?\$x̸eCeλ]^˂^3.KW̹eBS2$weWd\&3u{. LE(|tc(uW WO]^˂S0e/u{/h#3:e]^O_>eQWu{/W?u{/Wu{/Ԍk]^˂ ER:eR?pP1C___enW7+en? ?_u{/pO]^_u{/ru{/v_ _-]^Pen W7k]^D?(L`f:Lu{. >f:Lc]^D'W1u{/QW1ы5\3Vcu{/@wQ]^P-eHe_B_FWjC]^u{/@']^k]^?eWz =a]^˂_03u{/Ω x??!=k)P?="W<_Bwo ?z #WW聁ʺ u ]^A?偁sH?%WW00.wj]^s$WW]^ `\U;]uy^q?{]^Gz!~HgZVH_xJx`[u7]^ 3o_Ī@3 uKu{Ǡ 9yuy#W|U0OZ&vi% E0-^poOWux}?]^/_aoJ/]k' B {W /8Wopu]^ak?ux}?]^/_boJ=s}k% 0=Eux3-}UWWW0ÀWO]^eWW][9(Gm7`_pCu/8WCom``\UAk+讯?8_W0À]^eWWoJem5?À=ux3TɿG"ɠ`cuy^q?{]^G8_/_*vm`SO`M(G_p,J+WW<_ ][ZŲb5uy2?fu Ƀ8;0.w&k``\LH?]^F?Π`\L#W `\L$WWMuy@s0]^s0]^aGںu{a]^eWW,o-,$vih @o yy¿`=WW>/8=#>w>g0_)[+_*eu [ -yuyVE@>8V#]^>?-Ieux}ux}~6oZ ~>|czD_,u{>C,]B {^տ(`6~Q1]@[Qjmjߔc{P-m{Vc ^տ(%6׵o?f1 C^Dž;^տ(8a,/{Vc/VlJuhNPJ &|pPsW׌˒(23.wpP̹eCee.eA F]^˂1su{. 3u{. Ff$?2eu{/WcL?`]^u{/)eCNW_h]^Bc_0;]^F[]^Fe]^FWO_0S]^F դ&&`K}o1?mpX. Bkdog+[001ΫmuyO]^/8u]^G8+Yy|Y=YG􉝶k FG'F"Hyy¿|;?a,01QuyM]^eWWo"Anf:Lc]^J(W#W&_§u{/ô?u{/ðev;evW;9evW;_ğ_`7]^ pPc? ?S]^'e?u{/u{/ 2e&  u{/1u{/0i]^LW_bu{/2u{/0]^L#W Ÿu{. FOW ? ;]^R ? D__Wu{/HWu{/PLe*_>eG]^__Oe@M]^e__ܑ]^u{/&Wu{/_O]^B_[]^C?_ ?*_Ae_WYu{/Ղ/_?W7u{/ՊVW_u{/JrW/u{/C__99Yu{/WdXCeg]^u{/u{/u{/X6e+\:c CKe+_*e+_e)e0e2e\4e4eW@e]^W?@_ke ?u{/]]^Xe$WiOu{/u{/u{/u{/o_]^_xW/_ZSWhq]^ZBeX]^k]^c_W}]^_v\?\Keu{/ׁ_ͿO_=ee]^]^-]^u{/׊^?_w/_ x9e<<< ?W ao_@/s+WBo_w ]^Eez?z]^[]^3e &eP+e =e _W D_#Ne-? E_>E]^|| }u{/ρgu{/ψ>__>%WHee]^sGu{/pe.G]^˂UvV @Uvi\%'?rOg+o/꺼HFc@\'c.Ċg+o uyqy]^OL#WO>gʯ*~- %<Q+NA\]^ h`?? `WWpYy|"| J,yV@k F+9xڦ "['&&+Yy|;|'{mIPɛyy¿}[G`cWW@,"g"W  5d % `p5' _/ Vyy¿[ ?@\4c .w5u;@\u{Q4WW,W<F_矏 su{y#0KyLS;]^8gʯ 0)?m_Ёx0@Z %| =u{\r z?D~L WW|U"[x+v 5Ĭ%+^;5/8W}[' &T?u]^W;u{Ȅ/W W'&ǓWW|U-ɈN8l7VL9ȀI^p|/Q,c+S]^/8G#D&6g =[Ox}k9Ȃ+^p,Y &=uyO]^p;u{sc;?ͫD ?W9Osk:Y4?+J?ΫIu{?[]^CĊ<(t?Mu{[]^! .􇿉? ?+H]^@ Rc"/u{alYgR;| H?NGi%2_r/8W?mL$~u]^\cOL#W GWW|U-ɀGGm ' _"'yy¿0< &꺼!kO]^/8G# ^M]^eWW?{|&'ipt)MO9ͅjg+[ `\b/8G#0!ux}?]^/_Dm/!3MKQG WW<_D)m\XWWk;z9y=uy!@g-PmaF&viJ!gCUWW<_F*vm[uyO]^$?+~^q?0]^Gz:>gʯLN%O_MP L#tHyy¿׷o ?uyO]^$?+~^q?0]^GD/_* 7o(`tn7xh-Z/ z?Bux}gux}7޺>gux}ux}_W?4?O]^~κ> E*o'+Z;uE:/] [OLZ+_"WB+ȡW&"W| DDž^տ(/X}o?f1Q,gl>nj6o?f1y&א-G?}yߔcN ~Q177P<~Q18<$m{VcpGG?c+kڷ3c;kڷ3cKkڷ3ze%ա9C1OP?A_u{. Jf\]^˂:u{. x̹/]^˂#2 L˞\:f\[]^\ pPta(13=W1яWfjC]^/_W']^?u{. Lf:tW\7& ӵ[oWӗX_dkBrcOɄk@S]^ W (t)s(u2(2t̹(0Hf\cW)q]^˂ ˝wf\eAs]^˂eu{. 3.H]^-ewu{. (Lf:0\pPpP35i!eu{/?`e3:a]^__ Ou{. Ff:th}]^eD_u{/__˿1e|W>_1]^pPo_u{/ Wou{/ u{/ u{/ ?egu{/ ?bu{/ !W%0e_(Jt\gʯFJL;Hnm5C%px/0O]^ 2_ooW8 reuy "C/_*i(o&VZ{mZR[KCokkZ o+ ?WWgkeuy2Yy|N- Fх= %/ f:1\:ZH`e]^_`'eCNW_S]^˂2eAu{/W&3;]^`?lWl Wؕ]^`eBDjae9]^(Wǟ WW%c]^#W\$|t _3$Wo\u{/H? ?_`& ?__u{/L]^u{. 3#e ?u{/P(W_C?_$e ?%_@ ]^(WJ_]^(%_APWw@]^G]^ ..]^?]^T&W_e eu{/ _O_W+W_\e0e4e9eu{/İX&eYu{/u{/Ķ_?X]^,%2O]^22*WWE_O5W_e G]^4Be /u{/hBeg]^0WL_&e+`WL& I&&e/]^>]^(W?u{/_]^W W eA+?Au{/W  1]^! _ _]^${HW Awu{/W DO_( W @J+W W W `L#W _0 W L,W NW N _9u{/W ]^'_8]^Ugu{/Ru{/Pa]^TAe$WU*E_G]^(E]^(-ePW gu{/u{/1]^(S]^(#O_HRu{/8eRy]^Y_$eu{/i+u{/aWV+7u{/`0ewu{/pWW WWu{/p e?b?u{/W _XBe']^,??]^,o_`W _6eWYK,WY ?,?_!u{/ŕH?HYWYAu{/Őe'WY@Ee.W Eu{/Z ZBeW YW Au{/W @[Z'W Au{/ Z.W ?_p_]^._s\W W _p3e_u{/;]^._pGeEW"W"W"]^]e-u{/eW W __{?_y+^%W _x]^/?u{/u{/`k]^0W %eM]^0"W W ]^0A]^0]]^0$bW G_bW A/u{/_bbIe_?"u{/ W Bu{/ !'Y]^l0eW[ -ÿ_rW[u{. u)'eA;y݅1"3M%1|(€Ű yy¿$]s``cuyؓuyO]^;u{Zۜ\?`u{Ű)ں^q?@W]^G[?)@gTm|TMDl%|Psa2 - bϫOcFu{ƀFƈYy|aWo Movmڌ%|AP_F@eU/8WAr?༷ɊkYyy+` -ux}?]^/_[U$viin.`x]^ Wo6Xv0H 0~t‰LU]^ǞW4?cOWƒ/_*Y'&m%€ Okmꫫ^poUpz%;aG+4u:?)+Yy|b-xMN `>€8bEux3+|W@F?\XfUx`w+;z: Һ .w5u@\kמ.6c ܃, +ߪcG$}cOW'X]^eW?;|p{S]^/88W6[`꺽_)[% ?c%P8@*cqC%-R%R?cq KKGcj9|o(S!#o_*o(v\^&viS1+€% OkUsyy¿U`'Y$ Ww, K`MJ5S0* Ok ;rg+ |.E7d"uydB-WAG?WW W =cͫ@u{W o򺽏d*xRcwꫫ .w+.!꺽U?r?¢]ux}?]^/88 Xv-a+dMu{lo7HcqF |H/88#{|쫫_W/ u{@/Eu{2)[\<^Jcq ]K8 .%S_)Ay%,9|oUU Bm5%(<), Ok7g+$ vme2MuydMuywz?4c%W'h _,u{L>gʯ|/_\&viR*Oyy¿\*m0,WW[]^W+ 4uЫз]^eWW -_y$X[}k±yIGP_Jg+%O0.w]^W;$(W•uyd;WW 7cpWsr:X hg%Ÿ@u{ a]^4%*W]c$ݾKokIs_)K8 oo^pq.|'Jvcq/S8_*V| d vJM8K€=চg+%oG]uyۮ?#}O(?Θ@/cWW]S]^ou{SUr?D>gYv-1?.j9|hn%Coo @Uu{Sf(v-2bo(d 5 xJ )O/ j|j5gʺ5{g]^=u{ҺB{Mu{z&ԉ?ǵQ{]^/8+#g')^kXtkF $?45=e5/8WN÷oguy/ b@#+;z:@\i]^5޺jAu{EUu{t@\%u{J꺽j?c߰cEu{ W@c-W Is&K\cW u{14uz/^pq %@+l u{W4GUrh,v-2%;ac/QZ9|a?| aWa]^Ǟc O %+L L D9|`J(-/KU`PoT> viČ%ߔ@il~Hyy¿(='`\auy^q?@W]^GaH]^eWWo9/B`m5)@il<>U]^ `-‚`꺼/8+#6RgOo@] <mvpAP_ W<_<{| ފ&qUy]uy6_ D/_*)>(Q kW A;/)46> T(+uy^q?@W]^G Dj/_**om# A8yH O]^ `T(vmpW4u7Yy|-(P8u]kɄ%o)47g+\oH7]EJ="uy4@\rgʯF)O(vX+vi _P_,x5n -‘ j`{]^-oK/S]^ou{ƀ,|_,u{-]i,%A?€`]^ bR?cr%{u{`E?9y]uyXFXg-,)PAWmbl%Rx0 Ok 6lHyy¿-7 WWG>Ѓ]^I{%i]^XZ01Mu{LCO?C:J{sy]^J<]DRWW'h ^_,u{3w( ?$2 [FN??$|gʯ;[co(OOmpS^3€ |A+^p9+o0y x;uyMuy4@7W?O]^aDK-gbo WWWGsWլz .we]^}urN?2Go@/_vm4(;3M@Sb_P_` ']^ cn-BBֺ]s``cm]^9nC%&䶺.WWXuyk)kmul4z?ɥuya5mGm&bW퀏,>J?lc@\u{d@ǵ%ͫ-c\|?k ?kJ9pgʯݾ[BG`;m>f?@i٠ 3yy¿=[Ϋ߭?#Cz?c+4u@AP]^eWWOopi %:34 GoH4?:?#~4cOWBMux}?]^/_@{|N9 ݶka):) OkBoW<_@{| SW+P3Mu{"c@-Au{hu{HE]^u{Jce6+F4p;u{?x]^Ǎy .wR/k/̲gE% !Y._)%A_*$o@%8 IUm%(+/ 4:Hyy¿&-꺼*c Һ^q?@W]^G!kYy|[ /v]kЖa(+ d x]^ ` o1wuy/ZHE=u{?WWu{Mu{{6c ޺@]^/8+#O_,u{eL}]^;#a2؝'ɫ/S]^//6c1WUu{8$]^O"u{8{.WWca:^q?@W]^G U_,u{6V G?~Q1N݈A׵o?f1 ϱkڷ3^*6~Q1P[؅N׵o?f1 Be[€@G?^bIkBr…_C)pP``f\O\$|̹ (x̹pPe?\≮eC ˝I]^˂^3.KW̹eBS2$weWd\&3u{. LE(|tc(uW WO]^˂S0e/u{/h#3:e]^O_>eO]^˂LEu{/ą]^2 ?pP!#"_au{. &e/\%Ff:He]^2pP1WeBTc?u{/@Ae(e]^8' p' pG]^W7_`u{. ՘]^pP5i!e ou{. xg -4scz9|}KUoEѺpy*myO ]^GbKg 6~Q1P;P m{Vc#[ZŲYuhNPQWP?`KeAS2QW2]eBGˌ?\$03.1pPsu{. x̹/]^˂#2 L˞\:f\[]^\ pPta(13=W1яWfjC]^/_W']^?u{. Lf:tW\א-Gh'+G]^G D_WWa Wa'WW| Lɵ[ZŲauhNPƶz.=|/L#_?mpPe\;(Jf\W2_Ẁ\]^˂ceA3V_W?_ pPc1ӦEeWfcLi]^he @-O]^_\$Hf:Hu{/Z)Wc?_b\ <]^ 2X<0~>?]^Wb]^">mimux}C9/r |jFÑ/+!+ r)WW`<DŽ!p]^4jSʄj U>b(WW`>[ /*O]^]^]^>7k}Oش.]^L|5U]^G]ŠuشXֺ>wJ>شWux}-ux} F1~>!ώ:Sj/Av}? E1_B] -`D۳]j` @kɊ;$^վ׵ogh! %m{V&}? Et8kڷ3_F_{fkڷ3_Au}?2v -au}?[Z/à|{[Z/ào]_OH3ĭj`q] -aWR]}? Et׵oghJ -`+ Qwkڷ3_ @װ?[Z/'?= -`Y]_O!w`L%m{V?լ[/WV oG"u{. Hf\(u2u{. ˝\%3.{pPrG_ou{/ pP`f@.{eBc1чWt\]^˂F?]^˂QIu{/ `q]^u{/(u1_"Wo]^pP31Ӧ_h4eC_`MeCɌ՘]^ G]^˂3V_`_(Lu{/iR~@?JͥIm ,; k^pTo31ΫrAk a]^W',;#Eں>gʯT.vmF q`N.y߀/8pq5ux}p3꺼>gH+z}[ZŲTա9C$ɄkW8AepW8Hep?_gظ%e.+e.K]^\_bOu{/p]^\(W_u{. u2(Lbf\?\&t̸eBS#2]eBWˌ?\<̹f\eAs]^˂eu{. 3.H]^-ewu{. (Lf:0\pPpP35i!eu{/?`e3:a]^__ Ou{. Ff:th}]^\e/W]^˂3eCcW/u{/H_]^`pP__c!u{. 3Vcu{/gu{/r_c$C_c#_c!c#Wtdu{/ ? _\W@pPdbf:2M]^ u{/f?0e5 0e 3c_c2_c2_c0;eP? u{/+e3`Fe3_c0"e3_c2_u{/ Wu{/Gu{/p9=?9/AOu{/hW]^@4:e ou{/h BOu{/W___a]^h,e&WE]^i7u{//e4Ƃu{//&e8 ? KOe B_`Uu{/jW4e _]^ ]^p?`]^u{/!  /u{/wu{/!W?/u{/!_}]^jeR:eu{/_e&A'u{/ҁ_u{/U]^W)_e S]^-eRpY]^W07__`@e O_u{/"u{/n_=e 7_`ޯ_`Eu{/K]^j/_cP?]^5e5K]^ TW_cR7u{/MemW08Be`'u{/#_`F.W (_c`د__cc/_c`:e6U]^lw]^lWE{_cbOu{/vCeu{/;]^@#]^@:e!_u{/~?'eOu{/&_`L0Ae9]^ u{/'W4e Qu{/*_]^ _`T ?  2e}]^__hu{/@ ]^WEWu{/PeUu{/u{/exW*_u{//WW\ ?_?_cI]^p _u{/u{/WGu{/]^p_5]^p ?_c5eBc#0OW-ORWUm:S_  ^pڽ['jY]^GFW>gʯڸC@Sjm J|A8pSe5/8W\\_hcOԲK]^kxYy|vm){Qk"VᇍI0A*yy¿j1So@\4c .w5чk8ں6WF WFр?ꫫ䮯c~WW;Rc?hg#WQ4?::`u{ƥ`;]^eWW.7@iu=kW ix,hv^p\Ϸo%U =u{arWWB'+Yy|m`["]ks iUR8)_"QW<_-`)uyO]^wu{ƥu~#W|ULmdu(6oh -yK+iɫwS{EAMux}?]^s[XW?G?"gcF׵o?f1)^տ(Wz%m{Vc/VlZVR0C\>`f\O\&13.uu{. %3.u\%23.eCϙ(x̹ԟ(u2u{. ˝\%3.{pPrG_ou{/ pP`f@.{eBc1чWt\]^˂F?]^˂QIu{/ `q]^u{/(u1_"Wo]^pP31Ӧ_h4eC_u{/ WH@g]^ ]^ ]^ >e pP!#(Ht'u{/ҥe6e9e*eO_iH?ҟW7+e?eEe0W _i@P]^_]^˂c]^ ?#X]^u{/]^ pP11u{/]^r,eAd(1xtbu{/(e9(,D_c&FjaeC՘]^r$W՘]^r&W? K]^?eW~WNIu{. |@iL k iPr/8W0|h\0.w:?k嘃?a]^+H2?W_ϫCOW 4cOZ9#W|U@NeS}k.a- gQ7jʫ^pژmq$KWDuy; u鮯?az`cuyH Au{J?c_c,$WZ$6cOZ9#+Yy|.- f{T}k[@Ƣ?zU/8WPoH;WWD0Ha]^z9y?e]^eWW}[Gm>j+@#'ɉ/8W[aH;WWs[]^ΰ=ºY00H+COW 4cOZ9#?r>gʯ<;|/DM )YP5kBOWW<_Amg`{, uy WM-䀹W'-W_WW|UD;|!m6Pt^0^p ][_c7꺼t?[]^*Շp%0=u{uy n>gʯ!{|,{BMGXJ~}hW5k-Z #o"_]^z 쫫r@\c:WW*Mu{yf '@'u{IV;+WÆM_u{uyoW|UD13oh=mټ%"s5k*yy¿h=,\0.w:?;?`'ºr]^z9y?d5_,u{eQWu{/W,]XW>Xef_{]^ e|a]^wu{/+@e`u{//eBS1TReWÏ\$|t@cWG]^츅]^xW.__eu{/eBdc? "@e?_e#ف?u{/_fwS 3&1e`_]^ u{. Ff:12e%]^=ewu{. Jf:}'u{/@']^;eVe\e<'e<ǁu{/&EeWW__cï\>f:21e "_b]]^B{؄ ? &HǢu{/€e= ?؆S]^fKe!pW'u{/ bu{/z8eQW_`IeD_`?h}]^ @r_`\W' W>eʿtW e!]^ esu{//We_`^@؈WOu{/W*e_V  We ?W1u{/?_f+u{/?Au{/ e8@]^?_f!وHe?kW?]^~WWu{/3e?$WWu{/Wu{/u{/t_ e\P9]^W._;]^ ? R_b*?_b(Wd?_b(W@W e@$W _d ]^RW7]^>_>/_``1eu{/{]^lW_`aGu{/_`aOu{/0]^ _``)Wcu{/]^aGu{/ 1e4i]^`Wu{/? ]^l Wk]^`[u{/_b\Tʃk:g+ +{|& WUb0~\I`.w=u{;WW'~mux}?]^/_Y{|& ?Zm_f_Pq@]^ `-OFF=?{r%CҺ^q?tF#WW|U+}[o¡`B#(yPA𧮯yy¿E@>]^@, :4p;6cRBo]^W+|T_PEP]^ `1SX3H`= *ub0Cr% DҺcP{]^e6cRO+Dj?@G6gTy nm5OJʃk & dK`Б D=u{WW!5u;j?`>y]^ǚ8 Ї SUWW'OB}]^eWWG|? hMLPKʃk </8WC-!~~|\u{ ??`!=c# WW)ّ́?f@y]^gꫫ :cd }+<\u{t=Mu{"OκpxLЧ]^>б]^/8:#WWP~Zg{| @7 Bm_20::?*?2< /8W!6Fhk]^d&{Cj "?2h${E`b ?6cCWW$c@?`dA]^ ~ʺc@1"Ċ?`d-~&WW0Jj?`fn]^o&cH}Q]^ b?`fo]^ ?a^q?tF#ۮgN%@\Icq7oCo`¢NS 5 a)x9*?0$WW<_u]^ P?[]^`+z?`f4cO+Yy|-vdm5\%f3?0O]^ R%0 `faF3 Uq %+C=u{UҺّ5yW07ںJ>?c`+]^G k,]^~Jc##WW+ Dj?oEZ/^pq6v-N~*WW8o0U7&͠=Om_a C?Ab:MW<_- L>?ïW4c# cOb8-gI|j~dJDo|Vyy¿h߷ox{]^@]ϫpqz?b8u{]^Gc[]^eWW,;|ukZ/5uyG5؎*U]^oB//x?(} [8x=(լ[/ )_oG&efW31ef?P 5` + :cO^WWYy|}oo,k^8al  g+/o> WWOa+ cO^WW >̫Yy|2:4dH_J⇍* O I/8WK UaLmuyAa]^E讯?4^q?xU]^G_,u{gʯ̗?3Om F@pl pzg+۷o ? ޯĊ8)=u{Au{di]^p;]^ @\u{5狨W'/ Y-g~% \s Eu{sW\W82[?Oo/ꫫp%J9:cq?otv-# @\u%޺;;|hʯ=[ƀkvih x\W`p7Uux3o_$j8~?)g]^RW~cj? G򺽎^q?xU]^GKg;|J9|ݾKʯLCgʯ=[o k(a* / Wa*]^ >-oBs;muyBa]^?YscO^WW;(g5;|,OxjH_bl%AI6_)hHyy¿Q+oga,@?Θ@bc*oWSW4ºBer ª?BA]g6=D|6;mH#z!2 .- yuytO]^ou{𪺼?Ŋ/_* ow<ke>O6_ *Lyy¿ā5uyB8G?@\.wJ?b@5ć?W'Ĉ7c$r ª?ؐ{JkYy|H|hc%]kVR WbAǍUWW<_o Ub@-=u{AW'/ b@~)WW|U^-DjmTP =6_>]^ ?@+YscO^WWĀFgR̿߶M %uq'l *^p׷ooj <^#WĊ B}7W/>c]^/8*#"h>gʯoE8m{  ?`Uؒ]^ o@aUuyؒO]^I{ 9yUuy {]^eW?{|B8YscqX[ _U|B ~i%ADžo_$.O]^ 1oCę?W$𪺼>5ux}?]^/_T _\fmڌ%@6_(]^ }[&Oj$đ+đ?j?kUW,WW|U vmHBGmQx\+WbHdg+ }[Đ5F?Y?=uyؒ%~ؒ'm]^eO]^˂e#e%Ġs]^J_` ?@W'u{/wؔ!Gu{/U]^"9]^"_a Wu{/Wau{/O_'?/u{/0W`Fa]^# W:O_]^xWu{/6?0;ee*(e+.?ȁ]^I_ _a<=e7_`M]^au{/ _`PPں OQ: 'Pc'kGs8]^·uLW@c]^VbWW' a 쎺>gʯ"|h+kƒ%$c t/8W Qb)+NyH]^`E$)%WW);z<\WW8q<,(ǵpXy,8m]^}?`';W1'ɍ?`'#W8xL'WW80]^-z?`'dQ]^ⷔW8&N|޺ Gr+?U +Yy|o mF qk yHh' aTkC *2g]^PSJ*U 5U _,u{?ɌM{Vb*u}?.ևڷ4aTQa`ڷaTVv!G?^buա9Cә0/a-WeC%pPdf\W)s]^˂L˒;W`]]^˂2su{. ?&c\>f:1\:ZH`e]^_`'eCNW_S]^˂2eAu{/Ws-_`?u{/Z pP!#h]^˂0e* ?pPpPS1? We_`(*e?w]^ #enW]^˂LդI ?W,Aoky/8*? =ux}u]^ /.P[Z/PײA׵ogh@]_Oc[Z/RWӗX_ uhNPƶig^y4r/L#_W׌˒(23.wpP̹eCee.eA F]^˂1su{. 3u{. Ff$?2eu{/WcL?`]^u{/)eCNW9]^u{/Z-(Ht_`SeCɌOWE(xt(y)@]^˂I ? WA?u{/R_(JZHpP'\EѺpy,&mye?]]^GH(]^eWZv}? E H-lBr5U/)_oG.WeC%pPdf\W)s]^˂L˒;W`]]^˂2su{. ?&c\>f:1\:ZH`e]^_`'eCNW_S]^˂2eAu{/Ws-_`?u{/Z pP!#h]^˂0e* ?pPpPS1? Wek]^!u{/ԁWu{. 3V\>`f `tn7v _-y"WWR"~>g@G^վ ZŲա9C'y|/L#_W׌˒(23.wpP̹eCee.eA F]^˂1su{. 3u{. Ff$?2eu{/WcL?`]^u{/)eCNW9]^u{/Z-(Ht_`SeCɌOWE(xt(y)@]^˂I ? WHWHo]^ U]^˂դeX7 ǝ [)_ث]^GHMux}?]^C^? -`2/VlV kgb H"?`)w-u{. x̹/]^˂#2 L˞\:f\[]^\ pPta(13=W1яWfjC]^/_W']^?u{. Lf:tW\f:1\:ZH`e]^_`'eCNW_S]^˂2eAu{/Ws-_`?u{/Z pP!#h]^˂0e* ?pPpPS1? We@ C_\%Ff$?(|u{."An<(oş E^q?pE]^G#W|h ;"׵ogh$rkuhNPVEɄkRu{/[o\:r_Feu{. =(t̹#u{/(03 =W1pPbf:.{eCceCդ_8eO\:tu{/`7eE?(y/_Wu{/Z?e SW =]^(y1_bب%3<بpP1!u{/_`)RWHW*35i!eC`qF qgƻ^@W/8?!Y#L*m{VBլ[/7+Br5M,I* A&KmpPe\;(Jf\W2_Ẁ\]^˂ceA3V_W?_ pPc1ӦEeWfcLi]^he @-O]^_\$Hf:Hu{/Z)Wc?_b\)m{V3/Vl +Br5M,&R)_oG.WeC%pPdf\W)s]^˂L˒;W`]]^˂2su{. ?&c\>f:1\:ZH`e]^_`'eCNW_S]^˂2eAu{/Ws-_`?u{/Z pP!#h]^˂0e* ?pPpPS1? We@ C_\%Ff$?(|u{."An< ~,Z/uy+9/D ^վ+լ[/V WP_/L#_W׌˒(23.wpP̹eCee.eA F]^˂1su{. 3u{. Ff$?2eu{/WcL?`]^u{/)eCNW9]^u{/Z-(Ht_`SeCɌOWE(xt(y)@]^˂I ? W _RWHW*35i!eC`qF qbvoB*Z/ uy+j/j}j`ZŲᄵա9CX_&KmpPe\;(Jf\W2_Ẁ\]^˂ceA3V_W?_ pPc1ӦEeWfcLi]^he @-O]^_\$Hf:Hu{/Z)Wc?_b\g=j`լ[/uhNPY`WɄkRu{/[o\:r_Feu{. =(t̹#u{/(03 =W1pPbf:.{eCceCդ_8eO\:tu{/`7eE?(y/_Wu{/Z?e SW =]^(y1_bب%3<بpP1!u{/_aX#WHo]^ U]^˂դeX7 ǝg ~F_uy+ux}?]^):m[Z/¸w]_N^bV?a ?pP2QW)rO (y!sW׌˒(23.wpP̹eCee.eA F]^˂1su{. 3u{. Ff$?2eu{/WcL?`]^u{/)eCNWIe?qW F_¸]^F ?_W/_a\ qw! u{/_Gu{/r_B_u{/k]^]^?=eaWPc]^Au{/?_`* u{/W o_a`W %]^,_a`pP)#]^,u{. &e7u{/(]^_P]^˂դ" pP郦`eTo Tk DA ` k'o VX;]^sX?=u{uyq:/_*h?Km$a(~8Q8 ?Cou/8Wݾ[ 8 rǢ_,u{gʯmgEѺpyb} [6_8k`u_,u{? -.:/+`+k>YOux}?]^Gbݯjߔcԓ`>տ&X]]_O<0,3ݯjߔc}h^տ(,:Cg[b[]b6׵o?f1 b[ WQB'{V3" o[oWQBz&{C[oz8먢9|Mo_DѰ!/ڷ/k3E'9|M[[`;QBz&]}}?X8먡 _=.i{{V1yYAa|8j(BsFտQ'`C{V_v,oyܧq!Ex;;^AoܧsA|8먡 ^w)wOojߍ1=e&vkr#/&~-$poqmp&_^BSj8?Nyߣ`tn7xyd E^b]Z? L#_.q6$m{V*.q)m{VkhV\@/QB{@3Ix C9ZqS]ENrs)of0s)x X_?*'9|j.@3|j.ռpX_?f%e~r$-K4I[0 pP/VeW"o [?[ ._x X_?』]ENro7o [?b[tMڷՋ8J(BsE+(;yߖa'a<ռp_V\@/.z@3}^ o V\@/WQBV~@3y֭_Fx$C9ZqP/ʻbo [?z&[*Պ]yc_V\@/u!9OyXIof0x,GojXC9Zq k ^{ W$v-կa*ռՋXQB;s-o [?;s-ojX3rb|WQBY̴Oz(v-՜D碇ojXC9Zq 먡 ^5ݼof0q_@3}Y[ ՋX4?V.-i~][ha+V. dP/PՈݼof0Lu Xڷ_ՋX 먡 _)?--=YGžռ_0 }u!9Ny Y ~[1jxAOڷ?X_?WQBW o [?W ojXՋXC'9x,|}of0Y:,{Vha+V. `/'9|M={C}of0z&L{VՋXE'9|MB:yߖa5 J[V\@/5u!9Lu J ~[1bAڷ C9Zqu!9@@3hSڷha+V. `WQB "o [? "ojX X_?]ENoaU@37ojX X_? u!9Nxm85 ~[1 fpkڷV\@/Mu!9hΦOc/:q?ojX X_?-u!9pc8E7ojXV\@/'?ShR ~[16.ռ?X_?Eu!9=w-op! y` ?j,J(Bs-opZ">ռX_?1]ENmAo [?yڷ0 QBơ6{}of0Erb| PV?o [?ƥ[Cy` ?j,(Bsu^-oQzռC9Zq2m ~[1Dˣ;a^÷o,ha+V. `QBƦ^D-oS/"Sڷ0 T'?C_o [?ơ[o,X_?Q]ENrC@3|uojXV\@/]ENr Jof0 Jy`C9Zq#Zy}뷐-o^5{V*rb| UP/xϷ-o_=ojX,C9Zq5u!9jcsojXV\@/3'9|w{ Wyoo [?;нo,V\@/7'?AOv-j |۷o,Oha+V. 箢'?N|Ocϑ {V_0 r/'?hU-kFүoՋ9QBƬ|~Mcv㑇0 rQBƠ *-jBoj9C9Zq( _=MWo-o_=MWooC9Zq!mu!9j!0Uc񨇴Woj9 X_?㐾ʺJ@@3|򮒅-ooC9Zq#(Bs(퇴 T-Jv{{V_0 r[]ENr󅋤h ~[1,]'@oj9,rb|K ^xjhof0V. {@@[!0 ru!92@L ~[1,dhڷKX_?(BsI Iof0;A#orb|C:(Bswӷ-o^w)gl?#Nռr0 r5[ ~[1ooC9Zq!u!9jCo [?Ơ9:Ջ95'?E?@3E?ռrX_?j(BsWN ~[1WN[#ha+V. QBƠc-oP1[ڷA'0 r 먡 _=Po˷-o_=Po˷oV\@/UP/h@3I{@ &vQ ?j]ENr!,]'o [?iHKI0ڷUC9Zq++ hM J{yߖa@ԧo ?j'9|G4}c/hO ;{V+rb|g'9|G<{Bc/h癁h@;{Vha+V. 6o-ohh@{VV\@/.'?~׷-oh_5[$?ha+V. Lc/5eռr X_?]u]EN \$ ~[1Z'oj9"C=eQDw)їGr-QDw) |QDw) ѯ\mu2: w/9xe'ZeM,ds/;հkXca]-^I&.PeuXZdKDWIsK-eeI2S*3hXr%8!I&ecr;Ys|qO-0Z%_!GkQko<9|qDKVOFCe%k&|q+YbZz5ko<ey+w%:7Pn" 4hѣFxGkOFrigb DB_4Ա5*Kz:*kO'YTA֥@86\!@tjTkvK4C:Ԩ˥bC:ԨK:ɣ!@tw(hsJv,btqKgl3e3h!/ Jpm%;^xuP< f^x!@tjTiH2!@tjTh'yC:Ԩ1YTA֥@86e\|C:Ԩk,|RxNbTA֥@86VlZXXtC:ԨVlRx+|,;!@tjTidtd8uP< 9jVUѐTA֥@86^Am䭣G7tɷy| &Xy|Rxv/Q(8a2E_$K:byޅDO@yޅ^ic^ZÓɥQ,|ƽr'Jšܳ,VCIz%3/<`?/S{-/YosKyg3/<`iz/ƽr'J>_$y ۜJx#!.lZp:\ICeb^s-ԳVG(la@S,PY V_/_$b^p 厉ȼ2// "y :KVKVFz& [̴/__؎e|\\ o%m8yηP< ^r s<Jpm4w-K!@tjTf &!@tjThY2z:*Fv!@tjTi1a4qRxJAug3D<JpltwC:ԨM,D<JplyRxW<;e"TA^^Eyxd^^O4aTWpjÀjÈDe+w)|y|e+w.^^Eyxd^^O4aTWpjÀjÈDkNeu//W4"Kjhj%u\Z]$zBםYyxd^^Eyxe<цIR^Y%%#[=Q;;//SxR5 ʺy4Q/4z&^C/;;azUYxs,r <^vveoqDeɥWPmzIge0ԃ* A^^Eyxd^^O4aTWpjÀjÈDkNO֬,#Ͷn3#mo<^ZK Fv/&,]F^tpI& Ye}) NI$y̴U' $lZ(i@jzz.9Iz%Rp>@ ^vKYCK|5h"՗/9]WZw`DMXHKDKI)^xK,GG]jϗD| +Yy^^Eyxd^^O4aTWpjÀjÈDkV0g//9.$DeqOD,a##Ey$/KKDWIhbhI4J^w]srh|.ܱ+yKKDWIhz&c̼%+$y̴DtEy$)KF^s-,]-+Ť8̼)%2hbhI4S.̼&JaWe2MNxpZ2"Z)f%ge%+$Gye#*"8!ĺr2u⼒MDS.M*+yKKDWIy$Y犉Oh<ܽdN2WIe~_f)%"T/bhI6_=DRe%w;Xı,KSEy$/9h0\X%)MDKRı4WIW2󸧢h0;aMlz&EEB./Y^O,Q\aJ-%kIkO'Y*ĺrw,T/b%=.Sب_JLr%Y$T/b%=:2Gx&/VlJzz'^i5땬9ZŲKxiK6O,Q\aJ-%+,R2^i5땬9ZŲĭb"iK6tB\]u劅,]$J{ \IVI_$$,]$|kh>5Mp=^k(#]GKk(#]u,d%Z,W9˗peKA | yht@Q4W(e%B_1+D^K/Eh)Q,Q\aJ-Z"]-%"M 8[h!/h%QYDFr1+X\u$Ĺ|ıtS2>@ ^v<4\IrEy$/Y׭ lCNuy)1ĵdeW^s- Õ)f||q_$8[._4e e2f^x_/zkO&|IrG8iFB],y̴t|KA | Zf P|h!/YD̳0/\aɥ^xK(!ys,&S{-;r ֬J:ɣ^(Έ._$Y%9uG)Q"Y+#{sVϗwZK(s,&SK|3c (htԳVG.^j/D/Ziz/܁(uEe],עQw.^AՒ^bte2q.;/9u̮V/XF5rE99/6^dd7&XY׭ nciNאe]-%bkƽt֬K %~iNאe]-%9;^AEB_1SWKA |ah7ZK,KRı4KbvEkby$]-%3hX|Z+%+,R2Zy=v|EKA DhM*-qQ0Kbފ&.l%ZZ(!*z(mh_tKƵbl%^&uH2# :9# 6Y /DeJosKyg3/<`iz/ƽr'J>_$h|Ϟ0Jf^x~:ɣ e\ C.=s*f}sshbKB˜@nfWx +_u,d["rJw/Z2,\sƽ ue(Dk\\Z"II"^p 厉hy+:'lK\?y$y+:'e%X蟒U/8rD|kb9pC]sxs-KrTh֞ODD<Jpm:ɣ^!@tjTiQ,C:ԨӰZf9!@tjTe!@tjTeB_1!@tjTeTA֥@86aDD<Jpm%;^xuP< ^r s<Jply$RxM4A'x=PZك x=PZ9b D<Jpm,ѝx=PZr lMC:ԨҐe]ARxz:*5K:Rx.^AC:ԨO9yu- &^rrC ܹz9/\XWDKWu._$w.^rнb%=\ZƼ:,ȹ|/4Z"Z;r%]su;I)rо5l/A^] jAuxioDgl/A^i,L<^vveԫ/;;azXXAx:3 $ǓKz% H2eDaU^M;`J@ԃ*1މG^Yy x:éWH<^vva̱ʰ(y uglUI&Je]A:%R 6Y|keEu/>_yXr#eIz%+YyhbhI4J^wMz<\;DWIDtEy$/9.$Deq/;/9BıtEy$/9h0\XZ"MDKKDWIte2ZC\➉X/9.$E9h\a4v^s-OD,a /X%"iVx|ĵdqZA r%Ԩ3/AL tD;aaa3c0 0 0 0C 0 0 0 0 !dC 0 0 0 0A0 0 0 0 ' 0 0 0 0dP 0 0 0c!0 0 0 0C 0 0 0 0 !hP4 8aP 0 00 0 0 !aa P\ߐP~jGy8~m 8|!ʟQ8]Tjg-R<u\M?`{ ֹyYG>\_ɓu(Qhl9q)u+(^+T k̛mlw-'t#u%J7PxY|? us y4@dѬS&VggmӊJ; _J$P褽mMkֵO un^/ tǪ[Kwa )3h߉+Z$ˋ3^{_n)u5R⯎a_+I 8 𯚼:d&K!Amz)??kC'0ANk'`) O5^'Y8%r!AmzY?K7Zi kU\@Ua/@[:}N^&8djP*rׯ℟%*|{ qꢓY#|[n^x;.ac{%ŷN F}"^&8)^@i\zKnf:D o 0Mq|? u* 2jiZhک@ird]norNma d)=ӭFtc zS<ȍDg&Oˏ]lm0ǪI!-?a+TջQ"gwUǪ[m}xY|5ku)h O:Ϣ7 K;8k\z^񻸥YX,1׿(h3z-C(ܬqRzM0Y\zv `wdPָK`[]nșL=R/uh:Ϣ7 K;})1>O:Ϣ7 K;>=R/xR0E_jx̕'oqcᎾg+6rSQ7Yɓi2g9qe-?a-nvQ3ka^K`׻͢t>a2=RL ln 9E=R;V!F<3-^6Ot>.?OI|? T.ln qڷ\g3C ƸK`׻͢t>jMSV{>.?OI|qe-?aǪ[jr#uDAO\z^I{uDo#@w_ gtUa$uDo#@w_ > +T 7w?Ӣe<~Y?c{ u3I͜Qiz?or'eI6Ϙa=RL^6!5qڷ\d(D -^6KӬ#|"k?ӫua:NtalnWN?aʼn?c{'a hD-5OG{>.?OIuI|સI2%^0lwːuD uǪ[m}xY|5պ 0YF:D guxw\z^񻸥Y[YO`ŏ:f33TZj(ܬqRzMxkT.ln lw˰y7јa\z^I{uDo#@w_ g⯵e<~DuDo#@w_ .?OI|ǪI` 7x\zv.7Y &oabq{wE%}xY|5ۭ?aO:Ϣ7 K;T 7w+nXZcLքF{>.?OIuI|$ː{h=R;V!F<0Ǫ[m}xY|5ۭ?a uDo#@w_ ln)VnXƒ~?qPgvsLK(&8X2M"2 7|BV7zD.?a?['w:uDo#@6uyr"ka=VD TDÔc\zD}e<~j/W);:uDo#@s ۧ}x[ۧ[-a,YS<ȴ4ɣbDZ3ɓeۧ 0 w0H6̊&+0q߯uh? f!bC|_'I@S8WחWƼ@⌥q^/1uaǮW@ш:DzW9x@ +Taw)=Ӭ#|";.axt^,D̘`PMq@s @slȢor ~c\zxXz<L<;0ڸK`!I@S8Wy {XxxU8Xr,<0A{(Aǜ <_/{v"Wn:\R{YF:D o w0<,\6uYq#Na`vO⯴IV0W=T"na3m uǪNΝg%)s ۧPMq@s =xXP)PurB[0'%L*PlȢnvbd -ǒ|n&} T%zZJ噘I7=?fWx)|¯ O8|qך WcW;2^=⼗K2^ jnE*!^ 9 9r㿬 4 )8:Aǒ׺͇L%{3#'>ɌQ}o7xB&S!>7vN]|U/YL~hx-_O7-ּQpqkDhL"^cE.a[q>7|K)h@K`ׯwrrh.U]:2gLKG/%y㫗`xXmӎ͓,#?[&*D0^R3aUפ9qFERU*xU#?a4=TRvHN3G&P%720a' jIY 2-qꢓv2BtɜFR92-PsXFaC9?\W}JXdr qg#sǪN ӣ&qHzB#_3!O2& LՓiQ'dѱ"VmӊJ; _HO(KrU2(I..͆?E >pP,km~lX$=I|P,aMl5ǪF͘czOօHLw"?Aq27f,#LMu\0?aTZ|n +Bځ(- #l8)CIT@hW<7Z- K;D1,Qa"_h-%tS=Taw)Ǫ XlC?Z3g}J0R3aC=Uvϖ Uۑovտwhz쪻k_ov&m׻!-{HXg_h!hl=UǪ.E=A>S Ռ7[n^x;.axtb(ĕXg?c{#cĕXgݬB7 RJɬ3 D#qE.$? d6F1K+&i?c{8ĕXg7OV`T_h0ȢqgYa,WQ+Xa?ZR&_h"Ǫ. \z7O> XO' JXE_h"U#?] LnmfpU*B"+U#?]yu޸Ln/"Yiv*D`!05aB*H~]ak\z7mvXUD- F2 ,=Taw)Ǫcq|wˬ3''W$I0+0ȂEqg YO.*Ln 3O⯴IV!h`"O\zSˬ0!q8V [a}JBґmD +U#?]yu5Ǫct %cF 6O⯴IVH}1q@J2'W$3Z1abR3߬Xa\z7Naw\ð\ѻ͢:F Kct@J0d ?%X-%rF0 > UӫDom"ܼ w0<,\ȅ![WoMaLnMJdY\F1.S˱Maq `LnB1YO.6Ǫcp#1cLfBd6TCF?2},tbNow6̤IdQ7Z7y:OO7O=R>7x!S^Ʌ_a+T}x[ 0~);-q{KwEvOYD +|G4c{'VMLTtA=RI7Pօ%dGH-/9u'!v)$=i?[_PMtIdQ7Y Ǫ[i\RKg >b?q^gF4)A)$(;q^fB Wq̊Pv]{ *D=SYF:D onw_vK骆Lʦ6owLKIHIuQ:פ)0M^Z6[^b'KaEn ly 'q:Фlk|RvީӬY|1Ie(tKӬY|5*f9?['eVt)E'o@."8eMT2:?tbo}ɓuOmM%f:ke 7`ltl#&67#۔p&2oJM6m)6öHU^[^miK/r X]]+u[.pHIYI32Otb7ґ KxXmӎNΝblFR:D o 0Mq|5"` 1}Q{={J EEvI!Nh(1w(3ɣ@Gє茩M2}.3M[9)&D_ѫT.AI!ˇ)6הIäpl/)JLkaLBRe#we 'Z`kkͣw/uˣ9D7|n@؀)+aE|j ulީӭ"#~tNΝi@w_ ^`4]"$"k'+d IRtH߭"77;Ꮍ;”eMT2h 4pHh2:?W͖= B׻ǵ;{mXE'hI)<)=%GWaJ 2@RS$ 2h;d 4e+6t2},tbN&U%y&ّDE.O֬;G=xHYa/DŽa'}ѻQ 9k!%ن")u1\z!'45^ +T&o#@[:}N^&8N6#})"ܼ w0<,\LVMDRcPk\zװƒ:uH%玮_xSb7KᎳhd&h?[wE%w_ E5c5ᙻbDTʚd&hTݓFVl|nȁ1l .iw_ S^TzW/p%hA7/hw_ Ry|?  4-Ce+6t2%ClLK(&:Bo}&ّD W4Ł+l82ֽ7XJz 3\Rw=7zoMz``5LfɃ8Lg $0aLg 0aȘ0Гq r-/DNCs V171 E)!>#3 5jLQtILQrb&(dS\-&(bb\0(YJNѻ̢:1>"N;$ Y񻸲*[8m)e+6tOM,YZ2}-;EۘEۗVNƒ[(Gt ~lȢotݾlw-%wbl' xc`7!Dow_N^aIxT hWCa@쟰°O] G=m{Iѯ^jW9y%YOtB@ x',g#@;1byZ<~x_FK,pS*QOOS'N 4m=LfΏZN[,1ʌ1k(IX"+)<``,\r `KBh݇ੌ#wCh+9^\-#~5'vr#B\1}Xdg\)<\1_7J)/sV+\_1؋}O;B ܗ!8 i? Ip#Br\}p#$O;_aS&ʔS茜Q:Dfɓe{6Ϣ&v[ﭯ6=Ab7ሱl*XfNNg%c_ڈD7%WӬ#|"!a* 2BoMS)' NlmED|RmLBI2e28lIX*nI_i߈Ix7Wl0˯aU֑Z:D onw_ n%|EY;6H'vaǪIq\)ǪtHGH.wMq|1Iw1Tu %AHMv2?%2m*$xV@ Qq̃$O[n8'f=6ݪ͇j ZH=Hy@9'EO`̒b  BR nID y34{R!r !t+B f4rN')Ȟ$ D i NK\O`$'EO`4{ $r !t+H f5rN')Ȟ ANA19.q=$ 7$r< ^T \Hbr] {grN')ȞH@Hbr] {4H0 N@yH]B@%(;9J'*O0'u%w_ Rv;/~2uՈ:C2^j PvO;_?3ɣie+6t2?Zjtb =S'9=xYX;"֨jmED mzvB\s)[l$~RDX9y JW=y8p%L1̓ sT0Dž0& 1b@ъCswJ 5jI]!1ES\I.&(Y1E+(e1EI..(}1E)>7{0)"Hm"'Ν2.#szBs ۧ1s^2-ƶ^HSIc&P%[oqb$ Yq_Cpz4m=L%DhԔ茩MQ7Yɓi2[Q%LSȘBLS ΰcna } {CyB1`$dP2 &At.RLI\MLd.(Ard,ArdLL.]L.aLfQ(5V|nB6Z5 Hp 7>C gofL]HN<7l&P%nV/%y㫗`xXmӎ]aVSə`}43Wk^ i+`k[znl1^F|Jbx -׻{gVbeOa`񇂅zw_0>"Es&={HHNre[kv : 2-ۨXQVb0+f$baW0IbaW0I!T>G zSU 8eJ)ikόAZc͜;ZQq̃$O[n[|7v[ 8`m2H'%b{d cg\E1@Q7\rÃbôl$uDZw´@67>pl Rb^w_ ? )~þTX=S[dh%R(9lpw_z S*jG (nɣie+6tLK(&8X39&!@ܟ2+M I6צ[=L[g[ h)/wn#~baV6a?YOa05Wu ){ ?Ix C:$˸[Sׯw] ڱ35a?]{ % +U֑Z:D o 0Mq|2 ~ LkU\N KxXmӎA4g:pz4m=LfΆH7DeMT2hrdYDq mI֭}j !C8 Wd dq&|8|%v«YR^A[E?o_X}3Nl"7׹@zHa|? u?XN=LSiQ'dCtFMOS)Y&OnP,\X͜BrTO bOmED}&d$k-[S-, Bbmƌ7sY|1K+0AU{g3QzI2~6LXc O^5ǪOtH߭"^&8aW.ӭ"#~t.axtcn}ƌ7sY|?G[eN=L6RgC$ 2BoMMD&OMWÍY*7yElzx!Gd/zz17yRv^w_ D)(V\zN K;"v)%jfT#}z:D gu Nc{E'o;ᎽLFVlܙ>PMq@s @sATz|-6̊&q(ZcH1_ ]{z>'=J_p$fY͝:Q1I%ur 0MqH'[K仗w_ >*$a+URI%OGH,y-u%w_f&?,-bDTʚd&hTݓFVl_n,_;Ʃ14Z#Qhl Lz>C%5:H$ ݖ|n%^ i˱9b)/sbNu搯SMTLӼpOr1,_ΝRcViF0%֢+tb^,vԳ6lÖE^вWM"ҁuQ#,}ieEűs{E Bȗ':q/enB,z<ׁMNM \,@+&&Y %'J .́(<ӆ c>x69Ly]؍`4rTV1N7̓p.;6 D&!;p/9N ӀhLr9/NpC¼@iɡ0 ,H%{݂p46V!DA4BPIud>!@b;NjWYN7now_ |7b7;1UEsӭ #~Dt`^&8qӭ #~Dt`Y,yq`.̋" `PB@K6|7S 8l1rccg!@!&힞hY_#NT @spYIt'Nc F.S Ó:"Zr'Ai^Tu/cќ4lz_rT{? zu.x5qdo1$&jW4=PLFeTgEqhHO 4r++T' "eZm~IIVvބYe[ Y,2N)XԲ T (-)΃d 2p͂́t&zvd8N |bh%Z19dK  I`,S -TSdp|t/ЎIB3-86`LxLp&BbZpW^Йِ9/NQazaœN69,L Fӊe B'4%X8rS IiňqId1%(dZurazpVdLd8N /L1*_|3nѳiLKNi6hrStZurRyA6@t˖̒Rm<YDڀ+r!\IvĮgْId6K.f]p/׻iA޴M0vWe^{FI!e' } ,uNQJpPa֡:7ot;AXk?Iufbt_I)PzYy9dߒ7v׻N=ctӡ0M NrR+¼@ٰ@=RpP_&ިZ#@q֕j.:N#@ yJ#|6|%uL#gNDh',iH%rR+C%f+QDtIUYB9wZDgNcViF0%֢+NVV eHWk+!_"Nܑ?cViF0%֢+ yGIҹ4n@۳Яb}LJF? $&Hn@o /!cn_CZ1&P B/!clW Q{i10z!tg#J#*rK,C%:wIUYB9wZDgNcViF0%֢+ӽ&=UfY PcYj!Ϳܙ>PMq@s @sA9"PVJIdQ7RYxxW?' ET<;-±e3ϓh'Bw-E'uDoȎ[W/)s ۧÀW'ZָO!DMj21QW$$̂V)j+,kgI3POtBߑ"_xSbNc{E'uDn"i?Ieq}&"%g|Ǫ[]a V6O7ٺt4FGH-mӎI|́0-cqT0=SGK`_{Dч`a' $WنbU#?ϰS̢O͢+윥!3 "M|=UODnt`xXmӎS̫O(.nY?ϰW؝lV{ fX=Ur#ODnt`xXmӎaW7^uq,B]*D`+1,3R3=Ei0!%7NF%Mq|? uz7?3U?w֓Or1,_ΝU}d-C gu4J6tHIUYB9wZDozyR^u_ _6̐gHQ!? h쐣D^2SiQ'&OnP,\P)PurG2()&\~NK`I؉ ORfo~HGGJ,NrTS?ܺX|AGjcZM@G(?s5ZZfdaWqUaqZc?%ĭBI'$&\{+5s&zL:Т7GH-㫗`xXmӎማ0kU3tBߑ"_xSbNc{r892<"#f5Z0OɢHL:b&L;:=QK59tBߑ"$e\s/n>ZfO-1Kb=q꫗_fkUZEn3^{ndVZĭDD@59Gdh" 0u\ztBߑ";.axtbxS]:Т7GH-mӎcC!a 2Z7lNLz>C%:w14Z#QhlޔOr1,_ΝDU}d-C gu4J6tRcViF0%֢+ӼNIUYB9wZDo&OlorB;NK~PQ6̇xL&.?I|S=qIZn[yY%q:Ϣ7 K;Ꮎř3ͥ'9Xor=&I1֯wRD lF/1P\{Hw_ Oa=U`g+:u^;GH-&}lJ.[=$O;Ꮍ34mS*gFA6Vrd]bVmY7Zlʵ^{+%/wC%:w$Ǫ!j`K;D?WxOr1,_Ν崘U}d-C gu4J6t.Ǫ!j`K;D?Wyy&=UfY PcYj!͝;14Z#Qhlݔ$Ǫ!j`K;D?Wv4IUYB9wZDgNjOr1,_Dz E~(:4n[1UƢ3aez!>F$쎼$&N%Ӄ2i5{@ 5yH8R:~/#p|Jh,vE ECk k@ d1'{K7{kֈj;-2!Ob~!-v! ?Ā߱ lF51a h֤xc)83Cw/BB16_01/b@o؆$\!!cF##Oc{GSgšm4~ݕ$Ǫ!j`K;D?Wv6IUYB9wZDgN5IUYB9wZDgN Lz>C%:waLz>C%2},orM <:NoqNl"7ף@w_{u3B3Jܙ>PMq@s W2(ܬ.?crؽ\z'jqYO> $bqꖬWNt.axtf.|Rvcpt2Nt.axt}LPJ' Nx !*ěfQ~Q7%hzT0I14]m:P}tx˂Eq#إ0cqd\znqɎ:P};"N;Ꮋ[Gy !d tfOLK(&8XBo '6̊&+D.O{ @b^J]}pYj׺+yc#''$CE'YawGa7/1Uˏ]UYF:D o 0Mq|,n.=Ur7CL*YF:D o 0Mq|5lSl-\z:Ϣ7 KxXmӎceHٻ93eSvM3&OnP,\!7DžfE{u_'ƽ:[w˯ -[Z#OCrxx.vCr Uˏ5ǪKӬ#|"^&87Aq꫗27=Urv HGTgqX'$qW3BVbՆE%}x[/nw_oa#FFeSvM?ܙ>PMq@s @s喏 lj()&\~R=B|=EȐ!I_^Ccrө?[.?8 v HGJDHȐ!I օ":D o w0<,\6u16vU7dѳ9ѿ|uʖ['0ZzÕ9 NPs浓p嚵Gu'FFeSvMDrdYA62Q7]%f%fu^[ۧ]KhvS7lF@hٛ)T2},D)P Q6␋kS{,w,XNZjm !3&%W~P.zK!x\z\O5nQd)==R/y? |nXʸC;/tg?4q{Kw͖j͖ھ:!O_ibO;A^s.~7yaF֏Vk^q豖]:F5GH-bn-o \y˯%x|2˧V6ƨ%,]1mŷmˏ#u/W/¼AU{\JEHCqꢭBgPBFeY3[ !#4\Y3ln-OtX.X#{@tiZ巆.<גܼ]\w_ H] _h0cph4=T);19 $tVl?ȫ7-~ \vEŒoXcl`$RB*v:08_#$k֨U1!*(I&{`O9lֲg/XOD#Xf?M67O&|B5Mf7O&|B3ꢚ ='>!SX'cp^Sɟ!|w4=Ub?L@;IjEY3`d( [Y3Pb&U># <1`>$$ >Rzdϭ@j$(R}Y3݋0:Ϭ0)"Bsd+?)79?IsV5W08_*(-7yaF?[yzg_S@( dϬG"' !h~d Ln- UXQ-{"`o:,eNmb}"e;M-7qw.Bks1/,W)72˧V6ƨ%,]1WhqnuLn q&~ZC ؀4ϱ/i\zŒo絅wXQ-2cp^)/wEՍ7:D nLcp,V4cp^2=Sܯ[SWT)fDz%>5aWC^s'a=+"׈E5r#>&yD|''SdlF3jS&0F43^Qkr_T!_/>hZG :Dp@I.uY݄-i'MƱoNA W5Q3"' 1={sOc<ԍ#i5TFɌ'Rz!)k_^k/4c{?)7I?Is9݌Vc5aR>:EnIo7r~40D)(79?Is5dl v25v)%O^HC%?'o`}Q0F@I?[SCnnCy?p/#8H\^29ݜo'q!+59rcG]U^F2ZՊyHlxF*^B95z48GaD燦QMG2<) n̟L%BF6kVUX>`|ZVL aY3Pb&U># <1`>$$ >Rzdϭ@j$(R}Y3DF`gX؅E_g*`Xe9/^4I]ؿ->ު'bwb|Z9/ω5? YdlAH!!! o#&.Tꉀ*}yHVBK&gN(QyRcm_!D[_mCXFB&\StƔKbhoՓ=ط#BX-#ԎnDQ' Dq0py\ gDQ\1*O&|Ep@'9JjXdc*V*ABF8t  V28/n9?[wVLNs}tU$hLn2~^!LNsNۘv$f5x99+bdss Q\z,rTnaO(.B{&y9_'[-Zkl'jPR f!bY?[.{ИR،0p;r*#$px@#:RZٙR|BF5Aoi?&iq01=Sa9){n WQU5:&֛"'Xj(&RJx$7016 hnaIMʎ)Vy? B DC|'T9\ DHŒɷX&^p;k&{p^597Isxz+0Z9Tz+p@W6& VL"' -[VK~_+/t0/E^$_rמ$6+䒞(ĦbmsX/u 8r\ :,eg" 'ax^ ͢&9@-TBi\8s T'=VS6'掭ZĻD4IM'&1Tdl%^B6iRDe&.Tŧ95-k"m1g!0#UY3AjČ~Qr KT|@)w\8&".&åU>p&}sXȖS]Y3EP4djɞsMu%##DN2KP9F '=Unu naqꦛǪd9Xa\znfǪl4=S'Ue^@<ǒgy%} H"8wUyA68pMArŒ~-odɟ0b+dj>&@iOC9 _-o)gR~<6|~{_K75qiY3֚o,petPvr^Зwc2U͟ĥՓ>,p@6d˗dƐ%~yЊy>,pjMlܶs'3Eo1 >,p@6-5Io!ZcpJ"IE~Q/X TsOjɞyc,KrwmdϮ 9 m0|J]Y3dj`LrX?/9">ZO>gmRIxdȠ !|gW6xLr_$rZ?S7,xlh"f(n Zڲg5X4Aʀ\{ B_޶gW6xLVLÙڪ #.^@'E$GB)LÜ I5Cr̟0w/VLÙڪ&@iOC9 _-o)Pݚ_& Փ=iYEg*(- ~7zɟ\8s U\܄)udϮ 9 nBd˗dƐ%~yЊy>,pjMlܶAGn"7Œ~WZqGr lI}dakdayda4֪\~: FoאG2FcpV'Xӫ*Ƶ92-N⃢zB6⓻\⳸Yw-ŀ@壺O{PLoq:.I 8 68n(l?&}pXPULnC?cs lxec?GXrs^xs&~|UK&y٤_Ć>V L}،[`\ܖ¥D`jjrF.p x꫚L056Ȏ*FG U/\sȉ٣Tc[djɟ'TnsXʫ&}sXȖudϮk9Jk&}sX4djɞsM@J6FĻ-rGksXȖ VLÙTBcs R|BD )~nE(5OHֱ$lـY3970n`b؉Y3~_ϘDNR}3cq\:7ePҸU׻Ы 6 ^!VkqXQު!-{Ys1$Ǫc{+scpHT,4cpHTscpHLot@'\zŒoՅwk 5^7`[ɍ!LnS+scpH+TLh0=SRΩ Q\z7Qu%>5sX&T< _C7Gɍ8}'."IVXǪH/q@D VWǪΩq2QI{,ecgN#{2-P÷W-;)YvXcۋ`-XQVaFx݃2nuLn+kUYt"e13sn+W(ǫ3ksn+)/wEՍ7:D nLcpfRocqXW =`Q\z7o͖ďpƸK`v IK^?a+걓hvS7lFLK(&92&ٔ_b+=˂d_N KxtchvS7lFhٽOۧ 0 w0\Pw. \x ɓuqM"Ң,n-;E'#nc~<ǐX'9Z :=P5IZF>kY܄޾ְ2s +TTuDo0%7qw.Du%y㫗`xXmӎJѢ,'uDoȎ[{Grn^x7\A˧ZF%7qw.Du%y㫗(R{Z$'uDoȎ[ 0Mq|? u?TZ)i$ 5Jؗ/ܙ>Pe{„w.%xTurxDuIe(HDE~/ZKX5氽TLO[1leZn汮jg^z/DpU 96Tz\4=N\ Us@][h݄Ք!vuq kkSsX^&p`H)(%aJs'X5J[D&'b>eXQI,IB.!v3iF49JVht1˔jnԘ; DoqJ7c2Wu~W3J׺+Wa6 `)I??"X#[d^9݈LRDdS*G@DV'4|э+/qc\!'P(*{ln׻75݄*sX?& `rZlOcp>J8` X#%V|;*$Cr{'U$n?tXr"P&obDъJ:X|B&TB$7E?G*tH *m.nUDk1R~Lvs' *]8iu:N̏(8f';'[$iF49JVht1˔jQH^&٣R9__5?&uI٤Ai(h1|AiAy?`S<#&#DaNJR`νzNjGJ3F7EΊzDRF#*-v:R2~mnsG%L9+JjL!QU_.IUcp D|!7O:'ܢP4Fߴn"+*Y')*X?^L#k\*Zz_#Hih֭QxCG*Dj NNaܕUI%BsG#!7^@b9le kl e k Iլ9]ڪlĴB/6G2+>̊сC#Tc{% m[l +2%v^"m9%rwDACYc2;U\cp0X,zTn ]'Mlrr2FGh݌\hQR[]aNBn2\ҝ"/FJ< ݹH\G^>&B91E 1P6}Q0%I=Tv& x*"I|Dct;'`ݨ6sH/T`2K`H9(!Fwr< TU\dxQUe>?sNQRK\u*V+ qNq1տ8#f/ur x<䷚Ho8s8&U[̓q]r$8'kwlu`C>|<6Iwkx)rC]'l\-2-ۨ](:,\QtqIݮWvoqYw, ur|1}JYT{\zRvcp )D,nC?%Z n*4=T8NՊYx*rWʫK9 5 nAԟ U8m\ ݇gʫ>s]r׻3eU忯wV7OLQ'W$.FnUqgIIDn9?%ZnuǪֲIX9%pLȘW]cpH!@XS<"cO⯴IVQhYcpDA=T)721?%Z njHYc߬R̜S&UZ^|L+L1$13R n1}J 7Ǫ&O&?[y?%Zf7JHYc߬R̜S&UZ^xL+L1'gb<{X5r9+EQ0OJd={"cLn' _hf7ƕǪ5bܥQ n+)/z]:ˑ&P%u "&>!rU*BqgsX)@TBc#~OuӬ[reZ;PpĒO S *OMݙ5\U9*crh'`c\ԙ TL^D"Tt׻ꊘXXV7)$l8H(:I]FX5OrD&X0]t.Doܙ@,nKQBM%in@qgsX)@TBen*vˮeȍۓ(ݺ 4Dcp $!pb+E_h}c\zc\)=P Ub{%]Yr#|wncp Dֱ b6%inuqgsX)@TBend%]Yr#|wncpY,n}J1 !UǪ'(jvˮeȍۓ(ݺ1cr\z)Ipl~.|IOOR)')/z]:ˑ&P%u h+!paTIY~*1UǪJ Hx+'&9nm3<#Hi#9ʢ2 !St@4UNJQI~LI]cr]t.Doܙ@,n$*ƹeBr:UH:|n"e7?\/%e7*V%X `#,ʜD览NAxH1E'6%Dĕ 7+ ?K޻eNFmɔ hB1LX@7=R={ⵖ8s#U͟9%rJc3;U\1~sJ_Y6fvcsGaaIBCTU+ln)Ǫ#HiGY*TFgh ¥Q )=\/UcqPS]t.Doܙ@,n1LX8(=R={ⵖ8s#U͞9%rJc3;U\1~R"en_h{h$޸R3 DRvcqPo'8s#U͞9%rJc3;U\1#LqO:*D Ǫ#HiGY*TFgh ¥Q )=\/UcpD$IR^.u"7nLKGv7O+ݡ eH67-׻+Yc2;U\܎`I\&W7!1~b&>dt^V'nqg ☿'8s#U*mUsrE' 'W$ 7=Tk(*L|Ս0OuӬ[reZ;P=5bt7$׻c~ST׻kXa5Τ*D#7qgsXE%zD1!K5cpt"I*=: F7E? -Y'n_'`#ƹxCG3J.DQϓ:U9JV) *X@׻bc^ X,cprRa IBም}J8\zc\)=P U`]t.Doܙ@,n(8Bcpp?d7R .@N%`ݍ>=Tk(*L67!ܟ%]Yr#|wncpxB?6d ~7w(H7!"en,.}Jn¸R3ƹR{@!27OuӬ[reZ;P; @Un$[lnR >7vHX7)2~^úq"XzOE*sݘGĜj^N9Ra*?>!>O77Oi#H|8#Lkj9R87x4!sS:NBT}z2꜁j7~%qn 0!p$J%c7EqgsW@g.DrD&X%q sտtĿcr(=TR^.u"7nLKGv7N+nl@z@g.D$d$M{c*E%]Yr#|wncpt =b{3"MJ"kRǪK޻eNFmɔ hB D#1$IB*Df7+HQvˮeȍۓ(ݺtD5cq89HV Xܭ=qgIٍI?觔]:˱帤t`xt䐧ba-%%jќNVrzSTrM`"u4l r~l#}z:D gu1׿qWODȎ?7|,13*nlorB;Jܼ*:}2&O2f?(*O5ˑInbV?xfK>y_$ 8/F nQ T#ln_CG%pQS"^Q5Cbg'`2wcLJX[wІRQV%o) ?=TR{ZF%,]1mŷmˏ#u/W/61D[+WٍUǪ(sG 7ZF%,]1mŷmˌorD bb-_hfyq s(CÚHܕNRU1IR^hQ#@tiZ巆.1M7D?L%b~R37 ZF%,]1mŷmˌnX#|k0%>QaFUǪOtBߑ";.axtb&Fu1gIhZdz-CeMR%'&+6i;4IA>O:DoGH,:[OTȎ?ܙ>PMq@s @sAIˉ6̊&+DNױ~YmbVxFn-whꗺ|<+'\BXCna[D6s+oQ0,Wnx^ŐұKU{BBc*TC`0ZNsl:ZmOD:QtF~OCrwiurя5te[ GYrwiurя5td2z6'd@'uDo#@ w0<,\6uM{'U&7cHRYF:D o\s/n&œ BU*==UbWBf \R8mjc#F9j"꜖K̘.cp:!R^g%ur 0MsqֽӬ#|"^&81P_D_%XQ7^)H٢M n!ӭFtcn0lݜ"8ɓeۧV.E'DzM"n'$-x bW=[k'`Dnn!+TOl#}z:D onw_ g[ضd I`bIYr HXct2U#?OL [%Mq|5lSe7 2Ov[}J@bd:V*|)>!35cp8C:DoGH-mӎbܦ/I`bIZl@U'ė 3F7ԟ%#}z:D onw_vNIhZe3TZjT+b\n!7&&OmMWOO7B lM6_={:DoGH-mӎH& Ǫ)} y~`ܴ&؍u1kq5QStW'|a C/N;IUYB9wZDoȁ経E~ jpN7{kֈEF#ݎ5xc n6c@߱8+v51e}hx Oq_!^v1! =27v1'!BaCQCvZրLrV~tDq{m8 ǰm8 o6w_i 0Lv`Or1,_Ν&=UfY PcYj!͝;Lz>C%V;")b*mŲ[(ܸP&O%zj=xX*:|x[8x 6̖>Q7kYxxiW0.Y0 >Oe.繬@H!.1AwF" {s ]Ns(7Gve;.Lvqm[xor]y-u.·7!NO)y@ulB n`'|fnB,[۳bw-F"=c{V7"׻ƣj:u}ɔ loxn6c{&}OcFx߬}XB*a)"VT7g;&P' N(.arM O]fE{whmO 6cw0n |BMѻB]7ZI>!&Œn.!̟lWcq5|BKawA7|BN^)cqc'`tﱸle0n ?[$7vf}ğliL.jO 65)L.$_/k0n l .l"7ף@s ۧ0"O0_h.R=q:DoGH-bN;"`D6cq1UQW$J WӭFt.axtb&J ?\5_h,PE\zN KxXmӎመ(cp0X *DXIǪta"^&87NO W$Ecq$H=S[%,\6uL4X 25_h3ӭFt.axtb& ni?\U+I +T#}z:D o 0Mq|1 7z' V@==S[%,\6uL4*15' ѢIY=āNNl"7ף@s ۧ0ТC?\T!E_h āNl"7ף@s ۧ0МCY?\&E_h*ANl"7ף@s ۧ0Ҧ7{i?\E_h āq:DoGH-bN;"a67)Y?\5bIX +T#}z:D o 0Mq|? uoVDZhrdYA6%ٜIXH @lȢn/u'K=BK<%j4ýz3. L,"<ФSG L,0rX=ShNJ\P a{ jHLߓ9Ǫ\PZnĕH}2O`\z|HN 0r TONYtt`xXmӎx H^9?U*qgunU U:f#{ KxSbN;2ˑ#" 7\y}J(cqǪMױZmqꢓ}ӫb7]";.axtb2tŘWGH-N^&8̞(:ubF+@6u12!U5NPMq@s ߬ ꜙ>P)Pur=xXPw. \W '#BM"98[X`,h )#gO=8b"N`gOǢfrz 8pJWQF0%LSs$9b1O bp8LSĘ^`Ob1Nj6LS˜&)&)צ)&)ɊyIw!} "3A2)M X(Fthz9=FthU(2 &At.RLI\MLd.(Ard,ArdLL.]L.aL7;H(PEaxivb#$嘉Әܨ2=RI2g3ݘlUv7-v)I@qGV3H(E'cP^.|l=( 1#26b BhDęv 6Q[s]&]zMVxmb c )M؄2_F@ MZ cȵǪIň'nUqu`OݨS+DŦ7'`VSQ՘1׻:THexev79?[wn$q^*Es&76OGQTB^*L"i?s8NJ^}TE1TUW12czr~p qb(I?s8NJ^͢GTC:Db(Y~4H"Nf7"'%/vvіطE^!LQbd 9){#Ϙ ~PRR^ a{`e|n*ѯ^.ROO7C!wx#ѯwr_cTNEKNLKG/ \y˯%y㫗`xXmӎ}=.$j'1!Oj'F'H1z{F)_)1$={+7%U]S:5b75-$fa/ܙ@[XZR)/v7*K\z7]\z'|y$I>7wF kVf {ǪKݍʁ5q #0"`D-MR{)?ctKH1X@OƱ 9v$qܔ T㈄0"/F0' 9v$qܔT~!$%IXR#?Ocq@7bG!'`KT z%r d"rȋ-Ň&OZJwQt6ةk&/PlQM쒆(1 _=T9-nQKu֮׈BM^vfp +n>=30gucX/|)9b1Nl1N8LS&)LSLSLS&)ϓ&)Г$O7:Su &"Wr{M1)s BdIL$..VLd+Ard-&At.[L._L< &S aTV1,i +DS1!` &=30gucX/|)9b1Nl1N8LS&)LSLSLS&)ϓ&)Г$Cs/E7X@i)LQX̀M3;=gLÁ]!2 ArdJLjd+&AqE2 e2 bd-Ard/As dhM񻱳rЧw|DD?m`j›\mwNsǂ ~O&jeif&tfT)ɔ hˏ#u/Wwr5ɐ栽hK8ooHc'[wزvE>%?H^壐| 5nM:;^FBQ/cwBwj П'2< Bo=v "O7Xj އ~TxЛ׻nPw]Nʑ92-PrXve;.Lvql峺kwi"s-1)·@na3{ d"73JreZ=nc{Ja^O{aO XױO$3((R{?c{DM1btb$&7&XMb#ZiȥŃ)={b183 R3 ?{ n^7p@=RM6,R^ؾՍ(&"BQdlqZ)/x@WT_sPNJqJ!(V/1OݧWYQxeS L 2'`3='H^I={BQ7DI={NxA{_%7&9?&ynL%I~)V .2 ܙ<jzb7NE(eH'.1{\z1cv*I?.*f7>~"E(eHdnE%C1^"h6cpf1=T"h=PʓOa5|UeE cvKMt̩S(ݦ[yku {Grn^._;*F%{ ?*F%{ O Մf_Mpz4@dzJ?qlkܙ>P7p˥ n^xYhfRZyD׺}IcW+3&]!%!$:Sq.#/38mrLaDODNw=GrO' N(.a(`(:|x[Ʌ n^(Gr@ěfE{“.a]K8xX)%;q:)%(IMkPocV7$LhExL%#Yct$I?[%5-FǃpZ`'`R{$g'`جn@3ᭆDBn=(SuI1bn?(6&q /$B8LNKg5`j&=(&m1a\zz3Yv#|[{Grn^x;.axtbJ>"n=4h3`P7הq3`!h"L(6 &j&Ds„zPMϘL=TH3Yv#|[{Grn^x74|B>Bct?[ RB<ictk'`xD#a\z䦥,rTRwqXy)jOO77Eu'2R|B>(0+TNJ\Q^ܝX\T9ȵJؗ/wI0E:&O;BzDM"a​[@#BM) <+Dc\'֒&F,lAE<#2 V1<ݙŌDXō虜N#Pb1Nj6LS˜&)&)צ)&)ɊyIw'az)# HqJbB,b<!boL ]%2 RdS Y2 )\)\ m2 S }2 S ^&L.njc ~YactidkG5տun$xBjɂɲ#׺}e0"֚T<%4&).#ҡN`K2A0; +-|nEa OE;>OCcyԟ|nCG`{֍>OE/wqnh>b¢Ò@NJ݊Հ׻Pw.hK~L JZA0&/E>i!Τ |n2GD D䮭Q1QK^J4c{Q9crPu'W$"D-=T)> 7$);1@=T|a$jχbs\30p:rb:TF'D(*T`8\A|nT,=v%XA2C |n:S? ȠZ\Y,r&Bʓu"_ lp,K/5) )ؕc+9*$V`8\G-IdedZ׻yؕc5N\~<6\0[") 2DBK!ɱ[|Z-PA18xxYM\SvI&FddA1:!2%0?sX?O1Ӡ Bb(ݺ#prIgfqEܷv*7zoH# xpO݄& 'X?s8NJ^!$Xqꤟu`8 IrQvb([XϢM1=g1`9 MO<<$Cw9B1`Ċz%_ZQh^ͅ{Z/gн- h^ Bx- /r B- ۉ?iz"wXDbub)8bF,Eˤ EˤE˔҅hr\-.W,E˖brhr\Z.xX3>^ ơXI"M3CX3Ss9<<a軜C~!fTT нн Bj- ٰ/pB8Z{^- h^{>Ah^Ѕ{q'-/DNCsX C3ҧX X _HI) E˥ EˉrahqDZ.\-.Y- E˦ E˖Ţˢrhs\ v14Sȫ12cp)E$lْDRDS1<(7ԟ'%/vd?0D#%7vOR`$dF, ajM J3"1`$]CJP|ZZ!h^E{6h^н B/kš{`- /gн- /n$78Z^>xE5R8b¤*\@\H\HZ.](Z.\M+ Eˊ"rqhrȴ\hZ.]0Z.\-.]/E˘EŅHKh5kL$MCXT57Tʃt7 TT нн Bj- ٰ/pB8Z{^- h^{>Ah^Ѕ{q'-/DNCsX "L"L{rzT3a7( -.-.-.RJEr∴\\Z.\-.ZL-E˗ErhīV&HsP U\0} ?]9J *5 nOrnE(I%j" bdR):R)EYECY?s8NJ^CV2UHE+*iXfaa|y=xұ%XPȘV] #OIoJÒqiq0~W$ 8.EHEXG8:=RЗ׻bUV&Hl%¹hwg5o"BrT@[!F $%̊V5>dR)Aԟ*(a$Vbec`@O|3\)U!`fa~WןX&$ݾ#-lpb`W$ ,8.H3"-`tP%/wq*j ) F~ i`ֽ?>9rchju~O֌OɁJN5Z?DHon~?95r9J~L5Iפ流\5ՍZ?= i`O^RX,&"Ĩݘac{J.`WPM'`'/IsU'0)F׺a"''e?95 5? jI:j^jWv殂hׯus'!ezyaoU`ʼ59blܲ%=2':ub.ñ"9DnLn|lx핎+oA7>~Uj4X~(|P4X.Sw|~XfY`&'9c)duu` ̓7Ouscq}B8H\H,1?R{r~Lat&0tИwncp)9'W9PW1r9lB8H(D$܂I)=d9?cp#*Vb0+f$ RY$a`7k,qY`&HsX U[<Ȗpi(?w'_,q\3"`31wrk,pp@vxA>mV>l8sX̀T6|K7\Jbj0phwk,,1\`gK9*l,bU Dcw ָQIٍǪe+,d >& a[=ؖr5G nDI?'1bO% VׯSȊ9 ÁNOvr#nH#?OctdY?cp|;NoYLoqF)vVbdဉ'n";I^0'nR1Vb0+f$[G,7#?OcrH'0eȄxJ7==TRvcrh=Sr-LnR{@쟱q9?s8NJ#Sݘ"F`G n'37$~N\G C؛H0=TRvcrha\z7 趴iFU2׻erB>Vcs?'`݃$[' lRocs'%An:'!!B8ȵ'n@r#?O7$?j"kܖ\zZ1<Pk\z'Ɩ׾A-׺0u{-=[u0p.*9( NcvŘ؄p'1I)=;+D\G&@QIٍ-q :)vW1 9( NcvТr JC?')NO⓳{f#aOT>vJq#Jգ9j[/Wؒo"a"¿L# V\9-_2qW8kGƱMr^LXuc>r>Osf'2?g^OɃDzNk]5c{1Q,!PO6'` 53}m$¯m!Ӭ[(r˹n,#nZvSti [;?G̢a`nGݎAnj<S}6Lr%$_ }Jx[Ǫ)fQ~'\z{7<ǪHֹfWj< sjŒ$Oܛr~<6w"y{)Q#L0}<),LyN? @vOdžݖ:9g^I͎AlWDH'n~O⯴IV&D-bk ǪKSױNLn/by{)Q#L0G35\|%xt7 1=6vrlY֞6cq|P&%oO 3a7015˘RHFr9z[4jHl7g=?LK(&8XSo6RmMWe.3֭ ~)a^'g''O??rTHGk3c{1IhQ#@ w0<,\6ua3cpWN( Kx;.axt7Z˸R᜵Nhn=-hsOF,LKNi6hr=xX"T DDۉ-VM(Qe\":$2(iY2T!0*I2W"}C½݌W9?ZO/6f*zr.u%JpX9!D9!hQ{Q]\!fT)Z`zF3 F)vĤx#TTsŢd-3Qh Ehp-8Z.lx-3h-4!hr `K? 9/D&u:bBHF)(b1L!jP*x. Zn- ) B҅vh.ܬ- Evqh]dZnZۦ Bbлr.ܾ- 0B{59J u떌ʑZ78TqS\(/T@tm?4lO77`ɯe|nKqG&Zfotu f,E.!*{݀\z S"ucvqey?[YD3܌IR6'P܌ Bȝ >u\z|ug*8O6ݸ}\z E_S2ȋ}ݸE\z0_K {)֐%bQaD6_$Cr^i'j J1L1(uʂyK~*zɀ a6q8PWų]`jxFa o#3S*BD4&^"@89I''vO|sOh}x"$LՍ=>)uq!(ظ0=UrȝkM; `|O|| J' ]֯,hr[`.a\X~~7=(Lw2zkO?$!I>7v!ii-rQ#*Gi oG S5CS2ꉃjF7 ,nzR+Ncs )硬#crȝ.lؾjB n/xX=xgmjo^=\11v&IU+4LnHQ5n W:tLKG.w*:,\Mtq9ݮVvoqAw]qH:\f79?%jb#2$S=UbčTP!InW4bhO⯴IY@j\zBmσV*HEnmЅz1@+RBaO݆|nRBJ~5X"UCW0I\1'W$ bjTcpZHU3^@2N7#@rۗ|%2IS'd#jNkQe^<`KdO,\F i?8\!;᭝'Y} f.['w_¿gA,M8nރ$g59E{&v8r1.)q<5sY6_Cs0r<w0plBw[;8\!;᭝'Y} Ň3-Nkgs '|5}Å`bWMR Cr+f w=D!A62~A'; _W(KrB;d*{'l,ZPlȢot?^-?\1L*q꫶#~G&P%ܺ[:}N^&8=l/IulpG r<&3Ȧ3SD𺸚# D'B>7x?@KPŲlq3EPj )XBS`=Zx$dE6ťTH l8P,c{*Ǫ[8@[Xei4[csкO+_hՍπeqg#)CWaWq꫶#~G&P%7OjT"r=n[OG2},tbNi2(ܬݫGx2ZwbdϬGzwpn4T-nW$`J }x[W/)s ۧeǀDL3X܈/BRa%Xqqgu'&|Eqn~/W)/wNt:}N^&9R& ~(%=R=$2\f+1'q}JaR3)ψ3"ǪKӬ#|"_xSbNc{Ox\Zg,l"7Zc@AEWPX7yx)rxif}ӭ#}:D o#u/;nsOXYe"hE)YKLSn-m2LK%zM*XpQ7o7j<vb4@JBL͢473E^i'n2/|$E"&<(,J5I s&Ǫn"i?cyqꇉW wOs~'++O3jmX;OAoe40İOߘn; dlO˟4'I 7=SHNJ^I7 -+*|ZCe:ŷN)DnJ:D nw].6\Ǒܺ[ WeC-WcwX~xvrkx HnAr0 V H=Qz؎?`*# 1DM׆9B. =ðQI{tJ#wQ KvStiZ7oa,'$bk\z$aЦ.yn:l<eȑ21ğ a:*DnBǪ#B¥DrR3&9$X3X7quOcsN>Rtݔ,,]1mŷmgQ_xSbN;ӧQ[ 0Mq|/_7}$:Ghf 9SLK(&8XS$М 6̊&)e1~K`ߓ0õweLnp kU$f.{ J+Tk^z/<v˓<!/R!n)N2u\z^YoKN 7#ӣ&/GH-㫗`xXmӎመ,n$!p-%Z7R3 `;\z)FOuNa+T 7wpѓ̗@'jFBqDDM"qⰋ",>^HM_?9W~":$2(N+P@n$62I, .K DCq1X1c'$ ŌVIA+I6e'[ěaXmE'Xl;+daIՠI(Xsv&Bmŋm6Rmmm4bM&I&ؐllLIm6Mk i6kTX$&6.IMk 65IMm`zkX_r `K?`$$E6j>5<%cRLAjc3BJ` ]Ŕ [` =\Ä ׻WaFƫ`v F6ƍ^V )l?Gĕcp2Ivl6-{Ol'15\zE1`S^ڢ ޽ڨt6-QUFC؝kا^I2Q%-BfW(kDJ-Yfn̏/w+6-{|R^lRtlQlwtSqEm'v]ٽgqܲ[GuYr"Q9$ \m}J-eqgxX9+UZ6o[u9GpQp:sExCG)Azq,.]Zfo=+ EsÜ/Tz+\ 8^W4r`ZaGB՛j+LǦ'Ç3LWs0^t`Qh9t)jsO65:UBÇ3Eu=Nf f 9QLnrY֙N=PǢz]z3EsәG!Nf}TS&'1 o3QV=PǢz]z3EsәG!Nf}TS7 Dmj"ueW>9/Tz+\`Qp:s0^W4s0^Ϫ`^᠇'}iXz* EsÙGf 3ExCG34!fZf'VET!|8s0^W^z\t`Qh`SUs֍jzb6=P|8=Rs*Tzbp:rN*= QL TMrZEb/Fҡ-lA \:U'Ttzhu*GJ(rNDE8f'hX#ֽthCg *Tz&\j TuMLDW>9/Tz+\`Qp:s0^W4s0^Ϫd0O65W碪W>9/Tz+\`Qp:s0^W4s0^Ϫ`ZVa liY֙O=Ǣ8/Tz+\=NIz^8/T7.DJ3x \W$FY"n ~lEq LDQDQȘ*= cv$E%]'N.LKtSqEPM+7;]q`:hԤ!|8IuujDg:G\!b7=R=%wq.DJ3*1,V( E&7k\zD|gUv:b7$2-N⃢zB6⓻\⳸Yw-ŀ@壺f*)鮤lن5 TAy2ˑ,nrU+`cp!F7_W ຸQI{aIӡF#qK((:,\QG.n);+;rXZ; N 1\@qAb=ntqIݮWvoqYw, ur|3 ~<0)%F6. OO7;!|8܉aR8sJӑ,*TGa åS=̇*+I>7y\ ?g#SՍVK ׻|a/a .[wbhڈlwbwe&ڃCchV r =189G!LnB%W%䘩I0bEu opf0n~+ Ld`ia3leȉFu1A Un=R3͵uW LDQDQȘ*= cpUv:b7$2-N⃢zB6⓻\⳸Yw-ŀ@壺OdB|8 9G')CGB9UD5jjJ rAѵA{j=h*=UhڈM n#6Yr"Q67aD EUH&>v4c\zؤأ%ɔ nw.(Iwfr˹n,W-“(2ˑX4)@2a}JkH&>qU68cs\zؤأ%ɔ nw.(Iwfr˹n,W-\c)S0x`>Cc#WOCcu?[ѻǤb،.֭Q^^0Qt62sSa0hLJV c{!QLqy_O?[v jxa_%nLn9?E07p8$yooK??bs\z-vrCc#|L%)ڴDIZi+82a_wq:0)9$S=y?vloݿ%v-{hVUv/WaoVrHjĄH=Sp"]UʫFMMF"Z;'Os UiYld@6[wle1Sܼ@Q -׻c\bvVu8bg7onl<F8#-#91* y4Z 9u¯i_%kܠ47E*LT7`PB0!];ZX{Z7!oyWNP0\O7ѽȖ1 y~rFR2JxDX]KT7O+6J@6)~ܒک|S(!1 Di$6a4&7A̟L7Oܒک|S>Bcpcq|[rHjQMbOݦ{⃒@U"lx'= 2ˑn:U+b',nǪM&{JE%]'N.LKGx7/¼ _ք6=x|8sTzz:GNuj^B9Z)W%uHCcҡ*=*/\ NpQRaR)fڅtYFNR#"_9ƱK_{Sqꢖ:ױO`O)y6#3^^lt NFzs Q^4&iuv̓^w{-?h)JR87}q=ĉln?[!ֻkM{95O.~|uǪ9ݫ6ÚBÒ\xr?r}}`ܜ؄;u{Z117TB:ͽQ-TSn8IݬB:ͽ̄U0!̽sV\/Uk'2ZisTB:ͽQ-TS!1Zqv6)DQNbBcpH7OmRjA R~v6)DQO v6)DQN yB:ͽQ-TS؄ha'n/qv6)DQO-IBiY~O5uhXFEn/WDm0;'n 7.T^5aՍZ'4TWllRYD3P$r'a̟ɖ{ f7qꜳ Q#v*w-16-iJV0OCQ"+^=7O_5[Jױ $80 ǪAѺƱK$&cqs.<v"aփ?\ _hIR37zE%إ%"ܺ[:}N^&8FƬn L~aQn);15\z7x(n!R~ԣA[Jױ?cpjVa 4AEsIu+H3>n٤ѻcjBmӊCX~Bg2}-͙2(kbMRxz8)ul/R)لUL$ IrRz؉q:ױVIR{JP7S":D o 0YJ}(MFs'8ucp'oqA2L7 _hD @@\zR|@C?Kӥ(Q"^&8NDnDt.a;$ Lba lX7x'!Y?['q uǪ[\1T\zP_|'Z7 @q}ӧ"7~tGrn^x;.axtb%XfBo+n#_>cp?=PS(/EkZ:D o 0Mq|? uBd2+J;nzܙ>"."[(Z岁ˑW#t- _Id<-D_"&W+?QǪxX}zЧ׺#NDvy_٠+ RC1`xņ7"&Wb 6Dz $lB#8s*TG'CG%C98Ȯ* CꉅVO7>x~YP?}{Bb q)fn3 5Ǫ[wqB_=cxAqꇂ?g#Rw%Nnq}ӧ"7~tݖ.6\Ǒܺ[ F˓ &?]Ʌ9?FbA,Wl)=ӧ"7~t.axt3- (&8XȀ&';$&ّD9%{+V|R؅ؒ.{?[fV`hYmB@D?f?In?JQJOا! ){ױP&IBUQJZOاOK`Qd'/v%>BW(OاZOK`Q1'/wd7 d%@BW( $)lx,! bQ^F7 2R{X0|RD$(^j $!(ąW)?|RD$jƥ9?JRBWj"IR{TWzv5[ Q #¿{=?jtRvT}TBơ-OQ$x.vH|Q[-BxZ SqF)l " 1N/BPZyN )lxo'ˎ$k^ j^E'u4F8GH-N^&8(HֱN)_;n^<?[h:#x#@_[I:E.xI={X_U\iTmz8ܙ>PMq@s @sA>A+HlȢorBW O V7o~!*Ln?~!*!ܳg {X.&L*4L}TBV_cp'gs z Y)OɎ`!BK~ѻxrD5LnnO⯴IX1XZR3fQIӬ#|"_xSbN;gX!1|BTx< Lnf dBgI4ܳg {X.&Lɢ<("2&cs0-'dgcZh<yr"iٍ$*Da2R33U:Ϣ7 Kx;.axt7R{YF:D o\s/n{?%@Rcq'>gU'Ҿ;ra`3&愈Jcq'gs<Ԡ\LJ|Ț.>"$ Bj}x[aWIψJHr"?*BU15jV;ra`01Q Y}#I?s>;UԠ\LJMLnd̘\Lr+TؾkᎵ g2!hؑ+VKB ?{wi>.?BM72r~ݤZ7x\̑$vl'}qlzNtݤ\:72 $Ӭ#|̘}:D loqf)1YF:D gu&Ӭ#|",f5hQ)nZIE>emy`c1Uω7|1Iu5h+;)F;_!f5eSvM*%8ܙ>PMsei")$2(ܬ.?cqq=n>);/w:uDo#@6u%>\ԁ?t>w&7 Hr~rWgv)cxq5O? GR8#IP*U'ͭ |^La#z9&c_՞ !Whꖔx#sAʬ` b3"XʃeѺ gu+)I?[vbWΠm%kD?Ρyt>|n?ߑxR#(kgac(_f(cwSwМ<<ߘ]CJP ZZ!h^E{6h^н B/kš{`- /gн- /n$OCscnaa8c `OJB1F7 HI) E˥ EˉrahqDZ.\-.Y- E˦ E˖Ţˢrhs\~H}C lىR#nJ!NJځ:C+:DP< dlG_Y"?cqNOTKBoA?IB^k0?Ai!~<]y-B<9JV!˙¥D꜄'9Q}y4h}czDPl so-vXJ[|!͂cUT wb5:oR | &2[(BEo?[ ğwbs 0ly07}qꢓ뱢cF'M4,2-ۨb74-:)ܨq5mvYٽqQw- @s^,9ED0eUUqgu D)j"yq}޸QI{cDNNhYreZ;P!E `}J1qgIٍ OƉ 4вwnc{"slSl#9cqNOQU+ &Ǫ'f77)/zhѠ M .LKGv7O,ĎdƁԟ eVfǪ'f77)/zhѠ M .LKGv7Os967 d `j*D7 H⓳)/zhѠ M .LKGv7O8 r0 ТIX^R3?K޻&:th,tB˓(ݺHD&7T@W$pqgIٍ)/zhѠ M .LKGv7Q TNl'QɉirH74]׺NFct(뱢cF'M4,2-ۨX_<΢*0. TA(_AGV('W$ U\zR|B?K޻&:th,tB˓(ݺӋq#*cpO⯴IV "D7.U#?OR1OƉ 4вwnct䘥~X1D3 ~F@`O?!M\z|n;Ho5=ܸi@^g~L u^>i!ONu'o[xv#>8np:rb:TGD䮭Q1ZN'5r#QO1(]|NqxmnR~G^|8#-r<#NThժ @&ƮB$#]H cI?%` `n)1 U#?O?!%]:4A:ieɔ hB(ϏnE nܜ{¿b~^_R$jW?\q¿اO_V!P Q[~< P]J]'%ccvI5sJJzv2D$nXb)Nu S-rTn̖y '8b'>7x'8lk^Hux@GzxQw`EqAoJT?{C9?cs2ˑ# Lnk, X*Dg,nR3"RD-A=TQ\z뱢cF'M4,2-ۨXD$u7ONEO] ˂O^"֫w RW-{'/ԟxHO<~DC~J|nZ|OF)??اl~nsBOF7dDcq77O8Hlxjy??eK`)7 -׻~u\zzv ˂O^"Ln*DO1O0r~BTt}hI?Q7)dljГ"~7w*1"'Ln0)rBCB?[wH,qܐo,=H|nGe&7f7'W$y0 i\zR|E<Մv4LtY馅&P%u R(O׻Ʃ[<['6 dR,owKFb?[wR x$%'6 dR,ou# n2}JBs=T);fv4LtY馅&P%u }QK"yY"4=QI`cq}9 ?|ne{o1e\zzB7eԚ $#v[wqmOYivbN(܅A@=b d¿H ={$zB<8vH5'6 dQwhuq¿Hx=k^ hIuekZ5v݄վyfb @`=|!~ ̊Nl15sHl+''K֘<?s8NJ^I]1yhOR)t)e'`%2ˑ#7C?uE_hIcpR3 Z7 Ǫ]5qꢒƉ 4вwncsW.D$*"GL Su'3?cu`Rf kUv4LtY馅&P%u \`Ycs12OUX#ǪMęR1Rg=qꢒƉ 4вwncpx(Yr$qq@ *DbCaqgu&j" n0=TڸQI{cDNNhYreZ;P<=? !"اNOּ VwXI-6^ 浣XX[hM[wmaaoF l<] Ԥc浀.is{؃'K֘< R~pޓcP+>7w*E.<?[/\CBi?"IV$DWF7_0-C5Ǫ].=TR^1ӣAd\@,nּYr!!Qz$qxdF'unlU(3'\z뱢cF'M4,2-ۨX o\`^cs) `9*DjXЕ\zD|I-C5Ǫ]޸QI{cDNNhYreZ;P:Fx HZOHUcsAqgu&j" nAq})bQI{cDNNhYreZ;P:T~BB&)OT0-><]) l1A$s#V7}J¸B WF('/EaW)/zhѠ M .LKGv7/Tb_l'9Qᷭ6?@=?ا쟭s#vo iE-Bw X`Wxmٍ~oݾBKDcq@kF Cn0!Õ1 ]CJP ZZ!h^E{6h^н B/kš{`- /gн- /n$Cscna"XfGg'N!Ѱnhܠ\@\H\HZ.](Z.\M+ Eˊ"rqhrȴ\hZ.]0Z.\-.]/E˘EP7`!1u2awاZHܺ'T>v&RݛD ܙ>PMq@s =xXP)PurB[ܺ<֙{>AoO֡&ّDu .]ˇI6"4& &rޒwH%Dj< ~¯\)O֙ZGH-/O!Yz*Db[X=T)>O!a/a\z:"7H%גܼ w0<,\6u $8XPOŹb ?[ >7v#sZŒoF u:. ]}tb.qXQ-׻Սl,-׻ͦ~bO~0)K!1OO$ ^;._hH,eJtcs1>O_g,`x=<>zW$;cwHd"X=bI@kU+U#?Ocs2% Uv:Řӓ(u 'DKD<_R/+⯴IV%1H O%S"OjIV%qgIn102<ǪK޻ibFiɔ hӜL.f U= }aFd͗k`j>αeQ0=x=BgfK} }hOXhO0kaao^]U?O-$lN\*)"+SO x=!t@`di,hBb#?Ocs!2OFkUv:Řӓ(u I 0FƋXh]'372a/dcE%]Nf#|zBaWuS9?0Z< ?ثUاFYc*VL/{?cp#K*b@ IVv>jR3cq'O2@jUFy?KtW)/z:u1&P%7_&OLc&)@2-E_h>H,eJtcq+DKR_b A*DbSK\zR|Q'ԧ1O ^68%X=< WFD?KQI{m1ӬY-92-P?=]*!PJ̅-ciD6Md#2k;d"g-S;DYn,#ׅ+Rőt6ةkGZfR~A'&U?E_O?'<[n!H 6ZjI=AH)YXSVc\)w9F~V=r{xZA%~Ux\{,s^$@²fX0Ñ=4.Z0 >2 X,=2Rq'Y4R(/v2/^ FB(mWQ954Ԁ HIYX0.DFy ̄P]e=){W59P8\/hqqu\ZJYjߴn"jf)IU+)6R3Tcx?K޻Y ӫ392-PrXve;.Lvql峺b&4bV1#1O(Ǫ'J7Fg<E'k!:ufqG&P%79xBO[),*sJ|<$"tN{1˒p#TzbjsY;`AUsl \~X"{XcɚUaN{1ːh 3#e!O֏c35U͟EXV/jчth''O'vqZ=+ tщ<L.[nNf8\f FL0LnDнXQcĝ(@59sX#UY;`\~X DJ1اy?%aL@*.O%qgI-Ci?K޻Y ӫ392-PA+DJ1-1O_h \اU#?Oj܁'I{k!:ufqG&P%72$/+@&bb-SŲqbE+&iU:QƧ.IQ鉩dG* -{ ,p@F \~X W)N<@5*DbuǪ#`?NS~m$59UXL8]b,%]ՙoi@[X 9b`b_hp<*HZ))?K޻Y ӫ392-P@[(ĺ<?%cXpP`bE:HZ)bOBt7LKG,nŵ(@8cp~mi"%XEHJ!^j5E+g'YI!^lR-&tl;I$ە&6$DIEIJImM&I!mI$$)mbzM:l$64ebMJl$I6bM`m5&ؼl6Mzlmk$)6&maM4IdeCϱ̇ECπyѧu$Sf'\' 8-F+«D NLGJ©NJ9nȤ:UR#χaU0gaTtV*DV˗WVي1*-7j K$O.{ĕDT~P)s<[IJ!s*zM%=@*L0 ؑez€!ϐ䷟Ôh8s1etPv=yX.=T}h8s1etPv=yX"=Th8s1etPv=xIG֏c3WEc NX(,=Rҏ |v8գ?#"8#67`[r+xsFU8Kt@˧vrqerO^H )rN`%#Pj8rUY;P),~!u NKjċ#[# Չ8&}djċ9fX\<63"\J=^r<9Bo^$x9? EAm([v:EfW-׻|E.fW-׻}mdŠzv/ 96JhYŘFJdS ]Dp#3h 5 V 1jop B;HܙuDoqAv|Ar95΀eN9%:8G : r K1t,ptr#b]4tc\X~ϑrL7zA~") 9SG-3PjӰt@2NvxZg: էaNe'DppjetSJ ZvX} E7g *UX4ω!9R_Ðh*gub@U`ӐtXt*U:ՃL~r-L4.:գcpv?Z^-l Oݧ("ҫ ,wK<)BNTb,r~_+6TIʌSŒwqISeH7|!O:?\2b ?Z2?Z׈8ڰԓ]@WaQ|M$(VM&APTruFbv*GK-5rQ>0MddlOb2ѯw뵔-xmbU$C=-=8sxz%D %*>>rr׻V l6\+3* -{ʃe^_v3V#{8re[E(m'v]ٽgqܲ[GuV"iEx3*DJxǪ'jv2b%M~Gu&+p%2yn'Fk#? Å^zܾa=xafw0pk^ Vda=xaBvFda78\l#3-yUÅ^zkg9pk^ ٭v/m"Yr)<+ĕd`ccPG s&L$/ Tjpjw!I澼'`>G G UՃ9lu`A#8Xr8X$}U`,^52I8Xj+68G U)~Byj:!E7dp.]Z-L4q\li1s+ȉD`&v=fjrU9\0ݒTj"'j+Q-{d59Ս"J2JDWk7vP(Yhk_'^zbJPMNCU)d`ZZSv%:!:j?Q4Vs;\%7}n6l-~7zhHvKn gl-~7zhHvKn9. BBЇw&.ta됄%;/⛳ umǫB/AHr%U KA`BR忯vY gT%.[aʄÏ׻#EnGlpbqTD\Ud9U1@'VMÙ⨈mV\*GՄ?&,"vIoBw4nrdYA6%W/%|;mMVb UǪ#0ZG*DqX9QʆEl I@elF)D*X6)q&lP^B_^x<lUi 8sX;T@dx.Oǂ=&h\4IVF܅'Ouܲb:Ϣ7 Kx;.axtb2Dx'D=Ud- Q븢BcCkvs2}.8orUM S$_?o<R~so1O2O}x0U>#ɌSE'W`qv+O_?vX`OدvIb-~´ux'U>c1O_?v`<[G}g_v8b-'W`]d9?[bub-r~u)Q'W`yixc'W`-^(O_?n:),}g.G^VЭ7x)>idܙ@[]r˹n,;urӲŗe;Mmr|1LRBd_hQsbU#?NՔh)ܢ< ~|Ĕi_O~idܙ@[XLSa'`Wc{XpONc{s?[wrW>#hO' N(.a(`xm$&ّD_J\~aIMZ)BG"ER@Ên2q|7by?H\~J-׻'X_!1ObL$a[v aV $)l?ay?UX~<?ow!\z'\^s8D͆-wH&v[wqbawاJ 8׻̢:} #wGH-N^&8:} #wGH-N^&8gqD=fbGຸK`Rc{|R7 E$FC7]%x#D=P 5q\-'>_!VbOucpԧ\z|n&<T8~awuxX \1  1rB0i'I:ױj4'%L.w*E%h  Skاd-W3^O~'VO-?ov8{T~7b9 n89ժ#s"Q=4l$嵣_^X!!~^􉂿bZ"f\x~gvO* $̘rȔvI l,1O@zK`n&YQ C301OWlw$6,lP[ԐvzHSbR}vѝ:pzBǑܺ[:}N^&8zش+$6XH$)e0 1OAԟwsɅ߈H '`(\OH2}J1=0>=T)>a{ا73 D$>*gptt?6\*TLVI\Ҩ э)/S#b d*D @j,OR3$1OO3]Q@[X91xK,oq:)/wNh%玮_xSbN;"f@H|x& $"f@HՊx&Q2BCP{'nwDM1OF}JrXFYOO%֍"ܼ w0x<IR^hQ#@s/nw_ D'S.%Z)i\zR{^IR^hQ#@s/nw_ D,;' {8USP\zR{\ $)/wN( KxSbN;2TO*ʑW$,SP\zR|gOȲ5IPI@n*Dax*Ǫ']MR=b,?QW$qgI~<RZF%)s ۧ{0'g U_\vV)j-<ؾy{1붽{~7bei"& ?U*)R3y䟱OL)/w<ӭ #~Dt&8DMR&OO⯴IV& CիU#?O1OL1N( Kxt^+I5I9x'{'eU)O=T)>a3اhRXy b7H%X@b IUǪ' GDv)1X5%X<+U#?O)AN( Kxtkv!%$30I)=xd)/w<ӭ #~Dt&8:1RՒ%jќNɣ@Gѓi$ɓb!N X^[\"VcdE"urЈPlA+ǟMy  >PǕ6NJI%<~.) v8;DEr+AIR]r|,cr-Wf ;gώaÓS׀0I%ih݌kZ1p fD- {pײ]DuX9 {9븣Z-\=$SvIb'Y%#>:ֻd%wQhSݾd𱗗>E]Rsž] ^l?^"B)W]&fR`]& `[̒`f)>bXVreZ;P)PtX6⓻\⳸Yw-ŀ@壺bL-1 R`ي< Db: I>7w>]y2_^Elyfg[/P:)(,x>7i)O=V3~^7O4U) kTؾ^U)i?[wcEv.^E&(}r^]8APF5{,I>7xs' }iCn@r AC01W94XhOʑrʌSOU OYQ{hKF:%k,x)FrzӅ7'V)77M$.c{MFH\jM%$.c{?xX7)/z.bFYɔ hB )p:=R>7iǎynH<!x~q_!1O?0 $U@~ö)O+k֛zK}Dn!'JL@eF+«`©έQU6̊Dk(q ֍~7o-^ĉ"z)x:zvb%X IX bYWFO/اRZ-[X<+lp`Fػv*ļE&#+n5lh9x#r'2&ԐXhOʑDz'!OlX?@K*/wqlhQwH9]e~k#9u}m S2Uq !Dx'銞dbe?c{&.c{I n(Պx#*D,Nb +U#?OL)R^]:(:)O_x?[v/DJ1P<*DD 1O5Ǫ'&{ R^]:(:)Ay`'W$y.zR3b %]EӬP+92-XKN$Cby?[%nӓAob1\pF-rTtt+D*&'5r#QR^"'!n65`/va{ qll8mhQ7v 7waУ{O,EǬSOׁ\Նk`.e~'6@|n"hV %5?vEwD%B>f^<  ?< ?Zք~f 7w,քYad~+|6! Gъx"IЋ~2? %`G'k! GъxO}j1ЃTF7JOH'Yun_) 76en"mH˘I˘& x kT=-:) $K,S$_Od̘y=K}HEaaDU)i*K`݃gE}D>OO7)POuƯ/V|M/wqm?(&s7}XJeDhJm=D!1+1?=xX"m"brX"&Nmroq@E∋- Dq֠W{%}nɓap<+`įIeZ-ro+e L$*I)'@-Ob+kӮ@FIkH*=pǃ̇$ OK)%rS1`r~s)]dV=s0T/aX$dI,]AȒb"XŪ_)5 c!Nf5V f51O'zoWv1pz259Z3ݨT#=‚rџyr&̐hO| юB|VFʒ~#?7|R'l|n_Om^B6p:r)x)s8&T< ?tv? ={bƼ.$uKX# Xg&"iXǪA*y@Uhs2\ͅ\s8Bs^-6s<\\9%:FF,F,1`oۤ BEv!h]P.Mەv∴.ܮ- ,BBлth]lZn]ۗšvh]5:)Om,1OI?FKB?Z^Bam5ad[^mF 6)[QWa*%qQk*: +D#eEH??اf(`?ք_'"j(Ku& |Se''2 ײ<.{r%%QXԻƑqfRҎNE7>gʘI?xhO݋H/+v1*-1OH%>Zba+ ~(aw:Ϣ7 Kc{0u\z<Ld%)6 ^SGwsYt>3) !-e |Nb^i\٭s{4C߭fdRfb%qꢗ_|r~>?E.*+IN[MPVx=JKO@cgاWaw:Ϣ7 Kxtb:Ϣ7 KxtkuSc)`vO&QJb&OH#?Ob2}x[ۧYl"OKӬ#|"N;Ꮋ[/(e+6t~"[(Z&O \(GrB[GW/2I {՞.?^/ Zgufg%x.Xxŀ,<NjO֍}{hWt? M޽_`-.ZmŊ{'`56 Kzy<g!9or a":Ѣ7#@6\Ǒܺ[ \K*1OAi?[T<5Br޾ou#XuDoGH-mŷmˏ#uT&Z\׻SqE,< r~ ə6޽7֍";.axtdgu'!On>7xjϓ-Oի={7w:Ѣ7L%:D o w0<,\6u115H3w=H҆|?lݜmӫwi$"pLlȢnV\~< kU|R)$I?wbӫDoctᐛM`yD&[0])@\zN|]rلFWxWYe1ТFVgjrMG]1"gr!OQ)JE'f)J:uDo#@[:}NX_ u2!?D Oe?k?A62 ^<+'; _(KrRmMP"c^.s\-7ycTįZǕnZ[n~Wi?[ndCm@S\wr_Ofl B^Ob r=C?]b籸XZ5j,obR}dDTO#-2AQ_.g(ϝ P#tiI<:޴׻.Zgͤ7~-3Gz?^r CZg$:`Dw,Sl{h׻Fti4`E=}gtUO ?>;=ԊQV1OC ?[]s~: g*x/>:e4OaLVץW.1sf!>: ti1G[^ð~У׻k^a];pu'KğrN0p]'JED Z$(Z@0< ?^W$(XׯvRu S'K`SX""rB%OIѺ"vxi'=X,czd)\'= +݌ȥ|x7|V$qtD< d)`$qtD6))`"$qtDCbO }8º"uOBğ,α'ܓ+'>h<ԟ_jE=|Oz2|uqS(O)=ӥ -#@ w0<,\6u%҄ȍ Kx;.axt7 x }8º"u1XI xOXIx:ğrN0,)U0DSױO)~͢fOğ[w9'W1-#QKc)Y-M`܈ ,=&D چ)Z9?f0Hc?+SQ'= +ymȤ /T -Z+rfVrzSTrQIur¿Uf͓i$ 5Jؗ/' N(.a(`(:~*-]x.VrlȢn/S@Ow0kwd_֬_-@x%^< Z($ub>|!O-'%ڻk"[٨<|'B1K%jԟ%ddO(i?JgKmdy@' XD) !+.E-ğO(2 b~<BUE+~<7"O( !* Rdx/Ue{ )6|X1X}2-$exdl{={B_-O(=TR{PDo[]y-\s/nw_ R^@e:D o#u/!#UY?IBT)=TBFmXK̓auq1b- be\zO[dBf ǪHՊ&X!b6Q Sq اǪH*|RTBeSE(JO _ >$B5bcMIՊY61HT`>IX"MOa%bWĕ:Exi?a:ɾ ݐhS{'2(`7yv DbyE)KqJKu*Eva)FOW D0. D$q$UXR02Ib$0!V Rl0<\*I, k F6V. XR08I D$24)T^EaH[Iֲ`RI`XR0+ˬ0-e b>y4I_h` .ld:*DSױO dӣ(728s&;GH-NOTcۧD;`+$DU0,deY=$P IIxdct:VlL5Jؗ/'BqE,n)\E7"rȋ-ŀD֡&ٔߐIaՉVZGtxKNji<;V&z^?Y6H䷏݂;$6(pO`W-{8ق8#8Xm̞@xsZ/UNl+*rV+g՗3rB"bB !shib(9PJىÐXB:mUVN#-7v8ux BOّX5R$L?Q'p;'`E_ْCsBO-֋sH-{ "X·0=z@`ly`\(cT,8w-nbHD A½ a!j){kZ9EU[ʄښ_O7 "X +=1SD@qÅ*GkL~7f%DQ4U|u!:hERc/UUrB'VsH-{R@I`Œ+rq[{X̂*9!rvNZ|n`[PX,q* ׻? b8&ÉEa `%9'I jK ·%Bs|n(H[)-$qۚF) O⯴IV76bqڄvY2$DN[ I&7mUVNˉ VsH-{R@I`Œ+rq[{M×**-{EْГw+ڄc0P8^{!\btJ. a:>:);InD fLoqd9x"Ȏ/$.Z|n)VsH-{R@I`Œ+rq[{lpɊB忯w[2Z|n-H ,8 ܕ @qϘ+)i쟈J. Hlv5t}hIkڄc0P8_1,@ `8xA%)O⯴IV7NbPD=U`[P.xH1O]DȁIOu1O?@dM×*c{CD ~:MbU^ Bhx(퉮eH&P%E;]&RwkݛVw.帰\w_ R^]:ʑNLKG,oqZ"XY*Da@@يxJ=T)> 1OvNFS(u ݬD3bF}JU-RRb"Ǫ')`0&u"7Ҝ@[XX@ 1O$l?@d{"&)'W$,5b"H]C%]5ӬzBtD/pce!>cqH8m:b`x$*Dcxk) s\z&\~H1=' ?⓴Oz$a 21 &.|_OK~alBHm}DBx7~݃+F?"ElS!ONbIV6)%:HYcFTRURwUױO)rvNFS(u b$Xpk| dl{xW'`zŸP<  ?%X'+1OR3x?K޻bkYR#})ɔ h r>K`>7kF9vQ-S\ȕ͍lȢn`(L*z-v0J+YC~ ?T^y@)#7J%Fi;5CrEFTE¯jX-'`ݩg'#pfK}ѻRxEsfyN)2)[s ~QK6){'_Es&)DI3dzf'rNSZO&WljcQhlaWQ/??~ܓK'j?[wX ,81׹*D b@`c Fш/اNOݾ}7!V#}k6 ^9'DNLS?[wafwc=_Z)ťռҜk,8[nZl7za_ا)/wNK1 Kxor]y-\_7!V#{qitD< I>7i(IU*H< F0SQ%щf#s:D o \y˯%y㫗<>)1OU*ʢ$&)LO=T)>a_اvOtij]".<גܼn$|<@O⯴IV b E)L:=T)>a_اܟ%щf#s:D o \y˯%y㫗<$|< d*Da@V)qgI 7yR"n!ODǪ[M5b7'DN6)i?[v/#)἟ /E_h1OH kU#?  )>!S/]41OI )/wNK1 Kxor]y-\ؑ~ObIV6b@R3 Nb2܃E)NOtij]".<גܼn$|=O⯴IVD O)kU#?OW))/w%GNK1 KxSbN;&S|BE#*Cb #?ObOIsF%tģ]N^&8:1,nbWGH-N^&8\ֱ/4!VاÙ?cp~Y&"n!1OvIU*$@)\zR|¿OsF%J%,\6u6I*{4?[v(ا}J@lSWF0S%Ĩщf#s:D o w0<,\6uVI=Љ' W$lS2R3)'I{tbYĮ[/nw_c eL"hE)YKLSn-m&ِq~O&{3bvIICy{=.zwrR{PDo:D n\qebn-\w_ UQ]{~OJX{ u~q''j4:gr {VQځ7.֣Jsq֏s2`csOgK)R} /SbJ~؜P<]R^@m%urӲŗe;M.BBi?#S?\@+.E6nDt<)m=bG'DN)]'K`gXIey 'eO^KF'k1x|AbH{'l01O$9? YDRy 'k"CI?iaa&ϖkE+Ɩ-$b}Co'3C@c'WؠbE=}g)dli7O+E+ bG'DN#bd)l`G1OE)_Dd,hFM|",1O-hP7|j"|gVf+.l';'`ݧ;Z?|\V]QZWďrN+.`F='KcB>z( |A_PP5=$O=R/xݙ@I`4S4&6Mބ6T+b\ ѐtjLz>C%:wa9&=UfY PcYj!͝;Y&=UfY PcYj!͝;Or1,_Ν“Or1,_Ν9&=UfY PcYj!ͿlorB;Jܼ*:}eLKZmM՜<lp7zɛ3W-׻͇xvr3_]oqnSeF)?[wtɇ֍"7U6f,[V9lјnSeF)~oqf)/wXu1dpflOS&΍[(ܸP҄/ _Ie!77(W yBN)qDf}x +T.Wh-"faK~ݾR)J$?[v1Z5G|cO7)l)EK5QSe:[ZnI@@-7qw.Bb& R1c{8#:Dq!3š?Ƨ$ժHϘQg[@쟭F|7vg+b+?[wcRh DL ً+abu#>c+b(,=T>quf~^OHǪI̢&c+b(=TR{P$Doh%o \y˯%yheȉP<4}JS]\zD)1=S@\zkاqu &.|B,1 Z:D o-r{Grn^ct"bE\B$ψQ|ņ5 E'uDFV[\Ǒܺ[:I?z7.QךIy|? QThɓeۧ 0o6̊&5I-$n"`EIcR]i>A_cQ}rbOuzo+ا I>k׻|G[kߌA~JŕO!U$US@k'9[fnA!܄݅gF< .'BaI,r9 L7"$hNf$[W;Jz3reܤۭ%N\[Z0ѤOC\]}&Mt+uW.{ݒeXatǪ.-O!W.--VSo`0Я[[aOa/@s ۧ0$0V) 5NΝf:D o 0Mq|1KVX:+5INbkIVaOH[^b WD0l8R3Ŷ)+W8j·XYOXc");:ub7%,\6u?$x?Rvt0o KxXbD1I0 E'gN F}"Nመ}z(\z \=ZWl.Om=DBJD1Oy?aY#|['u?$q19?aIӬ_GH-b}G!a ΍SٳrdXqlk.#t-£mH*{F {e՞՚d+뜏B>OՆY?[FkXO\~<6~\&wLH*&Tx븏0bV?ahNh%M-7qw.BH#FέQaA^G1^#9ժ#6ȁ 8/TVP%GV̧1|5 X ۈ5S/@L { @=NΝh Kvqm[xor]c{<@&TM2?r50Ս%jc5֍";.axt!B?:-gɓeۧ 0 w0\ "&ٔD<-.8M aI,Yl!:-SXO⯎O!E.Raea'`.RbOݾ\[ ԟ붼y_vJ6[^b V[ƸR#RS yO8IWv-yzG.Zn}Yc!:764^iw?s 1&h=bIc!Ļ: $<='I.7wOs 0ᄘ.zm\L 1&\&x#-.»l+,gVNrÜxmDrW-$+$dɬD%3' %*SLK9 ̫#2'1OC,W!+5b>$lӣ#̏ Kxtbtd!0%W'ZSkاTёFG%Mq|? uř '4mWⰋ",WW-;")b*mų_-rM)Oj &$=W//YVNJu~@["eFR%R (i5bZD_Y`e['SWh?_%rR;ĕk#ݓcDq/r håG/Tz#3JLa LJMNb5rL)rlS\LeNJG_xp di 'n. ՗qꢗ^~ ei'ScD_Y`e['SЁq{nqh׻rlȯ?b`-jYiBI@RtݛVw.帰Nw].6!guǁ{dbG`zA!¥G! sS%Cc0ȼ)aR( QQ?bvXɲRY{ꜛ1OB kTYr${1O# 032%aSF7zE'gN)DoJ:D n+;rXv7إ$#SS׈Ǫ־N+ۈOاlWB/[nҤ$jTDpzch`QjsH{\"Fd-GbC~~ue~=5=PG,=Or03_hxvU#?>p-\z(IGH-ٽgqܲ[\㇀.Db'}J¦)}\zD)E'gN)DoJ:D n+;rXv7_ u?P8'p-RmӊJ; _vlȢn,92GR?Ǫ?0DS-)-xݾVU&Xئ-j7zI\cĵ/uHoS'sH* j*+O܅&:-p5=TNOz݅)UǪGE.?UY"DW"-)q, ޻@O&|nkD#~MaA{9x ǪaZ*z]'19?bWorz=q 0^8bH=TR{P#Dot:}N^&8{ 7P%cv){WF7ymq꘧W'Z)GUǪ־"o ?\z"_xSbNc{sa ' ctU+y@=T"o U:#x#@ w0<,\6os.DÆ)@O⯴IX݊y0=T"o LSÐ-\zkا"}qu>QzQIӨ7:D o\s/ng.DV)?[E_hxt'F7|qꢓPH"N;ᎵG3Y塒)Z&O;!b=xX"&RmroqXE[B#BM)ϔMr/x_;Q8)$ n"m SHǪ[".,1O9 kTE @ H VQbx3ψJ1,$_'`vh(HBBVi>U7vZn؄(U)#y?[wbG4Hcp b:#{B[{Grn^x;.axtkgsTz@έQhȭSq3nb%|UйGcW< z\')Az)ƶZNarI.x-kc: M& UE#Zʙ8(ZfB,IWYS<#БA!ʢ0\x.9Ș(&Ჩ?Z zBrNW-'zjEUWW` ܠ9TU{)5Oo`/LSj$\<w|@Vx !M "^<?BFm'SǪ95QT@UHѤjM@txBdGd D+vIZ@Rұ0Ȭlx#̀ePtT< á2#*Ȭ.KgytxB\G@(*TNuj.s6xL1W-5݌IXf 9ej^`aTM$&$&)w'7}I9 xnA I#bxlxnIM"3?buǪ @-EQ$ix~5ИxIq9t%FZf PNjM}{[vBY_XR#"XT:*9ʠL59 /TNpUb^:*BBY1Iʧ$^W- >7x'!5Öj9ejp^`aTM2kx y5>"~Bb@ &ςlS4"}O d' ~<4u\zUD9=F)? DՇ(/9J D*IZ@äC@K59sXhI݄5cɷZr_?7M)ĎWLMɨ0 \DG "3F7@L濬P(=r Z{rHQT@lď'ڰ BXD" sJHNU|uYv&6 @ک?rlZLcpg*={)x=Pr[O92#0h)Z0jr@YC#HAdh\+TF@,rpxF/rSF"`QsObaD &R~%-qqHvrJu޸ԡ1|:^">d<-MD<bNE#؄эzB׺G-#Б˒uj^䝞h Tʼ5U( *BG(nAEc[-[VyU+B9JVW59rNY~|sxhQϰGϪb=W#- >O'(?اQ>&񻰄Г"~B^Mp䜐hI?!FO'(?اr~nI9'Dų{V5ӓ[#,rK֞a9 u@GZzEd[w_4\ TXZ<`اQIÇN6й2-P)PtX6⓻\⳸Yw-ŀ@壺X%q(r&1O^'܅DF)Г׻qXM4bOք͘>1O FǪ[_6r2UE.N&D1O^@ VQbMױ+ď'n ùt@ ?cqv5|D(BUXn]>"N؀zd_1[wD'D?ct2姀.DbIU+8U#?bFǪ:ua(u r娍 J67O^$[a\z4)*dh\Jdc#0/r*#K`$tnMV5Ú¦)xvkc/RW9 mK7k̀eUsg⨢hGn^,=f)u'ثW c\zD)н\zՇt(:,\QtqIݮWvoqYw, ur|/\‹U+yH=T"o QIӫ"7(%7qw.玮_xSbN;`Ɍv` !!)끼v`G{p=ke^8NL59%g3;v8r]\M-W-HIoSDž?x|IZO%huv8+_~1q4|_\_D#wCb<*y%k֫?w--$|UhjoF8 xOVjo/wrh50S0 Y_XAHctHcpjCVDohQ Ky-\s/nw_ D" O?]|BU)OT쐏Jդq@D,\Qn)^F~"VcdE"urM!o7qnO& rnˠ³q 0 E~}yM\z^"?Qxg?+1O"Ǫ['/ِooIIOdaOǪ#֒:Dw`:DwujاW('%FaTU_c~<5 $j^QNNɨ~]>W9"1ȫQ`GL5TGSh@QS{ 2j&(˞O&eTBO UXn<#>7jKQUaBN8b|nԊ1UaBNp<l)QUaBO>7jR"x lSPQ'`ݩqV"_Ibdl[r@@"`Hn Ocr [wGݜ빢У׻ڭ {v"E;]&RwkݛVw.帰\w_ |N Q\zNDo(%)PtX6⓻\+%NP"7t(:,\QtqIݮWc{kE}"bS{A={HQ 6.SDXQ&灭7)Ǫ[n UQ1IizZ={s_yv& ?PD&fn/~Pe;|\^!U@[?Q g'ΎCՄQ"-(-GL]œjkɄ@TLIPw~DsPNJ^-$U("Ƅ?lOօ'`ln\ikDpFB49+Tz[W%jJ%؏>aϣPTF $9/T%IDz89eDaJ0X Ң0W XL5eDa^l:)TsOg!*Ww_1K7.U^0e!x0эˁq?XK Fp2.D տuFj*-#I:9 {VSXD_|\Vrj2g#/'%^L"2e Oܪ뻅u|0CPQ0%+. AҊ.|{|\ WlY`95,3ER>OܚuY9(&Q4^L @TUt1g 5Ǫ[82ˑ,'1O?\4_hkU#?C%:v&=UfY PcYj!͜>ço(ܮ69#/wk?|ЅM>k^>F8!ÀU |nP%S #-X{E=S[%?[@VT={y֪&ߋӷi14Z#Qhmmӊkv$__-O2(ܬ.?O?jm\z^!7׻uq꫃JU|{_-P֬7oǘݾTZ1}We ;3yPS<2WwÏF ?O?+D 3f)1ӧYF:D o 0Mq|57I{ĕՆYF:D o 0Mq|57I%c(&Lv}x[/nw_ `eR}nBkV2a ̐}x[/nw_ PS?^ ݂PS>威)>X$dð?J rBޓJ tew9nR|IXɇa^)0Ӭ#|"^&8i[V2a E&:Ϣ7 KxXmӎL.t>ΝhQ#@w_?fS6?}l_u+5YSjݲ *?|/`&m)BoELoIWk욷lʪ&"$u+5gm)YRފUDcViF0%֢+ӷ$Ǫ!j`K;D?Wo$Ǫ!j`K;D?WoǪ!j`K;D?WDNLKIRm02=R>p{qcĕE^l}vׯwb,cD-כE^kvAƬSѥq:Т7GH,N( K;)sثD<,ǪtBߑ"]fjzQ){o$Ǫ!j`K;D?WA6#~LKk]BM"ͨ[{''t_z7׎&jlwǗfjɚ๨[XR{[%,\6u1T' ڵɓeprW($N־"ٗ_lj Ǫ[]k|`mѫW@w_ R]9ӣVGH,)czW.lmxVAi(~?=TR\tj#sU%_o0DQ<ďTۋe \P7p˥ n^=F"ڼvLKBgmM_ǪݤWr|̽yWܻ֍"iZ巆.<גܼ]\w_ Es.A9r1Ls #Tg mjWa4x5x ̝s"h]]d}Aj U0|@YPwZz^@蓙VG֠޸S`ɡt uu7=S֫ osF)P =Up|Ra cvaUCR{Z4Ftݦ[ykܸ;X<Njכ~O`DupaAEYG Nd)?DŽ1|W9wZkZ$fLn/V!w t>"ba\z^ SǪ[ | 2?0DkNF0%Po\zN( Kykܸ;^Kr!ur|5Q4].b =Ub_% \օ":D o-r{Grn^c{/6}72r1.VK3>BWPwZz9F SM("HI6V<&O&=y___jtAjU3cq}51Ip3 :Т7GH-[xor]y-os*}BIdVM*d1y $lְPmVs$G4F?'RM%>ctj}BIeX̒QF7OQXOI6̫YJ6iXO$f,%Tn$XDR̘IV2 j")fLS)j}BIdR$$#j"F̘e$ ).1SchQ#@;^KrW/)s ۧYլD}֠޸NQrTnEG붐mctR^ 2ΝhQ#@[:}N^&8>a7N( Kx;.axtbhQ#@ w0<,\6u1deoP6*gloyko{9RzW*G Ty|1I{3$@ 4gLK(&8X0?%g&5ܤ2(ܯyui;~)v-X_\׻" qdWlUDnf@2K`4. [I%,\6u~Dtxԃ\zĿK1scӭFt.axtk/Db#}z:D o 0Mq|5~{z_\YKcn=^RWca1DMD?mӊJ; _UB/#u&ٕb\iDj?=׮=*nf  N\6<=Pi4+T{GfANY9GV# P-=Pjs Ef$I( 8(YjIu%|@<q<6f*tY8x*tj6rMEI(8Gnq+čc: 6S&L9H IXMi%Ј_bX vFe&vrcpӬ#|"ܺ[:}N^&8x>QMN\0\ $aa6"s夔B |Y>ZCpwXbjrɂ)# -$Zk@@[n=`AG!ɓR+FX{-L<-}wzGjmDij!Dfե5ۧ 0M(`(:~)5R ~Pw.ȝ=o92},or5 i6̦c{ǪIul'7v/ɭ K((a/cHM5u7=RI+PNJLy?\~=Z$~Zzj3U!I$\׻殝h Kxor]y-\s/nw_ @muDoGH-ˏ#u/C%92},tb|W*̟2(ܮ{Y7x=R>O⃴nRBta"^&8{[!O@-s^6xXxb7פ|)$x^87ם[CL8 iQ'ӷcViF0%֢+ɓeۧ<O2(ܯY7P8bDJEJC[%Mq|/qFyQ<3lݜLK(&8XS PfE{cu=jόA_wKաGu 7yU`+p+E0vxFJ%:,E'uDo#@[:}N^&8~N._T[YOt>PMq@s @sA}&ّDf^z՟¿fKաGu7p_d%->NB妿'8Q?ا~~T|nNvkM~OqrH\u9Fr 7vG֪?ŸbdM\WUd(IoE':%|n벏UY {q:*{c5r_'Uw'!2b>7yIG֪?ų=9Gaydg!9RU {O=R={ gAUqꦃا:E't#wGH-m'v]ٽgqܲ[Gu-qynq0ZG#ī9<#m3,T*<Yr"fBb'W$!sp<>=T"n"x5=TR{O"7~t&RwkݛVw,ovsAS7UǪOkU\LaWW`*qXc0gaT'0gYg<#ǪOtFŽ[n^x;.axtfy7qꢓ:|q@[:}N^&8NDn(%玮_xXmӎce04dռҵdٻ9J9A6#ߔ w0<oɓu5 6̊&+-׻<"Ǫ['}{Ɋx`!=}x"pM\z&anC=Tߓ^pPZ])J- ݔDLֱO?%kb1IxkU#?OcV)8g'EOt> EO&j TPZbij:uDo#@sۧVL<,\w_ DDBNd=irxݬODVL:uDo#@s/nw_pi8ge2vE&=UfY PcYj!Ϳ0JyoΊu_?V&1R[j6 4AB W%jռ>jҙM3TF̺o4e\K4?gzEV塟[3>0B Lx3i7fB! F~vBjهЀBѼitv? @9va 2o0Zg9ؑ+V"2- *%BrDW։鞡TZjfq\sVgfg(UM KB\@jY bDZ3 -e?-Vl螚a F􅫌a=BҢO .'IҘO q39aQiz30鞂D[ΜrM~Ѱf=sDA"vl-gN9Ei?hs3TZjL9zg;6D3@aZZq`B?oL dVaX@"!'STI F􅰴azg;8I-f4Z3a6AoL(l #"F>= H?ҵhZ6Ah0Ѳ ,#0DdE Djaݘ] AGʖqݜ#zL/8[J<( U+Fзm<-2K5SIլ-DQiᖨZ-5Bݴ̅-TBջdx_ pxQiZ6Ҥ(ed)hj`C(`K@s xBѽ!l37mTS FĉZg R,OE+D"COP ajhژ@|.0< Z%q-DlٽP =3H$3 NҸ )m*$zBfnکZ6z W̅-T.3D"COP ajhژjBr҅Z̅-T.3a=BҢOZ7-fjal= &} R,OE+c4jhR7jչ%dfBfz)p7.33E zhZ煺-U=<-B=LP'- s18FtV WT.ҦB7f' @"OH|A;"M n Bj7m Y4TIҵhF!ҶO n.3 )m*$zBfnکZ69fOZ-d)hjqn8B-Zpޖ4n5=H6hȊzD C2 2+?v譙 a\7Mnl4OR- 6AD"2"'`58;=vEefxn8BѼl2 vЍ٭EF0FDS!gNȬâAEl[ B-*hݴ#vkazhlѲ $!A;d+ ~@"Ggjќ'38HjҊ iQ'@oB$57)@nիrKF0CJ&f[3-8T.ҦB7f' @"OH|A;" !G#"tV Ft2 vЍ٭EF0FDS!gNȬ'dhD!Ȇxn8BѼl2 5KEP@hl4OR- 6AD"2"'`58 YY'FD3D"COP afzalިiZ*Ҥ([ԅ<( ڵnIhYa>\gO rL0)*D!BTI F􅰴azg;8I-f g zgVB[J:=x+ HRHCV535DiL˦[ a#)Pcl!pA'fq ^8 alsCGa9haQiz35E\: : G`.6RJACy8 NSѬ᩼-N-zg;8I-gH[ 9jZgYoD5!O =ZZgYiL37W.yZ557CROL'g % ag-RL4k<-膤)zg;8YTL4k<-)fPЙo+Fq;hjB鞂D$!l,Sigԅ<4OL'g 9jig0ފ\T? hvp'm HS=3H$3-J-3€Ѭ鞂Dg-R-3€ѬB+BgX\pc 4L9HRHCV535$Jգ9jrPjMSж1BzYP!tN(N"9C FFp7$C"tBJ(oD-DQiᖨZ-5Bݴ̅-Tn[3i[C3vJѴ3!KDU=8e a\ȨL#p\9fOL#ZC+fp)ph\$Jգ8[J<23Jٳz?XOgpIT:! 7'z ކk#Jգ8OgpIT:! 7ҢOL( T-gnxfBfz ڷl 4jhYal2.[ dTC8 P.ZfٜS3z'Z- 8YJ8 C.] p%jќ-DZlٽPg,'38HjҊ =IoC5jќ'38HjҊ iQ'DZjxeMPm<3!KDU=m[AVVݵRm R,OE0|axCX|-*!S|-3Elz)-dٜ, zaZ.8IhҢO io ҶlިO3a$RU5NCiE 膉鞂D$?ҵha$RU5NCiE 腴 "-5B<2 Y妨[Y6 +fp+hfnکZ6d)hjG>0<[ ,> z)p> l[9fN.8[J<3Jٳz?hI-*BX["D2g g38HjҊ =IoC8ffB<2HFpuyVxܓ= #Jm(zaDEOZk< v2K5Sfջdelm U+F̅-TSa0%r["E0y`q a"g=މ iQ'i[6oT'm %HP dTCV&zG MSQCz!zg;8I-g ҶlިOXIhҢN#Jգ8OgpIT:! 7ҢOL( T-gnxfBfz ڷl 4jhYal2.[ dTC8 P.38BAl#V碙8\m*$+ft$ al=ٜ27$C"tBJ(oD4OL'g % V͛ "VTIiZg rL0)*D!BTI?jT-O R,OAVa8f37mTC2K5SL#`-Pal=8jrgZ-pٜS3z' C-DlٽP΂Ѵ$!C,-Q[3S3a$RU5NCiE 膉鞂D$3Jٳz?a$Jգ8[J:?ƥoXiϬ=a{|!“7jki_&2jPÀ7>Vgg FР"BĖ!C=73?^8 alsCGa9haQiz35E\: : G`.6RJACy8 NSpðb +(a# Yh~9jf@f2EZWL)fDpCT-4 PTw C1'Ng!iMɥ8E>Sf6O9!$xttd2 p<B`t3: tArt o{ tAИAtD Ν BU AaPH x@ A\&08"zKkY3\'K* Ԡj0t ^Āh o{AtzxEB}72 @T6ÑPW8WJ@At@*5VDCb2 a&rMrաCAˆ-CE4 N! !d98pC1jˉ*D:b`đ~*(8G:ek@X Sàf)b*½0P!# ` :`pDN% "dӠf.`_B, \N5.!,:O0zJ(0TSij Xr* 74̎,RPY7y46$<PY+` F@D- b* "UŐBLN@Tk}h 49+0~* , @WQ% TWIi4") q,O<@P1%QHT{AhјhTbN(P PjV-}4*bU9 $hPMN@yZhRBX~" #h@Ш[0  4+$ L#2(C3GRtbA:. sA\*`r`Uhz*YqT8B1 U@ T-$|1'!HZJ|='h IZNAa Biy0Y:.@6APŔlK:.`HH!P ,H:.$0|] BRM3El;P|*HB At‚n )Mo @#j `*}5"J }HjR z!P hPɢ@t @X٠ kA@8t Gń QP@\ @ب " P|3 H8A4 Ng@ՠq 1AArIxX:pHAbvL΁ 4rbt Rl Ip""!Q`vA, Ȣ^:hH,oT" '+'Dzt ER HAX |"R ]A Ό lQ:M:n 2:??C:N**A1^= @ATHCXht0j/P/Rt/@25vŠ<9&pR 1 TN=&g@ !Pdt0 aB%:0qSB|v ΀8ODT¡dTO9p~'s B  5 tKGGbexCŀ(@ ?(N8! ?( Dt8!*Q58Ԏ8/D^@ :O(. ":OPM%Ә)CӢL¡\bED\U%+ rhAngEq" W:s#X ~` c@$EAPp@CgE"C.;T='E@  " N"T \:/>& 40:/x " 'EFf`O t^Jd't* YF.3, 4p0E)%"4@CE6=XP  8 1|* $!xZt^.C?"&f 1xAp#tDЌ sV`$AFaHY:0-A_:P37A*MfjnPP!Pu?7^D1R v@x>:`_T!4p Ȩ!07jl[ PPbXt `BPP&ԤS:LrF@|r;0nLW:PO qP($pHw8 \Ƨ@VFXt*6 $儳n*h<-2LDd@ 5PXH'#qPPit@61+`+#p@!ppeG@0|8T? Ku!X'jb8!)ERp2Gzg@/ H pj@̋H#kP- A!8%JTp3t/^ @ "O%D1:  *  @ઊAZ@0T10@' *@{8T:taEH@P 0D (.p zu|`p )?h΁ qPH9t #r H pn$:!X~.Q!@t$PPE7Nlr2HTMPFT@9% *q1L ̢! .9"9ו) AO7A K@zr&,M΁H#D$ pNF $mH;:%i⑳Pph 3:%u,悢6G`9:%C\S,8$ldfa'%d3r_P F!SLΒr|&!x9ÂIj0%zӤlrt_6tM4hX/Y<0R΋l- ܄hX A!?B0D<:'%â+I$E _:/ ,Ej5 S%,% @ ׊|`5RE,r)t_+ROn_'Y O:/=)F7!3:.]0JpxIJ@ |觩WQx$ 0D (" U΋`B]@P=%L:10`&Mb  ER:Kh A)# Mcмt_abtŀ,g@j`@!Q3H@, 9D 8:l `.;es? @ПppeGE||g@ cr~hZp譚ith4:+V<0)@(Azzta)&?PA6 $儳tLJ@ \Ƨ@tel΀I:$ȳA0nLW:CxMdt@hP&ԤS:A:DXt(\_P,\:@@/"@z h= M@HA5=3ȿxN'P~/C~3 Q|Q^t(h:uc|HO' 5+ B:"02&``$+i`#=,   $!xZt^N44'D!p]@Dt(F2 @a"tUK4A&trybt)VfL@  z)ٰt NLIi EN;pW5о6@J8-:jC`nLG:WPP0;:: D0ft̓f (:f@z \ _@B 'ErhAng@2Hv$TEa;Rh,:+ 'ztW)1谼`nQB 9bL Y;>*N tXRHG@QA#[J &",:knd; t#C3GZ:`/ݛ1PC4M΁؂'rt*A8@@7Z U"Bbt@ AЫ^tə&*QP xtXlU>v( :Ȗ@ ƃ@LbiH'@UpL:hBḾt+]D n%gF Et+Fpr D S*' 1,=:KEщ̞>:RXCр_@%K'@S˺:@%h?)'@)<ųz3A ܺ>:EuQi5Y= PTt='д8:/ݠ.H@t 46:pT +:p$$H'@t. @L/zDp^׀.z[BbhtPD@~@TO4݁#zy4_x' à %PVftDQa@z$ahzt>~tDи2Ӡ & AتK-8N>b0 F@JN {d2D½0B^t zQ|t@nt |NH2I-Yq%H@#l<At@:4n  @V"H] 'Eӏ àz܌ "**}GE @a= 4 IB*ȃcp.t]q-рŁ( 4s@躓Qp':0&' bhj[:..E NX*@!Eת,S&1PAN`2:0$A)<+: ;9P#058xΌP\ sXeAFTr8jfӣ x,/B4jq@0vZOb* |ԥY5+xNx Hd #6TG@Եjpzt`. 'tG ZlN@\0l*`d (@k,<:`$P@Zt37 a5 DHP@y(@ z@Jh |( td?7 |'x`  RGO@V/z @=D& h^7A<6$8 Kz lZt,Y cAP'`'@exc:V⠯KȚx]G@(+ `I Blyt?!h+(HA0:<%ptE`<"R'!6I`΁B&&APU ސ0#b:h$PB@صS(Ni!xx`: E)H&#Bą ꣢ρv @ Lnt^8@rtI lbXt^<0 *AP)9PTt^qR"whF@1,bzB:/$Y:/ALp [Ɔt hA(#kJt+I~  ΋Q:PALr*򸪴Nss_ H&0(IB Ht %IXT` [ՃF!P Ðlt ^j't. )-rTt#T2)85  `E@ C\t t 1:F^3$[&@ J,th&@t K:+w;Ӱ$t3V!p >@t[f`zJ:QxqH/LYw:aAQ:@dxt+G:GjCf@Lthp" N&@y$\-L73nʘ )ƒtn;%*%$L ht^tt `l4 fBم$t R!XK`@Qs2FX0΁ a bN-@@P0tϼt 2PMf@ NB:$ 2`?:,\0xH>aD.+0!`bW:i ΁MI( X.:bPdt^45;CbЪrIFt&t 2NgB NXNأ0 |!2:CP /:e5 Ű ЬRSx/N  ((( WcӠv]8jt bX d %àva~^>:*] / p4 f$ 1jt hI`tŢHt @B<xԝp 0+$!ȼ$c*X (:AffJ:=Y4: Є` AKcx}%LtĐsP EIQ$/6S?AEA g@Hfbt&(PX(ď)S 'ҝQV@ @nK:+:o@D0> Ӡx(м]:%F gϪ)#Pd3CNpp 9)A@GF/T3jMȂR$g@*)t`F`P:bt @' p. Ό l }H]$@>; KQ΋XgEX:0 p Y|)@O:.Ba E)Jtzt`,P:.aEB, T\K:0&z\RCdh]jt]Gx& * B0Ό ACDIPt < lxRqtQ4ZTtMz@, sTV#ǀ$U:.HPB0 @/V(M$FCV2`6%:.T@5Z=>|X: z9@l3 "Pg@+h "'xj΁&3}@ җRg@AY0hd@MEhT9*3 d #z( Nat `=,%GEP f@)pzPyA4p: / ҞDShP8Y !@A` :1@Kes2 ΁ 6B0(yA4Z@8 `.x^@1btCXNV.B t^˃f 81R`t 3F %N@=x1:MI`=QFt C#,.(B΀<`3 ^@i-<XNӡ(8F#|lZ0&z--:b:ύɧ@̕Yl @H \zg0&:mSS@02A  |Rt,/#fpNRtQ@K0Df5=b<D\ tx0$.:dXP2:<,! |1#c:L-Ӡ|}`.p ˠ&-`(t+GB1' $H%:n, Šz 'I7:8 áx0J c|R^p X i-@M&yмT1h);s|( ^@# pQt΁gмB %(t 1|΁gC мJX'!.HX@ȒiB+q :>0áx=,*p0@,:0xH/:Ǒ y(epH8V?~'?h3}rVTIJ?*+FDjҢOzfq-H_%_N'ҢOQ)DҢOTI%8=Dm*$Z"V+V ?k?RgGZ5KTS&$JEDQg+TYk9"vJٛYv&%{s#!6hٻ9J?G ;_VTѻo#Ri-?vҢOٻ9J?3Vsҩڴ饓iQ'S饒-3=4m*$vҢO=4Ez?iTZSWĭ(kM,JҏiQ'FUOKJm*$SK$Zg;SʏvO*-'O?ȨPxE"AS!!"ML2k9"v=3Hc=َ"z6JiBDMZSW#)iT|C!RHÊ&HDI&W7?3S& ڢN?hi8<̚H$JPk-52lݜ3S*ZU;&ꩫF,h?5$OCfm*$"*ZU;&~!NHH4~͔3iQ'c$%TOF>!3%6z[c3̋CJ_<̧m54nfN';jf $jIA7DDn٥Md=HMܑ=Mg$N7B & Z6iTRݬ4nF>!8*axVU-(tQiz3dHQiz4gInHTsTѻo"O3rD}ܑ=橣vVNH$jjdzf7m"7fvN% F>!P W*'JTٲMS{3Q= ɳvshBh=52Shϙ-5OC"DRѻmvsfܒٓ9JF>!RJ'}5J~vN'vzC5k-Shښm4Sz:'FN(I}c6ҊI*nHS)fvۊE2S&-5OC&ҢOHf= n})PgmS$Zg=)PgmS'I%MMvUO2&sJ֦U4D-\6j7lʢSZe%RʚT (ʗRЗ>t QZʦEfSFTJq>ↄjgMLOQ%l3;&$ flvM$\pɳvs$jIid~ɴ"KJ3(IBnΟf@GgG3YSITM,WZg~Df%7jbWhP-5OGZj36h52ÆUK*["8FfTTɣRgG3flFUG3CvQ=(L6z z*hijF2+TN-*oA+ӣTvfUOiѪd;ii3&ҢO'fҔ6R%hS1 z&D@AjVDevԡ4pɴ͔iQ)Dhfl?EUC&FfɻCYKUT2hjoD3Dn3$ԲjҚBh=52m=D!h7hijhݷ$"2qDDQ<5J~vU!Q=(Mڳ'"z LPjBɣf4B\4nRҚm1(SjeJ+ vlFfʚ* 쪞d&M36H٢,5љJ;* F~͕57TU͓w賲dTIfl?EUC&s6t QZʉꠔf譪΁*+ZQ=T3A)[UTV2z%2g;YI[2y8oEN%iC&y8' ĭ(dѝ?#)$MDevԡ4q͕57T"7fvM3dݚ+YNڪ L[M͕57TRJ4g͕57TRJ4g͒#J(oC$dTIљDiE dCtW $FPކH47EpʢSF>!#3dҊ?љJ;*IT:#&љnPvRU Ec36MJȑ+TYChUK&"JTax͕57TJ;j6CCZ7lv&%}$8fS7mKJjĤ{3fl4V36TމPgeI*DdTI*joD3MS2$[6gSSz%A$jfA)WK)J~yg-M\KE,7jbWS)QjBM&2Dnvv=w*$)[ O36H( hnᓊ7DjeJ+ 誖L$4vH47EqO3v堔ɫhHTOJvz[4jռѻfMg=|C!#3eMMvRڦM2vѻoљDiE dCtW N'LNS*joD3MS2SVѻoax͕57TRJS+*'k-MflQCz "D홷.'I4g;j 4Ff7 \2B%8I2dY[6*"Np~:?Q?{Ø5?+~iQ{>{b?4G{q{b'{d/?u{A-! "~95C?) ?O}'~?S~=G濨#(W }?O{?.>{}g4?Q{DƿQU'm{_`?4W~{?5?gG{ ~W?'柺 5C{,{@'_o;-}g-{3O{>-?|]-O؅?ٯ?a {?N#?{ ߄_5g{__{؞? iG?SbySKO{矨QU}?{do|([?kQ?{h{؊ߨ~RG{ u{ O{-~Oa_j{_j1O5O~F_!Q! KI>j{@6cO{A+{@8o_{PC?o|Z+{ ~^C{nk{ş){B{ȅ1]{ 5_ه柺 'BQG((~Q{G{p6R#wJQ?{Â?UͿQ{EQc?sO{GIGO~&8O?_`_?{_{R?{E{v{u_{EBG柨/~*G{}Q{|,~5G{v\C{v|m9=?{áK?Q{I Ɵo)枣 0&o{O{2!z;^ ?jB{VQ {Ã5Y߷{i?kqU?U~6,J_E1Q{Q)_%~J`q"o{rV=E{bu{A/?u{>u{?(?ҿ|_ 6L_#o%{n)~.?G^G{V  4{lk{O~?u{>I u{Cb?{eO{{{m}#{?{Ȃ=~i~;g{"G|ߨ#Q Q{G.~>?{~[>_>_`G ?Q?{ت_"w'{E_1[P{}W{EO| ~! {[ߺ _{ş1u{E-{؎H_ḳ+_gC K̊}i?4{hB85;_{@w?ؽ?c4[?4/?;{ ?^4w{,O[_Og"ء?}W:K<"7=D_b`{v+~GC1_gb?G{n1aޯy 4Vϵ{J?QOQ{FgOu{DQEExex9<`kQoߨ!!0~=G ~ Q{x08G{ -w xQG{ QK8Q{K;0,c_0Q{F Vv+UKW3V[Lmv+UKV;i蕪饫 zJ衽0Jիynݜ'䪧 Z52 Vn4k9ޓ? ja yEvpZT vhDd6!ҶiT4oHU KJLOCiZ=7LDᕛ6an~ga#za$ J͛&DpJѪ-I1&ySVE 腼";8I-*B4FH3ɫJjm٢B7l3Pҩi,!Pސ Z5$!3x+ Cc 40v!K=#-Z֚ջ4DV.l(R̈sV5E[hK=,a!bBp#〬. CQb2hr; V㖭kMTQ)AZL)fDpCT-4 PTwbCrpBCt;_ +GzG#zoI#z~agޓ?sޓ=CM-_Z̺ijs PވF=73?׎@[1d,Z6s3TZjQiz!-E RhsN8GG38apj C0DÑd,Z?h3Zjr TeK2#Zl!b,#C1 ''d_) >/#HRɕ)|`\xepvp{@NܭSgzL〬. CAbu 40v!K=#-Z֚E*]2PjMSж1BzYP!rC2 C0c?ޟȠ4&ҿoW6 ȿ蒵joDV}3Hi4%~$4} >z)iMSkDt3Z' ODWM-Z Vv+UKV;i蕪饫AJtՠz%jijgm=]4h3ZZODWM-Z Vv+UKV;i蕪饫AJtՠz%jijgm=]4h3ZZODWM-Z Vv+UKV;i蕪饫AJtՠz%jijgm=]4h3ZZODWM-Z Vv+UKV;i蕪饫AJtՠz%jijgm=]4h3ZZODWM-Z Vv+UKV;i蕪饫AJtՠz%jijgm=]4h3ZZODWM-Z Vv+UKV;i蕪饫AJtՠz%jij桥M&*tZ5iSI]4~SF*i=+jhեM'tzHw 2tvAFzAFzJ8 1 D>[T( 3vsќ( 腳vs7PރCm[Bz-C7 QCzajij 2gDޓfB=PЉ-M\gED?[C3v Qh4zaDEO煬 HRnq7C( ٴ 0R$4R: PԉLԴJim)CB?~ʊGA7襥5NڨF4lިO煻hi[Їޓ?٣dO';j ҶzB<(R̓-+6tOM&vР3f'-HH2CR%3R)XY *)CPރHR;8H'v7)I͢NڨH'͝L (oA#樴=gޘQiAyjjB-pV(0 i$ҢO JaDiM- €ވZ6z%qYOkޕ(0PvpO!k)ioL(R'D 蝵PKC2LO =4I (oA#W ZM-Sٻ9 9 Za  A7fsVKTnxH#Na3zaBH#Fc;…-0Gه~@?Epդ<4xH#Na3zaBH#Fc;…-0Gه~@>n٤ѻhH- f0+h[7ngam=D!7٣dG[4Z7m SЁ,7m fB)"xP&Z'Vl螚LE 9|IvА[U=<#zaVжoT'ݴ4CIZz-CoI塳F'0""i44n jYoL3J RDKC2LO =4Z4ls O Jalgi BSIiR37DDElijhݴ-U=<9Z4ls O Jalgi BSIiR37DDElijhݴ-U=<9Z4ls O Jalgi BSIiR.';jlݜO!k)a!Fv@`-4gsIFÙTQjhեM's3VS2jҚYHEjs "VvݜG0Bٻ9zC8N۳Qi?Lهٜ 37 bDZ3ҩ va( 膖OEiTGˆMP g Vvaat0c!# Ym0f=T.B[ a#)Pcl!pA'fq =oTal=@f ;8[7g=0"T'ƒD HS[3 HR7fx+ HRHi35E֚DAr@X4[1J( a ?3tp: a8 NC3OX] !f3?g2BzG-ZZ?5P9d-E RhBq#c v;D0g8`~8iCI-#jBffB<,@hvpL2DEihaz[4?a;np+fp=O qTB a@Em5M0=PoH[ JtV?gLM:?٣dOPxZS fIvдmT K4m HSLJ)iꄒҤ(iBLM<$Z;X  ۢg 3Hi4WOD!hސٽPjJZd)Sxevs)lݜD~VkE 9 z'0Ҥ)腳x[7g<$!C3tDDV&BѵSЁ,tfCLM<$Z;XZS tV᩼5!O f[ - 0%6=O ސm fC-4O Mᕱ*κH ExjBjBgik)aiL-CRފ'O۷Y膔S RCRO Ja""i44n fs4m;8[)jvs3VbQOgD+TYayDEiDn٥Md=HM?u{Vu{V*??b<'acJ>""wO70ev`*?w~:uc9s???[l{V䜄&xpampEÀ؋ki_xސz۷z۷ D/ 57ziT78qgzV=HSGR~|?dԅ=4q ?2ޑݟt?;<7 Ii+_zJ"i7= %kCIZ3VL4E?jozJhOE?jozJ"i7= %kKD)h!O= |ȂyCIZS&f"3:pZ-?Alމ f΍ >ↄjg:j΁*+Z&r.|?dZ鞂CIPБ-SA!+fg䮚l3w4$KT%~$4~l=OTm*$0oN7b1gTpG;ȵJٜ3"+fr`ޟҢO oO#)iT|C 2!F_ѫJOJ饫#MV%)F Q4jҦҺijZTzWM-_ѫJOJ饫)F Qٴ@暥l8ϙ |ő<`4?dEȧ>dDRx@gq;"~=L 2m=MDgDMhM:饫kDEiM-_3Z'-Nij=-huKW։nDӮZfOKtZ&t5z[4릖]4|hM:饫$OD!Z2։nDӮZfOKtZ&t5z[4릖]4yD )84vr1R"p@itt0QSЁ,Ӑ[ 7A jY @o=DOBNAlz- f [U=9 z%r d3AmT K4 GўCGpC!Gdgg<8#Fȇ`4?dEȧvdC0@"dSTÙThBoMTN=PZ PZU>w=D!D9oIRݫFr;)YoI$ĉZg 9 &qVT7j?ҵhZ=nV$KFFr9w ڷA%_4Z3[nպ (-RjќNzvICj+VsnJTiZg-SpݫtPZ#Jգ9j[/ 2hzJ͝ E?m=_iZg-SpݫtPZAMOS)Y(+VsnJT3ɣie+6t2S&ʔS6jѴ ԅ Sw=D!TIDiM- 6jѴ 4 z!"۟@8"H'`7Ҷlި[Dd=LF[6oT-٢2AMZST#zL7 S&)&xV͛ vhgVޓ<8lգiB$gn٤ѻhGM<(  i ah~T7$ -IoB5OޘZS fC+hH'Jq:?7$ -IoB5OޘZS fC+hH'Jq:?tDDV&BѵSЁ,ӎiCIy YOk iQ'4lgiO Mg=SЈѴtе P7Ӓam=D!7q(0Q%pVO+2T34ahf -M\g(0Q%am0KzᨔxFҘ[7a;n0 CQ)7$0։fJtfL-CRݲDZ%vˌ7$ -IoB5OޘZS fC,'mj%8q@AmT K4 i[Ї D7ٽPnIls""+fKSF z%qz & $)Ok fB5興M-MjYi[6oT(R'XP&Z'Vl螚WճvsscfѳJjZ  ҶlިgFy: Z%w興M-MjYV͛ )hfIᕛ:'""i44n f7>i[6oT(R'XP&Z'Vl螚Wy=U f焂y YOkC47)I,(R̓-+6tOM+|IvдmT K4gi BSz-CSDiM- 3٣dH!#jafzalިP$O P7x[7g=0m Jvzs 4FjBO -e?0"T'Ѵ5!O A q yD k;d@oD$@i YOkL( m HSDg!b:>\g'g0Q:DhZ(P BS "-5B<-CR+d`vs7 F…-0;hh"vkatF䆍aiT(7DnDƒCtWCjWZ4ls [Ї D frSڐl;8joԇˌӘCvBA<$Kz x\Q:DhZ(Qih[  Cu|`A;=97oD$@i i$4FjB? xh 0 GQˌӘCvBA<$m=D!R𶞤IiC?i*>\|qU3 q !z! pKz x[OR$ˆMP .>\|*p} FЀta\D"CN稒ބ8Bѽ!l,L- )t05Zg5PњSSF0KzPD3F0|C<-5OD-U %HPg-Sflݜ𸖉Q'z "A!Ag-RP~ɣIoB5N!ݘV7@+X|x nVcp+ X> <aV7@+X|x nVcp+ X>۳0e\O3D𸞄"C*-M%D4@i44nt'M)ꩣdI-xfB ᩼,@KݽO Z;Za x\Q:DhZ([ iD8Qi`[ ˏ8>h@y`: 0.q<4$NԔ`A;=97oD$@֘jBNA Bz%DZjx@xbCB|q導hp0> z\O5M %.3NNa ;4FjBIiC?>.>\|l#Z63hSBDIKa!aB-(k ;z%DZjxiq<Nl2 i$7>0@xH !u@s  :'@xސ+hZ6$Jգ8[ fC+hH'2gDҺ)`C+6tOM0"T',$Zg ;Vl螚WD0O YziiL2bDZ3oT2xH+6tOM+=B2gD "-5B<2HFpO efΉq[U= k 枚Z6AE 9i[6oT( 3K z!lݜ3 z%xF…-0;hh"vpPf -M\g!8"z<,hefΉ7>0oT2IH'Yzi]  :'P BMP EliiYzi\g@sd(KSFn BSڎefΉ7>Zaꄂy YOj9:'[xHz-CiL- (7ٮ3a7ljhݴ-! pvYziez BSڎefΉ H[OQ%p!-)zÆU;5~@"!$6Ѳ .(4-glRCvBA<$v!\Q:DhZ΃R( y 4eIoB \gNp)$Jx@xސKtVlިOfhz'f"KJ4FjBԅ<-e? 8[7ᙻjZ3٭)m=H҆9qD k;d@oD5!O YOkBIhլ'Tsԅ<(CRSF0KzzCyD0@hD4nO -e?Vl螚azCe0͝L-)zÆU;5gSJ+ vpO 2gD=0DҤ)腫Fpo4aoD(M-5.3B pD9|ݲDZ%vз@xH !k)G2gDC-0Vl螚aiL- (7ٮ3=BQ\8oESxH !:'Z'v!OD-Z6Cyk z!EliiqKL͝L( yhyj-0ҊVjBFTވQ' 8ZS f=PFTކa$ Z\fz[Ї JalިiEpNt$@iޘH'+h[jJxfn -h[OQ%p@v!OD!T!O@T~ɜJ-GMPJq:? QCzaJ~xjo ,4KDz & -e?57[ЇޕT-gnxiCIy YOk Ja?nٜ57)lݜ롄9譙+fp҅-$4xH'v‰)*tf vԅ<4ʉ<-ބ5~y=U f焂y YOkC+Z'*њSU+5%Bݴ𸞊ZSTy YOk ҶxY΀Ѵn  f=KzBA@KtVjxjo -$z)iMSl&tNܑ<34aq=U YOk +6p vӮ3,4#興M-M9!։fJtfJ2,4-ބ:a +VpJH횒nxYHi4𸞈i[Ї 腳vs3"CIZz-Ch 60`F!YfSF?L󶆢Kx[7g=0aw-Sxܓ= #Jm(Kz=zRҳVO{`"ai7ޟz|oO>7%}q=U3ZZODWM-Z Vv+UKV;i蕪饫AJtՠz%jijgm=]4h3ZZODWM-Z Vv+UKV;i蕪饫AJtՠz%jijgm=]4h3ZZODWM-Z Vv+UKV;i蕪饫AJtՠz%jijgm=]4h3ZZODWM-Z Vd)Ce+9\U=S*jG (nɣie+6t~@v frSTI7ٳziz@nٜ( oJ?PރGZjYv\gs O JalҢO z! xfjMSg@?i@hxZS fCKhvp7+PރGZy =4зmޘel+7$ҢO fBtg z!m=D!7fg塳F'0gam=D!-UPn0&yZ4ls zhIoB2U j Mg塳F'0gam=D!-UPn0&yZ4ls zhIoB2U j Mg(0ZYz &֘[i+X[OQ%p3 QCzajij)hfIᕛ:'@xސ 7q (oA'KJjP+fx[Xi[Іgs M5~8iCIm=D!7 QCza5E腣8FDEOz! VзYZSxN@EBLM<$Z;Za vгh=IoB+E 9-$4xH'vVO+2T,@hvpm foJ? QCza"KDz & -e?0 RDh= 2gD=&ys  Z'g 3Hi4O!k)ioL(R'D 蝵Pi@huySVPi饣dHPރffBѳ8Z;XFѴ4hL5J~u (oA#興M-MjYoL3Jx[Xi[Іgs""+fKSF z%xF47)I,(R̓-+6tOM+E 9|IvА[U=<#!t3Jٳz?gam=D!s  Z'g 3Hi4O!k)ioL(R'D 蝵PKC2LO =4J?7ljhݴ-)hQ -MVV͛ 7fEmSF4AZ7m Ja#:?^8 alsCGa9haQiz35E\: : G`.6RJACy8 NSpَ g$)grѴÙTfkMT" й l ,t-t\lBEp:80!'?〬.ɜQLHRHCV535$ҩ@]2@X4[1J( a!D##c v: (oA'SѵSЁ,Jn O T6A:#rD FOBO t[7g9ޘ[[ЇޘelޘZS h=-hxPhn 54l HSLM<$Z;XF<4Nܑ<-0PΉnDƒCtW7az & -e?#za8h0R٣dHhjh=O YOkL,@hvp7IoB#zL(M&B鄂y w etIU z! Fz+tI?EVan HSSf)"xO睴-LhiYl )] mZS (MZ3?jvpm 46AnDƒCtWԅ<2fҦJ֓:Pg :#rD?3TZjIѻa$!PݳB\4nq;ӆ3?Q{ƕ~_h?G?G{4+~ah-!~3Gyh ,[?Q?Q{D D?MOTIEgvd]_d_C{{H%.;ҢOQ)Z#v*oF1 f7J[_%,!`[1 ?݀BGAiQ'qCw %67pTZzf7m|C<@hyk<4n4L_haCh[4/'{H$ccoҢO3&ҢO|C<@Y柺$-{D D0 LY;8=m*$}cȍ z`C 2""wo)8JO""wſ2 pvp{@N;,apvp{Q)D;D*c,6_d?ݍbN'$Jk-4ʉ?#Y=,΁Ϳ4{7u{{""w`{)?Jq?UG"Vѵ5JiF>!"z[4`O`_+c?@N >3NO?z|oO4AB?nޯ)CDiRD J8 ӳTVt+fg䮙$4}W fΏ%p6lW fΏ%p6lW fΏ%p6lW fΏ%p6lW fΏ%p6lW fΏ%p6l=  K$OCDR饫OQ%`0oO')thJ]4y"z M-^HKW')thJ]4y"z M-^HKW')thJ]4y"z M-^HKW')thJ]4y"z M-^HKWiJ"+Zcvk ٮ ٮҸnAZg`6t~=A6lziil ;ٳ vgG3KLfΏgtj͝Q0?:?AѪ`6t~~ɹ"zJդ~ɹ"zJդF `@dBh tkAftkAg0p3 0p3 fafa: 5à3\: 5à3g5PɣTg5PɣTg5PɣTg5PɣT70p7.3oL#zaޘGzB?70p7.3oL#zaޘGzB?70p7.3jaD )84v}W fΈhZN&+VL(G7g;)=A6l膉Eg3w:5LfΈhZN&~=L6H4jJdCtFTC&4dѴ2@RS$ 24qS& P5PɣݺF0T-ބ8F8 Zk sV͛ $Zqo-RE 9}+fV[̸7Z@>fB+V\g=L8$4pH J͝ (nʚdǠS& MFRgC$ 24q3ʚd$ 2h;d 4e+6tz 2h;d 4e+6t2@#*jG=L8$4pH J͝ (nʚdǠS& MFRgC$ 24q3ɣ@Gє茩Mz 2h;d 4e+6t2@#*jG=L8$4pH J͝ (nʚdǠS& MFRgC$ 24qk9jq=*S $ϕXSP*e-'mU'&y  ٻhH'Kzn.3 V(0<Æhj Z5ZZOE0ʁTCKz* #4NLj6rz)T [Q54lrgz=-7g qTS vжnxFO Oݜ2SL-Bٻ9rgS<2<#vpWOE0m foIɟODD+9\U=ݴ-'&~z=-7g qTS vжnxF 2hzJ͝ E?m=L(n4Fk;m6l jvp7YzioI=L6RgC*QOOS$ 2qD AMOS)Y( 8tgmS&ʔS茜Q:Dfk<2B?e+Vs ҵk;8P i$&~Ta QCzaJٳzyY1 vsk\3!Ii9[ЇޘZS FFnZihْ)ZfYIiR-٢3iD 2ސyj$ (oA#[6oT4O+8XF>!6Kz5xo-RE 9}+fꆉg 3Y8ἵJ77',#OQ%p=6l YzioL- FТ:hZἵJ77',#%g+~C\g+XHPރGҶlިhVp|C<*C qTa QCzaJٳzyY1 Vrz!5xo-RE 9}+fꆉg 3IoB!m=D!0v?vsp7"AѪ`6tAlHFp+fmTO!:'Fބ07nvҢNVTѻ`MRf~JOQ%`0oL1lݜD 3(v2$4|7Z@6W xXF>!6Kz5Wo-RE 9:m)Y᩼(T|C<*Ge~Ta QCzaJ~xjo +r<,#OQ%pM+7Z@6W xXF>!JWOD#J? V(0M?k<579jgބ8Ge~>Bi2F0դB?e+6tB-3+6tOM'07ٽP%jњ=9j)Z[7d)[ Fдl\KD=E=GsT6l9B+6tOM0m HM)S Jag36)ZHGfΈF+ViD8F"KJ#zLAѪ`6t4ZC4g-S+6tOM0鄒Ҥ([OR$7EpZd~V%ӒaDn٥Mz0[ ggFiMM ;ji=&~+gA2fѲ 3"Ddz-Cdn Mm9%i$ h1+gA2fѲ 3"De+6tOM, S=Pѡ-$:'N%Fz$͝0͛F0̋Ei$ t g0ӒY6Kz8gJls ٴl ȴQ;jJ͝K&T#za-$:'N%FsIoB#zafzalިepyhJH[hک@i酣hfg VԺ'O!m=D!7ݘ] JaEdjBސ)墣IBn-ڪOHEpZ`~w=H҆6rzazhZHGOR$€ވ[OQ%p醦3z(jg ZKK$#RgD-)oJC谢JJfQraJrOO>r Wb9SDzv#?}ORʟI؎TO ʟEONrOʟWb9S|rr؎T؎T؎Tv#?}O_b9SBb9S}Wb9S|G*0#?Ôr؎T"ʟ=b9S?o)]O C؎T߱ 4J><_?W,RE]'E#!9-xLEF6E'v+ kc"oi'{B_gv5{ ;*)vcd.ͻ݆.Bge~靂ab*Ob(؊&"afdcїe//g~'4<;&Lsoƾ[2oL 4jYיoyDzיo?^d9^gיo?zU!7n&y טoC؄A; ^c%jռիy^g(^g(tf?MT5? T?3V-MNijA^ggvď+_יohүיojd*?יojnיoj^gqCF -S5oL TTZPיoE.(hڤ^gPѵHMڷ$G5PdG3E!Q?ҔW'zיoiV衽Jiq,rLU \3)4y*nJ?יoj^g$?I*יo?Ѽ5יoU3E5QN2#[??ỉJI4iyiI%É䖭3Wיo ?횷Ayzgjיoď^g_yיo3y ?2יoJPhRKf$Y6?ynE ?-9 ?yy?y3 ,?^g5548%cH;#|)k|dc| Ǜ#|821>SfͷF? |dcWl21žR0찯21#4F?'|dc2k|dc#v)~y21wF? [#ف;O7F?9wF?dz3]8oAsVM9|dg{";F9*o@9+ofͳDO[#?4DrYЈ٢'g|dg=M"`䷾23o`佾23`þ23؈|dgC]݈]hDlݜ݈؈|dg!7b! |dg!b!@ob#=]7Fb؈|dg$D}7"[#?1{AG|dg V؈Z2DF3ijg؈]?q=723b/23SM2E6]m {N7FPѵH ;XoKSPJ"ɾ23!b+]FE7F v"oH؊\;23"b*vԃǦ[#?R%{gcջ#?}b֪&|dgcǡǨ[#?>ǵo`$v=|dgz!o`+=)o` ;7F0J#?2cK|dgC>ǥ ;#?2 {FdDz^za?`F̄>Ѯ̊6`q23 G:f͢?:_23"`腾23vs`|dgt|dgNӍ 4@NwF1 I#?{EH])t'obi #?F1{:F1}%у|dgm؍cMFf# Ffw،q230#،=/һwFf(v#I230W،|dgedm#bv،23PWb023q،&!# #?cF+!=F7Fv#&o!%#7F7pJm*$"b2vs-%u[#?AWb<;#?Ab:%xFv#Fhg؎y23q-dp|dg;зFhq؏VzFh˱B/b9K|dgYOh_iWƈ=9YҿY׈_g_g ,=e7,y,=,=a{=J_g_,=.eƿg_ggGY|V=?{g@,#e Y=FgeB=d{Q=d[=,C,A7,BYa=Y?)eW={~k{Yggoge̍{2WYşgͿٯ=f{',{̷{9Yge_YoY?ge0=@q{R=@+eMb=A,#,{{e?Џ?БВЋ?gEgeB=h{Q=h[=&_gD,e{K_gD{Y7ge/2Yw,YX{#,[,gY'{8=D<=DF=DJ=D,ee_{ ,OYaG,o,Ysg=n&e-e0e,?_/O#,?+egg?<=, ?g6=Y(_ge(e[=,,7,YFXXe=E)eKg_D_g? g䂷Y!3,eGgJ7Y%+,Y=$эїe!e$e ?gſQY(,}{J,&e_gY.[[YK,W=%Y, I{?[, &e܎?ܞeF=r{{{m{, ,',Q=G-e ɇgeg7,Z=&ɰeXe\eJ_gҿY4{YYqe'YigL=uee<=t{+,g,,ٷYgпݤeݖe8=x}{oYYY:ssqK,W='_/O#,@+e g{ ?,AJ=K?g , Y!eOY ?g[=H2=H8=H>=H, M=H-e?gMYq{_gL{˿gP, E{$=gP{?=1Ye7Yeg,gY,BB=!G,B-ef_gY}{!{!gk,C0eX*, _, ge?ozgYO{8=I<=IF=IJ=I,eCoY{"$eY[=LS,E,ERYa=(C{Pa{Pq{P)e"Y(et{R-e_gb,F,CB=+Y8=gv:&eo,k{rg gˏ{Q{\rNY9HY@k{,_eg7Y{/YyYz/G,<{s/e,eM=k,{gq{Yg/el{[{,(,(,(H= gBgY1,ecob{K?gĿ{ee+/',)Yea, ec"YeaYeagb&eak, L?gf,{=Y=g"H=[,Ig#F8=YѿF{2Yg$6="!e`',Y g,ecSk_Y5{fggY{bYJa=ʡ=ʘeeN?,*6=!Y_g$e`)e`Y=gY6k{LY=1,+eecg'B=Q, D g(.ee?gaK,,Y7,{?[,gܻ{e`+,e?=0{{/=Y^}=Y_'=п{Y^g}_=ѿ{{Y^{e>U{eaY{@J={rY`,0,OO?g%ef"Yb[=5_g؇Y;==r,5(g9g9'e`BYRrRYD?{7,%o`P=ȥrYYE?=gYK=s,%`{r{?{_g؈kDU{_b$?g؈8Y"-=A/D_Deb! g؈y{=@,DsD,?{Y"{/DJY"?NY"QY" _g؈+ ?g؈ZY" ?g؈- g؈]Y"D0eb/EQ{=S_E6Y"mEeb)w{b*EaE!eb),dY"=V=Wg؊Es{b*GY"J?g؊#RMY"g؊(EE+EoE?{ELY"g؊\Y"E0eb*w{L{M?co{,Y=8=DZgY=Y#{k=s%b:w=(,~{? V{T|%co+=_=2 |8goY>ec近g{=, {~g Y>kL|g͖{V|= ==ucõc=g5c{@Y>*~|&, ߡ, {…cG=—*_c[|Y g{,&~8Y>}g{cY>/~/|`v|az|{{g;2Y?:Y`WzvmT\v6g;~,k{Yg;{Ye`vB`=g߆={"w'Ye` ,mv,ue`,nw_Yg;Hv!~g;IvQ?Y_гYҿ {Y+=؝`{C,bjv)e`{[,e`Xg;-e`Y=gv-e`=sg;.e`={=هE`;+={g<29Y ?xk{_{o yYߏ{`o)g<8=,~(9V#Zhh~r9jrMQ-Zh3*K҅BաvhBsjHTO+:WK҅C$g!ա4L^*7ec(T.n9 XhA3y&L'Dz!dɒ$舍7lT U-Cm*$RJLݲDZ%viI*SCVtSVJ3mD(nTJҙ#L6RgGm=LT_3hz64AҢNѲ4iKFVl畛:6@o3+6t4l(t&;jz8lݜYPg~Jm*$hݚ#)衒%(>7fʙdZ!n5n#tV2vhgVvhgJ)6 Q<운5n[;)M>7fd)[ ɹFJ͛&GƎ*ByYDEtfHW!Q<"":3&Cci$ +3Yd>!FE"H1 DFCdR/#&jMS|BEVgV-;*'z dIoC:YL<~cd>!FE"3ZU;! 2)C3\5iR$ |BE3d>!FE"J1 񜳢7mK! 2)Fgd>!FE"3'-OQ)(Ȥ_0|C!NHH42"|$ax3! 2)0|C!FE" axHntd>!FE"O2!hY鞦MSTZ S&敫& fIzS<ȍ 6Kz!9Y:%g+ꕜ*L։鞡TZjfk+6s5EIЉ3TZjj=S5E9͛f9SfS5eL"ҢS&hՓJ[J;&h͕v~k3VM) 2hؑ+Vd)CdSY6vM%jџՔS̆ʚhs5dҒ$A"vdv3fRw*$iZgs!O2&h3ʚd$ 2hzJ͝h=L檟46MUO3&FyٟNǙ?@qCF y3 gJ/R3z)z7;Ըzb|gԡW>&z7@U2'z7BGp_O1>PT(oUMϨd_/z7B~OLC'ԡW(^~bHwCz@~OJޢWijPޫ_ߨSCzԐKHy&'PJ~ =IKL_+z7H#zcL_z7`8.i&'CzG^~0J~0~> ~e7Wp__b|dqPޫ "2B !ԡW@ y%z*J~1zU4ԡW# xǨz7b>>z^ԡWf~fLO 3;PŏR_b=W ԡW#R ߂b|3(oUH>8>W$}J~'!_J_z7op_ yR_|j&zR}J~j~8ޢg~ x#Gd5#GdT?=ROb_*zWPIoUp_ ^~4+zU3ԓ^ԸzALO@y;'!zOBW'=W @~ ~~Fh_HzIU a>)>~J"%W$X ^[(U /[~l1z͇6Ԓޫ`!f~~lQ^dRKz̀zOͅP6,W3Ԓޫ ^WEzaǩ%W01zf I- b|;IxLW0Q^P$&C&L(UL]$Yb_zWXԒޫaa>V1zգzWZO%Wğ1>V~|N$Y_1zՋ>V\$'4 ^R__R1>z~5~5=CjY(U[$j] ^wEzƒORKz‚wb_/R_w%WAwԛ=WOMԛ=WIǩ6z– d&UR1z’wEz’%WHWHQ^X$)C)/WgIoU_PX6(UȽI-X1zXԒޫ/UEz _}C`Q^RKzC꿄ԒޫGԢWz[  ^꿄IoU%P꿄M(U"%Wz/UEzޤ_>|nIoUr%Ws='◩%WPo'=WSRޫR ޤh_ERޫ@~*_g?a> /UV{Q^𭟩%WZWoUVa> /P ^ ~_^~6.zU xԓ^p_RKzߩ%W`Ԓޫ ԒޫM$,L$-6$-aIoUZN$-=I- L>_[~8 J~ |=I- ߂b| >|9$q[HU*X H"z"00zȍ}H"#x=WD'Q4zB?i>=F!s~zR0zE/R6zK>0OU0Ut\%z=WbWa[ԉU{~Gy$}a'_>a$|?D<\'Y3'^+ԀC~ȟep2'A| 2| OH=W;>?H=W2|0@!f~] l=I{0{2'f+x=W|/|z >y?R&~H>t$8$8H=R'-鷠 ~A?5OBz+a$>τ{@$ﲐhWl_o"8zjO^~H^,=)0UOU>0U_5'g~?(U_x'ԑcR|՟b_F(UT|Ozڕ`^RW蟌k~8 D]D Ƥ=b_DFH=Ɓ$gH=Rn3 {q,_ > ԍ^0Hzە`!W=Wޤ=W`!W ^=WU7?z|_g$M6 } P6!$@BAoTOUD! }D/R^*'zW}={@!E= E'z/U*O }TRU)gԢWR^A<'GpOP$$zOi>$%zzR_ _ _H=W^_a%wISԊU$Q>$_=I-F*_}H&zфR ^`D<RRNz@;R_*'שU,mE~Q>C_R^$Q$ %z~W/U``z\_/$Ɇ`$Ƀ^A$Ɏ$LaI_vA H<} hy6y4 }y4`&w؄Aǁ$Y؈AMIb0II@$ Вv,qx= _;|ޫO%W;!>'y8L_~=z=H_}I "!~ Hz_^=z Hz_c!>Iuj!~ CתA*zJޤ=ze%R]z R4z +ԍ7:H=WMzO J~ޥ~> `!>``O&zD> }I=WPFoUf_P3R_?|Oz $<=DUG+.z#~fRԌޫmFoUW Ԍޫ OR3z$oR+WnO1>~gCF )>'z1;ԇU5!~b!~Xz^=zKԇU+RWTFoUf< }H7zH'_RWߩ=W!gȟz>>IL_zH&zER4zSH ^_P >Uz[~"CתEB!~"Hz_RW)kԇU[!~"Hz_z_f_~P_FoU@ԌޫWWϩޫ>(&z%R4zFoU}HR4zԍgA~}HB=W]ooUHFoUHFURW`Ԁ z^=z^=z~=zCת Hz_^0V!~/RW1=W2W ^Q!~#RWE~)zĂ^%ǩ ^%#ԇUԃJ=Hz_Bϩ=WQԌޫR3zl==)FULFoULN#7)z&^=zɷ^28!~b!~Xz$RWdCת =Hz_CԇU}HR_b_Ezĵ^_p=Hz_eoRWXCתK0z*(!~T'CoR_0ԑ0, 2OR ^13ޫ߾%W`!>*|U{i*z*>*=I*=HTz~&FoUqFoUԌޫ4Ԍޫ6OR3zf_~&HI^9Bb_ϩEzзU~6 |>zO<R ޫagp_\=Wth_R4z=WyEzoR3zR3zWxFoUW#7O-z~'>)=Hh_h_=W ԧ=W Q#7Jf_R4zR4z;ԸzR ^-zW~_1{1z(Uޡ~/R_8U~R_9ޫ@1z}J+~({{~(}CP<(Uޫ@W‛Q^@QPCPL(UQU[FU_WxԢWyǾ'WxWxN(U,{~h_A%=W6h_Dh_E^~ 'W,z/UJ+~ _H1z&/R_I'W1z%'ԢW'{{~"Ϩb_IwԢWU6!~(+~(zIޡ~(J+~(}=h_b_R_'W|Y.@1zԢW{U 1zGEzU 0zU!/U!aQ^B{~J>~DR_'WԸz 1z'_Bb_ER_f_cPzWSgUFU&~)CS}J+~)==C_R3zR3z_R4zK1zQ^DY}CT4(U8T<TF ^PB(U&{~*h_C='T@'KԸzQcޫXԍX } xR P{{~+CWaQ^]'W⸏W[ԢW_ޫ\} xa z~ zO!wOU$i x?@'}y>Wb_d(UeǾ'W唯P,,==Pޥ|Oz("| EoR ޫJ[ ^J`(U&2UFU&}HzO:| =W}'O;Ri x'CGB| oR_qoޫN =CX`kQ^`wUFHOŀ1zńIh_R4zPFU*-z~ h_ԍVmFU+8#G#GFU+F#G~ R4zZgb_Ez01z0mQ^ aWW+ ^ (WPcԢW_ ^eGEzőǨb_#R_2z/UWEzŒb_"wEzŒרb_%R_/P_R_~ }J+~ C^%['WϩoU-IǪ`6zigs~ BzO7 ^ UQ^ z[~a>P/R_j7%W鋿Iz`rOq3GؖOyKԓ^(z&_ϩ"=W jORޫiU'OUTZ+~-Ď_OUޫn/1 =Wޫm czŲwUV;~-}HzO=WϘ`Ro1d_[ԉU00[~.("~.!b^q%W ԋU'/Uޫp$\J"~. bWUEw\/yr___R3zC=,<9z'Wů/U1sU1I)^_eb_$ԁW鷖ޛylDOB| |.z~.ޤh_=WFoU^#7W,>|\ԍSԉUpFU?#7^=#7^m%y#ԍxd<^/~ ͽHc1=W=uyr_2w'WG!K~ bbߩoU42#7 }H,AWY=WǩhN_BhYOU40~].!~]<OUu Ԍޫ7WԏR3zˢ?Wҿ%WcԋUu3ԉUt 5^_U^\zԃ6jT#zmyFU6H<Ċ_jHR4zĊ_=H/ؖO`_uh_vWܥB'K~0=W_ؖO԰zR ^qGؖO;԰zO/U8+!R$=WFoU9Kx9=H"ϩ=WFU9db|_ԊU|}y|Ew }HQz~}H;z~f_oU:$<|`ܟ=DUQDy zԀ!~ϼ:zR4z ;XW!~K>b=W,0=W1b_;zӋ>b=W1d_oR4z̽HOԍש=W6#Gh_܅FU^bW-{}/U~_lF۶k };Yǩ%W}H_k9z_k<;z9z_gƾ\z=WoM?'n!}'{{}~|J$>'zqϕ9z|Oz1ޫ!}5@;@Ԓޫ^\z^h_h+})yv_h1^U;@\$@_"}~Hzb^졟/UQW'W@'ԒޫG"} b^젵!}= \z7ݔe-IJ|>|HSHb_aQ^0-z[}ߩ/U'z/U25(U2z[}R6zWb_c!CԢWX$ D1>)%1~|%R4z^}=J+}ҽI-eoR3zԍ#G"ob_`R(UK^_c@1F'зFUf_`}d;EOU̼a}3Œ|09'# ;azOHV#GR+W z>l_cSR3zU5g_cW0 j!x' #2S2qFUH_a_17|fޤh_a=Wf&}bWfY#7 ~0 xW%> ^(U Q`BzJQ$oR4zJY#GP)ԢWRRKz=WS?R4zge@ G ^쨭Q^V$ =C !(U- F_ab_a_R_a7OU}I-A7ԄOU ޤ"zзF۰}; }AEz[}z}ؖOIv6=C}J+}~_cb^8#GRWXG%g1z_eg=zR^;%Cޥ=^_`M$GK''a>9g1zN-WRKz}v ?R4zPԌޫ%db|OU O=H zRԀ"'"o"zȽH)z/UXԂ,sAK}}HRޫAK}UHUmFoU{AK}!zR_hCR ^ ^W5Љ0 _=WԂ=H)z^Wݯk}zO[1zQ^nIoU Iv CC_R_`Ԓޫ,`P>Y"zVq\=W+_\=W+<.zR_`B )XA}R=W+.}ߩ65 ap_aԇU`WlR!} 6}C R_aRKz/R=Wnԃ }俰a~}R_aIoU |Cg}U _v T;}ѷ ޫ v G~0^[}CR_`M$W-f;/U?%8S84 ^8ԢWp;$_>( d;[ԄUER+Wh:zпO=z7촭WhQ^Y$_`='0I$.5˜2_e·WsWWr(z}&R3zԌޫqWWP#7=H;Ԍޫ=Há='t!z/U%zW~_`ȅHU >|&}*J+}"%W2-5÷|f^}c_R_aǩ%W35#Gb?/U ^k}45zh;CR_` Ԓޫ=H/!}XSޡ}\^,ԒޫzO J ^R_`,z[}Zg^h_h/|W"ߩ=W5gH;Ԍޫ>WzʯR3z~h_ccԄU}H>f_aGԌޫ<+z}ǩWx]#7Tz}#='z5 ^=8(UI-ҏ"=WzY )0ԊU}bO=W h_`W#GR4z /}ԍ0}/R4zz} ԍ)>=zH^#7z}z}}#7f_cGԌޫt,}f_e=H=HN_eK/gA}RޫY!;}HN_hzѪ.ǩ ޫ;F}d;F1zaEzm}I-ъ^\zbϩ ޫ{ԄU $;Ŀ|>b>zM[Ԁ1U=H%?C==f_aؖO1z ԢW~ޫ?+6?<|_b|x' bY>R ^@J =W؀A}RW74 zn? ^Cת9>5G"z ~IJ|jR ^O=H;z *z}i_ԑER3z -v_``!}WفOR=WكRޫ;ԄU d;Gf_b ^f_b=W؂}-}Ho|x_b OW؂FoU [ԌޫA}H߾DnOQ3}R3zFoU"f_b)kԸz,z5z7>zKԄU=*yС!}Ϙ^H{GF1=W،>D;=W؍'=W،'zaGԸzX.Gyz}z}ޤh_b8}='؎-/U#J+}=I-0=Wb_cR_c~_c ԸzWb_cCԢWVCEzvkU ^J+}ޫCe/R_`MePsԢW;0{{}žf_` =;1zxR(U|Ozx,/U w'W#zmxGR4z0z}վ}'W=Ԍޫkԍ~W>}1b_`R4z|!z}⧩=W>|`4z|,z}_CR_` kIoU_ z}~f_` Q#77ԍ ~h_fJH̗w2k\=WّGԍȯFUd`#7Hԍ"PWHUFUV#GH_ ^*R_iM=ҏHҞxWZa;}ŋ}L#Gh_c=WBbWR1W};}CzWLԒޫ4>0=W`='c1^3?RKz<`4z 0WbEzşRKzόU };3C3UQ^o%Wٜ^0=Wٛ?R4z4RWٙwCW3NӚӅ_a>ӎ=CN=(UԒޫ<0=Wq='t1^9SԒޫ9[GN ~|CN_(U@2$ *?a> C W 5$ #xh_d=WWQ^a h_d=Wǩ=WGz[XW@S}>bGzC_R3zAUhq!}/4<#74kB4HR_f^}  >_f7݀b_`"5(U'_`#WWCEz=W WW mW/R_d6_d7}=K!w>G_bY>Gh_ff_fR3zQcXW}=HȀ %#/UD+zW"}=ȂϨb_dBEz"w'WٱUl?#76#}d;6}C6qQ^#ޫأWٰQ^R6,h_fbY>̽Hƾb>zrUnN#77)z}=C7}J+}>_fP> == C8[Q^{UpG8qW;ԢWKޫWQ^Up,h_g ޤHz~=#7|W?Ď_`P#7ǘ/Uſ|Oz~]yr_j_j~0=Wډ=H5 ^E~_jPJ+}}=CP`(UG'Wړ_ HԌޫI 1z2zWRޫHWڔR_jE|Oz%Pԋ>ԗ==ԗ`4zC_R4zGh_j7'L_dZ>IJ|ؖO"PĄR_b@U$C ē/|Oz$ԇU$}IĒOU$BK^}%R_da'WWOR_dd|Oz1wԸz*/PĢEz*O|Oz)#1z(G(U%=Ģߩp_bXWؖQ^K/{{}PHqQ^_`%Wp_`$,z/UER_g0{} ^=(UrޫWȝQ^Ur>IJ|=H)z;g$;}R3z5"=WؚԑMԑMI"#GIJ|$R+WBHR_aR+WC@0'CJ_a A%!^WbOȟa %za>%zaa YWCc|2M' W ' }DUq>Tw%z p`*BW X`*J_`*H|Q+}|GJ_`*b|%z_a@`*+z^Ao vߨT}|J_bz '؞i%z<) D;ޢWO"'؞=W؞w+O=W؞d;^O&}b|Q+}K'%,aԍ"IFU ޤh_a#GO,aG ^"J+}Q[ޫ"+}RoM{WEz@Ev(HoԌޫP/zTz}+}HQ!z}.<` =;ԸzQX=XwA}RXԸzkFoUY'ԃbp_`,+zUߩޤ"zN ԌޫR=W^f_`kB'#Rޫ?WRޫR_`.{^._`.,\FoUbY>!Wؤ;#7Ra&zHF'ؤ(z}ERWؤFoU)|_g}z]ER4z=W1z4(U{}ԍ}HaW 9#7 ԊU?b_`0V(U|Oz./U ޥ1'WF}bb_aOR_a|OzFUP1gԢWF=9=WG1zWEzU˞f_aFoU =HB,a"P@ԢWHaU+#G #_RIǘ$H_a$ԉUP>IJ|HHFUJh_a$R#G )}U|r_a(WJ>(U{}b_a(N(U_a(W+(UJUUJ_W(ԢW)'W)'1zQSԢW(P% bY>EPFR_b'WئmWئԢWئޫS!z/U)Q^SޫSJ2p_bgU)ؖOM;1z5(U#|Oz;v'}EzsU gK' }ȥQ^K^_`2-/U%R_a-G'WK5 ^%J+}=Xvм9zU*WFU*'d;%h_dCԌޫZeR3zTԍUԌޫU_FU*QC7Jh_bgp_b{ WM2#7 z}Cԍz}R3zk\=W ^h_`4T#79 v@ %/Q3}$#=HlW zW_`~h_`zqFUGWP}J+}WW ޥq'WN}Ps?R_a9ޫ'%z/UR_a8UR4zFUR3z-}᧩W ŋ}GU=HpFoUO  >}WWa}p_`gFoURGؖOH "d;*WW@ؖO}Q^߾'WجqFU+,b?PdoR_bU+Ht\9'?Œ|u%—=W}ϩWPs,^($}cGԍ=HxFoUbY>&/UKԢW ^_`0zԅ/UoU/U'WY6(bY>ˆ!>ˆY%( ^((UO}=‰kԇURW ^}J+}'W},`@}d;3IJ| RDz!z_`C ^PI-R.=WH z!)ziOsrO eRWS|`4z)z_aM3HUؖO` ^J+}ޫf_`D~IJ|PQ^^_`D,zd;"ߨb_`D`(U =¡ aP }d; OR4z(¡kC O\ԊU+1>sR3z] Cѽ=p1F'خT#7=HńR4z#gFUeR4zU@ؖON"}Rt_aTAK}TRWV~IJ|`)+zR_a]%WWqFUWؘAa$%ga$ H;@GBH;WB,$Y9$v,IbA$ $)a`Jg( W}( R}I-G"}(3IvRKz%N"}3D`NmHUz_`N$W|WX!z#}?50'X(,7ف>%z >D; Ǩ,=DU =Hz_`P{Cת!Iv/RWHz_`P)z}R|A{ԇU='¯O=CXԢW^_` >"},}R|,$;YԀ_R3z)z}I Ԍޫ \z}IKԌޫ D_`R)z}IoԌޫ L>f_bѯWش8#7}Gޤf_b~OiǨd_bsԌޫZN#7^f_`TԌޫ f_`TDvGޡ}U^h_`TR#7W ?MFoU`dO+}DU}H}FoUƾf_` H#7`FoU·W >f_` H_#7 *=Hʿ>Ǩd_adԇUE/R3zZ#7 %R3z,HWW-#7f_`X{FoU^f_`XL >}`CתǩOUE'H_`ZԊU}H_`ZQ"}hEw[ԊUߩޫR/RWJ^WzWzaޫ5#7&z}(0'1Ϩd_dI`Oag2z`FoUo;;Iv=Hٗ.W[B ^-(U~1[ޫ {}W ^ U|OzU }R_`bk U'_`b-/U%R_bڏ|Ozmob_bR_b'Wط_=Wض#/U-J+}b'W5Gb_doR_dտ_d'W5Ǿ.W4L_dC1zigԢW4UC_PԢW=ɟb_`dQ^ }=Q ^ R_`d\ ޤh_av/R4z1zQ^.^_atP.\ "|"|ޥ} v o ^/ ^0=W^=H z\;}qIvWzUg?b>OR4z3)z}!}Q'9 ^ }J+}U}{ԢWػ{}1 ޫ]< ^]gQ^]FDPKԢWغZ_1z5UQ^ G_`j}W(U{}!}wԸzz}8kW=J+}8ޫ}8G(U[ޫPԢW }==ٯ'WHR_`l.}R|s1z60W=="^_FU//U/!zW{}o"^+z/U/ ޥgޫ a`n/U=J+};ޫ E'Cq[ԢW>_`p>|Iv&^=WǪH>D;d_`r]#7}HǩWؾԌޫ_B#7ѽHR3z|FoU/1שWؾ D;˾}ѧW }H/R.W8#GCԌޫoR3z:-u6 !$%vb/ v`T vbIcԍ`qFU0 ޤh_`z}1>="}\'='ޥ}oԸz#GzG=WR+W'ȟ`,9z<`^R+Wa>ob_`|ԢWz[}OU^0Uޤ_c1zԢW'%W`LO?!y z?g -$W@[}$Wg@[}{@[}\=W C$WW yp_`ԉU/1U#oW` ^K~0[}ޥ}[}`oUO5W<_dc_du^b^ubW1^~]zu\=Wޤ]z}H^/c{H^>]z~bW1^|CĊ^w/U-r^bWCk!{bW!{oh~W1}Y> R ޫ1@|G~h^Ԋ^bޫEFU >0U 0UI\=WdV.3;b|up^ -1[ԉUy z|!*xER+Wh?%z|ό-A ԊU9z|"uo^|9z|"'yr^F oryf^H>ǘUWbޫ5Wj(!Qg@k{!CCWBϘ/U=HCeR.W3*zu^JԊU1^ jM[ATJU'z{&=W}7 ^}1> SԊU?'4a{ FU0UR+W?'D^ kFUתH}7HWJޥW$Jwޫ63o |a{z{0UWb^Q^6I-`w60/UƞkIoUc oR+W_~O|&-'B՝7՞x9z}[_תEwՁ_> i^0`o='Y"{˾=W;Ԁs?> {851z|'B(Uޤ^O_OU>0U^^NZ ^ ˞IoUBqW5WƤ/RKz|j{{V~0Uj$Ơg='5}CƢEz|j,z[{A U >{Bw=W$G’ XN#7}HOR3z}`FoUHWz}a{Ԍޫ߄FoU&{>f^%R3z~R3z~ޫ7HqGԌޫ7,{鞤f^wԌޫ70{Qޫ #7ſR4z|nqFU#Gޤ=z|,_CתR3z|,B#7wW{`FoU/R3z|-a> 𵟨b^ZQ^ D/RKz|-=IW8a> b^៩Ez|qW%W8oQ ^ IoU_R4z|.{rW .z|/_B[Ԍޫ şR3z|> ?`O|WBOȟ  \ IR=WFUHϩ=WFU =HkFUOתg5.z|>|/Ub: br^b|b^bԢWIoU.|`Bz|1`ޫ DRKz|1a> ĵW=J+{ቃԒޫ S`Bz|ti.^kIoU^{㢏W:a> [1z|t+zWI^d}1> qEw!=W'zO|2C"Ez|2+[{;IoFP٧Ez|v5$ga> b^ ԢW;F$`,of` _ad$|3>If |o`g oeW`fO|4?H7@9. ~0@!7Y3^'^'ؼO~%b> >|o^'r$7E9_b> cԀK690{OR3z|x81S/l*"|l > 2pI 3 : }$1';{0{0X^ .yp^x-<[{"$7 <$|A :`^}oz׉>O}x|Y˞)'`O||^羠@!_'?F!K{/R3z|BS7ԓ O@'Hd|4{D7jG{4G z|}A> @!PO|6 )" ^b o ^7I!{> AO} 0 $0<&{7o!3'!{Oԍ"FU> oOU}DUx2z|EwDQ3{>h^tԍh^Wޫ#=DUH1ԍ##G^#=z|)zU^0V^@{<`ޫ>qFUHԍ&^vUdRW^0>0X^v|ه1z|<4(U[{^RW!xVz|<(YDd7}^ Q{z߾$O}ƒ{:ƌgD/|'Yѯh ~4 ~4Fu:ƕ:A_Ƴ+z׈^/PUYxV~!zğPUYx(ߨ*zyǨ*z}~&ykV~>PUYzV~U/PUYzWUPUY|k ?UzPUY|VUɞ!V~=AUgAV~AUg@ ?PUY#oPUY%H^I>B*oV!*CPUYޠ+U&-z0V+PUY=AUgAUgAUg}AUg澠AUgz=AUgoPUYg*oV0V1*doPUY^>fޠkAUgнAUg}AUgPUY2ߨ*s/PUYϽAUg ?MUZUaUC ?@a ?@q ?@)z *V~*OPUY G* ?ALU~!Ǩ*V~ ?BJU}AUgEPUYCoPUYE^>*oV~LAUgDV~OAUgFPUY}AUgD ?&PUY>672* ?C.ښ ?k'*G*[V~3V~CPUY"7*+V~YUAUg퍽AUg!z$ >ſPUYs/PUYsPUYsPUYzAUgPUYrר*V~PUY=AUg ^PUY*?5Uz=AUgG*?+zPUY*Ǩ*PUYޠAUg}AUgAUgz_ ? VJO*GVIoVQ*PUYGޠU&-z0aUUUAUgPUY)wV~H5U"U$U=AUg䂷* ?$HV~I<UQAUg䔯PUY$ ?$AUgޠed/PUY2O*QUAUg/PUY(V~J>UUPUY( ?%}AUg}AUg[PUY, ?%AUg* ^%'* $z[V~=AUgPUYǨ**7*W*gV~ ?G6UUz}AUg⏨* ?&zɇa*_*&ɅPUY0 ?& ?&U\zɥ/PUY4 ?&}AUgV\=AUgAUgz~CPUYPUYoPUYPUYϨ*V~V~**O*أ ?v[U2U8U>UV~MU-z}AUg}AUgsPUY8 ?'AUg*@5Uz =AUgG*@+zPUYǨ*A<U(ޠ+V~ }AUg V~Fޠ_ ?$/PUY$QUoV~e ?H8Uz+U ר* ?pPUYq ?e/PUY+wV~ }AUgR/PUYV~=AUgP ?AUg8U*ѽAUg ?2Ϩ*V~!/UH^ 'V~! > ?̽AUgǨ*C>Uu17V~!AUgV~aUV*V~J^*WUR*k ?' ?' ?'zoPUY=3V~GPUYJ7*%+V~YUAUg!*D_ ?AUg"O*D}AUg!oV~"zSPUY} ?kUo*E-zS**V~Pq ?(AUg:GV~ҽAUg!gV~R-¯PUYV~#i=AUg ~^b~b/1ǘgt@;_gtM,~:]U8V~PUY9gJrJrg*_?(?.~ V~k%Y9'|| 5)gDK?b%,_<)g7K?ҼJYY)gDyb%,= DGDJY̼JY b }&y6Y1,<,y6Y1Flb gij gĿ gIee+,)Bl'AϲGAϲߘeaeaA ϰc"ߘaaǘaa~bV}"oakA ϰ g1+>l<"ϱ~b*Fb*QyI"ϰD"ϰDVUg"LUg#UYb*gb*hb*i^b*e1V}2>!>"1V}D/1V}D1V}AGEU`"ϱ>Ƨb*yk_>Ƣw:ϱ 35Y 3@gf!y'Y1>ʡN쩇ueN<*,*|,o1>!ş` g$b%,K>:K>QV}o*ߘbϰP] YX@1gc1şe/1şeK> ^b-,"ϱb-,ynVig[ugܻ"ϰVy"ϰV"ϰV"ϰVYug+0zϰU`a>^gyGY^{}zueGY_'GY^#/B>ue=B:ϲB:ϲoP쾿P}@Y^QUe^ >іAUg|V}ϰV}zϱ >PUY şPUY ~W*0V}'AV}qGV}rW*1}AUgىoV}jAUg؇*ig9B…`啟`}bϰreg97YIߖV} }+>K"?啟`>țeg9+{rϰr(~YYE/|,%+>g }cϰr,㕟`3ϰr[`eg9/{ϰr_}g9NDQb!啟b!~YY" }ϱ+>AǾ},~ϱ/+>Ek>A啟b! ,?,ϱ=Dg՟b"啟b#|DϱϾg؉_啟b"GCY"_V}|8Y",*ϱeg؈'{ϱeg؈(g؈)~YY" ޢeb!gϱ,+>AoJD-YY"}Cb!{ϱk>C啟b/}?,M=1g؊keg؊mV}_+>Q}+>S| >Q啟b(},X{ E!~YY"ug؊}eg؋' V},Zϱ啟b*7/\YY"tEHEIg؊QE!Y"~YY"b1Y"ߖV}}啟b)_+>Q[ϱXϱeg؊b(eg؊\V}+>R.LV}{YY=2ϱ啟c^5Y=6{%,,gϱ_z=z?՟cV}O>gϱ{՟c?,|5cֿV}jşco+>ǵcw啟c Ccԟ+>ǥ/ucϱSAY=,>Ǣ啟cKCY=+YY=, }E+>Ǣ~YY=->ǥ+>ǥ ,~Y=N(E`ϰtk}_V}},C-4Eeg:_g:YY_~YYY+>?H_V}U~YYyg:ϰt`B~B,I_?,Bw*,Eo+>У}Kϰt+|ϰtY]g:,B V}啟`!ϰt^bw+>d+>d1?V}? }_V}o+>aC>aGϱb0eg،,zF-~YY#&zg،-YY#=@g،]F/ϱeg،)Y#V}^b}柖V}@Ϳ,g؎6G[b9啟b<^,ǿV}P V}?,=@6Y#YY#GBg؎ϱ1,ѿ,G'~YY#^bCY#YY#>Y#V}O}ϱMGjG+~,͖}Ub83,,o>rϘγG?`G-~G}HjGL#şb8g؎[jϱL}}Җ}ub90GN ~b|Y>2ϱ|k^|ϱ, >Y>~}c忉>ucߨV},}Ag9gK>?}_Y>qϱ_} }j}_Ug|+>eccϱKJϱϱWK>OPV}Ж}|CY>+~ V}׬ _}}o,IY>=T|Z Y>|OY>L|-+>ſh|\zϱw+>і}V}c䵟c'YV},Y̾ Y?g;5~c_ϰwJϰv6}ϰvY>n*ϰw,cPV}vg;a%5`l~g;=~ a>ܞb }~b)h^b+m|,n<,uy=YѼ_Y`1}w>G} Abϰv g;(@}g;Jg;*yϰv&QYU`!Zϰv(yg;k }gi+>ط>oK>s} V}u`U`#Y?Yӿ),EYz.~TY =@Y }C՟`Wk>ᷨ}}}@ >K>ϖ}ÏP-,PV}ȿ 6L硿Q0?-o̿߷+뼿oɓ$Za߷\ɓ$Z~?Yg5oLosQzg߷sQQ2v?dѹA~!lB %jռ3'V?@y߷ȁE FiW骆7q;o߷↍@߷3V?Z3z߷=S$骊߷ҖmZUo ~7i3j↍@߷4Lս3o(hڤ 5E ߷H T34mRo[g~5PdG骊&B~JQ\8g3O?l?q=7߷Қ\K4Rչ&z?U \S-34iooU5N?iK6~oU-[G~FT߷MTSU3I&Dq?q3V?p~JI4i߷ҒJ+3Z$G/TgN٫tg5oL[o߷3g/ ߷owgRDď~%(4g?K&G۳D QCf????߷ ߷oy3~ٯ߷?DPo&g`/33}#72 ?؊{}؎T;~P-PѵHn2%ST؎'oQ(?V[mC?ed9qCA=2-C?eU gm}C?eSv2 G݈C?e↍@ōC?eU \b9kA2 G݈od? DGߨȁE b9oAaSvG'G.Q(?G/oQ(?s؎_;~P؎`;~PÿvG؎vG.}Q(?|A蓢LoQ(?+_2(ƻozgC?eߨ  wߨ};~P ߨݚ!7|8;~P$|ASH#od6"zAv>Q(?'v>A`]{vGf韱C?e-MN|?;~P >avG|B;~Pԃ=T7ߨlE=>|{vGjoiM.%{vGITm=v>Aj3;~P=ߨ↍@5;~PTZPC?e7q;oUvG |vGfziwߨ3Vպcߨ횷Aߨɣso;[o$Q(?;wߨ[o;o~[ov>*oQ(?23Fc7A>ߨ=TvGꝱ# oiK6-* ;oyZo7R;~PFT}C?eΌү¶2(>,Q(?؊{}X;~P!3kAyY;~P6&oQ(?  {ov>-Q(?&>.oQ(?vs̈|];~PKz*{A?AEMAE5Q;oo߿vGCb)g`F2f[opoQ(?[?wߨMT6;UvGjٶ2i[ `kvG;o]2{cC?e;kwߨ>jvݜC?eOc= cC?ew`-C?enA;_vGA-;~P5Q2;!oQ(?$\K4C?evwߨSrKVoQ(?A@ɿvG!;~Pvзߨ{mwߨn7ߨuoQ(?q;F;~PvA׿vG{dC?e`#A;ߨN2A`죿vGP[oiJ+}C?eݫrL}C?eOc= eMC?e&C?e$C?e[A{;7ߨH T;wߨ=KAdG;+Q(?O2#v+oQ(?-[gwߨ`X;~P=ߨ%;oECoQ(?؊{};ߨ݃2G7ߨlE=>wߨMQ@O;/oQ(?&BgGo+7ߨva;~PvvGCb)g`;~P ~7ߨJ ?xevGCb)g`A`A蔠ٟoQ(?# ߨx5;~P{<A7C ߨJ `qvGjwߨlE=>oQ(?؊{}<Q(?װy2&rFOA 39-Gߕpo|'/ ŧ_nb$]y/ B0~OVl4Da~Od&?/ P٢'r 6hķۅ{?̯ۅ{?Rpo|'K+A/Rv~O / xInb^_ 1j[Ԛxȷۅ{? |%JI;po|'$ ԑ'+~OP|*po|'$/ԁO / Cr+i?po|' +Ԕoۅ{?o }_K~OS=u}PSH#C&11vP~i#?`~ߚ;׿OȅO;%-~ߚ`䩿O}o?dgf٢'E-~ߚBlg߷234Dr,F=M"`䷿O~i#?w~i#?OFo?dgb  w~i#?Ao?dg5vs"7~i#?o؈;L=~i#?!b! ߷23R8D>Ԇ~i#?q ߷?dc7DqO#"9ԡv"$oF@b!G߷23nEm9'~i#? _NrFU` @Jvq%v~J+32v~_n_0"++)+ įSpo|J? įۅ{W!3-C؏1.E~i#?f~z(oGb!߷23b)o?dg0 "oFQo?dg0@E86{O 7~i#?؊{OgOAWݕz]_+~']="R{po|Oc= GI;~1Eb,4@h{A` o }A+]ۅ{̢q_ w|Apo|y w4{po|7%v~."8{po|<'n2<[‡o|2(vwrvC bk(vwF}P=0?kUO==/GKz`g?SŒoC]Abo ?3& ?3-+ N(v?3+ oۅ|C?b/ v.Wۅ|~(v?3x{p {po31s8 |CCb)g7`{cEvs5O7~i#?O ~F?` =rFABoাއo া/T_/-<po_]zd=_/%-v~~ K}_/"_/"_/ o %v1_ۅ|B+ %E]ۅ|N/ƕ~hDۅ|+ L=_/;}_/gei]_/&v~hapo_I]_/C^e}_/AaWnKmnKy6 %؁nKd)C"_ %0+~~/ %po_>Ǖ~ۅ|D %/r#vm)$ "_/YhOڢnKNpo_"6nnKcC %{؞[  SD ~2v~=C/a`/~$po_Yo %]B#D  %v~W #ۅ|F}}_/baJ/sJ͝Jpo_bo %cU  $ { p|;~i5؊{}DŽ/  Hv/ O GS߷23]=+oF G西O {g߷23A'cg߷234~i#?@eOǦ~ߚ" ;J7~i#?5;nz~p{s:5 :F~ߚ"]P~i#?-~ߚ"{տO#vm)߷23?t;Vl S4F{D-~ߚDlݜ:>1`o?dgӍ~ߚg?:sO`CtO`GtQ1tO)t'oF ;4FЭOV&o#o?dg;Bo?dg5P@ "/P DއoR$']_7}_7𐩾< Dž/Hǰ~ޠ@Y= =Wn G݀do_vm9D̨髱G@1،&FM!3N({G? ،(oF F+F ،,oF -FL@i،\rF !$E_Iwj8poPAQ׶ 5bn;z!3K_vNc3ijg؈]f MDOg"]?5!o@7;zi_n5poPC+~ޠ>d6"zAy@v ?؈ZD>Ao߷235o?dg5PJ j"|WԷ+@lE=> ;o?橽4@h@t0; o%އo5"7j|K}_G\yI]PepoP?eL~ޡA~n[B?{5ndu+ 2;cCG n;zpoP |8 SH#F[o_ ~{2C~G#_^o̿&1P}oG=B21/GUOge`5Jؗ*dSH#v1?]~a?Y߷{1 'o&1}wǛ  zFoc@ Bpo1 ?| @yn!O>/C<ۅya I+ @,=_o_Rv~b pCMvk5؊{}DCe1w`d~ߚPv#~i#?@؎O{s-~ߚh2FFƁb=[49G߷23у߷23W،mO m~ߚhUF4ƀo?dg4w~i#?c~i#?m؎!oF 0w~i#?[4ǻ4m؍F ؈(F JF8@ F߷23؎RA{OgJOAH olE=>&?[ o&1{ rF t?e?Oc= R;}߷{1@hngP G݆EC_9j&&1 OAH;!3CLcC`q= 4k?bWOAH+;!3BV;z?o&1  $ ؊{}%,-Lc#߷{1@hn NolE=>1`3߷{1@h?6=;!3v3ce}~a?Yit?ڿOc= fo?&1Pe3߷{1@h?6NolE=>,Lc@߷{1@h]?6Oc= 7ߖ&1QK߷{1@hOA Y LѬdSH#$ÿv?8~a?Y# dSH#0v?;l= zK@Lcv!`O{zU5ZSBK@&}}J?WO4+&kjg~I5Q2#tHuDȎ?>o]ƾ] ASU NO&WB@L࠷߷owԎ.if _ f ^o~ޤ)\"y@[߷ "N3W {{!OI'ztJgu>0y:I)瓷oƿ= %~ .rF@e 0&>z!_wQž(v!һpԆ?7$|ۅz|>,;~q5؊{} Q;}gԐ.1c4SeLcU)oLc-Z6C]O@u A&soC) ߷ ?գd58y:IT:'ߎ?dRJ?Ա VSۧ@DV~9qJr$ZˎIZlԇwO4]KyK[̇=_J]zS-Z6C]O@ A Q<k 'B-vC}Oh u? jޙЌ=ߎ?dLս3{{,?գd5 OE =ߎ?d8H{{,?գd5  чoC) h÷oRS-Z6C]Ohy:j#zO9_oRS-Z6C]OI7O4]4 U?BoC)KR S!vi VS7O4\↍@aoC)(hڤ&vQ?գd5 A4Zfhɥއo2SS-34io~ޥS-Z6C]OD@@nv7'mL{{.?գd5iz׷^HFkJM A Lս3L-v;~8\3V0߷?գd5 ]<r Nؑqv;~8\=S$\]zS-Z6C]O@ A4D{oC))f^߷O}Oh u?iZއo2S륩O]ԈAjѲRTy:'V{]ߎ?dQzO To~ޤU VSb 륚iafziaԖ?գd5]<u5P‡oC)C4W zQ! &J`y{{ S-Z6C]OE@nv[5oC)N٫t&ԀoZlԖitf;~8]:3Jl{"ZlԋO4_boC) v!vS?գd5i T(Jvq%? T(Jԃ?}Oh u?7O4\ފIoC)-vAZlԘ.i㷡jIS-Z6C]OA AYmJՙ}ݽz{!)O4]MTSUއo2S멪jR}߷AjѲAtHV~JՅ>vo! A4rLogݽߎ?d4rLogݽxGZl ATݫrLv]ߎ?dTݫrLv]xc! uIJՎI;{G! y?,JՏ{b/Zl[@p$ NH{{ZlO4\f v;~8\f vS-Z6C]O 멪"8 v;~8]MT6`H㷿o_AjѲ@j$)v;~8]MR`HRoZlO4]M3J ߎ?dSLҶ@Bo~0[!gtHVAY ,߷}Oh u?ni&zOɥ.`Fk`utHVߎ?dZ\vZl@J~`S-Z6C]O A[&zO^M+ZlwO4i>]vq%?}߷wZl[@1زJՁŔ`Fk`}tHVJݽߎ?dXY+v}Oh u?맚@&B;~8]MTLGZlO4`;Bvq%?`v߷Zl7O4b`vJՊOo~0S-Z6C]OO4`;{zOQ=x S-Z6C]O Rveއo2SRve`!" wǥއo2SwǥaGZlJ 멢j(]ߎ?dSDPӾ {'S-Z6C]O i&qJu4MM [0㷿o9 VS@y?[0[0o: VS ]<՗?,;~8e=xA VStHuKSwJt?/ VStHV>ߎ?dX@}Oh u?<slkJslk߷ZlM A' WoC) {߷Zl] A'Yߎ?d'YxJ VSMy?:އo2S|{{SS-Z6C]O> )AbGIJr%(4LHÉ;{ VSi[3Äއo2S)A?|8HsS-Z6C]O y: zO@[o?Zl A"R=^pJr%((3 xQ VStHuE!Qx[vq%?d*7 }xS VS]<xzOO}_o~0AjѲ{@DdG3vq%?tI~ϷoWZl@NDzOND{!,y?feJp|32S-Z6C]O_tH з3އo2SogxFk` ni=;އo2SZl˧@NMʝߎ?d'&N`[ VS<q0v;~8Cx^ VS]<u5QStV&;~8]MTT x?գd5tH ΣcQ߷'W2d= L"NLk2d:%3ղdtDF̙2D"|@k*zo2iQ'RJLݲDZ%v$YOE ZSWL5o4gQ<Ą hQ+Jgd3ie+6tmOS&7hz6zJ;F m=Lf΍畛:6@oTѲ}BoMSA7g9*Vlg~Jm*$vhH٢2z8-4FT"2n~v"7EmS)M;vhgVշfz 4 Q<운4FS5oLk-4٢2 V3n~vJ͛&GqR͒"-S2Elռ{VljV!4VPfS7mM[!3lE"#OQ%l(Ȥ]cqT2"vg"2"vg5Ed>!FE"#7g;! 2)hٽzg;6D3Ṡ|CjMSѰ|C!3tFd>!FE"#'$NڦCdR.1 dZjn|BEF>!S=d>!FE"#)iT 7d>!FE"#iSzQH3gVSFQH3 5|C<@:"N|BEF>!Pwg;iL(Ȥ]c,9Nٜ%2"vgd>!FE"#(M=D"vg螖L@d>!FE"#Y=-hvCdR.1 Lݫ! 2)B?dٻ9LB?e+VdGi$dG d%p~EBoEGK4m?eDPJdե5h*'UTʖ@MW.\9\rp&$)grաCU4edyvܑw 2 arlCj )64nCl$i襣vІ.80 u!O2& 5dѵ5Jլ3ɫyjɣjY' 2y\=Mބ=tWOFIY TqTkkDP-5OC [3k>fg3TZjthD-5OFf33TZjtefͳvskB#fLz7g>fdZTJdѱ"Vjɥ-DFĉZfʉʍ;=tY4xɣbDZ3LzSU 8dCtFM(?36\=LM2@#&N7 FAc\9\rprÚhr; V㖭kMTYjMf~:34TGg'k8j5)m(3?qCF2z 4k>6*3?qCF kjS=LH:g(hڦM4\rprÕˇ40v!K=#-Z֚E*]6G'mpGgA:Õˇ+W.\9# Yh~9jf@fO+9M y2+N(nѬFiMT7g;Flnɣfsk6g:3*lݜJ;*hٜ捙ΌʦJ>ĴS;)@hY 4l͔Qiz5%LݲDH Ϯq-f @hvM[7vSCz)8gdz-CeMR%ˮRDOQ%lVĹuĉZg-S*T+b\Yƺ+Ѯ$Jգ9ji$ 5Jؗ.+VvTvT+b\DZ3L5Jؗ.+о0t!prÕˇ+ia2BzG-ZZ?5P9TLiZ]6prÕˇ+ia2BzG-ZZ?5P9&O2!O2 Sڐ[\4@S44vS7lFf͔qT2[J͛&IoB*j.]tٲm=D!f5Jؗ.VlL5Jؗ.+VvS3dե5kgi$ UC)Yu3ɴ[ІZqVd)Ce+9\U=DZ3L\ Tw=D!f͓i$ 5Jؗ*p4d;.\9\rpr4L9HRHCV535DiL .#GCNNG#1\HFr;&ɣfT i1(tEu!O2)*QO%ST z%r ddim*$DZ3R~z3jzD\*ZlK\FFr9w ڷA%]tS̆vݜtVȳHi44Z3ȓTDZ3ȓTBCeLM9 SӮ$Jգ9j=-hqJd$6Mr+r8 +$Eie?k9V44r$7l-Rg=Nz-C Q7"npݽsIoB"r=n[OFhKg"g-S>;nsOϮyY'ZQ< 4AEr+J]D7lEz 7l۳\=C興M-M<-uݩ"vS7DDElijhݳ'ԅNd)C"s\GSg9p~CLfSTݔUFfU nɴTJq>"KJ&2qD 5 HL\3"4@7$Nz-Cn⦍kD-5OFz Rɢ fNz(oFvm*d+6tkfʹ[Ї$Jգ9jG& &IoB6IoBfnգ9jqTStFOQ%z'DnH[І?Ei=ZhR-eI"fMZSVnԑ97"͝;IiC n>n}r ""i44nZ!g y۳6nٙz &|ah:dkW.\9\rp&$)grաCUD˦"utîPV&eD3)UCVzm)욷lʪ&3iLgeJz*eUkm)Y5nTMgeJz*eUkW.\9\rp&$)grաCUJPfkg]3wҢOASKS5-c\9\rprÚhr; V㖭kMTfjݚ"+iM6MUNY7?3U:d5TW.\9\rp&$)grաCUA&~Jm*$LՒ !7SiQ'.\9\rpr4L9HRHCV5("҅D SFz@O-S[8d6Hڴr ~?E}r ~fF?eL홲ѮDMD;)衽vp$B:pprp:9vg7qI"jYQH3(IBnΖCdR.1 Ê&d>!FE"#&$OC! 2)ay=" 2"vg&p≙QH3CdR.1 fCdR.1 )! 2)axٹ"VCdR.1 ݪ*$47Ep|BE.\9\rpr4L9HRHCV54Sudyvܑw vB:80멞7Am*$Õˇ+W.\9# Yh~9jf@f3TIM@yfٻ9ͥD7Dq-HZҢOSv΍AM[+VMKE3\rprÕˇ40v!K=#-Z֚3Jդ#CCA#rF6M3\᜵Nz% 7$lqTk%p6lRފ)dsi$dG#Ri-,DqB?dٻ9L\=D9Qg+r ΍Sٳ\6t[TϮAZg`6tkqCFkVa4AKZKN9j)Zt$#Ri-:Õˇ+W.\9# Yh~9jf@f2EZWMiK$V&J͝攲!J͝j62&L5PVl S& MFRgC$ 24qATC& PG& )Y\=L%DhԔ茚8$4pH J͝jG 8Lݱ"z*eMT2h4TG nɣie+6tkRʖ!:硾,fΉ饕ST+]r 22qD  PFVl S&ʔS茜Q:Df S$&;jJ͝dޚmS#S&ҢOAMOS)YVz4m=L%DhԔ茩Mk8dա)衒+i3ʚd*QOOVz4m=LfΆTr 24p茚6RgFz4m=LfΆH7DeMT2h\=LSiQ'dCtFMOS)Y\=L6RgC$ 2BoMMD]2#MOS)Y]3vĉ評5PɣLQ2&о02 YÕˇ+G# Yh~9jf@f47EpmrÕˇ#d,Z?h3Zjs3Z'-NmrÕˇ#d,Z?h3Zjs3ZZU;F M\9\rpr; V㖭kMTfk2-57D]6prÑ2BzG-ZZ?5P93HkW.\9$)grաCU7lҦ.\rprv!K=#-Z֚։nDJq:ˇ+W.Ga9jrաiQY=,΀mrÕˇ#d,Z?h3Zjs3TVtOKtZ&tÕˇ+G# Yh~9jf@rD]6,Ȏ5fZ5M]6,Ȏ&DnΦdҪ[Ls&H*5Pij]OMT6)u:Õˇ+W.\9\rp&rMrաCAˆd6Ҷt C#49 HGGt6m=sV-6ֹprÕˇ+W.\9'@ih~9jrʩOJY!J1 CC49 P:[8j5٢2z8-t[;V:捧ѮqR͒"-S2Elռz!Q<"":3&C"DMۡ(t&;j٢2DnڦS5u٢2AMZSV4FT"2n~u٢26M4FHO;&)\ݚ!77fd)[ ɹ7fz 4)$Y4knIjܓ=O1!3KyJ>ijzgS=M[+Y٢2"RiKFVl SG TI3f?%J͝Lս3Ӯhz6sFɵM)qCF kgVlh畛:6@oAҢNѲ}rTJҙ#L 0 0 0 0cv;aaa2 !aaaa8aaN!aaaaaaaa8d3 aaaaa2 !aaaa v 0 0 0 0 0 0 0 0c!0 0 0 0C 0 0 ' 0 0 0 0 0q 0 0 0C 2GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGd)CdF=L6Zz5o4Y4mT K4D2AT2#vsg[Ї9YP+9\U=ꕜ*tٶh DMu"kgDMth5Ea+fmgLVljMSѮ5ELzjMSѮٶn}thDlݜ隠SfLՕ3̋CJL6$Jգ=tY4hؑ+VQ;YQg&O4lHFz鐧 YOk&ҢNɣbDZ3LՔS̆ʚh]3VM)"OL'fGoC=tY4TIҵh]D茩q,Ӯ VӒu!O2& S#T eKB\eMT2h 4@p\sTH(hڤd)CdF=L6Z=LV6z%|= g3̈ݜ 6KzY*IYgVrz9Yl DNF4l=C樴= %lͬeff=hD-5OG3TꙪ-5OG3YYlݜhDlݜPgvs5eL"ҢS&hϙ&vM%jћ*'k*4iIFĉZg̅ TtflPѵH34mS*gYf~↍dѳJB3JB%(ĴS;)@hY4AlމOE 觙 y2+N(nѬFiMT훳6U7dѳ9ѶΌʦ7g;F{iQ'eSvM3hٜ̪nɴ%LݲDH fljMSѸge3v Y 4k>AAlމ5EKE3d,5D蝔Pފu5D d%p~EBoEGK4mtS̆BvW )=M * 4AdѬYe3TZjT+b\dz-Ce-UPVr]L2m=D!e+9\Uf~↍;KzM * 4AdѬ)m=D!e+9\U=LOQ%lJWkhZdٻ94lʄqv&%PѲd)Ce3Y3eJ)$j\=DOBNAl\=L 2m=MD\HFr;*QOOVv-SQܨ%CTrҵhZ=nV$K y۳6nٙz &\FFr9z[4j\HFr9z[4jHlCI!J;ZuĉZg-S'-N?YLɳvsӮEpZ7Ep|DM9g#J}q&NDCtW ]r givQ%z Vz-C"7$NBvÂKiQ=- s=W pCtWm{)YO+2$T'd(NEiT먞f ;i薩TIIP"+b\+r8 +$Eie?k9VT6۳SO+2$T 4AEsN۳z[4Z7ly-H]ݩ"vS7DDElijhݳ'ԅO3VNʦ쥪9UT2&OմTJq;*k-UPʦOUDٴ@m=H҆ɽ Q:DfMglR$W ~Vl SЈTNܑ;i$ 7mЈٻ9&jMSѠSD Y4AlމOE g<ٶKzDZ34pHh2m=D!ٴ@%6Kz Sݵ-ڴg-S*z'DnH[Ї:#rDOQ%}7$Nz-Cdnԑ97"͝h5kfTN+]M2T5gfҙOɫv,ms6~vT7UQ6vҟVYUDJ~vT7UQ7M2?&eDh 4LfP՞ͥ2VYUD6~vT7UQ7;iOɫv,nvҟ(M評TMASKS=tJ>=L|J>Vl7?3U:sd5Tgs#?dV@TZPȁ*gl\Aȁ)Z"q,liMZ@3fz(oF?e5T짢h$JPZ3TOUMZSVy8i;ja5P5LhKD!Jdўij!Dfե5l#&jMS|BEF>!R҉d>!FE"#)iT(Ȥ]c.zgd>!FE"#7g;! 2)axz-Cd>!FE"#4Dd>!FE"#%g+|C!T$d>!FE"#Y|BEF>!QDORvt"vgQ3! 2)ay54A"zQH3|C<3L|BEF>!NHH42"vgH2"vgMQH3"vgQQ'A+CdR.qCtҢO=N(nTIO<7g>f% \TInѳ9ѵ3ɫyjɳvs}shvS hO<7g>TIo3tGԅzltmz5o4Y6nvҢOge2fC$#Ri-:W vHGjZuKD̐JդRIRgF,D&RgFdͽLnɣj"8eMT2:53ɣ@Gє茩Mkg5PɣH7Dd vɣ@hVl S$ Q5%2@#& MFRgFd&h57lHSU 8d*hzJ͝攲lfΆDoiK)YzieT"\=LE?m=LQ:DfH7DdѴ2:53ɣie+6t22@#'N3 5NڦGRgFz!7TɴgFVld4ծAMOS$ Q5%2@#*jG5h~z(dmr 24pʔSծAMOS)Y(\=LM2@#&ѮAMOS)Y SU 8 S$&TI PFVl S&茐SiQ'LFVlRIRgFҖD")Y3oS*hڮdG RgF=L8$4pH J͝ (nʚdƃ=LM2@#& MFRgF=L%DhԔ茚8$4pH J͝5PɣLQs7lHSU 8d*hzJ͝JYRd6RgC"\7RVl螚YU:5Hg('@h茚6RgF=L6RgC*QOOS$ 2qD AHMv2?%2:4dޚmS#S&ҢOS&iiAMOS$ Q5%2@#*jGG ?e=2@Em6=LM2h3ɣie+6t2h3ʚd$ 2hzJ͝ 2hzJ͝ (nʚdƃ=LSiQ'dCtFMOS)YAMOS)Y !7ҢÖFVlF>! ! 2)ayB 9Nٜ%2"vg jfLq;fs|BEF>!Q=-hvCdR.1 NѲvCdR.1 dZjn|BEF>!S=d>!FE"#iSzQH3'-OQ)(Ȥ]c+:'9QH3VtOKtZ&|C<;jQH3gVSFQH3 5|C<@:"N|BE2dҪ[M&u5Q3Vƺm4k8%knnH?V#rDI&pJ"Nܑ>tJg\~K ;&M*dʩOԶqCF k%STIZo6!VLս3OE 7fʙdZCYk\↍@4Zfh\3Nf\=S$kR͢ Jݦjռ橮.(hڭsJiq,(}u$ZA 5E ]K6],OM:j+t[;V:'lպtfk6RgF ToEZjz!Q<"":3$V[̇)sVljV!Rչ&z57jܓ=Z t=r΄ޚmVw8zgSU DqjSLҶ@7f+jLZi7fz5iMZPɹ7fVl7?: Q<운svh (l\ݚ#)l;&G\ݚ#$dҊjSU!QiI&>$W']SrKV4É6y7DSDPӮ+\zo2iQ'M-S5oL饩k敬OE )A4ie+6tkg~Jm*$hvsf΍r%(4LH"RKfz )AAu5QDTkDe3VfNtIk6Mn\Ѵ2mSyuĊ\PѵHꕛ:6@o@yfΆgl]MTT*%iL쑦qHl l꠰4+$-Ub~՝ab&/2 # ./usr/es/lib/libclverAPI.at/KLI$$ ") 1:_acert 023;=dgilmnosv ,-.4568Afkp !*79@HNTX`bhuw|CEFGLPV\xy"#$/IR%(>DKMUWz}')y@-m`Q2c!PyHAaIBbR*1) U!zf/UP\/* 䊁qD'BnF+Ovbj8^*.(* b8 ,0)$JSRD!]:X2X`FT+{H'Te_h[%y"&S8P<PrH_ ł8 ڡ#n\;QJrdD eWذ I!҄19prHtOՉ%aF$O[U geSŃ%FPyJKQ1ID%) "rx/EЧj&NQ S:py8_+BPaҀL(CNK'$Dytb0D$O[&qP>H#eS A%*e-D%,B␾)B9D%ND|RP @!@ &X`RI!ĉˇCRD#˧V& =o$OW(L㬊ugd J̣pVmm6LP<ĥX8}:X(CNK'$S"41Chc4CW cCBhcdO  Ǚm+\m3)Wy":ˎޕ^HA7L㬡H}SgdVӨ#?mIl<ןqQ+e@{x-BHmEHḷpViq:ޙYB#o H[N@,pRlRӬ3:dᓋ4l-Fy#`J pyv$3 # J@%X  ̃Č`|q(> @%3  ĀXHDx|LN%LRA(>aC1#2tys@o L-6J`JFhRFQ4$m !2:lxРq̒@:lGGHM8yĭ mq #\GH Pq P8VcM4 "#8(¤l.:lЄG lT#D&M8(¤`P)qX.h(0N4Aa%\a4 :\a4Ftys\Є*ysk%\/uO0NCdTY`$ YB#o Hu#˯D(0N<4JM<9eQR6ege C䍼"6Em:3˯D(0N<4JM<9eQR6e qP>)"J}'_%H&` 2ˈP'` 2(lHBgS8.:GX_0)P`y|h#yr4.!BsDB 4$m! 8Y4ϰ.aS<8*GQ48i\B;戄iIEHeB #Y%#mX &mIl<xN<4ӧѤ`y|4$m (AM8yƛH*FY%#mX >̣pVm2iIEHeB2,G2Li NFk 2(lHFAMH#eS+7$:yDl`!\"L㬡H|$FȭQF}u8qge C蒟`!]qDYqR:B8"L㬊ugW\D̶ y#+ȏ-BH(0dC6 P`!_Mi8hP8mEHl<C=m2NddO4B>̶FdW2o >̶(0d0@yy|4Ǚm̈>kT\[&T:;T X.-Ųꀔ\[,P/ˁ^ql0jEŰ @\[C P55(.-`G ` @f.-2TŰo, _S׾QE'C}N4 }:C/}N4}N4׾QkSCf}:/}N }: k}N }:}:׾Q29 ut>GuƆ:@=}Nѯ}NЋS4G uƅ>GGOuƀG~G=:@.?Qh/?9}N}Nƈ@:ɕƆ?O>bp>(%3Wq_`j/S>0wD}Ŀ1 U]~/L㬢Jk+` 8__\) 7Wq_= qo{qmO`׈SG 8OoˆcT]~+ *WBϋ+o˜|L[,+qlv 0NC9 '! ql|PS> #%)Kv ? 2*.Qp>(%T]~0>0%}N-9w9 <['699?}N-U3qwoϩˆc*<]VR¼ۅW`; S1A/+Qgb.`;ql?}N-`Kqlrо 8E6(>/Z(sOVRVc6wL|PK+h8/ſSm:}+D>(KTϩ #%)Kz7\EVRVleO˜t5w`x8t/ſ_Ŷ>^"}NQ%g`1> #%)K-Q aZJ6Z0L|PK0;Wq_m)}N-_StV x9D|PS%8Qq/9L}_QWq_l01X_g Z?"L|PK0 j+7@ꉟScℿL]4&ˆcUW uk+h o˜4 +/S> x2}NGK}NSp4 *+ VRŘ":/BY8S*+q3qo%}N-U3qw 9Kp>_r+ uk+:Wᠻ·L|PKx ǗgeWTR8y`@o}N-U3qwsӾ #%)Kd]}P *W)+/w> c_!-]}P#Eϩſ.4L88ql|PSp>_rAU]}Q *W|T_W d.}NA]}PĈ0N<> J[%gூD}Ŀ1 H*+TXdOVR~/+"wL|PK2⾨k 88'}NGK}NSpdW}Ǚm *W@w8|2> c_A6> 88 #%)KhUW{P Ɔ22pFq) ٙ\]PC.%$P{0#ɕEW*858W&W8[ \kT-ɕ3)`M+W3)4r2ߢL㬢J eSL㬢Jҹ2 srÃ_@W&W8[o S@m++-Cyy\ox R<4eU@wST 8ɕW*85Blh.ɕNeUM{tʀfW&W8[ʁ`U ;ɕkKeUB?}NP1a++-@RUx* c++-TLU^_>u}N`4 reyÅw0U reyÅC-W?{tqg++- +ʫ a.c++-nW*/p1:9/++-dU^7pkn`fW&W8[ òUyÁ@I,9\^_o6 PDUycY6 PreyÅ W*850ɕʫ :}NrA++-ù_+W02\6RUyÁ@S\reyÅ&ĮU^7pk˳r2]6r;.,L/pQ\o 2\8ҹUyÁ t˂\^_o.ـe+W2J pcU^_c`S\3r2ߢmPUycd>=m2L/p$pU4>>  $+BbJ D( L㤁%L㤁%nXH2ƈ2e&6F&Z @* %o8;>y#X#Q0#@#G̬<<<}ǙlT䈙L Bxge C䍼"6Q%?L㬡H|$Fˎge C䍼"6Em:3:%?L㬸qEm:3ePqQ+ePem2d2#z>L3'ym2Nd̞iyn mɜ<<7l(ZH#eSIu)6D3!F@.:Giu)6qR;DYB#o Hu#Iu)6qR;L㬡H|$FȭQF~YB#o H[N@ge C䍼"6Em:3Iu)648(RD3!IO&qP>)$:%?L㬸q\uԎ&q\uԎ&q\uԎ8"FgdVӨ#?DY4&qEm:3ePx-BHG2D(\m4x-BH2[-BH(O(D(\m䎲ePe#̣pVmm6LPqQ+e6&p(Qq[h#igSGyl2[-<7l(Qq[i-YeYeYeYeXђDK,,,,YeYeYeYe2,,YeYeYe,,VYeYeYc+,iuYeYeYeYeYsDk,,,,63`}&D+,,,,VYeYeYeYeYcFMYeYeYeYe,,VYeYeYc+,,,YeYeX,'kYB$uu#:ȭQF~>̶ y#<7l y#=mP#L[BoGiR2v&dO5mIl<|2[-3@z>}ǙFୖeG2VeRW"e3% )$:%?L㬸L㬸qEm:3Iu[N@Ǚm".6Gh4+$bbb&I~ # ./usr/es/lib/libdescrypt.at/KLI$$3,+# .@~ :Vx !$018A`s|} (*,2469;<>BDRTUW_aceprt"&)/5HJKPXZ]bdiky#37?CINSYfhlmnouvz{%'+-=EFGLQ[\^gjwMOqNpp89{{989{{9Nrn{{{{〜vn{{{{#p4{{9{{{{8G#pvF{F{a9{w瀌'pA\FpSv3*OGVilO- w5{!F𓿀>d/<t($)I=]P^ (`bv\ P"Ms.i] QR4Qt%@iX5D`i/47 S)-] #MJ IrH%U(@QIjHEe(D "u.(%P$BKMdIC>t (#r)Iᰒ#Q;W!K@ tsF!h"Nn K%KR!(MU%҉|HX5H.(LIl4;̢_/ #A#D0t6@@ɭ% H 01!QyTPrkhIh/ 01/9;/J'PN rPfI%t9Fr @!p% !I`Оt"`R!$1jR[5 lNJӣ; YR!(0:Q+GK*D:@7.(tDIejA&ٮš^; n? Z N"k >lԇD0h 2cG|]5a-c/uSqΐo? Jw(" =s HtLC.N;4PVbx g!e)Eb=4; œ ӎ '!)SIgNU,\BK#*t^YKGAdxdxG(#C2B+@s PRbaXlR& 8 R6E6[CPJO+6>, !6AsbA8,l d탒jvh)''HIbQ2bQ'e6PBd$ B#HhGTɋ %L DLPa*c 1 N`(ˀi )2e[ ̶#e!- #`:H2I!F=#`D QVSeA)B@I %L 1AYM2D`?H2R6CUNNt,! B탑Fԇ@ej`N#81Ab)Vr>  K x0hrLlS ) ̶V> : f9'l?AN59ԍQMd͊T2{;Ng)Sp9vSÚʤI B3!LJL4)V!4$hu#XJAa*b SXJl8a)=*-9MK( K6=3! @U!="41A$ItrBPbRe AR(01JnReBNe,ä'ltTrvaC1 P$'I) [!)D49>ԍ&[ҋ($'di !6 σ:+6B&l ;a+N?NO+I͒ A09!Q2(Eh2z6B#@ JAa* %LxT8a)le6[[-Qeb0~[AFtd 6Ct"zF !=0,!e6P9! I %L F7@Yb [-<BeI VA@B@(Dh2L&01aFfAa)LPa*c8a+`X!2؆Se'll`ʉe?HؖlGԍaFp#` !<9 p!2$VA&JT [B--A-yQ#b8~,=HI 0.Nؖ?H|"@uЊҢ CŃCRXAH@lL"Ak +6Y>;bXA H5avp,6N '2`''01! Vq +6EBet!&4ņ [&P"a1Lb [N`?H2R6&[!D D$ I yiH (0zF"2l@R6ABzBLD2`22*!PAa*b S0x`i, #`7HITDB@;`~D)2 B`TPCC@R"f O#`m d f*> :Y&v@r`6N<4N1i"Ę&eD̆TlĦZ 7B@"4La*b P:a %LxTBe `N2.)2EĢFhb8~,=H؎ 6%It"zBxs2QBeIRZ"0jLa*b S,%l!Ll!DDy ADiv!'&`^'l&PA @ b`)H1fAjF2I$̀O0NVq b>,Vl'S CD LHl d2`fC*6MƂ(BLIB+@ B`B@bba1 %B:ja %LxTBe `N2.)2E:TH lG6%R6%It"zBxsI p!2$ZhA ,00V`bx`^TH؎lKR6$*=!B+A ["BL&<49la0`)HP>Ak6p bvŠ: ,AZM ;dҋ( K IUHb`vl''1)nONO#@01! |b'L 00! %LXa*LL 1AJSL!l [&[>(2Fhb8~,=H؎äF=!<9̆Tl8B`A &JT [B--A-yQ#b8~,=HRp!e'lK> l:BL ЄFCŃCRXAH@lL"Ak +6Y>;bXA H5avp,6NVq "BNO]lGANO\`bC*6 L ʡ 8 %L 1AJwMð`?HFqs`=H !d0"`C*! 8N'iJwJ-Yl?R6 L I5, tBzeFd(Js-Fİ#b: Fİ#b8ndOHO\hʍ(BKEg  S %LXa*a! M ڝib8~,=Hؐrs5! l P  S&-#`E6[CPJO+6A'l iЄ 2IA Im!sL49=hZ!2Y %IP2Vqӓ×S2`%!'{*Pp$pVpB\ 8tB&00T"3b S,%LPa*c{-lBe lA-Rdl`F)!Cԍ#b8nVp04!*Y"B&00Tņe0l= #`𨑱?H4I9!;bX#aAM2jЄ%B@pa0)Hhr3 l;†>L&|l(B c@T>N|t# p!:sG9 *!) %*1i v"g|~2pjjJRRT$`$a*U>:rRv|!J@ԌlRӀP&JRRS||2|7 >#,|”7H|)ZBBFq 1!ðCR3000ɄBOVpRR ԇU9;fY`^9oJ z( gH7t N( Pe;dе!1 QVtG׬|EKq4, ||CBa)^҉0B[,*蘆 g.[CJˉhg'@\z(A5q1PH\<IDiUK)@p %҈is$RlKπX+d p A 0T*CC6>N!F|c-2*CcP,W) A$$d6rsgxljc0z;QlFC|t1(v]#> |?j@`8^)GZp'#2I~,nDÌa'fI> Dc,X܌ ψ@|;^g#TY r=㑺(B0r (bCa0C! >FƙS_:Ak  B\zF`|649>ЬR4p};|vNV? ;5φeTSr8YZcsm D f;:A;@*;^0/`*t ›>>"FJJ${CQ`BICh1 45C= `\bPQxxn/4 !AhK7>h;?tgH(b0T @~^9P*Cft"1 B0 ?{QAoHA xH%DWTJd2H(`^ !A c0zv;@BXT7(  L0 V6F74xrw1*6%;5IF^㑹ms`\r !`N;fD\=|z vc\q҄0 #6PNNP=@@ÓXzh/ hFC Ġ9CЬY 01/ r;|9#z<>=9Dj㑺Δ!ÔPG 'y;|F^ܶ҄0. ³\FC425L (h7C !@ü*C 0$H̒K֤CHi-N@TBsd"asd"P;-.l60sgsp[q>=|C!Q꞉@|(%҈iXNǠ>vKbri.=xQkwEA xH%HĠĖ9ssLL&eBa/**4- * FEf&ki5ib!,/ER#(ǐ503e|"b=cyeI0őL N  xJ# &^`xE<n 0$ A):8 ^; pvM]$YS83|O(ŰSjѼ9c(F)c]H^o¾S.#yWWu']˸?n/xqOw0NJ弻s{qW_xO/zĎU>cy'\|F}|+oĮ%rw:N}S;|]#q#{#q+wWWkWĎo:.+W_:Oou1_Ϫ`WWUjW]UVYUVZV`UY`UJDg==_Gѯ}G}]v]ؽvz]UVUXVzUDƉ葯D]މﰶmϰ`5F`Zѭ]vz=tk=tfUaUQUagFF`L-D5Q00`Hz$fu[kkVkUsU/]˫rU뚮uW5Wrܪ*W5VUUsT[Wr%nDEjY%W5v`:sZ05^9uVr9zƫ WUcU05V9UVr9Zƪ UUcUU05EYȦDDV5E05Dƨ05uGu5֍sUعvr]].j95Uaw*QX檣sTL\܉ȑLMQ0$sTH5:gQ:ƶ h505]]]acU05]ƫ05UUUacUX05Uƪ05DD#Yȑ9 `5Q#05\1F'3i_fMT$To壧ԯh[dObNNf?88.\mpH .?˙/?Oy_??\1(I~(?⁗⁛Fߢ C_ C2MHH)JGG_0.`a*cR7TQ*4T0C/C7o!#b5l1e+?+9V?s s0'01ɏI>#7>!C/fr77}G~cgl,7X:Xs ,?rE_Hܐ?ܐHbpZjOZfph7afqHq3?f7\o  ?ptp%\=?q-?hhC{ppy/?/}ၷ0  ~2p~1Jp{ G pWK}"K$O >ᑋpD'}eC7oa3of?3113e᡿4?4ACh?_1I~B7So F6/i壇sh-9+Z=|e_beYv??sON2N3˟pF~\?_ˆp_x^szW{x_'s1 ~(F~(3ef7GCgL#R9R:'?RaWo 0D~`bT$Tf? PP1!bmH1?#Yfstcc*s }?s``&>$o$24 !#Fm# F5F7p~`a,Jp{ $"rB/$DrC!>j7>iOZ0Z27o}a#c_lq3eq.?.㟸\p4Ɗhh\qq' >C}o }7p`pe o  7p$`5g`b8b9#'?p+1?2%_- / ?20F/L}7$pDfpDiC! o ;Hpk p͗ppps O ~W߸h>o~o~7Ɵ`eoPTBGQꍟFZoh-Z:N-J-?YWeXYDa/:Oo8\ߗp\7^9t^/^>~s\_C℟ A⁃(~( Dm D5D7/HI┯{|0U0[??#I?OCT2T3_F~b?#_F_Y++?ⳟi_XX?s s0'01ɏI>#7>!C/fr77}G~cgl,7X:Xs ,?rE_Hܐ?ܐHbpZjOZfph7afqHq3?f7\o  ?ptp%\=?q-?hhC{ppy/?/}ၷ0  ~2p~1Jp{ G pWK}"K$O >ᑋpD'}eC7oa3of?3113e᡿4?4AChY]`sq?B?6 ?Tj6Q?壏G/hӗ/}eYgb]Y?'aN'4'N3pGq\~\5ˆߗ /7_/z_ǯx߮/01P(G#(3PhOg'??O _Co L)7##R:RrR)_ 0]0E`cTRGTg ? P!&I1~b7YVn/uV=c﹋+0}.s `2a$qG#Gq!܍#f# >cWcw >``,K  rK,rB"$E$0!-aj?Zi-4Z0'?qa'f5m3g.}.9\_KƊƋ?h].q/C^p#?^hpa O p ?`lp$Wo`7`17b8##brp/11}+%~ }#F?pD?"HpDgFC"? pI Ư pnp͟hnpq / _p_h=h>CCCm @Jp928{ Dp0$1 ALrPfI%G!x`H<0$ : pvp9J8 ?k?,x#Җ{o_N?*"5ǁ]S$_8"DŽjijpW׍5qpW>᦮<MP`HB`Hh`xLp'cCsp'pG%d^ȤrPfI%! xH%HĠĖxц*0T]P_an3Wx@Ⱨ4 8N<N<;>8qhBH<up) !ǀ;oS`@B:!;%\2w["߻zCHHb8[o?WdU׆Nu껊W)]z;ܢ'qO")f;_*께~duu]?2E 1?O.'c& 'UE׆NO^;?W/nWq=ת4_S`@B:!;pR?]Ws̑ɖBfY d&eG AL 0$ G%d[$x8&xRFx8)xr!` 1,J$CP0 Ia'@< ޘJ< A8&xvM7x >PJ 1J $$8^E#2I./#H̒KGpLE#2I- ȧY d&eBcQ& 0$ Bx)'DHCA ̒KXdH CAJ $! xH%HĠĖs4{{s{8C{{ٸN; Nsw{sw{{/{(: 8LApJsux 8Sw<'wUZ[H )*<)K$'%U_PebY<)~"_^^xy _ _G 90$ R N}E &@?`GpLE#2I/=]P^Y5C#>!R>9dYtsT >@Me#%(syJ $4IC, &@.s&`0r$$OT2Q#JPCQ)V(L F8-tԍ%@%Ha H JKAzTF D .R DiUJ4($KˆҲ@'R#Ir I/95Y/J'A/#H̒K4IC,D]`R&hHD/d @D`YB%P3Ԉw@Զ-/C@Zq9D bpԶ\ KD9yi@^FBs7-Fa l$,֠Ih/9-C*% V$qɭA^2Qyܴ֠(pQ8%H̒KhG$ShYJbPpMP蚀$ d0t&!i& 1!a9CH!! !NCPJp0+!K&*D;@7-.J%hG=HT$ %i(@ CrZK9Y(0Rr&K!^ H@@N;fcZB /q4, Ƨ,A0\T1 nV" D2S~+Sb$j;j;5;^/%ΐcS T. *7Ex+EJ#|[ pV`JtLC \(3PMNr&ebȚGbdCԃ68,9id!NJʖBGdBPaG`<GIJ<j2$ӨfM5$+"$A١*F"bd! ̟DFCCJ%͆&O7N;,jiO+j;c8lkP6:SXBNDʉ ;K'}B3-#$Ӫ4ւMt4B+@}  ZR 턨DhȆ%LXa*b S0؎d Jl&O`$l"##NY?J"?1*~JҠ?!CCxn6u9`C*6P4M`+"%"JD4a)\#2~=?Y?L Rr X'@65?9R6YA&RkHDi4;49"Ҥl?H@?ʬ+ +6Ylv Si3k6ô4ϋ!pq;ӆƲeRv:`vC*&(ʃ1RG-,De4$IEhl$"4l%"0ņ(01 SXJwNdғ-B'*FȤOJq9d^WHl)C#`螐VLeFp4]BB+IA H%LXa) '!tl':Q"aCiMJAjZC!beM[#|b!MdDZ ;`x阀di+FG %&PbiH CC4!&849l)H~#-)2yYYK'` SK'97Y6N;Nذ=HONO@[*?h7NNt6x $2`TC*LFdu+Met$FMB ZR 턨F)LPa*c 1 Gb9ieФaE\O`!K'숌EHz/!7H~zCx6HNtB! eFRɦ CZ5"JVh@ LxOH~T#`:N:"!rsCReV&HH H)-J"cĈV[RRe a*O"qؘd v Xp;c;b 9BzrzFl,U9ArslTL eA؎ZY;碲-&@.Mt! AP ZR! Pb:b S01JwGXw LYl̞C*OJMC=!6HNtD! eCј4DDSfZYB@Ti -a)ф %? fOEV[ LCFCр~tptDL'?3RJlk]hDhf) OҤl JlE':Zg}JF)-D fB(% DZ;`9ih;Nӓ!p5Sx{AN6!Fd2Qr ,(Eh- `&,01ANjc 1 S0SlI[ ̶7R?H2ڀ!@#jRCԄBHz?HNteCљM" @b SJ񄭀Se#)2+({6U6 tSäᱬ#bқ(aXkEh?B: Z"b`~1RF[ l+ Vll^ S^A8l'l 'Ad"sBzp)ip1DTA6탱8lkTVC*ʬ @:FVT [,0)2~ȈbM@!Ȋ^& Z&6Q ]vTņ J~"#-hUȊ^WH:zʍi]Eh@"JD4a*b OLDddUe ?t!Cpl-SRax\&@kHH4f' [c”|fOƢ#!fR(%A<~Ast!? ;`잝?N9P7NDʇ ;g 8l,DJC*K#b`mFdtM\5-"%"JD4a) ̟"2~ZUd06HVqqQ!!+ @hJ*N'B@qy-a*b [MFe$)2~F?H,% b3$Ө! &,01Ap`)pRddX~X$l7U9:NNs"타!贤bY„$"B5p1`1@R#d!D' R6%6[RRe a*Obs098zͨ 8K-N~:''`EN䍂ºr! ʃRU#$W\hEg -B#8̈;a)фGN&,0v&,YLPa*c FOeV[lM)2$({Rs'C@! !t=4RBPf"2M5p"B@p;a)ф&"2JHGR(Zk Oǂ#-T3;`=H|JL+!/B@pŃCCJTdl Jl d fU, bqؘep>t+6 Cd {iN ӓf Q2rPv#Y;碲-*MsPАP#CF,0 Tnj%LAa*c9U,SeФaE\쮐hʡC0#eTaFʤ+Bi2BshB4!FeVIp$CF,01AU2Se쮐lI*dh~6:pԄh'? ԍ!²Y)4dŃCbTIMfBt"3EC~d"CEg!CzRe1,XR4 k 9m(7NjRee;hä킠ntsn );e钐ʉ2Qr|"̟ DIN8B@p4tâ ZT9m1 SXJᄩa)?AfdG(TNeO 64P`>Re:H~B 6 В6KAHO#8jʍ،4*Dg-a*b S0.lL ,AFp#d#`EN~; ӆƮ9,S""9idr>%&PbihHJjvhrhrf#d!D-)@De%&PO+ k6d sv Xf'lplӟӆsMe@h$l,Ig2hmcR`|ce,tj$,01ADg0l% DLxT0B-I~:IeȢ`:H8'l2;-$#`Z By)I B+8vDgJTnj%l-IYE~X$l =pP6 ԇҋ(Eg"3'8*LX49Lxhrd0hr>}))#(AqX 'lP09>t[;&l@N -N~:BNO+8+lv"lӟt8D9!PĪaH40Ms(Eg"3dA H%LXa)LxSDdNUe aE؊tY?HVrctDgCi%1aJJl􍟔Yl7HO#8(L HeCљM"Jӂņ FOd(dA#->>!> >!> R^P?H.p#!ʇ6rʑ%jjjȄ%!RJSY>4(dH|^?HzBB;fw.=4r7gH1|(C(d*NK)1 B;wh-mcxn{Pn:AO3 b$ a0iDwπT+d'N()1 B ǤH @JnQ +Ⳅ`|$8HP?#8UYV@rBҦ@@UX@U mҪ8@qDZQ "u.sjP~rjD\Q %}E PI¤40O@ V' V' ҄j4&E! HrPfI%4IC,d1(49Cj;QFCBi<*T1MrT! (b=+);f 8U!=H\; j1q # 5X3$ {gb{g`cv̒|B-/'F3$"!~ K?\U?`vS+9Aq@ n=㑺(Bsvj/rdj<Zp8NF `C!cEp0\nD ca 2(`K1؆a|;`z)Ur0Œ;k' +>OPMfw D-0p!6{QAoIA xH%DuAx$DҲ| =Pā4Ӥ1 3$ü4ihe & pP)¤01#qth& #$x6;@\742q rwp=sJrjsAx@:C (@x@@CrBY JJd!R\xY30b.C1rw䓕@$ˏFfD/CBܶ҄0.9@#xT1|=7AA|{Ӟ|zTa+/5H(CT7 Ƨ*1${FoJcd3P0/֮t S<*C,WqHFH|~z^9(C !Wſ "(`H<"A$:Ԉw) 5%CRi*55@.lL.l^\jbu%͐RR<6B0.lNnKn=Ǡ9`8\D4"S;ADZQ +°lNQ %Ǣs[//n0$O I?9us鉐rѐZ\,0X`EF`Sq#Hȸ^w-9Ʒ,W%(X6qX#1ufFs9pPQlUDZo6&)5!) Dp0$1 AL# b`H<#sqGGKa1NqB_ r43gFp%BxpmZ7G4e205G#QGtKN&Q_כ؜#%(#1Y`' %EQ<@&iEr5ibKFЎ012V03e;][;][;][;][*R*X-d4=d x JqLg'# |@t < . H B!`X 26db0^#ad A(&ĒI(a*GGnIvĮS7Q\* ;WߒzĎ7kwc'\+^SoUr\F9;#q^7rO)q#yK¾wG+oʼU⾿u[z{}o7{nzF^N7,jCaPƥ԰/>}CԾ/}K&{Po7IM5͹zjg >-]6z[zϼyZz6gnnٹW7Y뛛W76z+=Dڢlk=Lڦl,-PPCP,,,Tl/Z=CͪlZ=Kͪ^l&TPnIRnmRnl.{ue̯?2{ZWdOzWkkz毮jq/?8{pz:}CԺ.}K&Z+>Pe2IL&[Pk5IM^'>Pq8IN.[rϸqZz6gddFّKW2YW26zf>jm>jsUsSgpp W8YW86zZ=ClZ=K\l&KT,FFPdIRdmRdl&TPjIRjmRjl' T,PpIRpmRpl?_߮]W]U^V]kWUUVVU]*J^z*D]UmSYLj ]S 몳T֫0U0Y=UL‰U0SUgT; 5/]뱮^]]걪Q^U]0=5蘽 ;#]0ѭ0Y F W`º50]g갵V *Z3 ,X0zz0F3 &z& DuUujjjun]UܾjsU՚VVU]5UYjr*Dȕ]ȳTUQ+5DUgU0v`kUcZr.]S/Xyjr*US+XYj9ȕYȕ0r*ƨX.]&5Ѯj.]ˣ]˱5]WG5]檱r.Qܪ5ܫUX\TsUQj0#5܉&5DjuQ3XXƴf`ˣYˣ0r,jXtf`ʣYʣ0r,jXTfYȘ0r$k93"acTLF$f_˟?/$o?pp _ꄏ_?UZ9tZ-Z>~sX_;ѿt9q'~'#ˍ. gos/ysx/9+^=|u_ru]똿?# ?OP2P3?AA#k!o&_I))?ⓟ)_HH0``" ?01L~*F~*3Fef16$F,cV9V:g?ҿaW[`Dss/1#'dfqd0e FFr3oHr1܌lr1܍ppps O ~bW߸X>'H?ܑ"'} _ Q-I L}уї-f#3 3cgq/ pp p|q4UEB?ha/c^/4/^3``06#0?0_1?19)_~*pod\pdᑇ21"c$#7#O"? fpp#fm Gc_f6f7l47h:hs 4AWO?r7?qO027WFm#Fe-7p-??G߬\"0cNto's7Ni`_os.o˂Gkp.\^ox/^:/J/?]Wu\]Da/BOo@  OF6HlRopG?GOJWR=R>?*-s` _S⤟Q⡃*~*/#M1 #go/XY⴯{|s_ao_a}dd$qFq!d3a;a#ƿr1r6_,?,9_~`䟹"$[H\rE䈟Ha$1Z-Fp'-3Zi F F_pfq03o$k3l.7Çß\:\s .ƟW 4_4Dqhbp^zO^fpxFp plpo bo G G?ptpb=#_d%s%'Fp"FpD>`pD2!70ᙷ3 ~p~4Jp{ U0b܍rOf  pU~H5QYM-?壟GOi_o*?/ȟ?X'I~'?qq\˂7.\6ˆ2^8?ҿU]o._?~(cB7PA(4P0/7D荿D?膿?e)?)9R ~`\/'To'7Ti`_o1oBGk1b+7V8ccVs+++?aW[`Dss/1#'dfqd0e FFr3oHr1܌lr1܍ppps O ~bW߸X>'H?ܑ"'} _ Q-I L}уї-f#3 3cgq/ pp p|q4UEB?ha/c^/4/^3``06#0?0_1?19)_~*pod\pdᑇ21"c$#7#O"? fpp#fm Gc_f6f7l47h:hs 4A_?_ar?ܑq40'?{G'_Fߪ7gwqh-~ZrzZ,]˿"cc?t?s?ad=..6˂Oˆp\x^:/Kx/~]_Y\E?$ @@ DG#gI!m!&qrG_N_J_#R>+w 00 0*H?⡇⡓*b#1 ?1#oF?XXⴿǯ}1~﹅aL?d2Hqdhq2?d3a܌a'܌jr1܌nr6~a,,}×~``I"rEH]$]䈾$1?-G R?-3 Fpdpg036$Ư1lwÏ\9\:/ i_g E4E?hc ^^g >xx=G pjpm  & Gprpu N_##ed2Yw2]/d`p"GIaC'!3{0?3 > >4K  hha  N"Gy(!x`H< AJ $Hw@/ wA0N)G8~<')~<'wK=ܷ)?~< 8ҩ/LJ|j"xHsW`sWǀj~2vK7^;W7\9]?wo)pguᓸJY'pxoUu]?i4444444>dok ?W)r}df_)nxd4_'{.2w~o76]ƟWq&ᓴ8ip;" 1,̲2L!1(!x`H< AJ $HpL iBqS4FG]~'=JQYZ^z};?W[뇋&<-`eYeh+@|X,!ZYeYeYAX& P2,YeYeYdX+@l,ȰX|V,,eYeYeB,@X&eE`YeYe[,,,E,,l5H9VUTǘRؼ7 b!oqXO}T:!n pQ&} )ZտWW2,ؐwå%z۫LW@FBm ⹛ C!ɑϾ*yhp8IjK^o#]6d\2@(}&F>,mp<>'޳$0[TģT҅`^̄_W! ^yxoyx:^jnzmHI]϶M`TPN&3- ޲t ڋ=Δ>Hrdjz}/7ЛEh5xfq M>LP&}S(U ڡ#]6r\l5LP&}S^j܀5)L^4O5hm#$ iLP&}V"+ 7 ^`FBm ⹛ Ch&F>+hp4C#W&+51yv(>Bs7l4q!ɑϾ´V P=]2bIL^o#]6⹛d6P&F>+ Iw4E Y"Bm L谆/51xn @08BP.}&Ͼ`/M$0y(JEϾ"@kf51xn @08HCEϾ"@icgi7x@ h 1$\M$ }}F|6`⹛`lC#T }B62=0_FoYgl~>0;F C5ufBtx{Np?It?P/k$]`HY"cidІY"17܁{Qz҇zL^4O5hlN\2@(|;Hrdj3n57yHhMo(ezgE`P= 0Hrdjz}/7ЛEfW3x8&C#T }XEyЛEf(P&RLtQHPL^4O5hl'oC;C#T },e#(|`+Hrdjz}/7ЛEf +FHe7Hrdj3Ϣφ&xfq<=@(|c&F>,mp ^bZfB><>'gI`#cP@'q("4U˜Tя3!:<h'|:\jZ\7^=?P/k$]&6/5./5.Lm>Y"ciR,(yt k$]ɍjZ@;`q.}&ϾhR׍&/ޘ< >hgEhhR׍&/ޘ<}EϾ"@kf5-xb @08GlHЛDH>-2,lR׍&/ޘ<Бs6&}YYه^+Fh&C#T }B6?b63!FoYg8IJ5H)2ei G*]h3!:<h'|:\jZ\7^=?Ma{T X&6ϼԵb;`qY"Bm L3⹛`l3*C#T }B6?b63!FoYg [TģTҌt*X8&NcVN?|"bB ږ4/ ׏n/51^ P|6`v\l3&F>,=a(| Hrdjz}楯7ЛEfoC9ZC#T }B6?b63!FoYg bg;FF:u-[`~E^Ą4.W-^i.^կ^^jbz&C9&Hrdjz}楯7ЛEfoC9925@d(k#c2RכhM⹛d6PD L dR3z0^+FHe!ɑϾ!@\O1#73l "g;F*P^R s2,ؐwå%z۫LW@FBm /(P&$925@eO5@rn925xZ>RכhM⹛d6P @gEM'GLJd6?X-NQDiBmFLN?|"bB ږ4/ ׏n/51^ P|6;xfqB6P C#T }TT i-^ykk&A⹛d6P TgEM'GLJd6?XN'q("4 U49BfBtx w"$!p?jIrޭxbRE1楦HhMЛD5-hgEkKMۈHdASKMÈl4&F>-{KJ`!ɑhMBss5(yk0 $925lmblC#T }/ychNT1C#W.OC VIFd#yHAd.6;F C3hə 64|!bB V\H2^å3^=!(|L^4EGhM7oC#&F>(2x6@M P%6{Y|tSbAqg 'oYE j>rjs69yvLmBc+ j{Q{Ɛֽ<k ڡx:קXLPԡ2D&FڌhMB;xf8PɄ&F LYM>0925@X<`'!ízyӫڌ4/X>yjP :{R5j>:W3\B7>3D&F LYM>5 LP&}Z>0!ɑOCZ ڍ4/XiƐֽ>B|6:^+P<57| MB M>C&F>,m&d#{ZoYg6?:AwTģTҍT.pj9RF<̄ *$!u{S5x7@%$925xn>SwhMs7lLP&}S;Ɠy u!*\fk$]Ad`WeE k$]ɍȰE8LmO5.I#E`/Mg  E:EϾ"@X3@4:קXLS&z`qEϾ"@XM:Iíz}/Mg  E$} D3Pi7xuOL^4:ψX@ƊEϾ"@`i&YL^4:ψX@Ɗ̑s6&}Xb4#^ƓwZ- |⹛LMAs_132Spe925@d(kb2=0?L aBwTģTғ+V\PHr֌s2,ؐwå%z۫ƒy u!*\fk$]`B>R׃ Eps6&}Z$Zs7y P Ă瀾bfd! &!ɑϾ!@\O1#73lB'q("47J Xճ2l! KKWKkǷW.ɍ46@M P%6đuchl>0xfq<ԴJN$<0 % !ɑϾ-yiC!ɑhMB|l\pqe楯7>!ɑ`l<he925@bgxb>6Rf&x|#cbd6;FF:u-[`h'|:\jZ\7^=?ԸvLmLvx.*lH.7HJA(F$1^|6-xfq<ԴJN$<0 % FgE z@P?C#W&+51yv(>W3x8&%Hrdj3W>:{T} 楯7.ɍB}kNRכC#Vy,&Hrdj3ů5@Iíz}d#P6Rf&x|#c6;F )uņd'G7|"/bB ږ4/ ׏n/5.$]Sxfq<ԴJN$<0 % )Hrdj3= (|?925xb>ShM⹛d6P~L楥$925^"Bm)yk䋲cj>楯7>Pհai4 LkP/j/xb^yE1HTUOMlfB><>'hnDgID6;Ffd'G7|"/bB ږ4/ ׏n/5.$]S!ɑϾX@L^4O5hl>^+!;K^o(|>925lmblBgE^j{Q{ƓZU.ɍGxҭz}m#c2< Cw ?LF='qIJ5H)R 68[`h'|:\jZ\7^=?ԸvLmLvx.*lH.7HJA(F$Rchl>^+DO5-7| Gayl1925@e5-(| r{Tk&!P|>+,ԵIL[a昳@(| BgEjIFd#yHAd!Sڤ%F/Vd`̄EHCA;u{RZċch楦HhMg۞#] &6>/5-7$%C ]13MB;eC#T }ZR҇$925^ T +,Ե`հai4 $925@bgxb>6Rf&x|#c0;NQDiF .hr5ub#|̄_W! K^Ե楫ڠ#]6<϶k$(yoTؐ\fA80* eQX"n@H&6T7 (|P`J 5@rE1yC $925xҁmzy, y"P<܀Ii@6< jchPT7 E8xҁmzy,n@H&65@rQi@6< dСn@@4@^@>T7 $]Yy> $925xҁmzyKJC#U'GLJd18QDiBPnG*]hfBtx ױDePЛHQaP<޽uci#dIGɍk$] &6"Qijck/5@r^&FP MO E^jck/5@r^hJ {L^b̄|x|OB3z=a8QDiF ՗85u h'|;^g@FBm!EaP<޽t| k$]&v^k$]`}EӤҤXPY"1HA,@y.ɍ HrdjX3y.ɍCP<܁(&ק"jchPT7 E`NXbT7 $]By+xҁmzy,P<܀vLmen@P/HrdjPz(GLJ#73",XF&VCm:RKwõQ/j6y{Tk&XbzC#W3!Ќ޳$Xcc%F.T`fd'G{Kڍj6^ $yء!ɑQFoYg1 &,XFwõQ/j6y{Tk&Xb\ f&zbJ5H)R 68[P =.}z|_||x;}_| $/H_| }2Bd#}!}2Bdf>!}2B Gd  $/P>}|x > '}||@^, B| E_*, J%M)v8%_(-9JJ%< B.HC FrBLA!o   !0H[ì6pH[8;!o0,!oAF H[ 1!oaB  H[R(!o@pH[#pH[)$- #7!oa!V }  VJ,e-TbD`ʷHʗAPn^#*]C{P!XV["hX °EV9d+%> #N-uBUe䭪/FU223T Y +bp!pԩXZ8ۣ6dR`^๑JIy[̊V]XHݑJ޵Պ̊VCȥoTV ms"yX(qF.bȥh?R`^Vs"V(R7dRub#qs"Pn)[t\ȥnzG"E+xAz.bȥh?&VCm:RK)Z)Ot*X8&NcV)Z)OF:u-ZȥoVL:2)[F ]q`J4`7p\ȥo*P^R E̊V[AV[AE+q˚]XHݑJ(ZՊ̊V8ۣ6d\բK J SL|/+6͢+i;%`^"JIy[ub#vE+E+jCȥhl/+6r֌Y SLxnŌVVֺB"E`dRR5P^K)Z)Z*1JܙZ JF.bȥhhRT|Rct*X8&NcV)Z)Z*1ѫ&NcV)Z)Z*>b)1VL:dRR )uŌVVLxn*0R(hn""n  dRR*P^R Y1+r(lpJJ/Vd`"" մ8ȥhl`j#WV(R7d\բK J SLc U49B"q'~x<ӐĠ%Lp{^Bp{^N`t&8=!8=Ҟ'0"F?9 L cDp{Ïc@'<<c{`x5'<xRp{7Lp{?!8=>c{`|5'> Np{<n c g\#s#ǂ1Bp{ _ǂ1B!8= Op@)ǂ!8=x.@<$F?9' xRp{3q1( 9 (1(""8=c9 F(8= !_!y ) .I|R x"8= cR ƒ$DdE<D1'".Z#d(d)wp{(8=OdopFp{0[;8=NdhxFqA ~(8=!!o$"$\+ċGx2"ǀE!${E 2. $pH@ӃR. ^\pH;^E /1˃. . D\N׃. . $<\H$|\pHxpH|E >d\pHy) pH9. XEń\ H9aQp%r.? ȸ("JG.XE_\ P.p%r.] Q,"Jp%OqU|)r.|("Jo"Jr.aPȸ.XE.Ӗp%Ћ(yTE.r.,"J qP>.p%1"XEx rA7LE~XEd\Q!'NE.H 8>"(.skAዿc`%Nӭ|a! JVo?X[αEbkcc_?!:c%T:VՎαqrX* Ł_?Pȭ)b:c%,X*Unα/uA `/α?;| α?;uIMuI!,gX䟝 uI<:c~w c~wauI5c~wα?;wuIbAE:uc:$ΓuIM!:e+9'tPgc:$΃ )Xα?;@uIV'1c~wAÛ9't9'>% uIFgX䟝#7c~w#v3rO|B9'wH[;Ģ?H[;G|x$. rģ>q(8$vw1?wCp J?aC9p J?:#ӸAX$N9Q "!8c~%$A8$_;G<A5 rģ@m@[;Gq(w1?x$gq(w1?Fw8c~%`9Qw1?F 8c~%& p J?f p J? 8c~%8$SA0`9Qw1?Fp J?> {;G# 8c~%$'q(.  u"J{@! Dα_OH %X/ħ$I(w:~%= ('α_OH:Q;cS8) E%u"J{@`JU;c@4u"J{@4w:~%=(Jc;c p%NX/ħ% %_;c6w:~%=(%gsqS (3α_OJ %sqS(:α_OJp%8) @a(;c9Ep%8)!"gsqSB.ӹ8)!(α_OrBIE'qGB1D`ʷ T4ABl,Yd(PB (PB (PB (P'H21#a!s!rj X* ϟ> ŋT*RY)a)ϒ>| ZN T-rJ P_%R`^,VA|[Z..TܕZJUŋ,VBU(O%VAxI|RK8[[.ij ]qX*V(R7[%qKjjP8ۣ6ܒIJ5H(^V mѨK\Rڤ%FjYsQʗZ1IJ5H)2ei G*]hJ'q("47J XղW;FF:u-[%qKjjPQ\Y%qKjjP(hn-NQDiJT+[TģT҅ IJ5H(BeFPo%NjjP8ۣ6ܒqIJ5H(^V mѨKSڤ%FjYsQʗZ1qIJ5H)2ei G*]hJ'q("47J XղT6;FF:u-[%NjjPQ\Y%NjjP(hn;NQDiJT*wTģT҅ qIJ5H(BeFPo%,XF C5u)bJ5H(Az.c%,XF&VCm:RKK8QDiBF ]qdc%F 0%,XF*P^R n)mRwR#Jtf{;F C5uģTҍT.pj9RF7;F&VCm:RKRڤ%Ff㠩R2tZ'q("4Փ'Nūn)mRwR#J*0R.)mRwR#J  ܸIJ5H)R 68[qKjjP[A;F(ZՊmRwR#Jtf{6;F C5uwTģTҍT.pj9RF46;F&VCm:RKӸڤ%Ff㠩R2tZ'q("4Փ'NūimRwR#J*0R)mRwR#J  ܧqIJ5H)R 68[NjjP[A6;F(ZՊq("4yX(qF.c,XF/V\r֌eq("4՗(mT*R5ubJ5H(\K,,qģTҁCFw%q("4J *Pm("0J[E\եVUPn'q("4yX(qFmqKjjP8ۣQʗZ1IJ5H(Az.cqKjjRej˔6Ӫ)Tэ-NQDiFn: ,'Nūn)mRwR#JY2tZ'q("4r.'q("4Pрˊ[TģTҕ(/pCc;F մ9qKjjQ˚]XHޝ'q("4yX(qFmNjjP8ۣQʗZ1qIJ5H(Az.cNjjRej˔6Ӫ)Tэ;NQDiFn: ,'NūimRwR#JY2tZ'q("4r.'q("4PрwTģTҕ(/pCc6;F մ9NjjQ˚]XHXR#Jtj9RF2Ŏ8jQe G*]hXR#JLYruB#QʗZ1,qģT҅ʌbJ5H(4`7rXR#JT¥ ҍR#UP(BX&,!Z`V,eYeB ,,bV YdX YeYeY,,!XZ,,ȬX#QBJ[IU&<}%` 6D(~V 0eXJ.Aδe_JZX8m" $kVNnD^Ą4;\{S5x7@^Jz ą=Hrdjz}/7ЛEh-x<FHe&F>)ko57y{T(sC#W"o#]6xq M>&Hrdj3@T+dYE7ɍ51yHրv .}&рTAppq#y7>!ɑ`l<heLOEk57y5hm+(ezC#T }o5 {@;>Hrdj^>Q{k&A+Cj'Hrdj3(y51/7i:|4C#REϾ0 \<\Hjb{8Hrdj04ŚCh&F>,:ywEM$)08`*$\M$ }fQ{kcikL^ox/xuCh1HrdjHЛFP}č/7P C#Vy,&@!ɑϾ!@yi Cw ?LFIJ5)JūZN?|"bB 5^ԵyxoV{ux1yڠ^H>Lm^k$]&v^k$]`}EӤҤXPY"1HA,"<ԵIw4E`} D3, ԵIw4E`zHЛDH>,;EGi1x@ hR.}&Ͼ^7ykƓ LiƊtd} D3"5-xb @08BSEϾ"@gdgf+ zLP&}Y 2ȳ|x|O)gI`#c-NQ!JR`3!:< kآ^l 闏iׇך ӼP="Bm LD CV4ay t\l<f&z8IJ5)J:4p20qkRfBtx ױDy1^/ӯ5<<=x?{E`$} D3ϠM:@l SP&5<>'gIlHRڤ%bŮJR0 9 h'|;^exoL{N?loLZs6&}Y"ӡTF<:j.x6xuI&b̄|x|OB3z=(qKjj3HR thjq*RawõQ/j6^i WǴkFi`s6&}Y CV4ay 騹H'@y#2=?L#c)mRwFi R\thd`R)̄>ױ! 5\+&k{DZn6 "X@; i1^yk&Aف#p2@(|@Hrdj3yMo^ C:&FE5FBm +C:LP&}Qo#]K^jb{Ƒ{í0925$\M0F\<\FSo(| VհW ŚCf4&F>)5{^y Δ>`Hrdj^>Q{k&Aفkp2@(| !ɑϾtZQ5Ќ‡ʛ '%3LfZ><eȱ",D!E<^yZS4hoP@fԑs6l'7yC9925l1f6P@:gEa皋=]+ڢ@;(| Hrdj^>Q{k&Aقd6PR$925@X<^yZS4hoPA C#REϾ0 +Hjb{@$925l1f6PDzC#T }<^;׃}&`L4REϾ"@fo5F&6"Z>$&F} `fW. ~@(|" L 逴3z<@DRڤ%)̄>ױ! 5\+&k{DZn6P/j/@u!ɑƓFBm 3x<FHeBC#T }!iMOPЛEfcpl"C#T }:yhpć&FE5FBm ǃlC#T };E7ɍ51yHրvLI>h*'7yC74Hrdj+blHrdj37zo^@<LI>hgE5F&6"Z>`4HrdjHЛFP6`W. R ~@(|%Hrdj3j/@vSwj0@;(|Hrdj^>Q{k&Aـt\h*7yC L[{`LYM>C#T }#E׮jnqJc&FE5FBm oǃl!ɑϾ;y51/7i:|.}&рT hgE`PQ{kcikL^ox/xuC*.}&рT +Hjb{$925l1f6P$925@aEx7j/xn&4E:2EϾ"@fo5F&6"Z>QC#REϾ0 CprL^oy$925l1f6P ML 逴3z<@Fo)mRwFi R,iZT#fBtx w"$!p?UKWKkǷW P4^izHP hIjK^o#]6Eǃl!ɑϾgzo^LiP ,ԑs6&}Vj/yvLm-ykE(|HrdjHЛFP|u ppq#yk7>@$Hrdj04ŚC4925@`޼5i1x@&4(|!LI>hgE^yZRכ4hoPB LI>h*W7yCL[a昳@(|!8gEMlfB><>'hnDgI;F4)A;K )ON?|"bB jIt?Mj{QyHy  ą.&FLWjby P|6:xq M>L7.ɍ5B@08@.}&Ͼ<( ^C $925y׵@Sw/jnHBl-@\oYg$8IJ5)J XNJq2l=|A^Ą4.j KWKkǷW޽g}5 0+k>6$PN&y q1hfVi1x@ h"Bm LVK^4 Hz`L4P >hgE`:E`9ykƓ LiƊB"Bm LhgE`O5-xb @08I>hgEaVwi1x@ e} D3, ԵIw4(|.}&Ͼ`楯L^$0yC "Bm Lwi1x@ e@.}&ϾL<ԵIw4E<EϾ"@gdgc+ dgEMlfB><>'hf&xFM}-NQ!JQ@l)H0ZfBtx{Nt%z۫@uci ,K^(0y,Бs6&}YYǃC q!ɑϾ!@\O1#73l`>'q(f(^%#Ù`h'|v+&k{DZnw @.XBIL^o#]6WW#$ d&F>(jQz뷚޽҇d&FE5FBm +C2C#T }|^T+dYE7ɍ51yHրv$925$\M>: +L^oyć&F LYM>925@N7" ܁{Q P|6: ^+(e)LP&}S`>&FE5FBm d6P T$925@N^yZS4hoP A2C#REϾ0 x8Hrdj04ŚCRL7zo^B<$925$\M$ }7o#]K^jb{Ƒ{í*ԑs6Ax.$o51y 61f6P!ɑϾ ƑzMn"^ P|6: W(P&)LP&}X9y$hr iO^y P|6 x<FHe925@fo5F&6"Z>*ԑs6|L\<\Hjb{ 61f6P@FgEMĴ̄|x|OLf&x|#c8qKjj3HRjYsza $!p?U_jZ\7^=?P L Ri-^ykk&A|P\XL@;(|?C#W&+51yv(>^+C!ɑϾt޼5i7x@`q>HrdjHЛDH>)җo#]K^jb{Ƒ{íC#REϾ0 /č/7P>C#Vy,&*Hrdj3^z7 ^ C7Hrdj^>Q{k&A|xq M>$&F>+<^yZS4hoP>jC#REϾ0 č/7P>L[a昳@(|>D&F>+'=]+ڌJVHz}hMd6P|925@aF d^k$]`Ht$Ed(o#]K^jb{Ƒ{íԇ&F} `@}-NQ!JQȤ`s2,ؐwå W-^i.^կ^^jbz=a>PHrdjz}楯7ЛEaǃl1 RL谡.}ci ,mp<>'޳$09[TģQBAe#Ù`~E^Ą4.jjIrޭxbS׵@rIL^4OԵ5hl> ^+C`C#T }HT d3dDHY2ȳ|x|O)gI`#c4[TģQBPґaNnD^Ą4چ xoz.ɍ5 MېЛE5 MۈHXBm<5/5 MÉ PH.xC0`|#<6PzC#T }-yjnBF1P|6o5 MÈlVgEX@DPzRiWjFBm p2@(|P925@GcCRjC#UPЛPABx.$o5 ^o(|P$925lmbl@4gE@T چ7/j/#]1y{T5!#]6j/7n!#]6j/^j/7$%C ]SpoC RLAE js6^y"ڄ*'y` 61f6P <gE:RT+ڌ4/^H&6bxqD6P Hrdj3 yjP65@r5FH#CW 925lmblILP&}V5)^ԩHr^@ +He-Hrdj3ךPe i ,LT7#^1EjLbP{QڅeP@8gEyjpt}+ p-yj7eL hnDgI:wTģQBZ̄ *$!ژ4 /K=!(|@!ɑƓuFBm p2@(|@$925@NLGi犛 ĂqԄtq`Dbt1Hxyt1d!1+hX^ƓwZ+ jb|@ zL4Ss6&}VNj/xn^E`'yƓwY@08G$} D3Pi7xuOL^4:ψX@Ɗ@"Bm L^4{QƓwZ,/Mg  EbEϾ"@aЍ{TOMk'bx\,K^ x?{EaEϾ"@d(k#c2,K^ x?{EHЛDH>,mp<>'޳$0;NQ!JQ ZT#ÙcG$!k{Py/ ȑvLm.yrn܄v(yrnBFh5!1# ^j\.f`)7Gaylv&F>(F;E^jLm 7j CLP&}Pk n$925x j o#]6h\LW@FBmB`5x.]#yryC !ɑ`l4 L^n&^^F&6'׵@Qyr5hv5hskI/y8t;3MB;e$)LP&}RE$!ɑI>iKE7.ɍBlНHJհW ŚC!ɑϾ>^j{QƐh^E>x<Q M>!ɑϾ><9xҀs(PHQbgy$Xڌj2^ك5D7nBFBm<q  LTCNP 0TFĄx$< ٘0>Jn @@(|<gE y"a!ɑ$} 樞o$]P@$#x.] jT&F_,&PLGo5)^ԩH4xuO yJ5Ќy q33LfZ><eȱ",D!E"`^\iKF7.ɍBl+Bwo(|5!ɑ`l4 Х!ɑϾ橗N<:ק`5x<Q M> LƔkBB<׵.EjLsK-#]PԵ{T5-x gz`q9"Bm LA$oǃ$ zC#T }rE H|6 p-yr7e RL d#z-4|!޳$l~ 46;F4)JF3!:<Ə5HCA;5\y <^A"ڙH4*l  RJm"&6φ \Pry P|6 d6P !ɑϾ&y4(|3Hrdj5jxtP=Hrdj+blu!ɑϾj{Phq251@y{T5!#]6j/7n!#]6j/Jn @@(|&F>(FnQyC(925^  T TˡCE7>@fհW ŚCiLP&}PZT%925^`:קbJxqD6P9C#T }"<xqD6P Hrdj3j 43\&XnFtXeS:dЄTڠycv$k&CSЛD5L;nxt1%/5LnHJAs! RLBw(|LW-$\M/5Ly"ڄ*"gН橞o(|(Hrdj+blp&F>+楫ڗ+o5Pe i ,LT7#^Xe]yګ#]F5Vx^gz`q>&F} D3E#'C!ɑϾ^j 43\&XnF,HPhq2o53^čvLmBSPEϾ"@ib spln LP&}ZG䋡"W$>ǃo &!ɑϾ!@yrfB><>'3z<@J26;F4)J4*Ra3!:<{Np?ULWL׆cdcisLMېЛE517n!#]a LSskBcjrSpBT< %7 O M>(Hrdj3"ů517n!#]`(> C^&F>+ k>Hrdjz}7ЛEb\jC#UPЛPABx.$o51y/925lmblL</7/j/#]P^4 h;.}&Ͼ,P|6!ǃ$ Ǡ!ɑϾ51xҀs(PHQbgyX/7/j0y{T$kchW@T/Mg  (|z%HrdjHЛDH>-:,P|6+He`1Hrdj3м9" H|6,<7/jvLmX@lRi1^yk&AB ^+C\4&F>,lTL^4X@PC"EϾ"@d51yrL^jkڠ$]6|m#c2< Cw ?LF Njj3HRB% ]d'Gzh'} W~j W=!(| C#W!ChMᰄv\ H=aw(.}&ϾtD4{QƐֽ>Cyj9xu$;ؑs6&}V 4/VCY@08Xċ} D3f4$^d9xuO桫Ɛ|@ zL2 y"Bm L P&ڔi^k5 ^4/z`q>0$$\M$ }&jT9xuOCW!ì @ޘe0.}&ϾD+ڍ4/YCW!ì @ޘhAI"Bm LiC!íz}l!ǃBTq /f`&@Jn"~yl$925@d(o173!?LЍ qIJ5)J5H ) LN?|"bB 5^ԵyxoV{ux1xZ;OAp"yrn %@' vfd<6P4C#T }# &萡h&FAAk&AB+Cć&F>);yrP4zC#UPЛPA!W7/7> !ɑ`l<heA*C#T }^n&^^F&6bQzj/7nBFBm<^nBFBm<^;nxt1pBT< %7 O M>xL E9HrdjEϾRQ{䋲cj>x$925@GG^`<:קj{Y"B Eǐ)/Pe i ,LT7#^1EjLbP{Q0y{T5$HrdjHЛDH>+(>+He04Hrdj3ZPJ5̡Bm!EjkڧEjLw^1j{T5Ln܄v&yaskc橍É PH.xC0`|#<6P3i!ɑϾO5LP3H{R5j><^+/5LyCRհai4 Hrdj3^jZsƐh^"ElD\<>'3z<>F };NQ!JQeRfBtx kؐwk{S5x7y"ڙIhL%!ɑ >iKL^o$]P@ /ˡ;L^o(|ZC#V^/heRL^^ֽ>Wd#P)kJHr>P5hlx<FHe@Hrdj3C&Fڠ#]6 6:x.$o5 ^o(|:zC#Vy,&ԇ&F>(P/jLvLmBQzj/x h;!ɑ"Bm LhA ǃ$ >L5 ^43\&XnF$yjq2BF&6'^P!#]6jݸv&yskIl:ypBT< %7 O M>BgE:6y>925^"Bm)yd!P|ppq j RC#Vy,&0)LP&}V#Q/j2x:ק"`6^+HeD&F>+桫ƔkBB<׵*EjLSJ)#]0JW@Rv$k&CJMۈHhMg۞#]:Lm@|6<Ԥ8t;3MB;exiLP&}V5)(|%Hrdjؑs6ԥE1T+NR+Hrdj04ŚC/Hrdj3Fچ/CZ.ɍH1'yt1H"QdAD/x<Q M>L/5 ^n.rCᰈl\'q(f(hdR0 9 6 ؐwkjbf7{/53$]Sx<FHe&F>,<ġjs6E1TO'yC#Vy,&-C#T }i7xuOE1HT^^yd|B @yi Cw ?LFNjj3HRh4Z`s2l! 5^yxoyx:^jfH&6xb;O @!ɑƓuFBm Ap2@(|4Hrdj3LJ js6E1Tppq jbyC  61f6P@*gEj{Q{ƓwZ^$]D5@^H&6k$]`"E&bZfB><>'3z<>mRwFi RBJF3!:< kآ^lQhM(5@rE1yCRi@6<nBH&65@rX`T$925y#2=?L?)bJ5)JūZ3!:< kآ^lQhM(!y׵.Go5./5.Lm>Y"ciJ,(ytHA,=y.ɍCP<܁4@^@jchPT7 EJ P<܀vLm ji@6<6y.ɍCP<܁G(&ק"jchPT7 EƔkj6(|x&F1DfB><>'gI+ŋq(f)H0ZfBtx ױDePЛHQhj"E1(yN#ƔkO5><925y#2=?L?bJ5)JR0 &d'G{Kڍj6^  ^jE1y`&FP MO d^j!ɑƔkjBE1y``J GyvLm jdV Ɣk5> 2C#W3!Ќ޳$XcBbJ5)JTiRfBtx ױDePЛHQe5@y"P

g(&ק"O5@rE1(y><Xn@H&65@rz`Y#P<܀vLm j@@>5!ɑFd#yH?L&,XF4)FT#nfBtx ױDePЛHQaP<܀vLmen@PiL^4@^@T7!$]Yy>;C#W(&קDck/5@qC㶒i@6C#W3!Ќ޳$Xc,XF4)BK\)d'G{Kڍj6^ /yd^jfi@6>QC4&F1DfB><>'gI蔱c%  F̄4b{QFڠ#]6ď5>H~(GLJ#73%,XF4)FEF̄4b{QFڠ#]6ď5>H!ɑQFoYg1 JXFi RBJFÐÐÖ_|9>rF#x'}_|‡x<} |_|}f>3|GBT!>G"55 }jB=}v| !|@f GP(>>cXCX>~2}~\>@X>@>?c%GA Zv=>UAkB#V_|"|"EA9=6EӐvttqNtӂ8kpN tN4Np(#!n +37 7{pnp=??bV XHb(+! LbPy?CAXN 2!ebH+9X#??+`C u?(3V CA<2 A^eb9X0w?AV +LAf ,V Q?rebrX+ A~V E?XdXa+i6V 0"AaX-/(+(Z; CQBJ[I[$eKp^7/t.xܽШX}T+ EAhX\,[*V9d+%> #N-uBUe䭪/FU223T Y +bp!pԩXZ-Zs"RŪ)2)[Hխ dRRT^^`CE+}E T:92)[8kCw-ZE+E+|`-dRRs"F-tN.dR) VV*X VӦ E̊VH0dRRXRJJw E̊VF"R0 +#\ȥo+XkVk-p\ȥnT``2)Z)[ʖ4E+E+x.,P%ucJ̊VRƕR`ȥhoZ(lbE+yRƕR`ȥho*XҰJR0 KV JF"BE+`dRR;K )NȥhovRdkE+cTVSzE+E)jYszKT\ȥljYsz)Z)[P.trȥmBwȹJ/V\^,VVƪ ՗8qK"m-Z ,Nȥm[KVKeRȥhl..T‘`.dRƃG"`.dR48E+E+}Z (tr.dRƃG"`ȥhoVƝPHJ48E+E+|h4Z` BJFJGhn%m'e断*X^*P\ȥhRT|Rc8kCw+i;%J#V7qJJ.,ZRJNe-Z*,TT8JP8ǂ-PK"ūZȥh)qb s)wJG,˚ZTXaxBqs"JqQIE T:9dRRHխ dRE T:9e R#V7qJ:.8^t-ZE+H $2)O+r`JJP8ǁC Z%) VVL| tfዣG# JF""8Z+\#JJQIŮR`ȥhhF%m'e断*X^*P\ȥhRT|RcF%m'dRs")[E+E+}c]Vv[.ijQb ̊V)GE&>ŮU E+V88J;.8^}ŋ,]i˚ZTXaxBqs"JqQIŊUE+E+yH0dRŋ,]i\{]XRJJw Y+i;-4hRRE+EB"ŊU SbȥhoE+\XRJJw YpF"+.pRB\.p.F"b$2)Oʖ4E+E+EGE&8nT``2)Z)[RPJNe-Z*,TT8JP8RPE+E+eKV JF")uŊ(Z.8^yRƕR`ȥkCw ZNc.8^x.,P%ucJ+i;-4hRRE+EB"n(llVV+#Jѻ\XJƕs)v[,P%ucJ+i;-4hRRE+EB"n6C`Ս+dRR*XҰJR0 Z(ll\{]+#JT Vz\.p.+#JR 8 J)NHk.8^|cJ)H0dR+As"'ia:)+i;-4hRRE+EB" XNJvJNbE)R,'P;" XNJvE+T^.8^pNu S)Z Z.0q /qKNu S)ZF,As"B% ]d\բK J SLx'ia:)J[I,T\ȥ?vRdkVVn)[R`JR0 )Z)Z*1zE+E+EB"/V\^,VVL|R/V\^,VVKTsKV,/(N.dRT)N*>b)1ŋT*RȥhoT.p/VE+AKT /qK;]P咶sKV,/(N.dRT)N*>b)1'qK)Z)[ƪ ՗8qK"Ypƪ ՗8qK"Z PK.8^}[KVKVv[.ijQb ̊V)GE&:J'dRRT.p/VE+Uh*T;.8^xAzn)dRZE)..T‘`ȥhhK\) VVȤ`2)Z)Z*>b)1╸hdR0 Ȥ`2)ZՎ8˅ޭbK:9d\բK J SLuk*X"h4p2) VXRYpVƝPK%m'e断*X^*P\ȥhRT|RcTō:RE+E+qȤ`2)Z[uB,\{]E#J0 ̊Sj`ȥhhNJVAe#JJE+E+EGE&%-Cؕx%H#蛐`x]C :xB yؘH#Bp{G`'b`'H#wvF yH# Dcx@8=A( @OPp{>(*Cؠ8=`F?+!b`blXBb3ذlHp{`u¢͂p#8=@"<# aP{ŧh8=Gc:blЃ0A |9}1B#05`pFp{<<#²xPp{ ścVaX۞8=`)!X{°!,=xF??,rCXYxF?X rS`@$h@ ywcZCćxo` G|\.!$8=Nx4=1kcP#<#ƨ9F?@`*sGglE\쨷;cPe@Ӟ8= c` v Dc`` pFp{N&`6N`Ǟ8=6`\p{.8=@q"/8=E7@p{,Lp{:./8=cМ_e\98һҎPiŽ.8=y04Lq~.8==+".`&"l d;t"vě|& Ȼa>""Am(dGȻd.#"vȻh6!l_HECJEl"v[.NVE*@El a` ivv Ȼe.ڽ'"c.ٞȋ̋:)" ```vMl5l$]`a1l9+"-]` H`ӌ`ׁ9l;"퇜xE\dE|xEfEx r.A.CB.D.ED]?r Ⱥqtn6"~<""xEӒpċ?DŽ]:"._DŽ]8æ"qNSȺr<"MDŽ]9o,"˸wtyE+α_OKg;c8pw:~%=p8)nsqSe;c87u"J{='sqSpX/ħ]w:~%=0MgqB?(WG*ZJs J)PY ղ,OgL (PB (PB (PB (h2Lld\\Z ϲ'qb |VJ|XJ|ϟ?%VV7%)V \0/+XJĮ,XdQX(+XJ'q("47J XղW;F*P^R d)mRwR#Jtf{W;F C5u*$'NL-NQDiF .hr5ub#y* ŋ\vJbb* Ŋ'qIJ5H(ARd8l;NQDiJT*wTģT҅`^;NQDiBPnG*]hJ'q("4 U49BRK8䔱c%FA{J-,qģT҅`Tэ[[.ij ]qX*V(R7[%qKjj3HR#V7rJ'q(f)H0[%qKjj3HR thd`R)W;F4)@Fn4p20qkR +[TģQBPGTkR +[TģQBW88ԩJF-NQ!JRa%qKjj3HRcJҥ)W;F4)A;K )O%qKjj3HRB% ]IJ5)J5H ) d)mRwFi RRR0 $)mRwFi RT.p/V+[TģQBqr +[TģQBAH0IJ5)J4-VR0 $)mRwFi RBJF;NQ!JT-Z*wTģQB#l;NQ!JP(qѣ]J`ISڤ%bŮJR0 $mRwFi RCZR%JR0 $mRwFi R\thd`R)T6;F4)JF;NQ!JR+J`ISڤ%,'P<;NQ!JPNu S-vJ'q(f( `6J`-qIJ5)JqIH0qIJ5)J5P^[dmRwFi RʖR0 $mRwFi RE#J'q(f(hYH0qIJ5)J5 )RŎ8j3HR#V7rJXFi RRŎ8j3HR`IK8Q!JR+J`IK8Q!JPNu SK8Q!JPNu S-vJXFi RRdJF)bJ5)J5P^[dq(f(\\k#JXFi RE#JXFi RU )bJ5)J5 );F4)R8kCw.)mRwFi R;F4)@FF-u*RaqKjj3HR tfዣG#)H0IJ5)J:4qjJV)H0IJ5)J5qѣ]J`\Rڤ%);F4)J4*RaqKjj3HRB;F4)A;K )N2Pۊ[TģQBT*R`'q(f(^%#'q(f(Azn)IJ5)J*ZH0IJ5)J48 [TģQBAe#'q(f(/0t`Sڤ%Hխ ܧqIJ5)JR0 Ӹڤ%88ԩJF;NQ!JP(qћ. ZT#'q(f(8Ū)ZT#'q(f(FF-u*RaNjj3HR`Sڤ%*XҴJF;NQ!JPNu SӸڤ%,'P8BimRwFi RRdJFwTģQBz wTģQBU˜ ո'q(f(\\k#'q(f(hdR0 )mRwFi RU wTģQBPґa,XF4)R8kCw%q(f)H0[,XF4)JFc%*XҴJFc%,'P܁{PڠyJxb1DfB><>'gIc) KUP̄_W! K{R[qڠxZ6jrU{Qy"/ykƑ{YCLWe|!ɑ`LLfm&^ԵċchhRv51^Rᴹ\P!ɑ쵰o>-Hrdj8'l-\=Cj&F2}0q>Hrdj{-l4f"eK^jXz}#c2< G#73GQ VXK}w`E"q,2*Zcn N54\\ ..-R^TڢQrR\Tk)t@RȬVȬ- EXZȬX.  ;J211VȣdR\F?c"8=I)1Hp{axF?v#" v Ȼ  ".CA`AJX7c~J.;N>[>]X\?U(Rg?WukV9c%JՃr?,Rc1/}wߖαw8cijYq(< rģ= rģb_`= rģZ ],ӹ8)~Bα_Ol3#֖XK T4ABl,Y (PB (PB (PB (h2Lld\\Z ϲ'qb |VJ|XJ|ϟ?%+UP*Ԯ,X$-VBK$ZZb.RZ ],ijX(RZ ],ijX(E`,2,,,VXeYe, X,eE`YeYe[,,,E,,ϲʓb U&<}%^>l`qW\1w/T:$G$kVu>u?NA;KW1^i3^yjM^7jf; {(}$925^ D6w.Ў(#LWB<Ŗ}{T/5BiM} |ͶOj0y"EKEFmv/yͰ'V樏ڢy"ENQ{Ƒl$]>j4&FP/O<k&Н P!ɑ,to@3ƔK\DèͶDڌ4L>:}D %MLTHR##^i׵1x҉2ךQ.Ɂ[P<Ĵ̄|x|OL3z=c b >N4łEKU,mP\ ƢƋS¥KՊT^*.PV*PRw P^J )dVJ+dVQT|-dV,  P7.qE"#".‚.At JX7c~J.JZwc[}XK..T*,qUn]:1/W3q'w8cR`^,VA~> rģ 6 p J?b  u"J{㽁w1˿!)0/+X^RT}J2(VYeZ}+>!B (PB (PB (PB :FI P\PV|Y,ZROO O>|JqrL Ŋ(/R`^,VAxQJXb@,geYeBhYeYd,> P2,!`X Ea`Z,k,,"YeYeYd+YeYeYeE`XbUI0G@]Q|q ]>T:> 71?%+Zwkؖjbf7S0թ^S51LSX&q(svcC#UPЛDHhTؐ\PLWЛBw(} LP&GP&׵/j/7 ^EڌjIìs4#Cy'&/kB2y'ʓm&*l'@KQn@'>݅Pi)y'dLJ,HTO7jR6SJa{R65^ԥ$k&σ皌4<K^d3m2 ^dT'۰>܁{TO5Bf0(j"RJgyv(y5a!ɑP>9Hrdj6hT7/j6@^ L^n@'׵< ƓYhGL"y'&/kB2y'ʓm&*l'@KQn@'>݅Pi)y'dLJ,HTO7jRlQڕȘobQ ڌjj6xTv|t%D 2yISa &nSa ZHrdjT1-3! ޳$G|Ub > >(DIX.dTQj*,h8\\*ZXEb U'pAXQX(+X@RȬVȬ- EXZȬX. Ak+Sn\#l>6'8=tEG c\|@IgsqS 8c~B?2TV (/%nmR eYd-@, υŇŨPB (PB (PB (PCFNdcfF&BBE8T>}A;TSSϟ%>|*\\*P,VA}*P,VAxQJ P^(EaP& eYeBLBYeYd,eYeB,@`&eE`YeYe[,,,E,,ʥ ҶrJ| @>l5D(~:$bCÜw*vk!C[:j6wåFږԵPu M %&FڋhM$ XxT۰Tؐ\PHrdj5hNQyCa!ɑ-{PiO y" P<Ե ڌjHf(GQF7iB>T'ې/ja{T5n@4fkBL:|^R3z=a !* Ҷsa"N4łEKU,mP\ ƢƋS¥KՊT^*.PV*PRw (NcVK"Q["-bk"`X\->(8["mNu|<'" 8"""B.ˁ.ۂ"))b?ݏW\1w}1%Nӭ}3uj#){Eʛc%,X*UnαpĿU(NccߝTC;Ģ?(Ncp J?`a;GT:VՎ{sqS8c~B?(NcVyIQ*X ZYeBiZ|X|!B (PB (PB (PB :FI P\PV|Y,ZROO O>|U(Nc@R[V9 1XXYeYd, ЬX,,b,XXX, e`X-eYeYdV,,,bk,,"첩BtpRcP)7l_%u{;~*vkuG#R``d'G{Kڍj6#]6ϼlrE1LQ | L^j6(}925y#2=?L?2J,X~{B'Ns"6.QQcER%M/(+(Z; J'JX [$,ElдZ*>łbpV(8["'Ðp>Ey q!'"(.skA_ዿcw;NӸuj 䥋sc%JՃr?~%ﱝc;/ ޝ Q'JX;ӸAWSAJ,Xw:~%= w1˿!*P)b%nmR eYd-@, υŇ(PB (PB (PB (P'H21#a!s!rj X* ϟ> ŋT*RY)a)ϒ>|RK8* Җ,q@RK8Q [,,YeYd,`T-eYeB,@bYdX YeYeY,,!XZ,,X,pXi*cP)M7utJ.#s>CIS_ì#>A&R "wõQ/j6^i W5LH&6jk$]YyuchNY"ci ,L<1(}`g!,0^"&6j6(}D&Fڠy3!Ќ޳$G;U,V+F32,ؐwå$^Եy$kPE5-ytZ\&x}`5D&F} D3M$ykƒVEϾLm jZs6&}X>yqq E1LY"z,<ԵksșDH2HrdjHЛDH>,"O5.yvLmu7/jvLmԵJd} D3<׵@HBlhgEM'GLJdn Jс̄4/b6^ԵyT ڋj\nBBn &V^j\n܄¦Aa PZT: `DbTHE}ö烦㶤kHGRG"p_ړ%MLj/>݅EEȊ 5Oړɍj/>i@f$НH>MLmIʛ V" ">;jNT ԩ&ړЛ> j/>݅E5-ytZ|7x{D(|"=!ɑ"Bm L GLJd?`խJ (uĪ2Nt{RP/j7/j0$\MiB5>T'۰V/5.dFQSa 63Ɣ!}Oa{T(v}3BQ"6>Ɣ&kBuDQSa 63Ɣ!}OڡyͰ'VvLmjJ5̡&>Ɣ&iq!Sa &nSa -x7x{Df}>925$\M$ }m楯.OhL"}>!ɑ"Bm L GLJd?`DJ֥K:RFa;0?aïΧ0_FEi;̊0XۂEE KT6T\Tj(++pXi+dY(XZEG±QX\,@.ZrdQ!8=pq@`l/#uGan"8=a2.>FE0i!$"wHFp:E0sppDE0.FxNE0JE%,P\ ]ccéi־SBo%+Z|cO+uZԪXRu`ܻuc0:K}I ݌p~wcOc1ğc1ğT0w1DFN9Q%`w1?F 'q(e`w1?[kE#q(qau"J{i`w1_O8F8)`Maw1_O~[kE#gq5 ո,V^RT}J2(VYeZ}+>@ (PB (PB (PB 4d&F6dl2d.d.T^AsAYdjJY>+%>,%>|SϟZnZ+[%V)aq*֥hJbZ01IUJ (uĪUJ (uĥ)pXjV j+ZeZԠb\J=ZԠb\J\⚷֥hƭbZ01UJ (uĪխJ (uĥ)b+eYeY@+ ,XXYeY Z+ k,, ,,eYeYeZ-eYeYdV}UMLy>J t'l\u:%usJZ:l eIJ֭nd'G{KڍC3FQCըbTTX@C!ɑhM$ Y!QƔy PJY!VV7:"q,2*Zcn N54\\ ..-R^TڢQrR\Tĭ*l@RȬVȬ- EXZȬX.  ENҁsLU(Bp{\x39Nx5B/<'"(.skA_ዿcpiֿq8)Zտ-䭴\\?TX7.c~%ﱝc;/ ép%ĭ*oSAW8c~%[Z..T8)op.\ĭ*l^RT}J2(VYeZ}+> PB (PB (PB (PB#$̍L̅ʋը.q`+>|,w-PK'dńϟ>J|Un%hStJqrUn%hSbDV ,(,2,( eYe, *"Z,,ȭYeYeY ŢYeYeEge[\XRUI0G@Y˅0` w!ዿs?IS_`l"şBJVoKؐfBtx +ؐwå@kK^ kHjZTؐ\fgaPɍ'E -|lro-(}`հolfB><>'hf&x 3q+*Y\gUN4łEKU,mP\ ƢƋS¥KՊT^*.PV*PRw ŋ,%l+%+ BhV*>+ c+Sn\#l1Ŋ2~*^:ʢK/TsjZ`k%jhR`@)qb֋uA{]XHHqb'dn4\n'e-ub#eie^VfZeZP \dRumR0mK,T ZT`z:k*ڥ+]X`۪zF,/q;*Cʄ)uAbR4\Xa{+PV(R7 6 6l"*w`5v{s? V,TJwcg<D^ :B/ss""Es8""Esx""Fs""F\s<s\sn v?q䮸bwT:}uJVoKU(Rg?TX7.c;Kc:~wP^qGbw;G|9Qo3An%qbK82α_Opi;gU$VW,T^RT}J2(VYeZ}+> hPB (PB (PB (PCFNdcfF&BBE8T>}A;TSSϟ%>|*bJŊ JŊ!CJĮ,X`QJĮ,Xb1XT|-eYeY@-  eYeL-@,,`X-PYYeYeEl,,V-,,*JX US`>HL3laW\1w u?*vk A[:kIJ֭k fBtx /jZEPmק<"+KMۈW.ɍH1EӤYK^n&#]IjZp͸Q"&yk^/ykڋd7nF|5Bv|RכH&6jZvJ|J楥925ȳ|x|O)gI *,qv aP'q`RF pTqTqpjb-Tbn%,XㄭEdEahZ- GEbpZ2;J211VȣӐA`_r.vHE)9As\nQ+>i־ }:JVoX>JX??TX7.cፄq)b8ʂ'qG,q p J?`_;GVRŎ9C;c9w#i[K8+pm ,eP[,!h`V|->,B (PB (PB (PB#$̍L̅ʋը.q`+>|,w-PK'dńϟ>J|JXUn%,XめF+ YeYeXX,(,2,!`X Ea`T-eE`YeYe[,,,E,,ϲʵ ŊL U&<}%o:^7/^J.9*vk/_YkIJ֭:&h'|:^Ե楦$k&3K^n&#]6KP&>+jZqFw%X^@X<Ե"5Ѝ lRכdСIj&}XjR3zzBbb`5a2"q,2*Zcn N54\\ ..-R^TڢQrR\TbbVK"Q["-bk"`X\- ZrdQ/b.i`5".-1`9|JX7c~J.T:_;PJ֭?Vw l/Kc:=Ax]J#Z& q(`4 rģXX`5α_O{8c~B?.VAxIy+pm ,eP[,!h`V|->,PB (PB (PB (PB#$̍L̅ʋը.q`+>|,w-PK'dńϟ>J|UkҫXXP(VAxIxQXV,,X,,,XXXfYdX YeYeY,,!XZ,,Ȭ,XXBrUI0G@d.B7A$b΃d;N:x,В[V>U2,ؐwk{S᜹{T517n!#]6eEkch/7.ЛBw&(BU S5i1xuș{T/5@rE1LT7 (}&FX^`Q{Ɣ&kBu^nFhNi VƑy|Յy0yJ5̡B ;Ɠ &X3x/7O6>:/#]6|SiBf(GPm{QFM>v <`fj0x/7O6>:/#]6| $ z'xv><3ll1ƔK5D}aCFQ/O ڢyJ5̡&>HT b2=0?L 1_!VAxRAt~tDB'Ns"6.QQcER%M/(+(Z; J(/*P@RȬVȬ- EXZȬX.  BVi@ܹF&*>#!8=\:|HE΃H}As\n2 ]cc:cJZs;d#R*䥋sc%/hSUn]:1su~wP^:gqG Ŋ'΃p J?+΃p J? Ŋ'΃E7Ӹ#k(NJ/)*>@CKd+V,Z->X O` (PB (PB (PB (h2Lld\\Z ϲ'qb |VJ|XJ|ϟ?%VAxR(/*PP(VAxRDV YeYePjc,,+ YeYd, h, YdX YeYeY,,!XZ,,Z,XX<}%d7SqSዿ:8,KIS_::|jΈd'G%ژM> jvi1@uz}mT ې&FڋhMg&(NOi@<( |925EaL^n&^  ^jݹj`T#烦NSBH&6G7nBnie hNT#f'3\chI ,,PB (PB (PB (PCFNdcfF&BBE8T>}A;TSSϟ%>|Uk"@ZȬP(baYeYeV,>,eYeP >eYe, * Ye`X-eYeYdV,,,bk,,"청bb%T| @>Ft&<(tJ.p$uîq`=G$kV`[Nvcv5 ;Ƒ Xb6n&^^H&6y"⇚>݅P<^r5E䋴&σךx6^l|OB3zzdZŮ;:"q,2*Zcn N54\\ ..-R^TڢQrR\Tbb%l+%+ BhV*>+ бP7.qE^ 8 >E%,P\%uué}:JVo c*Unαpα~wP^SJ#ZŮ;ép J?+w1?bbw:~%= s;߂ P^,Z㤭 T4ABl,YVB (PB (PB (PB :FI P\PV|Y,ZROO O>|(/-qUkQJbb !PX,!h&> eYePjc,,bV O"Z,,ȭYeYeY ŢYeYeBYeZb US`>Hn!7(sïP ]J*vk(sB7В[!x̄4/b6^Եyċck/5-(}0HrdjHЛDHhBi.>\t.}&+ݪsHZ; C#UEk&НIj ViDH$\M(5DۈW.ɍgX&6`ZbT$} Lhz}O5BHB yk$]CG܀vLm jZr(L3B:4MkHk ‡D^: QG >i ,DQz,LQyCh4&Fo1#73Ӭ~u  Ch!ɑ"Bm1$]YyE&#ƑϾPnSa qSa nSa 6@Qpt ;@j6yt/@@(nԑs6ly"hHhF>37j/*NPͰ"1*l vCmťM dXv\T dНHk >,v\TM0t\P#%}m(GLJ#73Ѝ֥XIҨNfBtx /jZ\RחO v$925$\M$ }1T ڋʛ .ɍ @*^^F@w%NOLzQy" &׵B^v|t"EW3yk˧φPB4&F} 楯7.!64M &}Zw*m )P$c6{T/EgO/$]cPi.^E4 L#EK&b63!FoYgX6jU4)sy h'|:^ljIrޭ楯7#xҬͶDڠyjx!^^FBm L'yIrU.}&rQyr5imЛYy!ɑƒ V5j楨.ɍ5!#]6^;nxv^P m ^j/x҅zyP܍{T/5-@P{Qy" 㲇ePƒׇR35Ў;ƒ *Ͼ<ƒׇR35ЛDHh{KP=> WЛHJPhQ{Ɣ+jkڡ(}wGLJd b%kRq[ToJ p(X:J^qrXUJWu[K8?TX7.c%c;-Ύc89&!08c;/ 8c 9 rģV)p J?{8c~%w1?Zb%A6Pk;cp8)`$Py;/ħ;w1_O~Zb%s[!"VXVyIQ*X ZYeBiZ|X,> (PB (PB (PB 4d&F6dl2d.d.T^AsAYdjJY>+%>,%>|SϟZZIUMU+q+F2UkRqT'Zc'J\*V8tRh[Z01Zc'J=Zԫi:RխJƓmRkEJсZԫi:U ֥XIҗ8jU4+jb,,ZA`V,,ac,,bV EȰ,,,+eYeYeBhYeYeYYV+Eʛ%T| @>NtMˆQԕ ]5yJZ5l!j 6wõQ/j6@J|iLW@FBm M~JjV7JjV6(RZMXV,,ZV YeYd- ,XXX- e`X-eYeYdV,,,bk,,"청jW,TRcP)m0` w;ğ;%u:~?IS_`w >~jΡΡğ 6 bB 5-x6`s4#KJ 0Ll"^"y[+B7φJ|$925l1 Z=|AgI:*֥qbK?˃LPƓ\ȩj* 8TXqp*pTIzSjE JNrR\XRVK"Q["-bk"`X\-@(8["bbŅʁS*aŅʁS*\⑻^`*/pRNʢK9NʢK8NHݗ ]qJwaNʢK8NHݗ ]qJw\⑻FBlTKm:~Jw )P댗8nk*b.2Xa}/eŋ,a۰($&.wE!Ŋ2)O0ǐx/Þx21\HEӂ".w:A:C:"pDEΉ""B~У".uGD\D\'DRR| q8W\1w};*vk>jΡbOUPUn]:1wu".?(kRbw;G|9Qo3AkRbNX/ħ 4 lB?C bO@!ZԮ,Xa+pm ,eP[,!h`V|->,HPB (PB (PB (PCFNdcfF&BBE8T>}A;TSSϟ%>|*\XRUkRbE*\XR(iUJŊ ֥qbKυa[,,ZBc,,aPX,!`X Ea`Z,k,,"YeYeYd+YeYeYekR--%T| @>;'oW\1w|9c쒧iֿWO|)UJX\`Zԥ KEUkR-- "hZ,,+>| ,`YeY Z+ [,, ,,eYeYeZ-eYeYd-eUJX US`>Hv?l]p`%Nӭ~㭀`:G$kV"x̄4b{QF7.ɍ;F.e׉g| L^b̄|x|OB3z=a0Zԥso_N4łEKU,mP\ ƢƋS¥KՊT^*.PV*PRw JX [$,ElдZ*>łbp-ejv ˜dbbG"xNE<&">$"~IK95 ዿcusJZ\>B?%+ZD䥋sc%JՃr?%V)b8ʂ\8cV)bsAvw1?jRŎ938)_7 rGҵK8+pm ,eP[,!h`V|->,hPB (PB (PB (PCFNdcfF&BBE8T>}A;TSSϟ%>|UkR,q@ZԥpP(łL eYeEgŁb,PX,,`X-бYYeYeEl,,V-,,+2ʵF:`>HÌ|l:;GdbΎs?c쒧i־twEIJ֭|) UHCA;L^jbnBvLmeE NA,=yKڠE PFE%,P\%uΎ*vkGs:jc*Unαptw_c3;tEc1~wP^:; Qtw;GgA|8c~% 38c~%8΃)p J?Cp J?9#3w:~%=5΃p~%=A8c:q_#`NjQhi+pm ,eP[,!h`V|->,PB (PB (PB (PCFNdcfF&BBE8T>}A;TSSϟ%>|*F:UkRu*UkRu)sj֥VխJ7qԪխJ7qԥ)Z)V\iUJ7qԭ *֥.qJUi㚵F:kRu*kRu)siUJ7qԭ 1X- eYeEgŧc,,ϟc,,`X-еYYeYeEl,,V-,,2*֥PU1(|gLO 6߰`'%uOÜIS_`' tj v_wõQ/j6^i WǴkC5hNl4z}gEO5NHB 㷃bQƔe|Dڠ^Hɍgd"- }i M ^@hjJ6/j43NNl/dbeo5NH&oMf&z"5kRUg`B'Ns"6.QQcER%M/(+(Z; J֥P@RȬVȬ- EXZȬX. cNҁsLU(O]. (PB (PB (PB (P'H21#a!s!rj X* ϟ> ŋT*RY)a)ϒ>|+>l,"X eYeY`X,,`X-,, ,,eYeYeZ-eYeYdV}UJb U&<}%6 F: ]_vo$u|u> )Zտ'3!:< kآ^lQ dСgIe׉dY QFoYg1e!V* ,"q,2*Zcn N54\\ ..-R^TڢQrR\TjUkJ )dVJ+dVQT|-dV,  0P7.qE$'&"x""">yRR| q8W\1w}iֿW;PJ֭#*UnαpWu{ʂ\8cV* q(;GV* 38)o9w#kRXVyIQ*X ZYeBiZ|XB (PB (PB (PB 2t#2622*/Vł XB,>|)UJb)UJbUkRX@+XT,,+>Ō,+>-> eYd, h,YdX YeYeY,,!XZ,,Z,Ebk<}%8n7:vJ.wÜEGIS_`:ΘjΕgJfBtx{N{S5皙Ljt皘ЛDHh/51y{TLL2LL2 ݩ7*{Qy D6 P<܅Hzxd3P!ɑ,nB P+ X(8["y  !8=Gw`px"LE<("(.skA?%upS_`q#R:UXV%i:JX?αVw lĿC"b u$.; QXZw;G]y;G Ŋ(/EM;߂Ebk J)PY ղ,OgX (PB (PB (PB 4d&F6dl2d.d.T^AsAYdjJY>+%>,%>|Sϟq+Eʛ Ŋ(/ )C"b V ¶YeYeYP+eYeYL, 2,XXX YdX YeYeY,,!XZ,,Yd2+-ua*ǘR@D(~+s*߲JZ{|uj[d'G{kڠykڋ4e 1Pi Mȳ|x|O)gI dV,Z̓```(DIX.dTQj*,h8\\*ZXEb U'pAX2+-ua+dY(XZEG±QX\,@.Vi@ܹF&*WNpi#9`".$" x"!JX7cw䮸bsJZsujQ}Mα^ڱ*Unαp_䡑Xk?c: ;/ G;Ģ?"bV{sAUI;G ŋ]Yα_Oa 8c~B?C"bV J)PY ղ,Og*B (PB (PB (PB 2t#2622*/Vł XB,>|)҆EbŮ )C"bV X- eYeEgЬV}YeEg°YeB,@L e`X-eYeYdV,,,bk,,!k,,Xㄪ0G@BB7ዿs?IS_l?%+ZwõQ/j6yP+ *ejv ˜dbbG9 0t;99B/\x4JX7c( ]ccJZw;PJ֭Dc%Xxd`)bXRu`ܻuc8/Pȭ)b8MAx]; QZRŎ9p J?ςp J?dVcxs;ci;߂ȭ)b%nmR eYd-@, υŁP&B (PB (PB (PB 2t#2622*/Vł XB,>|)҆EiK8QJ,XめF+ YeYeXV|*2,ȬV,XXX YdX YeYeY,,!XZ,,Z,p2Jt䪩0G@:E 6߰6ዿ`mÜ}T:l ;΀_В[{2Nv%F!ޙ桉 'x6@uz}gEG$]D5<'^3Fۉ@zE143\ i W^PLQhdo5P1hA\LQ{Ɛzy-Ϸ#^ڋhM5 ^4^yg!CC4Bs5ɇQ3SnƑm(GLJ#73?a%Zdm6tPƓ\ȩj* 8TXqp*pTIzSjE JNrR$'NJ )dVJ+dVQT|-dV,  0P7.qEہ.cr.nv!a_ Ȥ v?r]p16?;NӸujc*,qUn]:1oĿV%i:c;/ 6 Q\ ?`m;G3AIZNw:~%=+W;߂IZN^RT}J2(VYeZ}+>AZ(PB (PB (PB (PѓdّɐQz,gϟeNŪ)dO>~kV )V%i:q@,"X* YeYdV|- geYd, h,e`X-eYeYdV,,,bk,,"[,p2Jtꔒ<}% "o]pîc쒧iֿu[m|#R`[- h'|;^exoLQ D35 HhMCFS C!ɑ,ZlxN^Ɣ5L1^F6Fd#zd+\ :> 89t(DIX.dTQj*,h8\\*ZXEb U'pAXkVT@RȬVȬ- EXZȬX. ak+Sn\#lˑ` jbrE51y{T':FP]>JEWVTi`/xCILWhCﴐհqO36/j j0x҅2ךP.Ɂ[r逴z3z0S_a}O%+Zc%Zb.c%ZαVw l3OcߝTfw1D 9Qo`Q;Gl9Q[8)a8c!}i bO@!Ū(R [%Ghic,jeY E i`TB (PB (PB (PB :FI P\PV|Y,ZROO O>|UPJ֫XK'Zb.PP(Zb.P k)uRUPJUPJCB,"X&bYeYŁPZ,!`X Ea`V+eE`YeYe[,,,E,,ϲV .pRcP)3` qł`Z. Vi@ܹF&*| 9p:oĄ]Y`5JX7c~J.S_a}:JVoH#* ;uU(XRu`ܻuc6Kc: ;/ 8cZc=;G{p J?V .p`w:~%= ]!k8^J/)*>@CKd+V,Z->X O(PB (PB (PB (P'H21#a!s!rj X* ϟ> ŋT*RY)a)ϒ>|k8_JՂ / )VXsDV, 3,,ȬV eYeX* Bc,,`X-XYYeYeEl,,V-,,+]X,T9*cP)xS 6,ܕ ]߇;d;N7`IJ֭6N?|"bB 5-xBPC#UP.u Mw+:^ˏrdR3z< O VXB4㽀^(DIX.dTQj*,h8\\*ZXEb U'pAXk'%l+%+ BhV*>+ h* ZrdQa xy  ȼpDEPE 5B/DE%,P\~J.JZwcIkV?˿c%JՃr?u`Rc:~wP^?(*Pq(+d8c~%i9QֺXB 'sqS w1;<1+]X,T9+pm ,eP[,!h`V|->,B (PB (PB (PB#$̍L̅ʋը.q`+>|,w-PK'dńϟ>J|U8\}*V (N(Ru`RPҭu`RE*V (N ŁS,,ȬX|&>,"X&bYeY Z+ k,, ,,eYeYeZ-eYeYe,ՂkIU&<}%<%CB7Db!~*vk@pwcl$1IJ֭#{ h'|;^exoL{NQdНgjvL $ ZgxҘs4 "yeP<1x6xu<>i< '3lLfBtx /jZ\7^=RכЛKjbJ)LW@FBm 4M^@XDTKW4"^@Q{ƒ/K^O!^$E܅J5ЎIk'R48{T/5-y$chm4@/4>:WEc11Cjԇ&Fڠ#]6KP&OL5@zyƒד L#/OgVzxƒ d|O)gP HV*n)NA;(/4+zew$]FFX^C#e'#gKjHzy Ƒ+ĈXTċ S>XHrdj5hNl4}z}gEjHzxH$kchNTCzbzԇ&F5LlJ^{j?*ouc*o)bXRu`ܻuc2/U,gXw3p;c88cC;/ SJ#kV✀: rģ; sAJƓw1?5 rģ>@9Q 'q(]XRw:~%=ry;ckq> qS@qErw1_OxFC;?+ZJ/)*>@CKd+V,Z->X O(PB (PB (PB (P'H21#a!s!rj X* ϟ> ŋT*RY)a)ϒ>|kV*V%Z ]Xc'ubPTCIV+eʖZī\t]krՉ[.TU+Z(V*0WZĠb\ubV˕-rk֊Z, eYeEbX& ,+heYd, h, 3,, ,,eYeYeZ-eYeYe,ՂȬRcP)sfl`W\1wt1GIS_`: #R`?wõQ/j6^i W5 O>~{Tk&,<1"ڭhB{Qy 'yC#T XhQzE'/OiMO<1x/^BTE&F^j{r(O ^yEPO/O<=x"x6x7+ǒz)L^j/y#2=?L}BEE{6~'q`RF pTqTqpjb-TbEdEdEahZ- GEbp-Ac+Sn\#l?Nq!8=sGcPE𤋰ȻRE%,P\;W\1w}S_`>B?%+Zc%/hS䥋sc%Phd`){αVw lKk_gXwʂqGV "`8c~%l gq(]X, 8)" rGV "VyIQ*X ZYeBiZ|X-PB (PB (PB (PCFNdcfF&BBE8T>}A;TSSϟ%>|UEbE*V "@+A[,,ȬX, EbYeYeYd, h, ¶YdX YeYeY,,!XZ,,ȬV*)ZN T-pU1(|[0` ǎ!1%u1/߲JZǘ;'В["?d'G{KڍC2:Z%Հ`eP#Bp{""PEyz v?tዿcs%Nӭ~c;PJ֭cXRu`ܻuc9_>u".1 Q7gq(|w1?RV9q(=S8)9w# UsbO@c'*J/)*>@CKd+V,Z->X OZ(PB (PB (PB (PѓdّɐQz,gϟeNŪ)dO>~Jk)tJR'*)V \V9JpRkD ZN T-rX+IJ XX,,ȬX @}YeEbX& ,bVhe`X-eYeYdV,,,bk,,"J@ Ei*ǘRiO(?W\1wJZχ; )Zտ0'q`RF pTqTqpjb-TbbRJ- I[$,ElдZ*>łbp-ejv ˜dbbGyx v?tዿcu?kV3Un]:1P^qG;GNA;GXIp. 4`XmR eYd-@, υłPB (PB (PB (PCFNdcfF&BBE8T>}A;TSSϟ%>|PbRJ- EPbRJ- EX ac,,+¡k,,łV,eYe, ,>,k,,"YeYeYd+YeYeYdj3HR UPUI0G@$@#ǐ` 15Vዿ<9d;NXc\XA[$kVOx̄EHCA;%MךAb޽x/Aa"\Ssv$k&CMۈHXBm!ɑϾ>+Hrdj5j>W7P&F LYM>6Hrdj35@Cj&F57y{QyـP<^n܄v(yݸv&yvcj!<^nHJAs23MB;eILP&}Sf5Hԙ!ɑI>iKE7.ɍBJ^yCj!Hrdj04ŚChd&F>)СW.ɍ(1͂B LQbc4(| B(>0/xRqD6P$925@XjnP65@r5Q"ď57y{TO5DvLm3y{T5!#]6j0@!ɑϾ͇3HrdjQC fcr$ (!ɑϾO57xҀs(PHQbgy(#Mn&^ԥ+ڌdO5/jfrPEq!ɑFOʞ4X@Ƌ"Bm LXlt\l)LP&}Z"(HrdjSw䋣A\l9xRqo &$925@d(o113!ՁhnDgIe(RQ!JT-Z2,ؐwå{RZġIhY"HLmL k$] E:LmQX>|3`=(|4HrdjR׍eO E`ċ} D36 C<C#Wk*x@=aw)s6&}VafE(| L^jZ@ޘhrEϾ"@` gDE-HrdjR׍eO E"Bm LX3> $925ykƲ z`q.}&Ͼ)E>eKKMAs_)@Cq vpgE RM'GLJd6?:(լPԣQB#o3!:<h'|:\藵-^i.^կ^^j\H&6xZ;O,ZR׃z^5< hG"EϾ"@d(k#c2)xRq<ԴJN$< C:*C#T }-yk[ۯʞ4hK>hgEM'GLJd6?Rb.bŮJR0 N?|"bB %KWKkǷW.ɍ46@M P%6đt1^|6:KDRpo!*8\F`&@J;eRLkK^ xT{EaEϾ"@d(k#c2^"'y P Ă瀾232Q@@(| Hrdj3ů5-x7x{uYS$} D3P&Fd#yH?L+XKF4)F:4p20qkR2lhC^Ą4D CUZ7׏`x^j Id皆HhM$k!6j۞#]P /5 MÉ PH.xFF`)7Gaylć&F>(Fbך$kEc桩qM>$925@B1CR `{Tk&!P6:+]#yjyC925l1f6PDLP&}PdT چ 5y{Qyj/^EHhMۈHhMgm&6>O5\.SpoC8iLP&}Rj|3 dpC#UP.}&җo$]P@|P\rNQ{925l1f6PC#T }d|3iBP !ɑ,P|6@\lLP&}R桫ƔkBB<׵D<5y{TO5DvLl5/jv$k&CF$k&3FNP ʞj07$%C ]! n L1!ɑF$925^dHЛJ^j0yvLmBaW.5

c&F3(|$925EcC6 ŧ1tP )LQb=(|!ɑ,L|3FEN(>^(&FgE:/yjP65@r5JbG7/jTRJHdЈRP<Ԥݹ  PRv5h#NP /5)7$%C ]! L/>>)L^jRPC Rj6$\M/5)yvLmBbW.5)yC#V^/he!ɑϾ'2ƑC +Hrdj ^+Q M>r&F>,!<5xҀs(PHQbgybG7/j橗 HdO5 W@|3 .(| L^jk*x@=aw(hs6&}Yr,P|6 yKC"T&F>-C,$925yjpt+ o^"ךxN6P @VgEM̄|x|Ox Mc73Bek)u(f)H03!:<Ə5HCA;%_j4%:^=5<.ɍ4#MqSbAqBT: @Ͱ"1$]y؀:xRq<97|dfd<6P XHrdj3/5J jvڄ*rˤo5^o(|!ɑ`l4 h&F>(H j{Pi!ɑCɍ Eڠyݹ  PQyq  LQx5Аڀl@j/7$%C ]! h)LP&}PP|3B$925^  T 1rˡCE7>ZհW ŚCLP&}P< F< C$925li郌&FA#eKC!ɑϾ9xҀs(PHQbgybG/7/j樗ɍ'@|3Д> C#W5< h;vԑs6&}R(>c'/He.&F>))# J\$925yȡHrdjQ"Bm)yE1T 0JН' $925l1f6P!ɑϾ> jTt$&v^k*lH.3Lp q1hf[0>ELQn 0rPJC#TZsF $LQeG0>@ Hrdj 0PT&Fi$>@B(>B$925Ea IQC3C#TXlW)x8@(|``gE: <9xҀs(PHQbgy,HPeC+ڍdЈQj67nBFBm1ZC#T }HC3&F5>1*C#US.}&җo$]P@$GLP&}V$ ^4(| u!ɑ,P|6 kr$ L5^43\&XnFj,HPeK^jZr51dTڠ>CV5< h;%HrdjHЛDH>+DXl/He,&F>,!<9xҀs(PHQbgybG/7/j׵.#]Q<Թ{T0!>RԹYS08G0HЛDH>,(>/He,LgE(|aZC#W/7 BD H|6 H+E5^lHrdj3P&b3z<@J ek)u(f)RƕJR0 32l! %LWL׆cdcisLMېЛE517n!#]a LSskBcjJ/yq!* %7 O M>!JC#T },ZSv5 J&B6P @lgE`ġC#UPЛPAJf\pq#y)L[a昳@(| Hrdj3fT ژ>V/7/j/#]FO5jf‡b)L^j/xTzL2bԇ&F} D3&E(h\lRL谆S( 2 &yj0Ejbq2BF&6j{T0> !ɑPk*x@=awC.}&Ͼ.E(3xRqD6P!ɑϾDP&F51yNHu+ Pt\-yM> "C#T }B62=0Ad΃(VBRFi RvR̄EHCA;DjIrޭxbRE1楦HhM&yh5!1%5-7$%C ]! L谊ԴݸuchlB"yiqM>!ɑϾ/5-(| Rjvڄ*H+$o5-y~925lmbl~&F>-ך^Դ~&F5-y{Tch5< h;s6&}XnFEg‡`m#c2< Cw ?LFVBRFi RvRdkd'Gzh'|:\~jIrޭxbP~ L^46@M P%6{Y|tJL ⇚϶M`Tn-3LfZ><e2yCC#Wk*x@=aw+EϾ"@XVcb楯ʞ4X@ƊB >hgE`ZfB2(|?925ykƲ z`q@ZHЛDH>,AEbP>RC#Wk*x@=aw(L >hgETX2ykƲ z`q> ؑs6&}X,E U>HrdjR׍eO E.}&Ͼ)E>+P<ԴJN$< 7@(|>D&F>,HP|D&Fo1 Z=|AgI:|+XKF4)FT#l̄ *$!p?^ԵyxoV{ux1(|>925xZ;O6Hrdj5j>!W77>(Hrdj04ŚC`&F>)5@jP$925yjq251;Eڠyݹ  PQyq  LQx5ӤbpBT< ё0>Jn @@(| LP&}Qf!>q!ɑE LWBHЛJ^j/yvLmB3r'y$925lmbl LP&}Q^j{Y"B " 925EbP>$925Ekr$ $925@G‡Pe i ,LT7#^,HPeQ<51Ay{T5!#]6j07n!#]6j0FgE`5xҀs(PHQbgyH#CW*yR$kch+ڠ>AC0C#Wk*x@=awC0C#REϾ"@X"a9xRqD6P !ɑϾ/5 ^43\&XnFb<5y{P桊b51eP!ɑ,P|6C#T }B6s2=- 73e,9ydk0+YSbAqgPN&3- ޲N|30Hrdj "C#TXfx>+Hrdj 0Hrdj P>ILP&b63!@3z<@լPԣQBqrfBtx w"$! xo^{ 栰vLmLvx.*lH.7HJA(F$chlx W)x8jnn %@'  Gayli!ɑϾ@(yC.4Hrdj5j><^+$o57yA!ɑ`l<he!ɑϾ>j{Sr\L^jnq251dQz`lDP HrdjQ{Ʋ z`q>!ɑ"Bm L娱A +Q M>925@G57xҀs(PHQbgyX7/j0y{T$kchDyP< r5hMۈHhMg C#T }j|3cbR CiLWDHЛJ^jE1TW^o(|!ɑ`l<heÄ&F>)3uJ"C#TXl^+Q M>Hrdj3jnP65@r5JQbGLKJWɍ)y{T5!#]6j27n!#]6j24&F>,ԩ{Y"dE5.&6ŧ06JLB->|P v(>P f&>IQC,jC#TXl+r$ X4&F>-C,C#W'$]B aN\-yM>C#T }B62=XAdVBRFi RE#̄EHCA;DjIrޭxbRE13ƒy u!*\f.chl"$xRq<ԴJN$< C+C#T };yiC+C#UP.}&җH&6 +NRכX925lmblRL{P/k$\Xf")(|`B&>P> C#T GLJ- 73UPԣQBAe#̄EHCA;DjIrޭxbRE13ƒy u!*\f.Iᰈ1xRq<ԴJN$< C!ɑϾ5-(|T&Fڠ$\M/5-yvLmB%oW楯7>R 61f6P@`gEj{Y"&yuchN O>R1C $925Eb JiLP&b63!@7|" ޳$l~c(RQ!JQ^`H0;}0o!|@/   ąb H|j |H"GC}9>ȑjH5r$}#Եj |H"G<}ҷϾ:}ys+X:`!Ⰻq`3 1b X0Ņ81ŅX+  w?+  CVBXcb?LXc!*aA+ ??Xc1!bJqXc+ }  -EڢQrR\T5)(R+dt 2T8/ ah-+\,XUrVJ}"F* IZ0Z$ [T^,d (dfdV+ ŢbBS"-?Z˚ZTXaxBqs"JqQIHխ d*X^.dR8kCwRŪ)d\բK J SLx)qb KTJJ.,ZRJ+Ghn"ŋT*R˅ڢ*Vv[.ijQb ̊V)GE&6)Pqjֆ2)Zڢ*s)vZ-ZE+SL\{]8kCw# \ȥ?%Xd`cw\1tp20qk7qJŪ)ZqJŮXҿ) Y SLx8ŮR`ȥhhFn4p20qk`2)Z)Z*>b)1(qѣURJR0 1񫎍 Z%) VVL|`2Vv[.ijQb ̊V)GE&<`2VvK,/2)O#JJXd`A*앴˚ZTXaxBqs"JqQIp20qkB}c])Z)[F" Z%P /qKŊUJNe-Z*,TT8JP8qbK*Ztobk:`JJޥPbK.TNoT50lf{[I;EzN.#1J|`2)ZŊU\.p.,X`%P;,˚ZTXaxBqs"JqQIqbK*)1bB)Z)[H0dRŋ,pŗ /qKCEeR SR7[F"+.pRB\.p.F"b$2)Oʖ4E+E+EGE&9RƕR`ȥhoqK,VB+i;-4hRRE+EB"qK,VB7k-qJJإnT``2)Z\Xb2s)w7qKeKV JF" R%i:u\{]wC`Ս+d\բK J SLq\XJƕ.,P%ucJ.N5uT,w(R8*J|B`hPHcj -[qK,VBmAbJ|cJ)H0dRn(ll\{]Vj 6 ]XҶJNe-Z*,TT8JP8Ƶ[,P%ucJn6C`Ս+dRRʖ4E+Vqi[.8^}U^*XҰJR0 uA{ke R-,PYsB+#JR 8 J)NHk.8^|cJ)H0dR+As"'ia:)+i;-4hRRE+EB" XNJvJNbE)BVVNu S)ZpdR\`.8^`dRXE)'ia:)J[IlEE'2)Z*1Nu S-uXaxJ,'P8BYJS*ZXB\X4p20qk -uŃGTkڢlqTVV)GE&:˜n)) VV)GE&>5P^[Y1Azn)dRR \XB,˚ZTXaxBqs"JqQI.,ZR)qb )Z)[ŋT*R E|R/V\^,V-PK.8^}Bw%m'e断*X^*P\ȥhRT|RcNT:9 RG,VVJjYsz)Z;]P /qK;[X[)T.p/VE+SR\.p.J'd\բK J SLum-Z ,OU˜ ոJm-Z ,N˅5P^[Y# J -p`2)Z)Z*>b)1K\) VV F@O0RZKq8'qb lpNa{NTڢŊu ]qb+*Y0t.mT*R(.0XƃG"`ȥhhǍE#JJZ`VE#Jզnq\.p.k*X%m'e断*X^*P\ȥhRT|RcXR}Z (trȥhoƃG"`ȥj,P /qKn,i Vv[.ijQb ̊V)GE&5JXӪ)ꕸT*RȥhnsXI%ßXIX8>48E+U+qcNT /qKȤ`2)ZF J~4-VR0 1j`ȥho4cJ|j:R0 1^`H0dRRT^^b⶛x?f#|\ cA#NBp{`/cBp{`!ӃeF? 蓐Πcї΀KP:[Ng@oc!8=Hp{p>p{ <> x> {1| cNc;F? 9 ۀLF?170GO0 wcF 89CF 8 1HcsH1< cJ,b1%CNa(1%w!| cWcÐJ1 xcp*&b1B2'( cgx 0' xPp{|Lp{^B1g!8=ACxF?xRp{NB1L-'0 q!>N`p*`!8=(T#c }Nx('lja9xF?"T#ppwsN^B1 p Bf#{N`IN`Qp*eGD `!<eF? N`@2CG#`@~B1^Bp{ 7w b1( (9 (yB1Y#'!)1Vwc.“b1) 'H$8= !)OxF?"ȂN"!숟#Ȗwcd@wc*@7b1Bp{dMs+8c&&8=!{15T#w8pp*p1'ĜNB1##)'F[c#GF N$8=ӃNB1qy x@`DOA!8= rؠbx"8=/F?oϐ@>cؠ c"ؤmćIgxF?Lx *_N`FKc'#*C|k8#3'#'8=1T#`N#Pa3 9 P`>#Bp{#1e0ljdeLp{#3c,cd`k&# cK$.'${8= c('n&8=-c>&8=|sR.+OD\V[͈qZd\V\Vc.Ef}y2EcqYqZ9qXk "[d\V;ซ\VHE`˒qXuHaNTEaqXyʈp*"{qX{ʈ@.+<qXDD\VxqgqaBEł.TEłnNEŁ?*"x 8qaTEň:".,.,pqb.TEŅV8c~%+1 rģ>7fsA[ӸAcp J?Vo;G|Y;G|,Vw1? qXi;G|x5 rģ@"`w1?+9Q b_;G+gq($`w1?30..)ia~+q(G9Ew:~%=`w:~%=+8) ?8) O9EYE,!α_OFq`w:~%=3;c_ 'sqS1b Enbu"J{3,XS;c\XX/ħ#ذw:~%=qc8),zw1_Gj3HR UPVyIQ*X ZYeBiZ|X B (PB (PB (PB :FI P\PV|Y,ZROO O>| JpRkUk[\XR* ŊL (/*PJb.Ff㠩R2tZJb.FA{J-XKF C3h*jP8ۣQʗZ1XKF(ZՊJsKV(Z[)VB*j3HR#V7rJb.) d(RQ!JP(qѣ]J`IUPԣQBP7 ]88ԩJFZ ]J5)J:4qjJV)H0XKF4)F:4p20qkR *j3HR`IUPԣQBKV)H0XKF4)A;K )O%VBRFi RvRdkUk)u(f( `6J`-XKF4)Bn))Uk)u(f(Azn)XKF4)BK\)Uk)u(f(hdR0 $(RQ!JQja%VBRFi RBJFZ ]J5)JūZVBRFi Rk)u(f(8ŮJR0 *(RQ!JP(qћ. ZT#­b.8Z+\J`UPԣQBW88ԩJFZ ]J5)JR0 *(RQ!JR+J`UPԣQBXKF4)A;K )N2Pڵj3HRj0%JR0 լPԣQBz j3HRjYszլPԣQBqr j3HRh4p2)k)u(f(hYH0XKF4)Fy#”j3HR UP@ĭ4irոrk)XKF4)R8kCw*(RQ!JR`b.88ԩJFZ ]J5)J:3pѣ]J`UPԣQBPGTkR j3HRjG#)H0XKF4)JFZ ]J5)JTiR j3HRBk)u(f('ia:)JVBRFi RRdJFڵj3HR/V⒑aVBRFi RT.p/V⚵j3HR..T‘aVBRFi RE#­b. )k)u(f(/0t`RFi A*(Eb`YeYgŇŬ,+HeYe, ,"Z,,ȭYeYeY ŢYeYeP2 Z ]%T| @>7t;ğ!%uAſd;N@s_ )Zտ.3!:<h'|:\9" (FM (G:6Ҧ^DchNg3$]DG8xՒ.ɍC`E ԍvLm>g.$]qC m.3bc0`|L|>&F8<>'޳$1c(F U--`~E^Ą4.Y" Hg3$]DG8=E o3<LۋJx.ɍ85#]OˉhA\Pghz6110>&>ACj9Hrdj|39q" D|3R!@^WuorE1H5P"Hkڠyxgup<>'޳$1cI)V^fBtx{Nt ږIdМgH@^Qa;̑vLm | HdrEW<0pF&3P$925yj(%@έp<>'޳$0ØF T^̄_W! K`jIsY"B/4@ jy^KW.ɍ5.LmeEӤEci ,dThEx7 ^PEC#UPEiL[d`3m2d5@|6bo.(|"A!ɑtElfB><>'hf&x?2RC|̄4k"^АlH ĉDׇB 0$.HGQ`@АlE Rj/E`Ȱ4y"#28?L尐XKd'GXW! K`g1$]Bd -EՒ.ɍC( Qe/s2E1D|3`Dɍ ċ (x3SG11C=a!ɑ2ȳ|x|O)gIb()VBE|̄ *$!p? ċ&̀mxguxgVg.$]DX^,D6^Fd#yH?L:J UPg3!:<h'|v ژ" J!ɑ-皘jݼvLm.yvըݨJ (O!6ĆEڡE&*l$gh3 Spf} 83yv5gjĴ̄|x|OL3z< 0p̄4b{QF+d^k$]`-yt1>H3è9(| @PPyCj6y{Tck/5@PnFEg C;CQFoYg19k)2l=|A^Ą4p?7^iX^j0x dL43\#5k>  0yoB5EIHɍ;dF)EXh3j^^7yIPp7o#]M(XbQyC:C#REi +HrdjHBm j07o*l$>F&6QbD P"‡a{QƔ&kBL:Q.}chE13dHQN<nuQ{TGfX7L2iLQNj 4dL}P82}yHh# S5n'j0x҄s(P3yݼuaZQybLm<`ndj2>݅FH 4&!}#^dQzE1[d"`W$yt/ytBLmHx‡@1EĘ"×#$ a}#^dFHKTFG۰Hj>Q/j2E݅FHFH] S5n$XPd41 S5n'a{QƔ&kBL:PXQفAC9LQaAaa8qP69L^iD2@>Q/j2y(L2d|6`07P0 &F`(|"L[d`3m2'a{QƔ&kBL:|݅Jj/>݅Ek,v5PPQy/j/7o#]dj2$]D5݅F5Ddà55.ɍC Qb#C+ڦyQفk1C ć&FfTۏ*L^i/4 M`jyQ/jT6'( 3B:yjC JԑvLm Mj"@}{T5NTHJTJa{R>݅Qi ,:(|RTchf{Qz,D|3`dP> >pLJRjs651yvLm!El@B{TDk&{Q>vԡQ`Ip.KLGLJ730d HJT3!:<h'|v ژ4 /O51^GDchfuP"G6 @T ڋj"$yڡEl:^`gfx`P!ɑLdG܀vLm jb|6`f0>كr&Hrdj63 +:᜹p ^bZfB><>'gI` Y|̄ *$!p? l,(| V J pvWpj?b63!FoYga )VYb,p?-@^ƒ/ xg3^^Wuk9r2>'޳(^a?$ Yծ?|"wå0x33 s(ISpfnF1<}xgohf(GO P<AՅ#^2>'޳(^bzjug3!:<h'|:\K^ 07e Df-E chPf-xZP 2C#UP"5-(|bt&FڠyE1LT 6kKWlldR3z< K@ x NCl'g 00 `?A?`A>p@9{?>@<&@]?h0@<Ux C3'N(DIX.dTQj*,h8\\*ZXEb U'pAXXKEdEahZ- GEbp-HZrdQ тqjL2%#$aq1R0g0NLT18>p_H{gA"ߙsR =bH╬){bH#BPHbP0 )O8k"c'TSui$Kȥ?PJ A(%=Dc#7'#΂Bp{:.;H.c|Dp{yN#?!8=`>$8=BӃ !?p{x#|ą2.̋\ w )\qnlEcȸ Mp@[.Ew^E.<d\ԋ\-"߀E,Ӕp@ y.| \gŤ\NREw².RE: |{\ȸ <H   <.REq7p'$\'g9  ."8paD\'EHNSd\'*$\'Mi$pBCi". H!pZEQ!As\n]p10@-T:}w)Zտ,c%,VBK?αVBK?αuasXW?RfαZڗVc%Pjs cXusuXU(N,T䥅 KXV8qrα\\?TX7.cJQ_c1 C()V`9'j 9'-D3rO%.7yc:$PRb.c:$PRՊ9c~w)ZE]YuI$_c:$PRiibAJJ<&c~w`xuI䠥Zk]Y}c:$PRb.I䠥Z ]a I䠤,P#,c9'mbVa*I\Ef rO* 8c*! rģjAR>N9QK )p J?)VB|9QJV(R7w1?VbVp@6 rģ#*R3ARiibN9QJJ O;G*uf gq(Zk]Yt8c~%XK9QJ,p J?)K:p J?-ugsA.N9Qq(ayp J?U w1? U-- _;cT@ gsqS߂-@X/ħ.79EZ ]@X/ħ+]XH߂u;cCŮX/ħ& G U8 'sqS߂f KK@sqS߂j+@gsqS߂f KV gsqS߂jug ӹ8)J+;3"J{Rb.8NI;/ħ b\8cSn p~%=QYg3"J{ l!k,1? k)t^RT}J2(VYeZ}+>aj(PB (PB (PB (PѓdّɐQz,gϟeNŪ)dO>~J(RdC]qkUk UP^,R`_%VAxCUk(O%& G U2PRijVRk)tP(*(R4Z ] )AJ - ŨeYeEaXZak,,šiZ,!`X Ea`X e`X-eYeYdV,,,bk,,"[,R#(R*cP)6QF0ԕ ]5d;Nk\|5Ĉp|BJVo>3!:<{NtϯjZ\7^=?ԸvLm.yir5h楦$k&3KGmh/yiq!* %7 O M>!ɑϾhkKMۈHdAjZnD(e1Hrdj3yiCjvڄ*(yk!Hrdj04ŚCjd&F>,* P>/Hrdj8'CjMlfB><>'hnDgI&VBRR#Jtf{ 6 bB _jZ\7^=?>i-*l  RJm &v^k>6$PNJfA8̴|x3z,gRԵX@ޘh0$\M$ } fg6 @925ykƱ{08NБs6&}YJ- ـy P Ă瀾-32Spe`gE AC#T GLJ- ޳$VBRR#Jtj9RF&d'G7|"/bB ژ4 /KCiL^46@M P%6{Y" 1E!1H&&6`^Y"NLmQXD|3`ZPE0HrdjS*&Fڠ$\M/51yvLmB +\BwPE925lmblRL2|3aƔV>2(|6HrdjSz&FfQC=jC#W>$925^^FBmB/.!CL^o(|C#Vy,&RLP|kE2Hrdj8'C=&FfqC=Hfå!ɑ- ك7(jbn %@'  MB M> C#T }$(|;Hrdj62=0Adγ(RQDiF ՗85u2,ؐwå}{RZġ&FKGi犛 ĂqԄtq`DbtBLmk$]/5.Lm>Y"FLmL k$]rY"蔘 |fjPC#Wk h;EϾ"@XBv&F5-x/x@=aw(D} D3@6v&F5-x/x@=aw)EϾ"@` lE L^jZ^zL4P2$\M$ } fg6C;&F5-x/x@=aw(HBEϾ"@e('fNJ(jZn %@'  MB M> !ɑϾ> u!ɑ2ȳ|x|O)gI`#c+XKF&VCm:RK2,ؐwå}{RZġ925xZ;OD&Fk#c2e楦BTq /LLv'& L7>925^"Bm)yk䋲cj>:-xpq jZyC9iL[a昳@(|%LP&}XN|3:0xҀ LP&b63!@7|" ޳$l~QXKF )uœ2l! K%z۫KdKGi犛 ĂqԄtq`DbH!&6φQp925@a9,xҀ!ɑFd#yHAd >b.FA{J-d'GXW! K%z۫KdKGi犛 ĂqԄtq`DbH%&6φWW@q<ԴJN$<i C7a!ɑϾ<Դ!ɑ2ȳ|x|O)gI`#c3PԣT҅ N?|"bB KWKkǷW.ɍg!#]6jZ;nxtڀltԴ8tZf xv'&%Hrdj35-(|!ɑ2ȳ|x|O)gI`#c2k)u("4 U49B}||||''';}||||''';}|||pppn Fq# #8 ă HS0 k# ʱkJ k;a5DDZkL0  ,BYmQxAXBI.PV*F UPVPRw 2T8/ 2X}T,@* E E±`[ vcBS4PZJтT)%PV^Jڢ$eQc NC#5@"XV- 2 Ji C3hJNe-Z*,TT8JP8Pn/qXaxJx^V mћE2)Z)[֨/V\ҵei PT;tj9RF,VV)GE&=Iy[5&n,dRR)Oub#}QX(quE`dRR)[^!T.pj9RF,VV)GE&=8mF ]qdnр {K :LYruB#QʗZ1dRRT)N*>b)1)uŊ\wn: ,'NūY SLhՓ'NūY1F ]qc""*0RI  dRRT|Rc2)Z)[L2(lpJJQIA{J-dRRmF2)Z)Z*>b)1񂅪˚]XHݒsKV,/(N.dRT)N*>b)1;86~Bp{^Bp{x.x#1q< cρӃ΂.󨸘tF?6@atrk|pN#:p{Lp{ xNp{>>y ć'dLp{ A"17 y  ddωdY"#e1A'FY88=aa!@&ሌ O"1$x"1$8߆"1%|"1% F? %p>p{ @qNd".&8=.p q!WNd/p>p{! /؅?GN#"1#ax!8=pyO "qy^HEĞ/"BJEĂ./"A7>Eā?q## eJZ5X?j|ciu,:XU(N,T䠥Z ]c%*XAJαjXAJV(R7:J[?: f`\\R8c>u(07c?; 8`Xα Pec:~wd u(:c?;g%Qw:~%= H&α_O3;cQ 'sqS>|,w-PK'dńϟ>J|R%i8)P* Ŋ'q+*Y%VAxI}[[.ij ]qX*V(R7[%VBRR#Jtf{Uk)u("4yX(qF.c%VBRR#J5P^KUPԣTғ+V\PHr֌d(RQDiFn: ,'Nūd(RQDiQ&NcVUPԣT҅ʌ*jP(hnZ ]J5H)R 68[%VBRR#Jh20rJb.F`j#WV(R7XKF C3hʵjP8ۣQʗZ1XKF/V\r֌j(RQDiI.PNTj9RF5k)u("47J Xյk)u("4Փ'Nūj(RQDiBF ]qeZ ]J5H(4`7rb.FA{J-XKF մ9VBRR#J0PYsC)ҍR#(RQVV˚ZBjV9JՊլPԣT҅`^Z ]J5H(^V mѨKլPԣTҍT.pj9RF5k)u("4՗(mT*R5ujQKӬqjڵjTjɓXյk)u("4r.b.F 0VBRR#JT¥ լPԣT҅ XKF(ZՊFUk)tP(XT,,+ PX}YeEaYak,,`X-`X,k,,"YeYeYd+YeYeYeYrWZ+.qi*cP) ?Ő` ዿsT:Έs?%+Z,܏z. 8w| ``1G'-W`l/ 6n/_`l]`l̀`@[`"H?z(DIX.dTQj*,h8\\*ZXEb U'pAXYrWZ+.qi+dY(XZEG±QX\,@.YZrdQ h?. e^R4F bp/z1TPk0d21بgA0#0'Fapƣƣ0H5PʂX9PkɁ0b3*(q:1b3H2/!/p#"'#"7^B/ 9)ϑy|żȼ_ϑz.|\^Uϑx۟"ǟ"ȼ"|^>E|^s^^ y/^ /y/\\>|>E%,P\ ]cc%NӭΈGkVtERu`ܻuc?/.?(;GnA;G?! rģE;G$ rģM;G~9QAcٝ rģ_X:sq'#:B>w:W! w: w: BsrG"w1- ˒YsI[%Ghic,jeY E i`& B (PB (PB (PB#$̍L̅ʋը.q`+>|,w-PK'dńϟ>J|n%/hŲ断q+e-Z\kn%/hJSVS*Irո.q+J՗(Z[K1V@)q*Irҫ.JEe- *J^ыe-[VV˚ZBjJ^щĦ T ]q){F-+V]VV.PڷbbSVUk ]V\֊˜Z(aRXX,,+ b ,+ д YeYd, h, 2"Z,,ȭYeYeY ŢYeYeBYdCU+ZJ| @>xQ%!𔄕 ]JCÜuJZJC<a(uωjP CwõQ/j6^i ^j6x ݄V<5hNl4ϾeJt^f60j@y#2=?L݄jJI h'|;^eg!/@E`W@FBm 4&^@b(j/e7dh 5OMf&zu0CUs2Nt{R皖i.> ׵@FBm 4M^@bך7ox/3mkchk ڡE&׵BT/1#73Ӭ7u+-w3!:< ױ-^yxoyx:xf/3aJ0`h8ʁN$>݅P<^oy WBFBm j:3n-*lTH&6j$y( 1yq E1LY" NjbqƔVFkC @$925^  D6tLT/V/7.ɍ'x7 gDPRA"&xb6<(Ejbq1CL^jI3FLWjf}LW533N30tiq#+* dƗjb dLIy {(|"JC#UQЛDHhE`)Vf  P0 D۝x҉zx樞n"^`PE925x҉zx樞n&#]65DP@hm jgxC=RC#WϷaJ%;Ei•fcBN8N$et%@lxLO/j2y{RE1nFJIhM/5Dd>TO.j03m1}B62=0?L¾fBtx /jZ\7yiq E1LY"Ե:4<:ךEkqEi•fcBN8N$et%@lxҭz}楯. 1RT`Hf"cEo@fN$^EԵeP.ɍx\oVP{Q"y< ׵BHBl:@ȳ|x|O)gIp+F<̄4/b6^Ե楯7/jm{Q{P.ɍy hM/5ɍۈW.ɍgX&6a;E3E9EԵ#c2(")J-.PET+%>,%>|Sϟq+Eʛu+-vCU+Z(Ru*kEV+eYeEa`X eYdV ,,`X-"Z,,ȭYeYeY ŢYeYeEbYVAx*cP)y^7uy+d;Nl_BJVo  kڍj67n!#]6j6yvLm'gPak kß2"q,2*Zcn N54\\ ..-R^TڢQrR\TbaasCrVK"Q["-bk"`X\-̭NҁsLU(LE^xsAs\nW\1w}T:q8)Zտ&Un]:1_>u{ʂ|8c :p J? w1?8u"J{8c~B? P^,,.hnJ/)*>@CKd+V,Z->X OGϡB (PB (PB (PB :FI P\PV|Y,ZROO O>|(/47XXX\ޕZEZ(/47 "b,"YeYXYeY Z+  e`X-eYeYdV,,,bk,,"청baZIU&<}%:g F x I]pSß쒧i־NOl9?BJVòy2Nt{Rךk$]D5.LmRכ@F&6ykKڋdҗ7o*l$eP.A\'xZ4 OMkE}tP ďKW#ƒ :,Ij楯7/j0$]Q<`P5hm-xZxNo< !9dbe;F7#^`HBlvRטGLJd ~ ŅjS\(DIX.dTQj*,h8\\*ZXEb U'pAXZµH YhT|+ YhP7.qEOv " 𘋰[As\n2 ]cc`T:)GkV<Un]:1?{gX;/ S;Ģ?լP^,+PL8c~%N9QլP^,+Pw:~%= 9w#k :J/)*>@CKd+V,Z->X OGňPB (PB (PB (PCFNdcfF&BBE8T>}A;TSSϟ%>|* ŅjVAxCE* Ņj "L, YeYeEhaYYeY`&>,eYe, YYeYeEl,,V-,,YZŊLy>J 9Ql<5ğዿ<9?*vk<5)΂/ )Zտa$N{Nt-xZ6fԑ楯O5Ў;KJĆmJep[\o-(}!ɑ`ȳ|x|O)?L JŊZ/s!BN4łEKU,mP\ ƢƋS¥KՊT^*.PV*PRw bEdEahZ- GEbpfVi@ܹF&*xbKxN#('H8"܄{$^ #"Nx5tþ&"sAs\n]p18s;Ns;Y[c*k)t*UnαJŋ?α?_Xpc:~wP^3J#9 rģ82 rģq(G+Rqb q(w1?k;c\9# k*XJ/)*>@CKd+V,Z->X OGŨPB (PB (PB (PCFNdcfF&BBE8T>}A;TSSϟ%>|Ԯ,X\kU\XKEVVqb-Jŋ, )VbP֎Vqb ]JŊZ/rk*X(RqbKbXeYe`Z+@eYdV @X,!`X Ea`Z}YYeYeEl,,V-,,+Ddʷ<}%#`4B7=ዿ|9H|쒧i־as`BJVo X x̄_W! \Έ7^izh?kڠ>i@/@ǩL^4O5hP|66P LP&}P^Qz뷚7jtiO^y (>AbCRLp ^y"Z>!ɑ"Bm@^Swo(| @lհL6PC#T }<^6>P ڌhMAM>!ɑϾ<`@PU!ɑƑzE7ЛB M>$925@@E7ɍMox/xuCj R.}&P}^jn{Hrdjys@(| vgEך=]5y J@$925x/^y5hP|6`L6P&F>(E7ɍMox/xuCh$925$\MGyCh&Fg4 LP&}P6j/@vP%FHs!ɑƑzE7ЛB&3Hrdj3XQ{kchbSw4hoPE C#REϾڀ*LSwo(|"i!ɑalhgEbzo^5x@`q>@ԑs6&}S d7i:|.}&P|Moy!ɑalLP&}Sç" 7/jRFBm eLP&}S'{@;> $925x/^y5hP|6`M>L览^j/yvLm ^jn{Ƒ{í!ɑ"Bm@57yz%Hrdjys@(|hgEj/@vP:HsiL^4קj/yv P&RLE7ɍMox/xuC<0HrdjHЛPAН7P&Fg4 xLgE!j/@vPBd҇xiO^y (>M>$925@HW^y"Z>925$\MKMoy$925l<9M>VgE!#ywECW )08`ԑs6&}P!^y"Z>Bԑs6 57y925l<9M> !ɑϾ^;׃}!P<)LI>hgE J^j/yvLm ^jn{Ƒ{íG)LI>j>:nSwo(|AC#V3C!ɑϾzo^5x@4(|ALI>hgE o#]C^@;}t&F} T57yt4&Fg4 t L"'zo^5x@&4(|F LI>hgE 5F&6/57yHրv-HrdjHЛPA7P C#V3C:LrQz^ 4080925$\M$ }#VQ{kchbSw4hoP$925$\MzSwo(| )L[4heLP&}P޼5i ^"e&HrdjHЛDH>);y511yE(| ;HrdjHЛPA7P@^հL6PAC#T }޼5i ^(`q> $925$\M$ }E7ɍMox/xuC9C#REϾڀ*57yr925l<9M>JC#T }|^;׃}!^<&F} D3y511yE(|"!ɑ"Bm@jn{C&Fg4 +Hrdj3^;׃}! `L2 `ԑs6&}S d7i:|R.}&P|>2y7>925l<9M>925@N^;׃}!`<!ɑ"Bm LJ^j/yvLm ^jn{Ƒ{í!ɑ"Bm@57yp&Fg4 p1Hrdj3^j/@Q{Ɛ0yC8LI>hgE`:y511yE(|/HrdjHЛPA7P FհL6P C#T }O5yHj&4(| LI>hgE`HQ{kchbSw4hoP ԇ&F} Tjn{925l<9M>p!ɑϾ^j/@Q{ƐR<!ɑ"Bm Lo5F&6/57yHրv!ɑ"Bm@7P )L[4heć&F>,m&&d#z- ޳$& u-NTң,u`̄_W! %LWL׆cm{T(Ew>ZIL^o#]6az6PCC#T }'=]PΔ>iO^y (>4 LGo#]C^@;}!ɑ"Bm@'yC #Hrdjys@(|LP&}VcƑzMn@v &9C#T }= 9C#W"o#]6bC& LP&}V5F&6/51yHրv$925$\M/7Pȝ!ɑal8gE/5yI0yC5&F} D3ռ^y"Z>P!ɑ"Bm@51yjhհL6P KL 逴z3ziO^y (>hP&]ć&F>-[E7ɍL^ox/xuC .}&P|y7>!ɑal2D&F>,m%d#z`- ޳$}IJ:TjɓX1Rə 6 bB ^/jn ǰx P&׵@|ҁy^q!Cd!ɑƓuFBm e2C#T }%#ywECW 0yCd%HrdjHЛDH>(Hj/yvLm ^jn{Ƒ{í R.}&P|ךyC3 C#V3C3 L!E׮j܁{T(s!ɑƑzE7ЛBF P&D&F>(H-y511yE(|`!ɑ"Bm@zSwo(| !ɑal&F>(Fj/@vP+ڌJ #Hrdj^>Q{k&РlT LE7ɍMox/xuC R.}&P|57yRi& HgEď5{^yjqJX iO^y (> jC#T }^y"Z>nԑs6 1y7>C#V3C 925@H j/@vPEFHs,LHz}hMA$3@(|`BgE ^y"Z> 925$\M$57ydi&LE׮jLJC2iL^4קj/yv @j6P !ɑϾ>0y511yE(|@Hԑs6 =y7>! C#V3C1C#T }zQz^ 40yC1 LI>hgE: j/yvLm ^jn{Ƒ{íR.}&P|WyC1PհL6P C&F>){E׮j(^ԩt"C#W"o#]6`(@(|,$925@X/5F&6/57yHրv*HrdjHЛPAJ7P&Fg4 &F>+<^z桫^lw:P^Hz}hMA% M> RL<^y"Z> R.}&P|Swo(| !ɑal LP&}XxQz뷚7/jΔ>@Hz}hMA% &Hrdj3ռ^y"Z>&F} TMoy i&t&F>,m&&d#z- ޳$%-NTңV4T`.2l=|A^Ą4;\Έ1^i3^^=t P4^izHP?C#W&+51yv Pv6P?i!ɑϾ>fQz뷚޽҇&Hrdj^>Q{k&Рl$ Hrdj3^y"Z>!ɑ"Bm@$/51y925l<9M>&F>)޼5i7x@&4(|?0HrdjHЛDH>)wo#]C^@;}!ɑ"Bm@$o51yBհL6P~925@NQz뷚܅{QCL^4קj/yv Q M>@gE`<^y"Z>(ԑs6 ךyC Ri&L'ywEM"$eBԑs6&}V j/yvLm ^jb{Ƒ{í!ɑ"Bm@&51y925l<9M>u!ɑϾj/@vSwDw:P|D&FE5FBm !C`gEy511yE(|>925$\MHrdjys@(| @hgEMĴ̄|x|OLdA[Tĩ*mX\JVy 6 bB DKژ4 /KP/4=a$(| C&FLWjby (> 925@XNQz뷚޽҇ń&FE5FBm  LP&}V5F&6/51yHրv0HrdjHЛPA/7P&Fg4 2Hrdj3×zo^@<0&HrdjHЛDH>-[E7ɍL^ox/xuC`925$\MB/7Pz&Fg4 925@d(o1-3!hf&xF(N'q*DdF#uc7 F*]X9N?|"bB %KWKkǷWjv %ejC#T }2yhr!Hrdjz}楯7ЛBᰄl@rgEM'GLJd6?(IJ:Qhŭd'GXW! K%z۫LW@FBm C gEj$(|QC#W%5-yv !C C#T }B6?b63!FoYg }-NTҍG+BPn`~E^Ą4.DKږ4/ ׏n/51y{TJi-^ykk&Рl!eć&F>,mp<>'޳$0@}-NTң,`~E^Ą4;\Έ1^i3^^=t P/j/>i4@!ɑƓFBm l&F>,䋲cisPi7x@z`L2^.}&Ͼ<( ^C/F^o^Mn@" mp ^bZfB><>'gI`#c`u-NTң,*h2,ؐwå{RZ/7jC$925xZ>RכhMAlzD&F>,mp<>'޳$0@[TĩFXJw LN?|"bB %KWKkǷWjv M> L豓P {@;> i-^ykk&РlyC u!ɑϾ!@\O1#73lP:'q*DdQ Z2l=|A^Ą4.DK^ԵyxoV{ux1yڠ@w:P!ɑƒFBm Ǔ M>$925@aP/k>`WeSbAq`TGǃ7[hYj-:-2,1EeHX0EEhbYY",(E|6,dT925xZ>RכhMA=@(|RL dR3zP&C#T }E HtH>Lm"Ĉ4X e&&F>,mp<>'޳$0Bw;R#'J9z#WZtnfBtx{Nt/jZ\7^=?P {@;(|0!Hrdjz}楯7ЛBB6P rgE/5@uck/5.&65.D",(E|6aC, L dR3z<>'gI`#c`u-NTғ:TYsd'GXW! K%z۫L^o^҇$925xZ>RכhMA RL dR3z,mp<>'޳$0A [TĩFhKKʔٙ UHCA;{S5x7@^zJX@; @(Hrdjz}/7ЛBᰈlt925@fo57$]KjI;`q> $\M$ }0yP<м 2!ɑP޽܁{SrEgjĴ̄|x|OL3zRכhMADM>C#T }B6?b63!FoYg -NTңVLbeԧpfBtx{Nt/jZ\7^=?P {@;(|!C#W%5-yv @l!ɑϾ!@\O1#73l qKj"2tՓ'tL:fBtx{Np?:"^yxoyx:^&׵@^҅BRRi1^yk&Рl"eLP&}YMd皡xnexs6&}X/7i@oB0@ ڠy7$]6|MKLGLJ73l~ IJ:TjƊPnTYs2,ؐwå{RZ/7jCiL^4OԵ5hP|6(eC#T }B6?b63!FoYg -NTңV4T`N̄ *$!p?:"^ԵyxoV{ux1yڠ@w:P9L^4OԵ5hP|6:C#Hrdj3P&Fd#yH?LdIJ:TjƊq#PخfBtx{Nt/jZ\7^=?P {@;(|C#W%5-yv  N!ɑϾ!@\O1#73lB'q*DdQ*0uĎ:Cbə UHCA;~tDjIrޭxbS׵@t!ɑƒFBm pl6P ,gEM'GLJd6?!qKj"2tՍ:GXfBtx{Nt/jZ\7^=?P {@;(|!ɑƒFBm plp&F>,mp<>'޳$0A [TĩFh8 fd'GXW! K%z۫L^o^҇Ri-^ykk&РlT Hrdj3˞j{Y"GNE5.BH dXH#El 3x7@(|<C#T }B6?b63!FoYg}-NTңV4T`Cna $!p?:"\%z۫L^o^҇!Hrdjz}楯7ЛBP&9Hrdj3׼舘5mʛ 'RכhMA&M>=C#T }\T X&6,mp<>'޳$0D)mRwFNcGU$P3!:<h'|:\Έ-^i.^կ^^jbz=Δ>Hrdjz}楯7ЛBL &LP&}Y 2ȳ|x|O)gI`#c,Rڤ%H)SjƎHюfBtx{Nt/jZ\7^=?P {@;(|a!ɑƒFBm 0v6P6PgEM'GLJd6?qKj"2tMHш\J UHCA;{S5x7@^zJX@; 925xb>ShMA&P&925@fo57$]KjI;`q>>hgEjb{Ɣ/ .H^o^Mn@" mp ^bZfB><>'gI`#c`-NTҕ6.TISEes2l=|A^Ą4.DK^ԵyxoV{ux1yڠ@w:P @8IjK^o#]6`A@(| LP&}YP/k>&qCg}Ă0* 7`TGǃ7Ϣ"(z-,Z>$EO13C)LP&}Y Fd#yH_FoYgl~Rڤ%H)SjJT]i9 UHCA;~tDjIrޭxbS׵@tjC#W%5-yv b ZgEM'GLJd6?8IJ:RՅʔ*mKd'GXW! K%z۫L^o^҇7Hrdjz}楯7ЛBᰌ1@(| G)LP&}Y 2ȳ|x|O)gI`#c,;R#'JTڰR#G U,vfBtx{Np?:"^yxoyx:^&׵@^҅BH L^4O5hP|6M>@925@fo57$]KjI;`q> >hgEjb{Ɣ/ A!ɑP޽܁{SrEgjĴ̄|x|OL3z(,ZL"7n!#]`(> O4#p!@(|$925@Dd zTP-Hrdje`ly (> e&F>(< ^iO7>x!ɑalHrdj3cP/iO7/j/#]AEڠyݹ  PQyq  LQx5Ӥa!KEĄx$< SpoC"LB js6j/yvLmAi&RL0W Ee LP&}Q4'( 2 &yj2EiO7/j2y{TDkchvTKڠy#v$k&3Q۞#] &6> 7$%C \tHf xv'& RL0TELW)#]6BH^jBT&Fg4 B`gE kJW*xсízy,(> "C!925@BbaƔkBB<׵ QbGaچ/5 WɍeP &Fg4 2C#T }24`l^B R !ɑϾ<43\&XnFr,HL"y{R皗/jZF&6皖j楦HhMЛD5-pjs6jZy"- (jRכ8NհL6Pq!ɑϾ"Zhֽ(.y $925^܍v- :<C#V3C i!ɑϾxڂǍ<:קaA@(|&F>)0J5̡Bm!Ejkچ#0eCGگ#]AWjېЛE5^nBFBmILW I>ho$]EP|CGy!ɑal925@D%O5 W06xuO aA4 >LP&}QDP65@r5Az,HL"y{P^P^vLm5j棳v$k&CGf$k&3GcNP zQٸq!* C0`|#<6PgE!1y5!ɑ"Bmi&0iLP&}R^jj 4`l^"ƒM>` L(CyL!0J5̡Bm!EjkڃXDq2{PrF&6jW@PrgYH08@HrdjHЛDH>(F aA &F>(FDP65@r5A,HL"y{PxPx;#]F5kڠy;xсì>08,)LI>hgEȰl lVgE ^iOPe i ,LT7#^=EiO7/j=^ɍP<h|@P=awCJC#REϾ"@H aAL&@(|!ɑϾ@DP65@r5DXDq2DA0y>^Aƌ g X@P1 LI>hgEaALlb925@G0J5̡Bm!Ejkڄ$XDq2 {PF&6jW@PgY/@ޘeJԑs6&}Q,(> M> D)LP&}Q4'( 2 &yjbGaڄGEB0yC^Bƌ g X@P@4ԑs6&}S et2Hrdj3 ^iOPe i ,LT7#^"ď4'5ڈ$kch j h|@=awC$925$\M$ }P `lLP&}SaƔkBB<״,HL"y{L< bF&6iiƌ g $X@PrC#REϾ"@X"ƒᰘM>$925@X-yhgE"ƒ M>P!ɑϾ@L"yNHl<!:C!ɑϾ!@y>dBqIJ:Te.a $! xo^{ 栰vLm.yr5h$k!6jn;nxtHLm@|6jnnHJAs%7 O M><925@G,ZSsv5  ^jnnD(e925@GP&舡`T&FCU7ЛB&Hrdj3yC!ɑhMШ>Mo(|4հL6P0HgE:j{SwɍP<^n܄v(yݸv&yvcj^j/7$%C \tHf xv'&(Hrdj3.y^&Fڡ$\Mo$]EP|j/y^ i&C#T }Wl925@`Pe i ,LT7#^1Ejnq2CFkcheP`> <M> Hrdj3P&bbfB><>'?LЍ u;NTғ:1Rə 6 bB yp?:"^5^ixx ׇ栴vLm.yjn܄v(yjnBFh桨5!1j\.:$3MB;eHrdj3&E^jLm B6Pn&F>)"=>$925xO9yv RC!Hrdj3'C#UPЛEP|5y Ri&!ɑϾ> j{PeEkcj׵@Q{Ɛ@ޘe*ԑs6&}QXP|6 n$925@G<5xҀs(PHQbgyX桫ڌj0^ j{T5Bn܄v(yv5hGm&6>dT&Ąx$< SpoCLAcP>&Fڢ$\MyvLmA ^jc&Fg4 fLE5DHr^@ "M> LHji@f(M(3P<܍{RX桫ڕ<ԩ{R51`RP<ԥHr> HP=awC!ɑ"Bm LƒNF6P' LP&}V ji@f(M(3P<܍{P$yjq2CFkch>y{T5!#]6j67n!#]6j6$925@aFpLWLHЛF5,m&d#{Z=|AgI:FCmRwFNd TrfBtx +ؐw\ΈWB*݊ ^jId皈&HhM&$k!6j ۞#]P DpBT< D`)7GaylZ&F>( Qbך&$kE`B} qM> E)LP&}P6k> @C#W!^y^o#]6`B2@(|925@@ء C!ɑhMШ>!D  L[4heć&F>)^n&^^F&6y{T5h 08 0HrdjHЛDH>)X liLP&}Sj i@f(M(3P<܍{Q,HQeF5/jvLm5B7nBFBm< q  LT#NP rT&Ąx$< SpoC&F>((Hj i@f(M(3P<܍{WQbG/7/j]^Yj{T5Vn܄v(yv5hm&6>PUfĄx$< SpoCC#T }$#y6ԇ&Fژ.}&уUH&6BO5VyC L[4hel LP&}P{S7!xuO"ƒ M>L ƔkBB<׵"ď5^n&^tQɍ/j!#]6jq  LWm&6>jWÉ PH.x! 4&F>)Dyh7Hrdj"Bm<dhT9y7>!ɑal JC#T }{PX/dXP|66P*C#T } ƔkBB<׵ bG/7/j<4^y0yP<{ƌ:ψz`q>!ɑ"Bm L  2CL ƔkBB<׵#D5چkch>yjHhM$k&3CQskIBĄx$< SpoCX4&F>(CRLW.}&уCWdhT5 ^o(| C#V3CX&F>)vQF^k„XP|6 &ƒLGo5^43\&XnF2Ej L2y2^9#]ACP<97nBFBm<97n!#]6j۞#]:Lm@|6 CpBT< D`)7Gayl !ɑϾDyrPCt&FڇD} `PE1Z@>yryC i&925@X5o0B^,(> l T&F>+5^43\&XnF5Ej L5y5^ɍ{T5HhMCv5hvcj<\.:$3MB;e`!ɑϾj zC#UCEϾ0y4yvLmAj o(| Hrdjys@(|HgE;^ eC#T } rEA\P|6ZQM> LP&}Y B z3z+ILW@FBmARC!ɑalA*C#T }=yCɍP<^n܄v(yݸv&yvcjRpBT< D`)7Gayl u!ɑϾ@6y i!ɑI>hdhT%5PHrdjys@(|Hrdj3^j{QƐh^E` M>q:C#T }|9xҀs(PHQbgy$Xڌj2^0y%P<Ɛh> H=awCC#REϾ"@GʑaA)eXLP&}Q5^43\&XnFR,HPeJjTIjR!#]6jRnBFBm<ԤvcjRjRnHJAs%7 O M> !ɑϾt<ԤX&Fڍ>h/7.ɍШ>" jRyC!ɑalX LE5/ji(lDlX$925@N<9xҀs(PHQbgybG/7/j׵LF&6j{T5L<:ψ (|?HrdjHЛDH>+谠lDl925@X.yrP65@r5KbG/7/j\RKHd|RP<Դݹ  PRv5h楣NP o5-7$%C \tHf xv'&925@aKJ4HrdjEϾ0yk䋲ch*K^o(| TհL6P!ɑϾ-y]x kĈlD& 925@hj'$]ЂlPPM>`Hrdj3P&bz3z2^nHJAs%7 O M>n925@X<^P!ɑI>hdhT2j/y 9Hrdjys@(|~gEbT+ڌ4:קaAN"@(|LvS( 2 &yj2Ejbq2'DF&6j{T5D|@ zL25!ɑ"Bm L貤XP|6@(|!Hrdj3<9" (> ӼM>l4&F>,m%d#z`- ޳$} 'Nj"2t.d'Gzh'|:\Έ-^i.^կ^^j\H&6jZn܄v&yh5cjᰝ{KMÉ PH.x! ́ C#T }Դ`!ɑhMШ>GP+C#V3CiLP&}X4OMlfB><>'hf&xF6;R#'J58̄_W! K%z۫Kd皖!#]6jZnBFBm<ԴvHLm@|6ך\.:$3MB;efgEDX楦$kchljZnD(eBgEjZP7Hrdj5h*/5-yѢC#V3C&F>,^WIdН $Hrdj(|t925xb>6RdӸڤ%H(r/+61 6 bB %KWKkǷW.ɍ5-7nBFBm<Դݸv&yh5Ӥ`F楦Ąx$< SpoC뀥!ɑϾ-yiq (>5o5-7" "C#T }&C넩L^4O5hP|6fe!ɑϾ5-(|LW@HЛF5-yvLmA# ^jZyC!ɑalP $925@bך^^ֽ>Udch4^@ȳ|x|O)?LЍ`>'q*DdQ YN{Nt/jZ\7^=?ԸvLm.yir5h楦$k!6jZ;nxtHLm@|6`楦Ąx$< SpoCHrdj3HԴݸuchlך C恂C#T } ԴBd&Fڠ#]6BGP!ɑal@8gEO5@kڠ$]CD zBP`IL^o#]6`" M>RL豳PFd#yH_FoYgl~<6;R#'J N{Nt/jZ\7^=?ԸvLm.yir5h楦$k&3KGm&6>/5-7$%C \tHf xv'& ,gEbԴݸvLm KMÈl LP&}X:@dL^4O5hP|6$e`!ɑϾ5-(|3js6jZy"- "VRכ925l<9M>Cԇ&F>,ZT ڋ4:קjvLm<ƕko1 Z=|AgI:qIJ:Teԧp̄_W! K%z۫KdѳKMېЛD5-f&FMקjny (> P&3D&F>+jbPHrdjEϾ0y䋲ch*€/7>d&F3C@+Hrdj3P/j/xn^yċch4>T ϶kx5mʛ '<PN&3- ޲ QnբˑeȰ6E"Qc$Z$X/EEQgd4XP}ށl !ɑϾ!@yi Cw ?LFF*wTĩFXT9V̄_W! K%z۫Kd皖!#]6jZnBFBm<Դvcjᰠ楦Ąx$< SpoC925@Xů5-7n!#]EaAKMÈl Lt5H !ɑƓFBm €X6PLP&}X,yiC㓄&Fڠ$\MH&6BP ^jZyC L[4heC&F>,ZT ڋ4:קjvLm<ƕko1 Z=|AgI:H'q*DdQ$t3!:<HCA;~tDjIrޭxbRE1lRv$k&3KGmP 楦Ąx$< SpoC-$925@aKJ1H{Tk&hT K^o(|925l<9M>bRL3PyC$925^"Bm Li&-$925@f5@Iíz}.ɍGxP/k$]`dI;d",H#El &oeLP&}Y KLGLJZ=|AgI:qIJ:Te)Ӧ s2l=|A^Ą4;\Έ1^i3^^=w.ɍ517nBFBm<ݸv&y5ӤaH/yq!* C0`|#<6P LP&}V bךɍᰤ8P&tILP&}V@&FMקjny (> BCY!ɑϾ51(}C#UP.}&уL^o$]EP|)51yQ925l<9M>&Hrdj3j{Q{ƓwZ^$]D5@^H1NBwGɍDXF">Po@6P925@d(o1-3!hf&xFX Nj"2tn,Ӧ y 6 bB %KWKkǷW.ɍ5-7nBFBm<Դݸu&3KGm F0yiq!* C0`|#<6P925@X$E^jZnBF1P|62皖 Ct&F>,AyiC,{Tk&hT楯7>!ɑalHrdj3ç^ԵeP.ɍ=!(}`$925xb>ShMAhea!ɑϾ<Ɠ z`q>2EϾ"@d51yrL^jkڠ$]6} GLJ- ޳$ymRwFNҦ˜3!:<HCA;~tDjIrޭxbRE1楦HhMЛD5-=yiqM>$925@`k>L^4O5hP|606PLXR҇Հ=!ɑ >h楯7.ɍШ>e楯7>NհL6P8gE^j{Q{ƓZU.ɍGxҭz}m#c2< G#73B6?`9ڤ%H)3NfBtx +ؐwå{RZċch楦HhMg۞#] &6>0(yiq!* C0`|#<6P<gE/5-(}S LW@FBmA<ԵԇL[4heRC#T }&y&+o1 Z=|AgI:"Bt6;R#'JLIhi2tZ3!:<HCA;{S5x7y"\Sv$k&CLMۈHhMg۞#]:Lm@|6asLMÉ PH.x! &F>+X&$kchl&B6PxL &CHrdjz}7ЛBCLP&}X;yCHrdjEϾ0y䋲ch*0@x7@(|$925@d(o1-3!hf&xF( Nj"2tՁ:)2l=|A^Ą4.DKږ4/ ׏n/5.$]KjZn܄v(yiq  LRskIb'\.:$3MB;eC#T },ZRv51P|6#@Rp!@(|p&F>, Ma&FLWjby (> M>8zC#T } jZPLW@HЛF5-yvLmAwP$925l<9M> vgE^j{Q{ƓZU.ɍGxҭz}m#c2< G#73B6?`96;R#'JXƌ **s2l=|A^Ą4.DKږ4/ ׏n/5.$]KjZn܄v(yiq  LRskIc\.:$3MB;eC#T },ZRv51P|6#o5-7" !ɑϾHX@C#W&+51yv C)LP&}X,yiCHrdjEϾ0yk䋲ch*K^o(}@&Hrdjys@(}@!ɑϾ&/$]D5@ZFd#yH_FoYgl~s)mRwFN-/*P^fd'Gzh'|:\Έ-^i.^կ^^j\H&6<Դݹ  PRv5D5-%楦Ąx$< SpoCy!ɑϾ",ZRv5 <Դ8P&LP&}XR҇*Hrdj5h*K^o(|n&Fg4 LP&}XtT ږLE14@%$925xb>ShMA P&$925@cgxbzL2FHЛDH>,/7n@P<܍{T&Ϻ6Rd };NTңVL:¦˜3!:<HCA;~tDjIrޭxbRE1楦HhMЛD5- x6PC#T } jZPHrdjEϾ0yk䋲ch*<Ե&Fg4 FgE^j{Q{ƓZU.ɍGxҭz}m#c2< G#73B6?`96;R#'JY2qQ#R 6 bB %KWKkǷW.ɍ5-7nBFBm<Դݸv&yh5Ӥ`$5-7$%C \tHf xv'&Nԇ&F>+X楦$kchl 5-7" ӈRLt5H lL^4O5hP|6 BC#T } jZP`!HrdjEϾ0yk䋲ch*!SK^o(}VհL6PaC#T }-yEL^k5VH&6jJ GLJ- ޳$ mRwFNd.IYN{Nt/jZ\7^=?ԸvLm.yir5h楦$k!6jZ;nxtHLm@|6/5-7$%C \tHf xv'&+i!ɑϾ",ZRv5 $^jZnD(eT&F>,AyiC`!ɑhMШ>K^o(}925l<9M> RL-y{Tchh5HJh)L^4O5hP|6CY!ɑϾ<Ɠ z`q>EϾ"@d51yrL^jkڠ$]6} GLJ- ޳$y)mRwFNT)4V\̄_W! K%z۫Kd皖!#]6jZnBFBm<Դvcj$5-7$%C \tHf xv'&L)LP&}V(kKMۈHdA E5-7" "C#T }&C鄩L^4O5hP|6T(eC#T } jZPP925^"Bm<ԵE1ZJRRכJ i&J&F>,ZT ڋ4:קjvLm<ƕko1 Z=|AgI:qIJ:TjƊqb5)1a $!p?:"^ԵyxoV{ux1yq"\Rv$k&CKMۈHhMg۞#]:Lm@|6Uo5-7$%C \tHf xv'&+Hrdj3E^jZnBF&6J;yiqM> 925@`k> !ɑƓFBm J P&!ɑϾ5-(| @!ɑ >h楯7.ɍШ>PtRכ$925l<9M> #Hrdj3ů5@Iíz}d#P6Rd wTĩFh8 d'Gzh'|:\Έ-^i.^կ^^j\H&6<Դݹ  PRv5h楣NP !<Դ8q!0>Jn @@(|1C#T },ZRv51P|6$ jZnD(e#&F>, Mai1^yk&РlHl-Hrdj3cKJ E)LW@HЛF5-yvLmA"'P9Hrdjys@(|@!ɑϾ&/$]D5@ZFd#yH_FoYgl~s)mRwFN\H6,a $!p?:"^ԵyxoV{ux1yq"\Rv$k&CKMۈHhMg۞#]:Lm@|6$-yiq!* C0`|#<6P@ZgEbԴݸvLm W C Lt5H Ri1^yk&РlH &ILP&}X,yiCH{T} `RכdhT5-y C#V3C925@bך^^ֽ>Udch4^@ȳ|x|O)?LЍ`;NTңV4T`ub© 6 bB %KWKkǷW.ɍ5-7nBFBm<Դݸv&yh5ӤbA楦Ąx$< SpoC`4Hrdj3E^jZnBF&6LRp!@(|l&F>, Ma Hrdjz}/7ЛB%>6PLP&}X,yiCc&Fڠ$\MH&6Byk)L[4heiLP&}Xi1xuOY"$y*ק&b63!@z3z+ bךɍ%517" 8 L@p925xn>SwhMA(ep$925@a %p$925^"BmPxo@6P`&F>,m%d#z`- ޳$Ӹڤ%H*5cEFT9V 6 ؐwk/׵1^i3^^=w.ɍ517nBFBm<ݸv&y5Ӥ`J^jbnHJAs%7 O M>T4&F>+kLMۈHdAؔ&B6PPRL Maʀ8IMo#]6bQCF LP&}V51(|&Fڠ$\MH&6BlJTS*925l&*&F>,&H&6jK5@oF"&qCg}Ă0* 6 q1hfZYJ,dD"Тj,,F">o@6PBC#T }B62=0Ad΋`;NTңV4T`+:a $!p?:"^ԵyxoV{ux1yq"\Rv$k&CKMۈHhMg۞#]:Lm@|6%5-7$%C \tHf xv'&U!ɑϾ-yiq (> C@!ɑϾHX@Ri1^yk&РlJ&&F>,<Դ LW@HЛF5-yvLmA(Cyk<iL[4he<LP&}Xi1xuOY"$y*ק&b63!@z3zSwhMATM>RLgE7>R Rjs6jby"- QsL^o(|/D&Fg4 925@aP/j/xn^yċch4>T X&6<>'?LЍΈ;NTҕ6hbấ-/3!:<HCA;~tDjIrޭxbRE1楦HhMЛD5-  aC#T } jZP@$925^"Bm<ԵE1Z^jZyCL[4heC#T }-yEL^k5VH&6jJ GLJ- ޳$&Nj"2tM:"9 6 bB %KWKkǷW.ɍ5-7nBFBm<Դݸv&yh5Ӥc⇚\.:$3MB;eC#T },ZRv51P|6>2yiqM>2 Lt5H A!ɑƓFBm ӠM>2925@`楥!ɑ >h楯7.ɍШ>>K^o(|L[4he!ɑϾ&/$]D5@ZFd#yH_FoYgl~s'qIJ:RՍT̄_W! K%z۫Kd皖!#]6jZnBFBm<Դvcj5-7$%C \tHf xv'&p LQbךɍjRp!@(|Hrdj3= (|!ɑƓFBm C&F>,<Դ#HrdjEϾ0yk䋲ch*5-y&Fg4 925@bך^^ֽ>Udch4^@ȳ|x|O)?LЍ`y;NTҕ6#F!r*fd'Gzh'|:\Έ-^i.^կ^^j\H&6<Դݹ  PRv5D5- 5-7$%C \tHf xv'&DLP&}V bךLm d5-7" !ɑϾ^jZP 925^ Z´O5-y@Hrdjys@(}C#T }<7/jvLm & CIL^o#]6aYjC耑!ɑϾ<Ɠ z`q>x >hgE<1yjvP&b63!@z3zT ϶k\PY| q3Ͱ03LfZ><e}0EEhbYY",(E|67z Hrdj3P&bZfB><>'3z<>H Nj"2tM )R5u\d'Gzh'|:\Έ-^i.^կ^^j\H&6<Դݹ  PRv5h楣NP ;KMÉ PH.x! Hrdj3E^jZnBF&6O5-7" Lt5H =!ɑƓFBm  HgEǚ>0LW@HЛF5-yvLmA楯7>!ɑaliLP&}Xi1xuOY"$y*ק&b63!@z3z+X楦$kchl,O5-7" ,gE z@P9C#W&+51yv ltLP&}X,yiCjC#UP.}&уK^o$]EP|,^jZyC&Fg4 ɀrgE^j{Q{ƓZU.ɍGxҭz}m#c2< G#73B6?`96;R#'JTڰR#G U,vfBtx +ؐwå{RZċcisKMېЛE5-7n!#]a LRskBcjTԴ8q!0>Jn @@(} L"ů5-7n!#]`(>C C@BgE/5-(}n{Tk&hTIjZyCMi&B^gEO5@kڠ$]CD zBP925xb>ShMA*yl y!ɑϾ<Ɠ z`q>.}&Ͼ$yې/jbT7#^" MlfB><>'hf&xFN'q*DdF#uc7 J+.s3!:<HCA;{S5x7y"\Sv$k&CLMۈHhMg۞#]:Lm@|6 8q!0>Jn @@(| bgE`tݸvLm jSp!@(| @gE`k> L^4O5hP|6 CL$925@X<ġ&&Fڠ$\MH&6B*/51y&L[4he0!Hrdj3P/j/xn^yċch4>T Gɍ/5./5.Lm>Y"ci,(ytd1'EDY,Pdl-!x7@(|L 逴z3z<>'gI8TңV4T`.NA;(<>'gI8Tҕ6.THK32Nv%F5/jvB d^jaC#W(&ק<>'gI,XR#'J1nZ1Rə h'|;^g@FBm!Ej6(|+&F1DfB><>'gI1)bJ:Te3LNA;( QJ $]D5@P&/HrdjT7 ^" FdL^b̄|x|OB3z=aHXFNaSEefd'G{Kڍj6^ $yءh Rf&ząq*DdQ#R̄4b{QFڠ#]6ď5>-C#W3!Ќ޳$Xcc%H*2¡ʷ9 h'|;^g@FBm!Ej6(|Zf&zbŎ8"2t:`fBtx ױDePЛHQbG @(GLJ#738Tң,&N^H֝0ZfBtx ױDePЛHQbG )L^b̄|x|OB3z=a`xc%H*2[ٙ h'|;^g@FBm!E7.ɍgyvLm jTch a!ɑP<܁{T&χO5>, f&zØc%H)3M9wõQ/j6y{Tk&Xbł&F1DfB><>'gI0:XFNeԧp̄4b{QFڠ#]6ď5>+ f&zbJ:TjRTd'G{Kڍj6^ $yءX&HrdjFd#zd Cŋq*DdQ8XсsEC) h'|;^g@FBm!Ej6(| f&zbJ:TjƎ4A{d'G{Kڍj6^ bT ڠLH&6jE1(yЅJ $]D5@P*C#Wy hMj6(|Td&F1DfB><>'gI&,XR#'JY2t +.s3!:< kآ^lQhM(#FZC#W3!Ќ޳$Xc ,XR#'JY2qQ#RfBtx ױDePЛHQbG&F1DfB><>'gI0BXFNd.IY3!:< kآ^lQhM(^fE1lT7.ɍCP @!ɑQFoYg1 ,qĩFh8 h'|;^g@FBm!Ej6(|L^b̄|x|OB3z=a`c%H*5cEFV(lYNA;(<>'gI0@XFN\H6-d'G{Kڍj6^ $yء%C#W3!Ќ޳$Xcc%H*5cEFT9VfBtx ױDePЛHQbGQZC#W3!Ќ޳$Xc,XR#'JXQT꩙ h'|;^g@FBm!Ej6(|&F1DfB><>'gI0,XR#'JXQ d'G{Kڍj6^ $yءH&F1DfB><>'gI0c%H)SjƎ&.X̄4b{QFڠ#]6ď5>3HrdjFd#zd Cq*DdJV4uRE LNA;(<>'gI8Tҕ6.TISEeLNA;(Tch 1C#Wy hMj6(|)L^b̄|x|OB3z=a,qĩՌP7-*h2Nv%F5/jvB>>=}>}00001a^"}Hx}rh@zh@} }G->j'->iK>hC-L|K|| B,1>1#}bHk E P1>1DdĥSg)| > > =}X+/+o+_|>ox=}=}>| `0_p1$# Jp1 p1- ^`bb 11 A |$[pel>O4,>|a;Lp|"OF_X>*l`ì/-sg.L?A ?)p?{f~ :k?X~ L?#p~2~x?7i?8?@E U@.X@_[ < \@!6 3L@xma"7{RBc8{8{H p{9aPC=|L=-#`_°@U& AA~,=_<"=!aqF p@A^g_OU aFCB= { 7a+1 p\=ha{~O`&_džx{9*ad03p4{=a._ðxC& 8-6@0 B&@1{tap ED{';*<+ L1 ={8{l=װ Bp; a{e`ZcE!c$c5IeKE ZV,R$ӬqjE̊a(ZJ,>|*̲T| VH ϒ B$FU250RR!c'łiq FL@bՃs*eQc%X9#Rs*eQc%X9і Tr[IZd`2)[ -mc*uCE&Ӫ)d}A`ŭ2U2^z`K,F)ms"rs*eQc%X9*]X9dp20qKn 02U2^zFX1R%m'ek[p\ȥo,u`咶-.dRV'NūYPC.P6PK%(.[,)-&NcVT`*/pRϣ,u`咶-.dR'/PjN-2U2^zFX1R%m'ek[p\ȥo, ոjN-2U2^z2VY+i;+\ RۂE+}`K,F)ms"bՃJN#๑JFX1R%m'ek[p\ȥo,u`咶-.dRі Tr[IZd`2)[*]X9dp20qKn e.VvV8̊V2VY+i;+\ RۂE+}`K,F)ms"bՃJN#๑JFX1R%m'ek[p\ȥo,u`咶-.dRі Tr[IZd`2)[ΌTr.eQ,dK;N,F;"U:ʢK/TsΌTr[IZd`2)[:RZ9ZL:eBh@uB,4nӥ%Ӭqjs*eQc%X9gF*]X9dp20qKn gF*]X9dp20qKn jɓX1RȹF ,Փ'NbՃJN#๑JP8KNሹF ,jɓX1R%m'ek[p\ȥoVL:VY+i;+\ RۂE+}Bd.IX.eQ,dK4jɓX1R%m'ek[p\ȥoV4T`.T`*/pR\u`咶-.dRV4T`NሹF ,jƊpbՃJN#๑JޡXQ$qՊT`*/pRFh*]X9dp20qKn :GX`F ,jƊpbՃJN#๑JޡXQ$qՊ ̪0uE^`V4T`.VvV8̊V Ɗq#Pش\ʣYTX{z5cEF1R%m'ek[p\ȥoFh*]X9dp20qKn :P[U:ʢK/TsV4T`.VvV8̊V ƊpbU T`*/pR\u`咶-.dRV4T`w̪0uE^`V4T`.VvV8̊VՅʔu`\ʣYTX{n.TH֝p\ʣYTX{eM )R1R%m'ek[p\ȥo*mX\JVY+i;+\ RۂE+{ )R2TE*:.eQ,dK2Յʔu`咶-.dR6.THK,F)ms"Յʔ8^RcU:ʢK/TsʛV*RbՃJN#๑J1nZ1RȹF ,uc7 FU:ʢK/Ts.VvV8̊V.VvV8̊VQу[Xʅ*Pr JY,iAr58U:ʢK/TsV`F0eBh@uB,4oG+BPn T`*/pRΌf`^Vs*eQc%X9,*hs*eQc%X9і#Rs*eQc%X9і ZT)PꆋMT*RcJ 2[X.eQ,dK:2¡ʷ̪0uE^`,*q֖`pP*RjժRE̊S2Ď T`*/pRϣ,)-&NcVJT4\m:RKP\FXRZ9ZL:2U2^zFXLB:`\ʣYTX{}a2r FKZZɂ•@K-/VK]2)OFXq`֝0Z.eQ,dK4ez ]i#*R[T^R.dR&t̪0uE^`&ub5)12U2^z&tr:u-Zʅ*Pr JY,iArܙҒd8hF ,5`N`*ibu FU:ʢK/TsF ,M,NHݒ֖`pP*RjժRE̊SՌ,hҢF ,ѫ8*0t\ʣYTX{z5dӬ*hs*eQc%X9ѫ&N1R2jSb.eQ,dK=d.IX.eQ,dK4jƊPnTYsU:ʢK/Tsѫ*0ueԧp\ʣYTX{z5cEFV(lV.eQ,dK=\H6,2U2^zXQ$qՊ ̪0uE^`V4T`ubŢU:ʢK/Tsѫ*0u¡ʷ̪0uE^`Fh *d))T ڢjs"\)XBU:ʢK/TsFh V*uS%-dHJTT.ѫ*0uaU:ʢK/TsʛV4uQ1pRT`*/pRTڱ(t֖`pP*RjժRE̊SՍTBs*eQc%X9ՍTs*eQc%X9դh.THF ,Յʔ*hs*eQc%X96.TH֝p\ʣYTX{eM )R5u\d))T ڢjs"SjJT6qJT`*/pR̩ar*FX蹕F ,XrҦ˜2U2^zՌP7-Ӯ T`*/pRόFn(]i-ik& G U,Z.)t\ȥ=`K,˚ZTXaxBqs"JqQIFX1R%m'dRs"U2^zbՃJN#๑JPXJw Y+i;-4hRRE+EB"VvT)ůVі TrzT)s)v`2Vv[.ijQb ̊V)GE&=A`ŭdmZ FE+h*]X9dBժPX0qkkpPXT9V%m'e断*X^*P\ȥhRT|Rc *dRw і TrzT)r\.p. :`[IlEE'2)Z*1$tK X.dR,u` VR7eAbGLpі TrzT)js)vr:u-Z[IlEE'2)Z*1V'NūY+i;*uVBJތbՃK-ZHݕ%Ӭqj\.p.)Ӧ Y+i;-4hRRE+EB"d]i ]pns"`K,ZB* R5uLs)w, ոjN-d\բK J SLuz ]i ]pns"bՃK-ZHݕz ]i\{]e.^j F,4и#wp*]X9dBժPXH^ۮ: /qK2VY/Pj#vT#R6JGe RFX1R%PnʂjFam-tp\.p.*]X9dBժPXHBXk.8^}`K,ZB* Xb\.p.*]X9dBժPXH`pP*RRSs)w,u` VR7eA`^`^ۮ: /qKe.^j F,  ik#Vs)wFX1R%Pnʂј`K]): /qKe.^j F, (ZKe RFX1R%PnʂъŊ-e R`K,ZB* @2qK.8^z2VY-ik.T{JG,\{]ZF, J~LK,˚ZTXaxBqs"JqQI&tbՃJNbE)Q,dK<ъVY+i;+\ RۂE+}Q#RJNe-Z*,TT8JP8ӨN%m'eB\\ȥo&tbՃK-ZHݖFXJw Yptr:u-Z[IlEE'2)Z*1tr:u-Z[ITۮ:Պ̊VgF*]X9dBժiҒd8k.8^y3.^j FIXլ\{]gF*]X9dS%)s)uiTE)d Tr[IlEE'2)Z*1jɓX1R%m'dRs"U2^zY2t*]X9dp20qKn jɓX1R%Pnʅd*]&Nc.8^j'ub5)1d\բK J SL}Bd.,F;, ]pns"5dӬu` VR7eBd.,F;,\{]ѫ&N`K,ZB*'tfZ8e RY2qIikӬd\բK J SLu ɓTNK]&Nc%m'eB\\ȥoVL:VY/Pj#vT+&N1R;m-t:u\{]jɓX1R%-eJ/iH /qKHŠH.dRѫ*0uVY+i;-4hRRE+EB"\u`咶XaxJ~U2^zXQ Tr[IZd`2)[ѫ*0uVY/Pj#vT+*0u]e RV4T`N%m'e断*X^*P\ȥhRT|Rc:2jSb[IP,2)[V4T`.^j FV4T`N.8^j:GX[%m'e断*X^*P\ȥhRT|Rc:GX[%m'eB\\ȥnXQ TrzT)XQ$qՊs)vXQ$qՊ2Vv[.ijQb ̊V)GE&>XQ$qՊ2VvT)ůVՍ:K,ZB*:GXc.8^j:GXsKV,/(N.dRT)N*>b)1 Ɗq#PT[IP,2)[V4T`.^j FV4T`ub¦\.p.+*0uĎ:CbJNe-Z*,TT8JP8+*0uĎ:CbJNʅ.7q`J\u` VR7eB\H6-e R\u` VR7eB\b%JpPh *d\բK J SLzcEFT9V%m'eB\\ȥm\u` VR7eB\*q /qKXQTJNe-Z*,TT8JP8Ph V*uS%m'eB\\ȥoV4T`.^j FV4T`+: /qKB\&lEE'2)Z*1cEFL7qK X.dRFh*]X9dBժPh 2s)vXQ TrkKYuRKR9e R1Y$2)O6.THK,˚ZTXaxBqs"JqQITڰR#.VvK,/2)O:ʢK/TsʛV*RbՃJN#๑JjJT]i+i;-4hRRE+EB"ՅʔӮ2VvT)ůVSjJTTrzT)jJT]ipʛV*RbՃK-ZHݗ[V*RdXլ\{][V*RdU,usKV,/(N.dRT)N*>b)1mX\J.)TJNʅ.7q`J*mX\JVY/Pj#v]mX\J.)T\.p.Յʔu` VR7eՅʔ8^L:e RjJT/)TJNe-Z*,TT8JP8mX\J*:[IP,2)[6.THK,ZB..THKe R쩵ar*F*]X9dS%)s)ui&As"b7V3q@ܴbՃJNe-Z*,TT8JP81nZ1R%m'dRs"YTX{xnf⁹hK,F)ms"uc7 F댕˚ZTXaxBqs"JqQIWZuJNʅ.7q`J1nZ1R%Pn˃uc7 F댸\{]Fn(TrzT)Xrd2s)wՌP7-u`֖Lr˅դb$2)OG+F-mc%m'e断*X^*P\ȥhRT|RcG+F-mc%m'eSnV(R72)[Qм8ۨ ˚ZTXaxBqs"JqQIV`F0d*X^.dRƣyX(qQ+i;*Cʄ)uAb fn,d\բK J SLte32VvK,/2)O:ʢK/Tsі X[IP,2)[ +.qsKV,/(N.dRT)N*>b)1 +.qXaxJFXTYsF)ms"U2^zVv[.ijQb ̊V)GE&=b5)1d*X^.dR:ʢK/Tsі#RJNʅ.7q`J2[X[IlEE'2)Z*1e\uk),*qsKV,/(N.dRT)N*>b)1eCn2VvK,/2)OT`*/pRFXT9V%m'eB\\ȥnrKZZɂ•@K-/VK]2)O:`[IlEE'2)Z*1і$tXaxJ}Q,dK=bGL+i;*łE+z2’d8k%m'e断*X^*P\ȥhRT|RcFXRZ9ZL:dmZ FE+z2d]i˚ZTXaxBqs"JqQIa2r FJNbE)F ,e)Ӧ Y+i;*łE+z2d]i#*R[T^R.dR/V:`sKV,/(N.dRT)N*>b)1іX5uLVvK,/2)O:ʢK/TsіX5uLVvT)ůV2[KZZɂ•@K-/VK]2)O:TYs˚ZTXaxBqs"JqQI&t+i;%gJ+.q-.dR:ʢK/TsɝFXJw Y+i;-4hRRE+EB"3N%m'dRs"YTX{y3N%m'eB\\ȥo&tr:u-Z[IlEE'2)Z*1ɝ)-&NcVVvU6뎭ub#qs"'T4:#vJNe-Z*,TT8JP8F ,M,NHݒXaxJ~U2^zXX XB%m'eB\\ȥoV'PnkKY0R8R)eE)qKE)j4`\QPɒsKV,/(N.dRT)N*>b)1ѫ8XсsEC&JNbE)YTX{z5c 0.td[IP,2)[ՍiiyR:[IlEE'2)Z*15cGZ^TFVvK,/2)OT`*/pRFhKKʔJNʅ.7q`Jd4V\%m'e断*X^*P\ȥhRT|Rcѫ&NaSEe2VvK,/2)OՓ'N+i;+\ RۂE+}Q,dK=d.,F;,˚ZTXaxBqs"JqQIVLbeԧpŒXaxJzYTX{z5d*]FXJw Y+i;*łE+tjɓTNK]&Nc%m'e断*X^*P\ȥhRT|RcVLbvZ2t+i;%eQc%X9Փ'tL:JNʅ.7q`JFh FM8[IlEE'2)Z*15cEFR7*hJNbE)Ս:Hܩ+i;+\ RۂE+jeQc%X9Ս:2jSb[IlEE'2)Z*15cEFVvK,/2)OT`*/pRFh#RJNʅ.7q`J\H6+d\բK J SL}\H6+d*X^.dRU2^zXQ$qՊVvT)ůVՍ:GXc%m'e断*X^*P\ȥhRT|RcՍ:GXc%m'dRs"F ,jƊq#PرK X.dRFh8 L˚ZTXaxBqs"JqQIV4T`ub¦JNbE)eQc%X9Ս:GXK X.dRFh8 Y+i;-4hRRE+EB"Fh8 Y+i;%0uE^`V4T`ubŬ ]pns"5cEFT9V%m'e断*X^*P\ȥhRT|Rcѫ*0u¡ʷ+i;%F ,jƊprJNʅ.7q`J5cEFT9V%-dHJTT.Ս:JNd\բK J SLtjƊpbU2VvK,/2)O:ʢK/Tsѫ*0u•T[IP,2)[Ս:JNd))T ڢjs"5cEFL7qsKV,/(N.dRT)N*>b)1jƊpn%m'dRs"F ,jƊpn%m'eB\\ȥnTڱ(tsKV,/(N.dRT)N*>b)1M:nbKK+i;%F ,ՍTL\7TC앴 ]pns"ՍTL\7TC어#*R[T^R.dR6hꤊVv[.ijQb ̊V)GE&2ՍTBJNbE)F ,ՍTBJNʅ.7q`JTڱ4b[IlEE'2)Z*1ʛV4uRFY+i;%:ʢK/TsʛV4uRFY+i;*łE+ySj4b*RsKV,/(N.dRT)N*>b)1դh.TK%m'dRs"F ,դh.TK%m'eB\\ȥnTڰR%M8[IlEE'2)Z*1M )RTYsK ̊SՅʔ*hJN#๑JިU2^zTڰR#WZuJNe-Z*,TT8JP8*mX\J:%m'dRs"Q,dKb)1Fn(4V\%m'dRs"nf⁹iSEe2VvV8̊VeQc%X9WZuJNe-Z*,TT8JP81nZ5u\d*X^.dRT`*/pRՌP7-Ӯ2VvT)ůVXrѫ:%-dHJTT.;1q y!l 941$8=Ѕ|'#`> `>q!Þx00bd\L8= b`ćIcq!`|q>x ``(`x ``B'BcN`B;`B!8=$|&8=(<)(8=  !)숏dE1OC؜MU1N N9#FF/ `Dq!": cxB@8=gA8ؠ(9ؤN#.R y΂qbBp{0Ǟ8=4,΂qLj` s: c8=tF6d`$΂qF"1   جQ`΂q+Dp{x,vtcDp{xN#¤&aP5Ţ'Dp{x-<'"8=d\: c&<9V]8=`5΂qDp{ A8 gA8@h"8=48=4YN#< : c^"8=GtA8BhC^x sF?'ah'gE\o!-hlF?g8=#8=Oćf<s,΍cnFp{q 9x F1DA3|Hp{`':6.xQoR$8=5 x#8=2`{8=|58=|p#8=DHp{~x<w: cNtl#@o@ yg^xh"`&΃.>t@"`g@dEA"`(΁$"`>Hb.x"`>p0c>p0RE~>d\ \|PEFEwp0$"`\ >JE:ϑp0x4Ť\ >p0\ |\E.b.BEc\ >0"`NEc舸|dE!c2.)"`1*"`qNEǏc"bC$\ DX8p1pp1 d\ Y"."N3"b`fE)"b/p1q[2.% p̋y2. p`fEx̋vd\>WD\>w`fE>lEd\>7\>2. ȸ| ȸ|;ఋ`fEe.E`fEiבp ȸ|p p ȸ|hEy3"{6E}3"A̋E`fE.6d\$\ 6d\vEQ3"Qq{2.^E`fE>C3"H>l ȸ>*ċ̋p|`fEw0{2.xtE̋4}3"4p| x> ȸ>x4"l ȸ>|\M\2..̋{ò.݁.̋.&̋LE̋<pE3">̋tEF̋.pd\? ȸ~0,"-x<"V̋ql ȸ~[˶d\?w;2..d\? H~`fE׃.݁\?vd\?Eg3"52"w3"9`fEyȋ`fE} ̋d\?2.8 ȸ?!p~$6̋𣁙 ȸ?# 2.ż\p~R.2.\ H?)p~6ؑp~ ȸ?Ot݁?w`fEHE2.H?2.M\2.{".~̋ep~l ȸ?B.̋`p~vd\1`fE{ȸ?2.NEBp~6̋PE̋RE`fEOF̋F#"`fEA݁#"̋[d\ d\ lB.2.lp`fEv) d\ "`fE`XE̋.M`+"w3"9@E2p \ M`fE:b.̋{`fENEAp\ M` ȸqa[2. E`fEvD\@l ȸAs\n3 ]ccdJZ{%+Z_g?c%Zdα αEbkc_?%:?:αOu?V..T_c%VAx2+:X`kuc cu?UJmX(dVccou: c%,X*Unαα?=%ГgX; t3t_'u:3t_N]c:EF3t_Bk:/6(,gX;;:/A͌t" 3t_#lgX;"! > H lgX;PuQ63t_ A> α~wgX;ggX;α~w,Ac:E,3t_;:/ hc:E7`_c:EV3t_3t_3Xα~w ahu ,-V3t_F{:/#_c:Ea^/V3t_Fh/c53t_Fα~w":/#Zc:E`'Xα~wr{:/#0Xα~w u Nα~w (Xα~w +cE+:/$lgX;8/c@kc@ cQ(cPCcRL3V3t_J43t_JU:/%mc:E fn2cP`Vcc:E&`/cP`α~w(C׻c:E0α~w E`3cEeB2{:/Vpu!}BVu!6 ,gX;0au!p\gX;α~w\xgc:EQU!k uOAuc0 rģ<='q(#Ѓ;GŸzq(B8c~%Ip J?> A rģE rģ 8c~%? p J?>0! rģ8c~%7$8c~%0"M;GL+' rģ&(( rģ&`8c~%1p J?`00# rģ&A ``~w1?x gq( N9Q|8c~%<, 8c~%<8c~%<q( SA0) rģ q(-m;G'c;G`w1?`w1?x9Q`];G0W;GN9Q001 rģ03 rģ p J?|8q(`o;G d8c~%>< 9Q;4 rģp0 gq(, l8c~%@ 09QO/ rģ!s;G*N9Qw1? w1? 7i;Gk;GsAE< rģ03ArL 8c~%a; rģ8p J?;p J?8p0gq(w1?Nv8c~%``gq( w1?N| 8c~%B``'q(w1?!``gq(9p J?>$A $3Ap1N9Q!"Ip J?`b&α_O!;cB I'sqS@g E&01NX/ħ JgsqS38)@Olu"J{bu"J{eӹ8)C Adu"J{8)@_;cD p1sqSU5α_O" w:~%= Au"J{`bsqS;c w:~%=@6 E>NX/ħ (α_O>#α_O8) u"J{S8) 8|6α_OPX|w:~%=@p\u"J{€w:~%=@e8) 04α_OP w;c| sqS>8) w:~%=Cw;c!|X/ħ@ u"J{.;c!E*w:~%=B8)cDu"J{u"J{>X/ħ@gS8) x>*α_OR4u"J{“>.α_OR38) @éE.|u"J{“|E `9α_ORfu"J{‘E NX/ħ)0|gsqS E9E"X/ħgsqSD M;c%X~u"J{Ȁ$u"J{ȃl?A;c w:~%=@gsqSDX~X/ħgsqS8~u"J{aӹ8)ddu"J{Su"J{7_;cAvS8)dx~ gsqS X/ħNX/ħNwu"J{u"J{~ X/ħNO E#$u"J{0~NX/ħN|X/ħN[;c8gsqS'S8)/u"J{sqSĸ?W;cFX/ħ78)eX? 'sqS0~;α_O#X?S8)f?8)aE0~sqSu"J{ ŋT*RY)a)ϒ>|[Z..Tܔ ZN T-rJXb*bW;FI\Rڤ%FA{J-IJ5H(\K,IJ5H(ARd8l-NQDiQ&NcVUb \ :2UkZ&T6;FISڤ%FA{J-qIJ5H(\K,qIJ5H(ARd8l;NQDiQ&NcVUP^,TFF~ ?K]pKst *vk2_Nx/,R!~Ba $! B`yv-^$$]Ki3v$k&C0FnBFh#]yÉ PH.xA0>Jn @@(}C#T }JHf$kEh-yÈl)LP&}Q L>!ɑhMШ>7`925l<9M>hgEO5@P925yn&^^F&6׵@Qyr5hv5hskIvQyq!* 53MB;ezC#T }H >HrdjQyCj!ɑI>hdhT1yRi&Q C#T }F OlP>6Hrdj e$925@Dki7( 2 &yj$yn&^Q/j0#]Lj0^FHhMgmP `nHJAs LSpoChLgE !̈́%HrdjQCh'Hrdj  M>q!ɑϾo4ƔkBB<׵)Ei7)yJ"51 dېЛE5ЛD5۞#]:Lm@|6`(L&> dPE&HrdjQ"BmDL[4he Lp:>4>925EfC=ZC#T }i7( 2 &yjď4چ/5 WɍePJC#T }DOgBz%HrdjQC=js6j6yvLmACF7>925l<9M>C#T }DJbxԇ&Flu C<C#T }D#xҀs(PHQbgy#0Fq25-^92yuP Φ(|jC#Wx h;&F} D3 M>925@@rLi@f(M(3P<܍{Uh#0Fq2j{R51ڠyqr5höH Mj\nHJAs LSpoC;C#T } gAC;925yqC; RƒlRL见0FP65@r5LQbG`eL^jbkchAyڠyHhMnBFBm#y7> "C#V3CHrdj3A}Ɠ2tLQaA|d6PfgEך`J5̡Bm!EjkڎbG`eGO5/j^jjr5hЛD5xvcj5x8t! tԇ&F>)C>$925yRjnHЛF5yE1Z^y3C#V3Cf&F>),>&!ɑ,(> LP&}R4ƔkBB<׵^<o7/j׵kch栱{T1P=!ɑAcư@ޘe!ɑ"Bm L(z $ $925@BP#xҀs(PHQbgy,HLLjP{PЍvLm<4^̀ZP@@档ư@ޘe LI>hgE E谠l@l925@BV^i7( 2 &yj;Ei7v-#]FO5ڠ>'(|"T&F5÷ z`q>lԑs6&}Pƒe@$925@BGi7( 2 &yjď4ڇ/5Wkch栽{T2ZPD k4X@PDzC#REϾ"@B0 l RL>y43\&XnFt<o7/j<:^ɍ'%P C8ZC#W'a08.}&Ͼ(l@ M> $925@B4/4ƔkBB<׵#0Fq2{PfF&6j ׵@|3EVXvzL2p%HrdjHЛDH>)5E`'@(|4Hrdj3i7( 2 &yjď4ڇo5׵kch{T0^P 0XvzL2n$925$\M$ }(E`lHrdj3^i7( 2 &yjQbG`eAA2yxFfP lư@ޘeiLI>hgE3E`ly!ɑϾ>#xҀs(PHQbgy$yn&^jdѓAa2(|HrdjPt;x@=awC6925$\M$ }z 5@(|q!ɑϾt;y43\&XnF=Ei75ڃ51dPxF >@XvzL2.}&Ͼt^ D@(|!925@NLi@f(M(3P<܍{P|<o7/jjHdѓCP @%HrdjPXvzL2@lԑs6&}Vj,(>e!ɑϾ4ƔkBB<׵(#0Fq2{QvLm<@^$*(|2HrdjQXvzL2@ԑs6&}XEE`2C !ɑϾ4ƔkBB<׵h#0Fq2 {PF&6j@|3 EiL^j5o (| HrdjHЛDH>,1E`zC5C#T }Q!ɑ0Fpt!qA$o4'@(|C#T }B6 d#vZ=|AgI:D(RTң,u`fBtx +ؐw׮hH,^ׯE5y,$]Kjnn܄v(yq Mg۞#]P @Ąx$< %7 O M>@ $925@GHkMۈHX&6)MÈl#Hrdj357(|!ɑhMШ> BP C#V3C4a!ɑϾt 925yڋdЂQzj/7nBFBm<^nBFBm<^;nxt1%@Qyq!* 53MB;e !ɑϾu %LPB&F5>{T$} `Q{䋲ch*R皋o(|! i&@q!ɑϾz|3 M4(|p925E` M>~gE`:yƔkBB<׵D,<>'?LЍ$Jb.H)3.N{N 7^izh?5cisMېЛE577n!#]a LSqskBcj 577$%C ]`)7GaylgE "ů577n!#]`(>jnnD(e925@H57(|`!ɑhMШ>!57y&Fg4  RLP/jnPARC#WLvLm<^zPA L^j/x h; .}&Ͼ>,(> ILP&}QM43\&XnF$yڌj0^ ^j{T5Bn܄v(yv5hGm&6>D5BnHJAs LSpoC !ɑϾt (JX7HrdjT%,&Fڢ$\MyvLmA^o(|gi&XLP&}SboQ>Z .M>!ɑϾt(yƔkBB<׵)Ejnq2/5)^dF&6j2^B;(|@(HrdjQư@ޘeLI>hgE`5Eat6P ZC#T }7i@f(M(3P<܍{Q,HSw>pEiLW I>hO7.ɍШ>D6P Q925@hJZ7 HlxlRL z3zo5B6PC#T } ǚ҇ jv- i&#Hrdj3P/jJC#Wכɍ'׵@|3b"!ɑE÷ z`q> ԑs6&}S,(>l L觃׍( 2 &yj0Ej^n&^`QHdЂT+ڠyv$k&CPЛD5B;nxt1 j8t! RL规06C!ɑP>$925^"Bm< 䋲ch*^o(|L[4heJC#T }B /x҈~ƒP&vgEj^43\&XnFJ,HPzq2/5)^dF&6@Qr5h#v5h!skIl)=> ԇ&F5>T&Fڕ.}&уFO7.ɍШ> j2y|L[4he925@H]>J+Hrdj $e925@HQ<i@f(M(3P<܍{P$y=y{P桊b51 lېЛE5ЛD5۞#]:Lm@|6'y8t! !ɑϾᘈ4(|>D&F5>!ɑ>hgdhT{F7>Ri&<gE P AƔHrdj  r6P|hgE DO5Pe i ,LT7#^Ե$y=y{RךjvLm/5N7nBFBm<9q  LTNP AÉ PH.xA0>Jn @@(| @ZgE  ࠡ1925yr)LW.$\MyvLmA;+Hrdjys@(| C$&F>(FO`pIqCb&Fle!ɑϾ׍( 2 &yj,HPzq2Uɍ׵@UfHhM7n!#]6jvcj&F>)hPzP65@r5^Ej^n&^皼2ya0L^jf;x@=awC.}&Ͼ@$E`P6Pz!ɑϾ>j^43\&XnF,HPzq257^tF&6@Qѻr5h棣v5h棡skI1KGFĄx$< %7 O M> RL菆a1C u!ɑGE*ć&FڂEϾ0yE1Z1GO7>zC#V3C A!ɑϾt@>H,(|Rd&Fl(e* RLAAƔkBB<׵ bGכ j/jvLm/5^7nBFBmD&F>)G(|L^j4{Pԑs6jE1Z1#WP iL[4heRL'1!C0ƒᰌZ6P lgE`J5̡Bm!EjkڎbGכv-#]B Ajj MېЛE5$k&3Ah5ӤagpBT< jf xv'&x!ɑϾg1,(|ⴇ&F5R{P^HЛF57.ɍШ>57>@rհL6P=Lᘌi$925Ea4@(|!ɑϾBP= L^j^n.B ᰌ<Bt L 2<;?LЍE>b.H*5cEF1Rə 6 bB yp?ECUZ7׏`x^j Id皆HhM$k!6j۞#]P 'Ąx$< %7 O M>ngEDX桩q AH桩qM>zC#T }#LPԡ {Tk&hT jPjC#V3C RLNT چ(5y{Qy^j/^EHhMۈHhMgm&6> y8t! \&F>)H;(|ƉL^j/(| LWBHЛF5H&6BH<^yC.925l<9M>ZC#T }P|3(Jp!Hrdj @x6P 4&F>(PJ5̡Bm!EjkڢEjL'^`F&6j0^K(|HrdjQư@ޘeLI>hgEu d ZC#T }|lPJ5̡Bm!Ejkڔď5 ^n&^ԥ+ڌdЂQj27nBFBm AC LBPe i ,LT7#^1EjLbP{Q2y{T1(P`*HrdjQư@ޘe&&F} D3ƒᰔA@(|0 925@X3yjP65@r5Sď5 ^n&^;SjvLm/5L7nBFBm<1q  LTöNP S\.S0`|#<6P !ɑϾg0:6(|(HrdjTLW-$\MyvLmA-yg`i&`!ɑϾ.>w%&FlAbC,HgE(| HrdjP9"F`: jBt XL hf&xF լPԩ*mX\JVLN{Np?ELWL׆cdcisLMېЛE517n!#]a LSskBcjjbnHJAs LSpoC+ RLLbךLm |HSp!@(|aC#T }'>l{Tk&hT#L^o(|!ɑalvT&F>)P/jbP; L^jbq251 ^ېЛE5ЛD5۞#]:Lm@|6EĄx$< %7 O M>*C#T }g01(|&F5>C#UP.}&уE7.ɍШ>wo(| 0Hrdjys@(| $925@X |9x҄@ | M>L|S( 2 &yj$yڢy%FkchP |>2C#W5o (|!:C#REϾ"@a,(>A@(|4Hrdj3Д> 9" (> 51x8e"L 逴z3z Դ8t! T&F>,LR҇T925@\O1#73lP:b.H(r`a $!p?EKWKkǷW.ɍ5-7nBFBm<Դݸv&yh5Аڀl&-yiq!* 53MB;eJgE(kKMۈHdAL<Դ8P&@`gER҇ jv- 0tRכ@Hrdjys@(|i!ɑϾ$ 0=y4P:Pm#c2< G#73B6?`PԩV`F0a $!p?EKWKkǷW.ɍ5-7nBFBm<Դݸv&yh5Ӥa0zRpBT< jf xv'&@ILP&}X/E^jZnBF&6x楦B6P $925@jjZP js6jZy"- <<Ե&Fg4 925@a9 xҀ!ɑFd#yH_FoYgl~UPԩFX30/+qa 6 bB 4^ԵyxoV{ux1yq"\Rv$k&CKMۈHXBm<Դv萘ڀl5-7$%C ]`)7GaylL谆ԴݸuchlԴ8P&@ LjR҇P&Fڠ#]6BԵP4&Fg4 P L^j{R҇Pd&F5-y{Tch5o (|$\M$ }(yjv MlfB><>'hf&xF*"2t +.rfBtx +ؐwå -^i.^կ^^j\H&6<Դݹ  PRv5h楣NP jRpBT< jf xv'&-$925@`-yiq (>楦B6P9LP&}Z>A C#UP.}&уK^o$]EP|K^o(|3Hrdjys@(|-Hrdj3soP>p925@ȳ|x|O)?LЍD(RTң,F;32,ؐwå -^i.^կ^^j\H&6jZn܄v&yh5cj5-7$%C ]`)7GaylC#T }&yiC&C#T dR3z<Դ8t! LLFkKMۈHdAjZnD(e!ɑϾtHR҇ js6jZy"- <Ե he 925@X5@oF]϶M`TPN&3- ޲sVP8&Hrdj³1(| fE:C#TV O`|>LQXB|3Cᄇ&F>C EC#TV0>>!ɑ+ԇ&F|3 LQ`f!ɑ,  LQa  ã d2Hrdj ƒן 925E|3J ՟ "ZC#TZc *(|<925E bPx%HrdjB|3$925E>J6HrdjdlcCLP&}Y Fd#yHAd΄8Z ]J:TeCnfd'Gzh'|:\{RZċcisKMېЛE5-7n!#]6jZ;nxt1O5-7$%C ]`)7GaylnC#T } bךɍ 5-7" ILP&}Z>#HrdjEϾ0yk䋲ch*AykxRi&&F>,'>( )Hrdj6Rd2լPԩFXfBtx{Nt%z۫KdѳKMېЛD5-=C#T dR3zh楯7.ɍШ> ^jZyCZհL6Pv)Hrdj3ydYyt1PY"1->C)LQhOa8-(|!ɑ,'`p'Oe`$925@d(o1 Z=|AgI:PԩFXLB:`a $!p?EKWKkǷW.ɍ5-7nBFBm<Դݸv&yh5Ӥ`<Դ8t! ILP&}VHkKMۈHdAjZnD(eqC#T }^jZP&Fڠ$\MH&6B5-y. i&d&F>-皠^H1NE5.Hb!>$925E>%LQgφ`C%>z J&F>,m#c2< G#73B6?`"2tn,Ӧ LN{Nt%z۫Kd皖!#]6jZnBFh楣D`BbRpBT< jf xv'&4Hrdj3,ZRv5 !Դ8P&#Hrdj3KJ!ɑhMШ> 楯7> AZC#V3C2Hrdj3yKJHrdjRכ@H&6jXvzL2.}&Ͼ<׵@HBlxPC#T GLJ- ޳$%VBRFNҦ˜a $!p?EKWKkǷW.ɍ5-7nBFBm<Դݸv&yh5Ӥ`BjZnHJAs LSpoCZ RL^ԴݸvLm EyiqM>@925@jjZP b{T} `RכdhT!3K^o(|!Hrdjys@(|C#T } (  RMlfB><>'hf&xF >b.H)3N3!:<h'|:\{RZċch楦HhMg۞#] &6>!kKMÉ PH.xA0>Jn @@(|`!ɑϾ<Դ!ɑ2ȳ|x|O)gI`#c2k)u*DdI)-&NcV2l=|A^Ą4.hjIrޭxbRE1楦HhMЛD5- C#T } ^jZP4C#UP.}&уK^o$]EP|P4i!ɑalh!ɑϾNT X&6k$]:Lm b"%@B|fCB׃z C#T }B6Rd"2tՁ:)a $!p?EKWKkǷW.ɍ5-7nBFBm<Դݸv&yh5Ӥ` Դ8t! LP&}X/E^jZnBF&6@HRp!@(|AC#T }楥ILW@HЛF5-yvLmA"ykL[4heLP&}XN|3׍( dm#c2< G#73B6?`e(RTңV0pJFd'Gzh'|:\{RZċcisKMېЛE5-7n!#]6jZ;nxt1 jZnHJAs LSpoC!C#T } bךɍך C!PgEyiC! js6jZy"- 5-yRi&!ɑϾ φ`@^4(|!ɑFd#yH_FoYgl~XKR#'JXƖ(/qQ 6 bB 4^ԵyxoV{ux1yq"\Rv$k&CKMۈHXBm<Դv萘ڀlKMÉ PH.xA0>Jn @@(|L谆ԴݸuchlԴ8P&8LP&}X5yiC!ɑhMШ> 5-yFհL6P!ɑϾu-(| $925ykڠ$]F5@;x@=awC( >hgEjkڠ$]6|<(|ZC#T GLJ- ޳$PԩF:uM93!:<HCA;ږ4/ ׏n/5.$]KjZn܄v(yiq  LRskI@楦Ąx$< %7 O M>h925@`-yiq (>Դ8P&4 Lo5-(|<{T} `RכdhT jZyC C#V3C ZC#T } €J@4&Fo1 Z=|AgI:(Nb.H*5d*]FXJw s2l=|A^Ą4.hjIrޭxbRE1楦HhMЛD5-KMÈlLP&}Z>$925^"Bm<ԵE1ZB@Rכ$925l<9M> LP&}XN|37( m#c2< G#73B6?`eJ(RTңVLbvZ2t N{Nt%z۫Kd皖!#]6jZnBFh楣D`!$yiq!* 53MB;e}ć&F>,!ů5-7n!#]`(>bRp!@(|ⴇ&F>,Դ C#UPЛEP|&/5-y!ɑalfgET ږ>` ԵeP.ɍx h;䋟} D35@r5P.Л>>aC#T GLJ- ޳$XKR#'JXQʚ+.s3!:<HCA;ږ4/ ׏n/5.$]KjZn܄v(yiq  LRskIBԴ8t! <ć&F>,ů5-7n!#]E`!/5-7" ,'>$P> vm#c2< G#73B6?`e լPԩFh#R̄_W! K/jZ\7^=?ԸvLm.yir5h楦$k&3KGm&6>$/5-7$%C ]`)7Gayld'Hrdj3z,ZRv51P|6 P<Դ8P&,LP&}Z>X js6jZy"- ऩ楯7>XRi&,ILP&}XN|3 ]xҀ(m#c2< G#73B6?`e լPԩFh8 2l=|A^Ą4.hjIrޭxbRE1楦HhMЛD5-,'>"ƔMlfB><>'hf&xF :"2tՍ:GXffBtx +ؐwå -^i.^կ^^j\H&6<Դݹ  PRv5h楣NP RpBT< jf xv'&$925@`-yiq (>5-7" Ð925@jjZPr925^"Bm<ԵE1ZBךPr&Fg4 Ð$925@a9̈JÐVm#c2< G#73B6?`e լPԩFh8 Y 6 bB 4^ԵyxoV{ux1yq"\Rv$k&CKMۈHhMg۞#]:Lm@|6"<Դ8t! C#T } bךɍKMÈl)LP&}Z>SLW@HЛF5-yvLmA/yk i&(NgE2 J 925@ȳ|x|O)?LЍBuk)u*DdQ*0uĎ:Cb̄_W! K/jZ\7^=?ԸvLm.yir5h楦$k&3KGm&6>\.S0`|#<6PVgE`-yiq (>G C L谈R҇ js6jZy"- D5-y`4&Fg4 0Hrdj3kP/k$]`HY"ciGɍךH c$$925E > 925E>/(|LQgφl HّCJgEMlfB><>'hf&xFVBRFN\*rfBtx w"$!p?E_jZ\7^=?ԸvLm.yir5h楦$k&3KGm&6>2KMÉ PH.xA0>Jn @@(|LDX楦$kchl楦B6PpLP&}VO5-(|8C#UP.}&уK^o$]EP6dԵÀ925l&C#T }G^}#]SbAqg'oYE!C͑C#TX;>ԇ&FfD(|8D&FfE(|8)LQcᘞPp!Hrdj^|3> vN"(|!ɑ-YN$(|!ɑ-1N> PR|3P.C#TZᘜ\ԇ&F1:qC#T['a:z qC#T }B6Rf&x|#c}Z ]J:TjƊpbUa $!p?EKWKkǷW.ɍ5-7nBFBm<Դݸv&yh5Ӥa9kKMÉ PH.xA0>Jn @@(|7 LP&}X/E^jZnBF&6p楦B6Pn$925@jjZPn)LW@HЛF5-yvLmA<ԵpJհL6PnRL谜f'/P>m#c2< G#73B6?`e+XKR#'JXQ N{Nt%z۫Kd皖!#]6jZnBFBm<Դvcjᰜ<Դ8t! `!ɑϾ,ZRv51P|6W CL谈R҇`925^"Bm<ԵE1Z(yk!Hrdjys@(|6 LZT X&61Cᰥ!ɑ-#Lo@6PlL GLJ- ޳$w*(RTҕ6hbấ-/a $!p?EKWKkǷW.ɍ5-7nBFBm<Դݸv&yh5Ӥ`F jZnHJAs LSpoCT&F>,ů5-7n!#]E`F jZnD(epiLP&}Z>925^"Bm<ԵE1Z<Ե8&Fg4 8925@a9( RMlfB><>'hf&xF >b.H)SjƎHO3!:<HCA;ږ4/ ׏n/5.$]KjZn܄v(yiq  LRskI!<Դ8t! hRL^ԴݸvLm LRp!@(|$925@jjZP-/HrdjEϾ0yk䋲ch*楯7> @հL6P-D&F>,'>'( T&Fo1 Z=|AgI:(XKR#'JTڱ4cN{Nt%z۫Kd皖!#]6jZnBFBm<Դvcj jZnHJAs LSpoC5!ɑϾkKMۈHdA^jZnD(e!Hrdj3ռԴr{T} `RכdhTP!ɑal@gE0"OP>9C#T GLJ- ޳$Lb.H)Sj4b*R3!:<HCA;ږ4/ ׏n/5.$]KjZn܄v(yiq Mg۞#]P :yiq!* 53MB;e&F>,!ů5-7n!#]`(>zRp!@(| LP&}X5yiCHrdj5h*AykJC#V3CL^j{R҇iL^jZq2 dуP0 L'yiC!ɑ >h楯7.ɍШ <ԵiL[g4  Lj{Y|t0+k>6$PN&y,3LfZ><e φbR  ãᘡyCiLQcᘠ5(|`9Hrdj^|36&Fb !ɑ-YP J8HrdjL|36&Fᘠ>`f(Jϟ CiLQl  ށl 925@d(o1 ZoYg6?:0k)u*DdJV*RjNfBtx +ؐwå -^i.^կ^^j\H&6<Դݹ  PRv5h楣NP !;KMÉ PH.xA0>Jn @@(|@Hrdj3z,ZRv51P|6yiqM>)Hrdj3ռԴ #HrdjEϾ0yk䋲ch*%5-y &Fg4 4925@a9R 4(|4C#T GLJ- ޳$+XKR#'JTڰR#%M\Rcd'Gzh'|:\{RZċcisKMېЛE5-7n!#]6jZ;nxt1R楦Ąx$< %7 O M>&F>,ů5-7n!#]EaHvRp!@(| &F>-[KJ$925^"Bm<ԵE1Z楯7>Hrdjys@(| *gE1HExҀ, MlfB><>'hf&xF :"2tM )R4pRs2l=|A^Ą4.hjIrޭxbRE1楦HhM&yh5!15-7$%C ]`)7Gayl $925@a -yiq AjZnD(eeć&F>,Դ =!ɑhMШ>4O5-y i&925@nd#HrdjRכ@H&6jXvzL2ñ)"Bm LCP<܍{T&χ`LP&b63!@z3z+ ԴHrdjEϾ0yk䋲ch*:ykC#V3C)LP&}X9ydךGɁ]X&6yt1Z k$] &6k$]ɍeG0#e  LQi`FJILQe'0# LQhO`FLQgφ`FLQl Ax7@(|PVgEMlfB><>'hf&xFX VBRFNb7V3q@ܴjNP > #R&}|"HRT)N)uR:}^)oR|"">>\>.|pD(}H^d1}\,}_|A> J_|AL ^}{#X=kk :ֱ~`3zuXZCkY֒kPkFҝhc-ֻ{Z 5Ch5փh<փhBֈ;MУtt[te6OPK>/d2_*2_4% pPKl2_X2_Z /1%4!aЃ,2_8,%XdyKq/|2_0 P6% 00 R&%<=%FdyK8d/ 0R0FXdXd _Kp8d 8OK.d!/Urȴ D,df;hs+Jej]qbd:u-ZȹXZ,% IEϒ@Y# $YAhTHʢF YsJYd,d\->.>ԩaQ Tr[IlEE'2)Z*1e.VvK,/2)O*]X9dp20qKn ԧpŒsKV,/(N.dRT)N*>b)1 NAb5)1dRw S*]X9dBժPXJw YpPX0qkk+i;-4hRRE+EB"`Q TrzT)`2s)vrJNe-Z*,TT8JP8U,*qK X.dRі TrzT)r\.p. :`[IlEE'2)Z*1$tè,H%m'eB\\ȥoі TrzT)# \{] q=`K,ZB* q;.8^j KG+IXլ˚ZTXaxBqs"JqQIAaIhi2tZ,u` VR7eAaIhi2tZ /qKAa2r FJNe-Z*,TT8JP8Ơ9z#WZtoPXLB:`K X.dRS*]X9dBժPXLB:` /qKA`^ŃWZtk%m'e断*X^*P\ȥhRT|Rc, ոjN-z ]i ]pns")O,u` VR7eA`^ŃWZtk.8^}A`ɥŭ)*]X9dBժPX2ikqkJF2s)w#R뎭і TrzT)\uk.8^uԆ ґëz2VY/Pj#vT#R6JGe RPXH0m[,u` VR7eAb5#0R8uk.8^uԌ-m2VY/Pj#vT#R0P'Z˅PXHbK*]X9dBժPXHbKs)wPXH`pP*RRSe.^j F,F0R8R))XKYph*]X9dBժPX:뎭e RA`^``K]):FX1R%PnʂR8uk.8^uy0R8um`K,ZB* Fam-tp\.p.-me.^j F, (ZKe RPX:1XRŴe.^j F, Xb\.p.Y2qQ#RBd.,F;, ]pns">Y2t*]X9dBժP8KN.8^u ɓT3qԍ-hՓ'NbՃK-ZHݕ ɓT3qԍ-2s)wP8Kd2Vv[.ijQb ̊V)GE&:d*]'m'N+&N1R;m-t:u ]pns")OVL:VY/Pj#vT+&N1R;m-t:u\{]jɓX1R%-eJ/iH /qKHŠH.dRѫ*0uVY+i;-4hRRE+EB"\u`咶XaxJ~XQ Tr[IZd`2)[+*0u]V4T`.^j FV4T`˅Ph#RJNe-Z*,TT8JP8+*0ueԧpPh#RJNʅ.7q`JRFh*]X9dBժPh#R\.p.+*0uĎ:CbJNe-Z*,TT8JP8+*0uĎ:CbB\H6+dRw )jƊpbՃK-ZHݕ Ɗq#Pح /qK Ɗq#PرsKV,/(N.dRT)N*>b)1 Ɗq#PسPh8 +i;*łE+qJ}\u` VR7eB\H6,e RB\H62Vv[.ijQb ̊V)GE&>XQ$qՊ Ɗq#PT[IP,2)[SՍ:K,ZB*:GX /qK Ɗq#PصsKV,/(N.dRT)N*>b)1 Ɗq#PطPh8 Y+i;*łE+qJ}\u` VR7eB\H6-e RB\b%JjƊpbՃK-ZHݕ Ɗpfየ+e RB\*qsKV,/(N.dRT)N*>b)1:P[ ƊprJNʅ.7q`Jإ>XQ TrzT)XQU˅Ph V*uS%m'e断*X^*P\ȥhRT|RcV4T`+:+*0u•T[IP,2)[5cEF1R%PnʅcEFRSp+*0ua˚ZTXaxBqs"JqQIV4T`w5 Ɗpn%m'eB\\ȥn)OV4T`.^j FV4T`wpFh*]X9dS%)s)ui ʛV*RbՃJNe-Z*,TT8JP8*mX\JVY+i;%M )R1R%m'ek[p\ȥouar*F댕˚ZTXaxBqs"JqQIjJT]i=ՅʔӮ2VvT)ůV>TڰR#.^j FڰR#WZu\.p.[V*RdXղՅʔu` VR7eՅʔ*md8k.8^}Յʔ*mKd\բK J SLw[V*RdU,wmX\J.)TJNʅ.7q`JʛV*RbՃK-ZHݗ[V*RdU,u /qKՅʔ8^L:M )R1R%Pn˭ )R4p:u-Z˅Յʔ8^Rc˚ZTXaxBqs"JqQIڰR#G U,wuar*FX%m'eB\\ȥn)O6.THK,ZB..THKe R쩵ar*F*]X9dS%)s)ui&As"b7V3q@ܴbՃJNe-Z*,TT8JP81nZ1R%m'dRs"nf⁹hK,F)ms"uc7 F댕˚ZTXaxBqs"JqQIWZuXrѫ:%m'eB\\ȥo#uc7 F*]X9dBժpnf⁹h֝q /qKn('N#uc7 F*]X9dBժpnf⁹i2tpFn(TrkKYuRKR9e R1` ƣsKV,/(N.dRT)N*>b)1ƣyX(qQ+i;-4hRRE+EB"5 C`[I,T\ȥ?G+BPn2VvUu R,2)[+te32Vv[.ijQb ̊V)GE&:2y[+i;%fn,dRw J}aSEe2Vv[.ijQb ̊V)GE&=aSEe2VvK,/2)O +.q-.dRі#RJNe-Z*,TT8JP8ǣ,F;,K ̊S2jSb[IP,2)[і ZJNe-Z*,TT8JP8ǣ,*qsKV,/(N.dRT)N*>b)1eCn2VvK,/2)OFXT9V%m'eB\\ȥnu X+@,KS ԂS`&,mXS`&tŊ\t-T`T [Z^i@Z ]T8qI9ޡj0%uP#E F >, ){J}k,4b\TϤ'Pb\T>Ch[-iJ :u\ҲZtV [ib,q[V ZOVA{K(֧SVRJTR.\XaP[#*R[T^R.dRі$tsKV,/(N.dRT)N*>b)1,H%m'dRs"2Ď2VvT)ůVJ}aIhi2tZsKV,/(N.dRT)N*>b)1,&N^H֝0Z[IlEE'2)Z*1і'/PjN-d*X^.dRFXLB:`K X.dR+ӪJ}Hތ9z#WZtk%-dHJTT., ոjN-d\բK J SLtez ]iK ̊Sez ]i ]pns"`N)\Z#z2[KZZɂ•@K-/VK]2)O:TYs˚ZTXaxBqs"JqQI&t+i;%gJ+.q-.dRɝFXJw Y+i;-4hRRE+EB"3N%m'dRs"3N%m'eB\\ȥoɝ)-&NcVVv[.ijQb ̊V)GE&4jRT+i;-4hRRE+EB"'T4:#vJNbE)5`N`*ibu F앴 ]pns"7iSCj5`N`*ibu F어#*R[T^R.dRF`cFΕ +i;-4hRRE+EB":TT2d*X^.dRV0pJL ]pns")OV4qJ T`%m'e断*X^*P\ȥhRT|RcՍiiyR:[I,T\ȥ=-/*P^Y+i;*łE+qJ}d4V\%m'e断*X^*P\ȥhRT|Rcѫ&NaSEe2VvK,/2)OՓ'N+i;+\ RۂE+}d.,F;,˚ZTXaxBqs"JqQIVLbeԧpŒXaxJz5d*]FXJw Y+i;*łE+qJ}d.IX[IlEE'2)Z*1Փ'tL:JNbE)5d*]'m'NK X.dR)jƊPnTYs˚ZTXaxBqs"JqQIV4T`#r˜d*X^.dRXQʚ+.q-.dRXQ#,F;,˚ZTXaxBqs"JqQIV4T`N%m'dRs"jƊqb5)1dRw )jƊq#PحsKV,/(N.dRT)N*>b)1jƊq#PحXaxJz5cEFV(lV[IP,2)[SՍ:GXc%m'e断*X^*P\ȥhRT|RcՍ:GXc%m'dRs"jƊq#PرK X.dRѫ*0uĎ:CaS%m'e断*X^*P\ȥhRT|RcՍ:GXXaxJz5cEFV(l*dRw )jƊq#PصsKV,/(N.dRT)N*>b)1jƊq#PصXaxJz5cEFV(lZ[IP,2)[SՍ:P[˚ZTXaxBqs"JqQIFh *d*X^.dRѫ*0u¡ʷ+i;*łE+j-qgP\=:6NV4T`Cn2ZLJYmQzJ\R蹑J~XQTJNe-Z*,TT8JP8Fh V*uS%m'dRs"\)XL ]pns"rM]Ըxܽچuq\]bu A*ŠBڅF7X,F7W(jƊpbU2ZLJYmQzJ\R蹑J}\&lEE'2)Z*15cEFL7qXaxJz5cEFL7qK X.dRʛV4uQ1pRVv[.ijQb ̊V)GE&Tڱ4b[IlEE'2)Z*1ʛV4uRFY+i;%ʛV4uRFY+i;*łE+x>Tڴʔd\բK J SL|i1 )R[I,T\ȥTڰR#G U,uXaxJySjJT/)TJNʅ.7q`JRՌP7-*hJNe-Z*,TT8JP81nZTYsK ̊SM8[IZd`2)[Fn(]i+i;-4hRRE+EB"nf⁹h֝qXaxJ|b7V3q@ܴjN[IP,2)['.sl20PC)T ZՌP7-Ӯ2ZLJYmQzJ\R蹑J )d#|!8=p!iNl"8=rQ@B1='ć#$#F12Bp{0p#0sH"'| cHH xa {Na()d#S~Bp{ AoPӃJx.Bp{! cONd 2!!8=$8="n"8=H BbBp{\Hp{wB1B"8=B'!8=)C p#+AiNgB1 8Pp{bBp{k F?69 Db &F?xPp{;Nb wć#A8&'8`p Bq `pL$CL#c(8=\\Hp{ !`Nb2$8=%AFr،!!F!  ċ$'!$Pp{Bp{Cؔ BRĮؔu“ؔr Aug!G\A!8=uB# ~| _N`> Dp{Nbaؘ2`kNb`wć0{L  #ݓ_N`xw“<'"1_Bp{A``('@-1Bp{B$8=$\,'D !8= s“"|$d#rQ'Mo„\&1(7CPcPFp{ !8= g!&< `B:p{sG!y B'’Bp{ Aw!>Bp{ Ay숃dA?!8=cÐȀǁ"|p:p{e*'K܄'\ cx'p:p{Nא'd#o!8=3>$8=3~N`qBp{bN`DUć"+F?5'@ 9 P6Cء?@iG@sNbbyNb< cBp{Hp{8=A"!8=B/IN`F x#``F:p{`` g` r:'"1gF?'0ӐÞxFxFD1 #F?!w!8=#Hp{@Y &8= E'H6C$,F?C`| c'% x5#.Bp{P`Jy [ćB~c!WgCBp{wBp{8 F+Dp{ G|Lp{ϐ(y“%\J4F?%Dc x`C'QNaR(8=Cn"8=E܄ ׉aP#Šd#ť܄-ش:p{Dp{< Lp{ d#0>'MNaYp{pxAP(#'( y :p{&8=@BNBp{D xAaF?\Bp{F-t?ј5Lp{F^Dc c^Bp{p2t`|PCQ(G(܄2rȏ8=qd@F? Ni xA3F?@fqfh3< &d#y /*'Ӄ^/\Lp{)>DcH2 A!8=Dp{xON`?cƜ!^DciF?5'2t4x4|5!cp#Ơ2P}NeBnBp{*#tT6#Qw!8=T.Dc`B10 y 0_Na/t"8=?` MF?p{N` 6x8=SGf|Lp{ xAb~B1lUNcc~Bp{Nc`uG>'G.d#  $ӃQq!!8=D9cA"x{>Bp{#1@.d#|rb:p{ Qq1 y 1xN&8= 牎a=cbxD]Nd]oxYu5"8wF\tE)VEsb.cwKxwU""(.skA~J.K΁wi־/& ?j_c ?α?PRiouh?PRb.αPou1: αXAJJ?4:wXRu`ܻuuAXp/Kc:%JlgX保Oc:% Xα;+0α;| `4cw# lgX保1¡uK gX保3r_Xα;-Mc:%Ό1y:` V3r_ ͌:B gX保'3r_ec:%΀3r_>wc:%Έ:$3r_|IlgX保$3r_|HXα;1kc:%VR&cwα;uKXα;63r_|x`uKV3r_` ,gX保> uK +9/@hec:% uKsN/cwn;9/@71cwPlgX保=\gX保F,ԇ63r_* p%Kq(edN9Q Yp J?2A0WCp J?- _;G#; p J?d q(`cA8c~%"a3 rģd 'q( 8c~% p; rģ7 p J? 8c~%Xdq( 8c~%d'q( 8c~%2gq(a> rģ 2'q(< ;G%B rģL2sAT8d'q(!w1?JYp J?(p J?(XA;G%p J?(=q(6 'q( q( q(w1?X8c~%`w1?sA@/$ rģBk9Q!&[;GzAB_;GB9Qa;GB q(I)p J?™p J?XU;c Zӹ8)NX/ħB]au"J{#`w:~%=sqS!KX gsqS!w:~%=X sqSx E`:α_OVX/ħ6@α_Oᦰ!X/ħ^"X/ħ38)<hw:~%=;fw:~%=瀷ZI;c kPNX/ħфu"J{w:~%=lkCE]ilu"J{Zu"J{^α_O1ւE kCYEc8)`ZNX/ħ k;c6h9α_O&փE};c:Ѕ;cNAα_OnNX/ħD[IE3NX/ħDVu"J{@]-α_OgsqS"{)Ew:~%=pOw:~%=p-W;#N8%VBI[%Ghic,jeY E iV-B (PB (PB (PB 2t#2622*/Vł XB,>|)J@ B$(/-q*bUkUPԣTҁCFw$(RQDiJT*jPQ\Y%VBRR#J3qT`:u-[%VBRR#JY2tZJbb UPJո断.P*"2t*]X9XKR#'JLK2Uk)u*DdQ&N`K2Uk)u*DdQ*0uVd(RTҕ6.THK2Uk)u*DdF#uc7 F*]X9XKR#'J58Uk)u*DdFyX(qQ$(RTң,Jb.H*2¦˜XKR#'JUPԩFX0qkk$(RTң,*rJb.H*2ĎIUPԩFXRZ9ZL:XKR#'J9z#WZtlZ ]J:Tez ]iUk)u*DdI*h*"2tΣ,F;2Uk)u*DdI)-&NcVUPԩF ,M,NHJb.H*5c 0.te%VBRFN-/*P^d(RTңVL:¦˜XKR#'JY2qQ#R*"2tՓ'tL:*"2tՍ:Hܩ$(RTңV4T`NጕZ ]J:TjƊq#PخJb.H*5cEFV(lY%VBRFN\H6IUPԩFh8 d(RTңV4T`CnIUPԩFh V*uTZ ]J:TjƊpnZ ]J:RՍTL\7TCUk)u*DdJV4uRE d(RTҕ6hꤍUPԩ*mZFBJTUPԩ*mX\J˜XKR#'JTڰR#WZu*"2tM )R2TE*;%VBRFNar*FXZ ]J:QXrҦ˜XKR#'J1nZ5u\XKR#'JbՃ"2tΌTsVBRFNd TsVBRFN\u`b.H)SjJTTsVBRFNb7V3q@ܴbՃ"2tQу[YVBRFNj9Zu­b.H*2y[*(RTң,*hʵ"2tNZ ]J:Teb.H*2¡ʷ*(RTң,HZ ]J:Te%Ӭqjڵ"2t R5uLլPԩFXq`֝0[VBRFNҦ˜XKR#'JL2jScVBRFNҒd8mZ ]J:TjRT(RTңV0pJUk)u*DdQ8*0vb.H*5dӬ*hʵ"2tՓ'ub5)1XKR#'JY2qIikӬXKR#'JXQʚ+.rb.H*5cEFլPԩFh8 (RTңV4T`ubŕk)u*DdQ*0uĎ:CaUZ ]J:TjƊq#Pضb.H*5cEFT9VZ ]J:TjƊpbUUPԩFh UPԩ*mXDuK:Z_VBRFNcGU$Pb.H)SjƎHэZ ]J:Rդh.TMZ ]J:RՅʔ*hʵ"2tM )R5u\XKR#'JTڰR#%M\Rck)u*DdJV*RhyJլPԩՌP7-*hʵ"2tWZuT*(U断.Pڵ"2t*]X9XKR#'JLK5k)u*DdQ&N`K5k)u*DdQ*0uVj(RTҕ6.THK5k)u*DdF#uc7 F*]X9XKR#'J58k)u*DdFyX(qQ*(RTң,b.H*2¦˜XKR#'JլPԩFX0qkk*(RTң,*rb.H*2ĎUPԩFXRZ9ZL:XKR#'J9z#WZtmZ ]J:Tez ]ik)u*DdI*hʵ"2tΣ,F;5k)u*DdI)-&NcVլPԩF ,M,NHޭb.H*5c 0.teVBRFN-/*P^j(RTңVL:¦˜XKR#'JY2qQ#R"2tՓ'tL:ʵ"2tՍ:Hܩ*(RTңV4T`NZ ]J:TjƊq#Pخb.H*5cEFV(lYVBRFN\H6UPԩFh8 j(RTңV4T`CnUPԩFh V*uUZ ]J:TjƊpnZ ]J:RՍTL\7TCk)u*DdJV4uRE j(RTҕ6hꤍլPԩ*mZFBJTլPԩ*mX\J˜XKR#'JTڰR#WZuʵ"2tM )R2TE*;VBRFNar*FXZ ]J:QXrҦ˜XKR#'J1nZ5u\HXKD OYeY XYeEhV,eYe, - e`X-eYeYdV,,,bk,,"R#'CU1(|A@ FዿsT:9"O_BJVoP[|<! @6+ @<;= N"q7N-q:o'.s?'7p ~_N p8=p$!`( E!E 5sg  "BB&B/pD&8"?!~_"`JDDw @@@@AA @-a;_2@@ ,(@ |(A& „XPU (a@i (P!BAp!? J!M ^#CCA E‘RG(0a#,) >KR C\): AR aHC‘"!Ȅ"$ȐH!D"w"3ȍ%"r k=ȁD? $ I?E#cdedw A;!d!_NAğ'NIaʿ8c˿;uf'pLNpuN bp._# 0FI1~Fnu0a&_p" "g"O!E_8DCf@ e5`DD"x8q@PG 1@ @"887у[YG+]pWG+BPnVVy(֎V ʔ֎Vy(U fn, ]qacMW +.rK,,i=A`K5M8J+ NA`K$`T TrJ, * TrJu0 *]X9%Un8bՃPMV'NūzVIB9z#WZtoPX1R(YX5uLVIPu&n,u`-  uV *]X9%#R6JG *]X9%ԌZHպVIEbAb5# [ibubՃQXU,Fbbu.źjC#*RT,u`V y{nڂVIEa^/0t0m[,u`Vj Fam-tpڂVIEh5y [ibuA`K$PX:1XRŵ. @2qOPX1R(WSEeZtW:1RͧJ+.pWub5)1:1R(Ihi2tZK$ӣ7&NcVNTrJu RTBQ_V0pJ^Y(+Fhn(.- BPI V,ToP[RL:Ŋ-+%ޡXX :cEj~Z5!•@IJN[+% =BjF }BTZ5# - BP/0thd`V Egay [ibuBQXV:3T4T`zdgPhKKʔBQXU+8񣁒uY([+8nY(u Ǝ4 P\+%}B'X/([+%B'X P\Y(P 47 8Ӯ-ޡY2t +.rY(P:u.+&NaSEed*]&NeBd TrJ+'ub5)1+&N`K$ΡY2qFn:Bd TrJu ɓTNK]&NgVL:VIEBT)4V\Y(W+*0uV}BT)4V\(+*0u]V4T`. Ɗqb5)1+*0uVIEcEFV(lWV4T`.ZcEFV(lYV4T`.u Ɗq#PUV4T`.mB\H6-+*0uVIBB\b%J ƊpbՃPPh *ܨV4T`.+*0u•U:K$nXQ +*0uVIEg/VJEuՒ Fbb}CeEգR0qk4jCeBCeѩ*P^Ŵj/VJ-6^TVdPzjFy[-[/VJ/VH8۫j/VJj/VHŲKj/VJPzjF-8ndnhԕ(/qk[/VJ+?PzjJ֋ՍVd]Ceѩ&NbF6^V,lZ5$ӬHku %U HndmCeF+*XlY(T6^/0t`C+iյ %u *P^Ŵ}CeEaeCeJZX^RQZPzQZ ՅV6ZlY(-lX^`8۫}CeE/V:1lRPzQ`ayU VdeCeJ֋խ/VJ, /V:TŮ^h⵾dmCeIXdMPzd$ihh⵵ %w[V4uQ1pRmY(ڱ(SmY(ڱ4cmY(UmZFBJT[mY3n.RudڲP \ ոmՒ}Փ:v-ڲPڱZ+8VuaqŃW-uՒ/0tjnjEbՍucJV\mY(YڰR%M9Vn.THK>jJT4V\(uar*FjJTTrJ+mX\J.&NcVmX\JVIE )R2TE*;.THK$VjJT/&NcV[V*RbՃQnjJT/)TՅʔu`f գR0iֆ/['VJ+ ՌX:Qg0NŊ-'VJsF :cEf Ւ{uhԤZ7[%ѩXbۃudX^`EuudWpn/0tbb}Qopnf⁹iSEewA7pnf⁹hK=M8J+7V3q@ܴjNnZ1R(Xrd{uc7 F*]X9%K_+% ]qacM/PVJ,;+% yzQoPz/PVJ +% urdgpn^^A/! E/l^&}ZEF$^ylrE݀bE6 ";6 "[̋[""hE[$"5"` 6vEv/.1$^ H`y$^;" `x,q^l]nx`x/^^ dEA"gD^ 6]xwȼ<E` ȼ$^6xE`"x{^/3H H!gBB/y/^ DD^s1cv3tCvY>EgBr.:>t("Фu.:ȻyA`:d]2.: 3]~t:|0΋.:v sYq`mvvgPvIȻс`:]yD]s"FD]<̋t:΍Ң.,΂r.؋g@"E s`@$ESv~tSvtgKH: :\E$]:gVvu.:΂.;Θvtd]{3"*"]:jE9`!gM:nE+"9XE s.t:.t:s,ȹ&t5"DȹП: HУ:I:tvEΊ3#΂.t:<"OC.t[$\ 2"E9苝g@ "QgA:2΀)΃B.t:B.tm\c.u6t;"S@-·\vt\9"]΀1΃.t::ts |<"Aft\="CL :s:$\:_\se:gB : dE΃LB"At\wd\y:sY3"AtA"At\=΄R.t=΁:: cHЃs  Їs"\|I$\|M.>ċ1"⍀2"{lԋC.>0l2.>Sr.>Uay-.w` ȸExE Hq $\|R.>;R.> .>41"t9.>!{1"@ HBΐqtrPE I W 1"rYd/΂2.@gE\5091" $\@L HE rw.@2bE! R.@ gOr.@ ċ\p:,"tZE1t+"`:"91" $\#$Π"踋b輋h6 ",pe.l p6jE5y1"1"t Fu Yr.\# rbE0[.p9Ρ"2Γp: Fċa@ HFLE0wBE0y'"= FrbE0.LpAΡ"EΓppI. bE@:\$g:9 B.  1" :\$EBEAt; dċbEBp^u  Γp`4"!@ HH 2bE@:\$ sHH s\$\$bE@g.\p;Ρ" y'" 9 HrbE@ $\$3LE@BE@'" C K H2bEQt J$Ρ"(:NEP`4")@ HJI.sFET2.󠐋v6ERp $\% s.΁9 SQp`p $\%3 GYp:2"(,ΌȸJ`pw.pgJHJgF\%yҢ.Mpċ $\%NEP{p=΀D`$\%y1"(D B.t1"< u1!!! bEBrFtSrLa!?  r@ H:ZEJsgK`\ $\ $\r.Bg'"/l\~@ Hi.B sLEGy$\Iȹsri.B rbECrsBEAtЋr $\!g@<.B3\A  $\B"LE!>u r.!g`4"1"n@ H_b.!CBE# 9 m.! rbE)LE%$\B]'"{.!dċAft ~u r.! vB.!rbE $\B LE :AtCЋA@ HdċCq>Ρ":NE!`4" $\BrbEgTs9d\:lR.ysŒsę&"Ps9<`4"dċdċ*΁1<6Ρ"9<`4"ċw $\t 糨Ht7  $\-< LE9$\2ΓshEy1"̀s:\;Ρ"t<rbE,s:\BE\9}Ћ&@ Hdċ:lAIbd{\E p6/c ȸE3"le.v "m6@ HO.˳p6:jE۹f;"l $\ ̀p6gM s\ p6;ȸbE3`:atԋ::"ld{.܀p6 gAaa:r.uya` ȸ." "!&t4"!6td\D\DG."$ s ΀EB-"$;.")dċ\D:jEI."-ċbEC$\Doq,΂."_b."ċ~@ HgAyY:FE|a\ll $\pOb.$\˳\\@ Hp_BE|4Γp vB.@ H,py&"> 3H\9`4">bE|dċ{}$\ p;bE|A.& ΄".&!΀ԋYІEM\Eċ1"bL ȸt"q0:d\L`q2,q0 $\LUxR.& s.&M.&W.&w $\LgHu\Loȸ5܀q0/μEtԋttEH;1"`uR.&x>tE $\LbE:\L Pq0EΓp= dċ6@ H 3LE9$\ 3\\ p<0΁1ȳHgIȸ) M.ċp<:s\\ċY.Lp<Pp< s\B.p< bE5΁1u tsp<rbE{. p<sHYr.hE $\dċt gPp>&Γp>\ċLp>-A\.ȋp>U.|𘋁݀^E@ H3|HE>H@ H1"|g^"|:Κp> .Hy1"|"dċ $\\pA1" $\bE $\ bEO.p@@ H dċ<p@I.ċn@ H v?pW\1w};Nwc%+ZAlc(dVccoo?u7:X-uc7?_cOu αα?#uSuαt%:ЧBIuX:iucX:αt?X:XXXc|X[u?X#?Ou1:α@α@ ?α@Ouα@]uα@c:: α@X ?2`CuYu αGfX5uX?0wu@:Fo!?Ag?A?A?@Qu αX Auc$X ku((?X Cα:J;:J ?α(?αBc?αBKu:gu cc<:c_XA/? Qu oG?Xccu7:_@焿X<X<cX<瀯w?:c?α?c α_Xc-:w?C:Cu#:]uau auwu ?α"?pc αcOp_X? α??α αOw?`?α,:L_?`-:L?`cFCuSuUu?cF?`X?`+: α$;u cH-:eu#XW?Ā:?ā PPGu(POu*@+u(qu( α%w?ġt?TX7.cT:RŎ9u{ȭ)bc:_Xα αXα1:=tXXwu{?:=tX?αα?w?cwccXUu{|?X:=`Au{¯&&Ku{:=`_u{$:=`αo&?s??g??αc<c<=u{c<α?u{'?XG?Uu{αXO:=| ?αXc@α #:=c@X:=X?α α _X? o?X' ?αNSu{rcu{pccXα!":=Wu{α!Qu{ ? cBcB/@:=>:=A:=Ku{cDcD?X/u{ cDiu{Su{?c -:=@c ?eu{c ?cc?? :=@-:=@X(_? :=BAu{(:=B-:=BQu{!?XA?c! "αRYu{'X); ! <:=BODGu{Ȑc α?"]u{ȃ_Dw?"GDX;u{??Xα+α _ α! ?α(:=p?α'?o :=pc8Xu{":=*:=eu{)u{α#30cFα1P^qG Җ,qϝ rģEiK8N9Qb! rģB" rģA?N9Q %ip J?D/<8c~%"I‰p J?DWٝ rģF gq(q(#w1?s;Gʸ2 rģcN9Q3^ q(4 rģ`ǃYp J?F^9Q0yp J?F3ASA; rģ%w1?w1?= rģӸA> N9Q`A rģSAosA8D rģ{p J? .gq(0 63AěA 8c~%0M" rģF`I;G;ip J?e<8c~%0* 'q( 8c~%1w1?6q(v 'q(`8c~%0- rģFAE/ rģ3A p J?H N9QE[)p J?H`w1?SA8c~%$G`1 rģip J?H69Q&l8c~%Hv q(BMsA l;;G?`w1?$Og;Gq(@ 8c~%H;7 rģ , rģ Uw1?$i;Gk;G B}[;G Ep J?JQ q(+{8c~%%2SA;8c~%%;w1?~4 rģ/A8c~%@9N9Q$=s;Gw1?!V; rģH 68c~%CM{;G5gq(q(}w1? =3AB rģ BM;G'q(P`A rģ C ;GY8c~%J 3A(:C;Gy8c~%Jw1?%tM;GC q( 'q(9Q%*Ί'q(Hq(ΒN9Q% q(:- rģJ3'q(:/ rģ* sgq(ф8c~%P9SAEYє8c~%RL8c~%Qtw1?7΍q(t1 rģ*K:w1?9A@i- rģ|gKq($Ϋ rģ|:8c~%l8c~%9p J?N9Q>gGSAπ:o;G 3w1?q(t4 rģ+gCYp J?Nt9Q8c~%X_AngCp J? A8c~%Xs8c~%X1΃9p J?tN9Q: gq(mq(s8c~%c9s;GX:q(; rģ,gA8c~%`= rģ,w1?A8c~%` 8c~%at 9Q s w1?T'΄9p J?P[A¡tA rģ3w1?T9Q n>A;G*>C;G*V>" rģw1?Tsq(@k0ŢL9B! `pBEIUE`ZJ/)*>@CKd+V,Z->X OB (PB (PB (PB (h2Lld\\Z ϲ'qb |VJ|XJ|ϟ?%T:RŎ9%,XF )uŒRŎ8jP(hn䔱c%FA{J-,qĩFX1R̔c%H)3.K8TңVL:Vdq*DdQ*0uVdq*DdJV*RbՃ)bJ:QXrъVdq*DdQ Y%,XR#'J$q*DdQ#R)bJ:TeCnIK8Tң,H鄔c%H*2d]iRŎ8"2tn,Ӧ dq*DdI*h)bJ:RgQ#R)bJ:TjRT䥋q*DdQ8XсsEC))bJ:TjƎ4A{,qĩF:uM9%,XR#'JY2qQ#R)bJ:TjɓTNK]&Ndc%H*5cEFR7*h)bJ:TjƊqb5)1,qĩFh8 䥋q*DdQ*0uĎ:Cb)bJ:TjƊq#PU%,XR#'JXQ$qՊK8TңV4T`CnIK8TңV4T`+:JXFN\&%,XR#'JTڱ(tJXFNcGU$PJXFNcGU$hJXFNi1 )S%,XR#'JTڰR%M9%,XR#'JTڰR#WZu)bJ:RՅʔ*mK,qĩ*mX\J*;%,XR#'J1nZTYsRŎ8"2tWZu+[TĩVZ*wTĩVZ*"2tQу[Y%qKj"2tQм8ۨT6;R#'J5 Ca%VBRFNj9ZuJ'q("4J *Pl;NQDiJT*jR(lpJ'q*DdQ Y%Nj"2tfn,XKR#'Jf`^V+[TĩFXTYsT6;R#'J$(RTң,*h+[TĩFX1R̕;NTң,u`Jb.H*2Vd)mRwFNb5)1qIJ:TeԧpJb.H*2jSc%qKj"2t-md;NTң,8Uk)u*DdQ Z+[TĩFXT9V;NTң,*rJb.H*2¡ʷ$)mRwFNbGL$mRwFNbGL$(RTң,H鄕-NQDi@T6;FIUPԣTҁCFw$)mRwFNaIhi2tZJ'q*DdQV'Nūd(RTң,)-&NcV\Rڤ%H*2d]iT6;R#'J9z#WZtlZ ]J:Te)Ӧ d)mRwFN`^ŃWZtl;NTң, ոjN-XKR#'J/V:`J'q("4r.J'q("4r.Jb.F.T`I\Rڤ%H)3M9%Nj"2tΕ4V\Z ]J:RgJ+.rJ'q*DdIu`J'q*DdIu`Jb.H)3.\Rڤ%H)3Nጕ;NTғ:UPԩ&ub5)1IJ:RgJKG+IXղT6;R#'JLIhi2tZJb.H)3%Ӭqj+[TģTҌt*X8&NcVSڤ%Ff㠩R2tZJb.Ff㠩R2tZJ'q*DdQuKSKR7qIJ:TjRT(RTңV'Po%qKj"2tՌ,hҢ;NTңV0pJRUk)u*DdQ8XсsEC)+[TĩFhKKʔ*wTĩFhKKʔ*"2tՍiiyR;%qKj"2tՓ'N$mRwFNd4V\Z ]J:TjɓXTYsW;R#'JY2t*]X9qIJ:TjɓX1R̕Z ]J:TjɓX1R̕-NQDiQ&NcVSڤ%Fd8lZ ]J5H*5dӬqj+[TĩF8KNጕ;NTңVLbeԧpJb.H*5d*]FXJw d)mRwFNd.IY%Nj"2tՓ'tL:*"2tՓ'tL:+[TĩFh FM9%Nj"2tՍ:Hܩ$(RTңV4T`#r˜IJ:TjƊpbՃ*wTĩFh*]X9XKR#'JXQ Ts%qKj"2tՍ:2jSc%Nj"2tՍ:2jSc%VBRFN\FXJw d)mRwFN\H6+qIJ:TjƊq#PخJb.H*5cEFV(lW%qKj"2tՍ:GXd;NTңV4T`ubŒUk)u*DdQ*0uĎ:Cb+[TĩFh8 RT6;R#'JXQ$qՊ (RTңV4T`ub©+[TĩFh8 dmRwFN\H6-XKR#'JXQ$qՊ\Rڤ%H*5cEFT9V;NTңV4T`CnIUPԩFh *ܒIJ:TjƊpbUISڤ%H*5cEFRS(RTңV4T`+:J'q*DdQ*0uaT6;R#'JXQ ܒXKR#'JXQ ܒIJ:RՍTL\7TCT6;R#'JTڱ(tJb.H)SjƎ&.X+[Tĩ*mXI)qIJ:RՍTB*"2tM:"2W;R#'JTڱ4c%Nj"2tM:#F2Uk)u*DdJV4uRFd)mRwFNi1 )S%Nj"2tMHш\J*"2tMHш\J+[Tĩ*mX\J˜qIJ:RՅʔ*h*"2tM )RTYsW;R#'JTڰR#.Sڤ%H)SjJTTs%VBRFNar*F*]X9IJ:RՅʔӮISڤ%H)SjJT]i$(RTҕ6.TH֝rJ'q*DdJV*RdU,vJ'q*DdJV*RdU,vJb.H)SjJT6qJ\Rڤ%H)SjJT/)T*wTĩ*mX\J*;%VBRFNar*FX-NTҌFn(4V\;NTҌFn(4V\Z ]J:QXrҦ˜IJ:QXrъVdmRwFNb7V3q@ܴbՃ*"2t.\Rڤ%H(nf⁹h֝rJ'q*DdF#uc7 FUk)u*DdF#uc7 FŎ8jPQ\Y,XFK8QDiJTbJ:Te.8Tғ:1Ṟc%H*5dӬu`XFN\u`XFNar*F*]X9,qĩՌP7-u`XFN`ŒŎ8"2t +.rXFNb5)1,qĩFXT9Vc%H*2ĎK8Tң,&N^H֝0[,XR#'J/V:`XFNҦ˜,qĩ&ub5)1,qĩF ,M,NHXFN:TT2,qĩFhKKʔbJ:TjɓXTYsŎ8"2tՓ'ub5)1,qĩF8KdK8TңV4T`#r˜,qĩFh#RbJ:TjƊq#PخXFN\H6,,qĩFh8 RŎ8"2tՍ:GXlc%H*5cEFT9Vc%H*5cEFRSq*DdQ*0uaŎ8"2tM:nbKKq*DdJV4uRE eq*DdJV4uRFeq*DdJVR2Ŏ8"2tM )RTYsŎ8"2tM )R5u\,qĩ*mX\J.)TbJ:RՅʔ8^RcŎ8"2tM9,XR#'J1nZ5u\IJ:QhŭqIJ:QhŭXKR#'J58;R#'J5 CaNj"2tQм8ۨk)u*DdFyX(qQ.)mRwR#JT¥ Ӹڤ%FA{J-XKF*P^R n)mRwFN`Ŕ6;R#'Jf`^Vʵ"2tfn,IJ:TeM9Nj"2t +.rb.H*2¦˜IJ:Te.Ӹڤ%H*2Vj(RTң,u`'q*DdQ#RwTĩFXJw j(RTң,F;7;R#'J`Sڤ%H*2[YVBRFN`ŭIJ:TeCnSڤ%H*2¡ʷ*(RTң,*r'q*DdQ$t'q*DdQ$t­b.H*2Ď\Rڤ%F 0NjjP(hnZ ]J5H(4`7r'q*DdQV'NūimRwFNaIhi2tZb.H*2’d8m-NTң,&N^H֝0[Nj"2t R5uLլPԩFXLB:`'q*DdQX5uLӸڤ%H*2[ڵ"2tn,Ӧ n)mRwR#J*0R)mRwR#J*0R*(RQDiBF ]qe-NTғ:TYs6;R#'JLSEeUPԩ&t.)mRwFNъVimRwFNъVj(RTғ:1R-NTғ:Ӹڤ%H)3NZ ]J:RgQ#Rĩ&tr:u-[Nj"2tΔV'Nūj(RTғ:RZ9ZL:IJ5H(ARd8m;NQDiFn: ,'Nūj(RQDiFn: ,'Nūn)mRwFN'T4:#zwTĩF ,M,NHޭb.H*5`N`*ibu F;R#'JXƌ **Sڤ%H*5c 0.teVBRFN:TT2IJ:TjƎ4A{qIJ:TjƎ4A{XKR#'JXƖ(/qQ;R#'JY2t +.r'q*DdQ&NaSEeUPԩF:uM9qKj"2tՓ'NbՃwTĩF:u.լPԩF:u.Rڤ%Fd8m;NQDiQ&NcVլPԣTңVL:IJ:TjɓTӸڤ%H*5d*]FXJw j(RTңVLbeԧp'q*DdQ&N1R;m-t:u6;R#'JY2qIikӬXKR#'JY2qIikӬIJ:TjƊPnTYs6;R#'JXQʚ+.rb.H*5cEFR7*hˊ[TĩFh*]X9qIJ:TjƊpbՃ"2tՍ:K7;R#'JXQ#,F;46;R#'JXQ#,F;5k)u*DdQ*0ueԧp'q*DdQ*0uĎ:CbwTĩFh8 (RTңV4T`ubw;R#'JXQ$qՊSڤ%H*5cEFV(lYVBRFN\H6,IJ:TjƊq#PUNj"2tՍ:GXb.H*5cEFV(l*IJ:TjƊq#Pض'q*DdQ*0uĎ:Cbڵ"2tՍ:GXm-NTңV4T`CnSڤ%H*5cEFT9VZ ]J:TjƊprˊ[TĩFh V*uU;NTңV4T`+:b.H*5cEFRS)mRwFN\&Nj"2tՍ:0ʵ"2tՍ:0ˊ[Tĩ*mXDuK:Z_Nj"2tM:nbKK(RTҕ6hbấ-/IJ:RՍTBwTĩ*mXI)XKR#'JTڱ(SqKj"2tM:#F46;R#'JTڱ4cVBRFNcGU$h'q*DdJVR46;R#'JTڴʔXKR#'JTڴʔIJ:RՅʔ*hwTĩ*mX\J˜XKR#'JTڰR%M9qKj"2tM )R1R;NTҕ6.THK5k)u*DdJV*RbՃ[Tĩ*mX\J:;NTҕ6.TH֝rb.H)SjJT]i.)mRwFNar*FJhRimRwFNar*FJhRj(RTҕ6.THSmX-NTҕ6.THKqIJ:RՅʔ8^Rck)u*DdJV*RhyJRڤ%H(nf⁹iSEeSڤ%H(nf⁹iSEeUPԩՌP7-*hˊ[TĩՌP7-u`'q*DdF#uc7 F*]X9XKR#'J1nZ1R-NTҌFn(]i)mRwFNb7V3q@ܴjNVBRFNb7V3q@ܴjN,XF )uŒŎ8jP(hnc%FA{J-,qĩFX1Ṟc%H)3.8TңVL:Veq*DdQ*0uVeq*DdJV*RbՃbJ:QXrъVeq*DdQ Y,XR#'J%q*DdQ#RbJ:TeCnK8Tң,H鄱c%H*2d]iŎ8"2tn,Ӧ eq*DdI*hbJ:RgQ#RbJ:TjRTq*DdQ8XсsEC)bJ:TjƎ4A{,qĩF:uM9,XR#'JY2qQ#RbJ:TjɓTNK]&Ndc%H*5cEFR7*hbJ:TjƊqb5)1,qĩFh8 q*DdQ*0uĎ:CbbJ:TjƊq#PU,XR#'JXQ$qՊ8TңV4T`CnK8TңV4T`+:XFN\&,XR#'JTڱ(tXFNcGU$PXFNcGU$hXFNi1 )S,XR#'JTڰR%M9,XR#'JTڰR#WZubJ:RՅʔ*mK,qĩ*mX\J*;,XR#'J1nZTYsŎ8"2tWZuˊ[TĩVZwTĩVZʵ"2tQу[YqKj"2tQм8ۨ6;R#'J5 CaVBRFNj9Zu'q("4J *Pm;NQDiJTڵjR(lp'q*DdQ YNj"2tfn,XKR#'Jf`^Vˊ[TĩFXTYs6;R#'J*(RTң,*hˊ[TĩFX1R;NTң,u`b.H*2Vn)mRwFNb5)1qIJ:Teԧpƭb.H*2jScqKj"2t-me;NTң,8k)u*DdQ Zˊ[TĩFXT9V;NTң,*rb.H*2¡ʷ.)mRwFNbGL)mRwFNbGL*(RTң,H-NQDi@6;FUPԣTҁCFw.)mRwFNaIhi2tZ'q*DdQV'Nūj(RTң,)-&NcVRڤ%H*2d]i6;R#'J9z#WZtmZ ]J:Te)Ӧ n)mRwFN`^ŃWZtm;NTң, ոjN-XKR#'J/V:`'q("4r.'q("4r.b.F.T`\Rڤ%H)3M9Nj"2tΕ4V\Z ]J:RgJ+.r'q*DdIu`'q*DdIu`b.H)3.Rڤ%H)3N;NTғ:լPԩ&ub5)1IJ:RgJKG+IXմ6;R#'JLIhi2tZb.H)3%Ӭqjۊ[TģTҌt*X8&NcVӸڤ%Ff㠩R2tZb.Ff㠩R2tZ'q*DdQuKSKR7qIJ:TjRT(RTңV'PoqKj"2tՌ,hҢ;NTңV0pJUk)u*DdQ8XсsEC+[TĩFhKKʔwTĩFhKKʔڵ"2tՍiiyR;qKj"2tՓ'N)mRwFNd4V\Z ]J:TjɓXTYs;R#'JY2t*]X9qIJ:TjɓX1RZ ]J:TjɓX1R-NQDiQ&NcVӸڤ%Fd8mZ ]J5H*5dӬqjۊ[TĩF8KN;NTңVLbeԧpƭb.H*5d*]FXJw n)mRwFNd.IYNj"2tՓ'tL:ʵ"2tՓ'tL:ˊ[TĩFh FM9Nj"2tՍ:Hܩ*(RTңV4T`#r˜IJ:TjƊpbՃwTĩFh*]X9XKR#'JXQ TsqKj"2tՍ:2jScNj"2tՍ:2jScVBRFN\FXJw n)mRwFN\H6+qIJ:TjƊq#Pخb.H*5cEFV(lWqKj"2tՍ:GXe;NTңV4T`ubŕk)u*DdQ*0uĎ:Cbˊ[TĩFh8 T6;R#'JXQ$qՊ (RTңV4T`ub«[TĩFh8 imRwFN\H6-XKR#'JXQ$qՊRڤ%H*5cEFT9V;NTңV4T`CnUPԩFh *ܸIJ:TjƊpbUSڤ%H*5cEFRS(RTңV4T`+:'q*DdQ*0ua6;R#'JXQ ܫXKR#'JXQ ܸIJ:RՍTL\7TC6;R#'JTڱ(tb.H)SjƎ&.X[Tĩ*mXI)qIJ:RՍTB"2tM:"7;R#'JTڱ4cNj"2tM:#F5k)u*DdJV4uRFn)mRwFNi1 )SNj"2tMHш\J"2tMHш\J[Tĩ*mX\J˜qIJ:RՅʔ*hʵ"2tM )RTYs;R#'JTڰR#.Ӹڤ%H)SjJTTsVBRFNar*F*]X9IJ:RՅʔӮSڤ%H)SjJT]i*(RTҕ6.TH֝r'q*DdJV*RdU,v'q*DdJV*RdU,vb.H)SjJT6qJRڤ%H)SjJT/)TwTĩ*mX\J*;VBRFNar*FX-NTҌFn(4V\;NTҌFn(4V\Z ]J:QXrҦ˜IJ:QXrъVimRwFNb7V3q@ܴbՃ"2t.Rڤ%H(nf⁹h֝r'q*DdF#uc7 Fk)u*DdF#uc7 FZ+.q*DdUum֊˜J:U-"2pJ8۫E8"2tCEe%H*[J8%TV mբF+ac,,ȴ& eYd*`Z,!`X Ea`ZYYeYeEl,,V-,,+ dj%TV mդ0G@.΋"o]p9*vkÝ_В["$:7>pw8CP)qPQ(TJu mK=B\XIEyxܽP)qQf኷(/qKz.KZKNP)qQn\Xb-X넢LEy Ƚ ȼ_r/Cr/pp\'"yW ȼmr/ xNENENE%,P\ዿcu"JVoRu`ܻuc?/.?(w1?\w1?rp J?gē9# # pD`QX(qV J)PY ղ,OgP(PB (PB (PB (PѓdّɐQz,gϟeNŪ)dO>~Ee%FQX(qVhģTҩhŴT*Pn .V\QDiUum֊˜J5H*[J5H+6@ Ũ3,,ȴV+@l,->k,,`X->}YYeYeEl,,V-,,+ ec'TV mդ0G@)lj~H?6 ]WÜ_%Nӭ| ڽ_|F_BJVopM6H?d'GXW! +ژ4Ւ.ЛL+=>  (@fZT v/>φ)9qiS`/Ek'9ۋJx.ɍ$ Vuo53$]Jjfy"0xf}ԁ6*$]DHhrLo$]6|܍{ShMHX^P6*$]DHhz6>ҁy^EאJmJvLm3y51ЛP<`tF ^j0y "$@b$ /j/yB51LQk&ςך>݅P.L:|1yvk b2=0?LXcki:Pnd'GXW! KKWKjZ$]EϷB|6׃yiCh1Hrdj6X@4LW@FBm M^jZK4^@>n  u:uJf"eEMirWzBx7ʁ\f P&?b63!FoYg:qT^̄ *$!p?kK^oE &$]H+nmoׁPE RMʞjZ>n  u:uJf"eP6$l כ/jRz$925^`H&64&TQ>iLIdҔ FOPMaz}樊!ɑ/P:/O`H&64&[5Dtkڌj0$]DFICTFDkch'ЛDHhrQ^ox҅z}^n@dB@w-(|&F5.ɍo5nz\a tF&(|&Fڕ.u MOPx7F&^yȑvLme'4i/O< C;C#W2<;gIJŪK̄ *$!e{Sɍ/51yua L^n@P!E5@Tؐ\fgVPЛDHh6$]AP܅{TO7j0xb3\+&aEQ< h tF&x7 DŽbB`$> !ɑ"&yXbS4 3&6j5h}^n(^ L^n@`T: dLP< " jp ^bZfB><>'gIa?`BFfBtx{Nt^Ե楤kchάv"@EǍ%p_`HTHcS6' + d{TkciKP<񤴡q!ɑ"-y ڠ#]Yy4>&F&σǚ\O1#730y!uEFfBtx +ؐwkL^jbPA{Tk&3LJ0925EW흯j/xҁP!ɑ^70pհqO36/j/y4xu!^i<:ʇBAqlBS4fcH҉2ךQ.Ђwφޅa>h|3 R4f"eE5B}^4L>:}D`V/x(>KLGLJZ=|AgI:PX;̄>ױ! (kڠ$]y&׵Rq ⸠ͶIWBF&6ךyvLm56*$]B"i@PQ925@6`W}pq y C9925l04Ś`> C#WyP51LT/7Л>fT۰E׉O^bZfB><>'G?LAZWJ˒0/WnÜ < xX06?m_(AڿC j:>o8Wi;̊0XۂEE KT6T\Tj(+,qC@RȬVȬ- EXZȬX. ak+Sn\#l?Z+xJ T-T [mC®YruUuF)Zi(m\eQX(qYbjmu (R%PP%mD;@RN`Yȥk"V;Dcqy F?)@ B15gAŜh#"1|\F?x@q _c4C>t1#@𔓂#JR#@c ~(8=Pp{!) bEƂ1BI!!؄xAxpFp{<xANEۼlEُf|1"m".]1fYӑp6p6r.^ b.Þ|egń\ N\ |ZEyu².b.@E{< |^EDLE^XEA qC\D9aAs\nJ.p#T:ڹ}_"Rh>H?%/pkα+XKX[hS]Xj?U Sw+NQα^ڱXU(Nc^uαuasXVXKXUP?Ul_*V6s:J[T*+8cj $)c~w(Ac~w* Ŋ3rO B (PB (PB (PB :FI P\PV|Y,ZROO O>|]X,p*k)uRU4QX(qVT^QX(ዢE`J^+eSqT^c'J[4QX(qVt*su4*ܬq]rc'TV mբE*N8۫PqC^+eSqT^c'J[i:Pn )V8uE`Z+ Ł[,,ȴVg¶YeY[,,`X->+eE`YeYe[,,,E,,Ŭc]XHi*ǘRNF:cJ.IS_:cÜ}BJVoLs?<^py6v~Nc]c 6~5 :CgEч0"AX&ElڢQrR\Tc]XHi+dt 2T8/ ah-+XXNϕub#qs2VQs)3Ne-Z*P\Vv[.ijQb Nb򶓲K X.gE`eBwCNʦqծPn.g4\.g+i;+\ RۂrE֖LrZV֖Lr˅ռ))T j .gZZɂ•@K-/VK]3PC.P6PK%(.['eJq8ۮ'3-ZHݟT`*/pRuRKR9e RK,eֆwSKR72ያeRS+.PN{n,Zʵ-qKRbU^A^C^"b/q1~&"𣉈&"Gyy'y&"oz&"z&"z.&"yOyWxۉ1b))b?ݏW\1w};Nwc:c jΘ?TX7.cK/ J#q(1'q(~C;c?rptI!\c]XHi+pm ,eP[,!h`V|-> hPB (PB (PB (PCFNdcfF&BBE8T>}A;TSSϟ%>|Rub#uV9JՊ֊n+Z FiUrk) !hVeYeY, eYdZ+ YeY Z+@|-eE`YeYe[,,,E,,ŌIzXUI0G@l=*OH+#9|*vkG#ҬJG?В[I3!:<Ə5HCA;{Qy" ؼW (}0Hrdj5hTPA1@@P#Hrdjl<9CLP&}RCP>!ɑ5ij/@Ѕ@ &> L[6g4(| @fհoATCǚy5RC#VǛa07P925yL^j/#]6&}Q^j/>0yCj9HrdjE1g4ޘ<5HgE:+^o$]E5k>eHrdjQyCj!HrdjQWDzEchEЌbt樞n@ ڡx䋲ciFO7kef1H3j'54O<:E:^j ڔ܀4 jTzg> Hrdj} / Ch)Hrdj}mo򗁄DPć&F5)y k!q3d1ԥeCE1T$925EjZr(`{RUAvzUo7>A2C#VǛa07B"@ Zd5)y6;4X ^jRyC=C#W#c;x?HC= L[Qb׊aPqBhC= <4iP@*zD&F5BfB><>'-4|!޳$/UkF4)Ufd'G{%z P<Ե{Qy"ZT۰%k6O5޽׵< DUoFH5܁{Q{E䋴&ώb63!FoYgXĥfBtx kؐpz ~Mך2 yW޽7/4,(|jC#V>8!ɑP/k>g}Ă0* L'oYE`vLy ڡ@u{Q+^r׵D6xѕkBLm@T/Q<:ș{T/5DzjFW:e gP.ɍe{ `{QA boB|X(|` HrdjQC;925E&VρV!Pn$ ^i7 (|aC#V>8@lB@ġ)LWB3h ^i7 (|A LW/jRzE5> &FHB4Y27j/@@ W"ʐ&VP&| "¥!P6D J@ճm_sL "t&Fך N6j/^ԩhHjT}b|H QaFI$ /j0yMϚCz/t4&F0ɉ`ZhCgI c-uRFi R`~E^Ą4P!A!Hl  /j愆/Ep(|@!ɑ"(y!Ɣ(p(|@!ɑ"Bڌ=%ƂGfkJO @n$3x{@f P!ɑ#摁Cf4&F5@} ڠy<:3&> 4<|8 mhHf|2(| ā LGLJD73 e68JXbUe'N̄>ױ! X…_j4v{r xtiX&6Y"ck/5.YEMa{PR4,`4{PT*!@> $925ll}5(|& LP&ʄ&Fڠ#]6&}Pi C9F{Qy D3b BrLWBFBm LXk CiL[zd`@;PD 4o@4  Ɛ/^ (^ @񭗁~|X^ [ WiB$925ll},$)C8iLQNyء$925^lPԑt 栽J"А\f$"C#W%K5*y{Y|t%&qCg}Ă0* 7d q1hfXPJ"А\f$J"FPJ"А\ eiL[d`@;P FIRXAyrPH.3mRn&FJ"ǚ/Q6BC#W%Kan&FJ<9x҈t$*ƒRZg%Hay,T*M J$925ll},$)C6jC#W%Hay,(xT4z}IRj@QƑJ4< Dk&#J^4^"yvLm<ԥHzyJW</j樞43&P|}gޘ< WH&6jY w4(|!!ɑr Rjv/xF. !ɑf`L0925@EjH2x7H0 925$\M׊aR0 &>$925ll|&F5N2݂R1C V{Rך(|!1C $925y!ɑK^bnfB><>'1dDQ){CFi Rp20qk=}/a1}3CPh | >>bD?$1 ;ā$8A=>HwbGG!7ď# $> "QXT-/(+-R^AXjiUk2b7/T.xܽШX  BhZBL"`*S"\- :-q(f*8蹑JHխJqrVŮ%Vc2)ZV%Z \J5)J:.dR5kEC؄RS>)[ibFi RiÎdRk8j3HR\ȥhE)x*% EdQY(XJ+% P+% EdQ(VJ,O YJ5)J:.dR\"%Xd`E̊VdRÉF4)UE̲)Z.dR^ģQBlpYdZԭ*l r%Vc2ȥk$k]Xk+C`>X#Bp{tDp{c$zS_=;*JVotG8X䥊(Rg?:JjRŎ9uou2:_X!u[K8?PȬX՟䥋sc%Zb.cc_XXVc?R+XV?c%Z-:J^zc%ZwuMαu`2+c%Zb αP+j?X`X` αKUn]:ՉU+qO?ҨTWXÿX ZX_uAISV`7: c1#߉gX`lBgX`8ca ;M pOAx]H8cďN9Qֺ*n)ăp J?9Q`!b@Y;G5ċq(@w1?ПA΁.$A΅w;Gb@_;GJQ_@w1?@e;GSA po8c~%b@i;cq y;cp~%=W@w1_Op~%=@ Ă 8c`=t;=XG@>XGtR^*-p^RT}J2(VYeZ}+> j(PB (PB (PB (PѓdّɐQz,gϟeNŪ)dO>~JjV7%R]Xk+Z,VV d֥qbK$mRwFi RqjֆIUPԣQBZU \u*U5%Zb.PJRQ!JWV4JXFi RqjֆIV \J5)J ZY%T҂(hĮU%qKjj3HR#V7rJbZ01ZnZ+[%ZĪjRZƝpn9ibFi RiÎK8j3HRc]ib(Zk8j3HRJk*XYhkIӬibFi RiÎ8j3HRc]ib(Zk8j3HRk*XYhkIӬZZUm,ZQXd`V˚ZQ!MZԥ)JՍ:sVŮ%Vc8q(f*#VŮ%.PU,q(f()ie%,T*֓YJIzX@5)JŮ4ԣQBZ,,,EдYeY V,!`X Ehge`X-eYeYdV,,,bk,,"[,hj3HRJ| @> !F~; ]?s}T: ~;BJVoMi2l! K{RZ Lj"MA6x\o1(}925EyPGO5VH6BmN{.yCY!ɑcͰL`BBchBT&РgVbP&Fg3x\o1(}J#c2< Cw ?LHZ.%-,;`'BF@H|*BYmQxAXje KZ.%HɈܽRFT rBaFB`X AhhV gdVJ@ȥidLxk dR;9 u~wP^`' Q q(;N9QaE̓o!+Z)q(f^RT}J2(VYeZ}+> PB (PB (PB (PCFNdcfF&BBE8T>}A;TSSϟ%>|*.:Khj3HRRQ!JPRUFi EցKF4)AKK)V \J5) 1`& BYeYeh, ϋeYdZ, +eYe, [,, ,,eYeYeZ-eYeYdV2rCiKU-tU1(| al H>ዿ s&$uO@ )Zտ8s`~E^Ą4.5-(}925$]$èm:@^"jZP Xt ԇ&F&r/ O5@T\\HfJА\f"g E5@} ڠ$]0mp<>'޳$0FƖ6ZRT^3!:<HCA;"^y% .aԅ&׵@{T$B:j(]/Ćm11y LT+ڋa,`T%IĂC6 ڠ#]6yiChC#UE䋴&,o^ ڠykƔyGLJd lRL}>0q:0|'БhVJ2jE KT.PV*.Tp`)jHʗAPn^#*]C{P!XX|TapZ.o@p#$"JE.>I?‚.>\|_‚.>0AAs\nJ.S_ q:RcV?]Xz?UmXu/u*V ˿X8c u&c8ov1MAx]|' QQA-‰p J?9QN9Qa|w1?L|w:~%= p~%=c p~%=L8c!cH@!`2J ҖZ+pm ,eP[,!h`V|->B(PB (PB (PB (P'H21#a!s!rj X* ϟ> ŋT*RY)a)ϒ>|BJt$w-Tұʖܒ*T80VRd\iceKU-uKEIZN)jhrCiKU-vƖ6ZRT^ҖZꖋܥ.Tp`)jʕ -T(eʕ -TXjRK]R{JZkZ/rR(R*T80VRPbЩ,,ȴXŢYeYi,bVV,eE`YeYe[,,,E,,¦Y.Tp`+IӬ%ULy>J 3Fu˹W]pî ~*vk\`m=IJ֭`(_2,ؐwåK^jZCLW@H&6^4xu>!ɑ,p?ԵC#VcO2C#W+#c2V*E`\+g_B18=|ۈrx<u‚/|)"i"k|LE%,P\ዿcp*vkwcB?%+Z>*]Xڱ c%JՃr?_93q'wu;Ģ?N9Q9p J?q8c~%}A;TSSϟ%>|(KU-trt$U.jJ\PZVY.Tp`+IӬ.Tp`+IӬ )K*+Jt*T80VR*T80V ʕ i:uP¡iYeYdZ L}YeE+>,eYe, YYeYeEl,,V-,,+J5)%ULy>J 3o΄;?ЂJ.A@:쒧i־t B#%IJ֭|=x̄4:^{DDڠy撓^+b삀;|iLWjRdoBP#Hrdjc29H?L?8)J5)J;wkؖjbf7{i)xĈ08Pp{T$`W<^} ڋbG>^d\#5ɇRX( 3&>( 3Bm LbZfB><>'gI1 ykSX`(f*8̄ *$!p?-@eP!ɑdpzE'> L׍aBӡ{aywB!ɑ dМgt44Hrdj3‡aB:O:Rk#c2?t B0"C2jE KT.PV*ZF4$2b7/T.xܽШX  BhZBL"`*S"\- 2 kiFi RTEVlpkiFi RTs,RG’.>I\|["88JX7cI+>t ĿJZЃ;$KkV>;?4:*uW* m?U8*,TuB*Unα'΄Ŀαc: ?;}1(.t ?(6΄p J?Ѕ;G:q(Љ;GvtA rģgB,8c~% 8c~%%N9Q*J³>C;G|E;GS'q(>X>uC!q9E lu"J{p~%=) pY!uA 1αğGISV`7uAkS J)PY ղ,OgPT!B (PB (PB (PB :FI P\PV|Y,ZROO O>|l,T_%VŮ%VcFi Rp20qke-u(fJ)ҬqRj3HR[MvJuģQB,vJJQ!JUm68qJJQ!JUm68qkiFi RT)F4)UeX85)J;J)ҍFi Ef*KR^*wXd`V˚ZQ!LQBubƣ4)]P^k\R*)F4)Umq\J5)JRklVcZF4"Dj3HRZ֩/V;]bX,,- Ł[,,EhZ-eYe, k,, ,,eYeYeZ-eYeYdV2dj3HRՍ+%ULy>J tQ 6^;ዿ9$u^5В[6x̄EHCA; ^ԵyxoV{ux1 pZRRC#VǛa07ռ4bbPHrdjRf&x|#ck@ģQBi_kB+% eEbK՗(+IF4)]XҲVR*$eKp^7/t*d+ ["L.EՍ+ecŊR Y2i h2ZE)N{1-'۞8=^x-|HE࿁))b?ݏ/ ]cc%Nӭ~q܃J֭}(Rg*Unαp cߝT8cO gq(=l8c~%5E8cB? $QBiY+pm ,eP[,!h`V|->B(PB (PB (PB (P'H21#a!s!rj X* ϟ> ŋT*RY)a)ϒ>|BJMIV \J5)Jƕִ \J5)Jƕ҆IF4)]Xұ@RQ!JWV42J5)JƕYhZ,,- 0YeYBeYe, L,k,,"YeYeYd+YeYeYL5)JŊ-%ULy>J [`? 6ዿsT:;|IJ֭x=!{߆ !B+%̲ڢQrR%˔4)\XRŤ2T8/HʗAPn^T,>V* AhXT.> S.,Xg*TZf <삖GNʥ%Þ)Z`ZK0Rу(Tō:RyyxI^&b/ Ž&"(.skA]p1?T:}d?JVo{Ru`ܻuc?/.?(w1?w1?wgspB8cOG(f+*X^RT}J2(VYeZ}+> L (PB (PB (PB 4d&F6dl2d.d.T^AsAYdjJY>+%>,%>|SϟFi RbFQB,Xb@5)JŊҍFi RbEV 2,,BeYdZ OYeY Z+@+̲Ȱ,,,+eYeYeBhYeYeYYZY{F䪓`>H΃7򝂟$b<9΢d;NO))ti9$kV`w,p?/jZRҦĂ0'<ed|O)gP $u){F-S,Ed[T^*.PV*ZYrR%Z7%l.xܽFT rBaBP-+X& SXKm)RU+qK)ŭP XFEN:بAZT-n`pP*RDd9V綩bnm68qm*U:ʶ-qm68qڅ Ů TV mT'qK 8TDd9V),PӇ"ll'1&"ȼmD^𘋰gaȻȻvg]vNȻ][As\n2 ]ccT:309kV?Vw rĿ3sߝT3J#nKZ73AWʧq(wJ^ѿNX/ħ[;A!je- J)PY ղ,OgPT B (PB (PB (PB#$̍L̅ʋը.q`+>|,w-PK'dńϟ>J|Q/qhޕje-T/qhP( 0YeYdZ-P&>,"Ш eYe,  Ȱ,,,+eYeYeBhYeYeYY/PV;[%T| @>X0` L< ?W\1w39ā_%Nӭ|&{ K$kV$*ą[x̄EHCA9p?W$1x3hM((0>dġVQC&Fڠ>یII4@JfhȘ5O MEPX^i@fhȘ5O Lڡ@^`g WDH&6!Po<o l!ɑcͰL+HrdjHBm<-y{TO5DHBl2@y!iH Cw ?L ~OwJ:Ws3!:< kآ^lQCjP.ЛD>,H<^b̄|x|OB3z=axnR#'J ZX9V̄4b{QFW@HBm MbDXn"y#2=?L?H+s2Nv%F5>+^" H6"O5@{QFoYg1D7qԩR{ UHCA;jZg.ЛHQB0!x3+ڠ$]PԵJZ)v$y"y@T&σ22ȳ|x|O)gIa?ȐRQBZ/s3!:<h'|vūژċ&R51(|"$925^ D|3Eǚ(|"Rjv">Q`j/$]CGn@PE925^  'y(%Hrdj|3"xҁY=xy x(mťM dС  ^rY#E7/j/yv^j!ɑέp ^bZfB><>'gIa?`%pՍ6Q!JU-3!:<h'|vūژċ&Q5.Lm!EX^^ &^^ Ma{Q{E1#73DwJ:Rʷ&d'G{%kڠxZy}zyK^n@H&HQa;KJ925^`^yvF5/j/$]݅7o^`QE#E䋟} 4< M@j#c2GE LO)>W>925^  %7Hrdj]TPA4@C:C#VǛa07Ϗe%!ɑ)hT'%hAY H@$7hHRF HQN>Аm )>=>R|?BR+b0(|@!ɑ)(|@q!ɑT hICfL[d`3m1/jq1Cf&Fڌ@QeFG)(| F'(c#2RPq!ɑ`LLgV dLr'(<` ȡ3zC#REhJ /O!E`Z}%'h3(| !ɑ" LӫQXi I J6.ЛDP M^Bm  .ЛDP Mק !ɑ" LБzy ,4>> 925$]64@O!Ei IILIhMg(&O!E+ > Jȭ!ɑcͰLǨJJHrdjϾ<ЛD5@3(#Ph$)(|vL J%Hrdj5l%d#rZoYgc㸕c'J^*wҲ h'|;^ecvժ&Pݪ !ɑ"@PD925*l$`ժviCR.ɍ9P!HrdjTHPc^lPv Mڠ74kB$7jvv !ipHFd#zd?J`Սd'G{KڍC3FT5 MViT0HrdjH&6P>d&FML@n-(|!ɑ" J!HrdjTHPc^lPv Mڠ74kB(7jvLm jobE0+|ݪsHZf'<f&z>B`Պ[/WwõF!ޙx桉"+5NHBm Ma j6yJgYPq"`(y)fkBu Lך ^lPobTې/j϶ڧybH&oyrE1$@^,D3jFoY/H H\.p+e&00{ # bFb4ؐmY~==У = ~=F =~&g A=L#&{БȬ-e/V\T^*wJ#&#rJIR*  EPX  PZ,dV+ ϋaWSiSVdV)Zȥk"&n,ֺB8ۺ.Kjݣ Js,Vx(4pwGP#|> xLp{~Nd8= c:a1#+1$Lp{ Pq1%1%H  d("8=Aub1Dž'Ӳp{!<B'g<gxV#. 9 ^ `lC8$8=@˂C؈;<"<=pu"1$\&ċȸLs2. L {\&R.:"0s͈L  d\&|pp p\&.ZE`sd\&|+"0<2. p q p"qy 3"?b.# 2.#t$\F$2.# 9fEb0"2>3"3 ȸ[d\F/舸q..#qq̊JX7c~J.B%Nӭ|&zwc`@J֭HU ?%ZՎXV?]XXVXB䪔'Jڱ?c%JX)bXVc%,T??Un,Xg+:JXb.c%Zα\\?Ul_)ceʖ:Jin,:J@şXRu`ܻu*EuA a3߉ 63qg/`:c?;4΅3qg6tu,αş|}Y}Y%ᝌYc1ş X qg&Psc1şJ`Ս,X8c?;/ N?(a3ӸA-a8c~%cyp J?a0, rģp|8c~%~AA /Jz&A8L; rģ 9Q`a0s;G0ZN9QKe: rģ 9Q` pN9Q 8c~%*E8c~%󧰘<α_OpX/ħ&8):0Aα_Oa0Dα_OsqSuN#NX/ħpa,,,eSeYeYd+@,,"a[,,bYeYd,> P2,!`,, E,!`& k,,ahV,eYeP 2,(`ZYeY@A`YeY@-  eYeXX,( E,-@,eYeBXYeY A1,,aPX,!jX& eYe- YeYdV|& eYdV|X >,"`YeEg0*@,"XZ|X,"XV,"hV+>,"XT,eYeXX ,+AhT,eYeX Bc,,aZbYeYeYdV,`Z,"`-eYdV, >,"hZ|*,Ȭ+>,>-eYeXVZ,"XeYdVbeYdVYeEab,+@| ϲ,Ȱ- Ō, BаV-eYei-YeYdZ| l,-[,,EaPV|+eYeh* YeEhZ|,,E`V|X,"`Z+YeYdZ L}YeEP+eYehT h,ȴ* 0ZYeFWG*ZJ5)UU(Ra*b UUb UU(NcUUJ,Xㄪ+ZJĭ*lU[\XRUUn%,Xㄪ(/)0/%UVAxR䪪(/Ed(/-qUUkE%UV+Eʛ%UV+*XJjR֥,Xㄪ֥V֒ZBUUkRXUPȬXbUPȬXՄZRŎ8J+IӒp2JtꔒVBU(NJՂ /%UZb UVXi*V "UUc'*JJ@ Ei*fXKZ ]%UF UPUUe]hŤjJZUUk XXVUU,Xa*DdʷFN UPUT*Pn%UF Uui*N8۫IUUrk)%UZZUm,Z*ցKF4$ʕ -TURJ Ҵ:UU)Nj3HRJ%ucJUF4)\XRŤT/qhܕTAZT-lTVAhYeY>,,,E*eYd,,,}YeYeY>,,,eYeYeO)g@000000000000000000000000000033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333xy`tX!*J2;]`.H h0,X+ lH , `P* '' K,11X ˬ.new(); $xmlWriter->addSortingRule( "CONFIG", [ "CLUSTER", "NODES", "NETWORKS" ] ); $xmlWriter->writeToXML( $cluster, \*STDOUT ); =head1 DESCRIPTION This package can be used to write out a complex Perl data structure in a number of formats. Currently, the supported formats are: XML The format of the data structure can arbitrary: a hash of hashes, a hash of arrays; an array of hashes or anything with no limit of depth. There should be no circularity, otherwise the writers may go into an infinite loop. =head1 COPYRIGHT (C) COPYRIGHT International Business Machines Corp. 2003 All Rights Reserved =head1 METHODS =cut ## # # Developers, # The Programming Perl (Camel) book, 3rd Edition says the use of # prototypes on methods are not honored. They are included for # documentation purposes only, and can be easily removed with no # loss of functionality or safety. # # Also, as the need exists, change the 'internal' document format # to POD. ## use 5.006; use strict; use warnings; use Carp; require Exporter; our @ISA = qw(Exporter); # Items to export into callers namespace by default. Note: do not export # names by default without a very good reason. Use EXPORT_OK instead. # Do not simply export all your public functions/methods/constants. # This allows declaration use DataWriter ':all'; # If you do not need this, moving things directly into @EXPORT or @EXPORT_OK # will save memory. our %EXPORT_TAGS = ( 'all' => [ qw( ) ] ); our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); our @EXPORT = qw( ); our $VERSION = '0.01'; # Preloaded methods go here. =head2 new() Description: new() is the constructor for the DataWriter. This allows the developer to separate data from its presentation. XML, as an output format, specifies that entities be written out in a particular order. This DataWriter allows the developer to specify 'rules' as to how hash structures should be sorted when writing out the data. Arguments: This constructor supports named parameters; the following are supported: Indent_text: the text to use to indent the text; by default it is four spaces Show_nonexisting_tags: if 1, tags specified by a sorting rule but having no data will be printed. Returns: A new DataWriter object. Example: my $xmlWriter = DataWriter::new(); my $xmlWriter2 = DataWriter::new( Indent_Text => "\t" ); =cut sub new($;@) { my $proto = shift; my $class = ref($proto) || $proto; my $self = {}; my %args = @_; $self->{_indentLevel} = 0; # the indentation level $self->{_sortRules} = {}; # used to store the rules $self->{_indentText} = $args{Indent_text} || " "; $self->{_show_nonexisting_tags} = $args{Show_nonexisting_tags} || 0; $self->{_show_null_values} = $args{Show_null_values} || 0; return bless $self, $class; } =head2 writeToXML() Description: writeToXML() is the method for writing the complex data structure as an fragment of an XML document. Currently attributes are not supported. It is up to the calling program to write out the XML declaration, DOCTYPE declarations, and so forth. Arguments: $: a reference to the compound data structure (hash of hases) $: (optional) the filehandle where the XML document will be written. If not specified, standard out will be used. Returns: 1 if successful; 0 if there are errors (file I/O). This routine will use Carp to write out the errors. Example: $xmlWriter->writeToXML( $cluster, \*XMLFILE ); =cut sub writeToXML($;$) { my $self = shift; my $data = shift; my $fh = shift || *STDOUT; return $self->writeArrayToXML($data, $fh) if ( ref $data eq "ARRAY" ); return $self->writeHashToXML($data, $fh) if ( ref $data eq "HASH" ); Carp::croak "Not a compound data structure $data"; return 0; } =head2 addSortingRule() Description: If part of the compound data structures are indeed hashes, the programmer can use addSortingRule() to specified the sort-order of the hash data structure. Hash structures without sort rules will generate XML with no particular order associated with it. Arguments: $: the entity with which a rule will be associated. \@: the list of indices for the hash structure that will be used for for sorting. Indices not specified will not be listed. Indices which no data corresponding will be listed if the Show_nonexisting_tags parameter was specified when the DataWriter object was created (see new). Returns: Nothing. Example: no strict 'subs'; $xmlWriter->addSortingRule( CLUSTER, [ "META:DEBUG", VERSION, VALIDATED, CLUSTER, NODES, NETWORKS, IPLABELS, INTERFACES, GLOBALNETWORKS, APPLICATIONS, APPLICATIONSERVERS, APPLICATIONMONITORS, SITES, CLUSTEREVENTS, NODETTYPORTS, PAGERS, DISKS, VOLUMEGROUPS, LOGICALVOLUMES, NFSEXPORTS, TAPES, TIMERS, RESOURCEGROUPS, PROCESSINGORDER, SETTLINGTIME ] ); use strict 'subs'; =cut sub addSortingRule($\@) { my $self = shift; my $tagname = shift; my $indices = shift; $self->{_sortRules}{$tagname} = $indices; } # The following are not documented with POD since we do not want them in the # resulting documentation. # Name: pad # # Description: # Internal method for returning the proper amount of indentation. # # Arguments: # None. # # Returns: # a string containing the spacing for indentation. # sub pad() { my $self = shift; return $self->{_indentText} x $self->{_indentLevel}; } # Name: writeArrayToXML # # Description: # An internal routine for writing an array out as XML. # # Arguments: # \@: a reference to an array to be written out. # $: (optional) a filehandle. By default it's STDOUT. # # Returns: # True if successful. # sub writeArrayToXML(\@;$) { my $self = shift; my $data = shift; my $fh = shift || *STDOUT; my $rc = 1; foreach ( @{ $data }) { $rc &&= $self->writeToXML( $_, $fh ); } return $rc; } # Name: writeHashToXML # # Description: # An internal routine for writing a hash as XML. # # Arguments: # \%: a reference to an array to be written out. # $: (optional) a filehandle. By default it's STDOUT. # # Returns: # True if successful. # sub writeHashToXML(\%;$) { my $self = shift; my $data = shift; my $fh = shift || *STDOUT; my $rc = 1; for my $key ( keys %{$data} ) { $rc &&= $self->writeTaggedDataToXML( $key, $data->{$key}, $fh ); } return $rc; } # Name: writeTaggedDataToXML # # Description: # An internal routine for writing out compound data structures as XML. # # Arguments: # $: the tagname # $: the data. Currently only is allowed are scalars, references to # scalars arrays and hashes, or nothing (empty entities will be printed). # $: (optional) a filehandle. By default it's STDOUT. # # Returns: # True if there was no errors in printing, and the data was what is # supported. # sub writeTaggedDataToXML($$;$) { my $self = shift; my $tagname = shift; my $data = shift; my $fh = shift || *STDOUT; return $self->writeTaggedArrayToXML($tagname, $data, $fh) if ( ref $data eq "ARRAY" ); return $self->writeTaggedHashToXML($tagname, $data, $fh) if ( ref $data eq "HASH" ); return $self->writeTaggedScalarToXML($tagname, $data, $fh) if ( ref $data eq "SCALAR" ); return $self->writeTaggedNullToXML($tagname, $fh) if ( !defined $data ); return $self->writeTaggedScalarToXML($tagname, $data, $fh) if ( not ref $data ); Carp::croak "Not a compound data structure $data"; return 0; } # Name: writeTaggedScalarToXML # # Description: # An internal method to write out a scalar. # # Arguments: # $: the tagname # $: the scalar data. # $: (optional) a filehandle. By default it's STDOUT. # # Returns: # True if there were no errors in printing. # sub writeTaggedScalarToXML($$;$) { my $self = shift; my $tagname = shift; my $data = shift; my $fh = shift || *STDOUT; my $endtag; ($endtag) = $tagname =~ m/^(\w+)/; return print $fh $self->pad(), "<", $tagname, ">", encode( $data ), "", "\n"; } # Name: writeTaggedNullToXML # # Description: # An internal method to write out an empty entity. Currently, the # the format is , as opposed to the format. # # Arguments: # $: the tagname # $: (optional) a filehandle. By default it's STDOUT. # # Returns: # True if there were no errors in printing. # sub writeTaggedNullToXML($;$) { my $self = shift; my $tagname = shift; my $fh = shift || *STDOUT; my $endtag; ($endtag) = $tagname =~ m/^(\w+)/; return 1 if (!$self->{_show_null_values}); print $fh $self->pad(), "<", $tagname, ">", "", "\n"; } # Name: writeTaggedArrayToXML # # Description: # An internal method to write out an array as XML. # # Arguments: # $: the tagname # $: a reference to the array to be written. # $: (optional) a filehandle. By default it's STDOUT. # # Returns: # True if there were no errors in printing. # sub writeTaggedArrayToXML($\@;$) { my $self = shift; my $tagname = shift; my $data = shift; my $fh = shift || *STDOUT; my $rc; my $endtag; ($endtag) = $tagname =~ m/^(\w+)/; $rc = print $fh $self->pad(), "<", $tagname, ">", "\n"; $self->{_indentLevel}++; foreach ( @{ $data }) { $rc &&= $self->writeToXML( $_, $fh ); } $self->{_indentLevel}--; $rc &&= print $fh $self->pad(), "", "\n"; return $rc } # Name: writeTaggedHashToXML # # Description: # An internal method to write out a hash as XML. If the indices have # been specified as part of sorting rule, then these will be used. # NOTE: I am intentionally blurring 'keys' and 'indices' because in a # sense we are treating a hash as an array by indexing it. # # Arguments: # $: the tagname # $: a reference to the hash to be written. # $: (optional) a filehandle. By default it's STDOUT. # # Returns: # True if there were no errors in printing. # sub writeTaggedHashToXML($\%;$$) { my $self = shift; my $tagname = shift; my $data = shift; my $fh = shift || *STDOUT; my @keys; my $rc; my $endtag; ($endtag) = $tagname =~ m/^(\w+)/; # Load up the indicies (sort rule) if found. if ( defined( $self->{_sortRules}{$tagname} )) { @keys = @{ $self->{_sortRules}{$tagname} }; } else { @keys = keys %{$data}; } $rc = print $fh $self->pad(), "<", $tagname, ">", "\n"; $self->{_indentLevel}++; for my $key ( @keys ) { if ( $self->{_show_nonexisting_tags} || exists $data->{$key} ) { $rc &&= $self->writeTaggedDataToXML( $key, $data->{$key}, $fh ); } } $self->{_indentLevel}--; $rc &&= print $fh $self->pad(), "", "\n"; return $rc; } # Name: encode # # Description: # An internal, static method to encode the string. # Currently all less-than and greater-than symbols will be translated # to < and >. # # Arguments: # $: the string to be encoded # # Returns: # The encoded string. # sub encode($) { my $string = shift; $string =~ s//\>/g; $string =~ s/\&/\&/g; return $string; } 1; __END__ $ kjn5+$lbW՝ab&l # ./usr/es/lib/perl/MsgCatalog.pm$$# @(#)46 1.2 src/43haes/lib/perl/MsgCatalog.pm, hacmp.libcluster, 61haes_r714 11/28/11 15:09:48 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/perl/MsgCatalog.pm 1.2 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2004,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG package MsgCatalog; =head1 NAME MsgCatalog - Perl extension for handling access to AIX message catalogs =head1 SYNOPSIS use MsgCatalog; my $cluster_cat = MsgCatalog::new("cluster.cat"); $cluster_cat->dspmsg(1, 5, "PowerHA SystemMirror"); my $utilities_cat = MsgCatalog::new("utilities.cat"); $utilities_cat->dspmsg(1, 27, "Could not detect node (%1\$s).\n", "$nodename"); =head1 DESCRIPTION This package provides a Perl-like interface for accessing AIX message catalogs. A MsgCatalog object is a 'handle' to a real message catalog so that arbitrary messages can be output. The operations currently supported are: new -- creates an interface to a message catalog dspmsg -- retrieve a message from the catalog =head1 METHODS =cut use strict; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; use Carp; @ISA = qw(Exporter); @EXPORT = qw( ); $VERSION = '0.01'; =head2 new() Description: This is the constructor for MsgCatalog objects. It takes the name of an message catalog and 'ties' the catalog with a new Perl object that's created by this method. Arguments: $: the name of a message catalog @: optional parameters Returns: A new object used to represent the message catalog. Example: my $catalog = MsgCatalog::new( "cluster.cat", LANG=>"en_US" ); =cut sub new() { my $proto = shift; my $class = ref($proto) || $proto; my $self = {}; my $catalog = shift || croak "argument 'catalog' is mandatory"; my %args = @_; $self->{CATALOG} = $catalog; $self->{LANG} = $args{LANG}; return bless $self, $class; } =head2 dspmsg() Description: dspmsg() retrieves a message from the object's message catalog using the AIX dspmsg command call. Arguments: $: a reference to the catalog object $: the message catalog set number $: the message number $: the default message @: one or more replacement parameters for the message (optional) Returns: none (the message it output to stdout) Examples: $clstr_cat->dspmsg(1, 5, "PowerHA SystemMirror"); $util_cat->dspmsg(1, 27, "Could not detect node (%1\$s).\n", "$nodename"); =cut sub dspmsg() { my $self = shift; my $set = shift || croak "argument 'set' is mandatory"; my $msg = shift || croak "argument 'msg' is mandatory"; my $default = shift || croak "argument 'default' is mandatory"; my @paramlist = @_; my $cmdstr = (($self->{LANG}) ? ("LANG=" . $self->{LANG}) : "" ); my $params = join ( " ", map { "\"$_\"" } @paramlist); my $cat = $self->{CATALOG}; $cmdstr = "$cmdstr dspmsg -s $set $cat $msg \"$default\" $params"; system("$cmdstr"); } =head2 getmsg() Description: getmsg() retrieves a message from the object's message catalog using the AIX dspmsg command call. Arguments: $: a reference to the catalog object $: the message catalog set number $: the message number $: the default message @: one or more replacement parameters for the message (optional) Returns: The resulting string. Examples: $msg = $clstr_cat->getmsg(1, 5, "PowerHA SystemMirror"); $msg = $util_cat->getmsg(1, 27, "Could not detect node (%1\$s).\n", "$nodename"); =cut sub getmsg() { my $self = shift; my $set = shift || croak "argument 'set' is mandatory"; my $msg = shift || croak "argument 'msg' is mandatory"; my $default = shift || croak "argument 'default' is mandatory"; my @params = @_; my $cmdstr = (($self->{LANG}) ? ("LANG=" . $self->{LANG}) : "" ); $cmdstr = "$cmdstr dspmsg -s $set " . $self->{CATALOG} . " $msg \"$default\" " . join ( " ", map { "\"$_\"" } @params ); open( MSG, "$cmdstr | " ) or return undef; my @retval = ; close MSG; return "@retval"; } # this is a module, so it must end with a plain 1. 1; __END__ 1 # k5+-bW՝ab&- # ./usr/es/lib/perl/ODM.pmlog.pm# @(#)87 1.5 src/43haes/lib/perl/ODM.pm, hacmp, 61haes_r714 11/28/11 15:07:10 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/lib/perl/ODM.pm 1.5 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 2003,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG package ODM; =head1 NAME ODM - Perl extension for Handling AIX ODM classes =head1 SYNOPSIS use ODM; my $odm = ODM::new("HACMPnode"); foreach my $node ( $odm->get() ) { print $node->{name}, ": ", $node->{object}, $node->{value},"\n"; } print $odm->get(-q=>{name=>"nodeA", object=>"VERBOSE_LOGGING"})->{value}; =head1 DESCRIPTION This package provides a Perl-like interface for accessing and manipulating AIX ODMs. An ODM object is a 'handle' to a real ODM class so that arbitrary operations can be performed on it. The operations currently supported are: new -- creates an interface to an ODM class get -- retrieves data from an ODM class error -- returns the error from the last command, if any or undef. ODM data, as returned from 'get' is an array of hashes, where each hash contains the descriptor names as hash keys and descriptor values as hash values. =head1 COPYRIGHT (C) COPYRIGHT International Business Machines Corp. 2003 All Rights Reserved =head1 METHODS =cut ## # # Developers, # The Programming Perl (Camel) book, 3rd Edition says the use of # prototypes on methods are not honored. They are included for # documentation purposes only, and can be easily removed with no # loss of functionality or safety. # # Also, as the need exists, change the 'internal' document format # to POD. ## use strict; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); use Symbol qw(qualify_to_ref); use Carp; require Exporter; @ISA = qw(Exporter); # AutoLoader ? # Items to export into callers namespace by default. Note: do not export # names by default without a very good reason. Use EXPORT_OK instead. # Do not simply export all your public functions/methods/constants. @EXPORT = qw( ); $VERSION = '0.01'; # Preloaded methods go here. sub stream2hashes(;*); sub buildquery(\@); # # Name: DCD # # Description: # Returns a string containing the PowerHA SystemMirror ODM Default Configuration Directory. # # Arguments: # None # # Returns: # DCD path # # Example: # my $dcd = ODM::DCD(); # sub DCD() { return "/etc/es/objrepos"; } # # Name: ACD # # Description: # Returns a string containing the PowerHA SystemMirror ODM Active Configuration Directory. # # Arguments: # None # # Returns: # ACD path # # Example: # my $acd = ODM::ACD(); # sub ACD() { return "/usr/es/sbin/cluster/etc/objrepos/active"; } # # Name: create # # Description: # Creates a list of ODM objects give a file containing the # the definitions of the classes. This is analogous to the # odmcreate command. # # Any preferences passed in as extra arguments will be applied # to all of the objects as well. # # Arguments: # $: filename containing the class definitions # @: optional named parameters # # Returns: # A list of created classes. # # Example: # my @classes = ODM::create( "classfile", ODMDIR=>"/etc/objrepos" ); # sub create($;@) { my $filename = shift; my %prefs = @_; my @results = (); my $ODMDIR = $prefs{ODMDIR} || $ENV{ODMDIR} || croak "ODMDIR not set"; open( PIPE, "ODMDIR=$ODMDIR odmcreate -c $filename|" ) or return (); while () { chomp; push @results, ODM->new( $_, %prefs ); } close( PIPE ); return @results; } # static function sub show { } # # Name: drop # # Description: # Deletes an ODM class given a valid ODM object. If the object is not # valid, this routine will croak. # # Arguments: # $ : the Perl object representing the ODM class. # # Returns: # The return code from the system call to drop the ODM. # # Note that the ODM object passed in still has valid data, but there # no longer be an ODM to back it up. References to this object # should be deleted. # # Example: # ODM::drop( $odm ); # sub drop($) { my $odm = shift; croak "drop argument must be an ODM object" unless defined( $odm ) and ("ODM" eq ref($odm)); return system "ODMDIR=$odm->{ODMDIR} odmdrop -o $odm->{_classname}"; } =head2 new() Description: This is the constructor for ODM classes. It takes the name of an ODM class with optional parameters and 'ties' the class with a new Perl object that's created by this method. Arguments: $: an instance of an ODM class. @: optional parameters Returns: A new object used to represent the ODM class. Example: my $HACMPcluster = ODM::new( "HACMPcluster", ODMDIR=>"/etc/objrepos" ); =cut sub new($;@) { my $proto = shift; my $class = ref($proto) || $proto; my $self = {}; my $classname = shift || croak "argument 'classname' is mandatory"; my %args = @_; $self->{_classname} = $classname; $self->{ODMDIR} = $args{ODMDIR} || $ENV{ODMDIR} || croak "ODMDIR not set"; return bless $self, $class; } # dump # utility function to write the ODM data to a file handle sub dump(*@) { my $self = shift; my $fh = qualify_to_ref( shift, caller ); my ( $key, $value ); foreach ( @_ ) { print $fh "\n".$self->{_classname}.":\n"; while (( $key, $value ) = each %{$_} ) { print $fh "\t$key = $value\n"; } } } # # Name: add # # Description: # Adds a stanza to the ODM object. The parameters to add must a hash # which contains field/value pairs that would comprise a complete # stanza for the ODM class. # # Arguments: # @: A hash representing a stanza to add to the ODM class. # # Returns: # The return code from the system call to add the ODM stanza. # # Example: # $HACMPports->add( # node => "myNode", # tty => "/dev/tty0", # ); # sub add(@) { my $self = shift; my ( $key, $value ); open( PIPE, "| ODMDIR=$self->{ODMDIR} odmadd" ) or return (); $self->dump( *PIPE, @_ ); close PIPE; # TBD add return code handling!! } =head2 error() Description: Returns the error from the last operation, or undef if no error. Arguments: None Returns: A string representing the error encountered, or undef, if successful. Examples: $HACMPport->get(); if ( $HACMPport->error() ) { die "Error encountered: " . $HACMPport->error(); } =cut sub error() { return $_[0]->{_error}; } =head2 get() Description: Returns a list of hashes containing the results of the query. The arguments for the query can be one of: -q => "string containing query" -q => { queryterm1 => value, queryterm2 => value } # they are ANDed -q => ( queryterm1 => value, queryterm2 => value ) # they are ANDed undef # that is nothing, in which case the entire ODM is returned. If there was an error encountered while performing the operation, the error status will be set; the error() method can be used to detect it. Arguments: @: A hash representing the query; please see the Description for how to form a query, or the examples below. Returns: The results of a query as a list of hashes. Examples: $HACMPport->get(); $HACMPport->get( -q => "tty = /dev/ttyS0" ); $HACMPport->get( -q => {node => "myNode"} ); =cut sub get(;$) { my $self = shift; my $QUERY = buildquery( @_ ); my @results = (); # clear the error state delete $self->{_error}; if ( ! defined open( PIPE, "ODMDIR=$self->{ODMDIR} odmget $QUERY $self->{_classname} 2> /dev/null |" )) { $self->{_error} = "$!"; return (); } @results = stream2hashes( PIPE ); close PIPE; return @results; } # change: # [ -q => "string" | -q => { key => value, ... } ] # list of references to hashes sub change { my $self = shift; my $QUERY = buildquery( @_ ); open( PIPE, "| ODMDIR=$self->{ODMDIR} odmchange -o $self->{_classname} $QUERY" ) or return (); $self->dump( *PIPE, @_ ); close PIPE; } # # Name: delete # # Description: # Returns the count of stanzas that were deleted from the ODM. # The arguments for the query can be one of: # -q => "string containing query" # -q => { queryterm1 => value, queryterm2 => value } # they are ANDed # -q => ( queryterm1 => value, queryterm2 => value ) # they are ANDed # undef # that is nothing, in which case the contents of the entire # # ODM is deleted. # # Arguments: # @: A hash representing the query; please see the Description for # how to form a query, or the examples below. # # Returns: # The number of stanzas that were deleted. # # Examples: # $HACMPport->delete(); # $HACMPport->delete( -q => "tty = /dev/ttyS0" ); # $HACMPport->delete( -q => {node => "myNode"} ); # sub delete { my $self = shift; my $QUERY = buildquery( @_ ); my $count; return system "ODMDIR=$self->{ODMDIR} odmdelete -o $QUERY -q $self->{_classname}"; open( PIPE, "ODMDIR=$self->{ODMDIR} odmdelete -o $self->{_classname} $QUERY |" ) or return (); while() { if ( /\s(\d+)\sobjects deleted/ ) { $count = $1 } } close PIPE; return $count; } sub stream2hashes(;*) { my $fh = qualify_to_ref( shift||"STDIN", caller); my @result = (); my $hash; while(<$fh>) { chomp; /^\s*$/ and push @result, $hash; /^\w+:/ and $hash = {}; /^\t(\w+) = "?([^"]*)"?$/ and $hash->{$1} = $2; } push @result, $hash; shift @result unless ( defined $result[0] ); return @result; } sub buildquery(\@) { my $array = shift; my $QUERY = ''; if ( defined ($array->[0]) && $array->[0] =~ /^(-q|-query)$/ ) { shift @{$array}; $QUERY = '-q "' . hash2query( shift @{$array}) . '" '; } return $QUERY; } sub hash2query { my ( $key, $value ); my $result = ""; my $hash; if ( ref($_[0]) eq "HASH" ) { $hash = $_[0]; } elsif ( 1 == scalar( @_ ) ) { return $_[0]; } else { my %hash = @_; $hash = \%hash; } if ( ($key, $value) = each %{$hash} ) { $value =~ s/'/''/g; $value =~ s/^\s*"(.*)"\s*$/'$1'/; $result = $key. " = " . $value; } while (( $key, $value ) = each %{$hash} ) { $value =~ s/'/''/g; $value =~ s/^\s*"(.*)"\s*$/'$1'/; $result .= " AND " . $key . " = " . $value; } return $result; } sub parseclass(;*) { my $fh = qualify_to_ref( shift||"STDIN", caller); my %hash; while (<$fh>) { /(char|vchar|nchar|longchar|binary|method)\s+(\w+)\s*\[(\d+)\]/ or $hash{$2} = { type=>$1, size=>$3 }; /(short|long|long64|int64|ODM_LONG_LONG|method)\s+(\w+)/ or $hash{$2} = { type=>$1 }; # /link (\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s*\[(\d)\]/ # or $hash{$5}= {type=>"link"}; } return %hash; # char DescriptorName [ DescriptorSize ]; # # vchar DescriptorName [ DescriptorSize ]; # # binary DescriptorName [ DescriptorSize ]; # # short DescriptorName ; # # long DescriptorName ; # # long64 or int64 or ODM_LONG_LONG DescriptorName ; # # method DescriptorName ; # # link StdClassName StdClassName ColName DescriptorName ; # } # Autoload methods go after =cut, and are processed by the autosplit program. 1; __END__ QUER l3.6+*bW՝ab& # ./usr/es/lib/perl/libcl_disp.pm   #e $ainorst_cdflmpu"().;=N[]bghy'-/01:@AEIOPRSvw{}&+,23BCDFGHLMTU`kq46>W\x| 59vl.jR* k]`apxq{f=`dܥy>! b(  kM$59c+աup|/N<)+hc2jrp8H%c|nS7D0h2yATAO6Aa,K]z* 8&&UUUUUUUUUUUUUUUUUUUUUUUUUUUUUKS'=#t$k'Rq&ssYM8?3t]mzܓ8t$y]UUUUUUUUUUUUUUUUUUUUUUUUUUUUU-j4Lޓ:JZՍa0#MFml*Grexrt9ɭuVWqq$Vᅮiς+8ZՕM!@Eņxșktogq&!Q< ()Dą 0F7#K|zJwGA>Z"s;->'9﹍!cP栄WyǤq_"sTP"tL&N'5E4fGAAepљNjNF;NGAAeS8=|Εi܎'5E'D6r>.RgAएD樢qqrM1iH"sTP"tLNi4ŤD\F}LZKNtNj/N8i+k;:jGggAIYN*bSl"q+)W)vt9B)vt9ϝk;:"_D模D_# 9(t:&W{R=T;5$5q_HRlԒ'L^.]3e`z6v,)9jI@j=2/FKE%ςr0QC2MҸ89&8I-|l8HŌͳqR01`ojn=\=%e;Vk`@L/` _Jb$Q ` *E`PLL_Bb`(00,0 A`PQEX_ A1R$(22&88 *   /!A0xPx@Pd&p4"(p0\(FD'EAQ8u$(22&8(2(0pȸ0T*( _B#"`C@TPB"EVSjv@jԒ88f'Jm@qJqLN;_IYN36VSbSlMQI/@VYVka+j ͳ/IB 6&R0ryB 6&E%X!rDME$)MfQRr,ؚ/JWbZbҐ"j)% "j)%x 3!dDRKE\vQI/I`=|n#N>,I5&W$0f@bj()\F}36 _#Jğ,S/,Tx%N|(,X!k}n HYUB2_cpZBȌF}ZbҒĜQi36 6VZĜf _ͳ/I1D,36$N"j)%Rr+`PPp"A`ĥqq*QI/c5T"Ԓ^6؋RHO Yk]c*zzMf>[c{jw(\w?4s5f9Jk9Zgd05Sz0cr4AIJsрţ挽5`AIJsрţL@ "MrT!r98$\1GA>Y&*c{S|( 05S:O c\17'9C &*cjHI-)NjN ak7(t:Wg$&*c}n Ni4ŤAIJӃ8FGAD䩌N8i+d$%LrggAHҔ♘"MrT)vt8$\1SggAIYN@5SD $%LrggAQiA"MrT)vt91D,A"MrT)vt9(t:&H1IJ.G) 9Y'5E'D05SD\F}LZDD䩎qkgdD䩎qkg`e8&'9ă\1n<k5# 6&*cB>dDc & E VQHÞzJwֺIYN4KT"  p a O`Px R"L&'I6vc@QEX@HS ipՆ\R` a{O0Y+)yM.Pv bc0 &T( X)!j$%40&X  bASB"#' cܚa+ 7>^Y+)y\F}loipՏ&5{ 3QsZzMMa+3MVV3QMAY5z5 loMYO1|=(1q<\2 5)5RlR762]bRzj9( l<1l-PA#cc3l5XRzj9cRr$c@nQ&X**8dX(0 &5r =&ųt-^f@o7l8>5q%nGM|\jxbJ/F j{f>[q湚atԜ%X=%e;VdRHҔ♘)vOؔjGMkzJwvO a+)FU1)vMkؔjE`jvMkĚ&+I8=ӄd,Hq' ,ؚ_$0f@bj(Oq' #I IlME एfPq&;5XJFNA2V\fPq$ZP!dDRDcJ4U@LZRDME$Oĥqq*;? }n HYӏLZR&+JWbHY55XCFd,Hq#&d,Hq$\ܧiY55XHSA3qq!dDRDָ+IBʵ;? |w"V8X4q'>wZ}lc9fml$"" dO }n ͳ_$$ 6VY5#|nPV'f0UMH$r\M &+$5qMpV;jIiax$ָ+I!zLxkĞG#^S<ꪪuyt"]l[;].mI]5o9]i!l[8Dסk~8FYN<-r&ub̹sz5|<3MeE|ᘾp [tI"_5z*|^eVQY򰺶,0D3k_ZNMӄe7 0᜜eD۞gϔ Zۦi_ᅃ6 0f6 /EQӾ!Fųw?1sy-teTuËw=Eg1i, _+Ql.j6-"EuËK9;7<稬-'& P]3M $behsVo`IueTS_frWUUUUUUUUUUUUUUUUUUUUUUUUUUK9=5`1hh/҃wݡEnl1s~0`,HT'[7jFlKXIF7#@%zj9,\5X9W7A+=5`1hh/MG=.X6|\XLr]jwVz.J>6ꪪrT'-܍4e "8Sl؀!5o`PPp@SaŃ˓_a8Ԍ 9y$* y5y+)C%f;ȒG|&i3\nj`BNY+)tMYO|&^%\or|jnKтA;cz08f\5z_ ^3Wܴafsц7a(@,фw?Bo`0"  * yLx Q   I Q!@B1!EʃLx Q   I Q!@B1 I!Bɯ3{ʃLjI$ $ H$ H@y5o`2LjI$ $ H$ $ <7`pLL&(p,`L0!LjI$ $ H$ $ <7LcceA)$ $$$ $ $ HH@$$ !qRc1Ihsy<-#;/iU$o43VS\F}˷V,Ur #2T$.*T,pP'rIf/ԙסbIf5|&5q-<4Sr9e`PPp@$ֿ_`3W>5z WKN =0`H\&2(ܓqF?dm8N JJѭEʃ**8X(' & Etr=(g썧 X!xPPp5L 80&Tp`PPp@=0`H\&2(ܓqF?dm8N JJѭ`h p,`L0!>!qRc2{`,LdP9Y'M ҍV~p  a[ʃ**8X(' & Etr=(g썧 X!xPPp5`PdXP`C}%BBA d!pXȠrrNAǥ;+/**F   02T$.*T,pP&O`@L+7$zQ*NB!qRl4kaQ@,0ʃ**8X(D`9Vs1kITX(M_@7 YςDq*& Bk_nj1P(McUxOMG= Z1.h$=4*].mI].8U;|"*?3WY\|mUUUUUUUUUUUUUUUUUUUUUUUUUR䩎OMG= Z1.h$=4* #U6- _f  , 6X<5'N卹$+CFmV.odZ U2kdZ U<̄Z085qr.=tg+Ѕڔm tNJaQFidZ U1GȵA3yMϙ`p9kZ>6i䯜8f> נ**8d0*.cæzj9M6L^9\/ [p#dH\T8X`LykR.|pO@a H\p=T y5>x8\'`@L 0̸4Þy5>x8\' EF 0 & E\p< xkR.|pOKX * 3H=Ð窒@KǓ_s烅xgaaP@i<`P*0( 8   &  Aa1QbKǓ_s烅xg1@iAAdPddTX1PP' (*0( 8 A%ɯHx8\'X * gXg,5#ivV^{cp[}%BBA `KǓ_BV@."M7)di8!%BBA Ecȓ_v**8d0*.D/|ݡ8r܏3Wӄ|VPIYN4] /TwOA<2`f`PPp@m%Rf nK4ѫq7𙫎!kr$0c2T$.*T,pP&?"8#^>n/)_Mɯu꨿2!qRcA1IuD1*ip՜!dG~R` &_L":]`^|.G9t#&\I&"@!r,\ԋd!dIX|Xꪪuyt"sqE܎|.X6|\.jۤO<^Op~u!k'*oW_8yqjv\1GA>Y_f'>wZ}Ț7B,\фm79BGŀTG^S:y l=$N|$Hd{/A 0MGHd{ |8 aX/qbN|(#aX.M)^8"C ,/_cl| _}ǑQYĜQi F,&uD1ϝr,\ԋMcUxN΂'9t#&X#c;->iJ@*29LHz7*2y5Fy3{=$H,osrQ'Lp69D59/A 0MGHdX/B`6Az%b9Dqs,\W;RqDAz%1~,dXKO9ŀP `a@*0Zf9; 1&@(DA|(9N s,\Dq`P `b@(6S& @((XG ` Dq`75bz%˓XX_ԋwZ}Fy3{=$H,osrQ'Lp69D59/A 0MGHdX/B`6Az%b9Dqs,&_!c`Q~ GHdX/B`6Az%a}|(#_njKɯu㽥+HdX/B`6Az%a}|(#_C)_0Zf9C 15# tzGHdjG=1r9*25LW:#b0U`S"8Ջ9_W:EϞ2 aT$r3Iȑ, 8%@QR7>wZ} JrBa %sqE{,xTWUUUUUUUUUUUUUUUUUUUUUUUUUUKϛcpX"s9!܏X\^"6[,, 1x BxɹN :1Hlӏ5;->fK'*oW_8yqjvań ~6nR]UUUUUUUUUUUUUUUUUUUUUUUUUU.JsBAAc/3{/)ɯ3{Sań _`E)皳еV7gs5{z;->;|#z pj6iǚ27g8Ջ#m<֙| Rr$GS799(@8CD܉ Kb>Y 1D _(G"8Ջ9&HB`A*NFy)9=eAXx+**T#O0N\^r $~=P~=<*McUx)#IYN]`ۑrt"n>5{ڝ˂;RKj$7A]/@O7)a'F0uʩ!]UUUUUUUUUUUUUUUUUUUUUUUUUU.Jڢ:8$/3xTRYL*0$. VnIu8#XiD0By&$5O5ocTS $s!sk2 j'75bI)"k]UUUUUUUUUUUUUUUUUUUUUUUUUU.r>nW_#QC2]`ۑrt"k-7fjIo.f=;LK#j$7Ar>1.XLr]vj$7Aڝqa\ukL$!raV!pXȠrrNAǤff*avD!r _栚Țфm >\L%4rQ'Lфr OcSeM5 pDq+#Xng>\&:O5odng>^@J73.Dq ͮ|273,nW_Fdt9(t:&WKr>.RnW_5bmtfJyU%RlۦkkN=t]bq2vEuË(ljvań 3ꪪrT4fGAAdDql8yrkLșl8rkJ-_P=bG_ 0L Q3ojvPB!CAq@L Z܉Da|yQbȎ/75b3xљ_òU0`H\&2(ܓq%(ܰ쉜 %`^zQIPMM_f!2rQ'O Á"M皂jbCFdM6i4g $4fDq ͮ|0hxsV/ĆȚWUUUUUUUUUUUUUUUUUUUUUUUUUUKϛ4fGAAet#&.RnW_5bmtfE\vP=͝tm~IǶnKN&UN9q`;_Eq훠N_8q&w;]UUUUUUUUUUUUUUUUUUUUUUUUUU.JrW#r#QC2A"8je6X<5odL6X@5ږÉ(Ա#AV&f熅cT(ș7;( 8LP$? BAXaRk_ ș/*,TPy_oFD:`@L+7$zIJ7,4;"ga@6T5q5oFYNJ$8p#aIPMLI_0Zf#FDq ͮ|1$_#"k]UUUUUUUUUUUUUUUUUUUUUUUUUU.r>nW_S8=|Εi܎'5E'DunGMxb_-N#bSσgϕiܗ_픠{;Ctmڢ8zuʩ!,\GkN=t.#kS->}3qq#QC2A"8je6X<5odL6X@5ږÉ(Ա#AV&f熅cT(ș7;(&* 1bE3EH0Pd~r>¤ֿ"A3_TX#XL$:`@L+7$zIJ7,4;"gaD0By&É3{?)Dz(lXLr]vj$7Aڝ%Lrc9)3QB "87AV&f熅;(Ë`#W5od)Xbc":nRk =,_՞' @D*M皂jl_ \d̉5_SlfMcUxS>.RgA )7A+񋚱|F8s5|9)>z(lXLr]vj$7Aڝ%Lrr: #3xO)`fnxh_{S8y| & 5q _fJpS)Xbc":nRk =,_՞+ @D*M皂jl5ϙJpP5_S:]`^|qqrM1iH"sTP"tLX6|\.jۤO<_+ӏ&]Eq훠SB+X¤ֿR8ť"kLɦ#N>-1iHH2&{ ʋDqiE-)/Ǖ*(-1i'75bJWaMcUxNi4Ť]`ۑrt"˙EnRWzM1i.XLr]v8iIuUUUUUUUUUUUUUUUUUUUUUUUUUT*crAqqrM1iaO4@H"8 JiN l85M5 /i8 dPy~X<$G~ɦ`5uEϞ2 aT$r3Iȑ, \x L`PxV#N>bAe^4gq$~=.<*McUx1D,t:Wg$unGMxb_.f}n s6iǚۨǪbi*/b҃teT.#iޓLZKScpX"t#N>I-" "8ai Rr$GS7M52I !&# ɦa8G j/_ËDsV/4, .M_s猄U (>.Rr${g**T#+ӏ&f6hW:Y+)I/aŃˏ Xꪪuyt"NtNj.X6|\.jۤO<^IǶnN=V6#TQ'ٺ].8U;|"aŃˈ~IǶn;]UUUUUUUUUUUUUUUUUUUUUUUUUU.JӃ8FGADql8yrkJ-_P=bGZ 0L ȰP`(pLXQPס5%l0$.!RkaL*0$. VnIu8#XiO ~ƨ<5 @D*M皂jl87'pI`pFÈ_栚p{Țфm78=ӄrI#"8B>d$IXNtXꪪuyt"3s98=ӄNjJunGMxb_.fjJ)65x@LNt&FۨǪcpסs+;].8U;|"aŃˈӃ8G{S, \Gsа)uUUUUUUUUUUUUUUUUUUUUUUUUUT*c3s98=ӄNjJ078=ӄr,\7BË&{Rq5ږ$q5( S о=8=ӄJ18=ӄv N1\aY & pT71¬ B1@f7\I)5E'pkD0/=Ysа+ @D*M皂jlLi_ \bcMH5_1McUxSl"rP=zRS3܏XX7 X礬qqq-Vkǹ>n ].8U;|"|k/ I75bi+r]c|5cX=V=rT)vt9(Ԏ=)N)#=)ܢ5¡aa@f0$. VnIu8jrzRS3A5O5obN}JF7(_s(<LN.SJڃg4ܔiA56$5oje9(9D܉ j/_zRS3Ap0 ɦ`Q~7 X$G~0`LT_W~R` &UUUUUUUUUUUUUUUUUUUUUUUUUR*xL(01P#'"GxlH+%@QR(JBqMϼ<٫"@KDžI75bk_WUUUUUUUUUUUUUUUUUUUUUUUUUUKϛ1)vt8+ )7A+񋚱|J;3WteT}X%'JՋ񦤭EuUgmX_)V=ua+c]cgS1)vt8$/3xPфm %'/JiN5&ǞeS3lx#r9M5 K ` Dq bARk_'#dP$P _njFBb`5ғ2iX_(SH/75b!10XDPWiI4, /))_P``X`WiI4, /)@sV/0( *_ԋYVr,ȗ"8"A36Y/)H/75bArk_'"A36Y/)G~hTWiIȐcͳdK `I_QRk_'"A36Y/))_"(&EJɯuEϞ2 aT$r3Iȑ, lx L`Px`3l`+=>chcf5& M@Kq`¤y5ucUxSl"s;->Kr>.RnW_5bs5|vsqE,!].8U;|"aŃˈ/{S, \Gk>wZ}jwl %#ȮX%'JՋ񦤭EuUAzx=W\1mNsqE07B,\7ϝyM.MΙ/)_ )P"s;->0 8p@$F 94nn 0Uh;)DYF.Kf %@Ԝi+{e'}^OP_s4{_YZM>#,T_jF"K+#XPB29*5(M, Dpqkr$vǒ$H~l; À_> r;->ֿsqEVyL gAQiAOF=܎F $VF';WONɬO4@JOMG=_f)S:xp , $MD&ǵ"ZbDqD&ˑ_&'p<885 j/_c;->ʵ;"89L=MB)rLj2iX.IMB\y5LW: j/_E-!GH2iX _&Py#Ã_ ɦ`/_c;->ʵ;"89L=MB4, .IMB)rLjǓ_Mɯu_WiJ7>wZ}_bj,L\VZ0|5qgSUbPB7)/sjD9jD5ynJA9t6U>jũ/JӷZ1|^f1i@oJ\~W.fW'ϔ Ԝ<jƠB-1ia!P^4عKn6@`|`a+@6J'M+(HÞzJwҒjJ i$͆Z7ϝeZ03ڝNsqE>X#c;->$r9*XQYĞG#^#c;->ʵ;&aiRzj98N|(9NIÊ_f)S:xp , $M`ojO)D2HCQisڝ.D܉ j/_ iHy 2is;->{S sqEVdH/P>tͩyMMB[ p>w<*$JAg)d)4,'3Ns5z.#SjF%L > x4, .OaUcc 2iYW)q:)_W:obs̜ 3xPB#3lYLmBA3l8I$r sgLڗ)x 5"36G_d栄@lMMAͳe315"36Áz0"MFk $;oje9(2AֿϹ3j^hZ.} OAFrVQ<8!ǥ$@8OMBI $exۦykۦy6{ey8B@*܎A2sPB 1s I3b@Az Wr rjKdP.IMB1rLjBX`P_܎AMB̩|LDsV/  &SMBB DsV/*E:ҕaI9u#aBͫr99NM5 KdP(&M5 2iXG_njr jeM5 `$~hW4,ʚjR$~P*,&uW:MCAɯMCSdP \H2s6nR_0> yL@瀍MB_088M5rL{&9BLj@> eǓ_܎ASɦP8Ջ4,ʚj$I75b` 2iY4/)I75bB TX*M_W\!0hBJ'#< @<1K1A8Q0lsqEr Ba %sqE{,xTW\!0hBJ'#< @<qK1A8^|ߩJy66i_`U<^'9#f %¤:]`^|6΂'>7Kr>.RnW_5bs5|v﹍!bK 89y䭣Ny+'*oW_8yqf|N_8qf{SsB˪/ I75bi+r]cPz=u<=+hӞdzπǮJ6΂'>71Gj[&Rzj9)I}`My6/Fi6-Ħr_`FS}﹊x#﹍!erWXRzj9Ôx[tM%soD/lӒ ;)ӑ%'/JiN I_!dPy~ʵ;G jKǁ#qaHr#cbܦɦ`IrkI5uDs `pDqEϞ2 aT$r3Iȑ, >< x{L%|﹍!l0^kfӷz0mY %8yqRkXWYX 5djAn=f;_٧%dvS#36&Re2k_|*F-C\_)v"AͳLDq _)9 }fm `)_,&Rr$;@#X`aRA:JNDsgyB _nj"`$T0UBBf@J7 |``ͳ026 ܁36ȓWXLӥIO43 r; ('s4`iVI$"@r VX;>xL(01P#'"GxlH+ǁ/ *= 7>Sl;TQ'ٺAǰDžI75bk_a wϙ6#QD{f?i#.f={Ti:Ӑsסs3WE%m\mg)_f>\(S&|q#ɯ3{.G*6M6*X!c3lDGH0LDqӗyB^e(j\pzN}75bB"E u)G Eɯu))Br >oɯu)G <.ɯu)$G Ѵś:JND`r;-1yM{9P0ԹM1W~Aak_܉>\iu]<_L Py5Tya%Rv0(*ñAa>\(PA>0UBBfܰ> DsV/,EJ_)9 |q#)eFPw,"8Ջ _)9 |J'0UBBfܰ> DsV/0(*&*3Vl27L> s7A6Ջ 1Q` 5X9W7A+# 9(t:&WKr>.RnWK񋚱|:S3W\ՌmHޤ`4+j$7A'*oWKX0UAPi5o*X!c3lDJ7%R3xPe =2T$.*T,pȰP`)yژmU|n@U ;o*X!c3l*MĦH2&{ ʋDqT"E_njnJ9_lersрd+5#$I6iؓy)QFG%4rQ'Od$s$H3Wܸ#-jVS_dҙ*d7{Ry^J|6zs4/І2?5qŞexnI-J̶f.y3Wm˂<^!rьsцס9V7gX-C|Mig$EDM5 _!eZ"8M5 'p<885_IB:fA{&E2iX@k_djPn`6iǚsчF.pڢ"DiIȐɦ` r U#dP(Py#Ã_ ɦ`Q~"d>0UAPnSdPrk_$HסgrmMm:S4;zj92\̑Rr$24,\a||n@U gc`6AMB6FPTG"8J7 |``ͳ6M5 ɬbQT+.BFɦ`Irk_/*Rihs5{3;,U#s̆K37<%%>0UBBf܈/HB`A*NFy)9=eAX< x&0TT\LШ4, \ 9qS)D<8 l|Pif>Y@5_r9M5 >0UBB* , \8 TVF' #dPyrk|:SԒ.\6{cyL5{TP2X?k_f5{yMI$79L<܁36Y.Od@r#r$>0UBBf܋2%0IxnJ96>\2%ɯur$ *X<7%RcʋMXT"kZ ]~5{ %LF ϹmzFڒV`ދRJW,aAeuX9W7A+HRlT\\Ԓt#&4m60fA3$RJWDWKN&UN9ꪪrT{R=T;5$5q SLX!d/(ԶO&ijK̥ KF0O1ny`ҁK<^f!r9Hi9NjNm%M$oXo'\{_ YOlwgZo=XĬm%4j[y9RҴ$Gς#d模D ƨ!2DX0՞m<yB^0ь8ɫJw)Fϴ-%5x?rIijÙte=MrM0 }IDjM#ՌJ #yO4@IB,#r$2Sl"sa{ l{V1+,yr9_aɯu_njEXꪪuyt"]ԏU&őE'>I( \WKr>.RnWK񋚱|V|!|:S!r]g7* Hi_3WEq훠#*,TP~y<2|dK#f.ՕфsVS˙lo(/SB+]UUUUUUUUUUUUUUUUUUUUUUUUUU.JjGgbȢ`椔$/ȐcY% _nj>\2X@k_+_njE_WUUUUUUUUUUUUUUUUUUUUUUUUUUKϛt ђunGMxu*MIr)3UAx $5q]lE$ahXLr].q`8 ꪪrTcEhȃ/(ԶDSaŃ˓_i4aX  Q3!s1`^f6)3UC&JmP^6S & Etr=#731S <șmrXh<5 "&26 M "M皂jlmk_lje0L cT(ș`U0/3SE%F _jI@j/G)Xbc":ngdL_6,4C՞ "&26 ZP"M皂jlE%mk_lje0L cT(ș`U0/3SE$aR6T؋RHO aV!pXȠrrNAǤff*a8ͮK gj!Rk!sk2 E$ah&A56"Ԓ0IuuUUUUUUUUUUUUUUUUUUUUUUUUUTʼ].jI@js"sTP"tLX6|\_5bs5{6iǚ(lnI%-I( \w#٧ktK=X4k,w#AXyU7IuQIϽsV/3W_3M3WE1* ZPwO=^⛟h"]bq2vEtaŃˈ~IǶn;]xuUUUUUUUUUUUUUUUUUUUUUUUUUT*cE%ςr0QC2A"85E2,\9M.M@XZIs5yah -3 zP=gkܗjXڒj)@Rь[g=(1q3{R4י/ȐdLǕ*(\'5E'D5E $ΌbIj62 & SFjՔ|z0_b#"D!AA)3UAx9Lx8LzN}~)ki|)3UAx9Lx@zN}~j !|)3UAx9LxQ,%iIB6j/G) Es I3])^ 8k"rqQrԒǜ7=Ht^5֋RJWx9Lx8( *.?I( \p84ڛ E6jI@j/G)\\<E'>q#_l Ѓ'Ԓ7Vz-I# <-7<̳ 5qf؊E$ah1AVƮ:-I,O /ZFxX^6SʏsRHO a8a5qE7 "Ms1"dA2DX<^.Iϵ3lEhfDa}B"E2#r9JmP^6a|xQG\!0hBJ'#< @@^&8~r ZPys7(+3*6iǚ,=V68qU$N[˓U)dYXh$5qܒ\=XcTPxTWiIȐb-I( \EhǂŇ_njE_)9 E%mqQrȎ/75b {R=T;5$5q SLX!d:JNDjI@j/G<Dqcڑ49%Dk_G=%e;+ӏm@mriMǤq GhTiJ#t=V#dUhNj DqEϞ2 aT$r3Iȑ, X%j(l ť8mr>1cfyσqchs_RKt\95R_pVI%RJWm%Չ!5EIu"Ԓ^6a|x,Xy_*,TPy5ғ ZP/EǑ_njz6v *..jI@jA2DWiIȐdUhNj m$5q_*.Ty_jGgbȢ`椔$:JV8ՋFD 1Q` BAEJ_WiJ~Iϱ|E'>ÕxYxSD\F}LZDDq+ӏLZYM.M 3{&MCiH7SlҁKajXJOMG=e0!qRcEL ojDť 1 !fmIvW.OMG=KQY9"D#m<֙sсo&I2A&%S<_+ӏ&H28,_=!"#VWg&hpDi esÏIYNzRMP)D4$G_h\ڂsisа)2It4A`Ir8l GdPbl&T\h_$qM5I-,|l$\wQqdPbO $xpqkr$49& iE-"#򚨣nf<Sޔ s+cl&ɯDf_< OaUF|l(=W#/S)c$|lRɯu_dj+3W4I--. xK&m<[e%=5"tͩyMa=$:fԼ|l$\uUnF fIϼ>ms<_%|qQ|"Kr$00 ɦa}PDqVQHÞzJwM=5 &oFй)7AjxRV"C"5"tͩyB D 1!mK@ XAA3j^P R XAA3j^P HG\!0hBJ'#< @@ǁ/[4I-"@K+ӏLZC¤_W:%ғ!8,_=!fmȎ/MAQ||l \фH&oaUb_<l&||r84c4$|lRɯu`W9ͮ{g6#X?jQU&|od5 r dPT_(G"8 g |l$qW#8M|lyq^@GqgyM`H$WH2Sl(S_njEJ_W:_(r >oMcUxu8I܏ԒHhaIDd3> סlj_zt%J%:[B͌zеƚ.Sm j`hKxՋ 5q]ϛn3N`f-OZ$|#>i] 5Ui%SB+,\Gkp#j-$j b?I4EuUUUUUUUUUUUUUUUUUUUUUUUUUT*cZ$_ Ë/G_nj:od&y5ȐaŃǞǑ_'I6nU (>.Rr${g =YN _)9 8y~TDqZ$ٺaT$r3Iȑ, lz _)9 8y~ 6GůMBJ'#< @@1@m¤:JND,_=W"8N-|l0Q9|\H b Ugm¤:JND,_<ps#Ȏ/_$7AL*NFy)9=eAXǀ{dxTWiIȐaŃǥms̏"8N-|l0Q9|\H bzVѧ<5ғ Ë/UL%cȎ/_$7AL*NFy)9=eAX$C6JDžIuX6| _)9 8y~7 X#d&~S %GNDl`V 7 X5ғ Ë/s|5cȎ/_$7AL*NFy)9=eAX$ǹ>nRk_'"A/_#d&~S %GNDl`V L|c¤:JND,_>cȎ/_$7AL*NFy)9=eAX$qE&Rr$q`EUgmȎ/_$7AL*NFy)9=eAX$)9πDžIuX.Rr${gP~=t\#¤:JND,_>6NyGůMBJ'#< @!mdxTWiIȐaŃǩr#d&~S %GNDl`V ԌHxTWiIȐaŃǾr&Ǒ_'I6nU (>.Rr${gP+Mț&Rr$q`$5qDqZ$ٺaT$r3Iȑ, @.=#¤:fF %.Rr${gǡ Q uXo$^_)9 8y~FBb`DqZ$ٺa"J56R(=Wm0 P#'"GxlH+c| X %0WiIȐaŃ2E2#d&~S QIA< $BJ'#< @ m0 Q uXDxT`xMH0   #d&~S QIA, xH*NFy)9=eAX$σqRA :J58a5ғ Ë/L"qkf?)(HT %GNDl`V 7 X %0WiIȐaŃ*TL"qkf?)(H=V< $BJ'#< @c7 X %0WiIȐaŃ,T"*TS"8N-|l0%)pAT$r3Iȑ,  sxT`xMH0 "E2#d&~S QIA@mpAT$r3Iȑ,  ( %0WiIȐaŃ& PT`T?"8N-|l0%)6JǀᄂIDgr#<6X$<.$^_)9 8y~"c"Aqkf?)(H_)V< $BJ'#< @!mdxT`xMU Osm0vXՔ"ϙRtcpiJEEb8LӥE-5| 3W+d+5 jR.|4P`c %GNDl`V %@QRqkgdm{RJfPA٧kt{-|liX<5qkf?)ɯuk!sk2 Z$ٺ"MkXd&y5X9W7A+&pLNsunGMxu1sV/3W̤\t*UMJ5b}cT )3U@ZP.jIinW9dIteTuËmP9!ȵ$4++|`i%Ls_$;+)19$Dq8ItMkr$q`2Ȏ/_$7AL*NFy)9=eAX ]Oh\L%{ _)9 8y~`QGůMBJ'#< @'{zFDžIuX.Rr${gѦ&J 5ғ Ë/*<8It¨IDgr#<6X$.>p`T"E7^5zNDžIuX&nc¤:JND,_<,<8It¨IDgr#<6X$6<\<E'>?,xTWiIȐaŃǕǑ_'I6nU (>.Rr${g1ﱫ5ғ Ë/G_'I6nU (>.Rr${gqG4&:t"/1g;Ѧ&JDžIuk!sk2 Z$ٺ"MkXd&y5X9W7A+fKr>.RnWK%>5|ٸFLAY5y+)s\euf[3WC5qSB+]UUUUUUUUUUUUUUUUUUUUUUUUUU.JԌ X7@jw =%e;%%Z0`,LdP9Y'M JG) ?aA8j!Rk<Sa+)J;&26 VSjvDؔjE`jw¬ B1@f7\J#-N¤y&Ġ{R+,Sk!sk2 J"Bʵ;"M>YVr8Fjw.pG.[礬q_jw,|zJwk<S|NM#mN|(,X!apH7lb|j>wZ}˃iYJdpGܶ?P$!eZȒĤ|ZS|NMĚ: kdry5rWaNF)DqĦL O!dqkF y= ʚjxDqsqE܁f ,ȗ,6M5 0B>dO͕Y.Y"Md@rk4#mNR@e`v-7frPB7)\#O5f\O5Y,&in3WɩޓMYsqE܁f $a S'ϝr+,"\yr{"_0sqE܁f ,ȗ,˓xDqr+,"\/P"s;->1Bʵ;fD#c;-> 6VYfDf\"MA^k!sk2 r+,"\.DVF&d@Hl̉r<5u#mO!i "*FA ݱMGsB lӏ4EnR q|*/7-(<̉a3NŦKsMNn lX;-> 6VY%dry=|(,X!e˓8фH0Oc;-> 6VYfDf\r#ccpZBȊ&fDf_)sBAAcjw"̉pF) YB2%0I ͮ|11D-!dETAȳ"\.DW:^鹩8.XTR@N#$!ڢ_TRYL yǤq D{bCd 6& ݱMGڢ8|f .p8[TQ'ٺ_f-(<̉b q.fSĚ$a S')"̉r{"_T`h: ƨ2%ȓ_0jyr{`͉fDf_)GŪaɯ ͮ|0`́fP"\.DW: n#>\fP45(1i5{>EUӐyIǶna3WEq훠F7% %qSq3`7-C|sςJ5{cĚ$)Ě&a6i^Ae9r3Ĥ|Zdry=d 6&hfD=je03"sTP"tLa ,ؚaIDa*iOap9B 6&hfDf_)iY&26 ,ؚayr$:MafWnjN%)3r,ؚ/JGŪe1&a6i^Ae9r3Ĥ|ZSlg#' Y5,ȗ`iMD模D\̃%6r>.RrQB̉r$ȁ:^鹩8.X$|\ 6&jLI)"kdry5rWaNF)DqएfP"_)8)#&t9(A&26 N HIlME 2%ȓ_"_{bR8P"QI6nŦPMOt?S(\vjHrfPG1N<3WE3fDW[^|U7>\fi4bґ%HL$5S&NJ ;)ӑ%#/D#3 Y5,E2%G_S)qqrM1iH"sTP"tLad 6&hfDkF y=MB<=G\F}iJBȉ0r̉rTť!dDREhfDf_}ʋDqiتDME$YdKaNi4ŤA8P"QIayr$B>d+ӏU$,H ,ȗ,ˑ&ua+U">7,iE-)/D e0{ ` ʕiت,H@p9q$Od#N>Tť!dDREhfD`=Ȏ/DaJ4U@LZRDME$YdKa<"8"A8P"QIay}*,TPy1D-!dFn#N>-1iH ,ȗ,03cpX"t#N>I-" iت,H ,ȗ,ˑ&26 8ť"4\"\.DW:#sRp\!2DME$ۂc3WchcPIT3*[e(3[uRlv|#zypdyJ3.p$a 5jH 'Dq$O`͉f.Y.Od@r87M52h̎'5E'D5E$Y.`͉f.Y.DфH0OdP.Oap9h̅QIay|ɦf\\̃Y5f.Y.Y"M_{bGLY5#n Zo<^|z|665NYU%Rl m5QU&jg1)y&A2KF YL<ƨ0r{ G"Aa ,ؚaD#/3xS)<2::$fD!d 6&hfDkF y=MB<=G&d,H ,ȗ,6M5 0B>dy$̅QIayr$:WnjN$9 "&m@ݱMGrW#r-Rl m5QU&jg1)y&A2KF YL<ƨ0r{ G"AaG lME 0r̉r{"Jiȹ+NӑD模D ƨ2% 3 Y5,E2%ȓ_0ja<"8"F;NBȉ0r̉rwZ}ͳ͕ۂAc3Wm˂<^On~$O͕^鹩8.XcpXfmv-7f;y1D--ğsBDUA4"Aa>YVr,ȗ' p9Bf܋2%Sl"scjw"̉r$"A0{Qi YB2%0_Qi36 6VYfDf_)6΂'9,SdK69@e`dKaȓ_sB3lEy|;:" *E!i "*FEyr$:ްaaOcTREh=r#F 0{ lME 0r̉r{"ƨ;f.Y/қggAAd,E 3 Y5,E2%ȓ_S).GAAd,E lME 0r̉r$"A0{AM4'8!rQB4\"\/4,˓_zÑW"Aa ,ؚaD#/QAw"4\"_)6΂'5E'D5E$Y0f@bj(YdK&)S>\R0ryAd,E lME 0r̉r$"A0{AM4'8ؤ`4%`lME 0r̉rD"ՔJkpjIh$5q9BF9(t:&x?k3M_,I-" iت,H KdKaȓ_W:ްa75b7|5k]UUUUUUUUUUUUUUUUUUUUUUUUUU.r>nWK.ms]`ۑrt"]F>6fVx[6W'*oWKX<4عp^ͮ}\1sk2 #//8 &X 1: if value[0]=="Resource_group" or value[0]=="Storage_name": elemDict['Name'] = value[1] else: elemDict[value[0]]=value[1] else: elemDict[value[0]]="" if len(error_list) > 1: defMsg = "Error: Invalid arguments %1$s entered and ignoring those arguments." displayMsg2(UTILS_LOG,43,CAT_FILE,72,defMsg,','.join(error_list)) return elemDict kC56+*b՝ab&* # ./usr/es/lib/python/cl_utilitiesiesL_L#---------------------------------------------------------------------------- # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2018,2019,2020,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # %Z% %ci% %fn%, %R%, %t%, %G% %U% #---------------------------------------------------------------------------- # Import Python Modules #---------------------------------------------------------------------------- import os import sys import inspect from datetime import datetime try: # For Python 3.0 and later versions from subprocess import getstatusoutput except: # Fall back to Python 2 version from commands import getstatusoutput #---------------------------------------------------------------------------- # Global Definitions #---------------------------------------------------------------------------- DSP_MSG = "/usr/bin/dspmsg -s" HA_UTILS = "/usr/es/sbin/cluster/utilities" UTILS_LOG = "clutils.log" CAT_FILE = "scripts.cat" #---------------------------------------------------------------------------- # Functions # displayMsg #---------------------------------------------------------------------------- def log_message(logfile, msg): """ Function : log_message Description : log message to log file with file name and line number. Arguments : Logfile and message. """ filename="" # stack utility of inspect Python module returns the list of frame records # for the caller's stack. First entry in the returned list represents the # caller. Fetch the caller details for the function. frame = inspect.stack()[1] # Fetch the file name of the caller function from the stack frame filename = inspect.getfile(frame[0]) file_info="[" + filename + "]" + "[" + str(inspect.currentframe().f_back.f_lineno) + "]" date_info=datetime.now().strftime('%Y-%m-%dT%H:%M:%S') msg_info=date_info + file_info + ": " + msg with open(logfile,'a') as log_file: log_file.write(msg_info + '\n') def getFilePath(fileName): """ Function : getFilePath Description : This function fetches the log file path configured on the node from HACMPlogs odm. Arguments : fileName - Required; Log file name Return : Log file path configured on the node. In case of failure, this function returns default path of logfile as /var/hacmp/log. """ # Fetch the log file directory configured on the node from HACMPlogs odm. cmd = "%s/clodmget -q name='%s' -f value -n HACMPlogs"%(HA_UTILS,fileName) status,logDir = getstatusoutput(cmd) if (logDir == ""): cmd = "%s/clodmget -q name='%s' -f defaultdir -n HACMPlogs"%(HA_UTILS,fileName) status,logDir = getstatusoutput(cmd) if (logDir == ""): logDir = "/var/hacmp/log" logDir = logDir.strip('\n') logFile = "%s/%s"%(logDir,fileName) return logFile def displayMsg(*args): """ Function : displayMsg Description : This function displays converted message to the user and logs the message to the specified log file based on input argument. Arguments : args[0] - Required; Log file name to which message is intended to log. In case logging is not required an empty string should be passed as first argument. args[1] - Required; Set number of the message in catalog args[2] - Required; Name of the message catalog args[3] - Required; Message number in catalog args[4] - Required; Default message to display args[5:]- Optional; any arguments that the message may need Return : 0, On success 1, On Failure """ utilsLog = getFilePath("clutils.log") # Validate if set number, catalog file, message number and default # message arguments are passed argLen = len(args) if argLen >= 5: logFile = args[0] setNum = args[1] catFile = args[2] msgNum = args[3] defaulMsg = args[4] else: msg = "echo 'displayMsg: Invalid Arguments!'>>%s"%(utilsLog) status,output=getstatusoutput(msg) return 1 # Fetch full path of the log file configured on the node. if logFile != "": logFile = getFilePath(logFile) dspCmd="%s %s %s %s '%s'"%(DSP_MSG,setNum,catFile,msgNum,defaulMsg) # Capture arguments to message, if any. msgArgs = "" for arg in args[5:]: msgArgs = "%s %s"%(msgArgs,arg) if msgArgs != "": dspCmd = "%s %s"%(dspCmd,msgArgs) # Execute 'dspmsg' utility status,output=getstatusoutput(dspCmd) if status == 0: print(output) # Log the message to log file if logFile != "": msg = "echo '%s' >>%s"%(output,logFile) status,output=getstatusoutput(msg) else: msg = "echo 'Command %s, failed with reason:%s' >>%s"%(dspCmd,output,utilsLog) res,output=getstatusoutput(msg) return status def displayMsg2(*args): """ Function : displayMsg Description : This function displays converted message to the stderr and logs the message to the specified log file based on input argument. Arguments : args[0] - Required; Log file name to which message is intended to log. In case logging is not required an empty string should be passed as first argument. args[1] - Required; Set number of the message in catalog args[2] - Required; Name of the message catalog args[3] - Required; Message number in catalog args[4] - Required; Default message to display args[5:]- Optional; any arguments that the message may need Return : 0, On success 1, On Failure """ utilsLog = getFilePath("clutils.log") # Validate if set number, catalog file, message number and default # message arguments are passed argLen = len(args) if (argLen >= 5): logFile = args[0] setNum = args[1] catFile = args[2] msgNum = args[3] defaulMsg = args[4] else: msg = "echo 'displayMsg: Invalid Arguments!'>>%s"%(utilsLog) status,output=getstatusoutput(msg) return 1 # Fetch full path of the log file configured on the node. if (logFile != ""): logFile = getFilePath(logFile) dspCmd="%s %s %s %s '%s'"%(DSP_MSG,setNum,catFile,msgNum,defaulMsg) # Capture arguments to message, if any. msgArgs = "" for arg in args[5:]: msgArgs = "%s %s"%(msgArgs,arg) if (msgArgs != ""): dspCmd = "%s %s"%(dspCmd,msgArgs) # Execute 'dspmsg' utility status,output=getstatusoutput(dspCmd) if (status == 0): sys.stderr.write(output) # Log the message to log file if (logFile != ""): msg = "echo '%s' >>%s"%(output,logFile) status,output=getstatusoutput(msg) else: msg = "echo 'Command %s, failed with reason: %s' >>%s"%(dspCmd,output,utilsLog) res,output=getstatusoutput(msg) return status def executeCommand(node, command): """ Function : executeCommand Description : This function executes the command on the node Arguments : node, command Return : status - return code of the command output - output of the command """ # Fetching paths using cl_get_path all, this is set as PATH while executing command status,PATH=getstatusoutput(HA_UTILS+"/cl_get_path all 2>/dev/null") # Appending path to command command="PATH="+ PATH + " " + command if node: # Fetching local node name status,localNode=getstatusoutput("PATH=%s get_local_nodename 2>/dev/null" % PATH) if node != localNode: # Check whether node is reachable or not cmd="PATH=%s cl_rsh %s date 2>/dev/null"%(PATH,node) status,output=getstatusoutput(cmd) if status: defMsg = "Error: Failed to communicate with node %1$s in a cluster\n" displayMsg(UTILS_LOG,44,CAT_FILE,3,defMsg,node) return (status,None) else: # command is executed using rsh only if node is not localnode command=HA_UTILS+"/cl_rsh "+ node + " "+command status,output = getstatusoutput(command) return (status,output) def log_stderr(msg): """ Function : log_stderr Description : This function logs the message to stderr Arguments : msg - message to print Return : None """ # This will work for both python versions 2.7 and 3.0 sys.stderr.write("%s" %msg) def check_config_file(path): """ Function : check_config_file Description : This function will be used to check whether the given file is exist and it has data. Arguments : Filename with fullpath Return : 0 - File is not present 1 - File exists """ # Check if file exists and it has data. if os.path.isfile(path) and os.path.getsize(path) > 0: #If file exists, checks the read/write permissions return 1 else: return 0 def rotateFile(filename): """ Function : rotateFile Description : This function will be move the file data in to new files. Arguments : Filename with fullpath Return : 0 - successfully rotated 1 - failed to rotate file data """ filenames=filename+"*" # retrieving the list of existing files associated to file which is passed as argument. command="ls -lrt "+filenames+" | awk -F\" \" '{print $NF}'" status,output=executeCommand("",command) if output: filesList=output.split('\n') # retrieving the number of files associated to provided filename. command="ls -lrt "+filenames+" | wc -l" status,output=executeCommand("",command) if output: # Removing leading and trailing spaces count=output.strip() for file in filesList: # Rotating files count should not be exceed 8 if ( int(count)<8 ): newfile=filename+"."+str(count) command="mv "+file+" "+newfile status,output=executeCommand("",command) if status != 0: return 1 count=(int(count)-1) if (int(count)<0): break command="touch "+filename status,output=executeCommand("",command) if status != 0: return 1 return 0 dspC l'+$,bX՝ab& # ./usr/es/sbin/cluster/reports/templates/cl_report_template.htmr$$   a"12<=>DTcdelrst%-./03456789R_ino,LbghmpwABCEHIOSVfuvx!:;MNPky#FGUYZz{}&()*Kq j+W@|X[]@L P`sa$aB(((((((((((((((((()'  TʃB AQe ]v1xE!la6{kdCE I…I9P$Ȁp Hy,,.xӉ4aG8QO8^a%Cj.Iu I…I9P-Bp(T @Re_ ((((((((((((((((((P (T &Ia890"# .`bZmvF2[hck0hbeq,Y{kl<*H!SHY$y\24P 61Br`:i;(I9V`)CK@cY20Le@rCdw lPA@xrl ((((((((((((((((((((]C"%ssfL`)d$! ,!@LL,)S,d3<0! C"Yp&4h0ئyD`C dbW. 4h\hs`<6̙`1N @! @k aYb@yske2`2ap!2aM+;[fLE`#NsiMlɖȠj P0̆a4appޱsÙ\ $d`8Hu hh$U& YlL= "hsm,!4hƂAKr& l9r͢ḯ"2Dѱ'5'l:. Ck"hpaG4Qㅔ H,Ǒ&xe&<,㇋&qI:paGq$HGqd(pQㅔ H ,y2# xe&<q&Dq,Dǐxc"D(ӏ,g@(г ,"E p 8y "Ly"NPYB y1d $t, HBG@y"B8e8QHp$DC81D 8q1cJHŜHg&,iC 8 II@p4y! 8i1cH4PP, Jqœ"@2C<4@(qcGqN8D8(qcGq ,"E DYBȎ! 8&qP2#A'xd,|,Ʌ4YDž4YDž: IyxdŽ ,E 8IE 8xg,!GFyȅxdŠ@AyYDy{kqEԐ Òw 0ЀFcBBD.a0%'PfDL0eA2b(RNU&Y͛ep&U #%1jNAmVHH4S+ea0 4Ͷ """,Dp,qRw á0 @ 6&' 8p# L,GDy! P(,Dg 8p# L,QÅHidg q4G<$ƒ$H,i$H#8p (P(Ő$D"D@G,iB 8pD 4<ď>pdǔ xdɍ<LyBGxǐN,(,2>pd@iGPǐ8YLXǜy$(<@ &Dy!N,i"DL(B"HNqcHBGH":qd(LNj 8Ǒ@Qą@ǔHX$qc$<0 &p%8G$@(&y$&HDž4Yȍ&qAdI 4i@ 4qgPY,i2N(,pC8("DĎPY pQㅞyGBq1e$@( 4 $DC8Y4 Ő$Lhѥ,N&,x$,A'qÇpQㅞPq ąLp,'$@tBȒ8Qㅞ4'N$,xH xg8S iM 2Ylԝ& a4Be2a6jNA@8 ,U&ViG0L&2Km2`ԝ(w iU{+2"jNNiMU쬡v\ڦXhA`˴XLdf&TABX{M"jebDMI2B0,VHȦ \щ;i;I2{+mpm%' FV\V\%#qBw iU{+2"jNNiMU ].Aޱs2B0iMyClD2<=q)LYrII PNABX{M"jebDMIa4ke5'$,ol"f&iU{+z˲jN@I+.YY@bADD^޲욓`˖a Y@b(U'Z=5WS"&ADD^ɽ`˖ihJN(NNiMU쬛y;& f Q4(VHY7RwLYr =CĤ@b(U'Z=5WS"&ADD^޲욓`˖Txx,cRw1DwuX{M"je`ZYvMI 0eei0%'M'1B; a45' 'U&VMԝV\Cp Q4(VHY7RwLYrZlJN(N@bRw iU{+2"jNNiMU ].ɩ;& fCZ,cRw1Dw*PVHXRwuX{M"jedͪea;& fCZ&TjD^LiU{+z˲jN@I+.XA0%'M'1B; a45' 'U&VMڦXhA`˖.hJN(N@bRs %y,0dD١̛iq̳05l1x{˘m.$]I;Paj`P*PT8P.1l9x8$ "Y ] I…T^p<"r`"Ìh* Eaڪd<=s 23 PVHXRwuLЃ"9'H6iMh$) ٰˆ66"]fÑ8h);{aX{M"kA K YvMLG O4i;Rw1Dw*`˖UY{k\RwLYrʽtRN& & aBQB@j`qI9@+* @1PH*J@0 I& a4Bb\@-=40LL6I(D^(6ɖDWis L:NABX{M"jebDMIa4. T <'f&TABX{M"jebDMI2B0;YZ=49L0w1Dw* d4ebͮ \MĤaBd"ʫ+&B"<XI; a45' 'U&Vdu`rXRwz=52ɳ]Pic\JFCKxzR@`'M'1B; a45' 'i54$-U {L̈UX{M"jefxc d h+s& edS%C` L)0 ԝ(ViMUTȉ;iU{+z˲:D09w\iLЃ"zN`0%'1Dw1B;PVHXRw 'U&Vdԝ 0ee,cRwM'uX{M"je`ZYvMI{a0I ABX{M"jebDMI(VHY7Rw% BRwM'uX{M"jedICK4%'1Dw1B9jD^LQ:=5W-w&@Id ,`˴Y(NADD^޲욓'Y4ME `JN@b@bRwZ=5WS"&NiMU쬛y;ic,XhJN@bNiMU쬛y;ic,YE);&I+U&V*dDԝa4ke5'B]0%'1Dw1B;PVHXRw 'U&VMԝ 6\=vD(N(U';PVHXRw 'T <'@ViMdS.hĝI  iU{+2"jNADD^޲쎴 ]0mS,4 D ]RYI ABX{M"jebDMI(VHX]R@KM" YI(VHX]R@I+.XAY.X@ `JH Q4 PN+U&V*dDԝa4{o5$Ya) 1Dw 'U&VMԐicV\%̲]4JH Q4 PN+U&V*dDԝa4ke5$BKX@ `JH Q4a4ke5$]2 `JH Q4 PN+U&V*dDԝa4{o5$X 2]) 1Dw 'U&VMԐv, I&IjD^LQ:=5W-w&`1ꁅ YI(VHX]R@H@1YI ABX{M"jebDMI(VHY7R@K!aǪ I&Q:=5Wom椀cedJH Q4 PN@bp@X)'M'{]˪={fDRw `=5WJ<1Ͳe4A\olABX{M"jebDMI(VHX]ւ!˽bMeaw$=E `JN@b@bRwPVHXRw 'U&Vdԝ hE `JN@bNiMU ].ɩ;h I Q4 PN+U&V*dDԝa4{o5'Z. ДI(VHY7Rw%.ДI wZ=5WS"&NiMU ].ɩ;0I(VHX]Rw%p`EC0I ABX{M"jebDMI(VHY7Rw% I Q4a4{o5'W 4X$8JN@b@bRwPVHXRw 'U&Vdԝ Y(NADD^޲욓+ ,Y(N(U' iU{+2"jNADD^ɽ! ք(NADD^ɽ+ ,%'1Dw1B;(ViMUTȉ;iU{+z˲jN]0%'1Dw 'U&Vdԝ i0f2W,cRwM'* a45'uX{M"jedIK%'1Dw 'U&VMԝ i0f2Wi;T+U&V*dDԝa4ke5'YX@cE `JN@bNiMU ].ɩ;hy,cRwM'* a45'uX{M"jedIV.ДI(VHY7Rw$ `! %'1Dw1B;(ViMUTȉ;iU{+z˲jN fi;iU{+z˲jN4X툙d ,cRwM'* a45'uX{M"jedIDi;iU{+&jN4X툙d i;TRN(N@bRs %y,0dD١̛iq̳05l1x{˘m.$]I;PaʀRP*PT8P.1l9x8$ "Y ]Bw0U\ܹX-/` 0jqv\p @ /$+U&V*dDԝ(S,4 h$U& YlrCDӈ.aȜ4h==5h&D&pУç4ĝƂA;i;I d4ebͮ \ie^ I:N@bp@X)'ww0X(! A@h* @)Ph$;P( A * X:( IH0 I& a4Bb\@-=40LL6I& a4. Y , `1) 10`=' +U&2)4bNw X{M"k&DMI (T @iP8]0P @`()' X{M"jXheA 8XxeA6y;Ua4˽bMI,ipW0wYe,cR@`,N@b`zNw ;P Ua4Q.yL&2Km2`ԝj`' iU{+2"jNADD^޲jNXAa0%'1Dw 'U&VdRw%ʇafW0Y(N(U'Y , W0eCfLmpm%' iU{+2"jNADD^ɽ5'Y , W0ؔI(VHY7Ƥ@K!.̮`JN@b@bRw%es T8 dȉfaYs ICK=6YP,Ye0.BRwS; I LI 0UVHYd h+s& I(wZ=5WS"&NiMU ].@K!mYdFB,fi;iU{+z˲y;if{-xA, ]0%'1Dw1B;if{-xA,ɑͮ \MĤABX{M"jebDMI(VHY7Ƥ@K!mYdFB,I(VHY7Ƥ@K!mYdod5vĤ(N(U'Y ,oe6%2"Y{k\Rw%6[,kYe0.BRwS; I LI 0UVHYd h+s& I(wZ=5WS"&NiMU ].@K!lȁg] `JN@bNiMU ].@K!lȁg]ͽ,cRwM'*,i"mvK2dDk0,oe);PVHXRw 'U&VMq;if2 YdFB,I(VHY7Ƥ@K!lȁg]ͽi;T d4M,kY"%\0dh,jNA0`>iMU ].椀CK42 `JH LI d4O\+.Y"%\qWx)&EecRw X{M"je`ZYvO5$YYYCK44]2dDk0,oe);=5Wom皒Y ,,vwY ,,v,ɑͮ \iffe\˘T I LI (TaiҠ @`,&  P8ءIsPU2eU!ɕWi`\« I`}VH0(`PzŽ>4(`PMGjN@U'0Y =49w\i % Uv.`4 I ;;(D^(6ɖDWis LP L@K!2ffLmpm%' iU{+2"jNADD^޲xLPu@h욓,Y ,cRwM'uX{M"je`ZYvO&(D͇ 4AvMICZ,@Y,cRwM'* a45'uX{M"jedχ&(D͇ 4AvMICZ,@XAI Q4a4{o>6(5'Y hfdJN@b@bRs a45$M$F$II+U&V*dDԝa4ke>6(5'Y h+XA`1);&Q:=5W-w'"]fÅ &@K!ev 4% `JN@b@bRwZ=5WS"&NiMU쬛yYD.ɩ;kE]dJN@bNiMU쬛yYD.ɩ;kE].ȔI @K!2ffLmp0 d4&U] ,aUĤ(w1@8 ,0; -2]!U^Y2lUv.`6\a*P@*T(X4 J( (:(RNDL)GTqL)GTm 8Rw;Ua4˽bMI, `c,cR@`,N@b`zNA0`=' `=5WJ<1Ͳe4A\olS;PVHXRw 'U&VdRw%.l0Y`1);&Q:=5W-w',XM2u@0%'1Dw1B;PVHXRw 'U&VMRw%.l0YI Q4a4{o<ԝ d4l I Q4 PN@bj`'I;;0P(! @,Ap8(0;;PaiҠp44``,&  P8P @JLiC 2[5' X{M"haeLms P Ua4Q.m,. {e̘5' tjD^LiU{+(]6yH$],`1);i;I(ViMUTȉ;Q:XhA iCs 1'M'1B; a45' 'U&VdRwL<=r0%'M' 'U&VdRw[D,cRw1DwuX{M"je`ZYvO5'$퇽0 IIa4ke<ԝVepf&iU{+z˲y;!" .v0%'M'1B9(ViMUTȉ;Q:XhA iCs 1'M'1B; "e0ebͮ \MĤaB)vL 0Ĥn(RNABX{M"jebDMIa4{o<ԝiMyClDxzR5$xzR@`'M' 'U&VMRw[D&iU{+&y;&l=Rw1DwuX{M"jed5'%\ %'M' 'U&VMRwBE.]큢Rw1Dw* (U@+̄-/a"%dK=eYfa\o.au"$aB/J`p(  *X Ixc ˘A`A`XeE,Yo$aB..r0e0AQ-[.S!n@AqBw iU{+2"jNNyH$ejDE0\II PN@I2YWfaYs I 0b&Y *VhJN(wI;00 FMJ8P EAH* ءI;=40LS+eRw0U& TɆ0٩;UVHY2 .a\ɃRw I(ViMUTȉ;Q:=5WasjaDN@KK.勈4Y@b(U'Z=5WS"&ADaDN@ViMdS.hĝ Q4 +U&V*dDԝ(VHX]I 00 Q4(VHX]I 0m `1);i;Q:=5W-w'`D,cRw1DwuX{M"je`ZYvO5'$,cRw1DwuX{M"je`ZYvO5'$d W,cRw1DwuX{M"je`ZYvO5'%,4Y@bADD^޲jN@I{@af&T+U&V*dDԝ(S,4 Ia4̊`&T@KK.勈UY{kiؔ (V]uWo ]5& I(ViMUTȉ;Q:=5Wom皓a40qMxz蚀\JF\JH @bADD^ɽjN@Il \JN(NNiMU쬛yX{M"kÙ\ &L<=q)LxzR@`'M' 'U&VMRwz=5a̮DV\JFV\JH @bADD^ɽjN@Is A%'M' 'U&VMRw^̮BRw1DwuX{M"jed5'$퇽0JN(N@bRs %y,0dD١̛iq̳05l1x{˘m.$]P (UQPx0 , @X@iR`BOd^\Ű  $ ,.fW2xI;P@ %xxE*Eei{.TAVËTxz0eP2d\PjD^LeaI;YZ=49L0w1Dw*섋b{+mp0d$]U,Y); I P $@b`zN@b`zN@+Zd!4 *AP`n(RNs R Bw X{M"haW2fA0`>iM 2, aRw `=5WJ<1Ͳe4A\olA@@50PVHXRwuX{M"jee 2B0D]]0%'M'1B; a45' 'T <%wX{M"hs".asF$@b(U'Z=5WS"&ADD^޲jN@IY@bADD^޲jN@Il \ IIa4ke<ԝ2 ,cRw1DwuX{M"je`ZYvO5'$Y@bADD^޲jN@I+.Y@bADD^޲jN@Is AY@bADD^޲jN@KYh IIa4ke<ԝ 0%'M' 'U&VdRwZmZ,`ʦX2` II PNw iU{+2"jNNyJ$ejDE0\II PN$d W,Xk0,oe);PdchMa0kz 0Ĥn(RNABX{M"jebDMIa4{o<ԝiMyClDxzR5$xzR@`'M' 'U&VMRwL.`hRw1DwuX{M"jed5'%4Aq);i;Q:=5Wom皓a40ep&40ĤjH 0"aIt Q4(VHY7ID  2A@LYq)LYq) 0&iU{+&y;%6! Q4(VHY7I z2M IIa4{o<ԝ );i;Q:=5Wom皓omq);i;I@*rB× f2m2ճ0.a0БwBw0V×E@  ,`ruK  = ays×,, @,H%\@-Bw0PvP9{EJM˘U2 ]j7 `ʠdɀ I; a45' 'T <%wX{M"hs".asF$@b(U'$d W,Xk0,0{+4%'S;` LI LI…` L&E@  aBx4, * X;)'0U& eq,jND!2ʙ05' iU{+4\&X]D]6˙0jNS; a45' 'U&VPl.mS,4 I XLdf&TjD^Lea;YZ=49L0w1Dw*PVHXRwuX{M"je`ZYvO5'$,cRw1DwuX{M"je`ZYvO5'%4Ar0%'M' 'U&VdRwLYv0 Q4(VHX]I  4Y@bADD^޲jN@K&0 Q4(VHX]I d4 IIa4ke<ԝe0%'M' 'U&VdRwC a0%'M' 'U&VdRwC `M]V.E `JN(N@bRsPVHXRwuLЃ"Q' +U&2)4bN(N@bRw! ʽ6xmr6[ X 0Ĥn(RNABX{M"jebDMIa4{o<ԝiMyClDxzR5$xzR@`'M' 'U&VMRw[D&iU{+&y;& BRw1DwuX{M"jed5'$@$Д Q4(VHY7I `$Д Q4(VHY7ID  2A@Y  %) 0&iU{+&y;! "Rw1DwuX{M"jed5'$<@ɖ&iU{+&y;!LY.fi);i;I@*rB× f2m2ճ0.a0Бw I…[^,T4`p0']/.br`pH \D+e@ I…T^p<"r`"Ìh* Eaڪd<=s 22`/$+U&V*dDԝ(S,4 Ia4̊`&Tie^ś\iM 2, aRw `=5WJ<1Ͳe4A\olA@@50PVHXRwuX{M"jee 2B0RwX 4Y@b(U'Z=5WS"&ADaD;YZ=49L0w1Dw*jD^LiU{+z˲y;&f&iU{+z˲y;- `1);i;Q:=5W-w' ,cRw1DwuX{M"je`ZYvO5'%0%'M' 'U&VdRwLYv0 Q4(VHX]I 20a%6Y@bADD^޲jN@Hm0%'M' 'U&VdRwDe.W,cRw1DwuX{M"je`ZYvO5'%E `J]Ia4ke<ԝe2 ]v0 Q4 Z=5WS"&ADaD;YZ=49L0w1Dw* `$YWfaYbRw0XY꽈<y 0Ĥn(RNABX{M"jebDMIa4{o<ԝiMyClDxzR5$xzR@`'M' 'U&VMRw[D&iU{+&y;=VHsaW"h@HH4JFhIIa4{o<ԝiM`0s+4%)Y ;i;Q:=5Wom皓`˴%'M' 'U&VMRwC̄L6X@s IIa4{o<ԝBRw1DwuX{M"jed5'$@AY%q);i;Q:=5Wom皓m);i;Q:=5Wom皓lD Д Q4  P9{EJ! aX`ȉsC6efauj٘b0˘]hH$aB/ 9P:ҥ w0a  HX$]q̮ e./)' P9{EJM˘U2 ]j7 `ʠdPjD^LeaejDE0\II PN@K"ʽ6xmr˘XJN@K"ʽtRN& & aBQBB а  Iw0X *TVA`P`}VHd&) ٩;LiC *dklԝp@X*iMUҏ aslatMev0.d;P L+U&V*dDԝ(VHYBLЃ"I'$<@ɖ,cRw1Dw*PVHXRwuLЃ"I' +U&2)4bN(N@bRsPVHXRwuX{M"je`ZYvO5'$,cRw1DwuX{M"je`ZYvO5'$$Y@bADD^޲jN@HI0%'M' 'U&VdRwZmY@bADD^޲jN@Hy,cRw1DwuX{M"je`ZYvO5'%,"0%'M' 'U&VdRw^aRʇ`1);i;IABX{M"jebDMI2B0RwX{M"hs".asF$@b(U'{ YWfaYbRw0X]L̙`\JF$+U&V*dDԝ(VHY7IDטT8&<=tM@I%#R@I%$w1DwuX{M"jed5'iX.` 6Mh HԐ ;i;Q:=5Wom皓 hJN(NNiMU쬛y%lJN(NNiMU쬛yYq);i;Q:=5Wom皓 U Q4(VHY7I {@iK*"%'M'1B9…T^pBr2"\lM{fY]uf=6Z.I;Pa,8ʁ,T$K1[^ ` , @"눖eq,aqxI;P.WZn\¬V^q\Dl8ULacU LPjD^LeaI;YZ=49L0w1Dw* YWfaYs I ,Y); I P $@b`zN@b`zN@+Zd!4 * +аqI;aB A( b$D!1L eI`}VHd&YS&\fUX{M"jefxc d h+s& Ij`'Z=5WS"&ADD^mͪea;!h*`ɂ0%'M'1B; a45' 'T <%wX{M"hs".asF$@b(U'Z=5WS"&ADD^޲jN@Hy.a0%'M' 'U&VdRw[D,`ʦX2` IIa4ke<ԝV] e& 0 Q4(VHX]I `1);i;Q:=5W-w'if&iU{+z˲y;-+`1);i;Q:=5W-w'0Y@bADD^޲jN@J0 Q4(VHX]I 20hEY@b(U'; a45' 'T <%wX{M"hs".asF$@b(U'{hebͮ \MĤaB]5PaHPjD^LiU{+&y;=VH dه 0ĤjH 0Ĥ:N(NNiMU쬛y.%'M' 'U&VMRwLYv@bADD^ɽjN@U&\l9  $$%$w1DwuX{M"jed5'iX.` 6Mh d4JFCD:N(NNiMU쬛y\%'M' 'U&VMRw@2Ĥ@bADD^ɽjN@J@bADD^ɽjN@HyB/ea);i;I@*rB× f2m2ճ0.a0Бw I…[^Ł,T4`p0']/.br`pH \D+e@ I…T^p<"r`"Ìh* Eaڪd<=s 22`/$+U&V*dDԝ(S,4 Ia4̊`&TE{+mp0E{+4%'S;` LI LI…` L&@`X*@H8P `@px4, v(RNA0`>iM 2Ylԝ& a4Be2a6jNA@8 ,U&ViG0L&2Km2`ԝ(w iU{+2"jNNiMU쬡v^`Ƞ,&2B0E `JN(N@bRw iU{+2"jNNyHejDE0\II PNw iU{+2"jNNiMU ].wL<=r0%'M' 'U&VdRw&@bADD^޲jN@HH4 IIa4ke<ԝ2 ,cRw1DwuX{M"je`ZYvO5'%%r0%'M' 'U&VdRw^yv 0 Q4 Z=5WS"&ADaDN@ViMdS.hĝ Q4 wDE{+mpm%' akE{y! 0Ĥn(RNABX{M"jebDMIa4{o<ԝiMyClDdxzR4bN@U&\l9\@E2Y&I&IIa4{o<ԝiMyClDd%#F$X{M"kÙ\ ], .I"" It Q4(VHY7ID  2A@BAR5$D:N(NNiMU쬛y.%'M' 'U&VMRwZ.W&iU{+&y;/ <Rw1Dw* (U@+̄-/a"%dK=eYfa\o.au"  9P:ҥ w0a  HX$]q̮ e./)' P9{EJM˘U2 ]j7 `ʠdɀ PVHXRwuLЃ"E' +U&2)4bN(N@bRwDE{+mp0e^ I:N@bp@X)'ww0X(! X,8\ H(n(RNs ʂh840 I& a4Bb\@-=40LL6I(D^(6ɖDWis L:NABX{M"jebDMIa4. edڦXhA"Z.ٖKf&TjD^LeaI;YZ=49L0w1Dw*@H(ViMUTȉ;Q:=5W-w'I 00 Q4(VHX]IX<&iU{+z˲y;!T `1);i;Q:=5W-w'ol"f&iU{+z˲y;- 0eS,0Y@bADD^޲jN@KEJ `JN(NNiMU ].$`1);i;IABX{M"jebDMI2B0$,VHȦ \щ;i;I@K+hfYK*V, =4lJN@+*e6v5& I(ViMUTȉ;Q:=5Wom皓a40qMxzZ.ٖ@ 0ĤhĝiM`0s+4 $ $;i;Q:=5Wom皓a40qMxzZ.ٖ@  XJFID  2A@HDE $@$]a) 0&iU{+&y;!T  IIa4{o<ԝ{a@bADD^ɽjN@K`hRw1DwuX{M"jed5'%%q);i;Q:=5Wom皓˰%'M'1B9…T^pBr2"\lM{fY]uf=6Z.(RN@*r,( *@X@iR`BOd^\Ű  $ ,.fW2xI;P@ %xxE*Eei{.TAVËTxz0eP2d\PjD^LeaI;YZ=49L0w1Dw*Z.ٖ@ʽ6xmr˘XJN@K+hfYK*VhJN(wI;00 FM* bҠP8P T@`$ I& a4Bb\@-=40LL6I(D^(6ɖDWis L:NABX{M"jebDMIa4. T <$Rw[x\$]U,cRw1Dw*PVHXRwuLЃ"E' +U&2)4bN(N@bRw iU{+2"jNNiMU ].xz `JN(NNiMU ].H`1);i;Q:=5W-w'oe*q0 Q4(VHX]I if `1);i;Q:=5W-w'fD 4%,cRw1DwuX{M"je`ZYvO5'%̈h 0f&T+U&V*dDԝ(S,4 Ia4̊`&T@Kb{+mpm%' \$5& I(ViMUTȉ;Q:=5Wom皓a40qMxz蚀\JF\JH @bADD^ɽjN@J˄ Q4(VHY7I ifdbRw1DwuX{M"jed5'%eL*%'M' 'U&VMRwZlȁfdbRw1DwuX{M"jed5'%̈h 0 Q4  P9{EJ! aX`ȉsC6efauj٘b0˘]hH$aB/P ,`ruK  = ays×,, @,H%\@-\^(RN@*r0e0AQ-[.S!n@A)'Z=5WS"&ADaDN@ViMdS.hĝ Q4  YWfaYs I l@ef@bj`'1@8 ,;;PaiX*( $;P *TVJ@0 I  ,Xk0,oe);=40LS+eRw0U& TɆ0٩;=5WasR@Hxk" 0eS,0Y`}VHɑRw ( *Bw0U&eM8X5L)DMI& @A$ٖ^ga0 0P Ua411ee]clatMev0.d;P L+U&V*dDԝ(VHX]I 00 Q4(VHX]I l \ IIa4ke<ԝ+`1);i;Q:=5W-w'ivK0 Q4(VHX]I {Meb0%'M'1B;-6ʽ6xmr6[PVHXRwuX{M"jed5'$&iU{+&y;- IIa4{o<ԝ+ IIa4{o<ԝK%'M' 'U&VMRwDB&YXJN(N@bRwZm{+mp0@KMe᫖xj,ɑ@bj`'1@8 ,; -2PTAP8J…@aRҰ, *=5S, hiMT qL(=aGTqL(&У5'*1'0Y`p*iMU ].Aޱs0fX I ;;UVHY TɆ2 )0L&2Km2`ԝ xye^ś\iM 2Ylԝ& a4Be2a6jNA@8 ,U&ViG0L&2Km2`ԝ(w iU{+2"jNNiMU쬡v\ڦXhAEapf&TjD^Lea;YZ=49L0w1Dw*PVHXRwuX{M"je`ZYvO5'$,cRw1DwuX{M"je`ZYvO5'$ ]0 Q4(VHX]I T+{MT IIa4ke<ԝiR0%'M'1B9(ViMUTȉ;Q:XhAiCs 1'M'1B;E{+mpm%' B-6d> `"k05& I(ViMUTȉ;Q:=5Wom皓aIIa4{o<ԝv&iU{+&y;*eri*IIa4{o<ԝiQ);i;I@*rB× f2m2ճ0.a0Бw I…[^ 9P:ҥ w0a  HX$]q̮ e./)' P9{EJM˘U2 ]j7 `ʠdɀ PVHXRwuLЃ"=' +U&2)4bN(N@bRwW UY{k\RwW UД P L(w10`='10`=' Zd!4@$,)@qI9@* L ( LiC 2[5' X{M"haeLms (Tp, ( LIp@X*iMUҏ aslatMev0.d;:N+U&V*dDԝa4. T <#w%h8el8`1);&IjD^LQ:XhAYZ=49L0wM'*(ViMUTȉ;iU{+z˲y;a`1);&Q:=5W-w'!.Y(NADD^޲jNJ`1);&Ia lzXebͮ \MĤABX{M"jebDMI(VHY7I\JN@bNiMU쬛y@H@ I Q4a4{o<ԝ Yvi;T h2`2e^ś\iM 2, aRs B09@QX8 AxI;(D^(6ɖDWis LP LABX{M"jebDMI(VHYBLЃ"E'U`"kY]4 I Q4 PN+U&V*dDԝ2B0a4̊`i;TABX{M"jebDMI(VHX]IT"v.]0%'1Dw 'U&VdRw%]4 2vÃ0I(VHX]IT"v̮ev0I(VHX]IT"v,cRwM'uX{M"je`ZYvO5'Z]P%K*-UY(NADD^޲jNKK0I U`"kY.YWfaYbRwZ=5WS"&NiMU쬛y@KKd`if .I(VHY7IT"v`4%i;iU{+&y;Y.Y pI(VHY7IT"vi;iU{+&y;Y.YUl@mq);&Q:=5Wom皓-.E큥);&IX촺KUY{k\Rs a45'iƄ(N(U'1@@50` (TaiHX( + 1@lPaB PVPLiU2EeA #TqL(&У5' `=5WJ<1Ͳe4A\olS;]& ,Xk0,oe);PVHXRw 'U&VPl.mS,4 *i,Ds `JN@b@bRwZ=5WS"&NyOI,VHȦ \щ;&I+U&V*dDԝa4ke<ԝ  lAY(NADD^޲jNW, %̬Y(N(U' iU{+2"jNADD^ɽjN.[ ]2+T i;iU{+&y;\2I  iU{+2"jNAD# Q4 PNwTa4ke<ԝ  , `1);&Q:=5W-w'-mrU.s+`1);&IjD^LQ:=5Wom皓-mr˽{eUaq);&Q:=5Wom皓-mrU.s+ I Q4 PNEeK*V, =.aa)9jD^LQ4cBBM'* IRN@b`zN@* 0Bh$,`M (Tࢠ @I;=5S, `4QX5L)GTm 8Rw iU{+4\&X]D]6˙0jNA@@50*i .pu^s& *V, =4lJN+U&V*dDԝa4. T <'@JZmvKd I Q4 PN+U&V*dDԝ2B0;iCs 1'1Dw1B9jD^LQ:=5W-w'+<i``1);&Q:=5W-w'!%,`˖`1);&IjD^LQ:=5Wom皓+<i`I Q4a4{o<ԝ .cV\JN@b@bRs a45'iƄ(N(U';PVHXRw 'U&VdRw$$%Y,cRwM'uX{M"je`ZYvO5'BKYe! `JN@b@bRwZ=5WS"&NiMU쬛y@HIvK%'1Dw 'U&VMRw$$%\0"%'1Dw1B;]U2`ebͮ \(ViMUTȉ;H4  1Dw1B;t P $& aB L&B09@QX<T:hlP `rp P` *AXI;(D^(6ɖDWis LP LABX{M"jebDMI(VHYBLЃ"A'Z`ed5r0%'1Dw1B;PVHXRw 'T <$w +U&2)4bN@b@bRs a45'uX{M"je`ZYvO5'Z`e ]P4 I Q4a4ke<ԝ ]`ifi;iU{+z˲y;[.da` I Q4a4ke<ԝ l]b`1);&Q:=5W-w'& \ ]+`1);&IjD^LQ:=5Wom皓-0]X.%'1Dw 'U&VMRw$=vCW, eꁢRwM'uX{M"jed5'^e̘, I Q4a4{o<ԝ l]bI Q4a4{o<ԝ 0e4zXJN@b@bRs a45'iƄ(N(U';(ViMUTȉ;iU{+z˲y;`eib],cRwM'uX{M"je`ZYvO5'C,`eifi;iU{+z˲y;Eps. `JN@bNiMU ].2B0; ʥx`1);&IjD^LQ:=5Wom皓& \ .a =);&Q:=5Wom皓! 0e4JN@bNiMU쬛y@KABEEhkI Q4a4{o<ڦXhA='DTo2]);&I P L@bp@X)'10`=' Zd!4XX1AH()'ww0PQBA!`( Q@`A$w10`=';JwI2hc FB!lXj킘\=s A,=fe p4 0ٗKЪe ph[ l8 )xE] p($˴dUꁆB \ɀH wI2a7Fqv\&)08c.L6Ř2Sע3AeMHp\Befs TɆ0L6Ř\&)08c.L6Ŵ.Ѓh``uLms i5Ŭ]ET 4 ) am6 3L0C .`B.в .-@$,[l0\ƅES@8 4;2a6-vxFhcU hYsdFqv0avAj!bdx .4*(@ Xn%AZ9ހ (Td@ dhsqBw0U&d@ dhsf )@QT&DK75@xӇ4` L e\Ʉ*e'zr:N l\c'+$bX՝ab& # ./usr/es/sbin/cluster/reports/templates/ss_report_template.htmr$$  a ".125<=>Tcdelrst%,-/0346789DR_inoILbghmpw:;ABCEHOSVfuvx!MNPky()FGYZz{}#&*UKq j+W@|X[]L( ,\950X((((((((((((((((((ETabIPhX40PY`@Ūj`0u./d=]4Y0ou" hib50X-SSm v@ib-<}P?4ղιml$ŋTabXML. X ,@1`XP b50X((((((((((((((((((ETab`2,\peash"㬶1D dO"9"#"DJ :=$$B"yCȥ A4) D "$HiRE*<1"IiPD HHE AǤDHR$"II"I$)'$ Di) Dx@D@EBDB@P<J3B&z"@P@ z0R(H=#O$)$> A#H<L@BAHxy ( @y "5"&z$QELRhEǠHd5!ȑ&G@p F $z$RH)"8j<I"DxG :GFȥ$z) Di E!Ƒ4 D@(=dHRO> @ ="b"z)9t<Ñ )'5%@E!H="y$H"ɍ4"LDɐ@j0R8rC(rG Dxg@D9# ǞѤDR$$L @I""< 5@4 LR H4#H@i 82Pz)O P' A#Ɛ&Oq\ɇY0ʚo`0xPA@pB@#-S(qC Ŷȁ9S2@=80LL:ɇNTBu{(rmxcLlLplɇ^s&TMb{(rmDNT)].X2us-8 TLHk& ,cBU71TLbU7Xv`75W2ӂ0MkPŴ\' T,QS1T5i8˽ 9SXv`e7AefXJ=9w1g*o%v.:eYƄoc(ROq] e2ʛt dA T,QSXv`e7̰]Lh1*Ŋ*o1bVOq]Tȉʛ+PTLJ\ux{"U71T)].(^rbWh"㬶XU71T)].(^rbWh"㬶Y,A*Ŋ*okqC{l{9S1!,.dMLb7UM7Xv`75Wi8˽[9S1!,e 0YƄoc(ROq] e2ʛe, fXJ=9w1gW2ӂ0*Ŋ*o1bVOq]Tȉʛ+PTLHsmL T,QSXv`y̴(bC{n2K:2%SEM,US+].*dDMMb̴(=S7A{(s m eN2\49A#%t9D==9h gXPH Q4iъp$Xc*kqC{l2"rJ=9w1g[2"(nkPAd@n p-C΄" 2PᱴI<4&y2iq-T9 ia\ lDc &LdҢLɤ8{@g* .2I%t9C  dhs8hLML5S1aCt<4 "z 4PDD g&D H&y2i A! dHhDr'GDx#< 4G@i㈏"G""8DIEEH$zH$=H$zH'.JDx:1SAŊ*okqC{l{ rbC,It{% hJ1b+P^-6XA+t{% hJ1b+P^-̘ ,%2`4A T,QS1TMb{(rmDNT)].(^rbC,It{"U71T)].(^rbC,ia̮YT,QSXv`yʛ\ɀpΙ2Y&Doc(ŊocBj(T o`0x,! ʂ@@ @b4Kرj ˅u%S(qC Ŷȁ9S2@=80LL:ɇNTBu{(rmFL:lfZeCeL:K0rk!`=9wË<1NeT8A\dït*okqC{l2"rkqC{l,]֙:y*ob\..h1*X1bkPL+iP +]6-8bc(XZ=9wS"'*oJ=9w1h0K4ЕM,QS5Wi8˽[DMLKЋ\FLh1*XkqC{l{ ʛ b hJc(+P^-r%XpA TLb7Xv`eNTĶBLl˺h1*XkqC{l{ ʛˇ,A TLb71TXv`7Xs-8 TkPŴ\' TLb71TwY,`4Y,m* ,^. iɉ0Dv,ZZ=9wS"'*oJ=9wGNU1&ȕSEM)].(^ʦ%^E*1bROq]QLKdq*1bROq]QLKd,2SEM)].(^ʦ%W2e,e̶],JXkqC{l{DS pU1T,USML.s7 fBC ёg6uD2,0a.aח0wŪo`0wCAPBҥ@  = isC,(XI`vDK6ȁ݄ b70X.Y\v\Xfq\. 4rqw+dðƌ@ ŪokqC{l2"rkeaB 0vضdኛX1b edOq 2"[tMP!2˙0&9SX i8˽Y2u-2 &{̘9S5 ҀSXv`7Xvab̴(% 4ЕM,QSUMXv`7Xs-8 " i8͋hNŊ*oc*ob[ ,`4Y,m* ,^U []lD@ 91-0Dv,ZZ=9wS"'*oJ=9w1cC{\N<ˆo`=92eCicdJ*Kx{"UL`!S1T,USXv`7X@P-]w- 0d@r  qC{l8dfZeCeL:K0u@P-b.Nᖋ Y@Y@Y@9ʛVOq]Tȉʛ+P^- e0us-8 "L02YƄoc(ŊoZ=9wS"'*okqC{l{ rbLa 4ЕMLb75Wi8˽[9S1(a,,2fXc*kPLROq]QMĶXpJ1b+PTLKa0`YcXe*Ŋ*o1boZ=9wS"'*okeaDU7qCs 1SEM,USM+].*dDMMb{(rmc/a\2 :yU1"Z.v\,cBULb7UM+].*dDMMb{(rmc/aU1.:2fc(ROq] e2ʦ$, s-t , e4%T,QS1TMb{(rmDNT)].(^rl4B"ULb75Wi8˽ =לb[ ,` l˺U1TLbU7Xv`75Wi8˽[9TĄFBLX@E hJXJ=9w1g* fhA U1TLbU7Xv`75Wi8˽ =לb[ ,{M 2ؕSEMMb{(rmu* fhJXc*kPLROq] e2ʦ$ zQa-h1*1b+P^-bBe4%T,QS1TMb{(rmDNT)].(^rl4A4*1b+PU1!KؕSEM,US  TLb7)q-T8$n] {ELP,ƙ:ٖPqLkPLROq] e2^sW2ӂ0*yfXc*oZ=9wS"'*okqC{l{ rb\. fXJ=9w1g*o%׈2fXc*kPLROq]QMĸ\A*Ŋ*okqC{l{9S1.Aoc(ŊoVOq]Tȉʛ+P^-8YƄoc(ROq] e2ʛd& X `4%SEM,US5i8˽ 9SXv`yʛxU71T)].(^rbY 8X$8J1bXkPLROq] e2ʛ YƄoc(ROq] e2ʛd& X `4%SEM,US5i8˽ 9SXv`yʛ %SEMMb{(rmu*o%`CĪoc(ŊoVOq]Tȉʛ+P^-YƄoc(ROq] e2ʛq׆4g2Y,cBU71TLbU7Xv`75Wi8˽ =ל%SEMMb{(rmu*o%^%to dJ1bXkPLROq] e2ʛmNh1*Ŋ*okqC{l{ rbB20녚 hJ1bXkqC{l2"rJ=9wG7XJ=9wG7py\Xc*oZ=9wS"'*okqC{l{ rbC[pA T,QSXv`e7` c "e(A T,QS1TMb{(rmDNT)].(^rbC[pJ1b+PTLI2艖*Ŋ*o1bŁZc(X ,]`n,̄.3i"%l댈=eYa˦a\ï.a!"ŋTab3*`H !`iR w4̹ , p$H"%d@nd,Z X9K0˘] 26eQ.].s!vѕ@h?ŪokqC{l2"rkeaDU77A{(s m eN2\49A#%t9DqC `H u uFp$Ŋ*oc*l4mβ d&l4mo1`H4T,7P((TabY&B* 1Ph b7ʂ* 1Ph @X  PP, i8Bbd@n@}vd&Ys&dç*oe{(rm'*K0ȃ hJ(TkPŴ\' T(qC2"r`0r,AAr$X:,Ze{(rZhea AZxea7ʛ@z`īP^s*K8,t,"h1*00P=SMLP=S5]vaŞ(lLplɇ^s&TJuM+].*dDMMb{(rmc/a9S1-{ltA T,QSXv`eNTLKa. `A T,QS1TLKa&,qv,ّβ dDoZ=9wS"'*okqC{l{rb[ , 0MLb75Wi8˽ =׎9S1-\8L6Ɂ*Ŋ*o1bl4då.2"YC{dU7iaɇK.] 0ȃ&dpJ1`H4TLbHX-SP(Ji o  qC{l8eim0.dʛi@kPLROq] e2'*o%:,Y!dA T,QSXv`eNTLKauYYll5K4ЕMLb7UMĶY^ۥu6dD4Y,m*VOq]Tȉʛ+PK8tg []*Ŋ*okqC{l{rb[ ,m:e{a%SEM,US1-q׶ge͙,! =K2a*l4K< -aL0Ʌ˲MLbi@ŁZ0P=ST(TM`@$,].qg4'[2* .2a׺\Ƀ75 ҀS5i8˽ 9SXv`eNTLKatȁge% hJ1b+P^-rb[ ,D < -u톲fXc*K8:e2"YC{q׶M+].*dDMMb{(rmuTLKatȁge"U71T)].(^8MĶYLxA[, e*Ŋ*o1bl4,Y"%dOq] e2'*K8K2% hJ(TĶYLJX,ّβ dDoP(].(^ʦ%<= ȕSP(l4d,2Y"%d,}s- -a([FL2*oe{(rmc/a9TĶYLJYYƄ@MLKax{%.%2"YC{q׶MLP>Oq]QLKax{%."ULa@z%<=u͙,! =K2a*K8K8]K0ȃ&dpJc 71(TL. 0BqP  @@X  PP,tXo *ˆB-6d"![2.8\l,]j i8˙h[AF-kh[F'*o`@z`īP^s*K6ev\p4%TT oeP,ƙ:ٖPqL l4fW, ,ّβ dDoZ=9wS"'*okqC{l{ =1b%t8ZCDlMĶg2lA T,QSXv`ea .á g*o% =pq4ЕMLb7UM+].*dDMMb{(rmu"]C4ATLKaz, Īoc(ROq]Q{bKp2ʛl5\ee*Ŋ*o1boZ=9wS"'*LTbXXVOq]Tȉʛ+P^-xLXv[9S1-YZ, 4ЕMLb75Wi8˽[F:-! rb[ plY[,cBU71TLbU7Xv`75Wi8˽ =ףxLXv[9S1-YZ, Īoc(ROq]Q{bKp2ʛl5ͲglJ1bXb[ , ٕ86dD4Y,Ɇo% ].`4 "ɅX (7  T o0P=S0X,! V\2mv`!ٕq`@dŋT0XP `H .Pb7(qC2жEs- `Z2зŠs- -NT%U72@MWi8̽NU1- hc,cBUL`1%MLa@zP(HX.Oq] iim0.dʛi@kPLROq] e2'*o%20Yh1*Ŋ*okqC{l{ ʛl4th1*Ŋ*o1bVOq]Tȉʛ+P9S1-q]hΗdJ1b+P9S1-`2u*Ŋ*o1bŁ ҀS1!`MLa@zc 712T@0X4 k,`qb71(T o`0x,! A`h4@t, `@((;-SM70X T@XMLP>Oq 2"[tMP!2˙0&9SX i8˽Y2u-2 &{̘9S5 ҀSXv`7Xvab̴($.l pA TLb71T+].*dDM)\N<‰*o`µ{(psb.a*o1bŊokqC{l2"rkqC{l{ ʛdA TLb7Xv`eNTĺ2YƄo1bROq] e2'*obL2{4ЕM,QS5Wi8˽[DMLKl6@A TLb7Xv`eNTĄ\0E4ЕM,QSUM75i8˽ 9S5W2ӂ0J0vضdኛX1b$.l ,`4Y,m* ,^2艖6rbL<=*VOq]TȉʛROq]Q70Ev l采ɉ0Dr0DBc(+P9S ȕM,QS5Wi8˽ =עr$.(Jc(+P9S Ŋ*oJ=9wGNTĄ\0EĪo1bŊifpBs02"\lθȃ{[ef=:b.,Z t9 X4`H !`iR w4̹ , p$H"%d@nXML..'fp<"h"7C͢pTAC\x{&4ep*CŪokqC{l2"rkeaD70aZ=89m07EMLbU71&tD`QedOq 2"[tMP!2˙0&9SML.H8 ZJŪoeP,ƙ:ٖPqL VOq]Tȉʛ+P uNeaAʛp2`]2Å hJ1bXkqC{l2"rJZpA0vضdኛŊ*o1boZ=9wS"'*okqC{l{ ʛ0K4ЕMLb75Wi8˽[DMĄ fXJ=9w1hqr4%SEM,USĸat{.`mβ dDoZ=9wS"'*okqC{l{DMĘx{"U71T)].(^ʛi*Ŋ*okqC{l{DMİˋT,QS1TLK qKq .,! =K2a*p2`]2e T5i8˽ 9SX`1:c(ŊocJuM,71 ,\apAj0PtXM70X<T(x X ( o  qC{l8dfZeCeL:K0r$PoZ=9wS"'*okqC{l,]֙:yo$$eY`]2Å hJ1bXkqC{l2"rJZpA0vضdኛŊ*o1boZ=9wS"'*okqC{l{ ʛ0K4ЕMLb75Wi8˽[DMĄ fXJ=9w1hqr4%SEMMb{(rmc/a9S1.% hJ1bX 2pX=CYwgYiY^ۢU7Xv`75Wi8˽ =עrbL<=*Ŋ*okqC{l{DMĄ ȕMLb75Wi8˽ =עrbXeĪoc(ROq]Q7ᐋk%SEM,US1!&[.q .,! =K2a* 2pX=CYwÂU4Mb{(rmDNT( p@Ŋ*o1bŁ ҀS1!`MLa@z bd!8 *@< -SML.V JŪoeP,ƙ:ٖPqL VOq]Tȉʛ+P uNeaB 0e,{.a4%SEM,US5i8˽ 9SXs-8 TLVOql[E2pMLb7UM7Xv`75Wi8˽[DMĘx{% hJ1b+P^-rbBdA T,QSXv`eNTLJL:,cBU71T)].2m7..YƄoc(ROq] e2'*o%&pA T,QSXv`eNTLKlYƄoc(ROq] e2'*o%YƄoc(Ŋo].q .,! =K8tJkqC{l2"rJ=9wGNTLI%SEMMb{(rmu蜩vXJ=9wGNTLJL:XJ=9wGNTLK MLb75Wi8˽ =עrbY 2aoc(ROq]Q7.T,QSXv`z'*o%%SEM,US1& \ e,]YC{dU7`˥Y`]2e T5i8˽ 9SX`1:c(ŊocJuM,71 ,\a P0PtXM oc 70X,! , 8-``48XM70X @аX)`hŋTP!1m eNTLP>Oq 2,aӕ75]vaŞ'[2* .2a׺\Ƀ7X (75i8˽ 9S5Wi8˽.L\N<‰*obB YƄo1bŊokqC{l2"rkqC{l{DZpAISK `u4%P0%TĄ,ar:a'%TU7EMLbU75i8˽ 9S5W2ӂ0J0vضdኛX1bkPL+P^-r$,cBU7EM)].2m71,2 hJc(+P^-r%,2 YƄo1bROq] e2'*ob^täh1*XkqC{l{ ʛvppA TLb71T+].*dDM)\N<‰*o`µ{(psb.a*o1bŊo{lu%u%S)v+\ɀ4Ęx{"U;-SXv`7Xv`z'*obL<=*XkqC{l{DMLK M,QS5Wi8˽ =עr%,2 %S1TMb{(rmu蜩xE%2 %S1TMb{(rmu蜩i 0]o1bŊifpBs02"\lθȃ{[ef=:b.j ,]`X AA J\$˼1e]f I`` %E,"[v.'Ūo`0u\칅.3h\h"W2ɇa\ 2@VOq]TȉʛRyTkPŴ\' TLb71TĄ,`4Y,ɆobB ]M, ŁZc 71 ,\a  a`R@ v,Zo`0pPXk,`v,ZP(] m-re{(pae̘u (9`YZ ,ZP(].em!\BB-khXMh"rk!`=9wË<1NeT8A\dït*okA:bWh"㬶Ds{lu%u%S5i8˽ 9SXvab̴(bWh"㬶YЉK4ЕMLb7UM+].*dDMMb̴(`µ{(psb.a*oc(ŊikPLROq] e2'*o$81fXJ=9w1h޻%l 4ЕMLb7UM+].*dDMMb{(rmu蜩^ۡE bU71T)].(^ʛ mXA˙`J1bXVOq]Tȉʛ3EM,USM*ROq] e2'*o$80Z2YƄoc(ROq] e2'*o%X5a[.e4%SEM,US5i8˽ 9SXv`z'*o%X9c/tZ2%SEMMb{(rmu蜩 `޻%loc(Ŋo%v.:nL0YwgYiY T5i8˽ 9SX`1:c(ŊocJuM,71 ,\aPX@P (9`YX<T( @j@}v,s- `Y Zxea7ʛP,ƙ:ٖPqL ]I˄ K0YwgYiY^ۢU7Xv`75Wi8˽.L\N<ˆo%v.:eLYƄoc(ŊoZ=9wS"'*okeaDU7qCs 1SEM,USM+].*dDMMb{(rmc/a9S1,<@Y`-h1*Ŋ*okqC{l{ ʛ 2cXdA T,QS1TMb{(rmDNT)].(^ʛalJ1b+P9S1!&[,` T,QS1T5i8˽ 9SX`1:c(ŊikPLROq] e2'*o$$e[,cBU71T)].2m7e2 ,cBU71TLbU7Xv`75Wi8˽ =עrbBLX8E*Ŋ*okqC{l{DMĄl CDoc(Ŋo%v.:a&[...dedOq\ȀpNT@!`YUAFDˆ;kJ#P' Q K00-o0P=SS %TĄ,k2o1`@$,(Tab L', *B@Ab4La@z0P=S12 Prp-e ;-SML/x]ys'Bg-S(qC Ŷȁ9S2@=80LL:ɇNTP uki8\1NTn:}