glmnet/0000755000176200001440000000000013574220223011540 5ustar liggesusersglmnet/NAMESPACE0000644000176200001440000000421713573535152012774 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method(buildPredmat,array) S3method(buildPredmat,coxnetlist) S3method(buildPredmat,default) S3method(buildPredmat,lognetlist) S3method(buildPredmat,mrelnetlist) S3method(buildPredmat,multnetlist) S3method(coef,cv.glmnet) S3method(coef,cv.relaxed) S3method(coef,glmnet) S3method(coef,relaxed) S3method(deviance,glmnet) S3method(family,cv.glmnet) S3method(family,glmnet) S3method(family,relaxed) S3method(plot,cv.glmnet) S3method(plot,cv.relaxed) S3method(plot,glmnet) S3method(plot,mrelnet) S3method(plot,multnet) S3method(plot,relaxed) S3method(predict,coxnet) S3method(predict,cv.glmnet) S3method(predict,cv.relaxed) S3method(predict,elnet) S3method(predict,fishnet) S3method(predict,glmnet) S3method(predict,lognet) S3method(predict,mrelnet) S3method(predict,multnet) S3method(predict,relaxed) S3method(print,bigGlm) S3method(print,confusion.table) S3method(print,cv.glmnet) S3method(print,cv.relaxed) S3method(print,glmnet) S3method(print,relaxed) export(Cindex) export(assess.glmnet) export(bigGlm) export(buildPredmat) export(coef.glmnet) export(coef.relaxed) export(confusion.glmnet) export(coxgrad) export(coxnet.deviance) export(cv.glmnet) export(glmnet) export(glmnet.control) export(glmnet.measures) export(makeX) export(na.replace) export(na_sparse_fix) export(predict.glmnet) export(predict.relaxed) export(prepareX) export(print.cv.glmnet) export(relax.glmnet) export(rmult) export(roc.glmnet) import(Matrix) import(foreach) import(methods) importFrom(Matrix,sparse.model.matrix) importFrom(grDevices,rainbow) importFrom(graphics,abline) importFrom(graphics,axis) importFrom(graphics,matplot) importFrom(graphics,par) importFrom(graphics,plot) importFrom(graphics,points) importFrom(graphics,segments) importFrom(graphics,text) importFrom(shape,colorlegend) importFrom(stats,approx) importFrom(stats,coef) importFrom(stats,contrasts) importFrom(stats,family) importFrom(stats,median) importFrom(stats,model.matrix) importFrom(stats,na.pass) importFrom(stats,predict) importFrom(stats,rmultinom) importFrom(stats,rnorm) importFrom(stats,runif) importFrom(stats,weighted.mean) importFrom(utils,packageDescription) useDynLib(glmnet) glmnet/README.md0000644000176200001440000000625713555633674013052 0ustar liggesusers # Lasso and Elastic-Net Regularized Generalized Linear Models [![CRAN\_Status\_Badge](https://www.r-pkg.org/badges/version/glmnet)](https://cran.r-project.org/package=glmnet)[![](https://cranlogs.r-pkg.org/badges/glmnet)](https://CRAN.R-project.org/package=glmnet) We provide extremely efficient procedures for fitting the entire lasso or elastic-net regularization path for linear regression (gaussian), multi-task gaussian, logistic and multinomial regression models (grouped or not), Poisson regression and the Cox model. The algorithm uses cyclical coordinate descent in a path-wise fashion. Details may be found in Friedman, Hastie, and Tibshirani ([2010](#ref-glmnet)), Simon et al. ([2011](#ref-coxnet)), Tibshirani et al. ([2012](#ref-strongrules)), Simon, Friedman, and Hastie ([2013](#ref-block)). Version 3.0 is a major release with several new features, including: - Relaxed fitting to allow models in the path to be refit without regularization. CV will select from these, or from specified mixtures of the relaxed fit and the regular fit; - Progress bar to monitor computation; - Assessment functions for displaying performance of models on test data. These include all the measures available via `cv.glmnet`, as well as confusion matrices and ROC plots for classification models; - print methods for CV output; - Functions for building the `x` input matrix for `glmnet` that allow for *one-hot-encoding* of factor variables, appropriate treatment of missing values, and an option to create a sparse matrix if appropriate. - A function for fitting unpenalized a single version of any of the GLMs of `glmnet`. ## References
Friedman, Jerome, Trevor Hastie, and Rob Tibshirani. 2010. “Regularization Paths for Generalized Linear Models via Coordinate Descent.” *Journal of Statistical Software, Articles* 33 (1): 1–22. .
Simon, Noah, Jerome Friedman, and Trevor Hastie. 2013. “A Blockwise Descent Algorithm for Group-Penalized Multiresponse and Multinomial Regression.”
Simon, Noah, Jerome Friedman, Trevor Hastie, and Rob Tibshirani. 2011. “Regularization Paths for Cox’s Proportional Hazards Model via Coordinate Descent.” *Journal of Statistical Software, Articles* 39 (5): 1–13. .
Tibshirani, Robert, Jacob Bien, Jerome Friedman, Trevor Hastie, Noah Simon, Jonathan Taylor, and Ryan J. Tibshirani. 2012. “Strong Rules for Discarding Predictors in Lasso-Type Problems.” *Journal of the Royal Statistical Society: Series B (Statistical Methodology)* 74 (2): 245–66. .
glmnet/data/0000755000176200001440000000000012507264754012465 5ustar liggesusersglmnet/data/SparseExample.RData0000644000176200001440000000752112400077000016132 0ustar liggesusers 8UkǷ!2)ʐd i2D)TBr%,AT "Fc Ɏ۴62ksﻮ][^빧<˳vmZ#h%HP)<\ę8qQx)/G盇0qB\ $$ 4'0&N`/ ~N L"&D`HaN+~x fHS((hqr#}Z>I 撹-"[I`-YZNg* 55dtvMc;@+A3@oF`Aji!Bj1c :/? t , ɺɺ(PcVO&ؒsI 9u>P~xYǖ#9ڙvdM`!i;&?'}d\4=58y+R/^2ogM%csjR3NIm^{|9.kY95EgΦ3W8@ؘ1(?LRkXwg+ȸƤNS:Mē%8/'sY+g'c󒱧z@[GhkD˩sG9ZsS8YRUn=n 2g񿭕u"I2U"YH{H~~AzR~,9d@s$V9"D<$H%xGPE@#`LIE˵K_x>Jv ';u>Ay68."gpmA* c\!][~6ī5ͭ;^T{X0Yw Ǩ+xn+h:Kv.K]f^LDL#lϝXlfZxioGCNA#X͡Z EQ ֏JMf_of-Q d$ﷄsWca3 [1t^}; N97Cg\&IʩXuV_a8nnxu>;ou =n,>q>%'ҡuIZHtxo/`RAXb{$X‘rkmf ~6JMk+^ <@f {|?Rnp׉qlz l b,(aໜ;?E+Nu'.{گ)nn߷/64<ۛ=[lK@Jg p<`[8KBYm7`"oй{(ޞ' [7j1Q4 wB*l'N&%DGcnH\zn>* گ}z NG [}p׊~o޷;ܳdwSeMJޥ&*Ǻ]{ XoMً+z oțYG!ПLp#IAp\jB5w0R?LV ,#!JczI2 OJ.u;[gR"VfUt00!w$r+W>߮ɬI=ۛ|V%Z,t2Mbk^ZWpⶳM|cDmpdykg80X z=,=@ n?*,ג X|+>Y_Cv[XL̬Ħs{ LE[iPy*`=W옗M̃5{X3]e]w}2^keV c.͒ 8"ӻ@ ~Ԁ]Uz~P =c˩ZEY,)CsdNϡ-+$5[TH跋K)Lāu6e9$L<0Zf29Kݷb9tE?MVZ"&fT{-?߄Ncнu5i)7޴-~>~4x9/Ԩi VB^;'#Kmm] -;DffcHث|!J*a9L%^~"x[/g[pjeewA۸?|X! >=oRz᳆ IXzjFdmژprHz-ąk]sh˖b;C^=|1銽/}0hXvG<̔O￟jZ%( 4%%֖z`u;=U#>VÑX%F/3ݤ"kh 7)A{CRN 4vWݢ W[huFk?ߣu| E6lvp\ͭhkQ ͤZ?z1uW: _=T{ &pK(W݌ǩK]%9lăwbhՑ6.&B+[|ehIb\>VE\Ni9m$3qFJs:uB*Sq 7)CO:?#+$51FJ5P,x}Y( P T/kzk~8/F72i؋'J.5`D zWR -)Xum'm((GL&%6- : 8VʝlM6~ٌ le]x _tʩ%Ю@Z2)6^̏93t6ø.RLx}AL׶7)$tVHoƍ*"0-J8~Ӏ;ߤnv}c]FCnSVy>{/n -$+S+)2uCnVlا`ʅ1XPtLo?hk|Ln1M-w7,6'Rvr: wOz u  g<.cCwthN(ه#}| {ITԲfpQ;7xRT퇾KfI&WŸW"|glmnet/data/MultinomialExample.RData0000644000176200001440000034174212400076607017211 0ustar liggesusersw8Y2!Qft $d(J"E! EPH^{yc?yιs]yz\Sgg9RP()h( ٯ0Ϡ"fJH*_{M˧FZ),8ݚTl?.un/s޻Љlfb`k[:)q8q#19p;v8v¥8l^~@tîd&:>iT$Y9wvJʾ=0[[%cL'ǭ;pT**||uaC`z qd3ߛZHZ 籆z!jWf Nq6c0jMi~2+ÊoԂUyIWݸ~:zC=&Xn K>We`a+O[  ?Xe7|MT'p[q,TMo5ajl)^z".gtpssW[%GM5=0n>2au Ƽ2a(U{wLoOs;=(IL[3ׇHy~i\ }9Sqjs>6sK8G W ubZw^X[WMLXUjCw/7_*?%殽nEv`]{mG Q+Yy7f@ѥ"1wc1J8)6f)r1w}B0ȧR=mFՅ{~ԿvN@Q+*X,ܝ{Et)s~q{K< 38LV_,qa/ } iRt~Eg+oO4lp0 v Kko5,^U[fLE+{kU/v jkY2b2o=Ϋ-k 8Z@wIm `?X-p^1pKCˌp3]o :ǿÎIҬº0,e.8zI\7e7 ѣXwU:FT~t+cjޠ@aQzvUT{iRAȝ۲0$teqRThz"wދFys\/4NNI-Zg?C?tz WbtYp 532|Qf7X㯝,d孶%M/:rwB=KE5A aa8vO>YhI5s[OJupBӐU0 -ŲQD^`g H~ًPeᲳ8'ʅosT݇Ӯ/p=%u!}1pU%fc3[\()m_Z{cb zk.r,;.3V@vꅪ')%P~f\+^ia>Qcc C~Ͼ֬D }ZFȎ{SoS#O}&:ݮ: }q2Ov1 q^dt|Ķe7 yKiC댥q6eI<.qmE/۾-#a*ZG * MA0x&>%_]bl`fR*_.7EaCenPBG,0za)f>asVT=(K,pv\+Lўw~Ir 3L?7#]0nݰ&i+fwg_# )>r ^<'_CƽPX4V(O=֒q- 4rcڷ?5'k#L?oiCփ5\fծ1 w7O[u þRaWh?Hq9eʽl&Tdր0x +:#'ԣ<ƅZ*m_.HWGր%ӗDm_G.V?rE}D-wg=4wU˦$p{8f%1&& 7E(h WpncRp)標4O=+å{ӂ`R73pyPwKp~o¤= gbG.ibӁ0Ļ 0~njD^~wk8#h;>zElE"G9n ɰ_IFo"} 4?Nb 6%X煟rJh+uy }ԃXHzΒy2IV9تҞ5EAM!͘- (@quZ5 TB `^ɶXRz_8@WcKF9UT|tȹGWvGf-z;jٲ隲@uL󔽉J؋8qs`a( L>>sɜNHj04$b^f]Dϙh Bd{ T/ MJߪA5gwU`\ t[R儍vr%h&/ƮZ3gs&Xˣ1?2vsc 9]{d_Z!emVnbms^W0ʢ/@ɮwI>~WƟGoE!9aH9N0+hsg~y?,ryO Cn3_!L˯w~i 4ګr;VzHG$^O^{c80OEDb5o$[obBfG,z9X'fp,Ys~_IwXK+>nJ9eϠ^U<ƅ93(o/ vP{6?'vqd@7b9V^MIIV,Vbsד NʲIƦ & h8N^R1ꜟTקzcaB@Wz/iBq_ݣFf+kwukϰ`׌ M{Re*opԓq5:lW"yIȬؑb~Gf)?m#v'-?@Y[<^N8ؽfvyj]ʂIUXF}* aF#.3+`KZL< sI?ztb4x+ ;T YQ^HZn<(SVI&g+qԿ~e dW4q7VG9e} B遒/씗D-nyF}ւFhXhUEy#µc2*OaC\h_cI,_9JqPI,_YAнVL6<Md'qJᳺHU M$,D Ul1ԡTﱚj:L8ns||掷F>eJqHn>~g^ל*nRy=k ŵz:la349`3_A_ۘ(Ν J}:Q<[:\h#zveA=VnLlW.vW=@o eQ\5o Iq5,5")竝w;(zCSK_upsP%ԨxS%Zå0lUک|A+,\a9icM<$;#Vɢy~7mݫj%ơѩ7Rn%Dᚁl,7ׅ˓3N4آtY[0.<מ#aTx'>Ճaل!tY+=wpuSZc|4Q=oMv1uoZ8j/T ̏n.8뷈?PF>)1A]">Mbﶩ_ :('jppTqeU)Z~ߕim[ja170ƾfʰ l<̽ݗRXia*oôtPc+X3B' TߵdMd;s5Lt[,QgEK XaE$KHm 3wHCmrcbn" w f2/ڰ#[wN2 )a7v'R @s^*U)v.5< kԖmX"zW6.KƑZ>4F qBɗ `᱁0NtswylQ38`KZ:φ.ēw40UjB)כ!x>i䯿wE3BH&SC]1/-ApL9sm 'X[|=n,_Hg?1?Ng*J-FzZP)G,@·HhPC q>$.f2Mw5.EUUp|3Eslpy7Ux[TיIJ1;IdhwkhyzT2Q)[KA-V1!{zG` K_`Ë. 补]~n&u[ p@)%$nW^E[kL nb%&-eZeNf+S5unh7>ȃ"9%; aq0H'4a㦌=87ޚ_C 4ggp¡/qRN#&]_̨c6b}gDWKRT)- ˵J}U8v̏1;F絡]x4;`{?SP=Li&RGq {;F[47,z Ku{#, ~u܆N6HH2U1=koh~g}D'2pҬ؂zh# ;=sc,KBl 8dt[eGm, [Q,V`)!>hF&%/¸]cԣX,(-U|::6e,SYެ}?"C $-xGpЦ<b^L{ ](\w^2bDZ3N:ߴ;,gt@_ey |q̫BCmNG0 h^1Gno2OqfLVe8.L;Wb[j1RXą51XefPcI^6/pNms ٜ5͆27O&4.|"P)^-I|q=ڄM/ #H}1qn[#\i7i!cNK|RY~NtWX,t+ kɆ#W /yD`6M圬73WM0G ]ҴIC[sؖ?\1']8'n=YYax;Y] հ[y~OalA4r_YH5`ӇU_oح?kvTKmLC\><rALhd<~veO,ReҁٲnxC8{;wP72C'1&&h*50Oy!&N0];C|G=bS4HH.C4_źtb;u #3e~~N*TL$pLhyGUf^ ͽZ獩QR ]LMjcWBfn̾ 8,Ӂ G4mJo {򟾦Ǝ.5ۊ8'}Rɗ l ?8r2[{L#P t/O7vIDh$b9bU{U{UlZ׀byܯ0$}#'<7 ;\34_=NE2CMl.!IH,G'>H6v]|CuuGgBȹstbښWš9y}>Y+i݄"< i橐%/E2WBb`1qɦ= VzE 035&<ϵ54͘!l?H_~޿8eh"25#kü1핅`G`㑎_c,;9Nəc kJ,{7CCmMYq)?<u50}uoaaz 'ڜ$csoSvWX=[orL7RpcH&X5rsE>L>5Ak7q1~,}|^s6 ;bhz>zS619";k=w_? 5ASULYjg8pS0'Ԏ',v[˵sYB4 j/tN'| qZ5q&G\Rl,'b ʼnhB:\=h鲓Fs"|T5ܳrJj{ۍ߰Q5"kZq q_LjoٷC"O~]Ѝ&{N˫bxpS~?>}ms]0m8R9i^Is?8nNڮ̀%o~WЇx3vu j=|X' 8\g'i=`dv)\=ո m''cBO%5~a7WpXD͹(?އlj`"j=Ed%1uD_ ~z^8##jL9=̤j}E_د`o'X}j#:;G#Rg'ۘ|̉]:{aTV΍p2u,t1&aK\i0Ni P1*1iS{N0xhx³0}d0iҫ y6hhGqXc3dj"]=LŤöpČ:.<ׄc]. MnڝKg/0zD. Œ3ŁkeFPl;, v!)ݯGpzL4L8EOyUiܻ~5a\Hfؐq^(~P%esyY Å{|bzSX灎(p!_ ωdŐ tFLmݎЛ,zL:JͰip#n0IdЎH2!uw >Fn՗7aĨd.Vбt`mVZ4y!5jՕg ,jN_ǞܕGc'/iAq0‰tş = \4xE t/&77Ewp(˥IS>&(l%%i✾'Gs=!=@a"e\Va{1gt:EWP%;`"5MUUy!8N\q=1!-jqwpR8"+c I_@ֽ[#aീ8w_C߬|Ҷ<-{<^W(tCWC]ws̔67/CsQ7ߒǩf0~hPQ,;& vTj' 5fnw! 3墏1 0Uuf=?7b#%EXxn}gXp=RH FaT60:I<Cw6$OtsKDoL*_|5@}nj6H %|fBئakk| \ֿꇪ@E[8E%#޼ Ir.^gѼ!wC6MqR`E{yS {DZ )}0Ni-m6%L)NvÜ +C=cՁ=^gH, \` v@0χd,.WƋK}#HvIzҹ/@-N$6 ~xf+pY_R~/8Jy>)ih^ nAp)A{'/:0s|ab-EL=3)[ykUs?f^$ڣ1{h1Zuf]>ߊgÎfâI#0@3}n%5Kp^W}p# -H w7j{&x~ LE1(=';w^\ĹGTalPzKtOxBk?1?Hni+X^q`eQCRv^WzAxϽ0슅GJqer3y\ВWk Ï4im!'2a+Oan顒̐<8D#*GI-DfrɇʠWGh8Ͱw\…r~ҏwf΢vHLyՅu%qA.UP#{)Cuʉn0?'sKϮSigqJK8^&ÙMfYw$%XDP4̭;')d6.ʃ|EMxBvy#aS4Q&^ꄥua\8^kۯ:.OOY{+n ob7sܓ銸nkJw \Ƃ- >P>fտE{:^?ɼ7 }^q|7wͬ[xlY7X b cq=ҽ=Y֪X,k59" }./֓&PcaL dUiU^i2mnHvMpa>8)O6=\Ւ{aF'*ʨ@W]2&KSCpuB6.s(.WX'ueǞ+Aܙ0+ ߯Zx܁o^A#]u!r3j8LJPcXcjR8_S O٫ŃwKRwdIgi$aB/I0wG_9sWIh^Y[߂ڇP[Su8dgjk} nF'>@7o:0B~EY{SYV- XẏK4I#ob~/;d|pV3`~~ߎOW;h}ЁsI?faD=YU/f|zPL3Rx w8cZ\zKznw_&-#_"K>1G_у9J >ѓ?tƶlu؝ahZzϴU0?3;q]=59 a+n+Ͱys;,|Xd PO{zׇ úܒ&L$i}Bh _YYpOKF%;Gh<B ǠnثY@(&kby:łb8f's-JMxž'YK7`CRs-f0N3  5u_FL,攲!mS/l`fz_|A>+ֳ'R&_ %2> Ŏn cz$_@A8.T0 PN Zf;x`9Xw\3Щ=ĉUsGP9~k1WN}umFΗXh; 4Ƶ3O'v8:SرpĪZa@oǓ\M;_TEszc7#o4GO⇒s%pB,'Pj*ž˹\0IؙøY؛-;'i%'hI8wcp6LHdۉIto TEz*Dze<\8+q@Awʧ' *P{҃%njEt%8{Xp^Uʖ|ov& IDwKL`fZa>*AN|F3cs3>,Pų 8p༦`Ϲ/8Y/J]c(ZscE{`fȉYn?J7=!cd R¼rі3KV^^wCQXIZl#qqL?D^>g3U`䦢O3uͿrx^)v{[% <%atU^K_L9s GM^ =jlBOj OH:]G޽|wv|}B81WqXdn{h =+Ҽ~# S/î0*߰$JZwj;^r{>$ų=ɘA B^mZCp'$.bKh:}&yLL~/F.Vɾ0h<լiCd=+[KYI-`)e糖hfTt&&+bc nsSlvw]4qÊ~@njœu֬@̰OGy\R ]W\ y$(f!9V02CϲfU8wk0JΙ|Oz0Fk⸒Ei:4KÍSGە ~- ɻ>\PstG4L`H@ġq_<:)o$񷐪iJ0DT 93WqeLfg{Bni}6w72T= uJ ֊g'\xW pprIz َLC' ;|&S.UASŒ'@⮚ j7X1QIr[&9DsT NE 'y]IT,c1ؾѳ XOɌc쿼mO{VWt^[7)Xx?$@A L豾:uiq>I Ͻ`mWߙ̆| 8v>O()|3X }@puڴ5 ƽLnzi%wJ Å;k`kݥ {Aar!=7!]J3HŊrru~RV 4Kч_YW' %J|q;5} ̽g ?2Yv^$^0@kvht N^p ɫ!ةc|n!{e읧a~d'/4:chHt_|hk9A#mTNˉ]g0R[|W&B*Rd?@+Z}\P<35* c}dW囦&aBA$[KV;B]^G\oi_~ /۱_n:)>ݚd; /שp%tN^$Y~;igJ"xj\xVE+-4ˡ?mW+Ҕƫ$[/27l?@ɇƠEQ.ʆʜ{ ]q)BU/HwW?=-}V]߮}"sՁUy%?V&:Qkaյ*ߛu_78T>tHgOI:k9"KE8c?H$0 ")ϙ93nL} `#Ӵy@ t,v~M}Ls>r@~%e8yg/3i>/:X?`L y@oZm{r?~W-, ] op5RY%6:͊KH/^u.WOiMmgY0.ѧ~N~[søH4k=I~m3@n w4o$qA^v_p'g|6yvV;_՟G:zJWHV/iQ?@|e!X '5o&h<c m#tN~+:lXbphl-ˏi^ť?Ze\ѓ/y_Ww<ٱ#^i\7[ÆFwI.Lg]fja! N CQF:1O/^@ն8,vZʄfXXM{Z7,f}޲%ŨRnpzu$Qj|=7 -Y롗q<8~yLW"v,i+AH2e=. y]xqX^v\3ݧudyoYWM*Ȗ;h7xDviԇ=w-Ma=~VcK[WvC"h{TٙW-ppc,Ll[fa2!#, 3Ԍ1'V&qͭG@/1GI Bb@.0NR^IH^D:wFOZagנK-^֫3?ǣ/úqSq$~>ny _B;A(X7y^\' 6wi@M4/>8Rok֒@FsEFS kWS'tg(>Exfٞ~ɋԎavkGrIծy3aFg]Wp}vvlL4da\[G6 s#`MgStƉ@J+{kGk1satkc mULZreO |.aHFWG)7 ^ȿxfJb/;RQz-n E[w$XEW‘Rn3}; -v7ASnCX__oUPř {a.Sˑ}zDb2tKł<zJʑ`;hI3ꁋNwT0ݰڪbʬ]rqɥPxG ]rS /~5.hf摂4#8EaAϙ _Us,_9Q==19{-tƆ.y(grCO&% @r"YvQ\BsULVCMrv)PSvm|*CMp£SUk`S[;3Qn'lIcabp 7fSN=h+sdHL^w҄}4cR+_&"OZK=$ޱ8}'\P\COF<`R"[E{,-oy材 \x|iun 7 xZu 6~e!H#-,MRzyp {Lt8zNS%nR跊@c]?V @9&TA sܾ#[ILũmaLبa {tZ5h㈨'^l~0U7ze?`~Á950O2~l?P@~yC,'>z .1;><&Lf0l^RvJ;Œ) ZN{NehʵL /rdj#^x~-B2˅W kos36wF'a&4aĊKHYnߞ֖ds-{nx|[+mA JܟSԭT҉Ee|0>J&x&`r}z$p2OlEi7~|R\όG%Vުȕa>\,ZGP~^)~4"9.9Y~ zC?\Q kcӶ7 ? Iz`e#  RAyd& ZZ@|#|)=ㅗZ]{c+j\ h`ߠ?UKB:G;6HZ~/3^`;RͯXɀcT>Z'e/B`wɬ{Ⅶ#lT{g\٨Pajh1Iѩೄ!(?O޵gE[Z \]|U\6;Ën S8p&0/ E%L8#2I 58,> ӛ@8ݠhY+aAI"uĮ$(9T@]ѩd /Ǖ$@ ?ۓp˙xs,dnIĖs 0ĝiMi#H}p1P>?ʼn}#%D,?#]z\z+*% 7e, 61f`=d~8νW8-},Vǰv*C]` Aq\d^޴*Cc9L5 \kTDnˏ(ևOLaƾ3|p΅ر/䔕6ƅ0,,8{+I`L&=o:C=--`'ĝys2|9 }Kcq?!N/hCO/E: fO9V> :Et  طg[tmobeqªGi*IHD͕Gt;y`. =ƍSt9q[;;J%\m`8O㽘vgbCPmDEwWֻ=`%4y: .S ocۭ8ۻSĘ*VhP;뢟%U` ,:{uŕ|fEMF|2}T>${PCe]91K{Q;\'S'u%]/U}dpm͟ ;Zg셅 p3q'q6J|gVg^(I(Mqcg@ꆥb 64ɭfX HcFŠ/7dWsر>,y;C_Xl" Nݴ Ou*0wEg VzM=9Պ okqx@m>.[8~ R΄ÂԟVfc[%O{wkv8Cep}qzi& ԟhm':tͅs`4f|)/Xj9ZL0i]̌XDzSTkv)OJ;q$zC!ȭ_V_}X]iCͿdX,oY'b-|mBe-١+m] һ=ZX8Oixr' ]bWQgT뮮)h8 e<Lq?+JG?`8F@ ]1ԚZmXirU" t )L"V0Ov&*{iJ;vr8OpM&Pӵ~+h؝%!WTW+vم?ZpP|r+ OlΘ`o^v~@5o-R,:u]>  4܇\`|WniȪ| aߥXMJ<$gsa?++MmU .X-0B+~.jCɚxzLQ9c]e\ `M#?$ت2g2/gC+{cťf'f?`N<`en̸q31_ lk`{}XtsH K ͫZ tuceXZ)9T|IR0Ch!=ܫ ^X-GR\!-茦{B¿J6 {5ē'0C)>8g2R58QxSZuD6)JKPc'`ᦷ^蹳]Gg)]Ҟ5뿊40#E; }큌n6-u,81d?jއPcR=Ոfy桲h߿Çe0+JQhf:9c7^8] Ӳ^wo´+0+U$WCA@m]>&\NO`^e2&DqZe@1z% o}Jecl}[-lriyTp}xJ hmaOB_Dy]"{Bs<@{Ne7^W?YZl3<_?ZT}] Ocޒ-I, Hʴi{Ϋˎw"9BGKU?ewa^NZB _5X"BhJ-l|*`x8= ~݆lABS8wse߁'T,w{K2 dm:T=4a_t[#6/w٫CNtH/n |<>CDZl\xP) |,T_'CT`YJ`yBN16[,DЉ@r79Jq0ج#ԫJnו"+K}/г CBQZa_uH Z;N+OkKBY|T&">=44Wq{>e9Ow` B;p;W|$ՎswEDhyrK@z5TIhT}\,ˉ+Ġ>8b9ä X?}Mb桬ػ}!wԧ#ks0]7ssb A\%CH 8yUQ{(^$W?8SO#/c9wl28L3f8h[)a r8l$ҋo.lRHK.IUJ8]؇%^2ޤas4:>=EG7Gد'5PHBY^`ͰtuB5ySzKu&A&߃h<]~j eBpEQNl[)< D[I%3JJ/8 #syS?_S[spIpYVtro qн|}4 AqQ{Yy9nD+jcK1^ ^W굾? ZhQh O `y*>h=ag;c} {zK(⻸~+^ƅ])vs}W %> F]SZOb[5}ԎRyFWO m}^ HnyPU-Mkq҇;@̌a=8[=6]]28wPjKg-W)VRԕo>VB6 O_8o;7.?_2-k~.z6S8SC c'`tcgy_VaJZhÕOCv BKOaY\. 8z{KW!&;ؽ* KLR r@ dO I$_g2] VH{œ>)Ďo^q!%={H9z nX 5\|[ 8>Bh|P;ѽ>5rHk ÊOޔ}0v`W;X>WWB᠅k,Dw@|RT /NG2q Y*{!PuȎrmhK炑DglaN˨Z0|4;g ozG^GL{G_9KrZ֪sb%Ψ@u獕_6H{.H䃵w!Zq'v UH8PJ;NLgb Ǫx Ưrr@bț9@Blv2?CP;CϠxGﻰ,5ݞJ~S\z&͡Jf}?^N`Tl_↱>i␢-'& 3xKP>P I8~&=UM9QӮ )K8"v٥}t7+l]VkՌiR, fAg9ޕvM.3爑`죬f^ . YLCI?ph&,8Yg.HäL|1G`no%'1j?A{M0fasпۦ}Ĕv<%gDb}БΥUh~|& .V/2`Lj؟Ih +>?ᡘSafs:Z"yaqb1Ѩ+T};1ڊlv8h@}^U%g@DW mX.O I~\D`ʡ}MI,Wjij%ez1n#*nTz޷.[^ -3UbqVl}9/݇-ƭ_aHƾb^ב>D~z47y{Vf\@7[ڠ ^e;hϯgճ<8A,K&PnMʓ!G!Æ}4lڟ017 V[M&mo;~̈́6vM,:a9qBni[w%}'rs 9%t/ܹzeIgY܂Jqב- TNaf[9|58K1o{íU Px)wWh,xϸ3W`V`  6jĆoW(gT5/<:zfF ބX&c` Q5gpPn还\)L#1_9OՆ38Kf Uu{MEa^bڕJhٰV遇tYp֕.{lHzb`{ sk07 E񁩝zT G}<k mCp z{: Y]jups.,#~?["?2!9]ǣ|aPQM$zegԆBF;ĥ`Cͫkt RTho' ́a0VgVzWzKTHIr>\4, \Izl{&]>cv̌ԓta] E1,} 9L^c c_L2w/@֖cf_QN1 ~|MIM3ubU4>K6 EޟKPn|?&̦ɲ;q_a孲wK0&ux |bB4.Y~oa]eX:26ƕv}= 8oT].oTVمȗ*AUhfSf])ō]u#i;(A} Pgܼ@7:8 ms鯇`a~1Zx"z 6Us_h#Vyi\D3qFC@Gop|غW8?. &S&${5%LS25[3Oau= w ~pJ fʑ.l#' a㌆?缥)ƂK!122̉D[ۋq8,__4%GpZNY}慞 9ےHl^}ka7sFqUCltܠ=,aNJj=_1ufhC/okbZ9֬ P/}qMp6_i5\^O=qTM!lv@OM W<О P$[ +\4FYt1h p.%4v;/8[X`E߂$ ;cAmbKƨi!c׵䰩/_# >~:ɌM+? eQ$sߣٓbA:`E/4G5#ak5[2q-7T}?esqo rHcH[ޑ8RI(UD]W`uV W  oM*?e%C RR fw~ -ϾxȂ[F? Oh˃@k}OGM3vW՗+q_N,FS˹™h2X?Sʭۙ)@eq|-Sprc]Y~QL\ڇ5)W7v o<+;||g(Oh&̟K}t'dQ^ >m~}<(,V)C{ J?NjpVW8bYpSa rV˝ S|$~\ JGSzв}"6Ŀ1bMD5f>OpL^g:48T&*ʏOz{v<Q_Td[ў#yіptL cn&~><+fN+daZFrTis3 r 0~c?&FG+D^Gma\4,ƒ+iGqj@xwUfCzRWS1v'lBإ$4*f.obBNAQ5<⎋+=a\g9 ؒS/X%xdcƬ ̐-%Byc=Hzs{b;9W}(zLJ\?qpW$4TqM3Hy O `q3p[Y$ݓyp fK;+жĦ+o>øz'@*5Y ,o"mVxF=zw&rDzQdn hĦo_T.C`/܁/#8o -=aAҀ%?}wf<{vi=IO T=j`Q˚NNJO{aUoߧr9GnIF_cNc~JjE8yvMgpcV_C|\`0*‚!c a8f嶮uvwT6x#d)pe:~u7 n}A>zAeu72).ȳ@no&OX=g#Ӵ$G0(I ]Y}HzyU/#gS3IBVP3T4o:v(v; Q<%7`={al[.3@j åYa;_Gq(R$vߗ9Xm-$BRͮ{NI "rmF=dQ)ɐ(5?` l>ceB0{`][ռ$)!R2c0+U_}Vb_٬*6zy2U2:k?7SȡXJpbKD J']ޏ N~lso"P4/-ul( :9B]`6/}t/}\A_ 6pHgxsʕFn\=7ES=VFX42>O,^ú5*M 4cxlB uAnfS2 TF K0E&(\zY/!1k-/tsșsn& %4LDXj:I܁P}:lZe]+nURP1kwp h`6M 0{Vp1F~Sua2;x#sInH,շ'6i5;`*K5 f0U3lzW.C#wq)@]i"H㪔KEu /3P;IiJˡ- w]{7n7a=Wz6/0Fw V 7]"_9; V3<h"1cV߸#Ӷ?C˱6Ε#zI uyMFǝpjȞ.5a/v0Irf}mGc%a8ަnV}҅>Q7)bZ|bW°Ʌe_nzkf =",<:JvwMmȣ-= f:h ^%hNWu n;r~o~^CJ-.7] MA Kq\nw3˱BC`hօ/=pdkӨK B0}X^  +! >c=yH 9aK&44i7msA[ 4yJY mB>3 D&,=gD&+&qn0¦:ۺW 1]jp.}3LWol0ƙ٭F{_csDO1_/㚑_)%%zl^[N-@&+> y)3Lk<6L}5cX֋oH"J=f99n ԰-ʂGsPgz(p滾zɤbđI+=^gy`OF7y 37rRPhey&f!c-/^K5[ʎZث,8uZ@-ZŋX2:UNEBן]!fۍEjD̒[=ىN0y.,56d\|<#,iYcɷjcUvemBŋ83B*neVxh*Q=u /}AbD_d/(:/ʯjӄ{)""a¿IqZ2iHk [|+d{ay:Y3s:}[͋fdz@q9vG5|N% F8 MEN*@ep\ )UQAҩgX64Jsz@ˋiDF.9)Ə9ێJu} y)B, Qx@E2{?䠛1P2%o._Z6&H*~Kwa)/5{* -dp.h5P{9xk#:ďctNó%A:Pb'?ٱ >IeoNlyC8~"Af+(i ?w0DqөRԋ,BJ+z^~Rż:tE12_f>JEdzЂ?\{ ⿖#xJ;^6t)j ʧ=X/] m9)!&o<=(㷔Lcww=-K}gZ6Fo^yoϜ~@Ս!:Ly>BF3Kؓ`WY>ò [%yʣeG~$a ^WpI)ŃSjafrXv,i؄ v"A\b31kh:!& Í<];u#W]QNqRHȷ"E(Jn+QQDJ$ eaeeRB}vϰ99}߯uZ3_9 h`_?5"@r {LƯ^ƅ28Vo >S>҃лE޹HѥS<\1²7c7!I]/ rܑá{JYUq:D&yQwB> |XDU* wvÆKq7MmS\~MYqv BC-l1;dn<HO>1ÂMp{Y{+>">5Mk׊}<\|#Z.m $fBL5} t?vZw{{h{eqlv^gsN8mɩ/ 1)~]p|'k ;C90Lp8 ; ıijtnR^m#!c=mFν}'J?C{)})~wze.:"?yj9SGcPuLfdUr? wya[N2GC]no✭ Km9*k$M,_J ;w@oΥ>l:r&1TCpGp0_"PNکj Jd A'CcA}M юkZB7 5}j56z ~vg~$w7CsO!8-#N$W979yBc 56p5>0H hL`ba KKGK7Z O5)ިMo 8uk'+w(Ʌ´נI_ƅ~`ξlXq?ɗ2N?snz썈fX0>Ӹ|we i+] x\~R}c״SYHZշv ۵fD))M8T:VtպĐfc)[ Oف Wo02p%P)8)w1AC bD aWA 2R#ztQi'LZ|8a:`Dn,v2uǛG7tü0PF9X gɅi;b$DWG%zàk]ξl\ef=4uuknJ@[Kp ;d_`.˚ -'9egUzw*˖,ܻ7vh3`Gz oqL㌿ipkq ywUhܒCl}cVSrjl$#,TN*}MoeU6 ׳H~cWL⾾8*q$ 'cJm tXW09GB>϶PlwWr[ p3O_(_[M=y7Inm5gs;(At:s89!wOֺH6(8ksVLdtEca"'5 +I5}Sa)$N3yti1=GL8$K}!](^Ǭ>Cc$o_SCgf;fvssm/ే?Dz'3`ަiퟆ#\:0(yU |_RAwx@^mFBv>nĥ$:eY772>&Ra.-PqH3/&@ISB5trD9V~8&ldBO4}<}8VJ[q+GկX:+x1^Thl|-t3mת+q;at|!&\< -9 |\SA?0y"cOVBO1H}x6HaXnzDn4$Iof{C*eG ;E#- 7θD?bH.IɁZ uc'vcUcÌt+WVmxMMahxxWgD 癁?8#X׸@ 5eho _K~hΡO'vmb~s]kGpc,+G?}G`C1JL^qo o;M=J`я]ya9v@_d&>-uđ/_t-8ǰ*jRRp5R FLZ_.k GyM)bB#@3?P1rV#W$,ԿҴZ I6,h4gTCE/Sr+5$i$Cc8HvlQ9 p&/Kt;'#JqUyDq!^6wgM{])&|ߐ Q3HEkCĝe(Qt/K\T%Q]S1]2w!Y/@Yܘqzwp/ J K+E <\7OZ\=?\x#3Dvyh{0('sޑᙓ'layF*JnPwo@ {:;ۉA܍8zh@(")J44+޽=Cu"qaXtm4w}ꏹ_oa֜őɣgCžaGtxplN/^F뷞sL e50RwmwqŎ1G+_q~_ qleUV^5`lj f;]p7)@f[]M [vӇS{w5Xr~$6\uo^ a5>RzKn |UNyϭXV=1Ҹ#_K\`W>- c㟵q}s/d &]>wR;Oa :4֋7CCHK&gÜQ X=Wؼ>ש|NPOb ¢e4W 2EG|X='ާpbMٗ0[Fi _Xd$<]TMݍ} ϣuiI/3̔?\ccϩ0]9\|S_v@ێivH.o*kK|X2Dl|`5,tgJ "[`an,&u-}pu;8P&3tQ oYFޮi*R:ga5{⚽a/]I;r˞Z]Hvwv̓uV0Tiu,RV~}z.y*X:%űX?E%_蚾n#E?alGxy=3U?~KĜL^mH-.Srv94 W[g #?m"ߑ{i3aCпhq_6֏6 KNh0dٽ" ]m70" ޺Q~."^ռ} ߎ4JwvUq3i3)87<Ž.҇6!d~k P}k˸Zw8^ٺϦGL94 B8&OpS4<@ϩ-o]ڏ~BJt Ш!O7#Rēr~=(+QY-Νrwfv!֏DxR?t&dieBC}`q&[?(26yWtK%@wC0$b쿤E)1p\啿8_} 0 SH6q>G9f/Wq=QYot_<>GDdվ-f=qB|R{O/roߗU@npm0~uB`>~ugP 0aRPVS (S.W} fPR`E`( ńffژLmki'akR4j[a{({ |(CpPER:`"BC{ | }çX7c8y#*Hͧ`iZWovanՇ_Z8Y14Ar?eM ֡a&[a`A6>w8OYYJYyxϪ3(M`4޿DY \{ pTиaaz6j жj,C\wWwl=G1* @8Auj"j:^ ;i%svrm`nfr5}+89$ Zawԙvp_+=,!w8>ɂqgF%@-˸:(^h #"6y`чɾF,[n[!.;8م^/)06gʊ#7wJIa!/8L oέN\Q݃ LZW\fdҐ?2=DžE:FdL#Zً4r+X^1|#p34% @s)Yh'O}qՉ`5a V{zاk KgSv]QzC&@Alū^ѱ4]l>v %!IJ>_}%K["3Y88y"@cVx^ a ҘPbqC\.,/h?IvJG^Z\~s ×s?l޷Q%-c$!Wr7=!{"ZѮWaiQ;ios }o?<梚p^ 8ʸ_+qX9o}LYU fZ%L1q9@.*/mmp]%M[I`t{ èԯ{y {R]G,dJ;l{~NόcU! a/Cv>~$˄(!5LKq賾@C u>ߗqWa07Fvx4ϳIh4s'm1CPMA96fמc B Mg 7yKMC}ֆ$) x V@mPg'Cxu!^ N OA*@ufXɀWɗ:ltVX6~^ox^}ǏVn@dμpRzwNyXZoI$O0[Eem@r#6GMw5qߜY8CIfrZ&&r]tt~B2iŸ 'O=y}@wˡiӻ׳} xv&F2 Cb guz浸zXD-?eeoK;hn|ǎ}7.|>~gz$yv ͐H&L7{ya\;rU:X%/jҟf1&̃XY7%M"^8<gU>ntV?Թ҃W[/M!45IlZ)[rx 4<{yfB>٢"uUߖ: O([ $Y-",xנg Z ;p&rpG!h Q=VfIuD!tu /n=AS"%% CF S$Yw?k-/<_U./r%CUŭ' #෱L@e+>vRa ǒ"y\c} Kg<#r:0=T|8^#+< ;{pY&xy`s,F 81N3,%V\c0,ޜ{)<0ofnU]AaB DנLoQUEB(SMHp>?:'>ܟLQ)X]:B1Ipc3u3?k?kzB6P8lUf$J ICM[v!ho%1в=wb=҆u$mh zf-*GD΃>!Gb,_+pPt{L]&v7i~zG/dqQƒ8(lelP% ?]ϳg9L(?ۅg0aK]TZNFp4-G2_T5R=m' mdCQhe}Qq lOMu'hMCCqr?s\NPDd G=8yG6nV)l](1XFAqFuK8_$ |e:x6'٦E-]q#컱z'yWpGWXW֓Ù]kKTƃ#]dN֥;XU#YV>^#DʾݎNz]bUՇ4b/sǙ09qI s^:֎|ZET~Jq0~3'vľ>!w.-&V›@W<`QBM`Z{^ _ÁQ[wEcԀxX⚳>Kqi϶m `NEzo|)wG '^S¶@,']tȌvXSa!zֳ̧-à&J/Qሐ݋8c!ٻqraf#=8X zU9\Q9+^tİ2/IjhXzE' Ђ'f+jԼ6y3E|\ 1K#"Eh(%΁ʮ&0uqLF<Ŗڅ'ocKV2&Nߋw'`|ϲ1`NY!5ڙiϤ{[^rЧgdqz{4/lrQcz8϶o|q;;VSC:Gq Lq~ Io=H 32.nrjC7ɵ}p~2& ?ΤÊ8'ҏͥ⼎Fܭx$7d1-^4@(yD²~OO15VLE+m^B0\+k&' gC q@M>-߀*֡>P/HYNlq[PB;l71ƦߥcN.DZc,cwE y0,۽s4SRx7$Szgzeb ˇkj^ڽޣHvmт |>[q!An;cA޻otp9*:$qpIǧ8@w7=n*Wb?+9C}2UUs{؞ɑȬI/2۞{@E3}<=p:퀽86G_\;pگO,NVی+)YW)ę7-Fma/h0(ާڢ#;48< Áwm]X(j¿\)ǩnr~$G3 K?tY%*馿RĥU'PՀ. ew剷/X4RZvFUjpO5I[fsq@@a$^ax Z8"vor9^\H}H6ND ☳!SSЛ2Qs|a-J~?A_-$yƟA̜ "SZjKbCd"S~ޛZ79"M1Han9~nI:}.'ļ y]]UikWؑ"8~sU%3 }Ge'$ E#xl_V~:erP~WLHa 7)`m3dT q(bE;%ֽ`@dAU)غ>Ey?$ ڼ5Zv\'zXuUm=aZλt\K900;|R_KkK}06anZ_e06;f,nn?qj_,^ئϯZ6ӎC]n־)0̡Gv )ߦB$McCjFD,ewo,*~jqȈ[?*>6t M0.),U۹B2Bn;D@o.pq*LhCWi^ø$`7x `{Pe,U%OztǮ5 XTUv1xN=Y昊N*Xp&+E-E{|VLoI@_CPoC~gq3$`*?Ǿxw%g06 5e;akV2lJ"&|WL1"kO$ 2!WZ*1l[ H %zC˯0@˱1R^r`3lzg2Xc.Kڭ8 6I]" tXtT ^Q~֚@stB0p1xAv5)9g-kHR1Ɖۖ=kCJV-heuEWC)4WcCN O t} gモH%>; jĥ-Jiۙ5h62zERͼn"(Y'Gn?l?qϷB;`\Wd\>~M)>Us֗lG%H]yd^&dxZ仧?ץ#jДw ,.oe4Ǡ!q̕syl ? 2UaSHVPx׻mO CÀ6f>Jbhl\p]9 MkhP@l3Rohy'({M`_0xpGa?WJaMEJ߼5\yQ/F]).,mQK:uX``zqO4LlATVHfvء+̴1^)XOi2cCe)r͂T0c9=q'';+Qo›!e#tPnTÕҺ{.|&Vr3r>ZՒ0K;ׇ#wqœ_M3x[9JibJ!cwELǰ"^G?>Jԯ)L[?P} U5AnkAΙTB?4+%ѕ琨P_{ 8wI/`.Iz9 TQV׃c5kͲ[OB3Er|r'~@L|zo+aVmu )zO6Lj`_b{Py2aKڴ݉7ثy +̓pxG5 `UWq@txI7e5 tH\opc]8SV $ұSoF sK;.HT9ͱ"! xϸo"wUG 5bHߑSߠ0u«Lھ=@?] T?jty G>NmqE?0, _M s۪:;wzAKP͎'m0~G.kWXf-wl/FB04r1{Jq4 cK LyC e jvoMl*;rhi% ,D*aǓ53 &é@b?eՏY}g,mI㧴i#Z^3 >>uzhJ3]YFl[2E]5Q3Oy %;* Y"$O3,z m-0z4 i+Q.6v!ZQ&f> ;^ |~= ɮ[I+R~R|`h>!y݂fa;sc9?R5#ϝĆKw=]tiLmr4.,bo挎w~W_?_a[mĜ,L8+Uq6T/عX)8U*eJnrf3PX²:Nm!m Iɟ龜Ť9/,QMAia,08~)O ,(vj>*g7 ~@;#8TV:ώY}\%٢X$?Ӳc؊sE(ˍn)| -\{jU@}g\-zeapǯ;vJ)¶w iFc J8x.&pl h똇O~c-RR4΅=Syz [ Q_¸1~D<]t\V'ұYtD.ح]5wC_kI7t#>jDcӯaq|i[SCj0LQtĿ͑vxD&rV`{t 6X;s0L8mIwEb W8HwջP˽߯OXM{/&TaO` )nEIX[lo|@EXwQ3#cYz:_cf$Ef>"q"F^c5I28scXTlqb" llq/zU~hPj E5UrNYUnxXn"o j8N" Yx!`ݶ|h;2ԏwio`In]xfr ˦;`jv@BƏ'fmk۠KtARcr>0n=̵#e=¬o\a笮sе˻s0)>ssj\7obt_9b6.c$eM50Q+H=>OZ7 :kث3ca?s/kL3|Qnc2з~7/bo[bzsS8_rũV="t+FW˳:jlBT^of= cJ@+w*Jga`ѯ\i{:^ZA=lF ] 5Æ~/]t: _hH+_-B%0$?!ȋ/VP`| Yl=XVl)k(>,?R-P0.t2['ɽ i*W;muanOV'2ǖ4X'61\U+fe F}Q>pgvy>Q. I.uV=2sq/8炃~uX+w\;?*@_ĉ5n˜FMv!G X]TQ&-\ t>ͻ<޶03IeL.6l{s;8%;lxkvKl97Cg^I&tq[&iڭ!:ϗ8"R8jcuΪҝ'KF+P7 :W ¼5W=}Ǘ3~X^6=bDmV$4'K:am!ױۢ,NسB7;~0׼JWzL4H7OUpE?0o'U[v7mm{T'Xs c"{?t)06wGÛ=O&ذTϱ9  j[>7O5*Yju՟aR悉40mD , sqiojMs|nPwQ\:ĂQ:%!xPa,"W,DZb'<ΓN;Wn =܏6L)RLҭ4+*H]I: #kwdᄓf2gN*^X yR.l?cLnysfEt\AޏZ+P#D?Sؿ-q搟q t'휙!x=@V$oQ{d{upXbY^|畂RfHQ|x _U/!I %D.+܉0ʳ ]Ay`c\ ۟^=]vc@Oҟ7\?s曭_qXY# wnhUy7("@rxR|.^9s5^F4Ҭ~@BlݯYqLD ٪O*0mD|Ok [g |1$$2]> c' tIM͜qt<"*s+]Q؈I[ ¶b% KX!bWOA9MF}rk&=v*)熰f7 eV$hðy:l<ИT.:Kye ޼1"ٕf9Ck9--0?%N V(Yy,ș:=GN찂Σm5祰YOۃvY^}l$n35!78q3XT\3şΎD!"KZKmkixE1K|AGGaJ ]\I )<Efw~Dr5ݵM3#0Ju-u~Iũ.!343Y]?r/Lݒ8]iF]޹0b6*oV f.O!$Pglubf=:Ui"P%Z^ ?g'm_x9"*Wh:N4+6?;[GÏLl=FCr0n}sƂ̮c0p^T *w!WcD_0T {ʽUh!3zrukyf]q3œa( AZfd4GıM4%n=uMz"{.%e=qq0NcI]^}]l{I؇C1 rǑpg;XvnzG"ܽG`ɛ|3.w1Om0{ q>zxN=⎇3N=T_=dH$Yp/µ2[%e‡')/`m?R_2Ä 1i;m xS=k3YՊ5@R@ε}v(GSzk~$KLɻSF.#*ҘrW{eȓǹR);Q0gku?\fw{X?mм;r)Wx}Z=0r2/;wadgGS 7"iU2Ř}vn0}T8fZ6TXKر)E 3nyw( ^ >P MOZHZ=ہvSݱ&_7y-Ak,<:e/a7f>D5ZR`ѐ}L ͒naO,W+,=5T"bt?KHzvasB~G۴4b]lAoX;q 5^MgAgGXBT]9Wփ0#Նj!m˩[LxEЧ[C`BqD^U~bڪ r_o;_:|9N]}nql~2)HT2zn^,[&G\5 0d*ʷ|;fAn? L x&֯-q@w)g pvBt3^׍E .{a5/ə\|Ip(x$HY'*8=>N=E(aTsl-H 锚oj8b?f~峐*ΘJR#ǟ^ 8=7>uE~,+VK n8c1WmΎJ0+MXj}{8Ar|u,2`feer; fDX_ lMwFeJDbN؟=yBCȕWdnYC=^20$7^r5&2` x'-;-c@"qUDQc6U۔`klX/Oʁ}@b=Ll;3+1C8-%6n^fa[[> meø4qh StbwrmS#0ssum^s " F$:ی^5pK(* BZ!5n'fP?$ y;-v.LRcӟ:Q*?;~؜'z՚n}XPY; U]LPxѓsW.g+:kf~$*٫@+O cn0{1Oǎ/8g+}Ǖĩ TП`;u_&Z' +Z o?e] VH>3#ЪWf}T@׺s-ԕmD`±ŮN7i)5lw k|-p@lgYn:}vߕJ"aTAl~2{oKljAE6AB6fc/~!Û+lu@Nv<=t u&.@/ayhj[-c4Cw06K< ψ2 j>v7~|[ȳ}g3\uB?a`&?o0Yk-KLWv4YZ29s,Gj=5 :˞\?( ">QI9ߚ9,^.N<;t4Z ޽-`|Ձ(57 r8vF^\e/sWZOGRvMεL'XcUڬvhIвV|/I|ul(s̰j{Ÿ1"yQg[w8nl5txD{bp~햌m?o)ipsCD4hXj ?SX>,y *xv y:` $7״X\&g`9f p" CTsn Xsa# IZÚ6Y} tL%]a@ =e}Ɔ9jpY&yI#_?`-^\ z#]Ƨk$p)jƌ ڳj-׻03ZvAl$w|ZJyk>7J\ ˲i&߽+8x+mƍt|кflLcKTMg)saj1*Нxyǹ_zV_ȰC-7 TUԒ:#M lL@0VB'<*G`S7ܚK,ȑ+(on_s;n(./ށ\b?zsʼ^&}MG79Wi6qn%Hz`Sy mVbͯzW=.qGH QOdsB6{¢ΛhI};z~"gS/>$zDU t[4o:!L~,Zp8~=J~ƊBfP״N?J Ta{W`,-s. .M̆#~Y[eh VS6&LNqC3HU9,~) ӏ}&i6{teƌ.㘄+FQ+~l4N?ϛZѿG>Ah~`\^3 .xӵP3G\>5YykYɝ0 }O`Vmd#nXɽ“ciYÿx@#=qH#!G$Z^pǦ?F`vk?Dxh%m/^2 ,ߨ3X七e|'Vck{Qf?+)f^Ȗ|,q|j,+9:x Mm6$/A͋gY6ur?ufvg,k»RXNz2^[=ז@Y%Y,`up,zsF[Sz X:YC僾V>wI]U=\>jAoq_> hl(pM).j0uo&& f ^cG~W`uHN14+SI̓*Kձ: fޕ;T[x-i^x!TX-R| fZ/Gr8}yoF3$јɡf0\I;bT}E0hp= S%flZc訜q5ȇ!Cysnv:ù_9zҰQxޱsX=n*g0:&Sai_*N|kቄF B딵sls~Vb 3˟gUa؎خcC0]+m`E4s-s `&ݸ4"S5мɳXntp$(|ط]&w/z]%!obg|p&..Qp xfc\;x#VN<$7fۜj @pi<̳Czp(Qec9nվd H,NEKH Jx8ϭp;0wQC*olk4I`$9>)N~$+WGKh;|WaK讜1yG()a;Bʠw0Z#E^pWpEOUgi$[eC&s\&h~7$`5~ȱ\g|׹R g;vyi<fO˯u O~>Vv!:ųI^n{̽e&bGXY׺pA ˅)_o69T.N R-ZV܃ ^DLM% [o@5aNG\v, .S&]Ǵ{ Yu{Wfs0ѽ f?z=~2uI3>ƒ2=Ig>h詊O> h(0޼߮*xrxǦ?3*"U1;n,Ei88}Xl]Τ vd|1 ydk!^d(Kp']ateyVanor= i޻Wcwtelu 1~-0@x(LA2%9-"NBLқ 0a$K셩 4{0Ba{fؗryIw:.b)хG0}yNί4ݝl~6 Pd 5j{ ]\\aOaP;8 OAc_ g`ƨCLΡxXMsLK?Rm=M"H'8@[Ѯ!|(RAUgI%\@4b H,WsGAr7~;ύ-_ w"}aX^* uJZT>˔!Qj`msy4ɰg}'|]-q#g#@8q5+ gTr3W:I0TOOc`=h[q~d$N{A*>7)H=&wZq@J^`EIћ@=2woѭa0X0B=ees5`,J pd_ K6CfSw::9|s%Vf@)x)o`KJruw6[ȭ/ ^چJ @yPx (We{ݠⷑpؘ(2zw{Ѝ$xε  ?ɅFq>8y@L%%~8Y%9ˇM-l?١_C{bxg-=VYkꇂ6|ܥN~ѯAq!<ͲYO5C9\pa}XG:4ϥ.<ܜ sd$>} }#gAz$9ȱC.jVDUezܷyTf03I geYa<-p0@!R=#uJ*v'ǿ37!w+GNc=C84jC\*;?# В˸lɆޙ_qJY*,eZyRWAz-7w*:AU!\DI@)86`QRI.eg}Z9+iISOוM/`X,#]԰G;OٝHUZ% ,L-͠'݇# اtXdP˾퇉b_gBv-NaU^bW. ʷBkXb_b}5}d‘Ni (aP }E>mM1!:iPGc\hsyɷ8ŏH>"ڊ9;_%t.=YY #Q,t|3Wdme:kCj-n7lR5,Xjڸ63aM{e#<1X*e?&_=*~+t~o;u!9PzjgbGj+ ft1e Ҝo9[pi#HTwi}1o0qf_ҳ%؇լ0b"9 ;@Eyq\[U%/O"8[+="u%Vd<}ɔ޽#KLp_o' .}tx^\86dr,͞['cxV{ݭ0tv +mz8ܸpI5Wr} jNBBޝ3lXw}Ǯ7@~ S ˑڕr, ,&z|z^=󰃞w]3H,쨏gZaMCs]h ˯Ni3c}.>X{ Mξz"Bnhl~ۋe)U׬kq$D8JFmq2;j l{.8mrOwh{^9īz<8siq(?K&\;,H}6EHS_}֞0< ^'%N y滻&o$ukk}m'F#Ʈǒą_RG2LE3=%OA7n6*4biq'C5NPԟݍd. LW]o&M8Ѱ<# YVSK![ep%`/$֠߸),cyp"2VYb 2:qAcԌT/no36Mgm :)|8*Z WpL6^+<5}51%\VQGz 2l~V Tɋ"%ˆ#mlp9=_p#IC=yaj` .I֌!Eԣ[~3 ӈmb݀!/Aͷ t#J^"3J!.lup&KwUFc ȼͩwh#M^2,hE}1 ^Gwߑ\gBm\y:`lޭ~Xb.o,\wdT {{ogUjbrҭ8.*c4I \%ZK'@lIV dΧ=Kϗ(įFD/_/:aR/$^n%ER>ޥ@IoΑ27 `ߖ֤-;.Ngna(M*_`Ly{&Nm{;Maj&7=4:07Lfrb.菺ҧj7p". F aW_(XyQu"jʛ?UN/ H( Eʉa3a.yv&pQ`H2=k/ϸT3꼭9@qt'XTuJ(6,kn;"3ωbXzA̛/bhqV 1:h qIu غp348'յ~#< o?4Bq4誹Ø[AVͼ+pF2\VA6IknU`ܕ=!V[vm!7ü6s #̏ DRxLy\Nq;߇xgk0waiRg[t.H^Ue-\%aH}>tN,^Q;q:-y{ٗqPD.a#pF'r"2-^{ A{%]}.JS`dپ4ROz3jh~f{=b3`x^w06Cy:V7cF+-`ߨR5RJqA]]"~겤 ,={YNe.PAA`%yp?~<3$Qo16NGݐ%Jn8a!t2)bf8@_>!']f޵w)9 UHlX9 o4< D갎84tk2ؠv]P(j\B7Abso\TSjot'S,V|TreS/RWOD(w|X,KmIJS77:]D'Aދ#s!轒-Gg`߭|s i"-Rqn꽺2^ũ)AHq(#%y_iYB'TE-o;NAڂ۹0<:rۂxotC⾣۰gl| K3Kìol^=0)2{1'gqTMP߀^i@y)f(>ɍôU`傘Mf0י?V_4̯8js_TWH= UAMCyeJSkxaZPmF~N&9<9#uk=7`ĉ,ZĆE*bV}nXdB ~خ:%;fzzl\QW>ҒwCe8cAUt/py M+vY퇅. 8t.؛(ޕ ëۿruI$%xFٯtYaf`8p-*.&ت .CՃ`푽@:jq7o*a0?tR"/)hI<<z4XXC@泭U~'#\Ё!Hrpv~>r1|^ϐ).[^a/f0Dx%) }IXG!RWMx+'L?Unϵ). soIJj.O/Lxtw1Љc-$D }5wūZ80s@-6UӀ#|H|[2= S+|`EJ$Q嬃'"3BۛZpAa[z?.OZOā2u{E3=mBwi?;q07MЩk"sMl!6cZa?=@k8/c۞ڜp0T~ΤLdm˯ĹtQVu.ٚ {E6yN&z/ac;N2%?E k㐕tf?fnt<_Ouڅ96&oihidi{ +5CJ @1:g2Ev'E>hZɸ7 Fj}n+UO#aTx٘a3X\q{  6HׇW{t@ m._ڱ!, nıO?R&5F͇y>sۀ*pg&=av{~Gma^ݸF/x#$exOAgz0zSiJa~YIWPlT"Gz\a-۸a̋kF lQbG/_ۓxfa@#{_Sʩ߀]u{SџΕ>/O}S] /YA8@3a _}njOzNHRЗ4@ te|a+ Zplq7y-$ ˯a܇qHD9’FcTdAրM.,0K5ș 'uvx o"mfO7mHДRt9,yBܩw9rql^Tʣ݁b%"@;Ĭ?̃W ـ^>z&+lc_Y׫j!Y2a Gl/c*タ/pO]칺53ۍq[=FˎE%;$[x"?s:`(@V׽d&OQXed7ޯɊ#!ugpTazC ~ȍرw+ ɱWa'ݐ#KノѵDa&cOf2p5}V`lx0<%tWZf\ڕ=" ɹvfOM@|qtU|-W3`33d8 <`R)0&_ϛs@#I>qqGx|Elrhϯ~{91ؗZ8;0~]"|WrL;Ks2`6"V4$mNtw pc3ڊř$ANzh:D|8tc.Tg,2ag̲h)6=RNǖ׏@qkw0zWa;=M`~Tbt̀rCr&34yg89gJ=X:@C"v0+n> K⧞U9@޽%?Հ|3po}?`q}q\tZ`SMA]4v)0~? o]žGF ǓpH9WjpTbPn. w۞6ƇN*3 Hwb׋7"GKqx)ڻ}N]=r`CKDoZjrG?deafIXB{DzE/;BO- V2wj5ǿ~g%ptP@Ihάp0ukw)잽Qԥ S_gNܹ^b_\&c ӑf,[0O­4Wn~)_[5`+o] EU-CH̦0Y$L1Q&%eiy+q|ɱ"N{b`ŐR(:x*73hhY*!ױJР/J*#eER %gױ؛{^uhGݝ홦|{g=L`%`, }|\&л쨶_. 裫j0:-`⡄m~$I2qǮ=N{ `Ŭb6p@~79)LO‘n`2%-*Ό'zhmݮ0\}F2,*N4n^߅ќ2d'i< Eo`)Y~;dfoɫQH' aHvOBy?|659iQ  [>=zF+kaE-i阜}o_]lZJl]ũ4;0'-2s&$1+JW'8_ ^xvAEUa.?|#y <'`84V:+fSaFj-D?ЄEq(;T1QRRcǽ;sTA/Hsg]b1C0c\J{3NzaNA?zۃB{@tJsY>-/,ĥ`1EFЈno0z8zP2TvHxAyqF5q\_@W.)|q9ՇH]'GUGaw L\|m n嵘N\:`Zo$܉J.,-Gwlő4WzeD>cu- /q@*mHJlSR0nryF3D{SCcK"F(`Y[KkuZCKpw%oy^Wt~Q)yfLY{ 5%(0-Ε«9K\*98ve9|Xi[L_!2䷘þUk+d(^wN wQ@8t-V9RϷb1fGt)\}V7fV97 Z9G?$8\26lUVG9܄OJFѮ,x57zu tzJo¾| _"eV5=M3)(:ʕTn3Q-O)E~^hSzq^w-qV_&5DۧcgGF1\SlGH;T/X-i['$;"o@=`xIq5NC B \[>r#\͞|p*Zװ2 ('|3/=JqؿVHUq^U2v_|@4ʣ|g9nLu9KOv-:@ &F߄W2pBw7u8u\"{5,jRFNV9 $Ge2cH:%'p:YiE'JU_dF!z7od<I;:_=HG+㗳fU*8KI\{N_awg~T%0ƅ^εC_{7Ɛŕ=x?9.6mwӉ^WqDO'CXHC ܛk\VHq yGǐ{Y1=& xp_H 'm0=wZa۷Z9,n ]p 2RTQ }n$;T)|֭ rdwou6]YπDKs8/pG.4W &]ryKt^@҄mР0c&OT @;bqp#/cPsՆL"!✷5^K;K~} ׈ߋebB< L!i|}Qa$nkZ18dRțbߐ(Gy0uBrT7)+I\뱏QF 퀾?&uq+}o>/~3v34[&rC68m$s,c40C~nǿ-0ՠ&&>sW&8QXq_ m+v`45ϱ_و*p%MY#=ҘR:~Ev+wM܄gm3X"\s7MO bcdƯ8k%%yM:ҋiIkKh!ذq r?Q3т8B#0P_?~i~v)l3r|VjP/7}ܡ9{i'ڀBR 2INBmhp̡m +k ?T~E@tuov~3|'F͵!}~)y~; vw?'эf/O`'j"eWLۡr]!qMFsO:64'*B"s@oP|g9:ÖUZaAb-K>7>'rg9nWqx<톒x9O)mZg[zw>: ;lkXx{_e2EASmx^hjW?6alI}CX U!caBtʯ~U~OtxikW⦚;GT6{`܍rm"mJT03f1~î*xsX A6*揾5WkĬ]1.g0z[FyLiGhpLlcp]pRb+GvETS`sirT*_ lO?%ӹӍӫ4wIJ{o1 `̹cňt.YSuuƢwֱ"5и`၉6D*akɈ^jEYSp*0{)!ҝ9}?)|a;]kک԰yNHd}ZŁ,Wa5@}y2lZ]$oߨCXdGncXX^j΀YS[9?X& C/>R>^CveӌH0$QW+iU&ݘ|39>Փ &8ٵ&u.r>>ٮByQ^"Τi׋9A_Uā,Ovk((_ȝ(~RP1şۏ3ndX9f>x4\}{nÊWqd؟83cҢ M rtV~j¥?o yt*M)CDh<'qT)Wdt0?n +r1t iڣgBk ]9Ał*Z1c.-؉Xlb\ty{\R_3g߈QM_R/޹X/Nn>.?7q"f)bƎzփno5C_̠QC!+H-*9g:u#)Fv%"EFl:d{0".V EQXs5=)U#LrMt} ,Q]Rƣ|wl ?+C3yVF >J;eD,%욇 ƄRqfƼ |Dmݳ\/7$AFg0P2W{N-lӺR؇꾸J-c0hG=XGӇa@Å6S>Xڰ"2_qLCK[,pG &&^4^>Sp0* #Z˅U~m(.]JSk0bփzBß>P SG\&j1ڃ?AS*#cW~m+Bu OpȮbhV ,1#uH&n;: \*a6/@mCie.RЂ+&&RNоI5h֕,k7>I[p%FI*e$}"Mw)˒Usa |O>s-gM6oZ]1o? HYYobz?Xx8Gj%n؉E`H֔OJE #$:x^9Ry[9*MM?1k$o3а zTaVKfąO߉O9)#ZiȋiDJEZR$"}ΏI7Rb{˴82%C5d3q7ӗ9vN̮Ҭ%׽wN/%p\7^CӾ[JY.Eݨ52ufh٫ʱڗ]|zØG챣"Ԓ:kqs?^AAmdi sXpGC:Ʈav_v;]TUw/|̟{GL`P-b] ?:pL*:}ZG(0_6E}mKtko~+Wg?ؗB9Zۙ:TmNRѮ _D&0epRɰ7lp&'۫`˳c>0t)/`ԇ{Pښ/aOPNuyXZz,`ڈYb7mHJ놪\9WhU%>7M.ᇥTg% hV{KpZdx!whqW•T(=ilnLRR{1?'`hѷ!r~{)ۥ6㘜C)S0~)kY_I:`;Z?`Pטn' 3f鰣]Q"z=?wXt<&$wL?_tc백 IXˎQ;yna]aa;mj(NE{BCo5T:*ly75#e!_<_Qw<ͬ9K/@%Wn 8q$O=c'Y{W`"e3>7q[Qʫ~wRi=d1O^C[t؛_Sf: 3ڶ/~6 q~iw^|Ǿ'%Dɺ]l 8E-y"6YIUdg_]'?SǾW?uC>XSsAk0T`}UeC~h;M?5-l]]Ӌ8ßa#m{F6%T_Mhro*EaƩId,ѡ>丕{76jίWvI=+1Wd˯UrqҐ9!Y3z&qgJ1wp<D1 vZٹ!HtyfYmՓBcm.Xz&ƥWx:&<&ؾ/\\vRrU,s1_Ϟ5%x'Rsv D:0,yw,ffQwBJȣuI-<#kqZY; /"rjFA <f"ںܸS'Y8|k_HVB=fRB䄁Z͌@3p &u{e;}VljIw@Z}9V}k+:y@D_W:ȤZ 8%_y/B*!xWk,H}_;j!%6QG&wAGB~`h{Kj`2;P'_$*f,`D,FU U-C=\Ƹ|֫ss7Vb2,O\jľB*X3w"T݇n«IxlvVߚ"Q,}\f|;{}݈ݚwtcQώ Xgl+Ɛp}nfQZwVԺ$/N[]u}'BgI39.Sh#_<΅`Y}sS= Ɍ|r. Jïn/Z$=pfcU/^A}wmfll*crceϟ!y%Y6WdPZ0)\7s Z,s ]#I-֝Y'K\"mV+iX.@ہԝYbL[r 7Pӹ=#ߔL6o-9x\4S>P`rJ*,_+)_HλKb(ҟO8z j<ĉjbt<璿Et[cIXz z'qaIwF.̲̂Y!0%Wa V6qþΣ0t7ؤ7GUX;gDƋͦ﷡g%0!wO\<#`|),v\}, } E?4짳Lc٧xqVRe#qQ'yJW;K {h`[G UeDZ$&3R@ހ~n 9Ra}"susRt@y/>O'PŖs??8ܽ{S9nh_%hUc]֨50=:]gĶ7T7Cfđd=*|yontQyO A[W&UYp6GuЪ}w'XEr 0l2Rq&otl<{I--ťcӗ{q!w~Ϋ{{,Mw`i^9.l+.PΞfϔh|IQT#a-]D Z8>;Ѻ#4wult!w ft܄~];haVD<*/tY2T>ROK.S rWmIomy;ie _ѴJEX-Kͼb] vݚ5WVʦ&U9nh_/]LTq[~}tVx==Ckt-0%ҷ;Atc8Qp?;2n%7g'c=OF?=R~7.i%An wr:+n:C{'ip½,47imhn6cdS8OW [5r qm3ݷ gV2G}gtjnt&&]RŢ#{Cӏ'ڣ|İ}׷$1Hv1 7mhBm<73!U~k$[ zOlc˷*w;o.|Rsw_}QXwG0t a w'& [*M8v.9zw .̈N{D9ኟf0hoC}^~;W!@*_ ?)nH]s.>{]^Pp\)-7\~TgF6;Mm 1Be*Jk!o$6|н$H~V8iIoKt[ү+L!.c[Ov;@fR=kt55 {p(!7l> 5sJdLn0 fRhuYBdp1 X';OXF/\>7;SC&@>;WF之&ᒁ׾/QZ#ޝ +5!zn lRn[O8\)شsGjg6`h)Ͷ*z#{q6ZphXL_n:@uf~Y ݟ: e1Yty\iJ9LLþ c7O50m CcAqyًgӪ7zL`2uO0߃v.tz~+!a+F$.0nx~%,E_~c*n%b.P9_GV(Q#V߇u!b7Wl(N<%"pN~1u&y v(~H[Y@Hr2P{*?P13i,N,jr3JرnW .hV‡aƝSeS.=f'9}"]>(WۖfhZ,/Ʉ>P3a Tz࿙4/()0U/vu+7ުŵ,B18Tos H)$}g,;  Ah^{XiSI8aVP >kt0 g^6HKށmWQY,Yy9e3>9^^0E! 3{3MluĆ͆N4] <{|W~~O o1j:[F0޸?sP>MՅEjWBdz>I ?}Eb8K+t( x(mw?~$;+[SGʯyƺ_wɖaMH?X.2%5?pX5xƯl\e+om9%s/wTRX)nх +țw3f'۱Z~%mzcI@b֮w8ʻTBtȳJ <:W0:X:=)?w0Mlן˫ ZR}Ҍ C'K7} &kP4UsLUu G W2ღ5.!alZ\'9ViMO M|e)Ȃ:AmjgrH}{äd?B5HjŇ+1"r[sbX(N\ck_ЗrКe)0w&,_PZ`M},0B6NǸΏ*`FF&|8p Nkcƅ]Rϡ}F\ȉVϯc˗c{]PR_+$[@q#h[`==r&;[FR5hH "56ס6^98{}Phğn&G0Gաrє+]EfO̗nCͮ5.Fq4pJ CJ2pEQZ&Z9C0{weV+ApzrN i++i) =tSТV:zG0N o{Łn2S0, <=HݱPqp੟^ԧpwel6#qʅ\>A_%B+^afև3Xlt{> ʌZi_9wqR}Hif@oq@ cű22hقAXiT"Ҍq= ƱYq"q^̣G:]RC8Dz.cI \li)c8쿐:uBiooy3`U M=*$zg|?RAӝD+&|t#8„`"u0 |(9_7?tԮf+X-t=-&_0͵m,\iu? IZi] ƒ\7ug+P] еN$=j$ @WU$]ϼtEi:<3.ոJ^,z:ՖqF n3¢×H8lt:>9{@ *՚`h)ё'B5x;_ja~enVC(kvRܰi^$Vd{.,U)Cur=[nyp%/X-ѴUnάCt`M"7GH6ҽF?UH`{OZ}g`T0u?·8_q*?rK@Ť3 HLm=}& wI?]da_N9q2uw|qȠSd_m`?Lʾ9mVvb:+MX'2FYg^AmF}-T|T>qnt f5:p#w\m!f-.`*N8#UY]slPF y3M`Ր!dzs*_K$ @`f rW#y='Dz.w{qI])8ba,0ȷ?U=u׌?8A^>3e9#Ε,C*nPjRkO2>,I_e-E&q7 BCi|%ǕSv?uJQ@-q\~)'ebW3Z3y5w#Fkpӂ}' 5Dp35JSr$?Wv-NȲE}: nJRL 5,BdrqT l;%]&wT&-\..h ?߶x15QAyѝHSt4 i*>%cWwJO̺AtOVKTO&m vy_mә)XpIbYriǾΞe襖cvEC^Uȴи~˟w dӃYvt=0n&tV2{{]SK3Ƽ`0^'I<nVƒ qW7p0ʒ龌 @ &.\t`V؞PjtUsl|O^ĩr&_q+B,QEe`j=D4>H'%ԁr0 '~MmRD-g34Pn$|v M=ghW6;&7jf]ۡI}I/w{5UD./)/ZSE~ ߠgH`,t)kD>B.e0FV6:0°yN,>mAoľ#qAKyk>O>l= /4MZ {G 6moT>y?7Vd:Ni# FnTA?? 9ҲB7ѩBl읻jvW*h)9ɻ:^BvAWVxyYMs4"a!Ǎz@yuTEHnԼ1\t['iX}/9 A2@G( P 4/9p@;,-a>jϊMKښw-lgQA8ee e`NEUҠ gS5DJhZ$.wKhV?_ =H(wE;=il½X̆&7ys{K7:M[cIuGCԷTGxeXXwXǥQ?q!<ͯPb IY[^RIp~~/v: Q`ml F^OT8cOV&]Ɛw"xc"V'%&n/%is4XoSI׮j{r8l6RrLbsCtZOPDHa{i۪X:y2ȷpnt`?.24KYpNgb;Z|(sW-:Ε ._{X{M0L,{1{z9`y|ݑ>HٵT~NX5߻.Pbg˛j >_o! S9_*GHfv0Gm˄e_vS0D9q(;0yجH቎8_xb-]'w`wS/QtLRF9{W3xqO1 ~ 殅3LvʔΓS fh7@O1u켿}cI5x51oLXS?PK~g៦w ۉy>YPl%X2 kל~Ĺ] APYSiF~Zo\NէijmNw{s Or;9sVɤPN:i fFi#@k[Hq/Y܄g6,I$; >Zo{]xI,#͏F"0~ m%bCG0LW-sۦ՜^ UQ=Z&se>h N|rA7@J|6s5DJ/vc,/Kz=%sس4 򝲊aW6+t_~fs.OV>ȞB'wbq!/;LFM_pc-ηs%a,OlX `gP[b'gq؛mS_<H ayWtݐۏ CpXEI 瑲ja!}")| ^ ­C|1qpki%FXP̽*GSoނUNgqMgʫHr?,?V Dּ. K*s +#kk >Z"#K%Zobӟ[(SwljJl>NF,8vQY_N̍watxc TE(&~;UW A+e>;f?6wn9DݿkOAHꋧ"K]Em6 B7$?wzeanS x.6WoI3c7a`T+:o3Ovv7;iNː<bb_5;+HJ_Llm^T5%̄V ͦRczwN"Ln鵻-˜vNܖ΀s1e*Qqnh7ǜX̔n=gdk m.:p\jtt+"Gzr֡Y'>X)/rh2S+Q&[i%0y WeéK^8~O ީF•^gp]fzNUsUS0Ʊ{⪰@ů}@ڙMa~N֋ؕoue#,@ӥqqXOcW˗nV;=Ú_O>_wGS\efK_ˠ $uvO:YjS ;p9㠍 Rk8V%BμW z^O 4*Z~ `~%g`3?%`g_x$P|| wB$}Ur¢6LqE厂1/AmGl@+5'c^)ep'a~o P#kzm`h*HbҴqt =TR A!>@Uo-٩ '^~VH{Bd ??oؐf##VL]$)IzGކÂ.fP eS&-zbkn.[FrC/l^a9Z4|:}7{ymZm7(OkqDsᆅ+O ~6ECXݯ?Jd\ptV")Hf/:#k_].4bU_aE/)=s;?ҝƍYkL(v]J/U2 {۟|a+QB$}ʭʝ6Ɇ[kUA(S' )sM@ؔD5TomRNg`lA:__W.jS4jmW:R#@R5XE7L2@Ӄ8xܰ+eM]2qa @۶o9p3p3~ߋ3Dh wo}VhIl SV]4kmKNZX!oR\- "a%-[{; Dn{fiyÆYl $bL~]"yZpZ)E7^񜌉/0RY+ʎtr\ZQG?&}zϟ@ǧTO8m,tSݛ6i>2 Y7 [{nbmRg_\R&N-'1B[=200?;걷!q3)o}H7'N<eL*=9Aa(Ͷo+)Ls'K(t@zگ>AQyfCǿ4;oS0os t^K ҊQuZ(>^>Eu)IPifSa<ױW>sop(R[P\by<px]]m~3,ZdqDhh \-@idXyxLS\,C oqL.;D .b;W!-;ɳ;WJ0y+?}f{ ʁx,sW_@yoXuײٶtf ρRp<ڟ$@zZ:.[MW4m4PQvMH'zz@vZ׽\j4 ;wJS}&t)l59qz8$vMQh{mo2LD_^R WfrG`&9F$SϴD=(:JB+yG[m2n<7;pqA!B663gHj i[ _V;fv->:6/{ /8`tPo$c RXߵu^P:*ۖI Q! n~/ M8=5kYA-[k9,97Zi&O8pRo%r^W.a]m/ ˈ?&ꊷg)<Į&d$t}պ2Bb{<$);OYyYRҿdTmNY K܂=!9D#ksc2kL~C*iv ة#Ik RۡsE]xPfdͤh[𶎦k !Z2؈qrzÊEX̅OнS%W.Ɩj90[up ; $ U@An@S,=5HlŮ#v 0ʴc ,zE"mc8pWesq .!O19a[X2<\]W+G{X>dbzRpikv?{K{i\zebc׃{DwཱིA2f.Y@s $,NW\pq8*m'  ;&`-=8T7Qk@NI\> =gyM<݂x,T8ߩi4eZtyoyhbbw:1)<| Lf*aD".GkY"<\ZKmy>U(=AI_,_(aidBhH;kXO!6VWyѭta(8h]ξBidYsseqUl]x]r$|'Q- X2  ߶HQ7b~Ζ%?bjM 0²]U\ p^Y\+-:Dw;6]9 2ze(B/ F%To$nQ$'gv yݷ+P Yw [}^DXRU0ޭ,b@nLɃHJ_aSrn"i`ڍVE$[6fa)Tzp'NPe)8W#vjC> ̈Mb`dA?pk]0 Hp%n wXrlk0c|G r0IKQy܆,,e8R'70K&,o KewXTpnx[0FUދ89ʴxk4'5F&tWa'?X't=|3`mR(krkxd؆$k}_W1Xa5x5gNӔQogEu,2O`ˈCh|#F[ ,6,?z l~Suu ` 6!MMA/:ؿ/u1+g8]GFʭ9?dEtKUp2CWGƒgBav>MeGm{K8mb4 Y$dT@Q3/6vp?hy΋ؖ/ f'e$ 7w{?{0[yԭ-e?z=.QCAѲ.u\(߅ B8YFhdWY~І۲ $-hh̓n#)U\&!}zpV.m=uk`p2ZT^g\g=TC0a}k0H'uv)wE tjSZs:|\۷b@"~ނ'uP] U+c;0̑lrucK(1i;`vX1FUɋ4C@N0=H8 "-o{vBeCڃ8ϹKt ڇ|vfBtXpYZ4D7ޞ gecIw67Y>Ҕ$[.L 8~Ma7D UxA{Rc.tXq^7L]z$ љ@hQKONU)s, }[̸-b|hfRK2b.{bś.l\uu9a?r\C44в/YiM" PvTR \(5&-t//z L߇V'K3Hvy nLy@~Gٕ8Ԧ) ?Yzm$szo"o^͠ Y⢎EPSF܄l_1sL9aFQele~ d.Xu/%  i)CEn-qnvM"uL p.DsŽ]!}n˦0|측aaQ6p1*@3Ү;}7S߁LY#%fw?ËںpѶmJ9)Ô a6';ɮ,8l9W? NvpD'I;^AQmػM1|7R?6egh@Jշ! Н.J&;b_9`PmkY|No\Szi,6;tf B`0魱G55p5oN[8k^NإOgq^Jzr(Mmyv|[ih>azʽYI0_yʩ9cmfE}c_kfzS9pؒ VԀ$|w5B>Zh{!;, 4! g.W>.Yz.lS'6S! JWiѭ(RG)ʉ3M.UnJU 鏐]spjثtMrݜams6jk23"Kf# 37 jK~G*CW:t 9nc׃ QuԞ&h|_`ZKJx N:Jcpy-t ό:o[%8! ,PG:rNO>`+ƻ0Ν9oح+i;ݒtdϬv7t^Ʌ.\ws@ƨ<Ues%݃uW&z<Ȩ UGk`灹WO\ٸ#,8 ji S78y;1n"M,iX$:ĸiwMWO}r q ,pP'd`<E:4.b/$e'oaxUH/?6 ,<ԥJJaRyo8F_+\gg&1zi|ۆ]_oݖ ǒL~'};9$u~+g<6 Zt`yl(qˎKQg{¾P`O& Epu &l,\ۏ0yD0!XI$Ǿ7R{u(.FCn|(oMrh阚cs[}9l{{> o|+:vss^ݎp䶱p}=/c{ "<&~.⼀UTwgP3n3cAϽ S'qrl$P^q=H5iٻ|=p͸,#72(|ͮ ʡ8dqJ[i=ZA_zK*@ryDC0sZ s߹8ѼUY0A9;K`:B0r^snHc\~|XZ58=˶㸺H[) o $YI:F 7hqBz=/p: 9g`'ܦR! zť5w9|q~w qggYvf|FL.UI.̀<n[g=. K\Keєicc*r_0o9=츯`_"4f^s˹ -u}]dR힎3t}F]wÏǿ@+4R/~aB#3ÈD'_ NOFhy-E1y+P~:\pL2}W^ h1`{,>:8)>IwgA: fzi>! fEE1 qmNK|' #ˍYE33?bab*S bn}uaslv ʹeyө !&[=5fv>*]cn ^ 4mYIϟ'Bwk 7l`;~C\} yãCǣ+}.;;+?v!&I\1s(gGrzg/AhLKQ{6=9YQTI'ل Qm?67fLC_-ǓzݟAJH#l7;SۏKRZKj!;@[{WA7q7܈Gt03jI)8΄;iϋTpٕ0,KQ]SOg}w߱nH)v3vQHc%]Ek,]?`o) D.6Ci&j8&s\-u.>)H}ŀ3"q_~mnWRUXQ3]60ٵr8[E߄&/z}5EX@=-ip T-a]]"Axt+=9={BU_bSҨ4;9ۿ9IR[FIܗR_z'7$%X{!E<{Ty27_X$Bâ68+k|[3%tFw۟A"8ĺa#L#!D=WGq=zQOf#-SayizqC߀L8.'9{ _p@٬>DaZee֕2s~εټWqlGwhVo [oZ]66݉?Wy7p+\w_ȹSa-/V)UkA_{"E*tg5'Ow۬;h/^﷤ɂvD KZ2L>t3Kv?qV*@{f ?}ۛ!u p~FjPVk`Vxw>:[*\i F!4Iw?fjŭ=0[P]Zen~Ȓѫf:vޮp2r~/fkPa83{הpC'_Fon2/Eh9z?k@d1Va+s8HL^M)ߓA-,24WݚFJhSl\+,vq3٠{S}+V 8 _3RJ52ؾGV4ޏpw3[nrz0 益WME'gt{˗HlD5l??yq+"dcw8zBZ] B>m+_ִ=ͥ?0|<v&by2i6H%h(79qf @݀uQ0ass=/]k1pT>7x ibTRXm9I5κU1a--# fJK @^LXS2"-kV?:11胳ߜG]r;WQ7dJ w\'۝qOy@pc[8r ,.[ʎAߑpWoJ~/ A7ӗv Q|<]pRzn~k< sUG==Wx1mi3X¯ἴ:?9܄9g[\4} u:d>ubہ+={ϯ#I{ﱿΜL>ьEL:h[1g/K6y ሐXpkPJ=fw&t%3= EF8V$/KtWaNxnvv?'^ i2 _诹E-ͬ5, -l߯WngP~O ߡfo} #B`k'FxAzzy8l7>î[<q<=SSըm>+_pW93" ~2[[ݼ]`m٭/`0#lJj06OTU-aEGV,X8 ÿ}N"E!kgqg3uMN}0e -ahzY΍p0PlCSi[T,δ=߬ٛ#8X*+ ۅ5$ b]}Vw?v}ycg;ԯdP.g,Ny!4r[7+u'a`yK?PvR*P֛E t.7W߆&nKs7gX~2uŽf11v?U}nZ8rgKK~"м>6]q&.Kʭɸ`(wQ"ѠP1|K$==ާFFҵ@.nP b^\s tT$G`oWoD4cէ-#SpA砐'$6NڇaK甧yseATƮz8QhVJ9.KOa.hOTGxAY;V/CI "sFcmT¾#8G>S<33Uü5?pUТr=^R࿝D iWQjjc0d,mIeUfpJhT gƢZ of H90_ĿmF nB0q7$]tܓ]en"t W]u3OW3=u8CԳ{yYOۻøab+gEe';Ǟhګbf6]sx>i##QI^ހ6CFT)/ޔC</ތ^`;L ˝VF,vZY) QUO@FR2 )Wl۳H_/s{W9>31|‚ ƒǐPk&Wom*mY:38o3 ]ؔ+pW6[Dq0>R~"3ΗC^^IAe- 6}FDgZ|`Y~>uٓYrq?3hv-I$aPũ~"sA8Vg8& ;V`aN\7 Iz:唌D+=am VƯt2<\yV޸Ȼv647[,$3~}$qlyX92\G9F˾xba$B}Ѝoms>f|t֔y1:k&G⹏z Hwnqߦ 4.k0 \c} g̗۝I}оa\&IQ1*E:%}5p*?NSЩ;y l=AT.sПb4x 1_$Adܾ{HQAQFoӲ$_QR^â= ZQ^h{]qIWbS _yqdm'9z?8WՉD Q3˃2Y%S//cY Gpixz68SBFr+EncHh ք]c1YFwDνJ>M䗃6$Αnnb?@vgG܎|'OH/À ˫K[ /w\^72ܔO*>.I_GΞ1RzÈɢ1A>9Qڙ+)aLu-,L ) Z',ϗaY,n'|NbT_[#a<^:R5~qxn. SDQhߖu>,V,$, W$FLy2:X at\iz?# avNmF&<v{ U+nq1dQ=~-k*[Uh?Cꌮ՚&抋]8[AG?8Wf6.|+ЀEkpum{bp1KNa1X9'NR$q85;7y5rxpxP?L 4q;׿(c_8k-1)$fBKKKzLs1&~][yDwa})'Yp:Gfl]]EtYD-u0rYku΄yIYطrJn:cJװ5i2µCzB9,eRg<]5t|f#}6mS<9 =N] >B> 2/2+$=Y zCy}afz e9}\͖'a 9gXqS|h+id t48) MlXj@?o) TB ~\[:%pFkKOY Kvlb-7F _dFv7f/n^Wc9XakֿԼ I]|#+Q>DƐo^'Vx'U߰L5c`S„D36X&k}߾oVh>q]؏0wqZMBЅkf1 r6(0긂brc'gp~ܰ)^5m0ުy2Գ/GU⟢)[=MIQylwLĚ~kyd̟&Z-c g4aZ~@+6T@o}:y}t=7r: ztV9"$\<.v 7sjYGKXc* a@.k3v?Ha3dى铸QAN/{,o E'k`#nok" tF fV0cʭcoWGxz,cT}ٸw5iv{\}\>ZZۄf 􅭴6FCiʋVW8s"?ԍI~k:ePiDx>tpJ\͂{%Uy9/òguq nyG+V.6ܖt/}^L&e}&{vyAKb@R?q%I/KJ I}|"0K>_E+A?DcbpØG/p(|.; Wiᓃt>=n 2é㇎6Bkž;+b(?vA,B\됒X㻊`ϰzz[X\5@2B ꏢxK6>IJC.aC&|[v<{fFqq^j%-<'p[{񷴚 H3Aw3E>q9-\ Šob4aD<Q+BVT]{pVSS? 3?e$P\ TmgqG@jq{~JL 0KUϧn#֙pޛaξkéacQL%T$S#e MR"dP2!,:ycv,^{}͞z",g`={𲿂Y߈FcCiJx/$"|5}E.*.+lH~k+ љğg á疾ұ]eB;!Ԋ}>Q׼=RluG^혐JoXQ̛m1 ppGlR_qbiiQ⫅"7Es4~z* mtRԷYX4.5r9K:5E"QP{5.&GCgRZ9 FE=./<6!v'&a:XhQ{#{IBk8#lz;>߯=,Ѐ-qBCa/!6%9JF %%(b 3[HZ`~V3.u4h@>3?eF[މœo%73L$%?φcsey+/7a5&=~т1RZS2:ק.lH;otF]eez0;$XqWcalY]r=R|9l׺UOE\HPO-2i ܯm琛8ma|( Gb5g6 C||WI.mSe ぴr`] 4?1o| ^U^Ʈn?&eZ Έ9ڦ#Uǚ;oir]I ]WB](wҼ3g*έA?o'ڋPw44f%&()ȟ% [p͗-{q xrꤿryg!.KU]+U톟~vs8BsPbEФɤ?KkɟM+ IyWjp^:ӇF3vaQ`bT OJdBqyaudxg8c]Wݺ#@5nRv?N* Mx]Am-@"jRVpD2'ei l+~T{Y5y] -mXr|0Ar0wEJ(`ah TĜ/1P4&X0m3 nBOkuCdLY4<滁O/{ìh3iWlrs/χ._!;vwjZ+Zt}k/r }uabDF,.p:o|? [هY=?8mvMc]}b|P#Cvc̻¹#8*N1Ĺ n/VWm7x`B% 4.k0 9'S>Qh AIKFFi3,$Cl[Я.[æ^݋a߃XhkX:~uƭ~#LD0w9Njkz=DH6ٚ5O%tj-,V6Kcrޖs,=%Ɗhz5^aɘsu?)u iI$\E *A~_jkJ-4 8g z{|סC*(ysWP{wMȁEx3`ZCp>X}cnv?:]_|s^Q/㒃觗SkZP)kzuLWc?ɞK+LfY;~%TG,'2H[8pGEj[FÒUq!N/~Z͎RG"d Jly78<-x"i~HZU Z8kYȃFɟopC'\&~z-{1kPPU13S?o{}r z@&ՔXC#PA3asj~ɾca6e8lْ(z7XN3"9]p6&Ȝ]a 0ad*%}zTBeva.uU5r/ eř>G8r62UNTr.~l׏sB<} B>L._! ~;aQv~L*{S9Wg×= Ta.v >vL׉b/kl-Js _MNEzmHI6aU'tw`FʆS{1tz* UÛmq|;h4ΪE&c Kq8$: ҥ팁ȟA sD T}ۑ+O2Zs wQ${ u%:*"17\.μ.5vŸ1{qJr 1֍OPǺZz<]{of'5#`ȝ>_x̒Ayy߮s'cac@P :[aGSZq[͟q=ҕW=|3U 2nI3D,)>jyepƵG"Sʶq3vew9!V_+xg;>ѪfL:-$ ~ٿ2a^!{5Y̻4\X[qKqjAFvh׻u._Xy)w쳴ʲpHٺ^M@.K&D>ƙ NܣPޭru[@1yo= 0Np zrTaJN#f?ME:$&N zQ8]gG҈ܸI8-psr&wEi?'~$P}KcE:+Fza ]^10m)T;|f5GE[{TrT5Q?]&ٛaF=zH$V]Go@MwKUPXWzE&%*0΂  ivާklQf&j+9 װEqrlKKR\kmrsm{ZznӹB* E pm;]&ʿZUGbS.at{Y]E}OCpXE`vnsF[ξ+ }M^š9v 7NonWԑHAЌ!,}եNk]SvGt)v9WwBۋ%Nr[U*"_cgx.œpH ۋ d>ȹX"SE=Hҝj3c3;pVywtU9i{v\V.>;#yid;+뜀:7X+BR{[&vXD!v&~a[E?#֪օ;P@+ /~=pd^;YGM,vGdXW zHj@RaTq?sU 'lbPRLB?cBNf4V,8[/*S̾#\ +<iHi+/IEͯDɜʟw[q$mQW=)#)OuVY$' r0wr?x~s0vƋb8>sC}L3/C$󩧏`jO k9ao7I8'~HN*̃iG5cէdR}diyg-kQ`iab.a^г&PDSTH~IBr@T|Zɥ RݗSELEqSTey vzJcKW) wcZ +w=;d%h3ƾLJ0?eSwVA/sݱgHb&L='z`0 uZ2mj4B÷FnpF_s ]8CIrdh{v&='8VG6|7L .||_ڟިe苍N{FoյĚوMgzAvCu[;(…s2.Or_( ƹ]zj :?W$X/,T\ g(b)J~7bW8;T@qٗj uk/ ѡWڴ7 h|pH` [> OWꩂ*ɧ^o'FYMR%oMd3!!jy{HR )<8KaCӪ`o+qDxpQdpnӿK[{ulz]u(T478==TS= vn*}E/O".pUiP:$+5E[`W}^l I2B5h{HXW3yp~sH,#Ϫ\k0)r =~u0|J#YGfzy+"8̧,$?ЭRFqrb"'jl3ͽGeA>˔^*h6Qw+o5I=z<6{3M֐hnOv3?"*XǺUiVlJ~kk{r}d}x[.Z 3"^l #\nQSCDɮ'0*@?XBO!6U2: 8Mʄxko]?vl;xfgQD˳H:v j" B> (%+gCϟ/0%eXU|5ؓ a>*k(;5UXl70i!-ZE7 N^;hsTލo l7_*&7Ġ@KfLh5:sD{tduBX>oQJ?m{#>/dɚN;SdomO}3M<'õ+^ga,5%$)8mp'r$\HNn'¬Hv ca. Pw崍 ru|UpŎ)\?asM.nrLquWQ|PdZwޮ_wӅ&/yW##wןٲL/ؑ䟩Շ`Lէ7_0VI ?yB>1uҫ-P=8C;q٨jY)錈h7΋eZ~>نCFdֹ(\{aU?*tNvwSh5l%J]earT̥FL.0 _ZNsÇSF}X(rӕW{h"022$4_LÑ#Zԋ*8fjc-rF{pGG:sꀕn;[zCzsp)lY\EÚ0 b 3E}}kR^p*Glp&b]GBb薻שG rE=4%Vo-7Z5Jm>]7WSE_?Ȼ{ l(n۶l Ss0RG(Ke_ qP:cԛ=5LECw*6U<~:-6 INۄLaw6GϊyCDrހ$M圐;Qo E9&(2XiBΡYũESLv8w=*]:_@ԥס2!p]pu(ƤRz#bK7FƬ˨Ub R imιq`۹CޯݙQkEO,Bč- dfF=S?`^Ճ8eYhsmb#tCh D+G}mx/\.:ZO?^]ZCj`XVN hq֥Lܐ}.>0sY3rBj,udC,>}6Qw] 3"7SwsAEzH;뤸` gⳫ&d1?z3 1:vC=m0,{*7͍5H#xƮmYyFou´}*IȔ%4DƸ|<Зs WR>}*} xrΈ~^} |{h?YֽVӶŅ8sޏ,:$ BQ+`XА%Fߊi7߽p#2 ۵ZnZ猪Nϡ8!hnѩ$aƖ sm%h`R$3õ#MJzr|5X}D%_ f ܖScdmR tR;,M)>nI'z|R9۠} bi&OsV-kT%`VQС,9B>ml{p68Bf8l`7siAkS 6nyK /[8N8xN"w!ukcqa2}xefae5g԰ү45/'`J^> #Cw<(+wx{puWd\|Yf.&qIwFZc_)<|{Wqyzd) R^M[TK$~a  \?z"=p!t :47 W;s0BHp DJ M<4+Xˁ M.L=Z_db\҄ }#:A& Gp~DRgxKj&$19D&|2 qZ@}KIC{mxL^U)#ojf1 ߛQ: @ y\/;/jBFeV]$-qLHX-!s+M{U㟾^q5aJL6)'\>NK k04R-"v$7o<8Eキ Fmy$~eY O}qksar+E$ qi_0l k7/`MjK ]>Y0%gy]~#k[qr7- {7xBG7ަ<;YQctt6ɁEo/d8_4oe[_ "> 5%H8`-;=jhR)A-Z+Mn6~=.Z`ZdDY|fP. A4`~o?gP#Mdsͱ]da&\G.mKH{6@}Ą7 |/jMANV~tz.! ;=2`cQxV.~L@OH>\~QR[-S=^CWK DWd?ZΊvTm]28S8Wox8fn HiFUW1%v]d&O~T/5cؙYi6t@sCRtLy4̅Ӯ.@ *X9VӟoUbl&wcc|w.cC˵8pZz?;P;Tcqfz[SPW|A]譻''"%,+Ě5T^6RK:U8^bSw\M̕78};;`5{MUZLjlYQ 0aV8FC\|>yO;vܰy1f1P(Rk/K +處̶$yNcځ4 .ΜZ'WL`ɕKLy uGY`jT7 o 29W#4Ypi8qwg*l[-Ab .J3^"DG`ot=蒈;+A:!oq]-о)_m*ڄeu;- <õ\zx{C~HSZ !XB߹-t\;WEԹ-ս07v|)ւ_8uně۴n*jCaC_!Ojhǭmu?wCR'(GFx = 7ϴA(yw@<(/i}G2GGBlScJ`uq -?laɱwsFt]?F->1<bl|}W\qFΥ>v[-IY؝Z>h&C`K9HŵQ8r=|/# vbIGd~Nzl\BOmq;4z..`;g;c^N'8rc{Rʰ{SXZ01Cu[B2Wɶ2U3j ~!+J聭s\pN-Bo<Չ'WcbN!t8hC][w!-oa'jg汿~z.wU 1B{NcepW)c<9$~|660vt2LX})aco`AO-6QƅWoyF8cLqk\F[u 0i,},oH4ZKuOGY)]WTSvCq~+fH[ ,=P*?v<1t7fN3n}Հ@S``qCT0g+&4&bo4p5P[\5O?ɻmC]w4'~}'꠯rΨEBim)BO%O`\{FHJ }`{W\19L 0bb)}{O`cq)y;`S@. {,ey`vYg%Jpv/c}L?,DHˁy^<x [a[i3YT$-Gp*Ӣ@(.}i{c6-H{;e, K{,Qn!d`+8kr(&<<}{ktyflDp4M>$IFRR'> o֘qHG:]L۵π]W6(Ksaq#}dyր=7g |Y:͑9*joq7Gj-ծWث%hž@>}ƹPZ't )_y2G4Tٱ\R L䘑*6{pT KpF[)PeD#?KF;K*L?9"r%.; FWgfgaivQVJRHŅIY"%Q(Cpbƽ͗K1vw-{]fo\H[EΕR^ar[l0q9%KT税hz@9u˼':l.ƹˇprE86ZBh9Gˉ\sIj7̖v}Zɷӟm+Y=Gxc m7#o@K*p}e*@7;jv{amKE`8륲l,L_8L_e 8wʵE5 S1cs~ð8Oc`OGƎyOȱn#t ~vR6_R 5?8kw^Ow\V:i:qW-a"Vny7$r?SI'C--N~̷ :+!{_ 4͞1SШ~:Q6;No- < hn"Ļ~Q)S,q Z{֏M_ r*\60]]hKGW"gMF̚=ɻ|Q*PغϡP5V!} I)erbpM{%.$j,ǔw4HZ{ZܠRz3: wr~= e2o{bQ$\Ⳏ+/*Cte&-VqJ*lK'hjcY@?(\69d8s%?;W|h77m\{ $0NXÎtjXMؼE=:Sboy<$h(u5S$իD _?`Bh(Li@f>+pя>ٛYqcF^V{LC4h݇y b<'i#t<VΜ YƝ?]Dk4t >gjrG0YG !%킪{ 5f«bO0cmfշ xzGa7Gp2bK5Bqz.Sx7+8 ӻ$_ï[J-'lq4vFuda(_>^_4·UZ12ط5u_.0 /.5a󶽝qDZO8K cR$('gȩݮ5haIJ_fv](1V/ܕ~P nzC@-WAݫ{}A:,4v PÎW-83X6MHWxeI24:lC%b8sZX6Eߨ)Fw 2Br`0|6%]۸gbASA/?q&d?=8zzT_qE損]4-OkU\u'<ȸRL|2aQ ĩ)W\XW@1S?TaFti%\r&]1gǴ%kяVV%fXlty!*Wu}+iҦ\AGcEw >5OF^~ Q]ZP0r'g/ J= ېph_L+(F;4Êؼ3&&xϨ-U%tW9IAyl;(R3X~Ñm|Je)kf#cKշbC4Ԛ>˼$ Eu@6'Si:ArG@۷TE,CE(,Eq/GC6ů\yuY`5Y2p:G$.2dG ?KyVzb'¾LڞHZ= zw<K,|;wH=J|h-RFһ3V 6m 6T)VqlBP(V?ڱa89k*:% O@+Mo>E"Fhd5e'ERg+l%+㓡am )YޓyF3Lqg6{Dciڕ>,Bc2b]F:tXWWqG[/U?O퉕<٠o(@p Iׂe˶2jHf^ˍF,'iw@-$Q[M8ݑFʹ-+;?Ղ)(v?a3{Fc|Q 4/b~AH)68`6| PPmoqn1yW:h1,15KI”cI!cܯwLST+iCP$t5<؅Kʒ=8mZ<;JGU] J˷Usv"iF;W T| ,S*c}PuϦ@!rƋbD+BjVRi7њǶ/_5` E/"ص \TTf>\:}9-%eQH̹Oerv=[* Kj(S&h1=f8UAu&WLJ,"ۮᯭQ4Xj`{vƺ2C<z\pk'4ン2K#&#`w8uض5q؜P(Be&p>S_b>y1}!tᲷF~WLoKO [Ē-L`p֞u F'1M8#|5#A*bG=?C3ٗyT%Ӥ&9<}L`dy5njW cÛo6rCK ڱ32$V\%wka&u׷ dS {m|L{s݌ ;l%Oā/SVW 'XʻS^c 3ǒCC_FI8")qܝ'=q|=wq7-=㩯|giaśd1E1 lZs8.ZE ϕԞB9u9(|Jgۨs5T7()p9Rjc*=`*! 4+r 8V=n²Vedm|%YU o $%%/Gs<˟垛Y deIq_p.$)$fڒ%68"lcӑP?dqҖ} X5 +7t'AUjFy`n{ÛzYM27ٿsύ~S~WcK4IC#5Ag*!} 7ͭ33=h k@-alg5ŁWr\ۄVd}6Iyֱ~siBwYXٖF%>${mѐ\-iBf5;ł39%P^-;zA8cK עi %,,鞷(/T6|F{ ԫ$ j<Մi{qBHA-( 5a}<`Ќ`D5^Mkl ;켫{d%>88;1c>>ّeؕaɑo8`("nMr5rSKnK)w'H_ 0yE)6ڝW3 _OBa^jO {8Ж/iD[5ZXh!sICBj|ʼn(?aڪ.lwH­?eBmȴH>Ll=+k_Žę3/|Mܘ>3toN +á/;#PF>:O vQ "i{lpN'QW$xW ~SV6L\/+A_?1R9~3Xܸ "n?p9^YU,eQŋs?Yvy[phfX8m νT4텤¡ͷ.WHp>`m!H~[@5Pn~3Wo<`bCy?67dg!p[M$wD :"I>K7-,~R~pܟo̢ џr%Xcg>F[ENLąP,w`LoNg,܋G E♠w誓ar -e/';`/s$2,\|r- tn1NK+m~Og&_뛮ak8kM"&ްbeOKp%\ͳW*E̞v,ɼY>O\ }Y yz@i9f_@cusڄ Ʃ;1СnNR}!+٤3}='.nqpJW"~LqܰG7TUUKη Cv.`>qxkE?XgKXDcayv 8VWt.p/o\p%%V)ɺl_cNgAж=00y_IwN"%=woAζ(e ;(ݍSQF֓4;tXOkxv0?D1]H-kmip F>w$aʐIA̾8ؒh\PÇ}2>3$W{m.>Tz* nqWT0]nu.Z^Ygaw8ՌJHݑ3c /=+.FyPzuO w=y~rҷE+C ͇t9:>l]Ǵ .`L&j)L}q-Y0h>M.I5!9=L8bv25x]O]x?ö_ы}Ɵ9WSIl߾9[(Qb{b |8}䆎_h/= SVSŅx,~a꿤rL4GMl"rGl RO0xl~\OE[zHUW%#Gy ŽGAiT >6d:^6:~^oآzyil73;w nj(baxk )F(/;oL>\n?m<+Gus N{g䡡9Y*\wpL`xlHۢz 8pl"^?@7-ߗ;K ԩFX+f.aF䠼r :b/QSoYyDM7p~{l~;Mڒ)xƚb^#"oa.RіJyab͉@""Sm_"XmjG.[0P9yC &xÒȸ/4ڭyCװJH&KP,t0w9elܮCۦw497r8=`z~d|Lpo/`jˌb-O˄2arԃt<#uN}>e2o8nk=㇁HwhВVq?|Obhio47njF˷e Heou_?~u?w߿/'{c?r8owGgqyOqǸo_u=;-.c;}]p?y7Gd?c__1os.s߿yo#o㼿ħKq?u-8?͛zh?Oy_~;;_wn￳Ok{YMIglmnet/data/PoissonExample.RData0000644000176200001440000022721212400076655016347 0ustar liggesusersw<m#Ef0JZ[!eJFє"$Eҷ;2εڛ{k?{q^Eu&ttt tGͷL z:&:>n/E/dQnr~=COrΨ" ZU0;̈WkzTY9}lݹe=ɟȘ=pdvcOۯq.mw({2!.4%ǔX|@j$F&2>Snz˚aX}ZQl O68CA" _>uH rf]7S=?gce +\+65XFavVߐ |$?(A"){lwXΡLsBW$'|l;B셐EI~ }.Gi@M,(y =|i!J$. ݟK݇Vs!3H zՅ$N-VDCiPP9k7y]37H) ?f =siuOaGnqԝpakErF:4|, ޡbs)-WRQ> Xb<ìPR;ס}Hv ;m f:Dt~iMǃ= w %}qΞRɢ8o"wWf[-vyGk ٺ&cLE%t79wtW`]m#3ck#6\q6}L~eξN1MVK6q:+l O'GIiQ^um0u=goLUuB|lb lŕ+݆V Cg?{D4q = 0r-YjR^?`F]꫷;1o. /L`30RVG%S0R1A?{ WEW4hj|RMCY/!0-s..U}!g6.Ї! fO fa= <YYk \sm/YeF6߼ `| tP&GoBNc0'Q$kv=e qcpP뭟u~C 1>XBHkhq~s[;X9l5֨ xMtMl\ HöA_@ c̿899Ȱ}bcN  v#|p Hl;d E.QCRۡtJ؃Bsa#= _yvnAݓi2zjV0gy|sN`];\= ==ZS41-h WîD;n&z2vNw!3ts(G&Cr̴2vV.e;.7zu#'fal61uK;vxK@Kq6`9Ra sCro8gCڙ 3|L0ZjRm|B6qG,:4""S?9G@oPǐ})^8=XMA Z%%-m05$$Q;` MC'"`\̩<+Ho3S[ǡ 2R|gyuadSj &\/ͻ!y38|sUm.|CCGav:Gm\9ss!;c֛/zS_/#Oaو-0yܕ:8RoW3pK#G.o\_7&8>{VVnr,OW+{qPԧ(~\ЉC,P=c Jǡm o=QH\9gzDX:9s$V4<9-|Ұ9U("ј }={|XױgM3 e /a}uY/b PmŽ5@vx-År`Y[oHɹ:AD\Zz`_7VXXu'OmNxg/mۊKW_ja (@;.Jz&IFYAa8{6>R3Rx~/RɩPX\闦 r޽>QhP۞^,8X8ۻ0Q l^399]Iy ҍeO; G6NH X$ cUJc%sVi|磊<vw-ɡ nYUfaŠQ']Ԩ9 4tk]DZqhRBzW”83kX S'A['&/N6;飸YGu냿Ǚrvju߷ _RSW5#QLrw2 Ⱦr6pvr3%8~ yKU3aaT16J>o|sLVvO%d݄)z3p6>u?6ss,E&j#RQd=lMzj5 'J@_.wnmv(t% 5g yp^tAW]=Ю/(7}JֺDa1uY>#,nM=.\բp~7IɬYw/]Q|#fY9/+rUf>7zu`sSyFwOg[.Êf3}NtXe|}E$ ݺɱ.`z{ZNA5.8" ĢWZ Pc˻m`^*RmSfaO}؀|*S0kt8˳> DYfwZd 񯠇(+쇳| zYLSae*D}L K,Fj股+|ɛ@=e0 Mǥ:WpԸ,g%_~~vUs[kDpJ"΄!;b룭{_MdqdtmЯye]ppZ @£@ڵ˅BgZ&9$џ;VZ|Lw~ A$@I\}#ԪZ|#D*h&p/ Kv#2,L8CJk_1+Wz|h=~4wbVF5X]1|Ԯ*1AhLUP*Dh&2bu3-=ߖÏ4n|lM;ԛ6ס^/{[Ƿ?O l5 �*zxa=|TyH>Knna+7mH\LgUF&iTc ):l vo\8o-ቃ0t 6&@sB^ >٥ЊAaUk=N]R2=/I21WWHjPQEcfi xd://ΆmiB7F ue >5H,2 ~&nhZ.ff~CᅱV<$z v FVrrfgEXOO94F`|8suNߓ_!5yn1[~jDoS~elĨ[`?ca$kӓ~)38\);Llq%H֏1fuvz__ڐ0OZ-bf۞$4`  %NװyArŔQ}]O72:ccEդ%*n_ȒXLA#jfvT<3G+Ɖ'"ٯ &W?ü?OA TKsCC-[)F<.=\_?u8w4=SP7g6~c}aJ}"qEh07$ &YDd"T5,?#0M'0ᯒ?_K|^:j^%J3i۴9Rrf,@=zA^pqx^x. 6:*Ӆ G N'Y=gt&EfvM`+wb 2TU82o R&agj.}NY-q{^ S(/o[d̕s1A5Q%A]_'#o$j&r'=f R^Ae p՚/ nc1O)^>4dҝ^vIL=ɲ<_}*xd*{n>Z)sRg[tq$kTo׻|R=1=~Z 9d[ efuW9~o`٫_u8;1=C.^ۆ0[؃ %5o18k,~Z7Pƹu;w|2s?yɪ;+;мD̿Hddy9_ѼByİr 9γi<g |b}=n? LڽjG Ek8R iS''U8S ݍP. /L͔pDctqΜk=PN\1a?o>=VM2G``}/IejZ=.G{$ DZx\;P;|U+}0IZ],9Bk%R0%ݿP2={=G¼uCqދAH<>]8Lo8JFp%Q>BRZ2/o~(*u>2ac?uk8|O"o n}у$M7 FO @;ׯ0ҼR~g|^g`4\Fm t=6-\$4F,[~ngc,(g/MA Nқ=(m}͋3@nݗfuF^X]6QCM\Ɖ_\eYa2`Ft'{S.M>fG[#%J1띁k@ w;B;FN|d/[;;"9Z"„#=OFٱLPN9'Yd3qb[WO8pdy )~1.'l|Dv_^Mebމo79`vH:y_}*Q`zjYz=ۍ\ ew;%B_̏Ӱ"ڌ_&d햟<)3@$cf?4Xx+/o̶–@ y}?sCʫwY{8FὮx=H19P4^^m3H:x+2FG$!fo~њ]_?8|%?x;كK2T>ʾ Gz!6@))ߝ݌\aߧKHy.dor(/z4X3K7q݀ISNE_$l`&w:  =MӁ‡W\/=tn 1Yj zp[q<.s_ gMrx7y9Jл%Vgg zT=ڡI Ыb)ǷɅV)̗Z$U([̺l]:<N,|Z.q2~U40Ճ B]wk1m>x;&j8`22 @HS0I;f4S4! X// mwKV$Z<,dpNj>qLiCAة%(nz7d1ôE_7_CTH?Ƌ/daQEj]Er޶RulIoHަrox܇g'`(;l/mI{ ɯҵ05Y[z|RJ:IXiޔrtQ^ZfOW%BQS|V %taʑ<0]tu|v'u0BYJ=b?1CQ>Vw1S5;z+\o׽ƒqEf{]p@[UN moJG#!INp»- XR}X0=ŨHA_p 0.y BL6B*q*h$a3 +HLsp& < Gz8{m2pLv:SEO"XآȈktpY֗25#@\}AۼV!eMOVůw?+f/+oiҤaXμ {܁闔`ce2Ѳ8`>Im$"'+/0-aAtWX6=r{4L)(ʖ&7$qvܨ8`Fl8w7LjWYAGۑ.ɽy_f.Od0s}X E[O1%p~ġQMrĴ-JrX$fd܈ژ Jv!4:.!vTӽK=keofZv@˩ZyЩSf \fJd<ĬV0^dzR|,(Ak*.=#HvRҭw/db8q"* N@V]Bq XH2aId(*al$P_o4>Oh<&*J)>:>6vf]ooI8F&QuJ{|yls}P;tw߇&{24-[X9H~!g۩gH`w19}Rw~ ")5cRXkm OV Sٶx@tAJN2\TF_ޞ, `hy&(Avp{\]V^}O=~;k`nXZF&j]d`_aM3w+DLso#ℱ P'3<`HzFTnVXW) }b#DX{#4Y)m#<ulʿQ߼~76Р>We־AS? B?|Ey4&xo&Vc[w Ga1Ui22lҒԟ@,6|)ٸ3h{0}ޝsZݟ^E',!y\ˎBǦ&aRgV= `A7"?z0?Nx[xSߢ81ļG( }ՠ#Ŋq 1fz*VXem+2NMl'jѝ"D::k%RK/?&ҫa"ZXY˵_l <2v{sO9SmpK\(S>Vʃ%W.WCg:qy)KYN<J7ņ`s!)^\wk;bC-5lYζ'g51AZ!V]d1  ۈ g1-9}z|,?XB8PO9%ATS[0u5-BG|,vn>ߢcט8236N5Gߣ[w0`J H/?`¹EKDk*ʜ˟tJuRE%ő5 C]I a]_-fsęYeK|%/H%?]0;&=~!+}ׇ)I][s쾌] N_TÎUV˗8/ўe N7ڟ Kܟ Ǚ]mSe(,7)kp!6{f֠s،-vji4JIǠ=S%Wo  G-+~EԺ~qu}K./YJzFޓx6o6\Z- >a{0p[XǸ Bשo_¿ a!vпnm gK_(r6_aV=@6RF~ӫ_I¥'[ Lꘑ;t/}y^upZe\s-q%oaYF{Hq 1's8Iw?˶c?6F4#o^φpߺ u7LsZJ} Tw+tZX=w}g ,0cֈwzU0$Hq+\Z"T!!#r _M<2 v~oz`'5Vw7Bbh t=Jѧry0`i'4l{}׸\ijB ,Xm``|.}ʆg4Z >63[#'۪ÂB)^](~|Qw fTBSL)R P D].9 c$uKZ39B]WۛT]awMQpԄ`nr=6DçmzaNˡK,ekN)+$mNi\aMҎ=W ^\*z{'0oEJm{؁ AllV+阀|s909$g{2}f~ɯAn(Ut<S ^ 8H|==(v4F>W 81u0xFG..: FJؾ旣0!-%ECsrh PT֛^ _G-=q-s:,;"0C,u?%Bi'n=,1VvDžv{{GaTqC`n%Mœy NXǗff,b|w>ZL_1C_OFJayZ9lqv|$. \\lKLW'L8= 3^!᪯渶akj0Q} nR dt&>G 's(j5u7A?ѥHQY9zΌ</Z@ 22[`W0+<}$uWSVw`INHRQp/i+?j0~;x}z"Ep0kJ""FvETnS @: PGSq~y)uG(P? `EjfXuz[ Zu$ߧ(7pY`Zj#yI2ùևY8laWbn،:A!V)Pޔ@a hdlpyq+ì!^Y4WZ”r>sSd7s\Ή! $sBݮ'LHr" &8b#27./.1th\eH4_qIqc*Prgv@*g{Mą8Vgl սj!c8׈ d]gC^Yn |<}5CsX!mjJc[Χ7U]7$Nj@:^<[afC:Cڇ&#Ǽ4Jԧ0Pp@o: ̡x=Js/F-h\iL}lltBT`.*V ;U3a0=);Rj֦r҈E!96,--ܣq=Z3~7ÑDz㸸J&; 7pʼnFaHα(+] meFPהㆅFsq'A k-'r'eRUv-QS^{y(޼&rM߷bC SF3 Zf᷀mNVSEW?;t3VwAI3Aml)>Jᅥ11 _ ۨ5VY)rPul6L~&{g$Z#2:!==}dMטuqӛd%l_ODzaU.?)y%Œxw$d@A& >kasϑ۹S>6/{d@kc-߷("󃣷ٔa)ehk??sl$Xκ~ǙRi&!{-v|i/<9ֶEfaŵ\܎Ue٠{/7³8~1cB=ت> t \8r0%r6iSx [Jެ\!0G|K`TrSl:NȈ%`QW:9~ ɥŨu\-披2g)ᖅ@i ͼqF'&`.r5qͶTW,)}v!w@zd#G0䗏 lǾ_NahM_$XVyX".EUQGIeA;مX\a\O췘! 9ϐyyYh0+<#(8>M%T>m$=x8w #v +"0:dz}VNL߇az11h$M\y|q޶r9Vt=IY%:4!\xc'bz\32'4}#2f7" b#?%Wki6V\U^B"Θ/tݺ}G=cy{pSj%$ Vnz {1:^}j( ˅}%T;>s ڻkXW'N~=oH~>~X4'SPV':Zσ-w4 9sv5V|}.ޜJ DJG)iܠ\VGX3g#IRkP}HD:v+}kXN'i82q<=%&,w/;3a8fuȽ)TUn'PK$V-Tc&=q?pθ} G}CQخm~1P_g3lkuh#r{vC3`_4R>Rٿ\w8J OOIEj!Abݎ6.hNRj<309 ^6?isɗ $`3r 7x6{Ao)3,SYXIYNPec~I{' Z*~nܩfԶU9n71ܓovlSUDjOxDOئ$C'](vͶktKHO2ʊlDXbab}.Sf@8<:RJ]~87 du `-4=~łi{#⛋Igu 5M_Mboq_o'?$~jG3kO`_g$c,U66Lg ~1qTJ­`iݜ痟K!QEn+9=Psg o ( []!ҙw%Ev觗 ǎzPxrl {FT;[eZzwm̯'V4ekFmAٸ-MҦ }墆Q|^qB0\S/^+{_bmEQ뛸PVt7[Kaqܘ})bҁ{Z9׈-Tx_7Z1޴OMXeYmP oM{fqNyP{z 978a*\Q!ly~8|!\}~hV ea]J`ô.h0_qqŴ+RZS`>Pdu ~LQBzNJsa$; .wܮ\;rpAhU|:3oS"SH rO 坨 JbPcAs?"o6Ɇ}i%*y~ F/Ak!sfl[Ɛ[ozGz%PVV⃢^'8`RpRmQx;ÿ}($"ˣXsRB]wc܈Yt^8H BϨ< í;_Fy`A1z0 #$7=~M d-| W]`J]_mhcƥG9ӠgLĎ]0Rī'W`;f/7hKѹ7[]ПwJ#. LFIJK T-!fÃ80a%h#T /Hr%o^?ʞ.wU\oF /kegs8 *ઋm`xXU6dGtixcaH\sv?FΰC8ZU`uõm=`BVxN֜ˊ>,oz?6 mg!7p-|&48Or;cgKcRmE׆$-ٛ~8ףV#c%c (\: s߻{ <ӑ^6H}davdi\E_B=MBKXmwX4Pg G2“]^"8tm$<WM}t_Vn(v.ek/pxc^عU8d_t݂zf"£ؕE`М| v:fr(zضuU26b^ B7KiaLa9 H/o@M%pl)JWGg+Ʈᚋ6eƞ޺?}ۢD,-ߺw.<wC6]OTr` eF?v_֕v֗0؟* (;spLMѱ%0jUdz]ѿ{ dLe=:2,Kb ;] |rx9 j1k5z6 Η}L"yR8tsD"2dMlw)=E#6T>n}# D:cK'J7sfmЎǍcga07OB/ 0g";cp=]GwM<:,l|4S,!qH!6TL`Mg9,ػ@m\eG˪~8 ?k~,o'vxf#R8Rvz J B\u gsh[ 1E{s^V|nmo:P( )|x#,Glkq[uW`$I'!NX_a9I{l(9c='+ڎ+qB%M0pփc5E2UhwbH;b/i8Q]Z؀2_ ů.; mZW|G ybAA/FZݑ:p:BAccOI&Y(2-Lp]6a &?Z ,Usua6{]{JlAϡ sLS0 8!f(=lz,S7] lƉXh"e֒Cj⏒fXx 3ב .*< KLanq8W9A=Cz Sӡyw:dN$xkUC->.xAB)U<7.!mP2|SW [ۛY/Ha @+&|9{i0ږjbsHlMd[p9 x:y7@ޝf#ثR-+nV\ĉ=S@n>ִ[%ϯZzckʜ3%(2ks>c)&Op1OϫY]%@/鎰o$eQ2 juổ<5PȂ$vk GqDCVcD W$ K߮_A&if0/},u=޴w@q6K jgH;e@}j_ K1= GfJ}^S`=|; (58~7`E=VRwCW"'8S$U{5 M"A#tL7j_*/݇iFuܳhID%5e~ĵДRx3,N"Ub "F^L1ԵϺ2Ô WS9~qxl}kꖎ%J.8`ۻe JW@oC4/Vi5V5t"˦Az[8_X7l{ͨwNVu X`ΫΔ`qݓ]0{K*R.-C?քc\`],s) 3< 1Twډ!]EN#(TU8=>VaUR_gmK 2]XFݷ@-_z[#ܠ.v$|GOe0v2,s:^v9KH̩*A3S8VǪMjUO6T$.ŢV8\^nȎmx"_$a!IbOyPex~tlӥxܮNؾ92ķN31ž-CFgNG$ty<#yCuEX.IP`P_'/xf j{~q #Wf%zg34C>YJ^p/d1?ΔM1K"6;u–a/hÃ{ʿDFQ ̈ =(ByZ.e0ZuIyn]d%hu Rp抡ؠ,$'(zZ]{T&/AIrP^řwTWcvuFZ2M\酭ޝOALoaʮ[1y$Qe1wKN+t 7]ʨR-?qv T0}ޝAEB()H#U8NE%}QM{zX8Ba=rb?̮2]o+]xNvz(Oxim\vDIZcLw_0x\Zss| 8kTC>~;8km{^d^h[n!kzVK`U%UQpaj=uw8]H?hI`Cs)+{E1}P1!Vl̀[^[d1j)z?O-{vK`{ ^Rk{5xb粨^;x-mK)9\3mÖ)YhR*߾ B71vE1ߤR|!;m '_r㍅rS[ĭ@/{We~M-~ o6}ڙ޹M 3C7NM]`]'j>$3~TFp`fZBƽ0нX Ed/!~2c%ۀ\zIuymg{ATGnoьs;gV SxXԢ6m2:8bt ʿ-kl8~uGx&ԁT-]uN𫻋 ,fnCAĵ&Փ@zsbFVF/B _1PI]Hܭ[6F?pnD'O#5l`[ 7lklQ\gSBZMkpLC:W<]C#.Z]sǾ[3WHbO71d^3ݵrzAG0:];LRʺoAxkOEG>W.A{Q'80kE_Yʸzӛ; #f32`al;Bɟ'ikT=O:b)08&<e6RIΉ~ '"up̣)2>_LGMlL쏖!Z/ f ]{ [u)@Q y2Lɍb{#ٕP ݹXr_Quj8Aǡ븰iLhO?)`gyl J!y+XT~^W~*cdGL=ƼE/Z .хK_9Fy;vtBD4,p#(#͜mE1clׇtj 8ĒMs$ڛeQ2"Ӵ휫ao,R뾻bGpݩP*h۟Vp :loڟYg\ ^{\s~`O'WT:Ծ}~S*T͙rO2L5 1af , &&0͔_u7[WΛDc?vE ldA1T Ȓ&3{){KG>$8/z9},:X`&S+YhYʗBCOLlXԸ {9bUԟO-AcPQg0Ralϫ] Tqv2 YpꅘL㼎@υn0x C: JD70 jV<srW+-p߼.\yn/tA-ep>]nޕsI67®qܝ 8pӹ|,q`{[-??Lm*aQY:Ը;|#_ƞ`o D:-I`>5рIz-U=T:{¯}'Fqjew0Pr\XuXZ@Jf+7y{A&Jli(0\ԼɤLb?}:`:mr& L?C w5Vp40W^/.o}IhDZc*uJKmvC h򣷱;1P-R MYN5@wFk3엒%PFl&v9κJXY O "c;t%!؅ r^熩]8\Oİa5=W{Y kƇ΋|G| SQV&ul\0U">/UӰAe0ĺ&svcv .F?mדogÈ%'v!ɡwgىcfKۃ_ zuPzݻpn(g}1KPɬ\G`7D0+ ~ucyHh3=*P *lGw_W0 (*C2_0Fx}Z+ 4cnsj}joW 49#sJ|_Ҩa*$ dMo8ygȨJNۖ+ {I]&zz{2zwWb㯖́rP~4NR|#}r}/TtRWyzYQ3&r &B#oxlUOe06cpGS;E i|7î2c7 sYh8*`Vד)|j& i`Kf~!\+t.e@q878 4YZa޼歀W u,,V3]N4b!]sZ톁=BSc0f!>-7aECXպ=HCM†7m_#TcÚNH3-Pvc4I=Hb$ MWw/v;4a=]}Xb! z3m%)\֨P&A/\Wfu%#\0݃Z|[U*P K]m!|'UL(&dd~m}-SǯNq9flEY=Wd߻4a -0Bz7~)2 cL޻ *^P5UPE`t=Wڂ~&2O E^GhcJc,1Mf;[ 8&S7.=Cc>N7ABp+.9i[}:֋߫{p&DK\m%pcze0X-ZYbc_-5mp8:*μ 8JMٗ PݒzHk["Gt09p)wVRʻ\;`nGVebk\jUH v7:eiG&7|UAn O(|ES]Jrcu^ypkD/CױBd\m%*2՝t;X|I7=Ҥ0**|V @QH@֭ǘ`TIW" zJط7$MoNO'H1zзn/5u  uwzŸ 7tah׌I6v~]1\l i6//B٭/)A^b};۹Gx^;.끮b)LܛM/.bw)?nlɳTל2h4®74I'Ihh;8Za3Nߺ0񠷷Vb}˘XgНn&Xeۓt,NPgh | -ll(' 0dkH'f ph[}dŗ@px~H?Gҿ.rS2Ru/,u; a,r/s)'iARʅsۉiR_k_^EL%P7X vQ5MkRR׾!jW.C,M3ˆmrp["{Yb?P#%Uieu{(=rHN#afzث3]ƥsCavTj;(I38oz$c$>F ըR 62ϊW@A2K{}(9b? ,`奯 Mj&݇v/ɕEhzqgD<hbԁTp!y cf?Brx+ Jw .rOu cG Qd*`ְ+_&>epb ^!6cpqUQ3{& cE`^' i8C[4L%{j+ ^:y [mD&(\Ջp$W ig|.(Hܶ>{,?:{*ԡ90\*W[qd|[}ocGQ |/T^ǻo=7s;Icmo eú3JǾ#pRNmlf ,©T 3V&8'+Ke(%#8YPPv;G \=ʱcbYyx' ]u'g~-GeVHf𑳷G}Zq2p1/.-KV)flv d/ʘ GҮgK~ g]/%8sl,t4kv6Z*R%4ߛbwRd5sKĉsk-SnozWҴdT$@Rz5 =<vz zQX[\^i˕2NTaH!bTz :^}S]oJCnǩ'wp$깄?0tSy~\>-]tsi0mQx6P|lP<3tWt;6R_6esZ:OK}q: lޛ;$zaӷ>> H߷LY'Eo`#+&0Φ;-~E0K^~]q ݥ?KǮ@I3Ѭ8Z*gMWӀA%a.R:9kx6 J>)pckeɯ AJ>@r%Xd%/ 5 Ja!Vy.n|'6IEEfol8\IPOIL묱]y? .=~za{oa\8 _ϵϾ_Wpjo%ܣs3ɭL0z^ۜخ״^sDzΉ材+Hc =~ z\hQi [PDgPkO$su3NՐCgND D+^ J,*C+F%~If㐥-Wzfp-y V}FS[xd gSd`auEYHzٿK@y;ql$+5m Wañ|VDۦG<9 l>Şz] GMm]"2l1f<ܩ8niPQFQ hHEdEE!+HEYe Jd{puα?x}߯u=O+f^]o$`>CK-4ly9CIt'!$^4txX'Be0;VV ESq}-ؽ.XU?3]+0n.rw:갖';ύجDH_-Cw$ygCNkYHay3| |0hLNf㰨-{La6tWXb?eRqf+[`e}Aw&C._8\7l%}L#ipEcǕ4[G ;A=ZE OT{/Cs0jfˏIb2NMX==HzNT:Y=3ؘۤua&nC.Fr$,]>Em[8O>qryfΑ$};'Nq焱>90)j1;cʿ,&י KLdUt,0ƞGXֱܢOs6-YJ};F>B3Nz }pUW<e&=j'ӷ2nx'fΒaP$u# uų~ǫ }VyBeVuQ\Y֯JE,r8[h˟D;fܟ㜀^I+}2 :DYg$];n*>=WGB,#FH$2CQ@s~JV܅5CF@ux>d+[zĹ"xײpù!sJ)R5c/9Gz.2Sy]=hUcj7vQ]jqx3M>a7g 2DrWaa]s_2vKv˞=+\EW7T(j?ݝu{m͑#3C ҇in|; ]sKD` 6 kݍY |c˃,i^0C8[qjfǁv9)D$R{RsEhkQlN̟)V{J~ *Z FzɜoEAaEU L 9ʳ ݹ?lEjn`,{-ڭu7p V 0m?2~ s$=~C42;v^ 9 1?zuWgtETqƑ@ѡ$9]4pŎ!h%iIc;5w{m mzY-0*c*%] 8BAY@+m;_5֨:EoY8 {>RE;i qN֋ϰ=3 sױf1g`eΓ@?4u#5“Wy8[5=,E&넌@^$!HO/H`xUq\1XEĔMybj+C7T뮝,6{k%9EnyL?A:6o͓F絏Pr~N؋Tk-8&KCT@S 24spl^ l(oضmq1j=VzSm4@5-:n|YMkH}C=<ԗyW]t턌mnD26CsyoPa38.͈#9~mjU@9{2kc+nW@ɭGMlcH92 c$4Sw?% M2}fɅkШPRݰbWWy9ABM,k UJ1q@\X2,Hq߇ nm$ ytZ ֳNF! `^Y4!a ׆ҍNNH}Xbm󙌹z'&iժkdtUy, 4+s-8syfftg3 >ʹWmkbSaKZI.jc!s1A"_IiS$P{,vBKqxħ?~_OZy|;a(f\a~eL9ǩ|gK/d@շ"@OO-&C )C0=6SFf/ ' .-~N2i 8ni;&^'d9c>6C#{ 3.3شqc]9֟Hϙ0>6o Gŝm#2 9zCiPARYS'F1C8zLS,(!&Bs; S~020޽@oTUb!+1ҦP &p^z֬9wq~"ՉX@f$}*o~+ϒ"P9uuk:NJ^vĕ0ӫBNC^4`>#r ߟ~EZG\|W2)Er¶DŽd7̫ωc \{|oػ# =$@F'G O"u l$G^CO4x &A[Мi[X{PQvԬ;'mfe@Ͱ}HrGf~[NbyFH*(MmqV4{bHRu>"ˢ9p@9`:9x~Ap+ p(ήܕpR; XTfjv@9-%8Xj覶؝.ã`M!?/u(*&1'9z#?jk6a_W܉LkwXfTjĴw<>n,5{\0Q껃cFaX>\]d{KPbRX>X;Jrk,K%}o݌jEDZޝ`ӗ_nGK7sREQG_̏-$R9˦p*ui06jZ%?n ?:%21ܰv&`Ro ,ٚ_@ն:EGPT`du}7f_qU\'DT`mڏlc@m&2,=6\UU Ʊm\HQyIk;6,.\{u79A6$os [>< A1Wذf\U}X_))X04:ԽQX}vx| E_ ;;%Fŏ8,P;Ha2qqq)$yZ7DjL:| JLȿJi3⊔ߒB]Z=T`3y _2/[ "\5m6_Ń+]۝`A8L#[B"rVB=DNpC:qXKV8K٪ On8Z{"'] mH@\" KgU实E8[;IԻjd(_ȃ,T,]k4b7?U}ly)T.4 E9i (ůwV{$Z9n_u㍑9! ;Dݰ>>/y V?q1͓Xzȕw?ui5eyWXYT5O>rZI;hmXeϽ\:)4lb^tޚþ-ՏM)cgyE7f݂GgCoȴ^c?8|( >I^:X-hyKbIYP{pwfdTQq3{Y5n4z8Hn+Wfbo18},Љ1X=,铚F)0k]={#"KK?r,>~K{Y6! %B0LUx.wJk/M?awb|_!5:bGp]EWs+Le @߆$vd]37T5h a*Iu{JWYxP;JF`;ԫuXqbXS-/,Ŀw_On!JO-+Ӑ;mWGdH8􌎷tdm"8(#؉-,LZr]EPz7.%[h8@2\w A,^b2(/Pxy0{VдtbA| 7ŗ~9iU+10wRҔ+pB[uuA|&p _Y3T8u2GF=bxè"f|Ug7RK6-\qgVQ(s/7g@ɋ‰u8%|rtn܊A5 ? ޿OgaؽcPju}BaC=8qcm uWA;7@GݏҽؽKA Y[oVO|!eǑ||v,72OB ׋rq8_ ~4]ӻſAt}zׯL8R蚷[|0F6-qrso1$A /W;}H+|⊝ˬL<8yCJ U@pj%UN:&nɢѶu~J8$`kKi{2jCEq~#׻PUT;_r2|<9kv&!2z}z-S֠iW8,*Q ̫Nն`yĮf2x- 8&t߁kcX#qa6(ɋ٦=K;q&JeNt7^z!϶myPVmo^_| (aJ{88N1PfΓ Gѽ`5 %9.e#51:mx pta)>@4+k -:>A.=k8zOShPQs͒Cr8uFlJ`@7g 5Z61)جx1gFJYH>Rw7,WMMOva,/6>? e9M@CM%PA'ڽ N :=afq<^V͎"Og'[obj]iUIi*7#_>i|§К_Z:~JjƬ MTӸ5uۏ8fmnXyNyFTy u]x/+ixbѸui|;y0F4ôk((:"c頿/~NX. Q{+Tӈt1%}SK 4c'pZuQ̊]ݲxO`X*^ F"B'qc'ڷm ˓!p-8kьr;nٝU+J(8!T/vo} N? ӵ&c)fsM8a})zJ-)'8EqvUFp@I0ܹ_ Ceoe`ӿqD=!ul81"aEqꑱL'2_I3췸8X]ch?g^*]Ĝ/,6NbÀE™H.4S B~ ])3_ StWP1#^9}w}sq)^`CGrΌoW+޹~?ɻYvA~^#,mH3CN]JYo?|Y%lI|^(eH ܼxWȏ C={_v K9p2D}M8E_ ~аDv _n>% E9: + `J ]>ZgAhmF;Hfݍ+zm%kcQ8g.4/%KzϺ$A}˞*ù>@nvB ǍmN_q,jaaPPp)\;[b93'1>opٸ䜙-lTq:ԖqljFȤs݀\)ȊϷcc7iW*"[Dl/ ZS6.}QOjB\q=#G_>Y;Uwk3dfOVdǕ>aV;3b:޲ ^u+>L¹;CX!s'R Cvs|QsKfl`Utu ?}7i.\g-"| x{#6g2O ;c#Ӣd_9-d,׍]=p NjZv~ݽ 7sݜ oxJ}#H)tK>޵U<fh$|s6L"d1Yd=4Hg ?fuǼ 5* xorA-Q G)}moAFh9|A>hڥKh7|庿cr^?tfP?Hĉ}lQ>A"t> Q?)873"I }BA)&U)}-ɼ7ԤasGz%5RC_M6rNh3Fh*Kmr5g UDJ} &2^&Eht"Ϩ@rt8-e(*C%dy'7`QV>8rl +f 9m89'ؘQ |EN:)XC۳%;ez Ƒmqd8RGqjG@cIzS"JNhn9 |aB}m) RzPܷ܁6,|#к˫Y3+?<?,3,`'l OFLA[iV?hnrr m)m&94S` ÀXqZs7|b*@ş_%pXehc0إtwz).\shk? g4@Yę㿰k^Zz ^*ܡd =^W$N'z?0nK8Vj<4!Gx=Y*b *cr'gYakD0v ][>bգK\2ϡdX';}2{nReemHr~t.g;͵9RՑYJU{%L?U ~WSʹS)+0Ugmx''W`{#~O追(bn]rjk[ 4VՑqh =-fXK/ޞT =7=PƑW#,v3^'d;OO3u`P8)wsԺ`8kXxf #GW`h5`ߟJy&昂,D͚-C`sD4X 'C^g¡^\?4θh[ޭA3\SOK80^b7L$pD>@n5ÚWmI)+bE$vz~IK%pjP&=ӿի`#T 9-fl0{6-G ~+"F^mG]3H u }Us`2߾Swݓ$qI;W Y8&׼jlX@} Ն=ӥ@ }84prґC`>5Fd7j]Q,⫛BhGnp'hzDy2 Of&-@43Wz* &6rí* & _da*VuD6L[.4s;Եqƚ㲕RxN8J z uP|1 Aĵ&s;$g_]^Vυ8$,z}ګ'$m[SO6qSNy8\i* :zp}0cjC&u3C]CUtԖ |mye*qo*6}kV*Bm!mV nFB$ WWqFmgtY~qr֩|`*!qV{r{Rf[eaꢗ㵼zXFȏ '. \<'߯)9#]Dk.]{9D?*v@7{4<pPn׷Sr k[fjzM%`MK"̽URfNG*>`iXӿ '] [b|qeCggNNdZSkN10rYGgi5bs8?v)9zƩG[̑ZQ8%w VzºZJ-u[F8y>Q,]y7xFfvDfMBE-{qfKDNw辛@?O0 G^KLnk493Igq([P*p8ܤщt\O?vhe ەsqb\rٽO"j8閹EidjPԒԧ`w[* kb ڑyf' %6}`íkMxC ~(A{j\ĉ??{da* *:.d >WC@lKU\Ie, O mL~I1Ю!~idvqajJuqݶ:RHJfީ G^n ueL]ė%H|}}Z;WÜ݆ҁO0۞:e::0ʹwj>`;h X3aS3]v'lO}91kbw^ jm{ch(p<i 62(vAc-OwAVx;'S`-e7 B?V6jo_LpZpCUW-$-D=@>:&i3:xNS",8ęGdr ЊDco]u="1 FO\xγ xzI~зb8qo CW5~ɳP|8gƏd$tq(c#N>QbXMHE)S F O6ؔ Uoo3P8ӽ篃V#>?R`j ݍy+X+$҅f@YVuxc54XvhjǑZCV:#Ho2fhLC7\[ r<!oLaJ$,Q$PָWgm.Mq3yJSؑq],1y; } ^ r h0D' C>a Wk`Zr)R(Ib)It60}ϗ2اݫ'V`1g}[YNɇTY18$ i}تNx-zd<#Jdaǩ*H/$9kF8b@wS οݢ=ߏw;¥WRilAoHBgr@Nj56Xtc._b~0 LqDWÑdp>MC(d“SoV `e7m`򭋍yU)O++\)>J?&ځ?cS`NT /ۿWP4cG 6vmF*wJK.dOuǠ AW"S/zܣ}tB|\A0P.ݣS47mʹvG50$|胞K%zU0Ԭ3\R,pr4'm8yΉ?`ߑ82s~5# t05YaWgPXߔ7B3D q{%A=vKY5|#)Jq  HJ0膑e@ ePk0uhHۛbzzsD(GrJpn搅HհsaAjހʵ!ոx/;K~:k>W~F9/'n^ _Pp}0gDmG>Qê7j>Bl G8phw"L>Ư㊠zLO6X~FWW IoXęG^n5)#B@r,Y/^w>r8wEgo,?cvFV$ L/=+p|;Һt/jqB=X/g;VOg#vQl;/tcvsy4BJYHvYJfޱmSD]%y' 7Wقq(3U6Sg2;.a1Le}Ikc,L[ne$[aVÒ]VL/E'uˏvp-UzWr[i[E{Xܬ!-Ug*<dCeI{kM}eR0hBMwMcUa$Jrv@< k ɧkؿkqahQ9 6il-ƹkT^.Gk:qMu \ʼ#rD{@KLj;>uG&a&VN5_ s؝4uWMTb_L+a +r?z7Q?~VӉ¤~q*?KvհD Lp0DbHis:- >7( o?UTq"av}pcEqW^cÕ]!0dƸ)=d3aY #i;PLpFu;D`ƫrxOKӖ("k\8sps Gƨ~#Ue iY9_Bn|ǩD./0Y|mSĮD)<Yv# ?ē?{a$3;v9S̫$4;J`*:8 JMMk2rƈ!6KfT\ҞdӍ bMOr*툫%Ա|bN5O+7=ASn >&p_ĥ1'?CS2sY3'bq[Oq,f~!+ձ׫Ϊ7ކYK]N$0΄"Wpp $Gii0XZwLߧ^zCSWi'^nM]%;jocՑx.t[zFF81sq|vH9uG\CQxX 1% J?` .]ǚT.b9[!nz+5EgپC;۟T]JH ߏ3j|Z8$zn *Q ZG!$6Jvt6C$@E1A1R<+j ,6C=u%mvp Y,:-&f2ž@[V0vjl ,z\#4Dcqr \_g?8`[.8_A JU%{;iB¢S$& Psc RzDK}m0!Z}P NNG ɦ(ur31i Tk~n鬝aSN\\JZkѯۙ _P%aiM|(S}nNy3:EX\XWM x#_ e3ֱo?p6.8_[l Vl z"䳤yX=.5//&#._g3rfoape!iI@y}0!em(`1Sj$+H͹ұ]~$Q!)FjޯF}&26uQ&ҽzˠ$.Gavn 2u)_/YQw\%)1Dd9-OxRδ Zr蕴h?wOnѱgJfcA4Nru. YDlF0IaϚ:yA]hIy1&a?U7/Hi^0!$[f(E@%J~½G[>#ԍa*^َ _7¢3 z}w )vx==vdQS_trCAV"=zXL*-VmpGa.,wuB\\#zp烇g\`i-H [i:v0^ (ZVބc&lQڑyk+L%\4j 7 K Ǻ#.;9 ~F oKꃚ3tm%5hm6;y)y-6lcɉק'Ͱ6vh v>[CJUofC2$a"2XƇ@יy9y_a,>JFbⶤZD=zS 39 U_/"qY1Ƥج׽U[Ҧ%tbEG^8D3-wR]6/oe\bأ^ʼnC%1c_oG>U}o0Nu5oxpeXn @nt#wcg{ۿ2U%um7~OӥҩH/ U%a։H]J^k%0cL+hY-Wo׏ y7XS]PS\nDlo_2Enz*iA,\#+;DbSbLO}6rJ5H+o mZHȼZƉ'sΑ t>4eN'u^Գ}a&a~hͅ~D(܂)qAW#Yf?:W ӊx $Nﰝ;P` 6xD@5L8 >R58+<$Xă4 `c=X2™ڤ ?zx9|L;g!Q1#|/9bϘKhi 8vHjo8a{,rf 0~M096fq-*Yz}J@R=L66E]j.+-Zj~3ԫ-8<v)1+68vhG+<(8V-~"`aKx6gx¸,sC/-Am6'ѡhYrL;puWK0їɨr r~(?bQU'A:|@X1, v]OCwV>wGTH㳇wS/ a$e =t5fk~~ 5 \MOhy@ϘRŇp>9ȷՑC-AQx"k?b{f~N\+>P*sղ tL=!{OltK>A, \,úU6[1vŽ..cX"ah9Tnkȍ9 ׾}!k-8fJ:y^>:j< 0X'pfw\z`sqpΗE;v;ǧVl1qm\@;lIYzQM3PYdZwYMu N-Ü ׷{q\lѝM2j֛I*Hu.Zcm?ێD^3 ߏ.~)[ogT0(SiSmW$@@ XiMGäН[gSj$ 6`Cu0t0hL*yUOW, s<|Olw'~=p2WjE^iz'/pG9` F9R"I5)~{c 쯷I$;km)XˋƩgGBת+gWWH#?*>a7֛9sFL@rub (n#5;HssX`1ݒ T!Gͧ79I%[OYL2z[2JX~[C;=-&No$] m,~&׉[{٫gpX0gu\_l-{|%m5 2ԓv[lzc6-l/pmdƯR7aIz3LuPSW z)} oBW;zyO]uBzFա}in):iI44fJ#2e; ;ֆu9Q/t^Eq|Vx^ mk`{IXs P" /ⴍ.B,>loRBw1U%dǴ=gh}CTf]yя? e&oܖI5nSW["Dt9?qΐ]2^@2(6 p[V!at*t#ಸ`X"ۖd, GܚUqr%f60kzD.=)<@H2 tv"N6(8d]bl[:uAlڎ 3*x"'yh?w%Q /o^laҼp_O fw^CWe l/Evxm/Nmc-]KRZ9O:Tzq8WvBA$Ķf,SP^w^{r-38<5 \&u~ ԑN{Ҋk&CY"u.I۔հ0xy+NOj'YX&.vhtE2uޒ/.€٢, !Í}JmvvfD}4C{2>X_pYd";|v2rlC}jP6&ap,(z<EXc}oåpAQ|.c }Y v͞ =O `֎.&7fqpǨ)H~mnk>n| 9H5ZbsnmqTHUJC.T2Mrڮ8sn&Z<$]aS((jGܿ0Aу!cX60,.zFŮtC~ ^pMd3߁srqHf$nK+>h׶(/ %R{[ `eC@L~;]@+Od0*g2wC/0veqվ ZZ*O=mHDnH$Ƶ;u)VmulG;!Tg/'T]vcp88 UEgm=.L~l܃>PCVߴs}M'g݌tد OhOEE!m6)FapϹ .&#E6\O!*n{(ܣ,tt{.zu\?"#t_ eot{I<%\ko Oo%psp?R'KY`"KRR0_[saZU5@Z%Hjfh%NRU\p -~ssg1W\4=I3w?H˷+:L(s~Y@8W|"NPHrqJ//ϗZHԚ!ȉ}Y=˘FM)Ů]{3i1ƚ#dpݡs_\lT|_ 6^<\ 1\,} *?qHD V*||IṯŹ[ pI}X~{0l 8`< &K˳phXI8;ʴΜ^IX3QȮC>")\N]xEvښB̷ ARrwV+׽Q},S< ܔC&m_K{ "aИG39nt;X㰖^5~[Stu#Zr6=u@T3NpۓDoo*P[Dʻ6 S0aqCt0N[5 B?fb t O5R_B],5c@u\$EWSmEz DWZWʁo)^Gm[b9?"z^񆴨|cOpcWҗ<*Y33h{p0+/ Dcݿ a\n~ZBsA}7qrCMWf6RTAMcz~V=~;RssxlD쇖^`s ĶSm{Mdjiiڕb`ѥ5Kޒi]"u.KiOz*ϱr38ecaL46?B_iXMz!ڷVܿNzs_µ3`C󂪩vpʹ=f)d%r`T7ȗRm?VrtoZu/]zjlFf.?\+'g ׋`r%u}4δ|$=|NٮCN4#%'֑tRXj+xn9|4kLn ĸy'maVCV_dȫ}'V͒aГ*c> /V1or0 ǖf O6Otvn;!=snz/mw\q~[6Y~](W)5\$vxE 2rۏka]tǏV< )MmKXH&foN+kUEܙ=;zڮι@Z I#'Y"IpPI7L0k׿+f!+6z_LXzLa0rӯZBwsU4wmdQRG7qTX$;Eڛ1x a1!)1\_aN >sICgozs 0e:5^K|'ҁDK&'!x3*rO'qiuD43 "ey|a.q~3KyW`UXCM0˺5> -2#{I{ۡJBHCʗR/bkJBEclqԱd!D锾[p`0vwLux;r"Ȼǡ0?p%068K~EʘK1!-7K9w^n`!:Bu_`x~-\d{݆#}:="t_O] 7(g0vJ;Zim'{J>vxGs`%j'j zJ6u 3]E"&bGQ>L?NX-ݠ)8f܊(0C)܆söWӠiq:q _WLn]W0j$~G*=A\<oMF҆`:l}ʯ;{FF?[PyoӎQԢ߅eq{S Sޞ1yrL@ok{Pc&MøZ%8Yy'- $}*n2pL0RY82w+'pHr~5PIcvڧN[C9o2G/<׋SUlɀ&VcO!QΙ%Z|$4Z ♅29ar<Ɔ~Xg?7IWUͮE Q981'1r_\<;h\-)ýyT]~LҵWAP(Ó4,{CN4ovAe?zZyv)0q؎t}sW RJ*:ov,r(=>Jlc\~7mEHI)8^m_@+xc1.$lSC7kqhƩw/mCZk#?k|~ rtg%B m?|=hƦ7Τ 62y6)Bs\XW>TŊC͏MAnJ=6C)q5Ũ'p}HXG` ]rZ~4qG;`%Xoƅ3;¬$}EoA 9ljR Y@-١qi_aY c >4H]Y;zDㇻ;JY m -)#t淺n3YJ춸R)\ j3{'pcᲗs MȌEm$sm{jxϥw]ϟBsk iap(?X(|q+ƃ>-8wHdQrF10١!6~L'NXтFַ8ۤvTfeSo`e(1|Ci(!*>ytZ8&8Bӎ gEZ$x(W>:w (|;ϝB3 i*U$0JW†(!!rFL(ϳ]`$R^I>TAR>dD[;aNE?S;pǛ"Ux:kz Ҋ /X|r`k=;ݜR݇0)t+μ.wgk|ƒ~|fݟ[^…g.⵮0p`SqNJSWC%=8a6b9R"oU}# -u>ctâtvm9)c5G"bVW@a"qna!{χ=Yh9KP::2HI}SqnBr7q̜P:R#٤Wۮ̚C͸95qhTC/4;4!l#S5juaET87 *?/M{-.+ VC{}&P|H^ u(: '8qp{&ߴLŌ(u:$qmF|qɬ/3$o &<ֹTWhfa=?e}{݂KA${ >ez ]i~@QxqAlc&i^9rDpyf 6ٻZ"y4_wOj.sv֟ramP9B M;{|F31˥y 0d3EjT76Y5H 0T;O]fh۫ B|I+sVCy+1tQw7z%};Κm)t݁nl;an+aa8'8ٷdf2^^{5hlmnEB;w ? qRQO lT/fG]UGa>'g{.denS03$a(J ÞDJ$Ŏ0XqK?64c$w Zecy?VA8鶾ІMG/r!x_zWVK/DJ@1qm VjZ>+騭9 z;-.jB 齸[Pw=439-#͓]gq22j[Z-:X~mg4>d+j[B8vE|$2ΆGmxpYlX}H>t͗DA_Hk}C-d2^]ꭕbY@]ZDH 8Qc(Æ$܏߷ʹP۫/ Ú8(d|=lX95ƕs{k<6) (]bc'gדTK죮Fyp01lg#Ͽ:^ k, ^(^VH(CS~B;.o?7r̀l,* GpcT[ f^ %\]C`qTHPәg%||=|h+u^i7IzC:ee];z[v.@VR.,z_Wr4\Bzp IƋqQ0[:n_x\)csɣlR!TbKWxN3~GpJlX{UæI`0Ye&^hK s[A([EjEH4J= ~YR! ; D 1 .a}=akuXއ:?âtN?5rLfN RaIɊ%T0G((Q;SH} nNm'!г?4N?c>5Ar!5Xb;F ]+3~^]oaVC o>󇡐\+o@= _^4i/0; ;}p@c1;~^‡(ƛkMyfJ5yVq=As-y$}7fbG/qDoO(l4肋\,cwx)J>m&%S&ۍw6!Yw`]kO2slm;;VQj7zLƢq4ph}|U"Ca„ pV/-5⣏^`_H^>L>V1"U܄&ǨH6`3NȂ9+`cU0]ξfL-Zұ\WO->GʲP,<=1LĞ}Lj9^Zk~j&._οGߙmg\"qNInv+9yQz/fPCqhnwQװ8S N겻ؒ]9v#=& a唹AX4"8NbdvZD(7eEk Y5.b=,S0qlt0'(NT{'θ7kC0q1э=l 2ΞH쪯*s'Jc2yR*?0ج:}.N_(?{5eK5_%ϰgk ^D7-'sD:}azG&hcB㷮'WѼ-ɬɆB'ǫ?P1X :p@O"ƵTl<e,T߄S-_ѸWOk~%b%`e3\zV@{H i< ܅-VnӐfP֤86<8wv ?Ppo=wG>c7H)Jyw/gv'M'B_a8 =N0-$`gxX{۝\1P'"j;6(U$p!+H&xT;}oЪ`rR\RɈ>J7wy0zNu;M&vPl8.[؞ =GBh,V9Co3q`x^X)ā]eH/7w99t-_cikwM4 Nձ7{-8˟qJe"I >sRf&U^ &$[wy1 =8ĎY"킯iBdy3Pgj8&ƫ0ӕQ jݚC֚q$G=P 5g7{[W2l%@JWz0.vY$ucgڥ.p𱯛sB%Cjz2qYG^M +=OFZMHS+OUݸa#S 5 >v}~g wbCUE[9 4gеFEz(k\8+Cn\/p{Ttmq@I76#ُ L+e#a/#]wXׇE] ;[z+W/ᆫ,Hvl@Jd (?vduAKzU()3Tj}k|&8~5vzwst ޔu()~6rO Z?(MpkE`h86]ja*cj<9U7+)~O `Y<.ãqfD`zABXcRO 1׊nǦRĒi蓻 p谘" ZSYl5G)%JH3]j||bT[7U?yKq:S}wol)2{q"ʯ5>Ow$?/w_f UNG-o{#I]B cRz +&*0%:yN<{o+JwXp⤙sY.4i=r@S~n/q O8}`~jЫtviF2(=vI@<b6lA MI/76OeP6uA1-;0HL9k-rCꫝ~)]TGO,D"!JI(Rڔ%-h'Hٷ i ׾s;^.~oM+pB kb%S'ИY,a]eގ[=qi ,Έ<^ ["m )^}mk^r^eнÿbkk&Vۉtk0` *-T>ϋobwu&N) ƞ.!uVuw lJ@Mh?φ}U+We{W8}n~C=Xz0c#Tq8#9c¥mVP _D21G -x*.++]㛼EZ]H_krT'=)戃BC{~saz,vX͙:`"{i5EdAjSb)9d:HY_jkiA4W5+؄ '{tZpn=6$> W}G0'6g֖f ml^X%C)aQ۱k$yNY3'oLLr@`W` ݕk^]2VO{]  fn Eb qf^w ]27ԕ:r269A8{ _{VI(p)e;fRYugR385RF&Uٓt3y$+ [N3@N:笝|W n۸:#["q$( Zu~ a-$(z} 2f0z~q^Ljۮ?3M[o-5{gs%?֩Y~`ȅw)9cciڋS8ο%xۣ X}5O>P }:[]Zvc˜PSfz*EZGD Pz+$*׵9l8٬O nԪoAעp?(nч=FuwhYa68;!)t:$U*)HWuMn*aޑ X|MN(˶V9wW֐)mr;oݻVFZi+>PQk죚n'C_9J:Ap OSI7:C΃x2Y0yX_%{jxŀ_D^g#^=k}?82kS1\H-.k65 K5ƓD$ڽ\S j:?pPEJ(U$|{-]ԕd~Ixx`҅fcYUUxƯgo_c8I4' &3\ITLtf(RĒu=IL0fQl@ 0d Fn_1{^AfDMW΢=䍮B~O1wŻʋ7ʙ+8e@eRqK+׍w fIJ 980kp$4rdfo>ˌ0'gj܈ކWF-XeREOޡSag{l}LeS +_ԪO)c/E4cle|tV儗Y,䓪&?NJ %RmU(2,V6=Z9]Юz^ 'NAxN|N .CmԱJ9+pV7y].WI!0'>qdĎX=^-Bl̀ΐw\t#m|٬~_ˡѓlJCBz}U%5j{__a\0DU8GR'iUoZ5,aV@l'FxB() S}@&RY7BaOG_ϬEx+P|9 /uMڱ.'obO1(ßJyՎc{{J/bgfn)ka)z_Vl\l7Ėm6a}'bBh^-tv\]Y Ր`ev%&_dj7ߛRR؞c= ~.v5%YH5i:>; \ FuuWX w"q.΁1,DM߰uBZQ&hxT{Atj3 'mvgLMhm7'=7~]:XzTId]*Jm{+ J#Na*T'&v_#1n_@/u?R;իq_};Гy#St5Dru+UYBnrqn)eeC;߹C:$.H.ra'eH'^ ?ܳH =zv\}҅/uE$;-Bh {d`q{wߺk)Rz%R &0a=:P^/g+J~Ɩ@#hy'\bQ\b==zM f~zG^z 9Xj@zN_GQ3Fd_r ybO%aK>;u/4WZOOڽpn_E}T+>Qei]w5f4pl'DqmGBJ+W6fP94a-O㎶M+[ku!@z}YZn=]fAa?X eDt1jV`q~6!֖8Ck?v_n0{{#25Spg~)$Q/?߭a4﫣3/ToP''g u/qwMvOpUt[)[C~&"5zP'SzıcoQ_iVb+Τ #Gc?fzyˊw"%o:Hp%ƍi Aa_Acŗܗ~> }j?uUk#{SY:vW䗫(ZCqߠ@Hؖ&5dWbc-C HXW꧋UJ3`JTѱ!_B͌zI9 LIH=eNO&g\$9UvuTOo&oKě C"-Ƃ:~aGv+op56KobA&̖kNXt-{v5vS+b-k0cN[v\#9EWcb~)NkR?vv,mVS†7)aizN`w1$d P"65ErƎ3;iP *RO6qٔ(ffڳgr7 SCfXOoV{Y7ݶas"9kWGĤ &/|ƍ<1M`Sm Zd LR,vR&^(VYBgx#+},_,x q gա"3;P94ZOd]A5l~ar뎟<7|E_p]@ r-Pe.-['nе+edjw@mUT#l۶-׿z9*>b=պ}j]@󝗑: ګe@iJHYN1U:i`a:_3ƹCEc{J 9Eە_u`ˈQh l]L:Jq R/1|5/ߌ#H^yO }v΀SIJGu:dF !_rT7 {E`hlI6mlbl6(A 8V cSzYҏȏF.c@k+,^2v@+))RP)Ql`'~3e vzP~Lhs@d4f:qxY:KuOV(Mbٕ}* Y"MlSQ w *XSYkqбoe36ԈLBm5 &KzmƁLXZ-g֚6VK#'?cJ82$F4C[^Bڋ}a[V{4=X+);3%l,pU@O*3 \Z&c'`Uji8SUmڂi%~5paW߈$3dh6SzӟR^SX=$V_9' a]B׾9r^)dSKrsA]hqH7Oڿ[-C mqHѼj×$Heދng8pbvelZDaG.gm#/9g$~0Բs/i5cKW,r>/Z/+obvq@HwjJwYWw,]DC) 0,9sg%R X+Ìī[]`PQ62&ş}" [}Ma}Ά5}1rΫ:7bSQj#q8Lˎ6}ZW;i0~*oL̼fԮs3qAPl#|sdWFW=.؋I{x`Svˈ/@N0k9B=w# ]gwCCo -?OQ6. s e_=I^;2y73I$Ҟ8w>gω3HWq1&Z?+8CrVk@+s0XzZz:+?VA /R1.9ʫ낊OkvޤS{Tb9,*-wAa뿲 r7>3󼇛T9y@<Cp\{t5NJ]Zg`V>~N%ju^e&]Rt *qn_|W!Kuckpj2=7-7&( TQƝH^Fx/.޷E˓)Ot[gmpT&nj@ސ bL{~jiۥٰ{疛<,v߲^XBGe.`yA]5$}\,k⢉܁7aލt2¬Cߑ2> \aQ @ѷ>1(|{}jS-Y ÔdcVػ< 0(7_ByL =3ZB8Mk:TW?ž 5iAuY 6yyNbe7O~6,F7aXa$4*:(y0 z`螤Nl"xP6KoH̟{ *܋0Aޚxmz ̿Ł+\k5<)Ow#IQ94xt~;u!y'ZA`pн({tvXqb! ~Hъi%X3N2h-\Y7~B~{=`u\oaw[J${f9 dou])8.aDph<($mQ[[?C8#~|wmuTu(bq}탘A/4Vsm3Am\"Pt2 QT"˜U4- 3L ;^jPa<}iSs+>Y:4ѽv?C=]ExϏ 0{'=DG3]aS18P#>܅=36@=`bx#CB=3T 8 [3E`Z}Iary}Y$ߏZ%?#g^I4(pdGzõP&&(-w}]ft{#uKzжx 8a41͖p/|J*nCgwPen!lYq0V&#+l/"5_+XluleYyr`4o ׶||mιw{pOHfޏ'!*PUhv1 ;%!X ᧳᥹([98f&cN+yb][|f/Ix1\ǒyyi"uC#^CA4uMWm^XQ%TILJtI>mS=:/vJz?ZZCI[J]nVOlz 0BZꅴn-^?azx2`{.|K4&(>J ԺRth}6rx$vZu͗/{ >߃ rٹVT9%ɹR6;pb@]%~J5 TOH̱6E5R8dhi᫦d8-g7]+W$ɾCqޖiԹ(:=-}|Rz8>B{;_ůz5Y::+Au_ qe&^hq t^1=x^& tkL6G qmуIgEuCʎLQHxzt5#:WyAҨE[ 2,z-H&oc;e PH|*, 7ջ]Žm @ˢ=]IgDVM7u54;>Zn?\'d8 (~oۿ2@JW иM#`Rhwغa!|t?b!D2 $84vރ!mMuE0KQZ~SrNKу$} *_F kSg :y9G|Q;a:PM@yVǹL'{`:N*eUa$z$ˤ@^F3\u*k=]Te 0aq :[Á-*4 `D܉UV%0ױ\P{&p<^(7NFB\<=#^2^Hrl#ܗ/aP|]/ctqdd^_D%:%6Ǚ~gѦr?&lKۏ}wJqZ*zqb;eo+B`)Fㄹ^Yo.e Qz'_Uʍ; SOUdIuPa˘8Glz Jǵ[ȁFlX/`]^ǁ9g 濉R;Jg c8| `dFuJm[>7a çP9aJe/̷#K#'KUj8dΜY9ؗ:&l!djQoc>#+d-U=!PO[q.| xV&ʞ,ڏP5n+`0. cܖ_й3gd=bw^11uH{6-_{Ņ^Ǫ0tVN Som['>3~3VBiwLD'R52u9ulV[^W#QUZ oLԙܰ`fF{;@VU8+Mm=06ٞ9ܙ ,^@]l( N 6ƺxbH?ppE@_H '=*Vg6m; S@cqq5ޙTj#y7 SB֗%J+Wv;`CT0Qx\ għe-ֿHۿ &f0[gVcec gR,Ӡl b[ \L‘ v88M$~tIJ wnů°*T?sTEqAsDef/+_}̢(r hV"mk;6\L}G"y#l.9]$]fܩݵTcs:W66a-oy=0J!4zo<:%,r9"щI8`୅Z45I1㇄2qp6nk nџy 4ǣ)l{{:,n )e8\g*(ܣapH[S!1Kbp9.q :\C6hə\s|b}:``Ol#/ %}ݺ@yG$Н[߯=c~c<҈°̓alk3 M~7{#l>a ӽ釂0ɕ"I C=e>'&XdPMϹck|Ś'`yy8px(|"=LLl=։׊uJp4^b?`o Gq( 9ݑ~]*Sd?)4CHyQL> }.Hij$ط`8 =ec\4 $ͦ0W9iW0^oݢa@Aqb3$[#,4BP%*ۏaEMq'`o.4T:l=MJmoafIE{8'taB-ِPT8Tm=݅IypK^\Rn+>pb!c\?}wHԞ6cg&W!L$er[CL CjJ8[K쯫{3J%mdVLjpn|[#WiA<sOdO<C9kl|~d +̝4'pB^C~6"<*-GJnJno)Oh9JEl|HZ^o/.ܾ F:0βab& ?7F`k-$~>n=HDY0_5[f ]l< VmJ%qjm+'8[>`23@חL/4O]IAիai@A< {(TYH܉tG;.,nPN`҉>'[vȹGmnBSe'f5S :հǗ14/c~Lͮ:IJ]H]`j5[$-'nާ*v aZO[4.^X/ ? B"܋ ) ),W+5ˡ;[,r3?:]0~ 헭炮8oLAh1|'r.Oߤ2n7הc ɱt]&j'C>$C}|شauߦ[0)v_18l)>.~?ճIUlbQ7  sX2C(MOv qNDI~iNwtC.ߚK~rg c@t5INEk,[>>*rӍz IBCh#1`_dX iuJDJ}KH;ba~mزHЄ_>ASͧD&g)q2芞Fv ~+yHIc֙ kgs:}k=%TH!efG*G>hm`{+| l I@ף6* {sD>®ʎg7xu#t0Cי".As{L`}C8tvhL-GBR7_lեI(J%Cn: l2gcg_i9X0LrRzdJ 7o얢LxnJ]V)GCu =CS7C2',hd TlMU=߁![AlXߧf9_o0m#|C=LC|M)=yhOsjlY먱ͺ6X a22ELL|?]cit >T:t7@Wu OEuXa{n>^e"5=}9og--쮹SUrOT۳)Xך8 DZ`ć:PUJnoq^V_v$IrGlCMb9%t##9.i04 9;ub^u['jKF(`/E+^ŁIu^K4MY]֬ ;X1G6ߗŁU+i\?-3ˇM+=ow{y*vQ}lD ^p`ˑҢ_ S҂V`mI0 Z֜ޛ\v|c<u_"6WIRugxveSp6Eǖ`e7dtɾu4(uˍ?;˲Ea;l9;$HDʝG:إB%3V!S7 ´~+ "Nzz P6|J7$ۜ3>@+"0 >Pپi-4D2<\d``ab```d`a\̶N{-1b㿘/bcg/`~Ēo`Yҙeb?]ϲWbcz?~2/s-6%KaK^"7ֱ-)DRCg#_?x1]ļ  Rﺑ? -/^K0}Kk;ߟx,!R_*s2O01g3e7H5ۗ/͏\_4[П5Ksmcl̳1O\\㯍B 틥Ϛ6?7L, ۇL -{n?2+YW_ӥЗ1?\C{ M7ߘ[%k0_0>C[~W.ѱ4Y]}Yr=4 `cu {/+/Ymc]K0\7K_kϿ{}ed |ݿmx@glmnet/data/MultiGaussianExample.RData0000644000176200001440000004432712400076470017501 0ustar liggesusers]i8V_o(CT֝P( L$L%EBJ2JD:yynmyq>׹΋>:KW~$@12l2o t$F.OH$jxQ1ˍDՕQj_ N2nvl*՜_m 4KA |MpN>M Aȟ_rG~a!z!hu4\z[8K$&V.4Y8ȇ9 Or"b/p ydUZ{$ WM zɠ[O?G1%5[ G은&N|@XNJ9cpd yl̿wh\ۄu4$nre 8t.} /ص]ia0s8t%%\=.M|<EsQq_V@3 c;=2m^(O{@p;KJ/z)VkZ݀3HY{pZ>J:ǝ%JU oyLfHkl؉}a v8Lw0=Po^6EʮC;W6IUn{-ވ9B`s7Ο2mcr Ia9ELwzonد9Np,o?L%˥Dž𫃛ҥn0} TIOz2c'r˫E)_۹4J5;\JԽe)F??,wsdô W2?[P|\NNET-HL<U݌"9M>A| UhnΗ^Yst>$+$\ub!2zWŐ({ #V'zG ^2%) ۆP\N:M;3]Ѝ?=zGt&O#ySi=.oCrʡP$мV#-ߖ6 ѽYaFo6kؕ] =ݍe /Ku/ɱػ;)W{t.$iNm8)I&Mpf@E1 9n0úCzaA/2/:i:m1уEPw(Fo"+:Ț7C؛z=t/Lxݎ`18qG,(l/8?$m`^3=+^ຆqQm{E1-IB4Nzjpg_* 1.~@kN#'U}b?쎓Nng[G賑d֏oI?ڱy xeEFEe*nywU&&b5@s{omnx W.8VD6F{ZZ)S2Y{0+c4Kk]vKôOA5 nYm Mi.H=3RV8㪠%`wrnXN'1d{z{! bVxîe^K!`)IF15h {~rv1lbm"0"wj9@KhyfT\J*r:)X{vwCgzb}ph'X>S\cx@]`i s` 1`[~Y] ^K%׺-06p>,䐕U[bŧ0J3^<%70#ް`ƟS,0=n ]JF{ p,[(9X/9^_ |K ߯ |Q}}{E0uM}wh4tke5:c؀V%˩ ΗMqx} .RGqCUXtkToEP:L |q+k#R¥EY0%0BSSǾ.-[/ i7}lz K^dj$~h_CZ @8|?^s±ΗJ}@{껷/ >`u v:M[p"Rҏ|~ۛhP7Ι䗡@Q^O"^Y%H Z!C%E ȫ%PQPi(vSΐvg}|ZkCkK_{WKci>y3PR~Z:/@ӦS# nYZ YL2? ޟM.aAŸpb>iK; :+KodU_0]()isE;qW2A{ƫojj5~+;bw¼\ĝ{귶| Ռ),籟2 >*0lPIlU[7|/ c 랶60?1.˲]tYZoxvB#% |3,|l7^~Ms8ẁۘW^2K 砫cJf8ֿ.l(6\V[+q:3HgE;T/R(RxzRj'<}ұ\ՙP[f3xS27ǧW F#sS~{8?YYU>B5,ݕ>mrzΠ}2TA~ĹArM#c W_~ z1=:Y;—Gu:ptw8 ~MAzg7|86c2n0W@sʢVq|-R7t+1 H٣(8PL4Slqft=nd !1/U3X@%_sEXK/ ;~\>ݺWF9E3t$nn2>{S5pzr[ /,]Ypu2-8^ '' nAC{5gpmNj|H1!ϊ~U\.}>ËCy'pcglӿi3[[7ې o;A)1y{}v[T9翅qC=qſyu\@yod "nxS./`]ܧo]s^)"OLS٩253+g'׊^G6{PWL/I/l>}ʛ=qWދNF;R[ Qby>ކwgpȤ[1 /4fGc$ySڡ|g2Mm 4[5#ϐt&e.Z018ԟ ~+ x'a?I2آNwnaL8b5_ɳ!8XT5Kl \/wv0AXg} ˌAY lp]%J>R_6wC }Rz!PX|5.AgpM? jT5,trcoBW,ĊDY\z)+A}m]7lLyw* h﹩J5e\jHüLݪPMFZ\$a0ϥ]XA::EC0Pea8dbv\xn6Qﻨކ#O&:gsWjt\Ƨ.j;B0:gN=˩t '@N̫kxIXxޖߝ\cɪ[n;>*۰IlKiccy_< b7 7 qPŷ3t?I3pnF:uNލym''eBbPE&촪mbzw)zQ P+REta^ r$jQ-``N-c2IŞyU7bI ^5=DЅͅŎ[~tp*8VWפ3p?0([,R[{XoGW3 ׎a !@&})=Ҍ6E*W8w{ݮC9CnL.iDnQ/}4<}za d|#޻>+[w\te/_];CӒ$qc:_Y]ϠKł8_vu/\Ӈ>J{VXQ,(cI71G)t.xe&/g`LZ0mP=7*i-tζ,j=! +V=,!rI}܄a[<1`%(٧=`4P!Ai9K.o l/Ϲ{ =~b Ӎv\7 {;qY0N^W(y?ͷAiP~6t^Na__۪c!a6 %mg%.-L8;Rx287ZyF|~4icV&G0鯶Y~$gw Ӯ|?0z8MgxV}gs%0ZZ3nUYzمSrvᐨE[~SЉH~РMJo]}$ш@n=kG(^6O0hMKzڜC}]ۢS|XxT1$OW_nfN837֝"!oet2}Ϫ-F#BMfc"#` Ȭ}qZ #椌r91# 4>͊C0 _$ӱ, ٱZʖxAf0VPi1i|Ҟi)zB0>&pl2Bp hW.41|lwӲUB)XӽM'zvJ(V%ŗǙz4WYP6;8O"a[~z53}>|e%N')ׯ Wru!է̝x@?T`}%:.ᖧ#&˾ ͩ+K*T0b4c]i Z&-(Meςz0(o % |:|EEgf\'m}<17gaLf='TJ-"%7RGLo7)jn:e"=lA`IRZtٹorly͉>WlZKS;7g<`qJLgj/>+M__B%O FXW}|ap"4ɮ92Mݢ/*(-v _fzW׻) 0#1 m3ې֪>AߞO(ЖMpkC'u Sص ul)T'mDZVΡ? ?6.WrkR%Y}:H3T'X~줣FDм76K¥jac_L,2/Fg=om\#C|sT $~H/=*˚ҏ=a{`-(K52߳ QQMHDzag$\WZ Լ)+pXcU)2C >yk6Uʪ5\it6sjBcϧ f/{%HJW_4x-aJ琎e)tΛۣGRo/\¬= Jz,)?ZV!avaUT7++a| /Öbb")z]\+^*[` ]59Cܾrr86{R<3D@=}82-V [뭕fȓ9䮃GGwbCoGxUyd=Ogvu'&yeҥO(8Vqu/R)xmF-`b诈NKt).osƛ=.h.Vq0CE"4/޺I9HړˀRO0芸anMFW)2cƎݲ`-iQ}`ULf=z\\Go7M8ݰ=Yx7)Ad8SX[bnhсƖ/FttJ6LSSCZOr'6D|EOS. 7l.$V2)]~/--HE_ma[75Np0/`!Y&ag0N6Js?|3z~ng*VXoeB[׿+m(q[c1뢋Tky^Q"J`(O~|R#[Y;クmY7-h- Sԉl#tpz6b=l.Yѹq /BwDD2I1(`+Pxt2Uxm&08PhCDE S\?|)bՄ9NfŒ_-=CL'+#ѽcP%tJ<ͪS7qǎ)g"qnVm˹a$ "O/}V™F{L?ǒ [PwDN&zk4FvSY`{Mχ20ض.no`8]ycB؍RBF#qڻ8-9ڪ%FR8-w9'#w;=ؖZ5m/hmc\] UGv ]"pdgM1t=<`(F4xuxtL$OM>вrb+/zI.\h0{}%)~AA`WyXY;4 qR B`Vy#~7 oFIǙLv7=YuNmi#V"[A/7@h[e_)qtLЙ=̐ZpMjJ?0w5եn]RdQ%hzTO*c{vebڦ5be5唼bwX~NdƟ113 GD"j6l]r6!t+uлj4>^ Ą[/Kqlj]Ȃ.|j}%11E&.c9p_e4L;y.}Bj O_p/vcȆw+5dx{\w|/c{^A%տ)a7U'@٢z43pā\ fNz ): -@S{_iWNs`mE7IF}H{,O0I;CL8V]7.i1PVlǒ%`í4[Nv(&c&Cg8BZ^Xw~?t]gl?4Ga15c<,qs<gƷ %Ro_S (O8)+iڃ]RH~ PիN2=.;;w7Bm=BCps?s ͹)z$)&#X-ptVۄ4ݻ_. pP$.gt<(B=$z t2jP%z#f=Dۿ⯕[J^4c\+2R KaNY3,:K^Z_ t`ay Za%.?LbNl{mI?)rlbV8R~288lٟL: nfV{y> K^ʂ]IEf  _"3v7GZ^le)$K7A_kq" GD \!年mOG|+(|SiX܀Z۶-^Xs-.74l>(C৉Q0AwW ?8'5HnX\ߚc\k|E u)F~LUou|(hsvzr`({}@to-鿜 U(wTWqL){wW٬/9oުAeOn;[oKoKZa(X`lzԟI8"¯`ٻ4 |pC6nKqh5ًK-$W)I9W5s-,&ؙ3ywìE[ 68];Gy ׋C`;\m)N?x5] (=]' qS y0."b_jҏ$؉o]aPZu '$F7C%5}9+Ҝhժg%/Ȟ҈|&0_0v>;&]~TU2[q4U&nl;L0Oht]Yw/|͟?n=CoģOd0eR;%+s=4ϊovڄIF *8ѬޑJ4#c[r]P8'{#,V!R]Qk֦0^ eU7tDjϿUxgTjBceTLص9Cޞ洰o^.2E Ƶn_:N)H:H8cأ{AH CEUq`ëOV78a*hset;Vt_Êu:u*I$<ުC'ө  Rxu}2o)6H4n]B,6]=N=KJVi0;;2/f&:}BF%I[BszFVk!f|Я)itӽ֚k/~'߳fL/AxZ9M4XsH=ZJu8N~גƅM7q<ԵMMn׀9vK٠斓5{. O*PyxXyN([f@NkKz07S<0j}gS 05enGVwp9`o]PzB+ba+k+]^ŭ1"lW-ɼZ Bl >ßMY #Ĺl[i,ڌhK^>a4 ]z0[By AZsz#f-ʢ!~|SzB0Rbph֣biشi<+s!2'mcY4وCbqF$ݷ\FCCB86SV2 J$LX>F5Dw+8ErYIFW <0y͸rk|nIx),]#eY^DKľUG}՜0 ε)vG3f'G35=0n5a:CBH;NAA]Y6u6hu; 1 eƹk|3j~E,~9 t 90Yt?dS6 7=~iMzM*+ɓ>:ma \mc9Eڎ?cNAtDuIWbp . s''WaJN\{@jrRqF W4/ ٣ 4l̰{Z8Gc~ݑ[ Y^/wߡ[{kbnT~ʪ&β7Lb0Nݗ~g;V{^4 ͻŸw'*@zA +v~?l05r?MFH 3|.}\qvY}q۶ܬ,j/Lz,JRmnbw6_}͕;סw2A{=[).ۏCm 0%a zxpzcI4\xoz, ]b2`$ڲ?xy;DH哻fV[5,Z,HƂ5m˛+njdT5T$ޖ|N b[\`fQH.Mcgg_A-2)PX3{ 9s17LᢏI-~ U+Spz?qw7 k5:6 Ral'G>=wLdN6@Pe~dˊ@kb10D|U o(e׊Eg2,R 0 i5CNܕ=30jܔX8䎓#x mDq+dּ_ Khޖ(!ٱMbõה_WǞCA{W"~W6 0J@GE:',A3lV;wlA!T(ÎC,3q囟`,Ӱ9+EewoLd+H?l`g\9qAdGX:O׏Lxki'DԯZ+c`G,z;ƞx4^ˢkz?,qzqb sڔ<$k-,ȇ(:6SgJv#L<>]Q- c i, I"dgE+3)Y:5 Owg#r 0V&K*j}9*piy:랏3M}`Y1ql{BJ A_z,3h]dž3(٘?@ù'7<ƛ;aToMF2]dd A[!+A6lHZ{Zci š"(nH]9sGeE6IT )${+F-3Ets+ۍHƵ]ȇ6F\+'իA΄3vb1X&ps~^ qY}!N)o|dQT.D꾷0y+s2[ e62yf~žE=2P_'kSJ|?FY 6Usͧ|f&}LkO"׷^@o|(ɧ,_0k-A>]#|l=;]$8g-uY O'N#ih%<2QBW4Zמb#hhAfu7}clt{( 0<__zkYe8+isA2/'h+Hhqw3K\g$Ebv3N7Ez;NAf9ν^Of6`\}- e1*X<,x#4K;|V*aM=UoWl CA">tó@m o x$#Zl IWl>ziw9ijۼ ' lț}:'b[Nafq1Nni]I˖y'TMfNQ2%??hsS\VZdSRBҽ; _Ē9w7!Q$޴?ц^7,tZ b}2['Β 0{ f.}>+*#VJ`{Vqϗɕ[MU,2~']%ɕW|4H$Vd)/.SUdR6ʾMWa^|V (Af112\P@Ma}O(9tXhVL} so/zAJVaiw)o.#d%Zwk앏p Ab} m&Xf9!jg4AfN5u~^I&ݛ N6!\><Ď%ɏN2Nr2Klc:*+Y_zzP:|ZBO.j 5ofӯgS 33-yآ{VoڅTª^Z2AY!%F$3qCKхcNU巎Ef:ٟNfy21~yԘ*O0Fno9~ l뮼j:2{ueH!l9$d{ sτxKf>=$HBIu\i _/b aJIٹ;A?A0B|& Гؕ'䓅1J䙟.P?e1mǗeyqf@m\LR>Eы&M=ș0B>'W ϣR`L_eܳwf^炨i2WD"%6-d wk̷*HM>{2T9~CEB)_%c2sR}/ w3آidOO]~Õ`o535N0P#Xg|A搼Y͚ *x] Vq4kgLϱ(#D۞R8B!~PP"C`1.;>#n+YL;?BPp=Sk$D]E<%+ d8)g!iJ_F-uyտdV!N_(Jү] ]S=Yx}2Vh%o28,S q]#!X#?WalbD(% 4O!8^h&짙8 rm)~dXK’TOeB`˶Q ?6^FopuLYTVxnd Vw.KBH.G]]!sq7wlXqr L/ط%M~#E1da&=~7n+6=P#V"Z3*EvV,].suqf}>Y3݄~r/yuw8SL$Gl'>X|~j7]e?/?-i?Ep^d3Į&y8(ѣ51LyN񬇠%W@$Ms)emHNٌ\;9}FQ$CӇ W@;\#o훓)&dҦ;hNaЁ_@)=ß՜Y03K!UliB_#ݾ[׉=ڮٍU+*[t! gNAjʓM;5~L_Xm="anR*U/QM{g;[wCg2DQVטЯ2Kglmnet/data/BinomialExample.RData0000644000176200001440000005526212400076533016446 0ustar liggesusersw8}zq.KmzJuKGubq)+l[RtubK)>6-!eߥN8AR0-jL]oEz0܋tRhMk W,>sw6ƱfN;dt C "&IK=p#i+E 822en.4%{;XN$P1"΂ 8X0$TcSz|}[S wUX^|dS7Zicіla;rBS҆ߒ 2+iV.z Pu<g|-'|6k{G$ @o򷸗Xr˹>%d9Us lvBPw ~~A%~d$-Unw]%|Go Wq:5/*\H:(S/@C[bƏŰ| ۳;lp\y '[;nc[V {X]-Q()}a/ނk"lMoο-72/P^oWDX!EP]'pup9:sk lyG pZlX7>%p*6g<p;(X9;X:T8}9hfeJ7|\)}^F1u(LZeGs+;'X]0V1o8DMQ7o3BJYo!%d9-y..wMFtf _7/UG7$ćH1hC@d?tmiDeqTO{C`(4H)_ɵub"ش' rk&Pfi¢ +A<?Onw߳0zE/aL)?*;D)kC8}xu 9E6o+u$=ZMq凸d!/LyYkpJpN݌ǂSf.{z8qu\3x`Y83S_DŽ#8ΜC73< 71j ]-kr񺧰P~S 4/l'cWgnek!ɏpU2ޗB׽S󏭒Ǿ~J Hz'w/zmnXz9 _ݖdCl_?['o>,Rc|TU@}YjJ;BewKMV.qV|?^0m fj@mkئGJЂ!)'ݜ1z>jⲞQOa}'v~o$ޣ(@|>lGrA)xzm 9  =kBr ?B)yGtLGPIm W[mtZ|t: nHCP' lJZI$AtO0]'S (ێJ]o@ݟNm4HWrNJUw*%(sBͪi#kXN:3-J/PnEdp _뻿ly8 ^m.ցevOkkUo~_+P9LRQrtI>D[h׸Lنm37_Y>]Y_QNlh;t2#>>N?&垡ai{ʞkuJase\yDeN'H>5$&%Ql%Mn? )PoaGBܿ\L*(ztJÉSBA'F۲A?.St\3V tRiWsX9WFlƥ>kj<,1$p.69!5Ҁ9? }.'wopUp$*;_83:~2 ߘ}ݸ}W'I+(1Cz^,Z]Gr22K =)c4bM|_gF+JmflgpWOuЙ@_b2E :~>%yuxŒPU0Y*YuR 1Gݴض@c7 BViD-òf@XqgvW{>k&֊ηdzl~37v͵08x2}]i>+D 1: eoc'MѵS4Dy*0gXlw;#ZDڹ{# 1lqv,\LD˻ iQu X0.v$9/}AyR`[7'ZؿTZM,_{]-\\M՚.9nʡ*za?G=BӔi8osϡ.<DFyZ`S"6wv@ʍ6G*#nD*k[wmA̮4Ԁ"8V.GvgPGX/BCZj>8cV *8zəZx3!{޽s ?s\z=֥ ۮǷy*849]HJV7g43\А`})ȥM.#VPޫ &\4P64Q=0AN i>?B=[cH䢺'4E~ i}k 豠NA( d^& Ci'e`3 F[t5Auoqhg";i!G*Aw&Y% 0f/.*~tPý2ܜ hC;~uxnve'a8A/dK.y=] WBf\LƵB\Dc}~X/z:$~}.QL f&^&ySG]U =U'?^m騠^옲Z&S᧋*Y-!7tfSu0 q-GII rK@)bo:AwcG5݄e0GA&IF܂,nq_ I%rq{]8 :O=Js(kbẇv ޘ?H 6l>@)#R{ NN淫:O⿠a<K`@SK:*vw䮶|H©MOoqw2\Y\r eSnH$7kxRw290p6ڷt.@wXБc%!,٬}:ruAi#vJ=PLB?TAS5 )YXĂ#ϵ#aڸgK8Ee6n`e07]B5l -'g\ϊ|mU]ou\V+z},Hilʃu 6I>hJoqՇe/<2tk4\5yRGCʅ}>#!¾'@ʬ ݩ8|dfCCӴs}kعyv4Ҏ_eF]]رTVt_ktliXITvhKe;=2i*z)rן?ه/~('brOhY/ÉO=)S4r_389&lh,/ivgá`򏷺})*vǻ/KҔ, =.x cNɧjgr3,IT09srqiLtìOpMӵ!Dzd$OP)3O.|QdIU2gu; +$v¾>p>s'[g;u LN|߯ғ/qFV4jÕQn0C~9L&>TFCܐP`JSYQU[N/`,*1VipJ ;(`Nx?sUO$Rؙ!t%WnUG`e 8N) ޹;9 ơT}眫$EqWqQ&8v6%*J讅œo:HRt5OOƍ;7kr+I\ps)i\F*9qpSo-N}s~g0N!=ZFQȹ8O\|j:0di$|pA u|aM'?d@]+D]"Q%h5s?BpHڸkV4TAjڕطq W+Ҹv}.oXgq)nNOj,da~a"\zЎ+vjaUš@q95OECZ_$x)go"w˜Mj}h[h$qg/H/AK C8?8p&t>3-VM=v{?r|H Mi )j_hrl-qg-qi =&uKRjp޽ eqI2[gAbS sS;{e.h4= U%ymې0WS8CCA/K{S,zƑx# I /׼ Uj^ GM7 p$@˽3X4@AAs›޽5u֢o-Y}#I֓:Њ#t|J”+O+~`#(/fQvZZŻ[i?K^36N[T@f|AhephbN)iN\`|9:&97z t2אq7 # `+9 m\m2T;-H-},И]*k$k/ȳ'' xQWAsAIW\Yٵbrzu5sӄ%SN׏źJ8c{!Q8Eҩ k^hqj8!=\I{g*1s9 T܏{`zti>GÁ~!ja Tգ"S`Z[w3,}f^7bcndɁ B[Kkzs熂 ^Z&Ԗ]sSųç9A3Ɲyrd| <b Utb2߮`bcףSX~.3H9k!Bٵvuϐ:%%u]Ϭ!i5dGN4>v@& x)06y屋&:!Th*Qhd㑨8 T/ZS #˶’̱S)s/*}wJрg6'_I\⩝l˔K'L<歚S߱EHȎHpSqw LɑeE[o097l6\#Q ~gP`Ʒ^cJĀ0d9RwMM?ok8*MY (=oa`QDŽvf9CgVyoc,bOsa^(>ZeڼpR).xT>d3a@bώxV͍J48&g0hjtqn=޾I_; 3A.Ꮅ:gses9 w?۲#^⠈6֝@f)RVL>./ Ko^x) N2ʼny$pR=%uz`}sӔ.\'@?哬dt78NzVXl+[1Eіl3푂9i~; y3|9ٻU1 |.C%ߣG,s+uyxeRSH E jp>(fKQJ|7M}o8un>_)@~uY 8ͣc} i2ab<&?f9:'bɵ8bI% .JrnJocn7я[:chhw8QϮ l%V_0ɽT\O+s Ty:a*F.[PÊVQ_#x }Qno[R?cУXSs?/ng]mdo~;ϼ6]dI#_$x CO;bGٿLh81|[ y[c}}IzX]p=k-x8nctL΃u%$R];.}*@`زc8#|p'b*6c?=5)^A.7vNFB̆Pd5N;cz`M;4.9DI6@58DI{a;K\II!7C NޟZppmEr<,5]VA3Df>K8G f,bCQR] T\uB[_K<.lƅԧy!6Tu|ϫ{)v/#4t!O?X~>'cw(#`h? G\?pӝK؟n^ ^ݪf2LaSU^TtZ0lЙYJ ̊՛U+gjo"K{0Ѧoce "֩%x5Fz}>C&xYO~NZ_0kAX{fP +X^B av.i*+AV<͚v7]#%mkݙdpum # T8At^rίj`%H/'j7i P#0Q.*~EAAVwkqI6uK_4H3wpd|$;` .2{E L19w|-MfN@u쿨9P0 %#re8{f_XH@n:Ooڰ323lءR i'?ك~̟ɑUM9W5Szn]J1~ Rj!fnzS\>c# 5Q nWarMRkGK17a}7GԿE l ȆqUWMғj75N8!%5z?8o [D;VӬ9 4[3VV wugByׂ*ѽ0{4aى Ôo"˫kx3vݲVꇱ_=p g:F-Jء9ͼG MEWn^eG5vBG߷WbGq:9;@#KӦgUpR[wl1uf\iDꉰi!S*FMl՟ūjG0b詢#'a@߂&4KN"C.V?aǜw7lKK\6, HU-[~獠<^*^]93 45>BEJe$}_5.x3BI^Eh^r oٟזUsā_]F1qXc]t-IprG- Y I?fo7I8V .Oh? tƙ@I{є&74Rn>čσe]9pTL>R\:UƽJIw*5R-/PH7&=q%LMq"&c pߍQPeԒY2Ox/bUnky0ش 057ElR+,iǀ]yۉnXCҾ_t[2ol>2"qnKZV⌬8l|wB5Cav]T'\X7~'.dT*ͣ!ssG?a%s1{\Sc3'O;]%πuO&b J\$̨aMkܠ:/ͭ}Ӛ:'XɒD )/t{ޟ1p4 ݻɾu0˞drk%v^P˽QyK洿DCаrX$ar`҇30$WN݄z30+v~w dM!dऔGwkݐ-P6F-U,5Qc":8{/ 65iOP B?B#TnK׵q0?yQ4fZ{9+] _^1epY԰21G_g45\U_E;u2f m +`gO[\avØ@E\~:o{͜ێ ~ɕGV6i-yް, db᭝ނI! QkXj;#3e _w@NBg;P/t=d(S(޴BItٲ  _ƿy*"vR^6PWHf?/# /i9&@pN?|eNg)cndX7D2 #?J8*[.\z+W#'nZc˧O`?Te8X迂 ~2-;0} <6Z QJWQȮ ¹|i eTնS߫,MjFUBiCR&&N;ac3[h0s"W]X["HsĹ`~%JYH xrzH6:ugdzR $ `BTLG'ۋd'NC@,~zWމeݚǃXKCqߤ+0t}b#xJ\iGIL w8Y1ge}ך> egƬ8pbcY ?7O>ST^;@KOܳR}QX4*vo7.H:=B`˿SM @_$Gf0NF{V8KG܊;T'>T \xg /3EҠa]~&|{zy'4#Bm^X?[9xP$0E{ۓ><#-C UaAǟy)'{ 5Y fE8ZJ_oNm!*͇i7QaCөk{0Ud"D_PouhOOCgm8?KVyЋe6.Cqbn>sg:PzoIVţ{^W{/@ق$&{\x,t-Hx:nl2bWpjG=X5& -? s.6=PihM S8!t2P!d5W'wu'FtV`6+{:7?{`=6M%r/s[qSzF|e2::W9L/[\W 4h'? kkYyj.j+yپlGRAE7`ؒ&4 ϶[z!C6aUsy (&W=i$o bVb 6y-ڲw?=|t̹ןˆ&XeZ>C!\B8)w]!R?";f^;c/]H)_{iy蹒]ʟ6ɕKd z+F2?˯3eh`Qv._(]Vde>6.DZTՎlxĮ:4G8aT8]{LeP=zӗʴ݃s_c?kJ]8*hn~1Fz=%cvĕ.)s%r0T]ed")Q<ˈD̸6^5ةĮhECmEwwaBcw(~zCßU}0VwoS#>ۼ<%GIڝ %\7[Mc5 lnWͽ=%ʳmuлe ̛fO|85r9\d-\ Kac8y0<<)7(/^ + Rt/A/ ΰ 59#Xrrenv筚 pHCqP|@df-R'`Dj%=9w9ōzGʽ}maې܁sB_ښ@};?Epjx5w -4I9BL2,pP~ﱅm >vEîq}q{AWia,T&cY}Op|z &~r,ʏ_&b[ys=67o cʳwA++QD/edrٿcx3Lg[ ?һL02k>8(hLu-nT- TTcJ6X߸i!{]pPgWZf^.y Mݡ/lYH,(w| n)ЩC?,dN>gҵpi{}{'HQKhXXK\kzN/\Nj ;@ŅE n藼2.I$ql{`W=u hu5mEIsnI;@ o6]({6{y:, c?{Yfe L5vW0u`} o2Pc]Wɶ9 &%[;qn8|/6)ټŕ؈YO0{>g59tFvʅ`YR1aÍze;Y x`M.(nl˼=놤/Za机x7 \¡pC &绤y8'u.TR>.5 LEiCY'1|rX| k0vja覊 l;WiV"*E*IS@"V^>謁REwc/ϯ. 7=w*JΔ}+Nrl ӍZK~*P*ڶ g=^cl:,v[QE%Hv?+ˉW8yq[4ߐ y"?SJlwa\A9K4$udkkkEذ}{L=-E8R{"4[Z 2cG.r^zC>rN4al{@(lCȏ}УZd7n}EvvC%f+n5yܬ #\ ga"g!z_7^jƳb@ޯkq25_v؂Mb .7HN$:\4<jJ0єfy6~+#I,Fs 'w8 Uj+V.8kӔV'<|J H&c3MF,@k?j}\0L}4sLx]Q,YZ:!@`}^b5Cua'=X#!*i+Y [ajSr;ν=xЦ*:j~|+BRl &3oG A9;<vliU3x y\j+K)ygat]]I mS:MqfغpUlOqA?Y(x}Õ6g60@SҡoD>Z:F\EM–xѽ֦gl1* KF“/0s#?jC+qPc0NWlW^}oʙٛ58}~wQӞZ) C)_ਨkNOv ιW OX_pyT8̏i=@>ޒo ˮ'bmJe\tdG.cO6Jyë[,`!~õP+$ ;F_BR2bW ErӃ:ñ~8!2z# CHgn+πE˵R0wbbIULzy ఢoXp>; lqUdWi=Lwj JR;󝒒9M:4W.,# *39p>6I{,ފ}t81+pNj_ƹrO:Frbr- 8aij0[2~~KZ,1}^<\ǁE+ڜ:[8ږ,_Y]bYN]%W)jl]Ѧ^<Rx!LDD'[es^RqX?1ͰUOIJ{x79;hRص $qP-.ޣōjy粱pݺC^mےNx{O k-z.)Җ }{?]lK$݋> _d_ate5xRnz0մl()nOkVXw_yw (5 {delAإK;p+lh>:y+>pjWZcFvX]"Boވl{H}[.ߥ$㬩_ ~ҳ( FN?/h;6{ҽoUDꮮdo$, .<Ү@ub:dÃ;de}; N^w$aJkӾCW P 4#$ꭋfy VML^OjF$=\O }~@qI:/Ľ!Gy?DR5o[Rtĉt@a^x1Ƥ7 GF?yu;8anePzsR.h . `]82sbKۅ-p[H'OeDf?oj0`{u P4%K幎OmTų`i8V^Z}Ja'bb Lp^yDtM3nwaOj'޳nǪc:5 z>%0^UY̡V,L𾃁~Q~iÌ~K*싻N{6ΛYņfJj4b;EܘWTggcX}dA~덂ӷMWWFqX_|oOEK}y#̿#0.l.p*9<8<̴ԕaFe%#)Fq Ǔ84!bWԑ0oᧆXj߾Cv߉0ӄ73DQ;$fė įb2`˰{an| eZ09,nv@Td)U+ -n p 5:Ɍ.YpuǼͫG0ÏkwSy?,7h\׼=}v֥;mBQe%䄥Br2N^*v/ =rFߪD!'Ya8 uM.mP"3} $.}URK{o&3w#ѣ3HGٶU.? tC-XsP#GJ%WbceuC}JX&=˄ԝ1:ZuM/O:oXMq2wdW7S^`ٴJ0de )Gyok]ai{3nSąIUuv$lTK|UzDyC̮puJ]-z5؍}I8~;JnR|lV{#({ x m[ " Կsqs:o7+X8 0.Ai:?'"MO8]A4{#nΩt#7lMo.q0j?P#ъ#{WsL\e8.o-?3b5rfzh%}x =1bs{>*~4AkNl@gӰE[ޕ{ye hBpVݟV]bƟHX21j:#aZ;*S| ѳZbEWSR/P@<۠FW*]t.ߡXZ"+>})mzq–~#P;.3}N^ae"ec'})7h.yW!qbSB?~ypZo]VN>I%}!ic1Py2=56|8I>2ՋN#chwe:L2$ 8.6";xĠ%8_X,>byD''_ӫ4?${hȄkLjLOwxK+݃orJ%[ffv}_t_~^O͌25gaKu7TQdő#v8)^O^T i%CÏR8ڥ*܏s¨܌[XёFX1ҕI'z\/7mx;v3X!BZ-׽1{xn=N Z~ҧJ@{DY8=_vx]]?3DZgD9ŵ"8s` .K ?om׍Gbjn?>@ޘF=PG23/zC%bd_qȢ3Ydq} +Mʼ@ڥħQwbEk3虓#о: FҮdWY8n}P5O0bE LY+ɖbirr|%(`e@pW,+>9^dc"f4~w[1j)VaXx3nc``߮oW)"D:ߌ = Iŕ1' Z0էd@T`~ͦ\sXeo/kNv8ܬ|% nQ/j?w{ =',2׳ na#}+D7 9Pܓ;N ԍ$ݰRꋔ ;r}oP4vwQc#?H35zdL x:naOU'QV+iVcK܇>MBpWhsL OTCuZataۻ[1}"RS(X=D1 ,YgĢ-`фpe\M( neAM^X,PC?2$em(lCi]pC +1:B_sw:Z‚еpPG\:BEw{RH՟DAkۥ0m_a'w1/M`/U` ,pû*X#c 'tr }w˸Яo ~pH RGQǹړ&1(Y^ 10I|{1'0*:wS"V$cEI[zߣ]0~;MUX$m,3 󭿯~3ՋG7zt mvYsgb RxmvARɎG@?7<ҲҎq0=;k1AŜX,ҿ=Gu\R:Xh=@g$Fḳ۽D"ʮ8[q@wW6\>}*<,N12{=8(*c>ҟ?R5gl3, gbC*IJ8 K!ёy1gjO ehV q~Yr$QlYL.} c,tmǥfy`cC ]ψ y*$%N\2r-$?PSS )&zkv̆eNE~qbaXDŰrJv&mw_vM"Qja߬<#H\1%1#6~s^šjK(n39B HrS5Cw@z,ͼO)A6޸=RU6v4rj֘yWX'CY"ctIdh(L zwGd ^\b{DS0?Cӕ>vȐE\:;"\53_¤ɾ&h7PŹ s1lWpu?}=au3P0^I$)]fKGˉ!Hv(%ms[qjU;.:΅^Xڗ _->ˮ`V'Eg ƱqLE Hظ sz֗40DH8w{_yOpS% *a鑦P/?Ď>;[x;L^}.ì&y ~ƍn:r[BQ}a{{b?t:,?pݾuGwo9CGAm`D=a%; .wJx\Y^{.ΟA潦g?>A)3n ~Iطl+y tJ_;eLx5,+0^19m}9i{rZflb <@./0/[>+GOi†mٴcTz [ _QGv/PW0]{IJ\Bȹ3ǰG){ͦ1a,yCK|{+_[n%~=+78?oݐ+6t-<:kQ\nXpTԺgG?cNj{[Vj5%~MJ-\*r]a8;͐_QCSLv8.Z,%*eqQk."-h&OT\c8+,WHZv=Cg=|z 㿳xÜs}c\X?zu Lro|3i F>M@'dž?@<ۮy9~ߗ<`g-03t 95d==<8}_m, B/j+IY&(IiA3o\\c%IVE[QI˘h(`Ў`r&54Re 7;gax7o5l۱OI}o'z@g'J Cbc,|x(ʪ:uZrox..'4+r\;C\֔rǁs|VO'ܹ< ' jA5 1L ?epG[hsr!Vv`˅XLo3Y\- cig^m-+}naDȾ¢-+zpߨ/b#sw|hʃyw/=5ˇKLH}l=,Ч#q0'譔H۶y|Swɶ~Vq >ű e/ZƢE%M.,-~-FFF"kr V&DPuVۢ맼6['qB%%|FP ȹ3mn@ũq16NuSj1`_Wwp hzHq: uUH:|^ B{KpuG Һ`w$)z%NH8Ƕ0wt0>JkNڅ/Zö.Dh-k~e:'7g k7}1eߐ'~ $ҡx"[Uhխ0JHKA 9cQUah{ t}ŋ!)QY|/ZpfЀ~$V]Bݻ/i|Y _w<8.;2@xXx[ <R ƻyP=x2[܁i 'SiIW/¡KCr}i'6ԽlRIx]y#ZH=K!C&۱Q~[lzx&jH`纹d$΋PD@uʷWx'fÙ#s)]jbl~{y#Ο9", O]rwqIgʱn~f;Pc.{Zc-Z"fMg5>!Ώ.ջuAZ>BfG"݉F2&o.zl[TOxm7Zdvzͥ:Ƚ5Sz+֊ [﹍4h^< ޝm3_[blb6W?69 ņyf#tDqv첞?>|j!0e0ƁJŋpHli5{P>Y5aEŐlэSQ{*w]u|/<\]u]\MzKݵif@o*8*:QRBGƴ5黠/#t#fXYO:%"N|=wwacs)-[ e ;nK`ϱZW*5W#իߢvb Pʒ mcunlm }Sj\{*M*Q4\r )mo`[`Wc\ 9̺Ʀ]x "kȅ fa3Hu? %ers:L&qdjIUwasg7R 9+H9 o._)ۥEXt[QQRqJ'b gYnDhp5߁%~|ND|,Q[n@WLBrLݹ40bQЪNKӓNhm9x|yFמaQ$.LVGStA% uCV`}>@y/b>h>d`r_жh 6>,%~BhC~~+gϟUI" j[a)`":ExoHF]H2&}W y`<)"g5TilkwyRc1x8.{-jv %CNVFt[Jnd|ܿ14"Sڞ $L>vջ꣈33El:YcSqu K2-#E5=am UtNXB| H:T9Uwp ilҬ'~GXEnEX&Br˃ػܷJdp( JYZi,1 ;}޲Ɔ÷R`։}:oZ=x?>}/UJRP)kxǷ&:QXL=C V6}Be:'iͼozU ӛ9iP(?0|ʼn #"Ɯ?(ifwlékZt)=;8z^F%v@鎕Ї8+xKOK{⋿mu!2̃-zePm |Iz.G߆o}v\v Lx +40'pٓm] ]߈6LuV8}Vv붗Dz1c-5QN¿9&KO^easO;XaSylf5'3\ y$9_ga9bV:No$ǵaGɔÉXbxR("{wA t+Mv ܽo=iV>"ZT?=OdJƅxf=aLp[I B/>$Þ m8fQ 1"["OQmr%2/fÕ *H;4(!e۶gpeU%VHƽ608}h-W- $U~) )lpvyə4;C36 IAkKUH9&|.Hsop&hД1#}¨]U)M^bJƴqGM?_v?ũZ=39%U !K2OnXn&F d ]gzjɗ8_&1,Xvmzn7^Z+~3Vt^B7` n򊩺]![Ӳ=;1d1m^8#HEN ZŖͬ0gzQi 6 D<%(a%Snq->GӱsWcab|yg[:: l^~:<-{ED%0yDVgƁ\ŁEkg QEmW\-k»^9y̷HM*l9&nu^P ɟvi =}c:k~C둿Ǧs/UaNÒ[fx_DZϑpA+,P#Su,,+zRs.SeB/[zb_7L`;,Vcg_mcҵjpH?hiNDx9ɾi?3 y~9C$y+6]mfʿ)(,IU6:^+4z \?}w<`yQ6SS'p1o/Fǰ!y` Q(H"}ewrBj"v^>YMl<j}IeٰkIp}pCȪ\4w,Th8/oö;o`rR+Y0)z̊~irmC7-Ǔxym&/N[7N;}>냾ǘrqAvmqzgk/N~\UĎ`@SHᄱNH+X #Zoq2۞`{2>&N_fF"YK ̑2z'(skgd. _="Bcm|@ #՘.K7w\ږPJ#?4l@htñfOAW=}Юs>Ou'@k]Jw!nXa~jsSGwIڀ;%\{U"Ep>83|6)QֽK0;`GV.~ \ggO\q*W67EqTeX1S7j6g_ *{W y3Ęj'`__?BNAq{{-;Nּaqۏ H+\ZՄV kѢ0Sio<},)*NT c.~r#8 53`}}qޛg{Oq욕uq5-bw?ZdTq/(-3~~ LʂyR=9%lȂ+1Kf>% 򛈁S+8r,g% ,?=95B8ćC0K(΄C#bn!`2>nЯi>e])?98#EOK߱y' ƞ)|0Gd5h ‴;rglfA|$C@IXyóUw4> bGDv5܍DYv EMFdX.G*}(;/\顿{,^8}ռaQlxrMBz#Am>`<60rމؓ}u>jL Oք`ٿcKisvUݿ)V#g$< #GzpVbz RkSE4 .k+mHXHi9qQ*%1){J>KrX qF0(sK}/`(%.X%]܅nIZ'xB*f~?}}0R856A #f7ur`btUWϨy_ar +8;z ᱦ#p8 ю09RdTt fG_|A=t8?f>kc " ;*,+H?ق]GY7IoxLϾ*> GV 9ix a2Ęd-Hp^ ,wO;-ν0>EX<g<ѾP>S8LB4!˼` V&!{2H8lkOkbwIWbnC~?dXcD4A'~D]ھmOG!@^P)p^/F ) /JT YZw_-gr eu`+wc@M(;qU&{xm9Oe9Z@ѝbaW~Y֬کQPTY fc(/k[d̕s/agu7}$!Rh+#k$j&J'=r}H 1g*'kݒ&bq$'1p|:|Tr7dT٠WXl?SKiѸ8Yə cB05ͥ s ÆZHO3Q{jp.Ew ~};I*˓ZI |P:vΣC?ae"F`#)s困Sw/bĥ.Gطx~=fxhbwyCdW?(0#qؗe{`j8PJzzWdS/>^:>H`SzaxK O?5mcHG0oQ>_G!թBUoo5҆a\ W ˺'J dOL9s`1H; кCMo$ :Zf8LRG1jrjy}k eK8yt?eF¤Tp#e@3NcElDr;WaG_Pzqt/ 6&9-Kn EH9!j+ҞfKNu@% ?(l˩-3*hȍ㿹2je45z u_Ld`ܖ0siKs8y?(v9s=X~D8轪!Nՠw7r-#5$tl-q8m}R?O" i2@ɶAyu+;0q1`-R}UӦIYnj~hFξ 2W[w=;)Dߠ(\{PV#gΛר17֛JA K7s}9Oziw>Y+Y-m[=c6h{!'+x{(.%~8;Wh{W ] -/~gxpz{ғ?ozU"хۣ[>V2 XOnzJq( ?(6|n ڿu,6l.ߞ|ЙZpZh\}g]-%Nlc+ьKVlT=ݱͿRt't6t,wס}ZZFg?G$ [݃d.%HMӞo`AkxE%n-z^zhw[nÚGk mp.(H}_k96J[rV(?٧CY眻Ɯ iqCyC8 zΩZQ y%v% $6=T> _"J]\?v,K]oUj3F9<p л%Fkg zV>땚!WLw %k٢]u!;Vإhǯ8Py' Z^;*\M_ G|`tW`\JdWAWJ܍wڤ \_k@K[B \'iL4Ӌmu[R?tRaFЗ*8(6$tPb]yc\F1 5M2r@ʋ*<+kpx&I/.@@79a)dJt~n+ EX%Dl֛ソO7? U鯮B/c teŁ]߫wSoGv: Ir6ĆCgoK_Fъy0q-z:;D;ļ3Okh(uo!:~JnUbu \<v=x왉"9fՕA ÉC8}^W|p\!u=EE3d͟i62ŀ>*92Ϧnq8eOc,~]Soec[ԁ4!i.1σ|u !cO 1]^2Li\;d> ~k\!KV3-aA]4WX{+m|RrGL)&!7$'-pɐm`ZP^ݮ'3Bv]k!y_f*Gd0q{ 6 ԽS?GjG"އFfz'ҟ8f Ṡ;MeFDF8:jө;`bhQnu\}4Lq&ɏ /N4k]?gd>N!IV'U*xvW/؟>4*WOaq ]ť'1N*e-~2Έ';Ɗh$QO Jαj¬葁Y:@iO u"kϮ@T SWef#jvչ8Z˸#BHBx0*lCo0#8=dWkdt025 ;T ? eKeocˤÚ ԥ+K4lG\ grR 99)YuB婰.~~gPIKY6p\YVY}qX¥ʅD>@iP|bg,`0Wm.^~"_}qeheo+wY݊YnVXT)ekȮa"}pY!pTogޱ')N6]޼5!}.v uZRA_ <>npz;?.\"aͭg!=9`Z]'89jqCSa\ҳ*) M )vԹҸr} WU_ s>6J*Lor[wJr&V==j+FjT;4G4^0)'2vzmhlbu!l>{&p'V*/9ܜVIbuTW_\&9g8#E1ds0R=[FtObG#˗)0mJSpnC^j8sYD6l; 1Bog/.Q pP]Oxlqy8.{fZ>$ᜢlb`LIToߗd¨+f- }><91iAڌ@mk c-ot%@7CNV%gVJj4k֊i35*=qf"yf:R*߇-=z@}JyBHZ>+ Gx~|_[iB\ALXx:|U + orlƛ*}bƧZm7Ow%SРh KIoq͎1PqwzAgDr5.:h;}bt NHv$RN99e>CfZ3{la@$w_ފH`+آ350k V _}H)sPds?0jV/+ƙcIn0H93g:fI0Tzq $"Y0=| _Fhqj#b=,8*u  H\KM-o!yǓ۔o#L8`\S0|?ƒ%׮-U';qy)SyJ84$I6csqA$9%9vFJnkݲnmϩ.cI aO_'2lz@i[txm Dž0$8_p %ކɋ8:n-:yуk_vt+Nu7 ~m@r\Y+VNdQaTTS f,.)@m w3*ћ%l?UX+,ywGh(-/cvA{ca6Ts͵5ҽ1!~صۮ ?`%:Qf5{bF{8}?ħ[pC?%Mi_\Db/\KO\ Iԋ0]&b{n@#]|$gɰ[Y^@2f7<\W'a׷m~g94=SL]Z;2a=n:v[KGTr#ec&ɭpl|O*]:+N wv (W~:U},L þukk8Sr@)z3~|0^jB$.=R`Tnj\e o{ksO5 ՗i)}-^%-c"G.u}^՗eGEbm(.Z͆0? uy4?=7j0߽c/lvh`ݽ+TvÄ ZnUDhӮ 0}3Rs[ eҝuh_`i+:~z { _q,xi(kT6) CaiH 99/5@[V2~&21Y6۪CB!NU~^{fd(ǒ0X? \4C"s ޳#(Z˲f t95ydh[=R5eqNM?ΰgkSW,s>C}b -!H"I>/;SxA=&BN[ay֫` |=2B`igahQy_ro~: u0#[ y CgBc,o*&Kjs}([Aiolio;\Ho.|5#I3W<g^z~xXxǦ/iYu!tH=϶gOԭΌ+~H~]a4K/r jO6Xf:%6w똈sTi8Q{jv?T߽^ߡ5m!仰fop]U Ϣ {m-Sş\_mhym<,y.g^<<6 'Wi.V $2JX"@Gf0Z:#_3]8=`%i\Mi'Ga ݮI;bah4# y%XmU =9q?UWL9qJIȧ;U.xlMY0tlg+ 3Zta4[s(:s9Vvb" d3'J`ް*\CbجLW1x4raKp,}h;mʻz 0y/PͧMRrׂBϙ>9–Q÷ayM㭔erkM5&8X35р^70RxRg+.Y@=|U0R_YϋĚK' >Ti!\dUcQ[L{2lǢG\K/q\PS&Ԙml !U3d-=zOuwkJ(+%ކ n yً&<1%mu Wv~ ZW1I%X6Nµ-nkA-{:'v+5ܩKe\E-BX27x:Lk̇[`8uDUwƃd#(M|rLFدFhb(AʗKu ƭGס1^P*es:?sq%v@;C4?A5 7hy.=T@_B]Zze/8 )Ny"-S:,;.1Dߝw? %Bnh&lY?}?c{FHvfgQ]8r-hi.ݸٴ t5FPmYL+,̈́c_8ځjoY.N=xGl "0@M7ep/ pJoە0ڭ&}c==,nzSW TްqH-,[X+-."!ͥMU..AB1 8ݭμ`T!53ӔdA\~s%S\۰66U>z)L)љ/8hR_F;{δn5vꌲHQY9yʌ=Ӿ-wfg`78!{R$ujWU!&+2IрV="ߕoP^ B?pO 0y Я?="?nکArC@ UF.R%qѾ%.>w[I53,W>ʭ *sZVFY㺎*QsPg0CGY8]8iWRnv܇#/YJL"] _-6mi>3.GJ\b: &qŌ6@[JqJ-d sBݞiLH 㜑}ΉUe[vth'_eқ:hl*yC6"Бz+Akҟ1|&W& p28it0)=lAɃ8 ]b4 >:|}jFZgmxcHLՙ.[C]l/X2+KCLoD[ع` ^|=CjPw"plt͙dͣAtc^S  lq\"sfJGV ПP3:'4pskASpQ^ ;?U.X&0,nsoLc[)}+9 <]ggXq6ˍgaK|Q d[ky*e[XțW i]1&Xc1\ MIIQEZt]+ﶟU %ո5k|{(&S1 Rכ ,tvU r0aB5;X>̂ -h_7\)z"ɵ'kgmZ (7#sB-UX'XF2OVg{~k6]ϖ[c\u:T5gm}zm:0COX,#Dr* t'{wڎφ lm/+<0RFmhgZSf~_3ayW\ Ϲ\$-lf bN1"97qsK8NC9/G=Aa}sn]ͨӍC`0^{f# ʢ0kɁwz!%6.vܣpeG{z46`z㸴\S.r̖K8LRL}w0:&s,(l Śĺv8OQL>1Zó5M T1OlQO|!!XᖴQ#OCWpӤfW v`@Ҷ˴S'I81}֪W=8tv4}%",>d6LF@ͷ>s 0->֥m2 # }PkV:w7ǎ9!ݧ8K<>Z=ӃA>X- IVeX~k-/N:I/f\t$Q\V {c-ıK45#=r}V:%8͋da Ȑqyyh0)<4AKy?:>=;Wqd֦&:L꜄9o 2 c+ ?Gajߛ"@cV ^-"?ޱS i{8JX94A\xsB3̾`_~1zReoCdnMmߓ;K طvtM)=9\0_uYwۑYFgK٠Vp^ql{|l- \klj $ r3ѐy6{AgΙ׽+,@_nj}8*("Wսɍ|ʠv̙fmoȫqy*'ęFgםUDf6歷8u"(=#XBJVm94xh{9vPk6*^NIW<4jUH(tpD'PT 5T9u:8}}-읋c+b*bSBfO߹~g)Oo;?ĮV]rS,;׸YF:LD>#2H+B wTC.FTJWO{ZM9Շ L@% 0 'q^I8(tשJ<2 ;}IT^XOµQƠd4b5y{TG⨂*ЙqQ\f'kwmaPǪIEXb;0 Yn_BHە+) .orxݛ<69\",NOj`V{콿lr玭pg0(#K&v`'cpl2I>7ݲ.jV e]K a)\POUaccٔ+R[NQ(0/zl9f}yTĆ"`\uD ;e| u9 M/3DOl3I\Ifyl򔪱Gӵ&*jpJMҡyߵ菔'ұU{Zñ8eFGDLq۵k0:im4k==`LVxN\ ^,8x= $Y 9ڃ';y {iKۈGa,+܈fǑܥFӲؙ  ǽ mӄ[7{hGcFĈg,-q~t?y"p1麁 >ܙF|} ))B07/sN@Khmwhްxw/ ){|c?m8Z}y{6i1?yл?+N]W;1ۊ]w耮mD&"ɥ'bCX>p - W+G⪆m+Wųka! tԓϚ ?-݃VȠԴ(<(Öctp+o8yYj.ahP褙c/,8Zǜ~?}3.QD,#ۺ6%6y=4ç}5KXUr` eZ+9m[֖tYa)40KN܁]8" J܆uoɥքHQ{'ۋ2WC_8jhP%e8օ> bu.¢-?o`>R03!8d;rdF&F{vGwz-$<Ewev}7;, WP9+awq1q"`óODwW{+ *n||6bJ&`7ļ>F2'$ܛPsbeX25:5iv$_ ||xN|"UA'aBj/3koI sa1hH;:51?$,\ /wsahܚjql&L+xԺi(8ܳIٱ<@C{z:rH,%0}C$%C?ˣ8#P1I4/W`6y%X-*$.+`Ȟ2uK mYsȿFF4'E7kS \0PJd.x t\`GTeq1$̷9bjTb{xwxu{k,ڐCx,ѫ9ϰ)ǥWoU_Ǟwdv-`W\y}͜nޕ S8sn>D]w#aj"`m*{3$(4*-ZKCl@- /.? mWp6BiAN<z#,?c|' JMm(>|줬6h9I%jsӶzؕy o{`Ok!q ydU0K;\/u.n__YBok֧Ϗ!8wC͚3:uLf&o\ÙAXh$e |!! ?K.o`Uf0țeXb u]ŹI $MO`罩8V:o ~K\_,Y qpܝ~D(Wԁ炪 NXlCO Z1l &yr`-}*q ǼE8 `h {]Ll6څvHɲWJɦ{q3 [SWD(`OzI1XS|L3z#:^uZ}<2|YɋfHZVyx ߯᫉ggı[]eW$G$9*g$2нD7l$M&`Z&`ݠ(|`ܟ^j:f Bnyw9w/$ӥ߿}z/%oO ʭuBr#0@#;[Mà+ZCc~v|2I^p Bn{q8%ھCJb0Ũn{{ټ#BmKRO]Tf iO;]OVa_[M:W朙]9K0rτ2N- nTQ=HmS/v2dNad2+']q@J[L2̤0rkDx.·9;C=8:~JGm*a^t͍70)/`S'&L)2[>Oоաk-8Pߺ}A8Ww iw9aT`Jzq&6/|-`? L)fScZc%-WNdmg zc<4ɹ\ SO'iU V bC}ulZ{g\aR򙫱L=8y*G?h!1qgqek0vck?!mHL]Sj*L^eU \ٳ85;bԹ uv `΋.T=Vrͽ% Ca5@)(VBjܴ&u5.V=-Tr~ex=Ҁ1lScNVP%^h/ՅJ{ 1K]5df4#.ӯY|fa@;'_L5Ħr9q9ыEs}>Q i8ok'xgk㬂և^п=~2 T]{>DZ@!8V,tcؑ2HޅF7DW`kbسel(~:ڍvD`I/(Ir7a2rlr)Lf<YSq42tw$Պ۫6 q2\gն|RIJ0껗ikC_zgSŒ{ԌHoJr mwmߴ}@2W<)ӢB=`)uK#j0`_ñ@yw,zXhYy_OTBkk|78u0 Fڅ[TWcvouzj"v]Ro:A\[!dqemܘPQq1wKmH a蛪Ǩ-pfT0wāM/MA"ls\)P~ OU8FQ1g; u:ױpPsTŶm0ti&t99ꥠ/8J叮h␔q5$i2UK)Z`.  x-ܞ!~~x.;UA(:m8HYi*UTB'阾G3O5bذsp!TCtQi[!] v Lo h]=%O}?]A`NJ -^]-@z`I%3}AooJpXM᭑Pl0I܉c&g$^'R1f k bK0Ē1;Eii=>Ĝ/ͰXDG5)`ʲX0V0š)zo2\}?}ow؃ޔzio 4E 6#]l|{={8Ef҆ʙq޿l${ S_%aS{Y9^n/턊=nck챍rppG5[֑Ҟm*#d qaV# MxU3:ʈ"Qp0{y EYL_nh9A".{Oم @SM,aX'19#0YԆtqvg_qL]#0 1ᬩDƖ)-Ptԫ}82w'伣G_bp-8F[\ЄKy 4oq s/|^'Пkڬs_x Nmv,I:ˢ Oo%]Н)4P. Ѣ38C0/<5Hy%F*>+GIkEs=A~}iV[`i\aQ?(thZft (_-yOQ$;t. qׅ];pr.i$Z` 0ܥ✯DJ=!p$NH+q&z[YE$sF3;D=Gva{t^Zkyb粰ޙ^;|-LJ R/T퉦Aˤ4L 0L*߾C71fG֋Kpa%ߏCzĿ8⨠(7VMΊ  ^~wtŏTòeáKש&wI{`Z|̸ ̺+Og@ j:7"fV@kظ vuDxdnm ?PJ:)O+Lx: &c>qXz=^3ZTЦ,e O,`ַm`+?k\HUԹ {2`p*$ךUO=ϥe^xj .p~!XOwim#qSt3Hl"k @q99+Dܰ9E~ L j4Y`yIU-}ug@.Ѻv?F54b )]웫=}ts8-j7IAq.<# ?Ija\}j*^yj:p]w^} Wo~g|{sjjC?bi&c!.Yʹ#|Ew]#y`+$TNd Qoa|qb@}@7z4xB]zӧBq=,$x띀4}>XPz\$k/S;C!:q]bJ'2%6w `cTЩ mƕo$4l~_DwO}Z].q\ .H1ixJ!6/ .L͔$mȽ_ ]^ᰮH=ll4^aѐT6j:h+7tt=wH>pEE$L)>܍K2.榆ȗYPH$л: B#]r_t4l 2F28"0wi%LFʊtƎ0qoF͝0X" ⮨&n3+VX՚`N?|E D} ꬻQ[M 掃`=W" Mu/8L[]>TzMϰՊ@):s sppofА6SC9kaDHTjs2QaFHi:!u&@Zv~)$e<4$pBfJw 5Sح,}fLHAENtkGHhNɖ]ߠ=*;w⁵;˫.c_ Gqy ;-攃P5P;˳wLc{W;d׎Ϭ҆EUlz8Jο?La%3:ԺpV@"==?7y4g.Ko:03*_"J7ewGh;t!ށN:"C,94Gm3B0Ez /zWlݏu P:\{&D #8*s(1.a7ゃsDڠ}q~IOLڷ/^4Ȣc9]> s̩Oq^G3 YK7^!gsLZR-]qpoT2~UQd^5 di2T7! c5@߱-8w7!?ro3|!K-ρ1/ɽP"U%,*2<85tZ}'ƞ D: q`M^oـ?I`?5\?R0JZz~oC}J2~#8z20PrBh[ -zw&}BkiCg*1<%5G )ck ;0AfLC/P~^?  ^$~|?ptbdݒ/(~6"[};{)tFj3˙.~%_L5Ws=PҬ)r=WO_x-UM&aF{GݝANx^4Nf fwq8M }ꊍ|g-M@974(Jq[7~r)P!dhCD"oMl,WUw=<uesۺ11x\*+3DJJI 6Jy=Cp V HL 3_fqC uB/ ̷?z4hg朆E _yqG/}$YBE^OK]Sj`opo(w0s{pYN9@Ps: j@}ٳ<K6"YHdgw\DAjG辖H\d~;&8ɾkT<4/̷6|T[qlӰﺙ?@C Ϟgc ݭ}DMfRq W/8U?5&c:`92~Yq=5[w)AqscPou5ذqfXXzM{GdAJto\|bŅ)]sXntKVB?tv9,32F`^Rv_X;NvLkmgbTYEJ^&!cJRxK s;N9a~]W_&ﷂ}r+ t#vhc6q-6,2H_w=dm1)*yfS;g0igN2}zvZTu '#U_(4v@B[Yq鍬EU 0^ZӃ3&^hK ӫJBR`QBƺ+4ߓX鏷c^]ęw41A[ ~dÖ|'}`a,\ ~;~S0zm`E/y*=RF;z{[*a-.SNh3fCftv:h}$yӰ,繏E4׋$2r~^@y }fH8>@%P^p@TE }]v)S:]服y?Ba,_f+$++[u7iө}\GNXo)l 3UT>m6$ _{M_"SKs\\x{(g >|^Z ^C`09iӷs<]E?H|a;z1MW,iJ'ar`vTp+fS@cJ.G_1rCq OתrO2]pɬ YJDZ59[GP{P& ',aV0: -^H@B3ܖ>sgvEKiqWa>P.lX/8i Q /wn~9 n*`so 98=,popQ@ţ\< 4q QͅD)u8>Sw x*5_~{^AV:1''7g6ku"ke'< lN%xH?:G>l>NNmأ_i$_ ń[R)k1ٽ` k턷C`kT)JKm<{oӄ'Px 8]XPI+g#Ƀ6o?JnbJ9pHW)#P,,,㌣E$ XŜəȺUGHqp2B23D\7g+~ $b8[+׋rIWqZ3ͷZfH1BG(`h_ i}MsY!G r>Y$sV8Lz(JY;ItW> s+U;PaKxۉާ{ffa1uNh!ʽƕE2{Aag3+Id.^S@N2K8@e'Rv"ʡ1Xq4uԛ<qJ#WD+@2cB6`0u+uU>5ۉ# oEiL}E;+ -L܊tEJ0eA3* lW!1fWTS(/;AيHrG*6 7ʼqr@J6 v|rf۷*l8gau<&~ӂ ͳ30!aM3.ksb<{;:0ά4År,yt$rw N2`яxn}PqGYȠ^|gҀT8X**[C5frU$gjd`ePl 5n. VIF<%֍oĝ|ɓoLN]:Nfoc5_\m{r" >XJn' I|OABǚk8) FpJk[='ەמZV6"57N}.}#ʡ譖s j#^P(sW'Yaиʫ0z[N3D#֎TOȺq㉣ K(jQ¡5L#OcÙԷYp螞6ӝW3?oV3W='P]صeo 6WVۓEaf}M"[+0wo,JoDZ4&\,8ų $zcߛzírLH=[w%=X ->r ԝڽBaMie۳K顗pKIΔf w6g+&|** ] n^2m/bb%ze>_xNUHM5Xдrw:V K*6ykdp/X',ﲾNV!>~#ѕqժ3įrE˴ŤSa0n'&C1VY8\.z;:86|D>~JV_㕴ۇz8J J%Lnh©c4}d/IoOW^6d6х7?jF"Nv]tҤhe\2's+|瑺VmIruw*oVH~{N nYqy Wc}/ |~uA05XNGTBq#/9]уi+:wa b\'rlLj'WfMAշ#O]y ņ,~T!8x29fN{'>?d6XaRȩ qr_I^2rCn%[ uX걷JZ6 !ʪaP&ZmG"{&2]5]Q[N5AQl xk 'q oD:b4;nna9X>5OVZ۰;<L&:Ӈw<X|_#rWai= _㞗Rt) "~= Uu<-+;S0YЇ^~?],3fsd_7l4m9˲ޙâg}a NPX`Oӕ˂L?rS38VJ ^g HXg)dk8=[e6WƗ@]}u_}~azQNٵ#;JXՑb ^",pvOLENJاk~M*Ո (niWch'*-vTv_pXT{cB8')ܰ }<S;wAïy8ؠvMUsRQ^ol R̈̏.|Ԫ͋W.wK7P ɓ"tQFK_dZa2}țrTSvcáJP71Cu" hiũו<`!,/O9sFu#R>pÊ[ݫa0yF盵(2ɵ{\]#pu=BJaDYwIf,y3ES, sm09J{,Pݫ ~q1`6+?蜬v`x ~.},6$??V#K: U3*5]cqTk!Hu\8z" ^JvuŔu񸶏1gKhqwL(jyѿqvŤ0o;)8$;hH7̞'R{yV{ᠹ+w;S 暉> mגBqʧ0rDqy=^'jSW~FiflTCO.NGh/d=+x>n5@-ٶij&n <6%6B̋vDʳ|1ΫnPq\V&'"C9\1滌14< ?򛀡e\6 j Kkpb%G°{kL~83>p1駓`. >ўE%ШPZf܂]I#OC#2{$BR e:Q9pRX'AE<oJ~z滔Wz£Wjpݥ1 ҰqOr ڢ,ʭa7u#g .yCƑH UЭ/iA^ ~l;Gb9;wH#I`xZ^Xfq#Ѓ4Q1t|U'x(*OEXV>T5L2gp1k&IFmq^8A?~ 'iLXӋqxFbP53R`tzVGw2۰}{ \Qv腗Pe`9Z9I_9rXI̋R!^ݮبd #Mwβckm߆aCaXp zäΘV5oew]g5O"UF.ˮ3$P;sOS2ö7}d O [)pq3XhwnKTP`V\Swj.{r7.O1, X0١{wϿ=Rld>U:ډO~U'pY&PT8 @kW]Sϱ㩉_GTV?&6NgM0Êey_2T(*-㚟eJqGe0i8ksg>I05ؿ3(Pk87nm+jL.6[j$=rÆ Kמ΁2).yf;G}a((z PXkV~WaNjD6+L=.Fud5aI8o1Ɛ>=k99ůW CQsu+pB%'"Y uXb3EcdԼ-*#zBNT=XJ{F)\%xWMŪHXMP# BC @Y+ڋ缅/b\A1P sBHe'pBn8ד`A_׋\^;~X Ru8K|܉#> Յ+e C,w?K{Z3ǹ.CeQ͇3v/OFLeújWϲ {>I58z?]P8S xߋvP(X~w2i%hcw?(]ufi2?.Y EǙӧ}0jwu, Tz:tƌoWB߉LW`ZZn:d)4Ҹ~9v{d:@kzckX1p؛GV<=P'WG}5}O99@}^NR,7p#UcOo,V*G`i|,dy~&G辈Ŗ!S?GN F;3Mq y=荋Sb?i\&4ˎ}zo 36)hh?J(Fl1X'ޮ<0ۗ_AMߓ4:öu4-ٮ =]dl K^\AMW&fD* 85\>UvSRxUO3ip+] nsp[4J@;p@6H9 &1_FN"1]'.žWn:@SP0Ïs6bS~/vԜ=2wn~DlسɕJ_0u; è~^v3HCȝ'ps[' sߟІyDRin֩@Ua~8ݎMއ\NOH|eOpcRׂjp❗춿]T;᫵jG`Ig%up*/;Z>RXk)bNV皷f[nvZjBi^ ѽ  dbZ0%{"{ô]y7*H&=Nަ~ MeXB}S+y+{*'e*a Rw+=%7E_ej'1S|$te#NeB|`rm7n-?U$ޟLDZ[U H?~2p*.ٌ_|KA >JY}rq yp6Vдr|P:ʾ+9Q0{JΪrT`7K5;+D*h,pJ]bely98~7fAѲIeBɧQm/l zsaN"ٳxgE9N\xFyYc#ӈLr'>wG+8 U6'!V݇ xAIB_w5SyY.tL+_{=5%(zjq\ }K1%wڰRF' IHxZUHb9G58V!ːeO~ F@&oe䊍Cwa5Q1U xq"+ wGEPsU2mW8R 㥆EC#X(4f3dgN8Ie%%^rӿ8"`oe+bZP{"fٙMxŅz!0;١% IRdV&ꄦ{v t8vyh(u㏃R#_%c |^|EICK ,3U{mnbBSX.HQKҼCv<PMĮ ӞPZ/rŴM[ӆpZG͠a "{#ӿ_C3_Eyb;7hsv1`3=pPtDXHĄQAQ"/;lrUɁjD*/8چiuJtǻpVqѰqfpx^Eʞ?wBkc)rNað,ėHfgM:oY\+K864X,t!F\oqqTɘu^BNy^jN/-aQч8Mst]uFYtYQI0ܹVWrB3S]qTC8c36쫙أ76بb?\7WM"w{l,1v T.`ng['0iG8Xd)#}'|N6BRΙʩ+5` =7Hi$n 7J:9UÄ|ZuqO<6fв1^Ϟ҉F#<sybd`P45h04˂'pm |Qg| /P.0.sVqr<"\ѳ0ht X%4?aGdDuL'8;u+Q~`ı%nRo%)XS_˜Wܨ M?$5gబƽknEゥ𢔌+{_:X\c~g6_M']p㡟5/~{AA/z~^Y܈gϊ||ثt =OCWOΫZA7ΰ[@v#T+U01~"T&w/ݯ!0L=??OU8}cd8dW5†S1_jn]6(3 QؖP,  ??L)5眽B"R 2ͶNHa.疿뭁Sڙe9 =t<;ki6s͸jo;cY#Vqn/qմ=l)n&Ԗ:7%g+jHw5\ ]TunS/BA@t\dTe^* Dl/lMݺ|>j{q`GGZo:rw=%ƴ)s(̟Ak> )ü!=bzpa2p2dp2Ƈ^Y 3/[߂o۹_ux]O󘖊଩cg.4܄ڿ?5aݷְK*uk-"ߨOTۊ8uBu]L%[)Y,8x7 tf9j% P᤹cwX߿h7=-٫B]_B>ZX5C_6'?AJ|}a0et!VD=b5Y%lLc K?ﲋ;a~yn<(7 KXū&P|~ar9 #|bUw3$J#o b;_Pto֥ &`j~? ~O+y!"CO; T"503&IBxOM=ǖd{[2QrG>NRC_K&p9e8VV o\`5 hu4*H{e $28ɽޞn)cwWa0DR(vef)\McęjxAayE5HN_0'NM 6rN%%Ώ~ `z<1Y@Z7XpZ$:.kh,_0rc#%/1F6dB#cql>Өih bWU%NJ:"u~dWr9I=xP, FUw,JdjwPf9lu\;ba vZHU!mTwP-48Ǎ?/K/ZuXŠa¼jYցM}Nh s`GIȫ(qcV6wZZySZ4g= yo݄TJ"0Ej=> ? 8WaT;ybs3Aà}0vm4F {]M23 ;p"--xQGJfyBOVW."ę5P6FJ 9-¾"lh c6<0~2*K|aRsm%R{5R-3oWF TUχO4KƟS Tӕ?NL\ö`[Y,,(0z Vޒ+"0 ^MM1BMI*1|f -fq(åk.U2W11AWWj8-䠝sOLƮʮai{\G,3oao,XC\9u =4C!ۡϼ/x}"̊ f;SGC0V=.ꏳo"SÎz'kV8d@و^N~'&1|4Fz 0[ 6z099. mθR}v9lw]ki??{>i)\(t7k)hulI\:#sU89\0پ&3{ xCcP{-[+Ŧb.~f-lNWC!30,=*(=i:W0+ 67yϏ[Cw#oq A$+fcu^u!F޿[&14ִ@ rޜz $f>]t&EQ` }z*NM* z X_0`sMz_̽.U7Xw0)'N0Lb{5=ory1 .%yLHГX#iA o!Y K hqzإo9Gxad޳8ff0X)v3N@FaO\2mG]O 9!ٓx0%"ͧd>=$9qIk+xR#QWM)th\#7ιx` Ն>֟5O[ \0O5ض#Tuퟪd.FYtzgWia٨0pnȑ2XH:f ʮ@zT6_Nkg^_N30՛ _Jq=o%ba诪<&(ni!lO4v1o1.[z˃Bm66e[cM u5Q (UrUjn7k mA9dM ܭùTԡb%:k`%ăYXXQ|;B)ewX<u {}pʁƶ[aۧ+8Yuf* >zg܃&ꎳmH}BYg8/E bKΈ}Tq9x 8B㡜8#z<]p~FU&c]mvg5asn )~l%E!p-"n×PzNV;Nq;l10JDB+9q[zltpuF ;GqHTfY0ۚ~w7HA+/my>IiFcRWbj d)<+/z?qm>;KY?Hjea0RkaYXLl+shr0odFHZ1I:Ol Lө ρ4fEWtnqvٲ^Qy]?iωxYQ_+2]oٮ<=amЅ ¯6[؅-fB{Ox5b\,qʼU#tNww<{pxo57N<@х:' wݤ[eLP3M#/Wݔ;ֱi{sJ1\o BW&!ic# r`0,ljsE1Un,Kzf)f/!7Ju=c[m?s<0dX}k F˧k~{b.sɏ=I#.-\X4c]@r=}O9U>Û@~e@`ˉk;i:pcx .Qךےpy(76?P#&a=#]vS,Ղkv.V8YLb!ErQ^7llk+a˔66 UN_TOah⦇r21;y wEC瘳 &MT xn`ܹ?|/cO`B8+ Z`jgkї{y,ۄ9MZL%$R[h`S+cuض߮cMrA}1),ӝ=)[ ▤>pe)(0xz_[l5/L(RKo{mxS0n A=W.dB0X;^f6X>LVX%;H!O5OKx%@u֦|d\Qe(-Km<^;ؤ:1l % }}w ;o0 R[t)1g;B?B]9u7C%N) 8\~o~NǎՕs7lcgk@!,tVyv Z7+5v-6=׼(m_x{Ú,_Dl}to;$ 8 f籽$ /~6ĺ.QP{y΂S"k:1ߙdvvh'FYyWz(}mƂ0]k _ZC{b9hazljLI;Բ k W[ΞςX)1(nĘ.bWcԔbwv&?ּ}o AuAyt3 7 `edl[koY*I}OȢ35԰m0s(mz`Ys<lQlq؂"zW -4޶m24:hu>g*L3S)..F)EGqoF34 z wªSkCv;۴RhD%a,H{`2Մ^{2+GeT'fr݅ q!(PN>cxwȵ@g)Bv?ڊ3RIvQHb?c\{ͺ^NQf4 Nd1Of83id/;tQL0[|4s.Nsi,h>G8^ mމGzj8p1f9I"P04>hTmɾbW7%t 2$,I⭩ITv0sy YS5q7L` {c+]:A.AE$xX%,Bs%_y4. GyNWk/ kx;UBw\˼H3KhiOgcij8{-KrټrMuƺM0<,}S` mxCQbq/=,bYwH@'>i)9Lj5< Q,\tZna_a/S(Xyp4#ypARޜE(cai}(T=뱈 Ã%l^YBvT kw aՅsXV7q:Nyh܂ i:N+ҔMS4}Ôa|\!ptӫY.I);mrE*mp 탞+0Ҭ;ݻR7pj l)j|׿?a?qaNz-- p26퀭aWPXUlfBƃ7*RC0v>g8|M'ۻzFsRU!}Vj O$yˡN`$^Opv|Q7v50 fb0wPm;ea [ -q#l'elKi#;n{ya'0 bY;Vl^S?O>Cr }{8k-# Θ ,Q6P2oWe˨Yitġ;UNgq6nen;{=GrY8[x Sßji,>=dZ $Yiԭq/<Eǎb.rXQKmh't"{&$X4VXqkaһ׺.+Ǚ.8f-A->]%x ZNHݔ{]$4/ ;,>FFN;{4$q6.HaДkpixQ 6ikBUۑ8|Ѯ& ^̺{rzAKǨ[p)Ŀ_{6v%LuXPIҸL͟,E7k-<Aeւ'a,gXm&L`K W>3oƌHRy \r/cCW|aR#7+W^Xiž=o=Bĥ^`Õ=_aLMq3[fg8dF!z 欶8`TCJO"?ILsFuWUDo+0S(ƿefWȢ!8']aN?Qldts xϾ{"\-A??'<)j ASmꇱ[Gw˿/gLuiwerWg[j8Mѭφl0V\Luj׊O߷e>|Uoh[VpV,;W3hٸTd߾8W&3L^/iQ%R6qTP*[sm^bӁs,Ä0is woPȡE-f6X=C=u?)a[( 0 JJ%Q60qR*~P曀kZb1hzH]_DM/ 6w Cd6U0`f .]gp,iuwz~d&H91'Pb55^2)m ҥQc0XotT+vɍHuFLF?4CdTxrFV+u;p=K6~ƀׯ̽pi83B#X- D"R?hJi·'O- CzNٰf'PLƲD }>zJLtqoaP@m1-0)D@|Og,`,jw1[~0L_~+yPX%N8Rԧ$ ҆;$`fKʴXf1dѷGi̭k2'yvo.'awῲNPO6x6n~m2iS<DhT䕱pIMki+)3Ý ׋`,g'.儐N[_d9H:n愱+Q~G5ҢȂU6Cf0dR޷ד@uN]@ kzO`x†&t 65!qWPɓL,λɋ†Aϝ2.{1b3'g'$md %pW khXI#=Z ̦ARX0{FWhEP>?hS7W c2j:%`RD/N bZ@!J?GN*~eÿKQ_ /% 7>9nARͰJ%+~t/H3ӟr@睛!F"5z_N*6mpG^.~ִwuBBl#rH{ͧ`΅G<mk)F-pCIXd/61{>u wcWӿ. 7 VrK-quWt.@J|޸թ7uV]ofˑ^ I05y̔vTP7&HrFg\V(dwM0x3e,g;^ʳ Ў(PuۇZa}&,%g5vhy@ՙ} +,26Rt?ILIؓjMوtu o{PgLVhrLJ@e®jC TI٠{Iҥo{:--s>0Xkz|&6Z?}'ԟAbU<fܧY͎dǾ/~k0n FRNBuV\͛Ʉb,+2#^;ɚێ-ۿډRuMm3gʠ5WK _l>I"r5. cjzyM\2 kW@-4Ep~z~" #lSd-O&=8n{YΖ 7/p% [ʍ_y֭$Mw'r b}Skՙީ{U'RβdHp{==!`a PŅ%sV,/<:작]k%2PK\^j@e x iGhOPI.gǟ+fՅӅθ q W ֕赺pa5*f;ڃiMsDŽzq,7)a_r%чMRL`~]Y4V枖M#^yriN;t&N1|:l%zX[oɣ$s{N`SIqfG?z ͯG~kE G:Bo`"AlaRK:ZaQ@"l1< x|Š?`s qeov<=}EjjpƼ_!־,ZW_p '_rL.B0ct@X6..{?|0W N\~K I<{|m!y],lK&P:t-2 \p6K:(!P!/G}uwH5UO*提Rh~p;8b!lz0mKFO@\L2r*&ö #uF{B͎Oժ;]jpSj)(z5pqwA9*c6`{Ġ7W[(4?+m;Y/ pЫj6X{h2edFCⱖZ;6Γp~D8N~/[egL7'Փ*yn79E^zFAzN6c,QU(=ILu4?(,S4rt(}$L5G͆?8FvOy7^Xm1WH_י5ICp.ɭm<^ gZo$AJO†D_Ћ"ߏ!"~._rl'iY˲nnʿ+K4UY3#0%|y4ѳM d13\ z24do^\տ%wlz}){pʝ8l+:iF\jڇOqKHђxv->c+c`X ˽g:4TWs?9m Fyе.uY;J4S"wOGNJӢZ\yA_p]-wXb0gNW?[ D?Ns~,xO⊽St`6~[۲vH~~۱%e8CgL>a`4IP5Cmۼ$W pHj39Ȫ9Y]E\ `DMJj!,nl ^Y +tl?A}=0?ؕq&Zoa%aa`F5}!@Zuj$ ބG^ߡ[.bxɁ>35 u'/ϴNA=]RaEUnu+e ǸKP}?i+ Y iMx7+et) @yBP ..E=Fi06qj AI#PFY8T[m\rӔߺ$ hȑm~KYliL"cPjd e!t2CzJ v_ PX{VTߣbj_ ~:]zb=^>@2~'1ZwnMlp%_pS5@>FLF$s3WIc.hVˈ'9qܿ䈕8-˞ILD*= 98Hu)(t.}#ڍ˜ ʒu&"]ɤvKh0})|ŕ˯`Æ|&ⲥqoRX'_:@ T2P<~=8 En\h#}p_^%;\-} aҋ/l2m>esZ*M!wQRHM\_~*'յ #$w6cڀ=xr; KJn=4wqyzZytZ8'f6V ̆!Թ4$9T GEև8-E: Cn)ww;ˁ0`| J@G =uۏ^ޑwԊ0ɰ- 0,~M{J) q̟UH!dMC}P>.it4(~|XVGυbӝfet.!1~"c 'fn CH@o ~5lVs= /LY썱M'UL@^cЕ}aR7)&LnP?1- \iŕYjW)JN=b.E Y(g30)OEÞ_ i۠/X>0F/!vįtkBaI-\pK ܅ s%z֕$ܗW>G]aJo,􀵝"$1TTninߏO޼M;zܡzf9N'q#fD=4_+\:&C· VB[+,QHcCHdN>L` c?.լyAa.f H$ҽ;)YmuLc+:!Lo?;T_~]pԙ:KF8(.Mkb߇{މۿl}rLd.90ĔwiCp߯SXOcmKC7}8;Kc$>GbH·s8<76#p.MA=T 8أ*|-Z}zKRM6}MAkl2M?> URc@oqk#}K(hłE>qaN{IכPD[N[ 2Nq` R-=?j#v27QQB_^w-IuS'qbs*2K81/+ \`2GYR6@W{fZE5+Dz>i7ki5)7?jqXK;βho=f|7>Jb^ރ@v^ˆ )3ndB_ӈ.PΕܸd\ 4³LLG[3رz$` 6(Jqk~,~X;5{6s^BLd\_ 6_/*x~.:WHxVŨx%Aҋxgv$KݣGZ5EX|4XFܓX2~6 =YS:|`[$tpzm"m5Hy"0YD&|Gi&D.S̨]y<Fa=2ZjbMQCr9+ p: [B=A\w9SVo9 EJ%\HjW:;F.Iˬ.| 91] d *.[O6 ARvO@„3=ؑAkOOGvaO8h*nhw Z|/j+`)#~ t&荄!a9?_, {/+Y%f< ~ٓ-ngo1u5uz>~Z1kwnw8ؐ#wS_O7$#I_@kyCy2_op+ESyoݺy, T 9b&iϠU m@m$]M' WE{ 4@ n*8vG*+QRaJZŪ 1FoҼB篼quODX P?Sss|>Q|7f`^ MwINe/qx<戃R<7pW|;N )$'f†u#ŏP\,<CK0$~)5sfwӵkڵoѰL֚sN0g'lhi5]:q#z (ʄ:"oA1 vV-0t]GX9Lk߾jXK} e޽0rCe7Xl$n țk> ^rUk{;_:C5 GQD=ҔK\fn݉ɣ%[H5sW .l0/| ]|5\/^Nb_ V`YFF`T lϰvRD ȑ<g^~Cd7ƞ73e+J~ `Ds_H!oL.>YV|;ôWH" ]olÿcJ͇z8{zk#0n=l8p%\zg{1",\)WJk03cܔzp6΢k? C3&Pm*8Rv6 g4*"S4/U=n iӌH=ۊwC`r* Bz>$s ?d$"A0yܢ,3%I\Ƞvi2r{U(zQ9W}4{*˜Tțp!qpu A#W^8hF[<> 3~ة u  01GS˕B_Q]"0F3~&W%D'Gpe]l)T<|u8:WBok{u^( 5塏׭y.~^E[?$}!2je2pˆl0RثWg5ߛg|*ܛ@Eԇ:Al1 add_ Vus9ӎ>Y^aX((ПF8&y,K = q.,vH;#݋"sq8sA>|N<qz,ԺSZs$T]^ַ̘ZT!HǕ4r0~=ټ&Jp4{yt[xy0u ~'`)$wJ%C8l|9? *aw{` &q2>ޟ 1X>]էm/rA]لDc .%hSxÞ7"k5qdΥMFlō^V} Y낍r3ٿ"Hj ODl"6қ3FX&euR+:85g&Sy'MNHLZpW @':]آ՟lѺcwiyP^ mU!͆\1Ǻ1̟{ >ǎR 0xtJ: |IKg@Jr&cawR"w1i&Z&3]`};hwo|yr2Wq4dOKS2qa.B*ڐcvϵMV}K=aOM@OIKCǸS`[u}EؼNW.L$;|"[θMzX"L"IOUIǏ FT1;n{ZZ_:1E藕OSR%\Pxup(L)GI;54q=e[7wLgm`p/"7P\n0sf7#/{f+}HXWw@b+[Z{qZXMvv]9Pw7I|s$v;$1Ls\P/cH`RBG7`)rf%L.2%JAYƫGŎ"q2ZI(cwb1]S86Q zuU }t0ߋu'<-'i\Gg3!y6[fl΍`\< 1kp>+f7m{~OJ㧓`VLlh€)3*P5+R.5CVY2T} юY?ؠ瞲bX=E]['-nF†+/%lǯPĠ}Zf`X 2:4FeHf_kO@SBvkoCt'= s=%^"QɘN/D OpO, ^`=:i %R8q׭Arp)< KMOZ %l>y*Oo V%i$B+a{Zk4 $\OG[&bDR#'oʂOfz0(rY$lIi鼩Mwf#88F8<+C$W/a#C<=֝+"kE%. en1av:uX[>fi=" )]mkaijW šȃ9mb\boQҞ \,]%@lO} mxjw9=VRsxq>Ω.xP=>egE ˽0l{xR$Gla]ml f{ux"a۰/"^L? }iFa}8NmMT!Sh?QfBIgp9u@kZ q&3FO=[w͊Wdu!v.voa|d'?`n Ih:s >f~Si;cvcgDŽS8 E89zY!Py=tłz͔> wea}P" m;{lN3s#dϣq^]:`~ -Ė)4n )ڃs7wن]@Úsw.J?S%4.]+zS?khYO7v& d¶TG"w֍ OZ:šXhXhN?jv)g{XٺQaG0.\JB8}1툷S%6j Ѷ@wQX 3gy9E t]޼cƴs׼ `Iawc_rf"BzҖA8*dgp| 6A8屹ІMG4/p Qbh=OӨŕ4t҃$PH|Ccë =ގF?b0~m7/V N)b[3M*z3$`E\'?9Sٔ Fl(0S6 Ϯk .ދx1?a}i"ٺ"O?jɇʭ>HhJM{cl5rtե0Q%ewa\lK' ed/mv-RcKf}ῆni6~?3lX;9Lya%d[|&)QD+cr`@ܝ@Zq_=ƅCΡNZ8XSl ndSG#Kʕwŀ  ]?\ȑ6Aǣ7]Q4[#e60\eesU L֓E0x=lx i>M^'X4K~zW Q*TRIfT4H"{%}>ñs=}=~^<ܪ}gc~/lPxt)G$_Ʌe,*:ͦ -[8'h0d/H`l?Nkޜ rէ {خ`Wb2׾eq]> 3^Ğ2/sH=~{O({n! $bɥ"$ia+l]>kitBk>\9.͢% !,TaEco{b :a$pjSc[`jdgkx. GLRJ/^5-hÁ6!@9 [wu9kֵ$Vd@8D I+ ;θaך@` Jq~+ ߒ-A$vW*09迍[p% ǏͿJC:}N.o(9w-{ԬL?+Iomm$n@oQ,ڪ$ʻ`O5` t^F˦c8${;tny$,~:wNÊߍ ҈!s@e,~{更W4☲ē?~5rޏMFXnkFe0v,);Jv+" lx@zJi:ksRVSbmth U-~}Cg>Iy.AHS\[1kI嗢]LdiK0C"Ν}@0YW{u;/鹰|N3%_8NU%x~kBZiۋ0wٴD-PZ,*_cU+7 /Z7+n~$6Ίn,`׌73 X}ò7ƻTߏ deǏ@RԵ{Hvuz v| btG`IM0$RBg|>>OA$9?-`ƛ˰&ːUܾ:M 5W7y%0&uW\kRD~tn'ugL8#ރ,ctm ${('q+Z,J1l(k8frU$f Vh׼p\f;Lݩ /oBbAU`=wmy%op@7Q8a+ZT&u4<ѓS: }-ZbvnkI]=[AO < k6Aj%?ZrT2a}wp[Qw`gxX!G&CV6iا8 59MN=.|HAh7]E)ѯnd,/}꾙$ < e,8dhX$׏pBPԹE|I?AkVE%.D[cu:=Nbg)Έ7f0Juu&y $+Vt8w;FbL<ͥ?r!X ,.餁ʝeHM_4#daXeD,M/jnG".T*U~vS!T+Nl5ք9V8"#h&muL)}]P3o</H^93CWNg}^sjbBFVp2v4onBRBSkͿ8N|}nGʆOPӎ? ]ȅFCbWH+0-+t/ Kp=®l}B&ںe2β0KB[# 0bC^ێsQa>8G*X{E/2CwhG@)7=͝rx+OÀx\ؑy'·XD a4oOwV5: 7IXc9 g 䨼;ºA]K2.4! { Am[6g\K9ç.D~G!>`ù7Ckrk@#|4sZ8XRea [U3!%b-ѹ0Z^y!1U]Mρh6u~l6lA|pe$$+=,>AwURgbꅔ^4nWm7{yjidq5d|n[pʛ.RdH؟uGC }~v#5ޜRT*4m Q߰^gq11[M0jl(`7* 5l Ua#H9&/xy6 hP 5'Zqᔅksq, gv@v;s8h!1銘9yћwf^[_ca0fp7Abc 5K+.ժmDDc~LƚOiRّGcw/Q OHqDe0Q㮷=pHIg-qz?82}$ug}pcMɳ0QU>vr1~aTןy J8J12ڥSr/A'H, +:o zo AR|$2xRg| ar5R u)VsKy8,U:n_I?;svY;[h'\O ZFF6 gwJ cߩ=?cŰ +ݻ?Q$Z-O[?E\),Q.llr+k@{y|ue%]wSb(:eI292ЛШ4V {^!卐1f{ n֌Ɖ-EHlzxB0ԗ9qƸm!L@\fSO:&}$2%d_8dC-I 1s)27&W7.߂Y8Jp'߽"Rb^;8s?lӰstvݹ }9 LgXyIH^jrx0̷K| FڏCgDxlVc%EMc#Ƒ k r*QnY)'l3_L3h9[`5 71чV$`@=yf .9|Z"ϛ'b3J569"ט"̖c_v6n =݇p9PNXUko>v?#@7`3.lpՀO1j܀*{+x¤/},pNW}\} jtW`x!Xc{4qy>1nzw?_?lJqi;$q.pdeЬ]u컃ɶ% Ig/z^|^8!-H` y`!mD.M[NV:1hPXק+r0]'\ub=S]8{_u\L $]n}D:mZS,4wëtSWF&x"h0v ,Ĉ(ʿ}29<%,8[sNJwB)kh_S(gAqXTްx tCq @*aӴ8,f$&76L8jݢ=jkS?=i Q+~ (Y%Osχ͕0py79-zbL_3cnbcr({|(0|# Ň`*kΫXs2;9O!.Jz %KbW 98viy%Iׯ!,)ov0z ?aFnwt}u;#2&Bn 5<dE/~,6d@`"E`=ZM`R""G7= +V "Ez|'1jdkxB]<Г].L^4VaΝug]``%Ȟ֒}C5h&T&0zes& Jٞ7m7V}XXs[hnNѩJYŸv׀jvYyD&D_}0ϐ<] ܏&۱qHP(C . <@1b`e]|:~; U7wgIc*ET?PDӂ uHR}&PS[4SAf%PqBw#,w#t/н pkyizm<ӑQըl+$a=3a[Z_J& Yk`t)wVskk wwiFº4,vUP&\(Ym/-{} f?Wg 1u ap3\+, ~&\քCؗw6}or]l %@ޜ[ Hɯ? =i=|g؅Ԭu^8+M&QHq+7°RC8WrX`W#w_rt/w;zaWǮaHFUz 1|3R#@k%_@aY .|abtṛIt\fΕ$Hh=sf:ҝz&Fњ> Ø .boISpG Ŏ+6H/~2"+ W`; 3OKlE7Ʊay~LML5V_BV>Z^')"iܦCдty7t]N"7 `Rά,ڜg)iaG:kO(2gw?=69)#0OB}C~f=U/5µrDZY(l:Z&#g7Ӌ\+@y8$g4s8Ѧ&L<}hfK01sOctޯ + }g m7k /62׀{Ezsh/إgk'A+1Yj~ P3nrYtm'8$ ;Җd".A_ݱi~? sK@`½'dRJ-P`⼏#> F',yMa׫ߔO@F{bKP#Yb>kO1&pQtWqyĴo:R*.~L<M9ΆmY%69PsZt~ڃ[%%/wBgg zbԮm@N>B:)]M4Ѡx.җgҽTaH=Ԙ'H?gW'}kZi,LFLmYDzOZURXK?r>R/ꗩE<x![3+G1YW2hϰ2N}7\}e=5@;Hw ܪʿ:{1Qn0YUR rL;aE{G0!U rIJ'ޔ5aeu׃پ~?'\ ̼oO C4-agᬸkpkUw]wS4&X޿T8@/n}Zoa#\{XXyM]bM!V4 '{[z< I6֣b|A;yk8Y3wYg#wΝ91UǎP1UhsE/:V@^78uUg/`P}n$vo8ryǚc7FTJZ:{6930i)c*;%|5TksPw<%Ș0q [˶TPF ֦Phba.[3 /v}˯Y,'C, Oю)C|.UL| ~%D%EUSI[}s1>ih©ŝdlU]2uaQ4qpDEeTPHBzV0;[հ*ScB73+nM,L.adoLEr=_uP\6,'*L M޻%pt#a%\(k?%;]m#8'ƢL0QWO[O.U=\c6nUaMo\MfNBj07>aXQOs}ULw=OL1I_~"թ`Vm'bM pʘ1[PULRHR B;wG.xۻ> -Wld[گ(c˲=)T8K}BY_d;"7}lvv2{=ӧ|Vy:~O$_yA10s;UXJq E+W^uCc',߾~H4-jg_OaW]uXЭAVh[lߺaT3wq8{"}'O 8_=]@Zrpcb L:\4Zp%dzn^nǺwO_#}JsXZ_ŀ [| *Gڳ~̮dbǷq9ںEwtWz-Zh(':}:? Թ x>O)Mzg>ay6 JBZ=P:uY{L%9=V6S$> ;to;UwbwtӇ~=߿_VR˃*0-q؍%z?, z8v_߯Gn|>zsg-^HUc5Ɖ)tRaDPW8CޚO_c]ŵY'#PAI!C5gc;94R7{}9aUHfnkF9ݕqiGDŽì̗}ЖJb:z8ͅ 3aP,觬8L DsR/aaKnvfP $vm>=]¹uڍ>jQj$"?֎'NKK=܉duK;C9%ʮtR-Ƨ xp~Y%´R)}:9yBo$߅^]l/Ӡn.+cII8|ZHWhaT bMNXGby3"OSHd};;| N[JਅZ`B>tr3e1k{xh94W8q_~ о)yu8e F3D`ρ_ű;.ϠػZp녲RgxԤA; F(ہ&6P M/hVGqttw>ҌU Y\]q{trzG7߻p{k)/4 $r2h6i]Ѐz."o Ka SRY0~u v]5`i'O<oia+fZ _?HZ)qbrO \)QZ..?M4uq&y;EP/|gZ 9ܦa-+k*Zz@0?WǬd'cO2z]NmQC˒qN3.~yBVF'ω+8C،}4m <-K>%I8_|Ϋ0p*zg=._*Sp~L+ _7WFڈE۝0y_d;KE7pǧyXz+FV$m#Θ]v528li;>C??O\4: <{r4}`ݒ0|kB_f?́~S6]k)ݿǝ[sz.A:^_X7e:߮4;fQ 'S)欵T5<`bV ۫Vab~vlM+g6.VAѝv^:j͂#ts'elhL/I/SI>[oˤ-B;53<6l} 3v>I*s=k0kQ/I;!57|_d݄䄯uyB a~_].6~ӽbE{pb^ 3Xj^A+WUIT#4]4wS<,N7 ErBWHCks4|?).9ӎF"q.RH.}Bd@ZW¯ 8ڏz] .zy蝥 t5D:yuZ9e{I0;"D~rFz \6IY9}5 X2%W|aFc= ߭FnC-W@7bRlB:j'Ma"CN wlMZG[`,|yU|"i~\_7kbpLɐ&PF<8ec>@[/VwG=26b fOfFC%5<7v3x$, )l2/ M" X>t1. SwOOHFɃ_pN}q:O{Wot|I TWxl~C/[%c\'0fw:i$jbӏel+#q$l0ޭzw 4+PYJaTúN]Ƒ)w<"YF }G9$o1E0V $qyIXktGb:H>j VTBd{;9B]kN3;ߙE+C5V,ӵ '~/|ޭHEnGXn:( ΁L6M9gk8}/%Rǟx4̨PISrxXm`#ۼ&,TvdL5'" }Ff@M^ԉl!)}R` 0y׷0,TXJ:qח7@~ߛ+V)Ez0Z*E\GRGNf%eִ uRq]I 2N%j}e=3GD㲪b I)V| Z5MBftW'pQvd3!9KcS.tX%]@Ȯ\m~$=:~> #FuGvt;ܯ>+Nˇ 3zvg1<[C0p^l5.-hj >JՏǿBrߢ)־k%2h$ }^ ?.;CgjHw5KWqp"sV4*^|5 >RzCOtH_0tbâ@Xwn2XׅɄv7.*V ?$"G ϿLg^aiZn6wu>CK-[%")^p:0 Gx4ԙC)PВɥ!#M$S ,oq?"0<h1|nv\_"0ٷ"f6/4J-rzOVp0sHQ_ .ѕ:wu@#8A^ Obg#W0i7/t{S2waڰ?eR_on83s.@RNջQe'`g{)^9 ̥ehg4Zxbw[;srkXKЁqЇnc7x~Xi[ 2iT 8Nirޱ_sCړbČE}{ {6i@c`#,?=$ uF{pC+gE9Ï!A6s8Zf'VA {X*dmAG6l~HcgLό~JW'[iL!8J&)y {P]j)%r1`v 0"mz()0w|vA-[/*A O& nO td9:.0)q#f3qnAdŅ `-yiI1hWDjpFm; .{Ű*"v-lQ['J;}k8 g>@M I]ʞAύJ@I͖~W 'RAQGS8eN5 w9 ߮!гk㹊k{ziwk Iŏe;N@]NU?64U|哜7]7{[ڇw컙 v&"%6y=1zϨv!3^suY G`m(zI"*c'GltLqE"[ZaD:P3D?Ď;O#y]醝N *y03v/&~ZL4ľh7] S?&0O{5y'|7ҴmuH޻y*?6z,ŖgPU_MY{8!k-`曹W|\gW3[%a[C!Ox/@+oq%]ߢ͙iZ4b8T? ;nJU,RF+m5|έ6>{!):uoAi_R=7]g&vz~C|W%4}[{//zKsO,YFlcCMێ痶5s=/ɻ B~䠖e-\4PnG/1"maU=k1 יo{oqkYlg-vĩ+:<e2`í叉H**gMdیbnDNHx$7}e˅tm\\8ЂO9v>9'~r>?פpc2F\Onʭ kD_!zʼn>2M`2ۧ'}%U;NjOS8Dmb_[Oq@*{y- PC?x+\r?,xv+O5>Y 6Oiph̟8c*#:?;ϢƠƃ!q^}W_}$ONXUC9]o 4QJY E< `1jUZ&8RP0Ȃ,Gq/XhA8owjz\R%C`isl=/.ՆA\"d~M&šefDXnjY =n`Ϋ̘ h i+ C>v7nѳ}3N[SclI yIXY^ٝF3|)aDp1\M3k:$HO{wP@Tk.ܽ1;}iۡxmOd&M7aY埛Q+~:Չ>H{@.DΕDŝ$۰o㬽W(q(y.D=V4E]fm_l4v;a-%H36r9b'a޽{d,_rgz4~rލ/8eDw N-2 oˏ sf=%T,s8bh3ľ)XgJ*JocIoc夢|8eL T>N̠ك8@[Yے i;%cJpswd\(L[vq$nORϲLig>PpS}d5g^Y)yиsf+geF}DËAHَ`5 0ܕֿ=2|zך$ǺBlu?AXby)XɮTwlJY/ڊl 2O/~Ziԋ_?Y f}Ed>Oab~ոm>R9eVcgRb-[+n8Νu~cmWzax/Qv'yf(ЉpXZ :'╚vdzxAե{r@~('^}܎:-Mky;ÑƗ6w ?xޛN9^z'JCsQTDS"mc@xs+y\e'?ߍ@P3v.u$s`x9'>TW~o3#lm;NػPszT*{ÐuZrbomȴ]ƊyW^|^cuh*fY[{xP8-c^GH!7 FRƽ~o/:tպL7_ų٣Tۊ0$h6i \Df }?( b@Y_c٪$r8 ڗ"1t0F P?~i~[BZe#zؖҵ!l ?`ʥm28|q^.NgM?Wtt9\Ұ6SH*_԰njߛƔ([q#S+ΨcH+N3Qj_rfDH&Vo)v/#4%||>WJ"pU~ \LEk0vK:7.Tއǔ߫&hdHۮ&ejBdY(v2zٻMОD $w=luT?094**Sq^ƻ1vilqoKdeL뻄w`K2Wد)x25_,n<CѼ/_lzXo$_u_?x_H,_Hk:4- :dtpQE L'}֑ +#q<7{9W Xg}5?]5Eh_ޣ).hn|Ui{G3ԟ;0{^+(<R$<V.Pqַ@lҀь)+p%bSӯԷ0#; c>-e`,@\{fv@Ҭ!:+otqnQHV|mgvu&/m`ɋOZaj Fzj:9'DAVU, \j*AE0Ly_ȷDa |CJCK6|ܭ08CVi9,΍< 8Ō\:iDX1TA_v-u~Ee7ľoڼ-5áâ{AՠbqU@oA׫gE؀ֺ{WOh͜cXkbs 髢$_6Rd5 s\W{@!6+~Y#v[>GdH%w8e?u5$A;.*~:hn͊?,9 aFť(gQ_ZO#2?~5 IT<[6:맑5j={Wɲ@YYsT'"Wg:ͅY07$ DB 0U/mm7 NypR ]6\Z( YpSl 4*>b}+&Raޅ蟥bB^`Ɔ=NB!ÜSZW?Aw' g(XAf\ YY׽a|\305YYgYD$6;J&dȨ䁥27 5kn"))xEX3ɷ 8W[|G"5$kpL[pQ/!fnu}\98&;RSW+_Bw-9zĪi*;qޫ3LC G6 7(Gb[ ?syayj\?6&:q͇ XT}R*IEۓs0)wz\:֋7Ufُo<@-X^i;;]b`AaF$V&;LGOX#hٟokMO ,)6 9-Ma} .48 fؽp&5u9og m4aɴPo`VMΓ1?]gi$nN8[x#yO<.#XC^̣CE0fm%$goKǂRP#h6WVRѭDjA\Hq7D?`޽ ?xqsF9Cؐ'7 vgbo#- #nEH9Z`e8 ._Xo&+00&_;ob;)@kL8{F},^w>302'L* k07= = y宿pOʞj6(- }Ois㸪?K'?ާ'Sc#dz]rCk0k0t6֑~6gZqӄ:'anhdY>{᷌5 |J~ ~tNcPQ3wVO\zJVp%nś8[Uv7IjL`R+,$ Qv,%p ig=d{SZ|j$]]‹#460Ū c4-[]+ Aߞ]D ]`9aqd^3`p,6 L3\qAi5VyS /!d̹J5! I!O>lwDK+f}UY=*Qf Z`T~lR7䊢6 ͐R ` ފPtWͦOAmd8;[k@U`Vok.#4@w縫O4.ٝ?a5H K#a-Qil}FoR>VX}dM}ѣ_6O*t Wrtnp cɻOmCk!u{J+Uʵ'joUJꫧߪqR RXDfυQ*sHM~"NWМP.tV ÄwcOZh5: مFFqۺYzd+Sq;wXs2/;3 9V_BeH|%Koϊxsl̖"uyhRykLgۯ"vY#w j/wa'`0DO<Ox| wdAqh[]ήGMZobZaƻβİ^9]:zn mcقsǸ_/-)0('H;p葇aZnHs f:jp@L@,W.S4`Or۟>ҥI!XoM,~u0-vҶpR -=_])10R(oavǎqT4zJら3eLSX/sY_ R=EuHrp]U]UM39G-6ˉ\ y`}#H'-%W`$Q@o=FpƅϛH%tot8 Ufzbgf7\ WuBr;'=>RL&aiآXRYk^h<4z<-4Q[J"ư+z5kG%i-\, 仰HILXj͇>џmcر0RM׎ʀRɸ̱+YL<)`c7jC=␙gvi{)c.}?k7cֽ,_ S~qpg+ݟbӓIѳ]KDXOTKRxo7@[XĻW\]8%;# +!\ۢbv>?=~=8¬‚нkIvwL[)5A۽{Ds> #tl&4}}#p80T\<_UoL丆"%sx>}A Ha5)MnzLsd@ Haq;-N yHd -Oqn]6O {'W6W} SNA;Yۑ=NpXFk> Y៑j}~mhnYT\2jE3ㆅʯ3d(do Fn31ñ7slUo @-Ie(,z^M˭׮?J%LokXxPxMQ]ñҳqԇ )./jۜ\>m^gyIg;!N{˥E#;ؑ,Bs& 3fϷ(+k0&3$9 +C2a6ɞ CWK ;픡vgM9rao7ȩIܱ$ż-N^uƢ/<ٱt큚cL_a\@>ɗ'O_(WkG;2-}>4dUaUT*N g'\8]L8qꪠXѺg_1:3/0*]8u Z?bW;k!OMзgaCUxXScxMžuess\eE NB!h>.I-%4jmvAzjUC%eamt @8Pq 喌.d~-Y4kU]Ґv[TE=wAVb`,˸D&`EɯYbu^ߔD ]Q0iz.% aN|_a\@n&!0 }z)yv޶_p5lфn8EkYybnZU."}T$uΦ:w{ȸsCj5)o]6|7j?ns87S'>,&)M_qOC^TR?& p.z#  D(#G{_XM. fЇ\V,/q{qCbX{)Juh[h懁Μ"Ik@t6K'2D| tk~Ӏ+` /Zy\,Pl>a5‡G?CP( Da]~n-w0$xIddE :* Yۋ `:s8\Cr{3`jc'vhI)q ̬b+ 3iǰ._V,~3Fa=,a]?à߹"]cP\rba@Jf1g}Lsv{׏*C ʵh}2̀/Yq5}: 'azX;n ֏姇k/J/oY#SVQShsM} 'V,jRSĠS* ̹6ފsw]/M}Q%L4k řB_A|`[W,4?v ,9C^ "ű$1 8Ip 1&$U߁<]~R jWNjzh+F+Ps`vÿ:YO6 ˆ `_|b80ei _8xk(GpHJۊS ў,p',aH {!c,w/g衵N.:L|jn18=d>q-ImDu^Ew~ %p+4U΅w^D3j$gε @~s e;dxȄt7v 5^v#z/2̅{֋H[-~2KRu~84"\Z [{Ve]Hcsz壛9_J{P] .vN#:dE vo6,a͍ꀾ#w/sAyZK-Px(6َClڿu9!^W";C|K Doh[:sb"L%]׍}*,ͷ\ۮmWH8N j^TbY!+=o8x)ϵYO[*_Rp +܏գa[%q>SjVD?#R"= f wf6`$Mf?$.7FV%fN􀱞kG9$2^~63E cs,(ABrȈ{v C]o}o;m B Ym%]x\.*y!7c@k~Hl=,YEqY;"4tyI]wL?;a$$+OO(Wd̥0G$;}9[;apdSdewVmҽ_e[2&RPlI1XMh3 $.{#p;ρkSag00K>d!p P~b5gj8kֶ"{plJC8},GSZ(3v(Sz:4-MEE>~Gtd zheO`aa)=5:DZiG|˓8\ɺJ[uVѯpx"UV?*! `J~' JqH?$މC;;kpι&*]}t}i~K$.o+DH߂x=;>mX}!@$w!4q^';KDK$'\(_$7!GpFoo HwÇjVg f0n`>PH?*J6ho?{caҬ5a; ɍηUq׿R@nl){\6k F[pXS/Pm?1.r) †Ӥ-w~ᬛzNFmQFZΧLl|Z~ VZ hYͺ^&[Xq-I1'Nqw d؋)^:{ C8Wc}O.}|{qAU:1Eq{KٳSN,t" :ȈyaV+, m83x.I*qb[a-?b B9aCiΩVo޲UdֶT"5g,!.Lx`caexĦqWkzXV-`xby(V|*4'4=9sqJ fM;h9Wʓ)EP˥GNs`m&8׼ %^_A~J[WNUD>1_ +v(KmyVzy'(*֏0)%'E Teygj:™U{:()>+$Rg -褚2\b@&gTv;baP{ְǻZvv=0q1|kA7P τ'b"=O^1l0vg^' 0w;+ߎyYtwcK78Q n\qNʖHQ38 ʜ^:1ū#j |i0ĺpI GY1"I/1ڭ8#ޯ El\5sPrk\TiOqw4jB2lߒn$3 k%{/A5uknDgM +Br{0X:bcU$/۶s@CW\l [ؠi#;V,}fWwDRO ycNp\Z0 |2եȑ#`@ekbG+F*כ>/ {T!}_@mY_d\7ogM)88-w'١bnn@yEEjFS|qi&cD6/yؾ1wpXPNIsG4Vmw4J"÷˂>۠ 7OU a_V l%vDNU_'{[b+E`5za yR(V[oz+ՅB~BS58qV*P9(vMsM2z5Zv]3Da1ґ{@.ꂽ[ޖ)ĄA LWe3?{CKU +"!X.;=5׹ݟrouP?`린46]`tm#㐊 H⏫M!1m29Ddc&`Kʾ/9V6GM޴gz\m4ZDfW-ì/%\QH}X(Pi7¬gz@]aoR .YH}C*V/a֠NPZWa(~uVWu#Yֱɑf7пmOOĹiegTBm$-yٹOq6L@th?V;9N_7~Yi-qunD!]!g%]=To(fEzKPvd@( `}B۹e˥&_7%_OAni[>rOx!QH rF|V h8+{ڊ`<;La dSgp3#|{LQo!ӖG8.iPbhܻ^BϹiY0q+Jaxb}g~T +By0>KUZo:Gd'3Rdbsn|c\J&v/4 |i5b |4k\M#an/# 0ƥKJBS^ ż@>}3&5b@Xr"cXnH76!,"@$]PZ%0~=fa8RafRCd¼$\"4!0Aoqdž0VoYC-zq.0 ;pWuMn\g'ՋMHk,w#aj0ڷN6?=v2|mOE^\Q ZioŸؔw4Q:__89Οl{@;@z=5́];?w*A˽g%İ>}RdLkߍiDiu(].ph< }ZE[Ȭ|u4HVkNnBiX`s8h5HWe)8B阌4P`ݻq >/=A!Aɳ?P&s {+۩a?+w49Vk%@z+/@T]Z >ָWd9`T_?6M>j.Rxi{&a SV5S)LMf|%X#p,a8֚]ݠ,ℰwp8R6#x*ެ%>{ B.U/Xz&Ɂˎ"8;x^`@Ӄ'&L?~ew Bs+ ֝};"3+7 Æ}w&E<#K'QcOl4:y⮗F&\M;KpQc URI.\4> p|1O$VhceSXJ獣P1rA7*/M(:~ n`|`L OҾ?GtͯN&#BJ1H~w<;*Uv`Rhڙ8~G:t[UTO쥛00nG # !_gߜ<ӗvf_\ !N=b_zC|b_-yb]N)mϱ꣘l-lI.On`>P(Fc-KJ@SIoe4REfǟq׮: ѪxBj7`l⦤Mc(TݳK*C.Yl4{9"q8[G2+`QUk N$We?'$(l{i`u(Jb"XN%`_Tq*_ a\5!|U Vo&j9o/r/۹*JV(8w꾟uiDZM{Ũ@`26_!8q; n5xO`Xgg g۝u ]*5]s90Eηe.ik`y =>Xgj.GF{26֕쾃e'q,͌B\XR Ig-3sTAFjAꇝ-83# _fHqumqoR c9L\;XorѠ YzeDE Ty5Dsj󮝷 +J@q}Z[#(b[u~PV,&a!1q0xG>#Vpq`TiDlݷo}׎>&@\!2(-H@{k] ]\"f%b6uBߘ/UJy*a~߲0]aU^}["=c̮t@L KE^g$hGde+|'fÓ/3qJ0+7%2Z Tؗ]P`xɋ|=\p>rDbP Ϫ6!LhìVҩ U\깩y>4)| g.ھo^r$ǚ6JZǥ]5 N9Zˇ}ZIy4og.AԎ6^@R(6(0댆0!;tK8_הXz i(wDݯj0әW6Q^lŪԱN$1ƧdbB YyJy{ b z}V>nnQGBOԙ =it ޽ ]e^bLiu)XPoyF8sU%.3YzHzD >0/~a}{>MjjnHr9.C]iNaQٰ~z۬E4oD 5rޔ~m{J]k°c*կ6r#\ܶ'm!]|V%Ka:6\w?`/*Il8z@W&Kk6BcʙFPm{~44+l>Zw{9 %7Uq]aqvyb,aXe.u<6 ڧtYpbpx|NRq0߼?~Kؼ3h}U$sAuj}EY?/Lݾ>R?@48+MM`s||\:Yzs ܐmJ]Xص4M<cŁH^HT ~0ё-X*|!qj}I%k&6O yC cDާG@P@V{Λ_3+bemaz_d_qe'X`*abt\I rq>wyPnPNp?X$aiK7pͱZˣ #}EO0A#יz|=8 YeC8ϺP 4R\2RgšEWǡ/l54ea;=MHvy,=/N<'r+"Xghܴ)N6̈Գm2zP 'I`ƍUɳbsř֓<}r*cUqd㼅:6^O 0'0.q]Fo[[f#'X6#EIbv M2-leWtS0ӌM3Ox]4-ؾn{1Ț#ᘱqf _]~<կ!`~g'e b1M]q|̾!N0f¡[%R- L^bOom@[ZrXh37= o>Dm/51O{/<%R۰rA;EX}j"̜>vhg?X(9d5)ٷ?idx>7Zd a'w xmoF}}Sw^kM G`%3^;}?UFj8{USbqZvI({yQt6@֧u+-Bh¾ij@:7l Tv =;P+9KT˖ `SR\6_mt1b7Gtv&gc6b=T+HRV?VV}\~_b3eڟa g O:7}zapLTXE'FqL`{cq9gi9$ucHSr_+%V߲ҁns!F&fMYQ-X"UOw69>DycrLXWqk ę~ $hK`rE-= )8\#2Y8N7$N8aɼSJ+=_ cOǺ}Z*G^1,?tP0=bҭ NKΩCjC[Rxe2'YnpNsJZ }a⯑"ԝaQ>;;L_jKO$B!i₧ ܹ ;T aFcnN턌obUXۯ~1Ϟ̮aWRqvн]V>. NP|6E6DaMhmeԿ _dq\8Y,66O{򎁰q/ MC?\|_浏0֠8Ja7.bՇƱSM ʿq^LD$k#%O,Y$~+4r t|< N쑺'M;Kd?~UBfnEpgn" -M06iIKⴖ[مB\|rj 6Id /%fXca~ F`BϞ`Ic<8|dμ|vC1:93)&}8^χ N1DS*d?Myz5]/S&7-A$Jf^ڭ KtMPĺ f-I^@:L^&֏흪g[߰$M^eP6Qivֽ#yw˧. \I=EJvl8pDM{†<f~KtjqD{Rrއ30,|֝+gXNPM}[ eW˒7c}<6؟t :E԰YSL{s(՘x)RI~L;^wYA5wn5ǻ4.Fl sC]N`3rD&3a)5smokg{Y, 7y~/JK:6XvZ#4={ #w=E@4 CN}k} ?<˫ Jk(~N}@kJo~ƅق'8xlkG/mClyV%55MaW${P~T1ɯlaFnڒ YnilNXlC/^7FO .,툚ͮ n6ې|V1z%ҍz}>"&gfwCZ72GDw)3&2x-C.2ᛂᑾG?`V X]Sli6bv4,A >V݅[Ou^QDv8& L w?4"];K9tuZyz0<3 +E w]3!ǏV:(?=.1iY5cF} Z[OƚA<]嗴mbz/o->Iǣ);#|-6bx\.vkcˣOu&]\q,"mK83_ʱmEz'3S,:tۦ+5k`p肊"W'-o`3{[}" S1vk N HʉNAG2 ^}޷s8LwbIUafbz/0#1%.K~s'ao} !"ß@'ED6{'hr~/&= >ΥOqpǣ4+\[Nb<(0 J{|'Nz2bwqul֠}jli_gnBWʝ>3 &I|4@59%.\s#|ڞAw=楽!N ,_R# ªbP6U  1L~ј5z 2ئ[S&u.")yCD/Rݙz՗9S+a_",JplpVt,Շ7aؒzwqW_Ѕ3c%\Pjv*һC @x/npPa7q&BZ[uA{BgpJԠ,0^7bO`:pHBхב;z*xC6<?S)Wrn *z֎QD i:gjKu~i U`O_ tʶi0~jQ#/=?=U*i"X^(6uX#o^dq ֡mjdq(HVk\i_r"^9wbϫ@j+7` I@VL=[}D5{vZMk!Ntp$';Ĺ=Hd92uKpAV D[\,d ZڥwF$8,w];Ir H![fZC]x Y/?2* cܞ١-gMyG_ 9]~z:D 3 N^^T>3v{`p'߈x-נǺp1,K׍5"mkw]}Pf5,eӴ{+{Fqc`8=,jnǘa/; Y/O_S_o֟`Z2m/?5Pn4,: 5NÙֿqP.>.ۮ9F+18 buk\ok_+nWandu$nl~8o,Qpz&jc5*;zb30B!$ =-b,/$sGn`zQuc\ksfԵ;Bg=PfDjGEAi3IHkJfLXFS-]%k (4 - 3Ϙ|m[yf%t 8x(ҀI3Xj,o[]حD)sT/瓓'"q.PGt@"+28Uͬ/DN@=I-x3Q>S1=,|;Skq@+E@kz.ߡ7uUR8,,AէcͧCb׶z^[ /L1*Hm=Trf?_;Y:C0{ X\iH̵ʼn>`窬0RI`= ,_8G4tlnY&wYoe.{1'S'Zb`\9,6x3ݥbչ[ጀ',fR̽r=#玼܉KߣB`o[f^|5d saABO0=_.zCC}Ly(ZY2| (5sfV0'7Ƀ].z+uq*Hz*\ /:}#>PTܲLqR9~OoI j]*_'SK;Z1tT}{#}*6bm!'yEX96LZp7ɯasnqtf΋0I94ク!5W3/w6$ Է [@/w,q3!G3G$s3̝HC14[vXj}L}]- k/W:uCQ{gtr|ubӵ@VxB{巿ȸvL=<\沓+.C`C6\o@\v3;Ca{oqG彷8z^e7J 5Cvh?7rw~]KTa]ְς}nz'c6Q "~!@;ӼPI uoAeU5L!R3S8_OIF,jز`_ {ڊlbީr-l<^B[+XȬWS'Uan].Pȧ+25L l'ޓvi*deLϩ$=!PdMb!0gizSx6>HJ5ŠSc2&='[؞Q>|nHG]O˧9?րIXos^#zP. YLq߀TFiXG*_Y$J^~*Ԕ16aٞ3Hq)΂q(̵_l0;gyϤU$c- 0+";&'6ݟ\LK߄l!!HJ\ !x[ENʣ1(ffYl }{+=ҹ[4P]x[RYzbT3kP"~*^p?1iWluPħ ~-\?׏ʏh]y:6o[6lTʻmN`˃$f'%xN5b0G0xd)\o9oM`bq{ Hw[*My.2Ȝ21y:˷د-OC_4hhgl,{N;}3asE"rTyy ;o;a e4=wy~'e%v_϶.??g{~h0Y7tf[20& 75a}IX**`T5}Nh≶?D $Gsނ`ݝm0P_#M鄗XKqg]4Rxϥliee`10KdAIXL SժzVΑ捍Q9`2Rʛ:lS{d."$8[9!I..ܚ(_uRn ,pqX6I'J"?i)M@h$m.0ö )l#0\Zٳ( s$:AE7eAr0?DP F ;2HCln]'80b6& zŎhlR{LXrDe):4~:g<̫|sy~+72.ewʝCLq8ͱdhvOR"θ L񕧇l|a]S4T:,4\ƙo{CEr.:kG Pu|:$nedqZF{DVz$ugT} ,p/\8o ^>+5x]E _l00v¯ڸ՛0a;nFnCѸq6{Cu~rU 7:& 4~$R $a;gCS܏@9Pu~LJsS{XKTbMx2K?\S80 j.6fAfD/d\Mf̄ʇ3ҪH4޻r;i_sϿOi5Д6|k/ UK@) ;n;8 > ݑ-4?p|X X2koNO'a0q=X>Г<+G[wLa}& 祙ֲOB?[pnr'8> ׂs*oMW N\S v 0"(zTKbuy1_捇i=,TzE_|Mޞǫ_l5`}Ƚ-%^FË㛬vp޼- ܺ~LYRAپ7r;vZi3NK[Ibm1q3h>14"- ew{w~XaŦ+:Wg`ĵ=2DyK9VBMbku4_|e Q++Q~wT>7]_Q& e]O5{IڦQ>aɯr {la+ݍYݷp3?Ә ~)閇fnHzIHemMmlN`.<=ti)]>o/{l_`qͣ(/ skW̙120")~{Z3GB7Md4,tFS }MX̓WՃ>q#"H~Q>Qg0H#,X [ւu VP6"+0 㗻NI`]^Ʀ;|aҙ3]~ J__a0؄%]}8?8ut#Ȭ wZ\nR.*'e]ۙvL,2?1ľ}$?Dz|l  +{nPPAB$ RVa̬!#X~_$-1`Qrw jnTz*'n*YٕS+L|Cv| 'y?T-{3,$Њ =8HG;Ձ=0wp$W=&|R=KD|-+/a׀xm&r?Cݖ.Vi#(5ŬKq.&Y;̙'ljfWߝnthf.%&Րa΁J&z.|ku>dRP|#ڞќVvѮ;f̰i4(Nx0/w#}  bz\hbXW4Ji!z|x :9XdME:酫%lpieA|f(Q){\&IU +K[~WĽ7Ȉ_84a1&4x=~hYe\:-Fslf։8.w~J8m?| hsci$xs_5 \87QE~X+ȱGE6KHcg4\s1"RQ̍^HKWqH>"Շ,PvVoώtpzZz7UBU8N /atN[Xnhlx(m-;sPL>[x}E:H8o( jv1H_aEX?>Kwfnk c7%"F~ahKV'<:Af#x%\S>όin%NcVPu؝˔<~U̔p@t[LC?FbKn4;bME+6{_w[t#kvش%gM{hn)ĨZ<>SN $C'm#&=\Lcx[phoŠ9NJȨ:l%Ս/ńԓ׏R%[!RpņoBXաb 2 ]u{ӿ3-Uc?kRp5yN$!t3vQ1lPKzJh (@ܰ\ ٖV|p6{DӴKaj#?c( N3m =g< jf)nDg/@MxRIeBUb 2JT0Łm\Z&ljV`t-H8%V(EQv1f77qof4,Lm: -!Oۃt@6$_bV՞9Z&uO}LݜV2 O[ݸii$暩/ c[p_Kuhc _>Gb]]gG99V F`ӌ¦UzƎ]@w?0kOTh6Q/|mb0xՉ >{'ncѐj%[Οu PVd;A߉t`H`> |y +aI_3Fjt ;L=bc,g=J^iq_v4y /_tEw[pj a0뭣`zsqK؟+d2q%|Qf2.Gf°p84 3֣05u2j*0VIfeA)M\|a?G]}rJ;*$ {lUιKz3q`⦆-Ru9ה=8qug\ѡ_Vv{8ceGa*/0\RUr!yl h RftLi+sv^P;.na98 ڇd5sjLvKQ [WH^#_0u,X!ʵlv"u6izڞ+]G8l:s_VPztwn0`&tt&Tގ/qܓp6Gq(B.S!>$K]f|:٨U\6ΚLGaoaIGo:6.B5{_V 5h4f }&+zCCOeu#:D _ę^%K0⃫Ru?y̺.vK 02m7\sӇ,;78?A@dh1~Bq`ԯMĆ#o) y=m s08Dк^{+iEOSԴ+ 7amA믠]Q5~zYzWHX2ӬA渟~p:e;`d1DvM"RyKI2WwVvLlަE])tW ?X] +OC3UtC"`w&Rdžtb在E0QyE>KM#Uwi%Rg.M ?6IyjES〧`lmd7oS}봃pրk8+bVu&yȦkV m"A t^ҳf$Ѯ@(69_=5'+6t\5i'p"okDoni5jp5rqkUZ8(LH|宍ke VMc4qh5*uXw3͍nǶ|slY:~uҝgqzc"cv5ml.vG3nϛS`.37>ô"M7 h.ލˢ|lNoa;LZY&)e Q/pǢUzGwcN07J_;p֧{rJ6k++ԕ|[Y Bx w-`v)Y+\Uj  Ohxᙋ0Sݖ '~Q g-"WNJc)7qc~Xfo<^S3CpW2)v2Պuh$x[aJkXdsw%' i5`wptK{WCSyرNM ˜k {,W>`Bĵк sq?s_/|$z=4{Aq 6Q:b,:@;P(@ѢX7teE /fYEݯL\ ?ŇOdrChY*=Y~0VLiI %-۲JJ0} EOHw-hO?_RFdO@D'+uEubp֩Os<}cҮWϕWU]ʽi=r*@2>$&0TQЇyq5 9^(rpK7]DD XҰpA;@ J*gT`:0o`S%a6/{psӴ&.oZ Þ!g>5@s` ˟F%58FQs<`_ .@1Bk w.OTS]ELHAbEB jJW9p-qMyRߒ08qrݓ6GY xLq[=0&t4-{G $G,`` ̓@VTP߇3K^Pef6뙫J`KǏq/ 3rwǕ;ߐ6°1@" 5Hv۾naaĬPk\6X{#N% /ٺH‚+ gl~Q: ƴ+]OC0OMWF\~ a{EoeX2gkه/0-}L41{y gf71u}DƇ-q/RNgMcУ(3Py(q-~{* /EX5(kc|x>l *"0z s_L6pIH$ٍiIzKO8s{$I|̮X3kۇqZL-"ޟ6uhGhrmq&lqxX:+(Pq| oT6`bR?T5'q0j%XHgŜ\1]86Yd#;?Mk'hT]]zæ׷p)Ozr޵C01,/20CҺML<+^C۫Sܹqʜ!å!M" D_abes3,scc9!,u$Ïܻ,UJdKGwXǡdI  >gscway*6(v3`68_GԜ2O_%C} .p#t 49" [ i x ݢap%n< 63\h]"uJ.7:_͂uv2p&x(~k:qG\7 c;{I059gVynRĹ'ћ P{}-fr ,jeܻŒ}=@h?vL9Wnz0WgãŜR.)QA, vWkVslZԭ6eM0|ÏrlmR՝_qZDn/C!JlX \jh3e- i'wLa\t2Ж{[}ɑש3>m3政}bW=c;w 'x ܂ ^F lt8G// UaČG~민!//e .vCqVө|8.N4$3]Ϟ1J!trha*_;ׁѿ '!CtΣ ;Ϩ1ô[~Bw@?J̿=M; ϧ&K}0O@UVPvH9-6FhA7%a޳ . 6q]#2'TY5OÇ<B%b>/AXs. Њ[gF|\nsǿv~7`t2TA. _my016Vu}@j7 |n!P}UCY": |vo%IiG{p6 XhU8[̓qG co(ڤamr9}rT]GKt V{aKX#0 :y'`|枨,9Wvi<:&qУC[shBp ;.LpxyUzd E=ÿ}~IOqAE^Z/0'X䩞:hOÅ';I'EKse# E{'72Y.bK뵥+zn@aJx6@KfAVe0稖ă׮7aK|l^UѦ(@h\ɭq_l%{ǾVf^žOLU7 UTw7ѭ;boHWN 'LQ^NqPOn~`4%#!F^MHڼnr95X/^;rgN{'09wΡE  ~z'V φoŦlpd׌iw~cSW 7;c31xFHc$#41 7.0n#>2>$4mtoXqAƟgI&4VZt hL鿲?~AkRyS-2qZmM lV8Y}0&?îr{29o:؈zE=}jLGŰ`IRi b?>&!tKʁZ?uNdǷaihT#2+^& vk 6wdZ|nEIZ0Aę: #NAo ̿q( WKqd2T) ];t\p~93f8c7 ƚw=w,(J^l@[p`Hr0M3ld㔧"0JWZ4G8âr/] sq[@iW "$}j~AA@,x"hq5ەcnI+")&ZC6ʨ=16Z[U 2Ø\Ӿ@Y2Uݸ{c]G 'Y=$ VjV7*$O`u"@Hz~Na [D~+idƶ?;msG/,-; yf~#\MM=R1rQ 9g,a5yhWToB/1#AR lXcۇgՋa5DʠƵ,m^S￈Bp;4]o~ ߦmi.=:H"-kc.T3~m7zVyisrL\uaSEEaZZhݵ(-w earl`Ǒ>vx+!WҴPJ#wQ\Ur]X-z]_|XApXP[V3}H9b3^d`!/ylm fq&#50~Z[̘l^晡?ZERO"Uȏ,88o*s 8SӔ60.jt([Zc?\F}*} oNrÅs;iC̻a||-JII~o#_ZO=lJÖb:T>Yy gpۧaa[9,_GaF[Ɓ\"] m 4{<֥PIIZ +D O]^a^ &;dp<Ռ¯5=pc q]Qt@b$.*I VmpLu } M(Ael9/n]+3.6 &iB;r[m۵:pt! j(?NBk^XUMYB6Ԓ`c=ȃ$|l-bUPs|X-sf_"Bp),)T>mMo빏F^n/1Vί4drcQ&MUXroy]T2,t^bfnfC +G#8hu[TTE!);d?g*=cŴV Yiztb~3h\< @SR5ΝEfw?{4=.ZIU UjN*j,(98;b3 U{ۿiN Ex=n V`TQNulf2ذ d~ l{x4 )1-~Uio,QH(т~%j8Pкu1oF(¦R%Y }7_&)sm\֢zH*-|0PMՁEN^NZ_4žlzؙ+֦J ":i16mU{sgH5 aH~3PfM>&I2VWvQZ,ӭt wQ]FFl+OޫjBd&)oP #06_RTl܍+eq⿎s_ BGe8>މAj"5_]e|r:#l62xA.qM3;)4Z3W`%tK+Cp&;nϥ˓$a&ƃiH7VCO嘸 Vu)B_+WpǮKv^<F8mT8fzN ?oYJu7C"W?809 !Ӈy7IO}[uQ)ť6H_q ?dq*985_Ւji\~.lx(wD4ۼoӒvjz6UL\jN2,q䞅5(ϘP`J]7aOW[@g34ЗGuO p䝄ȁ̓' y"j DFPulkIԨǾ(*)0#T53 vDZSa6Ũ&5~lJ$|s~s6LÑ)%WWо ,R(m~ [lAg}w-A>TƷc'KpU1BY+Ts:wqC$0'vBтlDSOe~ 8.>pvߣpU1aW|24H>mr+ _<G,&` nmM0KZ/_1=oZ:߂deغᢹU'ŁE]7rیC㻣w2Ʃmf<8CQq-:T`FVCT%ɅWZ8qkʸIzjwּev.Wl ÆL94{L?B; uY"ɦ$A2{[un'Ӈgz 9lZ7lnAh1.ڲv˖erI=>B"\ֻi˷@4?HW#W<_59xO\,.xQ*;q=j e2aǚfB8˟?qMi㵥å9d}N_+h tK+TxK&ib<9 ,8j#99VM$^ɗ 9%wgz d\tڎHõC}b}G]/g[?JuVV@hU,p)x09:(ԟ}\Ik8kh3 ;ͽyqD5ܯ$ h-O\>8T鐲jy_]_q&yj7bNBp6u{ywW8.tUHdI0Ȃ .t(~ ^(;gmݭ="s8edՋ p{vۖhE83S pi,d>k]䃛޻eun\Wګɏ A[;/+sJ̋{0VC<;\SoC/#DJ/P<3롧^)|| W 5{mW~\o/.kf~N2a{蛐1<8e*{{22&`H |h{"^,U$DG*#ˉTt+O00qAbo)Lʍ ]p)cgMX0k2#e:@Rw=9aaS}m#tz(XSlfxχH&ՃR #^@睙#7&!p+K| sMGaI۞lveYg08x{=p 2eyuC+h2c7 Uy4gC3N(:& !/>5Sz0u WKp$W%c~qoV_%=Z؜ŭ] ֧'W$gX  IaPE3WO odZ\@%1& Fw`Qh+&a7֩K}tƾ{L-,?`b/1:t~}{&#"М,_a#!s`'_;V!s:r5Nd _ssqCl~ =T} 9o q~/6%C 0Q$#pQÂ#"sg٬ 2ӕ>FZj,d5d9&mJ‹Pj!'I"u8uvz8CD}}cH*b'APہi+RM cc@zUac6V 7.cl?1 WoUʼn$F 0-\][8e2>OB;F6>@i~ҥWB9|ag3R2Zc8:X\ʼnok@ߗԹc G؋6BaLKWF%UuSpglHz怇,v1>it[%ķ|S`mH_tVݾiRbX~ӹ:65 ~8&NFGӍ`'Qauv .n 7pe0 @H_.~ם!G:X흕NI# }2彗sa|arC[r2'dk|a {/0]+$_;y{4b2H[ X9GqhhxoUgz|SEھ"LNmj7:'͞Cc$p-h^:)._ #{q+!ioJg' RD2 G6d !jM@E"}W3"tJt6\VA;>&Nv}V$'O>rS%B { Hnw$w7WS(Qdz/~_>. RM{_vs0}Zw6>3ͷ}I k-Sq\Jc.~+2DAݳ.NAh:GS$tnz^m@1sn"Yr%s NA@e>}NdFf o^cсa"a8,\z_9 ˟Dڮ$8$ <[;۹/fv3j[EC4:`G>,hgM*A/왜7Ym2??&b 00?_."ֺL{W]pBg ,>hLqk m2a۬L^ҧS rԓ(Gm\) ا40}Op\2w#RO9wO1/MqG, h[9Ms̊{N0 uha%¸;(( RVDiuEEBjK̐QY$d[^DZ9??u:-__'v&.Q]q[G7-!e5@t / *8Hy_e19[0o+ ҇z'₶uTtCaCxU DSKq>v$q8{<DqE!OQ%Ϳ顯T=[Y ):Hup7"F5AmJdDT)4$U*YpX 7y暾:}zߍ#Yǭܸr'':AI#a!/ܡ4GCڵq{șC-؜(% m>=jCpww8!@+A5بԩ_p }8^ǙO'_OgYsqRk/L0_leLf7zv`R6:t"Ã֧q}nٌ?'&b:u?6`@{7͔` &9SdM>Bbj,POr܊WrˈdNT}%9%3vZ:Xǘ)n>B#$).2-wC[|tīnWNŰ@+1=-^csG]K_"v~>U?)?1EM)FA\oh]+EG [Rr&R%zYaAN 7SnÉAW-|| {#tbs2Μte8**]H#(;{j t%lkJ:-K4&mbc밾KmksoMx7ڥv3^<]y(?{=}u\>'+.TM  f\)/oa|f a CT?$]L:*z;2[Dҗmizeۏu);coF׺izZF/&;mmoӺ}?v^( B|.G,:[>BvJ-|fo~ۃcIܳX$6%IN4aS NpelrC!@>jqS>5+ؒD-"0ȵ)myHirj T$J(<׬*G AUE`yi)GN_ ѥ0eyL$>Jk`teoSfo~G}XLH0qq-%c J4Cx 8?Ͼi;9(.x`SM0Ȑ{4ο1q%c{8+g5KFbin_/l6$ݷ7g>8 7hRvb{ vg'EkkL(FE]̳:Pe3kV%uj5:"(Cc?Vk9G&^$B[Œ9y/N7VoN_JEZd$J3¸q(9@5H1t +| ww"qDҾMq0g8tYٻ]{쵵]3aL\zc^Rr>#!M58yl~ϤWEtpbXpc@{/`nwQNz 8zʱSY-D~BW$[CI6bD%x>z]o2cWpMNn(,aO\9L7JKC7G4쁎&߳#o8_7I0 _DRZlܒ{5aƐ^<-nr°ZDnh@BT]o9g]ۓrX`>H:Od]1vC@;0迕 |:e5w!:kP=h4z͈vE(}1dBYPz#>n.uPx?ɔ6 15*~U*_VٹaK8۱2< ߃@ҝFN1ե:;'w(m?9B`__ J_^@ƴB#$/y ;|u'o4 ׵ 7I$^y砡8L'1ib_̍]b?!-[I1}P.ě5fبulY_Y%st>o;рQB2P$sN:m^uYTW }1'bV~&=q/|z'^x >P (?9yS`8=]W(ǃ4a2;T\ ẃ<ά>qtmAi ۲:rBgxs' >UؓwkZxO?# N<錷 YHCSգxs<^kd,ݙAqj/BdzGVjO>m4Zv`8juߚg,^켁= Ƈ,LɽV!JRH|pI,pݟ7z.Y5r>߄+K+=ňWBp]0o3^ VN|jc}l0"3YbċxX;͔n %]oWA{/? G_<ʮV9 ~j;1 |Y?F*(N>W}τm<[y]piF& =#@WԓgGbig.N1ާs*E硘>M+7Z- _/sC{X-+)An⅛5/)kέx zKMwn1XB/~OCЧ;_|8 X;(ӥ㐉ܳ[ao>~ WAHɟߑ$0ΪLN*0T7,jbe ^ 4'u}oCj%ԿH4T:ǀA n4A̍͠%-)lTGt֝&07"@+θxgD2`@gx=? K*82~QcQʫMUwPnóK=wo}zэXyM\z4hU^Aoq{|~Oxfyk"x K GeoK _ X- e`kN2:viZceV{Tc{oX&d/e3nkRbœ;`\90Li/kţOT?$nJWsZ .| +:hpobyS8^&;PU,a`uё5$I_;4x38A-] |}해gީ!S0=N%3YK FUiЯY.7lU>;ab[Dxf|s-%)0،j}rE=`/ {dm%?P)46Mls"BJp`!^8ZFvjG܆WG++|+R|3z¢ǙO Xɪ>S ÕKe@M~0*e64Ķ7Mf07XvbIU0@}gJbb Tဏ8Xy}'yɣ e[Ih|-Rg޹J .9a ?& 0i|Z>F/|a gȸ_Rz#yɅhrua+gF8:k;yy4嬡p ۰&8 Ci.xhёTzò̼/ Kz 7և^]I0xO-  M\`+qlc mqaVkǭt9X3ɒ%߉.'t>Y?-=cz[_Q{@o$@{C*NX`_W8BxlJyw{p;,ywbG}KAmM 곜O`mwG}6%AZ,\y0 <TeP` ?nхE IHa-WG7>FVcX_uk}1;p[ݚ?7Tb`޿_lhy*>a;q -`{ǚǾͻ2ź}d60f4>}O`1/߁ #B\D08Ӡl\Ém5)*!*wX@ݨF\s@ށ~N;cT?F>jVqPY# ؼCt婿g4ޝF߿Lvh3ܮ\R6)AX#{ay`Q)Zb d;S=Ǘ`a[qCݶ5l@{r 6>ޱi˿a&'5lp{a ($?uU 0wL{5G4q`m֨ɇwhMg8UXP|ƾQb >HgfY'8gzxmHcٺ0U;7qm3-~nԌZչP|MW1u :ᄭߛ8Qw⡕ٓ_ԟ~2g_[UF vf_ex@l)1sK?<$Gݷ" T8dt-RԗO(C䕮cXY\,qx3G.^9X-; />мs}+fy8/6TZyk>X)a ]L{ Ga:Y\% N|ޗ8 _tVDHt# Ūt2U V|9B~Q>̫eÏ@C6ʹ>uW |3Vf+4 3-jQ_pѵ iriAz(I7ȤVk6 cNJJoŔ5BGd*\+R-6ּ𼤼?J`ymQ9@y>],{ߟ3i&]ѿ_ƅ H` 4Zu]8ehqB֝r$ pS־'3۩wC&]3cwO,Yjݥ"ɧaϘ<S}aۄY9NHGEqlSژͿ]GǤ}*~avJu6\\;6B=_TMCCmY#aO{CeOqn=>* bPDJxa]ZY Nb NK*X54yo='ꐢ=˼i<38}! 9|QJziZ,~2,eMS2^BʱX'78yF Xw?;e/8`Qە MGŮV{ 3s*wpI$ b _۾J_KBR;t=4oP*aXWNP 8,X[cXiayIHoPu?Ʊs&R?e]rXq;7o_d>)Q+3&>kYz۠!q[Tgib0$e|lZI-;P>6 (g39VS520-;9s?} r?1)~vř\ya|Jw6ݖ0תwU=f\oBt{W]Qϝ>^7'b`M[E 8V5_0\0!@;+EЫ)%VdzgD@"Ic )Rɦg)cr|' f_A =78Rk>4BFV~ fO(@v*xqJ~XwTa"zw0VB`mH._p0`_ wB`EuYٵOϩRxQS0[T/i:A f {LaJs[Š($ZeWcWq*k2ⅿZ?W$AoЫ!W[S̄Ÿaއf]@ٔsrE;,ge)R(akk<5Fjsˠ[]pQw">L9KlDC0fHK*50Fx`ν#[•.4\yo~&ߓP{;yo>đr_=cQ<3;~{c Tp;n99^C8l[{3H#Z8S$% eR )[]^bCΕzf1*-38p7&?I8I7@_2mg$p{'XBȠ1Q}pPV_ܴG]WgCul2z"p: lfc,=\mR5xFtj:8E 6|w pL>C~Rt0׮saZ3ZP W|MSHSR'煋!˟lpeۈÚNَdzΜrFtAc?bqs>a<,4tG_RRS;x/K.iGTqD}N,I N Ɂ@o.c4yWu`]9ق7R`apr42Yp}tV6˙%sq\e$?4=VW8g$h-. F˅Dy2?^U^:+ػd,8OHxSgZZ;r6V*g)'v"yR$l`eSfb#Pw>o,{:J+Ј~7kÚ[Zl47fÑC+Ԓ'FUVL4e*4:}Z1V('F+jA᩠{2 ,'Y w)sڀ>;L+K?=_d]`)=ŋS?9ZGFu7,j]׌c{eS8t!FFkbpooqY$x&1C@,v >j[U& Zel/1A֞dfjDĆW7Kr"E_ H?zĥSv7C߮VEEl]8vHKUp@w+#xH L9>Pؘ \1QºSCY߁4^fpTH|Qr;Gײ}RQ_^llH3 6Oqihǣ--0KVCK~M92zG.8Di'/N{p[ c'W6q:ޮkTE Go ]86h 7y/H`УXkvEk2[Lޝ|>k?ԥ}q\eͪn h~طlkFqTZEC.y2Gy}i;r螣z3a[Ԃr GdactX4>mzKgNך]㰬"]=[o&y56 Ħ}ԉn0Ұ 4] v2%>X%yiƖ_.b6pԃ+4n/նxRWg |'gۅa20GGGݯØN 'g7Wx~ lkK?@@VҬ1[AY@̏<cz:q6w'꠶ }HCI0N' AZk꽨`Ћ0Z誽ȴu@V>5Zxgm}99&ЌŇuar4@obk)a~> 7y"`œOt FxwucÒШZ3&Bۼe,[z[Pbl"lIߪ;V)-g [s׻o39 ٰec7N|{eR'N8i3\f=oX>C&ټ9 GI@7 gF04qXa8t zOY шDA.2?$bt{=CӮSf?&Y5ר"`cgK24R lAh~(>G&ues#հw[S̩J%x!Q&cfky оGG`>؁ ?TrAWU s.\׹`NhtIn :lKadstXiZߍgBqHSE4PǻbMVF+C򭟲*@}MfX0o6a%S<>F G)fИzdU .49@ύh P{1ꋩ\N~3UorZ+bz NDj`TkwL; R;֏MYzwbGק1r3k/26VӝGS};i0kq۳ >uڹ> (igEUqG})-:+?C18B" sFv as< *nJ,s}G1bPi3.۫0'h ʴs'$'3o^@5jjV~p33?|0c#>pF;qj*eXbހx-3m4 >| xBmEϯ&UPuns{ܟVn 4c2MTX SƗOƥ㏿bG_t,TQ-wv~o]oqE%C@(,MԦC5pX 3~w~˚ȑGaF3_Q/b+ eIaaJ}^$a_ vݓ?6:aĒW:8[lAdKwH<Z1֏CO k||+t1%e67oyo'mǠr$aUeBUa˿sɳ1۱JK'wG5?kر滌_ ~q_,}K:1 [pX#ޡqyVqhs4t̙z %ۛ]q8Uv L~'Q* ST(*QadY"?n'֔FVDB_-ŎIa'>Xs7OϺ`ә_f,Z7ڙ~`6iHdx05:aO* mK Wd`ϠF_]\{b (϶+LʈN:mn*7F[S_7_w{, t&::pp& E |Hu@ʉ]`vq, [·nuY~ylbmZM@q8FzOd"*_Ic7VC5gE6*<3# yD2CP\'4 ƈkߨηy2/+Lso⠐WO$+ ҆ph1݀|.!{do,{dvs@ AtG?Xd.wcnp}0d+|(G*Zxe {T̙JfMo_gXpg$2 NgX˨KSs?Q݅vwR:R*sʝqywt =j_*}w޲뻻vhBKQ~+Sr!IL;81ׯ[rj2?e kWb +\siv6͇ؐ CAom8>]@AARlԄ"q9|jj͂`ٯ#vᛱ)qSr9Ϲ؝eun2 |H/lR~r$>YWf}Z姯Pwö^L[$hӐ= ɁFCkXe;mەpjUx{".d-xLֻ'Rp&5 c+gDqڈ4M8lv'َl|ImM@ݯpc@^Չ ԲE*Ekb{%\iƼKi,u# ?v6`@0yG(őC6Ň t))%^E8Z߹q3RB+iy'y*.kVD(W`ș3ހ󶶝i0,^%6NwW%/~7 b8tpN^( MYa8;n;lމ˺om#}t‰CmZ[jMiyj ̻Q%^ƴ[\7\aRsȥ;Hgpak ۮ.|5BSiWzU=MatZӛte' Ƌ+[h@Ə_8Up˷4ԧsoL߲1F#N<\yyKVEa}6$j2KaYYGS߸қ/Oartn w;tJߖ\e<-?3H؁!(aG(v| d# ^K*NfztHW#VІcTJIW*P|< ĸZģ wJ]ڐZ-T djBQEqx`]`ac(Guq> [4'|Pwy"6|.['$F<@g68dn6GJX)Tko_堯籓*ThXemhX/r5B(1[RjcVxLPBޡ㸮h;@5-IT9UεNϰ?}Fɂ?]^U†EϺ'RYb0ͳ$~6E<Z ߝEp榓2]U$'eJº#' dnj*ٻ.ft({+SN5ˎ]n]7wt53@Fѯ qu{Cc"2Lp`\?o(ygeIMjX.@7sc,WKI)'˭D.8G8*pQ}Ӟ8uN`G05 %+ s,vü{ PrA-XH(9W`6? =~&Ûm@ppSơsKr zrg+7 %=:07e~{no/.?:@Ȁ!ڢ_T뮛-g_0;%8u)&{^"~厗5eE3Zʵm { iԂOˑ\[9>)lDz4b7ϧ`8ew1Ay ˕ޟw=̝V!*ca<ݡخ77K;MIBm34c?&iy-APH㭤ǎC]{'ѩ+o3mM =1#'Ub !Bӏe)@vv;-41d^AL N!}[^YRCYYMVKp.Vkh3nf*cXu37 _Zbֽ,,.9?#qVm|-<ɫ@'Ki77Gm8qiׯAm3q6u$cKO:DY~#ԉqseYq}Ff!X89LɈO0U`NoızϘ8}ȻW,Ƥt8{8P7ROc8_+;yGTD3z̅%LL.ai8f]CvT$ymOO}P8D՛!ZpVdVw]>x'=8 !oqYF9Iu7FܡIq/,T/V׶_N0řɒ{hŌR"Y{m8z$h}0z&,zت,jk'jw̦`(n<<+]N.p@gP*C/ LjRiWnfgiO$T \z+3"3 !k 75?cW#epb@5e^|1mK4('ycwzSm 6F9r!q,]ɎF=0r&j'C^29 ͻС|`:>y24|;qnv(S|o-vl16V9SxSm}I/?m-v_!`7yD lk0Qr FK.Y|HyA[>+{R Hu{}}!ϝO^7~Ȗ\9p3'c瑚˗x(~sGy^j$v2ԏWވ9۶jLL(QJ?R~w?:cîd\aF7vGaߓk9$Lÿ>DX&T C\nbOX)RT>RWݡpuQ*@sbN'5no;$\󩉙ZNJ^:qL])P; Ց=_BӓJk"*V{TA͊-(9KɤRb/:lgZע=,0OyLj+O+fpӴUp?P>!{f)5ViH(5?r$f6vpul7$<.f [N`x|OKu$Cy@"(N ]ㅞvMΟE0U%LhDfs0$ʹzo}84sF #"XQ߮qSE.'p y{Vax4 {Ti܄a9UIGB<<q@9U;-|NŠiAkM0&eQJ MNo`˃^yk;$q{8&^gc`(f<*.t|ٱ"RRn_[$;'8~b s &/bZkZϻ~aF'ԕ+eJkòӬ'q@!햣 KgvVE;y7z!8Lcav %8{Jrò7PiH?{'P=`v;[>_|T7_qja\==ω/s.W]04V'o|^?kmkv߶~- ;mw@>__BuT <5w`u!%-ϩ-`|8ŲHj..[<&ܰ w50A|8)0 ?$nRkQλ!O@,(P^~`碌 ["7T:PUf\44ʐ] ;E\Qʯ=_`v҇kO=X%~~-~ٙae$VcOsĸp_`?}c:E]h̆im:Y͐6tm+SUNAͦ5۵+qΔ7YOQu#RR4=ɠ^zXGSFV}'ۅ;BF{1L5zQJHVaeXG3FFlrQz8jrǤ j|Kp@|^W]lW2k/S#ET-Gpbݹd5$n5~#a ر0@C( V.!7ˉY'?0ZQafl)8)MCD I0@OW3G3Ҍyɲk _q-lp168}=44N{Iz@eVv^ *iou@Rybkq h Dm#]xU;D2t[ aѲ{_K =t(}øL\E5#mH͍}ggf \fC?9uc7پHU}+tyۈ}ځĚq(cIׄioFaS'~q̩ݮ fa@=wm "קpq1X¢_XDX]Kۋ̓ceS%1 ۷DUUXp uWq^!>,8X@E fF;s&ٳm(ɜv81*AToB50@P<|J-dщ!{&0{_f 8GZZ ;eK-a 4乘3et(71YB0-WuѶvZXl`iW.d*Yΐ kfq\GlMGnQBn8a$U{5&?ĵ+wӥ:m_K / q my7X++{kS 7eH9:+go=>dQ8䚗)ڋ3Ce^8)8#*FSՖmaRR{;V;o+^TT]*No,8L+y^jZ4eM13mHڿg>@Kɵ:b2e(LJ}!%;I=Ro3 {]q\Ι0'w$<#my~2,_ OlTޱHՈ#s s[^K}͸'hVA&"Mm' cYM}8^ۼ ]- kyw?G ֮aiQ8|˦q)(gZ4j Ԙދmu4}L kf;+L_{&uZA|.%?L3i_, jy'u .U<1߉j{.n37! 4̅ WKN)īo7}ZYp<ۥ簖%g:^}cDAw}7%оho_xFMon_u+Nvtu_*w{.Xy)ҟ ;/-ߩkAwKUl >:> @ꁵ_g9rL~Z]خ@sjK2>r dm@b~55 !cI&xrg4CRo 09!N d9 U`\ e~BƌJmHIM( ^t_/ӣc|A@O^ >?sc!qLVrJd6.фv+Oqi!=D|g&5blx|I o *&ck˟\?AGҀ+0ޞǓ4ܾ9e\y:~>Z iέb %qyTkdjaL)?[$ 5B=ž]NuxN՝sj BgamƱ/v(I)oTnyy9 B{nsc;ūv`}i1W9˯/З0n}Q}dS ŧMsSA&}+Zw "S:##Kp,lL NZĎs`oz&utn@γ;CaF@88KGWn^ɢdɰIUWq?6 ? BHw9+L>cCgk|*V R~^Ė[/-+a'6fV)g~5cŪV{0L=g5oc$myF Ou95 ss}hlt0&۞4RM1 cvgsbWt1Dʣ<̽P\S4#C}R0MyF '*DYYuU|qDg}У<*^ 'wW UB֡e&ѓŮo.,*L_'VBɢI@_@ rԎTld[y暔[2/+i{ 03\kHRI@JFfHCaR^ypyӾZ `r;q;a&ßV)c:;Ѭ% BlPK0~kO[L:|e K6]^4ح2;JlaƆ>"M]#obYϊi8k{ v%_6^Kc?g$(Ԧ}& (<ڜV@rDOVb""aP+k pZ@L9 dOu04azy#O3v(^zk]݂b39rO)8r+@ mR+{U6W$`{ذ.VzvMjvk'=IFxj?Rz$[1cfo.fWq6`2id1!I76N}G2ێ0zI89Իg֕@S2M t*т|@>&r .5;>+_7JoDY-Ct' Cvw&UPb Y&nXpYYnO JuQa%88<1{'_F$ l7[w68Rh/y]åaUMa^:Ro؏V&@>?5PVFnP1{A4ڶ;w9ݥtɻ7hW 9qPfX!|ݰ0]k\2ba8xG$ZۈBeLaCPR=_pBö!S7.'vXqq~4. evx,E8_K?q99#[~`}6='56L6Fru.C{j/C8f=p4 "`~n˓98ݳ{_wyC: Ի&.(LXHlFbʇaBA 4w4_:l-_LwF~Jsh#yh1Xvt=wS3?B(z`\?Y[K^~Qoc02rdݯxvd=Lٶ\[VR{NۛȇʕDqY{.j03 T1$-e΁rʅ_pt۰g}dOt?Nz_V] {B<\ym>eEX sxsuiT @oW8P:(qa]7qù|?pa۫sOC{A}rO2FfjhhP&\̓.E0eA,0kIyA'wLvMa݃k ů~9z҆naxחA⊱^GV3D _<4#(Xinb_s RIP:G5Vnm $NgilLe\*`]?L L ;1fUŠjQJv>4kO5LjnbqBc &'츦Ӿ$W0rpkiډ?8S ujQ;C5_bI@\:+6\ ӡտ53+U^S8߁ zPK Wڰi[8.ozuO̍ZZ@ :YJXΓ>Ug9ZJۥ_G#g1ϹB&OK7 #Į\n=ݦ)pj<-kWryN˖~#1]ioľ-zWCZz?8?o 7_rơ;P'Z#Rwf;1K `o5ƹ);G[,Ȁ1 0d  ޏN4bS}5-%E"; R\+Àw:a~+Foolhݖr؟_fJ˄×h#*wk0ɩM54Rh>dìȡ^{[F- wCKO^OO?#~F^ ,\%qaIfDn ykAu({xt쐼6S*> ƶgbE ~@}59umAw* ƥ$ꆖ\o/q/Wx4r b-@" v/l=Far8?W~N@rh3$̆ m}d _p Vmu@ci >lka:Ԑ{8~^ g rf9Z韟b cbiA~\f0?ޅ_x݊gьd _Az sMx^x41g<R}[af=˩+@>T9mJ-{IuWg$W 4L 6'BI(7sm`&'R.ruhü %l1 pn L% D9mX_fml;媾຅NW}|sゅKZзFe]bsq c\PkXv߃QNY9i++wr_ArYv$NUq0y)1aTK)(bml4kad}v+=Иv$+`1 {n!x=Phsi1n409ǵ5 t\25'cpԆK!jw~c0ˣqbƷg-f KiV8t?F[~`7D4 ;q1vR5O |[P*H%p%YpqbC=w@Η)o2M}{~CEA\xʇd$jNy;(G]ݕBu6X6K5mUoH>=",$y Swհ+[j_ۖ Z"u[~wl[rY>KWqtl0s[GՊnzQ5Љ5"{ưi.}m$C_[T}nvG\q|/XOS]s+vܻ*R.vJ~?oqj,52U?GN6~AHN O$&2~R@M1j~,:,gpJΪkC) Oi!է{REO"+uWK5%cbre~xk ݧZ$pl `{;=eIa|[^F5NXH$ĥC=pBCsK$3zf\('Yf/8W~^Nk 5Bgd9Nu5~8#&JSVr|\̦›ü+w>BK跱|@&g,Kg][ƶA2pPs~"<%%kC_\Þmz?8U t8N,Ė;j4mʹk soˇ!b۫y$lweGAH+Q/}BRgYdF$vƯ]w~9/!N;N~Г`'p} ,=7B n~ًG>v&êжu1k~)j7=0 ?Oq q]r צwѰp8ޜFWJS8qsݸ4-ֽ.¬j8x]vRΗ֯mtf}ᢾ%OuNm2xiPzQf=f:xۏ8:'  ?gF($c[pw<F"8B&*M}:6&n 81{!p=n3>48Y)]c)t@W THͽ?8lq>볖VXa6?^b6BlL`sg|8xPAДDcg9x`F[8QhG>vfS5f ]Iv,!Bi]=d7<+.=՘-_ 3<8gU礌oz#aLo04L)W)6뙴Ie&%fn?Z ۋ ~~^5VuzqrKf5w.]Γ޷ᧄP\{ra9UDп0j2u8yn7ġ kuI,Ty@k[䔋8N#;+TAL qS6kUqx,\y(6焠>nWѣ0jh IUa:HV$[>[Z!Tp{MM][<@fvHp} vW<0Y,nE72sg ZܟVW39w#7X^i3|hluoѽ#a3&|^n"V؟=l_NS/x䡯U ޝsKz$ a׏5z7.ÆMN$fEތ7Dg(f† W 05#@dvG?0h] Q} :@,& ~E)&[ܰ|c* \. %M7{xWK !)i] ~tN}|vVÄۤ'Pn zt +,UdD!K+ز[R0N/=Ԓ17EG;k}]FQN}yxʟrzvϧ) A:ʒP.=+łK٪\|q懿4)eyґCq9##,H.FAc۵+ML{ H8zK͙qTֽJ -oENq[)ɪPep**eTвJJ)+"}~~:&R} C9ķHtxo߃O[_>fXwW4 \svl͹vjJbW:D 7,勗š+F9_}+M'>ew_z⯵LJﮞ뽵%6dFȜSl] m'>A./-`; XѰe綽@˨,t5Z3T,f^dRP^GBw ~~ Oּ:gkh_>;ܿ2c}]?mt>%ˆ* )a!ݲOu,f[B 3(?A 9}KC~k\(D==U&C֛8Q-*؃T} -bղIvO-$E@EPˎ6 eb/#/xAC(~u'* J%8r1]\S@‰7'6<0ɥW`P*ǟg l>X}Hml"'Bxl ݤ= U9u6z^q@%/\YZd޳K@,JAgƣravȒzA|OE \Ih;/{nYr5ʾ)q~ɜПmH%=kOp|xK3 ?]^ț/Aֆ`+M9AC[=e \( }t  7-LE|$Ps_hñ 0 ϊ/\9`l}A}8H&zT܀0[ôr^/\xCjU)Qs|۰W2g\bȻqWDCa:װe ptmN@.8v>aA΅ n\J' h-5bM'U'27Tt[i$̞k9^ ~!LovÃ{[t2v8 vѽ &—Hاd᭏Xwmt砵*–ͅ#% 3G:O<7ʺc$ldQ7j 1¦Vz{t F9fXg<.kn.[`bi};Aqا}O//EY5 })2iO)Ew?\n>cDI?`JM?9CDJzX5W j@=/#~{f 5 la(_6O~ޒX[ݴrɍhx~<&ob##eͻɀ-9CvT_wҗxı8u֞& :D&9[ {O,L)+*D5Ӱ:2MkZ$&{b {<e~E ߊ"vnѫ.)H:d>m Ow}Cm%uDH/8'20[-a" BWn:f7;ol{Bឌ%ȾQqO-h~;e+O L >9(G8l;|aپdžwq񲖙1_7ؓ!y*tǑ1};ٲgYWu.P>P=ߘU+!הbH8g,i]$[8c;gw0۩PMh~c=] U_x4DLDl+}*GwY EB]C0,E ǒ jb1 ϓp(}Q,? pְ?t{HdnreW-΋Md[/q𴡅V[+^ l离C`ytHR: L5t_ͷ8|T՜跈)Btnqwg0U9n Ѹ*nc/ (nG69_Aqź?r--jsj ,rMy߀XSnKAW|ΰg ~621 eԼiS8ݎXhyDu? viSW wҰd_irqHmp#%ebf8~ΙV${) /ICtG0[jYuq$־M0N %db‘lH ޟʯWW%DVB,|񅦎Oi.*}$j`R;>q7lijO"qboGyF$O˼cgyCι@f s!q/H_̸*[Ov7'qp= Ud{~lq-GzS?[AW 2'#DW|ԵG*4|ցGOBTg ,]jS!Rj9tAF$& ^b`]´f"~ծ3 Kt\$`@cn8!8(+,8h=Ǭ̂bDXܤ]9 U:MS 4AUO5&d g)*׏( Ă6*kn?e"sη([eKRRaJz}x7Ʉ-S_̹L8l*Nr\݄Ys;I&7$M}cq?w'<ԫny ݡa[URUZ-u/ނ{t{AX*SI=jRPS8e[8RXɵ$698qv3 -ӟ8BݫJ. <O&F1[98Ǯ9եuRbb#鶂9U3 w6 8ںݢ!w2ƶ4l/~g6-գ- !rT |wtVe/ZJbbpx/ aBe e5֍Eg.Ed}S0v}-1q.&.}8?fia}/ 9 tGqoB$3r*.i2,EaH>+$neMgB#l=W*yR ^B5smX"G=zW `@o l9͐2D aG 0Nu>\,0p8,y-);& 鸞8j4œn'ð>?ӻx,?AB.Zd…۩T.!05#D "w|ˋ0tu5Ni;ݙ}cp^g gFNx%Jqvүiyj nQ3X/}vB |}:fPMЋқv7#>@MʳH^ ¶'L* 8#SGR糜?DIv( "&vA'eqۯ^YkyXial5GƚOg1{ÊVU ɣbXD hB7ɻ5)8ӡaKIqk`LUaQ+eJVҗ CF(/0f2\`5Pw\seCR˨®tr8*9pJsN)Vjt8`kugxy$޷.NP'[1ƥu0h[m0HłX`s'諬#4ӦG =.QC0vo/l_G- G幼ake(_!hѧ.s( w8d$L$Rv^*ǣJ2a]?;Hiv 򱞲+!'|Z^uǾ%'$1:1f%t`@rZ!%W޽&`?~ 2b,9) orP`X8T?A˟kK?ll\B[G"j~6TV߉2BgeRwup5I*E ="`NZd\|_ VUU~؂;\³ 7r3=kw!䣿譙*ǎ7wIDZaX3ɢ`-gQd⎭6*mnyqk=@?e;- p trP~%G3IOk~G,q-/)ٯ=rkN3ȶVي31XY%&2Hw( uVb0y~մdF3Aey1m_l 5+ӤqAÐ,Iƶ^%^ L5[wfgz*`Eաx 3BZ.P!;}U`Gx ] d>cD-R+ xjGS \Ne%O eP/sL* }4D@pXֽ̩gk8g7.AwRX|v.,|-\{E8Ӈ)`HX'Ik}}E!3Bнs.'r|v!~}R7jIfq?qJ"G^x(j98Wz,s;2}龚5 91\XLKy}1Y 7:_랥4-Xn$E zώLu}OXS`ln^z[K^sM53X qA,0^FԘ:Aז嗛8YG&"XNf,`8κT_qoXgzE Wr\\xKhN-q{7sd3aᥘ 6 0s)r#lH5o>h NR+e C/K ų+~7Vaqʳitn'>tgz*5b']8QWr PJk;:/q܍9w Z9-ЬkĹg:@Xt5\Sb1*W/vyZ;CߕNB ծ?d2z(99L;&xVQGΊ^Ú]amݜ-Xd A *<҈Z6 Bbxhkq-BYn}4 kkd`l~XeT0g|a~Je'~$1n}9 0qP$o\ZowNaS]A0J=Ǒ4Q5py2}}U"V#JL[XGI|h ݮ3 O_qMЗ _6 VeH;ΉBWOqfWX~3Ƣ:.YF){0C'(_itsF,"`˽܇SH= Id'"Dg .Qk*gNջwx@XCCt_=J+FoanEW駶Fx Ճcip? R[? ,lݱk_V)a6W5VJ|`n+ xBRYؚ}qNNt ?J8z.T*"Hטs,Gﲇ4?>e@#evD/kI uc`8}Uz(VnxWa ZK}0(qg/ý[i;T*&U#bɛ#fz˞;|]P!HaknH >pUsyRr`Y}5T(}]ydwRXmO{ܛ :^1^۝?*`ZMJAl hHD#_Hv$KMφ*` NKrU = ȸ2ns3)k;?ݩZ} n緽:9d]H"?hE1{J8U#Z2G:r<ƒa6kaHUۂ=xKRZBM"÷l_!H j S/ͣYx}3JTұ \ŜW uq ]=䡨 $+vzP:bȱDQ0fؼ0"i[Z1Ot.(*>z?ZSa{#kw4XcCSոpSvH~mRrrNݵ#gUJk3ZΧ8vGԘ9T'O@& .$;2 nphţ1<-dp=en>l]7n ec{OAjw;ڷRLݝuN屇Q|BG;cq}j |bÂ/8Gyn{f/LTr*!e}CohWd, bon_59Cjrs#u.O߯#<7pbD||3zR5+?sl%Jޤ3!Hj<H1)TE8F7y軹+'n_ ̅%gqXu5u.a'aMPT%ґq&܊͘0ү o,#R)7{-?*$y'~F~ec3ۏ}w'=>Nū$ Le4tWF }L{LkkB_K0EsE^VqYŋ{!a'pBjy7:!hx+Nl Ƌ}U( uGv<AHpit|(]nʝZ fHtj:k#%. . aw7$TrU2_{)Nn#YImԵ9>KM ;OBZM!kkI|p Z ]+!s1P: 5rU- EIs4*0QR0;MueTx =-m_F>bFܟyU+- pф4Le2/iQMZ;w~?lX҃+3&Z?gg(AmVc۴ƭ#. [p)Dm zKf AUѝ9/1؁}frݘJ"c OTNjʢo/y<{ )ì`=eθCӨ7ypн_<3y櫍K>놦[\iP/qGgi-.'63f4}⑝[T`iղ_QTw'X6*}'V<Ȝ/%>暈0UHOs쭉H~_ *,eLbo^Om)WagS0aW SNAPPv46Q a;.\RFJ`3#!8wSX1 '' A]y0 | B?g(sa yg?pzUyX;wy4(P+^yg=ݣVBnKSԡ3+[sW uXUH^Lfu3EOselU&Rridm>繿^ wvHπJe'L"YS6OIWDŽ3R=y>" uBc-hӗ#nG_!{ⱍ;L +Wpm%yzr@8&\"8zk;`bzy;)(օQABᥢCXWЁRagZ߷:.L=}/Drvn˸n|wsn_gpУuS^yZm\0\*_c:?Ϊ_a8aCo\V&֓L4/`Sbn\ * ?rt{^c88 n\\ڥ(\8_&+WT">Cg-\4L/C^Y_C@ cy,Sü7K}l';=G9ڞ|&=x'k0rK>#Gwz$'[`+T;m#KCR0rN3 >0)iLf)`ڻ1;ڊXy gG/o2sba%IS:~E"Bg UU kwe݅1&DB=8:)W 3_f)l}L8\Y$PV "r(0cۛT30j?jÑ;5#ɮ)ϷHS PYjyp6|S&1,řa:0Sji  7"``2h<|ӌI/S$ݖ[`gd3-zT#f#8yQύk@WqMmxv=N)lfB_8Gr.!rM+=qO2#7}>T89Z7SN!g*L֋W^FR*Ӱ)4jH8C3ΙvS]ʺ'*)pL+Y͏dW SFnbk$hvZY۽L6`M y1.ȕĪϻRs^@[j0"!?x 78_as [kVmF7aSa`dvz6L= $j6]Lp6DH mbq3U]YDwYr!kwis;7x3{.*> ¢0?e G.3b*=jxk*{ O:="q7h)o`p NİM/ނ=o&в;XYA}췝siLZY^}Je}[{- 24>?Dz* ثkSw{Ǟ]|\"!' q; dɎVhŐ;^Nn{^)jrYlu_|P@7l+"_asڗ`s߆:eGMN^m j)-GDmRUN5T%̻fvXaN~qO8t|B ;Bܪ?Mٛp::Ag'W0! zla0tZ>߭t͠gv͇0*,_R."jA^׏jס ~WOT.X=lJVC^}aHpmqx6)1A&< ?g.tOU'!fF ٿtEk/5#Cæ4;qt3-rw4M xyޮ\@)e!^g'Ýܸ(ͪGjP~ LN=Nwg5מzCEM!$S~Jb~Eh n@ 5 ǬDwivrl3{,t2̟Y2_Ddf{O5pkG,}{#'$^ŹF5\mT*5Y1;>v"= +fnFZ3QNCQP7-(wUnJ8fCd"w2- ?%j-W0rL!&l"č,cV)KpⷺXh_u~dݭZ~~ lͣ,{c\}~J zs:|(/\o1x#Y/C!8s,pY(,^Π4sqnXCG Jju".c=^]~Bm>Vt(wEg/v\ŷ\,`~a($ !6\[Oƾ_0sw{|uvvBwä1q-2?:yy݁r-7%ʍXߦi<5&Ώ]u2njӴPI86I]Z1rSO4u΅dKzxc8'N-86M?<&ٗ3eGO{xKe<-?՟ +̧wsNC̮= ̤۟AUUbs6=XMU&ү6+p$KɹBmwsc;P&! fْoRۃ8xGw ~DmtET.ԘOCUe`x4AL +$w߯`g)8s'aw쟈q$"ØKر="%E0Nx"LRpNQYo:/6Z3d?enX*2 ʏ{T`]"Ʒ!K82Jdő; 8`ƐKmkUZ$xt0s5=ᦈGORPj~Y"_*!qo tutd>BK rVBSiXpJX'5S Ǿ]$: )j yNj+8ts[ٓnA}amu-<{wH߀aO9uaoh&IaFR.tSBUVۙK};8\|[fn| ||R]XOy"ɏU 1Z] /7>vӛ8w>Y(V>n_r '\Say?T' eOo؃S2-cM*WXzA=0ڈ%suf7\b5sG@EOzWI>L;"w~ӯY{`#[?)o+ ȝ]9))d(2J{[R"#dl7LaVlo=C}qZ복8~G4 Y֜XNjG28}mq%T :BaҀNAz衻| AN;=vEw#$֪dJ7rs.N1gR)K;s$K88Q Fd2w>2ѕ&6bqTΧV@,7 \d-]C',|чΧbJcUL?ׅQv pGa܌c}TW_4%`8 )]u]M^4 j4@YW'ݵdlaaE{KgoEM/:npcє*a({//XvG ?$xm낪HH v{br 3J06}%P3/MaL->|ÞQIzsC3 Ӟl=uiICO/lazۢ juPPbM~wq然߷d"[P|W'l;#pIB5fo>l Sv9uϏ!Pw"2yӮg# \QwV,,3is/Tv\|EU\'?7CF1mys(Tf^Vྑbm|7Tg$zn|R#?_>S аO4OF@/u^;N4]_sUW?|;N20o\q02 |Y]V%yi%7 ;<|6-ā~gך^3.4=%f&]'%;9Ps."X?檭U}X2 tsZ,`V9zYbɓw2n_0zދ^~?NuyþΦ`rJЮhE}>LxBG#W@]5ßp74 1j)*⟝C>ҨC,96wpX~_qPy ڋb}OZ\ZToO{pTX$CeY&\=<]sp\ݔ{^KMBy;[@M>bBԼZ-`1 E){TŒ65I#8w=u7oO5>Kcz-F|Ey0zh{KLMcع^z .411jFԗ`fҔx !a8%Wum{J`ۙ'sa:gJ@Vex=e'I'&`X-ܝ; L4 =8ɩVaIgܤ^ 0mQst[WF Sx/,ތ{UV,YFi_)KY_]PJJ*cNUo"U0-9ܿM&-;qŭ}ah%]M~-]WN|dtIzsaL>4-5ubX4pZKḰ᳥ԷƯ6Ҽrmfq8X'`j0~X-5x kHeW2#Yt\{J< WȒP\ȟ&#pd8/h<"Cx3]"vEjOXl ̮d@{h1 JhťnE+AZGH;hvͩ8+( &X8R)0gG<[ - ]9L6>*m5{蓽3i_o)3|i!PqAaF2S8DzEҩt@8*Crrs6\8(E0胶#{%"꜇`pR\VV+;,g&VZiuľݖcq4fzj=$}*mkA: .Y!P:MsIIW5iEv'z\L4P)lAy]Pu [CQGRBKgѦK{ex6?7yȬ;cf9:vm;$mm7)4gױu5m?83}Co|˧o܂ٰ{CHlߠDb 3":x/ŖLD _È0䟴9;7ц^aX_#C,Jh0d= !S+؎-!Wz(5۫[?Ĭ|Anv\~9?ffޜ?shsU8x?~*lƺse-WVruopAYAGe~VbbͯBm0: <,3+w>c9CGLB4-49sޟ&31J0(Cr-̟9bzLk*>XeK?yד"l̹!\h0e{XD́_nn@tm>"I0328 -@1X+A*R_S44*!3ytrmJ, ?=-*0 ӬǗE| w{pj??yv&\mdq-= N:Jr_ww%'Sq1 `"M{F)6G}T\:u -<<caWV;yC )jK'Ǡ{k xk@Ɉ_ 󟈐j:|g|J!)My-\4;Pb7v"O04AiF/<]ħ?vP:XI+'zL"^g)&̇(p6O;U8Zy EՌOVolRS~Fvv ^E*8ҋPwlǬˌ Ʒ'f, l;~tVĔG-+N}*n,eř![]* Γ/~qTͩJaY"T?/NY$.czvRt*4F=RuL0m{Z|n܏ؕѻ]l+ SuAX}ՙ7s yy&a]qbsky 8bCp;5uAYaOY&?^F4{T<0 *~$ Gx,>@n=+cйׄmj{|Cf8qxNbqPL]vF ;LC%OHhZ )B]/\izghrigФGY$ӈ:_|W̸>bgc|O:ߪEԒ 9zd\\뻌\ R ^|'jk軋9zH:Ғsf](maBm>͜F7q9mXqLZl},<=¸U'3nS{93Zò If}=utt=WtDqW꾞-tvh(?ww%Z\b}6/? 9gĕ00Kz@:efV>BO4I٣UfGy:a!B^2\[A/]qw"\#ݢL{+a68\`?e{@P[24Wۮ.%ߚU> %O)y.e$V;.ۆXHJo^%Z%;WN/HcqS4lT{ޟ\%i-9(s9 rtܿjqubtp 3S~EtNss;kcz ,+OZ?NN1|ruk=8n"Mv}Wݾbs/qf,T!́VGE0pY~7)끾by`~mk=4I1@ݟ6Ƨ WDNvbE,k/3sXqMU?j*-C B&$˫dKeøΎcCah}v]$7m-ϔDAw']>$ P6zL$ 6-C󎻫rC0`sDrtwF'pXT/4vbת{V&Ǐf.Y+jnKS'"^ezy' -0y)Xb\8Du{$6#bt;@2- &SBMaX%gߔ,%)-5Ku?y8XF{GR.w*x Ҫ 9wHN.xO O\aSLZ K^H5gFfOpC`1 ݔ7DP܍=W+g'\$#7\o:בIW+WQ\|7?Oh:u- EKdl6]Y ƖÃ0{t Y.cXI9uMm@}-?-+V^[]N2)s_9Ž)?qL];U8l-psBrc"YmmOr{ 7;CwLap'WG%O8¤`f -4ݞz2),A ,5RX-i)3f*eC;&@I(b[6 )]éV ګqxq` ˘c߾oľHW5WnG8ٝgWaHk~78}22$E~= W{^ܼʕ{SWk ]c6H$+ܒ6Ѫo/BNxCL5ʜߋm~@ fq,WC3*`_ټ~F~֗ɥawss8,]R 2zOp8NFn^͒ 6*sTL^}}ڮqQEA]0zcɠRT&omdކqoawX,=&>=wK=\ VcycK㺟ʱ ΕspRZ~L3Z R K:Wu?rً)ue3'[.Nӄ7ٲ:f ڰfq?䃲]؁ҧ"G.'UؚP=oa?%&Y+YPXS =h8g#vYB |ŭpz3Π#~4p3p =ФD7sY hk>ݭ./Cu֮oAÙG.Q#AQ0b5~r8BcHϿ"Ejrs tCI'ȓWsq\d$1UTHܥGItbE| d` gI!uCOaB, ʽkxZ_>1W{d'Yf-<=`I )LhaGfpCjL5MY)lzDN\in; yOO7REq~k.h+a9mQq W$q=oA'1Yҏ0a-h!-G̑9=n $;lyz/%lxx"H԰# vȿ݆oNcϲ`q\ i ^;EV~Yb5Y7{ "`$Of^txaQ惚u0iAj+NP~c?˥u]7,L>q߶'qzߏ]MAϬO!ೌ#fx䲫Bs={O~3"c@z)%~Ԣ#:xN^E.Z[ l+i<:[{ =*T;/+ tjˇ,a(v# SPYq-*BcS U:qC#o:{qNHyδxO] )<ɖ ?ǍIk蹔0!‡,]Pbn{6x~7`ٿ#85; @0OAȩb y \)N [0v$ Nt Wc{ J+?3+AT&(Z=$wFq$BaۯF^ aOy\24'ֹ2A}-oX w^ll|,0Z77CD꠹k 7|{\o-n9T=̝۾Xm\!IF^Uuxߊ"C QHѮoa`w˅e5`/ȍdD潿zq`9qdMfֽ݂ GJX+;_KӖωWA] w44Ιd>uZ3)?p[vR,|nl% MG8BȦ]Xhws;qpjڧ%?BBv2-EGjdg,-ݒ8=*]+e[~ٽ1ͧ[`v 5B{ k1xXҦ,ztOߩI,8yi@[ ^n׷Əw]¡eTqҼ;\%aĔN>L\1[;^L]`vhK_6T%=M8`0dCiyN g˹6]1`{_sfW!魫f .+9v͛z-ä6XP9Oc'֋aCNPutc/,k#Pk|ڞ\~lB]p^m to *r ~Uibċ28t~!'4z~M")UOoPVx_]Y5:k\KiA˱sQY yS+ 2jDP ]k1iC:u8'a$N?zfwcGUS&M|H3K_.m⚔L6UMUe4{ 8k%]ӒY!Ц0$5 3ðu0#J d/=5onɂ0h5=@ m.οocK}cy3\~{n/[mpۏJtϿ'\L4+5d+a$Oؒ Pβ^"tB)C*@KXΑ i tB>jpoPhM yxV/H;b 4yуsoa2@U_oP_P!xgYmvцD S?|0i)KjdIhu_[s \ID<t`TCCBEbA[ڸZpl>O{#.n\,4[_<.Xrʸu>~j1xõAS~Aw_ x*w>_ GC.0\Zzx,zz M{YU eY݉ [ 0%$KH_8/|[,T/q9O|[u޽/q~o: ~H}s&qW)>~[Hr.m;~v1~B@{ڱ>ebeq ,UN9Ŀ0kv܁@V8зc]ϛočɴ '9|hOJ۠j :/x&]xnΰ(gaLͿ MO?ys6X%o+f˦/&(L2yrUê!);[VR3U Nrb|/C =:p5v|AʏcC?Ld0kMnxn(meKWKML[L2FG8s XM5CD*AlӜ< S_G*Sg;퓩AіCn_<|Ng&(¶_:cBvtPQ ({.ɬ7Mke$4V{;  &01nty F; AIU0_hZ,nFzߦ NUTSϖOb; )RᢔؼoKv3ѳ9UXE''oYuX[W陥I<@l!AAuN`/ɖ 4'b5LQC"{u[gwzZ *orb~z |&R/͒^*'P݀n,oƪZ6Ua~,/tl$ȑ|$tS'UȲMLG,T lOW\ơ>nHC_HS~~ُㆯp"0L$*{d~kqޝP}xH,@d<.eմhK9gK[L Xz[҇dHcQa?_mVtH߭ qS{bG ˏqUjQa ߿߂&a-=tEmu{*FM)N]YVSM`K``~ ݧ &%P;ZSYWA:`[^3P#'ޠ`%|$ e\%ll!ႁ0vw {'qqdTFE)),>OzvN TMΔǢ[dgyi}0x R^e{.0N}Vܙu>A #rf0 @uivo> Ũiz"^{/dO$jӞ[{cno Dw't/Z mRğ3GR‘ ,hJx yVn< ׌8=d#27^);OYL1z#7;t=~ȟ"ǡ!}j)}rvXX݄ǔ GLW$ #_! o T/hiNZi>Տu҇e`A5,[Ǚo>SǧomqVgA]*h| 83llhڨ"!Lvr|Т['BN:>Aj   ~L/sCCC/p?iUNS S{tmjyGW?%#8&j;n7~bsq[Լ`n-gV]Jl2΅MI1ˡi$\: C!qQ?3=1˙.D++}`BHŶXr4qM|f RhuXqK)+%VvXՀ}aALUM/~xAD5^3k'S] Vx/)CjHrqVm~V? ;=)#+0HbO~; %m/`kz$@kxNZ5L66m[ s)0'\=|ϒG6uGtz۱n;nlVRyZ5yR <,4ʊA,'*=];!oKYX|t]D=r =K99JFwQ?9\^7ưG*#  cϽ0>\wIs/Y® 4XaviN 4?m ~Oj:}nhnV_8Ékٖ8w0eC2l e牖mQmNhk^j Uݰ~qdF[4`\? l6PթA̅l"_='by&?hEܤ·9J0g༯&6FwRy{qHHC,$d1!`QۣWoCnNU4+<\@fGon GrĬձMKVŌ4ro?6fRp@>J:4:XX!n:CDCB97x|$$=3RCk3X"5:=¯#i+ xgq\Gre\'#>ߧ92lG]D#j[m0)@e%NG+ E"? ;x`v ={$ CR(Xz5FUBtXI:lѤ-upFAUKo`m̥K| rW.]ToS񋃻61: %ŪFOBEvxHdFdu< a!չ.EH 3uto$ H\ĕpGj]m;+ ){׺.Ǘ ?w`A\w8QiUC gMI<^dMypz /zI&s(2'qs }t_yq~0:0mڿ N-}[4O  2p/hY ZùJfSYFs"} i p}[JXCO8 ٸj lVU{|a,DÝvE?Vosl͵׌|maj 7"H6tl )-%{' T'XL{][d0N{قLTH#Y-l)']= a!|KN&31߃oߟzea6/!AqФy宗(O}ڞ=Z'4{XQS< v큑!ay1Xz S OA&u0ff9mD!GZ0LWh5 }l_ξ )jO8eOOj '$}~\G ^cARc6;8H1@;;RwX7lS7,YyӪ8ل~2to!qz(mʟ*&Rg`{8#Z`˂~'Y&d.t_~U?Dj^5{5KʏHN a݁3O*cKRȐ 0gA{^0=G}+}MM`]k]n̫iRx#c>ࡉ}sMvX@%.eo%g Cüa0wD3ly~/%p2Tt¶7o^ɵuch%%vF<( TzTRom69LXqI{xr_ ȢPQ5|{yMVa+0 N;IM{ YrY=q,u:}GKzRQk`>4[u1gsqxjUWsj =}nWj%Of5$[9ſ6fqOa݆Mrq$]CB4V9?8oMǛH59d5]qDe:pwH }\Xz(^9ds$l/,~b/}J}7 *O!YHx>8'ʝ~a~H=jڣfH{X=gz7$da%XQcWk2TCG (:߁llZW>v:ɿn~wXOZ*QP 8PP9T(;*5N؅eŠ0N71 vwXA@kf%Tsvi\)t.+axT95{ׄZ}gfXKC Wݞ.R E_9p GGPRS"=oG,\`<0mzflR=[:)Lםq(D(Yܟy":,/o:͋@ 9]6447} r?C [6,˺ P}Bك>ҩ?EqF` *W ѥ%X+ܴl{k1ޜ>}獸6CtLFM~Aⴾ*/v'GwE՘K?t=w2:t-蟇[ NNdeb’q5f͢km8V~+^ ?Wjԟ0t]VlTbEmqFQ?cVuQg${Cp=N1ƑfY[KO {~ÿH|8]zY4I,FE{C|j ׂnya<{ i'fpR)f*:nc;|š+ A&Q#8kvZ=RzfUE} J>eӧ0@1}ЏW+qSPaBB 48c g]g/pTϔaM!mށ3SsܞPX|S6I>qqU)Sac/ 9az(,/kjI,OMK޺]a@`'拊^iվ Zq8|o@ i<8BKVp0R8V)aɯ`/gjlH}=ݞXm ܇atڗWvSM*`S[fr\4jq;N 牺a3kЪwP[8~o<0qDHsom< IȞh]kNjZmiQr*#]n+(`&Nn=?==*|FٳM%RGnHuuI2MWRIVd5j R8챭,YfMܥ S:&9iFefiת77LwbоnrGh&fI({JzI@߾z*G ߹%jrl73{nSpΙ.r<'E&Ji'}p&EuKr- ۿuhqh4$t8`Sߤ 7O&ٝMhHAݎc>]}')HjiPӷ'"`yI Y?)ov}ް˟"G:+9&f/XK`ц˜@ yXW"cǐ旸;Y q]8ԁk$av:rq9 Th;i{.nz^lσ}w$+od9:qBhbVǝ7b} aHm$oc +&{O~Ħw*x6׭0`Sa^$,Fl}f0vݣxf-MBn6r[6*+o.$@Ez֧]8sDVK >h{*NN J6.EH>f=7jf;W$/CIu%ЈmCK7qΔU}_l\Q·/=Ѩc\NւDňMOeʊF5CR72`fW-9z. ']jvMA{,:6͂щ<ǮAvE=:ﺯN7N#OW1ۉ%UԶd40jk.p@lf}):wFP0h_0 ǁ{D Neq{ k\M?.ش|ḁ%ba0Wh쾻l=Huq'`Fİv.?9z/q"-cl2 yjXVmZt|܍׼ԦpKl3{5_9WZLٵ1_cؐ&&'o&`%kUlbJ[DNJ9c耬'mn?փѶϗuN@<07Fejl5(h7qee\>p,sp^:O乃ꥉ Xd"ug^vDBV-h%&=j/#zR:2ׅkO$9LZ,] }ںyߕņ}O76k!2v0$+?5_Ģf`DHfA9%MouE~#|1ߠ9@x4 G]SYeu6?2 b/RkOaEDLV]=x2oW:V]Molȸ|c}RD(Üف+G\|c@i޹Pa{%( 'P4ˡZ]nI8tV^ߛ5 unv:+kdK{rtqs(X ThdKg~;ʰ௘v 9\ E !%lRS'_~ #H}p+'(p%DRlObKxos.mG; Ht"];r G~Q,HpO0V\X3 Ď6,8ndLi=U7HS8GCVq\.OWtt`8.2tZd0`LjIdjvgN],& #GXؼ+˻~5cut?/wyᒿ]&olbžʻ S .Hl1wG*kp[032z J5V^,[RHtl6Xwn憱 XaNb HNM Bp\KYX݅3]5` <@O"7F2Xx_xYvt|p8<3^[vڽ :Wݥn Rеkaz $+=r4tz~ǵ_TjS~8YE:}as%-"vjV^xj2q^AyC׺ -4OsV*YnsL*bj/%ܥ12-USݰ""N4o2tq8˳6d<~:6ʉ6(`j;;ldvs_.PLep\c]Æmm֭taoBw11aBK)i4ZSkBpQSoؼα w*y0) b%:`Dԡ }07y S,B.ftl>SWWЦDo18,G1ؽ~C]9c/,:'Kr"-n#\-\((oFGNL XsgR^#%d;v3.GhlId1*G+y-S,Ĺg|Mq2|y땻-pך(nU턩tr4_86Ш)177,ZK4 m;aF/ ="H*ifYϭئNn͹6ʋ i/-ٮ!CxraF@y?^ƹOM{`q1.h=4XܤoNiӿHa)aC'WyK׮_%+NNQˬtؑP{X2 | ˺30uMoS%βs7;`b||`fq8|&DObE9yaCH\TG ksKr7[^D?}YYk3*uρs[XF͡ũ ۿ;쉱+|k u@ Fw(d+h}4q|q<ξ<^9&X߰k~&rJ]Z #8O>`K ƑW:"zEhpH*@34GEG3W9Vb9wcEf`BB=4J`9yt<=U5ωWqu` u [؜=~ 7he܂cyh4"6lZjq8.z~*`*δh7ŋ٥V0W /lӻ{ BgOZ@IYl;_˼\Sp@iX׸t(3L FQ*| {q)M^Rsx௫l@8:vUhAZÏp F$ 3hTϜkTO۠QJEָ6ҍ{7ԄH~w8SJq0^oH2{o9qc GS)Nٔ]O7cw@ЙX/e[%Qq:~~Z)=Ѭ_;\_eqYEot *(iB[( kAc.Waťg茹(ZTI Rʜvo5I'}R-z?D aK5꾗oz_& f #-v-`G H ^UwQ)rtPYpRs4\"E Af=~#=6jPgmMXPєT!w3P*!jɆYۡ60D36Daij8h{QL mқ=9ΰnX$>ƻ&; %vlf>.$;ͪ47+8vmWELܙ^;M=\9_AY!~b+)G3Xp{8.8ƍ9hGYD?^ ʯY*n~c{^[toP7,k+C 67}4Tŋ]a}8YΙǸ@n =R\v8#M_r`?;oyjUThrLG3M {ƳHrU*Eɀ'=XKaSM2W>)s5G+ )^mm98, 37M;yxU^RKmsӑ̱c[ŵc`lf[^IW}V#b9!)8Cͳn?`@{sG.$]}&X)ik,=[;qB>_UA 7XbOm| J8w,{]x%XI6|+ڦ?5kYmf)'(B?.FW]?~ g~[~:dƴWpEUSwSPX,#} xe/}=,F/r-=ew܇:X<<,1d.l2R:ݓƚY[^^]5{hAhb9~[,/K,;&C [`:/6]w4aɁc퇶Yob e21G;CtaݯZ3q}O0&*lS¼ՙ%G5[COiow2V='t014%?zGx쇮ŋZ]DClztv{(f˼,f)|qQ8X\&/5DہX`ݰBGƶ8LawL8:P٩|(ZbвU;lqZ oRi$~+I~진3Gt1=Pm.$]:r QBd`"״:7 {.Ț?Wd;83]꬘K!bo|zy~;1&gf+NZG|⇵oax'P_f2BpG$2)X&MCaciXTf݉-Ǻ^Y0*->&jy,<%bbe#oir#3R?a'2yR4@+G"%^nw8m)"'x%_ԙZpcV܏C2Bayî:1Ʀ|Vac!Z\eS6NGzFl(98F99bt@CΞ:wp/G_ZdRyi cߢ鑏6p5C&鸞wjCOC^֬-Q_>F1ï1kN&P c2&u{aAȭm8du*y\x-inڎ=֐[J4 KX~)ˎZOtRz.^XWY1&%ő)tbX8سME{ä=gsWC/1sg~ tm&aAǓfW/HF})+s01"xBU8'()DNKxÍ-/P:çvQsR&JW߹E/ ؃]e\УYuLc[po h~+|;{s nk<|{V9FЩ_oԃ> !8ȿ -ԸB~Cj#šiSzm yߙ&x&:YVj_^-3 H*ѯᙄ;j6_)I+}&]3wol* EwC ~ͯ|W7m V\ͮ&k >`ln;vzE@笿zm\QUKe`ۀ~;KN3 WL67ofc3v SYUjj`_X'ԋyMkT#R}ap|| =Zn}ɞ-ٿU;`@b=c M"i f\̘8k;4ޔ`#[Lt[r:myJ+t|yzI)H}w^==m=gf]t=kr,kNKra;A8Q:2Z po-kg07-YfG~5·9b}7:& o]ZtBK0~J 63Mӌb_ԤZ4#q}~g!9ז~F7C]lvS48{l"iZfM0muӍ@$\SOjCuᇐ|:M9݂\,0im}Xb,[qoy{ݿ;tkU{S͎JvOJ`OWaRXj:m+c`HҸ+D&FyzԪwni' 4+Lzo^ eo$(p| l8#]oqiMXZan.w]ovvI'^{x`[[䎗sxf!}1_bvMY ܩ:|X&{h3C>4"'q<~ ;L^"GADkL/z}5 ;>**sH#ؖYB1,}A {粜/5yJ?ܐ٧ytX.{c 1\U%0[OSi3ݲlq[0^|o(喬 v'\QVNI9ڬ挮C0*FT8ͻh`kr8mue6¯mFdz=̏o4s!&We ozժ۸053"FŞ,S6S ?;N8i~m:üa[lPsoǾ v+nϵqnx.\g>Џ3Ld1*:]SZ2A"M)nV8>IM1mi_ CCk 8UO%Hr<ٯZ6F`r! 4N)z\/! "⫱)=mXA [?NS778>~VVx.#*X9 #tFG)v5zCy'z`'m(_#Wq3TX`F' Ϝ\5~1/P#{ gk,`/AڍeBs@v:1ޙ%yC! K/tqd`ɠQ1ֻ/+Jyༀy5l# +~NE:Q } ع+9FY`^nԕ kJj?8tf˔#fѧ׹aQzC4't>"oemCC8U3* 'zwbՃeGOaTwZؑ;1n=:{9ZVu۝-H%͉[8v R\:q>Z~vM{ZU&^j}C{ׂlt/K~D;4A4xteb8pk]< t> -9C{|LLw(LM9)19o1r> c pWsL0_kЀNr؛ĕG:-,8]^5xޔʽǏ5[د0Ԋۆr P(ʸ ( |BV уyɼ&W#O:a mO]x$| =6kzlx.vVZ0w݁:>G}~t5莙z꿢SzWpd3B'`$] -4 qͽlBRh:3/ ăS&|{ >đ-͹C_p&1%6 (?|$MyXyMc`x$";9+1:bwWB{QP9L3ޙ/-0Moz}+a7xk!.f>pH;{-Wl݄U3me|MQ-bٽy \h_w{ab˶`]Gx~~7J"p\4x榰;]|ojl3}wC-{@NwG%!x< U#8ݥ Jأ*} FXZ 7dkz;;lqzKqd]{9Fs/q.35o۵B2u(EE0t-٣,($NYKR:_@%7ẕo(;9k?HnP*K;e=J[b B#5'"2 q${"qipXgޯ6]Յe,0V#YuXOlfǪf>?ɄpIX{nu&kg7O4YG)QKZvHx%D2 /-<:`zO©E둸xnZ'f󸻨B;+,Z "0|Kn_e!LL+)8g.\yNRqBgIaz(G CQ"# ovZ8SiNY,CRmfs6ohhƄd;L~noH?O  -JF(L#?NIB DXgO#Pci2Mgj:1v&Y]bx'_d=f<`dQVm }y;ιuV :Lwl]Go0y!59,*xxYv;)K^_~MG-y) :,ǁwL҅Zn7!<"5F>&:Btpp,KHxt`J5}b̲ƾ(XC-yd'Հ&0.F~˻vnLN=s7"ݛBkr6 ּ8ݝPl( Z釠I[XM'M> Bdz&PWw3L1[vk#vWFwo]S8}ÑKH_k8"Ϛ"FȻ/tg*|+z:1 Xw¢/%Դq=}Gӽʹ3-J%7v貜֌GhS(vAV'a' ٷ9VVHbϿ#_h`a HkD{0SE/%=U6^|Կ$GCl,Fe >Y(AH*R,< Ҡ|%X(V ЭSpcz2ahp uN|yb3\}Ԧ"CH|œҧs}O v~=d^ݍ+\^)=ŗ^sF1`? NV;M}c!+p5!EpeJӥ0DS:RTY>R9mO6/UnCO`͙ oϰ:S:g~6gu<x5+nf,F~7[V_4^ܹ{3@NSV\(xO(?rL"<9ur7CaP3,Pfx- Ĺށf\5;?/JZp9nphj6!mjh324z-b͐(g }eY"<2RGeǝYMmlLW)G#b/BjB`l]l2L Ip64&=wN@JKH(hqߏ*u8*].aq¼.2,s즅{9ϗay-WhB4 ysa7_͋|m?6a:owhׇ@fRasv]Ɗ/>8H@GY̺0\MUIĈCNمP!xhC@2L?׮&#ca0\#??jlDf0sЃl+hz= ,t'V>zU\Urj. 힑 9w&@ї?^`oMRK:(Vؐj_mX4ð*_M Wc5Đ`/ԙfGwM1"P#2}0XatUe0DMjP ṛ^ZȶcXbx]xų48׳n߱ڎB+ŎRuTb?!~ *5*/gOMtOJY8_jLF-_[pDHz?xv8(G\ʼnw"y4x}>TCi뾕sUҼZG Pk(;27q0: ZfyȃGnOpZτBA50]|~H;sc2pvfq)` ,RVv |aqx֣8U#UEsɍP6'À߄"њt9x)(Tl n&,pR]d$pԳ)Wyzq_땿'+Xǭ; ),X#x T8P@WҳP$-b&RrjZAG6Rm2ͧ n.6+^j sgFI0V_$#1<ܠH,zpyzL&ސiJ*1>1sۚ3׳bo܍czXoq3{T 2&݊He/.9rAc{[frN*ш#%_q4~0N<͋HސDs'&}'8O9ڵG `>U㙓N0%' 'qR^S?5l[Ψ܇O{-a8qnV3{,΋ͧ%vؖ4z~&{} RNn;˄ mqlS=$u{='X>+E+i簯v%%p"|U9F[fn~oSq98o)toXx\c[3tNswQ:L)X=0V5e`|_D9Y;Ye. ;WB/@>PS|ʸScw(knV*>hVxpD(V6}ˉ3`@ P5A65kЩWĝa#m8{AS<Dzߧp`@?eoE+ek0ְßrE:ۿ@zug>$NvU bG-X+SvsO"[BCZurkyErCCw[h9ƨ?[qAcgVYwq/ ^&`Й=$/^X"<-ݶPli-p؁xx g}&z0*l od^Ou/h W\c(e_/ЎcZLɟe13}KwaN }a1ƛ]Mx U4bawaAj Rx44Zp# ?0&<)( 7J]55)"H8qX6dVCǚ;>7V4t&߳šλ0G/4lrqBߊG_,xG?2y #><:]yΐyh=ҧ=!}Ϋu-S87a1^\X+ sя0Bv\A~dM] U6)-+2`虉`X\?s9;m1rY| >_'G=TL>0t )S=XV$;/@k ;'qzψW%ί;igڊa;*Zkv>g!QoCJJ v+ec#dtSXņ71;.ÐE,>{c~:جk;M'-J _靂XtdI@iI6AZ:fB]%~ySmImO0XO(qz}t-/EEʁX3.| oַEAwK5͙ 0To)\2^%fS{p8Ye.mf:9_秶HA#c$bHc"1hC7(zdGBtt*?pii~n +pQBf]jul$`Aq¿M Y8]Xh JJ$.=rI\z;۰)40lߞrpr^#B"5zMT Z(;:ƅ snVXs{ \A" ߏH 5u2M}t퇀h-fq)oaTS멇8[x8n,^z %2OC^B#ߴa:ʧc!H JI<'{'\5kGr@ǵ/߱]g?}TY8(oc nmw=އrz>"Xy{o) Y X%"Gӹw=orQ  PCJˍKݖ&_`w0CԏECQTLg{=߁*͑zE. <#LҐp%?]fn"&밣ϳ`5{\tm®%Ql0}rgպ-B6fG+=x̿h f]-P 0,qaؿivm¶oR1')s:h>\xZ3gEpQ" ZD 2V~Xz;c]0լ1Fp{1 :7_*]HjM lfML*>&S C=aX_ײ2dSΡPp*j ,Jyf~lvαpF ϳi=w {Åb{7Vt1'/[#cިYI^ tH,fԆǟBGdڥ lc҄r` ݊wQ&>5քd82X{$e=v3X2%Rjͬ\yI#ni@@ȧ Z]:ڿ7a6_MN<qrJq|\]|k4>'بӜ"<'h:&k_pPJf)_Z3ŀ9Ln|d23wJy+{ףXlv\AXNQ=:k%LwRBC9F$%j sd7$ILl/=2pȱ^ak`V(kn}k'޶3)H'2 >]O?΃iiԏ ߜ8OVX]ɋT1|5Nj~~]E70yҼwXR 2[ KN ɩ R Mǐ*ՏzKW}Y|P y zwuVQ% 5[yu~q|O 2wO#8Ql52bމ} :␤$χTSl XKK#Nhg2g5a n׌˿hq9$R7.y6^!wYTσ !M^K6F(W'tTӟ.A Fu9%=< s U~TU0 &p!2bGue"݌K8uG%=u[RvmYG=qk{j?|ƫ gajBd 6Od{5+ 5f ?fڢ|ظ@}2,wZrwC;/ K7TT>wAW6Uh|_uܻ1سcޫ&>E|, o?I%]wOZٳ|Xo5`心W=9xwE\|@)<y,ΜOZRũ&RR'`C=%V,C`|\4esl)e66 RbBOC64&R8-h-6, ZO=GQB^ *&rg C.9e6];ڨiphsZVyh˿Ъ@Jtƞmn 0iW=>s?.m$?4Qeޏ;5%#%a?w/wNg>'3>Ʌ)K8sKޟɍ{ae7w T!uoS&P~BuͮWI89﷏o}$M%nHzIJ7Qd`mH8ASY\3ݣgκ[yO;MTvL7d}gvr{ar9m;ݲXr l`6Qz{ő'jDs7ª.m\4j9 71D'8D5qXI6b9Ng?ň㺺!=68 ޖ-{42h߸YOgGh/U9aJ_!uOd>E0s8Ƽcb?9'2G4l)Xy ;^v_">tA+@,8~9R ,x҉w60E~svyWH\!{dhpOYNHlǮ߳j1nqyOmFiJѾ0 W;dKt0:Ef#{ᗥ00,%v~caR1LPz cJZ4^cCސR $}  fFR`zS:dJ>́(?W~c_Q\pw#r4bo)s€{(@4}M˅ {H"ӞrX$,VĊֿ䶋ӹWgpyƅ^CwXF=F6蟆(tw!>=qv#:,#f!+^{,@~+ccY0'S=֨_ͣB%onq8QX=܊}%ʨ7I1D2㟞%s;@׾OWqʓl+iH # fgCz[4d께`嚵=V$H&à->f./ >9ύ[ eޮCȥ/C3grtfJacЪ_j?`hݸp-ㆍ4G5Fy;`򩅋0wq4/gfkt|lin'3~\i;y!CldW7xt ? 5m F"LdN|m 'EEp ϟU1k;]uXa}1q2 l T_akr/L-GnUO[%ez'v4`t?nP95sTih4QYuql7N('^Vx%% 鳑Ă[8T2R8wdZ]\9n@A<j| DD~}W<Z.'_";x BMe}-t&pb&l ㆞Kð$蹕ݗj&w]贇դ te\ |hgkOe%LWąXgK!Fit'bw^'ln!XqrbG Uک8*22ab5B/q&Zeذ_dl-Z<4! Ug%=q( +%G=ko~o>L`I=ڨu kp| {??9/N^oE4ppg˱  >=-Gǡr* wm4^uly|d ϶wsH'ps%:68 8;l-~i]Igk#n\V'ta3u6O/ZF:wN#~S4?߲";Ǡ990H~OC. =v>cؐ돊6a;e ʯ0E4x(jt7CЉmN=F %'sћz֊S:6Rp䟼YeLp.UAv?mA}`~Pn_@ r?KQ=_N( +qw}9 J%OkH _}L8I'_ z`Mã]ku˴HPm᚜$7#^xi&D+9${:Ur.=8d-sy ^~p7LwIrXےlfI6_ @zԡOB'kq돓D%exa}Fok]GD){M3b7L9&ui3Q8,RtO9PxKPc+#Biءl3W"Bb"baOxY?AL23{!&1L9hx3L&c#{_gex\k&nПea] ~!{>=m(áv8orMjƶ]_1G=s\4 5\Ж=`\7{}"Yx;JrPϛ0YB=7ȏya 5 ~\sDBӦ(`<ֿo?IANer4`,ArkUdKvOBC8$:ע0rATrxQo*cA{>nQ.8=" dq_;;R8b8I">#[}x N)֛>(Pv44f7<%|q0Mؕ$zep꾛kyO`&[zj ,f]xt-;^! Yс/>"AhD=T\5 :'L ѰYIV: pCmluY VLjK!jOrPO&ΦIxLypT' U=sq櫬Ph˸@ch`׻lP\Z}.7#?Zr`E0rċc  v=YK;Z:pnɸu,OڵDž-rN= @~T(E˞:oTV\]8i-#G`zzK`b ="*$]/xa+ONƆ0K,yG *[{1ڣ13;xN/~`aPd彁7ч$|.SgM.G,BSߏ#޼lo }ob/ Jc>'!-C,Z6>}fm4)Bk1NOg%\W?Fi2 7aOG3Z~UɹC!ݠweo%.]gNS >= n=a5fϏw`QZ/ Gm8 }9cEƮ^0ex6a3hK=ᩍ}Zav-IӛkqY/z0)cЯT޿N?%:O۶||^yY~9^q~,D8y.:V,`1;1Ύ)Zr-r,-sq6N[Y+ۏ@}p t^{}zEJXNhorvh -NrBz i]}uP# kV@[';;aw֌M[yfz7j6gxhjKN q/d$n+)`OzprDvњMf +kqɌ*3BpȬ<'g3ຬY9YK(Dv8K$<~n󧓱>+H!=C,FrYv]^c9vBwʞr^@R5_g}M̏v^cٲVG}hú3Z+OeKh\n(+O WfC4{7nii0"|"H}}ޙ> `W$yX{F4yтDC^MX0( roMז 8TE{rTヺ ͜PB@ɱX'.Q:5@ۮerzo?lLQtopɧ(RQ[DyOOaCPݰZzaP/LLc= _ ly뺖.Uq69ۏ8j(ܘ*D~k!0@ҏB2InXF6]{w>+>߮ׄ"p'SkG.\,kEtQl{tr:mڻkIC]8sn^)ҋמB2l#6qZpg.r4HQږvm˹X*ڮ 36H4IM&]1#0Y=oe5,i 0t)Wsg0] c̼hGA~}_ClV̋7b#֚#"heP= э˗㺥y@ V& e;Nb?c=g!OS|_[|\K' Gk/_d/<{Wa-nU:΋P)?2XzEqx4wK EY^QCR&Frt)/+!Et?Gqhx6VSM=WGf}PSdsB)i]8 aTf3+vcb鬢sn/~8ls_,X@;}hgDŨ@EtGتCErj6)\iGrX-F )DJ骻 x^>v" ؛#;r$-wX+6ysd}b/HO;T*(ڵ!?Zr`(U> @Q\4]>rW1$b7-zqY̸©ʠ|xkNl;>#s#Haݾjcޙ324!<*Lk E<~C8VvL'O;>}-G#ןlJu#L8;ކWO:RBԷ!@G ߳c]նCs&,K-A$}ɛ 0'S* bktwKN_s@`UۂtBL8%q@z|o8o+ YQDq#$/JRx5XtgLu^TXJ qkTŞ}SQS.ÿ5C@71 Qk%q8{^b Wg1J:) ۂb=~Z$z چ<gt/'^rM^0Kf]B5}Bnqs9@Lf7aG>"Ia6腳: i2E=еz) ļ fdՉ}Ǖdhe?/rQLg{_[M2譢rPqE0r5(4Ac ^s {Ҋ a?Dž|9Ŝ(}wD׌ !806`(tƇDJҾK뢛@# %0$& Lֱ}__|q f fBL#'ErEC}ϰ8Hr|Z; fnp_71d; Kе8S=ӬĦK5]wn$e9rL..䗫\*ۨ0aYso_xso.)O &K59eaW`ݺϖ;M\/z,$Ou\{jucNazH1԰)R@ꟗ`MN;qA!cĴ@8~oo1áPG27q]At-ovZT4;-fhW G$liI2pdANHLP̀#v)H- a )K;tMv<߄7@:>BWdl|x5LXh= \ktEl9/ax˳gAmb 8rWKD-3 _TG9y4U.UlwƱW S|_0mf0이[frCfN7C}@?]m v}hÕbwe`[N fAʃS 8U _sPsGW_Z8wz!% :BRX~ꐤPoZh, t`È> ^Ixâ$gH:αv&8Qfy ɹgpSs * q9v_zX.NN߁M~~ ǍG瀬A/߳~d6+jO@4L\W:! zA&~cXJewaBze~tQVǬ?I\@V X~]|+x~bk3|Z Y08 rԷ?%I!Au>xƏ+%؟0QG?֩Wa𭘩d^9csf y)ϋɪaNчu/qtK/I bWӻ`@5W_MhՖ;I}\_Gд->%k6mmsLQG 6qw|*0Sy#q<j@3 -ʹĮ7 @+D#m1O<'d)c#jduzYhjf0+`=+L^8xGT1VH.[&5=~.:4GBTܸgzIjXh ^6 %Q}R6=w=7+ӻCvA]|\i-Otq1Ap*xw_>ox9@/"-r۸M?Zյ#5㎮ 8 /Y}[[VvqzF"'SFcB%Gk}_mb FlN5ן|B5bɐsMl*W@t",%1'0xIpj;)E+]t_rS4K&{r)Xܣc ^ܡځC!w8nsAvO_cOt Y} 6ٺ;u0[r7%.N9cSluh-:?yal+{IE9쏭L v!Ŋ4@U kvϻ'b9!-IV}+T(q]yM_ /Z$.a$XbхŐawS.ۅsHd#s.Dl}â> a뉙#|K+r@c!Re 0]C?Ai׬8粕L$_4\g;^5j;0~v`T\Qloa.;>.VxsSopΏDŽqcԋE{Zr_|gU_pˊg|"i*q~m[\F(%.T{gMC- eY_a4~q!<)L헦=΍C1m] 8 Yl]q妮lQ3ͅIJ g-W`ಡ.ԈWȳ{_M1A;3,fԝaC |({K:s彨[$ 'Q]vt ol+T(=<蓕pXaBT Laty2d,MJKO;,U"!4$eamj&|۽~W{ʏ۷ 1hz ,511 7I0Ð1N d=L%2BiFs<_jC 8,8b$ ʑ⏠5q;jنC6߯66A?~8=ژɗs6GoٺT$z9"F |Gߧb8&H_8 ڛ@+C5\%qɷOj̃~,-%0"6Z܄n3usza=7')1O Ǖ7L͐rW1ĝ9n-4\0#]&VFR&*;x|}*\"\2'\.clנiMY xo,P#(Əa ? t}[J7IvvKOQiɜ8_דS =)x?@nogwz 硪;I\|nqlQ/liĥ թz@ο%Rτ=Vŭ8!al0JdjGEB50,k2VH1Wp<4q&dLN;yjG:SC҂Qh>ŢC -f Lډ1 z{ykf,qы\µw s=0P+Tʰ#WE>7>  JËM97K8|虪{q1C J>^~HՅܔ%aT*VW/G"{a!.աvcLB+lI{z%DgcSM+z BڦG48Ěξ[t.ܮX>%YJ&{pQu=P"t{G]Ѝ7,N',|I` `;`䶟GؐfbM >gÑܑ-R7b+ΟcrҮW-C:}|6wi)}ųg#>b$[қ -9PVkɷTl0j͏(R_y7X5d#B[V`Bͮ巻ütO;W^jL By;O(OUJ{RFO;Nv;?R~ 0o9;ұK@΍Y$O%&DXAU]OG6L$hcq᠃Xd R*qMKئꠔ%BN[ G׵'ٞK?GJ=kHtwep#-蔟ڟ\0,<-Nx#bُ͔|ap`26;PGWZD~Ɓ0U?mlU-IYjm_L `rҪ^tpfLnDz8txߛOp[kH{/E8A$Gfr#ͬKg7nŐ=>N7iwyøJux/T`m>};Fqml&˵`a xg$(v~;Pݯśo>wT htڕ6m4_ztMknAHu\Rurr:ĿxOM8ePNG> IWE!hz|%{ޖk5ǥ]P9snv7;U"j`>Ӛ^. ~ cV9'a3#IL8;=8'~PKΔyv]tNևS w b5y X3ׁ+7ޜ,Lepc..rP Tǃs>FrUP؝&Z{G^_Qy WicwlPJ"7N&Cqv qé0w]"m8kn.]$]r^oR栝e/iW{ K_w]뙃}`IcJ ,v.|Y7 '$S%0@>Ds\֎"7pl8 L숊S |wJ7%Cw5zHl\#؍E߃պlMrձH" 72^DË^/p]nv"t1bf^uq ), ^\-25[sҡ;8i&MB>bǜ7 ?W'ߑ,՟~Hw_֖AͿIzTAjp9R !`$)L9].> D=43ځ}Zy:pjy,vGE`_- ͉YAͱ^FVP̚{\2jc₇fSW.JpuæsO՘B$-J]z4 MoÀ[}0傉=+Sй)љ <Q8U"2 3~a29(j!3*y+ay먮_iQD$UT@)TAJ$A@RP:Ewwwn9;33]c|{Yk9皟?xM6dqpÈV[J\JQ(x"'d4vkWq (e= &.ڑXH( 8̓$`i[(tzuԧa ,T`A.N&?G]5cdhE}BZHWQ' a+`}8,Dž UE '+e|2\0Tvb.3|/C2˱-hLBc F'FᗘiXv9M|Dn kCDC})-hH\;,>!YQX'hBj }4@|A4cLE(*RC ZO^!%3 h"^"zY[rEYw9O.E!S~<.N'@)cʍw7al^#D@.t%3~C+:C0pSpWx1>0N.*Agk.aݱ0 p@Fv۷ S5V=B԰Ԡ!OQ2('͓a1qXa }?VƯ_jsGF;=O` o( EC=$Qm+",4 ЗBgfmupTR 94pIkwz\6Qom}xτ(BN;Z4xua{?9A8w,WUs[N;`a&N"&"Ą[~a8돁hPiP5^.h09w#}c~I_BvN&pfU;|eFs\?&ZZrz p,ZAӗ*oAOd04Y2mp x:I~Rn KvѧM;:={͗<ݥ+hڹf&-zʰ7 kA\k)u }oFkBQդppH:sZYUT&'^͎tҟ̅5N}:]qxJ/ѹ[kMji{5_L_s~+FJzCʨ+:t a"QxAՊw]$Cf"w ![7 xo߫ yc@_nQjFx)aɟ3E5Qװ`0us>[L?H8;a))͹h>_We9YUЀ4 ߣwUr(͞'r'> t; MT,E E :&|O椠މjy 먹̢˝*myzk@3~-ؗM/ k{-\JP;b~Y4`S Pׁ-n,J6|g&W񫪫'YY/8]uZGbſ7cQAE3H}Aݷ ӉCsQ1|?.;%?kmv\QfZy+sщpo9 <-т[i`'f9l:>>|wF? |uȉv={HgMXyCXjlĞi!ӇߢY {h|#P˟fSJB%NM#Z 64Ta)6Oa7g!Z}l%f=ra+5|VM.99R4Qeox}㧄Ek0\Kt!+ mn56Ad(4z,Q+2/9 uq֟JEY(.Π\ìtaḪ0,H]xO#b.VVnCx+&bVZ̭']p79cx =}m( =FPcb"*g`SYED~D$T\`*г;!1#TK=s1,\ϕ @K R,hsX/s05ލ\;Ofڣx>+09'CQAx34QOGCм Kj&ZC3GdG\2v M8:'¦ApxTrz2#k܉=\4E! $ 0DU(-?&MA?Qq.AZufF΢]Y1V'hڽ{K \(䵪) g^0{b ]⤆ՋgBфsta]b:VwaW+gw 'c* 5|]1%W ^BE?/_h_ӣt|whUӕ\+ -ԫDOe/܁W=sC`,Wdp=miFkqS*HE2cGj -HEL峠-4@)Wz;+'6x)q>h p\nF}>W(QQD]GdQ\kD`Q!|l{f✮w0T{N+ڈv*_@]hPf?01 Zd?t'f*2<MQXg#jxn4v_^ PD=\\uپWVq6'`5Er] GB$"ك\g$ < WaD5AʍJ <$,Lio׬e%h>0Q7xx÷eTrB TshjhDu*j:uhH{Wմ6pޡlC}eRE̘` 2 ^7Z7cp`eAkoWPk7fܠVVBw|n1r 'ڦ_3ðX܇Aq=Tyk96ZT:s xݏr aB>QV̲a,h$c`I,@ v^ؐx#6ExO|֪iE! >P:7:BN+G}rǞeolL0+پbda&*U>4r%[o._\8@6 3B #/eaű`O>V>}h^赆L}u4~iV!PG1Z4pv?؄MsLo&#J %N2=vR ѭ*^9P+}te pby犂Oگ:t+,IHo#*˜Ñ EzBYO5,|6qAK>@=Z(4ięV țJ[gahlY>>,+NA8,`]Ur5iWgEdSWA oM`8Xq\A5JWH]ǵALl=҆b ՛ȟ@2Kk1&m\4VdLˍ>1}CNv7!-o&޿seL稄6*.E[ɏV_0?xU@ИH&_a\ؼ"3KP oSjT(;(ʍn[) EBIx` ,2^#G)/lGu /3N34Bc͝1Ј "f \ ӬuףYBFBu^дߛ0N?UDMfWѢt}p0r l`eV?43G/s~\wbLp*;d X bVhư-<߱ {"B0*#tNHg>r4R3iE&R4lhYV3ʲF;znFGQIǣ qcVh ˗/YE^36xFXoFQ@Im0f9ބ&C]OUrmat)*n}k$ѺB e9!GU3m>=0V_^v$sVbl|KWo%C9U@v64 fX0ڒW6ghAF;XL艨g"¶4vE+hz|YZ)5]GkwUO!|X9s!trMa||؈o(p*TQhvUu7jbE8s8eVTibg'$l tqw|Dh{+?tzחZX;yXY.˻C0ȓ_COhNcV_RSYa%;W]~:I}~t%G ~½oxWBp}nԚS#?$98h6fTFÖ;wQ#z;A(a_fe<#3TeUF^)1`QOn k+9OF}Ѱq!/Ep` {u!چZo e0$+ yoe5MBvihvNM$*S57Mנ|ASX<M0 -(_O txGu@5Ekɬ\E:}hӁ4 /4U\?Q:H>[ʬ3KնSVF 6D˞q0|>?Oj>(NCF9V06gڹ]p۷a"|_&:E;Fx_͛_{dКCXFYaF^P[6*Wa GUaxG*Vڴd+'z157Zh?ݐ"yztkaQO70P \?r"cFhM!e j4\ ".bMduw5+\mv.Ш"rRy &knfӔ=~f'c "ʁ? )(a.O maWC8C@[ ~!GtLe1@{e@'d$͝ND3/Bl`خa~O+:3܇zB$ PhIC /v`TOeZ6I"c[V'n['E٩3 Ktw`AHjj)9ɥh40NukxFƾ6 B{lԶ[l V8TUW`̉0  伋p.ڧϠqϩ/w+SJ@MScpۇy[ :?:c\V>oъpώ^){!FMɧ 5Y/' Xh:Bʞ0%^04lαM+g]@tϭW}uc@>^h*ECzTKöuX*dl, 5$hL6E8&.ӛP$n4VaҞ澳3^@uYMƕx"sT"e +?auK-*jGc7F[%jد:5Ƙ(KŢc+X3 1FCQcإ*%{<\lE`b#gī.+ 2}zf"5MLЪ7eղ盅Z9n8CU5DčFEmj~o WpytW-+Veg62lBȖ`ؖQuIf3#)xf@>aW|hJ9?dԯ+ˣyhCG0p" ෻5v]3@ 4;ᵜ{ᚻ͡#u^ZjsxDPGd3ގh7cZr}.ՄwyJ1t焱̪ I,c9rޮ ?S@+GT|`38|X{Ndo`^RfUn}z, ZrsZ5'I PaE>ESֻXѠu"shW{] ܥGnw24eW+)c(|dv'¢m%su!NAvb^41SaNr P`;pbĈۚ:}aㇽBxȉVPxq~n4C>Uֽk`2j9'~Jl6ȢT'Ds@MS2pjYh$ 4 |G$yTs=􅨈 &o|[#BCyA,_L~Ixhaw-Ѽ}?-X.w[39[c ie`mdH7]ۢGӇ*뎫݇KЧ?_FnfD UċaCYhiV+u#%o֢&::ZzpvsNWP7qKR$k7bߗJnx-)rA{sl}`0vz- J A{[u%]|E[{P<Q5?AWgva&:ozz\o}|]*ғA'cTb,Z߅45Rn6w[PT6<!ۇ tcKJOrd}2&`=0e &Ӌ.=tz )$Aꆄ,:20–\:j Ɣ:7G"?N?dq?uMf_UqX`&K*$(~,dgެ,~{K`(A;DPۓn jA ?Z:~< v.zwJAKbhN)\@ɉWQӓyTD}-y:.{  )#&nsUX h Ԅ@4#-|Ի 3 -t:~ur F訛fWQ#zsU<ե&Raj͸Sp1ڥw0x>4-|CժC_;o=FLhZ:s.̏L_H|: qA.kh~X$8VOtԗ[XiwFzgkw=14j\J&sC]Y0L@,̷?>BBT-UQGZT^@>}eyh,GqZ剬Ъs:|;-"8q~0[tAonB2 +`zS Z2yǗ !#g="9)#!ZjzJJmXmDd2bʃjkc@3֯WU@cNA -l{|e@ -D܎D?{Qk 7яF͒ pJ Mjq=3*R4h2|5!e7_ӄWomשH`[i2r4 >[su赊K`Z 'Nd/ڠ;[ ֵqjuWg`䗗( OWs:WaʬdyH{AtmnVWҐݯ_qq3_ȁdr2lP~ռ̑SRjsHznxp9ŧd9w;{Z>9A4[Dk΂~F\}D_:l>f-bgt*"(^3a>e5huؖxrctgv ^4'W ?js,q4;G/W@^ek , },5bE#XA! cI0w$lcVY 9Zb|~s91q8lfرGKCS~XHiX\M[ H,WJc)OO\rgwl90kCۏ,8#Xe/| "%612"(g{vq пm#]%d]D &sX50F誃hT/n, ۋq@uE^!>CܣL7A.><K&bC5B6Ĩv%<^w**1Ij{Baڏ`G,%.dBtB/*E6I2}~ Z-Y/yqb(lSgؑ'ύ)aXy Rjs^}m [xuO+ᔇ\PIHykM=ThvcYk0gȓI &[Xː)zR"BL-O߄>N1:iPK| f ׻%=<+F/L 56aL:G̡KFq;g!ի슆WqǤX hŸB6Yf6L$?=C'|mLd L7A/"D0gz`4c>4Cg4=_.5tD7Uɻ/xdCgC#+:P[f:vZL0,/dG/ay!V :I|}Ej[a6:+F{)momWOhv&ck ``H~Azy Q¬cY7Ҳ¨f#>@H[0|1?ϗ7k~a߻Q&w1"NFawe&(R;@a -컡і#lOWrs&IKa8 h4wtOxjr0{œȳDoB/h. ~Na¡pX\0`F^II;ÛPMB pAfǮ1 DTퟋ'L7+B ͒D$Y>']n}ߊ:Xh t5Mp o+Q1fqNCtﱺ O+:E!Ć&'_pr(O#$ G:`uBn0+ i.Xa,Flٜ:NS$[m ;T7a> e'(=b8bgݔsvfi,]8,r'r^E bjho%ϗBH3%S(,Z;NqZ^3MAEY x^A{l,}@FTЛ<٥Pg@C"/gpm f?"1i%euYXcHl iKݬР{Ksƾnz$Bऑ+^_ 3IyzV0cPJ݋(2~6vȕ|aT8t;mdcSҙ{yg4P=)f`y0J5w| 6n c7%'5<#t#5ᇁEАw2,)sO7Fh|Ȫfk$־K3jAȞi~)së)+糒Z8W(>)LKpCw/o} ]bNCTRp+2E:^o5 gF| 'H9CR_b.ĂB,a.}< IVϦާ6t>zK}כF"…PF.hQLSA:R0f-^&z  u>vz^.MIgTXoo)IrJZ;&]0bhO5qӿ&mWAqḩÚI# PLJ:=gVĎNHz, q!Ed<("XهqlG2+[|Ymy^92^Nѡ/W\0Dci ,Е?lGYcZaVqP| ;(^ #d܎P2F/./FznrC'v@cMnn4쎞b=k+?,@-͚,; i^0 M)]543ζey>Ժ~A#NӹykEd';qI NDG+T6{Q6*_I_RKl32oa!AcBu&vؔzd&BcD+S;i KRz9@^!4P3|Y1֫#p~T&4\lYi揀Mf吰Phpwb Қކg:, w\O8$|jN)g t_zҦUMqS~Xt$\># lC ĿrPɗxJ/{{Rɘ<(7r v~0#l#۳iW4gcX2t*H4jk>(# [~j*sAzh張CFSf2Tk_#4<\&+5 g}Fݵ9؊ ա1G~G ;SG;ƮX&<͂f%?`\]]o^}q!l[ _02gCY'4>I h{nb)*R3lw}*~;+Dl>^PH4%&9l 0wd}hk /͇Zϡ<0 o3öӏtq/$43IOn 4Pz aK-"1gCjaI,9^C0gy@F)20zX޴i_wG>]NC!yf6 GKKԐUDz~Λj}hw O3=(R80ˏ0 =7A ٧iZhbJS6ɣ}RPCə]3uT4r`$Eŋ/axfy4vvuRPQ_Ջ0@OCSw FV) Nc(} #<!V=L4vE`ctY]c:M{fvO3tģi3: Zٚj~jK%&lu5;La@dLTZ9 ]"PǝmMM#n5"Frr뵏FhRjXLۤo_ -g>VK c̙5%l /z*D/aD3Y,f#ءds\ )&Uee{ y|4ÎuXc10t;{u_r0rcdם]{tahΩ66Jʧ/SaaXΠFZ~T~E150fG9*Y|!D* tiΌPNI]J+6زɞ쇖5"P;躧3ۧQqCg}:S9H=Je#w`*,*FUi BbTa}т>Tm-BV&7)J/{_F?l0Q.Bw1a'0w?q|EFF ߨ|^u̮2Ga8uRPnuBQhLK^Ihj h.~SeԄ¡rn(3]M$eN}w7<+< %h a%1g`,YL^JO';)L9@Ҡ ?=ISi҃:dBiAhhy\]xbxlˊRO;/zZȞ?kߟ_㏮U_/?hYm|g~ow_'Kt[v=4??Wo]oU9gUUS;V޿e?k7-?[X'{DXbGx=bI,>T TUvglmnet/data/CVXResults.RData0000644000176200001440000000031212464072752015415 0ustar liggesusers r0b```b`f@& `d`aI%a@6"H߾!6O\ʽ6.w9_9"pu7^+^{Yһ ~@Wu/쏙L7bdo glmnet/data/QuickStartExample.RData0000644000176200001440000003762312400076361017006 0ustar liggesusers]i4UoELBD&!\яJ%)D)E**i02^<{K;hhhhifKV筻;ihA.T_킩b{$u%<~s:^O1N9gL ȍcxH(CYq2K6>3bY>0ϭc0>m_t F3vNϚP70܊}Dڟ]،UX/9tGad>AcHr)_ ÝÔ[gb~X(~;Mw`KPI߷h.|1a^>Hs(xSە`Rw[% |~t@1m}͋:]a5VT^ZC#~8 Ãdh '4 g^ f'}8u.6GE{)N)0PA%̀o߅#7aV"]O%LWttKDK7,1Y..{{8ww׾TE_ūX_mn$agf ;JY3sN|] \GrkoyWvǂ0Tc!h#ygœKiUR,$cՌf6>viy8vg yDžPf ~}d:kv~q uh;=#ЅL_}A:έE~ׄBG?a@/"́OfO{x)Uo7rn*38jp%*w8#w1l pѐX %9Gp`e,uiU->p}(Ił.{HyposZn!/8+QCg&+g5r(W[/jrsY fmœdUXPS*ۿs+؝6Ɩw@=}S_'̩GD0kHl &h*,&woSµGxA!$ ',uc"VEc-&Byk3aGo94S Lʕu?f +Ts$r!w@$R^w*NoLܾ}E9{^; se 8zZ|`Mahhiإ Ջ9a9FDjA50|W՛G::;nǑ|``,vs*6nRAG`S'%+x) 'l{R-\ DKfڟ{tfb2)<}ێ]OCqmyM8i%7cv3[_XͧHc yWBm1} ,>FS›4y)){)dSz]s7 ONkJے3S Oa3>۠}#6{jxH=lv>~ f`5xw&tF|x#`邋q,*ia\qЭH;g_fR;XM_zqe;,krOदdPZǫ4ݥ\顓)8l1^.RC0y}Jq xqȉyv}. .gpBM{k)^M`y ugis8eaTqg[*LINbDh{8Q3O}NlEY Mǘ$ XH&tT_UX>7α,=1á 7|y7Dp%7؁ћ!dwhcq+[6DWW8`J!pb`}HJu9%qyZ 0A+(tV#UW{wTݹvA1V30UqµV$]iZtj!^ܣ= 3_w;Cq/DjAyDFs8kG,eED&omIIZ5`*֭*;P? u;I`hPa0)?8d*k?,z=aX=;_ی}@/eo|d3Q@uJ4tڷsZck R0/,,\n6.B5@:]7Nj<;rK&wzt6V_`:7cGq r:7+RZeLq{֧3M]|mC=NÆcr;CoÎ# 7clk _> ly`a?[G7Nv|Lwԋ82sL6:YI㏲]ꆴ%c9Dgxryw$N/Շjs[z aݸrOY"i'Sm3XosFNk>'З͎<];W;mEd\0i\hLJb?>c&*N03h%:}ƛ2`pIYx.&BڢS)W~hKͿmLga|64b׷o>y`K-ޘ+˔!+ $ațwY2,INeq6|nMAk30{K˖ ۑhѯعs? >pr( ӟGOqSΎCݘqa])Y5>9keox \+8]6bb*CnV}Q1X}?c3+ 4+:ӠčHfzF7iNaA,`TSо4iٜU})oid+;}90sۛ6TeB2,9;´x2nwZ`@wM9 }Iu`Ʋ9V.I/ ~YumPRj6]#mvism{0ƕ+ɁݟmDhC3s88|t_r,^`:&c (ܣصn*_RӟCno40/[w L?t>)m۹qE}Zj:KǢ$*B 4ʴ +IJ=CqjD$p;"O;Z>@!,49Z9,y̎s%dZ#8'vg$l[62 2lHJI_|eʘgFCUB aLmBJnк@J*RD^{jpI5'@9E@_P) =Q=@sW<չ`'MhJ/bsx*"&0+ǓD v;h=5;a]%7 cCy] PvY/[ Y(snU-,7Q`~m[ېlIɚT V1߭֓rLn>T,(,`h!K2N5A~˽ji)}84L4=א%2KQ>0ib6t IoS0eL%>`8l7~ +aAʄUm:U9 Y‰͓fq;ttO<)KZ:8iuՋSΈz܎(y2%uprFw-U3wyTTqOBG:Y9<ȏe;(t4;I? _jjlY[L <+Sg2bs.%:fn=> Ojgqi=QPFH_$%TƩڃF$w^X5f~ϩ=jp/dڨu%߳\`~+/Z4LoD^/"T5vMvWRxd1~ ׃TE+@d RSN%QT\5jq0T+[ގ/ q|ZLb}K , OXB#JgcM:'?䟅b_O?8^#O2 ~=c2 }.҉5Ch!!Du8AӮDZN[ʽo! 8탆Ca~$Y鯴q䐍?[-k){F ?m^Jɴ9S"o!eym4\}o*p2J?rm+lp9.4pLXyNi n0K"ֻTwׅ(JF!LT{#>{pXUxx|>aAeR[$3:{/cpQNZO/~h\ZY^ӯpw0$6Mɫ(c ءMpj=I480(b DŁCW#% q!9C$$K(¥Pequh>q~vŜXn_'Ƒr;Xro$&ҴΣ긄aל}VŤae%5|e츗O*ZtacH]0"`Ph:f*_+aA''7=d6 Iy=0(=i[v)DZ(u'kEu4}~mfo"w)wdaq&:_ͪ\;ΜV ƠǶx2V [hӻdzFx}{AGܜIB"ǰ 7jhzp]7tqMSFigq큪v/)ֿbNg큲'H0tbncU@_5{ƤnH] ~/U~e{:c{oߝfhvT_CȗG-4%&lMe#O5sNqcPN\x-GS̿ۆP+2@i):c;.o )ߗPGH^ *G:-3P@v\6D9SiE0٧5YVu&DJcFE%WX/ جpH2)?c?QAWqN2F`IO:K٩)r8)hLw+4(LLv:m u[ΑA=JA-v`E>;%]ξawOTȢ!}Xj8%g8qSBB;#@5R jW6(5&ίuXߴ32G9M<*6m%&:M"Kh{qWlGĨ1& )r1w szfu{d"6~ rʎa6{-v_qc 8I*s{1n:0<4G79 8wDð\|R9IL,b\72?"R=Ia08yeyR .tO%IAc꿰،-T]q)fN O3 +(ˆuezDRZ%|s3ibذ[s8)}z9.6k X?CZÎTܹ=0"zwɴg5n+P.Wh,'cF5̪~5=+5]GrxI3=@c¾6sxJcξ0ΫjTCVWKI3& ZŽ+óX3G (ngaFY8,P|7jq}&'\kaE"Oz k+g]pzLrV.مߒ U&*Oc? )…tZ 7ܶf؀}?l}ߥ9܌:R cfMFqشUKV_ӷ3FR1]/9NuT\nʃĀ'e}"|Q1'8 Bv̟`v{jM|79Xޙm` κ:#~ik-$lژswj̾[݇HVxb@)8NqɝLp9!e}zF9OcOԃf?_OCC:BSZRyČk/#2r\0U:^{b~z:7 4H;y/Ve|hK ,ql. LN&prS/`e'땃C5<vUne ?xhD &9iʜ dڝ uos癠wAw/.;Rw?,ԗJx$ .xm"X lW~MFcY ~}qn+.:ģjuSl1әgZTh:BC4%Z}d孫42 M#>?b Λ`&_}kj#ߦ mck^a^H߾JBϠj[='ISy _ACKA0eR%e(spKP.r`[N""gJR{uN{6HaǷh0~r/k=@_O=_Qǡv4|+wWԵ#wC[n6R$G۴C rBC{c0+]K!d{>4݅~)!r fvPb6${Õ4 )3/BK/ks/)mOmIS'qQ.R N$LL+҇_qx8 Zz {_PRLk` v~XzN@{⫄! gO8A kp8]nIz4&[˻aG}snnb`] 84yCl$>ANaq]2">?|-$n޶x-i p1 l&Tfq$} zA03ފ9+̸LY"?ћ,M>N=QA 'jZeƅA?;W:=P3MY)%??} iFpE_\),rRN?8/+P_@& Ky@}JódQF0@kپ3|}ǑH\ 휒1SXI.)zaz|D#+l5+Jp=N7py0t!-# T$336~ϰ\Rc 3c3?z}Z.;dok_ "\s2ܿ '再Nw 18NfBS]sSoټ/8hs)䣠-3,6Uea'y<5){t(Әa]hOK;cu G~#g%P.O Ì{ɏP'F,~z7WQ#:/"bt mZВxZRebFׯc,q,&ϕoHWбNcDz+oFNX? 6 [M ̕lPꓗYWՁzf.7֜a_Ƒy <A/m"uJnrm=;b qGEs>! =82箳YsyW$⌽kd4}RWoՃFMH%8zhu"϶^2}(rhm7 B@, @C7*âףr˜|(W{q!2||ŵ\^r G 'uP&Z`D;e1f2OlǵCJώcTJ@d*W aFlF[uJ.ǎGz\Rbm{f7GkHSΧٛN|W%V%pZ2ZEY{T $␎2]ELz+qU/<*eCepH%!,34۳ Z>ChTB&&M;HV@jc.`gmFaؠx,u]_M&20_s['I![H6'io?퇌-Z vC`B{- \+2f/TYB*h|OdЅF_ÕHK0Qso(,/ N\ԇ:/4qbʗ/8 OXv˜Y [В?8ŞSZ6|INgw"\(iVo;pƗ/q7W{S9n Zk<"[qϛس!īk/6c%f;~=Cou%%0AsaяޮAT7AWFB0}@|%Wa}7mrMm(ӫT| kQ 8pgp8NFV݅A_ޑi s%^ۤJ=ם׆!7?Ӿogr=Rh]Wuǜ6CGW2|8 [ˋLjq\}a`~yX4\pᄥ;"a>mX+ NaZ5%褬Pԅ-kږ^^VulX >c?h־bnҲ;98sJ-=(%墉3m籟gN9UJO]]\-mPtz_E&zY~@6UPdùw{X;Pq}T:W_e֮{JTCywePw6\8c 42YIyM/ `cJXbuJpȴ"DM68VU & F,bƼ.C*ovՄ L8Ber<3 2btq;k+Wyq`Y]0P#jihv& G>oŁYٝ~]`OMk\㟷~w Yle?WM^3 b{Nh`;q`GЈ`."NX[U0m !`Ri0d%W/k<4O@aoGPI;˫~cc]M_Aݨ|Ayڙ {+%[}/z;H~N" ?ԫunLy^L x`oT$7U=kFT0*xeMVYTkţ3MJK *_ 1(SyqR8ќ,2~Lf9aU^ugNmc_8hv&ãCq&@ym^hޥv Wۈ2qo7bH겫2*2BGZ8?uUl\:-k"2 |w !~M^(s(]iℱ*f =`sAo3 0r 3p Kbҋ >_`邟m "Z ɼð rYyBf0JؑgX޳* K]_[DݙJo(MdKLPfضݺ,}ntϴP*b4Vw"+:L)~&K;ፅŒoBؑN%9MvkoKÃOz9(Ω|aK2}DFQlaQ=bO3j5@y̓2X88"_9Gg|{}~OѦ8֠~ל'NQN*T/)WtC01njKq)9 A  |dGÎc>̅iPKG]$/1ٕ߷oBdF{䒐 ɪ60ʻzw8֧|`P^UUaLrj}HW 7 6QcK}?{=0_n3]@v~H{Ήc-'p.mSY)-li|d1 ?ա.-+o GI#e06= _\h`qiUk~^̞@멑(u_Օ۽XaN[o!U|6ϸ)ɠ]}y-ѣl?Zmti+8Nsgh{u ߵ)crØev!>,869+MpJIk4=+I-v)JMt7.x2?[ˀ5p`Ѳ{0^s+ =ƅ{w1Ce [6 )K ŸY6i]ԥbپ q1G`B,|ZR_f[~6^Vڳ>-u~ΗN3}DŽ⯰!Yq{:A9]Xrk? A,aIrqWh,% z߃ /zXEpagz8 X%u&7Ztzs[ ]1[co:9R,fU\ay|(t =`ujB_@x+8 ~Vܔ1﹞~!VӰz@EIwh1{4YJ9UA`y7DW+Ԅxp\rl4)J&^[j)bWDOĝ^ݽvD7ًj qZfec˜1D%#LD%[?0TMqcf#ngu!0$&jj(W\BQڰ7dXks{) Lo=W}rǠT1aPQ&'u)/]V®#R2qϟ@"s'eoy awàWm qۋ"KΥ +m7$l]޴"p:%9 i:;C4&oZDfKnOI([j7H9a.w$9"!H偙hRjޗq W۟K|tM]n=]YD4#?4GS>e|b@yzZ\iǾMUf+zpwҿ&ؤ=f Ȫu5KY*_#YR/9y.H歔.uܜk}??Iؑ—t[JFB.fׇ mno{4<ۂ}qqʉ.DЗf^zdojm*kސD~{w޶D}EDfPśݴ%߉;0,family="binomial") print(fit2) fit2p=bigGlm(x,y>0,family="binomial",path=TRUE) print(fit2p) } \seealso{ \code{print}, \code{predict}, and \code{coef} methods. } \author{ Trevor Hastie\cr Maintainer: Trevor Hastie \email{hastie@stanford.edu} } \keyword{models} \keyword{regression} glmnet/man/plot.glmnet.Rd0000644000176200001440000000425013553366407015062 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot.glmnet.R, R/plot.mrelnet.R, % R/plot.multnet.R, R/plot.relaxed.R \name{plot.glmnet} \alias{plot.glmnet} \alias{plot.multnet} \alias{plot.mrelnet} \alias{plot.relaxed} \title{plot coefficients from a "glmnet" object} \usage{ \method{plot}{glmnet}(x, xvar = c("norm", "lambda", "dev"), label = FALSE, ...) \method{plot}{mrelnet}(x, xvar = c("norm", "lambda", "dev"), label = FALSE, type.coef = c("coef", "2norm"), ...) \method{plot}{multnet}(x, xvar = c("norm", "lambda", "dev"), label = FALSE, type.coef = c("coef", "2norm"), ...) \method{plot}{relaxed}(x, xvar = c("lambda", "dev"), label = FALSE, gamma = 1, ...) } \arguments{ \item{x}{fitted \code{"glmnet"} model} \item{xvar}{What is on the X-axis. \code{"norm"} plots against the L1-norm of the coefficients, \code{"lambda"} against the log-lambda sequence, and \code{"dev"} against the percent deviance explained.} \item{label}{If \code{TRUE}, label the curves with variable sequence numbers.} \item{\dots}{Other graphical parameters to plot} \item{type.coef}{If \code{type.coef="2norm"} then a single curve per variable, else if \code{type.coef="coef"}, a coefficient plot per response} \item{gamma}{Value of the mixing parameter for a "relaxed" fit} } \description{ Produces a coefficient profile plot of the coefficient paths for a fitted \code{"glmnet"} object. } \details{ A coefficient profile plot is produced. If \code{x} is a multinomial model, a coefficient plot is produced for each class. } \examples{ x=matrix(rnorm(100*20),100,20) y=rnorm(100) g2=sample(1:2,100,replace=TRUE) g4=sample(1:4,100,replace=TRUE) fit1=glmnet(x,y) plot(fit1) plot(fit1,xvar="lambda",label=TRUE) fit3=glmnet(x,g4,family="multinomial") plot(fit3,pch=19) } \references{ Friedman, J., Hastie, T. and Tibshirani, R. (2008) \emph{Regularization Paths for Generalized Linear Models via Coordinate Descent} } \seealso{ \code{glmnet}, and \code{print}, \code{predict} and \code{coef} methods. } \author{ Jerome Friedman, Trevor Hastie and Rob Tibshirani\cr Maintainer: Trevor Hastie \href{mailto:hastie@stanford.edu}{hastie@stanford.edu} } \keyword{models} \keyword{regression} glmnet/man/print.glmnet.Rd0000644000176200001440000000263613553366407015246 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/print.glmnet.R \name{print.glmnet} \alias{print.glmnet} \alias{print.relaxed} \alias{print.bigGlm} \title{print a glmnet object} \usage{ \method{print}{glmnet}(x, digits = max(3, getOption("digits") - 3), ...) } \arguments{ \item{x}{fitted glmnet object} \item{digits}{significant digits in printout} \item{\dots}{additional print arguments} } \value{ The matrix above is silently returned } \description{ Print a summary of the glmnet path at each step along the path. } \details{ The call that produced the object \code{x} is printed, followed by a three-column matrix with columns \code{Df}, \code{\%Dev} and \code{Lambda}. The \code{Df} column is the number of nonzero coefficients (Df is a reasonable name only for lasso fits). \code{\%Dev} is the percent deviance explained (relative to the null deviance). In the case of a 'relaxed' fit, an additional column is inserted, \code{\%Dev R} which gives the percent deviance explained by the relaxed model. For a "bigGlm" model, a simpler summary is printed. } \examples{ x = matrix(rnorm(100 * 20), 100, 20) y = rnorm(100) fit1 = glmnet(x, y) print(fit1) } \references{ Friedman, J., Hastie, T. and Tibshirani, R. (2008). Regularization Paths for Generalized Linear Models via Coordinate Descent } \seealso{ \code{glmnet}, \code{predict} and \code{coef} methods. } \keyword{models} \keyword{regression} glmnet/man/glmnet.control.Rd0000644000176200001440000000434013553366407015564 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/glmnet.control.R \name{glmnet.control} \alias{glmnet.control} \title{internal glmnet parameters} \usage{ glmnet.control(fdev = 1e-05, devmax = 0.999, eps = 1e-06, big = 9.9e+35, mnlam = 5, pmin = 1e-09, exmx = 250, prec = 1e-10, mxit = 100, itrace = 0, factory = FALSE) } \arguments{ \item{fdev}{minimum fractional change in deviance for stopping path; factory default = 1.0e-5} \item{devmax}{maximum fraction of explained deviance for stopping path; factory default = 0.999} \item{eps}{minimum value of lambda.min.ratio (see glmnet); factory default= 1.0e-6} \item{big}{large floating point number; factory default = 9.9e35. Inf in definition of upper.limit is set to big} \item{mnlam}{minimum number of path points (lambda values) allowed; factory default = 5} \item{pmin}{minimum probability for any class. factory default = 1.0e-9. Note that this implies a pmax of 1-pmin.} \item{exmx}{maximum allowed exponent. factory default = 250.0} \item{prec}{convergence threshold for multi response bounds adjustment solution. factory default = 1.0e-10} \item{mxit}{maximum iterations for multiresponse bounds adjustment solution. factory default = 100} \item{itrace}{If 1 then progress bar is displayed when running \code{glmnet} and \code{cv.glmnet}. factory default = 0} \item{factory}{If \code{TRUE}, reset all the parameters to the factory default; default is \code{FALSE}} } \value{ A list with named elements as in the argument list } \description{ View and/or change the factory default parameters in glmnet } \details{ If called with no arguments, \code{glmnet.control()} returns a list with the current settings of these parameters. Any arguments included in the call sets those parameters to the new values, and then silently returns. The values set are persistent for the duration of the R session. } \examples{ glmnet.control(fdev = 0) #continue along path even though not much changes glmnet.control() # view current settings glmnet.control(factory = TRUE) # reset all the parameters to their default } \seealso{ \code{glmnet} } \author{ Jerome Friedman, Trevor Hastie\cr Maintainer: Trevor Hastie \email{hastie@stanford.edu} } \keyword{models} \keyword{regression} glmnet/man/predict.glmnet.Rd0000644000176200001440000001267113557672052015544 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/coef.glmnet.R, R/predict.glmnet.R, % R/predict.relaxed.R \name{coef.glmnet} \alias{coef.glmnet} \alias{predict.glmnet} \alias{coef.relaxed} \alias{predict.relaxed} \alias{predict.elnet} \alias{predict.lognet} \alias{predict.multnet} \alias{predict.mrelnet} \alias{predict.fishnet} \alias{predict.coxnet} \title{Extract coefficients from a glmnet object} \usage{ \method{coef}{glmnet}(object, s = NULL, exact = FALSE, ...) \method{predict}{glmnet}(object, newx, s = NULL, type = c("link", "response", "coefficients", "nonzero", "class"), exact = FALSE, newoffset, ...) \method{predict}{relaxed}(object, newx, s = NULL, gamma = 1, type = c("link", "response", "coefficients", "nonzero", "class"), exact = FALSE, newoffset, ...) } \arguments{ \item{object}{Fitted \code{"glmnet"} model object or a \code{"relaxed"} model (which inherits from class "glmnet").} \item{s}{Value(s) of the penalty parameter \code{lambda} at which predictions are required. Default is the entire sequence used to create the model.} \item{exact}{This argument is relevant only when predictions are made at values of \code{s} (lambda) \emph{different} from those used in the fitting of the original model. Not available for \code{"relaxed"} objects. If \code{exact=FALSE} (default), then the predict function uses linear interpolation to make predictions for values of \code{s} (lambda) that do not coincide with those used in the fitting algorithm. While this is often a good approximation, it can sometimes be a bit coarse. With \code{exact=TRUE}, these different values of \code{s} are merged (and sorted) with \code{object$lambda}, and the model is refit before predictions are made. In this case, it is required to supply the original data \code{x=} and \code{y=} as additional named arguments to \code{predict()} or \code{coef()}. The workhorse \code{predict.glmnet()} needs to \code{update} the model, and so needs the data used to create it. The same is true of \code{weights}, \code{offset}, \code{penalty.factor}, \code{lower.limits}, \code{upper.limits} if these were used in the original call. Failure to do so will result in an error.} \item{\dots}{This is the mechanism for passing arguments like \code{x=} when \code{exact=TRUE}; see\code{exact} argument.} \item{newx}{Matrix of new values for \code{x} at which predictions are to be made. Must be a matrix; can be sparse as in \code{Matrix} package. This argument is not used for \code{type=c("coefficients","nonzero")}} \item{type}{Type of prediction required. Type \code{"link"} gives the linear predictors for \code{"binomial"}, \code{"multinomial"}, \code{"poisson"} or \code{"cox"} models; for \code{"gaussian"} models it gives the fitted values. Type \code{"response"} gives the fitted probabilities for \code{"binomial"} or \code{"multinomial"}, fitted mean for \code{"poisson"} and the fitted relative-risk for \code{"cox"}; for \code{"gaussian"} type \code{"response"} is equivalent to type \code{"link"}. Type \code{"coefficients"} computes the coefficients at the requested values for \code{s}. Note that for \code{"binomial"} models, results are returned only for the class corresponding to the second level of the factor response. Type \code{"class"} applies only to \code{"binomial"} or \code{"multinomial"} models, and produces the class label corresponding to the maximum probability. Type \code{"nonzero"} returns a list of the indices of the nonzero coefficients for each value of \code{s}.} \item{newoffset}{If an offset is used in the fit, then one must be supplied for making predictions (except for \code{type="coefficients"} or \code{type="nonzero"})} \item{gamma}{Single value of \code{gamma} at which predictions are required, for "relaxed" objects.} } \value{ The object returned depends on type. } \description{ Similar to other predict methods, this functions predicts fitted values, logits, coefficients and more from a fitted \code{"glmnet"} object. } \details{ The shape of the objects returned are different for \code{"multinomial"} objects. This function actually calls \code{NextMethod()}, and the appropriate predict method is invoked for each of the three model types. \code{coef(...)} is equivalent to \code{predict(type="coefficients",...)} } \examples{ x=matrix(rnorm(100*20),100,20) y=rnorm(100) g2=sample(1:2,100,replace=TRUE) g4=sample(1:4,100,replace=TRUE) fit1=glmnet(x,y) predict(fit1,newx=x[1:5,],s=c(0.01,0.005)) predict(fit1,type="coef") fit2=glmnet(x,g2,family="binomial") predict(fit2,type="response",newx=x[2:5,]) predict(fit2,type="nonzero") fit3=glmnet(x,g4,family="multinomial") predict(fit3,newx=x[1:3,],type="response",s=0.01) } \references{ Friedman, J., Hastie, T. and Tibshirani, R. (2008) \emph{Regularization Paths for Generalized Linear Models via Coordinate Descent}, \url{https://web.stanford.edu/~hastie/Papers/glmnet.pdf}\cr \emph{Journal of Statistical Software, Vol. 33(1), 1-22 Feb 2010}\cr \url{https://www.jstatsoft.org/v33/i01/}\cr Simon, N., Friedman, J., Hastie, T., Tibshirani, R. (2011) \emph{Regularization Paths for Cox's Proportional Hazards Model via Coordinate Descent, Journal of Statistical Software, Vol. 39(5) 1-13}\cr \url{https://www.jstatsoft.org/v39/i05/} } \seealso{ \code{glmnet}, and \code{print}, and \code{coef} methods, and \code{cv.glmnet}. } \author{ Jerome Friedman, Trevor Hastie and Rob Tibshirani\cr Maintainer: Trevor Hastie \href{mailto:hastie@stanford.edu}{hastie@stanford.edu} } \keyword{models} \keyword{regression} glmnet/man/predict.cv.glmnet.Rd0000644000176200001440000000556313555633674016162 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/predict.cv.glmnet.R, R/predict.cv.relaxed.R \name{predict.cv.glmnet} \alias{predict.cv.glmnet} \alias{coef.cv.glmnet} \alias{coef.cv.relaxed} \alias{predict.cv.relaxed} \title{make predictions from a "cv.glmnet" object.} \usage{ \method{predict}{cv.glmnet}(object, newx, s = c("lambda.1se", "lambda.min"), ...) \method{predict}{cv.relaxed}(object, newx, s = c("lambda.1se", "lambda.min"), gamma = c("gamma.1se", "gamma.min"), ...) } \arguments{ \item{object}{Fitted \code{"cv.glmnet"} or \code{"cv.relaxed"} object.} \item{newx}{Matrix of new values for \code{x} at which predictions are to be made. Must be a matrix; can be sparse as in \code{Matrix} package. See documentation for \code{predict.glmnet}.} \item{s}{Value(s) of the penalty parameter \code{lambda} at which predictions are required. Default is the value \code{s="lambda.1se"} stored on the CV \code{object}. Alternatively \code{s="lambda.min"} can be used. If \code{s} is numeric, it is taken as the value(s) of \code{lambda} to be used. (For historical reasons we use the symbol 's' rather than 'lambda' to reference this parameter)} \item{\dots}{Not used. Other arguments to predict.} \item{gamma}{Value (single) of 'gamma' at which predictions are to be made} } \value{ The object returned depends on the \dots{} argument which is passed on to the \code{predict} method for \code{glmnet} objects. } \description{ This function makes predictions from a cross-validated glmnet model, using the stored \code{"glmnet.fit"} object, and the optimal value chosen for \code{lambda} (and \code{gamma} for a 'relaxed' fit. } \details{ This function makes it easier to use the results of cross-validation to make a prediction. } \examples{ x = matrix(rnorm(100 * 20), 100, 20) y = rnorm(100) cv.fit = cv.glmnet(x, y) predict(cv.fit, newx = x[1:5, ]) coef(cv.fit) coef(cv.fit, s = "lambda.min") predict(cv.fit, newx = x[1:5, ], s = c(0.001, 0.002)) cv.fitr = cv.glmnet(x, y, relax = TRUE) predict(cv.fit, newx = x[1:5, ]) coef(cv.fit) coef(cv.fit, s = "lambda.min", gamma = "gamma.min") predict(cv.fit, newx = x[1:5, ], s = c(0.001, 0.002), gamma = "gamma.min") } \references{ Friedman, J., Hastie, T. and Tibshirani, R. (2008) \emph{Regularization Paths for Generalized Linear Models via Coordinate Descent, Journal of Statistical Software, Vol. 33, Issue 1, Feb 2010}\cr \url{https://www.jstatsoft.org/v33/i01/} \url{https://arxiv.org/abs/1707.08692}\cr Hastie, T., Tibshirani, Robert, Tibshirani, Ryan (2019) \emph{Extended Comparisons of Best Subset Selection, Forward Stepwise Selection, and the Lasso} } \seealso{ \code{glmnet}, and \code{print}, and \code{coef} methods, and \code{cv.glmnet}. } \author{ Jerome Friedman, Trevor Hastie and Rob Tibshirani\cr Maintainer: Trevor Hastie \href{mailto:hastie@stanford.edu}{hastie@stanford.edu} } \keyword{models} \keyword{regression} glmnet/man/glmnet.measures.Rd0000644000176200001440000000151613553366407015732 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/glmnet.measures.R \name{glmnet.measures} \alias{glmnet.measures} \title{Display the names of the measures used in CV for different "glmnet" families} \usage{ glmnet.measures(family = c("all", "gaussian", "binomial", "poisson", "multinomial", "cox", "mgaussian")) } \arguments{ \item{family}{If a "glmnet" family is supplied, a list of the names of measures available for that family are produced. Default is "all", in which case the names of measures for all families are produced.} } \description{ Produces a list of names of measures } \details{ Try it and see. A very simple function to provide information } \seealso{ \code{cv.glmnet} and \code{assess.glmnet}. } \author{ Trevor Hastie\cr Maintainer: Trevor Hastie \email{hastie@stanford.edu} } \keyword{models} glmnet/man/glmnet.Rd0000644000176200001440000004371313560704061014102 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/glmnet.R, R/relax.glmnet.R \name{glmnet} \alias{glmnet} \alias{relax.glmnet} \title{fit a GLM with lasso or elasticnet regularization} \usage{ glmnet(x, y, family = c("gaussian", "binomial", "poisson", "multinomial", "cox", "mgaussian"), weights, offset = NULL, alpha = 1, nlambda = 100, lambda.min.ratio = ifelse(nobs < nvars, 0.01, 1e-04), lambda = NULL, standardize = TRUE, intercept = TRUE, thresh = 1e-07, dfmax = nvars + 1, pmax = min(dfmax * 2 + 20, nvars), exclude, penalty.factor = rep(1, nvars), lower.limits = -Inf, upper.limits = Inf, maxit = 1e+05, type.gaussian = ifelse(nvars < 500, "covariance", "naive"), type.logistic = c("Newton", "modified.Newton"), standardize.response = FALSE, type.multinomial = c("ungrouped", "grouped"), relax = FALSE, trace.it = 0, ...) relax.glmnet(fit, x, ..., maxp = n - 3, path = FALSE, check.args = TRUE) } \arguments{ \item{x}{input matrix, of dimension nobs x nvars; each row is an observation vector. Can be in sparse matrix format (inherit from class \code{"sparseMatrix"} as in package \code{Matrix}; not yet available for \code{family="cox"})} \item{y}{response variable. Quantitative for \code{family="gaussian"}, or \code{family="poisson"} (non-negative counts). For \code{family="binomial"} should be either a factor with two levels, or a two-column matrix of counts or proportions (the second column is treated as the target class; for a factor, the last level in alphabetical order is the target class). For \code{family="multinomial"}, can be a \code{nc>=2} level factor, or a matrix with \code{nc} columns of counts or proportions. For either \code{"binomial"} or \code{"multinomial"}, if \code{y} is presented as a vector, it will be coerced into a factor. For \code{family="cox"}, \code{y} should be a two-column matrix with columns named 'time' and 'status'. The latter is a binary variable, with '1' indicating death, and '0' indicating right censored. The function \code{Surv()} in package \pkg{survival} produces such a matrix. For \code{family="mgaussian"}, \code{y} is a matrix of quantitative responses.} \item{family}{Response type (see above)} \item{weights}{observation weights. Can be total counts if responses are proportion matrices. Default is 1 for each observation} \item{offset}{A vector of length \code{nobs} that is included in the linear predictor (a \code{nobs x nc} matrix for the \code{"multinomial"} family). Useful for the \code{"poisson"} family (e.g. log of exposure time), or for refining a model by starting at a current fit. Default is \code{NULL}. If supplied, then values must also be supplied to the \code{predict} function.} \item{alpha}{The elasticnet mixing parameter, with \eqn{0\le\alpha\le 1}. The penalty is defined as \deqn{(1-\alpha)/2||\beta||_2^2+\alpha||\beta||_1.} \code{alpha=1} is the lasso penalty, and \code{alpha=0} the ridge penalty.} \item{nlambda}{The number of \code{lambda} values - default is 100.} \item{lambda.min.ratio}{Smallest value for \code{lambda}, as a fraction of \code{lambda.max}, the (data derived) entry value (i.e. the smallest value for which all coefficients are zero). The default depends on the sample size \code{nobs} relative to the number of variables \code{nvars}. If \code{nobs > nvars}, the default is \code{0.0001}, close to zero. If \code{nobs < nvars}, the default is \code{0.01}. A very small value of \code{lambda.min.ratio} will lead to a saturated fit in the \code{nobs < nvars} case. This is undefined for \code{"binomial"} and \code{"multinomial"} models, and \code{glmnet} will exit gracefully when the percentage deviance explained is almost 1.} \item{lambda}{A user supplied \code{lambda} sequence. Typical usage is to have the program compute its own \code{lambda} sequence based on \code{nlambda} and \code{lambda.min.ratio}. Supplying a value of \code{lambda} overrides this. WARNING: use with care. Avoid supplying a single value for \code{lambda} (for predictions after CV use \code{predict()} instead). Supply instead a decreasing sequence of \code{lambda} values. \code{glmnet} relies on its warms starts for speed, and its often faster to fit a whole path than compute a single fit.} \item{standardize}{Logical flag for x variable standardization, prior to fitting the model sequence. The coefficients are always returned on the original scale. Default is \code{standardize=TRUE}. If variables are in the same units already, you might not wish to standardize. See details below for y standardization with \code{family="gaussian"}.} \item{intercept}{Should intercept(s) be fitted (default=TRUE) or set to zero (FALSE)} \item{thresh}{Convergence threshold for coordinate descent. Each inner coordinate-descent loop continues until the maximum change in the objective after any coefficient update is less than \code{thresh} times the null deviance. Defaults value is \code{1E-7}.} \item{dfmax}{Limit the maximum number of variables in the model. Useful for very large \code{nvars}, if a partial path is desired.} \item{pmax}{Limit the maximum number of variables ever to be nonzero} \item{exclude}{Indices of variables to be excluded from the model. Default is none. Equivalent to an infinite penalty factor (next item).} \item{penalty.factor}{Separate penalty factors can be applied to each coefficient. This is a number that multiplies \code{lambda} to allow differential shrinkage. Can be 0 for some variables, which implies no shrinkage, and that variable is always included in the model. Default is 1 for all variables (and implicitly infinity for variables listed in \code{exclude}). Note: the penalty factors are internally rescaled to sum to nvars, and the lambda sequence will reflect this change.} \item{lower.limits}{Vector of lower limits for each coefficient; default \code{-Inf}. Each of these must be non-positive. Can be presented as a single value (which will then be replicated), else a vector of length \code{nvars}} \item{upper.limits}{Vector of upper limits for each coefficient; default \code{Inf}. See \code{lower.limits}} \item{maxit}{Maximum number of passes over the data for all lambda values; default is 10^5.} \item{type.gaussian}{Two algorithm types are supported for (only) \code{family="gaussian"}. The default when \code{nvar<500} is \code{type.gaussian="covariance"}, and saves all inner-products ever computed. This can be much faster than \code{type.gaussian="naive"}, which loops through \code{nobs} every time an inner-product is computed. The latter can be far more efficient for \code{nvar >> nobs} situations, or when \code{nvar > 500}.} \item{type.logistic}{If \code{"Newton"} then the exact hessian is used (default), while \code{"modified.Newton"} uses an upper-bound on the hessian, and can be faster.} \item{standardize.response}{This is for the \code{family="mgaussian"} family, and allows the user to standardize the response variables} \item{type.multinomial}{If \code{"grouped"} then a grouped lasso penalty is used on the multinomial coefficients for a variable. This ensures they are all in our out together. The default is \code{"ungrouped"}} \item{relax}{If \code{TRUE} then for each \emph{active set} in the path of solutions, the model is refit without any regularization. See \code{details} for more information. This argument is new, and users may experience convergence issues with small datasets, especially with non-gaussian families. Limiting the value of 'maxp' can alleviate these issues in some cases.} \item{trace.it}{If \code{trace.it=1}, then a progress bar is displayed; useful for big models that take a long time to fit.} \item{...}{Additional argument used in \code{relax.glmnet}. These include some of the original arguments to 'glmnet', and each must be named if used.} \item{fit}{For \code{relax.glmnet} a fitted 'glmnet' object} \item{maxp}{a limit on how many relaxed coefficients are allowed. Default is 'n-3', where 'n' is the sample size. This may not be sufficient for non-gaussian familes, in which case users should supply a smaller value. This argument can be supplied directly to 'glmnet'.} \item{path}{Since \code{glmnet} does not do stepsize optimization, the Newton algorithm can get stuck and not converge, especially with relaxed fits. With \code{path=TRUE}, each relaxed fit on a particular set of variables is computed pathwise using the original sequence of lambda values (with a zero attached to the end). Not needed for Gaussian models, and should not be used unless needed, since will lead to longer compute times. Default is \code{path=FALSE}. appropriate subset of variables} \item{check.args}{Should \code{relax.glmnet} make sure that all the data dependent arguments used in creating 'fit' have been resupplied. Default is 'TRUE'.} } \value{ An object with S3 class \code{"glmnet","*" }, where \code{"*"} is \code{"elnet"}, \code{"lognet"}, \code{"multnet"}, \code{"fishnet"} (poisson), \code{"coxnet"} or \code{"mrelnet"} for the various types of models. If the model was created with \code{relax=TRUE} then this class has a prefix class of \code{"relaxed"}. \item{call}{the call that produced this object} \item{a0}{Intercept sequence of length \code{length(lambda)}} \item{beta}{For \code{"elnet"}, \code{"lognet"}, \code{"fishnet"} and \code{"coxnet"} models, a \code{nvars x length(lambda)} matrix of coefficients, stored in sparse column format (\code{"CsparseMatrix"}). For \code{"multnet"} and \code{"mgaussian"}, a list of \code{nc} such matrices, one for each class.} \item{lambda}{The actual sequence of \code{lambda} values used. When \code{alpha=0}, the largest lambda reported does not quite give the zero coefficients reported (\code{lambda=inf} would in principle). Instead, the largest \code{lambda} for \code{alpha=0.001} is used, and the sequence of \code{lambda} values is derived from this.} \item{dev.ratio}{The fraction of (null) deviance explained (for \code{"elnet"}, this is the R-square). The deviance calculations incorporate weights if present in the model. The deviance is defined to be 2*(loglike_sat - loglike), where loglike_sat is the log-likelihood for the saturated model (a model with a free parameter per observation). Hence dev.ratio=1-dev/nulldev.} \item{nulldev}{Null deviance (per observation). This is defined to be 2*(loglike_sat -loglike(Null)); The NULL model refers to the intercept model, except for the Cox, where it is the 0 model.} \item{df}{The number of nonzero coefficients for each value of \code{lambda}. For \code{"multnet"}, this is the number of variables with a nonzero coefficient for \emph{any} class.} \item{dfmat}{For \code{"multnet"} and \code{"mrelnet"} only. A matrix consisting of the number of nonzero coefficients per class} \item{dim}{dimension of coefficient matrix (ices)} \item{nobs}{number of observations} \item{npasses}{total passes over the data summed over all lambda values} \item{offset}{a logical variable indicating whether an offset was included in the model} \item{jerr}{error flag, for warnings and errors (largely for internal debugging).} \item{relaxed}{If \code{relax=TRUE}, this additional item is another glmnet object with different values for \code{beta} and \code{dev.ratio}} } \description{ Fit a generalized linear model via penalized maximum likelihood. The regularization path is computed for the lasso or elasticnet penalty at a grid of values for the regularization parameter lambda. Can deal with all shapes of data, including very large sparse data matrices. Fits linear, logistic and multinomial, poisson, and Cox regression models. } \details{ The sequence of models implied by \code{lambda} is fit by coordinate descent. For \code{family="gaussian"} this is the lasso sequence if \code{alpha=1}, else it is the elasticnet sequence. For the other families, this is a lasso or elasticnet regularization path for fitting the generalized linear regression paths, by maximizing the appropriate penalized log-likelihood (partial likelihood for the "cox" model). Sometimes the sequence is truncated before \code{nlambda} values of \code{lambda} have been used, because of instabilities in the inverse link functions near a saturated fit. \code{glmnet(...,family="binomial")} fits a traditional logistic regression model for the log-odds. \code{glmnet(...,family="multinomial")} fits a symmetric multinomial model, where each class is represented by a linear model (on the log-scale). The penalties take care of redundancies. A two-class \code{"multinomial"} model will produce the same fit as the corresponding \code{"binomial"} model, except the pair of coefficient matrices will be equal in magnitude and opposite in sign, and half the \code{"binomial"} values. Note that the objective function for \code{"gaussian"} is \deqn{1/2 RSS/nobs + \lambda*penalty,} and for the other models it is \deqn{-loglik/nobs + \lambda*penalty.} Note also that for \code{"gaussian"}, \code{glmnet} standardizes y to have unit variance (using 1/n rather than 1/(n-1) formula) before computing its lambda sequence (and then unstandardizes the resulting coefficients); if you wish to reproduce/compare results with other software, best to supply a standardized y. The coefficients for any predictor variables with zero variance are set to zero for all values of lambda. The latest two features in glmnet are the \code{family="mgaussian"} family and the \code{type.multinomial="grouped"} option for multinomial fitting. The former allows a multi-response gaussian model to be fit, using a "group -lasso" penalty on the coefficients for each variable. Tying the responses together like this is called "multi-task" learning in some domains. The grouped multinomial allows the same penalty for the \code{family="multinomial"} model, which is also multi-responsed. For both of these the penalty on the coefficient vector for variable j is \deqn{(1-\alpha)/2||\beta_j||_2^2+\alpha||\beta_j||_2.} When \code{alpha=1} this is a group-lasso penalty, and otherwise it mixes with quadratic just like elasticnet. A small detail in the Cox model: if death times are tied with censored times, we assume the censored times occurred just \emph{before} the death times in computing the Breslow approximation; if users prefer the usual convention of \emph{after}, they can add a small number to all censoring times to achieve this effect. If \code{relax=TRUE} a duplicate sequence of models is produced, where each active set in the elastic-net path is refit without regularization. The result of this is a matching \code{"glmnet"} object which is stored on the original object in a component named \code{"relaxed"}, and is part of the glmnet output. Generally users will not call \code{relax.glmnet} directly, unless the original 'glmnet' object took a long time to fit. But if they do, they must supply the fit, and all the original arguments used to create that fit. They can limit the length of the relaxed path via 'maxp'. } \examples{ # Gaussian x = matrix(rnorm(100 * 20), 100, 20) y = rnorm(100) fit1 = glmnet(x, y) print(fit1) coef(fit1, s = 0.01) # extract coefficients at a single value of lambda predict(fit1, newx = x[1:10, ], s = c(0.01, 0.005)) # make predictions # Relaxed fit1r = glmnet(x, y, relax = TRUE) # can be used with any model # multivariate gaussian y = matrix(rnorm(100 * 3), 100, 3) fit1m = glmnet(x, y, family = "mgaussian") plot(fit1m, type.coef = "2norm") # binomial g2 = sample(1:2, 100, replace = TRUE) fit2 = glmnet(x, g2, family = "binomial") fit2r = glmnet(x,g2, family = "binomial", relax=TRUE) fit2rp = glmnet(x,g2, family = "binomial", relax=TRUE, path=TRUE) # multinomial g4 = sample(1:4, 100, replace = TRUE) fit3 = glmnet(x, g4, family = "multinomial") fit3a = glmnet(x, g4, family = "multinomial", type.multinomial = "grouped") # poisson N = 500 p = 20 nzc = 5 x = matrix(rnorm(N * p), N, p) beta = rnorm(nzc) f = x[, seq(nzc)] \%*\% beta mu = exp(f) y = rpois(N, mu) fit = glmnet(x, y, family = "poisson") plot(fit) pfit = predict(fit, x, s = 0.001, type = "response") plot(pfit, y) # Cox set.seed(10101) N = 1000 p = 30 nzc = p/3 x = matrix(rnorm(N * p), N, p) beta = rnorm(nzc) fx = x[, seq(nzc)] \%*\% beta/3 hx = exp(fx) ty = rexp(N, hx) tcens = rbinom(n = N, prob = 0.3, size = 1) # censoring indicator y = cbind(time = ty, status = 1 - tcens) # y=Surv(ty,1-tcens) with library(survival) fit = glmnet(x, y, family = "cox") plot(fit) # Sparse n = 10000 p = 200 nzc = trunc(p/10) x = matrix(rnorm(n * p), n, p) iz = sample(1:(n * p), size = n * p * 0.85, replace = FALSE) x[iz] = 0 sx = Matrix(x, sparse = TRUE) inherits(sx, "sparseMatrix") #confirm that it is sparse beta = rnorm(nzc) fx = x[, seq(nzc)] \%*\% beta eps = rnorm(n) y = fx + eps px = exp(fx) px = px/(1 + px) ly = rbinom(n = length(px), prob = px, size = 1) system.time(fit1 <- glmnet(sx, y)) system.time(fit2n <- glmnet(x, y)) } \references{ Friedman, J., Hastie, T. and Tibshirani, R. (2008) \emph{Regularization Paths for Generalized Linear Models via Coordinate Descent}, \url{https://web.stanford.edu/~hastie/Papers/glmnet.pdf}\cr \emph{Journal of Statistical Software, Vol. 33(1), 1-22 Feb 2010}\cr \url{https://www.jstatsoft.org/v33/i01/}\cr Simon, N., Friedman, J., Hastie, T., Tibshirani, R. (2011) \emph{Regularization Paths for Cox's Proportional Hazards Model via Coordinate Descent, Journal of Statistical Software, Vol. 39(5) 1-13}\cr \url{https://www.jstatsoft.org/v39/i05/}\cr Tibshirani, Robert, Bien, J., Friedman, J., Hastie, T.,Simon, N.,Taylor, J. and Tibshirani, Ryan. (2012) \emph{Strong Rules for Discarding Predictors in Lasso-type Problems, JRSSB vol 74},\cr \url{https://statweb.stanford.edu/~tibs/ftp/strong.pdf}\cr \emph{Stanford Statistics Technical Report}\cr \url{https://arxiv.org/abs/1707.08692}\cr Hastie, T., Tibshirani, Robert, Tibshirani, Ryan (2019) \emph{Extended Comparisons of Best Subset Selection, Forward Stepwise Selection, and the Lasso}\cr \emph{Glmnet Vignette} \url{https://web.stanford.edu/~hastie/glmnet/glmnet_alpha.html} } \seealso{ \code{print}, \code{predict}, \code{coef} and \code{plot} methods, and the \code{cv.glmnet} function. } \author{ Jerome Friedman, Trevor Hastie, Balasubramanian Narasimhan, Noah Simon and Rob Tibshirani\cr Maintainer: Trevor Hastie \email{hastie@stanford.edu} } \keyword{models} \keyword{regression} glmnet/man/cv.glmnet.Rd0000644000176200001440000002520513555633674014524 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/cv.glmnet.R \name{cv.glmnet} \alias{cv.glmnet} \title{Cross-validation for glmnet} \usage{ cv.glmnet(x, y, weights = NULL, offset = NULL, lambda = NULL, type.measure = c("default", "mse", "deviance", "class", "auc", "mae", "C"), nfolds = 10, foldid = NULL, alignment = c("lambda", "fraction"), grouped = TRUE, keep = FALSE, parallel = FALSE, gamma = c(0, 0.25, 0.5, 0.75, 1), relax = FALSE, trace.it = 0, ...) } \arguments{ \item{x}{\code{x} matrix as in \code{glmnet}.} \item{y}{response \code{y} as in \code{glmnet}.} \item{weights}{Observation weights; defaults to 1 per observation} \item{offset}{Offset vector (matrix) as in \code{glmnet}} \item{lambda}{Optional user-supplied lambda sequence; default is \code{NULL}, and \code{glmnet} chooses its own sequence} \item{type.measure}{loss to use for cross-validation. Currently five options, not all available for all models. The default is \code{type.measure="deviance"}, which uses squared-error for gaussian models (a.k.a \code{type.measure="mse"} there), deviance for logistic and poisson regression, and partial-likelihood for the Cox model. \code{type.measure="class"} applies to binomial and multinomial logistic regression only, and gives misclassification error. \code{type.measure="auc"} is for two-class logistic regression only, and gives area under the ROC curve. \code{type.measure="mse"} or \code{type.measure="mae"} (mean absolute error) can be used by all models except the \code{"cox"}; they measure the deviation from the fitted mean to the response. \code{type.measure="C"} is Harrel's concordance measure, only available for \code{cox} models.} \item{nfolds}{number of folds - default is 10. Although \code{nfolds} can be as large as the sample size (leave-one-out CV), it is not recommended for large datasets. Smallest value allowable is \code{nfolds=3}} \item{foldid}{an optional vector of values between 1 and \code{nfold} identifying what fold each observation is in. If supplied, \code{nfold} can be missing.} \item{alignment}{This is an experimental argument, designed to fix the problems users were having with CV, with possible values \code{"lambda"} (the default) else \code{"fraction"}. With \code{"lambda"} the \code{lambda} values from the master fit (on all the data) are used to line up the predictions from each of the folds. In some cases this can give strange values, since the effective \code{lambda} values in each fold could be quite different. With \code{"fraction"} we line up the predictions in each fold according to the fraction of progress along the regularization. If in the call a \code{lambda} argument is also provided, \code{alignment="fraction"} is ignored (with a warning).} \item{grouped}{This is an experimental argument, with default \code{TRUE}, and can be ignored by most users. For all models except the \code{"cox"}, this refers to computing \code{nfolds} separate statistics, and then using their mean and estimated standard error to describe the CV curve. If \code{grouped=FALSE}, an error matrix is built up at the observation level from the predictions from the \code{nfold} fits, and then summarized (does not apply to \code{type.measure="auc"}). For the \code{"cox"} family, \code{grouped=TRUE} obtains the CV partial likelihood for the Kth fold by \emph{subtraction}; by subtracting the log partial likelihood evaluated on the full dataset from that evaluated on the on the (K-1)/K dataset. This makes more efficient use of risk sets. With \code{grouped=FALSE} the log partial likelihood is computed only on the Kth fold} \item{keep}{If \code{keep=TRUE}, a \emph{prevalidated} array is returned containing fitted values for each observation and each value of \code{lambda}. This means these fits are computed with this observation and the rest of its fold omitted. The \code{folid} vector is also returned. Default is keep=FALSE. If \code{relax=TRUE}, then a list of such arrays is returned, one for each value of 'gamma'. Note: if the value 'gamma=1' is omitted, this case is included in the list since it corresponds to the original 'glmnet' fit.} \item{parallel}{If \code{TRUE}, use parallel \code{foreach} to fit each fold. Must register parallel before hand, such as \code{doMC} or others. See the example below.} \item{gamma}{The values of the parameter for mixing the relaxed fit with the regularized fit, between 0 and 1; default is \code{gamma = c(0, 0.25, 0.5, 0.75, 1)}} \item{relax}{If \code{TRUE}, then CV is done with respect to the mixing parameter \code{gamma} as well as \code{lambda}. Default is \code{relax=FALSE}} \item{trace.it}{If \code{trace.it=1}, then progress bars are displayed; useful for big models that take a long time to fit. Limited tracing if \code{parallel=TRUE}} \item{\dots}{Other arguments that can be passed to \code{glmnet}} } \value{ an object of class \code{"cv.glmnet"} is returned, which is a list with the ingredients of the cross-validation fit. If the object was created with \code{relax=TRUE} then this class has a prefix class of \code{"cv.relaxed"}. \item{lambda}{the values of \code{lambda} used in the fits.} \item{cvm}{The mean cross-validated error - a vector of length \code{length(lambda)}.} \item{cvsd}{estimate of standard error of \code{cvm}.} \item{cvup}{upper curve = \code{cvm+cvsd}.} \item{cvlo}{lower curve = \code{cvm-cvsd}.} \item{nzero}{number of non-zero coefficients at each \code{lambda}.} \item{name}{a text string indicating type of measure (for plotting purposes).} \item{glmnet.fit}{a fitted glmnet object for the full data.} \item{lambda.min}{value of \code{lambda} that gives minimum \code{cvm}.} \item{lambda.1se}{largest value of \code{lambda} such that error is within 1 standard error of the minimum.} \item{fit.preval}{if \code{keep=TRUE}, this is the array of prevalidated fits. Some entries can be \code{NA}, if that and subsequent values of \code{lambda} are not reached for that fold} \item{foldid}{if \code{keep=TRUE}, the fold assignments used} \item{relaxed}{if \code{relax=TRUE}, this additional item has the CV info for each of the mixed fits. In particular it also selects \code{lambda, gamma} pairs corresponding to the 1SE rule, as well as the minimum error.} } \description{ Does k-fold cross-validation for glmnet, produces a plot, and returns a value for \code{lambda} (and \code{gamma} if \code{relax=TRUE}) } \details{ The function runs \code{glmnet} \code{nfolds}+1 times; the first to get the \code{lambda} sequence, and then the remainder to compute the fit with each of the folds omitted. The error is accumulated, and the average error and standard deviation over the folds is computed. Note that \code{cv.glmnet} does NOT search for values for \code{alpha}. A specific value should be supplied, else \code{alpha=1} is assumed by default. If users would like to cross-validate \code{alpha} as well, they should call \code{cv.glmnet} with a pre-computed vector \code{foldid}, and then use this same fold vector in separate calls to \code{cv.glmnet} with different values of \code{alpha}. Note also that the results of \code{cv.glmnet} are random, since the folds are selected at random. Users can reduce this randomness by running \code{cv.glmnet} many times, and averaging the error curves. If \code{relax=TRUE} then the values of \code{gamma} are used to mix the fits. If \eqn{\eta} is the fit for lasso/elastic net, and \eqn{\eta_R} is the relaxed fit (with unpenalized coefficients), then a relaxed fit mixed by \eqn{\gamma} is \deqn{\eta(\gamma)=(1-\gamma)\eta_R+\gamma\eta}. There is practically no extra cost for having a lot of values for \code{gamma}. However, 5 seems sufficient for most purposes. CV then selects both \code{gamma} and \code{lambda}. } \examples{ set.seed(1010) n = 1000 p = 100 nzc = trunc(p/10) x = matrix(rnorm(n * p), n, p) beta = rnorm(nzc) fx = x[, seq(nzc)] \%*\% beta eps = rnorm(n) * 5 y = drop(fx + eps) px = exp(fx) px = px/(1 + px) ly = rbinom(n = length(px), prob = px, size = 1) set.seed(1011) cvob1 = cv.glmnet(x, y) plot(cvob1) coef(cvob1) predict(cvob1, newx = x[1:5, ], s = "lambda.min") title("Gaussian Family", line = 2.5) set.seed(1011) cvob1a = cv.glmnet(x, y, type.measure = "mae") plot(cvob1a) title("Gaussian Family", line = 2.5) set.seed(1011) par(mfrow = c(2, 2), mar = c(4.5, 4.5, 4, 1)) cvob2 = cv.glmnet(x, ly, family = "binomial") plot(cvob2) title("Binomial Family", line = 2.5) frame() set.seed(1011) cvob3 = cv.glmnet(x, ly, family = "binomial", type.measure = "class") plot(cvob3) title("Binomial Family", line = 2.5) \dontrun{ cvob1r = cv.glmnet(x, y, relax = TRUE) plot(cvob1r) predict(cvob1r, newx = x[, 1:5]) set.seed(1011) cvob3a = cv.glmnet(x, ly, family = "binomial", type.measure = "auc") plot(cvob3a) title("Binomial Family", line = 2.5) set.seed(1011) mu = exp(fx/10) y = rpois(n, mu) cvob4 = cv.glmnet(x, y, family = "poisson") plot(cvob4) title("Poisson Family", line = 2.5) # Multinomial n = 500 p = 30 nzc = trunc(p/10) x = matrix(rnorm(n * p), n, p) beta3 = matrix(rnorm(30), 10, 3) beta3 = rbind(beta3, matrix(0, p - 10, 3)) f3 = x \%*\% beta3 p3 = exp(f3) p3 = p3/apply(p3, 1, sum) g3 = glmnet:::rmult(p3) set.seed(10101) cvfit = cv.glmnet(x, g3, family = "multinomial") plot(cvfit) title("Multinomial Family", line = 2.5) # Cox beta = rnorm(nzc) fx = x[, seq(nzc)] \%*\% beta/3 hx = exp(fx) ty = rexp(n, hx) tcens = rbinom(n = n, prob = 0.3, size = 1) # censoring indicator y = cbind(time = ty, status = 1 - tcens) # y=Surv(ty,1-tcens) with library(survival) foldid = sample(rep(seq(10), length = n)) fit1_cv = cv.glmnet(x, y, family = "cox", foldid = foldid) plot(fit1_cv) title("Cox Family", line = 2.5) # Parallel require(doMC) registerDoMC(cores = 4) x = matrix(rnorm(1e+05 * 100), 1e+05, 100) y = rnorm(1e+05) system.time(cv.glmnet(x, y)) system.time(cv.glmnet(x, y, parallel = TRUE)) } } \references{ Friedman, J., Hastie, T. and Tibshirani, R. (2008) \emph{Regularization Paths for Generalized Linear Models via Coordinate Descent}, \url{https://web.stanford.edu/~hastie/Papers/glmnet.pdf}\cr \emph{Journal of Statistical Software, Vol. 33(1), 1-22 Feb 2010}\cr \url{https://www.jstatsoft.org/v33/i01/}\cr Simon, N., Friedman, J., Hastie, T., Tibshirani, R. (2011) \emph{Regularization Paths for Cox's Proportional Hazards Model via Coordinate Descent, Journal of Statistical Software, Vol. 39(5) 1-13}\cr \url{https://www.jstatsoft.org/v39/i05/} } \seealso{ \code{glmnet} and \code{plot}, \code{predict}, and \code{coef} methods for \code{"cv.glmnet"} and \code{"cv.relaxed"} objects. } \author{ Jerome Friedman, Trevor Hastie and Rob Tibshirani\cr Noah Simon helped develop the 'coxnet' function.\cr Jeffrey Wong and B. Narasimhan helped with the parallel option\cr Maintainer: Trevor Hastie \email{hastie@stanford.edu} } \keyword{models} \keyword{regression} glmnet/man/plot.cv.glmnet.Rd0000644000176200001440000000402013556622666015471 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot.cv.glmnet.R, R/plot.cv.relaxed.R \name{plot.cv.glmnet} \alias{plot.cv.glmnet} \alias{plot.cv.relaxed} \title{plot the cross-validation curve produced by cv.glmnet} \usage{ \method{plot}{cv.glmnet}(x, sign.lambda = 1, ...) \method{plot}{cv.relaxed}(x, se.bands = TRUE, ...) } \arguments{ \item{x}{fitted \code{"cv.glmnet"} object} \item{sign.lambda}{Either plot against \code{log(lambda)} (default) or its negative if \code{sign.lambda=-1}.} \item{\dots}{Other graphical parameters to plot} \item{se.bands}{Should shading be produced to show standard-error bands; default is \code{TRUE}} } \description{ Plots the cross-validation curve, and upper and lower standard deviation curves, as a function of the \code{lambda} values used. If the object has class \code{"cv.relaxed"} a different plot is produced, showing both \code{lambda} and \code{gamma} } \details{ A plot is produced, and nothing is returned. } \examples{ set.seed(1010) n = 1000 p = 100 nzc = trunc(p/10) x = matrix(rnorm(n * p), n, p) beta = rnorm(nzc) fx = (x[, seq(nzc)] \%*\% beta) eps = rnorm(n) * 5 y = drop(fx + eps) px = exp(fx) px = px/(1 + px) ly = rbinom(n = length(px), prob = px, size = 1) cvob1 = cv.glmnet(x, y) plot(cvob1) title("Gaussian Family", line = 2.5) cvob1r = cv.glmnet(x, y, relax = TRUE) plot(cvob1r) frame() set.seed(1011) par(mfrow = c(2, 2), mar = c(4.5, 4.5, 4, 1)) cvob2 = cv.glmnet(x, ly, family = "binomial") plot(cvob2) title("Binomial Family", line = 2.5) ## set.seed(1011) ## cvob3 = cv.glmnet(x, ly, family = "binomial", type = "class") ## plot(cvob3) ## title("Binomial Family", line = 2.5) } \references{ Friedman, J., Hastie, T. and Tibshirani, R. (2008) \emph{Regularization Paths for Generalized Linear Models via Coordinate Descent} } \seealso{ \code{glmnet} and \code{cv.glmnet}. } \author{ Jerome Friedman, Trevor Hastie and Rob Tibshirani\cr Maintainer: Trevor Hastie \href{mailto:hastie@stanford.edu}{hastie@stanford.edu} } \keyword{models} \keyword{regression} glmnet/man/deviance.glmnet.Rd0000644000176200001440000000305513553366407015664 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/deviance.glmnet.R \name{deviance.glmnet} \alias{deviance.glmnet} \title{Extract the deviance from a glmnet object} \usage{ \method{deviance}{glmnet}(object, ...) } \arguments{ \item{object}{fitted glmnet object} \item{\dots}{additional print arguments} } \value{ (1-dev.ratio)*nulldev } \description{ Compute the deviance sequence from the glmnet object } \details{ A glmnet object has components \code{dev.ratio} and \code{nulldev}. The former is the fraction of (null) deviance explained. The deviance calculations incorporate weights if present in the model. The deviance is defined to be 2*(loglike_sat - loglike), where loglike_sat is the log-likelihood for the saturated model (a model with a free parameter per observation). Null deviance is defined to be 2*(loglike_sat -loglike(Null)); The NULL model refers to the intercept model, except for the Cox, where it is the 0 model. Hence dev.ratio=1-deviance/nulldev, and this \code{deviance} method returns (1-dev.ratio)*nulldev. } \examples{ x = matrix(rnorm(100 * 20), 100, 20) y = rnorm(100) fit1 = glmnet(x, y) deviance(fit1) } \references{ Friedman, J., Hastie, T. and Tibshirani, R. (2008) \emph{Regularization Paths for Generalized Linear Models via Coordinate Descent} } \seealso{ \code{glmnet}, \code{predict}, \code{print}, and \code{coef} methods. } \author{ Jerome Friedman, Trevor Hastie and Rob Tibshirani\cr Maintainer: Trevor Hastie \href{mailto:hastie@stanford.edu}{hastie@stanford.edu} } \keyword{models} \keyword{regression} glmnet/man/rmult.Rd0000644000176200001440000000117613554367224013765 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rmult.R \name{rmult} \alias{rmult} \title{Generate multinomial samples from a probability matrix} \usage{ rmult(p) } \arguments{ \item{p}{matrix of probabilities, with number of columns the number of classes} } \value{ a vector of class memberships } \description{ Generate multinomial samples } \details{ Simple function that calls the \code{rmultinom} function. It generates a class label for each row of its input matrix of class probabilities. } \author{ Trevor Hastie \cr Maintainer: Trevor Hastie \href{mailto:hastie@stanford.edu}{hastie@stanford.edu} } glmnet/man/print.cv.glmnet.Rd0000644000176200001440000000315713553366407015654 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/print.cv.glmnet.R \name{print.cv.glmnet} \alias{print.cv.glmnet} \alias{print.cv.relaxed} \title{print a cross-validated glmnet object} \usage{ \method{print}{cv.glmnet}(x, digits = max(3, getOption("digits") - 3), ...) } \arguments{ \item{x}{fitted 'cv.glmnet' object} \item{digits}{significant digits in printout} \item{\dots}{additional print arguments} } \description{ Print a summary of the results of cross-validation for a glmnet model. } \details{ A summary of the cross-validated fit is produced, slightly different for a 'cv.relaxed' object than for a 'cv.glmnet' object. Note that a 'cv.relaxed' object inherits from class 'cv.glmnet', so by directly invoking \code{print.cv.glmnet(object)} will print the summary as if \code{relax=TRUE} had not been used. } \examples{ x = matrix(rnorm(100 * 20), 100, 20) y = rnorm(100) fit1 = cv.glmnet(x, y) print(fit1) fit1r = cv.glmnet(x, y, relax = TRUE) print(fit1r) ## print.cv.glmnet(fit1r) ## CHECK WITH TREVOR } \references{ Friedman, J., Hastie, T. and Tibshirani, R. (2008) \emph{Regularization Paths for Generalized Linear Models via Coordinate Descent}\cr \url{https://arxiv.org/abs/1707.08692}\cr Hastie, T., Tibshirani, Robert, Tibshirani, Ryan (2019) \emph{Extended Comparisons of Best Subset Selection, Forward Stepwise Selection, and the Lasso} } \seealso{ \code{glmnet}, \code{predict} and \code{coef} methods. } \author{ Jerome Friedman, Trevor Hastie and Rob Tibshirani\cr Maintainer: Trevor Hastie \href{mailto:hastie@stanford.edu}{hastie@stanford.edu} } \keyword{models} \keyword{regression} glmnet/man/coxgrad.Rd0000644000176200001440000000207113553705340014236 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/coxgrad.R \name{coxgrad} \alias{coxgrad} \title{compute gradient for cox model} \usage{ coxgrad(f, time, d, w, eps = 1e-05) } \arguments{ \item{f}{fit vector} \item{time}{time vector (can have ties)} \item{d}{death/censoring indicator 1/0} \item{w}{observation weights (default equal)} \item{eps}{(default 0.00001) Breaks ties between death and censoring by making death times \code{eps} earlier} } \value{ a single gradient vector the same length as \code{f} } \description{ Compute the gradient of the partial likelihood at a particular fit } \details{ Compute a gradient vector at the fitted vector for the log partial likelihood. This is like a residual vector, and useful for manual screening of predictors for \code{glmnet} in applications where \code{p} is very large (as in GWAS). Uses the Breslow approach to ties } \seealso{ \code{coxnet.deviance} } \author{ Trevor Hastie\cr Maintainer: Trevor Hastie \href{mailto:hastie@stanford.edu}{hastie@stanford.edu} } \keyword{Cox} \keyword{model} glmnet/man/assess.glmnet.Rd0000644000176200001440000001023013573535152015375 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/assess.glmnet.R, R/confusion.glmnet.R, % R/roc.glmnet.R \name{assess.glmnet} \alias{assess.glmnet} \alias{confusion.glmnet} \alias{roc.glmnet} \title{assess performace of a 'glmnet' object using test data.} \usage{ assess.glmnet(object, newx = NULL, newy, weights = NULL, family = c("gaussian", "binomial", "poisson", "multinomial", "cox", "mgaussian"), ...) confusion.glmnet(object, newx = NULL, newy, family = c("binomial", "multinomial"), ...) roc.glmnet(object, newx = NULL, newy, ...) } \arguments{ \item{object}{Fitted \code{"glmnet"} or \code{"cv.glmnet"}, \code{"relaxed"} or \code{"cv.relaxed"} object, or a matrix of predictions (for \code{roc.glmnet} or \code{assess.glmnet}). For \code{roc.glmnet} the model must be a 'binomial', and for \code{confusion.glmnet} must be either 'binomial' or 'multinomial'} \item{newx}{If predictions are to made, these are the 'x' values. Required for \code{confusion.glmnet}} \item{newy}{required argument for all functions; the new response values} \item{weights}{For observation weights for the test observations} \item{family}{The family of the model, in case predictions are passed in as 'object'} \item{...}{additional arguments to \code{predict.glmnet} when "object" is a "glmnet" fit, and predictions must be made to produce the statistics.} } \value{ \code{assess.glmnet} produces a list of vectors of measures. \code{roc.glmnet} a list of 'roc' two-column matrices, and \code{confusion.glmnet} a list of tables. If a single prediction is provided, or predictions are made from a CV object, the latter two drop the list status and produce a single matrix or table. } \description{ Given a test set, produce summary performance measures for the glmnet model(s) } \details{ \code{assess.glmnet} produces all the different performance measures provided by \code{cv.glmnet} for each of the families. A single vector, or a matrix of predictions can be provided, or fitted model objects or CV objects. In the case when the predictions are still to be made, the \code{...} arguments allow, for example, 'offsets' and other prediction parameters such as values for 'gamma' for 'relaxed' fits. \code{roc.glmnet} produces for a single vector a two column matrix with columns TPR and FPR (true positive rate and false positive rate). This object can be plotted to produce an ROC curve. If more than one predictions are called for, then a list of such matrices is produced. \code{confusion.glmnet} produces a confusion matrix tabulating the classification results. Again, a single table or a list, with a print method. } \examples{ data(QuickStartExample) set.seed(11) train = sample(seq(length(y)),70,replace=FALSE) fit1 = glmnet(x[train,], y[train]) assess.glmnet(fit1, newx = x[-train,], newy = y[-train]) preds = predict(fit1, newx = x[-train, ], s = c(1, 0.25)) assess.glmnet(preds, newy = y[-train], family = "gaussian") fit1c = cv.glmnet(x, y, keep = TRUE) fit1a = assess.glmnet(fit1c$fit.preval, newy=y,family="gaussian") plot(fit1c$lambda, log="x",fit1a$mae,xlab="Log Lambda",ylab="Mean Absolute Error") abline(v=fit1c$lambda.min, lty=2, col="red") data(BinomialExample) fit2 = glmnet(x[train,], y[train], family = "binomial") assess.glmnet(fit2,newx = x[-train,], newy=y[-train], s=0.1) plot(roc.glmnet(fit2, newx = x[-train,], newy=y[-train])[[10]]) fit2c = cv.glmnet(x, y, family = "binomial", keep=TRUE) idmin = match(fit2c$lambda.min, fit2c$lambda) plot(roc.glmnet(fit2c$fit.preval, newy = y)[[idmin]]) data(MultinomialExample) set.seed(103) train = sample(seq(length(y)),100,replace=FALSE) fit3 = glmnet(x[train,], y[train], family = "multinomial") confusion.glmnet(fit3, newx = x[-train, ], newy = y[-train], s = 0.01) fit3c = cv.glmnet(x, y, family = "multinomial", type.measure="class", keep=TRUE) idmin = match(fit3c$lambda.min, fit3c$lambda) confusion.glmnet(fit3c$fit.preval, newy = y, family="multinomial")[[idmin]] } \seealso{ \code{cv.glmnet}, \code{glmnet.measures} and \code{vignette("relax",package="glmnet")} } \author{ Trevor Hastie and Rob Tibshirani\cr Maintainer: Trevor Hastie \href{mailto:hastie@stanford.edu}{hastie@stanford.edu} } \keyword{classification} \keyword{models} glmnet/man/glmnet-internal.Rd0000644000176200001440000000356313554366360015724 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/glmnet-package.R \name{glmnet-internal} \alias{glmnet-internal} \alias{auc} \alias{assess.coxnet} \alias{auc.mat} \alias{cvtype} \alias{cvstats} \alias{cvcompute} \alias{getcoef} \alias{getcoef.multinomial} \alias{response.coxnet} \alias{fix.lam} \alias{error.bars} \alias{getmin} \alias{elnet} \alias{mrelnet} \alias{lognet} \alias{fishnet} \alias{coefnorm} \alias{coxnet} \alias{cv.lognet} \alias{cv.elnet} \alias{cv.multnet} \alias{cv.mrelnet} \alias{cv.coxnet} \alias{cv.fishnet} \alias{cv.glmnet.raw} \alias{cv.relaxed.raw} \alias{blend.relaxed} \alias{checkgamma.relax} \alias{buildPredmat} \alias{buildPredmat.mrelnetlist} \alias{buildPredmat.multnetlist} \alias{buildPredmat.lognetlist} \alias{buildPredmat.array} \alias{buildPredmat.coxnetlist} \alias{buildPredmat.default} \alias{lambda.interp} \alias{nonzeroCoef} \alias{glmnet_softmax} \alias{getOptcv.glmnet} \alias{getOptcv.relaxed} \alias{jerr} \alias{jerr.elnet} \alias{jerr.lognet} \alias{jerr.fishnet} \alias{jerr.coxnet} \alias{jerr.mrelnet} \alias{plotCoef} \alias{zeromat} \alias{na.mean} \alias{check_dots} \alias{na_sparse_fix} \alias{prepareX} \title{Internal glmnet functions} \description{ These are not intended for use by users. \code{lambda.interp} does linear interpolation of the lambdas to obtain a prediction at a new point s. \code{glmnet_softmax} does the classification for multinomial models. \code{nonzeroCoef} determines in an efficient manner which variables are nonzero in each fit. \code{jerr} prints out error messages from the fortran. \code{plotCoef} is called by the \code{plot} method for \code{glmnet} objects. \code{check_dots} is used in \code{coef} and \code{predict} with argument \code{exact=TRUE}, to make sure user supplies original data used to fit the \code{"glmnet"} object. } \author{ Trevor Hastie } \keyword{internal} glmnet/man/na.replace.Rd0000644000176200001440000000304013553366407014623 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/makeX.R \name{na.replace} \alias{na.replace} \title{Replace the missing entries in a matrix columnwise with the entries in a supplied vector} \usage{ na.replace(x, m = rowSums(x, na.rm = TRUE)) } \arguments{ \item{x}{A matrix with potentially missing values, and also potentially in sparse matrix format (i.e. inherits from "sparseMatrix")} \item{m}{Optional argument. A vector of values used to replace the missing entries, columnwise. If missing, the column means of 'x' are used} } \value{ A version of 'x' is returned with the missing values replaced. } \description{ Missing entries in any given column of the matrix are replaced by the column means or the values in a supplied vector. } \details{ This is a simple imputation scheme. This function is called by \code{makeX} if the \code{na.impute=TRUE} option is used, but of course can be used on its own. If 'x' is sparse, the result is sparse, and the replacements are done so as to maintain sparsity. } \examples{ set.seed(101) ### Single data frame X = matrix(rnorm(20), 10, 2) X[3, 1] = NA X[5, 2] = NA X3 = sample(letters[1:3], 10, replace = TRUE) X3[6] = NA X4 = sample(LETTERS[1:3], 10, replace = TRUE) X4[9] = NA dfn = data.frame(X, X3, X4) x = makeX(dfn) m = rowSums(x, na.rm = TRUE) na.replace(x, m) x = makeX(dfn, sparse = TRUE) na.replace(x, m) } \seealso{ \code{makeX} and \code{glmnet} } \author{ Trevor Hastie\cr Maintainer: Trevor Hastie \href{mailto:hastie@stanford.edu}{hastie@stanford.edu} } \keyword{models} glmnet/man/Cindex.Rd0000644000176200001440000000300213553366407014023 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Cindex.R \name{Cindex} \alias{Cindex} \title{compute C index for a Cox model} \usage{ Cindex(pred, y, weights = rep(1, nrow(y))) } \arguments{ \item{pred}{Predictions from a \code{"coxnet"} object} \item{y}{a survival response object - a matrix with two columns "time" and "status"; see documentation for "glmnet"} \item{weights}{optional observation weights} } \description{ Computes Harrel's C index for predictions from a \code{"coxnet"} object. } \details{ Computes the concordance index, taking into account censoring. } \examples{ set.seed(10101) N = 1000 p = 30 nzc = p/3 x = matrix(rnorm(N * p), N, p) beta = rnorm(nzc) fx = x[, seq(nzc)] \%*\% beta/3 hx = exp(fx) ty = rexp(N, hx) tcens = rbinom(n = N, prob = 0.3, size = 1) # censoring indicator y = cbind(time = ty, status = 1 - tcens) # y=Surv(ty,1-tcens) with library(survival) fit = glmnet(x, y, family = "cox") pred = predict(fit, newx = x) Cindex(pred, y) cv.glmnet(x, y, family = "cox", type.measure = "C") } \references{ Harrel Jr, F. E. and Lee, K. L. and Mark, D. B. (1996) \emph{Tutorial in biostatistics: multivariable prognostic models: issues in developing models, evaluating assumptions and adequacy, and measuring and reducing error}, Statistics in Medicine, 15, pages 361--387. } \seealso{ \code{cv.glmnet} } \author{ Rob Tibshirani\cr Maintainer: Trevor Hastie \href{mailto:hastie@stanford.edu}{hastie@stanford.edu} } \keyword{Cox} \keyword{cross-validation} \keyword{models} glmnet/man/coxnet.deviance.Rd0000644000176200001440000000205313553705340015664 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/coxnet.deviance.R \name{coxnet.deviance} \alias{coxnet.deviance} \title{compute deviance for cox model output} \usage{ coxnet.deviance(pred = NULL, y, x = 0, offset = NULL, weights = NULL, beta = NULL) } \arguments{ \item{pred}{matrix of predictions} \item{y}{a survival response matrix, as produced by \code{Surv}} \item{x}{optional \code{x} matrix, if \code{pred} is \code{NULL}} \item{offset}{optional offset} \item{weights}{optional observation weights} \item{beta}{optional coefficient vector/matrix, supplied if \code{pred=NULL}} } \value{ a single or vector of deviances } \description{ Given a fit or coefficients, compute the deciance (-2 log partial likelihood) for right-censored survival data } \details{ \code{coxnet.deviance} computes the deviance for a single prediction, or a matrix of predictions } \seealso{ \code{coxgrad} } \author{ Trevor Hastie\cr Maintainer: Trevor Hastie \href{mailto:hastie@stanford.edu}{hastie@stanford.edu} } \keyword{Cox} \keyword{model} glmnet/DESCRIPTION0000644000176200001440000000303313574220222013244 0ustar liggesusersPackage: glmnet Type: Package Title: Lasso and Elastic-Net Regularized Generalized Linear Models Version: 3.0-2 Date: 2019-12-09 Authors@R: c(person("Jerome", "Friedman", role=c("aut")), person("Trevor", "Hastie", role=c("aut", "cre"), email = "hastie@stanford.edu"), person("Rob", "Tibshirani", role=c("aut")), person("Balasubramanian", "Narasimhan", role=c("aut")), person("Noah", "Simon", role=c("aut")), person("Junyang", "Qian", role=c("ctb"))) Depends: R (>= 3.6.0), Matrix (>= 1.0-6) Imports: methods, utils, foreach, shape Suggests: survival, knitr, lars Description: Extremely efficient procedures for fitting the entire lasso or elastic-net regularization path for linear regression, logistic and multinomial regression models, Poisson regression and the Cox model. Two recent additions are the multiple-response Gaussian, and the grouped multinomial regression. The algorithm uses cyclical coordinate descent in a path-wise fashion, as described in the papers listed in the URL below. License: GPL-2 VignetteBuilder: knitr Encoding: UTF-8 URL: https://glmnet.stanford.edu, https://dx.doi.org/10.18637/jss.v033.i01, https://dx.doi.org/10.18637/jss.v039.i05 RoxygenNote: 6.1.1 NeedsCompilation: yes Packaged: 2019-12-11 01:55:13 UTC; hastie Author: Jerome Friedman [aut], Trevor Hastie [aut, cre], Rob Tibshirani [aut], Balasubramanian Narasimhan [aut], Noah Simon [aut], Junyang Qian [ctb] Maintainer: Trevor Hastie Repository: CRAN Date/Publication: 2019-12-11 17:00:02 UTC glmnet/build/0000755000176200001440000000000013574046177012655 5ustar liggesusersglmnet/build/vignette.rds0000644000176200001440000000041613574046177015215 0ustar liggesusersQMK1~v'o?`7ċ,fIɦz:f*[2/VeE lsYzn:IFwStHLŋQ|p$G.`}?ܭ=[>Ή WMV[ٞya@L3Z0e\Q6/<Őg/)"jxQ*`dOmo}MîÏ`ZYIE:#Al{3glmnet/src/0000755000176200001440000000000013574046201012331 5ustar liggesusersglmnet/src/glmnet_init.c0000644000176200001440000002624713573755070015033 0ustar liggesusers// Automatically generated, editing not advised. #ifndef R_GLMNET_H #define R_GLMNET_H #include #include #include #ifdef ENABLE_NLS #include #define _(String) dgettext ("glmnet", String) #else #define _(String) (String) #endif /* New addition */ extern SEXP storePB(SEXP tpb); static const R_CallMethodDef CallEntries[] = { {"storePB", (DL_FUNC) &storePB, 1}, {NULL, NULL, 0} }; /* End of new addition */ #define FDEF(name) {#name, (DL_FUNC) &F77_SUB(name), sizeof(name ## _t)/sizeof(name ## _t[0]), name ##_t} void F77_SUB(coxnet)( double *parm, int *no, int *ni, double *x, double *y, double *d, double *o, double *w, int *jd, double *vp, double *cl, int *ne, int *nx, int *nlam, double *flmin, double *ulam, double *thr, int *maxit, int *isd, int *lmu, double *ca, int *ia, int *nin, double *dev0, double *fdev, double *alm, int *nlp, int *jerrc ); static R_NativePrimitiveArgType coxnet_t[] = { REALSXP, INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, REALSXP, REALSXP, INTSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP, REALSXP, INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, INTSXP, INTSXP }; void F77_SUB(spelnet)( int *ka, double *parm, int *no, int *ni, double *x, int *ix, int *jx, double *y, double *w, int *jd, double *vp, double *cl, int *ne, int *nx, int *nlam, double *flmin, double *ulam, double *thr, int *isd, int *intr, int *maxit, int *lmu, double *a0, double *ca, int *ia, int *nin, double *rsq, double *alm, int *nlp, int *jerr ); static R_NativePrimitiveArgType spelnet_t[] = { INTSXP, REALSXP, INTSXP, INTSXP, REALSXP, INTSXP, INTSXP, REALSXP, REALSXP, INTSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP, INTSXP, REALSXP, REALSXP, INTSXP, INTSXP, REALSXP, REALSXP, INTSXP, INTSXP }; void F77_SUB(elnet)( int *ka, double *parm, int *no, int *ni, double *x, double *y, double *w, int *jd, double *vp, double *cl, int *ne, int *nx, int *nlam, double *flmin, double *ulam, double *thr, int *isd, int *intr, int *maxit, int *lmu, double *a0, double *ca, int *ia, int *nin, double *rsq, double *alm, int *nlp, int *jerr ); static R_NativePrimitiveArgType elnet_t[] = { INTSXP, REALSXP, INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, INTSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP, INTSXP, REALSXP, REALSXP, INTSXP, INTSXP, REALSXP, REALSXP, INTSXP, INTSXP }; void F77_SUB(fishnet)( double *parm, int *no, int *ni, double *x, double *y, double *g, double *w, int *jd, double *vp, double *cl, int *ne, int *nx, int *nlam, double *flmin, double *ulam, double *thr, int *isd, int *intr, int *maxit, int *lmu, double *a0, double *ca, int *ia, int *nin, double *dev0, double *dev, double *alm, int *nlp, int *jerr ); static R_NativePrimitiveArgType fishnet_t[] = { REALSXP, INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, REALSXP, INTSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP, INTSXP, REALSXP, REALSXP, INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, INTSXP, INTSXP }; void F77_SUB(spfishnet)( double *parm, int *no, int *ni, double *x, int *ix, int *jx, double *y, double *g, double *w, int *jd, double *vp, double *cl, int *ne, int *nx, int *nlam, double *flmin, double *ulam, double *thr, int *isd, int *intr, int *maxit, int *lmu, double *a0, double *ca, int *ia, int *nin, double *dev0, double *dev, double *alm, int *nlp, int *jerr ); static R_NativePrimitiveArgType spfishnet_t[] = { REALSXP, INTSXP, INTSXP, REALSXP, INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, INTSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP, INTSXP, REALSXP, REALSXP, INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, INTSXP, INTSXP }; void F77_SUB(splognet)( double *parm, int *no, int *ni, int *nc, double *x, int *ix, int *jx, double *y, double *g, int *jd, double *vp, double *cl, int *ne, int *nx, int *nlam, double *flmin, double *ulam, double *thr, int *isd, int *intr, int *maxit, int *kopt, int *lmu, double *a0, double *ca, int *ia, int *nin, double *dev0, double *dev, double *alm, int *nlp, int *jerr ); static R_NativePrimitiveArgType splognet_t[] = { REALSXP, INTSXP, INTSXP, INTSXP, REALSXP, INTSXP, INTSXP, REALSXP, REALSXP, INTSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP, INTSXP, INTSXP, REALSXP, REALSXP, INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, INTSXP, INTSXP }; void F77_SUB(lognet)( double *parm, int *no, int *ni, int *nc, double *x, double *y, double *g, int *jd, double *vp, double *cl, int *ne, int *nx, int *nlam, double *flmin, double *ulam, double *thr, int *isd, int *intr, int *maxit, int *kopt, int *lmu, double *a0, double *ca, int *ia, int *nin, double *dev0, double *dev, double *alm, int *nlp, int *jerr ); static R_NativePrimitiveArgType lognet_t[] = { REALSXP, INTSXP, INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, INTSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP, INTSXP, INTSXP, REALSXP, REALSXP, INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, INTSXP, INTSXP }; void F77_SUB(multspelnet)( double *parm, int *no, int *ni, int *nr, double *x, int *ix, int *jx, double *y, double *w, int *jd, double *vp, double *cl, int *ne, int *nx, int *nlam, double *flmin, double *ulam, double *thr, int *isd, int *jsd, int *intr, int *maxit, int *lmu, double *a0, double *ca, int *ia, int *nin, double *rsq, double *alm, int *nlp, int *jerr ); static R_NativePrimitiveArgType multspelnet_t[] = { REALSXP, INTSXP, INTSXP, INTSXP, REALSXP, INTSXP, INTSXP, REALSXP, REALSXP, INTSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP, INTSXP, INTSXP, REALSXP, REALSXP, INTSXP, INTSXP, REALSXP, REALSXP, INTSXP, INTSXP }; void F77_SUB(multelnet)( double *parm, int *no, int *ni, int *nr, double *x, double *y, double *w, int *jd, double *vp, double *cl, int *ne, int *nx, int *nlam, double *flmin, double *ulam, double *thr, int *isd, int *jsd, int *intr, int *maxit, int *lmu, double *a0, double *ca, int *ia, int *nin, double *rsq, double *alm, int *nlp, int *jerr ); static R_NativePrimitiveArgType multelnet_t[] = { REALSXP, INTSXP, INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, INTSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP, INTSXP, INTSXP, REALSXP, REALSXP, INTSXP, INTSXP, REALSXP, REALSXP, INTSXP, INTSXP }; void F77_SUB(loglike)( int *no, int *ni, double *x, double *y, double *d, double *g, double *w, int *nlam, double *a, double *flog, int *jerr ); static R_NativePrimitiveArgType loglike_t[] = { INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, REALSXP, REALSXP, INTSXP, REALSXP, REALSXP, INTSXP }; void F77_SUB(get_int_parms)( double *sml, double *eps, double *big, int *mnlam, double *rsqmax, double *pmin, double *exmx, int *itrace ); static R_NativePrimitiveArgType get_int_parms_t[] = { REALSXP, REALSXP, REALSXP, INTSXP, REALSXP, REALSXP, REALSXP, INTSXP }; void F77_SUB(chg_fract_dev)( double *fdev ); static R_NativePrimitiveArgType chg_fract_dev_t[] = { REALSXP }; void F77_SUB(chg_dev_max)( double *devmax ); static R_NativePrimitiveArgType chg_dev_max_t[] = { REALSXP }; void F77_SUB(chg_min_flmin)( double *eps ); static R_NativePrimitiveArgType chg_min_flmin_t[] = { REALSXP }; void F77_SUB(chg_big)( double *big ); static R_NativePrimitiveArgType chg_big_t[] = { REALSXP }; void F77_SUB(chg_min_lambdas)( int *mnlam ); static R_NativePrimitiveArgType chg_min_lambdas_t[] = { INTSXP }; void F77_SUB(chg_min_null_prob)( double *pmin ); static R_NativePrimitiveArgType chg_min_null_prob_t[] = { REALSXP }; void F77_SUB(chg_max_exp)( double *exmx ); static R_NativePrimitiveArgType chg_max_exp_t[] = { REALSXP }; void F77_SUB(chg_itrace)( int *itrace ); static R_NativePrimitiveArgType chg_itrace_t[] = { INTSXP }; void F77_SUB(chg_bnorm)( double *prec, int *mxit ); static R_NativePrimitiveArgType chg_bnorm_t[] = { REALSXP, INTSXP }; void F77_SUB(get_bnorm)( double *arg, int *irg ); static R_NativePrimitiveArgType get_bnorm_t[] = { REALSXP, INTSXP }; static R_FortranMethodDef fMethods[] = { FDEF(coxnet) , FDEF(spelnet) , FDEF(elnet) , FDEF(fishnet) , FDEF(spfishnet) , FDEF(splognet) , FDEF(lognet) , FDEF(multspelnet) , FDEF(multelnet) , FDEF(loglike) , FDEF(get_int_parms) , FDEF(chg_fract_dev) , FDEF(chg_dev_max) , FDEF(chg_min_flmin) , FDEF(chg_big) , FDEF(chg_min_lambdas) , FDEF(chg_min_null_prob) , FDEF(chg_max_exp) , FDEF(chg_itrace) , FDEF(chg_bnorm) , FDEF(get_bnorm) , {NULL, NULL, 0} }; void R_init_glmnet(DllInfo *dll){ R_registerRoutines(dll, NULL, CallEntries, fMethods, NULL); R_useDynamicSymbols(dll, FALSE); } #endif glmnet/src/pb.c0000644000176200001440000000120313573515432013100 0ustar liggesusers#include #include /* The progress bar */ static SEXP pb; /* Save the progress bar */ SEXP storePB(SEXP tpb) { pb = tpb; return(R_NilValue); } /* Set Progress bar to value */ void F77_SUB(setpb)(int *val) { SEXP s, t; /* printf("%d\n", *val); */ t = s = PROTECT(allocList(3)); SET_TYPEOF(s, LANGSXP); SETCAR(t, install("setTxtProgressBar")); t = CDR(t); SETCAR(t, pb); SET_TAG(t, install("pb")); t = CDR(t); SETCAR(t, ScalarInteger(*val)); SET_TAG(t, install("value")); eval(s, R_GetCurrentEnv()); UNPROTECT(1); } /* Nullify progress bar, not really used */ void nullifyPB() { pb = NULL; } glmnet/src/glmnet5dpclean.f0000644000176200001440000173035413542237467015432 0ustar liggesusersc mortran 2.0 (version of 7/04/75 mod 7/4/87 (ajc)) subroutine get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx,itrace *) implicit double precision(a-h,o-z) data sml0,eps0,big0,mnlam0,rsqmax0,pmin0,exmx0,itrace0 /1.0d-5,1. *0d-6,9.9d35,5,0.999,1.0d-9,250.0,0/ sml=sml0 eps=eps0 big=big0 mnlam=mnlam0 rsqmax=rsqmax0 pmin=pmin0 exmx=exmx0 itrace=itrace0 return entry chg_fract_dev(arg) sml0=arg return entry chg_dev_max(arg) rsqmax0=arg return entry chg_min_flmin(arg) eps0=arg return entry chg_big(arg) big0=arg return entry chg_min_lambdas(irg) mnlam0=irg return entry chg_min_null_prob(arg) pmin0=arg return entry chg_max_exp(arg) exmx0=arg return entry chg_itrace(irg) itrace0=irg return end subroutine elnet(ka,parm,no,ni,x,y,w,jd,vp,cl,ne,nx,nlam, flmin,u *lam,thr,isd,intr,maxit, lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) implicit double precision(a-h,o-z) double precision x(no,ni),y(no),w(no),vp(ni),ca(nx,nlam),cl(2,ni) double precision ulam(nlam),a0(nlam),rsq(nlam),alm(nlam) integer jd(*),ia(nx),nin(nlam) double precision, dimension (:), allocatable :: vq; if(maxval(vp) .gt. 0.0)goto 10021 jerr=10000 return 10021 continue allocate(vq(1:ni),stat=jerr) if(jerr.ne.0) return vq=max(0d0,vp) vq=vq*ni/sum(vq) if(ka .ne. 1)goto 10041 call elnetu (parm,no,ni,x,y,w,jd,vq,cl,ne,nx,nlam,flmin,ulam,thr, *isd,intr,maxit, lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) goto 10051 10041 continue call elnetn (parm,no,ni,x,y,w,jd,vq,cl,ne,nx,nlam,flmin,ulam,thr,i *sd,intr,maxit, lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) 10051 continue continue deallocate(vq) return end subroutine elnetu(parm,no,ni,x,y,w,jd,vp,cl,ne,nx,nlam, flmin,ula *m,thr,isd,intr,maxit, lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) implicit double precision(a-h,o-z) double precision x(no,ni),y(no),w(no),vp(ni),ulam(nlam),cl(2,ni) double precision ca(nx,nlam),a0(nlam),rsq(nlam),alm(nlam) integer jd(*),ia(nx),nin(nlam) double precision, dimension (:), allocatable :: xm,xs,g,xv,vlam integer, dimension (:), allocatable :: ju allocate(g(1:ni),stat=jerr) if(jerr.ne.0) return allocate(xm(1:ni),stat=jerr) if(jerr.ne.0) return allocate(xs(1:ni),stat=jerr) if(jerr.ne.0) return allocate(ju(1:ni),stat=jerr) if(jerr.ne.0) return allocate(xv(1:ni),stat=jerr) if(jerr.ne.0) return allocate(vlam(1:nlam),stat=jerr) if(jerr.ne.0) return call chkvars(no,ni,x,ju) if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 if(maxval(ju) .gt. 0)goto 10071 jerr=7777 return 10071 continue call standard(no,ni,x,y,w,isd,intr,ju,g,xm,xs,ym,ys,xv,jerr) if(jerr.ne.0) return cl=cl/ys if(isd .le. 0)goto 10091 do 10101 j=1,ni cl(:,j)=cl(:,j)*xs(j) 10101 continue continue 10091 continue if(flmin.ge.1.0) vlam=ulam/ys call elnet1(parm,ni,ju,vp,cl,g,no,ne,nx,x,nlam,flmin,vlam,thr,maxi *t,xv, lmu,ca,ia,nin,rsq,alm,nlp,jerr) if(jerr.gt.0) return do 10111 k=1,lmu alm(k)=ys*alm(k) nk=nin(k) do 10121 l=1,nk ca(l,k)=ys*ca(l,k)/xs(ia(l)) 10121 continue continue a0(k)=0.0 if(intr.ne.0) a0(k)=ym-dot_product(ca(1:nk,k),xm(ia(1:nk))) 10111 continue continue deallocate(xm,xs,g,ju,xv,vlam) return end subroutine standard(no,ni,x,y,w,isd,intr,ju,g,xm,xs,ym,ys,xv,jerr) implicit double precision(a-h,o-z) double precision x(no,ni),y(no),w(no),g(ni),xm(ni),xs(ni),xv(ni) integer ju(ni) double precision, dimension (:), allocatable :: v allocate(v(1:no),stat=jerr) if(jerr.ne.0) return w=w/sum(w) v=sqrt(w) if(intr .ne. 0)goto 10141 ym=0.0 y=v*y ys=sqrt(dot_product(y,y)-dot_product(v,y)**2) y=y/ys do 10151 j=1,ni if(ju(j).eq.0)goto 10151 xm(j)=0.0 x(:,j)=v*x(:,j) xv(j)=dot_product(x(:,j),x(:,j)) if(isd .eq. 0)goto 10171 xbq=dot_product(v,x(:,j))**2 vc=xv(j)-xbq xs(j)=sqrt(vc) x(:,j)=x(:,j)/xs(j) xv(j)=1.0+xbq/vc goto 10181 10171 continue xs(j)=1.0 10181 continue continue 10151 continue continue goto 10191 10141 continue do 10201 j=1,ni if(ju(j).eq.0)goto 10201 xm(j)=dot_product(w,x(:,j)) x(:,j)=v*(x(:,j)-xm(j)) xv(j)=dot_product(x(:,j),x(:,j)) if(isd.gt.0) xs(j)=sqrt(xv(j)) 10201 continue continue if(isd .ne. 0)goto 10221 xs=1.0 goto 10231 10221 continue do 10241 j=1,ni if(ju(j).eq.0)goto 10241 x(:,j)=x(:,j)/xs(j) 10241 continue continue xv=1.0 10231 continue continue ym=dot_product(w,y) y=v*(y-ym) ys=sqrt(dot_product(y,y)) y=y/ys 10191 continue continue g=0.0 do 10251 j=1,ni if(ju(j).ne.0) g(j)=dot_product(y,x(:,j)) 10251 continue continue deallocate(v) return end subroutine elnet1(beta,ni,ju,vp,cl,g,no,ne,nx,x,nlam,flmin,ulam,th *r,maxit,xv, lmu,ao,ia,kin,rsqo,almo,nlp,jerr) implicit double precision(a-h,o-z) double precision vp(ni),g(ni),x(no,ni),ulam(nlam),ao(nx,nlam) double precision rsqo(nlam),almo(nlam),xv(ni) double precision cl(2,ni) integer ju(ni),ia(nx),kin(nlam) double precision, dimension (:), allocatable :: a,da integer, dimension (:), allocatable :: mm double precision, dimension (:,:), allocatable :: c allocate(c(1:ni,1:nx),stat=jerr) if(jerr.ne.0) return; call get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx,itrace) allocate(a(1:ni),stat=jerr) if(jerr.ne.0) return allocate(mm(1:ni),stat=jerr) if(jerr.ne.0) return allocate(da(1:ni),stat=jerr) if(jerr.ne.0) return bta=beta omb=1.0-bta alm=0.0 alf=1.0 if(flmin .ge. 1.0)goto 10271 eqs=max(eps,flmin) alf=eqs**(1.0/(nlam-1)) 10271 continue rsq=0.0 a=0.0 mm=0 nlp=0 nin=nlp iz=0 mnl=min(mnlam,nlam) do 10281 m=1,nlam if(itrace.ne.0) call setpb(m-1) if(flmin .lt. 1.0)goto 10301 alm=ulam(m) goto 10291 10301 if(m .le. 2)goto 10311 alm=alm*alf goto 10291 10311 if(m .ne. 1)goto 10321 alm=big goto 10331 10321 continue alm=0.0 do 10341 j=1,ni if(ju(j).eq.0)goto 10341 if(vp(j).le.0.0)goto 10341 alm=max(alm,abs(g(j))/vp(j)) 10341 continue continue alm=alf*alm/max(bta,1.0d-3) 10331 continue 10291 continue dem=alm*omb ab=alm*bta rsq0=rsq jz=1 continue 10351 continue if(iz*jz.ne.0) go to 10360 nlp=nlp+1 dlx=0.0 do 10371 k=1,ni if(ju(k).eq.0)goto 10371 ak=a(k) u=g(k)+ak*xv(k) v=abs(u)-vp(k)*ab a(k)=0.0 if(v.gt.0.0) a(k)=max(cl(1,k),min(cl(2,k),sign(v,u)/(xv(k)+vp(k)*d *em))) if(a(k).eq.ak)goto 10371 if(mm(k) .ne. 0)goto 10391 nin=nin+1 if(nin.gt.nx)goto 10372 do 10401 j=1,ni if(ju(j).eq.0)goto 10401 if(mm(j) .eq. 0)goto 10421 c(j,nin)=c(k,mm(j)) goto 10401 10421 continue if(j .ne. k)goto 10441 c(j,nin)=xv(j) goto 10401 10441 continue c(j,nin)=dot_product(x(:,j),x(:,k)) 10401 continue continue mm(k)=nin ia(nin)=k 10391 continue del=a(k)-ak rsq=rsq+del*(2.0*g(k)-del*xv(k)) dlx=max(xv(k)*del**2,dlx) do 10451 j=1,ni if(ju(j).ne.0) g(j)=g(j)-c(j,mm(k))*del 10451 continue continue 10371 continue 10372 continue if(dlx.lt.thr)goto 10352 if(nin.gt.nx)goto 10352 if(nlp .le. maxit)goto 10471 jerr=-m return 10471 continue 10360 continue iz=1 da(1:nin)=a(ia(1:nin)) continue 10481 continue nlp=nlp+1 dlx=0.0 do 10491 l=1,nin k=ia(l) ak=a(k) u=g(k)+ak*xv(k) v=abs(u)-vp(k)*ab a(k)=0.0 if(v.gt.0.0) a(k)=max(cl(1,k),min(cl(2,k),sign(v,u)/(xv(k)+vp(k)*d *em))) if(a(k).eq.ak)goto 10491 del=a(k)-ak rsq=rsq+del*(2.0*g(k)-del*xv(k)) dlx=max(xv(k)*del**2,dlx) do 10501 j=1,nin g(ia(j))=g(ia(j))-c(ia(j),mm(k))*del 10501 continue continue 10491 continue continue if(dlx.lt.thr)goto 10482 if(nlp .le. maxit)goto 10521 jerr=-m return 10521 continue goto 10481 10482 continue da(1:nin)=a(ia(1:nin))-da(1:nin) do 10531 j=1,ni if(mm(j).ne.0)goto 10531 if(ju(j).ne.0) g(j)=g(j)-dot_product(da(1:nin),c(j,1:nin)) 10531 continue continue jz=0 goto 10351 10352 continue if(nin .le. nx)goto 10551 jerr=-10000-m goto 10282 10551 continue if(nin.gt.0) ao(1:nin,m)=a(ia(1:nin)) kin(m)=nin rsqo(m)=rsq almo(m)=alm lmu=m if(m.lt.mnl)goto 10281 if(flmin.ge.1.0)goto 10281 me=0 do 10561 j=1,nin if(ao(j,m).ne.0.0) me=me+1 10561 continue continue if(me.gt.ne)goto 10282 if(rsq-rsq0.lt.sml*rsq)goto 10282 if(rsq.gt.rsqmax)goto 10282 10281 continue 10282 continue deallocate(a,mm,c,da) return end subroutine elnetn(parm,no,ni,x,y,w,jd,vp,cl,ne,nx,nlam,flmin,ulam, *thr,isd, intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) implicit double precision(a-h,o-z) double precision vp(ni),x(no,ni),y(no),w(no),ulam(nlam),cl(2,ni) double precision ca(nx,nlam),a0(nlam),rsq(nlam),alm(nlam) integer jd(*),ia(nx),nin(nlam) double precision, dimension (:), allocatable :: xm,xs,xv,vlam integer, dimension (:), allocatable :: ju allocate(xm(1:ni),stat=jerr) if(jerr.ne.0) return allocate(xs(1:ni),stat=jerr) if(jerr.ne.0) return allocate(ju(1:ni),stat=jerr) if(jerr.ne.0) return allocate(xv(1:ni),stat=jerr) if(jerr.ne.0) return allocate(vlam(1:nlam),stat=jerr) if(jerr.ne.0) return call chkvars(no,ni,x,ju) if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 if(maxval(ju) .gt. 0)goto 10581 jerr=7777 return 10581 continue call standard1(no,ni,x,y,w,isd,intr,ju,xm,xs,ym,ys,xv,jerr) if(jerr.ne.0) return cl=cl/ys if(isd .le. 0)goto 10601 do 10611 j=1,ni cl(:,j)=cl(:,j)*xs(j) 10611 continue continue 10601 continue if(flmin.ge.1.0) vlam=ulam/ys call elnet2(parm,ni,ju,vp,cl,y,no,ne,nx,x,nlam,flmin,vlam,thr,maxi *t,xv, lmu,ca,ia,nin,rsq,alm,nlp,jerr) if(jerr.gt.0) return do 10621 k=1,lmu alm(k)=ys*alm(k) nk=nin(k) do 10631 l=1,nk ca(l,k)=ys*ca(l,k)/xs(ia(l)) 10631 continue continue a0(k)=0.0 if(intr.ne.0) a0(k)=ym-dot_product(ca(1:nk,k),xm(ia(1:nk))) 10621 continue continue deallocate(xm,xs,ju,xv,vlam) return end subroutine standard1(no,ni,x,y,w,isd,intr,ju,xm,xs,ym,ys,xv,jerr) implicit double precision(a-h,o-z) double precision x(no,ni),y(no),w(no),xm(ni),xs(ni),xv(ni) integer ju(ni) double precision, dimension (:), allocatable :: v allocate(v(1:no),stat=jerr) if(jerr.ne.0) return w=w/sum(w) v=sqrt(w) if(intr .ne. 0)goto 10651 ym=0.0 y=v*y ys=sqrt(dot_product(y,y)-dot_product(v,y)**2) y=y/ys do 10661 j=1,ni if(ju(j).eq.0)goto 10661 xm(j)=0.0 x(:,j)=v*x(:,j) xv(j)=dot_product(x(:,j),x(:,j)) if(isd .eq. 0)goto 10681 xbq=dot_product(v,x(:,j))**2 vc=xv(j)-xbq xs(j)=sqrt(vc) x(:,j)=x(:,j)/xs(j) xv(j)=1.0+xbq/vc goto 10691 10681 continue xs(j)=1.0 10691 continue continue 10661 continue continue go to 10700 10651 continue do 10711 j=1,ni if(ju(j).eq.0)goto 10711 xm(j)=dot_product(w,x(:,j)) x(:,j)=v*(x(:,j)-xm(j)) xv(j)=dot_product(x(:,j),x(:,j)) if(isd.gt.0) xs(j)=sqrt(xv(j)) 10711 continue continue if(isd .ne. 0)goto 10731 xs=1.0 goto 10741 10731 continue do 10751 j=1,ni if(ju(j).eq.0)goto 10751 x(:,j)=x(:,j)/xs(j) 10751 continue continue xv=1.0 10741 continue continue ym=dot_product(w,y) y=v*(y-ym) ys=sqrt(dot_product(y,y)) y=y/ys 10700 continue deallocate(v) return end subroutine elnet2(beta,ni,ju,vp,cl,y,no,ne,nx,x,nlam,flmin,ulam,th *r,maxit,xv, lmu,ao,ia,kin,rsqo,almo,nlp,jerr) implicit double precision(a-h,o-z) double precision vp(ni),y(no),x(no,ni),ulam(nlam),ao(nx,nlam) double precision rsqo(nlam),almo(nlam),xv(ni) double precision cl(2,ni) integer ju(ni),ia(nx),kin(nlam) double precision, dimension (:), allocatable :: a,g integer, dimension (:), allocatable :: mm,ix call get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx,itrace) allocate(a(1:ni),stat=jerr) if(jerr.ne.0) return allocate(mm(1:ni),stat=jerr) if(jerr.ne.0) return allocate(g(1:ni),stat=jerr) if(jerr.ne.0) return allocate(ix(1:ni),stat=jerr) if(jerr.ne.0) return bta=beta omb=1.0-bta ix=0 alf=1.0 if(flmin .ge. 1.0)goto 10771 eqs=max(eps,flmin) alf=eqs**(1.0/(nlam-1)) 10771 continue rsq=0.0 a=0.0 mm=0 nlp=0 nin=nlp iz=0 mnl=min(mnlam,nlam) alm=0.0 do 10781 j=1,ni if(ju(j).eq.0)goto 10781 g(j)=abs(dot_product(y,x(:,j))) 10781 continue continue do 10791 m=1,nlam if(itrace.ne.0) call setpb(m-1) alm0=alm if(flmin .lt. 1.0)goto 10811 alm=ulam(m) goto 10801 10811 if(m .le. 2)goto 10821 alm=alm*alf goto 10801 10821 if(m .ne. 1)goto 10831 alm=big goto 10841 10831 continue alm0=0.0 do 10851 j=1,ni if(ju(j).eq.0)goto 10851 if(vp(j).gt.0.0) alm0=max(alm0,g(j)/vp(j)) 10851 continue continue alm0=alm0/max(bta,1.0d-3) alm=alf*alm0 10841 continue 10801 continue dem=alm*omb ab=alm*bta rsq0=rsq jz=1 tlam=bta*(2.0*alm-alm0) do 10861 k=1,ni if(ix(k).eq.1)goto 10861 if(ju(k).eq.0)goto 10861 if(g(k).gt.tlam*vp(k)) ix(k)=1 10861 continue continue continue 10871 continue if(iz*jz.ne.0) go to 10360 10880 continue nlp=nlp+1 dlx=0.0 do 10891 k=1,ni if(ix(k).eq.0)goto 10891 gk=dot_product(y,x(:,k)) ak=a(k) u=gk+ak*xv(k) v=abs(u)-vp(k)*ab a(k)=0.0 if(v.gt.0.0) a(k)=max(cl(1,k),min(cl(2,k),sign(v,u)/(xv(k)+vp(k)*d *em))) if(a(k).eq.ak)goto 10891 if(mm(k) .ne. 0)goto 10911 nin=nin+1 if(nin.gt.nx)goto 10892 mm(k)=nin ia(nin)=k 10911 continue del=a(k)-ak rsq=rsq+del*(2.0*gk-del*xv(k)) y=y-del*x(:,k) dlx=max(xv(k)*del**2,dlx) 10891 continue 10892 continue if(nin.gt.nx)goto 10872 if(dlx .ge. thr)goto 10931 ixx=0 do 10941 k=1,ni if(ix(k).eq.1)goto 10941 if(ju(k).eq.0)goto 10941 g(k)=abs(dot_product(y,x(:,k))) if(g(k) .le. ab*vp(k))goto 10961 ix(k)=1 ixx=1 10961 continue 10941 continue continue if(ixx.eq.1) go to 10880 goto 10872 10931 continue if(nlp .le. maxit)goto 10981 jerr=-m return 10981 continue 10360 continue iz=1 continue 10991 continue nlp=nlp+1 dlx=0.0 do 11001 l=1,nin k=ia(l) gk=dot_product(y,x(:,k)) ak=a(k) u=gk+ak*xv(k) v=abs(u)-vp(k)*ab a(k)=0.0 if(v.gt.0.0) a(k)=max(cl(1,k),min(cl(2,k),sign(v,u)/(xv(k)+vp(k)*d *em))) if(a(k).eq.ak)goto 11001 del=a(k)-ak rsq=rsq+del*(2.0*gk-del*xv(k)) y=y-del*x(:,k) dlx=max(xv(k)*del**2,dlx) 11001 continue continue if(dlx.lt.thr)goto 10992 if(nlp .le. maxit)goto 11021 jerr=-m return 11021 continue goto 10991 10992 continue jz=0 goto 10871 10872 continue if(nin .le. nx)goto 11041 jerr=-10000-m goto 10792 11041 continue if(nin.gt.0) ao(1:nin,m)=a(ia(1:nin)) kin(m)=nin rsqo(m)=rsq almo(m)=alm lmu=m if(m.lt.mnl)goto 10791 if(flmin.ge.1.0)goto 10791 me=0 do 11051 j=1,nin if(ao(j,m).ne.0.0) me=me+1 11051 continue continue if(me.gt.ne)goto 10792 if(rsq-rsq0.lt.sml*rsq)goto 10792 if(rsq.gt.rsqmax)goto 10792 10791 continue 10792 continue deallocate(a,mm,g,ix) return end subroutine chkvars(no,ni,x,ju) implicit double precision(a-h,o-z) double precision x(no,ni) integer ju(ni) do 11061 j=1,ni ju(j)=0 t=x(1,j) do 11071 i=2,no if(x(i,j).eq.t)goto 11071 ju(j)=1 goto 11072 11071 continue 11072 continue 11061 continue continue return end subroutine uncomp(ni,ca,ia,nin,a) implicit double precision(a-h,o-z) double precision ca(*),a(ni) integer ia(*) a=0.0 if(nin.gt.0) a(ia(1:nin))=ca(1:nin) return end subroutine modval(a0,ca,ia,nin,n,x,f) implicit double precision(a-h,o-z) double precision ca(nin),x(n,*),f(n) integer ia(nin) f=a0 if(nin.le.0) return do 11081 i=1,n f(i)=f(i)+dot_product(ca(1:nin),x(i,ia(1:nin))) 11081 continue continue return end subroutine spelnet(ka,parm,no,ni,x,ix,jx,y,w,jd,vp,cl,ne,nx,nlam, * flmin,ulam,thr,isd,intr, maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr *) implicit double precision(a-h,o-z) double precision x(*),y(no),w(no),vp(ni),ulam(nlam),cl(2,ni) double precision ca(nx,nlam),a0(nlam),rsq(nlam),alm(nlam) integer ix(*),jx(*),jd(*),ia(nx),nin(nlam) double precision, dimension (:), allocatable :: vq; if(maxval(vp) .gt. 0.0)goto 11101 jerr=10000 return 11101 continue allocate(vq(1:ni),stat=jerr) if(jerr.ne.0) return vq=max(0d0,vp) vq=vq*ni/sum(vq) if(ka .ne. 1)goto 11121 call spelnetu (parm,no,ni,x,ix,jx,y,w,jd,vq,cl,ne,nx,nlam,flmin,u *lam,thr,isd, intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) goto 11131 11121 continue call spelnetn (parm,no,ni,x,ix,jx,y,w,jd,vq,cl,ne,nx,nlam,flmin,ul *am,thr,isd,intr, maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) 11131 continue continue deallocate(vq) return end subroutine spelnetu(parm,no,ni,x,ix,jx,y,w,jd,vp,cl,ne,nx,nlam, f *lmin,ulam,thr,isd,intr, maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) implicit double precision(a-h,o-z) double precision x(*),y(no),w(no),vp(ni),ulam(nlam),cl(2,ni) double precision ca(nx,nlam),a0(nlam),rsq(nlam),alm(nlam) integer ix(*),jx(*),jd(*),ia(nx),nin(nlam) double precision, dimension (:), allocatable :: xm,xs,g,xv,vlam integer, dimension (:), allocatable :: ju allocate(g(1:ni),stat=jerr) if(jerr.ne.0) return allocate(xm(1:ni),stat=jerr) if(jerr.ne.0) return allocate(xs(1:ni),stat=jerr) if(jerr.ne.0) return allocate(ju(1:ni),stat=jerr) if(jerr.ne.0) return allocate(xv(1:ni),stat=jerr) if(jerr.ne.0) return allocate(vlam(1:nlam),stat=jerr) if(jerr.ne.0) return call spchkvars(no,ni,x,ix,ju) if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 if(maxval(ju) .gt. 0)goto 11151 jerr=7777 return 11151 continue call spstandard(no,ni,x,ix,jx,y,w,ju,isd,intr,g,xm,xs,ym,ys,xv,jer *r) if(jerr.ne.0) return cl=cl/ys if(isd .le. 0)goto 11171 do 11181 j=1,ni cl(:,j)=cl(:,j)*xs(j) 11181 continue continue 11171 continue if(flmin.ge.1.0) vlam=ulam/ys call spelnet1(parm,ni,g,no,w,ne,nx,x,ix,jx,ju,vp,cl,nlam,flmin,vla *m,thr,maxit, xm,xs,xv,lmu,ca,ia,nin,rsq,alm,nlp,jerr) if(jerr.gt.0) return do 11191 k=1,lmu alm(k)=ys*alm(k) nk=nin(k) do 11201 l=1,nk ca(l,k)=ys*ca(l,k)/xs(ia(l)) 11201 continue continue a0(k)=0.0 if(intr.ne.0) a0(k)=ym-dot_product(ca(1:nk,k),xm(ia(1:nk))) 11191 continue continue deallocate(xm,xs,g,ju,xv,vlam) return end subroutine spstandard(no,ni,x,ix,jx,y,w,ju,isd,intr,g,xm,xs,ym,ys, *xv,jerr) implicit double precision(a-h,o-z) double precision x(*),y(no),w(no),g(ni),xm(ni),xs(ni),xv(ni) integer ix(*),jx(*),ju(ni) jerr = jerr*1 w=w/sum(w) if(intr .ne. 0)goto 11221 ym=0.0 ys=sqrt(dot_product(w,y**2)-dot_product(w,y)**2) y=y/ys do 11231 j=1,ni if(ju(j).eq.0)goto 11231 xm(j)=0.0 jb=ix(j) je=ix(j+1)-1 xv(j)=dot_product(w(jx(jb:je)),x(jb:je)**2) if(isd .eq. 0)goto 11251 xbq=dot_product(w(jx(jb:je)),x(jb:je))**2 vc=xv(j)-xbq xs(j)=sqrt(vc) xv(j)=1.0+xbq/vc goto 11261 11251 continue xs(j)=1.0 11261 continue continue 11231 continue continue goto 11271 11221 continue do 11281 j=1,ni if(ju(j).eq.0)goto 11281 jb=ix(j) je=ix(j+1)-1 xm(j)=dot_product(w(jx(jb:je)),x(jb:je)) xv(j)=dot_product(w(jx(jb:je)),x(jb:je)**2)-xm(j)**2 if(isd.gt.0) xs(j)=sqrt(xv(j)) 11281 continue continue if(isd .ne. 0)goto 11301 xs=1.0 goto 11311 11301 continue xv=1.0 11311 continue continue ym=dot_product(w,y) y=y-ym ys=sqrt(dot_product(w,y**2)) y=y/ys 11271 continue continue g=0.0 do 11321 j=1,ni if(ju(j).eq.0)goto 11321 jb=ix(j) je=ix(j+1)-1 g(j)=dot_product(w(jx(jb:je))*y(jx(jb:je)),x(jb:je))/xs(j) 11321 continue continue return end subroutine spelnet1(beta,ni,g,no,w,ne,nx,x,ix,jx,ju,vp,cl,nlam,flm *in,ulam, thr,maxit,xm,xs,xv,lmu,ao,ia,kin,rsqo,almo,nlp,jerr) implicit double precision(a-h,o-z) double precision g(ni),vp(ni),x(*),ulam(nlam),w(no) double precision ao(nx,nlam),rsqo(nlam),almo(nlam) double precision xm(ni),xs(ni),xv(ni),cl(2,ni) integer ix(*),jx(*),ju(ni),ia(nx),kin(nlam) double precision, dimension (:), allocatable :: a,da integer, dimension (:), allocatable :: mm double precision, dimension (:,:), allocatable :: c allocate(c(1:ni,1:nx),stat=jerr) if(jerr.ne.0) return; call get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx,itrace) allocate(a(1:ni),stat=jerr) if(jerr.ne.0) return allocate(mm(1:ni),stat=jerr) if(jerr.ne.0) return allocate(da(1:ni),stat=jerr) if(jerr.ne.0) return bta=beta omb=1.0-bta alm=0.0 alf=1.0 if(flmin .ge. 1.0)goto 11341 eqs=max(eps,flmin) alf=eqs**(1.0/(nlam-1)) 11341 continue rsq=0.0 a=0.0 mm=0 nlp=0 nin=nlp iz=0 mnl=min(mnlam,nlam) do 11351 m=1,nlam if(itrace.ne.0) call setpb(m-1) if(flmin .lt. 1.0)goto 11371 alm=ulam(m) goto 11361 11371 if(m .le. 2)goto 11381 alm=alm*alf goto 11361 11381 if(m .ne. 1)goto 11391 alm=big goto 11401 11391 continue alm=0.0 do 11411 j=1,ni if(ju(j).eq.0)goto 11411 if(vp(j).le.0.0)goto 11411 alm=max(alm,abs(g(j))/vp(j)) 11411 continue continue alm=alf*alm/max(bta,1.0d-3) 11401 continue 11361 continue dem=alm*omb ab=alm*bta rsq0=rsq jz=1 continue 11421 continue if(iz*jz.ne.0) go to 10360 nlp=nlp+1 dlx=0.0 do 11431 k=1,ni if(ju(k).eq.0)goto 11431 ak=a(k) u=g(k)+ak*xv(k) v=abs(u)-vp(k)*ab a(k)=0.0 if(v.gt.0.0) a(k)=max(cl(1,k),min(cl(2,k),sign(v,u)/(xv(k)+vp(k)*d *em))) if(a(k).eq.ak)goto 11431 if(mm(k) .ne. 0)goto 11451 nin=nin+1 if(nin.gt.nx)goto 11432 do 11461 j=1,ni if(ju(j).eq.0)goto 11461 if(mm(j) .eq. 0)goto 11481 c(j,nin)=c(k,mm(j)) goto 11461 11481 continue if(j .ne. k)goto 11501 c(j,nin)=xv(j) goto 11461 11501 continue c(j,nin)= (row_prod(j,k,ix,jx,x,w)-xm(j)*xm(k))/(xs(j)*xs(k)) 11461 continue continue mm(k)=nin ia(nin)=k 11451 continue del=a(k)-ak rsq=rsq+del*(2.0*g(k)-del*xv(k)) dlx=max(xv(k)*del**2,dlx) do 11511 j=1,ni if(ju(j).ne.0) g(j)=g(j)-c(j,mm(k))*del 11511 continue continue 11431 continue 11432 continue if(dlx.lt.thr)goto 11422 if(nin.gt.nx)goto 11422 if(nlp .le. maxit)goto 11531 jerr=-m return 11531 continue 10360 continue iz=1 da(1:nin)=a(ia(1:nin)) continue 11541 continue nlp=nlp+1 dlx=0.0 do 11551 l=1,nin k=ia(l) ak=a(k) u=g(k)+ak*xv(k) v=abs(u)-vp(k)*ab a(k)=0.0 if(v.gt.0.0) a(k)=max(cl(1,k),min(cl(2,k),sign(v,u)/(xv(k)+vp(k)*d *em))) if(a(k).eq.ak)goto 11551 del=a(k)-ak rsq=rsq+del*(2.0*g(k)-del*xv(k)) dlx=max(xv(k)*del**2,dlx) do 11561 j=1,nin g(ia(j))=g(ia(j))-c(ia(j),mm(k))*del 11561 continue continue 11551 continue continue if(dlx.lt.thr)goto 11542 if(nlp .le. maxit)goto 11581 jerr=-m return 11581 continue goto 11541 11542 continue da(1:nin)=a(ia(1:nin))-da(1:nin) do 11591 j=1,ni if(mm(j).ne.0)goto 11591 if(ju(j).ne.0) g(j)=g(j)-dot_product(da(1:nin),c(j,1:nin)) 11591 continue continue jz=0 goto 11421 11422 continue if(nin .le. nx)goto 11611 jerr=-10000-m goto 11352 11611 continue if(nin.gt.0) ao(1:nin,m)=a(ia(1:nin)) kin(m)=nin rsqo(m)=rsq almo(m)=alm lmu=m if(m.lt.mnl)goto 11351 if(flmin.ge.1.0)goto 11351 me=0 do 11621 j=1,nin if(ao(j,m).ne.0.0) me=me+1 11621 continue continue if(me.gt.ne)goto 11352 if(rsq-rsq0.lt.sml*rsq)goto 11352 if(rsq.gt.rsqmax)goto 11352 11351 continue 11352 continue deallocate(a,mm,c,da) return end subroutine spelnetn(parm,no,ni,x,ix,jx,y,w,jd,vp,cl,ne,nx,nlam,flm *in,ulam, thr,isd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) implicit double precision(a-h,o-z) double precision x(*),vp(ni),y(no),w(no),ulam(nlam),cl(2,ni) double precision ca(nx,nlam),a0(nlam),rsq(nlam),alm(nlam) integer ix(*),jx(*),jd(*),ia(nx),nin(nlam) double precision, dimension (:), allocatable :: xm,xs,xv,vlam integer, dimension (:), allocatable :: ju allocate(xm(1:ni),stat=jerr) if(jerr.ne.0) return allocate(xs(1:ni),stat=jerr) if(jerr.ne.0) return allocate(ju(1:ni),stat=jerr) if(jerr.ne.0) return allocate(xv(1:ni),stat=jerr) if(jerr.ne.0) return allocate(vlam(1:nlam),stat=jerr) if(jerr.ne.0) return call spchkvars(no,ni,x,ix,ju) if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 if(maxval(ju) .gt. 0)goto 11641 jerr=7777 return 11641 continue call spstandard1(no,ni,x,ix,jx,y,w,ju,isd,intr,xm,xs,ym,ys,xv,jerr *) if(jerr.ne.0) return cl=cl/ys if(isd .le. 0)goto 11661 do 11671 j=1,ni cl(:,j)=cl(:,j)*xs(j) 11671 continue continue 11661 continue if(flmin.ge.1.0) vlam=ulam/ys call spelnet2(parm,ni,y,w,no,ne,nx,x,ix,jx,ju,vp,cl,nlam,flmin,vla *m,thr,maxit, xm,xs,xv,lmu,ca,ia,nin,rsq,alm,nlp,jerr) if(jerr.gt.0) return do 11681 k=1,lmu alm(k)=ys*alm(k) nk=nin(k) do 11691 l=1,nk ca(l,k)=ys*ca(l,k)/xs(ia(l)) 11691 continue continue a0(k)=0.0 if(intr.ne.0) a0(k)=ym-dot_product(ca(1:nk,k),xm(ia(1:nk))) 11681 continue continue deallocate(xm,xs,ju,xv,vlam) return end subroutine spstandard1(no,ni,x,ix,jx,y,w,ju,isd,intr,xm,xs,ym,ys,x *v,jerr) implicit double precision(a-h,o-z) double precision x(*),y(no),w(no),xm(ni),xs(ni),xv(ni) integer ix(*),jx(*),ju(ni) jerr = jerr*1 w=w/sum(w) if(intr .ne. 0)goto 11711 ym=0.0 ys=sqrt(dot_product(w,y**2)-dot_product(w,y)**2) y=y/ys do 11721 j=1,ni if(ju(j).eq.0)goto 11721 xm(j)=0.0 jb=ix(j) je=ix(j+1)-1 xv(j)=dot_product(w(jx(jb:je)),x(jb:je)**2) if(isd .eq. 0)goto 11741 xbq=dot_product(w(jx(jb:je)),x(jb:je))**2 vc=xv(j)-xbq xs(j)=sqrt(vc) xv(j)=1.0+xbq/vc goto 11751 11741 continue xs(j)=1.0 11751 continue continue 11721 continue continue return 11711 continue do 11761 j=1,ni if(ju(j).eq.0)goto 11761 jb=ix(j) je=ix(j+1)-1 xm(j)=dot_product(w(jx(jb:je)),x(jb:je)) xv(j)=dot_product(w(jx(jb:je)),x(jb:je)**2)-xm(j)**2 if(isd.gt.0) xs(j)=sqrt(xv(j)) 11761 continue continue if(isd .ne. 0)goto 11781 xs=1.0 goto 11791 11781 continue xv=1.0 11791 continue continue ym=dot_product(w,y) y=y-ym ys=sqrt(dot_product(w,y**2)) y=y/ys return end subroutine spelnet2(beta,ni,y,w,no,ne,nx,x,ix,jx,ju,vp,cl,nlam,flm *in,ulam, thr,maxit,xm,xs,xv,lmu,ao,ia,kin,rsqo,almo,nlp,jerr) implicit double precision(a-h,o-z) double precision y(no),w(no),x(*),vp(ni),ulam(nlam),cl(2,ni) double precision ao(nx,nlam),rsqo(nlam),almo(nlam),xm(ni),xs(ni),x *v(ni) integer ix(*),jx(*),ju(ni),ia(nx),kin(nlam) double precision, dimension (:), allocatable :: a,g integer, dimension (:), allocatable :: mm,iy call get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx,itrace) allocate(a(1:ni),stat=jerr) if(jerr.ne.0) return allocate(mm(1:ni),stat=jerr) if(jerr.ne.0) return allocate(g(1:ni),stat=jerr) if(jerr.ne.0) return allocate(iy(1:ni),stat=jerr) if(jerr.ne.0) return bta=beta omb=1.0-bta alm=0.0 iy=0 alf=1.0 if(flmin .ge. 1.0)goto 11811 eqs=max(eps,flmin) alf=eqs**(1.0/(nlam-1)) 11811 continue rsq=0.0 a=0.0 mm=0 o=0.0 nlp=0 nin=nlp iz=0 mnl=min(mnlam,nlam) do 11821 j=1,ni if(ju(j).eq.0)goto 11821 jb=ix(j) je=ix(j+1)-1 g(j)=abs(dot_product(y(jx(jb:je))+o,w(jx(jb:je))*x(jb:je))/xs(j)) 11821 continue continue do 11831 m=1,nlam if(itrace.ne.0) call setpb(m-1) alm0=alm if(flmin .lt. 1.0)goto 11851 alm=ulam(m) goto 11841 11851 if(m .le. 2)goto 11861 alm=alm*alf goto 11841 11861 if(m .ne. 1)goto 11871 alm=big goto 11881 11871 continue alm0=0.0 do 11891 j=1,ni if(ju(j).eq.0)goto 11891 if(vp(j).gt.0.0) alm0=max(alm0,g(j)/vp(j)) 11891 continue continue alm0=alm0/max(bta,1.0d-3) alm=alf*alm0 11881 continue 11841 continue dem=alm*omb ab=alm*bta rsq0=rsq jz=1 tlam=bta*(2.0*alm-alm0) do 11901 k=1,ni if(iy(k).eq.1)goto 11901 if(ju(k).eq.0)goto 11901 if(g(k).gt.tlam*vp(k)) iy(k)=1 11901 continue continue continue 11911 continue if(iz*jz.ne.0) go to 10360 10880 continue nlp=nlp+1 dlx=0.0 do 11921 k=1,ni if(iy(k).eq.0)goto 11921 jb=ix(k) je=ix(k+1)-1 gk=dot_product(y(jx(jb:je))+o,w(jx(jb:je))*x(jb:je))/xs(k) ak=a(k) u=gk+ak*xv(k) v=abs(u)-vp(k)*ab a(k)=0.0 if(v.gt.0.0) a(k)=max(cl(1,k),min(cl(2,k),sign(v,u)/(xv(k)+vp(k)*d *em))) if(a(k).eq.ak)goto 11921 if(mm(k) .ne. 0)goto 11941 nin=nin+1 if(nin.gt.nx)goto 11922 mm(k)=nin ia(nin)=k 11941 continue del=a(k)-ak rsq=rsq+del*(2.0*gk-del*xv(k)) y(jx(jb:je))=y(jx(jb:je))-del*x(jb:je)/xs(k) o=o+del*xm(k)/xs(k) dlx=max(xv(k)*del**2,dlx) 11921 continue 11922 continue if(nin.gt.nx)goto 11912 if(dlx .ge. thr)goto 11961 ixx=0 do 11971 j=1,ni if(iy(j).eq.1)goto 11971 if(ju(j).eq.0)goto 11971 jb=ix(j) je=ix(j+1)-1 g(j)=abs(dot_product(y(jx(jb:je))+o,w(jx(jb:je))*x(jb:je))/xs(j)) if(g(j) .le. ab*vp(j))goto 11991 iy(j)=1 ixx=1 11991 continue 11971 continue continue if(ixx.eq.1) go to 10880 goto 11912 11961 continue if(nlp .le. maxit)goto 12011 jerr=-m return 12011 continue 10360 continue iz=1 continue 12021 continue nlp=nlp+1 dlx=0.0 do 12031 l=1,nin k=ia(l) jb=ix(k) je=ix(k+1)-1 gk=dot_product(y(jx(jb:je))+o,w(jx(jb:je))*x(jb:je))/xs(k) ak=a(k) u=gk+ak*xv(k) v=abs(u)-vp(k)*ab a(k)=0.0 if(v.gt.0.0) a(k)=max(cl(1,k),min(cl(2,k),sign(v,u)/(xv(k)+vp(k)*d *em))) if(a(k).eq.ak)goto 12031 del=a(k)-ak rsq=rsq+del*(2.0*gk-del*xv(k)) y(jx(jb:je))=y(jx(jb:je))-del*x(jb:je)/xs(k) o=o+del*xm(k)/xs(k) dlx=max(xv(k)*del**2,dlx) 12031 continue continue if(dlx.lt.thr)goto 12022 if(nlp .le. maxit)goto 12051 jerr=-m return 12051 continue goto 12021 12022 continue jz=0 goto 11911 11912 continue if(nin .le. nx)goto 12071 jerr=-10000-m goto 11832 12071 continue if(nin.gt.0) ao(1:nin,m)=a(ia(1:nin)) kin(m)=nin rsqo(m)=rsq almo(m)=alm lmu=m if(m.lt.mnl)goto 11831 if(flmin.ge.1.0)goto 11831 me=0 do 12081 j=1,nin if(ao(j,m).ne.0.0) me=me+1 12081 continue continue if(me.gt.ne)goto 11832 if(rsq-rsq0.lt.sml*rsq)goto 11832 if(rsq.gt.rsqmax)goto 11832 11831 continue 11832 continue deallocate(a,mm,g,iy) return end subroutine spchkvars(no,ni,x,ix,ju) implicit double precision(a-h,o-z) double precision x(*) integer ix(*),ju(ni) do 12091 j=1,ni ju(j)=0 jb=ix(j) nj=ix(j+1)-jb if(nj.eq.0)goto 12091 je=ix(j+1)-1 if(nj .ge. no)goto 12111 do 12121 i=jb,je if(x(i).eq.0.0)goto 12121 ju(j)=1 goto 12122 12121 continue 12122 continue goto 12131 12111 continue t=x(jb) do 12141 i=jb+1,je if(x(i).eq.t)goto 12141 ju(j)=1 goto 12142 12141 continue 12142 continue 12131 continue continue 12091 continue continue return end subroutine cmodval(a0,ca,ia,nin,x,ix,jx,n,f) implicit double precision(a-h,o-z) double precision ca(*),x(*),f(n) integer ia(*),ix(*),jx(*) f=a0 do 12151 j=1,nin k=ia(j) kb=ix(k) ke=ix(k+1)-1 f(jx(kb:ke))=f(jx(kb:ke))+ca(j)*x(kb:ke) 12151 continue continue return end function row_prod(i,j,ia,ja,ra,w) implicit double precision(a-h,o-z) integer ia(*),ja(*) double precision ra(*),w(*) row_prod=dot(ra(ia(i)),ra(ia(j)),ja(ia(i)),ja(ia(j)), ia(i+1)-ia( *i),ia(j+1)-ia(j),w) return end function dot(x,y,mx,my,nx,ny,w) implicit double precision(a-h,o-z) double precision x(*),y(*),w(*) integer mx(*),my(*) i=1 j=i s=0.0 continue 12161 continue continue 12171 if(mx(i).ge.my(j))goto 12172 i=i+1 if(i.gt.nx) go to 12180 goto 12171 12172 continue if(mx(i).eq.my(j)) go to 12190 continue 12201 if(my(j).ge.mx(i))goto 12202 j=j+1 if(j.gt.ny) go to 12180 goto 12201 12202 continue if(mx(i).eq.my(j)) go to 12190 goto 12161 12190 continue s=s+w(mx(i))*x(i)*y(j) i=i+1 if(i.gt.nx)goto 12162 j=j+1 if(j.gt.ny)goto 12162 goto 12161 12162 continue 12180 continue dot=s return end subroutine lognet(parm,no,ni,nc,x,y,g,jd,vp,cl,ne,nx,nlam,flmin,ul *am,thr, isd,intr,maxit,kopt,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,jer *r) implicit double precision(a-h,o-z) double precision x(no,ni),y(no,max(2,nc)),g(no,nc),vp(ni),ulam(nla *m) double precision ca(nx,nc,nlam),a0(nc,nlam),dev(nlam),alm(nlam),cl *(2,ni) integer jd(*),ia(nx),nin(nlam) double precision, dimension (:), allocatable :: xm,xs,ww,vq,xv integer, dimension (:), allocatable :: ju if(maxval(vp) .gt. 0.0)goto 12221 jerr=10000 return 12221 continue allocate(ww(1:no),stat=jerr) if(jerr.ne.0) return allocate(ju(1:ni),stat=jerr) if(jerr.ne.0) return allocate(vq(1:ni),stat=jerr) if(jerr.ne.0) return allocate(xm(1:ni),stat=jerr) if(jerr.ne.0) return if(kopt .ne. 2)goto 12241 allocate(xv(1:ni),stat=jerr) if(jerr.ne.0) return 12241 continue if(isd .le. 0)goto 12261 allocate(xs(1:ni),stat=jerr) if(jerr.ne.0) return 12261 continue call chkvars(no,ni,x,ju) if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 if(maxval(ju) .gt. 0)goto 12281 jerr=7777 return 12281 continue vq=max(0d0,vp) vq=vq*ni/sum(vq) do 12291 i=1,no ww(i)=sum(y(i,:)) if(ww(i).gt.0.0) y(i,:)=y(i,:)/ww(i) 12291 continue continue sw=sum(ww) ww=ww/sw if(nc .ne. 1)goto 12311 call lstandard1(no,ni,x,ww,ju,isd,intr,xm,xs) if(isd .le. 0)goto 12331 do 12341 j=1,ni cl(:,j)=cl(:,j)*xs(j) 12341 continue continue 12331 continue call lognet2n(parm,no,ni,x,y(:,1),g(:,1),ww,ju,vq,cl,ne,nx,nlam,fl *min,ulam, thr,isd,intr,maxit,kopt,lmu,a0,ca,ia,nin,dev0,dev,alm,n *lp,jerr) goto 12301 12311 if(kopt .ne. 2)goto 12351 call multlstandard1(no,ni,x,ww,ju,isd,intr,xm,xs,xv) if(isd .le. 0)goto 12371 do 12381 j=1,ni cl(:,j)=cl(:,j)*xs(j) 12381 continue continue 12371 continue call multlognetn(parm,no,ni,nc,x,y,g,ww,ju,vq,cl,ne,nx,nlam,flmin, *ulam,thr, intr,maxit,xv,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,jerr) goto 12391 12351 continue call lstandard1(no,ni,x,ww,ju,isd,intr,xm,xs) if(isd .le. 0)goto 12411 do 12421 j=1,ni cl(:,j)=cl(:,j)*xs(j) 12421 continue continue 12411 continue call lognetn(parm,no,ni,nc,x,y,g,ww,ju,vq,cl,ne,nx,nlam,flmin,ulam *,thr, isd,intr,maxit,kopt,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,jerr) 12391 continue 12301 continue if(jerr.gt.0) return dev0=2.0*sw*dev0 do 12431 k=1,lmu nk=nin(k) do 12441 ic=1,nc if(isd .le. 0)goto 12461 do 12471 l=1,nk ca(l,ic,k)=ca(l,ic,k)/xs(ia(l)) 12471 continue continue 12461 continue if(intr .ne. 0)goto 12491 a0(ic,k)=0.0 goto 12501 12491 continue a0(ic,k)=a0(ic,k)-dot_product(ca(1:nk,ic,k),xm(ia(1:nk))) 12501 continue continue 12441 continue continue 12431 continue continue deallocate(ww,ju,vq,xm) if(isd.gt.0) deallocate(xs) if(kopt.eq.2) deallocate(xv) return end subroutine lstandard1(no,ni,x,w,ju,isd,intr,xm,xs) implicit double precision(a-h,o-z) double precision x(no,ni),w(no),xm(ni),xs(ni) integer ju(ni) if(intr .ne. 0)goto 12521 do 12531 j=1,ni if(ju(j).eq.0)goto 12531 xm(j)=0.0 if(isd .eq. 0)goto 12551 vc=dot_product(w,x(:,j)**2)-dot_product(w,x(:,j))**2 xs(j)=sqrt(vc) x(:,j)=x(:,j)/xs(j) 12551 continue 12531 continue continue return 12521 continue do 12561 j=1,ni if(ju(j).eq.0)goto 12561 xm(j)=dot_product(w,x(:,j)) x(:,j)=x(:,j)-xm(j) if(isd .le. 0)goto 12581 xs(j)=sqrt(dot_product(w,x(:,j)**2)) x(:,j)=x(:,j)/xs(j) 12581 continue 12561 continue continue return end subroutine multlstandard1(no,ni,x,w,ju,isd,intr,xm,xs,xv) implicit double precision(a-h,o-z) double precision x(no,ni),w(no),xm(ni),xs(ni),xv(ni) integer ju(ni) if(intr .ne. 0)goto 12601 do 12611 j=1,ni if(ju(j).eq.0)goto 12611 xm(j)=0.0 xv(j)=dot_product(w,x(:,j)**2) if(isd .eq. 0)goto 12631 xbq=dot_product(w,x(:,j))**2 vc=xv(j)-xbq xs(j)=sqrt(vc) x(:,j)=x(:,j)/xs(j) xv(j)=1.0+xbq/vc 12631 continue 12611 continue continue return 12601 continue do 12641 j=1,ni if(ju(j).eq.0)goto 12641 xm(j)=dot_product(w,x(:,j)) x(:,j)=x(:,j)-xm(j) xv(j)=dot_product(w,x(:,j)**2) if(isd .le. 0)goto 12661 xs(j)=sqrt(xv(j)) x(:,j)=x(:,j)/xs(j) xv(j)=1.0 12661 continue 12641 continue continue return end subroutine lognet2n(parm,no,ni,x,y,g,w,ju,vp,cl,ne,nx,nlam,flmin,u *lam,shri, isd,intr,maxit,kopt,lmu,a0,a,m,kin,dev0,dev,alm,nlp,jer *r) implicit double precision(a-h,o-z) double precision x(no,ni),y(no),g(no),w(no),vp(ni),ulam(nlam),cl(2 *,ni) double precision a(nx,nlam),a0(nlam),dev(nlam),alm(nlam) integer ju(ni),m(nx),kin(nlam) double precision, dimension (:), allocatable :: b,bs,v,r,xv,q,ga integer, dimension (:), allocatable :: mm,ixx call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx,itrace) allocate(b(0:ni),stat=jerr) if(jerr.ne.0) return allocate(xv(1:ni),stat=jerr) if(jerr.ne.0) return allocate(ga(1:ni),stat=jerr) if(jerr.ne.0) return allocate(bs(0:ni),stat=jerr) if(jerr.ne.0) return allocate(mm(1:ni),stat=jerr) if(jerr.ne.0) return allocate(ixx(1:ni),stat=jerr) if(jerr.ne.0) return allocate(r(1:no),stat=jerr) if(jerr.ne.0) return allocate(v(1:no),stat=jerr) if(jerr.ne.0) return allocate(q(1:no),stat=jerr) if(jerr.ne.0) return fmax=log(1.0/pmin-1.0) fmin=-fmax vmin=(1.0+pmin)*pmin*(1.0-pmin) bta=parm omb=1.0-bta q0=dot_product(w,y) if(q0 .gt. pmin)goto 12681 jerr=8001 return 12681 continue if(q0 .lt. 1.0-pmin)goto 12701 jerr=9001 return 12701 continue if(intr.eq.0.0) q0=0.5 ixx=0 al=0.0 bz=0.0 if(intr.ne.0) bz=log(q0/(1.0-q0)) if(nonzero(no,g) .ne. 0)goto 12721 vi=q0*(1.0-q0) b(0)=bz v=vi*w r=w*(y-q0) q=q0 xmz=vi dev1=-(bz*q0+log(1.0-q0)) goto 12731 12721 continue b(0)=0.0 if(intr .eq. 0)goto 12751 b(0)=azero(no,y,g,w,jerr) if(jerr.ne.0) return 12751 continue q=1.0/(1.0+exp(-b(0)-g)) v=w*q*(1.0-q) r=w*(y-q) xmz=sum(v) dev1=-(b(0)*q0+dot_product(w,y*g+log(1.0-q))) 12731 continue continue if(kopt .le. 0)goto 12771 if(isd .le. 0 .or. intr .eq. 0)goto 12791 xv=0.25 goto 12801 12791 continue do 12811 j=1,ni if(ju(j).ne.0) xv(j)=0.25*dot_product(w,x(:,j)**2) 12811 continue continue 12801 continue continue 12771 continue dev0=dev1 do 12821 i=1,no if(y(i).gt.0.0) dev0=dev0+w(i)*y(i)*log(y(i)) if(y(i).lt.1.0) dev0=dev0+w(i)*(1.0-y(i))*log(1.0-y(i)) 12821 continue continue alf=1.0 if(flmin .ge. 1.0)goto 12841 eqs=max(eps,flmin) alf=eqs**(1.0/(nlam-1)) 12841 continue m=0 mm=0 nlp=0 nin=nlp mnl=min(mnlam,nlam) bs=0.0 b(1:ni)=0.0 shr=shri*dev0 do 12851 j=1,ni if(ju(j).eq.0)goto 12851 ga(j)=abs(dot_product(r,x(:,j))) 12851 continue continue do 12861 ilm=1,nlam if(itrace.ne.0) call setpb(ilm-1) al0=al if(flmin .lt. 1.0)goto 12881 al=ulam(ilm) goto 12871 12881 if(ilm .le. 2)goto 12891 al=al*alf goto 12871 12891 if(ilm .ne. 1)goto 12901 al=big goto 12911 12901 continue al0=0.0 do 12921 j=1,ni if(ju(j).eq.0)goto 12921 if(vp(j).gt.0.0) al0=max(al0,ga(j)/vp(j)) 12921 continue continue al0=al0/max(bta,1.0d-3) al=alf*al0 12911 continue 12871 continue al2=al*omb al1=al*bta tlam=bta*(2.0*al-al0) do 12931 k=1,ni if(ixx(k).eq.1)goto 12931 if(ju(k).eq.0)goto 12931 if(ga(k).gt.tlam*vp(k)) ixx(k)=1 12931 continue continue 10880 continue continue 12941 continue bs(0)=b(0) if(nin.gt.0) bs(m(1:nin))=b(m(1:nin)) if(kopt .ne. 0)goto 12961 do 12971 j=1,ni if(ixx(j).gt.0) xv(j)=dot_product(v,x(:,j)**2) 12971 continue continue 12961 continue continue 12981 continue nlp=nlp+1 dlx=0.0 do 12991 k=1,ni if(ixx(k).eq.0)goto 12991 bk=b(k) gk=dot_product(r,x(:,k)) u=gk+xv(k)*b(k) au=abs(u)-vp(k)*al1 if(au .gt. 0.0)goto 13011 b(k)=0.0 goto 13021 13011 continue b(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(xv(k)+vp(k)*al2))) 13021 continue continue d=b(k)-bk if(abs(d).le.0.0)goto 12991 dlx=max(dlx,xv(k)*d**2) r=r-d*v*x(:,k) if(mm(k) .ne. 0)goto 13041 nin=nin+1 if(nin.gt.nx)goto 12992 mm(k)=nin m(nin)=k 13041 continue 12991 continue 12992 continue if(nin.gt.nx)goto 12982 d=0.0 if(intr.ne.0) d=sum(r)/xmz if(d .eq. 0.0)goto 13061 b(0)=b(0)+d dlx=max(dlx,xmz*d**2) r=r-d*v 13061 continue if(dlx.lt.shr)goto 12982 if(nlp .le. maxit)goto 13081 jerr=-ilm return 13081 continue continue 13091 continue nlp=nlp+1 dlx=0.0 do 13101 l=1,nin k=m(l) bk=b(k) gk=dot_product(r,x(:,k)) u=gk+xv(k)*b(k) au=abs(u)-vp(k)*al1 if(au .gt. 0.0)goto 13121 b(k)=0.0 goto 13131 13121 continue b(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(xv(k)+vp(k)*al2))) 13131 continue continue d=b(k)-bk if(abs(d).le.0.0)goto 13101 dlx=max(dlx,xv(k)*d**2) r=r-d*v*x(:,k) 13101 continue continue d=0.0 if(intr.ne.0) d=sum(r)/xmz if(d .eq. 0.0)goto 13151 b(0)=b(0)+d dlx=max(dlx,xmz*d**2) r=r-d*v 13151 continue if(dlx.lt.shr)goto 13092 if(nlp .le. maxit)goto 13171 jerr=-ilm return 13171 continue goto 13091 13092 continue goto 12981 12982 continue if(nin.gt.nx)goto 12942 do 13181 i=1,no fi=b(0)+g(i) if(nin.gt.0) fi=fi+dot_product(b(m(1:nin)),x(i,m(1:nin))) if(fi .ge. fmin)goto 13201 q(i)=0.0 goto 13191 13201 if(fi .le. fmax)goto 13211 q(i)=1.0 goto 13221 13211 continue q(i)=1.0/(1.0+exp(-fi)) 13221 continue 13191 continue 13181 continue continue v=w*q*(1.0-q) xmz=sum(v) if(xmz.le.vmin)goto 12942 r=w*(y-q) if(xmz*(b(0)-bs(0))**2 .ge. shr)goto 13241 ix=0 do 13251 j=1,nin k=m(j) if(xv(k)*(b(k)-bs(k))**2.lt.shr)goto 13251 ix=1 goto 13252 13251 continue 13252 continue if(ix .ne. 0)goto 13271 do 13281 k=1,ni if(ixx(k).eq.1)goto 13281 if(ju(k).eq.0)goto 13281 ga(k)=abs(dot_product(r,x(:,k))) if(ga(k) .le. al1*vp(k))goto 13301 ixx(k)=1 ix=1 13301 continue 13281 continue continue if(ix.eq.1) go to 10880 goto 12942 13271 continue 13241 continue goto 12941 12942 continue if(nin .le. nx)goto 13321 jerr=-10000-ilm goto 12862 13321 continue if(nin.gt.0) a(1:nin,ilm)=b(m(1:nin)) kin(ilm)=nin a0(ilm)=b(0) alm(ilm)=al lmu=ilm devi=dev2(no,w,y,q,pmin) dev(ilm)=(dev1-devi)/dev0 if(xmz.le.vmin)goto 12862 if(ilm.lt.mnl)goto 12861 if(flmin.ge.1.0)goto 12861 me=0 do 13331 j=1,nin if(a(j,ilm).ne.0.0) me=me+1 13331 continue continue if(me.gt.ne)goto 12862 if(dev(ilm).gt.devmax)goto 12862 if(dev(ilm)-dev(ilm-1).lt.sml)goto 12862 12861 continue 12862 continue g=log(q/(1.0-q)) deallocate(b,bs,v,r,xv,q,mm,ga,ixx) return end function dev2(n,w,y,p,pmin) implicit double precision(a-h,o-z) double precision w(n),y(n),p(n) pmax=1.0-pmin s=0.0 do 13341 i=1,n pi=min(max(pmin,p(i)),pmax) s=s-w(i)*(y(i)*log(pi)+(1.0-y(i))*log(1.0-pi)) 13341 continue continue dev2=s return end function azero(n,y,g,q,jerr) implicit double precision(a-h,o-z) parameter(eps=1.0d-7) double precision y(n),g(n),q(n) double precision, dimension (:), allocatable :: e,p,w azero = 0.0 allocate(e(1:n),stat=jerr) if(jerr.ne.0) return allocate(p(1:n),stat=jerr) if(jerr.ne.0) return allocate(w(1:n),stat=jerr) if(jerr.ne.0) return az=0.0 e=exp(-g) qy=dot_product(q,y) p=1.0/(1.0+e) continue 13351 continue w=q*p*(1.0-p) d=(qy-dot_product(q,p))/sum(w) az=az+d if(abs(d).lt.eps)goto 13352 ea0=exp(-az) p=1.0/(1.0+ea0*e) goto 13351 13352 continue azero=az deallocate(e,p,w) return end subroutine lognetn(parm,no,ni,nc,x,y,g,w,ju,vp,cl,ne,nx,nlam,flmin *,ulam,shri, isd,intr,maxit,kopt,lmu,a0,a,m,kin,dev0,dev,alm,nlp,j *err) implicit double precision(a-h,o-z) double precision x(no,ni),y(no,nc),g(no,nc),w(no),vp(ni),ulam(nlam *) double precision a(nx,nc,nlam),a0(nc,nlam),dev(nlam),alm(nlam),cl( *2,ni) integer ju(ni),m(nx),kin(nlam) double precision, dimension (:,:), allocatable :: q double precision, dimension (:), allocatable :: sxp,sxpl double precision, dimension (:), allocatable :: di,v,r,ga double precision, dimension (:,:), allocatable :: b,bs,xv integer, dimension (:), allocatable :: mm,is,ixx allocate(b(0:ni,1:nc),stat=jerr) if(jerr.ne.0) return allocate(xv(1:ni,1:nc),stat=jerr) if(jerr.ne.0) return allocate(bs(0:ni,1:nc),stat=jerr) if(jerr.ne.0) return allocate(q(1:no,1:nc),stat=jerr) if(jerr.ne.0) return call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx,itrace) exmn=-exmx allocate(r(1:no),stat=jerr) if(jerr.ne.0) return allocate(v(1:no),stat=jerr) if(jerr.ne.0) return allocate(mm(1:ni),stat=jerr) if(jerr.ne.0) return allocate(is(1:max(nc,ni)),stat=jerr) if(jerr.ne.0) return allocate(sxp(1:no),stat=jerr) if(jerr.ne.0) return allocate(sxpl(1:no),stat=jerr) if(jerr.ne.0) return allocate(di(1:no),stat=jerr) if(jerr.ne.0) return allocate(ga(1:ni),stat=jerr) if(jerr.ne.0) return allocate(ixx(1:ni),stat=jerr) if(jerr.ne.0) return pmax=1.0-pmin emin=pmin/pmax emax=1.0/emin pfm=(1.0+pmin)*pmin pfx=(1.0-pmin)*pmax vmin=pfm*pmax bta=parm omb=1.0-bta dev1=0.0 dev0=0.0 do 13361 ic=1,nc q0=dot_product(w,y(:,ic)) if(q0 .gt. pmin)goto 13381 jerr =8000+ic return 13381 continue if(q0 .lt. 1.0-pmin)goto 13401 jerr =9000+ic return 13401 continue if(intr .ne. 0)goto 13421 q0=1.0/nc b(0,ic)=0.0 goto 13431 13421 continue b(0,ic)=log(q0) dev1=dev1-q0*b(0,ic) 13431 continue continue b(1:ni,ic)=0.0 13361 continue continue if(intr.eq.0) dev1=log(float(nc)) ixx=0 al=0.0 if(nonzero(no*nc,g) .ne. 0)goto 13451 b(0,:)=b(0,:)-sum(b(0,:))/nc sxp=0.0 do 13461 ic=1,nc q(:,ic)=exp(b(0,ic)) sxp=sxp+q(:,ic) 13461 continue continue goto 13471 13451 continue do 13481 i=1,no g(i,:)=g(i,:)-sum(g(i,:))/nc 13481 continue continue sxp=0.0 if(intr .ne. 0)goto 13501 b(0,:)=0.0 goto 13511 13501 continue call kazero(nc,no,y,g,w,b(0,:),jerr) if(jerr.ne.0) return 13511 continue continue dev1=0.0 do 13521 ic=1,nc q(:,ic)=b(0,ic)+g(:,ic) dev1=dev1-dot_product(w,y(:,ic)*q(:,ic)) q(:,ic)=exp(q(:,ic)) sxp=sxp+q(:,ic) 13521 continue continue sxpl=w*log(sxp) do 13531 ic=1,nc dev1=dev1+dot_product(y(:,ic),sxpl) 13531 continue continue 13471 continue continue do 13541 ic=1,nc do 13551 i=1,no if(y(i,ic).gt.0.0) dev0=dev0+w(i)*y(i,ic)*log(y(i,ic)) 13551 continue continue 13541 continue continue dev0=dev0+dev1 if(kopt .le. 0)goto 13571 if(isd .le. 0 .or. intr .eq. 0)goto 13591 xv=0.25 goto 13601 13591 continue do 13611 j=1,ni if(ju(j).ne.0) xv(j,:)=0.25*dot_product(w,x(:,j)**2) 13611 continue continue 13601 continue continue 13571 continue alf=1.0 if(flmin .ge. 1.0)goto 13631 eqs=max(eps,flmin) alf=eqs**(1.0/(nlam-1)) 13631 continue m=0 mm=0 nin=0 nlp=0 mnl=min(mnlam,nlam) bs=0.0 shr=shri*dev0 ga=0.0 do 13641 ic=1,nc r=w*(y(:,ic)-q(:,ic)/sxp) do 13651 j=1,ni if(ju(j).ne.0) ga(j)=max(ga(j),abs(dot_product(r,x(:,j)))) 13651 continue continue 13641 continue continue do 13661 ilm=1,nlam if(itrace.ne.0) call setpb(ilm-1) al0=al if(flmin .lt. 1.0)goto 13681 al=ulam(ilm) goto 13671 13681 if(ilm .le. 2)goto 13691 al=al*alf goto 13671 13691 if(ilm .ne. 1)goto 13701 al=big goto 13711 13701 continue al0=0.0 do 13721 j=1,ni if(ju(j).eq.0)goto 13721 if(vp(j).gt.0.0) al0=max(al0,ga(j)/vp(j)) 13721 continue continue al0=al0/max(bta,1.0d-3) al=alf*al0 13711 continue 13671 continue al2=al*omb al1=al*bta tlam=bta*(2.0*al-al0) do 13731 k=1,ni if(ixx(k).eq.1)goto 13731 if(ju(k).eq.0)goto 13731 if(ga(k).gt.tlam*vp(k)) ixx(k)=1 13731 continue continue 10880 continue continue 13741 continue ix=0 jx=ix ig=0 do 13751 ic=1,nc bs(0,ic)=b(0,ic) if(nin.gt.0) bs(m(1:nin),ic)=b(m(1:nin),ic) xmz=0.0 do 13761 i=1,no pic=q(i,ic)/sxp(i) if(pic .ge. pfm)goto 13781 pic=0.0 v(i)=0.0 goto 13771 13781 if(pic .le. pfx)goto 13791 pic=1.0 v(i)=0.0 goto 13801 13791 continue v(i)=w(i)*pic*(1.0-pic) xmz=xmz+v(i) 13801 continue 13771 continue r(i)=w(i)*(y(i,ic)-pic) 13761 continue continue if(xmz.le.vmin)goto 13751 ig=1 if(kopt .ne. 0)goto 13821 do 13831 j=1,ni if(ixx(j).gt.0) xv(j,ic)=dot_product(v,x(:,j)**2) 13831 continue continue 13821 continue continue 13841 continue nlp=nlp+1 dlx=0.0 do 13851 k=1,ni if(ixx(k).eq.0)goto 13851 bk=b(k,ic) gk=dot_product(r,x(:,k)) u=gk+xv(k,ic)*b(k,ic) au=abs(u)-vp(k)*al1 if(au .gt. 0.0)goto 13871 b(k,ic)=0.0 goto 13881 13871 continue b(k,ic)=max(cl(1,k),min(cl(2,k),sign(au,u)/ (xv(k,ic)+vp(k)*al2)) *) 13881 continue continue d=b(k,ic)-bk if(abs(d).le.0.0)goto 13851 dlx=max(dlx,xv(k,ic)*d**2) r=r-d*v*x(:,k) if(mm(k) .ne. 0)goto 13901 nin=nin+1 if(nin .le. nx)goto 13921 jx=1 goto 13852 13921 continue mm(k)=nin m(nin)=k 13901 continue 13851 continue 13852 continue if(jx.gt.0)goto 13842 d=0.0 if(intr.ne.0) d=sum(r)/xmz if(d .eq. 0.0)goto 13941 b(0,ic)=b(0,ic)+d dlx=max(dlx,xmz*d**2) r=r-d*v 13941 continue if(dlx.lt.shr)goto 13842 if(nlp .le. maxit)goto 13961 jerr=-ilm return 13961 continue continue 13971 continue nlp=nlp+1 dlx=0.0 do 13981 l=1,nin k=m(l) bk=b(k,ic) gk=dot_product(r,x(:,k)) u=gk+xv(k,ic)*b(k,ic) au=abs(u)-vp(k)*al1 if(au .gt. 0.0)goto 14001 b(k,ic)=0.0 goto 14011 14001 continue b(k,ic)=max(cl(1,k),min(cl(2,k),sign(au,u)/ (xv(k,ic)+vp(k)*al2)) *) 14011 continue continue d=b(k,ic)-bk if(abs(d).le.0.0)goto 13981 dlx=max(dlx,xv(k,ic)*d**2) r=r-d*v*x(:,k) 13981 continue continue d=0.0 if(intr.ne.0) d=sum(r)/xmz if(d .eq. 0.0)goto 14031 b(0,ic)=b(0,ic)+d dlx=max(dlx,xmz*d**2) r=r-d*v 14031 continue if(dlx.lt.shr)goto 13972 if(nlp .le. maxit)goto 14051 jerr=-ilm return 14051 continue goto 13971 13972 continue goto 13841 13842 continue if(jx.gt.0)goto 13752 if(xmz*(b(0,ic)-bs(0,ic))**2.gt.shr) ix=1 if(ix .ne. 0)goto 14071 do 14081 j=1,nin k=m(j) if(xv(k,ic)*(b(k,ic)-bs(k,ic))**2 .le. shr)goto 14101 ix=1 goto 14082 14101 continue 14081 continue 14082 continue 14071 continue do 14111 i=1,no fi=b(0,ic)+g(i,ic) if(nin.gt.0) fi=fi+dot_product(b(m(1:nin),ic),x(i,m(1:nin))) fi=min(max(exmn,fi),exmx) sxp(i)=sxp(i)-q(i,ic) q(i,ic)=min(max(emin*sxp(i),exp(fi)),emax*sxp(i)) sxp(i)=sxp(i)+q(i,ic) 14111 continue continue 13751 continue 13752 continue s=-sum(b(0,:))/nc b(0,:)=b(0,:)+s di=s do 14121 j=1,nin l=m(j) if(vp(l) .gt. 0.0)goto 14141 s=sum(b(l,:))/nc goto 14151 14141 continue s=elc(parm,nc,cl(:,l),b(l,:),is) 14151 continue continue b(l,:)=b(l,:)-s di=di-s*x(:,l) 14121 continue continue di=exp(di) sxp=sxp*di do 14161 ic=1,nc q(:,ic)=q(:,ic)*di 14161 continue continue if(jx.gt.0)goto 13742 if(ig.eq.0)goto 13742 if(ix .ne. 0)goto 14181 do 14191 k=1,ni if(ixx(k).eq.1)goto 14191 if(ju(k).eq.0)goto 14191 ga(k)=0.0 14191 continue continue do 14201 ic=1,nc r=w*(y(:,ic)-q(:,ic)/sxp) do 14211 k=1,ni if(ixx(k).eq.1)goto 14211 if(ju(k).eq.0)goto 14211 ga(k)=max(ga(k),abs(dot_product(r,x(:,k)))) 14211 continue continue 14201 continue continue do 14221 k=1,ni if(ixx(k).eq.1)goto 14221 if(ju(k).eq.0)goto 14221 if(ga(k) .le. al1*vp(k))goto 14241 ixx(k)=1 ix=1 14241 continue 14221 continue continue if(ix.eq.1) go to 10880 goto 13742 14181 continue goto 13741 13742 continue if(jx .le. 0)goto 14261 jerr=-10000-ilm goto 13662 14261 continue devi=0.0 do 14271 ic=1,nc if(nin.gt.0) a(1:nin,ic,ilm)=b(m(1:nin),ic) a0(ic,ilm)=b(0,ic) do 14281 i=1,no if(y(i,ic).le.0.0)goto 14281 devi=devi-w(i)*y(i,ic)*log(q(i,ic)/sxp(i)) 14281 continue continue 14271 continue continue kin(ilm)=nin alm(ilm)=al lmu=ilm dev(ilm)=(dev1-devi)/dev0 if(ig.eq.0)goto 13662 if(ilm.lt.mnl)goto 13661 if(flmin.ge.1.0)goto 13661 if(nintot(ni,nx,nc,a(1,1,ilm),m,nin,is).gt.ne)goto 13662 if(dev(ilm).gt.devmax)goto 13662 if(dev(ilm)-dev(ilm-1).lt.sml)goto 13662 13661 continue 13662 continue g=log(q) do 14291 i=1,no g(i,:)=g(i,:)-sum(g(i,:))/nc 14291 continue continue deallocate(sxp,b,bs,v,r,xv,q,mm,is,ga,ixx) return end subroutine kazero(kk,n,y,g,q,az,jerr) implicit double precision(a-h,o-z) parameter(eps=1.0d-7) double precision y(n,kk),g(n,kk),q(n),az(kk) double precision, dimension (:), allocatable :: s double precision, dimension (:,:), allocatable :: e allocate(e(1:n,1:kk),stat=jerr) if(jerr.ne.0) return allocate(s(1:n),stat=jerr) if(jerr.ne.0) return az=0.0 e=exp(g) do 14301 i=1,n s(i)=sum(e(i,:)) 14301 continue continue continue 14311 continue dm=0.0 do 14321 k=1,kk t=0.0 u=t do 14331 i=1,n pik=e(i,k)/s(i) t=t+q(i)*(y(i,k)-pik) u=u+q(i)*pik*(1.0-pik) 14331 continue continue d=t/u az(k)=az(k)+d ed=exp(d) dm=max(dm,abs(d)) do 14341 i=1,n z=e(i,k) e(i,k)=z*ed s(i)=s(i)-z+e(i,k) 14341 continue continue 14321 continue continue if(dm.lt.eps)goto 14312 goto 14311 14312 continue az=az-sum(az)/kk deallocate(e,s) return end function elc(parm,n,cl,a,m) implicit double precision(a-h,o-z) double precision a(n),cl(2) integer m(n) fn=n am=sum(a)/fn if((parm .ne. 0.0) .and. (n .ne. 2))goto 14361 elc=am go to 14370 14361 continue do 14381 i=1,n m(i)=i 14381 continue continue call psort7(a,m,1,n) if(a(m(1)) .ne. a(m(n)))goto 14401 elc=a(1) go to 14370 14401 continue if(mod(n,2) .ne. 1)goto 14421 ad=a(m(n/2+1)) goto 14431 14421 continue ad=0.5*(a(m(n/2+1))+a(m(n/2))) 14431 continue continue if(parm .ne. 1.0)goto 14451 elc=ad go to 14370 14451 continue b1=min(am,ad) b2=max(am,ad) k2=1 continue 14461 if(a(m(k2)).gt.b1)goto 14462 k2=k2+1 goto 14461 14462 continue k1=k2-1 continue 14471 if(a(m(k2)).ge.b2)goto 14472 k2=k2+1 goto 14471 14472 continue r=parm/((1.0-parm)*fn) is=0 sm=n-2*(k1-1) do 14481 k=k1,k2-1 sm=sm-2.0 s=r*sm+am if(s .le. a(m(k)) .or. s .gt. a(m(k+1)))goto 14501 is=k goto 14482 14501 continue 14481 continue 14482 continue if(is .eq. 0)goto 14521 elc=s go to 14370 14521 continue r2=2.0*r s1=a(m(k1)) am2=2.0*am cri=r2*sum(abs(a-s1))+s1*(s1-am2) elc=s1 do 14531 k=k1+1,k2 s=a(m(k)) if(s.eq.s1)goto 14531 c=r2*sum(abs(a-s))+s*(s-am2) if(c .ge. cri)goto 14551 cri=c elc=s 14551 continue s1=s 14531 continue continue 14370 continue elc=max(maxval(a-cl(2)),min(minval(a-cl(1)),elc)) return end function nintot(ni,nx,nc,a,m,nin,is) implicit double precision(a-h,o-z) double precision a(nx,nc) integer m(nx),is(ni) is=0 nintot=0 do 14561 ic=1,nc do 14571 j=1,nin k=m(j) if(is(k).ne.0)goto 14571 if(a(j,ic).eq.0.0)goto 14571 is(k)=k nintot=nintot+1 14571 continue continue 14561 continue continue return end subroutine luncomp(ni,nx,nc,ca,ia,nin,a) implicit double precision(a-h,o-z) double precision ca(nx,nc),a(ni,nc) integer ia(nx) a=0.0 do 14581 ic=1,nc if(nin.gt.0) a(ia(1:nin),ic)=ca(1:nin,ic) 14581 continue continue return end subroutine lmodval(nt,x,nc,nx,a0,ca,ia,nin,ans) implicit double precision(a-h,o-z) double precision a0(nc),ca(nx,nc),x(nt,*),ans(nc,nt) integer ia(nx) do 14591 i=1,nt do 14601 ic=1,nc ans(ic,i)=a0(ic) if(nin.gt.0) ans(ic,i)=ans(ic,i)+dot_product(ca(1:nin,ic),x(i,ia(1 *:nin))) 14601 continue continue 14591 continue continue return end subroutine splognet(parm,no,ni,nc,x,ix,jx,y,g,jd,vp,cl,ne,nx,nlam, *flmin, ulam,thr,isd,intr,maxit,kopt,lmu,a0,ca,ia,nin,dev0,dev,alm *,nlp,jerr) implicit double precision(a-h,o-z) double precision x(*),y(no,max(2,nc)),g(no,nc),vp(ni),ulam(nlam) double precision ca(nx,nc,nlam),a0(nc,nlam),dev(nlam),alm(nlam),cl *(2,ni) integer ix(*),jx(*),jd(*),ia(nx),nin(nlam) double precision, dimension (:), allocatable :: xm,xs,ww,vq,xv integer, dimension (:), allocatable :: ju if(maxval(vp) .gt. 0.0)goto 14621 jerr=10000 return 14621 continue allocate(ww(1:no),stat=jerr) if(jerr.ne.0) return allocate(ju(1:ni),stat=jerr) if(jerr.ne.0) return allocate(vq(1:ni),stat=jerr) if(jerr.ne.0) return allocate(xm(1:ni),stat=jerr) if(jerr.ne.0) return allocate(xs(1:ni),stat=jerr) if(jerr.ne.0) return if(kopt .ne. 2)goto 14641 allocate(xv(1:ni),stat=jerr) if(jerr.ne.0) return 14641 continue call spchkvars(no,ni,x,ix,ju) if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 if(maxval(ju) .gt. 0)goto 14661 jerr=7777 return 14661 continue vq=max(0d0,vp) vq=vq*ni/sum(vq) do 14671 i=1,no ww(i)=sum(y(i,:)) if(ww(i).gt.0.0) y(i,:)=y(i,:)/ww(i) 14671 continue continue sw=sum(ww) ww=ww/sw if(nc .ne. 1)goto 14691 call splstandard2(no,ni,x,ix,jx,ww,ju,isd,intr,xm,xs) if(isd .le. 0)goto 14711 do 14721 j=1,ni cl(:,j)=cl(:,j)*xs(j) 14721 continue continue 14711 continue call sprlognet2n(parm,no,ni,x,ix,jx,y(:,1),g(:,1),ww,ju,vq,cl,ne,n *x,nlam, flmin,ulam,thr,isd,intr,maxit,kopt,xm,xs,lmu,a0,ca,ia,nin *,dev0,dev, alm,nlp,jerr) goto 14681 14691 if(kopt .ne. 2)goto 14731 call multsplstandard2(no,ni,x,ix,jx,ww,ju,isd,intr,xm,xs,xv) if(isd .le. 0)goto 14751 do 14761 j=1,ni cl(:,j)=cl(:,j)*xs(j) 14761 continue continue 14751 continue call multsprlognetn(parm,no,ni,nc,x,ix,jx,y,g,ww,ju,vq,cl,ne,nx,nl *am,flmin, ulam,thr,intr,maxit,xv,xm,xs,lmu,a0,ca,ia,nin,dev0,dev, *alm,nlp,jerr) goto 14771 14731 continue call splstandard2(no,ni,x,ix,jx,ww,ju,isd,intr,xm,xs) if(isd .le. 0)goto 14791 do 14801 j=1,ni cl(:,j)=cl(:,j)*xs(j) 14801 continue continue 14791 continue call sprlognetn(parm,no,ni,nc,x,ix,jx,y,g,ww,ju,vq,cl,ne,nx,nlam,f *lmin, ulam,thr,isd,intr,maxit,kopt,xm,xs,lmu,a0,ca, ia,nin,dev0, *dev,alm,nlp,jerr) 14771 continue 14681 continue if(jerr.gt.0) return dev0=2.0*sw*dev0 do 14811 k=1,lmu nk=nin(k) do 14821 ic=1,nc if(isd .le. 0)goto 14841 do 14851 l=1,nk ca(l,ic,k)=ca(l,ic,k)/xs(ia(l)) 14851 continue continue 14841 continue if(intr .ne. 0)goto 14871 a0(ic,k)=0.0 goto 14881 14871 continue a0(ic,k)=a0(ic,k)-dot_product(ca(1:nk,ic,k),xm(ia(1:nk))) 14881 continue continue 14821 continue continue 14811 continue continue deallocate(ww,ju,vq,xm,xs) if(kopt.eq.2) deallocate(xv) return end subroutine multsplstandard2(no,ni,x,ix,jx,w,ju,isd,intr,xm,xs,xv) implicit double precision(a-h,o-z) double precision x(*),w(no),xm(ni),xs(ni),xv(ni) integer ix(*),jx(*),ju(ni) if(intr .ne. 0)goto 14901 do 14911 j=1,ni if(ju(j).eq.0)goto 14911 xm(j)=0.0 jb=ix(j) je=ix(j+1)-1 xv(j)=dot_product(w(jx(jb:je)),x(jb:je)**2) if(isd .eq. 0)goto 14931 xbq=dot_product(w(jx(jb:je)),x(jb:je))**2 vc=xv(j)-xbq xs(j)=sqrt(vc) xv(j)=1.0+xbq/vc goto 14941 14931 continue xs(j)=1.0 14941 continue continue 14911 continue continue return 14901 continue do 14951 j=1,ni if(ju(j).eq.0)goto 14951 jb=ix(j) je=ix(j+1)-1 xm(j)=dot_product(w(jx(jb:je)),x(jb:je)) xv(j)=dot_product(w(jx(jb:je)),x(jb:je)**2)-xm(j)**2 if(isd .le. 0)goto 14971 xs(j)=sqrt(xv(j)) xv(j)=1.0 14971 continue 14951 continue continue if(isd.eq.0) xs=1.0 return end subroutine splstandard2(no,ni,x,ix,jx,w,ju,isd,intr,xm,xs) implicit double precision(a-h,o-z) double precision x(*),w(no),xm(ni),xs(ni) integer ix(*),jx(*),ju(ni) if(intr .ne. 0)goto 14991 do 15001 j=1,ni if(ju(j).eq.0)goto 15001 xm(j)=0.0 jb=ix(j) je=ix(j+1)-1 if(isd .eq. 0)goto 15021 vc=dot_product(w(jx(jb:je)),x(jb:je)**2) -dot_product(w(jx(jb:je) *),x(jb:je))**2 xs(j)=sqrt(vc) goto 15031 15021 continue xs(j)=1.0 15031 continue continue 15001 continue continue return 14991 continue do 15041 j=1,ni if(ju(j).eq.0)goto 15041 jb=ix(j) je=ix(j+1)-1 xm(j)=dot_product(w(jx(jb:je)),x(jb:je)) if(isd.ne.0) xs(j)=sqrt(dot_product(w(jx(jb:je)),x(jb:je)**2)-xm(j *)**2) 15041 continue continue if(isd.eq.0) xs=1.0 return end subroutine sprlognet2n(parm,no,ni,x,ix,jx,y,g,w,ju,vp,cl,ne,nx,nla *m, flmin,ulam,shri,isd,intr,maxit,kopt,xb,xs, lmu,a0,a,m,kin,dev *0,dev,alm,nlp,jerr) implicit double precision(a-h,o-z) double precision x(*),y(no),g(no),w(no),vp(ni),ulam(nlam),cl(2,ni) double precision a(nx,nlam),a0(nlam),dev(nlam),alm(nlam) double precision xb(ni),xs(ni) integer ix(*),jx(*),ju(ni),m(nx),kin(nlam) double precision, dimension (:), allocatable :: xm,b,bs,v,r double precision, dimension (:), allocatable :: sc,xv,q,ga integer, dimension (:), allocatable :: mm,ixx call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx,itrace) allocate(b(0:ni),stat=jerr) if(jerr.ne.0) return allocate(xm(0:ni),stat=jerr) if(jerr.ne.0) return allocate(xv(1:ni),stat=jerr) if(jerr.ne.0) return allocate(bs(0:ni),stat=jerr) if(jerr.ne.0) return allocate(ga(1:ni),stat=jerr) if(jerr.ne.0) return allocate(mm(1:ni),stat=jerr) if(jerr.ne.0) return allocate(ixx(1:ni),stat=jerr) if(jerr.ne.0) return allocate(q(1:no),stat=jerr) if(jerr.ne.0) return allocate(r(1:no),stat=jerr) if(jerr.ne.0) return allocate(v(1:no),stat=jerr) if(jerr.ne.0) return allocate(sc(1:no),stat=jerr) if(jerr.ne.0) return fmax=log(1.0/pmin-1.0) fmin=-fmax vmin=(1.0+pmin)*pmin*(1.0-pmin) bta=parm omb=1.0-bta q0=dot_product(w,y) if(q0 .gt. pmin)goto 15061 jerr=8001 return 15061 continue if(q0 .lt. 1.0-pmin)goto 15081 jerr=9001 return 15081 continue if(intr.eq.0) q0=0.5 bz=0.0 if(intr.ne.0) bz=log(q0/(1.0-q0)) if(nonzero(no,g) .ne. 0)goto 15101 vi=q0*(1.0-q0) b(0)=bz v=vi*w r=w*(y-q0) q=q0 xm(0)=vi dev1=-(bz*q0+log(1.0-q0)) goto 15111 15101 continue b(0)=0.0 if(intr .eq. 0)goto 15131 b(0)=azero(no,y,g,w,jerr) if(jerr.ne.0) return 15131 continue q=1.0/(1.0+exp(-b(0)-g)) v=w*q*(1.0-q) r=w*(y-q) xm(0)=sum(v) dev1=-(b(0)*q0+dot_product(w,y*g+log(1.0-q))) 15111 continue continue if(kopt .le. 0)goto 15151 if(isd .le. 0 .or. intr .eq. 0)goto 15171 xv=0.25 goto 15181 15171 continue do 15191 j=1,ni if(ju(j).eq.0)goto 15191 jb=ix(j) je=ix(j+1)-1 xv(j)=0.25*(dot_product(w(jx(jb:je)),x(jb:je)**2)-xb(j)**2) 15191 continue continue 15181 continue continue 15151 continue b(1:ni)=0.0 dev0=dev1 do 15201 i=1,no if(y(i).gt.0.0) dev0=dev0+w(i)*y(i)*log(y(i)) if(y(i).lt.1.0) dev0=dev0+w(i)*(1.0-y(i))*log(1.0-y(i)) 15201 continue continue alf=1.0 if(flmin .ge. 1.0)goto 15221 eqs=max(eps,flmin) alf=eqs**(1.0/(nlam-1)) 15221 continue m=0 mm=0 nin=0 o=0.0 svr=o mnl=min(mnlam,nlam) bs=0.0 nlp=0 nin=nlp shr=shri*dev0 al=0.0 ixx=0 do 15231 j=1,ni if(ju(j).eq.0)goto 15231 jb=ix(j) je=ix(j+1)-1 jn=ix(j+1)-ix(j) sc(1:jn)=r(jx(jb:je))+v(jx(jb:je))*o gj=dot_product(sc(1:jn),x(jb:je)) ga(j)=abs((gj-svr*xb(j))/xs(j)) 15231 continue continue do 15241 ilm=1,nlam if(itrace.ne.0) call setpb(ilm-1) al0=al if(flmin .lt. 1.0)goto 15261 al=ulam(ilm) goto 15251 15261 if(ilm .le. 2)goto 15271 al=al*alf goto 15251 15271 if(ilm .ne. 1)goto 15281 al=big goto 15291 15281 continue al0=0.0 do 15301 j=1,ni if(ju(j).eq.0)goto 15301 if(vp(j).gt.0.0) al0=max(al0,ga(j)/vp(j)) 15301 continue continue al0=al0/max(bta,1.0d-3) al=alf*al0 15291 continue 15251 continue al2=al*omb al1=al*bta tlam=bta*(2.0*al-al0) do 15311 k=1,ni if(ixx(k).eq.1)goto 15311 if(ju(k).eq.0)goto 15311 if(ga(k).gt.tlam*vp(k)) ixx(k)=1 15311 continue continue 10880 continue continue 15321 continue bs(0)=b(0) if(nin.gt.0) bs(m(1:nin))=b(m(1:nin)) do 15331 j=1,ni if(ixx(j).eq.0)goto 15331 jb=ix(j) je=ix(j+1)-1 jn=ix(j+1)-ix(j) sc(1:jn)=v(jx(jb:je)) xm(j)=dot_product(sc(1:jn),x(jb:je)) if(kopt .ne. 0)goto 15351 xv(j)=dot_product(sc(1:jn),x(jb:je)**2) xv(j)=(xv(j)-2.0*xb(j)*xm(j)+xm(0)*xb(j)**2)/xs(j)**2 15351 continue 15331 continue continue continue 15361 continue nlp=nlp+1 dlx=0.0 do 15371 k=1,ni if(ixx(k).eq.0)goto 15371 jb=ix(k) je=ix(k+1)-1 jn=ix(k+1)-ix(k) bk=b(k) sc(1:jn)=r(jx(jb:je))+v(jx(jb:je))*o gk=dot_product(sc(1:jn),x(jb:je)) gk=(gk-svr*xb(k))/xs(k) u=gk+xv(k)*b(k) au=abs(u)-vp(k)*al1 if(au .gt. 0.0)goto 15391 b(k)=0.0 goto 15401 15391 continue b(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(xv(k)+vp(k)*al2))) 15401 continue continue d=b(k)-bk if(abs(d).le.0.0)goto 15371 dlx=max(dlx,xv(k)*d**2) if(mm(k) .ne. 0)goto 15421 nin=nin+1 if(nin.gt.nx)goto 15372 mm(k)=nin m(nin)=k sc(1:jn)=v(jx(jb:je)) xm(k)=dot_product(sc(1:jn),x(jb:je)) 15421 continue r(jx(jb:je))=r(jx(jb:je))-d*v(jx(jb:je))*x(jb:je)/xs(k) o=o+d*(xb(k)/xs(k)) svr=svr-d*(xm(k)-xb(k)*xm(0))/xs(k) 15371 continue 15372 continue if(nin.gt.nx)goto 15362 d=0.0 if(intr.ne.0) d=svr/xm(0) if(d .eq. 0.0)goto 15441 b(0)=b(0)+d dlx=max(dlx,xm(0)*d**2) r=r-d*v svr=svr-d*xm(0) 15441 continue if(dlx.lt.shr)goto 15362 if(nlp .le. maxit)goto 15461 jerr=-ilm return 15461 continue continue 15471 continue nlp=nlp+1 dlx=0.0 do 15481 l=1,nin k=m(l) jb=ix(k) je=ix(k+1)-1 jn=ix(k+1)-ix(k) bk=b(k) sc(1:jn)=r(jx(jb:je))+v(jx(jb:je))*o gk=dot_product(sc(1:jn),x(jb:je)) gk=(gk-svr*xb(k))/xs(k) u=gk+xv(k)*b(k) au=abs(u)-vp(k)*al1 if(au .gt. 0.0)goto 15501 b(k)=0.0 goto 15511 15501 continue b(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(xv(k)+vp(k)*al2))) 15511 continue continue d=b(k)-bk if(abs(d).le.0.0)goto 15481 dlx=max(dlx,xv(k)*d**2) r(jx(jb:je))=r(jx(jb:je))-d*v(jx(jb:je))*x(jb:je)/xs(k) o=o+d*(xb(k)/xs(k)) svr=svr-d*(xm(k)-xb(k)*xm(0))/xs(k) 15481 continue continue d=0.0 if(intr.ne.0) d=svr/xm(0) if(d .eq. 0.0)goto 15531 b(0)=b(0)+d dlx=max(dlx,xm(0)*d**2) r=r-d*v svr=svr-d*xm(0) 15531 continue if(dlx.lt.shr)goto 15472 if(nlp .le. maxit)goto 15551 jerr=-ilm return 15551 continue goto 15471 15472 continue goto 15361 15362 continue if(nin.gt.nx)goto 15322 sc=b(0) b0=0.0 do 15561 j=1,nin l=m(j) jb=ix(l) je=ix(l+1)-1 sc(jx(jb:je))=sc(jx(jb:je))+b(l)*x(jb:je)/xs(l) b0=b0-b(l)*xb(l)/xs(l) 15561 continue continue sc=sc+b0 do 15571 i=1,no fi=sc(i)+g(i) if(fi .ge. fmin)goto 15591 q(i)=0.0 goto 15581 15591 if(fi .le. fmax)goto 15601 q(i)=1.0 goto 15611 15601 continue q(i)=1.0/(1.0+exp(-fi)) 15611 continue 15581 continue 15571 continue continue v=w*q*(1.0-q) xm(0)=sum(v) if(xm(0).lt.vmin)goto 15322 r=w*(y-q) svr=sum(r) o=0.0 if(xm(0)*(b(0)-bs(0))**2 .ge. shr)goto 15631 kx=0 do 15641 j=1,nin k=m(j) if(xv(k)*(b(k)-bs(k))**2.lt.shr)goto 15641 kx=1 goto 15642 15641 continue 15642 continue if(kx .ne. 0)goto 15661 do 15671 j=1,ni if(ixx(j).eq.1)goto 15671 if(ju(j).eq.0)goto 15671 jb=ix(j) je=ix(j+1)-1 jn=ix(j+1)-ix(j) sc(1:jn)=r(jx(jb:je))+v(jx(jb:je))*o gj=dot_product(sc(1:jn),x(jb:je)) ga(j)=abs((gj-svr*xb(j))/xs(j)) if(ga(j) .le. al1*vp(j))goto 15691 ixx(j)=1 kx=1 15691 continue 15671 continue continue if(kx.eq.1) go to 10880 goto 15322 15661 continue 15631 continue goto 15321 15322 continue if(nin .le. nx)goto 15711 jerr=-10000-ilm goto 15242 15711 continue if(nin.gt.0) a(1:nin,ilm)=b(m(1:nin)) kin(ilm)=nin a0(ilm)=b(0) alm(ilm)=al lmu=ilm devi=dev2(no,w,y,q,pmin) dev(ilm)=(dev1-devi)/dev0 if(ilm.lt.mnl)goto 15241 if(flmin.ge.1.0)goto 15241 me=0 do 15721 j=1,nin if(a(j,ilm).ne.0.0) me=me+1 15721 continue continue if(me.gt.ne)goto 15242 if(dev(ilm).gt.devmax)goto 15242 if(dev(ilm)-dev(ilm-1).lt.sml)goto 15242 if(xm(0).lt.vmin)goto 15242 15241 continue 15242 continue g=log(q/(1.0-q)) deallocate(xm,b,bs,v,r,sc,xv,q,mm,ga,ixx) return end subroutine sprlognetn(parm,no,ni,nc,x,ix,jx,y,g,w,ju,vp,cl,ne,nx,n *lam,flmin, ulam,shri,isd,intr,maxit,kopt,xb,xs,lmu,a0,a,m,kin,dev *0,dev,alm,nlp,jerr) implicit double precision(a-h,o-z) double precision x(*),y(no,nc),g(no,nc),w(no),vp(ni),ulam(nlam),xb *(ni),xs(ni) double precision a(nx,nc,nlam),a0(nc,nlam),dev(nlam),alm(nlam),cl( *2,ni) integer ix(*),jx(*),ju(ni),m(nx),kin(nlam) double precision, dimension (:,:), allocatable :: q double precision, dimension (:), allocatable :: sxp,sxpl double precision, dimension (:), allocatable :: sc,xm,v,r,ga double precision, dimension (:,:), allocatable :: b,bs,xv integer, dimension (:), allocatable :: mm,is,iy allocate(b(0:ni,1:nc),stat=jerr) if(jerr.ne.0) return allocate(xv(1:ni,1:nc),stat=jerr) if(jerr.ne.0) return allocate(bs(0:ni,1:nc),stat=jerr) if(jerr.ne.0) return allocate(q(1:no,1:nc),stat=jerr) if(jerr.ne.0) return call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx,itrace) exmn=-exmx allocate(xm(0:ni),stat=jerr) if(jerr.ne.0) return allocate(r(1:no),stat=jerr) if(jerr.ne.0) return allocate(v(1:no),stat=jerr) if(jerr.ne.0) return allocate(mm(1:ni),stat=jerr) if(jerr.ne.0) return allocate(ga(1:ni),stat=jerr) if(jerr.ne.0) return allocate(iy(1:ni),stat=jerr) if(jerr.ne.0) return allocate(is(1:max(nc,ni)),stat=jerr) if(jerr.ne.0) return allocate(sxp(1:no),stat=jerr) if(jerr.ne.0) return allocate(sxpl(1:no),stat=jerr) if(jerr.ne.0) return allocate(sc(1:no),stat=jerr) if(jerr.ne.0) return pmax=1.0-pmin emin=pmin/pmax emax=1.0/emin pfm=(1.0+pmin)*pmin pfx=(1.0-pmin)*pmax vmin=pfm*pmax bta=parm omb=1.0-bta dev1=0.0 dev0=0.0 do 15731 ic=1,nc q0=dot_product(w,y(:,ic)) if(q0 .gt. pmin)goto 15751 jerr =8000+ic return 15751 continue if(q0 .lt. 1.0-pmin)goto 15771 jerr =9000+ic return 15771 continue if(intr.eq.0) q0=1.0/nc b(1:ni,ic)=0.0 b(0,ic)=0.0 if(intr .eq. 0)goto 15791 b(0,ic)=log(q0) dev1=dev1-q0*b(0,ic) 15791 continue 15731 continue continue if(intr.eq.0) dev1=log(float(nc)) iy=0 al=0.0 if(nonzero(no*nc,g) .ne. 0)goto 15811 b(0,:)=b(0,:)-sum(b(0,:))/nc sxp=0.0 do 15821 ic=1,nc q(:,ic)=exp(b(0,ic)) sxp=sxp+q(:,ic) 15821 continue continue goto 15831 15811 continue do 15841 i=1,no g(i,:)=g(i,:)-sum(g(i,:))/nc 15841 continue continue sxp=0.0 if(intr .ne. 0)goto 15861 b(0,:)=0.0 goto 15871 15861 continue call kazero(nc,no,y,g,w,b(0,:),jerr) if(jerr.ne.0) return 15871 continue continue dev1=0.0 do 15881 ic=1,nc q(:,ic)=b(0,ic)+g(:,ic) dev1=dev1-dot_product(w,y(:,ic)*q(:,ic)) q(:,ic)=exp(q(:,ic)) sxp=sxp+q(:,ic) 15881 continue continue sxpl=w*log(sxp) do 15891 ic=1,nc dev1=dev1+dot_product(y(:,ic),sxpl) 15891 continue continue 15831 continue continue do 15901 ic=1,nc do 15911 i=1,no if(y(i,ic).gt.0.0) dev0=dev0+w(i)*y(i,ic)*log(y(i,ic)) 15911 continue continue 15901 continue continue dev0=dev0+dev1 if(kopt .le. 0)goto 15931 if(isd .le. 0 .or. intr .eq. 0)goto 15951 xv=0.25 goto 15961 15951 continue do 15971 j=1,ni if(ju(j).eq.0)goto 15971 jb=ix(j) je=ix(j+1)-1 xv(j,:)=0.25*(dot_product(w(jx(jb:je)),x(jb:je)**2)-xb(j)**2) 15971 continue continue 15961 continue continue 15931 continue alf=1.0 if(flmin .ge. 1.0)goto 15991 eqs=max(eps,flmin) alf=eqs**(1.0/(nlam-1)) 15991 continue m=0 mm=0 nin=0 nlp=0 mnl=min(mnlam,nlam) bs=0.0 svr=0.0 o=0.0 shr=shri*dev0 ga=0.0 do 16001 ic=1,nc v=q(:,ic)/sxp r=w*(y(:,ic)-v) v=w*v*(1.0-v) do 16011 j=1,ni if(ju(j).eq.0)goto 16011 jb=ix(j) je=ix(j+1)-1 jn=ix(j+1)-ix(j) sc(1:jn)=r(jx(jb:je))+o*v(jx(jb:je)) gj=dot_product(sc(1:jn),x(jb:je)) ga(j)=max(ga(j),abs(gj-svr*xb(j))/xs(j)) 16011 continue continue 16001 continue continue do 16021 ilm=1,nlam if(itrace.ne.0) call setpb(ilm-1) al0=al if(flmin .lt. 1.0)goto 16041 al=ulam(ilm) goto 16031 16041 if(ilm .le. 2)goto 16051 al=al*alf goto 16031 16051 if(ilm .ne. 1)goto 16061 al=big goto 16071 16061 continue al0=0.0 do 16081 j=1,ni if(ju(j).eq.0)goto 16081 if(vp(j).gt.0.0) al0=max(al0,ga(j)/vp(j)) 16081 continue continue al0=al0/max(bta,1.0d-3) al=alf*al0 16071 continue 16031 continue al2=al*omb al1=al*bta tlam=bta*(2.0*al-al0) do 16091 k=1,ni if(iy(k).eq.1)goto 16091 if(ju(k).eq.0)goto 16091 if(ga(k).gt.tlam*vp(k)) iy(k)=1 16091 continue continue 10880 continue continue 16101 continue ixx=0 jxx=ixx ig=0 do 16111 ic=1,nc bs(0,ic)=b(0,ic) if(nin.gt.0) bs(m(1:nin),ic)=b(m(1:nin),ic) xm(0)=0.0 svr=0.0 o=0.0 do 16121 i=1,no pic=q(i,ic)/sxp(i) if(pic .ge. pfm)goto 16141 pic=0.0 v(i)=0.0 goto 16131 16141 if(pic .le. pfx)goto 16151 pic=1.0 v(i)=0.0 goto 16161 16151 continue v(i)=w(i)*pic*(1.0-pic) xm(0)=xm(0)+v(i) 16161 continue 16131 continue r(i)=w(i)*(y(i,ic)-pic) svr=svr+r(i) 16121 continue continue if(xm(0).le.vmin)goto 16111 ig=1 do 16171 j=1,ni if(iy(j).eq.0)goto 16171 jb=ix(j) je=ix(j+1)-1 xm(j)=dot_product(v(jx(jb:je)),x(jb:je)) if(kopt .ne. 0)goto 16191 xv(j,ic)=dot_product(v(jx(jb:je)),x(jb:je)**2) xv(j,ic)=(xv(j,ic)-2.0*xb(j)*xm(j)+xm(0)*xb(j)**2)/xs(j)**2 16191 continue 16171 continue continue continue 16201 continue nlp=nlp+1 dlx=0.0 do 16211 k=1,ni if(iy(k).eq.0)goto 16211 jb=ix(k) je=ix(k+1)-1 jn=ix(k+1)-ix(k) bk=b(k,ic) sc(1:jn)=r(jx(jb:je))+o*v(jx(jb:je)) gk=dot_product(sc(1:jn),x(jb:je)) gk=(gk-svr*xb(k))/xs(k) u=gk+xv(k,ic)*b(k,ic) au=abs(u)-vp(k)*al1 if(au .gt. 0.0)goto 16231 b(k,ic)=0.0 goto 16241 16231 continue b(k,ic)=max(cl(1,k),min(cl(2,k),sign(au,u)/ (xv(k,ic)+vp(k)*al2)) *) 16241 continue continue d=b(k,ic)-bk if(abs(d).le.0.0)goto 16211 dlx=max(dlx,xv(k,ic)*d**2) if(mm(k) .ne. 0)goto 16261 nin=nin+1 if(nin .le. nx)goto 16281 jxx=1 goto 16212 16281 continue mm(k)=nin m(nin)=k xm(k)=dot_product(v(jx(jb:je)),x(jb:je)) 16261 continue r(jx(jb:je))=r(jx(jb:je))-d*v(jx(jb:je))*x(jb:je)/xs(k) o=o+d*(xb(k)/xs(k)) svr=svr-d*(xm(k)-xb(k)*xm(0))/xs(k) 16211 continue 16212 continue if(jxx.gt.0)goto 16202 d=0.0 if(intr.ne.0) d=svr/xm(0) if(d .eq. 0.0)goto 16301 b(0,ic)=b(0,ic)+d dlx=max(dlx,xm(0)*d**2) r=r-d*v svr=svr-d*xm(0) 16301 continue if(dlx.lt.shr)goto 16202 if(nlp .le. maxit)goto 16321 jerr=-ilm return 16321 continue continue 16331 continue nlp=nlp+1 dlx=0.0 do 16341 l=1,nin k=m(l) jb=ix(k) je=ix(k+1)-1 jn=ix(k+1)-ix(k) bk=b(k,ic) sc(1:jn)=r(jx(jb:je))+o*v(jx(jb:je)) gk=dot_product(sc(1:jn),x(jb:je)) gk=(gk-svr*xb(k))/xs(k) u=gk+xv(k,ic)*b(k,ic) au=abs(u)-vp(k)*al1 if(au .gt. 0.0)goto 16361 b(k,ic)=0.0 goto 16371 16361 continue b(k,ic)=max(cl(1,k),min(cl(2,k),sign(au,u)/ (xv(k,ic)+vp(k)*al2)) *) 16371 continue continue d=b(k,ic)-bk if(abs(d).le.0.0)goto 16341 dlx=max(dlx,xv(k,ic)*d**2) r(jx(jb:je))=r(jx(jb:je))-d*v(jx(jb:je))*x(jb:je)/xs(k) o=o+d*(xb(k)/xs(k)) svr=svr-d*(xm(k)-xb(k)*xm(0))/xs(k) 16341 continue continue d=0.0 if(intr.ne.0) d=svr/xm(0) if(d .eq. 0.0)goto 16391 b(0,ic)=b(0,ic)+d dlx=max(dlx,xm(0)*d**2) r=r-d*v svr=svr-d*xm(0) 16391 continue if(dlx.lt.shr)goto 16332 if(nlp .le. maxit)goto 16411 jerr=-ilm return 16411 continue goto 16331 16332 continue goto 16201 16202 continue if(jxx.gt.0)goto 16112 if(xm(0)*(b(0,ic)-bs(0,ic))**2.gt.shr) ixx=1 if(ixx .ne. 0)goto 16431 do 16441 j=1,nin k=m(j) if(xv(k,ic)*(b(k,ic)-bs(k,ic))**2 .le. shr)goto 16461 ixx=1 goto 16442 16461 continue 16441 continue 16442 continue 16431 continue sc=b(0,ic)+g(:,ic) b0=0.0 do 16471 j=1,nin l=m(j) jb=ix(l) je=ix(l+1)-1 sc(jx(jb:je))=sc(jx(jb:je))+b(l,ic)*x(jb:je)/xs(l) b0=b0-b(l,ic)*xb(l)/xs(l) 16471 continue continue sc=min(max(exmn,sc+b0),exmx) sxp=sxp-q(:,ic) q(:,ic)=min(max(emin*sxp,exp(sc)),emax*sxp) sxp=sxp+q(:,ic) 16111 continue 16112 continue s=-sum(b(0,:))/nc b(0,:)=b(0,:)+s sc=s b0=0.0 do 16481 j=1,nin l=m(j) if(vp(l) .gt. 0.0)goto 16501 s=sum(b(l,:))/nc goto 16511 16501 continue s=elc(parm,nc,cl(:,l),b(l,:),is) 16511 continue continue b(l,:)=b(l,:)-s jb=ix(l) je=ix(l+1)-1 sc(jx(jb:je))=sc(jx(jb:je))-s*x(jb:je)/xs(l) b0=b0+s*xb(l)/xs(l) 16481 continue continue sc=sc+b0 sc=exp(sc) sxp=sxp*sc do 16521 ic=1,nc q(:,ic)=q(:,ic)*sc 16521 continue continue if(jxx.gt.0)goto 16102 if(ig.eq.0)goto 16102 if(ixx .ne. 0)goto 16541 do 16551 j=1,ni if(iy(j).eq.1)goto 16551 if(ju(j).eq.0)goto 16551 ga(j)=0.0 16551 continue continue do 16561 ic=1,nc v=q(:,ic)/sxp r=w*(y(:,ic)-v) v=w*v*(1.0-v) do 16571 j=1,ni if(iy(j).eq.1)goto 16571 if(ju(j).eq.0)goto 16571 jb=ix(j) je=ix(j+1)-1 jn=ix(j+1)-ix(j) sc(1:jn)=r(jx(jb:je))+o*v(jx(jb:je)) gj=dot_product(sc(1:jn),x(jb:je)) ga(j)=max(ga(j),abs(gj-svr*xb(j))/xs(j)) 16571 continue continue 16561 continue continue do 16581 k=1,ni if(iy(k).eq.1)goto 16581 if(ju(k).eq.0)goto 16581 if(ga(k) .le. al1*vp(k))goto 16601 iy(k)=1 ixx=1 16601 continue 16581 continue continue if(ixx.eq.1) go to 10880 goto 16102 16541 continue goto 16101 16102 continue if(jxx .le. 0)goto 16621 jerr=-10000-ilm goto 16022 16621 continue devi=0.0 do 16631 ic=1,nc if(nin.gt.0) a(1:nin,ic,ilm)=b(m(1:nin),ic) a0(ic,ilm)=b(0,ic) do 16641 i=1,no if(y(i,ic).le.0.0)goto 16641 devi=devi-w(i)*y(i,ic)*log(q(i,ic)/sxp(i)) 16641 continue continue 16631 continue continue kin(ilm)=nin alm(ilm)=al lmu=ilm dev(ilm)=(dev1-devi)/dev0 if(ig.eq.0)goto 16022 if(ilm.lt.mnl)goto 16021 if(flmin.ge.1.0)goto 16021 if(nintot(ni,nx,nc,a(1,1,ilm),m,nin,is).gt.ne)goto 16022 if(dev(ilm).gt.devmax)goto 16022 if(dev(ilm)-dev(ilm-1).lt.sml)goto 16022 16021 continue 16022 continue g=log(q) do 16651 i=1,no g(i,:)=g(i,:)-sum(g(i,:))/nc 16651 continue continue deallocate(sxp,b,bs,v,r,xv,q,mm,is,xm,sc,ga,iy) return end subroutine lcmodval(nc,nx,a0,ca,ia,nin,x,ix,jx,n,f) implicit double precision(a-h,o-z) double precision a0(nc),ca(nx,nc),x(*),f(nc,n) integer ia(*),ix(*),jx(*) do 16661 ic=1,nc f(ic,:)=a0(ic) 16661 continue continue do 16671 j=1,nin k=ia(j) kb=ix(k) ke=ix(k+1)-1 do 16681 ic=1,nc f(ic,jx(kb:ke))=f(ic,jx(kb:ke))+ca(j,ic)*x(kb:ke) 16681 continue continue 16671 continue continue return end subroutine coxnet(parm,no,ni,x,y,d,g,w,jd,vp,cl,ne,nx,nlam,flmin,u *lam,thr, maxit,isd,lmu,ca,ia,nin,dev0,dev,alm,nlp,jerr) implicit double precision(a-h,o-z) double precision x(no,ni),y(no),d(no),g(no),w(no),vp(ni),ulam(nlam *) double precision ca(nx,nlam),dev(nlam),alm(nlam),cl(2,ni) integer jd(*),ia(nx),nin(nlam) double precision, dimension (:), allocatable :: xs,ww,vq integer, dimension (:), allocatable :: ju if(maxval(vp) .gt. 0.0)goto 16701 jerr=10000 return 16701 continue allocate(ww(1:no),stat=jerr) if(jerr.ne.0) return allocate(ju(1:ni),stat=jerr) if(jerr.ne.0) return allocate(vq(1:ni),stat=jerr) if(jerr.ne.0) return if(isd .le. 0)goto 16721 allocate(xs(1:ni),stat=jerr) if(jerr.ne.0) return 16721 continue call chkvars(no,ni,x,ju) if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 if(maxval(ju) .gt. 0)goto 16741 jerr=7777 return 16741 continue vq=max(0d0,vp) vq=vq*ni/sum(vq) ww=max(0d0,w) sw=sum(ww) if(sw .gt. 0.0)goto 16761 jerr=9999 return 16761 continue ww=ww/sw call cstandard(no,ni,x,ww,ju,isd,xs) if(isd .le. 0)goto 16781 do 16791 j=1,ni cl(:,j)=cl(:,j)*xs(j) 16791 continue continue 16781 continue call coxnet1(parm,no,ni,x,y,d,g,ww,ju,vq,cl,ne,nx,nlam,flmin,ulam, *thr, isd,maxit,lmu,ca,ia,nin,dev0,dev,alm,nlp,jerr) if(jerr.gt.0) return dev0=2.0*sw*dev0 if(isd .le. 0)goto 16811 do 16821 k=1,lmu nk=nin(k) ca(1:nk,k)=ca(1:nk,k)/xs(ia(1:nk)) 16821 continue continue 16811 continue deallocate(ww,ju,vq) if(isd.gt.0) deallocate(xs) return end subroutine cstandard(no,ni,x,w,ju,isd,xs) implicit double precision(a-h,o-z) double precision x(no,ni),w(no),xs(ni) integer ju(ni) do 16831 j=1,ni if(ju(j).eq.0)goto 16831 xm=dot_product(w,x(:,j)) x(:,j)=x(:,j)-xm if(isd .le. 0)goto 16851 xs(j)=sqrt(dot_product(w,x(:,j)**2)) x(:,j)=x(:,j)/xs(j) 16851 continue 16831 continue continue return end subroutine coxnet1(parm,no,ni,x,y,d,g,q,ju,vp,cl,ne,nx,nlam,flmin, *ulam,cthri, isd,maxit,lmu,ao,m,kin,dev0,dev,alm,nlp,jerr) implicit double precision(a-h,o-z) double precision x(no,ni),y(no),q(no),d(no),g(no),vp(ni),ulam(nlam *) double precision ao(nx,nlam),dev(nlam),alm(nlam),cl(2,ni) integer ju(ni),m(nx),kin(nlam) double precision, dimension (:), allocatable :: w,dk,v,xs,wr double precision, dimension (:), allocatable :: a,as,f,dq double precision, dimension (:), allocatable :: e,uu,ga integer, dimension (:), allocatable :: jp,kp,mm,ixx call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx,itrace) isd = isd*1 sml=sml*100.0 devmax=devmax*0.99/0.999 allocate(e(1:no),stat=jerr) if(jerr.ne.0) return allocate(uu(1:no),stat=jerr) if(jerr.ne.0) return allocate(f(1:no),stat=jerr) if(jerr.ne.0) return allocate(w(1:no),stat=jerr) if(jerr.ne.0) return allocate(v(1:ni),stat=jerr) if(jerr.ne.0) return allocate(a(1:ni),stat=jerr) if(jerr.ne.0) return allocate(as(1:ni),stat=jerr) if(jerr.ne.0) return allocate(xs(1:ni),stat=jerr) if(jerr.ne.0) return allocate(ga(1:ni),stat=jerr) if(jerr.ne.0) return allocate(ixx(1:ni),stat=jerr) if(jerr.ne.0) return allocate(jp(1:no),stat=jerr) if(jerr.ne.0) return allocate(kp(1:no),stat=jerr) if(jerr.ne.0) return allocate(dk(1:no),stat=jerr) if(jerr.ne.0) return allocate(wr(1:no),stat=jerr) if(jerr.ne.0) return allocate(dq(1:no),stat=jerr) if(jerr.ne.0) return allocate(mm(1:ni),stat=jerr) if(jerr.ne.0) return call groups(no,y,d,q,nk,kp,jp,t0,jerr) if(jerr.ne.0) go to 12180 alpha=parm oma=1.0-alpha nlm=0 ixx=0 al=0.0 dq=d*q call died(no,nk,dq,kp,jp,dk) a=0.0 f(1)=0.0 fmax=log(huge(f(1))*0.1) if(nonzero(no,g) .eq. 0)goto 16871 f=g-dot_product(q,g) e=q*exp(sign(min(abs(f),fmax),f)) goto 16881 16871 continue f=0.0 e=q 16881 continue continue r0=risk(no,ni,nk,dq,dk,f,e,kp,jp,uu) rr=-(dot_product(dk(1:nk),log(dk(1:nk)))+r0) dev0=rr do 16891 i=1,no if((y(i) .ge. t0) .and. (q(i) .gt. 0.0))goto 16911 w(i)=0.0 wr(i)=w(i) 16911 continue 16891 continue continue call outer(no,nk,dq,dk,kp,jp,e,wr,w,jerr,uu) if(jerr.ne.0) go to 12180 alf=1.0 if(flmin .ge. 1.0)goto 16931 eqs=max(eps,flmin) alf=eqs**(1.0/(nlam-1)) 16931 continue m=0 mm=0 nlp=0 nin=nlp mnl=min(mnlam,nlam) as=0.0 cthr=cthri*dev0 do 16941 j=1,ni if(ju(j).eq.0)goto 16941 ga(j)=abs(dot_product(wr,x(:,j))) 16941 continue continue do 16951 ilm=1,nlam if(itrace.ne.0) call setpb(ilm-1) al0=al if(flmin .lt. 1.0)goto 16971 al=ulam(ilm) goto 16961 16971 if(ilm .le. 2)goto 16981 al=al*alf goto 16961 16981 if(ilm .ne. 1)goto 16991 al=big goto 17001 16991 continue al0=0.0 do 17011 j=1,ni if(ju(j).eq.0)goto 17011 if(vp(j).gt.0.0) al0=max(al0,ga(j)/vp(j)) 17011 continue continue al0=al0/max(parm,1.0d-3) al=alf*al0 17001 continue 16961 continue sa=alpha*al omal=oma*al tlam=alpha*(2.0*al-al0) do 17021 k=1,ni if(ixx(k).eq.1)goto 17021 if(ju(k).eq.0)goto 17021 if(ga(k).gt.tlam*vp(k)) ixx(k)=1 17021 continue continue 10880 continue continue 17031 continue if(nin.gt.0) as(m(1:nin))=a(m(1:nin)) call vars(no,ni,x,w,ixx,v) continue 17041 continue nlp=nlp+1 dli=0.0 do 17051 j=1,ni if(ixx(j).eq.0)goto 17051 u=a(j)*v(j)+dot_product(wr,x(:,j)) if(abs(u) .gt. vp(j)*sa)goto 17071 at=0.0 goto 17081 17071 continue at=max(cl(1,j),min(cl(2,j),sign(abs(u)-vp(j)*sa,u)/ (v(j)+vp(j)*o *mal))) 17081 continue continue if(at .eq. a(j))goto 17101 del=at-a(j) a(j)=at dli=max(dli,v(j)*del**2) wr=wr-del*w*x(:,j) f=f+del*x(:,j) if(mm(j) .ne. 0)goto 17121 nin=nin+1 if(nin.gt.nx)goto 17052 mm(j)=nin m(nin)=j 17121 continue 17101 continue 17051 continue 17052 continue if(nin.gt.nx)goto 17042 if(dli.lt.cthr)goto 17042 if(nlp .le. maxit)goto 17141 jerr=-ilm return 17141 continue continue 17151 continue nlp=nlp+1 dli=0.0 do 17161 l=1,nin j=m(l) u=a(j)*v(j)+dot_product(wr,x(:,j)) if(abs(u) .gt. vp(j)*sa)goto 17181 at=0.0 goto 17191 17181 continue at=max(cl(1,j),min(cl(2,j),sign(abs(u)-vp(j)*sa,u)/ (v(j)+vp(j)*o *mal))) 17191 continue continue if(at .eq. a(j))goto 17211 del=at-a(j) a(j)=at dli=max(dli,v(j)*del**2) wr=wr-del*w*x(:,j) f=f+del*x(:,j) 17211 continue 17161 continue continue if(dli.lt.cthr)goto 17152 if(nlp .le. maxit)goto 17231 jerr=-ilm return 17231 continue goto 17151 17152 continue goto 17041 17042 continue if(nin.gt.nx)goto 17032 e=q*exp(sign(min(abs(f),fmax),f)) call outer(no,nk,dq,dk,kp,jp,e,wr,w,jerr,uu) if(jerr .eq. 0)goto 17251 jerr=jerr-ilm go to 12180 17251 continue ix=0 do 17261 j=1,nin k=m(j) if(v(k)*(a(k)-as(k))**2.lt.cthr)goto 17261 ix=1 goto 17262 17261 continue 17262 continue if(ix .ne. 0)goto 17281 do 17291 k=1,ni if(ixx(k).eq.1)goto 17291 if(ju(k).eq.0)goto 17291 ga(k)=abs(dot_product(wr,x(:,k))) if(ga(k) .le. sa*vp(k))goto 17311 ixx(k)=1 ix=1 17311 continue 17291 continue continue if(ix.eq.1) go to 10880 goto 17032 17281 continue goto 17031 17032 continue if(nin .le. nx)goto 17331 jerr=-10000-ilm goto 16952 17331 continue if(nin.gt.0) ao(1:nin,ilm)=a(m(1:nin)) kin(ilm)=nin alm(ilm)=al lmu=ilm dev(ilm)=(risk(no,ni,nk,dq,dk,f,e,kp,jp,uu)-r0)/rr if(ilm.lt.mnl)goto 16951 if(flmin.ge.1.0)goto 16951 me=0 do 17341 j=1,nin if(ao(j,ilm).ne.0.0) me=me+1 17341 continue continue if(me.gt.ne)goto 16952 if((dev(ilm)-dev(ilm-mnl+1))/dev(ilm).lt.sml)goto 16952 if(dev(ilm).gt.devmax)goto 16952 16951 continue 16952 continue g=f 12180 continue deallocate(e,uu,w,dk,v,xs,f,wr,a,as,jp,kp,dq,mm,ga,ixx) return end subroutine cxmodval(ca,ia,nin,n,x,f) implicit double precision(a-h,o-z) double precision ca(nin),x(n,*),f(n) integer ia(nin) f=0.0 if(nin.le.0) return do 17351 i=1,n f(i)=f(i)+dot_product(ca(1:nin),x(i,ia(1:nin))) 17351 continue continue return end subroutine groups(no,y,d,q,nk,kp,jp,t0,jerr) implicit double precision(a-h,o-z) double precision y(no),d(no),q(no) integer jp(no),kp(*) do 17361 j=1,no jp(j)=j 17361 continue continue call psort7(y,jp,1,no) nj=0 do 17371 j=1,no if(q(jp(j)).le.0.0)goto 17371 nj=nj+1 jp(nj)=jp(j) 17371 continue continue if(nj .ne. 0)goto 17391 jerr=20000 return 17391 continue j=1 continue 17401 if(d(jp(j)).gt.0.0)goto 17402 j=j+1 if(j.gt.nj)goto 17402 goto 17401 17402 continue if(j .lt. nj-1)goto 17421 jerr=30000 return 17421 continue t0=y(jp(j)) j0=j-1 if(j0 .le. 0)goto 17441 continue 17451 if(y(jp(j0)).lt.t0)goto 17452 j0=j0-1 if(j0.eq.0)goto 17452 goto 17451 17452 continue if(j0 .le. 0)goto 17471 nj=nj-j0 do 17481 j=1,nj jp(j)=jp(j+j0) 17481 continue continue 17471 continue 17441 continue jerr=0 nk=0 yk=t0 j=2 continue 17491 continue continue 17501 if(d(jp(j)).gt.0.0.and.y(jp(j)).gt.yk)goto 17502 j=j+1 if(j.gt.nj)goto 17502 goto 17501 17502 continue nk=nk+1 kp(nk)=j-1 if(j.gt.nj)goto 17492 if(j .ne. nj)goto 17521 nk=nk+1 kp(nk)=nj goto 17492 17521 continue yk=y(jp(j)) j=j+1 goto 17491 17492 continue return end subroutine outer(no,nk,d,dk,kp,jp,e,wr,w,jerr,u) implicit double precision(a-h,o-z) double precision d(no),dk(nk),wr(no),w(no) double precision e(no),u(no),b,c integer kp(nk),jp(no) call usk(no,nk,kp,jp,e,u) b=dk(1)/u(1) c=dk(1)/u(1)**2 jerr=0 do 17531 j=1,kp(1) i=jp(j) w(i)=e(i)*(b-e(i)*c) if(w(i) .gt. 0.0)goto 17551 jerr=-30000 return 17551 continue wr(i)=d(i)-e(i)*b 17531 continue continue do 17561 k=2,nk j1=kp(k-1)+1 j2=kp(k) b=b+dk(k)/u(k) c=c+dk(k)/u(k)**2 do 17571 j=j1,j2 i=jp(j) w(i)=e(i)*(b-e(i)*c) if(w(i) .gt. 0.0)goto 17591 jerr=-30000 return 17591 continue wr(i)=d(i)-e(i)*b 17571 continue continue 17561 continue continue return end subroutine vars(no,ni,x,w,ixx,v) implicit double precision(a-h,o-z) double precision x(no,ni),w(no),v(ni) integer ixx(ni) do 17601 j=1,ni if(ixx(j).gt.0) v(j)=dot_product(w,x(:,j)**2) 17601 continue continue return end subroutine died(no,nk,d,kp,jp,dk) implicit double precision(a-h,o-z) double precision d(no),dk(nk) integer kp(nk),jp(no) dk(1)=sum(d(jp(1:kp(1)))) do 17611 k=2,nk dk(k)=sum(d(jp((kp(k-1)+1):kp(k)))) 17611 continue continue return end subroutine usk(no,nk,kp,jp,e,u) implicit double precision(a-h,o-z) double precision e(no),u(nk),h integer kp(nk),jp(no) h=0.0 do 17621 k=nk,1,-1 j2=kp(k) j1=1 if(k.gt.1) j1=kp(k-1)+1 do 17631 j=j2,j1,-1 h=h+e(jp(j)) 17631 continue continue u(k)=h 17621 continue continue return end function risk(no,ni,nk,d,dk,f,e,kp,jp,u) implicit double precision(a-h,o-z) double precision d(no),dk(nk),f(no) integer kp(nk),jp(no) double precision e(no),u(nk) ni = ni*1 call usk(no,nk,kp,jp,e,u) u=log(u) risk=dot_product(d,f)-dot_product(dk,u) return end subroutine loglike(no,ni,x,y,d,g,w,nlam,a,flog,jerr) implicit double precision(a-h,o-z) double precision x(no,ni),y(no),d(no),g(no),w(no),a(ni,nlam),flog( *nlam) double precision, dimension (:), allocatable :: dk,f,xm,dq,q double precision, dimension (:), allocatable :: e,uu integer, dimension (:), allocatable :: jp,kp allocate(e(1:no),stat=jerr) if(jerr.ne.0) return allocate(q(1:no),stat=jerr) if(jerr.ne.0) return allocate(uu(1:no),stat=jerr) if(jerr.ne.0) return allocate(f(1:no),stat=jerr) if(jerr.ne.0) return allocate(dk(1:no),stat=jerr) if(jerr.ne.0) return allocate(jp(1:no),stat=jerr) if(jerr.ne.0) return allocate(kp(1:no),stat=jerr) if(jerr.ne.0) return allocate(dq(1:no),stat=jerr) if(jerr.ne.0) return allocate(xm(1:ni),stat=jerr) if(jerr.ne.0) return q=max(0d0,w) sw=sum(q) if(sw .gt. 0.0)goto 17651 jerr=9999 go to 12180 17651 continue call groups(no,y,d,q,nk,kp,jp,t0,jerr) if(jerr.ne.0) go to 12180 fmax=log(huge(e(1))*0.1) dq=d*q call died(no,nk,dq,kp,jp,dk) gm=dot_product(q,g)/sw do 17661 j=1,ni xm(j)=dot_product(q,x(:,j))/sw 17661 continue continue do 17671 lam=1,nlam do 17681 i=1,no f(i)=g(i)-gm+dot_product(a(:,lam),(x(i,:)-xm)) e(i)=q(i)*exp(sign(min(abs(f(i)),fmax),f(i))) 17681 continue continue flog(lam)=risk(no,ni,nk,dq,dk,f,e,kp,jp,uu) 17671 continue continue 12180 continue deallocate(e,uu,dk,f,jp,kp,dq) return end subroutine fishnet(parm,no,ni,x,y,g,w,jd,vp,cl,ne,nx,nlam,flmin,ul *am,thr, isd,intr,maxit,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,jerr) implicit double precision(a-h,o-z) double precision x(no,ni),y(no),g(no),w(no),vp(ni),ulam(nlam) double precision ca(nx,nlam),a0(nlam),dev(nlam),alm(nlam),cl(2,ni) integer jd(*),ia(nx),nin(nlam) double precision, dimension (:), allocatable :: xm,xs,ww,vq integer, dimension (:), allocatable :: ju if(maxval(vp) .gt. 0.0)goto 17701 jerr=10000 return 17701 continue if(minval(y) .ge. 0.0)goto 17721 jerr=8888 return 17721 continue allocate(ww(1:no),stat=jerr) if(jerr.ne.0) return allocate(ju(1:ni),stat=jerr) if(jerr.ne.0) return allocate(vq(1:ni),stat=jerr) if(jerr.ne.0) return allocate(xm(1:ni),stat=jerr) if(jerr.ne.0) return if(isd .le. 0)goto 17741 allocate(xs(1:ni),stat=jerr) if(jerr.ne.0) return 17741 continue call chkvars(no,ni,x,ju) if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 if(maxval(ju) .gt. 0)goto 17761 jerr=7777 go to 12180 17761 continue vq=max(0d0,vp) vq=vq*ni/sum(vq) ww=max(0d0,w) sw=sum(ww) if(sw .gt. 0.0)goto 17781 jerr=9999 go to 12180 17781 continue ww=ww/sw call lstandard1(no,ni,x,ww,ju,isd,intr,xm,xs) if(isd .le. 0)goto 17801 do 17811 j=1,ni cl(:,j)=cl(:,j)*xs(j) 17811 continue continue 17801 continue call fishnet1(parm,no,ni,x,y,g,ww,ju,vq,cl,ne,nx,nlam,flmin,ulam,t *hr, isd,intr,maxit,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,jerr) if(jerr.gt.0) go to 12180 dev0=2.0*sw*dev0 do 17821 k=1,lmu nk=nin(k) if(isd.gt.0) ca(1:nk,k)=ca(1:nk,k)/xs(ia(1:nk)) if(intr .ne. 0)goto 17841 a0(k)=0.0 goto 17851 17841 continue a0(k)=a0(k)-dot_product(ca(1:nk,k),xm(ia(1:nk))) 17851 continue continue 17821 continue continue 12180 continue deallocate(ww,ju,vq,xm) if(isd.gt.0) deallocate(xs) return end subroutine fishnet1(parm,no,ni,x,y,g,q,ju,vp,cl,ne,nx,nlam,flmin,u *lam,shri, isd,intr,maxit,lmu,a0,ca,m,kin,dev0,dev,alm,nlp,jerr) implicit double precision(a-h,o-z) double precision x(no,ni),y(no),g(no),q(no),vp(ni),ulam(nlam) double precision ca(nx,nlam),a0(nlam),dev(nlam),alm(nlam),cl(2,ni) integer ju(ni),m(nx),kin(nlam) double precision, dimension (:), allocatable :: t,w,wr,v,a,f,as,ga integer, dimension (:), allocatable :: mm,ixx call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx,itrace) sml=sml*10.0 isd = isd*1 allocate(a(1:ni),stat=jerr) if(jerr.ne.0) return allocate(as(1:ni),stat=jerr) if(jerr.ne.0) return allocate(t(1:no),stat=jerr) if(jerr.ne.0) return allocate(mm(1:ni),stat=jerr) if(jerr.ne.0) return allocate(ga(1:ni),stat=jerr) if(jerr.ne.0) return allocate(ixx(1:ni),stat=jerr) if(jerr.ne.0) return allocate(wr(1:no),stat=jerr) if(jerr.ne.0) return allocate(v(1:ni),stat=jerr) if(jerr.ne.0) return allocate(w(1:no),stat=jerr) if(jerr.ne.0) return allocate(f(1:no),stat=jerr) if(jerr.ne.0) return bta=parm omb=1.0-bta t=q*y yb=sum(t) fmax=log(huge(bta)*0.1) if(nonzero(no,g) .ne. 0)goto 17871 if(intr .eq. 0)goto 17891 w=q*yb az=log(yb) f=az dv0=yb*(az-1.0) goto 17901 17891 continue w=q az=0.0 f=az dv0=-1.0 17901 continue continue goto 17911 17871 continue w=q*exp(sign(min(abs(g),fmax),g)) v0=sum(w) if(intr .eq. 0)goto 17931 eaz=yb/v0 w=eaz*w az=log(eaz) f=az+g dv0=dot_product(t,g)-yb*(1.0-az) goto 17941 17931 continue az=0.0 f=g dv0=dot_product(t,g)-v0 17941 continue continue 17911 continue continue a=0.0 as=0.0 wr=t-w v0=1.0 if(intr.ne.0) v0=yb dvr=-yb do 17951 i=1,no if(t(i).gt.0.0) dvr=dvr+t(i)*log(y(i)) 17951 continue continue dvr=dvr-dv0 dev0=dvr alf=1.0 if(flmin .ge. 1.0)goto 17971 eqs=max(eps,flmin) alf=eqs**(1.0/(nlam-1)) 17971 continue m=0 mm=0 nlp=0 nin=nlp mnl=min(mnlam,nlam) shr=shri*dev0 ixx=0 al=0.0 do 17981 j=1,ni if(ju(j).eq.0)goto 17981 ga(j)=abs(dot_product(wr,x(:,j))) 17981 continue continue do 17991 ilm=1,nlam if(itrace.ne.0) call setpb(ilm-1) al0=al if(flmin .lt. 1.0)goto 18011 al=ulam(ilm) goto 18001 18011 if(ilm .le. 2)goto 18021 al=al*alf goto 18001 18021 if(ilm .ne. 1)goto 18031 al=big goto 18041 18031 continue al0=0.0 do 18051 j=1,ni if(ju(j).eq.0)goto 18051 if(vp(j).gt.0.0) al0=max(al0,ga(j)/vp(j)) 18051 continue continue al0=al0/max(bta,1.0d-3) al=alf*al0 18041 continue 18001 continue al2=al*omb al1=al*bta tlam=bta*(2.0*al-al0) do 18061 k=1,ni if(ixx(k).eq.1)goto 18061 if(ju(k).eq.0)goto 18061 if(ga(k).gt.tlam*vp(k)) ixx(k)=1 18061 continue continue 10880 continue continue 18071 continue az0=az if(nin.gt.0) as(m(1:nin))=a(m(1:nin)) do 18081 j=1,ni if(ixx(j).ne.0) v(j)=dot_product(w,x(:,j)**2) 18081 continue continue continue 18091 continue nlp=nlp+1 dlx=0.0 do 18101 k=1,ni if(ixx(k).eq.0)goto 18101 ak=a(k) u=dot_product(wr,x(:,k))+v(k)*ak au=abs(u)-vp(k)*al1 if(au .gt. 0.0)goto 18121 a(k)=0.0 goto 18131 18121 continue a(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(v(k)+vp(k)*al2))) 18131 continue continue if(a(k).eq.ak)goto 18101 d=a(k)-ak dlx=max(dlx,v(k)*d**2) wr=wr-d*w*x(:,k) f=f+d*x(:,k) if(mm(k) .ne. 0)goto 18151 nin=nin+1 if(nin.gt.nx)goto 18102 mm(k)=nin m(nin)=k 18151 continue 18101 continue 18102 continue if(nin.gt.nx)goto 18092 if(intr .eq. 0)goto 18171 d=sum(wr)/v0 az=az+d dlx=max(dlx,v0*d**2) wr=wr-d*w f=f+d 18171 continue if(dlx.lt.shr)goto 18092 if(nlp .le. maxit)goto 18191 jerr=-ilm return 18191 continue continue 18201 continue nlp=nlp+1 dlx=0.0 do 18211 l=1,nin k=m(l) ak=a(k) u=dot_product(wr,x(:,k))+v(k)*ak au=abs(u)-vp(k)*al1 if(au .gt. 0.0)goto 18231 a(k)=0.0 goto 18241 18231 continue a(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(v(k)+vp(k)*al2))) 18241 continue continue if(a(k).eq.ak)goto 18211 d=a(k)-ak dlx=max(dlx,v(k)*d**2) wr=wr-d*w*x(:,k) f=f+d*x(:,k) 18211 continue continue if(intr .eq. 0)goto 18261 d=sum(wr)/v0 az=az+d dlx=max(dlx,v0*d**2) wr=wr-d*w f=f+d 18261 continue if(dlx.lt.shr)goto 18202 if(nlp .le. maxit)goto 18281 jerr=-ilm return 18281 continue goto 18201 18202 continue goto 18091 18092 continue if(nin.gt.nx)goto 18072 w=q*exp(sign(min(abs(f),fmax),f)) v0=sum(w) wr=t-w if(v0*(az-az0)**2 .ge. shr)goto 18301 ix=0 do 18311 j=1,nin k=m(j) if(v(k)*(a(k)-as(k))**2.lt.shr)goto 18311 ix=1 goto 18312 18311 continue 18312 continue if(ix .ne. 0)goto 18331 do 18341 k=1,ni if(ixx(k).eq.1)goto 18341 if(ju(k).eq.0)goto 18341 ga(k)=abs(dot_product(wr,x(:,k))) if(ga(k) .le. al1*vp(k))goto 18361 ixx(k)=1 ix=1 18361 continue 18341 continue continue if(ix.eq.1) go to 10880 goto 18072 18331 continue 18301 continue goto 18071 18072 continue if(nin .le. nx)goto 18381 jerr=-10000-ilm goto 17992 18381 continue if(nin.gt.0) ca(1:nin,ilm)=a(m(1:nin)) kin(ilm)=nin a0(ilm)=az alm(ilm)=al lmu=ilm dev(ilm)=(dot_product(t,f)-v0-dv0)/dvr if(ilm.lt.mnl)goto 17991 if(flmin.ge.1.0)goto 17991 me=0 do 18391 j=1,nin if(ca(j,ilm).ne.0.0) me=me+1 18391 continue continue if(me.gt.ne)goto 17992 if((dev(ilm)-dev(ilm-mnl+1))/dev(ilm).lt.sml)goto 17992 if(dev(ilm).gt.devmax)goto 17992 17991 continue 17992 continue g=f continue deallocate(t,w,wr,v,a,f,as,mm,ga,ixx) return end function nonzero(n,v) implicit double precision(a-h,o-z) double precision v(n) nonzero=0 do 18401 i=1,n if(v(i) .eq. 0.0)goto 18421 nonzero=1 return 18421 continue 18401 continue continue return end subroutine solns(ni,nx,lmu,a,ia,nin,b) implicit double precision(a-h,o-z) double precision a(nx,lmu),b(ni,lmu) integer ia(nx),nin(lmu) do 18431 lam=1,lmu call uncomp(ni,a(:,lam),ia,nin(lam),b(:,lam)) 18431 continue continue return end subroutine lsolns(ni,nx,nc,lmu,a,ia,nin,b) implicit double precision(a-h,o-z) double precision a(nx,nc,lmu),b(ni,nc,lmu) integer ia(nx),nin(lmu) do 18441 lam=1,lmu call luncomp(ni,nx,nc,a(1,1,lam),ia,nin(lam),b(1,1,lam)) 18441 continue continue return end subroutine deviance(no,ni,x,y,g,q,nlam,a0,a,flog,jerr) implicit double precision(a-h,o-z) double precision x(no,ni),y(no),g(no),q(no),a(ni,nlam),a0(nlam),fl *og(nlam) double precision, dimension (:), allocatable :: w if(minval(y) .ge. 0.0)goto 18461 jerr=8888 return 18461 continue allocate(w(1:no),stat=jerr) if(jerr.ne.0) return w=max(0d0,q) sw=sum(w) if(sw .gt. 0.0)goto 18481 jerr=9999 go to 12180 18481 continue yb=dot_product(w,y)/sw fmax=log(huge(y(1))*0.1) do 18491 lam=1,nlam s=0.0 do 18501 i=1,no if(w(i).le.0.0)goto 18501 f=g(i)+a0(lam)+dot_product(a(:,lam),x(i,:)) s=s+w(i)*(y(i)*f-exp(sign(min(abs(f),fmax),f))) 18501 continue continue flog(lam)=2.0*(sw*yb*(log(yb)-1.0)-s) 18491 continue continue 12180 continue deallocate(w) return end subroutine spfishnet(parm,no,ni,x,ix,jx,y,g,w,jd,vp,cl,ne,nx,nlam, *flmin, ulam,thr,isd,intr,maxit,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp, *jerr) implicit double precision(a-h,o-z) double precision x(*),y(no),g(no),w(no),vp(ni),ulam(nlam),cl(2,ni) double precision ca(nx,nlam),a0(nlam),dev(nlam),alm(nlam) integer ix(*),jx(*),jd(*),ia(nx),nin(nlam) double precision, dimension (:), allocatable :: xm,xs,ww,vq integer, dimension (:), allocatable :: ju if(maxval(vp) .gt. 0.0)goto 18521 jerr=10000 return 18521 continue if(minval(y) .ge. 0.0)goto 18541 jerr=8888 return 18541 continue allocate(ww(1:no),stat=jerr) if(jerr.ne.0) return allocate(ju(1:ni),stat=jerr) if(jerr.ne.0) return allocate(vq(1:ni),stat=jerr) if(jerr.ne.0) return allocate(xm(1:ni),stat=jerr) if(jerr.ne.0) return allocate(xs(1:ni),stat=jerr) if(jerr.ne.0) return call spchkvars(no,ni,x,ix,ju) if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 if(maxval(ju) .gt. 0)goto 18561 jerr=7777 go to 12180 18561 continue vq=max(0d0,vp) vq=vq*ni/sum(vq) ww=max(0d0,w) sw=sum(ww) if(sw .gt. 0.0)goto 18581 jerr=9999 go to 12180 18581 continue ww=ww/sw call splstandard2(no,ni,x,ix,jx,ww,ju,isd,intr,xm,xs) if(isd .le. 0)goto 18601 do 18611 j=1,ni cl(:,j)=cl(:,j)*xs(j) 18611 continue continue 18601 continue call spfishnet1(parm,no,ni,x,ix,jx,y,g,ww,ju,vq,cl,ne,nx,nlam,flmi *n,ulam,thr, isd,intr,maxit,xm,xs,lmu,a0,ca,ia,nin,dev0,dev,alm,nl *p,jerr) if(jerr.gt.0) go to 12180 dev0=2.0*sw*dev0 do 18621 k=1,lmu nk=nin(k) if(isd.gt.0) ca(1:nk,k)=ca(1:nk,k)/xs(ia(1:nk)) if(intr .ne. 0)goto 18641 a0(k)=0.0 goto 18651 18641 continue a0(k)=a0(k)-dot_product(ca(1:nk,k),xm(ia(1:nk))) 18651 continue continue 18621 continue continue 12180 continue deallocate(ww,ju,vq,xm,xs) return end subroutine spfishnet1(parm,no,ni,x,ix,jx,y,g,q,ju,vp,cl,ne,nx,nlam *,flmin,ulam, shri,isd,intr,maxit,xb,xs,lmu,a0,ca,m,kin,dev0,dev,a *lm,nlp,jerr) implicit double precision(a-h,o-z) double precision x(*),y(no),g(no),q(no),vp(ni),ulam(nlam),xb(ni),x *s(ni) double precision ca(nx,nlam),a0(nlam),dev(nlam),alm(nlam),cl(2,ni) integer ix(*),jx(*),ju(ni),m(nx),kin(nlam) double precision, dimension (:), allocatable :: qy,t,w,wr,v double precision, dimension (:), allocatable :: a,as,xm,ga integer, dimension (:), allocatable :: mm,ixx call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx,itrace) sml=sml*10.0 isd = isd*1 allocate(a(1:ni),stat=jerr) if(jerr.ne.0) return allocate(as(1:ni),stat=jerr) if(jerr.ne.0) return allocate(t(1:no),stat=jerr) if(jerr.ne.0) return allocate(mm(1:ni),stat=jerr) if(jerr.ne.0) return allocate(ga(1:ni),stat=jerr) if(jerr.ne.0) return allocate(ixx(1:ni),stat=jerr) if(jerr.ne.0) return allocate(wr(1:no),stat=jerr) if(jerr.ne.0) return allocate(v(1:ni),stat=jerr) if(jerr.ne.0) return allocate(xm(1:ni),stat=jerr) if(jerr.ne.0) return allocate(w(1:no),stat=jerr) if(jerr.ne.0) return allocate(qy(1:no),stat=jerr) if(jerr.ne.0) return bta=parm omb=1.0-bta fmax=log(huge(bta)*0.1) qy=q*y yb=sum(qy) if(nonzero(no,g) .ne. 0)goto 18671 t=0.0 if(intr .eq. 0)goto 18691 w=q*yb az=log(yb) uu=az xm=yb*xb dv0=yb*(az-1.0) goto 18701 18691 continue w=q xm=0.0 uu=0.0 az=uu dv0=-1.0 18701 continue continue goto 18711 18671 continue w=q*exp(sign(min(abs(g),fmax),g)) ww=sum(w) t=g if(intr .eq. 0)goto 18731 eaz=yb/ww w=eaz*w az=log(eaz) uu=az dv0=dot_product(qy,g)-yb*(1.0-az) goto 18741 18731 continue uu=0.0 az=uu dv0=dot_product(qy,g)-ww 18741 continue continue do 18751 j=1,ni if(ju(j).eq.0)goto 18751 jb=ix(j) je=ix(j+1)-1 xm(j)=dot_product(w(jx(jb:je)),x(jb:je)) 18751 continue continue 18711 continue continue tt=yb*uu ww=1.0 if(intr.ne.0) ww=yb wr=qy-q*(yb*(1.0-uu)) a=0.0 as=0.0 dvr=-yb do 18761 i=1,no if(qy(i).gt.0.0) dvr=dvr+qy(i)*log(y(i)) 18761 continue continue dvr=dvr-dv0 dev0=dvr alf=1.0 if(flmin .ge. 1.0)goto 18781 eqs=max(eps,flmin) alf=eqs**(1.0/(nlam-1)) 18781 continue m=0 mm=0 nlp=0 nin=nlp mnl=min(mnlam,nlam) shr=shri*dev0 al=0.0 ixx=0 do 18791 j=1,ni if(ju(j).eq.0)goto 18791 jb=ix(j) je=ix(j+1)-1 ga(j)=abs(dot_product(wr(jx(jb:je)),x(jb:je)) -uu*(xm(j)-ww*xb(j) *)-xb(j)*tt)/xs(j) 18791 continue continue do 18801 ilm=1,nlam if(itrace.ne.0) call setpb(ilm-1) al0=al if(flmin .lt. 1.0)goto 18821 al=ulam(ilm) goto 18811 18821 if(ilm .le. 2)goto 18831 al=al*alf goto 18811 18831 if(ilm .ne. 1)goto 18841 al=big goto 18851 18841 continue al0=0.0 do 18861 j=1,ni if(ju(j).eq.0)goto 18861 if(vp(j).gt.0.0) al0=max(al0,ga(j)/vp(j)) 18861 continue continue al0=al0/max(bta,1.0d-3) al=alf*al0 18851 continue 18811 continue al2=al*omb al1=al*bta tlam=bta*(2.0*al-al0) do 18871 k=1,ni if(ixx(k).eq.1)goto 18871 if(ju(k).eq.0)goto 18871 if(ga(k).gt.tlam*vp(k)) ixx(k)=1 18871 continue continue 10880 continue continue 18881 continue az0=az if(nin.gt.0) as(m(1:nin))=a(m(1:nin)) do 18891 j=1,ni if(ixx(j).eq.0)goto 18891 jb=ix(j) je=ix(j+1)-1 xm(j)=dot_product(w(jx(jb:je)),x(jb:je)) v(j)=(dot_product(w(jx(jb:je)),x(jb:je)**2) -2.0*xb(j)*xm(j)+ww*x *b(j)**2)/xs(j)**2 18891 continue continue continue 18901 continue nlp=nlp+1 dlx=0.0 do 18911 k=1,ni if(ixx(k).eq.0)goto 18911 jb=ix(k) je=ix(k+1)-1 ak=a(k) u=(dot_product(wr(jx(jb:je)),x(jb:je)) -uu*(xm(k)-ww*xb(k))-xb(k) **tt)/xs(k)+v(k)*ak au=abs(u)-vp(k)*al1 if(au .gt. 0.0)goto 18931 a(k)=0.0 goto 18941 18931 continue a(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(v(k)+vp(k)*al2))) 18941 continue continue if(a(k).eq.ak)goto 18911 if(mm(k) .ne. 0)goto 18961 nin=nin+1 if(nin.gt.nx)goto 18912 mm(k)=nin m(nin)=k 18961 continue d=a(k)-ak dlx=max(dlx,v(k)*d**2) dv=d/xs(k) wr(jx(jb:je))=wr(jx(jb:je))-dv*w(jx(jb:je))*x(jb:je) t(jx(jb:je))=t(jx(jb:je))+dv*x(jb:je) uu=uu-dv*xb(k) tt=tt-dv*xm(k) 18911 continue 18912 continue if(nin.gt.nx)goto 18902 if(intr .eq. 0)goto 18981 d=tt/ww-uu az=az+d dlx=max(dlx,ww*d**2) uu=uu+d 18981 continue if(dlx.lt.shr)goto 18902 if(nlp .le. maxit)goto 19001 jerr=-ilm return 19001 continue continue 19011 continue nlp=nlp+1 dlx=0.0 do 19021 l=1,nin k=m(l) jb=ix(k) je=ix(k+1)-1 ak=a(k) u=(dot_product(wr(jx(jb:je)),x(jb:je)) -uu*(xm(k)-ww*xb(k))-xb(k) **tt)/xs(k)+v(k)*ak au=abs(u)-vp(k)*al1 if(au .gt. 0.0)goto 19041 a(k)=0.0 goto 19051 19041 continue a(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(v(k)+vp(k)*al2))) 19051 continue continue if(a(k).eq.ak)goto 19021 d=a(k)-ak dlx=max(dlx,v(k)*d**2) dv=d/xs(k) wr(jx(jb:je))=wr(jx(jb:je))-dv*w(jx(jb:je))*x(jb:je) t(jx(jb:je))=t(jx(jb:je))+dv*x(jb:je) uu=uu-dv*xb(k) tt=tt-dv*xm(k) 19021 continue continue if(intr .eq. 0)goto 19071 d=tt/ww-uu az=az+d dlx=max(dlx,ww*d**2) uu=uu+d 19071 continue if(dlx.lt.shr)goto 19012 if(nlp .le. maxit)goto 19091 jerr=-ilm return 19091 continue goto 19011 19012 continue goto 18901 18902 continue if(nin.gt.nx)goto 18882 euu=exp(sign(min(abs(uu),fmax),uu)) w=euu*q*exp(sign(min(abs(t),fmax),t)) ww=sum(w) wr=qy-w*(1.0-uu) tt=sum(wr) if(ww*(az-az0)**2 .ge. shr)goto 19111 kx=0 do 19121 j=1,nin k=m(j) if(v(k)*(a(k)-as(k))**2.lt.shr)goto 19121 kx=1 goto 19122 19121 continue 19122 continue if(kx .ne. 0)goto 19141 do 19151 j=1,ni if(ixx(j).eq.1)goto 19151 if(ju(j).eq.0)goto 19151 jb=ix(j) je=ix(j+1)-1 xm(j)=dot_product(w(jx(jb:je)),x(jb:je)) ga(j)=abs(dot_product(wr(jx(jb:je)),x(jb:je)) -uu*(xm(j)-ww*xb(j) *)-xb(j)*tt)/xs(j) if(ga(j) .le. al1*vp(j))goto 19171 ixx(j)=1 kx=1 19171 continue 19151 continue continue if(kx.eq.1) go to 10880 goto 18882 19141 continue 19111 continue goto 18881 18882 continue if(nin .le. nx)goto 19191 jerr=-10000-ilm goto 18802 19191 continue if(nin.gt.0) ca(1:nin,ilm)=a(m(1:nin)) kin(ilm)=nin a0(ilm)=az alm(ilm)=al lmu=ilm dev(ilm)=(dot_product(qy,t)+yb*uu-ww-dv0)/dvr if(ilm.lt.mnl)goto 18801 if(flmin.ge.1.0)goto 18801 me=0 do 19201 j=1,nin if(ca(j,ilm).ne.0.0) me=me+1 19201 continue continue if(me.gt.ne)goto 18802 if((dev(ilm)-dev(ilm-mnl+1))/dev(ilm).lt.sml)goto 18802 if(dev(ilm).gt.devmax)goto 18802 18801 continue 18802 continue g=t+uu continue deallocate(t,w,wr,v,a,qy,xm,as,mm,ga,ixx) return end subroutine spdeviance(no,ni,x,ix,jx,y,g,q,nlam,a0,a,flog,jerr) implicit double precision(a-h,o-z) double precision x(*),y(no),g(no),q(no),a(ni,nlam),a0(nlam),flog(n *lam) integer ix(*),jx(*) double precision, dimension (:), allocatable :: w,f if(minval(y) .ge. 0.0)goto 19221 jerr=8888 return 19221 continue allocate(w(1:no),stat=jerr) if(jerr.ne.0) return allocate(f(1:no),stat=jerr) if(jerr.ne.0) return w=max(0d0,q) sw=sum(w) if(sw .gt. 0.0)goto 19241 jerr=9999 go to 12180 19241 continue yb=dot_product(w,y)/sw fmax=log(huge(y(1))*0.1) do 19251 lam=1,nlam f=a0(lam) do 19261 j=1,ni if(a(j,lam).eq.0.0)goto 19261 jb=ix(j) je=ix(j+1)-1 f(jx(jb:je))=f(jx(jb:je))+a(j,lam)*x(jb:je) 19261 continue continue f=f+g s=dot_product(w,y*f-exp(sign(min(abs(f),fmax),f))) flog(lam)=2.0*(sw*yb*(log(yb)-1.0)-s) 19251 continue continue 12180 continue deallocate(w,f) return end subroutine cspdeviance(no,x,ix,jx,y,g,q,nx,nlam,a0,ca,ia,nin,flog, *jerr) implicit double precision(a-h,o-z) double precision x(*),y(no),g(no),q(no),ca(nx,nlam),a0(nlam),flog( *nlam) integer ix(*),jx(*),nin(nlam),ia(nx) double precision, dimension (:), allocatable :: w,f if(minval(y) .ge. 0.0)goto 19281 jerr=8888 return 19281 continue allocate(w(1:no),stat=jerr) if(jerr.ne.0) return allocate(f(1:no),stat=jerr) if(jerr.ne.0) return w=max(0d0,q) sw=sum(w) if(sw .gt. 0.0)goto 19301 jerr=9999 go to 12180 19301 continue yb=dot_product(w,y)/sw fmax=log(huge(y(1))*0.1) do 19311 lam=1,nlam f=a0(lam) do 19321 k=1,nin(lam) j=ia(k) jb=ix(j) je=ix(j+1)-1 f(jx(jb:je))=f(jx(jb:je))+ca(k,lam)*x(jb:je) 19321 continue continue f=f+g s=dot_product(w,y*f-exp(sign(min(abs(f),fmax),f))) flog(lam)=2.0*(sw*yb*(log(yb)-1.0)-s) 19311 continue continue 12180 continue deallocate(w,f) return end subroutine multelnet(parm,no,ni,nr,x,y,w,jd,vp,cl,ne,nx,nlam, flm *in,ulam,thr,isd,jsd,intr,maxit, lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr *) implicit double precision(a-h,o-z) double precision x(no,ni),y(no,nr),w(no),vp(ni),ca(nx,nr,nlam) double precision ulam(nlam),a0(nr,nlam),rsq(nlam),alm(nlam),cl(2,n *i) integer jd(*),ia(nx),nin(nlam) double precision, dimension (:), allocatable :: vq; if(maxval(vp) .gt. 0.0)goto 19341 jerr=10000 return 19341 continue allocate(vq(1:ni),stat=jerr) if(jerr.ne.0) return vq=max(0d0,vp) vq=vq*ni/sum(vq) call multelnetn(parm,no,ni,nr,x,y,w,jd,vq,cl,ne,nx,nlam,flmin,ulam *,thr,isd, jsd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) deallocate(vq) return end subroutine multelnetn(parm,no,ni,nr,x,y,w,jd,vp,cl,ne,nx,nlam,flmi *n,ulam,thr, isd,jsd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) implicit double precision(a-h,o-z) double precision vp(ni),x(no,ni),y(no,nr),w(no),ulam(nlam),cl(2,ni *) double precision ca(nx,nr,nlam),a0(nr,nlam),rsq(nlam),alm(nlam) integer jd(*),ia(nx),nin(nlam) double precision, dimension (:), allocatable :: xm,xs,xv,ym,ys integer, dimension (:), allocatable :: ju double precision, dimension (:,:,:), allocatable :: clt allocate(clt(1:2,1:nr,1:ni),stat=jerr); if(jerr.ne.0) return allocate(xm(1:ni),stat=jerr) if(jerr.ne.0) return allocate(xs(1:ni),stat=jerr) if(jerr.ne.0) return allocate(ym(1:nr),stat=jerr) if(jerr.ne.0) return allocate(ys(1:nr),stat=jerr) if(jerr.ne.0) return allocate(ju(1:ni),stat=jerr) if(jerr.ne.0) return allocate(xv(1:ni),stat=jerr) if(jerr.ne.0) return call chkvars(no,ni,x,ju) if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 if(maxval(ju) .gt. 0)goto 19361 jerr=7777 return 19361 continue call multstandard1(no,ni,nr,x,y,w,isd,jsd,intr,ju,xm,xs,ym,ys,xv,y *s0,jerr) if(jerr.ne.0) return do 19371 j=1,ni do 19381 k=1,nr do 19391 i=1,2 clt(i,k,j)=cl(i,j) 19391 continue continue 19381 continue continue 19371 continue continue if(isd .le. 0)goto 19411 do 19421 j=1,ni do 19431 k=1,nr do 19441 i=1,2 clt(i,k,j)=clt(i,k,j)*xs(j) 19441 continue continue 19431 continue continue 19421 continue continue 19411 continue if(jsd .le. 0)goto 19461 do 19471 j=1,ni do 19481 k=1,nr do 19491 i=1,2 clt(i,k,j)=clt(i,k,j)/ys(k) 19491 continue continue 19481 continue continue 19471 continue continue 19461 continue call multelnet2(parm,ni,nr,ju,vp,clt,y,no,ne,nx,x,nlam,flmin,ulam, *thr,maxit,xv, ys0,lmu,ca,ia,nin,rsq,alm,nlp,jerr) if(jerr.gt.0) return do 19501 k=1,lmu nk=nin(k) do 19511 j=1,nr do 19521 l=1,nk ca(l,j,k)=ys(j)*ca(l,j,k)/xs(ia(l)) 19521 continue continue if(intr .ne. 0)goto 19541 a0(j,k)=0.0 goto 19551 19541 continue a0(j,k)=ym(j)-dot_product(ca(1:nk,j,k),xm(ia(1:nk))) 19551 continue continue 19511 continue continue 19501 continue continue deallocate(xm,xs,ym,ys,ju,xv,clt) return end subroutine multstandard1(no,ni,nr,x,y,w,isd,jsd,intr,ju, xm,xs,ym *,ys,xv,ys0,jerr) implicit double precision(a-h,o-z) double precision x(no,ni),y(no,nr),w(no),xm(ni),xs(ni),xv(ni),ym(n *r),ys(nr) integer ju(ni) double precision, dimension (:), allocatable :: v allocate(v(1:no),stat=jerr) if(jerr.ne.0) return w=w/sum(w) v=sqrt(w) if(intr .ne. 0)goto 19571 do 19581 j=1,ni if(ju(j).eq.0)goto 19581 xm(j)=0.0 x(:,j)=v*x(:,j) z=dot_product(x(:,j),x(:,j)) if(isd .le. 0)goto 19601 xbq=dot_product(v,x(:,j))**2 vc=z-xbq xs(j)=sqrt(vc) x(:,j)=x(:,j)/xs(j) xv(j)=1.0+xbq/vc goto 19611 19601 continue xs(j)=1.0 xv(j)=z 19611 continue continue 19581 continue continue ys0=0.0 do 19621 j=1,nr ym(j)=0.0 y(:,j)=v*y(:,j) z=dot_product(y(:,j),y(:,j)) if(jsd .le. 0)goto 19641 u=z-dot_product(v,y(:,j))**2 ys0=ys0+z/u ys(j)=sqrt(u) y(:,j)=y(:,j)/ys(j) goto 19651 19641 continue ys(j)=1.0 ys0=ys0+z 19651 continue continue 19621 continue continue go to 10700 19571 continue do 19661 j=1,ni if(ju(j).eq.0)goto 19661 xm(j)=dot_product(w,x(:,j)) x(:,j)=v*(x(:,j)-xm(j)) xv(j)=dot_product(x(:,j),x(:,j)) if(isd.gt.0) xs(j)=sqrt(xv(j)) 19661 continue continue if(isd .ne. 0)goto 19681 xs=1.0 goto 19691 19681 continue do 19701 j=1,ni if(ju(j).eq.0)goto 19701 x(:,j)=x(:,j)/xs(j) 19701 continue continue xv=1.0 19691 continue continue ys0=0.0 do 19711 j=1,nr ym(j)=dot_product(w,y(:,j)) y(:,j)=v*(y(:,j)-ym(j)) z=dot_product(y(:,j),y(:,j)) if(jsd .le. 0)goto 19731 ys(j)=sqrt(z) y(:,j)=y(:,j)/ys(j) goto 19741 19731 continue ys0=ys0+z 19741 continue continue 19711 continue continue if(jsd .ne. 0)goto 19761 ys=1.0 goto 19771 19761 continue ys0=nr 19771 continue continue 10700 continue deallocate(v) return end subroutine multelnet2(beta,ni,nr,ju,vp,cl,y,no,ne,nx,x,nlam,flmin, *ulam,thri, maxit,xv,ys0,lmu,ao,ia,kin,rsqo,almo,nlp,jerr) implicit double precision(a-h,o-z) double precision vp(ni),y(no,nr),x(no,ni),ulam(nlam),ao(nx,nr,nlam *) double precision rsqo(nlam),almo(nlam),xv(ni),cl(2,nr,ni) integer ju(ni),ia(nx),kin(nlam) double precision, dimension (:), allocatable :: g,gk,del,gj integer, dimension (:), allocatable :: mm,ix,isc double precision, dimension (:,:), allocatable :: a allocate(a(1:nr,1:ni),stat=jerr) if(jerr.ne.0) return call get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx,itrace) allocate(gj(1:nr),stat=jerr) if(jerr.ne.0) return allocate(gk(1:nr),stat=jerr) if(jerr.ne.0) return allocate(del(1:nr),stat=jerr) if(jerr.ne.0) return allocate(mm(1:ni),stat=jerr) if(jerr.ne.0) return allocate(g(1:ni),stat=jerr) if(jerr.ne.0) return allocate(ix(1:ni),stat=jerr) if(jerr.ne.0) return allocate(isc(1:nr),stat=jerr) if(jerr.ne.0) return bta=beta omb=1.0-bta ix=0 thr=thri*ys0/nr alf=1.0 if(flmin .ge. 1.0)goto 19791 eqs=max(eps,flmin) alf=eqs**(1.0/(nlam-1)) 19791 continue rsq=ys0 a=0.0 mm=0 nlp=0 nin=nlp iz=0 mnl=min(mnlam,nlam) alm=0.0 do 19801 j=1,ni if(ju(j).eq.0)goto 19801 g(j)=0.0 do 19811 k=1,nr g(j)=g(j)+dot_product(y(:,k),x(:,j))**2 19811 continue continue g(j)=sqrt(g(j)) 19801 continue continue do 19821 m=1,nlam if(itrace.ne.0) call setpb(m-1) alm0=alm if(flmin .lt. 1.0)goto 19841 alm=ulam(m) goto 19831 19841 if(m .le. 2)goto 19851 alm=alm*alf goto 19831 19851 if(m .ne. 1)goto 19861 alm=big goto 19871 19861 continue alm0=0.0 do 19881 j=1,ni if(ju(j).eq.0)goto 19881 if(vp(j).gt.0.0) alm0=max(alm0,g(j)/vp(j)) 19881 continue continue alm0=alm0/max(bta,1.0d-3) alm=alf*alm0 19871 continue 19831 continue dem=alm*omb ab=alm*bta rsq0=rsq jz=1 tlam=bta*(2.0*alm-alm0) do 19891 k=1,ni if(ix(k).eq.1)goto 19891 if(ju(k).eq.0)goto 19891 if(g(k).gt.tlam*vp(k)) ix(k)=1 19891 continue continue continue 19901 continue if(iz*jz.ne.0) go to 10360 10880 continue nlp=nlp+1 dlx=0.0 do 19911 k=1,ni if(ix(k).eq.0)goto 19911 gkn=0.0 do 19921 j=1,nr gj(j)=dot_product(y(:,j),x(:,k)) gk(j)=gj(j)+a(j,k)*xv(k) gkn=gkn+gk(j)**2 19921 continue continue gkn=sqrt(gkn) u=1.0-ab*vp(k)/gkn del=a(:,k) if(u .gt. 0.0)goto 19941 a(:,k)=0.0 goto 19951 19941 continue a(:,k)=gk*(u/(xv(k)+dem*vp(k))) call chkbnds(nr,gk,gkn,xv(k),cl(1,1,k), dem*vp(k),ab*vp(k),a(:,k) *,isc,jerr) if(jerr.ne.0) return 19951 continue continue del=a(:,k)-del if(maxval(abs(del)).le.0.0)goto 19911 do 19961 j=1,nr rsq=rsq-del(j)*(2.0*gj(j)-del(j)*xv(k)) y(:,j)=y(:,j)-del(j)*x(:,k) dlx=max(dlx,xv(k)*del(j)**2) 19961 continue continue if(mm(k) .ne. 0)goto 19981 nin=nin+1 if(nin.gt.nx)goto 19912 mm(k)=nin ia(nin)=k 19981 continue 19911 continue 19912 continue if(nin.gt.nx)goto 19902 if(dlx .ge. thr)goto 20001 ixx=0 do 20011 k=1,ni if(ix(k).eq.1)goto 20011 if(ju(k).eq.0)goto 20011 g(k)=0.0 do 20021 j=1,nr g(k)=g(k)+dot_product(y(:,j),x(:,k))**2 20021 continue continue g(k)=sqrt(g(k)) if(g(k) .le. ab*vp(k))goto 20041 ix(k)=1 ixx=1 20041 continue 20011 continue continue if(ixx.eq.1) go to 10880 goto 19902 20001 continue if(nlp .le. maxit)goto 20061 jerr=-m return 20061 continue 10360 continue iz=1 continue 20071 continue nlp=nlp+1 dlx=0.0 do 20081 l=1,nin k=ia(l) gkn=0.0 do 20091 j=1,nr gj(j)=dot_product(y(:,j),x(:,k)) gk(j)=gj(j)+a(j,k)*xv(k) gkn=gkn+gk(j)**2 20091 continue continue gkn=sqrt(gkn) u=1.0-ab*vp(k)/gkn del=a(:,k) if(u .gt. 0.0)goto 20111 a(:,k)=0.0 goto 20121 20111 continue a(:,k)=gk*(u/(xv(k)+dem*vp(k))) call chkbnds(nr,gk,gkn,xv(k),cl(1,1,k), dem*vp(k),ab*vp(k),a(:,k) *,isc,jerr) if(jerr.ne.0) return 20121 continue continue del=a(:,k)-del if(maxval(abs(del)).le.0.0)goto 20081 do 20131 j=1,nr rsq=rsq-del(j)*(2.0*gj(j)-del(j)*xv(k)) y(:,j)=y(:,j)-del(j)*x(:,k) dlx=max(dlx,xv(k)*del(j)**2) 20131 continue continue 20081 continue continue if(dlx.lt.thr)goto 20072 if(nlp .le. maxit)goto 20151 jerr=-m return 20151 continue goto 20071 20072 continue jz=0 goto 19901 19902 continue if(nin .le. nx)goto 20171 jerr=-10000-m goto 19822 20171 continue if(nin .le. 0)goto 20191 do 20201 j=1,nr ao(1:nin,j,m)=a(j,ia(1:nin)) 20201 continue continue 20191 continue kin(m)=nin rsqo(m)=1.0-rsq/ys0 almo(m)=alm lmu=m if(m.lt.mnl)goto 19821 if(flmin.ge.1.0)goto 19821 me=0 do 20211 j=1,nin if(ao(j,1,m).ne.0.0) me=me+1 20211 continue continue if(me.gt.ne)goto 19822 if(rsq0-rsq.lt.sml*rsq)goto 19822 if(rsqo(m).gt.rsqmax)goto 19822 19821 continue 19822 continue deallocate(a,mm,g,ix,del,gj,gk) return end subroutine chkbnds(nr,gk,gkn,xv,cl,al1,al2,a,isc,jerr) implicit double precision(a-h,o-z) double precision gk(nr),cl(2,nr),a(nr) integer isc(nr) kerr=0 al1p=1.0+al1/xv al2p=al2/xv isc=0 gsq=gkn**2 asq=dot_product(a,a) usq=0.0 u=0.0 kn=-1 continue 20221 continue vmx=0.0 do 20231 k=1,nr v=max(a(k)-cl(2,k),cl(1,k)-a(k)) if(v .le. vmx)goto 20251 vmx=v kn=k 20251 continue 20231 continue continue if(vmx.le.0.0)goto 20222 if(isc(kn).ne.0)goto 20222 gsq=gsq-gk(kn)**2 g=sqrt(gsq)/xv if(a(kn).lt.cl(1,kn)) u=cl(1,kn) if(a(kn).gt.cl(2,kn)) u=cl(2,kn) usq=usq+u**2 if(usq .ne. 0.0)goto 20271 b=max(0d0,(g-al2p)/al1p) goto 20281 20271 continue b0=sqrt(asq-a(kn)**2) b=bnorm(b0,al1p,al2p,g,usq,kerr) if(kerr.ne.0)goto 20222 20281 continue continue asq=usq+b**2 if(asq .gt. 0.0)goto 20301 a=0.0 goto 20222 20301 continue a(kn)=u isc(kn)=1 f=1.0/(xv*(al1p+al2p/sqrt(asq))) do 20311 j=1,nr if(isc(j).eq.0) a(j)=f*gk(j) 20311 continue continue goto 20221 20222 continue if(kerr.ne.0) jerr=kerr return end subroutine chkbnds1(nr,gk,gkn,xv,cl1,cl2,al1,al2,a,isc,jerr) implicit double precision(a-h,o-z) double precision gk(nr),a(nr) integer isc(nr) kerr=0 al1p=1.0+al1/xv al2p=al2/xv isc=0 gsq=gkn**2 asq=dot_product(a,a) usq=0.0 u=0.0 kn=-1 continue 20321 continue vmx=0.0 do 20331 k=1,nr v=max(a(k)-cl2,cl1-a(k)) if(v .le. vmx)goto 20351 vmx=v kn=k 20351 continue 20331 continue continue if(vmx.le.0.0)goto 20322 if(isc(kn).ne.0)goto 20322 gsq=gsq-gk(kn)**2 g=sqrt(gsq)/xv if(a(kn).lt.cl1) u=cl1 if(a(kn).gt.cl2) u=cl2 usq=usq+u**2 if(usq .ne. 0.0)goto 20371 b=max(0d0,(g-al2p)/al1p) goto 20381 20371 continue b0=sqrt(asq-a(kn)**2) b=bnorm(b0,al1p,al2p,g,usq,kerr) if(kerr.ne.0)goto 20322 20381 continue continue asq=usq+b**2 if(asq .gt. 0.0)goto 20401 a=0.0 goto 20322 20401 continue a(kn)=u isc(kn)=1 f=1.0/(xv*(al1p+al2p/sqrt(asq))) do 20411 j=1,nr if(isc(j).eq.0) a(j)=f*gk(j) 20411 continue continue goto 20321 20322 continue if(kerr.ne.0) jerr=kerr return end function bnorm(b0,al1p,al2p,g,usq,jerr) implicit double precision(a-h,o-z) data thr,mxit /1.0d-10,100/ b=b0 zsq=b**2+usq if(zsq .gt. 0.0)goto 20431 bnorm=0.0 return 20431 continue z=sqrt(zsq) f=b*(al1p+al2p/z)-g jerr=0 do 20441 it=1,mxit b=b-f/(al1p+al2p*usq/(z*zsq)) zsq=b**2+usq if(zsq .gt. 0.0)goto 20461 bnorm=0.0 return 20461 continue z=sqrt(zsq) f=b*(al1p+al2p/z)-g if(abs(f).le.thr)goto 20442 if(b .gt. 0.0)goto 20481 b=0.0 goto 20442 20481 continue 20441 continue 20442 continue bnorm=b if(it.ge.mxit) jerr=90000 return entry chg_bnorm(arg,irg) bnorm = 0.0 thr=arg mxit=irg return entry get_bnorm(arg,irg) bnorm = 0.0 arg=thr irg=mxit return end subroutine multsolns(ni,nx,nr,lmu,a,ia,nin,b) implicit double precision(a-h,o-z) double precision a(nx,nr,lmu),b(ni,nr,lmu) integer ia(nx),nin(lmu) do 20491 lam=1,lmu call multuncomp(ni,nr,nx,a(1,1,lam),ia,nin(lam),b(1,1,lam)) 20491 continue continue return end subroutine multuncomp(ni,nr,nx,ca,ia,nin,a) implicit double precision(a-h,o-z) double precision ca(nx,nr),a(ni,nr) integer ia(nx) a=0.0 if(nin .le. 0)goto 20511 do 20521 j=1,nr a(ia(1:nin),j)=ca(1:nin,j) 20521 continue continue 20511 continue return end subroutine multmodval(nx,nr,a0,ca,ia,nin,n,x,f) implicit double precision(a-h,o-z) double precision a0(nr),ca(nx,nr),x(n,*),f(nr,n) integer ia(nx) do 20531 i=1,n f(:,i)=a0 20531 continue continue if(nin.le.0) return do 20541 i=1,n do 20551 j=1,nr f(j,i)=f(j,i)+dot_product(ca(1:nin,j),x(i,ia(1:nin))) 20551 continue continue 20541 continue continue return end subroutine multspelnet(parm,no,ni,nr,x,ix,jx,y,w,jd,vp,cl,ne,nx, *nlam,flmin,ulam,thr,isd, jsd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm, *nlp,jerr) implicit double precision(a-h,o-z) double precision x(*),y(no,nr),w(no),vp(ni),ulam(nlam),cl(2,ni) double precision ca(nx,nr,nlam),a0(nr,nlam),rsq(nlam),alm(nlam) integer ix(*),jx(*),jd(*),ia(nx),nin(nlam) double precision, dimension (:), allocatable :: vq; if(maxval(vp) .gt. 0.0)goto 20571 jerr=10000 return 20571 continue allocate(vq(1:ni),stat=jerr) if(jerr.ne.0) return vq=max(0d0,vp) vq=vq*ni/sum(vq) call multspelnetn(parm,no,ni,nr,x,ix,jx,y,w,jd,vq,cl,ne,nx,nlam,fl *min, ulam,thr,isd,jsd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jer *r) deallocate(vq) return end subroutine multspelnetn(parm,no,ni,nr,x,ix,jx,y,w,jd,vp,cl,ne,nx,n *lam,flmin, ulam,thr,isd,jsd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,n *lp,jerr) implicit double precision(a-h,o-z) double precision x(*),vp(ni),y(no,nr),w(no),ulam(nlam),cl(2,ni) double precision ca(nx,nr,nlam),a0(nr,nlam),rsq(nlam),alm(nlam) integer ix(*),jx(*),jd(*),ia(nx),nin(nlam) double precision, dimension (:), allocatable :: xm,xs,xv,ym,ys integer, dimension (:), allocatable :: ju double precision, dimension (:,:,:), allocatable :: clt allocate(clt(1:2,1:nr,1:ni),stat=jerr) if(jerr.ne.0) return allocate(xm(1:ni),stat=jerr) if(jerr.ne.0) return allocate(xs(1:ni),stat=jerr) if(jerr.ne.0) return allocate(ym(1:nr),stat=jerr) if(jerr.ne.0) return allocate(ys(1:nr),stat=jerr) if(jerr.ne.0) return allocate(ju(1:ni),stat=jerr) if(jerr.ne.0) return allocate(xv(1:ni),stat=jerr) if(jerr.ne.0) return call spchkvars(no,ni,x,ix,ju) if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 if(maxval(ju) .gt. 0)goto 20591 jerr=7777 return 20591 continue call multspstandard1(no,ni,nr,x,ix,jx,y,w,ju,isd,jsd,intr, xm,xs, *ym,ys,xv,ys0,jerr) if(jerr.ne.0) return do 20601 j=1,ni do 20611 k=1,nr do 20621 i=1,2 clt(i,k,j)=cl(i,j) 20621 continue continue 20611 continue continue 20601 continue continue if(isd .le. 0)goto 20641 do 20651 j=1,ni do 20661 k=1,nr do 20671 i=1,2 clt(i,k,j)=clt(i,k,j)*xs(j) 20671 continue continue 20661 continue continue 20651 continue continue 20641 continue if(jsd .le. 0)goto 20691 do 20701 j=1,ni do 20711 k=1,nr do 20721 i=1,2 clt(i,k,j)=clt(i,k,j)/ys(k) 20721 continue continue 20711 continue continue 20701 continue continue 20691 continue call multspelnet2(parm,ni,nr,y,w,no,ne,nx,x,ix,jx,ju,vp,clt,nlam,f *lmin, ulam,thr,maxit,xm,xs,xv,ys0,lmu,ca,ia,nin,rsq,alm,nlp,jerr) if(jerr.gt.0) return do 20731 k=1,lmu nk=nin(k) do 20741 j=1,nr do 20751 l=1,nk ca(l,j,k)=ys(j)*ca(l,j,k)/xs(ia(l)) 20751 continue continue if(intr .ne. 0)goto 20771 a0(j,k)=0.0 goto 20781 20771 continue a0(j,k)=ym(j)-dot_product(ca(1:nk,j,k),xm(ia(1:nk))) 20781 continue continue 20741 continue continue 20731 continue continue deallocate(xm,xs,ym,ys,ju,xv,clt) return end subroutine multspstandard1(no,ni,nr,x,ix,jx,y,w,ju,isd,jsd,intr, *xm,xs,ym,ys,xv,ys0,jerr) implicit double precision(a-h,o-z) double precision x(*),y(no,nr),w(no),xm(ni),xs(ni),xv(ni),ym(nr),y *s(nr) integer ix(*),jx(*),ju(ni) jerr = jerr*1 w=w/sum(w) if(intr .ne. 0)goto 20801 do 20811 j=1,ni if(ju(j).eq.0)goto 20811 xm(j)=0.0 jb=ix(j) je=ix(j+1)-1 z=dot_product(w(jx(jb:je)),x(jb:je)**2) if(isd .le. 0)goto 20831 xbq=dot_product(w(jx(jb:je)),x(jb:je))**2 vc=z-xbq xs(j)=sqrt(vc) xv(j)=1.0+xbq/vc goto 20841 20831 continue xs(j)=1.0 xv(j)=z 20841 continue continue 20811 continue continue ys0=0.0 do 20851 j=1,nr ym(j)=0.0 z=dot_product(w,y(:,j)**2) if(jsd .le. 0)goto 20871 u=z-dot_product(w,y(:,j))**2 ys0=ys0+z/u ys(j)=sqrt(u) y(:,j)=y(:,j)/ys(j) goto 20881 20871 continue ys(j)=1.0 ys0=ys0+z 20881 continue continue 20851 continue continue return 20801 continue do 20891 j=1,ni if(ju(j).eq.0)goto 20891 jb=ix(j) je=ix(j+1)-1 xm(j)=dot_product(w(jx(jb:je)),x(jb:je)) xv(j)=dot_product(w(jx(jb:je)),x(jb:je)**2)-xm(j)**2 if(isd.gt.0) xs(j)=sqrt(xv(j)) 20891 continue continue if(isd .ne. 0)goto 20911 xs=1.0 goto 20921 20911 continue xv=1.0 20921 continue continue ys0=0.0 do 20931 j=1,nr ym(j)=dot_product(w,y(:,j)) y(:,j)=y(:,j)-ym(j) z=dot_product(w,y(:,j)**2) if(jsd .le. 0)goto 20951 ys(j)=sqrt(z) y(:,j)=y(:,j)/ys(j) goto 20961 20951 continue ys0=ys0+z 20961 continue continue 20931 continue continue if(jsd .ne. 0)goto 20981 ys=1.0 goto 20991 20981 continue ys0=nr 20991 continue continue return end subroutine multspelnet2(beta,ni,nr,y,w,no,ne,nx,x,ix,jx,ju,vp,cl,n *lam,flmin, ulam,thri,maxit,xm,xs,xv,ys0,lmu,ao,ia,kin,rsqo,almo,n *lp,jerr) implicit double precision(a-h,o-z) double precision y(no,nr),w(no),x(*),vp(ni),ulam(nlam),cl(2,nr,ni) double precision ao(nx,nr,nlam),rsqo(nlam),almo(nlam),xm(ni),xs(ni *),xv(ni) integer ix(*),jx(*),ju(ni),ia(nx),kin(nlam) double precision, dimension (:), allocatable :: g,gj,gk,del,o integer, dimension (:), allocatable :: mm,iy,isc double precision, dimension (:,:), allocatable :: a allocate(a(1:nr,1:ni),stat=jerr) if(jerr.ne.0) return call get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx,itrace) allocate(mm(1:ni),stat=jerr) if(jerr.ne.0) return allocate(g(1:ni),stat=jerr) if(jerr.ne.0) return allocate(gj(1:nr),stat=jerr) if(jerr.ne.0) return allocate(gk(1:nr),stat=jerr) if(jerr.ne.0) return allocate(del(1:nr),stat=jerr) if(jerr.ne.0) return allocate(o(1:nr),stat=jerr) if(jerr.ne.0) return allocate(iy(1:ni),stat=jerr) if(jerr.ne.0) return allocate(isc(1:nr),stat=jerr) if(jerr.ne.0) return bta=beta omb=1.0-bta alm=0.0 iy=0 thr=thri*ys0/nr alf=1.0 if(flmin .ge. 1.0)goto 21011 eqs=max(eps,flmin) alf=eqs**(1.0/(nlam-1)) 21011 continue rsq=ys0 a=0.0 mm=0 o=0.0 nlp=0 nin=nlp iz=0 mnl=min(mnlam,nlam) do 21021 j=1,ni if(ju(j).eq.0)goto 21021 jb=ix(j) je=ix(j+1)-1 g(j)=0.0 do 21031 k=1,nr g(j)=g(j)+(dot_product(y(jx(jb:je),k),w(jx(jb:je))*x(jb:je))/xs(j) *)**2 21031 continue continue g(j)=sqrt(g(j)) 21021 continue continue do 21041 m=1,nlam if(itrace.ne.0) call setpb(m-1) alm0=alm if(flmin .lt. 1.0)goto 21061 alm=ulam(m) goto 21051 21061 if(m .le. 2)goto 21071 alm=alm*alf goto 21051 21071 if(m .ne. 1)goto 21081 alm=big goto 21091 21081 continue alm0=0.0 do 21101 j=1,ni if(ju(j).eq.0)goto 21101 if(vp(j).gt.0.0) alm0=max(alm0,g(j)/vp(j)) 21101 continue continue alm0=alm0/max(bta,1.0d-3) alm=alf*alm0 21091 continue 21051 continue dem=alm*omb ab=alm*bta rsq0=rsq jz=1 tlam=bta*(2.0*alm-alm0) do 21111 k=1,ni if(iy(k).eq.1)goto 21111 if(ju(k).eq.0)goto 21111 if(g(k).gt.tlam*vp(k)) iy(k)=1 21111 continue continue continue 21121 continue if(iz*jz.ne.0) go to 10360 10880 continue nlp=nlp+1 dlx=0.0 do 21131 k=1,ni if(iy(k).eq.0)goto 21131 jb=ix(k) je=ix(k+1)-1 gkn=0.0 do 21141 j=1,nr gj(j)=dot_product(y(jx(jb:je),j)+o(j),w(jx(jb:je))*x(jb:je))/xs(k) gk(j)=gj(j)+a(j,k)*xv(k) gkn=gkn+gk(j)**2 21141 continue continue gkn=sqrt(gkn) u=1.0-ab*vp(k)/gkn del=a(:,k) if(u .gt. 0.0)goto 21161 a(:,k)=0.0 goto 21171 21161 continue a(:,k)=gk*(u/(xv(k)+dem*vp(k))) call chkbnds(nr,gk,gkn,xv(k),cl(1,1,k), dem*vp(k),ab*vp(k),a(:,k) *,isc,jerr) if(jerr.ne.0) return 21171 continue continue del=a(:,k)-del if(maxval(abs(del)).le.0.0)goto 21131 if(mm(k) .ne. 0)goto 21191 nin=nin+1 if(nin.gt.nx)goto 21132 mm(k)=nin ia(nin)=k 21191 continue do 21201 j=1,nr rsq=rsq-del(j)*(2.0*gj(j)-del(j)*xv(k)) y(jx(jb:je),j)=y(jx(jb:je),j)-del(j)*x(jb:je)/xs(k) o(j)=o(j)+del(j)*xm(k)/xs(k) dlx=max(xv(k)*del(j)**2,dlx) 21201 continue continue 21131 continue 21132 continue if(nin.gt.nx)goto 21122 if(dlx .ge. thr)goto 21221 ixx=0 do 21231 j=1,ni if(iy(j).eq.1)goto 21231 if(ju(j).eq.0)goto 21231 jb=ix(j) je=ix(j+1)-1 g(j)=0.0 do 21241 k=1,nr g(j)=g(j)+ (dot_product(y(jx(jb:je),k)+o(k),w(jx(jb:je))*x(jb:je) *)/xs(j))**2 21241 continue continue g(j)=sqrt(g(j)) if(g(j) .le. ab*vp(j))goto 21261 iy(j)=1 ixx=1 21261 continue 21231 continue continue if(ixx.eq.1) go to 10880 goto 21122 21221 continue if(nlp .le. maxit)goto 21281 jerr=-m return 21281 continue 10360 continue iz=1 continue 21291 continue nlp=nlp+1 dlx=0.0 do 21301 l=1,nin k=ia(l) jb=ix(k) je=ix(k+1)-1 gkn=0.0 do 21311 j=1,nr gj(j)= dot_product(y(jx(jb:je),j)+o(j),w(jx(jb:je))*x(jb:je))/xs( *k) gk(j)=gj(j)+a(j,k)*xv(k) gkn=gkn+gk(j)**2 21311 continue continue gkn=sqrt(gkn) u=1.0-ab*vp(k)/gkn del=a(:,k) if(u .gt. 0.0)goto 21331 a(:,k)=0.0 goto 21341 21331 continue a(:,k)=gk*(u/(xv(k)+dem*vp(k))) call chkbnds(nr,gk,gkn,xv(k),cl(1,1,k), dem*vp(k),ab*vp(k),a(:,k) *,isc,jerr) if(jerr.ne.0) return 21341 continue continue del=a(:,k)-del if(maxval(abs(del)).le.0.0)goto 21301 do 21351 j=1,nr rsq=rsq-del(j)*(2.0*gj(j)-del(j)*xv(k)) y(jx(jb:je),j)=y(jx(jb:je),j)-del(j)*x(jb:je)/xs(k) o(j)=o(j)+del(j)*xm(k)/xs(k) dlx=max(xv(k)*del(j)**2,dlx) 21351 continue continue 21301 continue continue if(dlx.lt.thr)goto 21292 if(nlp .le. maxit)goto 21371 jerr=-m return 21371 continue goto 21291 21292 continue jz=0 goto 21121 21122 continue if(nin .le. nx)goto 21391 jerr=-10000-m goto 21042 21391 continue if(nin .le. 0)goto 21411 do 21421 j=1,nr ao(1:nin,j,m)=a(j,ia(1:nin)) 21421 continue continue 21411 continue kin(m)=nin rsqo(m)=1.0-rsq/ys0 almo(m)=alm lmu=m if(m.lt.mnl)goto 21041 if(flmin.ge.1.0)goto 21041 me=0 do 21431 j=1,nin if(ao(j,1,m).ne.0.0) me=me+1 21431 continue continue if(me.gt.ne)goto 21042 if(rsq0-rsq.lt.sml*rsq)goto 21042 if(rsqo(m).gt.rsqmax)goto 21042 21041 continue 21042 continue deallocate(a,mm,g,iy,gj,gk,del,o) return end subroutine multlognetn(parm,no,ni,nc,x,y,g,w,ju,vp,cl,ne,nx,nlam,f *lmin,ulam, shri,intr,maxit,xv,lmu,a0,a,m,kin,dev0,dev,alm,nlp,jer *r) implicit double precision(a-h,o-z) double precision x(no,ni),y(no,nc),g(no,nc),w(no),vp(ni),ulam(nlam *),cl(2,ni) double precision a(nx,nc,nlam),a0(nc,nlam),dev(nlam),alm(nlam),xv( *ni) integer ju(ni),m(nx),kin(nlam) double precision, dimension (:,:), allocatable :: q,r,b,bs double precision, dimension (:), allocatable :: sxp,sxpl,ga,gk,del integer, dimension (:), allocatable :: mm,is,ixx,isc allocate(b(0:ni,1:nc),stat=jerr) if(jerr.ne.0) return allocate(bs(0:ni,1:nc),stat=jerr) if(jerr.ne.0) return allocate(q(1:no,1:nc),stat=jerr) if(jerr.ne.0) return allocate(r(1:no,1:nc),stat=jerr) if(jerr.ne.0) return call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx,itrace) exmn=-exmx allocate(mm(1:ni),stat=jerr) if(jerr.ne.0) return allocate(is(1:max(nc,ni)),stat=jerr) if(jerr.ne.0) return allocate(sxp(1:no),stat=jerr) if(jerr.ne.0) return allocate(sxpl(1:no),stat=jerr) if(jerr.ne.0) return allocate(ga(1:ni),stat=jerr) if(jerr.ne.0) return allocate(ixx(1:ni),stat=jerr) if(jerr.ne.0) return allocate(gk(1:nc),stat=jerr) if(jerr.ne.0) return allocate(del(1:nc),stat=jerr) if(jerr.ne.0) return allocate(isc(1:nc),stat=jerr) if(jerr.ne.0) return pmax=1.0-pmin emin=pmin/pmax emax=1.0/emin bta=parm omb=1.0-bta dev1=0.0 dev0=0.0 do 21441 ic=1,nc q0=dot_product(w,y(:,ic)) if(q0 .gt. pmin)goto 21461 jerr =8000+ic return 21461 continue if(q0 .lt. pmax)goto 21481 jerr =9000+ic return 21481 continue if(intr .ne. 0)goto 21501 q0=1.0/nc b(0,ic)=0.0 goto 21511 21501 continue b(0,ic)=log(q0) dev1=dev1-q0*b(0,ic) 21511 continue continue b(1:ni,ic)=0.0 21441 continue continue if(intr.eq.0) dev1=log(float(nc)) ixx=0 al=0.0 if(nonzero(no*nc,g) .ne. 0)goto 21531 b(0,:)=b(0,:)-sum(b(0,:))/nc sxp=0.0 do 21541 ic=1,nc q(:,ic)=exp(b(0,ic)) sxp=sxp+q(:,ic) 21541 continue continue goto 21551 21531 continue do 21561 i=1,no g(i,:)=g(i,:)-sum(g(i,:))/nc 21561 continue continue sxp=0.0 if(intr .ne. 0)goto 21581 b(0,:)=0.0 goto 21591 21581 continue call kazero(nc,no,y,g,w,b(0,:),jerr) if(jerr.ne.0) return 21591 continue continue dev1=0.0 do 21601 ic=1,nc q(:,ic)=b(0,ic)+g(:,ic) dev1=dev1-dot_product(w,y(:,ic)*q(:,ic)) q(:,ic)=exp(q(:,ic)) sxp=sxp+q(:,ic) 21601 continue continue sxpl=w*log(sxp) do 21611 ic=1,nc dev1=dev1+dot_product(y(:,ic),sxpl) 21611 continue continue 21551 continue continue do 21621 ic=1,nc do 21631 i=1,no if(y(i,ic).gt.0.0) dev0=dev0+w(i)*y(i,ic)*log(y(i,ic)) 21631 continue continue 21621 continue continue dev0=dev0+dev1 alf=1.0 if(flmin .ge. 1.0)goto 21651 eqs=max(eps,flmin) alf=eqs**(1.0/(nlam-1)) 21651 continue m=0 mm=0 nin=0 nlp=0 mnl=min(mnlam,nlam) bs=0.0 shr=shri*dev0 ga=0.0 do 21661 ic=1,nc r(:,ic)=w*(y(:,ic)-q(:,ic)/sxp) do 21671 j=1,ni if(ju(j).ne.0) ga(j)=ga(j)+dot_product(r(:,ic),x(:,j))**2 21671 continue continue 21661 continue continue ga=sqrt(ga) do 21681 ilm=1,nlam if(itrace.ne.0) call setpb(ilm-1) al0=al if(flmin .lt. 1.0)goto 21701 al=ulam(ilm) goto 21691 21701 if(ilm .le. 2)goto 21711 al=al*alf goto 21691 21711 if(ilm .ne. 1)goto 21721 al=big goto 21731 21721 continue al0=0.0 do 21741 j=1,ni if(ju(j).eq.0)goto 21741 if(vp(j).gt.0.0) al0=max(al0,ga(j)/vp(j)) 21741 continue continue al0=al0/max(bta,1.0d-3) al=alf*al0 21731 continue 21691 continue al2=al*omb al1=al*bta tlam=bta*(2.0*al-al0) do 21751 k=1,ni if(ixx(k).eq.1)goto 21751 if(ju(k).eq.0)goto 21751 if(ga(k).gt.tlam*vp(k)) ixx(k)=1 21751 continue continue 10880 continue continue 21761 continue ix=0 jx=ix kx=jx t=0.0 do 21771 ic=1,nc t=max(t,maxval(q(:,ic)*(1.0-q(:,ic)/sxp)/sxp)) 21771 continue continue if(t .ge. eps)goto 21791 kx=1 goto 21762 21791 continue t=2.0*t alt=al1/t al2t=al2/t do 21801 ic=1,nc bs(0,ic)=b(0,ic) if(nin.gt.0) bs(m(1:nin),ic)=b(m(1:nin),ic) r(:,ic)=w*(y(:,ic)-q(:,ic)/sxp)/t d=0.0 if(intr.ne.0) d=sum(r(:,ic)) if(d .eq. 0.0)goto 21821 b(0,ic)=b(0,ic)+d r(:,ic)=r(:,ic)-d*w dlx=max(dlx,d**2) 21821 continue 21801 continue continue continue 21831 continue nlp=nlp+nc dlx=0.0 do 21841 k=1,ni if(ixx(k).eq.0)goto 21841 gkn=0.0 do 21851 ic=1,nc gk(ic)=dot_product(r(:,ic),x(:,k))+b(k,ic)*xv(k) gkn=gkn+gk(ic)**2 21851 continue continue gkn=sqrt(gkn) u=1.0-alt*vp(k)/gkn del=b(k,:) if(u .gt. 0.0)goto 21871 b(k,:)=0.0 goto 21881 21871 continue b(k,:)=gk*(u/(xv(k)+vp(k)*al2t)) call chkbnds1(nc,gk,gkn,xv(k),cl(1,k), cl(2,k),vp(k)*al2t,alt*vp( *k),b(k,:),isc,jerr) if(jerr.ne.0) return 21881 continue continue del=b(k,:)-del if(maxval(abs(del)).le.0.0)goto 21841 do 21891 ic=1,nc dlx=max(dlx,xv(k)*del(ic)**2) r(:,ic)=r(:,ic)-del(ic)*w*x(:,k) 21891 continue continue if(mm(k) .ne. 0)goto 21911 nin=nin+1 if(nin .le. nx)goto 21931 jx=1 goto 21842 21931 continue mm(k)=nin m(nin)=k 21911 continue 21841 continue 21842 continue if(jx.gt.0)goto 21832 if(dlx.lt.shr)goto 21832 if(nlp .le. maxit)goto 21951 jerr=-ilm return 21951 continue continue 21961 continue nlp=nlp+nc dlx=0.0 do 21971 l=1,nin k=m(l) gkn=0.0 do 21981 ic=1,nc gk(ic)=dot_product(r(:,ic),x(:,k))+b(k,ic)*xv(k) gkn=gkn+gk(ic)**2 21981 continue continue gkn=sqrt(gkn) u=1.0-alt*vp(k)/gkn del=b(k,:) if(u .gt. 0.0)goto 22001 b(k,:)=0.0 goto 22011 22001 continue b(k,:)=gk*(u/(xv(k)+vp(k)*al2t)) call chkbnds1(nc,gk,gkn,xv(k),cl(1,k), cl(2,k),vp(k)*al2t,alt*vp( *k),b(k,:),isc,jerr) if(jerr.ne.0) return 22011 continue continue del=b(k,:)-del if(maxval(abs(del)).le.0.0)goto 21971 do 22021 ic=1,nc dlx=max(dlx,xv(k)*del(ic)**2) r(:,ic)=r(:,ic)-del(ic)*w*x(:,k) 22021 continue continue 21971 continue continue if(dlx.lt.shr)goto 21962 if(nlp .le. maxit)goto 22041 jerr=-ilm return 22041 continue goto 21961 21962 continue goto 21831 21832 continue if(jx.gt.0)goto 21762 do 22051 ic=1,nc if((b(0,ic)-bs(0,ic))**2.gt.shr) ix=1 if(ix .ne. 0)goto 22071 do 22081 j=1,nin k=m(j) if(xv(k)*(b(k,ic)-bs(k,ic))**2 .le. shr)goto 22101 ix=1 goto 22082 22101 continue 22081 continue 22082 continue 22071 continue do 22111 i=1,no fi=b(0,ic)+g(i,ic) if(nin.gt.0) fi=fi+dot_product(b(m(1:nin),ic),x(i,m(1:nin))) fi=min(max(exmn,fi),exmx) sxp(i)=sxp(i)-q(i,ic) q(i,ic)=min(max(emin*sxp(i),exp(fi)),emax*sxp(i)) sxp(i)=sxp(i)+q(i,ic) 22111 continue continue 22051 continue continue s=-sum(b(0,:))/nc b(0,:)=b(0,:)+s if(jx.gt.0)goto 21762 if(ix .ne. 0)goto 22131 do 22141 k=1,ni if(ixx(k).eq.1)goto 22141 if(ju(k).eq.0)goto 22141 ga(k)=0.0 22141 continue continue do 22151 ic=1,nc r(:,ic)=w*(y(:,ic)-q(:,ic)/sxp) do 22161 k=1,ni if(ixx(k).eq.1)goto 22161 if(ju(k).eq.0)goto 22161 ga(k)=ga(k)+dot_product(r(:,ic),x(:,k))**2 22161 continue continue 22151 continue continue ga=sqrt(ga) do 22171 k=1,ni if(ixx(k).eq.1)goto 22171 if(ju(k).eq.0)goto 22171 if(ga(k) .le. al1*vp(k))goto 22191 ixx(k)=1 ix=1 22191 continue 22171 continue continue if(ix.eq.1) go to 10880 goto 21762 22131 continue goto 21761 21762 continue if(kx .le. 0)goto 22211 jerr=-20000-ilm goto 21682 22211 continue if(jx .le. 0)goto 22231 jerr=-10000-ilm goto 21682 22231 continue devi=0.0 do 22241 ic=1,nc if(nin.gt.0) a(1:nin,ic,ilm)=b(m(1:nin),ic) a0(ic,ilm)=b(0,ic) do 22251 i=1,no if(y(i,ic).le.0.0)goto 22251 devi=devi-w(i)*y(i,ic)*log(q(i,ic)/sxp(i)) 22251 continue continue 22241 continue continue kin(ilm)=nin alm(ilm)=al lmu=ilm dev(ilm)=(dev1-devi)/dev0 if(ilm.lt.mnl)goto 21681 if(flmin.ge.1.0)goto 21681 me=0 do 22261 j=1,nin if(a(j,1,ilm).ne.0.0) me=me+1 22261 continue continue if(me.gt.ne)goto 21682 if(dev(ilm).gt.devmax)goto 21682 if(dev(ilm)-dev(ilm-1).lt.sml)goto 21682 21681 continue 21682 continue g=log(q) do 22271 i=1,no g(i,:)=g(i,:)-sum(g(i,:))/nc 22271 continue continue deallocate(sxp,b,bs,r,q,mm,is,ga,ixx,gk,del,sxpl) return end subroutine multsprlognetn(parm,no,ni,nc,x,ix,jx,y,g,w,ju,vp,cl,ne, *nx,nlam, flmin,ulam,shri,intr,maxit,xv,xb,xs,lmu,a0,a,m,kin,dev0, *dev,alm,nlp,jerr) implicit double precision(a-h,o-z) double precision x(*),y(no,nc),g(no,nc),w(no),vp(ni) double precision ulam(nlam),xb(ni),xs(ni),xv(ni) double precision a(nx,nc,nlam),a0(nc,nlam),dev(nlam),alm(nlam),cl( *2,ni) integer ix(*),jx(*),ju(ni),m(nx),kin(nlam) double precision, dimension (:,:), allocatable :: q,r,b,bs double precision, dimension (:), allocatable :: sxp,sxpl,ga,gk double precision, dimension (:), allocatable :: del,sc,svr integer, dimension (:), allocatable :: mm,is,iy,isc allocate(b(0:ni,1:nc),stat=jerr) if(jerr.ne.0) return allocate(bs(0:ni,1:nc),stat=jerr) if(jerr.ne.0) return allocate(q(1:no,1:nc),stat=jerr) if(jerr.ne.0) return allocate(r(1:no,1:nc),stat=jerr) if(jerr.ne.0) return call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx,itrace) exmn=-exmx allocate(mm(1:ni),stat=jerr) if(jerr.ne.0) return allocate(ga(1:ni),stat=jerr) if(jerr.ne.0) return allocate(gk(1:nc),stat=jerr) if(jerr.ne.0) return allocate(del(1:nc),stat=jerr) if(jerr.ne.0) return allocate(iy(1:ni),stat=jerr) if(jerr.ne.0) return allocate(is(1:max(nc,ni)),stat=jerr) if(jerr.ne.0) return allocate(sxp(1:no),stat=jerr) if(jerr.ne.0) return allocate(sxpl(1:no),stat=jerr) if(jerr.ne.0) return allocate(svr(1:nc),stat=jerr) if(jerr.ne.0) return allocate(sc(1:no),stat=jerr) if(jerr.ne.0) return allocate(isc(1:nc),stat=jerr) if(jerr.ne.0) return pmax=1.0-pmin emin=pmin/pmax emax=1.0/emin bta=parm omb=1.0-bta dev1=0.0 dev0=0.0 do 22281 ic=1,nc q0=dot_product(w,y(:,ic)) if(q0 .gt. pmin)goto 22301 jerr =8000+ic return 22301 continue if(q0 .lt. pmax)goto 22321 jerr =9000+ic return 22321 continue b(1:ni,ic)=0.0 if(intr .ne. 0)goto 22341 q0=1.0/nc b(0,ic)=0.0 goto 22351 22341 continue b(0,ic)=log(q0) dev1=dev1-q0*b(0,ic) 22351 continue continue 22281 continue continue if(intr.eq.0) dev1=log(float(nc)) iy=0 al=0.0 if(nonzero(no*nc,g) .ne. 0)goto 22371 b(0,:)=b(0,:)-sum(b(0,:))/nc sxp=0.0 do 22381 ic=1,nc q(:,ic)=exp(b(0,ic)) sxp=sxp+q(:,ic) 22381 continue continue goto 22391 22371 continue do 22401 i=1,no g(i,:)=g(i,:)-sum(g(i,:))/nc 22401 continue continue sxp=0.0 if(intr .ne. 0)goto 22421 b(0,:)=0.0 goto 22431 22421 continue call kazero(nc,no,y,g,w,b(0,:),jerr) if(jerr.ne.0) return 22431 continue continue dev1=0.0 do 22441 ic=1,nc q(:,ic)=b(0,ic)+g(:,ic) dev1=dev1-dot_product(w,y(:,ic)*q(:,ic)) q(:,ic)=exp(q(:,ic)) sxp=sxp+q(:,ic) 22441 continue continue sxpl=w*log(sxp) do 22451 ic=1,nc dev1=dev1+dot_product(y(:,ic),sxpl) 22451 continue continue 22391 continue continue do 22461 ic=1,nc do 22471 i=1,no if(y(i,ic).gt.0.0) dev0=dev0+w(i)*y(i,ic)*log(y(i,ic)) 22471 continue continue 22461 continue continue dev0=dev0+dev1 alf=1.0 if(flmin .ge. 1.0)goto 22491 eqs=max(eps,flmin) alf=eqs**(1.0/(nlam-1)) 22491 continue m=0 mm=0 nin=0 nlp=0 mnl=min(mnlam,nlam) bs=0.0 shr=shri*dev0 ga=0.0 do 22501 ic=1,nc r(:,ic)=w*(y(:,ic)-q(:,ic)/sxp) svr(ic)=sum(r(:,ic)) do 22511 j=1,ni if(ju(j).eq.0)goto 22511 jb=ix(j) je=ix(j+1)-1 gj=dot_product(r(jx(jb:je),ic),x(jb:je)) ga(j)=ga(j)+((gj-svr(ic)*xb(j))/xs(j))**2 22511 continue continue 22501 continue continue ga=sqrt(ga) do 22521 ilm=1,nlam if(itrace.ne.0) call setpb(ilm-1) al0=al if(flmin .lt. 1.0)goto 22541 al=ulam(ilm) goto 22531 22541 if(ilm .le. 2)goto 22551 al=al*alf goto 22531 22551 if(ilm .ne. 1)goto 22561 al=big goto 22571 22561 continue al0=0.0 do 22581 j=1,ni if(ju(j).eq.0)goto 22581 if(vp(j).gt.0.0) al0=max(al0,ga(j)/vp(j)) 22581 continue continue al0=al0/max(bta,1.0d-3) al=alf*al0 22571 continue 22531 continue al2=al*omb al1=al*bta tlam=bta*(2.0*al-al0) do 22591 k=1,ni if(iy(k).eq.1)goto 22591 if(ju(k).eq.0)goto 22591 if(ga(k).gt.tlam*vp(k)) iy(k)=1 22591 continue continue 10880 continue continue 22601 continue ixx=0 jxx=ixx kxx=jxx t=0.0 do 22611 ic=1,nc t=max(t,maxval(q(:,ic)*(1.0-q(:,ic)/sxp)/sxp)) 22611 continue continue if(t .ge. eps)goto 22631 kxx=1 goto 22602 22631 continue t=2.0*t alt=al1/t al2t=al2/t do 22641 ic=1,nc bs(0,ic)=b(0,ic) if(nin.gt.0) bs(m(1:nin),ic)=b(m(1:nin),ic) r(:,ic)=w*(y(:,ic)-q(:,ic)/sxp)/t svr(ic)=sum(r(:,ic)) if(intr .eq. 0)goto 22661 b(0,ic)=b(0,ic)+svr(ic) r(:,ic)=r(:,ic)-svr(ic)*w dlx=max(dlx,svr(ic)**2) 22661 continue 22641 continue continue continue 22671 continue nlp=nlp+nc dlx=0.0 do 22681 k=1,ni if(iy(k).eq.0)goto 22681 jb=ix(k) je=ix(k+1)-1 del=b(k,:) gkn=0.0 do 22691 ic=1,nc u=(dot_product(r(jx(jb:je),ic),x(jb:je))-svr(ic)*xb(k))/xs(k) gk(ic)=u+del(ic)*xv(k) gkn=gkn+gk(ic)**2 22691 continue continue gkn=sqrt(gkn) u=1.0-alt*vp(k)/gkn if(u .gt. 0.0)goto 22711 b(k,:)=0.0 goto 22721 22711 continue b(k,:)=gk*(u/(xv(k)+vp(k)*al2t)) call chkbnds1(nc,gk,gkn,xv(k),cl(1,k),cl(2,k), vp(k)*al2t,alt*vp( *k),b(k,:),isc,jerr) if(jerr.ne.0) return 22721 continue continue del=b(k,:)-del if(maxval(abs(del)).le.0.0)goto 22681 do 22731 ic=1,nc dlx=max(dlx,xv(k)*del(ic)**2) r(jx(jb:je),ic)=r(jx(jb:je),ic) -del(ic)*w(jx(jb:je))*(x(jb:je)-x *b(k))/xs(k) 22731 continue continue if(mm(k) .ne. 0)goto 22751 nin=nin+1 if(nin .le. nx)goto 22771 jxx=1 goto 22682 22771 continue mm(k)=nin m(nin)=k 22751 continue 22681 continue 22682 continue if(jxx.gt.0)goto 22672 if(dlx.lt.shr)goto 22672 if(nlp .le. maxit)goto 22791 jerr=-ilm return 22791 continue continue 22801 continue nlp=nlp+nc dlx=0.0 do 22811 l=1,nin k=m(l) jb=ix(k) je=ix(k+1)-1 del=b(k,:) gkn=0.0 do 22821 ic=1,nc u=(dot_product(r(jx(jb:je),ic),x(jb:je)) -svr(ic)*xb(k))/xs(k) gk(ic)=u+del(ic)*xv(k) gkn=gkn+gk(ic)**2 22821 continue continue gkn=sqrt(gkn) u=1.0-alt*vp(k)/gkn if(u .gt. 0.0)goto 22841 b(k,:)=0.0 goto 22851 22841 continue b(k,:)=gk*(u/(xv(k)+vp(k)*al2t)) call chkbnds1(nc,gk,gkn,xv(k),cl(1,k),cl(2,k), vp(k)*al2t,alt*vp( *k),b(k,:),isc,jerr) if(jerr.ne.0) return 22851 continue continue del=b(k,:)-del if(maxval(abs(del)).le.0.0)goto 22811 do 22861 ic=1,nc dlx=max(dlx,xv(k)*del(ic)**2) r(jx(jb:je),ic)=r(jx(jb:je),ic) -del(ic)*w(jx(jb:je))*(x(jb:je)-x *b(k))/xs(k) 22861 continue continue 22811 continue continue if(dlx.lt.shr)goto 22802 if(nlp .le. maxit)goto 22881 jerr=-ilm return 22881 continue goto 22801 22802 continue goto 22671 22672 continue if(jxx.gt.0)goto 22602 do 22891 ic=1,nc if((b(0,ic)-bs(0,ic))**2.gt.shr) ixx=1 if(ixx .ne. 0)goto 22911 do 22921 j=1,nin k=m(j) if(xv(k)*(b(k,ic)-bs(k,ic))**2 .le. shr)goto 22941 ixx=1 goto 22922 22941 continue 22921 continue 22922 continue 22911 continue sc=b(0,ic)+g(:,ic) b0=0.0 do 22951 j=1,nin l=m(j) jb=ix(l) je=ix(l+1)-1 sc(jx(jb:je))=sc(jx(jb:je))+b(l,ic)*x(jb:je)/xs(l) b0=b0-b(l,ic)*xb(l)/xs(l) 22951 continue continue sc=min(max(exmn,sc+b0),exmx) sxp=sxp-q(:,ic) q(:,ic)=min(max(emin*sxp,exp(sc)),emax*sxp) sxp=sxp+q(:,ic) 22891 continue continue s=sum(b(0,:))/nc b(0,:)=b(0,:)-s if(jxx.gt.0)goto 22602 if(ixx .ne. 0)goto 22971 do 22981 j=1,ni if(iy(j).eq.1)goto 22981 if(ju(j).eq.0)goto 22981 ga(j)=0.0 22981 continue continue do 22991 ic=1,nc r(:,ic)=w*(y(:,ic)-q(:,ic)/sxp) do 23001 j=1,ni if(iy(j).eq.1)goto 23001 if(ju(j).eq.0)goto 23001 jb=ix(j) je=ix(j+1)-1 gj=dot_product(r(jx(jb:je),ic),x(jb:je)) ga(j)=ga(j)+((gj-svr(ic)*xb(j))/xs(j))**2 23001 continue continue 22991 continue continue ga=sqrt(ga) do 23011 k=1,ni if(iy(k).eq.1)goto 23011 if(ju(k).eq.0)goto 23011 if(ga(k) .le. al1*vp(k))goto 23031 iy(k)=1 ixx=1 23031 continue 23011 continue continue if(ixx.eq.1) go to 10880 goto 22602 22971 continue goto 22601 22602 continue if(kxx .le. 0)goto 23051 jerr=-20000-ilm goto 22522 23051 continue if(jxx .le. 0)goto 23071 jerr=-10000-ilm goto 22522 23071 continue devi=0.0 do 23081 ic=1,nc if(nin.gt.0) a(1:nin,ic,ilm)=b(m(1:nin),ic) a0(ic,ilm)=b(0,ic) do 23091 i=1,no if(y(i,ic).le.0.0)goto 23091 devi=devi-w(i)*y(i,ic)*log(q(i,ic)/sxp(i)) 23091 continue continue 23081 continue continue kin(ilm)=nin alm(ilm)=al lmu=ilm dev(ilm)=(dev1-devi)/dev0 if(ilm.lt.mnl)goto 22521 if(flmin.ge.1.0)goto 22521 me=0 do 23101 j=1,nin if(a(j,1,ilm).ne.0.0) me=me+1 23101 continue continue if(me.gt.ne)goto 22522 if(dev(ilm).gt.devmax)goto 22522 if(dev(ilm)-dev(ilm-1).lt.sml)goto 22522 22521 continue 22522 continue g=log(q) do 23111 i=1,no g(i,:)=g(i,:)-sum(g(i,:))/nc 23111 continue continue deallocate(sxp,b,bs,r,q,mm,is,sc,ga,iy,gk,del,sxpl) return end subroutine psort7(v,a,ii,jj) implicit double precision(a-h,o-z) c c puts into a the permutation vector which sorts v into c increasing order. the array v is not modified. c only elements from ii to jj are considered. c arrays iu(k) and il(k) permit sorting up to 2**(k+1)-1 elements c c this is a modification of cacm algorithm #347 by r. c. singleton, c which is a modified hoare quicksort. c dimension a(jj),v(jj),iu(20),il(20) integer t,tt integer a double precision v m=1 i=ii j=jj 10 if (i.ge.j) go to 80 20 k=i ij=(j+i)/2 t=a(ij) vt=v(t) if (v(a(i)).le.vt) go to 30 a(ij)=a(i) a(i)=t t=a(ij) vt=v(t) 30 l=j if (v(a(j)).ge.vt) go to 50 a(ij)=a(j) a(j)=t t=a(ij) vt=v(t) if (v(a(i)).le.vt) go to 50 a(ij)=a(i) a(i)=t t=a(ij) vt=v(t) go to 50 40 a(l)=a(k) a(k)=tt 50 l=l-1 if (v(a(l)).gt.vt) go to 50 tt=a(l) vtt=v(tt) 60 k=k+1 if (v(a(k)).lt.vt) go to 60 if (k.le.l) go to 40 if (l-i.le.j-k) go to 70 il(m)=i iu(m)=l i=k m=m+1 go to 90 70 il(m)=k iu(m)=j j=l m=m+1 go to 90 80 m=m-1 if (m.eq.0) return i=il(m) j=iu(m) 90 if (j-i.gt.10) go to 20 if (i.eq.ii) go to 10 i=i-1 100 i=i+1 if (i.eq.j) go to 80 t=a(i+1) vt=v(t) if (v(a(i)).le.vt) go to 100 k=i 110 a(k+1)=a(k) k=k-1 if (vt.lt.v(a(k))) go to 110 a(k+1)=t go to 100 end glmnet/vignettes/0000755000176200001440000000000013574046201013552 5ustar liggesusersglmnet/vignettes/Coxnet.Rmd0000644000176200001440000000677113556622666015510 0ustar liggesusers--- title: "Coxnet: Regularized Cox Regression" author: "Noah Simon, Jerome Friedman, Trevor Hastie and Rob Tibshirani" date: '`r Sys.Date()`' bibliography: assets/glmnet_refs.bib link-citations: true output: pdf_document: fig_caption: yes toc: yes toc_depth: 3 vignette: > %\VignetteIndexEntry{Coxnet: Regularized Cox Regression} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} --- ## Introduction We will give a short tutorial on using coxnet. Coxnet is a function which fits the Cox Model regularized by an elastic net penalty. It is used for underdetermined (or nearly underdetermined systems) and chooses a small number of covariates to include in the model. Because the Cox Model is rarely used for actual prediction, we will rather focus on finding and interpretating an appropriate model. We give a simple example of how to format data and run the Cox Model in glmnet with cross validation. Further details may be found in @coxnet, @strongrules and @block. ## Example We first load our data and set up the response. In this case $x$ must be an $n$ by $p$ matrix of covariate values --- each row corresponds to a patient and each column a covariate. $y$ is an $n$ length vector of failure/censoring times, and status is an $n$ length vector with each entry, a $1$ or a $0$, indicating whether the corresponding entry in $y$ is indicative of a failure time or right censoring time ($1$ for failure, $0$ for censoring) ```{r} library("glmnet") library("survival") patient.data <- readRDS("assets/coxnet.RDS") ``` We then call our functions to fit with the lasso penalty ($\alpha=1$), and cross validate. We set maxit = 1000 (increasing the maximum number of iterations to $1000$) because our data is relatively high dimensional, so more iterations are needed for convergence. In practice, the function will spit out an error if convergence isn't reached by the maximum number of iterations. ```{r, warning = TRUE} cv.fit <- cv.glmnet(patient.data$x, Surv(patient.data$time, patient.data$status), family="cox", maxit = 1000) fit <- glmnet(patient.data$x, Surv(patient.data$time,patient.data$status), family = "cox", maxit = 1000) ``` The Surv function packages the survival data into the form expected by glmnet. Once fit, we can view the optimal $\lambda$ value and a cross validated error plot to help evaluate our model. ```{r} plot(cv.fit) cv.fit$lambda.min ``` The left vertical line in our plot shows us where the CV-error curve hits its minimum. The right vertical line shows us the most regularized model with CV-error within$1$standard deviation of the minimum. In this case, we see that the minimum was achieved by a fairly regularized model, however the right line indicates that the null model (no coefficients included) is within$1$sd of the minimum. This might lead us to believe that in actuality the covariates are not explaining any variability. For the time being we will concern ourselves with the minimum CV-error model. We can check which covariates our model chose to be active, and see the coefficients of those covariates. ```{r} Coefficients <- coef(fit, s = cv.fit$lambda.min) Active.Index <- which(Coefficients != 0) Active.Coefficients <- Coefficients[Active.Index] ``` `coef(fit, s = cv.fit\$lambda.min)` returns the $p$ length coefficient vector of the solution corresponding to $\lambda =$`cv.fit$lambda.min`. ```{r} Active.Index Active.Coefficients ``` We see that our optimal model chose 2 active covariates ($X80$ and $X394$) each with a small positive effect on hazard. ## References glmnet/vignettes/relax.Rmd0000644000176200001440000003516613560660761015354 0ustar liggesusers--- title: "Relaxed fits and other additions in `glmnet` 3.0" author: "Trevor Hastie, Balasubramanian Narasimhan and Rob Tibshirani" date: "October 15, 2019" bibliography: assets/glmnet_refs.bib link-citations: true output: pdf_document: fig_caption: yes toc: yes toc_depth: 3 vignette: > %\VignetteIndexEntry{Relaxed fits} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} --- ## Introduction In our vignette "glmnet" we give details for fitting lasso and elastic-net regularized models, for CV and various aspects of glmnet modeling. In this vignette, we highlight some of the new tools and features in the major revision glmnet 3.0. The main edition is the introduction of the *relaxed lasso*. The idea is to take a glmnet fitted object, and then for each lambda, refit the variables in the active set without any penalization. This gives the `relaxed` fit (note, there have been other definitions of a relaxed fit, but this is the one we prefer). This could of course be done for elastic net fits as well as lasso. However, if the number of variables gets too close to the sample size N, the relaxed path will be truncated. Furthermore, for binomial and other nonlinear GLMs convergence can be an issue with our current implementation if the number of variables is too large, and perversely if the relaxed fit is too strong. Suppose the `glmnet` fitted linear predictor at $\lambda$ is $\hat\eta_\lambda(x)$ and the relaxed version is $\tilde \eta_\lambda(x)$. We also allow for shrinkage between the two: $$\tilde \eta_{\lambda,\gamma}=(1-\gamma)\tilde \eta_\lambda(x)+\gamma\hat\eta_\lambda(x).$$ $\gamma\in[0,1]$ is an additional tuning parameter which can be selected by cross validation. The debiasing will potentially improve prediction performance, and CV will typically select a model with a smaller number of variables. This procedure is very competitive with forward-stepwise and best-subset regression, and has a considerable speed advantage when the number of variables is large. This is especially true for best-subset, but even so for forward stepwise. The latter has to plod through the variables one-at-a-time, while glmnet will just plunge in and find a good active set. Further details may be found in @glmnet, @coxnet, @strongrules, @block and @best_subset. ## Simple relaxed fit To get things going, we show the most basic use. We use the same data used in the `glmnet` vignette. ```{r} library(glmnet) data(QuickStartExample) fit=glmnet(x,y, relax=TRUE) print(fit) ``` There is an extra column `%Dev R` where the `R` stands for "relaxed", which is the percent deviance explained by the relaxed fit. This is always higher than its neighboring column, which is the same for the penalized fit (on the training data). The fit object is class `relaxed`, which inherits from class `glmnet`. One can plot it, with additional flexibility. ```{r} par(mfrow=c(1,3)) plot(fit) plot(fit,gamma=0.5) plot(fit,gamma=0) ``` So again, `gamma=1` is the traditional `glmnet` fit, while `gamma=0` is the unpenalized fit, and `gamma=0.5` is a mixture of the two (at the coefficient level, and hence also the linear predictors). We can also select `gamma` using `cv.glmnet`, which by default uses the 5 values `c(0, 0.25, 0.5, 0.75, 1)`. ```{r} cfit=cv.glmnet(x,y,relax=TRUE) plot(cfit) ``` The plot command has an `se.bands` option if you don't like the default shading of these bands. Just like before, you can make predictions from a CV object, and it uses the selected values for `lambda` and `gamma`. ```{r, eval=FALSE} predict(cvfit,newx) ``` A new feature in `glmnet` is a print method for `cv.glmnet` and a `cv.relaxed` object. ```{r} print(cfit) ``` ## More details on relaxed fitting Although `glmnet` has a `relax` option, you can created a relaxed version by post-processing a `glmnet` object. ```{r `relaxed`} fit=glmnet(x,y) fitr=relax.glmnet(fit,x=x,y=y) ``` This will rarely need to be done; one use case is if the original fit took a long time, and the user wanted to avoid refitting it. Note that in the call the arguments are named, since they are passed in via the `...` argument to `relax.glmnet`. Needless to say, *any* of the families fit by `glmnet` can also be fit with the `relaxed` option. As mentioned, a `relaxed` object is also a `glmnet` object. Apart from the class modification, it has an additional componet named `relaxed` which is itself a `glmnet` object, but with the relaxed coefficients. The default behavior of extractor functions like `predict` and `coef`, as well as `plot` will be to present results from the `glmnet` fit, unless a value of `gamma` is given different from the default value `gamma=1` (see the plots above). The `print` method gives additional info on the relaxed fit. Likewise, a `cv.relaxed` object inherits from class `cv.glmnet`. Here the `predict` method by default uses the optimal relaxed fit; if predictions from the CV-optimal *original* `glmnet` fit are desired, one can directly use `predict.cv.glmnet`. Similarly for the `print` command, which we illustrate here. ```{r} print(cfit) print.cv.glmnet(cfit) ``` ## Relaxed fits and glms `glmnet` itself is used to fit the relaxed fits, by using a single value of zero for `lambda`. However, for nonlinear models such as binomial, multinomial and poisson, there can be convergence issues. This is because `glmnet` does not do stepsize optimization, rather relying on the pathwise fit to stay in the "quadratic" zone of the log likelihood. We have an optional `path=TRUE` option for `relax.glmnet`, which actually fits a regurized path toward the `lambda=0` solution, and thus avoids the issue. The default is `path=FALSE` since this option adds to the computing time. ### Forward stepwise and relaxed fit One use case for a relaxed fit is as a faster version of forward stepwise regression. With a large number `p` of variables, forward-stepwise regression can be tedious. Lasso on the other hand, because of its convexity, can plunge in and identify good candidate sets of variables over 100 values of `lambda`, even though `p` could be in the 10s of thousands. In a case like this, one can have `cv.glmnet` do the selection. ```{r} fitr=cv.glmnet(x,y,gamma=0,relax=TRUE) plot(fitr) ``` Notice that we only allow `gamma=0`, so in this case we are not considering the blended fits. ## Progress bar We finally have a progress bar for `glmnet` and `cv.glmnet`. Ever run a job on a big dataset, and wonder how long it will take? Now you can use the `trace.it = TRUE` argument to these functions. ```{r, eval=FALSE} fit=glmnet(x,y,trace=TRUE) ``` ``##`` `` |================================== |65%`` Here we abbreviated the argument to `trace`. This display changes in place as the fit is produced. Also very helpful with `cv.glmnet` ```{r, eval=FALSE} fit=cv.glmnet(x,y,trace=TRUE) ``` ``##`` `` Training`` `` |=============================================| 100%`` `` Fold: 1/10`` `` |=============================================| 100%`` `` Fold: 2/10`` `` |=============================================| 100%`` `` Fold: 3/10`` `` |=============================================| 100%`` `` Fold: 4/10`` `` |=============================================| 100%`` `` Fold: 5/10`` `` |=============================================| 100%`` `` Fold: 6/10`` `` |============================= | 70%`` Tracing of the folds works a little differently when distributed computing is used. Here the `trace` argument should be used in each call to `glmnet` or `cv.glmnet`. One can set this option session wide via a call to `glmnet.control` with its new `itrace` argument: ```{r, eval=FALSE} glmnet.control(itrace=1) ``` To reset it, one makes a similar call and sets `itrace=0`. ## C index for Cox models We have a new performance measure for the Cox model: the Harrel *C index*. This is like the AUC measure of concordance for survival data, but only considers comparable pairs. Pure concordance would record the fraction of pairs for which the order of the death times agree with the order of the predicted risk. But with survival data, if an observation is right censored at a time *before* another observation's death time, they are not comparable. ```{r} data(CoxExample) ``` ```{r} cvfit=cv.glmnet(x,y,family="cox",type.measure="C") plot(cvfit) ``` ## Assessing models on test data Once we have fit a series of models using `glmnet`, we often assess their performance on a set of evaluation or test data. We usually go through the process of building a prediction matrix, and then deciding on the measure, and computing the values for a series of values for `lambda` and now `gamma`. Here we provide three functions for making these tasks easier. ### Performance measures The function `assess.glmnet` computes the same performance measures produced by `cv.glmnet`, but on a validation or test dataset. ```{r} data(BinomialExample) itrain=1:70 fit=glmnet(x[itrain,],y[itrain],family="binomial",nlambda=20) assess.glmnet(fit,newx=x[-itrain,],newy=y[-itrain]) ``` This produces a list with *all* the measures suitable for a binomial model, computed for the entire sequence of lambdas in the fit object. Here the function identifies the model family from the fit object. A second use case builds the prediction matrix first ```{r, eval=FALSE} pred=predict(fit,newx=x[-itrain,]) assess.glmnet(pred,newy=y[-itrain],family="binomial") ``` Here we have to provide the `family` as an argument; the results (not shown) are the same. Users can see the various measures suitable for each family via ```{r} glmnet.measures() ``` The assess function can also take the result of `cv.glmnet` as input. In this case the predictions are made at the optimal values for the parameter(s). ```{r} cfit=cv.glmnet(x[itrain,],y[itrain],family="binomial", nlambda = 30) assess.glmnet(cfit,newx=x[-itrain,],newy=y[-itrain]) ``` This used the default value of `s=lambda.1se`, just like `predict` would have done. Users can provide additional arguments that get passed on to predict: ```{r} assess.glmnet(cfit,newx=x[-itrain,],newy=y[-itrain], s="lambda.min") ``` One interesting use case is to get the results of CV using other measures, via the `keep` argument. In this case the `fit.preval` object is a matrix of prevalidated predictions made using the folds `foldid` ```{r} cfit=cv.glmnet(x,y,family="binomial",keep=TRUE, nlambda = 30) assess.glmnet(cfit$fit.preval,newy=y,family="binomial") ``` Users can verify that the first measure here `deviance` is identical to the component `cvm` on the `cfit` object. ### ROC curves for binomial data In the special case of binomial models, users often would like to see the ROC curve for validation or test data. Here the function `roc.glmnet` provides the goodies. Its first argument is as in `assess.glmnet`. Here we illustrate one use case, using the prevlidated CV fit as before. ```{r} cfit=cv.glmnet(x,y,family="binomial", type.measure="auc", keep=TRUE) rocs=roc.glmnet(cfit$fit.preval,newy=y) which=match(cfit$lambda.min,cfit$lambda) plot(rocs[[which]],type="l") nopr=sapply(rocs,lines,col="grey") lines(rocs[[which]],lwd=2,col="red") ``` In this case `roc.glmnet` returns a list of cross-validated ROC data, one for each model along the path. In the third line we identify the CV winner. Then we plot all the curves in grey, and the winner in red. ### Confusion matrices for classification For binomial and multinomial models, we often which to examine the classification performance on new data. The function `confusion.glmnet` will do that. ```{r} data(MultinomialExample) set.seed(101) itrain=sample(1:500,400,replace=FALSE) cfit=cv.glmnet(x[itrain,],y[itrain],family="multinomial") cnf=confusion.glmnet(cfit,newx=x[-itrain,],newy=y[-itrain]) print(cnf) ``` It produces a table of class `confusion.table` which inherits from calss `table`, and we also provide a print method. The first argument to `confusion.glmnet` should be either a `glmnet` object, or a `cv.glmnet` object, from which predictions can be made, or a matrix/array of predictions, such as the *kept* `fit.predval` object from `cv.glmnet`. In the second case we need to specify the `family`, otherwise *confusion* can exist between `binomial` and `multinomial` prediction matrices. Here we show a multinomial example ```{r} cfit=cv.glmnet(x,y,family="multinomial",type="class",keep=TRUE) cnf=confusion.glmnet(cfit$fit.preval,newy=y,family="multinomial") which=match(cfit$lambda.min,cfit$lambda) print(cnf[[which]]) ``` Since the `fit.preval` object has predictions for the whole path, the result of `confusion.glmnet` here is a list of confusion tables. We identify and print the one corresponding to the minimum classification error. ## Fitting big and/or sparse GLMs We include a function `bigGlm` for fitting a single GLM model (unpenalized), but allowing all the options of `glmnet`. In other words, coefficient upper and/or lower bounds and sparse `x` matrices. This is not too much more than fitting a model with a single value of `lambda=0` (with some protection from edge cases). There is also a `predict` and `print` method. ```{r} data(BinomialExample) fit=bigGlm(x,y,family="binomial",lower.limits=-1) print(fit) ``` ## Producing x from mixed variables, and missing data We have created a function `makeX` that makes it easy to create the model matrix `x` needed as input to `glmnet`. It takes as input a data frame, which can contain vectors, matrices and factors. Some of the features are * Factors are *one-hot* encoded to form indicator matrices * Missing values in the resultant matrix can be replaced by the column means * The `sparse` option returns a matrix in column-sparse format. This is useful if the data are large, and factors have many levels. * Two dataframes can be provided, `train` and `test`. This ensures the factor levels correspond, and also imputes missing data in the test data from means in the training data. We start with a simple case with some factors. ```{r} set.seed(101) X = matrix(rnorm(20),10,2) X3=sample(letters[1:3],10,replace=TRUE) X4=sample(LETTERS[1:3],10,replace=TRUE) df=data.frame(X,X3,X4) makeX(df) ``` Or if a sparse output was desired: ```{r} makeX(df,sparse=TRUE) ``` And now some missing values ```{r} Xn=X Xn[3,1]=NA;Xn[5,2]=NA X3n=X3; X3n[6]=NA X4n=X4 X4n[9]=NA dfn=data.frame(Xn,X3n,X4n) makeX(dfn) ``` which we can replace with column-mean imputations (and make sparse, if we like) ```{r} makeX(dfn,na.impute=TRUE,sparse=TRUE) ``` Finally if a test set is available as well ```{r} X = matrix(rnorm(10),5,2) X3=sample(letters[1:3],5,replace=TRUE) X4=sample(LETTERS[1:3],5,replace=TRUE) Xn=X Xn[3,1]=NA;Xn[5,2]=NA X3n=X3; X3n[1]=NA X4n=X4 X4n[2]=NA dftn=data.frame(Xn,X3n,X4n) makeX(dfn,dftn,na.impute=TRUE, sparse=TRUE) ``` ## References glmnet/vignettes/assets/0000755000176200001440000000000013555633674015073 5ustar liggesusersglmnet/vignettes/assets/coxnet.RDS0000644000176200001440000117540313552126664016751 0ustar liggesusers\wuB&" DJNDP"  {d $M;{>;[Ny>~ͽ$|>rN2e)۔??]p/Lzp7L=`nԦ߭i,n检~'na͕~/Wcw>׏:ex<$+Kœk7h[w ~Au7k}?vK㥷z5k|#щ>/{W̫QA3e~*wmczѓ2~U{}Z{/Ԗ]u3Hz/fH@ғ0%)oTk׋- Yu*kĚ7e|WWO/>̲!yb,ҊEߑ܏KnMidsG|@FTqOҽO9!>w{#cum!tLi֓Ps߿p~wZ&=sʭ~.ߋ-ZI _>̽d|!htdܱ<:"Os_:C2VyO<~܅jtn=l~;.L+y=.~Y0P'?n%w}!u+K{=a/;ddf ]s) z#%za}c]CgDE *]7^Ջh|,=J<q9=I;:~zt\wӋ|W=?V"ν;oͿ4-ߑĵoyfY0{SҒ{K_KsO׭wM{>du Hz8;zk8IO~AӻrE>8C>\3?^9e,ݼ Y_-'vRGw?xJI?Ο$}嶖C_9}Ͼk$}m?y5u2M܋$sQXF_lsKF&2gK#?Aޛ+CSgW5V=RS~CGz]xϛ|[kEyӋ% ?]Ր{H}Oo˽_~W{2y+OIxn{ P6xKcva~i4wrܔ9nꂭ?-vnW3IOt2{8ˤs≑o<2vf>1r='ozQ퍯|i\];cr&9|ÿо Y=Ed~Grހ}zMOsqFL~ajgQ<:e߯x^Oovܕd[~Y=b˽^x)|us%ԗkf-I>Ss'^'mc%4wS\U87vu4w}1!o t0OzF?%)_<[?Ԏ?[{&?ϵ/%;F_-ܱZY5/prRIuùܒO?*?_ܯljqx kI~yTe..=niڃzCNm uiGLp/PnUlX_OUK>~m3y ݺ|3ݖ[%׋78ٴ}]uq4o䯙,w)nJn[n Vgȸ[o:>ŲWlsD&w釧܋h<1ȑ/CKe}/&pU!:/*w <7o=䤗9I;e­?T_xOr ;P)!C2ܺ1.orSN~% /]p:cq4N{܃nIyq wjlr;O^52^DeA#c rNgFD8ƽ_wi=uTߣuDrL:QFYO ni_p8?JksRh&/ɿ@7۝ϚN*ʡ/h=#k7gYpEJ;ԑ1viq_ss!kU%=v\ۇk5dm֭/XOٯeԗw ߣOo ~Gխ/I%?|#Gxr*:}yj>Gܹ'|]Re\=k|#ycsJ{?tA;N{ls ~R?rt^寫uƩ{ʈu KؔWOrl FΗk]}c~VX=Y<|K>Rg%1yi`֮iZùhyV{^<;pƵL8J6[WNG^wj+KZ}Kݗ)] iwhj똬h'(s[nt}rԲ|rGVul安'd}Ǝ+^{X}ۤ`jZAjrꄼGܲ=--ə{Oϝ7Vô,׾-{zv^M<+7j޹q.Σr/{ι͗S>Wgi$/篑Zι[.nhOlyfV}77QTuRwpEi wjj}BMc%,)((=*^wNJ=8EVVN-ΗU~K\k/3d(AcΏܧZoOԹͺ@};ݥ3ׇj|ãͮZu%WJ3]<x s?2/#o.rnd+lΝ{ '}Bm/ծaW'Is9h/qNm;}_6)#k[3/N4o{68Q;\_|֑|[-cLPgai6iϼZک3{ZwHC1w|u~ C-s"ԓnw}tL͟i7] tn4ȳ4E\vxtvq2BQ)眦n]\ahӦ^+s?J}.I𞬏=4]+ԛrn,m7z,SI w_zT~@^:Mz]K_5_7V$si eq@O_亢Γk қ~+[XoAؓg1p!9ߺ=:ɷa7H a%;nr 1^V7o?H3sl {/X[g/˦޲QN/ &4DOhǍW%ncΡwJ/=:|## o}+ؑ׿p 9dy[;}b0ߎ\ovUCv=jdWY'_cnj5m+v`n*<,|fWғQl*}^sn^̍C76DnRoܳ{ww5E]Tƹf}Z6p; c w8g[y`E[BqNuoǝ7:$2Wj}ep1ןW}6[۔:cmetrM97׀m^"-s{aη \9'KiS^o}/8\Sonz#7ZӵKeSYjo \_\ܯpjf: N\`3so$ʿgsq֋{x;uiySc+(4楪W;K\Wgݫeqx]$Yx+Q|ECkz-De^쯵9d(W}R֩rVIsΛ,y:{:p"RG]Qv=5}ӳON\t;2> cGSqGӭgT_si[9~+sYYwrLu)_p7[5Bߕ0.ù%C OlɗA'i6|!l \ᚢ^dv_~Chcb }M6Kg|w},#_2#hw˭u;MuuvFٻsi2 Gxe lgn\{IbmQ/rs+v^A u27 Ob3dW7̗k8'ot9>I_[Ysvs͡gM~_H In8}r /XQhåesGySN2I թH_~\XԻ6ol#RY?}p5x솓% Ng<9m%_E~/4N>\΅ϙj;%}Bezi}e뛥z+uw<;@{b$sgwJ@|ʹ0\oL|>G<͝ MYGR>鞗|tW}{S7sItso rG:3i~\ NpJQ</NnFg n?ay/ǛQIe~%+^8ub>s&r.7p.r%LR̭ԑ7ŹB4ʜMc咏  ~9&%sKb#;s_ ,<}JY?]{ee4W^W(2_?b;W?p+OQu3(;o8,}j|]/P/Qb/\E5X}yݎU3 eO-׺<}@7ݲw'~Y}\c}䉚gt{cl/|[hc~KH #{$n1ĺ'72j6R6~U;:Ks󩊤VMٵIW~$LjUm:^=j調vXWgvUogwke*!Kv1\;ɜͳsm\jNCG=????6!ɻj*?6NAiq֚\ut3_:2|㫛ZNٵHB9LmRrdb?F3m>ۤKQm e+Ot)[{ۢ?i|OXǧnkR.rZNP|tQHss6œo麎syPWmSsC yԱ/HMu3[@"ԉrG;^жkήz~ :z'0I2'|-V\75OlIkBš5p<@tLʣu :|-}ݦŹ]xHq#8'̯?鯓GuxړyD{sxD]ϵo>++wMٸϽ _%;|O׿nsu\D|6Oz7u+%Z}aF< B1w/UzGj#6zVsst,uJ/S ߓ6/zpyg>ӝRPɎ||*G 'm목'Z[ԗ6/ް:1F1y}KG{AOSW' ׸:H4~O1e brt󒗯MwsiwJH]Mzx'4y C$0+x%p_y.U3 :\oO%*Os>U\@~d+_9H]-k59'?hT v| 7I,g_}&&E媵W25 w+3nBp潬E塯,C}ov'n΍.rN֝Z7  j_w3o*xz31ǧPӃH>w[l;Ea^6<%['O?Ck$ ݟax~o gS^`~?^ܭ+y ]&Jbsef}Aܿ-5v_RK=v׶4s&wf9;NdU!p{sI}* mʭ}7H;ch YK=K//-FzOkd=spG<궲!>Yݥ:|rsdsIͭtyt2W>]T87cx$|nxչnFn4o22Ǎyށ!iA''CVy{;C4*ݜG4cZC}!s~[~k ~d;#u#p:\8a٠duЫuT<\y }ٶŏ?|4ls;G+:3󌮦{BysCU&l=FA:e;| &RW_y}7isYϿデp+u=uf4\&nh"Njf-|c/cnB'0n]M-C_+x8b g28Ecs}t<}^Q[7^:Jk]Sn--U9];Y}N5R6 >Fck7~d1xux'꣎c)A7 oST;ޛ='cyd^j67rG&j?؅=Z;xKRFN U {}%CP^>%)qo\{cAqx\sp1OKI7|!9pi:?luUӯe[ 3J;JsmdHOx۝}e }x?ZI~W3sg'~T3Hи$Ysc5C1xOpw{^#%mw> й{X5}{^لěNO*|i{2?g96mǏ{/sz7Ә;W ^\J[pOoI/ׯ>xNsҞK{51zX;~Ru+/Z5}4v×~jj=mjɈ֟Ow.2Q-I+z4U i}M9BD+?sci GON3̋tIZbn}Q WۣJɧ{zm)nz-Go /˲}ɯ&weOPt>ia][s8i:F93V7~ p\ݎ>|ޣkzP^k]ϿaA7 ƐE_IcN;|c_Pχw,u|>I:1;Ox;jT=74?h/x-շmJƏ?iʆ7 i5E=3`酷&>xn]KŜ; x,6neW%P73܉*x67ev*\1׎sc6f>aΒxun|VG]fmnX?v:ԁ^;xD!2^IjγEc'鄇b8\,-ȿו񐻘_w~xD1EG]-'-}i .Ƈs)7kFm*s:{D̀6_W^9K7EHHZ:yǧ|cTK] 5׭ 7][t!39M7ۦ_yw|OAw\۶˥;?(hߨsgpPГY9~<7S[>9cLэfnGwOxݽ!xBzE4]ϡ?a1=s0<#/> qV-.7= KeۚܦA>9[;L=OJr^t7axGmb=zܲi_/oS.:P}[WO=}qCu2}_ˣn=B_F'ߎS.3?t|cgd?^|ycSӗn-vG'1]FgysN/#/ l#i͚D2F]~rԁj}@37L/ߗ=]2>щ |okt C >`7fn_IWN_{fӮ#CnR'>̽tϴH8>8 9F}䄫d{u?!% Khg ů SW [~]|3AБx#vpTt #|.lw,L>1m7t= qyC7~p̠?p:kߕf+4x^zf鷻9/ 4oي%pik>/w0'iw?$?^JͯAIcy?.'i(RRd}8eyGŸrΙ]9KRWx~YΣ0xQ>:q[H7u;9WkP7ljy'2@O~ ysi5z z2|p׏3s .OyMsBͣoSo2_f8Dd{,ÓW0ɀg <> >t I:z-eã8V6؜@`%NnQmoDZKmz>xR.qBb1X{mެrP?:]xo7}DV/zY Ry~WX~n ?5ݙ}sMoͣ: M9py1Z1tx>iǹ_'lzY̷'[WK |0зK J uI\+LW ^7# >LJ>bk,>ut|m{Vbb3EЇlb?;_9m<6]׈Hs6ZGN |y7^E:FKջ똿Rᇪ/ܷ{v?.w]蒅%MW|*|2I#2%>pGCM?uZWK_Kq2\}s4X^9IOn a׵1$|>#79F\^Y pqȧ{$5O-#."tVgu#^۾~m?O?C߅Op$(s0]~!7g>1O9W!\}.}^?GH*nn%>mԵh7=%G- RNMqW<4/F}ЋOh?a,"xM~ ׂ8dgG9x/zT]I%0?sϛ Y%73f:<)]<"trmw 83݂ܿm%fqL0a-9#u1QKguVQ79]TˆDVLc9 P'['s z>:#:C/)e}/t}i4o goU.b]}s|"+=o-Ru1 1o,W>Sַk)f/>5u&6>棽pf,h9$ ~TOu>F' sMΡWEoV9Z$Mzn[%9WxRd.*Y>[߮ |g3h/EzY10)j&[;U!emzzt'૥5s̏%ym5fw @/?S$gRG)b!,^7Ĺa=A|C|/?~@KݟrF7#=xB+ΘsE] ?Aoz S._GuEApJt6Z NҊ0xS9|9' ]dsZ5Ù~O; xvg\Y rs}7};ճ3/'#|4yO0~]ixk {²zoͧ l r/${yN2mOt1x^ xM9$34ݝk7;?椖?a C}a:R QyBtQW5u')M4ަjaqdk@ rOs]XW{E/xe1p*rlſ9S1?~dl󼦓3ᵬxkXtaAcՎ_˳j=D/~$ap!,s~(]uc;W?$˷ϼz?v6u>#|G4Dӏ_:Dxw˶>;-O E:_S/$:jER۴d^W%v.w=v{? wwM1h䃢fWRk;wlœmCb)bD"?xI;5.!'uyVԩ #>o\&ХO?adOۤ5p}ҲB>w컟?QoVl{ |o<˕9' al>R^U t9V8?SxY` )]>Gl<oͯƘk"V\/sar*Ǜ"gۗS ,k##ȁ*1''ikO|VPoengzuvsxdPKڧ xPsm{N]} u\>C&x=ԝA>w6 "ϴ,/?;DW߹سYNO|A>s^5q|eSWv{|N]bf`ް~%p~Cs]QUøMW\  O|eL$l t,~}Ml>3&eL߉>]VF?w\P~o.z芜t;\!-W|K꘧UNWx#æ >܆?f㏗.~|@W)Gxym?ޢAa6/F99.G33N}>xU޼쫧 KO :A ~=;}J"oq6qXg}d駗[lyj59=uab9]v7\Y1P;zi%_PyCL6vG+~ ix[}2t}ゟw_vv|t̏Õ0 DzB5t_CtA) Ŋ >@ W33=/E3~ugXwgn\Y/i|,Sm#ekG; o*cbyG 'vާLv@GRG| VO}֣Yzg[N|01=~;̟GQ>w:v]3'v̆s]r|GcyяZ^F;y1A*7_ӈ,L,w4oUB9CS˗~sk>Jn7 ga`qi!o+b2]Eiig96}l2(xg"^Nr}\>1nʝ"rq\>xƖy3O7[(:Jx~˹oї&?^k7rCoRt+w 6(>#ql7rF9zK/^򗫊vI 4i~~xrfd1z2Q>EZ]|| "^cNog0w%JYoVg~mp:Ͳ)W9^~eq~=gzu\qlj7'[>-C?fMWoK_vzr 1}Fxlk1:3ɼ(pI#h`n~WZs6sC^?\I|9'\rez69?|컏4 {|RץW=37.JY5ko1Hk%lx 'h={sW@WMs|}u3>~9-O"c=̦J1&xe5y 7ZtȹZx9B.B= 'k*eY}_%{}/-vr.>o _xL紃sUK1 ?\!)LO%~M1_23&OݜQ[ ޿)gSZzZ/yaNh*[664vdSw9df[>o-疇\%IދckA3-MxQ{?;^6*%ӇX>ZOz Ⱥ@PQ7ϔ3`xy 綰 # NM | Ϸ &E6}Q 0i/ &x(C}GXx/^.AkD3,4|_uA9יK*JeSM ޒ`~$]2aq| a~p4t5ڏ/Ep5O~~FG+hAO,'2K_y(V<9.f^̾.o;C7?a"}7‡0`m4_BZr\:;H o|sGCЁp%w{S'W$7-+wh)}e3~ $WC0.o>DpI14{ܥ[J:y(Re8&ȩ#at3(|.Ƿ0k8 ' ;/ *'xr'ntMߎv>z-fݘ.57́dq9w$AlG2u:e59c+z;e>|'tZo 9C "V]T͵zz]wZyw* d;mR@?r4'k#O׍063n]8{ ZTtwoWU}u7\_M|/0_1@~B >5B}7g# UﴺC-.`ntQ׷1g^4=s윟o+)˕skɿ_r+|2GKm꡷6~-ׯSߩ_ly_̛egmCq<"ίWE7&q'P;ˬ&ǣc>x%NkחymjڇvEZ38{o:ͯJ .-+Wo$sUibt+ 5':a~9oۻ1ЏV3O鳿9az]Y.Mf_F_a~k 2lpՐۇ DDzg:y5|dz?(Q/sY /у\^J|#LsoUm_O< ~P_J#8_{au/~ z˿ Vxy|/f^{MwA|+jϡ:=.\sDߩU/czXù5@򓛓_zuD3|/x\5;gubqxX,_Gᓬ䱔F/ͷ=r9ǜy,ryҏY.O@G)<1C\$],<~Iw$ ҇gb~¼|T8,sg:w>7e˫]Л3tAr0,/>e_PO_|:k,X}xGd^qчבu-U2e?tf ' [evU-7}3, ~E'n/An_Z]n}J Q(~ٝ̋k£Nn4FxNu9 WNOu83_sx]w Ng4{ ý9 3Bk/|Ξ#>e/n?s/D'`-禙9r3'l ݅DC~H际sя>:?|^SߩsLc->Nۋ7z|rV︚9SNnd^UޏD9o켌̘J|uTA9^@'';xkYn^.^ޥ~< }B]9L!x1|?nuk;^Ƈ71Їg8GMxϿQ36oAA:3s<RON@9r'| >a~q<- /뷕f00qCS:n_ <]R<9g_/Qx[Y+ \V,<_mfmB)= 6f.bφfk0~<멿;8O90<>E7_CEO̡8)5Gk<u0u |Ks>O{#I~4#}e.ͬ(JB֥jf·PL +k~l |<Ӆ?/U3:r|=:Q43A|Eƒr:B%J9 <Ĝ)$ ?f{ah|1x۫?9\ۏ{rYgE~̷exuqyn}9K=d=f}`~sNGIzxϖ9,7 |RN*K;vr?80҈M%~شƣ`^W:?BQDd=Z\d y#A?W:y+z oߙϋQs2wߦ'(c{rpbҟi^~>ONpZ˧'&>pPkq/5~}".qw_E1I(al)\14VћgsRCsO֓yf{&s߃n]GM!oT̯TɺY.m}N<.|8'k0^:= 56j1v{6˦ߓ,as?Sft3?vꏐ#3ᅾ?ҺY ۩|,YB._|rת-dM5ޡNIF?Yt+eӏpu ?|G5y Ee~+Y^]jzc| ox |eT%-|>VI8pzG?vgH=+O,3K_yY3[N>ssޅ5V,#Ԍ8b/{i6~~E>w_xɟoz4o$zRǻyW[s|s8&gqK-b9 oװ7^,#_'%Ow.<:}˅#s3 075塠s'9oԱU:lw|>e4}k:k:92xoj|w ЫtV4|E5=П/-G=OjsoWp S2? <h0u 9rú֘Z!)7}<ϙUOZ{F=Lm~e&\/L0O+p|I'-Zx-.eע۩<'B,{ 7~: oS]P5{?F}5 ^zg\`KR~|@ts ]yܵ+a㻝WޕOsO 'w1M+Cw܃/.~YZ1Qp;|YǼxXu99e=.CR! ‡履M傰r@ʼsk3MnIs>>*qUe.46wZzG+9:HIƻ9:I.%Tn2E=+q;&y|66˟rgdy|"Yiw345旤Ap$T\'d#Nq>_) Ȝ8HNY1<ӯ5S?| _7/S/]."9G߱v >̜*  _75v@wx /0߀㕫њ%lyF߱,pb70`4ҏmxh9~ԑ]<Z]+w۟?$| ~TQ?$0>֖;? fyǍ-6[kMJ,ws-C[NLOHxz|hV|:G5RtSw~V˺B >eROdA>ՏOV'Ggq2OZ 2t%ia|}> w{Bg,WSN?v|B_qO: IM n/y8Y+<ȹ10G2rصCѳܛA$|rkC ";Ǚ#t2-v>H[߂bs!s>Sxik x,r sﺠCOy8zXɳ\u̧lߙ.wчd/gUmOgy~?;qǴ\򽋘WSݺ8ӰQ-f~z7߂3 shIYKj?{_&y_,GjzFkod~q**H_e| =O[ks{]N̟;JƩmݙOI6/M!IR&$?OC_?&3j7 _cα3vxz~C}Xn<%MNϕ#7NNZȏjS:˘73!>J_xRCъwjXzk6S19bvxz4|:።Q_=8\-w+z x X>RC;I'n#̗7?Mo-6m2^?_Mou<=/R#!^|TA-Ϟn':0K'Ke̿~ r9 |qH;*9e_~'r$ o`/iHO?`~ 6}>S[۝GǗG^ Ot/i 1ɼg3~XƟ0^dN0_ P/Is^,1Ig[  N6R&Ax2?ճChBӗv'oU >I+3=v;:iV8])1.Ixys_umO._'oAm^ .#o_z=65ZnpK'|^e WP}4{ MEs{{ɡ2~tIΝ/`eMzU֯K#:4kgzNzC_n#t1|Q.}_,N?Hߞ`l>G/`ٞ.* x%oatpo3go`b~Yr,/q#:7y?:D}ԣ^`^JR/w=HAU>}~ ._,VZޞp{ kX)ts'o !A}߁olqxQ|^ >'@9=N .$~}^pUE$??FOW}6S!g}?KUg]\Jh%ԡK1r8KHzx!@LOJC}#~Zg"Gk Nցn xZIg $ ㋶_XoZWSh7lx[u򸵉}e*rGMaE/uܗ<:qD\SB"TG|]3Font)A+Yo1Yk xAKtjcwu=7| >Z=<-/xG3^Uiη;#-7Zon-n|RM}˥ 7{3|nW^Qu~Z¼ýBߑ`8[ӖD79en ь<5tG~L^iKM-0~|/PF_|huQesNDQ﭂{>.NA68%Ӥ[{4:>I8?z[韲-Qv3y=?qu9X[Ӧk蓮Yf1~3ܫq'ZdFux@+NK$YOJ(8f܋:NSכ=צּK u.G>a%t }ZvfyJ e r/j.珩Z^y+~ྲྀ{@c ϱ0,h0"gP|̋ד5{7m\|$YQG|<)imI׵['I}ڃ~ ?@_67>N/2tY-K/[iI}f>uVm b~yJ~G}[Y5s88V : kp^9dԫY >n;o'xW&ȹ7Qrh3gsցYn{|^.o O<3x)oQonru6/zIzJ_Ooͥ?K.F8o,_7o52ς'?t0oߔ?fh3i@\O,䞴. #%oXZ3 OP?qN?R7ټ|WoK ; KЇgkq{#p?OA}f-|ayY# Ituq~~?$MܛookH#%~څ{o!Ɯ&V3_+sݛ;x>Zoz? sSL1|L$0#o4*Ƿ'X43.c_ Q~7_"&Hdn۔ܵ X7JԐUC+YX7<6pY4~ ?s'ǼZ}?z~4NDk vc@mď}/8<}g>SJvX=g8'+QY? _Lܟ1ڜ--B!^f%99ݴ0ǒv^Q>^? hci=~8|Uw'}^z|93V⯄.F37=twD}+f7rp(t%EIp賃&v:Eצ7#6ϐgcYAnZ,m+wOY/S\MYN5}sAjr;GoxzR>$\t!P3swm OvǯMӒ')Yr}cb5\co/ 꾯kz9[nPىeM> "Ǭs|{x^sxbyvxٗܛ[wJ9>8i#{~"|_YMnIZp ,0~GuJFȑx] +GϾB=[g~~J=/,7[!}m% ysmMp>J? ̑'Ax$i{s\kUONC^)|[JI^Vk&ypi4Mh>=T3#C֗ gyn~tp~9ݥDnQ.W 9C`xg,kb| R}u>9s#&ӃYvǂW R̠k<Ӹs<-_KN liwY}r^ ._c3^66oa>Ytƃ89R볼 B9Zwso^Nݐa??ZKv7?46x鯘o"܏Io2^ޔOoPo7pN ӗOj~IxHϯ4sd72 |[#?i ũ+ dzj΍vn|aޖ]Y?jf q|SRxvce8*2Rm 缑>5<|J'5O`IiQ5fm|!9@MԒWe9QPG'C\6p$o)uGk.JFHI9}?UaBh}~?ឨ_/nbcy Yt(ցv??aXA5^aygߏrTr^v)o2sz~|tgmP|^rg6=ػuH zOrSt3}K=c9qq+_0N%]4@ V+]H4>/Y/L?%oKF^y6_ӧ$G5 >Prow?Oy1QpB+<&Ueqo1_@SgA oϦM{H+:&cZΤ_H4^棖c )^躽C'(i|Qχi67wEu.Ss$>_ipf~Ǭ&w@\1J>H>zp)v]5\<^?ؾLJ_gޱaW|rg99jz^>e}B'3G9ߵs:_?jlA\#PxO>aai>egR&tq~_ 1g>z&MgQ*Qmz=pVt;iC/ht\!h~VJf7gj9={{o<| qC*Gi,uo#\KBq|[7H+C8(G_ȿha~1t@P*п5̜q> 8po&oboR;ݸ߱ͨZFΔe^&A g0Z9<AwT|xc7CXk+NOYu^:o_?}zqڀjM_  s+r`d0< {6tu2ox)<'Н9*AێoE1\1}/r S̅O8@ }F6rN&G* ߎχ'?nFާh5鷣ܟ;zOr"f PO1?sW< :cqQr-G|_Zƒ@*!xI9w£ŗ.?Rk\8Rs ፵*rwolOe/841SYhb}< ?%=8,' ,rmeᱯ7:r뻩ϊnT[x0$}D7zP& :8bnWB-󡯅\#~+Ѧ+69T &:ynQ'uI#> Fxߚ'I`p}r}2}5TNXEo5ƽK6_tu0#3Vg'E ~i8x9p@#Q[l#璄;澧x,pIKV ?÷u>Wz Ckֽ&:}fphPԁ>a1tJj ^'.z /dkhtY/?:6ϐ*o߫Nc˛ˀI0gGQ,'+11(:XYJ}G98gsQT |lDϷ d9क़H}x7݃˰yԹZ6]_z~|IGLv!e^/j-t響{ƘS8o'3wK!w=Lksy&_Ǵ`/߇9'<'O#<}5:/z~|C_</7dY/,GfrBzm9:}52l <-9y_Nf=/f_BeN7#|=MlZUc={"ePUC:Wc񼹷O=I>zo:Mzפ%<OGj >7|Z"/X6o)ks3W7|")B&K๭m5Mrw5Ir|-o6G4ӟPt42Q-8ü=W;vgAcx//u% ti>N昺~u߳T޶fr*㚮sރ[2W*OG?gmu.Nwt3ߥ=Ģ7/7#PY7~b3A􆫹 /oJykuZZy\)sEa/:6Q᫙5S9`>.Ի^ pmWdCO>yZm7)-H?ݎ+9HOWME+zB-ؚӷ%M^~xA ٴ xXOYgkUyUQ/|5!MԱ [K:x zt eu>$N3w<|&NNۗ{!}@-ޠre_Uvr/;kRdz\^$͖SpqwSďFzߨwݢ_(wJ?lRu:_fr7|f{W |C r W׉gx~;@2*x-̑Чieh#$hAF;ˍo潖q^Cn*ﴜ0e.|o̝lM$j&pp1޺; 1hω|yyrNf_Vr%>-9V=isD|:$I9#|uDAӡM'_1_ժSJjuKg xW?K,˳=|$>1G)l> 9b6 w&t~b~ 5ru |Hgt5N5ߧ=;б;;:EjLG~lrƹׇ79X_[ OSgs0_դ{~vcogӦYnZ u*~DREɺ"iv3UbƇ&+M60s-Eݚ2I0w KyE<Vp~jQ ۘH>jm>Ocޯa]~YAW[૗ey![WhH<{9U ~du {Iϊ&|z~8Ej,sQpu}OO~u,rЃI)~ |ݾ2tӦ169[2j9"K&\=Vwߤ˱ :.nq878O&0|B{_9j['X!>|)J3_?M?:bdp/Ui/zSn,lcƥdӾyx~#7>xC[`=@}\^cs-p8J?֊_=t\[*M^ܵ.C(k}o$|}ӧ_v1:̞ȇ◢=haYRw\Wm]?,\òqr 'G)GRkm0!hQ(|n}!-FN02-kxs+50=n!L5oo9N3JX紩&|J=р fjɅgۦl| yo+rzs8'c9g?,<ߍT]Rc?yݎxYp!psYn$JrhatS}];Qg<_Q2N o=N s/.?wlE#O>Lp߿u/ ݘֿAӑcS_B)#ԝkkѕ>< ro3#Z.-Gj+So8ͧ*ua1>p6jsn|`۸?dҪK+{,?H._9dZ= 9ib=,d}$EMW| = >k sm~zEЕ O}0Wܟ~K6,I$/c^=(}1j~ܜFhȡ{-;Ǘp 1o{I>/OreϹjWbX澤vCg0sC]`~_+s>p %W\3VO uQ :'^O<:0:eAKGsߚ'eO-׆?~SG/n_#o?tpϷ.e=n☴ҚS`hYpJ ٘r7+}]G\˲3}RN6ffmAW*o{rR:s== }Q1h~E>ikNM7vmm5-rG^۸,ⲻF.J-WLy\}gY>%RCלpێW'1, EO/e!ksxu8}z/t_vCChyrq?1|2y8gr&e8C7C~|v'?Vkd9bG54FӉ>& ":2{| o}>rF?`Շdw[Ӧ ̵߰y088!xpuvFl''Zͧa~+2ދ0}9~ Ɠ.tu{)w9ܩlw|YWk& S;[q}5Y5z%ɠmg_ZM^:/Wls6GnVl3}*A&rl;GMuНY |d]^өxar@oB~V7N?(1Lt~>x)ϴ?j'zr:6YlEږsN*oYZ|vkPO[]쇯N2.sΚ:o|xtzç:?jLiZ.;%]|m^ϼ?sV 18S X_mcZ=<%kJ܆0M;6k$܏%|K_XpbՏ}Uٖ/OF=i`]є.Cz|`V]}1MM)-= 7sT7 p7uilה1Y'qv\uZG UJLg|Θjڵ]?]~4ʱп}\?R7߸G:FN~G`\6^8ٲJ곮\Z'xkOq{gW=LJgW[᷎n?4Ia0wTNvſ Cj9)i<4_"MLGE?nL>ɪ{c cUBW_=G*R 5|#44yyOd \ƸB|U>:H}UvNEBc}Ŝɺݶ]G>s xy DTw?JԽ]oɂZw͛i=M\x5|GǛI?rۛNvWG?V&N|6+X9/[BN_=g!1k7%W󅩧ߞ ?^dOOf^oSx8XnV0nůˑatA+SvEqx3;Kr-7Qe Mu :kdCkY(/2,tcǸ4$#4v_]y'W:ޡ,OunB*~azvS'57E܀݃& ïp:1|{vGu:zu~kCleV#|Jp:j~Q^t!'Ϟptj3Ug]CYn  7.fQ1Zq7gV؁ENtkyky:}cƓ s_I?x[흱7at}!=Cf+<| ʝe^r$,R5NۨC@&S}NNe}$H} K{5–{as(x6G |BF՘?{hM)e!XYOt0s.} z]74<%[Yɜ -Ϻ4A!U5R_rBr.[z'  ,q` qlg_GBKW_ 6*;!}OI,spXM_g_/u|ˍ _{OwP~wwLpύqn\W}y: ć=|qtçqrmZ38a]Bl P _2< ^cI}ُ^9S?8'חVe跦q5>˘_ܤ=+6y:4zM:wץlMCcRy %>Ӌ1ůl*~//Z꾙^6P_xtQͲbuZ\}-GGh~"R: 27+ C9"mg?9}빡ɷB~kD2YǫI_LwIm-9ںy]w:uxv~A?00?A7V|Y 3_}yV#zڙ?;Ę÷r/ǥ*UU;a5C%c1|v|C^[VZnzxm7r~5@q 2OIZ^%kəEg)J}x^pzXŷWsUgw@b&I2ɿJ1`^'~tΣ1N ;?TP7t Ol-#*8J'+*?twG+ޏ/E[{^}N_:)n9/Ͽ]}{J\ _? CLQzȣkkpzm~rY+w`U7RBzǝt&^9Bf~󯟆ke uCQ7 RlDuy?Z|Oi Ry~zxk/x[V|nco^#|KyϪ?qߺw+Mc҇XnJ%܌S/w3D`'PIމ r>Q~MxׂJ˲\b΍`}vo\Իe{g~S?Vo_x : < 8T7ztmƯ"GG! Y7;&8] A΄j:B~h'z7l߉n64EՆe/zWUYp_4u=öqXn|Y1 ykoDgUV8F(~5?tߐs/F;b&և36kRw'i޽cס-ד)X5Fugmr<}n|Q0eOнwe 8xgg:fΡ x.i1j| ߻\Ƚ h_|̅OR }EvR/la.8ssy垏CiG'%D|Z8~}WV/|bm/bs~x۲L5 VA776zrD rX_R<Kxᩋ;'ߢ?6빺77KWh7J^{yLSJn0>lO3&4x̜k#c |e2w ëiO9[?c3\9/(ʫXQ_{!X[) oww7OZv\O߄ssq>^sW{3p}/ynYk5,?  ~OD#w&n{vD:>Ғ/Η*#iяk}y^7rw yѡ PdVO>|A)hwE:gm^>v M`ݰ=o姹N / $~M^.gLCXki3;1 hOyO@w&̡˂F ˕Z~ZԴnȫe?ܰz+jme/ѧYsW^EO|B݄)ןڋٓNӗ<UXcbjrl UJfRp*rfyJLwcOzi8/O<6,/f_ fGX]Z}rt? >S1mYܻ߁&? BG>Nr\3 +sm?o 773"Gql.Fo+=m֞ΧB2a>p Ǚop|=8Zy?c[Nψ*ȇmNc{dƎ'cZei_K,ߖ.xGO._<ϹYe^M{-}K|#_)c;⨳̿)ГcLrvrwJ6?^yO+t,1,Y /?P_$MoZBiS9s:7?\׾п⠣o*ucNzsBP~&X%$~12O zi3#^+Ƚuyo:Ёf"yÜk;Mez*}!v8?a*?!|7szĥvHsD/viD4{?'z_T#p7{.۷W7}y~ .~/^kN:{h;?t8&&Ǔ_woFvm6_<#‡m'E +<%J@]!Թ#~|~SsY9%b8xj/Ւ3~ugXC_7sӛnYBN9'frV jb%ꝨÂs2÷=_Ln/ QNwPȩϥC<|FE^>.J^˒g9KW4ūJRo#ܫk :=|"oFa;/x?1\zs&'#O^W߬.3w:p9]om%r%X10u]yNeUk ' *yC]es\ܥ8]uy йMU$_B,zËbsFȂ/>>K\ ݑNte=~}`S2`{෮Ədx)9,ז&N9Ge> Z͟>݇o8~b ]tXOގN#~2 ߕ \9z3ԸˡR~5QUpεKˇ[kv n(2_+:FN[>܁&En~*CnY )|^nEڏd,K4P/W xJS__%e~ax}Н')v1x"ɉ2\_@a#Qjs|/b: BG'xs <0uYE~%iQwJc 1<%ˁ,úq 7_v%9]0Ӆpy}מ"BAi締K(J~&3k^!J3F;kԉq{H-\=GNg_ycw/n?M>mIjyЖ?yO[|g]2pr?o2tٲ_mvCEh8qjTmϏOH%ʯ|?_p/jK5ofo]y覚#Z;U9?P㭎ҷ 1enėsxhef97ol*A집'?nYΛk u:xNW" ?'߰9nW>uG5yl%3 t>F4Xg˳! ]ƛY~7M.)ga4~i3@n7S\:}Ք?Ư`)-+~|w$&y@[+|Lgf: B'~^ȑ'bx݂JP[ç]W8gݺOO^?nS#7$*2=}"vY.ͣ'flSzxn_^Fp_⋡AN&rH$bBѢm:xۖ _Ig&XC*TQ_e ɮ?3r/u5T19aK/hŇ9]@:vz7's980\Ym.whs:ߘi}WtM2~_)}t-xYWo=Oe6'lJm~#7K{:H;NA$!1_lϧU|#''~}K5<~NCk?~.M,!/ |ւ<=I5ٜsi:oB9ɵI5@`O2pڙ_- -(zO;=ݯ_%nJ^|S;.89qMnNV3.rsߪd-l'Plrb~GWem׽Wgaw8t!oɋ4s$#)Iϣ\K1>?xU BH\ 7s߄tW;jxw Er_|6!/h S~~~H9zMg۟K=aI=ÇZ~\-W fm㊞='څ^1O?4Suӆ=wW#iW/1X=$F,rrp~@]^R͹GI> ~CyuV1__}^w;y&-Ǻ:?7 ZpcsMn(2{'HyBlvJ2 gEױ䗴tv!?w{kso_{sy/hͳ$N" aw^)b*>n*O* .yF+EϏWyj9b su%:```gH/S?5W&r4.ϾX$Yat\}D$4o;v+O?1[ſ+l@%ID6{5_>挖CZ^颬.?IsZAh8Stu~/yAfzӈ؏yNm4}n0;/U?3 0_~'g$W\- ?8]_$v9^Kφ3stO̭Vqvu[JK+O1dd]z?=4 _.̋*񋨇t<};<| a#LKW> z,wϓN't> DCltC?\` !xS5f挮, ;9W>zOd駻<0<;/YL-9a-υ6~||Hd?xS:}3<NdѷV_1͏6%i4}Bks@| =oKR-d? KVsuGS-?2PZ\Kѐ&tdga4`oUM!Ot&#u>%/8~t^ủ:)FϺKDȓ1SsX֎?&ܓ29ov6|z_ 8|mI7YM+%1ƇrB); 7N]1H.^7-ʹʦJMG7MTNŽi~2AG)Aj%H&GjE~_fK>Pb{2F׃9mC̫Sȣ|4y1ƺNsY5qOs_yꇈ'}ڹo2l.TsGmr;+yw7e 96I|./gz#eЩs5l~0Y9B_L#nEw|i|y6m*sz0z G"\+.x_P Cd._Y+s']ޑPGR?eE7.̾px=nK9_RK=b |~zn{̹?Y9_ޱi W0D?¯cS='1=%߭܌^?Ek;||!xmlu(0ku8 5C?TfQ|o|$UYNr}2zYYs/-xKC8&Pƙvw$7a}Z|jkE7\IbZ+|Es*}};PUט9~݂Usfx[-nGc˃]Gy08]y;zȔsrIsi㵞 =^$ r\W'$CYX՟l[O'C}bn ~YG.qx3qO2g=/Bw[̜zF_ 7H/X NDtp;))Jsvu9yVc>x?/T 9:HV/^l潟4z$we|g1N׃nm俅H t~m2y\HiruHTjY|5^a:|L f1]և$RJus`կУp˗b"RRy$_8<c>Ǜ^t҃=Ncy;Bق.rU=Irw௥,aVM3f*])s5mus r%H4H@i|h?杲Pz^ '%J9'o:$Y+{7mC/|C+o@]4NMe1\OAOJ3aj~bCM9^~$rѻp^ \w]gusz3Ek?f׺jwQC̹Gg UaS~-w9"/C/w:ԍ#e7sE6zBb.8ߏѕ.\:N^n[e($#/?2;a=|/W*O?u_"G"ηsEt-ǘS'MBKz[bل@~-{ d8VVVw.ȟ//Eȅ? F.U>N$Et6`?^ԙȕjK\>~ ؇9!G;o\Ά[$92:Xi+ArtW m3rm~T=}%_=%Ng+㭁t-yzgζk9q^ך@?y}2x >u*Vqnm#q~7_O>m#'5ȧ|EoU7],*I^/yRA76^^cegxYY՘?o}y|ϮY\1ŸT%ANXi@䒴g蠣Lp_~w?zP_鋳ŋʷ5kgS ٖgo/>@Os[){R)o!ArA}G(mҳ*W=_a.DGZB?}ޣ {%Vǿ7O OOoV~Jv+#;{'&/J硓jﻇo~ϩs.+3|;lL2xN-ETfsJAkJVW? ;MW_W~y=pB'"'/MSG9st3y;~ُ+aywYU|}˜+@RqFuUп"Wc/-qi.9^~y"  lp^" ^"{-;/4?Gϵ?gkKh$F=?{͂ |~<IZNrbAWE:f.撃c`qAr6+o1Qyxx#x%<-G}*½ s]'oAswFGI(~,7ѥ_n:KI`yc?mZpC~P<|5՛`z7mKoʭͼ2??a'W?1tm18K[m0`ܶQqu<φdzw+>H"{Pܸ^|']NrcUb0w^G t_na _5Iy1oɅĥ_&#o{'C_7M^sWk?sxS{b?| 'N*}B0O{j }39y sZb7_,5O.2k;x|]mO?Pls΂}ųLRGM+_&H0YH{Ko{7T=y\hsFgۥOꠗa^P^]y1m| Q\xrEg=3 &ޡ><IokoO9J9 Bz7l< >oR5J?yI# x^z |=|Yv2>C9_*lɡp^&37NG:A(];s(_u/C){/y<=NN 9ҫZS@_0 oK#~~sO½xup;'F̫A^}{!}b??BП9f> 9oS/9[^;T1"Z xzL|$| >Rӟȗ'gŹ[ `_=W8ɼ/(zߏ\na#GߑOD/_'ŕSɯ4Wπaުs+_O&x29_!~ xI+xd^8|7ǹ7+O|uϰ'=80^8-4}ICVINf*c6 >,=GwG NtAfJv>b^ⷲ2tU48#|.s#CoJ]Gަ'K:aUx x=̕KA͑YpAsu6LC>m>9tv>8= 6DǬE7M{Q>{^t 14 /̼5^TD6Ut>~Ÿ'\I>E|H鶌u8|Yx*,8ոwᐗfCeo0qG<ɲ%t&DsLssw~rE¹.k>IvN@e~ճ<7ڗ]6^aK'DNA'ž0|'ߞeΪTkVbH:Vk+yS|VI=yQt %7ļ!˹0ܜ#Փɫ1sTH"Jz)%rLwG~Lnt\<)*oWn;_>̻l xAO:d[ ߳.mp"^·k?ž1Y>?~̹˶}_Erȉ?,7y~ t#CA^7,>+}#Q!xۚWj/M781īsEP' _UO8nb7>ǂ#r!2>-3NKs) y5z R؏78B|9I({,%dtt>ސ \1[r>IӁGxa_7Q rK%{D9j>El&*|s"OezD. Wƥ:c_ E7_]*1?z H |-^o|f^"kS2Zrk|$xOXbrr,0OKg<{}#at!"S6=EjbG h ߉{U*s)X^@7#\kVعc[<:ouA.OKY,s9?x޽g?6KKq>{ѝmO}4roZU !@t!p!t%i;IWGf7~K5z\:2ULJxW9xT {|r)W95B9@߀rx'!q#rע_A@,sz Q~9qy#G7|N>\{ }~<"P 0{U%9ϩ{S:}!Y\7 / ΪqSLzqSa.O׶)d6m[mc!~>Ş2Ʃ@bӋT*"eNX 0؇,-+/\Ip&tI *tsJ48m|ErgvS(p]\FnΕd:89g<e[QNUCxWV<3WqQy|k􊬹P%9ҟr^yw Q'{UzgZ9~^k㾺9^e-@W~#GGkX ϝ}JaϹ >ۭk;of=WzI뺌\ '=μ#݋k tsHyv7ɍB?(?5'ft{@m`=>NQRP]̇ YQR|^>+L0G%" F[.gN<~#29|Uz(I7;n!opG2\^×V 7BA$ /6[e~}+|UsW ns)Q#?NFy\>y;gWF$7pd{^ۆ>|>&n.zGoS|k.COg'm=R No_ԫ> xO yf^,pN-9L?%FNw: nUC( rf&Cr^29Nqo6ٟŸLp/M؛{:xt >0zyl߼=|c!b ;c ^ܘ0<\U^ NٚMg|^W' جrJ! Η0N=Nѕ?c?.3wϵ\~m 7x %>S|*y{=y~1O/E&<\9c8wn'c/} yu~C/zx{-/y㯽w=-uċa8srM3oRWЧDNI9F{@;!Nsr'ؿ娟:ye. p0''Ke='ޚNKkߊ>0d>`~{O2^8|܋G,)=r /w?'K}?Gz(7ԯGߴ 4X'3m+oѿO:_TcoI',}.Sm} o0GW.yrW8.{m)?Ŀ ^q=|@-!tYۣ۞Go4z3އ>^i9ƽ OXzG'~2l)ΓAprp~>Z]e~YC TRzgO5ȏ"2􃢗%B%|ݻ-:ac|(7h\!͏?u ތ\Dtw{o$k[s!z3q~>_ru+JZ|m/d=Ęn_2ѧ7YYHSVTD9ʓ υ<[+cQ)i)eM|4˼\Xz{b<\z, rer hj1%Ӗҳ'/rZmY^&'7o^:258ON5WǏp={|Qӳ71/%<ά[rG[_/p |0z}:yJ{/nqפ2{Hiz)} }-{aꦞ]=?Qt/`=ܷ+W6E5;f{ix+(7"A~&wg?/d s蝀tF'}<J/^<9R(_2ބEa:??XwM|wݠj)z?IM(Z~=k72Ջn^7نb~9\'7|ߞ/r%zg7[b}-_>,c~ l@ć4}V/=.tؽ'wgr_eM 2f+'};,rwk6]ܫ;{¹='0KB|lqoWބ3/#ZA -/K]}myl|v??G]Gc~ HE9n_X'z}wz&{l}t|?ЁUySyH7.*Oo)Uyt!EH~n5x_C\sCI@ HǧNޓ7vE#'żȺС'\1|:GB\>?Y9 B-:џ(f||yJ Pgܒ?*OD1ٓßDe5޻6VrN8#ȜP>}={ ]W[!mӁݧN;D'ޡI^g"[=}>IsqtlpLx"~*0s*󉑓꽜wGG4{eQz/~'dw ܬ|ys9W䞨vr@S?9z8~m&Gz-C>obH0/B+u4DrA}T7DߧwW8zE>:=|mxK?yV.r}5;O'6Kۋ7!IS'KqEG>z`P:pϝ'“sqgetb} #謊^ù廾O=;sɩWI@G8|a5C!;ywY_ ra+!/l'޻]^ Njk{wNxYVC$r_4f}W:לQ 6_nog_usxI[D |?{0>dpX J^$V_Gݜ#={azO$pOG9oF_ EF;9['lvuEї;u߄z>Iz;JgWG;ѧGȡ%_ùArm-&O =iU.tZ[{5é$}!M.V疾\ >/=p"9r[/zþVaP\$y?s\G|a\)|tIrrcUr-#&c]O';{qp2y=m;ۦ>?݁~-ɀޯWsNp?yבO:^7I21,:?ʅFn?zmϿ_>u!zjv ۬qn9?_?i\|r_欕>sy~Go N<\4Mr~O{0=¯k;Q^euqsɇ }[kk>;{Ȇ໅̦),!_u\?앟||}ހj챽7370({~E_|3_c tCךÖX[~==gg9_7!_c}63zy?iVFF_\1w5]bϏxw>q+<bwc7yzy+W~ /IRC|t_uEPNzܣm#6Ïħ䵐+_#0I{qQzч:Y6*z&ϩw\gzQr,s79B~4&C59,~0FyrW/Eo秗^F,]EUʗN:|9wu"#UbsXD9g-ȉʻ1W$6:7r>E>N%rS8@N?mv=xv6y䵦C$žϷls7?Nd?2:*OP:p<~BOV|[7}Ӷcuo[rSm9tC.>__$(9t&3U/i# ˫/Y^_!>\g! DSEarkѣ8IApCW>q|=?޶3zk#o{_>['*ᕙ?ք_=H1kE_>Cr@y}z߾ĥ 2K@zO*"y/ k'iz ]nCxz 3W2OI>|io;įfݎBMo{ç^|?\|=Cazn#SLrJNhC>GAk؏}w_I8QyLTW%aJOU{a<={3.GgWG}Sg ^&zΗyʜ'OqOtm_,Osٿ;ѣKK?M<˗]p/:P'%?ac|_ Ǻqf+^r| yWtɯ|}U7? Y MUr<%r|?{%9n_z%7xA"o/kNu*&Cڪ!zz{ȹ(+N]EΥ48u/zjO37jx ~j=1ԘG+ۋAC' q~l0*Wb=S9w=Ioϵg}OS~~N(ݎWقq< nGc1 twYQ2'Nx ƠP'oh'><罊o<óRԼmˏ.}\#2ޛ?>͠K28+:w iOe7~ug*蘕ö^[ ]H!: jۂsV%ʫ~kA/tysyw7š{ѳ8w[ p>%³GyЃIO> W zCСTqe Ky)?7j;Gɭ_8Oz[JWQz+gˬ;e>~/m[]Skuɳ!9O湬$DO,D<"z77Z< K 1-]""={bQ-P4z%{?_%`{~7=9e5 i?Mcz=7l=\Mܦ92xr"CUfQͭoȧ u9v Ž%hpyZڵѻD~= {{?~ tv9,~sm~Nge|{'wy|(9>l |MIp+-N9YG+h^bNQsMM=>3 n眡=_JpphJK90OO^ÝKA|]{顣?RS[R0g,ϓARB﫜uKu!=C{s9~m獓 'Dߺ :1N^ @[&[|}z0L 1#kW|?H~_[J~3p ^{ӝh5xcm]V5"2=.W!Mn<7X7sr;9 Cگ'e)n~X[o}a"qSt'.E#z<Q^sw@#CSz ?=JOzzևjx}o+enYi{4$p~|oK~WYxIp V΂;f?澬Ca&зY s_󰑠\z4W{.>o5G7nBw z |7:$ϣ/&wDxn̓mW'-q/OЇ&ycf ]4M2w'_}kUޟ::!~}Zm"*J8<": ~?O2yzm\ݪ_V ao'KŗS"<||ax$6>wSb/ zҔk pK ~Xwn0빽y6^̹Npi,r˧sx^*6 on{a+gsл{6}+k>N OA_ p˟A>w_-)dž}w.}nN :2smsB鼘?$NnFI/' ?|y<_ϻԿ]_Cq}u=SCKߕ?_x?b9yjR>-;-Y re.5_|'铒Q>tڶ֙f*GN[^A/RĿ'b/(g ^=C)*97X!P^Y&|"A?ntԻsT16oڋW?[愣~Uqz2 >I`ט#Ot c>S 6gʋ\z]{]o}|-| ^߼{.-/= [UGo*:]S >!{%ש칑,s܋ꡬGQ[f%NTtv 9}pDkOϒKIߕB'97l4 >&7}I$gQ: s.vK!8MN,:SGL“ŷ>sJ|·TZp[b~쁧9?0|dmg/ZkqREgj |`er|R ʩNzw Oqe?w<s+TAa[2 GcS/?Fg7ޚ{w V?L>t*?@.rOK/^ lN.#dȻ܊Byb4~j[6[߾2}Yk)|i>rI1gx߇4wݥ[ju޵7ѿO~GO}(,cvM~/?7atȋCЋBytm=ED{s0z'x>GCX/g'ur|{ {x;'ѯfg#^IpB:z:0<"Gvpf#蟜rK Gț]/y+ķW=D8~ir9ZOy(-Mo^3 ī(8r~A>c}EH-Ig=cO^RƹO-)/]:zF K)}^ u]䁋}ĿC}kMQ`z})?;os>|__[%y yO0w N ||U?)qxMk~,{ƣp'*Ą8ofNoSyx\W{{A qֳQb2ً|_u]}¯]]#UnxUe^߰Egi@p[hSˇ#ğy~J/f8%}|><əPoO3؏9mWГuxϖ񡍡^z{7~_2+`I>yEg.-(/|'zĹ5z]_5>q>G_x^?u olUxx Ig|>Q*WgZ"o_$}v?IBo5ҧSNvY p^Qp*zA4us#?NWvOMϪ_[| G=xן/%rCOmD/D|hC1F_떟l^fνBwA= {~?^M^8;Ly'' Y_~Nǣ7? uoOtDў}?'%,C{/W5d"i^_>o߉=W?o?iMx&]y60y<>oZ&:NtOFg*zt;x՚7"ز[{܎W+s/ҦϼMW}xߐ_7/.?o?fSVd>ïyKA̒[(\ٯl`\{}.)t\գH?}kկG;O(3N!t[M9@xp_ۿs''^&.yٙOx?UU3nӱ.~1chf~zzV潑_(]Ud_s{p5*JX !pY|ŧѫIZ?3˓VayMϾvfEϞ?j-~Z~3>2g} z_F/`@'?sw,>&>0~9o:'W=y< 'kg?3τ9t;Υ~qš-b㜛M|_aNn,{z} u3{$:̞sW|Yr8*S'_i>&8|F] C;ĹO1>U{2ЭY/T{=/.G~I.rC)̽> p#}p; ! .5~NOG7<1ЭyuuB\U~G ݫWyve;[Ep2<=q bf- ,_T\8ʽVފ| >L'NBг`o_YəR>=+ tq/<}jwXM &*O` ~="w\YAG/}/%}q<=q'G}okS{wVEDZsCܕE9/AY1:(S[-zq}(gE==]/W-݁ВK/4*s/q?4;ƇKSrtc#/&ȣЃ~ۏ36.ҢwgI]|^"s(xm^ۈkT-*.OiɊyίƳ//Jg÷"5ks̹H^K86LdRd>Ҿk+Gq>-莔^ɛO~=UtH'|d>UC;Z=oP ~L|aEۢh?8DX ުoo<3AڜgUp 7Dxs<2,9 ZO$> jG/KC 24=9ý?|ޯ]eRJAOiom|~}<Gg7jrϓYkcs蒛G[x.+}+%t/K"̭aTsO]|Co>˞WAb:&ȁ-}2S|:E =Z_,OHǦ\&9o6{7V.s^/a(G'؏^F=4|H._:yHoѭ}8Υ@^*zp0Q1F??IZ\|<<;\y=9t+?۷~NtS{oCߕsoqL{GGuX@p.z8X%xN||̻_is+WDUyӫH7u5: > 6cOA5ɽ97'#:RQ295gz9s+WIe~;sE:tAnxxU9=骼+'2i@/=N_x9YmEt >d(1AXmRIC8tK;8_w#3׽ > rO]x4̗{gE3˰TOz(uY?tle'oZlз iyk_>6Jsּzod=~Hϔw_|6ha3<ɿmYu|Is9g5O/C'Ss;O[Z~ r! ?9WZCyoC<ޟÏ]=88ww)?~0- [y~:Hc݄O~i'Jgnxy2w=E],\}o8ף8yqn^l~aW:9'x&{I xX8l~]9ۂNW/tg6=w t!5@?MuI| 8}P&[=]Ue_h"}X|͟itcs _Arqz?QO2{%+3|H:xr27ex ~.'oS_jc՘ k^wK}rl!L ']=y$}tZ!S_M'SE^/t]NGWyi?)ϠI}9䍕Fs:sCϬ|@=gerZC_#_A!Z`=10r-M ~p ss9QPEșNN\,e2N kK[Tgޭ\X\=dV7smў'^?$K^IpEzDUn;F/#gޟQp4,{ktKʡg̓#&c_+>Tly%gM1lCX2G8{2fS2\>ʣnR.Ip)eyriku3 Gq ݨo8 =4Vs(OD~Gg95Jg9} yB&ݺr+IB9d-t`(-0A2|o t)i(<7žCݫ8hp:ȇq|^`$*}yzsSiޭ .{2S5JVY_b;gv,sy΂v{|?uDEEW~ :^~WTg]srJ+ADr&s>r:)% |p+Џ[g&Ԛ|8}8N>/}\cU&iOVd}I1W᫘CO^|'n.yj|E}OuW]ܙ%S:_c^`OV>Wy3BܷUx3oR;Z(g0zKufmJJ7Va?F08P|W'SON=@?W* ax~?xſ|asygVI˪OyIy7VgjpZrV镞 pt/sًϫߢ]:.6 kW9#"g?.;O =^'gucy[`fƇ~OjXs+zs ߹ihC[V}/k9GS&xP1p6`PC7D'b^;TA2͹O^ЗEkr?MWȒ}m ՚Л;1=*=jF} 'RtavQY+}|?l4:NV 8>`βE^+^'UM|C)t;:5?Ow%٧|`|zཱུw.]dOjsΏ7S6΃Os'~*#?%7}*-z\:<(|^ËLÃȹROޏoYC]I9*zȷ%n tV?μ-GOK"b/ZDV&7)Tc= 7 ̒mQc ?_|>F>f=8sȒAT|Y\WG<pqn݈sɹo(;B^ ~r/],-9|v] zZƞ <Ko%]ϢI z~8s<~ =nrZX=Qiљ.]]x߉\DN}A.1eELp>[q$ʟ\h.9/RPJ'W [= 5fu y8mKEz-7? Т$>>ڍ=!4yO:}:0`Jo)OsGo??jpc﫟gNB9AA*y~F\9sa=Ȏ}i<,rN(~p|/TA]&;|v }=P௴><:c{, . Nנ[Uǘ Eʚ AF\ocC4vmO}MSm>8Y4bzNăP÷0Urr#A=DM \!tszGxVWO8'_G_Ui˭pY|{\9ꋖkrt$y#}+a_@6=so:yK+>jV{nWz-"_v.?1\-*(ࡪYo]IRY,9!~8uJIަp4z,E* ~+&kW YI9+/Hnb<+ n<ϕO?\4/;;=+Ϩ>~> O^̕zo`_FyNQ(c6þYif]=C E9-+F!PeQO~yevŨOw擣B?P#{-{-,Vb^]Sb p.WгPg pihyo]_Q?tybr|{>\u|(C\A^]{n3zXoCV^u"96=$wg;8#y/goҫdޓ8\ L>]{@y$W#p7M^_b|If'2˂@υ?ܛIa\qqsdrqu]NO?jw-+'۞_w|>Jn-y> ?G7|(]^3aϛcX0FNd!9Z>I0yAsKyQxpMs5-xYr/- z&ݏ[F^KdX|?o/_8#=BOL?z?${2x5`>7#oZ/uy(we{gy0Dk1\C~ W55З,{Ͷ).ec P Aw8n=>zk!ϧCס9iZ7dq?\ӟ?vsUp'W&?y/(zrNMmr]~Xs~}r}[{;$"5~=~(KunR׉##aAe{ԿGe\>Zbd#{{R\~p<::R6`p򅡇}/:If$-_}Ľi\-|FyXOl"SKZ{_:B*>k&'=}į㜽*=XE9{'8,s࿫<ѐx/ }N΁=8EGg'^H>?7y?5s}&}$yhϪ?wYs=5&%Gmܱ}0gzߘ¯rl-Z9ҫ|y.S88{{\_|s4[cNI{ϡn6}^<]{>iJ]ļ]{-E6_[qs|V?:ΆÜI}[0b-7zm9O5i|QW^:n8G>޳cT \X}~rh| 8ٛ4 ~K*?W̅QηQ,{s-;a%ػ9>4SCŽ@^a|<IӗQ!]F~GؓՃ~@墐1O~mO}sR 翝^9{s(o֗;c>"r Vt Wsw@4N>C9=?RpYt ?\{A~:89D>~1ySu ̅izvrK 97'  :_> =O{ww>lѩGx?*3sge^y%Yy G$<^}38M=Zˍd~@t81ocEM^53GK|jY8VS̾\?{G/..fc텿/\Y9&,V9h۫"{(jMGy. cﯣsCn|GaaFQJVpcK]psfn^> oй:S~c""'~%zR|-'r>$=*K::E>]/o|7sc;rԚu΂optK?N{?nrLc;C&Q~ߚwsW֞{-{"s$ UpnX?KU-> 2RcG?Sj3q>Nȁ#=o;S7}S\@^7'DOG 8~K?EˢY_-o&{se>ͩOZjǪ59˺9'['">ޟ$ xgm>> *C?97=^8- o{;&=e3_Y97NI =o'>ZCi|Νm#ExSczt{c}w.#wc)IN,=6{8y`oY~/5*Vaj^UTX,_p2erpeb'B_UD}GD>py Ky2ysscϿVО Uc\Hn$GT'}-zl/_LѳL_ InjYyʓAE{3:Iރt3cWn} O8O&,s(/xW[6QᛝG#=.HJ?~*зN |iOeRBiy<6[* c-~QϏ< |:;|˫^4N#ޅ7ntKsP%zRZ_r^/wT_0^ls8/09_O O Ow ƟKoMØA׽̻[{|~"yWlK#`tGsȃ|HO+D\-9wI8>hU+99C:I3]@&/,xlIyC|aroy/z|xuVx_0 WȃGd33Z! hVK߳Y37HG\DGS<vܿdns'=='P.G}>ϊѓgا.'/4Ͻr'guoqȷɂJ/ 8osf zci>zlr F>G C12*WzSʑ}yW F)צMJb?<ݺՁ=ZxZOSszgy]NxY΃<|lŏ EC yr@ :0&z%fPezz]5U'85cO b&皣#go 駳88JH iV":&84g{n?m^ htf_$g{gK{dc=}%DZO@>n ,(=ckk6u葎 |w|g-[y;#5t6UYt ftܗ78þϣWBBZ`ޘbL%3t 6| >bUx"se}vpACo,|8s9:xq]5ffrc/ԫ{h j1M笏y ;rn&# o/8čg~)?}}P'wo3H^9 D{J"x$ω>R^WȠ:>elgj lGBsm;jeNR?mWw嗧ѻe|]|Y'M>wNηھ?|v6F)*JOW&>Jo#0'y)AoP%,dz)` ]Ǚ7z0v t0~":s^弪ӽ\U"N(>C$隆CmD}W FQ4-"{>tRS3'*0 ߙA?|3'W>S"s/KEG|X>hyp{΃3 XW0zy_e=&C3MJCW /u Ntv\R9xN.rУЋ@= |KZ)Y+07y6ԟ!kzR>L O|E/}K"n 5/c&o^ 7 So?;=r1|LzkV<Y9>[l}k=s Ŀ ףK[8{7|\`޶A^2?r5n{ Wv+:ttOGwh1r@ *+X?= oz-|N)ӻt_(#'wrD<Ⱦ.>XWןMP"8mRR‡;T|o+b}6ߋ*Z/yetVf/H$M(x0}~78 N:>uvaI%>g6 OP t@35%Ϗ597=_:5 :@~˓c0K/Yaz|Nmx(U˕D*z ~,qA,y@2^ A #WnY͠]AUE'CidSBW=3E|&1|;1p4KJ,M?i9zؼHΩ|ǟmr'[E=L SMOnv2Γ3G_cdҧ&}wS a< l,#z:l0P:yϪ_1+yK{*ҟ 2+xuKG@_Q(|VxBGKcK|m|lZa-ۀnxݾzfٷy޼f[c(>2zo;5~/sS_ tN鱷!{q0+f/1r@FOϣO#ׂo$G'j sHW>eq74~8[E~):aWBrxKd )P9 8GȽ2__΢ZIzL{YM ,tZaϺrY5wgM9SS>tHO.^o| V~7%|HU+ߨνzUr:nN/F"~ޥ`Tp:rׂ됏+S/%x})]S{Z`. "|x>^9.fི ۂG!qg6Bn"zX,qNvKK 36mxr OWw9( {/b䯐[a5tC:zއu b?l=&!z^,5~Vkϋ}s'Þ,}X=gGn]_}:!Gqd \_\W9Yϐ¹OHV8D䥇rg{tGp'{p5y~}cs:sכ|}"C`NN;QO0_n?܌)Aη{1Q0OV;;_G ›سwONއn#w4{Snoy>?"g"?[ ?x{埴ؖ{I߀CƗdxO?q&[ɛ _poM~A56>VCjॾ x qrZ *)}/pnwɳ0z _ޯKGW9 G >=` n_c~ȃlns6|g1a4[y:gVO[ ׫bjɟه[{`c_ʃnWT&o*8~qqCF8[FW湳Ske1 {++G\U[镧˜a&/疿B>t66}K"UrZp8܌,WѥU g :rD,M^,q3_*.m⼣%/C̐3I]纈Az`IE?26Z8_6rN_> yT CJ 7 |鱿Zp|}S/yw 6);}XqeXH\S=D#cɟ?KQOa^(r$˕ysVzu|xO=ϼ CkihΝ@yJ=3<'+AOU[t3tC+ z+) p4W#AgY!I[xy+i+r9tUc{+ SZg_$Wë5Dq[zq yе/WWfr=̳=u iù',K>-4Y~R S3ߪ7;G?Ko=}^d}C^m/J9C#W_z3褺W|Yvyt'|\(Yx4=|=W?zg~?qsc5 F/ciirߊ|5-)y gw8+;Ew'W?QrrL{VW>>>/Ei.qɿU,z ͓~G}U#Kq{IK%Mp.T9ȟW/V8W[g+Hd嫂 [^6%XYsk3sU;t׾Kѣco^`;g+һ@=*8pKSߩ@/GH2O<%}(>_? Y/Ϟ_8oqߗWiW76Я.]Z P%Q) ?.Dy?GE^CozOIW7܅/,_N)̝Rb_8E]J ?8| M|!qYUrU>yA#y MG8%ǔ 0W<[wv |M=U GeOz}oܻ*}#;?أuO*C-Ibo'A?} GGmQx}_ t5x/zx9Ji _G\[9#/rP_Y2sK.ȃ SA28Nʜ{C虥O%g%M=`-@g&3 1/Jοt"!^.XQr H[(xlw }sgioF#߀?H++ e:~!<\cyzRbV*g1- ?E/{~vS}ǚ'-?U]z8HyN=`!Ɲ ^r3z#H'dY*K ]?p9u7 GHNNGֳh{߫cAŽkߍOl;<4]ɿDo祂.Q߱r],]1Fo/n>z|?Bݺ1A\g!֣qpE,/"4:<ٳoʢ{>9<Ο']y7Oԡ=>8tK{|bȣ%y~뜣Ӯ~Hס9s@Mo /fY tab a,+smy<8S JU ]I ݆zR5/jaR_{ r#7I#b̀۵ёs*:| zg; LfHoxer9%׌9;*]jZgyOk{?I> V虐̟;EGAEoW_GSn3mc 7HfT{̵Aނߋ~r=:Oş 'sy<z(hz?'/R}`Q~y&Oc/8ersCK 0g 9́ʳ'7fʣm D//?g/`8yG ѳAodoR!xϳwH| xU/+?m>4S{qD9N||~%i^ɞ=;x|.Җ#YD9 Sz]~?X׃r!AnxX_s47G?gZ~^ Yބ_ڭ̓%t3vC9Hn GV[U_T}s{Ĺx >΄o)8/_˞^a{Q\=(m%eW^eWR_᳊% uqs/uG8/QA&دc?_trȺ)@|Nz\Lݓ~(]SP2χ*of̑S_#^Zߑ>y!8|X} zbOtR4\* ?gr,s䷑%'>!9(ꗕKo-寣ck^{Rׄ:|8UCT_7<]ׁ{ =#\H'O*W}Sa^U}E5ߪsọ˝qWwSoD#s܉}~ye/ڤ^0[d^Fob B?niV~[ON7Gꜟ'ɛs?m<"C>@g-S^hm rS}߸uq/ccWQߞBÇ /h7RO e)]np:*,z9#|=8{l'Kk|T}:9s- ;9϶ާ{ (~L01&5m"ePGX|mx3=7"t*7ү\A20*A&&3"eqr6{{r =隆$US,# /^(4"GKK%?>,9p?7/G tm_EЍNO΁}rpn:,b9tBC)wG{dOნqt@I`,ZD"|]Sxyp],:J37:aUR+,.<S_>4u99?{9Po0>? |?K3Shޏetb65s;OՁn&s|eIXvkXAqQx6D(9qu_4pNiH(e<,Μw_$|Mp~+6D _Jo5{Vpur%U0g鶟D&}A8}>zQ9CF;>*:]=rwMz+|/\[Qiz!x > +vQЫm;Z~}6~>ȓ,9-x,itE߶U)Jd9|3+Gy|sb.8^%Λ82r*{0|5$R9etKohW-υѧc8O4$O)þ79<ECo!TD(#PEK7h >og >ۦ'\ἠZ>9U%!ItOw| _*:Rz<c 7jRekyO܎Dz Y8|TyBC#O{#75X^!2|bg/W,\ιs_D=yoӁ/@d1r=O3oL&>WהGy.gY7g? UGGu+4ߎ@H1rsj^wgb+|]{{~~3/rȉelzۓB4 gTbxPϟ}+ {ѕA/GL,G\G^s4ы#^sC{`9~ =I?^AΏV>EZ ?ϑO\yq5=V@'_=׾e wo]:|WYe.Bǃ/jܛ|C&':h9eO=tr4mW틟vO>Iz}kg| 9ȳ{v{kȯ.2c{?/޴Cw:=Na tyҙx]>twBft3+! O~s5;9W?ۇm/q3csI=K͂OY~X{G^2Y/}]##|@s /f=r#|8YpȟZ t*}v|Fߨ"krϨW ^<ƫYk[G7@ol]}|(sFkߌS9x;Bo =_u#5r?W}C>+ݐ..a7{ow<9؊Β}U`bM|X ލ1NX!1 KINUSȱρ/o0z!z!/jb~> = GGIΆ͠SLND?m| 3\yRw·NNUoG^v/iqi<w/^Cs^Wϧx/gaS:*cbux1$gG}up{.YX9)l[幘V_,h?yW_&>s04E:}ly;h.\|h<*MO6+UF9HgO%μ9$_W̰+~g,~聜 >_[K>} ~z|W|p_yscE~><~?0S]=s|1:pG:-3N?N[ydyGuc%Seο"y,Y@[}Mm)޷ߡKB">u~,UWk~#C߄/[y?6@~8< %~t._=at^$9h^u<Ue'<>% '\oDOHooS~5*zTÿXg=&jSp?!xAt&)X{x#W^u-sx#xχo޲׿OCjn%WIOuއc{S~S[a:?ewE vKr/ῪIw(mCK-i_}D[ ?6Ŝ?X}x/zP_ԹgL>) Lt{kc_9gw}d>2~}c?|zs|>碷v{}չy -h^zLׄӔOnl|M^tpBT}=W::򲬆n5}\$6?Np<"6 _^~;P!w 瞓δ~+tr}~, <ts#|nqdYG/X>)>Exc3ר 璅ZFW_FyNHR0~7-#c|NNrb> x_ cfNFfӜ!mΜ<eߚ&Gz3yl&Iz߁sgU4yNO:O?|r/yV}SN?r؍ȓB;+ Y| }i]>yYׇ}=6Cc[fȹß1˥SCwTrO©8tx9gyu=z==֤@x@NUzUBc- /K^QQe2x0}^{?B^c,t> ~N 8G?GNer"ANe[wD߽Cu7Z}8 O" 9tf qwߘߌ?w#GŚ=/(s{,&~N=گpߤsΖsnuΩr>1q̣aNk9 ?={yQǓ܏{OϗySMz\|B/uoh2ro٩7s{;/qK}t o>sb'sv^(|hAz,wa?߫E};?P$d_َяAy#UUCᣂ \8yu[N+#`.]YYz!:z+8AQpZw>K,#<9s!sbý(#ыWGxryX_9ga8OPUЧ #^/<<%{ꅧGU(~5GL砣|[>0זK}yp3}{2׃7߯|l?.*xP#~t_f=]:00'g]!N$U/,^dl.rms6k__~[@ϤK9kSU 򇽄+ü9AOrJst zϲϨA?۠ ੑ YɡWn3C)//bq\Wп4bbXE^Q$k'N,O_.\E`(`nar 2L/<iN | tP9~;go:=Q.a7m<6W8 [%|F_uko<UIsI}aVA_\@xᡭx̭%l?9u˚9GrdP_x ~`ܢo~˹SW. M+Ms$|MDߒxPSW;XrC&VGVOBIy7^7+Aؓױqx1|v{&ȵE>1ל@fuƘSo\J#/,_'hЙ;zY9$|C}J2&y~& |~̫,QW< t{^"D k nrCQDНO?,!4n~x ~ su.~v⽨ṣ+O =kr>6Cxj˶28p_z'/54OK/wGo\8?NJyn!'9P?\]:DuSпuzN)'oDO0ʏ7-ГCi^=R~Wp?yhzE$*3=5j__SXx@姪h Mg&Dɋ~oyZヶ<8|<]MI`6|Fg^ |'=-~|L}_z>9LCjex_ dOj[O3 ue{K/Dӝ]Uony~[?'V$o yQ!ck#)vֽC) ݺql;T{O}ٿz'g/\k}G~~tжN^2ln wx?߶#&]~5|?O |}W'#~|>yҡ|}͗D^*O{MOq}+uǻ:׭WJo<ޢ~|2kp@^nr2C/R/>>l r\5oe4O /\`.o(y+s ~Míܒ3g;yoP7<8{kg_6z|eoIrkπ;78b)o#xR.GV%O+bu>qbr3(8CW#e\ ^Ds~3c:}6\st=xN=Ir;5_h^%w Ɏ\؇R1L]g[D WJ~yND:”CLi>Ymt9qKO]w*ەQF50l~5yK現>I>~| xP o26!a}WQ~#/͎Gv=}դ's|ȪB9K}GI,>@{n2g=笆>Vxp}hpV9_ɏf}e!)&O/GkUG_MO9\x08}ޠ ktuyC迼Hrۤ&k &ysSzN1LxF>#ǀO#* \XW0Ww'0}"b}t|'OɃ;ѧ4}s(H] \\ef_:|!'Ljc^oEO&N6eFOǔg9:1^y^czd,y=\O'~}V^m^9A29Ic]MGgO]{G#?yuCro> x!Գ ~kC8 =f|K d}7W"^cOm'ˢ;,ϻ`G}s~za\`OokGE3s s?:ykqM|wk>C^z_ExtZݤҒFk b#̣{=Uі?zPG#Px+R _^MsLثSf> $>ꑻ^9QM.qn FϨ+kM_$zP$>"%{ =r{o` Wh9|/g Oan7A?t@Ic";=, EC杭u~ϒP)2P3g5]Bw:8Bb<\U{|Ii53q|Lg5~aFq;dΦGE'ȩ P;+ϯG_q7R?y0z^_s!y y+W}.~-cWp?sea["y=g$tν^X T2H'{? v=> cux zm*A~2>WO2{A}^8D=3KÔ>a|/n1p"d C'Au,*C;'}Ϡ:ƽu z$+^Z99"fΨsŧ1 .%]l`~&PE.P{A(8q}xQo1ׂr|VǬ \}ѷW}p?r%J}K陴gZ;f旓WGi༳]9pz\}I=-w'yA1O%[m3"+ݾoz7cF^wϿ_~$/fvE|t }|_+7x\J\s)oHJ;H W3 |b%j=綐Ys֭CU}Ü_o`m@K>i.[L?e3_G:|c 6N. #q{vpT|?= Nvx~cu|ߓ_8Cﻇ|'~y~B yt`({4>3o_yuUDt~ 3]^EAG8|]vUv޽ȾۀWiK@_Σs}2< g)79raZsA{P^e\#WzCw!{ӕs+]jEauk8Vyq2l\WIlj3;'jkkᯇ&zs^!rߓw&Ϭ?W׾`)}}=kڃ_wyJ9V{͞^n;E}}h6}+7 s+_$ |cߥszd96U8tf?.>:X3#soE2"LC+^H={W!l PF|$:pn@SǷXԣ!*5OBON, V_DYt}[>JʷHנ\}. x̟~(~,= ~O"^GΒK2 /c ln|1y@^d^$gx[|nM<߹.{n} 0q|M ͰaK:OSSBw#'n?wtE>pķPM=72޻_󾴹s [.c;y}+?*=_0X}yC~>a[bRIp>ί$<=g|̕қ 9&ɍPq ${ִGi%<9%๾GK?w稁!>Fr6/?a!a]rxu>8WOlSpП{1ƽ)]@=Ws&\x/m[fϼ,Oyr_V_WJU!88igNp4/P>} }jin_n~#ݗ<&VYtoyl3Ao'A!߄GG=e\9{GޅP?HEW NKnBךS>&s@J^-< 8[{~OSoE-#3sɕ^ʙXO@*=߉ߙ`7baN|5 U]lI'ѥɗUEhz{ނZ(Y^ < e ܤ~Q-QгNΎ~c<7=dnn]ɐp,|7{̻-??W&'>~|]^RCM21rl}'- ({/؆_xz)#;!7T,>k&Z}z'CRRLi:yy+;:sL~lK3ȐC 03yX~b^􂷳 r/Q\>:W=%d])fJ1%}(}Z>/9Қ3_{7=/u s|^DžW kL0i%)x,9IOW3}E9E8z῅ӐeiaE)pCOQ} B>'%c~m4@t r]vH'MOv~}0+\y>~Iy?3˝d?_,CVo6辻Gٯ-a9OWǔyjZEx::@O+6J&!ɜbΏ3'O):3_|htUr4Okޔ7CM-%?11r|f߮pދ?PI*e|?\0''k΁+drWp?̉ЅzF~ &c'Y29&s&o+A?P;|6FM鞃wHgWk{9vvWSz-}X!zD/*V_=9RZIpxɑ1gMoP}GerSۄce@C>hFcMp﮲9Ui]4KNQ·H3߀ iV*&s#Vg}Inow~Qx28x*@I]{?K p~5W%^a|[O1t; z,26`g3._Ksߕ $ʼg4..Bo#&xM3\BJ$m_{|Ks=\9W WXY=|/Eфᙣ˔^ۋ~$;Y9"C%ҍP[a\631ờ^anqLw2::qtt]s]Y!X=+qI'e%p*Ct,Qz|-]P)|I0Uc9>*'=},;#0 2 Ճ; .Bb$!Iw;vuʽWriR?^tWu+y)6@}MG<֐8ovF`I7ks(gY=cY1B>%'Ϗ6Kr/-{<QU=x:(/\Z7m9Dc&ѱ(|  9~J|N8Z =6sDrjbp/O N4>`? \AR&o=D?:N7v=Z Jc>:Z`%8ūG;#;"GM})}5e p6:0g>)zGU&kfM[~>#]מȾgiK+/}{;9qʅ'e{1iglF\~\¹MY{߼> Z?96|x|)r9W[ 1/&f ?oc{~n|rsu5ɛУܻ1xHpA./e}g*.R?t:zvoSZRO=<7i!]˔STϣE ʵsb$G SGA-Z>!y .Q>nO ' g|uzCQJuaty>/ ~4~L_ wT9z^~+=U|e}}| 0~EtГNm:i9regt6m&y5v ݣzG^9?ϙaܪXS ^OA@8&8q t3}/@N/qq%x xۅ(!MN4} q|xwG#O>Y+k{ջg+Wr-n>⯭^O-}_/KT~|/t G9Y( Kڙ{,6f}|)􎑓*n_K/ut+Ar$[YYOǧn=7/PO=8Npc'H˒S?GOL^px(\|\)@G3JgoZU:PEx7'Б5eQJ<$(o#z[L=H(aݓL%|' vMhs9Ϝ}x1U Y8&qS>3INz>oqr<#GsZd'bg_kSBp>|;$~ʾW¯'zn'cO˿lG9ѧ[jQp|w=>BU <zpN8}s8MS*s3 4ѝ{<>s)g|Ês&_^}ϛhe}jU>?:ˢ\G$8ZBq A'{fRHy<?]rt|if9w|]zN4I]r J7=p. z%r`1E9xp+= }JA[$<Յ'A KƸ_1o_>w \VAD=ϥ0>ҋd!x &_o܋֣ry;)^By]5D\E["tQˊr.+҇G[i쥑~ok窮}r9C{AA/%R0 k/Cqm6&/&nNC/Oq;R|Ӿ/~͡ >"=K~}gћq}wP}="|N璼pͧw׽{Lj|Y5~ __OÇo!/}].O.׊WQ~nrKD@?{_zW(/a*}V%/-Jû=yO{6?ΧZxG]n?E!^46twvDM%_.=IORG92zyn5H/vX==I^ܻCɣ;Jɥ[!?S !^oU/|uYt臭^R%e49m=9m6~S.S5?{WVNrc%$eںatʓ'_!lU'M5[v'G|<:eC D"1` {]礏\x sc'Vu߄uOӓ?\$/os纰2za| 7C| t^o\3kSZ_g|yKkfQ{ge>A?9Q F1@OcG+}?]1 K7@ 8uxvΓޟ `GеWs0zN쟋[E'yb'%}l>ip(:OzH_}Z_cPFi1qΝ F(*OF~|iiF jwhp[yJ^Kg/7iyA:y"E`-rlk}@i8g㻕2 <ޗ&[Yq޵_~wKy1u|z̽.W ds붎B W!RD{Mj3lg;7rT۾7Gu!tO_ /އ._q?.CiثG{vϕF}ɣ7W2|I= {ւ x.gFz "PC=~{S.KgklΓ}{s}'({i=b}t&^h\!A]"+7 G!9ϻș,+/%|o%| /[&A-zÙ'[^&9^>Lz2;zR kkto^P %< Vn/OǸG<ϗ2/9Y5Ѕ[< mt> |(.OJy(s'~sε{#9Wϵ|fye9z%4z&6)1x&b :D>0wD|5gxN( /OPМOz<*zo'J{)od8<^#{R-C^63eak$C{=%ާ=~@5{M]BG9/U֏|ťon[Qm:Uӏ\v^U/v9M9u9C(7^&i\}+(CgO?"v*ؿ~|2:})tFz܎fÝ$Ċ'!-C`Olr/*]AȾqrs"?Qߝ@qDutK?N >kAysicB+}zI3w/_(x:MC܂#/}lN0yӧ^$>O~N;{9KzD>j}^kț;K.)>O)_z>&Fyܶ^J:f?9󀷂7t&}# @%pq_,iXxzIlcV_͂g{̧,;kτYz3jc{o|>O{6pxG,Ve/*({Sp {SL% w ( !Bs8y@r//ߝ!rJGG9$9{S\ɮy`+g|;o`KUto]!*r'CzRF?8).=$'2_YvOOVkH;q3<6sdz=[w\kߴ(`#9٫ķ N+җY,~zt̽rS?Ǫ3c39|aUxЁtUn6Cc]~Tfn燅ɭ'_t ~SDw!X 87MI嵝d?+;_OO9FϜMNrt֡+TzOZ ۍ/h"IYzRХ8ωz:IS7Sq\9&m7}/q7Й8~#7x'xu\]2ȱ o.rΠb/_zo=֞_z[]r<20e`o_}k6K7~> ~IY??ggW:A&{oA2)}3I܆Gge4o^oKRp·&['+K(Ey",0_ >fsNy:rJN07y[{[m+`_O?~V=0s_y껕n/Ms^'2C9?x* +W.x=>LH_>Ijy_34w9@9yCgX'Ox}@88g񗿞|w<}>+>nq$Jk]GQ9ܫH( ?l˻i4{6'=>N}V}1{[x x ~V=<1_U/2Fc< O_wѵf!gїH!}:& zc3c+a=x^pYtCW+q\{shP>vcNJc:3 n&=ۀ;ڹ;nOC^zyt٫y!o']<'["0FB=P~[o~Yu)#Ԛ S }A޴9?}[=0wy>Dtd5rފ I>o'8o:$:%x2 pL0'YKz/?GZІyO'&"͹%0#-bl_W(>ɯʣC [)wd^SY7?1ea [ lK˶~{78vFtWwy(2+׿^]rŔm;s뙄٫|ukC>?hv> T9|='9˂Ó3:=!K0{:#O=3D?&>pQ :K//g?s=Mto+A}̞酧 #7+uiua4&Jԅ^{ȶK,s?.wGG7 fėݪܜ&i{cG2Ws^{CxL~RB3'j{VS7ƻ۹Qqt`tE}R2ɍ\K/CG޲_կE~&/\%_d\q^<~=W9:(yL>&Qz=N-NB%}l[K_G>@GS1%^  eY[`^}~8:9g= F 1Ou8@>_;g_`ö0/;[T'fxΔkv]܏M부xAЯb{\!~FïZT^!I*@(&?~BG;l.睯fn(?5ws7rB<tɯJZ${fGS| X t^~_2zat e:48VžPs;#>6AyRI0|yM=/c[?9h-][?w%tvAwI9=Kjmx(.'?;?%p?Bxģ[!0{Zy=J y:牰/ ΂Gy|ol}.9|Q* f.Ire? :lZ KοM:4Q8G\O}mM̛Ёz:x{F>hT|[Q.ax[vʿSg~)~:>;џ{+ykO#6^aNA7#do"d?6NrGR@Wj=oeO}}3w.*/_ۮ?{r[ē7giWD|'ᣣ uGߵͺѯ~W.~!w3>R8b[Cؽo¡oo+܆iIׇNF#PSԋ5Il px?|zeJot=C>8}}AѷH*?}a_W$|" = a"G?i ԯ^GRo5_y|(y*E63O}aN=ǧ:pK;oYy>7>=dWs/gG'/Sꗖgm'{ƶ=wr#ν`|*sɡ|g.w﷤IK܅~hlﳟip sB`>8֯W_̽z)1WK?/i41?>Gw{:DhMzlp^`~i圌jKa/?_}:/<ܹ׬>1'Qu[rn` tfaG}'ݬNϮݏNYZM>Rӯ~f8Ϭ~oƷqtng_=[qrQ}=gkҵ'_ߝhyď*l}ʖ'.\`qty)N~`})P>W9~<^^9RA*N^Qp$ϸԧyLxs;/<kQx2k^,aip[z=}Ex6|h+W3k+ќwSߣb^|c.t= .ހ~[z^wpz=[t9/[W} wDN+߬G8ؿ՟T93潽_,8&arN sy/5c><} r5sP>yܛ(z gG"_y$xG:N|mBOЄ݊N\j6J.sG0/潚 : >Gk=[ٔ/sZ?wAw: &-O#&͟3˟Gfur':gѯxϳ(AS/9:7/.ԋy3y&OwL*^t̽x.Ѝ迕%<.+> /sm/”˧ɭUUQ>m_ wT~]RFE!c$cZ܀(~:+3yRO/}ݏ'^z@=#[rT|N L㇮݅} y, OR` G;0g$$37'@YCǐ>2{K*Oo|pq{.r>6 $CݬR!ztu/`^ x6U/L紗1w3?w.n^'_p Z<3|&܏ɍo&O=;UxG/|ש3|c Ww(>z-\crzאG0?:e9B {YI| Hq{~Yu<*7c#>ֆG獡ϟT.Mz+Ū>r/b>Uo1^}wbjWWe.ۄă=ݿF?OE}C]zE5NN0=#+z;˯OAС'RC:X⍯nUOb#O-k^ Os 6sh/gO3wFϣ3O_9Ľ< W60ߋ'ap ޷ե?.X:_GڇoMy>a%x}ȑ+ѳu'>NA0rwe+ OwzI~^it 9?rr+G8G]})99k'Db:7Ѕ*$93 r0o;̞|,͕yѥwi9szK|Wy;%KO s#r1W_yco'+_p}\AߍoJ‡onP*~-z,w9z_joʇ|K|Q{㧿=;<=/N.cvCۋOѵx3ynC>1HqyJ9c{axNKwH:@9RfӞUdr9{:o'A79 cn؎O~?>rMħS FGbhcO<-7xõ>r|Mo1[.[RkھrCk|] yW'Wz_v:or ~>zm3ϛ|@OmEiE7Na#% [ŹsloY_:"z ѯ2/y;zA}zÚYGП%%9A^b()rK?o0}ŏk!}8xϿʷ{b~QrΣi|T88>r#R^WbJQ?0lEэoE+@ nUOV ݨtd>{U陻,xD<\ܾul Tyq~$yK-z%(rSu߶0(Wo}>=o_܋_k7x6\KFU{ׯe9=NCݰ΁arJ<3g <'4.F.9E4yf^=|轜5m|G|c' g r/ }%uY 8.Υntv}$V +_V~IkKh3B?`qS6p%˞ÕO?s\e7|/r~*oZ.ΉG/zK$gK؅H7/]ǽɄ9?x'0|O}݆zvz ,Io`>Sn|?C|}o!H(y߇ǖ2A ~n4ߓ|1z(c z S\}ss~5aydk]Yt_G/t>&l^&|.W[5}uzx?"K!t? zk=ܟm8sFY<2s#Ofb-~{_J =-?ϣ?(1α˾C/:f·=hVOth1t.ʾs2x`upS!J#1+[ H;^Iz"e9^i9)B+8?ղeM܉c`^x'^KVw/JO{q QrZ*?GoWGGs$8~_FnFA~NGR~G-_]ct"?rwΓaob0.)ޒc~\T z8Lϳz֢SoMRK+=@.J~k.碞SMr{@sɹ?:{nI3Glbo?K}W>M=v ǞPyY$AWVC')e;  x]=&~>'?9SGO<-o12W_FJ;{빟O;;_sM9񶈯i{Z:O/kE:|rRo#xY羂NQ9B3+9~AsFɩOWk}Viܻ/K_ɪaxgR̍^lC+Ӌ7GJGWEQtgɕ|7sH}^X7N ߭]?0^+<71WoB^s.xckc74՟+?! #gw+tX:56yx,Ns?{eWz[L&=/[SQW_JGmm.Nn^|U3IL]R=/:N~_#eRO} +pRpwe6~K_q8,Oza}+{6vyk״n8w +yty;E.OnsrM~Fwy!Oqw]֫'ч?c2kŤ#ʒܓv@'}p|ګxaοK>k=1\[?1ӳC_|[֕g^/#c652V8ȥۋvJz8z胴-+9Wz˃]93WM1KU?A"8OS(2>ꗭ{[FW=@RȿM5dU)|ye&S5L1׬%c^MKS` 2NwxR'ȏʠoŧfʁGge'{p p`WH x~[?\g~Cg򹏠T/0{ υx$#y#U}|{+\Ud?A/o9 N_(w{MA #":#?>_*?ϯMW8'^Z28{M>s׳A_N)Ã]\# 8 ~xr" ])KE\ &0Fz0k=?=Ws&5SfwOqziK:v-Q'^&n@NɑvdcW?6M 6G߱=}۷X G_=/k<W0~4,=#} ^x /ۊxU_ y"&{~_}>qc=)/n{eFy\N K6rn->y>)Ws'pN䟟F^BG{3?쉂mdn[q7nETG[y(zWf(ワ[]>wSys9Nw|Sѻw[Uum]e~F~* ȃI˂cK{: ^| V~U58_alt> x?#‹ũG^^ 3W/])]܏+t:+?ϳv~F;D{㦼;hiD_:EOO[&G=9/zԕ+c=<3E79bʫ&oΤJg6Ȟ{i+FWiZ>lw܂/D`|\۹GЋQoFψ_"O{=2í#^Zy zv.F }\(xTExކųT ;?"Mxk bO㶓0yPYI[EoNs^Ѕ/J~ qp\]$%LR4'm3߻ncD/RE?_ \24^E/]} aK:":(~y.t%!|)iZun+'sʹsŶqO(wC~vt>E uM ʊg9  dnKGe,(r̀)?k| :ld٥҃(ݏFq?}s!~C?zO|:z8G`'oA~(Ex3鴔w=|f 7cPV8B qt%\l3%;89GȝKA;yK8?SW~> ~^\$96}N>k'VpPr%!3܈>G~E-+[L0Ǖ4wZSɡv4Vr|& ||᭗mZ[<|Bk{x.o<#//h7}| pꇾ9u^DH937÷iC|O6Yh=}y>>9FOy8ceqMc sArHnynt[qg_yw_<yH;7+"gyrMsU><8~9) ~rxdƼL.8da?Nhғ>]e"՗;|>Bϐ#1Sgj=% OS$9/GY"7(X%߆Mqg{@C/`VU|EyJ ҝ\C_^,y/'[>2=sAZx<96b|a#Iw(?Z xT.~ a_|3gS/ҢWʫv?3`VElS̝c14=#?OYztk2𙐣o3Wpk r?k_Slxo3A= pY\ *8>~̥ݳr'C[eNË{#=+|C'އNT=?i3%"oҊp+b丩y}cXL!0\ڦ-Ϣ9Rz 9| ̿!/ЯyI/N ҫ"䕢>n4ߢ?ySC|k|޹Aε{=\Gya`U"a'T't%}H ~e)|luGSR? ޒ4s|Ot J\x~/}W;t23|P>ϣ >>{+ oCr޼Źpz\*|[+>[M`{>/m9g>m7xA݀zV3[eVطY<8wa~N}W:o?S||B^Nރ|v5xw2W:;FL.+/y+'E?x}ڲpoų̡pWF|(E˗_CWFyzqtaro㹨(ߒ>xrJ9|$V^I@7ȣmfJgYb? q~t~\YK|óķw}>\m}~ApQJA<7>~-;=&}S,K> v0xr"v1=SV1YY̳9NzOWފ>a:cZ#J|+2LrfԓXEB_\x|ϰ*x0xi[½%|*_Jk筑sz_[ !tE;P-3g@A{ k7{@8}d~_}5*FXUx&|5p\]?=6|S}?ƹW?r?|W_}IrOPR/WeB#D9tE_7V=}i.?z> ?/C~&Ox|}1yDvt`y0Ytc>8m=x0=k%7أ%xe%ɒ Nw Zw.V8W.:1y!{z]n{ɀxVq49T>;A~_޳vn| u|t҅rոWR;: G [?pxo}w"{ =9x'Ozɳ9$O,s9A3#&?+~^s)N/0yM#tGhAA_VyK͡Ӓ_ gs{uc|NU|Ѕzq:vNy=}BE<re?閂܍~/Y |4K ?4k3 |wQɁ8zR۞鶓[%erj쓛QVK2Wy"r$bUV .~ k㯣c/4<O CSDw_{j-e8(8};UTn<߻|V_G-t1-!Ԙ蚔 ^L'l 8oɹseGl ǫϟz^,|}%~a+x?У5| )ws}oYʷ.^(48휸y]TxAv'|R묿7$=3usK-yEnG8W_[!|Ez:89aM^{@ГAtʿ(p[\/Inx~gmPxf*>^v|˷_dWo_koOVG}|N_|+(r/=>0 )DG.}K!^Rt<H{Bx.)^d%2'y/9bqtlɉ?>S"g>: 'n{$)zz]䜻sN*7I|$UsK߽}Y%nzaΛ(D-.YWyJKI 8+AOh5B.Sܥ<弯SIteyt[z^Հ't{k(7_u +ρ4}pqB yz9^]ۂ<[ߺw;?7չos^zW-P :y g.\~y%{r@"Ʀ fM$99gv,0OY=h-h錔K>A<5뷒#yَD[{Sscɢ?ՙ7`>ro v^[Ny/c-RrW*x8wPͳ*ֆ@dUEWWO! yNQ@^~ S~p^MΟ%HܢG Jyg芶qT5i8П/7G75k8z\(IME79j{] zn|=hrL^2 CoibLѳU3cbF_iVU{_9y)7G{GW&_m ܻ$:BtߏM /K҉]p0gs3te /܅)>?}ソ=Ν sOfs|63/w[H/}W HuryoYU줇.R=A=<_򛔂W35iYer-+^Yz40K){'2f}7MKx_'b1x&+%"&ߌ3~qip(>y"ٛWi[I#) ?_{;ߓ">8~n˰G+~9v{w+>]{W m[)sf@n)#[ɇ<ޞ FI\"HC+|L_+޴ͷJ'zUb[==V<׾4Хc|uttE:s{d O}91nnE#lo#'Wy9L]EgvK!Ix`kg/Sw۟x8"iݏ:䧬7hM"tvul$>COꕩ-ѣfΟeI KǥS}E5l\7 Nq[}t~bޛ5|~MΡ4ft?˳} z0kn|{\KM,F~a/.<*yKশE+{K+'\ԏ1^QQ_epQ \D=zy~x0 Dyt VfNo:ğ9ʕ~ ӶH.p &\-$蓵ysyUE|?_R3b_w)=6^C7Ofw?m89)g`WSG.0S:y^ >^߹/_o΂S/8_}xA1NJ0 ogn|kQ3+oʋ;d8[>Q?ż:^)ί^E1g^*2 ᫳s%H}?g2z~]'1'LU?ds;ZM=]UrA̷ ;gjTʫJ9aO!o O~tMVF~Am{C;K(~}}S4>.N(]9Wp}J{9;1 QyE3GN˽O|AҋkY][eӻ?=t_ ~@8Z̆ϼH~(;:wt6 Wmݯ}5M#[:N_.%݋ւP^|qYM(jܕ9ַyCOW_H o0OV}" k}/n%nx0>$V|Ul]9Гk/7=ˆ~>NpEp>B/}rG~`3Qx[#t>f-Wow4ÄO/-Ve;޼/lFrpNemzޠΓ\#+s85>=KM3/S;V >USP}wz Iz! =w_IsoҧѹsVݳ ;rts+ڧ3)OlkB< Y xo/cl9B*Gg?&gg> y_Nϑ$~,, y46۳ErOc!^zABEu}G\{}#y-޶\o^ WTn|Nށ^7y> ox|~ W=.S$}eIH*fХE=8߄uzyxT<~{ CODž@gYzmJ5 2~~:{ߢcOTO9 ǃϫݟw!t _z(0ˮqxN <<$Ip1ˡ0kX\9ʫP+Wd/yŖ&,^mpkx [= [Çg+~wsOГ2$}Hm>^).|rϔ'0vtfms|P>q$~@Jp ~{9-!r K/fyJpExS?5'0 ~`ޘ-2K lۏ/ӕy~Y]yt =d<zu}'W2Qp- v zC飺nGgĜN3Kgh/W=a/ȑP'sm?D%M8N8p=VxΝ:9Cȗt?}Qp8:F3:7XB߆ryMy\ t[[_qΗg$Og&^n8~ ::q~tZ^R $I*<8r"uT']Y^qzW ֫\BkgfI4Ϣ|ۇLJN6/)z!lr^Ds=^NÇe_Z+?f}(}ss=eϵ\ͳfۣ}G߆ީ9gO6~weȒkcm\i ϺCO=6_7p^3Bya>|pEiA];:IrJ>jxWr 'Kݔ+X1k6O'& >@>z%2o_߂ׯU.zw*W Mw.q8!EbqTcJ|K9|VA9{@;>]g_ _Eg=։`0y߷Bf΃gM{"ӓ|NS'vs#{]+&#Ζ}9ztCw.(xex-Ww 3_.k;}7N·cԼяN/@At"eyxI+|k ;+W`?{'>J[IsӷrؿLY =~ h$ Ǹ/س75tI-? >969O$q/b^CW9Hq>]?'w=n|N]rB*хɿ0zaW~^0zd< 6}'b}BWC &{ٻ鋔se9.ePoA+q?"GξNix!|5((ג.+7{O'M["{{^o.^ޢƟg繍JP sI57~{sO:S0rsK C=_ i\c!|Ut8G՗EOcx t@?WF޿C]rrqzo"ϝupD3/\MqB$z9ޟvWi%_9g(erkGL%=(w=E}7 q s^wSx<*Eϙ!g@f; Fνu=qICKl"e Wӑ>KQ򉷳7_Ы7osxMjrH?wiO:nb/c%R\~ C| M#SqɣsGW\뀇Plܷ%p N~#k{`Hs rɔYg6xp&pkXV;Ke{ Z=?!mU!79ܥ41ѷ)''c?L}Cq{z&4K]D߸ ~wd ]zn>? E>2K~^k^n{x_|" t ~~waOϐ~awKv^K^껤'}\0 >!'!?ovO';O3 n)}8]ʹ" \>P>|?}k~ ?d‹coyn{ɗY^1G{Wlù}2 ?s}'}ϣca /@!>!ƞ};HGo{ߎk'/'fn#T Ͽtq>9M>/daYV="-aE^G>.w̒X> |5XF\ErA2կ>M_~9WX |[C?҉yc:.~0~s(/{zpex{~. sr ã$/64㻽ܦ⃕ p}c|^:KD{enlgʫ#t-ؔ >%?K3x NoOGS΂E7+nW8{X߁_rxtYKrn9OMBe˔E/r'\,PkieSar&N:2/x^\3ni#8=cv'vϐuʙkyԋvracNQ)=SsVn?}ۿ)^$ʽb/;>>%?{'N,Km?빓>佟yb?>.NYemÿ.k~ii\?oˮ9/﷎wثO~/ꉷ/vӾz_uI7.5?'Z7{c#ušy%Ѿ؁O[}&KȯȞpּٚr6JҞC/{7ȷt߻w3W?_q!|U97]M}C]8C=+_qg¾/&~vy|_佝/\;zs/l3/η_xoO.~;-W˦  ݑ7_wß8q_駽oo<'0|t=;6=+G/*U,l1/*OpW ~O|C~rs|2M8sݾݳb#=ayG}=;8I7p/kGǗTb߬ a*/бAFɹGG[ 6ϟAgu7pu3xnf]qx܏=܋e|޾vY2gHh=y=G 2dW)Fp_6kťs>⋞҇)8iŷb!o9o:*y ?V_aw'_*^yi1ת_Wxw6|џ3r ^/•{W"O}ͯ x5<~-r_F=eͭZ|{ ^ؙ?~7W>4$ ^~?]g3g >}B{(xWO캴o<_n{?wC2O[w՟ %KS-Wvnハ?A&>sJH_ JC|0ڒE;-y;\ϯ:5%};- N~^BZm~g_>`a$}=h{kS}E_Y+:=u(wus}2ˉm#NK#G-O:-Yc]%΢PP%[=j3;| >^DɫԁopVux"WL!*.HhGA y$0?` AqչvRozyxޭet;ѓklkoC)ksd/~C\s?~4;JN_;<vUs乔Oq[V\9gQ Ps?>|'ɓNЄg_ɣUu O>*<`8r ΅ttO==>/Jz~$\~swu=wY>ʗh/N33Ku= sKN|<.4(9xiӉOyG_or _.WU(Oc|?+48ȣ+Enx{gpNWDZV"|r =0꩎^.Im4G/zEz8m}c ޠ ^=>DwD|-{g]%;G,elW~@EN lUm/:Rǣ,orzs/g95m!|yG>"ySC褴˧V'SB^-0W6A.r|r3|QzH'L~ i. ^Co*7IyxVm۽M|!)) ~sLgΒ3(Q2$KVȁOe/g.Gn@vc@Zs^—Tomr4EkH=S_;+Bo"r :GtϯyNKV>4y9=pI]o*3'9|>ܗ×>n6_WW.6pAY=ri|W ս͎yW{s!Vp^m i?{7EPqٻnZ& ^iʗ7 |.ۀ~"As eo8ab.H7m,ZC7wK\y|AG["$.Mw[GJOÿϖOo #8:pitutEr{x?BMhECݭSK;szCUda_)>h缿q7oz#'>0ݗW[ |+_;򩜞0/ {0g<LÓ_Btl(Е{O4Ѕ9 09NNȃǧ%L.?`{>ؿ=o948=6lOb/?_+癋{8߷1H|< n=9:νOQL>22myV=~Jڿ7 >=|oɋ?o@9‰? gyY@}׸sٕEeN>MS>aίQzN8yM-9rgSQrKVמk8ˇ3x+_= | sjח },?zW/m%CN#=^y< Υ$QNqV˜wb?g R}5Vhm?v@$?|ezmBã̙yH$871s rI-#1{v'Vggi^ތ/ >}Z((myyaGJwwoZmDN?tiA5wGs,ukF|c)e/& ȓtX߫ç]|c.'xѳd5ȻpTOU28|*:ļ\&zVCFޙusu2naHuأ䅤g x{q]/)xAw^܎_tE%y!=釰:HЧYBM[At5 lc?D>n߽B|9ttqn t_E'{.AN>{7'r C.[?WCz<5rV6/ ~lDw9Nww3_{EΣ98N?˩xˁ[_\GONsO9HJ^T)xo}ѩNy]/cu)48eߺUj73?yۊD zfF>pOur Y. 'E79 ~o$Ͼ76~s3{'yqzAW>[z~xb#BmkN +a"xs6Ǟ}Z9DZ{ܧ'lWt.0%ko z8}۹S9Qيo^ ~C:{|AQo Ypa9yt }N ͟' ,[w6|#ps N8lA*bp;9rScYz ?܃:|}I &#Sᑳc`;ɛQ.A]zz2?/N߉}]y Etk+Z>j)_徰|98g6;>oѻ,7I]:b|ʝRΛrC\Sa4Cn0Eᣗҟry;o}]"t]G ̽ig|!(Ipgsqxra#UKcT.0|T_qz/ԫ:p _7~;{}:>)JjxŜ=[9&cu>环!9 <ʳwM2ܫg}[v r+OIu9O *jssN 3ġ=I>? D|w̡Wgh /ʁNӬ8߰Mx;"etE!r+''0sh!w<7Rzl! Xm WG8Sl~'oϵsu. O? I-Z<9 =ۥu|#Sw`;#/ˮ13.7`oV<;ܫ@GpZ=n-QX~Gw?W~{>;:pɟvsMD9gq7_yo$zF8oNj~{lFz/eϴ ݳ!>cK=`;/3JT̓ƘWVSbܷl_=cM~d/ǯ+/nڹL/K'l<.7=R/ZˁճU']M x?BU*禎[1.yuA8%xS[ooԷu+ߏ҃gWx oKY(}t㾀_a iz./y~t'+ ͕gOO[5={?tx᷷+6Nh|dV^ Ϭ}.$7]|m)1V>=9 D^t =qT/;Sx|Ms弟GOu_rѠZ<߾8zknrLë%p^ti׭jk7ُa;ߨ>y5Y{+r8GoĿguItE?J_WZ6|<.o{gOϫ|IF>; C O> /{sPD?TAopa8 .{> 4_x =6_w~ 5侑rIrq7-ϿxCϝ<]W%9:^0[Ÿ~ހ(YYpS>%zɗh7ÊsMe\?Ö?mM_ȼ}'A??DKy"@bE9##a_k҇yWzc#G=t8jx)r3U \FG@PUKX=Z#aSpE~^==7ZӶ_u?gy"iy.&x>_)xAoc_}GGГ4M:!属4:Mo͟x'AVi[r{}?߳CD}ְ/9MO ەgOOApxY𡵁ų~n}/&>{S|"<ɼyt{wI|*y^kg[Bg'?8E-4xY ރO^kKY|XcF[ߺ} 9k<EJg| ac-pZ#:O]`µ;_!rzNǭe\]_ uLO_9e]_o9>a*rL|pYVz,;)ϳSA?fΚo//k-uچkj?|굏米V ~=b |=uw%`ls'/K\0zeGWM@7L)xýVRLO\f#rO\x䗀;T[?]s_|pUa˱YarBEuz}r3bΰ}P8Z!> ߞ>Z/Ztuq"?)G-0v}?]>ci1YOs|}hxCO'ltO -MzS?k) +W/KzZG>?gj}؎ێtO.| 2ZRSd{d?l'^,^yeŕgv2ݼd`:r/ʿtat1ǨoRI[׿l|ͣ)_ ~Ճ9ؚ 6~}$?򙕟M =\W9UM{_ 2!NAS:G<<498"q+s 'kGwP3z?o忿\)_þwt}w0w6@#^*t;Ё⼚?C|E;vr2rN4|2< pQ3kg?C XyzfIyQ'?ڥ\GXg/+5S |s]fףX#UC|+7{=W^5gI'yY _Koyq!7؏N?˔O§O0@76˽0^@/1ϳwT!G<S,S]?&g+է/4>i7Ho޿o~ {c[g_ 77wGxЅ$y2zKa3`V1AN]ss}$O/?:OM#k"}Y$W* .'v G}s=7/,k""B$7s㽙Y%d_0oVש 傽C[y{Vß*Gߘ=QWa7|ߎJ//~d"8}|/2w_5[Ky/S?׋,ǃ^~kiqu9M|.?^sZk倿]I9|!/}7O=?{2x {`\f\mB s ~gcЃޠwҋ\yV_7\A95\}r}"l}@ _PLcyN!~-+'p*qE#KG4WWDW - 4x`ޱ,[nuəQ6=~sYpǿG?q'#_̝m3)WI/w>ޓ8rr'+NW {=7<ߡ3r)cUV{v9p|9xZ.rN>FW-໛y~ş>OnO3=ZꑡU+~㳨kʳ}n h~HrҭB~jR){ _gDT}??_7ts } sIxȞ N{4/H%_"vz_ }< nI8s ەgo4@?~x+2F*~r{OӗdG{P@_2=TG;]8 z}Urbvemz)| /7ܮu Hfг}E|{7QNrZ&[|~;ސ)9_DCn(m?{L4?ܓ5 |?G|yӆG1᳣X׷u azFm |63/|L_Q{~Yt-x /x6/*~)v{/|nEx ̵/~6ar=N37 e$K niO$}}hg?a'u9F>E}҄g߈Ù 79oJ|Z9gܫ~<|$YF>zo"/[kqzp~9򜔏:\x >G~q)~#zyS xVZᆟF/6Ue. x D;IӃ~!\/Y 7Z*9\޺W{[Ug\8Al|YurɯE^.s:T)->Io=d]b:JϸUEǘ3G΍/yp^xj߿Ηn|;o*7R%'j-=[FZH DkSGd#ķ%o_= V$W7?O*S$|[se FZ\3`?ϰo'7^8K^$8J -1>\KX`?UNi3W<+?C~1^rx?pZ~ߏ<rlr:}<) ڧn@6I~0DjtaF㛟{NލSJܿ;K Sjpr2kKa>joapk(|Cws|p3וY5=uѷKN%!4i|᥿ћ|^y&k%3oޏ=N>Kn_^ dD^ GkM'kznAN][oWSIۧZ큇Zm={ޫFRԽfs":̝{/2gX;3j,n8?ȍ~8$9nեcnl%7~ 5ϴ#oJ-I3wûUщ6~GEz* qOwEtK"֒?I)-rm}'{{@)pW>L>AfZ_S q_q\B.o!3Oߋk] :yԻ0sOR^WIO=|vM\)N^LnXo?$g{9دSwgK^G{#I/_縂ysQ?*u|~ç|߶ATS\rΗQzvzlF/PeJ$`)tcKcy<țy42h^W'`}t>&9X &|$`3f?g 3e{g~Dbl0KQ> y98h<~wgoF/7_{ r _SW3|EGLuꇧԓ'Ыf|x1ЇeXwSǿ?LI'8wg$: :COn{qNU񙶘?Ng߭q9tKG<ê›=W1:zXx:{xt"h_7pK("O|{ztגy|b$JWoqp>ƍߖEELJPWŜȾ'& ۖ-~I|뤇OOQn:1wڍ? O W=F>rbQUWD(FVr"2;Va+ëUoF/I΂镫Ag^(0|\ߡ\8g8&~踦ܧQ8E \M9M.ZT3 ?K?R_>I8\$47};t^21Lӛf}'ѳ%\n k=?f{vC?w_GE-|xo{]o2MCζ9=>qpc&>6y~п7|1pHGt|t#6V^j[gC򺕧ytP?}v};?F:O^.fw뇸 z;7Xm#x~| ;lȑ#t٫WX/[se;^ȻL7d'g<#bQp"8W#~JO1Йvg{ ?ăvU?Su/+![N'fܻ('ϻ` C qDz+<6MևbS:% Wk)?dž9O ѥ˿]'%Sr%tV%~x5̓{5nrU<1QO}dW*o&rm;txYLeθ׿5忦OaYɟS_OϹ 9u=9=K)m_QgcP$f;Ͽvs)zAfTU&wՋG--~z5|Gxa ˔re=y~DCt=NqNΒG]tCW:YbMseNyiæ$!v r6EN=ˀӧZ60G= ~_󳩯f?|AkXA朲g3Dna~ D+,O4 O'ЀϪqN&'r̡ ܓnǑ~Oˡ8]~{es[7? /het z*ܩ1F^r? =N|<^gsH/~o]pKwƸ'|>%x^<$4)(76,=ZgKϐoſpfϻohU& %;Vzy}oҡ׾_IfsY|rosß]u6=?auu:́8|&p 2+9M|S<}YϽre7ʵ ׺[=>.~~DnaxWy!7Ί乏07n}IЙ|sWO}axJ=wrMv܂ &OWC9#߄oItOx72y,kʉߡ*G"zcy+;O==s}+݀e:}^_}'WvB問u/=0 ݄IW_w}EwOF9wjS5y>7U}m:oCgZឡ׻ϱS `g)6x^! z@᧛%4'Wq?4xgc z-}ee+o:rd^L/ո 3gLJMr29gY-+j=#uNws(|6FrüAycN3&Oֹ]kHs/n9ۅQ}$ໆ=W߿9Syfxfyo%="GrpZUz Ypۯ |3 U..>?~B?%=4Kfyr7Gk/7/6sv8N8}5x6g_ Z=谍kW?]y%xo*AVr7L%U# w#SKjj5(Y|:~+2 ?ʂ 8X<0[]$9H,'ߴu p=%S1_ԘC.E*G@5q:\y,hE:%]cΕo 8U9=|:^̲^?-,}d tB":9~~L߹|[7E/d³:s}7hBJ٢t}'W7E?9>x Q{LAtoH۲qW|1>t/1L|[L:YxUpf3b_t?qt_^C')׊ȟ xrmq_U/s7 ѻ:>.{|;Ӿ3v3eD٣e㒜τ/^} Я΃[Tt:r%iS_]`Sj}tMt><\1q4:\2y҃pLtCm}d_E3cKOo_:[cLpOW*Ӂ&:<݇iݧmO,ߋr#/jpF>2=+c6ls9-]U)C9I6qgȒ?: z0x4z*]U|)Wxѻ+MW>&9w2OmI;97i^/ ͒g։Gom>q}FQ^^2C=߿ t ^oW_'ۓ-|8Ofy0c) oQUk]|bstNȯ-m? s^6r~r$*wvѣ|\2H=VD?JAG1^Q}4偢'w'/9 _*7qsY\%ws-2F$xn#C3 k{0c퉏mA?ȽPދ~y{0{[|#쌳w?KWyf1&[{qx$sc~+ȏ>@0.qc{%|:+w%^=H?.U\0/uNs;L;Z7G⼐n:އS趚W^SFO=78&8E絃}xr:C4 {|cƇch/V2]r"K6K.f ѱ_ ~QR.y"|_eJQt5h# Ƨ>r_į[ڊC9_N APxϋL31I]̇uY~/qdMME.%gNGVgٕ8[}4?#V|m>/l4!Ojho #'_0r1>*.,cV_|ᄉoz?OdN``ϷCW臫\!JExؾy߾zm%%{!_:LWK ˖ڷsSwY/_T;=oF/aj7;cA$ +⯟Fga, zyX{\9zmRr,櫥ͧq>`YU|Zmˏ,P<L?`-pmC_C[??㞜T79JՀ9xG N93h,^S9_?csNJ;T:88n)?:In\Z}:v;^H=2nev > 'bitD{AΖs^{} .'9]n06a?o゚Zˣw'z:~/5 [ܲ$>O)mzcϹC~|ۏFs_w}JJ <?qM,Nscjz7b=,pމCCW"=@UO>|#8O9.9f>^A/GnMr]ȝVo0U )^-oBo`yoзk8#qt\Q WҩeD.;wzRC?vF utC zgr¾o>}toGfek3Z9x~-1/gĖQ}oM@KFˬ PIw*y3, .]b.e^(J>q5dyn^+dq{ki| ysn>/'^X|bS EsL^|) UrHs/O~n|Zǽy~rϦc+|,G7׏XyjxC:DFsQ;M8Ik#=8͹*G 6G=ʟw#89Yr-B.xxwJO?!?*;&|{|X`U=#e; ֭|n Q9@>~5 nJ_˧EϨsN6;ўlMBg+WF& 9m)6Ansr^$DU Irek'/3y-GgKnUoƱ?[\X= 7=?TG%9h#qwX_qxw+}?y1W}G֟m9\ >k?yM$?>3Sn}y?xķVg7Vܒk>6P'P<%7F5C? ^~atLJЙ)g[{oUnpr[A9~*3K1ޢ52sD]~|{/>!2O| tfdﭝk!>yA,zl#E3/OޕxyťWw/?G[^'|_/Fe\X|8< ~!q:VWx>c Ps#Ы`aIeA %,z f .{? 179×?H>3ު%tGp15.j@"~)ϭ^F?PbΪb~WNzTIDk7 y&s8gᛈ3,;Mƙq>8GI1Wϐ__erSԄǘ`~qQoܯ3kha#`%n|Qd[GɱFxcCܛwJ:\bpxw?9D35so{'W8_Zɼeiu{_ alV}]g sExw޺( ysΞ&wR9z,?Oi49TaitmK }09o䮚t\M|MX́ "U+.wهB| ~9tz-BTͪ(g)YMrΦ]Κ>d~+4 _I.S]G ΜQW~"_r|z#[t֤_<_5G;]]8S|YZzB! B7/[we؇|N଎Ѣ- 9޿},w)F01k;`b!4H3;;5י9qc{q~^x|9}_+gIb෻ﭿCdu4ˬיps?p ]u .Cg%BKy.ZyѽJ޳X3!y,O >{n>,~LmCžRG)ӓMǚE!o.7ɹ9 d>-s#?}}fhs!}CO$'b͵gMgay_Cg 2|i w:eWrgo / ~,:[˙)c >/Sh.X^8M|abM◾ 66ϥm$Ǿ?%a].}1[n5qCYDG?nR}(e]gZks'[&|;0<4|]}MS/AZQHWܘ4j>/K<'rn?#tpj(Rϫ6*=Z[[<=9zAtͶw!0} g,0΃OYV=y-_ _ęd/՚<@^!4yW{ʭ> Ggo<8ђVk鸖-!@udY]`g߈_=*o0I;yI+3Ov MWc/wlռ'tOU6v#r90i,[&; RbL_19GAzE0oTi&E JPeXK|~I O^Ir]O_}~'w=G1+r8_~YD+t m(#Rah ^L4DλD^0%|֗'FNiпr!Ilz m@_9 ?~^uo?HO?/f eN ^o/:E2輘G=lqJq^<{y"8|',q;~f|#J_{yh> zcc-d-_sYFrgs ~|<=kyCM z^US)|y o;{b-䘓X?.|$5j1I.&Lei@g-Gweأ)I赬DpnE{CAZ#%C?5ܖj^^PHɋ&_r!GG2=kD-+Ҝou}C#N'y tI =}_M.}ъ?E/9pz(Y+y ^>x}a2}&9pSfߵޓ=% ޜ/*;/i]po#}[3!g~?.?zK=>`haꏷ~Zz8r試G"z 49xΤ9ϜMߦ&S;ax[Ӎ4}͟}D癫&Y^ #,猠/f%#2~tsj\4o e1Ytt#>(F^]y={i? ޲LSiȓ ~rMY@O4s㹣?ZB}丙9y$/у[ GS7, :K9D sIV _] O|EkI}3KGx/ cVH=Gwiz(l{EA=WWG?ސ wSd+T϶frd,ɵM7?,o#M._+mU^rLOs矬W]_z/!s:r4.= >*EWc?Z tQ&:ȯX[N$YJn";xqQtqrI90{i/U-Βr߲wy\9^qg,9Mj jUm/Qt>_YtYt>|;|r(#y}! SzriBK >{ח}r?-K[2y{.C-#Lgql'w_MJZyC AS490 NWQb=|Gh^ȥ,:,,`{}'Nj%Jt;Ou_ϜD{ S$C*&_z>paU?W{ڹWh]OjΫ0' s.e3לG2y2a!-{n^r2Ohs->xާ{߯ S5}ùv'7,;<4{z/ʊ䙯k4WFκKQYBzv.";J{,S7]3Et eOK9<.iOy99u 9'+ǜI7ė< .f:GWVbN׋=GlpO93CvY|wG p?@es^}vW4Wϔ z=,|trr*L$}lKtm,k{ \s :<~^'͞i^s2OgЏ#Ls;d6Y>8U }09 R/00dz9K]&oH l~)sKýBg#.udQ#>tz]>.U+ '^SYp˿EW׌'gƘ+KӪ}9tL4Z8>(8b;r ':̡̏keO葂üF^9sEo7sF;r^zn] 6zM#gSGis%Ssܟ ף'iUgdZ^X/!K,8Y&'v;wsoc_nVSS79?vn/μ?K;Zp-ۧYnw~"X wSN,NӿׂuQX c-k=InMSd>74{rae:pu5BΈ:{3]}_! zx4}TZ@n看ËyݛƿoϋDbcZ6\<`=V=%spf}bns;{ާA!,~ZKs7ro=Tٳ >o Xz {]ϵ=많|<)9"GruD&\~=-l'< }EO[4#@/ǿZB> LZA4OcxI9>LM?oY'Π?7_(:$otMQt[' mt#">5}n=3i$~#89sd=u4-7Eg׌W~u26g1L1cﶽ/9R1A/Nkc1yѷOKwq=H_oXΞ'EG_Z6M|ES?9jIzt?>g7yugPoy>p|[Z=g.gKLٰ{=Mz޶{챞gѤYwtϿ[ JoW]V^桴lz}!X3 M|Okdj<-iz^|#`8(jy)փ#.G8/`~0=IJ>>pi]uv)\γMkEx>-5/ lXwx2W˫b>+0o֯ e{&t{d>Ξ^BOSya~ '-?Ix67E'vWTG%{~Ő s(GsY~e]iG,"n-'ty}g8h-xRMy1u5-gf$/r%?L_Ћ7_Nz8KnnǙ4l>ߌo3=Y:C@"7O~R_J \ g ;icۋwe,7Ktn9댏O3q?<)| %o4~a͆Ӗ9c=XݼE2tzDzGWˇH.9z"r394-c_f9%?~4o=HR6w^+3WC t?{>8]UDޜ࣒.kSv)3O8 ~Gq4 |gKϖ7<5y]ANK "Vۏ}j ?xl19V/H]dd'j7=E c9k_Gڿ棵ܱ&64=s. )5y%byI6Ls *ӗN\c?9]u='g)shM{,soD}>t_^4|`%̝sGe_Coa0 b~$zޓ[䜥˵޽ixuGb>6d e6 Wxjns4Ua"!eN;?3Y Ju_{z⋒2oN~7h $({ks.y׺."oa|OOU \H0WJ>z0o\.^ >F/=j zʇe9cyL07 xύ-M~Q*ž%祑~ 9]{5fхyC<<rmWҧML5W4^qyN#/oXCkɩFx>{=zaY_Bt&zg|\%g#[Nt+˷C,o}?'O 9D O^ ԃWvXfuIc޷{Gg0M?ͯo|_z'_x}׫t͟'LL'ܶ.$\η6rn[@}ߧS9Qp:]3"_bIMw^NMsM8D/EA\K}99 ~~XU'ч?7=г;a8s|AFۘ C,{ȺCѠWeG<|~/)*[~|E^Ws{69HbD>%<^8^QDO·ޑߣM|Oe2 ѧa yj=ɅfΠ4o< ks\IXoZ {$9O-n{9w1ZGЃ^1iFBS|i+}oa紝<9cYw,'< wWD7'|+Їtu_{ޣg~h$̭;OF! Ë߉o_=3l)|I96Orֵ63;O/-/Я~Uo僒hSN[y~^~/O5{?e巗7q~Ogt?y 竐=;c\ ~IpGIy _m4z|ir3awFr9Ḩt~p,9u |s'ɐ8pn,/Y'ӡ[Kl‹Wjߠ5}v͛wUi ~Z Y8吂Oky-;X{ՑBףn<cHǃ79y{ْ6>K6F{aʡK0z ЛNzĒ} 2/i]g!^ЕJBG8ϻׇE$g9x m%|;U/}ϸ=H[\/V>v|1$7&;ی'Ɵ1~l|C"|Ynwg.xϫ#O}RGqrD1['Jdϵb[_ϻ&Y I.*?g \c> <8Yr+4sk>]~}j{y{n3#;ɳx*ɗ~H^t:. #O|8{:DΌL>&i٦'J:_Ww=+P9.Sa'HZ˰frJ!y]0a"t&Я|OyW>. st: Z,*9_:ξVv>L]y#Bޏ_^'z_zVvG!zE-kwh:|mp5r-͋9/_WBj=c ryWܻG:pFyz)_Bk<ݗ%424[o=EZ/ٺ[3;]knTs̻ֆա :LC۰>~ct$>{t^eS0x"NY0=MG!;w>50W/gB 8_{a=q C3k#>caYdjÃ5vDnWo>m/MJ>pAtyCݾl>w yK.ItK&#m' Dѝ~jۧoXj8pfϳxщKo{NO]˾\|L3T-E1fɁK.z"ۓa:EMѩsՆ\z籜}!l =o'\#oZo|ΕMW wtJ.\q7x|=ϽG|7ϵ_~Ejz]Xh ={LuM~9d_MYDwGrC#xw_EV7i'oh=yJ >_ç$ Am6]Vri,Gj_\z/- Y VA?j>zΉ"9HW~a] ޓVz4$<:{b[^3zzfkk =O£㟣MɲAiwR$W*@?`cc 1tsV [w'5i x[,㫸3K%pQC{ɭI㧰~`}~F/:$[8U◻ѓc 9a,;n+\]IfQ*Iz '5d/{2>z7?.e\`7<}_,X;<KD-΂߳=,W;BG( cjxoCMaN&d@nܥ]g ?N[? >DoWi6~XuJ{,yy7^̒n' 4 X7O=!^~lȟ3̞dnB!ErME8445Z-jjq|F Ϲר JW=&A?1)WԒo8'a֋ս4=[exޚߩk]o_Y!?vmߛI =^ 7?ݰ}fůG_3 .>7v\:K6Hc̱wZ>JxGnDڬ_w1:˟JfgȁgXo +9R2bc[wR|R3oi2Wv OXwω-<')cpjO`<[Βfޝ{Ѐھϫ=x'e%,JC$\tQd/<9A˥>6jk/vs;"[wS}c>2{t}7~!9mA72}q|;OߙC9cW>(>U-\O$9s Y'|z71ϙyL{љcwL_v=zC9-oտO[fjr5M z: y#jMQmSkt-+f97rՕsQ{Q!pjb~͕.?A[ɗ?ZalArFÕ:~rW|%i:c>*W~Z${>M>Ԣ'g.it%p zƬ&c`U\e< $i0< nz6ބ(MapF'!l9|J\[n|7n/A6f,m$(zԊ"OCcaf_a|9)p/y| \I c8?< L^Iu?s؆J%ua.}>OtO L9GIqIy|sA橢?o&7@gOME}=p|'/[OdEIrMSlm8D}kޝ1B)c‡ mxλї/pYT!/.%E_'Ec4Z"qA^t9#{'px g眗xB{9w ༳;3{zU4߆~G$1>{Y࿇H{1k f\}:X.i!U 9 |9g\Isv{ƙ'4KMAWݍܤ/z{j9rJl?[[<>Zo✬wgO Ѓ##w7&Yݰǚ/>dUz/89l==w,>PiDG'b|Lf=>wq^Ws'y{>tz:VFN ?}蹟7:?w>Zjx<{ 9: oEcd?kj<?Q t:fӜ3Et/Q?w[or_s }S;^0p-Y^v ({M-p?# b=h9mb%_?ѳ[ih=])׀K /}ؿ}J" ;Ƽb zxJ}߅v^EGqy6_0xV=Lvҁ~os _|ŋn 'd~(T{Cw+QG\esz#v4WYF)t{m^ZFޢQFy}LOVdl-ggF!]zFɅY`2o$r"76{ bNj\ _g(Z4%:G?~-gF9ia|`~AIw ]a{8éw'GR^|Zc[o'[$^MeRnkEs=&t(5 fy3ә/m5e?Zط3#-EkTg9.֓`~a{m(#ClW[N/@^L>P7?_4~\7ڸhj(=jl$ގNr '[ϑay [oѓbqY{VjI> a$brBMɏ#~ߎ\ix2=@.L0 vgT/s@'|tz8_WEKy<i`,:$=#[Y_博N]ʗOU)P;񹭿Ch!Dz~.x)|soW qr|_w]s9t/w__~3YݵwhӾJdzU9SóZxe)nWRP~=Y GOCї]  ˏN(zT{tm}uU]<ŘK/34^/9ܷ ej?xܲUwܐM+|vկպ㻏,~fPnA*V\'^͟}-j19B$SRx=I\xÅoR{gmiÒw_^hs1:s5ߖ1t ;[tԢûʟ~v^ti8*Atɺ 92o_^,z}ߪm|Og~ƄN f{;Ɵkڭ`$7Pi&g9!M&m/(ռ;?%xrͳ[3}jpJJvWso}e-Hç-JP$,Ls GBa'._C8|,b/?o|Dyέ _;ͩ82pI' ʓ!r#%ToP ꧟h|jβؿs_~Ӷ/Lǧ}XN|im߿l)s-WbIZՕ1/Z Wze4: 9j~Їo}?)G,צ۳[{~?-;`PzB߫ \mogmo|Ù/H| }]sr͢ʃ%>Ww5BGpϝ$<5f9%{q~ٛNR[N g=>֗quON_ʉ$ zn~9MLJ;"Y4r)9}u=̼?;.6ך[2`^?}G;Ʉӕ&*O)I`ɚ?;ޓt^At Sn-r5sr+PpFl/#WreG诜ϱO5/#S\x C^|) c$_JZLOX9C8om⽲sdz5gN]נdja~h&'R  ዕ{_B+v,<&AOdtI!M[-:̿WF>OFw>>]CwR-qO{.˺|$ rlFg`m9n\>y0yjyևGx)ǟo׵^rSN`h)3AߑïZgJN8]>3܇e:K7-gL[LDBφ M0^1cZSC9<}^b$rLOe-*w /%IKgisnx}c3"IΝ߮,C_CA3o+ńK(gȑoxr݃B%y&~mxuHs.7m9m77aW +"lڇ~Id-?MHΓ+V׵|y|#'_4\Q3,}nMVS?]yoZ R֣[ёKTR:r혏enzy^(绝g$ OU5_6KO(:L˃%_9=@> } j>WEGXߒ'Z?s|*ti| 5zbp-zM%O^J{,գs3zd[z{?u\%d~/B&4 oVh0b]NVa~H:\Fg_>GP} q~,pS#'FӜ6Ǘry$paw8I/\;{.}6jyӇrigП%J[<9^}4=cw$6?gُbiH=}9f$d{-7{x |IS`=#8%7QŽ,e8"DT;5R/ztbCuܦ>+3=AL0njsxyR#6?wݍ'/u~<^~t{xCOgy7Eu_g>'y|j=IO?Ve婰/A&Fk_G78FE&jx,ˑ4xne3VЫCwFR77o}9}Zna0yb4י㼢QrQcWceY k+y=Z%|2Ld;:Qi =cjS p.x,ˉDМxUK5'f~(:|vɗ`n~ܠ| >3q]vӵ?8ΖJj]~ɏ~|so~sG#9yzm01npֲ{:s):f"x(oh?Wu!?==b.|RpA{osNBu~r‹4؏$r_祇_~rl!o< 3X5?gLaϑ:w }|?uF/-4+$xd#C4DRO`Q!=Ȑ@M5= x0Fw!tyz=/?xseG[ |We5a>GÌ\~>{Bv=3>t')U\hLGz [n)_$M}~`ګyQn)6'k{t87x^ di;o=蓭O5I?_ zp/ } rΝI$_+|?+?OI <}{~ק!j9R@h}#Dj xZփ-sFeN&`~ +MMZ/gw'2FnCiYnXa+RüT&&ntr׉5|>(yt#s>sl:}n y̕ M_a7L&WsھA;uy+$ R>$r1Mgd1|zG"ܗ\MB9#EB"kb[1Et^ gYw")tr)>Ae/>a 2ߟGONUas0W[{O4H_zS5Wl 9| ~f o$|~t݋>B{]>{l3Wz]?2!m7} ic>gG}BO0箾?..y"$OQb5/mN%J/unv1]/m۾O?ُ-U˿|վz$]}Fs}Ћ%O%qx֣cC3 yk4|}܃)At*W4|ikCY{/wJ{Ϭhj;0Tj?~DbIGCWfMVϟ>Cȿ~-y.dVO-p.eS>䅋s:zY_~Li{d+>4cyA^_ؑZ^k;_$~ol0?GM_-'J+xj^rg5:$߳޸nu!z7Fz`!m[^ S/)@]=89ˍ<>|bO9ݞo{^K'޻:n#Gˆ"'`<v ?XV7Ga ./;YBs:DN_o{wO mYL'i|pN.㻴~KC*s|:6} .d/)-ы3~^縷-/|0>왖`=[[M'|B7Dy:Niέ:Blݳµ' IYS|7OzF Ey.E48~8wk̺<25e ^ vux%y6:%{ YZB!{~79Mp*`yVXO8yq2Omں/qWS)7G}Fy+ǻ/0gG=ϼ#'G7 tF9x|`O<})yp٘ķZGy1 1z>?R'mG\p 'Z\#u3[:=9 ^z'C4(Q'}q/o7T+͵1?8Qcu.^kkG?ac-E]ܾ&ޏ Q#/I^n$5rn_lCm#)sױ\:Itf#[Uu{1o39ө/$'V'm+cqײ}"ڷϨ +1 1>;nwz򞴲p)t/IZwMߔzM.eNsyD: _|X~s7f.A7%gfjCG_{6߶lY>w}Gf&} ?NgDBI)qna zrk5s!Ƌ|wo_d媯 y~APAֿx1 y:zyawU}*?}=>_|]DQ<y\Is ;yB?#Se3E>9J"z;^2 ]=Wv óqjpzmW?7->HW=ϽRQyM]'H{REz΢ϊ #O#-㖿m7yrc,ga" lyг-聞g%N{ױ^kw%NS2sj8*sm^ۇ/6a FH I`{:<ϛ1k|L1nct>޻㛔hy=c}yx|zïܽNG*Et+«XzgkG38Q_< '7!p#w-^sc?eɣDHs$G>>X0ج;7GWz g'G{6ŜQ ;_`|ïb8ÿпxș)p;5R o^`eۇt±l~G=5nT,r9?.oȃi J e>Ht-㜫~8X/fNt\}FS o^0:8"D+9)sxqjq_R2mzGf3Lųb~znLd W=n5VG$oY¯N& wc]rvM5/QGfk{7kFq/WCQ`1~Lކ\fr+ЁJ= Mߗ^+aCJ(|2)CSN9Hd铴 i_<մ:&׬\;dV{_C#EMn"e%͇6@N,MH^vOJy}ط2U^+gھ;9ޟ a]^{ɹw'fH {9d=1O s~3ѭg|VpOR`N,HyOiwgًl#*oMZr'E{f9~Fe#LI{~v GM w$y^t`:5JK'UbȒsM$~g'듴~ |j8i'>xz4_%?+yޅuɑE^'ާK 2M_gHr s&@_?^{_F 7rܹ{6Uu~#z>:E#qr,u/~` !qxr-O<1{G-/|c|@EgZt޽OmM~+N2=n~ $ػ̃U82'<>=U$($>Ji磙7` ^ϒ'?藞;[^^駪I>tfz+% 4{d7irr?_ˮ?O0yp933^@3OA|Co&r3{n酏kɒqE͵)񢿶^iyZ%Bo9=bZ ~ :!՟z߾2W޹lWI:߸ZVs?%ᵀg4/_U8) -ZDyN{z#Tަfu[u{ Q*)]hk7_%Wlc^[ʗ)peoߧ]y}<(ԔVks -ar", b/;DN+tuNC1>}%{uPz_zu ]l_?*0k>_H38^%18G1}(k92ʐ uDG~4 sAϔ>  zfA7X:tR/|󶌯v\{l|ɡk˺3=Sj74[6v-_+GէR̛Ip/<>vc:=D ~<ƒ#Z|Pq'U_ϹيBTZC$ξ`=q~|u3t{OwWT{xo}}'{;VmdAgUۼ|7 92ocW'_^wLÓmߴ~E7Qsi-iS=pb/BE>Z^tqe":2?qȸg v|{'H#3x;^]ۃپbϥEGK݇> ?T zghڅ_JwUyzH7=:Wt2<. t^t1miEg孇oXcd󃶓@jy@GKWc<ϻEgG %'|GG>?~|}gϭu7~{c$0֟v~@X9&>ַCnOZ$ |s{ؓj n x2cG*;'n1K~2UIp(>z;I,}> v~rB=Co(Ju=kjN0Q~_|}>OTw3[v4y{L^j5w3ٟO K2AMTۚvy eLf8 xdjrG0x(E./9t(oX d * 'X []I=e20[<_.i^ӵW\V\ 8A)_k/]U}equ:96aS{'ҷNsB')rz tyu':01Y>ɏ2_O^?Xy!GY^'_\1M;Nn== ^}bwmc/Ay+Y+|N蠆EV?j} 9Gx+xxԃ7K.p#/b !XsQ6%s >j,Lyl2 ĤaDHwtN(){} hu-mCd sooώ>G&[|W>]N'Fә7h5v]Rb/^LsggEJO(ÜDM/ XW9プmX,/sL<9/Dx΁Q򮚘{]Bs8x$Fn6e̝oZRBGBNxVz8Ws}X5,rxǑC7(!tvYf3u_KuaWrR'O}̣OJidﷻJ-[ZOaLGunr{g=i[ bth=t` |MMޛA̟sjyvwVj*Uu%%ݖz/$=ݏĜ>E'&,y)~|ѹT*}Ys%B|͑5 'w<=apu$zcyv2|Ⱦw+jZ7dz:x,yWiROz]yj| YU<Aa>&ЕKC?7s$[l!z{-}%r&ɿ5p3zwuK`lJߠ{5뮼zWNZu-[uǍ\$/ Iӻ+=%EM@e~Gdy.>Pe{IM}iGg?}7w]^âY6YA'x,^rH;䖇t3oϣ0: -/?9呟RGG{=RwKgAًu|ky{]b Uy߇w^{ͧ_ t&|~smsz?tw8h>i+J~m#N7S65\ %'-|rKLHoq% # !ѭwc_Gi`8r tX;`s^!I9xxk!1\sy)'#z_I=51 &]}GF|e4ZɣHȱ_py{,Rpo>K /{hRt' rz0IOo%g|奒y~.D[ uX]:?y30v%c9 "yqGOλsFS'x}ceX<Ԧy.Atܣ׶~$~tgkR E7)V`[t93U~ #M+^v#!Oi9{7zcT:Gx~\SW^''C߁K/cß4}aY;ɇBh~NRџY>s,Ojdw=2E̓23wY>}|d g&n<ͼ{d<>^t ~ivWs_A|iq޿P䫿>kIYaz#-cw{Yu}m]3,S{|nM8$m|ڀ?'[V/i|O Dڣ5w}d!~:6:S9t}EBhLkVdW%=$9h\7q߫--K)9!f5D/YZ5c t0~2}t 9nK7玗ZC#scvp;녌;@^۹?^vy v<Ê 7o.eU?RE:|e9ܓ QYzx*w'.ū1}\N\c-GnO;y>H笯pnj~k g[ܷGp}q:CS/8ݧc}ϩlԇ? ת}!=ވ8~iIO0lQFY_}}9[a=6po;½sG}͏=7A.zIɑa? '& #{w({|5\3*ח\75'W+?PL04^u|6Ӌ9Oϧ[_N q7_}>z4^_pu?<~/u_cqt8?~X^''LGNt-< Y]5}2߯FjN !1dhUmO9 vϗn濿j0w=f|";ydzH j6XkgK9_0a|c9:>U[ʂ3᧵-9Tɕ3S;_p \ kg'8ά"zSu=:Fprᵄ=^Y}䫚Ok$OHwg]޷Nje8}ZIsf4Vɐo3 ?K~U'O/2'=wͯ,ΫHH.̓C< \3G}|ɢpR;V/ PrXdzyU}|f \j rNGN?>|w|+=OQr΂ɭ";_힄 ̇~r.ß[?r?|O>^b1xMӲ!z6?~YeߠB} ŗ^o9I}7>Uie>gq0ޛ$͟o\`(Ss=|ts{[ñm0$׷AB4BoX~N g=s{yW6~N$?'b~.ϼӫar?͇;F^{o*Ic|DTj4ݓը=(0mc.1y MFq9OFIWї̃;-9*'ܜsy\ Wܳo+V8Vl u:˽e>Y:Q)GY1|Ç< `^\K/I2˹Ƿ^\mn]# n}&g\{i,w+|FWd2}"ia}U~!Ϯ y}e͞\{bKC~U2=OjßMgF:/eGUds}a;puV;L :|fg'@'ޚAW@ay~ȿ~pe |ZzKVZ-|Z/|^Њ_g*{eZovzL:}TY|C贛ә^]fiAߝŵws.0ǭghoZoncz~oRol)8n `5z~U=Uo|yoNj:$4y0p[ougR}wQѿk{>tx̐#rჭP;{A;;,{71}*;e/G!pp獋Z|2?y_-}}62 ϲ޻5|a1 顣Ol?NKϋwib)Ywix0GFkd7?=+oI^RhNdsp/=x^޶k{>* ^ھė=9|-j;>y['f{WF`]Ԣ?z{Sr x_,CU\C3>,L/Z~|n^nrǭ9l%=x0'ohxZɡRӗ^(=,!70>??C `):{ݜ9,W2`|<o)X/oϳy;_5Z.d=|dW7AW|j'o k|g6h}|쯯b0x~Gn}o/"4|3^t9Uo_B'NpoF-^gW# m܃k}ir_|O1c3sW)7Iwe˸[G~vsA] Ͽ\xfdN}n{=mX%I%{zar|g3Q9g| ?x Ep.Irӆy6K>pW(md2 gMyѹZNEAϒ=W\!t\==t-x|*?i&V[WbnZ_e}:G\(qpW|;sI :Qx/Yp @ė=50 (3wFJ}18fN=9=OϘ"'- d ,[/r^'O|vN<3_|{ͻKtxlZ7-b΃"E;>:7˼0ṗkxw2tAr2Eü嫠/Sr GɅ7nݟz?Y]4  e_Psʐo һ!Ǿ'VUyv9TӵN\L³Ys_ɷ 3YQo_}.s9s>7hݳk㷯8]:]^Nn[P*DD-6K 7ӕ@MdRpFT'E:n3F-q7/~|JbUFn#zq%rڏ<9Zw2f=$_ʮ̯Z^^xxZ!{Zv ǯ[Cy ]dQ_K'wiZ< r|n\/[_P~?|W;=Oދa7D( J¿+=1|  řx"zd/y?}g}>Anc>5w?=Sd =at1w -;c/_#-ֿSW_aAyE׸ɱIԽڅEGȍ-gi2 <ʠhb)^8*cJ9ݯӜW xs/J;_((B}}0=)z^-eJ|ժ>$S p.w8rMCWު_..ŧc|,DnWGs-܋ϖ^}ܾHX1ln|` tc)}C r}|[WH 􎿾F3V?[x=un$|^2}xț4sC+8sTaSZf :| l>F)xG>-'2wQ}u~i|AC@+Jo]ooc؞#³[&iK5{ҳ5 D˝ #=??kz?;˞fɇѾO_-2<7^ؽ > и'!Oz m >5nWI/G)t"yUyh_捉S%HQ|&?$WsK|zX-z+ߗDɕCaM{48[/^疎.s7f祁aXg^77H9V=<U{/NQi䜰~atCZ}ny X_% ;gAb< 7^[a/tc͖7IjK%[ Ad2: zDԇΎ=\OEZ `nowTbu+91c:roߪjp5Ë/,i˵w>4w Z;7{ӝG'?j=s~.W>=@_d}:orRG[bSI%S5Jrb79^TՃB̿B||Y x @׼ }Uz~zyߓ6j؋B5/ &}Yi}.Pȫ&Q<=ytKTǴ}}wk)}:Qxu>6j7魓zQȁ?Ј$xSܣMdA7i;쩖#|I7z72%5e|x'yFjOmlz7xܷ??[?,߸gMZzgOяzv{(~|SmAX |n:{&̯,.GObal> )˲%~;-g-рn 2B>u{>1vA5[rrB=A !̐#){4TV-'AGVЩZt+PH3`rak}\oӯJM;19˷KiEf9^z=kiJMY_|/gC\o?>Y|1tTs_<=_ྡྷgKpNon81x?J4Xl͓+!(|q"Ϯ^'¼V&0k&j6')gL7G+7%'/8:x~[K9Lk{i\G̀/Zf%/ZΊ\Yվ9|Ϛb^p?ࣜ2}N>:=EnrJn>K3DߠVt9_ȍY tt:J_&9~\z&x 9uIa={Wr?tMS\q >pQ+at}Ҝ@Ҿ8~ֿ|f?G9#S[Qw/HȪ?^^"ޘ<KJnO[GQBy+ ]5m [n=4 Ss)m9JqDW /Uf+:aȹh=zAͅг̒?$O_X~r ЕO~n,V8rއ# }̧-k;_{L1O?Ix,{62~9=OG3߿b4YƗ0t8Wbu#SsU/<*=rZF?<^}XMesY}'}.dcG9vr6GUI#Yʜ65 ɛa;+P+f^_a:Mf_w璇E8-=oZKF+bOjǽ{ ?ECxN'9_q7׬͔2W~s(%rt߰xVMܿ{[@{{ ]nr^`/&E;? 9Q2myn{xI ⃉[j.az\9= 3=|"߈VF;-0+yZ.W<:);?ٚna_q;<3OtȃGgbDzOؼ:D>)<潲,zt&: ϗ,@e7qU{­4`aM3[(9%CIѳT$9oM1އ?o ɽGOȡ>Y"Ϟj/0I'ЏPŵ/si1]D#G1J)}4:s_3>k5y浇)2LgDO=zIQWϴ$:KOm*9:_W(,zLwSп-̯tE<|6xO.h >9|ca0,sb*S\$ϱdC;O0bz:t,mp1؃ I4U5ErgG]g N"1t[@kӜwc<҂xq=ӫC}G0'xf&K~֛yiğ'r2AYptۗ{蛢oy(؞^0iݜYzcl }C7>Fר}owb>ݟj:|Kq~lt~MbXx}5mǟcJb:MߴG~X><>Z)pH>&qyqE8r崄Nk5|GN)rZ_嚭r͹zyI{{;WBʧ|3Of/g }.fޛ3%z"OYo{/9O: AfEyz<~,>2k3'+|YYMSG\)Xߞ>%Zz|c3= ŝnWߗzoyj3 Ms&tg>ߣ U,zhy9cdiާ>>jX_“!#GUf?=a_Ö/M.?S{$y{Z6t) DZWZOj{G.J4G䯗CynCb}?=ßsb~~nG^6G>1>uRiVr'(Er7PSCK Su,φUx;yW/a~(4tӥϙb?M/{eZߣG<[ȫ%^?k?*7!"6z ҙ3~ދ ,qx{skG]p?W^'# &'2e5h?zzrq'R^a[ E|I:tj97(8+[ǸƸ&=gjzP K}i+tEɉ@_~Q ǘ\W-c'"{6kJ3ѻ+ tIzv^ S9R{"o܊8k=l](= i9g59J'Kz.l}̏_ۏc=K{5^̹Wɸ}]ѿZon$[.ǡy0?_=^E'?|s< ~ iw^"UF zi0^zEu9p)LsoXvrJ:Z_ 0w@'!|'N@$729ܷ\pzG)]دɱ>o=rg>t]͢Jˍg# ߻~4lg8ܲʿOI| h{/M@߷;8Gg0` 7I9p$(~qʅEpNJ0D$]Zu.[ַn@ϲsGׅG;ٯ/M+Il\|+יn=Q6׃QV_*Jz 0N4Ok5I?y^tiu7_8o?H~$K/ù-5sW`n|'cǖkaxz==JF^Y9#Ϧ%ϼދ_r/W@'O_vmGAk,A$z3#?Z%t5GQ룷v_gTytCX'}@߰d។0y;b>BˍzG)'[L?'"?/~.նkB^5?{~M|:Ĝ Lc~cyxi3njws]#;?>4A+}'CcE-YCkQ{(1>c"/\E~(^.B#8 3s Ymg8w}0Or#72?~9lN‹ZϘ彅_O1gF9#D-=ιy~Сp/xƜB7c?sc~3/|jߵ؛(xH>cW>53XL P3gS85oW#S̥}X$7G3?'oDuZ9FN$4|,\??/~7l,|&~|^uGSF{\rusmkui^'n ?Gщ-+0]|p_ɽk ]-|sGw0~p o}?)>1Et|1+#5>>d>^IKWOd=h!|2ǐ*3w`n'Q3} {${yx_%~|3Vɜg?2nÏ4|^wR)^D_^ϝD@k\#|;}J3]G_̓ߐ)x(?9+8OѨ.jJp:F\t60y Js ߼p_̳ݗ/:Ǫ+HO^u"LG<7jgwRĿA+Iby?V{{KYFSnYt}e|]tDp֒B>̲_3SZMT}uIN9/5>8I2/5NݔӇٞ*skOvof?{ROWs&#n|gnҏI9O2]T/xN_hWoˎGlɣ_8dN8vyZ>׾e~F?$go9>stc37)aXAeL#b*xG9h3[Τ }=wL7O`C?f/:]៰8:y0i~,I'y+惻Y _{eï>t03"svC{/$ ϷU |g S2K/j>suȟ/= ~t+kI=:qr'xIgb@A5߳pJ |O[ MGgj2;hY: {%u1q}Z`K脻ිR  z;tO\b?Όs>&+.U$2Go$䔵37}Wژs2,!m =h9vzq|er,< ܃#nNSȵidoԣwLG2/CS2F/0m-w٫$ϼw?܋FP f^WFG'lo,/<=3{̯zp*%q{3guEvWO?i>艞|a93oY\ EJÓ4xn9ry@}{Wo9 ~S :>QXjoʿOC.b+5^"~sTisrw"%rer&+ q%g|1ߕ)b_ 0wdkvKe靝m3.s'a'_-YpE;_7TkJ<=dNy0~c̙ :@7{.qtS + iÏr}0y/ձ!|^5zt9ٛN_g6z#:6n9Kd_1:e'ѹ [gqz譪V$[ONaɃOZ,[>+rJdK|)ra-/by3POהŚ?~YCu<<^=L^v#rke`ۯM nl48%?SJH)% 5=7kϱ{xh?zwY)A^zC}_7cT>N Zӓ'Ч{)sgf~L]Q&),vZeΝT8ү&D6p2?OãéZ>}πk&wwKNW.^G/N&F6 BgijqjI9;cW>#yѯ?}*_<> tzxti֏Z ,!7'H|~z7m.֖g|T} rݷGljҋ0fz4ͷ|A/9g|ݛL{_s{:~WO]W?/1z*rɢ?r;= ?hynsomc07 ;< {} c5`Yy=SsFp{ˠ&)po=$c|ۓ&E9{EZЍXy32}Dz.TJ=:np;pYnWZQK=D?gyHK@H a-(jQ>;,6']FЕWiy>7HS͏=Bc u|?('?Y ~}L }u9w?gxPߜ:~%CJMEC"n9Os׬6x+11+[&2;Κ/׷o7W^1t1;9{oR\!|L{W~|C[;Х{n&O@9u՗&ϠdR"O} ۜ{9bᘌ+aN4{?Ug Pgj}g$s6 k:IQߣ/=\Oõ#O_?p=2Ne${Jr 5n}Ư&A- ?LϏ75?|;_v[9YOd@1罗[^=+ܳ3̏c^.??ϛ`~DwOgo,/_~S>r%͹Թr"sr88سdy7nxp169qoiy1g]gHg\ si}Vlny9!&tM}WYz.wS5|y/:bphVq>'WgX y2~0bs|zz>sT= ǰ_mC7f:-ˎGoz$ߦJï˟ql\[*Ir?|[{/,i溛}7 w$/DY׎2ZG܅/0}=u7~?ؓW;<}׫~vcg +#zrcs2ێ?5z&͗wjם{_Vz{P #S$NN0ɽ3_J"zHX@|뱵GgJϽLn. <>jYRd^ }/0w%m>Q/w?P̵1MZdd^T:Nӳɇ!KӮH_^ ݱ MT̥#x/Y0nty\vDKezr\*j:90[ x!51Ԃx9r=-owmo{Xnܭ3o[yZmC7Us7r|rNşc m9_e::t==AzQ~*pGy+]ÌF/̏c 0X>/wwO9穣豔FWУՁc=t? 4_Ku7y<'ks.)эK]sOZTW.^^N~tEUz3%pD_/i^-]|C-v `sRYKDSI' mDD/ % C?oĽT_(E_@P,:^tD2{Ἥ/f!QgR֫g|ս̃c7_AY$Nn“衼X_T XwxKzt'R9{y79Y|yt{wM>У6t@'}\8yx>wz[ѷR`Icb0]a 2"R˟tRFtyYH =p_#{-w[_-7=vbN˳WP0[{CJ%һ"wr ̱e*O¯73kx.qzr䝙.f;s_Dk*)_gRtR(+$4Vl>rmCܧk(onGn9M7L3;t^at[(˗=E9擛dϴ^ob:t&vC2?d78I7sh Gqz;#g(BiE ONn,0y,1=sJxOw1yK^uyQ{ޭ'm` ܳTap1.o= ~|Go8\qThQncS棲>81tMq9ȏ _z$7b |u?:^g=\b~ ˷0Wq_mb?sӵ>Z^~{j9~#0C=n-"Şܚ/NW-IѧeЃcژ;R[ٷ޸qgSG_wA8% A>34πj~X˞9އuOkjkXC^ ^G^raރ2ۿ{㩁ϤpF/6Fb\1;x;WvOsCW1|7#F.a3GZ3gpsz#_G&[y9 a5CNfs|Π9uzsK(q.݊ιqr}& 1O鷬k9%W|ntr,O8 2?ptɉ9ko).@Np\{yŞGfsay_i9}mHIw_yN§@ocZN T+}/S`T4!:}E/;/fuQG F}YOr9/ns: w9 CsS(VͿ3<ޠa>{so=JE+ay@jGc1pӑȰá=h9#O,5aInr >7aayr7܏tkr>x,/wUEU)xmsusmGϑA ٫-r8c=:qwYtfqwy3U}+{`z1z qxڞ㾎s"FW7Jn&ɹ`\Bl!ẇ^zR/'1ѫkir]iMngG^=kMsn>?{ Cl'%w@_$_& hW9W^c s/'msBjy:׼)zJܧ|.2x񗿺w-3XC}uyr6ǵ|y e,8­EΩQf9o: ♂FE%_K | ܯ#|~=);E##7q7n9Ouy)rφ6 jo)Xfg6<q?W>޷$:~j rb3KjO?cYO9rn>Yu ǵX s9vx%=Mw >wX ?O_O7`$G >/z~=Wwf/a9"=X+fMM{w$c/~ߏ7d<9U>x4s#롃KxCe*|~~9x~xjru}_ļb\ᣟ"΍"$w[?cM{G^!\+9j354z:j^&Θ|xvta%qΫg&K⻉/L$y.ʿ9=?R͵Ɵ=_FL>ϯ'~Sء[WGnPs -;g~I9r|*6)~-L}["Qε,C]8+ǷsCQXUB8=_ϐA^ysJ<6׫-Y| >G=u;ιY]GHcc?~ztnm' ]6;]ɍ6? sԃ[~jS[~6rƭP?ot܅~msƣgZH7p?}9z{o#- ( brV@"6DDAz]Kg{_6n-g{2d2usy<}^z#WR!?[rQ&KYO%~_ӣkR뻵\ztIyYx06/p.07+_Ћu[]ϖDLüO\{?wU+8oHI~s^?yot:1hwzx˂Z@$ 3svN1]na[N]G[W%oAv][فtEW r3^|O|Iryg [86p9/~xZ#^_?VߖY<`6ߍn$ b(9,Yp{6~yxk[3ϟokx97wjO5="72LNyW]-Ϸ| ~{ݬەEWamF뇑}niy]_xN5מ{rAc]G9zYCy+uMOOlSS:O!VYNbxz~yZɉQ˵b.7ys;s::W K#iǸ |9|WW&_|K2 aס +^~DO݉_!'@{94P.>h~u쏳?Z Nhp:tG$x}>j y2i/X,BΞ+0Oukw=/jޯيnu#.<M:R ɒC7Ⱥ>4)1Y'7NWwG dxA'c&Ha4>;u/?S0HG|8Y+$usKL>Qz|fme/aw3L$xG"_oKi~R}yeyEL2)z] ZSDֺ=Yo~d ޚjH ݺ2YN|m~p0nIUo|t1-bA[y/})|o[:@YH<3Ne{tJ|#e~bbne帹G<3dzy;yz2<*0"yӉ#\"S7v3QGpUG=_&O3;V}H9b0/E`ΦgWyyu QlfZ1u|r: p~o>apd=yWȗ#rV<%Fneyice-gi^߼/Ç-]gqoXt^!gyS7m7X<l'=INeog?"pYKCVJsf2ߤF/%^BN@nc XjΠ׬^=Wz8]9m|j=~R+VkYs't>'4nde}oi9Q)|u=ϥJփgO^9G`}lH߰{^Vy=n2Dż~x*<vfRa_|XH;=Ip_б]`cG˜Mϳe{?Vs%ؗ9|:p6= a#8o,,Ab(1[\-ξj+A5|4f޲{gI?A$˹bESKrozq,O>:kyPvۇm^ 7Ld{|(=~g~f kG"!t:̡w sKyZyϐeMtrv9t:ЋN0F'8_z4LK ]@|~i7w;9{/gn`]L?h3x>H7$N 'Lc=#cLU6 WXf.QK8P֐ayr%LUzKF/-7K=7x;pay㲽??)i kkt2n2Z>ѱ5w Sz^sق^\=Nѳ#^-!ݜXͧbΐzZ\kGZmB7,synFG1=ƛr?onD/[ř|}|Yɬm Ƈ@ΐ<x0{_ O$E.i9ltsߍS/OW~X?C&O=l衋$|ϟ;~41y _mAȳ[·3^=9QmˁN)؇ჭLqހ _F?3ZU\|˥$ߨ3d6t[a]YqT{mr-,W28ts6zGθꉗIùɑ,1lOOyFs/ \h}If.l'^ ? ZcO1h܎$Y/5?3$=E;xNw7s^ފޕu1`.?pzf>ˍGE^SCO>[ޗܰgg4ks WGW*8GPH/—WqCer~W符of?7ιjp9T=+$~H ˑ#Jߨ^?hM_} hLfO0L/\.Oqy[Z/wlopҤ@-)px@khH90:r@WsW3z4|Ths?];փ'5> zW뻒6t)$5ۏ7{I,\.cz9%.2h~{O]ar韰t}"D^]trI/xQ|wx؏O-ys SN29E_Ǻ{}ӮVF}$Mo->1Zi޶rm$:=}oǚ>&~fzaOF`9RB_2GΑ ipz],ȒGoo7zW3TI \n~-}:֗jyC; %`}̕ocߢN!4p%}>~j-˧ꃏ)\8\NjK{;ܬ_W =z̢g.0s<,:5=)R)1t .0~'e\Z#Jr]ޙ0?|t;xn|-Wmn=9{iO59DG^]ŏ7Yݬ ۔#z{9lc,o9 Y5=N>FGVw]7_Ox'U 8}]gG"#k=# #~{^y-ϻEY?4=C_K~XޖyYO\þzЛ⟛0ިHp|d+"eo^an 3̀'m/Gކ,18؃V}+[ˉ>|Tɇ?Múo,?K؋%I>Wu5}זzs+ybZ?+ ,XՏ67[?I4^5ǜAZUa}ҥ=87͟htz5g=n)&s ?<.t~[O4D+aH?Oܧ.͈yCɱw$~zmQ!k&QiKƈZoM/fh~gmHNyls1z!IGWa~ ;ؓ=k5oį8Kϝ~zс4qr-sM3ESO=Ͻj!tǦ3!W<#co e~A%Usjߖ9V C۝W2Gn jsi>6p(z8}GSk{eF`nNDyU2d|_~+Vsu3z |.?^I0tE["ǰz%^g9Kaz-9aj.|e[[dn%F'mOKeO: oI3&Ʌ|>p X^(iU_5"F@ <?`pa:\?~]s1䳛oL]ݎzr.@_y|aIrm0u&)@ i|}%,^|inޔ:CfYƞ ΩQdzX߱{m%(u;9C5m-z}N|.!tTaJ̗KQ3ӖnAџY]y1|XǘjMxzz{r/487T{~MWF^8~WW) ǰ2aC_{Ҋ\_Jx,@MuȌo O~„9?:&Y4~ /:0+uUXos?_]̣3lK'GIb#ѢcᏖ=]ދ/w'.r F?o|K[z+M'f0Dž́Ws^)t)rӆȳI/nI;S5B&b'5k/y;rUV^9g[3|?Ij Æ;މ&$c_Tӹnpfe/mj~oۃ$a9qpgѡk￈8o0/w%(^0P Nj96{s(yFF`Rx.2=tvu@|O|OIO%RUj7y^K̻e DFX^ vo~g~ϝ>Iisg ׼LsNq_tQ<Lg+iUv5HGxs*k r4]\n饭'}4\EZucl4^Yֻ\OGѿ6w\;9v/r#!O5DY=7zRxyn#2XB)t0M 2XOK~s\i}_YF+rt@6ׂ<_rl|IərRv0/D|yp5_\Ze|IzE%{Cj>Tc1=s3V{>94{N_֞ ^GE4z*aί9xN=IM—g:R}N-_+ vxB5 I}{?q7ȑc^~<0z:atKGc^Wf(9ye%f`׺ٸ8qpI4ʼ1gI){ o?˳蕊Y T~yCCS9|>HW?\`<R46飒A|~prn|A7`nrA#(IP%;9ot].pb|F:A@s/z=^'i|P^p|t;q gc2\j=rrn-w.~:$>_ sn0zt_>O7m:3o?srD.ynZiݛ8~ԳZ흸;{[QynOHh{o|ڗ/x/;3)ϫsT GqM.ArK}[0>2w;o2.|2bBw>hǶDܾT ik5|KN5~2͸{:m=[ʮZ#k|z~7Ojε'>_}Hc"|?6?,%o]0>浝A_G- 9gAp~p1p0k9[Fy|֦Eufznxא>O@7?sw-)Gă6L`oR)x%TMYm%x'bo+|O퓥Z͍K뺮L5'w,eqMz5D u|L U DMU,x'5悇K~A?f_{j=A<:"yI 3h:)˳!GJ/-|lm~Md:ʞYtIxט[OzA;*YXAoHםG|5a0omۙkfaKqx")k}Bij:Z~ݵ2vX zn~Ļ<2~I_lsC5ow=cC,kiz7o[Y9 ɕG$ LdO/26z0!ǒe)H_ wigT ߬ϝ\_M$Μ^:TRs:鋏|igLoR3=8{ߐN_܇֪N,\{~-8TO~yGk˻o֞G>?X[ͷl}5~I 8}o^#I]d}k?ʃ߮c}H/F*1=k]ߌfV1O%3:~ֺxVz [zVtԍA㹏rk)9IF.d/-gxEMgl_!/^$%w|Y2F7.䵅 o+l)O#QաO7o;Yލ69 O^ &;+6]o\~9)l|^-rȷoQ^Lؿ-6G9}`kk/jxWӭ3>~I߿/=Dmz&'v麪ׇu7n30yUw?b}0980蹗OW \BxC৖1rs<ρsПϢK%@''C}t蟅S 2FΜ/o~b߳A^񆖛%|v[]OYr`PNy|:)У68[k̓qũ2-VW,W- AFx?]ffLjutQ뚹ПhHsZӿϮM~Q[:r /DYzߤ,@^m%|L?8:\fœt =CWP/zz%@~%1>U Y$˜Aln>ord%s9w+YwOAzJS9z$ǟ"74ÞF>]'UI\,fxjnFt^nt~']7&sy墢h4D< EhGc#o/ӄI=J/xI? s}RH׽}ct ^l:i뗤?N֡)5|~1am$eriy?lkpeΣsTt=GgMgBo6+˒~)s}D8_|w_G]:rdrnNs 3X~ ejIWIGpMG{aYdϾ|D>>Zrc^${>|CO ?Z S)wt}gL4Ň1I^G\!/Ga _mfkW>Ωs_\I[>Lǭ|yw<=|!sу_~ I g/ɵQKn~OcwE kMsy>sIŊK^?ZK;?'!ivoG9!>seoOI5ޤJ_-Wt٪(y|'}L?W {H^|uG\W[H+ B7[D8epXr4%%֧D}xX]wwY?- ܇Op*#~rss1|k4upyٵZ|$-.j6>ݵgnGg8dȝJߞ4ߚ4>1~ 1LHN0gቒ䭒XڿPNp:9eObEH?Ji\-t5|ڋ/rgY~#f֏b9",gx9Glz'8OmdދjN^rUz#giH)ߚ?FK6i_{sZNv2>M-"h-^ 0h\rBqUoc%|| 'w3J>xQSrd`Ec yb]DNVN[{g^?/*dsw9B>^R=0:<34bMJBIzGթS>K=e&|1+=s\%-H|./rS0hX}7>j, Z+ݗSe>1Ĝyras+Wy4 s݋'7yԀ65l' pN?(@ks ۍ snSp$ӥXp}囓irύbǩϓ3仫 5|5El_>3Fr$e]N'o~wdrF9]2?b>t#$zPgiSsw9_ 7ct}WoJҶnܲ=ݻK۞_2߾.+>~/1F1y^Oc#4|L˛$nSk8-'nK7SyFa?MMWHΗA}5Z?H [ޔQ7ᳰܩM>%ܙZC~Üw>t$hy^IVt#)xzV/qu~gY-}LCE)۷^!/K:}9^0c{Y՞H F|}y}ie@i.| 0?n2hV7!gm3{9g">?etosbuGܙ #N"^}􌻘Y6ɟS7I+P~x5h?eEE~p!_YcC9WH%8<=rjBӛo.x#Mׄ/kU?2_Љ4`|Xsaz7D/=>!R{ɕ KG~ fmx'Ts G 9"{S[xRW[Ge;~I )GL0?ugxb?A4OK왖9|ZC(i=&x?m$S 7{eqLs.ZOqHæc/ߎq>!p *MY:,{M ?zާWfCz{x5۵RU7A#9x.E74{E73!=kI}^v?#s[-cO?~)rxErI[{˴9Ŝf/-Q1r{ yq>~3ˠ]i9joϟV紞榾m}3ϽSVIޡ4:ԭ/W߃(JN#k} Y= v/#d|jsj=oD?3ub9mu} IC_>[/>i)ce-ך7D1I?b-@j;{ %Ij=uWa2ީc\ߗ9 47=7?}#6bV՗i԰G75\˃͒8N~}ww":/m =7>o s>$ sty'co;tv[y+׳>I,v=| _\b ?%w|F]~x3νȳL/7J/u ~4>ؾPK&'9+J,L~j~8y-'mIGG|sn?'嵎%UT>d"ǹ{LCo7,w݆37d_#=|NI/{ku ֓r]i;Bl]g௧L{/_%`Izt~98íɹ >!H̍n[?z"t5^^YAtGD+!wYl1vCـu1ɻGYZ9̞CIrF -K$a?$G\+XA@wjy@ZϜ6k+JꎫX`% Y9skx赔NuaFGtH2ΰ0yqÂJߟ iwzaɑ-k=:൨r.ϳ^9Y{'=`^O}Y Ih[KWLO;_.gNw ыb#ai&G=/@˘㗵)};u}&K}農dk_枢gCC1u=<*p_|a(wZGC_/f|a4ˇ$O^^KnWWAd=S+(pnaDg*-K~/slo/GZ0tPynn)G9ty/Z5Ǖ$1]nrt{ʇΟ$w 3bA2INLg^poBaL?UwOKQ;g{+oICfq2&_x=h)b;׵9;qtWI+as6~ 2D>(lCNiWR\|DogsGw_]͑7\m}zOd,p4kORcR vSӛ܍ކ)iI}L/;뙥q?p֘&CɮXŠxŧM 뺩/^itO\j"~:i$g~p-kj::SYzW3wtbIKO} %߽F4!'j#y?y٨9tvɝ'q >A.Or'z+I)o%`u軡NLs{q?rͅyI"Mm9 {tċ>;5<$6يf'˜- >38bF~Q~mG:^J>3ZNf>,W7g.pZ[ A#r$?Ӟb~slP:oL?_gȳ<ʜs4Z`{D~H=z+ |ujJNE3-zN}"r-؏(Ĝo<9jnIdO?~C?&\O;c 650g:Ad_# ^G7$ \xC{_7s\>&zw< G\)3Iwq'i_ЏV6o4^v rOXL r`q&U»T <]w='>!>8~)۫WCMWsz: Zc̓ǽ9KyQЧ=U^=QxrKobHXt?l}p&_qͪ#/Cn6 2ZŽθ__N+qnv/GakW#W߫;J)X/%|f6rg7W{fK>{Q}:7XL7Fp7ϙ%+b_E׷}Ѓ-DGz <;҉犯_X/>* C#bC/ߏ*|[UC4.-=;q:YacW;tB,A}ԑ9_&? /HMizKS٣7;:WoSpNw{=QLrDbzܭ'Gގ|W3UWM?/CW90 :Dn|ß#5ݧSddNx!RCoþ+5-;L̻3n.{p+QxIAc?jwϜЩۯ>k]Ep}NBa\^$ܹzhZ>.NK GH$wN|UOZ^ޖӻ ~蚛n~8![ɩ m6e~Ɗ?WWy~Wi|ghv麣?]f$9maْJ~ 3v9l侱wθꉗ5/b> 9>WһB<{#VzPަ?[s_p᣽?ОЋwDPsWc#Qν.i{}IRn{(?K ܷ uu:*/ŘGg޺b_FO?˃f.+4N= 7ٟ? {y;xM?>ur ZD*r'cRDC襷} =gWEf֣R`.͑)i7##ogb~auӜ߭s?r,Ng'L+^t"տ'l:Ty +ny|H8 :sQ\I^ :G?`xi7>ϑѯ$Y&mrȀ8 !"Gd~n֟w: ͸g 2l g 苻`I5SGyߛ'`(:Dws)5s={`J TZɯ2P~ҋ^|dS0x(.7S ? w2=}֌__:qަO1VP1v7_=ig*[e m 1m>axWg/ha^2~-7n?Ou#x}wws_b믑v8^Α.z,#s!r,/zVFo>aq/ް}m}\K=%Ǫ;IQtfz$HOG^&~,71.3 W>X> ]3/c |?7Oown:+˹1z=;uD1wr ?yOݵƇj W~G~0$xDsE_"KHE]rXzN4~/ ~tE<\>?\+`צփ-|A_~rsb3}걼:|?%xML\w-wJ`G-~H5jb|-g-0< 2$|GY TǍjScw؃#μ4s_,{r<Ͻ |=Pׯx._Mb[J zN7趖8}|V?~\[y5|^g]zߵ^W' /˂Wn^u8zsoUVAg6e#6+z~?zo s[?:ϱ-y˸}SR+[_u|Q-G" iwy>Y"Y?R3c#Z6WYn:^Z7I2[A+kjg盎J{gƧ>DS%^xƼ&EfҍKjD>eatUWW>K?f/ipFDfC<<} Tx->Nm_}$6@'}ԲM{^C??%]Jl $x;QmyYp Y?O x`yMW4籵"߼v_sEQхKeٖVp8d l?%:a2&]%ٖIN.vu56&Mn3E#z% o{{~3?ztQy3>tC1Ie$^'kBlo؀~w; D"HE%yǁ澏{93C`{ =[̓i:2=n{tP%6Jmw |{>̧c^ezW7=.ۧi>{?Kh+ y%$=O'we\eΊ d >{VfWbM<9g0ruOrM1LD$-za'{ORr9b $Ϥ.,nF.w=%пD٧yV{.Y%^Zzv-cDXQ#y0j𕲊;?ev ?Q jT=9OJM;_NnJ}a^l޾؝kNu|1 ;Oy}m6_q׬at5/]\qHi#$eJ3o%ն(mzMVoyc5.qAc0xٳyDX/ ]]4P+<}" ^a"Wva>9#*xa~+swGγy ؉|@j=0{rдdS u{G_zٔ&tz֠-Y j9)r3R [0yMO_^f.kgI}9FR k=%' ܣC W]B0=~/6J,9< _+g9mO$z߮wbŭ1?[L{;AGxϏM_ws\UW[Giͷq/㇔ ~NB?Ŝa"!voa=+vRtˈD`p~SZAw#/}=5>rYz(y>ռ^T'pD^>rA.tH]o尩lyO+ߗ ?9{GASuo_)2$5w;Gh:{>ztP3sgڽsΟ_ů.~LJ/r;g/^O M\}V9Wm y~damgMNca$97p.FM 9q/(VzY4}tm+{d'zxF\lҷȯ|%=4O/><GfxCًN(93H>(9eϣ:y #]cGo4y)99|{=ϗ<<˼WX؄u 1}e~h~IKaps Nԏo]$" )? IrMBwT k$/p7$75z2:}z̥Ѕ%faˤ,ʿ9.ÜCjeu譙7xe8b#9QFR/[<%ȝ׌^{]&ǘ,klb4 spgz[.YsQ5m|ܯU|L%wi'9H-·V7o{)K4t(yO- jnzlZI?l}sr6OEalyQWk\Uk!ii58G)ɡ0^}}JO؇tF`j ?-'ފ<̓g)s#GVUB'-%5}०BwG?u@j%2byT}RHU^[Z n}z=߶mzSUu6Ѕz~EQqp[bgOW+%y yh{Yy5}%5 ~5\$g{O B ݢx#iwNװ(=M,qbYoi;;nŵգ_iӼ/ %wRdoEg f9]rnN9LHzNxAQdu0ݧ7o?/$W6:e0? axo߿}!#}˦gnd~Gz֯=S^("4Lk;EO͓f./db;.7>Uxb2$oH w(>w)e\t9rٜ\y;m>׻Y j"|4yXmnyUņ Oqe:0~vm#'3>$wj5?-qx\.~a7/h\5L.DN?I3Xo#sNDY$=7QA-w.uD a#] m{uֈ u/hpsGy>'q}|~-9FTs%k9e}eA^oyqz9lo %`}0O7:E6_a܁_\]no] [q2one/+d1y) S1Y|!z.{]_E}z'1' H0q=+/zr Ood=[/Iy){Gϴ},IV$ZG#+|492_%a6U{KƟ scfCE:&*e{D<Td̏[w't 7^y{_v]}:}}(5>rn~c['2{rx,yRfZkd>>4r\J%p×J!"FK|XCg8|s}cl>(;}:+r L]Vu_Ї oZx$ßg\QF {{s)^v޳}O?1zZVnh-> ~הÕ_^,W<7|m|~rc7_>32=DU_Z7#DUL23#Q/}h; G.WRu+q֭*-(B_b~Psby qOzZLHOsL?QGɀKn můHν8Sulo 7zYd9>z<y>.#@>=@գg;߷ %S(Qx-Cϯ郴^R*%k9L/3}tϖ[&%p5pMçNN_N\-e<˃[K9Cܷ1[i~rЕ}f|$ co*g;?j=(ƙl_a!9یgXˇ,d_ް<.{o k8w,s10'Jy?W1 /؇^A99_.~(?Ęce,$'z<Sm\(S }Gxy7K/H N31b)8` gM59U]?b2JtF2>-9BbDzGbbƙ W ^ NBo4ʰÑ, ,S|?HO/OC>erV=؃.x1>ߢG!@}<'i2_/_ Ng&1pq&y3be?^>xSt݇b'ῚM_Inkc%n~o?u9hs-x:e}}>~Kk=mX5O*;zbna1x}Y,/y[I˳˝} g˭.Eg-nG%1/z7:9J/xf7s9~*[۷,W׋f>rɚK%뗀cj[ӏI}%k>'|<r:ژFɫsm}Zz+xˁ&0&Jv))p]s25޻8\!?D: w yS7}𼋪Q֟[E/O7;}+n_*r6Z}ϒY#7?_@m ~?^:VXlyZm3{$jM=U9zeG_{a(~j$1i|Dy7,Y77r$>({.yN}[{72<@joЇ0}4;L3BfD/c ^ ߚFs+Y 3XN4>6 M>L>pN৫1kbŸ3ιSCBwsl뗒Zѿ{E5jַ'/rl3C~9^i| Q -~AcL^.2ng`v +2^C3uzV |7FR7Tu37*~̥SAJ42ް\0s/oxho{eSt!r_`S6vXstqw.{cNw>98ߤ>#z:4FH n=(Oz=Uh{κhPXp 1?דkJ+;F*ia$y_5Y pqs8)t3ۼ)8 دd9u\lrZ]=*?2}aeq 3B{'ɇ wo)p93[^=_?. :_{ϗ40g4!lgx}N+O 0>dz1sI eYr; {fI ,{a'IwɋFI_Që9[M *>=Rͮ#U褴HIȾO3q E}iC{ ^Lؾ`xuse'Q,CwMChSI?U[`S他.AS+^{(C rnɽOg=輲نۇ3³^r2w'Zȅo2W48:QCWJ-{g>gRF< 3 %,\鍇/OKl1|ap5=Ggu<}rNz;#8$9+k6\c`Eşo zf^o˼49ɳȞ6|oH~ϟBD߅3{'.l s;[=A2};z?l%'>}WH{6l}2}>վ<(sV흍9lw֓@OHN?zk4 q|6Y_oُ5ϙO.x|W$}K_9OP2LoVp"Ko<_ 7j=UYy|9Q[)yN&]~5:[b#Z)?d? ·u JJ%g0(w/._XGw;o&%kCkZFSv:i&Ϥ\88XY+y{,>S/7 3&g@6m|Y,ߏ兤wkؗZе |ny|y]G.ߕsVy Wz)t{}-Vݭ˖Sɉx48~:I&蟚DOf/m6̟ͽaN9a^P?1_ o1B~BX-M:(K[๝_xx|@C${\xXkD4ַSd~}q7:z>#ԃ/|Ǥ<9:?qdwJLqMz#zf%&` C?cxm}Zty!RǹW1)9j=KEx{$r9NC?$=8 ~ZF "ߵ\?N6>HbWOr—6ݠ+֤o?Tw,טyS?i|>q|n߽ҟκJYуޑ$#gO\ѹOWe(}OqyOxxvOs_NrM䏒t^;e|)=Gixq gq~}Zfg:ù你[[ GMNKlAϽ"'s{fnAWrnK2Ld:j95?) O)c>C% dao^٥5z/%qjLB/o%HF5~{  >tͱxIc O30WhvϘZ^ܱ!(}Sm=VieǪ!b3|}gR' M{Byx rEQ{-7].xȌm4uIyĽVM?D8H?9%q˥q~.Q!9" fc/9z4[v~D[軉~׎ ;G_l|v^j}I'=doI('ɗ?Qzms]+1oȰ&)6y;1|拚FIGgt.}L4 #< 0iey}ȍ[ĘW{}r[oSZ_<ߦщ4q_s/z_?g \6p DC|'@D<Y¯.+ChW`:et%C^AWMo:t=cG6+KX^l/o8m7 σK>,O޶=|q]$w\mb|{O;K ޲ u!՜hJi/jѡ,y+M㼈G2bΉ_6v@G=ۃ8ߊz$]_&4@_Yգ0K$|7ډ﬙?d92J4߷,zr̹9τ*7dmi&q:3f 9IJO~Ηޠ|W ma/GiG|䧅y_N7gtZoH?9 |}ѱ<:1FW#$\ky=}ZΚ ￱os} vsFsW=զ{U)x66 sh9X>ggc@0)95p/_fdctm_~Zl]yaզ'ߟ;|iqK< rwJ}z``ӹ3?Z&9Ӈن>=Bbu??.sBNx2׿#1 u:X!t^N/>׫ygDރ\sWLbNX#4`qN[3)›yxZxa${3Wq$t]iòml}a&rt}\=9w3""[}w?b |Im&\f5D ;B{sYs+yU嘤ɍ K؅?exgz2O6/F}ܿ*/9߶&q\{AOیߕVNzmX\k ^ 2!EGC?a_=޾HoR}aSX.n&Y;S6>1T{ /[L~F}Bۖj=RZjkg삗j5^*½`=~W9td6 N:ߜ@OcXu<Ե+Gi4 s >ꟍ.1JDqZQcA =/]|ax/YzSiwfQU{r}y6.Da6_FSgiɫ7>Y-um##7(M2"CMg-sx%wg9ފ0-ךu'8 |qENw /fNn \R [n羋ʥWSEuk $g=GnQ/:OO5WJk5 Ngy ?tkhz{hYX;ͬ7}\ ?uL7¼*D}Y,1 N [{/EϔEC8<:sVoوONYߛBD5ݡD+:5|~<9L/~ :%I#ƿ!7WG3%Ng]<(t\QBS᭳ o,s/֟:?"J|Napw ;O 0珃{s>Y?$SdN =vm_M8U[fo|l~ ixz,?m-xq!'ng~]O$xQ73:5W4$2/2gWsMsf4i|}3cS mI^kӷqO~\&iףh_z >g0<|s2Uz ۅMrm׿$.i-S)NF:U OwC[jO5:GG,'߽{#@Gwd~< 'DN?WկoEr׿5ɏOCO:{woGC[ޞT{/9EKIg#& ';t{Ǯycע wj=?ne3np{2~~p;|.N :{'˾V*o7Ú#? Cgu.Twgv^ty6 [%']|&)|ܑ3:'|j_0~ ʙxRHgIds,kݷߖ?y>¼__g!<+omEh}YcFo (eT7O֟#rm,ct %<%xK|!GwXZjރm\zu@Cu =(m{쳖>G.iyso  a~C7:< և${8fi9L| ȥV/zro Z})j# Oȹ#fbQ}e4(OJlq<Խ'deأJRxQL|ҷVՈסx <^/`&G~/0?>4v`9$| ާ缗ܞxH -dᅣ8/hAs7/rxp/N/7x|B%ou9gN?"#37y=0(so<@^cy)mUf̓w[Omٜ?܋^%ϗ^j?=Yx"7|xW{}w~PE4CK~e-o}"îGUF449EtQ6:$OS⹷>S*Fe7Xr}<( x9l sy$~,Ә'g?,9YInT \ ^̳}}`yek9 >.KL3'ods =ϫUKL0ҏܩHoȒOXbo0>yqx0{[eZόEqz1M_o:,eW:\)rS5~v(Ku<܃O8b~k/a:#_Ϝ}+9w/78_4# !Jk9MgIqw>yó雍:#,0nz:t~na收=_%w3SY[4O^y m'?j^7ymu&wROӒ/oH=+ߤ߹ʑ~:rI?<:p ic9݆~YI#}ѵzSQ_!Ւ#~1ѫ+Fj>RshѵfYokcW?:UCWJ<=!\t{O+ &o!BACk[X8/=yOǜ#6=|nz kxó M}c4N?cN~wrtܦ8kMZ;\~ӽ뉉ch$j"Go9n&}?nXsq|{h;Pb)}UAzW=m:9?t.qpt-O;N"8A{p]St+nUa<!Sx<1=t;st uӋdX{;MGH39xnyJڍSqv|Mk+/JMffn^Ah}% 3={18)&%W"qx2X_/1-390G(|vc>t[̷gg9sey֏2+z)?_oj?0rtdC׺`73?>>͓؃_-z~%.mY>0}[%.AV ߅Jn?ٞB}{-ju~(<>G7S+3A7mGHw o5ySw\W<-i& ^Yb~7X^=WRƇ8s6sx~ whEw$;N n޻=xG+GyrN^35@~~9<j>ϼ#ZC?2+S»?tB%%oG_I /k{{J9\^í RM]|XHѳiV |UzNK>__6^F?۽.U ̒:Zj{V9\'3̉sT'[*}_ߤt9Y sydзHNK>ͳ$; = of4K} 9I]W}L:?y3E'~927}4-M|t?/>uyq+Ej:Pp>3ŋIuG$j{re3j 8MҮ7V2>>|atS?yJ 6JnFGSƦн/. |lm7ȻVl! ՟Wй'`.֚~Pt pW_o>#|Yx{\,*nΡC [4ԍǔ z$e?z HQ'ͣS|_e$}F=9ޏ9$|tIV >?{ӑ+W/=;߸Ycne.1zJ6#IgXdiVax{&_욫_.{B T{߮|V 3gK/<${ʕ p=5Ѕk2}:|kv.Ynd{4nW^7!?W[u#O}|wOyeˡ& .E_̜6L.%e~zR)̅87"{}1eÆGN0M[殭-y䥷5}f׷-5Yce~= M->Ϝ*}$3}R{S֑ixCu); %;!/s0_y _cΝג3K_; 7_६z'McvrҜ>ϫgf9OYoɠ40[]˽~t{[.R ?_H}\ib@B﬿,ދj>5N]Esj}S^5ӻC{0W9arUwfo;ARQMr?NGefY9ݧ昗N{ztA̓\o$FfFl7~n~+֟D; g'Kѿ6 HZF\0V/#'20&;ƼR"Gm5y~}s߽gNr[Y|t#Y=))aoJ?"{BYOBϳ֒G5BL9|~2`d l=Q s^h7N9\IֈYV1ET{GytWZ|ޜϯ;M3!?L.&mWY8XO{^/2vfq%f%yg>ver Mnq:s0ZsΟ_`?ӕcɈz8W:סqd "/hQyZz?4AwOW #Z.ss<yk!tA ܫnO_%/K#.[%rdR{sOF?~ܧ7s':?󫍑'd^/5O>k7~}|׳ї}i5. '=m{|"53~ ^GxOc|^Xߍ>HWX}-9x}/sWr_34x:^ |k>^7L+ɲ>Y#-1*gݽww&΃4zz^x_/SzOfv">xJ3LE6׎/_끧NCM:^G&OG2M&U [7J3wmi y? ˓;˷O8M Ƨ`KO~s=?v8-tbN_枋,m$wn${kmW{^8TٿzBuyoynKms#AF!Gi2BnGk}~q^Ѝuя=L_ zS'4k9s=9{=䝵K1F+'"w'Z\G+Xh8N}Czp&o{.*i"|[,?N/׃D Wwr&;g6 |Q?4ЯՂoe oȻ-ϐ#Ltɽ|!tOݟڰgJ}T,9L1dk;a|sS[<%3ؗ Ce >qVz'?Ո;g%t9|3[Ư%s9rWwϓ̾ϋ a).+ϓA"}S9N.ܓ=/}J+zY|4}k>ٖ# R4)/K3Lwފȥ. C-S/wq[~zMIq/{}1BH4߰;{/gTR~C9p|m j^2fphg8ǽ~,+CZ_$s>>Wɝ#?q|ZA Td*qe"wZ+i?^']iyx]UZ_75]1V0UKșe`B?8S?MG?|dB/GrC<2}\Ln87!l읳֦ zU#:]uLfޠg}<]˞y\}cHji5x?zm|]]w}>'֫{%.rA]ͪw6=jE1HNItk&MZ~ƔK-hWF.F3FAeq>5g\!%ޓu0wE?;ȟa]O;u%ǏO=kys9|暁)Np&3?[O.$nt#[#%fkWxѵ4(_2~1ځ/ yi=1od(*c׿9-| Ch" <^yOl{8#ѽSއ?_e)Kg4f9nrh>>MJ|QH _0fe,Ívew;r,;Ӝx?Iq?D'c WΐO70Ozwֲ 9مFׂӮɫ=>4n~ <׍GoN/ "^Yh_ҭQ}!Ite!vfl1:j-t[wr/r%=5i rzR(۞7[ t󵏜5' [N%q 2wNOàkzK>زAˎ 9fW+f?y YJs!fk; 8K&ُ va܃;Ȑu-{k80 ? 򶬯g=\6O2?Bp-50z)+{n#u%oW2smxו$k1G߰mˏ?9)]o}/e_/墟T?}s!X.N³{ZNg?crΔY^s]rA?'qMd8|>F^X/#x/O)[UpEdz<:~aԇ|{1;青wτ~^Y|0]bֵ+d/Z4^^zp߽tْ/}r⷇Ir?ﯿFܾi萻מ^KCr]׵6&5J~kM!z^_M~r+){SFpmUu=$O.n+yǓ9} y=ZɃ0BOË3G>sc\/A-0x`+1{{PQBE< 1RuxP8 ӳ|û4xxw"lyG/Dט!IRgfKz0a|Az}?ͼ]GJOϠ cE3&'O(*6)O6W~ .i"+9 &ou>yM!<=OV Ms_GuM[emE郧&GJCZ} p5uϖ};^r#ㄾvӫ}5~spȿx#DyInO.*n)ΟsFv.ߢ#ԥ^/~RӢ.ų[xj{ w2ksد,糕ky3Mv) {jeS%rɣ:.QD_E!I?O<7{4\z|0γj/9az/R2>__Akcɿ\vEm'0&O i'" È#g 0']^tr[vwS|+̇tz)|L˵ 2ȱ&|N?6;ݒy/+䫄7Hҗv ~?j`ΌsX9@ fj^ޓ({j:}\`?-HO9Q_ë5̴cޫzr+m5:Zw;sUgh6?A'3vd|Og_F8e\ִ;O;ȃnP7S&p9! NWx r?>i|BΑZ Bg#پ߻,~"2ƺl/{-Gy1.zGZ7葭gfS7NBQzߜ,VMZo.')tg }JOns}R^] {c={F?!z[/ԏ? ӫFI÷~qWц҇ߦ E^N2,E֗/kbR{9OHУDWQe=y3#EUd g?AVF=B罖\!MrG+VWX{Y0#פ|-m6Y8}&?C?IE#@P/etWؐ/ H];|N~cp"Ы`:yi>y^]wZo=ko>\ KoFOG&\zE͑:76I,g΀ ɂk,W(/zZ/~6hכ΋zpv4דQp> _[NH{CSњyV2/U{C}J?Jk~מWOv,|A7x7?;V&ry,GJF~%ﴝq/ y9 穗nqsh- <IY^H=<@6'Y N=p_y:'^'Qy/@3 2fm@?VKG7r:Z؏9%}Al~vzֻ}er{sjJro9UK?;_N7܎s\@?&-}S=#S“ỳ[2V_Iޠ8WZm[Vg䧏2A.=$D} ~\/9OE l~Q-7>N}4}G#1~gPw_.7(:ENܑ#"Qt9Cay1*Q zۥ~"e\z$1YNfq 0~@ Sƫ;WsH_c~M}l W/y s` |Mr0?>'?;ü\I>OK>c%OVZ9,qVtU~`=]` &]u$8 ?0(s[Ac uy+s爀<=͟^F_>f>O΋^wxPy(yNtZⷒDˌ74y{W:&wI +OC1.1ͯasT!C^4<>ރA$yvg97|SՌ^xيzXs. yZHoO|>1/vi"w)1DިSN_IrsV߳%~Or/WÏ<ωэܣ/1וd{|Ftvy/1ѱeX_/>$|Wkq>Jo\z便' y܆r6tJ=ϻ\l ˗ |Ug:{xvAEN^t87h9~EJGIo3# ;Z{/<@;޺+bܶ?þմ\]<C._ opa|14ϽR̷eG3sS ?$NH/N'gsE VgyxKb}A\\ND/4#$߹|^#Ny.S,w]oBǏ_*{@O`㯗8eɵ1ex.G~<>c1u(S>!/1XuQkAq{oeycEa-4=KϾ LDIUy.9چ|3 S/Ds:x$:e7O \!GLc'.Kx|lAoK_"f#'CK$ /cY+*3t=p-opdV>٫snI>'7VrrΉ6x=yW=-nөm&i!'oyatI|cA-]#yMSY("{7?}(f 7^ԇ$T7HFN|^b~\}88o = M&:t2^S?i;+ 'WApﻚ~,@ Gs#C3Fq^ . ~`O|T1tj}:fO=}/q8vn;i}QO4zB:@-o>~YGѻ+/i+3a)ߠ{X^k7M9<;|zū}Gf*SzБПĘK; ?arc-݃Z3%ɡ/Wuh_7o4!yuϣ&b 9r$yg=xj>9z(hap7@gc> ?! ̓>Ai^,gQp̦xJ }\j>j?~=m+˶}[/Q?m~Oy⧗ ϭ]󽣥|Xx4I3_Y O, a<>SܳOey94x?]&/Y@_m^ݤiUvn@Dz_ёC gCY}h 4k6oE6yY@doK{Q)j9I?OpnXRmMt^b |'z޴l'ߚ[oվ$D_˪M=~9 ?{C^uY{ljerSzmNqU7(XEEA"rEAQQ@HS#Mzn%ɦILI2'mw'y߿Gd澯_WýWs>+7\.tG{0=q9 Rro2'ts1&Y`6:>fނIrhw1[89I> n~;Ӓ;&e؃YoQFN[U5v7y 7J /'d NG8}γӇ !7Y^/qǬ quvf)tMࡓJ̓+< >})kKƾg.LGwC7|D/E?RG=V۹NzғaĸWzCu|}6|\' =@> vzGyMs?ϰ7) rpOQ+ ŗs@4Z<|,SrNwԳ;*rMsq (1>XV^+Xa{^z$hR*<yY"kV}cKd Pً֧2cws:l=ۃnORWa5@}nz h G[2{NsH:`= 9U_b{]S|b(yhqb}GӘm޳x2xsC'yf¼Eiy=/B^rsѷ5B :6O#v1{j9? ӆ~eM;?}ӆū*+E;Ys>zY˜!@n[AVY_Gc#_,^N!RcspR#ϧ =i+O]v-e4V:ݖzv^, oK3vY|=\79 Ns=V,yCpl\IX:OFoB^{tϸŇ&IttxY\hů&)>WC^jz5k-ik%UMAhx}>x #g /<ec9-CO{/c<:͠#4QϾ,QwUcOsc'O(:4|x > ׈;^1<|)Ӄ^%A$r 9Xg 륯0@Υ%B'Bo|Roo4{v zuō  'p?V|+ zbOpʽ5!cY-l3|!|:~e AԨ.,g=_HBu=x{X])w21_YF菞*n}d6jJSE7n]F~-C\wZK;lEDtߦXN<t箏QǛH-s7sB]pL-^It̳ pKu$ _>xʅCo8 N3[ѣv6У.WA;9wu R@7i}b*AsVr)=Ό-6ߝP r1LXQ 'љIx?h8su?A)t߰|$Ұ߿$6ރ)gMۇ7JxJD,p}賡'O_. D@J RztV}䲚/6:ybJ\>kYÜwYyе%!s 8crtCm=Soe^=t'D0(dnKț767xy_ <Ϣ3yRUrd_{<{/t wzm<-y Dr4s&-5{o|$]2ο9=7v9ǖ>h<4t+^hZϋ9pNCC/0a p/caDuug}>1왓8g͒5e}f1ۖG-Rt [ ǵ1G}c%;|;%)3'9OpϼC/ xq㽂̇iR&!SBQ!x0tZ:y`;E0{mbIr  Ǚx@FG Gdgy2ۜvp7Nn,+s7f: Õϥ!7结9?rz~^~:,$I<нyW{)'̷K*㜣'/Z]^b_W"צ~(jytһӛ/2\!$6 r>j9a~<s_=T!rJP"ut|\,u%E%sSZü!Й\k90J ˥r<3yC-'x-WzDul+ HuK|13:򄵟7e5@?}r _yA'oO[E gp*|t&q8@i/:W}Ϩuv)kO-4Hzlm*OT˫ɂŘfGWp ]P_qL|N-_Ԇ~ wU>Ά{ ڶ{q }b/4 ݄?j~g/pC S#Xg1-fzF~)M܊4~9zzjo7._?h2i? 5]ue#6#ȃ 1kRe/TѣFy>5>Kً|>yמN?, {V^DNn.7"<]h~8e2?{:kt:i%L=|; rO?yΣF撠ij-neP\y >S?AQΣ;{_9?ȅ 8g8Isi}i ]w={KMlS<_-'wK%|QXAD^ cd'L2f ?hs9~Q&DȀkGh{{Z¿\=^{^Ys-J 2AN咽vOdg5ك 8Kf٣wǑ۫i[\y[e,ȅ^r/LuGH=$͟^77Sd@%CkxoyT%/cA>ޓ9r q`ApjMfV =?&u||1IzTUtvjB _:zkrY~+4 hKxjpYf.G^t˘Syr#Oya =zy|8=I,_H1.ؼz%.}8: 87z>@W%;}G%mׅ<ʇ4Ag:t4&'c=9Km{:kVϭϜ^vw|ߞWVϛV<1|5$ lS~Ϧeo(QapAQ^KZW9~lQYGE#o?΃٣#Xq?fd5}.w[b]WǻC_T3gl)Ԫ}t2G#DDOޝ?UsjpVɥݠUe.ڇ{a=,΃wg'8g__p;{^ϱ'=G-}iCvm쾗4<lyCʿz÷G>AG'Ip]TP| 7\2#^>YI| /Oyc5{>j o \&>D>\  xc`X.Y|?U@P]| }m9R|ywU.{l'Cb$tS/Ř x3`t U9e + kass>Mi>_n9AOGat".:^zm$7dzY'usky~Rzd,mkR9į7`zs}ȏG=hߙC~ܿiy_<ښ;>c˲{w{.C倛Vb|MFnݻ^s0RyIާP o+a\EؽT>'#$c[G/6tږ?*9|=/@p IZ)Ovkȸӷhț.-)1[x7t2O eze;b(!q4:/>|D3I rڈ/AMx)̧Ƌ K^|^]>2vy}3MpZ/8z,<< σ!1?`9' >=n}oZ^_ʣ֮V]ߕ9(GKʁ\ cX"g!iRK&gP@Oi~Fmw|35hZVS3jr:p@/CߴPZ?{̪yuK#>d/~`ӼX/)8)萼<'7_G= M͗CcG S|/Ń_9D;֌,>J$݆>k6dJ n !xmtyjw:8[<0{b>:ՐcWkz~g#M;yO@?: %?•~M<ar(/&_9_ͷ7B˜;}< tٗ)=NQ| [U"oLg;CSg73x'1 1p8>%z JɣOp^'i;B~ )N-[,0 ?Kv[#zCkdbÉK8xjq+5ϽowBZO/.1i ,>:>w~gt.%Z-=L^匭G+'wg;~17o_LWև>M1yş#ߓcn">!|qՒS9잟o0?Vו+.}oTIӨ:鳏?p229Ձ?RAoL_?8o74?&[yd}+?7$}/8uyp2| @w/V4yI17/h'U`;o~MZߣ E̻dm{sCNH򭋾 s]XhB#׷]^2ȹhm#2og}ݳ OFkfOA-򢥋 |zfM&AJw__TߥxzfCוׯx3?!tyŜb}O3t1|{|bd~.a7~şsMs;sߒ9()mtGӈ)y2ߟ\gd1|Ϣ۲Jӳ3yxk9z>Q 69wz]S]Noh_tvۼby̷7pg֡J_E=x >n:(=f ҋ3/χ{'ڄ_<-$>Z:|HgEϩcy`/ cWÛeJ3yYtqc𗖯ݏ~ޥë _=_Ǔ>|~tsv8z1[Go0a[>4yG=K/~=Q~~u͖E [ɒƷS! K7syFٛϡoMܓ6$swja`Β!ӟ'/G{"_-yǢN%WryT<,>Vܛ~x^,QpVLf^7KKn W1gwrosl)ڗ uUoK}7!A~xr&遍n_'so$$|Vqi'YA.}a=˯C?W뗵^%!S||?i}wssxC]?:ً闑FF/˿MSzqgoaG}]~: Of}OK9Ɂ_akMX|x |Z$ QtQt#t)˝6}+|BixFy*sw\?oq9s<^('lN7gI71~>ri M૜>|o Xû|UmFA7'Kcu s)NޓZ=@^46<tsasIr#3sxX@qrX>Nc}m/Icz֊ws'Ւُ.K >E!O3ISo} 0[xMӃܷi\cM{W=Čk>tO1ME7?~ s\WUFA?6r=^rܢ]x`)r/x^=bD#m"jЕ֯Knq#woy WϠ;4ms~Ӟ:瑺>|yB2?ʃru)7$RX9֟u>Il7bm J畼rdOA_C]}?w+Iivx >iNg6ǜa=㔺o:%AUV]$Yk> ] wh 7+_3^\rEOi Syb{G$k>QwL߃~ط.4Ř}p/Thε#7o!ە r{߫؏P̋ϡKm}[ Iwk3q>T/Ww[eO&E~xt^='Rd5~ Ufq9-Odgq&Ηf_<~љ3eFmt?\݂v]S ѫtρ}y 'b|hn9{>:oȯ2x/CN8{b_a/w'l`i;`TSMK.Ab#yLW[0-J寶?lypGgln\)r }q8- ~߫07S^w^Z(ˆgriy'r o;Lot&KKb~jpWo w=zb%_wo|˶hIY|;S5!Y gV|d 0:C[co0?iyiA83Io9>.g*}|fwţIM'p<|>ycW7>2Y_mo x ru=nޕyva$Aۈ9"^>d/챚9g_aƒ(tb/Zo8zAt7'O{?~iT'$}6}F6~/ 9=LF;˚8V9y(֛F2w}zդI|!K+es)cz{7%W 0s J{^e)ug>ha,u]:s\.MKK6A *:u+FM2◞t3jt2rW4z-o9^!JO}e$ pXy?Br}χ<3}Iic .`蚺x}{\U[D%:uD O;/=bZ-j> t̏'|'bJŤˠ;wfѳ<7IY U )z)wJӇ'ϐ7^uC{w'f{.xb}՞'wȮMG37%h_x~8sE-YN?@o9:*xz=?9B;[ u yKUz߬zoѯ_R-׶<2l{?{̪;NK6 ΐ0${CwO^QOe^i 7Jz ~?bܽ\tw)%]E`>$|9xs *BlhmNSg\zV|0l{T8O.++o(< Rs6.K4xTЗzc ucܿ8N`L%{O66? ŅAajvAԍna9cH/6y(s^`έr}3X=onEx.M{:Ӿ>rQIZ΅$|^R#{ +8UbgPW*#ÂRa0<_Zb~>{Yzxor5|gcˑM^w0Gxef`K_(z Rt5ZK!gUPj n9iE0ym1Vplz=W<|qo`IF67. |zG9 EWp~m?z%,%csn4?gޱ~4/Iᛍ?3;~$>OD_5)ΑQ(c|_9}'/v|RfF~>UoB8\Q .+Y k9iQBs%W9va-AG)g9G"o<ߖྲྀ<<|l)c ?SY.7>I?2plsÒw=uύܛ>.a&J~{~ ,'?k$9qd}- zы3o)s{rF5ד!i=Iv|^8G%Q&dw"ٳܧA1;2$:.zy೵;?s[oeKCH5Yǟ+!trQj~8>= } lu$#7crk/S1_JO?\|g !O.$i?m/Er_%z^0=\s? Nۍg$2_ y'W`8*E7A_sx d5? +zxCC'z7`N%h9rQ>s^뜫<˱C ܏OoW7~z͞HNW5>j\zzcZ__JR Eo[j%=gOJ>ȜùNv:=V/ sNS|Ws*3a",q]j~o_۫a1!)QpJ %I=UG˯^h ^~rb_Ty .myr &GsG/2xL'No=bJ/2P%~,%H'ǭ<5a>ir̿K2O eROGqEjV5},ܯ ͏t!p!BH1WtFyp2ϙ/aߓ?L]Dr92.}?R\hEpkxyS0GɻD_ yUO=~mmC?49D7lyv=R6B~8{֋Amj#}qI| >rv0ѿ?1D_7~ay _ܗ8zbt҂_<<{d?#]S<͐_2yOjеx )<'JO:^HKMJ8?$Q7'ap%~0~sJsvRtSuϓY >3节oWYt^kvoOcᯚ|/(SK?w9$:/:;'W4~WL /_*@isg/<~8}Tѧc u|w[x`F,G(\ b? Y6W>r= ! m2+ӳHo./jd/ߊrw/(=Z|OY^V b=s 8$u~_&ξ^Ïmk5Q)=c2xYC7~_ 积Hy;(ӑ/A̵ kGc3Ef>V|^%˫GR=~=e}b<mٳ+Oeܶo>CڞQF+$N{2|gRBOV3.fЙM=_ s͟~^/5>p1_igW˗tK[/JճW'o| =J%3<ݧI6399wSM8~Cѷqb$tBnϽ^/v4}p>y֟9]̕ kgz\ 2>ݫ`^=z=u;Q17ѧ YEWny#ZNj/DcSłgS^WiWH'n/CW㝆yW_|* >Qrx\}rr{y_4̽.XwSSŜν 9 v|xrsO[K͎$b ~ʐ3J~}s|z^%_!O>GߞCR^ tn/iu{e+k㧒FU'}m.OϬӊ~N{,_5ɿt !BB`=|z~3$O=azN耧7?ekbk'A;t)踒=3茳 oy!x*΅ =h}WOn4: ?Aw*S+|}rftU-<_ϣxݨhǶt{{sy{ػoi7['A k9#1 Ωz$ϲ3O2/ :5hfNdn2ޗ{c%Џl r]/`<}< ={t#葟G=]c 7YýX sI?K>$yKd/`1r_9|y-7ir`e{5<@(Z֛Elΰ_5ӏjseQx9rvd)Bu ^W/:ȼg|<%+it֒ =:b_tG3g?ɥ$Yd5fZF?wNNK=Yp0xIy2l?1 YJ9U%H~1z]7S8^}A\ xQxog[ߨ3?ir٫l%gR0}% y*Lpbr,&k9Ra}rdOg݄\\3oZ' o,su]ߕEl߶(ILS70/ &Ws?,EݘC+$k"<'>>UtZO= y(2Źf!x}rHpGn=xV|ǷW{E?< k7H1MCc~$ <\%ι0^NO3ߚj<^;f_麅F<R7x{"'e= /5h:ˡh%{y6!^q{."k,f8qrCYz6EW{cu\o?ΐm=<ד@^VOHOze=?9aVG:^|[^ߦ=򟍯,;tߧ]KϹs Ls+bI3G!!|)I3iyঅ _ ?{$Dn-/dz0x[tϯ'a|;~\>GzB熟]/D|؟j)уfHvJ5K?ob>?D?:} MTu$L>Bчaji/GmUτaeO}Z6+B"KB}{罅"O^n2ž?c{!:3B}?dIٟ.<7w~x,rn }#勮վMc4sܺ9tcd[Jo-wS!- ֜yߣ(3ͅSZc&z˒K?>K醟Ϭ/[C~ʽ/{JzgƘ36w/Oryu{n<*18f} K;JBWϛƮ}[>^yooޏ%/tY{k,~b SNj ^rZ+;k.ysi۳yF_b~ mmF#%ॊw;/之|KЗz7'][Msg|eh٠[on湭/˶wY6oZ/]sǪoJq- %o8HSexj y}U1YK9zCSjB;?{:?_-Nw}2rCýb9˹SZJ>y/VQn?+[ 8]|\8;]#_] qo6"{~Jycg6S0܏<ܥi'n9ĽNnYrv^_K| iE0:~AzY*+}J<GMu \E%l\B~j;}.g"GKˁϑ~$Ȗ{spz[niuޠs5;=bڷJå\xYLCЍ* ~cOt}ƭ= cO)/ye]}dGgQLk=)Gcr֡Sߥ$ϯg+<?g3p >˿o_ls6z!- B/vl|iՒO_vGq~y".֧cyzF`8z+ 4j8{`4xl8 &3A@]mGst1d xz?<:Z|_ȐK32Gy~3++1t*c9cYD7Z/C̏mznw{87YHӋ6M  |K G8c jrs״[oTlm虢&zagY5eבghe}/>|#eȃi>_=>݋O} ]a>f;{vseUƗy#G ^ m ۚyhZes?[,82j+pX)|AWh:hwX";=dnŏ&FO:8{~<}.p}NfaLWя4\a!&̡8c-AEǰ=S~ LdOmkot9tr|N3pmuB~K]^cFwSlf#oY b>qK8'j:='uk5Gu{?qmqt"o=nr_MٿMӁ‡>-t5ݜg3ѻi}ϞMR['A X?c{꯽"ڭmL+#ns;jTDZf~貢~JM:Vwi!o%/j}%G>ݛ/uݧSN>o[\$^,j|&/=D/f-⬯73[~P|aw ?Hsl]|qW.K=|څo\Lfȗ5f\ ؆??^zg;4s%<ԏΦҽ:̕C_ .l~FxBv󽍾=s]@|y%\EV?m>\?ySZǼ^XFݹA/ιP!\o[Y9@ <꺙\eIC|2zd?ɸsD9d :2˷gwBϱ׿?ir}܃o] ޗe?ja>%n%߫~{t2R jy?ɟwu7#%!ZAϓ̣I ?i/sq{گ5\M,!KD[nL=5=m}F{yfE'5g-Ǽb. CK]}k;j 9< {Y<yڎ2}!Gj=Kϱ2r_oaosH{k=sn0;y#b%/3Dwցcl$Žj!z0F7N!#˹݇ϝb~NͅZf?{]4]?X>WxA`eɷ} XI1WHXNs1d}q1Q7֓p=dCr| rm-Cý#Y^vs Ys;pчX??YO OPe_c>r^/p9mf}?e U'KމNGwKi^r>*rKh793i: h眫DZ~Yɠs_w4͑O5e{x>0ya+sE?m 䉶r~DcZ\ __o=毲b9M[Ћm$7ŜpC叢'oTˆ&%En ky>LWdW- l90m=[Xڭ S?:hPʟx])Q'w"GQ|N;-Z|d|W(c× tIgB+oz3z $ ~6u2 g4^ۿ}E?wsaR_s9v0F7OH-I;zutN2;/zn k>2}ݧ*=eyϲBП^s{ot#dzY|!tCXmg漧oK sΜT0K^VOeS| [| ȵ?GܻC{zOkGB.I PϿS <3Ow\pj#sj"Mo v+)piz|&yXn4 :8g<, iA/;'"e֓UFqQp xӷrnJ||#\nri90Ir>[䑫{Yɳ?0]>g=4^fE.,7gtz쏚9tw\j טE?zF4v_8GYF|y C#PeF,eœ?9 ^9Μod;6T#))^6f}cYXzl39g)x|[%L/I92^C~>4]_c|y~;a'xQ=m4t V}1gKboq92q K j>cC$Q9C~f:Jŷ$C+E5dy6:{2 _OwjUk9;gOmy\P/O}7n`aˍ0zz{QȖ{҄n7w1r+Ю{X󅧿(!5W}I,7Jeǂz|*>r|o!}QpbPs{<|E\A)eףyɃwE?S( Pfny<2?t>np* ȇ[^dGsi'8g\`W\=pCV&ɻA3b96CsX-_^=b8,Ew~?:|1aWÉk}G?t2i9 ~><εinV{3+e5 N'mXoVz>c E9 aA. ˿*Yϫc<~8}i{z7^T{w"w8s}(y%zx].es Uy=e <]c+Zh:r ~h ~U]>}2/Ne8l/E"?Ed(9^s؏{?N<-?'m8;?Z) `_z>CA?8_76(scvp,{V#vIPsx~ s/ߛ\yAO̐G">'k ou䝏19V<GZ_p&yf-ysrA_lo¯e}^d?xz?y!r{-?5d)b7eCQ jLGO/a a\9"hp&t:m!jJ+(;(kN# x%}40n=ʼ@O˙Gϛf =~}K|f zzGS#\e2^<֟8OoM{;ȿ7 $ <ߛ~7]b9sb'ird^{x}4f=Ƴ˟.!N1@7r^8/SoYXXX?W2_xbbݖG+At3'Wgَ^4D@nғ#MXM"9mlWϳjM9-=;콧7LG3A/ct(Z;DD/<t  NwZE^`3y>ItF>Uǜ^yT[f*s}/s;xɦ|)!ElOfk{g<_$xj M <iO/\7'=>x-q7'H|I3qOQԳ5o{Aw2789e/_UgwCgù}r%kw6we厇 ̀ZNZ_6q/X==c }̽P'aRXG@I6s.uOb=Ȗ>Jt QC7}Y_=pD[n0#z}m ڝ́ļ]Jf'@zs/Aݏ/y;({ |8ys&8h5E4^b>Jq%,ڏQps9c7]E')o8¬{1J||QIKyrx/usiyEvx1d?{'0OYo' +W}?{\~o\Ow<t5gY| r zCR?_~yj%7X%~yh|^Kxyksw{%֋\$).Uziy+CH01S.GG<|_^o2Qî~j5'3yr/_ 1i9`s[ެ}~?BD%8(N&]oe0Yg(PU~5H~>=JL.#G#_INIr#&bO;y:~(C! ~$H"{I#xUJ_a_~=e-{W-帙̝嶴˶܎yqIK'ط[d.A?lC9]V O3ou V?@^;ryt9^<I+)8|~'FWc OHw &.Ç"۷2OH Uo'緊yl KT}0 }mxa5B ;b߷ &˳g!z. nkxs37QY'W(F)<}}>EJq}u9{bΦ3j"߹܉q]h ~?!?fa{_?eKlDO{@sE~J.w(ImN(IAvAC"p0Өӹ+A8m\A||]/v${Kϰ$9B܃>naㆭgx+c[x޼A۟Qt y4?u0]gϖq:Irލu@ZBG_w˕usl~#Wiw >]˭mv.BAw1n3h|<I SŘo\ݟ={6hZӨZ0z<i_;R|)sۯojp ]uk~X$J㽋;=]u?eT;/_Zyob0E}.~yELπIY,w 2@`m'Tws8Fߙ?ۍxyvIbr&%'תr7X;H*"[W}H=A0?Fɹ>.-?wx ߦi;_L3<4:hsg|Odn/|WLpzn!';\ۖ_4}'9PW8}L{x},zuW[W@'_X?D=zG\ׅS^`ocW433Mw_^z5rЭ( Cn&yQM-ևN5ײ/y|kfPpeM'R&Zȅm?,1r5[Ux(Yhoǿ.b{XiO|>~kݵ>r,ܰ8-~`ߞK7k/ޚ$F[ȿ":C#e>HŷIr'/rHy2Gm:o'#Ƞ[:S|)ejV˙: rp}_?_R,RNQ_ۄ^#A?i50s򰌟rCo/fx0m?Bfxwgw#1Dj^K ŵ/Hz o??^: /xM%x{<$҃Mj}8JfD'&q|)~?߯=*2#v9=HO&Hfz?]Yvo{g.u}G/ zmL/xyM?řGנφϔ7EEV p?t`_/"Xbλ|rՒO͈crrar[աjW׮}d~UxǙf|\ü5/s~5wO /GGv~Ni\WomGFC?b>C%|f7z{TnrtR/SZIOƇ.<#[G \>Hu:YPlsv(5?*~yH/h^K%O;Ƽ*ԊjBȭEW`Lǵx!Vp0M岡g/%85~H_;ȾeP?>l0s%=#!OC~УK?>(:ne~tw5%ܗcO^o!'.rYrKOg:2Ytyx7t0ڇ_ 9 mjxx2^t;y G%!]{o> < qic/[B|oc:A~|ac3}4 >=ʜ\dBOiTO\xQ?=r XX#Oq2w&? p}v?d޽'>e'sZ}5{x)I(5} oTYp/]\2x{g :[jEo}n~?gOMfxFyA.~SWK.{h>yw@Vti%zXx~ Ë'? =w쵾򾉗޷7O^$*L1]fs~yO7Rß oךF⫭Iޝذ&oOᏢw*Wf߿S=V5S&&8w[b p/|\к^[ޯ-_7oQW8B$inhZʏHk?S-!z]Oj}7Sw%%'L'(LLp O5|}=*޲}t;Ϡ޷ yPul5> vwl=]Gx?˓%{튍lMMOq~Ft0hp>ݓuG;r$ ?~%r i.郗 ?NGkk/Õ%?ݽ^ik鏗k|itkkGZdMDsC7]6r/ӣՓzpXӑ|j{]w'3ǘ :;ɭGGHN "%?IK^N׋oJs[y񩓟2w)n1ӫin̬s}:< ?0=9v%ַs;4O7IVRX98>85|9,O\ Upm?q) GwBf-s88ߣg_o~I[py }}#ÎW?Fx_=jdkm9KE/:!x@żf618u+49+8K I7[gM}M/ޑV`W3N_[sʼl~I0ІCd9WM"7ϙ>sz72hxiݍ#'s.┏[zO?Nx9bߖ$;qpro_w^߉G\ #WCû[_φO{|hw⒫dOr-Ӂُ_mˇ GF T.zG80OwۼLN/uϲOFm}3tCGm)B /u=ӓ+:ϧCa_pXs\mJU9,I]/P?Hś,<1tZ qeNr/Qΐol e?)AJ9z+) ^LNP4sYg}\R?*jr!FEV++ )'PKڥ9iz[>T?ԻI{_a^묮^~7*!W t9$S]{vOr^K̿v^/6=%Yt}{?Su*uH]3}I+UFҿ.˦'j>fp?ݚxƺu.BX?*d"do&OHto[7ɓ郟͡tx?rrCoR! cr׀$q/mgB;n'O[ ]͹oXw|o7*|Wb/R= kwqHť]K" On sO~9&EF1d90 |, <̫ӮIc.lⷢ7p`!ǰ"sz mAtz' s%h^^?:_E*V2)أY{~dN>][r?/YF-g=DMea-'[^0g[t i4K{rbDe>maNlCgy d ? 0'x> wqxcSyv/-穎%[`DH ({ZtcNuϝx]AτXV:O3?=N/ˑSf9ZO鸻r_R뉰~*rgL ny-bWl)p_z󧣯.V+wd229pU8?bp՛ -A_exA2|;6_o+yvx.03v'~}Bs b=S7gCg\]_Yթca2HߙdS/?wèQ-py-Yx8zGijE!t(at^d{܋}|UvZ)a]`ue?\e)֏)S#9~|u'a98%Cr7ѳTr9 uy7xr݋a^DI* ޿!zY&k~ { 5M2g݁_|`q߇y[?7,t%gex?}Gք)!!>ϐ-76t#w.rWk*S-ל/jqQeOg%=n&/Ͻ ܏CoǸ'R̓1=sȡ[ I'vEgo nn:.;6Cm=2I.o/t=i{IߕV9چzM,o(fhjX(1t}>Q~cg6vx$|P7Gw`N?x.4]::aMքsy|&) |e}~=?:rV t_لѽ9\!g1I9n;IyWxZI|F'm8-K^1s}/ g>mEoOtbGcDGo|n~;_r<|+ȑ.|%/-˘m^Sc=e֋PgGg >nzgHv&lD-On;#>z?ܻ§Hӏj /~y}ڊ^7>~)8grc-V<8'e˳~`MpCs7,kKo 3/wCߛi"O}ZF~] ~$yWij3o5 e ϟ{t_n=2OYM|$:=xW uCџ$/ F.G1gxQw\9v]*r?wz^/>5DO02OJ}0 0GiU?{Iܵ"6q昃2 v?{neO1&:}KV?,V#dRſq䘋߶r4Î8E4~,b?~$ELcܾ>R5!>?ɹ5zS˭J]"sc^-Qϥz+G 9vt7_=NtqAϙ=A,-]-ws$GoC{M-O/V W-r^Mt'F2EomNCEn-ϐkeΥ9ρ״s72g> wF%Źw6׿Y*5Ir1(rޟQroxZ݁>ZoE".еYx/j?W+U-Oy<:?g pxk |.>mov#8@9#sIп0-9Q >9QpT?{Y\&WH{ḾKyjy2'~Iz[ɱr ŋ}z^o'gpۻ hURzZoSSI 9Mɻϲݖn?Gwna=d7_Z =E?]6畣G#^{Ƀ!f{"@Aޓ ;=0ݷТ;_#!@{Ϲtط!#iD8Gg9y3MfZ ^. 79 8\nt#K3{6ע Zz_t=0Uv9|+Mh70g.C_2p N_9AZUA菗.[gy ~A+D2?7na} ݿ^ZV'=5c}f=X> y gV1.&hJsHt7}<a(I| k. 0 <}k-{)a9(eIwohtu|gQb+坷~V^!ȳ9ao4|G芚?];?[aH~+Fϧ2M]g_/>Ue5J#Ѵӵ-=%s)JqO4tFo%>'ZOcR@=||W4GDϛ >)ﯭǸW3z_pe)dZG/^=^]$%0=U=al}|JG‹o~6r oQQPzB> Ksp #7)r>g?`Wi<d~;g9G ^Nlݨ-_N1~+~}*y~6K_ܗvɽ9XWsO2_!p)>;>ڶ/. qt.~g.Y}?12ξQeYyi {M{|^!g]1'ЧwQW6V'bzcࣗ7|Nr~\oQt啟~Γ㉴J<z3ot/F&=0 O֛7# |CoGLqb~G|O]Vx߃[_z2LΉ\ w+]޷3sI#c^;wYY}u>Kc+R|>·,=Z{Y/U1t Y6,EW^OjE =NZFC#97\zӛ<>MNch3:MNr>rgK[ȳ z|)^ܙ9Ǐ"Orr_)G>V Y#sW}=BJuoSo]bbsZ['? _Gbޖ 7tgAA'3 O^?3yl',RHqp/+qK: 7uL=ۿ/l5Xɿݣٓ-Gd3kh!Z>ն_$;u}V<S6Yo?scR).<|ȵb1_jy0Y!#||6ʽ~Ow^r#F,9I.DO>>|brat S?}R0R>;=vН4maCvȿ~F/d>Wr'>oKzesf|P}{绗|gsI%/gx,u[{sO8YQ]ߖQ@k_<r$rZ=z1z nn9FM)Zɏ?zlFo\ ~Rg'0/O 53Xt5:.3< z@WZRr{<G/Xn<}pl[Kмo]7NLɳg{yr.%|Cgߝo~Hȗ?F7[k= 2i?ȦB̉?$|mkoWXIcg铼o9Z ^}v}Ei0h MdɊ?d)۟6M`Ͻyz=|=h1wb7Egwh.>:a˯k)oPY<ܐ}͚!h5=;AoDOӏ>|:_swWo6v-A/~C֟*A(_פV;UWW0(p^u|J?u5Y ágH`H$V-ǯvcFG/X󅧿(ŜJQx돆~z?-rɩ$ݺ [ٱ;~ yG{ s.9ݶq^YJ3У־UWN83dN5n:YU#l2\}S񗋺>rG =Wԅ7`|o6cͽZ >`d/ϋZc;\Z-I08 dͮeݷAy扵Ma+ǘ{E[E^XþiuII )%ǟSwH0zomy>/s=<Izd̗Շbi 5/ǧ2WC ͗x@Ohhi'isVpJPznE|eifdz 9Z >cιm:fж7Αo>/}|Vft}qu|@t~\͛߼?>/: Zzi ֬YHkOuiL}Mw#i% a4j;~Azn?=Mz 0+\ߊ0Ȟ}g4RUxLEW1yO"G~9m,>[ >S A7?UuTp8_^)m\|jKO˸wK7!X3֍'$:+z-]^[.>mN O^GnxUF=wIze'U yc=t 8QC.>ym‚7_YaG7V|+^]^}z {~ 082ݗlo'>0{ӝ֋ k}ϯ_Smg"t񜗢S qC3k=y9z~6҇=:jp>'=̯Xhm~"~KGΒsVL[As9>`zF7"pRNo}g?9|RDNWs|slF\u9 'L#\.cÃCJ:~cߜ'Sw<[ˏy|K֏3<7p=M7F$~" `yn;o׌n_8Yߡw{n$x/g$'R</+15Ho602G|u?&=I1t].+Z$txrrr5ȣ^&9zMsq y>IT5F =xaQ|;(BWj2H?B-}8-oN W)>x6>˳^} >{C.?_!ăt ̏'n}WqeGǿί/QU,?pRh!|N[Ϣ@w,,\$az"޴] $}]gc:\Jڻ➾Vxe-Mξ\B?.}`2rt{쫫{/i%[s.^RKeCB c=v|E?9Onp#8z]%YFk =3:>ly hyKO4?g3}?_>`f]?Qh5eZpY~;w^*%ቷ&3͡93{gǿN;:jV-3M>V}i`I8e^$Ϟ5`~B :μ5Ts7x|Xy` |+ 6N+ƽkJ֟}o5h_QסGn ro5U/s_O1ܫj 'jjyz _LC\.~?3~taZ$}MWpo^{R ggI-k5BOאW?b,Gs2y!6橅T>4߃NACOϹǛ^&xB9mcmt%1.e,'ikp|T=.Drjs"ۆl,o]9S</7,)t駷yGilOP}Nm9}ǔ 'ǝst~?|^<ZFo}o^]w+<7ant+vܹ t <$AnORڸNW gn}ϧ?qg7ku9'}]K*Ϻ~nѻT:Z([// >EUS t)Wt~Y݋DehG^> ǿm]6>ksAx:55=]4z#Ga,}1~MOg.ȢƏpX-q|/_i(_wev{νWǞ5^SIٳ]qD1g9ε_9}6#JmIX^U\+p/NXۋ=YYa8K<re|t܃ޫn0 @'.k_4w {z}3?p0uknφTR*̹@oԝ2|LFq%VC;U"g\b|}zszOJ^>~f6^ӳvl|Y.$|g͵қ/W^yX+%BaCći!yEd[g~'zlчߝb_L\ Mt9c.ћJ|BÎOzpx]os߸Dk7xα%[O6-7={l~-G>H/͎qs!{ gl5 t.SOs9~{..Q>9Bzڏ^\T,!W59#>/N~UH)|92ccׁ?3Fqxthؗn<͝=??&ɽÅߐ ]{qO[o|t}~}O6$,Z?K3~%q㜴<4wρtc1kce-< [P{ToPr_d6N,E˟/JoFk[I{t^A.JJy~1O/cfo{d1x>~zuQ3z$˜2BuAFcz6әIrTO|?ŋ>Seys8Z%Xak˃0>r:8Oow\xm炱I<+FNx5Ѕ[N>̜3`Y"=H>=B39>2?]:og\ᡭdQj={o[W\ط$H w-e~h7~rDoi~]?=Z 9zmBet]YWΚ\a0g>zK}UكcGK.rr'|# 5+Mj]o'T.Ati~gC~ (~UЅ>`;sBvݞ\<9(yѦE\N}&a@-B;3Mry(2rAbc1&#e{XRj|L,b:vc:lA(~xl'?{ SWKѷ[iw{(|,v6քO//ME+,_U0E zo#LMrx]ہXS-ywn\̵~S3 ^.^ƽ驙%5Ϲ=%gpSx+K[" 7(w:/>1g֡C^:x~aYS=YoQ;atk'Cߍg970tb4 9ɽߓ'Lݡqy,[[N#m3:޷4}3Z؏uB^ޕOPz3sv5p^. >$"ƜF_3e{̽WN?:Q띮Şb~?+[^-*Mr< ~6;x~v1OYO=sbyB>Q^Kśs^k/x{ы+G,ŗ9d |-ytJ'}d1̳WqZq|}!]WKesyg\Ue9|^}_'0oV0&&?;^pE}]~~8sT]tR.wo>$)LwyXD~ ϓA`3=飗(~1NNGsI⫵|q ^Mola a |U? §{j/ܘh )|ixz{S%7O|[F0hG=coZtA6=-C^^?Y:MB }]x?(dO7*1|#irAӱUq:khϳ9&8W3{zo,J(k꼄uS!zƘ϶<5[^gOOvb CwҌ ~>/У zsMS^m˛9?9~y"}'ϫ=W>'d_lB&֓vFmA8{Q 8x<|LI>$p{r2Lsy_Z àP3'X<_!zYлԣ{i}^:%1 S˵JpTJ|yz^؏}%ӡE_Ʒ?//yuϾ!}_FKн&) pbw;f;|Qg B#ܗgKs;poh~ߺkÁG9񳧔/\I?Fn%J$y4b=q~:r7|x~ ;mǏn߮oٻ?{$t뺜6O=<~UwgkUaїY09F>m7>1|pQk)90{A 򯴍?V_|/h9=y-R/ՀÓfe2MIp!L$|R=.WXAXc<2X.:b^F _wW%}ҁ. _uMEt:6U2?W:&?s/I.rNu_o;۪/_Z֫[ L'W>Ktg N⍽?K7zȩ7=.y݅j{>wO V뛰17_Ț?|eҼ]C;}cEm?xnAoVFn1aӥ,JΗ,վ/}w׎1rAWcD)Mpt95 Y\8}~_pxؾ䥈\ zȋ@)}.OmnMqO '1NkQBQ-mo8L.\]/Γ};ч/_&Q'dp᱾K^ev^V_\//{.cun >7k8:1N{-栘y~)㱓 _|c/xg/S!{~. _(QN[] _{Y]<~ -ys᧧xZ&<.\N{݅$`_zz_YsN}F7g~H;]ԝ+NW"ηo+\jtN!ry_._̉zN^UbkFΟ1o~w8GMi<d}CKIz?{_%G I%=}$&SαFgB5y{n3.HO&6xs>ywT͢xJ qtY Jy.t3Iϩ欧>]_助`|~pI3>C/&tyr?G+)I %4q s xug3gZvziWfdɳX/V; |Iot҉>^r .Q!2_i~GD~n;;{v3} łnR g.gzUt-]}NlwW׊D[QqQ|_r7|01 {7;_5ݾ,{ش'F%ϒO>NsYΣ8ϩ$87zsdz2>i= |"h &2sh=.6o_'s1;M~|c1=nqk>_:]"/5AsDbsI{ |}/+7>y彑g>SFsc^էyo?vyk?|9q-(kiZk @ ո) Hwda^ЁyN/]}^58|B!ַ4{hثc\z| yd9`[\3i_oH뭅 ,ȉ-җn` ^ߙ gYz k8j} sG/lsAvWO\فN`n|zϭ_C$[PiQ 13ϗzź?-GLnoSF^~˧7}>62ߑߦ#3[A.לD_%3C}r 4{3^F]'a&_Ku!VOڰ Zyƛ'M v֌t̷$W,zDt?¾!k8yS8S9G{5bNy\c,u9X7kK|VO M>r/ϳO,I-NK<곎8ygVX*z+\LЇ%')Q?|$3N[6q;O@W&:1N:Ot#e 囅rcuSz@%zD` KN!;"r(R ҫJ" a^2$ӳOzON?9INrz$>0o~s]1C&9w",oF6:/DNN9t]躔B^7P-W>Xk=X5։v4sG? X ;OI:OƯ^ߌE#8k5:ˡ/?gHw};>u+ms3R}'0nq睎QWI0O9&ot7wԷ1;=<0|H-*3MKf~ <.xϘFu|%j~># rV#.xN毅tӯ)ɛS F(!ֿ:y޸:=YԻo@'q+8Q%_O~MWVyb9yw3>NqߖV|hݲRrs/4zG2(1έU;ϺhKh5!m!|"̥8Cs o\z wR|{4M#$z/{Y$o02-}5/,l ub#/".e Bsy:K[7ߐuܳ_*~F`?_e_~`bl_O_On-t c@Yd:x <0Uc!dj9<%G`ClJggwD$o"6?xPmۯ%b.u[oxRxP/?k]+o\3L. SW{jsȌۿWxd!XZ^ԇL-OB+y<{Ƒڅ_bmG,7`$l^i8&x]Sz\jC~z\~gK~SV}S୭v)⧎[x_;8WwAћm*|,OW |r_o[J[Յo󝔳胛G[N@10mV&iڎOd'x5^l  GBe P3nFG=-EmsWg}-{}d/0ת4џxus,xB/.{j+xiֺ)OSgωxbvmYƺпC5G07H=nQ£7>cwi~\ױc۬~rj3,Y쒓__V._2آ1|4tJNQcCsI'6es^CܺVxK5)lV?nxK[#SeaB}.~N]:~\a`*] 6EK=0|jSYr= X3x_#d>aeR9g:hgp\^LSҏ֡3?^+I:|(?FSs&5BQ _]Ghir*U^6LB3{3?}'+QmLG®>n~[m7UoɌJ ƮΏ5* F<.`S0*_*W(l~1?րsGH#v^@эH|it>|iߔo!|d猿ղQAC/\K%^@{Џ})!g,x/sX Eat{M|6j7҇ODGhiaI`ۡs?/NxK|ņ&b+? r+:'RAٍ_fh'u u6|H7>|೟oF?tvsN%}MS#yȣԾ|_M ~T \b_j$YQ|'m>8J_.e1_ranѺmutĒߵ]1_-n7yZ/ʓ$/`EG!MBb~s!犼`ǧapoR\;S޳0*NYCN~y;,VũGgn:Y}5d1c9j<(ӡ"xߒa>nyi):-B~+^9噗.WbqgԿRk9j' \I`vR:\*/4ϩP=3'yc -1%7-C35gz]Rg^MW.q89oEs>y;28fW=.cWMh5ZqgwgSSwi_zk4J?t2:>h9;jx(?+{V}#B^R4S's8Gw.RZqB?]sB=xO3?Oh~Due9jk?3;eK]O+M\t,#ќ}'kf-,ЉZY|?Vҟ++O+R\ޕp?\уK=p邭YO7R_^x뇶]Q5wk?J(\'sF#ݔٛrR⛓=vā'\xGĦ/J/}n>WJgm*=9cy<;}]7~$^4'-c{4B\D73KQ/\ 9FoC8f[Я7P[rKu>iMl(ȲȺ nrȽc^c̓4Jx ~9-ڇr zcuNIp-y9He&NdpG ,rMA+y  mN˜ˋ r9c,yVYyO?S2O'4o|dZ +GgB_s',7y|zbO6~>J~Fk2e@(<.ۿeYy% oMr~Z'zL% N;ԵҰSnwO g'?P|-Y=oiy)<,Pѐ4VX"kk1\{ 7b|z2^vIЕůu|VJ)x>p&/[l- { s~ ҄y-I^W:|T|O%2[~gdA㑤?a|1E޽J?sAtWMg|R\|[k-#8ѯW ̸9vtwhQ0-ݦĊ85}T7~ eių7&Ja‰3MRӻy;Hs/C)C2g7|LIR['_sLoaU~ 酘s's3c9I\ۊ/(srXA2ט oN7>0yb'9MQF]) αBv19t803>YuJr52>zxQevyp5KvPg{G=Z\KM7ͽw+5Z^ĖUy8m'ܧYW0w3;p-nΉϤuc?8b> o 7u]fʧh蠾774źRe^WOe~'e-j}zx}?u_ğ;Ob.уi:a`ޚ;j~at!xOE.ouu}QGa|y\n|9"ko GTyRr^ Ǘc_]'8s3MVuI0_4^'_)M.q<!gOgVyl ZY7{׿=ZOiʽs gaĸ\.~rsInƏyGK }Pu}ld5*?r<$Y,V}Qt|&\^oǚ9U\qkU_^*.>x:Zϖ $C)MwWɺ]KP@mJFi2҈_8|h sO,k0}b] :?ˋ1p |S#_O~_|,sx6?<'nEdeiW0?%m`{dH!1r(rsnd%9~j:o<*6p8YHr4I^a!ucS?oU&v,tuMc84);dڑe<1<^8~ڻ Q>a>y^U,7LΊ1&CױsGcK;f!wWs 7˂vXCe;=wOй>M.M90SO^۵/v﴿Eͽ$u=T x-}39iStr{ز;ɊBp6=QO~{|,g r}j~Rw %ɧr-_ucb*Kޔ9a|d𒻩%W8%瞃#Q[ϡN*7?KᩬG/|%8 Pܒ9F#_fd$GUs{?3?H]̟=RVZ?B߿S=>}:% c szf罝1x0O,.i",myos?w3.uO~~l}g.N sun#ݻ DN)/kNߑ<>~7qMKa Co\>ϭ\SwyΨZi_ZEe!ѓJ cq("Ql^yit:Mn'^p*27_M3N q1tX`p!:oh2yoE}h<]װ-i͟0J=꺩ED>tsj_&ÞwW+:ozT\p62׳|(~Ŝgɯ^˜f7m }.㚂w_f-Ornc\[Y;ڂdgy噠Dgd|ؖ{[~§L9'tJctnpQ73WC9>tk'Wg?ty1F2Qϖ\ ucuykKvKdq$\֫H0jMl?, ?k=<$jOj 0›D;y;A-G)M/Ci1C)&؏?rcjt4rA ] A"Խ^tZcI!FYn/TRǨ;km_k)|Ǚ{gO/ļl*B=\[9/$ d~ ~謥 j7.r(˾ @_'v me/tE4~x̅d ӽ3Lٵ_]b }jiڝ3.+I ~)w(v9z 2L[YrɃk/Qus lۇ<>3 ·F_'YܽBcxG'}8e/|`m]8iy)yvRo@ϖM9o{(\19(jW-uϪvA`>t}<.[:?0N=z}?νx+>}a*;ĜRԇL7_M[WE/V#vx,Y3Y'n`?bC%1s%f z&8Ӵ\n02} zg'tyVyM}/sλT۾TL͙}/˫Ig.aZtWߚCn~hfG_'>ׁ+ knR)vo%g<~az䚊:]8֧S1$ ~O8x93ъ߈|ޣqxܟ+tX9Kʑ0>FIoJ<>;BY|G17t7x^(OEss|kKdc9꡿1ޢ:>'9V7{ Jo>l3.LT%ApAgI/x~sW~4ߦŮ/(1_g.buxWͿ4l9D?W '+]s0V1w@>\~(΅:x^S cu3ë Ɵ5 1 6|_I9?4I1.~f桵|^eߙ:颯y:r`,%a}w?@:-C3'8>r16r~!{e|~<& @h~HyKq9]W_{ d'׺'O}nwۊAtK3SS/9 "̜zq0oi<xYyןI9V-<5俳ݿku? >F4|~t?nzw'ଚs|[Nx>k'1Y͜ǜ,,u7I?\ιdEu_?A+s/xR\axLrM9^+d!:86,>w?(u KE˝)V~(%ov|j|m^%\gp n|d'Wkt'ʀk?9g=s%'M=YlO-7{3ÜhX$7o"S9>[Ws^4_v/A\np0s734.+MoaѐNέ(~6Jn%9g}cuK%^wFƸ??3Q{o6y)|:_~9x_|~x(-[wi 3DWZ~)~R* *MПD[ߊ=ǹ9i!X 81k 6]%M#(s7wӜ;c>}_جi+ߌ~NA̕qKuy}>|܃2j~2]o>v>%o 6r3ISR׼x`Rrڵ݋ν#c#=JMrk,Axm3Zb_\xg@6kjpXiww}t/D7l)|<6xSocé_ g-/ ?{OD;5\j}u}Hg @?K:Qꨃj}n>r2 /ߔ=W 4>K;p~j9׎|A"Zgv>Z6?ҦeduH~4< ?~6\g;؇O}!6u>o!|HK8^/:FQryۅ^0̜, ͼѯ?E~$#Os߄Oκ} \"_j|F3j|Y޻?;{c |~\rw3?N2ba%8ߟr.<핑%֥>agr= 4 0{*Q~2#>+cfgٷGw̔Jǘ$F>֝&`қ|#1AoHY;^#WhG0_mV Ww^!m,?| MA)琯ſ܇ ~Z:郿 PQ'"!Ert / ܖWu|:_!on~^~[\]-i/[ߔ`S]cmVS7 |%|Ձ/'ip4S1$Ax&S'2%+S^762Wԙ)Ûob]:+<[QU3[Ook;=G%W|h}מS\* _n#GcSi}j|OڏNf$ _z|Lo>F <xk'R!ځT{cIs|v?s/S/0K_5//랫/ (}Gr㎟{Gw3ɃEQ2Su3RJX+ b9w?/͍үn9H'~Ӭ1F,˙0_? ̄ /ډ1yOO}%u2_Vp7޲%O:w :: o:r xІn~G|O%ooqu2=X?zsuW Wdzn]U[s]hAC=׭Vu~OuOx b.Ч4Ke[̵v2?uO>nPvr/Z&}Z}[us6~Q}_d_2N1 ozu,~jqIjcpovp(}I}.~v|gGlU?K$)żrGЇyjƫ k9C~M̉^Bm>o92r^Ǩ_hy3}LMȜ5?|Nn<םzŬy:,wWoYv nI-?}:@gI2_;5@%هXLM.<}ļf"vZ/&-飲Xއqж? }7i%~hdXxTcm_ \|kKx_Oo~R}z<:!|59:n IХi 8ӀW޷l4Ft.v/|U[_.vwЇM)wOK uS}D c#41్M˅hVtu!Vfu |tVy|O?yh!F3Q2Wj篭?_%1_{r-e@++c Nz_}\L"qNAL߇R\p/.8}=2Ţ`+x>bz_|֛9߭H7Ef_jm$96sZ=56rQ ߭<|hy ϩr pC,w?|]wc3[oPƮ oNwG%U?t ;F,uL '~JZGU ՟|=}*VW4j 8܏.sY7Ce*F\_Tw:$}c|{ʍPR䴧 _%Kȓ= \c~x%́gmeq7X<7|7wsY#L[.^=x_;}LO:=)S4|\&[ZPG]0t_~}O}HɫH~|pm>ꢮBXگF,MY~|H͛ N][H]IN._ۼ?D(w'XccSxE_OV{i__}Fy?`^Y^PUO0\}͕S_Iu'u {˹l}v ?|,ނ޸tb9|WK:Fcd 0gg-QTy7i];'O}4aUm.AGg'EɩgP|yEvr8#ǽӅηP'|SOc-# xOz|;>M-xRШ)G)J/y,w27?e>^*nj}!/K'gz:sJE X;XG<WWRԃ5w/̾i^M|a1֛!o+W˥_ JSƟBk?K󾥋zu=U?2c'LmqdV '=p,> 'UM_ڼAQw3WOwywlg=P/|?~<Ȼk>8?_tKn,R'b$j|N/v>zh6qROtp{wss~0o||? =lä\<#%$J>x>tĩ\t>vh&5d)|#߯wp0-c=ớgy|٧b_<+=rs {sMQG./>4,s?p9^{cӽ[*u9(znt+~qtI o;Gpw 0G0w #_Oj|lxWE*ﺬ)*wj~m{slj'hxx-b+5 |#t'Zzko9 CSjds&]kgo0>1=8\VZvͯON5U䒆N22a2n5,aylyG'ȃߙOB| RC5O 9 ßvZ9g`_+&c^9IydË'`vsnֵxW:Z\&MAC_Qkp=c8^D;u/CEgwza-NA\~_/Ȓz:9:'Gc9[Sg?8s-8g?F'?LFy,s( s.b`:d;Gx}|҃&qt_C}ay/XW˹Ə%YC/uT:?%_33韾xj'.~/35{lVKܩOa d5U%p9 , \`&xӏ'K {[O0{ }&?Ӯ|vN;)5>r':vxiҲmm;| FG3Ż)Yf~|^JX 񳘇Xum| " r.gzW,#>\ =Uk^x+s͍{NL:@}[W?u+e=2>|Fw~i>Ud σC8/.oI7ŝ5Gڇ/GrÅe=ʭ % <";ZW0lՖ?WV7M}AM/P2 Sڊ@ y1α-3ϫF_qZj?V⯰)|<Ԩoj i}O<=`1)E_\ۤѽj5}^j؝+ozG.~4|l+=O.nJ |?>ز?HIv_)4rc*[Qo:yzE 3OEWCe;yJ3}J6󩫌7o%9Z~11O]}Z½m^jՁeRB9G2uj~#~{tK?:}9+t|2ܑrv+wO4;rPd v\+V{ίtF<ˇuoxV3`O$Qȏz>eF]Z&OZjluW'c/{.q?5e:3H-ǽ\4N_JYPبgZlsO㏋}~|%$?dZ~]K AW{u7(ֿ\ϰxf }_~aP m1_:/2WSM^D 9QїYy| Vjcy- 93Y72 R(9mrwi h椲_ywxlxFj>&=:=nTl>t3ß!+dS<$k:ȹf9z ez?2ѕNx'YAs.Z.mky:pWgˋ-?1݋g=7eH|h_tԸ S$ѭDkoϜ,s 6>`)g? >>+U G>L:kx!xqfo^fap$_O%e>Rc_ x1 N?E^ǠSdz <MćvpLި[up%CRW|Lm9X/~AWv 7[_ÏÇ1_$נsR/y =Dxq?k |bz 7gi;姉nouϕ uBbc=ѥ7<|d K-/s<ofWo37I$JD?Iڜ|=}/ivc|tk_:DMC#lv3yBtsJ8'Ws_mğ+3|X|0PxZI=x1c#y&$z_|ȃlBc}H:+oN|?y߃O9[>zwxIN3=ȺW?{w&* vu1&VEo ݯ.$K?-`[ȣɢrx_›\qߑ\E &[kyRG`=eS-RLׂ_7,? ~6<ƟvfgL#Iv7~uV=~@^5R,r?Vm #^ā"Jn$Oޟ{ J~g켾{k06=>F/ƹg'26667lqyCź ĞwonP u?<(o(YGo癗=qK\U 2d KS!o\#wһt7>$]o+r"Ag9&C e-@Oέ\Zˍ0.9R=oN3|9pZsVמ].ۘrW7`-ĸi:M?ո>Fs9Qr>qtOU^Wd -{ݕ_y氍?_uQ?:.–#YW|{y 0wG1t8ktaw>QKq ީ`BQ37? ]p19nl^o{{2_ +<垙Wg!R#w~YZq+Ǐ~oL{|M֐^EB:Q*؏עȖcs= isjy2ƓB^bx6_ SwWr"bLU"t'$J_b^|rxV/x`k>~Ŋ7 +<;O4(yE֠徃^XOߘ݇~|᪀vM; P<"yV'yh|4n FߑGؽd|ح7.]rLmcb׫IߴR9rEjl߯eY謣 ^ ugoqj9zx9^WEY@g >C_^Yn,m˫ŧߡ{ _c 2;my21͑߰>摟G1<|\ևmd'z>[osS*?QGFW{uKH| 7/F{F$T!:@77vs0|G! |y/M\=UE#l>G>7:J ?}F}ao烧o}9|8,i+g2jWםSħRU;%ܪv: v :>|k#x|6at Ʒ-x5M.S|Cwuԝ= O΃YX9WQ < O5ysorDw=i"=$:_G!W.lk7QT_lY4tJ9 \ 9yZ||L])a8b9\Cc l+y<7fkϙIKK1qɋ4ͼ ~U >oKJ8L KSgЇ<7F:&Տp߯=,9]pD.\f9EVxQp:>*t p >hyu8g99/q~O[~UwB$tK3_o|w#ɺ )8{)n? W>H|KZM@6q*ɋ(x1ZzaUu^d| 㷓ķs/X3vQ5R9_lecyQ|GM_S77~{+ARw<~?GpGr}J ޤQM7Q >M=Vn1 e'/6/6|%.wUP/?s/o<{'A1|XISE.k|}C<@MΊ$э_(~q#|!W{ .<.;SN/sPi\]Y-W|Cҿ:#_Ƌ:avMAcƣ1:xc^k#5lf?$4Ek|O_~eN4>^z̓ƒ߳Dї%UNI†4_TAAL?ky +RZg{]'U:-'glj:7DM$<'ՇwwgtSYrCW:1j?&|y\V?Z֚#~ZQ c$I| O2?%A!؀x7_+elu>cf5k/%p [~ UW>uϲjeeʃ%K5{>I揾-f/yc3#>f3x溉w?<~]k!s8G;G 8O1p[\ׇCBy3s5uυ~r N)u3?T;4“:7|>TR <1gKkkX .# t: _*|n7}kBE貘;KFu.|3J6[.9cO6uW  O s^K+A,>,srdqZm?uP px}q2r*t&sѡ71O{UKzpC&Ibvo%Ǥ# o#:=:H gU/zɹZ g~^S(!75!DgycLDZ ܰBynӊMPlO+uVѿMW 6o[ +'k s7ã4.)Z_ſtr// ?YN#7W+i3Óy9CRԳ//Pw1PauKPo x%{ZƝoR=Bp%T~itWj:~(EzXS3?H?xi^n2Fm<:)!ߦ \Ƒ_"1Q#N)Η I. ; ' l9,:po.EN_&bA#nOu\b:*(|9ePx4Z,gr¤n=N,DH\%&֏.=ف?U?kE|AP^mcf[o%xExg n}L63qPXJyv֝:Qne}v|GJ0Í0w<8LitϨ;%0d>y#d*>nIq}wu^J KɑߋNV;ke;)y}訬!Bx rLf',ޗr%w> uW ~7@2tΦc݊iSF?rkw+CKGǯ=e-f;W!D6y2p6߇yY+9g#Cѫ#U˹dbCN7o:`|洶SޭM_?"{ϓ&Y'c9g߆Νu#D?3,AQ OCw;< .a.sqwe%p\#7 ϟ5_$HLH>x%ֻ>Qz 2>|8:!#=>̡|6ۘTGF NZCKus oz`u!|}Aù|@ҔzAa/K uU7usQ(|&pV6&ふ7}3$3 XaO>?m_.β~fz 3 O5–3/'G/:|̳_ 5m)I^]஖9/_k{/WýՏrzjpnu4pY~xWqp.Ų|^%4ގ:_MSz3Q?G;>>n' }tp$R\ÜSt'/o:¼ts ~5wɋ}I\ ?vx);K~§k_`QI}5J~g AǩZ|V$n`.燗EObook6wsOz#BW7s%k]eG9+̣$ r3%e.E7tm%'QKgy`Ӈ;֏3w"pWyA|byG]yܱCY!zb>[sY扁xӕjPrյ?.Ωa>g[SIg~ԅw'ɠ<~*Dk!wMo;]< ~9_;V$%,^jhxb2,}&tT?|}rtm>X}ɺyE=># - e5<)r4s/~~[w' /| +7],8*y:2mԿv^U`i~A ]x qY|\FSg.??"/3M9? ?΀v9zv>Mr5 ^4/`Ѫ%SL Iq.[<>йr"q~_Bl't}.,aI tyH.:{?^R_<*piA%{$]yM{Z:=6,'Mglcֿْͻit3UGl괮}`#7L]'X&qj| j^ Z4|ן;-.'[XnG >fs/`c~=2˽3\Ax2zw$}  %ۉB3Rݿ-;}bA6T2nqȢO]r#z*o`j϶ Z͟~Dso]RctV.MRivww]Ə ^8YrWKq)2 Ns|P zČʺHc|T~qH.TN=~֯ty'Cj?}k[wÛO&QC?G^fCwGבI̖-OoxO2IÜOG'WKܝjJ)g2RGC~z5/2t`xk?N@{$I [[ED?&]k|`L{lAky/l.xҁP|$b3xO7}Hy.=f6G]\P,Ǯ_O{cx͝+\/E4WR/N-j~jX_̧J pI|)y&Q3ŕ ķ/zYnS׿)J?@6 a|—S4ꞏVGm|`_q=#e§mcƧtJs}dw0mFϺxlv&+ 3SnL/n^V?i&Stk3_zP;tk5߶ƻG>`#-r!W~5y)$Gs13{f+)=Gg@kexDr4?a)|S9^Fܹ"QxǕ8^0u:~6O~#}y9WHC|>7(yeSuols8H:Jp޷ɏWVG[n#uun=屶s5nCmJo3*-{xEV ~-qxaNg.n9)|z,GtgǢk>ER61.[͜ Mxo`si۳7(Rp8gx=GP{W1-~yG{,ӧj8xNJ|cB 9r׹zF;|KgRdTƿC(Cj ~ O*@A!xIy #[G[q`Ij"mɖ7 <|]ٿcrtRWp. Ο<`e,~p2L3Ow xlYߣyae!;euAw/eqg>^zÒ7iurɖKzl D%A/:<(xWGxziIX.\71WN7?Vt],auK9\, ?J#(n?fqLoD'jiz5ƜΣD{ue <[{51z)r4翈t`jػmkev;}TЗϥ1 (ii\JZj~J,ws+ ?Oqf7ȣ7zMH.dRg e& UۈkoK$x>%72/-μt)tMsgW|o{b9IpX絹ߢ172[/pVt>G\ᙬ( :| WHf786NO> u?ZOyml\q?9%#kg|duóYg_dfJ rȋqˣFw'ml> t s*y]=oj_5)o3 Q7K&}Nxe*<1qA]n]&̇~|?s5p/Xs=u B|NַB Ar[leNcn/_SaޅyrN8sVyu#iJOCۘ›ppglᗨٳGl%|qX  5ݠ>/9}GMr?ijG< ?cΟ!o\6Ic 錴n~<#Go1yf.Gࣚ_N7Zڅƃ'OϷYn~o|tXG [O?g1&ooFͧ<W㬧G!Ek% y: ߻fk>O!o% = Nh>X Uo{berVbABg|bMr)O9lσn?>6_07?Gx_O=m穟qϺbװw }}_/cܿ+~}OWؤL=?Cşşs2~ wN= `~>~Q|'}E>{z?Ɵg;?}SuOO޷ߩ4~i|=;ün{' )~_??}߾s߮\;~m73?|ͷ=^}޷; glmnet/vignettes/assets/glmnet_refs.bib0000644000176200001440000001054313555633674020061 0ustar liggesusers@article{glmnet, author = {Jerome Friedman and Trevor Hastie and Robert Tibshirani}, title = {Regularization Paths for Generalized Linear Models via Coordinate Descent}, journal = {Journal of Statistical Software, Articles}, volume = {33}, number = {1}, year = {2010}, keywords = {}, abstract = {We develop fast algorithms for estimation of generalized linear models with convex penalties. The models include linear regression, two-class logistic regression, and multi- nomial regression problems while the penalties include ℓ1 (the lasso), ℓ2 (ridge regression) and mixtures of the two (the elastic net). The algorithms use cyclical coordinate descent, computed along a regularization path. The methods can handle large problems and can also deal efficiently with sparse features. In comparative timings we find that the new algorithms are considerably faster than competing methods.}, issn = {1548-7660}, pages = {1--22}, doi = {10.18637/jss.v033.i01}, url = {https://www.jstatsoft.org/v033/i01} } @article{coxnet, author = {Noah Simon and Jerome Friedman and Trevor Hastie and Robert Tibshirani}, title = {Regularization Paths for Cox's Proportional Hazards Model via Coordinate Descent}, journal = {Journal of Statistical Software, Articles}, volume = {39}, number = {5}, year = {2011}, keywords = {}, abstract = {We introduce a pathwise algorithm for the Cox proportional hazards model, regularized by convex combinations of l1 and l2 penalties (elastic net). Our algorithm fits via cyclical coordinate descent, and employs warm starts to find a solution along a regularization path. We demonstrate the efficacy of our algorithm on real and simulated data sets, and find considerable speedup between our algorithm and competing methods.}, issn = {1548-7660}, pages = {1--13}, doi = {10.18637/jss.v039.i05}, url = {https://www.jstatsoft.org/v039/i05} } @article{strongrules, author = {Robert Tibshirani and Jacob Bien and Jerome Friedman and Trevor Hastie and Noah Simon and Jonathan Taylor and Ryan Tibshirani}, title = {Strong rules for discarding predictors in lasso-type problems}, journal = {Journal of the Royal Statistical Society: Series B (Statistical Methodology)}, volume = {74}, number = {2}, pages = {245-266}, keywords = {Convex optimization, Lasso, l1-regularization, Screening, Sparsity}, doi = {10.1111/j.1467-9868.2011.01004.x}, url = {https://rss.onlinelibrary.wiley.com/doi/abs/10.1111/j.1467-9868.2011.01004.x}, eprint = {https://rss.onlinelibrary.wiley.com/doi/pdf/10.1111/j.1467-9868.2011.01004.x}, abstract = {Summary.  We consider rules for discarding predictors in lasso regression and related problems, for computational efficiency. El Ghaoui and his colleagues have proposed ‘SAFE’ rules, based on univariate inner products between each predictor and the outcome, which guarantee that a coefficient will be 0 in the solution vector. This provides a reduction in the number of variables that need to be entered into the optimization. We propose strong rules that are very simple and yet screen out far more predictors than the SAFE rules. This great practical improvement comes at a price: the strong rules are not foolproof and can mistakenly discard active predictors, i.e. predictors that have non-zero coefficients in the solution. We therefore combine them with simple checks of the Karush–Kuhn–Tucker conditions to ensure that the exact solution to the convex problem is delivered. Of course, any (approximate) screening method can be combined with the Karush–Kuhn–Tucker conditions to ensure the exact solution; the strength of the strong rules lies in the fact that, in practice, they discard a very large number of the inactive predictors and almost never commit mistakes. We also derive conditions under which they are foolproof. Strong rules provide substantial savings in computational time for a variety of statistical optimization problems.}, year = {2012} } @misc{block, Author = {Noah Simon and Jerome Friedman and Trevor Hastie}, Title = {A Blockwise Descent Algorithm for Group-penalized Multiresponse and Multinomial Regression}, Year = {2013}, Eprint = {arXiv:1311.6529}, } @misc{best_subset, Author = {Trevor Hastie and Robert Tibshirani and Ryan Tibshirani}, Title = {Extended Comparisons of Best Subset Selection, Forward Stepwise Selection, and the Lasso}, Year = {2017}, Eprint = {arXiv:1707.08692}, }glmnet/vignettes/glmnet.Rmd0000644000176200001440000014705213557666310015527 0ustar liggesusers--- title: "An Introduction to `glmnet`" author: "Trevor Hastie and Junyang Qian" date: "September 13, 2016" bibliography: assets/glmnet_refs.bib link-citations: true output: pdf_document: fig_caption: yes toc: yes toc_depth: 3 vignette: > %\VignetteIndexEntry{An Introduction to glmnet} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} --- ## Introduction Glmnet is a package that fits a generalized linear model via penalized maximum likelihood. The regularization path is computed for the lasso or elasticnet penalty at a grid of values for the regularization parameter lambda. The algorithm is extremely fast, and can exploit sparsity in the input matrix `x`. It fits linear, logistic and multinomial, poisson, and Cox regression models. A variety of predictions can be made from the fitted models. It can also fit multi-response linear regression. The authors of glmnet are Jerome Friedman, Trevor Hastie, Rob Tibshirani and Noah Simon, and the R package is maintained by Trevor Hastie. The matlab version of glmnet is maintained by Junyang Qian. This vignette describes the usage of glmnet in R. There is an additional vignette for the new `relaxed` features in `glmnet`, along with some new capabilities. There is as well a vignette devoted to Cox models in `glmnet`. `glmnet` solves the following problem $$ \min_{\beta_0,\beta} \frac{1}{N} \sum_{i=1}^{N} w_i l(y_i,\beta_0+\beta^T x_i) + \lambda\left[(1-\alpha)||\beta||_2^2/2 + \alpha ||\beta||_1\right], $$ over a grid of values of $\lambda$ covering the entire range. Here $l(y,\eta)$ is the negative log-likelihood contribution for observation $i$; e.g. for the Gaussian case it is $\frac{1}{2}(y-\eta)^2$. The _elastic-net_ penalty is controlled by $\alpha$, and bridges the gap between lasso ($\alpha=1$, the default) and ridge ($\alpha=0$). The tuning parameter $\lambda$ controls the overall strength of the penalty. It is known that the ridge penalty shrinks the coefficients of correlated predictors towards each other while the lasso tends to pick one of them and discard the others. The elastic-net penalty mixes these two; if predictors are correlated in groups, an $\alpha=0.5$ tends to select the groups in or out together. This is a higher level parameter, and users might pick a value upfront, else experiment with a few different values. One use of $\alpha$ is for numerical stability; for example, the elastic net with $\alpha = 1 - \epsilon$ for some small $\epsilon > 0$ performs much like the lasso, but removes any degeneracies and wild behavior caused by extreme correlations. The `glmnet` algorithms use cyclical coordinate descent, which successively optimizes the objective function over each parameter with others fixed, and cycles repeatedly until convergence. The package also makes use of the strong rules for efficient restriction of the active set. Due to highly efficient updates and techniques such as warm starts and active-set convergence, our algorithms can compute the solution path very fast. The code can handle sparse input-matrix formats, as well as range constraints on coefficients. The core of `glmnet` is a set of fortran subroutines, which make for very fast execution. The package also includes methods for prediction and plotting, and a function that performs K-fold cross-validation. The theory and algorithms in this implementation are described in @glmnet, @coxnet, @strongrules and @block . ## Installation Like many other R packages, the simplest way to obtain `glmnet` is to install it directly from CRAN. Type the following command in R console: ```{r, eval=FALSE} install.packages("glmnet", repos = "https://cran.us.r-project.org") ``` Users may change the `repos` options depending on their locations and preferences. Other options such as the directories where to install the packages can be altered in the command. For more details, see `help(install.packages)`. Here the R package has been downloaded and installed to the default directories. Alternatively, users can download the package source from [CRAN](https://cran.r-project.org/package=glmnet) and type Unix commands to install it to the desired location. ## Quick Start The purpose of this section is to give users a general sense of the package, including the components, what they do and some basic usage. We will briefly go over the main functions, see the basic operations and have a look at the outputs. Users may have a better idea after this section what functions are available, which one to choose, or at least where to seek help. More details are given in later sections. First, we load the `glmnet` package: ```{r} library(glmnet) ``` The default model used in the package is the Guassian linear model or "least squares", which we will demonstrate in this section. We load a set of data created beforehand for illustration. Users can either load their own data or use those saved in the workspace. ```{r} data(QuickStartExample) ``` The command loads an input matrix `x` and a response vector `y` from this saved R data archive. We fit the model using the most basic call to `glmnet`. ```{r} fit = glmnet(x, y) ``` "fit" is an object of class `glmnet` that contains all the relevant information of the fitted model for further use. We do not encourage users to extract the components directly. Instead, various methods are provided for the object such as `plot`, `print`, `coef` and `predict` that enable us to execute those tasks more elegantly. We can visualize the coefficients by executing the `plot` function: ```{r} plot(fit) ``` Each curve corresponds to a variable. It shows the path of its coefficient against the $\ell_1$-norm of the whole coefficient vector at as $\lambda$ varies. The axis above indicates the number of nonzero coefficients at the current $\lambda$, which is the effective degrees of freedom (_df_) for the lasso. Users may also wish to annotate the curves; this can be done by setting `label = TRUE` in the plot command. A summary of the `glmnet` path at each step is displayed if we just enter the object name or use the `print` function: ```{r height = 4} print(fit) ``` It shows from left to right the number of nonzero coefficients (`Df`), the percent (of null) deviance explained (`%dev`) and the value of $\lambda$ (`Lambda`). Although by default `glmnet` calls for 100 values of `lambda` the program stops early if `%dev% does not change sufficently from one lambda to the next (typically near the end of the path.) We can obtain the actual coefficients at one or more $\lambda$'s within the range of the sequence: ```{r} coef(fit,s=0.1) ``` (why `s` and not `lambda`? In case later we want to allow one to specify the model size in other ways.) Users can also make predictions at specific $\lambda$'s with new input data: ```{r} set.seed(29) nx = matrix(rnorm(10*20),10,20) predict(fit,newx=nx,s=c(0.1,0.05)) ``` The function `glmnet` returns a sequence of models for the users to choose from. In many cases, users may prefer the software to select one of them. Cross-validation is perhaps the simplest and most widely used method for that task. `cv.glmnet` is the main function to do cross-validation here, along with various supporting methods such as plotting and prediction. We still act on the sample data loaded before. ```{r} cvfit = cv.glmnet(x, y) ``` `cv.glmnet` returns a `cv.glmnet` object, which is "cvfit" here, a list with all the ingredients of the cross-validation fit. As for `glmnet`, we do not encourage users to extract the components directly except for viewing the selected values of $\lambda$. The package provides well-designed functions for potential tasks. We can plot the object. ```{r} plot(cvfit) ``` It includes the cross-validation curve (red dotted line), and upper and lower standard deviation curves along the $\lambda$ sequence (error bars). Two selected $\lambda$'s are indicated by the vertical dotted lines (see below). We can view the selected $\lambda$'s and the corresponding coefficients. For example, ```{r} cvfit$lambda.min ``` `lambda.min` is the value of $\lambda$ that gives minimum mean cross-validated error. The other $\lambda$ saved is `lambda.1se`, which gives the most regularized model such that error is within one standard error of the minimum. To use that, we only need to replace `lambda.min` with `lambda.1se` above. ```{r} coef(cvfit, s = "lambda.min") ``` Note that the coefficients are represented in the sparse matrix format. The reason is that the solutions along the regularization path are often sparse, and hence it is more efficient in time and space to use a sparse format. If you prefer non-sparse format, pipe the output through `as.matrix()`. Predictions can be made based on the fitted `cv.glmnet` object. Let's see a toy example. ```{r} predict(cvfit, newx = x[1:5,], s = "lambda.min") ``` `newx` is for the new input matrix and `s`, as before, is the value(s) of $\lambda$ at which predictions are made. That is the end of `glmnet` 101. With the tools introduced so far, users are able to fit the entire elastic net family, including ridge regression, using squared-error loss. In the package, there are many more options that give users a great deal of flexibility. To learn more, move on to later sections. ## Linear Regression Linear regression here refers to two families of models. One is `gaussian`, the Gaussian family, and the other is `mgaussian`, the multiresponse Gaussian family. We first discuss the ordinary Gaussian and the multiresponse one after that. ### Gaussian Family `gaussian ` is the default family option in the function `glmnet`. Suppose we have observations $x_i \in \mathbb{R}^p$ and the responses $y_i \in \mathbb{R}, i = 1, \ldots, N$. The objective function for the Gaussian family is $$ \min_{(\beta_0, \beta) \in \mathbb{R}^{p+1}}\frac{1}{2N} \sum_{i=1}^N (y_i -\beta_0-x_i^T \beta)^2+\lambda \left[ (1-\alpha)||\beta||_2^2/2 + \alpha||\beta||_1\right], $$ where $\lambda \geq 0$ is a complexity parameter and $0 \leq \alpha \leq 1$ is a compromise between ridge ($\alpha = 0$) and lasso ($\alpha = 1$). Coordinate descent is applied to solve the problem. Specifically, suppose we have current estimates $\tilde{\beta_0}$ and $\tilde{\beta}_\ell$ $\forall j\in 1,]\ldots,p$. By computing the gradient at $\beta_j = \tilde{\beta}_j$ and simple calculus, the update is $$ \tilde{\beta}_j \leftarrow \frac{S(\frac{1}{N}\sum_{i=1}^N x_{ij}(y_i-\tilde{y}_i^{(j)}),\lambda \alpha)}{1+\lambda(1-\alpha)}, $$ where $\tilde{y}_i^{(j)} = \tilde{\beta}_0 + \sum_{\ell \neq j} x_{i\ell} \tilde{\beta}_\ell$, and $S(z, \gamma)$ is the soft-thresholding operator with value $\text{sign}(z)(|z|-\gamma)_+$. This formula above applies when the `x` variables are standardized to have unit variance (the default); it is slightly more complicated when they are not. Note that for "family=gaussian", `glmnet` standardizes $y$ to have unit variance before computing its lambda sequence (and then unstandardizes the resulting coefficients); if you wish to reproduce/compare results with other software, best to supply a standardized $y$ first (Using the "1/N" variance formula). `glmnet` provides various options for users to customize the fit. We introduce some commonly used options here and they can be specified in the `glmnet` function. * `alpha` is for the elastic-net mixing parameter $\alpha$, with range $\alpha \in [0,1]$. $\alpha = 1$ is the lasso (default) and $\alpha = 0$ is the ridge. * `weights` is for the observation weights. Default is 1 for each observation. (Note: `glmnet` rescales the weights to sum to N, the sample size.) * `nlambda` is the number of $\lambda$ values in the sequence. Default is 100. * `lambda` can be provided, but is typically not and the program constructs a sequence. When automatically generated, the $\lambda$ sequence is determined by `lambda.max` and `lambda.min.ratio`. The latter is the ratio of smallest value of the generated $\lambda$ sequence (say `lambda.min`) to `lambda.max`. The program then generated `nlambda` values linear on the log scale from `lambda.max` down to `lambda.min`. `lambda.max` is not given, but easily computed from the input $x$ and $y$; it is the smallest value for `lambda` such that all the coefficients are zero. For `alpha=0` (ridge) `lambda.max` would be $\infty$; hence for this case we pick a value corresponding to a small value for `alpha` close to zero.) * `standardize` is a logical flag for `x` variable standardization, prior to fitting the model sequence. The coefficients are always returned on the original scale. Default is `standardize=TRUE`. For more information, type `help(glmnet)` or simply `?glmnet`. As an example, we set $\alpha = 0.2$ (more like a ridge regression), and give double weights to the latter half of the observations. To avoid too long a display here, we set `nlambda` to 20. In practice, however, the number of values of $\lambda$ is recommended to be 100 (default) or more. In most cases, it does not come with extra cost because of the warm-starts used in the algorithm, and for nonlinear models leads to better convergence properties. ```{r} fit = glmnet(x, y, alpha = 0.2, weights = c(rep(1,50),rep(2,50)), nlambda = 20) ``` We can then print the `glmnet` object. ```{r} print(fit) ``` This displays the call that produced the object `fit` and a three-column matrix with columns `Df` (the number of nonzero coefficients), `%dev` (the percent deviance explained) and `Lambda` (the corresponding value of $\lambda$). (Note that the `digits` option can used to specify significant digits in the printout.) Here the actual number of $\lambda$'s here is less than specified in the call. The reason lies in the stopping criteria of the algorithm. According to the default internal settings, the computations stop if either the fractional change in deviance down the path is less than $10^{-5}$ or the fraction of explained deviance reaches $0.999$. From the last few lines , we see the fraction of deviance does not change much and therefore the computation ends when meeting the stopping criteria. We can change such internal parameters. For details, see the Appendix section or type `help(glmnet.control)`. We can plot the fitted object as in the previous section. There are more options in the `plot` function. Users can decide what is on the X-axis. `xvar` allows three measures: "norm" for the $\ell_1$-norm of the coefficients (default), "lambda" for the log-lambda value and "dev" for %deviance explained. Users can also label the curves with variable sequence numbers simply by setting `label = TRUE`. Let's plot "fit" against the log-lambda value and with each curve labeled. ```{r} plot(fit, xvar = "lambda", label = TRUE) ``` Now when we plot against %deviance we get a very different picture. This is percent deviance explained on the training data. What we see here is that toward the end of the path this value are not changing much, but the coefficients are "blowing up" a bit. This lets us focus attention on the parts of the fit that matter. This will especially be true for other models, such as logistic regression. ```{r} plot(fit, xvar = "dev", label = TRUE) ``` We can extract the coefficients and make predictions at certain values of $\lambda$. Two commonly used options are: * `s` specifies the value(s) of $\lambda$ at which extraction is made. * `exact` indicates whether the exact values of coefficients are desired or not. That is, if `exact = TRUE`, and predictions are to be made at values of `s` not included in the original fit, these values of `s` are merged with `object$lambda`, and the model is refit before predictions are made. If `exact=FALSE` (default), then the predict function uses linear interpolation to make predictions for values of `s` that do not coincide with lambdas used in the fitting algorithm. A simple example is: ```{r} fit = glmnet(x, y) any(fit$lambda == 0.5) coef.apprx = coef(fit, s = 0.5, exact = FALSE) coef.exact = coef(fit, s = 0.5, exact = TRUE, x=x, y=y) cbind2(coef.exact, coef.apprx) ``` The left column is for `exact = TRUE` and the right for `FALSE`. We see from the above that 0.5 is not in the sequence and that hence there are some difference, though not much. Linear interpolation is mostly enough if there are no special requirements. Notice that with `exact=TRUE` we have to supply by named argument any data that was used in creating the original fit, in this case `x` and `y`. Users can make predictions from the fitted object. In addition to the options in `coef`, the primary argument is `newx`, a matrix of new values for `x`. The `type` option allows users to choose the type of prediction: * "link" gives the fitted values * "response" the sames as "link" for "gaussian" family. * "coefficients" computes the coefficients at values of `s` * "nonzero" retuns a list of the indices of the nonzero coefficients for each value of `s`. For example, ```{r} predict(fit, newx = x[1:5,], type = "response", s = 0.05) ``` gives the fitted values for the first 5 observations at $\lambda = 0.05$. If multiple values of `s` are supplied, a matrix of predictions is produced. Users can customize K-fold cross-validation. In addition to all the `glmnet` parameters, `cv.glmnet` has its special parameters including `nfolds` (the number of folds), `foldid` (user-supplied folds), `type.measure`(the loss used for cross-validation): * "deviance" or "mse" uses squared loss * "mae" uses mean absolute error As an example, ```{r} cvfit = cv.glmnet(x, y, type.measure = "mse", nfolds = 20) ``` does 20-fold cross-validation, based on mean squared error criterion (default though). Parallel computing is also supported by `cv.glmnet`. To make it work, users must register parallel beforehand. We give a simple example of comparison here. Unfortunately, the package `doMC` is not available on Windows platforms (it is on others), so we cannot run the code here, but we make it looks as if we have. ```{r, eval=FALSE} require(doMC) registerDoMC(cores=2) X = matrix(rnorm(1e4 * 200), 1e4, 200) Y = rnorm(1e4) ``` ```{r, eval=FALSE} system.time(cv.glmnet(X, Y)) ``` ```{r, echo=FALSE} structure(c(2.44, 0.08, 2.518, 0, 0), class = "proc_time", .Names = c("user.self", "sys.self", "elapsed", "user.child", "sys.child")) ``` ```{r, eval=FALSE} system.time(cv.glmnet(X, Y, parallel = TRUE)) ``` ```{r, echo=FALSE} structure(c(0.508999999999999, 0.057, 1.56699999999999, 1.941, 0.1), class = "proc_time", .Names = c("user.self", "sys.self", "elapsed", "user.child", "sys.child")) ``` As suggested from the above, parallel computing can significantly speed up the computation process especially for large-scale problems. Functions `coef` and `predict` on cv.glmnet object are similar to those for a `glmnet` object, except that two special strings are also supported by `s` (the values of $\lambda$ requested): * "lambda.1se": the largest $\lambda$ at which the MSE is within one standard error of the minimal MSE. * "lambda.min": the $\lambda$ at which the minimal MSE is achieved. ```{r} cvfit$lambda.min coef(cvfit, s = "lambda.min") predict(cvfit, newx = x[1:5,], s = "lambda.min") ``` Users can control the folds used. Here we use the same folds so we can also select a value for $\alpha$. ```{r} foldid=sample(1:10,size=length(y),replace=TRUE) cv1=cv.glmnet(x,y,foldid=foldid,alpha=1) cv.5=cv.glmnet(x,y,foldid=foldid,alpha=.5) cv0=cv.glmnet(x,y,foldid=foldid,alpha=0) ``` There are no built-in plot functions to put them all on the same plot, so we are on our own here: ```{r} par(mfrow=c(2,2)) plot(cv1);plot(cv.5);plot(cv0) plot(log(cv1$lambda),cv1$cvm,pch=19,col="red",xlab="log(Lambda)",ylab=cv1$name) points(log(cv.5$lambda),cv.5$cvm,pch=19,col="grey") points(log(cv0$lambda),cv0$cvm,pch=19,col="blue") legend("topleft",legend=c("alpha= 1","alpha= .5","alpha 0"),pch=19,col=c("red","grey","blue")) ``` We see that lasso (`alpha=1`) does about the best here. We also see that the range of lambdas used differs with alpha. #### Coefficient upper and lower bounds These are recently added features that enhance the scope of the models. Suppose we want to fit our model, but limit the coefficients to be bigger than -0.7 and less than 0.5. This is easily achieved via the `upper.limits` and `lower.limits` arguments: ```{r} tfit=glmnet(x,y,lower=-.7,upper=.5) plot(tfit) ``` These are rather arbitrary limits; often we want the coefficients to be positive, so we can set only `lower.limit` to be 0. (Note, the lower limit must be no bigger than zero, and the upper limit no smaller than zero.) These bounds can be a vector, with different values for each coefficient. If given as a scalar, the same number gets recycled for all. #### Penalty factors This argument allows users to apply separate penalty factors to each coefficient. Its default is 1 for each parameter, but other values can be specified. In particular, any variable with `penalty.factor` equal to zero is not penalized at all! Let $v_j$ denote the penalty factor for $j$ th variable. The penalty term becomes $$ \lambda \sum_{j=1}^p \boldsymbol{v_j} P_\alpha(\beta_j) = \lambda \sum_{j=1}^p \boldsymbol{v_j} \left[ (1-\alpha)\frac{1}{2} \beta_j^2 + \alpha |\beta_j| \right]. $$ Note the penalty factors are internally rescaled to sum to nvars. This is very useful when people have prior knowledge or preference over the variables. In many cases, some variables may be so important that one wants to keep them all the time, which can be achieved by setting corresponding penalty factors to 0: ```{r} p.fac = rep(1, 20) p.fac[c(5, 10, 15)] = 0 pfit = glmnet(x, y, penalty.factor = p.fac) plot(pfit, label = TRUE) ``` We see from the labels that the three variables with 0 penalty factors always stay in the model, while the others follow typical regularization paths and shrunken to 0 eventually. Some other useful arguments. `exclude` allows one to block certain variables from being the model at all. Of course, one could simply subset these out of `x`, but sometimes `exclude` is more useful, since it returns a full vector of coefficients, just with the excluded ones set to zero. There is also an `intercept` argument which defaults to `TRUE`; if `FALSE` the intercept is forced to be zero. #### Customizing plots Sometimes, especially when the number of variables is small, we want to add variable labels to a plot. Since `glmnet` is intended primarily for wide data, this is not supprted in `plot.glmnet`. However, it is easy to do, as the following little toy example shows. We first generate some data, with 10 variables, and for lack of imagination and ease we give them simple character names. We then fit a glmnet model, and make the standard plot. ```{r} set.seed(101) x=matrix(rnorm(1000),100,10) y=rnorm(100) vn=paste("var",1:10) fit=glmnet(x,y) plot(fit) ``` We wish to label the curves with the variable names. Here s a simple way to do this, using the `axis` command in R (and a little research into how to customize it). We need to have the positions of the coefficients at the end of the path, and we need to make some space using the `par` command, so that our labels will fit in. This requires knowing how long your labels are, but here they are all quite short. ```{r} par(mar=c(4.5,4.5,1,4)) plot(fit) vnat=coef(fit) vnat=vnat[-1,ncol(vnat)] # remove the intercept, and get the coefficients at the end of the path axis(4, at=vnat,line=-.5,label=vn,las=1,tick=FALSE, cex.axis=0.5) ``` We have done nothing here to avoid overwriting of labels, in the event that they are close together. This would be a bit more work, but perhaps best left alone, anyway. ### Multiresponse Gaussian Family The multiresponse Gaussian family is obtained using `family = "mgaussian"` option in `glmnet`. It is very similar to the single-response case above. This is useful when there are a number of (correlated) responses - the so-called "multi-task learning" problem. Here the sharing involves which variables are selected, since when a variable is selected, a coefficient is fit for each response. Most of the options are the same, so we focus here on the differences with the single response model. Obviously, as the name suggests, $y$ is not a vector, but a matrix of quantitative responses in this section. The coefficients at each value of lambda are also a matrix as a result. Here we solve the following problem: $$ \min_{(\beta_0, \beta) \in \mathbb{R}^{(p+1)\times K}}\frac{1}{2N} \sum_{i=1}^N ||y_i -\beta_0-\beta^T x_i||^2_F+\lambda \left[ (1-\alpha)||\beta||_F^2/2 + \alpha\sum_{j=1}^p||\beta_j||_2\right]. $$ Here $\beta_j$ is the jth row of the $p\times K$ coefficient matrix $\beta$, and we replace the absolute penalty on each single coefficient by a group-lasso penalty on each coefficient K-vector $\beta_j$ for a single predictor $x_j$. We use a set of data generated beforehand for illustration. ```{r} data(MultiGaussianExample) ``` We fit the data, with an object "mfit" returned. ```{r} mfit = glmnet(x, y, family = "mgaussian") ``` For multiresponse Gaussian, the options in `glmnet` are almost the same as the single-response case, such as `alpha`, `weights`, `nlambda`, `standardize`. A exception to be noticed is that `standardize.response` is only for `mgaussian` family. The default value is `FALSE`. If `standardize.response = TRUE`, it standardizes the response variables. To visualize the coefficients, we use the `plot` function. ```{r} plot(mfit, xvar = "lambda", label = TRUE, type.coef = "2norm") ``` Note that we set `type.coef = "2norm"`. Under this setting, a single curve is plotted per variable, with value equal to the $\ell_2$ norm. The default setting is `type.coef = "coef"`, where a coefficient plot is created for each response (multiple figures). `xvar` and `label` are two other options besides ordinary graphical parameters. They are the same as the single-response case. We can extract the coefficients at requested values of $\lambda$ by using the function `coef` and make predictions by `predict`. The usage is similar and we only provide an example of `predict` here. ```{r} predict(mfit, newx = x[1:5,], s = c(0.1, 0.01)) ``` The prediction result is saved in a three-dimensional array with the first two dimensions being the prediction matrix for each response variable and the third indicating the response variables. We can also do k-fold cross-validation. The options are almost the same as the ordinary Gaussian family and we do not expand here. ```{r} cvmfit = cv.glmnet(x, y, family = "mgaussian") ``` We plot the resulting `cv.glmnet` object "cvmfit". ```{r} plot(cvmfit) ``` To show explicitly the selected optimal values of $\lambda$, type ```{r} cvmfit$lambda.min cvmfit$lambda.1se ``` As before, the first one is the value at which the minimal mean squared error is achieved and the second is for the most regularized model whose mean squared error is within one standard error of the minimal. Prediction for `cv.glmnet` object works almost the same as for `glmnet` object. We omit the details here. ## Logistic Regression Logistic regression is another widely-used model when the response is categorical. If there are two possible outcomes, we use the binomial distribution, else we use the multinomial. ### Binomial Models For the binomial model, suppose the response variable takes value in $\mathcal{G}=\{1,2\}$. Denote $y_i = I(g_i=1)$. We model $$\mbox{Pr}(G=2|X=x)=\frac{e^{\beta_0+\beta^Tx}}{1+e^{\beta_0+\beta^Tx}},$$ which can be written in the following form $$\log\frac{\mbox{Pr}(G=2|X=x)}{\mbox{Pr}(G=1|X=x)}=\beta_0+\beta^Tx,$$ the so-called "logistic" or log-odds transformation. The objective function for the penalized logistic regression uses the negative binomial log-likelihood, and is $$ \min_{(\beta_0, \beta) \in \mathbb{R}^{p+1}} -\left[\frac{1}{N} \sum_{i=1}^N y_i \cdot (\beta_0 + x_i^T \beta) - \log (1+e^{(\beta_0+x_i^T \beta)})\right] + \lambda \big[ (1-\alpha)||\beta||_2^2/2 + \alpha||\beta||_1\big]. $$ Logistic regression is often plagued with degeneracies when $p > N$ and exhibits wild behavior even when $N$ is close to $p$; the elastic-net penalty alleviates these issues, and regularizes and selects variables as well. Our algorithm uses a quadratic approximation to the log-likelihood, and then coordinate descent on the resulting penalized weighted least-squares problem. These constitute an outer and inner loop. For illustration purpose, we load pre-generated input matrix `x` and the response vector `y` from the data file. ```{r} data(BinomialExample) ``` The input matrix $x$ is the same as other families. For binomial logistic regression, the response variable $y$ should be either a factor with two levels, or a two-column matrix of counts or proportions. Other optional arguments of `glmnet` for binomial regression are almost same as those for Gaussian family. Don't forget to set `family` option to "binomial". ```{r} fit = glmnet(x, y, family = "binomial") ``` Like before, we can print and plot the fitted object, extract the coefficients at specific $\lambda$'s and also make predictions. For plotting, the optional arguments such as `xvar` and `label` are similar to the Gaussian. We plot against the deviance explained and show the labels. ```{r} plot(fit, xvar = "dev", label = TRUE) ``` Prediction is a little different for logistic from Gaussian, mainly in the option `type`. "link" and "response" are never equivalent and "class" is only available for logistic regression. In summary, * "link" gives the linear predictors * "response" gives the fitted probabilities * "class" produces the class label corresponding to the maximum probability. * "coefficients" computes the coefficients at values of `s` * "nonzero" retuns a list of the indices of the nonzero coefficients for each value of `s`. For "binomial" models, results ("link", "response", "coefficients", "nonzero") are returned only for the class corresponding to the second level of the factor response. In the following example, we make prediction of the class labels at $\lambda = 0.05, 0.01$. ```{r} predict(fit, newx = x[1:5,], type = "class", s = c(0.05, 0.01)) ``` For logistic regression, `cv.glmnet` has similar arguments and usage as Gaussian. `nfolds`, `weights`, `lambda`, `parallel` are all available to users. There are some differences in `type.measure`: "deviance" and "mse" do not both mean squared loss and "class" is enabled. Hence, * "mse" uses squared loss. * "deviance" uses actual deviance. * "mae" uses mean absolute error. * "class" gives misclassification error. * "auc" (for two-class logistic regression ONLY) gives area under the ROC curve. For example, ```{r} cvfit = cv.glmnet(x, y, family = "binomial", type.measure = "class") ``` It uses misclassification error as the criterion for 10-fold cross-validation. We plot the object and show the optimal values of $\lambda$. ```{r} plot(cvfit) ``` ```{r} cvfit$lambda.min cvfit$lambda.1se ``` `coef` and `predict` are simliar to the Gaussian case and we omit the details. We review by some examples. ```{r} coef(cvfit, s = "lambda.min") ``` As mentioned previously, the results returned here are only for the second level of the factor response. ```{r} predict(cvfit, newx = x[1:10,], s = "lambda.min", type = "class") ``` Like other GLMs, glmnet allows for an "offset". This is a fixed vector of N numbers that is added into the linear predictor. For example, you may have fitted some other logistic regression using other variables (and data), and now you want to see if the present variables can add anything. So you use the predicted logit from the other model as an offset in. ### Multinomial Models For the multinomial model, suppose the response variable has $K$ levels ${\cal G}=\{1,2,\ldots,K\}$. Here we model $$\mbox{Pr}(G=k|X=x)=\frac{e^{\beta_{0k}+\beta_k^Tx}}{\sum_{\ell=1}^Ke^{\beta_{0\ell}+\beta_\ell^Tx}}.$$ Let ${Y}$ be the $N \times K$ indicator response matrix, with elements $y_{i\ell} = I(g_i=\ell)$. Then the elastic-net penalized negative log-likelihood function becomes $$ \ell(\{\beta_{0k},\beta_{k}\}_1^K) = -\left[\frac{1}{N} \sum_{i=1}^N \Big(\sum_{k=1}^Ky_{il} (\beta_{0k} + x_i^T \beta_k)- \log \big(\sum_{k=1}^K e^{\beta_{0k}+x_i^T \beta_k}\big)\Big)\right] +\lambda \left[ (1-\alpha)||\beta||_F^2/2 + \alpha\sum_{j=1}^p||\beta_j||_q\right]. $$ Here we really abuse notation! $\beta$ is a $p\times K$ matrix of coefficients. $\beta_k$ refers to the kth column (for outcome category k), and $\beta_j$ the jth row (vector of K coefficients for variable j). The last penalty term is $||\beta_j||_q$, we have two options for q: $q\in \{1,2\}$. When q=1, this is a lasso penalty on each of the parameters. When q=2, this is a grouped-lasso penalty on all the K coefficients for a particular variables, which makes them all be zero or nonzero together. The standard Newton algorithm can be tedious here. Instead, we use a so-called partial Newton algorithm by making a partial quadratic approximation to the log-likelihood, allowing only $(\beta_{0k}, \beta_k)$ to vary for a single class at a time. For each value of $\lambda$, we first cycle over all classes indexed by $k$, computing each time a partial quadratic approximation about the parameters of the current class. Then the inner procedure is almost the same as for the binomial case. This is the case for lasso (q=1). When q=2, we use a different approach, which we wont dwell on here. For the multinomial case, the usage is similar to logistic regression, and we mainly illustrate by examples and address any differences. We load a set of generated data. ```{r} data(MultinomialExample) ``` The optional arguments in `glmnet` for multinomial logistic regression are mostly similar to binomial regression except for a few cases. The response variable can be a `nc >= 2` level factor, or a `nc`-column matrix of counts or proportions. Internally glmnet will make the rows of this matrix sum to 1, and absorb the total mass into the weight for that observation. `offset` should be a `nobs x nc` matrix if there is one. A special option for multinomial regression is `type.multinomial`, which allows the usage of a grouped lasso penalty if `type.multinomial = "grouped"`. This will ensure that the multinomial coefficients for a variable are all in or out together, just like for the multi-response Gaussian. ```{r} fit = glmnet(x, y, family = "multinomial", type.multinomial = "grouped") ``` We plot the resulting object "fit". ```{r} plot(fit, xvar = "lambda", label = TRUE, type.coef = "2norm") ``` The options are `xvar`, `label` and `type.coef`, in addition to other ordinary graphical parameters. `xvar` and `label` are the same as other families while `type.coef` is only for multinomial regression and multiresponse Gaussian model. It can produce a figure of coefficients for each response variable if `type.coef = "coef"` or a figure showing the $\ell_2$-norm in one figure if `type.coef = "2norm"` We can also do cross-validation and plot the returned object. ```{r} cvfit=cv.glmnet(x, y, family="multinomial", type.multinomial = "grouped", parallel = TRUE) plot(cvfit) ``` Note that although `type.multinomial` is not a typical argument in `cv.glmnet`, in fact any argument that can be passed to `glmnet` is valid in the argument list of `cv.glmnet`. We also use parallel computing to accelerate the calculation. Users may wish to predict at the optimally selected $\lambda$: ```{r} predict(cvfit, newx = x[1:10,], s = "lambda.min", type = "class") ``` ## Poisson Models Poisson regression is used to model count data under the assumption of Poisson error, or otherwise non-negative data where the mean and variance are proportional. Like the Gaussian and binomial model, the Poisson is a member of the exponential family of distributions. We usually model its positive mean on the log scale: $\log \mu(x) = \beta_0+\beta' x$. The log-likelihood for observations $\{x_i,y_i\}_1^N$ is given my $$ l(\beta|X, Y) = \sum_{i=1}^N \left(y_i (\beta_0+\beta' x_i) - e^{\beta_0+\beta^Tx_i}\right). $$ As before, we optimize the penalized log-lielihood: $$ \min_{\beta_0,\beta} -\frac1N l(\beta|X, Y) + \lambda \left((1-\alpha) \sum_{i=1}^N \beta_i^2/2) +\alpha \sum_{i=1}^N |\beta_i|\right). $$ Glmnet uses an outer Newton loop, and an inner weighted least-squares loop (as in logistic regression) to optimize this criterion. First, we load a pre-generated set of Poisson data. ```{r} data(PoissonExample) ``` We apply the function `glmnet` with the `"poisson"` option. ```{r} fit = glmnet(x, y, family = "poisson") ``` The optional input arguments of `glmnet` for `"poisson"` family are similar to those for others. `offset` is a useful argument particularly in Poisson models. When dealing with rate data in Poisson models, the counts collected are often based on different exposures, such as length of time observed, area and years. A poisson rate $\mu(x)$ is relative to a unit exposure time, so if an observation $y_i$ was exposed for $E_i$ units of time, then the expected count would be $E_i\mu(x)$, and the log mean would be $\log(E_i)+\log(\mu(x))$. In a case like this, we would supply an *offset* $\log(E_i)$ for each observation. Hence `offset` is a vector of length `nobs` that is included in the linear predictor. Other families can also use options, typically for different reasons. (Warning: if `offset` is supplied in `glmnet`, offsets must also also be supplied to `predict` to make reasonable predictions.) Again, we plot the coefficients to have a first sense of the result. ```{r} plot(fit) ``` Like before, we can extract the coefficients and make predictions at certain $\lambda$'s by using `coef` and `predict` respectively. The optional input arguments are similar to those for other families. In function `predict`, the option `type`, which is the type of prediction required, has its own specialties for Poisson family. That is, * "link" (default) gives the linear predictors like others * "response" gives the fitted mean * "coefficients" computes the coefficients at the requested values for `s`, which can also be realized by `coef` function * "nonzero" returns a a list of the indices of the nonzero coefficients for each value of `s`. For example, we can do as follows. ```{r} coef(fit, s = 1) predict(fit, newx = x[1:5,], type = "response", s = c(0.1,1)) ``` We may also use cross-validation to find the optimal $\lambda$'s and thus make inferences. ```{r} cvfit = cv.glmnet(x, y, family = "poisson") ``` Options are almost the same as the Gaussian family except that for `type.measure`, * "deviance" (default) gives the deviance * "mse" stands for mean squared error * "mae" is for mean absolute error. We can plot the `cv.glmnet` object. ```{r} plot(cvfit) ``` We can also show the optimal $\lambda$'s and the corresponding coefficients. ```{r} opt.lam = c(cvfit$lambda.min, cvfit$lambda.1se) coef(cvfit, s = opt.lam) ``` The `predict` method is similar and we do not repeat it here. ## Cox Models The Cox proportional hazards model is commonly used for the study of the relationship beteween predictor variables and survival time. In the usual survival analysis framework, we have data of the form $(y_1, x_1, \delta_1), \ldots, (y_n, x_n, \delta_n)$ where $y_i$, the observed time, is a time of failure if $\delta_i$ is 1 or right-censoring if $\delta_i$ is 0. We also let $t_1 < t_2 < \ldots < t_m$ be the increasing list of unique failure times, and $j(i)$ denote the index of the observation failing at time $t_i$. The Cox model assumes a semi-parametric form for the hazard $$ h_i(t) = h_0(t) e^{x_i^T \beta}, $$ where $h_i(t)$ is the hazard for patient $i$ at time $t$, $h_0(t)$ is a shared baseline hazard, and $\beta$ is a fixed, length $p$ vector. In the classic setting $n \geq p$, inference is made via the partial likelihood $$ L(\beta) = \prod_{i=1}^m \frac{e^{x_{j(i)}^T \beta}}{\sum_{j \in R_i} e^{x_j^T \beta}}, $$ where $R_i$ is the set of indices $j$ with $y_j \geq t_i$ (those at risk at time $t_i$). Note there is no intercept in the Cox mode (its built into the baseline hazard, and like it, would cancel in the partial likelihood.) We penalize the negative log of the partial likelihood, just like the other models, with an elastic-net penalty. We use a pre-generated set of sample data and response. Users can load their own data and follow a similar procedure. In this case $x$ must be an $n\times p$ matrix of covariate values - each row corresponds to a patient and each column a covariate. $y$ is an $n \times 2$ matrix, with a column "time" of failure/censoring times, and "status" a 0/1 indicator, with 1 meaning the time is a failure time, and zero a censoring time. ```{r} data(CoxExample) y[1:5,] ``` The `Surv` function in the package `survival` can create such a matrix. Note, however, that the `coxph` and related linear models can handle interval and other forms of censoring, while glmnet can only handle right censoring in its present form. We apply the `glmnet` function to compute the solution path under default settings. ```{r} fit = glmnet(x, y, family = "cox") ``` All the standard options are available such as `alpha`, `weights`, `nlambda` and `standardize`. Their usage is similar as in the Gaussian case and we omit the details here. Users can also refer to the help file `help(glmnet)`. We can plot the coefficients. ```{r} plot(fit) ``` As before, we can extract the coefficients at certain values of $\lambda$. ```{r} coef(fit, s = 0.05) ``` Since the Cox Model is not commonly used for prediction, we do not give an illustrative example on prediction. If needed, users can refer to the help file by typing `help(predict.glmnet)`. Also, the function `cv.glmnet` can be used to compute $k$-fold cross-validation for the Cox model. The usage is similar to that for other families except for two main differences. One is that `type.measure` only supports "deviance"(also default), which gives the partial-likelihood. The other is in the option `grouped`. `grouped = TRUE` obtains the CV partial likelihood for the Kth fold by subtraction; by subtracting the log partial likelihood evaluated on the full dataset from that evaluated on the on the (K-1)/K dataset. This makes more efficient use of risk sets. With `grouped=FALSE` the log partial likelihood is computed only on the Kth fold, which is only reasonable if each fold has a large number of observations. ```{r} cvfit = cv.glmnet(x, y, family = "cox") ``` Once fit, we can view the optimal $\lambda$ value and a cross validated error plot to help evaluate our model. ```{r} plot(cvfit) ``` As previously, the left vertical line in our plot shows us where the CV-error curve hits its minimum. The right vertical line shows us the most regularized model with CV-error within 1 standard deviation of the minimum. We also extract such optimal $\lambda$'s. ```{r} cvfit$lambda.min cvfit$lambda.1se ``` We can check the active covariates in our model and see their coefficients. ```{r} coef.min = coef(cvfit, s = "lambda.min") active.min = which(coef.min != 0) index.min = coef.min[active.min] ``` ```{r} index.min coef.min ``` ## Sparse Matrices Our package supports sparse input matrices, which allow efficient storage and operations of large matrices but with only a few nonzero entries. It is available for all families except for the `cox` family. The usage of sparse matrices (inherit from class `"sparseMatrix"` as in package `Matrix`) in `glmnet ` is the same as if a regular matrix is provided. We load a set of sample data created beforehand. ```{r} data(SparseExample) ``` It loads `x`, a 100*20 sparse input matrix and `y`, the response vector. ```{r} class(x) ``` Users can create a sparse matrix with the function `sparseMatrix` by providing the locations and values of the nonzero entries. Alternatively, `Matrix` function can also be used to contruct a sparse matrix by setting `sparse = TRUE`, but this defeats the purpose somewhat. We can fit the model the same way as before. ```{r} fit = glmnet(x, y) ``` We also do the cross-validation and plot the resulting object. ```{r} cvfit = cv.glmnet(x, y) plot(cvfit) ``` The usage of other functions are similar and we do not expand here. Note that sparse matrices can also be used for `newx`, the new input matrix in the `predict` function. For example, ```{r} i = sample(1:5, size = 25, replace = TRUE) j = sample(1:20, size = 25, replace = TRUE) x = rnorm(25) nx = sparseMatrix(i = i, j = j, x = x, dims = c(5, 20)) predict(cvfit, newx = nx, s = "lambda.min") ``` ## Appendix 0: Convergence Criteria Glmnet uses a convergence criterion that focuses not on coefficient change but rather the impact of the change on the fitted values, and hence the loss part of the objective. The net result is a weighted norm of the coefficient change vector. For gaussian models it uses the following. Suppose observation $i$ has weight $w_i$. Let $v_j$ be the (weighted) sum-of-squares for variable $x_j$: $$v_j=\sum_{i=1}^Nw_ix_{ij}^2.$$ If there is an intercept in the model, these $x_j$ will be centered by the weighted mean, and hence this would be a weighted variance. After $\hat\beta_j^o$ has been updated to $\hat\beta_j^n$, we compute $\Delta_j=v_j(\hat\beta_j^o-\hat\beta_j^n)^2$. After a complete cycle of coordinate descent, we look at $\Delta_{max}=\max_j\Delta_j$. Why this measure? We can write $$\Delta_j=\frac1N\sum_{i=1}^N w_j(x_{ij}\hat\beta_j^o-x_{ij}\hat\beta_j^n)^2,$$ which measures the weighted sum of squares of changes in fitted values for this term. This measures the impact of the change in this coefficient on the fit. If the largest such change is negligible, we stop. For logistic regression, and other non-Gaussian models it is similar for the inner loop. Only now the weights for each observation are more complex. For example, for logisitic regression the weights are those that arise from the current Newton step, namely $w_i^*=w_i\hat p_i(1-\hat p_i)$. Here $\hat p_i$ are the fitted probabilities as we entered the current inner loop. The intuition is the same --- it measures the impact of the coefficient change on the current weighted least squares loss, or quadratic approximation to the log-likelihood loss. What about outer-loop convergence? We use the same measure, except now $\hat\beta^o$ is the coefficient vector before we entered this inner loop, and $\hat\beta^n$ the converged solution for this inner loop. Hence if this Newton step had no impact, we declare outer-loop convergence. ## Appendix 1: Internal Parameters Our package has a set of internal parameters which control some aspects of the computation of the path. The *factory default* settings are expected to serve in most cases, and users do not need to make changes unless there are special requirements. There are several parameters that users can change: `fdev` - minimum fractional change in deviance for stopping path; factory default = 1.0e-5 `devmax` - maximum fraction of explained deviance for stopping path; factory default = 0.999 * `eps` - minimum value of lambda.min.ratio (see glmnet); factory default= 1.0e-6 * `big` - large floating point number; factory default = 9.9e35. Inf in definition of upper.limit is set to big * `mnlam` - minimum number of path points (lambda values) allowed; factory default = 5 * `pmin` - minimum null probability for any class; factory default = 1.0e-5 * `exmx` - maximum allowed exponent; factory default = 250.0 * `prec` - convergence threshold for multi-response bounds adjustment solution; factory default = 1.0e-10 * `mxit` - maximum iterations for multiresponse bounds adjustment solution; factory default = 100 * `factory` - If `TRUE`, reset all the parameters to the factory default; default is `FALSE` We illustrate the usage by an example. Note that any changes made hold for the duration of the R session, or unless they are changed by the user with a subsequent call to `glmnet.control`. ```{r} data(QuickStartExample) fit = glmnet(x, y) print(fit) ``` We can change the minimum fractional change in deviance for stopping path and compare the results. ```{r} glmnet.control(fdev = 0) fit = glmnet(x, y) print(fit) ``` We set `fdev = 0` to continue all along the path, even without much change. The length of the sequence becomes 100, which is the default of `nlambda`. Users can also reset to the default settings. ```{r} glmnet.control(factory = TRUE) ``` The current settings are obtained as follows. ```{r} glmnet.control() ``` ## Appendix 2: Comparison with Other Packages Some people may want to use `glmnet` to solve the Lasso or elastic-net problem at a single $\lambda$. We compare here the solution by `glmnet` with other packages (such as CVX), and also as an illustration of parameter settings in this situation. __Warning__: Though such problems can be solved by `glmnet`, it is __not recommended__ and is not the spirit of the package. `glmnet` fits the __entire__ solution path for Lasso or elastic-net problems efficiently with various techniques such as warm start. Those advantages will disappear if the $\lambda$ sequence is forced to be only one value. Nevertheless, we still illustrate with a typical example in linear model in the following for the purpose of comparison. Given $X, Y$ and $\lambda_0 > 0$, we want to find $\beta$ such that $$ \min_{\beta} ||Y - X\beta||_2^2 + \lambda_0 ||\beta||_1, $$ where, say, $\lambda_0 = 8$. We first solve using `glmnet`. Notice that there is no intercept term in the objective function, and the columns of $X$ are not necessarily standardized. Corresponding parameters have to be set to make it work correctly. In addition, there is a $1/(2n)$ factor before the quadratic term by default, we need to adjust $\lambda$ accordingly. For the purpose of comparison, the `thresh` option is specified to be 1e-20. However, this is not necessary in many practical applications. ```{r, echo=FALSE} data(QuickStartExample) ``` ```{r,eval=FALSE} fit = glmnet(x, y, intercept = F, standardize = F, lambda = 8/(2*dim(x)[1]), thresh = 1e-20) ``` We then extract the coefficients (with no intercept). ```{r,eval=FALSE} beta_glmnet = as.matrix(predict(fit, type = "coefficients")[-1,]) ``` In linear model as here this approach worked because we were using squared error loss, but with any nonlinear family, it will probably fail. The reason is we are not using step length optimization, and so rely on very good warm starts to put us in the quadratic region of the loss function. Alternatively, a more stable and __strongly recommended__ way to perform this task is to first fit the entire Lasso or elastic-net path without specifying `lambda`, but then provide the requested $\lambda_0$ to `predict` function to extract the corresponding coefficients. In fact, if $\lambda_0$ is not in the $\lambda$ sequence generated by `glmnet`, the path will be refitted along a new $\lambda$ sequence that includes the requested value $\lambda_0$ and the old sequence, and the coefficients will be returned at $\lambda_0$ based on the new fit. Remember to set `exact = TRUE` in `predict` function to get the exact solution. Otherwise, it will be approximated by linear interpolation. ```{r} fit = glmnet(x, y, intercept = F, standardize = F, thresh = 1e-20) beta_glmnet = as.matrix(predict(fit, s = 8/(2*dim(x)[1]), type = "coefficients", exact = TRUE, x=x, y=y)[-1,]) ``` We also use CVX, a general convex optimization solver, to solve this specific Lasso problem. Users could also call CVX from R using the `CVXfromR` package and solve the problem as follows. ```{r, eval=FALSE} library(CVXfromR) setup.dir = "change/this/to/your/cvx/directory" n = dim(x)[1]; p = dim(x)[2] cvxcode = paste("variables beta(p)", "minimize(square_pos(norm(y - x * beta, 2)) + lambda * norm(beta, 1))", sep = ";") Lasso = CallCVX(cvxcode, const.var = list(p = p, x = x, y = y, lambda = 8), opt.var.names = "beta", setup.dir = setup.dir, matlab.call = "change/this/to/path/to/matlab") beta_CVX = Lasso$beta ``` For convenience here, the results were saved in `CVXResult.RData`, and we simply load in the results. ```{r} data(CVXResults) ``` In addition, we use `lars` to solve the same problem. ```{r,message=FALSE} require(lars) ``` ```{r} fit_lars = lars(x, y, type = "lasso", intercept = F, normalize = F) beta_lars = predict(fit_lars, s = 8/2, type = "coefficients", mode = "lambda")$coefficients ``` The results are listed below up to 6 decimal digits (due to convergence thresholds). ```{r} cmp = round(cbind(beta_glmnet, beta_lars, beta_CVX), digits = 6) colnames(cmp) = c("beta_glmnet", "beta_lars", "beta_CVX") cmp ``` ## References glmnet/R/0000755000176200001440000000000013574046201011743 5ustar liggesusersglmnet/R/jerr.elnet.R0000644000176200001440000000133413534022702014133 0ustar liggesusersjerr.elnet=function(n,maxit,pmax){ if(n>0){#fatal error if(n<7777)msg="Memory allocation error; contact package maintainer" else if(n==7777)msg="All used predictors have zero variance" else if(n==10000)msg="All penalty factors are <= 0" else msg="Unknown error" list(n=n,fatal=TRUE,msg=msg) } else if(n<0){# non-fatal error if(n>-10000)msg=paste("Convergence for ",-n,"th lambda value not reached after maxit=",maxit," iterations; solutions for larger lambdas returned",sep="") if(n < -10000)msg=paste("Number of nonzero coefficients along the path exceeds pmax=",pmax, " at ",-n-10000,"th lambda value; solutions for larger lambdas returned",sep="") list(n=n,fatal=FALSE,msg=msg) } } glmnet/R/plot.cv.glmnet.R0000644000176200001440000000504713556622666014765 0ustar liggesusers#' plot the cross-validation curve produced by cv.glmnet #' #' Plots the cross-validation curve, and upper and lower standard deviation #' curves, as a function of the \code{lambda} values used. If the object has #' class \code{"cv.relaxed"} a different plot is produced, showing both #' \code{lambda} and \code{gamma} #' #' A plot is produced, and nothing is returned. #' #' @aliases plot.cv.glmnet #' @param x fitted \code{"cv.glmnet"} object #' @param sign.lambda Either plot against \code{log(lambda)} (default) or its #' negative if \code{sign.lambda=-1}. #' @param \dots Other graphical parameters to plot #' @author Jerome Friedman, Trevor Hastie and Rob Tibshirani\cr Maintainer: #' Trevor Hastie #' @seealso \code{glmnet} and \code{cv.glmnet}. #' @references Friedman, J., Hastie, T. and Tibshirani, R. (2008) #' \emph{Regularization Paths for Generalized Linear Models via Coordinate #' Descent} #' @keywords models regression #' @examples #' #' set.seed(1010) #' n = 1000 #' p = 100 #' nzc = trunc(p/10) #' x = matrix(rnorm(n * p), n, p) #' beta = rnorm(nzc) #' fx = (x[, seq(nzc)] %*% beta) #' eps = rnorm(n) * 5 #' y = drop(fx + eps) #' px = exp(fx) #' px = px/(1 + px) #' ly = rbinom(n = length(px), prob = px, size = 1) #' cvob1 = cv.glmnet(x, y) #' plot(cvob1) #' title("Gaussian Family", line = 2.5) #' cvob1r = cv.glmnet(x, y, relax = TRUE) #' plot(cvob1r) #' frame() #' set.seed(1011) #' par(mfrow = c(2, 2), mar = c(4.5, 4.5, 4, 1)) #' cvob2 = cv.glmnet(x, ly, family = "binomial") #' plot(cvob2) #' title("Binomial Family", line = 2.5) #' ## set.seed(1011) #' ## cvob3 = cv.glmnet(x, ly, family = "binomial", type = "class") #' ## plot(cvob3) #' ## title("Binomial Family", line = 2.5) #' #' @method plot cv.glmnet #' @export plot.cv.glmnet=function(x,sign.lambda=1,...){ cvobj=x xlab = expression(Log(lambda)) # xlab="log(Lambda)" if(sign.lambda<0)xlab=paste("-",xlab,sep="") plot.args=list(x=sign.lambda*log(cvobj$lambda),y=cvobj$cvm,ylim=range(cvobj$cvup,cvobj$cvlo),xlab=xlab,ylab=cvobj$name,type="n") new.args=list(...) if(length(new.args))plot.args[names(new.args)]=new.args do.call("plot",plot.args) error.bars(sign.lambda*log(cvobj$lambda),cvobj$cvup,cvobj$cvlo,width=0.01, col="darkgrey") # col="antiquewhite2") points(sign.lambda*log(cvobj$lambda),cvobj$cvm,pch=20, col="red") axis(side=3,at=sign.lambda*log(cvobj$lambda),labels=paste(cvobj$nz),tick=FALSE,line=0) abline(v=sign.lambda*log(cvobj$lambda.min),lty=3) abline(v=sign.lambda*log(cvobj$lambda.1se),lty=3) invisible() } glmnet/R/buildPredmat.array.R0000644000176200001440000000363313552673674015644 0ustar liggesusers#' @method buildPredmat array #' @export buildPredmat.array=function(outlist, lambda, x, offset, foldid, alignment,...){ if (!is.null(offset)) is.offset = TRUE else is.offset = FALSE nc=dim(outlist[[1]]$a0)[1] nobs=nrow(x) predmat = array(NA, c(nobs, nc, length(lambda))) nfolds = max(foldid) nlams = double(nfolds) nlambda = length(lambda) for (i in seq(nfolds)) { which = foldid == i fitobj = outlist[[i]] if (is.offset) off_sub = offset[which, , drop = FALSE] preds = switch(alignment, fraction = predict(fitobj, x[which, , drop = FALSE], newoffset = off_sub,...), lambda = predict(fitobj, x[which, , drop = FALSE], s = lambda, newoffset = off_sub,...)) nlami = min(dim(preds)[3], nlambda) predmat[which, , seq(nlami)] = preds[, , seq(nlami)] if (nlami < nlambda) predmat[which, , seq(from = nlami, to = nlambda)] = preds[,, nlami] } ### fix up dimnames rn=rownames(x) sn=paste("s",seq(0,length=nlambda),sep="") cn=dimnames(preds)[[2]] dimnames(predmat)=list(rn,cn,sn) predmat } #' @method buildPredmat multnetlist #' @export buildPredmat.multnetlist=function(outlist, lambda, x, offset, foldid, alignment,...){ mat=buildPredmat.array(outlist, lambda, x, offset, foldid, alignment,...) attr(mat,"classnames")=outlist[[1]]$classnames mat } #' @method buildPredmat mrelnetlist #' @export buildPredmat.mrelnetlist=function(outlist, lambda, x, offset, foldid, alignment,...){ buildPredmat.array(outlist, lambda, x, offset, foldid, alignment,...) } #' @method buildPredmat lognetlist #' @export buildPredmat.lognetlist=function(outlist, lambda, x, offset, foldid, alignment,...){ mat=buildPredmat.default(outlist, lambda, x, offset, foldid, alignment,...) attr(mat,"classnames")=outlist[[1]]$classnames mat } glmnet/R/getcoef.R0000644000176200001440000000252513534022702013502 0ustar liggesusersgetcoef=function(fit,nvars,nx,vnames){ lmu=fit$lmu if(lmu<1){ ## changed this to a warning message, and return an empty model warning("an empty model has been returned; probably a convergence issue") coefob=list(a0=fit$a0,beta=zeromat(nvars,as.integer(1),vnames,"s0"),df=0,dim=c(nvars,1),lambda=Inf) return(coefob) } nin=fit$nin[seq(lmu)] ninmax=max(nin) lam=fit$alm[seq(lmu)] stepnames=paste("s",seq(lmu)-1,sep="") dd=c(nvars,lmu) if(ninmax>0){ ca=matrix(fit$ca[seq(nx*lmu)],nx,lmu)[seq(ninmax),,drop=FALSE] df=apply(abs(ca)>0,2,sum) ja=fit$ia[seq(ninmax)] ####confusing but too hard to change ###glmnet builds a list of ever active variables which is nondecreasing ###Since ca was initialized to zero, no harm is done in passing a square matrix ###to new(); then when we do a drop0 it makes it really sparse oja=order(ja) ja=rep(ja[oja],lmu) ia=cumsum(c(1,rep(ninmax,lmu))) beta=drop0(new("dgCMatrix",Dim=dd,Dimnames=list(vnames,stepnames),x=as.vector(ca[oja,]),p=as.integer(ia-1),i=as.integer(ja-1))) }else { beta = zeromat(nvars,lmu,vnames,stepnames) df=rep(0,lmu) } a0=fit$a0 if(!is.null(a0)){#for Cox model a0=a0[seq(lmu)] names(a0)=stepnames } list(a0=a0,beta=beta,df=df,dim=dd,lambda=lam) } glmnet/R/predict.glmnet.R0000644000176200001440000001507213555633674015031 0ustar liggesusers#' make predictions from a "glmnet" object. #' #' Similar to other predict methods, this functions predicts fitted values, #' logits, coefficients and more from a fitted \code{"glmnet"} object. #' #' The shape of the objects returned are different for \code{"multinomial"} #' objects. This function actually calls \code{NextMethod()}, and the #' appropriate predict method is invoked for each of the three model types. #' \code{coef(...)} is equivalent to \code{predict(type="coefficients",...)} #' #' @aliases coef.glmnet coef.relaxed predict.glmnet predict.relaxed #' predict.elnet predict.lognet predict.multnet predict.mrelnet predict.fishnet #' predict.coxnet #' @param object Fitted \code{"glmnet"} model object or a \code{"relaxed"} #' model (which inherits from class "glmnet"). #' @param newx Matrix of new values for \code{x} at which predictions are to be #' made. Must be a matrix; can be sparse as in \code{Matrix} package. This #' argument is not used for \code{type=c("coefficients","nonzero")} #' @param s Value(s) of the penalty parameter \code{lambda} at which #' predictions are required. Default is the entire sequence used to create the #' model. #' @param type Type of prediction required. Type \code{"link"} gives the linear #' predictors for \code{"binomial"}, \code{"multinomial"}, \code{"poisson"} or #' \code{"cox"} models; for \code{"gaussian"} models it gives the fitted #' values. Type \code{"response"} gives the fitted probabilities for #' \code{"binomial"} or \code{"multinomial"}, fitted mean for \code{"poisson"} #' and the fitted relative-risk for \code{"cox"}; for \code{"gaussian"} type #' \code{"response"} is equivalent to type \code{"link"}. Type #' \code{"coefficients"} computes the coefficients at the requested values for #' \code{s}. Note that for \code{"binomial"} models, results are returned only #' for the class corresponding to the second level of the factor response. #' Type \code{"class"} applies only to \code{"binomial"} or #' \code{"multinomial"} models, and produces the class label corresponding to #' the maximum probability. Type \code{"nonzero"} returns a list of the indices #' of the nonzero coefficients for each value of \code{s}. #' @param exact This argument is relevant only when predictions are made at #' values of \code{s} (lambda) \emph{different} from those used in the fitting #' of the original model. Not available for \code{"relaxed"} objects. If #' \code{exact=FALSE} (default), then the predict function uses linear #' interpolation to make predictions for values of \code{s} (lambda) that do #' not coincide with those used in the fitting algorithm. While this is often a #' good approximation, it can sometimes be a bit coarse. With #' \code{exact=TRUE}, these different values of \code{s} are merged (and #' sorted) with \code{object$lambda}, and the model is refit before predictions #' are made. In this case, it is required to supply the original data \code{x=} #' and \code{y=} as additional named arguments to \code{predict()} or #' \code{coef()}. The workhorse \code{predict.glmnet()} needs to \code{update} #' the model, and so needs the data used to create it. The same is true of #' \code{weights}, \code{offset}, \code{penalty.factor}, \code{lower.limits}, #' \code{upper.limits} if these were used in the original call. Failure to do #' so will result in an error. #' @param newoffset If an offset is used in the fit, then one must be supplied #' for making predictions (except for \code{type="coefficients"} or #' \code{type="nonzero"}) #' @param \dots This is the mechanism for passing arguments like \code{x=} when #' \code{exact=TRUE}; see\code{exact} argument. #' @return The object returned depends on type. #' @author Jerome Friedman, Trevor Hastie and Rob Tibshirani\cr Maintainer: #' Trevor Hastie #' @seealso \code{glmnet}, and \code{print}, and \code{coef} methods, and #' \code{cv.glmnet}. #' @references Friedman, J., Hastie, T. and Tibshirani, R. (2008) #' \emph{Regularization Paths for Generalized Linear Models via Coordinate #' Descent}, \url{https://web.stanford.edu/~hastie/Papers/glmnet.pdf}\cr #' \emph{Journal of Statistical Software, Vol. 33(1), 1-22 Feb 2010}\cr #' \url{https://www.jstatsoft.org/v33/i01/}\cr Simon, N., Friedman, J., Hastie, #' T., Tibshirani, R. (2011) \emph{Regularization Paths for Cox's Proportional #' Hazards Model via Coordinate Descent, Journal of Statistical Software, Vol. #' 39(5) 1-13}\cr \url{https://www.jstatsoft.org/v39/i05/} #' @keywords models regression #' #' @examples #' x=matrix(rnorm(100*20),100,20) #' y=rnorm(100) #' g2=sample(1:2,100,replace=TRUE) #' g4=sample(1:4,100,replace=TRUE) #' fit1=glmnet(x,y) #' predict(fit1,newx=x[1:5,],s=c(0.01,0.005)) #' predict(fit1,type="coef") #' fit2=glmnet(x,g2,family="binomial") #' predict(fit2,type="response",newx=x[2:5,]) #' predict(fit2,type="nonzero") #' fit3=glmnet(x,g4,family="multinomial") #' predict(fit3,newx=x[1:3,],type="response",s=0.01) #' @method predict glmnet #' @export #' @export predict.glmnet predict.glmnet=function(object,newx,s=NULL,type=c("link","response","coefficients","nonzero","class"),exact=FALSE,newoffset,...){ type=match.arg(type) if(missing(newx)){ if(!match(type,c("coefficients","nonzero"),FALSE))stop("You need to supply a value for 'newx'") } if(exact&&(!is.null(s))){ ###we augment the lambda sequence with the new values, if they are different,and refit the model using update lambda=object$lambda which=match(s,lambda,FALSE) if(!all(which>0)){ lambda=unique(rev(sort(c(s,lambda)))) check_dots(object,...)# This fails if you don't supply the crucial arguments object=update(object,lambda=lambda,...) } } a0=t(as.matrix(object$a0)) rownames(a0)="(Intercept)" nbeta=methods::rbind2(a0,object$beta)#was rbind2 if(!is.null(s)){ vnames=dimnames(nbeta)[[1]] dimnames(nbeta)=list(NULL,NULL) lambda=object$lambda lamlist=lambda.interp(lambda,s) nbeta=nbeta[,lamlist$left,drop=FALSE]%*%Diagonal(x=lamlist$frac) +nbeta[,lamlist$right,drop=FALSE]%*%Diagonal(x=1-lamlist$frac) dimnames(nbeta)=list(vnames,paste(seq(along=s))) } if(type=="coefficients")return(nbeta) if(type=="nonzero")return(nonzeroCoef(nbeta[-1,,drop=FALSE],bystep=TRUE)) ###Check on newx if(inherits(newx, "sparseMatrix"))newx=as(newx,"dgCMatrix") nfit=as.matrix(cbind2(1,newx)%*%nbeta) if(object$offset){ if(missing(newoffset))stop("No newoffset provided for prediction, yet offset used in fit of glmnet",call.=FALSE) if(is.matrix(newoffset)&&inherits(object,"lognet")&&dim(newoffset)[[2]]==2)newoffset=newoffset[,2] nfit=nfit+array(newoffset,dim=dim(nfit)) } nfit } glmnet/R/coef.glmnet.R0000644000176200001440000000036113557672013014276 0ustar liggesusers#' Extract coefficients from a glmnet object #' #' @method coef glmnet #' @rdname predict.glmnet #' @export #' @export coef.glmnet coef.glmnet=function(object,s=NULL,exact=FALSE,...) predict(object,s=s,type="coefficients",exact=exact,...) glmnet/R/coxnet.deviance.R0000644000176200001440000000467113553702453015160 0ustar liggesusers#' compute deviance for cox model output #' #' Given a fit or coefficients, compute the deciance (-2 log partial likelihood) for #' right-censored survival data #' #' \code{coxnet.deviance} computes the deviance for a single prediction, or a matrix of predictions #' #' @aliases coxnet.deviance #' @param pred matrix of predictions #' @param y a survival response matrix, as produced by \code{Surv} #' @param x optional \code{x} matrix, if \code{pred} is \code{NULL} #' @param offset optional offset #' @param weights optional observation weights #' @param beta optional coefficient vector/matrix, supplied if \code{pred=NULL} #' @return a single or vector of deviances #' @author Trevor Hastie\cr Maintainer: Trevor Hastie #' @seealso \code{coxgrad} #' @keywords Cox model #' #' @export coxnet.deviance coxnet.deviance <- function (pred = NULL, y, x = 0, offset = NULL, weights = NULL, beta = NULL) { storage.mode(x) = "double" y = response.coxnet(y) ty = y$time tevent = y$event ty = ty + (1 - tevent) * 100 * .Machine$double.eps nobs = as.integer(length(ty)) nvars = as.integer(ncol(x)) nvec=1 if (is.null(weights)) weights = rep(1, nobs) else { weights=nobs*weights/sum(weights) weights = as.double(weights) } ### Compute saturated loglikelihood wd=weights[tevent==1] tyd=ty[tevent==1] if(any(duplicated(tyd))){ wd=tapply(wd,tyd,sum) } wd=wd[wd>0] lsat=-sum(wd*log(wd)) #### if (is.null(offset)) offset = rep(0, nobs) else offset=as.double(offset) if (is.null(beta)) { beta = double(0) nvars = as.integer(0) } else { beta = as.matrix(beta) nvec = ncol(beta) } if(!is.null(pred)){ # trick to get a set of deviances based on predictions" x=as.matrix(pred) nvec=ncol(x) storage.mode(x)="double" beta=diag(nvec) nvars=as.integer(nvec) storage.mode(beta)="double" } nvec=as.integer(nvec) fit = .Fortran("loglike", nobs, nvars, x, ty, tevent, offset, weights, nvec, beta, flog = double(nvec), jerr = integer(1), PACKAGE = "glmnet") if (fit$jerr != 0) { errmsg = jerr(fit$jerr, maxit = 0, pmax = 0, family = "cox") if (errmsg$fatal) stop(errmsg$msg, call. = FALSE) else warning(errmsg$msg, call. = FALSE) } 2 *(lsat-fit$flog) } glmnet/R/response.coxnet.R0000644000176200001440000000063713534022702015225 0ustar liggesusersresponse.coxnet=function(y){ if(!is.matrix(y)||!all(match(c("time","status"),dimnames(y)[[2]],0)))stop("Cox model requires a matrix with columns 'time' (>0) and 'status' (binary) as a response; a 'Surv' object suffices",call.=FALSE) ty=as.double(y[,"time"]) tevent=as.double(y[,"status"]) if(any(ty<=0))stop("negative event times encountered; not permitted for Cox family") list(time=ty,event=tevent) } glmnet/R/coefnorm.R0000644000176200001440000000031513534022702013671 0ustar liggesuserscoefnorm=function(coeflist,q=1){ ###coeflist comes from mrelnet or multnet nmat=coeflist[[1]]*0 nclass=length(coeflist) for(i in seq(nclass)){ nmat=nmat+abs(coeflist[[i]])^q } nmat^(1/q) } glmnet/R/predict.mrelnet.R0000644000176200001440000000054513552673674015211 0ustar liggesusers#' @method predict mrelnet #' @export predict.mrelnet=function(object, newx, s = NULL, type = c("link", "response", "coefficients", "nonzero"), exact = FALSE, newoffset, ...) { type=match.arg(type) if(type=="response")type="link" object$grouped=TRUE predict.multnet(object,newx,s,type,exact,newoffset,...) } glmnet/R/getOptcv.glmnet.R0000644000176200001440000000065413534022702015147 0ustar liggesusersgetOptcv.glmnet <- function (lambda, cvm, cvsd,cvname) { if(match(cvname,c("AUC","C-index"),0))cvm=-cvm cvmin = min(cvm, na.rm = TRUE) idmin = cvm <= cvmin lambda.min = max(lambda[idmin], na.rm = TRUE) idmin = match(lambda.min, lambda) semin = (cvm + cvsd)[idmin] idmin = cvm <= semin lambda.1se = max(lambda[idmin], na.rm = TRUE) list(lambda.min = lambda.min, lambda.1se = lambda.1se) } glmnet/R/cv.mrelnet.R0000644000176200001440000000113413566632235014153 0ustar liggesuserscv.mrelnet <- function(predmat,y,type.measure,weights,foldid,grouped){ ndim = dim(y) nc = ndim[2] nobs = ndim[1] N = nobs - apply(is.na(predmat[, 1,,drop=FALSE ]), 2, sum)# dimensions could be lost if third dim=1 bigY = array(y, dim(predmat)) cvraw = switch(type.measure, mse = apply((bigY - predmat)^2,c(1, 3), sum), deviance = apply((bigY - predmat)^2, c(1,3), sum), mae = apply(abs(bigY - predmat), c(1, 3), sum) ) list(cvraw=cvraw,weights=weights,N=N,type.measure=type.measure,grouped=grouped) } glmnet/R/print.cv.glmnet.R0000644000176200001440000000367013553730725015134 0ustar liggesusers#' print a cross-validated glmnet object #' #' Print a summary of the results of cross-validation for a glmnet model. #' #' A summary of the cross-validated fit is produced, slightly different for a #' 'cv.relaxed' object than for a 'cv.glmnet' object. Note that a 'cv.relaxed' #' object inherits from class 'cv.glmnet', so by directly invoking #' \code{print.cv.glmnet(object)} will print the summary as if #' \code{relax=TRUE} had not been used. #' #' @aliases print.cv.glmnet print.cv.relaxed #' @param x fitted 'cv.glmnet' object #' @param digits significant digits in printout #' @param \dots additional print arguments #' @author Jerome Friedman, Trevor Hastie and Rob Tibshirani\cr Maintainer: #' Trevor Hastie #' @seealso \code{glmnet}, \code{predict} and \code{coef} methods. #' @references Friedman, J., Hastie, T. and Tibshirani, R. (2008) #' \emph{Regularization Paths for Generalized Linear Models via Coordinate #' Descent}\cr \url{https://arxiv.org/abs/1707.08692}\cr Hastie, T., #' Tibshirani, Robert, Tibshirani, Ryan (2019) \emph{Extended Comparisons of #' Best Subset Selection, Forward Stepwise Selection, and the Lasso} #' @keywords models regression #' @examples #' #' x = matrix(rnorm(100 * 20), 100, 20) #' y = rnorm(100) #' fit1 = cv.glmnet(x, y) #' print(fit1) #' fit1r = cv.glmnet(x, y, relax = TRUE) #' print(fit1r) #' ## print.cv.glmnet(fit1r) ## CHECK WITH TREVOR #' @method print cv.glmnet #' @export #' @export print.cv.glmnet print.cv.glmnet <- function(x, digits = max(3, getOption("digits") - 3), ...) { cat("\nCall: ", deparse(x$call), "\n\n") optlams=c(x$lambda.min,x$lambda.1se) which=match(optlams,x$lambda) mat=with(x,cbind(optlams,cvm[which],cvsd[which],nzero[which])) dimnames(mat)=list(c("min","1se"),c("Lambda","Measure","SE","Nonzero")) cat("Measure:", x$name,"\n\n") mat=data.frame(mat,check.names=FALSE) class(mat)=c("anova",class(mat)) print(mat,digits=digits) } glmnet/R/predict.cv.relaxed.R0000644000176200001440000000161513552673674015575 0ustar liggesusers#' @method predict cv.relaxed #' @param gamma Value (single) of 'gamma' at which predictions are to be made #' @rdname predict.cv.glmnet #' @export predict.cv.relaxed <- function (object, newx, s = c("lambda.1se", "lambda.min"), gamma=c("gamma.1se","gamma.min"),...) { relaxed=object$relaxed if (is.numeric(s)) lambda = s else if (is.character(s)) { s = match.arg(s) lambda = relaxed[[s]] if(missing(gamma)){ gamma=switch(s, lambda.1se=relaxed[["gamma.1se"]], lambda.min=relaxed[["gamma.min"]] ) } } else stop("Invalid form for s") if (is.character(gamma)) { gamma = match.arg(gamma) gamma = relaxed[[gamma]] } if(!is.numeric(gamma))stop("Invalid form for gamma") predict(object$glmnet.fit, newx, s = lambda,gamma=gamma, ...) } glmnet/R/Cindex.R0000644000176200001440000000502613552673674013323 0ustar liggesusers#' compute C index for a Cox model #' #' Computes Harrel's C index for predictions from a \code{"coxnet"} object. #' #' Computes the concordance index, taking into account censoring. #' #' @param pred Predictions from a \code{"coxnet"} object #' @param y a survival response object - a matrix with two columns "time" and #' "status"; see documentation for "glmnet" #' @param weights optional observation weights #' @author Rob Tibshirani\cr Maintainer: Trevor Hastie #' @seealso \code{cv.glmnet} #' @references Harrel Jr, F. E. and Lee, K. L. and Mark, D. B. (1996) #' \emph{Tutorial in biostatistics: multivariable prognostic models: issues in #' developing models, evaluating assumptions and adequacy, and measuring and #' reducing error}, Statistics in Medicine, 15, pages 361--387. #' @keywords Cox models cross-validation #' @examples #' #' set.seed(10101) #' N = 1000 #' p = 30 #' nzc = p/3 #' x = matrix(rnorm(N * p), N, p) #' beta = rnorm(nzc) #' fx = x[, seq(nzc)] %*% beta/3 #' hx = exp(fx) #' ty = rexp(N, hx) #' tcens = rbinom(n = N, prob = 0.3, size = 1) # censoring indicator #' y = cbind(time = ty, status = 1 - tcens) # y=Surv(ty,1-tcens) with library(survival) #' fit = glmnet(x, y, family = "cox") #' pred = predict(fit, newx = x) #' Cindex(pred, y) #' cv.glmnet(x, y, family = "cox", type.measure = "C") #' #' @export Cindex Cindex=function(pred,y,weights=rep(1,nrow(y))){ ### Written by Rob Tibshirani; edited by Trevor Hastie ### This function gives identical results to the summary function from coxph, ### and the concordance.index function in survcomp (with their default settings), ### and no ties in yhat. ### Works with ties in y. But does not agree with latter when yhat has ties. ### There are conflicting definitions for c-index in this case ### ### Formula used is ### Concordance = (num. all concordant pairs + num. tied pairs/2)/(num. total pairs including ties). ### with weights, weights used are average wts for each pair (??) status=y[,"status"] ty=y[,"time"] risksets=which(status==1) weights=length(weights)*weights/sum(weights) fun=function(riskset,ty,pred,weights){ total=concordant=0 i=riskset rest=which(ty>ty[i]) if(length(rest)>0){ ww=(weights[rest]+weights[i])/2 total=sum(ww) concordant = 1.0*sum(ww*(pred[rest] #' @seealso \code{glmnet} #' @keywords models #' @examples #' #' set.seed(101) #' ### Single data frame #' X = matrix(rnorm(20), 10, 2) #' X3 = sample(letters[1:3], 10, replace = TRUE) #' X4 = sample(LETTERS[1:3], 10, replace = TRUE) #' df = data.frame(X, X3, X4) #' makeX(df) #' makeX(df, sparse = TRUE) #' #' ### Single data freame with missing values #' Xn = X #' Xn[3, 1] = NA #' Xn[5, 2] = NA #' X3n = X3 #' X3n[6] = NA #' X4n = X4 #' X4n[9] = NA #' dfn = data.frame(Xn, X3n, X4n) #' #' makeX(dfn) #' makeX(dfn, sparse = TRUE) #' makeX(dfn, na.impute = TRUE) #' makeX(dfn, na.impute = TRUE, sparse = TRUE) #' #' ### Test data as well #' X = matrix(rnorm(10), 5, 2) #' X3 = sample(letters[1:3], 5, replace = TRUE) #' X4 = sample(LETTERS[1:3], 5, replace = TRUE) #' dft = data.frame(X, X3, X4) #' #' makeX(df, dft) #' makeX(df, dft, sparse = TRUE) #' #' ### Missing data in test as well #' Xn = X #' Xn[3, 1] = NA #' Xn[5, 2] = NA #' X3n = X3 #' X3n[1] = NA #' X4n = X4 #' X4n[2] = NA #' dftn = data.frame(Xn, X3n, X4n) #' #' makeX(dfn, dftn) #' makeX(dfn, dftn, sparse = TRUE) #' makeX(dfn, dftn, na.impute = TRUE) #' makeX(dfn, dftn, sparse = TRUE, na.impute = TRUE) #' #' @export makeX makeX=function(train,test=NULL, na.impute=FALSE,sparse=FALSE,...){ df=train istest=!is.null(test) ntr=nrow(train) if(istest){ nte=nrow(test) df=rbind(df,test) } x=prepareX(df,sparse=sparse) if(na.impute){ xbar=colMeans(x[seq(ntr),],na.rm=TRUE) x=na.replace(x,xbar) } if(istest){ xt=x[seq(ntr+1,ntr+nte),] x=x[seq(ntr),] } if(na.impute)attr(x,"means")=xbar if(istest)list(x=x,xtest=xt) else x } #' @importFrom stats contrasts model.matrix na.pass #' @importFrom Matrix sparse.model.matrix #' @export prepareX prepareX <- function(df,sparse=FALSE,...){ if(!inherits(df,"data.frame"))stop("first argument must be of class `data.frame`") whichfac=sapply(df,inherits,"factor") oldna=options()$na.action cna=as.character(substitute(na.action)) options(na.action=na.pass) on.exit(options(na.action=oldna)) if(any(whichfac)) ctr=lapply(df[,whichfac], contrasts,contrast=FALSE) else ctr=NULL if(sparse){ m=sparse.model.matrix(~.-1,data=df,contrasts.arg=ctr,...) m=na_sparse_fix(m,names(df)) # sparse.model.matrix is faulty } else m = model.matrix(~.-1,data=df,contrasts.arg=ctr,...) if(any(whichfac))attr(m,"contrasts")=NULL attr(m,"assign")=NULL m } #' @export na_sparse_fix na_sparse_fix=function(x,dfnames){ a=attributes(x) ac=a$contrasts as=a$assign if(is.null(ac))return(x) acn=names(ac) whichn=match(acn,dfnames) for(i in whichn){ xi=x[,as==i] rowtot=rowSums(xi) if(sum(rowtot) #' @seealso \code{makeX} and \code{glmnet} #' @keywords models #' @examples #' #' set.seed(101) #' ### Single data frame #' X = matrix(rnorm(20), 10, 2) #' X[3, 1] = NA #' X[5, 2] = NA #' X3 = sample(letters[1:3], 10, replace = TRUE) #' X3[6] = NA #' X4 = sample(LETTERS[1:3], 10, replace = TRUE) #' X4[9] = NA #' dfn = data.frame(X, X3, X4) #' #' x = makeX(dfn) #' m = rowSums(x, na.rm = TRUE) #' na.replace(x, m) #' #' x = makeX(dfn, sparse = TRUE) #' na.replace(x, m) #' #' @export na.replace na.replace=function(x,m=rowSums(x,na.rm=TRUE)){ if(inherits(x,"sparseMatrix")){ x=as(x,"CsparseMatrix") ccount=diff(x@p) cindex=rep(1:length(ccount),ccount) nas=is.na(x@x) if(any(nas))x@x[nas]=m[cindex[nas]] } else{ d=dim(x) cols=rep(1:d[2],rep(d[1],d[2])) nas=is.na(x) if(any(nas))x[nas]=m[cols[nas]] } x } glmnet/R/coef.relaxed.R0000644000176200001440000000025513557667631014450 0ustar liggesusers#' @method coef relaxed #' @export #' @export coef.relaxed coef.relaxed=function(object,s=NULL, gamma=1,...) predict(object, s=s, gamma= gamma, type="coefficients",...) glmnet/R/mrelnet.R0000644000176200001440000000406513534022702013535 0ustar liggesusersmrelnet=function(x,is.sparse,ix,jx,y,weights,offset,alpha,nobs,nvars,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,jsd,intr,vnames,maxit){ maxit=as.integer(maxit) weights=as.double(weights) ### compute the null deviance y=as.matrix(y) nr=ncol(y) if(nr>1){ responseNames=dimnames(y)[[2]] if(is.null(responseNames))responseNames=paste("y",seq(nr),sep="") } storage.mode(y)="double" if(is.null(offset)){ is.offset=FALSE} else{ offset=as.matrix(offset) storage.mode(offset)="double" if(!all.equal(dim(offset),dim(y)))stop("Offset must match dimension of y") y=y-offset is.offset=TRUE } nulldev=0 for(i in seq(nr)){ ybar=weighted.mean(y[,i],weights) nulldev=nulldev+sum(weights* (y[,i]-ybar)^2) } storage.mode(nr)="integer" fit=if(is.sparse).Fortran("multspelnet", parm=alpha,nobs,nvars,nr,x,ix,jx,y,weights,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,jsd,intr,maxit, lmu=integer(1), a0=double(nlam*nr), ca=double(nx*nlam*nr), ia=integer(nx), nin=integer(nlam), rsq=double(nlam), alm=double(nlam), nlp=integer(1), jerr=integer(1),PACKAGE="glmnet" ) else .Fortran("multelnet", parm=alpha,nobs,nvars,nr,as.double(x),y,weights,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,jsd,intr,maxit, lmu=integer(1), a0=double(nlam*nr), ca=double(nx*nlam*nr), ia=integer(nx), nin=integer(nlam), rsq=double(nlam), alm=double(nlam), nlp=integer(1), jerr=integer(1),PACKAGE="glmnet" ) if(fit$jerr!=0){ errmsg=jerr(fit$jerr,maxit,pmax=nx,family="mrelnet") if(errmsg$fatal)stop(errmsg$msg,call.=FALSE) else warning(errmsg$msg,call.=FALSE) } if(nr>1) outlist=getcoef.multinomial(fit,nvars,nx,vnames,nr,responseNames,center.intercept=FALSE) else outlist=getcoef(fit,nvars,nx,vnames) dev=fit$rsq[seq(fit$lmu)] outlist=c(outlist,list(dev.ratio=dev,nulldev=nulldev,npasses=fit$nlp,jerr=fit$jerr,offset=is.offset)) class(outlist)="mrelnet" outlist } glmnet/R/jerr.fishnet.R0000644000176200001440000000046113534022702014464 0ustar liggesusersjerr.fishnet=function(n,maxit,pmax){ outlist=jerr.elnet(n,maxit,pmax) if(outlist$msg!="Unknown error")return(outlist) if(n==8888)msg="Negative response values - should be counts" else if(n==9999)msg="No positive observation weights" else msg="Unknown error" list(n=n,fatal=TRUE,msg=msg) } glmnet/R/plot.cv.relaxed.R0000644000176200001440000000335313552673674015122 0ustar liggesusers#' method plot cv.relaxed #' @importFrom shape colorlegend #' @param se.bands Should shading be produced to show standard-error bands; #' default is \code{TRUE} #' @rdname plot.cv.glmnet #' @export plot.cv.relaxed <- function (x, se.bands=TRUE,...) { xr=x$relaxed oldpar = par(mar = c(4, 4, 3, 4)) on.exit(par(oldpar)) statlist=xr$statlist gamma=xr$gamma ngamma=length(gamma) ylim=range(unlist(lapply(statlist,"[[","cvm"))) if(se.bands){ cvup=lapply(statlist,"[[","cvup") cvlo=lapply(statlist,"[[","cvlo") ylim=range(ylim,unlist(cvup),unlist(cvlo)) } xlim=log(range(unlist(lapply(statlist,"[[","lambda")))+0.00001) cvcolors = rainbow(ngamma, start = .1, end = 1) with(statlist[[ngamma]],plot(log(lambda), cvm, type = "n", xlab = expression(Log(lambda)), ylab = x$name,ylim=ylim,xlim=xlim)) if(se.bands){ for (i in seq(ngamma)) with(statlist[[i]],polygon(c(log(lambda),rev(log(lambda))),c(cvup,rev(cvlo)), col="floralwhite",border="antiquewhite")) } for (i in seq(ngamma)) with(statlist[[i]],lines(log(lambda), cvm, lwd = 2, col = cvcolors[i])) mins=log(c(xr$lambda.min,xr$lambda.1se)) abline(v=mins,lty=3) dof= statlist[[1]]$nzero lambda=statlist[[1]]$lambda axis(side = 3, at = log(lambda), labels = paste(dof), tick = FALSE, line = 0) # dof=c(x$nzero.min,x$nzero.1se) # axis(3, at = mins, labels = format(dof), tick=FALSE, line = 0,cex.axis=.9) colorlegend(posy = c(0.2, 0.8), posx = c(0.93, 0.945)-.03, col = rainbow(ngamma, start = 0.1, end = 1), zlim = c(0, 1), zval = gamma , main = expression(gamma),digit=2) invisible() } glmnet/R/pb.R0000644000176200001440000000022413573755070012477 0ustar liggesusers## Create and store the pb createPB <- function(...) { pb <- utils::txtProgressBar(...) .Call("storePB", pb, PACKAGE = "glmnet") pb } glmnet/R/roc.glmnet.R0000644000176200001440000000265313557670702014156 0ustar liggesusers#' Compute the roc curve(s) for a binimial glmnet model. #' #' @rdname assess.glmnet #' @export roc.glmnet roc.glmnet=function(object,newx=NULL,newy,...){ ### object must be either a glmnet or cv.glmnet object, or else a matrix or a vector of predictions of a glmnet model oclass=grep("glmnet",class(object)) if(length(oclass)){# either a glmnet or cv.glmnet if(family(object)!="binomial")stop("roc available only for binomial family") predmat=predict(object,newx=newx,...) } else{ predmat=object if(is.vector(predmat))predmat=as.matrix(predmat) } roc.raw=function(prediction,y){ op=order(prediction,decreasing=TRUE) preds=prediction[op] y=y[op] noty=1-y if(any(duplicated(preds))){ y=rev(tapply(y,preds,sum)) noty=rev(tapply(noty,preds,sum)) } data.frame( FPR=cumsum(noty)/sum(noty),TPR=cumsum(y)/sum(y)) } ### newy should be binary, but could be a two-class matrix! nc = dim(newy) if (is.null(nc)) { newy = as.factor(newy) ntab = table(newy) nc = length(ntab) newy = diag(nc)[as.numeric(newy), ] } else { nc = nc[2] } if(nc!=2)stop("newy should be binary, or a factor with two levels") newy=newy[,2] n=nrow(predmat) if(n!=length(newy))stop("mismatch in size of two arguments") out=apply(predmat,2,roc.raw,y=newy) if(length(out)==1)out=out[[1]] out } glmnet/R/na.mean.R0000644000176200001440000000030113534022702013371 0ustar liggesusersna.mean=function(x){ ### replace missing entries with mean for that column. namean=function(x){ nas=is.na(x) if(any(nas)) x[nas]=mean(x,na.rm=TRUE) x } apply(x,2,namean) } glmnet/R/error.bars.R0000644000176200001440000000041013534022702014134 0ustar liggesuserserror.bars <- function(x, upper, lower, width = 0.02, ...) { xlim <- range(x) barw <- diff(xlim) * width segments(x, upper, x, lower, ...) segments(x - barw, upper, x + barw, upper, ...) segments(x - barw, lower, x + barw, lower, ...) range(upper, lower) } glmnet/R/cv.lognet.R0000644000176200001440000000424613534022702013767 0ustar liggesuserscv.lognet <- function(predmat,y,type.measure,weights,foldid,grouped){ prob_min = 1e-05 prob_max = 1 - prob_min nc = dim(y) if (is.null(nc)) { y = as.factor(y) ntab = table(y) nc = as.integer(length(ntab)) y = diag(nc)[as.numeric(y), ] } N = nrow(y) nfolds = max(foldid) if ((N/nfolds < 10) && type.measure == "auc") { warning("Too few (< 10) observations per fold for type.measure='auc' in cv.lognet; changed to type.measure='deviance'. Alternatively, use smaller value for nfolds", call. = FALSE) type.measure = cvtype("deviance", "lognet") } predmat=1/(1+exp(-predmat)) nlambda=ncol(predmat) nlams=rep(nlambda,nfolds) if (type.measure == "auc") { cvraw = matrix(NA, nfolds, nlambda) good = matrix(0, nfolds, nlambda) for (i in seq(nfolds)) { good[i, seq(nlams[i])] = 1 which = foldid == i for (j in seq(nlams[i])) { cvraw[i, j] = auc.mat(y[which, ], predmat[which, j], weights[which]) } } N = apply(good, 2, sum) weights = tapply(weights, foldid, sum) grouped=FALSE } else { ywt = apply(y, 1, sum) y = y/ywt weights = weights * ywt N = nrow(y) - apply(is.na(predmat), 2, sum) cvraw = switch(type.measure, mse = (y[, 1] - (1 - predmat))^2 + (y[, 2] - predmat)^2, mae = abs(y[, 1] - (1 - predmat)) + abs(y[, 2] - predmat), deviance = { predmat = pmin(pmax(predmat, prob_min), prob_max) lp = y[, 1] * log(1 - predmat) + y[, 2] * log(predmat) ly = log(y) ly[y == 0] = 0 ly = drop((y * ly) %*% c(1, 1)) 2 * (ly - lp) }, class = y[, 1] * (predmat > 0.5) + y[, 2] * (predmat <= 0.5) ) } list(cvraw=cvraw,weights=weights,N=N,type.measure=type.measure,grouped=grouped) } glmnet/R/confusion.glmnet.R0000644000176200001440000000402113566625272015367 0ustar liggesusers#' Compute a confusion matrix (or many) for a binomial or multinomial glmnet model #' #' @rdname assess.glmnet #' @export confusion.glmnet confusion.glmnet=function(object,newx=NULL,newy,family=c("binomial","multinomial"),...){ ### object must be either a glmnet or cv.glmnet object fit with family binomial or multinomial ### or else a matrix/array of predictions of a glmnet model of these families ### (the last dimension can be 1) ### (not on the mean scale, but natural parameter scale) oclass=grep("glmnet",class(object)) if(length(oclass)){# either a glmnet or cv.glmnet if(!match(family(object),c("binomial","multinomial"),FALSE)) stop("confusion available only for binomial or multinomial family") classmat=predict(object,newx=newx,type="class",...) } else{ fam=match.arg(family) predmat=object if(fam=="binomial"){ classnames=attr(predmat,"classnames")#if it was created by cv with keep if(is.null(classnames))classnames=c("1","2") if(is.vector(predmat))predmat=as.matrix(predmat) cnum=ifelse(predmat>0,2,1) classmat=classnames[cnum] if(is.matrix(predmat))classmat=array(classmat,dim(predmat),dimnames(predmat)) } else{ classmat=apply(predmat, 3, glmnet_softmax) } } ### newy can be a matrix or a factor nc = dim(newy) if (is.null(nc)) { newy = as.factor(newy) } else { nc = nc[2] yc=newy%*%(1:nc) cn=colnames(newy) if(!is.null(cn)) newy=factor(yc,labels=cn) else newy=factor(yc) } ctable=function(...){ tab=table(...) class(tab)=c("confusion.table",class(tab)) tab } if(ncol(classmat)>1) ## convert to a dataframe, to prevent apply simplifying lapply(data.frame(classmat,stringsAsFactors=FALSE,check.names=FALSE), function(x,y)ctable(Predicted=x,True=y),y=newy) else(ctable(Predicted=classmat,True=newy)) } glmnet/R/predict.coxnet.R0000644000176200001440000000260313552673674015040 0ustar liggesusers#' @method predict coxnet #' @export predict.coxnet=function(object,newx,s=NULL,type=c("link","response","coefficients","nonzero"),exact=FALSE,newoffset,...){ type=match.arg(type) ###coxnet has no intercept, so we treat it separately if(missing(newx)){ if(!match(type,c("coefficients","nonzero"),FALSE))stop("You need to supply a value for 'newx'") } if(exact&&(!is.null(s))){ lambda=object$lambda which=match(s,lambda,FALSE) if(!all(which>0)){ lambda=unique(rev(sort(c(s,lambda)))) check_dots(object,...)# This fails if you don't supply the crucial arguments object=update(object,lambda=lambda,...) } } nbeta=object$beta if(!is.null(s)){ vnames=dimnames(nbeta)[[1]] dimnames(nbeta)=list(NULL,NULL) lambda=object$lambda lamlist=lambda.interp(lambda,s) nbeta=nbeta[,lamlist$left,drop=FALSE]%*%Diagonal(x=lamlist$frac) +nbeta[,lamlist$right,drop=FALSE]%*%Diagonal(x=1-lamlist$frac) dimnames(nbeta)=list(vnames,paste(seq(along=s))) } if(type=="coefficients")return(nbeta) if(type=="nonzero")return(nonzeroCoef(nbeta,bystep=TRUE)) nfit=as.matrix(newx%*%nbeta) if(object$offset){ if(missing(newoffset))stop("No newoffset provided for prediction, yet offset used in fit of glmnet",call.=FALSE) nfit=nfit+array(newoffset,dim=dim(nfit)) } switch(type, response=exp(nfit), link=nfit ) } glmnet/R/plot.relaxed.R0000644000176200001440000000241113552673674014505 0ustar liggesusers#' @method plot relaxed #' @param gamma Value of the mixing parameter for a "relaxed" fit #' @rdname plot.glmnet #' @export plot.relaxed <- function(x,xvar = c("lambda", "dev"), label = FALSE, gamma=1, ...) { xvar=match.arg(xvar) if(any(wh<-gamma<0)){ warning("negative gamma values ignored") gamma=gamma[!wh] } if(any(wh<-gamma>1)){ warning("gamma values larger than 1 ignored") gamma=gamma[!wh] } if(!length(gamma))stop("no valid values of gamma") for(i in seq(along=length(gamma))){ bfit=blend.relaxed(x,gamma=gamma[i],extend=FALSE) plot(bfit,xvar=xvar,label=label,...) } } #' @method print relaxed #' @export print.relaxed <- function (x, digits = max(3, getOption("digits") - 3), ...) { cat("\nCall: ", deparse(x$call), "\n") cat("Relaxed\n\n") which=match(x$relaxed$lambda,x$lambda,0) rdev=rep(NA,length(x$lambda)) rdev[which]=signif(x$relaxed$dev.ratio, digits) out=data.frame(Df = x$df, `%Dev` = signif(x$dev.ratio, digits), `%Dev R`=rdev, Lambda = signif(x$lambda, digits),check.names=FALSE,row.names=seq(along=rdev)) class(out)=c("anova",class(out)) print(out) } glmnet/R/cv.fishnet.R0000644000176200001440000000102513534022702014127 0ustar liggesuserscv.fishnet <-function(predmat,y,type.measure,weights,foldid,grouped){ devi = function(y, eta) { deveta = y * eta - exp(eta) devy = y * log(y) - y devy[y == 0] = 0 2 * (devy - deveta) } N = length(y) - apply(is.na(predmat), 2, sum) cvraw = switch(type.measure, mse = (y - exp(predmat))^2, mae = abs(y - exp(predmat)), deviance = devi(y, predmat) ) list(cvraw=cvraw,weights=weights,N=N,type.measure=type.measure,grouped=grouped) } glmnet/R/bigGlm.R0000644000176200001440000000616513561056202013275 0ustar liggesusers#' fit a glm with all the options in \code{glmnet} #' #' Fit a generalized linear model as in \code{glmnet} but unpenalized. This #' allows all the features of \code{glmnet} such as sparse x, bounds on #' coefficients, offsets, and so on. #' #' This is essentially the same as fitting a "glmnet" model with a single value #' \code{lambda=0}, but it avoids some edge cases. CAVEAT: If the user tries a #' problem with N smaller than or close to p for some models, it is likely to #' fail (and maybe not gracefully!) If so, use the \code{path=TRUE} argument. #' #' @param x input matrix #' @param ... Most other arguments to glmnet that make sense #' @param path Since \code{glmnet} does not do stepsize optimization, the Newton #' algorithm can get stuck and not converge, especially with unpenalized fits. With \code{path=TRUE}, #' the fit computed with pathwise lasso regularization. The current implementation does this twice: #' the first time to get the lambda sequence, and the second time with a zero attached to the end). #' Default is \code{path=FALSE}. #' @return It returns an object of class "bigGlm" that inherits from class #' "glmnet". That means it can be predicted from, coefficients extracted via #' \code{coef}. It has its own print method. #' @author Trevor Hastie\cr Maintainer: Trevor Hastie #' \email{hastie@@stanford.edu} #' @seealso \code{print}, \code{predict}, and \code{coef} methods. #' @keywords models regression #' @examples #' #' # Gaussian #' x = matrix(rnorm(100 * 20), 100, 20) #' y = rnorm(100) #' fit1 = bigGlm(x, y) #' print(fit1) #' #' fit2=bigGlm(x,y>0,family="binomial") #' print(fit2) #' fit2p=bigGlm(x,y>0,family="binomial",path=TRUE) #' print(fit2p) #' #' @export bigGlm bigGlm=function (x,..., path=FALSE){ ### fit a model using x, y and the other glmnet specs in ... unpenalized thiscall = match.call(glmnet) ### Next few lines simply in case x is a vector, in which case glmnet complains bx=cbind(x,1) d=dim(bx) n=d[1] p=d[2]-1 bx[1,p+1]=0 # so its not a constant arglist = list(...) arglist$x = bx arglist$exclude=p+1 if(!path){ arglist$lambda=0 fit = do.call("glmnet", arglist) if (is.list(fit$beta)) fit$beta = lapply(fit$beta, function(x, p) x[1:p, , drop = FALSE], p) else fit$beta = fit$beta[1:p, , drop = FALSE] } else { fit = do.call("glmnet", arglist)# get the lambda sequence lam0=c(fit$lambda,0) arglist$lambda=lam0 fit = do.call("glmnet", arglist) nlam=length(fit$lambda)#may have stopped early if (is.list(fit$beta)){ fit$a0=fit$a0[,nlam,drop=FALSE] fit$beta = lapply(fit$beta, function(x, p,nlam) x[1:p,nlam , drop = FALSE], p,nlam) dfmat=fit$dfmat if(!is.null(dfmat))fit$dfmat=dfmat[,nlam,drop=FALSE] } else { fit$a0=fit$a0[nlam] fit$beta = fit$beta[1:p,nlam , drop = FALSE] } fit$df=p fit$lambda=0 fit$dim=c(fit$dim[1],1) fit$dev.ratio=fit$dev.ratio[nlam] } fit$call = thiscall class(fit) = c("bigGlm", class(fit)) fit } glmnet/R/cvstats.R0000644000176200001440000000127413534022702013555 0ustar liggesuserscvstats=function(cvstuff,foldid,nfolds,lambda,nz,grouped,...){ if (grouped){ nlams=rep(dim(cvstuff$cvraw)[2],nfolds) ## All the same - this should go cvstuff= cvcompute(cvstuff, foldid, nlams) } cvm=with(cvstuff,apply(cvraw, 2, weighted.mean, w = weights, na.rm = TRUE)) cvsd=with(cvstuff, sqrt(apply(scale(cvraw, cvm, FALSE)^2, 2, weighted.mean, w = weights, na.rm = TRUE)/(N - 1))) nas=is.na(cvsd) if(any(nas)){ lambda=lambda[!nas] cvm=cvm[!nas] cvsd=cvsd[!nas] nz=nz[!nas] } list(lambda = lambda, cvm = cvm, cvsd = cvsd, cvup = cvm + cvsd, cvlo = cvm - cvsd, nzero = nz) } glmnet/R/predict.multnet.R0000644000176200001440000000571613574023574015230 0ustar liggesusers#' @method predict multnet #' @export predict.multnet <- function (object, newx, s = NULL, type = c("link", "response", "coefficients", "class", "nonzero"), exact = FALSE, newoffset, ...) { type = match.arg(type) ###multnet is very different, so we treat it separately if(missing(newx)){ if(!match(type,c("coefficients","nonzero"),FALSE))stop("You need to supply a value for 'newx'") } if(exact&&(!is.null(s))){ lambda=object$lambda which=match(s,lambda,FALSE) if(!all(which>0)){ lambda=unique(rev(sort(c(s,lambda)))) check_dots(object,...)# This fails if you don't supply the crucial arguments object=update(object,lambda=lambda,...) } } a0 = object$a0 rownames(a0) = rep("(Intercept)", nrow(a0)) nbeta = object$beta klam = dim(a0) nclass = klam[[1]] nlambda = length(s) if (!is.null(s)) { lambda = object$lambda lamlist = lambda.interp(lambda, s) for (i in seq(nclass)) { kbeta = methods::rbind2(a0[i, , drop = FALSE], nbeta[[i]])#was rbind2 vnames = dimnames(kbeta)[[1]] dimnames(kbeta) = list(NULL, NULL) kbeta = kbeta[, lamlist$left, drop = FALSE] %*% Diagonal(x=lamlist$frac) + kbeta[, lamlist$right, drop = FALSE] %*% Diagonal(x=1 - lamlist$frac) dimnames(kbeta) = list(vnames, paste(seq(along = s))) nbeta[[i]] = kbeta } } else { for (i in seq(nclass)) nbeta[[i]] = methods::rbind2(a0[i, ], nbeta[[i]])#was rbind2 nlambda=length(object$lambda) } if (type == "coefficients") return(nbeta) if (type == "nonzero") # if(object$grouped)return(nonzeroCoef(object$beta[[1]],bystep=TRUE)) if(object$grouped)return(nonzeroCoef(nbeta[[1]],bystep=TRUE)) else return(lapply(nbeta, function(x) nonzeroCoef(x[-1, , drop = FALSE], bystep = TRUE))) dd = dim(newx) if (inherits(newx, "sparseMatrix")) newx = as(newx, "dgCMatrix") npred = dd[[1]] dn = list(names(nbeta), dimnames(nbeta[[1]])[[2]], dimnames(newx)[[1]]) dp = array(0, c(nclass, nlambda, npred), dimnames = dn) for (i in seq(nclass)) { fitk = cbind2(1, newx) %*% (nbeta[[i]]) dp[i, , ] = dp[i, , ] + t(as.matrix(fitk)) } if (object$offset) { if (missing(newoffset)) stop("No newoffset provided for prediction, yet offset used in fit of glmnet", call. = FALSE) if (!is.matrix(newoffset) || dim(newoffset)[[2]] != nclass) stop(paste("Dimension of newoffset should be", npred, "x", nclass), call. = FALSE) toff = t(newoffset) for (i in seq(nlambda)) { dp[, i, ] = dp[, i, ] + toff } } switch(type, response = { pp = exp(dp) psum = apply(pp, c(2, 3), sum) aperm(pp/rep(psum, rep(nclass, nlambda * npred)), c(3, 1, 2)) }, link = aperm(dp, c(3, 1, 2)), class = { dp = aperm(dp, c(3, 1, 2)) apply(dp, 3, glmnet_softmax) }) } glmnet/R/fix.lam.R0000644000176200001440000000015413534022702013420 0ustar liggesusersfix.lam=function(lam){ if(length(lam)>2){ llam=log(lam) lam[1]=exp(2*llam[2]-llam[3]) } lam } glmnet/R/zeromat.R0000644000176200001440000000040713534022702013544 0ustar liggesuserszeromat=function(nvars,lmu,vnames,stepnames){ ca=rep(0,lmu) ia=seq(lmu+1) ja=rep(1,lmu) dd=c(nvars,lmu) new("dgCMatrix", Dim = dd, Dimnames = list(vnames,stepnames), x = as.vector(ca), p = as.integer(ia - 1), i = as.integer(ja - 1)) } glmnet/R/glmnet.control.R0000644000176200001440000000736513552673674015066 0ustar liggesusers#' internal glmnet parameters #' #' View and/or change the factory default parameters in glmnet #' #' If called with no arguments, \code{glmnet.control()} returns a list with the #' current settings of these parameters. Any arguments included in the call #' sets those parameters to the new values, and then silently returns. The #' values set are persistent for the duration of the R session. #' #' @param fdev minimum fractional change in deviance for stopping path; factory #' default = 1.0e-5 #' @param devmax maximum fraction of explained deviance for stopping path; #' factory default = 0.999 #' @param eps minimum value of lambda.min.ratio (see glmnet); factory default= #' 1.0e-6 #' @param big large floating point number; factory default = 9.9e35. Inf in #' definition of upper.limit is set to big #' @param mnlam minimum number of path points (lambda values) allowed; factory #' default = 5 #' @param pmin minimum probability for any class. factory default = 1.0e-9. #' Note that this implies a pmax of 1-pmin. #' @param exmx maximum allowed exponent. factory default = 250.0 #' @param prec convergence threshold for multi response bounds adjustment #' solution. factory default = 1.0e-10 #' @param mxit maximum iterations for multiresponse bounds adjustment solution. #' factory default = 100 #' @param itrace If 1 then progress bar is displayed when running \code{glmnet} #' and \code{cv.glmnet}. factory default = 0 #' @param factory If \code{TRUE}, reset all the parameters to the factory #' default; default is \code{FALSE} #' @return A list with named elements as in the argument list #' @author Jerome Friedman, Trevor Hastie\cr Maintainer: Trevor Hastie #' \email{hastie@@stanford.edu} #' @seealso \code{glmnet} #' @keywords models regression #' @examples #' #' glmnet.control(fdev = 0) #continue along path even though not much changes #' glmnet.control() # view current settings #' glmnet.control(factory = TRUE) # reset all the parameters to their default #' #' @export glmnet.control glmnet.control <- function (fdev = 1e-05, devmax = 0.999, eps = 1e-06, big = 9.9e+35, mnlam = 5, pmin = 1e-09, exmx = 250, prec = 1e-10, mxit = 100, itrace = 0, factory = FALSE) { inquiry=!nargs() if (factory) invisible(glmnet.control(fdev = 1e-05, devmax = 0.999, eps = 1e-06, big = 9.9e+35, mnlam = 5, pmin = 1e-09, exmx = 250, prec = 1e-10, mxit = 100, itrace = 0)) else { if (!missing(fdev)) .Fortran("chg_fract_dev", as.double(fdev), PACKAGE = "glmnet") if (!missing(devmax)) .Fortran("chg_dev_max", as.double(devmax), PACKAGE = "glmnet") if (!missing(eps)) .Fortran("chg_min_flmin", as.double(eps), PACKAGE = "glmnet") if (!missing(big)) .Fortran("chg_big", as.double(big), PACKAGE = "glmnet") if (!missing(mnlam)) .Fortran("chg_min_lambdas", as.integer(mnlam), PACKAGE = "glmnet") if (!missing(pmin)) .Fortran("chg_min_null_prob", as.double(pmin), PACKAGE = "glmnet") if (!missing(exmx)) .Fortran("chg_max_exp", as.double(exmx), PACKAGE = "glmnet") if (!missing(prec) | !missing(mxit)) .Fortran("chg_bnorm", as.double(prec), as.integer(mxit), PACKAGE = "glmnet") if (!missing(itrace)) .Fortran("chg_itrace", as.integer(itrace), PACKAGE = "glmnet") value=c(.Fortran("get_int_parms", fdev = double(1), eps = double(1), big = double(1), mnlam = integer(1), devmax = double(1), pmin = double(1), exmx = double(1), itrace = integer(1), PACKAGE = "glmnet"), .Fortran("get_bnorm", prec = double(1), mxit = integer(1), PACKAGE = "glmnet")) if(inquiry)value else invisible(value) } } glmnet/R/lognet.R0000644000176200001440000001017313534022702013354 0ustar liggesuserslognet=function(x,is.sparse,ix,jx,y,weights,offset,alpha,nobs,nvars,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,intr,vnames,maxit,kopt,family){ nc=dim(y) maxit=as.integer(maxit) if(is.null(nc)){ ## Need to construct a y matrix, and include the weights y=as.factor(y) ntab=table(y) minclass=min(ntab) if(minclass<=1)stop("one multinomial or binomial class has 1 or 0 observations; not allowed") if(minclass<8)warning("one multinomial or binomial class has fewer than 8 observations; dangerous ground") classnames=names(ntab) nc=as.integer(length(ntab)) y=diag(nc)[as.numeric(y),] } else{ noo=nc[1] if(noo!=nobs)stop("x and y have different number of rows in call to glmnet",call.=FALSE) nc=as.integer(nc[2]) classnames=colnames(y) } #Check for size limitations maxvars=.Machine$integer.max/(nlam*nc) if(nx>maxvars)stop(paste("Integer overflow; num_classes*num_lambda*pmax should not exceed .Machine$integer.max. Reduce pmax to be below", trunc(maxvars))) if(!missing(weights)) y=y*weights ### check if any rows of y sum to zero, and if so deal with them weights=drop(y%*%rep(1,nc)) o=weights>0 if(!all(o)){ #subset the data y=y[o,] if(is.sparse){ # we have to subset this beast with care x=sparseMatrix(i=jx,p=ix-1,x=x,dims=c(nobs,nvars))[o,,drop=FALSE] ix=as.integer(x@p+1) jx=as.integer(x@i+1) x=as.double(x@x) } else x=x[o,,drop=FALSE] nobs=sum(o) }else o=NULL if(family=="binomial"){ if(nc>2)stop("More than two classes; use multinomial family instead in call to glmnet",call.=FALSE) nc=as.integer(1) # for calling lognet y=y[,c(2,1)]#fortran lognet models the first column; we prefer the second (for 0/1 data) } storage.mode(y)="double" if(is.null(offset)){ offset=y*0 #keeps the shape of y is.offset=FALSE} else{ offset=as.matrix(offset) if(!is.null(o))offset=offset[o,,drop=FALSE]# we might have zero weights do=dim(offset) if(do[[1]]!=nobs)stop("offset should have the same number of values as observations in binomial/multinomial call to glmnet",call.=FALSE) if((do[[2]]==1)&(nc==1))offset=cbind(offset,-offset) if((family=="multinomial")&(do[[2]]!=nc))stop("offset should have same shape as y in multinomial call to glmnet",call.=FALSE) storage.mode(offset)="double" is.offset=TRUE } fit=if(is.sparse) .Fortran("splognet", parm=alpha,nobs,nvars,nc,x,ix,jx,y,offset,jd,vp,cl,ne=ne,nx,nlam,flmin,ulam,thresh,isd,intr,maxit,kopt, lmu=integer(1), a0=double(nlam*nc), ca=double(nx*nlam*nc), ia=integer(nx), nin=integer(nlam), nulldev=double(1), dev=double(nlam), alm=double(nlam), nlp=integer(1), jerr=integer(1),PACKAGE="glmnet" ) else .Fortran("lognet", parm=alpha,nobs,nvars,nc,as.double(x),y,offset,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,intr,maxit,kopt, lmu=integer(1), a0=double(nlam*nc), ca=double(nx*nlam*nc), ia=integer(nx), nin=integer(nlam), nulldev=double(1), dev=double(nlam), alm=double(nlam), nlp=integer(1), jerr=integer(1),PACKAGE="glmnet" ) if(fit$jerr!=0){ errmsg=jerr(fit$jerr,maxit,pmax=nx,family) if(errmsg$fatal)stop(errmsg$msg,call.=FALSE) else warning(errmsg$msg,call.=FALSE) } if(family=="binomial"){ outlist=getcoef(fit,nvars,nx,vnames) # outlist$a0=-outlist$a0#sign flips make 2 target class # outlist$beta=-outlist$beta#sign flips make 2 target class } else outlist=getcoef.multinomial(fit,nvars,nx,vnames,nc,classnames) dev=fit$dev[seq(fit$lmu)] outlist=c(outlist,list(dev.ratio=dev,nulldev=fit$nulldev,npasses=fit$nlp,jerr=fit$jerr,offset=is.offset,classnames=classnames)) if(family=="multinomial"){ if(kopt==2)grouped=TRUE else grouped =FALSE outlist$grouped=grouped } class(outlist)=switch(family, "binomial"="lognet", "multinomial"="multnet" ) outlist } glmnet/R/plot.multnet.R0000644000176200001440000000157513552673674014563 0ustar liggesusers#' @method plot multnet #' @rdname plot.glmnet #' @export plot.multnet=function(x, xvar=c("norm","lambda","dev"),label=FALSE,type.coef=c("coef","2norm"),...){ xvar=match.arg(xvar) type.coef=match.arg(type.coef) beta=x$beta if(xvar=="norm"){ cnorm1=function(beta){ which=nonzeroCoef(beta) beta=as.matrix(beta[which,]) apply(abs(beta),2,sum) } norm=apply(sapply(x$beta,cnorm1),1,sum) } else norm = NULL dfmat=x$dfmat if(type.coef=="coef"){ ncl=nrow(dfmat) clnames=rownames(dfmat) for( i in seq(ncl)){ plotCoef(beta[[i]],norm,x$lambda,dfmat[i,],x$dev.ratio,label=label,xvar=xvar,ylab=paste("Coefficients: Response",clnames[i]),...) } } else { dfseq=round(apply(dfmat,2,mean),1) plotCoef(coefnorm(beta,2),norm,x$lambda,dfseq,x$dev.ratio,label=label,xvar=xvar,ylab="Coefficient 2Norms",...) } } glmnet/R/cv.coxnet.R0000644000176200001440000000231713534022702013774 0ustar liggesuserscv.coxnet <- function(predmat,y,type.measure,weights,foldid,grouped){ ## Note, all the work got done in buildPredmat.coxnetlist for deviance; a special case devtrue=type.measure=="deviance" nfolds = max(foldid) if ((length(weights)/nfolds < 10) && !grouped) { warning("Option grouped=TRUE enforced for cv.coxnet, since < 10 observations per fold", call. = FALSE) } if(devtrue){ cvraw=attr(predmat,"cvraw") status = y[, "status"] N = nfolds - apply(is.na(cvraw), 2, sum) weights = as.vector(tapply(weights * status, foldid, sum)) cvraw = cvraw/weights } else { nlambda=ncol(predmat) nlams=rep(nlambda,nfolds) cvraw = matrix(NA, nfolds, nlambda) good = matrix(0, nfolds, nlambda) for (i in seq(nfolds)) { good[i, seq(nlams[i])] = 1 which = foldid == i for (j in seq(nlams[i])) { cvraw[i, j] = Cindex(predmat[which,j],y[which, ], weights[which]) } } N = apply(good, 2, sum) weights = tapply(weights, foldid, sum) } list(cvraw=cvraw,weights=weights,N=N,type.measure=type.measure,grouped=FALSE) } glmnet/R/blend.relaxed.R0000644000176200001440000000221213534022702014566 0ustar liggesusersblend.relaxed=function(fit,gamma,extend=TRUE,epsilon=0.00001){ ### ###gamma must be a single value if(gamma==1){ class(fit)=class(fit)[-1] #drop the relaxed status fit$relaxed=NULL return(fit) } gamma=max(gamma,epsilon) ### We do the above so that even of gamma=0, and extend=TRUE, we fill in the coefficients ### First see which if any of glmnet coefficients are missing on relaxed which=match(fit$lambda,fit$relaxed$lambda,0) if(extend)which[which==0]=max(which) beta=fit$beta a0=fit$a0 fitr=fit$relaxed betar=fitr$beta a0r=fitr$a0 islistbeta=is.list(beta) if(!islistbeta){ fitr$beta=gamma*beta[,which>0] +(1-gamma)*betar[,which] fitr$a0=gamma*a0[which>0]+(1-gamma)*a0r[which] } else{ ngroups=length(beta) for(i in 1:ngroups) beta[[i]]=gamma*beta[[i]][,which>0]+(1-gamma)*betar[[i]][,which] fitr$beta=beta fitr$a0=gamma*a0[,which>0]+(1-gamma)*a0r[,which] } fitr$dev.ratio=gamma*fit$dev.ratio[which>0]+(1-gamma)*fitr$dev.ratio[which] fitr$df=fit$df[which>0] fitr$lambda=fit$lambda[which>0] fitr } glmnet/R/getcoef.multinomial.R0000644000176200001440000000242313534022702016030 0ustar liggesusersgetcoef.multinomial=function(fit,nvars,nx,vnames,nc,classnames,center.intercept=TRUE){ lmu=fit$lmu nin=fit$nin[seq(lmu)] ninmax=max(nin) lam=fit$alm[seq(lmu)] stepnames=paste("s",seq(lmu)-1,sep="") beta.list=as.list(seq(nc)) names(beta.list)=classnames a0=matrix(fit$a0[seq(lmu*nc)],nc,lmu,dimnames=list(classnames,stepnames)) if(center.intercept){ a0=scale(a0,TRUE,FALSE) attr(a0,"scaled:center")=NULL } dfmat=a0 dd=c(nvars,lmu) if(ninmax>0){ ca=array(fit$ca[seq(nx*lmu*nc)],c(nx,nc,lmu))[seq(ninmax),,,drop=FALSE] ja=fit$ia[seq(ninmax)]#confusing but too hard to change oja=order(ja) ja=rep(ja[oja],lmu) ia=cumsum(c(1,rep(ninmax,lmu))) df=apply(abs(ca)>0,c(1,3),any) df=apply(df,2,sum) for(k in seq(nc)){ cak=ca[oja,k, ,drop=FALSE] dfmat[k,]=apply(abs(cak)>0,3,sum) beta=new("dgCMatrix",Dim=dd,Dimnames=list(vnames,stepnames),x=as.vector(cak),p=as.integer(ia-1),i=as.integer(ja-1)) beta.list[[k]]=drop0(beta) } } else{ for (k in seq(nc)) { dfmat[k, ] = rep(0,lmu) beta.list[[k]] = zeromat(nvars,lmu,vnames,stepnames) } } list(a0=a0,beta=beta.list,dfmat=dfmat,df=df,dim=dd,lambda=lam) } glmnet/R/jerr.R0000644000176200001440000000115613534022702013027 0ustar liggesusersjerr=function(n,maxit,pmax,family){ if(n==0) list(n=0,fatal=FALSE,msg="") else { errlist=switch(family, "gaussian"=jerr.elnet(n,maxit,pmax), "binomial"=jerr.lognet(n,maxit,pmax), "multinomial"=jerr.lognet(n,maxit,pmax), "poisson"=jerr.fishnet(n,maxit,pmax), "cox"=jerr.coxnet(n,maxit,pmax), "mrelnet"=jerr.mrelnet(n,maxit,pmax) ) names(errlist)=c("n","fatal","msg") errlist$msg=paste("from glmnet Fortran code (error code ",n, "); ",errlist$msg,sep="") errlist } } glmnet/R/elnet.R0000644000176200001440000000347313534022702013200 0ustar liggesuserselnet=function(x,is.sparse,ix,jx,y,weights,offset,type.gaussian=c("covariance","naive"),alpha,nobs,nvars,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,intr,vnames,maxit){ maxit=as.integer(maxit) weights=as.double(weights) type.gaussian=match.arg(type.gaussian) ka=as.integer(switch(type.gaussian, covariance=1, naive=2, )) storage.mode(y)="double" if(is.null(offset)){ is.offset=FALSE} else{ storage.mode(offset)="double" is.offset=TRUE y=y-offset } ### compute the null deviance ybar=weighted.mean(y,weights) nulldev=sum(weights* (y-ybar)^2) if(nulldev==0)stop("y is constant; gaussian glmnet fails at standardization step") fit=if(is.sparse).Fortran("spelnet", ka,parm=alpha,nobs,nvars,x,ix,jx,y,weights,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,intr,maxit, lmu=integer(1), a0=double(nlam), ca=double(nx*nlam), ia=integer(nx), nin=integer(nlam), rsq=double(nlam), alm=double(nlam), nlp=integer(1), jerr=integer(1),PACKAGE="glmnet" ) else .Fortran("elnet", ka,parm=alpha,nobs,nvars,as.double(x),y,weights,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,intr,maxit, lmu=integer(1), a0=double(nlam), ca=double(nx*nlam), ia=integer(nx), nin=integer(nlam), rsq=double(nlam), alm=double(nlam), nlp=integer(1), jerr=integer(1),PACKAGE="glmnet" ) if(fit$jerr!=0){ errmsg=jerr(fit$jerr,maxit,pmax=nx,family="gaussian") if(errmsg$fatal)stop(errmsg$msg,call.=FALSE) else warning(errmsg$msg,call.=FALSE) } outlist=getcoef(fit,nvars,nx,vnames) dev=fit$rsq[seq(fit$lmu)] outlist=c(outlist,list(dev.ratio=dev,nulldev=nulldev,npasses=fit$nlp,jerr=fit$jerr,offset=is.offset)) class(outlist)="elnet" outlist } glmnet/R/predict.fishnet.R0000644000176200001440000000043213552673674015176 0ustar liggesusers#' @method predict fishnet #' @export predict.fishnet=function(object,newx,s=NULL,type=c("link","response","coefficients","nonzero"),exact=FALSE,newoffset,...){ type=match.arg(type) nfit=NextMethod("predict") switch(type, response=exp(nfit), nfit ) } glmnet/R/predict.cv.glmnet.R0000644000176200001440000000551313555633674015437 0ustar liggesusers## CHECK WITH TREVOR: why alias here for predict.cv.relaxed as well as in plot.cv.relaxed? ## #' make predictions from a "cv.glmnet" object. #' #' This function makes predictions from a cross-validated glmnet model, using #' the stored \code{"glmnet.fit"} object, and the optimal value chosen for #' \code{lambda} (and \code{gamma} for a 'relaxed' fit. #' #' This function makes it easier to use the results of cross-validation to make #' a prediction. #' #' @aliases coef.cv.glmnet coef.cv.relaxed predict.cv.glmnet #' @param object Fitted \code{"cv.glmnet"} or \code{"cv.relaxed"} object. #' @param newx Matrix of new values for \code{x} at which predictions are to be #' made. Must be a matrix; can be sparse as in \code{Matrix} package. See #' documentation for \code{predict.glmnet}. #' @param s Value(s) of the penalty parameter \code{lambda} at which #' predictions are required. Default is the value \code{s="lambda.1se"} stored #' on the CV \code{object}. Alternatively \code{s="lambda.min"} can be used. If #' \code{s} is numeric, it is taken as the value(s) of \code{lambda} to be #' used. (For historical reasons we use the symbol 's' rather than 'lambda' to #' reference this parameter) #' @param \dots Not used. Other arguments to predict. #' @return The object returned depends on the \dots{} argument which is passed #' on to the \code{predict} method for \code{glmnet} objects. #' @author Jerome Friedman, Trevor Hastie and Rob Tibshirani\cr Maintainer: #' Trevor Hastie #' @seealso \code{glmnet}, and \code{print}, and \code{coef} methods, and #' \code{cv.glmnet}. #' @references Friedman, J., Hastie, T. and Tibshirani, R. (2008) #' \emph{Regularization Paths for Generalized Linear Models via Coordinate #' Descent, Journal of Statistical Software, Vol. 33, Issue 1, Feb 2010}\cr #' \url{https://www.jstatsoft.org/v33/i01/} #' \url{https://arxiv.org/abs/1707.08692}\cr Hastie, T., Tibshirani, Robert, #' Tibshirani, Ryan (2019) \emph{Extended Comparisons of Best Subset Selection, #' Forward Stepwise Selection, and the Lasso} #' @keywords models regression #' @examples #' #' x = matrix(rnorm(100 * 20), 100, 20) #' y = rnorm(100) #' cv.fit = cv.glmnet(x, y) #' predict(cv.fit, newx = x[1:5, ]) #' coef(cv.fit) #' coef(cv.fit, s = "lambda.min") #' predict(cv.fit, newx = x[1:5, ], s = c(0.001, 0.002)) #' cv.fitr = cv.glmnet(x, y, relax = TRUE) #' predict(cv.fit, newx = x[1:5, ]) #' coef(cv.fit) #' coef(cv.fit, s = "lambda.min", gamma = "gamma.min") #' predict(cv.fit, newx = x[1:5, ], s = c(0.001, 0.002), gamma = "gamma.min") #' #' @method predict cv.glmnet #' @export predict.cv.glmnet=function(object,newx,s=c("lambda.1se","lambda.min"),...){ if(is.numeric(s))lambda=s else if(is.character(s)){ s=match.arg(s) lambda=object[[s]] } else stop("Invalid form for s") predict(object$glmnet.fit,newx,s=lambda,...) } glmnet/R/glmnet.measures.R0000644000176200001440000000231513552673674015220 0ustar liggesusers#' Display the names of the measures used in CV for different "glmnet" families #' #' Produces a list of names of measures #' #' Try it and see. A very simple function to provide information #' #' @param family If a "glmnet" family is supplied, a list of the names of #' measures available for that family are produced. Default is "all", in which #' case the names of measures for all families are produced. #' @author Trevor Hastie\cr Maintainer: Trevor Hastie #' \email{hastie@@stanford.edu} #' @seealso \code{cv.glmnet} and \code{assess.glmnet}. #' @keywords models #' @export glmnet.measures glmnet.measures=function(family=c("all","gaussian", "binomial", "poisson", "multinomial", "cox", "mgaussian")){ family=match.arg(family) type.measures = c("mse", "deviance", "class", "auc", "mae", "C") family.ch = list( gaussian = c(1, 5), binomial = c(2, 3, 4, 1, 5), poisson = c(2, 1, 5), cox = c(2, 6), multinomial = c(2, 3, 1, 5), mgaussian = c(1, 5)) if(family=="all")lapply(family.ch,function(x)type.measures[x]) else type.measures[family.ch[[family]]] } glmnet/R/lambda.interp.R0000644000176200001440000000221013574045726014614 0ustar liggesuserslambda.interp=function(lambda,s){ ### lambda is the index sequence that is produced by the model ### s is the new vector at which evaluations are required. ### the value is a vector of left and right indices, and a vector of fractions. ### the new values are interpolated bewteen the two using the fraction ### Note: lambda decreases. you take: ### sfrac*left+(1-sfrac*right) if(length(lambda)==1){# degenerate case of only one lambda nums=length(s) left=rep(1,nums) right=left sfrac=rep(1,nums) } else{ ## s[s > max(lambda)] = max(lambda) ## s[s < min(lambda)] = min(lambda) k=length(lambda) sfrac <- (lambda[1]-s)/(lambda[1] - lambda[k]) lambda <- (lambda[1] - lambda)/(lambda[1] - lambda[k]) sfrac[sfrac < min(lambda)] <- min(lambda) sfrac[sfrac > max(lambda)] <- max(lambda) coord <- approx(lambda, seq(lambda), sfrac)$y left <- floor(coord) right <- ceiling(coord) sfrac=(sfrac-lambda[right])/(lambda[left] - lambda[right]) sfrac[left==right]=1 sfrac[abs(lambda[left]-lambda[right])<.Machine$double.eps]=1 } list(left=left,right=right,frac=sfrac) } glmnet/R/getOptcv.relaxed.R0000644000176200001440000000205313534022702015300 0ustar liggesusersgetOptcv.relaxed <- function (statlist,cvname,gamma) { cvm=lapply(statlist,"[[","cvm") nlams=sapply(cvm,length) cvm=unlist(cvm) lambdas=unlist(lapply(statlist,"[[","lambda")) cvsd=unlist(lapply(statlist,"[[","cvsd")) nzero=unlist(lapply(statlist,"[[","nzero")) gammas=rep(gamma,nlams) names(lambdas)=NULL names(gammas)=NULL if(match(cvname,c("AUC","C-index"),0))cvm=-cvm cvmin = min(cvm, na.rm = TRUE) idmin = cvm <= cvmin which=order(lambdas[idmin],gammas[idmin],decreasing=TRUE)[1] lambda.min = lambdas[idmin][which] gamma.min= gammas[idmin][which] nzero.min=nzero[idmin][which] idmin=seq(along=lambdas)[idmin][which] semin = (cvm + cvsd)[idmin] idmin = cvm <= semin which=order(lambdas[idmin],gammas[idmin],decreasing=TRUE)[1] lambda.1se = lambdas[idmin][which] gamma.1se= gammas[idmin][which] nzero.1se=nzero[idmin][which] list(lambda.min = lambda.min, lambda.1se = lambda.1se, gamma.min=gamma.min, gamma.1se=gamma.1se,nzero.min=nzero.min,nzero.1se=nzero.1se) } glmnet/R/family.glmnet.R0000644000176200001440000000072713552673674014662 0ustar liggesusers#' @method family glmnet #' @export family.glmnet=function(object,...){ families=c(elnet = "gaussian", lognet = "binomial", fishnet = "poisson", multnet = "multinomial", coxnet = "cox", mrelnet = "mgaussian") cl=class(object)[1] families[cl] } #' @method family relaxed #' @export family.relaxed=function(object,...)family(object$relaxed) #' @method family cv.glmnet #' @export family.cv.glmnet=function(object,...)family(object$glmnet.fit) glmnet/R/jerr.lognet.R0000644000176200001440000000100013534022702014302 0ustar liggesusersjerr.lognet=function(n,maxit,pmax){ outlist=jerr.elnet(n,maxit,pmax) if(n< -20000)outlist$msg=paste("Max(p(1-p),1.0e-6 at ",-n-20000,"th value of lambda; solutions for larger values of lambda returned") if(outlist$msg!="Unknown error")return(outlist) if((8000 1.0 - 1.0e-5") else msg="Unknown error" list(n=n,fatal=TRUE,msg=msg) } glmnet/R/cv.relaxed.raw.R0000644000176200001440000001024013550721067014712 0ustar liggesuserscv.relaxed.raw <- function (x, y, weights, offset, lambda, type.measure, nfolds, foldid, alignment,grouped, keep, parallel, trace.it, glmnet.call, cv.call, gamma, ...) { ###This next function may be redundant relaxglmnet=function(x,...){ fit=glmnet(x,...) relax.glmnet(fit,x,...,check.args=FALSE) } gamma=sort(checkgamma.relax(gamma)) ### The next bit is to make sure we always include lasso in CV, as well as the gamma series lengamma=length(gamma) if(max(gamma)<1.0){ gamma=c(gamma,1.0) } glmnet.call$relax=TRUE if (trace.it) cat("Training\n") glmnet.object = relaxglmnet(x=x, y=y, weights = weights, offset = offset, lambda = lambda, ...) glmnet.object$call = glmnet.call subclass=class(glmnet.object)[[2]]# it is of class c("relaxed","subtype","glmnet") type.measure=cvtype(type.measure,subclass) is.offset = glmnet.object$offset ###Next line is commented out so each call generates its own lambda sequence # lambda=glmnet.object$lambda if (inherits(glmnet.object, "multnet") && !glmnet.object$grouped) { nz = predict(glmnet.object, type = "nonzero") nz = sapply(nz, function(x) sapply(x, length)) nz = ceiling(apply(nz, 1, median)) } else nz = sapply(predict(glmnet.object, type = "nonzero"), length) outlist = as.list(seq(nfolds)) N=nrow(x) if (parallel) { # if (parallel && require(foreach)) { outlist = foreach(i = seq(nfolds), .packages = c("glmnet")) %dopar% { which = foldid == i # if (is.matrix(y)) if (length(dim(y))>1) y_sub = y[!which, ] else y_sub = y[!which] if (is.offset) offset_sub = as.matrix(offset)[!which, ] else offset_sub = NULL relaxglmnet(x=x[!which, , drop = FALSE], y=y_sub, lambda = lambda, offset = offset_sub, weights = weights[!which], ...) } } else { for (i in seq(nfolds)) { if (trace.it) cat(sprintf("Fold: %d/%d\n", i, nfolds)) which = foldid == i if (is.matrix(y)) y_sub = y[!which, ] else y_sub = y[!which] if (is.offset) offset_sub = as.matrix(offset)[!which, ] else offset_sub = NULL outlist[[i]] = relaxglmnet(x=x[!which, , drop = FALSE], y=y_sub, lambda = lambda, offset = offset_sub, weights = weights[!which], ...) } } lambda = glmnet.object$lambda class(outlist)=paste0(subclass,"list") predmatlist=as.list(gamma) names(predmatlist)=paste("g",gamma,sep=":") outstuff=cvstufflist=predmatlist ### Even though the following is innefficient, It makes the code more modular fun = paste("cv", subclass, sep = ".") for(i in seq(along=gamma)){ predmatlist[[i]]=buildPredmat(outlist, lambda=lambda,x=x,offset=offset,foldid=foldid,alignment=alignment, y=y,weights=weights,grouped=grouped, gamma=gamma[i] ) cvstufflist[[i]]=do.call(fun, list(predmatlist[[i]],y,type.measure,weights,foldid,grouped)) } grouped=all(sapply(cvstufflist,"[[","grouped")) if ((N/nfolds < 3) && grouped) { warning("Option grouped=FALSE enforced in cv.relaxed, since < 3 observations per fold", call. = FALSE) grouped = FALSE } for(i in seq(along=gamma)) outstuff[[i]]=cvstats(cvstufflist[[i]],foldid,nfolds,lambda,nz,grouped) cvn = cvstufflist[[1]]$type.measure cvname=names(cvn);names(cvname)=cvn# to be compatible with earlier version; silly, I know out=outstuff[[length(gamma)]] # lasso stats out = c(out,list(call=cv.call,name = cvname, glmnet.fit = glmnet.object)) if(lengamma #' @references Friedman, J., Hastie, T. and Tibshirani, R. (2008) #' \emph{Regularization Paths for Generalized Linear Models via Coordinate #' Descent}, \url{https://web.stanford.edu/~hastie/Papers/glmnet.pdf}\cr #' \emph{Journal of Statistical Software, Vol. 33(1), 1-22 Feb 2010}\cr #' \url{https://www.jstatsoft.org/v33/i01/}\cr Simon, N., Friedman, J., Hastie, #' T., Tibshirani, R. (2011) \emph{Regularization Paths for Cox's Proportional #' Hazards Model via Coordinate Descent, Journal of Statistical Software, Vol. #' 39(5) 1-13}\cr \url{https://www.jstatsoft.org/v39/i05/}\cr Tibshirani, #' Robert., Bien, J., Friedman, J.,Hastie, T.,Simon, N.,Taylor, J. and #' Tibshirani, Ryan. (2012) \emph{Strong Rules for Discarding Predictors in #' Lasso-type Problems, JRSSB, vol 74},\cr #' \url{https://statweb.stanford.edu/~tibs/ftp/strong.pdf}\cr \emph{Stanford #' Statistics Technical Report}\cr \emph{Glmnet Vignette} #' \url{https://web.stanford.edu/~hastie/glmnet/glmnet_alpha.html} #' @keywords models regression package #' @examples #' #' x = matrix(rnorm(100 * 20), 100, 20) #' y = rnorm(100) #' g2 = sample(1:2, 100, replace = TRUE) #' g4 = sample(1:4, 100, replace = TRUE) #' fit1 = glmnet(x, y) #' predict(fit1, newx = x[1:5, ], s = c(0.01, 0.005)) #' predict(fit1, type = "coef") #' plot(fit1, xvar = "lambda") #' fit2 = glmnet(x, g2, family = "binomial") #' predict(fit2, type = "response", newx = x[2:5, ]) #' predict(fit2, type = "nonzero") #' fit3 = glmnet(x, g4, family = "multinomial") #' predict(fit3, newx = x[1:3, ], type = "response", s = 0.01) #' NULL glmnet/R/jerr.mrelnet.R0000644000176200001440000000033313534022702014470 0ustar liggesusersjerr.mrelnet=function(n,maxit,pmax){ if(n==90000){ msg=paste("Newton stepping for bounded multivariate response did not converge") list(n=n,fatal=FALSE,msg=msg) } else jerr.elnet(n,maxit,pmax) } glmnet/R/cv.glmnet.R0000644000176200001440000003107013555633674014003 0ustar liggesusers#' Cross-validation for glmnet #' #' Does k-fold cross-validation for glmnet, produces a plot, and returns a #' value for \code{lambda} (and \code{gamma} if \code{relax=TRUE}) #' #' The function runs \code{glmnet} \code{nfolds}+1 times; the first to get the #' \code{lambda} sequence, and then the remainder to compute the fit with each #' of the folds omitted. The error is accumulated, and the average error and #' standard deviation over the folds is computed. Note that \code{cv.glmnet} #' does NOT search for values for \code{alpha}. A specific value should be #' supplied, else \code{alpha=1} is assumed by default. If users would like to #' cross-validate \code{alpha} as well, they should call \code{cv.glmnet} with #' a pre-computed vector \code{foldid}, and then use this same fold vector in #' separate calls to \code{cv.glmnet} with different values of \code{alpha}. #' Note also that the results of \code{cv.glmnet} are random, since the folds #' are selected at random. Users can reduce this randomness by running #' \code{cv.glmnet} many times, and averaging the error curves. #' #' If \code{relax=TRUE} then the values of \code{gamma} are used to mix the #' fits. If \eqn{\eta} is the fit for lasso/elastic net, and \eqn{\eta_R} is #' the relaxed fit (with unpenalized coefficients), then a relaxed fit mixed by #' \eqn{\gamma} is \deqn{\eta(\gamma)=(1-\gamma)\eta_R+\gamma\eta}. There is #' practically no extra cost for having a lot of values for \code{gamma}. #' However, 5 seems sufficient for most purposes. CV then selects both #' \code{gamma} and \code{lambda}. #' #' @param x \code{x} matrix as in \code{glmnet}. #' @param y response \code{y} as in \code{glmnet}. #' @param weights Observation weights; defaults to 1 per observation #' @param offset Offset vector (matrix) as in \code{glmnet} #' @param lambda Optional user-supplied lambda sequence; default is #' \code{NULL}, and \code{glmnet} chooses its own sequence #' @param type.measure loss to use for cross-validation. Currently five #' options, not all available for all models. The default is #' \code{type.measure="deviance"}, which uses squared-error for gaussian models #' (a.k.a \code{type.measure="mse"} there), deviance for logistic and poisson #' regression, and partial-likelihood for the Cox model. #' \code{type.measure="class"} applies to binomial and multinomial logistic #' regression only, and gives misclassification error. #' \code{type.measure="auc"} is for two-class logistic regression only, and #' gives area under the ROC curve. \code{type.measure="mse"} or #' \code{type.measure="mae"} (mean absolute error) can be used by all models #' except the \code{"cox"}; they measure the deviation from the fitted mean to #' the response. #' \code{type.measure="C"} is Harrel's concordance measure, only available for \code{cox} models. #' @param nfolds number of folds - default is 10. Although \code{nfolds} can be #' as large as the sample size (leave-one-out CV), it is not recommended for #' large datasets. Smallest value allowable is \code{nfolds=3} #' @param foldid an optional vector of values between 1 and \code{nfold} #' identifying what fold each observation is in. If supplied, \code{nfold} can #' be missing. #' @param alignment This is an experimental argument, designed to fix the #' problems users were having with CV, with possible values \code{"lambda"} #' (the default) else \code{"fraction"}. With \code{"lambda"} the \code{lambda} #' values from the master fit (on all the data) are used to line up the #' predictions from each of the folds. In some cases this can give strange #' values, since the effective \code{lambda} values in each fold could be quite #' different. With \code{"fraction"} we line up the predictions in each fold #' according to the fraction of progress along the regularization. If in the #' call a \code{lambda} argument is also provided, \code{alignment="fraction"} #' is ignored (with a warning). #' @param grouped This is an experimental argument, with default \code{TRUE}, #' and can be ignored by most users. For all models except the \code{"cox"}, #' this refers to computing \code{nfolds} separate statistics, and then using #' their mean and estimated standard error to describe the CV curve. If #' \code{grouped=FALSE}, an error matrix is built up at the observation level #' from the predictions from the \code{nfold} fits, and then summarized (does #' not apply to \code{type.measure="auc"}). For the \code{"cox"} family, #' \code{grouped=TRUE} obtains the CV partial likelihood for the Kth fold by #' \emph{subtraction}; by subtracting the log partial likelihood evaluated on #' the full dataset from that evaluated on the on the (K-1)/K dataset. This #' makes more efficient use of risk sets. With \code{grouped=FALSE} the log #' partial likelihood is computed only on the Kth fold #' @param keep If \code{keep=TRUE}, a \emph{prevalidated} array is returned #' containing fitted values for each observation and each value of #' \code{lambda}. This means these fits are computed with this observation and #' the rest of its fold omitted. The \code{folid} vector is also returned. #' Default is keep=FALSE. If \code{relax=TRUE}, then a list of such arrays is #' returned, one for each value of 'gamma'. Note: if the value 'gamma=1' is #' omitted, this case is included in the list since it corresponds to the #' original 'glmnet' fit. #' @param parallel If \code{TRUE}, use parallel \code{foreach} to fit each #' fold. Must register parallel before hand, such as \code{doMC} or others. #' See the example below. #' @param gamma The values of the parameter for mixing the relaxed fit with the #' regularized fit, between 0 and 1; default is \code{gamma = c(0, 0.25, 0.5, #' 0.75, 1)} #' @param relax If \code{TRUE}, then CV is done with respect to the mixing #' parameter \code{gamma} as well as \code{lambda}. Default is #' \code{relax=FALSE} #' @param trace.it If \code{trace.it=1}, then progress bars are displayed; #' useful for big models that take a long time to fit. Limited tracing if #' \code{parallel=TRUE} #' @param \dots Other arguments that can be passed to \code{glmnet} #' @return an object of class \code{"cv.glmnet"} is returned, which is a list #' with the ingredients of the cross-validation fit. If the object was created #' with \code{relax=TRUE} then this class has a prefix class of #' \code{"cv.relaxed"}. \item{lambda}{the values of \code{lambda} used in the #' fits.} \item{cvm}{The mean cross-validated error - a vector of length #' \code{length(lambda)}.} \item{cvsd}{estimate of standard error of #' \code{cvm}.} \item{cvup}{upper curve = \code{cvm+cvsd}.} \item{cvlo}{lower #' curve = \code{cvm-cvsd}.} \item{nzero}{number of non-zero coefficients at #' each \code{lambda}.} \item{name}{a text string indicating type of measure #' (for plotting purposes).} \item{glmnet.fit}{a fitted glmnet object for the #' full data.} \item{lambda.min}{value of \code{lambda} that gives minimum #' \code{cvm}.} \item{lambda.1se}{largest value of \code{lambda} such that #' error is within 1 standard error of the minimum.} \item{fit.preval}{if #' \code{keep=TRUE}, this is the array of prevalidated fits. Some entries can #' be \code{NA}, if that and subsequent values of \code{lambda} are not reached #' for that fold} \item{foldid}{if \code{keep=TRUE}, the fold assignments used} #' \item{relaxed}{if \code{relax=TRUE}, this additional item has the CV info #' for each of the mixed fits. In particular it also selects \code{lambda, #' gamma} pairs corresponding to the 1SE rule, as well as the minimum error.} #' @author Jerome Friedman, Trevor Hastie and Rob Tibshirani\cr Noah Simon #' helped develop the 'coxnet' function.\cr Jeffrey Wong and B. Narasimhan #' helped with the parallel option\cr Maintainer: Trevor Hastie #' \email{hastie@@stanford.edu} #' @seealso \code{glmnet} and \code{plot}, \code{predict}, and \code{coef} #' methods for \code{"cv.glmnet"} and \code{"cv.relaxed"} objects. #' @references Friedman, J., Hastie, T. and Tibshirani, R. (2008) #' \emph{Regularization Paths for Generalized Linear Models via Coordinate #' Descent}, \url{https://web.stanford.edu/~hastie/Papers/glmnet.pdf}\cr #' \emph{Journal of Statistical Software, Vol. 33(1), 1-22 Feb 2010}\cr #' \url{https://www.jstatsoft.org/v33/i01/}\cr Simon, N., Friedman, J., Hastie, #' T., Tibshirani, R. (2011) \emph{Regularization Paths for Cox's Proportional #' Hazards Model via Coordinate Descent, Journal of Statistical Software, Vol. #' 39(5) 1-13}\cr \url{https://www.jstatsoft.org/v39/i05/} #' @keywords models regression #' @examples #' #' set.seed(1010) #' n = 1000 #' p = 100 #' nzc = trunc(p/10) #' x = matrix(rnorm(n * p), n, p) #' beta = rnorm(nzc) #' fx = x[, seq(nzc)] %*% beta #' eps = rnorm(n) * 5 #' y = drop(fx + eps) #' px = exp(fx) #' px = px/(1 + px) #' ly = rbinom(n = length(px), prob = px, size = 1) #' set.seed(1011) #' cvob1 = cv.glmnet(x, y) #' plot(cvob1) #' coef(cvob1) #' predict(cvob1, newx = x[1:5, ], s = "lambda.min") #' title("Gaussian Family", line = 2.5) #' set.seed(1011) #' cvob1a = cv.glmnet(x, y, type.measure = "mae") #' plot(cvob1a) #' title("Gaussian Family", line = 2.5) #' set.seed(1011) #' par(mfrow = c(2, 2), mar = c(4.5, 4.5, 4, 1)) #' cvob2 = cv.glmnet(x, ly, family = "binomial") #' plot(cvob2) #' title("Binomial Family", line = 2.5) #' frame() #' set.seed(1011) #' cvob3 = cv.glmnet(x, ly, family = "binomial", type.measure = "class") #' plot(cvob3) #' title("Binomial Family", line = 2.5) #' \dontrun{ #' cvob1r = cv.glmnet(x, y, relax = TRUE) #' plot(cvob1r) #' predict(cvob1r, newx = x[, 1:5]) #' set.seed(1011) #' cvob3a = cv.glmnet(x, ly, family = "binomial", type.measure = "auc") #' plot(cvob3a) #' title("Binomial Family", line = 2.5) #' set.seed(1011) #' mu = exp(fx/10) #' y = rpois(n, mu) #' cvob4 = cv.glmnet(x, y, family = "poisson") #' plot(cvob4) #' title("Poisson Family", line = 2.5) #' #' # Multinomial #' n = 500 #' p = 30 #' nzc = trunc(p/10) #' x = matrix(rnorm(n * p), n, p) #' beta3 = matrix(rnorm(30), 10, 3) #' beta3 = rbind(beta3, matrix(0, p - 10, 3)) #' f3 = x %*% beta3 #' p3 = exp(f3) #' p3 = p3/apply(p3, 1, sum) #' g3 = glmnet:::rmult(p3) #' set.seed(10101) #' cvfit = cv.glmnet(x, g3, family = "multinomial") #' plot(cvfit) #' title("Multinomial Family", line = 2.5) #' # Cox #' beta = rnorm(nzc) #' fx = x[, seq(nzc)] %*% beta/3 #' hx = exp(fx) #' ty = rexp(n, hx) #' tcens = rbinom(n = n, prob = 0.3, size = 1) # censoring indicator #' y = cbind(time = ty, status = 1 - tcens) # y=Surv(ty,1-tcens) with library(survival) #' foldid = sample(rep(seq(10), length = n)) #' fit1_cv = cv.glmnet(x, y, family = "cox", foldid = foldid) #' plot(fit1_cv) #' title("Cox Family", line = 2.5) #' # Parallel #' require(doMC) #' registerDoMC(cores = 4) #' x = matrix(rnorm(1e+05 * 100), 1e+05, 100) #' y = rnorm(1e+05) #' system.time(cv.glmnet(x, y)) #' system.time(cv.glmnet(x, y, parallel = TRUE)) #' } #' #' @export cv.glmnet cv.glmnet <- function (x, y, weights=NULL, offset = NULL, lambda = NULL, type.measure = c("default","mse", "deviance", "class", "auc", "mae","C"), nfolds = 10, foldid=NULL, alignment=c("lambda","fraction"),grouped = TRUE, keep = FALSE, parallel = FALSE, gamma=c(0,.25,.5,.75,1),relax=FALSE,trace.it=0, ...) { type.measure = match.arg(type.measure) alignment=match.arg(alignment) if (!is.null(lambda) && length(lambda) < 2) stop("Need more than one value of lambda for cv.glmnet") if (!is.null(lambda) && alignment=="fraction"){ warning("fraction of path alignment not available if lambda given as argument; switched to alignment=`lambda`") alignment="lambda" } N = nrow(x) if (is.null(weights)) weights = rep(1, N) else weights = as.double(weights) y = drop(y) cv.call=glmnet.call = match.call(expand.dots = TRUE) which = match(c("type.measure", "nfolds", "foldid", "grouped", "keep"), names(glmnet.call), FALSE) if (any(which)) glmnet.call = glmnet.call[-which] glmnet.call[[1]] = as.name("glmnet") if(glmnet.control()$itrace)trace.it=1 else{ if(trace.it){ glmnet.control(itrace=1) on.exit(glmnet.control(itrace=0)) } } if (is.null(foldid)) foldid = sample(rep(seq(nfolds), length = N)) else nfolds = max(foldid) if (nfolds < 3) stop("nfolds must be bigger than 3; nfolds=10 recommended") ### Now we switch depending on relax if(relax) cv.relaxed.raw(x,y,weights,offset,lambda,type.measure,nfolds,foldid, alignment,grouped,keep,parallel,trace.it,glmnet.call,cv.call,gamma,...) else cv.glmnet.raw(x,y,weights,offset,lambda,type.measure,nfolds,foldid, alignment,grouped,keep,parallel,trace.it,glmnet.call,cv.call,...) } glmnet/R/coxgrad.R0000644000176200001440000000636513553704056013535 0ustar liggesusers#' compute gradient for cox model #' #' Compute the gradient of the partial likelihood at a particular fit #' #' Compute a gradient vector at the fitted vector for the log partial likelihood. #' This is like a residual vector, and useful for manual screening of predictors for \code{glmnet} #' in applications where \code{p} is very large (as in GWAS). Uses the Breslow approach to ties #' #' @aliases coxgrad #' @param f fit vector #' @param time time vector (can have ties) #' @param d death/censoring indicator 1/0 #' @param w observation weights (default equal) #' @param eps (default 0.00001) Breaks ties between death and censoring by making death times \code{eps} earlier #' @return a single gradient vector the same length as \code{f} #' @author Trevor Hastie\cr Maintainer: Trevor Hastie #' @seealso \code{coxnet.deviance} #' @keywords Cox model #' #' @export coxgrad coxgrad=function(f,time,d,w,eps=0.00001){ ### f is fitted function from glmnet at a particular lambda ### time is death or censoring time ### d is death indicator; d=0 means censored, d=1 means death ### w is a weight vector of non-negative weights, which will be normalized to sum to 1 if(missing(w))w=rep(1,length(f)) w=w/sum(w) f=scale(f,TRUE,FALSE)#center f so exponents are not too large time=time-d*eps#break ties between death times and non death times, leaving tied death times tied o=order(time) ef=exp(f)[o] time=time[o] d=d[o] w=w[o] rskden=rev(cumsum(rev(ef*w))) ##reverse order inside;last guy is in all the risk sets ### See if there are dups in death times dups=fid(time[d==1],seq(length(d))[d==1]) dd=d ww=w ### next code replaces each sequence of tied death indicators by a new ### sequence where only the first is a 1 and the rest are zero. This ### makes the accounting in the following step work properly we also ### sums the weights in each of the tied death sets, and assign that ### weight to the first if(!is.null(ties<-dups$index_ties)){ dd[unlist(ties)]=0 dd[dups$index_first]=1 wsum=sapply(ties,function(i,w)sum(w[i]),ww) tie1=sapply(ties,function(i)i[1]) ww[tie1]=wsum } ### Get counts over risk sets at each death time rskcount=cumsum(dd)#this says how many of the risk sets each observation is in; 0 is none ### We now form partial sums of the 1/den just at the risk sets rskdeninv=cumsum((ww/rskden)[dd==1]) ### pad with a zero, so we can index it rskdeninv=c(0,rskdeninv) ### compute gradient for each obs grad=(d-rskdeninv[rskcount+1]*ef)*w grad[o]=grad grad } fid=function(x,index){ ### Input: ### x is a sorted vector of death times ### index is vector of indices of this set ### Output: ### index of first member of every death set as they appear in sorted list ### list of ties for each element of index, in the case of two or more ties; ## if no ties, this list is NULL idup=duplicated(x) if(!any(idup)) list(index_first=index,index_ties=NULL) else{ ndup=!idup xu=x[ndup]# first death times index_first=index[ndup] ities=match(x,xu) index_ties=split(index,ities) nties=sapply(index_ties,length) list(index_first=index_first,index_ties=index_ties[nties>1]) } } glmnet/R/deviance.glmnet.R0000644000176200001440000000274013552673674015154 0ustar liggesusers#' Extract the deviance from a glmnet object #' #' Compute the deviance sequence from the glmnet object #' #' A glmnet object has components \code{dev.ratio} and \code{nulldev}. The #' former is the fraction of (null) deviance explained. The deviance #' calculations incorporate weights if present in the model. The deviance is #' defined to be 2*(loglike_sat - loglike), where loglike_sat is the #' log-likelihood for the saturated model (a model with a free parameter per #' observation). Null deviance is defined to be 2*(loglike_sat #' -loglike(Null)); The NULL model refers to the intercept model, except for #' the Cox, where it is the 0 model. Hence dev.ratio=1-deviance/nulldev, and #' this \code{deviance} method returns (1-dev.ratio)*nulldev. #' #' @param object fitted glmnet object #' @param \dots additional print arguments #' @return (1-dev.ratio)*nulldev #' @author Jerome Friedman, Trevor Hastie and Rob Tibshirani\cr Maintainer: #' Trevor Hastie #' @seealso \code{glmnet}, \code{predict}, \code{print}, and \code{coef} #' methods. #' @references Friedman, J., Hastie, T. and Tibshirani, R. (2008) #' \emph{Regularization Paths for Generalized Linear Models via Coordinate #' Descent} #' @keywords models regression #' @examples #' #' x = matrix(rnorm(100 * 20), 100, 20) #' y = rnorm(100) #' fit1 = glmnet(x, y) #' deviance(fit1) #' @method deviance glmnet #' @export deviance.glmnet=function(object,...){ dev=object$dev nulldev=object$nulldev (1-dev)*nulldev } glmnet/R/predict.elnet.R0000644000176200001440000000026613552673674014652 0ustar liggesusers#' @method predict elnet #' @export predict.elnet=function(object,newx,s=NULL,type=c("link","response","coefficients","nonzero"),exact=FALSE,newoffset,...){ NextMethod("predict") } glmnet/R/onAttach.R0000644000176200001440000000022013534022702013615 0ustar liggesusers.onAttach=function(libname,pkgname){ packageStartupMessage("Loaded glmnet ", as.character(packageDescription("glmnet")[["Version"]]),"\n") } glmnet/R/plot.mrelnet.R0000644000176200001440000000201013552673674014522 0ustar liggesusers#' @method plot mrelnet #' @param type.coef If \code{type.coef="2norm"} then a single curve per #' variable, else if \code{type.coef="coef"}, a coefficient plot per response #' @rdname plot.glmnet #' @export plot.mrelnet <- function(x, xvar=c("norm","lambda","dev"),label=FALSE,type.coef=c("coef","2norm"),...){ type.coef=match.arg(type.coef) xvar=match.arg(xvar) beta=x$beta if(xvar=="norm") { cnorm1=function(beta){ which=nonzeroCoef(beta) beta=as.matrix(beta[which,]) apply(abs(beta),2,sum) } norm=apply(sapply(x$beta,cnorm1),1,sum) } else norm = NULL dfmat=x$dfmat if(type.coef=="coef"){ ncl=nrow(dfmat) clnames=rownames(dfmat) for( i in seq(ncl)){ plotCoef(beta[[i]],norm,x$lambda,dfmat[i,],x$dev.ratio,label=label,xvar=xvar,ylab=paste("Coefficients: Response",clnames[i]),...) } } else plotCoef(coefnorm(beta,2),norm,x$lambda,dfmat[1,],x$dev.ratio,label=label,xvar=xvar,ylab="Coefficient 2Norms",...) } glmnet/R/buildPredmat.default.R0000644000176200001440000000217013552673674016145 0ustar liggesusers#' @export buildPredmat.default=function(outlist, lambda, x, offset, foldid, alignment,...){ if (!is.null(offset)) { is.offset = TRUE offset = drop(offset) } else is.offset = FALSE predmat = matrix(NA, nrow(x), length(lambda)) nfolds = max(foldid) nlams = double(nfolds) nlambda=length(lambda) for (i in seq(nfolds)) { which = foldid == i fitobj = outlist[[i]] if (is.offset) off_sub = offset[which] preds = switch(alignment, fraction=predict(fitobj, x[which, , drop = FALSE], newoffset = off_sub,...), lambda=predict(fitobj, x[which, , drop = FALSE], s=lambda, newoffset = off_sub,...) ) nlami = min(ncol(preds),nlambda) predmat[which, seq(nlami)] = preds[,seq(nlami)] if(nlami0){#fatal error outlist=jerr.elnet(n) if(outlist$msg!="Unknown error")return(outlist) if(n==8888)msg="All observations censored - cannot proceed" else if(n==9999)msg="No positive observation weights" else if(match(n,c(20000,30000),FALSE)) msg="Inititialization numerical error; probably too many censored observations" else msg="Unknown error" list(n=n,fatal=TRUE,msg=msg) } else if(n<0){ # non-fatal error if(n<= -30000){ msg=paste("Numerical error at ",-n-30000,"th lambda value; solutions for larger values of lambda returned",sep="") list(n=n,fatal=FALSE,msg=msg) } else jerr.elnet(n,maxit,pmax) } } glmnet/R/assess.coxnet.R0000644000176200001440000000074613545227360014702 0ustar liggesusersassess.coxnet <- function(predmat,y,type.measure,weights,foldid,grouped){ ### This is a hack, because CV for coxnet is complex if(type.measure=="C")return(cv.coxnet(predmat,y,type.measure,weights,foldid,grouped)) nlambda=ncol(predmat) N=nrow(predmat) cvraw = matrix(NA, 1, nlambda) for (j in seq(nlambda)) { cvraw[1, j] = coxnet.deviance(predmat[,j],y, weights=weights) } list(cvraw=cvraw,weights=N,N=N,type.measure=type.measure,grouped=FALSE) } glmnet/R/nonzeroCoef.R0000644000176200001440000000200713534022702014350 0ustar liggesusersnonzeroCoef = function (beta, bystep = FALSE) { ### bystep = FALSE means which variables were ever nonzero ### bystep = TRUE means which variables are nonzero for each step nr=nrow(beta) if (nr == 1) {#degenerate case if (bystep) apply(beta, 2, function(x) if (abs(x) > 0) 1 else NULL) else { if (any(abs(beta) > 0)) 1 else NULL } } else { beta=abs(beta)>0 # this is sparse which=seq(nr) ones=rep(1,ncol(beta)) nz=as.vector((beta%*%ones)>0) which=which[nz] if (bystep) { if(length(which)>0){ beta=as.matrix(beta[which,,drop=FALSE]) nzel = function(x, which) if (any(x)) which[x] else NULL which=apply(beta, 2, nzel, which) if(!is.list(which))which=data.frame(which)# apply can return a matrix!! which } else{ dn=dimnames(beta)[[2]] which=vector("list",length(dn)) names(which)=dn which } } else which } } glmnet/R/coef.cv.relaxed.R0000644000176200001440000000141713552673674015057 0ustar liggesusers#' @method coef cv.relaxed #' @export coef.cv.relaxed <- function (object, s = c("lambda.1se", "lambda.min"), gamma=c("gamma.1se","gamma.min"),...) { relaxed=object$relaxed if (is.numeric(s)) lambda = s else if (is.character(s)) { s = match.arg(s) lambda = relaxed[[s]] if(missing(gamma)){ gamma=switch(s, lambda.1se=relaxed[["gamma.1se"]], lambda.min=relaxed[["gamma.min"]] ) } } else stop("Invalid form for s") if (is.character(gamma)) { gamma = match.arg(gamma) gamma = relaxed[[gamma]] } if(!is.numeric(gamma))stop("Invalid form for gamma") coef(object$glmnet.fit, s = lambda, gamma=gamma, ...) } glmnet/R/cvcompute.R0000644000176200001440000000115713534022702014073 0ustar liggesuserscvcompute <- function (cvstuff, foldid, nlams) { weights=cvstuff$weights mat=cvstuff$cvraw wisum = tapply(weights, foldid, sum) nfolds = max(foldid) outmat = matrix(NA, nfolds, ncol(mat)) good = matrix(0, nfolds, ncol(mat)) mat[is.infinite(mat)] = NA for (i in seq(nfolds)) { mati = mat[foldid == i, , drop = FALSE] wi = weights[foldid == i] outmat[i, ] = apply(mati, 2, weighted.mean, w = wi, na.rm = TRUE) good[i, seq(nlams[i])] = 1 } N = apply(good, 2, sum) list(cvraw = outmat, weights = wisum, N = N, type.measure=cvstuff$type.measure) } glmnet/R/check.dots.R0000644000176200001440000000122213534022702014104 0ustar liggesuserscheck_dots<- function(object,...,need=c("x","y","weights","offset","penalty.factor","lower.limits","upper.limits"),error="used coef.glmnet() or predict.glmnet() with `exact=TRUE`"){ if(is.null(need))return(invisible()) thiscall=object$call ncall=names(thiscall)[-1] w=match(ncall,need,0) need=need[w] nargs=names(list(...)) w=match(need,nargs,0)>0 if(!all(w)){ margs=need[!w] stop(paste(error,"so must in addition supply original argument(s) ",paste(margs,collapse=" and "), " in order to safely rerun glmnet"),call.=FALSE) } invisible() } glmnet/R/print.confusion.table.R0000644000176200001440000000077213552673674016340 0ustar liggesusers#' @method print confusion.table #' @export print.confusion.table=function(x,digits = max(3, getOption("digits") - 3), ...){ ndn=names(dimnames(x)) rowtot=rowSums(x) coltot=colSums(x) tot=sum(coltot) ncorrect=sum(diag(x)) correct=(ncorrect)/tot x=cbind(x,Total=rowtot) x=rbind(x,Total=c(coltot,tot)) dn=dimnames(x) names(dn)=ndn dimnames(x)=dn print(x,digits=digits,...) cat("\n Percent Correct: ",format(round(correct,digits)),"\n") invisible() } glmnet/R/rmult.R0000644000176200001440000000110113554367213013231 0ustar liggesusers#' Generate multinomial samples from a probability matrix #' #' Generate multinomial samples #' #' Simple function that calls the \code{rmultinom} function. It generates a class label #' for each row of its input matrix of class probabilities. #' #' @param p matrix of probabilities, with number of columns the number of classes #' @return a vector of class memberships #' @author Trevor Hastie \cr Maintainer: Trevor Hastie #' @export rmult rmult <- function(p){ x=t(apply(p,1,function(x)rmultinom(1,1,x))) x=x%*%seq(ncol(p)) drop(x) } glmnet/R/relax.glmnet.R0000644000176200001440000000770213560703434014477 0ustar liggesusers#' Fit a relaxed glmnet model #' #' @param fit For \code{relax.glmnet} a fitted 'glmnet' object #' @param maxp a limit on how many relaxed coefficients are allowed. Default is #' 'n-3', where 'n' is the sample size. This may not be sufficient for #' non-gaussian familes, in which case users should supply a smaller value. #' This argument can be supplied directly to 'glmnet'. #' @param path Since \code{glmnet} does not do stepsize optimization, the Newton #' algorithm can get stuck and not converge, especially with relaxed fits. With \code{path=TRUE}, #' each relaxed fit on a particular set of variables is computed pathwise using the original sequence #' of lambda values (with a zero attached to the end). Not needed for Gaussian models, and should not #' be used unless needed, since will lead to longer compute times. Default is \code{path=FALSE}. #' appropriate subset of variables #' @param check.args Should \code{relax.glmnet} make sure that all the data #' dependent arguments used in creating 'fit' have been resupplied. Default is #' 'TRUE'. #' @rdname glmnet #' @export relax.glmnet relax.glmnet=function(fit,x,..., maxp = n-3, path=FALSE, check.args=TRUE){ ## maxp could be a sensitive parameter, especially for glms ## This next call fails if you don't supply the crucial arguments ## that were used in the creation of "fit". Not needed if called relax.glmnet if(check.args)check_dots(fit,..., need=c("y","weights","offset","lower.limits","upper.limits"), error="used relax.glmnet(),") d=dim(x) n=d[1];p=d[2] ## extract coefs, and find out who is nonzero at each lambda a0=fit$a0 beta=fit$beta islistbeta=is.list(beta) if(islistbeta){ ngroups=length(beta) nzmat=abs(beta[[1]]) for(k in 2:ngroups)nzmat=nzmat+abs(beta[[k]]) } else nzmat=abs(beta) nzmat=nzmat>0 ## Here we go to some trouble to make sure we dont fit the same model more than once rgauss=sort(abs(rnorm(p))) undex=colSums(rgauss*nzmat)#a unique number for each distinct set of nonzeros sundex=sort(unique(undex[undex>0])) nzindex=match(sundex,undex)# get a match for each unique alldex=match(undex,sundex,0)# for putting them back ## dev=fit$dev.ratio nulldev=fit$nulldev excluders=seq(p) lam0 = if(path)c(fit$lambda,0)else 0 ### Fit a coefficient for each non null model internal.parms <- glmnet.control() if (internal.parms$itrace) { glmnet.control(itrace = 0) ## disable glmnet reporting cat("Relaxed Fits\n") pb <- utils::txtProgressBar(min = 0, max = length(sundex), initial = 0, style = 3) on.exit(glmnet.control(itrace = internal.parms$itrace)) on.exit(close(pb), add = TRUE) } for(i in seq(along=sundex)){ ind=nzmat[,nzindex[i]] wh=alldex==i pi=sum(ind) if(pi>maxp)next #can only fit maxp coefficients exclude=excluders[!ind] ifit=update(fit,lambda=lam0,exclude=exclude,...,relax=FALSE) nlam=ifit$dim[2] if (islistbeta) { a0[, wh] = ifit$a0[,nlam] for (i in 1:ngroups) beta[[i]][, wh] = ifit$beta[[i]][,nlam] } else { a0[wh] = ifit$a0[nlam] beta[, wh] = ifit$beta[,nlam] } dev[wh] = ifit$dev.ratio[nlam] if (internal.parms$itrace) utils::setTxtProgressBar(pb, i) } if (internal.parms$itrace) { utils::setTxtProgressBar(pb = pb, value = length(sundex)) } fitg=fit omit=colSums(nzmat)>maxp if(any(omit)){ if(islistbeta){ a0=a0[,!omit] for(i in 1:ngroups)beta[[i]]=beta[[i]][,!omit] } else{ beta=beta[,!omit] a0=a0[!omit] } dev=dev[!omit] fit$lambda=fit$lambda[!omit] fit$df=fit$df[!omit] } fit$beta=beta fit$a0=a0 fit$dev.ratio=dev class(fitg)=c("relaxed",class(fitg)) fitg$relaxed=fit fitg } glmnet/R/cv.multnet.R0000644000176200001440000000314513566632201014172 0ustar liggesuserscv.multnet <-function(predmat,y,type.measure,weights,foldid,grouped){ prob_min = 1e-05 prob_max = 1 - prob_min nc = dim(y) if (is.null(nc)) { y = as.factor(y) ntab = table(y) nc = as.integer(length(ntab)) y = diag(nc)[as.numeric(y), ] } else nc = nc[2] ywt = apply(y, 1, sum) y = y/ywt weights = weights * ywt N = nrow(y) - apply(is.na(predmat[, 1, ,drop=FALSE]), 2, sum)## dimensions could be lost if third dim=1 bigY = array(y, dim(predmat)) predmat=exp(predmat) predtot=apply(predmat,c(1,3),sum) for(i in 1:nc)predmat[,i,]=predmat[,i,]/predtot cvraw = switch(type.measure, mse = apply((bigY - predmat)^2,c(1, 3), sum), mae = apply(abs(bigY - predmat), c(1,3), sum), deviance = { predmat = pmin(pmax(predmat, prob_min), prob_max) lp = bigY * log(predmat) ly = bigY * log(bigY) ly[bigY == 0] = 0 apply(2 * (ly - lp), c(1, 3), sum) }, class = { classid = as.numeric(apply(predmat, 3, glmnet_softmax,ignore_labels=TRUE)) yperm = matrix(aperm(bigY, c(1, 3, 2)), ncol = nc) matrix(1 - yperm[cbind(seq(classid), classid)], ncol = ncol(predtot)) } ) list(cvraw=cvraw,weights=weights,N=N,type.measure=type.measure,grouped=grouped) } glmnet/R/plot.glmnet.R0000644000176200001440000000311313552673674014347 0ustar liggesusers#' plot coefficients from a "glmnet" object #' #' Produces a coefficient profile plot of the coefficient paths for a fitted #' \code{"glmnet"} object. #' #' A coefficient profile plot is produced. If \code{x} is a multinomial model, #' a coefficient plot is produced for each class. #' #' @aliases plot.glmnet plot.multnet plot.mrelnet plot.relaxed #' @param x fitted \code{"glmnet"} model #' @param xvar What is on the X-axis. \code{"norm"} plots against the L1-norm #' of the coefficients, \code{"lambda"} against the log-lambda sequence, and #' \code{"dev"} against the percent deviance explained. #' @param label If \code{TRUE}, label the curves with variable sequence #' numbers. #' @param \dots Other graphical parameters to plot #' @author Jerome Friedman, Trevor Hastie and Rob Tibshirani\cr Maintainer: #' Trevor Hastie #' @seealso \code{glmnet}, and \code{print}, \code{predict} and \code{coef} #' methods. #' @references Friedman, J., Hastie, T. and Tibshirani, R. (2008) #' \emph{Regularization Paths for Generalized Linear Models via Coordinate #' Descent} #' @keywords models regression #' #' @examples #' x=matrix(rnorm(100*20),100,20) #' y=rnorm(100) #' g2=sample(1:2,100,replace=TRUE) #' g4=sample(1:4,100,replace=TRUE) #' fit1=glmnet(x,y) #' plot(fit1) #' plot(fit1,xvar="lambda",label=TRUE) #' fit3=glmnet(x,g4,family="multinomial") #' plot(fit3,pch=19) #' @method plot glmnet #' @export plot.glmnet=function(x, xvar=c("norm","lambda","dev"),label=FALSE,...){ xvar=match.arg(xvar) plotCoef(x$beta,lambda=x$lambda,df=x$df,dev=x$dev.ratio,label=label,xvar=xvar,...) } glmnet/R/predict.relaxed.R0000644000176200001440000000223613557667713015170 0ustar liggesusers#' @method predict relaxed #' @param gamma Single value of \code{gamma} at which predictions are required, #' for "relaxed" objects. #' @rdname predict.glmnet #' @export #' @export predict.relaxed predict.relaxed=function (object, newx, s = NULL, gamma=1,type = c("link", "response", "coefficients", "nonzero", "class"), exact = FALSE, newoffset, ...) { exact=FALSE # we cannot accommodate exact here type=match.arg(type) gamma=checkgamma.relax(gamma) if(length(gamma)>1){ ng=length(gamma) outlist=as.list(length(ng)) names(outlist(format(round(gamma,2)))) for( i in 1:ng)outlist[[i]]=predict(object, newx, s, gamma=gamma[i], exact, newoffset, ...) return(outlist) } if(gamma==1)return(NextMethod("predict")) predict(blend.relaxed(object,gamma),newx, s,type, exact, newoffset, ...) } checkgamma.relax=function(gamma){ if(any(wh<-gamma<0)){ warning("negative gamma values ignored") gamma=gamma[!wh] } if(any(wh<-gamma>1)){ warning("gamma values larger than 1 ignored") gamma=gamma[!wh] } if(!length(gamma))stop("no valid values of gamma") gamma } glmnet/R/print.cv.relaxed.R0000644000176200001440000000147713552673674015305 0ustar liggesusers#' @method print cv.relaxed #' @export print.cv.relaxed <- function(x, digits = max(3, getOption("digits") - 3), ...) { cat("\nCall: ", deparse(x$call), "\n\n") cat("Measure:", x$name,"\n\n") x=x$relaxed optlams=c(x$lambda.min,x$lambda.1se) wg1=match(x$gamma.min,x$gamma) wl1=match(x$lambda.min,x$statlist[[wg1]]$lambda) s1=with(x$statlist[[wg1]],c(x$gamma.min,x$lambda.min,cvm[wl1],cvsd[wl1],x$nzero.min)) wg2=match(x$gamma.1se,x$gamma) wl2=match(x$lambda.1se,x$statlist[[wg2]]$lambda) s2=with(x$statlist[[wg2]],c(x$gamma.1se,x$lambda.1se,cvm[wl2],cvsd[wl2],x$nzero.1se)) mat=rbind(s1,s2) dimnames(mat)=list(c("min","1se"),c("Gamma","Lambda","Measure","SE","Nonzero")) mat=data.frame(mat,check.names=FALSE) class(mat)=c("anova",class(mat)) print(mat,digits=digits) } glmnet/R/cv.elnet.R0000644000176200001440000000056313534022702013604 0ustar liggesuserscv.elnet <-function(predmat,y,type.measure,weights,foldid,grouped){ N = length(y) - apply(is.na(predmat), 2, sum) cvraw = switch(type.measure, mse = (y - predmat)^2, deviance = (y - predmat)^2, mae = abs(y - predmat)) list(cvraw=cvraw,weights=weights,N=N,type.measure=type.measure,grouped=grouped) } glmnet/R/buildPredmat.coxnetlist.R0000644000176200001440000000417413552673674016723 0ustar liggesusers#' @method buildPredmat coxnetlist #' @export buildPredmat.coxnetlist <- function(outlist, lambda, x, offset, foldid, alignment,y,weights,grouped,type.measure="deviance",...){ nfolds = max(foldid) if ((length(weights)/nfolds < 10) && !grouped) grouped = TRUE devtrue=type.measure=="deviance" cvraw = if(devtrue) matrix(NA, nfolds, length(lambda)) else NULL nlambda = length(lambda) predmat=matrix(NA, nrow(x), length(lambda)) rn=rownames(x) sn=paste("s",seq(0,length=nlambda),sep="") dimnames(predmat)=list(rn,sn) predmat for (i in seq(nfolds)) { which = foldid == i fitobj = outlist[[i]] coefmat = switch(alignment, fraction = predict(fitobj,type = "coefficients",...), lambda = predict(fitobj, type = "coefficients",s = lambda,...) ) nlami = min(ncol(coefmat), nlambda) if(devtrue){ if (grouped) { plfull = coxnet.deviance(x = x, y = y, offset = offset, weights = weights, beta = coefmat) plminusk = coxnet.deviance(x = x[!which, ], y = y[!which, ], offset = offset[!which], weights = weights[!which],beta = coefmat) cvraw[i, seq(nlami)] = (plfull - plminusk)[seq(nlami)] } else { plk = coxnet.deviance(x = x[which, ], y = y[which, ], offset = offset[which], weights = weights[which], beta = coefmat) cvraw[i, seq(nlami)] = plk[seq(nlami)] } } predmat[which, seq(nlami)] = as.matrix(x[which,]%*% coefmat) if (nlami < nlambda){ if(devtrue)cvraw[i, seq(from = nlami, to = nlambda)] = cvraw[i, nlami] predmat[which,seq(from=nlami,to=nlambda)]=predmat[which,nlami] } } if(devtrue) attr(predmat,"cvraw")=cvraw predmat } glmnet/R/auc.mat.R0000644000176200001440000000026213534022702013412 0ustar liggesusersauc.mat=function(y,prob,weights=rep(1,nrow(y))){ Weights=as.vector(weights*y) ny=nrow(y) Y=rep(c(0,1),c(ny,ny)) Prob=c(prob,prob) auc(Y,Prob,Weights) } glmnet/R/auc.R0000644000176200001440000000103313560673471012645 0ustar liggesusersauc=function(y,prob,w){ if(missing(w)){ rprob=rank(prob) n1=sum(y);n0=length(y)-n1 u=sum(rprob[y==1])-n1*(n1+1)/2 exp(log(u) - log(n1) - log(n0)) } else{ rprob=runif(length(prob)) op=order(prob,rprob)#randomize ties y=y[op] w=w[op] cw=cumsum(w) w1=w[y==1] cw1=cumsum(w1) wauc = log(sum(w1*(cw[y==1]-cw1))) sumw1 = cw1[length(cw1)] sumw2 = cw[length(cw)] - sumw1 exp(wauc - log(sumw1) - log(sumw2)) } } glmnet/R/glmnet_softmax.R0000644000176200001440000000130713552136161015117 0ustar liggesusersglmnet_softmax <- function (x,ignore_labels=FALSE) { d <- dim(x) dd <- dimnames(x)[[2]] if(is.null(dd) || !length(dd)) ignore_labels=TRUE nas=apply(is.na(x),1,any) if(any(nas)){ pclass=rep(NA,d[1]) if(sum(nas) maxdist pclass[l] <- i maxdist[l] <- x[l, i] } dd <- dimnames(x)[[2]] if(!ignore_labels) pclass=factor(pclass, levels = seq(d[2]), labels = dd) } pclass } glmnet/R/cv.glmnet.raw.R0000644000176200001440000000576313545025710014566 0ustar liggesuserscv.glmnet.raw <- function (x, y, weights, offset, lambda, type.measure, nfolds, foldid, alignment,grouped, keep, parallel, trace.it, glmnet.call, cv.call, ...) { if (trace.it) cat("Training\n") glmnet.object = glmnet(x, y, weights = weights, offset = offset, lambda = lambda, ...) glmnet.object$call = glmnet.call subclass=class(glmnet.object)[[1]] type.measure=cvtype(type.measure,subclass) is.offset = glmnet.object$offset ###Next line is commented out so each call generates its own lambda sequence # lambda=glmnet.object$lambda if (inherits(glmnet.object, "multnet") && !glmnet.object$grouped) { nz = predict(glmnet.object, type = "nonzero") nz = sapply(nz, function(x) sapply(x, length)) nz = ceiling(apply(nz, 1, median)) } else nz = sapply(predict(glmnet.object, type = "nonzero"), length) outlist = as.list(seq(nfolds)) N=nrow(x) if (parallel) { # if (parallel && require(foreach)) { outlist = foreach(i = seq(nfolds), .packages = c("glmnet")) %dopar% { which = foldid == i # if (is.matrix(y)) if (length(dim(y))>1) y_sub = y[!which, ] else y_sub = y[!which] if (is.offset) offset_sub = as.matrix(offset)[!which, ] else offset_sub = NULL glmnet(x[!which, , drop = FALSE], y_sub, lambda = lambda, offset = offset_sub, weights = weights[!which], ...) } } else { for (i in seq(nfolds)) { if (trace.it) cat(sprintf("Fold: %d/%d\n", i, nfolds)) which = foldid == i if (is.matrix(y)) y_sub = y[!which, ] else y_sub = y[!which] if (is.offset) offset_sub = as.matrix(offset)[!which, ] else offset_sub = NULL outlist[[i]] = glmnet(x[!which, , drop = FALSE], y_sub, lambda = lambda, offset = offset_sub, weights = weights[!which], ...) } } lambda = glmnet.object$lambda class(outlist)=paste0(subclass,"list") predmat=buildPredmat(outlist,lambda,x,offset,foldid,alignment,y=y,weights=weights, grouped=grouped,type.measure=type.measure) ### we include type.measure for the special case of coxnet with the deviance vs C-index discrepancy ### Next we compute the measures fun = paste("cv", subclass, sep = ".") cvstuff = do.call(fun, list(predmat,y,type.measure,weights,foldid,grouped)) grouped=cvstuff$grouped if ((N/nfolds < 3) && grouped) { warning("Option grouped=FALSE enforced in cv.glmnet, since < 3 observations per fold", call. = FALSE) grouped = FALSE } out=cvstats(cvstuff,foldid,nfolds,lambda,nz,grouped) cvname = names(cvstuff$type.measure) names(cvname)=cvstuff$type.measure# to be compatible with earlier version; silly, I know out = c(out,list(call=cv.call,name = cvname, glmnet.fit = glmnet.object)) if (keep) out = c(out, list(fit.preval = predmat, foldid = foldid)) lamin=with(out,getOptcv.glmnet(lambda, cvm, cvsd, cvname)) obj = c(out, as.list(lamin)) class(obj) = "cv.glmnet" obj } glmnet/R/predict.lognet.R0000644000176200001440000000137113552673674015031 0ustar liggesusers#' @method predict lognet #' @export predict.lognet=function(object,newx,s=NULL,type=c("link","response","coefficients","class","nonzero"),exact=FALSE,newoffset,...){ type=match.arg(type) ### remember that although the fortran lognet makes predictions ### for the first class, we make predictions for the second class ### to avoid confusion with 0/1 responses. ### glmnet flipped the signs of the coefficients nfit=NextMethod("predict") switch(type, response={ pp=exp(-nfit) 1/(1+pp) }, class={ cnum=ifelse(nfit>0,2,1) clet=object$classnames[cnum] if(is.matrix(cnum))clet=array(clet,dim(cnum),dimnames(cnum)) clet }, nfit ) } glmnet/R/glmnet.R0000644000176200001440000005515213560637066013376 0ustar liggesusers#' fit a GLM with lasso or elasticnet regularization #' #' Fit a generalized linear model via penalized maximum likelihood. The #' regularization path is computed for the lasso or elasticnet penalty at a #' grid of values for the regularization parameter lambda. Can deal with all #' shapes of data, including very large sparse data matrices. Fits linear, #' logistic and multinomial, poisson, and Cox regression models. #' #' The sequence of models implied by \code{lambda} is fit by coordinate #' descent. For \code{family="gaussian"} this is the lasso sequence if #' \code{alpha=1}, else it is the elasticnet sequence. For the other families, #' this is a lasso or elasticnet regularization path for fitting the #' generalized linear regression paths, by maximizing the appropriate penalized #' log-likelihood (partial likelihood for the "cox" model). Sometimes the #' sequence is truncated before \code{nlambda} values of \code{lambda} have #' been used, because of instabilities in the inverse link functions near a #' saturated fit. \code{glmnet(...,family="binomial")} fits a traditional #' logistic regression model for the log-odds. #' \code{glmnet(...,family="multinomial")} fits a symmetric multinomial model, #' where each class is represented by a linear model (on the log-scale). The #' penalties take care of redundancies. A two-class \code{"multinomial"} model #' will produce the same fit as the corresponding \code{"binomial"} model, #' except the pair of coefficient matrices will be equal in magnitude and #' opposite in sign, and half the \code{"binomial"} values. Note that the #' objective function for \code{"gaussian"} is \deqn{1/2 RSS/nobs + #' \lambda*penalty,} and for the other models it is \deqn{-loglik/nobs + #' \lambda*penalty.} Note also that for \code{"gaussian"}, \code{glmnet} #' standardizes y to have unit variance (using 1/n rather than 1/(n-1) formula) #' before computing its lambda sequence (and then unstandardizes the resulting #' coefficients); if you wish to reproduce/compare results with other software, #' best to supply a standardized y. The coefficients for any predictor #' variables with zero variance are set to zero for all values of lambda. The #' latest two features in glmnet are the \code{family="mgaussian"} family and #' the \code{type.multinomial="grouped"} option for multinomial fitting. The #' former allows a multi-response gaussian model to be fit, using a "group #' -lasso" penalty on the coefficients for each variable. Tying the responses #' together like this is called "multi-task" learning in some domains. The #' grouped multinomial allows the same penalty for the #' \code{family="multinomial"} model, which is also multi-responsed. For both #' of these the penalty on the coefficient vector for variable j is #' \deqn{(1-\alpha)/2||\beta_j||_2^2+\alpha||\beta_j||_2.} When \code{alpha=1} #' this is a group-lasso penalty, and otherwise it mixes with quadratic just #' like elasticnet. A small detail in the Cox model: if death times are tied #' with censored times, we assume the censored times occurred just #' \emph{before} the death times in computing the Breslow approximation; if #' users prefer the usual convention of \emph{after}, they can add a small #' number to all censoring times to achieve this effect. If \code{relax=TRUE} #' a duplicate sequence of models is produced, where each active set in the #' elastic-net path is refit without regularization. The result of this is a #' matching \code{"glmnet"} object which is stored on the original object in a #' component named \code{"relaxed"}, and is part of the glmnet output. #' Generally users will not call \code{relax.glmnet} directly, unless the #' original 'glmnet' object took a long time to fit. But if they do, they must #' supply the fit, and all the original arguments used to create that fit. They #' can limit the length of the relaxed path via 'maxp'. #' #' @param x input matrix, of dimension nobs x nvars; each row is an observation #' vector. Can be in sparse matrix format (inherit from class #' \code{"sparseMatrix"} as in package \code{Matrix}; not yet available for #' \code{family="cox"}) #' @param y response variable. Quantitative for \code{family="gaussian"}, or #' \code{family="poisson"} (non-negative counts). For \code{family="binomial"} #' should be either a factor with two levels, or a two-column matrix of counts #' or proportions (the second column is treated as the target class; for a #' factor, the last level in alphabetical order is the target class). For #' \code{family="multinomial"}, can be a \code{nc>=2} level factor, or a matrix #' with \code{nc} columns of counts or proportions. For either #' \code{"binomial"} or \code{"multinomial"}, if \code{y} is presented as a #' vector, it will be coerced into a factor. For \code{family="cox"}, \code{y} #' should be a two-column matrix with columns named 'time' and 'status'. The #' latter is a binary variable, with '1' indicating death, and '0' indicating #' right censored. The function \code{Surv()} in package \pkg{survival} #' produces such a matrix. For \code{family="mgaussian"}, \code{y} is a matrix #' of quantitative responses. #' @param family Response type (see above) #' @param weights observation weights. Can be total counts if responses are #' proportion matrices. Default is 1 for each observation #' @param offset A vector of length \code{nobs} that is included in the linear #' predictor (a \code{nobs x nc} matrix for the \code{"multinomial"} family). #' Useful for the \code{"poisson"} family (e.g. log of exposure time), or for #' refining a model by starting at a current fit. Default is \code{NULL}. If #' supplied, then values must also be supplied to the \code{predict} function. #' @param alpha The elasticnet mixing parameter, with \eqn{0\le\alpha\le 1}. #' The penalty is defined as #' \deqn{(1-\alpha)/2||\beta||_2^2+\alpha||\beta||_1.} \code{alpha=1} is the #' lasso penalty, and \code{alpha=0} the ridge penalty. #' @param nlambda The number of \code{lambda} values - default is 100. #' @param lambda.min.ratio Smallest value for \code{lambda}, as a fraction of #' \code{lambda.max}, the (data derived) entry value (i.e. the smallest value #' for which all coefficients are zero). The default depends on the sample size #' \code{nobs} relative to the number of variables \code{nvars}. If \code{nobs #' > nvars}, the default is \code{0.0001}, close to zero. If \code{nobs < #' nvars}, the default is \code{0.01}. A very small value of #' \code{lambda.min.ratio} will lead to a saturated fit in the \code{nobs < #' nvars} case. This is undefined for \code{"binomial"} and #' \code{"multinomial"} models, and \code{glmnet} will exit gracefully when the #' percentage deviance explained is almost 1. #' @param lambda A user supplied \code{lambda} sequence. Typical usage is to #' have the program compute its own \code{lambda} sequence based on #' \code{nlambda} and \code{lambda.min.ratio}. Supplying a value of #' \code{lambda} overrides this. WARNING: use with care. Avoid supplying a #' single value for \code{lambda} (for predictions after CV use #' \code{predict()} instead). Supply instead a decreasing sequence of #' \code{lambda} values. \code{glmnet} relies on its warms starts for speed, #' and its often faster to fit a whole path than compute a single fit. #' @param standardize Logical flag for x variable standardization, prior to #' fitting the model sequence. The coefficients are always returned on the #' original scale. Default is \code{standardize=TRUE}. If variables are in the #' same units already, you might not wish to standardize. See details below for #' y standardization with \code{family="gaussian"}. #' @param intercept Should intercept(s) be fitted (default=TRUE) or set to zero #' (FALSE) #' @param thresh Convergence threshold for coordinate descent. Each inner #' coordinate-descent loop continues until the maximum change in the objective #' after any coefficient update is less than \code{thresh} times the null #' deviance. Defaults value is \code{1E-7}. #' @param dfmax Limit the maximum number of variables in the model. Useful for #' very large \code{nvars}, if a partial path is desired. #' @param pmax Limit the maximum number of variables ever to be nonzero #' @param exclude Indices of variables to be excluded from the model. Default #' is none. Equivalent to an infinite penalty factor (next item). #' @param penalty.factor Separate penalty factors can be applied to each #' coefficient. This is a number that multiplies \code{lambda} to allow #' differential shrinkage. Can be 0 for some variables, which implies no #' shrinkage, and that variable is always included in the model. Default is 1 #' for all variables (and implicitly infinity for variables listed in #' \code{exclude}). Note: the penalty factors are internally rescaled to sum to #' nvars, and the lambda sequence will reflect this change. #' @param lower.limits Vector of lower limits for each coefficient; default #' \code{-Inf}. Each of these must be non-positive. Can be presented as a #' single value (which will then be replicated), else a vector of length #' \code{nvars} #' @param upper.limits Vector of upper limits for each coefficient; default #' \code{Inf}. See \code{lower.limits} #' @param maxit Maximum number of passes over the data for all lambda values; #' default is 10^5. #' @param type.gaussian Two algorithm types are supported for (only) #' \code{family="gaussian"}. The default when \code{nvar<500} is #' \code{type.gaussian="covariance"}, and saves all inner-products ever #' computed. This can be much faster than \code{type.gaussian="naive"}, which #' loops through \code{nobs} every time an inner-product is computed. The #' latter can be far more efficient for \code{nvar >> nobs} situations, or when #' \code{nvar > 500}. #' @param type.logistic If \code{"Newton"} then the exact hessian is used #' (default), while \code{"modified.Newton"} uses an upper-bound on the #' hessian, and can be faster. #' @param standardize.response This is for the \code{family="mgaussian"} #' family, and allows the user to standardize the response variables #' @param type.multinomial If \code{"grouped"} then a grouped lasso penalty is #' used on the multinomial coefficients for a variable. This ensures they are #' all in our out together. The default is \code{"ungrouped"} #' @param relax If \code{TRUE} then for each \emph{active set} in the path of #' solutions, the model is refit without any regularization. See \code{details} #' for more information. This argument is new, and users may experience convergence issues #' with small datasets, especially with non-gaussian families. Limiting the #' value of 'maxp' can alleviate these issues in some cases. #' @param trace.it If \code{trace.it=1}, then a progress bar is displayed; #' useful for big models that take a long time to fit. #' @param ... Additional argument used in \code{relax.glmnet}. These include #' some of the original arguments to 'glmnet', and each must be named if used. #' @return An object with S3 class \code{"glmnet","*" }, where \code{"*"} is #' \code{"elnet"}, \code{"lognet"}, \code{"multnet"}, \code{"fishnet"} #' (poisson), \code{"coxnet"} or \code{"mrelnet"} for the various types of #' models. If the model was created with \code{relax=TRUE} then this class has #' a prefix class of \code{"relaxed"}. \item{call}{the call that produced this #' object} \item{a0}{Intercept sequence of length \code{length(lambda)}} #' \item{beta}{For \code{"elnet"}, \code{"lognet"}, \code{"fishnet"} and #' \code{"coxnet"} models, a \code{nvars x length(lambda)} matrix of #' coefficients, stored in sparse column format (\code{"CsparseMatrix"}). For #' \code{"multnet"} and \code{"mgaussian"}, a list of \code{nc} such matrices, #' one for each class.} \item{lambda}{The actual sequence of \code{lambda} #' values used. When \code{alpha=0}, the largest lambda reported does not quite #' give the zero coefficients reported (\code{lambda=inf} would in principle). #' Instead, the largest \code{lambda} for \code{alpha=0.001} is used, and the #' sequence of \code{lambda} values is derived from this.} \item{dev.ratio}{The #' fraction of (null) deviance explained (for \code{"elnet"}, this is the #' R-square). The deviance calculations incorporate weights if present in the #' model. The deviance is defined to be 2*(loglike_sat - loglike), where #' loglike_sat is the log-likelihood for the saturated model (a model with a #' free parameter per observation). Hence dev.ratio=1-dev/nulldev.} #' \item{nulldev}{Null deviance (per observation). This is defined to be #' 2*(loglike_sat -loglike(Null)); The NULL model refers to the intercept #' model, except for the Cox, where it is the 0 model.} \item{df}{The number of #' nonzero coefficients for each value of \code{lambda}. For \code{"multnet"}, #' this is the number of variables with a nonzero coefficient for \emph{any} #' class.} \item{dfmat}{For \code{"multnet"} and \code{"mrelnet"} only. A #' matrix consisting of the number of nonzero coefficients per class} #' \item{dim}{dimension of coefficient matrix (ices)} \item{nobs}{number of #' observations} \item{npasses}{total passes over the data summed over all #' lambda values} \item{offset}{a logical variable indicating whether an offset #' was included in the model} \item{jerr}{error flag, for warnings and errors #' (largely for internal debugging).} \item{relaxed}{If \code{relax=TRUE}, this #' additional item is another glmnet object with different values for #' \code{beta} and \code{dev.ratio}} #' @author Jerome Friedman, Trevor Hastie, Balasubramanian Narasimhan, Noah #' Simon and Rob Tibshirani\cr Maintainer: Trevor Hastie #' \email{hastie@@stanford.edu} #' @seealso \code{print}, \code{predict}, \code{coef} and \code{plot} methods, #' and the \code{cv.glmnet} function. #' @references Friedman, J., Hastie, T. and Tibshirani, R. (2008) #' \emph{Regularization Paths for Generalized Linear Models via Coordinate #' Descent}, \url{https://web.stanford.edu/~hastie/Papers/glmnet.pdf}\cr #' \emph{Journal of Statistical Software, Vol. 33(1), 1-22 Feb 2010}\cr #' \url{https://www.jstatsoft.org/v33/i01/}\cr Simon, N., Friedman, J., Hastie, #' T., Tibshirani, R. (2011) \emph{Regularization Paths for Cox's Proportional #' Hazards Model via Coordinate Descent, Journal of Statistical Software, Vol. #' 39(5) 1-13}\cr \url{https://www.jstatsoft.org/v39/i05/}\cr Tibshirani, #' Robert, Bien, J., Friedman, J., Hastie, T.,Simon, N.,Taylor, J. and #' Tibshirani, Ryan. (2012) \emph{Strong Rules for Discarding Predictors in #' Lasso-type Problems, JRSSB vol 74},\cr #' \url{https://statweb.stanford.edu/~tibs/ftp/strong.pdf}\cr \emph{Stanford #' Statistics Technical Report}\cr \url{https://arxiv.org/abs/1707.08692}\cr #' Hastie, T., Tibshirani, Robert, Tibshirani, Ryan (2019) \emph{Extended #' Comparisons of Best Subset Selection, Forward Stepwise Selection, and the #' Lasso}\cr \emph{Glmnet Vignette} #' \url{https://web.stanford.edu/~hastie/glmnet/glmnet_alpha.html} #' @keywords models regression #' @examples #' #' # Gaussian #' x = matrix(rnorm(100 * 20), 100, 20) #' y = rnorm(100) #' fit1 = glmnet(x, y) #' print(fit1) #' coef(fit1, s = 0.01) # extract coefficients at a single value of lambda #' predict(fit1, newx = x[1:10, ], s = c(0.01, 0.005)) # make predictions #' #' # Relaxed #' fit1r = glmnet(x, y, relax = TRUE) # can be used with any model #' #' # multivariate gaussian #' y = matrix(rnorm(100 * 3), 100, 3) #' fit1m = glmnet(x, y, family = "mgaussian") #' plot(fit1m, type.coef = "2norm") #' #' # binomial #' g2 = sample(1:2, 100, replace = TRUE) #' fit2 = glmnet(x, g2, family = "binomial") #' fit2r = glmnet(x,g2, family = "binomial", relax=TRUE) #' fit2rp = glmnet(x,g2, family = "binomial", relax=TRUE, path=TRUE) #' #' # multinomial #' g4 = sample(1:4, 100, replace = TRUE) #' fit3 = glmnet(x, g4, family = "multinomial") #' fit3a = glmnet(x, g4, family = "multinomial", type.multinomial = "grouped") #' # poisson #' N = 500 #' p = 20 #' nzc = 5 #' x = matrix(rnorm(N * p), N, p) #' beta = rnorm(nzc) #' f = x[, seq(nzc)] %*% beta #' mu = exp(f) #' y = rpois(N, mu) #' fit = glmnet(x, y, family = "poisson") #' plot(fit) #' pfit = predict(fit, x, s = 0.001, type = "response") #' plot(pfit, y) #' #' # Cox #' set.seed(10101) #' N = 1000 #' p = 30 #' nzc = p/3 #' x = matrix(rnorm(N * p), N, p) #' beta = rnorm(nzc) #' fx = x[, seq(nzc)] %*% beta/3 #' hx = exp(fx) #' ty = rexp(N, hx) #' tcens = rbinom(n = N, prob = 0.3, size = 1) # censoring indicator #' y = cbind(time = ty, status = 1 - tcens) # y=Surv(ty,1-tcens) with library(survival) #' fit = glmnet(x, y, family = "cox") #' plot(fit) #' #' # Sparse #' n = 10000 #' p = 200 #' nzc = trunc(p/10) #' x = matrix(rnorm(n * p), n, p) #' iz = sample(1:(n * p), size = n * p * 0.85, replace = FALSE) #' x[iz] = 0 #' sx = Matrix(x, sparse = TRUE) #' inherits(sx, "sparseMatrix") #confirm that it is sparse #' beta = rnorm(nzc) #' fx = x[, seq(nzc)] %*% beta #' eps = rnorm(n) #' y = fx + eps #' px = exp(fx) #' px = px/(1 + px) #' ly = rbinom(n = length(px), prob = px, size = 1) #' system.time(fit1 <- glmnet(sx, y)) #' system.time(fit2n <- glmnet(x, y)) #' #' @export glmnet glmnet=function(x,y,family=c("gaussian","binomial","poisson","multinomial","cox","mgaussian"),weights,offset=NULL,alpha=1.0,nlambda=100,lambda.min.ratio=ifelse(nobs1){ warning("alpha >1; set to 1") alpha=1 } if(alpha<0){ warning("alpha<0; set to 0") alpha=0 } alpha=as.double(alpha) this.call=match.call() nlam=as.integer(nlambda) y=drop(y) # we dont like matrix responses unless we need them np=dim(x) ###check dims if(is.null(np)|(np[2]<=1))stop("x should be a matrix with 2 or more columns") nobs=as.integer(np[1]) if(missing(weights))weights=rep(1,nobs) else if(length(weights)!=nobs)stop(paste("number of elements in weights (",length(weights),") not equal to the number of rows of x (",nobs,")",sep="")) nvars=as.integer(np[2]) dimy=dim(y) nrowy=ifelse(is.null(dimy),length(y),dimy[1]) if(nrowy!=nobs)stop(paste("number of observations in y (",nrowy,") not equal to the number of rows of x (",nobs,")",sep="")) vnames=colnames(x) if(is.null(vnames))vnames=paste("V",seq(nvars),sep="") ne=as.integer(dfmax) nx=as.integer(pmax) if(missing(exclude))exclude=integer(0) if(any(penalty.factor==Inf)){ exclude=c(exclude,seq(nvars)[penalty.factor==Inf]) exclude=sort(unique(exclude)) } if(length(exclude)>0){ jd=match(exclude,seq(nvars),0) if(!all(jd>0))stop("Some excluded variables out of range") penalty.factor[jd]=1 #ow can change lambda sequence jd=as.integer(c(length(jd),jd)) }else jd=as.integer(0) vp=as.double(penalty.factor) internal.parms=glmnet.control() if(internal.parms$itrace)trace.it=1 else{ if(trace.it){ glmnet.control(itrace=1) on.exit(glmnet.control(itrace=0)) } } ###check on limits if(any(lower.limits>0)){stop("Lower limits should be non-positive")} if(any(upper.limits<0)){stop("Upper limits should be non-negative")} lower.limits[lower.limits==-Inf]=-internal.parms$big upper.limits[upper.limits==Inf]=internal.parms$big if(length(lower.limits)=1)stop("lambda.min.ratio should be less than 1") flmin=as.double(lambda.min.ratio) ulam=double(1) } else{ flmin=as.double(1) if(any(lambda<0))stop("lambdas should be non-negative") ulam=as.double(rev(sort(lambda))) nlam=as.integer(length(lambda)) } is.sparse=FALSE ix=jx=NULL if(inherits(x,"sparseMatrix")){##Sparse case is.sparse=TRUE x=as(x,"CsparseMatrix") x=as(x,"dgCMatrix") ix=as.integer(x@p+1) jx=as.integer(x@i+1) x=as.double(x@x) } if (trace.it) { if (relax) cat("Training Fit\n") pb <- createPB(min = 0, max = nlam, initial = 0, style = 3) } kopt=switch(match.arg(type.logistic), "Newton"=0,#This means to use the exact Hessian "modified.Newton"=1 # Use the upper bound ) if(family=="multinomial"){ type.multinomial=match.arg(type.multinomial) if(type.multinomial=="grouped")kopt=2 #overrules previous kopt } kopt=as.integer(kopt) fit=switch(family, "gaussian"=elnet(x,is.sparse,ix,jx,y,weights,offset,type.gaussian,alpha,nobs,nvars,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,intr,vnames,maxit), "poisson"=fishnet(x,is.sparse,ix,jx,y,weights,offset,alpha,nobs,nvars,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,intr,vnames,maxit), "binomial"=lognet(x,is.sparse,ix,jx,y,weights,offset,alpha,nobs,nvars,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,intr,vnames,maxit,kopt,family), "multinomial"=lognet(x,is.sparse,ix,jx,y,weights,offset,alpha,nobs,nvars,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,intr,vnames,maxit,kopt,family), "cox"=coxnet(x,is.sparse,ix,jx,y,weights,offset,alpha,nobs,nvars,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,vnames,maxit), "mgaussian"=mrelnet(x,is.sparse,ix,jx,y,weights,offset,alpha,nobs,nvars,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,jsd,intr,vnames,maxit) ) if (trace.it) { utils::setTxtProgressBar(pb, nlam) close(pb) } if(is.null(lambda))fit$lambda=fix.lam(fit$lambda)##first lambda is infinity; changed to entry point fit$call=this.call fit$nobs=nobs class(fit)=c(class(fit),"glmnet") if(relax) relax.glmnet(fit, x=x,y=y,weights=weights,offset=offset, lower.limits=lower.limits,upper.limits=upper.limits, check.args=FALSE,...) else fit } glmnet/R/print.glmnet.R0000644000176200001440000000305713552673674014534 0ustar liggesusers#' print a glmnet object #' #' Print a summary of the glmnet path at each step along the path. #' @details #' The call that produced the object `x` is printed, followed by a #' three-column matrix with columns `Df`, `%Dev` and `Lambda`. #' The `Df` column is the number of nonzero coefficients (Df is a #' reasonable name only for lasso fits). `%Dev` is the percent deviance #' explained (relative to the null deviance). In the case of a 'relaxed' fit, #' an additional column is inserted, `%Dev R` which gives the percent #' deviance explained by the relaxed model. For a "bigGlm" model, a simpler #' summary is printed. #' #' @aliases print.glmnet print.relaxed print.bigGlm #' @param x fitted glmnet object #' @param digits significant digits in printout #' @param \dots additional print arguments #' @return The matrix above is silently returned #' @seealso \code{glmnet}, \code{predict} and \code{coef} methods. #' @references Friedman, J., Hastie, T. and Tibshirani, R. (2008). Regularization Paths for Generalized Linear Models via Coordinate Descent #' @keywords models regression #' @examples #' #' x = matrix(rnorm(100 * 20), 100, 20) #' y = rnorm(100) #' fit1 = glmnet(x, y) #' print(fit1) #' @method print glmnet #' @export print.glmnet <- function (x, digits = max(3, getOption("digits") - 3), ...) { cat("\nCall: ", deparse(x$call), "\n\n") out=data.frame(Df = x$df, `%Dev` = signif(x$dev.ratio, digits), Lambda = signif(x$lambda, digits),check.names=FALSE,row.names=seq(along=x$df)) class(out)=c("anova",class(out)) print(out) } glmnet/R/coxnet.R0000644000176200001440000000322613534022702013365 0ustar liggesuserscoxnet=function(x,is.sparse,ix,jx,y,weights,offset,alpha,nobs,nvars,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,vnames,maxit){ if(!is.matrix(y)||!all(match(c("time","status"),dimnames(y)[[2]],0)))stop("Cox model requires a matrix with columns 'time' (>0) and 'status' (binary) as a response; a 'Surv' object suffices",call.=FALSE) ty=as.double(y[,"time"]) tevent=as.double(y[,"status"]) ty=ty+(1-tevent)*100*.Machine$double.eps## ties issue if(any(ty<=0))stop("negative event times encountered; not permitted for Cox family") maxit=as.integer(maxit) weights=as.double(weights) if(is.null(offset)){ offset=ty*0 is.offset=FALSE} else{ storage.mode(offset)="double" is.offset=TRUE } fit=if(is.sparse)stop("Cox model mot implemented for sparse x in glmnet",call.=FALSE) else .Fortran("coxnet", parm=alpha,nobs,nvars,as.double(x),ty,tevent,offset,weights,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh, maxit,isd,# need to get JHF to reverse these lmu=integer(1), ca=double(nx*nlam), ia=integer(nx), nin=integer(nlam), nulldev=double(1), dev=double(nlam), alm=double(nlam), nlp=integer(1), jerr=integer(1),PACKAGE="glmnet" ) if(fit$jerr!=0){ errmsg=jerr(fit$jerr,maxit,pmax=nx,family="cox") if(errmsg$fatal)stop(errmsg$msg,call.=FALSE) else warning(errmsg$msg,call.=FALSE) } outlist=getcoef(fit,nvars,nx,vnames) dev=fit$dev[seq(fit$lmu)] outlist=c(outlist,list(dev.ratio=dev,nulldev=fit$nulldev,npasses=fit$nlp,jerr=fit$jerr,offset=is.offset)) class(outlist)="coxnet" outlist } glmnet/R/coef.cv.glmnet.R0000644000176200001440000000045013552673674014715 0ustar liggesusers#' @method coef cv.glmnet #' @export coef.cv.glmnet=function(object,s=c("lambda.1se","lambda.min"),...){ if(is.numeric(s))lambda=s else if(is.character(s)){ s=match.arg(s) lambda=object[[s]] } else stop("Invalid form for s") coef(object$glmnet.fit,s=lambda,...) } glmnet/R/assess.glmnet.R0000644000176200001440000001257413573535116014674 0ustar liggesusers#' assess performace of a 'glmnet' object using test data. #' #' Given a test set, produce summary performance measures for the glmnet #' model(s) #' #' \code{assess.glmnet} produces all the different performance measures #' provided by \code{cv.glmnet} for each of the families. A single vector, or a #' matrix of predictions can be provided, or fitted model objects or CV #' objects. In the case when the predictions are still to be made, the #' \code{...} arguments allow, for example, 'offsets' and other prediction #' parameters such as values for 'gamma' for 'relaxed' fits. \code{roc.glmnet} #' produces for a single vector a two column matrix with columns TPR and FPR #' (true positive rate and false positive rate). This object can be plotted to #' produce an ROC curve. If more than one predictions are called for, then a #' list of such matrices is produced. \code{confusion.glmnet} produces a #' confusion matrix tabulating the classification results. Again, a single #' table or a list, with a print method. #' #' @aliases assess.glmnet confusion.glmnet roc.glmnet #' @param object Fitted \code{"glmnet"} or \code{"cv.glmnet"}, \code{"relaxed"} #' or \code{"cv.relaxed"} object, or a matrix of predictions (for #' \code{roc.glmnet} or \code{assess.glmnet}). For \code{roc.glmnet} the model #' must be a 'binomial', and for \code{confusion.glmnet} must be either #' 'binomial' or 'multinomial' #' @param newx If predictions are to made, these are the 'x' values. Required #' for \code{confusion.glmnet} #' @param newy required argument for all functions; the new response values #' @param weights For observation weights for the test observations #' @param family The family of the model, in case predictions are passed in as #' 'object' #' @param ... additional arguments to \code{predict.glmnet} when "object" is a #' "glmnet" fit, and predictions must be made to produce the statistics. #' @return \code{assess.glmnet} produces a list of vectors of measures. #' \code{roc.glmnet} a list of 'roc' two-column matrices, and #' \code{confusion.glmnet} a list of tables. If a single prediction is #' provided, or predictions are made from a CV object, the latter two drop the #' list status and produce a single matrix or table. #' @author Trevor Hastie and Rob Tibshirani\cr Maintainer: Trevor Hastie #' #' @seealso \code{cv.glmnet}, \code{glmnet.measures} and \code{vignette("relax",package="glmnet")} #' @keywords models classification #' @examples #' #' data(QuickStartExample) #' set.seed(11) #' train = sample(seq(length(y)),70,replace=FALSE) #' fit1 = glmnet(x[train,], y[train]) #' assess.glmnet(fit1, newx = x[-train,], newy = y[-train]) #' preds = predict(fit1, newx = x[-train, ], s = c(1, 0.25)) #' assess.glmnet(preds, newy = y[-train], family = "gaussian") #' fit1c = cv.glmnet(x, y, keep = TRUE) #' fit1a = assess.glmnet(fit1c$fit.preval, newy=y,family="gaussian") #' plot(fit1c$lambda, log="x",fit1a$mae,xlab="Log Lambda",ylab="Mean Absolute Error") #' abline(v=fit1c$lambda.min, lty=2, col="red") #' data(BinomialExample) #' fit2 = glmnet(x[train,], y[train], family = "binomial") #' assess.glmnet(fit2,newx = x[-train,], newy=y[-train], s=0.1) #' plot(roc.glmnet(fit2, newx = x[-train,], newy=y[-train])[[10]]) #' fit2c = cv.glmnet(x, y, family = "binomial", keep=TRUE) #' idmin = match(fit2c$lambda.min, fit2c$lambda) #' plot(roc.glmnet(fit2c$fit.preval, newy = y)[[idmin]]) #' data(MultinomialExample) #' set.seed(103) #' train = sample(seq(length(y)),100,replace=FALSE) #' fit3 = glmnet(x[train,], y[train], family = "multinomial") #' confusion.glmnet(fit3, newx = x[-train, ], newy = y[-train], s = 0.01) #' fit3c = cv.glmnet(x, y, family = "multinomial", type.measure="class", keep=TRUE) #' idmin = match(fit3c$lambda.min, fit3c$lambda) #' confusion.glmnet(fit3c$fit.preval, newy = y, family="multinomial")[[idmin]] #' #' @export assess.glmnet assess.glmnet=function(object,newx=NULL,newy,weights=NULL, family=c("gaussian","binomial","poisson","multinomial","cox","mgaussian"), ...){ ### object must be either a glmnet or cv.glmnet object, or else a matrix/vector of predictions of a glmnet model (not on the mean scale, but natural parameter scale) ### It must either be a matrix or an array. The last dimension can be 1. oclass=grep("glmnet",class(object)) if(length(oclass)){# either a glmnet or cv.glmnet predmat=predict(object,newx=newx,...) fam=family(object) } else{ fam=match.arg(family) predmat=object if(is.vector(predmat))predmat=as.matrix(predmat) } type.measures = glmnet.measures(fam) y = drop(newy) dimy=dim(y) nrowy=ifelse(is.null(dimy),length(y),dimy[1]) if (is.null(weights)) weights = rep(1, nrowy) subclass=switch(fam,gaussian="elnet",binomial="lognet",poisson="fishnet",multinomial="multnet", cox="coxnet",mgaussian="mrelnet") fun = paste("cv", subclass, sep = ".") if(subclass=="coxnet")fun="assess.coxnet" outlist=as.list(type.measures) names(outlist)=type.measures for(type.measure in type.measures){ type.measure=cvtype(type.measure,subclass) teststuff = do.call(fun, list(predmat,y,type.measure,weights,foldid=rep(1,nrowy),grouped=FALSE)) out=drop(with(teststuff, apply(cvraw, 2, weighted.mean, w = weights, na.rm = TRUE))) attr(out,"measure")=names(type.measure) outlist[[type.measure]]=out } outlist } glmnet/R/fishnet.R0000644000176200001440000000321013534022702013516 0ustar liggesusersfishnet=function(x,is.sparse,ix,jx,y,weights,offset,alpha,nobs,nvars,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,intr,vnames,maxit){ if(any(y<0))stop("negative responses encountered; not permitted for Poisson family") maxit=as.integer(maxit) weights=as.double(weights) storage.mode(y)="double" if(is.null(offset)){ offset=y*0 #keeps the shape of y is.offset=FALSE} else{ storage.mode(offset)="double" is.offset=TRUE } fit=if(is.sparse).Fortran("spfishnet", parm=alpha,nobs,nvars,x,ix,jx,y,offset,weights,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,intr,maxit, lmu=integer(1), a0=double(nlam), ca=double(nx*nlam), ia=integer(nx), nin=integer(nlam), nulldev=double(1), dev=double(nlam), alm=double(nlam), nlp=integer(1), jerr=integer(1),PACKAGE="glmnet" ) else .Fortran("fishnet", parm=alpha,nobs,nvars,as.double(x),y,offset,weights,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,intr,maxit, lmu=integer(1), a0=double(nlam), ca=double(nx*nlam), ia=integer(nx), nin=integer(nlam), nulldev=double(1), dev=double(nlam), alm=double(nlam), nlp=integer(1), jerr=integer(1),PACKAGE="glmnet" ) if(fit$jerr!=0){ errmsg=jerr(fit$jerr,maxit,pmax=nx,family="poisson") if(errmsg$fatal)stop(errmsg$msg,call.=FALSE) else warning(errmsg$msg,call.=FALSE) } outlist=getcoef(fit,nvars,nx,vnames) dev=fit$dev[seq(fit$lmu)] outlist=c(outlist,list(dev.ratio=dev,nulldev=fit$nulldev,npasses=fit$nlp,jerr=fit$jerr,offset=is.offset)) class(outlist)="fishnet" outlist } glmnet/NEWS.md0000644000176200001440000001434713574046107012656 0ustar liggesusers# glmnet 3.0-2 Bug fixes * `confusion.glmnet` was sometimes not returning a list because of apply collapsing structure * `cv.mrelnet` and `cv.multnet` dropping dimensions inappropriately * Fix to `storePB` to avoid segfault. Thanks [Tomas Kalibera](https://github.com/kalibera)! * Changed the help for `assess.glmnet` and cousins to be more helpful! * Changed some logic in `lambda.interp` to avoid edge cases (thanks David Keplinger) # glmnet 3.0-1 Minor fix to correct Depends in the DESCRIPTION to R (>= 3.6.0) # glmnet 3.0 This is a major revision with much added functionality, listed roughly in order of importance. An additional vignette called `relax` is supplied to describe the usage. * `relax` argument added to `glmnet`. This causes the models in the path to be refit without regularization. The resulting object inherits from class `glmnet`, and has an additional component, itself a glmnet object, which is the relaxed fit. * `relax` argument to `cv.glmnet`. This allows selection from a mixture of the relaxed fit and the regular fit. The mixture is governed by an argument `gamma` with a default of 5 values between 0 and 1. * `predict`, `coef` and `plot` methods for `relaxed` and `cv.relaxed` objects. * `print` method for `relaxed` object, and new `print` methods for `cv.glmnet` and `cv.relaxed` objects. * A progress bar is provided via an additional argument `trace.it=TRUE` to `glmnet` and `cv.glmnet`. This can also be set for the session via `glmnet.control`. * Three new functions `assess.glmnet`, `roc.glmnet` and `confusion.glmnet` for displaying the performance of models. * `makeX` for building the `x` matrix for input to `glmnet`. Main functionality is *one-hot-encoding* of factor variables, treatment of `NA` and creating sparse inputs. * `bigGlm` for fitting the GLMs of `glmnet` unpenalized. In addition to these new features, some of the code in `glmnet` has been tidied up, especially related to CV. # glmnet 2.0-20 * Fixed a bug in internal function `coxnet.deviance` to do with input `pred`, as well as saturated `loglike` (missing) and weights * added a `coxgrad` function for computing the gradient # glmnet 2.0-19 * Fixed a bug in coxnet to do with ties between death set and risk set # glmnet 2.0-18 * Added an option alignment to `cv.glmnet`, for cases when wierd things happen # glmnet 2.0-17 * Further fixes to mortran to get clean fortran; current mortran src is in `inst/mortran` # glmnet 2.0-16 * Additional fixes to mortran; current mortran src is in `inst/mortran` * Mortran uses double precision, and variables are initialized to avoid `-Wall` warnings * cleaned up repeat code in CV by creating a utility function # glmnet 2.0-15 * Fixed up the mortran so that generic fortran compiler can run without any configure # glmnet 2.0-13 * Cleaned up some bugs to do with exact prediction * `newoffset` created problems all over - fixed these # glmnet 2.0-11 * Added protection with `exact=TRUE` calls to `coef` and `predict`. See help file for more details # glmnet 2.0-10 * Two iterations to fix to fix native fortran registration. # glmnet 2.0-8 * included native registration of fortran # glmnet 2.0-7 * constant `y` blows up `elnet`; error trap included * fixed `lambda.interp` which was returning `NaN` under degenerate circumstances. # glmnet 2.0-6 * added some code to extract time and status gracefully from a `Surv` object # glmnet 2.0-3 * changed the usage of `predict` and `coef` with `exact=TRUE`. The user is strongly encouraged to supply the original `x` and `y` values, as well as any other data such as weights that were used in the original fit. # glmnet 2.0-1 * Major upgrade to CV; let each model use its own lambdas, then predict at original set. * fixed some minor bugs # glmnet 1.9-9 * fixed subsetting bug in `lognet` when some weights are zero and `x` is sparse # glmnet 1.9-8 * fixed bug in multivariate response model (uninitialized variable), leading to valgrind issues * fixed issue with multinomial response matrix and zeros * Added a link to a glmnet vignette # glmnet 1.9-6 * fixed bug in `predict.glmnet`, `predict.multnet` and `predict.coxnet`, when `s=` argument is used with a vector of values. It was not doing the matrix multiply correctly * changed documentation of glmnet to explain logistic response matrix # glmnet 1.9-5 * added parallel capabilities, and fixed some minor bugs # glmnet 1.9-3 * added `intercept` option # glmnet 1.9-1 * added upper and lower bounds for coefficients * added `glmnet.control` for setting systems parameters * fixed serious bug in `coxnet` # glmnet 1.8-5 * added `exact=TRUE` option for prediction and coef functions # glmnet 1.8 * Major new release * added `mgaussian` family for multivariate response * added `grouped` option for multinomial family # glmnet 1.7-4 * nasty bug fixed in fortran - removed reference to dble * check class of `newx` and make `dgCmatrix` if sparse # glmnet 1.7-1 * `lognet` added a classnames component to the object * `predict.lognet(type="class")` now returns a character vector/matrix # glmnet 1.6 * `predict.glmnet` : fixed bug with `type="nonzero"` * `glmnet`: Now x can inherit from `sparseMatrix` rather than the very specific `dgCMatrix`, and this will trigger sparse mode for glmnet # glmnet 1.5 * `glmnet.Rd` (`lambda.min`) : changed value to 0.01 if `nobs < nvars`, (`lambda`) added warnings to avoid single value, (`lambda.min`): renamed it `lambda.min.ratio` * `glmnet` (`lambda.min`) : changed value to 0.01 if `nobs < nvars` (`HessianExact`) : changed the sense (it was wrong), (`lambda.min`): renamed it `lambda.min.ratio`. This allows it to be called `lambda.min` in a call though * `predict.cv.glmnet` (new function) : makes predictions directly from the saved `glmnet` object on the cv object * `coef.cv.glmnet` (new function) : as above * `predict.cv.glmnet.Rd` : help functions for the above * `cv.glmnet` : insert `drop(y)` to avoid 1 column matrices; now include a `glmnet.fit` object for later predictions * `nonzeroCoef` : added a special case for a single variable in `x`; it was dying on this * `deviance.glmnet` : included * `deviance.glmnet.Rd` : included # glmnet 1.4 * Note that this starts from version `glmnet_1.4`. glmnet/MD50000644000176200001440000001636313574220223012061 0ustar liggesusersd59e37fd2bcb5e75aa20fc14fd2d8c42 *DESCRIPTION 736b6561ca3bf55e4e378356c32581ca *NAMESPACE f4b991e541f7da5f694a73329b53ed91 *NEWS.md ecfa66073d640bfafdb1f5fc44466141 *R/Cindex.R 4bd3eb09b5b5e4d5dd4a6d885c734b0d *R/assess.coxnet.R 92e0c84bc6b5926157e16316268d7af4 *R/assess.glmnet.R 1edccac1b5d30969fd2f1b2ffa94b97a *R/auc.R 8cd96999dce298c1d81ce51ea2f6d2a3 *R/auc.mat.R 8b2f65e1c21c123294a132887081c627 *R/bigGlm.R d8808544bfbafb423ce60e359ade4b64 *R/blend.relaxed.R 66c9d4ba1317740c3bb83b45ce72f57d *R/buildPredmat.array.R bb2d1c1bb9d300028adab59cbb78a5f3 *R/buildPredmat.coxnetlist.R 5ef6c723328b903266ceb9537fa42d37 *R/buildPredmat.default.R 23bbaa9bd006d8a2d3b01a42f50c150a *R/check.dots.R 05d1834f8f3dc30e0428eb6d1dcb1ba1 *R/coef.cv.glmnet.R da1e68b0c4ae43a6ffcaa2ea3d7c287a *R/coef.cv.relaxed.R f288cf974491d93b56e5c4d6d204d658 *R/coef.glmnet.R a42ad691868ee94b3eae743299af81bc *R/coef.relaxed.R ab05dba77ad585b2ac3a465c26fc2b00 *R/coefnorm.R ee4cc296f6a922b28ba89fe64fa5ce56 *R/confusion.glmnet.R 042e71558b81ea66fb5005cbb5df58b9 *R/coxgrad.R b2ee26c95947789e26860e88068ac7b1 *R/coxnet.R e77cce0cd2ae0dca23e4b88f8d6d432f *R/coxnet.deviance.R 9c81bd7c22c3ab10099606ad4aaabdf6 *R/cv.coxnet.R b3593fdbb51ba45fa9581d246850de4f *R/cv.elnet.R b2f4b2ab04489c3378cc4532551720ba *R/cv.fishnet.R d3880c21371f02a177f605a97ceef7fa *R/cv.glmnet.R 8f09b564284c187b6c2415d1ed98654d *R/cv.glmnet.raw.R 2e7cef16ee38ea377b7034d4f0edc27d *R/cv.lognet.R 5f5234bbe3dc2fbc77015609ad7094d7 *R/cv.mrelnet.R ece608b306df8bb9a9bb96d80a1dda58 *R/cv.multnet.R 9d66243b5fe63890739e9af013bebbd6 *R/cv.relaxed.raw.R c739878e7fc617dab75e8cd65cf9b356 *R/cvcompute.R 2b98d1871792cda71bd9323e9ee2a0b0 *R/cvstats.R 0a3f744ec09412cf762119749e9f3388 *R/cvtype.R 959eaac0e190795f3ee1ced251d60a90 *R/deviance.glmnet.R 5e8e13577afc19d8fbff162063f5d676 *R/elnet.R 0c6c0b1dfa5c98b55f2e9e097df3747d *R/error.bars.R 27d7b2403775f4185af8649cc8260e3a *R/family.glmnet.R a4660a7abf8a28e207417120e5b10957 *R/fishnet.R ebce52c8995ee16c058c2aa93bdcf582 *R/fix.lam.R 0a75012638b7a5b9faf7885d93563974 *R/getOptcv.glmnet.R cc7e7100464c5b9a60356ab46923d3f5 *R/getOptcv.relaxed.R dd14d7acb21ae8f1bb87a54ea763950b *R/getcoef.R c1a8bceef71c915555f8bffc7298137e *R/getcoef.multinomial.R d23c14b0351eef90f38c4d2c6fb09030 *R/glmnet-package.R 0c692a4d40f146a4fa774e2f77fd279f *R/glmnet.R b108bdafa8703698bb74ba8004690b4c *R/glmnet.control.R 6325ffe46fc5ff053b3749dcd3631990 *R/glmnet.measures.R a6224dfa92ac162a19e455b90ec64108 *R/glmnet_softmax.R 5bb185a77e6a3cdae7401bd4ffcaf8f7 *R/jerr.R 65abc981c18160e0a229da5225aeb812 *R/jerr.coxnet.R 5acd474cede565ec9bff39674d9cdac0 *R/jerr.elnet.R 0ee642ef97444c8b0c05b43face38094 *R/jerr.fishnet.R cb426164b68fd511d50afddd54af550f *R/jerr.lognet.R 955ddc9c91f5cb11e10bce2feb17b4aa *R/jerr.mrelnet.R 2448cfc1a8d2d38e7e3289b2af7b5600 *R/lambda.interp.R de7722522b536bc2b8d48e8f1892f76f *R/lognet.R 5dcf5b35ea83737ea256da839196d141 *R/makeX.R de3fcbceced4117b989ef8083113da6c *R/mrelnet.R 17d20a46471df38f1d1c6bb7cb16421a *R/na.mean.R 874f190461e3637bb4fe16c7da03ea6c *R/nonzeroCoef.R 1eb20644889d12fca9e5f08ec9f9a0f3 *R/onAttach.R c63389262e77051b913d9bb3d9b5e5a1 *R/pb.R a71f87425fd5e31f66f607daee2c69e9 *R/plot.cv.glmnet.R ba6f5e462e5b0fb2f1240321600534b5 *R/plot.cv.relaxed.R 58a31af3fb88f68e7d8dde0b10c893ae *R/plot.glmnet.R ea50b48783cf8f7f19578990a2fcd656 *R/plot.mrelnet.R 463f4e07c1ce08ba03746f9bc7fcb327 *R/plot.multnet.R 4713cd5d6a023b95c87ab72b05e5db7a *R/plot.relaxed.R 636feb1ac600bb09dccdfabfecc52c1d *R/plotCoef.R fa0986bb58c46a8481b78b877a6e7636 *R/predict.coxnet.R c56faa301b0f15275d45b356b364e2c6 *R/predict.cv.glmnet.R e4f6bd75906fdb9c58057143edbacbe5 *R/predict.cv.relaxed.R 459ca7b37d845f842e8b5681a2e3a5aa *R/predict.elnet.R 0f470237229a0f3b973d29ef3683d73b *R/predict.fishnet.R fd9ff0509dd08f46b0d98d933bb0f02e *R/predict.glmnet.R 3272244ba2c54519d973d5a4cbc2df8a *R/predict.lognet.R 1bc0c68ce624df57b07bdabfd1e84597 *R/predict.mrelnet.R 02fc6050ced4badab91cc882e06f3bb5 *R/predict.multnet.R ed58f90aa0b7d7a5ead21c0838d5b330 *R/predict.relaxed.R 6f451495413ce2e48a25ffbb49380af1 *R/print.bigGlm.R db093ef96748c43424e48993e2c23b0c *R/print.confusion.table.R 86a25e48412c4c235fbeb2699ebeec3d *R/print.cv.glmnet.R e6bac43231cbbdf5279f929a4b706dbc *R/print.cv.relaxed.R e6715799e49b313bae5b160a3ed8938e *R/print.glmnet.R 39b5e1b6697c05e7cb02eaa86a5c3d88 *R/relax.glmnet.R ce06f0932252d48ac76dc6d0eab19b73 *R/response.coxnet.R b012181c241a4f6699d73f63bec2bd1d *R/rmult.R 533da5bd46d7fed918af5a04b1539d6c *R/roc.glmnet.R 0d040824da1ffcd1edb57b252f6b1f6e *R/zeromat.R 0da7257199efcd228075ed75f5083a6f *README.md ba112d325e0c431932064ee7719c2d95 *build/vignette.rds 058ca4ea844ab733e99395fa1488546b *data/BinomialExample.RData 7a404bc6a255ac95a6cc06cf4fe6ddbf *data/CVXResults.RData 64d84fd86c91dfde6cbda5f13da82327 *data/CoxExample.RData 2740a6e77cb5875cca0de3f5a6b2c2ed *data/MultiGaussianExample.RData f00302d6b4d512cd1f24c30c21335211 *data/MultinomialExample.RData c4f36770e60c6421603e9933930fec06 *data/PoissonExample.RData beaffe6c0ae597f8803216e3bbd4a2d1 *data/QuickStartExample.RData 7056d5f98a624c060d0522045f1b68f8 *data/SparseExample.RData c22d19c217bc163a2c38b84add608c31 *inst/CITATION f22779e1c8486853c9301836419f8220 *inst/doc/Coxnet.R 72bfbc6589c6442d8f33e6e56cf414f3 *inst/doc/Coxnet.Rmd 234336e6acf8dffe2829a92b08062622 *inst/doc/Coxnet.pdf 0626cfff426d60250a1f974475aafa9b *inst/doc/glmnet.R 1085a7b8d861bec70ffdc10540f9c4bb *inst/doc/glmnet.Rmd 3b3fedfc90062b4c1ad490b604657e2e *inst/doc/glmnet.pdf 89bd88dbeae63e44c7a3a83a40cae553 *inst/doc/relax.R 9a02753803d77927adb06d655a99ecb0 *inst/doc/relax.Rmd a0d427d507cf824655fcdb17fef5414b *inst/doc/relax.pdf 24d238928f7c189415fc20255fc99097 *inst/mortran/README.Rmd 808c0ff579da4ab84dcb09f7216bcf3b *inst/mortran/glmnet5dpclean.m 97cbb82f5259d0fadff9161fe7254016 *man/Cindex.Rd b611ebaab951991c4303867d053f2b7e *man/assess.glmnet.Rd bf0550fb152ec21cd4b2fc4a07ffd71d *man/beta_CVX.Rd 413f29637810f0c84718ca2f5bb00ab1 *man/bigGlm.Rd c5fba5e66633aa4b7a312bdda1c4e875 *man/coxgrad.Rd 2ab1a023435e409ab1913670d447778c *man/coxnet.deviance.Rd 700ea086fd818b0316709322ef91574e *man/cv.glmnet.Rd 9ade2a133f3c6e4049a766a561a05145 *man/deviance.glmnet.Rd 5f20347d9a40d8d09134a01ae58a6d75 *man/glmnet-internal.Rd 178ef8b4b64e7c7882b593800ee1d01a *man/glmnet-package.Rd 24a611ba16da3bdb70bcbdd8c5767b71 *man/glmnet.Rd c72bff75aefb2fafece436761861c858 *man/glmnet.control.Rd 4a775417fda41e79eb57dcb6f3c6368c *man/glmnet.measures.Rd a58741a0f8c88395ad8a12d3afc84cae *man/makeX.Rd 8e5d2c806cb13cc2b06207f68a31eba9 *man/na.replace.Rd 0a65347ee5ffbb8ac5344a3d9a0c4cc5 *man/plot.cv.glmnet.Rd befd16466d52bc8dda535c909a0d5c0b *man/plot.glmnet.Rd be490d1b8599f34e4d47dd3eaf6ea198 *man/predict.cv.glmnet.Rd f5b94f979a0b49a6f013189767799576 *man/predict.glmnet.Rd 98578eda412f15fa7808567a181d1fcc *man/print.cv.glmnet.Rd 8b98865e9e84911c6e8d4d4e015e7a29 *man/print.glmnet.Rd 3adbd56c4685f732227a9845b470aeb8 *man/rmult.Rd 4504bde5242fcd2f39caba7d75b9744d *src/glmnet5dpclean.f f2f0dadd227c0f79929977723bf7302c *src/glmnet_init.c 3965fc0eb8205870ea724035d96d8945 *src/pb.c 72bfbc6589c6442d8f33e6e56cf414f3 *vignettes/Coxnet.Rmd 789121c8d4e2c1681d05f19d7a69a054 *vignettes/assets/coxnet.RDS ef63dce9f91dc617a84540178b92a89f *vignettes/assets/glmnet_refs.bib 1085a7b8d861bec70ffdc10540f9c4bb *vignettes/glmnet.Rmd 9a02753803d77927adb06d655a99ecb0 *vignettes/relax.Rmd glmnet/inst/0000755000176200001440000000000013574046201012517 5ustar liggesusersglmnet/inst/mortran/0000755000176200001440000000000013542237467014214 5ustar liggesusersglmnet/inst/mortran/glmnet5dpclean.m0000644000176200001440000045163513542237467017312 0ustar liggesusers" c c newGLMnet (5/12/14) c c c Elastic net with squared-error loss c c dense predictor matrix: c c call elnet(ka,parm,no,ni,x,y,w,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr,isd, c intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) c c x(no,ni) = predictor data matrix flat file (overwritten) c c c sparse predictor matrix: c c call spelnet(ka,parm,no,ni,x,ix,jx,y,w,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr, c isd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) c c x, ix, jx = predictor data matrix in compressed sparse row format c c c other inputs: c c ka = algorithm flag c ka=1 => covariance updating algorithm c ka=2 => naive algorithm c parm = penalty member index (0 <= parm <= 1) c = 0.0 => ridge c = 1.0 => lasso c no = number of observations c ni = number of predictor variables c y(no) = response vector (overwritten) c w(no)= observation weights (overwritten) c jd(jd(1)+1) = predictor variable deletion flag c jd(1) = 0 => use all variables c jd(1) != 0 => do not use variables jd(2)...jd(jd(1)+1) c vp(ni) = relative penalties for each predictor variable c vp(j) = 0 => jth variable unpenalized c cl(2,ni) = interval constraints on coefficient values (overwritten) c cl(1,j) = lower bound for jth coefficient value (<= 0.0) c cl(2,j) = upper bound for jth coefficient value (>= 0.0) c ne = maximum number of variables allowed to enter largest model c (stopping criterion) c nx = maximum number of variables allowed to enter all models c along path (memory allocation, nx > ne). c nlam = (maximum) number of lamda values c flmin = user control of lamda values (>=0) c flmin < 1.0 => minimum lamda = flmin*(largest lamda value) c flmin >= 1.0 => use supplied lamda values (see below) c ulam(nlam) = user supplied lamda values (ignored if flmin < 1.0) c thr = convergence threshold for each lamda solution. c iterations stop when the maximum reduction in the criterion value c as a result of each parameter update over a single pass c is less than thr times the null criterion value. c (suggested value, thr=1.0e-5) c isd = predictor variable standarization flag: c isd = 0 => regression on original predictor variables c isd = 1 => regression on standardized predictor variables c Note: output solutions always reference original c variables locations and scales. c intr = intercept flag c intr = 0/1 => don't/do include intercept in model c maxit = maximum allowed number of passes over the data for all lambda c values (suggested values, maxit = 100000) c c output: c c lmu = actual number of lamda values (solutions) c a0(lmu) = intercept values for each solution c ca(nx,lmu) = compressed coefficient values for each solution c ia(nx) = pointers to compressed coefficients c nin(lmu) = number of compressed coefficients for each solution c rsq(lmu) = R**2 values for each solution c alm(lmu) = lamda values corresponding to each solution c nlp = actual number of passes over the data for all lamda values c jerr = error flag: c jerr = 0 => no error c jerr > 0 => fatal error - no output returned c jerr < 7777 => memory allocation error c jerr = 7777 => all used predictors have zero variance c jerr = 10000 => maxval(vp) <= 0.0 C jerr < 0 => non fatal error - partial output: c Solutions for larger lamdas (1:(k-1)) returned. c jerr = -k => convergence for kth lamda value not reached c after maxit (see above) iterations. c jerr = -10000-k => number of non zero coefficients along path c exceeds nx (see above) at kth lamda value. c c c c least-squares utility routines: c c c uncompress coefficient vectors for all solutions: c c call solns(ni,nx,lmu,ca,ia,nin,b) c c input: c c ni,nx = input to elnet c lmu,ca,ia,nin = output from elnet c c output: c c b(ni,lmu) = all elnet returned solutions in uncompressed format c c c uncompress coefficient vector for particular solution: c c call uncomp(ni,ca,ia,nin,a) c c input: c c ni = total number of predictor variables c ca(nx) = compressed coefficient values for the solution c ia(nx) = pointers to compressed coefficients c nin = number of compressed coefficients for the solution c c output: c c a(ni) = uncompressed coefficient vector c referencing original variables c c c evaluate linear model from compressed coefficients and c uncompressed predictor matrix: c c call modval(a0,ca,ia,nin,n,x,f); c c input: c c a0 = intercept c ca(nx) = compressed coefficient values for a solution c ia(nx) = pointers to compressed coefficients c nin = number of compressed coefficients for solution c n = number of predictor vectors (observations) c x(n,ni) = full (uncompressed) predictor matrix c c output: c c f(n) = model predictions c c c evaluate linear model from compressed coefficients and c compressed predictor matrix: c c call cmodval(a0,ca,ia,nin,x,ix,jx,n,f); c c input: c c a0 = intercept c ca(nx) = compressed coefficient values for a solution c ia(nx) = pointers to compressed coefficients c nin = number of compressed coefficients for solution c x, ix, jx = predictor matrix in compressed sparse row format c n = number of predictor vectors (observations) c c output: c c f(n) = model predictions c c c c c Multiple response c elastic net with squared-error loss c c dense predictor matrix: c c call multelnet(parm,no,ni,nr,x,y,w,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr,isd, c jsd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) c c x(no,ni) = predictor data matrix flat file (overwritten) c c c sparse predictor matrix: c c call multspelnet(parm,no,ni,nr,x,ix,jx,y,w,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr, c isd,jsd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) c c x, ix, jx = predictor data matrix in compressed sparse row format c c other inputs: c c nr = number of response variables c y(no,nr) = response data matrix (overwritten) c jsd = response variable standardization flag c jsd = 0 => regression using original response variables c jsd = 1 => regression using standardized response variables c Note: output solutions always reference original c variables locations and scales. c all other inputs same as elnet/spelnet above c c output: c c a0(nr,lmu) = intercept values for each solution c ca(nx,nr,lmu) = compressed coefficient values for each solution c all other outputs same as elnet/spelnet above c (jerr = 90000 => bounds adjustment non convergence) c c c c multiple response least-squares utility routines: c c c uncompress coefficient matrix for all solutions: c c call multsolns(ni,nx,nr,lmu,ca,ia,nin,b) c c input: c c ni,nx,nr = input to multelnet c lmu,ca,ia,nin = output from multelnet c c output: c c b(ni,nr,lmu) = all multelnet returned solutions in uncompressed format c c c uncompress coefficient matrix for particular solution: c c call multuncomp(ni,nr,nx,ca,ia,nin,a) c c input: c c ni,nr,nx = input to multelnet c ca(nx,nr) = compressed coefficient values for the solution c ia(nx) = pointers to compressed coefficients c nin = number of compressed coefficients for the solution c c output: c c a(ni,nr) = uncompressed coefficient matrix c referencing original variables c c c evaluate linear model from compressed coefficients and c uncompressed predictor matrix: c c call multmodval(nx,nr,a0,ca,ia,nin,n,x,f); c c input: c c nx,nr = input to multelnet c a0(nr) = intercepts c ca(nx,nr) = compressed coefficient values for a solution c ia(nx) = pointers to compressed coefficients c nin = number of compressed coefficients for solution c n = number of predictor vectors (observations) c x(n,ni) = full (uncompressed) predictor matrix c c output: c c f(nr,n) = model predictions c c c evaluate linear model from compressed coefficients and c compressed predictor matrix: c c call multcmodval(nx,nr,a0,ca,ia,nin,x,ix,jx,n,f); c c input: c c nx,nr = input to multelnet c a0(nr) = intercepts c ca(nx,nr) = compressed coefficient values for a solution c ia(nx) = pointers to compressed coefficients c nin = number of compressed coefficients for solution c x, ix, jx = predictor matrix in compressed sparse row format c n = number of predictor vectors (observations) c c output: c c f(nr,n) = model predictions c c c c c Symmetric binomial/multinomial logistic elastic net c c c dense predictor matrix: c c call lognet (parm,no,ni,nc,x,y,o,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr,isd, c intr,maxit,kopt,lmu,a0,ca,ia,nin,dev0,fdev,alm,nlp,jerr) c c x(no,ni) = predictor data matrix flat file (overwritten) c c c sparse predictor matrix: c c call splognet (parm,no,ni,nc,x,ix,jx,y,o,jd,vp,cl,ne,nx,nlam,flmin, c ulam,thr,isd,intr,maxit,kopt,lmu,a0,ca,ia,nin,dev0,fdev,alm,nlp,jerr) c c x, ix, jx = predictor data matrix in compressed sparse row format c c c other inputs: c c parm,no,ni,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr,isd,intr,maxit c = same as elnet above. c c nc = number of classes (distinct outcome values) c nc=1 => binomial two-class logistic regression c (all output references class 1) c y(no,max(2,nc)) = number of each class at each design point c entries may have fractional values or all be zero (overwritten) c o(no,nc) = observation off-sets for each class c kopt = optimization flag c kopt = 0 => Newton-Raphson (recommended) c kpot = 1 => modified Newton-Raphson (sometimes faster) c kpot = 2 => nonzero coefficients same for each class (nc > 1) c c c output: c c lmu,ia,nin,alm,nlp = same as elent above c c a0(nc,lmu) = intercept values for each class at each solution c ca(nx,nc,lmu) = compressed coefficient values for each class at c each solution c dev0 = null deviance (intercept only model) c fdev(lmu) = fraction of devience explained by each solution c jerr = error flag c jerr = 0 => no error c jerr > 0 => fatal error - no output returned c jerr < 7777 => memory allocation error c jerr = 7777 => all used predictors have zero variance c jerr = 8000 + k => null probability < 1.0e-5 for class k c jerr = 9000 + k => null probability for class k c > 1.0 - 1.0e-5 c jerr = 10000 => maxval(vp) <= 0.0 c jerr = 90000 => bounds adjustment non convergence C jerr < 0 => non fatal error - partial output: c Solutions for larger lamdas (1:(k-1)) returned. c jerr = -k => convergence for kth lamda value not reached c after maxit (see above) iterations. c jerr = -10000-k => number of non zero coefficients along path c exceeds nx (see above) at kth lamda value. c jerr = -20000-k => max(p*(1-p)) < 1.0e-6 at kth lamda value. c o(no,nc) = training data values for last (lmu_th) solution linear c combination. c c c c logistic/multinomial utilitity routines: c c c uncompress coefficient vectors for all solutions: c c call lsolns(ni,nx,nc,lmu,ca,ia,nin,b) c c input: c c ni,nx,nc = input to lognet c lmu,ca,ia,nin = output from lognet c c output: c c b(ni,nc,lmu) = all lognet returned solutions in uncompressed format c c c uncompress coefficient vector for particular solution: c c call luncomp(ni,nx,nc,ca,ia,nin,a) c c input: c c ni, nx, nc = same as above c ca(nx,nc) = compressed coefficient values (for each class) c ia(nx) = pointers to compressed coefficients c nin = number of compressed coefficients c c output: c c a(ni,nc) = uncompressed coefficient vectors c referencing original variables c c c evaluate linear model from compressed coefficients and c uncompressed predictor vectors: c c call lmodval(nt,x,nc,nx,a0,ca,ia,nin,ans); c c input: c c nt = number of observations c x(nt,ni) = full (uncompressed) predictor vectors c nc, nx = same as above c a0(nc) = intercepts c ca(nx,nc) = compressed coefficient values (for each class) c ia(nx) = pointers to compressed coefficients c nin = number of compressed coefficients c c output: c c ans(nc,nt) = model predictions c c c evaluate linear model from compressed coefficients and c compressed predictor matrix: c c call lcmodval(nc,nx,a0,ca,ia,nin,x,ix,jx,n,f); c c input: c c nc, nx = same as above c a0(nc) = intercept c ca(nx,nc) = compressed coefficient values for a solution c ia(nx) = pointers to compressed coefficients c nin = number of compressed coefficients for solution c x, ix, jx = predictor matrix in compressed sparse row format c n = number of predictor vectors (observations) c c output: c c f(nc,n) = model predictions c c c c c Poisson elastic net c c c dense predictor matrix: c c call fishnet (parm,no,ni,x,y,o,w,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr, c isd,intr,maxit,lmu,a0,ca,ia,nin,dev0,fdev,alm,nlp,jerr) c c x(no,ni) = predictor data matrix flat file (overwritten) c c sparse predictor matrix: c c call spfishnet (parm,no,ni,x,ix,jx,y,o,w,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr, c isd,intr,maxit,lmu,a0,ca,ia,nin,dev0,fdev,alm,nlp,jerr) c c x, ix, jx = predictor data matrix in compressed sparse row format c c other inputs: c c y(no) = observation response counts c o(no) = observation off-sets c parm,no,ni,w,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr,isd,intr,maxit c = same as elnet above c c output: c c lmu,a0,ca,ia,nin,alm = same as elnet above c dev0,fdev = same as lognet above c nlp = total number of passes over predictor variables c jerr = error flag c jerr = 0 => no error c jerr > 0 => fatal error - no output returned c jerr < 7777 => memory allocation error c jerr = 7777 => all used predictors have zero variance c jerr = 8888 => negative response count y values c jerr = 9999 => no positive observations weights c jerr = 10000 => maxval(vp) <= 0.0 C jerr < 0 => non fatal error - partial output: c Solutions for larger lamdas (1:(k-1)) returned. c jerr = -k => convergence for kth lamda value not reached c after maxit (see above) iterations. c jerr = -10000-k => number of non zero coefficients along path c exceeds nx (see above) at kth lamda value. c o(no) = training data values for last (lmu_th) solution linear c combination. c c c Poisson utility routines: c c c same as elnet above: c c call solns(ni,nx,lmu,ca,ia,nin,b) c call uncomp(ni,ca,ia,nin,a) c call modval(a0,ca,ia,nin,n,x,f); c call cmodval(a0,ca,ia,nin,x,ix,jx,n,f); c c compute deviance for given uncompressed data and set of uncompressed c solutions c c call deviance(no,ni,x,y,o,w,nsol,a0,a,flog,jerr) c c input: c c no = number of observations c ni = number of predictor variables c x(no,ni) = predictor data matrix flat file c y(no) = observation response counts c o(no) = observation off-sets c w(no)= observation weights c nsol = number of solutions c a0(nsol) = intercept for each solution c a(ni,nsol) = solution coefficient vectors (uncompressed) c c output: c c flog(nsol) = respective deviance values minus null deviance c jerr = error flag - see above c c c compute deviance for given compressed data and set of uncompressed solutions c c call spdeviance(no,ni,x,ix,jx,y,o,w,nsol,a0,a,flog,jerr) c c input: c c no = number of observations c ni = number of predictor variables c x, ix, jx = predictor data matrix in compressed sparse row format c y(no) = observation response counts c o(no) = observation off-sets c w(no)= observation weights c nsol = number of solutions c a0(nsol) = intercept for each solution c a(ni,nsol) = solution coefficient vectors (uncompressed) c c output c c flog(nsol) = respective deviance values minus null deviance c jerr = error flag - see above c c c compute deviance for given compressed data and compressed solutions c c call cspdeviance(no,x,ix,jx,y,o,w,nx,lmu,a0,ca,ia,nin,flog,jerr) c c input: c c no = number of observations c x, ix, jx = predictor data matrix in compressed sparse row format c y(no) = observation response counts c o(no) = observation off-sets c w(no)= observation weights c nx = input to spfishnet c lmu,a0(lmu),ca(nx,lmu),ia(nx),nin(lmu) = output from spfishnet c c output c c flog(lmu) = respective deviance values minus null deviance c jerr = error flag - see above c c c c Elastic net with Cox proportional hazards model c c c dense predictor matrix: c c call coxnet (parm,no,ni,x,y,d,o,w,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr, c maxit,isd,lmu,ca,ia,nin,dev0,fdev,alm,nlp,jerr) c c input: c c x(no,ni) = predictor data matrix flat file (overwritten) c y(no) = observation times c d(no) = died/censored indicator c d(i)=0.0 => y(i) = censoring time c d(i)=1.0 => y(i) = death time c o(no) = observation off-sets c parm,no,ni,w,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr,maxit c = same as fishnet above c c output: c c lmu,ca,ia,nin,dev0,fdev,alm,nlp = same as fishnet above c jerr = error flag c jerr = 0 => no error - output returned c jerr > 0 => fatal error - no output returned c jerr < 7777 => memory allocation error c jerr = 7777 => all used predictors have zero variance c jerr = 8888 => all observations censored (d(i)=0.0) c jerr = 9999 => no positive observations weights c jerr = 10000 => maxval(vp) <= 0.0 c jerr = 20000, 30000 => initialization numerical error C jerr < 0 => non fatal error - partial output: c Solutions for larger lamdas (1:(k-1)) returned. c jerr = -k => convergence for kth lamda value not reached c after maxit (see above) iterations. c jerr = -10000-k => number of non zero coefficients along path c exceeds nx (see above) at kth lamda value. c jerr = -30000-k => numerical error at kth lambda value c o(no) = training data values for last (lmu_th) solution linear c combination. c c c c coxnet utility routines: c c c same as elnet above: c c call solns(ni,nx,lmu,ca,ia,nin,b) c call uncomp(ni,ca,ia,nin,a) c c c evaluate linear model from compressed coefficients and c uncompressed predictor matrix: c c call cxmodval(ca,ia,nin,n,x,f); c c input: c c ca(nx) = compressed coefficient values for a solution c ia(nx) = pointers to compressed coefficients c nin = number of compressed coefficients for solution c n = number of predictor vectors (observations) c x(n,ni) = full (uncompressed) predictor matrix c c output: c c f(n) = model predictions c c c compute log-likelihood for given data set and vectors of coefficients c c call loglike(no,ni,x,y,d,o,w,nvec,a,flog,jerr) c c input: c c no = number of observations c ni = number of predictor variables c x(no,ni) = predictor data matrix flat file c y(no) = observation times c d(no) = died/censored indicator c d(i)=0.0 => y(i) = censoring time c d(i)=1.0 => y(i) = death time c o(no) = observation off-sets c w(no)= observation weights c nvec = number of coefficient vectors c a(ni,nvec) = coefficient vectors (uncompressed) c c output c c flog(nvec) = respective log-likelihood values c jerr = error flag - see coxnet above c c c c c Changing internal parameter values c c c call chg_fract_dev(fdev) c fdev = minimum fractional change in deviance for stopping path c default = 1.0e-5 c c call chg_dev_max(devmax) c devmax = maximum fraction of explained deviance for stopping path c default = 0.999 c c call chg_min_flmin(eps) c eps = minimum value of flmin (see above). default= 1.0e-6 c c call chg_big(big) c big = large floating point number. default = 9.9e35 c c call chg_min_lambdas(mnlam) c mnlam = minimum number of path points (lambda values) allowed c default = 5 c c call chg_min_null_prob(pmin) c pmin = minimum null probability for any class. default = 1.0e-9 c c call chg _max_exp(exmx) c exmx = maximum allowed exponent. default = 250.0 c c call chg_bnorm(prec,mxit) c prec = convergence threshold for multi response bounds adjustment c solution. default = 1.0e-10. c mxit = maximum iterations for multiresponse bounds adjustment solution c default = 100. c c c Obtain current internal parameter values c c call get_int_parms(fdev,eps,big,mnlam,devmax,pmin,exmx,itrace) c call get_bnorm(prec,mxit); c c c " subroutine get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx,itrace); implicit double precision(a-h,o-z); data sml0,eps0,big0,mnlam0,rsqmax0,pmin0,exmx0,itrace0 /1.0d-5,1.0d-6,9.9d35,5,0.999,1.0d-9,250.0,0/; sml=sml0; eps=eps0; big=big0; mnlam=mnlam0; rsqmax=rsqmax0; pmin=pmin0; exmx=exmx0; itrace=itrace0; return; entry chg_fract_dev(arg); sml0=arg; return; entry chg_dev_max(arg); rsqmax0=arg; return; entry chg_min_flmin(arg); eps0=arg; return; entry chg_big(arg); big0=arg; return; entry chg_min_lambdas(irg); mnlam0=irg; return; entry chg_min_null_prob(arg); pmin0=arg; return; entry chg_max_exp(arg); exmx0=arg; return; entry chg_itrace(irg); itrace0=irg; return; end; subroutine elnet(ka,parm,no,ni,x,y,w,jd,vp,cl,ne,nx,nlam, flmin,ulam,thr,isd,intr,maxit, lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr); implicit double precision(a-h,o-z); double precision x(no,ni),y(no),w(no),vp(ni),ca(nx,nlam),cl(2,ni); double precision ulam(nlam),a0(nlam),rsq(nlam),alm(nlam); integer jd(*),ia(nx),nin(nlam); %fortran double precision, dimension (:), allocatable :: vq; %mortran if maxval(vp).le.0.0 < jerr=10000; return;> allocate(vq(1:ni),stat=jerr); if(jerr.ne.0) return; vq=max(0d0,vp); vq=vq*ni/sum(vq); if ka.eq.1 < call elnetu (parm,no,ni,x,y,w,jd,vq,cl,ne,nx,nlam,flmin,ulam,thr,isd,intr,maxit, lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr); > else < call elnetn (parm,no,ni,x,y,w,jd,vq,cl,ne,nx,nlam,flmin,ulam,thr,isd,intr,maxit, lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr); > deallocate(vq); return; end; subroutine elnetu(parm,no,ni,x,y,w,jd,vp,cl,ne,nx,nlam, flmin,ulam,thr,isd,intr,maxit, lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr); implicit double precision(a-h,o-z); double precision x(no,ni),y(no),w(no),vp(ni),ulam(nlam),cl(2,ni); double precision ca(nx,nlam),a0(nlam),rsq(nlam),alm(nlam); integer jd(*),ia(nx),nin(nlam); %fortran double precision, dimension (:), allocatable :: xm,xs,g,xv,vlam integer, dimension (:), allocatable :: ju %mortran allocate(g(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(xm(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(xs(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(ju(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(xv(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(vlam(1:nlam),stat=jerr); if(jerr.ne.0) return; call chkvars(no,ni,x,ju); if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0; if maxval(ju).le.0 < jerr=7777; return;> call standard(no,ni,x,y,w,isd,intr,ju,g,xm,xs,ym,ys,xv,jerr); if(jerr.ne.0) return; cl=cl/ys; if isd.gt.0 < > if(flmin.ge.1.0) vlam=ulam/ys; call elnet1(parm,ni,ju,vp,cl,g,no,ne,nx,x,nlam,flmin,vlam,thr,maxit,xv, lmu,ca,ia,nin,rsq,alm,nlp,jerr); if(jerr.gt.0) return; a0(k)=0.0; if(intr.ne.0) a0(k)=ym-dot_product(ca(1:nk,k),xm(ia(1:nk))); > deallocate(xm,xs,g,ju,xv,vlam); return; end; subroutine standard(no,ni,x,y,w,isd,intr,ju,g,xm,xs,ym,ys,xv,jerr); implicit double precision(a-h,o-z); double precision x(no,ni),y(no),w(no),g(ni),xm(ni),xs(ni),xv(ni); integer ju(ni); %fortran double precision, dimension (:), allocatable :: v %mortran allocate(v(1:no),stat=jerr); if(jerr.ne.0) return; w=w/sum(w); v=sqrt(w); if intr.eq.0 < ym=0.0; y=v*y; ys=sqrt(dot_product(y,y)-dot_product(v,y)**2); y=y/ys; else < xs(j)=1.0;> > > else < if isd.eq.0 < xs=1.0;> else < xv=1.0; > ym=dot_product(w,y); y=v*(y-ym); ys=sqrt(dot_product(y,y)); y=y/ys; > g=0.0; deallocate(v); return; end; subroutine elnet1(beta,ni,ju,vp,cl,g,no,ne,nx,x,nlam,flmin,ulam,thr,maxit,xv, lmu,ao,ia,kin,rsqo,almo,nlp,jerr); implicit double precision(a-h,o-z); double precision vp(ni),g(ni),x(no,ni),ulam(nlam),ao(nx,nlam); double precision rsqo(nlam),almo(nlam),xv(ni); double precision cl(2,ni); integer ju(ni),ia(nx),kin(nlam); %fortran double precision, dimension (:), allocatable :: a,da integer, dimension (:), allocatable :: mm double precision, dimension (:,:), allocatable :: c allocate(c(1:ni,1:nx),stat=jerr) if(jerr.ne.0) return; %mortran call get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx,itrace); allocate(a(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(mm(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(da(1:ni),stat=jerr); if(jerr.ne.0) return; bta=beta; omb=1.0-bta; "Begin: added by Naras" alm=0.0; alf=1.0; "End: added by Naras" if flmin.lt.1.0 < eqs=max(eps,flmin); alf=eqs**(1.0/(nlam-1));> rsq=0.0; a=0.0; mm=0; /nlp,nin/=0; iz=0; mnl=min(mnlam,nlam); elseif m.gt.2 < alm=alm*alf;> elseif m.eq.1 < alm=big;> else < alm=0.0; alm=alf*alm/max(bta,1.0d-3); > dem=alm*omb; ab=alm*bta; rsq0=rsq; jz=1; loop < if(iz*jz.ne.0) go to :b:; nlp=nlp+1; dlx=0.0; if j.eq.k < c(j,nin)=xv(j); next;> c(j,nin)=dot_product(x(:,j),x(:,k)); > mm(k)=nin; ia(nin)=k; > del=a(k)-ak; rsq=rsq+del*(2.0*g(k)-del*xv(k)); dlx=max(xv(k)*del**2,dlx); > if(dlx.lt.thr) exit; if(nin.gt.nx) exit; if nlp.gt.maxit < jerr=-m; return;> :b: iz=1; da(1:nin)=a(ia(1:nin)); loop < nlp=nlp+1; dlx=0.0; > if(dlx.lt.thr) exit; if nlp.gt.maxit < jerr=-m; return;> > da(1:nin)=a(ia(1:nin))-da(1:nin); jz=0; > if nin.gt.nx < jerr=-10000-m; exit;> if(nin.gt.0) ao(1:nin,m)=a(ia(1:nin)); kin(m)=nin; rsqo(m)=rsq; almo(m)=alm; lmu=m; if(m.lt.mnl) next; if(flmin.ge.1.0) next; me=0; if(me.gt.ne) exit; if(rsq-rsq0.lt.sml*rsq) exit; if(rsq.gt.rsqmax) exit; > deallocate(a,mm,c,da); return; end; subroutine elnetn(parm,no,ni,x,y,w,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr,isd, intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr); implicit double precision(a-h,o-z); double precision vp(ni),x(no,ni),y(no),w(no),ulam(nlam),cl(2,ni); double precision ca(nx,nlam),a0(nlam),rsq(nlam),alm(nlam); integer jd(*),ia(nx),nin(nlam); %fortran double precision, dimension (:), allocatable :: xm,xs,xv,vlam integer, dimension (:), allocatable :: ju %mortran allocate(xm(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(xs(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(ju(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(xv(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(vlam(1:nlam),stat=jerr); if(jerr.ne.0) return; call chkvars(no,ni,x,ju); if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0; if maxval(ju).le.0 < jerr=7777; return;> call standard1(no,ni,x,y,w,isd,intr,ju,xm,xs,ym,ys,xv,jerr); if(jerr.ne.0) return; cl=cl/ys; if isd.gt.0 < > if(flmin.ge.1.0) vlam=ulam/ys; call elnet2(parm,ni,ju,vp,cl,y,no,ne,nx,x,nlam,flmin,vlam,thr,maxit,xv, lmu,ca,ia,nin,rsq,alm,nlp,jerr); if(jerr.gt.0) return; a0(k)=0.0; if(intr.ne.0) a0(k)=ym-dot_product(ca(1:nk,k),xm(ia(1:nk))); > deallocate(xm,xs,ju,xv,vlam); return; end; subroutine standard1(no,ni,x,y,w,isd,intr,ju,xm,xs,ym,ys,xv,jerr); implicit double precision(a-h,o-z); double precision x(no,ni),y(no),w(no),xm(ni),xs(ni),xv(ni); integer ju(ni); %fortran double precision, dimension (:), allocatable :: v %mortran allocate(v(1:no),stat=jerr); if(jerr.ne.0) return; w=w/sum(w); v=sqrt(w); if intr.eq.0 < ym=0.0; y=v*y; ys=sqrt(dot_product(y,y)-dot_product(v,y)**2); y=y/ys; else < xs(j)=1.0;> > go to :out:; > if isd.eq.0 < xs=1.0;> else < xv=1.0; > ym=dot_product(w,y); y=v*(y-ym); ys=sqrt(dot_product(y,y)); y=y/ys; :out:deallocate(v); return; end; subroutine elnet2(beta,ni,ju,vp,cl,y,no,ne,nx,x,nlam,flmin,ulam,thr,maxit,xv, lmu,ao,ia,kin,rsqo,almo,nlp,jerr); implicit double precision(a-h,o-z); double precision vp(ni),y(no),x(no,ni),ulam(nlam),ao(nx,nlam); double precision rsqo(nlam),almo(nlam),xv(ni); double precision cl(2,ni); integer ju(ni),ia(nx),kin(nlam); %fortran double precision, dimension (:), allocatable :: a,g integer, dimension (:), allocatable :: mm,ix %mortran call get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx,itrace); allocate(a(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(mm(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(g(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(ix(1:ni),stat=jerr); if(jerr.ne.0) return; bta=beta; omb=1.0-bta; ix=0; "Begin: added by Naras" alf=1.0; "End: added by Naras" if flmin.lt.1.0 < eqs=max(eps,flmin); alf=eqs**(1.0/(nlam-1));> rsq=0.0; a=0.0; mm=0; /nlp,nin/=0; iz=0; mnl=min(mnlam,nlam); alm=0.0; elseif m.gt.2 < alm=alm*alf;> elseif m.eq.1 < alm=big;> else < alm0=0.0; alm0=alm0/max(bta,1.0d-3); alm=alf*alm0; > dem=alm*omb; ab=alm*bta; rsq0=rsq; jz=1; tlam=bta*(2.0*alm-alm0); loop < if(iz*jz.ne.0) go to :b:; :again:nlp=nlp+1; dlx=0.0; del=a(k)-ak; rsq=rsq+del*(2.0*gk-del*xv(k)); y=y-del*x(:,k); dlx=max(xv(k)*del**2,dlx); > if(nin.gt.nx) exit; if dlx.lt.thr < ixx=0; > if(ixx.eq.1) go to :again:; exit; > if nlp.gt.maxit < jerr=-m; return;> :b: iz=1; loop < nlp=nlp+1; dlx=0.0; if(dlx.lt.thr) exit; if nlp.gt.maxit < jerr=-m; return;> > jz=0; > if nin.gt.nx < jerr=-10000-m; exit;> if(nin.gt.0) ao(1:nin,m)=a(ia(1:nin)); kin(m)=nin; rsqo(m)=rsq; almo(m)=alm; lmu=m; if(m.lt.mnl) next; if(flmin.ge.1.0) next; me=0; if(me.gt.ne) exit; if(rsq-rsq0.lt.sml*rsq) exit; if(rsq.gt.rsqmax) exit; > deallocate(a,mm,g,ix); return; end; subroutine chkvars(no,ni,x,ju); implicit double precision(a-h,o-z); double precision x(no,ni); integer ju(ni); > return; end; subroutine uncomp(ni,ca,ia,nin,a); implicit double precision(a-h,o-z); double precision ca(*),a(ni); integer ia(*); a=0.0; if(nin.gt.0) a(ia(1:nin))=ca(1:nin); return; end; subroutine modval(a0,ca,ia,nin,n,x,f); implicit double precision(a-h,o-z); double precision ca(nin),x(n,*),f(n); integer ia(nin); f=a0; if(nin.le.0) return; return; end; subroutine spelnet(ka,parm,no,ni,x,ix,jx,y,w,jd,vp,cl,ne,nx,nlam, flmin,ulam,thr,isd,intr, maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr); implicit double precision(a-h,o-z); double precision x(*),y(no),w(no),vp(ni),ulam(nlam),cl(2,ni); double precision ca(nx,nlam),a0(nlam),rsq(nlam),alm(nlam); integer ix(*),jx(*),jd(*),ia(nx),nin(nlam); %fortran double precision, dimension (:), allocatable :: vq; %mortran if maxval(vp).le.0.0 < jerr=10000; return;> allocate(vq(1:ni),stat=jerr); if(jerr.ne.0) return; vq=max(0d0,vp); vq=vq*ni/sum(vq); if ka.eq.1 < call spelnetu (parm,no,ni,x,ix,jx,y,w,jd,vq,cl,ne,nx,nlam,flmin,ulam,thr,isd, intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr); > else < call spelnetn (parm,no,ni,x,ix,jx,y,w,jd,vq,cl,ne,nx,nlam,flmin,ulam,thr,isd,intr, maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr); > deallocate(vq); return; end; subroutine spelnetu(parm,no,ni,x,ix,jx,y,w,jd,vp,cl,ne,nx,nlam, flmin,ulam,thr,isd,intr, maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr); implicit double precision(a-h,o-z); double precision x(*),y(no),w(no),vp(ni),ulam(nlam),cl(2,ni); double precision ca(nx,nlam),a0(nlam),rsq(nlam),alm(nlam); integer ix(*),jx(*),jd(*),ia(nx),nin(nlam); %fortran double precision, dimension (:), allocatable :: xm,xs,g,xv,vlam integer, dimension (:), allocatable :: ju %mortran allocate(g(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(xm(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(xs(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(ju(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(xv(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(vlam(1:nlam),stat=jerr); if(jerr.ne.0) return; call spchkvars(no,ni,x,ix,ju); if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0; if maxval(ju).le.0 < jerr=7777; return;> call spstandard(no,ni,x,ix,jx,y,w,ju,isd,intr,g,xm,xs,ym,ys,xv,jerr); if(jerr.ne.0) return; cl=cl/ys; if isd.gt.0 < > if(flmin.ge.1.0) vlam=ulam/ys; call spelnet1(parm,ni,g,no,w,ne,nx,x,ix,jx,ju,vp,cl,nlam,flmin,vlam,thr,maxit, xm,xs,xv,lmu,ca,ia,nin,rsq,alm,nlp,jerr); if(jerr.gt.0) return; a0(k)=0.0; if(intr.ne.0) a0(k)=ym-dot_product(ca(1:nk,k),xm(ia(1:nk))); > deallocate(xm,xs,g,ju,xv,vlam); return; end; subroutine spstandard(no,ni,x,ix,jx,y,w,ju,isd,intr,g,xm,xs,ym,ys,xv,jerr); implicit double precision(a-h,o-z); double precision x(*),y(no),w(no),g(ni),xm(ni),xs(ni),xv(ni); integer ix(*),jx(*),ju(ni); "Start: Naras Edit" jerr = jerr*1; "End: Naras Edit" w=w/sum(w); if intr.eq.0 < ym=0.0; ys=sqrt(dot_product(w,y**2)-dot_product(w,y)**2); y=y/ys; else < xs(j)=1.0;> > > else < if isd.eq.0 < xs=1.0;> else < xv=1.0;> ym=dot_product(w,y); y=y-ym; ys=sqrt(dot_product(w,y**2)); y=y/ys; > g=0.0; return; end; subroutine spelnet1(beta,ni,g,no,w,ne,nx,x,ix,jx,ju,vp,cl,nlam,flmin,ulam, thr,maxit,xm,xs,xv,lmu,ao,ia,kin,rsqo,almo,nlp,jerr); implicit double precision(a-h,o-z); double precision g(ni),vp(ni),x(*),ulam(nlam),w(no); double precision ao(nx,nlam),rsqo(nlam),almo(nlam); double precision xm(ni),xs(ni),xv(ni),cl(2,ni); integer ix(*),jx(*),ju(ni),ia(nx),kin(nlam); %fortran double precision, dimension (:), allocatable :: a,da integer, dimension (:), allocatable :: mm double precision, dimension (:,:), allocatable :: c allocate(c(1:ni,1:nx),stat=jerr) if(jerr.ne.0) return; %mortran call get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx,itrace); allocate(a(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(mm(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(da(1:ni),stat=jerr); if(jerr.ne.0) return; bta=beta; omb=1.0-bta; "Begin: added by Naras" alm=0.0; alf=1.0; "End: added by Naras" if flmin.lt.1.0 < eqs=max(eps,flmin); alf=eqs**(1.0/(nlam-1));> rsq=0.0; a=0.0; mm=0; /nlp,nin/=0; iz=0; mnl=min(mnlam,nlam); elseif m.gt.2 < alm=alm*alf;> elseif m.eq.1 < alm=big;> else < alm=0.0; alm=alf*alm/max(bta,1.0d-3); > dem=alm*omb; ab=alm*bta; rsq0=rsq; jz=1; loop < if(iz*jz.ne.0) go to :b:; nlp=nlp+1; dlx=0.0; if j.eq.k < c(j,nin)=xv(j); next;> c(j,nin)= (row_prod(j,k,ix,jx,x,w)-xm(j)*xm(k))/(xs(j)*xs(k)); > mm(k)=nin; ia(nin)=k; > del=a(k)-ak; rsq=rsq+del*(2.0*g(k)-del*xv(k)); dlx=max(xv(k)*del**2,dlx); > if(dlx.lt.thr) exit; if(nin.gt.nx) exit; if nlp.gt.maxit < jerr=-m; return;> :b: iz=1; da(1:nin)=a(ia(1:nin)); loop < nlp=nlp+1; dlx=0.0; > if(dlx.lt.thr) exit; if nlp.gt.maxit < jerr=-m; return;> > da(1:nin)=a(ia(1:nin))-da(1:nin); jz=0; > if nin.gt.nx < jerr=-10000-m; exit;> if(nin.gt.0) ao(1:nin,m)=a(ia(1:nin)); kin(m)=nin; rsqo(m)=rsq; almo(m)=alm; lmu=m; if(m.lt.mnl) next; if(flmin.ge.1.0) next; me=0; if(me.gt.ne) exit; if(rsq-rsq0.lt.sml*rsq) exit; if(rsq.gt.rsqmax) exit; > deallocate(a,mm,c,da); return; end; subroutine spelnetn(parm,no,ni,x,ix,jx,y,w,jd,vp,cl,ne,nx,nlam,flmin,ulam, thr,isd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr); implicit double precision(a-h,o-z); double precision x(*),vp(ni),y(no),w(no),ulam(nlam),cl(2,ni); double precision ca(nx,nlam),a0(nlam),rsq(nlam),alm(nlam); integer ix(*),jx(*),jd(*),ia(nx),nin(nlam); %fortran double precision, dimension (:), allocatable :: xm,xs,xv,vlam integer, dimension (:), allocatable :: ju %mortran allocate(xm(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(xs(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(ju(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(xv(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(vlam(1:nlam),stat=jerr); if(jerr.ne.0) return; call spchkvars(no,ni,x,ix,ju); if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0; if maxval(ju).le.0 < jerr=7777; return;> call spstandard1(no,ni,x,ix,jx,y,w,ju,isd,intr,xm,xs,ym,ys,xv,jerr); if(jerr.ne.0) return; cl=cl/ys; if isd.gt.0 < > if(flmin.ge.1.0) vlam=ulam/ys; call spelnet2(parm,ni,y,w,no,ne,nx,x,ix,jx,ju,vp,cl,nlam,flmin,vlam,thr,maxit, xm,xs,xv,lmu,ca,ia,nin,rsq,alm,nlp,jerr); if(jerr.gt.0) return; a0(k)=0.0; if(intr.ne.0) a0(k)=ym-dot_product(ca(1:nk,k),xm(ia(1:nk))); > deallocate(xm,xs,ju,xv,vlam); return; end; subroutine spstandard1(no,ni,x,ix,jx,y,w,ju,isd,intr,xm,xs,ym,ys,xv,jerr); implicit double precision(a-h,o-z); double precision x(*),y(no),w(no),xm(ni),xs(ni),xv(ni); integer ix(*),jx(*),ju(ni); "Start: Naras Edit" jerr = jerr*1; "End: Naras Edit" w=w/sum(w); if intr.eq.0 < ym=0.0; ys=sqrt(dot_product(w,y**2)-dot_product(w,y)**2); y=y/ys; else < xs(j)=1.0;> > return; > if isd.eq.0 < xs=1.0;> else < xv=1.0;> ym=dot_product(w,y); y=y-ym; ys=sqrt(dot_product(w,y**2)); y=y/ys; return; end; subroutine spelnet2(beta,ni,y,w,no,ne,nx,x,ix,jx,ju,vp,cl,nlam,flmin,ulam, thr,maxit,xm,xs,xv,lmu,ao,ia,kin,rsqo,almo,nlp,jerr); implicit double precision(a-h,o-z); double precision y(no),w(no),x(*),vp(ni),ulam(nlam),cl(2,ni); double precision ao(nx,nlam),rsqo(nlam),almo(nlam),xm(ni),xs(ni),xv(ni); integer ix(*),jx(*),ju(ni),ia(nx),kin(nlam); %fortran double precision, dimension (:), allocatable :: a,g integer, dimension (:), allocatable :: mm,iy %mortran call get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx,itrace); allocate(a(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(mm(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(g(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(iy(1:ni),stat=jerr); if(jerr.ne.0) return; bta=beta; omb=1.0-bta; alm=0.0; iy=0; "Begin: added by Naras" alf=1.0; "End: added by Naras" if flmin.lt.1.0 < eqs=max(eps,flmin); alf=eqs**(1.0/(nlam-1));> rsq=0.0; a=0.0; mm=0; o=0.0; /nlp,nin/=0; iz=0; mnl=min(mnlam,nlam); elseif m.gt.2 < alm=alm*alf;> elseif m.eq.1 < alm=big;> else < alm0=0.0; alm0=alm0/max(bta,1.0d-3); alm=alf*alm0; > dem=alm*omb; ab=alm*bta; rsq0=rsq; jz=1; tlam=bta*(2.0*alm-alm0); loop < if(iz*jz.ne.0) go to :b:; :again:nlp=nlp+1; dlx=0.0; del=a(k)-ak; rsq=rsq+del*(2.0*gk-del*xv(k)); y(jx(jb:je))=y(jx(jb:je))-del*x(jb:je)/xs(k); o=o+del*xm(k)/xs(k); dlx=max(xv(k)*del**2,dlx); > if(nin.gt.nx) exit; if dlx.lt.thr < ixx=0; > if(ixx.eq.1) go to :again:; exit; > if nlp.gt.maxit < jerr=-m; return;> :b: iz=1; loop < nlp=nlp+1; dlx=0.0; if(dlx.lt.thr) exit; if nlp.gt.maxit < jerr=-m; return;> > jz=0; > if nin.gt.nx < jerr=-10000-m; exit;> if(nin.gt.0) ao(1:nin,m)=a(ia(1:nin)); kin(m)=nin; rsqo(m)=rsq; almo(m)=alm; lmu=m; if(m.lt.mnl) next; if(flmin.ge.1.0) next; me=0; if(me.gt.ne) exit; if(rsq-rsq0.lt.sml*rsq) exit; if(rsq.gt.rsqmax) exit; > deallocate(a,mm,g,iy); return; end; subroutine spchkvars(no,ni,x,ix,ju); implicit double precision(a-h,o-z); double precision x(*); integer ix(*),ju(ni); > else < t=x(jb); > > return; end; subroutine cmodval(a0,ca,ia,nin,x,ix,jx,n,f); implicit double precision(a-h,o-z); double precision ca(*),x(*),f(n); integer ia(*),ix(*),jx(*); f=a0; return; end; function row_prod(i,j,ia,ja,ra,w); implicit double precision(a-h,o-z); integer ia(*),ja(*); double precision ra(*),w(*); row_prod=dot(ra(ia(i)),ra(ia(j)),ja(ia(i)),ja(ia(j)), ia(i+1)-ia(i),ia(j+1)-ia(j),w); return; end; function dot(x,y,mx,my,nx,ny,w); implicit double precision(a-h,o-z); double precision x(*),y(*),w(*); integer mx(*),my(*); /i,j/=1; s=0.0; loop < until mx(i).ge.my(j) < i=i+1; if(i.gt.nx) go to :done:;> if(mx(i).eq.my(j)) go to :equal:; until my(j).ge.mx(i) < j=j+1; if(j.gt.ny) go to :done:;> if(mx(i).eq.my(j)) go to :equal:; next; :equal:s=s+w(mx(i))*x(i)*y(j); i=i+1; if(i.gt.nx) exit; j=j+1; if(j.gt.ny) exit; > :done: dot=s; return; end; subroutine lognet(parm,no,ni,nc,x,y,g,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr, isd,intr,maxit,kopt,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,jerr); implicit double precision(a-h,o-z); double precision x(no,ni),y(no,max(2,nc)),g(no,nc),vp(ni),ulam(nlam); double precision ca(nx,nc,nlam),a0(nc,nlam),dev(nlam),alm(nlam),cl(2,ni); integer jd(*),ia(nx),nin(nlam); %fortran double precision, dimension (:), allocatable :: xm,xs,ww,vq,xv integer, dimension (:), allocatable :: ju %mortran if maxval(vp).le.0.0 < jerr=10000; return;> allocate(ww(1:no),stat=jerr); if(jerr.ne.0) return; allocate(ju(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(vq(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(xm(1:ni),stat=jerr); if(jerr.ne.0) return; if kopt.eq.2 < allocate(xv(1:ni),stat=jerr); if(jerr.ne.0) return;> if isd.gt.0 < allocate(xs(1:ni),stat=jerr); if(jerr.ne.0) return;> call chkvars(no,ni,x,ju); if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0; if maxval(ju).le.0 < jerr=7777; return;> vq=max(0d0,vp); vq=vq*ni/sum(vq); sw=sum(ww); ww=ww/sw; if nc.eq.1 < call lstandard1(no,ni,x,ww,ju,isd,intr,xm,xs); if isd.gt.0 < > call lognet2n(parm,no,ni,x,y(:,1),g(:,1),ww,ju,vq,cl,ne,nx,nlam,flmin,ulam, thr,isd,intr,maxit,kopt,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,jerr); > elseif kopt.eq.2 < call multlstandard1(no,ni,x,ww,ju,isd,intr,xm,xs,xv); if isd.gt.0 < > call multlognetn(parm,no,ni,nc,x,y,g,ww,ju,vq,cl,ne,nx,nlam,flmin,ulam,thr, intr,maxit,xv,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,jerr); > else < call lstandard1(no,ni,x,ww,ju,isd,intr,xm,xs); if isd.gt.0 < > call lognetn(parm,no,ni,nc,x,y,g,ww,ju,vq,cl,ne,nx,nlam,flmin,ulam,thr, isd,intr,maxit,kopt,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,jerr); > if(jerr.gt.0) return; dev0=2.0*sw*dev0; > if intr.eq.0 < a0(ic,k)=0.0;> else < a0(ic,k)=a0(ic,k)-dot_product(ca(1:nk,ic,k),xm(ia(1:nk)));> > > deallocate(ww,ju,vq,xm); if(isd.gt.0) deallocate(xs); if(kopt.eq.2) deallocate(xv); return; end; subroutine lstandard1(no,ni,x,w,ju,isd,intr,xm,xs); implicit double precision(a-h,o-z); double precision x(no,ni),w(no),xm(ni),xs(ni); integer ju(ni); if intr.eq.0 < > return; > > return; end; subroutine multlstandard1(no,ni,x,w,ju,isd,intr,xm,xs,xv); implicit double precision(a-h,o-z); double precision x(no,ni),w(no),xm(ni),xs(ni),xv(ni); integer ju(ni); if intr.eq.0 < > return; > > return; end; subroutine lognet2n(parm,no,ni,x,y,g,w,ju,vp,cl,ne,nx,nlam,flmin,ulam,shri, isd,intr,maxit,kopt,lmu,a0,a,m,kin,dev0,dev,alm,nlp,jerr); implicit double precision(a-h,o-z); double precision x(no,ni),y(no),g(no),w(no),vp(ni),ulam(nlam),cl(2,ni); double precision a(nx,nlam),a0(nlam),dev(nlam),alm(nlam); integer ju(ni),m(nx),kin(nlam); %fortran double precision, dimension (:), allocatable :: b,bs,v,r,xv,q,ga integer, dimension (:), allocatable :: mm,ixx %mortran call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx,itrace); allocate(b(0:ni),stat=jerr); if(jerr.ne.0) return; allocate(xv(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(ga(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(bs(0:ni),stat=jerr); if(jerr.ne.0) return; allocate(mm(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(ixx(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(r(1:no),stat=jerr); if(jerr.ne.0) return; allocate(v(1:no),stat=jerr); if(jerr.ne.0) return; allocate(q(1:no),stat=jerr); if(jerr.ne.0) return; fmax=log(1.0/pmin-1.0); fmin=-fmax; vmin=(1.0+pmin)*pmin*(1.0-pmin); bta=parm; omb=1.0-bta; q0=dot_product(w,y); if q0.le.pmin < jerr=8001; return;> if q0.ge.1.0-pmin < jerr=9001; return;> if(intr.eq.0.0) q0=0.5; ixx=0; al=0.0; bz=0.0; if(intr.ne.0) bz=log(q0/(1.0-q0)); if nonzero(no,g).eq.0 < vi=q0*(1.0-q0); b(0)=bz; v=vi*w; r=w*(y-q0); q=q0; xmz=vi; dev1=-(bz*q0+log(1.0-q0)); > else < b(0)=0.0; if intr.ne.0 < b(0)=azero(no,y,g,w,jerr); if(jerr.ne.0) return;> q=1.0/(1.0+exp(-b(0)-g)); v=w*q*(1.0-q); r=w*(y-q); xmz=sum(v); dev1=-(b(0)*q0+dot_product(w,y*g+log(1.0-q))); > if kopt.gt.0 < if isd.gt.0.and.intr.ne.0 < xv=0.25;> else < > > dev0=dev1; "Begin: added by Naras" alf=1.0; "End: added by Naras" if flmin.lt.1.0 < eqs=max(eps,flmin); alf=eqs**(1.0/(nlam-1));> m=0; mm=0; /nlp,nin/=0; mnl=min(mnlam,nlam); bs=0.0; b(1:ni)=0.0; shr=shri*dev0; elseif ilm.gt.2 < al=al*alf;> elseif ilm.eq.1 < al=big;> else < al0=0.0; al0=al0/max(bta,1.0d-3); al=alf*al0; > al2=al*omb; al1=al*bta; tlam=bta*(2.0*al-al0); :again:continue; loop < bs(0)=b(0); if(nin.gt.0) bs(m(1:nin))=b(m(1:nin)); if kopt.eq.0 < > loop < nlp=nlp+1; dlx=0.0; else < b(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(xv(k)+vp(k)*al2))); > d=b(k)-bk; if(abs(d).le.0.0) next; dlx=max(dlx,xv(k)*d**2); r=r-d*v*x(:,k); if mm(k).eq.0 < nin=nin+1; if(nin.gt.nx) exit; mm(k)=nin; m(nin)=k; > > if(nin.gt.nx) exit; d=0.0; if(intr.ne.0) d=sum(r)/xmz; if d.ne.0.0 < b(0)=b(0)+d; dlx=max(dlx,xmz*d**2); r=r-d*v;> if(dlx.lt.shr) exit; if nlp.gt.maxit < jerr=-ilm; return;> loop < nlp=nlp+1; dlx=0.0; else < b(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(xv(k)+vp(k)*al2))); > d=b(k)-bk; if(abs(d).le.0.0) next; dlx=max(dlx,xv(k)*d**2); r=r-d*v*x(:,k); > d=0.0; if(intr.ne.0) d=sum(r)/xmz; if d.ne.0.0 < b(0)=b(0)+d; dlx=max(dlx,xmz*d**2); r=r-d*v;> if(dlx.lt.shr) exit; if nlp.gt.maxit < jerr=-ilm; return;> > > if(nin.gt.nx) exit; elseif fi.gt.fmax < q(i)=1.0;> else < q(i)=1.0/(1.0+exp(-fi));> > v=w*q*(1.0-q); xmz=sum(v); if(xmz.le.vmin) exit; r=w*(y-q); if xmz*(b(0)-bs(0))**2.lt.shr < ix=0; if ix.eq.0 < > if(ix.eq.1) go to :again:; exit; > > > if nin.gt.nx < jerr=-10000-ilm; exit;> if(nin.gt.0) a(1:nin,ilm)=b(m(1:nin)); kin(ilm)=nin; a0(ilm)=b(0); alm(ilm)=al; lmu=ilm; devi=dev2(no,w,y,q,pmin); dev(ilm)=(dev1-devi)/dev0; if(xmz.le.vmin) exit; if(ilm.lt.mnl) next; if(flmin.ge.1.0) next; me=0; if(me.gt.ne) exit; if(dev(ilm).gt.devmax) exit; if(dev(ilm)-dev(ilm-1).lt.sml) exit; > g=log(q/(1.0-q)); deallocate(b,bs,v,r,xv,q,mm,ga,ixx); return; end; function dev2(n,w,y,p,pmin); implicit double precision(a-h,o-z); double precision w(n),y(n),p(n); pmax=1.0-pmin; s=0.0; dev2=s; return; end; function azero(n,y,g,q,jerr); implicit double precision(a-h,o-z); parameter(eps=1.0d-7); double precision y(n),g(n),q(n); %fortran double precision, dimension (:), allocatable :: e,p,w %mortran azero = 0.0; allocate(e(1:n),stat=jerr); if(jerr.ne.0) return; allocate(p(1:n),stat=jerr); if(jerr.ne.0) return; allocate(w(1:n),stat=jerr); if(jerr.ne.0) return; az=0.0; e=exp(-g); qy=dot_product(q,y); p=1.0/(1.0+e); loop < w=q*p*(1.0-p); d=(qy-dot_product(q,p))/sum(w); az=az+d; if(abs(d).lt.eps) exit; ea0=exp(-az); p=1.0/(1.0+ea0*e); > azero=az; deallocate(e,p,w); return; end; subroutine lognetn(parm,no,ni,nc,x,y,g,w,ju,vp,cl,ne,nx,nlam,flmin,ulam,shri, isd,intr,maxit,kopt,lmu,a0,a,m,kin,dev0,dev,alm,nlp,jerr); implicit double precision(a-h,o-z); double precision x(no,ni),y(no,nc),g(no,nc),w(no),vp(ni),ulam(nlam); double precision a(nx,nc,nlam),a0(nc,nlam),dev(nlam),alm(nlam),cl(2,ni); integer ju(ni),m(nx),kin(nlam); %fortran double precision, dimension (:,:), allocatable :: q double precision, dimension (:), allocatable :: sxp,sxpl double precision, dimension (:), allocatable :: di,v,r,ga double precision, dimension (:,:), allocatable :: b,bs,xv integer, dimension (:), allocatable :: mm,is,ixx allocate(b(0:ni,1:nc),stat=jerr) if(jerr.ne.0) return allocate(xv(1:ni,1:nc),stat=jerr) if(jerr.ne.0) return allocate(bs(0:ni,1:nc),stat=jerr) if(jerr.ne.0) return allocate(q(1:no,1:nc),stat=jerr) if(jerr.ne.0) return %mortran call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx,itrace); exmn=-exmx; allocate(r(1:no),stat=jerr); if(jerr.ne.0) return; allocate(v(1:no),stat=jerr); if(jerr.ne.0) return; allocate(mm(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(is(1:max(nc,ni)),stat=jerr); if(jerr.ne.0) return; allocate(sxp(1:no),stat=jerr); if(jerr.ne.0) return; allocate(sxpl(1:no),stat=jerr); if(jerr.ne.0) return; allocate(di(1:no),stat=jerr); if(jerr.ne.0) return; allocate(ga(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(ixx(1:ni),stat=jerr); if(jerr.ne.0) return; pmax=1.0-pmin; emin=pmin/pmax; emax=1.0/emin; pfm=(1.0+pmin)*pmin; pfx=(1.0-pmin)*pmax; vmin=pfm*pmax; bta=parm; omb=1.0-bta; dev1=0.0; dev0=0.0; if q0.ge.1.0-pmin < jerr =9000+ic; return;> if intr.eq.0 < q0=1.0/nc; b(0,ic)=0.0;> else < b(0,ic)=log(q0); dev1=dev1-q0*b(0,ic);> b(1:ni,ic)=0.0; > if(intr.eq.0) dev1=log(float(nc)); ixx=0; al=0.0; if nonzero(no*nc,g).eq.0 < b(0,:)=b(0,:)-sum(b(0,:))/nc; sxp=0.0; > else < sxp=0.0; if intr.eq.0 < b(0,:)=0.0;> else < call kazero(nc,no,y,g,w,b(0,:),jerr); if(jerr.ne.0) return;> dev1=0.0; sxpl=w*log(sxp); > > dev0=dev0+dev1; if kopt.gt.0 < if isd.gt.0.and.intr.ne.0 < xv=0.25;> else < > > "Begin: added by Naras" alf=1.0; "End: added by Naras" if flmin.lt.1.0 < eqs=max(eps,flmin); alf=eqs**(1.0/(nlam-1));> m=0; mm=0; nin=0; nlp=0; mnl=min(mnlam,nlam); bs=0.0; shr=shri*dev0; ga=0.0; > elseif ilm.gt.2 < al=al*alf;> elseif ilm.eq.1 < al=big;> else < al0=0.0; al0=al0/max(bta,1.0d-3); al=alf*al0; > al2=al*omb; al1=al*bta; tlam=bta*(2.0*al-al0); :again:continue; loop < /ix,jx/=0; ig=0; elseif pic.gt.pfx < pic=1.0; v(i)=0.0;> else < v(i)=w(i)*pic*(1.0-pic); xmz=xmz+v(i);> r(i)=w(i)*(y(i,ic)-pic); > if(xmz.le.vmin) next; ig=1; if kopt.eq.0 < > loop < nlp=nlp+1; dlx=0.0; else < b(k,ic)=max(cl(1,k),min(cl(2,k),sign(au,u)/ (xv(k,ic)+vp(k)*al2))); > d=b(k,ic)-bk; if(abs(d).le.0.0) next; dlx=max(dlx,xv(k,ic)*d**2); r=r-d*v*x(:,k); if mm(k).eq.0 < nin=nin+1; if nin.gt.nx < jx=1; exit;> mm(k)=nin; m(nin)=k; > > if(jx.gt.0) exit; d=0.0; if(intr.ne.0) d=sum(r)/xmz; if d.ne.0.0 < b(0,ic)=b(0,ic)+d; dlx=max(dlx,xmz*d**2); r=r-d*v;> if(dlx.lt.shr) exit; if nlp.gt.maxit < jerr=-ilm; return;> loop < nlp=nlp+1; dlx=0.0; else < b(k,ic)=max(cl(1,k),min(cl(2,k),sign(au,u)/ (xv(k,ic)+vp(k)*al2))); > d=b(k,ic)-bk; if(abs(d).le.0.0) next; dlx=max(dlx,xv(k,ic)*d**2); r=r-d*v*x(:,k); > d=0.0; if(intr.ne.0) d=sum(r)/xmz; if d.ne.0.0 < b(0,ic)=b(0,ic)+d; dlx=max(dlx,xmz*d**2); r=r-d*v; > if(dlx.lt.shr) exit; if nlp.gt.maxit < jerr=-ilm; return;> > > if(jx.gt.0) exit; if(xmz*(b(0,ic)-bs(0,ic))**2.gt.shr) ix=1; if ix.eq.0 < > > > s=-sum(b(0,:))/nc; b(0,:)=b(0,:)+s; di=s; else < s=elc(parm,nc,cl(:,l),b(l,:),is);> b(l,:)=b(l,:)-s; di=di-s*x(:,l); > di=exp(di); sxp=sxp*di; if(jx.gt.0) exit; if(ig.eq.0) exit; if ix.eq.0 < > > if(ix.eq.1) go to :again:; exit; > > if jx.gt.0 < jerr=-10000-ilm; exit;> devi=0.0; > kin(ilm)=nin; alm(ilm)=al; lmu=ilm; dev(ilm)=(dev1-devi)/dev0; if(ig.eq.0) exit; if(ilm.lt.mnl) next; if(flmin.ge.1.0) next; if(nintot(ni,nx,nc,a(1,1,ilm),m,nin,is).gt.ne) exit; if(dev(ilm).gt.devmax) exit; if(dev(ilm)-dev(ilm-1).lt.sml) exit; > g=log(q); deallocate(sxp,b,bs,v,r,xv,q,mm,is,ga,ixx); return; end; subroutine kazero(kk,n,y,g,q,az,jerr); implicit double precision(a-h,o-z); parameter(eps=1.0d-7); double precision y(n,kk),g(n,kk),q(n),az(kk); %fortran double precision, dimension (:), allocatable :: s double precision, dimension (:,:), allocatable :: e allocate(e(1:n,1:kk),stat=jerr) if(jerr.ne.0) return %mortran allocate(s(1:n),stat=jerr); if(jerr.ne.0) return; az=0.0; e=exp(g); loop < dm=0.0; d=t/u; az(k)=az(k)+d; ed=exp(d); dm=max(dm,abs(d)); > > until dm.lt.eps; az=az-sum(az)/kk; deallocate(e,s); return; end; function elc(parm,n,cl,a,m); implicit double precision(a-h,o-z); double precision a(n),cl(2); integer m(n); fn=n; am=sum(a)/fn; if parm.eq.0.0.or.n.eq.2 < elc=am; go to :chk:;> call psort7(a,m,1,n); if a(m(1)).eq.a(m(n)) < elc=a(1); go to :chk:;> if mod(n,2).eq.1 < ad=a(m(n/2+1));> else < ad=0.5*(a(m(n/2+1))+a(m(n/2)));> if parm.eq.1.0 < elc=ad; go to :chk:;> b1=min(am,ad); b2=max(am,ad); k2=1; until a(m(k2)).gt.b1 < k2=k2+1;> k1=k2-1; until a(m(k2)).ge.b2 < k2=k2+1;> r=parm/((1.0-parm)*fn); is=0; sm=n-2*(k1-1); > if is.ne.0 < elc=s; go to :chk:;> r2=2.0*r; s1=a(m(k1)); am2=2.0*am; cri=r2*sum(abs(a-s1))+s1*(s1-am2); elc=s1; s1=s; > :chk:elc=max(maxval(a-cl(2)),min(minval(a-cl(1)),elc)); return; end; function nintot(ni,nx,nc,a,m,nin,is); implicit double precision(a-h,o-z); double precision a(nx,nc); integer m(nx),is(ni); is=0; nintot=0; > return; end; subroutine luncomp(ni,nx,nc,ca,ia,nin,a); implicit double precision(a-h,o-z); double precision ca(nx,nc),a(ni,nc); integer ia(nx); a=0.0; return; end; subroutine lmodval(nt,x,nc,nx,a0,ca,ia,nin,ans); implicit double precision(a-h,o-z); double precision a0(nc),ca(nx,nc),x(nt,*),ans(nc,nt); integer ia(nx); > return; end; subroutine splognet(parm,no,ni,nc,x,ix,jx,y,g,jd,vp,cl,ne,nx,nlam,flmin, ulam,thr,isd,intr,maxit,kopt,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,jerr); implicit double precision(a-h,o-z); double precision x(*),y(no,max(2,nc)),g(no,nc),vp(ni),ulam(nlam); double precision ca(nx,nc,nlam),a0(nc,nlam),dev(nlam),alm(nlam),cl(2,ni); integer ix(*),jx(*),jd(*),ia(nx),nin(nlam); %fortran double precision, dimension (:), allocatable :: xm,xs,ww,vq,xv integer, dimension (:), allocatable :: ju %mortran if maxval(vp).le.0.0 < jerr=10000; return;> allocate(ww(1:no),stat=jerr); if(jerr.ne.0) return; allocate(ju(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(vq(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(xm(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(xs(1:ni),stat=jerr); if(jerr.ne.0) return; if kopt.eq.2 < allocate(xv(1:ni),stat=jerr); if(jerr.ne.0) return;> call spchkvars(no,ni,x,ix,ju); if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0; if maxval(ju).le.0 < jerr=7777; return;> vq=max(0d0,vp); vq=vq*ni/sum(vq); sw=sum(ww); ww=ww/sw; if nc.eq.1 < call splstandard2(no,ni,x,ix,jx,ww,ju,isd,intr,xm,xs); if isd.gt.0 < > call sprlognet2n(parm,no,ni,x,ix,jx,y(:,1),g(:,1),ww,ju,vq,cl,ne,nx,nlam, flmin,ulam,thr,isd,intr,maxit,kopt,xm,xs,lmu,a0,ca,ia,nin,dev0,dev, alm,nlp,jerr); > elseif kopt.eq.2 < call multsplstandard2(no,ni,x,ix,jx,ww,ju,isd,intr,xm,xs,xv); if isd.gt.0 < > call multsprlognetn(parm,no,ni,nc,x,ix,jx,y,g,ww,ju,vq,cl,ne,nx,nlam,flmin, ulam,thr,intr,maxit,xv,xm,xs,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,jerr); > else < call splstandard2(no,ni,x,ix,jx,ww,ju,isd,intr,xm,xs); if isd.gt.0 < > call sprlognetn(parm,no,ni,nc,x,ix,jx,y,g,ww,ju,vq,cl,ne,nx,nlam,flmin, ulam,thr,isd,intr,maxit,kopt,xm,xs,lmu,a0,ca, ia,nin,dev0,dev,alm,nlp,jerr); > if(jerr.gt.0) return; dev0=2.0*sw*dev0; > if intr.eq.0 < a0(ic,k)=0.0;> else < a0(ic,k)=a0(ic,k)-dot_product(ca(1:nk,ic,k),xm(ia(1:nk)));> > > deallocate(ww,ju,vq,xm,xs); if(kopt.eq.2) deallocate(xv); return; end; subroutine multsplstandard2(no,ni,x,ix,jx,w,ju,isd,intr,xm,xs,xv); implicit double precision(a-h,o-z); double precision x(*),w(no),xm(ni),xs(ni),xv(ni); integer ix(*),jx(*),ju(ni); if intr.eq.0 < else < xs(j)=1.0;> > return; > > if(isd.eq.0) xs=1.0; return; end; subroutine splstandard2(no,ni,x,ix,jx,w,ju,isd,intr,xm,xs); implicit double precision(a-h,o-z); double precision x(*),w(no),xm(ni),xs(ni); integer ix(*),jx(*),ju(ni); if intr.eq.0 < else < xs(j)=1.0;> > return; > if(isd.eq.0) xs=1.0; return; end; subroutine sprlognet2n(parm,no,ni,x,ix,jx,y,g,w,ju,vp,cl,ne,nx,nlam, flmin,ulam,shri,isd,intr,maxit,kopt,xb,xs, lmu,a0,a,m,kin,dev0,dev,alm,nlp,jerr); implicit double precision(a-h,o-z); double precision x(*),y(no),g(no),w(no),vp(ni),ulam(nlam),cl(2,ni); double precision a(nx,nlam),a0(nlam),dev(nlam),alm(nlam); double precision xb(ni),xs(ni); integer ix(*),jx(*),ju(ni),m(nx),kin(nlam); %fortran double precision, dimension (:), allocatable :: xm,b,bs,v,r double precision, dimension (:), allocatable :: sc,xv,q,ga integer, dimension (:), allocatable :: mm,ixx %mortran call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx,itrace); allocate(b(0:ni),stat=jerr); if(jerr.ne.0) return; allocate(xm(0:ni),stat=jerr); if(jerr.ne.0) return; allocate(xv(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(bs(0:ni),stat=jerr); if(jerr.ne.0) return; allocate(ga(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(mm(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(ixx(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(q(1:no),stat=jerr); if(jerr.ne.0) return; allocate(r(1:no),stat=jerr); if(jerr.ne.0) return; allocate(v(1:no),stat=jerr); if(jerr.ne.0) return; allocate(sc(1:no),stat=jerr); if(jerr.ne.0) return; fmax=log(1.0/pmin-1.0); fmin=-fmax; vmin=(1.0+pmin)*pmin*(1.0-pmin); bta=parm; omb=1.0-bta; q0=dot_product(w,y); if q0.le.pmin < jerr=8001; return;> if q0.ge.1.0-pmin < jerr=9001; return;> if(intr.eq.0) q0=0.5; bz=0.0; if(intr.ne.0) bz=log(q0/(1.0-q0)); if nonzero(no,g).eq.0 < vi=q0*(1.0-q0); b(0)=bz; v=vi*w; r=w*(y-q0); q=q0; xm(0)=vi; dev1=-(bz*q0+log(1.0-q0)); > else < b(0)=0.0; if intr.ne.0 < b(0)=azero(no,y,g,w,jerr); if(jerr.ne.0) return;> q=1.0/(1.0+exp(-b(0)-g)); v=w*q*(1.0-q); r=w*(y-q); xm(0)=sum(v); dev1=-(b(0)*q0+dot_product(w,y*g+log(1.0-q))); > if kopt.gt.0 < if isd.gt.0.and.intr.ne.0 < xv=0.25;> else < > > b(1:ni)=0.0; dev0=dev1; "Begin: added by Naras" alf=1.0; "End: added by Naras" if flmin.lt.1.0 < eqs=max(eps,flmin); alf=eqs**(1.0/(nlam-1));> m=0; mm=0; nin=0; /o,svr/=0.0; mnl=min(mnlam,nlam); bs=0.0; /nlp,nin/=0; shr=shri*dev0; al=0.0; ixx=0; elseif ilm.gt.2 < al=al*alf;> elseif ilm.eq.1 < al=big;> else < al0=0.0; al0=al0/max(bta,1.0d-3); al=alf*al0; > al2=al*omb; al1=al*bta; tlam=bta*(2.0*al-al0); :again:continue; loop < bs(0)=b(0); if(nin.gt.0) bs(m(1:nin))=b(m(1:nin)); > loop < nlp=nlp+1; dlx=0.0; else < b(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(xv(k)+vp(k)*al2))); > d=b(k)-bk; if(abs(d).le.0.0) next; dlx=max(dlx,xv(k)*d**2); if mm(k).eq.0 < nin=nin+1; if(nin.gt.nx) exit; mm(k)=nin; m(nin)=k; sc(1:jn)=v(jx(jb:je)); xm(k)=dot_product(sc(1:jn),x(jb:je)); > r(jx(jb:je))=r(jx(jb:je))-d*v(jx(jb:je))*x(jb:je)/xs(k); o=o+d*(xb(k)/xs(k)); svr=svr-d*(xm(k)-xb(k)*xm(0))/xs(k); > if(nin.gt.nx) exit; d=0.0; if(intr.ne.0) d=svr/xm(0); if d.ne.0.0 < b(0)=b(0)+d; dlx=max(dlx,xm(0)*d**2); r=r-d*v; svr=svr-d*xm(0); > if(dlx.lt.shr) exit; if nlp.gt.maxit < jerr=-ilm; return;> loop < nlp=nlp+1; dlx=0.0; else < b(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(xv(k)+vp(k)*al2))); > d=b(k)-bk; if(abs(d).le.0.0) next; dlx=max(dlx,xv(k)*d**2); r(jx(jb:je))=r(jx(jb:je))-d*v(jx(jb:je))*x(jb:je)/xs(k); o=o+d*(xb(k)/xs(k)); svr=svr-d*(xm(k)-xb(k)*xm(0))/xs(k); > d=0.0; if(intr.ne.0) d=svr/xm(0); if d.ne.0.0 < b(0)=b(0)+d; dlx=max(dlx,xm(0)*d**2); r=r-d*v; svr=svr-d*xm(0); > if(dlx.lt.shr) exit; if nlp.gt.maxit < jerr=-ilm; return;> > > if(nin.gt.nx) exit; sc=b(0); b0=0.0; sc=sc+b0; elseif fi.gt.fmax < q(i)=1.0;> else < q(i)=1.0/(1.0+exp(-fi));> > v=w*q*(1.0-q); xm(0)=sum(v); if(xm(0).lt.vmin) exit; r=w*(y-q); svr=sum(r); o=0.0; if xm(0)*(b(0)-bs(0))**2.lt.shr < kx=0; if kx.eq.0 < > if(kx.eq.1) go to :again:; exit; > > > if nin.gt.nx < jerr=-10000-ilm; exit;> if(nin.gt.0) a(1:nin,ilm)=b(m(1:nin)); kin(ilm)=nin; a0(ilm)=b(0); alm(ilm)=al; lmu=ilm; devi=dev2(no,w,y,q,pmin); dev(ilm)=(dev1-devi)/dev0; if(ilm.lt.mnl) next; if(flmin.ge.1.0) next; me=0; if(me.gt.ne) exit; if(dev(ilm).gt.devmax) exit; if(dev(ilm)-dev(ilm-1).lt.sml) exit; if(xm(0).lt.vmin) exit; > g=log(q/(1.0-q)); deallocate(xm,b,bs,v,r,sc,xv,q,mm,ga,ixx); return; end; subroutine sprlognetn(parm,no,ni,nc,x,ix,jx,y,g,w,ju,vp,cl,ne,nx,nlam,flmin, ulam,shri,isd,intr,maxit,kopt,xb,xs,lmu,a0,a,m,kin,dev0,dev,alm,nlp,jerr); implicit double precision(a-h,o-z); double precision x(*),y(no,nc),g(no,nc),w(no),vp(ni),ulam(nlam),xb(ni),xs(ni); double precision a(nx,nc,nlam),a0(nc,nlam),dev(nlam),alm(nlam),cl(2,ni); integer ix(*),jx(*),ju(ni),m(nx),kin(nlam); %fortran double precision, dimension (:,:), allocatable :: q double precision, dimension (:), allocatable :: sxp,sxpl double precision, dimension (:), allocatable :: sc,xm,v,r,ga double precision, dimension (:,:), allocatable :: b,bs,xv integer, dimension (:), allocatable :: mm,is,iy allocate(b(0:ni,1:nc),stat=jerr) if(jerr.ne.0) return allocate(xv(1:ni,1:nc),stat=jerr) if(jerr.ne.0) return allocate(bs(0:ni,1:nc),stat=jerr) if(jerr.ne.0) return allocate(q(1:no,1:nc),stat=jerr) if(jerr.ne.0) return %mortran call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx,itrace); exmn=-exmx; allocate(xm(0:ni),stat=jerr); if(jerr.ne.0) return; allocate(r(1:no),stat=jerr); if(jerr.ne.0) return; allocate(v(1:no),stat=jerr); if(jerr.ne.0) return; allocate(mm(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(ga(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(iy(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(is(1:max(nc,ni)),stat=jerr); if(jerr.ne.0) return; allocate(sxp(1:no),stat=jerr); if(jerr.ne.0) return; allocate(sxpl(1:no),stat=jerr); if(jerr.ne.0) return; allocate(sc(1:no),stat=jerr); if(jerr.ne.0) return; pmax=1.0-pmin; emin=pmin/pmax; emax=1.0/emin; pfm=(1.0+pmin)*pmin; pfx=(1.0-pmin)*pmax; vmin=pfm*pmax; bta=parm; omb=1.0-bta; dev1=0.0; dev0=0.0; if q0.ge.1.0-pmin < jerr =9000+ic; return;> if(intr.eq.0) q0=1.0/nc; b(1:ni,ic)=0.0; b(0,ic)=0.0; if intr.ne.0 < b(0,ic)=log(q0); dev1=dev1-q0*b(0,ic);> > if(intr.eq.0) dev1=log(float(nc)); iy=0; al=0.0; if nonzero(no*nc,g).eq.0 < b(0,:)=b(0,:)-sum(b(0,:))/nc; sxp=0.0; > else < sxp=0.0; if intr.eq.0 < b(0,:)=0.0;> else < call kazero(nc,no,y,g,w,b(0,:),jerr); if(jerr.ne.0) return;> dev1=0.0; sxpl=w*log(sxp); > > dev0=dev0+dev1; if kopt.gt.0 < if isd.gt.0.and.intr.ne.0 < xv=0.25;> else < > > "Begin: added by Naras" alf=1.0; "End: added by Naras" if flmin.lt.1.0 < eqs=max(eps,flmin); alf=eqs**(1.0/(nlam-1));> m=0; mm=0; nin=0; nlp=0; mnl=min(mnlam,nlam); bs=0.0; svr=0.0; o=0.0; shr=shri*dev0; ga=0.0; > elseif ilm.gt.2 < al=al*alf;> elseif ilm.eq.1 < al=big;> else < al0=0.0; al0=al0/max(bta,1.0d-3); al=alf*al0; > al2=al*omb; al1=al*bta; tlam=bta*(2.0*al-al0); :again:continue; loop < /ixx,jxx/=0; ig=0; elseif pic.gt.pfx < pic=1.0; v(i)=0.0;> else < v(i)=w(i)*pic*(1.0-pic); xm(0)=xm(0)+v(i);> r(i)=w(i)*(y(i,ic)-pic); svr=svr+r(i); > if(xm(0).le.vmin) next; ig=1; > loop < nlp=nlp+1; dlx=0.0; else < b(k,ic)=max(cl(1,k),min(cl(2,k),sign(au,u)/ (xv(k,ic)+vp(k)*al2))); > d=b(k,ic)-bk; if(abs(d).le.0.0) next; dlx=max(dlx,xv(k,ic)*d**2); if mm(k).eq.0 < nin=nin+1; if nin.gt.nx < jxx=1; exit;> mm(k)=nin; m(nin)=k; xm(k)=dot_product(v(jx(jb:je)),x(jb:je)); > r(jx(jb:je))=r(jx(jb:je))-d*v(jx(jb:je))*x(jb:je)/xs(k); o=o+d*(xb(k)/xs(k)); svr=svr-d*(xm(k)-xb(k)*xm(0))/xs(k); > if(jxx.gt.0) exit; d=0.0; if(intr.ne.0) d=svr/xm(0); if d.ne.0.0 < b(0,ic)=b(0,ic)+d; dlx=max(dlx,xm(0)*d**2); r=r-d*v; svr=svr-d*xm(0); > if(dlx.lt.shr) exit; if nlp.gt.maxit < jerr=-ilm; return;> loop < nlp=nlp+1; dlx=0.0; else < b(k,ic)=max(cl(1,k),min(cl(2,k),sign(au,u)/ (xv(k,ic)+vp(k)*al2))); > d=b(k,ic)-bk; if(abs(d).le.0.0) next; dlx=max(dlx,xv(k,ic)*d**2); r(jx(jb:je))=r(jx(jb:je))-d*v(jx(jb:je))*x(jb:je)/xs(k); o=o+d*(xb(k)/xs(k)); svr=svr-d*(xm(k)-xb(k)*xm(0))/xs(k); > d=0.0; if(intr.ne.0) d=svr/xm(0); if d.ne.0.0 < b(0,ic)=b(0,ic)+d; dlx=max(dlx,xm(0)*d**2); r=r-d*v; svr=svr-d*xm(0); > if(dlx.lt.shr) exit; if nlp.gt.maxit < jerr=-ilm; return;> > > if(jxx.gt.0) exit; if(xm(0)*(b(0,ic)-bs(0,ic))**2.gt.shr) ixx=1; if ixx.eq.0 < > > sc=b(0,ic)+g(:,ic); b0=0.0; sc=min(max(exmn,sc+b0),exmx); sxp=sxp-q(:,ic); q(:,ic)=min(max(emin*sxp,exp(sc)),emax*sxp); sxp=sxp+q(:,ic); > s=-sum(b(0,:))/nc; b(0,:)=b(0,:)+s; sc=s; b0=0.0; else < s=elc(parm,nc,cl(:,l),b(l,:),is);> b(l,:)=b(l,:)-s; jb=ix(l); je=ix(l+1)-1; sc(jx(jb:je))=sc(jx(jb:je))-s*x(jb:je)/xs(l); b0=b0+s*xb(l)/xs(l); > sc=sc+b0; sc=exp(sc); sxp=sxp*sc; if(jxx.gt.0) exit; if(ig.eq.0) exit; if ixx.eq.0 < > > if(ixx.eq.1) go to :again:; exit; > > if jxx.gt.0 < jerr=-10000-ilm; exit;> devi=0.0; > kin(ilm)=nin; alm(ilm)=al; lmu=ilm; dev(ilm)=(dev1-devi)/dev0; if(ig.eq.0) exit; if(ilm.lt.mnl) next; if(flmin.ge.1.0) next; if(nintot(ni,nx,nc,a(1,1,ilm),m,nin,is).gt.ne) exit; if(dev(ilm).gt.devmax) exit; if(dev(ilm)-dev(ilm-1).lt.sml) exit; > g=log(q); deallocate(sxp,b,bs,v,r,xv,q,mm,is,xm,sc,ga,iy); return; end; subroutine lcmodval(nc,nx,a0,ca,ia,nin,x,ix,jx,n,f); implicit double precision(a-h,o-z); double precision a0(nc),ca(nx,nc),x(*),f(nc,n); integer ia(*),ix(*),jx(*); > return; end; subroutine coxnet(parm,no,ni,x,y,d,g,w,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr, maxit,isd,lmu,ca,ia,nin,dev0,dev,alm,nlp,jerr); implicit double precision(a-h,o-z); double precision x(no,ni),y(no),d(no),g(no),w(no),vp(ni),ulam(nlam); double precision ca(nx,nlam),dev(nlam),alm(nlam),cl(2,ni); integer jd(*),ia(nx),nin(nlam); %fortran double precision, dimension (:), allocatable :: xs,ww,vq integer, dimension (:), allocatable :: ju %mortran if maxval(vp).le.0.0 < jerr=10000; return;> allocate(ww(1:no),stat=jerr); if(jerr.ne.0) return; allocate(ju(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(vq(1:ni),stat=jerr); if(jerr.ne.0) return; if isd.gt.0 < allocate(xs(1:ni),stat=jerr); if(jerr.ne.0) return;> call chkvars(no,ni,x,ju); if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0; if maxval(ju).le.0 < jerr=7777; return;> vq=max(0d0,vp); vq=vq*ni/sum(vq); ww=max(0d0,w); sw=sum(ww); if sw.le.0.0 < jerr=9999; return;> ww=ww/sw; call cstandard(no,ni,x,ww,ju,isd,xs); if isd.gt.0 < > call coxnet1(parm,no,ni,x,y,d,g,ww,ju,vq,cl,ne,nx,nlam,flmin,ulam,thr, isd,maxit,lmu,ca,ia,nin,dev0,dev,alm,nlp,jerr); if(jerr.gt.0) return; dev0=2.0*sw*dev0; if isd.gt.0 < > deallocate(ww,ju,vq); if(isd.gt.0) deallocate(xs); return; end; subroutine cstandard(no,ni,x,w,ju,isd,xs); implicit double precision(a-h,o-z); double precision x(no,ni),w(no),xs(ni); integer ju(ni); > return; end; subroutine coxnet1(parm,no,ni,x,y,d,g,q,ju,vp,cl,ne,nx,nlam,flmin,ulam,cthri, isd,maxit,lmu,ao,m,kin,dev0,dev,alm,nlp,jerr); implicit double precision(a-h,o-z); double precision x(no,ni),y(no),q(no),d(no),g(no),vp(ni),ulam(nlam); double precision ao(nx,nlam),dev(nlam),alm(nlam),cl(2,ni); integer ju(ni),m(nx),kin(nlam); %fortran double precision, dimension (:), allocatable :: w,dk,v,xs,wr double precision, dimension (:), allocatable :: a,as,f,dq double precision, dimension (:), allocatable :: e,uu,ga integer, dimension (:), allocatable :: jp,kp,mm,ixx %mortran call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx,itrace); "Start: Naras Edit" isd = isd*1; "End: Naras Edit" sml=sml*100.0; devmax=devmax*0.99/0.999; allocate(e(1:no),stat=jerr); if(jerr.ne.0) return; allocate(uu(1:no),stat=jerr); if(jerr.ne.0) return; allocate(f(1:no),stat=jerr); if(jerr.ne.0) return; allocate(w(1:no),stat=jerr); if(jerr.ne.0) return; allocate(v(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(a(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(as(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(xs(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(ga(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(ixx(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(jp(1:no),stat=jerr); if(jerr.ne.0) return; allocate(kp(1:no),stat=jerr); if(jerr.ne.0) return; allocate(dk(1:no),stat=jerr); if(jerr.ne.0) return; allocate(wr(1:no),stat=jerr); if(jerr.ne.0) return; allocate(dq(1:no),stat=jerr); if(jerr.ne.0) return; allocate(mm(1:ni),stat=jerr); if(jerr.ne.0) return; call groups(no,y,d,q,nk,kp,jp,t0,jerr); if(jerr.ne.0) go to :done:; alpha=parm; oma=1.0-alpha; nlm=0; ixx=0; al=0.0; dq=d*q; call died(no,nk,dq,kp,jp,dk); a=0.0; f(1)=0.0; fmax=log(huge(f(1))*0.1); if nonzero(no,g).ne.0 < f=g-dot_product(q,g); e=q*exp(sign(min(abs(f),fmax),f)); > else < f=0.0; e=q;> r0=risk(no,ni,nk,dq,dk,f,e,kp,jp,uu); rr=-(dot_product(dk(1:nk),log(dk(1:nk)))+r0); dev0=rr; > call outer(no,nk,dq,dk,kp,jp,e,wr,w,jerr,uu); if(jerr.ne.0) go to :done:; "Begin: added by Naras" alf=1.0; "End: added by Naras" if flmin.lt.1.0 < eqs=max(eps,flmin); alf=eqs**(1.0/(nlam-1));> m=0; mm=0; /nlp,nin/=0; mnl=min(mnlam,nlam); as=0.0; cthr=cthri*dev0; elseif ilm.gt.2 < al=al*alf;> elseif ilm.eq.1 < al=big;> else < al0=0.0; al0=al0/max(parm,1.0d-3); al=alf*al0; > sa=alpha*al; omal=oma*al; tlam=alpha*(2.0*al-al0); :again:continue; loop < if(nin.gt.0) as(m(1:nin))=a(m(1:nin)); call vars(no,ni,x,w,ixx,v); loop < nlp=nlp+1; dli=0.0; else < at=max(cl(1,j),min(cl(2,j),sign(abs(u)-vp(j)*sa,u)/ (v(j)+vp(j)*omal))); > if at.ne.a(j) < del=at-a(j); a(j)=at; dli=max(dli,v(j)*del**2); wr=wr-del*w*x(:,j); f=f+del*x(:,j); if mm(j).eq.0 < nin=nin+1; if(nin.gt.nx) exit; mm(j)=nin; m(nin)=j; > > > if(nin.gt.nx) exit; if(dli.lt.cthr) exit; if nlp.gt.maxit < jerr=-ilm; return;> loop < nlp=nlp+1; dli=0.0; else < at=max(cl(1,j),min(cl(2,j),sign(abs(u)-vp(j)*sa,u)/ (v(j)+vp(j)*omal))); > if at.ne.a(j) < del=at-a(j); a(j)=at; dli=max(dli,v(j)*del**2); wr=wr-del*w*x(:,j); f=f+del*x(:,j); > > if(dli.lt.cthr) exit; if nlp.gt.maxit < jerr=-ilm; return;> > > if(nin.gt.nx) exit; e=q*exp(sign(min(abs(f),fmax),f)); call outer(no,nk,dq,dk,kp,jp,e,wr,w,jerr,uu); if jerr.ne.0 < jerr=jerr-ilm; go to :done:;> ix=0; if ix.eq.0 < > if(ix.eq.1) go to :again:; exit; > > if nin.gt.nx < jerr=-10000-ilm; exit;> if(nin.gt.0) ao(1:nin,ilm)=a(m(1:nin)); kin(ilm)=nin; alm(ilm)=al; lmu=ilm; dev(ilm)=(risk(no,ni,nk,dq,dk,f,e,kp,jp,uu)-r0)/rr; if(ilm.lt.mnl) next; if(flmin.ge.1.0) next; me=0; if(me.gt.ne) exit; if((dev(ilm)-dev(ilm-mnl+1))/dev(ilm).lt.sml) exit; if(dev(ilm).gt.devmax) exit; > g=f; :done: deallocate(e,uu,w,dk,v,xs,f,wr,a,as,jp,kp,dq,mm,ga,ixx); return; end; subroutine cxmodval(ca,ia,nin,n,x,f); implicit double precision(a-h,o-z); double precision ca(nin),x(n,*),f(n); integer ia(nin); f=0.0; if(nin.le.0) return; return; end; subroutine groups(no,y,d,q,nk,kp,jp,t0,jerr); implicit double precision(a-h,o-z); double precision y(no),d(no),q(no); integer jp(no),kp(*"nk"); call psort7(y,jp,1,no); nj=0; if nj.eq.0 < jerr=20000; return;> j=1; until d(jp(j)).gt.0.0 < j=j+1;> until j.gt.nj; if j.ge.nj-1 < jerr=30000; return;> t0=y(jp(j)); j0=j-1; if j0.gt.0 < until y(jp(j0)).lt.t0 < j0=j0-1;> until j0.eq.0; if j0.gt.0 < nj=nj-j0; > > jerr=0; nk=0; yk=t0; j=2; loop < until d(jp(j)).gt.0.0.and.y(jp(j)).gt.yk < j=j+1;> until j.gt.nj; nk=nk+1; kp(nk)=j-1; if(j.gt.nj) exit; if j.eq.nj < nk=nk+1; kp(nk)=nj; exit;> yk=y(jp(j)); j=j+1; > return; end; subroutine outer(no,nk,d,dk,kp,jp,e,wr,w,jerr,u); implicit double precision(a-h,o-z); double precision d(no),dk(nk),wr(no),w(no); double precision e(no),u(no),b,c; integer kp(nk),jp(no); call usk(no,nk,kp,jp,e,u); b=dk(1)/u(1); c=dk(1)/u(1)**2; jerr=0; wr(i)=d(i)-e(i)*b; > wr(i)=d(i)-e(i)*b; > > return; end; subroutine vars(no,ni,x,w,ixx,v); implicit double precision(a-h,o-z); double precision x(no,ni),w(no),v(ni); integer ixx(ni); return; end; subroutine died(no,nk,d,kp,jp,dk); implicit double precision(a-h,o-z); double precision d(no),dk(nk); integer kp(nk),jp(no); dk(1)=sum(d(jp(1:kp(1)))); return; end; subroutine usk(no,nk,kp,jp,e,u); implicit double precision(a-h,o-z); double precision e(no),u(nk),h; integer kp(nk),jp(no); h=0.0; u(k)=h; > return; end; function risk(no,ni,nk,d,dk,f,e,kp,jp,u); implicit double precision(a-h,o-z); double precision d(no),dk(nk),f(no); integer kp(nk),jp(no); double precision e(no),u(nk); "Start: Naras Edit" ni = ni*1; "End: Naras Edit" call usk(no,nk,kp,jp,e,u); u=log(u); risk=dot_product(d,f)-dot_product(dk,u); return; end; subroutine loglike(no,ni,x,y,d,g,w,nlam,a,flog,jerr); implicit double precision(a-h,o-z); double precision x(no,ni),y(no),d(no),g(no),w(no),a(ni,nlam),flog(nlam); %fortran double precision, dimension (:), allocatable :: dk,f,xm,dq,q double precision, dimension (:), allocatable :: e,uu integer, dimension (:), allocatable :: jp,kp %mortran allocate(e(1:no),stat=jerr); if(jerr.ne.0) return; allocate(q(1:no),stat=jerr); if(jerr.ne.0) return; allocate(uu(1:no),stat=jerr); if(jerr.ne.0) return; allocate(f(1:no),stat=jerr); if(jerr.ne.0) return; allocate(dk(1:no),stat=jerr); if(jerr.ne.0) return; allocate(jp(1:no),stat=jerr); if(jerr.ne.0) return; allocate(kp(1:no),stat=jerr); if(jerr.ne.0) return; allocate(dq(1:no),stat=jerr); if(jerr.ne.0) return; allocate(xm(1:ni),stat=jerr); if(jerr.ne.0) return; q=max(0d0,w); sw=sum(q); if sw.le.0.0 < jerr=9999; go to :done:;> call groups(no,y,d,q,nk,kp,jp,t0,jerr); if(jerr.ne.0) go to :done:; fmax=log(huge(e(1))*0.1); dq=d*q; call died(no,nk,dq,kp,jp,dk); gm=dot_product(q,g)/sw; flog(lam)=risk(no,ni,nk,dq,dk,f,e,kp,jp,uu); > :done: deallocate(e,uu,dk,f,jp,kp,dq); return; end; subroutine fishnet(parm,no,ni,x,y,g,w,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr, isd,intr,maxit,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,jerr); implicit double precision(a-h,o-z); double precision x(no,ni),y(no),g(no),w(no),vp(ni),ulam(nlam); double precision ca(nx,nlam),a0(nlam),dev(nlam),alm(nlam),cl(2,ni); integer jd(*),ia(nx),nin(nlam); %fortran double precision, dimension (:), allocatable :: xm,xs,ww,vq integer, dimension (:), allocatable :: ju %mortran if maxval(vp).le.0.0 < jerr=10000; return;> if minval(y).lt.0.0 < jerr=8888; return;> allocate(ww(1:no),stat=jerr); if(jerr.ne.0) return; allocate(ju(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(vq(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(xm(1:ni),stat=jerr); if(jerr.ne.0) return; if isd.gt.0 < allocate(xs(1:ni),stat=jerr); if(jerr.ne.0) return;> call chkvars(no,ni,x,ju); if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0; if maxval(ju).le.0 < jerr=7777; go to :done:;> vq=max(0d0,vp); vq=vq*ni/sum(vq); ww=max(0d0,w); sw=sum(ww); if sw.le.0.0 < jerr=9999; go to :done:;> ww=ww/sw; call lstandard1(no,ni,x,ww,ju,isd,intr,xm,xs); if isd.gt.0 < > call fishnet1(parm,no,ni,x,y,g,ww,ju,vq,cl,ne,nx,nlam,flmin,ulam,thr, isd,intr,maxit,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,jerr); if(jerr.gt.0) go to :done:; dev0=2.0*sw*dev0; else < a0(k)=a0(k)-dot_product(ca(1:nk,k),xm(ia(1:nk)));> > :done:deallocate(ww,ju,vq,xm); if(isd.gt.0) deallocate(xs); return; end; subroutine fishnet1(parm,no,ni,x,y,g,q,ju,vp,cl,ne,nx,nlam,flmin,ulam,shri, isd,intr,maxit,lmu,a0,ca,m,kin,dev0,dev,alm,nlp,jerr); implicit double precision(a-h,o-z); double precision x(no,ni),y(no),g(no),q(no),vp(ni),ulam(nlam); double precision ca(nx,nlam),a0(nlam),dev(nlam),alm(nlam),cl(2,ni); integer ju(ni),m(nx),kin(nlam); %fortran double precision, dimension (:), allocatable :: t,w,wr,v,a,f,as,ga integer, dimension (:), allocatable :: mm,ixx %mortran call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx,itrace); sml=sml*10.0; "Start: Naras Edit" isd = isd*1; "End: Naras Edit" allocate(a(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(as(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(t(1:no),stat=jerr); if(jerr.ne.0) return; allocate(mm(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(ga(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(ixx(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(wr(1:no),stat=jerr); if(jerr.ne.0) return; allocate(v(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(w(1:no),stat=jerr); if(jerr.ne.0) return; allocate(f(1:no),stat=jerr); if(jerr.ne.0) return; bta=parm; omb=1.0-bta; t=q*y; yb=sum(t); fmax=log(huge(bta)*0.1); if nonzero(no,g).eq.0 < if intr.ne.0 < w=q*yb; az=log(yb); f=az; dv0=yb*(az-1.0);> else < w=q; az=0.0; f=az; dv0=-1.0;> > else < w=q*exp(sign(min(abs(g),fmax),g)); v0=sum(w); if intr.ne.0 < eaz=yb/v0; w=eaz*w; az=log(eaz); f=az+g; dv0=dot_product(t,g)-yb*(1.0-az); > else < az=0.0; f=g; dv0=dot_product(t,g)-v0;> > a=0.0; as=0.0; wr=t-w; v0=1.0; if(intr.ne.0) v0=yb; dvr=-yb; dvr=dvr-dv0; dev0=dvr; "Begin: added by Naras" alf=1.0; "End: added by Naras" if flmin.lt.1.0 < eqs=max(eps,flmin); alf=eqs**(1.0/(nlam-1));> m=0; mm=0; /nlp,nin/=0; mnl=min(mnlam,nlam); shr=shri*dev0; ixx=0; al=0.0; elseif ilm.gt.2 < al=al*alf;> elseif ilm.eq.1 < al=big;> else < al0=0.0; al0=al0/max(bta,1.0d-3); al=alf*al0; > al2=al*omb; al1=al*bta; tlam=bta*(2.0*al-al0); :again:continue; loop < az0=az; if(nin.gt.0) as(m(1:nin))=a(m(1:nin)); loop < nlp=nlp+1; dlx=0.0; else < a(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(v(k)+vp(k)*al2))); > if(a(k).eq.ak) next; d=a(k)-ak; dlx=max(dlx,v(k)*d**2); wr=wr-d*w*x(:,k); f=f+d*x(:,k); if mm(k).eq.0 < nin=nin+1; if(nin.gt.nx) exit; mm(k)=nin; m(nin)=k; > > if(nin.gt.nx) exit; if intr.ne.0 < d=sum(wr)/v0; az=az+d; dlx=max(dlx,v0*d**2); wr=wr-d*w; f=f+d; > if(dlx.lt.shr) exit; if nlp.gt.maxit < jerr=-ilm; return;> loop < nlp=nlp+1; dlx=0.0; else < a(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(v(k)+vp(k)*al2))); > if(a(k).eq.ak) next; d=a(k)-ak; dlx=max(dlx,v(k)*d**2); wr=wr-d*w*x(:,k); f=f+d*x(:,k) > if intr.ne.0 < d=sum(wr)/v0; az=az+d; dlx=max(dlx,v0*d**2); wr=wr-d*w; f=f+d; > if(dlx.lt.shr) exit; if nlp.gt.maxit < jerr=-ilm; return;> > > if(nin.gt.nx) exit; w=q*exp(sign(min(abs(f),fmax),f)); v0=sum(w); wr=t-w; if v0*(az-az0)**2.lt.shr < ix=0; if ix.eq.0 < > if(ix.eq.1) go to :again:; exit; > > > if nin.gt.nx < jerr=-10000-ilm; exit;> if(nin.gt.0) ca(1:nin,ilm)=a(m(1:nin)); kin(ilm)=nin; a0(ilm)=az; alm(ilm)=al; lmu=ilm; dev(ilm)=(dot_product(t,f)-v0-dv0)/dvr; if(ilm.lt.mnl) next; if(flmin.ge.1.0) next; me=0; if(me.gt.ne) exit; if((dev(ilm)-dev(ilm-mnl+1))/dev(ilm).lt.sml) exit; if(dev(ilm).gt.devmax) exit; > g=f; :done:deallocate(t,w,wr,v,a,f,as,mm,ga,ixx); return; end; function nonzero(n,v); implicit double precision(a-h,o-z); double precision v(n); nonzero=0; > return; end; subroutine solns(ni,nx,lmu,a,ia,nin,b); implicit double precision(a-h,o-z); double precision a(nx,lmu),b(ni,lmu); integer ia(nx),nin(lmu); return; end; subroutine lsolns(ni,nx,nc,lmu,a,ia,nin,b); implicit double precision(a-h,o-z); double precision a(nx,nc,lmu),b(ni,nc,lmu); integer ia(nx),nin(lmu); return; end; subroutine deviance(no,ni,x,y,g,q,nlam,a0,a,flog,jerr); implicit double precision(a-h,o-z); double precision x(no,ni),y(no),g(no),q(no),a(ni,nlam),a0(nlam),flog(nlam); %fortran double precision, dimension (:), allocatable :: w %mortran if minval(y).lt.0.0 < jerr=8888; return;> allocate(w(1:no),stat=jerr); if(jerr.ne.0) return; w=max(0d0,q); sw=sum(w); if sw.le.0.0 < jerr=9999; go to :done:;> yb=dot_product(w,y)/sw; fmax=log(huge(y(1))*0.1); flog(lam)=2.0*(sw*yb*(log(yb)-1.0)-s); > :done: deallocate(w); return; end; subroutine spfishnet(parm,no,ni,x,ix,jx,y,g,w,jd,vp,cl,ne,nx,nlam,flmin, ulam,thr,isd,intr,maxit,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,jerr); implicit double precision(a-h,o-z); double precision x(*),y(no),g(no),w(no),vp(ni),ulam(nlam),cl(2,ni); double precision ca(nx,nlam),a0(nlam),dev(nlam),alm(nlam); integer ix(*),jx(*),jd(*),ia(nx),nin(nlam); %fortran double precision, dimension (:), allocatable :: xm,xs,ww,vq integer, dimension (:), allocatable :: ju %mortran if maxval(vp).le.0.0 < jerr=10000; return;> if minval(y).lt.0.0 < jerr=8888; return;> allocate(ww(1:no),stat=jerr); if(jerr.ne.0) return; allocate(ju(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(vq(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(xm(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(xs(1:ni),stat=jerr); if(jerr.ne.0) return; call spchkvars(no,ni,x,ix,ju); if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0; if maxval(ju).le.0 < jerr=7777; go to :done:;> vq=max(0d0,vp); vq=vq*ni/sum(vq); ww=max(0d0,w); sw=sum(ww); if sw.le.0.0 < jerr=9999; go to :done:;> ww=ww/sw; call splstandard2(no,ni,x,ix,jx,ww,ju,isd,intr,xm,xs); if isd.gt.0 < > call spfishnet1(parm,no,ni,x,ix,jx,y,g,ww,ju,vq,cl,ne,nx,nlam,flmin,ulam,thr, isd,intr,maxit,xm,xs,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,jerr); if(jerr.gt.0) go to :done:; dev0=2.0*sw*dev0; else < a0(k)=a0(k)-dot_product(ca(1:nk,k),xm(ia(1:nk)));> > :done:deallocate(ww,ju,vq,xm,xs); return; end; subroutine spfishnet1(parm,no,ni,x,ix,jx,y,g,q,ju,vp,cl,ne,nx,nlam,flmin,ulam, shri,isd,intr,maxit,xb,xs,lmu,a0,ca,m,kin,dev0,dev,alm,nlp,jerr); implicit double precision(a-h,o-z); double precision x(*),y(no),g(no),q(no),vp(ni),ulam(nlam),xb(ni),xs(ni); double precision ca(nx,nlam),a0(nlam),dev(nlam),alm(nlam),cl(2,ni); integer ix(*),jx(*),ju(ni),m(nx),kin(nlam); %fortran double precision, dimension (:), allocatable :: qy,t,w,wr,v double precision, dimension (:), allocatable :: a,as,xm,ga integer, dimension (:), allocatable :: mm,ixx %mortran call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx,itrace); sml=sml*10.0; "Start: Naras Edit" isd = isd*1; "End: Naras Edit" allocate(a(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(as(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(t(1:no),stat=jerr); if(jerr.ne.0) return; allocate(mm(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(ga(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(ixx(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(wr(1:no),stat=jerr); if(jerr.ne.0) return; allocate(v(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(xm(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(w(1:no),stat=jerr); if(jerr.ne.0) return; allocate(qy(1:no),stat=jerr); if(jerr.ne.0) return; bta=parm; omb=1.0-bta; fmax=log(huge(bta)*0.1); qy=q*y; yb=sum(qy); if nonzero(no,g).eq.0 < t=0.0; if intr.ne.0 < w=q*yb; az=log(yb); uu=az; xm=yb*xb; dv0=yb*(az-1.0); > else < w=q; xm=0.0; /uu,az/=0.0; dv0=-1.0;> > else < w=q*exp(sign(min(abs(g),fmax),g)); ww=sum(w); t=g; if intr.ne.0 < eaz=yb/ww; w=eaz*w; /az,uu/=log(eaz); dv0=dot_product(qy,g)-yb*(1.0-az); > else < /uu,az/=0.0; dv0=dot_product(qy,g)-ww;> > tt=yb*uu; ww=1.0; if(intr.ne.0) ww=yb; wr=qy-q*(yb*(1.0-uu)); a=0.0; as=0.0; dvr=-yb; dvr=dvr-dv0; dev0=dvr; "Begin: added by Naras" alf=1.0; "End: added by Naras" if flmin.lt.1.0 < eqs=max(eps,flmin); alf=eqs**(1.0/(nlam-1));> m=0; mm=0; /nlp,nin/=0; mnl=min(mnlam,nlam); shr=shri*dev0; al=0.0; ixx=0; elseif ilm.gt.2 < al=al*alf;> elseif ilm.eq.1 < al=big;> else < al0=0.0; al0=al0/max(bta,1.0d-3); al=alf*al0; > al2=al*omb; al1=al*bta; tlam=bta*(2.0*al-al0); :again:continue; loop < az0=az; if(nin.gt.0) as(m(1:nin))=a(m(1:nin)); loop < nlp=nlp+1; dlx=0.0; else < a(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(v(k)+vp(k)*al2))); > if(a(k).eq.ak) next; if mm(k).eq.0 < nin=nin+1; if(nin.gt.nx) exit; mm(k)=nin; m(nin)=k; > d=a(k)-ak; dlx=max(dlx,v(k)*d**2); dv=d/xs(k); wr(jx(jb:je))=wr(jx(jb:je))-dv*w(jx(jb:je))*x(jb:je); t(jx(jb:je))=t(jx(jb:je))+dv*x(jb:je); uu=uu-dv*xb(k); tt=tt-dv*xm(k); > if(nin.gt.nx) exit; if intr.ne.0 < d=tt/ww-uu; az=az+d; dlx=max(dlx,ww*d**2); uu=uu+d; > if(dlx.lt.shr) exit; if nlp.gt.maxit < jerr=-ilm; return;> loop < nlp=nlp+1; dlx=0.0; else < a(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(v(k)+vp(k)*al2))); > if(a(k).eq.ak) next; d=a(k)-ak; dlx=max(dlx,v(k)*d**2); dv=d/xs(k); wr(jx(jb:je))=wr(jx(jb:je))-dv*w(jx(jb:je))*x(jb:je); t(jx(jb:je))=t(jx(jb:je))+dv*x(jb:je); uu=uu-dv*xb(k); tt=tt-dv*xm(k); > if intr.ne.0 < d=tt/ww-uu; az=az+d; dlx=max(dlx,ww*d**2); uu=uu+d; > if(dlx.lt.shr) exit; if nlp.gt.maxit < jerr=-ilm; return;> > > if(nin.gt.nx) exit; euu=exp(sign(min(abs(uu),fmax),uu)); w=euu*q*exp(sign(min(abs(t),fmax),t)); ww=sum(w); wr=qy-w*(1.0-uu); tt=sum(wr); if ww*(az-az0)**2.lt.shr < kx=0; if kx.eq.0 < > if(kx.eq.1) go to :again:; exit; > > > if nin.gt.nx < jerr=-10000-ilm; exit;> if(nin.gt.0) ca(1:nin,ilm)=a(m(1:nin)); kin(ilm)=nin; a0(ilm)=az; alm(ilm)=al; lmu=ilm; dev(ilm)=(dot_product(qy,t)+yb*uu-ww-dv0)/dvr; if(ilm.lt.mnl) next; if(flmin.ge.1.0) next; me=0; if(me.gt.ne) exit; if((dev(ilm)-dev(ilm-mnl+1))/dev(ilm).lt.sml) exit; if(dev(ilm).gt.devmax) exit; > g=t+uu; :done:deallocate(t,w,wr,v,a,qy,xm,as,mm,ga,ixx); return; end; subroutine spdeviance(no,ni,x,ix,jx,y,g,q,nlam,a0,a,flog,jerr); implicit double precision(a-h,o-z); double precision x(*),y(no),g(no),q(no),a(ni,nlam),a0(nlam),flog(nlam); integer ix(*),jx(*); %fortran double precision, dimension (:), allocatable :: w,f %mortran if minval(y).lt.0.0 < jerr=8888; return;> allocate(w(1:no),stat=jerr); if(jerr.ne.0) return; allocate(f(1:no),stat=jerr); if(jerr.ne.0) return; w=max(0d0,q); sw=sum(w); if sw.le.0.0 < jerr=9999; go to :done:;> yb=dot_product(w,y)/sw; fmax=log(huge(y(1))*0.1); f=f+g; s=dot_product(w,y*f-exp(sign(min(abs(f),fmax),f))); flog(lam)=2.0*(sw*yb*(log(yb)-1.0)-s); > :done: deallocate(w,f); return; end; subroutine cspdeviance(no,x,ix,jx,y,g,q,nx,nlam,a0,ca,ia,nin,flog,jerr); implicit double precision(a-h,o-z); double precision x(*),y(no),g(no),q(no),ca(nx,nlam),a0(nlam),flog(nlam); integer ix(*),jx(*),nin(nlam),ia(nx); %fortran double precision, dimension (:), allocatable :: w,f %mortran if minval(y).lt.0.0 < jerr=8888; return;> allocate(w(1:no),stat=jerr); if(jerr.ne.0) return; allocate(f(1:no),stat=jerr); if(jerr.ne.0) return; w=max(0d0,q); sw=sum(w); if sw.le.0.0 < jerr=9999; go to :done:;> yb=dot_product(w,y)/sw; fmax=log(huge(y(1))*0.1); f=f+g; s=dot_product(w,y*f-exp(sign(min(abs(f),fmax),f))); flog(lam)=2.0*(sw*yb*(log(yb)-1.0)-s); > :done: deallocate(w,f); return; end; subroutine multelnet(parm,no,ni,nr,x,y,w,jd,vp,cl,ne,nx,nlam, flmin,ulam,thr,isd,jsd,intr,maxit, lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr); implicit double precision(a-h,o-z); double precision x(no,ni),y(no,nr),w(no),vp(ni),ca(nx,nr,nlam); double precision ulam(nlam),a0(nr,nlam),rsq(nlam),alm(nlam),cl(2,ni); integer jd(*),ia(nx),nin(nlam); %fortran double precision, dimension (:), allocatable :: vq; %mortran if maxval(vp).le.0.0 < jerr=10000; return;> allocate(vq(1:ni),stat=jerr); if(jerr.ne.0) return; vq=max(0d0,vp); vq=vq*ni/sum(vq); call multelnetn(parm,no,ni,nr,x,y,w,jd,vq,cl,ne,nx,nlam,flmin,ulam,thr,isd, jsd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr); deallocate(vq); return; end; subroutine multelnetn(parm,no,ni,nr,x,y,w,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr, isd,jsd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr); implicit double precision(a-h,o-z); double precision vp(ni),x(no,ni),y(no,nr),w(no),ulam(nlam),cl(2,ni); double precision ca(nx,nr,nlam),a0(nr,nlam),rsq(nlam),alm(nlam); integer jd(*),ia(nx),nin(nlam); %fortran double precision, dimension (:), allocatable :: xm,xs,xv,ym,ys integer, dimension (:), allocatable :: ju double precision, dimension (:,:,:), allocatable :: clt allocate(clt(1:2,1:nr,1:ni),stat=jerr); if(jerr.ne.0) return %mortran allocate(xm(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(xs(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(ym(1:nr),stat=jerr); if(jerr.ne.0) return; allocate(ys(1:nr),stat=jerr); if(jerr.ne.0) return; allocate(ju(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(xv(1:ni),stat=jerr); if(jerr.ne.0) return; call chkvars(no,ni,x,ju); if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0; if maxval(ju).le.0 < jerr=7777; return;> call multstandard1(no,ni,nr,x,y,w,isd,jsd,intr,ju,xm,xs,ym,ys,xv,ys0,jerr); if(jerr.ne.0) return; >> if isd.gt.0 < >>> if jsd.gt.0 < >>> call multelnet2(parm,ni,nr,ju,vp,clt,y,no,ne,nx,x,nlam,flmin,ulam,thr,maxit,xv, ys0,lmu,ca,ia,nin,rsq,alm,nlp,jerr); if(jerr.gt.0) return; if intr.eq.0 < a0(j,k)=0.0;> else < a0(j,k)=ym(j)-dot_product(ca(1:nk,j,k),xm(ia(1:nk)));> > > deallocate(xm,xs,ym,ys,ju,xv,clt); return; end; subroutine multstandard1(no,ni,nr,x,y,w,isd,jsd,intr,ju, xm,xs,ym,ys,xv,ys0,jerr); implicit double precision(a-h,o-z); double precision x(no,ni),y(no,nr),w(no),xm(ni),xs(ni),xv(ni),ym(nr),ys(nr); integer ju(ni); %fortran double precision, dimension (:), allocatable :: v %mortran allocate(v(1:no),stat=jerr); if(jerr.ne.0) return; w=w/sum(w); v=sqrt(w); if intr.eq.0 < else < xs(j)=1.0; xv(j)=z;> > ys0=0.0; else < ys(j)=1.0; ys0=ys0+z;> > go to :out:; > if isd.eq.0 < xs=1.0;> else < xv=1.0; > ys0=0.0; else < ys0=ys0+z;> > if jsd.eq.0 < ys=1.0;> else < ys0=nr;> :out:deallocate(v); return; end; subroutine multelnet2(beta,ni,nr,ju,vp,cl,y,no,ne,nx,x,nlam,flmin,ulam,thri, maxit,xv,ys0,lmu,ao,ia,kin,rsqo,almo,nlp,jerr); implicit double precision(a-h,o-z); double precision vp(ni),y(no,nr),x(no,ni),ulam(nlam),ao(nx,nr,nlam); double precision rsqo(nlam),almo(nlam),xv(ni),cl(2,nr,ni); integer ju(ni),ia(nx),kin(nlam); %fortran double precision, dimension (:), allocatable :: g,gk,del,gj integer, dimension (:), allocatable :: mm,ix,isc double precision, dimension (:,:), allocatable :: a allocate(a(1:nr,1:ni),stat=jerr) if(jerr.ne.0) return %mortran call get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx,itrace); allocate(gj(1:nr),stat=jerr); if(jerr.ne.0) return; allocate(gk(1:nr),stat=jerr); if(jerr.ne.0) return; allocate(del(1:nr),stat=jerr); if(jerr.ne.0) return; allocate(mm(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(g(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(ix(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(isc(1:nr),stat=jerr); if(jerr.ne.0) return; bta=beta; omb=1.0-bta; ix=0; thr=thri*ys0/nr; "Begin: added by Naras" alf=1.0; "End: added by Naras" if flmin.lt.1.0 < eqs=max(eps,flmin); alf=eqs**(1.0/(nlam-1));> rsq=ys0; a=0.0; mm=0; /nlp,nin/=0; iz=0; mnl=min(mnlam,nlam); alm=0.0; g(j)=sqrt(g(j)); > elseif m.gt.2 < alm=alm*alf;> elseif m.eq.1 < alm=big;> else < alm0=0.0; alm0=alm0/max(bta,1.0d-3); alm=alf*alm0; > dem=alm*omb; ab=alm*bta; rsq0=rsq; jz=1; tlam=bta*(2.0*alm-alm0); loop < if(iz*jz.ne.0) go to :b:; :again:nlp=nlp+1; dlx=0.0; gkn=sqrt(gkn); u=1.0-ab*vp(k)/gkn; del=a(:,k); if u.le.0.0 < a(:,k)=0.0;> else < a(:,k)=gk*(u/(xv(k)+dem*vp(k))); call chkbnds(nr,gk,gkn,xv(k),cl(1,1,k), dem*vp(k),ab*vp(k),a(:,k),isc,jerr); if(jerr.ne.0) return; > del=a(:,k)-del; if(maxval(abs(del)).le.0.0) next; if mm(k).eq.0 < nin=nin+1; if(nin.gt.nx) exit; mm(k)=nin; ia(nin)=k; > > if(nin.gt.nx) exit; if dlx.lt.thr < ixx=0; g(k)=sqrt(g(k)); if g(k).gt.ab*vp(k) < ix(k)=1; ixx=1;> > if(ixx.eq.1) go to :again:; exit; > if nlp.gt.maxit < jerr=-m; return;> :b: iz=1; loop < nlp=nlp+1; dlx=0.0; gkn=sqrt(gkn); u=1.0-ab*vp(k)/gkn; del=a(:,k); if u.le.0.0 < a(:,k)=0.0;> else < a(:,k)=gk*(u/(xv(k)+dem*vp(k))); call chkbnds(nr,gk,gkn,xv(k),cl(1,1,k), dem*vp(k),ab*vp(k),a(:,k),isc,jerr); if(jerr.ne.0) return; > del=a(:,k)-del; if(maxval(abs(del)).le.0.0) next; > if(dlx.lt.thr) exit; if nlp.gt.maxit < jerr=-m; return;> > jz=0; > if nin.gt.nx < jerr=-10000-m; exit;> if nin.gt.0 < > kin(m)=nin; rsqo(m)=1.0-rsq/ys0; almo(m)=alm; lmu=m; if(m.lt.mnl) next; if(flmin.ge.1.0) next; me=0; if(me.gt.ne) exit; if(rsq0-rsq.lt.sml*rsq) exit; if(rsqo(m).gt.rsqmax) exit; > deallocate(a,mm,g,ix,del,gj,gk); return; end; subroutine chkbnds(nr,gk,gkn,xv,cl,al1,al2,a,isc,jerr); implicit double precision(a-h,o-z); double precision gk(nr),cl(2,nr),a(nr); integer isc(nr); kerr=0; al1p=1.0+al1/xv; al2p=al2/xv; isc=0; gsq=gkn**2; asq=dot_product(a,a); usq=0.0; "Begin: Added by Naras" u=0.0; kn=-1; "End: Added by Naras" loop < vmx=0.0; > if(vmx.le.0.0) exit; if(isc(kn).ne.0) exit; gsq=gsq-gk(kn)**2; g=sqrt(gsq)/xv; if(a(kn).lt.cl(1,kn)) u=cl(1,kn); if(a(kn).gt.cl(2,kn)) u=cl(2,kn); usq=usq+u**2; if usq.eq.0.0 < b=max(0d0,(g-al2p)/al1p);> else < b0=sqrt(asq-a(kn)**2); b=bnorm(b0,al1p,al2p,g,usq,kerr); if(kerr.ne.0) exit; > asq=usq+b**2; if asq.le.0.0 < a=0.0; exit;> a(kn)=u; isc(kn)=1; f=1.0/(xv*(al1p+al2p/sqrt(asq))); > if(kerr.ne.0) jerr=kerr; return; end; subroutine chkbnds1(nr,gk,gkn,xv,cl1,cl2,al1,al2,a,isc,jerr); implicit double precision(a-h,o-z); double precision gk(nr),a(nr); integer isc(nr); kerr=0; al1p=1.0+al1/xv; al2p=al2/xv; isc=0; gsq=gkn**2; asq=dot_product(a,a); usq=0.0; "Begin: added by Naras" u=0.0; kn=-1; "End: added by Naras" loop < vmx=0.0; > if(vmx.le.0.0) exit; if(isc(kn).ne.0) exit; gsq=gsq-gk(kn)**2; g=sqrt(gsq)/xv; if(a(kn).lt.cl1) u=cl1; if(a(kn).gt.cl2) u=cl2; usq=usq+u**2; if usq.eq.0.0 < b=max(0d0,(g-al2p)/al1p);> else < b0=sqrt(asq-a(kn)**2); b=bnorm(b0,al1p,al2p,g,usq,kerr); if(kerr.ne.0) exit; > asq=usq+b**2; if asq.le.0.0 < a=0.0; exit;> a(kn)=u; isc(kn)=1; f=1.0/(xv*(al1p+al2p/sqrt(asq))); > if(kerr.ne.0) jerr=kerr; return; end; function bnorm(b0,al1p,al2p,g,usq,jerr); implicit double precision(a-h,o-z); data thr,mxit /1.0d-10,100/; b=b0; zsq=b**2+usq; if zsq.le.0.0 < bnorm=0.0; return;> z=sqrt(zsq); f=b*(al1p+al2p/z)-g; jerr=0; z=sqrt(zsq); f=b*(al1p+al2p/z)-g; if(abs(f).le.thr) exit; if b.le.0.0 < b=0.0; exit;> > bnorm=b; if(it.ge.mxit) jerr=90000; return; "Begin: Edited by Naras" entry chg_bnorm(arg,irg); bnorm = 0.0; thr=arg; mxit=irg; return; entry get_bnorm(arg,irg); bnorm = 0.0; arg=thr; irg=mxit; return; "End: Edited by Naras" end; subroutine multsolns(ni,nx,nr,lmu,a,ia,nin,b); implicit double precision(a-h,o-z); double precision a(nx,nr,lmu),b(ni,nr,lmu); integer ia(nx),nin(lmu); return; end; subroutine multuncomp(ni,nr,nx,ca,ia,nin,a); implicit double precision(a-h,o-z); double precision ca(nx,nr),a(ni,nr); integer ia(nx); a=0.0; if nin.gt.0 < > return; end; subroutine multmodval(nx,nr,a0,ca,ia,nin,n,x,f); implicit double precision(a-h,o-z); double precision a0(nr),ca(nx,nr),x(n,*),f(nr,n); integer ia(nx); if(nin.le.0) return; > return; end; subroutine multspelnet(parm,no,ni,nr,x,ix,jx,y,w,jd,vp,cl,ne,nx, nlam,flmin,ulam,thr,isd, jsd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr); implicit double precision(a-h,o-z); double precision x(*),y(no,nr),w(no),vp(ni),ulam(nlam),cl(2,ni); double precision ca(nx,nr,nlam),a0(nr,nlam),rsq(nlam),alm(nlam); integer ix(*),jx(*),jd(*),ia(nx),nin(nlam); %fortran double precision, dimension (:), allocatable :: vq; %mortran if maxval(vp).le.0.0 < jerr=10000; return;> allocate(vq(1:ni),stat=jerr); if(jerr.ne.0) return; vq=max(0d0,vp); vq=vq*ni/sum(vq); call multspelnetn(parm,no,ni,nr,x,ix,jx,y,w,jd,vq,cl,ne,nx,nlam,flmin, ulam,thr,isd,jsd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr); deallocate(vq); return; end; subroutine multspelnetn(parm,no,ni,nr,x,ix,jx,y,w,jd,vp,cl,ne,nx,nlam,flmin, ulam,thr,isd,jsd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr); implicit double precision(a-h,o-z); double precision x(*),vp(ni),y(no,nr),w(no),ulam(nlam),cl(2,ni); double precision ca(nx,nr,nlam),a0(nr,nlam),rsq(nlam),alm(nlam); integer ix(*),jx(*),jd(*),ia(nx),nin(nlam); %fortran double precision, dimension (:), allocatable :: xm,xs,xv,ym,ys integer, dimension (:), allocatable :: ju double precision, dimension (:,:,:), allocatable :: clt allocate(clt(1:2,1:nr,1:ni),stat=jerr) if(jerr.ne.0) return %mortran allocate(xm(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(xs(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(ym(1:nr),stat=jerr); if(jerr.ne.0) return; allocate(ys(1:nr),stat=jerr); if(jerr.ne.0) return; allocate(ju(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(xv(1:ni),stat=jerr); if(jerr.ne.0) return; call spchkvars(no,ni,x,ix,ju); if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0; if maxval(ju).le.0 < jerr=7777; return;> call multspstandard1(no,ni,nr,x,ix,jx,y,w,ju,isd,jsd,intr, xm,xs,ym,ys,xv,ys0,jerr); if(jerr.ne.0) return; >> if isd.gt.0 < >>> if jsd.gt.0 < >>> call multspelnet2(parm,ni,nr,y,w,no,ne,nx,x,ix,jx,ju,vp,clt,nlam,flmin, ulam,thr,maxit,xm,xs,xv,ys0,lmu,ca,ia,nin,rsq,alm,nlp,jerr); if(jerr.gt.0) return; if intr.eq.0 < a0(j,k)=0.0;> else < a0(j,k)=ym(j)-dot_product(ca(1:nk,j,k),xm(ia(1:nk)));> > > deallocate(xm,xs,ym,ys,ju,xv,clt); return; end; subroutine multspstandard1(no,ni,nr,x,ix,jx,y,w,ju,isd,jsd,intr, xm,xs,ym,ys,xv,ys0,jerr); implicit double precision(a-h,o-z); double precision x(*),y(no,nr),w(no),xm(ni),xs(ni),xv(ni),ym(nr),ys(nr); integer ix(*),jx(*),ju(ni); "Start: Naras Edit" jerr = jerr*1; "End: Naras Edit" w=w/sum(w); if intr.eq.0 < else < xs(j)=1.0; xv(j)=z;> > ys0=0.0; else < ys(j)=1.0; ys0=ys0+z;> > return; > if isd.eq.0 < xs=1.0;> else < xv=1.0;> ys0=0.0; else < ys0=ys0+z;> > if jsd.eq.0 < ys=1.0;> else < ys0=nr;> return; end; subroutine multspelnet2(beta,ni,nr,y,w,no,ne,nx,x,ix,jx,ju,vp,cl,nlam,flmin, ulam,thri,maxit,xm,xs,xv,ys0,lmu,ao,ia,kin,rsqo,almo,nlp,jerr); implicit double precision(a-h,o-z); double precision y(no,nr),w(no),x(*),vp(ni),ulam(nlam),cl(2,nr,ni); double precision ao(nx,nr,nlam),rsqo(nlam),almo(nlam),xm(ni),xs(ni),xv(ni); integer ix(*),jx(*),ju(ni),ia(nx),kin(nlam); %fortran double precision, dimension (:), allocatable :: g,gj,gk,del,o integer, dimension (:), allocatable :: mm,iy,isc double precision, dimension (:,:), allocatable :: a allocate(a(1:nr,1:ni),stat=jerr) if(jerr.ne.0) return %mortran call get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx,itrace); allocate(mm(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(g(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(gj(1:nr),stat=jerr); if(jerr.ne.0) return; allocate(gk(1:nr),stat=jerr); if(jerr.ne.0) return; allocate(del(1:nr),stat=jerr); if(jerr.ne.0) return; allocate(o(1:nr),stat=jerr); if(jerr.ne.0) return; allocate(iy(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(isc(1:nr),stat=jerr); if(jerr.ne.0) return; bta=beta; omb=1.0-bta; alm=0.0; iy=0; thr=thri*ys0/nr; "Begin: added by Naras" alf=1.0; "End: added by Naras" if flmin.lt.1.0 < eqs=max(eps,flmin); alf=eqs**(1.0/(nlam-1));> rsq=ys0; a=0.0; mm=0; o=0.0; /nlp,nin/=0; iz=0; mnl=min(mnlam,nlam); g(j)=sqrt(g(j)); > elseif m.gt.2 < alm=alm*alf;> elseif m.eq.1 < alm=big;> else < alm0=0.0; alm0=alm0/max(bta,1.0d-3); alm=alf*alm0; > dem=alm*omb; ab=alm*bta; rsq0=rsq; jz=1; tlam=bta*(2.0*alm-alm0); loop < if(iz*jz.ne.0) go to :b:; :again:nlp=nlp+1; dlx=0.0; gkn=sqrt(gkn); u=1.0-ab*vp(k)/gkn; del=a(:,k); if u.le.0.0 < a(:,k)=0.0;> else < a(:,k)=gk*(u/(xv(k)+dem*vp(k))); call chkbnds(nr,gk,gkn,xv(k),cl(1,1,k), dem*vp(k),ab*vp(k),a(:,k),isc,jerr); if(jerr.ne.0) return; > del=a(:,k)-del; if(maxval(abs(del)).le.0.0) next; if mm(k).eq.0 < nin=nin+1; if(nin.gt.nx) exit; mm(k)=nin; ia(nin)=k; > > if(nin.gt.nx) exit; if dlx.lt.thr < ixx=0; g(j)=sqrt(g(j)); if g(j).gt.ab*vp(j) < iy(j)=1; ixx=1;> > if(ixx.eq.1) go to :again:; exit; > if nlp.gt.maxit < jerr=-m; return;> :b: iz=1; loop < nlp=nlp+1; dlx=0.0; gkn=sqrt(gkn); u=1.0-ab*vp(k)/gkn; del=a(:,k); if u.le.0.0 < a(:,k)=0.0;> else < a(:,k)=gk*(u/(xv(k)+dem*vp(k))); call chkbnds(nr,gk,gkn,xv(k),cl(1,1,k), dem*vp(k),ab*vp(k),a(:,k),isc,jerr); if(jerr.ne.0) return; > del=a(:,k)-del; if(maxval(abs(del)).le.0.0) next; > if(dlx.lt.thr) exit; if nlp.gt.maxit < jerr=-m; return;> > jz=0; > if nin.gt.nx < jerr=-10000-m; exit;> if nin.gt.0 < > kin(m)=nin; rsqo(m)=1.0-rsq/ys0; almo(m)=alm; lmu=m; if(m.lt.mnl) next; if(flmin.ge.1.0) next; me=0; if(me.gt.ne) exit; if(rsq0-rsq.lt.sml*rsq) exit; if(rsqo(m).gt.rsqmax) exit; > deallocate(a,mm,g,iy,gj,gk,del,o); return; end; subroutine multlognetn(parm,no,ni,nc,x,y,g,w,ju,vp,cl,ne,nx,nlam,flmin,ulam, shri,intr,maxit,xv,lmu,a0,a,m,kin,dev0,dev,alm,nlp,jerr); implicit double precision(a-h,o-z); double precision x(no,ni),y(no,nc),g(no,nc),w(no),vp(ni),ulam(nlam),cl(2,ni); double precision a(nx,nc,nlam),a0(nc,nlam),dev(nlam),alm(nlam),xv(ni); integer ju(ni),m(nx),kin(nlam); %fortran double precision, dimension (:,:), allocatable :: q,r,b,bs double precision, dimension (:), allocatable :: sxp,sxpl,ga,gk,del integer, dimension (:), allocatable :: mm,is,ixx,isc allocate(b(0:ni,1:nc),stat=jerr) if(jerr.ne.0) return allocate(bs(0:ni,1:nc),stat=jerr) if(jerr.ne.0) return allocate(q(1:no,1:nc),stat=jerr) if(jerr.ne.0) return allocate(r(1:no,1:nc),stat=jerr) if(jerr.ne.0) return %mortran call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx,itrace); exmn=-exmx; allocate(mm(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(is(1:max(nc,ni)),stat=jerr); if(jerr.ne.0) return; allocate(sxp(1:no),stat=jerr); if(jerr.ne.0) return; allocate(sxpl(1:no),stat=jerr); if(jerr.ne.0) return; allocate(ga(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(ixx(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(gk(1:nc),stat=jerr); if(jerr.ne.0) return; allocate(del(1:nc),stat=jerr); if(jerr.ne.0) return; allocate(isc(1:nc),stat=jerr); if(jerr.ne.0) return; pmax=1.0-pmin; emin=pmin/pmax; emax=1.0/emin; bta=parm; omb=1.0-bta; dev1=0.0; dev0=0.0; if q0.ge.pmax < jerr =9000+ic; return;> if intr.eq.0 < q0=1.0/nc; b(0,ic)=0.0;> else < b(0,ic)=log(q0); dev1=dev1-q0*b(0,ic);> b(1:ni,ic)=0.0; > if(intr.eq.0) dev1=log(float(nc)); ixx=0; al=0.0; if nonzero(no*nc,g).eq.0 < b(0,:)=b(0,:)-sum(b(0,:))/nc; sxp=0.0; > else < sxp=0.0; if intr.eq.0 < b(0,:)=0.0;> else < call kazero(nc,no,y,g,w,b(0,:),jerr); if(jerr.ne.0) return;> dev1=0.0; sxpl=w*log(sxp); > > dev0=dev0+dev1; "Begin: added by Naras" alf=1.0; "End: added by Naras" if flmin.lt.1.0 < eqs=max(eps,flmin); alf=eqs**(1.0/(nlam-1));> m=0; mm=0; nin=0; nlp=0; mnl=min(mnlam,nlam); bs=0.0; shr=shri*dev0; ga=0.0; > ga=sqrt(ga); elseif ilm.gt.2 < al=al*alf;> elseif ilm.eq.1 < al=big;> else < al0=0.0; al0=al0/max(bta,1.0d-3); al=alf*al0; > al2=al*omb; al1=al*bta; tlam=bta*(2.0*al-al0); :again:continue; loop < /ix,jx,kx/=0; t=0.0; if t.lt.eps < kx=1; exit;> t=2.0*t; alt=al1/t; al2t=al2/t; > loop < nlp=nlp+nc; dlx=0.0; gkn=sqrt(gkn); u=1.0-alt*vp(k)/gkn; del=b(k,:); if u.le.0.0 < b(k,:)=0.0;> else < b(k,:)=gk*(u/(xv(k)+vp(k)*al2t)); call chkbnds1(nc,gk,gkn,xv(k),cl(1,k), cl(2,k),vp(k)*al2t,alt*vp(k),b(k,:),isc,jerr); if(jerr.ne.0) return; > del=b(k,:)-del; if(maxval(abs(del)).le.0.0) next; if mm(k).eq.0 < nin=nin+1; if nin.gt.nx < jx=1; exit;> mm(k)=nin; m(nin)=k; > > if(jx.gt.0) exit; if(dlx.lt.shr) exit; if nlp.gt.maxit < jerr=-ilm; return;> loop < nlp=nlp+nc; dlx=0.0; gkn=sqrt(gkn); u=1.0-alt*vp(k)/gkn; del=b(k,:); if u.le.0.0 < b(k,:)=0.0;> else < b(k,:)=gk*(u/(xv(k)+vp(k)*al2t)); call chkbnds1(nc,gk,gkn,xv(k),cl(1,k), cl(2,k),vp(k)*al2t,alt*vp(k),b(k,:),isc,jerr); if(jerr.ne.0) return; > del=b(k,:)-del; if(maxval(abs(del)).le.0.0) next; > if(dlx.lt.shr) exit; if nlp.gt.maxit < jerr=-ilm; return;> > > if(jx.gt.0) exit; > > > s=-sum(b(0,:))/nc; b(0,:)=b(0,:)+s; if(jx.gt.0) exit; if ix.eq.0 < > ga=sqrt(ga); > if(ix.eq.1) go to :again:; exit; > > if kx.gt.0 < jerr=-20000-ilm; exit;> if jx.gt.0 < jerr=-10000-ilm; exit;> devi=0.0; > kin(ilm)=nin; alm(ilm)=al; lmu=ilm; dev(ilm)=(dev1-devi)/dev0; if(ilm.lt.mnl) next; if(flmin.ge.1.0) next; me=0; if(me.gt.ne) exit; if(dev(ilm).gt.devmax) exit; if(dev(ilm)-dev(ilm-1).lt.sml) exit; > g=log(q); deallocate(sxp,b,bs,r,q,mm,is,ga,ixx,gk,del,sxpl); return; end; subroutine multsprlognetn(parm,no,ni,nc,x,ix,jx,y,g,w,ju,vp,cl,ne,nx,nlam, flmin,ulam,shri,intr,maxit,xv,xb,xs,lmu,a0,a,m,kin,dev0,dev,alm,nlp,jerr); implicit double precision(a-h,o-z); double precision x(*),y(no,nc),g(no,nc),w(no),vp(ni); double precision ulam(nlam),xb(ni),xs(ni),xv(ni); double precision a(nx,nc,nlam),a0(nc,nlam),dev(nlam),alm(nlam),cl(2,ni); integer ix(*),jx(*),ju(ni),m(nx),kin(nlam); %fortran double precision, dimension (:,:), allocatable :: q,r,b,bs double precision, dimension (:), allocatable :: sxp,sxpl,ga,gk double precision, dimension (:), allocatable :: del,sc,svr integer, dimension (:), allocatable :: mm,is,iy,isc allocate(b(0:ni,1:nc),stat=jerr) if(jerr.ne.0) return allocate(bs(0:ni,1:nc),stat=jerr) if(jerr.ne.0) return allocate(q(1:no,1:nc),stat=jerr) if(jerr.ne.0) return allocate(r(1:no,1:nc),stat=jerr) if(jerr.ne.0) return %mortran call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx,itrace); exmn=-exmx; allocate(mm(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(ga(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(gk(1:nc),stat=jerr); if(jerr.ne.0) return; allocate(del(1:nc),stat=jerr); if(jerr.ne.0) return; allocate(iy(1:ni),stat=jerr); if(jerr.ne.0) return; allocate(is(1:max(nc,ni)),stat=jerr); if(jerr.ne.0) return; allocate(sxp(1:no),stat=jerr); if(jerr.ne.0) return; allocate(sxpl(1:no),stat=jerr); if(jerr.ne.0) return; allocate(svr(1:nc),stat=jerr); if(jerr.ne.0) return; allocate(sc(1:no),stat=jerr); if(jerr.ne.0) return; allocate(isc(1:nc),stat=jerr); if(jerr.ne.0) return; pmax=1.0-pmin; emin=pmin/pmax; emax=1.0/emin; bta=parm; omb=1.0-bta; dev1=0.0; dev0=0.0; if q0.ge.pmax < jerr =9000+ic; return;> b(1:ni,ic)=0.0; if intr.eq.0 < q0=1.0/nc; b(0,ic)=0.0;> else < b(0,ic)=log(q0); dev1=dev1-q0*b(0,ic);> > if(intr.eq.0) dev1=log(float(nc)); iy=0; al=0.0; if nonzero(no*nc,g).eq.0 < b(0,:)=b(0,:)-sum(b(0,:))/nc; sxp=0.0; > else < sxp=0.0; if intr.eq.0 < b(0,:)=0.0;> else < call kazero(nc,no,y,g,w,b(0,:),jerr); if(jerr.ne.0) return;> dev1=0.0; sxpl=w*log(sxp); > > dev0=dev0+dev1; "Begin: added by Naras" alf=1.0; "End: added by Naras" if flmin.lt.1.0 < eqs=max(eps,flmin); alf=eqs**(1.0/(nlam-1));> m=0; mm=0; nin=0; nlp=0; mnl=min(mnlam,nlam); bs=0.0; shr=shri*dev0; ga=0.0; > ga=sqrt(ga); elseif ilm.gt.2 < al=al*alf;> elseif ilm.eq.1 < al=big;> else < al0=0.0; al0=al0/max(bta,1.0d-3); al=alf*al0; > al2=al*omb; al1=al*bta; tlam=bta*(2.0*al-al0); :again:continue; loop < /ixx,jxx,kxx/=0; t=0.0; if t.lt.eps < kxx=1; exit;> t=2.0*t; alt=al1/t; al2t=al2/t; > loop < nlp=nlp+nc; dlx=0.0; gkn=sqrt(gkn); u=1.0-alt*vp(k)/gkn; if u.le.0.0 < b(k,:)=0.0;> else < b(k,:)=gk*(u/(xv(k)+vp(k)*al2t)); call chkbnds1(nc,gk,gkn,xv(k),cl(1,k),cl(2,k), vp(k)*al2t,alt*vp(k),b(k,:),isc,jerr); if(jerr.ne.0) return; > del=b(k,:)-del; if(maxval(abs(del)).le.0.0) next; if mm(k).eq.0 < nin=nin+1; if nin.gt.nx < jxx=1; exit;> mm(k)=nin; m(nin)=k; > > if(jxx.gt.0) exit; if(dlx.lt.shr) exit; if nlp.gt.maxit < jerr=-ilm; return;> loop < nlp=nlp+nc; dlx=0.0; gkn=sqrt(gkn); u=1.0-alt*vp(k)/gkn; if u.le.0.0 < b(k,:)=0.0;> else < b(k,:)=gk*(u/(xv(k)+vp(k)*al2t)); call chkbnds1(nc,gk,gkn,xv(k),cl(1,k),cl(2,k), vp(k)*al2t,alt*vp(k),b(k,:),isc,jerr); if(jerr.ne.0) return; > del=b(k,:)-del; if(maxval(abs(del)).le.0.0) next; > if(dlx.lt.shr) exit; if nlp.gt.maxit < jerr=-ilm; return;> > > if(jxx.gt.0) exit; > > sc=b(0,ic)+g(:,ic); b0=0.0; sc=min(max(exmn,sc+b0),exmx); sxp=sxp-q(:,ic); q(:,ic)=min(max(emin*sxp,exp(sc)),emax*sxp); sxp=sxp+q(:,ic); > s=sum(b(0,:))/nc; b(0,:)=b(0,:)-s; if(jxx.gt.0) exit; if ixx.eq.0 < > ga=sqrt(ga); > if(ixx.eq.1) go to :again:; exit; > > if kxx.gt.0 < jerr=-20000-ilm; exit;> if jxx.gt.0 < jerr=-10000-ilm; exit;> devi=0.0; > kin(ilm)=nin; alm(ilm)=al; lmu=ilm; dev(ilm)=(dev1-devi)/dev0; if(ilm.lt.mnl) next; if(flmin.ge.1.0) next; me=0; if(me.gt.ne) exit; if(dev(ilm).gt.devmax) exit; if(dev(ilm)-dev(ilm-1).lt.sml) exit; > g=log(q); deallocate(sxp,b,bs,r,q,mm,is,sc,ga,iy,gk,del,sxpl); return; end; %fortran subroutine psort7(v,a,ii,jj) implicit double precision(a-h,o-z) c c puts into a the permutation vector which sorts v into c increasing order. the array v is not modified. c only elements from ii to jj are considered. c arrays iu(k) and il(k) permit sorting up to 2**(k+1)-1 elements c c this is a modification of cacm algorithm #347 by r. c. singleton, c which is a modified hoare quicksort. c dimension a(jj),v(jj),iu(20),il(20) integer t,tt integer a double precision v m=1 i=ii j=jj 10 if (i.ge.j) go to 80 20 k=i ij=(j+i)/2 t=a(ij) vt=v(t) if (v(a(i)).le.vt) go to 30 a(ij)=a(i) a(i)=t t=a(ij) vt=v(t) 30 l=j if (v(a(j)).ge.vt) go to 50 a(ij)=a(j) a(j)=t t=a(ij) vt=v(t) if (v(a(i)).le.vt) go to 50 a(ij)=a(i) a(i)=t t=a(ij) vt=v(t) go to 50 40 a(l)=a(k) a(k)=tt 50 l=l-1 if (v(a(l)).gt.vt) go to 50 tt=a(l) vtt=v(tt) 60 k=k+1 if (v(a(k)).lt.vt) go to 60 if (k.le.l) go to 40 if (l-i.le.j-k) go to 70 il(m)=i iu(m)=l i=k m=m+1 go to 90 70 il(m)=k iu(m)=j j=l m=m+1 go to 90 80 m=m-1 if (m.eq.0) return i=il(m) j=iu(m) 90 if (j-i.gt.10) go to 20 if (i.eq.ii) go to 10 i=i-1 100 i=i+1 if (i.eq.j) go to 80 t=a(i+1) vt=v(t) if (v(a(i)).le.vt) go to 100 k=i 110 a(k+1)=a(k) k=k-1 if (vt.lt.v(a(k))) go to 110 a(k+1)=t go to 100 end %% glmnet/inst/mortran/README.Rmd0000644000176200001440000000521513542237467015620 0ustar liggesusers# Changes in Mortran and R ## Tracing progress fixes in Mortran and R 1. Changed the function definition ``` subroutine get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx); ``` to ``` subroutine get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx,itrace); ``` taking on itrace as a switch for tracing progress. Added an `entry chg_itrace` to change `itrace`. 2. Changed all calls to `get_int_parms` to include extra parameter. 3. Corresponding changes to `glmnet.control.R` to include `itrace` as a parameter. 4. Fixes in `relax.glmnet.R` for displaying the progress by temporarily turning off and on tracing, if it was on. ## Unused variable fixes in Mortran. 1. The subroutines `spstandard`, `spstandard1`, `multspstandard1` had `jerr` as an unused argument. 2. The subroutines `coxnet1`, `fishnet1`, `spfishnet1` had `isd` as an unused argument. 3. The subroutine `risk` had `ni` as an unusued argument. In all these cases, I merely added a _no-op_ statement to the function/subroutine (e.g. `jerr = jerr * 1` or `ni = ni * 1`) to stop compiler warnings. More advanced compilers may detect these shenanigans. We can address that later if it comes up. ## Some extraneous tabs in Mortran. 1. The subroutine `multstandard1` has an extra tabl between the arguments `ju` and `xm` that I removed. This is most likely because Emacs replaces 8 spaces with tabs. ## Uninitialized variable in Mortran 1. The `gfortran` compiler warns that the variable `alf` is uninitialized in `elnet1`. The logic is correct, but the compiler is unable to detect it. So I initialized `alf=1` and combined it with a previous fix for `alm=0.0` in `elnet1`. I am reasonably certain this will not affect any logic. ## Generating Fortran from Mortran Note that it is Mortran processing that generates unusued labels. So each time you run Mortran to generate the Fortran, you will have to deal with the problem of unused labels. No worries, however, if you follow this procedure. 1. Install the latest [`SUtools`](https://github.com/bnaras/SUtools) package, after deleting your old one, if you had it. 2. Execute the following, assuming `GLMNET_DIR` is your `glmnet` package directory. ```{r, eval = FALSE} library(SUtools) GLMNET_DIR <- "~/GitHub/glmnet" mortran <- readLines(file.path(GLMNET_DIR, "inst", "mortran", "glmnet5dpclean.m")) fortran <- generate_fortran(mortran) fixed_fortran <- fix_unused_labels(fortran) ``` The fixed fortran file can now be written out to a file. For example, you may choose to overwrite the old fortran with the new fortran. ```{r, eval = FALSE} writeLines(fixed_fortran, file.path(GLMNET_DIR, "src", "glmnet5dpclean.f")) ``` glmnet/inst/doc/0000755000176200001440000000000013574046177013300 5ustar liggesusersglmnet/inst/doc/relax.R0000644000176200001440000001067113574046174014540 0ustar liggesusers## ------------------------------------------------------------------------ library(glmnet) data(QuickStartExample) fit=glmnet(x,y, relax=TRUE) print(fit) ## ------------------------------------------------------------------------ par(mfrow=c(1,3)) plot(fit) plot(fit,gamma=0.5) plot(fit,gamma=0) ## ------------------------------------------------------------------------ cfit=cv.glmnet(x,y,relax=TRUE) plot(cfit) ## ---- eval=FALSE--------------------------------------------------------- # predict(cvfit,newx) ## ------------------------------------------------------------------------ print(cfit) ## ----`relaxed`----------------------------------------------------------- fit=glmnet(x,y) fitr=relax.glmnet(fit,x=x,y=y) ## ------------------------------------------------------------------------ print(cfit) print.cv.glmnet(cfit) ## ------------------------------------------------------------------------ fitr=cv.glmnet(x,y,gamma=0,relax=TRUE) plot(fitr) ## ---- eval=FALSE--------------------------------------------------------- # fit=glmnet(x,y,trace=TRUE) ## ---- eval=FALSE--------------------------------------------------------- # fit=cv.glmnet(x,y,trace=TRUE) ## ---- eval=FALSE--------------------------------------------------------- # glmnet.control(itrace=1) ## ------------------------------------------------------------------------ data(CoxExample) ## ------------------------------------------------------------------------ cvfit=cv.glmnet(x,y,family="cox",type.measure="C") plot(cvfit) ## ------------------------------------------------------------------------ data(BinomialExample) itrain=1:70 fit=glmnet(x[itrain,],y[itrain],family="binomial",nlambda=20) assess.glmnet(fit,newx=x[-itrain,],newy=y[-itrain]) ## ---- eval=FALSE--------------------------------------------------------- # pred=predict(fit,newx=x[-itrain,]) # assess.glmnet(pred,newy=y[-itrain],family="binomial") ## ------------------------------------------------------------------------ glmnet.measures() ## ------------------------------------------------------------------------ cfit=cv.glmnet(x[itrain,],y[itrain],family="binomial", nlambda = 30) assess.glmnet(cfit,newx=x[-itrain,],newy=y[-itrain]) ## ------------------------------------------------------------------------ assess.glmnet(cfit,newx=x[-itrain,],newy=y[-itrain], s="lambda.min") ## ------------------------------------------------------------------------ cfit=cv.glmnet(x,y,family="binomial",keep=TRUE, nlambda = 30) assess.glmnet(cfit$fit.preval,newy=y,family="binomial") ## ------------------------------------------------------------------------ cfit=cv.glmnet(x,y,family="binomial", type.measure="auc", keep=TRUE) rocs=roc.glmnet(cfit$fit.preval,newy=y) which=match(cfit$lambda.min,cfit$lambda) plot(rocs[[which]],type="l") nopr=sapply(rocs,lines,col="grey") lines(rocs[[which]],lwd=2,col="red") ## ------------------------------------------------------------------------ data(MultinomialExample) set.seed(101) itrain=sample(1:500,400,replace=FALSE) cfit=cv.glmnet(x[itrain,],y[itrain],family="multinomial") cnf=confusion.glmnet(cfit,newx=x[-itrain,],newy=y[-itrain]) print(cnf) ## ------------------------------------------------------------------------ cfit=cv.glmnet(x,y,family="multinomial",type="class",keep=TRUE) cnf=confusion.glmnet(cfit$fit.preval,newy=y,family="multinomial") which=match(cfit$lambda.min,cfit$lambda) print(cnf[[which]]) ## ------------------------------------------------------------------------ data(BinomialExample) fit=bigGlm(x,y,family="binomial",lower.limits=-1) print(fit) ## ------------------------------------------------------------------------ set.seed(101) X = matrix(rnorm(20),10,2) X3=sample(letters[1:3],10,replace=TRUE) X4=sample(LETTERS[1:3],10,replace=TRUE) df=data.frame(X,X3,X4) makeX(df) ## ------------------------------------------------------------------------ makeX(df,sparse=TRUE) ## ------------------------------------------------------------------------ Xn=X Xn[3,1]=NA;Xn[5,2]=NA X3n=X3; X3n[6]=NA X4n=X4 X4n[9]=NA dfn=data.frame(Xn,X3n,X4n) makeX(dfn) ## ------------------------------------------------------------------------ makeX(dfn,na.impute=TRUE,sparse=TRUE) ## ------------------------------------------------------------------------ X = matrix(rnorm(10),5,2) X3=sample(letters[1:3],5,replace=TRUE) X4=sample(LETTERS[1:3],5,replace=TRUE) Xn=X Xn[3,1]=NA;Xn[5,2]=NA X3n=X3; X3n[1]=NA X4n=X4 X4n[2]=NA dftn=data.frame(Xn,X3n,X4n) makeX(dfn,dftn,na.impute=TRUE, sparse=TRUE) glmnet/inst/doc/Coxnet.Rmd0000644000176200001440000000677113556622666015222 0ustar liggesusers--- title: "Coxnet: Regularized Cox Regression" author: "Noah Simon, Jerome Friedman, Trevor Hastie and Rob Tibshirani" date: '`r Sys.Date()`' bibliography: assets/glmnet_refs.bib link-citations: true output: pdf_document: fig_caption: yes toc: yes toc_depth: 3 vignette: > %\VignetteIndexEntry{Coxnet: Regularized Cox Regression} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} --- ## Introduction We will give a short tutorial on using coxnet. Coxnet is a function which fits the Cox Model regularized by an elastic net penalty. It is used for underdetermined (or nearly underdetermined systems) and chooses a small number of covariates to include in the model. Because the Cox Model is rarely used for actual prediction, we will rather focus on finding and interpretating an appropriate model. We give a simple example of how to format data and run the Cox Model in glmnet with cross validation. Further details may be found in @coxnet, @strongrules and @block. ## Example We first load our data and set up the response. In this case $x$ must be an $n$ by $p$ matrix of covariate values --- each row corresponds to a patient and each column a covariate. $y$ is an $n$ length vector of failure/censoring times, and status is an $n$ length vector with each entry, a $1$ or a $0$, indicating whether the corresponding entry in $y$ is indicative of a failure time or right censoring time ($1$ for failure, $0$ for censoring) ```{r} library("glmnet") library("survival") patient.data <- readRDS("assets/coxnet.RDS") ``` We then call our functions to fit with the lasso penalty ($\alpha=1$), and cross validate. We set maxit = 1000 (increasing the maximum number of iterations to $1000$) because our data is relatively high dimensional, so more iterations are needed for convergence. In practice, the function will spit out an error if convergence isn't reached by the maximum number of iterations. ```{r, warning = TRUE} cv.fit <- cv.glmnet(patient.data$x, Surv(patient.data$time, patient.data$status), family="cox", maxit = 1000) fit <- glmnet(patient.data$x, Surv(patient.data$time,patient.data$status), family = "cox", maxit = 1000) ``` The Surv function packages the survival data into the form expected by glmnet. Once fit, we can view the optimal $\lambda$ value and a cross validated error plot to help evaluate our model. ```{r} plot(cv.fit) cv.fit$lambda.min ``` The left vertical line in our plot shows us where the CV-error curve hits its minimum. The right vertical line shows us the most regularized model with CV-error within$1$standard deviation of the minimum. In this case, we see that the minimum was achieved by a fairly regularized model, however the right line indicates that the null model (no coefficients included) is within$1$sd of the minimum. This might lead us to believe that in actuality the covariates are not explaining any variability. For the time being we will concern ourselves with the minimum CV-error model. We can check which covariates our model chose to be active, and see the coefficients of those covariates. ```{r} Coefficients <- coef(fit, s = cv.fit$lambda.min) Active.Index <- which(Coefficients != 0) Active.Coefficients <- Coefficients[Active.Index] ``` `coef(fit, s = cv.fit\$lambda.min)` returns the $p$ length coefficient vector of the solution corresponding to $\lambda =$`cv.fit$lambda.min`. ```{r} Active.Index Active.Coefficients ``` We see that our optimal model chose 2 active covariates ($X80$ and $X394$) each with a small positive effect on hazard. ## References glmnet/inst/doc/relax.Rmd0000644000176200001440000003516613560660761015066 0ustar liggesusers--- title: "Relaxed fits and other additions in `glmnet` 3.0" author: "Trevor Hastie, Balasubramanian Narasimhan and Rob Tibshirani" date: "October 15, 2019" bibliography: assets/glmnet_refs.bib link-citations: true output: pdf_document: fig_caption: yes toc: yes toc_depth: 3 vignette: > %\VignetteIndexEntry{Relaxed fits} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} --- ## Introduction In our vignette "glmnet" we give details for fitting lasso and elastic-net regularized models, for CV and various aspects of glmnet modeling. In this vignette, we highlight some of the new tools and features in the major revision glmnet 3.0. The main edition is the introduction of the *relaxed lasso*. The idea is to take a glmnet fitted object, and then for each lambda, refit the variables in the active set without any penalization. This gives the `relaxed` fit (note, there have been other definitions of a relaxed fit, but this is the one we prefer). This could of course be done for elastic net fits as well as lasso. However, if the number of variables gets too close to the sample size N, the relaxed path will be truncated. Furthermore, for binomial and other nonlinear GLMs convergence can be an issue with our current implementation if the number of variables is too large, and perversely if the relaxed fit is too strong. Suppose the `glmnet` fitted linear predictor at $\lambda$ is $\hat\eta_\lambda(x)$ and the relaxed version is $\tilde \eta_\lambda(x)$. We also allow for shrinkage between the two: $$\tilde \eta_{\lambda,\gamma}=(1-\gamma)\tilde \eta_\lambda(x)+\gamma\hat\eta_\lambda(x).$$ $\gamma\in[0,1]$ is an additional tuning parameter which can be selected by cross validation. The debiasing will potentially improve prediction performance, and CV will typically select a model with a smaller number of variables. This procedure is very competitive with forward-stepwise and best-subset regression, and has a considerable speed advantage when the number of variables is large. This is especially true for best-subset, but even so for forward stepwise. The latter has to plod through the variables one-at-a-time, while glmnet will just plunge in and find a good active set. Further details may be found in @glmnet, @coxnet, @strongrules, @block and @best_subset. ## Simple relaxed fit To get things going, we show the most basic use. We use the same data used in the `glmnet` vignette. ```{r} library(glmnet) data(QuickStartExample) fit=glmnet(x,y, relax=TRUE) print(fit) ``` There is an extra column `%Dev R` where the `R` stands for "relaxed", which is the percent deviance explained by the relaxed fit. This is always higher than its neighboring column, which is the same for the penalized fit (on the training data). The fit object is class `relaxed`, which inherits from class `glmnet`. One can plot it, with additional flexibility. ```{r} par(mfrow=c(1,3)) plot(fit) plot(fit,gamma=0.5) plot(fit,gamma=0) ``` So again, `gamma=1` is the traditional `glmnet` fit, while `gamma=0` is the unpenalized fit, and `gamma=0.5` is a mixture of the two (at the coefficient level, and hence also the linear predictors). We can also select `gamma` using `cv.glmnet`, which by default uses the 5 values `c(0, 0.25, 0.5, 0.75, 1)`. ```{r} cfit=cv.glmnet(x,y,relax=TRUE) plot(cfit) ``` The plot command has an `se.bands` option if you don't like the default shading of these bands. Just like before, you can make predictions from a CV object, and it uses the selected values for `lambda` and `gamma`. ```{r, eval=FALSE} predict(cvfit,newx) ``` A new feature in `glmnet` is a print method for `cv.glmnet` and a `cv.relaxed` object. ```{r} print(cfit) ``` ## More details on relaxed fitting Although `glmnet` has a `relax` option, you can created a relaxed version by post-processing a `glmnet` object. ```{r `relaxed`} fit=glmnet(x,y) fitr=relax.glmnet(fit,x=x,y=y) ``` This will rarely need to be done; one use case is if the original fit took a long time, and the user wanted to avoid refitting it. Note that in the call the arguments are named, since they are passed in via the `...` argument to `relax.glmnet`. Needless to say, *any* of the families fit by `glmnet` can also be fit with the `relaxed` option. As mentioned, a `relaxed` object is also a `glmnet` object. Apart from the class modification, it has an additional componet named `relaxed` which is itself a `glmnet` object, but with the relaxed coefficients. The default behavior of extractor functions like `predict` and `coef`, as well as `plot` will be to present results from the `glmnet` fit, unless a value of `gamma` is given different from the default value `gamma=1` (see the plots above). The `print` method gives additional info on the relaxed fit. Likewise, a `cv.relaxed` object inherits from class `cv.glmnet`. Here the `predict` method by default uses the optimal relaxed fit; if predictions from the CV-optimal *original* `glmnet` fit are desired, one can directly use `predict.cv.glmnet`. Similarly for the `print` command, which we illustrate here. ```{r} print(cfit) print.cv.glmnet(cfit) ``` ## Relaxed fits and glms `glmnet` itself is used to fit the relaxed fits, by using a single value of zero for `lambda`. However, for nonlinear models such as binomial, multinomial and poisson, there can be convergence issues. This is because `glmnet` does not do stepsize optimization, rather relying on the pathwise fit to stay in the "quadratic" zone of the log likelihood. We have an optional `path=TRUE` option for `relax.glmnet`, which actually fits a regurized path toward the `lambda=0` solution, and thus avoids the issue. The default is `path=FALSE` since this option adds to the computing time. ### Forward stepwise and relaxed fit One use case for a relaxed fit is as a faster version of forward stepwise regression. With a large number `p` of variables, forward-stepwise regression can be tedious. Lasso on the other hand, because of its convexity, can plunge in and identify good candidate sets of variables over 100 values of `lambda`, even though `p` could be in the 10s of thousands. In a case like this, one can have `cv.glmnet` do the selection. ```{r} fitr=cv.glmnet(x,y,gamma=0,relax=TRUE) plot(fitr) ``` Notice that we only allow `gamma=0`, so in this case we are not considering the blended fits. ## Progress bar We finally have a progress bar for `glmnet` and `cv.glmnet`. Ever run a job on a big dataset, and wonder how long it will take? Now you can use the `trace.it = TRUE` argument to these functions. ```{r, eval=FALSE} fit=glmnet(x,y,trace=TRUE) ``` ``##`` `` |================================== |65%`` Here we abbreviated the argument to `trace`. This display changes in place as the fit is produced. Also very helpful with `cv.glmnet` ```{r, eval=FALSE} fit=cv.glmnet(x,y,trace=TRUE) ``` ``##`` `` Training`` `` |=============================================| 100%`` `` Fold: 1/10`` `` |=============================================| 100%`` `` Fold: 2/10`` `` |=============================================| 100%`` `` Fold: 3/10`` `` |=============================================| 100%`` `` Fold: 4/10`` `` |=============================================| 100%`` `` Fold: 5/10`` `` |=============================================| 100%`` `` Fold: 6/10`` `` |============================= | 70%`` Tracing of the folds works a little differently when distributed computing is used. Here the `trace` argument should be used in each call to `glmnet` or `cv.glmnet`. One can set this option session wide via a call to `glmnet.control` with its new `itrace` argument: ```{r, eval=FALSE} glmnet.control(itrace=1) ``` To reset it, one makes a similar call and sets `itrace=0`. ## C index for Cox models We have a new performance measure for the Cox model: the Harrel *C index*. This is like the AUC measure of concordance for survival data, but only considers comparable pairs. Pure concordance would record the fraction of pairs for which the order of the death times agree with the order of the predicted risk. But with survival data, if an observation is right censored at a time *before* another observation's death time, they are not comparable. ```{r} data(CoxExample) ``` ```{r} cvfit=cv.glmnet(x,y,family="cox",type.measure="C") plot(cvfit) ``` ## Assessing models on test data Once we have fit a series of models using `glmnet`, we often assess their performance on a set of evaluation or test data. We usually go through the process of building a prediction matrix, and then deciding on the measure, and computing the values for a series of values for `lambda` and now `gamma`. Here we provide three functions for making these tasks easier. ### Performance measures The function `assess.glmnet` computes the same performance measures produced by `cv.glmnet`, but on a validation or test dataset. ```{r} data(BinomialExample) itrain=1:70 fit=glmnet(x[itrain,],y[itrain],family="binomial",nlambda=20) assess.glmnet(fit,newx=x[-itrain,],newy=y[-itrain]) ``` This produces a list with *all* the measures suitable for a binomial model, computed for the entire sequence of lambdas in the fit object. Here the function identifies the model family from the fit object. A second use case builds the prediction matrix first ```{r, eval=FALSE} pred=predict(fit,newx=x[-itrain,]) assess.glmnet(pred,newy=y[-itrain],family="binomial") ``` Here we have to provide the `family` as an argument; the results (not shown) are the same. Users can see the various measures suitable for each family via ```{r} glmnet.measures() ``` The assess function can also take the result of `cv.glmnet` as input. In this case the predictions are made at the optimal values for the parameter(s). ```{r} cfit=cv.glmnet(x[itrain,],y[itrain],family="binomial", nlambda = 30) assess.glmnet(cfit,newx=x[-itrain,],newy=y[-itrain]) ``` This used the default value of `s=lambda.1se`, just like `predict` would have done. Users can provide additional arguments that get passed on to predict: ```{r} assess.glmnet(cfit,newx=x[-itrain,],newy=y[-itrain], s="lambda.min") ``` One interesting use case is to get the results of CV using other measures, via the `keep` argument. In this case the `fit.preval` object is a matrix of prevalidated predictions made using the folds `foldid` ```{r} cfit=cv.glmnet(x,y,family="binomial",keep=TRUE, nlambda = 30) assess.glmnet(cfit$fit.preval,newy=y,family="binomial") ``` Users can verify that the first measure here `deviance` is identical to the component `cvm` on the `cfit` object. ### ROC curves for binomial data In the special case of binomial models, users often would like to see the ROC curve for validation or test data. Here the function `roc.glmnet` provides the goodies. Its first argument is as in `assess.glmnet`. Here we illustrate one use case, using the prevlidated CV fit as before. ```{r} cfit=cv.glmnet(x,y,family="binomial", type.measure="auc", keep=TRUE) rocs=roc.glmnet(cfit$fit.preval,newy=y) which=match(cfit$lambda.min,cfit$lambda) plot(rocs[[which]],type="l") nopr=sapply(rocs,lines,col="grey") lines(rocs[[which]],lwd=2,col="red") ``` In this case `roc.glmnet` returns a list of cross-validated ROC data, one for each model along the path. In the third line we identify the CV winner. Then we plot all the curves in grey, and the winner in red. ### Confusion matrices for classification For binomial and multinomial models, we often which to examine the classification performance on new data. The function `confusion.glmnet` will do that. ```{r} data(MultinomialExample) set.seed(101) itrain=sample(1:500,400,replace=FALSE) cfit=cv.glmnet(x[itrain,],y[itrain],family="multinomial") cnf=confusion.glmnet(cfit,newx=x[-itrain,],newy=y[-itrain]) print(cnf) ``` It produces a table of class `confusion.table` which inherits from calss `table`, and we also provide a print method. The first argument to `confusion.glmnet` should be either a `glmnet` object, or a `cv.glmnet` object, from which predictions can be made, or a matrix/array of predictions, such as the *kept* `fit.predval` object from `cv.glmnet`. In the second case we need to specify the `family`, otherwise *confusion* can exist between `binomial` and `multinomial` prediction matrices. Here we show a multinomial example ```{r} cfit=cv.glmnet(x,y,family="multinomial",type="class",keep=TRUE) cnf=confusion.glmnet(cfit$fit.preval,newy=y,family="multinomial") which=match(cfit$lambda.min,cfit$lambda) print(cnf[[which]]) ``` Since the `fit.preval` object has predictions for the whole path, the result of `confusion.glmnet` here is a list of confusion tables. We identify and print the one corresponding to the minimum classification error. ## Fitting big and/or sparse GLMs We include a function `bigGlm` for fitting a single GLM model (unpenalized), but allowing all the options of `glmnet`. In other words, coefficient upper and/or lower bounds and sparse `x` matrices. This is not too much more than fitting a model with a single value of `lambda=0` (with some protection from edge cases). There is also a `predict` and `print` method. ```{r} data(BinomialExample) fit=bigGlm(x,y,family="binomial",lower.limits=-1) print(fit) ``` ## Producing x from mixed variables, and missing data We have created a function `makeX` that makes it easy to create the model matrix `x` needed as input to `glmnet`. It takes as input a data frame, which can contain vectors, matrices and factors. Some of the features are * Factors are *one-hot* encoded to form indicator matrices * Missing values in the resultant matrix can be replaced by the column means * The `sparse` option returns a matrix in column-sparse format. This is useful if the data are large, and factors have many levels. * Two dataframes can be provided, `train` and `test`. This ensures the factor levels correspond, and also imputes missing data in the test data from means in the training data. We start with a simple case with some factors. ```{r} set.seed(101) X = matrix(rnorm(20),10,2) X3=sample(letters[1:3],10,replace=TRUE) X4=sample(LETTERS[1:3],10,replace=TRUE) df=data.frame(X,X3,X4) makeX(df) ``` Or if a sparse output was desired: ```{r} makeX(df,sparse=TRUE) ``` And now some missing values ```{r} Xn=X Xn[3,1]=NA;Xn[5,2]=NA X3n=X3; X3n[6]=NA X4n=X4 X4n[9]=NA dfn=data.frame(Xn,X3n,X4n) makeX(dfn) ``` which we can replace with column-mean imputations (and make sparse, if we like) ```{r} makeX(dfn,na.impute=TRUE,sparse=TRUE) ``` Finally if a test set is available as well ```{r} X = matrix(rnorm(10),5,2) X3=sample(letters[1:3],5,replace=TRUE) X4=sample(LETTERS[1:3],5,replace=TRUE) Xn=X Xn[3,1]=NA;Xn[5,2]=NA X3n=X3; X3n[1]=NA X4n=X4 X4n[2]=NA dftn=data.frame(Xn,X3n,X4n) makeX(dfn,dftn,na.impute=TRUE, sparse=TRUE) ``` ## References glmnet/inst/doc/relax.pdf0000644000176200001440000035312613574046201015104 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 2930 /Filter /FlateDecode /N 66 /First 524 >> stream xZr۶}?_ӉFL'3'Mֵ&m'Dl%ёwm,̜) %L12l120˒,e Xa9KtfX"XbB~$KrFŤH1D3)%&U~I#3ւrdFsVbS .P]2PgŴMQ`Ir̂Hʬ=A?2%X*f*A bJ+jU6&RI-J,V,XPf藳L @fŲ8dCP<,O0XC1rtҠr:Gy`E$,7)z&X-Ks< xAfKEk:9%Al:7)q1ۋSTaP,aIVOÔ1'a@l)}@byOV&+IMbLrLD * g%Ec:G1XᾬG Ge4Y5e RB<P %)VYr}Dn&Ѡ#8~#kF>ۏvH1.ݖ7WO;;٫ňaV[;;+FB]|PPs}E DbӾEZOiU[z_",I#wu{ N)}o0la\jmA8Jʷ`*= 9OSC5Ņ=q^;JpՔܿ-;rT7IU7~W7;`P./y*~+>5#>~1 ['nf<ykCeHb'S1(Jȯ-t^ǐ)#T .ߝf/IoLaݒEE0jdt9sR7]Z^ W4OГJ%XOEDq8 rf:*grq xA"BmOHR ;}GuSB;=W9ahǔ.o_f2 u_;z {T'sPk+wv3B["5!uFɠ/z駛.ciRIe3tJwi]9>:=%='져;xUw}2 zMٽmŏp5E9 nFkJɺ|NE}^W;s:~aڳ/$lyEbMZԨ5NdCmSie:'c{UHeVx6E zK^{ hSXd#*/dgGEdUb튣M*1[%}Qҥ,GOm ui !LSzQ'byz j 3p˷|.Sp; ȥT!8> \mZй"Iӎj|oQ;ݻ-eOSSyzr)՗W:NpeTCr_WS.‡eHם-EN͉Nr9YGe9KQ%xLAn~{C_0-G㗹a*] wrgۦ >g*$^n=uwu M(tF1Wf(m7>FFsC{Rz%M>$d sM}4qrŽ@Ĵa>GDZ6:v1⽞t_7 ,zehοVY_s3@endstream endobj 68 0 obj << /Subtype /XML /Type /Metadata /Length 1663 >> stream GPL Ghostscript 9.23 2019-12-10T17:55:12-08:00 2019-12-10T17:55:12-08:00 LaTeX with hyperref package Relaxed fits and other additions in glmnet 3.0Trevor Hastie, Balasubramanian Narasimhan and Rob Tibshirani endstream endobj 69 0 obj << /Type /ObjStm /Length 2688 /Filter /FlateDecode /N 65 /First 554 >> stream xZr7}߯cR[~rJ"eN(ǹhj$1+*r=ÙHt9 pAwC/`^2񥘎y͜4g޲p昔V142h# P 0 S:[30-S1DGԚϴB'!0me-DEtp #D`g&ÌEˌ1=3^G3ȬаOfZ!@1k"]:aNHXJsVPcϜ8.RYsХp9DO]̠a-6+%|+N J?ht&1LrE+:0+@WгB>]Aρ,@&ъ>BIQԻV 7TIf=cq9_?XfߡN#5ĊwDZ8s٬|ua.ٳBps!+±WqK|Mu߹YoϛHc ;TmF*z@t+X &S>ڻY潘\*ER=WPIdmtQy2KelzjA2rSmdܞǍ+%Lᢚ:<߯V~BmzK(e @g\9}ȐX`F,9tkL:qaͮcG@ilNLžߜ-)N)7-؋"7O`@TZw+g-͆LEmPQEA)ЎIkv 3% pzRC G3~NRMx[m;Z-5ɳOtfcrkq{ź6 mpÌdA& úiy>Ma1Qm)lTb(STJc @8/˖C;M_LʕKʠu%9¬0'UB Ji@`K}"ږZdteIXt3 ikb6ŔZ^!2iǕ+δm@eG8@*h[*}Jk~JD:D":TQU*9m.2L{e GyD@Xp U鼆dP@XdAy7~{: ' ˻ 2eHTB;2/pLl|r&5 L5/$ylS7js/ny\hݺ%6ﺏ`Ӽ|P-/ wф(qqUbRLr6b^,լ,l}ROQ8^VwrtW;_ oʇ4z1'Xڀ|$ {Q|L/hL7TRZۍL㇏~zOT=Zf&xua%Jz?Uk*mEͿ]~6hN,%& ߁Zz%eA' nt|zKᨃj3С/Hՙ Q30ƙOyyӺR|=0]1PeiXuQxWG8M-_:'I3ukZ_&Fpߎ0hLXZmnTʮVʮB N޿1\\UcIћ2Ux]y -9odQp;pL̪._SW@t\.u\\ !]o>sB_ Q&ݳXP-e2(dG}M ȗO/NT-A".]'JE$įm0w.e|?и?vzo>O"Ppw趻 Rinh^jn$mۈD5Ԣ*{wp7ց**^WtR"6V>gJIdS|Oîc@kA| 3U'zTk =#؝>Wn_Zџ~xKwas ^/x:.}wXS1. pК>!D 7O<,jErA]; | np8gRsgQx>Γ`_'\JHx_ ac,Q֓S- '6[*9irtB Hs%Z~<ЊqQw(x\ (&;W+&VzaDIu~d@lyPz Iss>풛oAiA-c+#ݛR6!H[{ UO{,HLh(8Y-U8 YT"4v!^}?@~ J%J: &7ϟ]3 3o[x;IN&pޠP}dG¢LZ$z:  aaRr$UB(ja5k:tc[HG0O=3wGqsCὅ\g1`WA͈Zw(J~qU k zyFATZ(WkT-RET~6|&)O/f}L-%Գtݟ7Lơ_bj1i|^uWWcq;7P?V:*% _>EmD8˷zRxy ?~ K-N_"$:~M9)2,sR=A8Zpe!rbןjhhūÉp }w}5TUwwΘ`#䵧?R vnjXqq_2@4* GvRP9iuN霐Ƚe Fޯ6朹R9Q?h8|oZ*TZ` hUH*-*!uFti|^?ReFGiHRb.Έ۞t\#A STvsb(`wfm¤'-'Gs^X>orG ωôj%' hIے+8 <TIEHH41C2X؂P{^  3AYsg2lZ( 5+yq|[$XsϳxU ,R#R%2rm?{^pQT?^ :S̊= މ^y'q2+8 XHG_8^Ԋ0Kq]9rLoK`SNɪ]ʤM0 C3tPyL:0>šx/Nd;L=cbn:ߡ{P83FMĬ42aR,u,lLTYk>z5\-Va _nd*Re)mlM#me+hL)ؾsrˡW{}7ycզ %dmNoh#Yi0{Z&4mH&yFR[eb+2 Jk,jԦ%pvdnp$@<0.j d> -XdPO:Y>F&z*tHR+TyȬvyy;^8"i:aVߴj}-P|$} 2 H;7ImyCMl4Ssp!S q4 Ol&h2RcVDp=/P@yuStMYUuO+"QA/ړ{H]ARu۬YL {Qi䬊Ku٘E>7p[,p?TG^ɆˢDe#-ئZ4qz jm-H,ޘ$):Hq(o bnU1s!Ovg "a{$ܷl  nČa@&B }s` 4Np&hߤElY#!6lqG2#B%hq4"rJ`M^ mP6rP? bmn=<3,VHʍ\ Tﲢ4(WD;jm,/4d[Ғ չ XZxydAݳ"& qA<9`zHn}850TfӂS*jOEx|{ShR<7ڀãrZV@ZL)C̫Nj-2Ȓӵd6È昻86a2԰d{Mre@{p$g+Q1x.BMiH'KvY"'bt^2J?]|iy(O^e#4.ΐ$Eʵ11*S8[Xc9ӵ hEt $)\Kk>@) 9ውi4ƔW,۴&t#M68k.6+^'+&@R lroҘ.bOʫƹjm޳dKӗ-CEX/Pz{ NRA(+fstJ /RrX:(o7o]嚹jArHnpc}qa&~9Z=id>ay7\ |7a,rJz }8-ƚm*!G XA 5~,3V]wC}w;>]X+/^.ة.)5I "G9 ޢ2uGNeOFdLʗݔl@cZ?X(]ɹ-lE)g+&˟NiHoo@>-8g. <%qr"Z3nR,N#MH[[?1ٟPA&(.FX(H0Ё!V>-ӆ8X'^NVh6y5c߱*R\2NPub(pkJ)pbdR8k*)j Jf(‰w-6AkO4JSiGZ,HM>mPjIEe7KDY#v:8Q(1=9|{6L~Ť 6-L+?yagm nנD/73{NTendstream endobj 136 0 obj << /Filter /FlateDecode /Length 1322 >> stream xr6z8D,ɥM.\C܃bˊZNd%> ڤŷ *]JfBj501jṬDjn5CFr5Lިtf!.S@-Z^vkwM u HڢU3p%0|m {Uv݂jn}ϲɩխ<>mYLZe'äwS`A9+"D7 v/XmniEoB[!K֨|2@Μ#:+>Qxk̪Db_!Vݢ h9]Cm[%r8%ΒJUHzsM2kkZ7zup!U5>ϣe^(d*l;fp2Ux| -嶇.%xa ԃ+ ޕ< uEf/B} )Z0чP-3ϠB;U'C)SOs&w s&<}ǥyTQ8Z|!}endstream endobj 137 0 obj << /Filter /FlateDecode /Length 7501 >> stream xKo%u Y\ 7^8`ؚ$ ɋ!gDCɧ9]19⅀ A_=osߗo.^Evl2Gc!s&]/w6G{̇M'\`^]|8$ǹr_l:ч8 ~aS9я8 ~ =}sxMd <ȟo2ԃu.ZڃMË7oWʻ%lWvە-n//~鋋?]X!yULD zG[z_.ñrSFJߗW֚wyA2q)m{ٓg([+G6Pń.[˱j(Tm9RDlxx}k[F8j%///~{0@pv,^'E7xs}ᑟsO1>rpJDT=V@|x|}R:ƇVBrY dHb/9s Cqab!8-s:R_,ه 蚃\`B>BbiXWT +dSsppbvFڎ SR_Jii[$H.k<ˀK /+;8^Q.ыC(aA5~gqrWkeU|}dMoleivGb PvՉ^6arԽPӊH"8 6`'j4\DVE`/D3G-X=%!#~)<8|wWS[u.1f."hΆE/l64WR;x|PCfQl݀1l|1)V@FHjAtb@Ub Ia;}kDlphQ%;HJC3yphi,(u@QC 81 SNP| WHcW^ ³$ jMwfUHU &;C7$dҎ("? 'LBd%-*UVJÜW3i\V@2s r(Ys t*Sqj&7Rb %S3vU* WMl&F`F E5x0%8ƚ7 sChFoeaDO #4xu#VprUhhs xd߫q-3sʣd2xP~(O -n hA8$ DhqxtPm&!@4d`w}f09Uˋ 它 0b@Di%$bu3`fh:.\#M*GhXU8" L jҲԥt%oш&M$l:AU軶!L&0Ttۏ=:0*ZS6 ?s6 aP)&l.T鋀dXm)@ ՙg:` 4P3Œ%/G ]Dc9'fiΉhX\P:D N#? L< DV$  ,Ͳ`njCLuAJ4 %(h<=!h k'7CPǓhO1c;(` D,d֨c&N'Yօhl]V Es5J4Ѥ2{˹ hJ4nJG*0ZDD+ah̗hWf2u%d S !gpфP0=CwDS% *$abCe;`cv-zXT}0#&.fu@BL: kj`XS҈&,Cv&6 d&qi74q,DWg9̙g VZM:PL80ALk!VĀcG A@BA`D+ ||vA9E̮[Au@DPh0rGNQP~ qg*!zgUGKN]7זYXȄ&V5nm>_Méx!T'bY?BvQ L^'?;c;Iu|]X'9i`:zBN P:Tup N@uu#օu֪::ǟ,L ?]upԎz_YꄕulE:aeQd!CPL;@Tu~:;U;fOL 'e4j`&Fش;y>L2}z<aV7СìnV*.uذv$O;ifh|,)6H'}9)e*tUuT>TY:EqRNғ015"ꄴNX2 eƨ@pUu:a9)a: Ê~aBU1NZy_̋`0BT'Eu(+e 9acYUgݼtTTuQU'C VKUʥ1d%QuLSiAqRV7+v`-G,Ӭs+eө}Jh(N'0Sa Q5Po>NXW űu0Dq++`Zi VXhAW);)5o|D*P'r1UX-tLw(C'eLߊP"ATq0{I*UtTq0f/RʼnӘN\gbzWoUĺrYt|69vP:6GUq R8G TTq R̋UTq{/Z>_]пY?C;rw}@}dWl8tXi!0z qsLcc C\S11!vj*Pw?d'3H&5ppEnRݕ˼gp~^jN{=|B%@M.ɔ T|Si⫛+ϣo=i#y{҄^oV".WwwnCa}uݣރ^s7'Q/)eS 's0% $.m{H2xS7]^3ifO9? q=ixI ۛS{m~|7>fm*ϷɫLJ7RȔ䆉o)6MOGEn/[Ӑinss2* ך@_<|b% n]#_elI=ݽmMRKxv۩lw7_^iYcfB?=9֞zU>z=e}w{w_mGXR6 ;u{A|Sq1 q`|!%+_mӼUt&'Ux_y)mPou><޾?!yl.O^])]l!SʷcBQx_:w{.}lntܠy!"mє%?ً$4:bul" n؅ɰݒE HCaNoe HZWrK-p=> Bqɷ*)RG8} %h*1o=!r o*m`u<Lř S}sw+מgbA53GW{g> stream x[sԞh&i!8M;n:`)i%,IK_>)*v^:}? ?mOry -N7'O'.aN/NL~jũmJ{z͏΃]^H8m-3Pn6 a؂6%w4(d.*E5%'OPC.C-0T{ {&V]6S 3lV9%BVEGr}I%`+hR)P ҫ yk n7$dR<ѱjM\xqXZ8Y3cwYi*)s(`%0HVcvIUݎyy.thn4 0ȫumd}gS:I}fw3}aHgg|d1p^3yF.ȣIN@d5UVQ4遹ʹ T\9!TޔX<"'xoi|rBmWq tzl*eؔXmZ\={;v4¢~=(So[.G@9W'g[?uU{nQjj=-/6%ʃÞ$8IP+9"CuV̦h`̦#eW7հB0P|:$ ﲜd 0w`O$w\V=fuyzسq1v'Mg #7=o"GiS߭Wguٯ$q&$6ӜC"98~Gs4in.)Js,s*GUR~D2mE4 !HP*q~PPcݯC]dl{#RYUS˳l%+m=j1˧E`U믩)c\"7xGE7/,$5dDΨ&bbF+Cz d:SI,O# %#,$Phtw}L(U梅 `DXsH>-K?R"ʗ~>PJ Apj)@p5쒁G$uRj|(1Z.Ek>ajP%L%O_CkӨ\ Uԏq}#L-BҌozBF a!-4b58YV(b:(J1$"C)͋ ^fK<62vp jO_m[^}⍳9-fhƻ_>lfŋ(w}2 . ATkbzJHh:x{ƁQ@5QM~04!) N?Hq=:u :. E 0%{ GUȶZeL8KmUaSWr\D$(Y6K@N<̓tݲE>QI A mݒ~ o$v,(@YUbz0Pӈq!9kr7VaO/D+ z/@d7ݛ!$!\jR|\u^ V4n`dqJ4#ϩCISq]=$L//!ˠZśxLOKض~(P{uE=#+ j*ïHhT-zBnR?TjaFqLv n.k%VQq}}•`IF@ةO]d\S0vح8L9(r&4%{ʓ隆hx%zyD͎Y4(K?K2%.d:y?Or!{ b HЅ,$1 * X)FZba1v9VW "5uEFgqO p{gx6Yq6ozdf9ZU-xK`*&/Kֻa9)UB~5ۋn8*ꆁIu.gϫg'+t:GA5tr#r!ņ$OBa?VcMR%ֱyFzSks_DUłCuY&ŲYhDpmj|lQ) UNM_ZDGF]}ޝ{8 vWn;78E+͆z-ݞ*RXΠZ%4'Ra&UzAhzTDA [5fqH:~bLk l;wzn/X왼'endstream endobj 139 0 obj << /Filter /FlateDecode /Length 3027 >> stream xZmo~! ߆/AZ4|plɲR.9ȏ3.Q( !9j=8pv4>WzxeR0c|ґFܬ7nj^XCyѱ6N5lz t: f:91:,ttzLu?^ :s^c`b{?l 덳%٫g6S C>Y=;[}26!!'R3XY~گԜCXcu29߭^6(c,󘛝D%A$'~+k_mrk6>Xt6cGD4>_Ͼn k)JJ}:Kq`4^;08Kib"I##{ޚd]vtVۄ1̭\A 4& K 9WAs6H藃eKU#XާF <%O3N\5r`Ky %r[Ih^Ih6 oF}bMiCڈ1kou/64l@И&x:b pٱe,I;A[7R\'h۟N\8 | $0A GI,p-`2PIpр<dlK24w}g@GS" ߑ!AӊO<1m\mɛ 靁ݹ{Ȗ9HAriN>TT9TdD2Sa;TK=CgCw'hNќ<|=jھt*O|!ʢ} z"}bQТV$Z4DX4H9ׁ')DrO!L+$GLӋkveGHy)#y< IBy" g0Ùp,a8}51'21+% 0q£X&%؛8!a O  F!I0Q8Ir6yb? Hl%1 4a+H]3F)iH7 ,`*Ei@/o'91כ $? L $8G&22!te0Ջ># _9_TX/6U0>%glO6Tp|z)il ???c'7덱lTFhfqH "_B&?Y=M>BX>W JGm OQրb_&>!j\DfۢB EMw{Rj$ohCF<ý&@A;PzxO[F|GݻU\GnY9!ZzF6qBrM;ɹA}Y\9@AGl2`y>rE;c${e ]{c8-qSߜ}D$uzhi=ֶcm34MFElL/)ChJVC|諷 #vp[-H^/%JDC W6zR,0B"L5 E۾|)E-a  AhB[d; ovSgČx+vַxMw*bT|z\+RePW\o[JYeK 'Fń`T2F1ѫ~Ym{jZTـN,xtƹq^7H[ڷJI\>|x{Zլ>S}F=X]neS ?r Y@1nU -* Z8h hcej&D.hl2[ a{o..w~`jjnMy}{!O^LӺCj{jedY+js N[z狼"$>uo cAendstream endobj 140 0 obj << /Filter /FlateDecode /Length 7274 >> stream x]Io$Ǖ/̥ `0Ɂ}1X0 %Z\ZE筑ْ[*|//22뛝[oÙ۽5Ok~ _>?N") ponMH#/s77W+W'/"^ۧD橥*t916{ E2tO5hr7m7V,i%<ֵb.]_ v4Lqmavۚa.0 ȭ_8FZ׏w<`њaB>`AbhRfUXҥ,^eһ>fqߢho_}0_қ扖ЬxBz|`^?Uqq0k>Zx{*\WZ 7ruq8mjT}y- J.w8<+1R}m[34 0C=f.*x438[B6\6{?O{Iz.d 7D p7XK3hܗO Zr]~dO_]-LZ 4NJaSuv5@ 0tê 6oo) ?0wͭ<`\RZ'2(r+ lJ3쌱L23kmp[ QL!_]=$fNˋs ֘9X/ޟG\erXT8{ w= oH׻9P]_Sa`=e2h,s|K[4K{haXp`%/ a9:^nw3oL9} l$u`[L `mF;5H`Q<+Vh;VRW85oϽ蒍=iK+=D@˕a/q2N mk_m}A6(n`?ҊEu<`qB{z 3}{5:CJH40ڛ÷ߞgD&ܛq1{-.)2{{G5qWٵm8RA |dR5_U)0Byo 1g(RBT0k읱=n 2)䶴˰GqKaeK_l9\*v,&D#5fY>*m>y; dۄiz WB,}Е:4:csy[2O֘4S{m?NT|2յjrPc_q׫,D?F`+ԕ97N=fM \|sI#AD\Xgܒ r` בytY2-[뗯=bXX4JI%]vrg\SF*Wb.@f9xjKWa4BB9U'Vm`wO7s;l`#Bg6\9nBUh N=Cq"~;|Mtc8kq @tW!.o$6-}rH u ,VOSOfqcKj0– ͪjukXKӄ׏ɶ8.~bQZ~ >ً=$ EINl>] Go?pdi:_?_o`˴DL|hH;nF/11,,gˡ1)tљ ~3{7g5]!M1;XLdY];!|uI]wg)61n2#2IFLwS2˜dbd1ǁ6(%L\C#3QwWfiO/2ޔ[l?{`|xOgүR5|fa4h %P0`rAdj 6PB2H"SnkcvfaFa$aWß'0`C%Y:H, a#A/Vv0j CP0C&d Ɲe|+$ӝI-aEԉ8H%G2dHZ 5煓PaD2$fHu= 3I^man25ZY0ƺH&J݅1`Y2CUTm25P_ R9FuT"~ax!af8j'M2pۜkx"Aj:J$ica8_F,+a`Ic:ɜQHT,S8eLu cx`Y*ӱr?0x W_0W/Ǭ +WȰe8 eA2^LRwfL2Y"}% Zwh_$ czXFZ P4|R4'/\i,/2ay 0@N2i:6ge ,3`cLұ L~X&؆es~FX&ˆe&;sab܌Lұ L~X&bٔ)9]LnX&؆e&7c,5R,3cb͹`b܌LR LnFX21i*6fe ,ablnÔ ,3cblnFX2i*6fe ,3bal^FX2%7be&3c,DLee ,yY> l^FX)21M2eFN[/{:Qfe`\Ԫz,)%``3Q0|h3 LxrMmgzN^4E :蔗&|vȠ3 lŅ(ڡٺ(GĦ&v즓2-N 2,o+aE8gVXT޺81Tr҆a3[(؆z甪{&c=PF | < aF{q)JuFJ\]цl˳]%6ѶSRuw'%gL7zzFIy0$:y*M ɶQSɺٲ(̞G95tM3'R#MXetl(Ip@9Vgtd(,JQ֭%͖Da<%.5qSJU0[/Ozт@:⎼CLڧ^'M"*xg"z҉aUeQ)V_ox*$ KC5Ta `0rCm0$<6^a^zԤ$[ęQhW37֋WqjةwN:DgG;hKmJj#{#V[yeV0Jvnz֡޵\bm;)U{*h-еo tȄahQŅáw-TνsBw"?)2*5F׭W\{Z^TF C;uc=uZ.z甪oiy$oc K|pcd?!7~vm!5LЦo֙DqjةwN:~\GI28 P):z~v!JrC;Ec=ɣ]56ѶSRuwOw7ЅQ'=+/ncbBC8T83J1LxrMM;'T|?CԤ:t ^)dP>&$8t iy+F[ȤWF*C;:c=jջKlmb9W*?IUedz{=Ұx"83 SUaaD>bЍe&/φg-X(nXT{C/RFK.wJ' Dq.M #Jnr*,\R]7ʉT.! <12@e~N(Jd$C/*(*>4Is<~%`dƌBڲwSyFWH ߩ 퐍u&Q|kĥ&nS ~'%ei8tϝ_}ЪPypz18C6֙q-ڸWN*+ƍ"L fx~bVHtPNS5BuFt9WZ.{愪_Ω`WE}NSi}su*h  # X^ŻKlmb9 ?݉]%D2>ը0ȃ󳶒Qo#>6ptX̨w-TNsJ/,:T$v2B0QyhF[؇xӀD;xc=xRz甪}uĎx:B:VږoEmyogX9` Z_)}Ig?Yφ|k?WOp8~Ge71k$8j%<\K?J*endstream endobj 141 0 obj << /Filter /FlateDecode /Length 2235 >> stream xXKo#7 xXE2vAd9>Xmz̴dS~H"YU8L%uVêv"7jS"Xyv=iԩYHgɹq;R+%qB͵3EF64BJĢZnyAYc)QZf&H~AE+gg&u0j[HQcN῭fs;+*b|!щO3rq[Δ+'a34BֆvHl[pwQO ڊΦ۞5I T!X1b֊mvXeJ'`j]fg9pf vZ:z)Ѣ̠.P+ #6T7"C͐h7ͪm>#"2,h>TFn:{g33k#]IۅAS:]8"D@7Mˈ:ЫNƉ_FA{)XԃchV."fdm6w79:#>4l Sˀ*e^ު0X;< P]hQ/mRڨDgu&4B;5iφ_/ouX!F;;թ~=e)pZx[ CaKW[ZEP~JNlVvNZs ƓUɱmxq=.i=!me\t?|N,-:,W,5,| MTTZ>SPus:)W7 M&hshz[?c 'RD|h:mQzѯhsS6QL(P<8MT γ /DϢ!qtȥ62[u;^JmO!4]@er/ߝtsFT}jg5|kUUn) 40A;n^$JE $kBʑhRR1ר7ĐRJXm|v^`, {e=$-^(3C"b:IIˬ'#u$>32MX< cE8;\t)e/E%mXn@؍9z_ikc Y)ԧ=47 KHen;5NʬS+iSM(j+)TkXTp⹗s C)0-jm;s2GgA+Žd/Oz廇raY]X\v}EQ^hdg=ooS%eհ›^Ek:ru 80uK}='CeS^hi2unxyW:좰z"%?X eZm*^}~ݓ]䜼F΋}\к_%ہ75FTs鵣*p 2beէ5TˇKJٜ*~mHEoMzo@\Q wDjt?*GƉit҉Ҟ^"@HKgTJBF%XkjI?@RcR T~}F$L:&UڦL'.w.0,%Uv RSJ. Su6f;]s!NO7 3VO%OS'}w>*.dN"#>'cC 1zfӜ׀6!ʻL0'\,(o@"ʒ|r'V`h3Xչo:IǓ]Hst7.'s$%_+|Hd?ImI)F!]S6IRF4!#$̪vƙȊw7pZ+„ [%oΜJ*wYLi' {Kr{ _Hc3 :*'YK}+&ߪ\lEhL6yqε)\LD^)L =endstream endobj 142 0 obj << /Filter /FlateDecode /Length 8924 >> stream xsȑ!tHm8a=1aZ{͡lIi$,TfVIG4](U @ұ?wol,}8t?_'rԎ*F7ͨFIi^.n~L~7eV6KqU]UPޖ)5m :TbMcd=TduqşόeiF9Z^8͒t yP eP uBZPí”1Pdn{FcWhǸCL.kشq|{gP"}dP (y6;Ǻ)Sy~F5&r˵(wzU\ME@ ժsW?ٽ]Tl!E e cH&qRpepU++2 @3hKLi &֛j4\/.-p5|4&nve-`0_mkM?\y~s&Y/{u)xAS`h]Pz$j}(XkE aYv@+} hl QfcS7i4>SY|MBtm(Y e9j7]°qUatQGA`du\O.,Kpzw)r%Wk{źĪzQW(qiL+'ӇMeZƻ6I6^5(J+qa@}f]ؘ\}߇#p!l2ONN?G1)|\\N?Ưu'c@ >͢g W KGws,;Eb~v!ks1*{߭*هYGڎ*5v R֣J;f%9a}L¬Рefmmzzzfl޺׭oڛXFžK5H30^| wYxk#mYz}YjjmWWﵬ"t\EO1Nr`Mh6|an0!k:l_԰hMfd]~?#n* y,#ӛnB pqՍ6 >L/{7v# r71݄J;/YꦮUZG5܀+PA} /zR^{n5 Q߰e6O@VIs{jT2o'ˏkEnYjh4+P̛n&?_MƷw7[wnP{*ݵMyw>v 33&*]?5~'\UvnV4Z۫<&b0> cOBzmKd|iӧoGXkoi 3r+0]Wfo4hm౬23%1I%_B.WAG6`Q^Vj6ZM7%,;y+\H Sgp ̸GFwgpF_H{ Maߪk)nt v V5W#ygB[G2r@e2x2*#ʸ2-w2{1MQ6.(M\Fq%:EQ6CPSv,u! % -"PqMZeأ螸 ؋HB-ЂL(ZT9cf& m+{AHƺ#p@EU@Ml3F5m\F,!aUEzs8bQTY46"P fUSAmgq!hu4-{]Ey% ,GFU܃&*xqzMfăK&5vK3<me"-lpd6'O/eIն /ۮ kRMnetʴ]wE 9TaYͅ5 y?ࣵqpban ŘuzP^b\hڙR,F8%hd.y$@_Tk:u!3V?F.4f@jԳ!jB́RH*Á~ZYh7^ t/x/4S!"";yyyɃmhn`Э 6wEQ/ cBH,l }c<1@CS}@Na@N J1W/ , , ^6p:nCoo\DiGRDR$. x.ӇC{+ IO6a@6]p ;8>tgσʭ~O8} p@@@/BN8-尖-.@ ][ b#p>> - HH9cT5@INa_ Z!*C` = Ze2!ۀۀ>_FOO&( l ;CL*&&p7` 7K`6&G) hAhACBHWZÙC sZe=YF9!:紛K+?à C|IB\P AAAo? 5|~~I?جB3 )}(8h8oB مB +B:Ea%BA@O( +$:%z<> KEBv29 ~I+d#YG!/<B/> H!}FN?S?Sǿ ;@o7qwfX^|ЎA# D&YMVج&Y@ XBVXG7  D8"ؗ{6ej IK3tIkb;\\O,HHHx`o`o2{$`` "y,i9iR$gD{k{5AS>9f=~lf%Yjubv(ǭ2)J@JS&prVvbRT`2FSW$OۧVP2DS9KsuܟtTЇ!}_^/*!+SU"G*A*A Oӷ|w/r&+G(d濴߉pēD/q0%tJ@%8~ xxJ`Up J_ J@%*OD>X _Հj`a^P T:x0JtrWxC3T*2w"7.J`fϐѼ% OR+,*[a+'M%^k@±zadBrx/CCl  rX^WV(bgǭ >U*CK+U;nRpȢ|*Ib]EͰ( (p@(T*-?n%=-Qخ(LNoՄj ]X5/фxwx@/UQUQ(NGyvB˿FE(_rPQ(N@{BixRQ(T*@}s*M~Ql}rsND'?{ Q"gjB5q:D{{] |&Hl Ŏ4!~qxqMPM, PMlPdv ^.1 x7NKKE$A `o݁$Njb @+&H7 g77^Js/4V@5PM, kvت˟_J^yҩ"8#9&g Ϸ+ᆬ% 2_ԩeK@G@F8m#P P+ {{ሬ@?{VP+Zao ϸE/Z!wMai+ػ;x{i<|C<0QxxI44>ұxK2ii4ޛWLho7Q1Y&*iii|i,ii|p44444ѪY{`wLh֞jn8'5k5k5k5k5k5k9kEj)mGq5Z5Z5Z_6Z,HRWUUh@UUUUUUUѺwikjjjTXhh4Z5Z5Z7z/i$$$=$%NMg'ѾDQTTt߳NRRRRRRRRRRRRRRRRҵ-$=$9y`ɠhp|pǽN'"5%d(jJjJjJjJjJjJ/4%5%5%5%5%5%5%5%(% PԔԔԔ<~R\єԔԔԔԔԔߔtgGHHHH455555555w?>Uؾ[@gnK *g;sXFnnema{fTQlA ۪l] +8 p#aOJGց|c<@` G@a@a@a@aC<@ Kx`,Al d d @?̤6/~|Ugf}jTg#1=1zV] 7645u2ypKmfRL?tg2\@+h}rn:?z8: W?ELp;&~>2Yr>Wp Vh͗)<̧72y{+}O;J ] )Mol+MMi=j&hu9o쾚^&14=m("-9 p7**eۖnoTREk"3_mɪ"Of?m%?@]*ۈ3_:ts?U氋npVn챂S=ʚ|c:<Gnm ɇYToM]ͪ]X{qu\z&s\\/⓹L/uVHYF5ضU7F6Ml6Yp0;F]mm xu@Z\Q^9z/D%K?LߝultS`B0ӫ7ǘ|yT$(70xl{`\2k֨*FQUp fl `d&or^[endstream endobj 143 0 obj << /Filter /FlateDecode /Length 3514 >> stream x[Ks#7RuRSx\^;NmP*i#&9p+ק@""ڃfя?eA% WH6݌j?}hoG’Ҏ mXƌfToGc07DɱL/nF9k6֥f|kzzrg2˭I- eVH8i(M[n+=X.yEzgC|Nݔ,)D-hYpU >[`CvM}, ˲<@Ś<;Z $ Eƥv~4r*$RRAeHo}reD9wN-wCVJ;N OYrwBߔv!<;04xZˇT bdGJbUa|VeWU]-_\\zn$;4>) + 4nևJsF kͬ_#hFx42+la8yPUp9E)MF*@rMݡw>pZ) dnj^H(^!D(Rnm;.ɗ_N%'.9oqev>|69,!ۃK†GF.Z:S.PȩaZ:IrH1a5æO7 @HgVZrYZ~a$L ɳ@mI-Q@QE: m4os QQ|۴|}=HZ4 =^ NqI~j >׀e]dNAi !8dk8 IQ47L4]6q%D2Hzw D0\nV?,% /6Z^/PBFRﺭ;qYmMV#m}6хy'lNPҊ|sg j= BSF>Lм$J6q"wf[4y_:3VLlH"q8fDmuj(פ[(~%B1-)\,P@vJh@YuXہ AfiVH-R;S3 ?\x/dljɵSDE@n"{of49ׂtD*Sv-gT5-gtG?/2+'i[, k1?rÒ~(X@$D>U8 |g'lZ_#}¯ʒU5 -yr*װC{԰k|KJx/Ҩ^p nO$y#@%v0[`觛 Nb 0'tWwvz & IۚS$w3 ;1q{6R(?@@'Ȱ 27:q^3_qq|zLD)f~Zk PX w(d7QTNr|FLAJ n+!CE)@PEA H+ ^"l&uMЂB41r ewsH!DC`3}>;Mke\y˿p řpCǢ6RE#KVhz> Grj!%Dm$ߤKYXf+ yڧMobK/ͪ]*@tϨ!` lqۻ5fņ24e~=\ga#5ZLkOEuv}rggpu ;w)*| NF>軷BjYpNUMU2 vе$x{\%Yܤ_ݻ=T(x?" ]n#[)MD=ÖUrB&qrwme /S'2H3 7qvHTlQ6r5 "W3R%STM5~,0|sl' Fnlan7pEeJ{Rd"FYo3Z;?byhsԫ5$ ﱳYrkJ|Wo|+ޮK?7+:T=JG^Zs/EF mRnDRx>B)TR;Uh|Ų^k2PX9/E°0}9IEXK)^!TrkA/P/H*Fjrgê~C,]ӆ9)ddoUPfxw'o]ŰAB4h@?D[zendstream endobj 144 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3471 >> stream xW XWЖ:bu⾠8f&֍"H#K.l6HٕM6 R* b$˛h3oD2/68߼|vuխ?H$VhgΚXb4St GKe؏fZpt얷7:\ r+z /IoQT" D=mNV/^KPkC+MW%ҋꉺhupmTZ^kzCಀ@o ahݒX8zmR~!B"7uÌa28fL`3 Ff2,f63KiRf:a|rƛYf5f$31vL#Y#?,`E;NvgڟB>ׇ0Y#+';F86G:#z DI_0%E} 8pc!^Q}KNX~ P l]qN!X,U~Fdhȑ[$eY!Rv( ng? [070[!{ {=BTS [cN1`S3Uq xRS6+lߵJNKP.QDL2gXL\MÙ8yr.(3ã6]e3_}bAsLxj4&UDc UڗILtH3d*Q̈́]x#% J]EQ;<m$K-P\ XjU@NpI`EFē`D&}EGzZEN5;PLP%~qJC7%F/n'< ~l]…_}UDLڃ4R.ϙ|@mPKW+YDk>z0Ͱ`뾺:ky&4* ǡ+zB=AWFc7ށgYep0*7lbRcŇvLc7->FF,J;L+ۈ?iw$T)}5"tDކUkBi޲X oN) rjT_ il]Yh^p{d cpT©,U}53e-7 Vu&>",| OT^ օoE[Ƹ-$8Q tuQ}wpR`joqՠ' zMLJBLOɝiK^g*юUX?]} u W hxn:;vP9 ݔScU*8 NF; 3N- inif h4j˺NL/N$-Si{ >[_e**@Ow x2hX{kot0ɒUneP`)%@QJY6UFsAF\n+n蠊6SiOh^&Grξwme++ˎwlJ;G%}TJqQ[G/lZ78 b-a1B5HaR+3.NM&H1 ) cQ̦E,iMKp uI7RxCRZS/^3 _3fh4S@,=h#m >hb{p)i즌'=t"gCH  ~A9uAwy[ &DS2pY;;C<Fˉ5, :^nWtm-=pANSfcy6"EV!,MC!3ޛDJYUXNQF)%̝Tܢ]Eu굼8;l#YKp?g./}oN\B4U^Q̃FÃmm*mku/=Q)8boj)Ir|j^A!%f[O z]2g}7Iſ)χ."]=i(Ȉlϭ2kdg=)Dush)3vK[s lCiF1]'d?0u|#f:^A}|퓗*ھ*O;ST e,ES8'UVdd6+ p%ME-ex:+װ-7o@ e{I"m%s Wu:p%fS#wj9d=kkC,0\O[JkU HS?c\Zw[KSkǃǐmJ5|v2Ւ f.PbMi&N5&F7U@Nm1 £uuo{b^z{*SYzfSZ!>:HQ~ܱc뢸9txr؍ķtL ?n r_8A7T'|3)߄Q|ŸlvCh6^eX}{8\q3$6Q)qS ;+XOִtmx<dj?t X~q[g W4d78cVys;bvՅ5T&]y dq%yG?w?(.BR=;+2ܒ-.Ey#%G/:xQLp:G4srsA~5RKa~0W>a%endstream endobj 145 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7819 >> stream xzXTr,g$D+ bE齗 :tT{$ѠX7}M73<<w]{Q=(HdzIήAQ3~փ.v78TE oCSDQcd3Dtu 46uI﹦a&tp it5M;Mx::9xnpljm2K uV&eP{b%~/ Xo`nd8$Prv/1Ù{=w~7}Ͽ6 90Hlt5eZCa:Ta3}5F\edȌ5#/23Q}8У-z~{a> E=l7%%gD@Qة'YfHk5I"ZeWViSS4C$QBrt:BYR$Aa1AK7+tF5|͘M] =K"YF'}=3aѶ XNނ @Xr4[3/X[r8OW >kMލ^sO0f*)<5>-vbNs=<+$4 WyG횬 I@dG9KWm% ao=mQ^[K6z9Bhy~JQOՉjZѮV1ܥhИ׸/8@,u ܜL)u]2C4^8Uq}pUWzpfH7PAIzљW.q$%͆h(c\<e:Y7F i$j?,k@L!h(. ERs[]7&ӱ=vBZf?CrȻr7Do4z} b)E`]PwfBVod(neEduEEX 3$~:ɹٗ*(eP:^{ЛcCa%{v^G_MM,Pd?=$hXN>f0`q_aW&=tg_H.µK˚ JVTxMWPAK`<釈޼V''+0(_`mC4}-36 Մl6MVMQ_'. It4cKf*C=f%}pLyrNMٱ[ھЀZé!1E+s8hy!zt6;mhT1ov._+aS afx *FN!A蟳1;}7Kq]PPiU9VڏR4%#Hcv@pkWL{ݎLLypij~zyj` DKg%&CL4JKR98B$IM?Vn>A:Q {St/bnNg.SSc09ᐐRRi4).9pP]F>I(=AgjDBOUkYG?*\hl8xkC l?c3<>5Px-afݪv9rޛvP=Dx=Zb5!$owhe9<.QzKbhV?4ިqjbhwO8OVt&W|;Y ! W큯₩K :{x+;;ާG~<2YJضl'8f49Oχh5k93s[&Fy9w*!y$03*;2b'Y^ӽj"bihBdou <&uN B\rR)N&U{#,|)KcI_Te',=Jʬldn˲ʋ_M^) 2FA:>XoԌ V!_lMJU0 ug&ﰡlȱ# \1}J}쒠QvroXy.%4pj$P@/*n7[uDB Bj]x,XT@I^(%RywWMPeQib.yck * W끌ﲴ(m&=-({R!< (DʊJ2Q-t&)h>Mzߊ^T'L -׵i-ۀfWixUMqiUnbyuќ:`1MBoV}Zp&cXGO/]=p .rJv8]g aZ<vsJ\p8~^j?)YӲ!\3_6l\ d0lRMuHQx2 Hܶ~]r0'Ui)UJF޿0HW0tf,SAfXiCw%- -3ri!mE+r۳{%m"8t,C%x eW`֛H%6\+MB1i(½gNgVAhprZ#ӯݐ@Or +>"p ɨCvѻ!'^/aǪ\0[؛jl%AW|tި>1-q0XurḃX-bKNN%dj)#$|74C$_g*0ao%Qb}j h/cϞ~Aե)@zCN״鉘zKcAEdFyO^L4^ɬKjJь_qHMUiѮ/)<z>1hHMx*ҿITPbU?uB8/^8Dbs*lF N|h8\-Sh=ҢMr@}e)7$o[D "{shV*Ad{tlb zIө#yiX)IY҄z/ຎq HD *ѣӄB!Ж\5ff DhI{7WY 9K1l,\>R@$+v6/ U{Ug4kԟh愓U1IskH*SW`+X@|a\:%gJrUB{NU;ʲbRCF?JWW;yE3Wnk㒕ɜh3-+\FItZ({n3e4=Ă;%Dc%hCwy*}N^۝)Ȝ/Ó H d<-E+4r=e=G/ZQKp|͸!OQ{{iKOgmaz|oLH=Cm$p1IaTVpF=Uި<оBV xpoQO>|` 9c1ʻF6 # 0v,G#()7Bӿ&ژ|?VZS#NXQ :yOtΕ0wp~vTr]!ԧz@A>eOBkbŽ٥x^`)2]?u6Xئs)JPt|h{ԔV$pn^ӈgO1۾1ëv%Ըe;d Ҏn֟R]V7Av2R496~e6z}zȻ4N`}'E+h~1/@|RFQcve'R^ɞj/ %.u'ӱRO(3hujr:wN H.g眅2u}*s?{/qټݤ"B_ك*IΟ+@ȭY5<9>ULGy{!t|vn'zz -ѱߞ75ZDkW]ldB R ^.y MESI~|4c-jm rO+r04W^۰o2`ltyYQ߅"wV^7oy󮬼sʕ;Y\P bG^\O|v@ VUvuܛ~f‡ ,Bkc6^ktYLz?;׶*u: 9 jePkZ6[mg37yC^{FR(?@"\'h"؟!lϕq*aO iJfʜ -pS]Cz^U{vƊz<Њq|jucσf=G6cvR{ Lmps&eʔ uCQUi r'$Bⶆ,'3lI&&gl,GQ: 34T.Էp*ghv;\<.\j9C*+*+ݣ2kb^X'kZC ub?8hWXNzFB$ūcb9TLBZRZN76։$?JG#cpƞ~e.p40W(wH'{<%3.E̒i$G$Hal wNj:,; w]Q!X]`3l̃[u+KmeR$ 9/cGWYr3oCNlXĂCp0;NiS\DC,Kؔ*c:#n_)j9Vv 1O -e٫}t\eL;;uG4-6\NLezV0ro߹%,wlpʶJ E̅+-7n^޴+Jn;ssu;̡kB{Zu4>_~ =edQH/mfk9:B~2rqí5}EO9~dљIBZ Q\ϒP )9Jx9u(:/ gq/Ka٧j.п ;- '-.4hUa 9P^[UG'Dw #Y *5$*Vjau_^(Xe2Ss^ ~"z~N)1"<y&Z-B$if0ی{`1q0sp<`e60 [N~? љ'e|jNsN8LYc-YU.lt ՟O2VoO(&]݇H"1C|( PW=$QZZ %Gut7b,W8ӝ{a]YLc@ du2D `Pv<R1Y{UtIyy6Oƽ7c%#"FʈvR ZAxm" ӳs8Ogxc1o-͉RD%ƪ8?%FC"ɥ"+.'?5;[ˡ,J#9t ]L'ۊ2[ż=)wݾBE~=&·aaY 7e~v89R2-She ;`]eϊo~jJa%c`eݓJӉۙFV윓9&4_`&bfc\'Lf#J#T!|L#r0;!^˕5ijCzqG~OuC52L:+ogSdPI')OvH ʍ(Nd`{?hHE;']'֛ea]Ч.E# F{Ofm&]զKQ h2endstream endobj 146 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4115 >> stream xW XSg>!V0s(mUVj[2+"jBXB@|II؉$ dĥ.vVk幝ێty:z>y'99,bbfn޲#'+!{2IsX޹~'"r'kW?)3so LcôIBgf" 1bŦ  E-Z`~]XvaƄ$AN?$!;9d- CĔԐԐ]!1Q;B"vl5owA<&{m:@^ƂIbaҖԴ(Aa/ Pb4x$h"I@"q:b7'@D b#Ll!)t"Pu֏~~7Is&gY"_'2q 1T4i/Mk3{yfLVPXPy` p=ͭVjJ!΋RqU-tә~4 .W&)y,IRVj09zjxRD-W3g*]hxrkqh&9NPM"]W>>!35{.nQ-F_|\?+oe!-._J$7f|nVoDπg6h5 K$OMDoB G0?GAoO\!*ǜfyVkOYB(#梖z}xbfr \ceeC +ɏ4RMp o!)ڷB;^xܷq<(x4_ BU'i ળ@~ p!AJ0\d*S$3KqjgsDVKAƋLy(\{pm._Eɢ$@Bk~Yo#Ϧ-Rf+Zf%f+D3 g{nSFS#̅\wCvM="h;#}h!!nߎ#3 % df>75:BvpLly9ȽC4(||7WlZ F|B8Yg!l?mMZA d>bv]ɚs'gɒ Pܧ#%eTV0:p 5%(]J-n< vk jI\"3?^O58%wiDe7. ԉMcLPaR\jNe 1Z)KKG#CdNڶx_8T b8 zM7Xdo:Yj+Mɪ~ݟ]ޏ's]7{IaSu2f" cDδ}>tx{P[x\rMz{*gÖvqh֧^ǖ{2٣ৄHVX+k)4kZ TXD38y!ؕQ Z~k5fEr]aYci2|vaк`CN;e/iony% B[ 10SSxoA#%Eؔ•~`;َ&7]g RK Z#5GO%ӳ2#ҍ VyUqcfК[ohhz$NJ8Ѱ'[X]_<\?%ע5*J5TQT ,Mkbtƃc ӏj@#=WffRL?I.|震<koB 5uTa:\Ee !\\~JrA^+K`1,hڷ t~uĹǃ?Dw~Yl B tЫՇ s)|f^O^j+ȳ:kyj,EKnI=_Izӹ, S_'>&2,DXhڏ|sᐲ?C)5o2* ڢ'oǻ_E)NSFIQR:RzM_hπX BڬqjէdB̖iUϽzuMFyrPj}2)ZNʤ6[j+e;=1׊DA@Az' vw'/d$ϞB6650޺`Mssgb!@'(+A1>8z݅]v'$Ο=vK[:T\C$OFSʺcF쭹 F<?1uFGY_L*PJQQ$!xR`fa(bԓM.U>} X9x]$uJsY E.Og; {PڔCog 2 ں<z"14Z%*1wHkjzEmTəХld!Wmns;ypj 2 Uj @m)Ϯ.p`n `LLӁTVj6 G!?fVQ}>7Np;enA(=[pVi_۴73 Ԥƨ4h:ˊ)<3dfcf'T H1ЂD(i<|w 099)RS&EG6Mu𣯾> stream xYTT־CsEl\K4jQ ((J/#uhCwb,C4q4j%%CC^zϹg9{WCD Aŋ{z& Ean:՟J2i,2EzH~4Lq{<+9yKߗ 3_h QV mKeAm-4"I_9 sO/s.7oݱͅ~á1EQ,vYI?.x}u膰{vxzmc# pq쒥o/[Ίi+5stw·>ӨJj:AmfR,ʁM9RsNʉEYQ3ZHP멷(kjH-l-6L--bGM)ʔҥ(=j2OMhFQjj KS$$dI%uݢۢ7QD_W?֥{WW٨Q V|5z  oY?e옱ƋO;-3cdD'>ܹWOzhBhWGL5+5{:9i)SL9`ꖩ So‘B=RސZ`UWHmPYZq|^jN8ExPktLP JcL( f&&8&UՍ]% ra 6j/tU3j5&dS8*~PҘ=#q!(wX]VotYe[1!dfT.9ܴ#XJUz=c/KXv@^עZ@N>Y+Z[Y-;cBb0ՠatj2+Ndž YgY -D((ړ?xأٞxGo|/] u,Vöޥ+T\\"LWάX pSXyFw!kָXb:vCN:UŒx=ؗHۀ:$1pIcPH[QevW)}9yIǗ%jRV)X)\Jh3OXyNĬz( >ףΏ0U%9gF%>m+% go'j%H7 *K5vW|",;0ĬE$+î+è\FU2gn{߻ũ~U2fXhlPԮ2UλcZ?_Y*5:C+y{ŭ](A@ )1.ch'ߣa(R2:r ܟ{@9EՊ'9L6ԅG&FWRԅr*so@I[PD*.(!HPIMR{b^N2;g웉b+ZyT]{< !K$x}cl+h?dz糎Mn'G5H=q aˢ]Qd;{ÂBҽ3vfp6f4ˀ9'! T=jXzgT:*N`x~mQF0ӗxLu +@_!"jOpo l |Z"j@T*-'"E-Ob˵{iG!=$8R¨v㍏vf c8Ԩ,:&.f!4=i_& L y'.aS3cWT&a-Cx`{~:&%xKprCگ+xk B1>5.r%bR뎣$IO1uUMGb+ F 9c V*Ratw_01f\ rq2XxIIwRPja[⹥PqP{J&tbj<3kO4gKĎqaey)ɥ) `ZL|<5D=J&0vs״)׋f*ӣ(id?^pkCb| DȲ2Po=qt}>Eo =RkZ+.{T#B4T/6:ޓ-[yv7/w8uu[֝=Z?^Ȅ VӀ4ƛ#9-D!oZ`l6dTf5#ӶҜc!I 0b A‡ڑ$EB \jPЛ~ēy8 ۅ< 809_8\C߻DP`!f 6ƻ(ݵ{w&q,m hd{~ jӋt6T~L0{ny6gfRfssD;Y߀OYTkF xF "Jب ~͘O پ#9w/P%1>5{'/Xg|__EQ 1Ifȧ<(xKW!l٫-0&g-QWԅ]-qNFq(P,JE ;-!<C9zާvjK:ZWژ[!1U %x#ܜv̳>}=;y0,͞mqtuQGG-TY!2pԫ)\dD+v)| ؕu^GƗJdZDWT| 䲨)e;ȿ>AglaO<<lbhyLI]O/F+Imt>}Qktm.$Hn}8l\$/Іkjoo`tW֒*;9AERfə^RtG0?V'/aWw(;~16',4GTlCR>![X_s15~|tE/u"}f22ߟ-I Վx>_q`U&s]0X焗&.!-:0QJ$Ubgm >[њm3}VKs[-'l;`>}?DFtK5J..iDi9m`Htҭ^uE; ;a;Gv GT+4^+ulr3 wݜ?[Uj !A!z@ *`gčC6qri{xx&&moSO^x7o7`/C]`iz6X9Mʑ$/j5i@NԎ-r/V=B!z@/ ; cJ? 3m25_s:#De6ٞs Ѷ<#O˒A[*`Li-.hh#SxN 1YHʄTUt;Z$:wtх ĥ'G>t* en5>R'p>p<^ܫ54,8{C<~wz6$%!3ed] [@\!H+sݦ֫ s,Ɔ]䵪S3rNoXLLX4[[6/ڿ\$/cLcdmHXx (0~oE5>RKP'Ñw8d_QJ;y!<%vk<Юe %d=[J2R%F:s kgl]bʈ+`˧S>R]'s?^ڏu=\rx'(LK#_( 57Vx_A%>яCR,@B'6jDLߍ }qyBtZyU]F ֡K:2 %#GJU*[; :uVU zmCA<)`/Q.P|Ml[}r]e/GcwV?<{"b6 ϗ0z~ܬxݙK誋mV ^G>yk_9 nr9| P$ Jq+n&ٱ9 UgW1x+4.%4>Zwט}EsTug n,Kx9PΎGULcTmp,:пz)L'3!~Ūn裏ZdLǁufx̺e"N0K<]JTC5!AZLPzPV|,c2ogDx|:Q: wNc8U]מs_ c?S_AW jb*l`]x$q]!^mǚy|]/snD7U-{ꑾ3[8 >~A^+19-1aU-u]?|@!1mzY|LNJ]=c/5J䝾wŵ$^꡽ 5U0`g_t?gSAN]fj~},Vq;<#cS3)( _ :=r8{nXs|ϱkx|UVBS"I*OOLC)15%<ސ[|(^u}nm].\~B!)l=]VVVHdȀj m9}栛rt-q^=&܋@NQaa^(#ϺT%]E$*cC)Qx?)=1ٷ%5/L  .£._zЈB6(u\{ I%ǖeH`Ueh%xX$˚>B"&\JsP濞G6c8 ?(6RFYS8?,pȑC|ݞČ4TQ 8VNН{ISe?#6ïخ|WK_j*Ddz>)qDNB(4",/_[Tf#Th:^Pq U_e&c7[\[~Ơz?%c ֬/߻&͏M(/5%%@97sBUgjs ;dd_9Rl8endstream endobj 148 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2887 >> stream xVyT B2F!wZkŪ wRI$, R@,ê$@,j5Zb}]I\x3a9s|s~ݟps!D"ѤkhԚ)shT1\Gp|]!qž%|OjzzBO3 uNFѶIH%NT5$+)ׂCdQْٲDM.1^&WV^3[Vo4jYTRidb"6.۰Qa] m.,%5M2D)񉪤7f&uDxHl"b3XBl#2b9F+jb !D—p# DED_ruZ6+,M-C-ru:x€GI$ryQ}{GCMwsN J&7dct^Fc~eO(*nj }͆7!&1֩f^8gJ p|D#[f|̀E\$ $JPLKdڨP32n))Ǧ+HCQwXØI$J<3jwqԢ/Ke/P=jUӅ`>;:ksb+RDITRkk@ WWPTQc%zVm0öCO_ôBWsHfGv/0:!T H*2LBr[ɽrvH-\+h͟o2[+m E6|$zOȤ=r)chj)3$|9MoEwYs9/Qjax0x  b +QDYkKFe=\KTҰDL^8@<1Kt.ݣ4Ա@_l#]yAKj N]W#o5xCUC$9irRǪR-()ZۜVV;m1uMpпkq$^a&ыh+jyٜI 2QX.Xxwwiz,[E3 &';FlEĕo.}~mF$(&5wj.H^^2 nQlH!ƞ$Gb/| vHP71Ec܍]FGoagCaUH[Uɭ` 좡|ݕ+9]Kb‘ېyİBVq&w ǟʣAUڥxʸg{!ɘh`FpijqFOx3[cB1f?xtр7Y:mR@zIm!rIPfaTC)._|TN ,-Q ibmm{J zSBmܳ`$ͨ/ypTXT5Z/E \= JVݦ8'n= V~/~|s]UOo?ە%Rد}_hz3plnnA6̦vѵ4X"&TfYj=H`bϚp1ԕa'PX!Q'ZTZMcI@Kw8 ic-y}|^(B~ o?g[O]{)!9e D\" fHfEt:`2UK1q&l*1 0mzz՗_z˖#كĿ7qIendstream endobj 149 0 obj << /Filter /FlateDecode /Length 1384 >> stream xo6:(@1㰗]؉-guۿCRHY8փ8ߌ(} 9q~(YyH>gͻ>u #-|y4,ה`ugwd[ː`1U1XC QeO$rf6}<>'P;ePjx$DzdRI'r*z%Q˙MPfYz/&Ö1S}&rjgDqz9sN) b,N<>!'J4_ 2'DAQ7gQ1L(Dw/g@sPr?ӆ`|V>7j<( $`ǽJМ[Km0i9jsRzpaPYw׉A F3Mbh9GƶnԀ5?vsrq!F-V)qQܚ0)%K,?M!P:!-CgDw3 (]ؼ+&ﯺDP Uila.Y~2Xp{4qMpKqB_@~u2KUC_^>weUB7P̺=M X FRppS8&,N _fl:+ĢZ\,0/>.vWꔂ} \4m6Y'=Ԉ)#SYT'a~ t<tpwOtu"PAaR=N8*1mG!us ]!.w#. ⡋L"bN FDzi@7u?n]uOe7I17,o! Y>n|a8h<LVd)F悚OF862󨎴EtpA@Ha]Mqr؇8Gaef)͓az|2&<0h׷팗n:uװuo5Y-r CC?ymr$^_jW=ל{QzTAɔ%B34D%[M. )7 l90@»qDj Ί=/-Fcei»F=EF.dƠC+S!`r ^Og߫mD> mKL/0$cmWSHw;%d..Y3  Uo״="zۯޢR)a) H&t0E*Pip*» M=ķi4Kzʨ44Ƃ I }) endstream endobj 150 0 obj << /Filter /FlateDecode /Length 13953 >> stream x}Kfq~`,@c  o,R]rddfeK]3${y/qN!<Ň@~mMͿa̧JH)>ÏoS !և?oo|B*O5?^Ӝh)·9SZmfOZ~huϐZiuڞjjX7ENSW<@OZEB|ti2x =d?ekOwW*e{"$gz.#)<%BFz*3\ݟ^\Nȷ$c=0QqwFnOu#mg*m?u~t6k[XC%W!HuVIzZHIX_z11\u,rb,5ԟ<{ͅ6k,nSq5s{.30ms9sY7IzSdj|b_9Jܟ)m#LcIIQƔP[FXT {XMݟIYG'O=mm A"+L{*IXLASܟqE&?iVck9ћ#v#|Z?y!4Aݿ|O0^Ṙ4o{q*?ZȊ-^hz(r/µRĵ1{!U |+E\+rIhku=FkԱD"1y 3N|qSze5˒_oHu͋9B~"bJ oWZCT5dom<|UَonV@VJpJjעCH5r})/.X[ȈRSyE.niczJ1ПJXriK_A ˠ7t =1{ɷ#~z.L\OM~x74%ݗʵyǟwwo7{$DCmi[Rӷ}t ĽK e6ZȢ(k!Ee-dtA JFYE)],^.PJ]Tht$<邬ऋ*]!'],']ls],}VvJ/& ']  7],m']L%DDڞt,9t1MS˭i>e&VTycAr+8}L{LMx D8W`2CP&1LMc84<}8iq8Y%,S#'uiVp81ILq 3Y覆5,0@b8Y37݅rjX ԰RŤSauB;5,6;u ሧmyF;YBvQ`wܳg]yRqil`8SѲxtb h_le)/: 09 0-sg'7ь8"x#_#)Y}nX u GR{KH!!r#jD69333RD=jDjӒQ9P =2!G"i1jR{dڃ!GF R{[jԦDǙjQڣ <KgCjM hi*}*+1Ctrʞs(S i;4]i;:i;&& mD+ "viKa%!"O-gQ fۀ{B 1&GL @\?[ *}(<<"i"p c0T'+BzK MB$1 HЀ}BӔOHaHN0g=|( uY C (7 X "=P=F9 (P ȚGGBc|&4tbjB#;4YFB*@344ۍz&4uЈkBc!Lh(/iB#5^4Ј h8W%u|WoxJڀSҌ+E'G5GveԆh> AuF:)R/ʨ ]?P/ߔ 2|JkE~FId:i^3J|-2jU3@*%LA3ADM#(@1=cFA?WL8PX=6cb֛~L,VӏE}<&m)Ě0h˩6cbI~^MuW3 L|giEIpL+N>[@Գ\Y5(aR͢eTaRՋ 9E419T;ǜEMB|hM19~>L|"D-#~8k~X SW6QW6^,BR^ J^!+A+6o!pdVdԐLlMl&ʹll{!p 6f2 tMmn9 ?2P67Q+e7"H3;hi\lNvN+JpjE zìHmVԊT iVɘ.+"blds!'טÊz0r2?d ^ NrBaEÊh An^&MϏMB6/ךq[ٽ\˒9vu2IxȻ#N9Y^@|ٝݑ=HS6uPF+B:~*$##(OF$Ɉ5 D2L(dDoaTrc;ThaTݩ2Hj*NaTHN>#QH[)>^FBE5o(cHlujZH'T(:[4Pl? -E[:[X:-'/<aR'(Ҁ:-cmo8hGֹF{ƱFN[Ftu6B{ƱFy£u6Su^buu6ڛWu6B±Fu6B±F<I{z"tGfʙULᎀczep&yp?8F3[Glނhy̦M3iof?8i\le ]S^Ea*<-Neq(+R++Ҹ"TJІr/WBXW[?)mi"I_+=c?$ˌA$;6 񮊤 _ID5.I kQ ׀;" DRR$Ε RID3aIgCe)Lp m~ڤK~$Tum9 板3ߊW`k0Ǖ/Sz^7PN^ Tm0ӵLEQd3 n7vpޡR麕=Jly{f8ޡmt _t+a3=ߡom+!B@5tUJx}Z#t}BMڒx}o49}Ψ5ݝ3eG3Ϯ3$dUJR{UJ78xopT^aUW68lU I3bcEGxvhv<DGELxqX5%\*0m:GZ GZGxnp@-Fqok~c\</zhŹׄL :^ 595 2WB5#uy^{xMx_ކ^1QE/tx^ Cl^5 BU t#^k |xgWvF Bp_/:s^ gUjE&gUU3U5H$hUu#WŸksώ^>pΎZ+Crx8)Z)ZIQJJNVVrRԵRĵ"ם]i&>']X~1g1cXF(OP~Uу\)pBa]TYL45.,Y[Ӟr|;Wz'QL a&&Y݇sfq$k(^l_0&\R>v0B˽Ԇ^!#t~\NlI$#DK pQ#!+ m#Q2B1!C LIA9}?3BBu&*whCY}$Ik,F'ёL\rxFC:]0+o-O:u,"U.> mrol7\|@?* 6:$Z!^\9< ?L QA7͠E 96A{ #Ж ߝ-A[{p9LlJt$ !tFG NG $ҹQ!-5UA(0+th0 G9'Sc'—J2lVXDCVXL{ٖY;*Z=ƣ">xRĵ?> t/>(}|%LE( [QߪõrRVzZi4rFcD;Z٥RKPAE.}i=JL! 4Y )7|9r>HQ`[ efDGf\w+kF/'-+Жmm퓩0mYq..ЧfNnіmm$NG[+3mYqF:L[vve@[o mY)Жmrhk#=6WFtЖoôs6Phk#Ch-w`<~@izK:׾-Qi $U)^MDAoP.eWtyiik] ݋ys)؟^RUnK,Tᮇf{j d/nRmK$l37–2({Yj!jl-WMKy0UT~ {Agxa8fb eQ~@,E(?:d/cS*b ^R%, %{H _J@+ËW6xJNK0O4Y\3m=Ot/^83j&4̝ӻ|:CG܃G=;zCVe@ Hɻ@̳yrG℀ $=t=T=X#y!O]_ {!y! =axqF%<<4<pP̵f/p3` xEJw"ij@"F"N$+ /bmؐF"4}掠M_N3["8f/"/$-}˳-/ipipr>Dtqq|ʎh*4iip#B0*4p*zj2Tz ق !#n!$Vjɇմv$VC`7]4x;5m-#B6#^ (+d׺LfE)\n\VMfE t9 [z2[Oyt60UOI3=ڽm"+d塀hzLbzLO␫p9!"BaEz|!ГYdHrɐm8z.ە+vyqG+]ޮ\/pv2/Dz. .u .*#.Ewمzጷ@һ̠m8Qd9ޅJMF8Qh+20T.4|>K6 l*;eN6ʅE6Bo'WO=ٴl*>^dB-MjO%3YVUΎe},]VyմЀ.^73(XVW6ItYMυ貚e=-e1e5Bx! jTMNYVbXVŧ*v1~,e5*F}b#^:m$|'e5B򱬶:;f tYY2e]I;r,e5:7e5-jjtYSe^ [P,J.v۸z& gRYSy5lTlq 8! Tl$S^5\,P*V^{k++CByzZhWNW Sy%KWYP^_I(۩p.ߔW GMy|[93Ӑ0}T^si++dH2FER\@Z gpF g;T  h3ƽ|+ֵps0\w״ݾ^ӧn:핮kJ}Sy+%tU$^割ǯpH?1)k?cl-1~FITK8/g_{\r^j'}x ~^g2  P/Hr \kwk"zWD h>^\K* xiPn@K\ zD^ig ϥWC4j4jWR.wFhEg?W x<^u܁WxՎȎ" % , ! BExU -B *EjU+8~9 ܇9QW A+S" BqTkk%B]+E\+9Z)9eh#Z[C2ݕ9]BǗ25},EPPqߓ('at;);A%0?eeDk"W6dMR;h ~IҍGxsC @>VO=B){3xzHܛ=}/'v'B 'wٶO2qCEp"#JtEʍOb}RAJ'^FbR)x8Zt9I(F/Dg'Q#H WC Y:CTޥ?-:YVN~ Nݺg)[x$mHWr4gN)gqWڮ?!v"Uďkkkk58k?,3u ' LW,0}~P!~Ud}ķڋQ}V@VtL9Z)i+A|SsMen puk M`e)v5')"vPt]T#[O$ ]!2x3 ":;Ct޷RDKB h Z):-SТG=´Si:ZӢ6h#L-:Dh#LaZӢG=´E-zi#LAG=´<-:Dh#LaZӢ! *]Եk*L6@T2^$  @! <6@qNC66@P0lP(ES6@pe\"r 9Q99oU6@4p| O%s ^hߜx J_| k^D UQ5@"w k]׺ @ JV_"}#q;Df$u'?8N!wp;DC;DC;DC'q'q'q'q;DC;D"ne%I9R;wfIJ?+>ZpB o!Hx.a6I SO<„fx9#L*aVJA~}&08D#-az3Gd*U(Y#L3BfrQxD%KRuq<C8DO PCsqx q8q8q81!x"!x"!x"8q8Qĭx8#]ZR^=cy]$kUDF9˭r\Ur\5@"W9JU"UQ|LG("E⣈T:sl D"RSC&R0Djb>E*]ǤjTD"Rd~w"TSLkE*jUD BP5@P5@"T jUD&Au @ BP'VLh>!B]J]Ǫ"E8#tBR8ȤhfCq4!-hfCJQl4!̆@3l4!̊f6hfC f6hnͬjfC f6ȗfԠQH!8A!"nxzw{wxV;D<*".#@Ͽ xox~blO̪  7@< ϯ< ox~ #>>G(?br:4'引eJ A4!RC)5RC) a$YQFB"i#ᄸc$BoF0!`$T5F2D[HrIe$CH #F2dIe$CH #F2dNzc$E #F2,f)ī2@ּC$o`L!b';DL]^M}5~1U4;DL!b{a0uOn, Vnb noļ 6@mĴ ˞SlC`vXCIJy5MeD.!X4!X8Sq[TDW/ !X4`^KEt^KCziV/ 'NK4D99.!xDE>D8֎YQ*O^VdX^GXQ*X߆+J Q+2VdX!"C`EQ+2VdX!"C`E3+RDX!"C`E@^ KΒb#,#IaWd2@9X2=¹̲NflG8F=h8UG8i:DᬦG8"a)R[#zC_p }=¡G8)!|YL 6`* 6t޿Q}}R[_0EtOXCtO SĐ.of A6d A6d A6dl!&l!&l!&l&*DCM4DCMYYmF> B}rYL_=& y0!& 0L `j0Lhd&C0LI"[d&C0)! Ad&C0%)e!рLIfӱ#0oϸI%K-`RD&E4`C рI~L `JLhd&C0L `2"0L `2! A\Lhd&C0 }xV msqkk%\+E\+9Z)bp="sN>58_ל/->&C-y ; T6XQ _w>Hg>}[:/?ʽxoC{o|ӏ~x3{A*@o?ޗC81}/C'ב}X_Two%1jݡ铯WS~ò*uz[~C xTڏ~W\hey陞OU)Pw̒~3.J-??LMu|;7=@uR m}at51b_ʭiɏj@("_mr|{~"^xuoۼͻU~!l7~gU=qۧ=p!`hq)cqV緃n4uzph6?p|_wI?(S9OG+5_'EIf߯#c[bfdW>'oWݻ?,#-(^I>9f˲x15i+|ЯVRQXYc{1Ի1OzȘtKj=<߿q\x`Ef^'CF{\bK>PҲi~}f{~=z#o}$q=7|O^O?cuL1*MW.BoW__WJm1dUT#9}?g 2^ﶥr閨J Rv{&Oendstream endobj 151 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2961 >> stream xViTW骒T! ["$ /Y @[dS(&*uu FqQ(. ЊD'fg5fsU}}4e6i?%#/%'=)rmiqqaޑ|8͂BdaV2բ :'q?a+gΚ5{]f~VzjZEHWDᓒQؓy)2)tubn"Ь^Mؘ")09eMHjXzxM9obEs:ST0B͠({*"(ʋ95RQBSnTQAS)DYS45Pe8j@KڇΠ{cь9'P+i<1s5K5kNFH0ӘL w;l؊owY g,:ҴV]}ך?. >hloB+*X}@w@8/n%s]t8)V `t G0W<[^)~?Ldķ{P.kg?E&ĥn;P%?hVͽNk~7I,^YVR.KxO& 9o2ާ Օյq^o]e= wD_!NSrc3(79UM{%n|i]<-Lo߹vk8n {KCɍ&בrno=9l~ZW)+'=#U H9ppX>xؾDOFKJC- _K0 a+fX+}΀ ā53*Њੵ |Fy.6h:lAf)x߰̐d9f C ήa=0X7j"$\h6Gg0+a_p:ni/;glFaPLx 0[|8N7$z j#*-9 i AFX`qڛq8cd0"0d"B\ʤ5H"S]1ݱ`S}Ysś@zJΟw=V|ymsuz$,KR8Eo+0\ol?Bj6T(i7CesD䤴$m=@t~\cz^Tx\nEg*vclgM~:FG?a 3P5_E9 ϐmbbݣb\MĚv`*qz8eOH𽄸ewx[(yu\} tՖ״p,V$vl>GǮ `P6#Ǒp,/U΋&od!ь `z\(m@Z¤8{,6V.9tq`fB88Pa * J6;)SNv v5D/j[H1Bcq/ÿQ-cd>ۇDzH"TgqJExYrX3}i AyIm!EOj^}:޷/ $H~^>L48uJזFAs_k^9H6j##1b+@ضv%&lj5Ty~côS̴"T%䅬e4&!wVWpAMá "FRC ,ٰO疛^(I,2HĽz8w /'rhnLN[&f|qfoקq=C=B?^*w?+6b[D`ͷz2ŰΎuRNI联ckTmid?iOW-eg;ŝO%`jb;58P9?'M-:r#nKE*19kZZᯅ_3o OI Pe@H ׬[3 )Ճ :}A,E>?<̞_uĸY3ƾ:\nS"Ck0̇ka{]Coendstream endobj 152 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2727 >> stream x}V T3t|*.Eqim]EUDvjT  Q7ʢ`Y.j[[=.O[ʫyoj{Ir2}ߕPVD"qX((91:i_X˫ Db%  mZOl(34u@{!v;X7S0̑J$qIץƯnPO%~^^>!^^0n8u@r2^=*9I2Nv:y:$.B840xW{(פR߰qSZneLlUAkPb*N-)O* ¨p*"ʟKyS $j )75CJXaU&.]knY?tC:`s–f{itQ(wa2ccÂ"R8hs-ЗM"jhTQWhhY? 7sZ,iB'4T8IJtE7GW'NЁ#N@(wTovh\X.ix7^r}DŽi; ; I0 Hsqm.+=+dzjkk7֫0;wfs~{DhŽk 1 7p([d5YO:tI+[91<a8ǡgr-z -4cN@ 3aGʭm\nE.lf=lP Mc'pmq#-E>&ӊFG[ޅ}"(Q&>y \Gd$kwG3C6޸s-r> Z H/ TEwS0VDL}9rVIn-Z]EUnFzT\Ptj~RA*xk}6@~vaX/;ˉȍ2gڕC9Vj"x>:B|7x5ׅ9pC~bzkq K)ЫDGdDr}4Dn6j.Ց<˥$d00,Q{z"wI^uZE{L [ ˞Wp|6-/.u^cNqa2+ ZN#>̈́L. ZˈkaٿSepPE!d|)Xq7GQ7/> 8sh2a9WWnɸv@~^'V BB<3ta)jnMt]q @i JЊ8b5r̂N[huÓKU>}UU1]qts &\{n^Cͧ@[:uQ.Ě=2d;x?jh4EhMI!b場#8O>FRa~fn6- JX (@3*kyPYeˀ&!~C]Wq$c rLߦVE>{QR!p7.S*mQ>IGF`2Ύ/i//)5**,5 Tendstream endobj 153 0 obj << /Filter /FlateDecode /Length 2196 >> stream xYKoH7@hls`q"f3hNV6"鐔fn[v`BIv׻*}NpFl  ܶ3>H5%"1T&̝$"8L%rv~!]3c(z_3B2#Iϖ?= fP5 4X`ֲ̓{0txFXJI%TW _ #G""n;(!)*P>aRkAjM_ۋ.ُ ͠9H8jMQea(o_ {4E}]FaF'7* NT):9>сχPj~MꝻ=SC.yR+(CְMޛA0TTvMa ^wݰPTӜO>4PZ{hQAp64s ^9+}5 *a[eEфnK;cG4&./0.WIfb8nAǬf#mL/we~|yM1!A)6B6%U4a}q>RC:4, )&y__.z_?Dv1~YQQ)dtΤHMeZd%PMtBsf;۝q^e+c|H<fA BPC&8aXރӇ"- oF&E fŎPJ" ]x{F$Bi}Amd|6?m4(:6eOyo>cf #S=xA hְf` /ݰ9yq_m[W'pS0= p|~]=_ԫHTS4~*QjAM,:RRPL%IPc4X'_%mo{pc"v{|Gh%? $}\4A!9&{O9,DF!;VBq``ΑJBEup~IH7%.Q夺 Uc?Cl~,e0$c>'Qb6vizQwE3,w QMycQU`M6hU ॷPLIHs} `r!߾v}>EZ,b>EfMb2jC+{1al|Q˛MKDaϹV-W* çۈSqPȄI]bbP^۹Sa^P|)0. ?- Y(29)ey,o:Ә|#k3LO=L4v`7 z|}Eq30@4)?#I< ާINɛ =ՇEۋRuF_id. +:D,zNendstream endobj 154 0 obj << /Filter /FlateDecode /Length 1363 >> stream xWnF+@G5@IEEZ'Ht$!);$%ҖQ sϝÙs>;_%?E.O i3_/g0SoIgI;V3ʤMg<{6]&S5Og$ΰq C'g8ES$aYwXh9=YTɻN^}uyL x0Ub++4{cT25<>mBg(JxcJJ4y^/7M z X,c0'FT3H32(TXIdD× G H͓"(CѨY6]''m|tJa~ Y TSXYHEK5A$]eq"SnS2I(+Z1òҩqau,:;E.Dx("Ř"âˮ09BW0mKUۍVd>@j{:ǁTE֯)= YV4ź ٝ^9mqjYp8QNEJq )!@_f'W^9^3Bn>|Fͺm^ g8Rha0/Yw MzZ$|¯Zr͡]Us0SxDgZ-?c6aH>a62z*giУ%~Cq.PC [\-շ߇FkX.Kp ]ZSa%Ѓ4-Yqz;[-i0iBs˻!uW%gmmLvM_Ao~#[#HޯY}Ơ(1L(=ާS@ )ќoʛ?QSendstream endobj 155 0 obj << /Filter /FlateDecode /Length 1562 >> stream xXwG xNYF3#8K_{p0s-}NmCFHIf7&u뿧g Z\_E핤M67\I* f> Rs>x?y<2%7jҌ+Tlj*4`xz6zt<}d4xj*i67P "Ο}vjBޱ=]N=pns|e *dykgⓇ pgEXRvB=LU`l:8r԰tXP Yګ;W.)s5 KVRc1=@e(BjS^ //Ƴo'sR>:~5yJG VwUsKBP$ɭ`!8ĸ(/y32^,&sѨ~K"t1,-I9ƪ۸.og擏ô2JO|wle](lyPM [} -R] .ubLdQȽ{{7￙|/O'Kh5ghF F߯dЮ٭fVBkTSa5*9*Zנ&&B)Tbl#닼-mBC$-^^@/֚uV`Q/UBNb%S"iɜ {DH62g//T/ ?J2tW)ҥ$ЫqrPk**T?j)DB$/xpЃQwsD.&&jhV4b; s-$ڪlzT*]/->aTv3So㫫უd0c=^mF=^Ok:Zݽݵ=^T!wÒ>ѭɭ٭[n-nmӊ7*x@^Iy ID^Zgo Hi"ϒ y2_̺/5`#QP ^P'G=GxV=@k(_}:tbٸӳjr?>Ώv9iO?^`$W`̰[Z0hg0#*vSŠ*զ3Çrƕg<3fx8nJD=(쌈ή-q~B$a-)xWZFUSL9UmAd]ݻm^!LƗ'0Oll0O_;쮮*bYqn . @^UXP$a.5N&vvP]|!zV857$0"m$kn)8av亯rCpoIuIendstream endobj 156 0 obj << /Filter /FlateDecode /Length 2836 >> stream xZ[o~ׯ q;K?8 4Ha"%EYlgPKW =3s;gf ؄_9k'3:>Iw|?ZM\4דYX&O f2ߜ!_=).+8aD5Qf:LBFGMI꧳ސ4;\Ӆ%M ))T Iۤ9lV"XayE$u߯{'e8ZRooV~)IQ.E5Ymu,|VT6ȓJDA:M=h# c4nGM' ݶ Ѯv$˙.l//=*gRV7uHd @?X*aTZ4Ӕ2p>(`'Qu/M]I`&3sw,h<" D֒ 4֧-%ѥѓ2^*(F: o$j{{,]YQSYQzz.ۇWUV$C stAHHQNRZZ@B16d]zSP;cL7Kp‘e>ކ @Xl6q>EKb1!]U - cB0t4<_U]3t&~ݡJ1Y *X]3 Q#M6|2Ð p)j_ JI|,zeRHf7BWB8Mi˄x<Xe\u-zz$#ծ٤ X1 ɫ&0ጁCR>pu>cPaҐ;d$8d8 CrY4(Run!7|5RQ_Sr0tu C ܮ)eR^n$1Vk1a^*6l8ʹ\h6X]s!qe:jX5ɉJHi?t*ɨ.bLZYw0-! C1)9pܓ 493: {ߣk n0`cd̠rr$lW0-5_,[ШBtgJo[ҵ%Y( { $0aC5""@ 6S5 N2&4WdҦɆ[薴$)a }gӦ!.[:S{EI/v24(}иe_~2\+=>ӰdoRK6؉ |,0)S;ʭC3n± cO0"e[KA0&`# oIFO^,4zC-(3Ng,E".F?ys4o8"tߔ<]KXPY2@RlqtᡓXrB4i:VRI tz>UPf Q!̸+#3;M.'']xamM ΛE}!9$#e4BOӶff}C(RݣS=E{FQ6Ҵ$,N0tJܻb=&Qn |9%4,Q*i0DcC7ŌP:/_ 2L  !CN-|C!'?*0GܸPx`=+0` E f0,,P=J7Ã[rq~!/dPslM`{(<OS\TI- z`t8sQܡMgpE.xOB.2>arC;|F6k*w 8M;r~{>2l5O *4si jP㤕R&|g{Lzj#דU~rIʔfZ[Qcv31xaI.ge4bF8E9!v]9:搯p>٢]Ku-"1nyPe#q*sROh H/K{}WNw?Xr<8tNBޤV~?oS*,ӑ]LW!ްNP\эR`bA>T[ ݑN5bacM\XrX K;Y}&,NkR^+6aaá5~(>ǭ,E~?HRAZ\uTGkܧy^~{b9%=xf5>ﮜƗYt^q*k<.5>oz p/<>U(oO~n&@թ0,O" ] o$O.oߜ|n h:Mݩ[&QF9ފPN+X**aKrщ9<^5gRASܢJg> stream xYoF'w 8ߋԇ@)T`#1@ڿ^M|xٙ~5 Di~OWEMfJCyH_9̟r+>fZWxȟb<#-YAe vȋ;8`{66 lguW:_y5_Wֲݏl/Hjq=Sīُhm]a͍0WtoWz0rbvm;b|J%iXtfۙXl1xᎻ}Xw1h|Z^4~E9gzybjǘS%mrrOwUJ(. T"9wټ/A*śX FDzXP`/!,)o1@}?ӵ7 %E*ĀGjq|1@ ltL3cޟ^V>O23qX(z2-*+rD5/\;Y7/U/ڀ>ea=W,f7Y|JKM;-05q7}Iq=-׍+!ȷ,mTϫ47_&+r;e SCuTPN$*g}=]yq7'b]eӸ$Ţԭtv"ދv(BdefVGPHC1"Q\Y<6QF=;^q"{~yݖ& Fdw)"FHXp>5^gm&!9A@qj-ub߼Z7Z:]qj lW4X+ju=t/xΕ;G峀}Y8/ucjqL > stream xm;sF{VN]3"N&2.J $9 r޽o5˨qvP<۝f4;Xx1]af+:[=͢% &[g/9Bm>se-o 5XJBYN_]NlOſ9cIS( ! * )닢usCA5YL ,5H7,$&m q"ڲ| 攱H^rFeG|ZvuaPnS @C*` |jB;2VHjm|#WHlzg=xVe~Mo+-o%D7$ZY!mBm_2-)YP)kSe7bspTiXWu3N:ߏAԏS1Sl  k^xR)5d!맮Z ]M NFSmP^m E~J(RHG8!QG(\8Mzofim d2KJkT7@Z9.WI*A#/ZL$\ehs$w8)Hp(?&W(3\#N0KnM%}kbvT~0dĄd۱VZFHH-aƯhMX ځqQs˺z#{u=jؒp129r 1B} I\@!KaٵM8]BireFx* %OS.Q4JrQ ę(nx5m(Rս FdW hA.@Gϝe>Gά{#4!rn#P<`p \FaFs = l%4vmsߗ!=8sAo}Ǔ8$i`{0ȡO"{S N R} ;]ga1'e>UsU+ f/|qME*endstream endobj 159 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2192 >> stream xU PgaAVak5)#bt^xk$*E۪O pFډQO1'w sZdl9q K feFe7ݳu%6Y'+' Yalɏ >fLAf2Pu˙itgt~Gу{r-:SfVV S{*$)CIN8b4Z~oU-.*ѣ\O>f۶%/5MFUMAS&$˒.=PQ]mԞ$_gʠ0 &T 4(l5S\7(f QYeq#s%U)1 _PIVqR˖QG} X>"PM5hToQ p GʁXߡi<ܚS-čO[8y&r8IY qG#g;6Q1@4~.f;)Z3wf.Ӷ3]Fl33ȎAK7FRNkLdg#_/q4x0z IVWYo6 KK-r_*03 FBjmK2wݍ:@LR/"lV_56pTdƐgl ʪշ_g* B+P ئh6肦WCMV3u Re8k:+S8I~Tw>5E}fYNj;xldɇd"# ryigoP2Y\QWEqAȏr\M^=dz%l4J-1T E14  HIy9ӋPV-0׻e 0|ג|{qS 6O_s_- ,3tht"1c &':&qL#s1EFzV\)%3 BAsQsQwHDk5'촞'7ռb+U!( \SɭSnuC͂h䈟c6G d$oXINVuN̆X?yik)VGcԸօ|l=Ewnnӊģ[8ym V5ڤǡYG>ed67QoO _p{MpZrxU<#mzN&YxnrDDĚgnCuZ'>W߫/ʳK}B|dR0,thKWs})wav샷RF|8Rvկuw=5KKkklh[w> stream x}RmLSW>WZMG"ÄCdk$q CW,-jY TeXZS+qEhed"c,5u\.h,e?ؘ?s=}$ kjxŽ2/KBxN"JDBW2߇؝p$%nnoye%%92s;shZ3Wsb]-5XJc=XZ}0Bx.7BuATw!:#j%$N8K"BI7d鏅s Mt3Cd.{uOBc O3Q#1k"2:囬H:c\zadS PN9̌#n@V_[.zvIO*ܝǷ\461\l 7ngj`#920@ _`W QSwNO0B-MSc).OM?3!7XeZ>4}4&CT D`ΈEWT 'W>=#rz^p1| f?F|fpyzs?Wt0Yӷ걸٩aF앟\ĵHCa=a+:$ӛ2M^`p 8V(1 ?xTbܵendstream endobj 161 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3408 >> stream xW TTg~EATDTkM=֨Il1AcDE] B}꾢b+((}WA F\II'tNzO;83PUν}G<oְ+n:; y]kxBbv躅s<s DsQloKKY+/}R[1Y˂7G&I2ғS7/ [.^L ~Ys4!:Y,G ޵;cۮK§ 5T"K? ytLl\m ;#SV|,'m""ID%nbJ'6&ub3&FD+Y\b!7—hN,/oPU>m/OצKglqkf>+<`aMճD-Yݓcj.hЮmA;UZ=&}#<~:FqH+Jd*jR 2'yt([AQ2QWRs=Ga>Z!*@NoJyԌtEQ~? a,;Cy#Q KEV:9j4^8qNVhMT-DӐ kc i{h:(<[j`&0ՄE *j,~ˇp/1q}-")#/)2fC,3ȧ21d݁t_yB DKlwV')БryU&*+.C?&/W 2R^,/m_;htVr>^*;xu5z$+է,=3[Bq^Dr4Nj }-Wyu-_ >4܋vs ? B Ud3[&70P̘\vx~pH;tiZM{ͧ .]І";#a:oX<"0 IS׿uT$ g|M -~ƏB a ć_}h wxq޴rCpՃV?@ӨwF7yqo*Ǹ9l'J;]".x]A:Q`aX<QaSKnbl7+hTI1 ކF렩sWHLۡJ~|N:RFhܠg,d!89DVIb Hv~vj+fip>L>F.[ΈFr;x@S/ V\[W^yB'6{~Y#1n{ĉq dUY? h{嫩Y׳†TI:[HGpkGpkǰFଊc= @z : t$7bøm-UJ=2TE@TxvqbD!z?I(dCc41P@ ؞f-=)(]/+ڭ("NS{e:GUZOt\"_=ajW !W5LPFU]t^6.ܖgO{#)~. JAaKFM>Eo. a-Gó/+k@)(^`\-b?fL2&E1 TȽ kDgo-PxD2QX "D(Јz?s*F#N7*w Z](^񼠿~x0Qa'-1%k0peZ'g/WX_Zo>V*i׍fU5iUZ5XCYs\ʒ5SW{;}lM~uT(u`r+o% 68Dٛ+2 ٜ@ i6N=O2ʽ6/h5|kcaGqm^(N%⳱2eD+ bI֨5u|֠殄!rXLUxK-C2LH1Hx|Cnj) Ykpw2˙@Nv}Cѱ^aE$$K< guh.pHiMj @MT>&rp68d`NDF~.9CTK{0~U $߻KpV>oDIȫntU 3fR3|#%fw]fg[Sl43L)cE>endstream endobj 162 0 obj << /Filter /FlateDecode /Length 191 >> stream x]; D{N FSX4N"Q|€0.rS;t|q6zB:a{T%,!cmURjuU; ` ݃fR^(h"OpN] ѩyR^q,82#^eO\ˬ28j\)kuCq,=Aaendstream endobj 163 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 992 >> stream xm_L[um F%>#2Ɵ-hKK)Rr--mo v@En8dѨ1e1Ƅ.^,ė999NJ$㏾DtgmAyg@[F5cDhn6j+-L O>"h c86ڧhjnΙQO=i6Q]:MW(Uۙ6Yux_6BC;4aŃϝ*)cثXVO3:V~9ISRPrj6j[*y Aoh"{kZrMeUFZؾ,sa+- 67iR%L@i$@,Ye~g+;K"t5 L oفذwhLvj7c3҇|)j#YM&dZr9֎T;8:KQ#߲\:,+dgҕ@=pjb_nP s٥޳Aj~GJ[r(͋ @F3r?4<3bN̺~?(tKHGĺX) &JxR7;d@vgp8ΦF&0B``?gLendstream endobj 164 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 594 >> stream xmKSQqn:X(DHD$J&4+ 16X:f#Ѕ 1<{F0vjC֛} z{xcT *؃e<1H:22}MzOa{$ 1hjbG%Ch&5%8q=w>H6^<&{b1L\^Mr/a4iSm) [TL8,,5N}=\Ol$ݕ_JRNS4xKӅ< zلX#%*igO祬J tҬk|JV( GV{Z6,ju\Y6zc *ȕmr]`cְWOfR*˾x1)9g+ {endstream endobj 165 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 399 >> stream xcd`ab`ddM,M)64 JM/I,f!C;׏ NE yyX^+{ #cx^ms~AeQfzF.THTpSJL//THKQS/ f*h)$f$))F(+kp'pjNjnj^ 2.fFFg> stream xZKs6WpCbF3>$I;TьcˎIvdI}(2$`o$Bմ{ŋptb~oaJJm!pBRb>Xq҃ X(DQ.7( 4b8푑] {zQM \y:NaP8KA~8LI ]#< 2Q<^sv2h+g#S {3k)8FONlTT[FFzw)T;ƭ G[6f!U.Jz3/(Oq/hvyr?jєFOQ{I/FD\jwA?4wi"#(.OTBO Y*iˬ*kC=Cps%qҁɠk&}{9FRZƁa'%u AufPFy9إ-'AX4&蝽MEKJnR^a+\3k2\ʩdݨCjlPMjю_c*{?z)(]km98!eq߁;\үIY-Y5g3)Y~]͂ !ElLYS;ww;0>Ky9r)d˾}`5\pdՇpI IyNYge1C1)twÑOfkjI5ujѧShBSk0ï LƋxG,)HI:yfV Gz |6C H^vg۾=˼D( yyۼ`^o76/$NnBE^H: ry!;m^H(/Ӕyav>Z='Uj`:ku%W$R\hLPasSA6'dV%RbٯJ&!(F:3* yʫ C#oU?q!x䔚[2QK$4qTl\-Α }PDP|'endstream endobj 167 0 obj << /Type /XRef /Length 164 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 168 /ID [<83f3c043c2b5d6fd437d12697bbce291>] >> stream xcb&F~0 $8J0~ "(^@dcoAqV"eH G,DrHe5&_Hg@Q Ėl܋mg3͹"YHx]| "YVHFd^"^u1+ endstream endobj startxref 119967 %%EOF glmnet/inst/doc/Coxnet.pdf0000644000176200001440000014237313574046177015245 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 3048 /Filter /FlateDecode /N 51 /First 394 >> stream xZ[s۶~?oMLcIZ;qlI-It%*q.@JH6A 0"DrG Kaμ$p8#\zA8'\s  7~I"kk"%B:hdA'dRHPQ "4Q1" phL~#a}O0<2%B)!~IuЩKKPIk@ sDq+ H-(# 34QaAR JA ńWgBO2eJ@4#gY|-aJB4o7PZ\ bUN* fH j`d%{xUXRkƬ1LoFU-C1Q [,, Al"`>U{`Ey1?Lˌ<9I0[9cUl8ޓy9!b]t ~;}-%yb|E1^2r9Z7%P|u)AE^NlZVi"hy 1U֬fŦ n뵯gHV5j(y `0?v2<~YCq>/Jll,BͣrS :(e6vI6g-bc@ -aw-bco%N#DiQγd#P?-A^s$mCH/%#)s2UlY EX0J P|5ޯ3W{tCm8o:P{v(KJTw8]d_Q58yt}*ޤhigbmLr1|TV;6-Yi\Y3 `8x,Rgb OtJp.(ga&u`|6FPWL4 j >B^G! AåLځģZ>9+fۧgj.|T5|o>e`!DoPCлjkŢq9AJ1U*e8!]RPZՔgR*?(&D޼Ia#G?tTL9ӌ^ӜNtA+zK1&H{*i4^ ^BBXc'cQ>$6+t5 Gk vT\¤9@*7g1}5V.^X< ēR 6Y$qS3Mͷ%{V؀Y}ߴF-+~rʡ^za{Ӭ:\5K } ;K@lN(l&8 ah,wDd_٢h’{YÒKΙB++@DhDPdªv/2d=:b:KX4z=cqMqÍo-\c%NBQ<CȐB_ ˫-cm^sm^{N_En 6 v6`6,/چg44G>xul:+ڠ6}=jʊl@$ $btd.3}ppD_='oiſw8`A$ft9<&)i v=4\\o Ulcת(4יX#+z2,[V.LYV_!nFMUN^"*K>XnkA?Nroe@7j+ӻ;?~VcXٮY#U{iE4i:t.)`jJNxbXxapb+찘%tD>u@PuwtX]Xw{|>\7; D)|L:(APŹ !c*h 5<&6Zk@2=wo?CVMm6̦_2 Uu,!\'^0TMqv*6)q+ؒiwvr՛V65a\϶Yo6„c'"4mWζ,uKOٶ2*fEvcNZ˜>#fCobKUt˟ RkZ~^/XFӓIY,I%i2¤Or .rv7o}L'=tD61/jحwi 规+czg\" iTCi g D\C޻Dy;jׇ42`=)%Ѥb><]T-J{"7%R\Uv£p1ebouYDbIk*4^JBK;/Un9wng[DVww>#gDFdz\;3h vOx5w0p3M"u0v<9y,a"i&]uIM<WWHx1HTYQPQendstream endobj 53 0 obj << /Subtype /XML /Type /Metadata /Length 1652 >> stream GPL Ghostscript 9.23 2019-12-10T17:55:11-08:00 2019-12-10T17:55:11-08:00 LaTeX with hyperref package Coxnet: Regularized Cox RegressionNoah Simon, Jerome Friedman, Trevor Hastie and Rob Tibshirani endstream endobj 54 0 obj << /Filter /FlateDecode /Length 3984 >> stream xZKs+|Z*M< Ŏl*UCW30v_~$ ]kGUJDh8+ 9+/?ߞ|R]x"itog"E=SeᜲӋ*gҚv(]=;ݞK|+Wͼ,JMYzbgeT^ Hɮ/ղ*o_'Yi%6bJ4=񪭮hӑR|K$y WY!AˆkcĞ%4⋲\] kгV.jrq 'Id^dYf 25o9 }8-]M/ E߮liD$HD!LiC{/nrQW y6];GUH# ]ڰsB,Ae46JƲ-)u9(YK1_ rIRq#6-,~n*ߊʣR,|ރ*җsGAţ#iR%՟К q#MF(+0 IdH`Lśf{ABfo,by'EF&VJrܰ^0uᭂw#,eCʴsOf1@OddRhA:+Cv1R9HӺ?W J8r1RJ=ZA(Y %2gԦaQ)uB:xOB _/9J]? !îoC6.B!`/ MJg X8BH%R¢-(O@||Jk6K$A 4 ~+bRFsY-C=!s@%akġC󕳓jyB_]|pv?ߑTM1XVd50f1f-ٜ"i4,:.BuYk*Z&:imA.g@@F'#pRBc#b_WJtA7.,JjJEx=RKp빭 u6h. ۀPħs3QmU ] e%\r٠Z,jYP1lŻ*+ב֎;eeDM`%wҸ)h`AF9OphU-8lsږ+gdy=򧓨BE0}=!Րe4.R$LE1@-9͘ nS ؈%bn=P8n߇f\ph:\]`&l4aM-V4`w%zT*9RϚRqܧz JM2B{n^ǯAt^w;_`6ۆ&-;J|8e.qSs5&슍ߣ0 iUQFUVEyr3t+Q́ZIǨSQX,jB禅A3UlYʳ^a~Qxr?5д}h1l9/MX h-Hk@iZ!705hmaGHͩUxa;)n{(m%KE:]&a%m5ʣ/=c>mԾpXI_6Ir - RɣQ,M~sr7lpc ,pc [4d!A%E5KV BOeJiCxVdo d)"cuI#ˮ۳1|=A4_uArpaMiW#HPm^1TN q[grV1LJ}a5ctT6 8j-WcZyh1*U3V>D38SY|^fR  l"yϷ=WC0m2TH$x/:q:Q~fVLB)R#n16Qs+{q m&`` ՐLp퀣wsvWӵssd :Ѣ8fG <7!$rgJmԋQi]p!T&x)3\jqKCcpvJ("znwS:fSm1)'d SL Wq1[Ϻ,.& |&QM'K k| lA$)U<}5"\aIH"oAIcng sBZx5F%@2vc@܆c5#H`.qaͱE`\ ID`F`7ˎ`uM*'c gGKjX6D);qОXfRvne]VWFc0eGD̎\s#>||T&Է9s!%ޚjX<™f~6Xœ;̶rB`%8G :t: Y]P{xVu, 4<ش'#aaQbO ̤Θ@PlC_JB.1RϨ=bwo56vQdVYCۯ ɫ˷~6kcx;B)klE+SUY`x+SؤZY,]_1vd*Ym0gշ PvC,&"=v`ҁHvW:`?Ėy2OtjTTK=kհ|<Q씇nҡHv/rfRF Pf˩} RJ<G5rN*ɡf%mϸIs45:MkD^!NJǸ; őYߏExyvGUu|Uxa[2In,!eUOl:sT:YSjfˮcamэSc ~P?u6%3USXV+zW\b ~x~]\ L*uiҵqP$rEWU,Gz`A׹_~@,svo'7+SGQh',^[V JGD\>*:,@e63Py-+9 eٖb%asMOZCnϋ]?8b|-C=0l䗟`|5qV! I8}Ei$5,wCd?Flc_ /U?IC)~1I~9~z~Ill'>m [96ߝp_@uendstream endobj 55 0 obj << /Filter /FlateDecode /Length 1326 >> stream xVrF|-*}KR)-&)AHylU%AluO\Њ4|iqb؟/>/X6\UN)^(+ / XUe] CQ*8nnv_ W9uD(UθɷWRRU9+>DSV1rqYlD+si9%#w{(5n$d]Z^Q&5Ueoɯy73Uɢ,2q1yEp:r5E6e&#iFTAIÎL[g‘~Lqﻦ?rB֐ e762L>+Ei *3aH[|`JJ.xct 1(ķo(ĈbOM}T,>Ԍk)ou ?B)TesVѹD4u6:m@V.DLY6'}࣍x@Q-aޢ 7K7U"|wgG})XM '#2M.~BѹBK/uz/G4ߨQ;d(P8M|1V) v2{T_[߼JbV saNF@1 0tEKVh:RI2Q4)(QaL(3ބ%$N?&og9JDK ~<*N ;ʄT2!` +Z&"]FB(5QrԎ n0Gnl=\'΢G].YYUL;9 rC4uHb]t T"nη{N 7 q(ڈ J}%o.[Kt>hFlř!n}7o!#]{d,IN:^,D D#\\^ϿEdendstream endobj 56 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2239 >> stream xmV TW"fI O8.BH> $߱ AsuNfm1*@e *J Kg@ /QZ~)r%}!hUIVWj K=Kv\ܳ|Gx>e8ǿA+Ѽ'6 \* "퉾b;m [_hOHc=AP'$hݱG #uv!q; k3sA'exWS mu(SXH9=jVѕ xLBM݉\_̏/$ &e}=⨨P|^BnJUfpD튬IÐu{kMZsjsZmYN۳D I1^b2 v\3=jjB{Z8hOޓ>dN;e4ᔕс\h!w%ұY^t벷C>OC QA֤Bd}$M5hLtV}*0T%jȣhKAuI=Cv4Kb,g&-Dlwn+f밴Z*UQ$?X\3<O،>s6e.\S:➸ % iPiԒ)Ie.V4ijgeiMv},e]!V WGɈ"<]:qڝXtl3@^ΌN@k8[I8@ERAݗU{"R1H[`!jv Mݧ)ؓ+k}Ӯhޝq[>'q5U=VH0$yuZ4k({\ܒcJLomj4ڙǜE/ԽH_`̕;Mʙ:(j嬏5ۜfk5[\GCrSYhuc& N3=Vk}A4G៏tendstream endobj 57 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3314 >> stream xW p_YXcp5R4>}6> WN_#e4PHRR޼iyKf;y d2m:#iFǷ"m1Y ٫׬Rp5{:[$~ԇSEܨ^yd !4-@]b.:0 {Ss6sS "DF>r%~}1"8"jUDtBR0?#="!;9"zU̪BazryvDbJZB,B.O;]qoڱ;6nŪA"[)`":!1y{Jڮk^HAq2"M Qu9bx&^ ~Kl' _s0b>F&zCЎw#;EψN_bs*dNȍ'4洆-KkQwwƣ KB&Z,qiXa1)Mz8 KOG\&CGS̾Pjű"Yy 4< lj4\+'et?j, ΊfwF]C{_AzCKК<ά]h L7&Qդӣ.7[//<QZ Ewt DOu9zh"Aⶐ;-N9WFiFjUh=VB;4J!Tik۪ʳs`j3/iAuUB 5-.@ uA6&Mn0@I.4LـГ-'.+9&mֈT.+uDn50eFh2o/ \ hۖ7LŦ\f0U`b(Ѝ A[rO$u=9T'M7>+2TќFR(5{{N' lCӖ5(\jʫl0Tix2'y>(uubg6R(^Lb (D{$dŬ2P+ݵf[-} $ޣeZͰ@iN`'Ekŏ?o P >ܖpshye[{ǏwB?/H<0̐J MQ8vPdxo_EW9R _4}GGHCKP7MT2,(6Fq{Ypեq4S!W͑VhX9*%{g+;5tA5RY >r(@d:L Ȇ(gG_.Y1s;$^hL9rt5{Dr:o"lH5q* d 5*(V9K;Cݠ0#͇Lgl{5)Ң?kQY07R~~νFp9N}U3?&puEir Oj&zKȣ.%eI)/g+kl1<::@{a|jXI>DcN TB!uCtI :hSqH8Jٔc1FavQ2󰸸&ԑ^bl|O'ľd~d8BFL7~f-`P-J#OZ0Unjj[h]\Jz&.[ҁn`a T(XA/slu3IC+Z@t(XV'N1-1ܞG͡B\JFjp= ;N;~SvIIU"&WeJơ惰dwxUN&{ce~iا,Ŀ/^ Nq˙嵣ldx#xnܻMj3uBC%C >>R'sͫ Hb;3 Вw=fc_Bvi|{;ǞXZ>fM3o_\/{?}Z{wmTw:h5PRJm+2yډ掞:ryݾ(PKrK_ʯ qð.h-YħFq?-m߽W W.Ks ,WObF~ 䁬Z ^]K2nƍqK3C2$(m=ɚ3'^^)~R#&},#G)oT74V*mJ/ Ahv >C DRIw 7*^_.a(p$I< gz (_ȫMo@O\BP^I鱣Sy,oGtf֭zaFnF?d *$8^:Bhw8alC5.&4> stream xV PT}+p h4B("X[Ey p!Q,(qWvhf&d1 _Xt:gvg|2j/eF.O:i5m%U{)#T@EiF0͝3ђTSǴpPFŲ )IɛLSCBMDgsMsM5֜)&KZSDpdi5>L1-i&kiYB)&zhS1Qy!:/c~MYoY6Y4%m=,ff ,cbf.yτ14&d1z?fkl,{kaU_~O@Ӧ㼸&_Odl;LU*d B'a5e{k^dс^Z 2k]*F03WG݀z;O_Ir["i^SBĶ+QRѪǀߐ)$t(G ݓp ~ DO?OpНSXw!WA$4n,,ٖyDS  =<_W8uN-!f򆳠*#sP%Ι}#?EII$8G;!>m2I /[]2]ܨG1> I]#S<{r'aMoC Ip3GW*%̲E?-\܆# ry-K["r)fa3~^U)ѨCRb-ؿx??*Kv̭J(VhmybkubY ~#qhVKH* g-VXÎ-gC&#`*wBa񝚓+џκX-7(8TeZԋx Gd4F[8Ǹ&-;'O6 q`xF[$':^zȴ|kI2sdG*lO3XfEvqq8D㖵!z9 !Kݹf/Mvisrg^Ԡh,ff>RLopT[$Ӛ+ ñHmxs2ݷ@N^,A/ڋa;;A&o9;+!aqdq,NiA'V(xU>B 'h Yeլn GFLd7/S5R1ј Oz\\A%p0wZwmhN,xZ^8|.ʿHZ`2tH k1tfG\f(3pD^Ѐ~r2'yF~,a+GΔuk㏥wJOqxdFC#a=Ug?DFl8U%5J랹;cp^{&> stream xyw\T*ǑA&]QK"Pff1Cu`D1jb j%11Ϡ&ƛ~73ggY{D %,,]`;fJp?-o-ݱ=笙L]:[{hc/J,;f1F$ظEe70"wkfEYA.n`iicܕ6W;.w:/[|wvg͙2/t~؂[Ens[te˽WnqYm߱O=q)S5dh#F(CʞH-Q+)j0B9RC0j 5ZK͢Qzj5@ͥFS1|ʖZ@-QbjZJMQ) JMTJJ"(KJFYQ(kj ՅJS=(s*IzQ Hz(S*z%J=2dDV|YL^fe~]݆un.67Ӯg]A,VYf}y.&-زK?66~UYw?w=&sW=6}l G`@ Qk_C$mzn&KSgDAIؽGYZƏEh^RYKN K3xdJV VэeIq[fk2\G73( bu} N9 ~E>+`lt \FW}53qN X@VAf:d*lhکKsWr8OO kv$kzl@Y/,rX ܧ%W.Wwp_įBrSwT^jŧ\_†!Gm?q/tOx$,GH#fP/ {i |W:g͔A-٨Ψ*fMZ 7UJ~^Ts+} aG]P!)/p wwrX.\t dFh,`oxK {m2nhizDlȈQ2N%6Sex.tCkvG1R6TL"P$'Clγq`<`w4ۢeh3$G3xVJWWP]K_Nwu.SQ )Em?2V6q{(Jhlrॳ46l|"X.*}O !U Oc+vE87Ugwr4nNMPDDZa~$}Kz:dmqȀ@h MfipJpc\uIc$NPSU|ݨ͹U$*; c*h#Kp >b?TҠ(n Go@.x3IW^_; Zd ^<2G0֤8;O-woj4Ծ -MPm&Fi7rnsUBdH\a1*Md*4.Xmff=Q[Q -A8aM&MNlxur#)æNVUPTA⯵/B2 HMdVj6DdYE{/KLijhAϤ=mJU0<ug-H^簚c?T|:ðj , s·D;Yf7rL._NESH"CATn'nw0NB QB}$I1cplKh!ͪJIUhcҔ9&$TKVL},Aedr}]KѦeTp*tJ]з#pv*|tHoQw_N'h qW(>8Vhjܼp0Sm\_*7~SpN0Oo+ת檖V1i,Yծ+ǟ)#foqZpd]4% \>ŒUyrGԆ~NsUƖ)VkVkcRcmԙ1Q *.&Itlt+((*Ma< SBs,mƕV,Wo*! ~T3uy@_[˯2yQ$;4 "2D骡YSmPϷzJm]%&19Lwšt0Vktㅂu_["O}V?G`XO'm"A rRr O̬\Q[ ny2"FP#Igm+>&Fmɨi vһ G aƀfiK:]@;,JG7h Q'~52,Flu*!sUK"{a"YU{3 H(6fꡐVubϨx46?i<P7ivHQQb=Y=n/&i=uQ wS)! .*-ŌOqј½pCաل,6iS jPܷH. $Fs2ϟ׫H$Vx;w` tѡ.q|c cFki!K&y+M/HmϡIhBP!֜"?B$VgkU |cKH_(JI/%MȄD:z+@ IV$=9e@' !Ж\d=J"4]?}6I.UW)_H IM!Ԋ ۼ)Ś*twp4@\2; N9ɮ"PwT ?tgK]6;f_IFԯVRM*Eۘ{IU#:ʲbS4CF?LW;Y!(%h5=` k?Auʞ;>%unjDm~$./DVR'IGCUe6,.ɕr~)n@O'"<1L4-B8 ʗbqP>Eq!8g ۷}3Ǣ2"dzC1jo)m_=w7d@C M&0{7RB  /%rxin+φ|?𫿎1ţ4ꎨo_2qPy&A`za@nhc-иe7,YZGCEu#npQ}*a竐9[ GpkV2\ 17ue)/*mlQ+7B卻ӊI߶TdNHNR@,=/0$s0% ذ@w`ËꔺJ9{IY^! #nR9~<鸳&ߝMXͷOLg(/F~e;ePe@Xg乤=;i:䐩=>Q)xGzH8}7KW45鈦 =iز `,=rRVѝ9INC8;(\.[[ N\9of>85%j4JZ'0[A䣱WW'L, fκٓf^ͭ8id'8ehs28]jqÖK^mD| ;[P#0O@#\'4!@r3K ?aqRsPTEFF9xƅK9OghAX2Pfݎ_+& H G p(*V%”-!'i%B.AISs\ [)t`j^]qDw$p8Y4_&z\vţ2xb `6Z0%l@DtlB"e|6D:d^җNV۶'ofj5d&Q;dsMH؜?S &U> ^FS%-;) &^$AT+⎭2kѫ4T_楚Gf= &2,c[*@B/Kl/G6t߶rtb[mQ3C`Q:Ԓ]ZiD_MsMQ԰7hRdtyH2g'2ϕay+4:b#t} HMD;ex]\6#5MdhjGzEΫ ;9On&^W "D(+1?U43thøǁ0͔Y8Vtcm9_Acyh_@ (()#*^M4﷟ G~{sn3wƝ >mR}푍3LpX`g-M&T D 1 (I4 pvYt[ސdn14 7y ?~ g3ׄS)R`~A6=*^%ds[Pxq[~tS+77!= * R]̌"guzdywz]ő[&>G6KO/&)66Dy{qh 2e:ktUZBiI 0aSƲ]pt Qr| .=)l:-MĶz}kfM$W~agtʊ>މll•a1X-ѣz1rHυw . j,N'զ6:7qXwskԕC7_3"X~JGQ#Kpƅ ck7Dp41V*WC_3ɸ&J0.E̜I$$ےA|oh?,<ߐ)V݋G`+^8]!m:•92)N`sP%0!FLWu1/7#u`S<[`9|dNl( 'u'3O?wY,(1F޳RzRc=ZEe/ecpy2SFEjZ7r9M!WLp!̀_~;7"7{^6LEZ]f6W!\3e w]C=l;ˬh|rb%Ʌss s PdzL9K㘁Vlw eB £7/8vI|壟H'oF<" 6&8,k>;H"'e\%W(+1ZśKkC+BC*Bkk+*j9|/:G/d#:>R^HKA4$zDD@ARPrڔu y/_$u9㿯 W1BegU۫"JNVkS2xA+Dd$&)&]+6WW %|Gn}#BÉRbۋpodV hn4 D޼'YZlD'9l`Suz;"oE:)R=98`JK"φ%Iƨ^"0ejrz/{;Lr1mM@ IF">J#a֨!Z8@f=v6ƅrnje D1>U1%;Ϯj"Kyjrdĸq?4#;Nv,$IuN^ mqKN;-pFRd##roF?#AbTgp Az' Cpm1tV08wҜ,Etr\?cVR $hY9:zVNhF2.ʼ+]u)|W~R 0+mD Lmwz.cݕ[D'Ja&W,1bl啑?)? rFV%Ȓ!0w4H^Ჸi)m#9 hrH ff`JrN?h!C:8VfeJHu<iO~vfp̈}R^z fՇ 2o8nH.t0#q/ovkfu|(D@xnTqbڋg+9p=?%Wq]MWrwӧhvw^٢Kצt=(`fDendstream endobj 60 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1484 >> stream xmTkLWJQp5|_77%B$McP'\E\ -K[k߶7(J\d"y /Aܲϒ[42)Oes~<'9>r$,ݝ%RTdիe"Չ79eI4n-#}8kNhif3 )\HIl%ؽ׉9NaFopH%T(kVZΞ* .QEmHD(~֠dAzayUH&6{{fe ;7*bՕWW_tIG"(&J8vN$8SIVd[,N}TGs7q /@nL@j/E WͲmK>UIW* *%Z!w8"۞s'ң^[H2٢@a kg'D<w_3>1IXU¼) t1L}ݤ" >ˉsfyAK=5¡`ӮЍ:) 2R Uj@-(nk| E5uVzOWD; u@ "咳:P}^ 1Ռb-VAIAڍMЉa18EǯsetȜpg8z _gL05+[zj @pn*9 W/7ţGy3[UWJI^Ki*D 0U)h}b5Il nmtAz;=Q*T#Q"fO}T h'@+HEށرNh|h&'GSU,6 â{g!0rjRaZ@!3N{xn^mU)#Hh !ɭ)PHL<'A9?f#G21#4Y5` Eݑ^:gfNȠd4W0/bw(2qw q#0Mym/:k6h,Ff5ZUʍ̎;AP?3E׵Tt[zdXJ1}a79hd{ MT[<(Ek}sj+#Ò\SaAGXRMIO9164IWy?=74kqY4mIUI  Nz,v*+-Rë3¤1|f9V']  &Mſ SL)͛&o?.w !ש~a|l30rvlNt{ R@V-M>P% 3̀NgVЅþ> stream xVyTLFU#Rt&STx([ЊBLaId YAE[(ʫ.}oz>x3A.䜛sͽޏ99`<ok2پ3#f3C2f혧cuy[Wu1lyVa]nun].תh(5/8"IȠMnygH54y͌:X5p.Ӫh8wWJ|lTdhϬwlL, 9#g/DރHR%n>4x+@x+n{b;9p8#1"iR*l6?װ e¹iW? 2k5:<NMz*$gNz:p>eYy`#9yPh碌náP'#PDL2! a 7e~re0c{l8=,Bsny%jYA4MՇ:pL#"1;j]D0t{dNXWL mwmfC^QR-)=h }&@V*4j"el!.#m .ukWpsYrKg,Nm%WpsNy$ Af'?\% ;}Ef{%jֶRdFc Fm;_U ó ְs!}PlsG;lbǡs@R!Ш-oz{]VEV7җ)a )r“35u!ʪYY R@f &Zg ^ۤ5 h/)蘚fVPN z鐄Zz.PXm۝dv좤L:>‗0Ix|]T hM#E,ab-9mx!W^p\ז-/?rn&9;?9JIN"AljA|ܑ;h<m8 NHυgxS=_p&YGgXYΔ5  lMͷ;فeUv@'#Rd/*6Q#knhA~8ݚn ko1f?3IАڶ!+\Rc+w⽥{rė%f/Y+Yo=]66!T, \ RҫH"Hf; [s%E҄\= j*Zi a͑Ym;EGG (~~%5+Yhk+J5@ vY꾿MbnUC>rP,vsߖoY5pAsيJ*萃L$kof.ERދ`v=^m(''K7_8\ძCEQ\k4ĨkX W#0%X聄 +NC\u]f@\ivF }vQ?\!l3t;= !/S:VZ npX!;=8=A=}.EES&hNlKLkHh/ looA3z~QGw06,۹ 7^1xQqaiESAxEI#/N6B FYPI{xega`( :c"ELLDXSk+zCN[\NcKoN˽ } 6)ՖaKv7endstream endobj 62 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5319 >> stream xXTT־CsE,psh{ШAhEAed(CEzK,-XhF1b41=!/yy?u="@D&!ٳf:yFyʴ"a~v0|eg" #>268?n,k*0Qu4/JKD}­̚5wLW@<,3dzL[MXyyyXI}\Xmr^liæZ E,D|ϊP٪H(uѻw{9;Ξ3wٌ_΢ /^2e3v̴~|}<@m&RN35r6Qi+eGmS3)7jeMVQ5=5rQ(Gj=eCR,Qc(3ʜ)KʀKR㨷)FQ%j)5ELw(D E-zS^o`ALCW'bv23'#GcO4֌=둁#?:um?/Mי^c'싷8+m1[Ԏyb6,s|yyM j_jrQlxU3稲"Byaef A(6WpJOPQ|uE|%2t;r\*$P/-6? vn' hؓBA3"C(__?*g5toGʈDrw{ `.]Bk)4Kx,-[נ]7oR]5/q`b`)?=98kGe<ڵ7:≁eb sPBR8 IS. B̬i0\dǢIV̾fĴ* He>8:51%OOCqU[9r K11mģ>?]P> [`f[%a%pM@W?i:D18x@S&VPpP*tifs1…?yz]K!נoYB0fu.!1{EUc=opХZ CBf'p93*k6 ~8I[n uW06>'H\!^(䟉uzxyBߐ*p_Y]la$84όFMҔ)G"@W1Of'`v{2>"(1~(R.&E悲b|z#Ҝs H &0*P_@Fd \Fcls?r~<]X/|oxYm0MXҬk3V!p͡Hɻ}?h?v^lVtMحc yv{`f5{.G-79Q'"T$<%PCpVUbjp:HH-aW<6ȲF,; +biAWjdQjQAͺ$bZD eRx&d%$!s" +m,hQ~ffվ1_ Z!+Q[tMXïy-ց{WHq߂@ãtIpԠɲIbxl=ߓ~U?JGh< $`Te(臎 :2:RZ-4ǯ^,'cؔtEr KX yhW˓`^-wmC[|@5 Ulb>6A}UG0|02Gf*ej"Q%r@igI7CMyzmo 헦Ҏc?Cg!i]fgB Q#FDH555o~s4hAB,Uߏ{ݓbQgw`vF3r"U@okRcyM$m/XsA{ FΨ(Ϩᄚy_U[Z V^% 0d" ~4h<6( i^/3 ᕎLW6ҭ}C}wuytOj̀7qCƃ9п?3Sߧ< `R^qHZQ2,aiN豁W$[O: =:Ֆ8X)ȇ;X7KL~(M`^kyf3P~4=)RRUW[FnRm8JBH#lSIB9)\%{ jDLfo!{/-@U*+ee2l 8:3=OvbTrn[}QÛЌTHRItGgPNkYO&DfD#)#H-<{߻hx0DJKd{c܁KI4;wegv%OGb 4&Wז7OKOu|ww]ECdU*RZգ2́4 F jwԦ'z6#.r!8tce殏/ mϱܶ*^YݰDU7oi~8! ;) aOlዳk6w^7kҢPINN^.bꢪd9?m$egOJ-Mݥ/$6K}0%ߟa(5#NoIq(ər08D, {7^h:Z0_-z  p~Y36H R\j耔@ G֊|X%I;WlxO6)q1?^Nmp%ɋ'FnҜ+Hʕ!&=X5˝/p1:rRɏ E3aU͝aK;D0{O@C0&|{;r>n_*aki/.E'4l듘,%#EDI<ź se#4^=1JV^^@;;媊}|R'%] 8\^VuNt[֯Bymm-= &`O =xɮs]wqV;𬓍}F}^\^Kf:DDeuǑyHB~aȊlD("6WY $<*'s@ܹc'D- im=\#߼t |N @GQűI{3;|˶+ 12> stream xXK6[BUY"4͡(P5C܃b^ȲRJnػ8ÙoޤŌBܯo~vWѻ<5)r-)O2jwByQ&t#y]Wu[t341VܧN۱v:S 9#[^^6t5 2#q9ÒoNGAPD\]ޛ97خ!Ǿ> N u')kM~yKŴ/Y&kYrܹ]a*)F6_iD-3 :V*VȳyutE7-iG0=nI}*]tlf';)7sɛ()c lNjh9h*+CU*<^B`妺m k_Γ s-T2iCQYlp\ O[N u"eJk-PUqH"ٺWo)JjCB ҢMp2 %fL[_7!I wU'v&"Ph{My3L)2_z DD`{oU1N!号t63W"D􀀽c=b{ Mj7~y3ZX )ֺ4|0Xoۅ'lئ 0+ekPTktY^7LqR RqDJM\襒{uk=:,{ڿá 5}:yrXtǓXoF1[^ > stream x]Keq> }6A@EkzmC<ȱ$# A[u`U,鿯/׾޾E R{IE/o?݅;X- =1LcoswOP&BDd(ydT]ROxo/R߮]^V1oWg`zB:^~ ;HR}:.MیYbf*,TŕcM3bJ13UK PHCTYjꉿO}<g/WfrƯNRMG7Ogz? ͇?@a4 *:{)=cf F ˇ DP+Z؞o%)on=>eë׻/>Cocc?NJ~xz}F5R@=HEi%qMjep LeT=%V*u2EtDPLO ADH1D*EL TF id)Se+dr$)odzF|y\AUa;6LeP^xE$r $&r@EQ b@I"6r ltJUiyY 㝓KT%caKCgP80u뉘J=zP5' i`cp2 FW)UӁ7z5yEe1z8GL%2 'DrqP#J"uHA1,(4f)Ls1bȞj]ccLX78DHHZF2τzɀ~1 h(9t Up# ā8OQmRNhsfߎ(O֭"M13\PF\6!Sv\@oW\@&Ar Ŝc$ L$ʓܜ "M#Q\:Ϝ ޳Dyr[s ;F\=V;Fr=Sv\ mŽ\I.H4s "͞);H/5\@&A<ź\ 0)USv*2n+\i.h'b$ ϹQޓt՞ h@H$Z偐OIʙ)5H+)dKO$аK;F(5H4$J}MhD@$PL;F2'@+oLMHܗDiwx )1/J eMͩAB|0'(3Pр=I0h%q0B1:Œ{0Z´4췳 [ذa-oPA,Prw~5^*Lr#UCud`@ 0;-L 0-jlmSlsRb4Tfu` kI.)h, KH$[e%C 0-jlmv`v\>c 5x%$b(r`@ ÐMT= k!0ZFaZچ ZMUz5xJUmAdC \1S  B1Yc }YhaZiiV;ogk+{faQgDqFaȥ현 0Lᙿsȼ/ŮQ|mK uEb603qlx1R$³mzIaE:Sp@ +CqZ -bhN`mx;DZE^ oVN6VT\(*W 0LםEEhaZ(R9~;[7U9~10Tc=XquHm`7^:F bPaCvkH=\30b,1ȑl8&7f Ec>8 #R#Ţi1(LK~;[2\}(6 FtcNq7`Q԰rPXeaǪlpe(Š0jlm倲nsǔ[]mDŽq1SrPxet/|?6mCAazچ#A{c4Os{NAWHa+ŠP-چ#<47়0AV38{ne\r)fԉ"RL9 ލ82}S_-7CAaZ*;ogkU*]r^pы CO|0kPpo0qLS!0Z(R9~;[p̭|C&m5dz5Fa a)ᙃlV~fZ(R9~;[72.I|)&'L0uvTV 0L輺(,2F (LK!~;Wp4D9ҒǕΊGGCCU>+jp2W8Z(&EC̫ ´0 8vok-˹[ôt(&❂l\8,20OYdQavtrjED\65#UWƥ7nyKk;!ou+ *kUd|#㔾 CDiRJm3V*:K!b\Vr};ʙÀEZ(&(f S (LKpblm ^Ive`e>Y*+ CnH|hPd8,20Ȫ0Ȣ ´Pr8vo;MڊFNQ)dz>0ɍA`Iz }YhZ rpXmenTmcsP!; \ԑe:S("- CI a>N2F (LK~;[p/&[>C=f> ~(Da_)py`@ 0.2F (LK~;[p0ɫV0کU NhqIU)hpPXeaP>d(Š0jlmX+G-2&w ;N wZt~E-May:q0Xdawq D-L 0-j_=[p[qpQSq5\F ܆L֫3 hjZ!54,C`0-´4췳 ['xm`*R{>Y$pN) ARۘB9HC Z*;ogknwqqOOV1;)Ͳ >\` Cn౷SDr0XdaJX9-L Z*;ogkkV.Āx\yUiS)R `@ x>spi!0ZFaZ۹چ^Cw *:@1>0ɥ랝""- SXCN ´0 8v6| 6043qI44վ\0MLOY"[(!QDe(Š0-jlm }|N{|~ìCENUOX;J%o;410фO4]/1R+|ŸD/A}6N[>E^x|]1yRL.W?^u]nNRNUp|Dśb)]ɹx|sOks_gxyKOkGa t<^{}yq~~Ay}ܛOL|J@rc1q#{{$o_=>+ӻGX{Ie`iV}ɤ$g}==ⶨ̤˓TPwCm]6=t 4˧Nݞn/:;&DwI޺oS ųԝkp;}B,ՉdۖJNܷ-GZJ{ u| R))^wo?]?yF-o XsN>ol!jTV˓{EgšBcaGZQnfx{|3~|cZ`ajr{aun!'v\!sil?ɌSGdzAחGG,WIݨ[(AD~~w9a45D }ȍl7L~~ŝki# ['F_71o_Ԡ('Eg\>iZOQW;ayjtO&"H'Xo~' *="` (XV Mig|"Vg¾}m)^ls>H@PS][3}y^n2W3.Ebд̓MZ>d-vRUXt^ɉA1^38G67w]7>w靐2E]'B謻2 Y75-w]AIki{wegMC 45d\QwXbc%G$t ./36}c O }i<[w!BKHUcECɏ,*8$Df fџ.>Bkddwa!xJ~@b^uо!0ZʼtZ{a_֐+yaoB+}TiiM84Ux"B|'9L8͹h4b =V)wW^'5}c( HD"X ߛvB)MSn*KeBzH2d4SC3KsiEۏD¹zzn") /$;W2n)v{ m^Xu ~k?/׹?6NA<;V80*+;G2 J\F<-al'c 0؆ʮ^?}Ec̺O@t 受a]nunHOác(wlBҞ?<=yNV4㩲ޏ!ęoU':sV6+UnKIK!Ր2Ym3wrYD=ۚgI[׷~̉8|=}+hj7UZ ,'p1b#z@ŋKp/!'|ϫQ?e^cşQ k?^ROy"mpB_N(MkZ16cQl+2@&S{enbmp.<"873/!s71=լFP7|0%K2\#^·miQukcCW*IQ%$iD 9_O@ҶkVfՏh0#ZS~nGW_D@MS:V ol[FӍG=cW'(!"?_endstream endobj 65 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2210 >> stream xUkTM\i e͵C# EHQI t***ltَd9+BW.u("6k#+j:睍/㜯1~NQ4MOHݐ;f+ZТh)A8ϱO-'SX',m0u$Č$4&l)vvSHNLRNw梌V~NLNLSZÆꄴduLش(R{gdm _:mˌJY(* &SK0jESޔKMTH(3FS<52hj,5OFR@Td/@CGKXJJgJHIˤ-0&̔ʭy;ΚH#.~1<:`9w^+EpU=wj|]Tu E.9҉Su%=%pRcg+}& !`g_K )fI~+KiV=r7!6q{~3x% c Z,3ئ+Ewr"ـ0OE'}UG%j~hb~:zJ{{_\]w|P^ڂW#~;ٻSKF~ԦߛjOܮWv*6:+9bkQzΦԸV 6 lK%#BwAၒ#G}jZh 34ijz7XXXXl儥 `/atlq]Xǥ0 oVy [jDU xhNqTC%%>tLc7ӉizRsam}&ǛXpw.6xDcK0{/_+EGG;olHt5= V`폀)"8|Q8)Nx/gro{w UB{b?Gmp~ݽbFb_G0aOR=h!C.ﮍts >it@Gz3,Ebyr~ltB 9xsѢp"&6J*صr\lꒆLo `=8ydI93U|W'.3"5;?L$-$y %r6kh5;;=cPA[j1̭l YE O-u`>4?In~+dC,)3d|4 L%\ $P ]}T,ٸ[fK^XG= a̡sڏuc?ܹ u̺؊e4䟲J-f/YMK OTt-b[BCD& afJ<} Uҙ`=ufʘ7c\.u}O(L)yԋX~$<#pNy:Fix<7lGU8yJeĶ\r_j=ewP`5V¿xA,JLHnqdpFX1cd/+ >jr#u]^rؓVz/` J2"~:N(21$4@d }s&>O)|bbtFaBkCSɢOs>Kׅ'yWjDa)v_9/3[QO6BpF16x ݰ \ W 6 K\h!ϪN\BX`\^`3l<|O$=VpŇc{ DW\/fooE*FU}w] .!fwtZhE(/|!(i˯>MӅI.zYw,l3_kT 5RhY-}\f7]F{ ZZ?GcZ "%_0C7dV(3H/_իWD/ʲCx> stream xW TSg>!hўCVSuڢQQ(b 1@!B jVmm1v:]s=5we%+}){bKiNr%7&gSsxi~g|*ibƺȧWG?; !|ܙ'P k&2KJ ęY˖,Yx1~]R."|srDZ_"OM UZ )YҌQ;b703As殓/,\\CzE1F'bX"' ^$v]kDE@l$6ˉ "CS\ 1h0 !?M ?}AZPXP\:WSDܜ|зgP3Ї_] wat:tcЭE3PIhQH:V9;$]Ae4zS|~}V74Ԡ6ZS6~fFr[X"IU:@uz􇀴Aͽ\mE7q~^"T^vdžkgoB4`(Q꼼ہ=Nn93yfwת7)IqWdBq"GZ\dZk' }R:ɝ1hՠe-uf;uzmV} Lۆ?ȣ=4e*].WۙyCh‰rK*$­עЎȏb.s<,P0hf:TQ /kFh BAltW7[.ءDhsC6.|a|.f bY&}  DolO>=; - Yb| ys^f"!</g%rvdZшgދ'<ٹ7f>pW_x0i oY%;Cxzk2LZ.A<&0DVeJ/jVkb1CB =6{#ɊPC#vR`,QS%oF2`勞;F4U^#E j VQkR-\)(}N(;l1zsϞh,RX1Q?#4``ԞM@ㆫKPU.KsshگҎVk=4#,nv9s} `:=˥_LB|3ڨ!m3Bki{zWc рZE/SbjU% Ma2Ѝ Ge̖GjWf=+v1ʆ}ɟ4 fv0<mwc^ts4 `r j˷H@y)E 5҃6<0W15R ~(>ܤV/0 bط/7Ny2]w`pî(ΐ?nYNU#I4j#%4HTncQm=yv{ rZ: ]# n/؞ FA;n_Y.ً"3sETؿXd3Tz5b@1ҹUk& &D3ֺh [*ZMueT^%&YVK3+t@ ?W a,a'%Q IKqw2>¦/ѓÃb\1~-(ZGBs>Zh£T%7cΎe"Nsɱ:elzH2TC`h,=31e4 zXVӀDllRx@bGy{fҏ ~<>i?R !U豵h>{d1;Dm4uQeHfM^j;W^u$>7ʄk~N8`l:\ި3h h f^y7>s;~Ao9<]ِjqԵB#j/V}L)Pv/c Ntt٣xx7jZ > /W [ 1 2 1 ] /Info 3 0 R /Root 2 0 R /Size 68 /ID [<1375d171a33b84cdf4c59dbd9fab744c><8eaae017a84b6c60c3344271e532bd03>] >> stream xcb&F~ csL ǀaH NI bq ($-(8 ] d endstream endobj startxref 50076 %%EOF glmnet/inst/doc/glmnet.Rmd0000644000176200001440000014705213557666310015241 0ustar liggesusers--- title: "An Introduction to `glmnet`" author: "Trevor Hastie and Junyang Qian" date: "September 13, 2016" bibliography: assets/glmnet_refs.bib link-citations: true output: pdf_document: fig_caption: yes toc: yes toc_depth: 3 vignette: > %\VignetteIndexEntry{An Introduction to glmnet} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} --- ## Introduction Glmnet is a package that fits a generalized linear model via penalized maximum likelihood. The regularization path is computed for the lasso or elasticnet penalty at a grid of values for the regularization parameter lambda. The algorithm is extremely fast, and can exploit sparsity in the input matrix `x`. It fits linear, logistic and multinomial, poisson, and Cox regression models. A variety of predictions can be made from the fitted models. It can also fit multi-response linear regression. The authors of glmnet are Jerome Friedman, Trevor Hastie, Rob Tibshirani and Noah Simon, and the R package is maintained by Trevor Hastie. The matlab version of glmnet is maintained by Junyang Qian. This vignette describes the usage of glmnet in R. There is an additional vignette for the new `relaxed` features in `glmnet`, along with some new capabilities. There is as well a vignette devoted to Cox models in `glmnet`. `glmnet` solves the following problem $$ \min_{\beta_0,\beta} \frac{1}{N} \sum_{i=1}^{N} w_i l(y_i,\beta_0+\beta^T x_i) + \lambda\left[(1-\alpha)||\beta||_2^2/2 + \alpha ||\beta||_1\right], $$ over a grid of values of $\lambda$ covering the entire range. Here $l(y,\eta)$ is the negative log-likelihood contribution for observation $i$; e.g. for the Gaussian case it is $\frac{1}{2}(y-\eta)^2$. The _elastic-net_ penalty is controlled by $\alpha$, and bridges the gap between lasso ($\alpha=1$, the default) and ridge ($\alpha=0$). The tuning parameter $\lambda$ controls the overall strength of the penalty. It is known that the ridge penalty shrinks the coefficients of correlated predictors towards each other while the lasso tends to pick one of them and discard the others. The elastic-net penalty mixes these two; if predictors are correlated in groups, an $\alpha=0.5$ tends to select the groups in or out together. This is a higher level parameter, and users might pick a value upfront, else experiment with a few different values. One use of $\alpha$ is for numerical stability; for example, the elastic net with $\alpha = 1 - \epsilon$ for some small $\epsilon > 0$ performs much like the lasso, but removes any degeneracies and wild behavior caused by extreme correlations. The `glmnet` algorithms use cyclical coordinate descent, which successively optimizes the objective function over each parameter with others fixed, and cycles repeatedly until convergence. The package also makes use of the strong rules for efficient restriction of the active set. Due to highly efficient updates and techniques such as warm starts and active-set convergence, our algorithms can compute the solution path very fast. The code can handle sparse input-matrix formats, as well as range constraints on coefficients. The core of `glmnet` is a set of fortran subroutines, which make for very fast execution. The package also includes methods for prediction and plotting, and a function that performs K-fold cross-validation. The theory and algorithms in this implementation are described in @glmnet, @coxnet, @strongrules and @block . ## Installation Like many other R packages, the simplest way to obtain `glmnet` is to install it directly from CRAN. Type the following command in R console: ```{r, eval=FALSE} install.packages("glmnet", repos = "https://cran.us.r-project.org") ``` Users may change the `repos` options depending on their locations and preferences. Other options such as the directories where to install the packages can be altered in the command. For more details, see `help(install.packages)`. Here the R package has been downloaded and installed to the default directories. Alternatively, users can download the package source from [CRAN](https://cran.r-project.org/package=glmnet) and type Unix commands to install it to the desired location. ## Quick Start The purpose of this section is to give users a general sense of the package, including the components, what they do and some basic usage. We will briefly go over the main functions, see the basic operations and have a look at the outputs. Users may have a better idea after this section what functions are available, which one to choose, or at least where to seek help. More details are given in later sections. First, we load the `glmnet` package: ```{r} library(glmnet) ``` The default model used in the package is the Guassian linear model or "least squares", which we will demonstrate in this section. We load a set of data created beforehand for illustration. Users can either load their own data or use those saved in the workspace. ```{r} data(QuickStartExample) ``` The command loads an input matrix `x` and a response vector `y` from this saved R data archive. We fit the model using the most basic call to `glmnet`. ```{r} fit = glmnet(x, y) ``` "fit" is an object of class `glmnet` that contains all the relevant information of the fitted model for further use. We do not encourage users to extract the components directly. Instead, various methods are provided for the object such as `plot`, `print`, `coef` and `predict` that enable us to execute those tasks more elegantly. We can visualize the coefficients by executing the `plot` function: ```{r} plot(fit) ``` Each curve corresponds to a variable. It shows the path of its coefficient against the $\ell_1$-norm of the whole coefficient vector at as $\lambda$ varies. The axis above indicates the number of nonzero coefficients at the current $\lambda$, which is the effective degrees of freedom (_df_) for the lasso. Users may also wish to annotate the curves; this can be done by setting `label = TRUE` in the plot command. A summary of the `glmnet` path at each step is displayed if we just enter the object name or use the `print` function: ```{r height = 4} print(fit) ``` It shows from left to right the number of nonzero coefficients (`Df`), the percent (of null) deviance explained (`%dev`) and the value of $\lambda$ (`Lambda`). Although by default `glmnet` calls for 100 values of `lambda` the program stops early if `%dev% does not change sufficently from one lambda to the next (typically near the end of the path.) We can obtain the actual coefficients at one or more $\lambda$'s within the range of the sequence: ```{r} coef(fit,s=0.1) ``` (why `s` and not `lambda`? In case later we want to allow one to specify the model size in other ways.) Users can also make predictions at specific $\lambda$'s with new input data: ```{r} set.seed(29) nx = matrix(rnorm(10*20),10,20) predict(fit,newx=nx,s=c(0.1,0.05)) ``` The function `glmnet` returns a sequence of models for the users to choose from. In many cases, users may prefer the software to select one of them. Cross-validation is perhaps the simplest and most widely used method for that task. `cv.glmnet` is the main function to do cross-validation here, along with various supporting methods such as plotting and prediction. We still act on the sample data loaded before. ```{r} cvfit = cv.glmnet(x, y) ``` `cv.glmnet` returns a `cv.glmnet` object, which is "cvfit" here, a list with all the ingredients of the cross-validation fit. As for `glmnet`, we do not encourage users to extract the components directly except for viewing the selected values of $\lambda$. The package provides well-designed functions for potential tasks. We can plot the object. ```{r} plot(cvfit) ``` It includes the cross-validation curve (red dotted line), and upper and lower standard deviation curves along the $\lambda$ sequence (error bars). Two selected $\lambda$'s are indicated by the vertical dotted lines (see below). We can view the selected $\lambda$'s and the corresponding coefficients. For example, ```{r} cvfit$lambda.min ``` `lambda.min` is the value of $\lambda$ that gives minimum mean cross-validated error. The other $\lambda$ saved is `lambda.1se`, which gives the most regularized model such that error is within one standard error of the minimum. To use that, we only need to replace `lambda.min` with `lambda.1se` above. ```{r} coef(cvfit, s = "lambda.min") ``` Note that the coefficients are represented in the sparse matrix format. The reason is that the solutions along the regularization path are often sparse, and hence it is more efficient in time and space to use a sparse format. If you prefer non-sparse format, pipe the output through `as.matrix()`. Predictions can be made based on the fitted `cv.glmnet` object. Let's see a toy example. ```{r} predict(cvfit, newx = x[1:5,], s = "lambda.min") ``` `newx` is for the new input matrix and `s`, as before, is the value(s) of $\lambda$ at which predictions are made. That is the end of `glmnet` 101. With the tools introduced so far, users are able to fit the entire elastic net family, including ridge regression, using squared-error loss. In the package, there are many more options that give users a great deal of flexibility. To learn more, move on to later sections. ## Linear Regression Linear regression here refers to two families of models. One is `gaussian`, the Gaussian family, and the other is `mgaussian`, the multiresponse Gaussian family. We first discuss the ordinary Gaussian and the multiresponse one after that. ### Gaussian Family `gaussian ` is the default family option in the function `glmnet`. Suppose we have observations $x_i \in \mathbb{R}^p$ and the responses $y_i \in \mathbb{R}, i = 1, \ldots, N$. The objective function for the Gaussian family is $$ \min_{(\beta_0, \beta) \in \mathbb{R}^{p+1}}\frac{1}{2N} \sum_{i=1}^N (y_i -\beta_0-x_i^T \beta)^2+\lambda \left[ (1-\alpha)||\beta||_2^2/2 + \alpha||\beta||_1\right], $$ where $\lambda \geq 0$ is a complexity parameter and $0 \leq \alpha \leq 1$ is a compromise between ridge ($\alpha = 0$) and lasso ($\alpha = 1$). Coordinate descent is applied to solve the problem. Specifically, suppose we have current estimates $\tilde{\beta_0}$ and $\tilde{\beta}_\ell$ $\forall j\in 1,]\ldots,p$. By computing the gradient at $\beta_j = \tilde{\beta}_j$ and simple calculus, the update is $$ \tilde{\beta}_j \leftarrow \frac{S(\frac{1}{N}\sum_{i=1}^N x_{ij}(y_i-\tilde{y}_i^{(j)}),\lambda \alpha)}{1+\lambda(1-\alpha)}, $$ where $\tilde{y}_i^{(j)} = \tilde{\beta}_0 + \sum_{\ell \neq j} x_{i\ell} \tilde{\beta}_\ell$, and $S(z, \gamma)$ is the soft-thresholding operator with value $\text{sign}(z)(|z|-\gamma)_+$. This formula above applies when the `x` variables are standardized to have unit variance (the default); it is slightly more complicated when they are not. Note that for "family=gaussian", `glmnet` standardizes $y$ to have unit variance before computing its lambda sequence (and then unstandardizes the resulting coefficients); if you wish to reproduce/compare results with other software, best to supply a standardized $y$ first (Using the "1/N" variance formula). `glmnet` provides various options for users to customize the fit. We introduce some commonly used options here and they can be specified in the `glmnet` function. * `alpha` is for the elastic-net mixing parameter $\alpha$, with range $\alpha \in [0,1]$. $\alpha = 1$ is the lasso (default) and $\alpha = 0$ is the ridge. * `weights` is for the observation weights. Default is 1 for each observation. (Note: `glmnet` rescales the weights to sum to N, the sample size.) * `nlambda` is the number of $\lambda$ values in the sequence. Default is 100. * `lambda` can be provided, but is typically not and the program constructs a sequence. When automatically generated, the $\lambda$ sequence is determined by `lambda.max` and `lambda.min.ratio`. The latter is the ratio of smallest value of the generated $\lambda$ sequence (say `lambda.min`) to `lambda.max`. The program then generated `nlambda` values linear on the log scale from `lambda.max` down to `lambda.min`. `lambda.max` is not given, but easily computed from the input $x$ and $y$; it is the smallest value for `lambda` such that all the coefficients are zero. For `alpha=0` (ridge) `lambda.max` would be $\infty$; hence for this case we pick a value corresponding to a small value for `alpha` close to zero.) * `standardize` is a logical flag for `x` variable standardization, prior to fitting the model sequence. The coefficients are always returned on the original scale. Default is `standardize=TRUE`. For more information, type `help(glmnet)` or simply `?glmnet`. As an example, we set $\alpha = 0.2$ (more like a ridge regression), and give double weights to the latter half of the observations. To avoid too long a display here, we set `nlambda` to 20. In practice, however, the number of values of $\lambda$ is recommended to be 100 (default) or more. In most cases, it does not come with extra cost because of the warm-starts used in the algorithm, and for nonlinear models leads to better convergence properties. ```{r} fit = glmnet(x, y, alpha = 0.2, weights = c(rep(1,50),rep(2,50)), nlambda = 20) ``` We can then print the `glmnet` object. ```{r} print(fit) ``` This displays the call that produced the object `fit` and a three-column matrix with columns `Df` (the number of nonzero coefficients), `%dev` (the percent deviance explained) and `Lambda` (the corresponding value of $\lambda$). (Note that the `digits` option can used to specify significant digits in the printout.) Here the actual number of $\lambda$'s here is less than specified in the call. The reason lies in the stopping criteria of the algorithm. According to the default internal settings, the computations stop if either the fractional change in deviance down the path is less than $10^{-5}$ or the fraction of explained deviance reaches $0.999$. From the last few lines , we see the fraction of deviance does not change much and therefore the computation ends when meeting the stopping criteria. We can change such internal parameters. For details, see the Appendix section or type `help(glmnet.control)`. We can plot the fitted object as in the previous section. There are more options in the `plot` function. Users can decide what is on the X-axis. `xvar` allows three measures: "norm" for the $\ell_1$-norm of the coefficients (default), "lambda" for the log-lambda value and "dev" for %deviance explained. Users can also label the curves with variable sequence numbers simply by setting `label = TRUE`. Let's plot "fit" against the log-lambda value and with each curve labeled. ```{r} plot(fit, xvar = "lambda", label = TRUE) ``` Now when we plot against %deviance we get a very different picture. This is percent deviance explained on the training data. What we see here is that toward the end of the path this value are not changing much, but the coefficients are "blowing up" a bit. This lets us focus attention on the parts of the fit that matter. This will especially be true for other models, such as logistic regression. ```{r} plot(fit, xvar = "dev", label = TRUE) ``` We can extract the coefficients and make predictions at certain values of $\lambda$. Two commonly used options are: * `s` specifies the value(s) of $\lambda$ at which extraction is made. * `exact` indicates whether the exact values of coefficients are desired or not. That is, if `exact = TRUE`, and predictions are to be made at values of `s` not included in the original fit, these values of `s` are merged with `object$lambda`, and the model is refit before predictions are made. If `exact=FALSE` (default), then the predict function uses linear interpolation to make predictions for values of `s` that do not coincide with lambdas used in the fitting algorithm. A simple example is: ```{r} fit = glmnet(x, y) any(fit$lambda == 0.5) coef.apprx = coef(fit, s = 0.5, exact = FALSE) coef.exact = coef(fit, s = 0.5, exact = TRUE, x=x, y=y) cbind2(coef.exact, coef.apprx) ``` The left column is for `exact = TRUE` and the right for `FALSE`. We see from the above that 0.5 is not in the sequence and that hence there are some difference, though not much. Linear interpolation is mostly enough if there are no special requirements. Notice that with `exact=TRUE` we have to supply by named argument any data that was used in creating the original fit, in this case `x` and `y`. Users can make predictions from the fitted object. In addition to the options in `coef`, the primary argument is `newx`, a matrix of new values for `x`. The `type` option allows users to choose the type of prediction: * "link" gives the fitted values * "response" the sames as "link" for "gaussian" family. * "coefficients" computes the coefficients at values of `s` * "nonzero" retuns a list of the indices of the nonzero coefficients for each value of `s`. For example, ```{r} predict(fit, newx = x[1:5,], type = "response", s = 0.05) ``` gives the fitted values for the first 5 observations at $\lambda = 0.05$. If multiple values of `s` are supplied, a matrix of predictions is produced. Users can customize K-fold cross-validation. In addition to all the `glmnet` parameters, `cv.glmnet` has its special parameters including `nfolds` (the number of folds), `foldid` (user-supplied folds), `type.measure`(the loss used for cross-validation): * "deviance" or "mse" uses squared loss * "mae" uses mean absolute error As an example, ```{r} cvfit = cv.glmnet(x, y, type.measure = "mse", nfolds = 20) ``` does 20-fold cross-validation, based on mean squared error criterion (default though). Parallel computing is also supported by `cv.glmnet`. To make it work, users must register parallel beforehand. We give a simple example of comparison here. Unfortunately, the package `doMC` is not available on Windows platforms (it is on others), so we cannot run the code here, but we make it looks as if we have. ```{r, eval=FALSE} require(doMC) registerDoMC(cores=2) X = matrix(rnorm(1e4 * 200), 1e4, 200) Y = rnorm(1e4) ``` ```{r, eval=FALSE} system.time(cv.glmnet(X, Y)) ``` ```{r, echo=FALSE} structure(c(2.44, 0.08, 2.518, 0, 0), class = "proc_time", .Names = c("user.self", "sys.self", "elapsed", "user.child", "sys.child")) ``` ```{r, eval=FALSE} system.time(cv.glmnet(X, Y, parallel = TRUE)) ``` ```{r, echo=FALSE} structure(c(0.508999999999999, 0.057, 1.56699999999999, 1.941, 0.1), class = "proc_time", .Names = c("user.self", "sys.self", "elapsed", "user.child", "sys.child")) ``` As suggested from the above, parallel computing can significantly speed up the computation process especially for large-scale problems. Functions `coef` and `predict` on cv.glmnet object are similar to those for a `glmnet` object, except that two special strings are also supported by `s` (the values of $\lambda$ requested): * "lambda.1se": the largest $\lambda$ at which the MSE is within one standard error of the minimal MSE. * "lambda.min": the $\lambda$ at which the minimal MSE is achieved. ```{r} cvfit$lambda.min coef(cvfit, s = "lambda.min") predict(cvfit, newx = x[1:5,], s = "lambda.min") ``` Users can control the folds used. Here we use the same folds so we can also select a value for $\alpha$. ```{r} foldid=sample(1:10,size=length(y),replace=TRUE) cv1=cv.glmnet(x,y,foldid=foldid,alpha=1) cv.5=cv.glmnet(x,y,foldid=foldid,alpha=.5) cv0=cv.glmnet(x,y,foldid=foldid,alpha=0) ``` There are no built-in plot functions to put them all on the same plot, so we are on our own here: ```{r} par(mfrow=c(2,2)) plot(cv1);plot(cv.5);plot(cv0) plot(log(cv1$lambda),cv1$cvm,pch=19,col="red",xlab="log(Lambda)",ylab=cv1$name) points(log(cv.5$lambda),cv.5$cvm,pch=19,col="grey") points(log(cv0$lambda),cv0$cvm,pch=19,col="blue") legend("topleft",legend=c("alpha= 1","alpha= .5","alpha 0"),pch=19,col=c("red","grey","blue")) ``` We see that lasso (`alpha=1`) does about the best here. We also see that the range of lambdas used differs with alpha. #### Coefficient upper and lower bounds These are recently added features that enhance the scope of the models. Suppose we want to fit our model, but limit the coefficients to be bigger than -0.7 and less than 0.5. This is easily achieved via the `upper.limits` and `lower.limits` arguments: ```{r} tfit=glmnet(x,y,lower=-.7,upper=.5) plot(tfit) ``` These are rather arbitrary limits; often we want the coefficients to be positive, so we can set only `lower.limit` to be 0. (Note, the lower limit must be no bigger than zero, and the upper limit no smaller than zero.) These bounds can be a vector, with different values for each coefficient. If given as a scalar, the same number gets recycled for all. #### Penalty factors This argument allows users to apply separate penalty factors to each coefficient. Its default is 1 for each parameter, but other values can be specified. In particular, any variable with `penalty.factor` equal to zero is not penalized at all! Let $v_j$ denote the penalty factor for $j$ th variable. The penalty term becomes $$ \lambda \sum_{j=1}^p \boldsymbol{v_j} P_\alpha(\beta_j) = \lambda \sum_{j=1}^p \boldsymbol{v_j} \left[ (1-\alpha)\frac{1}{2} \beta_j^2 + \alpha |\beta_j| \right]. $$ Note the penalty factors are internally rescaled to sum to nvars. This is very useful when people have prior knowledge or preference over the variables. In many cases, some variables may be so important that one wants to keep them all the time, which can be achieved by setting corresponding penalty factors to 0: ```{r} p.fac = rep(1, 20) p.fac[c(5, 10, 15)] = 0 pfit = glmnet(x, y, penalty.factor = p.fac) plot(pfit, label = TRUE) ``` We see from the labels that the three variables with 0 penalty factors always stay in the model, while the others follow typical regularization paths and shrunken to 0 eventually. Some other useful arguments. `exclude` allows one to block certain variables from being the model at all. Of course, one could simply subset these out of `x`, but sometimes `exclude` is more useful, since it returns a full vector of coefficients, just with the excluded ones set to zero. There is also an `intercept` argument which defaults to `TRUE`; if `FALSE` the intercept is forced to be zero. #### Customizing plots Sometimes, especially when the number of variables is small, we want to add variable labels to a plot. Since `glmnet` is intended primarily for wide data, this is not supprted in `plot.glmnet`. However, it is easy to do, as the following little toy example shows. We first generate some data, with 10 variables, and for lack of imagination and ease we give them simple character names. We then fit a glmnet model, and make the standard plot. ```{r} set.seed(101) x=matrix(rnorm(1000),100,10) y=rnorm(100) vn=paste("var",1:10) fit=glmnet(x,y) plot(fit) ``` We wish to label the curves with the variable names. Here s a simple way to do this, using the `axis` command in R (and a little research into how to customize it). We need to have the positions of the coefficients at the end of the path, and we need to make some space using the `par` command, so that our labels will fit in. This requires knowing how long your labels are, but here they are all quite short. ```{r} par(mar=c(4.5,4.5,1,4)) plot(fit) vnat=coef(fit) vnat=vnat[-1,ncol(vnat)] # remove the intercept, and get the coefficients at the end of the path axis(4, at=vnat,line=-.5,label=vn,las=1,tick=FALSE, cex.axis=0.5) ``` We have done nothing here to avoid overwriting of labels, in the event that they are close together. This would be a bit more work, but perhaps best left alone, anyway. ### Multiresponse Gaussian Family The multiresponse Gaussian family is obtained using `family = "mgaussian"` option in `glmnet`. It is very similar to the single-response case above. This is useful when there are a number of (correlated) responses - the so-called "multi-task learning" problem. Here the sharing involves which variables are selected, since when a variable is selected, a coefficient is fit for each response. Most of the options are the same, so we focus here on the differences with the single response model. Obviously, as the name suggests, $y$ is not a vector, but a matrix of quantitative responses in this section. The coefficients at each value of lambda are also a matrix as a result. Here we solve the following problem: $$ \min_{(\beta_0, \beta) \in \mathbb{R}^{(p+1)\times K}}\frac{1}{2N} \sum_{i=1}^N ||y_i -\beta_0-\beta^T x_i||^2_F+\lambda \left[ (1-\alpha)||\beta||_F^2/2 + \alpha\sum_{j=1}^p||\beta_j||_2\right]. $$ Here $\beta_j$ is the jth row of the $p\times K$ coefficient matrix $\beta$, and we replace the absolute penalty on each single coefficient by a group-lasso penalty on each coefficient K-vector $\beta_j$ for a single predictor $x_j$. We use a set of data generated beforehand for illustration. ```{r} data(MultiGaussianExample) ``` We fit the data, with an object "mfit" returned. ```{r} mfit = glmnet(x, y, family = "mgaussian") ``` For multiresponse Gaussian, the options in `glmnet` are almost the same as the single-response case, such as `alpha`, `weights`, `nlambda`, `standardize`. A exception to be noticed is that `standardize.response` is only for `mgaussian` family. The default value is `FALSE`. If `standardize.response = TRUE`, it standardizes the response variables. To visualize the coefficients, we use the `plot` function. ```{r} plot(mfit, xvar = "lambda", label = TRUE, type.coef = "2norm") ``` Note that we set `type.coef = "2norm"`. Under this setting, a single curve is plotted per variable, with value equal to the $\ell_2$ norm. The default setting is `type.coef = "coef"`, where a coefficient plot is created for each response (multiple figures). `xvar` and `label` are two other options besides ordinary graphical parameters. They are the same as the single-response case. We can extract the coefficients at requested values of $\lambda$ by using the function `coef` and make predictions by `predict`. The usage is similar and we only provide an example of `predict` here. ```{r} predict(mfit, newx = x[1:5,], s = c(0.1, 0.01)) ``` The prediction result is saved in a three-dimensional array with the first two dimensions being the prediction matrix for each response variable and the third indicating the response variables. We can also do k-fold cross-validation. The options are almost the same as the ordinary Gaussian family and we do not expand here. ```{r} cvmfit = cv.glmnet(x, y, family = "mgaussian") ``` We plot the resulting `cv.glmnet` object "cvmfit". ```{r} plot(cvmfit) ``` To show explicitly the selected optimal values of $\lambda$, type ```{r} cvmfit$lambda.min cvmfit$lambda.1se ``` As before, the first one is the value at which the minimal mean squared error is achieved and the second is for the most regularized model whose mean squared error is within one standard error of the minimal. Prediction for `cv.glmnet` object works almost the same as for `glmnet` object. We omit the details here. ## Logistic Regression Logistic regression is another widely-used model when the response is categorical. If there are two possible outcomes, we use the binomial distribution, else we use the multinomial. ### Binomial Models For the binomial model, suppose the response variable takes value in $\mathcal{G}=\{1,2\}$. Denote $y_i = I(g_i=1)$. We model $$\mbox{Pr}(G=2|X=x)=\frac{e^{\beta_0+\beta^Tx}}{1+e^{\beta_0+\beta^Tx}},$$ which can be written in the following form $$\log\frac{\mbox{Pr}(G=2|X=x)}{\mbox{Pr}(G=1|X=x)}=\beta_0+\beta^Tx,$$ the so-called "logistic" or log-odds transformation. The objective function for the penalized logistic regression uses the negative binomial log-likelihood, and is $$ \min_{(\beta_0, \beta) \in \mathbb{R}^{p+1}} -\left[\frac{1}{N} \sum_{i=1}^N y_i \cdot (\beta_0 + x_i^T \beta) - \log (1+e^{(\beta_0+x_i^T \beta)})\right] + \lambda \big[ (1-\alpha)||\beta||_2^2/2 + \alpha||\beta||_1\big]. $$ Logistic regression is often plagued with degeneracies when $p > N$ and exhibits wild behavior even when $N$ is close to $p$; the elastic-net penalty alleviates these issues, and regularizes and selects variables as well. Our algorithm uses a quadratic approximation to the log-likelihood, and then coordinate descent on the resulting penalized weighted least-squares problem. These constitute an outer and inner loop. For illustration purpose, we load pre-generated input matrix `x` and the response vector `y` from the data file. ```{r} data(BinomialExample) ``` The input matrix $x$ is the same as other families. For binomial logistic regression, the response variable $y$ should be either a factor with two levels, or a two-column matrix of counts or proportions. Other optional arguments of `glmnet` for binomial regression are almost same as those for Gaussian family. Don't forget to set `family` option to "binomial". ```{r} fit = glmnet(x, y, family = "binomial") ``` Like before, we can print and plot the fitted object, extract the coefficients at specific $\lambda$'s and also make predictions. For plotting, the optional arguments such as `xvar` and `label` are similar to the Gaussian. We plot against the deviance explained and show the labels. ```{r} plot(fit, xvar = "dev", label = TRUE) ``` Prediction is a little different for logistic from Gaussian, mainly in the option `type`. "link" and "response" are never equivalent and "class" is only available for logistic regression. In summary, * "link" gives the linear predictors * "response" gives the fitted probabilities * "class" produces the class label corresponding to the maximum probability. * "coefficients" computes the coefficients at values of `s` * "nonzero" retuns a list of the indices of the nonzero coefficients for each value of `s`. For "binomial" models, results ("link", "response", "coefficients", "nonzero") are returned only for the class corresponding to the second level of the factor response. In the following example, we make prediction of the class labels at $\lambda = 0.05, 0.01$. ```{r} predict(fit, newx = x[1:5,], type = "class", s = c(0.05, 0.01)) ``` For logistic regression, `cv.glmnet` has similar arguments and usage as Gaussian. `nfolds`, `weights`, `lambda`, `parallel` are all available to users. There are some differences in `type.measure`: "deviance" and "mse" do not both mean squared loss and "class" is enabled. Hence, * "mse" uses squared loss. * "deviance" uses actual deviance. * "mae" uses mean absolute error. * "class" gives misclassification error. * "auc" (for two-class logistic regression ONLY) gives area under the ROC curve. For example, ```{r} cvfit = cv.glmnet(x, y, family = "binomial", type.measure = "class") ``` It uses misclassification error as the criterion for 10-fold cross-validation. We plot the object and show the optimal values of $\lambda$. ```{r} plot(cvfit) ``` ```{r} cvfit$lambda.min cvfit$lambda.1se ``` `coef` and `predict` are simliar to the Gaussian case and we omit the details. We review by some examples. ```{r} coef(cvfit, s = "lambda.min") ``` As mentioned previously, the results returned here are only for the second level of the factor response. ```{r} predict(cvfit, newx = x[1:10,], s = "lambda.min", type = "class") ``` Like other GLMs, glmnet allows for an "offset". This is a fixed vector of N numbers that is added into the linear predictor. For example, you may have fitted some other logistic regression using other variables (and data), and now you want to see if the present variables can add anything. So you use the predicted logit from the other model as an offset in. ### Multinomial Models For the multinomial model, suppose the response variable has $K$ levels ${\cal G}=\{1,2,\ldots,K\}$. Here we model $$\mbox{Pr}(G=k|X=x)=\frac{e^{\beta_{0k}+\beta_k^Tx}}{\sum_{\ell=1}^Ke^{\beta_{0\ell}+\beta_\ell^Tx}}.$$ Let ${Y}$ be the $N \times K$ indicator response matrix, with elements $y_{i\ell} = I(g_i=\ell)$. Then the elastic-net penalized negative log-likelihood function becomes $$ \ell(\{\beta_{0k},\beta_{k}\}_1^K) = -\left[\frac{1}{N} \sum_{i=1}^N \Big(\sum_{k=1}^Ky_{il} (\beta_{0k} + x_i^T \beta_k)- \log \big(\sum_{k=1}^K e^{\beta_{0k}+x_i^T \beta_k}\big)\Big)\right] +\lambda \left[ (1-\alpha)||\beta||_F^2/2 + \alpha\sum_{j=1}^p||\beta_j||_q\right]. $$ Here we really abuse notation! $\beta$ is a $p\times K$ matrix of coefficients. $\beta_k$ refers to the kth column (for outcome category k), and $\beta_j$ the jth row (vector of K coefficients for variable j). The last penalty term is $||\beta_j||_q$, we have two options for q: $q\in \{1,2\}$. When q=1, this is a lasso penalty on each of the parameters. When q=2, this is a grouped-lasso penalty on all the K coefficients for a particular variables, which makes them all be zero or nonzero together. The standard Newton algorithm can be tedious here. Instead, we use a so-called partial Newton algorithm by making a partial quadratic approximation to the log-likelihood, allowing only $(\beta_{0k}, \beta_k)$ to vary for a single class at a time. For each value of $\lambda$, we first cycle over all classes indexed by $k$, computing each time a partial quadratic approximation about the parameters of the current class. Then the inner procedure is almost the same as for the binomial case. This is the case for lasso (q=1). When q=2, we use a different approach, which we wont dwell on here. For the multinomial case, the usage is similar to logistic regression, and we mainly illustrate by examples and address any differences. We load a set of generated data. ```{r} data(MultinomialExample) ``` The optional arguments in `glmnet` for multinomial logistic regression are mostly similar to binomial regression except for a few cases. The response variable can be a `nc >= 2` level factor, or a `nc`-column matrix of counts or proportions. Internally glmnet will make the rows of this matrix sum to 1, and absorb the total mass into the weight for that observation. `offset` should be a `nobs x nc` matrix if there is one. A special option for multinomial regression is `type.multinomial`, which allows the usage of a grouped lasso penalty if `type.multinomial = "grouped"`. This will ensure that the multinomial coefficients for a variable are all in or out together, just like for the multi-response Gaussian. ```{r} fit = glmnet(x, y, family = "multinomial", type.multinomial = "grouped") ``` We plot the resulting object "fit". ```{r} plot(fit, xvar = "lambda", label = TRUE, type.coef = "2norm") ``` The options are `xvar`, `label` and `type.coef`, in addition to other ordinary graphical parameters. `xvar` and `label` are the same as other families while `type.coef` is only for multinomial regression and multiresponse Gaussian model. It can produce a figure of coefficients for each response variable if `type.coef = "coef"` or a figure showing the $\ell_2$-norm in one figure if `type.coef = "2norm"` We can also do cross-validation and plot the returned object. ```{r} cvfit=cv.glmnet(x, y, family="multinomial", type.multinomial = "grouped", parallel = TRUE) plot(cvfit) ``` Note that although `type.multinomial` is not a typical argument in `cv.glmnet`, in fact any argument that can be passed to `glmnet` is valid in the argument list of `cv.glmnet`. We also use parallel computing to accelerate the calculation. Users may wish to predict at the optimally selected $\lambda$: ```{r} predict(cvfit, newx = x[1:10,], s = "lambda.min", type = "class") ``` ## Poisson Models Poisson regression is used to model count data under the assumption of Poisson error, or otherwise non-negative data where the mean and variance are proportional. Like the Gaussian and binomial model, the Poisson is a member of the exponential family of distributions. We usually model its positive mean on the log scale: $\log \mu(x) = \beta_0+\beta' x$. The log-likelihood for observations $\{x_i,y_i\}_1^N$ is given my $$ l(\beta|X, Y) = \sum_{i=1}^N \left(y_i (\beta_0+\beta' x_i) - e^{\beta_0+\beta^Tx_i}\right). $$ As before, we optimize the penalized log-lielihood: $$ \min_{\beta_0,\beta} -\frac1N l(\beta|X, Y) + \lambda \left((1-\alpha) \sum_{i=1}^N \beta_i^2/2) +\alpha \sum_{i=1}^N |\beta_i|\right). $$ Glmnet uses an outer Newton loop, and an inner weighted least-squares loop (as in logistic regression) to optimize this criterion. First, we load a pre-generated set of Poisson data. ```{r} data(PoissonExample) ``` We apply the function `glmnet` with the `"poisson"` option. ```{r} fit = glmnet(x, y, family = "poisson") ``` The optional input arguments of `glmnet` for `"poisson"` family are similar to those for others. `offset` is a useful argument particularly in Poisson models. When dealing with rate data in Poisson models, the counts collected are often based on different exposures, such as length of time observed, area and years. A poisson rate $\mu(x)$ is relative to a unit exposure time, so if an observation $y_i$ was exposed for $E_i$ units of time, then the expected count would be $E_i\mu(x)$, and the log mean would be $\log(E_i)+\log(\mu(x))$. In a case like this, we would supply an *offset* $\log(E_i)$ for each observation. Hence `offset` is a vector of length `nobs` that is included in the linear predictor. Other families can also use options, typically for different reasons. (Warning: if `offset` is supplied in `glmnet`, offsets must also also be supplied to `predict` to make reasonable predictions.) Again, we plot the coefficients to have a first sense of the result. ```{r} plot(fit) ``` Like before, we can extract the coefficients and make predictions at certain $\lambda$'s by using `coef` and `predict` respectively. The optional input arguments are similar to those for other families. In function `predict`, the option `type`, which is the type of prediction required, has its own specialties for Poisson family. That is, * "link" (default) gives the linear predictors like others * "response" gives the fitted mean * "coefficients" computes the coefficients at the requested values for `s`, which can also be realized by `coef` function * "nonzero" returns a a list of the indices of the nonzero coefficients for each value of `s`. For example, we can do as follows. ```{r} coef(fit, s = 1) predict(fit, newx = x[1:5,], type = "response", s = c(0.1,1)) ``` We may also use cross-validation to find the optimal $\lambda$'s and thus make inferences. ```{r} cvfit = cv.glmnet(x, y, family = "poisson") ``` Options are almost the same as the Gaussian family except that for `type.measure`, * "deviance" (default) gives the deviance * "mse" stands for mean squared error * "mae" is for mean absolute error. We can plot the `cv.glmnet` object. ```{r} plot(cvfit) ``` We can also show the optimal $\lambda$'s and the corresponding coefficients. ```{r} opt.lam = c(cvfit$lambda.min, cvfit$lambda.1se) coef(cvfit, s = opt.lam) ``` The `predict` method is similar and we do not repeat it here. ## Cox Models The Cox proportional hazards model is commonly used for the study of the relationship beteween predictor variables and survival time. In the usual survival analysis framework, we have data of the form $(y_1, x_1, \delta_1), \ldots, (y_n, x_n, \delta_n)$ where $y_i$, the observed time, is a time of failure if $\delta_i$ is 1 or right-censoring if $\delta_i$ is 0. We also let $t_1 < t_2 < \ldots < t_m$ be the increasing list of unique failure times, and $j(i)$ denote the index of the observation failing at time $t_i$. The Cox model assumes a semi-parametric form for the hazard $$ h_i(t) = h_0(t) e^{x_i^T \beta}, $$ where $h_i(t)$ is the hazard for patient $i$ at time $t$, $h_0(t)$ is a shared baseline hazard, and $\beta$ is a fixed, length $p$ vector. In the classic setting $n \geq p$, inference is made via the partial likelihood $$ L(\beta) = \prod_{i=1}^m \frac{e^{x_{j(i)}^T \beta}}{\sum_{j \in R_i} e^{x_j^T \beta}}, $$ where $R_i$ is the set of indices $j$ with $y_j \geq t_i$ (those at risk at time $t_i$). Note there is no intercept in the Cox mode (its built into the baseline hazard, and like it, would cancel in the partial likelihood.) We penalize the negative log of the partial likelihood, just like the other models, with an elastic-net penalty. We use a pre-generated set of sample data and response. Users can load their own data and follow a similar procedure. In this case $x$ must be an $n\times p$ matrix of covariate values - each row corresponds to a patient and each column a covariate. $y$ is an $n \times 2$ matrix, with a column "time" of failure/censoring times, and "status" a 0/1 indicator, with 1 meaning the time is a failure time, and zero a censoring time. ```{r} data(CoxExample) y[1:5,] ``` The `Surv` function in the package `survival` can create such a matrix. Note, however, that the `coxph` and related linear models can handle interval and other forms of censoring, while glmnet can only handle right censoring in its present form. We apply the `glmnet` function to compute the solution path under default settings. ```{r} fit = glmnet(x, y, family = "cox") ``` All the standard options are available such as `alpha`, `weights`, `nlambda` and `standardize`. Their usage is similar as in the Gaussian case and we omit the details here. Users can also refer to the help file `help(glmnet)`. We can plot the coefficients. ```{r} plot(fit) ``` As before, we can extract the coefficients at certain values of $\lambda$. ```{r} coef(fit, s = 0.05) ``` Since the Cox Model is not commonly used for prediction, we do not give an illustrative example on prediction. If needed, users can refer to the help file by typing `help(predict.glmnet)`. Also, the function `cv.glmnet` can be used to compute $k$-fold cross-validation for the Cox model. The usage is similar to that for other families except for two main differences. One is that `type.measure` only supports "deviance"(also default), which gives the partial-likelihood. The other is in the option `grouped`. `grouped = TRUE` obtains the CV partial likelihood for the Kth fold by subtraction; by subtracting the log partial likelihood evaluated on the full dataset from that evaluated on the on the (K-1)/K dataset. This makes more efficient use of risk sets. With `grouped=FALSE` the log partial likelihood is computed only on the Kth fold, which is only reasonable if each fold has a large number of observations. ```{r} cvfit = cv.glmnet(x, y, family = "cox") ``` Once fit, we can view the optimal $\lambda$ value and a cross validated error plot to help evaluate our model. ```{r} plot(cvfit) ``` As previously, the left vertical line in our plot shows us where the CV-error curve hits its minimum. The right vertical line shows us the most regularized model with CV-error within 1 standard deviation of the minimum. We also extract such optimal $\lambda$'s. ```{r} cvfit$lambda.min cvfit$lambda.1se ``` We can check the active covariates in our model and see their coefficients. ```{r} coef.min = coef(cvfit, s = "lambda.min") active.min = which(coef.min != 0) index.min = coef.min[active.min] ``` ```{r} index.min coef.min ``` ## Sparse Matrices Our package supports sparse input matrices, which allow efficient storage and operations of large matrices but with only a few nonzero entries. It is available for all families except for the `cox` family. The usage of sparse matrices (inherit from class `"sparseMatrix"` as in package `Matrix`) in `glmnet ` is the same as if a regular matrix is provided. We load a set of sample data created beforehand. ```{r} data(SparseExample) ``` It loads `x`, a 100*20 sparse input matrix and `y`, the response vector. ```{r} class(x) ``` Users can create a sparse matrix with the function `sparseMatrix` by providing the locations and values of the nonzero entries. Alternatively, `Matrix` function can also be used to contruct a sparse matrix by setting `sparse = TRUE`, but this defeats the purpose somewhat. We can fit the model the same way as before. ```{r} fit = glmnet(x, y) ``` We also do the cross-validation and plot the resulting object. ```{r} cvfit = cv.glmnet(x, y) plot(cvfit) ``` The usage of other functions are similar and we do not expand here. Note that sparse matrices can also be used for `newx`, the new input matrix in the `predict` function. For example, ```{r} i = sample(1:5, size = 25, replace = TRUE) j = sample(1:20, size = 25, replace = TRUE) x = rnorm(25) nx = sparseMatrix(i = i, j = j, x = x, dims = c(5, 20)) predict(cvfit, newx = nx, s = "lambda.min") ``` ## Appendix 0: Convergence Criteria Glmnet uses a convergence criterion that focuses not on coefficient change but rather the impact of the change on the fitted values, and hence the loss part of the objective. The net result is a weighted norm of the coefficient change vector. For gaussian models it uses the following. Suppose observation $i$ has weight $w_i$. Let $v_j$ be the (weighted) sum-of-squares for variable $x_j$: $$v_j=\sum_{i=1}^Nw_ix_{ij}^2.$$ If there is an intercept in the model, these $x_j$ will be centered by the weighted mean, and hence this would be a weighted variance. After $\hat\beta_j^o$ has been updated to $\hat\beta_j^n$, we compute $\Delta_j=v_j(\hat\beta_j^o-\hat\beta_j^n)^2$. After a complete cycle of coordinate descent, we look at $\Delta_{max}=\max_j\Delta_j$. Why this measure? We can write $$\Delta_j=\frac1N\sum_{i=1}^N w_j(x_{ij}\hat\beta_j^o-x_{ij}\hat\beta_j^n)^2,$$ which measures the weighted sum of squares of changes in fitted values for this term. This measures the impact of the change in this coefficient on the fit. If the largest such change is negligible, we stop. For logistic regression, and other non-Gaussian models it is similar for the inner loop. Only now the weights for each observation are more complex. For example, for logisitic regression the weights are those that arise from the current Newton step, namely $w_i^*=w_i\hat p_i(1-\hat p_i)$. Here $\hat p_i$ are the fitted probabilities as we entered the current inner loop. The intuition is the same --- it measures the impact of the coefficient change on the current weighted least squares loss, or quadratic approximation to the log-likelihood loss. What about outer-loop convergence? We use the same measure, except now $\hat\beta^o$ is the coefficient vector before we entered this inner loop, and $\hat\beta^n$ the converged solution for this inner loop. Hence if this Newton step had no impact, we declare outer-loop convergence. ## Appendix 1: Internal Parameters Our package has a set of internal parameters which control some aspects of the computation of the path. The *factory default* settings are expected to serve in most cases, and users do not need to make changes unless there are special requirements. There are several parameters that users can change: `fdev` - minimum fractional change in deviance for stopping path; factory default = 1.0e-5 `devmax` - maximum fraction of explained deviance for stopping path; factory default = 0.999 * `eps` - minimum value of lambda.min.ratio (see glmnet); factory default= 1.0e-6 * `big` - large floating point number; factory default = 9.9e35. Inf in definition of upper.limit is set to big * `mnlam` - minimum number of path points (lambda values) allowed; factory default = 5 * `pmin` - minimum null probability for any class; factory default = 1.0e-5 * `exmx` - maximum allowed exponent; factory default = 250.0 * `prec` - convergence threshold for multi-response bounds adjustment solution; factory default = 1.0e-10 * `mxit` - maximum iterations for multiresponse bounds adjustment solution; factory default = 100 * `factory` - If `TRUE`, reset all the parameters to the factory default; default is `FALSE` We illustrate the usage by an example. Note that any changes made hold for the duration of the R session, or unless they are changed by the user with a subsequent call to `glmnet.control`. ```{r} data(QuickStartExample) fit = glmnet(x, y) print(fit) ``` We can change the minimum fractional change in deviance for stopping path and compare the results. ```{r} glmnet.control(fdev = 0) fit = glmnet(x, y) print(fit) ``` We set `fdev = 0` to continue all along the path, even without much change. The length of the sequence becomes 100, which is the default of `nlambda`. Users can also reset to the default settings. ```{r} glmnet.control(factory = TRUE) ``` The current settings are obtained as follows. ```{r} glmnet.control() ``` ## Appendix 2: Comparison with Other Packages Some people may want to use `glmnet` to solve the Lasso or elastic-net problem at a single $\lambda$. We compare here the solution by `glmnet` with other packages (such as CVX), and also as an illustration of parameter settings in this situation. __Warning__: Though such problems can be solved by `glmnet`, it is __not recommended__ and is not the spirit of the package. `glmnet` fits the __entire__ solution path for Lasso or elastic-net problems efficiently with various techniques such as warm start. Those advantages will disappear if the $\lambda$ sequence is forced to be only one value. Nevertheless, we still illustrate with a typical example in linear model in the following for the purpose of comparison. Given $X, Y$ and $\lambda_0 > 0$, we want to find $\beta$ such that $$ \min_{\beta} ||Y - X\beta||_2^2 + \lambda_0 ||\beta||_1, $$ where, say, $\lambda_0 = 8$. We first solve using `glmnet`. Notice that there is no intercept term in the objective function, and the columns of $X$ are not necessarily standardized. Corresponding parameters have to be set to make it work correctly. In addition, there is a $1/(2n)$ factor before the quadratic term by default, we need to adjust $\lambda$ accordingly. For the purpose of comparison, the `thresh` option is specified to be 1e-20. However, this is not necessary in many practical applications. ```{r, echo=FALSE} data(QuickStartExample) ``` ```{r,eval=FALSE} fit = glmnet(x, y, intercept = F, standardize = F, lambda = 8/(2*dim(x)[1]), thresh = 1e-20) ``` We then extract the coefficients (with no intercept). ```{r,eval=FALSE} beta_glmnet = as.matrix(predict(fit, type = "coefficients")[-1,]) ``` In linear model as here this approach worked because we were using squared error loss, but with any nonlinear family, it will probably fail. The reason is we are not using step length optimization, and so rely on very good warm starts to put us in the quadratic region of the loss function. Alternatively, a more stable and __strongly recommended__ way to perform this task is to first fit the entire Lasso or elastic-net path without specifying `lambda`, but then provide the requested $\lambda_0$ to `predict` function to extract the corresponding coefficients. In fact, if $\lambda_0$ is not in the $\lambda$ sequence generated by `glmnet`, the path will be refitted along a new $\lambda$ sequence that includes the requested value $\lambda_0$ and the old sequence, and the coefficients will be returned at $\lambda_0$ based on the new fit. Remember to set `exact = TRUE` in `predict` function to get the exact solution. Otherwise, it will be approximated by linear interpolation. ```{r} fit = glmnet(x, y, intercept = F, standardize = F, thresh = 1e-20) beta_glmnet = as.matrix(predict(fit, s = 8/(2*dim(x)[1]), type = "coefficients", exact = TRUE, x=x, y=y)[-1,]) ``` We also use CVX, a general convex optimization solver, to solve this specific Lasso problem. Users could also call CVX from R using the `CVXfromR` package and solve the problem as follows. ```{r, eval=FALSE} library(CVXfromR) setup.dir = "change/this/to/your/cvx/directory" n = dim(x)[1]; p = dim(x)[2] cvxcode = paste("variables beta(p)", "minimize(square_pos(norm(y - x * beta, 2)) + lambda * norm(beta, 1))", sep = ";") Lasso = CallCVX(cvxcode, const.var = list(p = p, x = x, y = y, lambda = 8), opt.var.names = "beta", setup.dir = setup.dir, matlab.call = "change/this/to/path/to/matlab") beta_CVX = Lasso$beta ``` For convenience here, the results were saved in `CVXResult.RData`, and we simply load in the results. ```{r} data(CVXResults) ``` In addition, we use `lars` to solve the same problem. ```{r,message=FALSE} require(lars) ``` ```{r} fit_lars = lars(x, y, type = "lasso", intercept = F, normalize = F) beta_lars = predict(fit_lars, s = 8/2, type = "coefficients", mode = "lambda")$coefficients ``` The results are listed below up to 6 decimal digits (due to convergence thresholds). ```{r} cmp = round(cbind(beta_glmnet, beta_lars, beta_CVX), digits = 6) colnames(cmp) = c("beta_glmnet", "beta_lars", "beta_CVX") cmp ``` ## References glmnet/inst/doc/glmnet.pdf0000644000176200001440000124045313574046200015255 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4698 /Filter /FlateDecode /N 78 /First 654 >> stream x\Ys۸~o'SSSS8Nd̩y%D%k,7tu0$V6ݍޘ 30TfJaRƆ%%KbZj&hb2U1e(,AC5AaQSb>eJP{ƔN( Ei;&SDd$ QMRwł*"8f1VbZ*f@` m5KXLѤ" <JCcYxHcxBQwPk̑Vz3Gh OcO@3՘90Y@8p%a&fV)6Yi/! u}7Y+cc m̬SB?f6 H!W8Ö`ff4&!ưҤFaDuL& y9!yu9- digk+v3~5{N|],I>$p P0W_R$ƅ~&sMKCѮ.*kҏ2b~4,sߑQLH%Ŀ~7(o ֵ\v;ۛrbOP8]lG9}yv^,Vj,nK .W(y+'#UMclc1#\c-,lb=/K$kj 暔kƑA뤻̍&Buݥ/KWN`PޱrL/w\HщyPdk'~vw~I/8$0|( R9< ݷ%{2? Eż% ^ÃQ%-aa~j^(ZыeIԏu8@e^bV~vt w%&}:XJA;d|ף|UnHw 9=_O[zcWv%^xA' DDHԧzy5ԛBq2Q(L"mT*Hk8 I, =)@ 2Y%XbFA 9=:J I1+cQ0@:Vd ISq2А}:SXΆSg:ݷ; WON/\FO1FGq1fS1>_ +LoK:bI/V>+k pd7|UK~פ[U2s4Jژ\M={iEc l?c,0Tv `[SYc{VBZГ\i7bw*/oB"xŸCSs~/h1]|¯ /_|g||1-_/yu 'KOIzEփ݀޶Q NZip$V5X@3v:gA%q*XQZzͻ[Ӌz=m+*m" $S?"M&q ]Ihi"2T=-E*if/ A֡TX7&qyE@C2ؒdܥ1Ddm1TF_'[C9%t@>0pqĆzP*GpBEoGPLHu9o+X<<{a(S5cC.$iDZx8:듊.~RVZJyB.5RbCMDjhm]5vUechoi7C~CMp<k+`fvh5fIf۠}(z?e%kei/O3M69 rVY# o͆va*{R@%M[ڳXti$;1w]=7ϟkmT2+ڦ2RC9d(rd)u}KʈX_o$I]&ֹXޱdig9P,+V)$K$l/1J!CQ?z%gaYj!s3yz~~a2_B jM5U[rj1ƭ*rxȧjxk۠%97{?>\kv*i̴Sb/^+sȼ'EpoC6ipSNE 5=sΜ'3\hLR?ЦYl\ÖW5W5hu|U4rY-5E:Lʍ&_VtlLV+TJW)^mW(-v:Wkp-歊2+kl鬛oqnlh>56+zr"{rϯ ڥX?T'itNtɖ6W(שz?L{[, Z-Ee8ۂW\;ۦ}7.ͮU Pqˎ}IE}_%{zּŻ Q[)>2d~|ɇ_ VowbFU8z.b^߬JfT<[OvƌzX^ZEPavvYx6z }g%OD< %R (Rwq=J oK;) hrn:\v߮uya.wGuyT1r0Tkmh|Gj|WlRjvDѨ)cܧܷz2_*>gD?I=!9Rr xXJϖ?>=U>hX=׼[ἨyXtQ=u|ڎr"gʪ#($6=3hs Fó񴉝W.Z_H 3󎔔yg5^~SXq7ZqJ\0tG[(їV(-lRr+J~cPƼ w嶧9eQ$bQ'ߡWV/RRM\ZYz4)g+Ϭ۽jFLZ;*OT-~xyEm(wI`i;t`Y1K%%@I(%)2gDed{D/mϟ;HSB1A €aB~whtK/n/$ִXSsd-!U3nZ~mcN]h{-J.Ue h&پl)rrd\ٴD_se$#OgghlWiFq5'7-Gܟh`#)wu6tLD=zBOڮCGosiTC%+'CS\m __oͦ@qMApd_O= bQo"fmE2[wQU#N1;w\2 :"PyoNjbX^s)25q\_D !LV`J S9a&^:!PnR3H$Cߨg递99$OiBcR5{ ,H RQk&礼LrP2.pLr7gF?l**dX!Im "ֻRڤ{dA" 0R!ۆ2Y%BW4ʶYfbKPp2y=nXU-V$8jj??\v$чaF)>N#OS| }gD[+VB>bˠyL'S]ʇF:s0 &}H S:P#!26=VSX=5X3X5sӳi&՘Ak[*oY#߬IـQZ~_21ވQendstream endobj 80 0 obj << /Subtype /XML /Type /Metadata /Length 1612 >> stream GPL Ghostscript 9.23 2019-12-10T17:55:11-08:00 2019-12-10T17:55:11-08:00 LaTeX with hyperref package An Introduction to glmnetTrevor Hastie and Junyang Qian endstream endobj 81 0 obj << /Type /ObjStm /Length 1496 /Filter /FlateDecode /N 78 /First 675 >> stream xY[o6~߯!x'@40(]WuTG/ wȡQm&-G~s(/YƼb࡙0LS2K-<: L(2<`A0!dA2!]8I e4 8c)1tL8z&f9z+Ǡ`%dfG3)3" ѐeft ?1fTy^M7j\ g`]nY-'WMϟzi6 o rY"Tu*1*8Ad"TĨՐysh_646ohì`lCƣ-8PiCCA-FS12" ͇aߣFA PiGrDrCfO4~\H8Re2Eo55<د}}7Ul ˼~=zyz|\]YgDdG'\LbYxQwgŪ^\WuYC9ɪ:ۭA 窆BDGqQ]@o}jpZ#ի^6M%y8-N3l<-)fҨY$1:+f9uEy[1b:?/ZE@FϨoI1?Z+JEܶEhV? ܶE,nn,ol]zk%[8rQD&ٶIv(E(|"bCuM״TƧyv*=*r^Ѫ>AEO}g.K;ܯ]TZ%߷ow7mu ;c>|><__/UYL|ɯjR{T4Hi :=ew5g껡6۝[{v0zypG_矗 .ytVƩ7|:lxTL;'0`~=4cmNZ!tNz;⪒.44"?;(&V?q+(7P٣F;!['z:I;otWʯT*aSuѩ 4r~nU|IU'QSsa{%l A{+^b;NHuŵ p,kNKEE1mqH9>%6o@>7& $4,կ;.^N/_r#8mjE½濙 C/uendstream endobj 160 0 obj << /Type /ObjStm /Length 2393 /Filter /FlateDecode /N 76 /First 676 >> stream xZr}WqR~I9x^qݵhj$3+qTh4fH;"0Ӎ $L:ŤLEaVPeD:/OJQ:&=[/j441UoJx˔;3i j׃dA1mh=Mt2Xfr(8fgq92$`F%3`@x+,5ife8T@Xf>h .09s&)#s+!:'tJhV( 0+L(V¡Q{G}An(ARJj^p1e$jЦg*՘J,x̬Fj0rTQRFj,RPɣ`Xi"U `;JK”,:KJH:U#{˞)޽' f.o?ɚS7U,VWU]B@Bxqyu~ǻ i:AwBi AY(JHtRb#Є@{X˴Sdہ[91Pg8vUʉtJ@tCx'`i\|^A ZW}nT}5ef y:􈆚>\ݓ+cڌLLa3jZxZt!3gOCZ}Ѣvhn=@e&-840.wkx&@hC̿[cƔcK{-s= k5 .zrY 4'ŲkL5]I/Ql5Z+4_yf4>?2O1=uxS`!$<}$@񏛜F{Q%Ijǽd&QoWGjP#o#onqn*\8>Fɍt}F#Kz68MYMfkmxWj/ټ&_oI?y$#w9Sl6l6v/?}iѶ/-b_}->~)jļλqm}ˬx}ntU ',nR-OyAL'y80?Ul%G#i!٠ n? ^.5q\{xlӶ"c'AD_X쌭 Iڛi bGJ I!˩{Z#?,)s1mqP_P?+s$f8X(?)})q/Y6_͖|ut*ynff_/9jsd]C2IN:baǖ!km-NgCFؾFcFR4nj>UGx{S/T@-D5 j7ヤIxj to}Tz蘱ȌIJD5H$QَDkJ4b{?:RoQo̦YlZw,]1unӪץ..;9nendstream endobj 237 0 obj << /Filter /FlateDecode /Length 5157 >> stream x\IsGvv7X94 Gߜas_F!X$|(݅iH̬l@*H ڂVvo/}/=gF,.G.ş\HX+( d#†pۣrl/4M\a.2ΰ==`r]l\ qJ &p%Ǖeթ_W]k8^vw6,~v!D 2b J/ik ٫~$ξ o ~0{֩,fw.hPùcvU0AZE] gۓybB=ɍ$6/ni7^!+a^O`3:8\-pɥYR=<)/y;إ1lz'hã@ÚJdy?oI9GB4i:^uGrU":I">vi#~!󾘺ٿ{B8ӾQ" y}1MwJK ^$Uq*VG[N$pU|[nwYYbVjuD>_.h611oH q zZD3$ݟh 0m[< 5?+>PG}sYWhDΣ_N}ЫAΈ5Qh4C2zH~lMVBD D$IHKpb*k4(8wĴ .z5ǃ04J&J2B~瀐w 22FTcAߏoA;v͓,PsJGX/)zM ț CۺY~S=wU3B5NYWn64$͎!7nU+\gq`-Տ N$wA%䁩ݿJ)cߴþ;-CZ9 +8엍яt/:GSSmWW16hn($#,=c&0y$'zS (!00Ͼa] S8?(hf+>D2[.7XojJAc Lיقnft^weˆWoe#rEt t$N8ۚ1cϪ8ON*ȧ5P#Y8ቊoo`:QeJE‚[#"%@0XbR")TUR e-tTkR+@yR3`2p3*#|GÖ4hvH-aاuj8%ۮlM r=ͼaM4;MW"dg5 {յy*ɲpZl7Rg%U ɶm%nnӼeY䉍X.V#?~M &.Uʑ#~|k'gـ)lG@dq56%Sr,2 4lkUv3Y9TG[vTтmLUSf!,44ZX>MatyyuOG9Q=˴K֎c3.:sG< ڲvsSp:=X0 WCʳK?-|5yUkO|p 4*F/vPnV.m"+ \\n'J`tgdw4ögwq$v>a X))J?qY.{!)2jFmHw dHc]:q_a6],LLZ4Z6V'q֪p2L I '){8P$(!>K%\;6edvVX;ƠQ@lp]9" ;P@/V* +ktɄMQIPST{m!Mɽco2QRWMrF(ӣȼ]gDZ@uZIV2n"!Run1y4yZ E}:g;3j6%nWStBGg*!M|}$5ohKX-20"1 =TC#L,/U!`8e_U;!,H-{ÕzR;J㥗zyE@FIH`ݾu-n+V"}{9zmXYU5yp|6h^5lds*MpjJ ȶ)ONE*I '6S2^ғt _E- Od/M}UK"2z7lړLLLoIi*JX* QCډWO;$3dȻNSpI4ۛj)gȏRf "7rFkʡٳ&=dO}TRu\Vƣ$RM fP[X%nKH&uUygpb3F7NߴgyfS.EyrYGỳK(PV;>ú9WYǠrT֛ø#y}^@ }^F`5ӊ b`r:|evycr1~-3o"mKIEM"$ɦeKl`rRERW|Z- _P$ Mb {jDX6|fNx]T~2(!A 0V _Gɷx}_fǏ -Xa=`5Nl3wl8L)çfi5һϕ[Y) Xs+<S-ZiP<䓒S9)/\p DP 3) -(XՄQT,֐ wlv*Bp7C̨ߑ&_=jkr?Ib❠H'3#g~!P 궔4Zw<3m3]v`H$2A-A|JI?dAYA,e߮NxLbg}w,rQ]dpgOLl33˔ULc YMONx,Z_vn4Uݳ|!*(4pWTr2PW\10ThY`:V{:]0?v0M>VWeG dƕcDGKs[`ᓹNo(HKLAZ˅$ӏ8*k$g|ݖ-:.m4l^=AJv>I .MYe_(weh<}\ [mNٔGq՘Y3.WBV>kts7Ϫ̖ޣEd_N^՜E' /ڡ>AP'|T2;# te~7N3*MEC}JDOUXdo)q0,&K`^0Jz$ F!K"m1U\_I-SkLYnFftd,DzĈow]GҶ&VL/ſBoud[v!ᴬIF{10y9nFw)y<5xB(f/54I0\1m%k=]#$_11`t ë1xpYoЧ=IڤqW9 1sBgL9w:@d\o(7ɗ2]SD$'(>9(xժ|osZJ 'H#sM74۫)q%C b ?x36zJ 7UODH=Pr-w GvHg <p58|l̓aESMy{H!՘ޥ JV-) N ?hOʠ7;%KNWa+RpK"٪4&2Tb'hN9Di>-y*T "b"E0b/@_%P%u`=24an@%UU@F\IO ( TPsETUN"+R`9_]_X,_ Rwg4H(P6rQłtnJDetUs#%dOQڡ&И#]9ExwcqlO۩"&Ģ4]&[:%Hy?ѝOk quұfYJJLEg]P؞.T^fD"f٬}sUՑ&u>`%)>YV{,g_`HmH z=9G%@34U5.%il|v1E]\> z܉mS ~33O\R.f,$8'i&Vbɕ.Woo)s)G) nX[\0ǟcv os5N8Jjv &R5Wc_OHWdS >LcXp6KoL[ CtI>[‚TM YR"ˀeFuhsZ6<0ķG endstream endobj 238 0 obj << /Filter /FlateDecode /Length 5357 >> stream x[Ksq>H z"dKʖ7t|c3Cz磞`7׻sQ/ߝw8_fwWF? -b84]X˩zvx.d1o9\=el]+ʗ rR9Q շoVɾR: k6"Jz%vœ۳'Ǒխ#d8M_ [@Q/:hoSj[VV4O@tSG:o=9of5Ry߳̚J[DFEò^2CAUi[(iD*,zs}XxRm3 nb/TͻUZf`n^W ]s[ <ܠU6c08!V sV mz5'gEqr#rpTQkSJe.hewH\4V9{8e-%ꡋ'.ZŹpuϧ~EGuدM{EX8 ^׬mæx{^|[y`>y,ӝBKsI9= 7-p@ҪO4E$SEzH탆PCVF<( FXш.l؜C(wgEV l&Xw r2[<tx3K(ls@ǟln'0cdk+WIB15Һ>i%rVy\$~x`G-S .Dꮯ2K:[|Pt:-t#֨4X~zҼBR7%\^]Dsfu&xbVh'|K5Vs2.AϟvHUKx aKB¬l{tF{"6\y&C :Uio=Hr7 '?,9(N"ZauPxu6kZ`A= z3 x"2c> ׂ"ّ׊~E5jX.wrPr|XN@Sj}ςڻN LiƤ` *|sL9f A| eu }v.< ԉk ^4% %VRBQם%ʖ:u*'C>i[mUe $#" :OmRh-vՋq "Dqi&ݎb1F*t`t9)yN E4C;!jѯCY%x9 pͿ]ONojP1*fyݚ}vy?-XEyE7aF)?4\Ƚ\=|ӀH%3, DWy]n~,0M D 9ƴU*% ?V+8$G$H+w8hxR%Om>Ɵ H '˟ή{45FX-sNTEqJ\'ٔ: Eǥ5,dWqVL4_Ewec9'<ѝǮE)`z2"1=Ȁ4b|}L ‘7"(Ef*QxL6zJ}1J\St`c Xp?O 8f \6YX6jA? 5rSviL7,d+{ξ0$lߵ%Vs}9(#wy>ߝ pJp^FBĩ$8أP[ڂ1<0o]RSFQz[QdzCi)OH/e;K?~3}Ejeu 4"#5K NuG+=.>U{xn˧yfiᯐbs3B;iu*ZX/DSwX8N 6 PFRz gZLS87w!az+X&ALg!bD"%Ew|.x$ ޹vTACCT,/1^3ͺw~*"nm eXB8'U*.иP2fxjB}Cp F@B*tS>,S,g:||U/Ҵ)u*~9RP7 [:e >4ŲzutuAQ44l0w#͌wԡ2+s@3lKAh3Fb[9Nk청qeuM I).mh) Ec|>{ʎЇkG\.UҢ/A&tZ~bMx 8ZDms;o@ioo^Ok_}ۇ=j*;6]ʤ67S52WN| |q(nZ!XsYBļ,9uNXb9vކrCDApƌ_-b^((kzOUUbs].'[~Ϋ9Zzd2I\HU v皂IcFB}ETx@ف 3RjcI7l\Q U#=x{2M֖+ܢK5g78| c:l gLGw8s ENh¾1lsF} K[jʔv+"qKNH$mHXv1k{}?,΀˂c1|6 UclgA(S,12'&wk\+7Y"IPtxqOٕUt+TXDT]*&.l7Lz}xS:7DqgV-$ + u/rl;bҪ;xa 00mX y_tKQ0‘wvVZ}kڥ~\w e@Pڴ]Ya~+oPwA[sb'(&4^ fj6 73[f/9|É9!1#2dހ]=_Cl*kBBMW0GΜY3.:?dPW(?jFj;U*L _Ă@1tB.4BXk%FeY^>;.z]&y<|Ha.3!1/ ]y'_a62j!v M9c]2SWj pdPmjtؖ!c<~}Z)aw93n5cL~3_$U䆜u_#{c$8cR>YqXw|osH'X`4+OúECpζJ\Y /[~Y?:RpFR;BA2;q~)U+ Ū${޾WDL'tGqo4OX ? ұ5FrxY,:f"7 Z';f}Y؉*)9,`G]/'p4\$C^$P+ޱt}/Lz"Ů4-kVcr}nHg ˺nKmO_מ$@حuRkjMu?ocox}>~vVbRdgѕǟ?qHtX41Yu7USbBT?"ⷺ˻E܌j^_pb╄{^skT~3snIs܎ս.Qhu/:>Tĸ&~)7x.1UXt^HUMG@%MUi@# V,89IVCq⢸J rύ,rҔq:%]jg8ʆJ m9Ga3xm%JV`yT&6> stream xZY$6nv׿yTeV̰` ӕq|U?6e /7ϾU/hsqjwi|7ufv0Ra|rl6F*ӌ-8ۂ)8fLrJ:!9 iMmQDtU)A p'c|~)xD.WpІk1 VOUյ`ԩǻ'I8-5BR#4sM:'DF_˕80rqKKJ QVKIv79r=cN#d$a dڑp~:%|z q|AWI Mm<}7IC&ncxԂHr>25|Eϕm'.>F۹ )~M"z 011QI:k50=!Ru7;<+nh]T8C-nFk lÒĚdax,;`,JHrW۵z? VE%ݐW?k(C6 .$+0S] Ets;2/_D 㕂gdp R HRcR8ڀt!.2LWx{r^^5lq~8lC /W TD"Ęj͊P[\ "U/)8+:hOXg 4ץo 94 ѥwq 榜Ѝ#U\Jgk6%/w-&uץC@.iyi{Df 6]}e+\+h6%p ݅ʫ2v`U0:\ f ekyJZt@T-c iۦ |^E>rҤ-c>(Wj΋<%crU#XFP CLVru!XiCOYm!66P7{y Nbr NfzgZlSx,xmS&T_exᾮ\"t$t&?xИWSƱN\Ν CX2_"o-&IjnZFc_侜k-V\3Ers=h JVq+/2U*exfV MƯv^$MV#4D˙qyO&4{! ϔ$i]?e78 wC)>*?1Ch4`/ T- V7QX2SR<WR?n72X&H66*~w% ;}m&ԯfݘb/Z>#TZHoK? pY9"]> stream xWv6k.׮`O.6=>IOjktHTN~}HJH`f03ѧ9/Ŝ\fύ_f|~54<vgKB9_^Q1wr/rn K,0+Eٯ63|`VK.֛f֛hxog]T,V%M^nuɹeK X;򹐎68ִB:MZnXxdp{_3^}C`w!uV,H2Lr|bf[_GUW7{{³C~ _~h]TXt2-zz)ez ȆdU;uxħRUbji{Ȧf*/fϛ`Uoc/&7v5^L]P4B,2-EjNgG).eyܴj )sIMERzUxhaaeeR(6S>uBýVmS:S*'NwL+ 5,S}Gĕ#M'UC_,\"["2C5W͑#oMu$|Uk,AJ-Ij.!1Dzq>ZVjjXB:.̧ T=ڎi؟_d«bk@uCOWM[wׅ`w msqqJNoO5` ^OxԄ}dmWovGyw,*4}E,]M ;W١MNU3 H9є8ӳ,_Xf6 mpAtqNv4eNbM,:# >!kHȲ(jTkO9'M.[՛qPfDb;(hs`tMuC X]q$rt) ~e6qҔ<-_Fď9_U-Lvn_f[&oLbar;$Ԕ=endstream endobj 241 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3839 >> stream xW XS׶>1sDDiDO{ZuEQ5DIg$YIY@I(D>Tmn{}Z~};@{޾oɗs^k_k[،`$ɘ[""Λ"*YldM#3n $ cd1}M{#8/ m|ll7ޕ퓝`mJΑ3pd쎍>#+L8/MCO-:,iHw9YfA{\w$\AM"g.EE8T.8 AUj*1\ZvxRZ-=8rs$M#֡ߖnDQ|%|dJdJ塂Gl[{C/[ko1]deiF098 bFmc2,\q"Ώf\\ct}|ȉoUB-.<u"`Z:SdX0,c1"Cڟc9L,2zZH[e@y'%>&ʘU eՂNl-+}/{ \I6M<~id Yt@;찠Y,Q}wNJb_7}%%@ํ;>p8٧8YA읈J *UMg,ݕgnO+Dk@~@ΙWDVWBh$26YHާvzj.8RHh!Sjb7cqM8FܒP! էB l(\ _B5J VGCzj0*>g05GY<67/rA0pd:869WѐkɇYg!{7VF 9'd!/VAX6F|Vw>%2q!X^_Bd!6b/X`c 9 j|t.E`8ņ 7ԥC05>[6Ù(a],FCmLN#Y=᲌l! VYgYa "N=,x0)_[4E'q8Z] ߳z7bg fF56Ŷyu  P V\%.wa@KRCScu[xr`.*n-Vc<2/z"p;ΝPA?BjGg-L {]mWd;" ŀfsN,Y*еhqѧja"AQFW[UMc)Lm;~!#=VZdiHXXx(%n*YMMX1$J~k2W =Z]"HӁ^w ѼqnBb=o2S\Axp;=tF].u:"//=SmG;`;ZM8K3f )^63&Ny^dq{ZH(YOoV d<d:K'cz`ebLzpeώh 21((9RM#\ }p>h hgTBP`ez_2]dy˯ 8yE!8y>Q]/wV(X~3aSz ߤM|\y5\ʹZo#jvvɏ3GH}^zph]Ԑݮ(cm7iTtBq$VhX2>Iуp}|=8Y,.yՊCϯmzx[ӑw)(omRT oko1M2 E_W_I-yE$dBԚ;Pu{z{MS<諆5" Dm>3KP]tZ_Z6Hֶ.OS\{3/I\&hzcsW|hق8~>CB`(.JK׿AU]{|TsVwX .+Q(ZS 44a.}YIimkW?Kp|!*'mEO'~W7aJc+*Ӆ_^ y0d&P2u ʡʱi-4tWT?qk4_]}[=Q%b3y!5`yo7[(ҵ5qK K_L*& TLx ۨ0 Dj'doAw٣@ QXa^vx],+>T4bAyZlRH s(~z uE;GąN0s%BGxuxpBw~5p-_tJJA"HBfI"v8(t/O$y(ŕjs3vtӻ!3cmi r9ޑ C4$v AS r&5-""!`f 1GS*3C^th a l2Db{LfC(f[Hh2L}G#B8~4/Aendstream endobj 242 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 8803 >> stream xzxWٚ ddz{7ؘjpݖlIW{llclz/'@H$@hI( y#w6ݰ3H{YJ X\e3~h[W`/\_ׯ(LQh]ݠ7j莜{Pf~;='7qh{s1˝\<}C=wZ;^>fվŝ|}]=ܬ}ݬ׹n[dkg~1:z9Qe-_8pIe!CV9 wYc;vZa| ʉ&23>mИ edQm-3q/KQ(j:5ZC͠Qk-5Ra=5ZO6P#|jZ@6S 1j5ZLP㩥j5ZNMVPj5ZMM,(%^MR@YQ}T?JDP,PN#eMu:S3.7ՕfS(_;ՃG)R`ʌ ^ :P,$,4bc.2,aʎ;:tӢN;+LUqnwtc[=,YĊzM, K]jOuW}龱} K;+{EQf=d:@07u!<fhz?l0#)h*0966.^&siR*="AH.-?J7D٫/FzSBhe9I w車_^2\JoRrdCf տ8sR-߻ʼ5`((7 Mz-CRC}.E=55VF .\tV^>> NJc%d%e@ k#{^i(N,E+QPC|4+j"*2u)hr 8AKG83Hv֞$ ]գFCi)>hx0K,yV|2|<{f[:xnir]%zqD d2}+Yy*x0RjYC$nzY9'Ya 9kef/,ur7N/vrhw=G`%DQן#1;-C`=xvMK Pp@åppʼ+bi/0ML71 K2t$1 jUjH9iwRm(? y?r?J񆷩n7 R DVf5ʐ=ѧ >I+Ө`iQp[h%Y#EMc0=8:6칀!%2m4()] х.ONvZ} 9=^ ї(д= [s>"4hZ#0}s! inKE||5a߆> s\rx=l0:.$̀7lb72`gop`L0W?D4|_7OZW͓:ooDSI4Ҡ3M([ c㹄Ƭ[,s̀D^#($"4*`c`S.?_Cl|Go)(ƫqRhu)O!aGx$ʮ1x؋_kAeXg|KE9z؈ᝇ4`)n~HZ{χ5ط .Zl; rdH})m"NFi"Tt`+,)@ObE|$舥xjA$p{wlήNvKsSWtuHe5Bj.JRAl LOVV9C)M7ץv*ь>n>=\fMu?]U2,# 1;U).fZp:.%As aäQS M(w#a PC?d+hlVT{/H0x '"ۛ_W|G%LȗtcJRCA܀>E F2k}HߠPـu:?|Mr#oj~' E GexmeɇO.;ZmPN,F9PuO=Le{;lLY}GR>O}XV7((梅\*7'HIjPgAīqE.XU4B`XKB0Ekr\,mifY`= 3{dBMl2&εub &+n=bUR8)jsl@7TEwzd$JrS^K2:} r9.M%Ѧ꥿9U.,uDHsHpGQ#z[M<1\Cə;zmB+`*hhF 3}2ڭYe`1AFoT.R3`lg.]=p1+Rto酼odfԂ6;;|MO#)v<LA}GR8y^+=)[IPHtiZCd\\B"OHэV\@#u@piZ|f ZyPehw9Rrɑk!\Ty{-07楱[ް^![2b"$)V͒9WoiVYaĹҔ24~<,F}Hl@`eUo5RJ?7Xյ>j4CIPfJ23)]%4w޲ʅf5u]` E#YtnW@_jXR l|xF Ai(MvAp]+uLd9Ieh(7}$z+ܝV!MB?x\hMZHYWV$jSNoAm7ZK<ßȨ. +NJR,D,U 鼊(>:B@#ZҀ5|+$bŠ)z(`* Bc5tl9rs*.ZpԟdOZ%ކ'Bn",Ɋ%D< h擙u2gbЪݟi{{Fۧu*P~FFgԉط{sgJN )i?pˮ:ԑՃpH1V٠HFjSWm5>kB?"(#Rx)d;f$BFKfv+&@8oxAKq@HkZAIV$泱1VV痔 thQ ^!WMfB|#7$͢QD}R6ΜȊwa"4oWع ٞ;XVP,M|ٗbZ΅s$5;B+X1:9Yxv!D <+j.̂P7뢏obWՄ!Qb K}"WHWFAeu1M!.۴Ehy&,e u?r JJWHU`h/b+uEQ-oa\(mjj 侓5TVl<yzJGM#\ÌoˇG?L%a S1Xo(zh)Fњ)oHmI蟪KvA( $S#ZxNQTfj nigrX2Oja^|KHIqC-&.^ yMOEӹT)ђU۫x-:?xNI`*@~_xev;G6]b"xn>LK>{x֓(`yкy77(C{d0g~6ZoRG,ON4(^B{B_n| v@WXT^ᑠ-r0Ϙ._7\ ûr^2-jPPۍ"%w_9s3,sʕ;,9\p jN?_4И'@~V4GwWXzuܝxf96svê%c^ͭtXZ2-;u*ԉjcPmX2[qn'$2~%>=]ǿ@}\0)ßPn IZdm-;ͽP$^,cCx`!.-6ҭ@!sJ󍛗7,`K[$ys7Ls5;̢{js?|Jx/OCݕ =?ns6Gy[ep# MXO ܺ6^Ǐ=Q]h ߱wHBQ?)D2m,呰.718 piC屽uD,ƈ*3e>o|_ u\?6sn[? jof3kżĄ?P׈aa=N@oqï4"5XO4-3H3qI vӒ~a2;VOfƜSqG_<+nǒ+8nLKѨ-Od, ,mJvLLҬk,/c[<ԆB+'r6-C{%Ǜܞ0T *%x1{h$Caʼmt }h>h~RRlO0 -|(Jdxy/mA^IǿVn_w}l!7-ۃ"X"‚7DIaeB2(BL5|ƚ8;IED{htBU*5U^JM.r1I)Iisp'm*+x_>p 8'DD ڈBYxFGQI)/5F! ֛q˳IKѥE_B[F׶OJ0dT≀" 䴬G!'q! [nA g.s$_"̔tȱʕG& ̟hy~LVL<6dzqG*PU<*FP CaٲDeQxyTn\nAvN.fޣR:eXdCO: fԳ}Gm*]݇37p Aqh(jq-K a%%PǢZTC7ջhU tiliR "s}w*/D2*b vyy#X? Pz [zh&͞jgPՐ9w }?dcpkX$gw] jM3ϙxff {滸OF_ȄJOψ*T0\ΤIaD\}*{ ٜd"!F6sh-/[}̯EhIIu2[pBΦ}D')Y'@?#2Rt,\H<Ͼx7I{(㞐sD7%u_liz|1f07e|Ӝ3n?\KM´ 1K+Fzo> stream xyXW,cWP3K (*(JoRw)K{ ްˢF1MMݥ_ ܙs\D%Fl=ks>_laH#|CX?|)P4X ֻ8v|`2ᔮHd`YΘA~/2v26iloxc37zȠo/cG}NN֎;m]mxզm~4-칦(j3+YoylaC~NXnuvf/dEOX2q)+>k=3fLGmQbjHYQdʚBmSS)jeFVR3([j5EPk:jeNͥ,yzj>Z@YRP>R#)EPK1KOI15D-SCPjeB FP$T0J|cs[D^X"?$$C&|рʁV |7h/ 4PG5 0*`#WW3zTx F2zcԏ9Upg:/;#f;~ HRP&Ma0"y切t*?MDag *KPC 9K+rY<Vm-ODPU;k؜?eʳo ஺ `ؾQMO?+]3jj\KXW.^pl^7.q0o>LFk'˪SQVT۽G ƒ aB,c>n76cb,y|O %J]Fp7̕3J[05M?~]'7vJ~D޾I/r] -I89ڽ5/WuS%!ȷ!(5osXG<$J8VA } p jŃyz#f Hx-1U,M {E. #Oc96A7TIL+X*"o =!fl}%IVY.TK! Jz]>{QhyNvZ[Q50sj 4`CFV<5[Qsٶًݗ&*%|"XN]+vO.G%cE [*)AT?`Kw} *v m}?"x(C&y5 /\P92*E($ʰ㿀JQztta"x,4UTFIt|McAr]P$bD@B~˘$΋۴ɥ=E4У(J.QV?K.H`tV< -:/VZVq : {AwWN!B)P"Sy w"2,*nMQVrrYJAr>Fq+$p˒SQѡ$K-:MG[ k Eo@YR 6r@0@eIjHg>2shz$eSSo?^[_dz(x&|±-[._n;7hj-`R=(wPt<ر- s!1p./E@ƒMäl+$j~p)]pgwi|'0=$6~^W0.qז%O+dIBU_0쇞B ||ʢn1A RH$LϱK׷'l _Nؾw4CH~}bvM]˟]<_TNs%^;2CR޸-6urC\JdbBQ!QKov8Ivhm6H[55FAvԆet4 C)(0츈 4&oC̋:U\WWq2&1ŕyRrV6ȳ7/U? /&G':{J>޿\˰>o-U݊x Wqxu·=c"P7YFȳԽس.bW}~t:n,~%ݣ'7o*>GqRO;~irVYxPTx{x{WUThO 7-TgT U94`=X̡\Vp_c :Üo;{SrczDV{F-,]~Ru_捶ٻymZ~~_m񤒤&jl2̽gUTjo÷?={NX^JQ]3h}\:zSBSۧLο8? ؋gVOa ,~5_c5ìf\.Mfִ_F[--"$vmmߪ1GDO'YhO;9}"Kaۯ ~E?y6xBUAvZ, ~Ѯ+D.;9&˕P\R Qa(F1eٯ닿%PO9K/*zQ g*H"!+?.1OᕮNewՆ,Ĕ]Px}I|dۻ?~)zGF!{T쎮L=yd_~'j5ך~Z._٢dg:dMĄŒך$ *2 3x5EeS/Ɖ`ud͟|7 @hrxl )0I;Ј\ae.,M˥Uzރe$2n)OIL.MιԜ3xE!|endstream endobj 244 0 obj << /Filter /FlateDecode /Length 285 >> stream x]n0 w|_C=: QM`Nc]Th[Aچ h UU+6G6G4`}7 Րa`:"QTAS (tA!B"Bg1:؀lϱ`uEύXWɛ뙲z@Uendstream endobj 245 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3354 >> stream xWktSe!P7RA$*{Q3""Pjh=4-mIoIۤm~ϛ{k/)mKR.-wAdA9:9g-ϗ9_]99ʏ}>>syyB鞍Ra*eu¦̛qI/ٲog -!}n=?Aw!"pvUz bITGG}| tNt׉qkmjffKbjhw zw8*$t{]z->݇rq+N~%b}N_9} 25 + N`1 ݛN9\Oj[)]wͱ\ ٻ{؇~ק&Ft5sUݞghT 3 Ԩ -C7+ҭ6ϬZ)]Z" dUuhN}Hȷ6ݒpt`33:Z@0;զ*x:c:l7_n|HZt^] WxXRD0:Ng#!MM;،bgBw:8 `tp-T O4u 9㘚YHWԇ#v03뻢Hն-B D7FJNJT#6Q-)Q?1+Z# MdWgqbYM7TԖx،v+N?Wg^D :ycXAEMA7*%‘KA#ngtZ $KdꈝC6ЂN>N?@o9| ɣkXkZ{@hu43m7: uehA3 f|f45[Tсcbn{ H [b䴔'EKj4fy`@*3*'%A༄pF1sQg$gK_4k,T@V$sq+GRq zTz,ۛ?(QCx;7]Ti!+q S bKtE B=#!㊈T\U|Nzء>j1 m6d™xOWSe []@q!qf̾g!ffKnU]OOn{ggުY7J/L[aCKof s~SL>݉ ~@4u!GOsIcFG'cΝ)KmsIuymr=N/" x3\H0[s:6JvUgL+AX°xGЂחoSo/[ JKFu2V}^Wu"֔Zڱw杺w?w>砹.sѕy&.446(B-D2A϶wj{]8=|8Z 8LT(\VޯaE'(QA"57ћ',jʳs%=  {t.SH$b2(K&(!!B-9rsYZ1pFT @Z.f+غ{h?ۋm 5Jj+6?揠C{:̸ҵ* [NͲYM`cfE݂'3iatPש%YdiYlʪ 2Hr IS{>hKi:kku8h‚ #~:`1n~װ GULTƝ6-?cڂEoI/somfJS&Y C_"v8]1O99ENN8a>]Q/oIb0>jݱmgyI%+W5 8״2ؚ(]eR$ Fɦf_7-='BqŸu%v6/ hC53V06BrH}{;;h\ߧo;8߃s۸tܩɽThwpSz{do/S)Daj@jcPVh.Z*56YժZ܊y3/;=4|@s63.`#6Nrû'|*Zѣe`oAd0쉟.?|N8kFT!e|Ã8L^اjW ]+bvo׻^lYp9߻t%>xrO[*-%@)>s9̄{];#05]rhUiQ+5bh6n1 uxV3c7LxrHR!}@UFH>v֎'=xamA+؜?Ӂ;y^PfbQ:T3ZHdVUfk^nGlo}RlPKxyͧGѽkOj*Fc N?ȍUG#Ω?OU]ֹw`XV̲$eU<Ɛlv柁h~Wvtڊ6ZKFU/z%Ipۊtn_*FMyԁT`Sk Ho,pj:}좢 7K;?TV [/A$J~yuBq|^t8!'aR0!G+endstream endobj 246 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 668 >> stream x]_HSqwwnSLc/,gi/14eNzӦNmwY:M$M̥0Z"5!XH "·]v#z(p8 I%Z3w4n[AȣcACKiP鼦|ȶ 4({l,tu\=)N'25j[k`mlV^pNanc6bob* lP!V\PxҀPJGHL< IEQ2Qq<:< "H wn ݤWG| /φpŀuZVay7 3VB`DmO!4{D\-ԓ!5xO*q~V4lL}T aI "8Lǣ_{y5$alt/"LL@.BQvj,W[Sx8K:+r\7% ,"3ApJ8ǁ+:+taRwIJW"Md?ۓQvZƫπ$B"@b*sSw蜧dO;0f }mVF,+T1b;'bdƏL&CjX̜GDey< @`<> stream x]n0D )ڵ`/%E)*!؇}gVq= gR;e]n~-뭝uM׷Rnks|mŁ::~[g;>*ש~nc){gk:EG3`C1Ŝjv\@s`'B_B;IaR!$Jj. }\ &ɍc$$7J4JrbG؛ l.} P} xfafA^̂2⥄eKF#aGn;v$F#aG);Rsk2x7 D@ʐ!!C*C*{޶7yijendstream endobj 248 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5908 >> stream xXwteEBHX@BK҉^[-Y4ҕF#i,ٲ- $Be]X`dg}}c1g{'"hΚk+y !+ ,5׉ ꓮ#XuߝIπb>ԵלJa&1M$RX1ZY?ҶDY+Ow9>(e2e邔U{+楤eZvAcŕb^ʼ⢔=Y))gmMٴ SoX)u- ,yzfV<=$7='0_)H/ܓURWP\<,DN-E[>\RQjRXVjN{ _>cWJH#u"b1@L#6[m6b>AN紴LlK=_.!0RwV?nxQ2zZf>J7 @`|!mp*.U:eu^M*XHkG]Tȱ> #|BIf2{"nuD?(xRZK k WUzMZrgoыf5_%JbhAׁZaAAw4y_ $0* MPim1+C֠JE;p8e^aүfOTekRKWh%&f2˶oY𓵁nbT? 0#.?D;z{!TEӯ \ T֦IYl fZ@Cg'wJޠ">\%b&ʒ%2^S_˺BxΰZ`ddwۘld-@メ$|OUV8L{RzxdG`ggwyNK/J!1t8,ע^ ?mGNf>;֘=2RW߂,4dEE '@Bx:Xh f>BsOHt%Hّ \NOG[mmuX; `snjjp2 Ct"gU $_%,Ur;\BT|(ɸڌ"Uq*3'%Lϛ't˳k_98G 6Y*e>{ZFbG4 sALVj0/{ >5`]ggqpQ@Qfm i=,W礆Qm4 xP)#ڝ@OF3:RBf3ifjpP0f1Gr%.VCC;(-`5+iA:֪˴LgPr@X" "񬇈oŒBu7f<9%I[=N6ѭ @-赻u$jm.a͏yѢSrk }`lupsIbn=ci#胻^ ʅ N$.C:OF#|Ykސ:\;$'x-ʻ6ɲR)B/$њ7ng~K#ZIߙ܇n"")LΤVi<6'/-*PevxBME}J38*)x͍wJ>hk26X;1mPeUO ׌\?K9,$y&LɑGt;\sTiHYV^ZQ˙|Z2P 9dcRU{WbQ0Ě~xoYM =p8㛃M@z°LWbTOd.H##h0z$x/z9~۳(xt9~S%u2|7P>mK)쀼[Jn~ssh KV_ë5JCb;RcU JЂno.,>x5 EWоNW"em_ zCeb fdwZ(\ZWhЙ֑7\8 ~􃪈ħ=^˫{;RkIP| ]#″$t2nCETd&ѨV 5,cs!U}d- hI *8nhVJ,/ǂYՃÆ݃s6}~d4Ccm j_U[~dj0o}f*{~7İk3^o3W۟[iFt]sMQ3AGhk6,vĄfVT/-ң>>9Bg&Uzj6XIw +,GVlPs=ӡ~q;{~iθ^vh{UU/W|E0sQMm]^}KQXQ_g6UPC] e y.顇m>TcUۘD֑ C.47R?1{ `e.fd&ʈoWo(DmX[NX9r}(uX+]X)w>6Kr úЈyJ辨(-/erVD-'@Xiz(^u/m R>o |{1Z6TUf37GꨎՒFSJP(HmS9pj @>\l6[M6KBm7a|(}8ڧ޼O| <3乌Q+z@|ZJlZuFT 7b,O |u/faʥX^j}}ag3D;/[q/V|lŽ869;}&hKkGtS޽xeT^VfFoguEqaü[ +FgX/cR3NvT!Db57*QjUU*ֺB 69Fk" cղ rvDT>ă$#|/{1z|HQ\TT^^T\ܑv;!lQh|Y(NLd zzvDu}:݇D1 Na]M6;l[yw}<7orٳߍh S4F=렜|>%`ps;BSS+83N9MGU9k,8w9|z^XXKZ h:~C{ 4g5Hh$QȘJ?ךk{8Au]p>E<л aZE4+\sfOGc.&ˠ2 ԩ|^ vv&g~\i;ђ L;kc`'sdM^$< 醓+9fWܬU"VK;t|²%UJbi@B)匞'G5vG,e-{ 7LBFgFE?,F @x^[eKn9eNA_g.~&1wMMG1R4׋m`Ʃ!-ȚN h nD,":6dZ* xC!1a~H. Ux h2.ʅwynЍ1A kq&=UPrz~-JC8-ܓ|d,9kdja¤ז|`BiE1B;**hlj$,' 5jwW|8r;~@a8_ :j *0큥R+0`!.cY {ܑǻW`zޣ%vlsa4T`=SMϨPa49:ud5u?1} L;Xw:-.> stream x]= wN R)bI  `""d Nҡóa?̆2:(GNGX fHPmU z@p @o rOfR^( *#8a2dDVLg@e *ˏ5埒H#ga:]|(.Ev*^wendstream endobj 250 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1691 >> stream xuUkl^5puI/^`8A۴$Y #`*r!7;p'ͅ Z6U=4Z" H 1֎hW!ƪ!9ǁBs>>g&(c왭V{CJ[yU;K*JGLrxR2^NYDЉSIs?Β3[x j!t o BDpC/Kdm`Y YkdWזM+/_ʿ_46erW/7Y+L9iimUyܴTX\f(1U,ŻM;7iڱ=?oҴ~0( KKŕ%GŃQz9ɪtOumUQ>{Qzx 6cSI@[݁V;i/>d\<$}R8I{T) ӛ*{͞8oV^.07<|ungdd'ٛ>/̏߻R0 ,U"EY_ſ*PU?VmWTA^}Ŭ˂t7w k"z驟Q$EEM}q4Z/ ߉Q4ޠ/xNt/CFZv op ^y0[<^|` 462lݶAU4P@(IB,a 6Wӭ{qmo7߉gV= osi5z fLY2wwQ'8|vHw.}Fˀئh ]D +Ip۠]CO<n/P\Ot?\MNs7t841bXe!2O9D^Lߴ7,T;X>4Iɲȼm}HRVc|SEI9̛! %W|gE.`aH"[ݻx&g%G@I|NGݬ|⚈4cCṈ(K}x"4($_'H5FÃ}M/Jez<.o\T;s_^/tpfE3dt@?i\A. ^cx"%&&ZuT6f6Jw_2'#I6Q x*mמUcj0,&mq:.hK>SUu}ٚx2w>a+Z04[֐ V]?\3:[$G!7Gs4*v8_M%zcccp{> stream x]kLuo t uw޾ Xets ݖ e !ZA1m@dRFQ7pH@SCpNb$(˂$ 9-t~ٗ<χs9!^"0L`\|P]r(J~>A0z|>D(syE˟Ѧ)$_KML x:FF<9Q#>ėH /@rfJ$# '8F9~ڥUөkJ:xE^S7af6ipZOZt6:7V6n]f(%MeǠ X'cnbqۯ`mt 8\Xc}gohw M>}HtB^uup=.yWe*V`X~Nܿj_ݥK<3}OV0I:ezz?ڭR\o4hc@f@mk&K+Z> s0zk}oA7 NM ;ns2Nqw*U $s]*vOn&1n;D*zk*Ie) vR$]v1Sń]yȠtAJhk27e1@ `{yjXz&ӽhpR3(϶wBS=x-JlhlC5T7ZT:PFQZQ lsuCH}XrX9M⚑qEM>(=`U9I z(9:'}*( J{xu0pՅ<)E̻E?~d@oJ컧Rw)!bLqF YXE~螹OK.MImhƒk}uFlnmfLh3dmڬVl!/endstream endobj 252 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1578 >> stream x}}l|}$!}Y&[8{@(k/-%eMP';%N|w$ pTZ v/iGEXiԩbƤ=<%Ti#=||?HHC$Yq&kgnu֬Zs囤RQPcyx q#/PFAYѹ*̝;kۉE$bә\ttWZfJk|ڸ޴cm1lWo6>nŸn3vw]F{)6-u[غQ+{.Wlr=nl5m.bV9m>ixٵ[Ck.A Dh'&q2B%2FD(RI)jHש0bM.-W\zUWW*w__>q-XY0 #j&ŅO /:{@Oɵ[۞p!.̇-5`7Oc?]:1m ;/46:] >B㹷zz άtlYd6;ɔ+!SfD Ҁ ǻNs? K4^3ai7^xVF%=c:x2٣^QQ- ޠwݨRlTj,3:x,]zz$ aZlvڪ4G5G?[KØ>u:> c[ }J}H-8rnY 5._nOu4V!{`='*d#l@ٙ HG%Z+"_2dX˸U eAd̥CUXUH).g\<ĉ6W+eJAYi&H) G2XRG P j=Mendstream endobj 253 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3708 >> stream xW TSW>!hŌfsvQǷ@u7~@ǟw3A3V۔[5!1)9e'?8I<]Wߒ|Ch….a rDͷɛaW\ሥ38=PRB3ӆ zJ]FяTt0+M<43`YJ`nq_[9 TЛzH@*eOXO?@U7>#ppW.o&".^Uj]b^lOصo7 I}n;.lT0=EҎI;I|g6Y19:OLI&8|uUd{k$)RJlཽ-և<>7-7qd3n7w&X)R XX9׵z[W%- Xio)D̕0S p , s3 mO։2,YEиl{Ȩ=v M5&1зP_=NUe Wr:МjЁW_h(.b'0Kq i6g-sDTA‹n?nd??[[SPp>Y\=Mԭ3j Ye4yLMaz @]Ver_ٱKm6]jp}<1 R9tC?V*+4S@gZ Qsg6R:qtV]\y?$փ%J^v Y|jJnS Vp]*@J*Zs]AJ[с Nס&wM ֟O_d`zעK.fnqxsssMrj @񂙅qyQ?->Zm?]#P1a<c34B̎4w-9-4!tȂLoFpzڞt$\ݭ^B ,|;xs_CM)L k(QF$f2ˎX#uw?Ǭqe+"+AcGK`l\oBMyo%*>JkԽ(ajfGGiΤ=f!*P/Db.eH<dVR)Q/VotվýXj{\b02by*c9:on ʖz/ <{6v[9s%NiNl Jp`+.ɜ(ij;La$o-\mqQ1<.JreJJr0%#=a^^vb{hK >/~o<Ő :sU=Ԓ2gVA$!`o}(U"*Rg|s{"..FB忂i QJ O#JeA{{Ltq4n" g=Pp4W^mC~EQu鄦2sŝ/tѣ_{J-N@1`9f=}7䖋D=\yN|k(GWƞG?h sqGWm1(7骵>h> stream xy\S׶ODczNZJU:8k8) !H,IZ[pU,V >m{{nm}?||>k~k׊p#č6U}ݙpL{'@*9l [9G^iCerlMsd:0X6Kɕ2ulGmyo۲sv9sptI *pmDdN5mT*w{ӗ={\B,!ӉmvbE&+*bE!Vkob-XOl$6En Gb<1Hĉ#4$6v EcX>'o'q;~ ~6ebT6$sI^84S=,24Ey)w3K|S~{.^;h &dP7I_PbnOr  ^Ź>| ĵ!oIHq$f[GS %Ujj* { ;|ADUFP`[P /s>lk]e(&i 3 gYႿiHݻ%kO)e$7Puuz\`h%τ$IM.YbK[m65CkQ[oZ`Ņ)T0j1%n JYF]V@ OEFCPdrRr:-/ e ~cS, 88HО:*X ľV鍪rr>ɨ/l8mV`wCqP#g:ݹ7) ׂ3 =DF,צVf8g-04 RLChƁiG[ ?1Ҡ9Y4Zw1uyۗy gpijOgtd[>$VLAێƶoO)9pczs8UF72 |VqRj0חnXަ4$ r40&B2127ߞ6Du%=o\hK0@iCh`($ƒZ4c93@iH_ }dqzBu2[Jf_f$Q#e @4FW)Q.>Ңls%hkeηk3) IIk1EMt @tu/$_`~U@PSPO1VlFSE~)8壬s/̼evHZt94'5W% #? y-^c6 T53rQ.-=؆/~zյ/}1}LJeN##h}`-XO [* E#>MD[gcJ]xO Y@<|i^`ήȝ\]iXyy"$r?m( );\4TIj,(SK\K|m 8)ϯ=0/nUx iQi"e+InGKÆ:4$(pMJW֗2h"${|h8Թ gϙ> b.Ezw74p^VmL;|.QF: >(Lu  lg"[Mgٽ2I)ODspehmxssmm3=|-XaKp-tx!lۤ^M7d\w)Q* o^}\l E#Sa~f~g8|ќW&LA9ʺo6z lgѸCMi,3}ptniє=V;H fMl3Ǎ]X׎C-pgOn=uz +}z 8f: 1DEG7jJ@4G" b~UhpS HݮSc2Gp{nQ0}s\QFjQObr}CuwTҍ*wQiSWԊA_@AMW;ۮ|~'fr'} ]'2ʀ ddT N+1H kQom,x~sKo%:gw~pУylíҀx/>\mi8vίnD dUz:LM E\"F "/"3/7+"w/!*~h76V'DбpSE'd"1`^nOÝq Ogmꀀ&JNf!kfK,14ˡ+Gd\וQdYWI>Py㤇߻{Ϟ;P_U.|L*q6hG#  Y?pΜ6RLQ ژHCDqJY2Þ{bA4(zhhw5c1h.3~֧!: iMYB9!~)B'%'q CzC%UJTYgA)H4䛌 O:>[\eVGzx:Td:94X4 endstream endobj 255 0 obj << /Filter /FlateDecode /Length 6387 >> stream x\o$m~{0kRY }bn ?J;iwCVbh`SU]"?~dU_wnw_]<^ݛ^yuآ]۷S u{a/5/u&Va9W߆PtT"]I8۷WzW@Ǜt)]yд '`dT;O|q TqOxxsQkRMk =ԝnc=\!|he oϡ4sQm]iis 335TjތݥpK%%T.B}3pt=N?.|B]!P%Ľ _]Fk.}24ا.(.Ksqw$gQv8ۗ.@˔ǐ!zؓ1dY{1BDj킆IPMsԗ#@"?kr A"xwkC#qiXIPCŢYS[4&7s} C9 KğhEm}I pM~ǥh}EgO{s`ե\ v0t <\uU7TxP#t֍!|SA mW\lTe`E&NVA Xek]5KE(~ܶki<*>w<<\O//!H,cbh/+_#txvɕh'npIͱ2i?r=FOηfsu.SρzK;f@Gߤ~6։fKZeuø>%oδNM-ij# 662Em3'HʻZ:q M5xĆ-d tG?ai KY'ՕHձ.ϵ̆)>d|B1!ꗻ>eBU+.228 & 9_̾>CW[p9 @< P /O/$g(+Uuqq-k#؟uup ʣ@`VgGl` jK` Eg_~4Ec` K]??~T6WOsy>("A(w6P`ߓ@E@$§f H@#P"DZ 2 IH8PGHM*(""Df @((RC])P@(PتFH-@ 6#P@dԂ,!^r)*XH7nsHDa"ٲąlMH!)?(/H)P KNR o.pR@<# A.HRtR 8 ܄O1, @H<~)5%q|6P(0(Rt` 30paL5C2Hd q0TT3H NA Ф' RdC_ 5H F^IAV I0(- yAged~ܫ0u0dL0H `mP O#vS`-0h#pP M LH5:SB4ͰBPi{f(H6}lR ђdL!DBM S&1J(Dg A:S4SvA)DBB4IB)?b AR(kxQ-"Q(Ն /q(̣(0>P Ga%vGir(4QHh]ѺD3q <( $Q}.$(6>WuT!xUq3xs?7uUpS Bm7}k٤h5r|̓CA<;ݶj$LN7)uA$dׄs5/m%X$zH,eI,V%8cq6~N58"!Mc.`dXMn-XAcVMQ`MQuM5XM L1G6m9KEBcb$>/s4*L#c I Wc`HP1p==LT1hٛc`N%Jt`(!o%%KHc(ZBd(ZQJB3矙k-a[DAf0#h9YDZ+f45Ak`0A = $:qJ.8yhCpĴIBd$h ZzP[Vflw3AK Z!b5FqЊ&)np)m'[IЊΘQH.C_ Jp?SPt-^ ~^O4͐ 9xeBBږBy=Z&a!˶&p'2@4!!`)@ڦ@ڦ@%!i-M0dYuGՂ f-z kAoKRS]b*^u^'+l+l+VҸY/ϭ1 47y f$nlO"P=%MAϡqdt{HzLW{i~=U=hQ{E[_er=%P{Dd RUsQcwRj1\]ϐq/9=ֻ$$=@)\B M` -6oC%$y3 sGϒpe>z&mz Xyz̳!H22@N.[^rVkYV l:9 [t,ldUNb%igNdc'LP#I2$#'-Ɉd$)摌T={ۓDy$d9$#M_/dM2%)G2.!ɈɈ_dDT&#IFVɈdm@hB#HTZHLIF7Q P &#m(ֳ, |ͺ`fS%HXϢd$dD1dd}׿o&}7Q49_0[[;^Pچ_/[ۨ`mk7O7+fJZԟ~{F;< *#+䔦->ҫw!zrp3_?C[O׏||{@Lj^>\_9W`9</oo<>qVvBmH5ܬT~OO~ywxz+rzj.'_<">G´:Nc&Lp<=\/~=y?έxSp,+ҽ}!g^M$!a%vrucńUaM:Tv g=:U \]d ) h~;O# .6a襽D:>N>~Og^yu~|;df<2Z2>.I+-^w+*.үx>opx/ePR_wz+4tCn2]Ǹjl{Yɸ }D h~V=N34 ^MEg&rEfALRGk~Ҥ$o6 [\@ZX:t9Aǡt9Њcg.o^OGJm6=w^^^tTʟ~y`*f<$w| 8>t﷡9*}. IFL}h8ÏF!Vy@Ŕ8S^(7ws)!Ly [,:HalD&O;}Mk\T}`2z a6]{C-!ț?0Z|o:2O/w p'Bayo_w:XS5x:b7 zMT/n` DD~ dO.^ӷ$k.ˎ=9~qO#Nn|648:MQ?^?|~a tN3w%_?!\tfsz:? !>?_c1}]aOUY iPu~UJf('SUNkv|v  1JvDg\D g*ecZO.w;ֳb ;G`UvP;4;2 Uendstream endobj 256 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3261 >> stream xViT׶D;q"C3<& :$CFQQ8U(ŀHbtClj.i{!Y]ݵϷm2C4mꟚUZdsifh#A8gxpTnF!3 239fckN=`DJBӋ;DG5{ﵹEyi J"(|R3r05kmnvjNAHFȤ?()gw:Uo~¤SBRׄgDffewqU.XXxY)* fPL*"(*VR^T,Mͥ|yr|)?j>OP ʂɔ@M,)JYQ(5:IRI3),eBB|Iw ;sLI䝉Iq!L6YF¸3Ye37;wn|ͦ3L6=`8s\3`dhV g#-;=zaw%], ep[z99HGTF{b8K/tРq\mV`85#/7z)xbӼNթ)Ј^2("!N]XfeYѡiv"lV9VϹ/W/B47-cSNvhp;L' BmyGqF]cI1ﵖ| # &. q`gr9"2S,?ǃ[8Hxv{)Dž,uv 0Vw15t^K9@ 2d8X1wւ Y @;p;oƲXS[??qZϰ~M迵 ,) '$'جXO==,:k ej1>BI],;q,7{λ6(fVgƻs| |@jh 0Cư]1wk%bh.'2_r L̖wmaB*6Uʶ畜+o =S{[>bw\v9GQUݕm.D풙ÙcG{I `b<'r]]!kgskI1Ҷ!Xc ,Zz`OK~X8E,[YVR$]+V/ӉN;G HCHˤs`p ѝ\BL:rI_]/ 9a~XY&ݖJcթ.=6V-I+n*"sKȺDi ؍&W' no]{9l~Z8 #kq L=pBAy{*rr|+#l - B:ocV8Q:Ȍ5J-wQ\'"J1-u!rXlP <rsRp{\&GW)ft7a'63V  N& _|SiuAl laOټ$9EuDK{j}DzX;t^DLI"H MY$dHwq9Y"@l\0ݰ`sɖZ9!$aBΟSȌCc#(I=c$F:FoIߎ@I`?:,r\,s 2R߄4VpN\v {"iS\9 a k'QjG޻g7ZJrʯݐ#&hYtQe |Cf[pG{L_ډg ,Mkab]}90a2k|%o#:ݤĊk̻bS̵lEm:>j+jZ\+RVC`P' p,]' G}?n!(is?UرI-+/ڗp& 9sU8f!oDHZ.&Ѓ#PC&l{R-pC]t^Q/Po>=ܻO -T:,S]F̓C@>aR &n Cn(Hv RJM ҢW/Ui!lu8WMu-Ϭ@ÖײrvC=#~<f'8hT<'IҶ^ !,zm_\˒?a{nik>/_o\H 0ފg dYI~U(aGACv)4I)n8-’ M>aɀDܭ coWmx8כ?Dv~cRuRo|Ol;`߇u'g*߯R:GE9;&SÙģ`֓gLK;5 )15{?TS~q]W?,J)o"IMo{c[1#x<?pym8iiэ#w8V0ab SOKu7"ES̰ ݅}k]9{A1%MޒZ^qR6Zh. "?vL!wJM \aK{\YQ֜E\ =u1Rku5+ߨ8nӆΡK6pYkHrؘFR?1x3 1AC(f$a F$eX{,Atur4[> stream x׽1~b;p i . pő9t ̮Wp>^`}\z}{xZ?Fondsy'քuZJ |pJkN%#\aӂ쟗]cYheM/ " re9XxB 1 Ĩ(e0TH9ŁqZbW W@4rS4ieu>QXB+C.^js p0qzoj 0@jէ׀KN).,p,b7̱EuCfHq`\Ic@ ҬJcֈeGJ)<+6^=I)HR!}ětKgB m6ChE)Ɩ@5XݹF$ui$}&i!15%]ikZsY( &S%8H Wi ;+SiTtT7$OL „XAu"Iy̶A d6mPҷl6ڡ &^8H~ 9јoZx"fo8۬E,ӗ.]8veS^.Z>˗ endstream endobj 258 0 obj << /Filter /FlateDecode /Length 2920 >> stream xZo#{ߊBH [YPiR){l:iu ?vIdbpf83fw_4Lv|rw$YMzO|0 h8Wjbo]?7i^vzj#䢁nUz->b}z˶{d0c:HҰ* ^ NJ6Ь2G$tyc7~q[OCEHcE{.Vk6dyQZ>Y]*X(-v;S4`ko]O_ewچS9ic$c*J$~f+J68_C9Q1E>nb]}8C7N'кXnjkUcuՄfG[юC9 L[4azF/C}K.d`Q;$8\\&|߮3i}hfz':eq+' )ܣ! eEKݶe&?Ը)e.09uћyzٙ.{bd[8́_ʡ%ffmհE NBhJAu30nU!SEYEltg5]]MKR~owy)f9zǴ!SGXCja_ϓ|-1FHϨzJJc?D5&ŘP-YTb`eilG0JbfcaYa1сikn% )j1񟩓dG1>[3~Hn1Lv33 dw .e'A5E'wFIR, ci)XɊ0 uv&q뮺p$ <0nіhiW7@xþ*(hYMnfE&C ٕ+MJ Qk+ܔПB" 0L>~]x!5fu4Vz̖PH/(ңM\$XB7R77c#òyOc0Rc#B:,Je*A4 BY0.'VnvܗPZ/n?Aف@h"vh!<ň{#en4Z◣&CqQn@Ǒlla&AK 1ck"˿wҘukնB[F<]c.wXFhڟc#EA 7\}zsa[g ʈU%SJ k1OLXi4VXT[Xo}d<7gF}gπn d5q2~-9 Mj4 S0r9OXy]Ŝ?1m& Y,rF5ۮψ%cB+9#":4Q"dcXn+߼01֠ `)ؽ_̢(E}mϱ0w @ YZQ2ǖ%FMw8ܪVodY jع DmDz!ԏz6&tevSt Gz+AA/y&d0clu~6lf]S04"}dmT Y6 2H9N"i(CHmfY,\1I}%֥)7KUվs?P?-MlCam!"oV+`?7GS!Q&墯AZO$LANm5x5'<]"C1]b,9]Y[4aV>!qaꘗLʗWe[߅U +Rfg퇅JfYW ٓ!qIfq5 `(Grh' hOendstream endobj 259 0 obj << /Filter /FlateDecode /Length 10173 >> stream x}II=Nan!#`<0͠՘̡;؇,2kra%jz-$RWC"={m?w3q~?{ۿy[ov?~/H"e߉/n=_]=>?> !5.W aiytsqI⩤Zr}{V|p1-,~"zBMy#;qպ\͖<>-oT.wwIZa{_w]\'&pW;Y|Ny鏧7Q>׺>JݻO7(o6:-]2S#[@?Vܗ΅CaLon/^m]\\ߠ>//Fbݿ~>}Kn]Nm4\'?LeXδCp<`tt.EvUzywW:D8TH],.LOiNw wLw훇O/F?҇mf<,z8_Wwvѩ#]SP *t:%dtC%CLq^≠cDY -b4v_BwBh lBAB n &ev2zy 0q[% =҅z3NwUR~ I*@wR$yR(eQt1:^bAbD/$]#_3angjiӦu+zXiN̿;``<YbPڱ<~4[a2za |HMfBp= #z!<$t1 ̈V&C]RMQF$B z;'ZKLH<&ZdlpF`$r&EA.R)dI" 4K )x*E)ZӓH)oTSԴ`WؿZũ M\tRqU)&lE2ZKY=@ ypYjMD116tRdzOYE*н':Btԫؖq莳4J)DJ9НRH ,Tf>%Ԇ )ҔBpoZS\@(8urf]U-)'l4Lh2(,ZUyr& yFҡE0wе Im.NXf)I&i@CAԵQPcPn"i>,V.49X=g&UPSk̍A1k8(AfcC61:ơ%lU(1N2͟New{,c j V Y;IWMD^$Kw@8Hp,Bj& u"-vj gmsAp+91H"$]DDk}M:qH3f-Ƿ3`k Z4Xn[x Id8>@L,$jJZwOsMm8|)YTqZ4ly5%!;d>+zKC^J2DshUer q&"6\%]Tzq:{@F+44JE5f<TH5 ioel\Mu]MlH7ej&_1ϝ#8.J)*~BcԇZtU&4Vw Mxq1m%OCd̈@Mm ZtQ2M21Dm rG@D&f?Dgh2qGB!S(H3 Kqh" !Z;G@2ꀌEMf@F D*#R !@- B!HQyȐaA[0)ydm&x&UZXO8"EwQYYEO8b`Ytj'N,r0ΉpQѪPgl=. k8Kt&\#:KN&jZ*jnriV7ȬB*5௴b )4SL5 6qhŦ :c)4A;.hzJhzM8-cW@f9"E#Rnڡ ,:!5c7"ZgFyb9a P(FsSr#R474@8c47͈vHkchj͠*d \RsDVmnmzCBI06+ ȉ Kqm ܢ!y9"E32En43r̴Ѝ̉,fFd4 h%:Gp<7̔Tp<ܘN3ɳM4p=ܔOɳM4pAknN1 ZpsJMf:Rj 4ܘQ3M5p?ܘQ3M5p?ܘQ3M5p?ܘQ3M5p?ܘQ3M5p?ܐQkNg2j$inΨ YGoC:M&:ri4wq۔Lئڦ\6͜u6i#)&f4B5Mu6e qli=`F6$ qlDi=@F6 qli=րF6$ qliC`1Zˠ@|وφ3ΗlH<|φ3ΘDوІ 4Ι' 9iKgCM'th e#*ٳʼ\َɆA2Ε'$㱖930yYb&ؐ73 Y i3a$Qؐ539 I3`"ؐ33eu6 :/K5eu5 xqvl]=]`gF5 vqrlD]=[@1א,3eTwse pyAxkH 넵,OրVQq֐&3e2 eu~2pTY(3bo7>FKPE' Fh('P &JCChe0㴳GW(~y?p"')#бsgp~hquHڏ>&J(‹zϷnGtplic`B3dm:Z"E%};figpK6_Qpo:ҍAdBvJ5σU! >1!Vi6d/39Ӟ #% r,k> E`h]HVq7ùT؟ئ] @y`Bե$E^򤭤X?ޝiS|u!!ޭ\c3)vi3Qtx?Y-s!qAc 7&n9 hջ7݇aQEizpSmݎ9ldAB k~8.o;J/0JX,->Nc20| $,J0C\v\6gʑ mm椊cy9֩ Р}7 FӐ :$E^ChhX&aQng[z6 #4:3x2h}Xi u .,a]н8Gjif!44, (\is% t -Z&Wf7T;o-->NΡ;H9ChhX&aQng[;~-* t?XGf Fh4Nw >Ea-n0C\vͪo<PyohWh]l Q P6Zh8:;Yi\}M- (‹zpmݎ&ܫ$yKJx-AMC,:؂#i!sPx}&!nhSLUlTl34 (Dό#pEr<ۑL!PN绶l ic3 qjOKQurB'}NZ(~C)~ة/d7yc XhP8>dӮ{r_Ď9#-b #/̏q6⾟3x(H*hs{Wr4%Lr*lgH(&>q'Fh{ Dq#)Ю.IfI[Zn4y(GЪ`,m }/|g٥EVɘ\fN.Q1Zn9pj Z'#k= c}@(dȔM8qWFADhŧsMήRG9?* '|=b)j۪ *D87Bv9w޴`Iobs+WrpT^nzQi0:UpS!G ;$Y JSPNĝZ)l&!nhŧsήRTӠeU&sla+2O=*6:LHYS`5\f-QYr{cר<6Qi wLu( ʠn4?:q3 qsjOK{Upzr^z/7t;{@ 2y""ǯv'i8tN֙ujOTp|#[/xV;2 8,r(yV7:m*o u8 w0{-T{^*tׯtFSZ}fl~| l y3 yOsޮvcI1 YS&1xU(qr6vdIw-T{]Z茪sYl:kD=٢O^])U W7{6{}*dHvpuFd`I[R9|n3Q>╕F˻({Zn\iQ>Û;~`ƅyq"/Z ~]¾BUg$Ve|d {)oAwjs>g3SnCپ#.4CDbv'!y&!nbS9xiQ>&U_j:ФՀ"/:<-Cwv#Sqc[d=ʓ][l=sNA8=VchupS2V'g[}nL4dYo1ZnU]>x5~lOݺCn_^;g4"I~׋KVr;-nd,3 ..̑n4`'XKK៸ԟg?}]/߾Klsf  =ѷTo|`%g}#L?U=vm!L72v{ԧӡ"J"b{u<7m.rs%·^[n.HtprĊZ~p}3U'n JXvEƒa\^_=>>jqRܚ sYSfmʨo.w7cP/,W,ûw8]Q?L=ŊMFKeyG\=]bEFRMל%O]Ӎϛt nRnB$:'Szū^8@H|ޣƗ?L䃵=7fG8>/]=K__..#rkY^]TZ6=>r,Ѝ&ǝPC\< ^_|!Dsŗ-n5V[O7aèt@D:wUQ2xf/,:Zmlm_mlἽ?_ݿ8Eu9?b90\pB,؝BZ ~la"ϖop5W(B^ko~:-ɟZ#4{aU]w}ui^UKnpq|[gLÂB_dq). CUV[ $d&h"$I.v89gֆ0Y}BVW ˹'qozq1XiXj&eJq4^EHUXz {Dq $]Դ-mO4+Mp-#EN\KTMrޕEhXn^"*u;(j鑚<ɧHEz!i!$ʄG:}|KK$ -&0T&IO| ֘1I'lLޠ1$]=er^I2(֝IN-o1T#A&2X@ٛCz< u* F>>N0Mjv6_Q!1Z=T`~t0z{ qiolul( !-aЄm%( mts:}ͧ-+Ђnq}*6Sў}~DM]U;X~J*n+yJ|YoaWއ7_ SpoYo፺ hoE?t8t<^ݲҕıd__Tzǧ0O >B%؊~xܯ?߿{J\=?i:n޷\W!G3(CZC,˿=<H ѭK|syR51jR.x> stream xW XTW~EQ {cK g0B&6R?I6N6`-k˫Sma$LŐT" _{:e"}L.#SvDǸ7?!]\2+!%*VwKNP-.kl 0{|󋢨> פMMKʌˊݹiB8Hr6S;H͢`*VQۨ|j;KRPO'OM CYR/Eg[--[vVT~^D3LI+2.lXYnE xUv(;̯ Ǡss&qH}Do@^΀v:xk,GwHːBks &%xKG诀AO2j>o?$^RO bO+~XoG<ˇN- S&7l ,DGBh m$mh%h/a,"B[ؗ+KX@ Ws=sNm O@ix'^r=]tGY9U%S m \3 uwqe1=| }~=0M&%5PM~֝Z Nx$Deh%l$GW>.('2B[w`JSyLi" U߂Пf}4󇻝q_AO&!j8=0YW UU]ݗ?w% ^DhKŕR9=QI/UghgȊjKonn3vq⡿2nLqxȻo{Q+=&Gi(:'X,XJHn+֡~ b%b+qҶř6l]Лޡ09xYΒ38}>LW>|Ȉ*#8D&f)ԝM9^iIzqyUypЦ*΀S%pȱ꾸P N8pXdnH@ q/98Q0Sjb0 fҐ1Iq8m#r>q҃_/#}n:"2, $ld޾lMTLTPb-{ 1 n*NT\QkR6zq&Ofb.p6k%rkrZ8?\~{IvV(YhpN)P4ߨ@\xgoE._Ge~]#f2=q;'%MWs *@i t餌ȱ]v." T7iV曖@Gvt,luDbw޻)Gq%YET3l xA*ZE7|ȮX#tk%ZW}Xܦ~G nz81Ӈ|wOz.k+AIVs$FwG V]2$؛p+fI|%; )oD'F9O>ua?>RgRPA`RL|T&|! ѧ;.66@&/|"*p!*ƒ1RD 8 )Z,"uD.BpƍӶǭ] N!_PVT_L{JP>փ0N+2'ٿL-vu=*Nr`JQugqIgC}'ZTNy #oX#YR*C-Ȕ'\**^x+-WVӺ2M %%XW QPsg'xɱ.-/,2'AFCdRȇ\Jᄉd Rn"ٿ^xF~޿# )#0s"J~{UfQbɞ̉ \Ll'|v6S6[:tŋUlC;.3 ߣR!WDTero[/>ǵ>R‼8nzI|jZ؍L"S<paj< G=f@+($z;ͣnDDlu)J_ #]&T$q3UHd(k=失\ Z\T]ypXco$.O.\O*8󒆩R2VTu~8Ă YCG.:RPw<]Tţ?K'GvDWB#MAS&Qw B*FjϚUdq.;m6sY,fbLg/K,޽ ?E$+# 5tӟ+0P˼*gk 7ZI~ Y2:ؙsdh4,}9̓]iFS.l*pr9?q V`=` %%gnY[=Ңr+"Hjendstream endobj 261 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 510 >> stream xcd`ab`ddd v541H3a!3#,]|<<,+~d }=B19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMU8SB10001030=gZ}?˺D׳}]3zqʴI}݋9˱͝=wr뤦^QgWL<ss|7slݕU')=%rv\&ͩnjG{Ţ7޽@-Mrպr#T*8~~]н䃭~T6-˻peڽy.w6?ٻ &Wr|ZtROY {g*_~'Mg̵[|> <<@(endstream endobj 262 0 obj << /Filter /FlateDecode /Length 182 >> stream x]OA  ~.CQ?@ai8/PkdvvvgI_zg&6_> stream xmOQ若""hv:.H I(`ІTPS}Z Lz.m"$ĕnk\eɎܙ,cLLNNr~Y|@P[ g賏;m.3fr#kx%<+Ac gpk+8wp>sLNyFS҃ Zh)=5h;No5jgL634Q?bF3jo`&MᶙS&qYV{u1vvY @|:t8LItG>1^& @e(BU~‹QQ W.3 4(dGo(Ca '[R A.w -r Ta/">hDDwL!\`}faU8DJbp 5E\4C\DCD}ȧ`\2SX?Gfapc/HQ\F"q渠:۞% & XRǛU,p ܆/!G%b øP <3NgE}tV rt*7_ISY)dǴм᭤\_nEcg{'a''l:JՉ[K2y)~!6[endstream endobj 264 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 510 >> stream x MSBM7/SAB@:  h[XUnsxCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name MSBM7.MSBM7EulerR3fQ*|{d|fZsYH᱋ ' y{yzĐYYRxzyzRUkl&JmX$xU}h lx2~{w|pysF8*wAb  7 @yendstream endobj 265 0 obj << /Filter /FlateDecode /Length 205 >> stream x]P10 nJUX:4u QZ~ÝtIsq] ..yr7\q8OP8J-%6pJUj\MnpNaqD{0WmoĪmX50ܰl5%UsԞ| b'm{qHG"֔.MPoKgQendstream endobj 266 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1614 >> stream xmmlSǯcB:S{{n:" CZוhBRhQBMȋ/N׾Ͻ۱؉i1$ /j ^&ETҗU[+ Zmn?Mp>sQ`2LP:vFCvZyQ Uuo#_TB*TW7Q:d~S)L^æۺe˶͛i^]unuܠӟEcW`ayVۃŶc5 1vlcٌJugU*+r^GdhA!([gq60>1 pg i^CD|6x 7ÝxHIRﵰt3ht$5!ͥa 2!ˤIDi \vH2o\=t@OWۓVר9vDOigߞ [,ϑߩ_c0_j^PoT5njD0z7f.$gRs|KA `lAto%s,ϐwhh`0nJޏN[=V:KJV9zvn'2N!G.r8hL,Sg9B(q1"q(7A<;܏I M=m_OCmjR&D2us@*ΥOEݲJ=ћ:͝3[8=5E\Z)CTCsۼb.+ģ2{:"cHk/7 ?xƿC,f& :w>W#qjl48ѕɟ$JP0$̾$)=(N@\ss,|;WVʰ=D2r FDd|}r&Z&z,D|mO_,/)k-?ʪj^}RFF;vap3Zhi'9Np^}>F$w[߮Go A.!X׎w|<ԓ\x> stream x\IodǑ֙}M#` "r_$4c3AC[4| ťZb'"ryYބ>4{DFFF|d8a=0Z|''lr{ jsha399awĊgNW'73zƹ6b=]OϤ=X;kʇj€)p$nF~cC&uRiBTfS.}+W0anOϔ=wR &W$OOqtϘr)N󋚮}1S{ Tͦw hO&ѣ.| 5]բ$`XvEGЌ 7Ơht A:6\ a|r>?%ztRFjn&gW^qE Ylj{y)l=NP{´{$Ԩ{\*TFXhze15 ɨl$xl!lb8-xcdluc +a-o"辚q2ҟßSьBVHƣç?)Ҹ]=o?4]*۽ aFNJ;$U=E5 EVx(9X/gM e_Èqs Hu`/ -⦜Y=AA%|K?tĪM&9ȥ0QzI }Dy:ԙ (NO|"Qѽ_'0~vՉZ7˓I1!A m+h ;YGh<0t^tcޑ\6h).PB m9 ߴK^ㆉjUSKrI>6TsGS6 U<eFS6%Z<6PJeiok#twR gYNi1xm$T5Yqt&l~UFI"5pH5V'z>9zhҡ~m-skM . h87L3. ' _j$YM+ V;}*IIM`.wץ-@,?[58<-9)B%R0GnQcp3e/ڊ> rY[.XQYVXKZ1C\;m۩}D4{UI&@{m5349ڤ$нI A g׀/嶩Tt4/>E wn[i &m:&yŒw6*yzkat5> x8be*/= h.N>&E# ,ˍ'mӉm"H/Ԧ#/ڲPbѮ'HKPx@ < kf BY8{ŀ`m_AT-tajO:hl%S0}_,#+K륓2΁bP%ɞDy5Râw:fg5<|91d/FtizKUuw kl2/xɇ9&(헻aa.$Le0opQ H4Aľt….wSnQ%h٭6>i0&08;&,՛8 plD!jY:lv0bnv0^ 7Aڞ_V>D7#т{r޵6Wc3-tBU%iӀ:eoRG5}ĭ*$~7QBwB$CBvي zb| @rq]~ZQP8})#Gz%€#UX8o4W1OBOhmǭ &p ?4 PO 㮌XwgSp bq3G!q6  V݅/hwJXWZr+!1oU/ʱA@)y51PK됃F(A&kMvTcH VsL8XtzҜPI&1q]#B?&6nzHQvM՞LۇJk t[5u.VP4 ʚe=g*TDMk巿IG[%$kjcvXIxHӾF^f]ykݑN @A V pE e8+Z2䅤dRn$yO/0[l酖ɪq:Q9`LcUoԄ<7 Z6,+i@N礗>%[$M aok1nMOc\OuWQY]ӨxMfڬ>Ac1Pd~c1Sp-]R1J HJ20t'ӈv5OaWBIq^|ZM:OGG{ 3i!ӒoCD3p,& t_WCsŃ_\6PE3G)9EE\h# M9F_%m"h wl­l]5hwśhh'+Lb/cuj1*l" . 5܀ _oydOa]5.INf ) /|~g L"S1"vD,a: 8NTqC׫wp[M\U>̖ㆴOv~KiTh`^cl{Pͥ]%p/eؤJU*_Qx?X]zͨTB0A =4'm NyKƉX皪}pjSĢݴԗE/R´%s]œv.O4>F)cÏ`5i:|S}Ig;Ts,2ApK iZCܶ"8Xm&`{mc <De:ŭNLÄS_wHPp}_<)f7ԟi jnд1mA# :GGi]NfBwvW}Yǵ{jgN'Ш0uLV^WO!̚7Br2ąOG7DIёnR "E+iOX( /,xC&s\pyWr*ܮay8Hp|&isپƤ%s0 &G,*g.k_.R* nm9[ARUН~IE#Pvaڤ!()je2!AiKj䘌3(>9T&HbQJ@Z=n D>|32X++8P#|`U Xio:B٬]^ef᭺.{,1rTwH{ܒ,E%7\Zl2]aЇGxnr+6Diu–!bKQU6>G^ ɲ`X "4eah*KtW:b.=rR*FLM*Ov9|pkAU6uV $-{mPQ8rѢ\V%s =Ɂ]g~!jxLam5n]Wׯ9Tng\v') .¬t۳1!‚W/SZƙ%||&WU.]kŃr[T $? Aoz>4,pX!G@JMcaN-ԍt?2A/Q" KʮUH贝nApd&(_f0.֢͖7>_Xp_b2rnOp4<ܞs2\Ԡ2<)j1T 0꤉nHU<E^E.(\6KnH(pqi,`NX5VOE%]b֢.; (_Hԧbve(K#'<…UE^JhQ> Xkȼ/_>0X::2<b'%蔼+yoUs1 =' R1YYaU\\^r[QHӁCkLQTq4T g*//G)Pš#b?X硩 KG:tx*4) p{܈XgcjU \Qjtnk> x2 R0b׊P_lDT=؛v+~D$ tځ1|VφB9D49~8 w˙O: 8 /Q!Z?P'!:5R*[$~ iI( xUE_B(g^ 4nq- .et '8R(e|Y}j0JY|7>5Z 6 8%W^M9xet%`b}sQZ7l %u߀WAo(}QƼ^H Kmct߳fo{7zOk-co[VJ7eLٰ~#[Zq@iU lk r@iVĕh޾ EAo#t|#endstream endobj 268 0 obj << /Filter /FlateDecode /Length 6793 >> stream x\Ko$q6| |BhwYC.62v |!g5T"3"+la|DF|ET5R^);7^n|MLr+uSXYl8fV?r~L~ߟWgک@7fd{f'Iȳ2$I*&Cl$ْF6͎$ƲNy&Vs&SX^y*0')ϡ 5$5*a$G1ϖ$ͶJ#I|dUfE"s[[lӧE9# M\I+eNIzc):-tZQ7i5IunZxY?WwdfVJ廳=z)rvG˻&5 d/+.}K7U$j@5 %2mAZjh1IŋXU}tdC =fR՚6Rp]P<>Ywo\"e?ޟz0dU Wv[n~Q6tWݬ@\F+P L{jx~nO+TCY4e_1X'Ubθ `!G H VJbȎU@Ni4)֑ &|!E$W!9LA1m a]C-Z(CbpH uHAش"AF#$&EPL41HgGOK +# o0H. >B7=oHu 7hZCx`*AWxKH g:ю7`N=oȘ,aޠqu yu7hy46R B f# ozPYy&K=o0{]MzޠS4X żAUly0I*o`6u oZ,&$&Af $53oZNGxID'8g@zޠYxINFCx@UP <[#b.>'Lt(3 m`3t8`s<$،lή.#Pl*GP[$>ٲ$.Or4K|>R%#( Kj|Zr]|]`鮋@_p]|@bE$AFIbIHU(w$.8>*e$IJ|@bER'')$${[e/%ѹ8Dg W6$ `SItwqtMuԹ8:bP[3hlzGƌ58:u?X^t}tjDN!NaN.No|׫GHt?Nbi@ D'#ip>:9G!9: ξN_}tK8:V8:%: k]D4D|ne}.,+K8: Θ$ I$wi.$.N">:I":*w;T껞drGfRO~'Փߐp.hk𑪙: N:T!=Պ_@ 9d"ؔ=|5|DGTWUXQ |D ,Q= bF}W +dQQAe} A_5GЎ3U}2 &@F$wbD)=݅ ս0^@YP"Z@B`x;E;[(/#%=Id"v\fp[qNJ u19lI-Xiq s)|ű_IV(džqLo|gAdžOc98sDc sI[`qlwql8Aqn8. 8m*qliB,(PAQ-E,Z-}c")P8ElpFQt /b"Gh3Y$Lm׊aƾDJhN8: Ծ}TGؾDUHy4$lH4,"Hd4LRZ<Ѐ\р:`Vݺ桞z(݌} IiT e$mm>_e$$G>mvB"iTuOҧҧ^v.}ZNOKy%}ҧ$v KuO l硐dUv 1">-I.RG>mN}ZG@ht?ǘPh3"J8viLL_ ܼit;6Le K9̌bv} ɂ; `nY]7۷b?|\ၐW|ZY7-Pbɞr}b$:H1a`|Xn\!B5C>x܋}OQ O[OwsQKhgk,0?Go r>ጢYΨp|O }Q(W]zW`0\\xnQ ~Mvq`@'%yU,a{~J'p ζ_z_I]#!13>nEݲ\ה#jY-sݬ,҈Ho ݮ)PL? zilF44)OZLWށI50#X vLKe79O ZFLR)c4]_åEmv=,(%q"j'WrtD#eoWi՟~bPZ Y\WGݲ`x甈uK B2IRVmj><[y~ ]f0(dN%J*uW]$A2@͊Z-tsف\N %{ 4}sFn[N)Wfc"}íP6-Sr [ tl c$-l]_oj"ͮ21svJw} q ɦrOO77O>9~)+ X2..{~άRܭo%%Gd$$5̥%pvӫ!vbPj7O%Ԇw~5~ "ksX6Lm, á)J:BRT0;f"/o߾ Hu-TOp TK,nb`x+dR<]YhMk-4mVc:yz^A05ߞ]w4QmkąoA_-{] &nu}D'@s:tQJS|Αj.=^=U;Ӵ(PH3-ik5\"Eur A_?;8gtI6ha&~?ې*Mߐ`"C` 2d6 UhdS43\< 9 }>Tmud χ`/? +TyLr /N^$huS~UNWa-^??#`׋Q@5tQg*s.` F9vfN *<Chz(Pߟ5\>5?b\]PSi7, TZzwbEĩ_Т)Չ)LO9:8\IHa6a^b@EŰ9#xKlNnxDl0`%B0_tLZE8~;l[CŰnLU_Wyљ*٩ }tK8}B|vϏp~t?/N{0./NR8ku4.*g>Aӛ)O? \?Zx1 ;;CrѿN3{bN)~lN qpޑ/>r$).BJQ9JP/Z Jsa\u=CKMu)Z}#uݾCzFJÇKv#g:-O?eo^>͏_.IQVjگI҃>, $+91l\{y|-KaN>*onth]Y~=˕K ؚEɎ7o'; C"87߾&sSmP?R5M7v=k<EZ`hEu>t133&A}kͧ7~7yg۟{k4F .tzqXh/s}!+-i g> stream x[Kqۚ1AXkbZ]*3CCJuH lC= zg֣v HG8ptuUV>2EE7N]/"z GZ,n.|ai]\m.^owP圳cr)j%Zӏ5oU+ŀ9`0^Jn;^8\II!ⒽW~yJ |mP\¢6˥UfA%}+mZfd=,`onKv߷! HP3p]"tZ2<7^G񰈫jjij0W@$˥SgA9FnXB^WdA 35 daqE5 cj! ͠ˆkUDР/8ʊƤ_k+Bh%O#6sWŃب2V-7<F,dcJ>I9,q\oΡ-4l(bB _TV6 dV-59@n ֖HTWZ\ J <{L )$hZ.obsD|J `=@Y`F)!ء`8"wz ,x6cvţvGX3&?0EK1@4]-A-e ],AN -pҳ̹-#ԶFaRKinTyB[R>{] P!B<CmNsst$AV>: gZi*(Vv+ [ӡ{]~쯩qFsLjj2->4m*y^6ΕH{eF亿_ǻvUV .<Ӗvۥ±}>(DEQ;{y;!Z 5E68p[(#{~m ꁳ츫ɣdW`gD2֧~S\]]pv)H6V鱾]nI;HZ<V*zW4 ␷}{0+2M:a'OΏG+p>44t(̩EҎ^N7R SO ?x*쵙N65.c=YOaHg1jE8e F q ~.l /fwE# nu"S@n(bؿc& l :ptP|:}c#fX(tx }tiFJbywXqI^zW~ V 8z5m?lv(=m:U|s+|8yQk9iٽ^L6Z67]˨v$K"7Ρ\5;fQI70 ]Ub4ڦKRv<vRD*'!oWx*Hd >NRRpboR|&\x.@!9v(`!_R ]GN9bS{g5QErayBKݟ Zhu̍M }NpBԾwT18EuXz$.ZoS$xOi0 ~4jiXvHt;x۠.c@nb0 `eBYxx-;.`FV@6ZxeSg+ !MFn 7;x\LyɌ/W}z̎1 lhq0z/:fN[mj@ŔU. P$R)] B+~jFsµVFnFR!=2C_fDB^@BO0iT1{GCmyet}'#zO x~13UftkLx"z c 4/Y4&Ervf~'`/ͺ{Jʝ>-/bq$q^P8Ed͔f y.[8Va!cʹ}EZ|y:X>QGDԻsDZSl$=ZNYv{/RRpi #»4xL-qS٘R 6cVFɅ4f7 @|IvM?fSV!25nEM&qc^)pJۍaMw;6}QNeOURXqM8EWfѵrp|bkH¹t~ b2S6$dzU^ V%83a{!|hF[/}-jf@l?[яc aKv,oF>v7HkgZ^kDA6@?xm2| Sydo`O[/v Z|2CW[΀P&1y1ci^c;CPrYU]xdCM ~,)* vHǮ=ZG_y@j7{:?QH~ jtEY"r9[i0|l,č>KuWp7SPn;?k`X6JW)X> stream xY[oH}NC3qh6v4DB6൨ ^je=gf;Z&~NJPq?_O/ WW'Vu9RQa$rBeEe\j>δPgkuy O_9Fl3eAm^qocjȨjQP/uf[SRy7=.ϕ }X̀ƻ3#G=|Aj{Fe B! $?!`UiYֹh /1_jDB0V-aǝr0\inZ)|J#jsѠ-8$x6$sS^JQ8$Τ5rŔif* B+vrٞR?q}أ C;cп!_d`wń,<0{K>!PpC*.?%:4|pB_R6,z9|E{ )!툝 (PWk!NVLJN Iۡݯ9\x|!A(3PS=adA*9i"‡C N_19'Pd5ZQ$jL}IK1(^G[蟲hg#ޓ LBZT/?L!DavjꏏH/oGkɠj)56j1& `0&~$)VEc&P#dce&yY+tC!i@Gŝxz'׽Mp_v0́ao9VF3P)D`MEQ/5KE2-Y0cVZ 2V~7,q^ 7¢>(0 l0fUG@CX[71u;v݄ˁec!rI|jY0{`jp'\a/x  XwR^n2oxU$͜нTa1ev5>;cF64"&Y9(^f¢iWSʋބSCamhӏ:T fą> d,u`>zNB pè*9lyˎ }1}hecHCSAŽx?aD%5d>o1mo0ulki$|q!|=vߍkN\ih$-N*v:BƦpۮ3AB ^l^FY]ԳMwЉxrm]fdN{ d Y%nUka.7d'+^R#-/۱}ViMCOУа V, d(OX+NBⒹ.oð8 v0$W@6D?d8Q3ȹ*C CJdGmH٣_=Wӑ aH<.k<*{_Ra2wsz (h8-4D q@ pp-H9YmH,mՒ?d5a$?c!<еѰI tnbùI "UG0i$ZDgl43E:@PCy4ERje|Iӈe`m*u)lE +X$npW3RK:PkV-hpPԭ~cK hZH}仃׷c=XDq͈:f8@IsqMKai̅&K=[ gc6cig\^Dj:uuϰiV?JD9p̊XvB'Sendstream endobj 271 0 obj << /Filter /FlateDecode /Length 10667 >> stream x}K$Ǒe:H\=Z.f#)emhF-#dC=AS]F{H`/<##_a?Jؿv]>O'Bf7vX%w ݲ.cڗ%c ,kݿ exL"[8ꅔb^qYqКґpBqB)t\2Z|l ) ˱z/vвG s{+9(eW_$X:]V)?ipݯS왮ẹ:߉:\''Lovj%/,L %r:S{[EsPLs&2R˲[uRƙrڽr&)q me9F"BHrKYAtUcLt đBJD|*cqcgߐ?%xL(˱Х}|w?6 m"՛') "t"RMW",P?]R%IOw7|{ȳ%ßnnn \ZoǴJuvqh,~ ԑj?6 qb]:]}m}a #IH/[xSEKͤCJkKYDHz3F1WaԤ u#urW 5 &±ģ1m!އR#.INgY 9IR)@ʮDl!^k)RƁդb' ƁM=3R+aFP2NXxd/R=8CFD){5qrEQM*E^X$CS YqB1(K*RN(]hx*P ¨92NEe*y,4zf0V@2#Е01EnVcWEx(Lw{!Bثjʝn$J^)"EO)M3N\ڈ.#?U-'ҽd=)yEc[Ҽ'>+d2N6F2"\),efR4Hh}8FREq"MzXQ޼7Ng0Y0g58IZC:?'ҼTxR<6N,e"Kd{pYh( Ng7{up+Rs'2,:FHQ_q"3vZv3 qozvg+9~ˊ L hڴr.%}Zͮpk0OMBЈ)X@H[kz Lmpx´}1!O4<_9mzįF@a&aI*=`@ 4 d4ZCB4SK ařX=25inS$1I-r[A40>$TAɂз |suq1!Ox2eHl\ȸ9/!` }M%LI Qi?* yTzP"AaD.N,2rud,hPJvծMg9b!5+lW|E/+Qw,. wi.$պYw&J4kw$.*+ *mkLQt-'+)X\0 ^hț*1Tg!p.1,d %&Ti&kEf^o ^33meз(yGf ^b-dD- 0/MRcC! hXuEr0% mаId5-68Uŋ!4Z*1T gqp.66f %6Dz F*IV6 }Cːa֠@ Pu?4T Bi㐼]jlx5x֋@d,k+@ Bn_^kNb-NP Fކh^R5yؐ\&(goQ _^!}!"-^J{H8k0Zlq4Tn6F $K0!y/JE8+WsZ PMY12xXd I4k0Zlq02@B5tr6F $,Ɔu^)V7ΊwOKkXSھFW/aЋ0NWC6F bHaCva5Ȋ]ㄎ49.ߨaFm_ KZi؍dH`]shaTn armIaCva%PtY!Ӟh( JR&+s>z F 0=Hc4ZC¼4 sƆa./m?'!ܥcaWWF g F nʽx@lIaCva2L;X9^.MxSZwuP ^<$z5-6rx#zqΆha^yi88oEtɷrB+$>Jn _LKPb 4P-ԋ!a^9ۥƆZh_P嬼;ЅWn{}|jX5-68]PK6F bHav!oЃ7CѣZ1>AoheGˬhơ=jhy!4Z&a^9ۥƆYMAVV&s"Ab->U*Yb-dD˟!4Z&a^9Ɔaev-9Z,+s`5) IץDSc,i|1 ~9ۥƆOJ5A8I@' ҷL0 |5-68 oiXlCh0/L¼4 s yW6k8{vOTOJmO3a7&ӬhƑo|.m(Ő0/MRcgeb [5|GF3c9.^ƼCP kj߹yJz1$ˡav!ol_dpzllJm?a7M"`h|ii]=UJz1$ˡaCv›G=C%lhϟU`8i0y1$ˡav!o טg(?adk{c* f>hMF oCiP/z94qH.56|^_ey`{:)'H3Οcvf*Mv#k0Zlr>·j~ކh^ rh]ll6gr.h*^cXa7u&yMb-H/6 A96F bHaCva Xx'ϑJjܳd7tțX G~hJ!4Z&a^9Ɔ-Xu$;  ܥ!rk)i{,+ c$r5-68u6F $K0!yذMK:w1`f0ii oۂ]%]ņ0Xh->4:- 0/MbcCo`ƻH"wAʣ؇\iAI`ݘ`I\4<ۈ&a^9ۥƆ*o)WퟩlW:vW&ފhH`ݘ`\I4> ¼0 4q o򆍰=yZt~aW60$p`t]qȓ!F¼0 4qH.56l/jp:?-#6{dbr Ik; 8INPlDѶ%K0yؐ7lNM36جu<Y( &QtX0FZmP340ۨZ&.Z)Eme c[f,h|"Jbeb[k#E;SFG:+ b}YwN%}$)Y.J+w,smTWTج5]I~UGdBB~ؚR:be#ޖ9cݍ;ްkkmhw5Ӯ$6ZOsf.)d'fV( "ȻGe$j=HI]f.׬$Ƴ뒝 ;Vpȶ7q#6n)ގR*^l퍌: wk}_tJ9`)C,]bXVɉ{|̂mYߥ4o7Rf F 0Nɦ<5Byai㐔]jl3pc]hSN7'Zsvd7]ݜ-6q=lh O'BÆyai]ll?cnq ŸR ZϸSvsǞ&DZ'A(ӆaCh0/L¼4 sK _cc4Szz6=E9XOGP}ZdA.O৥Jdr-6qĦAKl6 $K0yؐ7ٖzXrׇc} cDs ̻{mX5-68RMzByai㐼]jl#ɑuqVav2ҰP&^àk-SsӐFoR7/L¼T gqp.66 I8]ji~ ZJUvewMB4-6rjOMa1aCh0/L¼4 sK (49G|):,*+J -6r)P UgF$KpbcCޢDfkE'4(Nha' Ɇh^ 4qH.565hn}rpVQ8gaw,D9!NàiڣTކ¼j8v!o'gq#łvҰ[Z-^j-e7 8~P-ԋ!a~9ۥƆxpZQs堇T!oAtabX7 62Zmq &Ӏm(}^ [4'\ll|Htqpx3ΥWvq̧-%X (J Jz1$ˡaCv*ż"πԀD6Qwv 808+A P P aކҷŐP/MY yùhr ?hJ)pp'謧 4h^+Z(Ow0Ӑe4ZCB8$oukr 'lj7MQ镵UϵveM$:ds-68r xzJC¼T gqp.66-f3[ :qJn)y^![ ,YjHr4ZC¼4 sK g0A![=jt)_uaI4`/ab->CFoCbH,Ɔ%!<'2ĞSf9Xi-]{Jм`tXqYn0X0/L¼4 sK v9Y$3i)VkUvk I`^a1X (h3vyaj8v!oI،ĦǀcP֚W=Ѣ^qxj9l{@Hw!4Z&a^9ۥƆ3tq*0l38If(8=2)Ԯ4솅8it,rPn6NyKpbcCqR:4Fn]xO!SG`ʑ'ƔɆha^yi8$oۿip^)q&| !LeZ}nOxּGnY _8<uڽ>pufo_6~ًC&buCچ⁚^ }P!^}7zE +$lhKq[;2^v+Ʒ a/7;˒;&HW׻; Na5cMJ9^K]+_HfZ!*4(y|~{ucyEЕûoUZ.8QgSzx#l[ݷT=<?=}+9nk 7AӞ9D7rt6rkRƯ{Nu]^Ck\_]]Br_ך[r"z Û~x~΄:scWآ<. -+> *wo$+ߴt,VjNó p'Wv%$b)>Xrh_aYzT X^$GME֊y.Uwzw8Z~h r֎3ZH0o=q?QO72F%A+*n'Q<>_v꿿>o?i[Ut#cL.nߨ"zFOvI.M W>K#B.vx||wL`!֜< ]7-) k兎XY%~ ~HR_jw;+DͰ l󼚬Íg?%ȅLVe\׸6n.:k Yϛ?|q@Nsw ?1ڠK>/];kq04yr/cËr<L>ˆ2tg# ?]GTyJwG| IO Flʜ=!^Ͽܮg3E$?itie /ԟ~Zd=G/3߬4 xi{+zT9*f4>< Pm#0.rM / 9߼wM|ҀmWαjSfF;OL~z>q':It[(ӎ+3x@DNPG(3A [onoT='m6a)?}pz|]Iz_qr+0G̟-O[9_Fs9LP])7Sm bI'ܺIAN 6|u[BP""d"d 7l߿O:F5n+7;  -BWω˩ ͒6F*66ᒲ' 3TGD~{vַh6)[evvo6#O},u6 Gl ˆl斖"YFwZ:7S~0c+e_8OL 4~1݉y?|CV BJ>ꅱg.k κ/" j#0u)vI~^p.v#d^v|"5-"Ë]D^LxO[}K| ! O ^g??yծ^֗(O\D` SMDFX/ S(L, yJHܿXՋ׶,^5@,niR4eԛ!_Hjonw/_H5GWjz]֮d~zendstream endobj 272 0 obj << /Filter /FlateDecode /Length 5283 >> stream x\Ko$qt$>& j]Ǯ``cmX1C l=z#*X쬰beFFFDF|?D+gKnWb+Iogo`Fgʙ3hիng7U1Yx ?V4yR9VO` !|fA6$Zme4v`Cl4pԲ9`[dVݛ]91O>Ĩ3N+b@Ť;6TL󅋂O i'Lq݉!MZR㒱G 8`}* u*+*mkBç CD: ~jͯݱldGI'ڠ ucrՄO<ޫ؈Ǜ6`Frr,^5ҡE8?*Ar꿚`qK7V RJWKr~FR֫Jk:~W|³V,i kXҀ3Suf[GNеQCۊ:VQW)[+4g 8IY !24r~;?%jN]9Z]W)Z32.8qr  0+dA}q;ȨW{wXm J->#D Mhc<'x#mA |?/!‚)s f<԰`(m1H6([eT'"'O8L+eE O{cѾN*Eq#Eo&]MT+"m9w`6 F'ܖ z*-'˖A4U-@%oOՏ;bxNE"x΅h8^V܌S9Tkk:"uF|f!_rԖC?&5@:c'#s,r9Ie`35+Ȓ8#] `ZS `z,rJpeIOt/:j a-[HpYF8gNSz XDw,Fܛl2J04\Wz8ե\QAhh4bQ’+O1O (ե}3aDg "R ZmU{{*|J[mmE|z%u@)  |:ΎJqQ;:Ly<2| Y0řP'>H;rt;!՗hLpXHCVP(8U!({(⼞S+C= huR%ޥ3BlTqL|CEt)б)Du]$ . 4u%,{#lu,Zռ9(=q.a1{3 dmzȎ 6졀cʟY%I/~|Omiq:`O걔z2S r&VwIG `Cp-t^+ J/CIŋ}?xB6 O;2ƶ[\~[eo!cHRvosn&@r+,Y\V v7R, @f)3NU'qL ̮W!O?pRre+˚|!@4͎;Ǧ!ìwc,rV,Y>FjR#kL#2Zvv)+;q܊TdINTmсKfzVOX={_RЭDY!WO6uEOPjM8M@=M`T)F@/SC]Nl p0eN󱑊q7T{,p2`Ҙ;^+$ 0{sct: g<g y2(R[ s ޚZC)%sUV`ɒ 3jt_3@L3Άa8yzPJ>0B-ɟRTuG쎇$yix)EFsKC$&/Ku@Mr`p&x>U1<+]KޜF;d0R#Y ӥ8Y$:atŔb$X }9 0?Dz}0Du!~{k¨ATc`Fc{#iM1劯dJOy-͡:@: `l5984=\1oѱiRa끙$%EGBN[aTH;LViTJa M#~ ;hn#DEwWx:oU {Utyxfl: r'jX+K!ȸpPͧWźEFlglP |!LTR k,{fJre;~R[ŕvp*Fj<'ӵsG$<wW7s KDzH>ēyFl0ghi'5 aKȽI߅'$̳<'_Di3df0c5 ?率xcuTkޟ+Rv%h!q``2?t9acYEWmy ?˶r^uK~Q`*-Bo#i)-2Q,E ]%D0}b0)TP9E~hἀ-Ʃښ0t$,}>s* ]qط/5< jC,GBc̀y2Wۚ`2~m Ӿ -}.ej BJ)2H9!4ÊTZyԢ9%Ln X~$m 17ih쑎~zgK_u<(x;(oCFt_$vFO0 \SZ}Mw>4NOq SA @U-yٰաZ$Z3^^7ftKw32 Hf!E |.g. ;]ArTƴNԺΠ+DT%okZ{#8ԔHWJ} C@FQQ,(7shCs/o^E-h4TYUrw"Zb7xNBƵ  Xٮ͛EXsH6ZrIӫݝ_xumM$xSTWkN^lt*q>-c?6QbU9ï<<+i0`?t^S4qN|Jx#L_glu3cYlpb;<.apI!/cwMy ΛW^f7Z\#\p!oKg-|#~\K^~._ށ/u)l)6MzŠ,Dcd5qI >wOAUdLC׻e?m`l>BQ1*c_>>{԰^XZI5I+?ǥRendstream endobj 273 0 obj << /Filter /FlateDecode /Length 4665 >> stream x[Io$Gv'0(P!c_Ì=a,Q\%B{/"#Udw ted䋷~o 1ʅ?`B,/~.tN-r\xRB~ʌ1//0x&RLb rmqm )hW 1Bٖr NbCt->IB !i< kZ)(%R 9K͉5K3j;-^X%f$z9C~2 i'aiIYDh";C 9:#֫ZqyuU ] i?fIvD "!ojT 7pIfR]<ߛj7635|@wR! 7oL|Jd4qE~fuBhmF/<#toÁ^‰:ųz~wO~8@S"n<-Jn,1H 7;,GsilӋK 6 E@V3oYT'袉|~ w{Uz+a1jW4'VNˡ7q.TG:'Q`,z;B9ŜgkXp+u7Ě7q& <- VGaC BVͦjSWʐ& H]&϶qBfRF1jZNOd+^9SoA(lR\zl4wy]/nSq{]<Իu36 =` In،Kc%T%u)`YߞU>h) @-zU(xF+E͚rq*u\Sع4~+:\!(Yh=jM[>elr@Yo+̨$X@/lW:6hta ʘQ)-/zy Tu?B/d\sEqZٻJ&L䚳H^Tuv-jٷ Vmƛ<߿RbG nvKKN22muX5y $af nMEgLʾFjDNSۑt)J͏<2-b:=,=II'tf-QlN4QV(Ԓ鷜+3?Xh⬛R˚CU/r'EU7SʍLT(%"Z֒N/Qm/~2 nh6Xpmaw\D7#\%h{*E7Af!lr]Se۔MʟפMRtQ)+nS+eP5m=մbM#OM-S''jۋN)BOtR᫟2z=])/k ǚtd}7 ILo1G=v fLG1܄:quv'=>Ǐ!R<7q Ϗ>Lڃn(O*m6p59R'j}D4<\3"j$Z_F$OT::^a(Ig鬦02:|PT%VUTFpMjWF@/uh4fcdPnV_Oáφ(v/ *Ǫ<.pMHi씩/nʰ`i6zB޻)hV2lUhz6L3GMj*Kӽ[mPAOaPycQ@Gf$f4ܔyG.̲pa)N%ϛ:xT/d_ɡ0X5Iut٤oXd'*4?ۇXMSSp-C1 Ђ?ԛ-[dWIQxvRN|sm_}sH=ܱ55욁ylsܬtR73ާT94t3>mBZُr9.4rԑ90>Z\n/Qj%aMaxD}X}M9!X BsJʎzDX?ykxMVZ BŔ@'V_={;/SRJ^qL4g-t6heҜ>~E}.Зk>ܲ-,$<](-9.].ރ$~ -ŀP<\#z?va0-$ȐD )Ʊ#Z;rg Qii|".-x8BeAB*ZĶ.3l`"]|tJ0Ii$ɁwXx yu* 4 Dٞ-{+s[=@ѵ{x3;~+F:)D`ZZsQziN$7 la 3z j VK2̶, m'Hx A=왼vbl=ⴧU.e@M7CTK17 %>ĠospaqTutA=SlE%8Ȧ,Ѐc"?lus*@b*PEN'Uۻvx' 2C?8F)-RWJ? RYiqȂȌ|T%gL51UW0-*uF݌\N\#)S煌ka4h5\dMyvl5M)NWMNiHP%@&bg f 0ƴߦq"[#+1E$l"j yFbgPJvFea3'!, Rccgl`Órt=gƬ%(z-aAvZB܉KFXRZ`-ɳv> k FNKUʂj"| Bs4HK% |ŗh4ؗ%g\K>\ϔ`,,oRL+Bկ>inEjj.Zy5nUE,/5MSǎ6'< FW-9Imd5ۣhvŢ%kK.Zih¤%:.Zm;}-bF/@r3VRu8YD9IëH_ܷJPDu_N$aSW߹/RO' p}}- 9o bES.Z6KW-P=N ]9[T-غbkk^\]0RҫVKpڶՅѺ(.K#ՅQ(%)|el U~)mkai9f[Kiٚj%{sH=9=êpS ٩x?r n|mVfɶ|8R"USuLaf%p}'oBعvtc$qΫŊhR=zC|BuƝw=DO/bO(ɭt6b1{liB*@u` 3/Z)_ŞZ18OgcAL N{B%pS=y) N{´糧| h_+EtWh`ҟ/W:ye w; "DKzB;ԛendstream endobj 274 0 obj << /Filter /FlateDecode /Length 4794 >> stream x\Io\ɑ4sɍFmc M zp>H>XEڵŢDl,.jՋ{D ?&|NOG#>9?Ǒo'w'|`!&NNWnr>zo;n^8qz.xf( ;.W}Y|\΋Xyռ#a9ۜ&5>Jxb ~5[w뮆2ܰG:ݧ…ai’.~0=ag'˫̰,cNq)*8 /Z'^@G{tuiosse:Bm7ӿyler=*gmݻMŗ=_$A?&y^_gPCrd1DYT*eeZmuu H&ҙEִFej/¡dےx9UMn3kj? ]i=򠅇-v5b*d`Q+:=Cr"22P O&%)YNKyrZ}JКyM)|t h#2Z K}bEjKT6cU6T:)ڄsjpez8}֤%.nZ遖t|-Qø(5K@[L~lG#xӑb+'#ɡ{4g:RB 8'Ơ(`@kA2cΣ6Di x&1'v Ԁ@KH0Ѐ*w$#Y1H DTD@&I}rAieD: >b5T3- 63 'hqmX^GjlǨ*A(zқ`-j~ffEG^(:G95"wS:e SDkަ#bm>SG_4Q,G$ Ąly\lІ䙸 '9 j"bA1oD%B{6MinYҶD癩5/6m.m8sΟ)mSSJʂҶZV9(mo+6K"V[ԪV[&Q0{@(ћ\Nd)Fd)\RRHu+ﺕBJ٘X6ES;2-dG#E7Y:L=[{Y]uڂ$o쭭(zN҆є6NteZ%HSPme" 4Ӕ6we`QenJ=D ]dhi Ѡ!@0.2`K})Ҕj} P>qI DOg0%vǠ2ͳ8-/9LZU ٙ +#:o|Y6NH^\N9T@S680#N8;S##?\:piZrzlAşS;aS,}@Φރ 髖OYdEh"w d~5EHLMѴ Lp$mH(>ЁJHD̠ JEfE yHGyp.!Ev # 270 :q F-]e 2h:Q'2m&9G _gs#&a)*NW˚qfEfu(ʍ9iד+Wֲ{.t:2g|DvYgx2⃼*dUF6:n?[n"GCh)6[ѥ(zzѮ/Lǩ@Xq⭅%^z܁3d)8:֓ }F9mEۮMqb|ݫ2.)*Ha&,\z#G?"p ;TݨKo<%zh&ȥ:VMl IS0Ʉ23.onZ&L}6FqD˪(JrUDĆb/i`K8zI׆cH.4[QH, y4ESPpdI7fvC:#`q& ݄!9rSK%iƩ*<\{/i.#RD'8!hoMLT&Y1n-;<DkJH(%iouޥ1+z9̐85?䣡ʼn6Nmi_87tG^A*::]ml',{]~4I 5݄`,#,hj( Ӟ)[{+J=IFfnӜF[ 4[tiw^G"х ~\/⛎o$ʲ6ɹ\g %Zoo)T2B ?U:ĉFA 8g]ِ{c[cws isT|e3nc"z~{:㨆= nL1:]羚R/Cc61r4(->RIcgPuR4`җ:yldq ['YZr XѼ7 Cj Uďջ |fqff:cs̶͊qDCB ^ƲXK2D@ 2xve{ƴ1ҫ4A\_[[SdbF_̠S4t8f³{ { nwad|KUwU}^}JĞYKnAt^D=e޾SOw~Q(X{iMq;kyˣW*Q+޸/G Cd52}8jl7Q#dFq3/5%`3-ۇp+S' ;1)7cϫjQ ~+yjvu5F7'oٺԆN~"_B+ _؟7tq%s^@]DJ{87"qveeyV#V\V"r$2dDԸxt8(x39Nzޕcȿendstream endobj 275 0 obj << /Filter /FlateDecode /Length 3713 >> stream xɒ>'S\)}]Nc\C8LJ=Y&_{@7irFU: wդ?h>۝ՓWgNˆfrq{v몖vrX) d9 " *CloyZfۯ W_e?߶ӊ'@dS׃XÒs|7a:b"_мlH+vkֻp8:UtlBۏ'&pUݻ31 @ۼ&a9M²f(ONXxTMD#mHZ`Vw M~XHӮIOu U!(M\3-=hЦr\.g툪88q:ϰC_I}\n 1WTM>7m4 ~G!A>nw̲5(ްͶ8iёK!Z¥uZa!O\c=e*$5L@ >'C\oDB8w8z}s;z(LE,%s9_ne}K0|-/# <ڟ 9(lufL3hm <H em۷g)7q,z=5-d7#9V-VQ҇$SR.Tl ZwG0jKAa5:fMoж!S`5f8 :%h2qVcPLhDHL҂A~!c=GLmQe٢]A4PpXs׾p֬w+! ik\X;\T܂gB^ٳ)q`@k^`<`ftyRKnȢoab@)s6)B,[HC>i}ߥz?gAUrҗt:S[p-&$@C VJ%f=pA(jPȍf0ŷ5:ְIblT%SJ)i4J)n[⊠|cڷZ~P ] tn)]rlRa>PD2ij`A n!UxT v )AN8g 02 e}?pPqDJ qB#L:Hf|S/{]fYo /ξ@dLݙuk?BfO[7{1ޜa,KZWIǚΎ7:QE@:$? p%*HC_~1C ivI_dob4~ļ̘;KG~28D֕45+Uѐʃk%aKvvabZRA.aKDSr0Wq4aEJ]JJRb9#-ҏM.e p=*P q3) DY FfbHT'f>eAXFnJ ֢fh,)$p趨˺Q_q}5RwdMj]GhgSlr?.@e gLJ>OrL!zXKjM}^طa%ŗi S+7)g͢K9M# y&z&DIgXNe|ll6A7Y `L&"9'XAP]0<˹7uwCh;PS^/`ݮx6aq6P12mA?9UYIv7}WЧwZ7'*hBT>[,W7t31\JomtvӶIdJS0kJ$uYL1/S oI Yz?I%Ke]ϓQ3Msi `ݻJfh95P r_r[EldRwHK$6ϖ !{9=){=ssrv9 퀜}:ka|3O4Aiit!LMo4^{J sWS.Eg$?>m QN&  %Sʆk]2" %Rي6/fX.a\4CNB462; =8 P*_߶E#U[sY9%se CMIKYcje,|q=SD=j>-X_߫1!$#Xaǡ-`, m_S&"bYP Ŕ)Jp̰uS!)^ HUT'dž5Cۮ\J+J!_yn(8õjd #;!BlXh*XP)Vx&NX(5]9Hhᝁp;#u4*1WT%62N4sfW$]U:bB&Z]}H"]kF5V)܂߀48IW"}"އB, !(Gw.EYW"K=Es1o̼_YW 1@#':Vkdgx X A_; uYn3X+}K"hM,0B:_JKf1&^y PzُkeÝ>INnj|#MŤP hq _ȩ+gWϿQ¸+%:+@.c Aw|Es2DO y&ci^ȚDAh"<||*Uendstream endobj 276 0 obj << /Filter /FlateDecode /Length 2497 >> stream xrSr-8攄ʇęT%9Q\vIsHm@h?g^n$&쇷cZ1j/v#:^ޏ?_Bӱz|u7 _chE_FdMM.ܐ7^9IOdE5#uO.2ZI]v3!Z& DAp2Ɛi\כ.!b}H XG %ܹ1+S%>,g`sc+hV!̑p*XQZA? E\~%e+nY“9DLᙲV$Wռ.'ZSXCb@>wXU]:I9CBu j\ ڣ ~Q# lyK!Ⱦ b%y;J߂c :Ez<}kt: a0c@Mx%%_C4?U*+ ,h9_UVT,uv'd/<\0* o^.H4(M-Gq@1ORW Hu X9bp2`p"8e?Q) (mViӕ,X/0AsS9i`4L</h(p<䮝0\QK &` !P䤾g@O*IAw TW'GJLД2`a}"idƠs,9fBnk;"a])2")g.p^wf$sdn(9l(6H5q:Wj@ݟfshUM/,vQl.}4?iK#9 x,\;6[b.K8N,v5R)} Scpq$YjxhxTbgʹ{VU" #;:ieNmtkP/(@v_$NIj$3ȏ6n'@9o@=y.¤aXB>. =7ڊbC>$?#cY8QBZt35%ԧBO6sw_7 o!iJ}JDn&z0WI6d]XO\$j}yNC6%] YqA3"OAL&B=~엯?l~+ I]M%<[!OY UYerܠaRVRI7qD){$ads8 j*V!x1t_p+@7'R7yE#[+P,&5+V {+H<[ė)H>J5Pg+~h$xLKK0 uǦo{uJ&]z&hP.R`"ÐUnV>0 TF'AJ=/Ѧa!la7>O7EŽAEȠMܲ-EK@ JrH\\r 51c@-Cd2m$} iV9; L9 PRB &0%VI_zhA{s!/A `'i\2̹kK{NT%~<}= i)j玭2Pp-/-x*-6siz#}Bz5Y?~JWQԚ7BO6(s0~U,w9ǫN)Ж.xECGZ(J^#82ӑ,7eMT(\lS%친z.!Lh#Zsqcldgendstream endobj 277 0 obj << /Filter /FlateDecode /Length 36932 >> stream xܽ_'q%^K]L^A^Aø4YƒO8Ȇ&hԏ`DɌ=?}}?}_=!^?ݻ^Huݯ@xϟ{|]o~m \ϘKjo~1>_?,ttٟ-kγXRu[٫n.ڝWNM}X;|>}먜s8"±#M:CL{{izT/^~/I[ӯWj8E󛷥\}v!$#=MjdĐtG>rtDeO[_Wل{oP؇|}ï(92^NXDW풤+ \Kb.G[szl<3XG~?RS9ӎ:B+/~5<ޯ+Ich;> s,; 9><|?mOO&?_W_ac注n[k}/_#rV:q?FyW|>} _rk_ަoL(}ށL{|O0,l?ϰZI/!=gL'LJdi7_O13te=~ij9Ǽ4zC6FoOE;?LЯ5iv>+3b,}WQwğb훰$c=bT=76C} {zoߛO{47 0-[xSߦs}0oOnqwGp\O|+5=߿gwϧ[wnӯ7/+?˛?~BOZU#Aր%r'BP?21Ù&ӷNB'}74\O\g鿛c8>_u='tSPh6Id巺Οu}srV4\j?bZMsO9WvI䤕db{o0}O5?ט1r8bxx~@Wx(P4$֚"<+dmo~̖'|2d>| kmr/?zBµ#Lϭ>VK'Gx7V{LvlNl#7F;Gϓʹ=e-~_<=xf%yϬ(ȹ73exp~+KRan~w7=o~U y8?Z}en* U¼~O\ݞ >M[L)}bS=qcL qlִ9,0?P l6Gf؏#o'6(N ?.M_[~e|{.]1}">iCϟ~eݷ5US />2Cehg&Z>mux Kqy6`V[ڛT@Dz1g4=K7ýa,3\?Ҟk;+>\ _>^OǺS5kHkg,űM39s<(LS+y8;!xey>߉86s˟q@7/9\:,uGZGY'U:wy>:,uv5f_e@U?_\o뛷qW{z[w|m^~NQFiÏaPK繎=X!*P\vfgq9U7B}g6bݭ"ډ7nulkBkܟ>s| n~7o_~/vf{^/q LoSDgs#O* @mF:.{Ggn؆9mؑ:Ԝuj3BUr]df/ҁ:Yvo 7@TwS4T--s g\ ޥz-yQgOL@՟a:{Ч^A105 5s9(/:äu,O^cTC` y}~.SɧNnc ֬C@]&Wq$fm[tV1asFrSP??~[xY)ytH5(\bN3s%} W45ƞ}:}؍a>cá?8SS})@M +2CHPxx>WDP:!`3,-9`) > 2mڵt Ec"DlŦQRUf-~-zT"`9F :'H}+H>ǜ.@8Dj@oc7 XQz A_ 0tgnTqziBOkČs,_zs:9@5goiެ)8z^3qt뫬i'fP#˼XRۜTlC-%XAӖMsOs۬a:ulԘoXrR}dbK_@jl)7m-kڬv[y[ԩx=3͞sNuP7{sNYvmxr:}h͞|e𑏦|…zZTP;jQ,1*-!8i6{9h+]=/,#-x`ќ}n ^bv>[3BͥNwͦ*nviSӋ ՞Bn+uFCm2 %%ў'!T=σvSWRU@EZJ-UhM㸪IJN8@x~gH2r[ kNkPr~P=+2@ƂqDk P=n5hM%@xDkY2i QB d/ZaYTi9U, ̒Ӣʘ%GbnQH+d̹^=Ps,-D{,]@jt-D*&mIM6<]tMUXl*ME`S1 5m-BiSm*T HMjPb@jTk6RӦ"TMŧ F-6M`Դl*MEhS!Tkt6ŦZ#T6Mŀl5>E*LjOѦvm5>E ŦZSjmFjOѦBHjm*jQѦN˦ZcTZl5FEʭdT J_Xm$L6MtdSQq(l*8MFhS!Tk6UXMF27um*ɲָP[IMƗhSE 8m*qjCJM# a)(Icm8Xr+{()l6MiMĨdSEnS1CIfS1*T1jPŶl/Tk|6QMƧhSCR8Kl@Tk6m([6:<6jPѦ&eS*TUhg?NlkR6̈HFT .ΓڋA  `sG[z}tѭԁO1Q, @5͌f)tޞ qL,h&h+7PDzEí{Wx Su.x냷.%&;zFo]-u9b"adwO4mK]h&( .vTޤFBF),ڡ 6+IcDr л-| V$W^iFAA /aInr'uqZjM i ݄5gG.JPT{_b{FR.nrgnNDP*FiG\\'e! 9hUS.nrWn 㠣: U`crSi8O؁:$ ugS6Qogn"cy>JY$Jh,hx>rj"i2QѺM2.RWnccF=#ߡ^TQ|z9 dR'>¤D9*M OHnr'u2p=XHAy#5-V_ڰst &.jSXJ$Mb^ eMIr>-Ib"):xu)7'7RVJP/ZaDYz/vv_H*jF@ִucQչ#$'Zz=s#ulN/h&mq7` {[?hΝپP D]0t[zs#uOĺ[OǶ@tՏ=zYˁ]Qx)@P_q/8u)7;7R;t"jppd}}TC8\|tWh-x}}CkEQٺԛyq%ï$۬ƝCAX| q)p#&bqպMԛc{_}+:O =6E/m^^ęԑ{2Z'^zzNp1O S[9z^ذ{W Q)Q(>xKXRownv|^n+rHDj#ˎ0_ ㄢĞY{RLZ;?:FlzZr=W{]JDI 냷 4Mb;0CWg0xt@"NVs炿֦`:cp[^’z=r#ux5nAV<,9ܦ:GM *(J JS+$&51_!5&{mͺ6b1/Y5|4g8+@ZarXIiug9v.*FN@t!9XFDf3Iv1SAZ,q`ӌ8N0%HUhH^9>f;uo]x KMv̍AGs1!"@6@YPQư;QzɁ+k;e5-CUu.I&Ej `ƎEhx#BB6<mYAO c-d%IIԺp xS6QoWnsD0);5֏ 7WMʡI]h_'- S21Q&AoxIE]j{(4 \2Sf"B/VFz%]Z]3qLsGqTgS6Qo_nses`љ&sZha/'HVŨL鲄 wbR.nrgnabHetlLeYAq40oԝ1 Ъ Numl[XE]n뙻lU3hx oAq4ʂh] 0H*"y*e)h7+7QQ @0@sK! u`?: V%p6f>t|Fs'2H">8 VhOpa'UtNd#.Νa6f.mE?9F^/}5q\&v~MZv!NP\FD^7;[-ucNK.~˶϶l;[ٝݝ6{S6Qogn3':ȧsW`a KRLڅ 2;5u:wGu.3AjQ\QDq=hZ~+KQ}/um?ԘK ,]_! "u!όZŤ"ړ:A OHns'u잃э#0/ &{QP"<$Qv 4иQW\+J1a:ݹ"@LvKC!\?eHK1UU Qu{OEօԤdGHOq/V̉In-T>hBbd(6*INFe,l, "1zO9BwbWEPcIJ5$RLeRJ:bUfOoxF]v;Ûk@pX7q\ECad b,)VD-qu'օdGHtrd˦GV q<7x\R硡z,Ťu,Qܲp]օldGH֔7u@cP[)e _20Xy rv=sU^wg ij} |oWJ vw ;H#%+c#\o?5/Z>ӦQc (廟>]~[ %^zciH]amu~_<x8㎀\L7~+dAWOxZƭ}lWoy̡im$@[<Ņ.1VyoF. `$ ow@i,Ci~$B7ȗKD]~,SCx 8ߗaej/ m}piNz6L`ZiZ0i+W8r&=Җ<7u:ۧ{G&іl7]P~Mcu~^ḁ/}r݌y[(ΛU¦`t/)HLcxvEnXiݚ5Xe5%dw/u ܘ$,0VHhp@<5Fyn[<}j@btf@y}y\˽K}9nB=Q֭N<4q:j{(9 6G+g#Rs`ε5;+/15$[].\.J%'ZՉKNT,VW/9uؗ6*s\5Ļ e;]vm~[Ua6GP'%'5Zl_r䌚VWC#hQAX];N6x;JFD3wKbuESn b,:LD".P'a+ⴻ*R:bc~9k[o0ˌY-VW.PGu0ZkDriu]`\I'8hu%٫{kb ̂ h\1yι5y\9"vڬ.NR]c!taiEu.P%ϱjQVW27MJY擞ny|hQ]ƥa-'N5O͕ (\Vu vXO[(k2|U|Tc+\XȑI֖ gRGZfI[][]c7Z]i(I-ʇa索4l)fC=pi=cvoUι:.PVܭ) dzՕxvĿ knQը#RtVWd>7yN nfu$ɭ7pqniuG!ˬc9-4( bVQd꺊lVC[b]ښVִXXյƺ`u15--Y]kV["]Z5iumѮau15-ium.Z]m-VdZc],mY][ VC[Zc]ڒյEhuZ#]cY]kVW kvUܾյƺح5E+YBXայƺg_ յĺdu}pkuBhkX.յFt3FcKHUn/i[UKhY]Q65E+Dkuz6>յƱhu::,vY]kVkVWtۍV隧fu.Z]Q#PVd|lVR"V}%kukuꊲeu.Z]^յƺhuEYH.H.kvꊴ%Z]qkuꊇnX/ѱY]kV:=A@U$v (umKY%Nb: @F1]w." чC9}RxEu|ljͩ7;7Rp/@]8ݵ3i{ܴv2VR{5ϩsM޺ >zVӮpй@@owVqB 7s1dtH ʹl]x KMv΍acpHb{ʅ Xȷ8'XbbF`pjQ ODɎ޹:. A^.p|wۮ"U +\NbD*7qzsåѶc!nrgn #zԊ $ [s0'rgeF RҢph^Nwp'߃K".=atp(MK*Ij] #{VP,ͫ`x!<޲蓛X祰*^ J>0Ҹ33h\JY*V ͨS{tօ7DH6`!|) G8*?>n TmՑ\(u6Qiղ)h7#7Q1EP*s(ڊZ ; ZŠ Եb<{غMԛÕ0oH!RNlh͇u ?|  {GRQ,a*ОI,<_?Zw{pBp a.i9gez*b]QB&yqma%(i737Qys iBKG|W~Xw]K^ck;sbb\2N{oYؖ'*]ɬAO<nG %v-x0EM^WKXRoGneTijPHRe|{;iM\\M.n.s΁yKPnrgn 0XSVäߺCGrQ.kQWB8PU ODɎ:>@(*/0BHʤ]:ħZTI=Dw2u%w٭w37q8$`/rY+ys_UERP{1[H@Ljt ww.cn XQ+o\%Z  &ʗ5=hmP ODɎ޹:VfAL!ǽ8YL. 6eHMk1zu.&=vT ODɎ޹:%'`(DJoq'/8>KfYԂ\25жK虛||]A+Պ'hrP*ThUoX;CGQ|}`J.r[Egs|իH u,kF/fMm:4΅;:[^HɎ:G^_Svu%sS;=WsUOaZkoO¨6խ$F}A@)t8a641fQG= N"]IuJWοvoQ䄉NV-@V }Rs8q:p:['wJ4l0AN|Ȋ'C]@qc9iUL=C`k9pס,n&&7z&6sRl^t boP{$mRV:VC.UgtRogno96ut09{jc˟gYsOj:$F5BօdGH-  $ ul0j^@0HZ:QM06=pw.yc#ZGΈn|uR yX".2:cT=oӛi4>R=0G}^ ,!>h#! `h'wa59g2hu<+m<4>{uᬚmu"{թcSUYD1FZQ۔ H׼: 1ɪ9.c46x!T2.sDcux+VG]^D>%OUL>a^Hau ]&P~$ @fQu`^ǎqQ(:sd2ۍŨc4vI(c &dŎSF>Aa5x8tʒ0:HcCl8/U| L]H҅{QQnӸ'nVVqn+-)^H5EL :sE[u4C`JK[|b3יc8{zkإ90 K@p`+ڰ_9@^s01ǰn]c9O.'a,RW^hm`kOh|a|fK8龐B=u,#Ȋ/;ܻ9Ju9{ul/GU3ҌG1〔θ+Di>f@ 6&jy %.&Sle;<uȹZ|>dàgu2Hu>ysfkҠN9 T%NliN>vԪ%X9-%tgTe pZ$9AvilG7n,e9JS@)p&X<k6Q9G8 q\WkuPh*u |kJ彪KviC@lW؟5϶dw; #"5eqdL:#odV`q;]”g42d @*T%kYg$I:Yb <: .<2\0x[j؊a M+px/ u4 cH]fau3ޙq/ ANkk[:c~ڼa86.^1WˁoS wwұ~pKuG+t,Ӕ'ա.Ց-U[Y=֋ͿkՋͻ;0wW碧]#=sͻH᨝wZN8jm<ZۼJ>u wN ;_wYk{peEË+xXڼyx =jóL5p< +Mv8k5<,{;7s*x\6/қv`\۵yxR轝w—lstywxu'>^?Y(=C< 4]6.җli.x:@ّӿk%>V<å˫sxDH+Ks՚~^Oe+{=yyWou:} hxV:>ǫ'&=>^n9ݧfM/O>p;7_oV/w_Y>AtK%_>^[|]vm^{9GE>ߕ@'խ]wFɽi]T'x:@<& ]s.X_KMuԛvH.\6/͢oeߎˋ5M:i=}lyxxT'-޾zWgGo_\;(<}/rL~<}/)Ӣ=} <+x¥yx]lxx]&i=}qK~6<}ב5] o_X:Ў*,wK_[xx<<-׹ߝ/ֹї F <}.c KukwK`wK` mkxl޾wb ӁU.̓,5<}/a!$o` /{x<<-ٹ58l޾we5 g#iT2m%88Q3u8o]즇ᙇm+x`7=m\k;x=uV+y%>uO>,P NqUS6RﲣwnbKdMez5pȊ[-(+.nPu.h%K8ұ[v".]Tyy`|g˕l~XZ8$-Xu*A( l-O<&7z&\XH~"l9_9(o{o,X:i5&t_6.*u)'^vrU^f1x>'Oʖ ܬp@A'^~lޗ5bԽTխgf4Qogn΋ص 욲P'ͱٶN(5x x]EnOe"5zj(^~aҒ@*e#ՠ$:w1>"z8TZ .p|.ɽhZzs#u^)YjPkѺEk W|ujOcuA]܋WK6R[IyYMM,в^cp _Nv,ZŪ.0≢Έ(;;[zs#u^AXr5nc,;VG1nZDuM)YZzs#u^M%h f Dee9ΰ`5&x΁I&[R,<&7z&; P+iF +m- .X:i5& eiFl](jYx%MnMTySalf˰p@q4XVx Rs⤨S#-s:dօldGH/^`įThx[Z;Q/U樨wu!(i+7PE!{K#Ek+ Uc)-X4V|Tbf>fJS x1 T$d?t?5_wLzn#`W/&!G[kS6oX崛荛2/TWMu C=q.U4V AyQ.X(Mb^y]g0|̿!YR1Hi҅7qDkVUS2GexJ%Mj-yʛ*@+xsƛi6<G'.|W9 CGĻK޺Mԛ2- 8 ^8ص]e` ;4glN]#t'Urv=sU^EUL$U =d/8^#hM8,XE]n땻2^.Vǭ_6HT4Ȭv> 8)K: '3&tqϚպԻ2o-@v`Xl[]6q܈P%8Scs&{o]x&Mv΍y'Tz 84sy[k8Ŕ%mQ ODɎ޹:Uº;i* p(vshs?8˗qR׉ÛSѺ)7;7RyX ޫ2NZgA;wx+je *@}+^Ѻ!SownoRYt[1X4:ϼΪ;Z+@1Z(SUjԛ;l.OyѿA;x Dj{' `l~0r‚zzN:tߌ'BmV# 1Mή /HqIERb^[zs#uxoxuwuA8 re*:HԒ:_]QɇօldGHޘe5t5C-΁+:qq-x ǵ"6 qOr?ԺMԛûγF@ở‰'&vYT)0L|QG`cS6Qown tOǭsaCKiYLYąZ\lCSe,<&7z&=DSԨI+6sEtޯ7hgGex%MnMTyV $ "nz\v`g|+ F;Mx :.|2F=;:[zzN&ʁO6/`]eݏaڤf_`8":[w *Ej [/9MGCΐ:^]Oj[QQCZ$"5zjv<_upWnf0 qVZE,s}hYK- KDɍ*j4BV OXFsN:V M4SXafQm KDI+[  +Fū,lo5E%]}.%gS*QoR7nhNB,ꀃPfS8դt Dxy܆@͒o \ 6q :Ի/wRc[ ^*0z; * bY)wgж虛%r`s\mSԎ ZLra3 =i1 m KDɍ^*j` DUK=e2X\X:ErOQխma)h7+7QeJu9rvg|=ЯRe̴㏦3Hԑܣ`.й?R㰁so]x&Mv΍^E@+˹11ޠv|Jj|שBع+.dl Zjէ*/t}Go΄:^OjuRKp1z|,hMԛ3z'g>Qqw;/PS6uEѡjA]⨎/aIɎ޹:wbT@@xSM~,/a کQǫIѡ.ErYͩ7;7RgNÝ# VKA3o\8$c%Px URk8srKz#-qf뎇lNɎ޹:wrkJ bMy)1-X TN ;i*[եjYx%]n뙻2zGU jTΉ-C *{U!ΠDmTAˎ\Nɍ^*Wj("޶6ng*j0!VZ@+}>L-ԕFȽxԛ3zĤ,FZ5Ⱦ udR8݊ ^ŐT^6ZwuǗ.RWntfCP.15޴ iXf+-xIjub|>42QWLjiM+_CA"LF TQǸ`+-X*)ZeHL"u1+釰زccY(?pz/l YP:Q8MBBO!bpVئH?|%FO"\,HW-c\'==C D]Es]C*QR7nBY{\:Y9D^g5[yۇCd$u"n!xԛ3z0:Cq\Uua,6X6C6dGH;R@`Hȩ ?+}Uq\UC j6ׂrEqT/ǂ\Nɍ*WR@(N]UA@U 1q@S,rMnMTyy=)&M)1|)/Uҁw Ȼ@}{޼w<*wROY~w]AoK]O_c9B?W]g|&O%>t??뻯j,t\ǯ0k{ګ[JƉod5':ԝڡx^yh[z}c?ɽ|ua2jHig&=..3SJ:&r@ʩ'TֶKܣnCKpYź2H89ЇPekejb}Bt吞d-|j֩Ep{|vM vdBٱLWe@V/]oE1$t;QFnK1%΁PAsfj+bYf53M47[F;D ɍo:6VLmPZK<{hFN.e$D@0P7̄7۹V(CuO؛)Vn2>Ⱥ6)]Ol^#; Dzkxpg]|eɾ+&WpdKMh3rniK nd"Y)\g>imIZp*"tݥeQ։4C< W=3W Dz3tq˫:hX7G}EkaYKyhv;2N aH&c3Vd3\VZBm:Z8 Qad_:ߵ%72rP,+!~i 6EoR'YO%[1QB B(\m}ѺHdJOT^P#'̈-~R}KoS{9\"J8;W}f^hbyR8R&'@PWO_ )m`*jy` lm ]O\]q#3 Ų}n\4>C@ke1Y-@W Z^2S/ f뉴g=8#U̮%P.rf%/9P*vD}O)GA׳I׶_ezn]zgJXvj d[p 7qeB93>/6zm87W Dz^&GeuO( :|biⅹM*[hf׫*bY N7I>a5 2YC_hX LkI&|UOm9 V vdBXv7$vs@&Qa W֣>hmpӄrKfw=z\(3;e5`&{}C},mHv*~ՀΕBWH-U<Ƴ嫄bY)_l;_^ptըt}dsZSKM wzP8MK897b0pLnHQ hm,„jQgw=z\(Nz$`G"D`䅝WWzW6yW[`e`Gv.Ιkѿഌ96tE0m6o {ذ&[6|RC1Vk1~AX&jWZiMZԃcx~焼с^AZԪZyFr|U8 +vBXvM+p6PBckds^JQrk Z륅K zٹP8XV"l柷D;퓋}O;"}|vY2SS*72sP,+Wp&}@-82otg&C4vә7*gw=U pF6 p:ax'zpߡ ^.;J7M*5;,nٹT85`qt6dn+>6E)oZH(E`'tU}BHCmv4UL(l?&dV՘ 2v-AH`ͮq

'XY/ؑ cىqK#mEB7iE2sJTEm5n1"em;Jr>vm mEB9b-2JE!!F#a*eJ1ʤ_ampNW=3W DzS.@ }@*Ib78i#k}p}ڠ *pr 5r0,@ ľAMn'Y4iGa5JLa_6zę]t'r˄bYFJDN 8š.Gp`qlu=~#fgeKy/;c?Z~,_)C q%T`]}w?w/wiP?~?7~zzO`P<] >_ןy?},d; =ƨ6HB i[S+YgP\{ŕfd`9ZAxtq{_q G"=Gmw"H}˞[㕚{+7zaw DzS)?da+Q6}HnN)M+1k+nd"D0[r8mо*YКbSMj7) ;+2 vdB@3^p[A4bJ&g\OFˡZSܹ2:e|>(.}G& 5r0nN,9AR50<9D6C-Ÿ+[oi9)gdFF. %+n]?@w>$m8:_z虬 "Lc/Äxw@n l*M *p7t @X%.M4ѼsvM vBܜXf5+рE3(Ȑ@FPwgu}(kY{4ЪGbf%]zbٹP87'Q H{mY,]O8:1dMzyw--qv\$%$HwlA><4s=ZH㮁ղ.]-p.=z s#dij# AN:xwVY dM>PIW R*)4d;FV.͉$ 3|xyێuGiwX+]K(m *6z{;K]K\]p## Ɉ#q\[p@u9&_QBIPqm]G栨9D%5rr@nNYv$@N Z|09B]!UՔ\ĝ6+Qj5&;rpnH2G =]Y+%JˁDMi.ڮmwPn 0I@3_| *ԖkT1/Am4S4]) ]3}\|WB'E>&;spnNŔ- TCX)=Ț2 ;o;4;2N qqd?*Fx *=`Vنׂh`#s>~ !p mW`H(A^&6ɾL#uDupBXY~v^-J%J+jy\iU p+yp+f@nM XKE`%Np]ln`G^. D _BAd#^P$e>m)nzłv[Amjwə]\nFf. $4 ^5pީ$ ,EF5=r}{XM]_LpOᶇ)]zgw Dm+[n<&86X-GvjW19`<(9\m'%W΅¹NRHl֖6.M {Y/{F#UH4{I 5r0n@*.YnasPs^\{Rsq7E^;?(.ƣzh>K]?.$ksdތTܖl'g:ьԹ-ϛjD|fH9|I;spnXK>q\n;}0JRmKuzt$9%gw2قw 6H&Y.=׬:+;spnh:⾍GJQlz|ԷG"m㑓9IH)Tܮ%P.rN#K 1V=9IO q^i*~a(蓜sTJdP87I.!"Ear6蕜4`d-qsem`qQp&9(5ཤ|wbl*$kH;3%!~8LAę] \nFF.I$m"eMY6۶]Ib]\u)5rr@nN"9H4@b$tr8h4̀ܚ* 0e8FE]O˶3Cԕ¹9W),WiKd#MK+MR/ɹFEę%mWົH(7'K Iɝ!8x+JtI2_bqa%W̅¹9Y1'i4y9ɚ, 0)yut7}8o'mCY΍"xjrƫ2Y;zSt0߬Lgw}P#+DS >}LJIӜ|g 80#P/R nd"|2x\ @hI\!v" Rt& K sqz҃ubn *@O#}=P.$9'  ;h ;svꅍ+vtP8- ʁhݾU<?{"`} (k{Sֹ,N.=zNƘYczKHPĊ}+G'{Z2*G`IAl4>l'dYb2Ǚ+mjB UiZHNh MwB' ldF(b\G餭'z3DYSNձWd G. 1`vtP8Vjj[wɫcw,FmSGKOl;sp: Bj[26NGkV٧jC5IO3KO\]p=t,NH|<{6;lbpE2P)MUÁYޚ.]zb1 Dz7i|0"F~j YSΛÁaz+yߜ7KOl^#; Ǻ7.D Vu*B"zS%nx"XG/m[A?pnj3btЙbNm$Y@rV؎?òA7(iXK 6Kᝢy'6Y/sp:s vp8uAp<$]2[e?ﶄ+k@8Cfpzb1 DzpA@Į!&ڐjmbUIѫ\ȧ:;E;d`Gv.u?bx;6<"O=`6a 6O7dQo䓢9'"ٮ7Dg"D]6L$5]$%XNk[>m?%z`1 3`¦l`_C=XmkNW6m!r6PZζ0mD]ln`'u±D,VD >اKzOV 5/ď+ HtLZr72sP,+[яl@Hd@_Ȉ]-5'X?N_ { >m]ln`Gf.Ngɺs;HuY?u!,UܒQz!,pwqvM+v\'( [e@$j*5讓]q>q'zyB6j*7fv-p킛2Ųr <(}!#XC9mIdۅM3x:A;&M28ʭ%S<9Dpz#@eFoZYڋz\(([`i YzmP]z/qLU*K߷ᝢ$&;eNgAo-,J -Xt{gN;2 9]pN\`|sd&5BCO|O|߶Ǵ=havfNӳDZxbekٚ vdBXvф"6=i_[kIK%RЋTz 0m#qf]d;FV.FglVI>hμ+pp{m::t'[6nܑMcgv-p킛,23Ƞ 򍸀L(6Q\ Dѡ{p^J+jr\![[Cco;fػ{7Qᅭyh띜mjᙉs!'me+펭wkf^h"?|ul>^4/ }`k!7n<7&vXdJ܋@^ &씐.z튻o!}uv*ȳm9kYSY+<*by{y<酋+e?eb<}a w⿾z8e$8U?|/ӫzv:Wb;Wxk|>/̘:/E8o-ۼ|Ou~ 9=~2=?r;hfƻJhןMڞ߿}Q;6yԑ~|_a3F7ug# MOz`O\O-e h?|i w>1~ǃy[dNj.$x6~~Q2эYCo|˿O?<+>P-O?~1 'o5ʪ ,u;GT.Y0?,g|?#Z*nF^J{A;6wOm|˳7e>Ř-g(<}-xH,u#,?=TO8/}|`𯮺ԅi/_xڞwKm8/{#S{|ϯ켁[~^g_T40˻ל75A^*s>_|yo.`W es*;?-Sm{ނ# ;9ۙ=Tצ9o9>ؗ}o>~)prS]~XieYm~'fi/ŧsgoϓoG\O%{F~"_7\4^}"OgIvr߳>8=bǯ ࿸FY;_1$1.endstream endobj 278 0 obj << /Filter /FlateDecode /Length 6279 >> stream x\[o\Gr3Scv'}l "$#KrhrdESu8,SXSӧ/_WUg~ܘn G:oݼ;ĺl氉ƅ9؍%nc?7'y'v'fo'6X3MnNlA$ĦIѕ96A Jل7AfTR-(̹ `8"5jA,eRQA-Emt!N}U brc F}ZUc Uja]Tk 61;`kVKVΫ->[GC(U sz VĬ $%ZRȫGRk!.l#ۺj-jb9VsZTSϵ,FPl]Sj Ow1)D HpQ` zWYM֭ZX⻓oeg6!v9zWWZ cv{ BQUE6 l9 y&؄V%^Xlc6c7_^\m~y 6O/N>;Gg7ONM, ˬm_ Kx8S/ j 6ΕEd6$mmH "mX  dZF냪Gl8X33WqW-~{HS` 8cCh; RH ($gHP[XO\)?ɸMR+=3bbw~};}C_7*3H´0izף  $-XA^҂ζ,$-SD [TI B'in9I 6VтM&N`E҂n%-Xй_h&4Df4i*@Z@`!pP$-`a%- JZ@A`Pbṡ2s*c>l|P Z|BT'cod̗`U̗$F|1L똏 s9uN9 &Z!RRP5*V$TM Ԃj\ Ʊ%1J iP&C `ڡkI2 pb ( Xy%*G:TA@޳A5XTA{*|  XoB>C )u >TAŁ58C &`bB ,:T#FIE@ U.U,D \vJ. ,; ڊmmE"h+F*"/h fjuڊT^mEgXi+bmAi+mIA]%@[c-)= !@ / )h@/ !@ j-HAB}" _ ABV#_ AB}"h@|@R!@ AZipA@/X kt/⻖r< _@UJ U#V9bF'Hd{X" OZjUJ*szqc GBi$m2N R8z8v>pEc.qr{38jsQG*sY(˦28ʮ9sj(Gq868HpT<q8QTY8Vaa s਺⨥ٽ2P^ dl^qXs :,}QOV<QOVGyG♣9* h8bf Q)tZQ!&q^UuXF9*GEvQю{Ni})_F-/ 1gfOH齴=j8j`jXTcRTcЩ"SEN5tTcЩ"S qfTS7#E.}YX6tiW/koQ#i_#fitZPb:?2wtxn4CW˫tFgR)x(ܪLjGo1AX|,0A0Rvl NY(&څ l]xY1TY0VNZD\œ}FK;Guw"9]&kuf؏Bꈇ# Ԡ+:\%~ñ\Kp?%Qxؕyr:opsuT :)KVGUxAOʟț~(q TH>0b2W av} s9< ysGҍŁЍW?jtuq s f0Z7^jt>GY|)*>nZsfoʛFƬ9iٕϩ+aru);O`cӝIIn򇜦S/-5x;noߡrw;9Orz v\~u]c2}.oiCjjv/Z ڄiBATs!isȅi'Z<)?=?q(vHwaSꩣ'h_VFˢ_$B ~uA+.izij>Mp{[ޖi!]嶫/#Y=:|S}lҸűM} Gr_3C7`e}N}T ,ց EH2+ɋZ31??>ԣgϯCpdia gd;P3 یXGn j Mh:`w -v1-^9vsszC' 唀o[tﭏP]fہQpekqĹ 5۩lU_hcJpoo`_V;=k Y CKb@uvZX;šVe Z:֋9D= puP i 8%|^#*+|^otן7C]w99H 9@ GNe}g껗 {P:gWb`PaxÎ*wrcVĞ/ǜ]N%r;ûS<+ >q,3M{Nk׈0 FtrAp0`򉰞R0$ŗ$`p8@BOJT)TH& I$us;`0W* *GEj!9[=IKjqgS /TH&6:8t]'' Cd`[2֠BXjk=(/]Yo!3iT+F'78ݓJ}w'>^wH5oΰb]om0YY ,MusX 7gxg03mݗ R.kX;5n;k!pik8+(aP FwUOGFDZ:~4!UmoNL_5 !nA _S-(|*;1> zN U) nE{FNLS jznIqR봣X2OB-?jydLg.䓷\lgWyŢHYJ5t`Ń.#=GOhEJy/Xxsz%䶿myԦ4W-W|j3.;Q vWbkB…^ubjsϲ’kV;v/VYPGնdr+#$xt`R sytBbzݸ7TO><($ f.ˑ݌WLÞnP(lzg|S##&a^${I扗ؙGLRmY)3z`lbك9[ЃX Q^u =GL"1ݧA ۊ>) O>Qc4ʐ^ AH(#]r;~~CTxFL?Bdxzuyu}~8~'=yjӜL^Qqz?rCʚW^S|[Se'=2ܳrs=0{h \˯?>?~XDHym x̶Wm?(?B+endstream endobj 279 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 388 >> stream xcd`ab`ddM,,IL64uIf!C NVwu0w^{4 ̌YE% Fƺ@R!RIO+19;8;S!1/EKWO/(ʼnB e L,g2[мz߾[Wa?g鉙 ꧴m-\]Q;7sG_Y}[n)ݳ9Q-S^;{I3Vg80cn7Ǥe%y9j⺣9?pr|Us~D|/ZöSy=g7ޞϜóki=z'L endstream endobj 280 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 403 >> stream xcd`ab`ddM,,IL6uI f!Cw܏ެ NVwu0wS{ ̌eE% Fƺ@R!RIO+19;8;S!1/EKWO/(D,o&FFk3qZ3;cɩ,Ņί]J\Ï7D{Nqyo)Rsg-3InSKus̘ݖY ?.[{٢uӦT&fF̽pBKtݘ;HNX#9%5xn [n竞ii~Mf?u[2{GϤ ̛4yϩ&Oe`՟endstream endobj 281 0 obj << /Filter /FlateDecode /Length 7439 >> stream x\]\m}` !1^~XWI홑gzVU$oJ3weCVa﫛}ۇ?_/nw A_(ptvyܾRݠ}eʾt)xٵH-P+ߗ!@-|,,(9CEȑ[v9⠑=@/T 4uA.'=wA#+j qo(n""xca#P6,0mj`nb`n]yL ]fw4?nv~@ynۡ*ŷBWhKw_ӒXr/s뗨# ݈ gR9ogmI0Iaf -܆SKsf_J+ .+ػ+rvy{aqDte6VuŲɖY]GYV0d&CO;E䷰+*,7}ʺ-;#!;˯߼9:^ߞ._iw?a 4~zpfGASǞ QPEЁMSLQ mQ;wAA= $RQx]P'GĨ]'G]&<}4z|T@q.wA $N'ډݪU&vD6c!/+g؁c( !v@6;<;x/e&v8K|f3bI;_1P)@i&vW]PB#ĈBe D!AUB(` (` $B4#$8# =QaX,( dxJVF8FfŒ-.#e֖0Bp|8zV|=C`F9_PXȌ=!a Ȕ<"M}lwFlf> `FS>BSZaFX3B׳*X#M03B :)2# N\apki=/2# a&Ú F# 1# ^Œ0HWaי@eF0q05`F3M<:>1F1`H7_ԕ=| rY ~m1n1bb1M)"audBJ~84MfF%YYHkVdZ 1 i-$"(EiդKHk C ZRV3i$"KgCA3f ې֦Ik96YNZ5Z4.0!R+|$do 2LZ%4FI!{kؒE787b1d'R4W7%';%p2*[9d[4*&n @]9f. ɰ=@lLd/x?dC@O?8]p ð,(Q CA6cP8@O6PZ6dױ`$T-#@Q H`jK$XKϔ:톑7¥ctRtDiMuZ'Pಶfj6m괵%ȫ.I&% Mxc 2r.ITIQ[s%ǯW'U@ys_#G+Ta淋G8C3@~'ޏV#ciC *K=[a_p Rbs|* I=i#`IWr|e s|b&oZIEZ 0Q0:`BJ)& SV,S<V79>щ8~Dhs|"3pmE=Y)d3f+iYws N1>)gF.(3;,'\56þsZO8s.+ӣ@C2}粩vD'r||5$>/.> 5s ֹ>4[Y2A}L}\IoP7!.nNCu-qIjL}^QaF S>N>. `MBjd2@TG|()a(AJ&Cm|:S9s⪄@͟TU$!]0'!(Us)*0U#`^*``.RD3Vz'`Z5c0 UjVoZLk`ZKl])gULj&UIm6[5zV4dzVIeAygi:YLן=MM= VBr1E.Pz%T-H)&:U7SL5H0uŢ=lrnV6(z^k3EnVU/ R)5!bdu[0Z-=r8_ ]yDl5V=V}![@wbr/HN+ȝAskSB5kSl Ƀ|G(N)4>򍡟Lm  ZLͥ(6y-39COxx9`SLJ`r)JnUM])=UuҊ*Œ*x*U1(: 1)}[PͨBΨfTY/3s*us+6 ]~3}9ItްN>JU`TZ ,4 -,4EW]EazRXzYUTwx0 I1 ͤ(Sa! dNX =Scz,,dE&f!7DP,IQ_taB@0 tT<]ru+lx#dT˺ZիR֕MycF΢1-ZFjYWZxc {hjFUFsѢ-Gzoʺ3+¬evuhS[}DDTdrY>GrsH[}>G4F+eVYNpx*}dN9$s^V9_z[R >eHOLUfw}6Sk'lM٭ާL)ƥsU:% &r^є鸽+CoQ J<̏T2 <xK?f$OGrDSsHv>WfU\֏.Q9ek)Ybȑx2A<1uf~s15stf9rYb)хWs(.j< B(HլZ,H)YV$KjV% g Ly h=3Qbi %D8Sj{V%l FD啒%*,QUhJ(%z--sפpd^9Kk ^ЖC.)@ m^>I 10mxÛ;(yAkk3 y%,O%eA> iSd,}]5S˛@BTקW<e;9/oO-p~'Gn_.އJ{BT"}Ns.L.f? ubŷ$nttI2-e?>T&}vonhږ{ U00c(myxv7g˼>~g?]3\|uzDBpـü}켾Cڛ<ϸy݉M]^71/S WX^k3 ?/L>NtUanv|}6.F0\ r1* q !WE?cވu}iCQO,s HcF OzKoޟ>Iy4,1 أ 3+4yͳ&I'$yo_FJJ9r v?_#~x{;ǻ͓yfBth~3g0vsw  dv-E ,Q lXJMx+w4Щk i }2u5a6gB* Vشp`#p=:n{x8u!R8_H[0P-6gnx"(o+j3G3Sﷀokۮ||Ȗ})]oayN̫idW.7%M٥^+=!zL2 vGl_X'h/e~>"q$"ϖxWl,g9vQH{qᵐlӠDdvi?>9ñyZc]2ҵo_=>nsw?g#tzݡVy緀;p8>t+WL@?oyEѫ؉U3:3:Hpm>a:x3XVVEܐ &WC#KHt dxnmn9!@'h2'OwgB:}ov3hVZQts{ jzQB9o[UŨv+T/ t,73V|OqI~8V||x!^J$m=LX)~s~n 3su1y𔮼>k)p8*>?^d6J""`+Em b)3xqOPOoky"~ѧ>\ׯo=[CD~gDgp3 *9ک^RW/iwE)]zo82jO|tv9]Ut{w3@'3y^Lcpb ^*SQďTL[!}yz205;ϟ>MO[_ECU E`Zx^>ķ} NuCX~(sp ph08L,#M9jxOQHp˯k_c:)>qg@l7S$_e֙Y  c;Ejl1w1xprδ)$T_hOc_{ H#)jaOi?+bI]jL%Nendstream endobj 282 0 obj << /Filter /FlateDecode /Length 4737 >> stream x[Mo97,% jA2H|]b0ОC,[5-r=~#&)ؒ+#|/Ed֯7gcg& 0l|i(_6gi7 ۥM,v͙)3_xX0 /v^99!粃jTZCy2TC@6D(cELjj j '#cG(lXFRyiSI;1R5$(uu%ɷAe!:GJaEqβ/>K=3(/X{;lv*'lb7d٩TFh['SJVd,1d]Vfhd Z 7`\f>  g?0M-6c+/n\_JPC( ǡE{̵P& M3m\nV^FK%l7/ߜ5`3C]|ys۶=L$@|;T/yח3L P/h 0tPhΦ1F_ ;&u3Oݲsf=H<ɥ! QOet1Fੁ ; o[}Èկ:dcd]l|Iɺ Mr_fJNTYxpy{z})䴙@܁@Z+Bs4asRyu[|b 0>|y(.1b9j4C ^qh B&z \u'SD 4އ:J 쾤ky=qc΂d{ jyiQuzǮ)lG ۾a3y$u}ڥmnưmam ۞F ۞L-hmϮ*at۞}Oö, >X}9lcmla}#}3=ͯaS4m1La{԰-)l{-8m1کm11lǰ-g^7ΨRnQnO>BJy9i> j|@a~UF}oƨIQ_pF{eyJ}4egM3SIQj/>1H}D;J}#R]P+ŚF+67eѰԇL7Sʏ&DkG^>=dD/[F/y> k~(:1L}p6F>yJ}ph)B>8膊;pJ}f bp#]1߬wE aw=P^E/ߩ!LS^:%9RԓӬA3D4x.AmPgCoP'h:urюA E=/r4ɱk\ΗFu6شe7A 8%l*б_Άl0r2blPgiu6lB $q$ s$j(I`߂ZU^ crJB(?@u`PvLNks -t[()$r?[J` %]ͨk(,C(YQb)yįcĹat#8B A_L(1Ds/ R_L) P_СlM{2䒣$t*_EG?l貲 K>RK"=)P†dX{ȃK;>"K eʞ/DT$mè"IJhU$/4]dB45CjφUյ QA2Tˠ D԰)HE뜪 )xMARH)):fJ{bM9%MH)cޔ<CW J{y=4ӞR$Q34'w Ld^#S~^R)}ZTڧ䑤GگT_H VhVKE74i/UaXi=goW)ssX!M#9v&2kc/6؋+JL=R 3H4vHrF6'vUzzSm eJCUGӣJOsGޛSzJ-aRkC){XFzJe6zJ)'`\GzJAi'5!'z|'JOOzkeHHxLaOz[p>u)KK{$äz}e| 1FOY/PҵBh++ެXmJ kei.+:6tBYbˍK ZY46 9eP㗖J.SP&eR\ 4JJZZ90馹3:\ ԖkE͵\0l3 +@od҂bE +1VԹ.ub֗*=˦UԵ0'QVCvvbgSgSh:̲) =vDr^nՊl~ªeUkɲ-BeSޤeSʣgSeSV`TMt/"KZ6E&-߆dA6 Al%!Yi@6^Q $42HB* 6c sJ)g-)ZմZQVժ<T0Wٵ&jEʤV s-v+uץVJ-,QKA]jHLjMjnsm[ݑF% @` C&H97Èf}c œ)ǘWv+ . xZSSy2Q= \ltgwtF@I^0x-ΠΧ,Wm2A$9<[pT,t9]aJ$y(r8V܉Fn\ '/˱]Tr~l_\01AE4p}Ma9sӲ r{9\W[{^ |u=3р!D/nJмڞpK۟1}0t`+G}E/艴nn Lnx;Cߩ c_༗R^.w_ ֏l=#ᶣn5~H#}C{݃$Z_dOg!+/&zeG)+u 㶜G2͚r{>06,y7!BnD9ck27 ^A2 Tnubl0ux?}Ajr'N0u6I6cEũK~wݪDx )?ޞ(lW6^^|+*2dqBLP+4{#bip-0m_Kцp*0jYI?8dqftZnW_:2W#5SϜJqwp{ ݭaDTIcw'ތm,sǏQu%ɡ|v7G`aL?ޛOq˾g*=" |@?H|N_?6t>\qɝ?߾SROTy˿$= &{w䧊) j^U> stream xV{Pwк{z>8{}kUiUx-I$@ȋ<07!/ OHMDQigWzmuL{no6j-wsw3;o?~e-8ݿܱC*>~6yQM&}/o +/r쮍.OyBrޗ=P]n %Ie&:?n{ V 6 ^*E*> E;;J6(JյuUPPRWPZyO`˞Kw~aXD*kj+j ׉~^vab+ʰ&l3<ۊm^vbY,ތa_s =\k֒,o1ώ ?$l.2Rp'>6r)vllz (bUYmт(0y)K#v8m32lfClh *@'g+?}e}8ZfiN=i-څ|IJʧ+z&QU{ nRr>38cq:,6;Kb~K<dBz?3oj$gq-|!^4#`EEWHA:~Υ?@6%7RR8^Ě&z3~5ޓJJ`j-Lܪek8>9:8f-vh"Z{yy>ri5ZɇO {}B/ Aw(nkM&[$DChzMcݤ򆄫eSJj[l6CC;iUi@(;<>'{R+t\5QZ6إV0jdw76 T)8 %G0Oh[(+dYIZ,e@"Η__Xu~d9̈́, 9ʉ>Pc5#5g``1 /"ot-+n<'q얌x-&YV "ȔS6[RG/[]G#^qqoj#eǬ7WSp?o@~ ߝbt@HejEf9>sq(WI쎵&F{|sU,~ `q;]g'nD(sաn2|;K]B1](+9ZW3px06Jބ~ܹ4EwѧK3ZS[jo3k… 0oz/9 j@~+ttbD[M2yˁ$*GW<#VU*Rӈsϩpq 55t=o\URW/N0w)ĿP^؎&EtE!afWM}۷ި7xF0fx?ڑҕ{EL8'#Q z5FF=T[6(_;=B *UYK\lI7;KJg|3lKI!hk}TK0EUFDT'K퐪 -`QjQֲM`"CI8<P5 \?Y~5 :JSnx"3xc eTx=vs#eX<*c0()~kOڈ٤4Z_1q 1SWnz!(h{~9y_q(Cmg6zLd+q"t?SmxUV}@p;IJ*v]efkڻ)ߐKzmnӁfY%ҜE8rdɹpc#Ya5Hendstream endobj 284 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 367 >> stream xcd`ab`ddM,M)6 JM/I,If!C;{Yed aa9|93s *23J uuBRWbrv~yqvBb^_~9P0SA#?O!)5#1'M!?M!$5B!45(X=?4 XS+QEV0012|_:"iS~$N&9~FuC[[S^ 8[aB۔&@adcc{Kwd͌YN{6Nj-9{Y|S7O)|B\帘Ey8yL3iB yxL3o^^WJqendstream endobj 285 0 obj << /Filter /FlateDecode /Length 10321 >> stream x}]oIr;m1?B`cËCfK6Ii(?;"3NTFFZqVeee<'"/wɿn?pN?ߞN?qP'~?Wgo_Ayu{tK(o:a۳o/r'ٿQ|gjS.HCܸ#פ녏oon_\KSgtj?q㋟{7_Sq^͏|D*##=.=QG}Mg 틯BFL^NA9^ܾ3~d:x{k[oEr{{s.|^ q<_ھz!-_1roett{gJx7�|YA~gGܥSo>|B>SkRw7߼-yr_FsG-py34ίܘ6" ުijdn?c|<,Wsйw>kˇ;x5=->?SvU}LG&EtdXt~(_޼Iz x3uvJ!?Չ^}ΏǗQr(V|/{;~w'g8~(4s).? TJ5wO? ݟonNruOS)n蓟Sz)]ǗO4/ew\Wc@АGdǵˎښx~4ɰTo>vy6o<i(fon;] 惖NN^zxPfcM qJmNx!4N0ZӸ߼ZOu}~3Rq`nֶZ ڊZ !%JJL$q|1FA-A̝2VR Ov_>\wjg7gzIAOSQiWB*r b੘?;nt\4do7\q;|NɳQ,\Ott'J Ľ N7gC i;CZ)>rwLBat9tQ;q0 CtVϏJ10L-&CmҊD߈:ҵ!da#Ga:4JcrRGPJGĔ4Rss̓:8x'_` DF:[I@wM ŐJGе4tK Ϯ͋Ftk!nxà F5{LhGyQz(|cz|!ըG0ErҊ@'nxa8 D Lg CgB??OOd8¥ /{GtQӉ9̖EInxI}AU 2C%)G05?P{nxb 6nzOgfҚ 26B*-%m "<~l6@9 pj c'xrun8y Oom0*680 .*OٞGXP<  hW@zq4Wa!k"~5 '0Müqkfn69yv2 qZ;@{;,UoHڿ!7gߞ=DDسфrW_c`%1=&p(A 1|ᒰ#7:~l<5 4c8yv/-ѯ7~Cc/Sb +GwgXk r6LSRtJ#7ׯ_ߑ*FYMcq2m \)L,9ĒgD_fX҅HQ&ba2Dם/L`O~0hҪ K%L,(01*h21fBD/L,\TX*4%;)L,U/Da01b0Ti2k ;K³&#X #^'KPĈ N&9]%BHB&K- K<2Ȑ #Cdb` #0pabdO&#%墓AƟ0u zCITĆ #aabdL 012M&F5)-AabdYA012DPĆ,L W&F,O&6 uabd&LlĆ-L 8Ć!-Ll ť'Hu"V"#9X4)T!4o%PI[co4[cj`o%sNounJ3'@^Q/["x[]B[]ou(VW_Օj-:⭎Sr uuVD[]+0LouM/59VE[N[aVe[y7꺀. mV,VMð&2x8V6[SʆzwqVWoeC_uaWoeCZ uV6[[WoeR+RY( c&DsTpk!{R0TDm%WRD0@*'+VRA#L!"TLR$A0|I 9|N-V~Y=B?(>3ASt3HDD{U$jmDH,%J2Llݰ!ҕGN"}BJD"*"1FÆ J JEFD$B3HqHTC>&WX "i9Db 60@6X"QhD4 "!"sDU$"٭"QHeo"Z  3K+hpUD""8*AU$""{cqհ[a q FDD)%8"5MxQ RQPER$@J1l©CV) R wQ<k2CQ9;(ŀ"֠}:>$bH`TٰR02t|\ðb0OٰaM%J/HAgS @M+:$^$#:50El (#V>x nUixDƵtu㘄nyFx]ءLn<sRࢳi=UnJѺExAuNZ7uptךnԍ7n\uZ7ޣQQ#RQmJ4 7Ѓpc.6&7X7JƜ5O nVL7B1ktC8Ӵn+׵n;xԍ]Gş֍{F8W7@A7.A!n nGl0<؀խO@ :Da!(1@ƬZA I |1mYGLB 8l)NB x#3b$xBhWe,\EDYQD h ebQB6qqYbP LJ <}@ < ( b3 J[( Q}DkLaEfVQ"Qgmj,&k&5Ɖ0K+DDDXN Dx%&(lXWú X]??o6zQ..3 ;2ðS5.ljIA!H2JA%lu*H-t};>dTXndŝ x 5WW@b^qG\;6hpqp':,CyU$ $U Ht C'N;ܩ6B$lTA$p+^wt o +ѤYp !y$L&a Ҋ {AR-$,UAՓ -QALdh;Z $X C`&jD@Ҩ &<$b$*GnjMԿbsyjWՂwŨj ?͜; UjњmXji4_gV_~`c+,_gd\4P__i>i5u+#ח5׽H__Z,Y|]CU-ZS4Q.5KUj麂CT ɪZT2261Q-}`Z:<Q-xU >xBUK;5 lPPWՂԳJ5rn5^VRcAYfvI$;d2F,BvB ;T1";԰١p=C 1 J5},J5GQl^ř(Z{'r˥X4Lg"Dy/kƑ($Q4.vT\*F&ؔT,Dv((WPGep(/(/Ʉx`_ 86A162\r]DyknsPC!R9H7h(GMx&55L(ח Q޽)M"U r}#JRRDyb5$;gYMCk|FIck#D,aaXrVГuE͈(zB{A{aטVroS{i9 W"zuah/Z6C{Uj b>O eP!t WD%Wh/T{eLhcSUJ^XO RW]Љ_ffc&1fC٘O 葁Z[զj/T83 +yHnWN{^VҴT{l01V&棲Rưj/V>4$ `h/ B{aT!<@{y nU{a?  *Śnt7wxeʮ[hImn~$jhz "]jv|.n]nhn憦3Y\+4 vM%t "]H;nmbn ; "EPC@h4~ 3v]bIAv}9 392],D.bJ BjhU9E9vfZ b. y4Uڭa3y";S62b8fU_t]%wK\uu8b8%kc.OҘ.1ne-?՘ hVVc.^k4UyhLy9~[y)1+#Ȱ[u\vsW)1B5,.b.UWK̥jy-b.1]>c.pK v\.ҴLb.x\ ҐBE b.@c.::Fc s 5\(\>!ί-!#~73W~W}3v.’,oǨa;F^y9vʲ ߄\~ey_lpA1FMB6vͱin&[o?θwUϑ>˨c$%`2e6q0o !aSFT\ \0^@һqvjqm=Y5j)uQ;J6su4E~;q5m;{Îm|sfXMԮÍ8qq`{"4`bnޒKw=72v䖗>3?=z`%ۡk/Ё-ݬf_M+3͙.?ut|s@ ǰKsD|G/׼M+wQ-c7&j_EJlF>3"16Q{Ζ4FH/Soȉ.?!ϩvA„w=W+qrOY mY>icoKF6?oׯ_&x}}wy|=|-Ŝ __첧toYzi<(wEܙ9ܥIM8gq4z]|lݸ1$ʹvx( ۇ[}uFF?eJS9Qu㱅˲F|$~2u7'8徍irw^_ZyIs7)f懯ռ nޞ/=4NN0Z/~Ir%kxo^ş89&*6w?Y~/GOQ~UT/Dm?gd/R.kMJ,܋X 7I=7˟s5%?cɀ?i؀?"si.2 8 ~+~_ytfqov%K/ix\Jv$(b"V4D#e'?`\/O>w~rAr[zW4t+vWaL'K{%)sGwNLקiEތ]̓Roݭͧم*\5PyJHDnv$=? c0kpE L# ԃjHendstream endobj 286 0 obj << /Filter /FlateDecode /Length 10695 >> stream x}͏$mNt(Xmߑl@ O:[=ѾA"53wm_4Y _0##?'w\?|9˟;pXo\/EӖ}>zsXr|u9,ͫoΝD _ꟿbm 򓻹ŧ'?m%Vo~^(x6|~5S$rO9RDYnmUZOٹb5/Tʖ|-kqk$/O8_c@i$|[Vq"7jt9a|-{κs+<0y}ཾh[OT]Nug֓b;z[ye řg+KSٔmaP@| TXNէͯyTHOz8IVV*՛p~= ~zZTg"Trp{-Rb]>Q{/s ;H_ɸu[~3,sБVomީ //`;5|{D Y)?~}|xyT T!Vv˯'/x4dH[>cp*<onnUT[hMJuO{lkmr Gy誴X]֗7OL>_c^7>3Qp|UzHBYSGAqK[^^zjz?ޤDj2jF{/|$7Ŷz^Yyϣe搃6(405oڊNNs_]1nFUrSQꩭ.!+GB-~TZ=+uO[rT7MBI3lw/h(@kd;/s5\DDI!c6E|~F]mSyXQƦ!Ce*|b.l=WVs@B}Ͳ,Swڜ}M?>r)?!S#rvÑfTꑦ}Û_VRuyx9-U W~ټ/ZgjuZF j %:r>Xf7:S7U>[_f4?yy~a);riM8)?]R@~ k9'a}Wևt6菓 ekSL#*=^`B`y>-ι]YIh+bɯ>۩KN˘ya˯^)x4P6Ӎ)M_WNQ>[FAI_u̐~(~=PLqMC9M:%~w (O!yPk$n4y<3RSsRMl[R)#A+5d1R!zJ֮αRsT> p1HoȕSVRpͥ2,&DPFwr V[sZ nP$F/r4joT8Vʉ$JQI*4unVJ9-挔rT wX#$)c.o9 bepds-G; x;,3LOwn4 XS,NN(?I.-l6M }4Am)yoݷ l'/ۣە@xUL=7X͉#S/FVM|Bur7L1 HQ'3ܦp4 Nu4Z,LZ'M .R 6#p^GxQ>mS|s fHQ'o9Lp;J n;apD:9 RY|\\xvl58K[BY"EY$xL|+pD:y6"S'3N[ n,nڮuOp;Ѕ.,u+M@i,E@7\Kqre5Y>mfmۀۚ6p{o+l6p{d)-p[' m~[ᶦܞ n#np[mOmےXۦjK6{@mdSz[ ޶n@nMi=%xkJo֔S[ InoMi=%xkJ)ɭ[SxOInoIi[m 5mIrw)m$7-6I%mMr+֔6 )m$oMimnxOInoIi[mޒҶ&Dx$7wD$;𖔶6 ? mx;@mx$wޮsov:mxKJovInoIZmޒ&z m[x$7$;v&k]o#>S=xokwm :6wgفsxKVov5ynoxo𖬶&݁d-ynoE&݁76 t;𖬶6 PfTV [x<76 =sxKoRV i`o`:`x)o#Ձd-l!m3]o+t8sxwm[x<7wHm7o #󦮖n/CLhXy&tB}g*AG+A(jZFCC-ݦχa$`%4~[ɶ/ysGKULo,7)߬DXg Jk\Z`אJPKv+?8F1lKߵӋi[  v-ϲ0VRRPN{CT0աЭje0!q۫o75ySWWq!iy ZńSULiТPAI4Qsg5'%V{s74R(=A"[-[~D$eR6.*yQ0oa*-jgqeԶw=,]Ij,JO#cF"6nLʖQ%BTN-hgqep{iZBvdDgGp*FH cۀ)He$:ߝ/ݻJ%%z) R}NK:ik]mC=1se;MzlT̖V 0WwvdDgGp:m۸nStGNPW,V#9㡅fae8rwn0֟af7p\hTlvJ53sI w; CifDi9G<zjv ͎M4*W[doo| !q~esdr6ҝlY ^Ҝ2y>nmoٓ;>9ce 8E>]~R2(͕D4:8%|V@VB쇄jˎHZ&E٥Jh ('/]eɒ\/j%).FhutUC[ X W~78I, I;𖀦US,惕a:· j4x?[f?$n{Fn VS/AFo;>^/oD;h-up p7K@CsBs X X ƛJhmT|M%>, o[Kϲ}[ דR5]CÚ:f?ZvǍ}'WNbߺ^/ϯVhKX i|V@VBm񖪜AeǷ]y?h,[4tZ`K cC::`$`%4~7oHj |nQmZ=\/DJХ? p9u$NQ啤Vk?8nFmRM@)k뽼ym/k=WDhWVYhK羵WFχa$`%4~Ho_߼lQݨrU7ЗnI/Bsn?RFt:B%ʏqѶ69AZTO hC@{qҢUχa$`%4~HǍݴoqy|$+l$hUThK(gy*2J]Bf?$n{?͡6WrTImO,+AAiKSw]Z>q\Bf?ZvǍbMdT9?跏ƉaBs4N@K\,u u}> + +aCW4>xVe)JE~gPBmjd0[8n4ڢ5o\?leMTK=my:wK :>0!q۫oN^u'>Y*qa13{44tZh%gC)g)-ѭT W~7ˤ~JJP/ ^ZC|8H%;AY .NV5v9ҡ^}\ۋHtCS*AOmY>^NKDr&|Jt+T[hqۭospBia3Κ4PD-s]o͘`J HJh7>FBŹZڴm;[-ݬj䕤vc5tZ'u}> +T[hqۭo7{xF9]c5ƌ3JJaRl5i]/%~}k3&9o|Xo֛zy%i%`4X ߣ}0!q۫o|"ߌ:9jYݪm$k7p`4~|VDR5\[8n1Jk082.9W^IZ g' 1>C)f?$n{ř!h 5k魯or v&LqТKHH!g1NZ[v DŽ?Q dwG@~0p;i6i8 AqӚ֎6lRw)#3A'$Wǫ@;Mŕ۪E w8vdDf'4Xw}.+ZUeRz4Jb!Re!?nچғ-2{rr v`D-AvW. 5bN3-gqeiH/- Q=:!>Ûvw۝#6|ӸR)@^jtZ`3-0 4 `jqh,ʓ;'jz3ɲ?Oj@#w<8]$l8 (+ +aCW{Oq(4Z@BHVC.oJ|CaX Xhqۭo7fdVXg~Go>fKT:iJסPV@VBm=4ڶH(VTvq3j6u:-up pdQ:>*ѭT W~7Iy2swNREzP7[#+TIhy=4[qsWvD X X wlrrNppd_7-q$Xj%h4ȱto_3 .u%`Jt+UÕ-nw*F*'j)\-x ߦͳ\p%`$`%4~HǍb zDje$IC>&DM&K$h:ǷCsBs X X @hW'D)־"f饪SJlEZ4Hto .u%`$`%4~7ź*Oo'JFWzckuU"YhK%58!0^}[ЊNWM9Q k[ٜp|f\\v\\ُqrn:pDNib\o\D^g .\\ðf?$n{o , A8jѽ[-鶭6) 5 : 9.\pR4\.ۭod#3JXE-.Yh|08 _:f?$n{oӬ/əNhWL-oZ[`z\@%5!8544!0Pnjmqx7%5 6-y-0IEwHCih-u% .u}> + +aCWYmW-DzlZNs^.i{!8 |:B%ʏqvw&>]A}iZANh%h4%@Ou}> + +aCW8nm XoJ}㕤wV8 `9 HJh7MT^{\{d-OYVIP%3ُqX|qZΫ8+I+<8 `9 HJh7KF۠MnGNrST_XKUr7i-Ƿ7Cuu HJhhqۭo7o7`}Uc-+X oˠ^}Em$(Kcn4+wۍNuh5Ch*ѭT W~7%LmR}LE7yا9 `9 HJhշ?xP{S39}GrQǟXVwXc[׶DTݽj[q0~IEY 7+gs?8ueqp%)MI$3Rq⛺Ҧƿ}gy:~Rd ,oZ_UlTe>VG.z`^ÇTT6nDAZhp!l\Aճ-Ԯ1iyQwE. wϓɉ i8P1a*M6U4a{V}+jBT^7:ۈ8:m?4ü`Zwo M:ii+ M"Imˣx &xQ l[YІq<0?ny`k0||xy~<mżj}{ _V(? h>ߟpx_-ʫyNx$`">f?>^޿~܌>#?}fZ8ua~zʧ@=~EU7?Iҟ:PE7O#E'|F'Nnn#uƿK7B^tgb3t0^;*˻L۲2}7U,endstream endobj 287 0 obj << /Filter /FlateDecode /Length 14488 >> stream x}K^u+++BVrh#ňARٮɬ:F )BAtn|l7W|,_ǫ?Wl?<|Lv^?m/\>1Puڏlqy0mƥER2Ə;wl0}h;Ẏgj6'.'vN7 [xA+S9h0ɀs$? )Ve X?E޴lɽՎ,GIv\V~BIN=vQR v}^9V@{s c̳)&\Zn_|s;ϾENrŴya,J,ΏFN+QN\J]{V2w[ڏ,HqqlfjI{(c>ĊڬS/cvJg\|}~:=q s7ɵ;df<ڮ{ V=wO0$mea'~Ͻmj>,j}: z綁:a<@4=~؀-"}ĵEGIk\cYWav*W?ࣹj 7n]*l5ζo#jbfخlMpmd@m/׵oc1bʕϫ{J W]ٌ5ʶUg\M~irWjs8\_ z뗿|y!l^ƭ))moطmV}ضYNYnm\G-f;cuUpe侾ˋEti-ε.c44 sݥgH8[\9?itumw=c綿^n^}}p?U viF0w=ҖIv@#x"֛ @fSe޶3mSߑw HXl7Chkj44Z^~zXqN߂<>&;6ڝMZ+S lZ y`%`#l3(ؤuAN&6!Mΰb;6߷IJ&mtl/[Vl2y9O ~6bGlҵw6٤&;;t\"*&ٷIWeO6-xI"dQl p&} \MOz9dGqw6HBMhv6ٮl/dр mMfg1l +&c*MƂG l22}6L!lQc&"ؔBl2%}c@&Lol )`}``LTMfܞ<:-sl&ۜL6Y6;dqu(&Kϱ$/_y톚gpg`$O8KOǣƛ8~r IJۀgNq<>׉m m@)6{LqAn6`G]BR@pIF0q Dv[X#} 8 Jgx r[*h'}OqKO>ؖ MS.Ɏ 5u{8$IL"<>&^^ &>I|9v >ęIdfq&2XH|p|,G12|LB Or||zI@= %6n$*h3 0݃Ӹ634m ɘg߂=hAI 8fӠ(I J|\:3,"aqy&>[J)0&g@ >%RÞ?=hF#P+ >T%I|rv*FةL =U|;OfeAO6>&ƚ|R)JnjIGiIu0=/Ap'Yq;fio1~6y]|{pWQG+$RtI">1Te⸮d':3m-Rz >Pt%L (7 ugHR^b@ gHrc)LF d֌`"Ot)u)rV"GaH鐛80#E#R,)@5),!R$CH0MAiJK:MHSHhĬҔD"M HS"<ҔPi #)ѩH1=RҔN4%0H  M!*!M IM-RH "7TɄCn2#rS%4e!E)ʌ##ŠGuc@M=>-R\T/̪"N-RV/"dx &9ifΛT'Пd׉)Y4e 0]O?ra&rSd tv v8FG 1|MV=Rˁ2y*^=RS/;u~1Myb Iy+000z 0PJB`BfEG":~d \#0X8{Z CU`0)f QđBT!H!U%:%| )D5))R*L!(W!@fЃRv:n OC*#%B0R =H B䂻!)D&"L3R֯2)ٮL!*L".f 2 3X,[RAB$OP)D"XJ Q!FzA$heoU!%"f3S"eA)D0Rv+US6F <թBKAk R_u)DCx~L!|ZtfI X2nn)q)z,Q][L!ɯ7C"&\pȌ2C 8dAH,Y  pf p#RlP1vQ5T"&L; p{a㔁HKa#я\\&\NCZNJᐶMi) &]nUAEr&8S4ta[&8Gɭ'e85ta)6]mh|'bSP\2JmhAAE(nC:>.G%u%. ʪGX{QjCX2ݪCEnqxF*{ ܔMmU]mhq?" q!B8 b.qB LAX5PdHW TU e Tԡ:@'1e `5P&Jg@!3J 5Рd-%b 3BҜBf ԟ5P ;ȅYE mԕ5PwД!C$P`of\jPj ojlc 0j+H 4d!k 5P*z(.@jf.=8d5PC@jiY=9dG`Q{zr%JqȒ%a;(%4@)oJb( 5k~ŚYuˉN>8r-x&<(ғХ'Q9i"#8 -=6jZ$BC'qɋx鈇'$ҠO"pNObr4LĈ< DI DI,J h |Dȍ$bÓXh]O~=V8 O"*<6 xI\_<4:<!2|Lbp1GeQ|EeBIY|~NP_bguʓ|1V!>,>r'L+g$nT!xA` v%cdq?aTBN S{ړ"q4fK]X |[6]T8 LJT1{< E,b]Ӻu%кCAAuk X2œ!d3gupYWpZW$. ZW$ݭ+NT k 3xAh !g0Qǚn- nfL$,+Jd۰p%+I$ۀb0챦 9AwNŚd36tg[T;SݹpxX3= Wbf5;S*lE3JLL919C|+ e 3LG$OUrJ Ew^3J9C;j5e3ĨcMf33t0eLvt"!x5sJlRbR HKT&Lt9C*g|rWsu ѕ+9˫7&KK9 ue]qv_#|ɺB*qevɉ@` X2<\zn41e7 @>C`AL*8U($(X[KUQ ;d%C`,Gl6Xn7/70'OĽA>>qoEyT 26SRC`)nRE`)zfքB4F,|Xl! _:Ma2&evy0HWWOLd~(#:CO9.7j ,' XV.+>*,uXʪ]")ymWއܤt% =ˬ++,$ &s~0ǵ}̣, %1|`!Enii9"G*}k@>5H$|edo /}k@>D>yh0^)Ib-%YǼgCCp ;jRe||@\i9,ȗB/Q J4D=G'6o$*BN<1A>*A>xD>Z<3.7BBֱKcEB%rMipHˬCL+4=/e%ՈRX p Ĥ]h8/.c"߲f E$eyM9G--o\^%gk 2T @ohn`RT9+)0IN0 F,&8 &QkL.`.0<&p:U4j,\y&s `A^TkLA$L &!ꑊ 854UĖL;VM0a:UaNE$EڢNŷu\TI'@R #NU4*ΪS&:ժcI d`QNSetU:ձ\"sTkԩ~o=a֩%N7ksձf*Pa0+hhBȦ / k(ZE Mz.jT< &D%pXw6Ʌ] ǠoBUb,>-&<"X`@f̿ (!0p!gK` 0%Q7{Zn%%jp/, +)E+ݘGr,ino-G{` p!OXQ(ϯ_ S6Ei/Өn=BbS_S_̩׆%6얀m״Cd#`ڝ *D43nqؚhfLCZ;lUSeYe t2AruHn3[hLn8[Vܲb%2zg7RRJ> +}\XC-ZFQ/ŦKP96O[ZFЪC*Po= -1h*e-&r:hKA- -#l=۠et^΋,eψdxjq!W#ĩell@pbT/elmEؓIuաZ> [w@"MOiʞ*pru?WWb9>V?va$$RJU``) hJIXĹRV$ш"!ROaHt4LkG4!`:L0s'~?}4 :iFg_}/ $sd_e?-Hl>F,W~mqtjEmeFp[c p[x%`5vzq[o"%lub\m1IF[ mW`P궬B彪UPKU)ֵZg-SRfh+n֒q[mn N{MmjTw+cVB֥$u[QJr+^m;p'l$dcxV 4&x& 1Ԑ?OIC:24]!3ECWriښKC -R_C^cnV/<_‡6hR6@C_Trh5$ NNS86p6(iC~к+O{s6PUr:btQ%)nF=QiXiwӖ]odM˂3̸Z&mrM?:YI+IVF} &~$3M\"pCR] ;bȵ%4h"Y!޶Lhbi7`Ƅܡ>B0i4}CS}m _}FKnR2ĿOM5g*a?~1SO!?;AOE9I%WɟO|LShLddZt\56D .~L׺}L31:,g!? <SYX4*QiadOIK nTO.UL[T!-LdjaJ<57KO IIވv+nR77 i @bfnh r[+Bpsnh(KМh|ruJh.?i(܄5,>RWc)tS Wꁏn*sbɆDOFo+`HUN'^(>xj'Nnkv3vbkM..#3S#=GfG>|#+p[sE:qh\cň'X1krX1bJ%҄NN⩝~UNΏ[{j'kh' C;׈CQ?eY1%!K|k5-glBgjb񬲱9 xVWˎYr-Z}V7)K-UXX۽yUViNb?mO[8M>."bY~&K]45)M] V7 WC^> ˱.NmR峴[KQOSK)J^f^7V64mj^M[Fyo3ng߶Wp!+E n<9BZ_!&=Qr CJf nueKWp>'俺uKk4 B /77`oC0mPy}g3ۻ 1l?v8Rl>0L3S}*/]_ٞ+m ]W;E[жLwf #}~y3`/ָq;Q׉?_a9Φ>,<}`}@ K@w>c= ð}`3GuDcm9F?|ߺ \zŤY]<)nEI?ۦ*:萯eY%ĄVm18=Uc:r-]˪~ t^[`r @GBfx!˝͒NY\^[rSal(Y6{mj v2O~(W bn_V=j{?j=?ݫ-Z5<*dkW]7Frdچsߛ+Xq-^ 0pmzmcR /ظ|yZ6iaf%YRMbU?P\0]Gsr2W\ó~Uy*d5}ۭO~637^mlt!Dmݶڦe&EmÁm}umvìeDWW_S W]NwWϖ_?bKnۋ^{M4q]ɿ/<_>ò7!}Kzl2'qeéU.ukW]|8 /ssc>]I=d7}6elQzq9ylaؤDZ\[8j6iۜsϳko8TU{n(]QF_u)_ Os3sԥk6ks;:'(rNnu{]sq>FFfw>qm(pYsulԞjc?\&SSE -yP$j:ؗʜ/&^^߾x}1^n?k)ۏ?ٶ*̥xxyx73^>bݻ8L߻H'=M,^޳|}27>oywrU_7@gw._n\FWw_t-Dwy 5ř~۷)1*~M?HW<Ṕw5}¥?n˩zn|6]it;ק@h 'ǰնǻ_S(y~i·#<؋V7w7zSh_3em}t\<z__=>߼獇[/_l?ΗN؛q/1x~L Ml=Q㼡8^3;j?yޖv~s=šqL?3_Lc&j&h\_WAܦ-Doo^Mr'W/PWMZsZL{r!'G-KcrØ\׻xĪ퉽}x4v(gt p{ӽl&|Oi^\wO_}ݪ (d㣏Ƹv9CɗGON_ӧ&#p?b$ǢZ/Ʉ.><^"?{mPX:1N'F =p-*yѽ;}8qyYvz4,{ūd#hX[Teo.4T}DRz aѩrM'65^^*}EO?rw&WJU?\m$}3XoM (7혇J,~|p1r\zNδ*;O ͝=eQRҿm4 ^.n Z3e3}11|cz~n~.}N?'9S??'iяY^7K'PYo?q8{f Ph[LZFeDgTVkp7_f)4Q@ٞIz.+NT[5h>q%m{' Bckж^Kgŏt9ԦO7[Rl$b絬u _iy_7ߪtcȢvx_/ׯIƘ_yyg|n(}}rzNU^l)b* endstream endobj 288 0 obj << /Filter /FlateDecode /Length 10883 >> stream x}M%qyq16nSd.! dOxѢT15u|"qȈI3F] F`L5{t_p~_p ?i]˓Xsװx^r]z~tnnBZ.s-]ZmJ,囷(n7q|{7jZH-S\/o^=H] typ\޾U8|Ok7-^~~pyM.{)ewM_~l6vy [/]_Umwi~ +m[Iw~q QBtH)i!Ӵ3G';ٳӯNu[c-o_F}kΕEXyMumPu?Ga(逸L$_ق qK[!Lqk lG !][Naj7Ͼ~(Pj|~SfS(Ot>𶲩kBn_D *(u@NcMǜu!|o?2n-źtz]T}קw.Za9e7roSYmLא&ȿA??iY!~=zٵ-fm 1Sqչ{޻P2ؾ#d:‡7 Qn)w:@SXVRVڇe (@[h|{/05/77p팱ozt ,< U"G;|9SjEV&~_i>4rF3 OB称]c Տ571snpZrS.ToϯO4,XZ%)TOm+|Nt2]7OҔP׵kżD֔LVG4ZSbGձZC2vP b@}I -tY5Vӵ]ކ׷e6#%r[Z6B XEU*o*ùp+$NKeErOE$UshuEk9$4k]KV]S⚨+u-fEWhcK6ԵD mA,Zs5ŶLQD`L#L52Mn膡hEG53YXJF VA^IE[*ODuY 2]Z=A<ј\YuO*I4x302OǮ! T keNlJbiu($n0JYzz))*-s_nTQRI4ֈR\)$4\ŮILC=EU.kI :@.kQ޺$KUjxɼpZ*Yj`E!%d]ki*}5-Bb[\[E:]MCbZLݫ2J>+kQRWAAڴF^cP]AB uQW&ki-bTkpGx&d%_)NIN1X%x%F{*)֧]aB}USWE)~UbEc_Z*Zy:-H!ki% a]Iܡ*Q I  ykjE嗢$֬cQcWRU=z%@%UIlJ*JJ*1J˺G$U}tѥ@ʔ2J*0Jq2K>$SzyRj[yf!1%hTb2:*p:Eg#x^:":f# lTboJ2-XhAj E3Tbh6ԂiJVyhjQʵFJMekjUJ2-8%jj-b qZb[JV65$NT"NK%VQ>Q$N+7J8-X-NӢmZ*qZ{-XZWY -HR mHVC"rTbx֜$N,}ebTb( WԿL)ZܿҔhƘ]RL35]\iĶ9e!фsGS3ԄJZȒ-R{hPZ4&_j3Nl_RӔhw%5@Uf8nK+hd6Ihv9R]zI_koyg27fiڸrǝp?1Ҥ12K ӡIJRhy%ŻNfGZ;Ѣq'}.N3=$R]wy%f] cA$:AhXi%iƸ_gvF6Ԕd4g\yDujSMg9/ ^`&6}nIo{y5etS> đRF)ge.X}nIs2םrU~5h٦fa5nТ*ei޸Q^&IUgש>%^KT\;^cߙ]ٌq3VSJkzݵO]X3.N3Ƶ1l٬faWR^>X;}^6k#Ի3Y;]^(qEcܶ>ӌ1/3N3gV}6jyf]Yh/iƨ3>ӌqy%eM&FFu}kcu7]c -k+)y By%?h[vg9f]mcעh3M> _ 8Wݤm}6;kvye5^+g+uwvyNWj^&t|tkrnRJLμUJ^)[3[U*Vf8J L)2Jݘ۩ԌRfBi)5]INmJd)iIKI\Rj.){&4$eK$vRA i},r 4:!e?ҤvR3Hَ4 ٟD&t?n揺gG[44ZOl4B>ے&tQ꾖(dے&tZQI(Cہlrh2iu4:JG$I̎I#f!iHC95$>ji4tZGΫ<>J9F4}e~QȩQ{en4/94#$yxwƶePJx:,7?>$:'~soܬ> 8<Jk8q  /lk"f>zk]s :&B( 5N\SҨ`⠃Zztu lb9Ng1LAF{8CA擩6gެSZP0[z`Sk]s :(O:( :_5(:( X+\xtкZ;;)>J$,Ÿq['C5FYڸ? IYC= y -ߟ h%u6v%:o7yk CwJ] zYP$V6Jx:,7[7IUnsz ljZv܏?|6r!Ɋ Rm (yH܎ʍgxnYh8pKMNa=hZljGrt @ Wt`5c"@@j }AWlv%:7M>@ pVN35 HWO::v΁{(R2? 6:\sQ֣ӆ@~sFR?ޣs$:>|w CO)q#S]M=-iQԇ?4#Qӻ>25[z`Sk]s :g~?oK?|FqЁZֵag\ G9l"zAPZ-Q5AGۨWd9  >M1@TWPkh=]k.Q[@UߓzE&D T8*|B/sN*)nQOBhqPQQ[@UߓzE&D T`>3RpIBTQo,Z⠢ zE&wQpTbG}|{vRM=mQTm+2u%*g\Ж(%9I߆7|FqPQQ[@Uߓ@m=PᨔMaI9(\Gt{Y2cImQGkYkY2XRֵaGGO??e z O)c)rb8QO֟*}Q`KtDOc )F(\^?n:(:RkU3Z&;C0wt 73\PLJ1m-Xkf~3O~O:ֵaG'[̃ (&?n)`gS ip}AZv%:_]ء`d(omV_<7CAYT@ެCYV1u+6{tD_qt P:e1cw-ƯzٰFt p^aGG>2hYP߰`c?0trMu_(.*Vq>hۨ`%. Q,+< :x[?34;M⠡ S]0j,-> DvNZV9kNuZ-X U "XZ6ӎ(+Nq-~ uii2PEU4jF׾fkYPu*nW~g|nk(D*},@eEAkMη%/)XYT &Z:]ӓ1Ab q\_ձXQ~.[.QoFd pd^aG'  I'HԗQtT@j }Q`KtDߝt@efsK2ß75tPtT@jp}AWljG@tKCҴtQHWO::v΁pt|t P@޶pcA'U9v[k⠣RkUzk]s :U_]pJ;&69rY;r z @&}AWljG'锃JzGiW*z%褪aj55IG[Gb.9΢R:(  ͠c߼F}AGր'm D@tEWKgP/NE:v{14  zkGHt8:IC#:`)rS (ր'm D@t(:a AgP8K}stfoVk= HW:h]M=#(jӌaiak4=Lsxt=Ls`uٟ z(: wqt P@;,ӌ!r֗⬋?LsH74GWlv%:CY(P( zn0k2ԂAGXztкZ{=:GѡpGGC]j1sk1'55IG[Gb.9ϥt P@;I'mxB0tPtT@j }Q`KtD7r$LA&V \Ztȡٵ}X⠣Rk;hMw9:IM :(ZoN=7XKS EmpHWO::v΁pt@wXOut"k}jAGXztu+6X;ѡ4 =~ P1F~Ӷl-QtT`p}AWlv{tDCNJzrAk4ԂFt \>hWlv%:CY)<; rY5 HWO:ںZ{=:G)rZw?+9MΝD55A^aG'3@w,n zn0oIԗY8p^aERWKgPݒ$tB'>k= HW:h]M=#Pҡ1ZW\~8k"@@j }Q`KtDCΎ z:9QO-Xk @b }Q`KtDS(ɼ 4Pgٳ(UOoX⠣Rk ZGbSkGHt8:>9JzG4t?|2j-X>9T>ggiG½8:( ɠSnZ(:* \>hWlv%:Cɵ9!@nnUjA'o :K֣8@ZQ`Gݏwt P:y1C.A ([X@t s >hWlv%:ӯN8qC:g]x~<<8_eX?/NkDfYz~FLT!+&UKZnnwGK /F eCD?2w~q3\|B G+Dt~̗3w-%o.O= Ii!nc|8{jAb~uZkxT~([gqLB_5A.b[2]h+Qͳ/)R >mw~azXԼǻ?>=ff[eJ*ϩܖȯ!gw\yhI05lqv,]maA-`i»m>tO%vKo^ d1@G1{{܃ݮi |g}ON)6rmtvyws˿?zyxz|{˕i(n[Vykg( <ܽVP/V! ?ĩ7OY&0Cu<a{xt\onsf7}Mo3t=Q _7OM=k{G.{ f`I.$li(nKl(4nn[{鏾1H3!ǀˇ*Ĵ_~kxg{Ӳ5Z+,[+%97[ʵRs's_(sCA>4x#!Kᄎ{Kjܽ,yݸW*?W A۳!e d_W- |* 1lefkWZ7 "fњk4of-.tRXbk8lJ$rq#}4!]U5-:Y_,R7a|˿RgG'jendstream endobj 289 0 obj << /Filter /FlateDecode /Length 5059 >> stream x[o9rQCrXLpRd`rd(v4Ҩi5קHv==^iX,VXp/{=?X?ÙvO0E]VY)N.Wnq={v7 x5Vuo\JWյp >)*,tM~)mU{mXPmڥfw{X|f+$ٱ:Lv0]}hvzm4ŷ.7MJbqg쿗7\.Wg-[^!N*Lp+h{Ge  &<0UFŅtkIy$ xbZ\fz~գrxVr3;3l5~f߶vd/e*4 YiɼaoIn &#AH?tJs_^m㸕B\x%kh]/~{&,UºZV/K <ٿ6B?c@rHZ"aFGz!Jz'f6}*k- m[GNxRxD%N~;sbbY m DP(QtK\O%HکBeÚh)Jt,^*9xdfF @Xœ` v(IdyO3kS%ɁH$)J: (!A4d,ǐgxK4DM<4_WF$:.pPoH3VyNdž0s몐: [:a_v7 y9dD3Ta92ШWBdVe1'GUih##X#>P?Vͬ G oV5'Ak?̚^ YcA]jF38pcg5eڄSlzSI X,4`l65W !tpu{$1+AֶYuINI4w!rY@-gURjO@,iy) n01t$%+8 KQVVٳh,߿r{ Eߖ9e~O6- U޲ۮ /GoQD>!!qW$fLSZkvD/4?:dcʩ!(6giJ=(8KK9gh<GRiI%eߏ Ʌ(~SZ֌$tX4im6ivY-/F.[6M0‰s 8% wf*eֳ@ "GTAiii?W܈GUzpҹa?FWTiƝrnG#g$2Zw4%#Ȅ2 XYJ;8!C$9(@49ï^4Ug02<|@BgTނ VHKkY_rs\5\Dckek[ wC:xܱB~DD0w0Hx56E.ȶKm&Ğ 5)28#4;A-j`J7ۂ@B mпY ]eV7HK2:SQ}[=lݘ (XweQv߷{BAtSB/qv]clH;F0>Z]wwIAHkG8 n]y9BR$xXBX0 |- 5Eb]5=6&p~M= Dkw[eaN4 L*((`- v0JdT%3 w>լPiH-::@r8$0D$T9(IZk52|t-Tt 9< D/(B`3*][!xȿEe °UYvҢ %5DQ`Cȁ"iX5l}@#zP#ypCi!m%+K)Y!r] ^A5!ׂyIz_@-¤!pmZ%iFkQLxiaKx6k!_򎡌HR c)W7\g7ܚ%3U d="-+}d .lW8@X: ccd~K+nERZBzzUȹ|wI]1/ގCuv`z)Jj\BncC.GsB- tzBc!Eox3 =|(4SLnېm1| KS"_:CJ'dnG;٭"9(Ʀ1']cfs(rӁQ]<52'x vk*YJMyYiV1$h)ufOHsRŧR7 +2H%&]D:$\ 阢&]i*y4֮$V; CW`րw>zgZUv jFrߜa!$Y6._gC ny7-T-)AVp/13jlC*S|\wARTPk_i %\DYk:ɦ_2>XQ01E}sٜlw7qrj,'TRD6 @ a2r,Md>% .K إg#`aar_`Ⱥa/*_ F!4>-OY Fɉ3 A9mWZxlkUVb]cf:8i%VYꘪ+\hgCJ\l?婮F"e%)mr1XiuJ4 Re6bw7F02^@c-}o@9!Nw[v!cSo M!x/qaK}6pR`jr#X[J|9\\XyL!ukMU&5I~uQ,W㌗YҡNKM]&/B Kxѱ$tѠ{=>ެ^}3ܖ+Pa3wrIhH˝ӱ|`2lk`ċCU۬8P.ʒi)orJO*|f\-@+G̺Dw 0ëM?HmMՕXXM \4 @0uL}ݡC]oeE _ߥ}1HBDMZAnt` +SsVTJO`bi~M*W/O!>t57^B"H\ȉJ䳥¿).huƿ[yyV87݀*ErX sp[ -H9-Rp/AK:{ ~zt &Y}q=/XW\嫽aO?b)_It-lWf{jB s.~?ީKm7&3j *]PϹ3/pR.}R#ץx$9WwR_rHJ{[+"ʿ?_Kendstream endobj 290 0 obj << /Filter /FlateDecode /Length 9551 >> stream x}]ɑ{hb^l,^MN${Ñ4q2rp,X€}֭[qĉȼ:WJ~_b6_@6z8bxݖ]|*nj_8]ev\HQ+yJ6_y2a~6IDbVwP2VxIUZWb҆2PjcTj'UddR^RA:T]TWOP^u.@U:gYJoAUzǝ(U|}R_W҇~*}@Ug25(Ux*)j<]_*Ulc*#[R2"RRk$- @HP5IɏHQd#B`i j(O(0L/@?H :Q"G$xlJ/2?"IG\4}?H@*^L)=HA+Ԣ>֊Gsu -HffN+N+48 պ\\)^H#M 1@Z­+܎@Zi|}@Z7r -'Ap봬ҲN5@ZQcf`N!6\iNQp3/rpT{B B NGPN<* F>BGiP3#GB2k$#QHكGUM(ij& 3CȤ2:BIR5H!+x{ +x-@,P5Q݄uS(BjPwz %XBIePLJPRg4"J M(ՃGP@ q%Mք$P %]ՄN@C(2Tׄ^)Uu"B"|+bPOByxETZf"V_T/.L_ld|)R>RL_m^}o3cX$h;HKϫ/QO/|]}ćY.#:|IRQ@/D@?%;%2 Q}Iu%e苙J/|RF!<(CP_ J*؆/QF=B}J@usA/QA% ×. 0Ө 8PKϕh6/K,^ qa~H`@N X|k>TgS 4Tgc񦻁CF6?6 /b^(\,lK [$,D/XX`H"6Aݳf%`0_AC (o[ I:"Q}+@X|i%^`׾,e/f`h0ߣzO^z/ C~U߻b,~;,~l;X< }{3F@:G,Af>1<죢*?V@E\l]a0W0V ejUIZx cb}SsJf͋]FzLQchUƘ5 1ƘUǒldV2qX% c0=UIc5jj*0VE'& \a"DŽZȷ|UcUz(֖Z *U135cUD55eZ;xք*uZ[cAR  c!"*VɱʏV1a6j+pG&N=&'FT#VT;"$GijϾ?k c<:1jщ#V`v| rɑmbhmHS((i22I>#M+ڈCmRiB$&S(i*V&Q҄<hSB$d;J(iP4U$M?cAY]иt9ԠxMejqhܣx}[&[ &iLh ,háii&xd>IӰT%M7I&iРh"L&P\HSKYrt99B&XoMţMh @sMőPJڄL9NAU361X&h##E#MUtB65ֈ;FWFnRc]<i⁂661y}::>]7@jD@K-FpM5"Q$RwD dZ-whPmB w,03e=b`;w4NՈ#7?7؋#aޢňxڶ2o选@]ʂKb{UMѱ|[\r2o֟O@S)J_%B4*FS*Um0L`̅<"U,*ks->4͌17MZԘ[idɧ2sGiܛ_G/ΘEW˷ĂJx~&#zRCԈVͰYxRsQRc-p 5lR6M2F]8A 덩 Q]XjINhP0\8uLΩy9.l}uӅ6VTisEl.R.gzWQ nmckESQ! 6hg(ڤ]X0ʷӅfՅ9]/²lɹ09t@ fVpr p0mf㑴-z.y_ϕzƣU <>L(Xjb2"+kɊ=A V  >HtTpTm` Yk { t郒vd`чZ>O,RUU*ꃩĕR|Ci:A[R> >k "dɄS>]}0YlW!+>*c|F1~1]1mmB Ꞡ5 0|i Z NAPf6NE㞠ˀRMpU# o'('i59t1ʀ$ 1Z]ʞɀ[F0X&>(8Vw[a,Z3 2kd4)lM6Y3䨖TI~Ӛ` qa GZXwŒ˜ت⤔Y( uwt~XQn.{čxZR;[nuwka\d4h}hhx'$`ŀe4@곌ʟx>26ncm,)EN TVpqm`m{&mfɃJ`0n|YdJN4ٜMIm\1 &:JX6$TSmoj6&`qJɛCh۔qb)D|nSw(5.RqspZCZ}~!ɬ4FO8:P0BcҮm,Q, nsVg(0gEb14Y'E ,]Aj;@=IFv3e0&,YWp ֦xE&R#b%9Mr[BzMMB_\BN9_dD"ЖKHr Ol("0gZVg<# MH#V=drS!_ӋXeކ%0m: OF OYx/Yx $d2mwVbKO{#AԬeOxGm[@譶>K,1o.&Ly@' Ohhږz[)SL {hCukZ)sDXzr=7{q{ч/{nq!YA9^^*m};{]͹ d}[PdD@%CCl`e#2Yx{ P J]Ph:0pj,:u_ -.EuYuV@ա /hYjSYsl-䍠! >2 A#clJL|A+#hfnCXOвm<-M"hYYp1VjlE*bZT h^dY+Ae ˀh"z|U Cj@**F֦c=٧$mݘ雧DA{H.dm 5L3Аa+2!v DȠm>m=:BFD`֏]3:ztBi89X˛憍R,axaOQ>d!~ؚѭzdȳV#dX lb!# e!2Ő#d` m!5 X*5R=ʐŌ9^]1a_) )3V)ܕl+ 8eN,ӶAU뜷de_'A3:X:e.7e#dSJ߼۠- N N2ױ2R֗.M[2m+f㨫gT3>!:.:0cQVTbgl4%r5Z"^5U,c?@6A6 !%e+2ef YMP3h.A3,: `[vr]_"OٖfLYdze[ [)ZdK,%hdl!ݵب^*hڂY'2S YAfF[-:B\;̯7833[X3ê73<3YW7FٶKc`f}K4Wif( 2B1oyr` y&XRgc֡c$yA.itFq 6N(tL|FؐݒIد%hd2іLꇙL歟[2Yܒ]YEd2yuؙLgh a32ɍN*G$z?M|5Af2iϚ%H&Q4dJH&w)>LO>r'ZZҿNǰiΓN#4: tl ftzn`t4!ZFCi+.VvS:]fuUY}lpmNӰrhpjڒ;'ER4B]t6LETdҶc,N\qvӴ-^mAk@\~, uLxS6Kj 9%(0@$S┝u#vmMXҷx&C[%-~sg[hBagQٟ-dK|~dh;.Mqu[lޚ ]"ToipN::\vikɰ{w8cumpniO$]p`/[Qdfݴqo06z ] $A]QAMІMSд=B i"mvZw mg2iݻNF`ucc4 IZV&>f:̺nݶ̴nfէ-dfȥ̺ώu'b5s??~g91G;8џ9;18џ9m*9INY@%7 p4swbk<~: [=i9l5§+_ڷԉbԃ~G 4y[҃>~D¨[ĉ>7ϜLdE=_>ȿg_~>g9/L.uǏILs<[tOzp藷OwjW~gHy;x{;')Fw9!}v@]˺Шhq\D5^q#loOq[xplG?j-an?.BI'=Uȗ?G7rOoȴ>1WWw|~ևy?vS}Lwg{u3];AHxؓGfJgp|o!UXb7ˣW$?Ŭf\ɩ֯3~6Y90/_?v=?↍rX|xΠ=~DNaOnp |broszrL5^W%1$qLβ"[1Hp9x{7+fW9/vnӧ"D߿?_-#ZJo)577,ׯ7tK+˷QIM.'Gvޟ_?Z67dL&1mO뀙+%v}p~tۧ0VTYNE&wݿSxfO~j?ӘGx^lm|ɮe×'N<4ŌzߺRO62ǻ߿!?~g`Bp?|dk{ӿ~g&ۻW^tᇏOl?AQ 8xUY="ۯ~NYѝO3d#[؍,'(!.Wendstream endobj 291 0 obj << /Filter /FlateDecode /Length 6493 >> stream x\Kqy}1֩¶BAv(hID |bfgŬ@˪ ;]]||evmԬ7/.^on^ww|Am 7IzF_5+7.>{{yeU7W&9e3 q9w&JHOX0&L7G^#a:OoYݿrqM46a&Ҝv*`lڔ#,ts`9]i甒Iay:6? L`\94\Nwp^mp IY݅;.4]*q)L cʈ\jƦLJ*ڟlHyrWyVF/4-PSow yd7Q)=mwNf:>ad_ 7ޝ1ʊȖ C>"B4NQ-4Z#v Mis-~}_ zFܴ9MonG6ng{Qfwg%od];.[%t=m2 >lq{25GlDj {Pl`6."$ ,')#Ky0^_{՛3eX}?PwoZB- .75|uڇԼ0ia+px? 6lX9)~s|W25l]"UE`y_JřUmLJR4#|qtQSHN) 7;h=(Dk~bQ&~iίƸnG 13?*ZDTf_J1P}F'A8] ;L{>up([cy `Ƿ{HÛFʽ}$!v!Z@=Fy0GǰkH!Q8BUAo*G6B#K*6em@ G* ۏ)ٕ*6Oormyz/gEJLD˚ yds9ٖwD8_1=?ÚXK Օٸ1b `Vv;.FgRX3r%E>3=嘉 vD&.ڡ y&&mՕ}Y,P)-, 7OíkѓP!Of;骒JzajTk^ea !S!xNqzu)PT|r^}j תLCnbTɱA`wwEb72?_̌g| a-VgeX~3B#NDtP?gt`3Vk.]դU1ι6+ݺ8St_tzYCa[UguX$Ps ,t $bM%oO;r*hM& vpV@s|^|_^V}l)[Tqq]ٚ.1\NC~ mީ ۞3Ʀ] \&u&κҶ_j33+)#b1u ;SZd'i@,C~~qvHCe8Pke0ԭ.QOT91Nbe)$h1-}Vbu))+}!6||طGsyT5 6{BG=}qew.ݰVo0B$`@b` $l'+^\>һ)Q-3v8 |ͅ"kEedM)ʳ}ϋlR mb:4zR{9Io&<FPZA4ˡa؇N: <ף6 T{4}׮-KjzqItÙ)QUQm|AQz.f:"GMqӵkPouxf j4۵j-*AGog&|? sЁ9V hT7fP f5Q,TvSkVSyדtT3I i3֫M:\z\2%w  U*SRJ 퍜Sŗ`ɰ?n? zW_I1rx@ʡS zYm@%|Vsi/ଛ`a\BK 者3P[e$j 2EG2 AX*K :F*Z$|wV9K+7ME.*Ȟb{t)Ѹ9AY@_erBy#& %%B=8?E+#|h,0X&}$s( A}n *U} mO/BQK#HxK` μ )#}T@VM,QBG-E\G]f>zi+@.bUV(##@M^"ND:D~=]@|i1}ϧHj!Z$3ʈKXNDW)qJUo^ ){- /Ȱa[e/ ,D6) X4jc@?"wΛ}ol 2Н1"X]i#nS~1=wc] }j|lNs\ ˫4'=s2"e[ńw"@f1ctNCFtc1 /c|Z"ǀ k#hcs}PӤ+]3BiQP*{ 8!+47)=ŗ˝ %xEo:f-ozH \ 0$2w&wzp]-D5 L_Zx ,@ْ\$aM(hf[iB*>y~dJ#4J bF@xFhM(t4B{Iw4[4#B# I4ϾWh.pB# 0rЈ[ F@D`9J# WQA!FvYiAR<[Ĉ6+ihVF@`:idSFh0J#@ w1{̰|'"%8ރMSm o\a0E ](:@k"GI:&ӿdcPXr4:&㤮%*&fJ* Ȫ$UR:5ZKSjê)d¸dR@$h+Yz;:W61Ya FjAj)l A XQ,N Qʖ@>3Yp@Pj|&W@¶7M@_|@Sfc MU@4^$r_ʫ @$9gb P\@HA[ @J*Y#adMDFhiPGFUjodcuc_\?z1CE\ӡU(qC<W~yU<}4 ߔϮ:a%pogUܔ*>2C &*@WRUq)xKC 1W62Ko%H0E]l3I{OE; ʈZœ 4/Gu_CO!l+U< x~%-_ґQLj[MKJ[ dtHGHvF |J[Mvuii񵭦ʡHVm5%瓀T0R|J؀Bb8 kHE4y8 Kp@*D]R TZv<T~HG|!̇s'b>[pӅ,*|8F+yludQ9TRpNB^*$`> U+I|8<Պ`9SM[@ˁ@u 0 lE|X?*ƴp!)DcH [K-R1$=4 yMsxa"ua#0Li *R DE-dDE* $F"(Vr+)DEʮT_>/-↢1axPկkiyL/^Rި>3!q/1}d1R"鍼?0ae #oODO&}tnTd`Ώ\+:}~4R aC Gϡ\x!V*!Vz=IɊHG: IЗkE0v"A# RG Tjl*avuˏr fyT k+"`xpnv̏J)} Wɤպ.6m ŮҶSdb VlX j=]OGQmQm-QժB"%oDAjjx'!=&!^ nUK9 8Z&ֻ|$JO=1&!-wjkz3;R1i _ӁcAF:#4hmG#,!ۯ@MlJ6۩ #i1]E'`=Qш@ E' G#F jlG{c;¹I+jЏ.l~h`u^DKx +,7aWh"txo؇ƍ@5H+zmP1Al|bxcU=&=fզX:1H2>^)Vf8f'{$ -wG }rY aZ\}wx\a nd:ةnu z# k j(G֒圐ukJNWO[auMZhoZV'QX]KZDXcc-13fꌔZP̈OT7kw-뙡я'e=zfE=]Av]ŷYge`]E q|@0 X\aXWÜ峊/H2o1Mo1Mo3n2|LD ȴ/D?G9yi?I }A=kmW&vAhZendstream endobj 292 0 obj << /Filter /FlateDecode /Length 2820 >> stream xMos!]6[m+HI%*߯+Svm'$wvvgvFZ:ݿ%Lw'tr}r{~uV?^ [Y*Jyh6@+burI~j>O,JM>MϙmL/ڐv[- :eʀUTY[wkuۺ"Ѥ驒VVpj@@kIY"RyKU9 1ÐMH)RشN!݀%`P@ mW7Nj;U\UQMJuE~31 j+K6c4I>~D w׉*6FH*3y]cId]@ܻP ,iX@8ZĬ&ڸS#H5=BP**rl7], z$nBolZ )hTZK*hVͲ&}-`ŝ+'*$i pՈ?9d@:)~=H`op󨕡\% Y& G)ƨ X06@ZEo7uŸ+Sh $* F}GzH j#2oA9k3 X*<[c}Cyq1yah0d{n#& yxnNLK\Â8"aSE.FwRA2L(z`?5<0lݣ[Q8*f|h (3^̶B,!`Tj5g/(>yz,"4rZ 0T]<`Tr4İ9êxn׿搋e[%:, R@v(Y vSX,SB/ X_Hf.e:ųzrϮ'v("c7J(7Dob-x#TŜ(#-CY|AsLa~#CnČ8EYfQ'Z9g+}p,dL:0ln%իͲrQwAWJWRIЊSk[ Jj&T?_A3%DYh'Bsט ^*D4.N+&q#$jؽ,ع(aQn KX4(P`@l"\,X9^.CIR.#D`nfL< badҊ![H{d .' !5 x;& FK^|REU1`2sѮ[`rP@ UW V;]˭QViY;]L1^)ڨ`ƛpad'+G}ﶋݦ]^.< +󻈎3?)Ev`Xb(c?{ | [xgu73Jj1RL\ctg1zkV-ҁVm7aOK8 GẛU 8 $A3Ź󒹽3Qlj\G R=An:L_]wDA4뫲S6Tb?–݈u|uq Xtd/X-DJI4VzUܝ@9?{-;:q=\}A;sw+f1ric 1pK>:6c@} bfCJ2edhR{@] iIZD0{oC.0.(JRh{lg:Pc{jQ0Gc\Rn? p uCЎ3 x3}9 [endstream endobj 293 0 obj << /Filter /FlateDecode /Length 8606 >> stream x]Mq} u,qb #DQH$lTu鮾~؛ ݪ9]==gz{??;O<'w5\STsu_?c?yLcT2tZ9+yx<9oܯr~IU!tͻwϿ=鳓;0õ7_^_Mߟjp(oNSQ{@ޜ9TٹX&oo)ON R-`*5]T9?B!6P!xݠƢz+- 9K55(k6xh,jOheh0?VS=}:綪_C3@*QU_\Żgh%Y53O5/Y1㧿?>TGO&#ǩ)9k@جƢ#рTaB+[j6TNtlT*]9Yj,8efCXj62gW\ϸv[dKRݵK!GjNONrY~ C%K0h1?UhzmJkfoѥ1ztԱrGw |g.SLpWǝ;?+Z5}.[pMCҸB{T9qi ^]ʠXk(p!UD:u^ * D`)E%RA (/6\9 u`TzB8VD˸-wUO jY1_#bPaDYA"ˊ FĠD"<_BKѨ%7Cx\M(BsnڊE_Yh4%G^('aMEa>"5B#h4,d৆>H(tciEXtW+t]=N (G)NMDpcoDQM 8SeD4PUIԐMEqnbǥ-"4b_qiWЄO 8`_A"Vdzf&)KPХsPn$&U20}n]@iP{(<4EAC(*j55qrtӎƠQZ&f8 ř-rkPSC(W(1(Gٚ EAPY+>M2* jt߃Ǥl}z(?nA1jjbFn~ r}7Gn)\(P9ja#|0JU#,ѩuS!-y{DҮuiу^u3B0یs߻=҃GAQOSFPyך|s_ f~~|;05$[kh K#(zlf@!i RO@!ݰ=jBXZm(cw2S!< K 4] ٣k?q%ܐ=:=VqAErC)yz(o#knGQWoQP/ϖp EWq;vOK#(~؉#]m:d[FK#-٣K-/ndSc4z!{cnqe'{tM6ŝnu=~i EEG]OS#4.=zg8u=YE=%{[dodxm#{B0>7F&ۇH${О=[doScym{Jt(ϐmpOɞg@t(ϐmpOɞg@t(ϐmpOɞg@x(054O 3{ y2g8S'xa=<[nzxq=x:(6'OųzE%&q=PqoM'xف=<dz,ώ)Ӂ<=%z:g6TOG @d$R=;'#y꙱Id(r=;'CyI==ʳd MȞٓ.ECcgZ 1SKEvHh]yȔ(NSQ)ki"ֺwՖcstv.p~`*ZH$sTdV9bəKiq"<.[R;J^yн)G ?M*< ˲LPT}:?F(<.C/ C>/} ?F-1--j5DD {ReG͍KL\+ 1xKc:L~ Z S)4dDa}[*b"%,yz;lnb_f(H xU24:/gU\̦VR;q `#BCe.QL=Ưx8i:SI5D>y>ֱ%G"fY緫/xi5  ~}%4QVuL !21q{ҎؽDs]S8mLY%,c!앧O[/ \@ƶ b5/] x 5Y|KAxY4"b$c39дxʯƘѶVLNu"1Q<<׆Wŗ!2qħFU/)Ec=锉ZTPXK:Edtn#- qXg8yvy]#6-.stxr"xգQ"[K;_똇y9V>M^Ӄc?t-*2\Ɔ{vNiѴRsiq1].kQ9kLiMTԑ,]fhۜ8b[R;J^ߎIE'Oڟc%rsH8CdԷvs<$[z:á;UC$.glRz}Αډ2ǃ?LhU0"G~6I";f`W83GQY=D÷GdAR}&by*Յbճ٣"GyrSY*ᆋ`6x#H9먇qr旭C!y="NG:^Vp(X "^#8ߢ8TB%$ Qn2قPWXd캎V)iFC3v[ob..I D 61pc%5c\?QIW9f!לta"d 4Q{Ѕ#/=bThCf#7DpZ$Naw!2@@ FXسZ;ff8rعujX3C rkcءˬE=ۊOYp䱬k'8sz]  ",I*;fb\c<7HbP0*1pm(2MN. x9f\ Q@5e@X.D {Rěm˶,|^26DN~,y(2k,hEcx8-Mv"s D=Qk͍l|K2v:^RB=."_^Cm) .M=,Cd.(@!vxk_p LM DW>rw[ڟL~w+ȭK@j0b}%"3 %,yH57#ZՍ=T3,9%#W*.-B+iiK, >BC D=[׽V`aG,c7fo"QaYu*J E(MGCI)μ.zcIh~9E&;#d@@ JXz;jn!Q_"eݑ{b]Bsoͥ c4gYn!iET 7yz;ln+W]dz{IF#W|GGd+τ !όd% M"v"s D=;֤{"b uF>lrsAͻ”Wn 2XȧیDnvܸx4ȍ(L[S3+-fmj, rX! %,yH5{׫}Fd9G:1z}],L9fjd?eAY>pf@ JXvܸ|=gn 7^`lsVncQ?$ ܦ"QžQs}yܖhdB\>)ܠȦ|(@1^ueI52~AvcB/`"Z,>F i!݇\Q(aaC^k.n%=L+37^_,hdӂF>}f@ JXvܸ\ӝgn 2FzK n D >VnD {RoG^,חVqй[/ ^V@ JX677Ԟ4{ى۷+7~c ܠAdc(@!v$nmj4nD>F0PČR-1q\=7h4Xڎgnyv gnS`mF=HIbܦ @- ܠAdc(1T 7yz;ln*\ LF>xGE>ODmx4iY7PQ(@!v;b뗾:> M1W/2KSy%ʱ4a5^}PČR-1qGU&ImeA}b%JԬ_}.Y+ K@ƛe!݇\Q(aaC˗ܖhdGYaiQ-ۍ D >fn3 E(M[;42ŧf_2Po\~.QFj2,|Ydf3+ %,yH5gO58a^){@= oNߜp~{rWTһ=Hxӯ?Μ+d?󖵱3;)珧/.=cX5\||wx/:6Oj*PRUZTUoi壗LyXmcʏg>5_PD)#Gթ^sL'S-ONsY=NM)ulH/_ $ 3<)Wȍ ?JMJ{ya\-g̡Z^^\^ *Lwz[wwk o"˻>~|fhxPϿ:]@|q(گXH#܏QzIoW޽[=<|(woz7FGeٌ Hz;OQ.]>n>[d:Sjycu? .j/<޿.j!!_rAt}Y} ·x .x/|+Cn[}-ob|jG?7 ;ܗ?}2J-(p챸?/f^3ҩNPM07&x\DB<_ޙn..Jy{?gfQ[ϯyꕨ^(=KgS@^RϨ'@8?ܥC/↓?*_w_wߝA}s|g.cόa?~|w)5"yy?|YK*9sʕ7UalqtYci0_>;R[Ыkb#(󊁇Kr:utS7m%On6~5ezl-Z' _"qLWC~:¹z> ?:bɛ+V~\',,W}$@ޯr?}6|ؼPCn=TG]JOuOPv׎PJ6;>H?zr~r[q%'~'2|'Od[ ]oNFendstream endobj 294 0 obj << /Filter /FlateDecode /Length 4638 >> stream x[M=``_forH HNyGRbzլ-X0vǫW?܉\D~"_)J-'F<vx{UNr?]Q$w*J<:aCWe C/ɮ~#6LhjJG&n1hز>R7xǃK|nSO%Ny ) C wjɏJ5gzo;a Js`S-Y})\bm⡗&Px&#n26\d15ow^9o_{O5mwbF6ri3 k=/Ӧy]L&ik#Mtb46De`y[f/&сx%Ġ}sݑƷ_|r__/WWmmOVچi#uk#F9YΒyiFYzрIwifY&6px؛=ZJBrikr  0aOBg:ݖIyϻ*ߌ!;5S ps~`Wҙ W|;zbAHy+]"l ݙKx%wHِ@3_ 9n/o|%m/<:󕠹+l !+~(Yړ!VL wNr!; BnNr&m˃S4f`#) ;8iMFv3N+CB$m';J@- .#eG@vD)dʐ,!pNFvȂ7^%+l|DMy"#U?"u,#?l Y NFH~D![N[jvӏȃŏ8F~D7HlȭW?"M!+V?"{ ^_*N. (TRTfӗz)DmIKqKz_*Z_*ewWL_*ދ/ 9+_*UtG:q5܁&_3X&`K؄křdP`4Zt-3?:PgEgȆf=k@#*`G7` Lް`}IT H*o6 y t^2H>BLF#84z>L~$Fч!5-7[hY5 n5-Қ4δb\kFִԢdO%@Z"NO$զUeqِkֻk#w\[rV6g!wmHښCrA<5weC.r-;-#Ճ5j2 ~bYW,b=f A. r[r-BiJBWQFB`U{ޣL!!0Ci#ˋB?rZb,//?u.x X~EmCq A;,X~uٸc{dp2?ej3usӛÎ/6v4W܎s[%yy—nt[`-bJqwޠS[=Hl!}-H q p ڝ74=[fY%s!XiV.hraEe+qXhpLe'n-E5[nA˻ܨ5Xewfvف$lvV_ yo]އe  3!0x:^ʹ{vQݎ|.2VJ+U5Rs,2Xs l9$=$?ݤmzhO޻<ډM/c h'vЏcvJF@ %?u*eendstream endobj 295 0 obj << /Filter /FlateDecode /Length 1593 >> stream xXKs6GdXK;=L'&=890dDG|¢:NHbo]`)277Dpoh>l/'3+PqUVzn]pA r"ɧ DY3_g?Ȉsod6ERh8 6]|595y!pǵ;;;:}\TݪX(8ATB"p=O5=sx^4B2AI%I_~[0+fkal {VW$`[S)6ϧA#qˊM fj1?k KWFYܗ9:r*$ZSb-}m%ٮmXiMKV"m-d*-X-"[5;bH&Yd}2>'2D7Ndek|Owj`"Av#])+Ȃ*~wGAZ?'047.\)_$՟$'5B)z':_Pj<~RPf'0NR@+\};hyMJ?}OpwŖxf߫e,|U3B˟k|:d`x[:* !;"ލV ~$n4A vC?uCѮVFE}r[B'-/WYZ6#Y"2im˪C/̸8 & ㎸Ӿ"(dK<-r:'6h)9B]Gss"r~C')Ӻgy8Dž^ {Uatl4ɑhLx0Ҹ5hW4,.Id|I55M&lچ/Ѽ⻧WAfrs}o kQ 6*ֶZlċZK8-9ΝyvhW*bw}|g2YkYlXs)\Sj[#E +U@Ǧƶž6-P6^V6hvW˰ ^yf5vkLp"~Whڬ>7kVtز ݵ2lSm$b۪k !(d Bqk115nM\ ΰ\V:([V&Bg-zUb]L]ߒ}^0N Zj&m*&~%݇kaIUQIfc> stream x\o$qoD>#, wC@㘀`%sYHSU==%;H8;ǯzӬ٬o6ߊVvkgOد.)i 4z&p3nwlug?7ٿ]\4׳ 7>3ujsC}/sz3\/@N8qp+w);5;:[3UZvpq=ίޅ-?AZL+z3;Rl)8\[p]~.xk\Ż{zĻ؀0d1RU?FbmȈ&##L*Wˋێ`ܜWqѬ ЄF+WmmYNak#˅y ByJ_>.v*n.+xЪ bTWhXH$dֹoȻd޿EmvmA |+WCILG$U6^Gn (D A)7"PU9ƓF S-LPgPp AUb!2Xu?0.J"!uH/ 8z&Hjb~T]NF{ʇ`f5c.%ߧ0JW]dpJرaynu?7˴oI:i!ǞwyT` 2e#UrŨnϕ8iHybPJ=UMޱ>~\5ʤ@rU[ka$D 4. >Q XCzfq̠mz+(T=4 # 12s-4z&s3`*߆b5\485ת};I;k98R]<9$l0'!$g >#,75giHk)]{[;S*%^RCRotI&z.S&)gʥ? ='% @"9^RiYwCn?}a`` ʈ@hl\IS DU @0lf/ø|K`<`Vkh๳t"l f@|ܛPhqH;?-D8ASA`i@ۙ}`9lȓ߰ !bnbAQ ,'h b'Xנxt~Q @` ##̣ T,⛻Ȳ@*b ?ÌnK1n0DMTqO)vȅͲ 7pWU) >u4DHZ%#E͍~uύ1e.A7 xjCP C" /"PӀIlDőlRdX"H=JD\rSi02 ֎qԀ1 X!Mth[<ѽI! +`U ]ܾDAC0xM @5-jj?89?JNT2tYuRXUҥA] l@i16oxuOj90 _I4rھBNa]ߔL|:ɛ~;oY𢿞ODA .P߯xB1z5A 9-0\k}BƮVgB1 |,"+0 U[qܯ=1.$}Vm8UVKcK'I!i=Z,,$)V0Б|HǑKDz&[6^4.\s y ls S닿oLcgp.5 rMw3?n  !>! \Bhd a#~Yߓ1rBS[Z9-<[} 4)nj\WT_# %g%ar$>Y@[Hba#D}0>Ll^R;E>pX)x?wn؝(ۢМ9XY26`i^^ym s R|)yd'0˕|ag@O=Pd T1jקsk¡*3j#n ayaUhI$kчv!2 ԭ1n(Ұb:[Mn$q;=C˿.|JCZ]~pPlu򱤩Y.@",5hj~uxp УwYωjj=Aj4 4‚j\*hUǜNgZsA҂x(j%@B\du&s`qn8v^Bc.̒U+Ȱ p?ï|#ɋ*fb"f0ϾO+Vx.]r$PZYc;_0$zN *Q$~,q?%!'ϞL+72Sa.`cPҿ(*1jD]1oM^HvS;yt/EͥYXe5&۞Jy}Lu(Wt7B׶VLL~1j8 ‘I` $tJm&2toR(1YY۲,2 y1L ٴp/5f;b67Ȍs(ɑG`m)blV}^wkŐC}*aL`ZZYIaF b( wV: n淬 Jw0Š}jέcEn.\-j| p9QE2%tX^-ݏy:wQSl#$5)II% 86u4=go86*SysOX|`{H#;^-WcRxG0^5eMj=f]8qm]p牉_;߶-;5ܣdzdx%fEV6M }V>Qn=uzb(E84yҨ+`y+ބf{c~}[Q_Eգw}~TORw_]B.\ UCw*:ZeҌRp=~,_Hѐ6FBb*S6 Y'ciJ94\gҫ~R-c]YXF~}~VrAt;;V'l eKՅ|O9h~JLpӒc1nhr|0.oD=1F/y Q:-u@ 1cje1c.Cڨ-*ūӰ=7[vF/zup6&)`1c uj;ǖ0Q,j3ûx #l(3Ylhu.lcLjCϱxG]d4<}n>08u2FqrC)'E)H9ħG!oDFRuL ="u?T2c";wn2܇ko ahawi=rMva4k:T8kqo.qc] V[;_wK Z.4%}'Ð)Z%>81Z{u hMl@t6}1#7yyN'uxC2ζW@NPeIHHvBa!ϦkLۜ|2kqa5<}\v=ԘG.i%ZfQ5C_%]{lZ ߑ1|t^tiSM${^ķKC?(38) ?'BT a;4PZp5L2ܵ?/K!pny~(B 7ݶۄo7Xu<71#ݾ-4=g6h ZJ= Y`^˻)cGہkK;:R}7B6ɆZw c% 7iGЄbBM}E++~pf0|B3sN zw3h7^C]<Y4 cT\$ܽI[S{/rFא .D lowKwXU҉8Wv w )v34zr [Xx~;#Q*vU*}ߤz{zDFR_u:FDm2 I>?IKW}M[:j?9Z!0bUxeLŴ;nQg]_xȀ9[^ûowq ]nRk8xzaī;Nw +l_ a^>uć|bc<ꓖ <n&9^ybTaRdendstream endobj 297 0 obj << /Filter /FlateDecode /Length 4704 >> stream x[[oq3׼  ;gr<}É"GpwI7 g%2>U՗II=hg._U?,-_~-nΚه3F_n0B󅫝zqy}g Úfq;ϗ9^~U7;cv /9|ܵ4x+GG)Zr }ڌh]a8n#oW-~F혖*]d g : qFFUFg(ރya,* M'LO+2@XE-;@~kQ-H㨻Qmp3_z2I:ַbD t٩3^Dvl9rT 8TY @75DG_$-YpB qut1,t +aNr8*omaC=n0O.w ~.̇Mt~ ?! $7\\!zz5 >+P~wy4KiǽEFsg0T`BAs@RVw:v7NS*vB+~S`v4aARɤZBS)Y>l%lC!Ս$\E[?#-Nt(g00N$k?U#1!_wH­} ^A`sV0Rae/װ@^MӚ$繘9m@ `; kM`4!ej tgaΝ481ބyLUic42V XzV|f.gqy#"?ű`,Ș Rւ+ (h Ud!Eе#sZ,q͈]yTSsjb,+C>Tk^%ArQQ"WMQB֠٘@`?F3*_LO@<ph߽񓺊#HW&ȣ'%ut4 A"[lf9~=$>fȀw3t[x:"Ko6%6|pS :a ( QƂs-jBbdhBiQMIxX'o\ D?K1$`29OXK  *V<>'AP9̅|݊!bXkOUIx䩐X9Z/*(=FH_|ۀ2kf B+Js!S~wc*RXޯf⪨ 2}-7%%E%Uȍ{RXI:#]WH_,dpơTd r]~ 1S CƜ*iX:h뎊 (΂yH[KQA@o}dz9Ϟܘрgt yNijyS>O(Wؿ3\)K/pݮrI $FU '6:GJԮ!IB_ wJ?H8!Dxݞy$CxAъsW|0i9b3t5`6|hܤ6Mwoo@P*([+3nU $9 X}'!tY ߆ ~a:jT;)J!HbsC{ pZ_ˊpR ZzK:o$,m;?!r[?] p x9*"B`&17g_ՙ./1>q'8DX \+O/i͜oD-lnj_ @$|x8nW6rn?l8H9rY~8IVH磴n8XCHpi_U+e#@ilպ 9/˸,似<$퉈6ЍZp`([{[eZa SA6N$WB؍luzK/Z.&bVV+U(M'l 4HF8 pĒs: )d ,3B{_iv,v, l')C%E%"-'w>ㅍ]o \$hoSQ ㌊J*}KrkȆ!t A 6C?ƾo@W]k4ro8W=7܀38Xoc>a`_hSe1& ؤG2RテC)b?[6ݪ쇻"v"<)Q-+G=V?z1 N6G*qg)G/E6XĦ;4ş`'j;oAX/mq@ X" EzS9\uNs#V>Sq%KGϴXIʿ~׼qpjGt&Tu_ϊTm4sul(H#øғmPb1daUᴶj(BP ʺ/4u\WMgm :3nBDь{TB)bD,4UVc#"C@{\->o|$IcQkm I`FFJ)x\x?P6ӊcje0gho-TEӸ{RȺV)68,)&ՙ{& }/rF2Tpr [pP s|YPr]Ѹ埲^b1ӕ3mqKޒ?뮟Shjm!l4` vC4la{+$'Z4'mi?mAU œoao# #fi|N?$ \9?ÁQ ,6zr,äyendstream endobj 298 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1215 >> stream xmS}LSW7ZŨ}d괃mh7a %C PVGf ӆHN}K܇̽fNr88HnHIvǭ\VPX+40qj⦶/D\&}'4 (G/spllMJBs9Jl˗*6٤\Sg++l1nlr.ټs,(b3ץi2SӗB(bm1WZ^ޔoAY t6-%!,)PC؊~T$+.+GaSH7؈P9$NQ1uΦjgC]d~x7ƞi:`J pz@nk moKbp꒴]NWvJs|*qNjPH|7< |8TODL&y؀`7RyM}}M8n%6H}dA}]ß 02Cj6dlFy[NT_Gq`\!&:m]"$-io LܾLrJm9 cå# #]AsVXByBVK> AL^Q;qεjƅ  <+S@қ`ĀWwNj0PQk-v{f0e]Sl{?fzO| G.8ɷK~fq SHP97ǭpRHA$%/N23CsJ}~@JN"Wn_s $F%e\{eunDaѨ'dWxPn>RrzsdpIv`ϛH =&F]媬gl9@%Ë /bl=s`ԴaO뉟YD^y0y_phÜ` z@,I$*zwj^X+H/߻um'ݎrE{v[,uut)pvZxо!DS3:~{c܋w- /Hd|Vc)8w=e{e{f"x/Z?Pfpg@hllt7|K66-nonvkf!7v)`hendstream endobj 299 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 936 >> stream x}RmLSW>WћDƽ #RbfVK{@Uu*o5RE+k&K &` K]РG87[\ 1,999ϛ<{H&AAU^%F6-KBxV"J{ŀBWt~?ؓpHJl.5}Ҳ^Y^U7]=Uik\-ߑ+:x/goM\c}ck|Xdk!Dz}VۃPjDѫ"y]HNZVK N*K$8ޗV?L>p:I.ƂɟM{Z;1If dQz!~"f-"\D!|`I'~^K9x"Ǯ4Vux[eB5ViFa;[g<eqŀuD} 0:yWC1Bj?w|5ߘ57&.HSY}O8 ͹c;'LUv0> #07~DJ[$*ER1Vagߍh̍+\ЅS+Fb w)lI -Lh> P94vg*ԿXN~Mя*<GX4V6H8eGo]/>dN¥D{r> stream xWyPTgMC{%N̽(.qaŠqAeof޷_7Ko4@#ʢ1 A-Ӽ1>K*3]sj璔3f5OWuW[;|<Յx3F-_xSVTJbs9.|SצBޠּϏsfnF3Q2k%y,˖x1\wsTL$`roTZ%[n}J|R}%!qΆ?a];- NQĩYbA!WeAQTZDRaԛTC}D6R+JmjMPPLjr\y]\\^vvV*7^E7N;nzi3B=<'½^?.On.rxXY>wZ-1 "1}y0ЅJss~v|By>$F7Y!Fozhl`j5;t+jElKI}G3o@tvo==Lé:Ѣ2Ɠ=LI>F|{bo Su y"o4gBA.<3ĞK'[KYhQG[dkq-upKTff)Lx(3"p%^t#K Z1HhhIǂR rS9hzHbb  By23ԱA_HzAbG?QĵK &0XP-ՆAѸE\尥bD'=&ퟳsuڡݮKVc0%V4_1xuk6(o[q@P?PSȽm=y +r#,ȟ)tb蘂*5P*X`X]dP & W} r^e0-R!d_L W䆖@ld+zǿ8 IpcS&NY>CB[絪,2xXLwEz( OO/&@:HTGi&qxFV&x['3(¥qYU^ZŢ_r S?őȋفE*}'Kt?S2,4G\ğfE3J&tI8Л:Oml=l\u'zl2 }jHfĒVt_$#nA} op۞SqV4_#[~i/=tIMƯR_M&t6+'3?9_`:E] E>܁j&Ny[V+X){ y;& zQMo BTke:&oL (?@~4GnV<.vErQAg]=ᑆPNrBXGH7i캎p 赑/U؃ Ub>)0pkh`ؒ/7':;o)_W3ZVRZS?žCC& ԋFb&ᅚY&ȕeUyoq2A! v}qba{NeNj$-A?$uN-o=(j5#n svu_5\޺%R 4FO‘fH}ܗVX:ȔW?<ӱ чG)'m̪\ϛ=PT e[lhq*A# L5JЉ62 oL"4+U)#&@L6b/Dm0 )AS &/S&y\j3ZԂ}D ZZWlгGJ?J6+X⛐fVcJP`,0F%{a2b2@^z}2\Wen2aT\f;z7OP ցLr.ˌ$ t*P`BvJOT9ң eB?bf nVDNƁHӆ<ȯ-,p~`Г)ں R!z"ږ^AX J? 8>PuK]KCo 6'UIo!FaVUhK5XHd%I.ںw06ޗQRVXn4kgm@k3-=TC$8YǁԁnVr[-7Mî쉔0Qp*,){It[-+蠥)x2m앋@س+)hCZ}rAik~q\ }x\ࣤa+>9]"i74j0SyrGhJHϡIq Z)2C/G!kw"7Ϣ1;ꄅo3qs4~31Lvm%Ju.)mAS]>"/5񵲾jãXG\h2y̠endstream endobj 301 0 obj << /Filter /FlateDecode /Length 8340 >> stream x]IdQ 4b1 ItѡzBYꪞ~=Kv͈qJC{z/ދֽۭ_/7{bݽ_w_D򻺯ɧݫReאw/>_~˫}~OWng/.׍Lū=Χҟ?,RHXOE(unK1}߯n.Vr yysyK%2/OX~ren[ߏJey}IFꃃ@"K~y8>Ɂ7NH$"QeyxfQ3Sռ|u+hm'Aފݧ'sC|}}0qPqmH>*o/B\Fbk_g(m7V~zsoBBZ8y$ h^FuLP=N~[ҺX>R/|!T%iwlPk*|~ڿ;?y+}ZCZc}풋PȏV~a9Z]Wg{?nyf>q[亵ۨ4[n>/>:װΎN֥I=З=1"2nTQi oƢmxi,1b 43b nۗEtHN .uknU#1fOXi V˫Ht-ey5əw6$;ѷxiOPw2ljҡ͌a9:R[_ UKGέ4 RU0v7Oa:<}grN~-&" i3y J]dO#Ow_P/4<x{|9[%.Z'NQMI-K ׏Owׇ\pw{8 f"?a*ѰQ%RQCջt͑>D&%-ҝ܈Tr|'hm˻7_y71O%Z%K8Gkhٸ($ի_O_Z7N;O4ZLuRZ@Ն4ƶph&f-YO\]:Z\~tkmɪyGnXo4S=r@C%lz9I1y'HxU+(Z@:MNUЬ z+THnusjТCu-vЩOOC5f7>'¿k]za6dS ,J1xGVQbG2;E3Ҵj!So^+sw_\ƋV\SW'FkU^\"*&ll2e5 ?KHM&d9AIɓD x[-Ƿ7Gm-Y]w&S>y~ (I~OlfoYY\[ě$z?4#2D_]Y, *ee-8V&$nݎckLśllҎ 0-/lk=#K 뇑:>\y0#vbf4ڴdp^П[UYZq3T2R|OJz1[tB' ͕= Zãiy;hrIO_]ݍ[}㻋T׽[.֜1υ/`\AN-؋n:||{d GSOc &}a=¾0E}#qj˥)/?uup^6\3N" v\aAZT״pkg8j|q2aJpnIӤ/>%|RAŝ(|+#C):瞦UvL T g9X 0!2-Hb^p*H:GN`eEf~.'A<7b"hqe@Jv30Ҩ #!#Fԣ@kH`)G5}4{)j khR=uG*"Ezga-BԌYw0 KcbU^'I"E4S bU^F֢T|J_mA9O )W:Z )HHu<åR(Jv3^*R0r^ &(̈I4siT`&v;GhT6sQ f;k&<gQ=@`"Q]:G9iTX:"%9RȎSJ)icG9#Q rjّs(959&>9%>9%>9%>9&>vJANK;r 9DŽҐǎSBicG9Tq@)Tq@14q@)Tq@)T͢!P*rJ8OnJ8N*jJ8M*fJ8@LbJ8K^J8J*ZFYT(42*?eq1Qr),M=h}H4Ҭ!(a,@4}ц(a^yi856=6˓ dQdˈ/Ԏ (Mv#9$R5-6P84Ӧ&Ɇ(a^yi866m?&@qhCi") ̞An(^;DuJ>.2S4JM¼4 sngv:_q2 x$'g1Arnӛd-6qt׀ܣ aü0 4qpml8SQ˹Ɖ+NJ{NUf[;4ҌGf FV6$L Q¼Pj8lcCy9ӂ,r,3'v6H/&i7ߺDZg J 0N^k1 QBhiv;p:icFfaq ^ 7E4^%JVhơ@4O6F $K0vX.UOtNKR-=] 8ih@ D'fBSI$n \&il*F)Ivr 34>g%5-6P8Ou ThCh0/L¼4 snU9"[vxADQn&ϢFTf F .g56F $K0vVU_'⃬|4д*Zq"Y4٥$T<3(aujjl(E0/MƆ4_i2oN]yˮJ.(b%:^5l5L6I4/UIng %6y:J=ϐh+ 4(h%Ry1 [u QBhe0!v~\WqG튧^fxj+MvWDNJ(g=5 α 6F IMƆ' ^#CQk{w^xA{J\𛥥sºQCLdHdDN:4PU`X@ 㬜F6 (>4uO!H_Tx+faYf5}qr K_(Q%bqKJ+邉+c^7Z.ڕXooVzvߝK.&Ocx~+ç~þ$ Mwܑ36RC\kp4A$ꛖ}9p:4LUQ2'rom^΍Eϟ!O7ƪȠW7 Z~_ZB^^ S` eH*$b/)MV7 2J8k0Zlqt 6% 0/M7Ɔwd$_:U% #SJ]=Ff F 0ܳkXlCh0/L¼4 sng.50Tbkس /Z_J. %\44Zlp x'>J4/TyNv;n]N8Qr7rRjO) (YzqM<3 .6IaC\c BR^yrD}OioQ"Yzqxmx 0/MߘCi`wl8@'Af`d_qDch%y6aw$K0vuUawl8, 27$]|-eihq ol[/n^DR5vݜ|F%m6G%Ez* G-hhQtomIaC\cpbT^Wp2J=$ڗV7uDYg F 0N/ft !6BIa?rEx#1ɸ/ "$ޯv8,l8{>~43 Q%^yi866| o<ƀg(bҰK㼤A"U50Jl#+a^DR5v|T^،GZ#JL㼌i5-6P8:#Jf1Y $K0!vkԦ57|;'3QƲn.f%J5-6P8u uQO(u/L¼4 sng{ vvɜ$-)ua \w=jh@ la,4^yNv;n|S%/Gg#YhҰ̣DtJViЙ% 0/M۹ƆCR΀۬0_KlSx6uƌƥ}J]|&hl[ jiwQFByaiv;~x!};eK㾭QLl[f`6%L zO_Lsorok7)_6ԯ(ozv%/)NEosݔqLtW7sa.xE\{4իqӫ|r{v#|⋢|oޥV\C}755-GR nprcpiɯfARn z滟) E.ۻ'⢄f}pw?ԋ;j//&>]ywS`|ݻKNu~|Zh췭&&cῥC½ӽO*2jj'px?Tɯ&urSoN:U\|79i1Ÿp%q?+ss~43 F!<>hCs8jA{'/,pp[tOvŪt[>y,];oŻagq*yoۡ )EfCni6Ur֐V{_Z_?j2;\zOzc+;~#/HDXÎ͆ 3WWwW^%/.Afendstream endobj 302 0 obj << /Filter /FlateDecode /Length 10278 >> stream x}I%Ǒ9$ؗu>@a,AQTRc-<*R4{涸{X|n׋.v]y/zps{o/H"ز/^q߫H]Q~Cxq*Z_^/s^A4oxAc۾>|꒴Rߞ>{^?=ޫNE Rso|({?_\S}\ ~^;:Y*E#n/}9oH佔>c(X8_r%}}W|35/7w+jI7tLSٖa9SF֋qaݘUb&Vulo><ֲLAAY4n{x+Y)(n/l8Ɣ˕a$/^?^VWeߤZfŐ0uOig zenݙ ȗ77BazBqL;|ay^ȗf(m I1՗׏k?~s}Ջdŏxzsȍ2.r?hjڱ h,[xzuxM*o%jk?oES #9ʝB3T M4&4=~1ν͘'8¸&p%L >Q]Q9NGyNpψn^/3<]wq )Fq؎EqzSUҢMR(Sn`~[W4RTHgk@OVnV;"8AqiՍnߞ2nqG$;:#`g(,yclV]W@_x?6R91x:r4&~1^iGC]r\c!(?(N89RSuԺk3cd-iLZYۗ7#6z|{WuXS2-YﳞƣMPۏZ[:  rQH:y+P52>~$E5O_:"tcqY22Y_œtpHN/(|GP¥5ɛ )93ia~ơ5Y`~̙?S|w 76>҄m&vA>(SՁ)O{%y+"{Yǫ~yz⫧ǧN&BX]#'ݸ.~"33yCl~8!ŒR9t 2bCf)RIxf^`)Ę٤v1=1&Fqٽ <S(2NCerKJ2;VƐQ^t:y+4ÝȤdQ&CTi!qTJ˘}mD&Fy&"cPvc!,=DT" HJnw/cUU^1s|&Mhmp!W18EzKl9]9"<"Aȱ䆹z?8] 3nm748TcE뢿#$,RxPGk%Uap*0ƥxܵ+ q5%_n:/sVaCʾੜQ5Nd$C1~Η QJb{&:Ze!a\^mIalc$xڙ-fN%ѹ~Z4z~9$B]5-68K6F KaC\cƠB|Y"uN|jȞ ? CT,'apd!'4RƮ5(6nS]; BiXq;nl\jgwS ^NyQ¤hO#!(4l]6 k;~)ⓒ;]sk%wg녵F+ qzw3 \L#hŌ x̊[}>ޯ^ɷH}{0hYW8e7$qm_vG\B9x/i c8egT !aeNVr/&. dY mzҮ$z]|ed(k9o,C$oؓ{35 }no-5Ozs]";`Ꟶ_:0J1ϝy6P/ I.*w0BiX:pR%j+ys$H0璫K7J_ xN:,w.I4&9MYJ7/yNq;خPǼwÞcHDhRvS,b9ha"/|Vt4Z]¼4 k2nNs-hazr|S]+'} Ji>6$P[5tZlgWOM6l$KpƆqC%;\x4V>Ұ$wTW FPSOMTOU$KӰ!v]Ǝy^p9ށ;/}1MibKYC {\m Ialcø9y4ڇ2'"'J}&:i6K)\rI$i5mA9?24i!4Z&a^5s gg>+WYO%F9 *Mv]_L?:-6q5e!4l&a^5ZNew:';'0z'5a6w]9}H e`qrJװՆha^yi8d56w>{ yyϕ߾se˛Jݽ CUb08N2{Նha^yi8x66ۮf_D5Nt5(_BUviY"UѾY 89kpn᜵0/L¼4 k2n۵|K+Urԏ1_UZ{0g;48pZ&a^5ƆqǶ,6D',L7Ѫ Vvm%h..N<3 .6F $KӰ!v;-uȫoK&0V F`-C+4pZ*ѽT 'qml7I<_T*'U} Aʹd`,Qhq{At6\IaC\cw~2T9bqU3+ t=Y"Z'4Ȋe- ^8x6kn\Ij+oX唒Ļ >R (u`tH8k>C+ ¼0 4qȸklZmn=άGV.mrfƒK.wWM%b08?94JspzB%$ ?*ꇎͬ#3o&o%ZG><4pZ&a^5sZ6 z9 9|]J]mnPq<\[m8 /T{Nq;0nA\ .Dɶ T3 +2hإg\5C-# 5lIaC\c>C;_)0IZ o;|saxC-n/_~O =_hRsoŋß6_^9.ﴹ6]o7}O?N0Amo%TEec]o_^B?9|=RyǏӫ ̟(ZBNHC9};R'TmC| \OERʙ~c BE/CQp̅Cid$^|*1/P7Sk F,$'n矞>>ZnLebۻ(n7/.=aݗ7/Gnn{x|Z۫YTԶǧ:f_q> _ 77Je]<-to秷'?J-B7!s7w<G!l'wf14Tq#GO3dxEyw_Gm|)%qkui$&R7@ۇw]i"pۘPX-X=zߴ4_Ù&<; JtIcKjDM;Msa;g=뤽wp)SOoZw/4|GQ@©Q;ۧG `]~ۿΞ9) |2XG dUϰ^1k?7G mGçOy1UE)Έ6pW7Eq&˩qC o\x ˴}uFy]L!e^>r&^`׉%]-۱!/)oQEӬO_!?4+xV}N8 φ~UC p˯CUʗ%B@.%LPP^Y'VOP$Q k1?@fTv7))lhc_+dp;L .)?endstream endobj 303 0 obj << /Filter /FlateDecode /Length 1973 >> stream xXێ}W4B-Yk ?$YH`,`y36-iA>;K_(-;&Ꜫb?Vӿ7)Q?xuaJ?^+W; [EKQYY 2Mu_~ajܑv٧]sTp4"z6 " v5s)iF9k.;:`xސZuю ͎w"97wi׬Jƚ}`>n<̲m3` Z)ZWȚ6x3w?>=F|P!x2-knK4!ޔ9DZ꯫j#(:eIȲ %EL.͕mۉx\]r`%=cnz$,^dYY$54j4B\`:'x-|(fLӚцhh~G9ym7C}z,ɥX?rXv\jxDM^ik@^"N0fusf@x>lO'<Ϭo=*)"]f#?6Ѿ&ȘPlݦ}j9d+CJN7it>MY &7UڮOtɺƳ0^5f3v'F=qF5mBfvobmejr"N=$u`\PK)醲JyE>W]+p9Ipu)-(b}Bb]HJ?pQo)tMQ=p1і$; xTWU($o~*qHu1լtti$C7zܘʰ]ێ',ۜD)m5~tB"i)RrL=MH)qrfʇf” Αt i9gcZj0Jޅi?^EcPc/0ԥb/L,Ϩ~߹ ?YS6P)kiuvjmU i%4ẍS:N&S68fܬu1BLiVF#&aނM"'|,Fw}}s<ݱ-T@H)M;^_9 FJ/]T沒ZZWUwpE8E 8!>M)|1<"/}BAlsiwϟ_R/7:b3~ѤQMW!?YpRj- CF9{ O#/!:4EBe$d:nM}f_5|IqЦD5 'D Wi'5V4wCoǓ;IJp?T_o Em@j Vfs{H+vnO9G\),A\A%3"Tn\J-^.٣w}nMs{>6٫TgVq+A)rW*P:2r,%/&(h 3KxPd4i,r̒TcYBSKgXT2cIątɗRV ]@**"eW@Em DKe-(4 =sjBÐ60|7eGiA889gԷJRendstream endobj 304 0 obj << /Filter /FlateDecode /Length 1145 >> stream xK#5+ZZ!D]vm$.\^E0!L2Ayf+S< C:qWVR*>6w+U/nVæqoAg(kJ*٦oLVPudPhTR?(o'~y3w워y)PûRS+CBħ!Vu BtxeYW~d ĻHVgڻQ @2O坠`A,g$3m34,f^Vg=H ʙ29D RPːcv:TI1Az @={鷉7\dj ?;iD<|{ZPqXxoe糴EYmWEo9azD Vxa(br#ϫ6^La}+1Q{yYmy2?<YI!|uwb쨐6OCYbyvDˊO*%:AZ0ۥ Ȓ6~@> ڻ|mJb<_z}:ȇ߭'?O{ul% ^e@Y*i1t'OOZ oW'&Wx(۞'7IY^X\%Ox' m'#^a'W#eq*#9൤p~}!K)>4hqy M/21f1|~2 s"GR_ڟ/o/!v*Y^|6VVnq>6(ZNV}endstream endobj 305 0 obj << /Filter /FlateDecode /Length 694 >> stream xMk1\B-͵Keo9\ǩ5 am?H3h+l|>Y`}Z^~7Vr%ւuY~dsj `o+`+  #vAY_͵e'"'](a!̉aQueĨl/KԌ#Ԟcy=X@Jdu*oKbPf&FJ (.k<*/Iʙw:'eiՐi,-54'sA%3:DJ`0eо[:-+L{ϹpC835CSʐcz[. ViaiĨʴS%Z VB ]RʺgAP{AP8$X/T hNN.P_v)sK(X}\_P:!.ʸ"ɁXxo ˄0C$g HM0 mh3!2B& נ qJ2! Y3,ti! 3TG3ǂ(gkB!gPBkiviߙe¬Op{-`"K0Zf,̟VLnĦwi 8f \O, D@u-{|ޗo endstream endobj 306 0 obj << /Filter /FlateDecode /Length 1190 >> stream xXKoFWj3C.r)zI 'Y֫Xbw$^Uk⾾Pζ,B⡀f~f pX$,$KJ*ɶލ$Bh *<$n'TR@eK&_l0`/( ^e#8Fl=J(El0ʯ` Ҿ\:`X[I`/8[LIRE `' `l4B~3 dVtCRk9E<^ˡ_u>l*r![^qhyS![kl*sQ~uHF&_/Z jz|v N)P~!P:%{,ﱤcb JFhy#Gc}|>ސYi/?:;A}b,X!X]E5b֙QFxH> stream x\o{߂bA:D "@==:_8kVInEC'g~qRlRk&br{|= Ns=y&Z?E^3Y_>WZhbٻ57sJfhTVoRg_rd8vs f6+lC'Ѧk dN備tٟ7}'^\*Iڧ3?ޑY<4OVwShwX-}@!E }*&Cp2Ν2&I&'7xZ沰ʼܴyjl™- +@dRnP9ъʹ0;N;7-LH&*n3EZe}ha,_7ea@M ]̡Xon8r}xzC,7(Ri=g(Ml4SQ,(/eM`b8Wj2aC;syT>RNô.Dv"F9X6*fiVͬɍ3T(rl*..OݼH1-Aj3Ȁ]\T' Qt穂qc(W:g<96ZehB`H'գ1 ߾]J6}sEF>f:4pN: ;mj vvv˜uf\Kф8wYȁVՆ/;b]o51 \ רn.~FC"2H[H]6Ɲp ;QҚDdv,I7= hIyeW=\ fH1tjsXnrǁ;]*:i.dG6?_֋eď67R~CP;R &q,l*-yrFOw]$$gSWEA0ZWqX#dg@gJfJցJAuo@q룘ǰ9d1lŽ'ZBCr55@B4^ JO00ߌa\AN/9f#Ϧo"vؒxA X1M|2ꞇ]EY] 8bhr왛ry9.߿rs_ؔfJ{[T2H~JJtA(?f{TLݔw/7<n:wC;j)qsd!+#G Ff>K̃ JxH̋(5M&yB0q?C{jJgE6wE;gP,+dh7T8D!{ކiOMMQVl;Tex!hԠBL~mG%PO r:|8kYdyڧz`yiFFA4֝۔@Xv 8t+aؑ*0;r{/+jd]] Bt*1@AהĐx헇]4A)+rYt}(7WWۻ+Xr~212ib&8r㌥Z&W9߹P6UTo8 >#x>[Ď$^P*{&rNL>{I/(N6.ZRP(Ɣlq]?,(E5!I 3,rmToOe];E$ gn6cluƮK*6-g]Y/ml3 V @Nn &ไ3q@$g(g!<<brqGJ :}Mˎ|n]jH M(ouǰ%"#z.qs5)+se$9.{T6k/OOѾeYý4 ut+%p-8ep[Y?U\N㽩Omҁ2~b5 %_/^ jqpˌ~Qr[=ĕl-ܴD RQȯb DK-Dr)aD2SGoo{q͋f5TDFFDU" P_c 3$Ÿ=K8%Ѯ+} 2"'Qd"w{益(dc T+^~!J@S3V!`"ȵ/l)ꢻld#jd:U?e@ȥ FD+L7E"qqxr;=U >݌u3U:xpѡ{ΚI3] )Y1J<ǝr Rs9/0X;%^`|clH9? ESr#(#Fx{o]|[Nŷβӄ3^bD| 4 `%,+4%zߘKMڐ 6>e95Mk[ei7j))u$3&ńFϱ΄rfSwh‚PrLZTUr-NX% ~qRgg? \KqϬF lϬyz{Y B㌐3U7YL{kL=-0Mi[ŤB?.cb׫U*YkB9ӗnHe > /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 309 /ID [<30b260927d55bbd48b1c73a919256eea>] >> stream xO+DQs3[׸ !{x (KW aKXlmNa$:+۝ŧgsi5XUKM n5t/& -5>홫kpJe@r\H"λ%[eپ>de>dשӟ'-cV'$IWOٽv; ge KY?Q yEJ)ۗ#f#oLʴ|TerrX3xuy:{jNc< endstream endobj startxref 343785 %%EOF glmnet/inst/doc/Coxnet.R0000644000176200001440000000157213574046150014657 0ustar liggesusers## ------------------------------------------------------------------------ library("glmnet") library("survival") patient.data <- readRDS("assets/coxnet.RDS") ## ---- warning = TRUE----------------------------------------------------- cv.fit <- cv.glmnet(patient.data$x, Surv(patient.data$time, patient.data$status), family="cox", maxit = 1000) fit <- glmnet(patient.data$x, Surv(patient.data$time,patient.data$status), family = "cox", maxit = 1000) ## ------------------------------------------------------------------------ plot(cv.fit) cv.fit$lambda.min ## ------------------------------------------------------------------------ Coefficients <- coef(fit, s = cv.fit$lambda.min) Active.Index <- which(Coefficients != 0) Active.Coefficients <- Coefficients[Active.Index] ## ------------------------------------------------------------------------ Active.Index Active.Coefficients glmnet/inst/doc/glmnet.R0000644000176200001440000002776313574046164014724 0ustar liggesusers## ---- eval=FALSE--------------------------------------------------------- # install.packages("glmnet", repos = "https://cran.us.r-project.org") ## ------------------------------------------------------------------------ library(glmnet) ## ------------------------------------------------------------------------ data(QuickStartExample) ## ------------------------------------------------------------------------ fit = glmnet(x, y) ## ------------------------------------------------------------------------ plot(fit) ## ----height = 4---------------------------------------------------------- print(fit) ## ------------------------------------------------------------------------ coef(fit,s=0.1) ## ------------------------------------------------------------------------ set.seed(29) nx = matrix(rnorm(10*20),10,20) predict(fit,newx=nx,s=c(0.1,0.05)) ## ------------------------------------------------------------------------ cvfit = cv.glmnet(x, y) ## ------------------------------------------------------------------------ plot(cvfit) ## ------------------------------------------------------------------------ cvfit$lambda.min ## ------------------------------------------------------------------------ coef(cvfit, s = "lambda.min") ## ------------------------------------------------------------------------ predict(cvfit, newx = x[1:5,], s = "lambda.min") ## ------------------------------------------------------------------------ fit = glmnet(x, y, alpha = 0.2, weights = c(rep(1,50),rep(2,50)), nlambda = 20) ## ------------------------------------------------------------------------ print(fit) ## ------------------------------------------------------------------------ plot(fit, xvar = "lambda", label = TRUE) ## ------------------------------------------------------------------------ plot(fit, xvar = "dev", label = TRUE) ## ------------------------------------------------------------------------ fit = glmnet(x, y) any(fit$lambda == 0.5) coef.apprx = coef(fit, s = 0.5, exact = FALSE) coef.exact = coef(fit, s = 0.5, exact = TRUE, x=x, y=y) cbind2(coef.exact, coef.apprx) ## ------------------------------------------------------------------------ predict(fit, newx = x[1:5,], type = "response", s = 0.05) ## ------------------------------------------------------------------------ cvfit = cv.glmnet(x, y, type.measure = "mse", nfolds = 20) ## ---- eval=FALSE--------------------------------------------------------- # require(doMC) # registerDoMC(cores=2) # X = matrix(rnorm(1e4 * 200), 1e4, 200) # Y = rnorm(1e4) ## ---- eval=FALSE--------------------------------------------------------- # system.time(cv.glmnet(X, Y)) ## ---- echo=FALSE--------------------------------------------------------- structure(c(2.44, 0.08, 2.518, 0, 0), class = "proc_time", .Names = c("user.self", "sys.self", "elapsed", "user.child", "sys.child")) ## ---- eval=FALSE--------------------------------------------------------- # system.time(cv.glmnet(X, Y, parallel = TRUE)) ## ---- echo=FALSE--------------------------------------------------------- structure(c(0.508999999999999, 0.057, 1.56699999999999, 1.941, 0.1), class = "proc_time", .Names = c("user.self", "sys.self", "elapsed", "user.child", "sys.child")) ## ------------------------------------------------------------------------ cvfit$lambda.min coef(cvfit, s = "lambda.min") predict(cvfit, newx = x[1:5,], s = "lambda.min") ## ------------------------------------------------------------------------ foldid=sample(1:10,size=length(y),replace=TRUE) cv1=cv.glmnet(x,y,foldid=foldid,alpha=1) cv.5=cv.glmnet(x,y,foldid=foldid,alpha=.5) cv0=cv.glmnet(x,y,foldid=foldid,alpha=0) ## ------------------------------------------------------------------------ par(mfrow=c(2,2)) plot(cv1);plot(cv.5);plot(cv0) plot(log(cv1$lambda),cv1$cvm,pch=19,col="red",xlab="log(Lambda)",ylab=cv1$name) points(log(cv.5$lambda),cv.5$cvm,pch=19,col="grey") points(log(cv0$lambda),cv0$cvm,pch=19,col="blue") legend("topleft",legend=c("alpha= 1","alpha= .5","alpha 0"),pch=19,col=c("red","grey","blue")) ## ------------------------------------------------------------------------ tfit=glmnet(x,y,lower=-.7,upper=.5) plot(tfit) ## ------------------------------------------------------------------------ p.fac = rep(1, 20) p.fac[c(5, 10, 15)] = 0 pfit = glmnet(x, y, penalty.factor = p.fac) plot(pfit, label = TRUE) ## ------------------------------------------------------------------------ set.seed(101) x=matrix(rnorm(1000),100,10) y=rnorm(100) vn=paste("var",1:10) fit=glmnet(x,y) plot(fit) ## ------------------------------------------------------------------------ par(mar=c(4.5,4.5,1,4)) plot(fit) vnat=coef(fit) vnat=vnat[-1,ncol(vnat)] # remove the intercept, and get the coefficients at the end of the path axis(4, at=vnat,line=-.5,label=vn,las=1,tick=FALSE, cex.axis=0.5) ## ------------------------------------------------------------------------ data(MultiGaussianExample) ## ------------------------------------------------------------------------ mfit = glmnet(x, y, family = "mgaussian") ## ------------------------------------------------------------------------ plot(mfit, xvar = "lambda", label = TRUE, type.coef = "2norm") ## ------------------------------------------------------------------------ predict(mfit, newx = x[1:5,], s = c(0.1, 0.01)) ## ------------------------------------------------------------------------ cvmfit = cv.glmnet(x, y, family = "mgaussian") ## ------------------------------------------------------------------------ plot(cvmfit) ## ------------------------------------------------------------------------ cvmfit$lambda.min cvmfit$lambda.1se ## ------------------------------------------------------------------------ data(BinomialExample) ## ------------------------------------------------------------------------ fit = glmnet(x, y, family = "binomial") ## ------------------------------------------------------------------------ plot(fit, xvar = "dev", label = TRUE) ## ------------------------------------------------------------------------ predict(fit, newx = x[1:5,], type = "class", s = c(0.05, 0.01)) ## ------------------------------------------------------------------------ cvfit = cv.glmnet(x, y, family = "binomial", type.measure = "class") ## ------------------------------------------------------------------------ plot(cvfit) ## ------------------------------------------------------------------------ cvfit$lambda.min cvfit$lambda.1se ## ------------------------------------------------------------------------ coef(cvfit, s = "lambda.min") ## ------------------------------------------------------------------------ predict(cvfit, newx = x[1:10,], s = "lambda.min", type = "class") ## ------------------------------------------------------------------------ data(MultinomialExample) ## ------------------------------------------------------------------------ fit = glmnet(x, y, family = "multinomial", type.multinomial = "grouped") ## ------------------------------------------------------------------------ plot(fit, xvar = "lambda", label = TRUE, type.coef = "2norm") ## ------------------------------------------------------------------------ cvfit=cv.glmnet(x, y, family="multinomial", type.multinomial = "grouped", parallel = TRUE) plot(cvfit) ## ------------------------------------------------------------------------ predict(cvfit, newx = x[1:10,], s = "lambda.min", type = "class") ## ------------------------------------------------------------------------ data(PoissonExample) ## ------------------------------------------------------------------------ fit = glmnet(x, y, family = "poisson") ## ------------------------------------------------------------------------ plot(fit) ## ------------------------------------------------------------------------ coef(fit, s = 1) predict(fit, newx = x[1:5,], type = "response", s = c(0.1,1)) ## ------------------------------------------------------------------------ cvfit = cv.glmnet(x, y, family = "poisson") ## ------------------------------------------------------------------------ plot(cvfit) ## ------------------------------------------------------------------------ opt.lam = c(cvfit$lambda.min, cvfit$lambda.1se) coef(cvfit, s = opt.lam) ## ------------------------------------------------------------------------ data(CoxExample) y[1:5,] ## ------------------------------------------------------------------------ fit = glmnet(x, y, family = "cox") ## ------------------------------------------------------------------------ plot(fit) ## ------------------------------------------------------------------------ coef(fit, s = 0.05) ## ------------------------------------------------------------------------ cvfit = cv.glmnet(x, y, family = "cox") ## ------------------------------------------------------------------------ plot(cvfit) ## ------------------------------------------------------------------------ cvfit$lambda.min cvfit$lambda.1se ## ------------------------------------------------------------------------ coef.min = coef(cvfit, s = "lambda.min") active.min = which(coef.min != 0) index.min = coef.min[active.min] ## ------------------------------------------------------------------------ index.min coef.min ## ------------------------------------------------------------------------ data(SparseExample) ## ------------------------------------------------------------------------ class(x) ## ------------------------------------------------------------------------ fit = glmnet(x, y) ## ------------------------------------------------------------------------ cvfit = cv.glmnet(x, y) plot(cvfit) ## ------------------------------------------------------------------------ i = sample(1:5, size = 25, replace = TRUE) j = sample(1:20, size = 25, replace = TRUE) x = rnorm(25) nx = sparseMatrix(i = i, j = j, x = x, dims = c(5, 20)) predict(cvfit, newx = nx, s = "lambda.min") ## ------------------------------------------------------------------------ data(QuickStartExample) fit = glmnet(x, y) print(fit) ## ------------------------------------------------------------------------ glmnet.control(fdev = 0) fit = glmnet(x, y) print(fit) ## ------------------------------------------------------------------------ glmnet.control(factory = TRUE) ## ------------------------------------------------------------------------ glmnet.control() ## ---- echo=FALSE--------------------------------------------------------- data(QuickStartExample) ## ----eval=FALSE---------------------------------------------------------- # fit = glmnet(x, y, intercept = F, standardize = F, lambda = 8/(2*dim(x)[1]), thresh = 1e-20) ## ----eval=FALSE---------------------------------------------------------- # beta_glmnet = as.matrix(predict(fit, type = "coefficients")[-1,]) ## ------------------------------------------------------------------------ fit = glmnet(x, y, intercept = F, standardize = F, thresh = 1e-20) beta_glmnet = as.matrix(predict(fit, s = 8/(2*dim(x)[1]), type = "coefficients", exact = TRUE, x=x, y=y)[-1,]) ## ---- eval=FALSE--------------------------------------------------------- # library(CVXfromR) # setup.dir = "change/this/to/your/cvx/directory" # n = dim(x)[1]; p = dim(x)[2] # cvxcode = paste("variables beta(p)", # "minimize(square_pos(norm(y - x * beta, 2)) + lambda * norm(beta, 1))", # sep = ";") # Lasso = CallCVX(cvxcode, const.var = list(p = p, x = x, y = y, lambda = 8), opt.var.names = "beta", setup.dir = setup.dir, matlab.call = "change/this/to/path/to/matlab") # beta_CVX = Lasso$beta ## ------------------------------------------------------------------------ data(CVXResults) ## ----message=FALSE------------------------------------------------------- require(lars) ## ------------------------------------------------------------------------ fit_lars = lars(x, y, type = "lasso", intercept = F, normalize = F) beta_lars = predict(fit_lars, s = 8/2, type = "coefficients", mode = "lambda")$coefficients ## ------------------------------------------------------------------------ cmp = round(cbind(beta_glmnet, beta_lars, beta_CVX), digits = 6) colnames(cmp) = c("beta_glmnet", "beta_lars", "beta_CVX") cmp glmnet/inst/CITATION0000644000176200001440000000331513534017153013656 0ustar liggesuserscitHeader("To cite glmnet in publications use:") citEntry(entry = "Article", title = "Regularization Paths for Generalized Linear Models via Coordinate Descent", author = personList(as.person("Jerome Friedman"), as.person("Trevor Hastie"), as.person("Robert Tibshirani")), journal = "Journal of Statistical Software", year = "2010", volume = "33", number = "1", pages = "1--22", url = "http://www.jstatsoft.org/v33/i01/", textVersion = paste("Jerome Friedman, Trevor Hastie, Robert Tibshirani (2010).", "Regularization Paths for Generalized Linear Models via Coordinate Descent.", "Journal of Statistical Software, 33(1), 1-22.", "URL http://www.jstatsoft.org/v33/i01/.") ) citEntry(entry = "Article", title = "Regularization Paths for Cox's Proportional Hazards Model via Coordinate Descent", author = personList(as.person("Noah Simon"), as.person("Jerome Friedman"), as.person("Trevor Hastie"), as.person("Rob Tibshirani")), journal = "Journal of Statistical Software", year = "2011", volume = "39", number = "5", pages = "1--13", url = "http://www.jstatsoft.org/v39/i05/", textVersion = paste("Noah Simon, Jerome Friedman, Trevor Hastie, Rob Tibshirani (2011).", "Regularization Paths for Cox's Proportional Hazards Model via Coordinate Descent.", "Journal of Statistical Software, 39(5), 1-13.", "URL http://www.jstatsoft.org/v39/i05/."), header = "If coxnet is used, please also cite:" )