summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Sneddon <daniel.sneddon@linux.intel.com>2023-08-01 18:58:31 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2023-08-08 19:58:32 +0200
commit0cc5643b63aef90165488dabaeff92697925baa6 (patch)
tree68845144cf04d10ce07726f5daededce0b37aadc
parent348a89e2018428c3e55a87cdd9ae3cbd6cc8248a (diff)
downloadlinux-0cc5643b63aef90165488dabaeff92697925baa6.tar.gz
linux-0cc5643b63aef90165488dabaeff92697925baa6.tar.bz2
linux-0cc5643b63aef90165488dabaeff92697925baa6.zip
x86/speculation: Add force option to GDS mitigation
commit 553a5c03e90a6087e88f8ff878335ef0621536fb upstream The Gather Data Sampling (GDS) vulnerability allows malicious software to infer stale data previously stored in vector registers. This may include sensitive data such as cryptographic keys. GDS is mitigated in microcode, and systems with up-to-date microcode are protected by default. However, any affected system that is running with older microcode will still be vulnerable to GDS attacks. Since the gather instructions used by the attacker are part of the AVX2 and AVX512 extensions, disabling these extensions prevents gather instructions from being executed, thereby mitigating the system from GDS. Disabling AVX2 is sufficient, but we don't have the granularity to do this. The XCR0[2] disables AVX, with no option to just disable AVX2. Add a kernel parameter gather_data_sampling=force that will enable the microcode mitigation if available, otherwise it will disable AVX on affected systems. This option will be ignored if cmdline mitigations=off. This is a *big* hammer. It is known to break buggy userspace that uses incomplete, buggy AVX enumeration. Unfortunately, such userspace does exist in the wild: https://www.mail-archive.com/bug-coreutils@gnu.org/msg33046.html [ dhansen: add some more ominous warnings about disabling AVX ] Signed-off-by: Daniel Sneddon <daniel.sneddon@linux.intel.com> Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Acked-by: Josh Poimboeuf <jpoimboe@kernel.org> Signed-off-by: Daniel Sneddon <daniel.sneddon@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--Documentation/admin-guide/hw-vuln/gather_data_sampling.rst18
-rw-r--r--Documentation/admin-guide/kernel-parameters.txt8
-rw-r--r--arch/x86/kernel/cpu/bugs.c20
3 files changed, 40 insertions, 6 deletions
diff --git a/Documentation/admin-guide/hw-vuln/gather_data_sampling.rst b/Documentation/admin-guide/hw-vuln/gather_data_sampling.rst
index 74dab6af7fe1..40b7a6260010 100644
--- a/Documentation/admin-guide/hw-vuln/gather_data_sampling.rst
+++ b/Documentation/admin-guide/hw-vuln/gather_data_sampling.rst
@@ -60,14 +60,21 @@ bits:
================================ === ============================
GDS can also be mitigated on systems that don't have updated microcode by
-disabling AVX. This can be done by setting "clearcpuid=avx" on the kernel
-command-line.
+disabling AVX. This can be done by setting gather_data_sampling="force" or
+"clearcpuid=avx" on the kernel command-line.
+
+If used, these options will disable AVX use by turning on XSAVE YMM support.
+However, the processor will still enumerate AVX support. Userspace that
+does not follow proper AVX enumeration to check both AVX *and* XSAVE YMM
+support will break.
Mitigation control on the kernel command line
---------------------------------------------
The mitigation can be disabled by setting "gather_data_sampling=off" or
-"mitigations=off" on the kernel command line. Not specifying either will
-default to the mitigation being enabled.
+"mitigations=off" on the kernel command line. Not specifying either will default
+to the mitigation being enabled. Specifying "gather_data_sampling=force" will
+use the microcode mitigation when available or disable AVX on affected systems
+where the microcode hasn't been updated to include the mitigation.
GDS System Information
------------------------
@@ -83,6 +90,9 @@ The possible values contained in this file are:
Vulnerable Processor vulnerable and mitigation disabled.
Vulnerable: No microcode Processor vulnerable and microcode is missing
mitigation.
+ Mitigation: AVX disabled,
+ no microcode Processor is vulnerable and microcode is missing
+ mitigation. AVX disabled as mitigation.
Mitigation: Microcode Processor is vulnerable and mitigation is in
effect.
Mitigation: Microcode (locked) Processor is vulnerable and mitigation is in
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 82d11504f0bb..495cd57138ab 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -1511,7 +1511,13 @@
This issue is mitigated by default in updated microcode.
The mitigation may have a performance impact but can be
- disabled.
+ disabled. On systems without the microcode mitigation
+ disabling AVX serves as a mitigation.
+
+ force: Disable AVX to mitigate systems without
+ microcode mitigation. No effect if the microcode
+ mitigation is present. Known to cause crashes in
+ userspace with buggy AVX enumeration.
off: Disable GDS mitigation.
diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c
index b7e039a671eb..9b047051fb11 100644
--- a/arch/x86/kernel/cpu/bugs.c
+++ b/arch/x86/kernel/cpu/bugs.c
@@ -652,6 +652,7 @@ early_param("l1d_flush", l1d_flush_parse_cmdline);
enum gds_mitigations {
GDS_MITIGATION_OFF,
GDS_MITIGATION_UCODE_NEEDED,
+ GDS_MITIGATION_FORCE,
GDS_MITIGATION_FULL,
GDS_MITIGATION_FULL_LOCKED,
GDS_MITIGATION_HYPERVISOR,
@@ -662,6 +663,7 @@ static enum gds_mitigations gds_mitigation __ro_after_init = GDS_MITIGATION_FULL
static const char * const gds_strings[] = {
[GDS_MITIGATION_OFF] = "Vulnerable",
[GDS_MITIGATION_UCODE_NEEDED] = "Vulnerable: No microcode",
+ [GDS_MITIGATION_FORCE] = "Mitigation: AVX disabled, no microcode",
[GDS_MITIGATION_FULL] = "Mitigation: Microcode",
[GDS_MITIGATION_FULL_LOCKED] = "Mitigation: Microcode (locked)",
[GDS_MITIGATION_HYPERVISOR] = "Unknown: Dependent on hypervisor status",
@@ -687,6 +689,7 @@ void update_gds_msr(void)
rdmsrl(MSR_IA32_MCU_OPT_CTRL, mcu_ctrl);
mcu_ctrl &= ~GDS_MITG_DIS;
break;
+ case GDS_MITIGATION_FORCE:
case GDS_MITIGATION_UCODE_NEEDED:
case GDS_MITIGATION_HYPERVISOR:
return;
@@ -721,10 +724,23 @@ static void __init gds_select_mitigation(void)
/* No microcode */
if (!(x86_read_arch_cap_msr() & ARCH_CAP_GDS_CTRL)) {
- gds_mitigation = GDS_MITIGATION_UCODE_NEEDED;
+ if (gds_mitigation == GDS_MITIGATION_FORCE) {
+ /*
+ * This only needs to be done on the boot CPU so do it
+ * here rather than in update_gds_msr()
+ */
+ setup_clear_cpu_cap(X86_FEATURE_AVX);
+ pr_warn("Microcode update needed! Disabling AVX as mitigation.\n");
+ } else {
+ gds_mitigation = GDS_MITIGATION_UCODE_NEEDED;
+ }
goto out;
}
+ /* Microcode has mitigation, use it */
+ if (gds_mitigation == GDS_MITIGATION_FORCE)
+ gds_mitigation = GDS_MITIGATION_FULL;
+
rdmsrl(MSR_IA32_MCU_OPT_CTRL, mcu_ctrl);
if (mcu_ctrl & GDS_MITG_LOCKED) {
if (gds_mitigation == GDS_MITIGATION_OFF)
@@ -755,6 +771,8 @@ static int __init gds_parse_cmdline(char *str)
if (!strcmp(str, "off"))
gds_mitigation = GDS_MITIGATION_OFF;
+ else if (!strcmp(str, "force"))
+ gds_mitigation = GDS_MITIGATION_FORCE;
return 0;
}
$\tD=mČmbICgŕs&ذA8dXd6t5lL(\,޹٤lr֎=]<*it$qս9oȂeidMYd%%u79-1gal4,qLz3jGDl1H MJ5A!@n`K-"kAfWG o& 2n[ &&~+&;^Uޜ$Xc:an]ZnQڸR)'QSLcePxa}&6Geچ2n]nic$iuI䦯#܂w/$&^o-5O>C0r .SYzg}!0B~4Qj$nTj! ze]wT.zÞ zFwm>G E:bɽ~ Rk5M<e:U S ?.!fv %spΗe%iجN/`ϒv'tMk =r GVqG^srе ;ZfzPKWK}y'\%BB!DCyDŽ֡`}I:[£ɔd͒vEy,8sShSLVDivImP[2[\KofMHrg b>:͐[eA*nHtN}^6+{}zsc"7 h@G-/)Gz4&@* gG\_Ǻ9A#4DH]_:Ml|EY IЭZ9~|Nh cKBn;My1!ؘ̬T1i"zN u4sNkX."..R#gwn<{z 9"cM MdXA*tλ1^OJ$zoZS-_}/=gIw["9;a\"wfbG?EJl*i,Ha96Y[OzFP*(ޥfo,~ubTPZVheأ X*z{kBM2Z ;*ܧSyo[^=թWڹ\"gdx㝻 cb,*O 46\3jeRm+W+RFhrEdwLR餚aJ"U"YZ<Ɨ7!gkk7n@3[eh#$oCyLBzje~gzXY;VA_f@rɢ\~}28-krY|z+Wfd]]ǧ1O[}Vr̳M(OKs>!t9eA 7L,9DKE=Y.I"׍B0'^zڦ!)9 <(%_T-|"#g CdtQQRup2{_]fפj!@iNzG߇x\ychx0>4ᑾmf;sBhBjWZ ,H*n־!~wN]K_-:QL=!Vg D^:gF0ݣ&,ѽ$rn{y+(,P9^1E1 7R!gԫyRkA,oHHGk?K'6, .`2ubH'\m,|wN໭ ejhyYpQ(FؿmuLw&m&9]6WS9Jb;25KQ X910鉸/P-^Z(~`[2:qRh}֦*JN=ݥ} ޗs0*e2a9;Rl >MǕ:+jeU FmޛIpk© F=Y 2[|UǍO!x'1IrD2$ՙ4q]@!C\Mf24Sܕ32Ҩ HNjx8l+23iMHdUq'D:n 7.)hK0Ba,H"c6 *l'1=SHRms0É.G6%td%uFZ!B |"lZ%H.FD#pdEa"c  4!2`Bլ\߆6n魐^(z礵L+#ɨh 1ZMwUp`5˨ bMRXˤEj8RVbNh^vqLp ݹcX̙[VR[ͩږ Z됚\Tgf͟AӛB:CoapRC(p/Jvfy+i%HZ-Mv0G2zu&mkܯ,UThߨ ʢa]!h_k3F*r 戭CZOg@eqG3XZVӂ#$Zr{R@}m@ƀ)&v-bƦ5ECtđ@-+T#V> Ǟ}C#X,u7yqSޒ9ܨ9iLi[Z5<N'_ZPGCeUoTk;ۙbАy|f hb\ةnߥKaCǒu9#-QZ0:/@ ت0{3GRrJNGs$=w|P/i`7 h7,jqi/N@!V,aHGJdua 3hn5-IԶ 68sԨj^O5H TWI4Ǎ,KH@tlA A~X {`:v Ԃp7d!oK%bG*\=hG3:CBƓYFO^y7=OԪ~O#Rci.AUd&Q{̘8h*bZ.D` &kl dlb%ct=Es M.ejR뒺Q҇ɜ҅P3 [)Ǝ#S6@s3ožNKs{^ZP{i0C'Ww}kTSie0I uI&g ԙ-QHUWj+ ڭ|% p66 &.m5523 lG?4ӔEEv:׹; s_>K0I{TښYwuA 8[~f䈽^oBf-ۯ6=n,o1ߔiD/e K^b'h~zh܈ߚ?N+7‹g"sZт4+L$4+ەWBmevds<"5CzPL@ħA5E^x1Q;]} svCdv.cx8cↈ͠vժK{[d.UwL3aJOzyZ}loCȑJcF@U|I3u:# P1)Ֆ ۴iTNoC-(\ ^#ˣwϙIz.jD_T͜eLm *ivA=}N 碜 3@h"ODooyV .*)N"[,W@|UoHKLIZNZ\WWt3RP$| @!f*64I?hI.؂"D@.>7B@dv YGh4|G1ZtAso]t&:܌"s]wxg&ދCVٚKdh{+*7E\Gyx\B:30ULXR_iNY)(NlW@Vհ¼~\&fިq6>)JR*j 6ԫ:sNeLvbo6*h~;*뙻 ʂD.9Ke()rYrsZvO]JĵGO78 i ; fzsB*9]:Q:s/PZimmHD1P< f@#:юRV@4u>0XmI;5rt#rAwyځwuo}oM貕?1+m>,?bZJu֮ךly^xB͍L$qmv4j`拱CL"i&#f Me⣋˙.$V?'ec/rWsT!,ؒ`Kv\zWzP 3R}}U!GW + dl[xOG߀5~h:Yz8a]|q:G HpPJ,A8B S,3{BwE(5lfG Gi|O9fw> b|pSkw,y+,g6+P0>08#}!gj ĉ6jEAL' lsKuaI뎞=tN$FF*q^tڢ!Hg oyuI \H:,֞L}KC 7 tٝi "P0n*[ԯ~Ajכf̳ƢzvS7B[TMcWXkqѴ$mus ?*Mϊ'`|8),|M;cػ "1ZYTg$zNZU=`u."YTy0|dRFE F٦çYp {{cfǪ6UOڐl;! 7|VmJSsq')Do#TV=Q} b^.+S>/|&d,ᅬA?@;6sNa!ѐf:|,O6.aa~u/Ǣ1)P!S#@]̘fa4Ɉيuױ:BsczPeJ.pCr5*,oXbBugYcN09;6'ʺQ<8J:.Y'UNnNsGؽrss^W8]*c܃R+ZF:P\I[,yGi;>W`7TMiT{qBLwsZP/zED2I SrP FejZ\:pe`nHѡ\MsL}fD6 .0U>6ҖR~8C')N'&^yOwǮfWWʎж[Vn~Tl'S2‘7b0A.r\<fߜ8KZr8@e :68 ncZf1p+MzZ%7# .wnqZYfՂVdDtA /WbҝF#^͙'!^5fOQgN/s5Ni9Ln.;D>0C_ N_aX!Μ{;|aUM~MU'Pzi;eȚ# /4vz,Ǘ\3=W`5TA$B jPpx6B`sw--}] 8$=\0Mf:ѝN.ܗHU\0(PdƥP&Wj}qsK0E]]etp]H\hvdF5I$7_4U]LKè}'A~'h,GO_ky_/>`qE$hY,Jx+\y>uǭf6hFMuȫ ԨZ5!';^UEB0JfUsi9=,,k#GR~n۬I5qsl7+[؎ .i*ㄗ$H%]O?XV̘(yPO) 35UѠZl}^zXf=jO^iMu.V %ت{RP6Vx(x| =O+ouېmGb 2(/Z-w UM]d l w{1u`A] ǪU/V>-gMXn]DIqO ʛ3 i9iW/@ˎ Rףf';s2NUϪԡa9M b<\ދ0S2| ).B=–;/^Pwm$ ַTIek0ƠVW^^UvIszc̸BARxm|";3GlapmMkmR$%#m]|ʕ[pGrdJ/$sPF2^@"^4IKZƬ G:Y gz& #J ϥ!]eT|#EٮSUΖ[K|!t=',Į5NA=^H|ZİU;$31^6Rdsj+%h K:fpZ$7[/sZ`q0ww2izD1%J6n숡`1RasY&CcБ3])M.5݊|`CI;:G1DŮA6wn3& γ#RNz#E5?@ң a(چk,62Zz`>+u9L 9*unu4hj4) NbgƕaD%[oUi&+.a*tfHmpSk2J/~sXoۨFC_= 0'Ä֚JETLb) lEմ=ɬvbN0z~dk9l9sйG2G4d6 f`Fgگ:g@USg:婗&,sSdlõjHE^ovoC[ pK8W\_⾝Фzԋ 'vLt$*)(OZn:dUA)f§j Ř"&4]\(1gdsߎ`>}K!h~lݵ?%%mjuݟ zg=,6prRnm-R_ѻ"43SSw^A#̒ yO]aF4**hXĉ=-,T'[_O&ϟi=畳!IgNd0jNjsfV:F+HN6zٌSD$윥Ms=EH)SK-0Hȥ|,^9ȑxu@ ks܂B<]| Vk0iqRg60Lʑ -n&+¾>q%ߥ~YJa37\ #In$I$q IWӕƤ`KvU*J=Wtu%p!LY5Sz"jJbbj0ᇥAm#vc`t6.gLMty)>"IaڛoQ1mPʎ"TCf"!L ֥B AuKk*- Xj&qijWoY( T20sz爸wIa(8= h0_RƧDc>oHj]:|G)_y5 A)XO$1傲vҼOL i͊GO ,l-=P$~BX)E* pͮ2URis(_IiVnܬ4m뫭=Yw2KT9M$ƒO\VxBO?0 )+aPdT;L )5㺂"0*ټ}1&T5u%Lp<5kj1X=.d@+zdz(" M-\ahdyY|l>sqt>4>leZMBhwr&TQP(6!S|Iz2\#uZĻfgj;=4ݗ1 jj _H%iXqjdzE=ףݰX$+ x[My7lR{^Pҟe6!ІSܪjM#-2,[La.F\ȷH7mBxeS$9+Ej?wYd=?<`J V(NSN#G=NBdQbSة4#agʗ592м1#FLddՅHªtMM zJ}X ^20솮O !F+/݀e?DY1X|0k@%,RL6zTHsTH#KI6kpAYhسy/WIQaA٢ E_ZEs_f/KI l՛zjT% 7w:/k9;3Az[yUjqqz$rN!(Rz LI5U&)!gds~>v 4xz@$+M1S- ;{| TZ5ZXMI5 Z~pFMJHJ[]2cQ-M&o:hvjH`}AQ.f}IrA_*"-M#_]cI;H09͙@c#7S" 3N;4ahT+ oONoF0Z" c{yI˵B$^TUOat4_;\'s2 G)Ɣ) x)}l[!S\>;?O/4+3܁AD!klu#p3$=T6!csgQMdĻ:57OD^D*x%4 SNbX\*W{Q4CQcc&[I 0wfhNHr([.1tn_w.bjGnb8s2rDsҋV% _ Εޮ}w.Jei9K;/#JF;fLM`JIkiHKlkϳ>z+VpMң_])V5b.ퟸ |*^y`Kz]'(gW Ř#C OpjVZhAHl#CXxH2i;swS8sriܖ[qՏ 1=g%:Ϸ+551qo J>0!x1w݌TC0L45 gIFPڤt5d٠?΅6o0-i\ +A &t'S9mr5VE";8Q;Zigpg W044֨78-fn54RGf>n2AO-I{U$JYQ%e۹G@fw|vvv\A6:g>ĭlS~zj{AvAT 8>$^> 3$-auúM6$̟TYz$l5بZMJ}OH/c6F/\@̖:{#zss+ =!uɧ YMd>x.֏AԤjֵ=p؆q?I׿ J@L[z3u ՠNir Cyã8)Hኍ Wh&NWܠ4Q N(x' ~SORɌ&8p ֢ߧZ)f^oi, <͹/II??$vB"'rq}5̝:Hgf<7]o.?Ripn CZjTj6Iΐ1`C[#mիǪyLV@ÌUBpXgwNRyލ6h'|a|fjfs\7u{JR@(IϰxQ+^MȾ' {{p!{&oza=Ƅ 9 [ߋ78eNkgU vC?訃)hdh¦̮pFȼ7bpݨ JƪUXRء&v%rYLRef2}ޜ@iNdI8PS.JfbS)8eoxvzm$5dX0.R>dt)< Ci:HtlGֿ͖֝{Dz^-}0<^xYƤ0P .o\wR\Hxt!ڼdGWQ%e_ o$T##~!\)Ot?ƫ>*BE>uAsXjX.즷su1\i p4u%0qtKKP"+2d w#8E]XKU(u5^7Tk6'Lt-Q%a" !XT^XmYWme(8CXq?F6ۤ"9i엕RlP[8`Sz+^dJLԷ,8&SRЅ(,;'bٴ:pqSH* 85Fc>' ; pppz+MӘȪu궺:Vt_Ѭj|mtgHXd93*eou !B%u㫦q3b^PQݜa.TgGc f>$ FSV;UTM 6ٰFBdzdut1qoH%v g:􅇽C9Qǖ`O.Eh~nO&@ SbTOɴk]|9ugji{io\9̥ߨD3̉c8$9עvi 7iC~!hQ_1+w.ŀxfDWMOv`;3~QldoT}Gp' RwfF("I3/ͲI|604燩 IRFxB >Գ՜湱qXqkB"2d9gjNjwZuTLk(Kll C<-_S%2/;RbL\)F%=F3ZxLIȈh\I^b:"[: VҾ)gBCw U'k-}ُreUYe,,pwA[iތ'YSD-VrKM\x1Ct`x޺Ԯԉ4{K^<:&Cs7}Ϛ 1 i.~f;sF 5VBœtHtuOvћ.c0ζsYYIQz_mYͪj[:HUTg(CA +iG3d~'bjжڭh3VkqITڰV!;N71o[K*C:>͙sRSO0e:"t9]%xm@P錸JVPer9WT{:|C9‹88[(ڨ9jb.iGz<Z&W&`]ERFW$v>&΋-QYу`gGuLMtBf-h.gϵ߄$mxv|8dy]TTq:X:X d~{RJB \p]C.W{>qN^*0w r5Rø; 4np⛰}/*R kp&yL ȫU w3z!\Wp w$J}:gx*QYc_e#b{tytgR˦T9M"~^u])V:I &7 TlgYR{?|v52^7.csO&oBl9F$ôacoi|K0~lj|rbfeshXW dDwc'pHCIA~ q u(򻻆C4v8# Q]Z6'eJ*3s KΟȋI}T -VO阳20xzzN "oa.HzCw J5#C1@vTm1CSZ-=,/G<F(ǟ줡A3<LR/ԠH^%(iM&Ʉsy^Le߆kg+*$VGP8W-MyM3Fs4Ts}$ʶ+HhZ &*@,rghlE"g4jҢS2FRaj#jA[t%<߅5`d5#pn$dBI񤎲-y \c;3*fu2̒]bʝ)nA_l7c4gN~rgق3$&λOr1xG ѩ%օh5rM=sL_W4gi0);8Dِ}( 6i =Wf/)Pdw% V1"i߷mI#E-ZALNN]p *\6fzRiYo29x;:C ^s$m,ycg G(ҺHesǸ2kX2@~<.aQ>ٙ)K7lِTX2ZkNIF=~68-{$d'ó S@lˤ}XŪ4Yԟ2Jq E0kB{ E6fzL+&dس8|p^eժNjIeRf:Q >A4h2yiCMb0/2МE 3x#hGw#tY"Of[7FbPY>igK"bR'":F a|p{)s.KqdYqKN/mr'gT1Щ㊥Xj}0ڪ?qƠj׭7{}Uo4.) >IJ.*}v6(hq5ϪdpyFz^E0% t oĉ=aʜ|$oeYR]Ǩ ZfVj??R{#Q0El<3Y+{ DOdºY'N> [Pj[U5 l3Hshm_ ({7+kSLkVhҷ[G!EjaN BB0fri5 )^Ф!I$c$u\1$✍Fu6դp,1lwM66&pl.HŞ(Iuω WE5n&93(O\iM%tIH$k]4Y Z#W*Eh̎aQ<;qh K.*(4Jᵑ)Ϲ LVr٩Ycsf0Oi_<*rW0k- |o!QDfIuX끙.r9-Jm2 DkM~68)AHc`򝵒"ߗ=;-H$If@-p'mr3cc^쨩Y,RhT-!9gg!76 3ٌFar`TE [ .Tz.'K"Xp%aıT*95 ow{gQ\Akq,9Q;PϸwYăԷγ5&EլxFM0ucK\&$Q:JZi:>g8RBeBRU@)p!Ԟ_ z"=KSسzp%.Fo'DzIp$|δξ(R^H&q%BҬ6Յ7 aإ9QesYmg qf-lUAXFll%;f4, _H3 Q4_?:.Mm)&<֥fL:~^i„d.}jH=A%k'{tNt>d/vftk}R舉=Bo~o60 ɥbnm zre?jW()GPbgmxD];IJĉSPYҋV[4&oYkxo!Ký.q>  .[iUrp4MsvL,ir.KS! (]"|E"E; UDb֊Տ ~5- ͊޹ ovgplpڛ+^Њ,[G_ vU~fOawNFg oY (X.pNsP2O=S d"_3b;J&D zKx';^[\ȪVG@<:xc 7n^R" dIBGnPJn[W+oזPR"Qus!-h@*̎xU'eF0ƏGe+xmR s&::5?Z wkzιJJZtuxW`wI&kx4"3`B5`#;9, 7*q@Bx7}2R)ZE m܀t™Q^L[[[A2{tzfCݐF8WgW-Z1,4OjKnF*cTNYٰl›)صwΛ:[s̿%錙P}CJ36y74]kOH6fWwK뗶6;^'VYfKu6]pYb]+@]7ͅǼ4jwHrujYi2[|X yڝ+@dfIBphYr? l@"v? R̜*`#o¹V=ct=G>'PTw2pXɿ`#gs}>$ȖC&w>[ wbf(Ur2R}I-APӛՙhgu!}&ڨfRC#XRt/5]3N >CtաrnJeXv5Uէy+5jT3 lէ-\pIlT|Y".oK9qdz~AwwǸ4YZuK`Tz5 5p*T &.~YW |-NPJe ݆UqV'0}:7@LԢK<6!нFRWPku7sZdV>mlNz$hЯ<m PԬ{!U?nQc4K ؗ淌,G'<)gOq}s]1M']^$铊{aKuw;' ]_ER_EUJ37`Vѕmzt,N sl|8GKӠ 9vw3;cfArFfl=RxDk NlwHuHhƒk>FGCc bOp&6s@3_pu .eb:x , 4͛z\"ۯ7n@(/hறk-ou,pއܸ:|><5|AwSo&uuf-ЄG ==Vc9_񔣭 Lo%OEzჷ7;o%aGG6\|ƕ]Rhޅ. T7Дߺep~"pTe\\,=V iQ; :2)wz.(w&jٮqZэdd敍P&כּKUW)Ds܉tbD}D+g|#褀gNZ;O4VEԡ-̲Y xLZS[9w>q E}Z`[Z] !]gسC}]m#sLj3'Na7IQe αmU'ų:rcҮVjAg{FZ1ޒ3hE N@d@"vZ FIEb=m_NIEƯҞA rcTW˜ޟI?m(jw8T H㮰C~uC@ ג|OVnf1rb2jXk5)hXmlP odf2E6%wݭ -mR9}sS ]_];LT%5tyoiQhT9+@%cT-ܑb{,9{/kB$Zg@OKjoPu6]3,Oㅆ #XMFk, kcyWmTGWpQ;%O8z߅`́ Km0bP.QbX[F%Ba ժJW4ghȢAHuvhc7LHF XjQ Rq:V>JCڴToVnfCz;b`F4¶K `Xvwpѧro=5ɯc&ęHͶLڛIwq:DkS,6A6)RwB F=zSyVFpz6t({;(UlpuJR.bw .ƞ/?ކ8 az2nЮTn3! מܗ.6xQ3ׇϓSkwڭZM:)PUǪSX|=-P]=17 A yZ޹_QWLhͺzDLA1殐}x1>?k<'5ֲe>Ž.H`9IjX&9MO&a0aFRil PsT]ԗ'a0^՟V@*TseL#M[Fx>+ ~.ެԕ ƃӞI0mwrAuQjTݟ;{2'um#њnwYwh˱R}}jx|{?K\1 eLNZ)PSS16Է}y k}/g)Ϙےr NRg|dvvwY1t$LNӵg;t0F}n/Ft9JsiGf 6R- ff yDC [A 8|zȿ҄ӹ4; -+dy,C(bi(1}.G{/tZ]. e`BXaԃf<8 *d SLhuP㩌> ivJ>6[f'W˃z2̬POo@!MҶbv9&>b#gMuxݨ'PA 'jQ}5#׋ Mz*`#J:ǒt.Z}] zfs)苛fz;ZɰVU6ZMޟLy':4s(N$ !ÇDܬ4nXFekwHPsA3\wα8 ~ :2k M$WQ:G5^ ߧ˘d"pˉ-+q/+i"ٻf{;c v"AG|[lzi?R21r3}':#2C\ڄB\'!-;,zp655G3E*wN6ma^.;zE)pJyRQsεk[%)?[2d݈"u0Xz$Wt)fQK&B3PՖL` r+C^a1/rڻ$ .\mB&o9HRxV<=vlHtVo~Xr/>[sȶI( a[74w{ޒ߄=\-m@e^EEUz[qJER ><~GZM;E\F+3{;-q̎'faRWAv.Bp[tD5G5RR lG؃6؍z:Q+OcY ;տtz2|۽QRVՉ&tT]=gIGE7ХõO"_e صj!BԝC\@O(+;euR1$yqG{BzW9 lTrKNޒe [mqL|Na+GڪҰ%pɶ _p&^a;1|WK {+Z@J d&?:$A+0wtcJkmWs*>˪73%,*zjFV9xTJV9hE&?&]!\PSbxno]kfwʊ܋p.ov Ⱅ >SS0ލKS|GiVir>k=g~3(T)ˊ%JޞY`rxfي!LbA?#[c%cN#nb+^3E:gcώ="}=2#cs=]c##Y &kb#}N.̦YE1׊y凸KauBvQ ' A@g-6y7{D:R8aGHHHܻ3%߮F)dEsrsq\2vgR Brxyܺ%t(a%yvDPi4EέLp45 C%A2ىmwn : {x(hzstl3:x<Y-?YfC8"#`x.4=/He>,omW@v)o?^̥uWOK/뢈Q ZmK>rr{`ƙV|uzQeW_>n^:nLߛf{)B%@%(S ϪZ˃NDŽ1p&r+L6T*Yƨ=KZ0I4$"BYn`09\&­IVi,/^+QWh`q8vd䈞o\;3tFFGHT" ބh_I99;ol])ՀjC4<5pj ߤ/Gq%[B\Jh,3 zWWD= k.o,)=Pb!t;+1;U&~ 2˭e2QgkU!F۷\q VC}}~l*L~q9V9Qdϧʕԝg³!%Fk=Un(0YFnfA7Ά̟zM"ł;g47_ Jw}5(`_޳s) (tw%Vrm@UEK GAqRwf: Cd+x2j0I CVi)`,V7;%cٍtu{"k/ɏMGk/֥CwnA0ԵXBs"%s2mAUcɾ_چ[棭.8X1Rr-<㾋R]=w2hL+BOhdoCQxUi#,Ze\RH0a:-Qf9wG z$r&til*x>%i%DrYtb(D0krE(pUrS2dxޘ#~o!0M3VwJ 1#I'֨29;/͎[>ϧӬ4C Z'{ H3=R^trـdPM^-I%!fݷ$/y. 41d )(-:M8'9*4&9Wf*zlM@'N˒lcМ̑ I8ܝG7ßz ӳnlM3"Afg qf}Xr̘w'Ћ8A bRJX1PsDո]QYLceJO=|bb..ؔ,>/h_3P abCz211pL3ziv(z֣:vL &cЫ}̡JXfXRV)@9a =y>6ΫY2@ކ- RIzvd!JŇ(cRr)Y˶] QSwbHDg1Lm/eA(.졂h+iOۑg{lޫII VRtTg(] AӶ: %ŠW[Jgv?vlE{̔ fk *Z-ڝ1z@/AVX52p%OUt-ev9>8Wf ^  zfdvN:vmA5V~L_8v6U{1{~>0 4ԉ'EypoJCyϐ4>iN;"t2'ukm6_?KXzwy/㝷ٯ׬zotdUuA^00"9?]q`k2YoV11ѽ=@EiR))BM`O:~wmTL"}"ϳҙ5 oDY1 4mdPyP:tA=u+gYR1*܌l ͵Õl/}8 ]bU6%  qat3eMY=vh:}e9IX8]<6LЇA1*Kijv6\uWw*R-ZZH:-UH"lh!9+\p2[b6 L+3{H 3R$xFBMĂq \?_|N3 ?d_Պ39^OWHuҞ[}RW֕ȸuwVQ,G@<)c=Vg0 64Տmi Z0{+/N|^0iN Bk܈!%R}XlPOVqqBH w(eLxN;lAb;)xYixL<7MUժߠ](Tрx5:UCyWZ]7輻,]!4`RJt&0 ] L?u-Iܛϡj߄7܄(:#MC}Ѳ ZD;:ϝWWRw&I0FsےqPZcťYT$:OKM5T`S<ߑ9e:Votz}5ʱ^9V2~ ;G\"*b p? >O¦U)FI5v0Ki{$ /ޜykE \͵vp/'gёb]QWZU[`MP5jΩ` %}0ŘP Jc@~^a:< uBe zP 1rC8[)y9 n<Ο^դ1ݷɼXl擲:&Fƴԣ.4oSQ#: &++KM,w N|lXOАF]tK4[֡/0<"+Ne0[e)a $;& pvCWN%pn4Pн5{Jvm"3 mv[M"HmM V\8] UT".$UcwjǠ~njp5wCcKUe)G8\ ab2dPT6`8b@Y;X^ƱXC;5' ;[ ql!wK-) N6(Yb[~x,=m7VF߁+E|0x|Ah $uYu1gÇ&bu]~=kb1 yiw6gkH&pc߻\lI.c679)H!A}/byQr{'Vg{7K+vxsXtdXJ,i|WX-P t5(! A.rי`ngLÁQ3#05âը46 kS2}psHhŔy{{k3E꒥[yQaZ_=hhsHRA9o^Pτ4rͬr~[H gjP &9\Ș,pD'Ii4OK}a{dg9E>BDאZlS+_N+2\`Y ՊabcIQ:`7"tv +hF"?|(e=2-$s;g:7QЪc&^Dt6j*x(F]x z v0CtPfW kgAKQVJ¹q}-">ryypPlúD);v+Zw@Mz׆M"ԳFQP*]$> 3&56@ rDl#UjUܑjDZ W(\r0&һur$J+MbT39Wco]";jR2ȷ m~ׅvvf}pp%(%15F Pu,<|7)m8G'qaΰ~lVvwIlU RvF*9V\SNW``=5+ Lv l VdAV3մJÉ**?09O6Gry[Gñ,hL c emYe&4P} {n`3%YFg/Y0^Kihnx zg C>\S6 IZѡl&Թ.Q)CP„s:͎Cs[+NlUi(ۙ؛ #Wc)%Sá2ǢGW\QuK?:`D\Y5o[Ճ1xݤ ptgn=M0mp0 qXґIdg|]BQ&xRXAu_dFC1s4$d">unLcKȒwt7Sԥ]&tTfg2 mS #Cyt&g'v]|~W /)7PrWkl=~}VwB0l&3$ Y2Da = z8[U#8rO,&cI ґL[ºWW)Xf@n2{)?ĔRM̼, /wX@} 9~,|-Q9z#V8%k3;@Tax2 m`UL6T/b:Ùe)A1Jp).FLO6hF @`w9m6䑻@w -w= Gk=R)uZ) < {FXAGsZ$_fM=*d4y<$5ڢJoLc@%2[ؿjʌ-_֧3&JITE:{BT%9ХkQ&=ըtq @;xyFAzq]j~;k^dg"(9ucojg5M3fkM"QKҪ* pQo9O۫vW"_.)?Rq(,ִp5!cIHNF(Eo=O-iѦ\ttL].1 i/F~*)L]ɛ{zxW\?12Xg~O?ɟKKW- }ڣId[W/ߏ#pki՗??j?e G"?tg|BjGvY_/<)ScGCTeIi:aU;hZC{6> 2g9G<{j86DҶM$^c $^$oj'\hLoz7qW@1;-L#C9^mHKop_ .M3z:g[QWS;9>y+W2nWtwu3vWGuy|\3.zED)@_q1A8:P||38-?Uz۳d3{D;o&!Q'w{9ƻ?sDbDo3"-7FП*}toөԜHNv4#A[h\k쫻^3$ ndQV8@o?ȽQ6gYD)mxbѴ}Q#v5#7 ?Ia5Z 篾~G!57ԌZZkI{#`?y F|i"btLt gئfNoɹgX$`ɦ?zB;}21ݨ5 }Dޭ|jp\924+ t<qi(Kwo0-I[<7: /1sG$2Um2':0fAtW"iT"xKZ3bg>.7\ Z_Ea5[8w|IC'ח`IUfZ¸4>A6::4O 8WZ'8 ^j兾VnD,]TeXɋ?k#u Ř](z7/-0 Qϊ`ȇAWtPPyiO,[bix}wI 79K31>s}b'˞Qiǎㅲ6>կxyIA.B/||qAHzZSm >u87t팗<Х$դ5i4+]x7fN@<r Ωd'سsK87S/*QˇB aXV2*\sk0P#}j]o\jW f{RʂBbwÓ"S6kZBErQ:t>yMwK݌z*9(?,Uwn:)tJ<~mc7$*z #ip{'zQ/Gk\ЉRNT*w5Y2TsWKRJp:I؂m7@)uiFN6-54r6-o2/j4n>⢁^xQJ,:+E_iEʥףo7Xį]=_xAzESF>] tAMZ•EvJ$!s|!¢|DWɫ$o<<K D`NHըqs7Dlf)skNp՟P)̔X=gӕi8Ҳ lMqcL'U䫯NӦFNACE4+Y#CKwPC]{6,C+`I!mN}SRWƐǣ۹ 89Yxq x3C37 g>rtEt0%62dgɟ&+.S.4 8š>j,EE-9.\ԫŋ+osȲ#tVke)Q\bh/}\:'?R? |~6?vlͿ!H~C Nei{~'blea/0(TMDK{leKQ,A&ă;Nj%jA?ϓ$@ Lͷ+d),N=$xtIRM6I^mp7ׁGLhAr4&B$ pf˯ࠏR} uHF@سh4 ^RV|˔f$u^{ rFA2E4ӁAE 9bޱd[Pozr+[2(5.+w;bݸhSkk8,j) +K^r}=)^>߀::L$|eO8Lf]RiDwi MI[H6;~gxkфz/$xR-I#dUC͜<3}#wHۙj28g Lf2b־1}%a+:KOZ p@`9|d cJCsxh)A:/myolu#~zmmqfl$Jzؚx~j˙?躵M*oTl߅~D_GI|R F.Uѡ74>Шv hE rM`~ϼTk_!"!ʃSRtfd $tͰMXGX8trroΏJ~.B= 7a‡-SxY^:${ï,mtJP6_WedKܲUR:y$??A~jyW22sJ8SIRC #x3{w&z )C[W;?09HtܚvSd{8 %ŽI6׾DΪ^SG?Yܛ; Q#`0PyH\ 1B}S55 Q=4/?(Ì-=Ϗ@.gʯ Q `z 4ȓ~琑OX_!WW`f$˭BB6yM1^>@$7ҙEs̹G8:TSssk?SRVgz8ݭhxig0s0N;:U,)M*l{Uu"]qW^D1%5*-KNioU-MduIX2H"l"+PnL8i~6l:+ i@?Ӓ)=Msz v}rwWiWނO NuFQ/AyGRtShdLِl8+>R zVXHBluLvnLGQ+gaHELа zd̵ZFi;xGM]2Sq=K1  MR./ii?b11fMO 4y}I6`'ә< Md.j7j?}oV~jzЌ+Cu+P2xx@O%7~E]DEHnHܟdz޲s{s_ړ̤+kwSJEtn#G?#s;vk ܩP29N6ada2(V je`I,j _}8K.t>?_񽻱3,Id\UksA7I=!Υ2`o!&:+ B(dd$hnYkU?7A ?ğ(|Qm5ԪAc++Cgn~v[%H(d\%q9C牕 zK4㉸OB~ [_^1<~.F?[ Jc}r_J f߅ 7~0*/H[퐁t M|N/Q_kQѱ_BXmU|~*>y%XykBjHgw^#@V" s~VlߛHgS4(H`2tߢ xzJBM}vh$BclB@=V| O!0ed??% ta29<_OO%;%gLvz3vf+'3sf5b'"i] V~G_"'r4+˔iϚJKI"0Z`[MRL_5/59/?3>Tt g5Z_~g񿃌LI܂ёSH-M-g~ /u2r`/D7M?Txg_ldcK l>IN# o;=Zt=dDAl'@'#!c<25lܳ/O%׋n d UF/}M靽)m[L[z/Unv&/$X=(#J f8h hYSQz :!c8߯Й_|Vjxrx8X~DKY_ /K& 'Gl ;PCz_f?1x?x4#DΈ=3ӹo/5y2e&I|<$ꣂn{jyܯR|~:oy(?Oj(%aly'3_BşSkg詟]7]gԣs2jEɪ9YmO ȵIs7F#=c/FS L#DWI'wUmt=P- .cFQ2'4gy=>}ъbpk>yAed r 3{zl`Rrl;?P6y,N:/c1B I5G fN DDsgv"T h{2#2^g~-)s*?x0ĤE5La痁 B$ | |q.jzNo֥ߙ t(pmqe4=1~}݂aZޮh{I*w`~\wGu7^LR9 '}y$eQ͟k s,VPxK_sB d\?٩G diUs LNHZ>0 VZ"8u;$iւYL?6HCd*G{s˅s"v~( 衹X8T`{Y:֪=E5V<%?pV]oP_,e@zc_dA,q=swaϝ?wϋ)_h?3>j՚:6L><_AlơMIXSu&q4O;Ly[ɄOfZ%W`-6<[ e^࿊LKt.o)3 !~%9_;?n'۵?/{bWڔ&;bI GR$?ϑ57_sK_bҩhm{RFZ`gKʵ8igsSœdVآ=۹nVoOv ++?yLi'o^؎^}֮KJJw)f&?hO\ԙg8jiZqjs4}hnF l~ovܢmz6uf6K%,W@]/}sx'D[;\9sfD1Xo)>`G*G+zx;n,{/wOjQw٨~ğyvу僅lMZjF(Tois/V]wh=:_+BJNqܽuP^\^d 3Mt g݃)%狦A=oi*ۚ99J"=pnDiB~CHv)t%)p[y=H[xW$ulWn+jig69Q[A* BN 4;L5E;;\j%iޟ5rd>E\}/୙)2b@ǯNJJ4RbBȘcM{\xf&uQ^vQ6E@+4羯;;6vAC jqSTcW,~t+FYfb21hԊSVU0M |k'(wVHoݔMZE1<>wu&!&Fōⷦ_p6Ȼ1FmOtXSf[om" @6U]b艡w58zQ~}Ž 㼡t5X"x1w'%.<"Np?,F.rp:ÈX;bZ\.}:P)ϘQ_+d7Pd4U&Uz ?3%j:"I8٦Dek:b>D/4tv}b36F9z$T*^E-{X$bq?V3UkZkk;i}"I:-P&i*mrKlp₶6!qmɠ۰#Ŷʻ^?OviŚĜFcmh󟶇Xf;޵L\.!ЃIt# 駠Auv?}ֳ I%fs-,ewבS쩽(?$ّX/3ga;b" AĴHRGT0FI!&DdfM씪1uᓝnMicV;z׿ǵa pĻzQ4% ]^hpRѭla: X3`"xq>pBQ/\ jGѕRYځ6,b1p93\am!);[ˁi|~,A u/Np2gο9'1S3Iz_ϿXЙw?Z QZ=KtS12EN!Z@@"zCoV n<dn<ۣ v@*@{Vj> ɼ}P mg$kn[",<)(졮T$- P;QWN w=ZB*w;ij"ڝ KQ)1=ŋD>>OFO9yJ9o[WK|.azp!9 b=~Aڄ$;*h;^ԉ y _߬}9:DEЕUu%?OU6Iã#I8 BFz0z ݻ۾k5[{֣Ә*4nǦ:ȂɨxbvNñgڎG̕LqK@W*UuũȜ{6bN:_Y=\:A\<ŢN^Q'{ La-}iC.AD44*t==TG-ҨU*X/G fتu+6 ضa-6s( /ЩB_z&5e$fU+ЄH&PP?=ڬ,~CjjƇGA9J4M "}\@/xUخ'HI\( A{q"zº98{!\xOx$ Y[^2=wҞD|\Nӷ f zA d lmf{|AS'/u1f$׀DIj2]KG(@@Z" :Z.,샳CkBGr _`WCV8tCB Qs!DN: .$fRûˢ4 }"sl[ N]"V' )Qc:;92Dx`4-9ts/YŻ*;;A+,ʐPVaŝV!Ka6 7\=>Zqu^;˧?&o樿JiQyW`n/Utުc}x6yuY+! wJx4Hܶw0\N=#$o?Xb[WIuN!d01:喜FaC&NQ4]vR B֎czm|%V2OXv۱t:邉 Ǭ9 | 2 ӕ ' `q) {zdz@r)MZfjwźl_'c=NCG*hQ=KG ss׃')n"#5(ņuF1G{ t%9Q?3.,!¸!uƼ,7@W'_תANu`lݨs!ϨdaQ-xH>X:0p}R=it <3+XqsÛ8&qXRԊ8NYkX>k |%KsjXte"Wb ˨ä[9KLjnB \O?6o_ʃ,[ASZ=V:3s(uCcO lR݀NHR!Q9'AUh>}qNlQ8*t>'%ܚІs$li `\/5wI$D0Y: A # /4beWc euwC?Q_!hb0VXʂ&@{QjNMqB:eH5ps< D; S