diff --git a/Maya2glTF.vcxproj b/Maya2glTF.vcxproj index e77c707..7cb037d 100644 --- a/Maya2glTF.vcxproj +++ b/Maya2glTF.vcxproj @@ -164,7 +164,7 @@ xcopy /y "$(OutputPath)$(TargetName).mll" "$(userprofile)\Documents\Maya\$(MayaVersion)\plug-ins\" xcopy /y "$(ProjectDir)maya\scripts\maya2glTF_UI.mel" "$(userprofile)\Documents\Maya\$(MayaVersion)\scripts\" xcopy /y "$(ProjectDir)maya\scripts\maya2glTF_assignPbrShader.mel" "$(userprofile)\Documents\Maya\$(MayaVersion)\scripts\" - +xcopy /y /s /i "$(ProjectDir)maya\renderData\*.*" "$(userprofile)\Documents\Maya\Maya2glTF\PBR" @@ -205,7 +205,7 @@ xcopy /y "$(ProjectDir)maya\scripts\maya2glTF_assignPbrShader.mel" "$(userprofil xcopy /y "$(OutputPath)$(TargetName).mll" "$(userprofile)\Documents\Maya\$(MayaVersion)\plug-ins\" xcopy /y "$(ProjectDir)maya\scripts\maya2glTF_UI.mel" "$(userprofile)\Documents\Maya\$(MayaVersion)\scripts\" xcopy /y "$(ProjectDir)maya\scripts\maya2glTF_assignPbrShader.mel" "$(userprofile)\Documents\Maya\$(MayaVersion)\scripts\" - +xcopy /y /s /i "$(ProjectDir)maya\renderData\*.*" "$(userprofile)\Documents\Maya\Maya2glTF\PBR" @@ -246,7 +246,7 @@ xcopy /y "$(ProjectDir)maya\scripts\maya2glTF_assignPbrShader.mel" "$(userprofil xcopy /y "$(OutputPath)$(TargetName).mll" "$(userprofile)\Documents\Maya\$(MayaVersion)\plug-ins\" xcopy /y "$(ProjectDir)maya\scripts\maya2glTF_UI.mel" "$(userprofile)\Documents\Maya\$(MayaVersion)\scripts\" xcopy /y "$(ProjectDir)maya\scripts\maya2glTF_assignPbrShader.mel" "$(userprofile)\Documents\Maya\$(MayaVersion)\scripts\" - +xcopy /y /s /i "$(ProjectDir)maya\renderData\*.*" "$(userprofile)\Documents\Maya\Maya2glTF\PBR" @@ -291,7 +291,7 @@ xcopy /y "$(ProjectDir)maya\scripts\maya2glTF_assignPbrShader.mel" "$(userprofil xcopy /y "$(OutputPath)$(TargetName).mll" "$(userprofile)\Documents\Maya\$(MayaVersion)\plug-ins\" xcopy /y "$(ProjectDir)maya\scripts\maya2glTF_UI.mel" "$(userprofile)\Documents\Maya\$(MayaVersion)\scripts\" xcopy /y "$(ProjectDir)maya\scripts\maya2glTF_assignPbrShader.mel" "$(userprofile)\Documents\Maya\$(MayaVersion)\scripts\" - +xcopy /y /s /i "$(ProjectDir)maya\renderData\*.*" "$(userprofile)\Documents\Maya\Maya2glTF\PBR" @@ -336,7 +336,7 @@ xcopy /y "$(ProjectDir)maya\scripts\maya2glTF_assignPbrShader.mel" "$(userprofil xcopy /y "$(OutputPath)$(TargetName).mll" "$(userprofile)\Documents\Maya\$(MayaVersion)\plug-ins\" xcopy /y "$(ProjectDir)maya\scripts\maya2glTF_UI.mel" "$(userprofile)\Documents\Maya\$(MayaVersion)\scripts\" xcopy /y "$(ProjectDir)maya\scripts\maya2glTF_assignPbrShader.mel" "$(userprofile)\Documents\Maya\$(MayaVersion)\scripts\" - +xcopy /y /s /i "$(ProjectDir)maya\renderData\*.*" "$(userprofile)\Documents\Maya\Maya2glTF\PBR" @@ -381,7 +381,7 @@ xcopy /y "$(ProjectDir)maya\scripts\maya2glTF_assignPbrShader.mel" "$(userprofil xcopy /y "$(OutputPath)$(TargetName).mll" "$(userprofile)\Documents\Maya\$(MayaVersion)\plug-ins\" xcopy /y "$(ProjectDir)maya\scripts\maya2glTF_UI.mel" "$(userprofile)\Documents\Maya\$(MayaVersion)\scripts\" xcopy /y "$(ProjectDir)maya\scripts\maya2glTF_assignPbrShader.mel" "$(userprofile)\Documents\Maya\$(MayaVersion)\scripts\" - +xcopy /y /s /i "$(ProjectDir)maya\renderData\*.*" "$(userprofile)\Documents\Maya\Maya2glTF\PBR" diff --git a/Readme.md b/Readme.md index f146060..35ea03e 100644 --- a/Readme.md +++ b/Readme.md @@ -4,12 +4,81 @@ ![Maya Helmet screenshot](/img/maya_screenshot.jpg) - +## Usage + +* *Maya 2018 and 2017, tested on Windows 10 x64 only for now* + +* To **install**: + * install the [Microsoft Visual C++ redistributables](https://go.microsoft.com/fwlink/?LinkId=746572). + * on many systems this is already installed, so you might want to skip this step. + * download the desired [Maya2glTF_xxx.zip release](https://github.com/Ziriax/Maya2glTF/releases) + * extract the downloaded `zip` file to any location (e.g. your desktop) + * open the created `Maya2glTF` folder + * double click on the `deploy.bat` file + * This will copy the plug-in and scripts to your `Documents` folder + * re-launch Maya 2017 or 2018 + +* To **export**: + * load a scene + * in the Maya script window, type `maya2glTF_UI` to launch the UI. + * You might want to select the `maya2glTF_UI` script text and drag it using the middle-mouse-button to the `Custom` shelf, or even better, make a `glTF` shelf... + * select the meshes you want export + * or click the `select all polygon meshes` button + * select the desired animation clips source using the dropdown box + * TRAX animation clips are also supported. + * *only enabled clips on the first track are exported*. + * if you have multiple characters, select the desired one. + * hit the `export selected meshes` button. + * *currently the user interface is not automatically updated when you change or load a scene; just re-run the `maya2glTF_UI` script or hit the `refresh user interface` button*. + * good luck! ;-) + +* To **help**: + * let me know if this doesn't work for you, this is BETA stuff ;-) + * ideally make an issue, providing the OS, Maya and plug-in version, and a test-scene. + * if it *does* work, please give Maya2glTF a :star: on GitHUB, and spread the word :sunglasses: + +* To **shade**: + * *I assume you already used something like Substance Painter to create glTF-PBR textures* + * select the polygons you want to shade + * click the `assign PBR shader to selection` button + * the first time, you need to select our PBR OpenGL shader at: + * `Documents\maya\Maya2glTF\PBR\shaders\glTF_PBR.ogsfx` + * next, select all the PBR textures you want to apply in one go: + * for example, for the [damaged helmet model](https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/DamagedHelmet/glTF), multi-select the following textures: + * `Default_normal.jpg` + * `Default_albedo.jpg` + * `Default_AO.jpg` + * `Default_emissive.jpg` + * `Default_metalRoughness.jpg` + * now the PBR shader and all textures should be applied to your selection + * by default we use the following keyword-in-filename convention to detect the kind of texture: + * `base` or `albedo` => base color texture + * `metal` or `orm` => metallic texture + * `rough` or `orm` => roughness texture + * `occlusion` or `orm` or `ao` => occlusion texture + * `normal` => tangent space normal texture + * see also the `-mts` flag for MikkTSpace information if your models come from Blender + * `emissive` => emissive texture + * `diffuse_env` => Image-based-lighting (IBL) prefiltered diffuse environment map (PMREM) + * `specular_env` => Image-based-lightning (IBL) prefiltered specular environment map (PMREM) + * `brdf` => Bidirectional reflectance distribution function lookup table texture + * *you can customize these conventions, see `maya2glTF_assignPbrShader.mel`* + * all textures are optional + * see the [glTF PBR page](https://github.com/KhronosGroup/glTF-WebGL-PBR) page for more info. + * the metallic and roughness textures are always merged into a single texture when exporting. + * *If you provide JPEGs, we use Maya's JPEG encoder to generate this texture. However, the default Maya JPEG encoding settings are very low quality*. + * The following MEL snippet sets the JPEG encoder quality: + ``` + putenv "AW_JPEG_Q_FACTOR" "92"; + ``` + * The following MEL code enables maximum possible JPEG quality: + ``` + putenv "AW_JPEG_Q_FACTOR" "100"; + putenv "AW_JPEG_SUB_SAMPLING" "1x1,1x1,1x1"; + ``` ## Update -The fourth BETA is released! See the [releases](https://github.com/Ziriax/Maya2glTF/releases) tab. - -*Maya 2017 and 2018 on Windows x64 only for now* +The fifth BETA is released! See the [releases](https://github.com/Ziriax/Maya2glTF/releases) tab. ## Rationale diff --git a/img/logo.pdn b/img/logo.pdn new file mode 100644 index 0000000..0e45a30 --- /dev/null +++ b/img/logo.pdn @@ -0,0 +1,397 @@ +PDN3 NPaintDotNet.Data, Version=4.21.6589.7045, Culture=neutral, PublicKeyToken=nullPaintDotNet.Document +isDisposedlayerswidthheight savedWithuserMetadataItemsPaintDotNet.LayerListSystem.VersionSystem.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]][]   PaintDotNet.LayerListparentArrayList+_itemsArrayList+_sizeArrayList+_versionPaintDotNet.Document  System.Version_Major_Minor_Build _RevisionSystem.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]keyvalue +$exif.tag3 +H +$exif.tag4 1 +$exif.tag55 +$exif.tag65 +$exif.tag8D +$exif.tag9/ $exif.tag107 $exif.tag117 ! " # $ %  &NPaintDotNet.Core, Version=4.21.6589.7045, Culture=neutral, PublicKeyToken=null PaintDotNet.BitmapLayer +propertiessurfaceLayer+isDisposed Layer+width Layer+heightLayer+properties-PaintDotNet.BitmapLayer+BitmapLayerPropertiesPaintDotNet.Surface&!PaintDotNet.Layer+LayerProperties ' ( )! * + ," - . /# 0 1 2$ 3 4 5% 6 7 8'-PaintDotNet.BitmapLayer+BitmapLayerPropertiesblendOp&PaintDotNet.UserBlendOps+NormalBlendOp 9(PaintDotNet.Surfacewidthheightstridescan0PaintDotNet.MemoryBlock&& :)!PaintDotNet.Layer+LayerPropertiesnameuserMetadataItemsvisible isBackgroundopacity blendModeSystem.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]][]PaintDotNet.LayerBlendMode;Layer 4 <PaintDotNet.LayerBlendModevalue__*' >+( ?,)@Layer 2 <-' C.( D/)ELayer 4 <0' H1( I2)JLayer 3 <3' M4( N5)OLayer 5 <6' R7( S8) O <9&PaintDotNet.UserBlendOps+NormalBlendOp:PaintDotNet.MemoryBlocklength64 hasParentdeferred &Ģ <System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]>9?:Ģ C9D:Ģ H9I:Ģ M9N:Ģ R9S:Ģ  /gbEDDDq@ ĊDV!"'q8@ '\ +vvvz?Swe~V$I$I$Iw뻮+]]wtv]tZo^w+L$i>}U<󏮻CϺ^uQӑ?k[$i\}Ww1ȱ1ɱi}~$I3zKׯ:9F9V9f9v99ϧ$i>{t +Q/הquf_ԴEy}AEIυ$-ZU-TWra:.2+ݳ=1O999ןUϜ$VoCG'|uBϣ$*]^> y2)]{?GuVY9,y{IV"|.uWISR`^0|g\em p\;H*iL}x=DZ5׬g3!Z߈qgrgU~#2~-{#i~e]`>/kWICy ^-I4wW>?{֗|%g߃j4~. ZepZ;c͎4LW֭VYsTa#g4;~/`x/^tҔ:~I`kZ{Ge [sGʽHi\].|V@Zz-t; -1<㔽UOߖ(Td=j?nHs-<*;ay4lw,-1~JWs~dV=餬h'Ln=JbhQYêe|kQ1C3 `|7eƨ㤖U>sy Xe2?j_}<1y~`j]v̋4uڏWyn)xyd^!2/sc~62?,eݍy36sRd;<#k^:d`2?^ƕQ>,r> oy +z\gn)?VqZV~~X'cj?nke{^L{̷V@}]|؃Șz^=yٓuמ%~~XjY3SeUCK~sZz`Vye]0vy`eyכrF\gwlYy7S4S7S3cJw2,˲_κ|t[~kX7]_Tyh0m?Vyhl}YLX~- ᷚ?*,a߶{V緳f 059?x@UynmXl>7Ba` 0P +BP( +@( @!Z  +@@ B(@`wu3M9{L}>9} +|MJ71}ߝg</1}ߝu߸<lwq1}eV=8EL{Ἣz;1}4uw<2ͥ;Ci/rL߃;$pLe:Vib8nL߇sm\8զ6.j)V}]FLߋcV311W3zp>Ss>"nLۍ`L-Ǽ^"gk@Yt^PEt~Pe?t#,z9{q(2n e`uw9Do7+vv㕞Xkۍc޴$WKyV,{qݎp1M7^+*1xp.oc^3+O4p.})q>"˕8[M}QuP8b^s:(͘nj3y, +98fVN7vm\8ո?q>\yWN6+:rݫ"@\@ #"Z@D@ Db@ #"oՋk][Lu9uD^4îuGGư4 u/6LmEV[>6LO>Y=مv4׫VS6n 0)ף~\4ZSQ?uխ1w.Z=`Q0V_]w=yk#g~T5IW,9r.M#=y_8x3~nwL;צwG7gS3 ~y/=Xp0Q?|Wu(KE|ԷsP{Q?ܣӓ3y~hQ?MW> ۦQ?K`g+睡lc pcɘZOބtadX@?Xm}|r|z1/PrSɽU{Ŕ{yܗѽw.< +G96_T })xy{Zrl,o}7}yG\lN?ғcwߜy@}:m^#U:k}FԏZG|qԏZ|N5kp zrMy>Q=k.ߵ^TX՝Nu=\핿*oOӻ`YF8n=7`ޛ Q?~۶E]q[VpϤNaD8w"\cd8yg/Z EizXcb~~LW6/~ )Ǿas%0oQ?ߝ0v9W=j3/j̏X{/F8av!̏v)W ;EՅ0?Öcj;܍,ϭ0Em""*r~'{T;*s@EU{> zOþO'@1Cn݉O:+M@r㞴HHKe5{t69iyϢj,yFcrXM[Q?I]kԏ_Rlz)A˱FԏSREyd?E$UKcR[p*%/] ϱT},r{ |M^r9}eMc6{T3˵_)0ÚE.0t6#Y=Hc*CC(6򙁼S=nHS(Cފ(Z/k +O¾R.Jy ^@җw~5x^6!5O@ڊ\{s!Si šXU^;y YRi3<keiׯnuIxFb皞&ڨ>%fDs{LGDIt6\+csb1z&iX깗Ewcv%i:睦Ôﱹy*=;.gM\s6Gԇ~w9Z}Hfyu;A<V}]Hf1.ie6%ϵ<ܫ>%KM:yM% se]{ឩk9y=HG4fe:DyTTUg;!LK&wjWk-{ۡN\Q`DEYQY@ *H@T **Hx> +@@VNٛ6voO3{jXۇݔXHo5z>X%oaKjwazνN;ngMz Km(wsFj}ѓfڗv^Ζij֩}i23"5JRiL-'#w~[mLlѮ]H}QIj^I)~rNkYeՋϞKrJn+k5vNkbiS'O9=;Yvf/KlĢ!1 Om"!1 Om"! \UI:{ {eDV#bFD6[auDDDFQGqA%Zٗ@  BBg9T>]]˭[9  B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!b]Qfo9c+ %qi܊<ZB!Dȶ(MZ"˺B2ǐ[.dB!z1.[j ?g㷱 _v\Qjw}X}CnZ{Q>Oxn!+{+B a$g}i n_}?q/wzEyix3^C^I{E+|g>`mhcat.. Vkt5!#e]w>8&D1yoBMudr>gfƋ9s8wgN)<.Ҹ7M>$uUߏ01ǣA+V_A.>\?oV#m=i`oůq.+wUF +!D/ǥ _ cKt~+esm; li}pC @C]!ޖesN[֑5+a\ 4mx 7ᯃv=v xS|n6b[q˃~Qrd $xL-1ߍ?ՎB& {}~aokCy)?ȶq?9_Gnw5h\p=lc  sOx &G{-gum^e24[_#]#_3}pfkXBOx~9\o7ޕ}֡iLh|=ل98gۘɅ6EKYh!Q~<0#?~ĺ~"ۊϱ~xcWmvϚ/Cš#4^G!G1sx=>Sm<$nf_֒Zc\[2Ǡ-1G(ֿg[f;M ][gq|?xڞ$gBL{7]=ҍWuvsr 8-*;Y]oxִ10</gU%8Y]: ۅl܎IH7Ѯ+xsw`Pοu[no+zSx7X:.h#lBw&Gqzqjps-nNBJu?SJh ؓB0#ޭTȷ:am:L!D 8*E3Wq3_;kdOekCf5sV`iYs]TV+`8̐8T2qNIRC6}t<=`Mslr82rlZ[޿-#gY/*g=~ 6ƣ֩B4LߴYk}mtg{a]xӚdגǥ6=ζă=ʷ;u>RT\m | x앞"#|4}*}:wwq^y9veִ>hVBKȜ͜-f؜B~3ŜGk؏bF|s}mP~q&֛\V9ǸE~#ˎίgս5 %x,M?$[\G'4mm=Z !D%8uC^4loG(ww}KJڑE<|^uҦuy d} }lğ\N{gZsIKxFP6h6Okçc|_?o87jBQ'deM96\UQg_jiù;a΋v-Kثj셓5d"ǻ4k'Dmdmm*Ww&/iƸTIͮqM6tUλ=0;30$d=v=_8kgVlul4u[+ ecdBt7JvR# +R.neUվvy=Ƨ0ъ']#8do߉̫sB߷D[~6T#8Zs4*ƅg]p*>nKBS1=i3.#ohS\5c\r +۶ﯵX8-Y42lFաB#FQ!8v]Pu+A6'leW5̆B<$/)tQ(ې+lN8p{:dՅR!fWp xQ(蛐+:K__6Ư1G Ǐ'+;~a]+aQV/.lT6 +!ί3_lx6>XUq#ej|A6-_VjUQCČ_窳Ɛ6/EebiLGvX[1[8 @>-BݚY}/9tlufuV6gkS\zU{BF9X]qv816}~bydmxil b6Z-yan uzjBF|=ϬiBӱv]=eqv>;cRnPF!V8eC7]\ 5\T+A:\&g*ԐS66Ջq#wׅ&_ӹ +ufeס^; +hs+lkG7wC5"F!D߅xkN}Xk6r;dxLIۘQ(?8nzoƎ}TV;"\lT6 +!F&Fڠ>U_J'8:Fef4o,4fMel'>}XDiGWƩqoB^gFBpul5 [5[ l=N"u?*Zh5nz遶QSRyMd +r(M&E5휟? [(V[srf!~,ll쐍V2LT-E!DO'fݘ&{D5ZMüUQ9Ne]Έ|.oKٸZ6ָ9o25H&.iXuld$ cw<}k]}m)xPG٨lB}BRhlj,<9I-kTV^{ I6yܤQ#JaxpkFed5U6<~7.X}jX;n%;#K6umfkעlT6 +!>ʾXg:iH͌|׍s#˪m ɲ3i뭗c>Gax8޳clT6 +!>Mvjz9tܼ/k([:Fech57 \ockos$4V\g2YCqGn#YQ(藐'&>C;\ic#5|l@g5+]T^\S6*#,lxmՐɟZ7U!Ǡ]|b>Ҿ B8گ +amA|A4mlؿJY>Q(7Di<jR^D6nnmjͥyڎ ƂJu|pMCJ.^䠭| n 6s>l~ZކFeB.Ϲ +6(۳lc+mڎ+l_ܥ3|:ܗ=/m/x V6*fhuǐ]q8yٸB2/>b6]kYl'nc?o&*B~B&Gٸ"+-,T_OΏ';}-7\<s{[ӕF!0 0jɛ.35:.* +l&x_g1~t,m+z){ 67NϳݯU 51r♸?ngKsȃSʳLlţp&;QK~<?uO1gc'c'] ub]#q:{sǬ/ ߾ߨy:cMqrk޼w}&hZ +;62ʦcx1rhwgmD¾w5bB[7G!΍¼uf~.l\(ƺ](Mxc6F~=kq\\V6ٙB8(G׼l\Y' y\gV +1x&\9}ݝ؞ɷ9vmrljYgL!2!ܩWedQ!5x9__Bj;{ٸE_O$flɶQ6G(cKg;;Ѥv]\BF|6/cDYŹ0ښUsBJx|P9 Y܃80!D0? sZq|# 6N2"jn<\B6BV6O\OL!3v,kanHY~h2Y=_q§+kcn]Z!y"ހ[ +Fdc6GT!DuZ4Vꏶ~=i5Z8B>ɾ q?95n4x]ptDT#qgkqkkO> !D_PΩY kZk|{hO' ||ӕm˯t gB8$-K_edh#foxՓcflLJ4]#kdz}۷,:΅duM/*#d(B\zM;$7 ěwcN޴q=#oF=%gAe/>^31BB-[GWjӜ,wu^sYsOVPHv!cb]?JiG&6LsEv1p9!$[+nEx~"mA<8g{ី~}x vlηNBc/ǫ5hsۉMOl)!(܁B ~2,uc҅溓\rٚ\= }òv[|m,Ώm}5kYcsXlx7eۃvƆއg64_۲8G{Vk'Lq?OlΆOW2rc78_MgmL{VO wZ[1~뚻FWYVr\C(buKdxGWɨز{'dfq\II䱤Yd!yzW=wyck_+o'S;} 53/8>ƋEhBy`mIOLrqKheZDz{.&mx=]ۅ|}<\V6OBяȥ͖[rsuoIL[pxY>5vؠdb{h؝_Sp +!&#N$wRoXN]5/1wX:?gxuB!ֆ7] +?+7'yls?JFwn!{p +!&+5뎿iø5X>t|\ô:mV< cmtz7f.ڶV3Ey(ѐץZ4G6Y|K4 +^muѹ7xϹs*|* ?wo|{wel¨zX4`;&VIk +Bt?űٜ4Bv-q_?$.a<N`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|kaanFa aafndaٰݬo{i? 0snַ齴Пap}7^Z0\mz/-gaf.\630 3f}K ` wM聾 0 e1Sg}/L/Εv|B_׷M聾 0 V1DI}gL)}RųeO{>&.MUN>?WnE~G^Z0\Sǎi]ƵgNi}&g&tMˆuK<=nr铦ɓ'p~҈3%xx $H\:W!\9._MoZߖB]+0p9Kq)Й iȑ@)=Ν6d!O"(E RYn*gqbGޤ*+= 5?Bh}Q5]oޮ_ n緺%}t7 lJI>wR|#׷K } 0ÑY_O yDNblΑɃ ?NYheV$7Z:RQMޤjj[ +#V{zo@`>~ #8<(8GGƱџ06"Wp8yML%NyGc/?u FoZa#%#!\? 08}R')+Z8O25r) pZ80!OcT)Qs?\mmK:;SܸUYCn\10p7ɍFz =ɑOSҍGȍGGء/_o`/q[x ]/҅u7r0 s=KR^SÙLȓ~UȒp sR|v\C~uqjojk^DWW_s9z:WJ7uGPv\rcߝgqȍen|(7=C?Sc#ءqK8~Urk8~-tއGt,a&H 7zSmWcq<_Q2W9R7cn4X~yBkUrՓ#)?~~v T-v.!/ +78{'{@~>~q!ᣊ7zH~xQWɍ_Ey)[ӕb؍ 07GJ1K }}8u y1gN'lyR9kz8g-Қ#/Y"/҅M-࡮z:BݵC_Xs\3ˍ}JoUdǑY=OJ?~S#'^HèGSӽ_^޵FsZa#%ݘOMFb?ߧ{b種smonDWG0:); +:kњבoxƾ{{78Fe_3ҍc^}ïs ]Ƴ8 07GJ1SxOdg ,C?q[F}+j=`\3\,FwZa#.ݨBj +)HKEF*rȎɏtd,?3= v?`<=tfrn mnhnbQeW]mq:FG~9ܘt#3-Tʒ5Sc3Xϸ#~~/_\}|7&ZZ!hmqH?y}ev9ĺWZn! =srQ#l@[hjrAs k\Qk-5LYlGf+Ne[ȱc]b!@in-g hmu(c $7*I7حgv E~qHzƑG01:Ǝ=zoʌ:7&*K0"J𕋜an6pcv>;Yi*Tʌb1 t &DnMØ'9gZg=jeJ*KB);UZ:mnv@fG=ceǎt=ڥUźc\w\+@rꠜWx?yӓ1-MhltE}=aTcN ~yKiFa#%ݘ'?BuJQx2rIX_ dIٽY~zuƓyΩq-|ZU2=27TYYsUUPNc-.h;ڼLFFW^f#5;ȍw)뎖g>Dsh4PhƢ@|:?3΍ 07GFٙQHUr[ ՑVOZskH[5{f=ΑƉb5N]tuj}뜿ln"'^ˍlW Rrt)Q?Nn@::gW}#}O܁ڥhuES j\Q]S*KP\.EF^od8RjKCO 'iYwT3䋔e8{"cI8:$x8bʱ ̫ɣY(- +/>e72 l){7ڹ1;F/dRv~LO @KK8y,pd(5y&K6juuuətbV/|jTU&/\9ˍ]ryUCc|޻0s7a2-Am +rcp +2O|PSu~E>Nl a&HI7f{UUY*ō*ڣ'S1=٫q~02O]g<)rdU2S}LgSe|9ϩJkk¦WǦFFe^ -l{U7XܨcjoO#7܆1LP]zʋ /TO0zC[øE O_8nd8Ryw}F<ґ3QyLIF%Lc@|$G{G^>#e9Q/M1ԣڥL{)\gJC:CK;*8ݫ3,}]`t \ʄCUҋ5U0UzLouA~.Sٍ 07G(#Q#aFy\R=0œ2KHoGJI+gP4U}Vf7hK.-u[s QdG'ŏ sJn39vOg,d0 9ݷ?w.}{QkBn!7VR6JQVC~07paz'Mb72 )7ōŏ*r4ȎiJGec;(r#9JxM;q‰ÖWԄ}qyߠ-UjtXQj3uf'43jȍMMhj=#GewNr8'G({9VWo&~2cCEj"/VTP&4RfԓsȻ8~]>|vv#0MƑnu䪐ˎٜLe1']T/hRęr8~dc0}Vb'ΐHŏy2 gOm)cUX-3uF=D~l!?9e_2o[wdnʎ=99}/ڸrXoT+ʽPJ^ Q7cv?rv#0MƑOU~S rcVʋדR0h}mu={3s;<9%BGkrSjt*Wr7\׍J_5]AXw\D8zV> *QΥVxϓ|`,A>y+}8{vΞvb׍|/0 s=|r6CS ScJWsݥE̤`އb);Ea;z3<(LZyrƓ~Siy|juP;RR슊27TU\銺jB< hl8#gުRΐ}v庣r*vޅ+>nr*= An$/ʼPa$'|Q̘Z|~NބS&r-B_+0pz]?s);[fs,,jZ74kprL@6GڲLkeIWq~ tmgCEWIʍn)WTS~緉(:ntB[e r3=^Ptg0vyTnFe/cž() :MZg'o^̾o-gaf.F7"?]q#7z̬=J7z*{"_bߵ)h>GZ=9ڟ@} $|VsAWA5+"?r#eƦSqe&G>Ѳ}&A6ʆr(+G>`h+0q䷘>gNndE8RX #5r'3䞎Toso勩܃}^I>)CR9pUIkVcxP_5'%/O:wQV솊R7TSv4H7`uc2 먬;3V-39}!h 8yEɻb]rkfE9eFE@0|E4l3`lly1fПa8Rsݨʍ2;ZшbpcL94<#-#7,n;jVȫrud2O37}VBEz77V*\ :(ٱA<[ݨdLN?zȏ=wPU"?;+NPf^,5XC~9AJ?W~#S|z|wn()tCy ԅY5W;dvUU;|5cGF[ CFZ*orȍ5=/Dar]L| Gl3/f̷30 3GJuriz;rݑ|R~jN +9j"?i~EgtDwnǞz;(GvF^虽&iu8{G?^>_o.dybVK/Rv$7K]ahr}:K_rF+!GnlC{kZ̉W`, '<(I(EE)+hban4KZp~r;N +NGo1/f̷30 3GJQJnt@ +<jeǜ9뎊}S۽I~܁Vő6O%?}}s=iɒ=̝ + q1_\(}OiIA9^_pA zWBu(sFUe uu^opc{+Ջ,^@wc(S6$7ީاQ⇲"bH}A +saP/EAJc7pfb|k? 0sqzōzXzr6|*~Gz9~ ttAxuœ‘lv +O*w)V=W+c,חΗv|i7}?1CUY)Ԥ\beWK7XlYs$7:QBqr? ~T#eʊ"e0@ٳ3f.CAZ~''qFb|k? 0sq :7}XSUY03*9 +Us;ĹbQ捬?r/׵m[ִ͑hNYhɑy:*%)K],I'g+~?t[z'2S=A~VpaWUUj]3r!BnlsFk3{ PUE??,"q 9QB_( ^,A~rhM8~W; +59y1fПa8RnTvm9n=SU噫jo=OڴY:YG%K*]]vVLȾtEƵ{r?%}*yΝ87=?0}QvUru.'4Q~l{>GK:<#/BY݌=T# @6!jȋKIYCpn /a84y1fПa8RҍzWUH7eoUgAH\G)3 +7ZD vEq3q ZiyRAns;]s&OI*po.NӭAsϷc=JIn3, u]ɍqtcM+F"fup7=ebBŏ6a/L)2>g XMj_{8vyʎ84nd8REz'G1jŚg 1L4bчXa3Z7~+yg+ r +G[ٱ2j7#v:??߸`oUL +I^HOF#]Xkz^GqFIU^Wnlw!Q }Szʒ(&/ łP䤆B[1~mxVس̋7 0 őn4]7]aͱYfW(t(U6?+B~ۈ&4mD]F44lB#Blm"Qrd |kevGZ#)KvsPi{~^+wqQH<苔xwh\sE䈾jZjisFaFlf/HBVrNNw{pAu&lhl^GeD5D, CAt +??~-:1And.EVrT=ϦСȉOaÃo[ `#eucIƙL:*zʌSVm qV-~rdpdőb]RzYduMRȶ]823;v8 єcT%NJ+{39+E_5!eǶ&7s޽ThQN(^X-u3lș^\?Z"%W؏ҿ揖o޵{wz#j7 % bߥrM\ 9YTɏʏNt-*(-x [?F1o% +d^^4@/οQ/v)4i+L$c[ps(/>J ~<>ޞ̋7 0 ő2ȍFFr58Ur3~,whˏZhBau_V}j+"CQ/{'-ܰ-fIl~lo&uHܰɍx#XsT)*̐lOsuJΐrBMYwGg|{/o{#7CQ80HqV^f? KL\0>049HN<$yFa[#e4 +7:_ۍUg+gXס,V9' vgs{0~Kz>HɏX1cœґ(GnYZ[HuDBԽo/}>HFr'Ғ);*giO/ޏy1fПa8Rҍe2(fSʍ7u5vx-<ʋ9(+ZJ !^Zi2ϕƷ`*}U‘3Rɒ+kl|xRB݄ѡH"7'Q H\t< V.g*5׼crǔSP>\BWܨT%XB^.:a92cW"`8Ob82ry1fПa8R.rPQ.sVJlUGzuȳW ܤ ~lE>Y]7ˍwUſ2_WǷ17K֐%5I+u1͟fɏ͍1:[? B'~ؽw>ʎޔ%Q9CN?n}UwJׯ**\b0g5o߸/SVK +7dC^Le.57=9)˔̘ŔpL~/bp{{y1fПa8R67V}VJ)GntͮZvH7ZϖB_C(ZbO 5/]g^Y^*oIr;6?(Y]9cEҺ&$zbdoE݁Hʍ˙8(ΐ{-}Ux6 9qpF0ݱii;7)?f-# +B&o!+)+̸utf]ۃ wv܉Οo[ `#5ˍ6\PF~,3g3vXRPߣ0QY Sן WQ7ʊ^Gy YQ+TZDTWJr7*eMR\(G +G,Bٱ?{"-{EvBr99쨜#ޗ({wڲڴs/4ySr5+9KI'7S#3Q̦.Gz +$ y7y6 Nfhxʼ}3Z0\7ř1bve"w[_F%;0_{QYboٟT8k%֕XZLAYM~Z#߂-jۚm]ca~[> WuLD<'#q3{2N\Zl 7ƌ$/e2/H GUH ?)C`п^סBaHݐK[F1'7?RCJ`ҵW0QZS.r:Tr#<)z־uU8sp-"7arnA煴$O9,(s k]a][,NĜL|P䦆ʼY+&oȋ"5znпX+_ٍ 0GJY/ۦW +7Z= +7 +ĺrEʙ*V?n6y̸ݠ}鿕{We,Z(|g܎t{h0IQ#.q7ɏJnHQə\ +r<ȍ* ?k]gԮ0>L CN2JNM]!0 aΜ|]]w?h}@[BaHYh29C0G,Z=59{)'hІwȝ+a,Sqcot(mk ^EK(ֿ<Ȣȑb=R["ޞH 9p4vAF_"=ވ39DOxB.ܨnR7]ぽa&џJ +\zQ9+N\)+N^\ĽkP#: +zEF\>q: G*47?lW0 s=)FTDnU˕F+=YuX;Z(Ƚ7fg}yrڟH7Hk,-Y쑴:D~l0bsmވ텃p I*%An@F̬z|5D:yō+!/jȋb&Ue /FBՈ>Pztw-ܸF!Z聾VaHUMzqLI&IfGg۾r%?MW zo~0r/[qU&og"FQZty//"B(ֽJ|͆mMhfndj;|7--(Wkʎr^UY>]ȍq{354ɡ}pdą!]e\(ʐw#XzO@_/Acnb/-2 \Gj7H7*ȏ=V7cJoU;tV7*8U+?AGv{Z@_ؐd9erȑƷZ!7s^ǘ~r&'A?$O쪴%i K=w}I1~=r}QUHD $Ce84":;W'=!ҳ=!I嵾K } 0Ñwc7*؟ P)zr_ +E8}0EN 7jeJN5F#=幚g YX~ e#)(7(k5쏽~G|녴kK 3%:ym}1+n1i15Hٿ!v:t6>fqtwZ&7•coOW0 s=j'sLn&UI$(]UPFn9E^hGBvr +>*oE_ܨN{%'Ҽgy~?"gt΂X4Y,)|e7ȓobgvnY~);3^Ǵ$Í\[fR))q+yprf2)/Ԕkw-x7F~U A/yW1H2HfI@4an ԌɍJv~39J뾎rX27oQ^ܬ`r? + (HoVȋ*(*#9'IeOSDDD^@^̷'ɑE!ȏŅo<ɑ~Kn+一 ]{#ץN 7CfBH)Q}H]krn}-Ft}r anpcMFGȍVLXֺ{Q3.C:9|F_|P^#ύ(WݰE3Ǒ~OA^ӓzH{M"$k+~M!ؾ׶Q{t#5eR(fo(3D({"ܸstck}r݄x%9anpcm5.GWuqf ({˙Ua7JJzG> '3? +r,̳`Ik-/yIܸ}[vеhsLYH!7&YξIx1Vxq:d܅g@s#'ݕ^]叭~)ty0 s+pٍU'y.@EiNy9ɔI7SBIQ/r z9Zw^pʒғi!+}j5OY̑JSKia}A);]qV!ajʋ#zy)wchi^촺Õ"mƍV7z`72 )ƺZW}}9uƍgUN(១D#-v92";i\s~ ./:EQTLc=/GAJCT%Y>OZsDIAAӈUƀws0SnftcRf<+BhbQ_:VVI;fG;]:Ӎ^QUnd8R]ȍV/*>J'4ށs'7(7_.";f'.%7.!7 OsP~~]x")Gʒi)>2F$OLdV'ՙOd=)P/I:nL^k[xq-Fގ=pdoR-g:E26gJaHI79ɋuvn$\XoPWI^}aH'fR͸1y rB y~6O[-EǬw#ZjJPWF(iI u&L0 skpzg}ݳɑ2 ȍ*uzG̎50[*(8(nL 9DQd V7&{‹1P}UFMv7]֚,$?]QO^Ol 6 ✡UFa[#Dnls7@ (ԙCqt-$_+q{WW @I EVu^ܘD1/Sa7ERr6;{BmwI?@S#( BU+Q]@_M7ŗ&cM̗b6s#0̭='}PAɏz5/ zK#W0Qܘ H]I nL?Hʠ[iҪɍe?`䝈~'a Gi/*ٔz\>C_rW8Ӡc72 +:rcStcȎWʌaQՈ޶JfǸ+evLZ-ّ(zI,`dSvd䂅8"‚ƽJnnʢQ\Fqvll=QN'*ҕ2k Vu,B_+0p]b6DQy:o<&rSƞkl Gtcn EzRd%@c|ܨ#7fYxȏ @ CŅx0xX#e%ȕVLe([{ױK } 0Ñnl*&ɍ hiXk:ݴBՍ5G1*(ҍr.g 2BEQ1+m8O.4g ATɍ!5v9s2ZOJb("(Sz[ GjtHPv#0-j!76:[5l~{77͂DmY-67 Q1%:Tqc8+g\{g#Sndr27ܾ V@M8W|}mhs}%\"(c ȝ5əLv#0̭nljr77;.'I{6ƨmH:ȏK8")urSvZkt@d|`ɘ/R(_">0 s+p̺MODo_O@(zWq<@qG8{eݡ ;<FÈyOs%Xwoސ| rrlălɟd!#/g$)&_^b/-2 \GXkSa|՝G[ݟ5DĻ{7 Vz+=}w-B_+0nַ齴Пap}7^Z0\mz/-gaf.\630 3f}K ` wM聾 0 ̅YߦBaݬo{i? 0 s`72 0l؍ 0 3v#0 ̆,?U! +Q C:6P<_Q|`md FHmd FHmd IM Ij[MRl~A#A 7}V$T|rtNA 7}$TxyĢfudUk{O>޺uSHӲ(b̸U "+b1+Fteó"tEA$J`LWUVuuOwOCO8gOx'ZDZZZZZZZZZZZZZ DdI2sqq +yR*a]+>cFCj$qlK$9 mBJ:"yQz9pP"Inhn`cMu#!ALõ&y\Ƒ9ؖrN/Vvgq)3wJ4v1pp)n:ov:swt`<`ݖ#Be^ XyC ?Sv&O1jZZZ{Df4s>%9[EW-QO.Nrru(fp7c/T\5։:c80ұGy!\F{ 2Migbc w:0pn*bl8}bip7Vlt 㙻MG@L +yoLYlnl +0/my6T\ +e|jFPz”ld>!m`>o=-LCn$ L$!Nܬ&cGuUlԍ$n: T|$^S7{8qqp؜74vSƂ{ *.d?f7Uj= nlt---6K+Oib!ׂxQh/ǧ1 q&Fp;u<ƕ[1\,lLzl\?fcȻ໻å9Άm)$  =S +#T*רemcCq|&0#uKٸvӽ .);ebC|||gc29S,ľqCpG}3)2?7+rYb炖V_-=`Qwφdzuql\'[Nj{2w{ zd1)l&y{ 9끈Bln`GGjii-FY5b}a0/Fba8~NF`!,{G1&>qF^g;N~+7m`=eb&  S{l-DS#T +2I^kNk8>>omgf6.j{KqI)(Y +w7Wo8"b1C_h0/3 u ZZZ;H89h>ėݱ$kM.Ipj{*fLΤ*7'03'ښ_x[p>Nx䔇j ?V1}!axaz=!NYUm },Nzu Ah +r |g6i AdVWdm6a %y4Ntu4??3DtþwF63Hx|U-ޘ+{+jN/ l%kJK3͌}& f+[ lToy bHq8q`8iiiH=?mz2p[M.a`agPPܘ8ᢓͫ0}yl3Z7e91wc&`:4-e_rL1~R)$1v^s>?~ ;x߃ +G:- bx<1jG"Ýf`p`k(67j&!V1d(--nƶ/n{1=d^Y.p)KjiimS.A#+=\I"_>}`ȴg"1yǡ9pl||y'tӞ3ӸIOObD'j{wor2!\pLסM"Sc^I>ɄTtT9~7zk@?Aw^>τs b+]o;|br`(jf<|[fZypr*3X2؅~@ jryG]QRG16!P'fpvw)񮀣 [uh"M!66Z,rh)o6j,.M࿀7 g}9p߻scVt^aXY)T+ukVW9fmWʡV\2-Z1 FM `cX6e`cX~X6e`cX.,ǪbiԶW N*eK۶YK}xp-g>V0v^*kl0xc34 vhO9Ѩ 3IЖZbRӁᏗyD+cqg}3p u~66{Ps's:9HR=OyMX5vĘ'&jb~Q{.hרLYP8IQ'lkFe`? %ɷ=PC5N(zG/{n(6zVkfEaW*) ˕iX>eӼ|Qϝ/k#*͍9/@zn"\zp\X#'|x:[˅uAp9GI瘕|tʎ(\.-㠆!)ٯwo}l߻o^N^m'{eۡ:oc{n(&&\ݱ~nZ |[c MO9{#/l3#/:|M<}m1Jĸ<%\jaC>5/wD '0ّ^<{)O?H:'C?V{jz(T6G=8xb_%}Q) ߯جt5ϻdoǗWǯjψtNQQŪV zUKk0~0:c?K85޶y8V]lݢ66Z{]C'6WxkE2FX/AQYYVO06E`c8:2ɦxM7a3x3i{87Ws-F9q8 +l2VX6AjCAWx"04_o9>{MJևC uyt]ˀ`΄tM^Ѱ~ x@{w/rz`M ,#S㱙6̣alK:ϑێ,_^"a9r=V>-O/62:gϯS[bF8C.[\0B@^31馗s{Yg 1-ĎPw#.N +1r2:jOKKkGfYMƪuF x؍vomɄ;e,Lō98vuC =p|O(\ +[y8Fŗ?e +cλ !%fY0lzT=-7 Jnl0rolm[-ďK)g=kV9Oi7vaSˬzU-Wš5]'6C_:Ab0ɱqQX.*> dMЏ?.XQ<쳱 nǤHl_ 6)p+NB!P?@:C_S_TI )5hKƑ?v +el\l6&oTZaWK@|`6g770VN66_F{{ûuuk{>*RZZZWP1XSV~37@{i&mbUppٸs x2D,x/,q,p+!=g;ÏNkxmVZ*{57<ΩJ~ ;+x+֓^1"mgG;Kk#8[_ۃI{| qҌډ\̃ 6ǧ* U3%#q ăb8c#2 svgы=T#.F/qL`Zm6őApso:26'!DŽS(藁c 1&cC*HwxfZb~0cdC± ~ |'.c6>,׭v.Q%l|Dosv91mZܕ`bWؘ%U[XLv56uCI怳qz/?cT`q5e[>TrHQ͵]sqmJlIJnck9~V(!6|_$ؙ CN 9O9㤪)ޙ}>N'Mɕ{b=ɮ f黇S2kji=*@FQqG*`k5Z+r5v>qޚ3is]z!}J)x5<?\eQ˥{67}֮mqsTbV#:Nu~S|}'lu2w3 ?fk isbHdNx ʆgR%+TFKjɬ֎Wa_"ՏUS{cGXj% 8rܚCF0|'ļz6 +lTsjyKQ+6FaXxO:͊;dc?6Ht&9)Z3rORIǐZZ;@#Tr%#;Mx"_Vʪyd~!/bQSZ}ǁ :)egTmBi,84L9.P-䖣b*ņmϰq5O9V _om x"VվjOFƆڃ\)y|rǔY`ɤ?7D6#:o-3+Y.>ߩn-NfqϨ5'}⌇ٞ“F%=K֝s><&ƴ.ZߑP cƺc!66||/HzmCyzNDY_6_ӇwW'Q51[mD-=FRyUYV ⰗFB|ط7eGd1=f=嘩Iק0Ҏ6E8@cJ..xŌb :csuN.}PI¨(h:8rwk%ofc>g|9sV,tGSkU!Rڶ9_ڎed_b1s }kMfV626d* E=w X6258!bMub56'٨X!!9>JzH=K5BʱƜ)elۖ60KZW<1oƖ`vVS5[1ްoXg5?u2~+3ukv%4T0A5?1낀CNVGt|Tdhq9jgǀ:8U1ڑRj>gyxؒrKKn.yo8Wfo8lLcCf攍7Z6 oQKBV:Tkwp=׾J!16S`fbg5ۙϚ[ܝ;#P+$\KCNϨS|KCuQ-sunu6Z\T={|o"N3>v4'Nb#G ikV:$/n=W¹%|mBA/-19{]({վfw6?h ճI=±!Nk6d3Z1Z'W 0`rR&#oUPkOՔȲe˗/[f0T۪gЯh 7ˣY0gdnNӃx5YuֆSFZ.;GCkV8&0Tj$lC<92 7mm0Wd9wyU3zN/9]P ѣ]Fu8Z:NKkv%uwܶ}=bN ]R<`B99[]`]8 BB>T7Ýb^/HKk!R,.G@\< +H¹&8-جmfcp̘YǰY7tx't#t$Mhi-@f!sXV8V|TxG}\[yr_VcM}>fW7(S'zcu0KhiGY=G2jY1Ƨ/gcFQ*hz /z/FU3?sZZ ,ˌ|nqV*v8Nпo浥RIM1qx!w<)OZ} [GKk[bժ% p?#Jokp!ql\fack(98'Ӻr=N.uб}U"ʨiE-WҧQ2S +?G#EM˾mAMhGƤ7ږBɵhy偅ȧ:\GT8ÙC[ߟ=q[ \<i`1ZeX~i(Q6O{qxQqdm|ؚē{7[ڞHds׬5l+ZE-@8'+18~/ٹȻ#5jO5cu~>^Z#‘[0togCY_"Pȇc UoYDw,8ci,GMLߟ + %{[Zrb%cF-G˘UjqR_¹`cͶq.6RGd`$qcӇm/6Vb5%^ mƮTmg`b I/CgZuY뼎C +[<ǁES%%U'X*jŭ>8 y8^LX2b-M)8$5_ M3 +UF3QKk\%f \N^\هC_Ұ}Mt-FG&2`+6}gj8lOZOݶ^a_A12!YDkerXժp-ЀR:$3ٟӸ9xRO0>,>:ZZL[99삆C ׉%Zj>2ba6ֳ1r6 (ywoG||%4:#&QHͪ.W+*sT"!j$ viqz|lZͼ n-i&jiJkYIͲPU`> |pb'i7Ƅnjr#Ǥ1EWۂ`L`154vKg4lyq-&>pVm6I>en3~:deiFZZN_g#] +[ Sy@ŎC񣟱2N\-A{+%^mvcCo-]CsV0**kYϊVӱoV㨱"罔ɺ 8S-Iε2Rh,ٯ)9ط~Bvc62`ރ*v U6y8xBQqq+zc0:E/ȢCH\җ7AK[ݦ=PK]_뭬`C!S֛]lՐeZ~]UKk2jƪK}k Wǁw*=vv/F1[U>X .Ay% b0WĔ~bcv9ŭ1Vlsi̕ǜcuN F!7DE-_ɹN|UJۥuuprk}9y8ඣ)36v}Rn>~ϣ藇KEh\Y,gBpѲݤMnk25(m۞PN(~*O8|\v N9SVxQKkp˶։X[ ِYTuʳ}\>iĢ׀:<_}F>Ji2߅N"G!^lPB޺R c; ec8pFbWY ~WRZ; +0җF~E{ImwWvo,‏3k~ߦHCFίS>XpUl-jii!jZGS"`^>@Ə[{k66}+>6QōIm4EѣK-h-TLJ\"뙑mpg5E}k^F LlLkũ6i-[bewfi \MK\KKKk\cX_B;L 5H,:vv$">C߮EU>'w˙>g/r$j;uCv+1=Nj>#;ڎcNd5\4¨?CKKkN:>%o笕5ܴڦH0N$Vk6Ds9ȶ,5vKl2G{\nT Ď}1 훖c5ɾ1\۸ṿ_gxa"5Q-iYfۖ[:˖7%ڽԾII +Vl$j`|u8Nk(FP]ϯĈmyٞ\noslQ=`1w ̗r9VJВv 1N#WRr*n6;ujlCLDm1_UU}OUuXg4Qپei_V:ȖkbG"Z4e٘sq!W}g;T>CKKkJ[V=fmc%7@_| %uĤiybUGmj7qzS ֛?Qj?9Hc^.JLlχ~\qzO\Q*+Sk48*i?j###(D}J %]ۤ[OF>ڰUr`5^!EYS K%h-(pKcSm3$GkAlfonG3ri%---ǣ- S.i?(qa?ǎb +;J` +ƴX]dDIYc$įc!hHэ᷏f]q \T{m_' K]ߴ]PK%6!蟠 zn6 Ŏac$/gV#d #滘QFQ'Uø7|#jp'73ŋsqx`F~g(q梖֢kږb.gzFӏⲶW7mU ac?޶بjMqب\v"I 8ioQeva [c)e! fo5s6f|8|pNjii=1Jݴ0"ևAɈ=A68]GUC>C8x%1Z'iYn؋BmoI(3Ō A9xXNjii=qZfrS}jJe#9=T5Ƥ69'g(z -xtoQkgTFa5B 4ĊwJ^L(qN.qqTnR\zVXTy7zKhii1J\ΔTU?\,r#hF8P[}ApL]zpBնO"onΘ83>n6=5)!F0D*ɃKbTM>8`cG5֍e{ d>N*#+9G{B/x!TqTľgap͸a&=b`WF~֡.JtLZJ%mP-sCO%}0ᏀD$6K&N6yWqG#ɮ >Ճk-Zmy!.BܟƉ>sNb_>yD9duJ\ӟi6jii-v&uO lobMqb@8_YE1EQ P^kF=_0/w"lN̯PVhii2 e-+{L&nl8 LT~lTsKmִ97+Rn8# N-0Qyzy9 xɍE_YƳlt--XϛfK69l]&9C=*F8-&\L(8֘ Aԟ[+0vhǛǦco$먵~x.9*\n ko +U^è+_fkx$7ۤaoF8MW||£p,6rl\Nۮf̫ul<p~bch\;e:FKKkrd#uAlsR=ˡW=zY٘ek; !`cFE]7g2V8o7čk=qxs:Rm> +vx-Jr961\UW.JC?$} fp7y"~&qZIO Gl?zG۬B1 .yF--]IPӣ $Qm_j2J20#gbcc湨yϩsb)t*r:Oz𖌍(ϟ!#ʽԪُ<@Hqtty2Ǩ+*aPF1c"`ʧ&lqd{ٸ bLJ}Owq1s1l;I$IMyz͛a6NwFuL:Fo7\l .eccN㣚 YS'N"C=;Pi +ײ qVC{j>yEy-pzF+[jUNJZZZpd< @"/q83Y^Npbǻ~1Zϻ;(\4>,# ؐbc$Ӽ( +O <4vPn%LF5Dkל;b;԰U^zGpqyȭrPVfIs,dFFU0cRVҪJ@fej|UIk8j/ǩNj 9Yaxuwz }B (,nGl}V|lo[ama+sS$Nӑk-gb˸izUky̐Y):#aeTHڠ;}hii$V #Īe1Q8=ףE>/t yY)_ėE.rz | )80̰9l/doeA;!:C֨y4 EVcwarsxǶ9r?`EZ,f_QKKkb\bFk .#qp7|v__{s`I\zg@ߨx(vTil_|5kulEy%Wyi@<|okJvWB6T<\YK/yX{o$vڦ+8=`cƉ-<;:uy$+ZZU%uFo +%'zm[v"["a9V6|*)|>nh_79L}ޘu#1z,WbQSZq䡠ot!>so6|3?HBNK$x1IT۸z96qڍSbF& OXf6jؕBZYJU0W{W7egG \[.s~56k-ںkجS%>E߆~,@!$ܺe( CnH\7'6ظ9ZYV4F!Y'5$rzCxKݨDlT2/kR1R]s|#ݫkkY }slC$#.JІxon+>|Ĝ/1rR9hQscqm${kg(-7 5ܶF/z 1#Qf+?B .cw2w5m[''|~D'_W|Gqq.ă/p\\r˗QYg]#WcAڿ;5!v5#on!էAhL--_5JMVdJdc7cc'v"[|ʓ6l_PC<6v= 9NH>u͜mhtt4W(*XMWT{b26aj5(.A;gJbqYuAcxRTơ<q5.Pe #_ / ^0`bs1.qclg/1#,PPQwT=Tdu^lcy>Cg37؆JhT +]CݬkT7ƔqM^!x J4z--^XPk^s;/9G}v1bl8>lkki" +9?446n6J^v;ЎU@SuU_w31kϒZ&>yZ~!*9vyKk|韂,3T}l,5xB^MR]Ǭ-+e;l<nc_qx\x66!;ݐuſUfnלhii-,d'BxxS_Vm@ʗPV,N8*׀w8SWG9ڳQ^V?u hϒ}rt?{grh~C{AT9}!P$s{۶6BMYo޶3>9a^vG}D5I_X[Z5|2O6zdGSл#ˇr4v-S jalFUN|r lm!3;Øfn9؄y<셜3mqorOWiHЫF* FEfREC7~Iȑf.W.MAp6bhq?6o'̊mnYo\t%-LƞKȱ.O 8o&5&*BX3?pqYNVvQgYB'QtlK=!I>9~̕ZuN@! | >އwuƖg3 +^䟈qI Xqh΋`S8n1/o~N&k֗&9,Y6ƃU5?'<5BNjns2?uUaOla6&cYo2 *7^n۳-qn!y [3>TM8|,ƶ7Kg+r|=#q,_ΰ'6}#(h#L+ /L2Ʋ OyP-d,{ӱ1i1rwY6TX㤳* v"'"1ˇ\>ua[a̟7r9e2m{ֳl}ElFrBE~\G,1\yJN,u0+fVt;k[1Ҍ L&sUWREJx9@σ7*eas+Fi8c3SAx `cuoqRSSWioGس-U(- \LkxNW+6zq`-'ԗGwto;n[y"s?CWJYco=VaZwU pdgI;J6@ cg?oYFlG^ZS|~'@{de?l|v>^ze3-xʹ\hۜ +gúpS{lFё oG-/3 +%UQR}:H-x0dc#`OX*S j`L]/xojFll)v+e!]Qt^IW^U֕9L5S˺\Yzc6!UӁ72΋zW9LoJT?PGb16is|.;6IufdьǕlbQ)ʦRz6f(cjѯxظ Y+5ܧv4:L2Ja?u-"<fa6>tܰGHc2'ǭNcob"6wH!SlC-E%qYϺlO(jSr蕞˜ qؘK وwLqo$5VfJ nL(zUƧ&mkswg{LobncU>z_|, cL[ec/kXcF]>%_Ј2# 2bYW6'ȺN$!1drY^ ob#K^Kg=[MU-)S7R~{7M5˼d.8j`na: z/q68޸ɦgNk0 +&3@l_fQ E7wr|]Qq\F*tKQuw;5OqޚR*Tٌlk2d~Llz찾`/drJ݃YϺ +TdҸ8:I+y H6nr8Y%v܀{d&]3^zWUx^3}Le]; ]-XH?60'3LAoƆ*oQ1ɐNebl: +^6t<(({I=1}l vg=:,2 +^ |<4ٳlQA6E\\g%fomuYl\EC{o[+:6XZ;c l4&E{AkW T`LwJ.˼MX<_gQ!6ޞ36mB#ڡ+=ZX 7zZ=PQžc߫rٕ#g=|ϕ4=+S5]~ Cj 2e- u;k*C>NQ=y]6|~cG:20i.&RD?ff6?۬4i~Gp6\c Ljb{|>g` VנW%5X`?bjƁ{#59k!G.h?d}Өgh%7\?-ќ='Oƣ&rQm2Vlբz6wa;`lM6aRtS\IX;K=:~y&JZnQtɓ~6u@$Eg~կ`mud8hQHMǠ<zыALRsśh ظZBhlDֻٌOf%ercJK--z6F{{ﭱ: u-,{_bZ3akjCQY{-$WW<2|{b\WL++ d$Mg2EW,JzТQΕ}9)jY CJ.>RurCR#01^66Cq|Nl V7{mtzISv,mr}@WlF>fbʵ`۹+F[eZI<1\k͓r-~rDz\$ `qheYe_X0@G` hQƠ\(>L7}E¢'L%oqU89 \>q1\7FA]FvrFْ?ulوӛƪ} +e,+I1x>/(:\4-g VY旀Vh"ח.M9gS)Iu`u5}dW\fZJ4Um@gfk6Zmsv%*Q>hӻL)oǞrwƠ~ؘ>T6u#Sݳn h9u[+}Z8/űgbcoD}vZ9ƏfR)= >X;W3X=I6:1gM3w(R]y{!>f{%bGUGkSc8}GA/:DJ vϵ[2AQD1zB:O{z. k M,WL!<6U +XΫj4OW{ɞ('ejאb{/9&4vxf\NFq$Ŷǒ)ci׹y3`c=$6N|D#@z9]5W8J92qt6N>Ad25Ds5J~!CR}x-F.f@FƮB"v`.c۔\l< (czYXGkN7F#qn~R#.RX *{y_yq#M<3C3=wZa.g -sbm ++Y=0U!oƵ5M!geCw>^dw ./xwPd ]UJ \8x0} u.:g9^k3ziTCBE79^ZОbS'jW,|*+A.9?H)[ tݕwaմZc/a훆Q_cmʴ@'# *>~Q`6E߆5OuY, pxSec7lk|((:%zˆVqmkՎ4#S-Pz%pqm4JY#)TcQgǰ>.|+إoWstf`ct:& >rO@s٘1Pv8v Qf;NtqA{4~،4&|[L /юjv 4V8^Z}!@wa}y1f6x3S`]| ٌfz{ׂ}-b`@X?6M>3WX;&Lyu,ߟ*+JCq$8>W6Nc\t +H/_R G7ZCi!1G`8|y|M`Nvnx͕xƍUgh/"#|F pL-Ŕfl꒰t:-8PП{5Y0=oLīxho›]~hsx7<p(syBF3 I5Em +{5CeMxR~G.RtA9OԬ<}5x=$]|4:D*cؓ56JDv| >s}Sͬu#H>?;B;3TKxW1_6n;l>-σaI\]l|'*gSkLW/'R-qyqk YAO؛gb8zSQjCơbӳq5{6XķWЕf2)%N|dCya>/;;fw.^L<^4و}IgLWa*1Ͷ1lLƬl,1Y +ٿ-s jDF9~!r ihm0f-'A@aQ~[e,Cc,֤|.s MsǨU}F +T4[^Q_eAgQ/節Aaw{;]jTl-[u7k&ƥ)fŸ%I5|֗|WςRK81(tTQo%}đ;3&ƨԟSƽmE#b?_l@+81jEv[vEoxgƆ)Zzطnc%C[K.3. 8U"rjϫJz 9zO>S IrhYkuoY2߷ϻGZooO/O0Nn5|׾)w쬱l`N\Lzjvhu,~FsLz~ҝ0=/s@(6G8fVmlTcs86ރ~YM=RS՗ch,381d6;H5Oc&7a*ӟ'Y'ɪ`:}SɷE 8&a躸-Z-Լ>\܊V;dh\#h_G051 P=N6ޏÞVt.;*願}`9IӷvRl5nڍf:A|HexgCUfn{`S 6O^T5TeJO>S5s ? S5 d:HT?cH|lC6f\]?4ݵh³3 +meBq6l/8ye}=}M:fb_qg<٨u`JQ7 #dѧN/ۘ'l (2?x> <߳x +۟:,L&L]πW]7Ecq7йQh_%jtg]SHzqU+L(ڣE?d㬸8#1mjGR^J9zcumgS6#+J~iH-;gƘfe,Ot*-xe?ā-566#uիx X+q_O/݊v>;sqj6VeT7LJQdÜQ6o߮s_mtV˪`z:Lt뉬7e2gGV +xuc6΁acm[,1/3i:+f).QMx Άjq ~K/~H\~CXhV%4+X`Hd_<0$L&?@Z5O6>RrqhI=cFI,Jgө|˔̓a|:CS8H'htn[Z.E:xgwyx\1۽l#8d}}Rtk:e2:D鹎G5fxNjak=t5tco* }Iϫt3؜)33|TYSzCȋh&X6;M,,>t5zp.QU'gF̵Z%D۟k)n鳉~dOx2/|Dl3rTc٨օp9dO^M"3y_ rظ=|8)3ǜSs 7$8_X㋚V^w eԵ|"u6XԎxԁNcc *G9EjkV! x{b[ULǘk V c= R7!uZO :Tl}._KKF-PMwf +%/q5`=%o?~;cRG{XM`\"fxm.0S5gID\863T[ήRzYh_Ւ20+1eAJcXˏΜ+.Lh}#i!W G9+C3'!MQ1dc+bH!9,+uۼ@tS96Cy~SOu1xp*Ȼ{_ğl|lTRLk<ɾ 6>U1=O6ZׂWBC?nf(C6;B] +.y"+s̊_E{=X%cc${P\ ==ݱkV5>0#uc19gc ll\Iz6]ςrB+`po#667nn~:ˤ(eX/G!&DOuiبb#Ǐ6׺WO#%aeW1%8;YSacЏ9@܈?{ї|^ًLAuGb^}fm6aNx 5Wßw%=ŒgL7cVdu]77CHZӱq 6<2Ϟg\N9>956ls=k[ܷ:LX6{C^_ߍiD|׃?88&}|>2uc*ų?r̷_δl5Jmj%Pm[\Q&6vlTR`r&Y%b4Ba-,-= T/Wy(7H{S362j35jғ ovO7d]g,p-olΚ|)ȗ%F.R[6\*|o6q#yT>qn\|З\kzeh=*>]K{4fr&l {X[˖agc7>\oƟ_̓*WN=Z'6m't=>R49OþV 7fF/<4HvÏM̓\,+=lNKz6|D#ٜ=ԱK gW?IS4;rTIGT<~ h(G섹s!UԿ:R {_sM :Onyc,q%;9.D1A_Ve[E?9w +eСx+#;X%9`m 2*'(;{0?:8t=ۿ"s];RǓ䭪ƫuu~ju FN7co}iTBfi>]bovMr Ԭ1w՚7 LcD,c(ky:s`\N3sU}7iRh&;>9v)6_sm@o/sI bDz_{ P>s(_жb#vw/Kٌ+h tdO4i8:FJVkrqj[>PqT^6 SSZec7%Z&++X}Pַ0g#84Yq`kU]_ǼKw++r=ӑQozN1lv 16A.'|m`}I/Mrb<ظ.kw-|&o1eej +c*FhVEa[0~䒃ࣚ-ǜA_VzI^dk6&mΓ#.y'HlI1}3E|T<}K<\+Ylq"I'׸Y\y^/k6٪m>li +zv .&3ݜ m=!;1&m8[6ol`DൿϔlOғ/6qh4b'Xtɟ\FB}lW>,*Ǎmn62gZc٨غ/63je8jT/ip)IϬ_kE3U ϋGnZ6UaCНd +r`nJ%zu={#ؙgxR l9z c_toІgq,c]VHy\aɗ ng(v%eeF*\&\WZb!<E3ac#x KN+iqЕVc>mmvCm6sm~bkH"7ϱ$LOP,{yWK8(6z4lGX>Sž*%NgR^c{b}Ub׽fuꬕk#j?asVWu_|ؗ/Iib#ibyFA>8ߔ현^e|v9%FlQ(,:~$%iB-ٰs1\ct7ӵY[{~Mr̦\y`]uz6ZtGƸ]ZntrIs}udVlm6WFf!{brKd/ؘ*rv 96t-5Ed6lTg#JM{T?˥-:u`ϩ6[tZFSfƠΑ &p:SPuJ:wgFKN4/Z`$4y^YAO-C?lٷ^n0\%V,2(M+]dk`qf~l{}y*\ƕ+7lfFާi[D;U{GB3:6NR϶m9c>cccQ9ALO1y=˥i +%{%k&#*\8Q$ZlM4f:L+g[00jmR6q9=mwX"<;'Yp! 4$}1lS*#Ʒ#kq#V]c=UiX$oǷvƣZG۝eFGS!Dk{ͤ/G +ݕ]I~8fqlrmh^^"4)ugw]uYX_LX^.oT1*.`4({*'d\,mkVy1x^[w(dlL\l[ B]Mg\"BNߔq8mՙw*6N\\lA{jO=YmtX6n voMqb? +p#w EIFwWYVl}>M -Y?HN뷋v9R ]Y>/Y]5Gm3K6 U9C yԻx[pɂ890]OnlcS>JIgc/(W `㟫mm|ǹQ[Bw iSR7+ؙLl|O+aq!:g`~/G ǖy!^c`a<0rA> fܱjxw`(%Gg"1Vy&Ko7>џ"WDg6$&7j>D*5}bK*߬ +vg5zXgq>&"Nz#dļcEM |b+^ Ijb/#شJKꜾez]+*"YOBUW<0{ +6qx7'0|>Q[~*` /^=>ʻP0w3kG!dkBR5Ň=[Zlbc,sFA͐,<986G?Id2=]1o'12FK m59;^[d"K}< g{,ql)wZK5z. 9`4ReIw$pƦ: 6v +a5gׯ&WkK.Ll<}Ygslaǫ|Nh#9'$R MúEX72'a&Fd +uyplb6F|jZ6Fa[?^ =YK'{rT\|ahh?PGT's;=0-,@Z#)1QuWyߓijY9׮6{CPAyoF__SNOyb>-b:ٸJb;5t~֕l 5WܙWu2q<j-\PƋm9/ +<6l|tl\GWl/.op9`= |L:RooFun1 +#LH㼝Km} z:nV 4W1tNlTct0OU1b2g&V$>gϟHs͞甉~HK4 *^2v ظ>c(>.܋׬6R糨V>'ǜ][\\)soai>Vq90>ԬY%tcǷ݀y>c3:ǧ2i;ƊyةqlT{[G1?rgY|!4ϯMKq 6j2Zrd@4b#݉1e2C`?|{/e >3^ r|}um?pF|bχl b|S\Jzw mpU(=})F~9G35uj-vДCuojpU-˜{\ӫ6~kaXq񩉿t|U-kaFa5iѰȃ nZPSTΧR'#}g{러0%xhi(skEqU8>g&NvlyW4?Re۳$-`N +?{=L1E1tx6NvM|sb`s~#Qg}<0,r.w7;HgFv +~cT9>o xM-+.xBnhsMQױw:gsr"61f*6ZfsmsM%WW R%FkNq$9J5Uf23)1D˯VunrO.б5ب826ph^߸֣dY%ע*O!Ϥ1s`cyHXFލON73 |l@Wye9E\Ͻ-aZ[5dqF+l0'2#e紮BQ&6#>΄5`2'/ŵB! 4=FMƭ:3![4]Ul==L2{̋jEC‘ur} s+PW18= 񒊡d4%eè@ǻL錯XuqcїbK,C{,ʷ(HC\ 6fltlT9.2b0xGY\~_2${[O pEƾ&6#bcAȌ#护WHfϨ>:cUVȃoxɪ"R7̄;y&}Е*eWd_o_YϮHc;G +zY}/쒽ӓ4SIU>qC:1a1͖+=%Jo +O% Uq^L\-|Yq@֠{9%^lc ,pڴw 7P}_򫠭g.fAͅ 6~g$]rʗN=AQ31M ةwT{8|ͦs瘉٩To9{Q}>\޿aq&Ŝ8q*Ӽ!ĩ2u%7XH1}n6YldF_K(!f5[,XSk;k5՘E+ k` z*_}]a|}/ |81/UGœ%f| +V(Uq'ٯ|1TM-:+99S ߝB6کtN]rzL 2 55Ѿa3>18JAHt`x>MH6XD{J|b}>\lجs8cظsj#bFuP;UD/e33ꇪIO/Yfژ1#G*mu_Uo?zR4BOM1>r4ǟӘ5Ơni:R&BݚK + +-U `c6q&8ס|J7a*2',R_l5e *3rDO7|/J*F9ŎU +ro\tXjgT~`I?! M>aoj!?]..1cLZٮ;Su s# '`$5E3d%7ԅcF:m@3>^[7?[:sa05/z)P76cvx6x;M1?)U7_l|Č3d!?.;[rYy'ka wwlTq|wo{o.~ cGg쭾)0[|K lDq9lb G)dϗl[r~$ɞl6 +v'{B ?o*ytlYk11`/F[kYoE;&9myR6fFS 5ۧfP1/x$G j䖺ETƑ9qlgfvSIr\ɥxBؗ87Y:'6:!;^d7AR=ʌ/3)|?;i26M +~o{>g>{R}}=`cOYCgG<[lNlI;10POڅ>U}'8V`ZG솉%ehWSIb'٢Mm~I=0nьجςڈZv( q|gi`㝝l(/$llւzt3t+ @K"kS[Uf:x'7^G181>Q ]ϓZ(M蒻t^ stT`o,1v|+ 8qx'rF:Xgx?Sl'byV'd\!P\2Qv43S_;~lk-n[:!j^1Aw=з'\dKscFlTL hl^b窌ev!(Tx<ٸ5輸@b׳10 6>lgjSMGdltýGzm# 1.# +LUB_u}lE\ fF3hT.qpE]r1kW$W;cr$I4GŚ*g؅ϐʂ#՞fm4vjb1bcGsQgox_%eMPזٴP)1`%5Iu9=EV[#`f]3X~\Dlll 4^/sa`ϩ}NPݹdHE}?I@ƑqTNHy96xD}YIn"7ecذU?ʷxɹEj 罺pJ%z +D!g `PtN9Qf-`#Dg{M#_ +B\sh|Melߔ g.':K&CKTJ/Q5UA6h{l:6X=|mE=j)12c[1iT-I8}w9}Dnf<קz %-G5M5!\eCN]nOq~cJ6Z^N>)WkS[XPϙRx*]=m>6vQ}-*3 +4_=( _nóM?9F2 bpg|ۀjv{Prn|c{ifl}S7cmqBz6`%))svǪƦ#و:'42;B6܏25^2/9Mצ7H$|LOY1Qx-2T~l|l:W6^U-[Ʒuڞc!~.S vnl{ĕ*7n/ͳ|~"#o `񡀍2سډډ:s>\LO[gŵLyxowlWgF%O&ظ^oq s`烍Ƒ*XU"6vno->cդ/ _m,v䦊fibxxx6殜[Wlijgʹ'H +'̙? 6>67fF36k +۶c<WteA{yHB33kSqF; +rTbj>d; 2W9xr4x6Sq멏/k=fxz˒«_?A=zV=hb^*Vb]o^fs8bO7-1=ƎW+Q,dZݱh*ńjo.،sǍV!;|߲t}=r_&h:—Ml ֦PG3b.5젶_Uڳ-# wm᭔T2ɋUU Dl:_yLJ-Q슠w865[9pZv=ή2"ZVFc~pgm~ݑo5!7+5*l,ڭznUZ'۔fK) _ *Gu yLsE + X5|kgAUI!6 U|`kZ69nZ؊u)I0” rq6VFX[5u|OJqZ1ZSLo|n-SdM`-8Qꄊj^a:7l23s^H+x%-*6v.l,HYnk9 ^1]y` ^~tb~rƹlyV`|ꕫ?vM1 ;ˏj(UdkV9 hw)[n0б$_to1ydķ`EUJ[2Tw79\񠅹Xdc-M`_Css}:20̛DpKЭp5:&tꨅ<2'IH_ot k9 ǕqU{0ާ16HyRxΣ&zp]6G82zG]<5\jm6֢ZF}=[ C+sD.3&>,hޘ|s6wO.?Q'*3nWZKx:L%1 i5I>t Ɛmac`!'V cʸ +FW3g:xKy&W[G{X/ +m}Gu~Hg91__/1}'*O)Q`9dc/ 6p!<ۧ|=u׾]c$HW~E&A#ߝf^g;T/hxgж&eε"1NWuf\leQpgs_][)h?`?0l ظl%Ma}%` Nɟ0)Y71{YK.ƈ#`cSA8`_xjxEQauH\ ٍz/Ԉciu *Nm6F|m1P+E.w +4\3JF:f;sqLMHu犯yehBnB6R5jf;19evf`?E) H$Z`-P*Fu6Ս.0Wq8sD>Pj=c;#.gvKN1l* en.InQD:cᷠfgb7&cc_GI:>})sw65-2=b.ojEkq 'U֐-{M3SEeQMcд:(7d-sk+\mhu_3 -سګk[H> f|ٲcMUƾ lkEى]1F|lI1{6/6%`؊%u.kU%ۃ^7|9̙HNQ1:H3NhpJemƦ+bq\x6 +sEj. c~V4ϱv(d$BXUNr P |EKQ⻗;߹#@) ׵'T77; +I\>cŏ{׫1#gmX?6^pz=X/IRƞV]؂>\^x5;|k;8Ɖ٨tGWxd'6D"Wgd`e#Ɵ֥[xZˌ.(:d)ZKN_fZ?"6Vʂ^\d[dޜKX/(!'Empٱ.:-cEkd^X(bt3^]kR)_\&{Dec]B 35e__~ƟΓjlC ni}iW%_G[j[x5Q6\npLrcE.pb%3}nH5+eͩQO319cDBˢl6 ]tsLs/`cq:8n27@BS[[%NTD5.zH&.*5ކ~)8>2RXMEx7f1slumn&YzN1kT=]l q3]~^q-`|"Ld2qd@&Sԃ!5V\5OQLQCw1&G (Ǩ&_wrm`Ut# 32%uxMQmVfqyy@^6̍b.}n+ . 6j5K6n6N ԠW:qh灍(PF_?A*m**5I%ncv7f9Ey^gE*cf2C1,0l臵[ALZZ߫Z셉0 +Mc%ƎJC^7]1iNj3ɮ.s^x!(tɷׂ#A1q<1Uڊ`˾VoT51>_FPls㈐MghKy @׺,UMeK ?`b(ߋQ ^4o6o0~6նIi.2auq6lcW|:CC.#&E>mQz3EXO^>זyɵUBwqMKV|k_܎y9 W;8Y}6uU+wHy_4eOkѦۢM/* z|ԯ(9ѣuٸ|-huNkmEo\D.Cgttd7ºʭvWt;Ɉѵ_ʂ'>tٸ̍鹲M e.w$8< %àj]Ěq6Rf9_p*˸rwXvL)`U/Qw|F'dc{m51w{s͖^Jz"XOkα٨vH1|geA s9]r ZkK6sjlдl 9sll(9lKz #P}F{z6j-1~K>t +T+zMC"0f)VgFű~plg"&6#r1ε lZܿftgo.;6Yі@U{{`-5)9}$l@UKdwqikłe0&U;676n9{d`BߟTm~QIҗ s.k4-Hrc=u^a_{TEuj6,Vظ*WJ8Ǎ\0 `_o96>N>d;{p_뮳bc+V-ބ6b|0' =?em-; pQ*=F +6 +l8k8Ά|XyT2O űxUɾ 67O6>>+/vmhNAr xm \ls`y1Z_yE/-҂=Ê=WB'V,d"mkllD(Z _&ɧnfB)u=t@ ֜8Rqh_cl z4`/@?~F{ncZ3űu~MAlb-9EzSȓlG*E5%j|DM#sJB`T3شIёؚhf^4[;ռFA>x#z[HN~> s3tmJ 匊&_b|safWH(AF [`~c:6X|'Fǚn]ySmQ, +6^ZWu VÞOO'? ٨V(U(gi+_06V$UؔqT뱏TTN$jFpq]QLB^_V{^{`Ê59'68-9 1_9}?8g6;O<][1[`,qv6xxlTu|8YF Rp,*9 gaYrq<KbRK(<1׬Lk6^0(F> ]OSe7!/G{tddztٸMoQ ?U˪m~83MgTI~+[ӞK$Rnc-UL15A}%UO78'gњHkK‹Wҧٵekj:]߁x*[iM'hbSdH|!*60MFo6Bwcy%}x޾omX-XYh6agpkNJl^wT&zH?0 9`]sdc,W8Ҭv>5Jw.e +7%ۢD;@Ull (p%dc$s~ϕ<[Vu;&Ȉ]6vMJz-+GlK%ik!VPv_7Y.n؜dJY3x[:sk뫳e:`&~ +dl(5vmXltcT 'ϋ݆o?Ktصliz}\4ب9loF0G- 3] M땺.*lrMƈ '}ƭ^bG-#~ ][zH׃@F3V|/kXO:uagǂB_6mxzU'QG7N&{U%l||# 7FkQ2 +n7ܵ6fJHњ o56ΆP2=?%lZlV1Ki_=I~ qcEHr>t|YB\7fVDT9}#7\M _/\(CƪzfKx,Y9mӗ`edos5DF\OfrF˸N7|/,ec&v]G\'81>ݫ+Lcjkw䖅`#~OJ -$O־]Ӕϯ*cR~l܊|d8x|ӓ$3kcƮ-Ck[i`ح-5;y>ҥkwmA\+3Ź5mjȓƪgL $~c&Fecvre]A =\3*N5\S[lK7iE#w0M yKgzީzcElA>99U0kkyIVUCUzgHl^ݿ*V]+UT\*b% "AA009tWw_P={ _|s^$ͤŖol{*}ڸQ3gg6l@}ƼqguoZ"OGsqFN5.+2yn6mYlT*=(W]C9Ǹz(HFClibw;_oY,ȳ0.t8˾n8S*Q\_, ~O͛G8DJA Wq}*۽Ռ:l|Ÿ`}2!}k؈qarT>}0'(+zJf?xzpU.s"1 "{g'#sÛ5g fܮb#| +q%85ƅ`ʜ)yJgַ I^ ޹xz'8I8ϡ5 d%?7mKY9>lςC;{T͖56|fYo5".46'Mu9I7h}.o +5"5Ŏ&ب;VG9_)0zJ&}0@eXS!{6s^(F1m8"6~ :t2g[4fY3ī-aֻI 2MYƒ!J9FN ͂W#8q|W!}>6%F7 SXrTFsl"mEF=6OviQUp\!l\gF$|(a.ac-THh㙽}o(I}rImqgɯsn`bilӪ>*//gG[Ǎc%9^WTf|߯,SSHN}̺m!l2!`v%+KYoC2L26PEZϬJ5IVa鵏Z\앍;s|݈zITWIFSAp{m=~;fMk>ƻq'<{ym9tъRұ~enx9bOq430O6U9nUASk/G꒽\fcS$;jm٘7*&6?\j[].5C.·jB͡iX.#ggq8ek)\?&"O)3ΦQb +G#·jNvHrm?sP$䒜ePf2r+>h!\:uPoY]~l몜oV)8`%pi`lӰd chc7mѦ7p2RVS7*kzMR޸5>+ "/"ca,X aB+\dkVJ+.V{] *x8ZY_SLfyYX t zccMʱ\|Ps/@Nƙc)l|,Ůto~"h)UNWti롔qVG؈9&+1M3 10 kY%航5|x4 +}+]sqF6?# l i6J(|fмlb$o$V{kƆk\|DP:8N'Ք&Hvxuqkq +Po1h1Xl&Id/qUS+t66$b,Jz{VZlTūkֆp9}'kㇱv:=*ůJFt>yĚjЏjGՙF&4>WW]Q<\s8 + +kC/gL-yfMafc876%Ɣƒ7X__ x3;l㱑h@;qF6>VJg't; _X2rA\GM%F$mji ?K#AͦwTz|;1|,DLF9$O+Ju;}{V5J٘P }v~~{mϚˇ1Ub?o|Fi\α 6'*|N&/`S4m-k1^o3rj:Aa_e-g`BғK10ZqD5sDkkw\ރTSAoPb#T:rg/6j1")+q'˖6zݷć [rlqM5GS5lls1`N|`#kuIk8{&m^8wʂWU`ڼȷaL*3 ;? +R< ~Mnǚ6p@=qM`F4Z"}6. c_(I?-˼X &FpomlqD/(&[y{ F}nc#JmseK0jF,j r!N/Jq 7n} <6gYQ<|̋*] nc֚Jş%LQ66no\읍 zVIx:(p~ZŶ FLf2qg>J[3ra̜.Glʚ=21VR*B,kYǂl7U@uȕbSIW,mQۡ\f>OuG6^?k3jfT6)%Ao,}n39ӷ}<6%/;5`fyq xoU"~ B!m `f#>+ٸOҰ90Q_eU[~%ApF-\*٨I1\y_ЖJ{~?ojKͱ*r,1tO0'HAߕm5Z`cO3y](,14}.WgЦ_K`lv&eFj"疕ut=vݯ.ߩuknWo-QrF$ȃUEmJ,J׊ZmZhmX;NN1S v@͌˒}?s;5yo]Rm=|5ZSCܞgeq8O3C3xXO-J%& 7ߦ"/ID3n*c̓c $Ştz:fzcIk+=Vs=і +-Xwճ[2Hd$ci>\R!vi p¯zbR; +. E?;,u +Jrm9Vqpz;%͆, N<$"$99|OiQc;4z?uHǛ4M}-}aAC 6kKu+ٸ8 uQLMéfejѐ +qبl-R"6Ǎyht gYzaIm@O7dXP-뮅p1;=P BOǾIK]5?WJdb۰4MP# 5-'ōV1wG =.ČdLF:p 92r*v}U55]'߷7vyo/)|jE# woe^ 6\3V1cO\@fQǻruE_#vZ290sr'EpQcz^2NՑϵ?ϒP%8$>D"]$!N?[Vpq -#o\,>gkA$DJٸ Qy6FXārT*]̃~l\6 +`1 GR`ϛ]߸\cZ3ča?{Ë5K+|)KG&XDx|(OAE΀_=uORl,`mu"rl_UEΏKRb~h;]G{6^ǘg9gt`:rJ:o>ku[7cZdRd'oPVl=ѐ5Y=qiyLsD4~!ٝ qjOllҵ*Z<%G|cC8 +sQPm/JE2g 3yvZ7V7^3QKNb\s{X +,5 rkun/v; jֿ,'/G#aTk#Y$f>_;\Թ㽰q +ޛ'm#}>e<90s=+.szAf:x2IUA?Tƺ~K=6vXUʊRow?ۄţÃKz2G׹eZ:>t ߎ 6\|s8Z3+u$U.LA +⿄|\[Oƀcu^1]ed^S k@z*Sl&.22Wo.\G-\.ΞXZ4Vͮ-VɱeA?SA][cew9` nt9/ggxL4܇,gFrVT%y-b~BVzqcXOyȧ +m4^Gd&?[캺77ql6I~z6~iYSO>b6Mk6:EE_ڕ<. +6VU1m~lOm{CQ_dud@aMYYXF8XA?Jlc%%fSe'r:weY*| AAέ*zO|Ə?LeciRl.ZdCŹm.^qk5 ac;~\o/RaTKYmf zZÐ s.`3ERZZn]y:1CL7VfF89lE=䞭k{v2- idxYc $D(]Eu}جqߗخ3=WN~g.EEe%cY21CA\r(`kqClddZ\j1K5Q+s봺XY:>/JhAoIx=h< +v6T7`܌vZW8VZ8|<aYX6uaX, +xOS{VYl-mz!nʚU&slR&pl9co~>>`t2^0N٦ +6^F<6JE4 +cƉCq?|wmbgu!?#M 7O@s1~KP9|6j.ÍF.T4-oY#J:*PԘW3}c`㶼"^<H)Rں~ϳVƂ. zcjwldd?n9;H`,]1\#֑3ZXR^)"v2`UxQyb=]nԷm5+.(eI8XFՀ 2K[l,z]g,gLAۋ`c 6\8Z>.@fXACKtwMMPk:65բ~fq7c:oybd<Dܷ |\yg!x{n}۝=7%B_/gݫU$ w?cՠ@loі몶 c򔪎3#%8ʭظll\jLlI9bb`AS!ЂlJKR| /g l\ '71oRSXcNX^QT􍮢?t=(4VcDžb:R# l|b`|>nkqFsEǏ÷:ٷe3?IAT+0rmxԪ?-8س + 1d6v~o~W *Ky=JvI^Гp(7 6CN^umM+{'s9^$3^ǐ៿S(iӕXL6tmv~ɦ:ZIj>.mNA+vS%H~ fc<munar=t1v%;s̔HB}_.EzuCK^- |$7H:Mf;nQh?qmylcu[ނԲ"iz1/C!{c)Z&4iTsqGE- +ܜƛm+.Fh^|du`(aU-7) +z&ܧ\kt<#{ ת纭JPdN22}Qt4:y8Kȳ]N?.s gkuÜ *i?T9aY+&c~81Qqry*EV4>D6=W;p׹B ѹ .j'//Xyب*ʂ~_8h ܑ\U[ޫ1n{^zƙ̈աsAiR99(:$i6B;*=1ؿqlm +1]&.<[UkYkqQdqr54זD4]bXeNn +)Nc/l^=qw2χRsQd:1*{;ؚ'Ys;J<ll|(`X7lU xUіBmuF3 +[%{c!TeΘ܎9j^% d<{ַh:d^O̕l#bG:=4'l`5UJ^OoX{smկ5cf%/*H읍܊b#/b,6{drftG.Jzy 9b3ɦ,Kl׀h5Ul>J"`=`c+dN +;}~nڀM)2<$~m%`4*rN7pԶW)߬fy8l:<-UԂC?~ظůqgi8ΩfJ<^ccE#s^{Vct: +q0t.6]#Fs*ɚ?Dv{.7^s!?F99a^NG͸z?v#gjP%(0'ToΊ\Fp'6:rF)G`J?zT䩮$/)rfc%fuWu6S${_W]&-3vpM/5luH]{}痤'1X`i|DqYOrjp66Ķ*S`#IM ޓ|lǪ0j9JN=x;~:4킍^6^.>-+Vʲ&n{uLɏ{Y 1gߝQ󋶕9 ׳1\jln{oXGAЛƛѪ[xaPi_~?bk +ìB\}̼}YJ@u[]_wzh<`Ne3|LzU>k\(RcVzodjV_ 6U`\<_뱑i62#_Q^q ÒSzٗ_l tqXrSZoq&2%N_빰"`X;vZwiϪ]PENn3]cX6RrHF=<6(pA0̼i֠܇R[/su5ظlu1WA.-Z[P"1 +$wUm{úS8e/\_}.j/ ryӾ&;%i:+l vjyld33#k߬{o􇡧Ddf # \Mz{P{, ?#w ~;1҇Y-2r2x}ElTwN6NZ_muۈ_X (r6:Oke,؃U7g8ްlXf"!9yݞK[6t+KujƖo{6zkpmGxi[vyn[vHB"hUZ8q>F(E'oߑ%GmxosĈFIҗcL ,\چuE`cז٨}ד ~~2K?0-A }]-+>\l֕8IR|Ÿodrxc3}CT6}]HFnr7'` xG=ΑbcllQrM_=u}.9n<7)rB{{ac +jQb%&'Ȼ!oa`6!RdiPd2{囜+ȁeI +RwFV}J'IǶzGWoXO'^w{,́r?xQ'B~O]".b: L?Նe'kO༶b{fc0wgO%ζ7`\l\dy˘³{mMlǟun٨ߍ*ZK&o 8 K*Au=?DS'Kfٷ`x.$3,CUofll׀]"gߤѽ꺕N ZQFV^'?v M3d6zuɪ^M9]ft<*bݚw8'~`ԅ.䦺~w;~Bo >,^EHwcuMϫuǺg#Ÿ#^Ư8=>h`QC\)mlFO>ƚ[Vʤө0kR<5sf$jN>vvj*úd5puޙ?I$q|``8=~|6j2W8̻,@ k]%^Vrm +5VgjW_)GТ*T,WXTYoxwхvZcKi?11#:<[ρb&Lܙ\CkF qI4X4s,cPͪKk|4Iy__ӏl%/Oy#3xܫOĪB9Mr3kye-}6nq*6ѧ9%Ozuƶ `9N^{׼30#}l|qhU? +-K{z޾ilСyظc֯qEƉsP Nf51֒ȀmdaRzCў/?/]b}=N?/Ʉ=6{%} fqR?eˡ(;B?JLt/Z,׾le6o`9/^rkYr^#Y :~Zh['{dV6ޛ$j-D"3vVQkm٘Fw6LJ+_ +/|2z6IW!v5:<4s!7>HƵ Bomyj@ɥ.V/l ϻq_ņW:=N\'͛_,7)JzsZ\yڽ7ifch9IoUx{bM []=O6= +;أO~s';9s*Iû~&=Цծر:V쁂 џeQp(}+OG\SsUtE?>F͈~d[Y<&35EdnlS7ř^u!ryMk!AncA+ +l.sklSyRcf>k;̻~3F"{bWW_,4g4g\c]իT ?Ij8OTVmfV͏^ |ZUR\p`ORp,oYCgű*)* +*A:f얍?g'mB\sM$"x'nQ|kXdh8)Eſ7ܔȩ;|kVY&~ +IE e03◗~:pl ^cn^eq#/wt0XRL\~S]!<ب9 Gs|ܡσπAݷd0HgV䣺Mo'6V6)*gYﲒI=5$|%G^߷+6vx5GNʜL,b{y +9Q7%[n(yuHᯥj.)p}+;Nsbp$#];;XS7/[7\s_@F k9Ȑ;ǍLC?{`^ogyb&wGxxZj˯ olqޟyUg:$`h%yϭH RcpJƵVp:1|U۹8~*mrfmIsY+S#z{ +,9z0nfcmNivq/ndy^-McHG]X}l=''סNYa"_xvo%^6d3*ŋJjQ'q1`:p*pM9A¾Sͫ!099N>^nh[QŸvF#-%w9;'oYC~4c8|x½Za_]il9?X`32|.0e%e?ߟm161+f}8| 8O9F&u9[ZU89 6:Ur~A^A =:yݰxSQ*K';-IjKIp񖒒1d#8p'f5,Yr#c+|^Y#X}ĽeǪR\VMмp>} +Z0q,c##ׂ?2xd8窋zpᑴ~>ѭ#~6=NvQ<|"Gg\k 9"3X~<{R<^CJ -x=zany]-illA^R"?@:?<cnCzS_ST||c87ỿ4d2h:Y1^Z:Gu;쌧`?}S{VW94ºݎAaS9fW^8UGhל|4l Ru^7a>p" %>S`=eeP5N1XijXwlijv}Zʶi"DεҁA(^DƊRw}֡d98cG^S]1xWd}IKٌHdD"ɼ`/*H~~-z{b[^>`\No+0ZT2>|t2R*dk=䖕JT'U>URN9d4!T +)zsjYKW6)K^^*x$unR—pͮ) 곱5wS{Vv NPzW٫ˎ4/i/wcIySfoX?m}g]^XcU۾?"`T#LҶi`]1:ݰQ:C(tJNtgꏷc}\)qmug[A~|وEF/BK#5d<>֯//J sAưr'+|i>vR4/Ji!l7"NSHeȊ>xG_Om! X遍GB-ܲ0RwegǾ=qz6Cxu!lt5zYc1xTd%o*+Oxg^Gv/n/:Q$:/bϼoer<, E[읍uր?fŎc.9K@&3 6n7xlj +Ďo]!Mϫ0r$4k_Db`0H:,}T.Nm ecPy3;S%]CTCfsgפRbj[~|<7gg=v_8{QFzWۺH/bFec7EAvƐIMhDXCkYfIeִlV* +U|O.8֪ccNs`@o[b`^ fb 敯RĎº:FoYb6g%V](k1BgVl{dUCśNMz$ JPYdEYQL.*bZŰ +".QEEVa DQ$N=7TUttzn8{{R@=̓ʔmszk?8n7#\47W񵢮i7 #״"2X)1UNwTQ1h9mI78}ȕ֎.r;=A W-:n[kE!Ʈ;9ԷYZ~@[L +9C}Js nѳzvUkr'B \X{]3R麠V;%=Y݃Պ]{ϘR8 +󥹼 +59~l'leNt){dAZȵޞM3mH4*kZiaM`?> < wڍl;]W.>N Ymr~ظWS:x]jR.[t'/8 AuԃVuo؜|32qJ6v( kxGPJV_ا< +ʞ`|0ʚB3pA)M:e~̥Wh6 +SQ@y dT}jd X >$WO\^ph.gk[ri Xl \f$T02lw%Wrq]vW,ٰ'_0?|W[P+-ĎB?`x^ C, #.6gFX،8 1fY`$xKU*c.= HCA;)d9wfXFFq}P2WBWqÒ\6^}˧wЮqzfJҲsyEMMuیpƧok&|FW&.8eѮ.O:93ccuT8l|6#W(1Sgټ +|,cB)#77rs:lla_2d#p +bM>A߫cF;|:00qd.=Rc6nSfjtI> 11v4ċ6n ^Ƭfƨ/lgʚ+Mp^>6 xkL5]b.,.|w -? +gl*}!y>p~ןqհ \ly {=v~[v0$_SǤPOX;t2Ko~5O^!XDH.!?|ܿBWl\ Ռ #BwfwK~4oR?*k\j +3B L ؙة9O20%C{s~MH;kS}#7#>quw7* _R$ƛp.l.g P\Q'l]X>Zl^2T-mNO%ȞE~/[ ƘźǔqKeG.Wl1}.?1$Q?6^%:mC"E(O8C\\V@mdq  m&!-?f>}`hgx}U)B}*V9~{UA[]2y+oưOFEB"KW^k+ײNJR[מ wC8q`>v{yr Yh^_lV P_rF\|lcr6B_$ + uo@8ĎgX?7UNqP}{F2)qH6lxE7_׼\LItWFh +֏e [{]"J@Bx_<:6#Fg~sragځ6a3e#K-Z>B~fh趖u[b HKFcF΄~daVJF_.+ U}L8d# bu˼vP 3~8nlA}a#EJ.@Qk>6 Tvw)Ik@{1sz+Dp {B3CVJ:ݣg2*Ci:N#z;;_6 yc8DM0  y3mU}%pQֱӆ -} M3&Gݙ (ǶW#Jbat4"y+·JLW/5>+`csq ǁ?w9=y]q>gC{p'Uvbslm6ڂm(R| EkUUIE^A}qSnBK6vDz=1@#6B}>Ws.h9B~Mk!~7视|.pRn: <VKUs~*6m9}[a%Ns+ji^Z_= mcX/Ʃ ^4 "AfH{A*|zzS+3:x?05xÌM* }||_N_AgB&-JL;"[ fPdķ& RmӝCT{i.һwEhgeNJ' ϖѬGyOFQ1-\tQ 85?4E\*R! ~1Ď6>Mv;It1W5`l + w9d5-"TvU\Q*lf`bcsjJqH7n[&y:bq{GJQ/dNjVr}g`Q9=rCaGnxCf7+r\.V_Vy۳ mp0F'֔Μ;q S5-"mOQPVa0 +'L,`=(.6>Y'zɬejs& L7lM~~55l+1qt1p.6S9X"GP_:w&2 +4CHJ{]W;llMuzzv/c} X2AƊ࿱Cd;3c.9}8y=~"r8G]TD b<1l~GՈJ|_R;\JR=,ԟc!l&'N4gfW%knT[LC|c0 bq>Wtl2UA]ek, R2fP\rsW4zy(]#Ňm]Ql܉ZQƍ FxK c5ԗA.h9rDFƀFI[!Pi$x Lzg̒hkdC+q4T1*3s%bcӏd͐N(2=L{^+L)\X6+ҖƍfULr[ħ*;8z|/1]6a 7yJ93|F+H.ZdЧ)QC_\0%&gcZn;ͧsxOZ'k*x_ԗ!l +Bѽ%l,{J_5vo"#kQ٠|=["5(E_ďn)>fN7KQ9e>A2>􃃾0l#\ (,nR5^ˑY M+9=ɵ p66fcގn~;1rC)bgR;WETsWL6㪭8X|>wn6-%dzw0* 48'ӌhN!5RZĸDڑ(U KW $Ws:"څ9X&eDMxEO9:(}pfnE.=ge6EgyEPcރd\^m]*p#yj?3ͳH'Ǜ\O=tyW`-.k˄| ƾxzƗ|."F>^l|ΎnkloF{FC>N0IwklֈΒuM%1ycӽu86/7;i𚩯`+>%V͈ᙂ&(ʫ9=) !ÿZv;瓏b}v1}A"oJ !‘;]KPDcmxŭ[F/l.} #F>NJ^Eor5ƮsRj5C{qT:lhٜBur@Yu yiy8c#-FZu`{3 tK9>'b6N'n^,;;?Ε "'}LqM냾>ƏV-gMxln<6ƹ1mظ֢mR4u8u`d# +jl]; $:jFh56n9Qhox΂7- d;F[w̾RxTPz9(Oqźh+씝I熌J˂LB!䶝Rvж>-Ϙ +(PFs83M0EEl*ןӔ1 zV9ϗ\r1bc400_s_ӳzQPX!f<ڲOGL@f`G+8UU):x90q(IZL?D5y܊/KEy oy<7e~G9HS1اlA-cO l-y$b#=N~zh\36ʶd3|ׅL!/3P O3sfN~f=<!B٬^M[47BN)e]M}s t +ǯO\\k rGw=cZXG +G6v:]L~-vs3cc3b0/eUb|cTu({6n> )徭]OA=PjKK4tcp*qTgx6j'/QnН}w7gu2B+!y\l/l錧<< 8j +C/ZıVcn)sdllf$Vs_Kb|W(>JxOxPl2q"iFlUzn\q>\lŁ]AEG^ +b8dx86FkzHD}Ʈu?u{yn Z CUη8Ŧ3lsAm9/}(nHk c>jxر0Y &Y[fV^+:Kq6IYxTmVErI](KxKڤc|ӨͭkCL&3>#?.jʫ-U)+ +hbc 7>m^3ό }_Z@dWRيq: b#ec5`#}a6EA+L}O8Kt}-8nl,Ԋ؄XreY\cz4g±ZDlg:K6>Z2+^(F_sIS (WnjYs k6,`TNb]Wΰa_2|g>T$X#+-[H;n?y+J˫ ъ8?_B3ƙ(ߟ*@}|Zט(0Y1X:|lbQqs!ldEdl3隄Mg5?.)l9T!ݗuvoQ ͞# UFsz9p'9ҵ~0u9Ttc4f?lb4 +O_Uߦm?+ c/C0pq7Ѿ8ae2 +G,=׿'cwMv\ X-2;>l2cW|$=Je\N_,xwx3Zn6v2~2MѿBpjn׷ZZOtm&|wѾs~Іʡ9]ߕ9P>QU5`᳡ظƣƞ9N8:?fO +2csݽb@RlW;~xY1\†=Nl<+9hmwq/"A =ho $La`m%β&OE]]AO-~'x7'ΙEGOAƹ\cnweTȃ?\'s[DJcbbxTx^q~oɭ +u{VVDۺ;UFZڱW5 ưSؕc5!kld^6Ss+%5sEq)`D.yh&1clȕЗ9bQOC +.ͱ;w$:v$Q*G8/Gec;2U:~ZESנ\'ڗ>y6& sZKrX * ޛ_craz&CSZV)\JUF>l.\ֲcXضgЖ1܊5/-#0Kg.ʣ{>kŞGS *cƧ i,MG&"\J[b6Ƭy=cظ>p#w5˵- PaFO{,Hq)+acgFF_(dox%uf?ی{0CqƞO`*ÿqgZ\+>11'kMkF䘏c޴2|S66^ +>`t:<٬z1=- NG en|h-ልQQ +DwL2ṡqjޕa Wƛc\ݭ5F.qmh,㢑Je-)3|fo0`$lvwN`?e+tsg|n@box$kZ3ϒMӖ=c3| +BLUdxUwȼ&n̈́~WeNo1{kZf9֣e2}e p߇ C^_|9vfc .7@yzMQ#BǚRcrEϕ8,ȵ˜΁v ׼[4TU^t[UhT8nǐW:8\?.AW[j8,ysm1\́2}3CCqӞfԖmh>}r0CXĿ鰱iF >m/Mj_s/(UKػjȈ?IrWS2/Ed"j!9h{3 +5]=ʉD/D5ol5)W{n&&_3>~z/'bmci_ e3.- _ <{:jGϒlj\T\޺1MCa}5";e~^p #*[еe?iQsq\)~{7i'8jBrwlB.؈׋'l\X{02y5|UOfN/e.3B)>w!:ƛf#[0k;fc-\ɥ6t^sBФKBlt Q{1=3c#<+e2>bwE2 ~<ýZiq0'E`]HEK!~|ik5 V8^46Z8*cgBPvLM&smHװU|s  | f!HFFFy`nwBM/ >b +#.s8|{p\U{_I/]c  6n ۹;sro>!_9Tot[9)X|Nu5uJ x@0g(LFݿfECr%ñ}m΀qV;<očr^=Oo}]Yt%}=\zqWd*<.tzy;bu] y|щ`g+YR帳V(~ +5o>T-ֱ{^&;~.#;F|ْk\=chJmZ)Q\lX֗ysr '7UzGYK<\*Dor(ipq;YX3G碍<XC(^1cHˡ4xr`V+u;HN O+3}}K IB E63 `5<ú[ +bG=`KPNoڧ,PaDUjk9pg|6Ya)?)`ȅ0’) +nc^/[L4*:d#9t}| +YR69\ +\|DQ^’{w Lp,AwF+F<dʒp^OmZh=o.w?zWsk+ ?S?X?T yu =D**(>g+QkC>Ό|˱x}I.~c9oڜp<5"=[0Lz}|=p1@hsmsi +1r=q8(s*]p&'Cuxf51zW +Kac9oKܸY`c+e=UfslSN)QPJ%S%Z* r_LOFqcq'pZh0xT(~gme[-BV9}Y߂vQfL&sbdeJpQ4X*i08*dcGlU` S'V`XcV!ZJ@`<|l53fpoZٺbOwo6Q*^(䊺VvnC6qll-w;>dS|Q^IJE=&fijOYjKn=86gVV7]Ο94k̲<rpŧ5N Ȟ3ac7J6Ƚ?a򢡼2 +8=ܴdC_GgƦHr,(W!&osHh f]yWl/ā͚ ˙|Q{zlϽLBtdjg8`;n 6oO \lo"F%*Ɂs y7٭kDc9:㰱ȐGнC_(cT*߻ lD9?6.BY@MF;ulGO*ǤT ELh*W\W{m{o6^mS1`c#.ρRR a.qT:Ego>}{c6qEEl ^1c? +)ۡmܵ.9@0T]cro;M+}1\KTsME>S&u ^ ,d7;6B_lg8VqD{n> b᚜s]|lB(q8o^VJ. \.bzP75m +dØ؄x \ +1=%J? +2xY L5|J #lvř,wo+f#%b砏u~P/,{} ]g3u4(ƁȍQZ*ÐqČ͟s4^ڡ@nO{LQyV:}5F{m~ju>䢪Ák߂Jѓo5g7~O)/bFb6[F2zep.qnhkai )? \n1caJ`"~b!xM)(Ǟ#| 9+rp2(Q\dM#Ow9VU=WM8:jU\"sp +Ў67)o >jӁw;x< F#N)fw#3| =ȓ36bYLƜ,  +GK } +t=ηEVr0QtqYopfWtZrη&Je3S'g7c1Sb$f0q]>WT LO_Oς|P뀍݈8s#61p@>rT>06l6B$#U)k_Rx=ʂlC56g@ܸͦ +0T w8?ecPgc>ʽ0qtՀqmw{G +Y]F6 k'UC'|6vQ'`c/}72 +Rt%J0P'gF1<'l.riYzJXk`pߢi9e.k Ӵ?GbWDU(KW@y|oz'.r|jd㡊a\,4Jwa h>>lsr%EdJ6gl{W_T/5QE!2B{; +Hpnm8Su1yVč%}[mQ UJ6 }a (Q+pC`c~E&ě~]g=B~fc||ղ_: int9.:Yَc=fѦXAW=P<9Y\}5{\6`dbhS*.CPW\czD/KGa<~\U8MYc6OJl|ď^ %>LnEř=kls;`YחD +0 q0,Gq=^1FMeC}wQ+85*RB~Wo}FҬʜ]l-z{=/8iS|gK^-VAS[5ovjj1+(ps`##CeR$-T `0%p|utTdMX6y_(}EnT>,Qor8ųQnG.1vM +dkv c&mwչFfc3'#U}1-Jaho\_3vIdsNȑ18{f2)Ḑ'fL- ['y5e#!V n_GtY) I-c6E90q{+aǏ53cٵ5Ӽ̇e{ ac5?bbX;]%iS>D:UU;>L<=:j]qW44t:WFbk*%N6WgW/TknkgûF(AGEMf_=x%:d2=^OWCnplT6#>$}S {y]ST*1PR`0q ۤ^fFyn wy Qɤ-ƪ+/2|.)ֹR5=53Ďrmy\.^3/C~^?-uӼJ:ęqɯ?d!$ 5?Oמ(Q9MS|N {6ʫ91kg+]*0F +ބ䧂y04f!tpoڜL1kp5xjd́٪[>_P:Xt_EP`IUFOƮ*Q- n|Mx\{>(lJ薐ddqܾv_n}Bû#bDK@*T@wpq$cFvF(m: + +5g^]׳/a V'=xxQ00𪒵Q4 +"6d,uCko*锃5O;Ɛ2ZnXW>ǧ{y/ƣuAxQ)9}ʧk(_sDP.c(Q#]2  &ҋX;k8p\,2zJs/tkٸagXD?uW =͊z'&f$l>P6bprm;s|mf,ua~# ζllkV8:㬿9%2F6^(Q%$9cSO=NI>r|uJ6ȜUv9EVJs.R`EJO(s~aE' fQx1K+9*j>Č3+: 3*366ykUєlQ`y61^a!EEJnִQZsӼn@'lbGԒ{9j]lf4O7llw6&J̵\NGx*gH27{I Q ,B*sU=hbHmR6\]JR+.|?AQlQi18Xd6n8fg{徎x眨h k>? YY3xllvy+ԗ\^FZX5M(,UDb; +]HwtDWi>s,hJ} \=f<:ۡv]ϯXB˥hUAwo$:jy㚍5p~ג99rK^'\|՜ՖՖg0!( n8K<\3ȍ +AInDzɗ_x7xf; ."'c6GہT0F#mƺ̉ೳ`T_so:c.NB2gOՄG%|䚢L}E&Sv5,K<9&bUęeY5~^q^YՒ5MݳT3ہ_kc|V0f=%Z +Tޮ-WG=ot-6B[Y ~î)0vO4u\*:cxq SC6Nsn1ڟ&DnyQOwQLWsA_+89\ cEA$]PBƱ\xre2=^(اx5NdTdq]V9 V<b7 è ]WQ6&J\/1um5י}-Ir|k!7q#?.R^.Jx6C}J/3,fc\ !e! ~de62^|6,)qlcjmtP}휮*G`VpO_CNQ&jNQ-S#wne?em50_)1"#.kFL3S>SKK|>[c`٦jŀr|ts<*f4%f0^Tu6dXǻ]ްUE10H;̩(yfcu9 D|M,P^tXciGnMh r.j(3)>~0XQ#k+X!_Ja#USg| C\;fF׃&ĠCcʋh7dM]iXֺqKC{IQ]-y'ة}6<lYz!7)<<{i`cX6恍Y`|{-;1z5q3pqD1K+lLfxWMj0UM$5+|x{'C;|q..59e_u9)ejTDOκH(ѲPUd'_l|تIGkh`Ng#*c3vi3I+k}nuS 56m6NC`njah3?0ttk|?5kW%Jh!U>>o:T \3Ďy'cllBpk~DT.N8ĀiFlF1c666C%-C9RI$~L(ђ0_Z?9^4l( ȸ(1咀q7_MeeS>qUK6sٸظ#bc͒εvd.pe1QDKQ^ ]'e1Wow̛>Ƌc8 EwċWLEQ-U{[^#Ď#o5xlqy F&ײj"QDKI=Z6'T5\<Q\JxQ`FW~ؓ}|p}{ӯ: 0vX|W (jq8[e]`cz[ffj(P?&Jh)(ţ*x5pśgB|{3acbZp +#뫌]l\7`ʸ hk5x`jK -5rGѱ'ҬM-enpaD-EQ,ػ!W{< 6ʽ29wlty]58[_2/3&ϷJ/Յ8`Y- \W[Hv<nEcm,ec5|dn9QDZ=^sk_-Jni`bˣx,Ϗ&`l361d{:s}{|J] }: Qi~a77eaN]cc5c6iiៗ 흖sǒyD-Z3`^BB.s(y8ƋX# 8694 o=t:P YN6nrVɱU`qY3ϵ.W8`%Jhp.%î"!m.V㹤Ο86fVԅS*v0.}'_$3[C#`& ,87NƱl7 z\jSfS]99D-5=Z?t\|b.yRNycO+`OE/fogH?I(Qݬ "Q{{(*JG"m O3V %v2\U,ք%䟍T;{-5 l<\7Cϒ*'_ l|%JbxH~um ΘꌣΞ<*c!fp̲a +\,(yKR6UkͤB #6FϤnjq+8|R^%J4.S|GW.hD{,r,4 Ǟ9l(E]kD.#=Ag{/cJ[sQi! +5~l< ؘ3$Jh^U(z-c ƻ6;66s5OU6f_ + }F6E%W95IF5ˍ(FǍSY??(ڛ)RdDvUA;Z L]{s k}ηb6r1k6vqQ;sC%xd$T/ + Ec(WZn+\ѕ@ӱ9YWdRo^Cj^Jv$JhWՓtjߖȦ/_\l6L!8gkns1`#)G*X]3R*c1LUM,CѾ>!|ρb6ֺeƝkʹH`hӶp?/1X+\c)QD` \LM}+Jp}Fj|tdc{6X'8043k4JWor~ArR%Y]Np]GF5F|Y;U݉IKӺ`"-;:K&~7ĐrƄ%ڹnECߣ:\ +L| ՏհV)ָNtqbG ^|Jl5\B*'PQ^g}Fb>6"Fx/9ckwfFHX2G+ھF6+Lؘ(Q)u2h8{L*$x1rqlߓkZ%zV3o e2UY*N\o6n6BďlcGs[!n[ qv[ş>f|!%R,x3xD ycU'}kVw4w [&lK.'>&JhX/w7ܦrE \8zl-ėW0 5C??ܫ8'e8llEs\|0x;~8bI(V `1З6cmdmMƱ cFVtnok}x S$^LH:u2?fS|3rb'xx5c<&GKbR/p,PS^?6W}e9S?wqqxVrƷriB?DKXI\["fPVCΌkw8,ǺOQt=ddD+Mf:P}/ +w5O>NWhL3QZƜ^wo ;e]?#h'rJǏU(d#8 6vǏ#9ڧJީ9QDKZy;1t3{2rW)\l9![Q:>[m϶ty$Y$ZĒ|C$8y +b;ǐcc;< -*PG;6V1ua~~VٳP +D^ȚR F]EŧXcτ&1aFF[*"$\L4=% =Ʀ,G(C.ri^9o,".llՠoA0^<ӕ䬫D*esWNP: ظd#Ÿ6pJHրhvar| (=Je%qdDK[/qoS|5xB[0\*ڋFB1UB༹gorď1^mP"U#QmM;5WGQet lHk Z(>ks7E]1Q%|>zđ25>\_}4=mBX(-Dd2Fs{O5>\<(JaMhb\..c +%WٌmpjJQB6!?8}=YH#s*}tWu=9}Ω9u0ÕJCpe%D.c K Fr "xEA WACTF Dadax̻jSU]]3_U:}oo~Ǯ'6.D9{rW #d8ygS0yb{vp,^` ؘ}/n3k\i)?r($ċFL91N?Ko> WJ'Y?'۾JyS]6l42:r5dg|\5p#3Z Q7_vڏGظ~0UD!^<8+}PZMTE9d7Ċ?.a]N9}`9#=M^rguqӥI2ub'm]KďFFGVKjUoj*~ue.ߞ_'4uOĂ%Q&{RNT(N•> FGJ?쵑Hvl_&|uYv#϶}=CtS y`dtIXE+ڒ]J~k#;#DzT湨{>H6r:jJ=rߛ.-FLM!c_%7lt}]GsX걲nۧڻk# <-YWS-VZ呪SUp#mAlKfy6vE{٘5P59ST*gd +%{EW@ҧ6y.|'s6ˆ)3/'Ɓt'Yg52zT\eJuX φlm"I.vs3SOͬ`Fďq+TViZ/; CNo$2RS;-;86"v6bǻ>">lV`6[s?B{'o }~txثIꃾW&42:t:#bOkZ5Z$h ~e$`]az?~GC>4?1Dł>ռV33R ']N~~0GrYޥcYd҅g3F*|`_gv ANaѮl/Fa>6FǞ8o06WmM㵩թSU-E7rN}GH5C\?|m&ijmO< >Z-%?C09nHQeVYvbKsڊ}8RKBhrw4۳ws6 +`\ 6-rЄG,7Oi껷')RjfcFc29{/` H-Wؒ A3STWRi`ht)bsR UX>0/$ݽk,q!VbŬ?ߘpMWZ_N˦1#Xto.njK#F~H˹{je}<'g#|.޷,>FGJl<l,έ`?Lײ{٨=^Ün mJcJ[t&%b_ x*ll!:lV7ߓyAmziYxmmPJ/#fJ^R+!! d\(3UYK7^f8}!8];>ֿW63?t74qXjfnjtJ#SSwS%`{K1Ycg?23S'Bɾݖ`j Mk5% 4^8Z%*r!2⸄3bی}+bɎ3Ә4mr>j1gl|V 9\į7]fdt$HQ\v91C`Ԏ6jNv{cK? ?倓׀nݸLnJjc6 +Hm)gMju9:UݾF_|'r[:q"MV#}$Zѧv>HWxՏ!Wqt$ϲ<+15%XsNz^ 'CrD8\pbXqyl?dzQ3^ޚλcQ{)>&`odtV*zB7nJU0`l vxw>k#^~ +>v֡vڰ.Q") JZ+.z*+Z/8'UXb)8T3sN}8ty"k.QT\(rv۬Eh򾍌TXy7xSKȧܚ~8^f њYtY:]C̻? G!'紸ߪJĔX4F,q'T=Ǒp e-JK?Jl| +l ={j..|&.ۚ*k.#j3Uv &jXɆ7|.A CA~i_iw]k3ӾsB>6^666V +X(Ѣ{pqlǃgB|6Fg#5=F\tA7ǶG}9rċJegZ42:\r9V`BlIYo{bW^^Vi9zYSk);Ԟ?>=+v||eąmlJrtS ] +^-ezEiZIc>wɮof[z&VrO,t]ֵ'|n*);Z] +XcidddtTV{ނWOuwO3f9p<sw̻9~fOõuü=޻{\W +]~^iVujiW*&u=Z5/T?NZ(Lr\NŜҖ o/|sb[.zkzCOmƺ!l'?R8}SAKaؖKHg4_ ޼%C>@\'gqp l\cl'@t]:׎N]m4G$LV<l$½xSF9Ms`4*|OOwG.ӓmEzx+cd.pQʈ {6s!~ q |I(gTFs_h%l99!ț?#]7`g[ȹ8` ;2/ɸ(}76s\G^S_ҺgN6'_h z]-η'{R&+Jkx#OaH +eQUI>/b^ˮ%>R e;q=Y'UlDC!kQgο0DRɘ,\##RԚr5%}xȶP~اx!wFب~OVH⋡J_3xMIK$mH=~͵JqF9+:9>YrPLLL4&'ZN(~MV;ɬ[\o*Ι0ڑռ _ۻϵ{wDܒx]rA^+Jt##U-'J]OǑΝkޥFclsa(t;<(:H??ץxOǻ߬܋ `chIMl쀍Ƌq\xcBy.gFp^~;PgSv!nE#X\VR:s`o +%pv&?Keac7^j^Ɯ ḽ+;o|W|sZ%\q犐oFxC:? 'c ^'W6(?q̅mI(+݀sTwaG:̝O~7fxWu:|^!=p/k0g̬O%^r_{NN OsآS.V9Չ&bր: Lt8c#{ ';nVd8}J:ǜ{<(=Vds$Ƚ!u2r-|y'j "NHjZU+Lԭj^(xcav{ GFӲ&BBJp92F`٤4Sz|*yk] \(1oZ6/Z'g<1`B,C)ĩ)5 &H79AɆ:!dddt6F"Z:֫zg;='?IYQq|N/ul02ň=+V=Wcn{ +{/x.jdq*.耍ek=(G,'cr$t<7t׾;Q 聋KW9H<Apo>ݰbپ9yX/F#!ųhN|Rb `c6l72:z5AkSOyC {1׿׉stN^YhjB1~.ɜ {Sqco~_:,OIry[:9/ -$46tyH 6.G2ʾx_dirruq,Wآf賤}N_r-F/<2tk +ޏ1x{=qi_~>xTͤ \|8NN? \\6[222:J4*S·yo${%wtuCA'XR.X\vGWes,F8y)xK]{`W걟{I/mNo +sM9*~n(z[H*eZMFT8[puTRb˪Nxj"?R|\Uѹx-M۞9/"*WS`C9T{3 +T6$? 6>[Z.GCK^SgM>pK0k 7b|}{hS?!VbV;]NM5322:6F֤vҢ)P窐MZBldK.4Gjbөmx+?8}ēH;bnF,t=R?~Ϝ 66nOͬF lBaju5j` 6e5q_ 66ik_sS_^%>Um_\@;߁h{ȓ[bW>{r[پعث׏WEwj q|Y 6215ejˀuy}=w_ 0(p VII2w@q%؉9 +b%cq +,C@&e   qH%@I3HEEUcߧݽoR)hZG]R"֗j|nO|7:5#Z-_jfʗtSls.=?Pt`Lފ.41} J*l._11C~՞߬ 5F\cU?OEHاD>%dIĚbIv\MckB G֤q^zRi<'y eW_(~-6lU|wųEh=΃@ݕS>3C>ºo#xUg`I!P\|2?"3!&+*5ס/DRxM:ny:w#ʹf//_m봂m7374!(Qvn^۟- d߯*v7h^[<% KR4 P?ft9؃l0uОas#A#LXwc؍QLW).!V=!<^n TLs f:׏Ef}?}Yd?;P= +cTfKZZ !;Jl:+Owm+,1|M7=G):Dv$=Y< tvntEANtiN𙢂~-M)7dzeSN]Yw˪[111dYх>% K.+ ~G_U$[Wl[ׇTא:Dtpnm1~F"G%:#jx:ed1=`w]o xÌe%V*'*QƾW䏪.F͸n,‹YFNg@ű'}VPGP䞊3mVG.ڝ&(ִz^5>OY6k&5bOwgucj8}_qF>p L%Tgm7$P7S4PobzQ>2P׾X E8lzCOĤ?"*') 8RQQAnU>@_273]kn'Pɩ`ґhn^']|uOك?ͼQ|̡GHZq| Q{[@ߊ\z#gJI a`aцKp|׶N*YEf_Z:g␝YkF>y%ww$Xy`Ǎ?7Xčnl&:nq}-w<'kȯntXX^7ER[cbbrP&J؈̂"oV}s8o# +vH[?M۩=_ct΋(L׎{oWx]r{F}n?U@H&{~V_pZS[_T%e:PvԀ5111927M)CԡւÖ%W~ATs#UVݜqc׋fθ'3n`~ŮyEq777y1IbhW tI;=I6$Y[deEڷTdNsiv1ԍ)1%F&&&mFpc!,ppʜ\T Iړe mv_nF(ycRB)$H; +<{436ۗ>\>n { >Y% 7 reU߁?7/ 7Znzt0;Ge@Ɋ`WW?I3~o%N]Cpc]<% l·'oN؊v);Ƿ7q1zcVUjR;6w75WW9ß{joŸ}d2JK\p5>'dIEB +o^qrԗ^4^_^ x&]1=IL{Ƭ{9S wX +wXR^<<qQ"Hᾌu͍LLLL> +ڍ^ɲ*K}8eJO\i9͗_G}u\ *@ ${Ps&x +7ڬ7Doo&߱٬B͑466'] {Wdk UJxÏ}?V=x"EܪgqqO8Yzxx9ׇzc(-?w"Nq0x}AȭC=/s9Ȟ"=d%x~r(sk,n~xeV(pgI+tY.g[\:ᙘ|ŏqJ%R~k +XCRMLLLL `хR"yޏ~Mw_Od6Ģ!rTAP@D H" @ "XbDHY"b@ @ E![ɫɹU_jifٜ5 +˰|@?ؤ=9n?1?tj=_tJcO]Ǟ 'AgfOVٓu{=9aנ3TړU"tjb>/ :@ɝj*݋\t9p<fRvO}ؓ`F.oc>ž7wl4 "=9XgOٓUcΞ;ۓ{۠3T'KaONl*{rpiP0rҠ3TdOtPvrР3T{?i L\!RAD$@",DdAD X #""@"%T[c8f-ؚ Wv;@͇} ۳ϛ} a3Ƴ,2r\ t,8ߩ ˫ Kߵ(<,܉]y[3dwL?x~47 ,3p=O +t,ͯ Ya .[\ t,v"pf6م+\ Y7Cppn] 2@grsp *c]Ҡ3T :@Øx4 UF.t*.l]n܌\7 UN]8ؔ݅ޠ3Tph3b>_.5 UpotJb>vX;p ew.5 UnE.vXmvN6 UE.t*W#].,# :@ 7aMPϘ?au؅`Ͳp.:c  pp\vnAg4 Uم;ݠ7Tyڠ3T]?t*㾾]8Xdw~k]lvXp6vX. :@q/_au{6 Uv#]88. wAg2_؅م;נ7T;ok]8ؔ݅ؠ3TQPeKg3=څ`"nAg2~͘]8l|g1p]8X؅b'p?3Tz#/4 UnG. :@3a6D.Wt*"g :@ϗ =\f] :@ >-n#pN؅Mv`ah\4 UG.Ot*.ll\.ܫ8c!cmyנ3TzPp^ߠ3T م]8Xl wAo$rѠ3T m<\4 UGnAgt E.t*cnǰ vXqg?p]88.,b]3 z@q71ز ØxoofdAg2مguflv]' :@6f9nc<pYvePe1 ]8.,q1 i܍\7 U΅]8ؔ݅ܠ3T_X t,;1 wS3di]:@ ׾{Ӿ/ڽaoFw +t,]C؅`]Xf:@Y@gb>݅;(vIl ?G@]8<>r@WX|W@OXxQ|혟m1o5#@oQ#NA 7}$TxyĢ \ No newline at end of file diff --git a/img/logo.png b/img/logo.png new file mode 100644 index 0000000..4675c62 --- /dev/null +++ b/img/logo.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:10b86c0df51f756494f6d33baf6701fee6a4589d388073e0ddba9f2a121d8210 +size 125742 diff --git a/maya/scripts/maya2glTF_UI.mel b/maya/scripts/maya2glTF_UI.mel index 56f148a..a9c8fa3 100644 --- a/maya/scripts/maya2glTF_UI.mel +++ b/maya/scripts/maya2glTF_UI.mel @@ -1,341 +1,345 @@ -proc string _quoted(string $text) -{ - string $quote = "\""; - return $quote+$text+$quote; -} - -proc string _terminateWithSlash(string $folder) -{ - return $folder + (endsWith($folder,"/") ? "" : "/"); -} - -proc string _ensureScriptNode() { - string $node = "maya2glTF_scriptNode"; - - if (!`objExists $node`) { - scriptNode -st 2 -n $node; - } - - return $node; -} - -proc _setInt(string $key, int $value) { - string $node = _ensureScriptNode(); - if (!attributeExists($key, $node)) { - addAttr -sn $key -ln $key -at "long" $node; - } - setAttr ($node+"."+$key) $value; -} - -proc _setFlt(string $key, float $value) { - string $node = _ensureScriptNode(); - if (!attributeExists($key, $node)) { - addAttr -sn $key -ln $key -at "float" $node; - } - setAttr ($node+"."+$key) $value; -} - -proc _setStr(string $key, string $value) { - string $node = _ensureScriptNode(); - if (!attributeExists($key, $node)) { - addAttr -sn $key -ln $key -dt "string" $node; - } - setAttr ($node+"."+$key) -type "string" $value; -} - -proc int _getInt(string $key, int $defaultValue) { - string $node = _ensureScriptNode(); - return attributeExists($key, $node) ? `getAttr ($node+"."+$key)` : $defaultValue; -} - -proc float _getFlt(string $key, float $defaultValue) { - string $node = _ensureScriptNode(); - return attributeExists($key, $node) ? `getAttr ($node+"."+$key)` : $defaultValue; -} - -proc string _getStr(string $key, string $defaultValue) { - string $node = _ensureScriptNode(); - return attributeExists($key, $node) ? `getAttr ($node+"."+$key)` : $defaultValue; -} - -proc string _getTraxClips(string $char) { - string $fps = `currentTimeUnitToFPS`; - string $flags = `format -s($fps) " -afr ^1s"`; - - // Get character's clip scheduler - string $scheduler = `character -q -sc $char`; - - // Get all clips in the scheduler - string $clips[] = `clipSchedule -q -ci $scheduler`; - - // Get enabled clips - string $clip; - for($clip in $clips ) - { - // (clipName,index,start,sourceStart,sourceEnd,scale,preCycle,postCycle) - string $parts[] = stringToStringArray($clip,","); - string $clipName = $parts[0]; - int $clipIndex = $parts[1]; - float $timeStart = $parts[2]; - float $sourceStart = $parts[3]; - float $sourceEnd = $parts[4]; - float $scale = $parts[5]; - float $timeEnd = $timeStart + ($sourceEnd-$sourceStart)*$scale; - int $clipEnabled = `clipSchedule -clipIndex $clipIndex -q -enable $scheduler`; - int $trackIndex = `clipSchedule -clipIndex $clipIndex -q -track $scheduler`; - // HACK: We export enabled clips from the top track, to allow other tracks to contain adjusting clips - if($clipEnabled && $trackIndex == 1) { - $flags += `format -s(_quoted($clipName)) -s($timeStart) -s($timeEnd)" -acn ^1s -ast ^2s -aet ^3s"`; - } - } - - print ($flags+"\n"); - - return $flags; -} - -global proc maya2glTF_polySelectAndFrame() -{ - select -r `ls -v -type mesh -ap`; - viewFit -an 1; -} - -global proc maya2glTF_onExport -( string $copyrightFLD -, string $folderFLD -, string $sceneNameFLD -, string $scaleFLD -, string $flagsFLD -, string $animFLD -, string $clipFLD -, string $charFLD -) -{ - // This is defined on maya startup - global string $gMainProgressBar; - - // Workaround a maya bug: progress is cancelled twice - progressBar -edit - -beginProgress - -isInterruptable true - -status "maya2glTF: preparing for export..." - -minValue 0 - -maxValue 1 - $gMainProgressBar; - - while(`progressBar -query -isCancelled $gMainProgressBar`) - { - print ("maya2glTF: aborting previous export...\n"); - progressBar -edit -endProgress $gMainProgressBar; - } - - progressBar -edit -endProgress $gMainProgressBar; - - string $copyright = `textFieldGrp -q -fileName $copyrightFLD`; - string $folder = `textFieldGrp -q -fileName $folderFLD`; - $folder = _terminateWithSlash($folder); - string $sceneName = `textFieldGrp -q -text $sceneNameFLD`; - float $scale = `floatFieldGrp -q -value1 $scaleFLD`; - string $flags = `textFieldGrp -q -text $flagsFLD`; - int $anim = `optionMenuGrp -q -sl $animFLD`; - string $clip = `textFieldGrp -q -text $clipFLD`; - string $char = `optionMenuGrp -q -v $charFLD`; - - // Persist values - _setStr("outputFolder", $folder); - _setStr("sceneName", $sceneName); - _setStr("copyright", $copyright); - _setFlt("scale", $scale); - _setStr("flags", $flags); - _setStr("char", $char); - _setInt("anim", $anim); - _setStr("clip", $clip); - - switch ($anim) - { - case 2: - case 3: - { - string $ast = $anim == 2 ? `playbackOptions -q -min` : `playbackOptions -q -ast`; - string $aet = $anim == 2 ? `playbackOptions -q -max` : `playbackOptions -q -aet`; - string $fps = `currentTimeUnitToFPS`; - $flags += `format -s(_quoted($clip)) -s($ast) -s($aet) -s($fps) " -acn ^1s -ast ^2s -aet ^3s -afr ^4s"`; - } - break; - - case 4: - // Fetch clips from TRAX - $flags += _getTraxClips($char); - break; - } - - string $cmd = `format - -s(_quoted($sceneName)) - -s(_quoted($folder)) - -s($scale) - -s(_quoted($copyright)) - -s($flags) - "maya2glTF -sn ^1s -of ^2s -sf ^3s -cpr ^4s ^5s" - `; - - print ($cmd+"\n"); - - print ("maya2glTF: loading plugin...\n"); - - loadPlugin "maya2glTF"; - - print ("maya2glTF: plugin loaded.\n"); - - int $failed = catch(eval($cmd)); - - unloadPlugin "maya2glTF"; - - int $aborted = `progressBar -query -isCancelled $gMainProgressBar`; - - if ($aborted) { - print ("*** maya2glTF: aborted at "+`date -time`+" ***\n"); - } else if ($failed) { - print ("!!! maya2glTF: failed at "+`date -time`+" !!!\n"); - } else { - print ("+++ maya2glTF: completed at "+`date -time`+" +++\n"); - } - - progressBar -edit -endProgress $gMainProgressBar; -} - -global proc maya2glTF_exportProgressUI(int $max) { - // This is defined on maya startup - global string $gMainProgressBar; - - $max = max(1, $max); - - progressBar -edit - -beginProgress - -isInterruptable true - -status "maya2glTF: exporting..." - -minValue 0 - -maxValue $max - $gMainProgressBar; -} - -// Returns -1 if abortion is requested -global proc int maya2glTF_advanceExportProgressUI(string $stepName) -{ - global string $gMainProgressBar; // This is defined on maya startup - - progressBar -edit -step 1 -status ("maya2glTF: " + $stepName + "...") $gMainProgressBar; - - if(`progressBar -query -isCancelled $gMainProgressBar`) { - print ("maya2glTF: aborting at "+`date -time`+"\n"); - return -1; - } - - return 0; -} - -proc string _getDefaultOutputFolder() { - string $scenePath = `file -q -loc`; - string $sceneDir = dirname($scenePath); - string $actualDir = size($sceneDir) == 0 ? `getenv "MAYA_APP_DIR"` : $sceneDir; - return _terminateWithSlash($actualDir)+"export/"; -} - -proc string _getDefaultSceneName() { - string $sceneName = basenameEx(`file -q -sceneName -shortName`); - return size($sceneName) == 0 ? "untitled" : $sceneName; -} - -global proc maya2glTF_UI() -{ - // This is defined on maya startup - global string $gMainProgressBar; - - // This is auto-updated by msbuild - string $maya2glTF_version = "v0.9.4-beta a332cd0"; - - if (`window -exists maya2glTF_exporter_window`) - deleteUI maya2glTF_exporter_window; - - string $year = `date -format "YYYY"`; - string $chars[] = `ls -type character`; - - // Load previous or default values - string $exportDir = fromNativePath(_getStr("outputFolder", _getDefaultOutputFolder())); - string $sceneName = _getStr("sceneName", _getDefaultSceneName()); - string $copyright = _getStr("copyright", "(C)"+$year+" "+getenv("username")); - float $scale = _getFlt("scale", 1); - string $flags = _getStr("flags", ""); - string $char = _getStr("char", $chars[0]); - int $anim = _getInt("anim", 1); - string $clip = _getStr("clip", "clip"); - - window -title ("maya2glTF") maya2glTF_exporter_window; - - frameLayout -mw 30 -mh 30 ("Copyright (C)" + $year + " wondermedia.tv version " + $maya2glTF_version); - - columnLayout -adjustableColumn true -rowSpacing 10; - - button -label "assign PBR shader to selection" -command "maya2glTF_assignPbrShader();"; - - separator; - - button -label "select all polygon meshes" -command "maya2glTF_polySelectAndFrame();"; - - separator; - - string $folderFLD = `textFieldGrp -fileName $exportDir -label "output folder:" -adjustableColumn 2`; - string $copyrightFLD = `textFieldGrp -text $copyright -label "copyright:" -adjustableColumn 2`; - string $sceneNameFLD = `textFieldGrp -text $sceneName -label "scene name:" -adjustableColumn 2`; - string $scaleFLD = `floatFieldGrp -value1 $scale -label "scale factor:"`; - string $flagsFLD = `textFieldGrp -text $flags -label "extra flags:" -adjustableColumn 2 `; - - string $animFLD = `optionMenuGrp -label "animation:" -adjustableColumn 2`; - menuItem -label "none"; - menuItem -label "time slider"; - menuItem -label "range slider"; - - if (size($chars) > 0) - menuItem -label "trax"; - - string $clipFLD = `textFieldGrp -label "clip name:" -text $clip -enable 0 -adjustableColumn 2`; - - string $charFLD = `optionMenuGrp -label "character:" -enable 0 -adjustableColumn 2`; - - for ($c in $chars) - menuItem -label $c; - - if (size($chars) == 0) - menuItem -label ""; - - string $animCMD = `format - -s(_quoted($animFLD)) - -s(_quoted($charFLD)) - -s(_quoted($clipFLD)) - ( - "optionMenuGrp -edit -enable (`optionMenuGrp -q -sl ^1s` == 4) ^2s;" + - "textFieldGrp -edit -enable (`optionMenuGrp -q -sl ^1s` == 2 || `optionMenuGrp -q -sl ^1s` == 3) ^3s;" - )`; - - optionMenuGrp -edit -changeCommand $animCMD $animFLD; - - catch(`optionMenuGrp -edit -value $char $charFLD`); - catch(`optionMenuGrp -edit -select $anim $animFLD`); - catch(`eval $animCMD`); - - separator; - - string $exportCMD = `format - -s(_quoted($copyrightFLD)) - -s(_quoted($folderFLD)) - -s(_quoted($sceneNameFLD)) - -s(_quoted($scaleFLD)) - -s(_quoted($flagsFLD)) - -s(_quoted($animFLD)) - -s(_quoted($clipFLD)) - -s(_quoted($charFLD)) - "maya2glTF_onExport(^1s, ^2s, ^3s, ^4s, ^5s, ^6s, ^7s, ^8s);"`; - - button -label "export selected meshes" -command $exportCMD; - - showWindow maya2glTF_exporter_window; -} +proc string _quoted(string $text) +{ + string $quote = "\""; + return $quote+$text+$quote; +} + +proc string _terminateWithSlash(string $folder) +{ + return $folder + (endsWith($folder,"/") ? "" : "/"); +} + +proc string _ensureScriptNode() { + string $node = "maya2glTF_scriptNode"; + + if (!`objExists $node`) { + scriptNode -st 2 -n $node; + } + + return $node; +} + +proc _setInt(string $key, int $value) { + string $node = _ensureScriptNode(); + if (!attributeExists($key, $node)) { + addAttr -sn $key -ln $key -at "long" $node; + } + setAttr ($node+"."+$key) $value; +} + +proc _setFlt(string $key, float $value) { + string $node = _ensureScriptNode(); + if (!attributeExists($key, $node)) { + addAttr -sn $key -ln $key -at "float" $node; + } + setAttr ($node+"."+$key) $value; +} + +proc _setStr(string $key, string $value) { + string $node = _ensureScriptNode(); + if (!attributeExists($key, $node)) { + addAttr -sn $key -ln $key -dt "string" $node; + } + setAttr ($node+"."+$key) -type "string" $value; +} + +proc int _getInt(string $key, int $defaultValue) { + string $node = _ensureScriptNode(); + return attributeExists($key, $node) ? `getAttr ($node+"."+$key)` : $defaultValue; +} + +proc float _getFlt(string $key, float $defaultValue) { + string $node = _ensureScriptNode(); + return attributeExists($key, $node) ? `getAttr ($node+"."+$key)` : $defaultValue; +} + +proc string _getStr(string $key, string $defaultValue) { + string $node = _ensureScriptNode(); + return attributeExists($key, $node) ? `getAttr ($node+"."+$key)` : $defaultValue; +} + +proc string _getTraxClips(string $char) { + string $fps = `currentTimeUnitToFPS`; + string $flags = `format -s($fps) " -afr ^1s"`; + + // Get character's clip scheduler + string $scheduler = `character -q -sc $char`; + + // Get all clips in the scheduler + string $clips[] = `clipSchedule -q -ci $scheduler`; + + // Get enabled clips + string $clip; + for($clip in $clips ) + { + // (clipName,index,start,sourceStart,sourceEnd,scale,preCycle,postCycle) + string $parts[] = stringToStringArray($clip,","); + string $clipName = $parts[0]; + int $clipIndex = $parts[1]; + float $timeStart = $parts[2]; + float $sourceStart = $parts[3]; + float $sourceEnd = $parts[4]; + float $scale = $parts[5]; + float $timeEnd = $timeStart + ($sourceEnd-$sourceStart)*$scale; + int $clipEnabled = `clipSchedule -clipIndex $clipIndex -q -enable $scheduler`; + int $trackIndex = `clipSchedule -clipIndex $clipIndex -q -track $scheduler`; + // HACK: We export enabled clips from the top track, to allow other tracks to contain adjusting clips + if($clipEnabled && $trackIndex == 1) { + $flags += `format -s(_quoted($clipName)) -s($timeStart) -s($timeEnd)" -acn ^1s -ast ^2s -aet ^3s"`; + } + } + + print ($flags+"\n"); + + return $flags; +} + +global proc maya2glTF_polySelectAndFrame() +{ + select -r `ls -v -type mesh -ap`; + viewFit -an 1; +} + +global proc maya2glTF_onExport +( string $copyrightFLD +, string $folderFLD +, string $sceneNameFLD +, string $scaleFLD +, string $flagsFLD +, string $animFLD +, string $clipFLD +, string $charFLD +) +{ + // This is defined on maya startup + global string $gMainProgressBar; + + // Workaround a maya bug: progress is cancelled twice + progressBar -edit + -beginProgress + -isInterruptable true + -status "maya2glTF: preparing for export..." + -minValue 0 + -maxValue 1 + $gMainProgressBar; + + while(`progressBar -query -isCancelled $gMainProgressBar`) + { + print ("maya2glTF: aborting previous export...\n"); + progressBar -edit -endProgress $gMainProgressBar; + } + + progressBar -edit -endProgress $gMainProgressBar; + + string $copyright = `textFieldGrp -q -fileName $copyrightFLD`; + string $folder = `textFieldGrp -q -fileName $folderFLD`; + $folder = _terminateWithSlash($folder); + string $sceneName = `textFieldGrp -q -text $sceneNameFLD`; + float $scale = `floatFieldGrp -q -value1 $scaleFLD`; + string $flags = `textFieldGrp -q -text $flagsFLD`; + int $anim = `optionMenuGrp -q -sl $animFLD`; + string $clip = `textFieldGrp -q -text $clipFLD`; + string $char = `optionMenuGrp -q -v $charFLD`; + + // Persist values + _setStr("outputFolder", $folder); + _setStr("sceneName", $sceneName); + _setStr("copyright", $copyright); + _setFlt("scale", $scale); + _setStr("flags", $flags); + _setStr("char", $char); + _setInt("anim", $anim); + _setStr("clip", $clip); + + switch ($anim) + { + case 2: + case 3: + { + string $ast = $anim == 2 ? `playbackOptions -q -min` : `playbackOptions -q -ast`; + string $aet = $anim == 2 ? `playbackOptions -q -max` : `playbackOptions -q -aet`; + string $fps = `currentTimeUnitToFPS`; + $flags += `format -s(_quoted($clip)) -s($ast) -s($aet) -s($fps) " -acn ^1s -ast ^2s -aet ^3s -afr ^4s"`; + } + break; + + case 4: + // Fetch clips from TRAX + $flags += _getTraxClips($char); + break; + } + + string $cmd = `format + -s(_quoted($sceneName)) + -s(_quoted($folder)) + -s($scale) + -s(_quoted($copyright)) + -s($flags) + "maya2glTF -sn ^1s -of ^2s -sf ^3s -cpr ^4s ^5s" + `; + + print ($cmd+"\n"); + + print ("maya2glTF: loading plugin...\n"); + + loadPlugin "maya2glTF"; + + print ("maya2glTF: plugin loaded.\n"); + + int $failed = catch(eval($cmd)); + + unloadPlugin "maya2glTF"; + + int $aborted = `progressBar -query -isCancelled $gMainProgressBar`; + + if ($aborted) { + print ("*** maya2glTF: aborted at "+`date -time`+" ***\n"); + } else if ($failed) { + print ("!!! maya2glTF: failed at "+`date -time`+" !!!\n"); + } else { + print ("+++ maya2glTF: completed at "+`date -time`+" +++\n"); + } + + progressBar -edit -endProgress $gMainProgressBar; +} + +global proc maya2glTF_exportProgressUI(int $max) { + // This is defined on maya startup + global string $gMainProgressBar; + + $max = max(1, $max); + + progressBar -edit + -beginProgress + -isInterruptable true + -status "maya2glTF: exporting..." + -minValue 0 + -maxValue $max + $gMainProgressBar; +} + +// Returns -1 if abortion is requested +global proc int maya2glTF_advanceExportProgressUI(string $stepName) +{ + global string $gMainProgressBar; // This is defined on maya startup + + progressBar -edit -step 1 -status ("maya2glTF: " + $stepName + "...") $gMainProgressBar; + + if(`progressBar -query -isCancelled $gMainProgressBar`) { + print ("maya2glTF: aborting at "+`date -time`+"\n"); + return -1; + } + + return 0; +} + +proc string _getDefaultOutputFolder() { + string $scenePath = `file -q -loc`; + string $sceneDir = dirname($scenePath); + string $actualDir = size($sceneDir) == 0 ? `getenv "MAYA_APP_DIR"` : $sceneDir; + return _terminateWithSlash($actualDir)+"export/"; +} + +proc string _getDefaultSceneName() { + string $sceneName = basenameEx(`file -q -sceneName -shortName`); + return size($sceneName) == 0 ? "untitled" : $sceneName; +} + +global proc maya2glTF_UI() +{ + // This is defined on maya startup + global string $gMainProgressBar; + + // This is auto-updated by msbuild + string $maya2glTF_version = "v0.9.5-beta 77dcd04"; + + if (`window -exists maya2glTF_exporter_window`) + deleteUI maya2glTF_exporter_window; + + string $year = `date -format "YYYY"`; + string $chars[] = `ls -type character`; + + // Load previous or default values + string $exportDir = fromNativePath(_getStr("outputFolder", _getDefaultOutputFolder())); + string $sceneName = _getStr("sceneName", _getDefaultSceneName()); + string $copyright = _getStr("copyright", "(C)"+$year+" "+getenv("username")); + float $scale = _getFlt("scale", 1); + string $flags = _getStr("flags", ""); + string $char = _getStr("char", $chars[0]); + int $anim = _getInt("anim", 1); + string $clip = _getStr("clip", "clip"); + + window -title ("maya2glTF") maya2glTF_exporter_window; + + frameLayout -mw 30 -mh 30 ("Copyright (C)" + $year + " wondermedia.tv version " + $maya2glTF_version); + + columnLayout -adjustableColumn true -rowSpacing 10; + + button -label "assign PBR shader to selection" -command "maya2glTF_assignPbrShader();"; + + separator; + + button -label "select all polygon meshes" -command "maya2glTF_polySelectAndFrame();"; + + separator; + + string $folderFLD = `textFieldGrp -fileName $exportDir -label "output folder:" -adjustableColumn 2`; + string $copyrightFLD = `textFieldGrp -text $copyright -label "copyright:" -adjustableColumn 2`; + string $sceneNameFLD = `textFieldGrp -text $sceneName -label "scene name:" -adjustableColumn 2`; + string $scaleFLD = `floatFieldGrp -value1 $scale -label "scale factor:"`; + string $flagsFLD = `textFieldGrp -text $flags -label "extra flags:" -adjustableColumn 2 `; + + string $animFLD = `optionMenuGrp -label "animation:" -adjustableColumn 2`; + menuItem -label "none"; + menuItem -label "time slider"; + menuItem -label "range slider"; + + if (size($chars) > 0) + menuItem -label "trax"; + + string $clipFLD = `textFieldGrp -label "clip name:" -text $clip -enable 0 -adjustableColumn 2`; + + string $charFLD = `optionMenuGrp -label "character:" -enable 0 -adjustableColumn 2`; + + for ($c in $chars) + menuItem -label $c; + + if (size($chars) == 0) + menuItem -label ""; + + string $animCMD = `format + -s(_quoted($animFLD)) + -s(_quoted($charFLD)) + -s(_quoted($clipFLD)) + ( + "optionMenuGrp -edit -enable (`optionMenuGrp -q -sl ^1s` == 4) ^2s;" + + "textFieldGrp -edit -enable (`optionMenuGrp -q -sl ^1s` == 2 || `optionMenuGrp -q -sl ^1s` == 3) ^3s;" + )`; + + optionMenuGrp -edit -changeCommand $animCMD $animFLD; + + catch(`optionMenuGrp -edit -value $char $charFLD`); + catch(`optionMenuGrp -edit -select $anim $animFLD`); + catch(`eval $animCMD`); + + separator; + + string $exportCMD = `format + -s(_quoted($copyrightFLD)) + -s(_quoted($folderFLD)) + -s(_quoted($sceneNameFLD)) + -s(_quoted($scaleFLD)) + -s(_quoted($flagsFLD)) + -s(_quoted($animFLD)) + -s(_quoted($clipFLD)) + -s(_quoted($charFLD)) + "maya2glTF_onExport(^1s, ^2s, ^3s, ^4s, ^5s, ^6s, ^7s, ^8s);"`; + + button -label "export selected meshes" -command $exportCMD; + + separator; + + button -label "refresh user interface" -command "evalDeferred(\"maya2glTF_UI();\");"; + + showWindow maya2glTF_exporter_window; +} diff --git a/maya/scripts/maya2glTF_assignPbrShader.mel b/maya/scripts/maya2glTF_assignPbrShader.mel index 25af3a8..1f1c0df 100644 --- a/maya/scripts/maya2glTF_assignPbrShader.mel +++ b/maya/scripts/maya2glTF_assignPbrShader.mel @@ -29,10 +29,10 @@ global proc maya2glTF_assignMaterialAndTextures( if (size($maya2glTF_default_texture_patterns) == 0) { $maya2glTF_default_texture_patterns = { - "base", - "metallic", - "roughness", - "occlusion", + "base|albedo", + "metal|orm", + "rough|orm", + "occlusion|orm|ao", "normal", "emissive", "diffuse[\\W\\d_]*env", @@ -108,6 +108,8 @@ global proc maya2glTF_assignMaterialAndTextures( for ($i = 0; $i < size($attrNames); ++$i) { string $texturePattern = `tolower $texturePatterns[$i]`; + string $texturePatterns[]; + tokenize $texturePattern "|" $texturePatterns; int $found = false; @@ -115,8 +117,16 @@ global proc maya2glTF_assignMaterialAndTextures( { string $filePath = $filePaths[$j]; string $filePathLower = `tolower $filePath`; + string $currentPattern; - if (`match $texturePattern $filePathLower` != "") + int $matches = false; + + for ($currentPattern in $texturePatterns) + { + $matches = $matches || (`match $currentPattern $filePathLower` != ""); + } + + if ($matches) { string $shAttrName = ($sh+"."+$attrNames[$i]); string $fileNode = `createRenderNodeCB -as2DTexture "" file ("defaultNavigation -force true -connectToExisting -source %node -destination "+$shAttrName+";")`; diff --git a/src/version.cpp b/src/version.cpp index dff664c..9a30b30 100644 --- a/src/version.cpp +++ b/src/version.cpp @@ -1,3 +1,3 @@ -#include "externals.h" - -const char* version = "v0.9.4-beta a332cd0"; +#include "externals.h" + +const char* version = "v0.9.5-beta 77dcd04"; diff --git a/windows_make_release.cmd b/windows_make_release.cmd index cbfcec9..2d286b1 100644 --- a/windows_make_release.cmd +++ b/windows_make_release.cmd @@ -30,7 +30,16 @@ if errorlevel 1 goto :error xcopy /y /s "%userprofile%\Documents\Maya\Maya2glTF*" "Maya2glTF\Maya\" if errorlevel 1 goto :error -"c:\Program Files\WinRAR\rar.exe" A -r "Maya2glTF_v0.9.4-beta.zip" "Maya2glTF\*" +xcopy /y /s /i "%userprofile%\Documents\Maya\Maya2glTF" "Maya2glTF\Maya\Maya2glTF" +if errorlevel 1 goto :error + +where dos2unix +if errorlevel 0 ( + echo Removing BOM from UTF-8 files + for /r %%f in (*.mel) do (dos2unix %%f) +) + +"c:\Program Files\WinRAR\rar.exe" A -r "Maya2glTF_v0.9.5-beta.zip" "Maya2glTF\*" if errorlevel 1 goto :error echo ### SUCCESS ###