summaryrefslogtreecommitdiff
path: root/kernel/livepatch
diff options
context:
space:
mode:
authorPetr Mladek <pmladek@suse.com>2017-06-14 10:54:52 +0200
committerJiri Kosina <jkosina@suse.cz>2017-06-20 10:42:19 +0200
commit842c08846420baa619fe3cb8c9af538efdb89428 (patch)
tree16b26544b6dfd1289ef3e97048852ff1cca95724 /kernel/livepatch
parent5720acf4bfc142ba568d5b6782fceaf62ed15e0b (diff)
downloadlinux-842c08846420baa619fe3cb8c9af538efdb89428.tar.gz
linux-842c08846420baa619fe3cb8c9af538efdb89428.tar.bz2
linux-842c08846420baa619fe3cb8c9af538efdb89428.zip
livepatch: Fix stacking of patches with respect to RCU
rcu_read_(un)lock(), list_*_rcu(), and synchronize_rcu() are used for a secure access and manipulation of the list of patches that modify the same function. In particular, it is the variable func_stack that is accessible from the ftrace handler via struct ftrace_ops and klp_ops. Of course, it synchronizes also some states of the patch on the top of the stack, e.g. func->transition in klp_ftrace_handler. At the same time, this mechanism guards also the manipulation of task->patch_state. It is modified according to the state of the transition and the state of the process. Now, all this works well as long as RCU works well. Sadly livepatching might get into some corner cases when this is not true. For example, RCU is not watching when rcu_read_lock() is taken in idle threads. It is because they might sleep and prevent reaching the grace period for too long. There are ways how to make RCU watching even in idle threads, see rcu_irq_enter(). But there is a small location inside RCU infrastructure when even this does not work. This small problematic location can be detected either before calling rcu_irq_enter() by rcu_irq_enter_disabled() or later by rcu_is_watching(). Sadly, there is no safe way how to handle it. Once we detect that RCU was not watching, we might see inconsistent state of the function stack and the related variables in klp_ftrace_handler(). Then we could do a wrong decision, use an incompatible implementation of the function and break the consistency of the system. We could warn but we could not avoid the damage. Fortunately, ftrace has similar problems and they seem to be solved well there. It uses a heavy weight implementation of some RCU operations. In particular, it replaces: + rcu_read_lock() with preempt_disable_notrace() + rcu_read_unlock() with preempt_enable_notrace() + synchronize_rcu() with schedule_on_each_cpu(sync_work) My understanding is that this is RCU implementation from a stone age. It meets the core RCU requirements but it is rather ineffective. Especially, it does not allow to batch or speed up the synchronize calls. On the other hand, it is very trivial. It allows to safely trace and/or livepatch even the RCU core infrastructure. And the effectiveness is a not a big issue because using ftrace or livepatches on productive systems is a rare operation. The safety is much more important than a negligible extra load. Note that the alternative implementation follows the RCU principles. Therefore, we could and actually must use list_*_rcu() variants when manipulating the func_stack. These functions allow to access the pointers in the right order and with the right barriers. But they do not use any other information that would be set only by rcu_read_lock(). Also note that there are actually two problems solved in ftrace: First, it cares about the consistency of RCU read sections. It is being solved the way as described and used in this patch. Second, ftrace needs to make sure that nobody is inside the dynamic trampoline when it is being freed. For this, it also calls synchronize_rcu_tasks() in preemptive kernel in ftrace_shutdown(). Livepatch has similar problem but it is solved by ftrace for free. klp_ftrace_handler() is a good guy and never sleeps. In addition, it is registered with FTRACE_OPS_FL_DYNAMIC. It causes that unregister_ftrace_function() calls: * schedule_on_each_cpu(ftrace_sync) - always * synchronize_rcu_tasks() - in preemptive kernel The effect is that nobody is neither inside the dynamic trampoline nor inside the ftrace handler after unregister_ftrace_function() returns. [jkosina@suse.cz: reformat changelog, fix comment] Signed-off-by: Petr Mladek <pmladek@suse.com> Acked-by: Josh Poimboeuf <jpoimboe@redhat.com> Acked-by: Miroslav Benes <mbenes@suse.cz> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'kernel/livepatch')
-rw-r--r--kernel/livepatch/patch.c8
-rw-r--r--kernel/livepatch/transition.c36
2 files changed, 37 insertions, 7 deletions
diff --git a/kernel/livepatch/patch.c b/kernel/livepatch/patch.c
index f8269036bf0b..52c4e907c14b 100644
--- a/kernel/livepatch/patch.c
+++ b/kernel/livepatch/patch.c
@@ -59,7 +59,11 @@ static void notrace klp_ftrace_handler(unsigned long ip,
ops = container_of(fops, struct klp_ops, fops);
- rcu_read_lock();
+ /*
+ * A variant of synchronize_sched() is used to allow patching functions
+ * where RCU is not watching, see klp_synchronize_transition().
+ */
+ preempt_disable_notrace();
func = list_first_or_null_rcu(&ops->func_stack, struct klp_func,
stack_node);
@@ -115,7 +119,7 @@ static void notrace klp_ftrace_handler(unsigned long ip,
klp_arch_set_pc(regs, (unsigned long)func->new_func);
unlock:
- rcu_read_unlock();
+ preempt_enable_notrace();
}
/*
diff --git a/kernel/livepatch/transition.c b/kernel/livepatch/transition.c
index adc0cc64aa4b..b004a1fb6032 100644
--- a/kernel/livepatch/transition.c
+++ b/kernel/livepatch/transition.c
@@ -49,6 +49,28 @@ static void klp_transition_work_fn(struct work_struct *work)
static DECLARE_DELAYED_WORK(klp_transition_work, klp_transition_work_fn);
/*
+ * This function is just a stub to implement a hard force
+ * of synchronize_sched(). This requires synchronizing
+ * tasks even in userspace and idle.
+ */
+static void klp_sync(struct work_struct *work)
+{
+}
+
+/*
+ * We allow to patch also functions where RCU is not watching,
+ * e.g. before user_exit(). We can not rely on the RCU infrastructure
+ * to do the synchronization. Instead hard force the sched synchronization.
+ *
+ * This approach allows to use RCU functions for manipulating func_stack
+ * safely.
+ */
+static void klp_synchronize_transition(void)
+{
+ schedule_on_each_cpu(klp_sync);
+}
+
+/*
* The transition to the target patch state is complete. Clean up the data
* structures.
*/
@@ -73,7 +95,7 @@ static void klp_complete_transition(void)
* func->transition gets cleared, the handler may choose a
* removed function.
*/
- synchronize_rcu();
+ klp_synchronize_transition();
}
if (klp_transition_patch->immediate)
@@ -92,7 +114,7 @@ static void klp_complete_transition(void)
/* Prevent klp_ftrace_handler() from seeing KLP_UNDEFINED state */
if (klp_target_state == KLP_PATCHED)
- synchronize_rcu();
+ klp_synchronize_transition();
read_lock(&tasklist_lock);
for_each_process_thread(g, task) {
@@ -136,7 +158,11 @@ void klp_cancel_transition(void)
*/
void klp_update_patch_state(struct task_struct *task)
{
- rcu_read_lock();
+ /*
+ * A variant of synchronize_sched() is used to allow patching functions
+ * where RCU is not watching, see klp_synchronize_transition().
+ */
+ preempt_disable_notrace();
/*
* This test_and_clear_tsk_thread_flag() call also serves as a read
@@ -153,7 +179,7 @@ void klp_update_patch_state(struct task_struct *task)
if (test_and_clear_tsk_thread_flag(task, TIF_PATCH_PENDING))
task->patch_state = READ_ONCE(klp_target_state);
- rcu_read_unlock();
+ preempt_enable_notrace();
}
/*
@@ -539,7 +565,7 @@ void klp_reverse_transition(void)
clear_tsk_thread_flag(idle_task(cpu), TIF_PATCH_PENDING);
/* Let any remaining calls to klp_update_patch_state() complete */
- synchronize_rcu();
+ klp_synchronize_transition();
klp_start_transition();
}
DN/QWj9ӈ_E1"`ܷlxT wN*RQf;= #J"y^Zjݛ˩S-mHO+_rXD6rW/Xwzu e`amt&6VEn@X oi#i&=L(hYإp~v4U˫1S\,_?PLOJBQTrO'N&#cUxqnWzמ B9`0\#'u-c\sgisg!~aQp"EY`xTpvyA o>*Ǖݥðe|e;<馢|lvHQ;vjb3}6A4%|hާ;! t}ztU9揭)뇒ʋ!/_{19|c NM|;n5r[LWfâ&2j>,;w=?^~: vsR2?<3W7Uwy@pVg5\^\O:jsU( H.h=Z~B5ȡF=D568Y||qG$qŋMCj3^ƜQAtN^v9Mǫ'Q!=4jO3a Lb(yuD(/lq0ߤp>up1G3}nt9lQHIhn͓D]:0.P~ Ac->G|B}g.x٨zAjdzu8AI9z)SE:k!AZ6X=e:򀻮Cys; :PuN\dW" Ocr, ~w{>~̻pZk׬>&dp+'r{1aXŶ82K/G"CUXA=[y_.mKϲBHݔFZ ,./:/yMq[Z"r9TTѐ4m?^[,q rfDLIE_(jdA)FkUQ>~ ҍW>NYD  uVNgz|o_ Nd V%]>N__ltv,Yז:TWrq3N t@yn:lIQy-!^9VUL L$2>t4O5ݚl-^鷨Q(g kckYiRj1dSٺńR^3GC]'m((:6ӌ49~;nŹ!y|MA~e0P>;\ΓgIsG`ys}$YG*l åEh @!\Eњ7oeKX8OTL͸tA 9 "8v]w :)v:$9>S^' :Ke{ Yg-*tf4HpҮ!Y=vEյܺ L* 5 }>yaMj"@B=>3ցٳ$>Tams8lk zCڤ͔a)7x}UT~*|kL^2-B3`$vG}Mш̺G=E@X'D` {}+OP =qS|r$ 6W;ؼm  v_6dwP|7- ;]6kB+v:s~{oȣ||bRAi~g5HwsD[w ۯ2׆z;Ikߡ lx{:DIr<2(#W=wM*Aj3~a#fo%U}nX:y`!Ա(9s$ {PC.+ S @cQX2ggdQpپǖz aT/͋4` >.W6ugm K݆yuUSxSH}fF{ /I:/Fb:37R`2ȹ1gpW@A^H #1KU_7\]TlS5&'F وs)12R2;9DDx}ʽC%1PyXmbe*$řCLUKhLD+V:HΚyx0ʥnmL{ CWYƙ+&;b(#]@%;/NF;E_|z!-xmƺĞ,bQKuI0m*9w}Mbav :݃h7!˭a+J,BN5|/D2˹n*+(m#Em)k55J`>Ækcǭ< b$GrEܷ}n4ux" 4֟2Izw`r>EvjmZB5J# _ȿݍ]^.O Tze>a [^n0|LQ}üI֢,X*4/$ ߥ_zEj4"&8 .[(&hkf} 1{{Z1[fTaDBbc6ZG kwؖhJ.A:5k~ǚԜ5bmP^to#YƏ~ѼD\vMە/^t]ɷo NB8(* דYieU:0Fuǯ2u雍jo6"Έ&(x+bx>HYv''u[-6(-]?CN1ǂ]k3I)NFKsJ0x0I=uzu1 㛻qo/E䥓`"t; %R2l/]1XO>;s*6i5ӡf`],]12;|R9o 4ƚ8.Fьaת wɺERP0g0U?aĚ$/ko$ *OT:yq.oKu%a~DFFѫVRA}N[R՞`! F>]t vxnoBH:̆XϺ1W0Gn,ۃNضXte̚WSNEpz{'淊Ѣm)[K ķÆmq̛5?Y|ŔDmwv)AE3.FuJTzc~wNOS@ǜKU҅!ZY۟Z[9$Əcvu`9͂})8VӮ02u-cs[G٩i:{n2jk,T樸:\}%̈́AN9?Ow 'fbDoR_%$lJH`jEeѥm5N,!MW?Њgq2ruʮ8}̳`AN$EC‹z--l(l Y5.cCyo.Wl0E/kxʳPD'sp,ik#@#\}_=92Lo>ͳow`hwtC0c~G8k`vS3g/kf, C6ĜX(׹iSP8zwY$1H~[j#[65խƥO6Ox7FsXMtD{~;hh̿ps\T[no <ŜK?~ްQiCGǡEkj'ʽ>}5õgE٣ZƭgHE@"o;c;4~sݔlnP)˳/^CuY7 { ݯ> sWv>PȁP4\S}O4`Qfnͻ+4N|˭V%䉏䉽(PQ+(AyKˉ ǘ Kz{i[]2CRӳRoo7 o8pTv7ܻW㕳?gnw h#eNLq ,"#,i%JXj :MjqjjBOe֎%=v%q*FjJ1TbxqB͸пC3[x$_zdKwR1/D Dy<2L4B4/ *gl ,> 9%DAov.2: )3@폧u߷ ;D.ufG JZnZkoN_L-g/DEAOt9& 5 )r\2Y>%k5 ep/`b4lB~ ncos5Fe03iJڸelFW|,D}BW)kf su-;7X|ס;zs]n-zU32ٗ=Z]jԇwx0bBZK#ͻV\5 #WY !n+I y0b&τIYATndiJ<0̆zXM]]f]<(֊;#Xjbf<'[5t:'3uW"κ3aߖZkAY8opX,PQq 0<*/ENg:pV``䍑w>9ESSa]4$8nQKy;$0UT%Bf J8vؕrSHH`cP_FBtPP\#q+(TI>?t.;$>z oPz 5haePksЌuxݜF[U^> e &y-f-ݬ(Lz)iR%E7ԣ_;SU0i\ >Q8uҸŧ'/P ÷ ;lk .=&\w?!Oo$:e~6kpCs\̑zrޔ"R5Cz,^ Q@THԨX4 UP8SHd!EI"x.zf]Vэǚ\ $s7I0sƛ,[+[o@:nC)<UJ*FwCݤ~ 0] t4V,| q-()ޗ xыFv&ebfMjd䁄~z7>)$Ʉ@4#IF PjTЦe`)"έNXC4z>;p;qv:xiڗ@_éȺOoctȱU1MOCh(wvհ5u)-ϕ'C^WPJ$8׻{MH*)ܢmw]&mǕ7g+\AQ)Q9ƒDA#ȢVg ۔;s[*/ /n:wDw~ijJ;3a#B&xIz|cZ\esyG(zc<ˡ {¹%;AعSIAX&[j1'!.ktba* <8QQl,.q0w5?c%kV::۷ VjBd.55Z5,ysK$&OPQWlWpsIxMe,7,GF J˳j{K3iyb|v)8!gz3DzOPpGJ0ġ ǿQ_EP^\}K\7++asAB(rfH齞XLmE"( \Nkz./OR%i+#B05PŞ&7c!;,uw_\0d_er 4j!듳*5">[8x}Q։2!-$шK "9~1tJӯʇێ)D?&WG;9t|Eg|˼kv?w"MgXHC{wR$n[vcZoaDK75"'f&׏ׁ7th(B3GCȂ~hYnP~H kOb+pxR9wxLcnp+J٭)=ӷ5}7zO~yY|JmR&R,a}и9{NgV/eFqxyi`3ԸP0cHwsve p;@`!\o";+& f nH<9 K(ˎ.آ+|}Z 3@.0]}ε.xM%{+J:1K- \Uikv rg4!"se6Yg-mWzBnMRrWiP c=C۳Măm1x]?B%ߟ_. }C| pflhiHT"EaEokr2ڷ=h)qAj(cQ _Al~N fr7b9;k6$4Z #łl @O{x]ŘCSЕ+U:ZY5TRik+=a8q-VأF֏BŃA 5iW$~c~wvoKӯ%$&F2>1i;H^+<,9dzn/T>2.S(~~PIGĥ> $%0PQfw-d[ƫۋwaZ~Ǹ!Ey߽=-wUq440?]4Jy C:w]Z$u'{3\3RzvP)?ig4mCD),\ z[NJ-7<1i?<-sY.:MT@-k։vatw~MU㧗d*ho},|7UTKc Ln%&ߘ?Wӳ1IÇvaCPX8ŹB@ffPxBrrEt'KI9B}q=@6%}R1PJyHd% orHܰ$FOi} ϓO觟ʚ#,Fʫl!YAŘF+ET"Ǔ$ۣX(p>VIp/r X xk8'W-3EЦr/v!= DvWTN."n 2 /*M0Wuk8k7Y}a1eK 9eȀg0wE |0)xEVMjɳ;@[d;h1a Ԁ*N AgܖTE$Kmd-o1h(4@tie=sLRj!x@&P~7[N{)8;?U׏I*gf֣!+CQ J{%2a78uGX6כdm.s²JO#JvMcg^@~ۥt9';nɍ;Gt1JZ{m9Œ%bn[^P, Yn0 >H 7Ci<.^䁀.pwuL]:x=5Y$2W Hq\+Lfcտ(h}~&Vlgڭw NveKxI@=76 6b|j*E I";*LMk]NlzڮZwC t,Z,# Ŷ3Kd< 8 /}HDߨe[0L,:\gx:yj #4x{Rțl]X"FBY*  ypqK(@ߢL%ӝ<}`DQu y@J [Tl`o@WؿBdDz`w[@.n.>K*( WC$tG'<Fb |ltp{Ձ=1M;JFM}ۇ?ɞn<6 DWQ^ 2uKI&Cm6_~3ԑd#,.Üm5+nl>byQΠ:Q#Ka36}dI_KUd;LBURR UF=dSjA{i0t">)9OO~NVg?1Sw2.|5Gv092>rrX׍&Y?g{%#߁ؑ4|Hf[j? )d;^hk\jܒwa"FGȈ}d.HP $FZ4=HAT.QHf[~|2S f 㝽} }d'MRg%rHҖp ĵtf !$Z׿O.aYڙ~-IxUgUD`:nqPAzbԤS+8=ds$d,w͈(i& 3(t73_@92jPZ[iﯾs 9x٢(5Og5S閳1n3\n)!gcC_,xГ<nŪ 5 l[.dpUEA(lñwHd$Ayדmw#V%ю]yڎ "^棕NffT'kT$^{CѹD#2ǫ=:w0w% 7p@mlOłH;,,:6 ff!~+etE@u 68ϠQS pUt̳ "Fo$Nk+.{R{e/,OEv``8ϲ._o3B;Gg_>z '8?C;+ C1R M̙dk{Ye5 d`l5JWER%p j AʚCW^_WӴ1ug/pka+Tl.nGmEi. 0çiais^B]}qvg;EQ+,;!Qq%*9rF Uue5/JBa'>huZnUOqMB~}c-+Lξe&\pe-ުM"<"dBCv_fngȁފ xDG^$w+_y6B$ae2@g~EQFw'5C2E6elt̨sex:m' qsc.k$EDwktޏ~n ㆐]=\RMj_4l㕓y{m3ܖ0QEcK)3οs`v?MKG5o8yo?%Ϗ5@D+ʷQ`V#Մg\UHܐoa&L 狊==5ʲƹC` BbS-5|f:7Ύ%HH9~(` |zsdo[ERgtZFpUr"EWϮ-ϴƚq(_u6#(ҹśNQ_ CB;(T-*g3Ŋs~ 8Z%>㿂t6l}g3Go GH:#S3seSO<]!Ѣܐd͔H;ha Y%C~FhpKFRJBj2!$SѐDeʴZ@kAXgLqh{ws[j;/)w̯D*?eq EQ^x!ues[vdnў|_ Fx1L\'X2~g4O*ᰭѬ:pђyzQz>9*Mv]9:$(2YA]{|%X3!e ״1,<ļ%#I #yw~U犾1EUn %ÚӺoZ#71ߌ-9KsQ(3c,ٛ/l6LohğMYu?⯥`XǴ1B<_<_g&qۜe4,wb1t˵o︷Grgy>*IJ>n;Vka- !_E4*|$TsGKEBmyi4KepQEEBV)HmۣsLȾ#(u m'spRؚa/q,!ocCi4o5J *Fuq(]NboBfT5,XR"ڗ4j6FHyyfx<t/HeW6{n2M3_7riN{zehz[_;l\n6<5)RC35wG`[p|[e=Y{* ؛\GDCXét PejbSkbźOk5޸ΦܱtR݌EC,#s;y4̠APLrf;}ׯ͠4񪒜tiqX^*!~g=G>~}h'z$q%fRgr ur6PC1Q'&\sފbF8T`  F"P0trWs.YQ"_=u*"2hõxcsU1gj/!=KvT+pyLF,[Gl thdX+ P㭠P0;^s 1EC&Nznt<8lz"aueՊP7E[vHhԳ~E؇c{F11r-[oMq/(-NN1bMc4,&t5n84_HYV4H;up˼vxXH(D

hUJ.5d/2RnSOvrFWn)Ox}[뗥ߌ1jigK4^ޛSx!m=v5.UJv>V2"j*B]Q1(DUlpZ9mUn.utX#h_[{Jg:੿?îVܘ2UƑҲ}LJVWQ6d^3|$d {G A"%ôI$ E7>oʃC=M2}nGh"%Hьk8~*taI~_H_K=d9.ѳsH~%DWZ^""缎5e 1],(z"K0}9̨s2|y\]Ph24 ?1E?܀|%>ȾMR}f@Xz3s5PEw6U39Өw8V${7hT6T #lB8grźKKLÞ8hٟc+YeAz6'Cm:kJlXLr?m S#L>w:HwyRAT*,6nz`dld Qb1!-#Ġ7=&&0>R DUmv։B{{LOPywrY^G\`X,f<֧KFcA͹4`2bU̠{JiͶπQWBTs71Fsy .h"!]|N]7V8 LHot)sWɓ'u5>AYx,֯dIBzG^QPemvb*3PZTvէԏg $IӪČWd&GX;6T;s - >(yM 6_cjD?ς(܊G9)Ngk6-r =ld!֑J|P]VwB +_OG52wn/ޣ"zD8ѥz}T؆~|lFWy3Ĭndstt`_uUD&3..ZaN>* 4ŭն=K80B'Gԇmfc(.K0Aj`ubN$#?* 'qE̶n6+8mAqxx oʬb%G~Dh,c;lF">Y>~Cm|$ixSHtoRg6~spe49!30@i+g;8cq M:ڋ::tڳ5+Ϝcb^ԘlUh/F7BfI>kGyo! ͭbB=0W "[>}z^t^C_P?G:n{^N|.\GQF3&f:pz.R Եog:Q(v<}b}$䨣E` 2;Z05B8%\ AW,`QB#L?J:> 9lwve0\e0S#4ԩiu_g F9g̘w[?5+Lڤ]UZγ45Q=X6,7Z"iPj 2[uOM~47*"Dv `'U.Jz5E̽vLS߇iPIeWx$TpBR}=yn!m9_9Pudn!lx3n5+f,c:Gl::UlK7HŦ1pZp||usSδUݼ{_t?n6¨=28gnr[Wa]WEy&j'-{(C:($h(jR&@k+!R}I~Z'=r^`9J*`uw§?,(SAӢ!Q;>x4w?wfordpT=ҭtE7sd{*m6{lZ;5sjŚ]m R,'V;{َdzRʉ#NZRfJVo;ˊ>2I WhdԖTOlO^!7usJTg4į&*xLB%>/6֑'9q^{*XWTȰ<<{kpVW:BAmgۋo |"At\a=IfHXf$Jmr/g5,pSe>ٴeŃL:\a"{^N]򇤞҇u?$Uu_vgtʳ6mrUϖjfƒbͨG5 U&:eu\8Wp<D`f`n0O0 /\kv"O\2'WI"b}]IS9Qu`MQKP&pU=`8Kha/^?YzIɝ ^/H9z`g:볉,r\&)eB>Q}.E}|d?3/^S| ybZ]]ZAJ?Z3Vͷ@?c3PIQ o4p_4NjJG1(%:y^XoO(c ]˶.2Oᖸ>Sl4pCllJ{xxDq5VV`y:t&|qzDytn=8X]q{^&yMۄ,Pwǁ(הkkt T[@߱A]<$\paot}Z\, -Egs7}ow2v䓲.{_zʊWw^Sc -#PA0RPKs-ehA?ZCn{@I?Ermelpm(dТnͣQ))˞aН2zHU?^}2ZJIԖj5쬶T&~<GW.O٨!g5MQS֩⫵34(HAV?zb1pF tuQ)`.|S'@LJpsdw$L/g{>  (<]]+9aQ A h5vIϗz%><~nZGss[ a 7J$#|k,/ۿ Ȅ%B*@Hh~U@fp"1//ƫ){:ٔew>ú@{qcaՐBBުVi_舊̪$-AmB>k0ܟ?MG6S)߬JI"K8S<| p*lA7b㏑ːJQ-M}Uv`5Q*@]Y9.i("=S#5Pw*"F|:1:S)}-ԈaQkxfa3~8Z8'$Slty1{U^M"W$?o:Hx18DMd@5~sD U22B('`4S*a@{G,'!5MOO|־tާt>4S4ӑ6%s3]YkP@eSR+Q1ܡ'+uH؄"x'dӥCnxE c{uj}OBtvl `U}<sӝ=0&`F`t;P8,4kDxp+1!}Df| YÛn ̉MTCf7!o8oyvhӕ}1l:#|k}0GۘiKc~|1„iȘS=+M?l'N%2h-R" Bm^\#ޜ&tH9b@bGJuuP#2}F4tv6(qn(uBlug .#nS?RBFnAS4Z#)x ,bp#@STvgt#mO*t5Gfz{io03k(0l}]qpR1C_E% KGѼZyZU:.ޓ4rkY4mtC/X; (K%L6ASn–֧}p!kr.Ea+,]ad[a>wO@DCX\ܧ=,) `v[K$+jT#Kod䩎srkIR;)1ssl;z:sS*0ԯHώ9Fsɚm7wbCQ`BlM41pMw(l)bALKFWx=nlAR\u{:z)Xʬ>^ss抖L__CJClii IouyAqaD<Ե\-"Zs%3|;x_⍎i,۞XXq#yKxwbapplH05~糤3r!&eLqm}[<=RM~SXܯ?U޿"0Wg$|y}]3vӤ~j2~ޜr6M +קqėkk 6pM2f8sLXDiuH[h S1jת8$fhtuLü3ơ N, z/] ?)ϗC'1,#wwl}ٙ~;άKovTrub5c$jk=R·j$F1TAʷs`j}6?K@u,wzE,u7Ga' TMϺ-tG` ?Y sQQ.vl/;n{tv^nq#PojJ{Odxa8]Uً:L4aQ-6yMapIc(_V}]%x7{(#FO߃sj":4jϮ ,9T3RȚojJ*IٕȎσ~;? t`&'X\T/޳-J)$91Bj|ZIL_ . UB#!dء68zEXXM34Y ;">xaG{2d_XSf,Rk@/-yV:@TH{"1^߇Y;3_1Ҵp|:;GK=҄/mo۩.6{OIq s_l%t'%պ:T _g<ث;-C^*Q`xೳfP2NCx~z53}?͊?6 BUUKO_w^fy6ZfҿE|3'0_hڗPԘo`ϜvG[oIuBz P$]].q.w c:NEIxvg ̖\\ިcǫN{.rSZTz/|^L(Ѝ6F(rH^d+Ť 9u}Fxe>PD[_O[ysZ5PNQ* ,>Oqnc\Y'2IU9N_HϜb7ǎ*v퐮*i+L8K6;yc;Xs慐ߥnIӳrҴSMdKwR91$ Fַu}ws.wxWXte3Im11ٔ\Xvf7`Vx'skc ,vM6vn'!IL ~*`6wb"ϑ|ڟbU G8!1Rf,QN.$9OWJz Xaq _;4;Rn2C!ՑeƐegmx5;G8Ɵr@7 ~|e*̊\Ofw=^l8wuTqܹiiba`xpθU3? 5׋1O(+_;yDWU3o(Ó VLٓh3X9ulYFV|Y= GE{KՑou7li'}jzf&nܕp&oS#'* 2C) u~z'7KO9fGkƹֲ}b\mv3@Lr XJd:n \m )DAxumof LyQ.;dbpjs*]h' eMMnHNDKzz|{d˕a]g"m^5kOݱxW }?F;w봹54gWFxOߝ^jj9cXrڗ3G0::Lc9H5^"(iBd6z>:m=R:FI"yj2xɕv=ZcҏFkOwP_=v=3:g;~Cǥx块GL&1~c5OC^ "L[I K8OVu " "[,iic< )mu5v mgWTdu7DCJ9{,w εѾ4RKUAۮac\1n\ <֨0&cQfd'H u =Yzu<dN?銠OEj [ d-:?/K{zjs} 6IL̫Bl2,zA@1s0r=ʆr\ePYy 47\  .lIL$i.d\-{~wou'F mdW9T/CP~]9GX :fXWv}o1\m4Xxt pU^NHoZ4F} n.- .Ỏe"n%#ܷ9yE cUUb5z34?7=[c}j.P5Ty¯kI_YΨ3OM&,*8rLpy4(«;n1v=OXѥcˬ"UX^mg5;yNx2H PJ"{9WmTYe'1et:*o!̠*3Ir˨2XzbgYqˆ=~)>i elם%R,†ӋF@(ڃJTX X֚o X˫^rZVB߬nb2K/"8I1^`qJ;=U?hv>};Y9 t֣H|$%k.B:1306Tm14蚠U0V `/^UZA\1B"cVrYaβUuUB4Ͼ6Ɔ?ֺ԰8;$И::) &ѱu\ 8p4zAB 0exXj("Y}mP14k׃=Ta9TQڀ[x+yz#$L'#ǂa\vM!.­7Y|e&KcQ2? CUw숦5XKjn{{U4u5LQR.)Dx7R˩xL2xsN"[I˾lҀ7>h; enwiJ  H.e(oP"W_UGɽOgԑdzlԽc^3Hfj ȩge!bO 9Y5AX(Qz ԙA˓JoI%UyJ1] lTmm .Q+J;!9iW|lݹFhݕ rd  ܕK*W'μu2"(Q?}|vn2jE͐tα\h|xPeRYmJ~bP PcڲZRs' .`hfcyP_-.>xT~E&k\nzbwyCQ#;nIL}:j!~@j3 84W9v4p5j Dza2XLn6'^%XlCpq\Go ;N0ΩtNyࡿ{YH9 tw9s7Ë0W=)Բ$G'tzU❗/( /[ \HA#]p1OrUm=UMBR5.l=A @ vw\3rh6iI(eQFaA(K]mIO-azMt.3׋Ĝs>WZB|C: AL=g|uIy]PXnܳLXgw> <Fb&Mf}"Z~&KiGX2^S}cܔHE1tԔ'!>[,E: 7PeP/ !oaxϘ_R~&@~J~9Lmpyи#b*ֳ +xpd8%O2ӹELP% V!dFp^j\Bv9[0!iAF(&!W6bT7r̄>PZ>T[û?KKb P*T6x#7sE#48%+S\p8`kLqdE7Xrg痨9>S>+ oJ*>f~b-p}xœ~|d |:Jt&tzzR1so*>f |L7)WkRkAYƓT4)ajq+B A,LcqdDe -=~L#P,zQp-#]RDw2Cag:^!;K0cņ >Y>G$]# jSEbmgg_{WmZPaoa /tu{H<^:Z>sʜo'<#BֳX7dཿ[bo[y>F975#}MALc;Y딸M1;!225/Š7k.?peGR P8moRqSFʟ1V'gU OzN# HJ:VBMhϾ{Dy>;wb oYBGx٢~ l U%ݳ]WuZB9ߟ-vlO=$c:5mk7MQ8Q)RrG3;ϒ(u;Xnટc==qq{^w{ݘhjcY^Gy;eDm491!Ɛ2ۆXKUUZˇ>g Lf4HRMAƦ%)* fz^'ǘsACPƶ `G!oL4? ,OeMCS8^}5FBy"!~Oճsx3 ̞ܲ-4 i (}Q.{#=Cc<p"p//~]EEg'tC: r'v.MlWsx_]x`'&A,x 1?+}m7pejtP@kᣠP{/?OL:Z5i֓~$E~tCiim .A>۫98:%{V(C]:tGzuoZ?a,67hޣ㣓{O`v =!3\,ZӞΛ}+{ g|LYp"?̓'A?ѨayH⣯vyp;ͷ'Aܺ8 :|w[)ξvz:8WuxvG3t KP:}݇gS>9C^nv,9Kf*ąßVfF{V;O @q @ 2*e'8cwCO:Jg ; P^D^U+/焀A!@iM-Ɵʪ 8?`p CGʾ-XG.*YO)x,HRQ@{˴T5}}0[w-|pB &??g/G:dS5Hz?ǜYJ7'G`C]>~NW* Ō r2ᑉ)#_$/V_/Rb}à^_}ÏY,>Pá&)&R$"7~՗fJ?Wpge5f x!o 9K?S]M?f> ۢSS{%e ,[0~&8; *% Ѻ=W.X4~Dx4O7uփs\ CmEi惡=<{歞m6VZP睧F<Μ>WlϿcf_gΡc4`ls8 ݌7rv_;8JQl%hA9ouifey9?ʁiڸS 4[v qN ; 5qM />,4?IjwpEpB|7g\ů. ,_Vc[}Xw7_X5.s { ĴHnm/:}ϵ߲\HGI|߇|>x"싸(DH+t$;Y,[H? ՚ee фrf &^i{Famfv;17I_%=ȌHnp'~5nzmԳH)X^ *|o^6vsuLN ~kqTSwIR4@"1Yp ^T~o{0 BH^},V6D^{͑Y>'F鬰g hӮMҌh?68/%KkH bu^cȍ((=[_ƒ ɉ9\vA06yG q攢Dfoz<7-`(ʥLzYP)={6:a}\  Ђy,W_2G PEOvP6V%'P~ F{㗫?/@<?GF{;puc>BO->| "Ŋ/jfbi_iZdXY* ԡa΄$`0E DSHRDRUEP>)*Hh%JwUE48X@<__dD6{~߲Q,ȴRGl7$̩mw/}qy?$t .Yyg*B5(~MP4~CW, @ss7mL~T%}#o5 })ppv5i.RceA߃&+,5 ?GMتY{(8v?_H>? l{b=1DV@CZyU85}WUbI.7m0:N$h쳖z% >O>ϦHD/$D ßE":46Ύ,ۥ6ﻛy(U7_wJum6G .^'oPw ۯSA*&VC"OKHce˳b *H1`!p!5n  ;.b&arnr!p%ES舀RDY) -Bz [՚!ۮlWQ /A6ے\ye`4"IY䞐ꆹwyUj/x'~Fw\ ; ڨ8 ,PH ! Fb2#ylTk^)ZJ>RMo0/54+d$aމ-_|QD[v>A˗Vg1JrQtUaD;wu1/;:=9сrMPM#ZY ` 墠?Xg\P^>Ή? e.kyXiڣXI  a4Gxe UbPbLXrb2vjH^/PxOM.; (xx:6|KAՈeߺ_}U\+ s4}% 8YGS6dE?ue$m&]-Sg/@CL_]+xy%2^,ܿ,|^6EO xVRwnuc 8UIwOv,u}R~^oV{޻g60Olm'CcO}yXtjcdU 6Sσ?+(r %;'_AAz֓ҴQ.Rn>VeUN`_WwΒ)`NٞE8"g9w[XB<܋7;; CJ6yE 7>q\"ȆMAbokzƢcj<#x.sl3PRn_?pxBڹ]&u9mqmY[SUy24C9Px./V!"]웜T&:IMTQ7ѝMa(w]&hg OLD1E8DHw}U|\g׌;fd ǀ"BD`T#,Gkm3Q 7".ްAAͪY/);1.M؃jO2.m.[$ 8 ߢT2+hm ,UH \|s7-~wK`^~S/T{qu"-n}XF-ء7/yg|M:?3&0r8 š%V*ή;=s?=zWk^Z>qrX,e #lL_nF\"i.IMk5*Iy(6ǜIg&iӞlB&%Eɡ.Cpi`?ܣ4N3zA8!Q%",pCIQ#kmj2SF25妼Kli2$Ȥ3ykD4$'w)I"EԑߝHcSX(4XCZ8QcQ c37:AD!?GF i1;I=} {z?5('۟}F%jϜ'|SH}3X~|A?h">S;@{ov>`v d~z;1(\+Zic=K%J'u^3rC%4tc(3њhvۗf5.~2m+o DM쩡";`4VO BS9rP|][эI1qM6ZfY׃[X cl(8x,3RY~.o̗|aֽ2h<;=7&w}HgFŃ;7@<:lL7Zi[VdNϻ6Þ=T(_NIN%2t`S z20D(4k&6ûAjtĤA&]6;/8 =: $kM֝ABu8qhu;8<^orN g'ny؉W:~˽׈ME8տwz8RN7g+fjJn_˛Zڿ.vþ}g 1$ĞzrN…pWS9qŷ=!_wkum:f- [85:Sac/d펝{X$UgX'O,W=0% ~O~y8qvhߝH#XkVaіɮlt{(jL/Fw6W_N.ߤVYaŵ-10ܕ B'J͈8:PK):̈́djz:+O<%5ʡ3tDg TZCCJu"b(@}cmxDR~0^ӀJ2ص;` .0xZ=QݞOnᎺnml%$sSs,` ; ߛ:ØJXCD6 =6~x?Hq=-rqŀK]Un;hl´ѯEZ[9Ŀp셐=ZujfC瓨3{#z }oO;)׶a϶dx CQ&8# ;F2[8R3UEvW(pA @@PXQ:D|\N%4+AD*P%HD'l |kپes1 "M;/sDV(-FΕi+xWcpX`&&4muV׳k|7"Ү|MȻ/dR ~cL`C%q. ]0Bi$u\IJbLL 3&ZH 2vD@9^.مr71 靸\4EaMx.{1Ymgj @- ۜ{&c#$g95H]j5/W^2u[F4s@:Om9f{D>oWg7슍;QtrÆK[^VAi.f@uX$ ,4p)( H/mAD"26=!LE xpd,p$?FG{;p6`ۂNApYf+}ÌrvBTJ'*j0E߀W(9Z_(hQvmz;.΍/D}k{/8dn&).2ѿl#]8էVQF>!˿VGzњsߋꫵemNn}X)HD*67͢jJ;-۶vh;r<8g]3Ӳ?M&&l!Uͯkl֫}=,:6h!=< Os5 5+ H<:WIE*qa%MFy.*E_o4H d^q#KbZ(x 7C d#V`PNmOlO섁 y>ai>>}yOUY_ߥ^O!VrAN_Sx@u_sk1&0̧Pq|K)2" CArJZpvvSU@xj| 16Zw| {+[/e*ƿUGHLup@@)sR:S?z>&C:vU?Y'vaWnbך,F)<7>ʞ/=!Lb>Y8zzNnld_}ffd V=SM,_T'*{UتK|g'Hs QEK;qjBNFttN^-7.~TM!>p'Ig@fGN'nN X\7O}XcFVsZ߷>nWw{`beU@;9KvP1#A5 0H\@jB%O`sʃ7+Aj ܼ@v1 & uh< cpty7DBG.y&5GaƬdbb2_9 *zn3Q )TR4E9$ (>'pGm#}y{y˸qq8a.1ЌhԽE8itr+ w(,t b@~/ѱ^؊v؂s_l ىQVÑE[f6gfX@ V**ߢ$ǘvf, ;.l"-mMmJ Lcl  @I>nbv*U0U,#o`ss^\.ݍZ`:f&,|y0BnƖ HXМf2ɓ;t/0bGSQ^'&1DBpPd;Kr豵9jgz}\fT5T KGiMi Z_Ge"ND%N(i`z#'P]}'jT!n~ [Id9x~O%0e,9xNI4_}ZvS7K4`0vXGi>R_D@\!vioGΓS.ٓU[eg jM< |aCWRxoІC"b}0N Azz%tx(&yZ F=6 vvV'lpfJQp꯴Jkꋹ#7^ɢEWP'_&^eP<0@ لyr?{7CGfSc Q$!`O_&Pvr9Qd5cݪwrt@n hQ1x1/)D5lG;jNB_49nwşl9b{$@Sz}wA%Di_+o׏ tc@S8$&('gE>gto\\$bHCztl&\,"nDAhLeGu(Q_?8:>7rWRB/.5ؿK%!6 G2>>Xd2*d (T"TأX]hy <}orYU{") 螈O`|7qGI B~jz1|`36qMXg8}+cjr\5J-BeIBVW_gNtMsLBt T7z|$B]9\Pbǵ;7D7Q)OLpoA|a5 91m: xLO,]3a*=6-м̈g.ʷ(&oJ='ކ 9UtRzlTv; W  qa 1yTB;H ;96'(1 {7&QHHL,cIx7C+}[I4e2ѝ_T#)xـ 91"FIċ?AD<|ֲ>?5J1׻WGI"f#Z8Kx!bVf{(|c1BۀbdoI487XW,2ǎr&q[u_fMo1IN$ŰGK0vCa0303G>r.k(GzrVC2HZ_wO.Asse.e1GC0_9B;m߶]OwY[WC8c})gmJSiTKJ3[0hyi4&0l8RڴBzi߅غ?.?~S,`eo]~6{ro>_t'{%WVyw>@!@P!U ^IV/3t*L1ُq-xB6{"7'o5a$y`(NzW_AuuP;p`W$bb=1ghwS|8A1F^gAfO]upI%c3zvx!{*D`a-ڎZZf=fve5̐+v<{ۮ?:P$G-c^馻0kB- B8u"+ %ˎytߎ/*噎 gknיbKqCk:?B=]/s?M'gsM8U1 qWUϹ&U{|k ko"Q}_U+!(x`1 YsLOoAS"C׹6MƿJ؇U@$DvH  m[1kCmV= mͨ# ! ${ S>;-p*(q;a"XHZ x =2z