summaryrefslogtreecommitdiff
path: root/drivers/base
diff options
context:
space:
mode:
authorUlf Hansson <ulf.hansson@linaro.org>2022-05-11 16:56:58 +0200
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2022-05-19 20:16:05 +0200
commit3b84bf3ce94dea82a9451a4c9c2cda37e334333c (patch)
tree25d69ce974a373ae2d8d10c14c5d677acbea5fcc /drivers/base
parent9c74f2ac4801473d03b0e29fab74eb94a9944521 (diff)
downloadlinux-3b84bf3ce94dea82a9451a4c9c2cda37e334333c.tar.gz
linux-3b84bf3ce94dea82a9451a4c9c2cda37e334333c.tar.bz2
linux-3b84bf3ce94dea82a9451a4c9c2cda37e334333c.zip
PM: domains: Measure suspend/resume latencies in genpd based on governor
The QoS latency measurements for devices in genpd_runtime_suspend|resume() are superfluous, unless the corresponding genpd has a governor assigned to it, which would make use of the data. Therefore, let's improve the behaviour in genpd by making the measurements conditional, based upon if there's a governor assigned. Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/base')
-rw-r--r--drivers/base/power/domain.c21
1 files changed, 9 insertions, 12 deletions
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
index 4c059a858957..2cdfbe48dde0 100644
--- a/drivers/base/power/domain.c
+++ b/drivers/base/power/domain.c
@@ -881,7 +881,7 @@ static int genpd_runtime_suspend(struct device *dev)
struct generic_pm_domain_data *gpd_data = dev_gpd_data(dev);
struct gpd_timing_data *td = gpd_data->td;
bool runtime_pm = pm_runtime_enabled(dev);
- ktime_t time_start;
+ ktime_t time_start = 0;
s64 elapsed_ns;
int ret;
@@ -902,8 +902,7 @@ static int genpd_runtime_suspend(struct device *dev)
return -EBUSY;
/* Measure suspend latency. */
- time_start = 0;
- if (runtime_pm)
+ if (td && runtime_pm)
time_start = ktime_get();
ret = __genpd_runtime_suspend(dev);
@@ -917,9 +916,9 @@ static int genpd_runtime_suspend(struct device *dev)
}
/* Update suspend latency value if the measured time exceeds it. */
- if (runtime_pm) {
+ if (td && runtime_pm) {
elapsed_ns = ktime_to_ns(ktime_sub(ktime_get(), time_start));
- if (td && (elapsed_ns > td->suspend_latency_ns)) {
+ if (elapsed_ns > td->suspend_latency_ns) {
td->suspend_latency_ns = elapsed_ns;
dev_dbg(dev, "suspend latency exceeded, %lld ns\n",
elapsed_ns);
@@ -956,11 +955,10 @@ static int genpd_runtime_resume(struct device *dev)
struct generic_pm_domain *genpd;
struct generic_pm_domain_data *gpd_data = dev_gpd_data(dev);
struct gpd_timing_data *td = gpd_data->td;
- bool runtime_pm = pm_runtime_enabled(dev);
- ktime_t time_start;
+ bool timed = td && pm_runtime_enabled(dev);
+ ktime_t time_start = 0;
s64 elapsed_ns;
int ret;
- bool timed = true;
dev_dbg(dev, "%s()\n", __func__);
@@ -988,8 +986,7 @@ static int genpd_runtime_resume(struct device *dev)
out:
/* Measure resume latency. */
- time_start = 0;
- if (timed && runtime_pm)
+ if (timed)
time_start = ktime_get();
ret = genpd_start_dev(genpd, dev);
@@ -1001,9 +998,9 @@ static int genpd_runtime_resume(struct device *dev)
goto err_stop;
/* Update resume latency value if the measured time exceeds it. */
- if (timed && runtime_pm) {
+ if (timed) {
elapsed_ns = ktime_to_ns(ktime_sub(ktime_get(), time_start));
- if (td && (elapsed_ns > td->resume_latency_ns)) {
+ if (elapsed_ns > td->resume_latency_ns) {
td->resume_latency_ns = elapsed_ns;
dev_dbg(dev, "resume latency exceeded, %lld ns\n",
elapsed_ns);
{ F|M>U57+$!, .[H!CA6iTi:8 CB%i4Z/hlA´Ei,zB W#b%' MDn!WS_O.ǃZTpJ&f|-pWˣQ9L`BHKRKpapMM%r]!ɉAxwGI1=I- }iW2ogt'j E0zH2kLٿfl4"8[!e[WVAw4`\ i;2Kx&iXovHx˟}!ҥYbDR/M,f<)TU d5rwk3h! I+]c:dLG-|ř?S5lyMF 9ts]Ae [0a=$)\ 7+^ \m܄+VZ;V$gW,UAy8Z빖wUYU mC{1/|"mJ71RyL-c5W 7YCMa"Vm(bѝs9MdH ^|:/\?\:y%uUPWJVgwB"9 s]3<97hاF\UDmfF[_2PoU0 K/zoں Md+Os[ n]1;d(1@i+K @ =vHW&xYA"sCYWw^Gq!֮эrJy`E<֭L@Zk[g>#+T-fVS!D>.fSnJ kKsK %/ۺQqGHA8 1pq dg <偝PW 7~K@~恓е&r⇌`/Ϲ/Lއ(t5] >=hdWXnPP5TPܓIuaKu1tV}㩂V;fwɃ-Ȫk+Esbk\wrQc=`dC}gPyV{<)o,7t-:Bڦs˄]Dd9yTK_ ^y%s })׍Q9TA/eJ_s*Nu)flTsnMtBDo$Rݳ U9=10l|ܥyO֘|b0D7FL+ a*2L'eOd@׼]BD!w>O _ %W b[DiXUr~ ),(i;h$&jM|Zb%-1[b6U-,APeE.d\!|piqz.dUPif$>UYш=ds0*r4.i.׵-w+#N`Ju.:z,ȷ^w=rW-?>x#;P=Hz6tцK ~ I:fD;zJD'8 eSPoˢXt QzX>U)+ mKv}tDv{{^.FɻOoϾakJE4fvmtC`vPa 8sLqDCi|b4F(Ù^HA~U2/h}w KU>ֵ¶ڵcB 3EHWf;%6$ҏڣ jLO7t#n~Dh^oy@@l"ojEÔuhm,n>yᖌET*.4</Q.) dN4զuI\D lºweG<\iR9JH|1F]oP6( } 4FtWDsr8p<4D_7l|]tΐZ foH  8]5ѕRaByh"nAI7ģGt%]Uy[hE$mK ƚx0$Y7l-vLFay/񆆦ME|M3Euj):gؔY>zRC,jdtfڪsʕ:!VkIYE8Rģ{Q%2$H]+E/+"S#MZCTV :!HT=h,faX$Zr\Ws{MGD*ǞG:!Sb?b1>ǀT١s!N?$'㐇 ,jaZ8xVE ii 0FGmhҟXb $v>y]SSCĶ0!|oF;ळLDgl܇ZYK 9=2.fD ^jǰ=m%;m8ցK80`lERmk0t_˪ܫ+̟e(M6"D)u<ˀWqd)cS05?Hͳ!h94T~֦J+UOM8Aj֝uݡOu4 ?}pkMЛ6I-'j,>OPQ(Snkfj""%f7H:E3z^ܿ?IeՈj :MqgwZY$@-XwtMZ*Е7,v]$ԐJ%cb_ bX3ΪN;Hnݽ@t8ܜB$c?Fw$蝚/bGH),'1.rD/L8+csykXv9Ќ *5tHⒺYܾu浔pSIa&R2=p&RUir_KG O\^pisI"kmDZ-kh@OG.-go$BAџڎ>ï] 6\t!}HV~&QiGyN!=lWEG{hQcĜE/yhloBj@~gzzJ |AdIH+$ah RnT X+Pxd Y"k\Z c=?Hs>& e V)(%$g?WDPltCe;L&NzԱ4^\,G!zKMOᷤ~`r3ؕA,^5L ј({(V=?w5bU wDWլό{of4d p+؆]t]>kXneSU6]_45 jУRs=Gl9p0us:pz,Nc+ls,!܈oMjZX߹i:<3[Qt[MN]xL8:~[&>Fك\je#PJff[Dt#QS"л@adV?w 7hy? o'sAMO/i~V ؚkk4(@-\+V_^E_kOOf;g?%wXf eoT=A@>WO1>Ĭ\P%hm͈ 1zD{Mk+ȟEUX~pG0Yq &M0e4P_#ʝby_v(.p4Uӌcoj9|'sm3>/5u22 ;O:#Fgy$q޴jYu?N:mT3V18LSM$ΆX(A lgH*]Fv-"\d&~NDc.Q^s"EQs+x5Fp27DNa;]>WSN&y6=0,XފW+Az GE*.zі NbbY{ 0{kj2}ƍ:<^ 5 N_ bD߫5r/X(^,n6}*>F[ۨEff} ! VeF[lU6aR5] WR5lHs xÿL~$BL] Zk?kL9P/4+ "ǜ1XECSb08:ZS3qQA6ՌTPbs̵_t|+%{مg8iߓ6v",E19|K_`ܔ$|GE`#n0t NFؼ٢kd N`yGVaEr&jmh"9ۘ/f4\/7-$ iV6萊W"mf;_kEWg8M U6@rCwCl|oNzst ة\F(v4Ӱ*=SK#3:T,:`3e+RW  *n]5WZu, ܻ(!E+`n9-4&/E᤟2]^N ͌hUHݒCE2IU=.#%n|6 W^b޷sUei=e9sol 6=i- d>B@e2?@@8EE5sJ 3\d][{{ d<-i*EmݮyʾQnŕ(M~CrZp";?ѷebM X'-qSFtm]=pɭ$& yxGYt^הO+.Q,ƲFwM*1U4v9GJ=9iTٌt[\7) /s;@%G\ Ē]K2L{]倂&4L`PY`Sɝ~qt*x=aCܪ[PdC_^RYlI!Cjz7}zKb!Og9iLHF7=] tdx\'UEͩY n}Ԡ {,(n|6 سTsD2ؐçT6Df>etƬFb mxN"93 w@24xC0&Cn%Eև[P(^;jH@Y&*uH7^#, >KP*oa? %Zil`o)' ir6h"2/D[ 6"f&+MW4˸1421)ZoX'r8FDwYnjceSP'^ U]>oX6|HU7Qf+"h  o ,$`R S7<65wgZW:ܖCNK*d"R^ߓuFx{6Lѱ7N|)x9u. ѰDSiɼU-a fcsQe$%6h^pUX nP9SZ;|k$]Z^Ź0]oox'o_Ucq%b}wwPu쨻nR$8c|;Le%S9!CJuGͿ|gODq;b#.夏n.T;h_IĢmp="Zj*; [0% ޥ@@ZpM?3Ӷk\m] Chg{?#:8a8$㐞F"8-f; ID7zcXxO~N:Sr3x6k:Ghhrc-[\X[ ,ք_խu+dXt"'RY^5i2{5K;\ay5,oQlm}8-[˴9V8e4X:uDuI$ ܼG{s.zdCqNUZ:^qOSpX?SҢJ<<Kds<1FW6"AWs |t%XL%TRa7GR%btX(TE6" Nncp'BθiEϗ4?f>|=Rc7g)c(ͷnX*P KLjsfaP$4[؛릴P(qJ,Sɫ5Vl< |bF(ŶW4|tiL>ߴqy*>#v*E&%8g/BU 䄩g[y1$$z[bdn3>Rgh?sVG͆SYxKQ>s8/"d{z࡜^d 0$q[ cS̷YV5|/nnyu n T y4U6z$JBr|zng.cґ!"rX*.luQ ?2} ?hJfi1>SpPt%~wRmLNo6m[)TCRe˃TV0&뢢]nU%z^VwT/0M߮đT:50#քۂvz!3ܫ}jdﻃw:_rkT9.T^$a"gW>g5iRO9,M&XVot=j)~7Da#iMzh$1CSn&5i6i!A"`$Mb-}鎞\™"jRDސrl_FsׅoMID#BwbEvtM]4r|{Kq%Jj;\'Q]i83lkD6_n64h[6՗'O~ÿ/|ϯ/~>_$IOn~Ç'}GTEuOT>,Mgb,6G}Kͧ4`ZuMˏɿZ?QY V_??r_^?pǗ>zT- i\~CG}APVXLԤRWbP.dT`Hװ ஂYD"hcd t-WH7\B_cʼNZI w+ˀ xCy:Ii_պph~-W^~mTECO޿59d론^w jLm$xgkk F*, pƱSE&0gllƶ̓rYG#ilF*o%+'>onOߞ j?=]|:owû۫U=\G VG>H€4y`$~||ڎ9 nٵK\3Z@Mwb>3U.Rwn?!(|并?P>r;~@p{=t3oE:Lmd9/˺ lWIYKLiŅeDKo4YRF?k8(+4-VHOnO֫k<̹g&c e=qDNtV%zvehA{jگpI N daE"s ~^߅PHcE'$ND1gnᗵ cB0UܕX\vUf%PDDa$$$fy0=>\^2{j䁃^8}qP\{hI'q88UqOUpNfԔXVөMw0SutM:IWk@">m:mlLYDBD*Zf}ܕ3mD;Z5ǜw\5H/@Qt#aU Pxyp/AhBo2tWG 5U|% L=lKS5vS Uó#,:ӫ֨tQw<H UՎꚪVj(cUqG5jPEC|< Dt|YҊL>Pe<3@'3H6vgJu3/3ǡ2e'@9?VI_|TWGnV`PvFiqc4VzT:TsV>VBIbTYWE;ܑf;FW0:@zn04k|Ɨ<4JSlmUjYML+ CWL`YbO-R|cZaKŘ2Թ\U \ۃu>|فotZѮV]m :6TfC;`9U[o(g"7O_HHY+L} SK?FDK a:X M[C Nhc,yԖ$wIe_"1*r$iuQWf}UzjD5:jI\0k}5]pIz :WUTSMnUX jTbS ;jDϭ#9zAOӣz}HdcD0!Mll6Gv ?Du'0{#ȏgy0+O_p% J 𨈶{=[Ta#j;~z->wqxRx28|ϳz>,ըVk<Et֏IO Gj`o6}0ƣO4/imT gdYxqzrbR s6ijB~YĦ " Z}1B#,hPǐ '.,`#(0,Lq}w?[4qVkM},|d>zb6w#NLv{bWrk\j+[wOJ2MM='SRϣxΓEP#[(j!*։@l{75Wȣ+p1-;"Eʫa'y@3RGUkvJpߠY G^[[Ҽ6ݑ_z63#!qcGҮkWց9/7TrV-=vib9ZIb*i8Cn*7KZG|Rն'vxNxʿK,sp;c@En֑do-iZ; \ ]*,-sU4˝VF4 QJ8}T+OڃzuhDujXl6V6V4GZC5NG~ZgB@Z]N2qnhyi۳wú?\od\N?NϗS?TڸA 4ZJJ#Ü#}L+urJ<,iE֫|Qٰou@YX\nT~Avg{%RV+}\Ύ:HDbpwV:zuI _z_)ogaqoLGIIaOErpk v,X'k/T;;FZk~G"wC{o o$1z;H"!%xvw%_Ofs 5꿵&'q q˰Ό畍\C @8wR AHNM><PGKYӪ| _~m(KA]Ki4ap-/i r8' @΋)YN]k74) n{圿K 3z*'\C:G2Wѓ_'g>YeC{:>W3O/$Xl`-Ӿ!쑈d7].ֲ' 1J&KknK L%xǞr aX]&r:{6f8\Dk/;+R(*:򹢷XTY}.w jie:/}2p~֫5I  Y䁇{Ճzu=Z9c"2zUJGNosull^TZ ,q=Mgsf\cLA dҒEae3';rH!m̟$Я@@ k\#O]Ez "vbn1|g}:V3pXhDk-BxeHCNς(Ne1M6df=U=!_,pOr >ajż!ې:+Zl񬚦Á.ZrРd4KԳv*N<c}]llZ3CFԬ{ΓX]ڴD]`]!5!? a)6K$B>GYͅ6X A2pBx^bۮ|.lT:e*x>%P񅌼,..ʠߙ#C4M\Um)W#Vx!C!x[s.M{(m3GyέMc ӧ{v,8~ c2=R.K6_\7˧m x ӛюC)3[qkV̐C`0R6[X_@ H8$J v{Ԭ@Tvd&c6h(nU Է4,AV7]$՚{K!Nd*;tτ&2N--Zx$$[e\u9Ԃ̭Vxzv<~۵, U/0.ߑ),|?x~B]ޓ 'sn2@sœti^VTаas-O6Hu0PZzȊZX:TFoi iNKߓocXNG5Kb:D$~CI|KdCk/-5l\+8s$19a.gsI!dPd QWცLvMsx9m_9GB(?uz8/@+ݬm}Iw6=鵮]]**(N^=je+iYr/Ps E%mzZɟ$5HMFV3JQ_TR-Llas_ 8=T4rlkqk@k>e4Uwa/ƋyNa%_^ 陛:H%h>*1Q]^CC9B$!k ]-* }!_tnKB^,RK٤{cHukg@+ݑ$+N'خ]l UZ(Iz=)\p ϻxzqZ:̞Y^gXK$j>}rke$\ xuozLJ gJ-cD-3Dw5fM"F!k3Sqf`!.pU qc)5"SWM>5=ɤ" :ܣ4tD*<}a  4aD1)UE_gg_/?bD$ z BgMxO"c(Yٸ ~/~4*Y}9B-ϫ6;q1Jjz)5řZjU|{-ѳ.hcZ* N3s^_\&̾u\O=SOQRUNv$ b>+ftDϠ~Au+;temNri}0ˤR-[~B #ؒԋ5wjlDeC i/G8vo ԏth~m&0w저#+? ALӲH} }`8$i%^{'30|A?>2NfU$Z;(`ըF9I7鎇~ځ+.ac bye#xC&\-!SZ ]-Xa+V˶ܸ/Č uAg#w%nX; ҩP܈kBP'_8N9n>HaAc#S(#+ta./ِyFLv@ʆ&II@#Gj# 't4~ˢJw•b'lp$<%A&p #?]4)Ѱ~CVaz?Vñ6]":c]hL|ƐbMS:pfeE:P͎DL2>!=f ۦJHᖬe>1=in8W؍q4< ︡nUMţn z݋M^=; C39;|ޞ +BcM.P6` j1COB毻<,(d>PߑʿG7*_tǡ`K*W :BuGITHun֚5A@Z tQGX ^x)0yGmg.1kL|cmy;@BDjhbxYC(2>bC_;Ȁvȴ;}ZֳXkyz忊I8f1@$CGs÷g5;G9X!S;ߧY0[w[KH-hG,z6?\a` 5fdz5w저lbjX7k ?ZM`э)+xȅ`6я%9'ǚsR[I >ݱ璦Hp3m$sr~_$ɐ%-XzJg zmX~|3H Rn>L?Tu?s2<ȦP7|V>* xYsȗ]=~\ ݬjѳ^!=ʾ],Wsd}fnd8Ч%'l0Yғ8 oC Gt㉈uN?ڈڪ9"6tlՖju+.a%hjtR-Lb[^XIz"bW;vdSл4 Q 33Sc_922Ix|$Z_5憗KjQ. ڱDgBasCvA?KU1|4*$5kPK !jZ|h呎>iUmKI96_ - E%a*>GHzWZU9B6G ӂDa`yy*J03RaI{;qP6V4UY u$_J<US/yIPã-gIʤ:qe:^v-"N:c阓|ԠΊhһp֮Q:d*OŮMxxc g )FAymBgً&k_cNoX%}DJX 1@q%F2/ A&ceFnHR\fp=0<|Bh3,!Ȣa&hN[zj*@jlTƵ(Hv9BܑTq?j/ZM3T#Ple;-fCzHz{ .C֍]r 0a cF+Gk[?PppK6(i~!,IQeK[ u8P>n Ob"/@arQ3/ p{b)U}_41z%jԚ2󯙻( 3`*p-2 RȲ>JFX\v3nu>fgw yr$v$YJR×Ht4aOu/&)o9If^eˎ ԻC&tI+e|=/B{~nE;($OK?vg=P*tw6ŤfWТ+& ›7%bz_a}ꓩw|KCD䜹[ nӪp.6VdA7`MH6{rWO tίAW˒< H*"x@G`j 3|ށ֪W/X_Oʙ>x. liEdA,jZ*aGnȶ൷ s La SRxzo҇ V9 r!_5A5138/F@rt-ԴY)?ZFV֫#c9,&wcZ/sb|LSڐA޳kwAt8`LJ9\M_xFڵQ94iSE2An5?VjP㆚t԰ @i#It*r/J iW8/&D"/)0\ zԘT[`x0{ubI%qW‘Y_;k閸Jn犷AOۡb1P%pW^K4,X9/\1A&NgifynRܸ^dG1 .\Qiz!#_:9e l|Gpl|!k㜗@x|Sa;.,g]w\,mT7 9\j6Ma`@OUo }[ѩbT04sN 14Lmxl5M2Y0~W`ZEgj]1I#un,֏>Ack9=dC|0:9!8$Sh-`צo #O&ԓ+װ_زLND"} 9tN-+P*v-)u>$ eF8Nn_*gC0jF3 [sm$XWʊ,C6˻ϝθלv.q5@;-5h㺼gadx3pZkv{0z2R@{qX^j":&$@oۃ̽4v叮ܱx˭zX3Fֈ ՘&ys9Ł2meHC jz RNS;g$t852fCX |p'{,薁Э,_^oh)H&"f=έ,[1o殫V0Q=qnt'9ђJ#VjL W]YޜS$Lp5*@j~>J(o~nʫ!ipE+0 Dt'Y`zRS_'yI sT@G#X89,k A q=9iҌVYsVt E# '. \j tET~noF+7H?/Z…1 no=ky ;"p bSQh8]E\1L?TkіO<xֳ@28hdȬsGau b=ێİIs`@ţ"ieO4 @qSGB{bO$D\3&@~YGz*."mihX;O,xa>za _ILCg^NYOD0cc|-h !T.V=HF?bHiI2śDz9L ,dD{n%UHhWZS<rǜ jcS5L5h#(>npP*u՝b0A֘Mc%SJse96fQ p I9A6ٞ˵lHUQH %ngG+.wu7B.N)x|7d=K]L>PA . E)Z6QT-ra]/9&fQ$ĵtYfJ쮉k=,(XG5(l :H6mc3%+I)-~ͦ]IO39(Ox[Z{mo uvh6 \bY/R`fW ㏭ϿebB WfV4 ҴuQ*4p,WN+k,`ÛgI3C6.<[wmi{'ƪF]b쭐~cɼw١$d&;)6ߠ? QCBo惂uPTxH,?~7+&?ܖH"3{ Y`i=/[7'1E,H`<_];@oj|}@E^re5G,B"jf$JAJȌ5-rF 4WB8zm 1SPp>7B Uvȥoe&Uw,EK瞗lYb>b2C;)p:RpBF Z?UBH5mu -+q_tL^Dmvq0n*dztV'-WTdf>Oo6#y Cy9sׅel 8Y/DB;޽ w>&拸Ӷ[J`b84K׼"l(њ|w~#![^&ʹܬwܶ[%5>1J#nԼH:uERtJ<` h^^ރH)ڹac`6!^' Zo$w BNZ12ӳXU[g5#ާ,=otwA>4e]9\g g \yQ8 k+ze0urFC/|7"Z$. KhrMhe M_!s*ü1KT3VYӌ LQwwdq?%\G-hzmV>b KU AYOOY=7nȎYk` ^ nEA4O5:"&(U)|IM )[о}^Z-uSe=c_oMQW*"&7i !tޥ [ag}^2z @EСv zss'UCsdNƎg B!jw׊{ͲYtHF' KSyaW\ *o-IHkH)4DCw m3^tĥ(rm ЁCI2Vao7wÏ/Ӈ[UQU%Z_휅5\=SIRkٓ¡s.%/]Ws:YԊW Ŵ ) 5MNPBˈ 4&p.ҤXiLC,4 3UHSF7\SKw7>^̶1@b WO2vlx*TmO+\&2C&C{.?t$H\ȮwRS@ˇCH R)6E*_xE~b;_ YşĉVBE:4.8mìYeCA}i,΂}4pH0cq6άoڸSIM@3<n]P㸦|}U̲I]oi%vn=+hu o"9 ~rrv6ķ!:^7=f]ўj/MJ ^ZM8gv'|@3>$𳓾 .%n, t,.9I7bθ+s5.C5ݿ*ҵ[\NOB8[l~fO'+ulF{ɡk5 ^@ז}M[ZTC2ܽ-U8dQWѳņV)jWVl0t` 6jq|U#sW޼{]d{0cGsߟyH1" \.ohhƂY`<+Ss7+*$nRCP|V՚V캈>DbPعnO޶&~E2U"RJY㒾I4VHURs)p:%5IGQ7j) }< E`-e^pf5jhgᖷ)gjqrS KSxPtԝe Gw뭜2j$rmvqV_UvHZwzet5=bfb~-~a/  Gÿ{m0,ʷ OR}2E y\fػ轎f"A.nOᏒnZ{R5t(Z Ը:M]U#KkT!hMۣdIsTVUxXWuV7H#BvSԛRtq^H=y: #Q:uHۧ}1wU ᠀#X#z0:HO&y۷LҲNCKp)LyGVut::!p9UhhQdžV}R,6ffQO FsI[D !Q0^D78K\wX8KKN*4"NN{BV2Z8bAY-n2hyD)+lT]դu %{.'[l~/W{ DV|!B W1!ݑ*`e3?Xw6?ވ 1jB$] `YHC ] pxE#"E z{eER8$ّ[٬mRY͢Y/w3N3ѪH4$aFezf ̠Z5lmm<=Z2WR޾+N>eCtL9 9>o?۬e2{-Ax7Nbj urD-|3'6DYV5}sݳ`:'QfZF`7Un2 g6ٜzzC.UWҕ$u9GU"Me7Wtg Կçim98%9IQ5k-uz>ckhf(Tº'/r wop, .QѪe;Y\eId62*BcoA,EA2ELB\f e72:ejQ$bF̍(-akgZN(oqAvVo&4& Y&iʇ2Ֆd& "&x#&Ysi+=XR5,h^߆{R"ӧ]c)6ٱvYqa1x]̮P=X+StAZ$o$G>Xc 9${5NV-Y hSؤ?LKjv/:3 L5AڦShPʩDU tI+ <:a˳{m/ey7vW)9X,tґH@ W04Aq˭*c y.ƒRcATxgx+Ƀzm6[uh,m6Z9J VAB GLs]|K `XR?6#_sGKz )u6 +Vjj[ $= -vB&79ż?c큗[q-]YtVP;PfVRZ,(OQRiOHĐ.?Ѭlq唞|APmA0|z؀r9#)xOۑ.(Mxטxk}֓A)1Vԍi^ TCk/UUuz>XFZy++넞& :v*/ hn5!YDYfΡ'ڬ4}Aa sg 5܋` ƊM/HnP_=%A6R tf?@)oQMUpCGH~q͟|5tټR#/k*Ӣ,wN %37Zv;82㜐1P,-L$Bbqt bpe}b/C#p k,H  t,Q3~62N@o?lf]uHxڴ l:N6PjL xi`1+ԅǗhOCg#ڮ%@ m-6- <ҏsɯ)s!a^RIvVuNQ|GP17Ot< 7⯵w[!b:Β;0N_oͱ7k56YT1nd8Dw-IߑPb2?lɔRr(=.i<,}*}7QfH_M춫dQ4IPԼB]Xz{})۬Hj2Ní1 jR>APFk# +\p +\SKUi @`z,tWû}azw3h;(K8؀5E`ه`w$֧jU\^)-%۳H:FԿ7BI[:ҙsG'4Ed1; CҠ(5>:]G;'Ȁ1O*s;*,]\zçp7yιE+mf}v#bt_--5Kw~eq?'#Է ,o$+pp0l4j:fiwzԻF776v5Z@ӍX|) CIN_}>H7z18(6ēi @ qw/D,*K9|[GdڏҍV ؽ],)ُnw,AܸQ_]/e'A-OoX< t"1A`:{Ճϖ?jjV zNλ(3O(I<-D ۑROŧ0Zcio'z'] 7aYPBuN{TWY,Iw5NYĪ5O'Mt=h{hN=rp6ɥo( #k!sgf`r; -$BY._眃qla7*7%ѴjxȘU 7g4Զ2sn[9-bNv4~tIGCjX@-8p@1 zlSi"aw{*WO8'Pf ^mlVEUwt;w6qN+,3G Hv$W٢ąd|(Ǡi<͈ ~;K kmNf KĨ~hIO߮O 5>mGsP"j?~>!t{|U>bBѓߜ:ITˍ6zItBeJj ы  0k KkcE.<{7 Sa2o%MH5@ =ӉHӢPxs&"D˷uؓKc {E[J&~Yn'R}J[Zəo}}^ݞy' yQuK%5hIJ6: u8e@<I"LkaۖGKj?Bz[s\qDCމ,X.`G91z@ObմrΧV;Ԯ>$$jU%Ϡa<Egy{9=Ozi=Q5IWȔKȎ03L1ջE}Iv[r'߈Jk;t"۵zepu uõ~(~"hqC>(\ķ]H&7mAGõv;g']eٞMtOtft_ڭIM灏Hde0j z[Wr!z16Z[upuBC|HYQb'n!ۻ!LMfQ$00_YY%WAU.%[^^ a𐈙vCZك3]oS$Zr(YȀKxFQEڙ*Ӂ# Yu&Lޭ01$vD)=i$Z]0і"NN W3llL?wB[MKOHFw~<~Ѫ6 Y,k.w Ѵ }1 9ƍ9zڌr? )&)mQ+  L&řAUgPEc1|=F1jg^V{&,⢂qǐ@Ikzq8149wG1^v_5Y|)N|#Ze,yM'Cm塟z]/ ;4-U= nfI}?Ԑ>4kgB;%XON*PcdGBnR(W6L%Ɖe_/BVbԛc?Nj۩ [:$9w:Ғ?Ej>,Kj,3va`mˬZiyMo4-2lgc9>a/TT*|]C0sa2Mǔ_cX|QbJ.G#)> >yyNʝ= GKN#p꒹d,c\D5aӒe BA|` -\" xw尓:)jާw7Si&rH=:XfgrzlcCo)X$Ev+=^eDpQIÌ<3<_JSQG+FǻI}/GE3D_fG'cBA{;*S;:͖ vt,0]24sřR=ެ4y1yD6WϮ( 6cGA/9_e>YGk2V+R&1:~-c&jiE"1թkZa\7rl4#bAT.]gBTFb{]^m5ې~p!ck, A_vճirAܖŃbbfy\oZk'uxVu=0T'Сe-`h z{/gF'/.QvK4uمʈhZf,/H<㒝k _ GR ,IFi45 }贓Yya1.AG?8bqųdD#ZHIxFPzwP5%wpo~gQ;NJ!S8d%0ӎwzF)7Lr[HQf@4l }€k|ת-eHgU/(؍c_[|\:KSs[Jq?yMqD̆<-IsrNw)#~ρ_"Q'&ԴL4ݐIE'C%\!j9{E̒soQVzu v%ͯ3:)!I1e<3Rvߠ%?[= zor@?j{%wZ)^e P*4[gQKk}0]9$YfQkr.gf٧,-DQsשM1D4Ah@[qv\2{)e!+n7Z/jmJHҌjy鲴}XB%DL$b/ }R!' =)k]q5zA? cЕ9W-~tJ `D-MN+'X鱞,) [jAH#볤,Ľe0ErEI&GT=dKF!jz (p gBAz߸q5D'Y3>FWN8๧ЮU(SAVM,e$ttRe%rÂR?yF*RʍT=ikG=[,`Q DB-q8qm A{MRm܅I8" m2ݺ#sWHZH 6iz \h'8! ݞɀh_EE7GEiZh3QT$G2'.v~EPh܌@6fg<>%)]jxXӘEd#~ʉnM⧋,/7*ҋT]XʜpZ8?N#iz n1#gڋ?ȥ$7׻\pQ7=jDfwF*6TB)@j*+#i0{>X{Fi> "kRA1ɤgW@Ydžʃ݂v;$Z4vi1JQ +ޖT.HN8G WƥP/<&!SiRt x뫩_F umcѳO$iVϝp(`.d I'^Q--.nip=|B6 e<8@@jڵj-L3.Zz?P/T#mfE=inpd]}&+^C1kNY-D;Q1k> < ~9/ӣH0h_rd y}Zuj$5 q>/z!I[yZm{}{S*dԯN>n擼CY -9"-ߥ~MNhy1di):N՞ݽRLRL_2_YkVޛYOȾ#&Y= Pl26,K= 8 c?US6°jd/fZF.U՝t$ٰG!u80 YݜgduzrX׏n!&KY/A|ce凄K 4߻&Eaɴ`H+ӚZC _,'=]%xg@PDjYJ鯱\&{-}Sљ%V{HmѕDz&0T[ WX/V}Kl U(55􎴪p# y\Ir-490tЛś¶iU"+*$ODOⴋv`$Uwg`nm4-՘۪;Od8jkL԰Itm54I 5z.m,Bٟ[2 ױ d~%p [ne閗\,C'nfn-nHXGw6c(+,FX9ԘUbGO3b9 \syliCGO.//%yyaHXkl=9g%~[tMks̾q4 ""`p8^T~Kϯ'Yq j+!6$(`Qwjp%u=j8}5 RQb 7PaGjs#jE ̒n'W5kܯNkFTQe sKq=1[ AH@% y+j $7vʳn$A{J&fT,>^OQgn/b5gJ/ͭS{ 3̻x 4`gW5 C ),;Ґ8A*tJQYьGu;V<~~K%4;F:Y,?uve,ҽ:- XrY)UUdMjZ\} YjSۉs\0o6MF,uD~Ib5fkjUkZ tH,k Ygov75ZZ&0I[ԪdL٥?67U}L85iPEاgʍVeb^\KKZ`T'N,nfQoLgHMt[Xm 4gZautg$%; IJ7bx$±~JND;缮sdT)fE24y4P.1ajT@,ANO9}'Mm؟L&.|"t '=}omی@)T^6{v no]Kbnc1P55SpmV{"dމo j]( AEEhad8J)rvD_Ǟ{?+%pDgף~>oK/䕴CoT)}T]9]KdeQ&!ߚ') xvi7J,(]XИzNV`zK8PkqL6v{Kwv)DX;?T s9fnwjU*sPZPUij?ǐ4KI#Ұ.{z >өLZFXSp8? &̤s;tqG( K',UJRe}ifsL uT{D dڀ`GC5m5Ȇ+.S$h^f#7zO˜'b,M;! h IjR 6| ڠPt'^wy9\kFl(s0ivP6f!_QBSzs@Ų#|C&bJ3QR&h8t n R-zOZviןZO'd*eJzq,s2%5s#C<.kqgp.b+yأ']aZGR8\.G#CX6闛Uҵ^j&3gqPCo/?1HHڨlfbB7A\75V 6xB\ rz2lVrΊ\n?_$m$0#krɜv%=_qujU[fyh&G UJxf58:v3B>Ɣp|E8km /,I/%R¦!c!s)'w!I_uբ/mJSo;'B'EΡyI`~p%*sz)<\8\-lP>l9^=cWvygI'&skPO+fl,Yr\)B{4] 0_⍵p1 x\lm`ibg7{BgC:k"˩*~u:SJ$?@@LI@Ea4Hmk8!@qKCV\@50 4]D${ۃ]ED,Cʝ9r#AXlOZU7$ ԅUl [Ej`MU/{I 'NG4.%8Rd׵2ޞu5oY]\ޣ9rA.GWSCt`ɎT%Эŕ,BIĎ̲Fn$ ~ٍWw} bLIHL1e uWߴPZ[G',[E7O:Q^DY'Yn~S//RU/xFRݲcɘ; ZC٬hM4.\kp<¯˳ "_e"~sxS(CL-MW+xytD>اM1270|VC;NiQB5Xk\b.knt ciSܝcsHA)(¢ I38(b*Y<"x:$2>"2 Q"= C# m؆X8CaH: Ahekda_M谪6 +Niz-{Uy/={^CY:q1bu9sJ !`྿[A:_=+ADpp߈pӟĠo8G1YnkS*u42G$d.Rq4n=#@.xD Ș'?;8$\ͳVGQSWd'㚪u-n D |u .@}b}FA] ZaqJYߠgG9T5;PM=%ջZa/cUk~U5OE]IS\W9ek_Ž:ݗj,AA{o_8Q7s\'Lp-tSZ Yէ ĨN;elL5ZzBjσ8Z&okv{4NMz)ϊj@f ^Fa}nl=lKU&%'_ H+A:3 ]t;`{i:E4,=ѳƭ`}9EGuĘtTհjwN%^q_VXu|*;'ͧw'SzM|ppb${ )ϿbnI 7+ZάA.muM5W +^٭$V~N6B4(4?3|E&{ NtOF ~o7}i1CCI|D|jƑ+&" pD" @!4lw"?!i=d#yr! oEmg^;dʩAd 8%Sf^3TS LE|B1)3o(`?X]>o _;F܄^>_i] 2{tt ,&i H}tYYɳ˷s=]hiR(K>E>HxKBG]j2q|;Q?5Ύ15GVlX$d;ܪJaJ/~Έ{cJzw9Zd#y6ffCbmmZXJny /.lxD7[ Q6sƥz*t>򯅂@Űd1l6%yN|0$RQ}&3g>W]YH'Ҭ$+WݽZ=QoɅdZCIR`}][6ؗd7t>=hhzCgSRӪhģeN\KSRɐ9.'``ڨ CabZG5Vh(z jvT:dVt7 @ zNV~^zҨV7*F|ٯ2<)N$-y +IfXBHOwNZ~9z:g}?a7 C0o6]Ͷ Ny ȾZ[G~2;͌a8=3m"$D4K =Μѧ#LVZڨi^7Qm87ѭ3y#pܥOipb&r9zvf4G!ETNqrrɱo=B\n/l6]L5.9:m^PȜ&I0w| 98>}GkBou8 ~|S`!y,F J7f<^Ǣ@YWoZ WsQvz-otߓ/^z62ۗ&kjQ-Kx#~֩opֻ;SYd$uvUv`T-wcU݅߳T83 qC_q )GpTebL;>(3\q[3)ROVq[,l8b30Ou ;+p9VlT?lX!>9_{9fCDeH7jT<`MaCftVȸL5^^*-o qBa 9/ߜR(ПIqyZTol7DTD:l<8 PB[=m8`zY"ߧ]3{Z-XK Չ(s |lI=§d=A7Ilp~b+%rO\ލ$-3Fd|+>fT|rLpCnaX˕DJ|"-0)oE7rh/_P bb9y螉VkC$طiSES9_#UYyR5Z0tW(AR4yX9UD^Hr l^s }yəa۪7r-wⶸzɂW ȓt̚ĽngEfCj ZX+ך{5NK[U{-oy` EIR r"d`?p=rݻ+)NRZ8|J%:oQYh\+?WY52s߻a gߞ3͒Hd2<w_+  Vhb۱W%=[~ϡ2CsZE ,仾w*ͫ<$YZ=bJ][sL&+ࢰ0Wę;EMOF`r(ʜ)4f}k>B /'$>ޕp/X5ͪ^RI RZ2*}_R`G3j+تOjXsMb 0he*n20ܜ>[f:1I:)ZZRfGQU]-6G dn6wNԇ##F Ð</\gݡYEԌ㇖l 1 Ԛ/jzt v6 $NgeI̚#?Ya. A 1IT<eS"+xlb[1\yg/!S[zYt63d+!jGxN9_ZA\5eEo: ak;IǗ >sZ-=a(PƋyJ+&C#*Y|+k&*DK͙&ty)P)ƫ5Ԇ4U.%֖ Mʕ$#" 6=6eZ~T#F(GzuhN eݫ5Iϋ$e黲^i8p M+wڝ.&7N7$: Y@|+9W:PbPz{ď>-O}.k:C<}1bhudL.0KkjMRzVvg)]J3ˇ-XY1^=򗆕$Edl6&x=QQ3MwaGPcIC5i+id.O\~UdЌEJ&gځW#q%rP6>B8qgUxDjAQAcŤC#& 5%WOxҡQi9rzP{kX^?+nO nKGNKq%# /lH{3eFcBo~Mȹ:pìOIOa* 8.30 f޷ۇp6x]璺m6ɞXι?~90(Ԛ{ :>V $3/wC zMz5W8aQk5z'p~.3%:} yF,u#䭞{xzr j ,yaL0/ &ρn?EV>5GDKևv wJM}vRXoz"wY-!;2G& r5U`o5r) Щap n ZqO<; wϊὄý55qTi>\f1w_\_AkzH(Tgp̡ Dw YQǕ{E7'i*Zϊf}P~*C?JKeo(J*KΓŻȤunx) :yvF:,b !S}*5#(2^vQ1\;ш wzc#S6ΏW"Z o#eh.:Ǡf4!"yMjGdrRtA?KE]JBx@sq:..*bC8T<"8&Hww߳-=4ًOz <+-‡|c_eȽ”+yJVQr 2,=R^c.y4B$YFF"#ju>3G[;zGXVoI#&%etA2{|j{3a7%M%5:/B;T$iL`8XPs Vex4P#&sH (ƴ jC<ŋ׎ 9ʲ~z i^52QpxH=΅erZ uv$2Y9zwx= mA%b akiՒ=s[Ks꒓9*.11 YM<'dOi!Yf϶ƎS䰓~q]JId'됬% *b5HWRbM!;4=IW6x)?H(8ʁ*a"Z;03=H]SFxQe'ܫ4լL[/i \ik%$T!OѰ I%MR;ܛgܡ+g2 5# nlq,mޭknq1/HQ ex] 5Qj`y<$&H؜*P$U[.׈uFyϜ[US'شWv*i٘8W+TTUVvyWhxFod-aNG`CRlp%(@p/dI{-Z jdh 8cv:S#i'0@8 ms+(wN}aoVEYvъ)%Y%p^t뺸kipDi6Mf{$8nDR2$uR[moK8 Ε/lXJiTT*ܗ ~.*76@s=ICě)CQS2EIKI+pQ ʧ(DzlƁU*揑FiG5Rsϫz8@0KǀhpF[EKT>5OpQG&;w4Ґւ$OSv}&OM@;an@>Q5հT}&5UqS$( w`'#)[i h|kY ZO,A[޻ zzg V @K]hDnخTAMyt C (H5Ev`,\Ƌ.eGXE/84,4]{!-0dǰH[wUvQUFg?c:꽘O4m Ep:3ٺn_Jl:'%_zKNHL"(]ש5WѨʖ2j<")/eM, i'՘酳1&~ъL ?~ 0ҏH[=vXfp2å a!f( \q7^z Hs*Ӑ7Ʌ9뀸1p0l,mYY#>3|1~(AyĹ\8l`K@J9]5PF O0^4`&n"0+C f3WQ vs"h[/:UcFHUX.TY+ W{75eFL,%n v $[/~=OvE >li a v^T \IfvuHU?!_k%n 34 dpXi:~Z;g /+CdT X4 ?|цm8I»ycmifLnAvO!Ҋ{4h}99X L`٤ahY1괸Ž6Rϖ\ht¥"nг#9ğF1T>\*KuƜyw4SUAn-˵XVIt3|b% o8/'I!cQNvOk+qap}Q'V@G+}axAL93IꋋZa<*S t)+qc~,V5M1Wq(e/^> 4[q28̂SДy0C|yOuduVtsSI?5KNi]ˋQ7O egUn+_"֦ |qWCٽb:߻:~%-ٜ`d8fї8C B\QCIg!Cw $b\9+xf?'fO*shp24dj8hzgm-I@8m颯2QT)dD :6$!rFNaU;" #ZtC)Yq!P<XKFceQw~!܆q^b ^̶P;z9KԠ/}MNI3ɘ#+%nʾc ˈ.9C"5s&Ě^$f#}‘RKѰB::жh5eILkjR)/m~A>GbE3\ቲQ.! 6FxF6s8PE@?Xv 7jF#1cD~Ch-:{&N3Ns/2s蕴W)1ɀN-%|4~&fBv[;_:aL x\gyc^ю,We ,e#6PJXhIOh:LBMx9FZްxha\ܴ+r]2T'&+C|,D`PZjzm{ƴ u;ɤӦKqVz;G] h,YEvkcI+ /\ 'd"'3*XNz9u8:E8