summaryrefslogtreecommitdiff
path: root/classes/relocatable.bbclass
blob: 2af3a7a1c4ab81f2602af5b5e88b0dce65f7cef7 (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
SYSROOT_PREPROCESS_FUNCS += "relocatable_binaries_preprocess"

CHRPATH_BIN ?= "chrpath"
PREPROCESS_RELOCATE_DIRS ?= ""

def process_dir (directory, d):
    import subprocess as sub
    import stat

    cmd = bb.data.expand('${CHRPATH_BIN}', d)
    tmpdir = bb.data.getVar('TMPDIR', d)
    basedir = bb.data.expand('${base_prefix}', d)

    #bb.debug("Checking %s for binaries to process" % directory)
    if not os.path.exists(directory):
        return

    dirs = os.listdir(directory)
    for file in dirs:
        fpath = directory + "/" + file
        if os.path.islink(fpath):
            # Skip symlinks
            continue

        if os.path.isdir(fpath):
            process_dir(fpath, d)
        else:
            #bb.note("Testing %s for relocatability" % fpath)

            # We need read and write permissions for chrpath, if we don't have
            # them then set them temporarily. Take a copy of the files
            # permissions so that we can restore them afterwards.
            perms = os.stat(fpath)[stat.ST_MODE]
            if os.access(fpath, os.W_OK|os.R_OK):
                    perms = None
            else:
                # Temporarily make the file writeable so we can chrpath it
                os.chmod(fpath, perms|stat.S_IRWXU)

            p = sub.Popen([cmd, '-l', fpath],stdout=sub.PIPE,stderr=sub.PIPE)
            err, out = p.communicate()
            # If returned succesfully, process stderr for results
            if p.returncode != 0:
                continue

            # Throw away everything other than the rpath list
            curr_rpath = err.partition("RPATH=")[2]
            #bb.note("Current rpath for %s is %s" % (fpath, curr_rpath.strip()))
            rpaths = curr_rpath.split(":")
            new_rpaths = []
            for rpath in rpaths:
                # If rpath is already dynamic continue
                if rpath.find("$ORIGIN") != -1:
                    continue
                # If the rpath shares a root with base_prefix determine a new dynamic rpath from the
                # base_prefix shared root
                if rpath.find(basedir) != -1:
                    fdir = os.path.dirname(fpath.partition(basedir)[2])
                    ldir = rpath.partition(basedir)[2].strip()
                # otherwise (i.e. cross packages) determine a shared root based on the TMPDIR
                # NOTE: This will not work reliably for cross packages, particularly in the case
                # where your TMPDIR is a short path (i.e. /usr/poky) as chrpath cannot insert an
                # rpath longer than that which is already set.
                else:
                    fdir = os.path.dirname(fpath.rpartition(tmpdir)[2])
                    ldir = rpath.partition(tmpdir)[2].strip()

                try:
                    new_rpaths.append("$ORIGIN/%s" % oe.path.relative(fdir, ldir))
                except ValueError:
                    # Some programs link in non-existant RPATH directories.
                    continue

            # if we have modified some rpaths call chrpath to update the binary
            if len(new_rpaths):
                args = ":".join(new_rpaths)
                #bb.note("Setting rpath for %s to %s" %(fpath,args))
                oe_system(d, [cmd, '-r', args, fpath], shell=False,
                          stdout=open("/dev/null", "a"))

            if perms:
                os.chmod(fpath, perms)

def rpath_replace (path, d):
    bindirs = bb.data.expand("${bindir} ${sbindir} ${base_sbindir} ${base_bindir} ${libdir} ${base_libdir} ${PREPROCESS_RELOCATE_DIRS}", d).split()

    for bindir in bindirs:
        #bb.note ("Processing directory " + bindir)
        directory = path + "/" + bindir
        process_dir (directory, d)

python relocatable_binaries_preprocess() {
    rpath_replace(bb.data.expand('${SYSROOT_DESTDIR}', d), d)
}
ߗ|m-0c:(^$wLIN{9ZuRO }weqJ79,f<@x#5d""ߗl7i *2yǭHLzT2ї_gtJ`%Tx[9cFd˞bwLxI]XA䬗L/!7vB,ﬔwa!/ʗ" ҅.ZOS_l~^jτ^m^'m¶׷Ȫreu8bs5ޮ~.WNɑ#zìˣ>=ޱeUyKj!{( Ò4Ddi})!TkQ|ηNt5G$SyR bġj>~5[I:cE%u 6; 8z?]j5.X~zB382 e4])(c{72Nᨊ}ot;#a.VaC*`(ѱs|Jύ^,T@a0c+Ql_J"A\cRuL6L\T^NudVmu57 OMz??*싧jk8⒱M[A>Oa|jwtGru\'\iNC 4R>'D5=\')럐}oۈPH33@~nׇ75}C=!A8 `Uay)}8t|ݚONJg3/_v.1=8>HvH.4v>[o) `I,up48],.ʈz6T5LE,r.2/uKlSxwO҃}7J+I29[5 jL#͒ŀÖcr+mYwZ8i=LsXMmB& 44[ٳ5EgsWN:zrӎLR)V#F:dSd2wk8cFWuVqxN F,poî`0!ڌ8phG RF#N.a;#B7=0R8eFgU zͥ.RBB0@ozgP᪱;㍰SMQ^fێc%!:ͨ.ܕa nmgVEa"8<{c6X ;L0ڭ}=y4FԟEuӻ5dS@pyHvvУU~*ϮDD±×WɳĿZ@ {#t]oI֞X>Y.-ĶF2P"ux|ն4YZ:!;jpjZ@zx 3>eDŽMVfdr*w!seT785 Cqa[o$\pc4@6n| p-TBKL,Y~4$nO^L׌9f40垍BTl<_N}#1>odЎK6z`_Axs+ZOzg>VD[J)ٲGeC0ݡiW;"t9yCAqH'>#ȽQA" zI˪2<E4'mt &pm_۲EӘokݳ|}VцXA9L`HP z]S.~į ?|~A/x/#-#=[`Y{Ŗ›LUEz$ `ߺj \*9r!Ӎ˥^z#& UEI1f?ՅKȔmnؘ8 H0MjcEU>qLm]&ҥ`C7/rG+^?u?O}l9Tt=rrBZ9 "|><-fO`Sgzä( V0{rx RZQT"@*=krJZJ vjL7>n8/;"{X [:?үW?Fo }|e>os&`>\z`鵍"> Tgz?FM͝b7äNǬ7Z %UN8柄ME/0)}LJߵ}ҽ{7]Kqa韄"Ѐ>{T{/hpkc(qOu7^xrG.rD9^NW;&aI mT}*Ca @i !&khG_$OViHχd;M4gc{6SaLXyiPhP/s/CUo|^_$$@Wy_u&=@۽à58T Aw΢شgeOцX7Pb5~0'rc Ms}:tx_GU`zkIdش" >!}^~VHSde`s!?JrS)DS"RH(Jc#U'*'L6!sN r;|q-;ưbrDI&bu?JKa)â~_aM=%3ϒAٔh֪jt'Y| VuҿƑFo;=dq#)y?䇮2=rBך,3kDvLBm cd1!~036C'ea+h'd='`Qӕpa?+V_ݬ&$Af@_UD Ya87:{q!wpR(Kp3rc'6GIa4 *i?u[PQDsY*?z8$_7Zp3*2%s)G3YBi& .LwlݱPn9s>߫*3.$dɒL79;m45ANbD1Rx%Ry]/DkނAp9KTyY֒5Ij(d8o5jeR%TܿoD\a `$3@ǾLaso9Zy)r*JAQ%IFOo(lLÐFIGiz #Z$$22|uo7Aӎ+3~=i=}=jYP2njpW$/+ˏ˄|(p36[dh^ӱj P"d|El]Xxc@1v3C00_^?_^͖lbْf!(uGpY4󳾌NHDA(@X-1N(5_L8~cZs?-㘊 J4xYjI״ADDnҍg/{8Zuh,Wr0ԩ' XV\" @W.zj,sLӼ [!;?&.)C鈣VZ >CIV;~!y6"M(nTjٕcj!tf1Ѩf3`g>ۏ_<$n{riK5֬"#{Db/fD[*EouӔw&U_"r'Gf=n –O^j-G|ʧD8Ӽn:7?wt}Ǫ=:h=Q$sD\Dr%ഭ /f#Ws9X4/Էf M! kì嬉 1_V$4: 7=5q߷^s80$P^"?_v$BZђ*7F<*XURZZ^TRurSJQ+jJЩ+\Gvn8GD}/&`,bZe q~hLu $H*0&@&]Y 9*1*8.Y,,# !  F%AAC0M!a M S!$G;g6YOO28uќĺ0xr\8o˶ۑi)X5|>CuG)\=[5gHnn-7ۚ %=r )ѼP(O<;|)٘ lc\y>HTHpסm@MD+ 'I% "&ر$b!(A""$!@/o !^)h܆)c`F`y hH!#RI ~xEH*^Tw"¦($Z2r Cp :%C<7|:$4HHnH7 N+$d*d-(vIbz,p}Ws1 :<=OQl͏ a"~9GT䞸{ oቺ{_GѠ?G>:tu&"P03 31;&#ծsPa ygognLguw rt֪ &ƅ.S ~v!ÿb !!w+eOWx(=9)W2q$$:ԀsG` ,ۚvG@>ӆf9aeDE<\`b6WmPC vs81TNƏa^u6z4̺$D@`UWP劀HnpFSɺ8DrLË?D;4y8g =bV6䁺Z0#+~hMC!Z3t31՗rH(8tq9͙ܘ- FtѴo1&LCM[k6`?bfŶ4݅ۈ!Z>DxK ’~QT 0ATX} &9%B:@W0\ S00G0kFiPp333sp@11U300DѬSBb`8&b b(.("8f 8h:TqS1pW0pYdX X % D. ,$A(2H2HHC,$0ʒJ00, a8 $A"+$#$#+a+$ +@ HM3aLA$1& ƞ<{߳h*|y&=i<PVvQR8@BQǢm{Y3sFđA65"V?ZWS 0e[5@H7GX!ǖ Cpħ,CɁNDGM20WgzC3hbb(;H$mƮ:@G&{QێlL+jmjjk5BqGpgUlDw!$Aki' m-϶WgB%/: ^NP/x]E73diUzµW.GFUUXvb)^_} ۹̱`}a6ziV LD+T@G_;FsvkR0g% ՃFV?(MY*<6JplYIou6Գw5eH $#\Q=?v?oO 7L mNjq(ds`cw?1+ er$Wk>Tc%4'Q!Iƭ~~9ݰ>rwDPRξzYнߛb fXj\n2mo~QZ ؙײh bÂz 1|%9PG"+Tֵqgس˟D~ֶ( =`ŵzU,`}D1S6KON5KS5B$! $7QyAY$-0 O 650)&@C}$^ 8932)m1ip鴲pڅ' $\{14GZƒ&ZUKӻSLf8;]̅ƧVC$Ii.3 UtÝI7VlkA"ݷXQDv Mqydrhe'L!))09ZZV-}$'\&&j{9u~==yV1u䪉(uoUz޸P{>wUhZȊǼZvXe OKG0chU3p8YPgW>V)$Q } dT]gB?#OݶxGH6c=98T㾂 Ϧ6]?F6~3jY$%r׆z!Zl%hdDѓrI)s>~|;rJʊ'\:D 0vc䁧iag Z-4#>HOpA\o^(8YI7;'Ҩ8@W"B8C4;1oި~7NzDL0 g& G|53*[UgT6% pfkMa[? $=~3*~jkuoc?gbCvh#=$N">**Z8Gn/;M[> ;4Jo/rc//É7?-R&k+$xκ6C4>1Jz"Guk`x]#.6Nnjb7 6> 0D7t *xId;IQ{{|x^+!g{6ɜρNIR&:9[-lwG EPRP rg>;>@U"% M Q @PQPCCEBDAE'RP4 5JāMP|ؙ<4QIJ$ BP$.Ha&-൛CgO^""%&(s "[]#IHLdxAGyfvL[Oɘ[KxrYPߣT^2j̏? $pG(`Dx1cyb4Ĥ>Nd_ ϶yA|yﺖ=hF;'yAR3L*tJM  `j+,O?J.gCb;gY4=()`X,,M*6Y }M[ْά:8yv ^៨'FiRWq IH]Wi7oPcޗUaƢ*"7_܀F퐷m8w)@^ng.σV䠅~v5!/(5}1ƃfw?6RT7"XdB“ `U|YEm7)uCPm#?Wfq'3RINk"Uy+QJ)UPȣPa a f;wAFGg)!/M03I iu0Ep._\H,,p!=yo(3&+inog@U;(n˾AwT~(/#BڞSa m}2A׻l9FOfpFpzp8.<{%,==;/1|?/ԕifgJ7E59||p'(βlzf uR$>y%.4/\E \Kߊ,trúBaԋʂTSddޖÕ'뮯oqbLϓoR6J'ʔ6Ⱥ)ugx1eR{0]ź/ ɋ%Fc,ʌ8i]Tފ⇫kDo:Ii~1ތ$Od <N^Y!>dO[>E\4gfF/{9o~f:C߶ w~q085tR*r*KeT>} 0ycJ5jE)Fm }h(&*P ߔ+ns$qN WJ]ש5h; Rэh?V% m'(#qCzp47]~P~<&lK*ț (Pf{SaZY6zJqRКv$2pB0Kݏv/YEKt3~@V_i<3 ^M; p}[17/YNbBpe,՚bN^vve15An[&$cO7 rj]}@U&?8"Rpx!6-^6|ǿ El7y2驣NCW,xbxߋ ɓyOOc>^e5oLn=a2k q!p0GafJBX}_,ਯynɆ 24!?8ڱ/jӺS2G:O|UE&\7y xD!%rժө!H{r%/$ d&Lv-C|kWhƤFq7Ũ ]4g%wqiQűc=Hd0p/YNOErxBcxPkҾ''N6D~h} ݳZ)W% ~Uwcc*k5}+p^?a39f%Lv:x/ {:$dž|~[ :U'8C͙XyF@珝qIlr-ƼjAohe% 9nMbEКY}􆡛3p$3h*0%6 `@wS7,دaKשbFVp= mJtd_%TFNj^"jnh h؛`4*O_?IKx~dk}4YQw]<_dڄӣ3[lzkfO-[27 {wɫcXdpԠ*e\|:'8UF81 ҌCpta 5N7#wTh ᡂ. zR6/! U +{k9ނv]qb{L?xGhs:M⿆[o+F+)A)_Y*Ca,Nlo8bW^"1xw7`* B"D(W(d7q]7N)XHKх:$dAD::$LN77qt̐MW05E S'1Ɉ"~o*zX~ 0_hZ;W6Ȍ8eATpJ !=T_?7G`zl(&@ ɥ12Fq@v3{/aqx3u[µ>XdcqTH oەpո菎m2!xsc Az% $ǣ(14V{:hnb̠~_~W 3&VI,ۤA:|{r$&3zM%L!(C10d5A2 d@<`8f9k^D$4L%3 d"1?ܨ $xsqXD#P-4 ) cH@@RDLhQxwą6.J$E#A4K5k7`eTWۏ՟GD1)(, *[*. NKccO=_/FM6ZDmL;.6zLH@B}ǨOި~a_) қ'#*?$ AGg(:`d3 X G0łS}.0)"4 DD510 4& 8H%"$srPRP4k֡A()|;rƥ@=2 B`fMs:fm-8pqmrȜ& ҮT50j E1%' !%!G rT'_ N?(=S"8JTBd 5 3!2F<Ǚ <˅=x$ @!"i:Q낡 JOfcp%)J dAB4!CҴ'=z>H(a"L@w3(BD)))ii~<8㈠јSKTy N1I?7y}ٓ&.΀UQ!8|^|m_;ȃqR U~yAnԽ adOiyB7OڀŮ_{˞uhh#?P7mjkgtHQl3Y]h.ȃl@5S1rf `\gt$6}6^n?u86μq^7\>гnMkbWkޯ!pa ѭۜKK|ukAG$zfM&It5ս ^&t,uf Ժv:FO_i \a RR¡_.D,;(o=O(ß%c\ץQ5Y9cy Թ2|5CI{xd Fd@^sC Ui܉MHۛ??.%a^o?Y?%C +1q3&21IF,b!-jpq! h\>|l"E!ò  _#BoI4|ɢWZ ;KLPb֖feV( ĉ{j\g=dq, 4+v}xF¶[*)ƕm6#0/5PGx_f}}a[cu8o^2MzAg|#|[u 4eI3C\O*D$,3'Y1ȭO2/bF3}ٴp}6]YoLxr`܂|ux_-(ht|.zKn4Bۨ٦}p/75R֋ҭw[k^q#Y!Jкۨ|_$Vc{w' d`ehw-ºd6NFO4 s){|qrXX٨]Q*\xp^JǿG0nx2XMJ(&Ha;rWFxiYgj&dm*M1(Y MVl.;Pb,3h4dlo3-/kS+lw&`wĉa/7t;qIlaTK;jBx.j;ƥ{+yqV\: Dl)i׌q9j tb؀if˾u6~,Dl`wFų`ls4)_W/=*cJ@ubsԨ_vx/OCn nny|sEdpWq7MpSnϙ3I $EX=g WA/4&~'FesO9 u֮>\c5QvՔ2ODʯ ȆHPR)R"c j c˭hAҎH~ .ZƲ^.uH͹[YӃ4x GYɡ%Ų'w\{GQ;TPPqOwlmDW |MEzπrSi]ܴTITe&8p|oцhg^&{nw2GWv~a/G?~ptb~ɶdzKe4W'qid.{`"M 1؁gᰩǰe .6Ԧh}CWw3ɉGoѳ#wl;?4p¶:Έ ~= sLE͞'6u8<{r"W# ;! ;smV9|^r fb0 _99&#Aa"~9L@4";A@LŇۧk&]3ӻ6 -Kq?G$S%͒U7feHj6`<١J1#7"#90>B *G) A<zw;O/IO&ߋ]U0?eb]a6e ׭gF0x:N U{+*D=X^IG(5)Roo_M$$bEmz"[& 8o駑mN,BY]yκꇈlF2Y`H7>\;17:^rk}anl3  8#c uZO!+:g&r}1.5-gM[ LLv._Qم-?7GA|zs?aoHI !$$3;ň."M@sǐV|rSKwPgąw|}R=Ȏ0:!@кf5"Bpz繉/=#N>{)#9@4ɑ SɁIx+wMkywOEQ켥O#?'Nйj߫O1tgo ed8GX͘N{ 6ac_֤6BAlfb.261Զd?UK}W 8Xv┹6BADJ`ۋ#--%_ le=f)#CUlL2;{:9^V= s5#ZUvEcO*/G,n]oVE'*S g8P5լsR+O5iuHEUT|Trrw?IP96G @ sdϖir qH20?{w9T{"``ᘄTPҙ 4QY=V!LIAq=f{7ܤ|* Ms-kZ5ު@C}ђ+T0P^ A7;eɏ:&ÞzYw?Vi!&홂to Ytsmݜ=$ۑ(QߝpY쏮sIOԟ]?_j l 7$0:*|[YiӺ6&)? FP DY뭢uwCB<tvq8սFT_^%a2WXWpkN\I=W9\%e]WW|ugDlYvUZ:,D&"`DaY#>ixopH>{Fol/@{RV3Re'z+[Obiov(L _\5)KV '0kXѝ͔U-Bc.85$T*oy)["Je5U[(#"h#rXq?C&,Mv@ǝjK~cG~I4 `[G1 c #¥b #:q"{TQ|#J /]sNKCԮ>_=87|_ĪtQn szx]]ֽnHz$[I7k-,|?9:Wo Tvqa㻶~0@W^op;)>ިmP'Tmg9j+*u~n6_IJ/IYaHLُg&(<]N~gin0b'9fYeRW!#9ExԎd[t$-FZo%leMH&=O>|D2zsNJ7O]!ߛs+J:D8ns-Quϒ¶6GW %<&.?N*?Li YDFPVT]D{ Z^@Neq\fS.J)g&-ޕf\7+ }V °iZWixρStIwBziqvq}/{/sFaze|&etbۃ_8QI9 1iQ3-n{ԾߞϓՆd7Ft~wKNzF>fϔ\JmRlc 4@AkE$[$vr+=e,!d8<:4r7Ƚi K^sh8K@~(Oo% }_>j]= R(I;j>7f{fOPTmqCk'hȁk:ECk\Ɍh>4ze V k"qPWn'Q)~i :U@=xw:3#=օo{95ŏG%׍k1\ol6@sC<8p .q؞]{(a @fqm<,Q x ὒJ-i>1B&A3D@la4 "ks2OmՕײS#'NnpY_) yG'%[B9C=J_ׅ@`Jc?%>Km ?~%%wI|8qJvmT~^\ɡQ=eI};Hrނ#]zIx;_?B0Q\[`uE}I k 5ÓQ7 v[<^q{Cg0% Z7ѵVտmӲ# ǂ\1O?Ɔ;*u#~Uus?&sNlED_uKHdǮ18k+sFyѷ9ke7e6<)9K #bjc7|)JK:/Cuⷡ>m\(ynxs0s G2BM4#X.dF%3&n-˜ljDe`j?t5~˩{]ׁs=W 5[JӞ1]%2wEOkxvʣ5mIwkY-v^1.A%5aA fsRZ;*F-"_nd;$F\"lnQәU-(<s@@RDvXvnXinZF |vv6-VlHNXQc-'SnW 'oo]gm{A<ͪWU(@]w#Ov́s~^SA ƃ$07J..\<έQǥ'~'uj5v>nAÚԑ/FE=c:S٧GHPE{,:O B 3%1IDi" ŃVMx]y 0yI.W0а+\ `~3ٶ_QWl1|Z" X2ʎXC B6y57w=XtFf[l Z<\WQ(۹z$ot 3J-#4qg1|UѸOF@ƭ \$_غڋia"F^5ok _"]L,w|e|}'%co {x8ڬ PT=pDc0c$PIc$$_0בꦇχIHup_J؈ ޏ3[KȲⅩDg6^|֛{#6ؐŷכ^;@=OKJVq#ݛ#L$cSYu J>J&.R PM:gjp/kz_y"CO䑵zECg| c\H(jqj%OdZ])^xMVl1xG|lu9|'S01]C7Ȉ"Ab)oӻ{iiv^&YX5L> 2j{#׾hƠҕ! 0cf"dzͼYd?qm}/ku έ1>ׅ\"}r*Jͩn3Cn6MX5dZ)ym t :M߯_dȏ=L2&Xp*=|idTT>~vճ˟)F5ɳ)~\^g,Me6)OһUu;+J{d?;aUvOUiu-4@jY!_ jfG@v18vDZ݈HդЫDɐ\yI&t,4S>:=""fa cP,Ҋ#*<;>!']&yۯRcjc67a#7xd2,憻 Yc<9?L/Aݿ;c|Џ7eŗ"p}jB;E=zhoR[6q}]|WQ^WבB7Y uWHF jYI3u'kfJ_nk ;Dܟd~|I$~}~{zńϝGS8:&GSrG#sOOGKN].JJ3"nhJzYAyTYݵ;ށ:Q"*b(|<5)^Jڠ7s×K]N AAPd"e=J]26 )@Gx<hq,>,QytWkp4kbhͭZjw'#(Ij3L:fy_}t'h3[:,c8z,l32}`aO mSScytfvv0<4`[H" )D1/ Ge7S`|LY+toPW_0B3q_ R4: 1km//V{,FVgk8?9WTGN-Q%PCЦ^- X,?CPq;թyvuFHg] *pjϮ3a;W(.nMzԼRa:(>tJ &HC]U%)e՞MyioOU8/yŦ͂5F`z^L(Ajd(`Jjl*ck!4qwG? kPAkkjo(9Ґ'+ϾTnq)pnS,|~:v"ʒrJײ%( oFkoEO7Bcu< dxKۭEB&qΈNP%ija>xOFjZ6LU-R k6c~H[S!ydK}o&{ֵ:7dVSilYkx$$!7I7cKu]a\lT_-S20Wkމo 쾻wa!3*mѦf6ji`eF(x'-w9./=\49L8YmPѰ2Um&3ȶUt0tܮyB[3i4CPGlZ9C#QկngyֶqX؇3Z%""Vc-<_OU6ʄe;BhK}]jFsiWP&'M1߄QJ\eZE*β8dv^dS§fw٥˞dX4'WZwÑlyy~f'G앱}S6ղ Տ(-FiOW`JBBTM1f&e#HO)-:a:!S}puЗ<ۻ?U*9*{ )fJĆ+k y56˷ӛF{hSrt \k˵jξ۾1ETwxN6\gBFN2>ʔ3創⮴6 K;%3iRM{_4-P i'"{!]щma뮧MʤI>@{$C4Ӡ<^[ZWHe]v6vZk#e.M-0!99wp4&;d]ѕ!GPΙee-h"G{&x3;+QW 41=",U ~B>NλxXdh*\ٓӶ+2f8D}ahbRe&Ƴr 5Z/q~cFpdn={FοVqLy=ø ^hqy5Џ9f*PGD?dr~9~6٠d$GP y0 n~̰K0PTSеޅ#˿^9|cufIhܷBNjK%h"ک,9iӉS{5+:#E sRa bf5|=D_*fv$GmYtL!FV9^5_VY $i0Y"&&]"8Tfdo׳}3umf!Sz,nkti' L:ϵ+.͊Ñ&Y/I1moSU5]Qu55s-/N}G͛OǥYd+t8s /Q|mh}ʹ;9kkծC"__g_nrv6ؔ)IJ_?O\8emYx9#Ya*OW>zsҍj(tݷRH0g񍤏X-M-7t@80(f-h-" vZ>+;~xղOfƄB,瑓 qcEZJ:y|.Wݲ{cݑ羊Q0{O o~eSl06[,^nY[|ƽ x\vO.Gbt~Z3=ږ7Jf9Ǫ1^:֞/jad LI :U/WAAbvBԎ1\ jK]E/eB^ga{hbb| u:L6a"3Bw:Ȣ x Xdp3F==MlRʼ9xxkij3峚ծ( &+Wgtnњy8dk~hfQ_?_[0ǝm8멑&m[0 Y5aŜl _P3Ή^HuO}A {*,/WݘKV4 i'c-M#J]pnl t zмYd|g+"">ÁGc,207^Ќ`Sr> ¥@437S znƾkdQm!.k^JH8DEߩ&0sPZ/`\dk~rqq浊zʔJӻ<} <S_R4z 4$ߩPl3r<3g\tc_v߬01>|0>jnm1̈́F9(39wL䭮 =kcĨ*ٵ }ovN/;p!`w&9fg2jF~j$ vCv"۝^%vңE IMq`C5TuF@ 2i?q"ވHBtޖN?l8AD7Ph&"00{ѥ5 A'vfm.#/Hw.Mm7f<6D)"~sA1 *l^ЖDB[;zXMuZatVBAlV5F&Kr@F#7b8 OQZ$#ld<xXϰ <'ccu#ǃ8a#ixM B`8=nWe['S| W"*B&)2Ϯ; qł Nj"7>^BP--$j//)sqlmpv!עH6'=IWY0,>b^s_ :t/sT\%P>JgxhL]ZLz]"/~^ȜJR%fgCni$:N `a5aT6Lѳ~9&&m U'l?8$vޛ,Q"r')\:h;j H %KDdK{m˳(ư ţe}Jn=6frLM.ݪ/-Q7 t.TVSļVD7Om湥^ضtKʧw:pBQ];>Nڊ{ ~G;-Bk=b"Fҙesc@R'xDh0[rҖIIη2amXM.J}l-@`pGIhȁ`(;kկh)}N Cp%Ot7۵4Y[iqAYU }ln}s;P9W 1SS/{`vE:HdQ`./;B19J׌9lϝ,m}`BEFϙ80G$J-GGl) +cqd&(XRQ9#n".uou;6:;[ 7l:7{Xt7VK/gI$M!&Q$@:gf1Rg(fJ]Ƃ#uTbHE0!AxH-2јBWC[& ȸBZV"W,' `[XNC ] .S*Wׂ?%֟ެk@~ȗ\Fo*t2-BH:LL]AaD1߮2=z c3]Ȼ2d6qHFٙ,)7d񕛾/ѮN$0oN8R3419`N꩎By ޠ=0C6ݴ3V /cJsgA(ScJv^(ARmN{džs~ pr՝Rr(hی@/{k "[{ъՊQrhH(tNκGT˪BZkay"ٜ!yU9t86pg7^^܇)ɺ*D݋7NG+Yvv9[X&} ]10Assi*j?qQs$e;<="3 Y]v۞nUs/$o<9%MFJ~'{#|b2ZmXaʷq7d@',]3X^d]Ry4W0z o: \<#)+ )#R!jخNGX1#nmOz+C8Iвw`Dd}ܺ$:,F @s[Z†Dg6И0Mf0e,1gҞpPqTQU >Om{iMA I ZsZc[.>'gz ߍN[X̘&:yN:/dfan@..G`/pȼ$HF.d:`V[cz̉1{ve0PI}`UFsA& 4 yhJZ{[b\2H`V.)ZTw:g8/X!pkt &C1a LɚaL֫7ٽlD1@g%3qlX&nf[®%+"T Eh,ټ^Pl E箻jZOVziqÚ wr @"ɠpF|J!yS (?LhNѷGucgʭܣq>G|C[g^-ydH&AҟAȭv~&U<#1w]t1--E[x{,ĔZ!,Kҋ|Y$2"8>i5f;Ve7gR"Zj"9-OǷ@y7=pXU8fKPNq&g+67=KJc&4vuoN猭BIb5?$ibX4HrPrp-V]ϰߙC4?(cѾO$nBL3ћJw(Of[ezw Ld4Y2\6zo-w*JÝddsyhI:+D r\ig,;I:F<[.+q؂ Iӡܜ^U6eEF?[s p33Ͽo:Ξ ۇs"'0B6Q$Y )W0WBm/,(lsRIj}~ZiA\áTx!bV,D1sO[IBPwO\l\&al"@qbUHi#>Y%6m Xh݌̾&a {\ 9h>⊗-=Y7 'xy[K+X];jpT{/eYލDkn L!fC unm'knvwJ4@A47c/pGm\xIsbϨkATY/ YTI,?a<K,.9h6*>kbA(y9A{n6M} 7k18Ac*{щ-p5Ǡ\f͠/~C=4xɛ][f gy ;1UMW?R ǖgkC2vCSZI'0Zs}3v]opH&"; Ew1dbr nmc;C0iD;?4HlJD$艨hBfr<3^;7ipq%ښ RhfJa-5#s<%>2O|qN;Yǚ%Fl䞹i$gW~j#IsNsgW+-Gs'JKk(1>7BTdj>%20pƶ$[v]ՑzLaPDl<9rmg-pam/o|6φOpD9 Dˆ)8McTqԑl, ;Q iz-µtuKX;M#L4ű<9҆ՅYr2,kjO04G%j8>uKǁi;N}b-qiP@8f"4ª"&(ynth!iTfu?NXoN;p D9xgStlf>3ȣ<afkD ~6=[zs6 eI \]Bi. ^x[YEkt|;f8H 덤p:KkxB,Xc7w6v0hdS}, L7lFE{0,sjo)5uib`R2|2pG/7c$MߏWg 5< :yטIdL8#m]+NAiR" CT߅ 7`7BY;7d &q^S93lb&EДX/VuETJRM P6DTqgBD9;PǛ({1z {C`\&fVպNrܵ}GӅ6x7 B+XBd ˢQ7c#O~Ҫ5:^X XN,-~P|g}Ɂa&ܢtb9tG6"ADʏij~LcgAf=:5//!Ϝ ݈WmbQ/'XYX?OL3#P7RP9 [YmVv :cur]{/4Rp2é›~~eqb%RoS~O1b_'i_3:fr K& @ʜ(81EOKlXڷ$$X(|tz8۟Qi= ͙DL~ p˨u~T>vc 0-^ wz„MW?=}G;qyy{,#h"_E7|W\#y.b3>ռqkw>qw' q{ud|x&}__燫Ӈ:nxj<,;!7VdryVﰽ;#tr?|T0:m$SA  rf3PV] y hq]bNF4mS.v:Kr_sNV}R6)6lߺ@F7LZY_:=@ICgc138FD7OքOeޮH5ڬ//laBB\EH+Xh<$A*kp>//F64r@ϩӆ29ҊĘ!ZXE3+_mGT)ql|s6?l -8]tu=ouO4Yb =ྎf-fRrAz1=|/bHkAA%fRC`ynPknxV< VqB ]~Xw(+"lbDvӀp9ޡJﵯiÎtuČjRN!̂"JT݇T}@:Ck| / t/kq}Z|9`-᜞ۏsѸPc"9ډ[j\epOA}\0#7u_E?&ϐ 'sQOsZ}g^ECĎ /p-fhh&YϘ,6K8oc;w9+BnD>,yCrv7-^/ OcqU߶!,v1ebKϚ9]{Һc#2:Vcp’(ij2'" BHi (hR*bh&9,,%iX L(9fkx8~GaX[cJP=`IDL3Π|k~y\#MPG~Xk[DݜMoԒBv;=D1Xvj~Ǫy3ӀDR3FNHX <_EXOړ5^8:<>rc }X0IQAE2"-91S'q Xb.@ȢPs#M!8c8$4fI@RDBP4 ID H\*VC34&ir@)HiZCPb+u!4$UDCB]Ck0AL.4CF69aKm˞S#WlnÉjdDkk?_,0pF{_m4Bu5P|) lOtO?.0o|vySu.nxZ['>/_ F`O8F P?2 xg~z[v^2};Wu޿bg yNmxFsWyβ*0׃S܆ddm;p]؇!GȐR< |7CȫIqg=J'o.%q|]Y_;A֠'v[lc ۪w][ٙ$%NAmj)a׏^z:yiaK\7g+MPIB*0"k~~ߌ&bd]ߞ5ε6Sqˬ6;`wET*2Yk׷PYa$*MNX$c tKs!CL.r!ˮm_Js8|!NЂbUqAH8ƆDC1L$~ާGIJ/&R\fkFÇ,~4V!??e R1TG>fQ V(}.%#i`#G@WwD7hh4„Ȃ4EzhFp{ߧ|د>p| Ŋ(܂c'ZAD!&ml]GΗk5NCac  ( dbfKp nb۝iUJTK%)5F-X/΄mf c8dB H,m*&LSon)6r}}T_V*鰆iJ]5U4TT&Pq $ՖF v`?BN]d2Z+qǧ#@ Љh]4 O*DG:Algc̞p퓹>˂g[&Q}Lq{*P_/Aq%2"'tL`~Q&4/,&4d"6_א֟95Ƒ"c@j%84hG`ܑ5F 񘪿: gԆz-$G3q靐f,' =]02CV<.1A32fgCܝ^Ǒ((?ѣD35EECE%5TD%1DRPI_s}ܒt>c]t wQVZA!DT ~ 6}.oqrМ~~oF=w=>˷7n `m72WHA*9oLDF"pV0<91Z)~ xxG6Hَ\m!pRddUʾ J0P?!@| ؊R.4A3%k;8O1 Є)GpÇ; ΝpGtö-_˻CPVy^7-K:J+}Vn14{ s`@hE'9.I({SsOKPwؤ!cə $c$O>C.k}|<})KӇEkI\g== Qn?=CF?죄iW*{"6S :SĀPn˺_l7!w׀csKꏜ.q;pA~n؇8L&0]WZ]d5 !j='Q; yHrc:@l~ gIgm{ RQ6ڃyջauy X8O@Ӡ?]L櫢Wgc.3$cD[ inW (:rk MLjgDAtkm ÛX=c" A~yp6)张V1G߮|߄ϥjGԪ݀)U?O~ Iǃ@R)_^;ّALYb ^gpY\:g,?WH}1vB0cU9~I՘Q ߑhП-"%.ppbdbARSqn 2122L8HPDaREXAsx)s C ?=g|sgEq GQË-i<'e$.-d504p}O~=~ abjwW,1,AA~lְ",'LtQwnv%dcJudj4a&D61fxabtP}`qd? agx#HD#Ujh#1~߭O=h< :r&V䚛< 7e،vTHښ%(M fJ 3ߋ?F*p HywˮůI0ΊH`qk5\'}D?t *Vx0^NHVX&|9QTJ7f#_)PMh S6;_@ˢb(7iD2i=!;( D)0a+z9 kGh 箱kEh?q7# ~{o}~i~л|YKY Y->kt#+73N>fI$G-E>KiD;Kz"Jgq^Nut[|hڜ٩04ڈlj5- Rd't'.;=m+J<(z.x hy*QwHH *R=͕<}қ50Q v3c!!j7ŖjfkEpUsuonFvÉ=vk٪P`SkGZir%rK+h/Zx\8VBR A*8;bWߍC9H"p bQʄe"H$2rUKpi! J)(1i:.$یa#t\&^h~eG241/;xb,7hczUU`|ީ0VD}L Ifٯ0͆U,$AC[#C%` C-. Eז-[w^(ڛιuU'_/VHȟqI/Մ!B8!/8qwL=Ql2]gOʗ٠b@;}AtHk?ߪ~zJOXxq$oh ̦SZN1kK2 l`8M,w&FjuI(_5kC?BWRdy>!$n3=2cIo~7U^]햍&-+ =Kfmj'S\95^nP;_?g*!R8#Qz4`s4M q^=OpGU֣Ȧf2S;ʁ,653ܓUIS1.og~nvw;HmO#|B Yhko/?׾װ1b kL@|LZ&)"#m?9xΜ5I9~caxX茷e7h{]T+ߍ˜$~9i(_;u(N\Š ^j%i |6&F>myOv{0 HGn!N'_,`Bs 4m\LrQ0vZ"m!S{l8{9z}Jg91 -9Z#yHce's5_綑!^ #C/!E;S@S_≅8E9msi;ʭmH' d& '#sХ3DdlqK9OC!;8=(iScDl2'߮Uԛk#;f >ӯ U&V%7sG]ʆCr+pUc`7 g>&傤8saf*l@’c}rA7 `3K``IBR:%.q,jt.Y[$|]o@\L?Ǜr{wI(3%12{,n\a"EZS'^` ~{CWO)=8s-O3ܣA|o[`Fqc,$"H_RvҐnKİPV4DaΣcC/ͧgCd[a??{i))[ Z}EGsVSv"fsRؗYW`" vHrN1MWKfr}@QXs W\1\wȐJLQ*dO:E=S,ʸI՘&LΑ̳b§/TVACƨT bҙ8s|nM5(7V$,XB XH&Rl":'̶cA@;{Nz. ҳtꮼoR6CoaE6C\.%I$nTSXuɝE)Ү ^k9ng/7I,r]Al&d$/>rwЩtG8nC]R !i9Y3u|lf? eRenӿ^tnӞf'f]H]-/n!=ŁpGN8ShZv)È $UWUPI ;֯b:dEE]Zߨ\z+~V^1v!cq؟SyAv^5MAH2|yBAY]9rṇPFTY"sq~==\&|.'N𶇡ON0-=VrF(2?/o|}v5m)VBYN$ \PQ1;oV̵=y]YˁBrz^LUf_Gcy*ZyKFبzKy b[e 3ե5Q! TsrN KƘ۫KbmtSnl`cRBr [5h}Cp9[-uLfiRuFwq Pu-v]fmL|Qvgq:9^N|X=1К6[a\~Ffrf2-12 ;K4Fx5^E"p>NHԑm;'Wbij& bbg'EoҢ#݃:^8߾q=wn8Wʥow'S~ު"$/:ゲ&gwO[?-q^Mzz\GSDžW}c= ۖv^ujV6M@ȭw\oq<}֐5^4¬:^& Z>V#~#7;EZ١uqRabQuZvX=e* {}8۴ȕ%ߪ`X_S-#cp}|D/<)ҵH_(Q߻_sФF"Ϫ5%XׄpOuwz*||+-W-K s)"ߕ u|;]8$6C}jG)Cc&vL2eps'77u(CRQX+mzgGKP/a؎xS'xMmOsxJ卻pՇ>8رvھ\//&T-yl~hk-Sj='eC.*}|uğ_7s3lM /ӝ/%8r"f)Y8RVJv[Mt{ӥwN;8tl|7U#ǂHPwd 7iTp,o>BʱD9I,bR OBS?A~;K|_~Kssh\Hwqwku7l?@nGHNq7B28H`[h"|چa^b)@]S+8q7s*W/ژ:Qs]X'an~$y-'l}w &l=ϯ#1 D!ǣ j?v0"[?U˥U)r;!?M < yern##y ^M W2X_95jS8SU^E.w]'F'd ggAm=CfWʉږsr%avd[;h澒wC'նRyԇ #VBf9/;;c Jw:f"P3_2d%~NVNo*s\tKZK9qB\rŷ)bŴB̧˻qycP%Ak߄ >+dIH,DU4ȭDŽ!Wy"E[]?=LK]2O[el<,fyB*$% _vfj-|nhK*W|(5>0Dl#c\#kG u-gFد0̼~XR!x.><2ѱ@d}Ϯ!BNxe1"aLƈU'h3~V8vK:+Mܴ-ǜƓ$1#k˛#fJ,$z \լ6s+\dxV yVJ8Nx  q{o;6n~6e ,' cͨ{Ү(Z N*j{BYdXz];o3sC%&I֛MgۣMuïQc3:x@ߪG#i{}ӎO$fsIEH9KLnE5vHN@I)Zt^M6=ZϩIB9%8mF3^3_ b ^/|?eI ySO^u{w4[@>PϷҫ+ʏ&GJ!R'˺в8kxvRߛE*t>hI

<[o S*a[x\$Qug4RS_4Ga]hg;bکUj kq۝=Yxܖ/dk鵹FhN0&\.%'Ga<.c/Brn<O~wknceg\f@0U\MNR=錸a8Z䔫8ک KY̵}HuCq~=gV>#=S g|*Nn^bcѸGMdMd,͂+ww zr hn92cyv:FQQ0=a?{w5: 86.m2{Qv$ rk>D~_A䐈HZ2C8R`V ֚OPW,gE|,BN;Yߵ (-,4!? 1W?M^a~]<=PDUIvY4Ҿ)i_><(NwozY"YT}DW(z٬tz4%Pnv F3-&> +с0P4v/=HxD'pTT#*Q~i MF ?\ickB PKQHwE 93c>3XtRO]&X;0CTf aIwl؃_\!Ml,Mg K1GNNc p{̘f,hN%"n.G@}_OHfj1fyfŤGX{Ϲaf0[a :vp_,Y"$ywͧ\?x)#HbS k RNn* Yu"#f?A-f^%i:4ժLlt٥S}d>Of sQhzP(V)BMF1MKNújwŶ̥S͚S-{Rh"]josӲLoe-s"x3^S^m7@HJ^jvH.ݬb6bnhi㶞y.o-Jb6*wjB_$\'>8e#[kh̲\NU]rI$I>Ivw޺)'NIr; vJ˼r1Vs0a' 9D!MKq`׍ E3c YL%!|(09P8#Mt&-h4>$WGlE^0}n+am01I- 0`m@oZՕpxy'MOP1E[IZpŨhBR(̨riP<3S4Ӭ2mfLJfsNX;hw3;MrVR ,O.Jq #l"%Q i7S NcKFy[ۺ:_e>)Ӭz6"PFCq7{KN$PȄ!,PL ݟwofF .fYܷbTYnhˍJ44έ֢&.Y:%fǜنc;߈mm3m+eNeSupl˙UH۹NXT'J4?6J5j/