# Authors: # Rob Crittenden # # Copyright (C) 2010 Red Hat # see file 'COPYING' for use and warranty information # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . """ Test `ipa-getkeytab` """ import os import shutil from cmdline import cmdline_test from ipalib import api from ipalib import errors import tempfile from ipapython import ipautil import nose import tempfile import krbV from ipaserver.plugins.ldap2 import ldap2 from ipalib.dn import * def use_keytab(principal, keytab): try: tmpdir = tempfile.mkdtemp(prefix = "tmp-") ccache_file = 'FILE:%s/ccache' % tmpdir krbcontext = krbV.default_context() principal = str(principal) keytab = krbV.Keytab(name=keytab, context=krbcontext) principal = krbV.Principal(name=principal, context=krbcontext) os.environ['KRB5CCNAME'] = ccache_file ccache = krbV.CCache(name=ccache_file, context=krbcontext, primary_principal=principal) ccache.init(principal) ccache.init_creds_keytab(keytab=keytab, principal=principal) conn = ldap2(shared_instance=False, ldap_uri=api.env.ldap_uri, base_dn=api.env.basedn) conn.connect(ccache=ccache.name) conn.disconnect() except krbV.Krb5Error, e: raise StandardError('Unable to bind to LDAP. Error initializing principal %s in %s: %s' % (principal.name, keytab, str(e))) finally: del os.environ['KRB5CCNAME'] if tmpdir: shutil.rmtree(tmpdir) class test_ipagetkeytab(cmdline_test): """ Test `ipa-getkeytab`. """ command = "ipa-client/ipa-getkeytab" host_fqdn = u'ipatest.%s' % api.env.domain service_princ = u'test/%s@%s' % (host_fqdn, api.env.realm) [keytabfd, keytabname] = tempfile.mkstemp() os.close(keytabfd) def test_0_setup(self): """ Create a host to test against. """ # Create the service try: api.Command['host_add'](self.host_fqdn, force=True) except errors.DuplicateEntry: # it already exists, no problem pass def test_1_run(self): """ Create a keytab with `ipa-getkeytab` for a non-existent service. """ new_args = [self.command, "-s", api.env.host, "-p", "test/notfound.example.com", "-k", self.keytabname, ] (out, err, rc) = ipautil.run(new_args, stdin=None, raiseonerr=False) assert err == 'Operation failed! PrincipalName not found.\n\n' def test_2_run(self): """ Create a keytab with `ipa-getkeytab` for an existing service. """ # Create the service try: api.Command['service_add'](self.service_princ, force=True) except errors.DuplicateEntry: # it already exists, no problem pass os.unlink(self.keytabname) new_args = [self.command, "-s", api.env.host, "-p", self.service_princ, "-k", self.keytabname, ] try: (out, err, rc) = ipautil.run(new_args, None) assert err == 'Keytab successfully retrieved and stored in: %s\n' % self.keytabname except ipautil.CalledProcessError, e: assert (False) def test_3_use(self): """ Try to use the service keytab. """ use_keytab(self.service_princ, self.keytabname) def test_4_disable(self): """ Disable a kerberos principal """ # Verify that it has a principal key entry = api.Command['service_show'](self.service_princ)['result'] assert(entry['has_keytab'] == True) # Disable it api.Command['service_disable'](self.service_princ) # Verify that it looks disabled entry = api.Command['service_show'](self.service_princ)['result'] assert(entry['has_keytab'] == False) def test_5_use_disabled(self): """ Try to use the disabled keytab """ try: use_keytab(self.service_princ, self.keytabname) except StandardError, errmsg: assert('Unable to bind to LDAP. Error initializing principal' in str(errmsg)) def test_9_cleanup(self): """ Clean up test data """ # First create the host that will use this policy os.unlink(self.keytabname) api.Command['host_del'](self.host_fqdn) ϮnrL׶l@E&Tqcͺ9k1Gu:|6&P1R\U"IFTeH9̙1/T?V@XُVs_+Of(PA1 *~K`sE"[X'rDzNnbΰl;p| ?BKg=uq.?}~ܕ$?7+9Ք3+LT$/$o#]$Fgӫ?6Ԡ5LrK_3^Tëm#*@/帾?Q0U6\{˘hQ DKe)MWvŤ"IlxcAڥ>0gBYF)>VtC'P3%sixfsOχ$b9gO8ѹmrޚy~8v3簓a-2jTMxnt,[dTLF5 Q: ՇZx6<25EWsQ8*HMJ1vb,٢_L3tj~iH^;#.vWIՁRƿ{" {AN)B)y;#q |ͰW?Ya~|BgPNga^jRɰ4bgk7aI.\^H3br =VdjZU+x{=Qs)ˈ \9zK2hS]XPu[vGEjE>d?7irR!4`UMɰ&#N8CIan@S'*BAKޣyv#qhZA]S1_,H;:hIM`ҔjPy(vm|}` pAQ?tx}ȿn)~`_X{#+Nm!M7qܝEɑʚOSCV"_-RDр6;, 1pmSXItiy㠓?hwR4-iLHx8Jso\uE!CICmGF9G0?U$iJ$C3"s^T*K/([8<; ;V}ivX`o=+Sq#k|)snue (885 /CԷx˻:?1m RlI&lSRh&5(PMl}OɩqYNZOzvI@T?DE_:VLwG=  +Tn~'$k>Џ "OvSܖT+L9,Fr@IJy=U2a`U~P\$Ctӳ[0`C'ĉ^1g@Y#^wtzF;(Ng`/eW)&!=a{a#ڠ2ؒbJ x}4oh'(Saf",:>9-ө٧$RӨIZĐ}U"ȓb֣KF{v@+[p:Xtn!mEϸi~;Q$4:˘SY c\ᾨG_ILu =cuLP F0ALIդ`Ñʬ۩C/ao`\9'[vtnc+wI 9o-{{X *!K,j\IY+=7tjh-KܨL!SwZfw!e- s ҏ: nHU'} ' fC$%xt}=u~e^o9ZS dAR|ڑ[،:@\|$[G|bm/xetpG&* WǝՙKt-7.k}A[#P;p8NREkJWG-LpW?;z6!g<=.Xi[@.p+koO \(ih3I47ѻO18DJm -S<|ᔞc$_C\[H˾UVgs27!n.(J ƚq1h>ˁc94p`% cZfH;wUP ik3A9 )Q_|p|+ɒ8,ER4O\[a.ZzNa;bj;@PlE+ͭe'ev"1:bׇ]7Yzj E|t@vT/yt6y9Rl`D+fJp&% ÆLP<65(0*4a~_Fgʊ /P~h_ rqϡeZu:AE?8͒LlLuEǪsP̽‡B4XM[AR)(Oq\C:PJ gn(Za4ܻ |_t*øl|m[uoC~2!iA v4*|4.~Slf'n;UWhV|LB#p_rQ@ .ՔJ-BZs J L x2KsƛC&QHdnA6jn7 #M/8џ}ĭN諩A^9ljzY5 7hG 6j0U@fć^/)0#qd =TZ*RᴘJ6:=?9Lm# -4[ɮ-~P pصCo{bt=㊧"ѓCwkqKh{8WDh+a{GKzXAWy^/wS)5>.Xcvz&#}-CMuOvPbKh˞V|J56j^9L_!~t&vy‰sfr@)Vg⧙2LsB{I㵋@JRLEAU@jH4^#mi 4\$XDAo+f]A+./"еY\?/0\#/Μ[YZ +DVH4v?}Rc9 ?xfZq㢪OchJDᢟ׹ J>87ӶS82it'fqTv2F ipeCمrYEQ Ġ ƛW[N$ӫ߂NSq&NڽaEATfA$ (IΈ+ >2mxY42_ %)k%KS8Ljo$Qw ܤԒM\=聎9WD;lyԪ B獪5 q|%ׄ8߷TFג-7ln!M|%eLNEr,wW)uGÌkbrnT Nm 9s@cx2%&FVug^:Û?4(ꎼDOlM$pEu?Nf6]·NW@}fרRڟg+4LqE AYēNO-5,F.|jCp- avn:ʡ-Q=*pڒkn=mT"W*WVт</ٞޫ^*ܶTe;fT,ȔPqs=e="]Jl0m.%T{ 7k*d. w(d{M}5CYUQ]zҮg~^!P(h7{#cϢ4oӶLwTc%]l2X i˓ݨbx#ғ!'8ԋr5 `}^V52Q^* T# #2lٗx6?_n@ӗ$6ZU@/rd*MVwgόV?ӟT!*mÂRXÐ$=t&$BEV,x0Qu#N)$3]s< l1cY%x&  ?Nj!YIRobt:-`=_@*(G|es[/|Zew/3Θ n@pUןTGebWףvA%!_hJ?3ʩDF˜2'JD=|]Goi=lc:|mQa. {=_>BdT$KCuQ^4SX',\QM$w6C="{YOSj=l3T952C4Éө2C#lS#l:LilMð0`0feN-Pw9ULسѿJk߾ 1%ɸ"HqCgF sdy2:+sW$,F( O֗UY+DIB!Y C y<%CslN` uy BV(R/KL@fӕlHR٭ 4IbO/l+~澁[谡 JeB1$vTuL> 2_Խ熎UGr[wp)hV1(bb]PK#mO*"rۜ.@V=A_&OETҾ|:{f@E]q=vu!sJUu(D9 RFC|94";]vBԑ|if>z'hA/jQHnb{I WԱ:USJ~gB|rV6L 05789 K ̉'iM!u.B[L̬ﵰ A[LBu@NcQhy-_dɮ1U\ zjϣ~(K|j(!uM{n)]CCÅwzMMb&e1!2hR;z^u0:aq?,=ig gtDr8rrHKA H+B΃rEoYDLF`4-,JYpb)@ux6XvGk^POX=l A!ޙx0F&R]go ץ'ac_N4{$|bJH 4A+qXvXvU@[g=̓V*1eSio<| k6D*[ۋMv:iY p< zet*oY w|n7]' c@YdV}_UHҙe-}(cD]|+}n~oUVm~@]{Ofs7 V7oF0s<˥*ِ76ףZzGWRxr{-H.ߟCoEp1.)zKu }BԐj2c}͢  q}(?([=[rn>~hMJ yX:ՃL5>v@BK$|hʼn⣮CYJู4 2Og>CT.9T%qζ̓B @<4](cP]7eklRQ%^?fK3taVsB.MumG d5<]t~NOۖzibC8b{RDւ*7="XWXl=RKH ;|SAvfgg830^jxW[\זJ6r ϕ݌ӫu`*]Gb̰aƖ)uiDeTI6w%R˹TETNXC7S $Zq׵)Ab(4(MWHaR ?۾Jvҹ _ۤ!em&u9-_MSg&Cɲ:Z0oKqo#鵰Q7k֦`ۭSJEJQӝ{OEe:>F0xS"ΰzW\AZ @0_gVk{+x rn6Yxᇭ$X }3cߍUD&DK7IfzrEQSߊe'dY"@ۂ}}%;3ɣlQwFXCf {nb_(mӧtu'Zv!'bg_Hufv0U&-lDWo|G ?{sf$n{Iz~rzs~w\&T3XvŠa? XF+x7sma"m 0ԥ(k lBc|s-9aTwDޒǕxcvwriw SMdAGG4]ϖ̨;!)y--R Ɯ:EFTKʮe/o>Vgͭ]G2VWAmz{\u> *馲 WL=5sU(< ς vE]]G0 Dnցd{ۅZ$q9p5o6Lq)rE-~;*y ޓ H EFxU|x-pg_.J+ӂ ѹ! X5jѻ.&wQtA+߁Z дjZ{t(l4L.VE1sWWdpO1_,,&.99#ynTOQ/ŊtY|7\R xpJLS>skXP8\"xg9C2߷çDU3m'Yiͅ._K5gM?Ov;]S!5 ˜;09!aC' $,6$ljN5m["#05@\Gi5h+0F!2[DT 8bf_czQFL{+&qr:,T>҅)y muAҎk2 sh^mUQj}SRW:)7Z.z rjM+|0]5fK~M 3ۑf%K.METR$-DF2s_ӛ(\Ig1}e@5e#N0% Ĺf}Gc}13*w93n8}le-(%+!D9wbLBExP6K0EhʸB;I WfFprKGdn >ѐ, u\,"336.w>tT8L { ggHӾ5q/ÔN^1ݍq_a&^oBap}\jf)R5 \b^9WT,iTi))G\iזּ k*|)U띨]3o ''px͍&kwndȋ"FKgÆQDRf<)l|)E)"DTRp Z9jiY th'SuP2w&x xRI)ķUEX~M*ܖƮu@.A=Ѫ9Y869C ̷XBn!w0A2~{QcTxvؔ! Tz"boMxfRT[NUAݻLf7 :bJֈ1)-3'&5ԛu5R p*sbjO]?K@ T)EaE`嚬{wgoq{hDsw^&yx,u 'JK6ϰg|Wt OXǕѣ`\f튑<$rxl;ɢ)P7FƠϟYKˈyAϠ_H_a]ψrG8vq?hl $M LkmUTC uFmSx!>Kn쳒gqX֌,֞f]2 WT~67̒~v!|yI؞. nr܄pfޤܽ[n!2M Rx#35c׻;TiFj"^Bcq,ZVo䷐ O' N`YLyJ¶jКkdAK1 2$6S8q NAz@mdG:uSXdBy:wO2~+1|~#h ØӸИ9r#d.ͭTFF3(0YEmm&}qh-R+oS2avb /w9Sj ]DymiSc1 zfv |y6{蘔Zrm#@CKs*]sI=8aHZl/ :bIܓh[B4};5`ER/k^svm r  Mګ6[RW9odctw$Ib|-0]}QsGk% sd-_dڞ7wfBvRF/M9RLD!Pﲍ>%H GXwiuԊFS46HGB1:᫁fDDfc<ǀXP+w;x)`0?pNã1xim]`28\s^F,,GCL&UD0G.貱r&bHU]`Y.r1C<O&8eH9dcnu ?oeKFlW6 00_.D߫{4TA6[u18Wć?27D&@\HN %UoNqg^(U0JhP=Bô'`#S͚xଋ,+=[×v3c/zdٵik"|?/&]Y?^f&ѼbhxF .nb[J@I'ZhI(E7XEt.`<`DT%l&sluxIVniOmb2"kɵyrx8@6F$yN6ikg}mykL 22q{ P:7 'LiZ@4G=h@5𤥸ñ r8.3>p ׄљZR4@p+OTgԢX`Nq mXI:27b?1jn^5Zt8esP*2zpnUVfߑn`J>q}Oc(uc/獃Gb9rs26kt`b8Pm[|9׈m^?njM?u.X6;"}|↌*#xFʫkJXMg񣵕2+NQC^-*SϵV?PA|rvJ;3STZ{r =*_Ip b 7eTí- (s%yɿ02R?%*^2f-`\s&"%i_xjy€G*hy헲#$% MV8.nP *:|H#X̶+~re"~KiOf6@);r?JBX]`o-5Èc|'Lo8z Id@MUe7ӁOhr~+ 2Շf`PJٕ[޽W=!/ˬ15s)˦^76~y՜fY"f܄<& h([籫T<+CF7a]=_H)Q.r|5΍Eii *QaM\{T"n ``)~а$ /5Xq۝`Q5qeZPD[5'eMk,]T4܈.1ˆ F ٞ{оԽWU*QYĀ 5>I./ߔRrܯ2V۾(TM>wk{o֖y@U#]+p_`;?V^LPѾV|O]=@EoqCoTYh(:NxocŔv se mV/zaX|J/' u .d#/f,0ºcc@P"iB'^~ƳBg,q 4W(,*p J$YK8%n8Xl@Jr"HIj*m۷/r/P+p`ƼtqiV0+ PMM#G rzRԛs?S{atV~͞FgȞ[ r.}#V3ע "wOwoh IP۾ ~"`|}5bsDk `(M޺e+?f3ѣq8Wj)y>ˌ\:k2"#=/b踈'mkx#-' wE.*4&vQAW46Jv~l5:{f[|8 Dk7n 3xBfX:$$ً8Y} l![MS:p= 'o{kb, z 4)f=$3)k=M/ˠF.o.9:c3.t#[ kcWV5%w{GVd.8L>Y j[5%vf7gS6Ѥ Wn0V Gk}} JեkP/,݇+n PE38zl0ʺ muLdhTix})^qO-#ֿ\!])Nj4I"3]r)Aj|X[ &fiïOꨲP>(,)8D:V\ P E%Ϛn ЕsM8B)]r@' 6 z!q3@j~*_t8"n5*P@-G\uYb̴ܑdvf4ZNKQ?RXR͠UʁW[4jd?P@LK729̯z_=8祚)uڹX#EnY|:s:HX5ÿtҊg|-3B_S8Y/ֹw<%cR} P'ʼngDeB.=jaB{1|Df8e>v\@WteV1K/ ,%Bɍ6U׵B~/1//izmRx_'Õ?q$ϊ +(>\?M=*+yoLIl2 "o{7^|^"/0PIrxN ޮ mOy6ROOI}=suyGefK-z{ u3wژ,?(>He-F4w A{p<~S8309\Ԥo B}$>Z\8#p0ɐ.YW6IdűGRvEs>UNnx/0."K+Y1 *m ٿ&wǦ# *_[WArYx%:o8j5[rUyY­IxX}湔~_syy1v} -(&w F<8eu;$7d$Y<ʳQ _ohpXj'KUJNv/w vFd CvX쌥z^/[쁸TW@ذ5)w*(ٹI3&ict' }1:ӚyR)h k削$y PuGV:4Qi7HNAbyCDxqGId"%V,2>yv&+"D ]xţ5ǗK@"0{B=Tq0-C\SJ(OlNRveY.LV5wb(M$ΑbZ& Q`4KϏ?uw“ A:>ׅJBFFPmY}1o9vN&|Ȭ_q q?as+ ~ʧVA xFt@z%Slp"yY ΣL-|ǘL? ̻}})}s$Qs=nCZ`0Ih NJ$Q^ޑ# TFCͬ&W1Ե3^X~!MP. aZ#LMaȿQ!C1-7%/DۄDoԍ#ia7Y W߭O[RCt0X`T;d8LhukCxJA,F=I+uۍ.fJ&Q/nH^eŇ{b8-D,\$@uK1D{❪|> @["n)]qu}~> ?4U61}dДהMhjV|RF=Ii Uֺi3+ \ha}~9+Otͻ, &v?ü:siE/Tq́'3E҃HY g ovٟxG 9O_(%͹_?\(ߛ*!La7o͜RW48_ knh#Quc͔  PH6\ D4DNA) IXHMᯯ+RiR)V}qyqwNY/DNv5.u63clO>Ab̈́H-<:^#M7c+e~:vg (u"cRʅGqKM; )ZM1FZϒ~ƣDe)@MQU63 yMQ+#*'$e  [FV @槽c&R_KW\H*v! e xL/m _'Ⱥ$bz1MuУ P4=NI,6)FgVt2Hؖ^x:AԘ1DG!> XmPFgK)n ҴKP?nSg}"8x7^ ýu7Xy|d[bھhI~Јi8[%_BM.*q8RIԻ ppN y 0΀x+$hI"hBu2S2#8@f9\4mupJu"0…bf^)yNYC3dl@I-@g UTF*X{j!EC9RO^9[3VF:W˖D>1b<9@${\WZo"mRx?> A[ͱ-[H?R̕3`;Da<0/z/էku!bzL\mˑ%vnx3Okk`Q=  ?6F-:$9ukrwߏ>5;5;"W) gJ.OU^g m a#5ϖe~3N30:lw YN:,BYf0JgJ)b8lԂh. nPW_q ]O&],xn b"f"Rpvp3 HU,#O3i-yt P~?>ͽQzwC_K̶^Tg90DͪkO;Ni9]?")|{͝8G?ݏЄMr>KgonQFl4& iOdκեLJ猗K&튬Jte/T8]C*߫͡FԦ<=U ~!4 Փ ],"I AqYW NSz[E(JH-7CGýZ4h7DҺ_hK KK rKka=&x֪KٖZW/a+ԖǪoxIc,$}cc& r5a5z+v}--G MQK_eY0Æ.W߅q-q S d3UĮdh"7ƊKNMǘEK_PbI q[U.OIvY}~yQ2%:dEⶁJr]eN 8w\Z{>k(@!fT(G&y`>Yfl:Ȯ(>YJ򜐓_'˂1+2c^W=vNKqߴyW[P ;[Cĭ=lR$G3XO"IY}8_7iJMBڝ_KLo4N *@vhRa}pQ'iUoq<"//K K(ėIt:J;ڨ.-;=.΄6ѴHs]rh+@@v;4(,f1'E+ӂId|?jďѸ$:R"ai|PkP 5nO#cgPA>c;8{ݍ>9*_|d-˟ܖ_\ Bm*Xn!A׌1R([ئ-lw}AX?#z )YPg^7:+eg~rGVD~7.w'9,טδLWHL(Տtu#xϰY[Yę 3(`<#uJ A o8X߽gk>=IB̖MT-̍i>aԔfE]#KA  R"wgKL:p_뵙B1`iBŕ*LWsf )+.G9fYQh2[h g yt넇YK}C~sn>ά`"Gs :az⦶W Z6ʓA䫮lΫaxmˬ&1.ˡ!n,S ԅx᪴$0_MuU,h׺xCz(|]ԏ;*Ef`d=="ʣׂ|TXYF) HHZ4Ȅ >`Ѳ)1Fb`K(v͘`k>]uf?ZTW!@ɡo)L8ާ~Y҆(3RWY)]9j ohp1wڤ;PHrHl]L&ڕ&,>#2`#mzƂeܻ԰jNNkaOg ?HG3Ql ^J]Q{afPk%KWfpMʪ,w6RmO.j-i9 Joܗưlv YWJw 1ȏ ALOogd4-L Q W^ :8u&f 1D5lۉ>g>zQ~ O,&7"+d`~jwc6. Cvݢj*F r/U|@惭pT@>Sk ALRSW~W}0^x׀|&!j[0yaޕ qv#E,nRmE4ұݎ}g\Hs׃Խ@1.Vg_UM܇v/!Q4A h0x8Bπ8yd] O_ڼ{~(}@|a8@Ǚ_D'gRdl8ʙŬ>DpYw/51yw;Sx;Ej&^w#–<2-OVs s+0>n8ѥ槒ԉX3a&y #0+;Mς/\tDvdğAݫ]OXaNw8Ijt\|I ̡_ s{q/r-=eqJ)X`a0 S+BTxTLy21Ӛ&t+! 9I$Q)v˴YϘjާh`Q;1H5 =nVZ}"Mi2κ ]XS+!vcncBko:k<oEj-.bKs讁pesAJo+|뵧Q;I(L;:v {E9}]lNH%'8OE\ ,bzkO/u'(bOFLd7pF,c8`y?kG٨mYW7` Y{o?9㋘_d|Bڢ!I(5H4]#T 49*LLC͠+TʮX Ɩ.J80?v9&7r>y!JjxME<8DT/zg(2+İe@Mg-~H0.=n1V6|2Nen\N[ saO0{8FCI38NaC Ă|ۨsfCRF?)<+Pț5E*>ѴvX*Ep%&[. s/PazuL3T"hꗃ9:cGk";ɳ( xJiVTOrLqJ(=K: /Qd~gKNosQE_c },Pm蓚FV#>4s,n+[ ǸZГK0fx~8GVLHbj'&O?vg.16uJ|i]O50`h)*跜%kG]$ÓxJU .lZLpVj%ntqK_vBhF ĩo}U8׽K̭%Y4pYlM-,xr*%C~™m`15[|kƜAQ覎 kqt'[S/A (4ӺP"'aH qo2ne׳l dibϫk\*=e8dI/>r<kz| 6;4 .㙚@xqz?ÒqqԳDBpb?yvBW=ң_=|@Օrȣ:s#c< ﴅiGQ{Crt cs[4:i}R~^g1O~Y]dmE&À݊Io4ćͩzBLG1--} }*s˓gR(LFk*1-F$汍jְg5C{ G)O'0Jba.EkjCSWzwlKojcu"Uzah A_tx};3uQuNcj n!Z^_%n KB9pzMuk0kClė)E)#4@Z f"wr@;Q+1{hTG>Rd|pLNc+abiKzq%{!2*qC.K8B4pp6C3(q\ h_XlBɩ<[QTAlc©! G *I'*k'@qEr7Y8iy3DļLJ0;9e쐬j(z[v 1+vxzB.Ǣ%-25s /~t`˽DnF%-Ēޝ&2FQ*x|#-2b2[7wq-ࡢmNo 68B&pCRc襉VR9aX+c}\1ؖCeG%R]UBeM!!ځ\aJ _}ZOJ*$h[e/W%ZYDB~L*\yKB :+*sZ=wh.83uKQ*AI1\=!:;J%v&Iת&  =2"tvq20]vGf #>yu(#,0 'Bx^+ThKI=|*F" &9*pTYa;Z@`w[Sux ;aݔg"K VW(#WĹJ2 ؒ"G, HVKt%DWV5SYn{!efJLLcWZ}43s5Ge"%\#[mdASgбq=dW vR*ΕF_YO1Cu?YGSqfq;b/̅@5vM~]ǹpV s]tFgX0DEkbR|.KUF$8KF{Ɯͽ?D뼴(M2%f;S|,ǰGn8鸢[ Pl?P&i/YkYix 9xJa}Usq3x?T3 7yI~~ BA)_ׁMLNr #7kƅݶ< 8 \ԆGE8p 􋇦*ŸZK;X\Sn{3ɹ|wM!L&||u^S_Y:'zJ]Ac\``mϻ_@ ѽ>Iزp.kz2QqewIj6՟C@s sBn9 (f)L` . Gwo=!ܔr*pQCQu]_tAٳGݙ;ÙnY#D1g֞CFIYGGËbţ=cѸLͼKکE/@U0$.(C+0DòO\!g] Z$wiL}\YnH68k.e;tq  Iw_Jhv#瀣\\p"R`X5a 1e mwOi9/<07#'8/ؖi;xBVӴ3fIJö͸޳g^^YlH FӳR;g 33, PF2Vs#R!9ASL8USN*7P_vhA)+4jӾm{=B+"9jE+>hۧ i[l˕CnȓOz5xV+Rhs'k .$,5`S[1Pf^#.ȳ{Ka>PJ>=~Ҕlu[FVrc5^W;ŞlŻA2w j_B t[O^Hԥ3*X 6ңdKzFVL!zfi2} )'ЧATrۗ?*ΡZWn#v/C2 pv4mJD-O}i.u#my0[s_ ^Cjoiӊ %QEB$~] 5C*4RȖ) *:r+ I+ O6Q{X'т83_ 9F {;G sAc[ZB? >?"izV4 (ygV G!RwkFXAw}sgxneL~G)12%RS<yf@l㬎)R1ă=WiXF+aK mzt 'fUAMЈa&àf@)Ufpj%B01ڹ]qF7$#W,}.Ɣ6s nVGrE[ζ8:*yWXQvUuX0Nh+K fuJ>ΰHg+1,MLXzd~d+Ir;?(L.Ubl;|, sj3o~ zk}UGTc ˩e#ḏK=@( }{{AnkxjjoX`ٞ1 oaFR{]&[HF#}ssR^` IB=W1x%V37Py%gzⷐHAf7@syP4;4`u5C*Frs-h֓iwбz'F$v䮶Y* / 36kV>gjH{a,wįPoKBXU5eow<ʤ[ۆd*O(]ijZ>|T3qgcYZ$譤&xѓ,eV':ٓ* _Gt'K~0ӻ':?,xGe -ݯoPo㈄(m%xH Vxq'&gS32QlxpTgX ;}$$!CYw.˂~ԃ~"X?c3/qBo@4pyr\;çɅe{`WF8-mi8^x{t{I[A䖀{jqqmhJ6q_Aƫ_Cˢ Yo`ɏ\rY] !œ?$Ԁ|ڜT=̳<䋅MHk*tYDд`CWH8IrDMDJCXQ?ItLcRި?oMDwfolʰu GH}(z& nή &зÿ: u!}GU'x Qư#T G)~D+ٜC ꇁC|8j4Py`¯Q *FteȮ@ -0 VԚ#yg{'86Kzlkd S'U,%A%-iF" ^?[ d{DZ׺r.0S)%kT% 'hv)־{kPA|+ݽWKrLcEf5&ng:ucbzH){%}(Q 5лqK9VNM v^ϔyES ]~ t&KJ&걀$֘bU.C*)P\Y{fKZܞn'Uḕ0o/̊ncc1 N̝jqG e(bש\~>Й[ 6X^.Y@mIٗ',:C/bV'4 Yo|v]Dpw(Lj]4=QmF.o\mN/K(#{NmfDΘCZ<l[R0Ȍ0ߓ;,RO44b4u),JpJlPdNU { &95Cc:oR[_>AI*G ۓ]y2dY~N"9V0=%0@n.hxtmpnUL^ ljԊ.08m˳(-}j*"idQٯ <&vn]s{hTݕx=V.<fT.t GBwZmS7HbJ-ϣ*SP q4)2"[.sœt9ބY_2) y{ Z'*ZDpR!1$%t鋔۱+5*Jßr[Ù:Y:GFw/L%B2E87B+| ʍ *eXeB%O1dVw0YaaЂ%~PA%H tBR3.ε̠h5w399琁7%ဧ'Օ,!(cUG0z|R첟Dg$,!{1I#8P?+|@.+GPрa{2Kg)<=i >Sxz.x} 9#B'ڔ)~Χb_(h)oL!Kqߵc0o+e(A%a>FeA1f< V.A[AK~麚q9DkീHW>MUe[ 27'gXAlO:’HPmy٫@FO\(^D]ɱ ,a. , f`;[,]hb_#4=&+h84f l2M J9\n[1/fM, cW1?1_=d:;&zC\B ;Q]£VPfqޞĻ;EM,$.!iAH$Z@ RE\00&ݷb+l5ZYcN)z$8G^M17/Ω32 }zv,p:IXk0R:2ި{T9(ix!|bJ"GqT} 3;my;#ƼY_OQy@KHxlE*DMҥⷝZ]5d,1Vx rtk\N3$<j5@/qCfu*ǛVx#4t륾fD?.l]h3%"l0$zR9@ ۬v|Ry9oiL (-^,vNETdFIt@V1P|hҮ7^Z(Rbl`8,2[deT+dZIS$~|q~c4.0n~SSYc5k7倷-9Su2R"}Yy3}X "7 ЯsL jdy c;  IIu/2iˉ{6+IXZi'\]Sj$nU:3yEVC\W{8|oثz)w 6wDoP+)QoS vl` eBjhECv[ #BPnV(&>Co,4:Y "³%dJ@C>X@gw 'HcH"7-}îGo>kNEiCPcv䈏ߏFDH JOF;m4?#upjЧO?Eb]r+Sip~գeg^ <@s-k>fC`%ׅEE9ex$x@Mf~KRŋ5S]{lmA0q֝i.N"9">}#$ u9s[T4M5taz/v (lR]D3t<]z ϖAQZ=2kBn*˜QY'ꢗ=k#K\J9OUxirI9M79#2g 'Kfj os~( vz~Eiqыڙk` zy`cuOR k􆑐PЏܼFG1Jcw .D~ r $ l2;Ц?Pv8 &M7o(oh{ D:]f_`G"H:FN3|,QVX /E *C 9}*fnO@vXg-Wm97|;o,Nw<48r򤊥yb(U;S|yج$Hߙ a{Zz7LlZ1Y8p{҂(/ 1fvS#.rSjD3i`nWmb968:تG˄vcPoĨcK#K[?&|#I*|_,#_⠃|c"aZ7JpWiy60sqj~utkuV4Ͷm߸7ErI%#b8Di̓v0bym,5ūumYF% EfLʿsjF%rW0}}tv$ȿNz)Gja& 37#Cc_qG.]}m >ixzSR,n3A΁9zԧK۫nً#+.JYsx#cD³"wn t)5(j'c5HAXS;d(ۿFnH', aSLI&-4O@Έ$Џ{w6 P(>PgA 6:ָN+~B3I" rI*tpQSJh䀹)Oeo>N}k#kqC;XjH-%%ah~ҋ$C_:${֝\^6n]mvΘ,Wjzy"T+RǏ;Ų jbP܇ǒlxėrT%N ~d< 6d.VH5nHwS!^nMߥ.Szt3 (*\x3 3dA~,~ pyhfw[ <v\SLBuj\{D7>RzV-wkp }sRDWŒ-O-RdHf'\+>N!go pFqzxhX`pl[iixz/@(ΈU+dpG:VD xc?/Z9G O:$ . 8> +DTdҲ~aS`wQͅHqDNl0߽.~G]1ײFIGXR@\reWd|R29\}Q~'otk q}Hs3m;yzh>2S,#^h0!j@ }m 2q*p"w_l(1]`p]ЎeJ~OM:U BMyn7(^h LJy~z!xQXv&*N& ٱa ;&`TK s.c"%Kmĭ+  \¤}1V+= c}0nUpkJTɨ4x!e5>ʑ6 Vdojjo%]+^>OjӢ3!bk!Ln [n^waTV1^/d^>VB qg J$M~t ՜OpCײ6wiH}O|˿_z_LJ| ;<*zPqR~h{KWYEY֪˴KSSCOg:1z-d`0LNj~blLfݳP.gP"Vn'$]>4/5MSPz lYbTSXĥ &$0T@ x۝iv}9tC p!shrViϟ1`| J ͔S+)k ~:pvR +#S/Ե±[9\( ݤzdUW!`X-S$Dw1˨10ɩT \ $m Ql:nߥzmq_6u8ͣ'тz)?j"@E>2$Pԓ͟+h=B]X ks@\@9Rߺ0N8NO= 7. 9G"'TgQKLxA$bx_Wd![D }^a!&H :DnLDع NzS(j͎t1Jɂ>&>Qמ|HDx:ZXbL}\mbF;8LF{D(/upwt8D *jhC6(gat4p Б}\>AFyR{8x+ dYT8kVvz(vZq7v$A΀4r3J%\[oJwJd[?'3W.Xp#\u6,Y ,R+e âa3jwC4ϱx|aVO)%A"3t(XѬ7Ľ0 1SZj WdEP5Hll>LGFn@Xx'Wu":EeQHhR&@l'{BƿvKW:h^53 n{GA1k8ty‘ro|8U“_q LO#!/hD=;:^g+Ȫ@ogPDFUʋtH LO$czTh4_J41c\4e[1naȌa]1h`7*x]0p{|;7*n)ח y7Fn k)!:i60vPi}qh-wN5&$z ade 88.xXnE,+VV54}K' UF[6uJ~z|~kԃ4}~Iż[=!:[[16]|BVPgis|u8V8w98LM7|睱7l-A {JbOPT%5Ɂpf|a/o,4wߛzlLd|rC*ڷU~eh? +D? l3sh-E IM3'2YKRneUgVjl7֪7]VȬ\jbA ώ)!.svKBsqOTv 7˭? E ٤4H}g%Ɋ Z&lQwv+EN$Z΁kjm@l;) >xqPqpQ^Of[#W]2ϭÍϔS5/$}2; . 2a9,v";D7q ŢmWW'eA:28{yg`od0zWV91{P| ##,=3ZpΡ4#N6.a=(z[_~֫+&c<=ÞPp An|(jtiAjh ;5OIjx~݅w)CIПBM.a'wrǵ[&?Ac35eX袻ҧ<Ņ lqSWu5~?oxRwa@*Y_9L*6e*;[0l|xI4)%=,ޑ6{9q];)K =v~(ivƘmUis(ygrLOo )_8֭G\$Zδ,xct艔x,:x~&؇*,0lW=ak}g-M$lٓd ?OE^B.NA #v)̞)[ޓ2FELtN#];$dyiT`Y54Y*'V|s >C g)4o1\"%v݇WOX6_A"kuc$Qp?Kq pt9y9alEh2] & O"h6P86ψiY>!wL_p8p!Z8%ʻPp&y<5Z ӯKBh._`4E]a*qZAp&ŻƦE!&-7DdI_o}PeRY 5ek]NĽjM䑂Hu Ku$yhW%0؉r_vG!۵!4c"' |V(~?5s!-lNCcL-R_rvu4+$϶`+?ϬjYV/!K C% bEIV'bid>q *` r r"u;Mg$?IEb?E mDtZt t2ωL%0ToYEƪ$~=SYe7mF Y@xngPY<d&2.;^Z\Y,`XA|(!1Bk" hvébs PGt,t.RXi/]e1IgrX]lDiՀMUBGkƟLF)@ SٝPp$=v1:/#ybOތ(=NпM/:EO*86Gs` V%3Amav8֞%1Ul*L&^{H%Eo! 'yxcskfІvP孶lhļf͊$ ')ߤUlK ԇ1.p-64mljE5އw^R{,l0 3XZ$AyslƇO4رqH&E&YC){h_YW$YuON{In;эW=Cn] ULGMn=r:U/cTPHCFQxc_秧5C&MNu ˷c%N$yP+b$xOvX'Է\V'C_42O$߯W<ΑAw&P"3v W%Rm獽@|j*䖠0[SM ʹ Bsz絗MGUp.)&x!37HBZ W{{w-Oۨ5cUyi6R}; 1l +ިeT2+q7A5\l,? r[ȝ[1eŠ1/41@xGʹva3tD5{UiTet{PQIm\IM'6MUUC܌JP^RVhA΁1}uwqbJ  ֊Nutqwcv$ 1c`DФl4[_VkwM5΍>wvm[Fyli O,SF8T0Չ&D-fEs?GqۯC |_!JkNc׻C̀v 7 Utdr 8V'`Ѯp/As^ fcӌc a~(ދ|AUy&2tvWX~07(hFBDBqGhK5b61yz5yz: AƮgKxRtqCv$XXnJ nٲ5$B'^>'8saۼ -^l^]3>"/#N@4U^>J2/ I$Z,<[b8'TWZElJtyN) yg7$% [%xMIY;a1lȼK(zׄ$rȕz %}[iuP"W=_hLJ]tgUqTϢa_:g_Υ]co.9 Ypo= H86D{vƧٍQ! hvA /57bg7V{!6K$&L6bsKPᬱ_ (4}cH5 Pڠ/&U3+%p7=4g}?ﺈD|t0 zRiHd-cRrwLi:ܙ)'TyZ Te=|v(SfK"W)PHJ#2Ʊ60%%tU9Dvѹ ح5'=RrN(Sc< *vi5}̅<9{ *YەFfp.|drd9"R』xf)2[B)` w :'hњ<@xݐC˼ ߦ= ]!R1&M-9ȹ)Ics1Zs̺ [3 :}}znz? 6#vh~5c9W[OתCMMew|\졩+C|ԑG XHnG鞐>': k^2ii\gIĻDvRE _4c}~.RTLG9ynҘ:#71W,_XÙzpfjP oT[tíbG Jzů)W\+@K: r-jmλ+x`xC׎9ز$tޜطs00#L-p^Efl [~Е iz*DSw(Rh@t3Ъ[T9=4gbNnlTTH^Em#k*O1-ݙ0 8/Y_Ԃ^r%x:st 1g!,Et1.2bhLP&#!@X4Θ̈#o3r-Kl hܱڽBmiN|Js?5m|&B)ǰ, ^Ii<[ٻ]WG@8\t~Kks,%*VշzE;mkQ5*Gtz9dC,闟Ha(\2Y y\ǖ&Jbl;Չ栾"k3Oh3!m# b"K3C( ]`l %'.Vi &iYRX,eըӦR=ft j5m%2qMLgf&'y|狠Vb<)McZ d .x5pm4Z!O7?IF%лjьJ_t*HΛx3\{8焴ǚ}~:d^r½yʼn9 _sm m҅+C9Af\J4nE@X3Rq'QYMtWk̥T6 #PSk)L@bKh])mOjӻ-W|UPiM. 3ĊO(,ıpeT,8D3lDkZܽSĀ#+BXuk-U-;)t _W/:)0Mkrr;nւtͼ$X}eVOV0@6#3!ppsG:~/_m$2r/ƧTi Q㝄VMXՙa:BR4a&dS*9.?ŭsQ+}tl sK >I @@(ulM;= A%~׮tl1t#1Z$jjaZ*׷)lfzTܫx0f;EAqxmU߿ZԈvT.wG{&1uznsVz;Z;)ĵ# `o'4w;5UPwJ. d87f43@?k!YZsW">S3pyֿ#5(f3M?^9&XD寻xjxUH;/X`=:5kP;\A\Lk_DnGNt XO?~̸bsTA֔ma,tFT: '(Z|CYv+'D"#"Cܚ0= V|9PABTu 9sI=a]18ƻC1pNƞj,A)꜇/r(S4qGdt)_;α +Lr}Jd ln_-.ۀ=Nas+!_?5fwh.aC?t:NF@*$OV4&~MAL$MSjUA@}FN0-%)A | J . œ#As9%o;fq5IcԥUX(&1Ó h)6ў@c)Sanc]D}v%!ƜRJ*i<\=}H AelV#>M~LɈn+ƭ!ߐM++3D`7 TFƼ1` H0$[q.T%ԧ7<*4V=RWG9y+.!P@(wRd<҆΢%׽z,2K GVzv?R.!& 6 G!̮l+z#1W(jJWt5; #|7ߏN3Ed2 پ{;}>3CP9~eI"\l7v'> š,vO31ueG%ysb g[#7_06'{Rh\9:X q̍Gmq\AF#0}@m H Id-8I({ON0]ū\sjx!n 7?(sԂpy U ws,  $w__0SF=T\ fU1o}}&%;A:6KO%NĿ,;RXZ`Q"|y]B·<u7"? GjnӵRб/t!I.A]|73x=@?=%woyCF^xCm;F08aEP=-UF:UM}Ł>Al5?gw`_$p.f|&d+#_{YpE7DYNuY添xCfCۖ :u ,ݘBk*op@(1fE9OFxd#< `PbD_ak}cD9ə*B@9&RgӾ(?fKV=ȋK&@l~ƤT7SKj:-lySǪ"9^wWnn! '`_Nd{NXky9:)2[ Q=d 2_zp$jizN? I- 6lҖ\<[ګ e燎̦57r~W] M(0*?i{렅.lVk!N5z<\B-=cpYCFPTsg5Ħ8m6;}!mdU+l:#l42 'EiY