summaryrefslogtreecommitdiff
path: root/drivers/interconnect
diff options
context:
space:
mode:
authorGabor Juhos <j4g8y7@gmail.com>2025-06-25 15:34:23 +0200
committerGeorgi Djakov <djakov@kernel.org>2025-06-26 19:17:19 +0300
commit1809db75bd1fa71e27e199e4c5cc9072741f6052 (patch)
tree72f6033f215bfcade73776bf869c5111c1902fa3 /drivers/interconnect
parentb44f12ae21f661e5d97fb4a8b234d6689f68f706 (diff)
downloadlinux-1809db75bd1fa71e27e199e4c5cc9072741f6052.tar.gz
linux-1809db75bd1fa71e27e199e4c5cc9072741f6052.tar.bz2
linux-1809db75bd1fa71e27e199e4c5cc9072741f6052.zip
interconnect: increase ICC_DYN_ID_START
Since commit d30f83d278a9 ("interconnect: core: Add dynamic id allocation support"), interconnect node ids greater than or equal to ICC_DYN_ID_START are reserved for dynamic id allocation. Yet the icc_node_create_nolock() function allows to directly use such ids for creating nodes. This can cause problems by executing dynamic id related codepaths even for nodes intended to use static ids. For example, the 'nsscc-ipq9574' driver creates interconnect nodes with static ids starting from 19148. Because these ids belongs to the dynamic id range, the icc_node_add() function replaces the node names unexpectedly. The node names looked like this before the change: # grep nss_cc /sys/kernel/debug/interconnect/interconnect_summary nss_cc_nssnoc_ppe_clk_master 0 0 nss_cc_nssnoc_ppe_clk_slave 0 0 nss_cc_nssnoc_ppe_cfg_clk_master 0 0 ... And those have an unexpected suffix now: # grep nss_cc /sys/kernel/debug/interconnect/interconnect_summary nss_cc_nssnoc_ppe_clk_master@39b00000.clock-controller 0 0 nss_cc_nssnoc_ppe_clk_slave@39b00000.clock-controller 0 0 nss_cc_nssnoc_ppe_cfg_clk_master@39b00000.clock-controller 0 0 ... Increase the value of ICC_DYN_ID_START to avoid this. Also, add sanity check to the icc_node_create_nolock() function to prevent directly creating nodes with ids reserved for dynamic allocation in order to detect these kind of problems. Fixes: d30f83d278a9 ("interconnect: core: Add dynamic id allocation support") Signed-off-by: Gabor Juhos <j4g8y7@gmail.com> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> Link: https://lore.kernel.org/r/20250625-icc-dyn-id-fix-v1-1-127cb5498449@gmail.com Signed-off-by: Georgi Djakov <djakov@kernel.org>
Diffstat (limited to 'drivers/interconnect')
-rw-r--r--drivers/interconnect/core.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/interconnect/core.c b/drivers/interconnect/core.c
index 1a41e59c77f8..3a41b2717edd 100644
--- a/drivers/interconnect/core.c
+++ b/drivers/interconnect/core.c
@@ -20,7 +20,7 @@
#include "internal.h"
-#define ICC_DYN_ID_START 10000
+#define ICC_DYN_ID_START 100000
#define CREATE_TRACE_POINTS
#include "trace.h"
@@ -819,6 +819,9 @@ static struct icc_node *icc_node_create_nolock(int id)
{
struct icc_node *node;
+ if (id >= ICC_DYN_ID_START)
+ return ERR_PTR(-EINVAL);
+
/* check if node already exists */
node = node_find(id);
if (node)
L] hxWTd 60W=s,p~9OyMf^o}|gR`] %uD.n8Vs[`L+d%ALFpX9OVWpj=}^!Z.N]ֽG *vv SdFlYfamy@'YfO?7TzRw~sq5v$XGK,rӿwm츧2mf\0ǦĶo<Gg9ɚ?\x+5s }kGwʪX*w\2r[5f[ &k6Ft8JbMN/\2YM Y*u!Mn"LW[|lP>F s l.ʊ̫a0*NMd2g;H_G}/m˽'}3"'&!`5,ST@CMÕMp>j",M4#D 66L)]SN.$nDB8PĆQ9rbƒh=U]%TFfh1L4%l! \J` >S_オbTUcشP`KO y!C3a$hT6ol8bZog8N#N5:S(+F 1XYGb̊&a$bfO>2qԴ!W?{λN*b9Н{m7Ny{ggG|`m6ji6Pz2|q+%trVla7N+դYTVˆ0&I eK#'Nƒ p]c˜M6.N5W:i=e_}Equ|tk쏳 d&ؤo'C]a:[a#'*iVX!UjRmo!8:}5 I S4~ZqHI)ځe䒉i Mz ^W^]/9&`j2ܭCz0|}$ni7vV5p.kx~m]x'HXyPDH^ve *,n\b(SXDǐEi^BkֹM:x 6+8\1tug{oIEj~@:z]ޜDaf׀gȈDz_#"j3MN+ρzL}֩,_~WU(߷٢uO( JP_~{+z!/s 6ҾkG;-eLTz^tuBo;вhTE0ѼT@ܜw|(΢bV d7ՇkhS`w m x ۓ P|*;*,~v͘OҰqu|aQmxm5W/b]}u6c^PBGt\'w? 1+嵅<"QK!tv#s֑:YG'Xan51QF͒W6^p9 [m_e-묹xIdҟnx|~^Ǽۢ>0zd诗wHʜū*y_3Kвn7mb/\#F瞦9<z^X2YƳS֬VY^rYX[>~ׯwu-ljTo^QϩܻEf^/k' DAa )ByT?nhf1&[~.?ؤ2dѾ'l+jw3Ѷ UKQU `mA)a=[E= xxK3DXPJ2|FWT0H]u$/ O=g54, ћ|i1+8d6TJXAe}]K,Z-a.q d;ΩVmUUmv9ͱzVmAUTP$G@A|5xn%1(oeW$u5&s']Egntqzyw߄MR " ^ ~&Ccm㷔I$I$ 6IhhEV>u 0 B3'R[G9یG\UaGU_`"7!YKP@]@@M"nF"B AgqF  b(P93a83 "" 9ˑ0\Ey" $dD;ty@-~wFA3xMJR҇ a%=Rx0?Lq>bǺ5X>w(fMϫ.L۷+b >GI܌=4 n2 ._e xi?6@Ld` _u|{l'aմBO!! N⟘OM2?X7#!f'~ki5_Tn,I D.>u*3KST/뀘F'lV_Oi˵nP%:ODW @ "'x]ÞAܡ'[1^"Sp?U-d+E,X8*GUK2(ɠh-tD}ԭ2/+4`w=x5mf`ЌdEt|fظkfhP" Q9Ǹݗ"ׂ8*h6kX^A\rh 73\E1 0[i=ckՅeiW?{MaTeLvY*t`ahw0.3 _8qhqW/z.gzϘfc]-R; c;WC3a8yRbWl Hf>;8?C7˼B81pˋPF.8Ȏޣ;_P6rh.r/j[E z<~i Bc`GAQDpLSt>|P ǺY#| %2]?}=1p%:G7<N4;F1dI{n81w]94xK9 yA1ת|ڏ.ƨgc8Y} ]raB]$M2=~B?4wXoh1>M'l\" .Hzq d~{En'_|k7 ~g(|@qr%8*A1vIt?3ٌr^#_|FIML K0Ϣڹ#{}Kz-aPQͱ@lz@˽b^kyPg-|X{ffr X߭Cҡ?H'S!`~&r73xe˃>=3uBH{ @(H7Lu,MFt Kv5Q!s$goBϿlկ%`/*'N%L?n$#:":rl_o?pt_Ru|#:[s.|UJWlO0$?&ӣRY]R D"#cVnnd y@7$Xozge]÷SL O6Koc,anj5miemc8Xǯ F8C^a9ɲ> vyo➭1 k` |uI0x-?qvcēg@<9<M Kz~Ҏ D]f`,3Sfyg`<*,Y58yabLe2&PSw3611,Hjͦp7|LfCvZ@~鉂 3yJV WR bۋ{=ljf8NN>0rYy>rF]/T3wYaUroL.8c/v6g*,UHl=lur\#Vh*ަ竴#e^^҃#qjGDm|EAK]A}ES[)KmSg_~{D;(*}Lio668X%8JƸۂrƒGl-GaY6e+tvKs oEFY-;hN<{Mdz>B)($W_F9v[F!Uۚ9n>٩CsKwD/͛#{"R-[嫷5~nE`2kZBt6Db /NoBpEIT2od7r݅C Dur_Lת w+Sã\ݷA8-4uF=] YfPp?F>6Gyol{t.&5߼mzׯhv{&2ϏkÏ'8 s2}-Z"nfvl6.!*_vMj-mτoO., }Mo=I&{yG#vF_!p#nH'O~_B*xULL?Wdj=:w}9+MQ1U3Dhc:ðj8&l+o7澛l1LJ]rlaY) P@I$t<\D^_W`Da;~\xt5$/*??@^Ğy*Rf!+>I0խz2+ff1CBLq:EW!VH; WrP>0j/l C~E U 1O]1Q?>.oyc{ Pۤ% Y9atP/鍵SA.ByA2[kH%'5VNY]>-˛g6 WLxteƹp+ N$ݤE 5zpe4 a>uXGxA(%;=qVd.{x|v1e9W3w0lԸawgI,~;:Th8[,"h5F@Q!hZ Q?T'ڻO5Xjf)Hh<Û䌈e9A@2Tc4Q*FOIh (y  ]Z6%F%,(((u&@NȐɕ ]e1O 3a {7ywy(=*˶|*/‹%1D'L?Q es߿#e,?wӏ k񷛨[h_Oӝ B1z3yT 6SWy -\nO8IJ*QBѡ:C3\'/7 <6!G/Xvm(ޯGF.2 |I$,;)PǩmsTChgתOw$#ݣ ffմ-A7s-)K}5;r3gûqTp( <);,udb2"MiYOv 䢹|{|MK=bؓT@@?1\};`.hڡ, I $J5d\7ZcR['ya,m\]OELHtia>kN3Gu;Hʡ%䲣@sK:ȧ' G^yrxAqMO8?erPUIM3̂h1رbq)6:qOKͳd9 9dG ઁ]At}B* |)p{6@qxC,; Uс\{yڽ,#jߺ?<LX.`@~7XH =ϧCWLbOaڪB$ vOscP>XW%Ti>뮔5}8LQ9f烞1~j˶ǀg񛠰3yOZ{Ź_MQ;,9)Y揭)CʉߞQ9Ɩ=Ve;X'#Sq ADZ엨&$-5`|u}za\ml]go[a>Vzi5`=o~h;}>N:uzqG7E.V0{{:7,tꖖo]h0g6zpXq#,=qY\0^cM }~)Na1y^kq:e{|H>ϩCG5kj#8y'KG!H+D?أVeB =j>i*n(:cr,R1)={4h~R"ì)8@c>_vasM?;ۜj3B[{هà w7*$rU1A+'uXxCt$ PM#^b?B5۫ "2(LB'O=΀qVXd k=;6[:*xwW'Bᴠ KuvR9ڜ{5yo]GO6ecGM Y*( UJy>B%& {St%d ~~2d^h8IҸ sNߪ[#6E-C&Pe8 'd#'r :1uٲ4?}o~Vxe=vT5^:A0(i7#3>,,k5ץ> xh@ ٻYl\ݎD@ؗc<#"1[ߊ[$h!klaxH+/| T!׺Ce9^AlkIGpa,`@d^ 6뽐;TD/ \P/ԴxDڨ%/ vQI1y 9c'(#*B]'5D tOa4j;w tϲak:/dN`wS}Z Vϵ׍@LȟALƺD8Xh]%k[cZ$R}9Uud-"]jϵ9AQ9ϓeWWsG{A3=z0=xA֭;7NĦ$t-  ~ɵjwVr6}[M w|"I% t|[0 uxY8|]+~|yY~( 6 kmi J$fLtAD&>ͧɩ(zoAf#DLKmס>ے nͼ8wbHXz^/ a:c[Y~eO]T>KNcv _c~7';P!ll:`yf:︈9'Ë 6d[lH/`;8@3ڲ 5ՠӢ\Ri? Of`Uޜ}lޯjRB]=@F~$ [~l Q@F/y?ulUA”G%}t"I>}Jc|wwݗ;)D(z8M~'/tQ =N TXqNO$7?BӰV[3 uWzX!k"Jl .0NŻjv?Ќ L#":> +%1b8i'ymbP%(DB"ɬP 4O~F2ss= '7#>K Vv W!zXg@.۩/qg5l=I8(v؊#\z4g7Tgm&gmBokx{=ڦ7' \Vv3\^Λ"S\d%u+gIA6*ќf}m;l]3wst/!R E. >B~rpg`ѷC9lzDY6d}w~;6)ٝX7+[۾J8>i2:yIҰATT@纞8{rWKsOQ(K6NIYe0;8LyZ2D t+ݥ|QĘq{x!S7z5A  ]7[W `ڱo6͟H["";R ٍOq@fQ i5 㪓AnZ^7+"G0Jiv?Xwg'Ƀ%ꐪfhPB4ωѠz,dcD4w7;kHj= ?JȠWn](/־:lALe]$z@ GЮPCY@〠G ۿ \rj=N~C1cyE ɞ<ʾEú/ЉM)d&DPbc4G`[x<ϼ 78{ QRyA3duyC[::P9%G 3 iFwd19?6$8. i٤\0FLS͢QG<1;M;bbh*'LYH:qɉ 9+ S7k >pnjp3M9FbՍoSxZn$xzo 'zumca/:ȱLw92d80 ~}|J`x'rvbdžt;9y2|Vd1-xݖf,([.W?׭zལ\ݰ݉hjջ^sD1>y7";6`WڏHs 2AEԙ$3ίK p@qݠpDGx뻓JBRѩo,)W{V^w`F! |$d-ϛ]|rٍnV ױ婮pӶ < 'ڹu3I׳ k=Ԑv@tK?k@ږVXC$*O ,Wl-yvcpLt0ZmY`z+ȝsǷ@> i0BUPRptGud|>Wh7S)RKlci*F>K>^f- )b85xmeѾ8Zhtſ6jHփnջpd:h쳥Ӽ ~2'-^OiҲKoXICO%lg;\L~f 8ǁ ~vbq>cyDPuMފ3}TymkJsznL˷lʀ/歹Z1_om2뒘տ54Kɥ!AOJ0ܑ8]%ZN T\ǟm`i[mRh79PmtȶenS4{u'87#"LQ%w^3;Sdo_;ipm.̫C^k5vr~2=-gK"s6o k |^iY &1ص"S6N#m1=j-<^|ڗrݰ11bu|j@^Tm&r\a(3Z~Y8Fh hA$m#d.K +{\߈mԛ^ao[=}X}ujؖoQXesuc`QF=wڶѮ`@E 1'.Ȼ'FnіAHo;'PmfT["KĊCy|h'83 }3M~4}iJ;2K=5wm$gx%/:/\?\´L=mW]W ؜U%xY((.gOG*SYRuh6d_i&E=UݢL<,YTReÿ@tvA_ |itn[:կ2|9>,s7_=e;c,o~G|M΋ζؼ9#|1Iԃǘ5/OVTڨAgt^+YMMkm2!Hm*d _u".nMl)7Co2̣#Y]Hz`bJ9L935q}'z<zZ-iOqc#^4\]G8cq|zU-1ϥk5IlHj1 nIKBj)kurbMBuu_0-]ۓȁIYxXUʗc uƯgM+`FbxP.w)F9ۋTq>+@@%ibpp(LGz\J$d|"g_4! p[|y |w_e^i߀zF4c<} )6`:V4ɝfbAoZEJATks=V VajV L"s?B wsanfF&HnҮr'Uoz̪ǰwX&׶#VK,R"$$uN{9ArwZWks_}~:\YN![+?PN>^GX_wN=IVCSfr2WY8G]ny  ~QϢ9h/Fc+$B~vs=( Ա0?,>xLgViqm&8qq袠n67Ba@jّB308:@ȁ;ѯ~zMy]v 6͂ Vi{n# Է~lɞF `\h&D$C<,`?'~ .AU z{ƣE>/8RX2"DBaX D`YAh;ׁ˴\+OdaOG%} ;I.Ta:ykrxf %\B;.i#Q;+ fu5V!kb/FeqcoC^,QW4hDdeuSO#If9rJhXYF&6F 6fv#F49r5t1J\k!j wEՄ[`it[Y Pem$۔n9[ 1dbӡ 1M41T *"`Tqt\:@doZ6&9mU2`>Dr+ԵgĠޤ1Lz#'ѓ. n_d/g?5)>r=Q\.՘ 1 Tx6eRA0qWmKf`ؙ_F@M<1|]W٦#c1ڭ, #!W|ub4[ަ9+ŌWo;y~ olh׺fgK&)M5(aЫl I?e])a Sͅ .@\|vAT?z7|/T|'u,?f$@oKtܺN?ʛõ8f1X.i@\\ҰhpFN~utahS rDɐu{m=|ڕ{{Qzd-GM8L3gz4Œ/Ve{ŷӋQ~|Q `b`Q>kTrvػ+=u̴ 䮋>1ym|ײ"`jVc@8E)?*)>2) |QHmT6u ^|~.4Bfٹa8CLj-pʖ)Kfm%Ħ`Qk0M[ 1*HkÃ7FCQ4';qޅ<-shR.dG0bkv`Fp<=.bԏבs- 3 X\ܪa՞[dpu>!39:θ0_Jh/pob/좮.8x}yUy$԰Aۚx^Db?fOeMB"Dx*!?N} | [ 5%ÙcՅP#0{ʄȂl@\t^T&u)HlqDk]!2?ݿ:9?6~e48eIE[<_&Wp`\1 >c얒}6d~J箃aC/|n[m1sڶ2(v0貲> }j(#`aԓ[8-?nhR#h`ZGFFh@W p}dz7N5Xzk:T*7Hp>!zNO!X]ˑ ?S9{wwY?Cvw,.zՎd_= ުywfL8*1ja&Qv99#>b׷}ha]׋N_\A6p܆8{k`eo-Zz[G!]>͟ 2q$YY_=`uo);Ju(+,AL_>s` M:cշۈWDjn=bጅ~~p5YI)xnP!+U"Yз]!2=lg:r( )|QOJ/!b"8szL@QdERTX!cQu[Σ'<ƒ Dsdûgpׅ=7`eѪ$ !P7 ~+[<݂bSrTVĆFĤ r0WU1Mt]f]/lAœ9JdL&6|/&-L,iCN8!o x?k_7D9 v>}?uG6z ky뷣GJ`E?2Z`A>hLuEh 񴼙@_ROЈ#9܁@25/MTa?X;_[+[M 4[0y[s٪Մ5BF SF2 ä;D:Me ]1= 8mSDY3A()&bicLRЯKZH)nC%)Уy96_ '_QӲ t}AqysQUƪ )nTfS2RvALdSZaV KK d Of@!c8<}$ƿ;'ܶ}ahSDȜ.we ]&#c5Gs(2#*  1콍{>CnЖDpک \OQ^P{6PoT634gT$ {\m=ޱ¸`8A뷸7j3j!%7$r\)T!v#R&8,JaU7 Y%!3dsMPZS%oiqIf W2AREVP-"ȩ>vD֜]̭c%4aKbY#蠗qۈO+&ȂVKn'dq~F\%G`sHL(RØSnpORvΕȝ '`2#~|pz $ m~4e|U&.6wGJ j+V<c9( X)((?i\5U16psJ90*50X%}[_~낑nv/Z5z˜W,흔V~zǃr:j;躕UlwۣSiۯInt_etɡDh}PR::SNu¼#G^xa v9=ONFQn\Cbs]W-wߛֵ}"T‡c.[9v"GO싘C },TݚafgTu\qU\n}@A:gY.ItG׳nApuT`kxӤCD#36D&,bSz'˔a$V( n0@Cp~*ҫ`?|_61B[+Tw(qR6zI {*y J63h4{7TI K:#'^tkw GTؿ@@Ckj",ދ9X||2Z:_- KV-/mV@80ŌQC~zZPz M r@ڇ W3(t(|Uh,zepdNRx[GYq /0|JW |-Z l㙢h:Ybٜ!H, CAӂOtI}(O\{wx=㏿)j3WL)6EGOOe/M.Psh/p#ϲƠNQD ,v_XZu"F@sNuۊrt)yA8/>!qlTv>>C3 8;_cq\X+lk'[sbTϧ FN{]O7\ {PYҁdd40iL0蕠q=Xѩу麬n;S0% ^'9=}tб_dH5$%7 Y#մO\;L뵁J:܎TZzL2`1]aQb^Ir EDA?73趾^shKǚ*Dyϣ-ϝ;M k.~ BQ{4ۨ V`HMZ*]٩j˄vʔ`ٲ1a`T8-ȽVRP %"Rh)f0ٰ*!Q5!网nE"_>gt0X!?׌B`trP@}@kg 4K-T`vUI>O;>ܰZ^iI'4 LW_S$~N- ]-ePJougp6`̙܆j(~JP3l?=qdc'ÉհpCU>R[NH2$7@,:P V ϫD\<ͽSJa~~8cd/^@k=/)k-r#X4;tQ2t%e83kF"T0?E([Kϑ.G/_3I8G>'ibf}a!d?3 wjrMWMk/>^E0#yZ4Uy2^a`O TotW-ԫRa Hw͎)GC-Gm"=rE_k{0TM 7);k_RiAi ~JNDxb# D7fn,g+JEcaVҭ>et^b96낂- r H!3@Bj 0 I50?Mq eo'[yKbt2$ŃQ\N3ȉ͑Ue͖a^]6ՈR=?kȭM TJ Ӱ}t#y]~G,`OXŎ 0)h5i6|ihź-ܓ㳯SfAYOxnN zuLO?ZTb>,NAc4G8=(랮xŹ$PIDE/]xG>~U8S4B&NCOC&DTW9I5ᛝ}'e1!Cϩ9,$eFkllu0%t<ʀdǚZH\yNi&=0;<BX]Lp]]3̒ 1mts^X_oK Lm5[aFj*E1z7УG,rec{(o'JKON}xy*Z=0V]:(X(X4ڶ h"xQ(5>#^jV%@_x{ަ.#^T]8Yxl;$c}tf%v֡"<_.n3 I8v>'᛬n ib{Sd@I0E8x'I>rs.YX "NXH΢` F4?3#)HWyοd; ק5|mkk:x_$] ȃ;v`əp /xS[iTrH< bd|eGݛC $^}'9%#P׋Qʊ!ڝ}!؛>8ayN%I q=W+tF](bδv_ - 7;͎ A0ɻC:6񕳋=9}ö\乷;.`⟇7.ɯ]Wk*x^GwÆ*s1xnBS0U ZƔZÝ(aMf &Yc?͹ڑӊL_Mڜi帖*~{RKEp_#0čTEڛ\Ht >H)T[l=!'ELQh}a[|*RԴ$i[ۯ؛ƦZ|$7l޲yY$%n B׼4I+ОRg-Z$EsLOoN-sDW\ pfPjwTsVqHzQC_|*qQ,ЏTл`" 'go7aXܝ`ҰDd+'3}QFA:xaͽ(>=~EhZUYɮ G')^^$@ Zƪ## e Wg~?C*7Hb~磏EsݖH J\24t !!bM=-WzrלܩԷ &rVլW֊!랼['^t4.3kgO'H D U|Fms9?=ӶxMH!B>z0y'-Ч#>b{J='6KD=TIs?,]]'+:ɜ mP. EZ/ {:Ouj>&:lGDW 4d̕)=zxW0$5 3:qn\P$g{G{ dp9><Ҟ툸 ݫ!89GLZhǥ3OɫtY`7a+ $" c5]a _*L%KӦA'(LHGY9=tUQSղnc SQu"bb5 ۝U`EWT6Lz=V o5t}"a'[ az|z5Ϫ[n0Ϻfba\}|ャt8wr"!(D z&G*P$WsJӷ/1}WL@ mq=}5U@MN=x}'8hQI2Vga  V[cy p/ObueHBaIcJ> nmЯC:|8&֕f(vA` l/WW4W7@3{*Xk3=M)xFL5zV}Pm>?Φg($C=koQa0JF}xJ:sg^oH;:@cN-t3])#ikk 9ܟ0ߠZd*s:%[ ~&YsM4uջ1wǽm6ں_Dq%CGZ-s ?O'Ϸ6Y!P$ QJ67E@QhAD=56)wz|V/dZ7CJ!bxKjctm>56 E"gUyP;])csb$O[Wӌ!z9-l\^aFknAfsqjdgkofuȘ?%1PńRzqՐ%Vl>RTASqE0E}ḬMlL@s96[||č<[eHંt!\I,ruij;RCl/COM;t n%Ϳ8s bt628x?ąߔ%> ֮ޥ['1?&t [qx*N`vh&cE(Z BG5H^s,l2Huo72׹E h71S_L6VYRԠt#i3Ny"g0]ܸt}*YЏ RH!_g8u˴G #~m6ZSrl6s5 ΐGN"2MƦaİiqx檙Ф:6d]yi5ow]gGx%FerAhZ6FU; !F%Ai;QT:o$XM̹%A^[+P>bHTm LvZ^'xi#( ;iJMf k.3bqwΡ/i̶fmstJ[kuDmbR͕QdwsT,YD7Pc&/Av:rX9@rfgL)h5jb`ٔ2ȏkGߊӓ1#˘j}`錼eӸLjW4ejyԋ<9g1!b,bVpp&oϭJSs8"sl"@PpB*Nj3|~yl Ú03D tAf5h4 ]vi@M<Beu"UĔ?vXg#9ɾٹ ^? Z>V< FsUQ8N9qZhzsTyP0̟o;xh#`f&1LLp:яUl[t4 6b\)ĥB,X,\gc~ۻpn-Z!Ht3rI@rMn^;:6Ia5B0 dRX _qF|pz-#pW @r9_P ؎oݹO<'=o!6c΀\Ϛs=d pQwX[PqU\l!W:[P I!)88T`<pLG\ZP8z_:82 !z@FZQSy-!G M@ԫz&su1ٖ]<%^ pQws&cvqH&lA7`18c~FYꌣe-}عh>_,U[[#P\7+y8Oa$-^gaqzײ-PPbDÖl8|7Pq"ޱ Rė*`5 Tǖuh1Z[Vf"F{I,vZ`ӎ0o8yadzR:2 ]ULF`,1NyΥw#.! :] v?\Ofs=<۠ U*c0s' (<1چĿ]ȓ9Uw11~`^;wsH+[c8Բnq@0vv3Ɍ`ot2asG-} h$2SHNvߘYw8 C#dwsXt;.\D Y#-$?C]yHi[{8I2Wnv}?ϤĦs;&h| %)K45.ï1 |!"yQ[2F=A⁈סO'9wRO"IPoNմG5jﮈPJ_;DJ`}KKs}4AǚU@ˆ:jC4rj52'v RpJz(ӞqE6ں()l'o6͂C$σ;s|,GI_zv^^ 1^ W~SE5ON4 @} K%Lw ӵ}' jPJ @i6Z ,k$>N{_ZAgl$~RkRyTW}\Zg%Fʚ=fRd p#c÷s{Bsl)Em# ,ͰѠ\}|) V0sjJ@۬>{{ 8:hBiYmc{8/VbySl^Š/WƹyMci`jp]jǛ"t/{J)8&0϶_&itX{ 9s3N&k5g[r4,*lUwt|[סy ͓Q_3%cE @ŎhvWׂ?_| C2d0£ےjś!Ǩc#r-`. '2z^a6T '7Vn6_LhG Pl2~g`:fnOT0k5V@Am- Og; G78WhF#{ՉC~D]4$#x|X0u2'{) ڰܨG9pqb|:6 2pՀq^v=U,Ǹ>xe}wBVV(58Ͷ@DZHC\N3&+x=sjpvc.*=HFZ*1uIR5Eѭ'@z"0(£+BK {s+X%tO?] c MD'!@aWksА2[cSGT+gK%)~B)1(;&<5r*9:[o\܆N !d/`-]0+. ;YмK:bW\խ8Rl @ը̓xEE0/?Su$ysXjT_ˍWGDf^2P_=0"$vC{}6C wKͮhPwy?70HF HAtӴO^cD,S%mVi}#i6iY:1s'=p͵׿hq^坤}LOUpo>9?S<HCXZB(>) ]/7"vhF֞0}nf-_$CHTnxP5/XuvƺZh Ac?#BTT*4?*vz]y .)N]0X|/=9v[{&b:ؗ-ak kGwTc]l;(@L];_猲I s@[)(=:Xr]T{Y%:[Nj4TG{" </8o;X q> X8eƟ"Mq5q0t3橑JyRէ)W蹚Zm^pL9P@ qX·v'gnhۧS)&:|;*9瞴sSir_xc1JK;6T#CVPLhvAIjws|:R(h|q6)d +1S[S N=}]<+4z +oU$1D bJzeSXIO|CR:ٴbsٷX2hwB+^ 4R]UaoSnKrܥ/ޢ1\C=N]þ((mר܍:rIqx<[m.޻d!eHCڬv e6gTcO N^8OMAqMza}ޠ]#`aGQn D :7$Q v;OKJUĹ9"q .̜Y|gy4}aoȎ"a,E#cteӇ䅄z6rڕ ʖE IԴ;:m *hg7\spr{C%ԙ;jFy:~lP 滢N;uQptv$ӑFN'wYU:iN;><4 \)Dgl.pHnu}l3/QSzz 2˱3VbN-3uE'm.NB|{vH ;g36&(|v@O6Ǿ+bQrMWbwD;90 B/8WW~5=Pa6" zS16*ISkQ?cu鲟Z)s$gZra8bx+Oe:7;XHfT[Ƃ{ kg^'& fQ&#B[5UhBq9!,*ŅdB/.ޕ%מ7gkFekyWWuͳ |wZ8@F3sY87Ygoqlcr_{YA7f}pJqÒbݜ.*J=`_jm"s||'>3zY\,u٫cF[ ݓݩPqnjdn&7:$]+d[\.5džX`5隣yJd1c*\?lEsQ0]I ;NwYLbxiQGݸ[pD2-QM drjn'r޷r Jk9s̑u.'ADo|{-O$72hΕsu2PBf$Bfu4~Q\ kż Rc,A̎ϘH|膘r\$ ?_,2Ak5^R*VQyݏP Oh%c9c g(D-@痘BőMT`Z} 'GFJP:ԬsMWz[Z J0a} C׍1Sw~#;qDuB -L./Y(S zaupIpR k!$f$2E[|pUȤEl u 39f,^C to-C"؁] *q`榃ycl`4Uuw'p, W <̥h7uFxA $;5ups"!%*J!߇} q,@*|ouQ鬤Vň#0糿=}Odoj;rRfz}cյ-))Ӛ}0?ݎ>=;@:帖N1ܧw?o=.+P:Y3$z1lǢWٖ4~^JD|4a׻U<ҜDDJ{u! Xl â8x *D!të/((Btٍ:9~H#PHwE^ʣ.2REHN 'JjLSHIrZa콺PI[뀠" Gvuy>˫m[އ5٘^  OdEe `5uVe5G&i-m({YC7GϹC[,U"x (,JWhsv72an#)=Rs.{AD:g(m6i:V28d"11NHs\1Nj{x@ǂ_;*ȭ |"Jj} =z n$Șݸy2Ի&'&,ĖF/A\2J:;`93|`e,,[njV5aEB9Qdkq Q 30N_7gPY]u X~`Y7_ d*U@OpE-6mkm[L\`% 2ˆjhGӆ@' ~AL=s yL.}3gQ.NuxvRЯ=bQ?•Ӳ(S<>Oۛ|\wk!!+!Jb4!A0;"B<4PFJUD!~MaO j6!P@CP*ݪ H3'd]sX֒'.8X( X}lmPd<<^m-az'Hv\zS ܪ%XW "b(;cuY / * ׏WLɍ63V[JE3Ku^m:UIj]Żp߿ \- \O0Sp^U.[zMIfrFʏ:NxީL=BuiHu锿uY~w1zbCzAS:<9w>VvrGd+򕗍9'7+6)` t\y-pf?NB!Ϋus?흶m0PHD=$}kvOU?N  P<}rd~(-C)5B.p|}l tu=%O4S-hfKo<^g9׌~|Pӓ4HU)3P&"a}%C}Xa4~ BR?ʐ.&=2 z|GmOɟWVnN`xTOv3TLG|0vK}g[q`0uxU1Uv3Vpu(~h[{MrA_PÊl]/_{1?x'F[_daX0ڥ{o>e/O3հm:X|{3BP|DXahM XZ -)DbP-K.\`-c>%.ڒi0b&EX|U aHp( b "0W ?.C G !0) Nsv^oda+|>"@xNͣ׎/gͺfta4~ti\7•A+ǝSlW9(dax\OdEݖ]-5S>6ByHw}8>F8 da1^#v/{V~-̂xV)992q؝ulpxav xKbŰN3-2ķ-=#~D^)bYU,y!!D6TVbHV69}½=M|y .|ډ]z:_|~ow/*UG(S ѺL~ٚ'4r6ԔFCSĄIUP'i4/OBX<{B0AhGZHOMXebH좚Kc7LN<mjY"GMԮ!?p 2}xfj??woӨ8vUS&GOvͮ'+ ivWj4#k1qʨj&w.gMC T -)l:<'?e#ު?vόe3RqO7RM-eE"{oL?oeãxovA0J=|:==R9n^;釋]?<}j_V6JN`^uj z\vnge=>7U+/m5o_>7aW®HK|]د"$J4~Er?DA,H;EEAu"TRi/_,.ؘ=ᙋnue ь3WYKӵye]H;w!U1<<5CAE@τ{V&s|j9:.W q[{ 6A_3O{ҳ.cnAmފʎm~rT̕6ɘ8C$0#}? N" =\+Ҵ1}pOf>$EM$aw:DlQ`^E!ø#_7] ~0N{|X(4q*Z{M r/$S;ܼM+pž_n8h/=Ko/pv({5Ca*`jflNd/29+2(%E{\AIΔ*Rk}:\P @ 1fLӻgI'm?c|s Yu-i 1=>ߗ_Խ~I4NfюT֡S `KN>i~/6PZGשF1^Gm߳@fڽ>cn#s!f5 m<#ͧS '>EWbBPuzGY6&K*GZ`4ca̜/ek(Qč JD ',?TchX>5?<>{Ff7 y,å7Y~??JBjoa@CjHZ>^ĄQ:|>5cUBmo1󃚷 w.D@JT{{~Y+MYҜFpݾOb<9%F^Wu#SB=͕%6c(f}_xf>ǃ=e݌}lz< " Sj{>[TG f7d.or@M@fgi{fbu٘ fo W'|B=]a xn8_ˤ'JNrH~j&h1fUVz$ ]fugW  {_X* ej bdS:z̼t-Pa53m@ \cv Rw=Y(zR~ "H C5XG.oڊ 1NW 4fC!5L!h=?NQKnO1ߠ`=p W]vAXD3>۟MZ2]-6^21, @33`Tǣ䯖| S50#h'P쮘 h2j ۋyFNROok؉Q,_?v}ȓv8S|.5xah,3hok'n .7mRFDK0ڨk%^.3(:H%nL8ѴtdF9fA' S%('pn" k 6vKV#.\Dݍ50y;y`3s/ێ_}nYAG,CW߾^&fޟf__Flpժ <0oI 2Ld\%: 1oD!y;}";(f`)1>)7Jqm۷s?P}+{sY! J` S\bL.id>JO/f0|7lXCGI0 *`G?%BAcgHt''M;n."dÂ5E2*o72џuܠ6Ӧ3+-<&;osgwljo'Ϧw&7pɨ!Af&Q5-+m raSsQ8CPk<^KCl/ HRLV臎YLT!(bEDf$EV/=|y^ J.߲\T^;Z_Q^{\a*V,r Y:\#MtT8u#9ȣ/&J78-^N6 L`ۛ(C5YXm^vJ -rGMɴu ⃿o2dLd9R-Ua@{0s1mF ZmsD`r+k, }V4 6In:1k;Z)=*.|boވd 9'QN{GWuG辦Z1qw3EyN;V5Z""9RU[a5msssʽ`I[9;wWzOMx;M9梊zDjԦo~Q\b NKǿ7gq7]sbH5ד+ w^m90+QC@=昦qfWjfFEK6vS.`ʢ[C[&WvRrή.Q * %RP0Vq|Sf;f/gp=,Yrsbr>V1¹(g0Ν0UKoc C aC1|uݷ;>c{r Er}K0h"j坽 tY_7~O9F!_,%sw snx7s57Ϛ휭T|r~C‚-z*ع\ThVB=Vqq$97{=<+ay累CUUZ:P;7ٝxXht$h-{ 'e Qw~_2J/1gy:0mHj2{k-ez̮}ՏRmI–ޒ̞*}zA|@9I$(sVaE[W ց(&lG?(` M$;(nt8ݍ]%Ye+!1eH~ _J-X`jF>A (k Јoߊ^uX?7zw&zex0A۱||{X=_{vwe&W6 e DE겆K0; cP|*LvM߮`Y,~۴{+Ti1ڈ(0||mǿck׻?vN,\& 6B/D "J*i}-*ȏ }1@<K\Di FXv:C6 0VǠƆ娵8Ң8 +wkSBFR'z+JFsIy Ϟ8)/gKnyuKm8ӊ]vߏԓUv&+^1|.qzR(f$:[iF92s\q/$,\}p)cM"QTޣ|rf(S9mDyܡ;tsϗԼ(YM3?C A7-Cve>ކWfj wJQY0oΗGJ]媝8Wu7\cP|;Z_R?%PP|:~DFOŎ>k=;{|N1׏J873)L#ΥhS>k̖mۖPf#QF2ɚmH F-'Jq!~u .Koc]xZ0Ik["LRnM}}w遅4p˖]~Y',)\72[1-p6^I|u}8n[O-5X0  k0F2wM" j$/+n +ߨ`1UA6׫lщd-Kg< T;a?m8c`ۖ"Ɂ NX٘a!gDD;yIuؚ·mp!f\H&n)Du\^,6qp+ދ8C tcfHkE-3[@d bP:t^71YIm8] [O S.:6Z/w[=_[Z1ѐLψTDv\[{R3Ks57iŃ=`QAgg+é'O鮫>I Nr}}xf)&c 3 oc ȐRml܄dT-,v/.pwRGԝK;l5D wQ4,zUQ =JڡQI%#ͨ9, &"Lm̏WQe;`>V9x{ &ʉ0D@)H"@Qy ]Q9F RUpU0IAA }*|Lg fp['޷p}UyenNn}YH2B!V\zmWBEnʌ]Am< (oY6!CQE4O!Z% r[n E33yf;,! 7T]$/X7xWMC}zB[)@)tP8ꪋ/)9ute/`\8uX+ jj>N?Wu?wےCקv-I$I%cleOp9!)fDO Aإ5܁)> D׵˺vxטBx jAw} U}Q Ji`F>:"$m  ?-ǻjG@-G%[l:@m<،76Vsj:eߒKR C _XLn]Sc!~(}:'}5X5@Ki!D_gGǭGfh5#rˮd9N {BU>}73f{ydi.;=RUX׫9ρw3pO!{ou xm>"|b*Rz $j&ިq`<164ɤoB[ yv'_Db{¢~tς%dpGaD ;;fqbw(ĚyBϴը0p3hFk\DaOν~^~g_d\Bh Нx8Kd8vo@ _pP6¬o<?^@;:+sc/Gz-&+;l8t S%#  )o@' 1+:GTjϺ]W(&B,=n*ry,rHeE4oZ>UBfg*xt<~3FsÜ\+ukXf>ƒHQY4斊35+iF|DM&C`),WYXR.uB?#2,rOJvy?흛0 '$ERMƜJGG(Fϟ[rW8T!e rDuKgXYə$rH B}#W(DŽ 1b0 cٕbT ksvDg*0zZ?ԓoyZ’# ;9J*Eb?8DaKω_<$B\[;DnWAm 2M:~ .&c\(& e&G1Xf@P#J| [S10 4(/hb{d(7b.5Pb?~ $f4s*ӔC7R|~ܭdA \iO\ec|ݳHp.wFu8ɰlÒh*+(Li :tcdŞS*f` siT$y㫦Qh`gaX9w80ot.CӾ-BjCqP ~ _a&H`z^pW /0\7 p"F[ 1{hE [S̵f٠t=s**sB&&N,UZlѢ_ggaGe*.`>i(Frѷ;I.f-42?~8!i!g@yyI_,Sy#KWߡgR`uj{@=sɣ@o_$:k{{^Bfmw!K  ׫sBݵɷ$; 00ҸBCWfҩ}+6́BnB$ HbN̍ӧnZFg~zo2vHEL|[|a۞'dpB+K,Ŧ$yQ@`$(;~;~U׳^"klcᶸcjϫ#hrWuK1C':@GmbLИ<HOFO$6wk@X]ϊS7{ՅZ`dD!՝Llx͚ldMzMnmFz31]v2x͍}.;1Q+ h' ,ct ~9lS1f`fad|wI^ds;}|$gE4z-}m2Bp?8T0^;6Be2RG:K `Y% ,(8j:oW <Ϸx&~Hem$ 1=GN3O=! .Fu޸>_z*$U_5xw5 t WB>=`=ܩMg~wjAH&.?۠M%޸#k9 nU^BREu:cD4mq~c[=7oJ!bU%Qj%IFra`ud#,3}ޝoJ3|$`]0 g<6qK7ܑq>V ӰB͠pt(>}F T44]}uD͙!Q]l?_pY!%ĈA5\5 |PGXˇH*HdBkS -`L~+9N;aHCΐ*Hֶ͔AXH/n~. %KtdbHg?8yf!Iۈ!*p$ ]iḂ0 1<7 DB05_폆/!8/s4 aR TJ0l |c]{oޞ\okD3^"MG@耄\:t=o\9^LֲWF9qtoZ9R)_Hs+t1)P?g|!5::4UiV8ybAP.ǒrq 0mHSOSXfz&s33 u%uۘ|HX(L!0By^IlӡRYXjD~-EZ5`a +nu޽EzH" b_WXlfva6f ټGc\>L?-UDqV5܈$ex?M:M듪$;7?c!>\`9◢=-AOqᒎCpHC .N?r3dVT]ޣCV~ p@,`@[]8|JS.{u \_ru=%tv\MfiTlJJBOfSgOkwCDYK_ _