# # Small event handler to automatically open URLs and file # bug reports at a bugzilla of your choiche # it uses XML-RPC interface, so you must have it enabled # # Before using you must define BUGZILLA_USER, BUGZILLA_PASS credentials, # BUGZILLA_XMLRPC - uri of xmlrpc.cgi, # BUGZILLA_PRODUCT, BUGZILLA_COMPONENT - a place in BTS for build bugs # BUGZILLA_VERSION - version against which to report new bugs # def bugzilla_find_bug_report(debug_file, server, args, bugname): args['summary'] = bugname bugs = server.Bug.search(args) if len(bugs['bugs']) == 0: print >> debug_file, "Bugs not found" return (False,None) else: # silently pick the first result print >> debug_file, "Result of bug search is " print >> debug_file, bugs status = bugs['bugs'][0]['status'] id = bugs['bugs'][0]['id'] return (not status in ["CLOSED", "RESOLVED", "VERIFIED"],id) def bugzilla_file_bug(debug_file, server, args, name, text, version): args['summary'] = name args['comment'] = text args['version'] = version args['op_sys'] = 'Linux' args['platform'] = 'Other' args['severity'] = 'normal' args['priority'] = 'Normal' try: return server.Bug.create(args)['id'] except Exception, e: print >> debug_file, repr(e) return None def bugzilla_reopen_bug(debug_file, server, args, bug_number): args['ids'] = [bug_number] args['status'] = "CONFIRMED" try: server.Bug.update(args) return True except Exception, e: print >> debug_file, repr(e) return False def bugzilla_create_attachment(debug_file, server, args, bug_number, text, file_name, log, logdescription): args['ids'] = [bug_number] args['file_name'] = file_name args['summary'] = logdescription args['content_type'] = "text/plain" args['data'] = log args['comment'] = text try: server.Bug.add_attachment(args) return True except Exception, e: print >> debug_file, repr(e) return False def bugzilla_add_comment(debug_file, server, args, bug_number, text): args['id'] = bug_number args['comment'] = text try: server.Bug.add_comment(args) return True except Exception, e: print >> debug_file, repr(e) return False addhandler bugzilla_eventhandler python bugzilla_eventhandler() { import bb, os, glob import xmlrpclib, httplib class ProxiedTransport(xmlrpclib.Transport): def __init__(self, proxy, use_datetime = 0): xmlrpclib.Transport.__init__(self, use_datetime) self.proxy = proxy self.user = None self.password = None def set_user(self, user): self.user = user def set_password(self, password): self.password = password def make_connection(self, host): self.realhost = host return httplib.HTTP(self.proxy) def send_request(self, connection, handler, request_body): connection.putrequest("POST", 'http://%s%s' % (self.realhost, handler)) if self.user != None: if self.password != None: auth = "%s:%s" % (self.user, self.password) else: auth = self.user connection.putheader("Proxy-authorization", "Basic " + base64.encodestring(auth)) event = e data = e.data name = bb.event.getName(event) if name == "MsgNote": # avoid recursion return if name == "TaskFailed": xmlrpc = data.getVar("BUGZILLA_XMLRPC", True) user = data.getVar("BUGZILLA_USER", True) passw = data.getVar("BUGZILLA_PASS", True) product = data.getVar("BUGZILLA_PRODUCT", True) compon = data.getVar("BUGZILLA_COMPONENT", True) version = data.getVar("BUGZILLA_VERSION", True) proxy = data.getVar('http_proxy', True ) if (proxy): import urllib2 s, u, p, hostport = urllib2._parse_proxy(proxy) transport = ProxiedTransport(hostport) else: transport = None server = xmlrpclib.ServerProxy(xmlrpc, transport=transport, verbose=0) args = { 'Bugzilla_login': user, 'Bugzilla_password': passw, 'product': product, 'component': compon} # evil hack to figure out what is going on debug_file = open(os.path.join(data.getVar("TMPDIR", True),"..","bugzilla-log"),"a") file = None bugname = "%(package)s-%(pv)s-autobuild" % { "package" : data.getVar("PN", True), "pv" : data.getVar("PV", True), } log_file = glob.glob("%s/log.%s.*" % (event.data.getVar('T', True), event.task)) text = "The %s step in %s failed at %s for machine %s" % (e.task, data.getVar("PN", True), data.getVar('DATETIME', True), data.getVar( 'MACHINE', True ) ) if len(log_file) != 0: print >> debug_file, "Adding log file %s" % log_file[0] file = open(log_file[0], 'r') log = file.read() file.close(); else: print >> debug_file, "No log file found for the glob" log = None (bug_open, bug_number) = bugzilla_find_bug_report(debug_file, server, args.copy(), bugname) print >> debug_file, "Bug is open: %s and bug number: %s" % (bug_open, bug_number) # The bug is present and still open, attach an error log if not bug_number: bug_number = bugzilla_file_bug(debug_file, server, args.copy(), bugname, text, version) if not bug_number: print >> debug_file, "Couldn't acquire a new bug_numer, filing a bugreport failed" else: print >> debug_file, "The new bug_number: '%s'" % bug_number elif not bug_open: if not bugzilla_reopen_bug(debug_file, server, args.copy(), bug_number): print >> debug_file, "Failed to reopen the bug #%s" % bug_number else: print >> debug_file, "Reopened the bug #%s" % bug_number if bug_number and log: print >> debug_file, "The bug is known as '%s'" % bug_number desc = "Build log for machine %s" % (data.getVar('MACHINE', True)) if not bugzilla_create_attachment(debug_file, server, args.copy(), bug_number, text, log_file[0], log, desc): print >> debug_file, "Failed to attach the build log for bug #%s" % bug_number else: print >> debug_file, "Created an attachment for '%s' '%s' '%s'" % (product, compon, bug_number) else: print >> debug_file, "Not trying to create an attachment for bug #%s" % bug_number if not bugzilla_add_comment(debug_file, server, args.copy(), bug_number, text, ): print >> debug_file, "Failed to create a comment the build log for bug #%s" % bug_number else: print >> debug_file, "Created an attachment for '%s' '%s' '%s'" % (product, compon, bug_number) # store bug number for oestats-client if bug_number: data.setVar('OESTATS_BUG_NUMBER', bug_number) } B4BL CRqW+ҷ=ⷵR!\>Gz"^ = sM" @ӓd`A)Y  ]&%N8+T7;ߒWDT]GSѥCYx }UP7]]JS]_^vqMs§$ݹ!`K, {+wo P ߵPnu3*i~=$()IMT\hW9գ]J lۡ`<1ms{qma0^eiBO5|ؿ_[ʹu7ezP;S8J"͑$9a? Y!(ffĠ("2Bh-T`G=E?Sql`m5 &:<)H/+hg}#(TE.9%ګl?VzJ-Duhz缹8x2GEe+3 :!{@zĨr5^@5"@DS">kx!M(M\* {r73DP lQ*45"2<Պf]3 *\8*bOoM-3͗+Ã:K-Y 9%o @T;-@sC;(`ߊ5 ;j^1^a[P/Pd ";MVڷPIy/܋O\z<3ID <΂jwi Ɗ6OރPN.Zof!xOӭ4˝,Fp@2Q\򴒨V¦xouJ:IIPg`!\j+y@54 \. T8i~0^!.t8%9QMɹ mcd+"fڌGȓZRȿ0@;1+/.bq dGEax!Ԣ{\*g󵽁 ɡǯZF򝜳hm" R$ |Cc4y(F$ 7 5S|G٣Gl*^Y oC> $H4P(|G:i^-}zJqÞ&ćP3gLS-:5=o`㣣{vLpcK}Fy8ӡa罼H7D}E@rVRbD ]9xV+aտeN_sMqR4m:Jۃ1Rٱ3(߿dG OARkZ5{=A{vVFbg(V'%qxEӼ|T2"΅8e [q`,O׎{ghaCsϞ1CSi 7Rźy'Ʊ=BE5ಊ"Q1r '3=m>QL/wTuxء-@/g-"70*ȵ&K{+f_/\~xv]!EkGO%ݎjUki]GHkq;xaNfFvc6PRViN7$9 2ڑ_m HݘA =w~esJla'w^ A@qւxe?Xπv9wLA$>.@ Á0#Z2*Bm*mh8m\ 3{KN~gN9<5J Ia h|h;-mS}ax'&r;{ >'T]H,$Qd 8Vܷiuݝ 2ߓC3Lu:En0xrJt[B1//GE{u6 T析1qװGf&$P ~m *0m[,Iʽ^PU\GY Ub܄o`EJ +a](wĈY߆i.oь]0noa 94 N 4e *f1v1XN} (he nʂgwﻍ x75-02R rvΟ]j =F(/W緞Ƶp׫Il\?q>[0QN'S' iޘď*05z(Is;h(:{<>>gUcۃ#y',lGg2l]V *`a/ҾD& q8؅>85U@;7&>2# ըoH}p0㬨ef;x|ЩU9;mN!Xm:{yG wk0aBHYZ)| ڀǧ/pNwյiAqTt~Q-r,  00f~^!FE -oѥ`$4sRl|:4K~J@g617x :'&12OǕz6} qy\aA>[9>.3} [#u{2?YajCyT%3A(Fvƅ j!efkfri",ҝًՑ=ٗ8Oy禝u\"2`HT4`^@Ź|ԫ$&x5_HwoC=zu HN2DiH71_f<^~0(  ,HJ ":|:FȊyK*hm vWUmu|1Cvt3}U'Bb%.Y}J(WUF1;7|0j(9bfXgzlZ[^ܲ38`1l3 7zJRP5r.=0kO Y܆d?*41m'IaBAL7$A&y`ccm?9oˑ6Zh џUvk6/ʼ5aZF\/nEg-]d>{ga5gcOT\nwˈΕ0Lo~iq|VՎWxU# PPʯŜaǏc=;SB@ zL z]6|㟅aq`Fп{RoOВDޥ끯:%9б'4Zee1`{jE.\WJ\~Wrᝢgd`8.fNߊӱpĢA @̦usVy."w׎!7 e| `W͜58O2(!L?lA83NDH*s%'#Տ0Cc}o^ Ih˹`c 3ftP]MóIx,Qm0*"Qf߮޺U;7 @] `F0s΍ {#lG`8_; +k~q)\<lޫ Uɝ6^;"ʏkr1VLǹ6RޥN" &_v|,A9 j5$=s?El) Pb"s'P9*?C*mŃL$Bݵ°soW60[FGxM+!6y=Rsld?5%·i&AzjXTFoT7ض~H~G/,9w:wl %mlݮ'`zQRd}i=ߵ,p{( ݸEvN%M3/Qmc'ucF[2zxO6`\D{7Ri+n>u |>t;\YuN1btZ]P\(oP63FROR1U4XԸX.ps6 `"T9^ \,St=ɣՄA -N_ =DlTz0FT)(MESy`u/=s;'5UGjdAU Iɼ1ߙ~rѕYg֚C&e|ͬ9TQϜta!UV^⩉cr{,0Jbט^y͘FLQa*續E㞝?]ޞuD!qbw 0\~2nW<.lDi" tp׳|~{=zRv~9t\N)Jeן]}\&TW8aUSD_j2 )Ojx4X@LEUQ4g= I+` a%1jy|߼ (dEY_sۮCSTɳ3]R.͛!h`E ɕ@fUAP~q~ڂm6؏iP}qft0@CI-4j(߬C-,fR@EIЦɴg ݴ vCTCV)U(1$G*Y=!E?eP ZxT(X փ;= uvXeML5JBH{ 0].fݻ!s-BorEJ?"L ⣋;2IPS{jO9}(?}pނSMI b 'w[>׷]dqًK:aJcQ"ƕ}n-GP8gDbˊ MB M$9c &gonf aŠ@P*%f)!1UH/ ˸|6lU7h"GAfSH B"G:z#XhQ4kTU?9N1P=$a㨽Xhjӯ*/wl9f}M7l ⨁U*#p|Ωw bb!1L2 G=NLLm,]k[z-f>xY`2!K#Sܘ?#rӊdwIhEYup|G5L\1yߩ}>%Pp7ןGtRM0qP4"Q9~`tG1@QT@O@O&?s={+ A(ҙ~rzmD(@P(R:APB€d"n(Ah)2,!)ogYvٯ) hW6ڟf, F /At@HT(` 3k@Cg!_*+Pz]~ɵ;h? !T| ANIED G%AwzE7^<=pt7J‰5=f כH.b:<\0*IH@G5"E*!W$TJ iYg(@fÿzypkOdz:F0Ӏ=TaC~/f'  +ʻf ~cԅw IILvŜ~Ĝ'پS^ђZ_8QKuĴ|8x#hh.FK(5:w SW鱛X>HFOȔO9פ|Lqj~mr\(Cp순"Ty$;=*"E0(w41 EW^o}@ۆ;.3;^2Q((ٔQsΜ8C['kЭB(|pFG'˧ghD6dəpVT`_.@/HRh0޽.T?xp6t:nz(; e/la8pln,%JP(rIj'+2()*QPP`(B~I.f^) $f72EPdgYCG/?Cpg,B=Sn$^{7w\_hH ,T% oO-Wd Px'4# $ߣqq8F*NzL/nxF1Ӕa^LfL Ѝ@fHK7X] 7 an{;&:P}Qx 혇Y9UC\t2 %= yI b& 外]vo7'BFm:~;ï: LN۟.fncy q}0 BmB]c@z )ъDZ't-1`bHʑ%{ke= .ޜL^)sJa4xnMљQ#` hx et&J$XQP?|m(K{v PvDkҏ70&h^h-Iyw#jU&[,4 =.AivsJym8l03\bha-Pe{ &HU֓W1 Cik*it cO-&& ȏ;qɇISO0n(:߿ӓC(/9]/`͞5pQEѠ1p0̥p,]wKy2 +;kA7}; (ijlER=(Hׇf8^pcIxM& mտ2(b,vՂlyXLCMJRIЇܘ`,Cpg/hFi'&(7-2xذ7b5 % CJ\qaxP-6 'd?L~݆ 6vq?Ph_CtcM 4g{ k i ̱.$_ @4@xNI&1VK,W@zyܫzOvYhn0ɐf|jCj+4R;Bv\;9 DT =FsNXnV%N@C'u|Z|CY%FAfɦ 9x=T{dt`DkKGPx,56~N/#n@'šDC:9mw D=6 8I&:(W~pw >Kd :u^HPtDv:hm0Æ4Or|í<*!~ӪC`yE:unMPxnpְ07F#-h1FSqCb!m}E;v`~$jw*!ܵHS~Ly#v.hٵjh.qkIm}ڈREVK,(qA܊J)F*׀2ȉPT{2@5MX}HNDUQU/G ~nk[dBX5Cpz(2ζT7O]UsRdYtNV"=+6yB(0 i1xba5,$I C*,買:5gTjǁ 2ڮ! wf:>y* SS[E69$6sU{4 #aPaLGuauby(q ^bIh֓_8jz5O|WsU7W *;41XOo#xሿqB\xx/QC)12*<-kK#ܦj ޙ]eACP 68sw2jQt֞ԯеyGQؖ7 o E ٺlMO 6PoP-OTṉ c) 끝eߛ;aIt7kq0^83r@Jum#kh6-nYA, teN1p~j*:8K]Oy Үi⪪$;,cX ,᱈ b*Ʒ xpzڪï$`RRSAסuYX: #Nm'z|; q79/A:RӨ?. ]Ow)jqb&%j Ha$(PC?24@S(TH4d||5-mh)hh (8ɌēQ0D)0KMQҔL1/ 75Htps^"z[!m?E./P#9www7-/g9bj@ؖ䯣,s k;yjz]qipƘqoPF*܉ EIyOS=x7={Xc4ea@CL ml"PsPs $62 S LŃj̄^m 8]>+0p3"CL?o`Cy<p DO'CrxOm`Q#OdYBN.YaiuʀËR<|5xbT'"xEsYl!!*|ڡ %KѫP C^jUufBs,VwBiKB:T@A !jS.G=~zVƨb߉wYI`=́1uN! 4P- [/b$N{σ% Dž5>E>Xn>,kX}Q7Fgp!^v?bGKAj ü~x́4()4צ<_Ǜa<>T\0'2B>~%'D!TR&quNZn4y-0NN=[6 +krVa#rxbI;{clCP0#{fu~Ǔi`8 f8#hި*T[Ƞ#p O6CH]CWYpc2Z ?K6$p\CU$siḶ8[+~*} RFM'!qe9N5  ,˺ǀᨃ:Lwc(z@!/ʼG5O?_*ցe\0 xpzX!"mÙ 6J,EL>fg**ÔfdTQid88. bbCnE}'<0#ձBv \_@=b5t9XWjg]Tg"EL esqd#Zpf??h;//OwMP~Y ]sb}]%wrJ~C4w0@^! AOE H0ٷW*ٷ_g?lb~o!g WQ(?,l å"9w\x|>ﶴ=< kn< Q)|<> 1 _<0}P6*~#rs[2gsXxwUUqOW߰$ hwnNP]}zN>R|ZtʆI >^L5 YNRhG#6渢[At̪q"SQFD֙}xD$/@ T4&yz?WCC8kփg(>W+(E3}tQ*Jtk%V*+sX"&1}7eх kUXuPԩ Q>]"f|ATF/~fR7&hj0`FڄDa|;p E}&|qɹ婌zUrHhT,p/S7v.^rҿ7EYDekyy\G-<>p\ ˬ#G?ԲP7K/һycäGo5, }赡)ǺU5U\{"UPw5 <ٛ0UZ9piȍ/A  fXL~YAi1;_wqxjo' Tj162H8MjU%'&w;A*[\arMu5Isz;y7J|t6/51vTNA?KΞL &qx?fiuk~@l ؅<óxΉ/<~vx)ETr~r uX(#D& w*yHjCҧ{J.b YD3`}D %wyzc˳0˼Hf *0ilo @IaRRwĞԐeCŚ>j'̧3]:=bb qCWf6X9!n~Mփ\ v^SlMr٬Z/\-1#/Fu8WxUG?>">y(>k p ^0T@}_5T=awQ×ѲTÂRE^&OxJBx!BU3>̓!8^~y>*Fetaz;6ARL\\6E$xJL9Pt~5Pe2mƃϗϷiwNOA ΰާ ~otd8L1[.\Hs[[>_ _`V -?4 0T6MuIo`U &pP_`8=iR}u^ C7NzInt>~ vG)iP* +]l^TkUNASSǨ<4W'²WnKFϠ(,<STLO刴+s%K~xξP_>88/ȣz+$"l_N6f?D(U|dCݣ /58,E|9dI$N#}[}@KZKUod':8\za!Gp8kIN![p@M!HDꛫ;W^fQE0>~ZƄVȱAKM1B0ūrZ:rk(i`߸>+d+/?:+*/Xu>5瞷9 w΁i;MP )>)h tOfXop`&чD;݆50 ,Z$8^;F6FG˓R׎-2 Zա|kgȃ}º^תWxN+1ջ^ظ\@lJo8S}iv 7@x5^XKo_BOErtT2W L1ɔRC؋|XtPSrJF ;"%&o_? {>H}xD(Ӣ'D)P)0ǣvoyx낸V`s;VI]V|yB\*jØ:V-33ǬTIj8(Qj2^R4Y W_^w]v NlBV@<\`1BVBonzJIv-rxR tB;i\h^f(V 2أ pHjXY1j}k--6]kFJ/E8cִSoM,{hI^"Mjvn*]7 jN.xM'ß͌yHIq%L-1UImwK“UG(>{K|WF;Ng^Y>#_ xb'fOqhw28ipr0]C5Mn*Y?a2\&vBJLD]wxgnhNlGv큇ZcLj#/=5G~3C(ٺ4EFǽfˊC=HHyvgl[6m1c ho0V X + #b÷a_3XT0D q v~#\uo>ωi.TcK!Յ2-Q;pl¼D 4|%X8f,z;1h!! ߳gb$F`?\~{}{k[Ta/q!4|v@8;eXֆv 8K3d1mícSA=;ZkIo !WCg5  Oy凙e -Ȕb+@Oq|DQR( (T( U^:~ N#cwgU' 7lu [Uj\`MtB{]LCgr3m*B[{ T̅}p䂤&<\tts ue:;٫ Xx7A)bA: VHE A5ᧄ3>Gz{\#?I0/@D}`(^j+70_UPYW_ih˧ ] ._rH6rԙevo1K2&jxP!8E!AEPI/xlOqK_}e o$: v<B T#6=}u95Y10!Q y.q^B4|מJt )>[yE|_[pUw^)7kvEYj3VE̷h5y]j!%_Wl7=ICD-Q7ʈ\'Q*<~k^etʝ/Ozx­^ w:>nQsD)&'PX ^81NW\9}d/ ҃)䂝Y3r%ޏ̜ȝsA6won noj/ Q/#Cd{# ]m/quX8|H<9YO$oǾO٩8S5:I5*i XH$7GƕnxhT [YKOc""]WYM]\< ̀+g&:^-Ͱ9w<ޖ,:HD)#%Bɯ]~?kXny?=ֆˑk)<'`R*'G/NL^l0sPB=0~@{_|:F,JNk2MR8}1uqE'tM~ڵ2ɳ{X;tTWUi+2I3$PH (#"qQO\@VP8  ïOd=nTח/nGa~W@F5B?D`Mwf'4YxFouJ$ cn`UQ=$gɍNw=$gwݷ@EF`S-(" Eq,sYiAYPEmҬg/wnwRj|t%Sn6(o"ӢmC~=X˩wuttb:ƚjji1<{G}Q|u9,(%",1Ȝp3ά1ER`2zꩬ5Ek}ɄnΊ$(so8[jzp~}"QNB@,8ǣåzj2|1cs۞^/0pWo8]W2DbIȄ>8xrAH{,mL?r;|p<&9-7mP@7p}T;>Oo\4Q8 u'("z0-I5`) NnW.vXa2zn| ysp\|9AYhAb!rP$蘦 btgSOjWP zJ%k@&%A|F_VQ*Kkkawh9ҩzj(YA)W\pѷVR{z4>^+p g|Fy';d^@>*& d*pҕ9O50QwȰ .V皵8{SSlu U{v>OVzv.iB2NfИMmGE(ӯc h{ą'07_1bz3`_1R+26Wo6}@tvKb%@efCo%؎q1[S㨻,4M?zO`^LiO % y#~\^݉p8-ں>Ѓl6Y܄ï?|y6_Ě 1.5{@ rv;~;w+mggB-(%>wd@k,9'BG<嵶3֚"voϊVG8duk_pc"\R@lwFgv6>47_;r[0buci""݄~?@>,q0*!2e 6`!8H *5W(Xy9PKB+~k_E7" T }>UNuG2?o0e_>}")h_r0Po(Bv^u.@JFş+7`?^()e?'rq机}f䚱g/\Ye8!-7pZta }jS);|B$Sp8m~9Wa`O 44yq$GM},)P$>t;7x3A2͚%X`i'z\}>l[Z 5|*h:ϛm@9:m"7{bA`W¸ IA o#qy̽q_;fJ4+XKuNѨGo*p#/|Ϲɽ6T&sM;[ s|@_biΫaڌzkl#߀Fvǰed!7$">>&""fTz쯹puz^xb3(!CӺ'80#dtͭrЊMI\Kptڛq\PW ֓JjH/٦Qd@FK@CiA&b XɸH"FL/*"2!BvG> 6<|h{[ 񹮕k!D"% C2^4팛/MʪNNOoyhVZ\fDE6zO, aC 9[4=~r&w٨R,9UDfL>%A[N:}MieLZe*`f, u,b-qb\a׋z(ݬk<6ג;CȢ! T"c˙c1=`%$ afa+qgݾ ,r#*Gt宴Mr=Šzowo/Pfbnj3{ܠ?M.ptZ#GTp2ŵUJJ*1<Ύn!u%."*|ʻ/ B՛ʨ/%~ fg~_1ظy!Lc|~p~b_X(yixթB:C>3q֋5AnPz䜷uT|E;1n!CEQEE5}<_= rۿEk ö@|`Ÿzgoa3U28B nӈik\Ϊk*iL!繛<{@{%EhUF] 4]B(o)5z7``@٤wϜߎy´ct$s[LxMQ ȀF,kOƣ%,KN$J _(#<3!#BP^_-gT;pԿ6_NIx͸\ ȍ%V?@yJF_!SIx#&>"353e}u@,#X8n;H0=w)H5Sa2 :I\l& t@!E+nm r<;'FX!/v-wPVīʪQҐS0U"lVvHHWgb HLN et31ɝ7:5gH柢 Yr;<:ETTJ1`pU  ɩsG&r7Y #??=a0]+VP\k)žh9* 5E#Gۈ* C`|}B%Usq :orq;塑.y zč7G`qٙϝ ~0s~쁨yAV.a' U)B㝲pͼ`}BVT6IG ڝ3}bkg68o@VXj4 $Kl09{ 1{坧c+ k~WmA4?pC[o4FeL{3&A!+- {v eکC^~6E)]mn'n.WlՄAW0x50W6QWؠPU>l /TNTֈ d+§{#^Eb'uQt8W3}É<˟-uTVV iXMI#doV!84RI2D̬!Gg-#z -}?+_iEF r  $*O4A\PVX`QB!ٹš4jyuk(tzA++.lOE^j%+Q7jTИ -2@Rg1 0%J!4=6oᕽT*$E] L|{O\!o/Hr\~|mm)4Ayo>i؃`0&3*l7ľL DJv&§Cy>GCHH+RQI .C^VOn*5QJܸ߂GЌv=`y氘Fw _^xj1oe;NSQDZK[]|A瑿KDGsa_^$lc-AdSHW*_ReK*$'] )^BYgIec(Q,xL9e 8rs Q{9 F*nhe_DVIp]h!Z0>Ci(N7*>"ht# jD``TVr{uxg=EJmOԈP' !( 'ej+,kxHo[`UaP{B2 @dQ[ǣw_H,ՆvN_F^U}0S(#X74]t0[i)1<F d8ENӍcg67g-rr4-ң1S*/#EͶ2|mfLYo,GC>N2j:a>)"WBrv_TkhE`7p9#yޛ`$P&qV@RA g9[B{v*EciTg+~ 4b h @]{/L;;-bI3~尝:+(ۙKp]+8;‹"<.kOv?ju(eZLXqrsRՍ" ɁƏ,-2XbHq1^Zc'i|~#(J>P+^Cw kV\gpxȷҳ#uPvŵ ǵ xox-؏(gre<:6ҟ~9[ u L};-sj5O\+He>b B,2Jsr{UF9s 40`1GU0CH JWwCz}cD1E{x~&R}Նj m2VTܩ%Lҝ>g\=ƱM|ƶϞ-3(<^1CâlP >!P}ihsX.D9.ðYr p- }6 !(iݯ&*CXVm G&zHS}Aww9~r;iToMsŷu`zpŔlpH@(Uo`=;"4T򢚫CJEEULm[m'OM;"^k FW$l;EAK 񍙗̈́y - Ph_l!0>]Afٲiȣ=!"a‡~ ^o.,Ql:YGr|ƪ;Ln=pi6k6 HF{d#H zD@[UZrز.*<.mNm?S0dykV4zu\Jxf6=΍l׉ŞRVNr {;yRsxTEioqp[BPHXh}t@D2b̯[X<\Kh#Ta4AX<3rqcwf+S֒ƚ|Vu1tSx }uǧG^JeP ܇[P  p!W[:uKv=tabث}PkH\:\zᇯjEg}WMðxdsƉjti}+N%Ʊ`P1ӱŻOi1^r-u5QI0 \u%hGn#ښrGԨa`V)B|Mem!po#pb>[coNXgkhz>l0iXPbj|= @іKs:$ T "ˎ}ڭE9)</Rct,Sh=khRfjy5'߆+0ih1n 71*ϒ>pwmn1HKHvC;ZH+OtGf@B/ҷO6|jN&DH 5% x D!#4ÝSVj3jc#h@: ^ mjKb#o\V"m -Fd>?\Pсlѳ3>(wHD{pQӿD=ljcbGBφy;+x>RdwŽ_{X=q8tNQ1ǝGcu$Z]|Dz#|y)0{jӱSA}<b=h S$mxTaxp}D\EJ,<<;e3kjIT=6jK #pĠ4wq/5WLA^㥓 mv E3O5`z lg *#ۜ`<_,秹+ -}WK yC lauWY p8\co)DT(eo Tgv?͠\<ۯ[N*φqEx:&[ .*º"F0ju_uev5 :0Ȁ#L*e <ىU; lfZfaQ.+~_Te]QT@ $rHj G}i[!3`杴hE32q^#YƁR-8G=ednF;Þ/ y2\b]Hc 9@s   v>VY`0@u xyۭ7ZJn߆&pvVȺoƪ+K"I/@؉-q)KYͭ uU X9Q)"EI_R$>3 5nr:·nD fBC,ҒM="4[W`9DAZE QBTֹDT!LkI2o,ӮA/ -KhSJ&n.zȐkGRxD\mTd!e(a<ht"B"P"h@T :W0Mu^w͏$F/"8MirP?QGk% 3}= :_:蹀FbYѫRdmP +},g=w%8>8л=k!`Qs>Q2Q!Y|:ӟ—Zw g߾G&g[}az 1 HZB.gQmsq'TbTE*Ӧ$RquoRb0)Um Z戺lHPtE }Trfm] }=yLg1}VeyGs FY̮OLBbAna0h3Jtq{=Wz*u+M_ze4U~bbO0RG_ۈ.m5lSE Z_ y-# wEB?A{)dMho Sè'|!QDXd4Lz8M_nEc%'"#H` ʹI7ѡneG}\D)kICWYz:bw#Mժ`$ 6y5-u ka;XTm|#rbjc;h©A"I vnL?$lx}|k0C3~åZ_;|vH{AD"&J#6"dAo?t1#u=eՆ3S V˥+ЇHT͏e>"OBV%`@}}n_/4ۍ)%xY팓'3m q$ @: {sk0ym4nnJRmFC?A 3Q!tC XqNߛ(E84۩"l!ȪF$ 5r*rKRF ra&EEˏX?|BNOgxiJ}50w3ӶKrabDKʰl (d5oܭfJSYďWFco B׏XDiuCN6cV5[4c-n\"XR5C9\^)f̫%q)8," ZZka!Ņ_.:45ZF!svR6Af#?/9sIkr唦rM? &gNUT>7C+}?y=(Q;efooM'Bb"g\v r~`a$Kd;;GǦ"g! Rd֞Ј .;\Έסbp,M?运[DD"+P:]wXit"2J{IJr'z\8"柀XjK|pK/Q #<"0[8 Zhrdd6O[cz0BH2QlEB޿uW[GNפ ;Ӹ6%þ%GSDF:C'Q+&Iv0dZ|o{:il7 W|NXZ˪c@ rD;oi(!byFb,={47Vyu>?>x5;W tu*dۅ2 u2>u)=ZȻuN 77n$(+ CMIZ5d`(Ռa淁 \=C?^A&lTɋ/퇧0hx sbmI^T gL\!d!^ }An^ %)vI\{6)G$" Oԅ7r$ Ċ= 4AMGOv#^R"UvuP.8n0Œ3Q>/Zh}-q-ִe`Tb 2%jљD֌ɁE)+VE(L5EF.PhMNkBlc ~АktkO_ٯn($2^jC\+S_<^R( -RugxQc9۠wֺy ֳ ePyNjUOfC[H2#jgOa# ۪5: \cE02i\@J0gA t7nx2eu$@0&xS]P1I@q@r&u|q!D>j(C]旸ʔAO9D FwbX٦LȉNQcԜ&Wo]Y)M(]v̡ 0wumtF$IEJit/G~ %E;UbOkUQ`GE:2Z &P(Zqa팵O}֥y 1sqCVЩ4'm]ˢBo1pl9>o=rjsN*;&N|:! j.@َ䜯.&K MqLMvX~DUCs vX`w"hEyuY3Xgz_O䐷OS߻#2U#z5yPJ!϶Y;_M?<h؇pDʅTP1^fWa\Fu4-y87cxn'ۡU-UKL=۔h'j(3R넭 SA K}nL55'SL#ټϞ1 pwQC\PtB8)7҄%ءqH5O @(FF #}y6gh{es=)R~#OH/YZc-j{9c~^^ϏB$[ xGv[KV[$0SXN^1[6>TouqlR jtB"EqA Ģ + jtff_K!(`bס}ةѫ$,q0TPK}rjȼV/5icD&chxD*;_i9PRCk?n7HEQ‹`G9`S[*śʀ~pRޫ!ӫ7F@Cu!^8?``M[j5 ^v7tعGD~/n(T;,Z[5qgbB|6 g,YlS4Y}p!@nWU`T"jF?S3_NJٌB5B̡0ԽG;K4C,ٞ:ZEޒ8kf^ ~\v l(;n^fhailipwZεw!% Cۡ*!O0f&Kd0d~c~ ;G!E ۶?w2a j9ڮ΅Zdij|NgS?D}ap3\o{`Mso@_7§%u0 ̌mÞk fIo'R^=}"B! TQ0T\ ] jW<܎z1"1AL tldH4 fVO]2YX d( B*$6Gv,UL#fխrB.&5X ~K:(_.KNҲ-D~q0Bh.bϮa"ɦn,Cf$TYgL )Lf[ZZgxu,]yT{eOJ:Iswh29I,'QD`^ k1-c[kkȢ?/ݲ)nC+Y٤Tv }Z< PPwM;Y51pMٵGf=jY3+sP+]Z7.Y@Rȸt׺ϚߜnzޤMj[{1uP 4z}So>燿纸r2|K6!vC )E{zOQ,koyL^磐ʼnsg zPn)Lծpɰh#3ԑÕ@4tl? ^Fq=jhhgR0;zSڽoz@ b~LꖑVv @m}y72E}E}~}& _וnBꟖ``oF$ܸ}k4(װHGWYW>TxC9=1Ƽ۴SddKTUJf& ^mno Jkۧ~oj!>wg4ܧζsarz}AvzˌO8~NתX39'KRmm[hXRw.d&|:C,a.O6(O- ^՜n"X/ [ӡ|<뎵xУ+aĊG'Gxͬ $1 ^pzbD;ɒb^eIr. NЍb\>|AۥكAN,M-l4-;t\NSblؔ1+c739[L,UFV]bVӴ ^Ymk/e(y^;DDjm03}Ki_,qXW59Q|nv|hymbW;^y14H  5=nܮ.](2 ʢV)iqJE3ԙrb=8Mٶ塃~߸e*UX#S Ʀ ;C㺱ȴJҠ-L;*(o#r-q>AW:-0r9_>M |`ه\n2Ӛ㌃?aFc x^xt#)\2bO z3J&fDJ0ո " mFwbLCd$<(";- qf~zb;&ǣ줋¢x^qefT}۽׌Qm#k(5TpjΊ>5Gˆؑ+:, yFT 6ٕڈ:g>^xv2Ⱥgdu1& ,Бzn0>Dqb:]2K_V,ni[Ⅰ̭o8"bα ~X:"5>MZmB?70!eJ *Gο\UΚ!Lr~QдBQ66Y d <C;18|Ny1!z?nurhazj :gg±(=ݣ S PJscH]F+Hz쭡j+Sd-ЦivB ô1!6>\Qxl j^8r%H \$C_<#1&|ed< ,pZʚysӨ%9Uo'V59*(H< !r .H|BxH ҹ_L;Ҭ<%Wi/-u-UwmNF#F55H)} <6wzkNd<6>ou6ۑ_V9oh={o_d'"Ua$pQ@rTxR;Ů)j`%yW8ר%"cS?"FlW1)sTRڹy⃅#ô㧭.iS"Uv/ q1J/ L .h059&gZrPČrufg><+$*s}e9nyhAJtPAg:VIc`p0=uS"}'B:@ZkʫڇB,! ~Q4=v? .UAd@ p7/F/N5eP))IH,!1 ^qvkA he[sRFD` qbCzU]FRƗ n!is!=-Qt ,?U![ET*ؽ .^+aw-hgmny#U5(KI|׏gIʣňx+?sMMol82nM< =WՇ,G 9`Z:YqNS7dH]|L:pG MpGjلC9_Sc5 jr 6kXR<_W Cy(^v +MTn6zk>kw=9I-3擀*b|AwS%*vUl]nmr<ᘖ/:GJ :6X{9'@ ):{VY% <7XkІ5(VCޣu K uګ_ccT3# O--SL4\Rh}F),n$ںQWcĤ?PQP|ߑ|[cu^gזN|{}os//s M0>R%)7E:wXN2+mD6.Q.#M(:Po/1x#|u!Uy/z*b߶.\;-ẸWtjx!,eou" Pv,[_T;UPR* Ug$12k vkF\mﮃ*˱wfzvAF=9iٰoPaEۋ}n{hr6MlEvq%#7ܬR맭kзZtU, L׾01mp!GIJRfH J An<D@|TTZ^vqZ‹ ['Ce?-↋d;Wy]("m۩B]Dx*VSݕ*;Tn¶Hl6_8*#/cNr@lN nQ}y;+}aytoQ_7(aƦ@Gѭ\4](⨃_!}WQmSM z#pgSn٘zH$ WP~w!۬c3گcqFŠ/Ty; ;Ob ;&];QJ  Y>ۜ6oOvMx=}1_jK4ٰ3AA"^3 G&g<.+k#t}xY[XܻON8 ι @ߋ]tM9rA9IKjƓ/xϴdtaoSwAa ysW8#]ζKNE{P07zM"ܣHgugVUFB<ٶ#O7'hK`TI$:_ȭ6+Դȴ9CD!VGQJ0;{I0$-Ho-gUޭ!q kobQv^c,E*`8;q<k%/'\T5TY#F/dvRUj Dc?Gzת~tyi?GGn{/="0_{i A/Fտ.}=ѳQ3Bxm~# lN#٫tqVSBH(/}ẸlKI=uB'xtxp6[Auoq?gƪNP/m+q(R[W.ZeRנB,9DE5:1٢ \/zk1(C6'F|8#;nd3e)y(: 9;gRw õllZ;ܩE-xOT"L}"vILhRey{ܱLPRj `{vBB"̨?"{;g]vmOYKӇH]'hm-8'i*S?iXz!Tk׻?g 1S/AT{>DRHFOi,7:DCyV~ҽ!pI"^T ZXD$ µh>6D1ngµ}{vP>kLN|Ȣk5ءEjy`wXIXbbCϘ'fڅ >X1!02тOJN7c@4tM3\!V"0i"'?yx- ) } ^/HD)Oxdɔw=(!Fu0ozw !z0RsX$GuMpGs)\AH?aa;t{h<@ 2*6BLs';HjKXԣwOjxTq_~)S9GN{dD 2Zn_ʇ)UH6! 5˩Xة ɥ\Dd~o5.y_7Ը!'y szzaz)cxkg]p?m]2^H;>vYFϞ>'޷uz>ucשqQп዇GF>s~9)mwd08YmIƽR"CP 'GrЀ6 c>o%,vT6a^a W&${QTO7;wl`!〤l&.M X2¾=|x9~cbJ|/ˌwE7ݫvmA LtUѡn4ξKוKzh;xlA9 S-*:UI6cT?4|3V^gW6jzYM߷8( I!ty,px &Qa4ձ\/(ϋH${arz~ge m@=uihS6o~#jAD M U\kwv>v>u~ۛH}zXJϧm7ُWOoEv9~ϖ}=`i]I{@B\th .p:| 1Wg2ʰ ׎:u?BQC;B*;^v׫R9g|ܠiiGRBZ|Xk8uV~aeW0D pϖlP?Z _hޥ)498m*&Fd# LFbD, -A%D0.3 džJDQhf8EQ@&FUUPp *#$jlqYB%0$QKL$dN\%0561*x,301.0&eYvEU#"l% DA+j҉GhBB 0 Ef2J i( AD5 #!l!Zj 8#'"(-XDQqlReEPd8B%4[ t %D4PGhz;َJZZ\o2y9{Xa>n}Ip$yua5B׉Jā~__9PrB!!3~<4jܟ?4^RyB̪TgЎ8#lސԁ:d51s ֩C,KuFآ 8?˙@ @SC2&zJhz`Jf{?ݝ<079 Kiلشx$CR򥨴.C(x-4eLreY/l*,ʬSq8pvkCXeiZPѲ.4](0nf0K& J%9n$+ƝYWqݤe5:hnauPEq590v(+31r&%H˗ 1pH<l`j0綵IzT:H6`bwN SPw'bâNҺO_v}Ц+GxZhGH‰%_h(f&)Y]%G eP jaA@!AE$2Hw!} oZ4)}>rm! VƒÛ`ْպWM7T:6YH:cXeOjm˺1l`")*2%lqK$ǂaX&tlYpe2+K5&ޞ~y2h9I3ŝz.]25ɲK|;59zcXh#R&GGݥnHP喵m1!jngkqtO,Ah# 1뾝Lk`h.q̒ے%ì@%ZnZ`dflL`.Q$tÆf\Xeh\*L4њZ&mlD`RJ0K:V0F1FbRNz̻-U7D,J2ksvl \HPԇTcE5nqY.Yq+Zzq7L5& "FpZurZ Nn6w VM`@Lj5fe9aX535֭BnmD6QK& -)/4()X80, H6H-a!cA:iG$*+ cg  PQG8)-Zu/gKaF(ьea dFnV2؆3e%`$\X;dp8iyY^Y[SEK%([@z3IuC;)?`P3"¤>4?F>`Fb0r!Ԙ$Om&i MUe0ކn1Wg"~3pJ@pa LJc3OM7yO_sg?[o/weQH*(UAy(6VeSh_ O 1h@J 5PgL_d~9t ؓ{‘H_Q Oӑ+2d͇l7S)Ei<1V\yhgs f ]dD[(g F*>cɧ;Ĉ#x-x3[̈́ |Hr^J!X+"Vlcfw Mkö2ʛL 6[k @A;4iQx!&䤪OTO Di@?nW91cYK/=3?d?ƦZ9Pձ>cZ-uzLEsI= ]#w05U)"(a0I sjZwaIKj}K hf@5FЉ\fY4k!P&&% ѕp#♱ؖI˄vg(C212k7ssOcn mҠD4œtRLL{2)(ś ,K>R\$iS#}yR.Ŝalci$mKc".LXחč{5=]P'@HSm$EHljqp#YZ}><।?D2 DW͈wy6?p 3__DCy` ΅!Y?G_A-8C7:j5K@C]V}˞kOO9%?Ö5;+t(: N^ i g'ШAɒz* A$=q,> ξh|oQGۤi_RKlylBwgh 2]X].&ft0eֲNx'#iO G1JqYY;gP[[GۏO͊)*/_ts0b~z%VoESwg424 !  (qԽ@ DC x! $d04c!z;!ܦ ?:9 7! |d\<ݎ,EO(Qx ;<;go3 9;zWs5P hO+ç_篍[C6:@99o O$ n3Gm]:ZΕ{{wpJ>\{]8Τ05+rɗ_ O:mG^2}a%C@kǖ_*{:U<˰@>O5E9 P_0( ? =0n]q\zv|{n'|nY>^a1 &AdP=|EhO:'XH{D?AN㣺5>NQӇW^֟hO}==Z< \<|zNoUwvmC{Ɍ)\Lb4PhngW{NCV5{1pga)6Ħ-a>_8U#s==PӷR,tF7etIծ>#@ wau ! A Ƅ*aJ 0!s0el(3a(c3QTĀYR'"DfM`H#))RXaHPR3A%@-RIA jA1QT ȔЕo>//2d\syk-7\RE9RúHQ[(wO$v` .g?~4Dh!}3TS*[ќA F"}tRDRB$eWJ65~,ԉ&`h>#3SJJ缇J)Fci DjG 0̚q'va$6UP37/:vU `eH11`dhխ8DEF`}yDKB N"M84ivm;~nQP#.O(qE]jǧ[Lt+~D>$ԇrVXIww ! >2)'q߇;đ}-WuHg?#vP?G Y(U %0ǽj.MRA ^dzVV84wh3_ɺ<Auk;z;>S6kaR/y͆8S'f 4ٯ`WMᴗ3RH*յʊy-4дQq2>FZ-q08;,FiDȑ8ȋlֳ ^-CKE 5l( `jpʻzZ.q1Ȍalcč#;gA/s5w6BA 0]aV"b=\`k#q!APip5 uѣ:`>jhBNtÔWPjQ5oX0{0|T!%rg @̋JDpYPgJ NTBD4eUh| ^$N^! P V*:|h!.wvp!E @x!|cUrDXxsi&cBڄ\cr[B ]ؐ(|&v3է<ޚR5LccFCT n]7Y툚ԷAo9|*6W_~p8ֵ%1$iBIPd-+ph(W0Vd#1=3Nҁh8GEa8$y= !@!{0)n%д=VrqMR 4[CV=7 Pa 0 }-7jgʅ>j <^2>S:D/\Dsw[ §t)Y OFKyfaL)p9T߲8R^ "`>$QFcmL, 7g G BA%Vє? `/_@_d$HS սٸ_m?  9ǜ`ݙ͈v4بAѥr"QA}۩;ncl0$wi]C?~~3[CT01`l 鏉 Va+AG[ŭ^A!tpCheJ]7Q_=YsT @a0{FBd߉«rlsZNr{"dFv|37 /ƍ:5ڢ h+f۝vG9 (\}q#yAA[rTlm(q=v/S[I2rG[5R qP37lSrv-l^:gF5Cዝ&J tgV4ӠC,80s|֙b ܝo# c viVG X8qLFH FvFgHpo~ؑv4$L l;ӋGjh(^W1'g4\JVRƚT\ χ<C^H&i2&_xlpuTGr;-c4<=Gl(0垣}٨I-7P.=[ O˄Eu+ā4r:L|c:5!~CJg!FGaaE!ˮ+7fuB %гgYY#@M#bRLg]!g_k\$\Lz= F39(ۉU$r\&kMC~j%mZpQ7Pi*fVUTC'UVfKS%QF"W߆#$- eHtkƇ< R קcUvRu~߆9^e =b]zC 1Ty)(>/ t\)4Uv,e&bP<ȍzOӘut1vG#|4_~Dҁ娚;QHaBq[hK񲘊n[lECO/${9xHkn>ٲks-cYX5F5Qtm$lJKܩu^w,DQ>w}sW?0ecz`wm"5 6 $q݄H}j|fqD߾ " ;cԕ9J%##7 ʥ: qsa;Vm2G#y1UIh#ךږRWwQd 1ISa1ժz 1/{/ s1܄*13TdhʀX*@,{OOMJ ӝ׸( =]v/]:TR/tŞӗi df6Nְ;Xa(" Z3pM96' q^O+~ĢaHy|`cd%·hߧ^Ă6P%6ҍU My.m,/ :*7M2aiZN- R+fJ +"Lqm#@s;km,`{Ɂj3@_/ه6uY(qU6… D;3%P"eb9+{])(WYuz#ʫU-qt]W|w:F2u' ^eyt [i辕2 (ď{JG6mP/yCiV}W"B9eٸl}Y7CC"ߧ峴lEV,!P'BR+g 'a"5pW 1:ݖ|ptcGAZ[4C1eԭaE^wΆ Ϥaz#W#mhhy:f:SZQֹCJGY=fd4BGh797 F%m(ԇ8ˎk׺@φyBUh~jIzHq9D ; 3 I%,g]ADg_ݟt)W=s K@ {8j\UnڥT'g"5 P4䶭9ۤTʹyx :k+Vb26<++l[!6ۦWǎwzC~:rgS#Q&N憐M˻RȬ=87#QLwW/H(Dp_.@Lvz7x΋89Hp$]S=|eL칬׻ZܼAU1jc?퉡uO1I$C ZFvvG) Xجeh/X3]P=Y<4<:dCِۺ|"ubb_BGd?U_̑3)!57io;vP?}eߓhV?-zòmzs|?7$*:ߌl[ Op4G~_\0I 3S6!ҙGov'rAT4Smo3q*5s*@vi\ 0CQEwW<-8yaFRaAA^ktM,*Sf1V3UѢ(g|OFЙn̈yد7"DaW-1v4ԐAgz8< 2=O$*QT hY+`X\cVJ@ABeʝ*qT*4ϻ.\k禹P´jo~up" bQ H@.uQAw&D֚sf-iz(+ozoh`)EB$aRÜ_]"vp} ?|^, 9ih;8y3,@L17C_q),R3($:\=!܁#@Eb~UN":ۻnC7z OݣYXܳ#g!',:i!}¢fy<Ђs# N7ʝS.9;*𣵫jro]K(hBƌ715sm | ku~+RGhmԹƹUyK"fOX0Jz"0p+^WRx8E@0, c^l}KnMV[+ngYk׾K ɤ*OOqVP,R9;v\Ǒn':hX!vIy⍈{VP>gG^ρ#6 {$# ˯xlb %Iד~ 'NzTY!/^Y%(j%He)q!@ƌ$lEkr#N5܃^?P|<^jJ(_.'b")J*~mnvH^H"*!bK‚<욮 MԎxߵ*O{<bL B l<~@3>2>z[5 ;Ib$0MxjI{4I@3V_qϹ"Kî>(fG~?@',$GD&$Zx@ Ѐ/!,Bdv?opi~O RHdo0c!Z?{xg P{Ɲ|PBFՋGPJaD 9lJ~( H/1Oľ+5 FukԛI-*s4Wѥ#*1èa$4 U- ȩam.g7 an7XҚ0tC7:b~G[$ -On'tZ$@ԐSƌ'ИF')Hp4wsnzxuAU$1-(fێ(?hΖ^@Fqȁu1ֻ+ &G{;'Ȅ]iN5'r