summaryrefslogtreecommitdiffstats
path: root/src/engine/SCons/Tool/msvsTests.py
blob: 4343521124fd9a7493edc2469d48856c72cd65e3 (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
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
#
# __COPYRIGHT__
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#

__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"

import os
import string
import sys
import TestCmd
import unittest

from SCons.Tool.msvs import *
import SCons.Util
import SCons.Warnings

regdata_6a = string.split(r'''[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio]
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0]
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\ServicePacks]
"sp3"=""
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\Setup]
"VsCommonDir"="C:\Program Files\Microsoft Visual Studio\Common"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\Setup\Microsoft Developer Network Library - Visual Studio 6.0a]
"ProductDir"="C:\Program Files\Microsoft Visual Studio\MSDN98\98VSa\1033"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\Setup\Microsoft Visual C++]
"ProductDir"="C:\Program Files\Microsoft Visual Studio\VC98"
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion]
"ProgramFilesDir"="C:\Program Files"
"CommonFilesDir"="C:\Program Files\Common Files"
"MediaPath"="C:\WINDOWS\Media"
''','\n')

regdata_6b = string.split(r'''[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio]
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0]
"InstallDir"="C:\VS6\Common\IDE\IDE98"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\ServicePacks]
"sp5"=""
"latest"=dword:00000005
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\Setup]
"VsCommonDir"="C:\VS6\Common"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\Setup\Microsoft Visual Basic]
"ProductDir"="C:\VS6\VB98"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\Setup\Microsoft Visual C++]
"ProductDir"="C:\VS6\VC98"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\Setup\Microsoft Visual Studio]
"ProductDir"="C:\VS6"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\Setup\Microsoft VSEE Client]
"ProductDir"="C:\VS6\Common\Tools"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\Setup\Visual Studio 98]
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion]
"ProgramFilesDir"="C:\Program Files"
"CommonFilesDir"="C:\Program Files\Common Files"
"MediaPath"="C:\WINDOWS\Media"
''','\n')

regdata_7 = string.split(r'''
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0]
"InstallDir"="C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\"
"Source Directories"="C:\Program Files\Microsoft Visual Studio .NET\Vc7\crt\;C:\Program Files\Microsoft Visual Studio .NET\Vc7\atlmfc\src\mfc\;C:\Program Files\Microsoft Visual Studio .NET\Vc7\atlmfc\src\atl\"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\InstalledProducts]
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\InstalledProducts\CrystalReports]
@="#15007"
"Package"="{F05E92C6-8346-11D3-B4AD-00A0C9B04E7B}"
"ProductDetails"="#15009"
"LogoID"="0"
"PID"="#15008"
"UseInterface"=dword:00000001
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\InstalledProducts\Visual Basic.NET]
@=""
"DefaultProductAttribute"="VB"
"Package"="{164B10B9-B200-11D0-8C61-00A0C91E29D5}"
"UseInterface"=dword:00000001
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\InstalledProducts\Visual C#]
@=""
"Package"="{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}"
"UseInterface"=dword:00000001
"DefaultProductAttribute"="C#"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\InstalledProducts\VisualC++]
"UseInterface"=dword:00000001
"Package"="{F1C25864-3097-11D2-A5C5-00C04F7968B4}"
"DefaultProductAttribute"="VC"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup]
"Dbghelp_path"="C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\"
"dw_dir"="C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\MSDN]
"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET\Msdn\1033\"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\Servicing\SKU]
"Visual Studio .NET Professional - English"="{D0610409-7D65-11D5-A54F-0090278A1BB8}"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\VB]
"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET\Vb7\"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\VC]
"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET\Vc7\"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\VC#]
"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET\VC#\"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\Visual Studio .NET Professional - English]
"InstallSuccess"=dword:00000001
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\VS]
"EnvironmentDirectory"="C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\"
"EnvironmentPath"="C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\devenv.exe"
"VS7EnvironmentLocation"="C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\devenv.exe"
"MSMDir"="C:\Program Files\Common Files\Merge Modules\"
"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET\"
"VS7CommonBinDir"="C:\Program Files\Microsoft Visual Studio .NET\Common7\Tools\"
"VS7CommonDir"="C:\Program Files\Microsoft Visual Studio .NET\Common7\"
"VSUpdateDir"="C:\Program Files\Microsoft Visual Studio .NET\Setup\VSUpdate\"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\VS\BuildNumber]
"1033"="7.0.9466"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\VS\Pro]
"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET\"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\VC]
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\VC\VC_OBJECTS_PLATFORM_INFO]
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\VC\VC_OBJECTS_PLATFORM_INFO\Win32]
@="{A54AAE91-30C2-11D3-87BF-A04A4CC10000}"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\VC\VC_OBJECTS_PLATFORM_INFO\Win32\Directories]
"Path Dirs"="$(VCInstallDir)bin;$(VSInstallDir)Common7\Tools\bin\prerelease;$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;C:\Program Files\HTML Help Workshop\;$(FrameworkSDKDir)bin;$(FrameworkDir)$(FrameworkVersion);C:\perl\bin;C:\cygwin\bin;c:\cygwin\usr\bin;C:\bin;C:\program files\perforce;C:\cygwin\usr\local\bin\i686-pc-cygwin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem"
"Library Dirs"="$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(VCInstallDir)PlatformSDK\lib\prerelease;$(VCInstallDir)PlatformSDK\lib;$(FrameworkSDKDir)lib"
"Include Dirs"="$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(VCInstallDir)PlatformSDK\include\prerelease;$(VCInstallDir)PlatformSDK\include;$(FrameworkSDKDir)include"
"Source Dirs"="$(VCInstallDir)atlmfc\src\mfc;$(VCInstallDir)atlmfc\src\atl;$(VCInstallDir)crt\src"
"Reference Dirs"=""
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion]
"ProgramFilesDir"="C:\Program Files"
"CommonFilesDir"="C:\Program Files\Common Files"
"MediaPath"="C:\WINDOWS\Media"
''','\n')

regdata_67 = string.split(r'''
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0]
"InstallDir"="C:\VS6\Common\IDE\IDE98"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\ServicePacks]
"sp5"=""
"latest"=dword:00000005
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\Setup]
"VsCommonDir"="C:\VS6\Common"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\Setup\Microsoft Visual Basic]
"ProductDir"="C:\VS6\VB98"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\Setup\Microsoft Visual C++]
"ProductDir"="C:\VS6\VC98"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\Setup\Microsoft Visual Studio]
"ProductDir"="C:\VS6"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\Setup\Microsoft VSEE Client]
"ProductDir"="C:\VS6\Common\Tools"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\Setup\Visual Studio 98]
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0]
"InstallDir"="C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\"
"Source Directories"="C:\Program Files\Microsoft Visual Studio .NET\Vc7\crt\;C:\Program Files\Microsoft Visual Studio .NET\Vc7\atlmfc\src\mfc\;C:\Program Files\Microsoft Visual Studio .NET\Vc7\atlmfc\src\atl\"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\InstalledProducts]
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\InstalledProducts\CrystalReports]
@="#15007"
"Package"="{F05E92C6-8346-11D3-B4AD-00A0C9B04E7B}"
"ProductDetails"="#15009"
"LogoID"="0"
"PID"="#15008"
"UseInterface"=dword:00000001
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\InstalledProducts\Visual Basic.NET]
@=""
"DefaultProductAttribute"="VB"
"Package"="{164B10B9-B200-11D0-8C61-00A0C91E29D5}"
"UseInterface"=dword:00000001
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\InstalledProducts\Visual C#]
@=""
"Package"="{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}"
"UseInterface"=dword:00000001
"DefaultProductAttribute"="C#"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\InstalledProducts\VisualC++]
"UseInterface"=dword:00000001
"Package"="{F1C25864-3097-11D2-A5C5-00C04F7968B4}"
"DefaultProductAttribute"="VC"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup]
"Dbghelp_path"="C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\"
"dw_dir"="C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\MSDN]
"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET\Msdn\1033\"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\Servicing\SKU]
"Visual Studio .NET Professional - English"="{D0610409-7D65-11D5-A54F-0090278A1BB8}"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\VB]
"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET\Vb7\"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\VC]
"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET\Vc7\"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\VC#]
"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET\VC#\"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\Visual Studio .NET Professional - English]
"InstallSuccess"=dword:00000001
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\VS]
"EnvironmentDirectory"="C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\"
"EnvironmentPath"="C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\devenv.exe"
"VS7EnvironmentLocation"="C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\devenv.exe"
"MSMDir"="C:\Program Files\Common Files\Merge Modules\"
"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET\"
"VS7CommonBinDir"="C:\Program Files\Microsoft Visual Studio .NET\Common7\Tools\"
"VS7CommonDir"="C:\Program Files\Microsoft Visual Studio .NET\Common7\"
"VSUpdateDir"="C:\Program Files\Microsoft Visual Studio .NET\Setup\VSUpdate\"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\VS\BuildNumber]
"1033"="7.0.9466"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\VS\Pro]
"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET\"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\VC]
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\VC\VC_OBJECTS_PLATFORM_INFO]
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\VC\VC_OBJECTS_PLATFORM_INFO\Win32]
@="{A54AAE91-30C2-11D3-87BF-A04A4CC10000}"
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\VC\VC_OBJECTS_PLATFORM_INFO\Win32\Directories]
"Path Dirs"="$(VCInstallDir)bin;$(VSInstallDir)Common7\Tools\bin\prerelease;$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;C:\Program Files\HTML Help Workshop\;$(FrameworkSDKDir)bin;$(FrameworkDir)$(FrameworkVersion);C:\perl\bin;C:\cygwin\bin;c:\cygwin\usr\bin;C:\bin;C:\program files\perforce;C:\cygwin\usr\local\bin\i686-pc-cygwin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem"
"Library Dirs"="$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(VCInstallDir)PlatformSDK\lib\prerelease;$(VCInstallDir)PlatformSDK\lib;$(FrameworkSDKDir)lib"
"Include Dirs"="$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(VCInstallDir)PlatformSDK\include\prerelease;$(VCInstallDir)PlatformSDK\include;$(FrameworkSDKDir)include"
"Source Dirs"="$(VCInstallDir)atlmfc\src\mfc;$(VCInstallDir)atlmfc\src\atl;$(VCInstallDir)crt\src"
"Reference Dirs"=""
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion]
"ProgramFilesDir"="C:\Program Files"
"CommonFilesDir"="C:\Program Files\Common Files"
"MediaPath"="C:\WINDOWS\Media"
''','\n')

regdata_none = []

class DummyEnv:
    def __init__(self, dict=None):
        if dict:
            self.dict = dict
        else:
            self.dict = {}

    def Dictionary(self, key = None):
        if not key:
            return self.dict
        return self.dict[key]

    def __setitem__(self,key,value):
        self.dict[key] = value

    def __getitem__(self,key):
        return self.dict[key]

    def has_key(self,name):
        return self.dict.has_key(name)

class RegKey:
    """key class for storing an 'open' registry key"""
    def __init__(self,key):
        self.key = key

class RegNode:
    """node in the dummy registry"""
    def __init__(self,name):
        self.valdict = {}
        self.keydict = {}
        self.keyarray = []
        self.valarray = []
        self.name = name

    def value(self,val):
        if self.valdict.has_key(val):
            return (self.valdict[val],1)
        else:
            raise SCons.Util.RegError
    
    def addValue(self,name,val):
        self.valdict[name] = val
        self.valarray.append(name)

    def valindex(self,index):
        rv = None
        try:
            rv = (self.valarray[index],self.valdict[self.valarray[index]],1)
        except KeyError:
            raise SCons.Util.RegError
        return rv

    def key(self,key,sep = '\\'):
        if key.find(sep) != -1:
            keyname, subkeys = key.split(sep,1)
        else:
            keyname = key
            subkeys = ""
        try:
            # recurse, and return the lowest level key node
            if subkeys:
                return self.keydict[keyname].key(subkeys)
            else:
                return self.keydict[keyname]
        except KeyError:
            raise SCons.Util.RegError

    def addKey(self,name,sep = '\\'):
        if name.find(sep) != -1:
            keyname, subkeys = name.split(sep,1)
        else:
            keyname = name
            subkeys = ""

        if not self.keydict.has_key(keyname):       
            self.keydict[keyname] = RegNode(keyname)
            self.keyarray.append(keyname)

        # recurse, and return the lowest level key node
        if subkeys:
            return self.keydict[keyname].addKey(subkeys)
        else:
            return self.keydict[keyname]

    def keyindex(self,index):
        return self.keydict[self.keyarray[index]]

    def __str__(self):
        return self._doStr()

    def _doStr(self, indent = ''):
        rv = ""
        for value in self.valarray:
            rv = rv + '%s"%s" = "%s"\n' % (indent, value, self.valdict[value])
        for key in self.keyarray:
            rv = rv + "%s%s: {\n"%(indent, key)
            rv = rv + self.keydict[key]._doStr(indent + '  ')
            rv = rv + indent + '}\n'
        return rv

class DummyRegistry:
    """registry class for storing fake registry attributes"""
    def __init__(self,data):
        """parse input data into the fake registry"""
        self.root = RegNode('REGISTRY')
        self.root.addKey('HKEY_LOCAL_MACHINE')
        self.root.addKey('HKEY_CURRENT_USER')
        self.root.addKey('HKEY_USERS')
        self.root.addKey('HKEY_CLASSES_ROOT')
        
        self.parse(data)
        
    def parse(self, data):
        parent = self.root
        keymatch = re.compile('^\[(.*)\]$')
        valmatch = re.compile('^(?:"(.*)"|[@])="(.*)"$')
        for line in data:
            m1 = keymatch.match(line)
            if m1:
                # add a key, set it to current parent
                parent = self.root.addKey(m1.group(1))
            else:
                m2 = valmatch.match(line)
                if m2:
                    parent.addValue(m2.group(1),m2.group(2))

    def OpenKeyEx(self,root,key):
        if root == SCons.Util.HKEY_CLASSES_ROOT:
            mykey = 'HKEY_CLASSES_ROOT\\' + key
        if root == SCons.Util.HKEY_USERS:
            mykey = 'HKEY_USERS\\' + key
        if root == SCons.Util.HKEY_CURRENT_USER:
            mykey = 'HKEY_CURRENT_USER\\' + key
        if root == SCons.Util.HKEY_LOCAL_MACHINE:
            mykey = 'HKEY_LOCAL_MACHINE\\' + key
        #print "Open Key",mykey
        return self.root.key(mykey)
        
def DummyOpenKeyEx(root, key):
    return registry.OpenKeyEx(root,key)

def DummyEnumKey(key, index):
    rv = None
    try:
        rv = key.keyarray[index]
    except IndexError:
        raise SCons.Util.RegError
#    print "Enum Key",key.name,"[",index,"] =>",rv
    return rv

def DummyEnumValue(key, index):
    rv = key.valindex(index)
#    print "Enum Value",key.name,"[",index,"] =>",rv
    return rv

def DummyQueryValue(key, value):
    rv = key.value(value)
#    print "Query Value",key.name+"\\"+value,"=>",rv
    return rv

def DummyExists(path):
    return 1

class msvsTestCase(unittest.TestCase):
    def test_get_default_visual_studio_version(self):
        """Test retrieval of the default visual studio version"""
        env = DummyEnv()
        v1 = get_default_visualstudio_version(env)
        assert env['MSVS_VERSION'] == default_version
        assert env['MSVS']['VERSION'] == default_version
        assert v1 == default_version

        env = DummyEnv({'MSVS_VERSION':'7.0'})
        v2 = get_default_visualstudio_version(env)
        assert env['MSVS_VERSION'] == '7.0'
        assert env['MSVS']['VERSION'] == '7.0'
        assert v2 == '7.0'

    def test_get_visual_studio_versions(self):
        """Test retrieval of the list of visual studio versions"""
        v1 = get_visualstudio_versions()
        assert not v1 or v1[0] == highest_version
        assert len(v1) == number_of_versions

    def test_get_msvs_install_dirs(self):
        """Test retrieval of the list of visual studio installed locations"""
        v1 = get_msvs_install_dirs()
        v2 = get_msvs_install_dirs('7.0')
        assert v1 == install_location1
        assert v2 == install_location2
        
if __name__ == "__main__":

    # only makes sense to test this on win32
    if sys.platform != 'win32':
        sys.exit(0)
    
    SCons.Util.RegOpenKeyEx = DummyOpenKeyEx
    SCons.Util.RegEnumKey = DummyEnumKey
    SCons.Util.RegEnumValue = DummyEnumValue
    SCons.Util.RegQueryValueEx = DummyQueryValue
    os.path.exists = DummyExists # make sure all files exist :-)

    # try it for each possible setup.
    suite = unittest.makeSuite(msvsTestCase, 'test_')
    registry = DummyRegistry(regdata_6a)
    default_version = '6.0'
    highest_version = '6.0'
    number_of_versions = 1
    install_location1 = {'VSINSTALLDIR': 'C:\\Program Files\\Microsoft Visual Studio', 'VCINSTALLDIR': 'C:\\Program Files\\Microsoft Visual Studio\\VC98'}
    install_location2 = {}
    print "Test MSVS 6 Registry"
    # print str(registry.root)
    if not unittest.TextTestRunner().run(suite).wasSuccessful():
	sys.exit(1)

    registry = DummyRegistry(regdata_6b)
    default_version = '6.0'
    highest_version = '6.0'
    number_of_versions = 1
    install_location1 = {'VSINSTALLDIR': 'C:\\VS6', 'VCINSTALLDIR': 'C:\\VS6\\VC98'}
    install_location2 = {}        
    print "Test Other MSVS 6 Registry"
    # print str(registry.root)
    if not unittest.TextTestRunner().run(suite).wasSuccessful():
	sys.exit(1)

    registry = DummyRegistry(regdata_67)
    default_version = '7.0'
    highest_version = '7.0'
    number_of_versions = 2
    install_location1 = {'VSINSTALLDIR': 'C:\\Program Files\\Microsoft Visual Studio .NET\\', 'VCINSTALLDIR': 'C:\\Program Files\\Microsoft Visual Studio .NET\\Vc7\\'}
    install_location2 = {'VSINSTALLDIR': 'C:\\Program Files\\Microsoft Visual Studio .NET\\', 'VCINSTALLDIR': 'C:\\Program Files\\Microsoft Visual Studio .NET\\Vc7\\'}
    # print str(registry.root)
    print "Test MSVS 6 & 7 Registry"
    if not unittest.TextTestRunner().run(suite).wasSuccessful():
	sys.exit(1)

    registry = DummyRegistry(regdata_7)
    default_version = '7.0'
    highest_version = '7.0'
    number_of_versions = 1
    install_location1 = {'VSINSTALLDIR': 'C:\\Program Files\\Microsoft Visual Studio .NET\\', 'VCINSTALLDIR': 'C:\\Program Files\\Microsoft Visual Studio .NET\\Vc7\\'}
    install_location2 = {'VSINSTALLDIR': 'C:\\Program Files\\Microsoft Visual Studio .NET\\', 'VCINSTALLDIR': 'C:\\Program Files\\Microsoft Visual Studio .NET\\Vc7\\'}
    # print str(registry.root)
    print "Test MSVS 7 Registry"
    if not unittest.TextTestRunner().run(suite).wasSuccessful():
	sys.exit(1)

    registry = DummyRegistry(regdata_none)
    default_version = '6.0'
    highest_version = None
    number_of_versions = 0
    install_location1 = {}
    install_location2 = {}
    # print str(registry.root)
    print "Test Empty Registry"
    if not unittest.TextTestRunner().run(suite).wasSuccessful():
	sys.exit(1)
1 Lb%W1Y(lnp 1X){ۃB.TČȺZI^Jׂ S|cW^ll:Z\9c{:\ vE -eCC%Ju A: @5(G r.Phڪ&qCce1(j0!=Ș">SH8! &>,Pά8:XtAܟylܞ ~AzHGs 2n @+?O-ܺ#pCnT 7X) ͟2 LoL[" aYV?h/wR5QE+]ޘWꝠdsX"L#~jdBW}p&:~st8ʀ| 51/<xr#6z{>(psoݒ˹/r{yb< Qj9~p|Ǭ|x;^sLdD؃"G!6w 5EsKɡsVɳ=ľ{Cią-#5(s2P: UY7!!ߚ8 arS#Jd$g4+!/CwJw uef I#H %M!W=3yC.D9/` V{.G#aL1Jvk&,)–ϥTâ%Ɇ]ŷ-+PnuIMr`wCjSos\fsO2tImTU*Ί=!𲗶kM 1$hstT\N ZAv9W$^t_gbUo*&6S@=Ѩ Z*"ZOHNBE' 7ބ"dΐmPۿsϺZ炔%^fOb0s#HRaar&!2:ѡqTΐգsJK!~K)@"ck#am*"Ỵ 2 Đ0E-i&G@70 ]8hG8#ާ~K_]Vr/5*?~84庫]!{(N0KAulBKBz}]W2d FUfid `P'hUO9f󼲾(ꄂ+@K@Z cC>~^7(QT;~Lu Yo:(ACĂ=>_G_v(X:)ܐi%K>/ K y!6XPZ7J؈( u]u6Ն bǗHi1GhWAK21R`sY.WNKNN)y:_a!30Zjl o xq[PsPn<`.")'MƢ;5{D;ȥ6"O2! ,8&sUӨưFC]y;&WM8 M\@>LwKʻCG' EADJB0EMA" Hns{nFN"3k258$GU '^WDhV{#jg{i3 9p:tjK<%*8V֥λuQgBK_G My#M -cxRYb.jj'<_DSnd}\6z5W L-ZaYAɂw-M>WX'3hFƹBk A^H68hL˅R}2m0^Щ󑽛ȨN%o &C+r(D<j7 l$8aJ9ɉBdCˆIF ?nYt@.Bֱa-04C*0mӭ¯, 3CGx@7ۦ> /tp'OY@Voɟ~7MkW "d gMK΋BhB`eG>C.4 / I<"@%+zzAs~K^VD%`ɗp^#bDx ý^"~K!51c,c#Dpuڜ8[CQ4WAt WնœڂG5`=6⁔w꩸="qv0QЌWcNp)zaD |!:t>&(B$!$ Dr9frwC_x,d7DtJhSPouka35wx_ !XlN) HXws[奓DB]'5^c1td4,\Lwg 'lprGyߊEQMYfʿr?P~Gd8C]B6tg=:'#8D5p"(BT?LYcg6q4f >h{AWC`us=^~^ 4D)a%0ǮRkيT6FƘ&a@̣B2#xtҬw>jz "b {7o(ECFF1=Dq}^(6@o u`M)rhJ !)aDyBKٔATe1` #(htXmyG(H$Q/i?dY8` |18b?z=HHL >C#Č|d}pG.a e@Rg2vnK1'15saOb'Yid]|TdHj4NSqhSIL[Ԛ8(HvD\, x2ĤoW ^)<"~VˈA6ktD/$.5E!.z %wKQU0;a9` _E*@$ZDgŔ6wEZ94hg꟒0a_˶ U&$j\,A8 %BOyW Q5DLbhwfۼO&|t@%E80h: Οd؂3A(glzrxJP-2dQM)iC3zaO , 8!w0B: 'ے}c; 0,P s?/At% SyƞNb3=gm9ìrƪ< S$} }ו a P0V oN`ڴ?5Hc!(/!!t D gaXk !3߅jŀNtFjyթNYy.Tގ [1Pzӎ (B .'a=$ԅ'eƌhܣ@FO"R+(높(]SQ%m_!_5{!8~} :SWD zyq/饺87^.tH )38ch~d:(@aíHI$H,64!  HH܀۶clfe*0>cIh쀠}z?sM=p4ɽ1R"H"AJPct. 0>}bQ};0 ̦(Z@LLnÂSF#DatrHzC%?1"P]uztso.w8O0ʍlcKYIU2t`F/tn+DD`i!{% r9.yJ+/ E~KR)XFb$wM)>Z6^?_!v܇ZTs0F*UX1(ֹJӬ*m1 LN4X6c( s ' Y(ݭ5T,KY;,GvWPMQHpFTifC34<2&ƚY5YP!kRddj~16[ւi0#A@UZ'!r*)qR D FÆ16giW4@NL"1>h cc0kT 2l@/@.4"X& c)l`zHc\n ׶Fސ(@ߠplo9yD^$QcV%Ę*`)gh=\6 p);$ $e #t OM~܂0d0A$羢Txp*}\#!qd ( %40-kU0H5j"CPnAQb! IQADCT&KQ"$@)BUJ$C( D4+PC"c.CC@%Da(d4!J(6DʑRJbBRЅ"TP L?.@z9=z(@d--C `D8X Ap B`xi_@CD!Riq0יǚKg=*Aؐry&"a"UdB=!J%,Ą/ x. g8jq(b 3*0Ɯj#&r{X=(הH,CI"8CMEZ]dn t" |hGA뇧h`S@RQ,}i6DEMJ@TOw{^W2wcT+"ӏ MMpd)e VO p]Ju4=*! BX"ZP  "& BU(D1@ na#/*q r =BG:̀zPL,JDgf:Cvzp BE;^W kҧ OT«e[MIpjκ33z& A`reʐM{HTDOf1&z"pO,>kdAbS .,@!Smr0FΤYh3Q@_Ŷqt%r|NJ$ڻe_lU4zsNyAHB7WE19w˵g% ȁtQTJ)5GUUX14ʓ*R K$GOdPJ~xf)*~^nѝ;o(w)|V>m/F;o0ojvjr]$vӇ=)+% N\i ׵pRL}3\; WCYv8FIWÍ$D@)AqhQ 'Ң5+f$֒3# )O`Q.d0"S7 rQ1A]HMp`FNTt&#a;u%E떸N\2r*cd}+ly ) a qAL4dTFDj+ !$+I4 Ui Ő(xzfRCX~_pD/@ 1r3 xzJQd3IrkrQ9S7aJ㰐;d!A|4:d? ة&Ӑ{y$$!rH[E &LX;: )yT@+K] d2PlR#׶TS `vN^xGڊ!"%)Wda42q@PX!CH5 CTVʚ005nh`CQzGCg@<+~rVtɘGv@ Oe(ڏ7=m]P q>bnԱk-n8{"'pٓ!걊w]#tdMl \ Ō| QcJ= ⩂  2 b9&;[=͑ f՟ A51sU"*TJ7 ghpa"qx vPzC@!C1Kp(o9 a<ꅁ pBp(aj{qywYfңRBI]?Q4hg:r89Ք0a K "}>!J91>,$)0)' ;I5xyڃQ3Cf:l"^ߋ|; ;3 DN//^1ʃB7 EGSO7n9l^ NXvH-^Ov- w;qnbVf'VRN)l_2b06f7MS yLcq.Q+&tXkU,V*K&bQ˃&'M5Jp?TGdT 6L]ăG؉4ms2Փ0$""$[B o4U\9i6-1}\qrו>wmcRJjSZJnQ0P!;#ԦJV$.`m $͛"Awr_ŃP6R7@HqN6 ^YNQ}h1%L|0JJry~~%w(>ltXr48A?6g^_=⾁_`;fUZ%@ SЁ y<e/ ] BFxq%vf PA $ Fz>41$fL)9o vk:xJos_-x.o٧q/vfd HE&8:!uHD JSA@+IAA@")VCC/XJd w_ ׆cJ)@f}=xV.,GpDQ" 8r" B&# sr`yL<ѐq",C/89:.R/: kSs J_w=(*l"c)00PKS㣝w%55oR: Gi 01 _# (JHIbVBg02JS!>% N0jR),1&*D%]Hdff6uzgA2_jg'Im' : 9Uq @' H*0C=e; <]I )h3^͈r77wg8\kʒ 6."ϔozkʓ*&a!EA< Ic˸vhGbBja 0 P Ȃqa4tNðWSۼm.x͜PphE"h(H3ÒڮPl4]q!B)ސf7ckΛkd9=>x'̖|c22N$y`fD Evb]d.@7"CI 2gTt:HE촪B@pm#D!%h>pOPhyvr7, ! |֔,\j|T2`1]$28$uvM ۏ`l93 01 ӓdq -vg;(!@0!Z% IMLL$R?}MI [.l"Ha9&ή2I7q5 8+6NZ!hq9O|R|:#5PiHaO5Lc t誆 ZV%VY Af&DYXf` 28#b:G 5dBq>3Dm8 1aH[/,@^@HM=]u _,ïAsXYgL#@NpG@'S=hHI.pB_EZBO}D8^h8cӑDhW 2qۿC?)if %}QR4%_\a҃ Ok0)m+c76@!@)AӞ0oVC-pp`Ēr0BJB9x! y+) ߙyh3VOCuֵPX #r"\t riz,Ҍj*S8vᕖahei( (@L"HٜJOD0C 8/E5rYz1ؤD/k1oM`wGA7lW;GI 4vsۤ`̺K;jR 0" axSFID@ul#+F+PAZii,`7444XN'xd4v/)˷QMQGS$阻2r,$']ƘlbNde 6٬ iM,m&0(6=A-A*4Xghl #˞l3ƀ(_jBTwːBG'Ca. `4']BE/#DĢ' zz( Oď6'`Z4'cc  3dF,c6G#?fl;{4Ax26I 2 X=kV9M\2BgI@s{+1FX I!%_'C#sF;#s~c @$4Cz ܶay dV`(܋lah=&H(Hydmxg8:bF)9&<ቻ@+f &.rkIP$lO#}tiF࢘uu/+0P)WKK )*iC*r*~~!hbuU!^y pn:Y/frᏰ sYJFMpCщ47¬MlAd7f8/'a444PDPf`L4 5͛4דvpM5!1( &j2V̋I$6̍1-ZPkLj6zI-aQ c"؉/G;3r(:TZs4d+lCvG XvDHǔV,`'"քݽż! NB&@=l 8~B XjOnh˟&{)="CoG[;9v YAQ:iOh"{N(-&Hl~3z#n_kg>&;L [@蓓]눞.N "51h4F$wL&p1C ` Wҏx (pS Uä%!12RLDDY: bzEN`*)YE⌇BD@j@&;'%d \PT8pEB PϨSIE("S9ؖ%4( 7\hjci8*3f=4I!CB'syϦ{Pz4zv}(DX DIizmv]AD~3?A ,k%NpA3E)8T9j'sU=VxȎDq'!CU" U Pe>|ZwA ^2v|s,CƩ4!qnQ7 u`j -=r{#cB= 2ɈG<@L tD{0k100@pH$Ud]ԮܬHR}{\<%)S{&|Oo/hw.D-K.($@uS V:&刡e 088Moj*;؎ v!lh`y=d@>weq귫jJiAWgv Ki9o[WT6#̎K% ~w(pȥ/ 4|.E.:h&‹,ݯqd?y$DT(x3cm{I)[Ĵ#oH!ZPi%r@bKs\:PhAH)HT(2I fb2bQ67L1 @AG {ʙC`H#w#" :9Zsd !BG0JWWq4b}G;΁(Ldr1!z{Dbdj~LŠ5d^W$V:x喘}@Dp.SDpٮOlH>^w5תPj/!pIJ0*]T'oHQPh(؄$lR=PX%"k.GP&b%D=A"8_Hl\@L8^ `0K 7D43*MK ab@BO"ZH:`׸]秷V9el#-jt9iO.HC\U5o n7.HP}S(efG a9B9O8[g]NA,ƪdAqʢyc%ڌY&ERQΑ7 eaiM3U;UцFpC0}UR'LonE4v6&b H·0Ѣ"6lddQqf_:`,0z>ɿ.w&iN<<ԩWnTe*#ET9h07&ࠊՑAFO)rXИڻeeRj5*\Lxo ;B8t 4JNH*o-#cF$a $N©" Sc%q B! !"X PȖ2Ȋ2?eEFV I "E#pf\G #H#!b 8L6,$ YR4HacF3bɺkL%df#046G: 5. MaӹX% V pŠa) VAbJؐ#cMI!G)r\! 8,Xl59h,ƌeLQh$!1;'(dDdPژzU 4bz #ti} G4= '/"VtCiWY]4cm:s0u t4QЭ*G"BJ#IQSm \p*ciZbXE*d9$Ѣ7f9R:fCjhM2Xb \H[m 1j$#,0Ǻ+1`'ȟyi:i| H|>8B4 Z9dbJMLbA ƮySIiMQAHR&51 Q j,1wcQ@ST0 $͖P~$e;8ctJ%! `0FaQĚfA$8㙛LE9ֲ(a)6Z#FL1k1  d EL F \'! 30M`DZ d݇Y qOր^M*ӂF`dbc  FMc#-E jD}A {]4(m4O;t"'qGUO󵲆)㇁Av!"oCpǧƮHB#2@L g!of4QD@ .E@\zn! ٕ]-*@ h8_Aȋx;:AڤLxCw`ahƊ+a[B MiQ 4C~?u-%F-6JmPvf0kh(~?D\$#/S4DG42lAS!XOQXLjI-!SB}D Nj H y ߄ S!4\xn Y7 QTO}ll $DRT?s05db?^G?೮U08NI/%h2&M(TDTRКW-0h4`& =-D,J o0 "Qa)mf0 5[ffN d4 ąP+$D`A+A pOg73-ޙ 0aQUH  ?oV1! d[ 9t\UVB=88>'*7 cPB9 $-1}?cp>(`,YQ*=>Ck&W$c2N6bQZ: e_qpC*"Rw'\gqO 9ofQSk!@اaA&: _5'6T0n**eTdj0P`Fdsd (Ii2NIS̡xPFL蜀4ۉANYo#Rj B" l @F!>Yb 0XjJJM!#HݛZ.0$HB z1 .C1P"JEiCH0ٴx qݹչQ(Xā-jrM.$8aDiCyi,Ɣ!Z)]9҃0 fj5)e Jr0h4Ij2G߀bc0'vP1A!Y"`Anj93˳zL%Y6 . 1Nc q0 ټ*Uvƣ$ ʪ+O) ``Tw!JHRB(\P lB94TfIl%X" dnPW.< @w 2lОjyuw pl8bHʭ#ĂrH"B8yC ЍX.TH%  :"%(uaU@ߺ~^;awNcL$Bn4r=~.K;mxЏ:D:>%A=_R6=ǁf1uu7ʲ{iQ5ZLK*nG h̀FT= i&+0O_eDgm^_񘹜m 6yk.<6`!;] ,PnЈ9hx=m^4s֪4үMBJ$49R#\6i/;INtXbgf!פy3ؖ4i+ 3q=*1䍾xE7B;H!5 @@QS > /{LЅ#&G 'mщQSg;4}&hhZE>G>S>E}s#>7˄cD9)>`E$A8JF ȭMLR9> Pm?lpr>(ix{H ?BrhJQJDh܁TT""Qh@?%[ uMRD@ICCC$- CD 'x{<^tB/#WX;lB@zrx@D/Fთ ]r8!wQ+  Cc,0q$Č)dJet`$D:q^/ =h? Rh`xXHBR^8S%$T $ԢvtC06Ȕ!#S#%(Ě{8qGT8`%Zkf PFB"A*1,,\;8WJɆUOcvM_&p<< @ "x;6&*T T$ {$ 23tFyf"ǘ'/WV4 "-A]]sO44BD,Ki׹gf"d&DD@LPDDCB4! EtM,1*HnCV2aijb$HMЌ`A [,ps F"('XzsM'ag$<Z0LmpPh0- vDzYd7TX8W!Bh ̭,jTZ&]J@A4xԔH)P(5 ӠMY9hlNRػB>yQV=gg ^Kz`e!K[lUoUˆh(x"$ (RD$ 2U^N 0r4}b_L(0 d$?Y|hU4 FoNYN}Pv(n}P܋0I:Bd@H8q^@pу$ D!2J@(BQbE{GPJ) 00 KQ pĂSѴM5txEIAX! H " ZHzOGA '|{b`p^DZߏ"1j-@|Bs =%ouV&F~|S4RmX} kX6!' # 1?pXT*Cݫ@~ =oަ '^ Wno #P @C'HsqAV R "P Ҍ#c߇krq!'DPJ/`tѭtDdCHNMOAsw]Ci, QTֻ¶wЁ[ 3ZME0 ɕ/p ( ic,Ѽé\NL+v(?TkH=cz!\ 5r̬p&1j&2Qț&hGU)Afar| }_Y,l(MsIcR 0z Ӷ~(w?bf %A$Q{v,](zׇO_L|ZA5oEVj@ax胲NGB>OA(dcf~4GM}y ϥS(P`ŰIzcIrx˸  mt­6D 02[ߊiOwC{J`fplz& _FA&>K9s`*JO( x j @#Ѡ^iv \ ߜ0i&Bznȝn!Ő !Dc  {i0:<Ng7Z;ӈf Y$ {b1>!H5@D*SD,UQPSEL!r^P@t7cdC栢 "2HlCg#6h6B@S<t'00R=D8b5SεF|ZTH;0P/;|I#1YfzMf8^@hma"6oY#~(>p0lh>a<6V=Ȯd|'mՆ}XO7Q50:8|ڄwà~yq $-FT`5ACS >0Ȃv{!~n|sXT8}ޱpD݆~-]vYPdrG1R21$I}P0r1 B{Nݏ=.*;hQ lD^|`5Z͕T##+Kԯ `)d\xr_=.TV?EW>!n<ƩnXل6e~56H<"ʼ)Z|wIP7- ][Vd;;ϨB$3YWRo4J9vs"Τv kck7\ |O<qݖ$$X{P7 1ou]4PuB;o-{9WqX4Q۵I! =^s_A!lr,M @36AH 7$@j<)gPDLO~b@IH5}]EJ @1_lEz*P H+r!^rn)/0FC߈9ߖ0?y[73١dr dThwl`¿L}'͠,sEBrx]ty BPT o<|kW1bK#˨xD~RU~~,]+F:'`3 yw0'WsD!^cPix~Ϥ"pzUG>G)9XQd !15UwE4Z ԝE%ѫDݡ| ; HW{=4y h+ tYbH XP)*)"Dz;EgGSq YfM)b\ 1 ѦM^|^=ܚTC}>H3)VkTCfH1`2uDks1.ig#wt6831VY ($ "ƐuCCfEZZf;P`#ݐ\Bn*j c D y^gj<>q o\ѣks  hXal`0GSIpȉTn "#!$Ȉ@% 4ƀF QAaRPSnt鬊~#SBfjKE,D֧ ]fu10ٽj Ž,b$@#VVbalB]AD%tcX8#2C0d2UA5:A E2`HcQt,cL`TDX@fBĎc5$EwB,uoktp"݋tJD`ha oIZֈ"cn`P@]0ěQA2%uDQM!B4%DVXQM@-K43b $sySfQ=crVÕP!]L,jiAՅ1YdEԍarΈ-hU-23*>*aA<>Yk7RLxaD_`K "( "IȊ#<04DDQ]n!bԸ: يjc1h00pYvK09{saГCNH {{ﮧMXWZbnXqX9zAߍUC Bи@1 )!,H >sp 8&% X4 bfF; Hֈ&#ph-aI3 8FI:b`I3ĖR*905F0ZF@h $l%ہZ Ck ,A 09h7m˺!r R[`~^ `.݈;F,@WHB3~b I#VIxKZ:! T/S\hI&Y~A`h5|aB BKOI !H)i=Lxxhc  J%('vDQOH^LjHo ##ph4Z-u7usvCxuDfI LqqπǨwB`j8o\oz:7SMu $O&]LWvD0`as)HЄ8Gx0OF *nSzG( \ǒp _Ö )Z[OݣSn)BjpA!Ѧ5h5%X ZO¯-I ,/ v[C5i(5ZMF[qr DDQ@lQQiF 8"BV]S j27 ɭ6JnRE0qֱ I"UF+@R0Nڎ4h0SdFQXI֋Y(bx3' V0(„)dR&U@'1u&e.@#-"uYP0 \N@ҟ`¼E(1` G̅X鍞D_ԉn/ Rly̘;"aDk3A=^߬{;1$rc )gTE$EDŽ|Ѫf=ىh\xd0:_]|9y){(94G{y&Xs+n^049t=`A$8=_9ذCT (ekӓ2mȡbP1!/Ttgdc5NxQ:!si", hxu e}rYxHlhN BPqغpM,*!lrC -t.~b싞RkSxkT 7)!9O:sQMSG!!梊IL_k RcO.8*#o/ڍEQ_b(FEC:=AF'Q4 qHG ?>8v*\~hr@o,(FXXAr3m\CuL*” NLA9 3?q!$ch!{BV!DjT E w(ѝ'ki xU؃ D>4@ѯl]x\|qAhv$q!9V s\ႂ`I'K Gɀ^.O*y`Kd`HL114mq1ŋD ,Ѭ 18.* |D^@G:yA&D<c״%$)X8xѫKGQ)5~tg*3ɂ&F!4FK] ,@!GDY BC* $bOr0 NwhE# _-X&$H?U^,%D#|oF!F btc`~f#RҌ /aAq| FF 8''l{<z?*EQHLJwB2 Hb%u'`̂G )$A؜_:lPb'׬0"L&la6X㿨.(@2QVKash>Sfd !F@dNDYV`Y:4{&M D&Fj :CXc2ۥ$( dRPE ʓL#k#Hv% (Ip詁7IMq8FFd:CZR$qYVl"B @$p![Ot툕%ᄠ_i2F؆*BPĢP(1 /W4vAEBnhRV/ ռd EPUUU$<4{?_M= Rx3F^4;Ӆt9>Q+PjDjPMAZ3P3qJPQ$ 5 3z(54STh܎h)j҈Q ; #8xcʯXVޜw\*\ %J*R,:K+;폑`TDAf-t]vQ嬨Dfly[)Fʖ_ 7v_M*s;= mv6ImY^rL?ic< ĴhDpJEmhZ /f3BOfP L͆[EW!3fgDnn`:Fѓ51RyL/~OjP{E֓bDf&놥%B.;B,g%&N! ֠lHLa,Td@EDc38'Fwt5Iٖ@grky3cہc~xzT+l@s*h sy*yOJҬ!L\20qsVW/[ڥ9KffV8xXrq+ |1P iA]H-ykk99M-ygUF\,hFDh¨cz*sa,<Щ k;ށaƌ00,p-%3`/GiHzzENESA)w) x* ;LsﻻQ- Y!9D JAٙD zG =J'whU֤RB,V 4&UiGըv-bωa{jv\g~Hls0uo sMU3#,5Hnj|Afט Qb8; ;39`C8o.J!q ;W~z Py BC3XRv/ ōP-#{X'X:}K#A  Gh `S! 4( a/R,c$xR/X(NAa 88S">g%#2"ÃEoS@Ĉo zgW~@|f6OןʏGXoQ.0ޭSu }/]]:`w^b'JFOW#+ي+x+!f(.s/3i,th_xSO'?&ߕHx*7Vuۢeҩ9 4pIad9@RBw 5"Bɮ%K_{7M8pXXÛNcD"eK3Q=,]zVO<aV+F(.}^8TՔup•ak;8@18'e2(8iLC3hl8ܼ({ kF I20䆊N!+ n4[0-j-8@U!#C _Y艰hV"~u#}6uD `!m 0秦xyiP AFF<(8罇+ )" NNX6)o oXAc =őSdMdWc#ԒHa6 Wrj8j7.Ϭ#Tvݴ#\etza%&H(`!3oB->0DQpuV0h#Q zJ $5Sm뿔}F7L-:Ds U3Ib#yq7Jh Mun^3@+^.çWVRvUMt/E:$*@  :1UDhmHQdҮ2cb8KA|@sRj. N6fݯy,Ċ|PdA#tH;\' nS)CD2$q9]MbRph6ԛAF4_'A3:̸t:MB#Ě2%,p@Jz '-^ ^BU8'~իL>lk┤ qBx!N7:gB&2 ~y:޻U LjJS$rKx9HN5.0h$D*֫HMP^גwde- n_5 f9 MnpL_Zvq8!.]`jfNO`G%۸ ;6.'%ü{!i9 Fu_7F#[ CU)E-k %EX0m5v[ZB/ݐA#nPU>C (+\bB d=:NG|'ywUcZ59! P9`d`A4daaD@4 F&eQH F eJT=C&] 6@`Q@8FPc @ŸbiFBgaCzu#p#IJxZ~횝Sjubamj0:AF$Fݍ5.SЮ(X` zKPuo?)$2v[8?86w ѪI6=ś=~gä .:bI'w|1BT=-^gKUELR^& 1AH8AHeiQ}(8dd2Ba˼B:.Y!S$X: *h< lnq 넻3)ȉ pL!N,3-bڑ nn:(dvNX9~@vQhyHePY:3YAUY>yȪ%vë{Qr895OY;:G#<Ud7⫐!p ["!&)a77rHD;M897r:=Z b`k9( B>J?X!D&e'^^kǀߠVD{&QD4${:pPw2„V?rK<}(dTbv`pD9owoNtY2L<$.(Tj{ux {krG/˔1ZxudZiKºpu¼i|m9RXbx}s /"|Cuf,*_bhƲo1B^pB"]R|[^|܍Z6ڷa>Y1n&BĈF` 4'SZ4ZFj9ºآ0Py綕A- 񡬍Ah]`vk9@X vH@/5NĩfЍxK+"ɤL>lAt*y~w;{ (VSQkZBwzY:Vv},E%M+X%E_ W?vIy`-JvnsH{Ћqsed ƯV՗}_R⣀.JK=mb&MIvBB!" n[ND/ӤsKc5 8볂֊~*쬥~.a(6DnG6F)a-4 ƙFuw\5Qe&6ɜa咩c9rpӖB~|[[xOjJk fygMᴹ)|M%-F0^&1;T8E&b.*Xl_dVx70Rē41KU?Вeb_;`Ҷk=b,rũ%aR 'ñXs|0tcvs f1b88E*{ #4Οm<+1 e;[߳q#nFX1ç6#U[4@&q3Ù΂h{b!l 6qkۣ2|eb-rikmsch^͑Vuk3xN'hO]= ]]s Uw!}A9x9j Wv,~Vp ,s8EbHFԂK " A*2 LFVL\FIwHy7;8{F$(#[ܙj Eq ؒSᢸԸ$ghىh1]`6 rL_ +bɸ"/M "`)up,4*N,Dz%CZ9ݝ Z$^@ BDʐC{݇v6wTt). ܵl8p4ॿ-aQ)>)h TfKNS՞xj |@'F>0޴cfIGR6It-jCEO`BO2"%N<*LW3Jaީ g5RX>3M(vt Īf 0 3 `J#Q \YCFzeCe+ v0澍a$"^ dih@)ǻ@g:Hmu6ygŠ {uz P68 (q(r0N]=]c"IZ"םn a‡'G!U(xIɥia52%x^B\BRB &JW QQ‹&&AAM FsWmMBlޅuUmM9ËcgbmKRu%*_އ>K;#ꜫAcO|#ZBMHt7"'?2n`(F\<-1T9>q @* 0Q ̟E<| yAD =& (((((( ((((((>$V7_vq8(9q'fu Ңzdmqܗ{&!Yr`" >|ɭdcp0/NNYnas<74 (Bn\(!H-`:&!QZ#g4+Sg%n2"towjFbcil#Ek-XL\ -;0Fc `Jt&B +JPk[eK=4O6"U`5sR|dr6VtzQ,&rpqsp!Jۘr=0DzP"A;3).Nti|fa ,÷#z=▁vh7k`Z%%X]vZ x`ql j!V1PEC0̣bO=&fSUdrz潷j ^8[0e$L{+z5*XG||2ꈉf |mߋq֤'0I>Z( .ϊ8>O!IB*x9㛻έ=~p6}o?[#l a`v[I@WXZ}fl7* GY 5 af B3 ES|"cLep[47Tb@F'ت|\~@IU&0 '80\O-C;\\/ftF4`B\B""R>HܹD'ɦ•6pw ~}* _:e ]0Hx`{4`A34fa<^^bR A/l=a@''`/vF!z )򒪛FR2 C* "J?,:Zh.ѕ~lݪB'y{س`p^=G߂ !b*$fZw1@1]W0(tA =@ 0zTOQ46B}#μPXi=] )@O Z # 0; w/0e`1 5y,h2~ņ1Kٛy9$ 0ȧ)bH&H"2(({yʩ(uB$K`1A뀡I E\ظԤJpՈS֏UDp ݒzFp!Gkt[{0QL(P<#PGXov3}w$^vT禓Pyλ@kab0EbCÜ眊* %UGBx %!7T??x*}. Fc׵SyW\mxYq#lnȊcC ^Ej?+/B/*@"hU q+<洑S CqbBwK\7 Ac ĄU11d T2M΃E0!TAA7&r jA y.CDѶ?"(77mC$N,z"Y bA8dL9\hoDV|c1 RUDb2'cp@Co>@k R2 4`Pt4o\0#6i:OєQ<0͉[PK*a2HhWT+YTNn/5E1VV{ lvøFM4Oܟk~CrDGIsq12I3x,idM 4SEÂE7I{{ը~1duBA#K@2+{㛜<|@ONF *Gj>v>o9ׯ|o" AND8I`qa:j!RB4AUeѠђ$ Ka*`P!X] OO'_P^gaƯ !F"0J"v!ٕ+&ǼnUDPq9U8!"H Mh9)@$Y`]Hmppr"0=PIW)$L|a2djd3r8 pJj$f +ar TԨy:/.hQ !0,Y 41#?Tp\=Gq~E[9W 0WKq1Sp> dQEȼfvmsҪxI!may@^2(XN\#~S `dBpA!<-&E1@ 66bIG86DDŽiJG& B Nr5JYJ--a% 10B YZw-tp_o G6vGI! 04(?HEDLz:Uɝ̱$v&hliW 9- !,5ҏR!];3w%ᆸ :oHms~:XL^QvMP|xv_"9E!IKO0_2y)49dkG60I)-ro(eUo莽2 WVQ~ "SJCMN՗&G~3MpKezl70g^o}-ê:~u$%3TJ)[}AOX|\Q&'ճA!DU#([ f\!xb5!$$(p'SbVaqi╕fT\{wPٚ=a0~_[q#i=6 T>R6EA@4BPdG_UX"pl#@ snP*n1G 7'+(P?A(%Bza B d j|W!\!q!\ bStU (^CvET@Y "HY ͐bo12#]qdrL>)2&=:˶ĿhS(T""Q u.}nzTNܺor/<7}kҡQ:`T*[ r/?\6pX/ a|FňI'!#F|$]!E G5>6QMh0yClDץb ?ña$~(/$aS?AH!E -Pp^1WHB%)!9 EW7r:GqhMd@b$1-RXQpBu{Ψ8'CsXyHī1דo" @&( $DhUB2hT$T>ލNj^[A(gw:팮cuOki>W9 s4^* M~n޵V_s]W濏疅hP[ ;lUʻL r$q7B o GF ٻ!jD/#9a'.Slۧ[)彳%R N=kL+%_&q!rv@R{Jd@@òҏxw̸ lc\NԣU UըL&MY e nj@fLQclmޑ kCG[{+Q'!0,% w񆌜e8H63w30L4n4R.Zhml\$8T/2\BB&*PJUy &fG|;J;ZL=PUՉ ԋԢL!,}bmF/ f3 Z!M<@ !;d82E0(\=Ӧ[ʙ}yL~jAg,DwLMŊE[*$5R7Q\}e02=y HM#X8x[4s|/fzbc"]fD*Q^G&oFۣސF=aH$c4֭ǰG&#>>BV6s0T)>S%a_ܸތ8b5wl ۸Ӷf?ݎvfk+hv z3+dSX,j;oWLㄲHT3YJ5BPГ+ JޕtPR~ZB@ ASPGᅨ~vvO:PDubq> D#(4Q8Nx=O%vt.hE@PD {ATy;>9<)[('4pnB)M$tkJbI(vzaP~K;F'sUF 'LÁ)hBBHEfhDB+/ xkWr;MQOcbz׸󊟙}` ʏf |]&;`vXu&Yc,-&бB{EOO@AA9s_̼f[L!}bf&rFL\e'$™ l@Ӯ|PNTEce㾮9oxW)B"uDu0͠D0@`AhV~'˻;e*Yk.\vnÊ|1[['?oӷ̩np6N_E˖$A;҇q u+ݬ#G4Iwu{E^M-u4NQbR&n ד|~P %~߾9>**рwnM%YP6? j0D kJ`Q {݆w?R5 dlۈdA@{ם*=r/G``( 2_0c8,"m޸E+˷)a5&7̟e]7B["!&ؠv?'Թӄξv Ř&ȭ5((Uc>M\kr0{[FhE0BbDNW;uRK( 7=C,,.|V=-i 6NÙȂPNkAT1u iVt7W>x5ކ/ F_eŸuۧ퓊UZ3wE0׌0VOiVLIQ.%y~m>Kp?ťms2\rIT#·9]8J]۲4]6DyAS1MίOG[R|LX>o14ƵQ߾c2~r;g[v\q{W3ۤ 0?aMqeyxn\V\sTxLUQ=nY|=]fͥkήҨ^)!D {K1:~vؑHnÙ뫇O\Γ?}Fk⿏q["'i|]&gyN+ˉrTC~͋?+f[6}1[StZ?[VXpg1 ȿТH |p7Vx-_\~?Ǵ^[{/ݝA[mҟr Qׇ~s]no*i$շWqY]?kn=3*Xlu T4W>'+ BP؎EAPQb0E6 =gGe%7*03kWybܨr{_8`r {\vkNl>@|_L+E) ^˂8\?9C4[ -TӇy!5u" }1lAMl܇il.Op>egv?x I< zC[Ɣ>d4\7 O{دӜ+:5nq Q Xm;7P}߇ƻ U "v]ԺOa꽌ޕUF9Ӵ#pȄDϲ,scXtVH+\1zjM#I]_{~KEM8zKx†޸y?oʛg(Df'~ݳGª}RZf8]MQ:5k;KrvN[P*>B;3NKgkĩr>8{ޟoOzrHm xPy&W;'59TTD25LC[EPTPC2"{<>+cc Nַ*ew.ƻGtCC#==(:|Z UUUum9=vWk=ώR` z<16q |[,>nz&W"%!#'.8y o>}qXZ\Bd%)עzQRCHmKc ߱lMe*>\,D"Iy5ho1keɨ'(!1 Zİ!6o'½{E5IH"L4k@qA1#X6 gcf?3m->Mu [Oν}|z1 9BƯeiP.^g, Q?/!!MAW UVuw'_2Vj'SoDNRNUQ9ElIM&Km<#\y'j:ARae6nG,-U m?:H[Ȉ_+8/yWoRq-4/}OB"!qh.1}c4d/v;x޷SU/Q[hg/b{ufe:ۿ3ߏ߁^nӱ㳓B'wߍSl!!kyOk{nQ"X :GV<4O'ЧmyRd(]^M3o7집޺ߗ9C=g׼p\\[.C4149ۨog}K~Wצ/pw8s|v5۶Oo-8:^px~UDq8G*/<(~<)9?.b}̓W>GO2RHo 88aK =rioXtI@h*Hmk$U> *RIc\1.Q,ڠ,q{/SQ*aݮJ7z$ H6HpγIդRDhbɰo<5zg>3Ķ[,TjX mk}r-q[wIF9aaɻ Q)g3suXƏћ>bU{<~J7w~\UƭyzV-˱(ϱ_6:2D):+ÿZ}Y[sf PQν"jܥ7sI֙׻ƏV=ٿ[koY{w|rӴ/:=UwG.%[{sbރ!݂zc Nt}/3,wo7m7^ ϝroݽ)^eߵu ONV6 Z+fc%w`"Ѣ[N<)0o$DJ`/ RʱDsl@4F(H*JfMҍ3&wЖLɶϧ==6CU"aDBC+XsM A6" A6ELZ%?Ή&q]JlJ5¢ѫmHx,E[hgZ(g n'n(c?< ={:+/9߲v;z %v;' 0\R0r i xׯce0+(DĸxGdt;>*d&/?w~[+f E!$ .cd_0G>g 57aew^M1|^ْnu䑯nb6C]@TUQPBd&( h$EDD- K ZuO}_KrUxTjףPx7 S.Y8t@$DNl.I!$_Y)TPdߚ~`VbrcN;]utN45F,s&&Bx_>` n "/_?¥ץ .w'ے /8\X/BQ.[3@we_;X:87à%l^NYśo9j)|.ׇ^l;=\JsԬ!^YG\dn":1ޅ;|ϧj9 |k#{N$\nF`#_›i>0zM 6Dy'H޽KBQi#Wi^[Ы,j;fyz0ȯ8vsfv5KG=Z$pڡy$,%fƴ {JHn1m3F ȕ g'[=y9>¾i0 վ"]B쏃 1JRb I( &> mں,by& p+00#d?_\[$(?1%0S85#!AR4k@xsMZSff7_ !Z ~9TRbgԃAcݐRsŌ=UcyŁhO J+DĩaJZsbkZȊ+ Es,ǘ@>RI,s~Q m'iT{=cwxޓWḍۚ󸾷}D3@ .W$LلNfpnWGezߎ}y Y"f=J^=isNl\8{miuW]?ik=miؾcKq<']~g=cnἝd7vNN?~?Llw+o˳zz M36E*nϵ(4ˌAN(tr:OsZ9CX١ b럟p:,rI߫PqAֶ2j }߱qS\˻o'Oj*l5l^T$x Sq˕/ q:9$|6 B:^1kʣA( diu&s^|5#[b/9V~/%ḒnenS`*ΓӇBop::^ ͩ2:^OA((OdbC}:QYҔ}vuhW&V`O|KG}R*:%8Io|R:aQw٦}mS/Ay<`OwzOJяf鹬F_ك҄;0v<1OUEXڒ9nXvKh'渐2UA1bA8-߱[tGay~+a+쩄A@ itT!%Z><^ޕ^YֶJ& 9~7?Xy8Yo>O5_d?"D}^\m&!}mmϧ/?g_?=lIoo\r{~fM-~?C͗z+2/7q8[M97<*\ɶn?qOYlG[r^4eO~ yohtSѣ{[/h[=|~ffow#nw?+܅fnu^;ma ڍ]\~;tc|1w 7-hORdž]$ h$8LQZ26GWqwmP{f׾TX*qW=L*ucS`Řmic6CC;hQV'(vX6o7yL>>3K/nk4Sh614vx2xG?o^M< ZlSh׿ߝo.s 7C{kF_q{^h<_e4;cnJG_|ՖϿ1=9_;e8z_/sjR~37ј_W^'񿞇!:Nۯx<7gz=in~\˹L9n*Dn8~2=|>Vœr>7)zWi^w}>YnѬ&Ysy8U}{wF謽]UJ_{c:E='i>ψmvWH544^:շs\o?Y{;':+\W8kWi<dx?pa뛆xsv'ݶճ[favYH+ocwfOvLsN?-;#,pMAuW!%Y'zfzkO ݦ $- tQ-J}=QB:2NRD jRV%֍ERSPTF6[ hNsuMT8}ǖw$&4i LGzh"=FiڏIi=Gi4#exFM SA4h &F5=2 1Q M@=M= 4iAoT24 4$ԈDhM4iA0GC@ɣddA 44 @Bd6d<ҚOB0O$iQih`B4Fh @BM44`LS54hOLQ<7QP48|2|l;ebH- ]8w(6 KUa8 Hb O_XdF\/V.*THII $& PKyhw3Fy U6MIR"#hf !"ZE ؠJXsD]m)IQ!* b* 0EKeAv]M QvoX[ @U*D 0ŕDR,%DX"'Myzj.GƘߺ{孽n$:7pNΆ 8 LJD}q"0寐!w6 dAn͑uk1 XLsiEq)gא AZ^~/CB26̹[b|V3 -VQ)"2X:r`֡fhYZ()U-C&੃jBGNq%{0Nl^ QLv5{_?ÖqCii¤HOFUqC) R z >XIj!RB9$R })2TSvL.{,u)N7nkݮM4A5wNkD 髑dUp6 {8q8a ct CÝ0-,hWG /ȝ9"چ,H :"]X npqo dwA5Ɛ]po"2(AX[PAJ S˧Iqt9F*Mdf6M4 Ȅ-XюJk债a6O‰ }Fi$)\:ۖ wӖh'cyg9 &Hc@V̖kE06>Rn.>m\[t:#R1 rbxb\yX8fRX)XtdXߢ;)MaFb:7j"O`%٦FD^KE䍽Nb9R;.Ӟ#VAEn \6d1.CEQMEFQQHs2)x;=5 t.B!! $ajwAU<7P)R SK*AHJn^NRTM:"mRy !+bS)R{\ "H?\'|HLLl-^?" Z!KN‡׏{T<>m2;G R:@0SobK<*}8qZ'$ЍJTO_X3)EM%KLak܊t(,TU9=;7E~"[1 .5e:_O&ac \ ܽ@>VhHHQfk%*9I9#JMj?5Ho,vyxӊ>Z D~߸{|e]6!¢H$9D6ɽbYIZfH"]Zvsg+SC96z꽶 6l <yx JASb)M=On-F,z|>_r.K91+kS3shGdI|@B&+hL!<'o0ҦgڠE.8mkßC3i jvs^9w^[ڕ$BT2{=w_vsh:aMDŽS8~n Zz<}*J'u2Cw`YRoSVoI!}/O;NvŝTמjK%wE8E0EL"`@Uڧ=-E=EQN RfrN|Fd,SB/=E/M|{njU[5T`@bxj[Tԯ*jj*Z BtE7V) [iG' pSѬ$pnV&xC~X|sQ=;|G ^$>LfKAy)A)Jܢ9fu3ŮHBh粮:g:dP02.mwXԜ՟)aWestN;4|#F8V9bjL" :Z

u:TS5#0 1#I#o\C;;@~XYظhtQEVs__`m}W3dTWrld# KBZz+2I@,IYq[J׏d+u|^w=ɦrT!2-FrQ}~_su39|$ ZO /`ʙH`Њ?`E"ēP֒< B 8 I^ # K `E,Mca ^#w3,d++5E0)պb݊ԞԑpzSr04ym:-}yNry}SOYOn"uJ)RJ^gdA%)r]^2սlklSˍJI9%4u e"QRɲbD"-0Zež4a5Aau+@ ?gQ0X3rEUvd]ɍJɒM6kC#Tlߦz%8>)kw_-N]@q"f=]-50c &)2%9$i(w 8Cru~ܬt&{SR+ǻT /FMq. HZ8.E ( tiAL5F>S-Ǣ"9QPz5 X) [U.l wZ.KG'`q+HjU$x}oU.Hf+T=1dE@ A{deO|+Ǥ颚D$$Iɝ5tЫUicr[Dڋ8b#8AVTo3@ 7y+旨fe*drV Kd|HPb+vl[\x7C!$+`ioĊr!GYvv'p> q\4h9xmFrtepUOs[?k81kP{l],*mTObI>wfZ'2˱H,bؿ,e JeܠG"-JrBׄ&" ,SIR3.rwA+4R i+asoT卺J)-^~WPC^;6l⤆HFPO)]SMOqz DZtJu hVFf!y4lJмZR-eams@Uz7 [ CKKصL e@D폠7Hkײ(m@2#FC$ E V@}0 c,Kgdtd^ @gMYRhz&!}@;L*HH'FEZc`E "} Dcg١:r3-_٠mG+QQVKL(! ^pDs8Wh3 G!)'e}BH!" -AaJRPBR $DXEI 3܆ܐ1`l T<|*W-ͧ# 2&^YT  D2&^AFFMEWʨT]&faq7qh1)@N*BMlTț4,ޥ :P$7oY-CR4$*IƢFphNu5¼\k#24B5ĶIkr'!xP-$)Y2=$yQ*r"qwQvʖ-sVtDe(t?{y܉e~]*nFn80m9tI$2_AM m>8J䕼LGK, wFڶgP͋k" QLys}ꡂuL 4S؜x׌!äœC.sCosubxF,KKd5e9aٰݣt84P>JE C"ItPAE AA={{XWs7o^Cj̇.  RᆰH?rC䟲4i\_ND@BJBETQ1PȠ% ,`$TzyI`! f@@cR$$R l.䩔pab"A@" )*@ b 0F )) DH@)ߊUSSЩg<Pqڡ$# C&Lay("=zHw]n}Z{ 3rr UUU*^* K t>v@s`nOQ]@!nFGhR/)Uf(<ðb6:,@QOc-@#i=e9L 1*B>ȥe]bh'{trg=b)-(- PN .*6ީ7xÐ~=iR<痚zKn,v`us'OAvHFDFBiچVLtAkB¥W ⇟ *kpqX7LʳUMJi&0Ոbԃ 7(Be_%cUE0 jINIdw^Vg*!*9t}϶<CWЕB L윢jjVHBB8r(lRD+'9Ʀg}!\a`&pfDU*xU<ʔr,E$Z̜9t'j$Pf;0xfrdKX:16 (:ή >Wt  fOl<tRf # `^v哸L s LsO|E(A~yVth$!t@ 8M*NRcٲȚމҫLǮ8"QH%iX8.S2qÂH*Z:BH6k<$Odzkwr§+4&QVR`8>\ I!sOx~= q>ϰ._YzEͳWovc?zN; KV_~Oߓ~њuu<[2 p ~_"aS,FĚ5 ۊ *ա9^埾#f9@N CE }-qm$ +T Rf} bt) DG\!BEem"(kk3P,fn ohjiQ , ?RM#yAQ\X(D z0He1!F sqnhEjrBxh$wvh NbxS7vj;H n'bDB" 3h5Ѐ$Lwb$q ddDF|2-{Y:^w4M p8 ۝@UPxs.>NSZBԊEa<,q}38n>>ؽfH%?,WLwdb x.bFhd>aB.tF)p̔':R`xp'yh2fpr*Q`f2TC@9#op4;z⫳EVkU̬ЁTz\P.FHw&a&R59ijtGNe6!޵ϱ86l)lΨ 8IqԒ׭\@qV̙DTHSINIٸT nqUeHAR d)4SiȴS-#՟ 18*Tp]u. #ww q*vM/EIPM 53P9w$S`I!B(S? |@!'d)ꊜHdrH^| 茳sn'-PNfCuKFF=gĀ9q xBgM^ $%g0<"THyIJRãsT`̉ĩt'Rm((N3pC?B\:vbI zP>8;68E=+ʩR*B J+Q@JG i I>5DyC&zJ3ٮh$59f=[ʴAETM8'8dc$ @h0|RҸa@ ƣݖ9ґgjXSPʣָR$3bԢ}k@[.bB,Hqr@D1% Nsu0 9J]QH@$ᠩDE<§jTfoEElM8$SD)O~-wsNjr}KTz*M!6,6K(:%ւQdJ ĩHu;@Ʋ~zuIAv u|m*aADmd@#81ۙpN\*@@7Je/Z3AHJ sMBMT3|J-??7YӸTJ*uC,DjKZd0TQzIu>,TR@y&E좢`4ٸ$S7,ʌRi<$%a$(oMxw(GZȏ(LKP \K K@!R(JXI𛁬—.U&V@_rӓ%LeΊ[#*E0RKP PTJ)&Iy^$LXoblWЫXTL&%F*1QcEg/0 lRUUFʸT dBAݠ:' M}S~wk׷<>E Y# ((dTUUUDHB$ 2@EޤE P 0hZv2*4yHdt)K=Fڕ/EZǠsϥSh f`KJ|hv4Cgn <)Q% wpӶ 8ζkp8Qm rTh)ӼSРHSG>5mSa0ND i {{SR@>X kASJ.u;UB@=:pe&@ˑCÄɞo<43 QC^cr!zYM |3TT̴ EL,Rwt&ʋR#F4p($8xXAT-98 ) ^0Xt4^iPLi]LPJ!?]BshnJj!+ y~[k=q=m)DJ;7!Ph?7c6 tM- p0'$q#1$ԣ̺I8C)!6n`F( `̦A}Zؑ s"С]'C)4Pʴ}e(Kv J* |nE,,>07(PRI_0QT/?Ǧ8aK`"R3kT- Vq‹~<2jY䐐~M*tR(=%Iآ5#e2E3TTnVMLnݔ7db)ŠD@)i{鼜qIzS gvW딾 1<ҎF[{[7!&݁ʑ@zAOn:@jT>:b"!  @fb# ;}@$*I j {Tԩ)Td+j FݐؐڛPn\rWG1FLMyqhR%#'9N1 's0jT#A!u(dg c[Ro[qV"io]RMap܊gQNdReh60IӶ`vwSDvR"jօXEHT F @T:x5gw:)Ǿ!RR*@p|c$ԦS3"ðX{PdXNMFgR ~\=2P `S$*WVߍ;wcCίS?OnFgR(. -boO Tpʒe:Pz7_BKe (N_:wglenO1ǒojW jcL e#quKU*E1I 8LjPf4EF10`aF ܡRJ4!4P:`NYZVq|\r+d Y[^ŐB9҄RQH#q2zz@GjSp&c*z2R;UBH]T6}luXB+BL$MhK$&Nk(߅L~HSfVR{-P2V  T&eZz1) `0\ ظTdmaADO@%QRT 5lsHzzSM@* `mݝ^/%!!H7uRjʋ6%T*nS`vnԊDa{`>Rp:HN%B$6G@-(`?\=Stj3Ou@@0R. 'ddHQ3$I@Z# I?veCIF(IN܃Ax9s]@ l;\N8 :)RtLS"cctU# إ{[  ;4) REڌ[@2SZb-иb*P՘ 0 m S4@B\Çw11%<ɖpNp\%G:IZr7Xޤ+T o<}uTCY[8ȗrhT`*Yp dsXc\d5 *`b$c(4euLDr.8+u$J$#v+Yh"]+h_˄ [}J qH@,tVM81kbf&F,X0[: pTY*HP l DXʒCYUQҊJV)&03):S0yo1ر~ ( @Oo;Q¼4GNUN|iSSDRTTkt%+LK\@+ϏI8BᒧOGn Glz+Ӝ /2(ܪ>_(DT7aiXL+~ɯònwJ`ap(sc!i~jj9LB X`MO"$ kVSӂb,r{R.q'fOцE$([AEQTP_ttK%7CZ'fDt0w'+S8G$X}anma3@ʦvqקC}mBWcXj3at:RjյP ~a|r.`l>B']Z!+C)efXrr,TVEUGeӆ:ݙ6"tsQIނyLN xM:d;ĠdzF5,!r1cûXxgGv@( ÜNt/gE ,In]d׎"g "3S]0Ϟ1qZs`]L`-Wי{hÐhԷZË0 5qȘh wiV%b2*H]1"i]vP܎%D#P.a0T-afjD$PwqC^-`ZHT,Ǐ3D=qg [U; tףHTZ"DbVDh'Bl6ߤ@Yep5k0*oUDժÉ DN;n]bvK$T҅.ijf "V/s$!Z!V5fktctFj8e&Eah5^\KQ0  i@'E+ pt"\q}ԃkZA4VCnR;0J {)yE2BP%!lqS;"zd(ZQFKZbR"g[j2vƠJ.C]ΒIScnC~Ŭ3'$m{""/c8jɾM'P+EAyܙyBB@g]sױciCw< 1qM=ŸAL=RNW;s;njr| d w3Om<9{YfcxL{`H:r@0,޽s]\ 1)T4]Nn]BC3