/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Copyright (C) 2001 Rusty Russell. * Copyright (C) 2003, 2004 Ralf Baechle (ralf@linux-mips.org) * Copyright (C) 2005 Thiemo Seufer */ #undef DEBUG #include #include #include #include #include #include #include #include #include #include #include /* MODULE_START */ struct mips_hi16 { struct mips_hi16 *next; Elf_Addr *addr; Elf_Addr value; }; static struct mips_hi16 *mips_hi16_list; static LIST_HEAD(dbe_list); static DEFINE_SPINLOCK(dbe_lock); void *module_alloc(unsigned long size) { #ifdef MODULE_START struct vm_struct *area; size = PAGE_ALIGN(size); if (!size) return NULL; area = __get_vm_area(size, VM_ALLOC, MODULE_START, MODULE_END); if (!area) return NULL; return __vmalloc_area(area, GFP_KERNEL, PAGE_KERNEL); #else if (size == 0) return NULL; return vmalloc(size); #endif } /* Free memory returned from module_alloc */ void module_free(struct module *mod, void *module_region) { vfree(module_region); /* FIXME: If module_region == mod->init_region, trim exception table entries. */ } int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs, char *secstrings, struct module *mod) { return 0; } static int apply_r_mips_none(struct module *me, u32 *location, Elf_Addr v) { return 0; } static int apply_r_mips_32_rel(struct module *me, u32 *location, Elf_Addr v) { *location += v; return 0; } static int apply_r_mips_32_rela(struct module *me, u32 *location, Elf_Addr v) { *location = v; return 0; } static int apply_r_mips_26_rel(struct module *me, u32 *location, Elf_Addr v) { if (v % 4) { printk(KERN_ERR "module %s: dangerous relocation\n", me->name); return -ENOEXEC; } if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) { printk(KERN_ERR "module %s: relocation overflow\n", me->name); return -ENOEXEC; } *location = (*location & ~0x03ffffff) | ((*location + (v >> 2)) & 0x03ffffff); return 0; } static int apply_r_mips_26_rela(struct module *me, u32 *location, Elf_Addr v) { if (v % 4) { printk(KERN_ERR "module %s: dangerous relocation\n", me->name); return -ENOEXEC; } if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) { printk(KERN_ERR "module %s: relocation overflow\n", me->name); return -ENOEXEC; } *location = (*location & ~0x03ffffff) | ((v >> 2) & 0x03ffffff); return 0; } static int apply_r_mips_hi16_rel(struct module *me, u32 *location, Elf_Addr v) { struct mips_hi16 *n; /* * We cannot relocate this one now because we don't know the value of * the carry we need to add. Save the information, and let LO16 do the * actual relocation. */ n = kmalloc(sizeof *n, GFP_KERNEL); if (!n) return -ENOMEM; n->addr = (Elf_Addr *)location; n->value = v; n->next = mips_hi16_list; mips_hi16_list = n; return 0; } static int apply_r_mips_hi16_rela(struct module *me, u32 *location, Elf_Addr v) { *location = (*location & 0xffff0000) | ((((long long) v + 0x8000LL) >> 16) & 0xffff); return 0; } static int apply_r_mips_lo16_rel(struct module *me, u32 *location, Elf_Addr v) { unsigned long insnlo = *location; Elf_Addr val, vallo; /* Sign extend the addend we extract from the lo insn. */ vallo = ((insnlo & 0xffff) ^ 0x8000) - 0x8000; if (mips_hi16_list != NULL) { struct mips_hi16 *l; l = mips_hi16_list; while (l != NULL) { struct mips_hi16 *next; unsigned long insn; /* * The value for the HI16 had best be the same. */ if (v != l->value) goto out_danger; /* * Do the HI16 relocation. Note that we actually don't * need to know anything about the LO16 itself, except * where to find the low 16 bits of the addend needed * by the LO16. */ insn = *l->addr; val = ((insn & 0xffff) << 16) + vallo; val += v; /* * Account for the sign extension that will happen in * the low bits. */ val = ((val >> 16) + ((val & 0x8000) != 0)) & 0xffff; insn = (insn & ~0xffff) | val; *l->addr = insn; next = l->next; kfree(l); l = next; } mips_hi16_list = NULL; } /* * Ok, we're done with the HI16 relocs. Now deal with the LO16. */ val = v + vallo; insnlo = (insnlo & ~0xffff) | (val & 0xffff); *location = insnlo; return 0; out_danger: printk(KERN_ERR "module %s: dangerous " "relocation\n", me->name); return -ENOEXEC; } static int apply_r_mips_lo16_rela(struct module *me, u32 *location, Elf_Addr v) { *location = (*location & 0xffff0000) | (v & 0xffff); return 0; } static int apply_r_mips_64_rela(struct module *me, u32 *location, Elf_Addr v) { *(Elf_Addr *)location = v; return 0; } static int apply_r_mips_higher_rela(struct module *me, u32 *location, Elf_Addr v) { *location = (*location & 0xffff0000) | ((((long long) v + 0x80008000LL) >> 32) & 0xffff); return 0; } static int apply_r_mips_highest_rela(struct module *me, u32 *location, Elf_Addr v) { *location = (*location & 0xffff0000) | ((((long long) v + 0x800080008000LL) >> 48) & 0xffff); return 0; } static int (*reloc_handlers_rel[]) (struct module *me, u32 *location, Elf_Addr v) = { [R_MIPS_NONE] = apply_r_mips_none, [R_MIPS_32] = apply_r_mips_32_rel, [R_MIPS_26] = apply_r_mips_26_rel, [R_MIPS_HI16] = apply_r_mips_hi16_rel, [R_MIPS_LO16] = apply_r_mips_lo16_rel }; static int (*reloc_handlers_rela[]) (struct module *me, u32 *location, Elf_Addr v) = { [R_MIPS_NONE] = apply_r_mips_none, [R_MIPS_32] = apply_r_mips_32_rela, [R_MIPS_26] = apply_r_mips_26_rela, [R_MIPS_HI16] = apply_r_mips_hi16_rela, [R_MIPS_LO16] = apply_r_mips_lo16_rela, [R_MIPS_64] = apply_r_mips_64_rela, [R_MIPS_HIGHER] = apply_r_mips_higher_rela, [R_MIPS_HIGHEST] = apply_r_mips_highest_rela }; int apply_relocate(Elf_Shdr *sechdrs, const char *strtab, unsigned int symindex, unsigned int relsec, struct module *me) { Elf_Mips_Rel *rel = (void *) sechdrs[relsec].sh_addr; Elf_Sym *sym; u32 *location; unsigned int i; Elf_Addr v; int res; pr_debug("Applying relocate section %u to %u\n", relsec, sechdrs[relsec].sh_info); for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) { /* This is where to make the change */ location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr + rel[i].r_offset; /* This is the symbol it is referring to */ sym = (Elf_Sym *)sechdrs[symindex].sh_addr + ELF_MIPS_R_SYM(rel[i]); if (!sym->st_value) { /* Ignore unresolved weak symbol */ if (ELF_ST_BIND(sym->st_info) == STB_WEAK) continue; printk(KERN_WARNING "%s: Unknown symbol %s\n", me->name, strtab + sym->st_name); return -ENOENT; } v = sym->st_value; res = reloc_handlers_rel[ELF_MIPS_R_TYPE(rel[i])](me, location, v); if (res) return res; } return 0; } int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab, unsigned int symindex, unsigned int relsec, struct module *me) { Elf_Mips_Rela *rel = (void *) sechdrs[relsec].sh_addr; Elf_Sym *sym; u32 *location; unsigned int i; Elf_Addr v; int res; pr_debug("Applying relocate section %u to %u\n", relsec, sechdrs[relsec].sh_info); for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) { /* This is where to make the change */ location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr + rel[i].r_offset; /* This is the symbol it is referring to */ sym = (Elf_Sym *)sechdrs[symindex].sh_addr + ELF_MIPS_R_SYM(rel[i]); if (!sym->st_value) { /* Ignore unresolved weak symbol */ if (ELF_ST_BIND(sym->st_info) == STB_WEAK) continue; printk(KERN_WARNING "%s: Unknown symbol %s\n", me->name, strtab + sym->st_name); return -ENOENT; } v = sym->st_value + rel[i].r_addend; res = reloc_handlers_rela[ELF_MIPS_R_TYPE(rel[i])](me, location, v); if (res) return res; } return 0; } /* Given an address, look for it in the module exception tables. */ const struct exception_table_entry *search_module_dbetables(unsigned long addr) { unsigned long flags; const struct exception_table_entry *e = NULL; struct mod_arch_specific *dbe; spin_lock_irqsave(&dbe_lock, flags); list_for_each_entry(dbe, &dbe_list, dbe_list) { e = search_extable(dbe->dbe_start, dbe->dbe_end - 1, addr); if (e) break; } spin_unlock_irqrestore(&dbe_lock, flags); /* Now, if we found one, we are running inside it now, hence we cannot unload the module, hence no refcnt needed. */ return e; } /* Put in dbe list if necessary. */ int module_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, struct module *me) { const Elf_Shdr *s; char *secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; INIT_LIST_HEAD(&me->arch.dbe_list); for (s = sechdrs; s < sechdrs + hdr->e_shnum; s++) { if (strcmp("__dbe_table", secstrings + s->sh_name) != 0) continue; me->arch.dbe_start = (void *)s->sh_addr; me->arch.dbe_end = (void *)s->sh_addr + s->sh_size; spin_lock_irq(&dbe_lock); list_add(&me->arch.dbe_list, &dbe_list); spin_unlock_irq(&dbe_lock); } return 0; } void module_arch_cleanup(struct module *mod) { spin_lock_irq(&dbe_lock); list_del(&mod->arch.dbe_list); spin_unlock_irq(&dbe_lock); } #qT6h0VRqCAeY벿c}W ~`U̻x,5U1[@O,)q[%x fV14b8hJi n(7.hŐ8"TF:;r6}?Q)6!ĴC}*tVp3dB Yp =VmpvR2zIPvuˌdAksnŌv/<5B2)"b-qjPy T-g$Y VС%tƤpD .|YGm I ML =M[ 3b(o~@A6Io>*-8%AB,_UK6Aԡl=xctĸra7dKe/_>Ken[$b+P$ xږ.3BX/}EoNާ8/stRqtkš#p-(RIH#@*<$8d`8ߜ)2QxuECbTQ|o4)`zSk>xk%O;; -[߉N`kͪd#М!ю+<ˆت R hy5Itf& @>N$͞$Y9%Kx4DJqucJ=0RמT>]ݏa GDi1bt&Cp\  M#^d2Jߨvl=H9PG9ŝsk_Sz d5o{}Io?i¼l'`a k53dov'֋BW3b6;"hoK&"<۲ӷZv a)ȄӃD~ꅋAV zxA|ݕw).? E6V"9>CID <^ bgzyKIF CAR\<a aǒ={?ѽ{APŽ6at7:WrFL<66$a Jr0oe8-܀3~M>cK/k;*UfY^YmJ4KO{MYѰ Ώ ḽĒɛO[4 q+6Fk!PQ6Ih Uk)(;8\)hժNJB]beOZq 5̝K#\ M'_ +hU9\f{g0f Ar~T9B$(0Ћd@09N=3oIʪ' 1IZ6`ж6ڭ ?.*83'Y-t}ߧt)i](1[_˜_m'd]@;]H*w!RӏB*3įā6r͍5cM!%V.a[ ,w+N.Q!`L;A[6v,t&HhxJ):@*TFXM#_S-? F)K?ϧt+5WX{}#{ kpx ]ikQuԦFY86Q25VĴ̚:ByrMb (nCeQFF.̇}t䪨-DA ]^j ?ŷϟ!QtؼBzqWV`0ųU&3X܍(]gDhZSr/V'hFʔ~iR6!޹;ZƩ<#sS{0K\H꨽JS)Iθ#j~I1dZ4U,~oHSwp9Ɔ|rCS# MZL@e yU^oČ7 pdM;4rYpv{ܱTAMG(qH9_ԺF<yq{Ű76f p8dTTl瓫@ fN#ؕ`C}+A8%ʞ:T8H6a9#P;a_cОQ̨0h>0uNV<!sw%jRbHLPiSV$:. H^+ vu]H/np+ /V<תNQuWb0Yy!oB g@)aYHg?\@ 3b=򼳬<9Lhb{F|&=W܏zxyJ8s|b[[HN! 8 )R^hЁwz1E^p<WfJ NZk^MQV-}ʈ?W3S)C[.ZBa:|Ϙf9*SSL.}D#awcf:nfladm#(E*0ǀV쯯҆ګ06r@b3OjNT UK.xǃDsˢG7}bpЈS9Ո"1ˆ^}Io3cQ;KБJpm%zuB6O V(ts*m0$U$]-LlK81䁕 wmԞ䄚hyYREHuWY#F>xhGm%b\1cs% z.+v<`EE7>S8:LE kvogͥɨ3n ,!ޞ"2E Li9nG،#z8uTP=]zVhG~z Edo(BAj9m^_C*-)&2ԈjAQg.qs ?t-SfdxkhP* TK=zGN,ZqM΀X詩k$b NۭHA8ʣ$䧉.ɴVHn,&W QC .(.o:zaGt5ߢ0giw\='O^ɜC2$el#ޢHZ%2JAư^RO^Q:T' [}̅4؆,y+/3=k%ONLԂIpke.exD(X!W,"*g]#,Q@~&b4)V9 48u;,Coee٣kSlSbQ\rw;'b~U"aq#[~ڡJ,;S' `yrL wz)T5S[QDggz SeQjل`Kq_1%Cةo/;2w}q4 Usiޕi43J5~+ppzDN74s1_FG~ ZءTxj(SSegc,YmsP×b(yǼ(sI9n붠+w\4F&iFj}5DHjńZ葫^$JW>KYᶤ=a&)sZXPT!K>>Ɛ7$m Hi~`n31UJ[vvYv*{lwiR9vjF@ nPX9NƄ^I[?>g eY1Rmh" Zܓuk۞T(3HH%bu4w큈gOSD3`Bo?Z2$Wum Y3̒=WQglI_YclsFC/@f[Bq`y0/@ !iT>t)\eȻF瀻diMlǃtc /ZO*ۘIqu8;rOvSB/F- yE4NleZJϴAtx1°CגO4fR,'A3CD#`'P}T /dūRU"D;KH֨51?aā`MlTi>}{; Ï sord\o^!_95|` T "hfUղ`bGa6L_w=L+tɁ*G0nHP$|c厔$> $EUm>*Jb7t k#KU'$P&E2@p=X,+(>$_o, kѢ𖱃Rܞ`@/emq -3LLꇅa%nj=Ͻhqz8 t!噎φfda !DrD!Ho0@Fo7OC=j$FRql9tqp[^Q8&VHdPm;{2WA@&;l9[I͖k4f.}J`k'wu_̊5̳:4yw&bRwFX9tuZV ң:AQ6y:a9yD \ݘmy5+ pFl4)ojf#7:JSA)nCd1=+I5vv<1#r߂?l0) aFIiŏW JAHfÜ dg;W*vn)6]@R gSÑGu88#@c%ȬKzl>ɤȚn ɧ]3-s :9,zg>wݝ6LrxA}["[gNlqgV_2KT <\[2ӊ,aX\Cr F^.b'&I' 6mإ 3,Y[o&ہ'pِo`L{C6\^l78Vq[ -0-塚u ^BnےwwgZlan Z<@U,',ǤM(_vSʝ{\?ߟQȱ*AӛmmT۹Yឆr(Ԯ (̭1-ˠ8J w91H.x2ISh2kYǭm[nD!;)#Wf O8&ErrU5A/U')Թ#r#SKu*[sHMi `bWUo^>ԵeՉ}ڇ1)|(!P^we9;mRh?HU'G!;A>P }W53o!39I.>HYpxePkH{RDz1~!Nצ2)q[*Y&LtE _AU$$4,ՂtYH> PZ;0jOKR}VWģ0T҂lD^n4={-=/v:c329\ *$Zb| -Kˠ F˲0Xyou\q閛:)oأg RnV]L&jq`j<7KyvWQDWpfq|Ȫ;i=TTסP懸f0. SO{hۻ:f[.r]C#e}sȭ~dS`Ip`!xbE'깰 ޲L1j̲`{JT[PYG{͂ }56H֏Qӏ~s]Gg`;`|ītΗġ["@Uؙ6bp}S_tBVHw{qEѹn?Nf58GYA/fBo9s &x8<8Vk UTEf7~m1jatپJea|%Y#8chH`Ȧ=TE$rHAīǙQԤ ~{/ɛ"hRդ#l̵2!seV78<ϢijɘKܠkH$tG/WS8T#r@u Vط/_6`b5lrFI3v 8&A]v왇a]#L-OZ[$$K}';%9:0^1)c`OeT'+%\s)u0^T0 qP!ԩu#~8+;XJ򋈥&s_K)f^:ƞ!7 +l?eB eޢ[S~cH:T LlQ 6Cz^T! 53iRpPgv˜ m>׃𪂮U5o}WQRDwŨv¬k${.:ڧ[]shqb[zۮ1RoOl\i^|?(z=V +% ?fq-j\c?M5Y0##'[CjkqTbOLo/-<;;R2OQ^i~і_W\bn"*sFc17fMivWqӒwPr䔸'zIwP̅$9Ǟ=2e瓣]DL ؿk1#6iY.ncXQhFۢZ/pkؽ>o- 5qyShǃ-UGx3@t2!ӕeBrc Vw61+xXCrؘr=I[$)NNpAZwlNƇvEJkk\\QUC~"lsnMQjE[m1.r%5DTm_p_-JQLσ]*Η4CeL&2#'OV򌫃w+Qg'.v\rjG bkDk<"'vF/YMS[8,U:9mHtVExN rBЯHwRB'*ϕȷUl0:-YV `#{~|v3Gt8 TϹyҮs-h)8{a)/r dnwrg\kzo/Ct(04խ${cNiw|Euvw[W1]nK !bch(͊!<$% M1Bh8iٔa;sw<:O?5O?))K̊/kbvQ? LiuD/MP!wn]-ןlf~e}[?~ZysyC,y5jv#_E6#\Sc"yWg6lą5[ A$ _+>:^dKzmޒ2x"xftD nObC*,ɾDZmb{=j-ch,sHas-w'OmB}#;w:Ktt{{w+&Ge~7伴-SK2#E9Hfi*ڀ>V Vҁd8!_M"݂k(<Нßc/62+HyI{-FXݷcs-P|, σRċ0ZUc{ gQ_j)1'Oh iYݧ㫿_* GW%+=GTbcᨳFdwr]`ʒC39HK׷KO6)Yb[p-@|Y QM^dLzEwI~˷DGZbR#>lb0]!^)֒Z^3V-eyVvy^:9.*0ƫhJG*՘`)qY(!h]ݧ;һw?I(D=2!Fz/O=NYֹlVT<~I7Gc)chss;v&2#VEDJZ߼"n$G-*5ܡ2J[#3L_H q9; 3 G$]-y}W2 /DcΗoP Tsj7;OP͛hg1-m鵣45V9A}h?P)FPۄNB|c}G_U?ոSjt>o{S.[,|g3 ϊ~i EDo A ЬGDuA!nm=0fʪp Dk.p47--)AQh-$s?S>Nv $2}a0NJ!4>ٹI(:>~oP]ͮ .HK'AP'!R==,$YuSs)bOd3f s?!γH]/Х /hfGJpHN$d {K1Κ6I/ )Jk~Lh$p7MǾn9u+חiT`H9lwI|o6H]ц#1A 0 t8o郛H{I U({U gQ5{ Q3RcX7Y HR o?O%'@Y;&ӣ-So;3Eއ1 rO%AZ!_>I* L5xoNZ 7B'>5M j3쯾;EզT~"ӄJ-ĕaCQo|\6w! E^?|kh~G9M=Nx dBd%MR[;EN9qnؖh+C]D>Mß:RK(.pEwa3U ڮP;s_LkZ7}*k~dL:>Sg)!/ɬLNz42SY9? lwm#oi#Yp/o*uTT(|rrQ>:ynj]HxK,Q'rg[EPd6760f#CBla~9ktC s|U5DPDט<{ǪQ [ZbmwojE-eaR"!XnMoYrPs/ j< ?¤n+DSlC~qaV({!64 ! YK⠓T >_GR-͙ i0cOzI>sAꄝo jNQCv8*j{P4Mǭ̈})YW 2k&&㣼£NX.y L d2n,rE̓\VW@ [T)khӒJONx%*trfj8oX] eL73= +;cR+w1ч#UYKŀJHCrlLl%H qU"Pӗ|OS'^`8/NNZB 6^2x=ij._7qRȬHQn\vF!uܼ؊#c7&GɕiH&LFhirDrڏ;n8>9{@"_4Jsޜmv oʽ{E=o1!Ɗ=%|U]7jG9¼i wIAŜN jH0~"W !T/MڿWt75$djϺ'ߝŰӾ2j7!rF<=8o8e]!]MHp1usCiʃ`_`49%,uLH ƉÁi )8KEۚgYO\:4t)`Y +g)6͚K*[$*K'B1~]gbbxHCY襕\[Ј淟;c1TB/̄yԷYâ%$-Y, eMn9 1?y!Pʜ17ѧEP6,"s2Z0՞MYD"g_%{a?YQu.-UQǬߨA:Kt ;؆| WPk혓 %bRMZ~\534ek3r,>|.Ó4)Ab]p YG[^y _%uCoջPDz}йNz, ż7\Soj)M]֢?ELYf<e:Bx ȞzF+H}rI#xm+{ǽ9 2E#]ypM d 8+)Ǝ=:KRW'2wne_S%7ig zD&uZx\yJo+YLE W敝 vkjD  5`{ɼ={ 8< nsiߧHW)"vyc CRҳ4nf2(Su!4z~ic ~+iVHA7 V׎A/p#SU9[kAV)}]!H'C ī%[o(.b5+|DlxvxD,}9EjjgD=Lk(SfSrLPBB(ҙk2fD}JɆhzlN(Z>;^2=cDtWx"]D }QŪˊhԴ(UVh @E}i:HIAC ;T7Ţer{y?:q|׿67bJj>F5~t.C^ti)bIkpy!:OGQ1Rgb &43PDeÚ `zv⪞cpUx2CqЛUmY=< h2h6HlPDފç|kZR[I=vŢ* ]qOBJ*F 7_Ek`ߐeIh XfyL~) CVClub'g`&ap<<՘3eu;$ɵBtM\eʯ`CzYvKZ;)1hP,_+sTֈcKu A"ه`0Ji>+r ro*H42'HdOmlbBf[jpl!K3dI\%205D }k*lQ(J|JX&+ĨW\fZs (A.sS< JCǪbb~X^kRYH;aoOaEڥ>qrF9K]t2b݋66LSFQݔYuu<7vG0Vԃ[Ow#,@*n8(Z/z*݋'\\(䢵塓e!=e[!+ 1Y%w)@3M-WCR:n;4:$`8y1'0?mFOdb0ڏ<mjͺ*VH07&Q.a䍥|?R7AᏒȸU9f?'9tu"AK_osg)y@^`rOqkZ|U!޾:qD̦<߃aQvȐH IP-ZyinS;NHi*Qe1.(~!KB]e&w.1h`DFcm@-4sE@[DT)er6VTEWBMqȇS,Rf%R FjRI$ Ek Rkd*iQ?3F EkCUQuqFD" t!OTst"I[j?`;"b7"wnsR/I]Bg~֫j^ϨSlxagDp\TT!4}I` et00cVVM%yK!Ȇ^-:i+2@)%DŸy=jxHo뛌{ ߦc5Gjw 1"Gp@e Dh8&5#DĮBW=fD8{f4ɄBI^BH0R}9ZجK vjڣI=xexOSvRB QnNnϽq!$w܋8Fas"VJjP Q0Ѱ]btfP9R~E>DD&IB-S>4J*~vapyY޳wKr+0jG8Or>Ƭk#'eDWŵhO$!ϗ7Xu^wI mJ򁎈XZc V89?[fYA^oX$<1ID=`߃ح^'3@G݇Ps?eMv Wz!!5Q:o `a>il-a=,`٧!z@5$@P ?V|tGD[;RO"g~9N ;H(~kt+HWTYD+Dy(gA6N5J*笧I+q~CL6xf8K|W%] Lk|w߇M6Ӷ4if|N K0e.Wrp%7e`S\5v GI(É]T0BJ3= Bz$T:!%>\|:60 #_vPjxBYʚgϩm_* Pϸoj#R{/#Rt1^ܜC6wieOJA =(ɯ?w6F,J`9P󔉒ׅ\0loPUbSkL6iV{cРnb)|y!2iV)Pq;4ӍZER/0`#Eװd @>Ŋ?옸LAuuat&[GEe]ƿ?lE {=H"֠C|F=nY ;c\ QcwOe4C p"T>:*٠U2:U g PG$Qx@T >R4Ŀ;焫J IVU͔@RȞ\yjv1;F2яo5$m(NhB*%5̎3q9akJ_(1.ZPCUr"h؝`i̲YrҖ" [׷= (<@Ž?/CwYdBzTKP:08DnF.+vzA!4Mz{' QCF o‘g2hKDWIkarm =/=)Ԅ[Dj m[djRq(. t1q 4sYaD+ϵ2IoIeuYx{MO$ʹul~a^m}EGoۯ K3ưp?%i_4OrdQi2|UM5&-Ƀt ,0٥I10LlvHƤqs0ߊө3"Ww!&$-M!8"7߉z<?1w~75"qWyH K&`l fCN\ȺthhHY{Hw:+,mc'[QKG'[K{Y,ևlC>"WI1qtZP [歗,4hO{DOlh<)Ō/k$ _G$f;D9K65/>ra:PBlgKbcu h9\+ɘ,`*M΂Q4e& Y>Yc1AMPGވS]-;tG^#VɠDA)GUP \Hig<!Kg  k1f(LFNKq EwnP}(q*">3 ~O~y;SR`ޣҴtsK]yx*Yp1hg 8AU>wx1{ۋ;e Q955D#*簢 rlR}v5 cm鄰?PH&D&p8F؂RQq< !F ^{gdGo wDu큈'KoםxT_rx(pxY5yMdďqez!kll. uDfzSV!YBX<8zb />^XŒ2qBZrAjgL$ɞ큔Iar4=g sV#N%C|fmtյɳi?ru`6AMnU/nlc*9MEK+_.`yuDŎi6 Av86rSCrU.fݭeZŹӱ*E~59p_I||]Ų`Vcԁ]Izs 5@T?o{^ L7A~K[T")Nǔm%OoZ,OQ9QX}AXD8Sоrnkųs "C*l BݪJOm[tj+II떛_,~^;LH[EuYE Nzp wCikɝSUW)aV4RdI%8;.}JJLcuLATO<6:w<r"u5|ڀ_?y= _QЪXBs mw>6(CNH6k.%` aVYgR ծD8~ vNdpơ\4.Pנ?qjoFW}qs@i45B$#v˓Bmxf@6gr~*~%iр'VKO>B)Dr rh5b%UJ,f9]Oû>' >(TD0&E a4~lf ]s\QW]^U Rp\U$O-"u%1*YAuEcDz ބ!LǞӱ% ҽ8Bvp-r:4,4.+P$<̞d!`if5F&r0( (&4.\UIVkQH'yikhB Hs$S99EKyzC&sEL= ^K+T3m.Dm@-(޽S_dK$ln*Z.mYYK^}je `RbGL9wC;s !e'[ň}DHQP,lrҖK;AL}%jQf.[VsomcW2R\\̂ȇը& awՀJ_ :^mBHsCi1MaE?r]XOQ| >l -%2?0H:ur/]iF0xp;icR 5RcƟegi#p̆LKIM!&Xmߵ& :_&|(L@8FLUۖ+lˁrFO^aOo\Ÿ}TR",\9c.@LS;\7 q+3?jԐ\~ ;k3 J,]U)h!#H  pւ!3yA=ࣅLwq>`IH[8+5 sXY]~o*'̎wIT9XDFy4p] _- K"(zk2.U2U+pHQ:`l1M XNE=qԀEVtXz9 g)nYCGT!iY=dx@SzKynd`z.`͡ENO״xHQNxyH1+Y8'[}j4L~O$MH'A~'m:]3;xQL-%"VA5s/ܦW $E`4& s#&> _$;&ز:XA7u{Tacg)/;9ыYؕkj%k7 (r. x7*Lґʙ813E)hlp6 Y~e} !hC~uHcd cUZX9E'\.MWل+M}[l&,TU- £ڻiTr7>>઱tm}Ə="o4bAB>PRGabt.}P{)kihDJߠ䖢L]Sl4D@>\, O4h'AkߊV oV6 |D"`\VI۱vûAO I:w Q]Xy;cxz%d} pѷ'.ǐ82KmsΑ?;I&Ti6)ѵ.9nBKJXq 1)1ِۗy)qG"J.▏e{Q0oH, ،aF_}_+1W7BY7!taxZN1$hb2Q:tܕHrxSTh`Ɇb 8d;5kb,[Ym|քq|Έ=zſۜi&~yl`yLaxcE &צ:X89yAv?>$BKZG3ҩKG)fpW9(ݣ[x O(cּێ"soD{]x9_+(QlSq ^)(f6 @jۻ{ FUЯNh?$7i^@zL :6S,{)G-kLR|Z=G*5*#j(o]g.yم)' ЅҒr]i;ɉp?;]2++\#C{|`RdP̓9ey `K3`t}nGuAX?Q0udʽ%+ljQ rJV^iR_|(!u&2U,X7LJ6,F z,äԘ?1D7w-LRi0ES%G"V yP*i X5XP*nU_YLr2Es r h>9 /(h`@?F V+ږ-Bw9pQEw~y nS- s牉./#jN8P-]=D؈ uWx?Ȼ /rm01@Eւ.:*8T~ۡG SP(j0 C`@ruCs3Rv[]p:nd"tI3Y'7]Z p7 `l>1eQ&VWb#;J-q=a^6C_"Id/ zr.3DG "rߩ2n:lNFVmz( AWpj$kh;CVSZ5yTesQ@^v3FIwҜI^,%#~ c W%uĴgP/ rrk{Z%Ks1DA[YdmT?NOI,~ t1մyE6O$! %C[ 23}uAPJ@3ngGppeٌa\?_ڈ{."k-DŽ V}NX̛ FٷEXiJZ͉"܁G)U_jPزxPN cC(e&+LNZgFf0wFDI>E_$R`pIuJO.sLbj pa/?y}I=&_g1}/%<4;敉Pǧpck܅f\d2\?qE,l;[ȢK.,WK ڏluN{ŕ{ђQ'o/jsъ M/>?}7$ /+z;PɈ`?Ob?߮f㜓#C%6.X^$ҟx v2f7mM), ܨ6X,Q+b-n:^4 /B&m: T}FC[xQ%9ueex:)AxDh~3faHO} INWֺn=|)!eP~\2xIB;Ǐ>6{dƀ@M󄘎Z&TT1Z{&i 4S6C_)3qGl=ݼm`3LwR}v#u-8Ӭž FSnqaTvOl-}bgL #y`*˲f`KZGŒfq{{g:Sp(yÒ4a|:W>(/O hE &@Vf'kI&YXBqY@.el3wHl-EWrA(*XIP0 ~φlXq~!negp]C9f "/?V‹F¯IΟ͔>7K| 2* Ulxag^0wm* Jo ڗ(&L%9Q <]$HƀI˻HJ*w `x:yԸgEr-MYΨE0|ܙԈ&\X Upn H[xN-m:6{ ^h,}[oIژ'69%ewd Ş. 3[ΖU~MB>&E$(FŅǂZbk]3e˜}it.ڮ\hZe[TY {3m:M`qHgMf~3_^*p#? 1u0N2`HgE,72LE)/Ez+G*~0zܦٓOj~A뤀_YD #u@:mdLQ6~.fd}H<,bVC$GJuxfcnѝt !n'b 6A֎P@I`$ID(kY8l!MӒ# :DU ll?M$SH.w5B I X>|xH-%$) j { +d5/H)yxbe06r,IR!==!3Ru @ی{SS=7\Măٝ8E(_EΫsH7$gXPCSsj+unnLh`9i?Qi'gM5?47@5QajZh_BKQ>uqWbkJoI< ]ZSnhz~h[Df fo|~u vUEIP L\7nbg%ZxŠ ;;1NbxF:3p"64xmuI亸ǣSañ5-Ӏ?AYK8=sp9Z>?Ə& Sqq\S߶k1m/ZhaU^lV` z>hc"֫SV/#VrZ, L!»CzƖؙاmF>)=ىy$]]@V!P޷+VZ"}nJj۸kp}ڃ(Щdcwyoxd/#ŪZ8!OT݇h$ %N9ITK˛v#EՏx"YbxjFsxCf>6૚L~|z_R+89}RT`'b1!8Ŵ,UU95K϶nYju,n9= P+[9[:[, pE\R-M^ʪ^~^.8"Ẽ,\@-VC'fhUvDaQC\|'z]Qd>[ NwgIHO]ThѩJ˦w7Zވ H]Ol6m' z,7 ilqEB&)E" r\(oeG 䍾b˗Uox!;ivCfkz0x9Eぱ~sWr鰣Kb׼e+W=)ԉn*}{Ǫ%d HG-5ZI l McKhKv y1F0hƥH"Dj蕚@_+ ALUѯyθnITeExC@4E(ZΤYF S,,q8KaxsĭaTZft@wG<~:1+3LʖގM.g"0)oqWjQ"td{k*7X2HuT.9leug-dŦ|oR s=,iۀ̼74[Vk3lcJk\?9bscID\?hkcΒ+S(Wo"Vww\R_ Ms1]n[0NZZPSc0L[V(x|,N4_|& w"f E'z*$?h NSgGgdLW%u,[ϧ+e| iϻ'lԟU0[:W:w=T,`?k$9(nTqkVOh ᫧fLg>h灖B/q k+{Y%얐l#ekCGchZ@?+u53i y1liqV1_nFr]]bto9ΔNz"?i74w19g|f#(+ ]ys>lj7J޳x}敬Z{ Jl_ˈ%$OO'p.ph JX6{s_wTHC/Y}57XR+#v-;9V@ @BmF9`Eve^318@mؒmuZz![3į,E!0a|[_ 0LZ ,9y`,hUM$3hݝdķkm3whbMIrCDߎRקSAeo~ PM]-^k}>.Qz^ϻt_sߏ+5m.F뚆n#{0}dց %MgGK~3|RN GJ.XE&]9/j]x⩥DIui}9n)=0K51&#Em. Ab\+-iP6}npDhWߘ6-37ԙ=?1+1j}j*y~.ǂM* A&IA@h9?ܺ:x&f~tžJo<-xꉕX|giMlڴ'7U/o[3 {.*d}I?;^͑OhσgtG}SvN[A :)MCze*Y [!(6oo>aY?a\t:i fQ Q\+wqAbV׀KBX@v.AiQ.In I1K\[`l5ryY>l$"٧zuԻԩ0d930f{[sW+ }ZDy.)ʥ*iyR^CMz:C<a ;24^uUD!69Bx dȇS8|(S8҈LM-`;@|k^7diDۗhƤȗ}2p~ڴLŝ!L`Uـ ]G j] UIzL a:s=n yy*ɲܣk<{]>}M*1+wfau_ۇMMdjb`ge&H>AኾQG\Dwt)gZFw/"̊7NNeE}pD9싵GzjHϊdZr^%eԛm(zikګR. a`N n :]N.ч7"a.}{ ]-Hs g ΐM'tc ~LC"phf qo2 K01L. cnΐ\a\#[Z~߾"`}L=;/94q'rt}( ݽ a5SZp|UHa ϥr>C3&Mp#>69-Uot'wD(؅0䟼18O1&i~v2% >eNIiSL]Sں3EsbnЄ'uh7+r&B5_j]WV2"R37'6"PL(aFGRNYYVV j|C>Úڿ1gP{MFd5!Z,r~E\K\LI$IƶP!}{; }6#h7|N{q\~=J0=|Ii;6L_Phҝ8DMheKҏ_aL<RżG|c̭Q-5{Ɗ`Oz8I϶ 2 $qwSʞjo[ @;pwPoBG>RL0D6s_%̇@p,[V6"\֋<ݫ#LEy78UN!")֝f]|'zʮcbln;NÀ͘[؀E6Au^/U/+aJ<0Hǿ[?!~G_!#( W4z .lK}p}!DwkKnWݛ%$b# A۱k3c>rI.1KF%j.uHHЪ_v4&1:~u-CԄ~dV ) 6yF Y7:B&^jLJ뽡! cمM%uO6 ^5imxc0~|j@N!!yc usr:S\{|4[7DdRZu:3-3snVM{@^5Og`@SX7:zf܁Մ ܄'Yk^Io4辱t pX \ҔןF4, |oE0 kp^]8b,fڻ|N<ۚ` $$GS#\Է 53j $ ۰&q"h~\iY> 0buҤFZBUmR˸s !sg-ĕnp4z8 !#$ٟP=4-l!( <ֲ'iٷ'hǸ:MsJӔ{V!xO| G3aj_ˀЍH MK=N\Kt.qn 6YCvI@4G@.wǎfKg+t^JD!W O*;!Pq qPmN!__i&P5G.('k&}6Y^+.IQhRw+{b[u k";[^ήc*Ke+Z /򕐫ŚGq|5wUiN]#&dM$jԷ@{h&TH~Rd,j8Req-aHFiC71B`d]]5r|데vjCGA g 7gv;?vUͯiKlB z_Wj,rb,%\3o;o<,Ado]45ZJ7D#Ze~>4YT3Ռ/TtR-Q4c[zGs6t> Q sK+藼]y;h|4s'+`s"xO<ΪS>H$z?r?[h(C~VMiaMDqLOm$4gk__YE@k*F]F r@v_%Ԙ%5V ~<5~ȔWekz)@S4\K͒ qx>l=bU=++;Ə/EKw  J?+Aa"LWZ"c9|XI_b`MiIPQ+I ] Y$sȃ 3vǻʞ.:"-`Vx{.?/fNDhS STp'}G]q&0` \ѽ/PxlԱ3PL2gEx3^ߖn$Ihp=Z=RYj ykc4xX)DH4JDJN#i~]g봚[b޷-b ,|IDlh* Vu"':XQtk-(tSiKLj`,ݣe`Bhg<9  eʇ**nw#ބPJo㿬^n7̓tU3f/@EFO8B}ٷjf޹c%ncG (G% UtK}g3 ߪh?v2NȡP$e%'M&!Pgi$>ev~@M׷IurŠl7՜&miв- s `S zg['$ %OCR#mgJc'}c:~ xQ62J-q:E6 Z>3Ū*YypI4FXэ ٴ@̷gGMbQ4U~X|h0%̸}+R W],\=sI1} Ȓ,7ko,[]H7J 7v}ypGp_v9 5ljx$r;I{!_]/o&Oݹ5A[GL^pN\/Pl=7O,k\DLE*I:[IPf:<; w%Jed:e<;\㨉7TnJ٭{Ϋ}KFTE͗'퇵%mlEPR5 >[wtfԏ8)l#95R_Dl4CS.^#Ih-^|zfʳkt p|T/3ž-^^ظJ 4,ܶ>X"hn&㼈j% *#3XrYbz%ZROn`]UK?[s}!/-[Qr8lr6mE*ty/O!{?w|,xzB?ћBNh|vX|}RjIP4) L^rNG#ivJmDJ 0e4EU#;z$yKd1lX] Mވk EjSI[[5"Y>qZ"9+*x$Ǜ!d]IaTLf7Ev,Zbbӟg~ޛ&t8sBHGS=v8ELH ʜB^)d{+rP* h?ÁtvC4 lHS`|K#)'2l(v!., O%*O!tmAK\W(~'wy,Dr JVbq0q`. z#P6ۧD%-xtvq˙, ̴K G:h+*lӛջ3#D+A1x{R23}H|İ UdQ79#1&ҵH5@wY:Q*Zcnb9Da Yy=yWQc/d*YGg,] k܁ ]Y¶aJc@5M/aZapsGbT)P!n3arHr!JU"ȣR3->Tic HaNR*-μra"M69Z"ԛEOƉI$ڒ"2jjMTk)I%Arx*Is?PWd4,f\/y!;5Em8kߪ@p"Ƨs$vֳv,|\\!25)/3 Js9t;)z. seG Tl؟%nh&] zsH xn̾/_{&oQ(!`꒶dj~L!07WPaLzƟy]j\XM~<>_uϊƫ*Qs,QJ+s }-i(GhB4hu>\\zөYZH.ͷ-,]) 4/ҭKx=\nE+kIR/-LR[h2s<$QЉ)34"kQ*׸cJG87EKJ &3"+J:$zƴaf"/X(WEpjxضm[-XWB+G`V 60Bu$mkpn9 Lt)Qer!rIbRПM+,fM:Gw 朷6L=v5y*tsncȆn\e箜3sJB0,iw&sJۈQa1܀yvn`OE׋NS/ T-jP8Z9Lk7DZcdMl>،7 dn_g# Y^яWGQM`XV~K&wsA@T2{B5ע oW*}!+ҦC#N$VƁP?d1Jvrj* lQL:..SA2R3%vxvT n gJiOI`} $&T`ZsS$,T·\6ݛ_o?;[)jL|V7µ(%KT8䤧S\=w4m;( o<պ鈘RVDs%]8n,ccq5+%\4DZ;zHwԢ-o N&fGbAE~J7J`~*! l0Q̰h<Y8׉VLW5$CGHC ˻P(~@kE #8H>hStf:CsLS!k\G$b(A*@[pŎoY,-b=7JtO,_[$zV7nPj2`g ~ ڄ &"OѡIt= e#|!LJUqQ]wߎ;{볩b>*d ?*+E2Gx3%GJ#&8zN$;t-jm ȶzXGV#6H,?mm]m{PN&jY<04%8W \ͶhEme1:ҕrCIG>ԯ@*E40IZJr뺩wXrJ>~3+M)׾5-Srm1^G@܆5KES-A+y@3~3\7'țH~)0hzAD^ ~&7I=,ԓ gF ttJչe$UPPt^A@o.+11|;;dQ-C59)x>-asd 7Ĕ@"S0PTVC?X"9ÞGVS}g7r\]wƛ/@ax(e%.tnRz.yViͥf$ WNkz{W>.^ɔ' S )wV7* hh9G(cv$1>!Djk@“.:gZl386!xe?s\>~*dG7HzH;6w 4lQRaiwOXַ[$^*/ uBGA.`F747t|+mzEGSQ.5oۺ4 l.9_EDM7wOO:eQ5N޵ק|!f!Jv9e0p􉳤偰o{=,q%RRym Kr{$~9uT)nI{Va-f0yޙBٰP"hPhood2!Hp< жW)AJ*uQ+־}:>~q#x`%Eq(L;V;>47!B+㳯NQMfH|!F4~XOZ /C5}9 Doڟ'u:#MNÆ2Ϥ[C&M6h j$O 6rL,rst% -ԫV|7,d+yo肪tO\4#2cOQ(o?w%G"x;4)U V5.߳/q<40>G%Hq(T9 6:J i  ,{zFޒf;X$$KgB<HGt l8Lmm㋶p#% (9ɟhvE3D~ @^Jv2Cf0drZGH ض<$n4Oqw#gvܙ>"I~c2* x*>b?{aejky˨}˚Kgˁ7_seirpa4V.A,3Ug"н.8L 5wQ>/N;-0G+MnWr+)<\7*Z[Bs[[+uk|c\ _jrL>g@qsdMx2 Q {R_ɖ;ӥ~e CR{.*!ȰsR?o*q)`n{=W]Ӆ W}r ff H kdP&oǶqQ[ JSD+-/d4#3zDet 4*<!@