2007-08-08 21:17:48 +01:00
|
|
|
#! /usr/bin/env python
|
|
|
|
|
# encoding: utf-8
|
|
|
|
|
# Thomas Nagy, 2005 (ita)
|
|
|
|
|
|
|
|
|
|
import os, sys
|
|
|
|
|
if 'PSYCOWAF' in os.environ:
|
|
|
|
|
try:
|
|
|
|
|
import psyco
|
|
|
|
|
psyco.full()
|
|
|
|
|
except:
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
VERSION="1.1.1"
|
2007-08-29 12:31:17 +01:00
|
|
|
REVISION="1420549696"
|
2007-08-08 21:17:48 +01:00
|
|
|
INSTALL=sys.platform=='win32' and 'c:/temp' or '/usr/local'
|
|
|
|
|
cwd = os.getcwd()
|
|
|
|
|
|
|
|
|
|
def decodeAscii85(s):
|
|
|
|
|
out=[]
|
|
|
|
|
app=out.append
|
|
|
|
|
s=''.join(s.split()).replace('z','!!!!!')
|
|
|
|
|
p1,p2=divmod(len(s), 5)
|
|
|
|
|
stop=5*p1
|
|
|
|
|
p3,p4=s[0:stop],s[stop:]
|
|
|
|
|
for i in range(p1):
|
|
|
|
|
off=i*5
|
|
|
|
|
a=ord(p3[off])-33
|
|
|
|
|
b=ord(p3[off+1])-33
|
|
|
|
|
c=ord(p3[off+2])-33
|
|
|
|
|
d=ord(p3[off+3])-33
|
|
|
|
|
e=ord(p3[off+4])-33
|
|
|
|
|
num=(52200625L*a)+(614125*b)+(7225*c)+(85*d)+e
|
|
|
|
|
x,p=divmod(num,256)
|
|
|
|
|
x,o=divmod(x,256)
|
|
|
|
|
m,n=divmod(x,256)
|
|
|
|
|
app(chr(m)+chr(n)+chr(o)+chr(p))
|
|
|
|
|
if p2:
|
|
|
|
|
while len(p4)<5: p4=p4+'!'
|
|
|
|
|
a=ord(p4[0])-33
|
|
|
|
|
b=ord(p4[1])-33
|
|
|
|
|
c=ord(p4[2])-33
|
|
|
|
|
d=ord(p4[3])-33
|
|
|
|
|
e=ord(p4[4])-33
|
|
|
|
|
num=(52200625L*a)+(614125*b)+(7225*c)+(85*d)+e
|
|
|
|
|
x,p=divmod(num,256)
|
|
|
|
|
x,o=divmod(x,256)
|
|
|
|
|
m,n=divmod(x, 256)
|
|
|
|
|
if p2==2: app(chr(m))
|
|
|
|
|
elif p2==3: app(chr(m)+chr(n))
|
|
|
|
|
elif p2==4: app(chr(m)+chr(n)+chr(o))
|
|
|
|
|
return ''.join(out)
|
|
|
|
|
|
|
|
|
|
# wafdir is needed to parse the command-line arguments or print the version number
|
|
|
|
|
wafdir=None # SPECIAL LINE
|
|
|
|
|
|
|
|
|
|
def uncompress_wafdir(newdir):
|
|
|
|
|
file = open(sys.argv[0], 'rb')
|
|
|
|
|
while 1:
|
|
|
|
|
line = file.readline()
|
|
|
|
|
if not line:
|
|
|
|
|
print "This is a stripped-down waf, there is no wafadmin directory available"
|
|
|
|
|
print "Please set WAFDIR to a directory containing a directory named wafadmin"
|
|
|
|
|
print "Or use the full waf version available freely at http://freehackers.org/~tnagy/bksys.html"
|
|
|
|
|
print "\033[91mNo wafadmin: cannot execute anything (error)\033[0m"
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
line=line.rstrip()
|
|
|
|
|
if line=='# ===>BEGIN WOOF<===':
|
|
|
|
|
cnt = file.readline()
|
|
|
|
|
if not cnt:
|
|
|
|
|
print "Corrupted waf (1)"
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
|
|
line = file.readline().rstrip()
|
|
|
|
|
if line!='# ===>END WOOF<===':
|
|
|
|
|
print "Corrupted waf (2)"
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
break
|
|
|
|
|
if not cnt:
|
|
|
|
|
print "Corrupted waf (3)"
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
|
|
cnt = decodeAscii85(cnt[1:])
|
|
|
|
|
|
|
|
|
|
# create wafadmin
|
|
|
|
|
import shutil
|
|
|
|
|
try: shutil.rmtree(newdir)
|
|
|
|
|
except OSError: pass
|
|
|
|
|
try: os.makedirs(newdir)
|
|
|
|
|
except OSError:
|
|
|
|
|
print "Could uncompress waf-local into %s"%newdir
|
|
|
|
|
print "Please install waf system-wide or move waf in a writeable directory"
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
|
|
os.chdir(newdir)
|
|
|
|
|
file = open('wafadmin.tar.bz2', 'wb')
|
|
|
|
|
file.write(cnt)
|
|
|
|
|
file.close()
|
|
|
|
|
|
|
|
|
|
# now we have the tar file to open
|
|
|
|
|
import tarfile
|
|
|
|
|
tar = tarfile.open('wafadmin.tar.bz2')
|
|
|
|
|
for tarinfo in tar:
|
|
|
|
|
tar.extract(tarinfo)
|
|
|
|
|
tar.close()
|
|
|
|
|
|
|
|
|
|
# cleanup the tarfile and chdir to the previous directory
|
|
|
|
|
os.chmod('wafadmin', 0755)
|
|
|
|
|
os.chmod('wafadmin'+os.sep+'Tools', 0755)
|
|
|
|
|
os.unlink('wafadmin.tar.bz2')
|
|
|
|
|
os.chdir(cwd)
|
|
|
|
|
|
|
|
|
|
global wafdir
|
|
|
|
|
wafdir = newdir
|
|
|
|
|
|
|
|
|
|
def try_wafdir(dir):
|
|
|
|
|
global wafdir
|
|
|
|
|
if wafdir: return
|
|
|
|
|
try:
|
|
|
|
|
os.stat(os.path.join(dir, 'wafadmin'))
|
|
|
|
|
wafdir = os.path.abspath(dir)
|
|
|
|
|
except OSError:
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
def find_wafadmin():
|
|
|
|
|
global wafdir
|
|
|
|
|
name = sys.argv[0]
|
|
|
|
|
|
|
|
|
|
# wafadmin may be in $WAFDIR (developers)
|
|
|
|
|
if 'WAFDIR' in os.environ:
|
|
|
|
|
try_wafdir(os.environ['WAFDIR'])
|
|
|
|
|
if wafdir: return
|
|
|
|
|
|
|
|
|
|
# waf-light is a special beast
|
|
|
|
|
if name[-5:] == 'light':
|
|
|
|
|
try_wafdir(os.path.dirname(os.path.abspath(name)))
|
|
|
|
|
if wafdir: return
|
|
|
|
|
print "\033[91mwaf-light in use, wafadmin not found -> export WAFDIR=/folder\033[0m"
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
|
|
if not wafdir:
|
|
|
|
|
dir = "/lib/waf-%s-%s/" % (VERSION, REVISION)
|
|
|
|
|
for i in [INSTALL, '/usr', '/usr/local', '/opt']:
|
|
|
|
|
try_wafdir(i+dir)
|
|
|
|
|
if wafdir: return
|
|
|
|
|
|
|
|
|
|
# remove $HOME/.waf-version if asked to
|
|
|
|
|
if wafdir:
|
|
|
|
|
if "--nocache" in sys.argv:
|
|
|
|
|
import shutil
|
|
|
|
|
print "removing the local wafdir", wafdir
|
|
|
|
|
try: shutil.rmtree(wafdir)
|
|
|
|
|
except OSError: pass
|
|
|
|
|
try: os.stat(wafdir)
|
|
|
|
|
except OSError: wafdir=None
|
|
|
|
|
|
|
|
|
|
if wafdir: return
|
|
|
|
|
|
|
|
|
|
# look in the directory containing waf
|
|
|
|
|
if sys.platform == 'win32': s='waf-%s-%s'
|
|
|
|
|
else: s='.waf-%s-%s'
|
|
|
|
|
dir = os.path.join(os.path.dirname(os.path.abspath(name)), s % (VERSION, REVISION))
|
|
|
|
|
try_wafdir(dir)
|
|
|
|
|
if wafdir: return
|
|
|
|
|
|
|
|
|
|
# not found, uncompress
|
|
|
|
|
wafdir = dir
|
|
|
|
|
uncompress_wafdir(dir)
|
|
|
|
|
|
|
|
|
|
# run the test
|
|
|
|
|
find_wafadmin()
|
|
|
|
|
if "-vv" in sys.argv: print "wafdir is ", wafdir
|
|
|
|
|
|
|
|
|
|
# Update sys.path and import our modules
|
|
|
|
|
wafadmindir = os.path.join(wafdir, 'wafadmin')
|
|
|
|
|
tooldir = os.path.join(wafadmindir, 'Tools')
|
|
|
|
|
sys.path = [wafadmindir, tooldir] + sys.path
|
|
|
|
|
|
|
|
|
|
import Options, Params, Utils
|
|
|
|
|
from Params import fatal, warning
|
|
|
|
|
|
|
|
|
|
# Set the directory containing the tools
|
|
|
|
|
Params.g_tooldir = [tooldir]
|
|
|
|
|
Params.g_cwd_launch = cwd
|
|
|
|
|
|
|
|
|
|
if Params.g_version != VERSION:
|
|
|
|
|
fatal('version mismatch waf %s <-> wafadmin %s (wafdir %s)' % (VERSION, Params.g_version, wafdir))
|
|
|
|
|
|
|
|
|
|
# some command-line options can be processed immediately
|
|
|
|
|
if '--version' in sys.argv:
|
|
|
|
|
opt_obj = Options.Handler()
|
|
|
|
|
opt_obj.parse_args()
|
|
|
|
|
sys.exit(0)
|
|
|
|
|
|
|
|
|
|
# now find the wscript file
|
|
|
|
|
msg1 = 'Waf: *** Nothing to do! Please run waf from a directory containing a file named "wscript"'
|
|
|
|
|
|
|
|
|
|
# Some people want to configure their projects gcc-style:
|
|
|
|
|
# mkdir build && cd build && ../waf configure && ../waf
|
|
|
|
|
# check that this is really what is wanted
|
|
|
|
|
build_dir_override = None
|
|
|
|
|
candidate = None
|
|
|
|
|
|
|
|
|
|
lst = os.listdir(cwd)
|
|
|
|
|
xml = 0
|
|
|
|
|
#check if a wscript or a wscript_xml file is in current directory
|
|
|
|
|
if (not 'wscript' in lst) and (not 'wscript_xml' in lst):
|
|
|
|
|
if 'configure' in sys.argv:
|
|
|
|
|
#set the build directory with the current directory
|
|
|
|
|
build_dir_override = cwd
|
|
|
|
|
if 'wscript_build' in lst:
|
|
|
|
|
#try to find the wscript root
|
|
|
|
|
candidate = cwd
|
|
|
|
|
else:
|
|
|
|
|
#wscript or wscript_xml is in current directory, use this directory as candidate
|
|
|
|
|
candidate = cwd
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
#check the following dirs for wscript or wscript_xml
|
|
|
|
|
search_for_candidate = True
|
|
|
|
|
if not candidate:
|
|
|
|
|
#check first the calldir if there is wscript or wscript_xml
|
|
|
|
|
#for example: /usr/src/configure the calldir would be /usr/src
|
|
|
|
|
calldir = os.path.abspath(os.path.dirname(sys.argv[0]))
|
|
|
|
|
lst_calldir = os.listdir(calldir)
|
|
|
|
|
if 'wscript' in lst_calldir:
|
|
|
|
|
candidate = calldir
|
|
|
|
|
search_for_candidate = False
|
|
|
|
|
if 'wscript_xml' in lst_calldir:
|
|
|
|
|
candidate = calldir
|
|
|
|
|
xml = 1
|
|
|
|
|
search_for_candidate = False
|
|
|
|
|
if "--make-waf" in sys.argv and candidate:
|
|
|
|
|
search_for_candidate = False
|
|
|
|
|
|
|
|
|
|
#check all directories above current dir for wscript or wscript_xml if still not found
|
|
|
|
|
while search_for_candidate:
|
|
|
|
|
if len(cwd) <= 3:
|
|
|
|
|
break # stop at / or c:
|
|
|
|
|
dirlst = os.listdir(cwd)
|
|
|
|
|
if 'wscript' in dirlst:
|
|
|
|
|
candidate = cwd
|
|
|
|
|
xml = 0
|
|
|
|
|
if 'wscript_xml' in dirlst:
|
|
|
|
|
candidate = cwd
|
|
|
|
|
xml = 1
|
|
|
|
|
break
|
|
|
|
|
if 'configure' in sys.argv and candidate:
|
|
|
|
|
break
|
|
|
|
|
if Params.g_lockfile in dirlst:
|
|
|
|
|
break
|
|
|
|
|
cwd = cwd[:cwd.rfind(os.sep)] # climb up
|
|
|
|
|
except:
|
|
|
|
|
fatal(msg1)
|
|
|
|
|
|
|
|
|
|
if not candidate:
|
|
|
|
|
# check if the user only wanted to display the help
|
|
|
|
|
if '-h' in sys.argv or '--help' in sys.argv:
|
|
|
|
|
warning('No wscript file found: the help message may be incomplete')
|
|
|
|
|
opt_obj = Options.Handler()
|
|
|
|
|
opt_obj.parse_args()
|
|
|
|
|
sys.exit(0)
|
|
|
|
|
else:
|
|
|
|
|
fatal(msg1)
|
|
|
|
|
|
|
|
|
|
# We have found wscript, but there is no guarantee that it is valid
|
|
|
|
|
os.chdir(candidate)
|
|
|
|
|
|
|
|
|
|
# xml -> jump to the parser
|
|
|
|
|
if xml:
|
|
|
|
|
from XMLScripting import compile
|
|
|
|
|
compile(candidate+os.sep+'wscript_xml')
|
|
|
|
|
else:
|
|
|
|
|
# define the main module containing the functions init, shutdown, ..
|
|
|
|
|
Utils.set_main_module(os.path.join(candidate, 'wscript'))
|
|
|
|
|
|
|
|
|
|
if build_dir_override:
|
|
|
|
|
try:
|
|
|
|
|
# test if user has set the blddir in wscript.
|
|
|
|
|
blddir = Utils.g_module.blddir
|
|
|
|
|
msg = 'Overriding build directory %s with %s' % (blddir, build_dir_override)
|
|
|
|
|
Params.niceprint(msg, 'WARNING', 'waf')
|
|
|
|
|
except:
|
|
|
|
|
pass
|
|
|
|
|
Utils.g_module.blddir = build_dir_override
|
|
|
|
|
|
|
|
|
|
# fetch the custom command-line options recursively and in a procedural way
|
|
|
|
|
opt_obj = Options.Handler()
|
|
|
|
|
opt_obj.sub_options('') # will look in wscript
|
|
|
|
|
opt_obj.parse_args()
|
|
|
|
|
|
|
|
|
|
# use the parser results
|
|
|
|
|
if Params.g_commands['dist']:
|
|
|
|
|
# try to use the user-defined dist function first, fallback to the waf scheme
|
|
|
|
|
try:
|
|
|
|
|
Utils.g_module.dist()
|
|
|
|
|
sys.exit(0)
|
|
|
|
|
except AttributeError:
|
|
|
|
|
pass
|
|
|
|
|
try: appname = Utils.g_module.APPNAME
|
|
|
|
|
except: appname = 'noname'
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
get_version = Utils.g_module.get_version
|
|
|
|
|
except AttributeError:
|
|
|
|
|
try:
|
|
|
|
|
version = Utils.g_module.VERSION
|
|
|
|
|
except AttributeError:
|
|
|
|
|
version = '1.0'
|
|
|
|
|
else:
|
|
|
|
|
version = get_version()
|
|
|
|
|
|
|
|
|
|
from Scripting import Dist
|
|
|
|
|
Dist(appname, version)
|
|
|
|
|
sys.exit(0)
|
|
|
|
|
elif Params.g_commands['distclean']:
|
|
|
|
|
# try to use the user-defined distclean first, fallback to the waf scheme
|
|
|
|
|
try:
|
|
|
|
|
Utils.g_module.distclean()
|
|
|
|
|
sys.exit(0)
|
|
|
|
|
except AttributeError:
|
|
|
|
|
pass
|
|
|
|
|
from Scripting import DistClean
|
|
|
|
|
DistClean()
|
|
|
|
|
sys.exit(0)
|
|
|
|
|
|
|
|
|
|
try: Utils.g_module.init()
|
|
|
|
|
except AttributeError: pass
|
|
|
|
|
|
|
|
|
|
import Scripting
|
|
|
|
|
try: Scripting.Main()
|
|
|
|
|
except KeyboardInterrupt: Params.fatal('build interrupted')
|
|
|
|
|
#import hotshot
|
|
|
|
|
#prof=hotshot.Profile("/tmp/proftest.txt")
|
|
|
|
|
#prof.runcall(Scripting.Main)
|
|
|
|
|
#prof.close()
|
|
|
|
|
# ===>BEGIN WOOF<===
|
2007-08-29 12:31:17 +01:00
|
|
|
#6<\%_0gSqh;d#""QRi4MNW9%Ys8;Tjs8W-!s8W-!s8W*A!!!?/+s:iT#QPE@+:JNalM^0u7E&7,zzU5BWbz!oq"M1#9$/UR'Q@h2E0$HX4Xf:2NWkAtYU?>A0Z5XLk)fl$_aFmsXWhU_,Lb16eF=;LtY_;4@7:GM-3XH_G<FH]L6)A#/tII6?F=n!f<;Dmo*/EZ8k06d=rcDllJO.=Kk,'Vu-N>C2j>#5d`0]WUYfGLm@uTQ\8/5QGJZ:^!al1hiXX4Z1]3!!bahTQJ6W5j?(>6<:;j),Tb;_rq(S"]4Tp^n;;I($KLb"*XME*kPRs*a8a2mA3[.1[C%gSaknoQEB!KJ-V"e78sKLqQ7f<[g/oQpRq#,Vr%IVd/!*kI"26_!32kCX@/ja$DLgq@fQK/-iaSS!!!!";/3L+=0I&?f7!+ek.8]W)APb35bL",pV+k_pMdk@?Ld<Y]670LFZJF2mr[DB?KZ6.4blath7_MfLYfaNgfMf\^@#1iBpE`'[U9nS"GEe>FY3?)DUUjT#DH7:>M`,<SnH%`#(?(umV$WHA_1emlV*c(Y+AeLXkm@X]tPQVS*bPYeRe1Ac1U,NqYGWCql]g;mpCFs]XG!/n$gVSDI-Z:jmG:??2)%ll,r\jH+LV)o71Ie]=$)heun>MT5>M/qVQ)JWr&9p34.AoCg76^f"/EJ?[LOSc!G2QpN!kMlQ5PB>Qe9%Xo[YKlb;dNP`]gkf@ssK;9s,dbO;"NT3MhD^$AIlhY2:7flm,"G4"[>Y<&9$D@`gThd^jnZ_MkF;8&MfhT_KQmgJI5!mpgHlFYZOZqC'b^!'!4K5Y]WkSeBG<@%rN>Lj:QF;+aoG>u01g@k+Y`YU:#VlpC;Vn7Acp27T:*mH>2S\UodkG^QSWW;eD-_iLEpYGS9D;0"0)e=XTS%GZeH+R"qG6Vro=)?^%<8/(-0o!<.!:A;%gu=t9pWoEpgV1/+h`#2J>>)ZQbs<_*Sb@9_n8e[!qoO3!";6&f\`o3cnr@F4mWY5$95Q*D:)19M*#1*/qjW`(cF0ohH"Sbcj?;r*gO8fKJ^K*SY2=G/[tW[F]b3d#aR,7p%`R)?hV@.e\_[;n;U_NV[bIcYT6Hej%op:XeGJR,RIVId78h^iJ?PM]q?Dl)pH7hk*r!DC]u.OU?Z#Pf^%]/-]_@H?DVG!CXk<*KmsE[D2n-r&Z1j9lpNOa;T\4qGD4TF@T(]d&k69`8a5+JD-#2Z4^"r*:3\V7INr!(i71t/D!e`=D!/W),8%`Cj]6isn]cM<u]s)edCt<#nC4!Y-%ZToRcVE6;_X"87j0a'b^"sJ#mV>^NFjX2S"V3l^mpg\RYT3@:>!Dht^,jl`_Y8=.c(64<o7=Rc%W+A649^H-]Beo'oOT\RFdWr%>"dKXeQn`/[l`pC0`([UDk<"N=94JdUXD?tIB\s`!.]Sb+:)W`d$OrL)?aTBR8Mp5ksK.e7R<"V!!!.T+p``HN<'#R!hZ;9rDPPH]i3T2RSQjX;ot`-%0K</JB.]j!!5JTJHJ.?dg3n5d*SAJ7[c1t1t9Y2RP=t/9Za9A4W9rk6R,*p)J$e-4[BB'&I;)L+dC*KIYjufUX:ps'Z`L-4fW4oO9pLn$mPt,-CC/+!&6;9;F1tg9`QN/QkLg+9f*R_<;_EAW:D=44Z905<:rC/:J_-YB\IuM!!!.jLk5a11)^/nWVTCaOm4dMWVU0nr@2X+Rjl$I!!!!.!!!!@;ucM4qZ.IO6soj1TF)7(ckJ3ijs&)FEtN5EWf!dL8YBIBNs#_"[$Zr=9?#ud3rGOl]6C@/;mOQie"[q5C0Zs*^!rN_?LmLG?MDe@%YTARr@(WV5NpRud166n<=Y`Vr.6Agoe"WT2TP"0d'E*qpEaQTk-%`FP](F)B(0G2[Mh&@QUPe3=&N@h``onhCNYu30!oHB@M7_B5O4.O-nccRK*7!]_9XW8,,dqq%g`J;J4&H!ne='J-j?E?)A&_`'I[!"ndl4%O),t,91_\&Lp8)\<'85#0VJ0*I3Ha5E%)QU&)R`)-p]$f&YL99&:d+r;@3:]9M`dg,4jp1PT`NO*T5>>!$%8JQ,isPJ`I(_*2iqB_BAV?,)f%m'T+R?Tj/]O&cNVHHmAUBFJ)M[a@.lm9LU2t3gM1h8cL-RdLdWh<<GTVe.Dcq'ho,^8CGH'"V=N3&;4"\5n$[@6561`,#AFc6k(9`'2:8[;&%GI77fmH8J'-D784J\;*`N&bXb9P'nO1p"&ME?<=G!X1^,&mS4um9;%Y3E'LbEP,qtT]$jBQ10ml_?=]o2@R@tsrQ9knH-qY[%.Zf5rWX4t0RUTuE$<jEd<iUh1A;LMJLdk!O6A:7?+d**\$7%&K$AO6_7\V)9VFDt&KN]^sWFcK8,%QO@MHGZY#bi2.VFcMo@Us2KU/CujL6<`m#sqg-TVe/(+Fo3DMI;UGMBiO$@ORt-.O$9M#cK-i-<a"CRRSE_6BWLLR$N9"@&@CeL5;d[$4>NV%3lH^70+kPbWurM"Ubm[_%@s3!@.eH,m6RM"VVRa^dO;B$l)I@,sagc'i`+J`=Pu]:dHonP`-:j;\9^#6Ua?t6:1ke6pUhb`(<<^&Oa^J6U=+,&JA%GKG$]V;$96["9hK+PT^Tk'ZEL0:t%,Bd"KV2727LS9T9TK<#$[p6ps?V1pg.SYZ4)U'N!1G,r66gKMtRd&i?DG_[I6t<E')l5Y/^hbXiN\7'd$<;*tpn`CrZ3!>@aV8J*f0;^;oNPXJ,8$OmeH`.LTS$PQFW'*S[TPS$lG1GVNq92)0U5tOCB&/<M[71h*a8MqrjaWuu\&Houa0f)dj<7&u\,Z'RjdRck9:b4:T86$'l0iJcS1CHIS&440':f,@m7$0&/5m9Og&r]Zs:f&E:ZkT=S0h=PtOGq@_'GXUK5seL9&/@i(1)/(=/Hl;D'TiJ"$q*BM<"V\76kfq28CC*cd_doc,f!C`#)t#s1pI]%"JGrQ/3uTrWBsNP"YD5r9aX^V,=G(f"Am'''L3@p+U#%a<<1JZ&4&(i1dNt"'29oQ,YCp."9_+Y0[rc.;aj+Y'SR\A;ai2O<D?I:6NKSH"]2!`"J[(B`(_LV&BrB*&qVtS+@smI%89/_;%-"6Te`i@6Oc<,=Wo,ZTn9:r81?k<$AOCH$<h2#Pc5iPUnWu".0?6?-43@9RSlbXRJ(,b6pr*SVZ]C!5uS38C`3>S(*oi7$%aW>)(HP\#`'glVCAL=Lo*WZL`g5_!\.rR$5S/DTI(jJR3Dqe8j]CgTS??rPaW^cP(K?nq*K'M784CL1BLQ5'L9T09b`^(9%>XAN=,k69/6Z&#f+U15nGda*A@dR3T,"&fGR\_J>alb5_=\9TdlM*#RDb'Qt`9#,bc-=Q4aHM#RQb>A-N@?)G-f7M1UuV!Z<jN&Hrm]">`n*%5B:c1C410"Xt]*`"Fb'OAmr4&P5fPN>4-=1/ftp:st:g'bF3`9%-*].7l!cK#7Wn1lWma5SOIN.tp8U!(\m["%a4>4cCp)`'I5)+\PN[,qpVh:_=Br#n2do8u!l`&OeDg70Oo&_$lM@0bh!Jb;,.hKeP8=,SJIWb"DfW<Cml]YmC_2'Z=]Z:dl*i3J>f`6V'l_!>8(&YfTiV6j45Y#gB+Q6Hl+@!DQCq+B(iu[$7C3:f,)!1DEeU8PE)0;)1g5d8`an:t&E:9LCTIb(Tsh;cQ7";af![<'jKI`6cq16NES)/4hBd&d9]mZk5"AZOp2;";*CeYYtfAV(E!A;O%BI"N7QB6kGP.'b]"-;_T@\&O?Cb`!e%.'NHA(&-RYT<Da&k8OTm-;c$"Q!mi)_!<aqW1djbA.7lm$&QLC#_Sn4W`DfbF)^^GO$'qGsMP6\FQlqY#M&)5*:hZPYB`t4;#RG0S,&(X--AX*_"pp*Z$>BR-JLDjpK*FW;8kKekTV@R9-A"Q.+:;M<TS[*MW)TLGBnRCdU*`3[U7*M\R$iPhP(;o0d`0,$(<)TF8O63-PZ1LV_J*9YKTdt3/.j.d%+;Ls>XUhRJYZPnOX2E=9M6!19#/p[&@0Nt<00BY`.V)`_6=-:W>[+\@:C(J-kqMo-n6*$JV#'q6:=-W'SZ`U.7?e$U4SgX-N<Ej9
|
2007-08-08 21:17:48 +01:00
|
|
|
# ===>END WOOF<===
|