summaryrefslogtreecommitdiffstats
path: root/tests/test_ipalib/test_backend.py
blob: b8f8d557ba7eff5b09c442a8586eb48a92cce972 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
# Authors:
#   Jason Gerard DeRose <jderose@redhat.com>
#
# Copyright (C) 2008  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 <http://www.gnu.org/licenses/>.

"""
Test the `ipalib.backend` module.
"""

import threading
from tests.util import ClassChecker, raises, create_test_api
from tests.data import unicode_str
from ipalib.request import context, Connection
from ipalib.frontend import Command
from ipalib import  backend, plugable, errors, base



class test_Backend(ClassChecker):
    """
    Test the `ipalib.backend.Backend` class.
    """

    _cls = backend.Backend

    def test_class(self):
        assert self.cls.__bases__ == (plugable.Plugin,)


class Disconnect(object):
    called = False

    def __init__(self, id=None):
        self.id = id

    def __call__(self):
        assert self.called is False
        self.called = True
        if self.id is not None:
            delattr(context, self.id)


class test_Connectible(ClassChecker):
    """
    Test the `ipalib.backend.Connectible` class.
    """

    _cls = backend.Connectible

    def test_connect(self):
        """
        Test the `ipalib.backend.Connectible.connect` method.
        """
        # Test that connection is created:
        class example(self.cls):
            def create_connection(self, *args, **kw):
                object.__setattr__(self, 'args', args)
                object.__setattr__(self, 'kw', kw)
                return 'The connection.'
        o = example()
        args = ('Arg1', 'Arg2', 'Arg3')
        kw = dict(key1='Val1', key2='Val2', key3='Val3')
        assert not hasattr(context, 'example')
        assert o.connect(*args, **kw) is None
        conn = context.example
        assert type(conn) is Connection
        assert o.args == args
        assert o.kw == kw
        assert conn.conn == 'The connection.'
        assert conn.disconnect == o.disconnect

        # Test that StandardError is raised if already connected:
        m = "connect: 'context.%s' already exists in thread %r"
        e = raises(StandardError, o.connect, *args, **kw)
        assert str(e) == m % ('example', threading.currentThread().getName())

        # Double check that it works after deleting context.example:
        del context.example
        assert o.connect(*args, **kw) is None

    def test_create_connection(self):
        """
        Test the `ipalib.backend.Connectible.create_connection` method.
        """
        class example(self.cls):
            pass
        for klass in (self.cls, example):
            o = klass()
            e = raises(NotImplementedError, o.create_connection)
            assert str(e) == '%s.create_connection()' % klass.__name__

    def test_disconnect(self):
        """
        Test the `ipalib.backend.Connectible.disconnect` method.
        """
        class example(self.cls):
            destroy_connection = Disconnect()
        o = example()

        m = "disconnect: 'context.%s' does not exist in thread %r"
        e = raises(StandardError, o.disconnect)
        assert str(e) == m % ('example', threading.currentThread().getName())

        context.example = 'The connection.'
        assert o.disconnect() is None
        assert example.destroy_connection.called is True

    def test_destroy_connection(self):
        """
        Test the `ipalib.backend.Connectible.destroy_connection` method.
        """
        class example(self.cls):
            pass
        for klass in (self.cls, example):
            o = klass()
            e = raises(NotImplementedError, o.destroy_connection)
            assert str(e) == '%s.destroy_connection()' % klass.__name__

    def test_isconnected(self):
        """
        Test the `ipalib.backend.Connectible.isconnected` method.
        """
        class example(self.cls):
            pass
        for klass in (self.cls, example):
            o = klass()
            assert o.isconnected() is False
            conn = 'whatever'
            setattr(context, klass.__name__, conn)
            assert o.isconnected() is True
            delattr(context, klass.__name__)

    def test_conn(self):
        """
        Test the `ipalib.backend.Connectible.conn` property.
        """
        msg = 'no context.%s in thread %r'
        class example(self.cls):
            pass
        for klass in (self.cls, example):
            o = klass()
            e = raises(AttributeError, getattr, o, 'conn')
            assert str(e) == msg % (
                klass.__name__, threading.currentThread().getName()
            )
            conn = Connection('The connection.', Disconnect())
            setattr(context, klass.__name__, conn)
            assert o.conn is conn.conn
            delattr(context, klass.__name__)


class test_Executioner(ClassChecker):
    """
    Test the `ipalib.backend.Executioner` class.
    """
    _cls = backend.Executioner

    def test_execute(self):
        """
        Test the `ipalib.backend.Executioner.execute` method.
        """
        (api, home) = create_test_api(in_server=True)

        class echo(Command):
            takes_args = ('arg1', 'arg2+')
            takes_options = ('option1?', 'option2?')
            def execute(self, *args, **options):
                assert type(args[1]) is tuple
                return dict(result=args + (options,))
        api.register(echo)

        class good(Command):
            def execute(self):
                raise errors.ValidationError(
                    name='nurse',
                    error=u'Not naughty!',
                )
        api.register(good)

        class bad(Command):
            def execute(self):
                raise ValueError('This is private.')
        api.register(bad)

        class with_name(Command):
            """
            Test that a kwarg named 'name' can be used.
            """
            takes_options = 'name'
            def execute(self, **options):
                return dict(result=options['name'].upper())
        api.register(with_name)

        api.finalize()
        o = self.cls()
        o.set_api(api)
        o.finalize()

        # Test that CommandError is raised:
        conn = Connection('The connection.', Disconnect('someconn'))
        context.someconn = conn
        print str(context.__dict__.keys())
        e = raises(errors.CommandError, o.execute, 'nope')
        assert e.name == 'nope'
        assert conn.disconnect.called is True  # Make sure destroy_context() was called
        print str(context.__dict__.keys())
        assert context.__dict__.keys() == []

        # Test with echo command:
        arg1 = unicode_str
        arg2 = (u'Hello', unicode_str, u'world!')
        args = (arg1,) + arg2
        options = dict(option1=u'How are you?', option2=unicode_str)

        conn = Connection('The connection.', Disconnect('someconn'))
        context.someconn = conn
        assert o.execute('echo', arg1, arg2, **options) == dict(
            result=(arg1, arg2, options)
        )
        assert conn.disconnect.called is True  # Make sure destroy_context() was called
        assert context.__dict__.keys() == []

        conn = Connection('The connection.', Disconnect('someconn'))
        context.someconn = conn
        assert o.execute('echo', *args, **options) == dict(
            result=(arg1, arg2, options)
        )
        assert conn.disconnect.called is True  # Make sure destroy_context() was called
        assert context.__dict__.keys() == []

        # Test with good command:
        conn = Connection('The connection.', Disconnect('someconn'))
        context.someconn = conn
        e = raises(errors.ValidationError, o.execute, 'good')
        assert e.name == 'nurse'
        assert e.error == u'Not naughty!'
        assert conn.disconnect.called is True  # Make sure destroy_context() was called
        assert context.__dict__.keys() == []

        # Test with bad command:
        conn = Connection('The connection.', Disconnect('someconn'))
        context.someconn = conn
        e = raises(errors.InternalError, o.execute, 'bad')
        assert conn.disconnect.called is True  # Make sure destroy_context() was called
        assert context.__dict__.keys() == []

        # Test with option 'name':
        conn = Connection('The connection.', Disconnect('someconn'))
        context.someconn = conn
        assert o.execute('with_name', name=u'test') == dict(result=u'TEST')
n &cDW*|{劏Nɩ$!+9gkW4i#ڲӷmhq$?MTgE^ڈ* t3!QI8GsB-n(ޚdWE۬RN%ӊ&m< )7v|N5jv rׯ.K7iن ?`wQLr0 AHy}SɧKH'0sjW[J3[ieVB]u6^hkh d~_,+VGϰ9U쨠ͻPg幧žꄹ͚B,SV8Y7H na6 >bZ:/G5s[ݔ}#+I/x|&}^' 9(lԭ3 zW\^!3wCM{b}@8˩cs]l=y}Z'W ܁86 ~R3nWXרs=-FZZ@Y!spq ת94U{,<#B_徔DsHRfwp"Ҫʬzl]W2 ϏfmWR_/O%N_ܑ9t׃ Mv6RqV\٤ֲm) fOD  q)V(19|u 4^ꕥz +pTћÀ y狉o ?O~ QrN`gNTU2]D7%u*U||98Mދ 0EWɭ6p눬BdEjM2!àt(Cr ~ HُxCQZTp/"Y?|3p/ +ZVwߵ"SA{j+q%Z;•_>ߛ CGˡO"qi6jq ؚD$7$Yr`fI!*]_=,롺2B\]ۛMJfæ ͎i ޹J$OKjk(r;NIu0vƜ5}@0 _z%L%;85#_T5YڤMlL|%"2 ʷy^ fǣv|,}VcY a +4ow}^JK%`; ItiP$'oa >dJuCYw/=/VuG3ȁ+ĐA'6(,p ,pFW$O~3T2?_( qwQX>=Jj$ޒ`"b`R1`,۷\v^x8u 1ΝB2AKp7;kSx렖6 M}in.ql萄5!ݧ$Q̞2xBV>NWN>JwJvd>1EލH:НV FMj[v(N( ݱc-yEKT aҫ愈Q4m*9.>Mo-9)D6N6AWMMʹY]DlޖX ]8YȍzDv3D$6bjJUxx%xKW?:Q$N72(W:&n,&6_L5nMGGeS: EY>"b0c.4N{!%prxjR2{YSg!T`.U' _'hIX6$ZSQ2Ҝs4tu@vk}8zs|z80豩hTȢF؇m |i6dIbe4NM{_ `8:8ّ!(LV~byvap\x|;"{59i7۫ñYN,Lʗ8$XʧԭXC!_MUPf>AAw 2W>-0x`݆0E?Ցڹ`iyaJT.j8O0J)R%n`i&TnK(TTefcA/ziyU7"S[bA8Eql!~KޒwAs,uRqj8+m}ߑ-( TdȂ[ pq<D.O]gIZopɿ%O)lv_ 9oϪ mO-N&4bi"^5`5 jKɜ1 ݕ@|wS חh=f\f'Nu`e7+2ΥoA榛ã]Dʈ\mX*6ax>tØ)pz}աc Ta9uSVͦZ+NN|kY+RDpٞ2z #ĕC'T7.+tͤoc6!E}Wz`]T8սV9g#W3 _SU0Fn"vykk<ߍ|* g>GkrI}kDd^D9"\)gTXet_\;E@ؔ*br(Uv@ 1&hӏCX𼗀ۖPQ?Ho ћ(C_H-GWU׻VìWHO)1x#%ѥ(FQ7:Ѫ}V̏u1MQJkע*w! 5v '2u;G_.tΪy W7L,wO]Q/4=Dַ-q(XtуdwP\rj2Lz/& u`%մKаBd-|-p>z^G@[ /HA|Q-lkI>}d92GZX4ȡxav @c? &uX. t2p|*qF^HMD%2=0a6ɫgv`HRʎWij,ɳ`h#UB($d"z^htPe/ 1x|;3`; =O*kY3t Jio)@ >xъaVDFz:SpHƈHEژ GLP8VTTek/0wAHأv| bA. I $`Nk{1COo\p2;vl_a`g|i֐`9?a}`Il ( D4MŐlV5oA F_z:6&~$WK^vkGvD>U]?fkB,JIv>G9wg{Jg҇Fiv 0VNں# 9N t r,Xu=J0_s뷥TG*^ð'%Cy[b[4.섌rRNEk;] f&Jtm&ܟﻋ%Wdؐ`O"}qNl99KӗDI3BgANğ+-A,dTK0551Bk=-cW-F9^?)3SE nV~b:vPe4u?_0.tw)hM+ /fb7$aY'/fQ¤ uL2=ZU8웉nC]X]FHzk jRɗ jJ3}Ai0X9tP m.ai6l[=2dRtc?-%zdtS'z*^A"ECwKJr$6_H|ɋzfe"o%ceu_?hd< PPb+e妉JMЍ+ЛOzJ^sV\A I-M 9߯mx<7YT`"|kk0"Ej85Y2YXrrWg6]KHV;&޲ @EbeW`*]s׼Oy~j:$2J6zp0\՗;;aXT n-u|o|_kyS)R0gu+pMqf3ٔExֶ 7PtkkkŮgFI[).}TSsW^w;C ʷQ%!ὺ", k^%A:eԦL$弶g7J{kfYț[NكLWE̾݃=/gjeb^`¿R(6X~Tb>'<lff&+303_R!Q"".FBB2Lc~}E <06:PZ%&*ilj{񈶞AF_p5,MJY'),级SSLﳟ/$=z(8G'r,#ϲ<ha1j\#m!Y~vdg*Yo5NcєK._!z> tBA ]0_~0cOQQ[M'M=P POU&Kƽ๥6Yu+ƤE541V&Ѝ GKQU\LEajbߜMH.pPlrXfZuhD]`UOmfIK-O"f0E e$[Zdh~B(@K`j&ڕ$C5K\1BEH VAEĄ _Y`hA7ږ2L~JtC''%{U/& K$~ͮ߅l|LtJPB?+u7EA&_U,Vx$zس#8{vHQי`XuPݷ[~8֧#h4H on3E㝿MIX#Y3rlj%]HI4o\rQF;dltnʗ}2ضYs4TRQ-5pzTp(n/'Lr6Q=Tp-27o'qm73EJ^vVbۆgx*F`O@P8wM_ճ IZ7m S ljk^G$|!AJ1QAػȱq3zԍaVË+$U=*m ̷e~eO#$'j8-@K ~ߤ_^ײPq{T Z,E6EEJ}21%2 `l(}K#԰>=-UHSd1ρQ} ׅ17&t؆YjƖ \zqjRn5[S?g,a6!8?)a"ʶLM*ILKF:9p+Da7IRr'Ez9=HشD&}hJx9 TQTQm7 Ə+J)B7^LT0xT Ujd`h %q!yĭG`eq#Sx:N̛5—,f"5>ؼ>fJ۵QN Ru,Uu:O%W&#'V{eHTEwGu$9$P"M =j pdD< h9N9#)K$;S騛Y+;-@ !m<'G= N>-`U pROt9TP E;S'\dnS2՞: 4򯑬8ͬ=5'ǚ A%Ul.i. "ӝ$H=p?g0L Q,0 G3,X׿dۜSI(M$=Q/Dd8qrmK/a̢sA,SFbusK{oK*J% Tg'DLUbC~->jrISQmB~yκzSed#C{W|hDFǺDQ".pආOΖ_kԡ׈nFՒGX'_$e/8M]r^iYw (VaIwxLASlMb L WV;^g r }P]l+hFxiĊ8`p׍5Wֿ!@Ci"yͫFejj/Oh&}~`'|ۅ{R{ڷ9 A:C6uGA߸qZv٘ؔr.GyT1[O[O42E,KxiBTbM:؃9 * &jo{J ODD2ܠ"32`ྥ9E1j;@Gf,1uyO<ztYM*"ֳJ Ǎ0/*o[C ſd9M:~;l fńMC+(7ջ\"4k'x+I4*-񜭿p\ !z^!ܪ\ckXT`>ST4TM`IM0`7% ׅЇb #OOĴSAow*rf&߳Fw?ɽ]z̀ 7`Z)l'op=71>89o&^.SbzUfCpUX;#Xӛ(ؼB|OTS$f"ݢ.,ٚ{b6ϜK|G6:3e5MoMߞZ89W懀k_>ޡ w>^i[mt`! U;c$ Kh9";zKyY=ykԄI9i/_Q`[-\Ao~iؒ0u\-ie#hue8(>!>! Wb]*Bǹ+ ɤA9p~KCnq:M#Y^b>}@3 V2V}=a @c^wJ#@6PRר<0r&7!hvuRߣ>vWIpu2=p)\ra0Zyy?7@q22~b6_Rk iȏiaL=Gf|'ԯ> f,Rv3[|{}FIS{ eDetY0dCvrqT[^D7TNy5M[alqۦZw<]X%g'k3x%hTuOU%nCw[%7͔dV$m.{БV3%D5%lrvz"Oc-sz=wMɓ?9C',nDl1h97M~ı}_)z,ywQQx‹p1RO'QepHE>}22ma(wˆ\y[CP=EĶ}^$/D>Xޣ+3bmmM}e=SZH.;.y'ٲk犓)U~I@Xa;~SIkp^;Ͻt tcƴrR'N Xp͇&9Yn:| œ0  X$&* \r"(=*.(Z87t:yJL?xG` `-#۞'vLEmA]õsQ8LmBx$It C ō/!6bJJ/ QlʂBڥ?-BGnm&v]vg3YjzOM2Y,)g>*T;z@|-Zh{"9T8*2,@?\ $bԇx!I 5@E]@:iǂҧ5rz >n;Cni_A^\'hfL\ ;pP Sy͑fDĝZ<eU+9L_ڜp|ir~`7!d9"&GL/y ҉,r4/eGckV޲jhcc \m}edJb-v}̤65쮻7'5 RlϞP~C8ϗʋ !VqNi})(geXKgiGH~DdhtfqFwEiQL)-xcRxc^ CRv٤ry #>dWrh:eM@ɰymLٍTMnόBgh >opOEssxSF rvں " HT5V W& pc}y= xX3N*W^ңjsL|m.@2RWM~N c3aHݾ쀅 @USay[5 t7԰Vkr3Z\nl>#p+J5@}|* dtM_8/"gWdf?U1=*N%-M`ľ钠@v%{FtiLr4 Y? nV4'$/Bn?!Ǒn:@;猊_8 k}q°tWdCM?|g0c[ ҿO >48NZ1QB\bAC%/zJ^T8C9gV (}|@(̔ls"XoJg˛9zGTDn+ҍ FO9zeFW BBz@{&iS/bv_=r@p!4N=A--ӽbfS_hM2< =DD ;OSՃ n*!IJY:Y~p愤ژп'%5%$0+@']~S7G8`,V?citǥvs\\U*`cM4@.@h}zlaleapT4j0̝>*%-̖ۖy;;lD\dfh9JpQD o~ߡw Gqx6Ȣ/qfTg]fΧq!П_rm%-rnSd@9;gU&1@HXץATb$mHKh3IŃtbKJUf P?uv|˜1{{q^C 74Inj{_GKbl[CَGo"q~2J,̏n 1G *m@l4d؜u4*4j}@KE]uo\H3_ZE;yA'u w2 ŧf}յhzShc[Ͽa75#!W#(PlNɠq~ם!Ì&AʞT_`^xz9 t8Ǵ1ȚBweV54[v)鑝 QvۑCѫ>)GJ|^4x>` XRnVa a&Bni5"g&Md#Κ/WkCԅBIuL J(bEdIn7# Mo6GBd^v0]ǹ4BP"?3xKx>R!7+kjYxcVlROI@?z6Bߓ۪o"HoM58̭O#>Qg,ʗ?w0 gDPV;w!#e Ȝ{8> L Ž`pޭU={Y#'E-Tf)z5%lVë&ϧ2/AUZ+ ]nvN'ilR^L}4uhc8`*V _!0XYY<ױqmWGP聒d],4>#^Z08sGgL2UQA92_,46\j_ .<:'ȯ2D: "#4z<flZ@0Kvz&i|`Bxn"M-ِe9}wI**i6ZͦnjMO '7b[[zI^O*l X?9-+B`]_4[KSD2s!?rP6xex1*<%Սr + \6b ,`FlN *u~V hKa7Zaz)#5 э\%,] !JJǵBvKܪ?Xй2v_JzH94&+Hr zmTh̳%\ /[z +=)}}ɻLΌěiK9q ة7As(=ىhyWͰOԭ&c=5Y=m>O񟆟4bY *8-:~BHow i)xF7OiA<39KZ5>D_iî*yB̛~GOxK0Y (FiסӁ˅H6d;z&!s8 B VjE 4zxf鴾:  vSYt `n5xp\a| L W|Z8"7C y~ߺQ*]Oһߺt{iCG*c;Dl;)>z% v}C L+6QieoIziP58 @|о6[UeXz{W&Zh\T WQcDiQ#iWWIMfGMIPc7 7*҃@9u"h QSPcjU~AuѤ]|U :ݢġ¶)y (Lm3W {e(V78Z7}o:Zp $|0tA uO"̻[eS,ma򰉸"ܶ,<~ޓ.YHə{| 1Z ~MTԒq`9&*6puLdjNY*%]DdsO2dhD3ŻNƉB]AXg0#.A|>sLe`䋰-aSQ^Ţhz A-ءݹgv%?HZ~uӪ0pc㠯qvu%d!`nIZ, u/BK{0cӽJWn==9 '8P8+^Xu}~hĕ8ǿ"`1SOV۱}ȲPfߪFhX-Y] }uwRi~ $Uml+mn=5w 4S[Ÿ~ȷq/Cl1L4@=/21 u s&R n`_c6ep[Ԏ1Fs I>𶍀 $k;T;x"V(#{֍u̔rOSL7G+3hV*@:(Xg#?%7³l'vh$kŬkGpͯ ;Ӯ(hg? ;͞ (T(#'}qg[= HplV(ttH3 J~ +$6 FϤKcfݝx(Ss;5>pF+GZs?ƺ0ll'<Ɂ2Guh1)l7hϗ=0ݞnIig pҕx/cv6RC`͑}+15_vؿt)ڑSE+SJxuxX.NA~~Qpw`(!Zck'byqD$Ǜ0eu_fj˝7 WaCU:H0 Lm雬p0W Z8~|oXa>q86'Ų*z?-n!  #CQ ^!Clx\\$>*3b]C6iCK#)pE#ZgIPIP[i82sCҫ, `=_HU`k{ b[K!Ӯ͔$`=G)"woN4:\׌H}ܖ,k VڇOgc(Z|"i!I_BNn2!wujk/#v%*\ՕO,ܢv?o3ZQܟS;(ګM@;}@$ʑ ;DJ`b,|@Df0^zuyeenN"%0LfOBLuPVɪ#y`I*{҇n&^U>Bȑ^g/lin!5ۘ3Ճ<:_^Ɂe?[/v1vyHs-1W %BDX\vLΕ$lSIc>f*.-Ug,iJ]{X:oqgr]0 {3rVKVU֛ Y2y.W @3 X\~=ElsQrX\v +F089 L dLpP*թOJlY=';ufJRD0"qW{śښfvs4w)?HԦ/OTe qXio/V$Op{zD,5>b&󋪹cV<?4X׍(dU]D $d8I,&I1tZz9({v~Aņ^^T_Yvb*)]?]PwGk? {(nHr4`<x/CU \6$?O=^d' SyU*3:4J3 t-(}#}w&D4DNU"N#=}$LYWH׵0m4gbd{;/X=;|wMG뿛)x]4^jRAl9ɬGlt:[c`?Ay@ź= tG,>4cB1&)ץv֐RPP7n[q_eHxbX ##4YdV7Vp]z!}4M>{}~TpT3k0xZK( B,,j?ْ&Т$N9m5UCnH|Ps7bW au \ɀ0S jʙ cVxsUzF-(:P?J mńe> vz6\SwE' ޗ|զx("HK]igNC_$ |`3Xy)t4KU?}A֟U'kCZG=@GBkٵmt K؆ cP:,چ5OӕM~RhLܽ\_}X{Ohn Y:;=FS*䥽a{ת=UsVb?S3j&x}Da~I3~~Vz.Tm뼒ǽ]{3b8Oxh%(Yl< ϓ.9% gD3&%WebhfZIpE``$xuGHXXy ؒCf>9 YrrU+Rz^ޣuis $Mw kY-wN~T9w jl^Xג}D(TUhpzaYcƫc ?2oբx?C/2)q#"Xۦ; 7O%W~& .מJ`xww\n[͔cqoZfayW$H?~6jWHF۾Iim8lMKdWsN*| jv Ae`=o؋;Zsh]VG~zQ6@|TIosR1ԮD]O?s z~ (͕+Fy% gf&9`E1j(!1g?/fxF76; ?죈 `¤aHZ6\Măr,֓oE= }<< Ò+;\ͥ'߀M˂,8Eqq_(^B|G4Sx"ϡL$3]^l~#=!`2S,KM"wB?5cv0O jSjgB(ן@|y -8F.Am ǭwx$qސ:&¬{31!HYZY n"J%ʤTggz~.AyU(6].JV|b 3k r. 7)[|wT0QD 1,t f.XDDl#n6Mܙ״ Lˁ]Q"y{˛c哮Yw<&$iB2rPsj˟ s8azףa[j$-ӹśעx ۏ)㦿ԃ:4"_L9X.sGPTyBr<{pLt@\s).ں!bʭtyeOs_35p5yY{4RY⯅ށB4zϒgWk֔mqNZ uyך᳘d=[!yc!A"Vq{ &%Qh""{QvH.\RzO4Ze5Q,cfl6UKqNKdRӢj#̫!QwX X4ٱ 7gkċ#<,:hO :Duv>6>2<"H؇%@Ȱ/>7 6v=:7Qt9o₥cƜ]151%:;rI!"6 )> QKA{; D`hS^F }{& &N.s[# 5Za?{Ȋ/JS>Pm:| ֊ؽTq˪TFՓp*Ve.7=-VC%A>!B^Hl7@H8';&T\yc\aV' d=裷<*Ec #Kcd3}xߴ`"MuӚI\C&7XLhKQhDKe7ia&-v+ Y؝>F@೙ 7t{߸c!h5^ѓJӣgۦAR!NP3O1'OClcy͢2 >;֛;4[*128o)7#*5 0pԕ[C =4ނ5 #RMQyHQ$*)u~mp+r=7k_Sp55<-w5ͦ QWJ[^7бcDb X%e&@QއQ15F]pXRɳ&x{80J?2內3hRjOXT1qUasAd~--?YE Kz9YwH>$mnmd !Ζ3G[}4H7ѓd e/uȳ#i^uc,7]_5e"'[AU!]yfnԵt8Тyk xU46*i3gCoFgQx3yV=<՛dY$jpC,v' MwemFuoe!xB 88l3ڭ-+P%K06L=M:>j>SFyH(D3K  l-YzwB$_9NG"J˚tJIfo%vr|T6X/.ˉq\J"CU\r;д4]∴XN~\O< 7{*+*y %:2E\h=4n Rm#յތv0/_syN~ahN;_޸]Gd!(H] SBOd_X+7Ij(b(%ᮆI r+? ZO+ńȬ3y"DFB!V(t%ҌXTkDHq=s?7+kӧxx4zݐqUxyI+F`IŻo\7׹%LOk.äQ^)m@*u i·@PGǘ;sPK  E&Fz BQ0g1gBs1wwa }APMp;{=;DŽw1weALJŁW4j:i*ٿUA=F$5ThՖqpwqZ,i#j4rm ݏc%~ݩj[%n}C,fwDyT}\: 0BaZMZP +r9(Uݬ#2D,2b5$%‘l8T.6_7zxl~4B'v%zq\# QvF)OڏaNVil*F >"]6k&mlgB1R'} oG^(P`ӶFz=>ː-eQ**LoeW ޚL5mOaH lcs79CMϊXRВ|9ٳďH-.bH/ϡ]2ҏbeSPr $.UyK02gB'4#Uy8?!by'q}\P݅i_FhA 6@ප!Edap'b[w^2\RG&}ܑA__4 3, 1ē \"3i0ϽEhI$[D3vU;voΌslOQI jaaJ㹁Һ$,@!(Sņ̀o%*"{Gv|Z!lV]BH7WƬN7㊩ gF˨kvsYkF'sVNٌWHx_^e?vC邸=EwˑlJp ^H+AǍ؃ 쉓DbP@ԢS};voת*sfEY@dff[3C91]Wq瓡V**e+UZri0j {L+!I߅򁕇VspNU+UL.+yMd<#74#fA{FpͩwBNbmhqMMa4qnPC+~)AjPG<,(敕n,0u)JI|H5HuCLVz'0'Tfl2HgCQ01Nfe!uP,(5'f|Ed,Mg1ia{pDoI~H>vߒH( 2)Ϩ}z3a~RO;(I-+ֹoiL]W? # .@`w*Y /= L+N>!QAJZ&nJ+ `YW*PsPk`Rl!yv qmHZu轿3WEquŇ)C-p4l ;OH\vd!:H͐'mk: o]fv'EkZFxJ}@t@7ݯ{ fw%y_WŢξB/%k8ۥ4? X>*9Wdl\Wx)%"NȪAL u fHqSD-B06ׄXP>`8㮛_#Xv5_(f^Yd]jlNjx&H'~|\vtϒllD{X_1DI^^'Y8!lOڰߋ:  뮅mrWVu_ l^)Ѯ&b`he xQlIv-_FKkCua=zF7PdR"guH|TW ,=L0^TsULrzJ/>̬/!ۑ ;|T~a]ȍ,[{t@eOsZv/|53K?yy0.U:J'x qgN뺄x,r2)w z;u̪Ʀ;JN?mb'I"{yTiu>Q׸N 4pEȝ. PJ,qH5'R] b6gC 1|گuoцuZɌ_M*%yQnX:-yX)kyzQ4_l# G*hGB`rpT!s #;7 *!: ȌO>)jowvD"%+郪Oa?I2KNwyr*4B^nT2y_up pBWX6_M>X'ܙ/&A{<@Qj2\fJ\]tB!EΔGsr7O7k~*?YcIo%8ڋ G]XDJ=>95>%+9Af)m͘vvIÑ9/[tQ*8q`]@=} 4 GLdi:^$ɋOlerJ-i47բ:FuZ>2sgZg*j* tޤKx^ڪ:|?_ŭebzp̚%045[:uee Ay%(Rc6H {LU.V<8-)OLo닝%Z$z[®H<8PaMaCĂ1^r;kPSs0RA|<V{=Be9 x8!Sɥ =bqdVF_6vDo4 $g䫏D%UeŮ%^;\sN@=mRke g1 ~ҕ7JO3v=mf jJ9U S 9EcvA8CPF]v"N'ME`{X 6+dˀ(c\O𫝈Nk0O.U2fP@`d aI0CIKnd9ݽp]='$NKums=H@D"{'ӥ N˲QFwXA0 J iC3kEc+#XQu U՟ʣɷbvf(kJ֓K'$y|&;8 +/|Dj[մGx'44-LzV ijKO oB:܂X)NSC1ͭos-O2Zv/@~wSa wÝ`_>4L#ɤG;8El>TW~hd8O8~·=!X̵dt)!-ڸMiPvh>F7ղs疪A2yLP' KtuX8omYfle`D$jj~QIoi3Mb#}7P gt3ƠQs4."GR$0˅nx[0xL?=rIsc޵,H@( 4"8q'Ta/vŪ_L =f`REXp-mapfZVwR𠈐Wy̦`k_gWl>onĖRV 2RFKT& I]5&%E6[hu>S\^0Sc3D!CJFP~֗)9JpJ!wEi>q[Iy^wvKE~^s^\ށabz.M[! Po2.`!e ׺^{"p6 ۆoFURW*xϙ,_9L+KZWExәFX%6^8MRp~JX 0n|13fDQC;a q+^>.Ss6n4DMWFj% j Tgx-z6~DxU"tg{uܧk$F W4Tƈڡ<g!%A%PL.ye1:Q%p؈8gUe9) S9&>CnQEKp*:gf@A7i| Vhl"R]vMfhv觪'TR:@?2*KdN3(/ s(S,O}xmmST2Nj!JԼTӯ:-_Lm^&Ѐ`L\ OBGv/ŠeEpB׸xa2i%Ch);$x=lDv`2l.TQC} WFlUaM駔)ʍ J[5a|FyN$nU>\u]tCqS~:H (}ɁP+>_gY9ϸ^4:c!$F.ִ딍2bF b0!'+=|<N'QU$'z%1Nzg0WdqZP;w13|یeg&zhE (iIz!)4*5jw?X+"BrWU+B +I LU݁n9IM,Ŀu+m8qR* R[ -Wl_u>=9)?(TK;:l;X4\DGspNt 4ns8ŌKSCą)nc)qF*@:3' 4nŎi~jx9 zǿ:-^:ABNb>Xǐb|>+ qɴ@-:~_w8ϜE_bsI ¯{22bݺ8΍*!l{:#fV!لHKIRHv"#d,a${a$*N滦n@"(s*MɺN@<@ 'yoiOev\ƴg15?rr2n?IIYkp< '+֑Ϭ}K\9K$&=q'gF\|D܆JN՘gx8WQ$s=RgOΧSQJ[_ KtkZ9<>.>`ɢ%lY.P8*ԁ7j]ށ.2fPr[k"-|k0RqoA.,myEd}CfMz|7񷤧`yҜV7\ a1YV'n9>c }v|s,^J3FPjv(\3iɡ pؐ R/ ʖpi9B/]S5m,[ ay!m4+} $(n "Q z@&3J(+f5Gk ilrޢ%LHOPtT GEu4fIyωG%:Cm^*GVR0D"T 19N~+MD0Rb֎0Ier#*k,?3G ]Cmς66֧JsgRXnm%u)d|4ﴓ# z$[ZRr,XgS }yHFz-3ץpDtr` 9w=8oNM*J$_.>;OYlYwYwf/vˬ'J`JOcZ\ɆBiB<2c~+ ̹$Z?bN"b%D=D,` V'sFzo^|k.x ; Ȉn 9 _|Xe*nËe<eX}e`).ov%&aq+Ph4tU$:+jGc,B2ΏAjK$bpS < 0-Exx` d!Z2hmk!RϦG2۷~}XMAѧښipmyƚob׳VTOuaLEpE/`Ķv%=O.!)lZ\?6ӎU![ݮ $z uxHkt)oX]DsGrs2ݟ%Ձv{uis[Ysug Pq\#XXv!dvY^lV:tlNTO2TΣҸ^@b';U[I/E pGVW[mb@a}m,q7XW_EYYЬ '?$4I2Iz}^#~_|AI¶mԊ2;hF#גU!H\"XpŏWzKNeyPkFݤp? 8 &v8 ?7'Xsyv;.{e;gw+z!MӅJ!fN 6M{Q[}>=$BeoqE):*2.0vҔ.+ QAx[ n]|">/S q=ZeU+ @d_[/jrUgNiCUIrYo߰QْxqC~ G-`-[G *vx qKt5z\gY?aM:x(eL!74e:8#P*(. 4qҙ*x6"u};uzpPaky/@W2u|s/e ӇPjѓ6*AZn+7&?=It?-92e0ќkQk>%PInJNEa$B{؟ˣ }?d0!~QK:q _*R2`Dބ.IFg7F C.8*=k՞ ^0NuR۪]n -W]?c(akZ+ E`Z7zw |K7V`sGl=d54,F:+J4(8ms!UſDQR<^X5tW=pK <첬ж&.eox90J4ap18ݘ+}lsr' /TGqOqɸi[sV7KE6ƃ1|^TȶwmwgϽ^R<~Hac{ |x(G?PlN2'ia?yzI0-^N`p=O+v =Z\.L-OrYWDky؝( 785ܫ*]X"xKSR=#GWsK~-AFE0"ZL@ڊ"JzI;]~ Ce!GZcd ĤYC\0I0| ~TnK46/tM5XP|: Z|%@+`;}Ji@KaGиsWy{Lsk/'T֎ ºhq|*j S-Hډ:˴fb{Z z|Ȱ4NgO 5jҌA懍ǃ(ՅA\D3M@x-wŔo)1Ij"I86j9q AYw`@Q[iC`W ޟ=͌ 18}9:H;W=%^'>6K}@,+;YIIoUz'ipwD<4NFޘMoWrS8˴tZ׿72y)|yU*=7k38%bSjlvX@}vaF3Oʹj-RL NPRzr<^26e'M.1EF]%nU!X-6U8_)+FN& q['1-?{q7>gPEY35!^Wu)钰.>‘"x2VHƂ L[7= d/o iDžfwj .,x 泛Ň^[v "FkQylC~q)v%A\iMK J qvv ֲ %aסWkf䬍o%3V[E1i͸tem۪˧U7R;+ߑ}ALJ# 5mvz\cOK.q+ӏuY#a%K\Ӹ@p(8"63W7dm27]֝B (7}x6 1}J!R1·by²8s I>Ď%Zr fٮ-ehduD?{kgDaw $׀i!O`?iydܦ\Kٖn!FkYϏbM- Z[y_?h=dJ=%H-߀ u7@^EڣaBrt3;{M̲BTBgE#{(7淕bxyNdR~&\szd]Pbm^L/ܽ\jN 1>&"D1ә]S6PzZM R2ɵ0ەh;x3KFXoip {%zZe5N x +W=9h?7DyOSolݫT v"{)Y!E)UXGT.k8&?IJq+|'qY&E{0({j `Ρߠ[SD߰YS˖oh;t+}.(SNU?X 7)2z}"VJ& Y-7OݥΆ,@=BJH<쳈 -XC9!'vF`%6 L4t#,9h ڈ,(,%C<,a[9u.7F ;Zk8"!4oi< |T1$}Źfhu&gdILl,ߍ2$RuG\`pExh Ѹ\r<&-1![g ݆b5o.!7P "Ȯ*ƃ {w,JIJ@yjTsrAl <ǻŮ'.a Ud@XW}pnm 켗W66UGS0uKE$Ka67OVYN,t+b+2>'-v݌FWo5t\W_ϽzKw^ ]F%Z5'RqYra>5s1W(T7ܥe V-%6Jg= R. C7]:Nd0*YTъ}!F_Q[ [Fw9'A3*7ѐcaR;CVM֡϶hADhj5)dS`F|+܍]w1tW$ݕC4J } D^Znˏa`J W(47ݣ{*T[H(ܑUTM<+T=CױߐO]cus!!]WP!:Hj#*I#T[aEW HEP|S$!5:>Kj]\Wh|JldC -g '7%TM=oQtzֈ# #>ZQrH0<]"t {W&MwhAXb0M~/7"o=U$0iMm pCiƴ8B?́ 49N}Vr,]O3tZ>᫴1T!&̸g'M[=YdMn/#!([% & OjqNm#c }"*!=ii٘S=? j7Aa+/J-ȩ#P=H>Q|]ﰮ'/ݰ~xỳu\ֵ\l6xHʔu,'K4aBl5){MSIUSC T!!`"o-rZyv`YTDED<@`]nq"-c|T wx*POQ9_?n8f%l$F凝 c4Qdk9K5M *&/GnZ 9E#[8NX.Vc٤ 13pC$9f̯ e*H.,sКd͖͒ ]'B"kXSێ03}C}(Oѡmm&Է+DML ʘ졅W`X+'`>()v8Rd3i%tc>L_W@a?7H۪ۇ5~FtH PN/(_mџ2_OJ7ExY]hVd3\Dr|$mI`^v-Ң?Ma3-;WW2} o\9 !s,;lW@'SThqxj&_;){rPё1,2%]&]ejm{!]XA2[fhnQI޸a}y2-*ms5ctx*kg$¾ $ɵ L./6 {| *+qX$y>q~2#a=gxaؚI*(׼y/ĸX{qON7Kk3>Qh* s%Q4oe)Y(mO K, >J*1f\J:~_i$G}4qB6fl:!9~R7} (x3 ٤zq6 GHeC'- ^usIT铛ce()Qt6 Bho_[ [[r@KvsXu$% ZahwNĐ4i Ӈz'I4vZWvubcr-9,${C*" ح@.b 3 z ]k%@OkY!> ]gk_*_Wy߁t>,CcyK8YiNdqyE<L?XD s1UYBoeyge(k`ly/F/>cj$ak  i=NzE tcC"p#^;o i5A"-fYci"=hqN%9Aa\&J^0Z% f_? t=q*/f~VpTK/!yT}Cظ|9P4cv3ԂҙkZQn|1~|E!041UnKUCC6}BM &R\Yf肋 wߥ$ԡ<+3 f;Mِ㯠>R P^Fviͪd s*AB1NeZTWNPDϺ[F%ǒ4)isFF.ckݍ [..iK;!ݎ'VA%pd*P¬[/h F+$nxni]J[ceA.J_ը\IZ\Z[=`rtIl.v0$K/n"8>݄'cq,\v-Mki3Vw|푸#AM,)d7l$θ d7"hQZKEl,{)iE.T4'ZQ(VÉq-$Ar80ݽhA$(F~/8A򅙁Z=9a`bDZYa͒Z0VH/!/ܸưG`g@LAڗ r)AϙVLױj2I)ƀc>@1DGΚ}< N?3ᶅ'_}A(Fn|Lʕ^Ȧ7wVu[{?\a9U#K1Qr2Vײĩ iZ"#ň=f>dP&K|;mb +z 5[%t El"KR†(koͥrAN*_FO|TeE5tvg˛Ny\nzf{5,/hZnF!_p$jLpq%nW#XbV`åɞgӾ[ל^Ad77`(pJ7A'K"7"Юri]\bO'66f-(@F$ś>xsD|*t GnUbO׵"7&!vJu+w¥𥸗k}05 ag)EW|PH 5jG0XZEe#$ o6~&فW|³ا%Fm }{Mb.;Gߑg UH⤊v]k8<@&8\ϝW1u%<hbf$/&St*=P~e˫&'hl$Ӈ]k(f@D ;HDHPYJ~qy5#fKv(x) `0$Ų:s'E-{lkOM|MA㼄IBv!bR YT+$ɸǵ%cCImX#Big7 -u٥ʘ:Y|ʧmiuGv1k["` IUP zIi١UzkHJkdgA 3?S 52QOos[%D>/Ί9:=}!V4INZh)pV.<8 *:&Zd@`쁉_a,C).8qfKhfSu+]#Nf+veGݼ(g"6} *fj #mήky$=Ͱ١ƮXK谂jB%)@K;2. (HΤig/ͥ%wNޠTf Z9?N"+;%^0Dƚʢ{0_+1j@nJi=󓕐3<8L.5ZGx3RhLZ+?a/B}֌{8gEncWfͳ5*q(f@wDl##h&7kf& mD Fن(֫"$hMSC|*DT87_~AX< yCi}]d|U#y³z^ۢb9I4H:ۘ?x )>Rq63 ` ®U)D,mcmPo5af/;d8&yܗiXoRK.\1nX/i0Ϲ/SnL7]`?$rêPPtҐ@ %#ygu'O .hjS?¼[9r&rtK <H 5_[-|'%"ՇO\Дq3&?n5SRb "IǻC#aVZqz'7/mfۣя\薪^v-ecodCWOkv`2aW' uϏ7\bFӯqӦHyɏpړoƎ_am҅n>9b>:~]SX*ߵ%Vu ZF[e!l^B_f-8j 7pzRG>/htfS{х' tZLY&1 ^X5tm:/A4ӪĶXӞg7ws6V|5ltI%wC[p+ù%Yzk{iȇz!w+ʜ`G 7+e{A$s-}Rbx=nm`#v<)X# `u/jZ ~ڭz/@vJ֐tEfcp9MnBJPk*6N'K,2 y;Mf%q< {~eEJY0ʺuMmʷNuٷvcr CzyD˦L4,F˘8\touzF܌!׳lå6*>2Q%m6;0{{2+ |ǸMz-L,([!8sϋΑx<^23ׄ`]P''SYȳ_|Q߱m p. m~X}bLl eTMbWLuQ8"ƕ^ѲAN8@Q "̋jQL[,'fqASv\znƂyJRd|ui?_.ϋ-ZwTf?a4Jy}u]72-'bp}5B nxO=X+疙01ʼn$q+c-~sAő.Q&WD1Q|em:%Ɉath[%3 Kx ;@Sbt@=ƒfgپf\SR⴯m>o E~xG]wvVl6>UX.mB?9JaR\sJ9OT}O|pH-<:vr_W0N1~.G8Ѭ\"1q1q)VZ5a^CqAAܮ薥K@I% G iOIVs7Ye [hMG<Ҝ!D}M"X`8IRJM gR|L)B-~G%W{JcD49FdOzijn 6+o6ÀܙĘ|=#}MzGfE"0&j*b.&qZP?FPn:%^k_0 NzmVo7SO\م`sv'5WhD.5rqշsg:@@ &p].eI^WhoOgjnhx@Y\M:E]{$k5h2>,J NxH mٺ:n9TZYX.D8Z; ) |qZJ+]Ruzßۣ7-y)ʒo.;BeۼK,Hn{;PQ>.-n镀`nUُ^wYz9 >vCFuWf3FQ`Nvj,%;d/HQ<3C ھQ`z})[XFuђh49{qeX06zneoX*o+%L.$:1KX=ۿbkm=7žfN3rram#{/J@ULz2埍w.bM 2it-7oK? J`Tl3/ݜtztխw.$%r'zz&N|jn A@cO81ihdGV |<|ΙD??$DFd@p{{>"St Zx UE@ 5JA]QXZ]|ȵǜ@^}=ZsYuoGZ{NPd";1h ^)j&lc`l=خ:eb')GtBakkzdUxyVt WH}&]xsr?yKr~E _P*1r}rsy V+ c护~eo.㺙yaKT[R:'4J)"\RU|=~o6|)7[]x(DL ,?#;nJM>_>tRUT@ nK+ԓI37}TpP lT{p4g gxQpaK=D-l\]9+2zn9]K $ bm/P!4U!+,tyy0[!⬰vtgOhQHv .Wyn J}LM Me30I+h . 상rDjxcfV ˧'b'n{뜗NJ֪EK{{^3"HAMUMC=1Bv_!gSFt=0hUap&PОl&NeL]HVHaퟅ!_|x\ۆ" Ŕ4nW#%/&]j ^հ0=Ρ{:B~8W\8My4Z+ gn$U1-!,{m]{KLxm16C! ێA2N(Sé޿n xיwT}^k \7o}m""ٳ]Hs#~I@!F+ctT%oIf,e!u3ջG0BZ抧R:!%!3=*QRy5J ,5j! c{6 g&4jETB I3X. 6x+958<#vO{uXT@z6.Ю :^M>q\D獽Vm-'[_ "TxT`~c&5|1.z J.ˆ\ ]8N/4 ;GXuB9SoE 'TgSla|I򽞣` PNGr]ysطJcAǪS *:͎x}ijBA`ٛ&KNsz$,1@~@_G-ASGN"Uɐ[\)b|ya%Ȑ;CK:cz(`]'OO4Z4+)Cߪ`DPIi1c0&nW<۔MGj]QU= ~;knj9!( n'ɔ d.:`B'_]%, :&* ORU] 2 fP{ )%zv @,4(w^3I.|Tt pcّD6fPB.*vw' Vx+˄' B)HM& 5@{}y#nC;e.8v,V[Lߋ!qS2?CaH.qUߘ7/BG4HNKQ=C}PK]duTM6~=[*- /qbE;-vn$2\Ed76="ÙzƚxXg\ssDc-碣"ᕼݹ<ʽ5 ev_Z%O'k[ڿt]8c\[9UWc@+'f?_)zcW~wC6O@.RJ);Y.dB@(U#x;=~M%/{IC= HpB~$  Biā) &# ubRᷰs~USeڰz( K)\'Xlm^axy f%=; &o^(X$y1nؘ%gik*I5A)7<"k"V"O\ȭ8Y|QIehɉ f0M徜3a[.oۈu߬ yxsDOfgAxd%e$ $FZlsxBi]I޼wW ikcbN-ze[Do‹g`7螨*9YяM6 &M>+ȷg6ˊ M?]|~KQ_Z\>THMU{O1|kqH]Dma<_/#TW/(gQV,z"GO`JkK>D3lIdP5^jl@_H {0>se"f ~Z){y  /u>JmW#vs%l95> f?q(+dv[Dʋ&PkekuC Xe/=E`EYsGB\P < Cc %V::[_*d$m?mū;9"4BG!y g7@z8W9xπelAs*3s;o o Ҟ%ޙ鄸#-L>37DJbV{d0J7FDyp٪\̟A^ '7Іg>D?BَZ:ۨ.ϲ4&<`!GnXpn/h04[G%(t# am^f R\4~ܖqźAB\3!=[(,of;ES3 0՘6A?;sm=k9^("vlLSz-z.tx ܟzx6 [hN&O]*$_ٽvgQawժӎF `_Tv"7S~eL! <`iMik'jC6`@d8*Dž.kTAgahL|.Oh7urBlBuxYOeFQ왈$%wn'ᅬӓ%u^)c-)]^!v_PRMJSWCښ5Ķ 2pzC$7 "UIj |svGO| kWqJI9-bqOQ}Ȫ#hk6W5$]=rbC=[b2,H<;'$ 0(scVXg> :ӱ>E!sf6/iN ,<89``}gKjTpdLUV2r*Dc՝e(- ́yjg Lm%b $*툟iDզ"L.ٕf2b?|^ * aZf+H;<.fJWMqȰ9ګrzKRϵ)ϹDzkޒea+w r&,jI",8G&|1\81R>ɱ49?d='||LsH󜻨HhIs̮ͧ,.9y?7n`U){+ 3:}GJИ!XJ9| QߴيwثŜ]L_o^<}~Kۏ"Ӿr^e#:2ڂםl+.i=k:7!;xDO:-*~qbppc..ɂ 3K٫Nk<q^ L^PÖC(b3?Irh؃`f!aQ&]ؘcc V2Ȳ=&n):'('g^D~0't:GhɀD72kb! u9aZkAĢ+N6%gug1Q-V'T'oH$ n?,\PhOaeeʝva߷jGQduQL}I:1+pI75DKg:<1ۍ@P]ᆻ}|MKTSԕbU1@s@t 2_p6[㱠)Ԋ'b\_hDs*!ڴH}q¹0||-תbpXY 矆(+f2kPߞ:MewC};hhB1 s%;+<^}bpiai1Ռ/ݹ4vQވCCK֐Ȅ1\'hЃN}7C1#'i:rAo +_%|mSyTY%&e7BHDiм$Hm' OʹM~\/DΨg 7`?%P'#2>KIs*ב S{Il;z70,;W0?woUnjXe -P_i|5@u7炡 520)]My>z5O4 Ar\3& Ȱix cC$fدM=4ӂcq͡lNq~WJ&-??U~ v`f/yX%z϶i "TiPUz~p+0:uf&:% wb$Z:B 7 ;j vWjL6`PbgUDtyx{I:aol^UOk/Θ/D&މ.Π#RIxmY=)`V.Skg!WN$RpBL^~"vMK,ZlCXNuEVڇ"`5,],Z|0uUۨ0doQ_@jh1{{[.]&Ұ&hW;r(86D D"?VYgWB W7W?Ӗ6oZVepr=v$XAK tvS`a!%C 9fFU>wH87SL,4~0H8t1@1z:dz1/XݚE"nI;N}K/BP"{js5 jO'R%Dp'aWw'`r ݕeJ/Xc^H}oK$gFnxsk\=<}~Ex_'R&H&2mhnµ|`x~Z ֤9 ጪ\Ȣ,>с$FX J`p_H9T8kqA_>iڂ$6O9HxB0x9(\р_>.&b/G叟%kr&U=\zTrO f!?~%#-{/`c`upҙ4ÕE%CPߦۂw:DQ~×񷳂ғj;>Ha̵ϩQe peǦI'^_ Uhʊug\[,W_j^v*rXYU3;WS =.4ʕP[AmJ$jfǀyJAjx1m8Cn$|i^y#ɷ/2Y?ĿmHj0{ȴ$>QY(w&(U THnJC|mI&*5*hFCK Fz& 8p eLma閒|IRO*H4BC$rW\E㄀f6WU!b^݊>RriA7j C_8u㚆!?nx9^X{d/^bHbA#!^Պ]dQ)9/mЭgMr[Hf[Ew\G_o#\6ܿxC%dZz3~0e!W҆ qg~ʑ=$,rs;pfNڤKr|2bvk¬F=Fҍ90ꔆ Dt0pq2!A7?ģ'߅v2m5vtQ=J"rz WD 3U f<4?a;O ue:/92P}w,̯}9j]0M;vhc<*3V&iX:0p>ӿ"Skg;XC>JyL lkJKRh<4,Dj ؒH R<Ǒ{Ho@-G(.{%wdҵ3aUwkծ-']a^h} [(1zTxDT9c\@0tѼf2FU&q,WNzd zI*=[WaZ}* =N/f;Wl1q Rgp-D{nWoՖuWz⎓ˡܓl%?5/VTo^nQvUm($zhРӻ9VÊ+8lR;.=E. &ɴPW;J[L؅@ p<*+o!-tOHA7 wn0ѱ ŞF(Q$mDYj䜶ώukphƛe8N&;MVo%`ţ>šdd-QH=.f Dkg.^Uָ0CwޮnuC7h\uej08Z3X,??Lzs4․Pǒ#vS](H~KT\iK񑭽OK\Ļ*&ݤOVu½^Ԁ4]dt21!hsC]h(xdqãYa2 1;DW[{QHrgaa)rH'k{htIP| ﳍ^'iam%dAX# QN1913]2aSjU X-"T5 5lQ0 ؑGmH Ew8{0C_\tqMPhERtp%.+ <% eҴM#Ks#QrՉR1]r2WjOɁh:tpKٕEdoO$~ݮz"t-4J^HP7̀ʡ6ᄔI)߱ƊQo?`$U_96ԫ񑣱ں.pw]Y]g-O<#LholCwEm) :M{a%&;4^OCQj!KKSBIt>\IHZ4ѵ~ iKEyyXEj`غ{$fлnEՂTQW=%KZBٝYyuȘ7=3dPSM3O  <³C6yA 7aѾ0Iy1r,M@yyis.Z.@WS)FdfsravV V&"!܀v1/3fUV" /r33d[hilIжm[ y!NZ ЧVҕAT:>=@!3D$dė7ꔗTo㎛IChi-03CqIeMg;U1N*p A`sg 9E\2B/"{4X a(ee4=BbDBT|؂8[Mz"UU\MʄEeIADzJǯ:TbvU6dг:MYHm0utuh>vς83fgmB&^kda܅̃,)1+wA0ՀiRD5(L9Ni̽џZbJ2hujYkVGe gbE6LwnSf G<.>EB1=ū:Z +÷u6*&\.SoMH4Gj)IN[0JfkXvt;ՃbG-bW|̅viXeBZnL. RAaS03,fU ~zL{~PmgY~hfӝPQ__f0۵@x=BRjQ#K߶D,s0uD>2DbS`Iƨ"kvu1ZrL<pR LZc MȮA%,Rr0hRD+u+P'̂%Lx}&l0M$άs'M-s_1!4peo}oŗ1Pb_Ih.-0Q6GK9ͤau b[ ~ HR'kgZOvRe[|Gy= YRR^7TƹΑ%y-Gnq#GUP-J-BҼW_$;58R`nYc(J#ͧq싻oCv*F; ѢJ+};Nu|E* [3m:KztWžMj2zYH3-́0S! {y[d&TdGm&\O+i÷ikk3I鵒+OJTJь^DM$d PQv,j:-Fjg\=p$pDڞ-xUR(O^Oߔy=qԬgA:e DNO"`Žn@U,E:KRJ@%>S|,w!IM&Qe":3'QC`c=Ou~m{4VGˀ*f#I'S#xka6o/ΈQΠ67=B} 8(0|~mnc*tpsP1l+T3(믬<op(Uo忴Sa"p릐s_])Bk Pp8o-{Wxѯ+N>p! ~]TISl Zd-KcpٴdJ@/ߡ& Yyǂ὾( Wr`n.8MA Hː6f+`p;=bX75YVvSO~p l+-Ⱥ뱫j|-&C[IuWʼ@fNV8 KmL[շ!; &XFj 0T+߀ rg xr@?$3\hN_2/H}M60`)duzHU'bKZQ*ɯͭDݜcs JRv nLo߆{(ɫi)8+qܟYX/qMuqL>`/  @dAǏ/mAߧa5UX\@:X7'MR7o[D|ˀnçNn)!oH9᎙*BT[3ۂe,3Jf/Ih~7&F= uo $CAw8__3[!*oϕ7&Ytb? x|wG"97 aD8V0X(~xf,]Z'CunX.xi~̀6T7u7yQVj &4rnոAs>!igi>EX5G$j΍Uud;@Ӯ5ϯo23GՔ% v.k'Z\#FX_PeI]ù+b":H#w6 }F3(MC1 _σʹ3K&%ŢYM*U!W `<~U͐tVeh=bş,2.3cʸOМ6Wio㐲a901B*1LJ4V|UEk%JK\X_34{/R+r:>kr.dUGx In )TۥyG+)63L7/9!̵"-1Me}^q~5) &5F+SWI{m2"B즜9+cȜ>’9;"ҁcg$)*kZChrV gn;y%@#9}?쭴/`bf ypH376 ee=hUE"ZJO- 3@yZ{ ‚0u[_ ?dWpXoFQI@}ok8R̺Ж䑻bAtX!*LpBC$cX1=`7fDOTS $(`):ҚN_K{~5R52r:n`+G<Ɲ>(Ί-˄ [M @fܕ5K<(Cot[]dg (vZ3Q {e^=f`73 ULƂ'IHcKJTRbc'Keu-zn}OW_*[K%q`ҡzWȮw2ғް |!,RcњS7qsޯDB[+&9Ute_R  fK >IъRZ9YPڎ.oo#VKe"SC\Q*fY7f&x"|Ǵ;6}/{-b)b^faRqħZaL@"Q YѨa}G=Г?c*6E l5ͲC/l:)TcRǷ,v0czj]+L9rZ ghLrk fHr= 'j6sjxd&,?^hF&ys>ۥ4ܩ\&ih`5{jeyEY%ܫ42'X!$ݞ  ݺ?i<J* ?J|qЂ}x[쉍-q0ڬ :H'f~ ReU FE8> 6spۓ ܛ,/ <8}9_: v<,,걬 Zv|L lk] ;nBGszdMkA?YH<YL/U <lZT.J<d?nMî긲4g(WeNHQ+{rfm~?ǚ>c'?u0zn8&>iWIF9¤˰"B8&3 벴i)qÍ.z%l>xrg<9ʵGM Q//7W/4kuwSx\ӭ)IT>3,9)=:h@UN-NKn7ȝi헙FJ\.mp=k XNN?!Jp݊wug CiCVCKlLǽ6 -ӰOfFרkKRvPq~I CР}cM^+$wAzXy &3c٫?=%]X>rS% ^<~d^tP48ur\j)Y\\~G[it8bc&wjIAu#]*0ψHbb*gagFFpΕ]z7ͪn?<1l{dj|)]ea<˯kiYSVdd/߾`r<iꐏnHSJ81Z\N̖*&ILR!;ys_e0s9ukSr垩 .{L xK%ir O/Ie*^QmVuU3|Aܮl*ZG(y*f\vdI`3Aig]ů_rt7njqCPX 7oj[V-Uu7L^op82ʁ3S y\m->"}w10#[lw[zoahY9"þL98fM?pt(d9v(AeHlU-a5!z>Nc~,Pjhō+&WD?Oq ԧOA CbnD['auᣪ7Ԁb+RHg.ᄀ℅7yvwJ/~8Hԁ1(Kݦh/N sf 7Sʵ,uؘ!Yj&ذ&sbļ%aNo_Fwxci g*S|`Hd;D˯tuۈ]&(D-Jᐵg:k$Ze6P8+MlYHy$x(^ǧd}3inymZ)-ZvU @`&ǯhi+w{o:B] ƕ|УP@L ;DScS-9ղrwK+V9_? i^t(#c6^ͻ+RARrPlte,㡡 q)툟~$ }sg[@`'Uݢvy02T?6yu:v%f 3EQ&['[dTu8BE+H>*RspnhBQјqC(,*~2DKbWWe>+~2J?plOr"Skb :>$"lfz\wފ9C+EdM1^zobg ǿ%}KS"!ܹtrtEbXt:Gyp9?аq\ZœmpSCKM9l.f/hМ=i\!Հ[Dc#B&ʉw;ExJjY*g%=>ca;tuUpWPb`|騫9ed8CTcmvZW=hW)V;$x<ix_wG*1oUfk4g@-zsG zb99XA<Yכ|4|$|LtH~n˓ Jucl,失)A2 0ѱ0.~˰Մ}0Ⱥ4)r0CHqfA.(SquP7*1G@S"\x"=^$whE0㼗)}q-O;| !tR5G?ϲQm' Rk>U_3B9AK)\驑 ǻMIvadKC{Gy#y7qwA)7µb=@zSQ{VXb~!8Z8J| P2Jq:RlFi [/ZIERDI7-#y}w~ّ{J9$Q.aG'hi*r1wKYuw4H0tZ2h+3LՔ^kq}$kv J{g`p_5-eV 1k\p-]p W1$lIVVH+4hiV{yv΄PUeUl^ZxbySH6ٍƓD R2+"B&pGlxA*4;1h{\ W]zfnvsO'z;-7kT5cDG+n޼Tqb<_^JFhbc(!CG`}bLWFx|XAD[$Rg"n ƣ?edhFΔxFi *`Apk'F%}WfJjрŘr.^K|Þ XpYVh|OF^%ymH DT L+p$u3턢EZ~8x)wH7Rn _}:Ҕ56P>ut ;x4ӶWezr7V;zW3$)?+w @zǙŠ㚍P3EB:=3Q2Vz\"6'ip_UHp fLc{>ng5M7^yotˀ&GD6Jrbdwe%Ly6pdk^jgl#`Ψh{IQⳤɉ}+omG|*|.wyow 3?*1'4=|J4YRO b ;3jX)]F[,jUҦ*؉aK@p,wI(m0OkѳەMlnS6ylvb} `*l%ٜ'`EK[1 % :/=+)Z=&URH02Al3qji6ry~Sxߠ6JV/`u9-CK5viR?&[0ȳ.u}ؙ|iBb6ǿX;1nTD.asab\h2Y)LJepd継Qы>Zj1+=2?S&m0ң% [žg|L|(&]d7g9y褮ȨXMJXPtsfC rRiu_ 'Y/W?DƇc,)U_ y\ b> A=ƶվl:ųE%}[ Y¢\Us' π)7[p]7 @#$ U\q^[Er,[[ :HRsXN @se@w10~wPb9qfntGͭQ#x[!2-ћp%4gW$YU"ί tr7aW',C2ԁ6ؘKǎ['D"CyP"O}.FgK'}v@q}$^֬%,Ye#AxV_'8y<^A?-Ǻcp=&+N`"((ayK3=k4WpР;>M'#UrzFX=l&$lۍl}=A(˲tK}ba/ĴhŸ}[ el1fKa0sCNwd:Re7gucvN:CMd:]TZw\=H*.#f_YH*&#0binQ[}mā|"_F6eƱ}I.0Kf/.d Ò7U).Eic]{ZC-u}we37ō_t8PVam BKs U1wif什B(IO.xoo\X8N+D\pI݊ j ӍnnOj/V@< z+|%zpnt=o a Gﺔ3¦;ZךW_0'znѩmHwl9%HH IDhR1d?fhY$N `z?qp r4Q=hd3KLHL8sN\^ߩކxٯ9 CߍC.όad է9h: m|K D?1/=3&V8̸gHL㞲h0.ttjwor JE~*0͠9ֵ"eZ ֲ *{gdb"]9 | /p(:ֺ3aٶޣ) J{ p<@ k֗YE9Ԛ i7.$}q4 H:|<>^~Kv|C"xk ${ud2-#^LWTߔ".vv3!Fzt`1X_$J{VuhE7+|ڍ=g򈲲x'v))&^oaH8P>Cxd#AwQ7-cN!2'aHm 'RT7LW\;1wM87*=ɍ%S"ne"=ućҼh0uaıQUd߉R+P\ z&d郓ذJG3`o$ǿG7rc $3:~l\LY9#^8 /IرBdr q)ܲlQ'oQۉ磖e.ُXSGݐ_ /+hf{yR;ryנr"6&37[$W(GEoS-/ ;vY_h c:EָQ+^OPa̸,HF*}ҥbԖ0uMQ]fQ֥zZ@i3I|举+ Q﷓[&xg,R5qF:P:֢ę!L'GXgu*~~;ܒ6|@Hǫ-j~0FT3e-'(Cu% `XlK$ab:˴3#Ԍ"eق%;$G[ 5ʹ\+lO? Y"M&|g/!ELBpaZQT߅P?~<ܮZJX?5k·wj=^}m-[d{gȖN!*>[#kI [V S+?{#^:j=ȬWOm}K񝁌0|r= ûWs~ CEQAtxOeٓj `gp0 ,-G:oĿؔz5{}RGSMOeVms*0F c>oL=zՄ<`<‡@WՓR<9 ?nzTaL0oX;|8HދZD\T10 ǤM (D~_'2Dzur)RIy?獘΃2;D@d;n#.p7'Ok/:ͪu̞}]T.>}sևvo17#IbGFf>W} FnzhVv!9i(%gNlFr7ʹq.aCbWn-Km51*!)T6ƨ'-lT'>Eho@q[(Mi՜W-W %Ɯ /ΖH3+P*o#2' ȏԧܬ>29=^ C"f0hTYx 2p~_3UE+jr 1¾% {U{@xcpfC5|R̐e[Dʿ l > v@6vOrӍҴB72@$+HEYO@u5sq:[jU9^}>m5x?E0,~MNC 1z9GWwg^ ̠rS8'X.;'uKvO y3n <]䖡P{b?N-V3,\dX}S{۷MF%4s8#'jD As.Gu5qJO-e8qNt[E˽Xd  #)S^[n#H2U"&Mϱb,LiirjV6afif~uL]IE\c2127uJjrC ܋+@zce'c:s=ϖ {9¯Ap37?&EKv=+m k#"pH$W鏗P5H0tg ŗo| !Erc;&n҉UZH4%z%m6́oϪ22ݥXt8R nRX8Ar]rIwtMʻHKY{)- Ahf&USO$J:[{(S.L|IC6v_1Uf6m]dk K$y,NYuajAsVcUn lZ>L0A>dQj ^O^– j aUgJ{|(/ƅ..Qo. $Fè2Rf/rt HB(ǰO;hDe1h^oNZ877vxdI{ 3|njẏȼ*~>Xb:H_1^֡ǝo/l/ `4D'Egg.|ڊwi0qeFؔ"܂,@A:(y A͋"4C<^`q3@q0Ix0]Nip|$ ,MSDowB2ftyI5?jN <_ꋮjMH`d T{gfl<74lxɈr7 REw6}ړM'+`֔Q&gǚs i?j3? 0D"4wqװzhEWt/4Ùlq++~nI `Ѣ%~NiT]a|v@{6hd@B0J?H1u24eb륮¦ຣƋۚi! ZFd/fnI+^aA5!5܀Y?o Tgehs2Gpdmtrrlߏhr֊Grf{5CzԻ6j)&UJ<NW!*Oiږ,ywCl=S&/*h߃%u1V`猉`Lw!ؤП:JZK.2BeN 'k@Cڋc` wG偋JAி>a b@QN}:U>$ܢgB~,[P~/V塳vhұP$R"*B4xIۋ뚚OEf98~#F./GI"RT n9vzT{C) g|Za:c`/5!+ΗY: F?&޼X&SoER"ۇzvlQjBsP)wGsڜO_<8yy" @763bRۑaeyEHl.Hp3){$ OYLm|9%dN^ }oY/_9[ה1B$BܐՙDO*}.~+H*DzIThj_0BB3ӌᏀUs^s<2s ʠ el =vzG+<)'dj"[Q&<ЇEmSO1ÿt APiMsZҘY"}"ȫ#Xdk$' LսwD%AZEe$RBx>GI_HsLQB\8/). Azr7+Srw}Ljp\42Sn&K]Z}=E&z&uWG7l-) ݆}-c8e VY7~\U+A.]~9Nv4֖!UIbqHC| 2B?